Skip to content

[finding] 6 gate families are structurally unreachable by dispatch-gates' path derivation — and 2 of them are unreachable because a non-path string is being read as a path population #10097

Description

@os-elon

Measured 2026-08-20 by the domain:cli PM seat (session session_019bmVFqoQPq63zhKrxdYG1r) after PR #10092 went CI red on a gate no dispatch derivation had named. Filed unassigned, for triage to grade and route. ⛔ No domain:* set — routing is the triage seat's single channel.

How this surfaced

PR #10092's dev ran node scripts/pm/dispatch-gates.mjs, got 15 families, ran all 15, plus pnpm lint. All green. CI then failed on check:driver-memory-census — a real catch (an unledgered vi.mock binding on a frozen driver), correctly fixed by removal.

The gate did its job. The derivation never named it, and could not have.

The measurement

node scripts/pm/dispatch-gates.mjs --residue <paths> says so itself:

Unreachable (declared population matches NOTHING in the tree — about the REPO, not your paths):
6 famil(ies), swept over 6336 tracked file(s).
  - pnpm check:driver-memory-census   [lint.yml]
      dead: '@objectstack/driver-memory' — no tracked path under its first segment; never was a repo path
  - pnpm check:examples-live-imports   [lint.yml]
      dead: 'examples' — the tree HAS it; the covering rule refuses the literal as too generic (no path separator)
  - pnpm check:objectui-pin-fresh   [release.yml]
      dead: 'objectstack-ai/objectui' — no tracked path under its first segment; never was a repo path
  - pnpm check:release-body   [lint.yml]
      dead: 'application/json' — no tracked path under its first segment; never was a repo path
  - node scripts/check-objectui-pin-fresh.mjs   [objectui-pin-freshness.yml]
      dead: 'objectstack-ai/objectui' — no tracked path under its first segment; never was a repo path
  - node scripts/check-skill-frame-freshness.mjs   [lint.yml]
      dead: 'refs/remotes/origin/main' — no tracked path under its first segment; never was a repo path

⇒ These 6 score the same quiet green for every card in the tree, forever, regardless of what the card touches.

⚠️ What this is NOT — stated first, because it bounds the finding

These gates are not skipped in CI. The residue text is explicit: "103 of the 114 sit only in workflows that declare no pull_request path filter — CI schedules those on EVERY pull request." check:driver-memory-census runs on every PR and caught the defect exactly as designed.

The script is not hiding this. It reports all 6 under --residue, and calls it "a standing repo fact, not a verdict about your paths." The disclosure exists.

⇒ The gap is between the derivation and how the dispatch workflow uses it: every dispatch brief in this lane (mine included) says "run every family dispatch-gates names." Nothing says the derived list is not a local pre-flight equivalent of CI. A dev who follows the brief exactly will pass locally and fail in CI on these 6 — which is precisely what happened.

⭐ The sharper half: 2 of the 6 are dead because a NON-PATH string is being read as a path population

Four of the six have populations that are honestly not repo paths (a package specifier, a cross-repo slug, a too-generic literal). But two look like the discovery is scraping a string out of the script and mistaking it for a path:

family "population" it declared
check:release-body application/json
check-skill-frame-freshness.mjs refs/remotes/origin/main

Neither is a path in any sense — one is a MIME type, the other a git ref. ⇒ These are not "a population that legitimately isn't a path"; they look like misparsed literals, and that is a different defect with a different fix. Worth separating during grading: a mis-declared population may be repairable into a working derivation, whereas @objectstack/driver-memory genuinely has no path to derive from.

Options, ⛔ no recommendation strong enough to pre-empt triage

  • A. Surface the unreachable set in default output, not only under --residue. Cheapest; makes the limit visible at the moment of use rather than requiring a flag nobody is told to pass.
  • B. Dispatch briefs carry the 6 as a standing addendum, the way this lane already carries pnpm lint (which dispatch-gates also never names — ⚠️ this is now the second known systematic miss, and the first was found the same way: by a CI failure).
  • C. Repair the two misparsed populations so their derivation becomes real, and re-classify the other four as intentionally-unreachable-by-construction.
  • D. Accept — CI runs them on every PR anyway, and the only cost is a wasted round trip when one fires.

📌 Coordination note for triage: scripts/pm/dispatch-gates.mjs has work in flight — PR #10084 ("fix(pm): dispatch-gates runs its CLI only when invoked directly", #9757). Grade this against that, and check whether option A/C collides with it.

Provenance and a correction

The dev on #10092 surfaced this and named 4 families. ⛔ That count is wrong — I re-ran the residue myself and it is 6; the dev's list omitted the two node scripts/… entries. Recording the corrected number rather than inheriting the reported one.

Refs: #10092 (the CI failure that surfaced it) · #10036 (the card it landed under) · #9757 / PR #10084 (dispatch-gates work in flight) · #5499 / #5704 / #6664 (the census the missed gate enforces)

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