Skip to content

the os-dev dispatch template asks for dispatch-gates in the human-readable form and gets it scraped — a whole gate section can be dropped silently at exit 0 #15897

Closed

Description

@hotlong

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

  1. 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.
  2. .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.
  3. 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

  1. added
    toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface
    domain:skillsDomain lane — seat card indexed by label:pm:seat
    on Sep 5, 2026
  2. claude commented on Sep 6, 2026

    @claude
    Contributor

    Claim: PM loop round 8 — folded into #16004's flight A (the dispatch template names dispatch-gates --commands + --ran; Fixes #15897 in that PR) under the five-gate fold test (same file, same register, no differing rulings, one dev, XS).
    Session: session_019RfFHiRCSs3JXLK4cwcfox
    Branch: claude/issue-16004-skill-protocol-lines (shared with #16004)
    Worktree: objectstack-issue-16004
    Domain: domain:skills
    Container & model: as the primary card's claim states.
    Clause-②: no


    Generated by Claude Code

  3. claude commented on Sep 6, 2026

    @claude
    Contributor

    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.md 150/150. Gate union re-derived and run at that head: 16 of 16 derived commands green, --ran reconciled 16 run / 0 unrun; whole-repo pnpm lint exit 0; check-governed-merges --test exit 3 GOVERNED.
    CI: converged green on this head — 29 of 29 check runs completed, 17 success / 12 skipped / 0 failures.


    Generated by Claude Code

  4. removed
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    on Sep 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    domain:skillsDomain lane — seat card indexed by label:pm:seatpriority:p2Medium: important, M3toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions