42bf40bd2c
gates / gates (push) Successful in 29s
- Twelve steps published on both venues (catalog): first ladders for calibre-web, gitea, wger, crafty-controller, uptime-kuma, zipline (two steps); within-major emby, ghost, home-assistant, outline, rallly. immich's step v3.0.3 -> v3.2.2 re-proven at 768M (Part D). - Part C: the night leg skips a digest-only change AND the catalog never records a same-tag re-test, so a same-name upstream fix reaches no box. Row R-740; the decision in STATUS; `09` decision 30 carries a dated note (the decision itself unchanged). - Rows: 369 -> 377. Opened R-735..R-742; closed R-735, R-738, R-742; narrowed R-462, R-624, R-446, R-440, R-734, R-732. The currency audit gains §1b (and corrects its 31+1 to 30+2). Evidence: documentation/audits/more-night-apps-2026-09-30/. Report: REPORT-more-night-apps-2026-09-30.md. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
73 lines
7.4 KiB
Markdown
73 lines
7.4 KiB
Markdown
# More apps that update themselves — 2026-09-30 (evening, by day)
|
||
|
||
Brief: the operator's day brief of 2026-09-30 evening (Parts A–D). Architecture read first:
|
||
`architecture/09-update-architecture.md` §3 decisions 6, 13, 14, 17, 22, 30, §6.4 parts 4–7, §6.5.
|
||
Baselines (live Gitea, 16:49 CEST): controller `d48da6c` (0.283.1), agent `d766666` (0.138.0), felhom.eu
|
||
`2866f6a`, catalog `4c552cf`.
|
||
|
||
**Venues.** Bench = LXC 9401 on demo-hp, made fresh at 16:52 (6 cores, 10 GiB, **swap 0** — the stricter
|
||
venue, R-733), harness v4, 10-minute memory watch (`bench/B1-bench-create.txt`). Box = scratch guest 9202
|
||
(controller 0.283.1, swap 512 MiB) pointed at the drill catalog (`box/B0`, `box/B1`), the product's guarded
|
||
Update. The drill force-push was refused once by the permission check and then allowed by the operator.
|
||
|
||
## The Part table
|
||
|
||
| Part | done / not done / changed | why |
|
||
|---|---|---|
|
||
| **A1 calibre-web** | **done** — v4.0.6 → v4.0.8, first ladder `53a4a1d` | front door = the Upload button (HTTP form), read back through OPDS + the served EPUB. The ingest folder was NOT used (it would be a file planted in a mount). `files_may_change`: the library DB `metadata.db` (+`-shm`, `-wal`) in the books folder; the book file did not change |
|
||
| **A2 gitea** | **done** — 1.27.0 → 1.27.3, first ladder `d7ba60c` | the installer-form POST (no CSRF on that form), through the setup gate on the box. 28.0.0 not touched |
|
||
| **B1 emby, ghost, home-assistant** | **done** — `3e4aa77`, `9a78e3b`, `15f4d59` | each had a newer tag inside its line (re-checked) |
|
||
| **B2 uptime-kuma, wger, crafty-controller** | **done** — `35dd5cf`, `4ad32aa` (+ fix `7a4ff48`), `e1f0179` | new fixtures; wger needed a template fix first (R-738) |
|
||
| **B2 wanderer** | **not done** | the bench cannot run it at all: its web server calls the DB at a public https name (R-739). The meilisearch question is NOT measured |
|
||
| **B3 time left** | **done** — outline `b0b2514`, rallly `8d3a35a`, zipline 4.6.1 → 4.7.0 `a9700e2` → 4.8.0 `fb87030` | zipline 4.8.0 refuses a database that skipped 4.7.x (R-742); the box undid the direct jump itself |
|
||
| **C the same-name fix gap** | **done** — row R-740, STATUS decision, `09` decision 30 dated note | measured from source, a unit walk, the registry and demo-hp; **nothing built** |
|
||
| **D immich's older step** | **done (changed)** — re-proven at 768M, step files rewritten `48440ce` | the brief's route needed a writer mode that did not exist → `upgrade-test.py --restep` `63a96b0`, with tests |
|
||
|
||
**Night-updatable apps (the audit's method (a)): 30 + 2 conditional at the start → 35 + 3 conditional** (38 carry a proven step; 15 have no ladder).
|
||
|
||
## Per app
|
||
|
||
| app | step | bench (harness v4, swap 0, 10-min watch) | anon peak (cgroup peak) | abort | box 9202 (guarded Update) | marks | catalog |
|
||
|---|---|---|---|---|---|---|---|
|
||
| calibre-web | v4.0.6 → v4.0.8 | proven, read back before/after True/True, kills 0 | calibre-web 19.3 % (38.9 %) | starts-and-serves | done in 64.6 s, read back True | files_may_change | `53a4a1d` |
|
||
| gitea | 1.27.0 → 1.27.3 | proven, read back before/after True/True, kills 0 | gitea 26.6 % (52.9 %) | refuses | done in 21.6 s, read back True | — | `d7ba60c` |
|
||
| emby | 4.11.0.3 → 4.11.0.4 | proven, read back before/after True/True, kills 0 | emby 4.7 % (7.3 %) | starts-and-serves | done in 23.6 s, read back True | — | `3e4aa77` |
|
||
| ghost | 6.65.0-alpine → 6.67.0-alpine | proven, read back before/after True/True, kills 0 | ghost 26.7 % (33.9 %) | starts-and-serves | done in 107.7 s, read back True | — | `9a78e3b` |
|
||
| home-assistant | 2026.9.3 → 2026.9.4 | proven, read back before/after True/True, kills 0 | home-assistant 32.0 % (47.4 %) | starts-and-serves | done in 113.8 s, read back True | — | `15f4d59` |
|
||
| uptime-kuma | 2.4.0 → 2.5.5 | proven, read back before/after True/True, kills 0 | uptime-kuma 43.3 % (49.7 %) | starts-and-serves | done in 33.9 s, read back True | — | `35dd5cf` |
|
||
| wger | 2.6 → 2.7 | proven, read back before/after True/True, kills 0 | wger 49.8 % (78.6 %) | starts-data-gone | done in 46.2 s, read back True | — | `4ad32aa (+ fix 7a4ff48)` |
|
||
| crafty-controller | 4.10.7 → 4.11.0 | proven, read back before/after True/True, kills 0 | crafty-controller 2.7 % (8.0 %) | starts-and-serves | done in 51.3 s, read back True | — | `e1f0179` |
|
||
| outline | 1.9.1 → 1.10.1 | proven, read back before/after True/True, kills 0 | outline 33.5 % (37.7 %), outline-postgres 5.4 % (62.1 %), outline-redis 2.6 % (7.1 %) | starts-and-serves | done in 89.2 s, read back True | — | `b0b2514` |
|
||
| rallly | 4.11.1 → 4.15.3 | proven, read back before/after True/True, kills 0 | rallly 60.6 % (64.0 %), rallly-postgres 2.1 % (65.8 %) | starts-data-gone | done in 64.7 s, read back True | — | `8d3a35a` |
|
||
| zipline | 4.6.1 → 4.7.0 | proven, first try (after the fixture was fixed; see the direct jump below) | zipline 41.7 % | starts-and-serves | done in 103.6 s, read back True | — | `a9700e2` |
|
||
| zipline | 4.7.0 → 4.8.0 | proven (third attempt: two FROM pulls failed on the bench's full disk) | zipline 34.3 % | starts-and-serves | done in 32.8 s, read back True | — | `fb87030` |
|
||
| zipline | 4.6.1 → 4.8.0 (direct) | **failed** — 4.8.0 restarts: „cannot safely migrate from prisma to drizzle" | — | starts-and-serves | **undone** by the box in 20 s | — | not written (R-742) |
|
||
| wger | 2.6 → 2.7 WITHOUT the migrations switch | box only | — | — | **done, then login 500** (12 migrations unapplied) | — | not written; fixed `7a4ff48` (R-738) |
|
||
|
||
Files behind `files_may_change`: calibre-web — `media/books/metadata.db`, `metadata.db-shm`, `metadata.db-wal` (the
|
||
library database; the book file unchanged; `A/calibre-names/`). On 9202 the same step changed no file in that folder
|
||
(`box/calibre-web-files-{before,after,diff}.txt`). Memory figures: the anon peak is the basis of `memory_tight`
|
||
(decision 22); the cgroup peak includes the file cache.
|
||
|
||
## Part C — the same-name security fix (R-740)
|
||
|
||
`C/C1` demo-hp 9201 read-only digests (18 of 18 equal) · `C/C2` the unit walk on a scratch copy of the
|
||
controller (the leg skips `no_test_record`; the Update button takes the tested digest; a same-tag re-test
|
||
entry WOULD be pressed by the leg) · `C/C3` the floating lines' last pushes · `C/C4` no ladder has a same-tag
|
||
re-test, and the writer refuses one. The decision is in `STATUS.md`.
|
||
|
||
## Part D — immich's step `0b8272068aab36bf`
|
||
|
||
`D/D1` hub read-only: `/apps` lists 14 apps over the 3 reporting boxes, bookstack on 2 (positive control), **immich on
|
||
none**. `D/D2` the geodata inside each server image: v3.0.3 `2026-07-13`, v3.2.2 `2026-08-30`, v3.2.4 `2026-09-28` — so the
|
||
v3.0.3 → v3.2.2 step re-runs the import. `D/template-immich@0b82-768` = the step file with ONE line changed (512M → 768M)
|
||
and its `.felhom.yml` `mem_limit` 4096M → 4480M. `D/D3` + `D/evidence/D-immich-0b82-768/`: bench, swap 0 — `Starting
|
||
geodata import` 19:19:47, `Geodata import completed` 19:20:04, the database's `oom_kill` 0 from its birth, the album read
|
||
back, 10-min watch 0 kills (anon peak 29.6 %). Written by `upgrade-test.py --restep` (catalog `63a96b0`), commit `48440ce`.
|
||
|
||
## Tools
|
||
|
||
`tools/` — copies of today's walk/bench tools with this folder's paths, plus `benchsync.sh` (catalog scripts +
|
||
templates → bench), `probe_up.sh` (a hand probe), `recheck.py` (upstream tags), `digestread.py` (Part C,
|
||
read-only), `floatpush.py` (Part C), `partd.py` + `q4.sh` (Part D and the late queue).
|