diff --git a/CLAUDE.md b/CLAUDE.md index 51db2bb..18bbbac 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -122,7 +122,10 @@ deployed `app.yaml` (customer secrets) is never overwritten. Full deploy details `catalog_since`. Two gates: `check-test-record.py` (static — every ladder well-formed and its newest step IS the compose; runs in CI too) and `check-test-record-move.py` (history + the registry for MOVED refs only — a move must add a proven entry whose digests the registry still serves; the hook). The 21 moves - of 2026-09-22 carry backfilled entries citing their records (`ladder_backfill.py`, one-off). + of 2026-09-22 carry backfilled entries citing their records (`ladder_backfill.py`, one-off). **Every entry but the + newest carries its own compose at `templates//steps/.yml`** (2026-09-24, `09` §6.4 part + 5): the box pins that file, one step per press. The writer keeps the superseded step's definition — fixes + included — and `check-test-record.py` rule 4 refuses a step with no file or a file naming other images. - **Taking an app out of circulation — use `lifecycle:`, never a directory move.** `.felhom.yml` gains an optional `lifecycle:` field: `available` (default; absent/empty means this), `hidden` (not offered for new installs, no explanation owed), `abandoned` (upstream stopped developing it — diff --git a/CONTEXT.md b/CONTEXT.md index fd58c09..ae57c75 100644 --- a/CONTEXT.md +++ b/CONTEXT.md @@ -2,6 +2,12 @@ > Created with the REUSE.md rollout (2026-07-03). History: `CHANGELOG.md`; format spec: `README.md`. +- **2026-09-24 (morning) — STEP DEFINITIONS (`5ed599c`).** Every ladder entry but the newest has its own compose at + `templates//steps/.yml` (sha256 of `to`, canonical JSON, 16 hex = controller + `stacks.StepKey`); gate rule 4 + decoys; the writer keeps the superseded step; 8 backfilled + (`steps_backfill.py`, one-off, from the NEWEST commit naming the step's images). Controller v0.268.0 reads them: + one press = one step (proven live, romm two steps). R-653/R-656 fixed in the bench; the two suites that typed + live pins now read them (R-663). Open: R-652, R-655, R-664 (a step has no `.felhom.yml` of its own). - **2026-09-24 (night 2026-09-23) — THE TEST RECORD.** An `image:` move needs a proven `update_ladder:` entry (`scripts/ladder.py`; gates `check-test-record.py` + `check-test-record-move.py`; the only writer `upgrade-test.py --write-ladder`). 21 older moves backfilled; 12 steps published tonight. Harness v3: box fixtures diff --git a/REPORT.md b/REPORT.md index 5a2f187..bfafabb 100644 --- a/REPORT.md +++ b/REPORT.md @@ -1,22 +1,15 @@ -# REPORT — the test record, and 12 steps published with it (night shift 2026-09-23) +# REPORT — step definitions for the ladder, two bench fixes (2026-09-24, `5ed599c`) -`09-update-architecture.md` §3 decisions 13, 21–23; §6.4 part 4 and the catalog half of part 6. Night record: -`felhom.eu/documentation/audits/DRILL-night-2026-09-23.md`. +Full record: `felhom.eu/documentation/audits/ladder-2026-09-24/README.md`. -## Not done, or changed -- adventurelog v0.13.0 NOT moved (R-655): our frontend healthcheck override names `/nodejs/bin/node`, gone in - v0.13.0; with it dropped, the backend's start-time `download-countries` crash-looped on a cut-short download. -- gitea inconclusive (installer, R-624). Step files `steps/.yml` (part 5) not written. -- `check-image-resolvable.py` does not keep digests; `image_digest.py` was written for that. - -## What shipped -- Gates + format + writer + backfill: `6db08a5` (CI 920). R-612 wishlist 512M, R-613 uptime-kuma - `UPTIME_KUMA_DB_TYPE=sqlite`: `a5a729a`. Harness fixes: `1263773`, nextcloud fixture wait. -- Published with records: romm 5.3.1 (`7ff4e68`) and mariadb 11.8 (`431cdec`), ghost 6.65.0 (`e6afab9`), - wishlist v0.67.1 + opengist 1.15 (`657c83f`), navidrome 0.64.1 (`76cc1f5`), komga 1.27.1 + 768M (`fc1becc`), - n8n 2.41.1 (`04b63db`), emby 4.11.0.3 (`8d573ad`), kimai mariadb 11.8 (`376b2c3`), immich-ML v3.2.2 - (`b82b7c6`), nextcloud 34.0.4 (`5d49a11`, files_may_change). - -## Gates -`catalog_gates.py --fast` OK on every push (the move gate judged each move on the registry); decoys 80 OK; -`test_ladder_writer.py` OK; `test_catalog_gates.py` OK (its table test had been stale since two gates ago). +- Baseline `585a7cba22cf` → **`5ed599c`**. No `image:` line moved. +- `ladder.step_key` / `step_file`; `check-test-record.py` rule 4 (+ 4 decoy cases: no file, right name wrong image, + wrong name, genuine); `upgrade-test.py --write-ladder` keeps the superseded step's compose; `steps_backfill.py` + wrote 8 step files (emby, ghost, immich, n8n, navidrome, nextcloud, romm ×2 — romm's first from `f4eb94f`). +- R-653 `load_verdict`, R-656 `clear_scratch_folders` + `test_upgrade_bench.py` (5 tests). +- R-663: `test_gate_decoys.py` and `test_ladder_writer.py` were red at the start (last night's pin moves under + literals); they now read the live pins. +- Red-proofs: rule 4 removed → 3 decoys pass wrongly; writer's STEP block off → "has no definition"; bench mutations → + 3 failures. Green: `catalog_gates.py` OK, decoys 84 OK, writer 6 OK, bench 5 OK. +- Live: the box (controller v0.268.0) climbed romm's two steps from these files on 9202. **Not run:** a bench edge + with the R-653/R-656 changes (no bench this session).