Storage Durability Policies — Backup, Replication, Recovery, Archive, Integrity
Status: spec, work-in-progress. Defines the design-level policy objects that bind storage classes to durability, recoverability, locality, privacy, integrity, archival, and exit commitments. Names
StorageSpec,BackupPolicy,ReplicationPolicy,RecoveryPolicy,ArchivePolicy,IntegrityPolicyas the six forward-direction objects the spine doc tracks under #1816 and the merged specs (#1819, #1820, #1821, #1822) defer to. Reuses existing kernel-level types (StorageClass,DataLocality,StorageValidationErrorfromicn/crates/icn-kernel-api/src/storage.rs) verbatim where they apply. Clauses that depend on schema fields or kernel behavior that have not yet landed are marked as forward-direction. The PR introducing this doc advances#1816without closing it.
Purpose
ICN's storage layer already enforces two kernel-level constraints: StorageClass (Canonical / ServiceState / Blobs, per icn-kernel-api/src/storage.rs:53) and DataLocality (CellLocal / CoopReplicated / FederationMirrored / CommonsPublic, per the same file at line 155). Those constraints establish what the kernel can refuse. They do not, by themselves, establish how storage stays durable, how a backup is taken or restored, what counts as a verified replica, what an archive owes the institution years from now, or what authority a restore requires.
The spine doc names six policy objects for the missing durability layer — StorageSpec, BackupPolicy, ReplicationPolicy, RecoveryPolicy, ArchivePolicy, IntegrityPolicy — and explicitly marks them as forward-direction tracked under #1816. The four merged sibling architecture specs each defer to this spec for the design-level policy contract for those objects:
docs/spec/governed-service-binding.md(#1822, merged): "Backup policy reference. Pointer to theBackupPolicythe binding inherits (forward-direction, per#1816)."docs/spec/institutional-domain.md(#1820, merged): "Backup / recovery / archive defaults … (cross-link#1816)."docs/spec/effect-dispatch-contract.md(#1819, merged): "Backups inherit the disclosure policy of the source (see … the forthcoming backup spec under #1816)."docs/spec/ccl-policy-registry.md(#1821, merged): names#1816as the home for "backup / replication / recovery / archive policies" and for export-receipt provenance.
Foundational storage canon is separate from the merged sibling specs above. docs/state/storage-governance-spec.md is the existing foundational doc for StorageClass, DataLocality, and storage-access enforcement vocabulary; it independently names StorageSpec and validate_storage_access() as required follow-ups. This spec gives those names design-level shape without redefining the existing kernel-level types.
This spec defines those objects at object granularity — fields, lifecycle stages, authority bindings, receipt expectations, hard rules — and names the institutional rules that bind them to authority and receipts. It does not introduce schema, wire format, Rust types, or storage-backend implementation. It explicitly defers vendor choices, replication algorithms, SLA commitments, and storage-backend selection. It does not redefine StorageClass or DataLocality; both remain canonical per the kernel-level enums.
What this spec is not
- Not a storage backend implementation. No code lands here.
- Not a backup-job implementation. The spec names what a backup is in institutional terms; the schedule, the worker, the wire format are forward work.
- Not a replication algorithm choice. The spec names what a replica owes; the algorithm is engineering choice deferred to implementation.
- Not a vendor-specific integration. Where the institution chooses an external custodian, that is a governed agreement (per
docs/spec/institutional-domain.md§"Agreement registry"), not a spec-level coupling. - Not a schema migration. No Rust types, JSON schemas, or wire formats are introduced.
- Not an SLA commitment. The spec names objective classes (e.g., "bounded restore time") rather than numerical SLAs; concrete numbers belong to per-domain
DomainPolicyadoptions. - Not a redefinition of
StorageClass(3-variant kernel enum) orDataLocality(4-level kernel enum). Both remain canonical pericn-kernel-api/src/storage.rs. - Not authority to mutate DNS, K3s, Forgejo, identity-bridge, gateway, backup jobs, replication targets, archive targets, or any deployed infrastructure.
- Not a production-readiness claim. No partner federation is operating under these primitives today.
- Not closure of
#1816. The PR introducing this doc usesRefs:; closure is left for separate review against the issue's scope.
Storage class model
ICN canon currently carries two related but distinct storage taxonomies. The spec uses both and names the relationship between them.
Kernel-level StorageClass (3 variants, implemented):
| Variant | Meaning |
|---|---|
Canonical |
Immutable, replicated, authoritative. Ledger entries, governance receipts, trust edges. Cannot be modified after creation. |
ServiceState |
Mutable, scope-default. Application state. Updated via CAS. Default for general compute tasks. |
Blobs |
Content-addressed, locality-flexible binary data. Documents, media files, WASM modules. Addressed by content hash; immutable by reference. |
These three variants are what the kernel can pattern-match on. Per the meaning firewall (docs/architecture/KERNEL_APP_SEPARATION.md), the kernel never enumerates a richer taxonomy.
Design-level seven-class custody taxonomy (per docs/architecture/ICN_INTEGRATED_SYSTEM_MODEL.md §"Storage as custody"):
| Custody class | Kernel-level mapping | Per-class design expectations |
|---|---|---|
| Canonical store | Canonical |
Custody: canonical. Locality: usually CoopReplicated or wider, per DomainPolicy. Privacy: typically MembersOnly+ except where intentionally public. Backup: mandatory. Replication: mandatory. Archive: mandatory. Restore authority: governed. Export: per domain exit policy. Receipts: every transition emits a receipt. |
| Service state | ServiceState |
Custody: service state. Locality: per service. Privacy: per service binding. Backup: per-service BackupPolicy; some services accept lossy state. Replication: per-service ReplicationPolicy. Archive: usually not required. Restore authority: per service binding; routine for non-authoritative state. Export: per binding exit policy. Receipts: institutionally relevant transitions only. |
| Artifact / blob store | Blobs (tracked under #1798) |
Custody: artifact. Locality: flexible; usually content-addressed. Privacy: per artifact registry classification. Backup: per artifact retention policy. Replication: per artifact class. Archive: per long-term retention class. Restore authority: per registry policy. Export: per content visibility. Receipts: significant artifact lifecycle transitions. |
| Volume / block store | (typically ServiceState underlying; access via runtime provider) |
Custody: volume. Locality: per binding. Privacy: usually private-to-binding. Backup: per workload BackupPolicy. Replication: per ReplicationPolicy of the underlying provider. Archive: usually not. Restore authority: per binding. Export: per binding exit policy. Receipts: provisioning + destruction. |
| Scoped vault / private storage | (extends Blobs + access policy, tracked under #1767 / #1792) | Custody: vault. Locality: typically CellLocal or CoopReplicated. Privacy: PrivateOverlay / ScopeRestricted / SecretCredential per #1792. Backup: encrypted; must not broaden disclosure. Replication: bounded by privacy. Archive: per retention; honoring disclosure throughout. Restore authority: stricter than ordinary state; named explicitly. Export: per disclosure boundary; redaction may apply. Receipts: access produces an AccessReceipt (per #1792). |
| Secret / key material | (canonical / sealed, often outside ICN's direct storage) | Custody: secret. Locality: as narrow as the institution can tolerate. Privacy: SecretCredential. Backup: stricter than ordinary; rotation and recovery are governed. Replication: only via key-rotation / recovery protocols. Archive: only by explicit policy; usually rotated rather than archived. Restore authority: top-level governed events. Export: forbidden except by explicit policy. Receipts: rotation, recovery, revocation. |
| Cache / derived state | (ServiceState or Blobs; reconstructible) |
Custody: derived. Locality: per the source. Privacy: inherits source. Backup: usually not required (regenerate from source). Replication: opportunistic. Archive: not applicable. Restore authority: trivial; rebuild from source. Export: not applicable. Receipts: not required. Cache treated as canonical is a bug. |
Drift note (honest): the seven-class custody taxonomy is broader than the three-variant kernel enum. They overlap but do not align 1:1 today. Reconciliation — whether to widen the kernel enum or to keep the kernel coarse and treat the seven classes as an app-layer projection — is forward work, tracked as a follow-up in this PR's handoff. This spec uses the seven-class custody taxonomy at design level and the three-variant kernel enum at kernel-enforcement level; the difference is explicit, not hand-waved.
StorageSpec
StorageSpec is the binding between a workload, service, or domain object and the storage it touches. Today it does not exist as a Rust type; storage-governance-spec.md names it as a required follow-up. This spec defines its shape at design granularity.
Identity and references
- Spec identifier. A stable identifier for the storage binding inside the adopting domain.
- Binding reference. The
GovernedServiceBinding(perdocs/spec/governed-service-binding.md) that owns this storage spec, or theInstitutionalDomainthat owns it directly for domain-level state. - Storage object reference. What this spec governs: an artifact in the registry, a volume, a vault entry, a service state store. References to objects in
#1798(ArtifactRegistry) and#1767(encrypted private-overlay store) when those land.
Classification
- Custody class. One of the seven design-level classes named above.
- Kernel
StorageClass. One ofCanonical/ServiceState/Blobspericn-kernel-api/src/storage.rs. DataLocality. One ofCellLocal/CoopReplicated/FederationMirrored/CommonsPublic. The spec's locality is the upper bound for replicas, backups, archives, and exports (see §"Locality and privacy inheritance").- Privacy / disclosure class. Per the forthcoming
#1792taxonomy (Public/MembersOnly/ScopeRestricted/PrivateOverlay/SecretCredential/ExternalCustodian/SealedUntil). The privacy class is the upper bound for all derived copies.
Capacity and growth
- Capacity expectation. Maximum size, growth rate envelope, and the threshold at which the domain expects to review.
- Quota / allocation pointer. The resource budget per the domain's compute placement policy (cross-link
#1801).
Policy references
BackupPolicyreference. Pointer to the adopted backup policy, or explicit acknowledgement that no backup applies (e.g., forcache / derived state).ReplicationPolicyreference. Pointer to the adopted replication policy, or explicit acknowledgement ofsingle-copyfor opportunistic state.RecoveryPolicyreference. Pointer to the adopted recovery policy.ArchivePolicyreference. Pointer to the adopted archive policy, where the class warrants long-term retention.IntegrityPolicyreference. Pointer to the adopted integrity policy.
Lifecycle and exit
- Export / exit requirement. What happens to this storage when the domain exits or the binding is removed (per
docs/spec/institutional-domain.md§"Domain lifecycle" → Export). - Deletion / retention expectation. Whether deletion is allowed, who authorizes it, what receipt class records it.
Receipt expectations
- Per-policy receipt classes. Each referenced policy names which receipt classes the chain emits at its lifecycle transitions (per
docs/spec/effect-dispatch-contract.md§"Receipt class summary"). The spec carries those expectations forward; it does not invent new classes here.
Invariants:
- A workload's
WorkloadManifestdeclared storage requirement; theStorageSpecis the actual grant. The spec never widens what the manifest declared. - A storage binding without a custody class is rejected (per
storage-governance-spec.md). - A storage binding without a backup, replication, and exit policy is incomplete; the chain should refuse adoption until the gap is named (even explicitly to record that the class warrants none).
DataLocalityis upper-bound, not exact. A spec atCoopReplicatedmay host data inCellLocal; it may not host data inFederationMirrored.
BackupPolicy
A backup is an institutional record of what was true at a moment, kept for the institution to recover from loss. Today BackupPolicy does not exist as a type. This spec defines its design shape.
Frequency and schedule
- Cadence class. Continuous (e.g., write-ahead log shadow), periodic (e.g., hourly / daily / weekly), governance-triggered (taken on demand under authority), or threshold-triggered (taken when state crosses a defined risk threshold).
- Schedule reference. Pointer to the per-domain operational schedule. The cadence is a class; the schedule is the concrete plan.
Target
- Target locality. One of
DataLocalitylevels. MUST be equal to or narrower than the source'sDataLocality. Backups never broaden locality (see §"Locality and privacy inheritance"). - Target custody class. Often the same as the source; sometimes narrower (e.g., a
Service statebackup may land in aScoped vaultif disclosure must tighten). - Storage location. Reference to a physical or logical storage location; named in the per-domain operational plan.
Privacy inheritance
- Privacy class. MUST be equal to or narrower than the source's privacy class. Backup never broadens disclosure. Where the backup target reduces disclosure (e.g., scoped vault for what was members-only), the policy names the narrowing.
- Encryption / key custody expectation. For privacy classes that require encryption (
PrivateOverlay,SecretCredential,ExternalCustodian), the policy names the key custody model. Key custody specifics are deferred to#1767. This spec names that backups inherit the source's encryption posture; it does not specify the cipher or key model.
Retention
- Retention window. How long the backup is kept before it expires or migrates to archive. Class options: short-horizon (operational rollback), institutional-horizon (months to a few years), archival (handed off to
ArchivePolicy). - Cleanup / expiration authority. Who authorizes deletion at expiry; what receipt class records the deletion.
Integrity verification
- Integrity check. How the backup proves it is what it claims to be (content hash, signed manifest). Cross-link
IntegrityPolicybelow. - Verification cadence. How often the backup is re-verified.
Restore-test cadence
- Drill frequency. How often the institution proves it can restore (see §"Restore-test receipts").
Authority
- Adoption authority. Who can adopt or amend this policy (governance act per
docs/spec/ccl-policy-registry.md). - Operational authority. Who can execute the backup job under the policy. Operational backup is routine; deletion / restore is not.
Receipt classes
- Backup creation receipt.
- Backup verification receipt.
- Backup expiration / deletion receipt.
- Backup failure receipt (a failed backup is a governance-relevant event, not a silent log line).
Hard rule:
A backup inherits the source's locality and disclosure rules unless a governance decision explicitly narrows access further. It MUST NOT broaden locality or disclosure.
ReplicationPolicy
Replication keeps the service alive. It is not the same as backup; it shares only the verification surface with IntegrityPolicy and the anti-entropy proof loops tracked under #1799.
Replica count and placement
- Minimum viable copies. At design level, a class (e.g.,
single-copy,dual-coop,quorum-of-3,federation-quorum). Concrete numbers belong to the domain's operational adoption. - Placement constraints. Diversity across cells, cooperatives, federations, or commons pools. The placement constraint inherits the spec's
DataLocalityupper bound.
Convergence
- Anti-entropy expectation. How replicas reconcile. Convergence semantics defer to
#1799(network anti-entropy proof loops); this spec names that the policy declares an expectation, and the proof loops carry the verification surface. - Divergence detection. How the policy detects that replicas have diverged. Cross-link
IntegrityPolicybelow. - Repair authority. Who can authorize repair when replicas diverge in a way the proof loops cannot resolve automatically. Repair is a governed act for
Canonicalstorage; routine forServiceStateper binding policy.
Replica lifecycle authority
- Replica promotion / demotion. When a replica becomes primary (e.g., for read load or failover) or steps down. For
Canonicalstorage, promotion is institutionally significant and emits a receipt; forServiceState, it may be routine.
Receipt classes
- Replication-completed receipt (per replica).
- Anti-entropy check receipt.
- Divergence-detected receipt.
- Repair receipt.
Boundary:
- Replication is not backup. A replica is a current copy; a backup is a record of past state. The two share a verification surface but answer different institutional questions.
- Cross-reference:
#1799defines the substrate-side proof loops; this spec defines the institution-side policy that consumes them.
RecoveryPolicy
Recovery is what the institution promises to itself when something goes wrong. The policy names what restoring authoritative state means and who can do it.
Restore objective
- Restore objective class (not SLA). Class options: best-effort (no commitment beyond "we try"), bounded (recovery within a named horizon), strict (recovery within a named horizon with named authority), disaster-only (recovery exercised only on declared incident). Concrete numerical objectives (RTO / RPO equivalents) belong to per-domain adoption.
Authority
- Restore authority. Which
AuthorityClass(per ADR-0014) and whichMandate(per ADR-0019) covers a restore of this storage class. Restoring authoritative state is a governed event; the policy names which proposal class is required to authorize it. - Approval path. How a restore is proposed, reviewed, decided, and dispatched. Maps onto the effect dispatch chain (
docs/spec/effect-dispatch-contract.md) at each stage. - Witness authority. Who validates that the restore matches the expected state. The witness need not be the actor that proposed or executed the restore; separation of duties is the institutional safeguard.
Restore drills
- Drill cadence. How often the institution proves it can restore without waiting for an incident.
- Drill scope. Test scope: full / partial / point-in-time. Drill targets a non-authoritative environment by default.
Restore-target constraints
- Target class. Where a restore is allowed to land — staging, sandbox, production. A drill that restores into the production environment is a
live restore, not atest; the policy names which authority covers each. - Locality and disclosure. The restore target inherits the source's locality and disclosure constraints (see §"Locality and privacy inheritance").
Restore type
- Full restore. Authoritative state replaced from backup. Always governed.
- Partial restore. A subset of state restored. Always governed; the policy names which subsets are allowed.
- Point-in-time restore. Restore to a named historical state. Always governed; the policy names which historical horizons are accessible.
Challenge, reversal, audit
- Challenge path. A restore can be challenged. Challenge is itself a governance act with its own receipt (per
docs/spec/effect-dispatch-contract.md§"Challenge / reversal / counter-receipt"). - Reversal. Reversal of a restore is a separate governance act, not a retroactive edit. The audit log is append-only.
Receipt classes
- Restore-test receipt (drill; see §"Restore-test receipts" below).
- Restore-execution receipt (live restore).
- Restore-failure receipt.
- Restore-challenge receipt.
Hard rule:
Restoring authoritative state is a governed event. It MUST produce receipts and preserve provenance.
ArchivePolicy
Archives keep the institution accountable to itself and to its partners. An archive is not a backup; a backup may eventually become an archive when retention crosses an archival horizon.
Retention
- Long-term retention class. Decades-horizon, generations-horizon, indefinite. The policy names the class; the concrete horizon belongs to per-domain adoption.
- Immutability expectation. Archives are write-once at the policy level. The implementation may use append-only storage, content-addressed snapshots, or external custodians; the policy names the expectation, not the mechanism.
Access
- Access path. Who can read the archive, under what authority, with what receipt.
- Redaction. Per
#1792, archived material that contains private data may require redaction on access. The policy names the redaction class. - Institutional hold. Where the institution has a legal or governance obligation to preserve specific records past their default expiry, the policy names the hold class. The detailed hold protocol is deferred to a follow-up issue (drafted in this PR's handoff).
Verification
- Archive verification cadence. How often the archive proves its content has not silently rotted.
- Integrity proof. Cross-link
IntegrityPolicybelow.
Export
- Archive export. Conditions under which archive material may be exported to another institution or external custodian. Always governed.
Deletion / expiration
- Expiration authority. Who can authorize deletion at the archival horizon. The default is never for
Canonicalstorage; archives that hold canonical state do not expire silently. - Receipt of expiration. A deliberate, governed expiration produces a receipt naming what was retired, under whose authority, against which retention class.
Receipt classes
- Archive-creation receipt.
- Archive-verification receipt.
- Archive-access receipt (per
#1792access-receipt pattern). - Archive-export receipt.
- Archive-expiration receipt.
Hard rule:
Archives keep the institution accountable.
ArchivePolicyMUST NOT become a quiet deletion policy. Expiration of archival material is a governance act with its own receipt.
IntegrityPolicy
Integrity is the institution's assertion that storage has not silently changed. The policy names how that assertion is produced and how often.
Verification cadence
- Verification frequency. Continuous (cryptographic structure), periodic (scheduled check), event-driven (on access or transition), drill (during restore tests).
Proof shape
- Hash / proof vocabulary. Where the canon already names a hash type (e.g.,
blake3content hashes pericn-ccl/src/registry.rs, Merkle proofs pericn-store/src/lib.rs), the policy reuses it. The policy does not introduce new hash algorithms or proof formats. - Content / proof reference. What the integrity check records: content hash, signed manifest, Merkle root, or a combination per the underlying storage type.
Repair path
- On failure. What happens when integrity verification fails. For
Canonicalstorage: a governed event with a named repair authority. ForServiceStateorCache: per-binding policy; often a re-replicate or rebuild from source. - Evidence class. A failed integrity check is itself evidence (per
docs/spec/effect-dispatch-contract.md§"Stage 5: Application + evidence"). It is institutional information, not a hidden log line.
Relationships
- To
ReplicationPolicy. Replication divergence is one source of integrity verification failures; the policies share the substrate-side proof loops in#1799. - To
RecoveryPolicy. Restore tests are integrity events; restore-test receipts include the integrity verification outcome. - To anti-entropy (
#1799). The substrate provides the verification surface;IntegrityPolicyis the institutional consumer.
Receipt classes
- Integrity-check receipt (passed).
- Integrity-failure receipt.
- Integrity-repair receipt.
Restore-test receipts
Restore-test receipts deserve their own section. A backup that has never been restored is hope, not durability.
What a restore-test is
A restore-test is a deliberate, scheduled or governance-triggered drill that exercises the recovery path without putting authoritative state at risk. The drill produces a receipt naming what was attempted, where it landed, who authorized it, and what was verified.
Triggers
- Scheduled drill. Per the cadence named in
RecoveryPolicy. The default is "at least annually, more often forCanonicalstorage." - Governance-triggered drill. A proposal accepted under the domain's authority for the storage class. Useful when policy changes, when a major incident has been resolved, or before adopting a new backup target.
- Incident-aftermath drill. Following a real incident, to confirm the recovery path is intact.
Constraints
- Test scope. Drills restore into a non-authoritative environment by default. A drill that restores into production is a
live restore, not atest, and requires the strict authority class for that storage. - No silent mutation. Test restores MUST NOT mutate authoritative state. Where a drill does require touching authoritative state (e.g., a destructive recovery rehearsal), the policy names the proposal class that authorizes it.
What the receipt records
The restore-test receipt MUST name:
- What was restored (source
StorageSpec, version / point-in-time, content hash where applicable). - Where it was restored to (target environment, locality, custody class, privacy class).
- Under whose authority (mandate reference,
GovernanceDecisionReceiptreference for governance-triggered drills). - What was verified (integrity check outcome, content equivalence, schema compatibility for typed state).
- What failed (per check; not a single boolean).
- Convergence time, where the drill measured it.
Failure
A failed restore test is not a warning to hide. It is a governance-relevant event.
The failure produces a receipt with success = false. The steward cockpit (#1795) surfaces it. Where the failure indicates a real recoverability gap, the policy names which proposal class is required to address it.
Member visibility
For storage classes whose loss would affect members directly (canonical state, scoped vaults), the restore-test result is summarized for affected members at a member-shell-appropriate cadence (per #1818). The summary does not expose the underlying data; it asserts the institution's recovery posture.
Locality and privacy inheritance
The single most load-bearing rule in this spec. Stated three ways for emphasis.
Note on scope vocabulary. Generic scope language in this spec uses
LocalDomain/InstitutionalDomain/Domain(per `../architecture/INSTITUTION_PACKAGE_BOUNDARY.md` §C3 "Entity-scope vocabulary"). The kernel-levelDataLocality::CoopReplicatedenum variant is preserved as the existing serialized Rust identifier; new generic scope concepts that this spec introduces use the local-domain vocabulary rather than coining newCoop--prefixed names. Rename of the kernel-level variant is forward work (compatibility-aware migration; not in this spec's scope).
Inheritance rule:
Backups, replicas, archives, exports, and restore targets inherit the source's
DataLocalityand privacy / disclosure constraints.Policy MAY narrow disclosure (e.g., a
MembersOnlysource backed up into aScopeRestrictedtarget).Policy MAY NOT broaden locality or disclosure without an explicit governance act that names the broadening.
Why:
- A backup that lands in a wider locality than the source effectively re-publishes data the source's authority did not authorize.
- A replica in a wider locality is institutional disclosure by the back door.
- An archive in a wider disclosure class is silent declassification.
- An export to an external custodian is governed precisely because it crosses the boundary.
Per-class application:
- Scoped vault / private overlay storage (
#1767). Backups and replicas remain encrypted; access requires the same authority as access to the source; export requires explicit governance. - Secret / key material. Backups exist only via key rotation or recovery protocols; ordinary backup mechanisms MUST NOT copy secret material. (See §"Failure and safety rules": "Secret material copied into ordinary backup.")
- Cache / derived state. Backup is usually neither required nor appropriate; the source is reconstructible. Where a derived cache is backed up (e.g., to accelerate recovery), the backup inherits the privacy of the source it was derived from.
Cross-link:
#1767— encrypted private-overlay storage, including key custody for backups of vault material.#1792— disclosure boundary andAccessReceiptclass for backup access.
Backup / export / restore authority
The authority rules tie this spec to ADR-0014 (AuthorityClass, AuthorityGrant, TypedScope, Mandate) and to docs/spec/effect-dispatch-contract.md.
Policy adoption and amendment
- Adopting or amending
BackupPolicy,ReplicationPolicy,RecoveryPolicy,ArchivePolicy,IntegrityPolicyis a governance act perdocs/spec/ccl-policy-registry.md§"Adoption contract." The receipt chain is the dispatch chain. - Unadopted policy is inert; the domain runs against its currently adopted versions.
Operational backup execution
- Routine backup execution may be operational, not governed per backup. The domain's operational backup operator runs the schedule the policy authorizes; the policy is the standing authority.
- Every backup execution emits evidence regardless. A backup with no evidence is institutional opacity.
Restore of authoritative state
- Restoring
Canonicalstorage MUST be governed per restore. The proposal class is named inRecoveryPolicy; the dispatch chain runs end-to-end; the restore-execution receipt is the institutional record. - Restoring
ServiceStatemay be per-binding; not every routine rollback needs a full proposal.
Export and exit
- Export of canonical or vault material to another institution requires either a federation agreement (per
institutional-domain.md§"Federation") or the domain's explicit exit policy. - Exit is constitutional. A domain may always leave; the exit path produces export receipts and custody handoffs.
Emergency authority
- Where
RecoveryPolicypermits emergency restore (e.g., to recover from a disaster faster than the ordinary proposal class allows), the emergency authority MUST be: bounded in time, named in the policy, reviewable after the fact, and receipt-backed. No emergency-restore authority is silent.
Failure visibility
- Failed backup integrity, failed restore tests, divergent replicas, missing archives — all surface in the steward cockpit (
#1795). They are first-class institutional facts, not buried operational alerts.
Relationship to sibling work
Cross-link, do not duplicate.
| Concern | Where it lives |
|---|---|
| Governed service binding, workload manifest, runtime provider | docs/spec/governed-service-binding.md (#1815, merged via PR #1822). |
InstitutionalDomain and DomainPolicy (storage / backup / recovery / archive defaults) |
docs/spec/institutional-domain.md (#1794, merged via PR #1820). |
| Effect dispatch contract (Stage 5 application + evidence; disclosure inheritance) | docs/spec/effect-dispatch-contract.md (#1797, merged via PR #1819). |
| CCL policy registry, adoption contract (policy adoption produces receipts) | docs/spec/ccl-policy-registry.md (#1817, merged via PR #1821). |
Storage classes (StorageClass, DataLocality) and access enforcement |
docs/state/storage-governance-spec.md + icn/crates/icn-kernel-api/src/storage.rs. |
| Integrated cooperative operating model (storage as custody + backup doctrine) | docs/architecture/ICN_INTEGRATED_SYSTEM_MODEL.md (#1793, merged via PR #1814). |
ArtifactRegistry v0 and ScopedVault boundary |
#1798. |
| Encrypted distributed private-overlay storage (key custody for vault backups) | #1767. |
Private data disclosure boundary (PrivacyClass, DisclosurePolicy, AccessReceipt) |
#1792. |
| Network anti-entropy proof loops (verification surface for replication / integrity) | #1799. |
| Compute placement (resource allocation for storage-providing workloads) | #1801. |
| Member shell v0 (member-facing restore-test summary) | #1818. |
| Steward cockpit v0 (operator-facing failure surface) | #1795. |
| Receipt and provenance proof envelope (existing receipt layer model) | ADR-0026. |
Constitutional object model (AuthorityClass, AuthorityGrant, Mandate) |
ADR-0014. |
| Authority Grant Minting and Mandate Persistence Seam | ADR-0019. |
Failure and safety rules
Each failure mode has a deterministic response. Cross-cutting rule: fail closed, surface honestly, never silently fall back.
| Failure | Response |
|---|---|
Missing StorageSpec (a binding declares storage but no spec is bound). |
Adoption MUST fail. The domain cannot govern what it has not classified. |
| Storage binding without a custody class. | Refused at adoption (per storage-governance-spec.md). |
BackupPolicy missing for non-discardable state. |
Adoption MUST fail unless the spec explicitly declares the storage class is discardable (e.g., cache). Silence is not "no backup needed"; absence is a contract gap. |
| Backup crosses locality boundary (target locality wider than source). | Backup refused. The runtime provider rejects; the failure is recorded as institutional evidence. |
| Replica violates locality / privacy policy. | Replica placement refused. The provider rejects; the steward cockpit surfaces the gap. |
| Restore without authority. | Restore refused. Where the attempt mutates state, the mutation MUST NOT proceed. The attempt is recorded with the would-be actor and the missing authority. |
| Restore drill never run. | The steward cockpit MUST surface the gap. After a policy-defined horizon, the binding is at-risk and the domain's emergency-review path applies. |
| Archive quietly deleted. | Forbidden. Archival material expires only via the governed-expiration path with a named authority and an expiration receipt. Any deletion without those records is a bug and a governance-relevant incident. |
| Integrity check fails. | The policy's repair path applies. The failure produces a receipt with success = false; the steward cockpit surfaces it; for Canonical storage, the repair authority is named and emergency review applies. |
| Anti-entropy divergence found. | Per #1799's proof loops + ReplicationPolicy.Repair authority. For Canonical storage, the divergence is a governance-relevant event; for routine ServiceState, it may be auto-repairable. |
| Cache treated as canonical. | The class mismatch is a bug. The spec MUST refuse a StorageSpec that names cache custody but operates on Canonical storage class. |
| Secret material copied into ordinary backup. | The backup path MUST refuse. Secret material follows key-rotation / recovery protocols (#1767), not ordinary backups. |
| Export path missing for a binding that may exit. | Adoption MUST fail. A binding without an export path is not safely adoptable. |
| Recovery objective overclaimed as SLA. | The policy names classes, not numerical SLAs. A policy that asserts a numerical commitment without naming the operational mechanism that delivers it is incomplete; review MUST surface the gap. |
| Provider unavailable (storage backend or backup target down). | Spec stays valid; the workload may suspend per the governed-service-binding lifecycle. Operator must restore or governance must amend the policy. |
Stale policy reference (spec points at a deprecated BackupPolicy version). |
The domain MUST amend its DomainPolicy via a governance act before evaluation continues. References pointing at deprecated versions cause selection to fail closed (mirrors ccl-policy-registry.md §"Failure / safety rules"). |
Open questions and deferred decisions
Each is named so future readers know where this spec stops.
| Question | Deferred to |
|---|---|
Wire-stable schema for StorageSpec, BackupPolicy, ReplicationPolicy, RecoveryPolicy, ArchivePolicy, IntegrityPolicy records |
Follow-up schema(storage): … issue drafted in this PR's handoff. |
| Restore-test receipt envelope (Rust type, persistence, audit-query surface) | Follow-up spec(storage): define restore-test receipt envelope drafted in this PR's handoff. |
Locality / privacy inheritance check (the validate_storage_access()-style enforcement function named as TBD in storage-governance-spec.md) |
Follow-up spec(storage): define locality/privacy inheritance checks. |
| Archive verification and export contract (the per-archive proof shape, hand-off protocol, custodian agreement) | Follow-up spec(storage): define archive verification and export contract. |
Backup provider / runtime provider interface (how a BackupPolicy is executed by a RuntimeProvider per #1815) |
Follow-up spec(storage): define backup provider / runtime provider interface. |
Connection between IntegrityPolicy receipts and #1799's anti-entropy proof loops |
Follow-up spec(anti-entropy): connect IntegrityPolicy receipts to network proof loops. |
| Institutional hold protocol (legal / institutional holds beyond default expiry) | Forward; named as a hold class in ArchivePolicy above but the protocol is deferred. |
Reconciliation of the 7-class custody taxonomy with the 3-variant kernel StorageClass enum |
Forward; both stand today, named explicitly in §"Storage class model." |
Concrete numerical objectives for per-domain RecoveryPolicy adoption |
Domain-side, not spec-side. Each domain's DomainPolicy adoption names the concrete RTO/RPO-equivalents. |
| Federation-side recognition of one domain's backup / archive material | Federation agreement (per institutional-domain.md §"Agreement registry"); not in this spec. |
Kernel-side enforcement of inheritance rules beyond what StorageValidationError already covers |
Future ADR / extension to icn-kernel-api/src/storage.rs. |
Non-claims (repeated for clarity)
- This document does not introduce any of the forward-direction policy objects it names. They remain forward-direction.
- It does not introduce schema, wire format, or contract changes.
- It does not redefine
StorageClass(3-variant kernel enum) orDataLocality(4-level kernel enum). Both remain canonical pericn/crates/icn-kernel-api/src/storage.rs. - It does not commit to a storage backend, a replication algorithm, a backup vendor, or an SLA numerical commitment.
- It does not authorize mutation of any deployed infrastructure (DNS, K3s, Forgejo, identity-bridge, gateway, backup jobs).
- It does not claim production readiness.
- It does not claim live inter-cooperative federation.
- It does not claim any partner federation is operating under these primitives today. NYCN appears nowhere in the spec; institution-package vocabulary stays in institution packages.
- It does not use payment, wallet, balance, currency, or blockchain as ICN-native framing. The discipline list in
docs/architecture/ICN_INTEGRATED_SYSTEM_MODEL.md§"Vocabulary discipline" applies in full. - It does not by itself close
#1816. The PR usesRefs:.
Related documents and issues
Architecture and spine:
docs/architecture/ICN_INTEGRATED_SYSTEM_MODEL.md— §"Storage as custody" and §"Backup, redundancy, recovery, archive."docs/architecture/KERNEL_APP_SEPARATION.md— meaning firewall; the kernel never imports policy objects.docs/architecture/INSTITUTION_PACKAGE_BOUNDARY.md— generic shapes vs. package vocabulary.docs/architecture/SERVICE_HOSTING_MODEL.md— hosted → governed → native; storage durability is a binding-state requirement.docs/architecture/COOPERATIVE_DOMAIN_INFRASTRUCTURE.md— design-direction overview.
Specs (siblings and parent):
docs/spec/institutional-domain.md—DomainPolicyadopts the policy objects this spec defines.docs/spec/effect-dispatch-contract.md— Stage 5 receipts; disclosure inheritance.docs/spec/ccl-policy-registry.md— policy adoption is a CCL-evaluated governance act.docs/spec/governed-service-binding.md—StorageSpecandBackupPolicyreference live inside the binding.docs/spec/KERNEL_CONTRACTS.md— kernel primitive contracts.
State and design:
docs/state/storage-governance-spec.md—StorageClass,DataLocality,StorageSpec(named as TBD),validate_storage_access()(named as TBD).docs/design/compute-classes.md— runtime class taxonomy that workloads consume storage under.docs/design/deterministic-core.md— determinism for legitimacy-compute workloads that read or writeCanonicalstorage.
ADRs:
- ADR-0014 — Constitutional Object Model (authority primitives referenced by
RecoveryPolicy). - ADR-0019 — Authority Grant Minting and Mandate Persistence Seam.
- ADR-0026 — Receipt and Provenance Proof Envelope (existing receipt-layer model).
- ADR-0008 — Receipt-chain vertical slice and
audit verifyCLI.
Code surface (existing types this spec references):
icn/crates/icn-kernel-api/src/storage.rs—StorageClass(line 53),DataLocality(line 155),StorageValidationError(line 272).icn/crates/icn-store/src/blob_store.rs— hybrid blob store (sled metadata + filesystem blobs).icn/crates/icn-store/src/lib.rs— persistent key-value abstraction; re-exportsStorageChallenge,MerkleProof,PeerCache,MaintenanceManager.icn/crates/icn-store/src/pos.rs— proof-of-storage challenge system.icn/crates/icn-snapshot/src/lib.rs— state snapshot (Chandy-Lamport) for graceful restarts.icn/crates/icn-governance/src/proof.rs—GovernanceProof,GovernanceDecisionReceipt,GovernanceDecisionAttestation.
Issues:
#1816— this spec.#1793— integrated operating model (merged via PR #1814).#1794— institutional domain (merged via PR #1820).#1797— effect dispatch contract (merged via PR #1819).#1815— governed service binding (merged via PR #1822).#1817— CCL policy registry (merged via PR #1821).#1798—ArtifactRegistryv0 andScopedVaultboundary.#1767— encrypted distributed private-overlay storage.#1792— private data disclosure boundary.#1799— network routing, redundancy, and anti-entropy proof loops.#1801— compute placement.#1818— member shell v0.#1795— steward cockpit.#1748— institutional process substrate.