Filed unassigned by the dev seat on #9171 (session session_01Y26DJEHSBhhAQ6wwfsHNza), from the trigger-vs-derivation sweep that card asked for. Duplicate-searched by script name and by the discovery function's name first. Not fixed in that PR — different fix surface (discovery, not matching), and #9171 is explicitly bounded to the matching half.
The gap, measured
extractCheckInvocations in scripts/pm/dispatch-gates.mjs discovers a check family from a run: step in exactly two shapes:
pnpm [--filter PKG] [run] check:NAME
node scripts/.../check-NAME.mjs
The second requires the literal check- in the filename. .github/workflows/docs-drift-check.yml runs
- name: Self-test the mapperrun: node scripts/docs-audit/affected-docs.mjs --self-test
affected-docs.mjs carries no check- segment, so no family is discovered for it. Measured on origin/main at the time of filing: of the 25 workflow files the tool reads, docs-drift-check.yml contributes 0 of the 103 discovered families — the step exists, has a verdict, is runnable locally in one second, and appears in neither half of the tool's output for any card. That is the one output shape the script's own header forbids ("a gate the derivation cannot mention at all"), and it is the same class as the block-scalar discovery bug recorded in runCommandTexts, where six families were invisible for the same structural reason.
It is not a marginal path either. The workflow declares
paths:
- 'packages/**'
- 'scripts/docs-audit/**'
- '.github/workflows/docs-drift-check.yml'
so CI schedules it for every card touching packages/, and — after #9171 landed the CI-trigger match key — it is the one paths-filtered workflow whose trigger still buys the derivation nothing, because it has no discovered family to attach the trigger to. A card editing scripts/docs-audit/affected-docs.mjs is the sharpest case: it is editing the very mapper whose self-test CI will run on it.
.github/workflows/scaffold-e2e.yml is a second instance of the same shape (declared paths:, zero discovered families), though its steps are an e2e build rather than a named verification, so whether it belongs in "check families" at all is part of what a disposition has to decide.
What a disposition has to decide
- Widen the discovery regex to a
--self-test-shaped invocation, or to any node scripts/**.mjs step whose command carries a self-test flag. Cheap. The risk is the one the script's header prices repeatedly: a wider net that names steps a dev cannot usefully pre-run turns leads into noise ("22 leads is the same as none"). - Name the discovery contract instead — decide what counts as a family (a step with a verdict a dev can reproduce locally) and derive from that, rather than from a filename convention that the tree happens to follow 103 times and not twice.
- Neither — rule the
check- naming convention normative and make a gate hold workflow steps to it, so a verification step that is not discoverable is a CI failure rather than a silent omission.
⛔ No recommendation from this seat; the sweep measured the gap and stopped there, as #9171 bounded it to.
Not claimed
- ⛔ Nothing shipped broken. No PR is known to have been under-verified through this; the omission was found by sweeping triggers against the derivation, not by an incident.
- ⛔ No census of non-
check- verification steps across the 25 workflows was taken. The two named above are what the trigger sweep surfaced, because it only examined workflows declaring a paths: filter. Unfiltered workflows were not read for this shape at all.
Backlinks: #9171 (the measurement that surfaced it, and the CI-trigger match key that made the remaining gap visible) · #9144 (same blind-spot class on the check:i18n edge).
Generated by Claude Code
Filed unassigned by the dev seat on #9171 (session
session_01Y26DJEHSBhhAQ6wwfsHNza), from the trigger-vs-derivation sweep that card asked for. Duplicate-searched by script name and by the discovery function's name first. Not fixed in that PR — different fix surface (discovery, not matching), and #9171 is explicitly bounded to the matching half.The gap, measured
extractCheckInvocationsinscripts/pm/dispatch-gates.mjsdiscovers a check family from arun:step in exactly two shapes:The second requires the literal
check-in the filename..github/workflows/docs-drift-check.ymlrunsaffected-docs.mjscarries nocheck-segment, so no family is discovered for it. Measured onorigin/mainat the time of filing: of the 25 workflow files the tool reads,docs-drift-check.ymlcontributes 0 of the 103 discovered families — the step exists, has a verdict, is runnable locally in one second, and appears in neither half of the tool's output for any card. That is the one output shape the script's own header forbids ("a gate the derivation cannot mention at all"), and it is the same class as the block-scalar discovery bug recorded inrunCommandTexts, where six families were invisible for the same structural reason.It is not a marginal path either. The workflow declares
so CI schedules it for every card touching
packages/, and — after #9171 landed the CI-trigger match key — it is the one paths-filtered workflow whose trigger still buys the derivation nothing, because it has no discovered family to attach the trigger to. A card editingscripts/docs-audit/affected-docs.mjsis the sharpest case: it is editing the very mapper whose self-test CI will run on it..github/workflows/scaffold-e2e.ymlis a second instance of the same shape (declaredpaths:, zero discovered families), though its steps are an e2e build rather than a named verification, so whether it belongs in "check families" at all is part of what a disposition has to decide.What a disposition has to decide
--self-test-shaped invocation, or to anynode scripts/**.mjsstep whose command carries a self-test flag. Cheap. The risk is the one the script's header prices repeatedly: a wider net that names steps a dev cannot usefully pre-run turns leads into noise ("22 leads is the same as none").check-naming convention normative and make a gate hold workflow steps to it, so a verification step that is not discoverable is a CI failure rather than a silent omission.⛔ No recommendation from this seat; the sweep measured the gap and stopped there, as #9171 bounded it to.
Not claimed
check-verification steps across the 25 workflows was taken. The two named above are what the trigger sweep surfaced, because it only examined workflows declaring apaths:filter. Unfiltered workflows were not read for this shape at all.Backlinks: #9171 (the measurement that surfaced it, and the CI-trigger match key that made the remaining gap visible) · #9144 (same blind-spot class on the
check:i18nedge).Generated by Claude Code