Files
felhom.eu/REPORT-burndown-3-2026-10-17.md
T
admin e1dd1cadd3
gates / gates (push) Successful in 7m2s
burndown 3: report, evidence, register (174 -> 168), 07 Redis RDB [DESIGN], 04 §6.3 the box's password doors
Closed R-1115, R-1111, R-1112, R-1113, R-1109, R-1110, R-1114, R-1096; opened R-1116 (decoy suites in the other
runners), R-1117 (Immich/Nextcloud Redis volume, deferred). Controller 0.325.0 is the floor since 08:21 UTC.

Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
2026-10-17 10:28:03 +02:00

11 KiB
Raw Blame History

REPORT — burndown 3 (2026-10-17): the translation gate's lost case, two limiters, family sessions, three small fixes, Redis

Written in ASD-STE100 Simplified Technical English. Brief: „burndown 3" (2026-10-17). Design read first: architecture/04-control-plane-authorization.md (it had no section on the box's own password doors — added as §6.3), 07-backup-architecture.md (app classes, the nightly volume dump), 09-update-architecture.md (ladder format L2257–2263, decision 4 L156, part 5 L2325, „frozen WHOLE" L2662). Evidence: documentation/audits/burndown-3-2026-10-17/.

Plain words first

  • Everything in the brief is done. No STOP fired. Nothing waits on you.
  • Controller 0.325.0 is the floor for every box since 08:21 UTC, after Tester 1, demo-hp and demo-felhom updated by themselves and passed the box walk.
  • Five apps' Redis now saves snapshots. It was proven first on the scratch box, then switched on demo-hp. Every other box switches at the app's next start, normally the same night's backup. Tester 1 does not get it yet: it still follows the drill catalog (R-1022, waits on your word).
  • Two findings came from live tests and were fixed before the release: the family list was converted only on the first family visit (now at start), and the off-site wizard said „Hibás jelszó." to English boxes too.
  • One mistake of mine, fixed: my Samba test tool wrote the throwaway test-share password into its log. I removed it from the evidence, replaced the password before turning sharing off, and changed the tool to redact it.

1. Each part

Part Done Note
1 R-1115 yes the decoy moved; fixed; the decoy suite is now a gate (full run)
2 R-1111 yes one limiter body for three doors, parallel tests red-proved
3 R-1112, R-1113 yes fingerprints + conversion at start (found live); one household session
4 R-1109, R-1110, R-1114 yes samba label; guard over 42 calls; one resolver for the sibling
5 release yes 0.325.0, per-box floors, box walk, global floor, read back
6 R-1096 yes 6a proof passed; 6b reading confirmed; 6c pushed and checked

2. R-1115 — what moved

  • The decoy moved, not the gate. Commit 326f846 (R-1102, 2026-10-16) removed gokapi's Hungarian login line. The case appended an English login to gokapi, so the gate had nothing to compare and rightly said OK (rc 0).
  • Fixed side: the decoy. It now rewrites wger's existing English login in place (when the line is gone, the suite stops, so it cannot pass on a lost premise again). New case: calibre-web admin123 → admin1234. Both: rc 1, token named.
  • Gate run time: the decoy suite takes 196 s (measured twice). So it joined catalog_gates.py's full run as gate-decoys, not --fast.
  • Also found: test_catalog_gates.py was red on main since the night before (it counted 18 gates; 19 were registered — my miss last night). Fixed; now 21 with today's two.
  • Whole catalog after the fix: the copy gate says OK. No real template convicted.

3. R-1110 — each call site and its verdict (42 calls, P2-P4/r1110-census.txt)

Calls Where Verdict
14 stacks/migrate.go (copy, verify, cleanup, size, validate, skip set) correct — j.SourceNS/j.TargetNS are set only by NamespaceRoot (accepted by name)
4 + 3 appbackup/paths.go, backup/appbackup_bridge.go correct — nsRoot parameters
15 backup/ capture, restore, tier-2, update guard, prune, kept load correct — nsRoot, sourceNsRoot or m.namespaceRoot(...)
1 api/router.go removeStack correct — nsRoot
2 + 1 + 1 backup/removed_units.go, offbox_placement.go, offbox.go correct — the loop variable came from namespaceRoot; renamed nsRoot
1 stacks/delete.go GetStackBackupData correct (its caller passes AppNamespaceRoot); parameter renamed drivePath → nsRoot
1 web/handlers.go appDetailsForPath correct only while the system drive is never a storage path — now through NamespaceRootFor (same path on an enrolled drive)

No live defect. Red-proofs: the six named sites before the fix; a bare call inside package backup.

4. Redis (R-1096)

6a — the proof on 9202 (docmost, the throwaway). The new line reached the box through a catalog (the drill, copied into the box; no password on the box) and the dashboard's restart:

  • 100/100 probe keys back;
  • aof_enabled:0, rdb_last_bgsave_status:ok;
  • Redis log: „Loading RDB … keys loaded: 133".
  • Then the nightly volume dump, FLUSHALL (0 keys) and the backups page's restore: 100/100 back.

Damage:

  • Old form, 64 zero bytes written into the AOF 400 bytes before its end: exit 1, „Bad file format reading the append only file … use ./redis-check-aof --fix". Control (undamaged copy): starts.
  • New form on a full disk (1 MiB tmpfs): BGSAVE err („No space left on device"), the old dump.rdb byte-identical (same sha256), and after a stop without saving Redis starts on it with 50 keys.
  • New form, a half-cut dump.rdb: Redis also refuses to start („RDB ERROR DETECTED"). The write path never leaves one (temp file, then rename).

6b — the step-file reading, confirmed:

  • 09 L2259–2263: every step but the last has its own complete definition in steps/<to>.yml.
  • 09 L2325: one press applies ONE step with its OWN definition; the last step is the current template.
  • Code: stacks/ladder.go:152 nextLadderStep, :110 the step file path, stacks/pin.go:336 advancePinTo pins that file.
  • A frozen app gets nothing: 09 L2662; sync/sync.go:545–546 (pinned and equal → the catalog template, fixes flow; pinned and different → the stored definition, frozen whole).
  • Nothing says a step file must change with its final template. check-test-record.py rule 4 checks only that a step file names its step's images. Step files unchanged (romm 2, docmost 1, nextcloud 2, immich 2).

6c — the change (catalog 5d9450b, pushed 07:31 UTC). Boxes read from the hub right before the push:

  • demo-hp: romm, docmost, paperless-ngx;
  • Tester 1: paperless-ngx;
  • demo-felhom: none of the five;
  • scratch 9202 (not hub-reporting): paperless-ngx, immich.

Checks after the push:

  • demo-hp 9201: sync, then the dashboard's restart of each app. All three run --appendonly no, aof_enabled:0, rdb_last_bgsave_status:ok, and are running. Keys stayed: RomM 153→150, Docmost 54→58, paperless 2→4 (the apps add and drop their own keys).
  • 9202: the compose holds the new line; it switches at the next start.
  • Tester 1: not reached. It syncs from a drill copy inside the box (R-1022); its paperless still runs AOF.

One finding for the record: sync alone does not restart a running app. The new line runs from the app's next start, which the nightly backup gives every app.

Also done:

  • gate redis-persistence (--fast, 9 decoy cases, red-proved);
  • a 07 [DESIGN] paragraph;
  • the research file updated;
  • R-1117 opened for the deferred volume removal.

5. Versions, commits, fixtures

  • Controller 0.325.0 (MinAgent 0.158.1, no golden), built from 68af0e9.
    • Test builds: rc.1 (94f4493), rc.2 (6ed2238, the family store opens at start).
    • Docs: 88aa65d. Census correction: 85d60a1 (no new image).
    • CI green: 1979, 1981, 1982.
  • Catalog: 33a4b3b (R-1115, CI 1977) and 5d9450b (Redis, CI 1978).
  • felhom.eu: 0314b8e7 (reuse_refs_check.py, R-1114, CI 1980), then this report's commit.
  • i18n: no page changed; every parity fixture byte-identical. The escrow fix reuses the existing key login.msg.wrong_password (same Hungarian bytes).
  • Drill catalog repo (scratch): 9bad48a (its tree set to live main), daff3d2 (docmost's Redis line, for 6a).
  • Release timeline:
    • per-box floors 08:20:02 UTC;
    • all three boxes on 0.325.0 by 08:20:16;
    • box walk green (24 / 9 / 17 containers, none unhealthy; dashboards 200; https-only check OK);
    • global floor 08:21:31 UTC (303 floor_set), read back from hub.db + WAL (integrity ok, 0.325.0=0.158.1, no per-box floor) and from the hub's page.

Instruction file edit (allowed by §5): app-catalog-felhom.eu/CLAUDE.md L54–56.

  • Before: „every gate except image-resolvable and volume-persistence".
  • After: the same, plus gate-decoys with its ~3 minutes.
  • Why: that gate is new today and is not in --fast.

Poster: no fact on felhom-system-poster.facts.md changed.

6. Rows

Before 174. Opened 2 (R-1116, R-1117). Closed 8 (R-1115, R-1111, R-1112, R-1113, R-1109, R-1110, R-1114, R-1096). After 168. R-1022 got one dated sentence (the drill repo's state). unproven.py: NOT WALKED 35 of 55, unchanged.

7. Observations

  1. The catalog's own runner test was red on main since 2026-10-16 night. NOT-A-FINDING: fixed today (count 18 → 21).
  2. The controller, agent and felhom.eu runners do not run their own decoy suites. FILED: R-1116
  3. The family store opened (and converted an old file) only on the first family request, so a box nobody visits through a family gate kept the old values. NOT-A-FINDING: found live on rc.1, fixed in 0.325.0 before release.
  4. The escrow re-auth answered a wrong password in Hungarian only. NOT-A-FINDING: fixed in 0.325.0 (small).
  5. A stacks test wrote the update journal into its package folder; the R-578 walk tripped on it once. NOT-A-FINDING: fixed (small); a probe run proved no other test does it.
  6. Through the dashboard a share rename already applied before R-1109 (delete and add each change the compose). NOT-A-FINDING: recorded in R-1109's close; the label covers a controller update that changes smb.conf alone.
  7. Sync alone does not restart a running app; a catalog fix runs from the app's next start. NOT-A-FINDING: by design (decision 4 keeps fixes flowing; the nightly backup restarts every app).
  8. Tester 1 did not take the Redis change. NOT-A-FINDING: it follows the drill catalog by your ruling (R-1022, note added).
  9. On 9202 a catalog URL change to the private drill repo made the clone fail and left the box with no templates until I pointed it back. NOT-A-FINDING: my own setting change on a scratch box; the running apps kept their definitions; the next good sync restored them.
  10. Immich and Nextcloud keep a Redis volume they do not need. FILED: R-1117
  11. My Samba tool logged the throwaway test-share password. NOT-A-FINDING: my tooling; scrubbed, the password replaced, the tool redacts now.
  12. setup-gate.key sits beside family.json, so someone who reads the data folder could still forge a family app cookie. NOT-A-FINDING: reading that folder already gives every key of the box; R-1112 removed the one value that worked without a key.
  13. The launcher asks for SVG logos that do not exist (404). NOT-A-FINDING: as last night — it falls back to the PNG.

8. Teardown (three layers)

  • Machine:
    • 9202: docmost removed through the product (no volume left), the catalog setting put back (live catalog, controller restarted), the damage-test folder removed, no r1096-* container left. 9202 now runs controller 0.324.0 → it was 0.314.0 before; I moved it to 0.324.0 by hand for the proof (it is set by hand on purpose, nodes.md).
    • 9201: MeTube removed through the product (its empty media folder removed by hand), sharing turned off, the test shares and their folder removed, the test password replaced first. 9201 runs 0.325.0.
  • Host: nothing.
  • Hub: per-box floors set and cleared; the global floor raised to 0.325.0 / MinAgent 0.158.1.