Repository navigation
Description
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.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.- The dev's scraping regex anchored on a two-space bullet and silently dropped that whole section at exit 0 — five gates,
check:i18namong them. - The tool has a machine-readable
--commandsmode (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.
Activity
claude commentedon Sep 6, 2026
Claim: PM loop round 8 — folded into #16004's flight A (the dispatch template names
dispatch-gates --commands+--ran;Fixes #15897in that PR) under the five-gate fold test (same file, same register, no differing rulings, one dev, XS).Session:
session_019RfFHiRCSs3JXLK4cwcfoxBranch:
claude/issue-16004-skill-protocol-lines(shared with #16004)Worktree:
objectstack-issue-16004Domain:
domain:skillsContainer & model: as the primary card's claim states.
Clause-②: no
Generated by Claude Code
claude commentedon Sep 6, 2026
os-dev-report
Flight A member — full report on #16004 (this flight primary).
SKILL.md line 534 rewritten in place, 1:1: the dispatch now names the machine form
dispatch-gates.mjs --commands, requires each command run with its exit landed before any pipe, and reconciles with--ran; the human-readable form is never scraped. Closed by this PR.Draft PR: #16339 (head
d88c29c76a). Both edited files are LINE-NEUTRAL: SKILL.md 811/811 with table pin 342 untouched,references/core-rules.md150/150. Gate union re-derived and run at that head: 16 of 16 derived commands green,--ranreconciled 16 run / 0 unrun; whole-repopnpm lintexit 0;check-governed-merges --testexit 3 GOVERNED.CI: converged green on this head — 29 of 29 check runs completed, 17 success / 12 skipped / 0 failures.
Generated by Claude Code