Canonical data-contract ownership and freeze plan

Draft protocolSource at 169cbd2 ↗Source SHA-256 adb61aa…f57

Status: reviewed engineering design, 2026-09-19; bytes not frozen; executable conformance not run. This document assigns authority and freeze gates for the canonical contracts. The encoding contract supplies the revision-1 primitive widths, tags, field order, wrappers, state schemas, named bounds, and vector design. This file records the selected engineering design. It does not claim an accepted release, calibrated values, generated fixtures, or executable conformance.

1. Authority and status

Label Meaning
Fixed Normative semantics already selected in spec/SPECIFICATION.md or an accepted architecture decision.
Proposed Selected revision-1 engineering design awaiting implementation and executable conformance, not another product decision.
Calibration A bounded value required by decoding or resource control whose number is deliberately unset pending workload measurement and qualification.
Required A contract must exist before the dependent work can qualify, but its exact reviewed value or artifact is not yet fixed.

The authority order is: normative specification and accepted decisions; the reviewed encoding contract; canonical Rust schema and release types as executable authority; the versioned format manifest as a record of revision, tags, domains, pins, and artifact digests; reviewed conformance vectors; implementation consumers. Commonware v2026.9.0 (d476a2361ce6840d2b9d0aa6fb30a924429046d4) is the Makechain library baseline. Working HEAD 3827a56dc76818bd31c42c2d6b8c7da261123f2a is research input only: codec, Merkle, BMT, and QMDB have material changes after the pin, so HEAD must never silently define bytes.

The encoding contract owns every approved field sequence, primitive width, collection bound, enum tag, domain prefix, library type and pin, profile identifier, and schema version. Canonical Rust types implement that contract. The format manifest records the selected identifiers and artifact digests; it is not a schema DSL and does not generate Rust. Transport schemas, SDK metadata, wasm bindings, and documentation are generated from the Rust registry and checked against reviewed vectors; none maintains a parallel registry.

2. Encoding foundation

ID Status Contract or required decision Owner/source
FMT-001 Fixed Canonical bytes are byte-equal to the pinned commonware-codec subset: big-endian fixed integers, shortest-form counted lengths, one-byte booleans/options/enum tags, strictly increasing sets/maps, exact consumption, and re-encode equality. Spec §6.1; format manifest
FMT-002 Proposed Use the explicit widths in encoding §1: semantic counters/times/heights are fixed u64, BMT indices are fixed u32, and every monetary value is fixed 32-byte big-endian Amount256. Commonware usize appears only as collection framing. Encoding §1
FMT-003 Proposed Use pinned codec collection framing only through a bounded schema type. Record both semantic cardinality and decode range; never infer a consensus bound from available memory or a container implementation. Format manifest + ruleset limits
FMT-004 Fixed Decoding consumes the complete byte slice. Reject trailing bytes, invalid booleans, unknown tags, nonminimal varints, duplicate/non-increasing set or map members, and lengths outside the supplied decode configuration. Pinned codec behavior
FMT-005 Proposed Adopt the explicit tag registry and field tables in encoding §§2–10; retain removed tags as reserved. Do not use source-language enum order, serde layout, protobuf numbering, or RPC JSON order. Encoding §§2–10
FMT-006 Fixed Transport JSON/protobuf is never signed or hashed. It carries canonical byte strings plus derived display fields; verifiers decode the canonical bytes and compare any duplicate display field. Spec §6.1; client API
FMT-007 Calibration Encoding §13, the bound registry, names every required typed maximum and the deterministic aggregate validation rules. Numeric values come from the active rules/profile and qualification report, not local service defaults. Encoding §13; ruleset/limits manifest
FMT-008 Proposed Each canonical top-level type declares a schema ID and schema revision. Selection is authenticated by chain/profile/ruleset context; decoders do not sniff versions from untrusted trailing or optional fields. Release manifest

Pinned source evidence matters here: commonware-codec offers fixed-width integer primitives and separate varint wrappers; it does not choose the representation for a Makechain field. Its usize wire form is varuint restricted to u32, which is useful evidence for collection framing but is not a protocol field type. The companion encoding prose and vectors must make these choices reproducible without Rust. At v2026.9.0, the exact evidence is in codec/src/lib.rs (configured read and exact-consumption decode), codec/src/types/primitives.rs (big-endian primitives, bounded usize, booleans), codec/src/varint.rs (shortest-form unsigned and ZigZag varints), and codec/src/types/vec.rs (counted, configured vectors).

3. Canonical artifact inventory

ID Status Canonical artifact Revision-1 contract and remaining evidence
SCH-001 Fixed GenesisChainSpec Encoding §7 fixes the proposed outer order and nested catalogs. It excludes chain_id, production DKG output, private shares, and genesis credit allocations. Numeric calibration and native DKG byte vectors remain open.
SCH-002 Fixed Genesis block / trust anchor Encoding §§7 and 9 fix the Header/Body order, timestamp/base values, native bootstrap targets, bounded state seed, and profile wrappers. Published genesis adds the dynamic ceremony output/EpochInfo or reproduces the fixed-profile artifact. Trust anchor is chain_id plus genesis block. Native byte vectors remain a qualification gate.
SCH-003 Fixed Development profile descriptor Encoding §§2 and 7 allocate separate profile tags and native public wrappers. Fixed means seven, epoch zero, constant signing provider, and pre-generated test threshold output. Secret shares remain out of genesis.
SCH-004 Fixed CommandIntent Encoding §3.1 fixes chain_id, envelope version, ruleset, price schedule, tagged account/permissionless/governance authority, and tagged payload. Account replay/charge fields live only in the account branch; system commands use no sentinels.
SCH-005 Fixed SignedCommand Encoding §§3–5 fix intent, authorization, and unsigned evidence order plus their allowed cross-product. command_id covers the complete envelope; alternative sufficient root witnesses remain distinct.
SCH-006 Fixed Header Encoding §§7 and 9 fix field order, widths, option tags, MMR/Keccak256 target instantiations (the proof path of specification section 6.2), command count/root, and genesis/DKG commitments.
SCH-007 Fixed Body Encoding §7 fixes ordered commands and genesis/DKG option order. Finalization remains outside body/header; profile rules reject forbidden presence.
SCH-008 Fixed Release artifacts Encoding §§6 and 8 fix descriptor, immutable schedule entries, activation marker, schedule state, typed deltas, installers, governance set, price/work tables, and scheme registry.
SCH-009 Fixed State records Fifteen named validity-state families in §5 below, with family-specific value schemas and complete identities. Values carry their identity; every write checks key/identity equality.
SCH-010 Fixed Proof and receipt envelopes Typed proof inputs, authenticated anchor/header, exact library proof, release lineage, and claimed position/count. A publication receipt composes proofs and is not a new consensus primitive.

state_root is Makechain's canonical current-state commitment. state_target {ops_root,floor,size} is the Commonware persistence/sync target and is not interchangeable with it. Likewise, membership_target {root,floor,size} and history_target {root,size} are distinct authenticated member targets. Implementations must not flatten these into an undifferentiated root tuple.

4. Commands and witness placement

Encoding §§2–5 allocate every command and subvariant tag, payload field order, authorization class, and evidence placement. The Rust registry adds the collection-bound and resource-shape references and links positive and negative fixtures.

ID Command Required variant coverage
CMD-01 INIT_ACCOUNT Single-key and configured genesis witness; account must first be funded by a valid IMPORT_CREDITS.
CMD-02 ROOT_CONFIGURE First configuration and subsequent quorum reconfiguration; recursive owner witness.
CMD-03 KEY_AUTHORIZE Authorize and Renew; family policy, project scope, validity window and expected predecessor.
CMD-04 KEY_REVOKE One and All, including expected generation/delegation epoch and revision guards.
CMD-05 PROJECT_CREATE Scheme, project identity/allocation inputs, optional asserted origin.
CMD-06 PROJECT_SET_METADATA Slug and description updates with expected counters/revisions.
CMD-07 PROJECT_SET_STATUS ACTIVE/FROZEN and lifecycle guard.
CMD-08 ROLE_SET Grant/revoke, grantee, role and generation guards.
CMD-09 TRANSFER_OFFER Set/update/replace/clear variants and destination/expiry/revision guards.
CMD-10 TRANSFER_ACCEPT Exact pending offer and destination acceptance guards.
CMD-11 PUSH Ordered commitments and ordered ref operations; CREATE/SET/DELETE; exact witness mapping.
CMD-12 RECLAIM Every reclaimable family and expected stale predicate.
CMD-13 USERNAME_CLAIM Claim, extend, restore and atomic rename.
CMD-14 USERNAME_RELEASE Expected lease/name state.
CMD-15 IMPORT_CREDITS Credit with external proof, including first-ledger creation, and Refresh with newer certified header.
CMD-16 SCHEDULE_RELEASE Activate, defer, cancel and emergency-activate; parameter and consensus-critical releases.
CMD-17 VALIDATOR_SET_SCHEDULE Append and cancel; participant/directory/key-possession fields.

For PUSH, the signed intent owns project ID, commitments, ref names, expected revisions, and targets. Exactly one unsigned membership witness accompanies each non-delete ref operation in ref operation order; DELETE has none. Witness variants are SameCommand(index), Location(loc), and Proof(anchor_size,loc,inclusion_proof). A gateway may replace only this evidence within signed resource/charge bounds. Replacement preserves intent_digest and changes command_id.

Authorization witnesses and signatures also live outside CommandIntent, but bind its digest using their family profile. Different sufficient root approval subsets are valid different envelopes. The encoding contract and canonical Rust registry specify the SignedCommand split directly, rather than infer signed versus unsigned fields from a UI or RPC request.

In the fixed development profile, CMD-17 and consensus-critical transitions of CMD-16 are unavailable and deterministically rejected at admission and execution. Their canonical schemas and reserved tags still exist so the development profile cannot reinterpret those bytes. Encoding §2 fixes their revision-1 numeric tags. Neither a local feature flag nor a successful no-op can waive these rules.

5. State identity and value contracts

ID Status Contract
STA-001 Fixed State key is exactly 32-byte BLAKE3(family_domain || canonical(full_identity)); no truncation. Each family domain and identity schema must be registered.
STA-002 Fixed Value repeats the complete identity, not merely its digest. Decode and write reject an identity whose recomputed key differs.
STA-003 Proposed Each value begins with a contract-owned record schema revision only if the active ruleset permits more than one live representation. Otherwise the ruleset fixes one shape and no redundant in-band version is added.
STA-004 Fixed Deposited records include immutable deposit_payer and deposit_paid; active/expired/deactivated semantics remain family fields, not codec defaults.
STA-005 Fixed QMDB operation, target, root and proof encodings are pinned Commonware contracts. Do not wrap them in an alternative generic database format or substitute working-HEAD types.

The required families are AccountLedger, AccountRoot, DelegatedKey, Project, ProjectMetadata, SlugClaim, ProjectRole, TransferOffer, Ref, UsernameLease, AccountUsername, SettlementAnchor, ProtocolReleaseEntry, ProtocolScheduleState, and ValidatorScheduleEntry—fifteen families. Encoding §6 defines each domain prefix, full identity field sequence, value field sequence, schema selection rule, and record class. The Rust registry binds each to its named maximum and command ownership. ProjectMetadata and Project, for example, remain separate keys even though both use project identity.

6. Digest and domain registry

ID Status Digest contract
DOM-001 Fixed chain_id = BLAKE3("makechain.chainspec" || canonical(GenesisChainSpec)).
DOM-002 Fixed intent_digest = BLAKE3("makechain.command" || canonical(CommandIntent)).
DOM-003 Fixed command_id = BLAKE3("makechain.command-envelope" || canonical(SignedCommand)).
DOM-004 Fixed block_hash = Keccak256("makechain.block-header" || canonical(Header)), the first step of the proof path.
DOM-005 Fixed Root authorization node binds parent digest, account and fixed-width configuration version under makechain.root-authorization.
DOM-006 Fixed Ref-name digest uses makechain.ref-name plus the canonical bounded UTF-8 name. Membership leaf is Keccak256(project_id || scheme_id || native_id), which is on the proof path and binds the object identity directly, so a Keccak-only verifier needs no BLAKE3 step to connect a native id to the leaf. commitment_id stays the BLAKE3 identity everywhere else.
DOM-007 Proposed Encoding §§6, 8, and 11 register the state, release, schedule, scheme, effective-parameter, root-slot, event, and body-artifact digest domains. The Rust registry is the only code location for these literals.
DOM-008 Fixed exception Tempo-compatible configured-account derivation and configuration commitment use the pinned Keccak formulas. P256 and external signature profiles retain their specified SHA-256/EIP-712 steps. They are not entries in the BLAKE3 registry.

The registry records ASCII bytes, preimage schema ID/revision, hash algorithm, digest width, and first release/profile. A vector must distinguish concatenation boundaries through the canonical preimage schema; prose such as A || B is insufficient when either side is variable length.

7. Block members and proof contracts

ID Status Contract
PRF-001 Fixed command_root is the pinned Commonware BMT, instantiated with Keccak256, over the block's commands in execution order, each leaf being Keccak256(canonical SignedCommand bytes). Leaves are position-hashed; final root binds leaf count. command_id remains the BLAKE3 envelope identity and is not the leaf.
PRF-002 Proposed Encode command_count and command_index as explicit u32, matching the BMT count/position domain. Valid positions are < command_count; keep 0xffffffff only for the separate derived-event sentinel already specified.
PRF-003 Fixed The pinned BMT permits at most u32::MAX leaves, hence at most u32::MAX - 1 as a position and 32 sibling levels. Empty-tree root is the library root for count zero and has no valid inclusion proof. These facts come from storage/src/bmt/mod.rs at v2026.9.0 (proof/count limit, builder position, and empty-tree construction).
PRF-004 Fixed A command proof verifies the leaf recomputed from the exact canonical envelope bytes, zero-based position, proof leaf count equal to authenticated header.command_count, and root equal to header.command_root. A verifier that also correlates by identity recomputes the BLAKE3 command_id separately.
PRF-005 Fixed Membership and history proofs construct the exact native fixed-keyless Operation::Append(application_leaf) before verification and bind exact location, target size/root, and floor. Verifying the raw 32-byte application leaf is invalid.
PRF-006 Fixed Current-state proof includes the typed family identity, family value, and activeness under authenticated state_root; the verifier derives the exact key and native Operation::Update. Unordered QMDB provides no general absence proof.
PRF-007 Fixed Finality binds the native proposal payload and round to the supplied header. Descendant finality also binds the ancestor height, derived history location, exact history leaf, and descendant target. Release lineage independently proves its schedule singleton and each required entry.
PRF-008 Fixed PublicationReceipt additionally checks zero-based commitment index within authenticated PUSH.commitments. Claimed actor/project/commitment/sequence are derived from bytes, not trusted duplicate fields.

Proof serialization uses the exact pinned native Commonware proof codec and its configured item, cardinality, and aggregate byte bounds. Makechain owns the enclosing proof kind, anchor and context, not a rewritten sibling path. Vectors must cover library empty root, one leaf, odd-leaf duplication, multiple counts, boundary positions, wrong count/index, reordered/extra/missing siblings, and exact decode/re-encode bytes.

8. Signature and external-format profiles

ID Status Profile contract
SIG-001 Fixed Consensus/DKG uses pinned Commonware BLS12-381 types and chain-derived namespaces. Certificate bytes and verification inputs are named library types in the manifest.
SIG-002 Fixed secp256k1 root: r || s || v, low-S, Ethereum address derivation and exact EIP-712 fields rebuilt from the decoded intent/node.
SIG-003 Fixed Ed25519 command signatures use the pinned SSHSIG presentation and namespace makechain.command:<chain_id_hex>; verifier reconstructs the outer framing.
SIG-004 Fixed P256 direct signs SHA-256("makechain.p256" || d) as r || s, low-S, where d is intent_digest for a delegated signer and the bound node_digest for a root owner. Exact delegated/root preimage and signature-byte fixtures remain required; no normalization beyond the specified low-S rule is inferred.
SIG-005 Fixed WebAuthn verifies exact received clientDataJSON bytes with bounded duplicate-rejecting grammar, origin, RP ID hash, UP/UV policy and low-S P256. Its challenge is intent_digest for a delegated signer and the bound node_digest for a root owner. It never reserializes JSON; both preimage paths require explicit fixtures.
SIG-006 Fixed Root witnesses preserve owner order, unique approvals, threshold-crossing last approval, and bounded recursion. Alternative sufficient subsets remain distinct envelopes.
SIG-007 Required Pin each external standard text/library version and real-tool fixture provenance separately from Commonware. Native and wasm must accept and reject the same vectors.

Tempo settlement evidence has its own profile ID and source pin. It must not inherit Makechain's Commonware pin merely because selected certificate/proposal/round/signature bytes currently match. The Moderato fixture must decode, re-encode identically, and verify under both the current Tempo profile and a proposed target before a pin change. No in-band version sniffing or current Tempo HEAD may select a certificate decoder.

The settlement-source profile is also canonical data. It binds the Tempo chain ID, settlement contract address, pinned immutable runtime code identity, beneficiary storage-slot derivation, value width, contract-state layout/version, state-root/account/storage-proof semantics, accepted asset policy, Tempo threshold public identity, certificate profile, and evidence timing bounds. The accepted launch contract is non-proxy with immutable logic; its account proof must match the pinned runtime code hash. No implementation-slot proof or upgradeable fallback is admitted. Dedicated deployments are selected for Moderato and mainnet, leaving the existing deployment intact. The settlement interface fixes the engineering layout and proof inputs; its numeric proof bounds remain provisional, while exact runtime bytes/hash and deployment inputs remain to freeze.

No environment has precredited accounts. Devnets and qualification testnets import credits only from real Tempo Moderato proofs; mainnet uses the reviewed Tempo mainnet profile. The existing StorageRelay.sol at contract repository commit 13945e9 is not compatible as-is: it proves one global issuedUnits, emits per-rent data rather than storing a monotonic cumulative per beneficiary, contains an operator credit path, permits payment-token replacement, and is UUPS upgradeable. Its receipt/log replay scheme is not the required settlement state proof. The reference codebase's separate crates/makechain-tempo-proof/src/lib.rs may be reference material only for the Tempo certificate/header leg; it does not make the existing receipt proof leg compatible. No fixture may fabricate a positive proof from that incompatible layout.

9. Executable authority and fixture program

Canonical Rust schema and release modules should provide or generate:

  1. Canonical types/codecs, domain constants, discriminants, and decode configurations that directly implement the reviewed encoding contract.
  2. The native reference encoder/verifier and the same Rust verifier compiled to wasm.
  3. Human-readable encoding tables, transport bindings, and machine-readable SDK metadata generated from the canonical Rust registry.
  4. RPC byte wrappers and display schemas, without making RPC JSON canonical.
  5. Positive, boundary, cross-release/profile, and negative fixture manifests.

TypeScript may provide ergonomic builders and decoded views, but signing and proof verification use the native/wasm Rust contract rather than a hand-copied canonical codec. A format release is accepted only when derived outputs are reproducible and native/wasm bytes, hashes, verification results, and error categories agree.

Before canonical serialization is frozen, a fixture file may use this noncanonical semantic envelope:

FixtureCase {
  fixture_id, contract_id, schema_revision, profile_id, ruleset_id,
  source_pins, semantic_input, expected_canonical_hex?, expected_digests?,
  expected_result {accept | reject(error_class)}, negative_mutation?, notes
}

This JSON/YAML test-data envelope is never signed or hashed. Numeric semantic values use decimal strings where host JSON ranges differ; bytes use lowercase even-length hex. A missing expected byte field means the wire contract is unresolved, not that empty bytes are expected. Once frozen, every accepted vector includes canonical bytes and decode/re-encode equality.

Required negative families are: truncation/trailing bytes; invalid bool/tag/option; nonminimal or overflowing integer/length; excess nesting/count/bytes/work; non-increasing or duplicate ordered members; wrong domain/chain/profile/ruleset; state key/identity mismatch; malformed/high-S or wrong signature presentation; WebAuthn reserialization/origin/challenge/flag errors; witness count/order or target mismatch; missing/mismatched genesis epoch-info/hash pairs, post-genesis presence, and wrong dynamic-genesis Payload::EpochInfo projection; BMT count/index/sibling errors; target/root mismatch; certificate under the wrong pin; proof/service-outcome confusion; fixed-profile epoch other than zero; and profile-disabled membership or consensus-critical release commands.

10. Contract-freeze and qualification matrix

ID Stage Required result Recommendation / acceptance evidence
RDY-01 Contract freeze Exact field order and primitive width for every schema in SCH-001–SCH-010 and CMD-01–CMD-17. Encoding §§1–10 are the proposed normative contract; implement them in canonical Rust and record their revision/digests in the format manifest.
RDY-02 Contract freeze Every enum/variant discriminant and retired/reserved range. Encoding §2 is the explicit stable registry; never use declaration order.
RDY-03 Contract freeze Every bounded decode configuration and aggregate limit. Name all bounds; calibration numbers need workload qualification before their dependent profile freezes.
RDY-04 Contract freeze Full BLAKE3 domain registry and unambiguous preimage schemas. Encoding contract plus canonical Rust registry and expected digest cases.
RDY-05 Contract freeze Fifteen state-family identities, values, domains and schema-selection rules. Encoding §6 plus expected key/value cases.
RDY-06 Contract freeze Exact Commonware target/proof/certificate type paths and codecs at the pin. Record source path, crate/version, type and expected library-envelope cases.
RDY-07 Contract freeze Development-profile discriminator, genesis fields, fixed output representation, epoch constraints and disabled transitions. Separate chain identity; reject disabled transitions; never encode secret shares in genesis.
RDY-08 Contract freeze Production dynamic-profile genesis/DKG and cross-profile reset cases. A new chain_id invalidates pre-reset chain intents, envelopes, certificates and state proofs. A still-qualifying external Tempo proof may be imported anew under a new-chain command envelope and the new chain's settlement profile.
RDY-09 Contract freeze Signed/unsigned SignedCommand layout and family-specific signing presentations. One intent codec; signatures and replaceable evidence wrap it without changing intent bytes.
RDY-10 Contract freeze Tempo external certificate/profile pin and authentic Moderato fixture provenance, separate from Makechain Commonware. Define capture inputs and expected bytes/results; declare deterministic runtime-clock input; never fabricate a positive certificate.
RDY-11 Contract freeze Scheme descriptor encoding and registered full native-ID lengths. Closed release-owned registry; no arbitrary scheme or truncated ID.
RDY-12 Contract freeze Settlement profile root semantics across contract and certificate upgrades. Expected cases bind certified header to EVM state root, account proof, storage root, slot, cumulative value, threshold identity and strict advance.
RDY-13 Contract freeze The history-table schema: every table's columns, types, primary key, secondary indexes, and schema prefix. The block-projected prefix is written by the exporter from block bytes alone; the ingestion prefix holds object metadata and publisher assertions, which the indexer's own worker writes from object bytes and off-chain signed messages. Every key ends in (height, command_index, op_index) or that table's equivalent version columns, and no two rows of one table share a key, because the store is append-only, has no delete, and treats a repeated primary key as undefined. Query owner; frozen before D0, and before the SB-16 spike writes rows, with a rebuild-from-mirror equality check over the block-projected prefix only, since the mirror carries neither object bytes nor off-chain messages; a schema change is a new prefix, never an in-place migration.
QUA-01 Executable qualification Reproducible native/wasm behavior, derived transport/metadata output, and fixture corpus. Same Rust reference logic, deterministic derived output, positive and negative result parity.
QUA-02 Executable qualification Tempo certificate compatibility under current and target pins. Authentic fixture passes byte-identical decode/re-encode and BLS verification through the normal verifier.
QUA-03 Settlement qualification Exact deployed beneficiary-cumulative contract profile and live proof. Use the selected dedicated immutable contract; capture a live Moderato account/storage proof before enabling imports.

Implementation can start after its owned contracts have fixed schemas, bytes, bounds, ownership, and expected vector cases. Generated native/wasm artifacts and executable parity are later qualification outputs, not prerequisites for writing them. An unresolved contract row is not permission to choose a convenient integer, tag, field order, default, or library HEAD representation. The unresolved settlement deployment blocks positive import qualification and enabling that command, but it does not block independent codec, state, executor or proof work.

The specification allows no genesis credit allocation and no pre-created credit ledger (§5.2). Genesis has no account credit ledgers; the first usable flow is proof-backed IMPORT_CREDITS, then INIT_ACCOUNT. Dedicated contracts are selected for both Tempo networks; each exact contract/proof profile has a pinned candidate certificate type and still needs its deployment manifest and authentic fixtures. The canonical schema can be implemented before those deployment inputs exist.

11. Source ledger

Source Authority in this inventory
spec/SPECIFICATION.md §§5–18 Normative Makechain semantics: genesis, encoding, commands, state, blocks, releases, proofs, settlement and events.
spec/state-machine.md Complete transition/access and APP conformance coverage.
docs/client-api.md Signed-byte handling, retry/substitution, proof and receipt verification boundaries.
docs/architecture.md Canonical schema ownership, single executor, native/wasm boundary and development-profile direction.
Commonware v2026.9.0 Exact codec, BMT, QMDB, Merkle, consensus and certificate library behavior selected by Makechain.
Commonware working HEAD Non-authoritative compatibility/research signal only.
Pinned Tempo profile/TIPs Account derivation, EIP-712 and settlement certificate/storage-proof external formats; pin remains separate.
The reference codebase, crates/makechain-tempo-proof/src/lib.rs Integration reference for the Tempo certificate/header leg only; not receipt or contract-format authority.
Constantinople Integration reference only; never canonical Makechain format authority.