# REPORT — the new-app checklist: in the catalog, a gate, piloted on wger (2026-10-01, evening) Architecture read: `documentation/architecture/09-update-architecture.md` §3 (decisions 13, 22, 37, 42, 45–50, 61) and §6.5. Evidence: `documentation/audits/new-app-checklist-2026-10-01/README.md` (the full write-up). ## The Part table | part | result | changed from the brief, and why | |---|---|---| | A — checklist in the catalog | **done** — `NEW-APP-CHECKLIST.md` 60 rows / 10 groups; `onboarding/_TEMPLATE.md`; CLAUDE.md, REUSE.md §5, README point to it | 7 rows added, 16 sharpened, 9 wrong claims fixed (below). A `since` column per id (B's date rule) | | B — the gate | **done** — `scripts/check-onboarding.py`, gate `onboarding` in `--fast` (hook + CI); 16 decoys, all judged right; 5 gate mutants each turn the suite red | the 53 are exempt **by name**, not "new since commit X": CI fetches at depth 1 and cannot diff (R-452). Evidence in `felhom.eu/` is checked where that repo sits beside the catalog (the hook) and printed as NOT CHECKED where it does not (CI). Rows inside an HTML comment do not count; an empty evidence directory does not count | | C — wger pilot | **done** — both records filled; table below | the restore round trip (2.5) could not be measured: no per-app backup press exists outside an Update (R-648) — open, R-759 | | D — gap page | **done** — `onboarding/EXISTING-APPS-GAPS.md` from `scripts/onboarding_gaps.py` | none | **The date rule (B.1):** each checklist id carries `since`; a record answers every id with `since` ≤ its `opened:`. `opened:` must be on or after 2026-10-01 and not in the future, so a later id binds only apps opened after it. Residual: an author can date `opened:` back to the cut-off to skip ids added since — the gate cannot see that; review can. ## Claims in the draft that were wrong 3.3 "32 apps" (33 today) · 5.2 "romm OOM at +76 s (decision 22)" (no such figure anywhere; R-635) · 5.3 "gate" (no gate; 8 templates differ, R-758) · 6.2 "35 of 53 update at night" (not reproducible; 38 carry a ladder) · 8.3 logo address (`.webp` vs the controller's `.svg`/`.png`, R-761) · 1.6's how could not show R-737 · 1.4's how has nothing to run for an app at its newest tag · 0.4's packet capture is not in our kit · 2.6's R-756 is an unexplained venue case (R-442 added). Duplicates of gates now name the gate (1.1, 2.1, 3.3, 4.2, 6.2, 8.1, 9.4). ## The pilot — the four problems | problem | caught by | the draft's how? | |---|---|---| | R-737 JWT key | 1.6, 3.9 (new), 0.7 | **missed** — web login worked | | R-738 no migration | 1.4, 1.7 (new), 6.1 | **only if an update existed** — not for a new app | | R-752 lock-out → everyone | 3.6 | **caught** | | R-755 dev server | 1.5, 1.7 | **caught** | **And three more, found by the new rows on the LIVE wger template (9202, drill catalog):** R-762 no CSS/JS and no uploaded photo is ever served (404); R-763 a stranger signs up after the setup, and every anonymous dashboard visit creates a guest account; R-764 mail goes to the console. Not fixed: this task changes no template. ## Gap page headline (of 53) Fit 52 · images/DB 53 · storage 38 · accounts 39 · health 49 · resources 24 · updates 26 · mail — (6 mapped) · text 52. ## Rows Opened **R-758** (8 `mem_limit` ≠ sum), **R-759** (wger's open record rows), **R-760** (vikunja healthcheck), **R-761** (logo comment), **R-762** (P2, wger static + media), **R-763** (P2, wger strangers + guests), **R-764** (wger mail). Narrowed: none. Note added to R-755 (same server question as R-762). Closed: none. **Register 392 → 399.** STATUS updated. ## Live work and teardown 9202 only, drill catalog `e9f50b5` (repointed, then restored to live `6d72c09` — three controls each way). wger installed and removed twice through the product. **Machine:** no wger container, volume or image left; sampler files removed. **Host:** nothing. **Hub:** untouched. Secrets never printed; evidence scanned for their values. ## Gates Catalog: `catalog_gates.py --fast` all OK (11 gates); `test_gate_decoys.py` 121 cases OK; `test_catalog_gates.py` OK; `decoy_coverage_gate.py` 0 unaccounted. felhom.eu: `repo_gates.py --fast` — see the commit. No `--no-verify`.