Skip to content

finding: dispatch-gates never names check:objectql-double-limit for an edited test file — the same whole-corpus shape as its listed sibling check:where-matcher #12322

Description

@yinlianghui

What this is

The companion sweep #11199 asked for and did not measure: "whether any other currently-unlisted gate in lint.yml shares this same 'scans every test file's content' shape and is missing from the same list for the same reason." Measured while working #11199; not fixed there — that card's declared surface is the one entry, and widening other gates' entries is a separate judgement.

Method

For every check family the workflows discover, hint-route coverage was computed over the whole tracked test corpus (coveringKey(entry, path) — the same key derive uses), then intersected with the gates whose own source selects test files into a population (as opposed to excluding them).

Corpus: 2773 tracked *.{test,spec}.* files at 355a742747.

gate in CHANGE_KIND_GATES[0]? hint route over the test corpus
check:query-options-erasure listed 0 / 2773
check:engine-double-contract listed 0 / 2773
check:where-matcher listed 0 / 2773
check:type-check-coverage / -debt listed 91 / 2773 (3.3%)
check:cross-package-test-inputs listed 2760 / 2773 (99.5%, and inherited — see #11199)
check:objectql-double-limit unlisted 0 / 2773
check:parse-guard unlisted 0 / 2773
scripts/check-test-completeness.mjs (ci.yml) unlisted 0 / 2773
check:driver-conformance unlisted 257 / 2773 (9.3%)

The strong instance: check:objectql-double-limit

It is check:where-matcher's twin, and that gate is listed:

  • same walk idiom, in its own source — testFilesUnder(...), else if (/\.test\.ts$/.test(entry)) acc.push(p);
  • same population — every *.test.ts in the tree, judged for a hand-written ObjectQL double
  • same repair posture — a shrink-only per-file baseline (scripts/objectql-double-limit.baseline.json), so a late red is not repaired by a line
  • same CI job — lint.yml's "Lint & Repo Gates"
  • a new fake find() double, or a new test file carrying one, moves it

Its declared population is written down — "…a function bound to a property named find … in packages/**/*.test.ts" — but that sentence lives in a comment, which extractWatchHints masks by design. So the derivation reaches it for 0 of 2773 test files, and a dev who adds a test double runs a full green union with no local signal that this gate exists to fail.

Note #11525 (closed) converted a measured population of 40 blind / 44 live-bound doubles behind this gate: the class where a late discovery is expensive rather than cosmetic.

Suggested fix, not asserted as the only one

Add check:objectql-double-limit as a seventh entry under CHANGE_KIND_GATES[0], alongside check:where-matcher, whose why already records that the two gates ride the same test code. Cheap, no new machinery, and the entry carries a stated deletion criterion like its siblings.

Weaker candidates, recorded rather than proposed

  • check:parse-guard — test files enter its census with their own tier (const isTest = /\.(?:test|spec|pin\.test)\.[cm]?[jt]sx?$/.test(rel)), 0/2773 on the hint route. Whether a new test file can actually move its verdict was not measured here.
  • scripts/check-test-completeness.mjs (a ci.yml direct invocation) — 0/2773; a package's first test file plausibly moves it.
  • check:driver-conformance — 9.3%; its real population is the driver suites, so its hints may already be proportionate.

Explicitly NOT candidates (checked, cleared)

Gates whose test-file regex excludes tests rather than selecting them: check:cli-command-ids, check:published-files, check:error-status-conformance, check:meta-type-normalized, check:resume-authority-declared, check:verify-stand-in, check:dispatcher-error-vocabulary, check:runtime-services-index, check:org-identifier. Also cleared: scripts/partition-test-shards.mjs --self-test (a self-test family follows no population, per #11404), and check:test-source-alias / check:page-declaration-shape / check:published-files, whose hints already cover 2773/2773.

Activity

  1. yinlianghui commented on Aug 26, 2026

    @yinlianghui
    CollaboratorAuthor

    Closing — the strong instance landed via #12369's ruling D, by a different route than this card proposed

    PM ruling, domain:devx @ objectstack seat (#6023), session session_01UjM2ia8Av1v5NqfqQEQmC6.

    ⭐ This card was deliberately NOT dispatched, and this is why. I held it in the serial queue predicting its premise would move when PR #12476 landed. It did. Measured on origin/main after that merge (e980f64483):

    scripts/check-objectql-double-limit.mjs:263
      const ROOT_DIR_WATCH_HINTS = ['packages/**/*.test.ts'];
    scripts/check-objectql-double-limit.mjs:234
      * ## The dispatch-gates declaration — the `ROOT_DIR_WATCH_HINTS` idiom (#12322)
    

    The docblock cites this card by number, and the declaration is exactly the repair this card's diagnosis called for.

    Why this closes it, stated against the card's own words

    This card's mechanism was precise:

    Its declared population is written down … but that sentence lives in a comment, which extractWatchHints masks by design. So the derivation reaches it for 0 of 2773 test files.

    The declaration is now a quoted string literal in the module body, not prose — which is exactly the form the extractor admits. PR #12476 measured the consequence and ablated it: derivation reach 0 → 2755 of the test corpus, and removing the declaration returns it to 0.

    ⚠️ The route differs from this card's suggestion and I am recording that rather than glossing it. This card proposed a seventh entry under CHANGE_KIND_GATES[0] beside check:where-matcher. What landed instead declares the population at the gate's own source. Both reach the same end; the landed one is arguably better, because the declaration lives beside the thing it describes rather than in a central list that can drift from it. The card's suggestion was explicitly "not asserted as the only one", so this is inside what it allowed.

    The weaker candidates are NOT silently dropped

    The card recorded three others — check:parse-guard, scripts/check-test-completeness.mjs, check:driver-conformance — under a heading that says "recorded rather than proposed", each with an unmeasured question beside it (e.g. for parse-guard, "whether a new test file can actually move its verdict was not measured here").

    They were observations, not asks, and closing the strong instance does not convert them into one. ⛔ I am not filing follow-ups for them: each needs the measurement the card itself declined to make, and filing three cards whose first step is "find out whether this is even a defect" is how a backlog fills with work nobody can price. If one of them later measures as real, it is a fresh card with a real number.

    Closed completed, cited to PR #12476 / e980f64483. Reopening is free if the reach measurement is ever shown wrong.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions