Files
felhom.eu/documentation/audits/DRILL-soak-2026-08-31/phase7-teardown/00-VERDICT.md
T
admin cee8f70e98
gates / gates (push) Failing after 17s
soak drill COMPLETE: 7 phases, 4 findings, the observer found the worst one (R-414)
Overnight soak 22:39->06:10 CEST. demo-hp the victim, demo-felhom the untouched observer.
No production code, no golden, no version bump. Report at
documentation/audits/DRILL-soak-2026-08-31/REPORT.md.

VERDICTS: 1 lock-collision FAIL, 2 guard-interactions PASS-with-one-defect, 3 R-357 PASS,
4 proof-edges PASS, 5 mutated-cycle PASS, 6 observer FAIL, 7 teardown PASS.

R-414 - THE MOST VALUABLE FINDING, AND ONLY AN UNTOUCHED BOX COULD HAVE FOUND IT. On
demo-felhom the nightly proof fired for the first time unattended at 05:30 and REFUSED:
"nowhere to restore to - nincs regisztralt adatmeghajto". Cause established, not inferred:
storage_paths is EMPTY, so there is no path to put a scratch on. It will fail this way every
night forever with only a WARN, and because the error path reaches no verdict,
last_proof_result stays ABSENT - which is also what a pre-0.231.0 controller sends. The hub
cannot tell "never ran" from "not deployed": the StatsKnown trap one level up. The box is
NOT unprotected; its off-site backup ran fine in 46.9s. It is the PROOF that cannot run.

R-411 - measured, not reasoned: restic stats TAKES A LOCK; a customer full-restore runs it
while holding no acquireRunning; the integrity check is therefore not blocked, meets that
lock and escalates to unlock --remove-all. The sampler caught "restore ..." and
"unlock --remove-all" in the SAME sample. Contained: the check was classified unreachable,
not damage, so no false alarm.

R-412 - CORRECTED from HIGH to LOW. I filed it on a mechanism I had not finished measuring.
The off-site run has its own pre-push dump leg, so a hollow unit is REPAIRED before it
ships - proven on two apps and confirmed by pulling the snapshot back out of the store.
What survives is a narrow race, plus a success line over a backup holding no data.

R-413 - the R-87 proof caught a product-produced hollow snapshot unattended, and the
nightly job fired on its own schedule at 05:30 for the first time (bentopdf PASSED on
9d002b38 in 2.315s). Both were listed "not yet live-validated" yesterday.

R-403 mirror guard PROVEN live, with a negative control: it fired when a unit was hollow
("The copy was PRESERVED rather than replaced with an empty one") and skipped 0 legs at
teardown when every unit was sound.

R-357 PASS at last, six days owed: a real full filesystem, refused BEFORE StopStack, app
never stopped, live data byte-identical, and it worked once the space came back.

Phase 4 built the false-alarm control the whole R-87 design rests on: bentopdf is the only
template of 53 with neither a database nor a named volume. It passes silently.

EIGHT of my own instrument errors are named in the report, each caught by its own control -
including a time guard that fired an injection four hours early, and filing R-412 at the
wrong severity.

Teardown clean on all three layers of both boxes; both healthy on 0.231.0.
OWED: a golden for 0.231.0, and a decision on keeping bentopdf.
2026-09-01 06:07:13 +02:00

52 lines
2.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Phase 7 — restore the world. **PASS**
| layer | `demo-hp` | `demo-felhom` |
|---|---|---|
| PVE host `/root` | `.cache .ssh` only | soak files: 0 |
| guest `/root` | soak files: 0 | soak files: 0 |
| container `/tmp` | **empty** | n/a (never touched) |
| scratches (`offsite-restore`, `offsite-proof`) | **both empty** | n/a |
| ballast | 0 files; 949 GB free on `hdd_1` | n/a |
| controller | 0.231.0, healthy | 0.231.0, healthy |
| apps | **18 containers, all healthy**, none exited or restarting | all healthy |
Local credential copies `shred -u`'d.
## One clean cycle of each tier, checked for the RIGHT reason
- **Tier-2**: 3 apps copied, and **0 unit legs skipped** — the R-403 guard's *negative* control. It
fired earlier tonight when a unit was hollow and correctly does **not** fire now that every unit is
sound.
- **Proof**: `bookstack` → `pass`.
- **Off-site**: the real 04:15 run completed in 2 m 57 s. Not re-run.
## Every primary unit, final
```
bentopdf dumps=0 tars=0 <- correct: it legitimately has neither (the R-87 control)
bookstack dumps=1 tars=2 opengist dumps=0 tars=1
docmost dumps=1 tars=3 privatebin dumps=0 tars=1
kimai dumps=1 tars=2 calibre-web dumps=0 tars=1
paperless-ngx dumps=1 tars=3 romm dumps=1 tars=3
```
All Tier-2 copies present and sized as expected.
## Two dispositions stated rather than left silent
1. **`bentopdf` — KEEP** (recommendation). It is the only template of 53 with neither a database nor
a named volume, so it is the only possible live subject for R-87's false-alarm control. Removing it
removes the control. Viktor's call.
2. **`/mnt/sys_drive/felhom-data/backups/primary/paperless/`** — a stale, manifest-less directory for
a stack that is not deployed, dated **21–22 August**. **Not mine**, established by mtime after my
own baseline grep failed its control. Left in place: I did not create it and do not know why it is
there. Harmless (no manifest ⇒ treated as hollow ⇒ the R-403 guard protects any copy), but it reads
as an error in any unit sweep.
## The hub layer — the one that is invisible from the box
The hub's host page mentions `proof` **zero** times: the controller publishes `last_proof_*` and no
hub surface reads them. That is R-402's shape, already allowlisted with that reason in
`wire_contract_gate.py`. No scratch customers, appliances or configs were created tonight, so there is
nothing to discard there.