Architecture validation and qualification plan
| Field | Value |
|---|---|
| Status | Design complete for review; every Makechain executable result is NOT RUN |
| Updated | 2026-09-22 |
| Protocol baseline | Specification revision 14, 2026-09-22 |
| Commonware baseline | v2026.9.0, commit d476a2361ce6840d2b9d0aa6fb30a924429046d4 |
| Qualification scope | 71 specification invariants, APP-01–20, API-01–20, Q1–Q6, and MC-01–03 |
This plan maps each requirement to an owner, an interface-level observation, an acceptance criterion, and honest evidence status. A scenario definition, source inspection, compiling harness, or passing unit test is not production qualification for a network. Results change only through immutable run manifests that meet section 10.
The specification and companions define behavior. Architecture defines modules and semantic interfaces. Operations defines persistent ownership and Q1 crash cuts. Repository defines dependency, local-gate, deferred hosted-CI, and release rules. The canonical vector and fixture formats remain owned by encoding, with their inventory in data contracts.
1. Evidence vocabulary and module keys
| Code | Meaning |
|---|---|
DEF |
Requirement is defined in reviewed prose only; no executable evidence |
SRC-CW |
Relevant Commonware behavior was source-reviewed at the exact pin |
SRC-TEMPO |
Relevant Tempo behavior/profile was source-reviewed at the recorded pin |
SRC-CONTRACT |
Current settlement contract was source-reviewed and found insufficient for the required proof |
SRC-GCP |
Relevant GKE/GCS documentation was reviewed for the selected disposable-devnet adapter/topology; no deployment evidence |
NOT RUN |
No Makechain implementation/harness result exists; this is the current status of every executable row |
BLOCKED-SETTLEMENT |
Positive settlement result awaits the immutable settlement deployment/profile and authentic proof |
NOT WRITTEN |
The planned formal model and checked configuration do not yet exist |
DRAFT MODEL |
A formal model exists and its fast configurations run under pinned tools, with no reviewer verdict and no implementation linkage; it is not evidence for any claim |
PASS / FAIL / INCONCLUSIVE |
Allowed only in a complete result manifest; missing/bypassed evidence is INCONCLUSIVE |
Source review supports the stated external contract only. It does not establish Makechain assembly,
correctness, crash safety, performance, or production readiness. In the tables, a reference such as
SRC-CW; NOT RUN means exactly that.
| Key | Owning module | Interface/method named by this plan |
|---|---|---|
CS |
Canonical schema | DecodeCanonical, canonical encode/digest/tree helpers |
RE |
Release evaluator | ResolveRules, activation installer |
CA |
Command authentication | AuthenticateCommand |
AE |
Application executor | EvaluateCommand, ExecuteOrderedBlock |
ST |
Three-member state adapter | OpenParentView, MerkleizeBlock |
EA |
Engine assembly | Stateful adapter propose, verify, apply, capture, finalized; recovery lifecycle |
MM |
Mesh membership | TrackPeerSet |
PV |
Proof verifier | VerifyEvidence |
AF |
Admission and fan-out | OpenAdmissionSnapshot, Admit, DryRun, InsertCandidate, SelectForProposal, FanOut |
FE |
Finalized export | EnqueueFinalized, PublishFinalizedRange |
QP |
Query projection | project/replay/cursor interface |
SA |
Service authentication | service authorization and freshness policy |
CW |
Client workflow, deferred | PrepareCommand, signing-slot journal, ReconcileIntent, CompletePush |
Tests observe these interfaces and their durable/public outcomes. They do not assert private helper calls or require a generic mock wall around Commonware. Production adapters are replaced only at real external seams: transport, filesystem/crash control, cloud/object/query storage, Tempo fixture acquisition, and the deferred client journal.
2. Common harness contract
Every deterministic or persistent harness uses:
- canonical frozen inputs and the production codecs/verifiers for the enabled profile;
- explicit chain/genesis/profile/ruleset, seed, consensus time, runtime, pin set, and fault schedule;
- actual Commonware actors and the exact three-member database adapter when the claim crosses those seams; finality is a real threshold certificate, never a harness flag;
- real captured Tempo evidence for a positive import. Dev/test uses Moderato; mainnet uses Mainnet;
- bounded inputs, queues, clocks, work, and observation periods;
- typed invalid, pending, fatal-local, and service outcomes without conflation;
- an immutable result manifest on pass, failure, or inconclusive termination.
Deterministic Q1/Q2 harnesses may consume published reproducible synthetic shares/seeds only from the
repository's exact TEST ONLY fixture allowlist. Persistent devnet/testnet/mainnet runs use
operator-provisioned custody material that is never committed. Both paths use real threshold
operations; neither permits a harness finality flag.
The smallest local stand-ins are allowed only where the architecture has a real adapter seam. An in-memory journal may test Client workflow; an in-memory transport may test a service protocol; a fake finality certificate, permissive settlement verifier, generic in-memory database replacing a QMDB durability claim, or edited recovery journal cannot earn qualification credit.
3. Staged qualification experiments
All six experiments are NOT RUN. “Smallest harness” describes the first useful experiment, not an implemented test.
| ID | Hypothesis and smallest harness | Acceptance criterion | Output and current limitation |
|---|---|---|---|
| Q1 | Fixed-profile application/consensus/persistence: seven deterministic actors and then seven Tokio processes execute IMPORT_CREDITS.Credit → INIT_ACCOUNT → KEY_AUTHORIZE → PROJECT_CREATE → PUSH through the real executor, three QMDB members, WAL, marshal, sync plan, proof verifier, operations cuts C1–C11, and the selected GCS exporter-publication adapter in Q1-T |
Q1-D and Q1-T produce actual 5-of-7 finality; propose/verify/apply bytes and outcomes agree; roots/targets/replay/deposits/events agree after every cut; C9 proves fenced identity replacement. At C10 restart observes only native bootstrap and repeats the exact genesis batch, or observes the exact durable genesis root/target and writes nothing; any third state is fatal-local. At C11 the exact durable current target is the marshal genesis anchor, membership/history remain at native bootstrap size one, no reseed occurs, and duplicate genesis delivery causes no application transition. Receipt verifies and substitutions fail; GCS create-if-absent object and recovery behavior matches the finalized-export contract; object absence remains separate | Per-cut Operations §4 manifest records pre/post/reopened roots and native targets, finalize-handle resolution, marshal anchor, transition count, and membership/history sizes; Operations §6 records the exact pinned source paths. SRC-CW covers ManagedDb::apply/finalize durability handles, native initial targets, and Stateful/marshal genesis handoff; SRC-TEMPO, SRC-CONTRACT, SRC-GCP; behavior NOT RUN, BLOCKED-SETTLEMENT for the positive flow |
| Q2 | Dynamic membership/DKG: after an explicit reset to DynamicReshareV1, seven participants bootstrap, schedule one add/one departure, run real reshare across the required epochs, inject DkgFailed, restart each custody/public-journal cut, and catch up one lagging node |
Effective voters remain the last successful reshare until success; departing dealer stays where required; group key is invariant; shares/epochs/mesh union align; corruption/lost required secret blocks readiness; no fixed-profile evidence is reused | Seeded DKG transcript, custody/public-journal digests, readiness/mesh/vote timeline. SRC-CW; NOT RUN |
| Q3 | Release activation: one parameter release and one consensus-critical release execute across proposal, activation boundary, restart, catch-up, and historical verification; inject crash before/after installer marker and schedule lock | ResolveRules follows executing parent including pending ancestors; critical activation occurs only at the first block of an epoch, after the handoff at the boundary; installer is bounded/exactly once; every active/historical format remains supported; no fallback or reversion |
Canonical release schedule/lineage, before/after roots, binary support manifest. SRC-CW for actor behavior; NOT RUN |
| Q4 | Native/wasm parity: build the portable package in a separate target invocation with the minimum features required by the pinned native proof types, inspect resolved and reachable imports, then run the encoding-owner corpus through the same Rust protocol/proof logic natively and as wasm32-unknown-unknown, including signing presentations, finality/lineage, QMDB/BMT envelopes, receipts, WebAuthn grammar, and settlement proofs |
Selected Commonware crypto/proof types compile; emitted wasm has no reachable filesystem/socket/clock/native-I/O path; canonical bytes/digests and accept/reject error classes match for every case; exact consumption and all bounds hold. An unused transitive runtime trait crate alone is not failure | Pinned source confirms BMT is outside storage's std gate while QMDB is inside it; the complete portable closure is unverified. Corpus/feature/import-graph report; SRC-CW; NOT RUN, BLOCKED-SETTLEMENT only for the positive settlement proof case |
| Q5 | Exporter, store, and proof service: run validators with the retention window, one active and one standby exporter, the exoware-sql store and the mirror; pause and resume publication across a validator prune; kill the active exporter, resume from the standby, and recover a range that only the standby's own durable queue still holds; hold an exporter whose watermark sits below the validators' retained window and require it to stop rather than state-sync forward; install a replacement standby by state sync while blocks keep finalizing, and separately install a replacement active by state sync while blocks keep finalizing, in each case with the other roster member healthy and queuing, and repeat one of them with no other source holding (W, A]; project the block's history tables into the store atomically with the block, certificate, and operation-log slices; page one query by keyset and read one SubscribeFinalized frame; rebuild the store's history tables from the mirror into a new schema prefix; request membership proofs below the validator window and ancestry proofs from the proof service; run the checker and the replay job |
The exporter acknowledges a queue position only after both the store and the mirror accept it, so the published watermark never outruns durable objects; every query first bounds itself to the published watermark height and reports it, the exporter commits block batches to the store strictly in height order and one at a time so that a query bounded by that height never misses a lower height's rows, keyset pagination never uses OFFSET, and SubscribeFinalized resumes by sequence and dedups by EventId; a publication pause that spans a validator prune is repaired from the local queue with no gap in the mirror height index; the standby resumes from the store's publication watermark and writes identical objects for the same heights, and its own queue holds exactly the heights the store and the mirror have not both accepted, so it supplies the range an active exporter's lost disk took with it; an exporter state-syncs at its first installation only, records its sync anchor A durably and begins its own queue coverage at A + 1, and in both the replacement-standby and the replacement-active installation the heights (W, A] that its own queue never received are published from the other roster member's queue, so the store and the mirror show no gap over that range although blocks kept finalizing throughout the sync; the installation whose (W, A] no other source covers is refused and alerted rather than completed silently; the finalization pinned as the sync target is read from the store's finalized-by-height record and certificate-verified, and an exporter for which max(own queue coverage, publication watermark) is below the validators' retained window stops and alerts; the block-projected history tables rebuilt from the mirror into a new schema prefix are logically row-equal to the originals under the equality of history-query section 7, with no two rows of one table sharing a key, while the two ingestion tables are outside that equality because the mirror carries neither object bytes nor off-chain messages, which is the only restore path for the store because the store software ships no replication, snapshot, or backup of its own; the checker verifies each block's finalization certificate from its own trust anchor before it compares anything, then compares the store's root at the ingested size with that verified header's membership and history targets and fails ingestion, never a proof request, on mismatch, and a foreign self-consistent write into the store is detected by exactly that check; membership proofs below the validator window and ancestry proofs verify against one certified header; proof serving never mutates the exporter's head; the replay job re-executes stored blocks from genesis under every activated ruleset and reproduces the header roots; loss assumptions and unavailable outcomes are explicit |
Queue and watermark timeline, mirror height-index gap scan, per-block checker records, target/root comparison, standby takeover and store-rebuild measurement, replay-job manifest. SRC-CW, SRC-GCP for the devnet mirror adapter; NOT RUN; production store replication, publish-lag and restore objectives open |
| Q6 | Edge-to-GKE request path: one minimal Cloudflare Worker adapter sends bounded admission/status/proof requests to a GKE gateway under accepted workload cases and injected timeout, retry, duplicate, stale, overload, and regional/zone network faults | End-to-end sizes/latency fit the later accepted envelope; backpressure is bounded; retry never duplicates a fresh-sequence intent; service errors never become validity/proof; identities/ACLs and private endpoints match deployment policy | Load/fault report with request/evidence sizes, percentiles, queue/timeout/retry traces, topology and cost. NOT RUN; workload percentile, topology, and product adapter remain deferred |
Architecture-gate correspondence is explicit: Q1 supplies slices of G1–G4 and G7; Q2 supplies G5a/G5b; Q3 supplies G6; Q4 supplies portable portions of G1/G7; Q5 supplies recovery portions of G3/G7; and Q6 supplies G8. A Q result earns credit only for the rows listed in its manifest.
Q1 may run as a private partial-slice harness and establishes only its enabled command path and crash cuts; by itself it is not shared-devnet ruleset conformance. Q2 is required because the first devnet omits continuous reshare. Q3 does not prove every future release. Q4 proves parity only for its exact corpus/pins. Q5 proves the configured retention/recovery envelope. Q6 proves one chosen deployment path, not arbitrary Internet or cloud behavior.
4. Specification invariant matrix
Acceptance is evaluated through the named module interface even when several modules participate. “Evidence / limitation” always includes the current executable status. “Defines” is the specification section that states the invariant; section 20 of the specification indexes all 71 by identifier.
| Invariant | Defines | Owner · interface | Acceptance criterion | Evidence / limitation |
|---|---|---|---|---|
| INV-CONS-01 | 12.3 | AE · ExecuteOrderedBlock |
All honest executions over identical authenticated inputs return byte-identical outcome/root or the same typed failure | DEF; APP-01/15/20, Q1/Q2/Q3; NOT RUN |
| INV-CONS-02 | 11.2 | AE · ExecuteOrderedBlock |
Every committed derived header field equals independent re-derivation in propose, verify, apply, and recovery | DEF; APP-01/11, Q1/Q3; NOT RUN |
| INV-CONS-03 | 12.3 | AE · EvaluateCommand |
Any late failure leaves overlay, charges, appends, events, and command outcome unchanged and invalidates an included block | DEF; APP-04, property P-EXEC-02; NOT RUN |
| INV-CONS-04 | 10.1 | AE · ExecuteOrderedBlock |
Each resource dimension is checked independently before commit at exact boundary/overflow values | DEF; property/fuzz P-EXEC-03; NOT RUN |
| INV-CONS-05 | 11.2 | CS · command-tree helper | Root covers exact signed-envelope leaves in order/count and is unchanged by events | SRC-CW (BMT); Q4 vectors; NOT RUN |
| INV-CONS-06 | 7.4 | CA · AuthenticateCommand |
Mutating any bound field/context or ruleset invalidates the signature; evidence-only replacement preserves intent only | DEF; APP-02, API-01/03; NOT RUN |
| INV-CONS-07 | 5.4 | EA · consensus-profile load/validation | Profile is derived only from canonical genesis; local flags cannot alter epochs, validity, or block shape | DEF; APP-15/19/20, API-17/20; NOT RUN |
| INV-CONS-08 | 11.3 | EA · consensus-context validation | Fixed profile rejects any nonzero epoch or present DKG payload before scheme use in all paths | DEF; SRC-CW primitive/profile boundary reviewed; APP-16/20; NOT RUN |
| INV-FAULT-01 | 12.4 | EA · verify/lifecycle |
Fault injection yields exactly invalid, pending, or fatal-local and never turns local failure into a vote | SRC-CW; Q1/Q2/Q5; NOT RUN |
| INV-FAULT-02 | 11.4 | AE · block-context execution | Wall-clock variations with identical consensus time cannot change result | DEF; deterministic property P-TIME-01; NOT RUN |
| INV-FAULT-03 | 11.4 | EA · verify |
Future timestamp stays pending until bounded consensus-time condition; no invalid vote | DEF; deterministic schedule; NOT RUN |
| INV-FAULT-04 | 12.4 | AE · EvaluateCommand(PUSH) |
Availability adapter absent/failing after publication cannot change validation or finalized roots | DEF; API-15/16, Q1/Q6; NOT RUN |
| INV-STATE-01 | 9.6 | AE · ledger transition | For every prefix, checked spent plus locked is at most credited and available is derived | DEF; APP-05, state-machine property; NOT RUN |
| INV-STATE-02 | 9.2 | AE · counter helper through EvaluateCommand |
Bases and checked increments match spec; u64::MAX rejects; delete/recreate cannot reset revision |
DEF; boundary/property corpus; NOT RUN |
| INV-STATE-03 | 9.6 | CA · AuthenticateCommand |
Moving any bound generation/revision/lifecycle context permanently rejects delayed envelope | DEF; APP-04/06/08/09; NOT RUN |
| INV-STATE-04 | 9.6 | AE · typed record reads | Expired/invalid record grants no authority while raw state preserves required incarnation/deposit/grace facts | DEF; APP-06/09; NOT RUN |
| INV-STATE-05 | 9.6 | AE · deposit accounting | Physical deletion/replacement discharges once to stored payer without changing credited/spent or reservation | DEF; APP-03/05, crash replay Q1; NOT RUN |
| INV-STATE-06 | 9.2 | AE · access plan/EvaluateCommand |
Instrumented reads/writes stay within command/rules bounds independent of total state size | DEF; property P-BOUND-01, workload checks; NOT RUN |
| INV-STATE-07 | 9.6 | AE · resource reservation | Gross implicit/explicit creations reserve before execution, do not net deletions, and never consult local capacity for validity | DEF; APP-03, boundary/property corpus; NOT RUN |
| INV-STATE-09 | 9.6 | CA · project authorization | Control/grant generation changes invalidate old project-authorized commands | DEF; APP-07; NOT RUN |
| INV-STATE-08 | 9.6 | AE · child identity transition | Delete/recreate uses a strictly advanced surviving-parent incarnation and checked revisions | DEF; APP-08, stateful model; NOT RUN |
| INV-STATE-10 | 9.2 | AE · project/slug transition | Every successful prefix preserves a bijection between project slug and matching claim | DEF; APP-08, stateful model; NOT RUN |
| INV-STATE-11 | 9.1 | AE · ExecuteOrderedBlock |
Later commands see earlier success; failed candidate contributes no observable effect | DEF; APP-01/04, Q1; NOT RUN |
| INV-AUTH-01 | 7.1 | CA · root authorization | Root reconfiguration changes version/owners/threshold while account ID remains byte-identical | DEF; authorization corpus; NOT RUN |
| INV-AUTH-06 | 7.4 | CA · root-witness verifier | Current version, unique ordered owners, and exact threshold-crossing final signature are necessary and sufficient | DEF; parser/property P-AUTH-01; NOT RUN |
| INV-AUTH-02 | 7.6 | CA · replay validation | Sequence must exceed mark for exact (key_id,generation); unrelated slots have no effect |
DEF; API-04–06/12 reconciliation plus executor model; NOT RUN |
| INV-AUTH-03 | 7.3 | AE · key authorize/revoke | Revoked generation cannot return; re-add advances generation | DEF; APP-06; NOT RUN |
| INV-AUTH-04 | 7.6 | CA · project authority | Transfer/role generation change cannot revive earlier envelope | DEF; APP-08; NOT RUN |
| INV-AUTH-05 | 8.5 | AE · username transitions | At every deadline, uniqueness and full owner-only grace survive release/rename | DEF; APP-09; NOT RUN |
| INV-AUTH-07 | 7.3 | CA · delegated-key validation | Bulk revoke advances delegation epoch without reset of replay/finalized facts | DEF; APP-06; NOT RUN |
| INV-AUTH-08 | 7.3 | CA · scoped-key validation | Project-scoped key succeeds only for named project/family and applicable role/lifecycle | DEF; APP-07; NOT RUN |
| INV-AUTH-09 | 7.3 | AE · key renewal | Renew succeeds only for live current generation and never restores expired/revoked/old-epoch key | DEF; APP-06; NOT RUN |
| INV-AUTH-10 | 7.1 | AE · username extension | Third-party extension changes only permitted deadline/payment facts, never owner/pointer/payer/resolution restoration | DEF; APP-09; NOT RUN |
| INV-MEMBER-01 | 9.3 | ST · MerkleizeBlock |
Finalized append remains in canonical log/root across pruning and recovery | SRC-CW QMDB; APP-12, Q1/Q5; NOT RUN |
| INV-MEMBER-02 | 9.3 | AE · block access/location plan | Locations equal deterministic flat command order before lanes execute | DEF; APP-12, differential schedules; NOT RUN |
| INV-MEMBER-03 | 9.3 | AE · membership witness validation | Each non-delete accepts only its exact eligible witness/target/parent window; missing source is pending, bad proof invalid | SRC-CW proof primitives; APP-02/13; NOT RUN |
| INV-MEMBER-07 | 9.3 | CA · evidence replacement | Replacement leaves canonical intent bytes/digest equal and respects signed work/charge limits | DEF; API-03; NOT RUN |
| INV-MEMBER-06 | 9.3 | ST · MerkleizeBlock |
Every role commits equal inactivity floor and root at each height despite different byte retention | SRC-CW QMDB; APP-13, Q5; NOT RUN |
| INV-MEMBER-04 | 9.3 | ST · member target capture/recovery | Process/recovery ends with membership target exactly equal to certified header | SRC-CW database set; Q1/Q5; NOT RUN |
| INV-MEMBER-05 | 9.2 | PV · current-state verification | No response is accepted as cryptographic absence; unavailable/not-found remains service evidence | SRC-CW unordered QMDB limitation; API-12/14; NOT RUN |
| INV-SETTLE-01 | 16.4 | AE · EvaluateCommand(IMPORT_CREDITS) |
Credit changes state only for a valid cumulative strictly above beneficiary frontier | DEF; SRC-TEMPO covers certificate leg and SRC-CONTRACT is negative contract-layout evidence only; APP-01/10/18, API-19; NOT RUN, BLOCKED-SETTLEMENT |
| INV-SETTLE-02 | 16.8 | RE · activation installer | Identity changes only at genesis or an authenticated release activation; commands cannot install it | DEF; Q3; NOT RUN |
| INV-SETTLE-03 | 16.6 | AE · settlement time checks | Both forward variants reject once dual deadline expires, regardless of previous extension path | DEF; APP-10; NOT RUN |
| INV-SETTLE-04 | 16.4 | makechain-protocol settlement verifier · verified fact |
Beneficiary/amount are derived only from authenticated slot/value; any request duplicate is ignored/compared | DEF; SRC-TEMPO covers certificate leg and SRC-CONTRACT is negative contract-layout evidence only; APP-18/API-19/Q4; NOT RUN, BLOCKED-SETTLEMENT |
| INV-SETTLE-05 | 16.2 | makechain-protocol settlement verifier · accepted-asset profile |
Only a deposit of the fixed accepted asset can yield an accepted cumulative | DEF; SRC-CONTRACT shows a contract-layout mismatch only; contract/profile cases; NOT RUN, BLOCKED-SETTLEMENT |
| INV-SETTLE-06 | 16.6 | AE · settlement deadline evaluation | Earlier of local deadline and source-age deadline governs using consensus time | DEF; APP-10, time-boundary property; NOT RUN |
| INV-SETTLE-07 | 16.5 | ST · settlement typed-state contract | State diff contains exactly identity anchor/checkpoint/pause/frontiers and no evidence/history record | DEF; schema/state inspection plus APP-10/18; NOT RUN |
| INV-SETTLE-08 | 16.2 | AE · genesis/import path | Genesis has no ledger; only valid strict-advance import creates/funds one before init | DEF; SRC-CONTRACT is negative contract-layout evidence only; APP-01/18, API-19, Q1; NOT RUN, BLOCKED-SETTLEMENT |
| INV-PROOF-01 | 15.1 | PV · VerifyEvidence |
Altering/removing caller trust while response is fixed never causes success under response-supplied trust | DEF; API-17/20, Q4; NOT RUN |
| INV-PROOF-02 | 15.5 | PV · finality/ancestry verifier | Exact block hash verifies by direct certificate or logarithmic authenticated ancestry from certified descendant | SRC-CW; API-09, Q4/Q5; NOT RUN |
| INV-PROOF-07 | 15.8 | PV/CW · verified fact + freshness policy | Row proof exposes exact cut/coverage; client rejects stale/incomplete authorization and never infers completeness | DEF; API-04–06/12/14; NOT RUN |
| INV-PROOF-03 | 15.6 | PV · release-lineage verifier | Exactly one authenticated predecessor chain and proved schedule state are required, including empty predecessor case | DEF; API-07/09, Q3/Q4; NOT RUN |
| INV-PROOF-04 | 15.2 | PV · VerifyEvidence |
Decoder/profile selected from authenticated header; proof checks both root and count | SRC-CW; API-07/10/13, Q4; NOT RUN |
| INV-PROOF-05 | 15.8 | QP/PV · query with evidence | Query output without independently verified proof never upgrades to consensus fact | DEF; API-11/13/16, Q5; NOT RUN |
| INV-PROOF-06 | 15.4 | Exporter proof serving · live-database read | Concurrent proof serving from the exporter's live databases leaves the serving head's bytes and target unchanged | SRC-CW primitives; Q5 concurrency check; NOT RUN |
| INV-PROOF-08 | 15.9 | PV · publication receipt verifier | Output fields are re-derived from finalized included PUSH and exact occurrence, never summaries/object/leaf equality | SRC-CW BMT; API-07/08/13, Q1/Q4; NOT RUN |
| INV-EVENT-01 | 14.5 | FE/QP · export and consumer cursor | Crash/redelivery produces each logical effect once after EventId dedup and cursor+effects atomicity | DEF; APP-11, Q1 C5–C8/Q5; NOT RUN |
| INV-EVENT-02 | 14.6 | FE · event re-derivation | Replay of same certified inputs yields byte-identical ordered event batch | DEF; APP-11, Q1/Q5; NOT RUN |
| INV-EVENT-03 | 14.6 | FE/PV · export evidence separation | Mutating supplied event list cannot alter any root or verified fact; a store-supplied event list alone is rejected as evidence | DEF; API-11, Q5; NOT RUN |
| INV-GOV-01 | 18.3 | RE · ResolveRules |
Activation result depends only on finalized authenticated schedule and executing parent | DEF; APP-14, Q3; NOT RUN |
| INV-GOV-02 | 13.3 | AE · validator-schedule transition | Model permits one immutable pending entry, pure cancel only, one-way deactivation, permanent key reservation | DEF; Q2 stateful model; NOT RUN |
| INV-GOV-03 | 13.3 | EA/MM · DKG progression/TrackPeerSet |
Departure remains dealer/tracked until excluding reshare certifies; schedule effectiveness is distinct | SRC-CW; Q2; NOT RUN |
| INV-GOV-04 | 13.6 | EA · DKG scheme progression | Every successful reshare verifies same group public key; changed key is rejected as wrong chain/reset | SRC-CW; Q2; NOT RUN |
| INV-GOV-05 | 13.4 | EA · voter provider | Votes use last successful reshare players until new output succeeds, through failure/restart | SRC-CW; Q2; NOT RUN |
| INV-GOV-06 | 13.3 | AE/RE · schedule cancel/ResolveRules |
Cancel accepted through exact allowed boundary and rejected after embedding lock | DEF; APP-14, Q2/Q3 boundary cases; NOT RUN |
| INV-GOV-07 | 18.5 | RE · ResolveRules |
Differential branches prove rules depend only on chain/schedule/effective parent parameters and active_release(h) |
DEF; Q3/property P-REL-01; NOT RUN |
| INV-GOV-08 | 18.3 | AE/RE · release scheduling | Critical releases activate at the first block of an epoch, after the handoff at the boundary, with a two-epoch lead; emergency critical is always rejected | DEF; APP-17, Q3; NOT RUN |
| INV-GOV-09 | 18.6 | RE · activation installer | Installer work is constant-bounded, marker-guarded, one-batch, exactly-once after crash/sync, without historical reinterpretation | DEF; APP-14, Q3 crash cuts; NOT RUN |
| INV-GOV-10 | 18.3 | RE · schedule transition | Activated release never reverts; pending transition only legal cancel/defer and never changes locked critical entry | DEF; APP-14, stateful model/Q3; NOT RUN |
| INV-GOV-11 | 18.8 | EA · startup/readiness | Binary proves support for every genesis-to-active ruleset or remains non-voting/NotServing | DEF; Q3 compatibility manifest; NOT RUN |
| INV-GOV-12 | 18.9 | AE/AF/CW · fixed-profile scheduling checks | Every validator schedule and critical schedule/move/cancel is rejected with no effects in admission/execution/preparation | DEF; APP-17/API-18; NOT RUN |
5. Application scenario matrix
| Scenario | Owner · interface | Acceptance criterion | Evidence / limitation |
|---|---|---|---|
| APP-01 | AE · ExecuteOrderedBlock |
Full funded path succeeds with equal propose/verify/apply outcomes and roots | Q1; NOT RUN, BLOCKED-SETTLEMENT |
| APP-02 | AE/CA · EvaluateCommand/AuthenticateCommand |
Mixed ref ops preserve exact witness order; changed signed name/target rejects | Q4 vectors + executor test; NOT RUN |
| APP-03 | AE · ExecuteOrderedBlock |
Create/delete leaves no ref while gross reservation, fee, lock, and discharge remain exact | Stateful property; NOT RUN |
| APP-04 | AE · EvaluateCommand |
Late CAS failure leaks no state, location, sequence, money, or event | Transactional overlay property; NOT RUN |
| APP-05 | AE · accounting | Two updates compose in overlay and discharge stored, not current, amount | Stateful model; NOT RUN |
| APP-06 | CA/AE · delegated-key transitions | Bulk revoke blocks use; fresh generation works; old deposit discharges once; empty repeat rejects | Stateful model; NOT RUN |
| APP-07 | CA · project authorization | Rejected/accepted role and scoped-key matrix matches specification exactly | Exhaustive role table; NOT RUN |
| APP-08 | AE · project lifecycle | Transfer/reclaim/slug/offer cases preserve incarnations, uniqueness, and replay guards | Stateful model; NOT RUN |
| APP-09 | AE · username lifecycle | Exact deadlines, grace, extension, release, rename, and pointer cleanup match model | Boundary-time model; NOT RUN |
| APP-10 | AE · settlement transitions | Pause/deadline rejects credit and refresh; failed credit cannot refresh state | DEF; negative cases NOT RUN; positive subset BLOCKED-SETTLEMENT |
| APP-11 | EA/ST/FE · verify/apply/recovery/export | Cancellation/restart preserves roots/replay/deposits; C10/C11 admit only the specified bootstrap/durable genesis states and never double-apply genesis; event gaps re-derive exactly | Q1 cuts/Q5; SRC-CW for finalize handle, native initial targets, and genesis handoff; NOT RUN |
| APP-12 | AE/ST · location planning/merkleize | Duplicate commitments retain distinct ordered occurrences and no current-state key | Executor/Q4 proof cases; NOT RUN |
| APP-13 | ST/AE · MerkleizeBlock/witness validation |
Empty block commits once; window-edge proof uses speculative parent ancestry correctly | SRC-CW; deterministic test; NOT RUN |
| APP-14 | RE/EA · installer/recovery | Lock-boundary cancel and crash/sync replay yield exactly-once installer result | Q3; NOT RUN |
| APP-15 | EA · genesis/fixed assembly | Seven nodes derive identical identity/genesis/committee/output/quorum and each share verifies at position; reopened current state matches the exact genesis root/target while both logs remain at native bootstrap size one before Stateful starts | Fixed-profile Q1 C10/C11 harness; SRC-CW for native initial targets and marshal genesis anchor; NOT RUN |
| APP-16 | EA · consensus-context validation | Every nonzero epoch/present DKG field rejects identically; canonical epoch-zero/None succeeds | Fixed-profile negative corpus; NOT RUN |
| APP-17 | AE/AF · profile scheduling | Both validator variants/all critical paths reject without effects; ordinary non-critical path unchanged | Fixed-profile corpus; NOT RUN |
| APP-18 | protocol settlement verifier + AE | Authentic proof funds before init; every named substitute rejects and refresh state is unchanged | Q1/Q4; SRC-CONTRACT; NOT RUN, BLOCKED-SETTLEMENT |
| APP-19 | EA/PV · reset/genesis binding | Every pre-reset chain artifact fails the new chain; old state/credit absent; Tempo fact needs new valid import | Reset differential harness; NOT RUN, BLOCKED-SETTLEMENT for positive reimport |
| APP-20 | CS/EA · genesis decode/context | Both profiles enforce genesis-only matching epoch info; dynamic projects to payload, fixed DKG options remain None | Genesis conformance corpus; NOT RUN |
6. Client/API scenario matrix
The Client workflow rows specify the future reusable Rust module and reference harness. They do not authorize a product SDK, CLI, explorer, website, or consuming application.
| Scenario | Owner · interface | Acceptance criterion | Evidence / limitation |
|---|---|---|---|
| API-01 | CW/CS · PrepareCommand |
Any displayed/action substitution differs from locally rebuilt intent and prevents signing | Reference client corpus; NOT RUN |
| API-02 | CS/CW · canonical name validation | Valid exact bytes remain distinct; invalid UTF-8/control/bounds reject without normalization | Encoding corpus; NOT RUN |
| API-03 | CW/CA · intent journal/authentication | Refreshed evidence/approval subset preserves intent association, changes envelope ID, and either inclusion completes once | Reference journal harness; NOT RUN |
| API-04 | CW · ReconcileIntent |
Lost response plus evicted status stays Unknown until authenticated bounded history; no automatic new sequence | Reference reconciliation model; NOT RUN |
| API-05 | CW · ReconcileIntent |
Higher sequence alone never marks lower chunk complete; complete history is required before retry | Reference reconciliation model; NOT RUN |
| API-06 | CW/PV · reconciliation + proof | Verified original inclusion overrides advisory pool replacement | Reference reconciliation model; NOT RUN |
| API-07 | PV · publication VerifyEvidence |
Every named substitution fails; only re-derived authenticated fields return | Q1/Q4 receipt corpus; SRC-CW; NOT RUN |
| API-08 | PV/QP · receipt verification/projection | Equal commitment at different indices/accounts yields distinct occurrence and row | Receipt/projection model; NOT RUN |
| API-09 | PV · finality/ancestry | Certified descendant plus valid accumulator path verifies absent direct certificate | Q4/Q5; SRC-CW; NOT RUN |
| API-10 | PV · receipt request | Ref-only returns no publication fact; index equal to length rejects | Q4 boundary corpus; NOT RUN |
| API-11 | PV · verified-result typing | Fabricated charge/revision cannot appear as receipt-authenticated output | Type/interface and negative corpus; NOT RUN |
| API-12 | CW · ReconcileIntent |
Any history gap/budget exhaustion remains Unknown and never becomes non-inclusion | Reference reconciliation model; NOT RUN |
| API-13 | PV · membership verification | Valid equal-leaf proof authenticates its own location only, never occurrence linkage | Q4 proof corpus; SRC-CW; NOT RUN |
| API-14 | CW/PV · preparation freshness policy | Stale/absence/service evidence is labeled and cannot authorize signing; supported rules refresh first | Reference client corpus; NOT RUN |
| API-15 | CW · CompletePush |
Storage and chain milestones remain independent; completion requires every configured milestone/chunk | Reference workflow + Q6 adapter; NOT RUN |
| API-16 | PV · evidence typing | mkit attestation cannot become inclusion/time/authorship/correctness proof | External-contract negative case; NOT RUN |
| API-17 | CW/EA/PV · trusted profile comparison | RPC metadata conflicting with caller genesis/authenticated state blocks prepare and verify | Q4/profile corpus; NOT RUN |
| API-18 | CW · PrepareCommand |
Fixed profile refuses disabled schedules before signing and preserves ordinary release checks | Reference client corpus; NOT RUN |
| API-19 | CW/protocol settlement verifier | Authentic Moderato proof prepares import before init; global-issuance/synthetic/wrong identity/slot/beneficiary rejects, no fallback | Q1/Q4; SRC-CONTRACT; NOT RUN, BLOCKED-SETTLEMENT |
| API-20 | CW/PV · trust-partitioned journal/verification | Old-chain journal/artifacts cannot complete new-chain operation; Tempo fact is re-enveloped and fully reverified | Reset reference harness; NOT RUN, BLOCKED-SETTLEMENT for positive reimport |
7. Properties, fuzzing, and security tests
Example-based APP/API scenarios are necessary but do not cover adversarial combinations. The first implementation plan must include the following minimal property/fuzz targets at the owning module interface.
| ID | Target | Generator/action model | Required property and stop condition |
|---|---|---|---|
| P-CODEC-01 | CS DecodeCanonical |
Arbitrary bytes up to each named bound plus truncation/trailing/tag/length/order mutations | Never panic/allocate beyond configured bound; accept iff exact decode and byte-identical re-encode; preserve minimal counterexample |
| P-AUTH-01 | CA AuthenticateCommand |
Structured intents/witness trees/signature variants, depth/count boundaries, field mutations | Accepted witness meets exact authority/threshold/ordering/context; any unauthorized mutation rejects; no stack overflow |
| P-EXEC-01 | AE ExecuteOrderedBlock |
Valid/invalid command sequences over a bounded reference state model | Implementation outcome equals model for records, money, counters, log order, resources, and events |
| P-EXEC-02 | AE EvaluateCommand |
Inject failure after every read/check/staged effect | Any rejection leaves parent overlay and all accumulators byte-identical |
| P-EXEC-03 | AE resource accounting | Values around every integer, byte/work, charge, deposit, and record boundary | Checked arithmetic only; independent dimensions; gross creation never nets deletion |
| P-BOUND-01 | AE access planning | Grow unrelated state while command input stays fixed | Read/write/work cardinality remains within the formula and independent of total state size |
| P-TIME-01 | AE/EA | Vary wall clock/runtime schedule with fixed consensus time, then vary consensus time at every boundary | Wall clock has no validity effect; specified consensus-time boundary changes exactly once |
| P-STATE-01 | AE/ST | Stateful sequences of create/update/delete/reclaim/transfer/name/grant/key/import | All ledger, incarnation, bijection, replay, deposit, and frontier invariants hold after every prefix |
| P-PROOF-01 | PV VerifyEvidence |
Arbitrary bounded proof envelopes and mutations of root/count/index/anchor/lineage/profile | Never panic; success only derives the exact authenticated fact; mutation cannot broaden it |
| P-REL-01 | RE ResolveRules |
Forked parent/schedule graphs with pending ancestors, activation and lock boundaries | Result equals pure reference evaluator; tip/local config/wall clock never affects it |
| P-RECOVER-01 | EA/ST/FE | Seeded crash at C1–C11 and Q2/Q3 cuts with restart/redelivery/identity replacement; C10/C11 record pre-crash, reopened, and adopted targets plus application-transition count | Recovered durable/public state equals one uninterrupted valid prefix; genesis is exact-batch retry from native bootstrap or no-op from the exact durable target, membership/history stay at native bootstrap size one, duplicate genesis never invokes an application transition, and every third state is fatal-local; otherwise explicit fatal/pending, never a vote |
| P-CLIENT-01 | CW ReconcileIntent |
Loss, duplication, reorder, stale status, alternative envelope, bounded history gaps | Never auto-sign/retry unless future impossibility and prior non-inclusion are both established |
Parser fuzzing covers every externally supplied canonical envelope, genesis/release artifact, signature presentation, WebAuthn JSON grammar, Commonware proof wrapper, Tempo account/storage proof, RPC byte wrapper, chainspec, and public network manifest. Seeds include the encoding-owner positive, boundary, and negative corpus. Fuzz findings become permanent regression cases with the exact pin and sanitized input digest.
Security-focused suites additionally cover algorithm/profile confusion, domain/chain/ruleset substitution, high-S and malformed signatures, recursive witness bombs, decompression/length/allocation bombs, duplicate-key JSON, invalid UTF-8, proof count/index mismatch, path/symlink traversal in local artifact tooling, unauthenticated configuration/trust-anchor injection, secret material in logs/run artifacts, queue exhaustion, and cancellation races. Native and wasm run the same portable subset.
7.1 Formal model-checking gates
Use TLA+ and TLC for these bounded state-machine checks. Tools are pinned by digest in
formal/tools/pins.toml (decision D48); models live under formal/tla/ and run with formal/check.sh; TLC is the stable release v1.7.4.
Lean 4 proofs under formal/lean/ complement the bounded search with unbounded results for the
same rules; they are a separate evidence entry and never replace a model gate. Implementation
linkage is trace validation in both directions: model witnesses and counterexamples replayed
against the executor, as this section already required, and, by decisions D48 and D49, executor trace
records (per the trace design record docs/execution/design/vp-02-trace-emission.md, with the
post-state read back from storage) checked against the model by TLC
(formal verification plan). Each model records finite bounds,
symmetry and state constraints, constants, fairness assumptions, model/config/tool hashes, and the
requirements it covers. Safety and liveness are separate checks. Liveness results name the fairness
and environment assumptions that make progress possible; safety may permit a fail-closed halt.
Every campaign includes reachability and nonvacuity checks for its success, rejection, crash, and
recovery paths. An incomplete state-space search, an omitted required path, or an assumption that
asserts the desired invariant is never PASS. A minimized counterexample becomes a permanent
implementation regression case. Qualification also requires a reviewed mapping from model state and
actions to named implementation interfaces, plus representative successful, rejected, and recovery
traces replayed against the real implementation. Record model-search and implementation-linkage
results separately; both must pass. A failure blocks only its dependent claim and reopens the owning
design. A model-search pass proves the declared abstract finite model only: it does not prove Rust code,
Commonware, BFT, cryptography, native/wasm parity, vectors, or Q1–Q6. Implementation and campaign
harness work may proceed while a model is built, but the affected qualification claim waits for the
model gate. These are focused gates, not a blanket pre-code gate.
| ID | Scope, owner, and reviewer | Finite model and required properties | Entry inputs, exit evidence, and milestone |
|---|---|---|---|
MC-01 |
Authority, lifecycle, and accounting. Owner: execution/authentication owner. Reviewer: independent protocol/security reviewer | Bound accounts, keys, generations, records, command sequences, times, and amount/counter values, including maximum-value exhaustion. Preserve sparse expired/raw records. Treat a verified Tempo strict-advance import as a constrained trusted input; this grants no synthetic-positive qualification. Check reject atomicity; no stale authority resurrection; exactly-once discharge to the stored original payer; checked monotone counters reject at exhaustion and never wrap; and checked spent + locked <= credited after every reachable prefix |
Enter with reviewed state/authority transitions, accounting formulas, and finite constants. Exit with full TLC exploration inside the declared bounds, reachability/nonvacuity witnesses, hashes, reviewer verdict, regressions for every counterexample, and reviewed action/trace linkage to IP-04/IP-08. Required before full fixed-application qualification and a shared D0 claim; maps to P-AUTH-01, P-EXEC-01/02/03, and P-STATE-01. It does not block FB-01–12 |
MC-02 |
Genesis and recovery coordination. Owner: state/node/history owner. Reviewer: independent Commonware/operations reviewer | Bound three members, heights/targets, crash cuts, marshal/export progress, and fence states. Model fresh genesis separately from ordinary restart and rebootstrap: native bootstrap retries the exact seed batch; the exact durable genesis target is a no-op; any other fresh-genesis state is fatal-local. Ordinary restart may open later committed targets and must reconcile one agreeing durable certified prefix. Rebootstrap attaches a certified floor and skips local seeding. Check actual-old-process termination and custody/partition handoff assumptions for fencing, plus watermark <= durable complete artifacts. Abstract Commonware only through source-reviewed contracts at v2026.9.0; split independent submodels if the product state explodes |
A planned export installation extension (D50, formal verification plan section 8) adds the exporter's first-installation state sync toward a moving target, the (W, A] coverage rule re-evaluated at every retarget, the standby's release on an observed watermark, and the retained-window stop (R-17.17, R-17.21, R-17.22); it is PLANNED and not written. Enter with operations §2.4/§2.5, C1–C11, Q1/Q5 artifact rules, and the pinned source-contract ledger. Exit with complete bounded safety results, separately stated conditional progress/fairness results, nonvacuity witnesses for all three procedures, hashes, reviewer verdict, regressions, and reviewed action/trace linkage to IP-05/IP-06C/IP-07. Implementation linkage uses the MC-04 event log: VP-07 crash runs are checked as traces against MC02RecoveryNode. Required before persistent Q1-T acceptance and D0, and the installation extension before IP-06C acceptance; it does not replace actual C1–C11, process/filesystem, Commonware, or exporter and store tests |
MC-03 |
Release and validator transitions. Owner: release/dynamic-consensus owner. Reviewer: independent protocol/security reviewer | Bound schedule entries, heights/epochs, rulesets, installers, validator sets, reshare outcomes, restarts, and catch-up. Check exact release and validator cancel/lock cutoffs; selected active rules follow the executing parent; finalized installers apply exactly once; and scheduled membership stays distinct from effective voters until successful reshare. Safety permits halt. Liveness states its progress/fairness/environment assumptions and does not assume every reshare succeeds or every departing validator cooperates | Enter with reviewed release/validator transition tables and fixed/dynamic profile constants. Exit with complete bounded safety results, conditional liveness results, cutoff/restart reachability witnesses, hashes, reviewer verdict, regressions, and reviewed action/trace linkage to IP-04A/IP-10. Dynamic parts are required before relevant Q2/Q3 acceptance and T0. D0 still requires its existing fixed-profile rejection and non-critical release tests, but MC-03 creates no new fixed-model prerequisite |
MC-04 |
Consensus-to-execution lifecycle: Simplex quorum counting, Deferred vote gating, the Stateful verify, apply, lazy-recovery and finalization path, and restart readiness. Owner: node owner. Reviewer: independent Commonware/consensus reviewer |
Bound four validators (f = 1) in a Byzantine-proposer and a crash-only configuration, three heights, four views, and blocks that are valid, command-invalid, canonical-root-invalid with a correct ops target, or ops-invalid, plus pending verification. Check that no invalid block finalizes; equal parent and block give equal verdicts and applied roots; a finalize vote needs a valid verdict and never comes from a pending, invalid, or fatal state; no durable effect precedes finalization; a replay is never a verdict; readiness requires a canonical root match; no vote precedes readiness; a Byzantine uncertified ancestor never makes an honest node fatal; and a finalized winner always reconstructs. Execution is an abstract function; Simplex agreement is a trusted contract, and Simplex beyond it and every Commonware behaviour enter only through cited contracts at v2026.9.0 (formal verification plan section 7) |
Enter with R-12.8 to R-12.29, the SB-14 adapter, and the VP-07 event log. Exit with complete bounded safety results, separately stated conditional liveness, nonvacuity witnesses, every named mutation caught, hashes, reviewer verdict, regressions, and trace linkage through the VP-07 seed sweep. PLANNED (D50) and not written, so no MC-04 claim exists. The bounded safety search (TLC, no linkage) is required before D0 and the trace linkage before T0 (D50); it does not replace the SB-14 negative tests or Q1 |
Crash-cut tests stop processes or abort owned storage handles at named barriers. They may not edit WALs, QMDB state, sync markers, certificates, or DKG journals to manufacture recovery. Each cut is a fresh seeded run and must observe fencing before the identity votes again.
glue::simulate cannot stop a validator at a named barrier. It crashes a validator by aborting its
task at a scheduled time or inside a processed-height window (Crash::DelayRound only delays a validator's start and crashes nothing), and it injects
storage faults (glue/src/simulate/action.rs:9-44, :81-102; glue/src/simulate/team.rs:142-151).
A barrier cut such as C4 is therefore reached in simulation only by a seed sweep over height
windows that records which cut each run hit, and otherwise by the crash-cut tests above or by
runtime storage-fault injection; a simulated run is credited to a cut only when its record shows
the cut. Whether a task abort in the deterministic runtime drops a validator's unsynced writes, as
MC-02 contract K1 permits, is UNVERIFIED. By reading, a blob's unsynced content lives in its
handle until sync copies it into the partition and a dropped handle does not flush
(runtime/src/storage/memory.rs:241-252, :287-306), while the seeded partial-retention crash
model runs only at the whole-runtime crash boundary (runtime/src/deterministic.rs:716-721,
runtime/src/storage/faulty.rs:479-528). VP-07 settles it with a test before any simulated crash
is credited to MC-02 linkage.
8. Dependency pin and update qualification
The baseline itself needs a proof package before code claims compatibility:
- Record exact Rust/Cargo, Commonware crates/versions/checksums, enabled features, target triples, lockfile digest, and all directly used source paths/types.
- Compile the selected primitives on their required native/wasm targets and run the owned expected vectors. Source review alone does not pass this step.
- Run Q1/Q4 subsets sufficient to bind codec, BMT, QMDB, certificate, Stateful/marshal, and profile wiring. Settlement-positive rows remain blocked rather than mocked.
- Store an evidence manifest with reviewer and limitations; until then the baseline is selected and source-reviewed, not qualified.
For every Commonware, Rust, cryptography, proof, database, or canonical dependency update:
- diff old/new upstream sources for codec, proof, crypto, persistence, consensus, marshal, Stateful, DKG, runtime, and feature changes actually in the dependency closure;
- regenerate and byte-compare every affected canonical artifact; run old and new corpora against the candidate and explicitly classify intended incompatibilities;
- rerun affected property/fuzz targets and Q experiments, including crash cuts for persistence or actor changes and Q4 for portable/crypto/codec changes;
- prove a mixed-version rollout only when the release plan allows it; otherwise require a reset or coordinated non-voting boundary and state that consequence;
- update the support matrix, SBOM/provenance, and evidence limitations in the same change.
For a protocol rule, model bound, abstraction mapping, fairness assumption, or relevant source pin change, rerun each affected MC gate or justify reuse per claim through reviewed unchanged-surface evidence. A prior model result is not globally current after its assumptions change.
An update cannot inherit the old PASS merely because public type names compile. Evidence reuse is
per row and justified by an unchanged transitive behavior surface. Commonware remains upstream and
unforked; a required local patch blocks the update until accepted upstream or the architecture is
revised.
9. Gates and implementation order
These gates separate design readiness, runnable devnet, and production qualification. They do not require already-implemented evidence before independent implementation starts.
| Gate | Must be true | Does not require yet |
|---|---|---|
| I0: independent module implementation | Owning RDY schema/bytes/bounds and interface are reviewed; crate edge and error/fault vocabulary fixed; mapped invariant/scenario acceptance is unambiguous; positive external prerequisites may be marked blocked; applicable future MC ownership is visible | Passing MC-01–03 or Q1–Q6, model configuration, cloud topology, product SDK/CLI/site, settlement-contract deployment for unrelated codec/executor/state work |
| I1: integration/harness implementation | I0 for all joined modules; exact Commonware/Rust pins; deterministic seed/time/fault interface; evidence manifest schema; no mocked positive settlement path; model and harness work may proceed together | Completed model runs, public service ingress, production performance, dynamic DKG for fixed-profile harness |
| D0: disposable fixed devnet | Encoding/profile/genesis vectors pass; every application command enabled by the declared fixed-profile ruleset passes its APP/API acceptance rows; MC-01 and MC-02 pass with implementation linkage; the MC-04 safety model passes its bounded TLC search, without implementation linkage (D50); APP-15/16/17/20 and API-17/18 pass; seven shares provisioned/fenced; Q1-D passes and Q1-T passes C1–C11 restart/barriers plus the selected same-region GCS exporter publication and mirror recovery path; authentic Moderato settlement contract/profile/proof enables funding; native proof/receipt Q4 subset passes | Q2 dynamic membership, MC-03, production custody/topology, full product SDK/CLI/explorer/site |
| T0: dynamic qualification testnet after reset | New genesis/chain_id; dynamic MC-03 claims pass; MC-04 passes with trace linkage (D50); Q2 passes including failures/restarts; Q3 active release path passes; Q1/Q4/Q5 rerun under dynamic profile; every enabled APP/API/invariant row has PASS evidence |
Mainnet Tempo proof, final production load/topology values |
| M0: mainnet release candidate | All 71 invariants and APP/API 01–20 have complete applicable PASS evidence (Client workflow may be a reference Rust harness; product SDK packaging is not implied); current applicable MC evidence or reviewed per-claim reuse is complete; Q1–Q6 pass at accepted production profiles/limits; all 17 commands enabled/qualified; reproducible build and independent rebuild agree; recovery/custody/monitoring/security reviews close | None of the launch-critical requirements in this plan |
| M1: mainnet genesis/launch | M0 artifact unchanged; immutable dedicated Tempo Mainnet contract address/code/layout/profile reviewed; authentic Mainnet deposit proof passes production verifier; real DynamicReshareV1 mainnet DKG/genesis ceremony and custody checks complete; genesis/network artifacts independently reproduced and signed; operator fencing/rollback runbook exercised; final owner/independent-review verdict |
Future non-launch product features |
The fixed devnet is disposable and epoch-zero only. Moving to Q2/T0 is an explicit reset with new
genesis and chain_id; it is not an in-place upgrade. A fixed-profile pass cannot satisfy a dynamic
gate. Dev/test Moderato evidence cannot satisfy a Mainnet settlement gate. A production binary may
be promoted unchanged across environments only when it supports the environment's authenticated
profiles and all required gates pass.
10. Result and coverage records
Every run emits the immutable manifest required by operations §5, plus: requirement/scenario IDs; module/interface revision; exact command; host/container/target; toolchain/lock/SBOM digests; source pins; generated/vector/fixture hashes; seed and minimized failing input; topology and fault schedule; per-case outcome; artifact/checksum links; reviewer; and explicit remaining limitation. Secrets and private DKG material are represented only by public identifiers/digests allowed by custody policy. Lean records include the toolchain, the digest of every proof file, and the axiom-audit output. Model records additionally include the exact TLA+/TLC version, specification and configuration hashes, finite bounds and constraints, fairness assumptions, explored-state/completeness result, reachability/nonvacuity witnesses, counterexample-to-regression links, reviewed abstraction/action mapping, and representative implementation trace results. Model search and implementation linkage remain separate evidence entries.
A machine-readable coverage map may be embedded as a fenced YAML or JSON block in this Markdown file
when automation exists; it must be generated from or checked against the tables above and may not
become a second authority. conformance/rule-assurance.toml (VP-09) is that map for the rules
each brief puts in scope: every property: and sim: class of an invariant entry names only
vehicles the invariant's section 4 row names, and xtask coverage-matrix checks that and each
entry's evidence; section 5 is not yet consulted. The local gate (and future hosted CI) fails for
an unknown invariant/scenario, missing owner/interface, missing acceptance criterion, stale
artifact digest, or PASS without a complete manifest.
Current evidence disposition:
- Commonware, Tempo, Constantinople, and the existing settlement-contract sources have been inspected only as cited by the architecture/operations/data-contract documents.
- FB-01–FB-12 provide bounded native/wasm primitive harnesses, canonical scalar/collection source, and a reviewed 100-case primitive corpus. No complete application schema/executor, Q1–Q6 experiment, fuzz campaign, benchmark, reproducible release, devnet, testnet, or mainnet described here exists or has run.
- MC-04 and the MC-02 export installation extension are PLANNED (D50): no model exists.
- MC-01 (slices A, B and C), MC-02, and MC-03 are DRAFT MODEL: bounded safety searches,
witnesses, and mutation campaigns run under the pinned TLC in
formal/, with no reviewer verdict and no implementation linkage, so no MC claim is supported. A trace-validation harness runs in both directions against a reference executor only. Lean proofs of the ledger accounting, release dispatch, and canonical codecs exist underformal/lean/with the same status. - The dedicated immutable beneficiary-cumulative contract profile/deployment and authentic
positive proof do not yet exist in the evidence set. Settlement-positive rows remain
BLOCKED-SETTLEMENT; they are never replaced by genesis credit, a faucet bypass, existing-contract evidence, or a mock.
11. Assurance layers and release qualification
This section holds material formerly stated in the specification and is not normative: it names qualification work, and no item below decides whether a block, a command, or a release is valid. It supports specification chapter 18 (releases and hardforks) and chapter 19 (parameters), whose calibration items are only fixed by a recorded measurement.
Each item is marked new to validation.md or already covered at section N. An item marked as covered is repeated here only by its identifier, not restated.
11.1 The first qualification milestone
The first implementation qualification milestone is a deterministic end-to-end application slice, reached before the broader service surface. Its funded path, Q1, imports credits with a real certified Tempo proof to create the ledger, initializes that funded account, delegates a key, creates a project, publishes a commit, verifies a publication receipt, and restarts through the three-member database set. The ref move, stale CAS, delete and recreate accounting, and authority revocation are carried by APP-03, APP-04, and APP-06 against the same executor, and the milestone is Q1 plus those three rows.
The same rules executor passes propose/verify/apply parity, command rollback, speculative cancellation, and recovery checks.
- Already covered at section 3 (Q1) and section 9 (gate D0), with the crash cuts in section 4 of operations.md.
- Already covered at section 4 for executor parity: INV-CONS-01, INV-CONS-02, INV-CONS-03, and INV-STATE-11; and at section 5 for APP-01 and APP-11.
- Decided, 2026-09-22. Q1 stays the five-command slice of section 4.1 of
operations.md:
IMPORT_CREDITS.Credit,INIT_ACCOUNT,KEY_AUTHORIZE.Authorize,PROJECT_CREATE, andPUSH. The milestone is Q1 plus APP-03, APP-04, and APP-06, which carry the ref move, stale CAS, delete and recreate accounting, and authority revocation. The milestone is reached when the Q1 manifest and those three scenario rows are all recorded; Q1 alone does not reach it, and neither does a scenario row without Q1's persistent path. No transition moves into the Q1 command subset, so the operations crash cuts and the Q1 acceptance criterion are unchanged.
The required scenarios are listed by state-machine.md; retry and proof-substitution scenarios are added by client-api.md. Already covered at section 6 (API-03, API-04, API-07, API-12).
11.2 Profile-scoped qualification
FixedEpochZeroV1 qualification additionally requires:
- byte-identical profile and genesis derivation across all seven validators;
- signer and share validation;
- deterministic rejection of every nonzero-epoch context, every present DKG payload, every validator-schedule variant, and every consensus-critical release path;
- restart and reset-isolation tests.
Its workload, proof, and recovery results do not qualify bootstrap DKG, reshare, epoch or membership transitions, production custody, or the dynamic engine handoff.
Already covered at section 5 (APP-15, APP-16, APP-17, APP-19, APP-20), section 6 (API-17, API-18, API-20), section 4 (INV-CONS-07, INV-CONS-08, INV-GOV-12), and section 9 (gate G4 in architecture.md, gate D0 here).
Mainnet requires separate DynamicReshareV1 evidence for the all-party bootstrap ceremony, repeated
same-set reshare, DkgFailed carry-over, membership changes, boundary restart, late join and state
sync, secret handoff and erasure, and every consensus-critical surface the release intends to
schedule.
Already covered at section 3 (Q2, Q3), section 4 (INV-GOV-03, INV-GOV-04, INV-GOV-05), and section 9 (gates T0 and M1).
Enablement gate for VALIDATOR_SET_SCHEDULE
New to validation.md as a gate. A deterministic simulation of "set change plus DkgFailed
carry-over in the same epoch" is required before the command is enabled on any non-devnet chainspec.
Three properties of the gate are load-bearing and are not satisfied by the rows that resemble it:
- the scenario is combined: one set change and one
DkgFailedcarry-over, in the same epoch, not two separately passing scenarios; - the gate is a precondition for enabling the command, not evidence collected afterwards;
- it binds any non-devnet chainspec, testnet included, not only mainnet.
Section 3 (Q2) exercises a set change and an injected DkgFailed and section 11.3 lists set change
with carry-over as a simulation property, but neither states the conjunction, the epoch scope, or
the enablement precondition. Until the gate is recorded, a testnet chainspec that enables
VALIDATOR_SET_SCHEDULE is outside the qualification plan.
11.3 The six assurance layers
Each layer has an owner and a trigger; a qualification gate that no one owns is not a gate. Owner roles follow the campaign table in implementation-plan.md (external site) section 12.
| Layer | Runs | Owner | Trigger | Status against this document |
|---|---|---|---|---|
| Deterministic simulation | glue::simulate with typed properties for restart, state sync, and set change with carry-over. Two cases exist because ordinary tests cannot reach them: a set change with carry-over, and a reclaim burst against a maximal stale cohort |
Node + history owners (IP-07) | every engine, glue, or storage pin change; before each of D0, T0, and M0 | Partly covered at section 3 (Q1, Q2, Q5) and section 7 (P-RECOVER-01). The named library harness, the typed-property framing, and the reclaim-burst case are new to validation.md |
| Invariant tests | invariants::minifuzz for every rule with combinatorial input, including deposit conservation across delete/recreate cycles, sequence supersession, and witness resolution |
Executor + state owners (IP-04) | every change to a rule in specification chapters 7 to 10 or 16; every executor pull request | Partly covered at section 7 (P-EXEC-03, P-STATE-01, P-AUTH-01). The named harness is new to validation.md |
| Conformance byte vectors | every canonical type and every root | Encoding owner | every canonical type, root, or tag change; every library pin change | Already covered at section 8, step 2, and at gate G1 in architecture.md; the per-root scope is stated more tightly here |
| Fuzzing at decode boundaries | every externally supplied canonical envelope | Encoding owner | continuous in the harness; a new corpus seed for every new envelope | Already covered at section 7 (P-CODEC-01 and the parser-fuzzing paragraph) |
| Unit and integration tests | ordinary per-crate coverage | Each crate owner | every pull request | Already covered at section 2 as the harness contract's floor |
| Qualification gates on the reference validator profile | every calibration item, including the speculative-memory gate of section 11.4 | Protocol owner + operations owner | each calibration item before the milestone that depends on it; every ALPHA pin bump (section 11.5) | Partly covered at section 9 (gate G8). Per-calibration-item gating is new to validation.md |
Two properties hold across the layers:
- Application and engine crates are generic over the runtime, so the same assembled engine runs under production and deterministic runtimes. Already covered at section 2.
- Deposit conservation across delete/recreate cycles is an invariant-test target, not only an example scenario. Already covered at section 4 (INV-STATE-05, INV-STATE-07) and section 5 (APP-03, APP-05); the combinatorial framing is new to validation.md.
11.4 Speculative-memory gate
New to validation.md. The engine is qualified under delayed finalization, repeated view changes, and cancelled verification. The gate accounts for:
- pending merkleized batches across all three members, which glue caps only by branch compatibility and not by count or bytes;
- retained ancestry;
- decoded blocks;
- worker jobs that keep running after their future is dropped, with worker permits charged until the work finishes.
Resource exhaustion produces backpressure or pending work, never an invalidity verdict. The invalidity boundary itself is already covered at section 4 (INV-FAULT-01).
11.5 ALPHA pin-bump re-run set
Every pin bump of an ALPHA dependency re-runs:
- root parity;
- compact-versus-full parity;
- crash and rewind;
- state sync;
- the wasm verifier vectors.
The exoware crates at 2026.9.0 are ALPHA members of this set and carry their own Commonware pins
at 2026.9.0; the simplex crate publishes no status line and is treated as ALPHA with the rest. A
bump of an exoware pin also re-runs the Q5 checker and the store rebuild from the mirror, because
the store's persisted node layout is what those two items exercise.
Partly covered at section 8, whose dependency-update rules already require regenerated canonical artifacts, affected property and fuzz targets, crash cuts for persistence or actor changes, and Q4 for portable, crypto, or codec changes. The five-item set as the named minimum for an ALPHA bump is new to validation.md, as is its coupling to step 1.4 of release-process.md: a Commonware pin bump inside a release re-runs this set.
The ALPHA members are listed in the primitive map in section 10 of architecture.md.
11.6 Release assurance additions
These run in addition to sections 11.3 through 11.5, once per release.
| Item | What it asserts | Status |
|---|---|---|
| Two-sided conformance vectors | Every canonical type, root, and proof is produced under the old ruleset at heights before activation and under the new ruleset at and after it. A format-preserving or versioned-state release reproduces the old vectors byte for byte | Partly covered at section 8 (byte-compare of affected canonical artifacts). The two-sidedness across the activation height is new to validation.md |
| Per-ruleset behaviour matrix | Every rule the release touches runs under each ruleset it exists in, and the difference is exactly the declared one | New to validation.md |
| Installer idempotence test | The activation installer executes twice and produces one set of writes | Already covered at section 4 (INV-GOV-09) and section 5 (APP-14) |
| Activation-crossing simulation | The deterministic simulation gate crosses the activation height with a mid-window restart and state sync | Already covered at section 3 (Q3), which crosses the activation height with restart and catch-up. The mid-window state-sync requirement is new to validation.md |
| Schedule-table conformance test | The client crate's schedule table is pinned to the chain's | New to validation.md |
| Peer-range handshake test | The p2p handshake's supported-ruleset range behaves as declared | New to validation.md |
Regenerating a vector is an explicit format approval carrying a breaking-format label on the
change, never a way to make a test pass. Already covered at section 8, which forbids inheriting a
prior PASS on a changed behavior surface.
Two different class checks exist and only one decides validity.
- The structural check is R-18.3 over the descriptor's own manifest: the declared class admits
every declared surface,
consensus_criticalis set exactly when a consensus-critical surface is declared, and the ruleset identity conditions hold. Every validator runs it under the current rules, and specification section 18.2 makes it the whole of the class check insideSCHEDULE_RELEASEvalidity. It stays in the specification, and a descriptor it rejects cannot be scheduled. - The conformance-based check derives the class and the flag from the conformance run of the release process step 1.4 and compares them with the declaration. It is governance tooling and a qualification gate, never a validity rule, because a validator whose binary lacks the ruleset cannot run the conformance corpus that the derivation needs. Its two obligations, that the shipped code matches its manifest and that a release stays inside its class, are recorded here and in release process section 1.2.
11.7 Proof-path hash re-measurement
Tracked as SB-15 in implementation-second-batch.md (external site), in two
parts.
The microbenchmark runs beside SB-16 and waits on nothing: it merkleizes QMDB current and
keyless batches under Keccak256, SHA-256, and BLAKE3 and reports hash calls and time per tree. The
sizes are the medium and high bands of section 4.1 of
operating-envelope.md, 16.7 and 100 distinct PUSH per second at 8 and 16
mean commitments per PUSH, which remain synthetic planning bands rather than a forecast. Its Keccak256 is Makechain's own Hasher implementation against the pinned
library trait, follow-up F13, so the measurement needs neither a library release nor a pin move; a
main-branch pin would split the dependency graph from exoware 2026.9.0 and is excluded for that
reason.
The whole-block measurement runs at SB-13, where a real MerkleizeBlock exists:
- re-run the storage, history, and command-root probes;
- measure merkleization throughput of the three databases and the command root at the target throughput under each candidate hash, reported per tree: hash calls per block and merkleization time for the validity state, the membership log, the block-history accumulator, and the command root separately.
Acceptance is per tree against the round budget with the stated margin. The recorded outcome selects
one of the four options of SB-15's decision point (all Keccak256, BLAKE3 for the validity state
only, SHA-256 across the proof path, or all BLAKE3), and that selection is an owner decision, F11,
recorded in the decision register before the first non-disposable genesis. SHA-256 is a genuine
option rather than a formality: it is in the pinned tag at BETA, the EVM has a precompile for it,
and the library's Solidity MMR, keyless-MMR, and BMT verifiers ship SHA-256 variants.
The proof-path hash choice is final only when that measurement passes, so no conformance claim that depends on the proof-path hash is complete before it is recorded. The measurement is a calibration item in the specification's parameter chapter; no target value is stated here.
The affected rows are the proof-path members and the command root in the primitive map in section 10 of architecture.md.
11.8 Application conformance coverage
The application conformance program covers the following transitions. Per-variant read, write, and resource bounds live in state-machine.md, and each transition carries the relevant invariant identifiers.
| Transition group | Existing coverage |
|---|---|
| Capability and role intersection, maintainer escalation attempts, freeze and unfreeze permissions, scoped keys rejected for other projects, administrative commands, reclaim, and account-wide social messages | Section 4 (INV-AUTH-08, INV-STATE-09), section 5 (APP-07) |
| Bulk revocation followed by a same-block key use, reclaim, or reauthorization; renewal at exact expiry and validity-window boundaries; reauthorization with a new generation; preservation of root replay state and allocation counters; repeated empty bulk revocations; old social receipts versus new submissions | Section 4 (INV-AUTH-03, INV-AUTH-07, INV-AUTH-09), section 5 (APP-06) |
| Role invalidation across transfers where grant and control counters differ widely, including transfer back to the original controller and reclaim of a superseded grant | Section 4 (INV-AUTH-04, INV-STATE-09), section 5 (APP-08) |
Every deposit transition, including multiple refunds to the signer or another payer, price changes, replacement, same-command delete/recreate, and a late failure that rolls back the entire candidate; gross max_charge and new_records never net refunds or deletes |
Section 4 (INV-STATE-05, INV-STATE-07, INV-CONS-03), section 5 (APP-03, APP-04, APP-05), section 7 (P-EXEC-02, P-EXEC-03) |
| Slug collision on rename or transfer, description-only updates, and the one-project/one-claim invariant; username extension versus owner restoration, exact grace boundaries, cross-owner incarnation reuse attempts, release and claim cooldown bypass, and cleanup preserving a newer pointer | Section 4 (INV-STATE-10, INV-AUTH-05, INV-AUTH-10), section 5 (APP-08, APP-09) |
| Reordered, missing, duplicated, and superseded push chunks; parent-counter conflicts; intent status across witness replacement; multiple same-block commands reading and updating one ledger, key, role, or ref through staged read expansion | Section 4 (INV-MEMBER-07, INV-STATE-11), section 6 (API-03, API-05), section 7 (P-CLIENT-01) |
| Propose/verify/apply parity, including discarded candidates, speculative-branch cancellation, restart, state sync, canonical current roots, and one commit per member per block | Section 4 (INV-CONS-01, INV-CONS-02, INV-MEMBER-06), section 5 (APP-11, APP-13) |
Signed ref-name and display agreement and distinct name bytes; witness count and order with mixed CREATE, SET, and DELETE; publication receipts with substituted actors, indices, headers, counts, and envelopes; duplicate publications preserved; object-author claims never inferred from publishers |
Section 5 (APP-02, APP-12), section 6 (API-02, API-07, API-08, API-10, API-16) |
| Lost responses after finalization, finite status retention, witness replacement, and sequence overtaking; uncertain inclusion never triggering an automatic retry under a fresh sequence | Section 6 (API-04, API-05, API-06, API-12), section 7 (P-CLIENT-01) |
The coverage above is a mapping, not a new claim: every executable row it names keeps the status recorded in sections 3 through 7.
11.9 Key-family freeze gate
New to validation.md. Signer-generated vectors from real tools and authenticators, including negative origin, challenge, flag, and malformed-signature cases, are required before any key family is frozen.
The gate covers the families verified with external standard verifiers: SSHSIG, WebAuthn, and P256-direct. It is separate from, and stricter than, the requirement that native and wasm verification agree on every vector, which section 3 (Q4) already covers and which says nothing about real authenticators or negative cases. Section 7 already covers WebAuthn grammar fuzzing and malformed-signature cases as adversarial input; the addition here is that a family may not be frozen until the signer-generated corpus, including its negative cases, passes.
11.10 Genesis path qualification
New to validation.md. Genesis and header reproduction vectors, plus crash-cut vectors, must qualify the genesis seeding path.
The path has no block to re-execute against, so no propose/verify/apply parity run covers it. Calling ordinary block execution on genesis would incorrectly append extra log commits, which is why the path is seeded separately and why its own vectors are the only stated check that an implementation reproduces genesis correctly.
Partly covered at section 5 (APP-15, APP-11 for C10 and C11) and at section 4 of operations.md, whose cuts C10 and C11 exercise the durable genesis target. The vector requirement itself, covering genesis and header reproduction rather than restart behaviour, is new here.
11.11 Settlement profile completeness gate
New to validation.md. No network may claim a complete settlement profile, or run the positive funded qualification slice, until the deployment inputs are fixed and a compatible deployment exists.
The deployment inputs are compiler artifacts, runtime code hashes, deployment addresses and checkpoints, and fixture-qualified proof bounds. The settlement interface's provisional devnet bounds are not measured limits and are not a mainnet calibration.
Section 3 and section 10 already mark every settlement-positive row BLOCKED-SETTLEMENT, and
section 7 of operations.md records QP-1 as the external prerequisite. What is new
is the completeness predicate: BLOCKED-SETTLEMENT states that authentic evidence is missing, while
this gate states when a profile may be called complete at all.
11.12 Separately qualified cost items
Five cost behaviours are named as their own qualification items because no scenario row covers them.
| Item | What is qualified | Status |
|---|---|---|
| Index-bucket collision behaviour | State keys are 32-byte digests, which spreads keys uniformly across index buckets. Collisions still occur at any finite prefix width and cost extra candidate reads, and the validator profile is qualified under collision-heavy workloads | New to validation.md |
| Exporter publish lag | The distance between the exporter's finalized height and the position acknowledged by both the store and the mirror, together with the local queue depth and disk footprint that lag implies, measured under the accepted block mix and under an induced store or mirror outage | New to validation.md |
| Proof-service ingestion lag | The distance between the published height and the size at which the store answers membership and ancestry proofs, expressed as a fraction of membership_window, with the alerting threshold and the exporter live-proof fallback below the window |
New to validation.md |
| Store rebuild from the mirror | Time and cost to rebuild the exoware-sql store's block-projected history tables into a new schema prefix by replaying the mirror's per-block objects to the current height, including the checker running over the replayed range; the ingestion prefix is rebuilt separately by re-fetching objects and messages and is not part of this equality. The store software ships no replication, snapshot, or backup, so this replay and the operator's own disk snapshots of the RocksDB volume are the whole restore story | New to validation.md |
| Replay qualification job | Wall-clock cost and resource envelope of re-executing the stored blocks from genesis under every activated ruleset, which sets the cadence at which the job can run | New to validation.md |
The index-bucket item is measured on the reference validator profile under section 11.3's qualification layer; the four publication and history items are measured on the exporter and store profile under the same layer. The derived sizing figures they attach to are in section 8.5 of operations.md; no such figure is a measurement, and none is normative until a gate records a measured value.