Files
felhom.eu/REPORT-day-2026-10-19.md
T

14 KiB
Raw Blame History

REPORT — day 2026-10-19

The operator answered the two STOPs in advance („YES to the agent and the hub release") and earlier: golden 0.331.0 vouched; D16 (one sign-in) yes; D17 „one per day, 3 days". No question was asked during the session.

In plain words

  • Agent 0.160.0 runs on all three test hosts. A new recovery code replaces the old one only after the household types two of its words back; a broken-into box cannot flood the whole-box backups; the local copies are one per day for 3 days; an empty partition does not ask „data will be erased". It is not vouched — that is yours.
  • One sign-in for the file manager is live on every box (controller 0.332.0, the floor). „Fájlok ↗" opens the app's folder with no second login. A sign-out on the dashboard asks again. No app on the box can pretend to be the household.
  • Hub 0.159.0 is live. A refused backup has its own alarm text. A reinstall over an old host record now mails you; it does not re-issue the codes by itself (a security review stopped the first draft that did).
  • The preview error (R-1153) was a broken test file, not the box.
  • The old backup program still reads demo-hp's off-site copies after the first real clean-up with the new one.

1. Agent 0.160.0 (R-978, R-973, R-1093, R-1149, R-1151) — audits/day-2026-10-19/P1/

  • Content: R-978 (an abandoned second ceremony keeps the first code), R-973 (the cadence cap: daily tier 3 per 24 h, off-site 1 per 6 days), R-1093 (an empty partition is not data), R-1149 (local tier keep-daily=N, operator D17), R-1151 (the package uploads only at POST /escrow/ceremony/confirm with two typed words; a claim without defer_upload keeps the R-978 order, so an old controller still completes a ceremony). Commits 1b6e316, c11e3e2, 124164d (CHANGELOG), 4545819 (two texts, after the release, unreleased). Released with release-agent.sh: sha256 7ebb547f2b1ab93544ba828d3040351b60c4126327a5b85bbcb33f8f2b3dfca1, bundle 6b06090190ff609af1fe9842447ebf385fd52da4be382bc7ca708b558c8e202f, round trip verified, tag v0.160.0.
  • Red-proofs: keep-last for the primary → „primary tier prune = "keep-last=3"" and „holds 0 copies made before the compromise"; the claim's defer flag ignored → „a code that was shown but never typed back replaced the package: code 1 no longer opens it (uploads=2)" (all three abandon paths); the word check skipped → „one wrong word: got 200".
  • demo-hp proof (signed jobs 01:22 UTC, running 01:23, „update committed" 01:24; probe 75/75):
    • a normal „Mentés most" of 9201: green, 6.9 GB in 443 s; yesterday's copy pruned (keep-daily=1, the same copy keep-last would prune); the cap's history on disk holds both successes;
    • escrow through the wizard's own calls: ceremony 1 — one wrong word 422, the right words 200; code 1 opens the hub's package, code 0 is a kept earlier one (422, superseded at the confirm second 01:47:47). Ceremony 2 shown and abandoned — code 1 still opens it (200), code 2 opens nothing (400). demo-hp's stored code is now code 1 (CC's secret store);
    • R-1093 on the real route: a 64 MB RAM disk (scsi_debug, /dev/sdb), one empty GPT partition → POST /disks/format → 200 formatted, no confirmation; control: the same partition, now ext4 → 403 needs_confirmation. RAM disk removed. A loop device cannot be used: the route and the probe accept only sd/nvme/vd/hd names (by design).
  • The answer: the operator's „yes" (in advance). Tester 1 and demo-felhom took 0.160.0 by signed jobs (01:52 UTC → 01:54 / 01:55, probe 75/75, keep-daily=3 armed on both); the hub's host rows read 0.160.0 for all three, and fresh reports after the hub restart. Old controller with the new agent: pinned by TestEscrowCeremony_R1151_OldControllerKeepsTheClaimOrder; new controller with agent 0.159.2: pinned by TestR1151_OldAgentClaimCompletesAtOnce and the agentapi test — no host runs 0.159.2 any more, so not walked live.

2. One sign-in (R-1100) — audits/day-2026-10-19/P2/, P4/05-*, P4/06-*

  • Built exactly the design note's recommendation (controller 9bdd8f8, 601bdba): the dashboard pass, the host-only files cookie (derived from the session fingerprint, the R-976 shape), the per-box secret header name, the forwardAuth answer; header user felhom-household with the household's file rights from userDefaults; logoutRedirectUrl = the dashboard; admin stays a password user; the data tab's „asks for its own password" note only without the sign-in.
  • Tests, each red-proved: replayed pass, expired pass, pass for another host (two guards: the host check and the host-bound session key — red only with both removed), wrong X-Forwarded-Host, no session → no pass, signed out → asks again (and after a password change), cross-site → no pass, dot-segments in to, the absolute redirect, the config trusts only the secret name, the header user's rights, the route asks the controller and strips the header, the note.
  • Live, found and fixed before release: on rc.2 the pass answer's relative redirect became http://felhom-controller:8080/files/ — traefik resolves a forwardAuth answer's Location against the auth server. Fixed (absolute), red-proved, rc.3. A background security review then flagged CSRF and revocation: /__files/open now refuses a cross-site request and dot-segments; the revocation residual is R-1155.
  • Live proof (rc.3, 9201, headless Chrome through the public names mapped to the box): signed in → calibre-web's „Fájlok ↗" → FileBrowser at NVME 1TB/media/books, no login form, user felhom-household (admin false, modify true, login method proxy); signed out → files.<domain> went to the dashboard login. Screenshots browser/01-…, 02-…, 03-…. Forged headers (forged-headers.txt): through traefik with no cookie — the old public name, a random name and the REAL secret name all 401; from the bookstack container straight to filebrowser:80 — the old name and a random name 401; control: the real name from the same container 200 (the protection is the name's secrecy). The brief named Nextcloud; bookstack was used (an app on 9201's network with curl).

3. Preview check (R-1153) — audits/day-2026-10-19/P3/

On 9202 (controller 0.331.0): OnlyOffice installed, the link on (FileBrowser back in 4 s). The hand-made teszt.docx (912 bytes) → 500 „fitz: cannot open document"; OnlyOffice's own sample.docx → 200, a 256×256 JPEG, 0.3 s. Same with the link OFF. FileBrowser 1.5.6 previews .docx with its own MuPDF before OnlyOffice (preview.go determinePreviewType). Closed: not a product defect. OnlyOffice removed through the product (both volumes gone), test files deleted.

4. Controller release 0.332.0 — audits/day-2026-10-19/P4/

Image 0.332.0 from 601bdba (digest sha256:245266a4…), 03:16 UTC. Per-box floors 03:16:43 → Tester 1 and demo-felhom on 0.332.0 at 03:16:45–55, demo-hp (from rc.3) at 03:17. Box walk on all three: 0 unhealthy, 0 allow-list refusals, FileBrowser re-published 6 s after its re-create, public pages 200; https-only 28 OK, 0 failures, both controls right. „Fájlok ↗" with no login through the public internet on demo-hp and Tester 1 (pass → cookie → felhom-household; a fresh browser 401; sign-out → back to the dashboard). demo-felhom: CC holds no dashboard password for the lived-in box, so its check is the files (secret 0600, config and route carry it) and the refusals (forged secret name through traefik 401, old name from outside 401, a forged pass 403). Global floor 0.332.0 / MinAgent 0.158.1 at 03:24:18 UTC, read back with the WAL; per-box floors cleared (read back empty). MinAgent 0.158.1 ≤ the vouched agent 0.159.2. i18n fixtures changed (named): escrow_first, escrow_receremony; all others byte-identical. No golden (decision 250); the floor is above golden 0.331.0 until Sunday's bake.

5. Hub 0.159.0 (R-1150, R-1154) — audits/day-2026-10-19/P5/

  • Written by a helper (5121536f, b505ce4b). R-1154's rule, and why: the helper's first draft re-issued the claim code and the off-site provider password automatically when the old host was stale or switched off. A background security review flagged it; the helper then read what the retrieval passphrase already grants (/config → the controller API key; the enroll → the host key) and found the re-issues are the operator's session-only powers (decision 252). So the passphrase must not reach them: the reuse path re-issues nothing; when the old box looks gone it mails the operator („delete the old host and run the installer again, or re-issue …"), a live box gets an info record. The operator's delete stays the gate. R-1150: whole_guest_backup_refused (operator-only, hub-origin; NOT in allowedEventTypes, against the brief's wording — the suspected controller must not post or pre-empt it, R-895's shape). Tests red-proved (helper's list in hub/CHANGELOG.md).
  • A push blocker on the way: R-887's dated check was due today. Measured: 381 CI jobs since the S21 change, 0 lost (the three re-runs' first attempts ran 47–49 s; control: the known lost attempt of 2026-10-10 ran 11 min 48 s and the attempt count finds it). Closed.
  • Deploy: image from a clean clone (the shared checkout held my uncommitted evidence), manifest 200ab653, ArgoCD synced the hub Deployment only (the only OutOfSync resource), Synced/Healthy, no ERROR, the floor read back, then fresh reports from all three hosts (02:23–02:25 UTC) and all three controllers (02:29–02:31 UTC).

6. The old-restic check — audits/evening-2026-10-18/P8/old-restic-check.txt

The night watcher ran it: window 12 at 02:18 UTC removed 63 of demo-hp's 324 copies (→ 261); the old restic (0.14.0) and the new (0.19.1) both list 261 and restore a 0.19.1-made copy and an August copy to identical content hashes. STATUS item closed; REPORT-evening-2026-10-18.md §9 filled.

7. Versions, commits, fixtures, rows

  • Agent 0.160.0 (released, not vouched) — 1b6e316, c11e3e2, 124164d, 4545819. Controller 0.332.0 (floor) — ba4a6f0, 9bdd8f8, 601bdba; rc.1–rc.3 on 9201 only. Hub 0.159.0 (deployed) — 5121536f, b505ce4b, manifest 200ab653. felhom.eu afc939bb (R-887), 5622ce27, this commit. Catalog: none.
  • Fixtures: escrow_first, escrow_receremony (controller); no other page changed.
  • Register: 168 before, 166 after; closed 10 (R-887, R-978, R-973, R-1093, R-1149, R-1151, R-1100, R-1153, R-1150, R-1154), opened 8 (R-1155 … R-1162).
  • unproven.py --summary: not walked 35 of 55 — unchanged. Capability map: not changed. System poster: text only — the local whole-guest „Kept" cell („one copy per day, up to 3 days") edited in both the facts file and the drawing.

Observations

  1. FileBrowser's own 2-hour token can outlive the dashboard session if only the files cookie is lost. FILED: R-1155.
  2. A reinstall within 45 min of the old box's last report reads „live" (no mail). FILED: R-1156.
  3. Repeated cap refusals inside the 24 h hold raise no new alarm. FILED: R-1157.
  4. The off-site leg of the clean-slate re-issue may be obsolete since hub v0.127.0. FILED: R-1158.
  5. The retrieval passphrase yields the controller API key, which registers and confirms off-site keys. FILED: R-1159.
  6. Hub and agent have no gofmt gate (~20 and 14 files drift). FILED: R-1160.
  7. The escrow wizard calls the code „live" at the reveal; since R-1151 it is live only after the typed-back words. FILED: R-1161.
  8. R-973's off-site half (ep0 prunes by count) outlives the closed row. FILED: R-1162.
  9. traefik resolves a forwardAuth answer's relative Location against the auth server. NOT-A-FINDING: found on rc.2 and fixed before the release (red-proved); recorded as a rule in CONTEXT and memory.
  10. The ceremony log line and two R-973 comments were stale. NOT-A-FINDING: fixed in agent 4545819 (the size rule).
  11. My first OnlyOffice link call sent {} and switched the link off. NOT-A-FINDING: my call; the API wants {"enabled": true}; it was already off, nothing restarted.
  12. The R-1093 route refuses loop devices. NOT-A-FINDING: by design (only real disk names are allowed); a RAM disk was used.
  13. CC holds no dashboard password for demo-felhom, so its „Fájlok ↗" was not walked as a household. NOT-A-FINDING: the lived-in box's household password is not CC's (decision 254); its files and refusals were checked instead.
  14. A helper's commits sat unpushed in the shared felhom.eu clone for ~40 minutes (blocked by R-887's due check). NOT-A-FINDING: the gate did its job; pushed with my R-887 commit.
  15. Two shell scripts of mine were refused by Claude Code's removal check (a cleanup rm it could not read behind bash -c). NOT-A-FINDING: rewritten without the removal; nothing was deleted.

Teardown — three layers

  • Machines: 9202 — OnlyOffice removed through the product (volumes gone), test documents deleted; 9201 — on 0.332.0 (the floor); the escrow test left demo-hp on code 1 (stored); demo-hp host — the RAM disk module removed, helper scripts deleted, no file left in /root (an older helper, /root/opens.sh, removed by name at the end). Cookie jars and password files on DooPlex shredded or emptied. One debugging sign-in on demo-hp's dashboard (curl, 03:03 UTC) was not signed out; its cookie file is shredded, so the session expires unused.
  • Hub: global floor 0.332.0 / 0.158.1, no per-box floor; hub 0.159.0; no vouch.
  • DooPlex: builds (agent, controller rc.1–3 + 0.332.0, hub 0.159.0 from a clean clone) and the hub deploy; no Docker cleanup.

Architecture read: 01, 02 „Logins and folders", 03 §8a, 04, 05, 07 §6/§6.1; the design note. Documents changed: 02, 03 §8a, 07 §6.1, the poster facts + drawing text, 05 §8 (helper). Instruction files: none changed.