Every dispatch this PM session issued told devs to run dispatch-gates.mjs in the form CI never uses. That is my template's defect, not any dev's.
The measured miss
On #15784 a dev's CI went red on check:i18n after a local gate run it reported as complete. Its own diagnosis, verified by this seat on origin/main:
dispatch-gates.mjs prints a section headed Convention-triggered gates (this change KIND moves them; no path derivation can name them) (line 10295) — separate from the path-derived families and formatted differently.
- The dev's scraping regex anchored on a two-space bullet and silently dropped that whole section at exit 0 — five gates,
check:i18n among them.
- The tool has a machine-readable
--commands mode (documented at line 12: "one runnable command per line on stdout, nothing else"), which the dev never used.
- ⭐ The tool already warns about exactly this, at line 10286: "a BARE run of any of these scripts is an invocation CI never makes." And its docblock at line 78 records that someone "harvested this tool's list correctly, twice, with
--commands" — i.e. this has gone wrong before and the fix was already written down.
Why it is the PM's
Every dispatch I wrote this session carried some form of:
Run node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack, let it derive its own change set, and report every verdict.
⇒ That instruction asks for human-readable output, which then has to be scraped, and says nothing about --commands. A dev following it exactly can drop a section and be honestly unaware. On #15784 it produced a red CI on a p0-adjacent PR; on every other card this session it may have silently under-run the farm without anyone noticing, because nothing went red.
⛔ Not a dev-quality problem. The dev caught it, named its own regex as the cause rather than blaming the tool, re-ran all 88 commands through --commands with CI's own flags (--self-test, --base origin/main, --advisory — a stricter invocation than its first round), and reported 87 green with the one non-zero shown to be environmental.
Scope
- The dispatch template: instruct
node scripts/pm/dispatch-gates.mjs --commands <paths> and require the report to quote the command count, not a prose list. ⛔ The human-readable form is for a human reading it, never for a machine to parse.
.claude/agents/os-dev.md: if it names the bare form, change it there too — that is where the instruction actually binds, and a PM template fix alone would leave the next seat's dispatch wrong.
- Consider whether the tool should make the wrong path harder — e.g. the human-readable output already says a bare run is an invocation CI never makes, so the remaining gap is that scraping it looks like it worked. A
--commands-only exit for non-TTY stdout would close it mechanically. ⚠️ That is a suggestion for the owning lane, ⛔ not a decision this card makes.
Why it is worth a card rather than a note
The tool's own docblock shows this is a repeat. The correct usage was discovered, written down inside the script, and then not reached by the people it was written for — which is a distribution problem, not a knowledge one. A card in the lane that owns the agent contract is where that gets fixed.
Refs: #15784 / PR #15879 (the red CI and its patch round) · scripts/pm/dispatch-gates.mjs lines 12, 78, 10286, 10295.
Every dispatch this PM session issued told devs to run
dispatch-gates.mjsin the form CI never uses. That is my template's defect, not any dev's.The measured miss
On #15784 a dev's CI went red on
check:i18nafter a local gate run it reported as complete. Its own diagnosis, verified by this seat onorigin/main:dispatch-gates.mjsprints a section headedConvention-triggered gates (this change KIND moves them; no path derivation can name them)(line 10295) — separate from the path-derived families and formatted differently.check:i18namong them.--commandsmode (documented at line 12: "one runnable command per line on stdout, nothing else"), which the dev never used.--commands" — i.e. this has gone wrong before and the fix was already written down.Why it is the PM's
Every dispatch I wrote this session carried some form of:
⇒ That instruction asks for human-readable output, which then has to be scraped, and says nothing about
--commands. A dev following it exactly can drop a section and be honestly unaware. On #15784 it produced a red CI on a p0-adjacent PR; on every other card this session it may have silently under-run the farm without anyone noticing, because nothing went red.⛔ Not a dev-quality problem. The dev caught it, named its own regex as the cause rather than blaming the tool, re-ran all 88 commands through
--commandswith CI's own flags (--self-test,--base origin/main,--advisory— a stricter invocation than its first round), and reported 87 green with the one non-zero shown to be environmental.Scope
node scripts/pm/dispatch-gates.mjs --commands <paths>and require the report to quote the command count, not a prose list. ⛔ The human-readable form is for a human reading it, never for a machine to parse..claude/agents/os-dev.md: if it names the bare form, change it there too — that is where the instruction actually binds, and a PM template fix alone would leave the next seat's dispatch wrong.--commands-only exit for non-TTY stdout would close it mechanically.Why it is worth a card rather than a note
The tool's own docblock shows this is a repeat. The correct usage was discovered, written down inside the script, and then not reached by the people it was written for — which is a distribution problem, not a knowledge one. A card in the lane that owns the agent contract is where that gets fixed.
Refs: #15784 / PR #15879 (the red CI and its patch round) ·
scripts/pm/dispatch-gates.mjslines 12, 78, 10286, 10295.