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

@ -299,4 +299,4 @@ loc:
done
## every gate, in order. The one CI would run.
all: check test sim coverage size-metrics runtime-metrics am6 am7 am8 edition-check replay-test dep-weight self-tests env-test facts-check loop-lint bench-test
all: check test sim coverage size-metrics runtime-metrics am6 am7 am8 edition-check replay-test dep-weight self-tests env-test facts-check loop-lint bench-test panels

View file

@ -26,6 +26,7 @@ not_control_gates = [
id = "CB-01/CB-02"
name = "cost budget"
target = "cost-budget"
cadence = "manual"
checks = "spend since the last commit; soft $10, hard $22"
added = "2026-07-30"
review_by = "2026-11-30"
@ -39,6 +40,7 @@ retire_if = "two consecutive passes never approach the soft line, or commits get
id = "SH-1/SH-2"
name = "session-shape budget"
target = "shape-budget"
cadence = "manual"
checks = "mean and p90 context since the last commit (SH-3 retired as a gate, ADR-0008 D1 — still reported as a diagnostic)"
added = "2026-08-01"
review_by = "2026-11-30"
@ -52,6 +54,7 @@ retire_if = "context stops correlating with cost, or the model's context handlin
id = "M-D1-MUT"
name = "mutation coverage of acceptance rows"
target = "mutation-check"
cadence = "manual"
checks = "each acceptance row's assertion must go red for a stated reason when mutated"
added = "2026-07-31"
review_by = "2026-12-31"
@ -71,6 +74,7 @@ retire_if = "a full pass adds rows without finding anything, twice running — t
id = "DFD"
name = "single source of fact"
target = "facts-check"
cadence = "all"
checks = "every tagged number in the docs matches the tool that measures it"
added = "2026-07-31"
review_by = "2026-12-31"
@ -83,6 +87,7 @@ retire_if = "the untagged-literal count reaches zero and stays there, meaning th
id = "AM-1b"
name = "kernel spec->code link"
target = "coverage"
cadence = "all"
checks = "every numbered K-rule is named in the source; binds 2026-08-31"
added = "2026-07-31"
review_by = "2026-08-31"
@ -95,6 +100,7 @@ retire_if = "it stays at 100% through two passes that add kernel rules — at th
id = "META-20"
name = "meta budget"
target = "status"
cadence = "manual"
checks = "share of the trailing 5 passes spent on the loop itself; soft 20%. Purpose (InnerLoop v1.7): most spend on the task at hand, some on control, review and improving the process that carries the work forward"
added = "2026-08-01"
review_by = "2026-11-30"
@ -116,6 +122,7 @@ retire_if = "product and meta stop being separable, or the share sits under the
id = "LOOP-LINT"
name = "executable InnerLoop rules"
target = "loop-lint"
cadence = "all"
checks = "loadability, unmeasured verdicts, tier and chaos declarations, review trails, self-test entry points, and this registry"
added = "2026-07-30"
review_by = "2026-12-31"
@ -130,6 +137,7 @@ retire_if = "two passes run with no finding while artifacts keep growing — tha
id = "CHAOS"
name = "the chaos roll"
target = ""
cadence = "none"
checks = "d8 on each tier declaration, 12-declaration calibration window (window 2, opened 2026-08-03; window 1 ran at d4)"
added = "2026-07-30"
review_by = "2026-11-30"
@ -156,6 +164,7 @@ retire_if = "an override changes nothing twice running (window 2 condition, CB-W
id = "GATE-REVIEW"
name = "this registry"
target = "gate-review"
cadence = "manual"
checks = "gates past their review date, and gates that have caught nothing"
added = "2026-08-01"
review_by = "2026-12-31"
@ -168,6 +177,7 @@ retire_if = "it has retired, tightened, or forced the re-justification of nothin
id = "CB-REV-0002/7"
name = "variant panels"
target = "panels"
cadence = "all"
checks = "the H1 measurement harnesses actually run, and a short cell fails rather than printing a number a reader must notice"
notes = """
Registered because the second adversarial review asked what the harness

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