Design build done: R-469, R-638 closed; R-518/R-717/R-762 narrowed, R-528 stopped by its measurement; delivery + teardown evidence; STATUS, CONTEXT, REPORT (137 -> 137; 2 opened, 2 closed); section counts recomputed
gates / gates (push) Successful in 2m39s

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
This commit is contained in:
2026-10-06 16:11:28 +02:00
parent 8db4425d98
commit 2441c86a89
8 changed files with 171 additions and 130 deletions
+12
View File
@@ -16,6 +16,18 @@
> and holds nothing of its own; this file does hold its own content, namely the standing rulings below. > and holds nothing of its own; this file does hold its own content, namely the standing rulings below.
> **2026-10-06 (evening) — the design build (`09` §3 151–156).** Register 137 → 137 (2 opened: R-892 Tester 1 walk
> route, R-893 off-site rollback reverse direction; 2 closed: R-469 by ruling, R-638). Controller **v0.301.0**
> (`0b1b8d3`, MinAgent 0.131.0) + golden 0.301.0 (`96e94fed…`, Docker pinned to the approved set), vouched with agent
> 0.149.0; floors 0.301.0 / MinAgent 0.131.0 for demo-hp, demo-felhom, tester-1 — all three run it. **R-518** one stop per
> tier, the button makes the local copy only (reverses R-82's one window; first night read-back owed). **R-638** main
> restore paths measured safe on 9202 (docmost, romm), two side paths fixed by order. **R-717** `after_setup`
> `open_command`; wishlist uses it (catalog `a5a5b51`, live-proven); opengist cannot (no tool in its container).
> **R-528 STOPPED by its measurement:** Docker 29.8.2 sets `OOMKilled` correctly in all four shapes tried (operator to
> confirm or drop decision 155). **R-762** wger serves `/static` + `/media` through a `wger-files` nginx (catalog
> `cf1ed43`, a definition step — new bench option `--move-to` / writer `--to-definition`); wger stays hidden, its
> `runserver` question remains. Agent repo gained the shared rule file. Evidence `audits/design-build-2026-10-06/`.
> **2026-10-06 (afternoon) — instruction files kept true; vaultwarden on the ladder (`09` §3 149–150).** Decision 150: > **2026-10-06 (afternoon) — instruction files kept true; vaultwarden on the ladder (`09` §3 149–150).** Decision 150:
> a session corrects a stale fact in `CLAUDE.md` / `.claude/rules/*` itself and names the edit (file, before, after, why); > a session corrects a stale fact in `CLAUDE.md` / `.claude/rules/*` itself and names the edit (file, before, after, why);
> it never loosens a rule, fence or „never" without the operator — rule text in `.claude/rules/unprompted-work.md` §5 > it never loosens a rule, fence or „never" without the operator — rule text in `.claude/rules/unprompted-work.md` §5
+91 -116
View File
@@ -1,147 +1,122 @@
# REPORT — instruction files kept true; vaultwarden on the ladder; the burn-down continued (2026-10-06 afternoon) # REPORT — the design build: restore order, out-of-memory alarm, one stop per tier, the family window, wger's files (2026-10-06 evening)
| Part | Result | | Part | Result |
|---|---| |---|---|
| **A** — the instruction-file rule (R-891, R-469, sweep) | **done** — rule in all four copies of `unprompted-work.md` §5 and `PROMPT-TEMPLATE.md` §9 rule 9; R-891 fixed and closed; R-469 re-read: NOT removable, narrowed (an operator question); sweep: 26 factual edits in four repos (list below). No permission prompt or refusal came up. | | **A** — housekeeping | **done** — decisions 151–156 recorded first; R-469 closed by ruling; the agent repo has the shared rule file (identical: `diff` against the controller's copy empty, one md5 across five copies); the Tester 1 walk route is NOT a 30-minute fix → R-892 |
| **B** — vaultwarden on the update ladder (R-890) | **done** — the test-box admin seed built (catalog `6b4877d`, red-proved); 1.36.0-alpine → 1.37.4-alpine proven on bench 9401 and on 9202; written by `--write-ladder` (catalog `ecb8552`); R-890 closed | | **B** — restore order (R-638) | **done** — measured first on 9202: both main paths SAFE (docmost, romm); two side paths fixed by order, red-proved; exposure 3 not fixable by order → known limit in `07` §6.3 + R-893; R-638 closed |
| **C** — the burn-down | **3 closed** (R-644, R-763, R-764), **2 stopped with the reason written** (R-762 medium, R-717 needs a design) | | **C** — out-of-memory alarm (R-528) | **STOPPED by its measurement** — Docker 29.8.2 set `OOMKilled` correctly in all four shapes; nothing built; a decision for you |
| **D** — one stop per backup tier (R-518) | **built and delivered, not shown live** — measured first (read-only): the off-site part of a stop is ~2 s; red-proved; the live button test was not possible on 9202 (no agent connection) and the demo boxes take deliveries only → R-518 open for the first night read-back |
| **E** — reopen a sign-up for the family window (R-717) | **done for wishlist, proven live; opengist stopped** (no tool in its container) → R-717 narrowed |
| **F** — wger's file server (R-762) | **done and proven on both venues; wger stays hidden** — R-762 narrowed to the `runserver` half it carries from R-755 |
| Rows before | Rows after | Opened | Closed | | Rows before | Rows after | Opened | Closed |
|---|---|---|---| |---|---|---|---|
| **142** | **137** | **0** | **5** (R-890, R-891, R-644, R-763, R-764) | | **137** | **137** | **2** (R-892, R-893) | **2** (R-469, R-638) |
## Baselines and rulings ## Baselines and rulings
Verified at the start: felhom.eu `7d0dffcf34`, controller `36088fd82e` (v0.300.0), agent `cefdc731a4` (v0.149.0), Verified at the start: felhom.eu `01d5dbd3e0`, controller `31242786af` (v0.300.0), agent `3e8ebeb96c` (v0.149.0), catalog
catalog `65130c6c03`; register 142. Read: every repo's `CLAUDE.md` and `.claude/rules/`, `REPORT.md`, R-890, R-891, `ecb8552ee9`, register 137. Read: the three designs in `audits/night-burndown-2026-10-05/`, rows R-638, R-528, R-518, R-717,
R-469. The two rulings were recorded first as `09` §3 decisions 149 and 150, with the reviewer's error recorded in 150. R-762, R-469, `07` §6, `08` (the OOM rung), `09` §3 decisions 47/49. Rulings recorded first as `09` §3 151–156 (ruling 6 is
Architecture read: `09-update-architecture.md` §3 (decisions 16, 35, 42, 146), §6.4 part 4 (the ladder writer), §6.5 carried as A by the brief; the operator's chat answer was not visible to this session).
(the drill catalog).
## Part A ## Part B — R-638
**The rule** — `.claude/rules/unprompted-work.md` §5 „Instruction files", the operator's text verbatim plus the **Slice 0, measurement only** (scratch 9202, controller 0.299.0, drill catalog; `audits/design-build-2026-10-06/B/`).
permission-check sentence; identical in felhom.eu, felhom-controller, app-catalog-felhom.eu and the workspace root's Install the OLD definition → seed → the guarded Update migrates (its backing-up phase makes the copy at the old version) →
unversioned copy (md5 `c1e6c881…` for all four). `documentation/PROMPT-TEMPLATE.md` §9, rule 9. felhom-agent has no copy the household's restore of that copy (`POST /backup/restore`, the only copy offered: "helyi").
of the shared rule file (it never had one); adding one is a rule change, left for the operator.
**R-469 — not met.** R-463 closed (8 of 11 PostgreSQL apps converted by the box; zipline, adventurelog, immich stay on 16 | app | migration | after restore | `Imported DB dump` | seed | the copy's own dump (control) |
by decision 42), but the engine gate now enforces decision 35: a PostgreSQL major passes only with a two-venue ladder |---|---|---|---|---|---|
entry carrying `engine_conversion`. Removing it would let an unproven major ship, and the image refuses to start on the | docmost 0.95.0 → 0.96.0 (pg16) | 42 → 48 tables (+6 `oauth_*`, `public_spaces`, `siem_destinations`) | 42, none of the 6 | yes | read back | 42, equal |
old datadir. That is a loosened fence. Nothing is left for CC to build; the row asks the operator to close it (CC's pick) | romm 5.0.0 → 5.3.0 (mariadb 11.4) | 27 → 39 (+12) | 27, none of the 12 | yes | read back | 27, equal (views counted) |
or keep it.
**Every instruction-file edit** (before → after, why). All factual; none loosens a rule. Both went back to the old pinned version and ran. **Said plainly:** romm needed four runs — run 1 refused the install
(its data path must be a drive), run 2 hit an empty drill commit, run 3 measured correctly but my control read the wrong
file (a `pre-restore-*` dump) and missed three VIEWS; run 4 fixed both. docmost's run 1 installed the live version
because the box had not read the drill yet (the script then waited for the old reference).
felhom.eu **Slices 1 and 2** (controller `9c94568`): `RestoreApp` starts only the database services, replays, then the app; a dump
1. `CLAUDE.md` „Gates — ONE entry point": a list of ten gates + „`--fast` … today that is all of them" → the `GATES` with no identifiable database service is refused before anything is touched; a failed volume step skips the replay
table is the list (nineteen gates); `--fast` skips the full-run-only gates and names them (today `iso-bootstrap`). Why: (fallback and unit restore). Red: `B/red-slice1-fallback-order.txt` ("the FULL stack was already up when the replay fired
`repo_gates.py` imported: 19 gates, `iso-bootstrap` not fast. **R-891.** (calls before the replay: stop,start)"), `B/red-slice2-no-replay-after-volume-failure.txt`. **Exposure 3** (the off-site
2. `CLAUDE.md` design pointer `architecture/01..05-*.md` → `01..11-*.md` (00 = the capability map). Why: 06–11 exist. rollback loads the newer pre-restore dump over the older volume; the older definition is not put back) cannot be fixed by
3. `.claude/rules/docs.md` „the locked design" `01..05` → `01..11`. Same reason. order — known limit in `07` §6.3, row R-893.
4. `.claude/rules/website.md`: the list of what `site_gates.py` asserts gains „no embedded `<style>` blocks". Why: its
gate 7 (`site_gates.py` docstring).
5. `.claude/rules/unprompted-work.md`: §5 added; „Same wording lives in all three repos'" → names the three repos and the
workspace root. Why: four copies exist.
6. `documentation/runbooks/workspace-CLAUDE.md` (the workspace root `CLAUDE.md` links to it): standing rule 3 carried the
R-286 sentence group twice in a row; the second copy removed.
felhom-agent ## Part C — R-528, stopped
7. `CLAUDE.md` gates: „`reuse_refs_check` and `instructions_gate` … today that is all of them" → every gate in `GATES`
(five: three shared, `published`, `release-complete`); `--fast` skips `published`. Why: `agent_gates.py:52-60`.
8. `CLAUDE.md` decoy paragraph: `scripts/decoy_coverage_gate.py`, `documentation/audits/AUDIT-gate-decoys-…` → with
`felhom.eu/`. Why: neither exists in this repo.
9. `.claude/rules/health-checks.md` (comment): „The single source is now felhom.eu/CLAUDE.md 'Code quality rules'" → the
copies are felhom.eu `hub.md` and the controller's `gates.md`. Why: that section holds no health-check rule.
felhom-controller `C/C0-oom-signal-measure-9202.txt`: four runs in a throwaway alpine container under a cap. Runs 1–3: the kernel killed the
10. `.claude/rules/gates.md`: `python3 controller/scripts/controller_gates.py` (from `controller/`) → hog AND the main process (the box cannot protect it: `--oom-score-adj -1000` left pid 1 at 0) — exit 137,
`python3 scripts/controller_gates.py` from `controller/` (or the long path from the repo root). Why: the old path does `OOMKilled=true`. Run 4 (256 MB, `sleep infinity`, one 400 MB block): the container kept running, `oom_kill` 0 → 3,
not exist from `controller/`; the runner's usage line and CI use the new one. `OOMKilled=true`, three `oom` events. The design's premise — the flag stays false while the counter rises — did not
11. `.claude/rules/gates.md`: the list of ten local gates → a pointer to `GATES` (fourteen local + three shared; the reproduce on Docker 29.8.2 (the false flags of 2026-09-15 were on 29.8.0). By the brief's measure-first rule, nothing was
advisory `golden-notice`). Why: `controller_gates.py:71-101`. built. Cost read for the record: one exec read of demo-hp's 21 containers 1.6 s wall (`C/C1-…`). `08` records it.
12. `.claude/rules/gates.md`: the shared list gains `observations_gate.py`. Why: `controller_gates.py:87`.
13. `.claude/rules/gates.md` (two lines): decoy gate and audit paths with `felhom.eu/`.
14. `CLAUDE.md` Commands table: the same command fix as 10.
15. `CLAUDE.md`: „Protected stacks (traefik, cloudflared, felhom-controller)" → „…, and always samba". Why:
`internal/config/config.go` `alwaysProtectedStacks`.
16. `CLAUDE.md` design pointer `architecture/01/02/03-*.md` → `architecture/NN-*.md` (01–03; 07, 09, 10).
17. `.claude/rules/unprompted-work.md`: as 5.
app-catalog-felhom.eu ## Part D — R-518
18. `CLAUDE.md`: „each holding exactly `docker-compose.yml` + `.felhom.yml`" → without „exactly", plus `steps/<StepKey>.yml`
for a superseded ladder step. Why: 20 templates have `steps/`.
19. „Only the two template files sync" → „Only the template files sync".
20. „60 checks in 10 groups" → 61. Why: `NEW-APP-CHECKLIST.md` row-count table.
21. „runs all four gates … scopes the two gates that accept scoping" → every gate in `GATES` (fourteen); scopes every gate
that accepts an app scope (eight). Why: `catalog_gates.py:88-131`.
22. „CI was rejected for now … R-161 stays open at reduced scope" → CI exists and re-runs `--fast`; R-161 closed 2026-10-05.
23. „`--fast` … is gate 1 and the engine-major gate … the other two" → every gate except image-resolvable and
volume-persistence.
24. The paragraph „There is no gate for this yet and that is a known gap" removed. Why: `check-catalog-since.py` is a
registered gate (R-452, closed); the same section already names it.
25. „The four MariaDB services (…)" → the five (grimmory added), noting the gate judges by glob; „The eleven PostgreSQL
services" → twelve, postgis and immich's image counted. Why: `templates/*/docker-compose.yml`.
26. Decoy gate and audit paths with `felhom.eu/`; `.claude/rules/unprompted-work.md` as 5.
Sweep notes not acted on: word-for-word repeated paragraphs (R-421 in three CLAUDE.md files; „Presence is not success" in **Measured first, read-only:** demo-felhom's night off-site job (2026-10-06): started 06:21:08, `snapshotted` 06:21:10,
the controller's `backup-paths.md`) — repetition, not a wrong fact. its one app running at 06:21:18. demo-hp had no successful off-site run in 10 days. A new off-site run from 9202 was not
possible (it would write to ep0). **Built** (helper, then corrected by me): one window per tier, resume at that tier's
`snapshotted`, the next tier in a later cycle; the button makes the LOCAL copy only. **My correction:** the helper let the
button back up the off-site tier when the local storage is absent; the ruling says local only, so it now backs up
nothing and stops nothing (red: `D/red-press-no-local-backs-up-nothing.txt`); an agent that flags no tier primary keeps
the old first tier (the breaker test's fake agent showed that case). Red: `D/red-first-tier-resume.txt` (restarts
sampled at each poll `[0 0 0 0]`), `D/red-manual-local-only.txt`. Page text, hu + en: about 1–1.5 minutes — an estimate
from measured parts, not a measured press. **Not shown live** (see the Part table).
## Part B — R-890 ## Part E — R-717
**Built** (catalog `6b4877d`): `box_admin_seed_allowed(w, app)` allows the admin seed on a box walk only when all five Controller (`5b86569`): `after_setup` `open_command` / `open_success`; the window marks `opening` on disk first; a failed
hold — not the bench venue; `FELHOM_BOX_ADMIN_SEED=1`; the walk targets demo-hp guest 9202 (never 9201, a demo box's open closes again and the page says so; the close runs at the window's end, at every start and after a successful
household-shaped guest); THIS run installed the app (`box_walk.DEPLOYED_THIS_RUN`, set on the deploy's 202); the box's update; a failed close retries every 2 min. Six red-proofs in `E/`. Catalog (`a5a5b51`, pushed AFTER the controller
`controller.yaml` names the drill catalog. The invite runs inside the box: the token is read from the container's reached the three boxes): wishlist closes/opens `system_config.enableSignup` (group `global`) with Node's own sqlite
environment into a shell variable and handed to curl on stdin; the admin cookie is in a 0600 file that is shredded module, `min_controller: "0.301.0"`. **Live on 9202** (the 0.301.0 test image, `E/live.txt`): after setup `false`, a
(vaultwarden marks it Secure, so it is sent by hand over the container's plain-http address); only HTTP codes come back. stranger straight at the app 401 "invite only", users 1; window `true`, a family member 200, users 2; window end 13:47:34Z,
**The Tester 1 box is allowed by the ruling, but the walk has no route to it** (`box_walk.py` drives demo-hp guests close 13:47:44Z, `false`, a stranger 401, users 2. **Opengist:** no sqlite tool, no script runtime, and its CLI has only
only) — written in the code, not built. Tests `BoxAdminSeedGuard` (6); **red-proof:** a guard returning `(True, "")` `create-user`, `reset-password`, `toggle-admin` — not doable with this mechanism.
fails three tests (`test_each_condition_alone_refuses`, `test_a_household_shaped_box_is_never_seeded`, and the bench's
`test_the_box_walk_never_signs_in_as_admin`).
**Proven:** ## Part F — R-762
- Bench LXC 9401 (harness v5, 600 s memory watch): verdict `proven`; seed read back before and after; healthy in 30.9 s;
anon peak 16.3 % (cgroup 22.3 %); 0 kills, 0 restarts; no file changed.
- Box 9202 (drill catalog): self-registration 400; the in-box admin sign-in and invite → (200, session yes, 200);
invited registration 200; seed read back; guarded Update backing-up → pulling → copying → verifying → done in 12.3 s;
seed read back; badge „Frissítés elérhető — 80 napja" → „Naprakész"; removed through the product.
- `upgrade-test.py --write-ladder` from both verdicts → `vaultwarden/server:1.37.4-alpine`, `catalog_since` 2026-10-06,
the first ladder entry (catalog `ecb8552`); `check-image-resolvable.py vaultwarden` OK.
- **Who gets it:** no box reports vaultwarden today (hub DB copy with its WAL: last vaultwarden telemetry 2026-09-18,
demo-hp; control: the latest telemetry row of any app 13:51 today; the copy shredded). Read directly: demo-hp 9201 and
demo-felhom 9201 run no vaultwarden container.
## Part C Upstream's production compose read first (its `nginx` serves `/static/` and `/media/` from the shared volumes;
`prod.env` sets `DJANGO_DEBUG=False`). Here traefik sends only those two paths to a `wger-files` nginx
(`nginx:1.30.5-alpine`, 32 MB, stock config, volumes read-only) — every box gate wraps every router, so it is gated
like wger. The bench tool could not express a step that adds a service, so I added `--move-to` and
`--write-ladder --to-definition` (catalog `c48a0db`, red-proved). **Bench:** proven, wger anon peak 50.3 %, wger-files
15.9 %, the page's hashed CSS 200 from wger-files and 404 straight at wger. **9202:** the guarded Update done in 59.4 s,
the seed read back, a photo posted before the step 404 → 200 / 178 B / image/png after, CSS 404 → 200, wger-files
7.6 MiB. **Said plainly:** my box script crashed after the step when it decoded the PNG as text; the after-checks were
re-read binary-safe and the box verdict was written by hand from them (it says so). **Ready to show?** Files and sign-up
yes; it still runs Django's `runserver` (upstream's gunicorn runs 3 workers, which do not fit 384 MB) — not ready. Cost:
283 MB of collected static files in a named volume, in every wger backup (the checks refuse an unnamed volume).
- **R-644 closed:** no gokapi on 9202 (no container, no volume; control: the six running containers are listed). ## Release and delivery
- **R-763 closed** (fix from 2026-10-05, proven now): wger installed fresh on 9202; its own process reads
`ALLOW_REGISTRATION False`, `ALLOW_GUEST_USERS False`; straight at the app, a stranger's sign-up GET and a CSRF-valid
POST both redirect to the features page (control: the same CSRF token passes on the login form, 200); three anonymous
dashboard visits → login; users 1 before and after (2 → 4 before the fix).
- **R-764 closed** (proven now): mail off → healthy, 0 restarts, console backend; mail on (the toggle's injection) →
settings load, smtp backend, port 2526, TLS off. Not measured: a real reset mail (9202 has no app-mail).
- **R-762 stopped:** still 404 on wger 2.7; the image has no whitenoise and runs Django's `runserver`, so it needs a
second container for `/static` and `/media` — medium. Note added to the row.
- **R-717 stopped — needs a design:** the controller's `after_setup` command form runs only when the lock is set; the
household's 15-minute window cannot reopen a database switch. Note added to the row.
## Said plainly Controller **v0.301.0** (`0b1b8d3`, image `sha256:0e80f6af…`), MinAgent 0.131.0. Golden **0.301.0**
(`GOLDEN_SHA256=96e94fed…`, Docker pinned to the approved set, registry round trip equal, token grep 0 with a working
control). Hub: vouched agent 0.149.0 / golden 0.301.0 / min_agent 0.131.0; floors 0.301.0 for demo-hp, demo-felhom,
tester-1 — first saved without a declared MinAgent (allowed: floor = golden), then re-saved with 0.131.0. demo-hp and
demo-felhom run 0.301.0 (healthy); tester-1's hub page "Controller elindult (0.301.0)". Global floor and Tester 2 not
touched. No agent release.
- **A merge conflict was committed into the DRILL catalog** (vaultwarden's `.felhom.yml`, by a `commit -am` after a ## Instruction-file edits (decision 150)
failed merge). Found at once by its conflict markers and fixed in the next drill commit; the drill was then reset to
live. The live catalog was never touched by it. - `.claude/rules/unprompted-work.md`, all five copies, line 8–9: before „…in `felhom.eu`, `felhom-controller` and
- My first wger user-count command had a quoting bug (it printed a Python NameError); the reads were repeated through a `app-catalog-felhom.eu` `.claude/rules/`, and in the workspace root's unversioned `.claude/rules/`; change all four or
file. The stranger checks were not affected. none." → after: names `felhom-agent` too, „change all five or none". Why: decision 152 added the agent's copy.
- `felhom-agent/.claude/rules/unprompted-work.md`: new file (decision 152), identical to the other copies.
## Fixed without a row
- `OPEN-ITEMS.md` section headings: every count was stale (e.g. „Install & onboarding — 11 rows" over 5); recomputed.
## CI, last commit of every repo ## CI, last commit of every repo
catalog `ecb8552` → 1433 success (and `6b4877d` → 1430 success); agent `3e8ebeb` → 1431 success; controller `3124278` controller `0b1b8d3` → 1439 success; catalog `cf1ed43` → 1438 success (`a5a5b51` checked after its push); agent
→ 1432 success; felhom.eu `a29ee9dd` → 1434 (checked before the next push), and this commit (checked after the push). `de812bc` (checked after its push); felhom.eu `8db4425` → 1440 (checked), and this commit (checked after the push).
## Teardown ## Teardown
Machine: 9202 back on the live catalog (`controller.yaml` restored byte-identical), vaultwarden and wger removed through Machine: 9202 back on the live catalog (`controller.yaml` byte-identical), on the released 0.301.0 (was 0.299.0), every
the product (no container, no volume), the same six containers as at the start. Bench 9401: 0 containers, `.env` gone, test app removed through the product (no volume left), the test images removed by name, the same six containers as at
stopped. Drill: reset to live (`ecb8552` = `ecb8552`). Host: nothing else. Hub: nothing changed (one read-only DB copy, the start. Bench 9401 stopped. Drill VM: build guest destroyed, files shredded, off, `virgin`. Drill catalog = live.
shredded). Scratch secrets shredded at the end. Host: nothing else. Hub: the vouch and three floors; two read-only DB copies, deleted.
+21 -3
View File
@@ -2,8 +2,26 @@
**Ready for the first real tester (Tester-2): yes. Tester 2 (a laptop) is off; nothing was sent to it.** **Ready for the first real tester (Tester-2): yes. Tester 2 (a laptop) is off; nothing was sent to it.**
**Updated 2026-10-06 14:15: every box of ours healthy on hub 0.139.0, agent 0.149.0, controller 0.300.0. The open-items **Updated 2026-10-06 16:30: demo-hp, demo-felhom and Tester 1 run controller 0.301.0 (hub 0.139.0, agent 0.149.0).
list is at 137. Report: `REPORT.md`.** The open-items list is at 137. Report: `REPORT.md`.**
## Evening (2026-10-06): the designs built; the list at 137
- **Safer restores:** measured first — restoring a copy after an app update brings back exactly the old database (docmost
and romm). Two rarer restore paths now load the database before the app starts.
- **Shorter backup stop:** each backup copy now gets its own short stop, and the button makes the local copy only; the
off-site copy follows at night. **Not yet seen live** — the first night run on the demo boxes is the proof.
- **Family sign-up window:** wishlist's own sign-up now closes after setup and opens for the 15-minute window (proven
live). Opengist cannot do this yet.
- **wger** shows its styles and photos now (proven). It stays hidden: it still runs a development web server.
- **Out-of-memory alarm: not built.** Today's Docker reports the memory kills correctly, so the design's reason was
gone. Your choice below.
**Needs you (none urgent):**
1. **R-528** — build the memory-kill alarm anyway? (A) No: keep watching for a box where Docker misses a kill (my pick).
(B) Yes, as insurance (about 1.6 s of work every 5 minutes on a full box). If nothing: nothing is built.
2. **R-892** — where does the Tester 1 box run, and may CC reach it by SSH? Then the update test can run there too. If
nothing: the update test stays on the scratch box only.
## Afternoon (2026-10-06): your two answers built; the list at 137 ## Afternoon (2026-10-06): your two answers built; the list at 137
@@ -17,7 +35,7 @@ list is at 137. Report: `REPORT.md`.**
- **wger's two fixes are proven** on the scratch box: a stranger cannot sign up, visits make no guest accounts, and mail - **wger's two fixes are proven** on the scratch box: a stranger cannot sign up, visits make no guest accounts, and mail
works when switched on. wger stays hidden: it still shows no styles or photos. works when switched on. wger stays hidden: it still shows no styles or photos.
**Needs you (none urgent):** **Needs you (none urgent):** *(answered 2026-10-06 14:24 and done)*
1. **R-469** — the catalog's database-version check cannot be removed any more: it is now how decision 35's per-app 1. **R-469** — the catalog's database-version check cannot be removed any more: it is now how decision 35's per-app
proof is enforced. (A) close the row and keep the check (my pick), or (B) keep the row open. If nothing: the row proof is enforced. (A) close the row and keep the check (my pick), or (B) keep the row open. If nothing: the row
stays open; the check works either way. stays open; the check works either way.
@@ -0,0 +1,27 @@
26: repo_url: https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git
3
RESTORED-IDENTICAL
gitea.dooplex.hu/admin/felhom-controller:0.301.0
gitea.dooplex.hu/admin/felhom-controller:0.301.0 sha256:03b7f7b6293bd004b928a4fc991d9aa02cb3902ed2ef13aad81071ecfdd8538d
felhom-controller Up 25 seconds (healthy)
filebrowser Up 7 hours (healthy)
paperless-webserver Up 14 hours (healthy)
paperless-postgres Up 14 hours (healthy)
paperless-redis Up 14 hours (healthy)
traefik Up 30 hours
0
removed ghcr.io/thomiceli/opengist:1.15
kept-or-absent ghcr.io/cmintey/wishlist:v0.67.1
kept-or-absent wger/server:2.7
kept-or-absent nginx:1.30.5-alpine
kept-or-absent docmost/docmost:0.95.0
kept-or-absent docmost/docmost:0.96.0
kept-or-absent rommapp/romm:5.0.0
kept-or-absent rommapp/romm:5.3.0
kept-or-absent mariadb:11.4
kept-or-absent postgres:16-alpine
kept-or-absent vaultwarden/server:1.36.0-alpine
kept-or-absent vaultwarden/server:1.37.4-alpine
kept-or-absent sha256:8f31d56f2d56cac3456080b3146624cf62e64e3f6952f6fae03fda946511a3f0
/dev/loop0 32G 1.3G 29G 5% /
@@ -0,0 +1 @@
drill=a5a5b51 live=a5a5b51
@@ -0,0 +1 @@
2026-10-06T14:07:25Z demo-hp + demo-felhom felhom-controller:0.301.0 (healthy, docker ps on each guest 9201); tester-1 hub page 'Controller elindult (0.301.0)'; Tester 2 not touched
+9
View File
@@ -26,6 +26,15 @@
--- ---
## 2026-10-06 (evening) — the design build
The full text of every row below: `git show 8db4425d98:documentation/backlog/OPEN-ITEMS.md`.
| Row | What | Closed | Evidence |
|---|---|---|---|
| **R-469** | **[P3-LOW] REMOVE THE ENGINE-MAJOR RULE when Slice 4 (R-448) ships — a tracked act, not a lapse.** (P3) | CLOSED 2026-10-06 — BY OPERATOR RULING (`09` §3 decision 151, option A) | The engine-major gate stays as decision 35's permanent per-app check; nothing is removed. Re-read and narrowed 2026-10-06 (afternoon): R-463 closed, the gate enforces decision 35 (a PostgreSQL major passes only with a two-venue ladder entry carrying engine_conversion). |
| **R-638** | **[P2-MEDIUM] The product's database loader cannot replay a copy over a NEWER schema: on PostgreSQL it FAILS, on MariaDB it leaves the newer version's tables behind.** (P2) | CLOSED 2026-10-06 — MEASURED SAFE ON THE MAIN PATHS + SIDE PATHS FIXED BY ORDER (`09` §3 decision 154, option A alone; option B kept as a note) | Slice 0 on 9202 (controller 0.299.0): docmost 0.95.0 -> 0.96.0 migrated 42 -> 48 tables, the household's restore of the pre-update copy put back exactly the copy's 42 (6 new gone), `Imported DB dump` logged, data read back; romm 5.0.0 -> 5.3.0, 27 -> 39, back to exactly 27 (views counted). Controller v0.301.0 (delivered to demo-hp, demo-felhom, tester-1): RestoreApp starts only the DB services, replays, then the app; a failed volume leg skips the replay (fallback and unit restore); TestR638_* 7 tests, red-proved — `audits/design-build-2026-10-06/B/`. Option B (a loader that rebuilds) stays a note: R-893 (the off-site rollback's reverse direction, not fixable by order) carries it. |
## 2026-10-06 (afternoon) — wger's two fixes proven on 9202 ## 2026-10-06 (afternoon) — wger's two fixes proven on 9202
The full text of every row below: `git show a29ee9dd33:documentation/backlog/OPEN-ITEMS.md`. The full text of every row below: `git show a29ee9dd33:documentation/backlog/OPEN-ITEMS.md`.
File diff suppressed because one or more lines are too long