Integrate reviewed backup timestamp uncertainty

Preserve the exact Web candidate and its connected source and production-component browser proof. Unusable completion times stay cautionary in existing rows and drawers; running activity and genuine absence remain distinct.

Change-source: pulse-maintainer
This commit is contained in:
pulse-triage[bot]
2026-10-04 09:28:07 +01:00
17 changed files with 773 additions and 27 deletions
@@ -20,6 +20,25 @@
## Purpose
### Backup age requires a usable completed timestamp
Existing workload indicators, age badges and drawer protection context distinguish
an absent completed-backup timestamp from a present but unusable one. Finite,
Date-representable positive timestamps no later than the current time may receive
the configured freshness verdict. Future, malformed and out-of-range times are
**Unknown**, cautionary rather than healthy or missing. The fixed explanation
never renders the invalid raw value; future times direct the operator to check
the Proxmox and browser clocks. An invalid current clock cannot confer freshness.
Zero, empty and absent values retain the existing missing-backup interpretation.
Running activity remains separate: it neither validates the timestamp nor creates
a completed backup. The badge, its tooltip and accessible name retain uncertainty
while running; valid same-guest replacement restores the ordinary age verdict.
`backupTimeEvidence.contract.test.tsx`, `format.test.ts` and
`workloadGuestPresentation.test.ts` cover this admission and presentation. The
real row/drawer browser fixture is `browser-tests/backup-time-evidence.cjs`.
No backup execution, thaw, restored workload or installed acceptance is implied.
### Filesystem capacity is not measured usage
The existing filesystem list and guest Overview require finite positive capacity
@@ -15,6 +15,23 @@
## Purpose
### Workload backup projection preserves timestamp uncertainty
Both resource-API and owning-canonical-snapshot paths preserve a present malformed
backup time for the existing shared age admission, rather than replacing it with
the numeric zero absence sentinel. Only missing/empty values and the explicit Go
zero-time value (including zero fractional seconds) map to absence. The drawer
does not gate its backup presentation on timestamp truthiness: NaN must reach the
unknown verdict, not disappear as a missing completed backup. Future dates cannot
be clamped to Today. This adds only constant-time validation to the current mapper
and presentation memos; it introduces no requests, timers or retained caches.
`useWorkloads.test.ts`, `GuestDrawer.test.tsx` and the focused backup time evidence
controls pin the boundary. `browser-tests/backup-time-evidence.cjs` exercises real
resource projection, rows, indicators and drawer replacement with synthetic API
and canonical full/delta observations; those observations are not native backup
or release proof.
### Guest discovery evidence and UI state have exact owners
The guest drawer's passive discovery lookup changes only when its explicit