integrity-mismatch
The checkpoint reverify failed: rows changed behind the hash chain. The supervisor proves once, escalates with the evidence, pauses the worker, and latches containment — never fixes.
The ledger no longer matches its own sealed fingerprint, which means someone or something changed history. The supervisor gathers proof, freezes the machinery, and hands everything to a human. It never tries to repair money records itself.
Source src/ops/detect.tssrc/ops/supervisor.tssrc/worker/checkpoint.ts
Tier 3, escalate-never-fix — plus containment. The scheduled checkpoint reverify says the ledger no longer matches what was sealed: rows changed behind the hash chain.
Symptoms
worker.checkpoint.verify counts with outcome: 'mismatch'; worker.checkpoint.mismatch
error logs. Balances may still look plausible — tampering is designed to.
Detection
Any worker.checkpoint.verify meter signal tagged outcome: 'mismatch', or the
worker.checkpoint.mismatch log event, past a high-water mark: each signal fires exactly one
episode, ever.
Automatic response
The integrity pass runs first in every tick, before the saga poll, so a hung store cannot block it. On a finding:
detected, then one read-onlyprove()— the only unscheduled full prove in the system — andescalatedwith the report attached: the drifted accounts and the conservation verdict.- The containment latch sets: every tier-1 lever (saga sweep, relay re-drive, inbox
revive) is refused as
suppresseduntil the supervisor restarts. - If the host wired
pauseWorker, the scheduled loop pauses —acted— so no new checkpoint seals over the evidence. The supervisor never resumes; a human does.
Nothing is ever auto-fixed. The mismatch is evidence, and evidence is preserved.
Manual steps
- Read the escalation’s attached prove report: which accounts drifted, and by how much
(
materializedvsderivedper account). - Freeze operationally: keep the worker paused; stop deploys against the store.
make provere-runs the full prover on demand while you investigate.- Compare against the last good backup (the drill proves what a dump contains) and database audit logs to find when and how the rows changed.
- Only after the cause is understood: repair the data at the database layer under review,
worker.resume()(or restart the worker process), restart the supervisor to clear the latch, and watch the nextworker.checkpoint.verifybeat come backok.
Escalation
This signature IS the escalation. It means unauthorized writes or corruption in the system of record — treat as a security incident until proven otherwise. A mismatch right after a signer change is almost always a key-rotation mistake; rule that out first.