Narrow filesystem provenance reads to the VM source type

The final-source controls passed 342 tests but type-check reported TS2339: WorkloadGuest also includes containers without diskStatusReason. Read the existing VM-only field after the local guest passes its type guard, preserving reactive identity and presentation. Record a fresh inspected browser pass on the corrected bytes; the earlier failed proof remains retained.

Change-source: pulse-maintainer
Contract-Neutral: Type-only correction to the existing VM-only provenance memo; no surface, contract or safety semantics change.
This commit is contained in:
pulse-triage[bot]
2026-10-04 02:59:44 +01:00
parent 10f181b500
commit 031de38ec1
2 changed files with 45 additions and 2 deletions
@@ -0,0 +1,42 @@
{
"version": 1,
"base_sha": "10f181b5007b4102340c779ae058d63958b0dd86",
"verified_at": "2026-10-04T01:59:40Z",
"result": "passed",
"changed_paths": [
"frontend-modern/src/components/Workloads/GuestRow.tsx"
],
"content_sha256": {
"frontend-modern/src/components/Workloads/GuestRow.tsx": "a2a0763252b09cb859cd79ec358aa45deac3a3398ea98db3a66453d6659b5691"
},
"routes": [
"/browser-tests/guest-disk-provenance.html"
],
"viewports": [
{
"width": 1365,
"height": 900
},
{
"width": 390,
"height": 844
},
{
"width": 360,
"height": 844
}
],
"states": [
"Production GuestRow, full GuestDrawer, responsive column selection/weights and CSS; synthetic observations. Playwright 1.56.1 matches integration lock, desktop and phone Chromium 141.0.7390.37 plus dark phone WebKit 26.0. All 12 final bitmaps opened.",
"96 fixed-deferral states across bars/sparklines, retained/no prior sample, before hover: visible Last known/Prior versus Unavailable/N/A and full safe assistive reason. Retained numbers are announced last known, never current. Independent fresh control and CT rows remain unmarked.",
"Cue geometry and every inline sparkline value fit the existing canonical compact/phone/narrow columns, with 32px row height equal to an unmarked control and no horizontal document overflow. Inline plot yields width to its value; phone fresh 75% remains visible.",
"This verifies production component presentation/input, not a full application route, physical phone, collector, backup task completion, guest thaw/liveness, installed forward/recovery or containing release. Initial matrix success did not catch numeric clipping; its adverse visual finding and exact original records are retained separately.",
"After exact-source type-check failure TS2339, the memo narrows a local guest through the existing VM type guard before reading the VM-only reason. A fresh 96-state browser pass on that final hash was followed by opening all 12 final bitmaps. Earlier receipt remains unchanged and bound to its own parent."
],
"interactions": [
"Mouse and keyboard history lenses preserve visible freshness and last-known accessible numeric context while replacing the bar with a chart. No new event listener, action or tab stop is introduced.",
"Trusted phone touch on the noninteractive provenance label activates the existing row exactly once, opens the full readable safe reason and does not create a hover history lens; existing collapse remains usable.",
"Clearing a VM lock with a subsequent in-flight read reason does not withdraw the notice. A new same-identity fresh observation clears title/notice, updates 75% and current accessible context without replacing the row node.",
"Guest fixtures make only local synthetic GET requests and report no page errors. No real backup, QGA or release operation is sent."
]
}
@@ -220,8 +220,9 @@ export function GuestRow(props: GuestRowProps) {
// A native title or bar tooltip is not a visible freshness cue on touch,
// and disappears from the chart's accessible value when the history lens opens.
const diskReadStatus = createMemo(() => {
const reason = props.guest.diskStatusReason;
if (!isVM(props.guest) || !reason) return undefined;
const guest = props.guest;
if (!isVM(guest) || !guest.diskStatusReason) return undefined;
const reason = guest.diskStatusReason;
const retained = reason.startsWith('prev-');
return {
label: retained