|
| 1 | +-- SPDX-License-Identifier: MPL-2.0 |
| 2 | +-- Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) <j.d.a.jewell@open.ac.uk> |
| 3 | +-- |
| 4 | +||| Layer-5 CAPSTONE: a single end-to-end ABI SOUNDNESS CERTIFICATE for |
| 5 | +||| Phronesiser. |
| 6 | +||| |
| 7 | +||| This module proves NO new domain theorem. It ASSEMBLES the facts already |
| 8 | +||| discharged by the prior proof layers into ONE inhabited record value, |
| 9 | +||| `abiContractDischarged`. Because that value can only be constructed from |
| 10 | +||| genuine witnesses exported by the lower layers, its mere existence (the |
| 11 | +||| fact that this module type-checks) certifies that the whole ABI contract |
| 12 | +||| is satisfied TOGETHER, end to end: |
| 13 | +||| |
| 14 | +||| manifest (phronesiser.toml: "provably safe ethical constraints") |
| 15 | +||| -> Layer-2 FLAGSHIP semantics (Phronesiser.ABI.Semantics) |
| 16 | +||| the canonical positive control `safeInformPermitted` witnesses |
| 17 | +||| that the permitted action genuinely carries a permission proof, |
| 18 | +||| the live half of the safety property whose negative half is |
| 19 | +||| `forbiddenNeverPermitted`. |
| 20 | +||| -> Layer-3 deeper INVARIANT (Phronesiser.ABI.Invariants) |
| 21 | +||| `noHarmTightensBase` witnesses monotone safety's hypothesis |
| 22 | +||| (the stronger policy really tightens the base policy, quantified |
| 23 | +||| over all actions), and `forbiddenStaysForbidden` is the live |
| 24 | +||| application: tightening never re-permits a forbidden action. |
| 25 | +||| -> Layer-4 FFI SEAM (Phronesiser.ABI.FfiSeam) |
| 26 | +||| `resultToIntInjective` witnesses that distinct ABI outcomes never |
| 27 | +||| collide on the C wire — the boundary at which the proofs meet code. |
| 28 | +||| |
| 29 | +||| If ANY of those prior layers were unsound, the corresponding field below |
| 30 | +||| would have no inhabitant and `abiContractDischarged` would not type-check. |
| 31 | +||| The certificate is therefore a genuine composition, not a restatement. |
| 32 | +||| |
| 33 | +||| Genuine proof only — no believe_me / idris_crash / assert_total / |
| 34 | +||| postulate / sorry / %hint hacks. Every field is an already-exported |
| 35 | +||| witness from the layer named above. %default total. |
| 36 | + |
| 37 | +module Phronesiser.ABI.Capstone |
| 38 | + |
| 39 | +import Phronesiser.ABI.Types |
| 40 | +import Phronesiser.ABI.Semantics |
| 41 | +import Phronesiser.ABI.Invariants |
| 42 | +import Phronesiser.ABI.FfiSeam |
| 43 | + |
| 44 | +%default total |
| 45 | + |
| 46 | +-------------------------------------------------------------------------------- |
| 47 | +-- The capstone certificate type. |
| 48 | +-------------------------------------------------------------------------------- |
| 49 | + |
| 50 | +||| `ABISound` bundles the key proven facts of the Phronesiser ABI, one field |
| 51 | +||| per proof layer. An inhabitant is a machine-checked certificate that the |
| 52 | +||| flagship safety property, the deeper monotone-safety invariant, and the |
| 53 | +||| FFI-seam injectivity all hold simultaneously over the SAME shared model. |
| 54 | +public export |
| 55 | +record ABISound where |
| 56 | + constructor MkABISound |
| 57 | + |
| 58 | + ||| Layer-2 flagship (positive control): the canonical benign action really |
| 59 | + ||| is permitted — reuses `Semantics.safeInformPermitted`. |
| 60 | + flagshipPermits : ActionPermitted Semantics.safeInform |
| 61 | + |
| 62 | + ||| Layer-3 invariant (hypothesis witness): the stronger "no harm deploy" |
| 63 | + ||| policy genuinely tightens the base policy, quantified over all actions |
| 64 | + ||| — reuses `Invariants.noHarmTightensBase`. |
| 65 | + invariantTightens : Tightens Invariants.noHarmDeployPolicy Invariants.basePolicy |
| 66 | + |
| 67 | + ||| Layer-3 invariant (live application): tightening preserves the forbidden |
| 68 | + ||| verdict on the canonical forbidden action — reuses |
| 69 | + ||| `Invariants.forbiddenStaysForbidden`. |
| 70 | + invariantPreservesForbidden : |
| 71 | + Forbids Invariants.noHarmDeployPolicy Semantics.forbiddenDeploy |
| 72 | + |
| 73 | + ||| Layer-4 FFI seam: distinct ABI result codes never collide on the wire |
| 74 | + ||| — reuses `FfiSeam.resultToIntInjective`. |
| 75 | + seamInjective : |
| 76 | + (a, b : Result) -> resultToInt a = resultToInt b -> a = b |
| 77 | + |
| 78 | +-------------------------------------------------------------------------------- |
| 79 | +-- The capstone value: the ABI contract, discharged. |
| 80 | +-------------------------------------------------------------------------------- |
| 81 | + |
| 82 | +||| THE CAPSTONE. A single inhabited certificate assembled purely from the |
| 83 | +||| exported witnesses of Layers 2-4. It type-checks iff every prior layer is |
| 84 | +||| sound; constructing it is the end-to-end soundness statement that ties the |
| 85 | +||| manifest's promise, the ABI proofs (flagship + invariant), and the FFI seam |
| 86 | +||| into one value. |
| 87 | +public export |
| 88 | +abiContractDischarged : ABISound |
| 89 | +abiContractDischarged = MkABISound |
| 90 | + { flagshipPermits = Semantics.safeInformPermitted |
| 91 | + , invariantTightens = Invariants.noHarmTightensBase |
| 92 | + , invariantPreservesForbidden = Invariants.forbiddenStaysForbidden |
| 93 | + , seamInjective = FfiSeam.resultToIntInjective |
| 94 | + } |
| 95 | + |
| 96 | +-------------------------------------------------------------------------------- |
| 97 | +-- Projection sanity: the certificate's fields ARE the real theorems. |
| 98 | +-------------------------------------------------------------------------------- |
| 99 | + |
| 100 | +||| The seam-injectivity field of the discharged certificate is exactly the |
| 101 | +||| Layer-4 theorem (definitional). Confirms the capstone exposes, not shadows, |
| 102 | +||| the underlying proof. |
| 103 | +public export |
| 104 | +capstoneSeamIsResultToIntInjective : |
| 105 | + seamInjective Capstone.abiContractDischarged = FfiSeam.resultToIntInjective |
| 106 | +capstoneSeamIsResultToIntInjective = Refl |
0 commit comments