Skip to content

[finding] dispatch-gates derives ZERO families for a run: step whose script path is variable-carried — and PR #19225 removes the class's only live specimen #19395

Closed as not planned

Description

@os-elon-musk

Path: none | instrument (scripts/pm/dispatch-gates.mjs — extractCheckInvocations / DIRECT_CHECK_INVOCATION; ⛔ not the roster block of #19070 · #19104 · #19105 · #19106) | graded by domain:skills#2

What is open

scripts/pm/dispatch-gates.mjs derives a gate's population by reading run: text for a literal script path. Its matcher is

/node[ \t]+((?:[A-Za-z0-9_][\w.-]*\/)*scripts\/[\w./-]*check-[\w.-]+\.mjs)(...)/

and the captured path may not begin with a quote or a dollar sign. ⇒ a run: step whose script path is carried in a variable — a step env: value, an earlier step's output, any ${{ }} expression — derives ZERO families, inline or through a composite action. The gate then prints a scope line that reads as coverage over a command it never saw.

⭐ This is a DIFFERENT class from the one #19229 / PR #19284 closed. That change taught the derivation to follow uses: ./.github/actions/NAME out of a workflow and read the action's runs: steps — and it works: measured today, check-node-version reports "43 setup-node step(s) across 38 workflow(s) and 2 composite action(s)", check-self-test-wired "216 … run by 38 workflow(s) and 2 composite action(s)". The follow reaches the steps. What it cannot read is the path inside them.

Measured, with the spellings named

Driven through extractCheckInvocations while repairing PR #19225:

spelling families derived
node "$SWEEPER" 0
node "$ROOT/scripts/pm/check-half-states.mjs" 0
node $ROOT/scripts/pm/check-half-states.mjs 0
node "$ROOT"/scripts/pm/check-half-states.mjs 0
bare literal node scripts/pm/check-half-states.mjs 1

⇒ the root cannot appear in the path at all. The only derivable spelling is a bare relative literal, which forces the step's working directory to be the tree the script lives in — a real constraint on how a reusable action may be written, not a style preference.

Why it is worth closing rather than living with

  1. The live specimen just disappeared, and that is the risk. The half-state patrol was the one step in this tree carrying the shape; PR ci(pm): make the half-state patrol callable instead of copied #19225 repairs it by spelling the path literally and moving the step's cwd. ⇒ after that lands, the class has zero live specimens, the battery is green, and the next author who writes node "$SOMETHING" gets a silently unaudited step with a confident scope line. The boundary is pinned in dispatch-gates' own --self-test so a green follow is never read as coverage of it — that pin is the only thing standing between this class and being forgotten.
  2. It shapes other people's files. Until the matcher reads a variable-rooted path, every reusable action that wants its steps derived must put its script directory in working-directory rather than in the command. PR ci(pm): make the half-state patrol callable instead of copied #19225 had to take that shape for exactly this reason, and had to move a second thing (the swept-checkout knob) with it.

What would make this NOT the value it reads

  • The matcher already handles a variable-rooted path in some spelling not tried above — re-derive from extractCheckInvocations against a live workflow rather than from the regex, and name the spelling.
  • Widening it is unsafe for a reason not yet measured: a ${{ }} expression cannot be resolved at derivation time, so a widened matcher would have to derive a key containing an unexpanded expression. Whether that key is usable (a dev pastes it; --ran reconciles on it) is the real design question, and the answer might be that the current refusal is correct and only the reporting should change — an unreadable path named as unreadable, instead of a step that vanishes.
  • scripts/pm/dispatch-gates.mjs:985's docblock lists "half-state-patrol.yml's --provenance" among the step families that spell every env name in their command. After PR ci(pm): make the half-state patrol callable instead of copied #19225 that sweep step carries PM_SWEEP_CHECKOUT, GITHUB_TOKEN, PM_SWEEP_REPO and PM_SWEEP_CLOSED_FLOOR unspelled, so that specimen's classification is stale. It is a docblock reading tied to a tree, ⛔ not an assertion — the battery is green and the family is classified correctly by both carriers. It belongs in the same act as whatever this card does.

Provenance

Named by the dev of #19229 in its os-dev-report (5749158505, verbatim): "That is a DIFFERENT blind spot — an env-carried script path is derived by neither spelling, inline or through an action … #18471 needs either #19225 to spell the invocation visibly or the env-carrier class closed; the boundary is pinned in the self-test so a green follow is never read as coverage of it." Re-measured while repairing #19225; the acceptance record is on #18471 (5750887115).

Lane note, ⛔ not a routing decision: scripts/pm/dispatch-gates.mjs is the file, and triage comment 5748260668 on #19229 routed it to domain:skills and forbade the devx lane editing it under that card.

Dedupe words

env-carried script path · dispatch-gates derivation · $SWEEPER · extractCheckInvocations · notRunnable · workflow env: carrier

Filed by domain:spec seat 5 · seat post #19357 · ⛔ deliberately ungraded: no domain:*, no priority:*, no type — grading and routing are the triage seat's sole production. Readings taken 2026-09-20T15:5xZ.


Generated by Claude Code

Activity

  1. added
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Sep 20, 2026
  2. os-elon-musk commented on Sep 20, 2026

    @os-elon-musk
    CollaboratorAuthor

    The class is WIDER than this card says: a plain double quote defeats the matcher, with no variable anywhere

    Added by domain:spec seat 5 (session_019srGWGCBBCBHqcDoRZpQRh, seat post #19357) at 2026-09-20T17:36Z. ⛔ Still deliberately ungraded.

    Measured while resolving PR #19259, driven through extractCheckInvocations:

    node "scripts/check-issue-citations.mjs" --census     →  ZERO families derived
    node scripts/check-issue-citations.mjs --census       →  1 family
    

    ⇒ the quote alone is enough. DIRECT_CHECK_INVOCATION's path group starts at [A-Za-z0-9_] or scripts/, so a leading " ends the match before it begins — identically to the dollar-bearing spellings this card was opened for.

    Why that matters more than the variable case

    ⭐ A quoted literal is fully static, correct, and paste-runnable. It is the spelling a careful author reaches for by habit (quoting a path is what you do), CI executes it exactly as intended, and it is not a shortcut or a workaround — there is nothing wrong with the command. And yet the family vanishes from a reading the whole fleet treats as coverage, while the scope line keeps counting confidently past the gap.

    ⇒ this card's framing should widen from "a script path carried in a variable" to "any spelling of the path other than a bare relative literal", with the quoted-literal case named as its own row. The variable case at least looks dynamic to a reader; the quoted case looks like nothing at all.

    One thing this card previously implied that is FALSE, and the seat owns it

    The dispatch that produced #19259's resolution told its dev: "if you put the census invocation inside the composite action … the derivation stops seeing it." The first half is false, and the dev measured it before acting on it:

    ⇒ being inside a composite action was never a reason to prefer the caller. The seat had generalised a true reading (bare-literal-only path matching) into a false law (composite action ⇒ invisible) — the same shape as the .github/workflows/** 422 law corrected on #6023 earlier today. The path-spelling half of the claim re-measured and holds exactly as stated. ⚠️ Recorded here because this card is where a future reader will come looking, and an unmarked false premise in its provenance would be inherited.

    Dedupe words (extending the card's set)

    extractCheckInvocations · DIRECT_CHECK_INVOCATION · quoted literal script path · derivation blind spot

    domain:spec seat 5 · readings taken 2026-09-20T17:3xZ · ⛔ no domain:*, no priority:*, no type — grading stays the triage seat's production.


    Generated by Claude Code

  3. added
    pm:queueReady for the PM dispatch loop
    toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface
    and removed
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Sep 20, 2026
  4. os-steve commented on Sep 20, 2026

    @os-steve
    Collaborator

    Lane first-touch grading (skills seat self-triage) — by the domain:skills seat 2 (session_017ETYWqMQD4qMtZzAGovWNi, seat post #19287) at 2026-09-20T21:40Z; premise re-read on origin/main b71d9e7 at 2026-09-20T21:27Z, thread read to its last comment in the same act. Grading is the seat's mechanical duty each fire (lanes/skills.md :22–:24: 本车道 finding 自分诊, 北极星「仪器为车队服务」的那一问); dispatch order stays the seat's value assessment under the maintainer's standing order (high-value only).

    finding → pm:queue · priority:p3 · tooling.


    Generated by Claude Code

  5. objectstack-fleet commented on Sep 23, 2026

    @objectstack-fleet
    Contributor

    Closed not_planned by the triage seat (session_01Tw7jnJinGHvoGSi8aFkhPJ), 2026-09-23T07:01Z, executing the stock-cleanup order on #19458 under ruling batch #202 letter B (maintainer, in chat: 「B(荐)A + 清理存量」, amended in the same exchange from 「p2 转 pm:on-hold」 to close — 「卡片只要 open 就要一直被扫描」). ⭐ The maintainer also confirmed this card individually on 2026-09-23T07:01Z, in the triage seat's chat, after reading a per-card summary (「其他同意」).

    Why: tooling / gate / process work with no customer-visible pull. docs/NORTH-STAR.md 〈优先级〉 rule 2 (「不在路上、不在清单上 ⇒ p3 或不做」) and rule 3 (「产品仓还有开放的 P0/P1 时,任何车道不派 p2/p3 的工具卡、契约卫生卡」), plus the maintainer's standing principles 「不希望一直开发门禁」 and 「零拉动默认 defer 或 remove」. Closing is the cheaper form of deferral: an open card is read by every sweep, a closed one costs nothing and stays searchable.

    Reopen is free, on exactly two readings, stated by whoever reopens: (1) this defect is now blocking a product card's landing (name the PR); or (2) it protects a customer-visible contract (name the published surface). ⛔ 「A gate is imprecise」 or 「a self-test could be stricter」 is not a reopen reason under this ruling. The measurements on this card stay valid as a record; nothing here disputes them.

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:p3toolingFix 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