PlatformInventory & Assumptions
Formal Assurance
Theorem Inventory
Lean 4 theorems reachable from the formal root, with their Lean names, files, claim classes, and property IDs.
Reading the claim class
bounded_model means the theorem is over a finite Lean model, not the running Rust binary. aeneas_equivalence means the theorem links the handwritten Lean model to a model extracted from Rust by Aeneas. symbolic_crypto means the theorem is over a symbolic Merkle/sign/verify model rather than a cryptographic implementation. The declared axiom has claim class symbolic_crypto and is listed in allowed_axioms.The axiom
Two registries have to agree on what the Lean tree assumes. The manifest's allowed_axioms list is the approved set:
allowed_axioms = [
# Symbolic collision resistance over the image of the mechanized canonical
# UTF-8 renderer. This is the Lean idealization registered as ASSUME-SHA256.
"Chio.Json.hash_collision_resistant",
]The inventory carries the matching row in its assumptions array, which is separate from the theorems array the rest of this catalog draws on:
"assumptions": [
{
"id": "assume.hash.collision_resistant",
"leanName": "Chio.Json.hash_collision_resistant",
"file": "formal/lean4/Chio/Chio/Json/Hash.lean",
"kind": "axiom",
"rootImported": true,
"claimClass": "symbolic_crypto",
"status": "assumed",
"mapsTo": ["P4", "P7"],
"notes": "Symbolic hash collision resistance over the image of the mechanized canonical UTF-8 renderer. This is the sole explicit root-imported Lean axiom and is registered one-to-one as ASSUME-SHA256; concrete SHA-256 remains outside Lean."
}
],| ID | Lean name | File | Kind | Class | Maps to |
|---|---|---|---|---|---|
assume.hash.collision_resistant | Chio.Json.hash_collision_resistant | formal/lean4/Chio/Chio/Json/Hash.lean | axiom | symbolic_crypto | P4, P7 |
The declaration is axiom hash_collision_resistant : SymbolicHash at formal/lean4/Chio/Chio/Json/Hash.lean. SymbolicHash is a structure bundling an output type, a digest function over canonical bytes, and a proof that the digest is injective, so assuming an inhabitant of it is assuming collision resistance over the image of the mechanized canonical renderer. Concrete SHA-256 stays outside Lean, and the inventory registers the axiom one-to-one against ASSUME-SHA256 in formal/assumptions.toml.
scripts/check-formal-proofs.sh holds the two lists together in both directions. It rejects the tree when the inventory's assumption Lean names differ from allowed_axioms, and it elaborates the root module and rejects the tree again when the set of axioms the Lean environment reports differs from the same list. An axiom added to the source without an entry in both registries stops the gate.
Capability algebra theorems
P1 (capability monotonicity) proves, over the bounded capability algebra model, that a child capability is a subset of its parent.
| ID | Lean name | File | Maps to |
|---|---|---|---|
core.scope.empty_isSubsetOf | Chio.Core.ChioScope.empty_isSubsetOf | Core/Scope.lean | P1 |
core.tool_grant.isSubsetOf_refl | Chio.Core.ToolGrant.isSubsetOf_refl | Core/Scope.lean | P1 |
spec.capability_monotonicity | Chio.Spec.capability_monotonicity | Spec/Properties.lean | P1 |
spec.empty_scope_monotonicity | Chio.Spec.empty_scope_monotonicity | Spec/Properties.lean | P1 |
spec.scope_budgets_nonnegative | Chio.Spec.scope_budgets_nonnegative | Spec/Properties.lean | P1 |
proof.list_isSubsetOf_trans | Chio.Proofs.list_isSubsetOf_trans | Proofs/Monotonicity.lean | P1 |
proof.scope_subset_of_grants_subset | Chio.Proofs.scope_subset_of_grants_subset | Proofs/Monotonicity.lean | P1 |
proof.wildcard_subsumes | Chio.Proofs.wildcard_subsumes | Proofs/Monotonicity.lean | P1 |
proof.reduced_budget_is_subset | Chio.Proofs.reduced_budget_is_subset | Proofs/Monotonicity.lean | P1 |
proof.added_constraint_is_subset | Chio.Proofs.added_constraint_is_subset | Proofs/Monotonicity.lean | P1 |
theorem.attenuation.witness_soundness | Chio.Proofs.AttenuationWitness.witness_soundness | Proofs/AttenuationWitness.lean | P1 |
theorem.budget.sibling_sum_soundness | Chio.Proofs.SiblingSumBudget.sibling_sum_soundness | Proofs/SiblingSumBudget.lean | P1 |
proof.delegation_chain_integrity | Chio.Proofs.delegation_chain_integrity | Proofs/Monotonicity.lean | P5 |
The headline theorem statement is short:
/-- P1: Capability monotonicity -- if a child scope is a subset of a parent
scope, then every grant in the child is covered by some grant in the
parent.
This is the core Chio safety property: delegation can only attenuate,
never amplify. -/
theorem capability_monotonicity (parent child : ChioScope)
(h : child.isSubsetOf parent = true) :
∀ g, g ∈ child.grants →
∃ pg, pg ∈ parent.grants ∧ g.isSubsetOf pg = true := by
intro g h_mem
unfold ChioScope.isSubsetOf at h
exact List.any_eq_true.mp (List.all_eq_true.mp h g h_mem)P1: capability_monotonicity in this catalog
P1 says a child capability's bounds are tighter than its parent's; delegation attenuates and never amplifies. This catalog records P1 in thirteen rows spread across six files. The headline row is spec.capability_monotonicity; every other P1 row either supports it (subset transitivity, wildcard subsumption, budget tightening, added constraints, the attenuation witness, the sibling-sum budget law) or pins a corner case (empty scope, reflexivity, non-negative budgets). Verbatim from formal/theorem-inventory.json:
{
"id": "spec.capability_monotonicity",
"leanName": "Chio.Spec.capability_monotonicity",
"file": "formal/lean4/Chio/Chio/Spec/Properties.lean",
"kind": "theorem",
"rootImported": true,
"claimClass": "bounded_model",
"mapsTo": ["P1"],
"notes": "Primary attenuation theorem over ChioScope grants only; no Rust refinement proof yet."
}Field by field:
id· stable inventory ID. The gatescripts/check-formal-proofs.shfails if any ID is renamed without an accompanying entry change.leanName· the fully qualified Lean identifier. The gate elaborates the root module and asserts this name resolves.file· path relative to the repo root. P1 sits underSpec/rather thanProofs/because the theorem statement is the Chio spec, not a derived helper.rootImported·truemeans the gate checks the import graph closure fromChio.leanreaches this file. A theorem that elaborates but is not root-imported fails the gate.claimClass·bounded_model. The theorem reasons about the LeanChioScopedefinition, not the Rust binary. The Aeneas equivalence theoremaeneas_optionalCapIsSubset_preserves_parent_cap(also taggedP1) is what ties the bounded model to the executable code.mapsTo· the property IDs from the proof manifest this row helps discharge. P1 is the only one here.
Continue the tour at Lean 4 Proofs: P1 the canonical proof or jump back to the P1 Tour.
Revocation theorems
Revocation surfaces in two places: the bounded revocation-store model, and the projected snapshot used by the evaluator.
| ID | File | Maps to |
|---|---|---|
proof.revoke_marks_capability_revoked | Proofs/Revocation.lean | P2 |
proof.revoke_preserves_existing_revocation | Proofs/Revocation.lean | P2 |
proof.checkRevocation_revoked_token_errors | Proofs/Revocation.lean | P2 |
proof.checkRevocation_revoked_ancestor_never_ok | Proofs/Revocation.lean | P2 |
proof.checkRevocation_ok_implies_not_revoked | Proofs/Revocation.lean | P2 |
proof.revocationSnapshot_revoked_token_denies | Proofs/Protocol.lean | P2, P3 |
proof.revocationSnapshot_revoked_ancestor_denies | Proofs/Protocol.lean | P2, P3 |
Evaluation theorems
The bounded evaluator covers signature, time, scope, and revocation checks. P3 is the master fail-closed property.
| ID | File | Maps to |
|---|---|---|
proof.evalToolCall_total | Proofs/Evaluation.lean | P3 |
proof.evalToolCall_invalid_signature_denies | Proofs/Evaluation.lean | P3 |
proof.evalToolCall_not_yet_valid_denies | Proofs/Evaluation.lean | P3 |
proof.evalToolCall_expired_denies | Proofs/Evaluation.lean | P3 |
proof.evalToolCall_revoked_token_never_allows | Proofs/Evaluation.lean | P2, P3 |
proof.evalToolCall_revoked_ancestor_never_allows | Proofs/Evaluation.lean | P2, P3 |
proof.evalToolCall_out_of_scope_denies | Proofs/Evaluation.lean | P3 |
proof.evalToolCall_all_checks_pass_allow | Proofs/Evaluation.lean | P3 |
Receipt theorems
Every inventory row whose file is Proofs/Receipt.lean, plus the field-coupling row in Proofs/Protocol.lean. The two collision-resistance rows here are theorems, discharged over the symbolic hash the axiom above supplies.
| ID | File | Class | Maps to |
|---|---|---|---|
proof.receipt_id_input_collision_resistant | Proofs/Receipt.lean | symbolic_crypto | P4, P7 |
proof.receipt_id_collision_resistant | Proofs/Receipt.lean | symbolic_crypto | P4, P7 |
proof.applyProof_append | Proofs/Receipt.lean | symbolic_crypto | P4 |
proof.membership_proof_sound | Proofs/Receipt.lean | symbolic_crypto | P4 |
proof.membership_proof_verifies | Proofs/Receipt.lean | symbolic_crypto | P4 |
proof.checkpoint_consistency | Proofs/Receipt.lean | symbolic_crypto | P4 |
proof.receipt_sign_then_verify | Proofs/Receipt.lean | symbolic_crypto | P4 |
proof.receipt_immutability | Proofs/Receipt.lean | symbolic_crypto | P4 |
proof.receiptFieldsCoupled_preserves_all_fields | Proofs/Protocol.lean | bounded_model | P4 |
Protocol-layer theorems
Theorems in Proofs/Protocol.lean and Proofs/FormalClosure.lean cover guard-pipeline composition, DPoP nonce admission, budget commits, governed approvals, session continuity, lineage soundness, registry behavior, path-prefix safety, and report truthfulness.
| ID | File | Maps to |
|---|---|---|
proof.admitSession_invalid_dpop_rejects | Proofs/Protocol.lean | P3, P8 |
proof.admitSession_invalid_anchor_rejects | Proofs/Protocol.lean | P3, P8 |
proof.budgetPrecheck_commit_preserves_bounds | Proofs/Protocol.lean | P3 |
proof.budgetCommit_none_when_precheck_fails | Proofs/Protocol.lean | P3 |
proof.budgetTwoCommit_preserves_bounds | Proofs/Protocol.lean | P3 |
proof.clusterOverrun_bound_is_explicit | Proofs/Protocol.lean | P3 |
proof.governedApproval_required_without_token_fails | Proofs/Protocol.lean | P3 |
proof.governedApproval_valid_token_passes | Proofs/Protocol.lean | P3 |
proof.dpop_required_missing_proof_rejects | Proofs/Protocol.lean | P3, P8 |
proof.dpop_required_invalid_proof_rejects | Proofs/Protocol.lean | P3, P8 |
proof.dpop_reused_nonce_rejects | Proofs/Protocol.lean | P8 |
proof.guardPipeline_deny_dominates | Proofs/Protocol.lean | P3 |
proof.guardPipeline_error_dominates | Proofs/Protocol.lean | P3 |
proof.guardPipeline_allow_requires_core_authorized | Proofs/Protocol.lean | P3 |
proof.observed_parent_edge_sound | Proofs/Protocol.lean | P6 |
proof.verified_receipt_lineage_sound | Proofs/Protocol.lean | P7 |
proof.session_continuity_sound | Proofs/Protocol.lean | P8 |
proof.capability_lineage_consistency_sound | Proofs/Protocol.lean | P9 |
proof.report_truthfulness_asserted_not_verified | Proofs/Protocol.lean | P10 |
proof.report_truthfulness_observed_not_verified | Proofs/Protocol.lean | P10 |
proof.registry_publish_requires_valid_signature | Proofs/Protocol.lean | P10 |
proof.registry_resolve_published_valid_record | Proofs/Protocol.lean | P10 |
proof.registry_revoke_deactivates_published_record | Proofs/Protocol.lean | P10 |
proof.delegation_step_allow_requires_attenuation | Proofs/FormalClosure.lean | P5 |
proof.delegation_step_allow_requires_subject_continuity | Proofs/FormalClosure.lean | P5 |
proof.delegation_step_allow_requires_expiry_monotonicity | Proofs/FormalClosure.lean | P5 |
proof.delegation_revoked_ancestor_denies | Proofs/FormalClosure.lean | P5 |
proof.delegation_max_depth_failure_denies | Proofs/FormalClosure.lean | P3, P5 |
proof.dpop_binding_allows_only_when_all_fields_match | Proofs/FormalClosure.lean | P8 |
proof.path_prefix_rejects_sibling_prefix | Proofs/FormalClosure.lean | P3 |
proof.path_prefix_rejects_normalized_traversal_escape | Proofs/FormalClosure.lean | P3 |
Treaty and bilateral accept theorems
The Treaty lane covers cross-organization governance: bilateral treaty admission, constitutional amendment refinement, syntactic predicate-chain preservation, and the bilateral DSSE accept set. These theorems live in Treaty/Intersection.lean, Treaty/PredicateLang.lean, and Treaty/BilateralAccept.lean, all imported from Chio.lean. The explanation of the systems modeled by these theorems is in Papers; this table is the catalog entry, copied verbatim from formal/theorem-inventory.json.
| ID | Lean name | File | Class | Maps to |
|---|---|---|---|---|
proof.treaty_admission_iff_predicate_intersection | Chio.Treaty.treaty_admission_iff_predicate_intersection | Treaty/Intersection.lean | bounded_model | P7 |
proof.treaty_admission_stable_under_ladder_floor | Chio.Treaty.treaty_admission_stable_under_ladder_floor | Treaty/Intersection.lean | bounded_model | P7 |
proof.amendment_admissible_iff_backward_refinement | Chio.Treaty.amendment_admissible_iff_backward_refinement | Treaty/Intersection.lean | bounded_model | P3 |
proof.amendment_without_refinement_rejected | Chio.Treaty.amendment_without_refinement_rejected | Treaty/Intersection.lean | bounded_model | P3 |
proof.freestanding_accept_set_theorem | Chio.Treaty.BilateralAccept.freestanding_accept_set_theorem | Treaty/BilateralAccept.lean | bounded_model | P7 |
proof.essential_preserved_chain | Chio.Treaty.PredicateLang.essential_preserved_chain | Treaty/PredicateLang.lean | bounded_model | P3 |
proof.containsPredicate_preserved_chain | Chio.Treaty.PredicateLang.containsPredicate_preserved_chain | Treaty/PredicateLang.lean | bounded_model | P3 |
proof.anchor_admission_iff_lane_quorum_satisfied | Chio.Treaty.PredicateLang.anchor_admission_iff_lane_quorum_satisfied | Treaty/PredicateLang.lean | bounded_model | P7 |
proof.anchor_admission_rejects_undeclared_lane | Chio.Treaty.PredicateLang.anchor_admission_rejects_undeclared_lane | Treaty/PredicateLang.lean | bounded_model | P7 |
All nine rows are rootImported: true with status proved, claim class bounded_model: each holds over the bounded Lean treaty and predicate-language models, and none of them holds over an Aeneas extraction, a Kani harness, or a Creusot contract. The manifest states the standing of this lane directly: the treaty PredicateLang is a bounded post-validation abstraction over production-shaped federation inputs, and its Lean abstraction anchors are drift tripwires rather than a Rust refinement proof.
Aeneas equivalence theorems
These theorems live in Proofs/AeneasEquivalence.lean. Each one says: the Aeneas-extracted Lean mirror of a function in crates/kernel/chio-kernel-core/src/formal_aeneas.rs is equivalent to the handwritten model the rest of the proofs depend on. The class is aeneas_equivalence.
| ID | Maps to |
|---|---|
proof.aeneas_timeWindowValid_equiv_model | P3 |
proof.aeneas_optionalCapIsSubset_preserves_parent_cap | P1 |
proof.aeneas_budgetCommit_equiv_model | P3 |
proof.aeneas_dpopAdmits_equiv_model | P8 |
proof.aeneas_revocationSnapshot_equiv_model | P2 |
proof.aeneas_guardStep_equiv_model | P3 |
proof.aeneas_receiptCoupling_equiv_model | P4 |
Proof-to-Rust mapping
formal/MAPPING.md is the cross-reference from named TLA+ invariants and Kani harnesses to the Rust call sites they constrain. The script scripts/check-mapping.sh greps the source for each name and fails the build if any appear in source but not in the mapping.
TLA+ invariants
Six rows, one per named invariant in formal/tla/RevocationPropagation.tla. The five safety names are the leaves of the aggregate SafetyInv, which conjoins them with the domain invariant DomainsOK; RevocationEventuallySeen is the liveness property and is checked separately. The mapping file labels the third column Assumption discharge and defines it as which audited assumptions the property relies on, so nothing in it is a retirement.
| Invariant | Rust path constrained | Assumptions relied on |
|---|---|---|
NoAllowAfterRevoke | chio-kernel/src/kernel/validation.rs (revoke_capability, check_revocation), chio-kernel-core/src/revocation_view.rs | ASSUME-SQLITE-ATOMICITY for single-row commits; cross-row recovery is excluded. Runtime trace qualification rests on ASSUME-TRACE-OBSERVER. |
MonotoneLog | chio-kernel/src/kernel/responses/receipt_persistence.rs, chio-store-sqlite/src/receipt_store.rs | ASSUME-SQLITE-ATOMICITY and ASSUME-OS-CLOCK; the storage anchors do not enforce strict timestamps |
AttenuationPreserving | chio-core-types/src/capability/attenuation.rs, chio-core-types/src/capability/scope.rs (ChioScope::is_subset_of), chio-kernel-core/src/normalized.rs | n/a (structural; bounded by DEPTH_MAX) |
RevocationFreshness | chio-revocation-oracle/src/freshness.rs, chio-kernel-core/src/revocation_view.rs | ASSUME-OS-CLOCK |
RevocationStateCoupled | chio-kernel-core/src/revocation_view.rs, chio-kernel/src/kernel/validation.rs (check_revocation), chio-kernel/src/kernel/delegation.rs | ASSUME-NETWORK-TRANSPORT; the runtime snapshot has one global epoch and a revoked-subject set rather than a per-subject lifecycle state |
RevocationEventuallySeen | chio-federation/src/revocation_gossip.rs | Model-only WF_vars(PropagateAny); ASSUME-NETWORK-TRANSPORT remains audited and does not guarantee delivery |
No row in this table records a discharge. Every id in it sits in required_assumption_ids at formal/assumptions.toml, retired_assumption_ids and retired_assumptions there are both empty, and so is discharged_assumptions in formal/proof-manifest.toml. The registry states the bar an invariant would have to clear: retiring an assumption takes named model evidence and a concrete implementation-refinement gate over the affected production boundary, and abstract invariants and manual mirror hashes are not sufficient by themselves.
The scope of the SQLite entry is worth reading in the registry's own words, because it is narrower than the invariant above it suggests. ASSUME-SQLITE-ATOMICITY assumes atomic committed updates for revocation, budget, receipt and registry state per single-row write. Cross-row crash recovery, ordering and conservation are not assumed or discharged and remain outside the current formal claim boundary. The manifest says the same thing from the other side about the invariant that comes closest: ReceiptBeforeAllow proves the abstract persist-before-publish ordering and its production replay exercises the native happy path, and it does not discharge concrete cross-row crash recovery, which remains excluded until implementation trace validation and crash-reopen conservation gates establish refinement. See Assumptions and TCB for the registry in full.
Two more Apalache specs sit alongside RevocationPropagation.tla. formal/tla/DelegationDepthBound.tla carries three named safety invariants ( DepthBoundedByRoot, AttenuatedAtEachStep, and RevokedSubtreeNotObservable ) and the kernel-state-subset lane under formal/apalache/ adds MonotoneLogApalache, ReceiptBeforeAllow, RevocationCutCompleteness, KernelTransitionCancelSafe, and PostAdmissionDropGuard.
Public Kani harnesses
Source: crates/kernel/chio-kernel-core/src/kani_public_harnesses.rs. The mapping script extracts function names following a #[kani::proof] attribute and checks that each appears in the table below.
| Harness | Rust path constrained |
|---|---|
public_verify_capability_rejects_untrusted_issuer_before_signature | capability_verify::verify_capability |
public_normalized_scope_subset_rejects_widened_child | NormalizedScope::is_subset_of |
public_normalized_scope_subset_rejects_value_widened_child | NormalizedScope::is_subset_of |
public_normalized_scope_subset_rejects_identity_mismatch | NormalizedScope::is_subset_of |
public_resolve_matching_grants_rejects_out_of_scope_request | scope::resolve_matching_grants |
public_resolve_matching_grants_preserves_wildcard_matching | scope::resolve_matching_grants |
public_evaluate_rejects_untrusted_issuer_before_dispatch | evaluate::evaluate |
public_sign_receipt_rejects_kernel_key_mismatch_before_signing | receipts::sign_receipt |
public_sign_receipt_accepts_matching_kernel_key | receipts::sign_receipt |
public_sign_receipt_refuses_content_hash_mismatch | receipts::sign_receipt (WYSIWYS content-hash recompute) |
public_sign_receipt_accepts_matching_content_hash | receipts::sign_receipt (WYSIWYS content-hash recompute) |
verify_scope_intersection_associative | formal_core::optional_u32_cap_is_subset |
verify_revocation_predicate_idempotent | formal_core::revocation_snapshot_denies |
verify_delegation_chain_step | formal_core::* (one delegation step composition) |
verify_receipt_roundtrip | receipts::sign_receipt, ChioReceipt::verify_signature |
verify_budget_checked_add_no_overflow | chio_kernel::budget_store::BudgetUsageRecord (additive cap update) |
verify_delegate_no_widen | chio_core_types::capability::delegate |
verify_delegation_receipt_canonical | chio_core_types::delegation_receipt::DelegationReceipt::canonical_bytes |
verify_revocation_view_freshness | chio_kernel_core::revocation_view::RevocationView::install_if_newer |
verify_oracle_inclusion_soundness | chio_revocation_oracle::api::InclusionProof::verify |
Status
Each theorem in the inventory above is rootImported: true. That means it is reachable from the root module formal/lean4/Chio/Chio.lean and the Lean kernel has type-checked it without sorry placeholders. The gate scripts/check-formal-proofs.sh rejects any theorem that drops out of the root import graph or that introduces a sorry.
Bounded models, not Rust
Next
- Aeneas Pipeline · how the equivalence theorems are produced and checked.
- Lean 4 Proofs · per-file structure of the proofs in this inventory.
- Kani Harnesses · full per-harness inventory with wall clocks.
- TLA+ Specs · the revocation-propagation invariants in detail.