docs(pm): stop transcribing the test-file ratchets' hint sets in CHANGE_KIND_GATES, derive them - #13311
Merged
Conversation
… them The CHANGE_KIND_GATES docblock copied all three test-file ratchets' hint sets and drew "all three score silent" from the copy. Two independent drifts falsified it without editing this file: a git ref stopped being admitted as a hint, and check:where-matcher grew a real population literal, which moves it into the MATCHED column. Remove the transcription rather than re-measure it, restate the argument for the two ratchets it is still true of, and record why the where-matcher line stays in the table anyway. Every membership claim is re-derived in --self-test against the live tree, so a tree that moves one reddens a case instead of leaving the prose quietly false. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CPrUz21stTFhJRUirdc4yw
This was referenced Aug 30, 2026
os-elon
marked this pull request as ready for review
August 30, 2026 07:56
os-elon
enabled auto-merge
August 30, 2026 07:57
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #13232
The
CHANGE_KIND_GATESdocblock inscripts/pm/dispatch-gates.mjstranscribedthe three test-file ratchets' hint sets and drew a conclusion from the copy
("Not one of those can cover a card's path, so all three score
silent"). Thecopy was stale and the conclusion built on it was false.
Re-derived, not taken from the card
The card names two stale sites. Driving the tool's own extractor over the
live tree, four of the block's five claims are false and one is still true:
check:query-options-erasure BASELINE, origin/mainscripts/eslint-fatal-guard.mjscheck:where-matcher BASELINE, origin/main*.test.tspopulation globcheck:engine-double-contract BASELINE, @objectstack/{core,objectql,metadata-core}silent"check:where-matcheris MATCHED for any test file under its scan rootLive residue on a specimen test file,
--residue packages/core/src/__tests__/*.test.ts:21 matched · 36 undetermined · 126 silent,25of the silent ones roster-only —exactly the
20 -> 21/127 -> 126/26 -> 25shift the card predicted.check:where-matcherprints in the matched list asmatched via ... gate source 'packages/**' + '/*.test.ts'.What else moved it
The card attributes the staleness to one PR. It is two independent drifts, and
the second one touched neither this file nor that PR's:
check:where-matchergrew a real population literal in its own source (PR fix(tooling): declare check:where-matcher's test-file population where dispatch-gates can read it #13231, the one the card names).origin/mainstopped being admitted as a hint at all.isNonPathNamespacerefuses the remote-ref class, and this same file's self-test already pinned
the refusal (
nor is the remote-tracking shorthand for one,the extractor drops a scraped git ref) — three thousand lines above a docblock stillnaming it as a measured hint. Both ratchet sources still spell the ref;
the extractor simply no longer yields it.
The
check:query-options-erasurerow moved too, in a third direction: itssource grew four more path literals, three of them fixture names that exist
only as strings in its own self-test.
⚠ The checkout available to this seat is shallow (120 commits), so I did not
attribute either drift to a specific merge —
git logbottoms out at the graftboundary and would have produced a confident wrong answer. What is asserted
above is the live state, measured; the archaeology is not.
The claim about this file made by the PR that freed it — verified, held
PR #13247, which released this file, states it does not touch
CHANGE_KIND_GATES.Confirmed against its diff: its two hunks are at
coveringJobFilter(~2703) andinside
selfTest()(~6760), neither within the docblock. The sites were stillpresent and still stale on today's tree.
The change
Remove the transcription instead of re-measuring it. A hand-maintained count in
this file's gate prose has now gone stale twice, so a fresh copy would only
reset the clock.
an artifact roster, and points at
--residue, which prints every family'slive
names:set and re-derives it on every run.check:where-matcheris recorded as the exception, with the reason its linestays in the table anyway — the same two-direction argument the neighbouring
check:cross-package-test-inputsmeasurement already makes: the declarationis set-equal to that gate's own walk under its scan root, so it reaches no
test file outside it while the KIND reaches every one, and the KIND reaches a
card dispatched before its code exists, which no path derivation can.
The part that cannot go stale the same way
Nine self-test cases, following the precedent set by the PR that freed this
file (PR #13247) — they re-derive against the live tree on every run rather than restating
a number:
The last pair is the one the deleted transcription could not have reported: it
asserts the literal is still spelled and still not yielded, so it reddens if
the refusal is ever relaxed and a row naming the ref becomes writable again.
Ablation — the new cases can actually go red
Committed first, then mutated, with the mutation proven on disk before anything
was read:
Restore leg proven the same way rather than by its exit code —
git checkout HEAD --against an absolute path from a
trap, thengit hash-objectback to23550c73749bd4d9ef608090416e6b11800113a6, marker count back to 0, declaredliteral back to 1,
git diff HEADempty.⚠ One honest limit: under this mutation the following case
("…and that covering hint is the gate's OWN declared population") stays green
vacuously — with no covering hint, the lookup it negates is
undefined. It isa supporting assertion guarded by the case above it, the same chaining the
neighbouring block uses, not an independent claim.
Local verification
All at
95e75cb9f2, the final commit. Gate family derived bynode scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack(14 matchedfamilies, derived from the merge base, not hand-listed):
check:pm-dispatch-gates✓ dispatch-gates self-test: 893 cases pass.check:self-test-wired✓ every one of the 148 script(s) CI runs that ship a --self-test has that self-test run by CI.check:watch-hint-literal(+ its own--self-test)✓ 21 ROOT_DIR_WATCH_HINTS declaration(s), every one an array of quoted literals inside its own statement.check:nul-bytesOK (scanned 7361 text file(s) ... no raw ASCII control bytes).check:agent-test-spelling,check:bash32-floor,check:cli-command-ids,check:cross-package-test-inputs,check:entry-guard,check:parse-guard,check:pnpm-filter-targetscheck-ci-filter-parity.mjsOK: all 123 declared cross-package glob(s) (88 unique) are covered ...check-shard-attestation.mjs✓ 2 aggregate gate(s) count 3 declared leg(s) across 3 attesting job(s).check-test-completeness.mjsturbo run testlog; the family names it with no argument, and the gate says so itself. Not a red.This file's own watch-hint set is byte-identical before and after the edit
(9 hints, unchanged) — the new prose fabricates none, which is the failure this
script is written against. Comment ranges are masked by the extractor, verified
directly rather than assumed.
Repo-scoped REST is 403 for this seat, so issue reads went through the public
single-card payload channel; MCP was used for the comment thread, this PR, and
the label.
Declarations
validator is touched. The only executable change is nine additional assertions
inside
selfTest(); every derivation function, predicate and table entry isbyte-identical.
scripts/pm/dispatch-gates.mjsships in nopackage's
files; nothing underskills/orpackages/is touched.skip-changesetapplied: this PR releases nothing.CHANGE_KIND_GATESis the real identifier; there is noCONVENTION_GATESsymbol anywhere in the tree. The card's name for it is descriptive (the tool
prints the section as "Convention-triggered gates"). Recorded, not "fixed".
Generated by Claude Code
Generated by Claude Code