You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Recorded from the #10599 dev seat (session session_01DdCnBGcHeufjrq7drTD3wt, branch claude/issue-10599-fatal-guard-linttext, PR #10624) while closing the lintText half of the
adoption check. Not touched there — out of that card's scope, and it is a bound rather than a live
false green.
The bound
checkGuardAdoption() reads exactly the sources named in GUARDED_GATES:
So every test it applies — the import test, the armed test, the .lintFiles( ban, and now the .lintText( ban from #10599 — is a statement about one file's text. A gate that moved its
counting into a sibling helper (import { measure } from './lint-population.mjs', with the raw eslint.lintFiles() or eslint.lintText() living there) presents a gate file with no banned call
shape in it at all. The two bans see nothing. The import and armed tests still pass as long as the
gate file keeps any one strict call — which is the same mixed shape #10599 closed, one indirection
further out.
This is the same sentence #10123 → #10458 → #10599 keep landing on, each time one level up: the
check proves a fact about the text it read, and the claim it is used to make is about the
measurement. #10599 moved the undecidable part (which result is COUNTED) to a declaration at the
call site; nothing yet decides WHICH FILES have to carry those declarations.
Severity: latent
Neither gate has a helper module today — both check-slot-lookup-ratchet.mjs and check-query-options-erasure-ratchet.mjs lint inline. Nothing is green that should be red right
now. It is worth writing down because the natural next refactor of either gate (both are past 700
lines) is exactly "pull the measuring part into a module", and that refactor silently removes the
gate from its own guard with no diff to the check.
Follow the import graph from each gate and apply guardAdoptionProblems() to every local module
it reaches. Decidable for static import specifiers, and it makes the population a derived fact
rather than a hand-kept list — but it needs a specifier resolver the check does not have.
Ban the raw call shapes repo-wide outside scripts/eslint-fatal-guard.mjs, so no file can host
an unguarded lint at all. Widest, and the one that stops depending on which files are named;
costs a sweep of whatever else in scripts/** legitimately lints.
Refs: #10123 (the card that created the guard) · #10458 / PR #10598 (comments-as-code, and the
armed test) · #10599 / PR #10624 (the lintText half, where this was noticed).
Recorded from the #10599 dev seat (session
session_01DdCnBGcHeufjrq7drTD3wt, branchclaude/issue-10599-fatal-guard-linttext, PR #10624) while closing thelintTexthalf of theadoption check. Not touched there — out of that card's scope, and it is a bound rather than a live
false green.
The bound
checkGuardAdoption()reads exactly the sources named inGUARDED_GATES:So every test it applies — the import test, the armed test, the
.lintFiles(ban, and now the.lintText(ban from #10599 — is a statement about one file's text. A gate that moved itscounting into a sibling helper (
import { measure } from './lint-population.mjs', with the raweslint.lintFiles()oreslint.lintText()living there) presents a gate file with no banned callshape in it at all. The two bans see nothing. The import and armed tests still pass as long as the
gate file keeps any one strict call — which is the same mixed shape #10599 closed, one indirection
further out.
This is the same sentence #10123 → #10458 → #10599 keep landing on, each time one level up: the
check proves a fact about the text it read, and the claim it is used to make is about the
measurement. #10599 moved the undecidable part (which result is COUNTED) to a declaration at the
call site; nothing yet decides WHICH FILES have to carry those declarations.
Severity: latent
Neither gate has a helper module today — both
check-slot-lookup-ratchet.mjsandcheck-query-options-erasure-ratchet.mjslint inline. Nothing is green that should be red rightnow. It is worth writing down because the natural next refactor of either gate (both are past 700
lines) is exactly "pull the measuring part into a module", and that refactor silently removes the
gate from its own guard with no diff to the check.
Shapes worth weighing, none obviously right
checkGuardAdoption()'s docblock that its claim is scoped to the gate file— the same narrowing checkGuardAdoption still passes a gate that counts messages from
lintText()— the adoption check tests the call it names, not the measurement it guards #10599 applied to the printed sentence.guardAdoptionProblems()to every local moduleit reaches. Decidable for static
importspecifiers, and it makes the population a derived factrather than a hand-kept list — but it needs a specifier resolver the check does not have.
scripts/eslint-fatal-guard.mjs, so no file can hostan unguarded lint at all. Widest, and the one that stops depending on which files are named;
costs a sweep of whatever else in
scripts/**legitimately lints.Refs: #10123 (the card that created the guard) · #10458 / PR #10598 (comments-as-code, and the
armed test) · #10599 / PR #10624 (the
lintTexthalf, where this was noticed).Generated by Claude Code