diff --git a/Makefile b/Makefile index 4ab7814..8eb0f83 100644 --- a/Makefile +++ b/Makefile @@ -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 diff --git a/gates.toml b/gates.toml index fc1784b..931c6b1 100644 --- a/gates.toml +++ b/gates.toml @@ -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 diff --git a/tools/loop-lint.py b/tools/loop-lint.py index fe348db..126a6ca 100644 --- a/tools/loop-lint.py +++ b/tools/loop-lint.py @@ -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