The contract cargo class: a content-addressed statement of what a unit of work must hold (pre/post/inv), what it may touch (frame), and what it may spend (a joule EnPI ceiling against a signed baseline) — discharged into one signed receipt that evidences functional safety, energy management, and AI governance at once. Doctrine: inherit don't invent, bind don't name, seal don't float — every trust-bearing field binds or serializes a demoted state, conformance seals once at discharge against a content-addressed evidence bundle (resolution-free, air-gapped capable), and breach is deviation without a timely amendment, with amendments governing the future only. Ships the v0.6.0 spec with its full amendment history: archive/ holds every prior version byte-exact so the SPEC §16 digest chain verifies, and provenance/ holds the three adversarial diff rounds whose findings drove each traced amendment. Reference workspace joulecontract-rs/ (schema, receipt, seal, amend, conformance) runs the diff-round attack scenarios as tests and mechanically verifies the digest chain. Root README catalogs joulecontract in the standards family, the tree, and the contribution guide. Site: joulecontract.transaction.science. Co-Authored-By: Claude Fable 5 <[email protected]>
25 KiB
JouleContract v0.5 — Self-Diff, Round Three (did the binding repairs open anything new?)
Method: three new, mutually-blind adversarial lenses, one layer down from round two — (1) operational and temporal semantics (what the receipt means at an audit ten years out), (2) economics, incentives, collusion, and equilibria (what rational actors do with the rules), (3) spec-lawyer internal consistency (does v0.5's own text deliver what it claims). 33 findings: T1–T10, E1–E9, S1–S14.
Verdict: Yes — and the headline finding is the sharpest irony of the three rounds:
The energy axis — the standard's namesake — is the last unbound trust-bearing field in the document. §1's binding rule explicitly lists
provenanceas trust-bearing, yetMeteredis a producer-written string with no meter attestation behind it,joules_spentis an unbound number, the EnB is producer-declared, and §10's least-bound-axis rule gates Safety and Governance but states no gate for claimingMetered. v0.5 bound every field v0.4 introduced and forgot the field v0.1 introduced. The standard of energy accountability does not yet bind its energy claim. (S1, E6 — found independently by two blind lenses.)
The round's meta-finding, extending the law of evolution: v0.4 fixed what the receipt says; v0.5 fixed whether what it says is bound to a key — at one instant, for the new fields only. The layer v0.5 cannot reach: (a) every binding is a function of time evaluated against mutable infrastructure (domains lapse, keys rotate, attestations expire, editions revise) with no fixed evaluation point; (b) cryptography binds keys, but assurance needs keys bound to parties and parties bound to consequences — and part of that is not mechanizable by any document and must be named as residual, the §10.1 pattern.
Cluster A — The unbound energy axis (S1, E6, E5, part of S14)
The founding violation of the standard's own §1:
provenance: "Metered"— no required meter attestation, no signed shunt/RAPL/PDU reading, no key. A producer running its own hardware reports any counter value, tags itMetered, and collects the maximal Energy class. Whoever owns the meter owns the unit of account — meter capture is the monetary-policy attack on a joule-denominated system. §15 has no demoted state for it:Unaccountedcovers "substrate exposes nothing," not "producer asserted Metered without evidence."- The ceiling and the EnB are both producer-declared (E5) — declare
joules_allowed: 100for a 2-joule workload and every receipt mintsresidual: 98, which §4.1 explicitly routes into CSRD/ESRS E1 disclosure. Manufactured ESG savings with a receipt. Nothing binds the initial ceiling's derivation. enb_refresolves to a baseline nobody but the producer signs;grid_mixis bare self-asserted numbers routed to regulatory disclosure;executionis a list of labels §3.1 itself rules non-normative.- Consequence: Appendix A's
⟨SIL-3, Metered, certified⟩is the cross-axis halo §10 claims to prevent — with the unbound axis being energy itself.
Fixes: Metered MUST resolve to a meter/substrate attestation signed by a key distinct from the receipt signer (validity-windowed, §6.1's pattern), else demote metered_unattested → treated as ModelBased. The ceiling is trust-bearing (a false-high ceiling makes the reader over-trust the residual): it MUST carry a derivation binding to its EnB or serialize ceiling_unanchored, zeroing the residual's evidentiary weight. The EnB MUST be a signed object. Add the energy gate to the least-bound-axis rule. Fix §4.1: the summable disclosure quantity is joules_spent (measured, provenance-tagged); residual is an internal control signal and MUST NOT be presented as a savings or efficiency claim. Name the limit: on producer-owned bare metal there is no independent meter — that is exactly what the lower categories exist to record honestly.
Cluster B — Time is the unbound dimension (T1, T2, T4, T5, T6, T8, S2, S12, T9, T10)
Every binding v0.5 added — resolution, key disjointness, qualification validity, timestamps, editions — is evaluated against mutable infrastructure, and the spec never fixes the evaluation point.
- T1 [blocker] — "resolve" has no when and no against-what. A receipt conformant in 2026 whose
did:web:audit-a.examplelapses and is re-registered by an attacker in 2031 becomes verifiably wrong (computesindependent:false) at a 2032 audit — or the attacker makes never-independent receipts verify clean. The receipt binds trust to identifiers; the identifier→key mapping is itself an unbound, time-varying claim. Same bug class v0.5 fixed, one level down. - T2 [blocker] — no key lifecycle. "Revocation" does not appear in the document. A verifier key compromised in 2029 after signing four thousand discharges: demote them retroactively (collides with §11 no-retroactive-authority) or trust a known-compromised key forever? v0.5 built migration for the slow failure (cryptanalysis) and nothing for the fast one (theft). Independence is computed over key sets with no temporal anchor — rotation-into-overlap retroactively flips past
independentvalues. And there is no published, append-only office key log for quorum's n to be evaluated against. - T4 + S2 [blocker] — receipt-withholding defeats the temporal-ordering invariant. Found independently by two lenses. §5.2.1 orders amendments against receipt timestamps, but the producer schedules when the receipt is stamped, and the independent-TSA MUST covers amendments only. Breach Monday; withhold the receipt; obtain a frame-widening amendment Wednesday; stamp the receipt Thursday — "timestamped after," governed change, retroactive legalization re-enabled through the issuance gap. Also: transitions are intervals, not points — a long-running transition spanning an amendment is admitted under C₁'s
preand judged against C₂'spost, and the receipt can't express it. - T3 [blocker] — the TSA is a dependency, not an office. §0 promises every fixed point is an office with succession; the steward got §11, verifiers got §6, algorithms got §3.1 — the timestamp authority got a parenthesis. A suborned TSA backdates an amendment and re-enables the exact attack §5.2.1 exists to kill. "eIDAS or equivalent" is undefined for US/global deployments.
- T5/S12 [serious] — receipt rot. Digests guarantee integrity, never availability. No retention rule anywhere. When
assessor.examplewinds down in 2029, every discharge demotes toqualified:falseat the 2031 FDA audit — and the spec cannot distinguish "never qualified" from "qualified, evidence lost," two states an auditor treats very differently. Binding-as-resolvability is a liveness property that decays, retroactively downgrading receipts against §6's own "without invalidating prior receipts." - T6 [serious] —
valid_untilhas no read-time semantics. The spec's own example self-demotes thirteen months after publication if expiry is read-time-evaluated; if issuance-frozen, the spec never says so. - T8 [serious] — edition float. Receipts carry
SIL-3with no edition pin; when IEC 61508 Ed. 3 lands, a steward Register update changes what past receipts claim — retroactive authority laundered through an edition pointer. - T7 [serious] — air-gapped exclusion. DoD/classified enclaves — an explicit target market — have no DNS, no reachable TSA. As written they can produce only demoted receipts, and §5.2.1's MUST makes amendments impossible at all: breach can never become governed change in exactly the highest-assurance environments. Locked out by plumbing, not policy.
- T9 [minor, sharpest small finding] — the amendment log's own chain is placeholders.
amends sha2-256:<digest of v0.4.0>— a literal angle-bracket placeholder, four versions deep. The Self-Hosting Clause is currently undischarged by the standard's own vocabulary. - T10 [minor] — the ratchet across an EnB re-baseline is a cross-EnB comparison §4.3 forbids. Every long-lived contract crosses this on hardware refresh.
The uniform fix (one move, applied everywhere): seal at issuance; change moves forward only. Conformance is established once, at discharge, by the verifier of record; the receipt carries or references into a content-addressed evidence bundle (attestation bytes + digest-pinned key material as of discharge) so re-verification is resolution-free — did:web: strings become non-normative labels exactly as §3.1 already rules for model names. Key events (rotation, revocation, succession) are signed amendments to an append-only office key log — §5.2 applied to keys; independence computes over key sets as of the discharge timestamp per the log; revocation demotes forward from attested compromise time (verifier_revoked_window), never invalidates backward — consistent with §11 because it's grounded demotion, not fiat. Transitions carry an interval (anchored start + receipt stamp), governed end-to-end by the contract in force at start; receipts MUST anchor within a profile-stated latency or serialize timestamp_stale. The TSA becomes an office by role (Register lists recognized regimes per jurisdiction: eIDAS / RFC 3161-under-policy / enclave-internal under the §6 office pattern), with timestamp quorum at SIL-3+. Receipts pin the Register snapshot digest in force at issuance. Retention gets an office and a period by role; lost evidence demotes re-checkability, not the sealed issuance-time verdict (validation_recorded, evidence_lost ≠ unresolvable). Ratchet scoped per-EnB; EnB change resets the floor. Air-gapped conformance falls out automatically: verification never requires network.
Cluster C — Keys ≠ parties ≠ consequences (E1, E2, E8, S6)
- E1 [blocker] — computed independence is Sybil-trivial. Two domains at $12 each, two disjoint keypairs, one owner:
independent: true, computed correctly. v0.4's asserted lie cost a keystroke; v0.5's manufactured topology costs a domain registration. §12's "self-asserted independence is structurally impossible" is now false in spirit — self-manufactured independence is structurally trivial. The bitter detail: §2.4 already inherits eIDAS qualified seals — the one instrument in the spec's own canon that binds a key to a legal entity with statutory identity-proofing — and never deploys them where they'd bite. - S6 [serious] — the computed check's operand is undefined. "Disjoint from the generator's key set" — which keys? The receipt signer's? The registry's? The human principals'? Each answer yields a different
independentfor the same receipt; in practice the flagship "computed, not asserted" repair re-collapses to a producer-serialized boolean. - E2 [blocker] — issuer-pays capture. Verifiers are a market whose product is
closedand whose customer needsclosed. The 2008 ratings-agency equilibrium, with full cryptographic formality throughout. Quorum makes it worse at the margin: k-of-n where the producer selects and pays all n is k-of-n captured firms — and §5.2.1 hands those same keys co-signature over the amendments widening the producer's own obligations. The words "payment," "selection," "engagement," "rotation" appear nowhere in v0.5. - E8 [serious] — verifier signatures have no downside. No bond, no liability hook, not even a named gap. The canon the spec inherits carries downside structurally: auditors carry professional liability; eIDAS QTSPs carry statutory liability (Art. 13). The spec imported their signatures and left their liability behind. Upside per
closed, zero downside per wrongclosed— grade inflation isn't a temptation, it's the gradient.
Fixes: Rename what §6.2 computes — it proves key disjointness, a necessary-not-sufficient floor, and the spec must say so. Define the generator key set normatively (receipt-signer ∪ keys enumerated in the resolved producer attestation ∪ human-principal keys) so disjointness is decidable. At SIL-3+, verifier identity MUST bind to a legal-entity credential (eIDAS qualified seal, vLEI, or equivalent); key-only disjointness serializes independent:key_only, insufficient at SIL-3+. Engagement economics are trust-bearing under §1's own definition: each discharge carries engagement: {selected_by, compensated_by} as bound identities or demotes engagement_undisclosed; profiles MAY require producer-independent selection (registry-assigned or rotation — the post-Enron/PCAOB move the canon already made). Profiles MAY require verifiers under a recognized liability regime (statutory / professional / bonded), carried in the entity credential, else recourse_undeclared. And name the residuals honestly, §10.1-style: common control (one parent, two LLCs) is not mechanizable by any credential scheme — entity binding moves forgery cost from a domain registration to incorporation fraud, no further; issuer-pays gravity is not mechanizable by any document — disclosure makes capture legible, not impossible. Retract the §12 over-claim.
Cluster D — Equilibria and incentive inversions (E3, E4, E5, E7, E9)
- E3 [blocker] — the demotion equilibrium. A receipt with every field demoted is fully conformant, and costs a JSON serializer; the bound path costs TSAs, attestations, quorums. Absent demand-side pressure, the rational market converges on all-demoted
⟨SIL-1, Unaccounted, declared⟩— the standard "succeeds" by universal conformance while delivering zero assurance, and the standard's name becomes the halo §10 was built to prevent, one level up. Fixes: the one mechanizable piece — a claim-discipline rule: a conformance claim MUST be made as the full JCAP tuple plus demoted-state disclosure; the bare word "conformant" is itself a non-conformant claim. And the missing honest sentence: this standard prices honesty; it cannot price assurance — assurance is priced by relying parties demanding profiles. The demoted floor is the intended floor: truthful disclosure beats driven-underground lying. - E4 [serious] — amendment metering taxes honesty and misses its attacker. Governed change costs joules, a TSA, a quorum; ungoverned deviation costs a log line —
breachappears in no profile cap and no §15 row. The flooding insider the meter targets has budget by construction. The fix inverts it back: addbreach_unamendedto §15 — non-promotable, caps Governance class (it is by definition a change-control failure under the §2.3 inheritance) until a forward-looking amendment or fix-receipt closes it. Now amending is the cheap branch. Amendment ceilings SHOULD be de minimis; the anti-flood load lives on quorum, not the meter — fix §12 accordingly. - E7 [serious] — composition relicenses ceilings. "Composition never relicenses" — v0.5's repair — speaks only of frames. Component A (3J ceiling) spends 9J, B (10J) spends 2J, batch at the composed level: 11J under 13J, no breach anywhere, A's 3× overrun netted silently. The spec diagnosed this disease in frames and didn't apply its own cure to the other quantitative clause. Fix: each component remains bound by its own ceiling within composition; composed discharge without per-component
joules_spentattribution demotes (cannot feed a ratchet). - E9 [minor] — quorum economics, the missing viability paragraph. The cheapest-sufficient standard maximizes verification cost exactly at the high-assurance end. The answer exists in the spec's own architecture and is never stated: deterministic discharge is reproducible at near-zero marginal cost — k verifiers re-running an SMT check is k × cheap, which is what makes quorum viable at all; where quorum touches non-reproducible discharge (
observedframes, human roots), the cost is real and is the deliberate price of the claim. Say it, or the first procurement spreadsheet kills SIL-3 adoption.
Cluster E — v0.5's own machinery, incomplete (S3, S4, S7, S8, S9, S10, S11, S13, S14)
- S3 [blocker] — the exemplar receipt is non-conformant with §5.1. The contract declares seven obligations; the receipt discharges three. Both preconditions, one postcondition, and one invariant carry neither a closing tier nor
undischarged. Repaired honestly, four obligations serializeundischarged→ Safety capped → the closing sentence "The SIL-3 profile claim is legal under §10" is false twice over. The standard's own showcase fails the standard. - S7 [serious] — SIL is self-assigned. No hazard analysis, no assessor, nothing binds the target level — and every SIL-2+/3+ MUST in the document is conditional on it, so a producer evades the entire high-assurance regime by writing
"safety": "SIL-1". Worse, it's the canon-misuse class rounds 1–2 policed: the exemplar assigns SIL-3 to a financial settlement — not a safety function; a 61508 assessor rejects the assignment and the domain. Andprofileis absent from §1's trust-bearing list — the field whose falsity most directly causes over-trust. Fix: bind SIL assignment (signed risk-assessment attestation, chain terminating per §5.1.2, elsesil_unassessed) or rename the axis (Assurance Rigor Level) and inherit SIL as analogy with target-setting explicitly out of scope; either way, addprofileto §1. - S8 [serious] — amendment-as-transition is a new unterminated recursion. An amendment is a transition; transitions have contracts; contracts have frames (what is the frame of an amendment?), generators, SILs (inherited from where?), and are themselves amendable — recursively, with §5.1.2 terminating only qualification and generator chains. The same lazily-unterminated recursion §14 declares purged. Also: who sets the amendment's ceiling? If the producer, §12's "cost bounds volume" is self-priced and bounds nothing. Fix: a normative minimal amendment-contract as base case (fixed frame = contract object + log head; SIL inherited from the amended contract; generator = amendment signer); amendments chain, they don't meta-amend; the verifier office or profile prices the amendment ceiling.
- S9 [serious] — frame modes break the cross-domain claim.
observed/static_onlyare defined purely in software terms. A clinical handoff's frame discharge is undefinable as written → permanentlyundischarged→ capped below SIL-3: v0.5's hardening quietly demoted the handoff from "one ledger, one audit" to permanently-low-assurance without acknowledging it. Fix: define an operational mode — witness/receiver attestation asobserved's non-computational analogue; the I-PASS receiver is already sitting in §6. - S4 [serious] — quorum modality contradiction. SHOULD in §6, MUST at SIL-3 in §5.2.1, "implies" (not an RFC 2119 keyword) in §10; "verifier office" never defined; k-of-n unconstrained (k=1, n=1 satisfies the letter); and §5.2.1's quorum is keys-of-one-office, defeated by capturing that office — the exact threat §12 says quorum bounds. Fix: quorum MUST at SIL-3+, office defined (membership, published key log per Cluster B, succession per §11's pattern), quorum across independent verifiers, k/n bounded per profile, "implies" replaced with a MUST.
- S10 [serious] — demoted-state table gaps.
undischargedonpre/post/invcaps nothing in §10's letter (only the frame cap is stated); an unterminated-but-resolving qualification chain isqualified:trueby §6.1's exhaustive trigger list whileunterminatedby §5.1.2;static_only's "profiles MAY require observed" is a hook no profile exercises — SIL-4 is claimable over a never-observed frame; no demoted state covers timestamp failures at all. Fix: close all four meets. - S11 [minor] — three roots, not two. §5.1.2 declares "two defined roots," then uses
human-authored— a third, undefined token — in the same section, in §6.3, and in the example. If it's weaker thanhuman-attested, the headline R1 repair bottoms out at an unbound assertion. Fix: one token, or define the third. - S13 [minor] — "non-promotable" is used five times and defined only for energy. Generalize in §15: promotion = any downstream re-serialization presenting a demoted state as its bound counterpart; prohibited for all states, by any consumer.
- S14 [minor] —
transitiondigest-of-what undefined;executionrequired but never defined (and its values are non-normative labels); "angenerator_unattested" grammar.
What held (attacked and survived)
- §4.3's cross-domain ledger rule — the additive-not-comparative construction survived all three lenses (the assurance reach broke, S9; the ledger did not).
- §5.1.2's two named roots terminate the round-two recursions as designed (the flaw found was a vocabulary leak, S11, not a structural one).
- §6.1's deterministic/stochastic split survived and turned out to carry the answer to the quorum-economics objection (E9): deterministic re-execution is what makes quorum affordable.
- The §10.1 adequacy residual again held — and is now the template this round's fixes reuse twice (the common-control residual, the issuer-pays residual).
Proposed v0.6 amendments (under §5.2 — attributed, reasoned, chained)
The 33 findings consolidate to nine fixes:
- Bind the energy axis (S1, E6, E5): meter attestation behind
Meteredormetered_unattested; signed EnB; ceiling derivation binding orceiling_unanchored; energy gate in the least-bound-axis rule;residualdeclared a control signal, never a savings claim; per-component ceiling accountability in composition (E7). - Seal at issuance, evidence bundles, resolution-free re-verification (T1, T5, T6, S5, S12, T7): conformance evaluated once at discharge by the verifier of record and sealed; receipts carry/reference content-addressed evidence bundles; demotions distinguish never-validated from evidence-lost; air-gapped conformance falls out free; "checkable from the receipt alone" becomes true instead of aspirational.
- Key lifecycle as forward-only amendment log (T2, S4-partial): append-only office key log; independence computed as-of discharge time; revocation demotes forward from attested compromise (
verifier_revoked_window), never invalidates backward. - Close the temporal gaps (T4, S2, T3, T8): transitions are intervals governed by the contract at start-anchor; receipt-anchoring latency bound or
timestamp_stale; independent timestamps on all receipts at SIL-3+ (an unanchored effect receipt is treated as predating every amendment); TSA becomes an office by role with jurisdictional Register entries and timestamp quorum at SIL-3+; receipts pin the Register snapshot digest. - Bind keys to parties to consequences — and name what can't be (E1, E2, E8, S6): define the generator key set; rename §6.2's output key-disjointness; legal-entity credentials at SIL-3+ (
independent:key_onlybelow the bar); engagement disclosure (selected_by/compensated_by) orengagement_undisclosed; liability-regime hook orrecourse_undeclared; two new named incentive residuals (common control; issuer-pays gravity) alongside §10.1; retract §12's "structurally impossible." - Fix the incentive inversions (E4, E3):
breach_unamendeddemoted state capping Governance until amended-or-fixed (amending becomes the cheap branch); de minimis amendment ceilings priced by the office, not the producer; the claim-discipline rule (conformance claimable only as full tuple + demotion disclosure); the honest equilibrium sentence: the standard prices honesty; relying parties price assurance. - Terminate the amendment recursion; fix quorum modality (S8, S4): normative minimal amendment-contract base case; amendments chain, never meta-amend; quorum MUST at SIL-3+ across independent verifiers with bounded k/n and a defined office.
- Bind or rename the safety target; restore the cross-domain claim (S7, S9, T10): SIL assignment bound to a signed risk assessment or the axis renamed with target-setting explicitly out of scope;
profileadded to §1's trust-bearing list; witness-attestation as the operationalobservedmode so a clinical handoff can reach high assurance again; ratchet scoped per-EnB. - Hygiene (S3, S10, S11, S13, S14, T9, E9): conformant exemplar (all seven obligations discharged); demoted-state table meets closed; one root vocabulary; "non-promotable" generalized;
transition/executiondefined; real digests in the amendment chain or the chain markedundischarged(the self-hosting clause currently fails its own vocabulary — the single most quotable finding of the round); the quorum-economics viability paragraph.
The honest headline: v0.4 fixed what the contract says. v0.5 fixed whether the new words are bound to keys. v0.6 must (a) bind the original words — starting with the joule itself, (b) fix the bindings in time, and (c) say out loud which trust the cryptography cannot manufacture — parties and incentives — and hand those to the §10.1 residual pattern instead of to §12's over-claims. The standard's discipline is converging on its own first principle from three rounds ago: the failure isn't estimation, it's estimation laundering itself into apparent measurement — which is exactly what an unbound Metered tag was doing in the spec's own §4.2 all along.
Round-three diff executed against v0.5.0 by three blind lenses (temporal/operational; economic/incentive; spec-lawyer). Prior rounds: joulecontract-diff-v0.3-global.md (canon gaps), joulecontract-diff-v0.4-self.md (binding gaps).