fix(#3020): K3PT ST4T3 says what it shows, and stops reading the job graph
`build_tombstone_views` folded `transient_snapshot`'s keys into its `live` set, so an agent with in-flight transient work was treated as not-a-tombstone. Since #3010 that set is derived from the running job graph, which made a page about on-disk state a function of the scheduler. Dropping the filter exposes what was always true underneath: nothing records a destroy. Every definition-side artifact — state subvolume, proposed + applied repos, `deployed/0`, meta registration, topology entry — is written by `Provision` before the container exists and survives `lifecycle::destroy`. So a mid-spawn agent is byte-identical on disk to a tombstone. Per mara on #3020: remove the filter, warn on the page, keep the issue open for the swarm-controller / snapshot-storage rework where the problem shape changes anyway. - dashboard/tombstones.rs: drop the param + the chain; document the real semantics - core.js: amber caveat banner above the rows; row badge `destroyed` -> `offline`, which is what an absent container actually proves - dashboard.css: `.tombstone-warn`, modelled on `.port-conflict` but amber and without the pulse — a permanent banner that pulses trains you to ignore it - docs/web-ui/dashboard.md: the pane was described as "destroyed-but-state-kept agents", now the exact wrong claim
This commit is contained in:
parent
6ce71556e2
commit
6a8a729f58
5 changed files with 62 additions and 11 deletions
|
|
@ -46,13 +46,27 @@ function renderTombstones(s) {
|
|||
if (d === 1) return '1 day ago';
|
||||
return d + ' days ago';
|
||||
};
|
||||
// Only shown alongside actual rows — a caveat over an empty list is noise.
|
||||
// Wording is deliberately about what the list *is* rather than what it
|
||||
// isn't: nothing records a destroy, so "container absent" is the only thing
|
||||
// the backend can actually tell.
|
||||
const warn = el('p', { class: 'tombstone-warn' });
|
||||
warn.append(
|
||||
el('strong', {}, 'shows every agent whose container is absent'),
|
||||
' — not only destroyed ones. An agent part-way through being spawned ' +
|
||||
'looks identical here, because nothing records a destroy. Check it is ' +
|
||||
'really gone before you PURG3.',
|
||||
);
|
||||
root.append(warn);
|
||||
const ul = el('ul', { class: 'containers' });
|
||||
for (const t of s.tombstones) {
|
||||
const li = el('li', { class: 'container-row tombstone' });
|
||||
const head = el('div', { class: 'head' });
|
||||
head.append(
|
||||
el('span', { class: 'name' }, t.name),
|
||||
el('span', { class: 'badge badge-muted' }, 'destroyed'),
|
||||
// Was `destroyed`, which the backend cannot actually know — see the
|
||||
// caveat above. `offline` is what the absence of a container proves.
|
||||
el('span', { class: 'badge badge-muted' }, 'offline'),
|
||||
);
|
||||
if (t.has_creds) head.append(el('span', { class: 'badge badge-muted' }, 'creds kept'));
|
||||
head.append(el('span', { class: 'meta' },
|
||||
|
|
|
|||
|
|
@ -444,6 +444,21 @@ hive-agent-menu {
|
|||
}
|
||||
.container-row.tombstone .name { color: var(--muted); }
|
||||
|
||||
/* K3PT ST4T3 caveat. Amber, not red like `.port-conflict`, and no pulse: this
|
||||
is a standing "read the list this way" note, not an incident — a pulsing
|
||||
banner that is always present just teaches you to stop seeing it.
|
||||
Nothing records a destroy, so this list is every agent whose container is
|
||||
absent — which includes one being spawned right now. */
|
||||
.tombstone-warn {
|
||||
background: color-mix(in srgb, var(--amber) 8%, transparent);
|
||||
border: 1px solid var(--amber);
|
||||
color: var(--amber);
|
||||
padding: 0.5em 0.8em;
|
||||
margin-bottom: 0.6em;
|
||||
border-radius: 4px;
|
||||
}
|
||||
.tombstone-warn strong { color: var(--amber); }
|
||||
|
||||
/* Notification controls — sit between the banner and the containers. */
|
||||
.port-conflict {
|
||||
background: color-mix(in srgb, var(--red) 8%, transparent);
|
||||
|
|
|
|||
Loading…
Reference in a new issue