Repository structure and engineering contract
| Field | Value |
|---|---|
| Status | Reviewed P5 design; FB-01–FB-12 primitive closure and SB-01 fixed account-record evidence passed in bounded scope |
| Updated | 2026-09-22 |
| Protocol baseline | Specification revision 15, 2026-09-25 |
| Commonware baseline | v2026.9.0, commit d476a2361ce6840d2b9d0aa6fb30a924429046d4 |
| Rust baseline | Rust 1.95.0 (rustc 59807616e, Cargo 1.95.0 f2d3ce0bd) |
| Deployment direction | Disposable devnet in one GCP region with a self-hosted exoware store and a GCS Standard mirror bucket; Cloudflare applications later |
This document fixes where future work belongs and which dependencies may cross each seam. It is a design contract, not an instruction to create the folders now. The initial implementation is the protocol and its smallest qualification harnesses. A product SDK, user CLI, explorer, documentation site, Cloudflare application, and the owner's consuming application are not initial implementation tracks.
The specification and its companions own protocol meaning. Architecture owns semantic module interfaces. Encoding owns the proposed vector/fixture format and data contracts owns the canonical-format inventory. Validation owns the evidence gates. If this layout conflicts with one of those authorities, change the layout; do not duplicate the rule in a convenient crate.
1. Repository boundary
The Makechain repository owns:
- canonical Makechain data, rules, authorization, deterministic execution, state integration, and proof verification;
- Commonware assembly without a Commonware fork;
- native node and off-chain service composition roots;
- native/wasm verifier packaging and protocol conformance harnesses;
- public network artifacts, release manifests, and later GCP/GKE and Cloudflare deployment code.
The following remain separate repositories or systems:
| External owner | Boundary with this repository | Forbidden coupling |
|---|---|---|
The separate makechain-contracts repository |
Supplies reviewed ABI, deployed address, immutable runtime code hash, storage layout/profile, and authentic Tempo proof fixtures for the dedicated cumulative-credit contract | No Solidity source copy, submodule, workspace member, or implicit deployment from node builds; a contract change enters only through a reviewed settlement-profile/pin update |
| mkit and the per-project availability layers | Supply registered commitment identity rules, verified object/closure results, and authenticated availability transport contracts; a project may have several layers, discovered off chain | No mkit object graph, attestation logic, or private-object storage in consensus; availability never changes validity |
| Owner's consuming application | Consumes published protocol/client contracts after their gates pass | No application business logic, UI, or private data in this repository |
| Tempo | External settlement chain and proof format, separately pinned from Commonware | No live RPC in consensus execution, no dependency on Tempo working HEAD, and no global-issuance or synthetic-proof fallback |
The repository may later contain first-party gateway, exporter, relayer, query, verifier packaging, Cloudflare, and GKE deployment work. Their inclusion does not turn external contracts, mkit, or the consuming application into workspace members.
2. Planned top-level layout
Cargo.toml Rust workspace and shared dependency/lint policy
Cargo.lock committed lock for every native/wasm/release build
rust-toolchain.toml exact Rust 1.95.0 pin and required targets/components
Justfile documented command aliases only
spec/ normative specification, encoding, state-machine, and settlement interface
docs/ architecture, client API, contracts, operations, validation, decisions
crates/ reusable Rust modules described in section 3
bin/ thin native composition roots described in section 5
packages/ minimal Q4 wasm verifier packaging; TypeScript product packages later
apps/ later Cloudflare applications; no protocol rules
schemas/ generated public transport descriptions/metadata, never canonical source
conformance/ encoding-owner vectors, fixture manifests, compatibility/pin manifests
tests/ cross-crate deterministic, persistent, and network qualification harnesses
benchmarks/ accepted workloads and measurement harnesses
spikes/ disposable feasibility probes; never a dependency of any member
networks/ public chainspec/genesis/release artifacts, never private shares
infra/ later GCP/GKE and Cloudflare deployment definitions
tools/xtask/ small repeatable workspace/release automation binary
Folders are created only when their first owned artifact is implemented. Empty future directories and placeholder packages provide no architectural value. Secret shares, operator credentials, private DKG material, live kube credentials, and unpublished settlement evidence never enter the repository.
3. Rust crate map
Eight reusable crates are the proposed complete native-system split, plus the verification crate makechain-trace, on which no production crate depends and which depends on no node crate. The first
implementation slice needs only protocol, execution, state, proof, node, the node binary,
and qualification harnesses. Crates are grouped around deep interfaces and dependency constraints,
not around every label in the architecture.
| Planned crate | Modules and concrete responsibility | External interface | Main dependencies | Excludes |
|---|---|---|---|---|
makechain-protocol |
Canonical schema; domain/tag registry; chainspec/profile; release evaluator; command authentication; signature presentations; pure Tempo settlement evidence verification | DecodeCanonical, ResolveRules, authenticated command/result types, settlement verified facts |
Exact commonware-codec, selected Commonware crypto/certificate types, pinned crypto crates |
Runtime, QMDB handles, HTTP/RPC, cloud SDKs, process config, client retry |
makechain-execution |
Application executor; ordered block overlay; bounded access planning; resource/fee/deposit accounting; transition handlers; events and derived header fields | EvaluateCommand, ExecuteOrderedBlock, OpenParentView contract and immutable execution outcomes: ordered change set, derived header fields, events, trace records; the RecordSink trait and its no-op DiscardSink |
makechain-protocol; no runtime dependency |
Durable writes, merkleization, roots and targets, consensus actors, admission policy, query tables, wall clock, any cargo feature that changes what ExecuteOrderedBlock computes or returns |
makechain-state |
Three-member state adapter for current state, membership log, and block history; typed reads; staged operations; exact QMDB target/root/proof integration | OpenParentView adapter, MerkleizeBlock over the executor's change set, member target/root capture, change-set digest |
makechain-protocol, makechain-execution, exact Commonware storage/glue contracts |
Generic repository/transaction layer, cross-member atomicity claim, fourth database |
makechain-trace |
Verification only (publish = false): trace record serialization (src/schema.rs, a ruler path), generated model-action match, post-state abstraction adapter, offline replay driver |
Record schema, abstract(readers) -> ModelState, replay driver binary |
makechain-protocol, makechain-execution, makechain-state, the pinned commonware crates; never makechain-node |
Production use, any dependency from a production crate (makechain-node included), the RecordSink trait and DiscardSink (in makechain-execution), the simulation StashSink and engine wiring (the tests/trace-sim harness) |
makechain-proof |
Pure finality, release-lineage, command, publication-receipt, membership, and current-state verification from caller trust inputs | VerifyEvidence and typed verified facts/errors |
makechain-protocol, selected Commonware crypto/storage proof types |
Network fetch, status/retry policy, object availability, server-selected trust, native I/O |
makechain-node |
Engine assembly; Commonware Stateful application adapter; fixed and dynamic profile wiring; mesh membership; lifecycle/readiness; custody and storage ports |
propose, verify, apply, capture, finalized, role builder/run contract |
All four core crates plus exact Commonware actor/runtime/consensus/glue/p2p crates | Protocol reimplementation, query projection, public HTTP semantics, cloud SDKs |
makechain-gateway |
Admission and fan-out; bounded pool; advisory status; service authentication; transport-neutral request policies | OpenAdmissionSnapshot, Admit, DryRun, InsertCandidate, SelectForProposal, FanOut |
makechain-protocol, optional read-only makechain-execution, makechain-proof for pass-through verification |
Validity authority, signer UI, fresh-sequence retry, query storage, Cloudflare bindings |
makechain-history |
Finalized handoff into the local durable queue; drain to the store and to the mirror, including the block's history-table rows projected into the exoware-sql store in the same batch as the block, the certificate, and the operation-log slices; mirror writer with content-addressed per-block objects, height index and watermark; the checker that verifies each block's finalization certificate from its own trust anchor and then compares the store's root at the ingested size with that verified header's targets; watermark-sequenced drain from the queue, the only slice source, with a mirror height-index scan; event re-derivation and watermark policy | EnqueueFinalized, PublishFinalizedRange, mirror-writer and checker ports |
Core crates, native persistence/object-store adapters, the pinned exoware client crates | Validator consensus acknowledgement dependency (the queue-bound wait holds back only the exporter's own marshal acknowledgement), proof generation, analytical tables, service answers as validity, object availability |
makechain-query |
Query service over the exoware-sql store: keyset-paged query API and SubscribeFinalized event subscription over history tables, "not found" answers, EventId dedup, and assembly of command-inclusion proofs and publication receipts from stored blocks; keeps no database of its own, and its one writer is the object-fetching ingestion worker that fills the non-reproducible prefix holding object metadata and publisher assertions |
query API, SubscribeFinalized, proof/receipt assembly interface |
makechain-protocol, makechain-proof, exoware-sql client, certified outputs from makechain-history |
Its own database or pipeline, consensus/state writes, proof interpretation, singleton publisher inference |
makechain-protocol is deliberately broader than a type crate: deleting it would spread canonical
bytes, release selection, authentication, domains, and external proof rules into every caller.
makechain-node is more than a pass-through binary library: it buries Commonware lifecycle,
readiness, sync-plan, profile, and cancellation rules behind one role assembly interface.
There is no proof-generation crate. The proof service is the operated exoware operation-log service,
so makechain-history writes to it and checks it but never reproduces its proof construction.
makechain-gateway, makechain-history, and makechain-query are deferred until the protocol slice
needs their narrow diagnostic adapters. Admission has latency/bounded-pool dependencies, history has
durable queue, watermark and store-client dependencies, and query has exoware-sql client
dependencies. Keeping the three seams prevents validator and exporter builds from inheriting
public-service or query-tier dependencies.
3.1 Deferred client workflow
The later Client workflow module owns preparation, the durable signing-slot journal, submission and
reconciliation state machine, and complete-push composition. It depends on Canonical schema,
Release evaluator/profile data, Proof verifier, and injected transport/storage ports. It does not
belong in makechain-proof, because proof verification remains pure and status-agnostic.
Before a product SDK exists, tests/client-reference may exercise the same interface with in-memory
and filesystem journal adapters. When product work begins, the reusable Rust implementation should
become crates/makechain-client. The early packages/wasm-verifier exposes only portable canonical
decode and evidence verification needed by Q4; preparation enters only with the reviewed Client
workflow. A later TypeScript SDK wraps rather than reimplements them. This future client crate is not
required for the first executor/node implementation.
4. Dependency and target rules
makechain-gateway (native, deferred)
/ \
makechain-node (native) ──> makechain-state ──> makechain-execution
| | |
| +-------------------------+
| |
+──────────────> makechain-proof ────────────────> makechain-protocol
^ ^
| |
wasm verifier package -----------------+
makechain-trace (native, verification only) --> makechain-state + makechain-execution + makechain-protocol
tests/trace-sim (harness) --> makechain-node + makechain-trace
makechain-history (native, deferred) --> core crates + pinned exoware client crates
makechain-query (native, deferred) --> protocol + certified history outputs
Client workflow (portable, deferred) --> protocol + proof + injected ports
Every arrow points toward a dependency. The graph is enforced from package metadata, not reviewer memory.
makechain-protocol,makechain-execution, andmakechain-proofmust compile without Tokio, filesystem, sockets, cloud SDKs, or platform clocks. Their portable feature set must compile forwasm32-unknown-unknownwhere used by the verifier package.- Pinned source places BMT outside
commonware-storage'sstdgate but places QMDB under it; storagestdalso enablescommonware-runtime, futures, tracing, and zstd. The verifier therefore selectscommonware-storagewithdefault-features = falseand only the minimum exact features required by its native proof types, and its wasm build runs as a separate package/target invocation so workspace-wide native feature unification cannot masquerade as portability. That gate records the resolved graph, compiles the complete selected proof/crypto closure, and checks the emitted wasm/import graph has no reachable filesystem, socket, clock, or other native I/O path. It does not reject an otherwise portable build merely because an unused transitive runtime trait crate is present. This feasibility check is NOT RUN; failure blocks the crate split and triggers pin/interface review, never a hand-written replacement proof format. makechain-stateis native because it binds exact Commonware QMDB/glue contracts.makechain-node,makechain-gateway,makechain-history,makechain-query, and the verification cratemakechain-traceare native. Only they may own asynchronous runtime and process-lifecycle dependencies.- No crate wraps all Commonware primitives behind a generic framework. The selected codec, BMT, QMDB, Simplex, marshal, Stateful, DKG, and mesh types stay visible at the module that must preserve their consensus contract.
- Feature flags may choose adapters or instrumentation. They may not change canonical bytes, command validity, release rules, roots, profile semantics, or error classification.
- Production crates do not depend on
tests/,benchmarks/,spikes/,tools/xtask, Cloudflare packages, or deployment definitions. Test utilities live under the owning crate unless reused by two or more qualification harnesses.
spikes/exoware-spike (package makechain-exoware-spike, publish = false) is the workspace
member of the SB-16 exoware spike and the SB-15 per-tree hash microbenchmark. Its allowed
dependency edges are the exoware client crates at =2026.9.0 (exoware-qmdb, exoware-simplex,
exoware-sql, exoware-sdk); tokio =1.53.1 with rt-multi-thread only; the crates exoware
uses at 2026.9.0, bytes =1.12.1, datafusion =55.0.0, connectrpc =0.9.0 (client), and
futures =0.3.34; the pinned commonware-* crates it exercises, commonware-math included; and
makechain-protocol for the per-tree hasher aliases (decision D52). It is
the only member allowed tokio or an exoware-* crate before makechain-history and
makechain-query exist, and no member may depend on it under any dependency kind; workspace
validation enforces both. The store it talks to is a separately installed exoware-simulator
process, never a dependency. Its results feed IP-06C and the SB-15 decision point and carry
no production claim.
crates/makechain-trace holds the trace record schema (src/schema.rs, a ruler path), the
generated model-action match, the post-state abstraction adapter and the offline replay driver of
the trace design record (docs/execution/design/vp-02-trace-emission.md, TE-19). The dependency
rule: the RecordSink trait and DiscardSink live in makechain-execution (a trait over the immutable outcome, no runtime dependency); makechain-node installs DiscardSink and never depends on makechain-trace; makechain-trace (verification only, publish = false) depends on makechain-protocol, makechain-execution, makechain-state and the pinned commonware crates, never on makechain-node; the simulation StashSink and the engine wiring live in the tests/trace-sim harness, which depends on both makechain-node and makechain-trace; workspace validation fails if any production crate depends on makechain-trace under any dependency kind.
Dependency policy is deny-by-default at the workspace root. A new dependency needs the owning module, reason, feature/default-feature decision, license/security review, target support, and an explanation of why an existing pinned dependency is insufficient. Duplicate cryptographic, serialization, HTTP, runtime, database, or command-line stacks require architecture review.
5. Thin binaries and process assembly
Binaries parse configuration, open concrete adapters, call one library composition function, map typed startup errors to diagnostics, and own shutdown. They contain no command handler, encoding, release selection, proof decision, state transition, or retry state machine.
| Binary | Library composition | Initial status |
|---|---|---|
makechain-node |
makechain-node as validator or non-voting follower; role is explicit in immutable startup config |
Required by Q1; fixed profile first, dynamic profile enabled only after Q2 |
makechain-gateway |
makechain-gateway with network and state-snapshot adapters |
Deferred beyond protocol slice; diagnostic harness adapter may come earlier |
makechain-exporter |
makechain-node follower plus makechain-history publication adapters; runs active or standby, publication off in standby while the standby still queues every finalized block |
Minimal trusted Q1 diagnostic form first; public production form deferred |
makechain-indexer |
makechain-query query and event-subscription adapters over the exoware-sql store, plus the object-fetching ingestion worker that writes the two non-reproducible tables in their own schema prefix |
Deferred |
makechain-relayer |
External Tempo acquisition plus protocol verifier and submission transport | Deferred except fixture acquisition tooling; never called by execution |
The first deployment may co-locate adapters, but persistence directories, watermarks, readiness, identity, and authority remain explicit. Placement rules that follow from the roles:
- Production validators run on GKE/GCP and run no publication.
- One exporter process is active and one runs as standby with publication off; both are ordinary followers of the same binary and non-voting mesh peers from the governed chainspec roster, and the standby resumes from the store's publication watermark. The standby keeps its own durable publication queue of every finalized block and releases an entry only when it observes the store and the mirror watermark past that height, so it is deployed failure-isolated from the active: separate disk, host, and zone.
- Either state-syncs at its first installation only and follows marshal thereafter. That one
installation records its sync anchor
Adurably and begins its own queue coverage atA + 1. UntilAis recorded it re-evaluates, at every retargeting of its sync, that every height in(W, current target]is durable elsewhere,Wbeing the publication watermark observed in both the store and the mirror at the start of the installation: either the publication watermark has reached the current target, or the other roster member's queue coverage is at least the current target and its watermark advances within the publish-lag bound. If neither holds, it aborts the installation and alerts (R-17.21). The finalization pinned as the sync target is read from the store's finalized-by-height record and certificate-verified before use. One for whichmax(own queue coverage, publication watermark)is below the validators' retained window stops and alerts instead of syncing. - The store runs as its own service on a persistent disk, reachable only over a private network from the exporter, the standby, the proof service, the indexer and the gateway; it carries no authentication of its own, so network reachability plus an authenticating proxy that admits writes only from the two exporter identities is the whole of its access control.
- Cloudflare Workers are later edge/application adapters and never host validator identity, QMDB state, consensus logic, or the source of protocol truth.
Validator operators are permanently permissioned and explicitly trusted: the owner's team operates the initial seven, and later members enter only through governed scheduling and real DKG/reshare. No repository package provides permissionless validator discovery or admission.
6. Generated artifacts and fixtures
Canonical vectors and fixture formats are owned by encoding, with the inventory in data contracts. Before code, the reviewed encoding contract is the normative wire design. Once implemented, reviewed Rust canonical types/codecs are the executable authority. The format manifest records version, tags, domains, pins, and artifact digests; it is not a custom schema DSL or a compiler that generates the Rust implementation. Repository rules are:
- The reviewed canonical Rust schema/domain/discriminant implementation has one owner and names the encoding revision. Expected vectors independently pin literal bytes/digests/results.
- A small deterministic
xtaskcommand validates the owned vectors against Rust, emits public descriptions/metadata/bindings from Rust into a temporary tree, and compares derivable outputs byte-for-byte with committed outputs. There is no second schema compiler. Generation never depends on network access, wall clock, filesystem order, locale, or random seed. - Generated files declare their source and are not hand edited. A source change and all affected outputs land in one review.
- Authentic external fixtures record provenance and hashes. Real-network private keys, shares,
dealer seeds, and custody material are never fixture data. A narrowly allowlisted deterministic
harness directory may publish synthetic seeds/shares only when every file and derived chainspec
is marked
TEST ONLY, reproducible, bound to a disposable chain identity, excluded from release images/network artifacts, and covered by a secret-scan exception for that exact path. A positive Tempo fixture is captured from Moderato or Mainnet and verified by the production verifier; no generator can synthesize one. Cargo.lock, public chainspec/genesis bytes, release manifests, conformance outputs, and release checksums are reviewed artifacts. Ordinary build products are not committed.
7. Toolchain and dependency pins
The initial workspace pin is Rust 1.95.0: Commonware v2026.9.0 declares rust-version = "1.95.0", edition 2024, and that exact toolchain is locally installed. The local default observed
on 2026-09-19 is Rust 1.96.0; it is not the repository baseline. rust-toolchain.toml will pin
1.95.0 with a minimal profile, rustfmt, clippy, and wasm32-unknown-unknown. Shipped artifacts are built
only by 1.95.0. Every verification tool has its own digest-pinned toolchain recorded in
conformance/toolchains.toml: lean, charon-rust, aeneas and tlc are pinned, and kani,
dylint and cargo-fuzz are pending until the task that adopts each pins it. No nightly builds
anything that ships, and a toolchain bump is a ruler change with a full re-run (decision D49).
| Dependency class | Pin/update rule |
|---|---|
| Commonware | Exact 2026.9.0 crate versions resolved in committed Cargo.lock; no fork, path override, branch, wildcard, or working-HEAD build. A coordinated pin PR must pass the update proof in validation §8 |
| exoware | Exact 2026.9.0 crate versions for the store, proof-service and mirror publication path, including exoware-sql for the launch query tier, resolved in the same committed lock; they carry their own Commonware pins at 2026.9.0 and must resolve to the workspace's Commonware pin. All are ALPHA, and the simplex crate publishes no status line at all; treat every one as ALPHA. Only makechain-history, makechain-query, and the exporter binary may depend on them. A bump runs the update proof in validation §8 and the ALPHA re-run set in validation §11.5 |
| Rust crates | Exact lockfile resolution; direct requirements use bounded compatible ranges only when compatibility is intended. Security fixes update the lock and rerun affected evidence |
| Git dependencies | Avoid; if unavoidable, full commit SHA plus source review and vendoring/reproducibility decision. No branch/tag-only resolution |
| Cargo/local-gate tools | Exact versions; every direct main push runs the documented local command surface first |
| GitHub Actions | Disabled at repository level; reconsider hosted workflows when pull-request contributions begin, then pin every action by full commit SHA |
| Containers/base OS | Immutable image digest and dated package snapshot for release builds |
| JavaScript/Cloudflare | No initial toolchain. When product work starts, select one package manager/version, commit one lockfile, and apply the same exact-action and generated-artifact rules |
Pin changes are isolated from feature work unless the dependency change is the feature. The PR states the old/new pin, upstream diff range, consensus/storage/codec surfaces touched, reused evidence, invalidated evidence, and rollback/reset consequence. A Commonware bump never silently inherits new marshal, state, proof, codec, consensus, or DKG behavior.
8. Developer command surface
just is a discoverable alias layer over standard tools; tools/xtask handles repository-specific
deterministic checks. Neither becomes a build framework. The maintainer runs the complete local gate
before each direct main push.
| Planned command | Contract |
|---|---|
just bootstrap |
Verify exact toolchain/tools/targets and report missing items; no global mutation or secret fetch |
just fmt / just lint |
Formatting, Clippy, rustdoc, manifest/license, dependency-direction, and forbidden-feature checks |
just test |
Fast crate and interface tests with no network dependency |
just conformance |
Regenerate/compare encoding artifacts and run canonical positive/negative vectors |
just test-wasm |
Build portable crates and run native/wasm parity corpus |
just q1 … just q6 |
Run one named qualification harness with explicit profile, seed, layer, and result directory; absent prerequisites yield NOT RUN/INCONCLUSIVE, never a pass |
just fuzz <target> |
Run a named bounded parser/stateful fuzz target under the pinned fuzz toolchain |
just check-all |
The merge-gate union of deterministic checks, excluding scheduled long campaigns |
just reproducible <target> |
Build the release target twice in clean pinned environments and compare artifact bytes/digests |
Commands accept explicit paths and profiles. They never select a network from ambient cloud credentials, fetch a trust anchor from an RPC response, generate same-chain signer material, or fall back to synthetic settlement evidence.
9. Local gates and deferred hosted CI
GitHub Actions is disabled for the current direct-main development phase. Each push follows a
successful local just check-all plus any affected long-running campaign named by the change.
Hosted CI is deferred until pull-request contributions begin; enabling it requires a reviewed
workflow that invokes the same local commands with fully pinned actions and tools.
The required checks are small enough to diagnose independently:
| Gate | Required work |
|---|---|
| Source | format, Clippy/rustdoc with warnings denied, unit/interface tests, docs links, dependency/licence/advisory policy |
| Architecture | crate-edge allowlist, portable-crate forbidden dependency scan, feature-unification audit, thin-binary check |
| Contracts | canonical regeneration diff, schema/domain/tag completeness, positive/negative conformance corpus |
| Portable | separate native and wasm32-unknown-unknown package builds, resolved/reachable feature and import graph review, plus verifier result parity; unused transitive runtime traits alone are not a failure |
| Deterministic | seeded executor and Commonware deterministic-runtime tests relevant to the change |
| Persistence | restart/crash-cut subset when node/state/export ownership changes |
| Security | parser bounds, malformed proof/signature corpus, secret scan, dependency advisory policy |
| Reproducible | clean release build for each supported release target on release candidates and pin/toolchain changes |
Fuzz, prolonged deterministic schedules, Q2/Q3 recovery campaigns, load tests, and reproducibility rebuilds run on a schedule and on affected release candidates. A failure is attached to the exact seed, corpus digest, source revision, pin set, and artifact. Flaky retries do not turn a failure into a pass; the manifest records every attempt.
The initial supported release target is x86_64-unknown-linux-gnu for GKE/GCP node images. Developer
builds on aarch64-apple-darwin are supported for feedback but are not release artifacts. The
portable verifier target is wasm32-unknown-unknown. Adding or replacing a release target requires
a reproducibility result, runtime/storage qualification, and deployment review.
10. Review ownership and change classes
| Change | Required accountable review | Required evidence impact statement |
|---|---|---|
| Canonical bytes, domains, tags, limits, chainspec | Protocol + encoding owners | Affected RDY/vector IDs, chain/reset compatibility, native/wasm parity |
| Execution, authorization, fees, state access | Protocol + execution owners | Invariant/APP rows, deterministic parity, state/root changes |
| QMDB, sync, durability, engine, consensus, DKG, mesh | Node/storage owner + Commonware reviewer | Pin/source paths, crash cuts, Q1/Q2/Q5 impact, recovery limitation |
| Proofs, signatures, settlement verification | Protocol security + verifier owner | Negative vectors, external pin/profile, APP/API/Q4 impact |
| Admission, export, query, client workflow | Owning service/client reviewer + protocol reviewer | Evidence-class boundary, backpressure/retry/cursor scenarios |
| Dependencies/toolchains/build/release | Maintainer + security/release owner | Lock/pin diff, provenance, invalidated qualification, reproducibility |
| Networks, GCP/GKE, Cloudflare | Platform/operations + protocol owner for trust inputs | Identity/failure-domain/readiness and promotion impact |
Changes to anything under spec/, canonical schema inputs, conformance vectors, public network artifacts,
and release/pin manifests require explicit ownership review rather than general code ownership alone.
Automated agents follow the same placement and review rules; generated volume does not waive an
owner or evidence mapping.
11. Reproducible releases and promotion
A release is one content-addressed source revision plus exact toolchain, lockfile, build recipe,
network-independent binaries, SBOM, provenance, and checksums. Build environments set a stable
SOURCE_DATE_EPOCH, contain no credentials, use pinned base images/package snapshots, disable
incremental compilation, and remove path/time entropy. Two clean builders must produce equal bytes
for the declared artifact or the result is INCONCLUSIVE/FAIL and cannot be promoted.
Promotion references the same immutable image and binary digests through development, qualification, and production. Environment-specific chainspecs, settlement profiles, addresses, and trust anchors are signed data inputs, not compile-time substitutions. Binary rollout is separate from protocol release activation. A binary must support every ruleset from genesis through the active release before it may vote; rollback may select an earlier compatible binary but may never revert an activated protocol release.
Promotion sequence:
- Merge gates pass and provenance binds source, toolchain, lockfile, generated inputs, and targets.
- Independent rebuild agrees on bytes; publish checksums, SBOM, and signatures/attestations.
- Fixed-profile devnet uses the artifact only after its required gate in validation §9.
- Dynamic qualification testnet starts from a new genesis/
chain_idand requires Q2/Q3/Q5 evidence. - Mainnet promotion requires all mainnet gates, the dedicated immutable Tempo Mainnet contract profile, real Mainnet proof qualification, production topology/load evidence, and owner verdict.
Devnet/testnet use real Tempo Moderato proofs. Mainnet uses real Tempo Mainnet proofs. A captured fixture may make a deterministic run repeatable, but a fixture or devnet result cannot promote a Moderato settlement profile into Mainnet. Contract builds and deployments are released by the separate contracts repository, then imported here as reviewed immutable profile data.
12. P5 acceptance and unresolved choices
Independent implementation may begin after the relevant module's schema/interfaces, dependency
edges, expected vectors, and validation rows are reviewed. It does not require every later package,
cloud adapter, workload target, or external service to exist. Positive IMPORT_CREDITS execution
remains blocked until the dedicated settlement contract profile and authentic Moderato fixture
exist; this does not block independent codec, executor, state, proof, or harness work.
The disposable devnet has selected one GCP region, a self-hosted exoware store on a persistent disk
in that region, and a same-region GCS Standard bucket as the mirror, written through
create-if-absent generation preconditions and the makechain-history storage seam. A regional
outage may stop this network. Exact region and machine shape are deployment-time quota/cost choices
and convey no production qualification.
Production bucket replication/location/retention, the administrative independence of the two store copies, validator topology, store disk-snapshot cadence, recovery SLOs, Cloudflare application structure, and a TypeScript toolchain remain deliberately unselected. Each has a named downstream gate in architecture/operations/validation. Selecting one is not necessary to implement the protocol core, and implementing the core does not silently select one.
Source basis: Commonware v2026.9.0 workspace metadata and workflows establish Rust 1.95.0,
edition 2024, the crate family, and deterministic/fuzz/conformance practices; owner direction
prohibits a Makechain fork.
Tempo commit 25b216a661c2cac72807174583371b582b75c286 informs only the separation of reusable crates,
thin binaries, workspace automation, and reproducible release builds. Constantinople commit
42d0b3abfd89a3f6f31b1ee44f5f9f516a25bdc0 informs fixed-profile assembly wiring only. None is
evidence that this proposed repository or a Makechain build has passed.