From 031de38ec1dfb8185c200badc27ccdade55f9ff3 Mon Sep 17 00:00:00 2001 From: "pulse-triage[bot]" <249995291+pulse-triage[bot]@users.noreply.github.com> Date: Sun, 4 Oct 2026 02:59:44 +0100 Subject: [PATCH] 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. --- .../6e9db582b2e6ffd4.json | 42 +++++++++++++++++++ .../src/components/Workloads/GuestRow.tsx | 5 ++- 2 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 frontend-modern/browser-verification/6e9db582b2e6ffd4.json diff --git a/frontend-modern/browser-verification/6e9db582b2e6ffd4.json b/frontend-modern/browser-verification/6e9db582b2e6ffd4.json new file mode 100644 index 0000000000..5c2892a6d9 --- /dev/null +++ b/frontend-modern/browser-verification/6e9db582b2e6ffd4.json @@ -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." + ] +} diff --git a/frontend-modern/src/components/Workloads/GuestRow.tsx b/frontend-modern/src/components/Workloads/GuestRow.tsx index 377095f897..244b813c30 100644 --- a/frontend-modern/src/components/Workloads/GuestRow.tsx +++ b/frontend-modern/src/components/Workloads/GuestRow.tsx @@ -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