Files
felhom-controller/REPORT.md
T

4.6 KiB

REPORT — gate enforcement: the -v allowlist, one entry point, a pre-push hook (2026-08-02)

Overwritten per the standing rule. The prior contents (D5, controller v0.188.0, 2026-07-30) have their durable record in CHANGELOG.md; nothing was lost by this overwrite.

No version bump, no image build, no deploy. Nothing compiled changed — this touches controller/scripts/ and .githooks/ only, so no behaviour on any box moved. Stated explicitly so the omission reads as a decision rather than a miss. Controller stays v0.188.0; guest 9201 was not touched.

What changed

Commit What
c432f70 the ALLOWLIST entry, alone in its own reviewed diff
8cb3d7a controller/scripts/controller_gates.py + controller/scripts/test_controller_gates.py + .githooks/pre-push + CLAUDE.md
7c32c74 CHANGELOG.md + controller/README.md

Baseline on arrival: 4115e88f688b, clean, HEAD == origin/main — matched the spec's anchor.

1. docker_run_volume_path_gate.py — one allowlist entry (R-29 leg (a), now CLOSED)

The gate was RED, flagging internal/appexport/estimate.go:179. The finding is benign and was reviewed rather than suppressed: realVolumeSize mounts a named Docker volume read-only into a throwaway alpine to du it from a container view. No host path is involved — the daemon resolves the volume name daemon-side — which makes it structurally identical to the already-allowlisted internal/backup/backup.go entry '"-v", volName+":/vol:ro"'. The entry carries its WHY in the voice of its neighbours.

realVolumeSize was not rewritten: the code is correct, the allowlist was incomplete. The diff is alone in its commit because burying an allowlist widening inside a feature commit is how an allowlist stops meaning anything.

Red-proof: renaming the new entry's suffix to a non-existent file returns the gate to exit 1, naming estimate.go:179; restored → exit 0.

2. controller_gates.py — THE entry point

Runs all seven local gates plus reuse_refs_check on the repo root, streams each gate's own output, exits worst-wins non-zero, and reports exit 2 distinctly as INCONCLUSIVE. --fast selects the gates that touch no network and no container runtime — today all eight. A missing gate script is a FAILURE with the path printed, never a skip.

Why a runner at all: the 2026-08-02 census across the four repos found that every gate a CLAUDE.md names was green, and the ones nobody names were where the red was. This repo had seven gates and CLAUDE.md named two; four more lived behind a line in REUSE.md, and the docker--v gate behind one line in REUSE.md — while red. The canonical shape is app-catalog-felhom.eu/scripts/catalog_gates.py (R-161).

The shared checker is never copied here. reuse_refs_check.py stays in felhom.eu/scripts/ and is invoked at <repo-root>/../felhom.eu/scripts/; a copy would recreate exactly the drift it detects. It now resolves this repo's REUSE map cleanly: 133 cited paths — 126 exact, 6 by suffix, 1 cross-repo (wgsync/reconciler.go, which lives in the hub), 0 failures.

3. .githooks/pre-push

Runs controller_gates.py --fast and refuses the push. It prints a line before and after, because an absent log line is not evidence a hook ran. Its limits are written into the hook itself: per-clone (core.hooksPath is local config; this clone is armed — git config --get core.hooksPath.githooks) and git push --no-verify bypasses it on purpose, which must be stated in a session report when used. It was not used against this repo; both real pushes ran the hook and passed.

4. test_controller_gates.py — a seam test, not a smoke test

Asserts each member gate's own distinctive stdout, never the runner's summary line, which an inert runner prints while calling nothing. Red-proof: replacing run_gate's body with return 0 still prints all controller gates OK and exits 0 — and turns the seam test red. It also pins that reuse_refs_check.py has not been copied into this repo.

Verification

  template-id        OK   (exit 0)      app-row-dedup      OK   (exit 0)
  emoji              OK   (exit 0)      mojibake           OK   (exit 0)
  native-confirm     OK   (exit 0)      docker-v           OK   (exit 0)
  offbox-rename      OK   (exit 0)      reuse-refs         OK   (exit 0)

all controller gates OK

python3 scripts/test_controller_gates.py4 tests, OK (0 before). No Go test count changed; no Go file was touched.

Full cross-repo detail, every red-proof, the core.hooksPath probe measurements and the hub deployment: felhom.eu/REPORT.md.