Provingevery.irreversiblechange first

100%PROVEN

Every approved change was executed and undone on a shadow copy first, with the checksums attached.

We prove migrations, erasures, refunds and access grants against a shadow copy, then hand you the checksums and let you decide.

From the first line of SQL to a sealed, tamper-evident receipt — nothing reaches production unproven.

Runs onTrueForgeAI GatewayNomaQodoGitHub MCPDaytonaSupabaseExaBright DataTogether AIFireworksOpenUI
02 / 07
The rule

The gate is not a conditional. It is a type.

Every other approval flow is “the agent says it is going to do X — click yes.” That asks a human to trust a plan. AIRLOCK’s gate cannot be offered until the agent holds a certificate: the result of having actually done the thing, and undone it, somewhere safe.
// packages/contract/src/gate.ts
const GATE_WITNESS: unique symbol = Symbol('airlock.gate.witness');

export interface ApprovalGrant {
  readonly [GATE_WITNESS]: true;   // unforgeable outside this module
}
i

Never rendered

Not greyed out, not hidden behind a warning. A disabled button is a decision you can argue with; an unrepresentable state is one you cannot.

ii

Six forgeries, six compile errors

Attempts to fake a grant are asserted as type errors. Weaken the type and tsc reports an unused @ts-expect-error — the build fails.

iii

curl gets the same answer

The gate re-runs server-side against the stored dossier. Approving through the HTTP API with no browser involved is refused identically.

03 / 07
Try the gate

Try to open it.

The controls below build a real Change Dossier and pass it to the real openGate() — the same function the console calls and the server re-runs before it writes anything. Every combination is a live evaluation. See if you can find one that opens a door it should not.
Try to open it1 tried · 1 opened
Change classeach class has its own policy
Certificate
The checksum tripledid the data come back?
Proof age
Production
You are

PROVEN — ROLLBACK VERIFIED

Applied and rolled back on a shadow branch. The data returned byte-identical.

What the console rendersSCHEMA_MIGRATION

Add a tier column to users, backfill it, then drop the deprecated plan_name column.

certificate
UNDO · PROVEN
proof age
2 min
production
unchanged
magnitude
1,200,000 rows
signatures
0 of 1
policy
satisfied

openGate() returned a grant, so the control above can exist. It is the only way one comes into being.

the call that produced the above
openGate(dossier, { role: 'approver' })
-> { state: 'OPEN', grant: { final: true, seals: 0/1 } }
04 / 07
Two kinds of proof

You cannot prove a deletion reversible.

So for the changes that genuinely cannot be undone, the agent proves the opposite thing instead — not that you can take it back, but that it knows exactly what “it” is.
UNDOfor reversible work

Three checksums

Apply the change to a shadow branch. Apply the rollback. Checksum the affected tables a third time and prove the data came back byte-identical.

presha256:0234ab62abae86f9…
postsha256:9f11c7de40b1c882…
post-rollbacksha256:0234ab62abae86f9…match

AIRLOCK never trusts the verifier’s own match flag. It recomputes pre === post_rollback itself, so an engine bug cannot open the door.

SCOPEfor the irreversible

Exactly what dies

Every record that will be destroyed, across every system — plus an explicit list of what is being deliberately kept and the obligation justifying each exclusion.

DESTROYpostgres4 subjects across 12 tables168
DESTROYstripecustomer + payment methods4
KEEPinvoicesseven-year statutory retention47

An exclusion with no stated reason is rejected by the contract. “We kept some things” is not a scope.

05 / 07
Policy

Allowed, by whom, and right now?

A certificate answers “is this change what it claims to be”. It cannot answer whether your organisation permits it — that is not a property of the change. Seven classes, each with its own rules, in a YAML file a team can argue with.
ClassCertificateApproversProof validUndo windowBreak-glass
Schema migrationUNDO130 min30 minpermitted
Data operationUNDO130 min15 minpermitted
ErasureSCOPE215 minnoneno
Access grantSCOPE210 minnonepermitted
Money movementSCOPE210 minnoneno
Comms blastSCOPE215 minnoneno
Infrastructure mutationANY215 min10 minpermitted

Note what is deliberately absent: there is no change freeze on erasure, money movement or access grants. A freeze that blocks a right-to-erasure request trades a legal problem for an operational one. That absence is asserted in the test suite, so it cannot be quietly reversed.

06 / 07
After it lands

The proof has a second life.

Having demonstrated the inverse once, the system can offer something almost nothing else can: a one-press undo on a production database, for as long as it is willing to vouch for that demonstration.
01

Health check

Production is re-checksummed the moment the change lands and compared against what the certificate predicted it would become.

02

Auto-rollback, where proven

A mismatch executes the inverse that was already demonstrated. Where it was never proven, AIRLOCK refuses and raises an alarm instead.

03

Thirty minutes to change your mind

Most bad changes are perfectly healthy by every checksum and simply turn out to be wrong. Only a person ever catches that.

The refusal is the feature. AIRLOCK will only auto-revert a rollback it has proof of. Running an untested inverse against a database already in an unexpected state is how a bad afternoon becomes a bad quarter — so that case stops and gets a human.

06 / 07
The ledger

Break it yourself.

Decided changes are sealed into a hash chain, so editing the audit log is detectable by anyone holding an older copy of a single hash. Rewrite a record below and watch every link after it fail — the check runs in your browser, which is rather the point. A tamper check performed by the system holding the data proves considerably less than one performed by the person who does not trust it.
Sealed history
sealing…

    COMPUTING…

    Hashing three records into a chain with the Web Crypto API.

    Head

    sha256:0000000000000000000000000000000000000000000000000000000000000000

    Keep this hash somewhere we cannot reach — a wiki, an email to yourself, an auditor’s file. Any future edit to any record above changes it, and you will be able to tell without trusting us about anything.

    This does not make the ledger unforgeable — anyone who can rewrite the file can recompute the whole chain. What it makes is tampering visible to anyone holding an older copy of a single hash.

    That is the property that actually matters, because the person auditing you is not the person who edited it.

    201
    tests
    properties, not implementations
    23
    harness capabilities
    each lit only by a real event
    16
    fixtures
    seven distinct refusals
    0
    tools that write to production
    asserted in CI
    07 / 07

    Build the agent you would trust with root

    AIRLOCK is the literal answer — an agent that behaves as though it is not trusted with root, and proves it every time before it asks.