# REPORT — night 2026-10-22: seven decisions, the data-loss candidates, the 03:30 pressure, the tunnel alarm, private repositories Evening → night brief, started ~16:00 CEST. Nothing was released, deployed or published, except the catalog change and the scratch box's catalog login (both allowed by the brief). Design read: `07-backup-architecture.md` §6.1.1, §6.2, §10.2; `03-host-agent.md` (tunnel, bundle); `05-hub-architecture.md` §15; `06-offsite-connectivity.md`; `09-update-architecture.md` §6.5. ## 1. Five lines 1. **D8:** done before 18:00 — DooPlex's Docker settings come from git (no change, no restart), and a weekly build-cache prune timer runs Sunday 23:30. 2. **The seven decisions:** live — D6, D8, D27 (report only). Ready, waiting for a release or publish — D21 (controller 0.340.0), D3 + D5 (one website patch), D4 (agent bundle patch + installer patch). 3. **Data-loss candidates:** 2 proven and fixed in code (R-1187 c, R-1189 d); 5 real in code, now rows with a written fix (R-1218, R-1219, R-1220, R-1221, R-1222); 1 closed half (R-1189 b, fixed in 0.304.0); 3 to the operator (R-1205 as D31, R-1189 f, R-1190 d); the rest stay as named candidates. 4. **03:30 pressure:** the second-drive copy's file cache is charged to the guest and pushes the apps out of memory. The fix runs the copy in a 512 MB memory-capped container: full stall 5.7 s → 0.37 s on the scratch box. 5. **Private repositories:** only felhom-controller can go private (after one CI change). felhom.eu, the agent and the catalog must stay public: the website, every install and every box read them with no login. ## 2. The morning list (also in STATUS) 1. Publish the website patch (D3 wording, D5 hardware page). 2. D4: the agent bundle patch with the next agent release (your vouch) + the installer patch with a new installer tag. Discard appliance 49 on the hub's Hosts page (tonight's test install). 3. Deploy hub 0.166.0 (tunnel alarm) and release the agent with `handshake_future_s` — one agent release with item 2. 4. Release controller 0.340.0 (R-49, R-1187 c, R-1189 d, R-1214), MinAgent 0.158.1. 5. Decide D29 — the controller repository private? CC: No, not now. 6. Decide D30 — the tunnel repair. CC: the agent makes a new key and registers it on the path that exists. 7. (D31, R-1205, when there is time.) Tester 2's „go" from yesterday stays on the list. ## 3. Per candidate | Item | Result | Reason | |---|---|---| | R-1187 a | REAL in code → row R-1187 (now P2) | an export drops a folder with a symlink and still says done; capture code: needs a red-proof + 9202 proof | | R-1187 b | REAL in code → R-1187 | the import sets no owners and drops symlinks | | R-1187 c | **PROVEN and FIXED** (`d5f88a2`) | 9202 rc.1: an import over a stopped app merged old + new data; rc.2: refused, app untouched | | R-1187 d | PLAUSIBLE → R-1187 | no busy check; after (a) | | R-1187 f, g | REAL in code → R-1187 | HDD_PATH trusted; postgis missed, psql without ON_ERROR_STOP | | R-1188 a, c | already CLOSED (R-1195; 0.337.0) | — | | R-1188 b, d, e | R-1188, re-ranked P4 | unlikely or a sentence | | R-1189 a | REAL, half-live → R-1189 | agent code; rides an agent release | | R-1189 b | SPLIT: skipped nights CLOSED (R-899, 0.304.0); creep → **R-1221** (P4) | demo-hp journal: a night run after each of 3 off-cycle runs; creep 1.5–5 min/night measured | | R-1189 c, g, i | REAL in code → R-1189 (P4-shaped) | quiesce vs restore; spring forward 2027; double click | | R-1189 d | **FIXED** (`d5f88a2`) | the catch-up now runs the proof + integrity once; red-proved | | R-1189 e | REAL in code → **R-1222** (hub, P3) | an evening backup time gives a false „dump missed" every morning | | R-1189 f | operator → R-1189 | design question | | R-1190 a | REAL in code → **R-1218** (P2) | proposed fix, not built: key code needs a live proof, and 9202 has no hub | | R-1190 b | REAL in code → **R-1219** (P2) | the top bar links to a ceremony the page hides during an offer | | R-1190 c | PLAUSIBLE → R-1190 | a read-only fingerprint compare decides it | | R-1190 d | operator → R-1190 | design question | | R-1190 g | REAL in code → **R-1220** (P2) | an unreadable app.yaml lists a live folder as kept (deletable) | | R-1205 | operator → **D31** | the F-14 gate is deliberate (ruling 2026-07-13) | | R-1206 | NARROWED | Felhom tier: no loss, by design (R-822 guard). NAS tier: a unit test is owed | Research input: `documentation/audits/night-2026-10-22/P3-candidates/analysis.md`. ## 4. Records **Commits.** - felhom-controller: `6a17c95` (R-49), `d5f88a2` (R-1187 c, R-1189 d), `03c0a69` + `ae39467` (R-1214), `df78b6c` (docs). CI jobs 2214, 2220, 2221, 2222, 2223 — all success, attempt 1. - felhom-agent: `a0c88e5` (R-1204 + D4), `7651461` (D4 moved to a patch), `e803ad2` (docs, a correction). CI 2217, 2218, 2224 success. - felhom.eu: `0639cf07`, `e267c5e2` + `1100a344` (one push), `acc78637`. CI 2215, 2219, 2225 success (2219 covers `e267c5e2`). - app-catalog-felhom.eu: `ce33e3b` (Immich `backup.volumes`). CI 2216 success. - homelab-manifests: `b35ba83` (D8), `c7506df` + `b0cce29` (REPORT). No CI in that repo. - Drill catalog (scratch, no CI by design): `2ba4b53`, `9ebdba6`, `b0350a3` (tree = live `ce33e3b` again). **Images pushed.** `felhom-controller:0.340.0-rc.1`..`rc.4` (never offered to a household: not X.Y.Z). `felhom-hub:0.166.0` (built, NOT deployed: the live hub and `manifests/hub.yaml` are 0.165.0, read 18:2x). **Teardown, three layers.** - **Machine (9202):** the throwaway uptime-kuma removed through the product (its `.fab` deleted); the hog container and 19 GB of test files removed; memory 25898 MB / swap 512 MB again; Immich's `.felhom.yml` back to its pre-night file; controller back on 0.339.0 (healthy, every app up). Kept on purpose: the `drill-reader` catalog login (D6). Left: the four rc images in 9202's own Docker store, like earlier rc images there. - **Host (demo-hp):** VM 9343 destroyed (own id); `/tmp/r1214*` removed; two sampler loops stopped. The scratch storage and VM 341 / CT 9401 are standing items, not tonight's. - **Hub:** appliance 49 from VM 9343 is still „registered" — Discard is the operator's (session-only). Nothing else. - **DooPlex:** the D8 timer (intended). Nothing else changed. **Rows:** before 178, after 180. Opened 5: R-1218, R-1219, R-1220, R-1221, R-1222. Closed 3: R-206 (D8), R-992 (D6), R-1207 (D27). Updated: R-49, R-925, R-982, R-985, R-991, R-1187 (P3→P2), R-1188 (P3→P4), R-1189, R-1190, R-1204, R-1205, R-1206, R-1214, R-1215. **Unproven claims:** 35 of 55 not walked — unchanged. **System poster:** no listed fact changed (nothing that the poster draws shipped tonight) — none of the three actions was needed. **Observations.** - 9202's sync refused Immich's template (R-971: Immich's data sits on a bench mount, not a household drive). — NOT-A-FINDING: R-971 by design; the file was placed by hand for the proof and put back. - The local unit restore of Immich was refused (R-538). — NOT-A-FINDING: by design; the proof used an empty-cache start. - A non-`--fast` catalog gate run started the runtime gate on DooPlex; its canary refused and left nothing. — NOT-A-FINDING: the canary is the control; the rule (`--fast` on DooPlex) exists. - Images and packages stay public when a repository goes private. — NOT-A-FINDING: they follow the user `admin`, and boxes must pull them; recorded in R-925 and D29. - A CI read token is a precondition of D29. — NOT-A-FINDING: a step of that decision, written in it. - R-925 said „32 source comments"; the served count is 61 on four pages. — fixed in the row. - **CC's own mistake 1:** the agent CHANGELOG and felhom.eu commit `1100a344`'s message say a push of the installer publishes it. Wrong: `/scripts/` is served from the tag `installer-v1.35.0` (R-110). Corrected in the agent CHANGELOG (`e803ad2`) and R-982; the commit message cannot change (no force-push). Keeping D4 as a patch still holds: both halves need a release that was forbidden tonight. - **CC's own mistake 2:** controller commit `df78b6c` carries a „Co-Authored-By" line, which the brief forbids. It stays (no force-push); no other commit tonight has one. - **CC's own mistake 3:** homelab-manifests' REPORT first claimed a separate daemon.json backup. There was none — the file did not change and is byte-identical to the role's copy in git (`cmp`). Corrected in `b0cce29`. - The guest has no rsync. — NOT-A-FINDING: rsync lives in the controller image; the capped copy uses that image. - R-1215's evidence is gone (Immich restarted at 02:16). — said in the row; it stays a watch.