Recorded from the #12772 patch rounds (PR #12843), where this exact gap cost one CI round-trip.
scripts/pm/dispatch-gates.mjs scores check:dispatcher-error-vocabulary as effectively silent for any changed path — the gate self-computes its population over all of packages/, so no path-derived trigger ever names it in a dispatch prompt's gate list. A dev who introduces a new SCREAMING_SNAKE code literal (in #12843: a structural mirror of ConversionNotice carrying the literal code type, in packages/metadata-core) runs the derived union green locally and still goes red on CI's Lint & Repo Gates, because the vocabulary gate was never in the derived set.
Mechanizable closure suggested by the dev who hit it: a CONVENTION trigger in dispatch-gates — "the diff introduces a new SCREAMING_SNAKE string-literal type or const that looks like an error/notice code" ⇒ include check:dispatcher-error-vocabulary in the derived list. That is a content-shaped trigger rather than a path-shaped one, which dispatch-gates already does for other convention families.
For grading: the sibling divergence class from the same PR (CI's ~4GB tsc heap ceiling vs the container default making check:type-check-debt --re-measure OOM only on CI) was closed within the claim by running the re-measure under NODE_OPTIONS=--max-old-space-size=4096; whether that belongs in the gate's own harness (so every local run is CI-shaped) is a second, smaller mechanizable item the grader may fold in or split.
Recorded from the #12772 patch rounds (PR #12843), where this exact gap cost one CI round-trip.
scripts/pm/dispatch-gates.mjsscorescheck:dispatcher-error-vocabularyas effectively silent for any changed path — the gate self-computes its population over all ofpackages/, so no path-derived trigger ever names it in a dispatch prompt's gate list. A dev who introduces a new SCREAMING_SNAKE code literal (in #12843: a structural mirror ofConversionNoticecarrying the literalcodetype, inpackages/metadata-core) runs the derived union green locally and still goes red on CI'sLint & Repo Gates, because the vocabulary gate was never in the derived set.Mechanizable closure suggested by the dev who hit it: a CONVENTION trigger in dispatch-gates — "the diff introduces a new
SCREAMING_SNAKEstring-literal type or const that looks like an error/notice code" ⇒ includecheck:dispatcher-error-vocabularyin the derived list. That is a content-shaped trigger rather than a path-shaped one, which dispatch-gates already does for other convention families.For grading: the sibling divergence class from the same PR (CI's ~4GB tsc heap ceiling vs the container default making
check:type-check-debt --re-measureOOM only on CI) was closed within the claim by running the re-measure underNODE_OPTIONS=--max-old-space-size=4096; whether that belongs in the gate's own harness (so every local run is CI-shaped) is a second, smaller mechanizable item the grader may fold in or split.