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. +