CHANGELOG + REPORT: paperless-ngx 18, tandoor 17, adventurelog v0.13.0
gates / gates (push) Successful in 2s

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-09-27 12:55:35 +02:00
parent 06ea7da7ba
commit f1a7d6c9fd
2 changed files with 34 additions and 17 deletions
+21
View File
@@ -1,3 +1,24 @@
## paperless-ngx → PostgreSQL 18, tandoor → 17, adventurelog → v0.13.0 (2026-09-27, `09` §3 decisions 41, 42)
Each move ALONE in its commit, written by `upgrade-test.py --write-ladder` from a bench verdict (throwaway LXC 9401,
harness v4, 10-minute memory watch) AND a box verdict (scratch box 9202 through the product's guarded Update, controller
0.275.0-rc1/0.275.0). Evidence: `felhom.eu/documentation/audits/version-travel-2026-09-26/B/`, `…/C/`.
- **paperless-ngx: PostgreSQL 16 → 18** (its upstream compose ships 18 at `/var/lib/postgresql`; decision 42). Bench:
converted in 35.4 s, check equal over 72 tables, seed read back, anon peak 40.0 %. Box: converted in 64.6 s through the
Update, seed read back. Mount → `/var/lib/postgresql`. New box fixture: Django's own `createsuperuser` in
`paperless-webserver` (`upgrade_fixtures_box.py`).
- **tandoor: PostgreSQL 16 → 17** (its upstream ships 16; 17 is the newest major its Django 5.2 documents; no mount
change). Bench: converted in 23.6 s over 100 tables; the app's own memory peaked at 78.7 % (the app, not the engine —
under the 80 % mark). Box: converted in 52.3 s. The superseded 16 step keeps its definition in `steps/`.
- **adventurelog: v0.12.1 → v0.13.0 (R-655, decision 41 — the world-data download stays).** Same commit: the frontend
healthcheck override is dropped (v0.13.0 brings its own; no single node path works on both versions), and a world-data
file that does not parse to its end is renamed aside before start so `download-countries` fetches it again (with an
import pending, the image's own start crash-looped 10× on `IncompleteJSONError`; with the step: set aside, downloaded,
healthy). The update re-uses the file v0.12.1 left ("Latest data already imported"). Box: done in 204 s under the
product's default 5-min wait (under the drill's 90 s wait it was UNDONE — correctly).
- `immich` and the other PostGIS apps: not in this session.
## docmost converts PostgreSQL 16 → 18 (2026-09-25, `09` §3 decisions 35, 37, 39)
The first PostgreSQL major the catalog moves — ALONE in its commit, through `upgrade-test.py --write-ladder`, which
+13 -17
View File
@@ -1,18 +1,14 @@
# REPORT — 2026-09-25 evening: docmost's PostgreSQL 16 → 18, the harness converts, the gate lets one app through
# REPORT — 2026-09-27: paperless-ngx → PostgreSQL 18, tandoor → 17, adventurelog → v0.13.0
- **Harness v4** (`6a4a5f0`, `7036119` dump fix): a PostgreSQL major is converted on the bench the box's way; `render`
and `--write-ladder` move a PostgreSQL 18 data mount to `/var/lib/postgresql`; `--write-ladder` writes
`engine_conversion` only when BOTH venues converted it. `test_pg_conversion.py` (10 checks).
- **`check-engine-major.py`**: a PostgreSQL major passes only with its proven, two-venue, marked ladder entry, alone in
its commit; the postgis family is judged now. Decoys: 1 genuine, 5 refused (no mark, one venue, the mark in a comment,
bundled, postgis) — red-proofed (`felhom.eu/documentation/audits/night-2026-09-26/C/C2-*`).
- **docmost moved** (`afd3a60`): `postgres:16-alpine` → `postgres:18-alpine`, mount moved, `engine_conversion` written by
the harness. Bench (throwaway LXC 9401, destroyed): converted in 11.0 s, check equal over 48 tables, seed read back, 0
kills; negative control C3 → `failed`. Box: 9202 through the product (see the controller REPORT). **docmost's own
limit 384M → 512M** (`09` §3 decision 39): the watch measured 91 % at 384M and 80.4 % at 512M — Node sizes its heap
from the limit (R-693). The Hungarian prerequisite line changed with it; `copy_freeze` updated on purpose (the gate
caught the first push).
- **nextcloud** `after_load: php occ files:scan --all` (`9cc829c`, the Part E helper): a file written after the last
backup is invisible after a load until the rescan (measured).
- **Not moved:** adventurelog v0.13.0 (R-655) — its `SKIP_WORLD_DATA=1` switch and the cached dataset file are now
measured; the move needs a choice between the two options written in the row.
Brief: version-travel (Parts B and C). Architecture read: `09-update-architecture.md` §3 decisions 35–42, §6.4 parts 4, 5, 10.
| app | move | bench (LXC 9401) | box 9202 (guarded Update) | commit |
|---|---|---|---|---|
| paperless-ngx | postgres 16 → 18 (+ mount) | converted 35.4 s, 72 tables equal, seed ✓, anon peak 40.0 % | converted, done 64.6 s, seed ✓ | `46affe0` |
| tandoor | postgres 16 → 17 | converted 23.6 s, 100 tables equal, seed ✓, anon peak 78.7 % (app) | converted, done 52.3 s, seed ✓ | `53b84ca` |
| adventurelog | v0.12.1 → v0.13.0 (+ health + world-data fixes) | healthy 217 s, file reused, seed ✓, anon peak 73.0 % | done 204 s (5-min wait), file reused, seed ✓ | `06ea7da` |
Engine gate on the push range printed `ALLOWED` for both PostgreSQL moves. Catalog gates: all OK. Not moved:
calcom, claper (no headless seed route checked this session), immich and the PostGIS family (out of scope).
Observation: under the drill's 90 s health wait adventurelog v0.13.0 is undone (its backend needs ~3 min at first
start); the product default is 5 min.