From a91d1ed89d8a18d6cc8edd7331cfed368c65c5cd Mon Sep 17 00:00:00 2001 From: "pulse-triage[bot]" <249995291+pulse-triage[bot]@users.noreply.github.com> Date: Sat, 24 Oct 2026 18:43:03 +0100 Subject: [PATCH] Keep incomplete backup entries out of completed restore totals Use the same completion predicate for latest backups, restore-point and byte totals, PBS coverage and per-day count/volume charts. Keep running and failed entries visible, with separate counts and honest inventory-entry labels. Completion is not verification, restore or guest thaw. Add registered model and consuming-table regressions for mixed and incomplete-only inventories, unknown chronology and completion transitions. Guest operations and server policy are unchanged. Change-source: pulse-maintainer Contract-Neutral: Apply established completion semantics and inventory-entry wording only; resource transport, identity, persistence and shared table contracts are unchanged. --- .../subsystems/frontend-primitives.md | 12 +++ .../internal/subsystems/storage-recovery.md | 14 +++ .../features/proxmox/ProxmoxBackupsTable.tsx | 39 ++++--- .../proxmox/ProxmoxRecoverableTable.tsx | 2 +- .../__tests__/ProxmoxBackupsTable.test.tsx | 94 +++++++++++++++- .../proxmoxBackupActivityPresentation.test.ts | 2 + ...oxmoxBackupRecoveryModel.branchcov.test.ts | 2 + .../proxmoxBackupRecoveryModel.test.ts | 101 ++++++++++++++++++ .../proxmoxBackupActivityPresentation.ts | 3 +- .../proxmox/proxmoxBackupRecoveryModel.ts | 24 ++++- 10 files changed, 272 insertions(+), 21 deletions(-) diff --git a/docs/release-control/v6/internal/subsystems/frontend-primitives.md b/docs/release-control/v6/internal/subsystems/frontend-primitives.md index 38d99d7e52..27753f069d 100644 --- a/docs/release-control/v6/internal/subsystems/frontend-primitives.md +++ b/docs/release-control/v6/internal/subsystems/frontend-primitives.md @@ -20,6 +20,18 @@ ## Purpose +### Backups distinguishes completed points from inventory entries (24 October 2026) + +The existing health strip names completed restore points and separately counts +running and failed entries. The existing per-day chart measures only completed +restore points in both count and volume modes, while the dated table and its +filters keep incomplete entries available for inspection. Table and day-group +counters name entries so they cannot imply completion. The incomplete-only +chart state says that no completed dated points are visible, not that no +backup activity occurred. The consuming Backups tests cover summary, chart, +volume, date selection and route views together; existing table interaction +primitives, access boundaries and routes are unchanged. + ### Backup posture failure and retry stay source-local (24 October 2026) The Backups posture notice offers a keyboard-operable retry with the existing diff --git a/docs/release-control/v6/internal/subsystems/storage-recovery.md b/docs/release-control/v6/internal/subsystems/storage-recovery.md index f66f9c54c3..c188a1a802 100644 --- a/docs/release-control/v6/internal/subsystems/storage-recovery.md +++ b/docs/release-control/v6/internal/subsystems/storage-recovery.md @@ -21,6 +21,20 @@ ## Purpose +### Completed restore totals exclude incomplete inventory (24 October 2026) + +The Backups restore-point total, completed-byte total, PBS-target count and +per-day count/volume chart all exclude explicitly running or terminally +incomplete artifacts. The same completion predicate selects the last backup. +Running and failed entries remain in the dated inventory and row evidence, +with separate summary counts; inventory and day-group counts name entries, +not completed backups. Unknown dates and unverified completed points remain +evidence, not absent or failed points. Completion establishes neither an +independent backup (guest snapshots remain distinct), tested restore nor guest +thaw. Registered recovery-model and consuming-table tests cover mixed, +incomplete-only, unknown-date and completion-transition controls without any +new backup execution, QGA requests, schema or persisted state. + ### Failed posture refreshes withdraw retained assessments (24 October 2026) Protection posture remains visible while a refresh is pending, but a settled diff --git a/frontend-modern/src/features/proxmox/ProxmoxBackupsTable.tsx b/frontend-modern/src/features/proxmox/ProxmoxBackupsTable.tsx index 8a96a8247f..2c8081f04f 100644 --- a/frontend-modern/src/features/proxmox/ProxmoxBackupsTable.tsx +++ b/frontend-modern/src/features/proxmox/ProxmoxBackupsTable.tsx @@ -43,6 +43,7 @@ import { import { buildProxmoxBackupRecoveryModel, coverageRowMatchesSearch, + isCompletedRecoveryArtifact, selectWorkloadRecoveryArtifacts, recoverableArtifactMatchesSearch, type RecoverableArtifact, @@ -502,11 +503,13 @@ export const ProxmoxBackupsTable: Component<{ recoveryModel().recoverableArtifacts, (artifact) => artifact.createdMs, (artifact) => - artifact.sourceKind === 'pbs' - ? 'pbs' - : artifact.sourceKind === 'archive' - ? 'archive' - : 'snapshot', + !isCompletedRecoveryArtifact(artifact) + ? null + : artifact.sourceKind === 'pbs' + ? 'pbs' + : artifact.sourceKind === 'archive' + ? 'archive' + : 'snapshot', { now: new Date(nowMs()), getValue: @@ -753,8 +756,17 @@ export const ProxmoxBackupsTable: Component<{ tail={ {liveTotalCount()} targets ·{' '} - {recoveryModel().coverageSummary.recoverableArtifacts} restore points + {recoveryModel().coverageSummary.recoverableArtifacts} completed restore{' '} + {recoveryModel().coverageSummary.recoverableArtifacts === 1 ? 'point' : 'points'} {inventoryIncomplete() ? ' read' : ''} + 0}> + {' · '} + {recoveryModel().coverageSummary.runningArtifacts} running + + 0}> + {' · '} + {recoveryModel().coverageSummary.failedArtifacts} failed + 0}> {' · '} {recoveryModel().coverageSummary.withPBS} with{' '} @@ -830,7 +842,10 @@ export const ProxmoxBackupsTable: Component<{ when={hasRecoverableActivityInRange()} fallback={
- No dated backup activity in the selected {chartRange()}-day window. + + No completed restore points with known dates in the selected {chartRange()} + -day window. +