There is nothing to audit because there is nothing separate.
31 July 2026 · the launch journal
Every data platform you have ever run has had two truths in it: the record, and the reporting layer somebody built on top of the record. And every quarter, someone has asked the question that pair makes inevitable — does the dashboard match the events? — and someone on your team has spent days proving that this quarter, mostly, it does. This entry is about the architectural decision that deletes the question.
Two brands, one spine
This system has two surfaces and one record. epcis.dev is the developer-and-agent door: capture, validation against the pinned official schema, the CBV 2.0 §8.9 event hash, translation, the MCP tools. visibility.cloud is the executive door: traces, chain-of-custody evidence, exception views, sharing grants. The load-bearing sentence is what sits between them — nothing. Every answer the business surface sells is a view computed over the same catalog the open developer surface queries. Same events, same hashes, same append-only substrate; a different reader, not a different store.
The substrate, concretely: capture lands events through one gateway (validated, stamped, hashed), the write path streams through Cloudflare Pipelines into an R2 Iceberg catalog, and reads — the product's trace queries and any raw SQL over the same tables — run against that one catalog via R2 SQL. An executive's trace answer and an engineer's query differ in projection and grant scope. They cannot differ in substance, because there is no second substance for them to differ into.
Views versus copies: where trust actually dies
The conventional architecture copies: events land in an operational store, an ETL job reshapes them into a "business layer," and the dashboard reads the copy. From that day forward the copy has its own bugs, its own lag, its own quiet corrections — and every number upstairs carries an asterisk nobody prints: as of the last successful sync, assuming the transform is right. The audit exists because the copy exists. Reconciliation meetings are the interest payment on a copied record.
A view has no such life of its own. It is a computation over the record, defined once, run at read time. If the trace view has a bug, it has that bug identically for every reader, and fixing the view fixes every answer retroactively — because no answer was ever stored, only derived. The record beneath stays append-only in the strictest sense this system enforces at the door: no service identity holds an UPDATE or DELETE grant, and corrections are new events carrying errorDeclaration, visible forever. A record that visibly contains its own mistakes is trustworthy precisely because of that; a reporting copy that silently absorbed its corrections is not evidence of anything.
Recompute, don't attest
The demonstration this architecture is built to give: take a trace answer from the product path, then compute the same answer with raw SQL over the same catalog, and compare bytes. Equal — not because two systems were carefully reconciled, but because there is one system and the question was asked twice. "Does the dashboard match the record" is not an audit finding here; it is a tautology you can re-derive on demand.
The pattern already ships at local grain, and you can run it today: npx epcis.dev capture returns its accepted events read back through the query door, stamps visible — the response is a query result over what landed, never an echo of what you sent. Same principle, smallest possible instance: the answer you see is recomputed from the record, at every scale of the system, or it is not shown.
The event hash is what makes the comparison meaningful across parties too. Identity computed from content (CBV 2.0 §8.9, gated against OpenEPCIS reference vectors) means your recomputation and your counterparty's recomputation name the same events the same way with no coordination — the property the run transcript demonstrates end to end.
What this means in a room with an auditor
The team that owns a copied reporting layer answers an auditor with process: sync schedules, transform reviews, reconciliation logs — attestations about diligence. The team that owns views over an append-only catalog answers with a computation: here is the record, here is the view definition, run it. One of these answers gets stronger under hostile scrutiny; the other gets longer. And the same structure answers the counterparty dispute, which is the auditor scenario with money attached: the trace your executive shows a partner is recomputable by anyone with a grant over the same events — verifiable without joining anything, which is the one sentence this whole system is built to make true.
For your platform team the consequence is a smaller system, not a grander one: no ETL fleet between capture and answers, no second schema to keep honest, no reconciliation backlog. The engineering laws that make it safe — append-only storage, gateway stamping, minimally scoped reads where out-of-scope data is absent rather than redacted — are enforced in code at the door, on the landing page's terms, not in a policy document.
The engine half is open and local today: capture, validate, hash, query on your bench via npx epcis.dev, no account. The hosted catalog — durable retention, the trace views, the grants your executives and their counterparties read through — is the gated half, on the dated ledger at /what-ships-today/. If your org is the one that wants the audit question deleted rather than answered faster: the key list — your address, a short branching set of questions about where your record lives today, and the final step locks. Keys are provisioned from that list, in order — one email when yours is ready.
We answer in writing. We take at most five conversations a month, only when you ask for one, and only after you already have the written read.