Files
felhom.eu/documentation/audits/more-night-apps-2026-09-30/README.md
T
admin 42bf40bd2c
gates / gates (push) Successful in 29s
More apps update themselves at night (30+2 -> 35+3); the same-name security-fix gap measured (R-740, decision for the operator)
- 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
2026-09-30 20:27:28 +02:00

73 lines
7.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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).