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.

gatein CHANGE_KIND_GATES[0]?hint route over the test corpus
check:query-options-erasurelisted0 / 2773
check:engine-double-contractlisted0 / 2773
check:where-matcherlisted0 / 2773
check:type-check-coverage / -debtlisted91 / 2773 (3.3%)
check:cross-package-test-inputslisted2760 / 2773 (99.5%, and inherited — see #11199)
check:objectql-double-limitunlisted0 / 2773
check:parse-guardunlisted0 / 2773
scripts/check-test-completeness.mjs (ci.yml)unlisted0 / 2773
check:driver-conformanceunlisted257 / 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.

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions