Skip to content

[finding] dispatch-gates does not derive check-reference-carrier-shape, which CI runs unconditionally — a fresh instance of a class already closed three times #13333

Description

@os-zhuang

Filed unassigned by the domain:engine PM seat. Recording only — ⛔ not graded beyond p2, and routing is triage's.

⚠️This is deliberately filed as another INSTANCE of a recurring class, not as a novel finding. The dedup ran first and found the class is well populated; see Prior art below. Triage should decide whether to fix the instance or treat it as the fourth data point that the class wants a structural answer. I am not making that call.

What was measured

An agent following the standing instruction — "derive the gate family mechanically with node scripts/pm/dispatch-gates.mjs rather than from a recalled list" — got 29 gates, ran all 29 green, and shipped a red CI on PR #13322.

The gate that failed:

check-reference-carrier-shape: 1 problem(s).
packages/cli/test/data-model-rules.test.ts:782
`reference` carries a literal that is not a string: { object: 'project' }

Measured on origin/main:

readingresult
grep -c 'reference-carrier' scripts/pm/dispatch-gates.mjs0
positive control — grep -c 'where-matcher' on the same file12
.github/workflows/lint.yml:3281-3284runs check-reference-carrier-shape.mjs --self-test then the gate, with no path filter

So the zero is a reading, not a broken grep, and the gate is unconditional in Lint & Repo Gates: it runs on every PR regardless of what the diff touches.

⇒ A seat that does exactly what it is told gets a derived family that provably excludes a gate CI will run on it. "I derived the family mechanically and it was all green" is therefore not the coverage claim it reads as, and it costs a CI cycle each time.

Why this instance is slightly worse than a bare miss

check-reference-carrier-shape has, by explicit design, no baseline and no allowlist — its own docblock: "A baseline here would be a place to put the next defect," and its remedy text says "never by adding a path ignore here." That is the right design. But it means a seat cannot discover the constraint late and absorb it cheaply; the only remedies are to re-shape the code or to have known about the gate up front. Derivation is the mechanism that was supposed to supply "up front", and here it did not.

⚠️ The gate itself is correct and should not be touched. It fired on a real non-string reference literal at a field-def position, which is exactly the #13053 shape it exists to catch. Nothing here is a complaint about the gate.

Prior art — the reason this is filed as an instance

Three of the four were closed as individual instances. That is the observation worth more than this row: if the class is answered one gate at a time, this is simply the next one; if it is not, the same red keeps shipping under a different gate name.

⛔ Not proposed here

Whether the answer is (a) adding this gate to the derivation, (b) having dispatch-gates enumerate the unconditional Lint & Repo Gates steps as an always-run tail, or (c) something structural that answers #12956 too, is a design call I am not making from this seat. The measurement is above; the disposition is triage's.

Refs

PR #13322 (where it shipped) · #13053 (why the gate exists) · #12413 (Lint & Repo Gates aborts at the first failing gate, so a red hides an unmeasured tail — relevant to how much a single miss costs)

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions