A gate set's dispatch asks its preflight first, and a broken one stops it (#613, record 0170)

Merged
DO
11h ago
+1236-84

Issue #613, "The gate pools k dispatches on one commit and reads all of them", PR 2 of 2: the preflight. It follows the Builder's ruling of 2026-11-08 (points 1 to 5, and two additions). It follows #642 (PR 1, the pooled gate, record 0169), now on main.

Dormant like PR 1. It acts only on a gate set, and none is named yet. A development set's dispatch is unchanged.

What changes

  • Which cases.
    • A gate set's manifest (eval-set/1) names preflight: three to five case ids of evals/pr-review, each once. The Maintainer picks them.
    • No other set names any. OWN gains preflight.
  • None a gate set's, held mechanically (the Builder's addition).
    • held refuses a preflight id that is one of the set's own cases.
    • preflight_of refuses any preflight case that a gate set under evals/ names, by its id or its hash (eval_set_overlaps_a_gate_set). It runs at the plan and again at every step after it, so a development set changed after the plan is eval_set_changed.
    • A development set that is a gate set, or of another Role or Intent, or an id it does not name, is eval_set_unreadable.
    • tools/check_examples.py holds a live gate set to the same rule.
  • When.
    • plan keeps the preflight.
    • fetch reads its cases first, into the scratch's own preflight/ folder. Their heads go in the shared heads folder by id, which the overlap rule keeps apart from the gate cases' ids.
    • run asks them first, within the same budget.
    • There is no new step: .github/workflows/eval.yml is unchanged.
  • What stops a dispatch (preflight_stops).
    • It stops if a preflight case has a code of ENGINE_FAULTS or RUN_FAULTS, or none of them passed. Each of the set's cases is then unanswered, and is never asked.
    • One case the reviewer missed, beside others it passed, stops nothing.
  • What it reports.
    • eval-aggregate/1 gains preflight: {cases, passed, faults}, counts alone, apart from the set's counts, usage and pool.
    • eval-ledger/1 gains a preflight list, with each case's Result and its fetch cause.
  • How the gate reads it.
    • aggregate_verdict holds the block to the manifest's count (count_differs otherwise). A report whose preflight should have stopped the dispatch is preflight_failed, whatever came after.
    • The pool reads preflight_failed as eval_dispatch_faulted.
    • The judge's line says the preflight's counts and codes.
  • Record 0170.
    • Its rows say that five preflight cases make a false stop negligible: about 0.008%, against 0.3% at three, for a reviewer that passes 85%. That is the Builder's addition.
    • Three residuals: a fault after the preflight, the preflight's share of the time, and a gate set no longer under evals/.
  • Rules. harness/eval/AGENTS.md gains two rows, and the cut skill gains a line about preflight_failed.

Two departures from the design note:

  • Preflight heads share the heads folder by id rather than sitting under a preflight/ folder, since a gate case may be named preflight.
  • eval.yml's header is not edited, because .github is protected. The module docstring says it instead.

Checks

CheckResult
SIM_SEEDS=40 make verifyOK, 1713 tests (at 285a8f6c, main 5ddcda45 merged, records 0169 and 0170)
Filtered mutants: the 33 new ones, the 11 brought up to date, every one on the eval schemas and tools/check_examples.py, and every one whose test this change touches181 of 183 killed. Both survivors were fixed in 6fbe8f75: one killed by a new test, one dropped with the redundant code it mutated. The 5 mutants that fix touched: 5 of 5 killed
gitleaksNo leaks
Argon (3360282e), 16 parts1 minor, fixed: a development set of another Role is tested
Claude review (3360282e)No blocking bug. Medium, fixed: two mutants survived, one now killed by a test of a gate set sharing a preflight id under another hash, one dropped with the redundant [found] +. Low, fixed: a preflight case's fetch cause reaches the ledger, and the record says "a case not fetched"
Claude security (3360282e)Nothing to fix. Low, now a residual in the record: the overlap is held against the gate sets under evals/ at the commit, as held_out already is. Info, fixed: the same fetch cause
MuseNot run (quota); owed after 2026-11-09
AstraNot run (quota); owed after 2026-11-09

šŸ¤– Generated with Claude Code