035-denials-survive-shutdown
Denials survive a graceful shutdown, and every lost denial is counted by its cause
Constitution X says the kernel ledgers every denial. Spec 015 answers a denial before its record is durable and drains the records through a bounded queue, and serve never drains that queue on shutdown, so a graceful stop silently loses the denials still queued (reproduced: 50 denials answered 403 with decision ids, 33 and 40 of them in the chain after SIGTERM, nothing counted). A second loss is structural: a decision id is the chain head at boot plus a counter, so replicas of spec 032's StatefulSet that boot on the same head mint the same ids, and the second append of an id is refused as a conflict (reproduced in process: two kernels on one chain both answered with the same id and one record landed). This spec drains the queue within a bound when serve stops, counts what the bound abandons, separates a dropped record from a failed append on /metrics, and names the replica in every decision id, so the only uncounted loss left is a process that is killed.
Read the full pinned specification ↗Relationships
Claimed units
- establishes
{ "kind": "file", "path": "crates/rahi-cli/tests/shutdown.rs" } - establishes
{ "kind": "file", "path": "crates/rahi-kernel/tests/replicas.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/observe.rs" } } - extends
{ "nature": "additive", "spec": "023-observability", "unit": { "kind": "file", "path": "crates/rahi-edge/src/obs/metrics.rs" } } - extends
{ "nature": "additive", "spec": "023-observability", "unit": { "kind": "file", "path": "crates/rahi-edge/src/obs/mod.rs" } } - extends
{ "nature": "additive", "spec": "030-operational-verbs", "unit": { "kind": "file", "path": "crates/rahi-cli/src/serve.rs" } } - extends
{ "nature": "additive", "spec": "032-cluster-topology", "unit": { "kind": "file", "path": "deploy/README.md" } } - extends
{ "nature": "additive", "spec": "015-kernel-manifest-and-adjudication", "unit": { "kind": "file", "path": "crates/rahi-kernel/tests/adjudicate.rs" } } - extends
{ "nature": "additive", "spec": "020-edge-server", "unit": { "kind": "file", "path": "crates/rahi-edge/tests/common/mod.rs" } } - extends
{ "nature": "additive", "spec": "022-session-and-principal", "unit": { "kind": "file", "path": "crates/rahi-idp/tests/oidc/" } } - extends
{ "nature": "amending", "spec": "013-ledger-decision-chain", "unit": { "kind": "file", "path": "crates/rahi-ledger/src/append.rs" } } - extends
{ "nature": "additive", "spec": "013-ledger-decision-chain", "unit": { "kind": "file", "path": "crates/rahi-ledger/Cargo.toml" } } - extends
{ "nature": "additive", "spec": "013-ledger-decision-chain", "unit": { "kind": "file", "path": "crates/rahi-ledger/tests/append.rs" } } - extends
{ "nature": "amending", "spec": "001-agentic-harness", "unit": { "kind": "file", "path": ".claude/rules/" } }
Source headings
- 035: Denials survive a graceful shutdown
- 1. Purpose
- 2. Territory
- 3. Behavior
- 4. Functional requirements
- 5. Acceptance criteria
- 6. Out of scope
- 7. Resolved decisions
- Proposals for the owner (2026-09-12)
- Verification
Frozen anchors
No frozen anchors declared.