CAMPAIGN-11 Phase 4: the soak passed, with two absences answered honestly
gates / gates (push) Successful in 8s

All five daily jobs fired exactly once and completed on time. The 04:15 offsite
run produced snapshot_count 1 -> 2, last_status ok, 24.9s — unprompted, on a box
rebuilt twice and set aside four hours earlier. Nothing on the must-not list
fired, including offsiteheal: that is R-218's NEGATIVE control passing (a box
with a target must not declare), which does not substitute for its positive
half, still owed.

Investigated and DISPROVED: tier2-backup completing in 118ms looked like a
silent no-op; the copy is real and on the backup drive (818.5 KB verified).

Correction to my own pre-registration: backup_run_digest is a TEST FILENAME, not
an event type. The real one is backup_run_failures, a failures digest whose
silence on a clean night is correct — reporting it as a miss would have been a
finding I invented. What survives: the offsite run emits no hub event while both
lesser tiers announce success; failures and staleness are covered elsewhere, so
it is a consistency wrinkle, recorded not filed.

Two absences answered rather than assumed: the restore-test's silence was
PRE-REGISTERED as correct (6h eval, 24h settle); the agent's whole-guest tier is
left explicitly UNRESOLVED because routine local-api calls are not logged at INFO
— a 5h search returns 0 on a box that demonstrably served such calls, so the
instrument cannot answer.

No product code changed.
This commit is contained in:
2026-08-06 04:21:13 +02:00
parent 0f8c3cc848
commit df6081e60b
2 changed files with 189 additions and 0 deletions
@@ -434,6 +434,67 @@ because two of them nearly produced false findings.
---
## 8b. Phase 4 — the unattended soak
**23:56 → 04:35, venue untouched.** 30 five-minute samples plus a full log census. **Expectations were
pre-registered in the journal BEFORE the window**, in both directions, so nothing here is fitted
afterwards.
### Everything scheduled fired, exactly once, on time
| job | due | result |
|---|---|---|
| `db-dump` | 02:30 | ✅ 5.237 s |
| `tier2-backup` | 03:30 | ✅ 118 ms — **and the copy is real** (below) |
| `fill-watch` | 03:30 | ✅ |
| `metrics-prune` | 04:00 | ✅ |
| **`offbox-backup`** | **04:15** | ✅ **24.884 s — `snapshot_count` 1 → 2, `last_status: ok`** |
**The off-site tier runs itself, unprompted, on a box that was rebuilt twice and had its repository set
aside four hours earlier.** That is the strongest positive of the whole campaign for the backup
promise, as distinct from the recovery journey.
### Nothing fired that should not have
`needs_credential` 0 · `offsiteheal` 0 · `offbox_repo_orphaned` 0 in-window · `offsite_repo_key_changed`
0 · `escrow blob SERVED` 0 · `host_stale`/`host_recovered` 0 · self-update 0 · operator emails 0.
> **§4.2's negative control passes.** A box that HAS a target did not declare `needs_credential` once
> in five hours. R-218's fix is not over-firing in the other direction — which does **not** substitute
> for its positive half, still owed.
### Investigated and DISPROVED — `tier2-backup` in 118 ms
It looked like a scheduled backup that silently no-ops. It is not: `Tier 2 copied calibre-web →
/mnt/felhom-drives/mentes/backups/secondary/calibre-web (818.5 KB, 1 leg(s), 0s)`, and the copy is on
the backup drive. 388 KB on local NVMe in 118 ms is honest. **No finding.**
### A correction to my own pre-registration
I pre-registered a `backup_run_digest` event. **No such event type exists** — that is a *test
filename*, and the real one is **`backup_run_failures`**, a failures digest whose silence on a clean
night is correct. Reporting it as a miss would have been a finding invented by a bad reading.
**What survives the correction:** the off-site run emitted **no hub event at all**, while both lesser
tiers announced success (`db_dump_completed`, `crossdrive_completed`). Failures are covered by
`backup_run_failures` and staleness by the hub's tier deadline monitor
(`offsiteBackupStaleAfter = 8 days`), so this is **a consistency wrinkle, not a blind spot**
recorded, not filed.
### What should have fired and did not — answered in both directions
- **The restore-test did not run, and that is CORRECT** — `eval_interval=6h` (armed 23:29:43, first
evaluation ~05:29) with a **24 h settle** on archives hours old. **Pre-registered as "expected not to
run"**; without that, its silence would have read as a gap.
- **The agent's whole-guest tier did not run, and whether it should have is NOT RESOLVABLE.** The box
reports `0 backups` all night; the agent is emphatically alive (**2 091 of its own lines** since
00:00, polling the guest at 04:17:57); **but routine local-api requests are not logged at INFO** — a
five-hour search for `local-api` returns **0** on a box that demonstrably served such calls earlier —
so "no `/backup/due` poll" is **not evidence**. The hub's deadline monitor is equally invisible at
INFO. **Recorded as an open question, not scored as a pass.**
---
## 9. Invariants at every phase boundary
| | | verdict |