Skip to content

[finding] dispatch-gates --ran has an explained bucket for CI-measured and pending families but not for the value-bearing class, so a recorded one reads as extra #15115

Description

@claude

Recording only, no severity asserted — routing and ranking are triage's. Found while implementing #15083 on branch claude/issue-15083-value-bearing-argv (PR #15114); adjacent to that card's diff but a different seam, so deliberately not repaired there.

Measured

runReconciliation in scripts/pm/dispatch-gates.mjs classifies a command a dev RECORDED that is not in the derived runnable set. It has three outcomes, and two of them are "explained, not a mistake":

if (ciOnlyCommands.has(entry.command)) { explainedCiOnly.push(entry.command); continue; }
if (pendingCommands.has(entry.command)) { explainedPending.push(entry.command); continue; }
extra.push(entry.command);

Those two buckets exist because a CI-measured family and a pending-changeset family are both derived and both deliberately absent from --commands, so a dev naming one is not naming something unknown. PR #15114 adds a third family class with exactly that property — an invocation whose argv takes a value from the workflow, kept out of --commands because that list promises runnable — and it has no explained bucket. A recorded command matching one lands in extra.

Why it is small, and why it is not nothing

Small: extra is diagnostic only. recon.ok reads unrun.length === 0, so nothing here can turn a verdict red or green, and the realistic dev never records a command they cannot run.

Not nothing: this file's own stated rule is that an omission is disclosed where the omission happens, and this seam is the one place the third omission is not named. The near-miss diagnostic beside it (trimmed !== entry.command) exists precisely so a recorded command that ALMOST matches a derived one is explained rather than dumped in extra — the same courtesy this class is owed. The likeliest real trigger is a dev who records the BARE spelling of one of these scripts out of habit; today they get extra with no reason attached, where a labelled bucket would tell them the invocation is one CI never makes.

Shape of the repair, not a design

Symmetric with the two buckets already there: a notRunnableCommands set (notRunnableCommandSet already exists and is exported, added by PR #15114) passed alongside ciOnlyCommands, an explainedNotRunnable array, and one rendered line beside the Classified by this tool, no explanation owed line. It is a handful of lines and it re-decides nothing about how families are keyed.

Boundary

⛔ Not a claim on PR #15114 and not a defect that PR introduced — that PR added the third class and left this seam symmetric-minus-one, which is the state being recorded. Everything above was read at e98bfc87.


Generated by Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions