If Tx-Rails were a five-part concept, this is how I would put it.
Kademlia – ADNS: Distributed Hash Tables, minimal need for DNS
Local View – A – Integration Modes A; B; C; D: Core Mechanisms: From Underlay to Substrate
Mode
Status
What customer does
Metadata fidelity
Use case
A. Hash-only
Built, live
Commit path publishes a signed hash of each transaction; nothing else
Identity/location + cryptographic-commitment + BFT/discriminator fields only, of 33 — no content, no amounts, ever, by construction
Every customer scenario today; the only fully packaged, customer-adoptable mode
B. CDC observation
Deployed in our own estate and committing through consensus — reference implementation, not a packaged product
Real Postgres logical replication (pglogrepl, no Debezium/Kafka needed); nothing in the app
Adds CRUD intent directly from the WAL operation; coarse per-customer service-account attribution, not per-user — audit-column mapping back to real identity remains unbuilt
Frozen-vendor systems — the tooling is real; no customer has been onboarded through it yet
C. Gateway-mediated
Deployed in our own estate and committing through consensus — reference implementation, not a packaged product
Routes API traffic through a real inline reverse proxy (edge-gateway); app unchanged
Derives semantic intent from an explicit per-customer route config (method + path), not HTTP inference; attribution via org-gateway’s existing JWT verification, forwarded through unchanged
Clean single API edge — the only one of the three that’s genuinely preventative (fail-closed); no customer has been onboarded through it yet
D. SDK / atomic dual-write
Deployed in our own estate and committing through consensus — reference implementation, not a packaged SDK
Calls tx-rails alongside its own DB write, via a reference outbox-relay a customer’s own team adapts
Carries the full 33/33, with explicit semantic intent — real now, not a sketch
Very-high-value flows needing explicit REVERSAL / CORRECTION / RESTATEMENT tagging — the tagging is real; no customer has been onboarded through it yet
Local View – A2 – Your Mode sets a ceiling on which coordination Levels you can use
The Modes and the coordination Levels are usually described separately, which hides a dependency between them that decides what a customer can actually buy. Level 1 is the registry: who is a member of a sector, and who vouches for them. Level 2 is the crossing: what may pass between sectors, under which regime, and the durable record that it did.
Level 2 has to read a transaction to apply a regime to it. It is deciding which regime governs a crossing and which authority owns it, and neither question can be answered from a hash. So Mode A cannot reach Level 2 — not as a matter of configuration or licensing, but because the information Level 2 needs was never transmitted. A Mode A customer gets Levels 0 and 1 in full, and every ordinary transfer inside their own sector; a crossing into another sector needs Mode B or deeper. This is the one place where the two axes are not independent, and it is worth stating plainly rather than letting a customer discover it after choosing a Mode for confidentiality reasons.
Where Level 2 stands, measured 1 October 2026. Level 2 runs on two governance meshes which are the same binary in two postures — a regulated one and a commercial one. The rule is that regulation attaches to the company: once a party comes under regulation, its transfers settle via the regulated mesh regardless of what geography alone would have chosen. Until this week nothing computed that. Routing was derived from addressing only — pyramid, sector, data centre, country — and no code anywhere consulted regulated status, so a regulated counterparty could be hosted by the commercial mesh on geography alone, and both meshes could each believe they owned the same transfer. Settlement needs exactly one authority per transfer, so that was a correctness defect rather than a preference.
Host selection now exists as a pure function of (regulated status, then coordination tier), and the governance deployment enforces it rather than trusting callers to apply it — a rule only the caller applies is a convention, and a convention is not a control. The binary carrying it is live on all eight governance validators, verified by digest inside each running container rather than from a deployment status field. The enforcement itself is deliberately switched off. It arms per mesh, by an explicit setting, so that “the code is deployed” and “the control is on” remain two separately verifiable facts; a misconfigured value blocks the unit with a named reason rather than silently disabling the control. What a regulated federation is stays a registry of explicit records, readable and revocable — never inferred at runtime from anything about the identifier itself.
Local View – B – The Data Visibility Ladder — four rungs, independent of which Mode you pick
The four Modes above answer how content reaches Tx-Rails at all — nothing, a WAL observer, a gateway, or a direct SDK call. A separate question, orthogonal to all four, is who can actually read whatever content does arrive once one of them is sending it. That’s the Data Visibility Ladder: four rungs, each an explicit answer to “who can decrypt this field, and what does the platform give up or gain in exchange.” A customer climbs the rung that matches their own risk tolerance against how much platform-side service — cross-checking, referential validation, independent audit — they want in return. The full design lives in structured-atom-privacy-ladder-design.md; this section is the customer-facing summary, kept in sync with it.
Rung
Who can decrypt
What the platform gives up
Status
1 — Plaintext
Everyone in Tx-Rails’ own operational chain
Nothing — full validation, full ChubbyChecker cross-checking
Default today, for every content-receiving Mode (B, C, D), once adopted
2 — Platform-key encrypted
Tx-Rails (customer explicitly consents)
Nothing structurally — the platform can always decrypt to validate/cross-check, same as plaintext, just protected from anyone outside the platform’s own key custody (a stolen DB backup, a network intercept)
Mechanism built, carrying no production data. Ten fields of every transaction record are already sealed individually by it, each under its own per-record data key bound to the record and field it belongs to: the client node, the signing string, the user and role, the amount mantissas and exponents, and the database, schema, table and record identifiers. That last group matters more than it looks — a pointer to the exact customer row a transaction touched is a de-anonymisation index if left in the clear, whatever else is protected. The sealer and its schema exist and are exercised by tests, and organisations.tenant_sealed_fields is present in the live schema — but measured 2026-10-02 it held zero rows, against 33,964 rows in trace.slab_anchors on the same tier. No record has been sealed in a running deployment. This is the intended floor for the content-receiving Modes and the current direction of travel, not a capability available today.
3 — Customer-key encrypted
Only the customer — Tx-Rails genuinely cannot decrypt, even in principle
Depends on the field — nothing, if the platform never validated that field’s content anyway; the rest of the cross-check catalogue, for the narrower case where we are expected to validate data only the customer can read
Already solved today for fields Tx-Rails never validates. Genuinely open only for the narrower case where we are expected to validate customer key-encrypted data.
4 — Partner-key encrypted
Only a named third party the customer chooses (a manufacturing partner, a regulator) — asymmetric, multi-recipient
N/A — separate key-management machinery layered on top of Rung 3
Undesigned. No code anywhere.
Global View –
4 Deployment Shapes;
Tower (Highly Regulated)
Shape 1 (Default)
Shape 2 (Some Shared Resources)
Shape 3 (All Shared Resources)
Company & Network Structures Concrete & Abstract
Company/Organisation Level
Federation Level
Pyramid Level
DataCentre Level
National Level
Sector Level
3 Transaction Regimes — all three built; none yet carrying customer traffic
Regime A (Intra-Pyramid) — coordinator wired
Regime B (Domestic) — Saga, executed through consensus
Regime C (International) — anchored settlement, rolled to every governance validator and a full lifecycle proven through consensus
Industrial Internet of Things IIoT/Smart Contracts
Auditing – ChubbyChecker, the criteria extracted from it, and why the verdict is reproducible without trusting us
Tx-Rails Sovereign Name Resolution
(optional ADNS)
Move the connection-trust decisions that matter off DNS and onto a Byzantine-fault-tolerant peer-identity mesh — without rewriting your applications, and without surrendering the parts of DNS that still work.
DNS is the load-bearing component of global digital trust, and it is structurally insecure. There is no authentication of names; DNSSEC adoption sits below 3% for end-user domains; cache-poisoning, registrar hijacking, BGP-leak attacks on authoritative servers, and dangling-CNAME subdomain takeover have produced an actuarial loss profile that every cyber-insurance underwriter now prices into your premium without ever calling it that. The largest providers — Cloudflare, Akamai, AWS Route 53, Google Public DNS — are single points of failure with a track record of cascading outages, and they sit within jurisdictions whose courts and intelligence services can compel changes to your name-resolution path. The economy has learned to live with this gap because the incremental cost of any one DNS-mediated incident is borne by someone who isn’t pricing it back into the system. That is the delusion.
Tx-Rails Sovereign Name Resolution displaces DNS for the connection paths where the actuarial cost has finally exceeded what’s tolerable: financial-settlement flows, audit-evidence channels, supply-chain provenance APIs, regulator-facing inspection endpoints, multi-party contract execution, and any client-to-server flow whose compromise has reputational, regulatory, or counterparty-trust consequence. DNS continues to serve everything else — your marketing site, your public-blog CDN, your developer-docs portal. Your applications do not need to be rewritten. The high-value flows route through a cryptographic peer-discovery substrate that has no single point of failure, no central registrar, no court-orderable trust path, and an independently-verifiable record of every connection accepted.
What we displace
DNS today resolves names to IPs without authenticating either end. Tx-Rails Sovereign Name Resolution replaces that with three layers, in order:
1. Cryptographic peer identity (libp2p peer-IDs)
Every endpoint — every server, every API, every audit node, every contract-execution surface — has a cryptographic peer-ID derived from its public key. Connecting to that peer-ID is provably connecting to the holder of that private key. There is no name-to-IP indirection that an attacker can poison; the name is the public key.
2. Kademlia DHT for peer location (with enterprise-CA gating)
Peers find each other through a Kademlia distributed hash table that holds peer-ID → multiaddress records. Records are signed by their owners; the DHT is operated by the customer’s federation (and, where contracted, by ITOTCCA-operated co-validator nodes). Cross-jurisdiction discovery happens without depending on any third party’s DNS resolver. Combined with the wp-06 peer-identity verification layer, every routing-table entry is gated by a CA-signed cert that binds the peer-ID to the operator’s enterprise PKI — so a malicious peer publishing a poisoned record is rejected before it ever appears in a routing lookup.
This same mechanism is also how two national aggregators that have never traded before find and verify each other for Regime C cross-border settlement, before a single dollar moves — see the corridor-onboarding Q&A in Part 3.
3. Cert-pinned DoH for the bootstrap edge
The one place DNS is still needed is the initial discovery of the federation’s bootstrap peers. We solve that with wp-9A DoH (DNS-over-HTTPS) with SPKI cert-pinning: bootstrap-peer hostnames resolve via your nominated DoH provider, with the provider’s TLS public-key SHA-256 pinned in the client config. The result is a bootstrap path that is (a) encrypted in transit, (b) authenticated by cert-pinning (not by trust-on-first-use), and (c) verifiable against the federation’s published trust roots. From that one bootstrap, the majority of subsequent peer discovery is over the BFT-consensused Kademlia overlay with the only further DNS dependence, employing DoH, occurring when server Node Ids are rotated as a security measure. At these points every user’s connection data must be renewed.
What we keep
We do not displace DNS for your public marketing properties, your CDN-fronted documentation, your developer portal, your blog, your image-hosting flows, your social-media login redirects, your office-network DNS, or any flow where the cost of a name-resolution incident is acceptable. DNS is fine for the things DNS is fine for. The pitch is not anti-DNS in principle; it is anti-DNS for the flows whose compromise has been quietly underwritten by your insurance premium for too long.
You also keep:
Your applications unchanged on the wire. sovereign-proxy is a single local daemon, TLS-terminated locally against a customer-installed root cert and relayed over Kademlia: HTTP CONNECT and SOCKS5 (RFC 1928) both built, auto-detected on the same port, for unmodified browsers and most legacy software; native-application SDKs built for Java, Python, Node, and .NET; a TUN-based virtual interface built in both a userspace-networking variant and a real kernel-backed device variant. Customers choose per-flow, from what’s actually built.
Your load balancers, WAFs, CDNs at the DNS edge. Sovereign Name Resolution is in front of those for the flows it serves; the DNS-fronted flows continue through the existing stack.
Your observability. Every peer-ID connection emits OpenTelemetry-compatible spans + ChubbyChecker audit events; existing SIEM / APM integrations consume them via the published collectors.
Your IdP. SAML / OIDC redirects continue to land at DNS-resolved HTTPS endpoints; the connection to those endpoints, if it’s one of the high-value flows, runs over the cryptographic substrate.
Where it applies
This is the right substrate for any flow whose actuarial cost-of-compromise exceeds what current DNS-mediated trust can defend. Concrete examples across sectors:
Critical national infrastructure (energy / water / transport / telco): ICS / SCADA management endpoints, emergency-mutual-aid coordination APIs, regulator-facing real-time disclosure feeds — the flows that NIS2, US CISA CIRCIA, the new Australian SoCI Act assurance regime are all sliding toward mandating verifiable transport for.
Financial-settlement and central-bank flows: real-time gross settlement, cross-border payment-message rails, custody-record reconciliation. Where SWIFT bnPLUS, FedNow, and the various CBDC pilots are wrestling with how to authenticate counterparties without depending on commercial-DNS-mediated PKI.
Healthcare under ransomware attrition: imaging / EHR / lab-result endpoints between hospital systems and across regional networks. The entry vector in the majority of post-2023 ransomware cases involves DNS-mediated phishing or watering-hole — closing the DNS surface for the flows that matter shrinks the attack surface materially.
Sovereign-wealth + central-bank treasury: portfolio-management APIs, custodian reconciliation channels, regulatory disclosure rails. The CIOs of these organisations have been quietly looking for a DNS alternative for a decade; the technology is finally there.
Building safety + construction post-Grenfell / Carillion: golden-thread evidence channels, certifier-to-regulator notification rails, retention-bond release endpoints. The trust failure that produced these regulatory regimes was the failure of the underlying records chain — and the records-chain substrate sits on DNS.
Pharma supply-chain + cold-chain provenance: serialised-product traceability APIs, custody-of-evidence channels for cold-chain integrity, regulator-facing recall-execution flows. DSCSA / FMD compliance regimes assume verifiable transport that DNS cannot provide.
Cross-jurisdictional supply chains generally: any flow where two organisations in different legal regimes need to exchange data without depending on a third country’s name-resolution sovereignty.
Why this is becoming inevitable, not optional
Cyber-insurance is repricing DNS-mediated risk. Premiums for organisations that cannot demonstrate transport-layer integrity beyond DNSSEC have risen 30-50% year on year since 2022. Carriers are increasingly excluding DNS-mediated phishing and registrar-hijacking losses from baseline coverage; they appear as priced add-ons or aren’t covered at all.
Regulatory framing is shifting from “use DNSSEC” to “demonstrate end-to-end name-resolution integrity.” NIS2 (EU), CIRCIA (US), Australia’s SoCI Act amendments, the UK NCSC’s draft 2026 guidance, the EU Cyber Resilience Act — all four are moving away from prescribing DNSSEC (which they know is barely deployed) and toward attestation requirements that DNSSEC-on-paper cannot satisfy.
Sovereign jurisdictions are quietly reconsidering root-server dependence. The discussion isn’t held in public, but it’s held. A name-resolution path that terminates in US-controlled root servers, with TLS roots controlled by US-incorporated certificate authorities, has been quietly identified as a strategic exposure by Five Eyes-adjacent allies, EU member states, and BRICS-aligned governments alike.
Ransomware actuarial data has shifted. Post-2023, the share of ransomware entry vectors involving DNS-mediated phishing or DNS-mediated watering-hole has crossed 70% by most major IR firms’ published numbers. The DNS surface is now the dominant attack surface, full stop, and security teams know it.
Quantum-readiness mandates are landing. NIST FIPS-203 / 204 / 205, EU PQC migration timelines, Australia’s PQC roadmap — all assume that the underlying transport substrate supports trust-anchor migration. DNS-as-trust-anchor does not; cryptographic-peer-ID-as-trust-anchor does, and the migration path is straightforward.
Architecture, briefly
Bootstrap edge — cert-pinned DoH resolves the federation’s bootstrap multi-addresses (wp-9A). One DNS dependency, hardened to the limit DNS can be hardened.
Peer discovery — Kademlia DHT operated by the customer’s federation + ITOTCCA-co-validator nodes (wp-9B). Peer-ID-keyed; no name indirection.
Connection establishment — libp2p with Noise authenticated handshake, gated by wp-06 enterprise-CA peer-identity verification. Every successful connection is provably between two parties whose certs trace to the customer’s PKI root.
Audit trail — every connection-accept, every connection-reject, every cert-rotation is committed to the ChubbyChecker BFT audit mesh and periodically anchored to a public DLT (via an Anchor Interface) for jurisdiction-independent verifiability.
The customer-facing surface, today and roadmap:
Local HTTP CONNECT proxy daemon — built (governance@4189439, cmd/sovereign-proxy): for unmodified browsers + most legacy software via the standard HTTPS_PROXY env var / proxy config. Point it at a peer-ID-shaped pseudo-hostname (<base32-peer-id>.p2p — Tor .onion-style, since Kademlia here is peer-ID-keyed and a browser only ever sends a hostname); the daemon TLS-terminates locally against a one-time-installed root cert, resolves the peer over Kademlia gated on wp-06 verification, and relays the decrypted request over libp2p straight into h3-rpc-gw‘s existing, unmodified wire protocol. Ordinary internet hosts pass straight through untouched, so one HTTPS_PROXY setting covers both.
SDK for native applications that can be modified or rebuilt — not a direct libp2p SDK per language (that would mean re-implementing wp-06’s handshake protocol in each target language separately, real ongoing maintenance burden for no benefit). Instead: sovereign-proxy also serves a small gRPC API (sovereign_proxy.v1.RelayService, proto@61c0248) over a local Unix socket, in the same process as the CONNECT proxy, sharing the same Kademlia/wp-06 machinery — a native app calls it with its own credentials instead of the daemon’s shared browser token. All four target languages built and verified end-to-end against a real running daemon (governance@91e6a96 / @d394ac3 / @71fd755 / @b32963a): Java (sdk/java), Python (sdk/python), Node (sdk/node), .NET (sdk/dotnet). Each generates or loads client stubs the idiomatic way for its own ecosystem — Go/Java/Python commit generated code (matching gen/go‘s own convention); Node loads the proto at runtime via @grpc/proto-loader; .NET generates at build time via Grpc.Tools — rather than forcing one mechanical convention where it doesn’t fit the target language’s own norms.
SOCKS5 (RFC 1928) — built (governance@1195a81): alongside the CONNECT proxy, for clients that specifically need a SOCKS setting rather than HTTPS_PROXY (Firefox’s native SOCKS proxy config is the canonical example). Same port, auto-detected per connection, same TLS-terminate-and-relay path for .p2p targets, same passthrough for ordinary ones — one daemon, one port, both protocols.
TUN virtual interface — built, both variants (governance@046eab7 userspace-networking, governance@adaa09d real kernel device): an operator-configured table of virtual-address → peer-ID allocations served on either an in-process TCP/IP stack (no kernel privileges, reached by direct dial or an operator-provided bridge) or a real kernel TUN device (needs CAP_NET_ADMIN once to create; ordinary OS-level routing reaches it transparently thereafter, once the operator assigns its addresses/routes) — the same TLS-terminate-and-relay path as CONNECT and SOCKS5 either way.
ADNS – Near-Absence of DNS – Enterprise System (if Chosen)
ChubbyChecker: Anchor Interface to: Blockchain underwriting Databases:
Factory 0:
Factory 1:
Factory 2:
Anchor Interface to Blockchain
Zero Trust,
Zero Tolerated Faults,
Utter Data Privacy
Near-Absence of DNS if Chosen
(ADNS)
Bucordo Security (Tendermint & Raft) merged with libp2p/kademlia and:
“ChubbyChecker“
Hiero Kademlia Transport, End-to-End Encryption, 6-Stage Independent Cross-Checking, No Operator Read Access, No Operator Write Access
The Checker Anchors Merkle Roots to Blockchain and stores all Transaction Trace evidence on WORM Drive
Tendermint/Raftoptional Kademlia Protocol
TCP & QUIC Transport QUIC transport to/from the Edge
in the DataCentreGlobal DHT (Peer Discovery by Id) if Chosen
Main Enterprise Data on PostGIS Merkle Roots AnchoredAll Transaction Trace Evidence Stored Immutably to Blockchain ..to Write-Once Read-Many Drive
Tx-Rails Provides Access to Databases via Composable GO Actions, we call ‘Atoms’. When Authorised, You Form Your Own Business Processes from Atoms, in the Overseer Design Studio.
The Overseer then enforces those procedures, including conditional branching. This is the deepest rung of an adoption ladder that begins as a change-nothing audit underlay — you climb to it only if and when you choose. See “From underlay to substrate” below.
Tx-Rails Incorporates:
1. The Following Twelve Operational “Rails”
The system is organized into a hierarchy of twelve distinct layers, each with its own Byzantine Fault Tolerance (BFT) quorum (n = 3f + 1) In the table below, the Statement of Risk pertains to the BFT systems in isolation. The actions of ChubbyChecker will detect any occurrence of r > f, and raise an alert:
Layer
Nodes (n)
Tolerance (f)
Statement of Risk (r = f + 1)
Role
Member-Classes (Orgs)
4
1
2 servers are corrupted
Source of Truth for Private Enterprise Data
Overseers
7
2
3 servers are corrupted
Business Process Design & Governance
Governance
7
2
3 servers are corrupted
Transaction regulation and commercial (unregulated) governance
Regulators
7
2
3 servers are corrupted
Supra-company regulation
Aggregators
10
3
4 servers are corrupted
Cross-Network Consolidation and Merkle Root Calculation
Tophats
13
4
5 servers are corrupted
Forensic Replay and Hedera Blockchain Anchoring
**Auditors-Orgs
4(orgs)
1
2 servers are corrupted
74 Trace Metadata Cross-Checks
**Auditors-Overseers
7(oseers)
2
3 servers are corrupted
32 Trace Metadata Cross-Checks
**Auditors-Governors
7(oseers)
2
3 servers are corrupted
32 Trace Metadata Cross-Checks
**Auditors-Regulators
7(oseers)
2
3 servers are corrupted
32 Trace Metadata Cross-Checks
**Auditors-Cross-Network
10(agg)
3
4 servers are corrupted
6 Trace Metadata Cross-Checks
**Auditors-Cross-Network
13(tophats)
4
5 servers are corrupted
3 Trace Metadata Cross-Checks and 14 classified as Integrity checks
2. These Four Technical Pillars
1st Network: Kubernetes (Project-Wide)
3rd Network: Global Distributed Hash Table Network
The following Underlay! System is completely compatible with our Sovereign Name Resolution Overlay. Your traditional Systems reside above the Underlay and, if appropriate, also beneath the Overlay.
Indicative pricing
Pricing is per-pyramid + per-federation, calibrated against your deployment Shape (see [federation-trust-model.md](../federation-trust-model.md)). Sovereign Name Resolution is included in the base platform subscription; what changes per tier is the number of federations + cross-jurisdictional peer co-validator nodes operated on your behalf:
Customer profile
Typical deployment
Indicative A$ / year
Single-organisation, single-jurisdiction
1 pyramid, 1-2 federations (Shape 1)
50k – 150k
Multi-organisation or multi-jurisdiction federation
1-2 pyramids, 3-5 federations (Shape 2 grouped)
250k – 700k
Sovereign / supranational / critical-national-infrastructure
3-5 pyramids, 5-10 federations (Shape 2 or 3 sovereign)
1M – 3M
The pricing is calibrated against breach-cost avoidance, not against feature count. Engagements typically begin with a customer-led estimate of the actuarial cost of their current DNS-mediated risk surface — cyber-insurance premium attributable to DNS-mediated phishing / registrar-hijack / cache-poisoning vectors, SOC FTE attributable to DNS-incident remediation, and lost-contract opportunity attributable to procurement-RFP supply-chain integrity questions you cannot currently answer. The subscription is sized below that number.
Excluded: integration work by your IT team (your engineers, against our built sovereign-proxy CONNECT + SOCKS5 + TUN daemon and Java / Python / Node / .NET SDKs) and any sovereign infrastructure you elect to host in-house vs on ITOTCCA-operated co-validator nodes. Pilot deployments use a separate timeboxed model (3-month parallel-run, walk-away clause — terms on request).
What we’d ask of you to start
Identify one flow whose compromise would be unacceptable — typically a regulator-facing endpoint, a counterparty-trust-bearing API, or a multi-party settlement channel. Move that one flow onto the Sovereign Name Resolution substrate via the integration shape that best fits — today, that means sovereign-proxy‘s CONNECT, SOCKS5, or TUN front end, or, for a native application, its RelayService SDK in Java, Python, Node, or .NET. Keep DNS for everything else. At the end of the pilot you have:
A verifiable connection-acceptance log for that flow’s complete history, signed by your federation, anchored to a public DLT
A measurable reduction in the DNS-mediated attack surface for the flow that mattered most
A concrete cyber-insurance conversation about whether the carrier will reprice the reduced-DNS-dependency posture
A reference architecture you can extend to additional flows at the pace your operational appetite supports
We then have a real conversation about what that’s worth on your next NIS2 / SoCI / CIRCIA assurance audit, your next ransomware-readiness drill, your next cyber-insurance renewal, your next sovereign-wealth tender, or your next coalition-information-sharing agreement.
See the companion documents on this website for the audit-capture and business-process layers that consume the verifiable-transport substrate Sovereign Name Resolution provides.
Every transaction is processed locally, but verifiable globally.
The two parts below are named the other way around from what they each actually do — the Local View (Part 2) is what makes a single transaction checkable by anyone, anywhere, without trusting Tx-Rails; the Global View (Part 3) is the deployment topology deciding which VM in which pyramid handles it. Read that inversion as the claim, not the section titles.
Watch for the same underlying move made three separate times as you read on: Part 1’s peer discovery is optionally absent DNS; Part 2’s anchor choice below is chain-selectable — pick the ledger that fits your own risk/cost tradeoff; Part 3’s deployment Shapes are an explicit spectrum from a fully isolated Tower to a maximally shared mesh. None of these three sections reference each other, but each one is the same principle applied to a different layer: never hard-code a central dependency — make it a configuration axis the customer owns. Optionality of centralization is that principle’s name.
PART 2: Tx-Rails for Security, Action and IIoT
The Local View
Tx-Rails — Underlay Integration Patterns
One-line summary: Tx-Rails is an underlay, not a replacement. Customer companies keep the front-ends they trust (their banking app, ERP, clinical system, procurement portal, comms platform) and bind Tx-Rails beneath as a continuous cryptographic audit layer. Today that binding happens through one real, built, verified, packaged integration path — hash-only attestation, with three deeper paths that now run and commit in our own estate as reference implementations rather than packaged products. This document describes what each path actually does and what it doesn’t. Two independent axes run through everything below: four integration Modes (A–D) decide how content reaches Tx-Rails; the four-rung Data Visibility Ladder, immediately after the Modes, decides who can read it once it does.
The underlay philosophy
The single most important positioning point: Tx-Rails does not ask customers to replace systems they already trust. That is the difference between an “underlay” pitch and a “blockchain” pitch.
A blockchain pitch says: “Migrate your data and your front-end onto our new platform.” The underlay pitch says: “Keep your platform. Bind us underneath. Every transaction your existing system commits also gets a cryptographic fingerprint, cross-checked and anchored — without changing how your users interact with your product.”
This is the only positioning that makes sense for regulated incumbents (banks, housing associations, hospitals, government agencies) who have spent decades and tens or hundreds of millions of pounds/dollars building front-ends their staff and customers understand. Asking them to throw that away is a non-starter. Asking them to add one small, well-scoped call to an underlay that gives them tamper-evident, cross-jurisdictionally-verifiable proof is a tractable conversation.
The auditor subsystem (ChubbyChecker) is what makes the underlay distinct from “just put it on a blockchain”. ChubbyChecker performs independent cross-checks per transaction/block, operated by parties independent from the BFT validators. Compromise detection is automatic: when the count of provably-compromised servers exceeds the BFT threshold f, ChubbyChecker raises an alert — it does not halt the platform, and a human triages. This is the load-bearing safety net no blockchain pitch can credibly offer.
From underlay to substrate — one engine, your pace
Two things we say can sound like opposites: “keep the systems you trust — we bind beneath as an audit underlay” and “compose your own business processes from our Atoms.” They are not opposites, and they are not two products. They are the same deterministic action engine seen at different depths of adoption — and you choose the depth, at your own pace.
Today that ladder has two real, fully-packaged rungs — the fuller menu once sketched here, including the “edge-mediated” (Mode C) and “write-mediated” (Mode D) rungs described in the roadmap section below, now also has its core mechanisms built, each as a reference implementation a customer’s own team adapts rather than a rung a customer can simply step onto:
Pure underlay — change nothing. Hash-only attestation. Your apps and screens are untouched; we faithfully anchor the cryptographic fingerprint of what they already commit. The Atom library runs behind the audit — as the schema ChubbyChecker validates against — and you never see it.
Substrate — compose with us. For greenfield builds, or customers who want deeper adoption, you author business processes from Atoms in the Overseer Design Studio and the Overseer enforces them. Here Tx-Rails is the application substrate, not just the audit floor.
The through-line: the same audited, deterministic action engine that records a fingerprint of what your existing systems already commit can also run new processes directly — when, and only when, you choose to compose them. The underlay is complete on its own; composing is an expansion you grow into, never a condition of entry. That is why “underlay” and “build on us” are one continuous offer rather than a contradiction.
Mode A — Hash-only attestation: what’s actually built
The original design for this platform sketched four integration modes, trading integration invasiveness for how much of the 37-field Transaction Metadata Trace (see below) lands without changes to the customer’s screens. Only the first of the four is a fully built, packaged path a customer can adopt today. A second (Mode D) now has its core mechanism built and verified too, as a reference implementation rather than a customer-ready product. This section documents what Mode A actually does; the next section is honest about where the other three — including Mode D’s real caveats — actually stand.
What changes in the customer’s system: the customer’s transaction commit path is extended to publish a cryptographic hash of each committed transaction to the Tx-Rails underlay, via a signed call carrying a verified tenant identity.
What Tx-Rails receives: the hash, plus the identity/block-position metadata needed to place it. Not the transaction body, not the parties, not the amounts, not the timestamps as authoritative inputs.
Guarantees Mode A provides:
Tamper-evidence: “this hash was committed at this time” is provable later, by anyone, using a portable proof artifact and public cryptographic primitives — not a claim that requires trusting the Tx-Rails database or software.
Forward-only audit trail: the customer can prove their own hash sequence matches what was actually anchored.
Cross-jurisdictional verifiability: Merkle roots of block slabs are anchored to Hedera, so a third party in another jurisdiction can verify the hash sequence existed without trusting the customer or Tx-Rails.
Durable evidence, not a single-validator dependency: the raw block data and transaction-location index a proof is built from are both independently archived (cmd/block-archiver), not held only on the validator’s own disk — and a proof can be located from the transaction’s own content hash, not only from an internal Tx-Rails record of where it landed.
Choice of anchor, not lock-in to one: Hedera is the default, but the anchor submitter is chain-selectable, and a built, tested Ethereum path already exists alongside it — a deployment picks the anchor that fits its own risk/cost tradeoff rather than inheriting a single fixed choice.
Guarantees Mode A does NOT provide:
Independent re-verification of transaction contents — ChubbyChecker cannot run cross-checks against data it doesn’t have. (Where re-verification is structurally possible at all — two independent parties each submitting a claim about the same event — it’s Regime C’s bilateral settlement predicate that already provides it, not a Mode A/B/C/D gap; see below.)
Detection of “the customer published a hash of a fake transaction body that they later substituted into their own system” — Mode A trusts the customer’s hash submission for what it represents.
The full BFT cross-validation story: with only hashes, the BFT mesh has nothing semantic to validate.
When Mode A is appropriate:
Customers in proof-of-existence regimes where merely showing “this record existed at this time” satisfies the regulatory requirement.
High-volume / low-margin transaction streams where richer integration overhead would be prohibitive.
Initial pilot phase before a customer commits to deeper integration — noting the deeper modes below, while their core mechanisms are built, aren’t packaged products a customer can simply install yet.
Customers whose regulatory environment forbids transmitting transaction details to an external system at all — Mode A already satisfies this by construction, since it never receives them.
Roadmap: the deeper integration menu
The original design sketched three additional integration modes beyond Mode A. All three are now deployed in our own estate and committing through consensus (goldbftd + org-server-abci + org-gateway, plus a real Postgres for the two that need one). On 30 September 2026 a change made at the source of each produced a new attestation, committed and read back identically from two independent validators — Mode B at block 760822, Mode C at 760824, Mode D at 760826. That test matters because the gateway returns a success code and a real transaction id as soon as a submission passes admission control, and admission control runs neither the action’s validation nor the authorization check — so all three had previously been reported as working on evidence that proved nothing had committed. See below for exactly what each one covers and doesn’t. None is a packaged, install-and-go product; no customer has been onboarded through any of them yet. This document stays honest about that gap rather than presenting more than what’s actually there. Most customers will eventually want more than one mode running at once, per workflow. No customer has been onboarded through any mode, including Mode A: everything described here runs in our own estate against our own data. Mode A is the only one that is a packaged, adoptable product; the other three are reference implementations for a customer’s own team to adapt. Adopting one of B/C/D answers how content reaches Tx-Rails; it says nothing yet about who can read it once it arrives — that’s the separate Data Visibility Ladder, covered right after Mode D below.
Mode B — CDC / change-data-capture observer: deployed and committing
What changes in the customer’s system: nothing. cdc-observer attaches to the customer’s Postgres write-ahead log as a genuine logical-replication client and observes committed changes asynchronously, with no change to the customer’s application.
What’s built: a real Postgres logical-replication consumer (pglogrepl, decoding pgoutput directly — no Debezium/Kafka dependency), verified against a real Postgres with wal_level=logical. The WAL operation itself (INSERT/UPDATE/DELETE) maps directly onto the matching RequType value, so no per-table semantic-intent config is needed. Identity attribution uses one coarse service-account credential per customer deployment — real tenant boundary, but per-user attribution is lost — reusing the exact same static-token pattern Mode D’s outbox-relay already has, no new verifier code required. A mapping layer back to real identity from the customer’s own audit columns has no prior art anywhere in this codebase and remains unbuilt. Ships in connectrpc/services/org-gateway/cmd/cdc-observer.
Forensic, not preventative: the customer’s transaction is already committed to their own database by the time this mode observes it via CDC — it detects and proves a problem after the fact, never blocks it in flight.
Where it fits: large enterprises whose systems genuinely cannot be modified (frozen vendor packages, regulatory-frozen code, end-of-life systems still processing material volume), and customers who can’t tolerate any commit-path latency at all — once a customer actually adopts the reference implementation.
Mode C — Gateway-mediated: deployed and committing
What changes in the customer’s system: application traffic routed through edge-gateway at the network edge, deriving attribution from a JWT and semantic intent from an explicit route config — the application itself unmodified.
What’s built: a real inline HTTP reverse proxy, not the fragile heuristic REST-inference engine early sketches worried this mode would need — semantic inference from arbitrary REST shapes doesn’t generalize across customers’ API conventions, so this reference implementation uses an explicit per-customer route-mapping config (method + path prefix → atom) instead. It reuses org-gateway’s existing JWT verification entirely — edge-gateway never inspects a credential itself, only forwards it through, so no new auth code was needed. It sits inline in the customer’s live production traffic, a materially different reliability commitment than an out-of-band audit sidecar — an outage there breaks the customer’s application, not just their audit trail. Ships in connectrpc/services/org-gateway/cmd/edge-gateway, verified end-to-end including the fail-closed case (an unauthenticated request is blocked before ever reaching the backend).
What it adds over Mode B: deterministic JWT-derived attribution (no dependency on the customer’s tables carrying audit columns), and — because it sits inline — genuine preventative rejection: fail-closed, unconditionally, by design. This is the one of the three that can actually refuse a bad transaction before it reaches the customer’s backend; Mode D’s shipped outbox variant explicitly cannot.
Where it fits: customers with a single, clean externally-exposed API edge, and high-value flows where JWT-derived attribution matters but the application code itself can’t be touched — once a customer actually adopts the reference implementation.
Mode D — SDK / atomic dual-write: deployed and committing
What changes in the customer’s system: the application calls Tx-Rails alongside its own database write, with explicit semantic-intent tagging (REVERSAL / CORRECTION / RESTATEMENT vs ordinary CREATE / UPDATE / DELETE — all real RequType values now, not a sketch).
What’s built: this is the cleanest of the three from a trust-model standpoint — the customer’s own authenticated session makes the call directly, no inference, no identity-federation problem. True cross-system atomicity is a hard distributed-systems problem in practice; the realistic version, and the one that’s built, is an outbox pattern (write intent locally, relay asynchronously) — eventually-consistent, not literally atomic. org-gateway‘s ExecuteAction accepts a client-supplied idempotency key and derives a deterministic transaction id from it, so a crashed or retried relay never double-applies the customer’s write — verified end-to-end against a real goldbftd + org-server-abci + org-gateway stack, including the case where CometBFT’s own mempool rejects an exact-duplicate retry outright before it ever reaches the application layer. A reference outbox-relay implementation (Postgres-backed store, Connect-RPC client, a runnable poller) ships in connectrpc/services/org-gateway/cmd/dualwrite-relay.
What’s still missing: packaged, documented client libraries beyond the reference Go implementation — the generated Connect stubs mean any language can call the gateway directly, but there’s no polished multi-language SDK yet — and no customer has been onboarded through this path. Not yet a product a customer can simply install; a reference a customer’s own team adapts to their own outbox table.
What it provides now: the full transaction payload and explicit semantic intent — fine-grained REVERSAL/CORRECTION/RESTATEMENT distinctions that no inference layer could recover after the fact. Independent content re-verification is a different question this doesn’t answer: for a single submitter there’s no independent fact to check a claim against, so Mode D’s content delivery doesn’t unlock re-verification the way it unlocks semantic-intent tagging. Where genuine re-verification is possible — two independent parties each submitting a claim about the same event — that’s Regime C’s bilateral predicate, a different mechanism entirely.
Where it fits: high-value flows where explicit application-decided semantic-intent tagging matters for regulatory purposes (settlement reversal semantics, financial-correction audit, restatement of regulatory submissions) — once a customer actually adopts the reference implementation. Not a fit for independently re-deriving single-party claims like balance sufficiency or KYC status — Tx-Rails has no independent fact to check those against regardless of which mode delivers the content; genuinely multi-party checks (authorisation chains, counterparty agreement) are Regime C’s domain, not Mode D’s.
If and when any of the three become packaged, install-and-go products, this document will describe them that way — the same standard applied here for each one’s core mechanism.
The Data Visibility Ladder — four rungs, independent of which Mode you pick
The four Modes above answer how content reaches Tx-Rails at all — nothing, a WAL observer, a gateway, or a direct SDK call. A separate question, orthogonal to all four, is who can actually read whatever content does arrive once one of them is sending it. That’s the Data Visibility Ladder: four rungs, each an explicit answer to “who can decrypt this field, and what does the platform give up or gain in exchange.” A customer climbs the rung that matches their own risk tolerance against how much platform-side service — cross-checking, referential validation, independent audit — they want in return. The full design lives in structured-atom-privacy-ladder-design.md; this section is the customer-facing summary, kept in sync with it.
Rung
Who can decrypt
What the platform gives up
Status
1 — Plaintext
Everyone in Tx-Rails’ own operational chain
Nothing — full validation, full ChubbyChecker cross-checking
Default today, for every content-receiving Mode (B, C, D), once adopted
2 — Platform-key encrypted
Tx-Rails (customer explicitly consents)
Nothing structurally — the platform can always decrypt to validate/cross-check, same as plaintext, just protected from anyone outside the platform’s own key custody (a stolen DB backup, a network intercept)
Mechanism built, carrying no production data. Ten fields of every transaction record are already sealed individually by it, each under its own per-record data key bound to the record and field it belongs to: the client node, the signing string, the user and role, the amount mantissas and exponents, and the database, schema, table and record identifiers. That last group matters more than it looks — a pointer to the exact customer row a transaction touched is a de-anonymisation index if left in the clear, whatever else is protected. The sealer and its schema exist and are exercised by tests, and organisations.tenant_sealed_fields is present in the live schema — but measured 2026-10-02 it held zero rows, against 33,964 rows in trace.slab_anchors on the same tier. No record has been sealed in a running deployment. This is the intended floor for the content-receiving Modes and the current direction of travel, not a capability available today.
3 — Customer-key encrypted
Only the customer — Tx-Rails genuinely cannot decrypt, even in principle
Depends on the field — nothing, if the platform never validated that field’s content anyway; the rest of the cross-check catalogue, for the narrower case where we are expected to validate data only the customer can read
Already solved today for fields Tx-Rails never validates. Genuinely open only for the narrower case where we are expected to validate customer key-encrypted data.
4 — Partner-key encrypted
Only a named third party the customer chooses (a manufacturing partner, a regulator) — asymmetric, multi-recipient
N/A — separate key-management machinery layered on top of Rung 3
Undesigned. No code anywhere.
Rung 1 — Plaintext: what every content-receiving Mode ships with today
Whatever structured content a customer’s chosen Mode (B, C, or D) delivers, it arrives unencrypted, and Tx-Rails’ own validators read it directly — the same fields our referential-integrity and cross-field checks already parse. This is where every real deployment sits today: Mode A never receives content at all (stricter than even this rung — see “Why Mode A is the most private option” below), and none of B/C/D has shipped a visibility control yet. Full ChubbyChecker checking is available at this rung by construction, since nothing is hidden from the validators those checks run against.
Rung 2 — Platform-key encrypted: concretely scoped, not yet wired
The customer explicitly consents to Tx-Rails being able to read a field, in exchange for the platform keeping the ability to independently verify it. The concrete, scoped use case is amounts-constancy checking — proving a business record’s numeric values didn’t silently change between submission and recording, a check cc029‘s own amount-field-consistency logic already performs today, in plaintext. The design: encrypt one generic positional array (mantissa/exponent big-int pairs, no field names — the same shape the Trace’s own int64Amounts/int32Exponents already use) under Tx-Rails’ own key immediately after it’s copied from the source record, then decrypt both the pre- and post-submission arrays to compare plaintext values — never comparing ciphertext directly, since AEAD’s fresh-nonce-per-encryption means an unchanged value never re-encrypts to the same bytes twice. This reuses the Encryptor/KeyProvider mechanics already live for the ten Trace fields the sealer covers (ClientNodeID, TxSignStr, UserID, RoleID, Int64Amounts, Int32Exponents, and the Database, Schema, Table and RecordID row pointers — counted from the sealing code itself, 1 October 2026; this page previously said six, which predated the four row-pointer fields) — extended to one more generic array, not a new system. Since the independent constancy check should run inside ChubbyChecker rather than the validator itself — that’s the entire point of an independent auditor — chubbychecker-joint now has its own KeyProvider/Vault wiring (2026-08-17, mirroring org-server-abci‘s construction exactly), and the constancy check itself is built on top of it: cc-bpd-038 compares the raw, consensus-agreed submitted amounts against the decrypted, quorum-verified persisted amounts across every configured replica, positionally. Verified end-to-end against a real single-node goldbftd + org-server-abci + chubbychecker-joint stack plus a real Vault dev-mode container, both directions: a genuinely-committed, genuinely-encrypted transaction’s amounts matched cleanly (no finding); the same persisted row, then directly corrupted, was correctly caught as CatastrophicFailure once chubbychecker-joint rechecked that block height. Full design: structured-atom-privacy-ladder-design.md, Rung 2.
Rung 3 — Customer-key encrypted: solved for one case, genuinely hard for another
Tx-Rails genuinely cannot decrypt — not “chooses not to,” structurally cannot. This splits cleanly into two cases. Fields the platform never validates — free text nobody cross-checks — are already solvable today, with zero new engineering: store the value as a blob addressed by its own content hash, exactly the way content-store already handles bulk attachments (documents, images, scans) under Mode D, and put only the hash in the atom’s payload. This is Rung 1’s own opaque-reference pattern applied to a structured field’s free text, not a new capability — it’s why Mode D’s bulk-attachment path can honestly claim genuine customer-key encryption today, with zero platform code changes, since content-store never parses what it stores. Fields the platform structurally needs to read — a foreign-key check like requireCoAAccountExists, a cross-field consistency check, a typed column another table’s constraints depend on — are where the real tension lives: the platform cannot validate a value it cannot see, so if it can decrypt to validate, this rung’s core property no longer holds for that field. This narrower case is a real ~6–9 month build (struct-tag classification, a customer-supplied-KEK KeyProvider, ChubbyChecker cross-checks that shift from validating content to validating ciphertext/AEAD-tag integrity, mirroring the shift the already-encrypted Trace fields already require of any consumer) — scoped per-field, per-atom, once a real customer need names the specific field, not a platform-wide rollout.
Rung 4 — Partner-key encrypted: undesigned
The customer encrypts for a named third party’s public key — a manufacturing partner, a regulator, a downstream counterparty — not for themselves. See “Sharing content with manufacturing partners” below for the sketch. This is a different key-management model (asymmetric, multi-recipient) layered on top of whichever of Rungs 2 or 3 it applies to, not a variant of either — building Rung 2 or Rung 3 does not get this rung for free, since it’s separate key-management machinery. Nothing exists in code for this today.
Where each Mode sits on the ladder today: Mode A is stricter than Rung 1 by construction — it never sends content at all, so there’s nothing to encrypt or leak in the first place. Modes B, C, and D — once a customer adopts one — all ship at Rung 1 for structured fields; Rung 2 is concretely scoped but not yet wired into any of them; Rungs 3 and 4 remain undesigned for structured fields specifically. The one standing exception is Mode D’s bulk-attachment path through content-store, which already delivers Rung-3-equivalent privacy today for documents and images — just not for the structured fields sitting alongside them in the same Trace.
The Transaction Metadata Trace contract — what Tx-Rails actually sees
Every transaction processed by Tx-Rails generates a Trace record under a fixed, design-frozen 37-field schema — the substrate ChubbyChecker’s cross-checks run against. The schema does not vary by customer, deployment, or integration mode: every transaction across the platform produces a Trace of exactly this shape, which is what makes the contract auditable by a technical reviewer independent of which integration mode a given customer uses.
What varies by mode is which of those 33 slots actually get filled. Under Mode A — the only mode that is a packaged, adoptable product, though no customer has been onboarded through it — only the identity/location-pointer, cryptographic-commitment, BFT-consensus, and operation-discriminator fields are populated (tenant boundary, transaction id, block/slab position, the hash itself, block id/height, op-code tags). The fields that would carry business content, quantitative facts, or semantic intent are, by design, empty: Tx-Rails never receives that content under Mode A. Each of the three reference implementations, once a customer adopts it, fills the rest — business content and explicit semantic intent (RequType) all flow through ExecuteActionRequest today — this is one fixed contract with mode-dependent fill, not four different schemas. Two of the 33 (isTower/counterIsTower, used for Regime C peer selection — see §4 of the Global View below) are newer additions at the proto level (CoreMeta fields 64/65, orgnodes-overseer@8e2e40f); the trace-store’s own Postgres schema carries both, though their value stays false/false today since nothing upstream sets CoreMeta‘s IsTower/CounterIsTower yet.
Channel
Visibility today (Mode A)
Purpose
Transaction Metadata Trace
Tx-Rails (always); ChubbyChecker auditors (always) — for the identity/crypto/BFT/discriminator fields that Mode A actually populates
The cryptographic envelope around the transaction — the substrate the ChubbyChecker checks run against
Content
Customer (always); Tx-Rails: never, under Mode A. Under the Mode D reference implementation, once a customer adopts it, Tx-Rails receives structured payload fields as sent — no field-level encryption or visibility controls yet for those. Bulk attachments (documents, images, scans) are the exception: routed through content-store, which never parses what it stores, so customer-key encryption for those is a real, working convention today, not undesigned — see the Mode D section above. Structured-field customer-key encryption remains undesigned regardless of mode.
The actual business payload — descriptions, party names, document attachments, free-text fields, anything strategic. Not sent to Tx-Rails today, under any circumstances.
The 33 fields, by category
Category
Fields
What they expose to Tx-Rails
Identity & location pointers(populated under Mode A)
Opaque tokens — who, where, and which slot, in an externally-anonymous form. A user ID is a verified but opaque tenant marker, not a name. A table reference is the schema slot, not the business meaning. The mapping from token to human-readable identity stays on the customer side. isTower/counterIsTower are a routing flag pair (which of national-meta-federation vs national-aggregators is the Regime C peer), not identity in the same sense as the rest of this row — grouped here for lack of a better-fitting category.
Cryptographic commitments(populated under Mode A)
hash (sha256 digest), txSignStr, merkleRootHex
Pure cryptographic objects. No business meaning. The hash is a sha256 of the signing string, computed by us — it is not itself the Merkle leaf. The leaves this pipeline anchors are CometBFT block hashes, so an inclusion proof for one transaction reaches the anchored root through CometBFT’s own transaction and header trees rather than through this field. The signature establishes provenance; the Merkle root is the block-level commitment.
BFT consensus metadata(populated under Mode A)
blockId, slabId, blockHeight
Where the transaction lives in the ledger — block, slab (the block-group anchored to Hedera), height. Reveals nothing about content.
Operation discriminators(populated under Mode A)
opCodeExec, opCodeCommit, reqType
Tags identifying the kind of operation (commit / pre-commit / read / etc.) without exposing what the operation is about.
Quantitative facts(empty under Mode A — see below)
int64Amounts, int32Exponents
Numeric values, decoupled from unit and meaning, once a customer adopts a content-receiving mode (Mode D today). Tx-Rails would see that a transaction had value 12345 × 10⁻² — not whether that’s USD, GBP, tonnes of grain, hours of labour, or kilowatt-hours. Not sent at all under Mode A.
Why Mode A is the most private option, not the least
Because Tx-Rails never receives transaction content at all under Mode A, there is no leakage question to manage the way there would be for the content-receiving modes above. A Tx-Rails operator looking at a Mode A Trace sees only that some opaque, verified entity committed some operation at some block height, with cryptographic proofs attached — identity tokens, hashes, consensus housekeeping, and operation tags, none of which carry business meaning by construction. That’s not a current limitation to work around; it’s the actual privacy property Mode A is built to provide.
All three roadmap modes, now that all three are deployed and committing, already expose this gap concretely: any customer who adopts one of them sends Tx-Rails full, unencrypted structured content today (the fields our server-side validators parse and check referential integrity against — amounts, descriptions, party references), sitting at Rung 1 of the Data Visibility Ladder above. Each still needs its own move up that ladder for content-level visibility — starting with the amounts field, which is the one place any substantive information would leak, and even then only pseudonymously (the numeric value visible, the unit and meaning not). The one exception: Mode D’s bulk-attachment path (documents, images, scans — anything routed through content-store rather than a structured field) already sits at Rung 3 today, with zero platform code changes, since content-store never parses what it stores — see the Mode D section above.
Amounts specifically: one rung now concretely scoped
For customer audiences whose threat model would treat any quantitative leakage as a sovereignty breach — defence aviation, export-controlled goods, certain competitively-sensitive industries — the amounts field is the sharpest instance of the general Data Visibility Ladder above, since it’s the one place a content-receiving Mode currently exposes any substantive information at all. Today, once a customer adopts one of the three content-receiving reference implementations, amounts sit at Rung 1 (plaintext) like every other structured field. Rung 2 (platform-key encrypted) is the one concretely scoped beyond the sketch — see the Ladder section above for the full design, and structured-atom-privacy-ladder-design.md for the underlying detail. Rungs 3 and 4 remain undesigned for amounts specifically, for the same reason they’re undesigned generally: amounts are exactly the kind of field the platform structurally needs to read (constancy checks, conservation-of-amounts cross-checks), the harder case Rung 3 describes. The honest answer for a customer who needs true customer-key privacy on amounts specifically, today, is still “Mode A already gives you the strictest version of this for free, because we don’t receive amounts at all yet.”
What this means for ChubbyChecker
ChubbyChecker’s cross-checks operate on the Trace, not on the content — and today, on only the categories Mode A actually populates. They verify:
Signature validity against the validator’s public key (cryptographic commitments category)
Merkle inclusion of each transaction in the slab root anchored to Hedera (cryptographic commitments + BFT metadata)
BFT quorum and proposer evidence at the relevant block height (BFT metadata)
Checks that depend on quantitative facts — conservation of amounts across operation pairs that should balance, range checks, pattern checks — have nothing to run against under Mode A, since amounts are never sent. They activate once a customer adopts a content-receiving mode (Mode D today). None of the checks above need to see content to work today; integrity at the cryptographic and consensus level is fully provable without business-semantic visibility.
And the checks always have something deterministic to verify against: every atom executes from block-deterministic inputs only — the BFT-consensused block time (never a wall clock) and deterministic record IDs — so every replica re-derives byte-identical state from the same transaction stream. This is enforced in the codebase by an automated test that rejects any wall-clock use in atom code. It is the property that makes ChubbyChecker’s divergence detection meaningful: a state mismatch can only be a fault, never benign non-determinism.
Sharing content with manufacturing partners (roadmap)
This presumes Tx-Rails is receiving content — true for Mode D’s reference implementation today, still false under Mode A. It’s not built even for Mode D, though: the outbox-relay passes the raw payload straight through, with no partner-encryption mediation layer. The sketch, for when it applies: content destined for a manufacturing partner, regulator, or counterparty would use a customer-side asymmetric mechanism — the customer encrypts the content under the partner’s public key, and only the partner can decrypt. Tx-Rails would mediate the exchange by validating that the corresponding Trace is structurally consistent and cryptographically committed, without ever decrypting the content itself. The partner relationship and the integrity guarantee stay decoupled. Not available today.
FAQ — common customer-architect questions
These are the questions customer architects and technical-due-diligence reviewers tend to raise once they’ve absorbed the Mode A / roadmap distinction and the Kademlia overlay (see kademlia-edge-overlay.md). The answers below are the recommended canonical responses; adapt phrasing to the audience but do not deviate from the substance without checking back to memory.
Q1. Are your domain-specific actions completely redundant for a Mode A customer?
Short answer: Dormant for you, not redundant for the platform.
Long answer:
Tx-Rails ships with a large library of transaction-schema actions spanning many business domains — asset maintenance, banking, healthcare, housing, food and beverage, mining, manufacturing, energy, transport, real estate, pharmacies, construction, aviation, procurement, and a full finance/accounting domain (budget, chart of accounts, P&L+BS, accounts receivable, bank reconciliation, payroll, tax). Each one is the validation + persistence schema for a specific business event committed to the tx-rails BFT state machine.
A Mode A customer invokes exactly one of them: a generic HashAttestation action. The rest are dormant for that customer’s day-to-day operations. They are not removed from the platform because:
The breadth is itself a pitch asset. A large, mature action library demonstrates platform maturity to a CIO or investor evaluating fit, and shows the shape the substrate path can grow into.
They are the eventual upgrade path. A customer who starts in Mode A but later wants stronger audit guarantees can move to one of the roadmap modes, each now reachable via its own reference implementation, without a platform redesign. The schemas are already there, waiting on the ingestion side that connects to them.
Unused schemas have zero runtime cost. A validator that never receives a given action type never invokes its handler. The cost is container image size and codebase surface, not production compute or latency.
The honest framing for a Mode A customer: “Most of the platform’s schema depth is dormant for you today. You get the underlay capabilities — cryptographic anchoring, tamper-evidence, cross-jurisdictional verifiability — without any schema-integration cost. If you ever want stronger audit guarantees, the upgrade path is in place; it just isn’t built yet.”
Q2. Is Kubernetes a requirement for us as a customer?
Short answer: No.
Long answer:
The tx-rails platform infrastructure itself runs on Kubernetes (microk8s clusters for workload BFT validators and Patroni replicas) plus LXD (machine charms for the ChubbyChecker auditor mesh — the parallel orchestration stack reinforces the BFT-independence story). This is a deployment-side concern for the tx-rails operator; the customer does not deal with it directly.
The customer’s existing infrastructure is irrelevant to our K8s usage. The customer’s legacy front-ends and databases continue to run wherever they run today — mainframes, traditional VMs, hosted SaaS, the customer’s own container platform. Mode A asks the customer to add a hash-publish call to their commit path; this is a small library call, not an orchestration change.
The customer’s edge devices, if any participate in the Kademlia overlay, do so via libp2p, which is a library compiled into the device’s runtime (mobile, IoT, branch-server, point-of-sale). No containers, no Kubernetes required for that either.
The one forward-looking case where K8s becomes relevant on a customer’s side: if the customer later chooses to host their own tx-rails BFT validator or auditor node — analogous to a bank hosting its own SWIFT node rather than using a shared one — they would need K8s or LXD on their infrastructure to host the validator stack. This is optional, typically a Y2-Y3 conversation for customers with operational maturity to run a BFT node, and not part of an initial deployment.
In short: tx-rails has an opinion about its own deployment substrate (K8s + LXD). It has no opinion about the customer’s deployment substrate, and the customer is free to run anything they like.
Q3. If most of the action schemas are dormant for our Mode A integration, are we paying for unused complexity?
Short answer: No — the unused schemas have zero runtime cost to a Mode A customer.
Long answer:
The schemas exist in the validator container images, but a validator that never receives, say, a MaintenanceCostRecord action will never invoke its handler. There is no per-schema runtime cost; only the cost of the actions that actually flow through the system, which for a Mode A customer is HashAttestation and nothing else.
The cost of carrying the unused schemas is in container image size (megabytes) and developer cognitive load when reading the codebase, not in production runtime, throughput, latency, or compute spend. The customer is not paying for unused complexity in any operational sense.
Q4. Can we start in Mode A and migrate to a deeper mode later without a forklift upgrade?
Short answer: That’s the intent of the design — and it’s now a real path for all three deeper modes, each via its own reference implementation, not just a design intent.
Long answer:
The platform is architected so that a Mode A → Mode D migration, using Mode D’s now-built core mechanism, operationally looks like:
Identify which transactions in the customer’s legacy system the customer wants to dual-write to tx-rails.
Map each transaction type to a tx-rails action from the existing schema library (or, in the rare case the customer’s transaction type isn’t already modelled, write a new action — a one-day engineering task for a typical domain).
Add the tx-rails write to the customer’s commit path, via the outbox pattern Mode D actually ships with (the reference implementation in connectrpc/services/org-gateway/cmd/dualwrite-relay — see the roadmap section above).
Keep the Mode A hash-attestation in place for older transactions — historical data anchored in Mode A remains verifiable, while new transactions are mirrored fully via the newer mode.
The same shape applies to a future Mode A → Mode B (CDC, no commit-path change, an added stream subscriber) or Mode A → Mode C (a gateway added in front of the API edge, a DNS/load-balancer change) migration.
In all cases, the underlay infrastructure already deployed for Mode A would continue to operate unchanged — the migration is additive, not a replacement. All three modes’ core mechanisms are real today, though a migration still means a customer’s own team adapting a reference implementation (the outbox-relay, the edge-gateway route config, or the cdc-observer table mapping), not flipping a switch, and no customer has actually made any of these migrations yet. Say that plainly rather than implying any of this is a phone call away.
Q5. Does the Kademlia overlay add value if we never adopt a deeper mode?
Short answer: Partially, today — the overlay itself is a mix of built and roadmap, independent of which data-plane integration mode a customer runs.
Long answer:
Even a customer locked to Mode A can use the Kademlia overlay described in kademlia-edge-overlay.md — but be precise about what’s actually shipped versus sketched there, per that document’s own implementation-status table:
Serverless peer discovery + JWT-gated stream auth — built and live today. Edge devices, branches, and partner-org nodes find each other without a central directory.
Content-addressed verification (fetching a record and checking it against a published commitment) — roadmap, individually scoped against the security workplan.
Pub/sub at the edge (gossipsub) — roadmap, same workplan track.
Cross-org and cross-jurisdiction routing — partial: discovery works today; enterprise-CA identity and permissioned membership are roadmap.
For many customers in regulated verticals, peer discovery alone is a genuine capability their existing legacy stack doesn’t provide, at no additional integration cost — it piggy-backs on the same peer mesh the BFT validators use. The other three overlay capabilities are real, scoped, workplan-tracked direction, not currently live; don’t present them as available without checking that workplan’s current state first.
Q6. What if our edge devices can’t run libp2p (embedded, very low RAM, no networking flexibility)?
Short answer: A lightweight gateway pattern works — a libp2p-capable proxy device represents the embedded devices in the overlay.
Long answer:
libp2p requires a few megabytes of RAM, a TCP/IP stack, and the ability to maintain outbound connections. Most modern embedded devices (anything with an ARM Cortex-M4 or above) comfortably meet this. For genuinely constrained devices (older sensors, simple meters, single-purpose IoT with no spare memory), the standard pattern is:
Deploy a libp2p gateway device at the edge cluster — typically a branch-server or industrial PC.
Constrained devices speak whatever local protocol they speak (MQTT, Modbus, BLE, LoRaWAN, raw serial) to the gateway.
The gateway translates between local protocol and overlay primitives. It holds the device’s certificate or proxies on behalf of an authenticated upstream identity.
This is the same gateway pattern most IoT deployments already use for protocol translation — nothing unusual here. As with Q5, note that today the gateway rides on the peer-discovery layer that’s actually live; the enterprise-CA identity story it references is itself part of the roadmap, not shipped.
Edge cases that refine but do not invalidate the framework
Greenfield customers (no front-end to preserve)
The framework applies but the framing shifts. With no existing system to preserve, the pitch is not “underlay” (sit beneath what you have) but “substrate” (build your new system on top of us) — using the compose-with-Atoms path described above, not the deeper integration modes in the roadmap section, which are irrelevant here regardless of build status: greenfield customers have no existing write path to dual-write alongside in the first place.
Bulk-payload workloads (documents, multimedia, large signed PDFs) — core mechanism built
Relevant once a customer actually adopts Mode D’s reference implementation — Mode A never receives payload content, bulk or otherwise. CometBFT’s own transaction-size ceiling (~1MB, unmodified across this platform’s deployments) makes it structurally impossible for Mode D’s outbox-relay to carry bulk content through the chain directly, so it never does: a real, working content-store reference implementation (connectrpc/services/content-store) now exists, built and verified end-to-end against a real chain 2026-08-16. The deployment pattern is exactly the one this document originally sketched, now real rather than anticipated:
Bulk content is uploaded once to content-store (content-addressed by its own SHA-256 hash — the server computes it, a caller can’t claim one that doesn’t match) — a local-filesystem-backed reference implementation today, same “reference, not packaged product” bar as Modes B/C/D themselves; a production deployment swaps in an S3-compatible backend via the same three-method Store interface, no other code changes needed
Canonical transaction metadata + the content hash flows through Mode D’s atomic dual-write — no proto or outbox schema change needed at all: the existing HashAttestationAction atom (unmodified) already carries exactly a content_hash field, the same pattern Mode A itself uses
The hash in the underlay binds the metadata to the content; content is independently retrievable and hash-verifiable from content-store at any later point
Verified concretely: a 3MB blob (well over CometBFT’s own ~1MB tx ceiling) uploaded to content-store, committed on-chain as a 64-byte hash reference via the unmodified HashAttestationAction, and independently retrieved back byte-for-byte with its hash re-verified. This is Mode D in spirit — the audit chain unbroken — handling bulk data efficiently. Like the rest of Mode D, this is a reference implementation a customer’s own team adapts, not a packaged product yet, and no customer has been onboarded through it.
Air-gapped / public-DLT-prohibited environments
Some regulated environments (defence, national-security, certain financial-services back-offices) prohibit anchoring any data — even Merkle roots — to a public distributed ledger like Hedera. Mode A still works within the customer’s own network in this case: hash attestation and BFT cross-validation are unaffected. What’s lost is the cross-jurisdictional verifiability story — a third party outside the customer’s network can’t check Hedera to verify anything, because nothing was anchored there. The audit chain becomes verifiable only by parties the customer admits to their own network. For most regulated commercial workloads, Hedera anchoring is permitted and the full cross-jurisdictional story holds.
Data sovereignty without public-DLT prohibition
A more common variant of the above: customers (especially government and critical-infrastructure) require the source-of-truth to remain in-jurisdiction. Mode A already satisfies this by construction — Tx-Rails never receives the transaction content at all, so there’s no content to keep in- or out-of-jurisdiction. Only the hash and the block-slab Merkle roots leave the customer’s control, and the latter go to Hedera by design. Mode D, now that it’s built, needs its own sovereignty answer for customers who adopt it — that’s future work, not a gap in Mode A today.
What this document is and is not
This document describes the integration pattern that’s actually built, and is explicit about what’s roadmap rather than reality. It is deliberately silent on:
Specific protocol details (gRPC schemas, retry semantics, secret management)
The BFT consensus implementation (CometBFT / goldbftd internals)
The ChubbyChecker cross-check catalogue
The Hedera anchoring cadence and cost model
Per-vertical regulatory framings (covered in vertical-specific pitch documents)
For those, see underlay-integration-patterns.html for Mode A and the same honest roadmap framing, tx-rails-master-pitch.md for the cross-vertical narrative and financials, and the CLAUDE.md at repo root for the BFT architecture summary.
How to choose: a quick decision tree
Does “this record existed, unaltered, at this time” satisfy the audit requirement?
Yes → Mode A is not just sufficient, it’s the right fit, today, as-is.
No, independent content re-verification is required → check whether the claim is genuinely multi-party (two independent submitters whose claims must agree) or single-party. Genuinely multi-party: that’s Regime C’s bilateral predicate, already built. Single-party (e.g. “is this balance sufficient,” “is this KYC status current”): there’s no independent fact to check it against regardless of which mode delivers the content — say so plainly rather than implying a roadmap mode will eventually cover it. If inline rejection specifically is what’s needed, Mode C’s reference implementation provides it today, fail-closed by design.
Is explicit semantic-intent tagging (REVERSAL vs CORRECTION vs RESTATEMENT) a compliance requirement?
Yes → this is Mode D territory specifically; the core mechanism (real RequType values, verified end-to-end) is built, but flag the reference-implementation caveat — it’s not a packaged product a customer installs, and no customer has been onboarded through it yet.
No → Mode A’s proof-of-existence guarantee is enough.
Is public-DLT anchoring permitted in the customer’s regulatory environment?
Yes → standard architecture, Merkle slab roots → Hedera.
No → in-network anchoring only; document the cross-jurisdictional verifiability gap as a constraint. Mode A itself still works either way.
Is this a greenfield build?
Yes → frame as “substrate”, compose with Atoms from day one.
No → frame as “underlay”; Mode A today, be explicit that Modes B/C are roadmap and Mode D is a real but unpackaged reference implementation.
Why hash-only still holds up across verticals
Every customer scenario in every vertical can use Mode A today for exactly what it’s good at: proving a record existed, unaltered, at a specific time, verifiably by a third party who trusts nothing about Tx-Rails or the customer. Independent content re-verification isn’t something any of Modes B/C/D are missing — it’s only structurally possible where two independent parties each submit a claim about the same event, and that’s Regime C’s bilateral settlement predicate, not a gap in the integration modes. Explicit semantic-intent tagging is available now via Mode D’s reference implementation, but not through Mode A itself:
Banking / FCA financial services: Mode A gives proof-of-existence and tamper-evidence for every payment / KYC event / suitability decision today. Balance sufficiency is a single-party claim — Tx-Rails has no independent fact to check it against regardless of which mode delivers the content, so this isn’t a gap to close. Authorisation chains that are genuinely multi-party (two independent parties’ claims must agree) are Regime C’s shape, not something Modes B/C/D need to add; inline rejection of fraud-flagged transactions at the API edge is available now via Mode C’s reference implementation, fail-closed by design.
UK Social Housing (Awaab’s Law, Consumer Standards): Mode A gives tamper-evident, third-party-verifiable proof of repair tickets and tenant communications today — the audit-grade evidence is the compliance product even at this level. Full-payload content evidence is available via Mode D’s reference implementation now.
NSW Health / TGA UDI / GS1 chain-of-custody: Mode A anchors every supply-chain event’s existence today. The bulk-data content variant for clinical documents is available now via Mode D’s content-store reference implementation (see above).
Defence / national security supply chain: Mode A works today with the air-gapped refinement — in-network verifiability without Hedera anchoring.
Frozen-vendor enterprise: Mode A is the right and sufficient starting point today; Mode B (CDC observer) is the natural next step via its reference implementation, for vendors whose application source can’t be touched.
Greenfield regulated build: substrate framing (compose with Atoms) from day one — not the roadmap integration modes.
Proof-of-existence regulatory regimes: Mode A is sufficient and cheapest, today, as-is.
Customer with a clean API edge (new-deployment SaaS, government service-delivery program): Mode A works today; Mode C (gateway-mediated, deterministic JWT-based attribution, fail-closed inline rejection) is the natural upgrade via its reference implementation.
This is the right level of generality for an investor pitch and a customer technical conversation. Pitch the underlay philosophy first; be upfront that Mode A is the one real, fully-packaged integration path today; introduce Modes B, C, and D as real, verified core mechanisms that are each reference implementations, not packaged products yet.
What would stay true across all four rungs of the Data Visibility Ladder, once it’s fully wired
Today there’s nothing to choose — Mode A never sends amounts (or anything else) at all, so the question is moot and the answer is already stricter than any rung by default, at zero configuration cost. Mode D now receives content (unencrypted, at Rung 1), so the “nothing to choose” framing already doesn’t hold for Mode D adopters even though Rungs 2–4 remain mostly unwired. Once the higher rungs are actually wired in — for Mode D, or for Modes B/C once they exist — the design intends for this to hold regardless of which rung the customer picks:
The other 31 of the 33 Trace fields are unaffected — identity tokens, cryptographic commitments, BFT metadata, and operation discriminators behave identically, exactly as they do under Mode A today.
ChubbyChecker still runs the cryptographic-integrity checks (signature validity, Merkle inclusion, BFT quorum, slab anchoring), which are the load-bearing safety net — true today, under Mode A, already.
The content channel splits in two: structured fields (descriptions, party names in plaintext, other validated payload fields) would move up the Data Visibility Ladder as each rung gets wired — Rung 1 is the only one live for structured fields today, for any mode. Documents/bulk attachments are different: Mode D’s content-store path already sits at Rung 3 today, zero platform changes needed, since content-store never parses what it stores. Under Mode A, no content of any kind is visible to Tx-Rails at all — not encrypted-and-withheld, simply never sent, which is stricter still than any rung.
The Hedera slab-anchoring guarantee — cross-jurisdictional tamper-evidence via a public ledger — is intended to work identically whichever mode eventually gets built; it already works this way under Mode A.
The amount-visibility choice is purely about how much numeric information Tx-Rails sees for the cross-checks, once there’s numeric information for it to see at all — true today for Mode D adopters, unencrypted (Rung 1). Of the Data Visibility Ladder’s rungs, only Rung 2 (platform-key encrypted) is concretely scoped so far for amounts specifically (keeps that visibility, just protected against a storage breach or network intercept) — see the Data Visibility Ladder section above.
__________________
PART 3: The Global View: Tx-Rails Data Procesing and Smart Contracts EITHER in your own Datacentre or in a public Cloud
Tx-Rails Federation Trust Model + Inter-Federation/Pyramid/Sector Trade
Decision date: 2026-05-23. Authors: ITOTCCA architecture. Status: ratified — adopted as the production default for all vertical rollouts (energy, mining, supermarkets, transport, IIoT, finance, housing, health, aviation).
1. The core decision
One business network installation = variable number of tx-rails federations = one pyramid.
A group of federations in tx-rails terms is now defined by a four-way equivalence:
Business Federation — the commercial scope (e.g. Sector = Energy; Federations = electricity-generation in the UK, gas-midstream in EU. Sector = Supermarkets; Federation = meat-processing in AU). Identified by a human-readable name (tx-rails-energy-generation) and a numeric federationId: int64 carried on every transaction.
Either:
Pyramid — the assembled hardware stack of 4 BFT meshes (2 workload — member-classes / overseers — plus 2 auditor mirrors) deployed on dedicated virtual machines. Denoted by an int64 integer and a name. OR:
Tower — the most isolated hardware stack of 8 BFT meshes (4 workload — member-classes / overseers / aggregators / tophats — plus 4 auditor mirrors) deployed on dedicated virtual machines. Denoted by an int64 integer for “Pyramid” (in place of “Tower”).
Sector — the assembled stack of Pyramids (or a single Tower) within the boundaries defining a sector (eg the Energy Sector). Denoted by an int64 integer.
Member set — the cohort of organisations authorised to transact in their pyramid or tower, each scoped by its own entnum.
Your access to the Tx-Rails Smart Contract System is for a small blockchain-equivalent system running on the network you lease ie on PostGIS databases.
These four are co-extensive. Adding a federation does not necessarily mean provisioning a pyramid (except for the Tower Shape and Shape 1, where 1 federation = 1 pyramid – see below) because an appropriate Pyramid may already exist. Decommissioning a pyramid means retiring one federation (the Tower Shape and Shape 1) or a group of federations (Shapes 2 and 3). A federation has no hardware footprint without its pyramid or tower; the pyramid or tower has no business meaning without the federation(s) it carries.
Why Shape 1 is the default
Allowing the Tower Shape to take its place as the ultimate in isolation, Shape 1 represents the next strongest possible trust isolation, whilst still allowing cross-pyramid transacting. Different BFT validator pools per federation. A compromise of one federation’s mesh cannot propagate into another, because there are zero shared enterprise data replicas. Software-level multi-tenancy via entnum is much weaker than hardware separation, and the regulators + procurement teams we sell-to recognise this distinction.
Sovereignty story holds. For both the Tower Shape and for Shape 1 a UK federation’s hardware sits in UK data centres; an Australian federation’s hardware in Australian data centres. There can be no cross-pyramid commingling of enterprise data with only audit metadata at the aggregator/anchoring layer being mixed, in the case of Shape 1, to allow audited cross-pyramid transacting (and even then, still confined within data centre/national boundaries). Holds up under UK Social Housing Regulator scrutiny, EU GDPR Article 44 transfer rules, Australian APRA CPS 234, and equivalent obligations across the verticals we target.
Clean commercial unit. “One business network = one federation = one pyramid = $X / month” is a unit a procurement team can sign off on without a security review on multi-tenancy. The cost line is legible, the upgrade boundary is legible, the SLA boundary is legible.
Independent rotation + upgrades. Each federation can run its own change-management window across its 4 or 8 VMs. Regulated customers that cannot co-ordinate upgrades with their peers in the sector get the autonomy they need.
Per-pyramid DID trust list. Each pyramid has its own gateway with its own Elastos-DID trusted-issuer list. Generators authenticate to one trust list; regulators to another. No cross-cohort permission machinery required.
No premature compression of trust boundaries. Two federations might share regulators today but diverge tomorrow. Hardware separation is reversible upward (you can always merge later); software multi-tenancy is irreversible downward (once you co-locate, separating is a migration).
Cost (per-federation sovereign sizing)
4 VMs per pyramid (production sizing ~32 GB RAM per VM, so ~128 GB (Shape 1) or ~256 GB per pyramid (Tower).
Shape 1: 26 energy federations × 4 = 104 VMs at full energy rollout (if every federation gets its own pyramid).
Across the eight verticals we target at scale (~246 federations), the maximum per-federation sovereign upper bound is ~984 VMs at Shape 1 (246 × 4) and ~1,968 VMs at Tower (246 × 8). This is the upper bound, not the operating shape — see the Shape 2 figures below.
This per-federation-sovereign sizing is only part of full-vertical-rollout and is the upper bound, not the expected operating shape. Charter-member onboarding typically lights up 1–3 pyramids at a time; the operating-cost ramp is incremental and matches revenue ramp. At full scale, most customers will deploy the grouped-pyramids shape (next section) rather than (taking the Energy example) 26 sovereign pyramids per vertical.
In addition to this, each overall vertical sector must carry one set of 4 virtual machines enabling cross-pyramid transacting. These are 2 virtual aggregator machines and 2 mirrored auditing virtual machines.
Deployment shapes — the four production patterns
The trust model above hints at possible deployment shapes. Four production patterns coexist and tx-rails supports all of them. Customers choose by jurisdictional + regulatory + cost trade-off.
Both manual and Automated trading is possible, where IIoT devices such as sensors, meters and general telemetry cou;d trigger smart contracts for fully regulated trade among and between Companies and Pyramids, including international trade.
______________________________________
In the following, icons such as: represent Virtual Machines
_____________________________________
National-Meta Pyramid
as Intra/Extra Sector Tower/Shape Coordinator
commercial-exec
audit-comm-exec
governor
audit-governor
Single Detached Pyramid
1 Federation carried. Overseen by Human Governance.
When to use: federations with statutory sovereignty obligations (a national wholesale market operator), federations with explicit regulator demands for hardware isolation, federations that compete commercially with peers in the same vertical and cannot share infrastructure.
Customer profile: Tier-1 regulated utility, market operator, central bank-adjacent settlement layer, regulator running its own audit pyramid.
Sector-Shape 2 — Grouped pyramids by trust cluster (the realistic full-scale shape)
5–7 pyramids covering the (exemplary) 26 energy federations, grouped by coherent trust cluster — federations that already share regulators, members, and frequent transaction flow get co-located onto one pyramid. Multi-tenancy via entnum + CoreMeta.network within each pyramid; enterprise hardware separation across pyramids.
Cross-federation telemetry consumers; one pyramid serves all the operational federations
Cost: ~32 VMs covering 26 federations (7 pyramids × 4 VMs = 28, plus the 4 shared sector aggregator/auditor VMs) — ~69% cheaper than Shape 1 (26 × 4 = 104 VMs) and ~85% cheaper than Tower (26 × 8 = 208 VMs), with ~80% of the trust-isolation benefit.
Trust trade-off: Federations within a pyramid share validators. A bug in generation‘s action package cannot affect gas-upstream‘s state (separate pyramids), but could affect transmission‘s state (same pyramid). Defended by software gates (action-package isolation, per-network policy, entnum scoping) — but not by hardware separation. Acceptable for federations within an already-coherent regulatory cluster.
Inter-federation flows: Within-pyramid cross-federation flows are free (routed by network in the same state machine — no Mechanism 1–4 round-trip required). Cross-pyramid flows still use the eight mechanisms in §2.
When to use: this is the default we expect most full-scale customer deployments to land at. The per-federation sovereign shape (Shape 1) is what we sell; the grouped shape is what we operate once a customer has more than 3–4 federations on the platform.
Customer profile: Tier-1 retailer with 6 federations across the value chain; national network operator covering generation through distribution; consortium of 4 regulators sharing audit infrastructure.
_____________________
National-Meta-Federation
as Sector-Shape 3 Coordinator
xpyr-comm-exec-data-centre
xpyr-governor-data-centre
audit-comm-exec-xpyr
audit-governor-xpyr
_____________
intra-member-classes-1
intra-overseers-1
audit-member-classes-1
audit-overseers-1
_____________
Sector-Shape 3 — Single multi-tenant pyramid per jurisdiction (budget tier)
All federations within one jurisdiction (e.g. UK energy) carried on one pyramid. 8 Operational VMs total.
Substrate work to enable: per-network DID trusted-issuer lists (~1–2 weeks), per-network member-registry gating (~1 week), per-network audit-window scoping (~2 weeks). Total ~4–5 weeks beyond v1.
When to use: a single national regulator that wants one audit surface for all energy federations within its jurisdiction; does allow single point of failure; a pilot or test environment; a small jurisdiction where the trust gap between energy sub-sectors is small.
What you give up: granular regulator read-windows become harder (one pyramid carries all energy data; regulator filters by network); a single point of failure across the whole national energy sector; member-set commingling.
Customer profile: small-jurisdiction regulator running its own pilot, charter-member opt-in tier.
FAQ (cont’d) Q7. What exactly does the “CDC observer” in Mode B do?
Short answer:cdc-observer subscribes to the customer’s Postgres database as a read-only logical-replication client. The legacy application is unmodified; every committed change is observed asynchronously and translated into a Tx-Rails action commit. This is built and verified against a real Postgres — see the Roadmap section above — as a reference implementation, not a packaged product yet.
Long answer:
CDC = Change Data Capture. It is a roughly two-decade-old database technique for streaming every committed change in a database — INSERTs, UPDATEs, DELETEs — out of the database in near-real-time, by reading the database’s own write-ahead log (WAL) rather than by re-querying the tables. A typical CDC architecture looks like:
[ legacy app ] ── commits ──▶ [ legacy DB ]
│
│ writes WAL entries (its own
│ transaction log, used for
│ crash recovery)
▼
[ DB write-ahead log ]
│
│ tailed by a CDC reader
▼
[ CDC stream — Debezium, Maxwell,
AWS DMS, Google Datastream, native
log replication, etc. ]
│
▼
consumers subscribe to changes
The crucial property: the legacy application would be completely unmodified. It commits the way it always has. The CDC tooling sits beside the database and reads the change stream out-of-band. From the legacy app’s perspective nothing would be different.
cdc-observer is a real logical-replication client (pglogrepl, decoding pgoutput directly), not a downstream consumer of a separate CDC product — it talks to Postgres’s own replication protocol, so there’s no Debezium/Kafka middle tier to stand up. A customer whose CDC pipeline already runs through Debezium or an equivalent could still point that at their database instead and feed a translation layer into ExecuteAction, but the reference implementation that ships doesn’t need one.
The word “observer” in our taxonomy names three properties this pattern has, now verified against a real Postgres:
Read-only on the customer’s side. Tx-Rails never writes back into the legacy DB — the only thing it writes is the replication slot’s own position, standard Postgres bookkeeping, not customer data.
Asynchronous. The CDC stream is processed after the legacy DB has already committed the change. No lock contention, no commit-path latency added to the legacy app, no chance Tx-Rails could block a write.
Non-invasive. The legacy application’s source code doesn’t change. Many regulated customers have systems where the source is frozen by vendor contract, regulatory certification, or end-of-life status — Mode B works on these systems specifically because no source change is required.
The trade-off versus Mode D, both of whose core mechanisms are now built:
Mode D can be preventative — a customer who calls ExecuteAction synchronously, before committing locally, gets a hard gate: a transaction Tx-Rails rejects never lands in the legacy DB either. But the reference implementation that’s actually built (dualwrite-relay) is the outbox variant specifically — write the local DB row and an outbox row in the same local transaction, then relay asynchronously — which is not preventative in that build: the local write has already happened by the time Tx-Rails would reject it. A customer wanting the preventative property has to call the gateway inline themselves; it isn’t what the shipped reference does.
Mode B is forensic — the transaction is already committed to the legacy DB by the time Tx-Rails sees it, via replication. Tx-Rails can detect, audit, and cryptographically prove a problem after the fact, but never prevent it.
For most regulated incumbents, forensic (or the outbox variant of Mode D, which behaves the same way) is acceptable — and often it’s the only shape a customer’s risk team permits, since a synchronous, preventative Mode D call adds a hard dependency on Tx-Rails availability to the customer’s own commit path, which a frozen vendor contract or regulatory certification frequently won’t allow. Mode C sits between the two on the prevention spectrum: inline at the API edge, genuinely preventative there (fail-closed by design), while Mode B and the outbox variant of Mode D both stay forensic on whatever the database actually committed.
When Mode B is the right recommendation:
The customer’s transaction system is a frozen vendor product (SAP, Oracle Financials, a hospital EHR) where modifying the commit path is contractually or operationally impossible AND there is no clean API edge to put a gateway in front of.
The customer’s commit-path latency budget is already tight and they cannot afford even a few milliseconds of additional overhead.
The customer wants the lowest-risk integration first and would migrate to Mode C or D later once they trust the underlay.
Where CDC is a poor fit:
The customer’s database isn’t Postgres, or has no stable, well-supported logical-replication equivalent. This reference implementation is Postgres-specific (pglogrepl); other databases would need their own CDC tooling, which may be fragile, expensive, or unreliable — Mode D or Mode C would be the simpler path despite being more invasive.
The customer requires real-time prevention with regulatory veto over individual transactions — CDC is forensic by construction; Mode C, or a synchronous (non-outbox) call into Mode D’s gateway, is required for prevention.
Q8. What user interfaces does Tx-Rails provide, and what stays on our side?
Short answer: Your existing front-ends remain unchanged. Tx-Rails provides only thin operator and verification UIs that have no incumbent, plus an SDK for embedding into your own apps. We do not build customer-facing transaction front-ends. This answer holds regardless of integration mode.
Long answer:
For medium-to-large customers and government agencies, the right working assumption is that Tx-Rails does not provide a customer-facing transaction front-end. The customer’s existing user interfaces — banking apps, online banking, branch teller systems, EHR clinical interfaces, patient portals, tenant portals, maintenance-request apps, citizen benefit portals, vendor procurement portals, ERP modules — remain in place. The customer’s staff and end-users never see Tx-Rails. The underlay does its work invisibly and any verification artefact is rendered through whatever UI conventions the customer’s existing app already uses.
That accounts for roughly 95-98% of front-end surface area in any given customer’s workflow.
There are, however, a small number of UI surfaces that do not have a customer-side incumbent — the capabilities are new and the customer has no team to build them. Tx-Rails provides these as Tier 2 products:
_______________________
Surface
Audience
Purpose
Operations console
Customer IT / SecOps team
Peer mesh health, validator status, certificate management, CA operations. Tool, not product — equivalent to a Kubernetes operator UI.
Retrieve cryptographic proofs of specific transactions; render Merkle inclusion proofs; show Hedera anchor. This is what merkle-audit and the artifact format it produces are for. Skinnable, default theme provided.
Trust-management UI
Customer operations team
Cert issuance, revocation, partner-org onboarding for the enterprise CA. Bare-CLI is acceptable for PoC; web UI planned.
Edge SDK + sample apps
Customer engineering team
libp2p-based SDK for customers who want to embed Tx-Rails capability into their own mobile or branch apps. Customer integrates; we ship the library and reference code.
Auditor operations console (optional)
Third party operating the auditor mesh (audit firm, regulator, or us)
Operational visibility into the ChubbyChecker auditor stack. Only relevant if the customer chooses to operate auditors themselves or if a third party operates auditors on their behalf.
There are two carve-outs from the “no customer front-end” rule, both of which we explicitly handle:
Greenfield government programs. A government agency launching a new benefit scheme, regulatory regime, or service delivery program has no incumbent front-end to preserve. The substrate framing applies (see the “Greenfield” edge case earlier in this document) and the customer may legitimately want us to provide an end-to-end stack including the citizen-facing UI. Rare in our pipeline but high-value when it appears. We can scope and quote such engagements project-by-project.
End-user self-verification UIs. Some end-users will want to independently verify their own records — “show me the audit trail for my benefit application”, “prove to me my health records weren’t tampered with”. The customer organisation will not build this; it’s outside their UX competence and outside their commercial incentive. A Tx-Rails-provided consumer app, white-labelled to the customer, fills this gap. Optional Tier 2 product, available against signed customer demand.
Operational implication for the customer: the only Tx-Rails-provided surfaces your operations team will routinely interact with are the operations console and the trust-management UI. Verification portal access is on-demand (audit response, regulator query). The edge SDK is your developers’ integration target, not an ops surface. Everything else stays on your side, in the UIs and workflows your users already know.
Commercial implication for the customer: because Tx-Rails does not absorb UX engineering cost into its product, the per-customer integration cost is bounded and predictable. There is no UI customisation project layered on top of the underlay deployment. Pricing reflects this — Tx-Rails is sold as platform capacity (peer count, transaction volume, anchor depth, retention), not as a managed-UX service.
Q9. We’re in aviation / defence / a sensitive regulated industry. Even the numeric amounts in the Trace sound like too much. What can we do?
Short answer: If you need amounts to be invisible even to Tx-Rails, nothing to do today — Mode A never receives amounts at all, so that’s already the strictest possible answer, and stricter than any Data Visibility Ladder rung below could offer. If you’d accept Tx-Rails being able to read amounts in exchange for us keeping our own constancy checks on them, Rung 2 of the ladder is concretely scoped, not just sketched — see “Platform-key encrypted” below.
Long answer:
Earlier in this document explains why: under Mode A, the quantitative-facts fields (int64Amounts, int32Exponents) are simply never populated. There’s no visibility question to manage because there’s no data to be visible. This is stricter than any Data Visibility Ladder rung below could offer, because it isn’t a redaction of data received — it’s data never sent.
_______________________
Once a content-receiving mode (B, C, or D) exists, some customer audiences will still want a configurable answer for amounts specifically, because they’d then be sent as bare numeric values (semantically opaque — no unit, no meaning — but visible as numbers). The Data Visibility Ladder, right after the Roadmap section above, is the current design thinking for that future state, applied to the amounts field specifically:
Rung
What Tx-Rails would see
What ChubbyChecker could still check
Fit
1 — Plaintext
Bare numeric value, semantically opaque
Amount conservation, range, and pattern checks
Civil aviation maintenance, healthcare audit, housing, most commercial verticals
2 — Platform-key encrypted
Nothing extra versus Rung 1 — the platform still decrypts to check, just protected from anyone outside its own key custody
Full amount conservation, range, and pattern checks — no loss versus Rung 1; the constancy check itself (cc-bpd-038) is built and verified end-to-end against a real live stack, both the clean-match and tamper-detection paths (see the Data Visibility Ladder section above)
Same verticals as Rung 1, plus anyone additionally worried about a storage breach or network intercept, not about the platform itself reading the value
3 — Customer-key encrypted
Ciphertext only; Tx-Rails cannot decrypt
Loses the amount-arithmetic checks; retains signature, Merkle, BFT, sequence, identity-token, opcode, and slab-anchor checks
Classified defence aviation, ITAR-controlled goods, EAR dual-use, sovereign-data-prohibited contexts — amounts are exactly the kind of platform-validated field that makes this rung’s genuinely-hard case (see the Data Visibility Ladder section above), so this row stays undesigned longest of the four
4 — Partner-key encrypted
Ciphertext readable only by the customer-named partner (a manufacturing partner, a regulator) — Tx-Rails still cannot decrypt
Same as Rung 3 — this rung is a delivery mechanism layered on top, not an independent set of checks
Same audiences as Rung 3, when the amount also needs sharing with one named third party rather than only the customer
Decision rule for the customer conversation
When an aviation customer (or any sensitive-data customer) asks the privacy question today, the right framing is:
“Right now we don’t receive your amounts at all — Mode A never sees them. If you eventually want us to, tell us the most sensitive data class you’d be putting through the platform, and that maps to one of four rungs on our Data Visibility Ladder — one of which (platform-key encrypted) is now concretely scoped, the other three still design-only.”
This is more credible than implying a live, configurable privacy control exists. It also gives the customer the agency to see that the design has already thought through their risk register, even before there’s anything to switch on.
This same Data Visibility Ladder is the answer Part 4’s IIoT/Smart-Contracts pitch will eventually need too, for the identical aviation/defence audiences: production counts, throughput, and proprietary process parameters are the same shape of problem as amounts — a customer who’ll accept cryptographic commitment but not raw-number visibility — just wearing IIoT’s label instead of a Trace’s. Once a content-receiving mode wires the higher rungs in, the design intends to generalise from “amount visibility” to “quantitative-fact visibility” rather than needing a second, parallel ladder for telemetry.
_______________________
Q10. We’ve never traded with this counterparty before. How do we even find and verify them before wiring money across a border?
Short answer: Kademlia — the same enterprise-CA-gated peer-discovery substrate Part 1 pitches as a DNS alternative — is also how a national aggregator finds and cryptographically verifies a Regime C counterparty it’s never traded with before. A federation publishes a self-signed AgreementAnnouncement over the DHT; a prospective counterparty discovers it, refuses to trust anything served by a peer that hasn’t independently passed enterprise-CA verification, and reviews the result before registering the bilateral agreement itself.
Long answer:
§B above states Regime C’s bilateral agreement (M4) is “pre-established” — exchanged DIDs/keys, no per-tx trust created on the fly — without ever saying how that exchange happens. In practice, that’s always meant an out-of-band process: emails, phone calls, a spreadsheet somewhere, someone pasting a public key into a message. For money crossing a border, that’s the weakest link in an otherwise cryptographically rigorous design.
Kademlia closes it. A federation wanting to be discoverable signs an AgreementAnnouncement — its own FederationID, its Hedera anchor topic, and the ed25519 public key it intends as its CounterSigningPublicKey — with the private key matching that public key. That’s a self-consistency proof: whoever published this controls the claimed key. It’s published on the DHT under a CID derived from the federation’s own ID, the same Provide/FindProviders mechanism this platform already uses for BFT validator peering (Part 1, wp-9B). A prospective counterparty finds it by federation ID, and — the load-bearing check — only trusts it if it was served by a libp2p peer that has independently passed wp-06 enterprise-CA verification: a CA-signed certificate binding that peer’s libp2p identity to the announcing operator’s own PKI. An unverified peer’s announcement is refused at the point it’s served, not merely distrusted at the point it’s read.
The result is a runnable, one-shot lookup, not a design sketch: an operator runs h3-rpc-gw --regimec-discover-federation-id=<id> and gets back the counterparty’s anchor topic and signing key as JSON — cryptographically tied to a verified enterprise identity, not a name someone typed into an email — to review before doing anything else.
_______________________
Decision rule for the corridor-onboarding conversation
When a prospective Regime C customer asks how they’re supposed to safely find a first-time trading partner, the right framing is:
“You don’t exchange keys over email. Your counterparty publishes a self-signed announcement of their own settlement identity over the same enterprise-CA-gated network that replaces DNS for your other high-value flows. You look them up, the network itself refuses to hand you anything served by a peer that hasn’t proven who they are, and you review what comes back before you register the agreement. Finding a legitimate first-time counterparty and registering a fraudulent one now go through two different, appropriately-weighted steps — not one email thread doing both jobs at once.”
This is deliberately not full automation: discovery surfaces a verified result, it never registers the agreement on its own. The discovery half is cryptographically rigorous end to end; the decision to actually trust a newly-found counterparty with cross-border settlement stays a human call, on purpose.
_______________________________
What these decisions deliberately do NOT cover
Federation lifecycle events (creating a new federation, retiring a federation, merging two federations). The meta-federation framework supports these but the operational runbook is TBD. Defer until v2.
Cross-jurisdictional governance (what happens when a federation spans UK + AU and the two regulators disagree). Likely solved by separate jurisdictional pyramids of the same federation (i.e. tx-rails-energy-generation-uk and tx-rails-energy-generation-au are distinct federations, even though they share an action surface), with Mechanism 1 handoff between them. Defer until a customer with a multi-jurisdictional footprint asks for it.
__________________
Status
Aspect
State
Underlay philosophy
Canonical; lead positioning in all customer/investor conversations
Mode A (hash-only attestation)
Built and verified end-to-end against a real chain. The only fully packaged, customer-adoptable integration path that currently exists.
SDK / atomic dual-write (Mode D)
Core mechanism built and verified end-to-end against a real running stack (goldbftd + org-server-abci + org-gateway): idempotency-key-derived deterministic tx_id, RequType semantic-intent tagging, a reference outbox-relay implementation (connectrpc/services/org-gateway/cmd/dualwrite-relay). Reference implementation for a customer’s own team to adapt, not a packaged SDK — no customer onboarded through it yet. Do not present it as an install-and-go product.
Gateway-mediated (Mode C)
Core mechanism built and verified end-to-end against a real running stack (connectrpc/services/org-gateway/cmd/edge-gateway): explicit route config, reuses org-gateway’s existing JWT auth unchanged, fail-closed inline rejection — the one of the three that’s genuinely preventative. Reference implementation, not a packaged product — no customer onboarded through it yet.
CDC observer (Mode B)
Core mechanism built and verified end-to-end against a real running stack (connectrpc/services/org-gateway/cmd/cdc-observer): real Postgres logical replication via pglogrepl, coarse service-account attribution, idempotency-key-derived tx_id. Forensic, not preventative. Reference implementation, not a packaged product — no customer onboarded through it yet.
Data Visibility Ladder
Rung 1 (plaintext) is what every content-receiving Mode ships with today. Rung 2 (platform-key encrypted) is built and verified end-to-end against a real goldbftd + org-server-abci + chubbychecker-joint + Vault stack (both directions: a real encrypted amounts match, and a corrupted persisted row correctly caught): chubbychecker-joint‘s KeyProvider/Vault wiring plus cc-bpd-038‘s amounts-constancy check (positional mantissa/exponent array, decrypt-then-compare — see structured-atom-privacy-ladder-design.md). Rung 3 is partially solved (fields the platform never validates); its narrower platform-validated-field case and Rung 4 (partner-key) remain design-only. Mode A itself is already maximally private (no content sent at all).
Bulk-data variant of Mode D
Built and verified 2026-08-16 (connectrpc/services/content-store) — real and necessary for healthcare/legal-evidence verticals, now a reference implementation rather than a sketch; see the Edge cases section above
Air-gapped degradation
Applies to Mode A today; acknowledged edge case; small subset of customers; not lead narrative
Greenfield “substrate” framing
Available; use only when there’s no front-end to preserve
Anchor chain options
Two, both built and tested today: Hedera (default) and Ethereum. The Ethereum path is EVM-generic by RPC endpoint and chain ID alone — any EVM-compatible network, no code change. A third, non-EVM chain is an extension of the same chain-selectable interface, not a rebuild. Reachable directly or, for callers that want a uniform interface regardless of which chain a deployment runs, via a gRPC bridge (tophats.v1.AnchorService).
__________________
Domestic Transactions:- Each of the above Shapes can transact in one of two ways: For transactions requiring strict atomicity the Genuine 2 Phase Commit (2PC) method is used, with, for transactions within one Tower’s or Shape’s Pyramid, a Coordinator. For all 2PC transactions the outcome is either Commit Success or Atomic Rollback. 2 PC transactions (Regime A) are not available for interactions outside a single Pyramid. The second possible means of transacting domestically between federations involves Coordination in a process called a Saga which uses Suspense Accounts. Saga transactions are coordinated by a country’s national-meta-federation (extra-Tower) or a local intra-meta-federation (intra-Tower), for Tower-sided transactions, and they use National Aggregators as coordinators for non-Tower (Shapes 1, 2 and 3) cases. A Saga transaction is either completed or compensated.
The above 2 transaction modes can be triggered in one of two ways. For transactions requiring manual initiation the transfer is possible using the 2PC method when atomicity is required and available, or, for transactions with less strict requirements or for domestic/inter-pyramid, the Saga method is employed. The second triggering method is via IIoT devices in connection with Smart Contracts, where there are dangers inherent in using the Saga method, such that this mechanism is unavailable for IIoT/Smart Contract transfers (due to insurmountable complications when a Saga transaction must be reversed/compensated). In all Smart Contract/IIoT trades the 2PC mechanism must be employed.
International Trade:- A “pseudo-Saga” mechanism is used here, with mutual mediation achieved via the agreed Anchor (DLT) Interface.
IIoT and Smart Contracts go together like hand in glove.
Shape we will NOT ship — single global pyramid
One pyramid serving energy across UK + AU + EU + US. Jurisdictional sovereignty collapses; data sits where it must not sit under GDPR / state-data-protection law; a single legal action against the pyramid operator pauses the global energy substrate. Off the table — we do not pitch or build this configuration.
What this gives up (summary across shapes)
Per-federation cost is higher than a multi-tenant alternative under Shape 1. A small / low-volume federation (e.g. early-stage carbon-renewables registry) gets the same 4-VM footprint as a heavily-used wholesale-market federation. Shape 2 (grouped pyramids) is the standard answer to this; Shape 3 is the explicit budget answer when even Shape 2 is too much.
Inter-federation transactions across pyramids are not free. Cross-pyramid flows require one of the five mechanisms below (§2). The mechanisms apply equally to Shape 1 and Shape 2 — they govern cross-pyramid flow, not cross-federation flow. Within-pyramid cross-federation flows in Shape 2 are free.
Commercial framing
We lead with “your own pyramid, your own enterprise validators, your own trust boundary” (Shape 1) as the premium offering. At full scale most customers will land on Shape 2 (grouped pyramids by trust cluster) — we don’t bury this; we present it explicitly as the realistic operating shape and price it accordingly. Shape 3 (single jurisdictional pyramid) is the explicit budget tier, available on request with the substrate work above completed.
The sales conversation is therefore:
“Your range of federations = their own independent 8 VMs each = your own pyramid” (Tower Shape, specialist pitch, premium plus pricing)
“Your federation = your own pyramid” (Shape 1, default pitch, premium pricing)
“As you add federations, we cluster them by trust domain so you’re not paying for 4 VMs per federation forever” (Shape 2, full-scale operating shape, mid-tier pricing)
“For a single-jurisdiction pilot or a small-scale test, one pyramid carries the whole vertical” (Shape 3, budget/pilot tier, lowest pricing)
The substrate supports all four. Customers choose by trust trade-off + budget — and can migrate between shapes (Shape 3 → Shape 2 → Shape 1 → Tower) as their scale + regulatory demands grow.
The inter-federation trade problem II. Second Design Pass
Most non-trivial energy-sector flows (for example) cross federation boundaries:
Inter-Sector trade is also possible, and we allow for it
Regulatory disclosure — almost every operational federation → audit-compliance + authorities.
Cross-federation trade is the rule for most non-trivial flows, not the exception. A pyramid can ship today and run its within-federation flows end-to-end without any cross-pyramid mechanism in place; cross-pyramid flows (including Inter-Sector, Inter Data Centre and International flows) are also currently possible inside tx-rails.
_______________________________
The (new) three cross-pyramid mechanisms (reduced from Pass I’s 8 Mechanisms) we will implement:
Status: proposed (supersedes the M1→M8 escalation ladder in tx-rails/docs/federation-trust-model-NEW.html for the cross-federation transaction model). Date: 2026-06-30.
Context: Decided after a critical review of the road to “8 mechanisms working.” The core realization: a machinic voting system (BFT) is unsafe and infeasible internationally — both technically (BFT is O(n²), needs a bounded validator set + partial synchrony) and politically (no shared trust domain across sovereigns; the number of nations far exceeds any super-connected BFT). The 8-mechanism ladder has the wrong polarity.
A. The principle: invert the ladder
Consensus strength must decrease as transaction scope widens — not increase. The old ladder implied more coordination/voting as you go international; that is exactly backwards.
intra-pyramid / tower → FULL BFT + 2PC (synchronous atomicity)
domestic cross-sector → SAGA (eventual + compensation) — single sovereign
international → ANCHOR + BILATERAL (ordering only) — no voting
B. Three regimes (the 8 mechanisms collapse to these)
National Meta Fed/ National Aggregator/ (1/country)
M5 — re-cast as Saga, not 2PC
C — Peered
international (no shared trust domain)
anchor + bilateral agreement + Saga compensation
none — mesh of National-Aggregator/ National Meta Fed peers
M1 + M4
Status, stated precisely, because “three regimes” is a claim about design and not about deployment. All three are built, and all twelve of their coordination actions — prepare, commit, abort, cast_vote, submit_step, record_compensation, mark_completed, record_relay_outcome, register_agreement, submit_intent, record_intent_receipt and record_commitment — execute inside governorabci‘s FinalizeBlock. Each is therefore a state transition attested by consensus rather than a database write somebody has to be trusted about. None of the three carries customer traffic yet, and they differ in how far past “built” each has been taken:
Regime A — intra-pyramid. Both protocols are wired in gov-api: 2PC (Prepare/Commit/Abort) and Saga, with validateIntraPyramid enforcing the same-pyramid invariant that is what makes a Saga Regime A rather than Regime B — the design separates protocol from scope, and it is the validating entry point that decides the regime. Never exercised end-to-end — and on the current deployment it cannot be. Probed live on 2026-09-01: a Regime A saga step is refused with “no pyramid registry configured — cannot verify intra-pyramid membership”. The coordinator is wired in code, but the pyramid registry it must consult to decide whether two federations really do share a pyramid is not configured on any gov-api in this deployment, and registering memberships is itself behind a DID-authenticated admin call. So the gap is deployment configuration rather than missing code — and the failure is the right one: Regime A fails closed rather than quietly falling through to the domestic path, which is the single most important thing about a gate whose whole job is to decide what may not cross a boundary.
Regime B — domestic. The Saga path has been consensus-routed the longest of the three: gov_coord.saga_journal is a projection of committed blocks rather than an independently written table, which is what makes its compensation history auditable at all. Probed live on 2026-09-01 the path is reachable and wired end-to-end: a submitted step passes origination and validation and reaches the escrow executor, which refuses it only for naming an action it does not implement. What has not been run is a complete two-step saga with compensation, and this document does not count a reachable path as an exercised one.
Regime C — international. The best-evidenced of the three at mechanism level. The engine has been driven end-to-end against a live Hedera testnet with real credentials — register the bilateral agreement, submit the intent, record the anchored receipt, record the counterparty’s signed commitment — on 2026-08-10, through the in-process path that predated consensus routing. That routing was built on 2026-08-27 and rolled on 2026-08-28 — rolled in this document’s own sense, running on every node of the tier: re-verified 2026-09-01, all eight governance validators across both the commercial and the super federation run a byte-identical governor-abci carrying the consensus applier, each with Regime C and BFT consensus enabled, and each federation anchoring to its own live testnet topic. And on 2026-09-01 a full lifecycle was driven through that consensus path on the live commercial mesh: agreement registered, intent submitted, the intent payload anchored to the federation’s own Hedera testnet topic, the anchored receipt recorded, and a counterparty commitment — genuinely ed25519-signed, so it went through signature verification rather than the self-authored path that skips it — recorded and settled. The four actions landed in consecutive committed blocks (heights 584995, 584996, 585001 and 585004), and all four validators independently report the same settled status and the same anchored receipt, each from its own database, though the driver only ever spoke to one of them. That last check is the control: had the writes taken the in-process path instead of consensus, the other three would have known nothing about it.
One distinction belongs in the same breath, because it is the one a reader is most likely to get wrong. Consensus attests that this receipt was submitted, and in this order — not that every validator independently confirmed it against Hedera. A dishonest coordinator could get a bogus receipt attested. That is detectable rather than prevented: the receipt carries its topic and sequence number, so any auditor can re-verify it against the public mirror without our cooperation, which is precisely what the cg04 check does. Verifying inside consensus was deliberately not chosen — a mirror outage would then stall the chain.
Why 2PC only in Regime A: 2PC is a blocking protocol — a coordinator crash after prepare leaves participants holding locks indefinitely. That is tolerable only co-located within one operator/trust domain. Across operators, data-centres, or borders it is actively unsafe; use Saga.
Re-cast: M5 (national aggregator) — domestic cross-sector via Saga, not 2PC. The supervening one-per-country national aggregator orchestrates; it does not BFT-vote across sectors.
Collapse: M6 (international/global aggregator-as-coordinator) → bilateral peering between national aggregators via anchor (M1) + agreement (M4). There is no international coordinator.
DELETE: M8 (super-meta-federation as BFT coordinator). Doomed — BFT cannot span nations technically or politically. Do not build it.
International settlement is therefore a mesh of bilateral relationships between sovereign national aggregators, not a hub and not a global validator set. This is identical to the previously-favoured 2-plane design (national aggregator per country, no intermediates) — the two analyses converge.
D. Anchor is an interface, not Hedera
Hedera as the international anchor reintroduces a trust dependency (a ~30-member council under aBFT; a permissioned ordering service) — a weaker form of the “whose validators?” problem, outsourced. Mitigate by abstraction:
Define an OrderingAnchor interface: Anchor(root) → (orderedReceipt, timestamp, proof) + Verify(receipt). It provides non-repudiable ordering / notarization only — it does not vote on validity.
Hedera is one implementation. Business logic depends on the interface, never on Hedera directly, so a council-governance or availability event is not an international-settlement outage.
Validity in Regime C comes from the bilateral cryptographic agreement (M4), not from the anchor.
Implemented:the-situation/internal/anchor (interface + ed25519 in-memory ref impl) and internal/anchor/hcs (Hedera Consensus Service impl).
E. Open questions — MUST be answered before any transaction code / proto
Atomicity claim for Regime C. Anchor + bilateral gives non-repudiable ordering and agreement, not atomic settlement. Specify the exact guarantee and the compensation/timeout state machine (one side anchors, the other never does → timeout → compensate). See REGIME-C-STATE-MACHINE.html.
transactions/v1 proto shape (the currently-missing gen package national-meta-federation imports). It must encode the regime — likely distinct message sets for Regime A (2PC coordinator) vs Regime C (anchor/bilateral), or a unified envelope with a regime discriminator. Do not generate it until this is decided — the wire format is the most expensive thing to get wrong.
Saga compensation registry (Regimes B & C): where compensations are declared, how they are triggered, idempotency under retry/partition.
F. Known liabilities (block trust until resolved)
cometbft v0.38-vs-v1 alias shim (goldbftd/abci/types/compat_v1_aliases.go): app targets v1 ABCI semantics; fork is v0.38.19. The alias makes it compile but masks possible semantic drift in the consensus layer Regime A depends on entirely. Resolve by a real version decision before building settlement on it.
~105 nested tower/federation copies still on pre-normalization module paths; their standalone builds diverge from the workspace.
Nothing in the current build has been runtime- or property-tested at the settlement level. “Builds” ≠ “atomic under partition.”
G. Action
Update federation-trust-model-NEW.html (the ratified doc) to this 3-regime model: delete M8, re-cast M5 as Saga, collapse M6 into bilateral peering, mark the anchor as an interface. (Done — supersession banner inserted.)
Do not write transaction wire code until §5 is pinned.
_____________________
IIoT & Internal-DB Smart-Contract Origination
Status: design note, partially superseded by what shipped (governance@1e4c880, @03c7e0f, internal/origin) — the shipped restriction is narrower than §B/§D below originally proposed: a contract atom or IIoT device may only originate directly into Regime A; reaching Regime B or C requires a human governor to originate the transaction instead (see Part 5, synthesis 12, for the full story). §B/§D’s bullets below are corrected in place to match; the rest of this design note (§A, §C, §E) is unaffected. Companion to federation-trust-model.html (regimes A/B/C) and the regime engines in internal/regimea(BFT)/regimeb/regimec.
Thesis: internal-DB smart contracts and IIoT devices are not a fourth regime. They are the origination layer — autonomous, machine-driven producers of transactions that then flow through whichever of Regime A / B / C the transaction’s scope demands.
A. What “internal database-based smart contracts” are
Not EVM/external-chain contracts. A contract here is a business process authored in the gov/Governor studio (BPDI): a set of steps, transitions, and bindings. It executes as deterministic atoms (the Action.Execute(ctx, db, config, actionCtx) interface in orgnodes-core/abci/actions) directly against the BFT-replicated SQL state, inside FinalizeBlock. Determinism across replicas is enforced by construction (BFT-consensused BlockTime, deterministic generate_record_id() — see SCHEMA_RULES); there is no separate VM.
B. Contracts and IIoT are originators, not a regime
A contract atom (or an IIoT device event) originates a settlement transaction. Where that transaction goes is decided by scope — but unlike a human-initiated flow, a machine-originated atom may only ever land in Regime A directly:
atom touches only its own pyramid’s DB → Regime A (intra, BFT-atomic) — the only regime a contract atom or IIoT device may originate into directly.
atom’s process would span domestic sectors/data-centres → Regime B (national-aggregator Saga) — not reachable from a machine-originated atom; a human governor must originate the Saga step instead.
atom would trigger a cross-border transfer → Regime C (anchor + bilateral) — same restriction: a human governor originates the Intent, the atom cannot.
C. The key seam: a contract atom IS a Regime-B Step
The Regime-B Step interface (Execute + Compensate, both idempotent) is exactly the shape of a BPDI atom plus its declared reversal. So the Regime-B engine already built is the cross-sector smart-contract runtime: a multi-sector contract is a Saga whose steps are its atoms and whose compensations are the atoms’ declared reversals. No new execution model is needed — the contract’s compensating logic (authored in the studio) becomes Step.Compensate, and the orchestrator’s journal gives the contract durable, resumable execution.
D. What IIoT specifically requires
Machine origination with identity. Device events must be DID-authenticated and signed (the per-pyramid trust list); a device’s signature authorizes a contract trigger (StartInstance/Transition) restricted to Regime A. Reaching Regime B or C for that same underlying event requires a human governor to originate the transaction instead — the shipped restriction (internal/origin) trusts a device’s signature for identity, not for the judgment call of moving state (or money) across a sector, data-centre, or border.
Determinism. Because atoms execute in BFT, an IIoT-triggered atom must consume the consensused inputs (BlockTime, ContextData), never a device’s wall clock or a raw sensor read at execution time — the reading must be an input carried in the transaction, not fetched during execution. This is the same determinism rule that makes the contract safe to replicate and its output auditable.
Throughput, once a human governor is bridging events into Regime C. IIoT is high-volume; anchoring every cross-border event individually to Hedera is cost/latency-prohibitive (REGIME-C-STATE-MACHINE.html §8 #2) even with a human origination step in front of it. The answer is still batched anchoring: accumulate many roots, anchor a single Merkle root per batch, and issue per-root receipts carrying a Merkle inclusion proof. This preserves the OrderingAnchor abstraction while amortizing cost across thousands of device events — it just now sits behind the human-governor origination step, not directly behind the device.
E. Concrete code seams (to build)
BPDI-atom ↔ regimeb.Step adapter — wrap an actions.Action + its declared compensation as a Saga step, so studio-authored contracts run on the Regime-B orchestrator unchanged.
Batching OrderingAnchor (internal/anchor/batch) — Merkle-batch wrapper over any anchor, the IIoT throughput enabler; per-root receipts verify via inclusion proof + the batch’s underlying anchor receipt.
Originator / trigger — a small interface for autonomous (device/contract) initiation that produces signed Intents/Sagas from events, so origination is uniform whether the source is a human governor, a contract atom, or an IIoT device.
None of these freeze a wire format; all are testable offline on MemAnchor + MemJournal.
_____________________
Regime C — International Settlement State Machine (ratified, 2026-07-23)
Status: design review closed 2026-07-23 — the two-sided commit predicate P (§D) is implemented and tested. Of §E’s three stated assumptions, (b) and (c) hold in code, verified; (a) — the anchor’s own consensus safety — is not, and cannot be, verified by this codebase, and stays permanent residual trust rather than a to-do (see §E’s own updated note). Formal (TLA+) verification closed 2026-07-24 (§H item 5) for the part of the no-split-brain claim this codebase actually controls — this engine’s own concurrency bookkeeping, not assumption (a) — and found and fixed a real bug in the process (a late settle could silently overwrite an already-compensated intent). Wired live 2026-07-24: RegisterAgreement/SubmitIntent/RecordIntentReceipt/RecordCommitment/GetIntentStatus are real gov-api RPCs (proto/gov/v1/gov.proto), behind an --enable-regime-c flag that’s off by default (regimec.NewProductionEngine refuses to start without live Hedera credentials). See this doc’s own §2 (Second Design Pass). Update, 2026-08-01: two gaps in what “off by default” concretely meant are now closed at the code level. First, the gov-api-k8s Juju charm had enable_regime_c as a config option but no way to actually supply live Hedera credentials — flipping it would have crash-looped at startup; five new charm options (hedera_network/hedera_operator_id/hedera_operator_key_secret/hedera_topic_id/hedera_mirror_base_url) now exist, wired into the charm’s environment. Second, a new governance/internal/towergate package — an opt-in Connect interceptor, flag --enable-regime-c-tower-gate, off by default and requiring --enable-regime-c — routes SubmitIntent/RecordCommitment through the same coordinationGate/CastVote machinery Regime A’s Prepare already uses, giving a Tower’s own gov-api instance the standing per-transaction regulator-veto right §0a describes, without touching regimec.go/regimec_rpc.go at all. Neither closes the deployment gap itself — no real deployment has live Hedera credentials configured, and the charm change only makes it possible to supply them.
Scope: cross-border settlement between two sovereign national aggregators with no shared trust domain, no coordinator, no machinic vote.(Between counterparties, that is — a Tower’s own gov-api instance may still apply its own internal governance/veto to its own outbound calls via the 2026-08-01 towergate note above, which is a different thing from a shared coordinator between the two parties, and doesn’t contradict this line.) This is the hard case; treat the no-split-brain argument in §E as a claim to be challenged, not a proof.
A. What Regime C can and cannot give
Cannot: true atomicity / simultaneity. Impossible without a trusted coordinator, which is exactly what sovereignty forbids.
Can:“agreed-or-compensated” — every leg either completes or is provably reversed, within a bounded time τ, with a non-repudiable evidence trail sufficient for off-system (legal/regulatory) dispute resolution. Eventual consistency, not atomic commit.
The design’s whole job is to make the commit/abort decision a deterministic function of anchored, non-repudiable evidence, so both parties — and any auditor — compute the same outcome without communicating. That deterministic predicate is what replaces the coordinator.
B. Participants & pre-conditions
NA_I, NA_C — initiator and counterparty national aggregators (one per country; Regime A/B internally).
OrderingAnchor — neutral ordering/notarization oracle (Anchor(root)→(seq, ts, proof), Verify). Provides a total order + non-repudiable timestamps; does not judge validity. Hedera is one impl. A second impl, MemAnchor, exists for offline testing only — it cannot provide a real total order between two separate organizations. regimec.NewProductionEngine makes it structurally unreachable in production: it sources its anchor exclusively from anchor.NewLiveFromEnv and takes no anchor argument at all (see §E).
Bilateral agreement (M4) — pre-established: exchanged DIDs/keys, agreed suspense accounts on each side, timeout τ, amount/terms schema, and dispute terms. No per-tx trust is created on the fly. Implemented as regimec.Agreement.Timeout — a single value fixed at registration, validated positive, and binding on every Intent submitted under that agreement, so neither side (nor a bug on either side) can silently pick a different τ for the same corridor. Exchanged DIDs/keys (CounterSigningPublicKey) are now actually checked: RecordIntentReceipt/RecordCommitment reject any counterparty-claimed evidence whose ed25519 signature doesn’t verify against it.Update, 2026-07-31 — the “pre-established” half of this line, how two national aggregators that have never traded before actually find and verify each other before this exchange happens, now has a real answer: Kademlia-based corridor discovery. See the Q&A right after this section for the full story.
Suspense accounts — local, reversible holds on each side. The compensatable intermediate state. Funds in suspense are neither spent nor received until settlement.
C. Per-party state machine (symmetric)
Both sides run the same machine. The initiator starts at the debit transition; the counterparty enters at PREPARED on observing R_intent.
PREPARED → counterparty: validate M4+terms, credit→SUSPENSE (reversible), build Commitment{txid, accept}, Anchor → R_commit. Commitment deliberately carries no deadline of its own — it is always judged against its Intent’s single deadline (derived once from the Agreement’s τ, §B). A Commitment free to state an independent deadline is exactly the gap that lets one side settle while the other compensates for the same txid: a short-τ Intent times out and compensates, while a later-anchored Commitment carrying a longer, independently-chosen deadline still looks satisfiable and settles.
COMMIT_VISIBLE → both R_intent and R_commit observed in the anchor’s total order; evaluate commit predicate P (§4)
P true → SETTLING → SETTLED (suspense → final, on BOTH sides, deterministically)
deadline elapses without P → EXPIRED → COMPENSATING → COMPENSATED (suspense → reverse)
contested evidence → DISPUTED (anchored evidence escalated per M4 terms; off-system resolution). Partially implemented — genuinely forged evidence (a Commitment or Intent whose signature doesn’t verify against the claimed author’s key) is now detected and rejected outright by RecordIntentReceipt/RecordCommitment, closing the “nothing can tell forged from genuine” gap this note used to describe. But rejection today is a hard error returned to the caller, not a state transition — regimec.IntentStatus still has no DISPUTED value, and there is no escalation/off-system-resolution workflow triggered by it.
D. The commit predicate P (the heart of it)
P(txid) ≡ there exist, in the anchor’s total order, both:
a valid Intent(txid) signed by NA_I, and
a valid Commitment(txid, accept) signed by NA_C,
each with anchor-assigned timestamp ≤ its stated deadline (use the anchor’s clock/sequence, never local clocks — this removes skew ambiguity).
P true → both parties MUST move suspense→final.
deadline elapses without P → both parties MUST compensate.
P is a pure function of anchored evidence, so it evaluates identically on NA_I, NA_C, and any auditor. There is no state only one party can see. Implemented in governance/internal/regimec as Engine.evaluateAndMaybeSettle, invoked from both RecordIntentReceipt and RecordCommitment so either receipt can arrive first. Tested (not via a single TestNoSplitBrain — that function has never existed in this codebase’s history, despite an earlier version of this doc claiming otherwise) across both arrival orders, a declined commitment, a receipt on either side landing after the deadline, the exact-boundary case (timestamp == deadline, §E), and independent Engine instances that share only a durable Store converging on the identical outcome. This is the closest thing to the formal verification §H.5 asks for that exists today — not a substitute for it.
E. Why no split-brain (claim — challenge this)
A split (one side settles, the other compensates) requires the two sides to evaluate P differently. P’s inputs are only anchored, signed receipts in a total order. The anchor guarantees both sides observe the same receipts in the same order with the same timestamps. Therefore P cannot differ across sides. The boundary case — a receipt anchored exactly at the deadline — is resolved by the anchor’s own monotonic sequence (strict ≤), not wall clocks. Assumptions this rests on: (a) the anchor never forks/reorders/equivocates (its core safety property); (b) deadlines are expressed in anchor-sequence terms; (c) signatures are non-repudiable. If (a) fails, settlement safety fails — which is the residual trust placed in the anchor, and the reason it must be an auditable interface with a fallback, not a silent Hedera dependency.
Implementation status against these three assumptions (2026-07-23 review; updated 2026-07-29 to stop conflating (a) with a narrower guarantee it doesn’t cover): (b) and (c) hold in code, verified. (b): P compares Receipt.Timestamp, never wall-clock, and a boundary-exact test confirms strict ≤. (c): regimec.verifyCounterpartyAuthorship rejects any evidence claimed to be from the counterparty (whichever of Intent/Commitment that turns out to be, per-txid — resolved by comparing the evidence’s FederationID against the Agreement’s own, since either party can initiate) unless its ed25519 signature verifies against Agreement.CounterSigningPublicKey — a missing key, missing signature, or bad signature are hard rejections, not silent skips. (a) itself — the anchor never forking/reordering/equivocating — is Hedera’s property, not this codebase’s, and is not something any amount of review or testing here can establish; it remains exactly the residual trust the paragraph above names, permanently, not a status that can ever read “verified.” What IS true in code, and worth stating precisely rather than folding into “(a) holds”: regimec.NewProductionEngine takes no anchor parameter at all — its anchor is sourced exclusively from anchor.NewLiveFromEnv internally, which errors rather than silently falling back to MemAnchor when live Hedera credentials aren’t configured. There is no call site where a caller could pass in MemAnchor by mistake, because there is no argument to pass one through — the same structural guarantee (c) has, not a “remember to call the right function” convention. That closes a real, previously-open gap (“production silently ran on a fake anchor”) — but it was never, and isn’t now, evidence that Hedera itself is safe; those are two different claims and only the first is this codebase’s to prove. NewEngine itself is unchanged and still accepts any anchor, since tests need that flexibility and are not the risk this closes. Live wiring into gov-api landed 2026-07-24, the day after this review (see this section’s own Status line above) — see §H’s remaining items for what’s still open beyond that.
F. Failure modes
Failure
Handling
NA_C never commits
NA_I’s anchored deadline elapses → P false → NA_I compensates. Liveness bounded by τ.
NA_I crashes after both anchored
On recovery, re-derive state from anchored receipts (idempotent, §7); P is true → settle. No ambiguity.
Anchor unavailable
Cannot reach commit point → both eventually compensate on timeout. Safe (no false commit), not live. Motivates anchor fallback impls.
Byzantine counterparty repudiates a signed commitment
txid + anchored total order block replay; local suspense hold blocks double-spend within a side.
G. Non-negotiable implementation properties
Idempotency: every transition keyed by (txid, phase); re-processing an anchored receipt is a no-op. Required for crash recovery by re-derivation from the anchor.
Suspense before commit: never debit/credit final state before P; only suspense holds, which are always reversible.
Deadlines in anchor-sequence, not wall-clock.
All evidence anchored before acted on: a side acts on R_* only after Verify against the anchor.
H. Open questions (block coding)
Multi-leg / N-party settlement (a chain of >2 national aggregators): does P generalise, or is it strictly bilateral with chained bilaterals? (Chained bilaterals are safer; N-party atomic is back toward the coordinator problem.) Resolved, 2026-07-24: chained bilaterals, not N-party atomic commit. An N-party flow is a chain of fully independent bilateral Intents, each under the Engine’s existing, unchanged two-party P — nothing about P or the no-split-brain argument changes per leg. Intent.ChainID (optional; empty for every existing standalone caller) groups a chain’s legs for observability (ListIntentsByChain), never consulted by any settlement decision. Cascading a failed leg’s compensation to an already-settled neighbor (never reversed in place — a fresh refund Intent instead, the same property escrowexec already proved for Regime B’s own N-party composition) needs no Engine changes: the failed leg’s own regimeb compensation Step submits the refund, demonstrated end-to-end by TestChainedBilateral_ThreePartyChain_FailedLegCascadesToSettledNeighbor.
Anchor cost/throughput: anchoring every Intent+Commitment to Hedera has per-message cost/latency. Batch roots? Per-corridor aggregation? Still open and unaddressed at the Engine layer — RecordIntentReceipt/RecordCommitment take an already-produced receipt; batching (or not) is entirely the caller’s problem. The batching OrderingAnchor wrapper exists and is tested elsewhere in this codebase but has zero importers.
τ selection: too short → false compensations under normal latency; too long → funds held in suspense across borders. Per-corridor parameter in M4. Partially addressed: τ is now a single, code-enforced value per Agreement (§B) rather than one each caller could pick independently — but what value to pick per corridor, and how the two parties agree on it out-of-band before registering matching Agreements on both sides, is still undecided.
HTLC alternative for pure asset swaps: for the swap subclass (each side locks an asset), hash-time-locked contracts give stronger atomicity (preimage reveal) without an anchor. Worth a dedicated path? Probably yes for FX-style swaps; the anchored-Saga here is the general-settlement path. Still fully open — no code anywhere.
Formal verification: the no-split-brain claim (§4.E) deserves a TLA+/model-checked treatment before production. This is money crossing borders. Done, 2026-07-24, for the part of the claim this codebase actually controls: internal/regimec/tla/RegimeC.tla models evaluateAndMaybeSettle/CheckTimeouts‘s own concurrency structure — not §4.E’s P-is-a-pure-function argument itself, which is sound as stated — and found a real bug: Store.UpdateIntentStatus wrote unconditionally, so a late-arriving, genuinely valid RecordCommitment could silently overwrite an already-COMPENSATED intent back to SETTLED, erasing the record of a real fund reversal. Fixed with a compare-and-swap (fromStatus/toStatus); TLC re-run against the fixed code finds no violation, exhaustively, over the modeled state space. tla/README.md states the scope honestly: this does not and cannot verify §4.E assumption (a) (the anchor’s own consensus safety) — that’s Hedera’s property, not this codebase’s, and stays exactly the residual trust §4.E already names, permanently. Nor does it model multi-leg/N-party (item 1 above) or τ selection (item 3).
The auditable underlay for organisations whose operational systems span more than one of our nine vertical sheets — or whose use case combines continuous cryptographic IIoT capture with self-executing multi-party smart contracts. Cryptographic continuous audit of telemetry + multi-party contract execution + cross-counterparty attestation, sitting underneath your existing PLC / SCADA / DCS / MES / historian / batch-record / OPC-UA / sensor-fleet / ERP / contract-management / treasury systems. We don’t replace any of them — we bind to them via a published integration mode and produce tamper-evident, jurisdiction-independent records of everything they emit, plus contract execution that fires automatically when IIoT-attested conditions are met.
This sheet is horizontal — applicable to customers whose deployment crosses multiple of our vertical-specific sheets (aviation, manufacturing, mining, transport, energy, supermarket, housing × {UK / AU}, health, local-government). For single-vertical engagements, the per-vertical sheets are calibrated more tightly; use this one when the deal spans verticals, when smart-contracts execution is the lead value driver rather than pure audit, or when you’re scoping a platform deployment that anchors multiple future use cases.
What you get
Three integrated capabilities, one platform:
Continuous cryptographic IIoT audit infrastructure(the IIoT half — see iiot-aviation.md, iiot-manufacturing.md, iiot-health-medical.md, iiot-housing.md, iiot-defence.md, iiot-asset-management.md) Every sensor reading, every PLC tag change, every state transition, every calibration event, every firmware update, every batch-record entry committed to a Byzantine-fault-tolerant ledger and Merkle-anchored to the Hedera public DLT. This half is Part 2’s Mode A (hash-only attestation) — already built and verified end-to-end — applied to IIoT event types instead of financial transactions: the same signed hash-publish call, the same Hedera slab-anchoring guarantee, nothing new to build to turn this bullet on. Raw 1 Hz / 100 Hz / 1000 Hz telemetry stays in your historian where it belongs — we capture the audit-significant events that auditors, regulators, customers, and investigators want to verify. For customers in the same sensitive/regulated bracket Part 2’s Q9 addresses (aviation, defence), the same Data Visibility Ladder generalises from amount visibility to telemetry visibility — Rung 2 (platform-key encrypted) through Rung 4 (partner-key encrypted) readings in place of raw numbers, once each rung is actually wired in and a customer adopts one of the three content-receiving reference implementations (today, all three send content unencrypted, at Rung 1).
Self-executing multi-party smart contracts with IIoT-triggered conditions(the Smart Contracts half — see smart-contracts-manufacturing.md, smart-contracts-aviation-manufacturing.md, smart-contracts-health-medical.md, smart-contracts-housing.md, smart-contracts-defence.md, smart-contracts-asset-management.md) Roadmap — none of the templates below exist in the codebase today, the same honesty standard Part 2 applies to its own Modes B/C/D. What’s already proven, and this half would be built on: Part 3’s Regime C is a working, formally-verified multi-party conditional-settlement engine — a pre-established bilateral agreement, a commit predicate evaluated identically by every party and any auditor, Hedera-anchored ordering — scoped today to two parties (a national aggregator on each side of a border), not the N this pitch describes. And by design, “IIoT-triggered” can never mean IIoT-autonomous for the part of this that crosses a sector, data-centre, or border boundary: the platform’s own origination safety rule (Part 3, internal/origin) requires a human governor to originate any transaction leaving a single pyramid, whatever detected it — automation ends at the boundary a human reviews, not before it. Multi-party agreements (between OEM + supplier + customer + insurer + regulator + financier) would run as on-chain logic, with conditional escrow, IIoT-triggered condition detection feeding a human-originated settlement step, and automated payment release once that step lands — with full audit of which rule fired, which event triggered it, and who authorised the underlying agreement. Smart-contract templates, once built: Equipment-as-a-Service (pay-per-runtime), milestone-payment release, Power-by-the-Hour leasing, outcomes-based payer contracts, recall-execution co-ordination, AD-compliance retrofit, supplier-quality-event payment gating, cyber-supply-chain firmware promotion, Scope-3 emissions evidence-flow, multi-party recall + insurer coordination.
Regulator, customer, financier & insurer-grade evidence pipeline Live data access for every relevant regulator across the verticals you operate in; customer-audit-grade evidence packs for tier-up audit programmes; financier-grade evidence for green-finance + sustainability-linked-loan compliance; insurer-grade telemetry for product-liability + business-interruption + recall + cyber-supply-chain underwriting. Cross-vertical: one platform, one evidence trail, multiple regulator interfaces.
What we sell — and what we don’t
What we don’t sell at any price: full transaction-front-end replacement. We don’t build your MES, your SCADA HMI, your ERP, your customer portal, your contract-management system, your treasury platform, your supplier portal. Your operational and customer-facing screens stay put. If you need a new screen, your engineering team builds it against our published SDK with our reference connectors.
What we do sell falls into two groups:
A. Operator utilities (bundled — Items 2 + 4 in the pricing table)
Evidence-retrieval portal — your compliance + treasury + risk team pulls cryptographic proofs in response to any regulator, customer-auditor, financier, insurer, accident-investigator, or coronial-inquiry question. Generates evidence packs in formats acceptable across the verticals you operate in.
Smart-contract dashboard — live view of every active multi-party contract, their attached IIoT-resolution conditions, escrow balances, pending counterparty signatures, automated execution history. Real-time view of “what’s about to fire next”.
Trust-management UI — operator-side controls for your enterprise PKI: certificate issuance for plant managers / quality engineers / treasury officers / contract counterparties / regulator inspectors / customer audit reps, revocation, partner-org onboarding across all the federations you operate, kill-switch.
B. Counterparty / supply-network smart-contract participation UI (optional — Item 5 in the pricing table)
Thin signature surface for every external counterparty that participates in your multi-party smart contracts — tier-2/3 suppliers, customers signing-off on outcome attestations, financiers releasing escrow, insurer surveyors triggering claim settlements, regulators co-signing compliance retrofits, accreditation surveyors signing-off on outcome verification. This is explicitly in scope for us to develop, distinct from the “no contract-management platform replacement” line above.
What it does: – DID / certificate-based authentication (multi-vertical credential acceptance) – Per-tenant queue of pending smart-contract signatures and outcome attestations – Sign + submit with cryptographic proof landing in the BFT mesh and (where conditions are met) firing the contract’s automated release – Multi-tenant via entnum — each counterparty sees only their own queue across whichever federations they participate in
The authentication and sign-and-submit transport isn’t new design: it’s a client of Part 1’s RelayService SDK (built and verified end-to-end for Java, Python, Node, and .NET) — a counterparty authenticates with its own credentials and relays into the same Kademlia/wp-06-gated path the CONNECT and SOCKS5 front ends use. What’s actually new build here is the UI itself: the screens, the per-tenant signature queue, the workflow.
What it explicitly is NOT: – A contract-lifecycle-management replacement (ContractWorks, Icertis, Ironclad stay put) – A counterparty CRM – A treasury / escrow / payments platform replacement (the contract triggers payment release; your treasury system actually moves the money)
When you’d buy this: complex multi-party multi-vertical contracts where M-of-N cryptographic co-signature is structurally required (Power-by-the-Hour leasing spanning manufacturing + aviation; multi-tier recall coordination spanning manufacturing + insurer + regulator; outcomes-based payer contracts spanning health + payer + reinsurer).
Pricing — five line items, four budget homes (Item 5 optional)
#
Item
Type
Indicative price (AUD)
1
One-off integration & onboarding — integration-mode selection, wiring against your IIoT data sources (PLC / SCADA / DCS / MES / historian / OPC-UA / batch-record) + your contract-counterparty systems (ERP / treasury / contract repository), certificate-authority setup, smart-contract template selection, UAT, launch
One-off CapEx — capitalisable over 3–5 years
A$180,000 – A$400,000
2
One-off operator-UI + smart-contract configuration — evidence-retrieval portal skinned to your brand; smart-contract dashboard customised; regulator + customer-audit + financier export templates calibrated for the verticals you operate in; SSO with your IdP; smart-contract templates instantiated for your specific use cases
One-off CapEx — capitalisable over 3–5 years
A$80,000 – A$180,000
3
Annual support & maintenance (security patches, OS/library upgrades, 24×7 help desk for IIoT-safety-critical + contract-execution-time-sensitive operations, 99.95% uptime SLA, integration-mode adjustments, smart-contract-template updates as new patterns are released)
OpEx — renewable annually
A$130,000 / year
4
Tx-Rails platform access — BFT infrastructure, audit attestation, Hedera anchoring, dual-DC redundancy, smart-contract execution layer, regulator + customer-audit + financier pipeline. Includes the three operator utilities. Tiered by deployment complexity — see range governance below.
Counterparty smart-contract participation UI(optional) — thin signature surface for every external counterparty that participates in your multi-party smart contracts. NOT a contract-lifecycle-management or treasury replacement.
One-off CapEx — capitalisable over 3–5 years
A$100,000 – A$280,000
Year 1 total (Tier-3 example: 3–4 pyramids, multiple smart-contract types, Items 1+2 mid-points, Item 5 excluded)
A$900,000
Year 1 totalwith Item 5 mid-point
A$1,090,000
Year 2+ ongoing (Tier-3 example)
A$530,000 / year
Item 4 — deployment-complexity tier pricing:
Cross-vertical complexity is the dominant variable here — not portfolio size, not facility count, not pyramid count alone. Tiering reflects the operational complexity of running multi-party smart contracts across multiple federations and verticals.
Tier
Customer profile
Deployment shape
Annual platform fee (Item 4)
Tier 4
Single-vertical, IIoT-only, no smart contracts — Shape 3 single pyramid or pilot
1 pyramid, IIoT audit only
A$120,000
Tier 3
Single-vertical IIoT + 2–3 smart-contract types, OR cross-vertical IIoT-only on 2–3 pyramids — Shape 2 small cluster
Multi-vertical, multi-jurisdiction, deep smart-contract integration (a global OEM with PBH leasing + recall co-ordination + Scope-3 supply-chain + cyber-supply-chain firmware promotion + tier-2/3 supplier payment contracts all running on the same underlay) — Shape 1 sovereign + Shape 2 cross-federation
8+ pyramids, full multi-SC
A$2,500,000+
Item 1 — what governs the range: Modes B, C, and D below all now have their core mechanisms built, each as a reference implementation, not a packaged product a customer simply installs — see Part 2’s own Roadmap section — so today every deployment still starts at Mode A; the higher-priced ranges describe where a deployment would land once a customer actually adopts the relevant reference implementation. – A$180k floor — hash-only attestation (Mode A, built today) + single-template smart-contract instantiation: your IIoT sources commit as normal; we receive content hashes; one smart-contract template (e.g. just EaaS pay-per-runtime). – A$400k ceiling — atomic dual-write (Mode D, core mechanism built, reference implementation) + multi-template smart-contract instantiation: your MES / ERP and Tx-Rails commit in the same transaction; multiple smart-contract templates wired across multiple federations. – Most operators would land mid-range with CDC observation (Mode B, core mechanism built, reference implementation) + 2–3 smart-contract templates at ~A$260–330k.
Item 5 — what governs the range: – A$100k floor — single-flow counterparty kiosk (e.g. just sub-tier-supplier milestone signoff), single role, default branding. – A$280k ceiling — multi-flow hub (PBH credit + milestone payment + recall-batch-receipt + outcome attestation + Scope-3 evidence + insurer claim signoff), multiple role tiers, DID auth, deep brand alignment, complex multi-vertical workflows.
___________________
PART 4 (cont’d): Smart-contract templates included
Roadmap — see “What you get” above: none of these exist in the codebase today. The following multi-party smart-contract templates would ship with the platform and be instantiable under Item 2 (configuration) without separate per-template licensing, once the Smart Contracts half is built on Part 3’s Regime C foundation. New bespoke templates would work the same way, under Item 2 (within the band) or as a follow-on scope.
Template
Trigger source
Typical parties
Used in vertical sheets
Equipment-as-a-Service (pay-per-runtime)
IIoT runtime telemetry
Equipment vendor + customer + financier
Manufacturing, Aviation (PBH), Mining
Milestone payment release
Multi-party signoff event
OEM + tier-1/2 supplier + financier
Manufacturing, Aviation, Local Govt (capital works), Mining
Council + state planning authority + applicant + objector
Local Government
Conflict-of-interest declaration binding
Self-attested declaration event
Councillor + matter under decision
Local Government
Supplier-quality-event payment gating
IIoT FAI / PPAP / quality-deviation event
Supplier + buyer + customer-of-record
Manufacturing, Aviation, Health
Payback and ROI
The combined IIoT + Smart Contracts platform value sits where pure-IIoT and pure-contract-management both leave money on the table — automating multi-party flows that today happen via email + phone + spreadsheet reconciliation.
For a Tier-3 deployment crossing 2–3 verticals (typical: a Tier-1 manufacturer running supplier-quality smart contracts in manufacturing + EaaS-runtime contracts in industrial-machinery + recall-coordination contracts in product-liability), ~A$900M revenue spanning the relevant operational scope:
The combined-sheet ROI is materially higher than any single-vertical sheet because: 1. Cash-cycle compression is a step-change in multi-party contract execution; single-vertical sheets understate this because vertical scopes often have shorter intra-vertical cycles. 2. Cross-vertical evidence reuse — Scope-3 evidence captured for one customer relationship satisfies a CSRD obligation that also satisfies a green-finance covenant that also satisfies a sustainability-linked-loan margin trigger. One IIoT capture, three independent value lines. 3. Smart-contract automation removes labour that was distributed across the vertical sheets as separate ROI lines — when those lines combine, the absolute labour-cost reduction stacks.
How this sheet relates to the per-vertical sheets
Use this sheet when at least one of the following applies:
Multi-vertical deployment — your operational footprint crosses 2+ of our vertical sheets (e.g. a Tier-1 utility that is simultaneously an Energy customer + Asset-Management customer + Local-Government counterparty).
Smart-contracts-lead use case — you’re buying the smart-contracts execution layer as the primary value driver, with IIoT capture as the supporting infrastructure (e.g. an OEM whose Power-by-the-Hour contracts are the lead deliverable, with IIoT being how the conditions resolve).
Platform-anchoring deployment — your first use case is single-vertical but the deployment is sized for future cross-vertical use (e.g. starting in manufacturing but anchoring future expansion into recall-coordination smart contracts that span manufacturing + supermarkets + insurer).
Counterparty-of-record across multiple verticals — you’re a sub-tier supplier or counterparty participating in smart contracts initiated by customers across multiple verticals, and you want a single platform participation rather than separate per-customer deployments.
For single-vertical, single-purpose deployments, the per-vertical sheets are calibrated more tightly — they reflect that vertical’s specific regulator anchors, customer-tier patterns, and ROI drivers. Use them in preference unless one of the above applies.
Pilot terms — non-binding, parallel-run, zero operational risk
3 months running Tx-Rails alongside your existing systems. No production switchover.
Mode A (hash-only) integration with one chosen federation for the IIoT half, plus one smart-contract template instantiated for the Smart Contracts half.
Walk-away clause: if at month 3 the metrics don’t meet agreed targets, the engagement ends.
Regulator + customer-of-record pre-validation: before signing, we’ll meet with your relevant regulator + at least one major customer’s audit team to confirm evidence-pack and smart-contract acceptability.
Data ownership: cryptographic exports are open-format, re-readable indefinitely.
Why now
CSRD + ESRS + ISSB IFRS S2 climate-disclosure regimes now in their first reporting cycles — multi-vertical Scope-3 evidence-flow is operationally non-negotiable.
Multi-jurisdictional insurance market hardening — product-liability, cyber-supply-chain, business-interruption, recall coverage all hardening; telemetry + smart-contract-attestation increasingly required for coverage.
Cyber-supply-chain regulatory regimes maturing in parallel (EASA Part-IS, FAA NPRM 22-04, EU NIS2, US Executive Order 14028) — firmware-provenance smart contracts move from “interesting” to “mandatory”.
Outcomes-based contracting scaling across multiple verticals (health, infrastructure, defence, education, justice) — multi-party attestation infrastructure becomes the differentiator vs traditional fee-for-service procurement.
Modern Slavery + Forced-Labor regulations (AU MSA, US UFLPA, EU CSDDD, UK MSA reform) — multi-tier supplier-attestation flows materially change procurement cost structures.
Industry 4.0 + IIoT maturity — the underlying telemetry already exists; Tx-Rails adds the trust + automation layer to investment your organisation has already made.
Next steps
60-minute discovery call (longer than per-vertical sheets because the cross-vertical scope warrants it) with your CFO + CTO + General Counsel + the operational leads from each in-scope vertical.
Scoping workshop (2-day on-site or extended remote) to identify the 2–3 lead smart-contract use cases and the 2–3 lead IIoT federations to anchor the pilot.
Letter of Intent — non-binding, signals pilot interest.
Pilot kick-off within 12 weeks of LOI (longer than per-vertical pilots because of cross-vertical scope).
Contact: John Olsen · john@itotchaincloud.com.au · +61 490 114 879 Reference data sources: combined reference base across all 9 per-vertical sheets (see those sheets for full citations); cross-vertical: CSRD + ESRS implementation studies (CDP, GRI Standards); ISSB IFRS S2 implementation studies; OECD Due Diligence Guidance for Responsible Supply Chains; ENISA + CISA cyber-supply-chain regulatory framework studies; sustainability-linked loan margin-impact studies (S&P Global, Bloomberg NEF); McKinsey + BCG industry-4.0 outcome studies; multi-party contract execution overhead benchmarks (Aberdeen, Forrester). Full citations available on request.
_____________________
All our code is Open Source and free to copy under the terms of the GNU Affero General Public License, as published by the Free Software Foundation, Version 3 or later (refer to home page)
ChubbyCheckers are the Auditors All built and deployable
__________________________________________
PART 5: Auditing — ChubbyChecker, and Why You Do Not Have To Trust Us
Parts 1–4 describe what the platform does and what it records. This part is about who checks that the record is true — and about the property that decides what such a check is worth: not who owns the checker, but whether a party who distrusts the operator can re-derive the same verdict without the operator’s help.
ITOTCCA writes the checks, runs the auditor meshes, and holds the keys those meshes sign their findings with. That is the honest current state and this part does not dress it up. What this part argues is that the usual remedy — hand the auditors to an independent third party — is the weaker answer, and that the stronger one is already most of the way built.
The reason is structural. Checks here are deterministic functions of consensus-agreed inputs, run per validator under a quorum, over block hashes anchored to a public DLT. Where that holds, any party with the data recomputes the check and gets the same answer — and who owns the machine that ran it first stops bearing on whether the answer is true. The property to protect is therefore not custody of the auditor. It is the ability of an outsider to re-derive the verdict. Everything below is organised around that distinction, including the places we do not yet meet it.
Why auditing is a Part and not a feature
A record is worth exactly what the check on it is worth. Byzantine consensus gives you agreement among validators, not honesty from the operator that runs them. Anchoring to a public DLT gives you an ordering nobody can quietly rewrite, not correctness of what was ordered. Content-addressed archival gives you a document that cannot be swapped, not a guarantee that the document was ever true. Every mechanism in Parts 1–3 is of this shape: it removes a way of lying, and leaves one standing.
What remains is the part no cryptography closes. Someone must state, in advance and in terms a person who did not build the system can decide, what “processed correctly” means; then test the running system against those statements; then have the result be checkable by someone who assumes they are lying. The first two are engineering and are largely done. The third is the reason this Part exists — and it is answered by reproducibility, not by employment. A finding you can recompute does not require you to believe the party that first reported it.
The point sharpens at the mechanism this platform leans on hardest. The layer table near the top of this document promises that ChubbyChecker detects r > f — provably compromised servers exceeding the Byzantine threshold — and raises an alert. It does not halt the platform; a human triages, deliberately. An operator that can be compromised can, in principle, be compromised together with its own alarm. The answer is not to give the alarm to someone else, who can also be compromised and whose compromise you would have even less visibility of. It is that the count is reproducible from anchored evidence: if we failed to alert when we should have, anyone holding the block stream can compute that we should have, and the anchoring means we cannot retroactively make the inputs say otherwise.
What ChubbyChecker already is — built, deployed, and structurally separable
ChubbyChecker is not a log reader. It is a set of independent auditor processes that stream committed blocks and run a registry of checks — some per transaction, some per block — against what they find. One hundred and thirty checks are registered across the four modules listed above (Aggd, repo-root, Orgnodes-Overseer, Tophats). Five properties of how they run are what make an eventual change of operator a deployment decision rather than a rebuild:
Its own quorum, per tier. Each audited tier has an auditor mesh of its own, itself Byzantine-fault-tolerant (n = 3f + 1; four units per mesh in the reference deployment, eight units running the joint checker across the estate). The auditor is not one box whose word you take.
The auditor is never weaker than what it audits. In production every auditor mesh carries the same node count as the tier it audits, on a three-rung ladder: 13 (f = 4) for tophats, aggregators and the registry, the singletons everything depends on; 10 (f = 3) for the commercial and regulator governors; 7 (f = 2) for member-classes and overseers. This pairing is a correctness property, not a sizing preference. Assurance is the lesser of workload integrity and audit integrity, so an auditor one rung down would cap the guarantee at the auditor’s number and let an adversary silence the audit more cheaply than the workload — settlement that proceeds, looks valid, and is unwitnessed. Correlated failure makes the same point without an adversary: whatever stresses the workload stresses the auditor, and the weaker one fails first, removing the evidence exactly when it matters. Equal is also the ceiling; a stronger auditor buys nothing, because it reads its evidence from the workload.
A separate orchestration stack, permanently. The auditor tiers run as LXD machine charms and will never run on the Kubernetes clusters that carry the workload. This is a trust-model decision, not a deployment convenience: an auditor sharing a control plane with the thing it audits shares a failure and compromise domain with it.
Quorum reads, and disagreement is an answer. Where a check reads replica state, it reads every replica and returns a disagreement as an error — never resolved majority-wins. An auditor that silently picks the popular answer manufactures the agreement it was meant to test. For the same reason a check that cannot establish which replica it is looking at must fail transiently rather than guess.
Findings that verify without us. Each checker attests its findings at intervals, signed with a key it holds, identified by a did:key derived from that signing key itself. A recipient verifies an attestation using only the attestation — no registry lookup, no key distribution, and no reliance on any service the operator runs. This is the property that makes handing the role to somebody else possible at all.
Two independently sourced accounts of the same transaction. A baseline interceptor captures and seals a record of a transaction before any workload process touches it, so “what was submitted” and “what was recorded” are two separate facts an auditor can compare rather than one fact restated. Both directions are proven live against a real mesh: a clean transaction passes silently, and a persisted row corrupted directly in the database is caught as a catastrophic finding naming the mismatch — for core metadata (cc118) and, under the Data Visibility Ladder’s Rung 2, for encrypted amounts decrypted independently on each replica (cc-bpd-038).
Why an “independent owner” is the weaker guarantee
The reflexive remedy for “the operator audits itself” is to hand the auditors to an independent party. It is worth saying plainly why we do not think that is the stronger answer, because the objection is obvious and a pitch that ducks it deserves to be disbelieved.
It relocates trust rather than removing it. An independent auditor is independent by ownership, not by construction, and ownership independence has a well-documented failure mode: the auditor is structurally dependent on the entity it judges. Andersen with Enron, EY with Wirecard, the rating agencies before 2008 — in each case the independent party was formally independent and materially not. Buying that arrangement costs a new single point of capture, a permanent commercial dependency, and a party whose own compromise is less visible to you than ours is.
Reproducibility does not have that failure mode. A deterministic check over anchored inputs yields the same verdict in anyone’s hands. It cannot be leaned on, retained, or quietly re-scoped at renewal. It does not stop working because a relationship became commercially awkward. This is the same argument the rest of the platform already makes about consensus and anchoring, applied to the audit layer instead of exempting it.
Your own audits are load-bearing, not a courtesy. The claim “dishonesty would be visible” is true exactly to the extent that someone other than us holds enough evidence to recompute. Customers running their own checks against their own data is what supplies that condition. It is the reason the auditor is designed to need nothing but a block stream and read-only reads — so that running one is a normal thing a customer does, not a concession we grant.
The honest cost of encryption, stated here rather than discovered. As the Data Visibility Ladder seals more fields, the platform can read less — which weakens “our own checks would catch it” at the same time as it strengthens “we could not tamper undetectably”. Those move in opposite directions and both are real. Keeping verifiability without readability is exactly what the keyed-commitment design exists for, and it is why sealing fields is not simply a privacy win to be claimed without qualification.
What an outside party is genuinely for. One thing reproducibility does not supply is a person who can be struck off. Some regulators require a named, sanctionable signatory, and that is a question about who carries consequence, not about who is harder to corrupt. It is satisfied by an independent practitioner periodically re-running published criteria and attesting to the result — which is a far smaller thing than transferring the machinery, and is the engagement described further below.
What independence actually requires — six separable properties
“Independent auditing” is not one property. It is six, they are separable, and a pitch that treats them as one is hiding the ones it has not done. The third column is deliberately not “what handing this to someone else takes” — it is what makes each property checkable by a party who assumes we are lying. Ownership transfer is one way to satisfy some of these rows. It is never the only way, and for most of them it is not the cheapest.
What must be independent
Where it stands today
What makes it checkable by an outsider
1. The checks — who writes the code that decides pass or fail
Operator-written. Published under AGPL, so readable by anyone.
Reproducible builds plus review by the practitioner or an expert acting for them — or their own implementation of the same criteria. Publishing source narrows this; it does not close it, and the criteria document says so in those words.
2. The machines — whose infrastructure the auditor runs on
A deliberately separate orchestration stack and separate BFT meshes — but our hardware and our controllers.
A second party running the same checks on their own infrastructure and comparing. Nothing in the design blocks this: an auditor needs a block stream and read-only reads, never administrative access to the workload — which is what makes a customer-run auditor a supported configuration rather than a favour.
3. The access — what the auditing party is given, and no more
Read-only database roles, the block stream, and cluster metrics read with the auditor’s own service-account token.
Role scoping finished and granted per schema, so an external party receives exactly what the checks read and nothing else. Partly deployed; completing it is a prerequisite for handover, not a refinement afterwards.
4. The keys — who signs the findings
Each checker holds its own signing key and self-describes via did:key.
Already met, and independently of custody: because an attestation verifies from itself alone, a recipient never consults us to check one. Moving key custody to another party changes who signs, not whether a signature can be trusted — and is therefore optional rather than load-bearing.
6. The evidence — whether what is audited can be manufactured by the party being audited
Until 2026-09-06, no. Every input to the audit tier is something we produced — block hashes, trace
roots, slab anchors, commitments. Even the baseline, captured before any validator sees the transaction, is
captured by our gateway, so it establishes that the validators did not tamper relative to the gateway
and says nothing about the gateway. tx_signer.go says so in its own words: gateway-attested
signing “does not prove the individual DID holder’s own key touched the tx content”.
Content binding. The originator signs a digest of the request body with their own DID key; the audit tier
verifies that signature against a DID document resolved from chain, not against anything we hold
(cc-bpd-041, carried as ORIG-05 in the criteria document). A platform that substituted content
after authenticating a customer cannot sign as that customer. Built on the receiving side and registered; no
client yet produces the attestation, so today it correctly reports every transaction as unattested — a
coverage gap, deliberately distinguished from tampering.
This row is a different axis from the five above. Those concern the independence of the auditor; this
one concerns whether the evidence itself is forgeable. An auditor can be perfectly independent and still be
reading only what we chose to show it.
5. The judgement — what a result means
Our engineers read the check output and decide what it implies.
Criteria fixed in advance, stated so that someone who did not build the system can decide whether each is met. That document is the subject of the next section, and it is the part that could not be bought or borrowed.
The pattern is the one running through the rest of this document: nothing here is a rewrite. Four of the six are satisfied by publication, scoping and deployment against machinery that already exists — none of them require us to stop operating it. The fifth had to be written.
Extracting criteria from the checks — the part that is not code
A catalogue of 130 checks is not criteria. A check is a program: it answers a question its author already had. A criterion is a statement that a party outside the operator can find met or not met on a given date. Converting the first into the second is the actual work of making a platform auditable, and it cannot be done by generating documentation from code — a check catalogue silently asserts that whatever it happens to test is what mattered.
The result is a companion document, tx-rails — Criteria for the Integrity of Transaction Processing: thirty-three criteria in six groups — initialisation (5), evidence integrity (6), peer discovery and name resolution (5), integration mode and data visibility (7), federation boundary and settlement regime (6), and machine origination (4). The groups deliberately reach past the validator mesh into Parts 1 and 3, because a transaction admitted by an unverified peer, coordinated across a boundary it should not have crossed, or originated by a compromised device is not made sound by replicas agreeing about it afterwards.
Five rules give the document whatever force it has:
Every criterion must be able to describe its own failure. The table’s last column is “what a failure looks like”, and it is load-bearing. “Maintains the integrity of records” passes forever and means nothing; a criterion that cannot say what breaking it would look like is not a criterion, and the column is what stops one being written.
Criteria cite check IDs; they never paraphrase what a check does. The source stays the definition. A document that restates the code drifts from it with nothing comparing the two — which is how a criteria document becomes actively misleading rather than merely stale.
The citations are machine-verified, in both directions, by a test in the build. A criterion citing a check that is not registered fails the build. So does a claim that something is uncovered after it has been implemented — an understated gap is still a false statement to the practitioner reading it. The guard has already earned its place: registering a previously dead check broke the build, because the exclusions section still called it uncovered.
Scope and exclusions are prose, never a table. A table of criteria implies its own completeness; only prose can say what was not attempted. Deliberately out of scope: whether the data given to the platform is true. Tx-Rails records what it is given and cannot establish that a submitted valuation, hazard report or payment instruction is honest, and a criterion appearing to cover that would be the most damaging error the document could contain.
Name the misreadings the evidence invites. The sharpest is Mode A’s. Under hash-only attestation the customer’s own executed / committed / aborted lifecycle is not merely unrecorded but structurally unknowable — and the outcome row the platform does hold records whether our attestation committed on our chain, not the customer transaction it attests. Reading the first as an answer to the second would let a criterion appear to reach ground no mechanism reaches.
What writing the criteria found
Two findings, and the second is the one worth reading twice.
Four defects, all now closed. Two checks had been written, built, tested and registered nowhere — they had never executed once, including the only check that verifies what was submitted rather than the validators’ own account of it. A coverage count disagreed with itself in three different places in the same file. And on the eight auditor units running the joint checker, a check that could not execute was invisible, because the cycle it ran under reported success unless a catastrophic fault also crossed the threshold. None of the four was discoverable by reading the code normally; all four surfaced the moment a criterion had to name the mechanism supporting it.
Thirteen registered checks could not fail — and the four described as prevention gates refused nothing. Thirteen of the 130 had bodies that discarded their arguments and returned success, all emptied in a single metadata collapse in May 2026. Four were also registered as synchronous rejections in the commit path, registered precisely because the invariant they hold is worth refusing a transaction over — and each adapted the very same stub its check used. A fifth such gate was found that no document had counted, so the true figure was seventeen registrations that could not fail, not thirteen. Existing, registered, and non-vacuous are three separate properties, and only the third is worth anything.
All seventeen were resolved on 9 September 2026, and the resolution is more informative than the count. None was implemented in place. Sorting them by reason rather than by state showed that four held structurally — ordering and gap detection are guaranteed by consensus, session validation by the gateway — and owed nothing at all. Two were then built: phantom write and lost rollback, the first checks here that verify a write actually landed rather than that the validators agree about it. Two more closed permanently on decisions rather than code. One remains uncovered, blocked on a design that has not happened yet, and its requirements are now specified so the design can carry them. The count fell from thirteen to zero; the number of things genuinely needing work turned out to be one.
The lesson worth carrying past the incident: every one of the thirteen carried a comment explaining why it was stubbed, and several were wrong. One blamed the metadata collapse when the real blocker was missing instrumentation; one recommended reviving a half that cannot work; one described a check for a property its own title does not name. A stub’s account of itself is a hypothesis, not evidence — which is why the remediation judges whether a check is worth having from its title alone, before its implementation is read.
Neither finding was produced by running the system. Both came out of writing down what the system was supposed to guarantee and checking each sentence against the code — which is the argument for doing this before an outside party does it for us, rather than the argument against inviting one.
The engagement we are targeting — attestation, not handover
What an outside practitioner is engaged to do is re-run the published criteria and report what they find. They are not engaged to take custody of the auditor tiers, and the value of their report does not rest on their having done so — it rests on the criteria being fixed in advance and the evidence being anchored so that their run and ours are comparable.
First step — agreed-upon procedures (ISRS 4400). An independent practitioner performs procedures agreed in advance against the criteria and reports factual findings: no opinion, and independence status stated explicitly. The intended cadence is annual.
That cadence has a consequence worth stating rather than discovering. An annual attestation is a periodic snapshot;
obstruction is continuous. Between one attestation and the next there can be up to twelve months in which the only live
check on a finding being detected, published, and simply not acted upon is the escalation-on-no-response procedure
— which runs on the custody operator’s chain, triggers on the absence of our signature, and is
not yet built. The practitioner attests to what the record shows. It is the continuous mechanism that
determines whether the record shows anything at all. The deliverable is something a regulator, counterparty, financier or insurer can read without taking our word for anything — which is precisely what the evidence pipeline in Part 4 is otherwise asking them to do.
Second step — assurance (ISAE 3000). Stepping up from factual findings to an assurance conclusion is blocked on suitable criteria, not on finding an accountant. That is what the criteria document exists to be, and why it was written before anyone was engaged rather than in response to being asked for it.
The limitation we state and will not soften. The verification tool is written by the operator. Under an assurance engagement the practitioner must satisfy themselves it is fit — by reviewing it, having an expert review it for them, or using their own. Reproducible builds and published source narrow this; they do not close it. A criteria document that omitted this limitation would misrepresent the strength of everything above it, and so would a pitch. Note what the limitation is and is not: it is an argument for the criteria and the build being inspectable, and it would not be answered by us paying someone else to run the same operator-written tool.
How the separation is structured — two parties, because one is not permitted
The obvious commercial arrangement — find one company, give it a stake, have it run the auditors and sign off on them — is barred twice over, and it is worth setting out why before anyone proposes it.
An equity holding forecloses assurance. An ISAE 3000 engagement requires the practitioner to comply with the independence standards in the IESBA Code, Part 4B — adopted as APES 110 in Australia, PES 1 in New Zealand and the FRC Ethical Standard in the United Kingdom. A direct financial interest in the assurance client held by the firm is not a threat to be weighed and safeguarded; it is a prohibition. A firm holding shares in us cannot issue an assurance report about us, at any percentage worth negotiating over.
Operating the system and attesting to it is barred separately. A firm that runs ChubbyChecker and then reports on ChubbyChecker is reviewing its own work. That is a self-review threat, and the non-assurance-services provisions prohibit it independently of who owns what. Zero equity would not cure it.
So the structure is two parties with different jobs:
Party
What it does
How it is paid, and what that permits
The operator
Runs the auditor tiers on its own infrastructure, generates and holds the signing keys, and has no administrative access to the workload it audits — an auditor needs a block stream and read-only reads, never more.
Commercially, including equity if that is the deal. It is a service provider, not an assurance practitioner, so no independence standard applies to it. What it supplies is separation of operational control and key custody.
The practitioner
Re-runs the published criteria and reports what it finds. Does not operate anything.
Fees only. No equity, no financial interest, and not the operator. This is what makes ISRS 4400 now and ISAE 3000 later available at all.
What we will not claim. If the operator holds equity in us, the operator is not independent of us — it has a direct interest in us looking well run. That is an acceptable arrangement and a misleading adjective, so this document does not use it. The operator is described as what it is. The independence claim rests where the rest of Part 5 puts it: on a verdict a distrusting outsider can recompute, which does not depend on who runs the machine that computed it first.
And the separation is stated so that it can be tested, not merely contracted. Three assertions a practitioner can actually check: the platform operator holds no administrative access to the auditor tiers; the operating party generated and holds the signing keys; and an attestation verifies from itself alone via did:key, with no service of ours in the verification path. The third is already true and shipped. The first two become true on the day the operator takes custody, and both are the kind of statement the criteria document is built to carry.
One practical note, learned from how these engagements fail: the structure is disclosed to a prospective practitioner at first contact, not discovered by them later. Their own independence assessment will surface an operator’s shareholding regardless. Raised at the start it is a non-issue; found in week three it costs the engagement.
Status — what is built, and what is still a target
Item
Status
ChubbyChecker auditor meshes, one per audited tier, on a permanently separate orchestration stack
Built and deployed
130 registered checks across four modules; quorum reads that return disagreement as an error
Built and deployed
Findings signed per checker and verifiable standalone via did:key — no operator service in the verification path
Built and deployed
Those signed findings committed to the auditor meshes themselves, rather than written to a log the audited party controls — four distinct did:key identities per mesh, one per replica, each key generated on its own unit
Built and deployed — committing on all seven auditor meshes, 28 units across four hosts, with the count advancing on every one. Three of the seven had to be corrected first, and the correction is the point: governance and registry watch a database rather than a chain, so they observed no block heights, every window was identical, and because an attestation is keyed by its signature each republish collided into the one already stored. They were attesting continuously and the record showed four rows apiece. Anchoring the window to the chain the attestation is published to made successive claims distinguishable — registry 4 → 19, gov 4 → 69, commercial-gov 4 → 28 within minutes of the roll. All seven meshes were then rolled onto the current build — 28 of 28 units, one mesh and one unit at a time, verified by installed binary hash and by each unit rejoining the chain rather than by unit status, which stays frozen at its last config event. What a reader should take from that: “it is committing” was true throughout and still concealed the gap. The residual property — that nothing yet checks consecutive attestations differ — is carried openly as EVID-X3 in the criteria document
Baseline interception: an independently sourced record captured before the workload touches it
Built; both directions proven live (clean transaction passes, corrupted row caught)
Criteria document — 34 criteria in six groups, with citations machine-verified against the live registry in both directions
Written (v0.4), guard enforced in the build
Four defects the criteria exercise surfaced
Closed
Registered checks that cannot fail, and prevention gates that refuse nothing
Closed 2026-09-09 — seventeen registrations, none implemented in place. Four held structurally and owed nothing; two were built (phantom write, lost rollback); two closed permanently on decisions; one remains, specified and awaiting the design it depends on. Every green on the audit result now means something, which is the property that makes the rest of this table worth reading.
Read-only access scoped per schema for an external auditing party
Partial — a prerequisite for handover
Attestation retention period fixed to the reporting period a practitioner is asked to cover
To be set — a deployment decision, per customer
Auditor tiers operated by a separate party, on their infrastructure, with their keys
Supported, and deliberately not the goal. An auditor needs only a block stream and read-only reads, so a customer or third party can run one; we do not treat transferring custody as what makes the audit trustworthy.
A second party independently recomputing findings from anchored evidence
Possible today for any party holding the block stream — and not yet exercised by a customer against a live deployment
Two-party separation: an operator holding the auditor tiers and their keys, and a separate fee-paid practitioner who attests
Designed — and the reason it is two parties rather than one is a standards constraint, not a preference
Validator signing keys held in snapshot copies encrypted at rest, so a stolen backup does not hand over a mesh’s signing identity
Built 2026-09-03 — eight snapshot sets across four hosts sealed to a key held outside the snapshot hosts, which hold only the public half and cannot decrypt; removal of the plaintext was gated on a per-file hash proof that the sealed copy was byte-faithful first
Retiring a validator signing key that may already have been copied
Not built — no ABCI application emits validator-set updates, so every mesh’s validator set is fixed at genesis and a key cannot currently be retired. Named here rather than left to be found: a snapshot carries all four of its mesh’s keys, so what limits this exposure today is network isolation, not key rotation
Attestations survive the loss of the machines holding them — the auditor meshes carry an off-site copy
Not built — and it bears directly on the claim above it. The independence argument rests on attestations being committed to the auditor tier’s own meshes rather than to a log we control; those meshes have no copy anywhere else. Hourly copy-on-write snapshots now cover member-classes and the registry, which are the tiers being audited, not the tiers doing the auditing. A pull-based off-site store — one that holds keys for the estate while the estate holds none for it — was built on 2026-09-08–09 and has not yet completed a single copy.
Independent practitioner engaged under ISRS 4400 to re-run these criteria and attest
Target
The honest summary is two sentences that must not be collapsed into one. The machinery that lets someone who distrusts us reach their own verdict is built, separable, and running.Nobody outside has yet done so against a live deployment. Part 5 exists so that a reader can tell those two statements apart — and so that the second has a date attached to it rather than a hope. What it deliberately does not claim is that the answer is to find a more trustworthy owner: we would still be asking you to take somebody’s word for it, and the entire point of the record described in Parts 1–4 is that you should not have to.
Every distributed ledger agrees on the order of transactions. That is the easy half, and it is the half most products describe. The harder question is whether the nodes agree on the content of what they hold afterwards — because two nodes can accept an identical sequence of blocks, apply them, and end up holding different data, while agreeing on every block along the way.
The mechanism that closes this is an application hash: at every block, each node computes a digest over its own database and publishes it. If two nodes have drifted, their digests differ, and the mesh stops rather than continuing to pretend. It is the difference between “we all received the same instructions” and “we all hold the same answer”.
Three of our eight layers did not do this. Now they do.
The auditor tier, the tophats tier and the member-classes tier each computed no application hash at all. Consensus agreed on their block ordering and had no opinion whatsoever about what they had stored. As of September 2026 all three compute one, height-gated so that the change could be rolled to every node before any node began using it.
Two of the three are now fully covered. The auditor tier folds its attestations and its findings with nothing excluded. The tophats tier folds its replay checks, excluding only a per-replica sequence number and a local clock reading — and excluding the Hedera anchoring results entirely, because those record a per-node outcome that legitimately differs across the mesh. Folding a per-node result into a shared digest would manufacture exactly the disagreement the digest exists to detect.
The third is only partly covered, and here is why.
The member-classes tier is where customer business data lives, and its sensitive columns are sealed with authenticated encryption. That encryption uses a random nonce, which is what makes it safe: the same value encrypted twice produces different ciphertext, so nobody can tell from the stored data that two records contain the same counterparty, the same amount or the same route. That is a deliberate privacy property and we are not going to weaken it.
It also means a digest taken over those columns would differ on every node for every row, and the mesh would halt immediately. So the digest on that tier covers the consensus tables and not the sealed business data.
Stated plainly: on that one tier, the business data itself is not yet bound into consensus. A node whose records drifted would go on committing blocks alongside its peers. Everything else about that data is protected — it is encrypted at rest, its writes go through the ordered log, and the auditor tier attests to it independently — but the specific guarantee described above does not yet extend to it.
The route to closing it is a keyed commitment stored beside the randomised ciphertext: a value that is identical when the underlying data is identical, without revealing what that data is. That is designed and not yet built, and we would rather say so than describe the gap as covered.
In the meantime the boundary is enforced mechanically rather than by intention. A build-time check reads the list of tables each tier’s digest actually folds, out of that tier’s own source, and fails the build if a tier that seals data folds a table containing sealed columns. It is exercised in both directions before it is relied on — we confirm it refuses a bad configuration, not merely that it accepts a good one.
Retiring a Signing Key Without Rebuilding the Network
A validator signs blocks with a key. Over a network’s life those keys must be replaceable — because staff change, because a key is suspected, or simply because a regulator asks when it was last rotated and “never” is not an answer.
The mechanism is now built across four tiers: the validator set lives in committed state rather than in a file on each machine, changes are proposed as transactions and authorised against an approver set that is itself in committed state, and a change that would break quorum is refused deterministically by every node with the same code. Where a federation is regulated, a rotation additionally requires a recorded governance decision before it will apply.
It ships inert. Every part of it is deployed and changes no behaviour until three separate height gates are armed, in order, by explicit decision. This is why the application hash work above had to come first: consensus cannot safely branch on state that no digest covers, so a tier without one could never have rotated a key at all.
Not yet cleared: the acceptance tests that gate any live rotation. Four of the eight can run without a network and do; four require a purpose-built four-node mesh that carries no history, because two of them are destructive by design — one writes a validator set that would end a mesh, another revokes a database permission mid-block to prove the node halts rather than voting on a result it cannot compute. No key will be rotated on a live network until all eight pass.
The Integrity Criteria exist so that the things we have not done are written down in the same place as the things we have. This one was found in September 2026 and is worth repeating here, because it is the kind of thing a vendor does not usually volunteer.
A four-node mesh running on three nodes looks exactly like a four-node mesh running on four.
Byzantine fault tolerance is designed to absorb a loss. With four nodes the network tolerates one failure and carries on: the remaining three form a quorum, agree on every hash, and commit blocks at the normal rate. Every dashboard stays green — because every one of those signals is a measurement of the nodes that are still there.
We found one of our own validators had been down for two days. Nothing reported it. Block heights advanced normally, the surviving nodes agreed with each other, and the failed node’s status message read as though it were a passing hiccup. The network had been running with no remaining fault tolerance the entire time, and nothing said so — which means ordinary maintenance was carrying a risk nobody could see they were taking.
The node was recovered without touching any healthy node and without interrupting the network.The detection gap is open and recorded as a criterion. The fix is a check that compares live validators against the configured membership and reports the difference rather than the survivors’ agreement — the data already exists on every node; nothing reads it.
We publish this for the same reason we publish the criteria at all. A verdict you can only accept by trusting us is not a verdict, and a supplier who reports only what passed has told you nothing about what they looked at.
Off-Site Copies That a Compromised Network Cannot Reach
Backups are usually protected by policy: permissions, retention rules, object-lock settings. All of those are configuration, and configuration is exactly what an attacker who has reached your systems is in a position to change.
Ours is protected by topology. The off-site store pulls from the network; the network cannot reach the store. It holds credentials for the production hosts, and none of those hosts holds a credential for it. A compromised validator — or a compromised operator account — therefore cannot delete or alter what has already been copied, because there is no path from there to here. That property does not depend on a setting anybody could change.
One detail of the implementation is worth stating, because it is the kind of thing that quietly defeats a backup regime. The copying tool creates its destination at the start of a transfer, so a copy that exists is not necessarily a copy that finished. An interrupted transfer leaves something that looks like a backup and is not one — and every later run skips it, because it is already there.
Completion is therefore tested against a marker the copying process only writes when a transfer ends cleanly, never against the presence of the destination. Anything failing that test is deleted rather than counted. This has since caught a real truncated copy on a real interrupted transfer, which is the only kind of evidence that a check of this sort actually works.
Current status: the mechanism is proven; the siting is not final. The present store runs on hardware that is not always on, and a store that is off raises the effective recovery point for as long as it is off. Adequate to demonstrate the design; not the permanent tier.
APPENDIX: Cross-Synthesis — Where Parts 1–4 Interlock
Parts 1 to 4 above were written separately, at different times, for different audiences. Read against each other rather than in isolation, several of them turn out to answer open questions the others leave standing — sometimes closing a real gap, sometimes only revealing one that wasn’t visible from inside a single part. This section states each synthesis plainly and is explicit about which are already true today, which are dangling (built but not connected), and which are still just ideas.
1. Kademlia is the missing bootstrap for Regime C’s bilateral agreements
Part 3’s Regime C requires a pre-established M4 agreement — “exchanged DIDs/keys… no per-tx trust is created on the fly” — but never specifies how two national aggregators that have never traded before actually find and verify each other before that exchange happens. Part 1’s entire pitch is that exact problem, already solved: enterprise-CA-gated Kademlia peer discovery, no central directory. Using it as the discovery layer for onboarding a new Regime C corridor turns “pre-established” from a hand-wave into a real, buildable flow, without introducing the coordinator Regime C is specifically designed to avoid.
Status (updated 2026-07-31): done, corrected scope. The blocker this synthesis named had already cleared before this update: workplan #6 (enterprise-CA peer identity) has been code-complete since 2026-06-02 — kademlia-edge-overlay.md‘s own “⌛ Roadmap” framing for it was simply never reconciled with that. But the plan’s assumed mechanism didn’t hold up either: wp-06’s peerverify.PeerVerifier only exposes IsVerified(peerID) bool, no accessor for a verified peer’s identity material, and no DHT publish/discover mechanism for arbitrary payloads existed. Built instead: a federation self-signs an AgreementAnnouncement (governance/internal/regimec/discovery.go) with the same keypair it intends as its CounterSigningPublicKey; governance/cmd/h3-rpc-gw publishes/discovers these over the DHT (governance@dae61c3), gated on wp-06 verification on both the serve and discover sides. Deliberately does not feed RegisterAgreement automatically — registering a discovered trust anchor for live cross-border settlement stays a human decision, matching wp-06’s own still-roadmap “permissioned peer acceptance” stance.
2. Regime C’s evidence should be archived and content-addressed the same way Mode A’s is
Part 3 names assumption (a) — the anchor never forking/reordering/equivocating — as permanent, unverifiable residual trust, and separately leaves DISPUTED evidence resolution as off-system and under-specified. Part 2 already solved the adjacent problem for domestic transactions: cmd/block-archiver plus hash-addressable lookup (merkle-audit --tx-hash) means a disputed record is locatable and independently checkable without trusting anyone’s database, even after the source node has pruned it. Applying the identical pattern to R_intent/R_commit receipts would give Regime C disputes the same evidentiary posture Part 2 already built and verified for Mode A — a concrete answer to how DISPUTED evidence actually gets produced for off-system resolution, without needing to solve assumption (a) itself.
Status (updated 2026-07-31): done, narrower than the synthesis above assumed. Investigation found regimec.Engine.ExportEvidence (already existing, already RPC-wired) had already solved the durability half of this: its own doc comment is explicit that anchor.Receipt.Proof is deliberately never persisted, since the whole point of anchoring to a public ledger is that the proof is independently re-derivable from OrderedReceipt via the anchor’s own Verify, not something the Engine needs to be a trusted custodian of — and Postgres already durably holds everything it does own. A separate block-archiver-style archive (plus CLI) would have duplicated durability Hedera and Postgres already provide, not added any. The one genuine gap — locating an intent_id from just a disputed record’s own content, mirroring merkle-audit --tx-hash‘s role for Mode A — is now closed: Store.FindIntentIDByPayloadHash (MemStore + PGStore via pgcrypto’s digest()) and the FindIntentByContentHash RPC (governance@8f4e2d9, proto@c7483e0), composing with the pre-existing ExportEvidence for the full bundle.
3. The IIoT-restricted-to-Regime-A safety property is a stronger claim than Part 4 currently sells
Part 3 states that IIoT/smart-contract origination is “hard-restricted to Regime A (2PC) only” — Saga (Regime B) and international settlement (Regime C) are never reachable from a machine-originated atom. Read against Part 4’s pitch (PLC/SCADA/sensor fleets triggering contract execution automatically), this is the answer to the first question any security-conscious buyer asks: can a compromised sensor move money across a border? By construction, no — a stronger and more concrete claim than anything currently in the Part 4 pricing sheet.
Status (updated 2026-07-31): P0 closed at aggd’s own seam. governance/internal/origin‘s Originator.Originate() and its wiring into all three gov-api RPC entry points (internal/gov/origin_rpc.go‘s checkOrigination) was already real, tested, fail-closed code. What was missing — a way for any caller to actually express an origination claim on the wire — is now built: transactions.v1.ExecuteTransactionRequest carries origin_kind/origin_identity/origin_signature/block_time (proto@c65e332); aggd/internal/txservice.Server.ExecuteTransaction extracts them into an OriginClaim and forwards it through the widened SagaGate interface; aggd/internal/govgate.Gate.CheckSaga translates that onto SubmitSagaStepRequest‘s own origin fields (aggd@0f21623). Zero-value OriginClaim — every pre-existing caller — leaves the fields unset, so this is purely additive. Remaining scope, not yet closed: this wires the seam at aggd’s own boundary; whatever originates the underlying IIoT/contract-atom event further upstream (org-gateway, orgnodes-core) still needs to actually populate OriginKind when it calls ExecuteTransaction for the restriction to activate end-to-end against real device traffic. The claim in the paragraph above is now backed by working, tested plumbing all the way to gov-api’s gate — not yet by a live upstream caller that uses it.
4. Part 2’s Data Visibility Ladder is Part 4’s IIoT-telemetry answer, under a different name
Q9’s four-rung Data Visibility Ladder (plaintext / platform-key encrypted / customer-key encrypted / partner-key encrypted) was designed around structured atom fields generally, with financial amounts as its sharpest instance. But Part 4 sells continuous IIoT telemetry capture — production counts, throughput, proprietary process parameters — to the same aviation/defence verticals Q9 already names. Same shape of problem (a customer who’ll accept cryptographic commitment but not raw-number visibility) wearing a different label. The ladder doesn’t need a redesign for IIoT; it needs generalising from “amount visibility” to “quantitative-fact visibility” and cross-selling into Part 4’s pitch.
Status (updated 2026-07-31, positioning; superseded 2026-08-01; refined 2026-08-16; renamed and reconciled with the design doc’s own four-rung rewrite, 2026-08-17): positioning done — Q9’s own section (Part 2) explicitly names Part 4’s IIoT telemetry as the same shape of problem the ladder will eventually generalise to cover, and Part 4’s IIoT-audit-infrastructure pitch item cross-references Q9’s ladder in return, visible in both directions in the pitch text itself. What’s changed since: this note originally said “nothing to build differently for IIoT until a content-receiving mode exists at all” — that premise no longer holds. All three roadmap modes (B, C, D) now have their core mechanisms built and receive real content when a customer adopts one, unencrypted, at Rung 1. As of 2026-08-16 the ladder is no longer uniformly undesigned: Rung 2, platform-key encrypted (amounts recorded as a positional array, encrypted under Tx-Rails’ own key, decrypted for constancy checks — see structured-atom-privacy-ladder-design.md), is concretely scoped for the financial-amounts case. Rung 3, customer-key encrypted, is now also partially solved as of the same rewrite — but only for fields the platform never validates in the first place (the same content-store opaque-reference pattern applies to a telemetry field as to an amounts field); the narrower case of a platform-validated telemetry field (a range check, a cross-sensor consistency check) stays the genuinely hard, ~6–9-month, per-field-scoped case, financial or IIoT alike. Whether the Rung-2 positional-array pattern generalises cleanly to IIoT telemetry sequences hasn’t been separately verified — flagged as a real open question, not assumed. Rung 4 (partner-key encrypted) remains genuinely undesigned, financial or IIoT alike.
5. “Optionality of centralization” is one unnamed design philosophy running through three parts, not three separate facts
Part 1 is “optionally absent DNS.” Part 3’s deployment Shapes are an explicit spectrum from Tower (fully isolated) to Shape 3 (maximally shared). Part 2’s anchor choice is chain-selectable — “pick the anchor that fits your own risk/cost tradeoff.” None of these three sections reference each other, but they’re the same architectural move made three times: never hard-code a central dependency; make it a configuration axis the customer owns. Naming that explicitly turns three separate technical facts into one coherent principle worth leading a pitch with, instead of something a reader has to notice is a pattern on their own.
Status (updated 2026-07-31): done. The three underlying capabilities were already real (anchor choice and Shapes built; Kademlia’s core discovery built, per synthesis 1 above) and remain unchanged by this item — it’s the naming that shipped. “Optionality of centralization” is now written up explicitly, ahead of Parts 2 and 3 alongside the Local/Global tagline, naming DNS-optionality (Part 1), chain-selectable anchoring (Part 2), and deployment Shapes (Part 3) as one deliberate principle rather than three coincidentally similar facts a reader would otherwise have to notice unaided.
6. Regime C’s “any auditor” claim has no mechanism — Part 2 already built one, and Part 5 says who may run it
Part 3 §D asserts P “evaluates identically on NA_I, NA_C, and any auditor,” but never says who that auditor is or how it would be deployed. Part 2’s ChubbyChecker — independently operated, independently deployed, alerting past a compromise threshold — is exactly that mechanism, just never pointed at Regime C’s predicate. The honest version of Regime C’s audit story isn’t a new subsystem; it’s ChubbyChecker checking P instead of the domestic Trace, reusing an organisational and deployment pattern that’s already proven rather than promising a new one.
The half this synthesis left open was never the mechanism — it was the word “any”.cg04 settles how an auditor checks P. It says nothing about who is entitled to be that auditor, and a predicate only one party can evaluate is not the claim Part 3 §D actually makes. Part 5 answers that half, and answers it without naming anyone: because the checks are deterministic over consensus-agreed inputs and the evidence is anchored, “any auditor” means any party holding the block stream, who recomputes the same verdict and needs no permission from us to believe it. That is why Part 5 argues against handing the auditor tiers to an appointed third party — doing so would convert “any auditor” into “a particular auditor”, which is a weaker claim than the one Regime C already makes and than the one cg04 already supports. The appendix is otherwise scoped to Parts 1–4; this is the one place where the fifth Part closes a question raised inside the first four.
Status (updated 2026-07-31): done. cg04_regime_c_predicate_divergence (governance/cmd/chubbychecker-governance/checks-governance-only, governance@eabec83) reads gov_coord.intents/gov_coord.commitments directly — the same Postgres the auditor already opens read-only for Regime B’s cg01–cg03 — and reproduces evaluateAndMaybeSettle‘s predicate exactly. Flags any SETTLED intent whose evidence doesn’t actually satisfy P (catastrophic — no race window, since SETTLED is terminal) and any ANCHORED intent that’s satisfied P for more than 5 minutes without settling (transient — may still resolve). Full test coverage on both the pure predicate function and the check’s own catastrophic/transient/clean branches.
7. The Local View / Global View naming is accidentally backwards — and that inversion is a better tagline than either name alone
“Local View” (Part 2) is about one transaction’s Merkle proof to Hedera — the most globally-verifiable thing in the platform, checkable by anyone, anywhere, trusting nothing. “Global View” (Part 3) is about which VM in which pyramid coordinates a transaction — an inherently local deployment-topology question. Once noticed, the inversion is a gift for the pitch: every transaction is processed locally, but verifiable globally — a sharper claim than either section title makes on its own.
Status: done. The tagline now runs ahead of Parts 2 and 3, immediately above the section titles it reinterprets, with a one-line gloss making the inversion explicit rather than leaving it for the reader to notice.
8. Part 3’s Regime C engine is the closest thing Part 4’s smart-contract layer has to a working prototype
Part 4 pitches “self-executing multi-party smart contracts with IIoT-triggered conditions” — escrow, automated payment release on attested outcomes, fourteen named templates (Equipment-as-a-Service, Power-by-the-Hour, milestone payment, multi-party recall, and so on) — as a priced, available line item. None of the fourteen templates exist in the codebase under those names or any other. But Part 3’s Regime C already is a working multi-party conditional-settlement engine: a pre-established bilateral agreement, a pure commit predicate P evaluated identically by every party and any auditor, Hedera-anchored ordering, DISPUTED-state evidence handling, and a TLA+-verified concurrency model — it’s just scoped to two parties (a national aggregator on each side of a border) rather than the N parties (OEM + supplier + customer + insurer + regulator + financier) Part 4’s templates name. The honest framing isn’t “Part 4’s smart-contract layer doesn’t exist yet”; it’s “the settlement-engine shape it needs already exists and is formally verified — what’s missing is generalising Regime C’s bilateral predicate to N parties and wiring IIoT events in as one of P‘s evidence inputs, alongside the anchored receipts it already consumes.”
Status (updated 2026-07-31): positioning done, engine unchanged. Part 4’s smart-contracts bullet and its templates-table intro now both state plainly that none of the fourteen named templates exist, and name Regime C as the proven engine shape they’d be built on. Regime C’s engine (internal/regimec) and its two-party predicate P are themselves unchanged — nothing has been generalised to N parties. That generalisation, if it’s ever done, is still future work; only the cross-reference and the honest build-status framing shipped this pass.
9. Part 4’s IIoT-audit capture is Mode A, wearing no label
Part 4’s “continuous cryptographic IIoT audit infrastructure” — every sensor reading, PLC tag change, calibration event, and batch-record entry committed to the BFT ledger and Merkle-anchored to Hedera — is not a new capability. It is Part 2’s Mode A (hash-only attestation), already built and verified end-to-end, applied to IIoT event types instead of financial transactions: the same signed hash-publish call, the same Atom-based commit path, the same Hedera slab-anchoring guarantee. Unlike every other built-vs-roadmap claim in Parts 1–3, Part 4 states this capability with no build-status marker at all — not “built,” not “roadmap,” simply asserted. Naming it as Mode A costs nothing (the mechanism is identical) and buys the same credibility Parts 1–3 get from being precise about what’s real.
Status (updated 2026-07-31): done. Part 4’s IIoT-audit bullet now names Mode A explicitly and states it’s already built and verified end-to-end, applied to IIoT event types instead of financial transactions — the same honesty standard Parts 1–3 apply everywhere else, distinct from synthesis 10, which fixed a separate, already-live mislabelling in Part 4’s pricing text.
10. Part 4’s Item-1 pricing description mislabels Modes B and C
Part 4’s Item 1 pricing range cited “atomic dual-write (Mode B)” as the A$400k ceiling and “CDC observation (Mode C)” as where most operators land — but Part 2 defines Mode B as the CDC/change-data-capture observer and Mode C as gateway-mediated; atomic dual-write is Mode D. The mislabelling compounded a bigger problem it sat inside: Part 2 states plainly that none of B, C, or D exist in the codebase, while Part 4’s pricing table presented all three as options a customer selects between today, each with its own price point.
Status (updated 2026-07-31, mode-letter fix; superseded 2026-08-01 by Modes B/C/D all landing their core mechanisms): Part 4’s Item-1 description now uses Part 2’s own mode letters and definitions (Mode B = CDC observation at the floor end of that range’s tier, Mode D = atomic dual-write at the ceiling) — that part still holds. What no longer holds: this note originally said Part 4 “states inline that Modes B–D are roadmap — not built.” Part 4’s Item-1 paragraph has since been updated again, alongside Part 2’s own Roadmap section, to reflect that all three now have their core mechanisms built and verified end-to-end, each as a reference implementation a customer’s own team adapts — not a packaged product, and no customer onboarded through any of them yet. The mislabelling this synthesis originally fixed (Mode B vs Mode D confusion) remains fixed; only the build-status language it also touched has moved on.
11. Part 4’s counterparty-signature UI is a client of Part 1’s SDK, not a new build
Part 4’s Item 5 (“counterparty / supply-network smart-contract participation UI”) needs DID/certificate-based authentication and “sign + submit with cryptographic proof landing in the BFT mesh” — described as new scope to build. Part 1’s RelayService SDK (Java/Python/Node/.NET, built and verified end-to-end against a real daemon) already provides exactly this: a native application authenticates with its own credentials and relays a request into the same Kademlia/wp-06-gated path the CONNECT and SOCKS5 front ends use. Item 5’s UI work is real — the screens, the per-tenant signature queue, the workflow — but its transport and auth layer doesn’t need separate design; it’s an SDK consumer.
Status (updated 2026-07-31): done. Part 4’s Item 5 description now names the RelayService SDK as its intended transport/auth layer explicitly, and is clear that the UI itself — screens, per-tenant queue, workflow — is the actual new build.
12. Part 4’s “self-executing, IIoT-triggered” claim needs the same human-bridging step Regime C’s own corridor discovery already established as the pattern
Part 3’s origination seam (internal/origin) restricts a contract atom or IIoT device to originating directly into Regime A only — reaching Regime B (domestic Saga) or Regime C (cross-border settlement) requires a human governor to originate the transaction instead; a device’s signature is trusted for identity, never for the judgment call of moving state, or money, across a sector, data-centre, or border boundary. Part 4 pitches its multi-party smart contracts as “self-executing” with “IIoT-triggered conditions” and “automated payment release” — which, read literally against a template like Power-by-the-Hour (engine OEM + airline + financier, almost certainly crossing pyramids and often borders) or multi-party recall execution (manufacturer + regulator + customer + insurer), describes exactly the autonomous cross-boundary settlement the origination seam exists to prevent. This isn’t a contradiction to apologise for — it’s the same pattern synthesis 1 already established for Regime C corridor onboarding (discovery surfaces a verified result; a human registers the agreement) applied one layer down: IIoT detects, Regime A records safely and immediately, a human governor originates the cross-party settlement step. Part 4’s pitch language doesn’t currently reflect this at all.
Status (updated 2026-07-31): partially done. Fixed a real, standing internal contradiction found in the process of writing this synthesis: Part 3’s own §3 design note (“IIoT & Internal-DB Smart-Contract Origination”) predates the shipped restriction and said the opposite — a device’s signature could authorize a Regime-C Intent “just as a human governor’s would” (§B, §D). That’s now corrected in place to match what internal/origin (governance@1e4c880, @03c7e0f) actually enforces and what synthesis 3 already said correctly elsewhere in this same document. Also now done: Part 4’s smart-contracts bullet no longer implies IIoT-autonomous cross-boundary settlement — it states plainly that a human governor originates any transaction leaving a single pyramid, whatever detected it, matching what internal/origin actually enforces and the corridor-discovery precedent synthesis 1 established. Both halves of this synthesis are shipped, pitch-text and code-contradiction alike.
13. Synthesis 1 solved finding a Regime C counterparty; a Shape still had nothing to call once it found one — that’s what the new cross-shape client and Tower-side gate close
Synthesis 1 closed the “pre-established” half of Regime C’s bilateral-agreement precondition — Kademlia-based discovery lets two national aggregators that have never traded before find and verify each other’s AgreementAnnouncement before a human registers it. But discovery only produces material for RegisterAgreement; it says nothing about what calls SubmitIntent/RecordCommitment afterward. For a Shape (national-aggregators + underlay-substrate) specifically, nothing did — aggd had no client at all for governance/internal/regimec‘s RPCs, only for its own separate, local, Pyramid-keyed aggd/internal/regimec engine (driven by the pre-existing TRANSACTION_TYPE_ANCHOR_BILATERAL). A new TRANSACTION_TYPE_CROSS_SHAPE_ANCHOR_BILATERAL, aggd/internal/regimecclient, and aggd/internal/crossshape/crossshapestore close that: a Shape’s own aggd-api can now submit intents and record commitments against the Tower-hardened, FederationID-keyed engine directly, with a two-phase Reserve/Confirm submission (a local BFT action reserves the domestic saga leg’s compensation before the non-deterministic gov-api call, confirms after) protecting against the case where gov-api accepts an intent but the local record of it never lands. On the Tower side, the counterpart is governance/internal/towergate — the standing per-transaction regulator-veto right that makes it safe for a Tower to actually accept traffic through this path at all, rather than the engine being reachable but ungoverned.
Status (updated 2026-08-01): done, at the code level, for national-aggregators specifically. aggd/internal/regimecclient/crossshape/crossshapestore and governance/internal/towergate are both built and tested (real saga.Coordinator compensation exercised end-to-end, not mocked; regimec.cross_shape_intents folded into the BFT app-hash, verified against a live throwaway Postgres). Both are off unless explicitly wired (SetCrossShapeSubmitter requires --gov-api-url; towergate requires --enable-regime-c-tower-gate + --enable-regime-c), so no existing deployment’s behaviour changed. What’s still open: national-meta-federation itself has no equivalent client or deployed gov-api-k8s charm at all (this repo’s own bridging work happened on the Shape side, not the Tower side — see Part 3 §7’s national-meta-federation subsection), no real deployment has live Hedera credentials configured anywhere, and RecordCommitment‘s wiring is a direct passthrough with no business logic of its own for deciding accept/reject — that decision is still the caller’s.
Status summary
#
Synthesis
Status
1
Kademlia bootstraps Regime C agreements
Done, corrected scope (governance@dae61c3) — wp-06 had already landed; discovery mechanism itself still had to be built new
2
Archive/content-address Regime C evidence
Done, narrower scope (governance@8f4e2d9) — ExportEvidence already solved durability; only the content-hash lookup was missing
3
IIoT hard-restricted to Regime A
P0 done at aggd’s seam (aggd@0f21623) — upstream (org-gateway/orgnodes-core) still needs to populate OriginKind
4
Data Visibility Ladder generalised to IIoT telemetry
Positioning done — Rung 2 (platform-key encrypted) is now concretely scoped for financial amounts (2026-08-16, see structured-atom-privacy-ladder-design.md); Rung 3 (customer-key encrypted) is now partially solved, for fields the platform never validates, financial or IIoT alike; whether Rung 2’s pattern generalises cleanly to IIoT telemetry sequences is unverified, flagged as open rather than assumed. Rung 4 (partner-key) stays undesigned for any mode. The premise that “no content-receiving mode exists at all” no longer holds (Modes B/C/D core mechanisms are now built)
5
“Optionality of centralization” as a named principle
Done — components it names were already real
6
ChubbyChecker checks Regime C’s P
Done (governance@eabec83, cg04)
7
Local/Global naming inversion as tagline
Done
8
Regime C as Part 4’s smart-contract prototype
Positioning done — engine itself not generalised to N parties
9
Part 4’s IIoT audit is Mode A, unlabelled
Done
10
Mode B/C mislabelled in Part 4 pricing
Done — Item 1 description corrected to match Part 2’s own definitions
11
Item 5 UI as a RelayService SDK client
Done
12
Origin restriction vs. Part 4’s automation claims
Done — Part 3’s internal contradiction fixed and Part 4’s pitch language corrected
13
Cross-shape client + towergate close the bridging gap synthesis 1’s discovery work left open
Done for national-aggregators (aggd@33738c7, governance@a8e0dd7) — national-meta-federation’s own side still has no equivalent client or deployed charm
Implementation plan
Ordered by what’s actually urgent versus merely valuable. The first item is a live gap in an already-built safety mechanism, not a new feature — it’s sequenced first on that basis alone.
P0 — Wire OriginKind end-to-end so the existing Regime-A-only gate actually activates — DONE at aggd’s seam, 2026-07-31
What shipped:transactions.v1.ExecuteTransactionRequest gained origin_kind/origin_identity/origin_signature/block_time (proto@c65e332, its own local OriginKind enum mirroring gov.v1’s rather than importing it, keeping aggd’s public API decoupled from gov-api’s wire format). aggd/internal/txservice‘s SagaGate interface widened to accept an OriginClaim; ExecuteTransaction extracts one from the request and forwards it unconditionally. aggd/internal/govgate.Gate.CheckSaga translates it onto SubmitSagaStepRequest‘s own origin fields via an explicit toGovOriginKind switch (not a cast, so an enum reordering on either side fails to compile rather than silently mismapping). Zero-value OriginClaim — every pre-existing caller, since none of them set this before now — leaves all four fields unset, keeping checkOrigination a no-op exactly as before: purely additive, verified by dedicated tests on both sides of the seam (TestExecuteTransaction_Saga_OriginClaim_ForwardedToGate, TestExecuteTransaction_Saga_NoOriginClaim_IsZeroValue, TestCheckSaga_OriginClaim_TranslatedOntoRequest, TestCheckSaga_ZeroValueOriginClaim_LeavesRequestFieldsUnset) plus the full pre-existing suite passing unchanged (aggd@0f21623).
What’s still open, not done here: this closes the gap at aggd’s own boundary only. Nothing yet calls ExecuteTransaction with a populated OriginKind — the next link is whatever originates the underlying IIoT/contract-atom event further upstream (org-gateway, orgnodes-core) actually setting it. Until that lands, synthesis 3’s safety claim is backed by working, tested plumbing all the way to gov-api’s gate, but not yet exercised by real device traffic. Do not update Part 4’s pricing/pitch language to state the claim as fully live until that upstream piece closes too.
P1 — ChubbyChecker check type for Regime C’s commit predicate — DONE, 2026-07-31
What shipped:chubbychecker/providers gained GovRegimeCIntent plus RegimeCSettledIntents/RegimeCAnchoredIntents (chubbychecker@a51fffe — named GovRegimeCIntent, not RegimeCIntent, to avoid colliding with aggregime_providers.go‘s own RegimeCIntent, a genuinely different type for aggd’s separate internal/regimec/xpyr schema). cg04_regime_c_predicate_divergence (governance@eabec83) reproduces evaluateAndMaybeSettle‘s predicate against that data exactly, reusing cg01’s existing independent-auditor deployment pattern (same Postgres, same continuous-check framework, no new infrastructure). Registered alongside cg01–cg03.
Scope note: this is ongoing, black-box defence-in-depth against the same class of bug tla/RegimeC.tla already found and closed once (the Store.UpdateIntentStatus CAS race) — a second, independent layer behind that formal verification, not a replacement for it.
P2 — Extend block-archiver/content-addressing to Regime C receipts — DONE (narrower scope than proposed), 2026-07-31
What shipped: the durably-archive-receipts half of the original proposal turned out to already be solved by design, not a gap — ExportEvidence (pre-existing, RPC-wired) never persists anchor.Receipt.Proof because the proof is independently re-derivable from OrderedReceipt via the anchor’s own Verify, and Postgres already durably holds everything else. What was actually missing was the lookup direction: a party holding a disputed record’s own content (a regulator, opposing counsel) but not gov-api’s internal intent_id had no way in. regimec.Store gained FindIntentIDByPayloadHash (MemStore hashing in-memory, PGStore via pgcrypto’s digest(payload, 'sha256') — same idempotent CREATE EXTENSION IF NOT EXISTS pgcrypto pattern already used in org-server-abci and govstudio), wired through Engine.FindIntentIDByPayloadHash and a new FindIntentByContentHash RPC (gov.proto@c7483e0, governance@8f4e2d9). Feed its result into ExportEvidence for the full bundle — the same answer §C’s DISPUTED state needed to hand off-system resolution something concrete, beyond “ask ITOTCCA,” just without the redundant archive/CLI the original framing assumed was necessary. Full Engine-level and RPC-level test coverage on both the intent-payload and commitment-payload resolution paths plus the not-found case.
What shipped: the stated blocker (wp-06 enterprise-CA identity) had already cleared — code-complete since 2026-06-02, only its Vault PKI operational deploy remained; kademlia-edge-overlay.md‘s “⌛ Roadmap” framing for it was simply never reconciled with that. But “the resulting DID/key material feeds directly into regimec.Agreement registration” didn’t match what wp-06 actually exposes: peerverify.PeerVerifier has only IsVerified(peerID) bool, no accessor for a verified peer’s cert/identity, and no DHT publish/discover mechanism for arbitrary payloads existed anywhere in the codebase. Built instead: regimec.AgreementAnnouncement (FederationID, AnchorTopicID, SigningPublicKey), self-signed by the same keypair a federation intends as its CounterSigningPublicKey — proving the announcer controls that key, the same self-consistency check verifyCounterpartyAuthorship already relies on elsewhere in this package. governance/cmd/h3-rpc-gw publishes it via AnnounceRegimeCAgreement/ServeRegimeCAgreementAnnouncement and looks it up via DiscoverRegimeCAgreement, reusing internal/validatorpeers‘ existing DHT Provide/FindProvidersAsync pattern but gating wp-06 verification on both the serve and discover sides — a live signing public key is more sensitive than validatorpeers’ own public CometBFT endpoint payload, which only gates on the consumer side (governance@dae61c3). Full unit coverage on the announcement’s crypto (sign/verify/tamper/wire round-trip) plus DHT integration tests on the discovery transport (happy path, nothing announced, server-side wp-06 refusal, mismatched-federation-ID rejection).
Scope note, deliberate:DiscoverRegimeCAgreement only surfaces a verified result for an operator to review — it does not call RegisterAgreement automatically. Auto-registering a discovered trust anchor into a live cross-border settlement corridor with no human step would be a real security regression; wp-06’s own status table still lists “permissioned peer acceptance” as roadmap, not done, which is the same posture this takes.
CLI follow-up shipped, 2026-07-31 (governance@d07bd86):h3-rpc-gw --regimec-discover-federation-id=<id> is the runnable one-shot lookup — bootstraps a host + DHT, resolves the counterparty’s AgreementAnnouncement, prints it as JSON to stdout, and exits without starting the HTTP gateway or calling RegisterAgreement. --regimec-announce-federation-id (+ --regimec-anchor-topic-id, --regimec-signing-key-file) is the publish side: serves this node’s own announcement over the DHT alongside the normal gateway, signed by a dedicated key generated on first use (deliberately separate from the pod’s libp2p identity). discoverPeers gained a small onReady callback hook to wire announce-mode in without disturbing its existing goroutine-based startup; the production path is unchanged when neither flag is set.
What shipped: all three are pure pitch-text edits, no code implication, consistent with what each synthesis’s own status always said. Q9 (Part 2) now explicitly names Part 4’s IIoT telemetry as the same shape of problem its privacy ladder will eventually generalise to cover; Part 4’s IIoT-audit bullet cross-references Q9’s ladder in return, so the connection reads from either direction rather than only existing as an observation in this synthesis. (Superseded 2026-08-01: at the time this shipped, “once a content-receiving mode exists” was accurate — none did. All three now have their core mechanisms built; both cross-references have been reworded accordingly.) “Optionality of centralization” is now named explicitly, immediately below the Local/Global tagline ahead of Parts 2 and 3, tying together Part 1’s DNS-optional peer discovery, Part 2’s chain-selectable anchor, and Part 3’s deployment Shapes as one deliberate principle. The Local/Global naming-inversion tagline itself (“every transaction is processed locally, but verifiable globally”) was already added in an earlier pass this session; this pass corrected synthesis 7’s own status line and status-summary row, which had been left un-updated at the time.
Tx-Rails — Built by IT/OT Chain & Cloud Australia (ITOTCCA). Sydney · London.