13 KiB
Data Model: Restore Safety Integrity
Overview
This feature does not add or change a top-level persisted domain entity. It introduces a tighter derived safety model around the existing restore flow using current RestoreRun, OperationRun, risk-check, preview, and result data.
The central design task is to turn existing restore inputs and outputs into explicit operator truth without changing:
RestoreRunownership or route identityOperationRunownership or lifecycle ownership- existing backup, policy-version, and assignment storage
- existing write-gate, RBAC, and audit responsibilities
- the no-new-table boundary of this feature
Existing Persistent Entities
1. RestoreRun
- Purpose: Tenant-owned restore record for scope selection, preview basis, checks basis, execution intent, and restore result detail.
- Existing persistent fields used by this feature:
idtenant_idbackup_set_idoperation_run_idstatusis_dry_runrequested_itemsgroup_mappingpreviewresultsmetadatarequested_bystarted_atcompleted_at
- Existing relationships used by this feature:
tenantbackupSetoperationRun
Proposed nested metadata additions
No new columns are required. If persisted historical truth is needed, this feature may add the following nested structures inside RestoreRun.metadata:
| Key | Type | Purpose |
|---|---|---|
scope_basis |
object | Historical snapshot of the restore scope used for checks, preview, or execution |
check_basis |
object | Fingerprint and timing for the last checks considered valid enough to persist with the run |
preview_basis |
object | Fingerprint and timing for the last preview considered valid enough to persist with the run |
execution_safety_snapshot |
object | Exact safety truth captured when a real restore was queued or executed |
Minimal persisted shape:
metadata
├── scope_basis
│ ├── fingerprint
│ ├── scope_mode
│ ├── selected_item_ids
│ ├── group_mapping_fingerprint
│ └── captured_at
├── check_basis
│ ├── fingerprint
│ ├── ran_at
│ ├── blocking_count
│ ├── warning_count
│ └── result_codes
├── preview_basis
│ ├── fingerprint
│ ├── generated_at
│ └── summary
└── execution_safety_snapshot
├── evaluated_at
├── scope_fingerprint
├── preview_state
├── checks_state
├── safety_state
├── blocking_count
├── warning_count
├── primary_issue_code
└── follow_up_boundary
Notes:
scope_basis,check_basis, andpreview_basismay be persisted only when needed for historical result truth. They do not require independent lifecycle behavior.- The snapshot is intentionally narrow. It stores the safety basis used at execution time, not a tenant-wide recovery claim.
2. OperationRun
- Purpose: Canonical workspace-owned monitoring record for restore execution.
- Existing persistent fields used by this feature:
idworkspace_idtenant_idtypestatusoutcomecontextsummary_countscreated_atstarted_atcompleted_at
- Existing relationship and linkage used by this feature:
- restore execution runs already carry
context.restore_run_idor a directRestoreRun.operation_run_idlink
- restore execution runs already carry
No schema change is planned for OperationRun.
Derived Models
1. RestoreScopeFingerprint
Deterministic representation of the current restore scope.
| Field | Type | Source | Notes |
|---|---|---|---|
backupSetId |
integer | backup_set_id |
Required |
scopeMode |
string | scope_mode |
all or selected |
selectedItemIds |
list | backup_item_ids or requested_items |
Sorted, unique, empty for all scope |
groupMapping |
object | normalized group_mapping |
Keys sorted, explicit SKIP retained |
fingerprint |
string | derived hash | Canonical equality signal |
Rules:
- The fingerprint must change whenever any execution-affecting restore input changes.
- Pure confirmation inputs like
tenant_confirmoracknowledged_impactare not part of the scope fingerprint.
2. PreviewIntegrityState
Derived trust state for preview.
| Field | Type | Source | Notes |
|---|---|---|---|
state |
string | derived | not_generated, current, stale, invalidated |
freshnessPolicy |
string | derived | Fixed to invalidate_after_mutation for this feature |
fingerprint |
string or null | preview_basis.fingerprint or wizard state |
Null if never generated |
generatedAt |
datetime or null | preview_ran_at or preview_basis.generated_at |
Null if never generated |
invalidationReasons |
list | derived | e.g. scope_mismatch, mapping_changed, backup_set_changed |
rerunRequired |
boolean | derived | True for all states except current |
displaySummary |
string | derived | Operator-facing explanation |
3. ChecksIntegrityState
Derived trust state for restore checks.
| Field | Type | Source | Notes |
|---|---|---|---|
state |
string | derived | not_run, current, stale, invalidated |
freshnessPolicy |
string | derived | Fixed to invalidate_after_mutation for this feature |
fingerprint |
string or null | check_basis.fingerprint or wizard state |
Null if never run |
ranAt |
datetime or null | checks_ran_at or check_basis.ran_at |
Null if never run |
blockingCount |
integer | check_summary.blocking |
Preserved even if the state becomes invalid |
warningCount |
integer | check_summary.warning |
Preserved even if the state becomes invalid |
invalidationReasons |
list | derived | Same family as preview invalidation |
rerunRequired |
boolean | derived | True for all states except current |
4. ExecutionReadinessState
Technical ability to start restore execution.
| Field | Type | Source | Notes |
|---|---|---|---|
allowed |
boolean | derived from RBAC, write-gate, provider operability, hard blockers | Answers “can the system start?” |
blockingReasons |
list | derived | missing_capability, write_gate_blocked, provider_unavailable, risk_blocker |
mutationScope |
string | derived | simulation_only or microsoft_tenant |
requiredCapability |
string | derived | existing registry entry, not a raw string literal in feature code |
5. RestoreSafetyAssessment
Decision-layer state that separates executable from safe.
| Field | Type | Source | Notes |
|---|---|---|---|
state |
string | derived | blocked, risky, ready_with_caution, ready |
executionReadiness |
object | ExecutionReadinessState |
Technical startability |
previewIntegrity |
object | PreviewIntegrityState |
Decision basis currentness |
checksIntegrity |
object | ChecksIntegrityState |
Decision basis currentness |
positiveClaimSuppressed |
boolean | derived | True when warnings or integrity issues suppress calm claims |
primaryIssueCode |
string or null | derived | Most important blocker or warning reason |
primaryNextAction |
string | derived | e.g. rerun_checks, regenerate_preview, adjust_scope, review_warnings |
Derived-state rules:
blocked: execution readiness is false, or risk blockers are present.risky: execution may be technically possible, but preview or checks are not current enough to support calm execution, or another integrity problem suppresses approval.ready_with_caution: current preview and current checks exist, blockers are absent, but warnings remain suppressive.ready: current preview and current checks exist, blockers are absent, warnings are absent or non-suppressive, and the operator can receive a calm execution signal.
6. RestoreExecutionSafetySnapshot
Historical snapshot stored on the existing restore run when a real restore is queued.
| Field | Type | Source | Notes |
|---|---|---|---|
evaluatedAt |
datetime | confirmation time | Historical anchor |
scopeFingerprint |
string | RestoreScopeFingerprint |
Basis used to queue execution |
previewState |
string | PreviewIntegrityState.state |
Historical truth at queue time |
checksState |
string | ChecksIntegrityState.state |
Historical truth at queue time |
safetyState |
string | RestoreSafetyAssessment.state |
Historical decision truth |
blockingCount |
integer | checks summary | Historical fact |
warningCount |
integer | checks summary | Historical fact |
primaryIssueCode |
string or null | RestoreSafetyAssessment.primaryIssueCode |
Audit-friendly summary |
followUpBoundary |
string | derived | e.g. run_completed_not_recovery_proven |
7. RestoreResultAttention
Derived result-follow-up truth for restore detail and linked monitoring surfaces.
| Field | Type | Source | Notes |
|---|---|---|---|
state |
string | derived | not_executed, completed, partial, failed, completed_with_follow_up |
followUpRequired |
boolean | derived | Primary operator signal |
primaryCauseFamily |
string | derived | execution_failure, write_gate_or_rbac, provider_operability, missing_dependency_or_mapping, payload_quality, scope_mismatch, item_level_failure, none |
summary |
string | derived | Short operator-facing summary |
primaryNextAction |
string | derived | One leading next step |
recoveryClaimBoundary |
string | derived | Explicitly states what the surface is not proving |
Decision rules:
partial: mixed item outcomes or mixed assignment outcomes remain after execution.completed_with_follow_up: execution reached a terminal completed path, but unresolved warnings, skipped items, or open recovery work remain.completed: execution finished and no derived follow-up remains visible at the restore-run truth level, without implying tenant recovery.
8. RestoreWizardPageModel
Server-driven page model for the wizard.
| Field | Type | Purpose |
|---|---|---|
currentScope |
RestoreScopeFingerprint |
Shows what the operator is about to restore |
previewIntegrity |
PreviewIntegrityState |
Shows whether preview still applies |
checksIntegrity |
ChecksIntegrityState |
Shows whether checks still apply |
executionReadiness |
ExecutionReadinessState |
Shows whether the system can technically start |
safetyAssessment |
RestoreSafetyAssessment |
Shows whether the action is safe enough to claim calm readiness |
primaryGuidance |
object | One primary next step and supporting explanation |
9. RestoreRunDetailPageModel
Page model for the restore-run detail and result surface.
| Field | Type | Purpose |
|---|---|---|
header |
object | identity, backup set, mode, requested by, timestamps |
basisTruth |
object | preview basis, checks basis, execution safety snapshot |
resultAttention |
RestoreResultAttention |
overall result truth and next step |
itemBreakdown |
list | per-item and assignment outcomes |
diagnostics |
list | raw preview, raw results, provider details, mapping detail |
10. RestoreOperationContinuationModel
Minimal restore-specific truth exposed on the canonical operation detail.
| Field | Type | Purpose |
|---|---|---|
restoreRunId |
integer | linked restore record |
resultAttention |
RestoreResultAttention |
restore follow-up truth summary |
restoreDetailUrl |
string or null | safe deep link when entitled |
accessState |
string | linked, unavailable, forbidden_by_scope |
unavailableReason |
string or null | truthful degradation without broken links |
Validation Rules
- Preview is
currentonly when a preview basis exists, its fingerprint matches the current scope fingerprint, a parseable generated timestamp exists, and no covered mutation has invalidated the basis. - Checks are
currentonly when a check basis exists, its fingerprint matches the current scope fingerprint, a parseable checks timestamp exists, and no covered mutation has invalidated the basis. - A fingerprint mismatch must classify preview or checks as
invalidated, not merelystale. - Preview or checks classify as
stalewhen evidence exists but required basis markers are incomplete, legacy, or otherwise insufficient to prove currentness on a persisted draft or run, even though an explicit fingerprint mismatch is not available. - This feature uses freshness policy
invalidate_after_mutation; it does not add a separate age-based timeout for preview or checks inside the active wizard draft. readyrequiresExecutionReadinessState.allowed = true,PreviewIntegrityState.state = current,ChecksIntegrityState.state = current, and no suppressive warnings or blockers.ready_with_cautionrequires current integrity and zero blockers, but at least one suppressive warning remains.riskyremains possible when execution readiness is true but calm approval is suppressed by integrity or warning truth.completedon the result surface must never imply tenant recovery unless another feature later supplies external reconciliation proof.
State Notes
RestoreRunStatusremains the persisted execution lifecycle enum. This feature does not replace it.- Preview integrity, checks integrity, restore safety, and result attention are derived state families. They are not new top-level persisted enums.
- The only persisted addition this design allows is a narrow snapshot of the safety basis used for an actual restore run.