# DRILL — the retained key, and the two fixes nobody had watched work **Date:** 2026-08-12 · **Class:** drill (unattended, destructive on Tier 0; spike for Phase C's first step) **Venues:** `drill-r50` (nested PVE on DooPlex) · `demo-felhom` (guest 9201 on felhom-pve) — both Tier 0 **Baselines re-confirmed live on arrival, not assumed:** controller **0.213.0** on both demo boxes (`pct exec 9201 -- docker ps`), agent **0.128.0** (hub `hosts`), hub **0.102.0** (deployment image), register ceiling **R-303** (grep), `felhom.eu` clean at `fbe1155f` and level with `origin/main`. --- ## 1. The three verdicts, first, in plain language > **(a) Is the material retained? — YES.** Proven for the first time in the fleet's history. > > **(b) Does the retained material, once unsealed, yield a password that actually opens the old > store? — YES.** Three planted files came back byte-identical from a store the box itself could no > longer open, including the Hungarian accented filename. > > **(c) Does the customer have a route to (b) through the product? — NO. And the failure is worse > than absence:** the customer's old recovery code — the one that demonstrably opens their old > backups — is rejected by the product with *"the recovery code did not open the sealed bundle"*. > They are told their correct code is wrong, and given no next step. **The headline the operator asked for.** The brief said to be ready for the answer to be no, and our own records predicted the retention would be *"a box we fill and cannot open"*. That prediction was **half right, and the wrong half was the one nobody checked.** The box can be opened — the crypto, the retention and the copy are all sound. What does not exist is the door: no code path reads a retained row, so the only way in is an operator with SQLite, `age` and a shell. Everything I did in §4 a customer cannot do. That distinction matters for the three pieces of work resting on this: | Rests on | Verdict | |---|---| | The census answer ("nobody else is exposed") | **Stands.** It was a statement about retention, and retention works. | | The countdown banner's promise (old backups stay recoverable) | **True in substance, false in practice.** The bytes are recoverable; the customer cannot recover them. The promise is made to someone who has no way to act on it. | | The capability map's recovery claims | **Must move.** Any claim of the form "the customer can recover the old history with their recovery code" is false today. | --- ## 2. §7.0 — the probe, run first and read-only Run before anything was installed or planted, exactly as the order required. **Q1 — does any host today hold a superseded record with key material present? NO. Zero, fleet-wide.** ``` host_id kfp16 blob_len identity_blob superseded_at demo-hp-bb76ea 3f:4f:65:c0:d8:f 383 NULL 2026-08-04 07:15:36 demo-felhom-8363b5 7e:a6:af:f7:ea:6 383 NULL 2026-08-04 07:20:08 ``` Both are the pre-R-198 rows written hours before the fix. `SELECT COUNT(*) … WHERE identity_blob IS NOT NULL` returned **0**. The retention as fixed had never once been exercised. *Instrument:* hub SQLite copied WITH `hub.db-wal` + `-shm` (the standing gotcha). Freshness proved by a **positive observable** — newest `host_reports` row 61 s old — not by "the query returned no error". `PRAGMA integrity_check` = ok. **Q2 — what act produces a retaining supersession? Two, both read from source:** - `hub/internal/store/store.go:2807` — `SaveHostEscrow` demotes when the newly sealed `restic_pw_sha256` **differs** from the stored one. - `hub/internal/store/store.go:2636` — `DeleteHost` demotes the current row unconditionally. **Q3 — is there any code path that USES a retained record to recover a password? NO.** The product's recovery route is real and wired (R-199) but reaches the **current** row only: ``` controller → agent POST /escrow/recover-offsite-password → escrow.OffsiteKeyRecoverer.Fetch felhom-agent/cmd/felhom-agent/main.go:1757 → hubClient.FetchIdentityEscrow → hub GET identity-escrow handler hub/internal/api/handler.go:1325 → store.GetHostDRBundle hub/internal/store/store.go:3152 SELECT blob, identity_blob, directive_json FROM host_escrow WHERE host_id = ? ``` `ListSupersededEscrow` (`store.go:2841`) is the **sole** reader of a retained `identity_blob`. It has **zero production callers** — five call sites, all in `_test.go`. `CountSupersededEscrow` is used twice and only to render a *count* (`api/handler.go:1209`, `web/hosts.go:572`). **Feasibility verdict: producible.** Phase C proceeded. --- ## 3. Phase C — producing the state ### 3.1 The planted dataset Planted in `/mnt/sys_drive/felhom-data/userdata/drill-20260812` on `demo-felhom`. | file | sha256 | bytes | |---|---|---| | `payload.bin` | `6863824a67bf6cb636defca3cbddc1d58092bcdda3af939224dfef4663c15359` | 65536 | | `plain-ascii.txt` | `e294e0ee5b8fd131dc0fa71f5cf1253dc39473241aa090be36404a568285c83a` | 56 | | `árvíztűrő-tükörfúrógép.txt` | `a1957a87104c63be22b34e4f937e700edcdc925da5984bfcca407df4989f7190` | 37 | **The accented filename never crossed a shell as text** (rule 6). It was built from explicit bytes and verified as hex, both as intended and as listed on disk — identical: ``` c3 a1 72 76 c3 ad 7a 74 c5 b1 72 c5 91 2d 74 c3 bc 6b c3 b6 72 66 c3 ba 72 c3 b3 67 c3 a9 70 2e 74 78 74 ``` ### 3.2 Positive control on the comparator — done BEFORE it was relied on One byte of a copy of `payload.bin` flipped at offset 40000: ``` unaltered f5de179b5ca941645819a879187db953db5c973d4c1a07b2a3ba96d3d79bfb6c altered 515a65d96326bd847a87ea35c9fb5e6afebc9499ec0c1cd80ca3531b22cb2324 payload.bin: FAILED · sha256sum: WARNING: 1 computed checksum did NOT match ``` The comparator convicts. The copy was discarded and the original re-hashed unchanged. ### 3.3 The store, written under P1 `restic backup` into demo-felhom's **own** repository path (`sftp:u629488-sub1@…your-storagebox.de:/home/felhom-repo`) → snapshot **`6ea85413`**, confirmed by identity and by **listing its contents**, not by the success line: ``` 6ea85413 2026-08-12 15:15:33 demo-felhom felhom-offbox,drill-retained-key-20260812 …/drill-20260812/payload.bin …/drill-20260812/plain-ascii.txt …/drill-20260812/M-CM-!rvM-CM--ztM-EM-1rM-EM-^Q-tM-CM-