# CorpusFetch Method Slice (Zero-Prose Python Stdlib Reference) # Canonical Residual: https://corpusfetch.com/c/what-invariants-must-survive-when-only-metadata-survives-a-backup-restore.md # Remnant Warrant: https://corpusfetch.com/c/what-invariants-must-survive-when-only-metadata-survives-a-backup-restore.warrant.json # Markdown SHA-256: 8aa629f1c792b55cdc328a0dfb7f8e778b34533bfca22a4827eab951ef4e1246 # Code AST SHA-256: 829a2ba9f2f9ab764889ca26b01c62ec90f865c016404b3d5bf2f756c21588a1 # Verified Classes: RestoreVerdict, RestoreState, RestorePolicy, RestoreManifest, MetadataOnlyRestoreGuard # Defensive Guards: 1 fail-closed invariants (zero external deps) from dataclasses import dataclass from enum import Enum, auto import hashlib import json class RestoreVerdict(Enum): FULL_RESTORE_VERIFIED = auto() METADATA_ONLY = auto() INCOHERENT_REFERENCE_GRAPH = auto() @dataclass(frozen=True) class RestoreState: metadata_artifact_count: int verified_payload_artifacts: int dangling_references: int reconstruction_source_available: bool @dataclass(frozen=True) class RestorePolicy: min_payload_coverage_ratio: float max_acceptable_dangling: int @dataclass(frozen=True) class RestoreManifest: verdict: RestoreVerdict payload_coverage_ratio: float directive: str manifest_digest: str class MetadataOnlyRestoreGuard: @staticmethod def _hash(data: str) -> str: return hashlib.sha256(data.encode("utf-8")).hexdigest() @classmethod def evaluate_restore( cls, state: RestoreState, policy: RestorePolicy ) -> RestoreManifest: if state.metadata_artifact_count <= 0: raise ValueError("Restore must include at least one metadata artifact.") coverage = state.verified_payload_artifacts / state.metadata_artifact_count # Gate 1: Dangling references if state.dangling_references > policy.max_acceptable_dangling: return RestoreManifest( verdict=RestoreVerdict.INCOHERENT_REFERENCE_GRAPH, payload_coverage_ratio=coverage, directive=f"HALT: {state.dangling_references} dangling refs > {policy.max_acceptable_dangling}. Re-restore from full backup.", manifest_digest=cls._hash(f"DANGLING:{state.dangling_references}") ) # Gate 2: Coverage check if coverage >= policy.min_payload_coverage_ratio: digest = cls._hash(json.dumps({ "coverage": f"{coverage:.3f}", "verified": str(state.verified_payload_artifacts), "total": str(state.metadata_artifact_count) }, sort_keys=True)) return RestoreManifest( verdict=RestoreVerdict.FULL_RESTORE_VERIFIED, payload_coverage_ratio=coverage, directive=f"PROCEED: Coverage {coverage:.2%} >= {policy.min_payload_coverage_ratio:.2%}.", manifest_digest=digest ) # Gate 3: Metadata-only if state.reconstruction_source_available: return RestoreManifest( verdict=RestoreVerdict.METADATA_ONLY, payload_coverage_ratio=coverage, directive="ACTION: Metadata-only state. Reconstruct payload from source before serving.", manifest_digest=cls._hash(f"RECONSTRUCT:{coverage:.3f}") ) return RestoreManifest( verdict=RestoreVerdict.METADATA_ONLY, payload_coverage_ratio=coverage, directive=f"HALT: Metadata-only ({coverage:.2%} coverage), no reconstruction source. Do not serve reads.", manifest_digest=cls._hash(f"PHANTOM:{coverage:.3f}") )