Skip to content

Reading the output

The dry run prints a lot. This is what to look at and what a healthy run looks like, so that an unhealthy one is obvious.

Exit codes

Code Meaning
0 Every stage passed
non-zero A stage failed and said which

One code is deliberately not a failure and not a success:

Code Where Meaning
3 anchor-cli, restore.sh Computed but unpublished; verified but deferred

A root that was computed and not published is genuinely neither success nor failure, and collapsing it into either would be a lie in one direction or the other. The same applies to a restore that verified the database and could not reach the object store.

What a healthy run looks like

  applied: 32 migrations
      facts.record           INSERT, SELECT
  ready: {"status":"ready","schema_version":"0.3.0"}

Then, stage by stage, the four things worth checking:

Stage 4independent true. If this reads false, the confirmation came from a delegate rather than the counterparty and is weaker evidence. Both are valid; only one is independent.

Stage 5 — one 200 disclosed and one 404 no such record, or not yours to read. A 403 appearing here is a regression: refusals must name nothing.

Stage 7external verification: INCOMPLETE — see stage 7 above. Reportable. This is the expected result today. It becomes a real verification only when a root is published. If it ever reads complete without anyone having created a topic, something is wrong with the verifier, not right with the system.

Stage 10restore: verified — N manifest lines match, then the evidence photograph still resolves after restore. The manifest line count changes as migrations add tables; the requirement is that the two counts match each other, not that they equal any particular number.

Timings

A run on a 2026 laptop takes about fifteen seconds:

Stage Time
1 — stand up 10s
2 — enrol 0.15s
3 — record 0.30s
4 — confirm 0.10s
5 — disclose 0.04s
6 — correct 0.14s
7 — anchor 1s
8 — subject access 0.03s
9 — object 0.05s
10 — back up and restore 3s
11 — the lender view 0.15s

Stage 1 dominates because it starts two containers from empty volumes. Nothing after it should take longer than a few seconds; if a stage does, the kernel log at tmp/dry-run/kernel.log is the place to look.

Findings

Some stages print a block headed FINDING, reported not patched. These are real and deliberate. The dry run is not a demonstration that everything works — it is an instrument, and an instrument that only ever reports success is not measuring anything.

The current one is in stage 9: objection scope is matched against record types, while a data subject reasons in purposes. Lodging credit_assessment is technically accurate and stops nothing.

Findings surfaced by earlier runs and since fixed are visible in the narration as "this used to…" — stage 4's one-sided confirmation, stage 5's two-subject consent gate and its 403, stage 9's silent objection, stage 10's backup that exited 0 having skipped every photograph.

Artefacts

Path What it is
tmp/dry-run/kernel.log The kernel's own log for the run
tmp/dry-run/backups/<stamp>/ The encrypted dump, manifest, object inventory and checksums
tmp/dry-run/objects-before.txt The object inventory taken before the dump

None of these should be committed. They are ignored, and the pre-commit secret scan will object to some of them regardless.