Repository structure and engineering contract

Draft protocolSource at 169cbd2 ↗Source SHA-256 12349bd…650
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, and makechain-proof must compile without Tokio, filesystem, sockets, cloud SDKs, or platform clocks. Their portable feature set must compile for wasm32-unknown-unknown where used by the verifier package.
  • Pinned source places BMT outside commonware-storage's std gate but places QMDB under it; storage std also enables commonware-runtime, futures, tracing, and zstd. The verifier therefore selects commonware-storage with default-features = false and 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-state is native because it binds exact Commonware QMDB/glue contracts.
  • makechain-node, makechain-gateway, makechain-history, makechain-query, and the verification crate makechain-trace are 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 A durably and begins its own queue coverage at A + 1. Until A is recorded it re-evaluates, at every retargeting of its sync, that every height in (W, current target] is durable elsewhere, W being 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 which max(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:

  1. The reviewed canonical Rust schema/domain/discriminant implementation has one owner and names the encoding revision. Expected vectors independently pin literal bytes/digests/results.
  2. A small deterministic xtask command 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.
  3. Generated files declare their source and are not hand edited. A source change and all affected outputs land in one review.
  4. 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.
  5. 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:

  1. Merge gates pass and provenance binds source, toolchain, lockfile, generated inputs, and targets.
  2. Independent rebuild agrees on bytes; publish checksums, SBOM, and signatures/attestations.
  3. Fixed-profile devnet uses the artifact only after its required gate in validation §9.
  4. Dynamic qualification testnet starts from a new genesis/chain_id and requires Q2/Q3/Q5 evidence.
  5. 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.