The panels gate did not run; every gate now declares a cadence
Some checks failed
ci / check (push) Failing after 3s

CB-REV-0002 #7 found the H1 harnesses were run by no gate. The fix created
a `panels` target and registered it — and did not add it to `make all`. So
the gate existed, passed lint, and ran nowhere: the same defect one level
up, committed in the fix for it.

The registry checked that a gate's target EXISTS. It never checked that
the gate RUNS, and six of ten registered gates are absent from `make all`.
Some are legitimately manual — cost-budget needs spend data, gate-review
is periodic. So a gate may be manual, but it must SAY so: every entry now
declares cadence = all | manual | none, loop-lint requires it, and a gate
claiming "all" that is not in `all:` fails. Both rules mutation-verified.

panels is cadence = all and now runs there, so the figures in CB-EV-0030
and CB-EV-0031 are regenerated by the gate rather than by hand.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
tegwick 2026-08-08 09:55:41 +02:00
parent da58e78e4a
commit 43e93126e0
3 changed files with 34 additions and 1 deletions

View file

@ -303,6 +303,29 @@ def check_gate_registry(root=REPO):
out.append(Finding(
"gates", "gates.toml",
f"entry names target {target!r}, which the Makefile lacks"))
# CB-REV-0002 #7, generalised. The registry checked that a gate's
# target EXISTS; it never checked that the gate RUNS. `panels` was
# added to close "the harness is run by no gate" and passed lint while
# running nowhere -- the same defect, one level up.
#
# A gate may legitimately be manual. It must SAY so, and one that says
# it runs in `make all` must be there.
for g in gates:
target = g.get("target")
if not target:
continue
cadence = g.get("cadence")
if cadence not in ("all", "manual", "none"):
out.append(Finding(
"gates", "gates.toml",
f"{target!r} declares no cadence — say whether `make all` runs "
f"it, or a gate can exist without ever running"))
elif cadence == "all" and target not in deps:
out.append(Finding(
"gates", "gates.toml",
f"{target!r} declares cadence=\"all\" and `make all` does not "
f"run it — a gate that does not run is not a gate"))
return out