# REPORT — night 2026-10-16 → 17: restore after a reinstall · restic 0.19.1 · small fixes · dashboard hardening Written in ASD-STE100 Simplified Technical English. Brief: the night task of 2026-10-16 (operator decisions 1A and 2A, 21:57). Design read first: `architecture/07-backup-architecture.md` §7.4 (now carries the rule), §6.8, the restore table; `_recovery-inventory-2026-07-28.md`; `02-controller-module-map.md`. Evidence: `documentation/audits/night-restore-2026-10-17/`. ## 0. Readings I took without asking 1. **The rule „the backup's database password wins" applies only when the restore puts back the database's DATA VOLUME.** A backup that holds only a dump goes into the current data folder, which only the current password opens. 2. **„Not on the box" means: the current install is not older than the data.** A unit without the password over an install that existed when the backup was taken uses the install's value; over a newer install it is refused. 3. **Grimmory's on-box restore after its books were removed refused by design** (R-479: a unit holds settings and database, not the household's files). Its on-box route is „use my kept data", which I proved instead. 4. **Part 6: researched, not changed.** Changing five apps' Redis settings on every box needs answers I do not have tonight (the ladder step files, the old volumes left behind, keeping data across the change). R-1096 holds the plan. 5. **The prune with 0.19.1 on demo-hp's real store cannot run tonight:** its clean-up window opens after 2026-10-18 14:16 UTC and only the operator can grant one sooner. Proven on a scratch store instead. ## 1. The restore fix (R-1106, R-127 b, R-926) | Route | Where the database password came from before | Now | |---|---|---| | On-box restore („Visszaállítás"), update rollback, „use my kept data", off-site at the snapshot's version | the unit (unit wins); O4 GENERATED it when missing | the unit; missing → install older than the data → kept, else **refused before any change**; never generated | | Off-site full restore, same version (the reinstall case) | the current install (**the bug**) | the snapshot's, written before the database starts, when the snapshot replays the DB volume | | `.fab` import | the bundle's app.yaml | unchanged | **Drill on demo-hp 9201 (rc.1, the dashboard's own posts), Rallly = Postgres, Grimmory = MariaDB:** | Path | Rallly | Grimmory | |---|---|---| | Off-site full restore after remove + reinstall | marker row back, healthy, 0 auth errors, app's DB login works | marker row + books file (sha256) back, healthy, root and app logins work | | On-box restore after remove (backups kept) + reinstall | both marker rows back, healthy, logins work | refused by design (books removed — R-479) | | Refusal: unit without the password over a newer install | refused before any change; the app kept running, data untouched | — | | „Use my kept data" | — | both passwords from the backup; marker row back; kept file unchanged | Last night the same off-site steps left Rallly crash-looping and Grimmory held. **R-926's answer:** after a unit restore the page hides a login it had to invent and says to use the old password — correct. On the reinstall path the page would have shown the reinstall's admin login; now it records it as not the app's login. Tests `TestR1106_*` (8), red-proved by six mutations; catalog gate `db-credentials` (17 apps, 20 fields, all `type: secret`). ## 2. restic 0.19.1 (R-1107) - **Notes read** 0.18.1 → 0.19.1. One change touches the table: a missing top-level backup path now exits 3 (was 0). The box removes such paths before the call, so only a race reaches it — now a loud failure instead of a silent partial copy. No repository format change. - **Pinned** like 0.18.1 (official file, signed sums, our two pinned sums). A wrong sum fails the build (proved). - **Fixtures** for 0.14.0, 0.18.1, 0.19.1 from one store; `TestR1105_*` runs each against 0.14.0 — all pass. - **Both directions on demo-hp's REAL store:** copies made by 0.14.0, 0.18.1 and 0.19.1, each restored by all three — byte-identical every time; all three list the same 234 copies. **After a 0.19.1 prune:** scratch store only (reading 5) — 0.14.0 lists, checks and restores. - **Scanner** (trivy 0.74.0): critical 3 (2 fixable) → **1 (0)**; high 122 (52) → **93 (23)**. restic's own part 50 → 19. ## 3. Small fixes (Part 3) - **R-1108** done — a share added before the first password is served (test red-proved; live `smbclient` from DooPlex). - **R-1065** done — a Plex claim schedules the wiring (test red-proved; no live claim tonight). - **R-1017** done — the guard exists and found one more bare drive path (the remove dialog's kept-folders list), fixed. ## 4. Dashboard hardening (Part 4) All six R-983 items and both R-976 items done, one red-proved test each. 135 i18n fixtures re-captured (the sign-out control became a form; one minimum-length change), 22 unchanged. **Headless Chrome through demo-hp's public address:** sign in → `/launcher`; `X-Frame-Options: DENY`; sign-out is a POST with CSRF → `/login`; sign in again; the family-gated Grimmory and the setup-gated Rallly open their own pages. ## 5. Part 6 — Redis (R-1096) Seven Redis services: five append-only (romm, docmost, paperless-ngx, immich, nextcloud), two snapshot-only (outline, dawarich). Table and proposed lines: `P6/redis-persistence.md`. Not changed (reading 4). Also: RomM's file WAS repaired on 2026-09-24 — the row's history was wrong, corrected. ## 6. Release **0.324.0** built from `b695857` (code identical to rc.1 `f75b3aa`, the README differs), MinAgent 0.158.1 (the hub's declared value — not lowered). Per-box floors at 21:51:39 UTC (`303` → `floor_set`, all three); **Tester 1, demo-hp and demo-felhom on 0.324.0 at 21:52 UTC**, each through the normal update path. Box walk: no container unhealthy, restarting, exited or created (28 / 9 / 17); restic 0.19.1 in each; dashboards 200; https-only 37 names OK (`release/`). **Tonight's off-site runs on 0.324.0:** demo-hp `backup OK` 02:18:07 UTC (14 apps, 296 snapshots, 2m59s), demo-felhom 02:15:36 (5 apps, 25), Tester 1 02:17:16 (10 apps, 60) — read at 02:45 UTC on each box and in each log (`release/night-offsite-*.txt`). **Global floor 0.324.0 / MinAgent 0.158.1 at 02:46:24 UTC** (`303` → `flash=floor_set`; the brief allowed it tonight); per-box floors cleared. Read back on two channels: one `tar` of `hub.db` + `-wal` + `-shm` (integrity ok: `0.324.0`, `0.324.0=0.158.1`, no per-box floor) and the hub's own `/configuration` page. ## 7. Rows **Before 177. Opened 7** (R-1109 … R-1115). **Closed 8** (R-1106, R-127, R-926, R-1108, R-1065, R-1017, R-983, R-976). **Closed 2 more with the floor** (R-1105, R-1107). **After: 174** (177 + 7 − 10). R-1096 corrected and READY. `unproven.py`: NOT WALKED 35 of 55, unchanged. ## 8. Observations 1. A reinstalled database app restored from the off-site copy came back unusable. NOT-A-FINDING: it is R-1106, closed tonight. 2. A share renamed at the same path is never applied to a running samba. FILED: R-1109 3. Two sibling path helpers are called with drive-named arguments, unguarded. FILED: R-1110 4. The share-password and escrow limiters count a try after the password check. FILED: R-1111 5. Family sessions are stored raw, not as a fingerprint. FILED: R-1112 6. Each `/__family/start` pass with a household session creates a new family session. FILED: R-1113 7. `controller_gates.py` cannot pass in a worktree outside `git/`. FILED: R-1114 8. A catalog decoy („a credential token rewritten in translation") no longer convicts. FILED: R-1115 9. Grimmory's on-box restore after its books were removed refused. NOT-A-FINDING: by design (R-479), its route is „use my kept data", proven. 10. The launcher logs 404s for SVG app logos. NOT-A-FINDING: the page asks for the SVG first and falls back to the PNG; the same 263 assets were in 0.322.0. 11. Two catalog-wide stacks tests take about 26 s each. NOT-A-FINDING: test duration, no defect. 12. R-1096's history said RomM's Redis file was not repaired on 2026-09-24. NOT-A-FINDING: the row text is corrected tonight (the file was repaired; the 2026-10-16 cause is unproven). ## 9. Teardown (three layers) - **Machine (demo-hp 9201):** Rallly and Grimmory removed through the product (no container, volume, unit, copy or hold left); my marker files and the cover file removed; sharing off, the test share and its folders removed. 9201 runs 0.324.0. The old Kimai hold is not mine and stays. - **Host:** nothing. - **Hub:** per-box floors set and cleared; the global floor raised to 0.324.0 / MinAgent 0.158.1 (the release, §6).