fix(scripts): the subtree-walking gates declare their watch hints, so dispatch-gates names them (#15341) - #15466
Merged
Conversation
…5341) Sixteen gate families CI runs declared no path literal at all and walked a subtree seeded from a runtime constant, so dispatch-gates scored them `undetermined` for every card: absent from every dispatch brief and every `--commands` harvest while CI ran them on each pull request. Each gate now declares the population its own source really reads, under the rostered watch-hint idiom, with the coupling held in that gate's own self-test. Three families whose CI invocation is a fixture-only `--self-test` carry the `no-path-population` marker instead. `check:org-identifier` gains hints and its now-stale ROOT_WALK_RESIDUE_LEDGER row is deleted in the same commit. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
…btree-walk-gate-hints
…worklist (#15341) `scripts/pm/bare-root-worklist.mjs` carries the recorded, measured triage for exactly this class, and its `--self-test` reds on a declaration that contradicts a recorded refusal. Eleven of the sixteen gates the card names are refused there by name: REFUSE-WIDE where the bare root is TRUE of the walk and refused for width, REFUSE-UNSPELLABLE where the population is a file-kind filter no subtree glob can spell. Two of those rows quote percentages for the exact spellings this branch had declared. Those eleven declarations are withdrawn and their gates left as they were. What stays is the half neither map refuses: two enumerated FILE populations at 100% precision, three families whose CI invocation is a fixture-only self-test and which now say so, and check:org-identifier, whose ROOT_WALK_RESIDUE_LEDGER row names this declaration as its remedy. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
Contributor
Author
|
ACCEPT — PM seat Reviewed against the three-dot diff
Generated by Claude Code |
baozhoutao
marked this pull request as ready for review
September 4, 2026 17:14
baozhoutao
enabled auto-merge
September 4, 2026 17:14
This was referenced Sep 4, 2026
This was referenced Sep 4, 2026
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.
Part of #15341 — three of the sixteen families the card names are repaired here, plus the
one it couples to them. The other eleven are refused by a recorded, measured triage this
branch found by running it, and the collision needs a ruling rather than a guess. It is
laid out below and reported to the dispatching PM; nothing about it is decided here.
The class
scripts/pm/dispatch-gates.mjsderives a card's gate families from the paths each gatedeclares. Families that declare no path literal at all score
undeterminedfor every card:they reach no dispatch brief and no
--commandsharvest, while CI runs every one of themon every pull request. A seat's local green is not evidence, and the red arrives a cycle
later.
Re-measured on this pin before anything was written
The card measured 16 families at
cd1f8ee96. Re-derived atf01adfa5c(this branch'sbase, carrying #15344's whole-tree bucket, #15415's package-local lane and #15320's
control) the same 16 were still in the residue, plus
check:org-identifier— 19 familykeys across 17 gate files (
check-declaration-mirrorsandcheck-sdui-manifesteach carrytwo CI invocations of one file). Each gate's walk was then read off its own source, never
transcribed from the card's seed column, which the card itself prices as a measurement of
literals rather than a declaration. Two readings moved off that column: the
check:meta-type-normalizedseedpackagesis reallypackages/rest/src, andcheck:tenant-chokepointwalks nothing at all — it reads three named files.What lands
check:org-identifiergit ls-files -- examples apps packages(ROOTS)ROOT_DIR_WATCH_HINTS = ['examples/**','apps/**','packages/**']examples/app-crm/package.json0 → 1check:tenant-chokepointSCAN_FILES— three named driver sources,join()-assembled one segment at a timeDECLARED_WATCH_HINTS= those three file pathspackages/drivers/driver-sql/src/sql-driver.ts0 → 1check-sdui-manifest.mjs(×2 invocations)checkTree()openssdui.manifest.json,scripts/sdui-manifest.record.json,.objectui-shaROOT_WATCH_HINTS= those three; the two repo-ROOT files carry/**, since a bare single-segment literal is refusedcheck:docs-image-tag-sync--self-test, entirely inside amkdtempfixture treeno-path-populationmarkercheck:publish-smoke-pin--self-test: in-memory fixtures, no workspace, no networkno-path-populationmarkercheck:stall-guard/procand a runner temp--report-dir, never the repono-path-populationmarkerEvery declaration is held against the constant the gate itself reads, in that gate's own
--self-test, so a moved read reds where the read lives.check:org-identifier'sROOT_WALK_RESIDUE_LEDGERrow is deleted in the same commit: the row named thisdeclaration as its remedy, and a listed family that stops being a member reds the ledger's
live case.
check:pm-dispatch-gatesis green on the branch, which is that couplingmeasured rather than argued.
⛔ No whole-tree marker anywhere. For every gate here it would be false, and #15344's
bucket is explicit that a row on every card is a fabricated lead unless the gate really
reads every file.
The A/B base leg is more than a sample: at base each of these families had
hints: []andno marker, so no path could match any of them. The
0is structural; the1/2ismeasured per path with
--commands.The eleven that do not land, and why
scripts/pm/bare-root-worklist.mjscarries the recorded triage for exactly this species —a gate whose population is a bare single-segment word, which builds no hint at all. Its
map is human-decided, per-row measured, and its
--self-testruns on every PR. Declaringthe wholesale root for these gates contradicts it, and that self-test caught the first
version of this branch by name:
Its two verdicts are not deferrals.
REFUSE-WIDEmeans the bare root is TRUE of the walkand the declaration is refused anyway, because it names the gate on every card under a root
the fleet already declares wholesale — "recall bought at the cost of precision, on the one
column whose whole value is precision".
REFUSE-UNSPELLABLEmeans the population is afile-KIND filter no subtree glob can spell; the file's header calls that "not a gap to be
fixed later; it is the reason most rows below are refusals". The vocabulary carries a
maintainer ruling (2026-08-26, 「同意」) on where its line sits.
Rows quoting the exact spellings this branch had written:
check:optional-error-sinkcheck:resume-authority-declaredcheck:verify-stand-incheck:runner-env-posturecheck-declaration-mirrors.mjsscripts/**is TRUE and refused because it names the gate for 261 files to reach 2check:meta-type-normalizedFive more are the same measured shape and escape the map only because their constant name
does not match its deliberately narrow
POPULATION_CONSTANTregex, or because their walkroot was inline rather than a constant:
check:init-service-contract,check:settings-bind-window,check:startup-registry-verdict,check:wildcard-fallthrough(all four walk every non-test.tsunderpackages/, thesame 39% shape) and
check:live-db-isolation. Declaring those would buy the same recall atthe same measured precision cost, and would do it without a row anyone could later
re-examine — which is worse than the refusal, not better.
So all eleven are withdrawn from this branch and their gates left exactly as they were.
Their populations are not "unread": each is read, and the reading is a refusal that already
exists in the tree.
This is a genuine collision between two lanes, and this branch settles none of it.
The card asks for the declaration across the board;
bare-root-worklistrefuses it for this class, withmeasurements and a ruling behind it. Whoever resolves it is choosing between recall in the
matched column and its precision, fleet-wide — and the map's own contradiction message
names both honest resolutions. The options, costs and a recommendation are in the report on
#15341.
Verification
Exit codes captured before any pipe (
cmd > log 2>&1; EXIT=$?); verdict lines quoted fromeach gate's own output. All at
565db3e17, the head of this branch.node scripts/pm/dispatch-gates.mjs --self-testandpnpm check:pm-dispatch-gates(both under the shared verify lock) —
EXIT=0,✓ dispatch-gates self-test: 1402 cases pass.No case weakened; none added.pnpm check:declared-population-live—EXIT=0,✓ check:declared-population-live — 207 of 254 famil(ies) declare a path population, and every one of them reaches this tree's 7495 tracked file(s).pnpm check:watch-hint-literal—EXIT=0,✓ check-watch-hint-literal: 52 declaration(s) across 4 rostered name(s) -- ROOT_DIR_WATCH_HINTS 33, ROOT_FILE_WATCH_HINTS 9, ROOT_WATCH_HINTS 3, DECLARED_WATCH_HINTS 7 -- every one an array of quoted literals inside its own statement, every rostered name non-empty, and no unrostered spelling of the idiom in the tree.node scripts/pm/bare-root-worklist.mjs --self-test—EXIT=0. This is the gate thatreds on the withdrawn half, so its green is the load-bearing one on this branch.
node scripts/check-self-test-wired.mjs(+--self-test) —EXIT=0,✓ check-self-test-wired: every one of the 169 script(s) CI runs that ship a --self-test has that self-test run by CI.node scripts/check-self-test-workflow-commands.mjs(+--self-test) —EXIT=0both.pnpm check:ratchet-remedy-authority—EXIT=0, 202 scripts swept.pnpm check:nul-bytes—EXIT=0, 7485 text files, no raw control bytes. Plus a directcontrol-byte scan of every edited file and of this body.
--self-testand its normal mode —EXIT=0throughout:check:org-identifier,check:tenant-chokepoint,check-sdui-manifest.mjs(bothinvocations),
check:docs-image-tag-sync,check:publish-smoke-pin,check:stall-guard.node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack, 33commands, every one run, all 33
EXIT=0.pnpm lint(eslint . --no-inline-config, under the verify lock) —EXIT_lint=0, no output.Not a changeset
scripts/**only — this publishes nothing from any released package, so theskip-changesetlabel applies.🤖 Generated with Claude Code
https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
Generated by Claude Code