Skip to content

finding: the PM dispatch-gates self-test step's cost note in lint.yml still describes a 61-case self-test — it is 803 cases now, and that note is half the argument for the step being unconditional #12831

Description

@claude

The PM dispatch-gates self-test step in .github/workflows/lint.yml ends its justification with a cost note:

Reads two files and walks packages/; ~0.3s.

That estimate describes the self-test as it was when the step landed: 61 cases at the time, per the step's own comment two paragraphs above. The self-test is now 803 cases, and the part that grew is exactly the part the estimate denies:

  • it is no longer "two files" — the live-tree cases call discoverFamilies(), which reads every workflow file (28) and then opens each discovered gate's own script source to extract its watch hints (176 families);
  • it is no longer "walks packages/" — several cases build real temporary git repositories and drive changedPathsFromGit against them, and one now sweeps the tracked sources.

Why this is not just tidiness

The cost note is load-bearing in that comment, not decoration. The paragraph it closes is the argument for the step being unconditional — no if:, no label read, no paths filter — and "it is cheap" is half of that argument. A number two-plus orders of magnitude off is the kind of stale premise that gets a step made conditional by someone who trusts it, or gets a genuinely expensive addition waved through because the note says the step is free.

What is and is not measured here

⚠️Deliberately no runner number is asserted. Local wall-clock for this step in the agent container reads ~60s, but #12528 (closed) already settled that readings taken there are of a contended box and are not the cost on a CI runner — so quoting one would repeat the defect that card names. The claim here rests on the step's content instead, which needs no timer: a self-test of 803 cases that opens 176 gate scripts and builds temporary git repositories is not "two files, ~0.3s", whatever the runner clocks.

The honest repair is either a re-measured note taken from a real CI run of that step, or dropping the number and keeping the qualitative half.

Re-check

grep -n "Reads two files and walks packages/" .github/workflows/lint.yml
node scripts/pm/dispatch-gates.mjs --self-test | tail -1 # the live case count
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack | grep "check famil"

⚠️ Instrument note for whoever picks this up: the second command's wall-clock in the agent container is a contended reading (#12528). Take the timing from a CI run of the step, or do not take one.

Duplicate check

Searched this round. The bare REST search endpoint is not reachable from this session (sessions are bound to their configured repositories), so the sweep was one targeted MCP search_issues call, with the result set itself acting as the positive control: it returned 34 issues including this file's own history (#8162, #8478, #11404, #12500). Nearest neighbours: #12528 (closed) and #10260 (closed) on contended timing readings — both are about how to measure, not about this stale note; #12500 (open) is a dispatch-gates over-naming defect, a different subject. ⛔ No open card covers this. ⚠️ Not exhaustively deduped outside domain:devx.

Where it was noticed

While extending that self-test with the class-level in-tree fixture-root guard for #12749 — which itself adds a tracked-source sweep to the same step, widening the gap rather than closing it. ⛔ Left out of that PR deliberately: a different defect class from the card, so it is filed rather than folded in.


Generated by Claude Code

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions