# catalog_gates.py grimmory - 2026-10-02T07:29:41Z, after the R-801 port fix, bench LXC 9401 on demo-hp (debian-13, swap 0, nvme-scratch), catalog-wt de0a9bd + uncommitted working tree (17 path(s), REFRESHED copy with R-788 APP_EXERCISE + R-801 routed_ports, copied with its .git), sibling felhom.eu 68c2290 (git archive) at ../felhom.eu
# sibling copy ALSO carries tar copies of DooPlex UNCOMMITTED documentation/audits/family-gate-2026-10-02/ and documentation/audits/licences-2026-10-02/; in the bench sibling B/catalog-gates-grimmory.txt = copy of catalog-gates-grimmory-run1.txt and B/catalog-gates-metube.txt = copy of catalog-gates-metube-run2.txt so the onboarding citations resolve
# the previous output of this file is kept as catalog-gates-grimmory-run1.txt
 M CHANGELOG.md
 M CONTEXT.md
 M FIRST-ADMIN.md
 M README.md
 M REUSE.md
 M scripts/box_walk.py
 M scripts/catalog_gates.py
 M scripts/check-volume-persistence.py
 M scripts/copy_freeze/hu.json
 M scripts/test_check_volume_persistence.py
 M scripts/test_gate_decoys.py
 M scripts/upgrade_fixtures_box.py
?? onboarding/grimmory.md
?? onboarding/metube.md
?? scripts/check-family-gate.py
?? templates/grimmory/
?? templates/metube/
catalog_gates — apps: grimmory

==============================================================================
== gate: image-pins   (check-image-pins.py)
==============================================================================
image-pin gate OK — 58 templates, 0 unpinned images

==============================================================================
== gate: image-resolvable   (check-image-resolvable.py grimmory)
==============================================================================
resolving 2 unique image pin(s)…
image-resolvability gate OK — 2 unique pins, all resolve

==============================================================================
== gate: volume-persistence   (check-volume-persistence.py grimmory)
==============================================================================
self-testing the prober (both directions)…
  prober flags the R-156 signature and clears a correct template — trustworthy
grimmory             CLEAN         grimmory: this container's mounts are all empty while it created entries in ['/', '/app', '/etc'] — benign when a sibling container holds the state, w

1 clean · 0 broken · 0 undetermined (of 1 in scope)
volume-persistence gate OK

==============================================================================
== gate: engine-major   (check-engine-major.py)
==============================================================================
engine-major gate — range origin/main..HEAD: 0 compose file(s) changed, 0 engine pin(s) compared
engine-major gate OK — no forbidden engine major, and no engine major bundled with another image move (rule: CLAUDE.md, amended by R-469 2026-09-21)

==============================================================================
== gate: catalog-since   (check-catalog-since.py)
==============================================================================
catalog-since gate — range origin/main..HEAD: 0 compose file(s) changed, 0 image move(s) dated
catalog-since gate OK — every image move in the range carries a catalog_since on or after its commit day

==============================================================================
== gate: copy-i18n   (check-copy-i18n.py grimmory)
==============================================================================
copy-i18n: matcher controls OK (positive „Jelentkezz be…" convicts, negative „Encrypted notes…" does not)
copy-i18n: retrieval-promise vocabulary matches the sibling clone
copy-i18n: 58 apps · 1155 Hungarian copy strings frozen · 1154 with English
copy-i18n: translated so far — actualbudget 15/15, adventurelog 18/18, audiobookshelf 21/21, bentopdf 14/14, bookstack 21/21, calcom 22/22, calibre-web 27/27, claper 20/20, code-server 20/20, crafty-controller 24/24, dawarich 21/21, docmost 19/19, emby 22/22, ghost 16/16, gitea 17/17, glance 15/15, gokapi 19/19, grafana 19/19, gramps-web 17/17, grimmory 24/24, home-assistant 18/18, homebox 17/17, homepage 15/15, immich 24/24, jellyfin 22/22, karakeep 19/19, kimai 20/20, komga 21/21, mealie 19/19, metube 19/19, n8n 17/17, navidrome 21/21, nextcloud 28/28, onlyoffice 24/24, opengist 16/16, outline 21/21, paperless-ngx 33/33, papra 14/15, plant-it 16/16, plex 25/25, privatebin 14/14, radarr 22/22, radicale 19/19, rallly 17/17, recipe-importer 19/19, romm 41/41, seerr 18/18, sonarr 22/22, sparkyfitness 21/21, tandoor 18/18, termix 12/12, uptime-kuma 16/16, vaultwarden 23/23, vikunja 18/18, wanderer 20/20, wger 20/20, wishlist 16/16, zipline 18/18
copy-i18n: OK

==============================================================================
== gate: probe-matches-compose   (check-probe-matches-compose.py grimmory)
==============================================================================
probe-matches-compose: 1 app(s), mode: full

probe-matches-compose: OK — every probe dials the port (and, where it can fail, the path) that the app's own compose healthcheck dials

==============================================================================
== gate: probe-measured   (check-probe-measured.py grimmory)
==============================================================================
probe-measured: OK — 1 probes, each with a measured before/after

==============================================================================
== gate: test-record   (check-test-record.py grimmory)
==============================================================================
test-record gate — 1 template(s) read, 1 carry a ladder, 0 convicted

==============================================================================
== gate: test-record-move   (check-test-record-move.py)
==============================================================================
test-record-move gate — range origin/main..HEAD: 0 compose file(s) changed

==============================================================================
== gate: onboarding   (check-onboarding.py)
==============================================================================
onboarding gate — 61 checklist ids; 58 template dirs: 53 exempt (published before 2026-10-01), 5 new; 2 exempt app(s) with a record (shape-checked): sparkyfitness, wger
onboarding gate OK

==============================================================================
== gate: family-gate   (check-family-gate.py)
==============================================================================
family-gate: newest baked golden 0.287.0 >= 0.287.0
family-gate gate OK: 2 family-gated template(s) ['grimmory', 'metube']

==============================================================================
== summary
==============================================================================
  image-pins           OK            (exit 0)
  image-resolvable     OK            (exit 0)
  volume-persistence   OK            (exit 0)
  engine-major         OK            (exit 0)
  catalog-since        OK            (exit 0)
  copy-i18n            OK            (exit 0)
  probe-matches-compose OK            (exit 0)
  probe-measured       OK            (exit 0)
  test-record          OK            (exit 0)
  test-record-move     OK            (exit 0)
  onboarding           OK            (exit 0)
  family-gate          OK            (exit 0)

all catalog gates OK
catalog_gates exit code = 0
# leftover containers: 0
