036-manifest-and-schema-evolution
Manifest and schema evolution: a ledgered manifest transition, a checked migration history, and a restore that refuses what it cannot serve
Today a cell's manifest is frozen at its first boot: the manifest hash is the chain's genesis parent, Ledger::open checks the first record against the booted manifest on every open, and any change to the manifest (one added grant, otel switched on) makes serve exit 1 with an integrity error on the existing volume. Spec 015 B-8 names the missing step, "a deploy genesis record", and nothing defines it. Migrations have the mirror problems: serve accepts a store ahead of the binary, a changed migration under an applied version is skipped silently, and restore checks no compatibility. This spec makes a manifest change a signed transition record appended at deploy, checks the booted manifest against the chain's current manifest, records a checksum per migration, lets an older binary serve a newer schema only across migrations declared additive, and makes restore refuse an archive it cannot serve. It carries the worked consumer example for an upgrade, a rollback, and a restore.
Read the full pinned specification ↗Relationships
depends on
Claimed units
- establishes
{ "kind": "file", "path": "crates/rahi-ledger/src/transition.rs" } - establishes
{ "kind": "file", "path": "crates/rahi-ledger/tests/transition.rs" } - establishes
{ "kind": "file", "path": "crates/rahi-cli/tests/evolution.rs" } - establishes
{ "kind": "file", "path": "crates/rahi-ops/tests/evolution.rs" } - extends
{ "nature": "additive", "spec": "013-ledger-decision-chain", "unit": { "kind": "file", "path": "crates/rahi-ledger/src/chain.rs" } } - extends
{ "nature": "additive", "spec": "013-ledger-decision-chain", "unit": { "kind": "file", "path": "crates/rahi-ledger/src/verify.rs" } } - extends
{ "nature": "additive", "spec": "013-ledger-decision-chain", "unit": { "kind": "file", "path": "crates/rahi-ledger/src/lib.rs" } } - extends
{ "nature": "additive", "spec": "014-ledger-sealing-and-archive", "unit": { "kind": "file", "path": "crates/rahi-ledger/src/segment.rs" } } - extends
{ "nature": "additive", "spec": "014-ledger-sealing-and-archive", "unit": { "kind": "file", "path": "crates/rahi-ledger/src/seal.rs" } } - extends
{ "nature": "additive", "spec": "013-ledger-decision-chain", "unit": { "kind": "file", "path": "crates/rahi-ledger/tests/append.rs" } } - extends
{ "nature": "additive", "spec": "015-kernel-manifest-and-adjudication", "unit": { "kind": "file", "path": "crates/rahi-kernel/src/lib.rs" } } - extends
{ "nature": "additive", "spec": "015-kernel-manifest-and-adjudication", "unit": { "kind": "file", "path": "crates/rahi-kernel/src/manifest.rs" } } - extends
{ "nature": "additive", "spec": "015-kernel-manifest-and-adjudication", "unit": { "kind": "file", "path": "crates/rahi-kernel/tests/adjudicate.rs" } } - extends
{ "nature": "additive", "spec": "011-store-hiqlite", "unit": { "kind": "file", "path": "crates/rahi-store/src/migrate.rs" } } - extends
{ "nature": "additive", "spec": "011-store-hiqlite", "unit": { "kind": "file", "path": "crates/rahi-store/src/lib.rs" } } - extends
{ "nature": "additive", "spec": "011-store-hiqlite", "unit": { "kind": "file", "path": "crates/rahi-store/Cargo.toml" } } - extends
{ "nature": "additive", "spec": "011-store-hiqlite", "unit": { "kind": "file", "path": "crates/rahi-store/tests/migrate.rs" } } - extends
{ "nature": "additive", "spec": "030-operational-verbs", "unit": { "kind": "file", "path": "crates/rahi-ops/src/migrate.rs" } } - extends
{ "nature": "additive", "spec": "030-operational-verbs", "unit": { "kind": "file", "path": "crates/rahi-ops/src/restore.rs" } } - extends
{ "nature": "additive", "spec": "030-operational-verbs", "unit": { "kind": "file", "path": "crates/rahi-ops/src/archive.rs" } } - extends
{ "nature": "additive", "spec": "030-operational-verbs", "unit": { "kind": "file", "path": "crates/rahi-cli/src/lib.rs" } } - extends
{ "nature": "additive", "spec": "030-operational-verbs", "unit": { "kind": "file", "path": "crates/rahi-cli/src/serve.rs" } } - extends
{ "nature": "additive", "spec": "030-operational-verbs", "unit": { "kind": "file", "path": "crates/rahi-cli/tests/cli.rs" } } - extends
{ "nature": "additive", "spec": "030-operational-verbs", "unit": { "kind": "file", "path": "crates/rahi-cli/src/verbs.rs" } } - extends
{ "nature": "additive", "spec": "030-operational-verbs", "unit": { "kind": "file", "path": "crates/rahi-ops/src/backup.rs" } } - extends
{ "nature": "additive", "spec": "030-operational-verbs", "unit": { "kind": "file", "path": "crates/rahi-ops/Cargo.toml" } } - extends
{ "nature": "additive", "spec": "010-workspace-and-core-types", "unit": { "kind": "file", "path": "Cargo.toml" } } - extends
{ "nature": "additive", "spec": "030-operational-verbs", "unit": { "kind": "file", "path": "crates/rahi-ops/tests/common/mod.rs" } } - extends
{ "nature": "additive", "spec": "030-operational-verbs", "unit": { "kind": "file", "path": "crates/rahi-ops/tests/restore.rs" } } - extends
{ "nature": "additive", "spec": "030-operational-verbs", "unit": { "kind": "file", "path": "crates/rahi-ops/tests/backup.rs" } } - extends
{ "nature": "additive", "spec": "037-identity-recovery-and-live-proof", "unit": { "kind": "file", "path": "crates/rahi-ops/tests/rauthy_restore.rs" } } - extends
{ "nature": "additive", "spec": "032-cluster-topology", "unit": { "kind": "file", "path": "deploy/README.md" } } - extends
{ "nature": "additive", "spec": "039-release-and-out-of-tree-packaging", "unit": { "kind": "file", "path": "CHANGELOG.md" } } - extends
{ "nature": "additive", "spec": "031-single-container-packaging", "unit": { "kind": "file", "path": "docker/entrypoint.sh" } } - extends
{ "nature": "additive", "spec": "032-cluster-topology", "unit": { "kind": "file", "path": "deploy/k8s/migrate-job.yaml" } }
Source headings
- 036: Manifest and schema evolution
- 1. Purpose
- 2. Territory
- 3. Behavior
- Manifests
- Migrations
- Restore
- Rolling updates at N=3
- 4. Functional requirements
- 5. Acceptance criteria
- The worked consumer example
- 6. Out of scope
- 7. Resolved decisions
- 8. Status
- Verification
Frozen anchors
No frozen anchors declared.