157 lines
14 KiB
Markdown
157 lines
14 KiB
Markdown
# 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.
|