Repository navigation
[finding] 16 gates CI runs declare no path at all and walk a subtree, so dispatch-gates scores them undetermined for every card — the sibling half of #15082, measured #15341
Description
Activity
Claim: PM seat
domain:devx @ objectstack(#6023), sessionsession_012zGPuVVX3deAx9LdjK8jCk, dispatching to anos-devsubagent on branchclaude/issue-15341-subtree-walk-gate-hints. M; serial onscripts/pm/dispatch-gates.mjsafter #15415 (merged 15:40:28Z): 16 CI-run gates that declare no path and walk a subtree get per-gateROOT_DIR_WATCH_HINTSreadings;check:org-identifierleaves itsROOT_WALK_RESIDUE_LEDGERrow when declared. Main atf01adfa5c. Assignee field was empty at the read immediately before this write.
Generated by Claude Code
os-dev-report
{ "issue": 15341, "status": "needs_decision", "branch": "claude/issue-15341-subtree-walk-gate-hints", "pr": "https://github.com/objectstack-ai/objectstack/pull/15466", "premise_still_valid": true, "summary": "The card's PREMISE re-measured true on this pin: at f01adfa5c the same 16 families were still scored `undetermined` for every card, plus check:org-identifier, and each gate's walk was read off its own source (two readings moved off the card's seed column: check:meta-type-normalized walks packages/rest/src, not packages; check:tenant-chokepoint walks nothing and reads three named FILES). The card's REMEDY, applied across the board, collides with a recorded triage the card did not know about. scripts/pm/bare-root-worklist.mjs holds the human-decided, per-row-measured verdicts for exactly this species, and its --self-test on every PR reds on a declaration that contradicts one: six of the declarations this branch first wrote were caught 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; rows quote 39%, 42%, 14%, 0.77%). Five more of the sixteen are the same measured shape and escape only because their constant is spelled `ROOTS` or their walk root was inline. Those eleven are WITHDRAWN and their gates left untouched. What lands is the half neither map refuses: check:org-identifier (whose ROOT_WALK_RESIDUE_LEDGER row names this declaration as its remedy — row deleted in the same commit), two enumerated FILE populations at 100% precision (check:tenant-chokepoint, check-sdui-manifest x2), and three families whose CI invocation is a fixture-only self-test, which now carry the no-path-population marker. Undetermined bucket 47 -> 43; declared no-path-population 5 -> 8. The PR is `Part of #15341`; the collision is the open question.", "tests": "All at 565db3e17 (branch head), exit codes captured before any pipe (`cmd > log 2>&1; EXIT=$?`), verdict lines quoted from each gate's own stdout. node scripts/pm/dispatch-gates.mjs --self-test AND pnpm check:pm-dispatch-gates, both under scripts/pm/os-verify-lock.sh (slot issue-15341) -> EXIT=0, 'dispatch-gates self-test: 1402 cases pass.' — no case weakened, none added; the lock printed 'VERDICT command-exit 0'. pnpm check:declared-population-live -> EXIT=0, '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, '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'. node scripts/pm/bare-root-worklist.mjs --self-test -> EXIT=0 (this is the gate that reds on the withdrawn half; it caught the first version of the branch with a 9-row CONTRADICTED list, which is why the withdrawal happened). check-self-test-wired.mjs (+ --self-test) -> EXIT=0, 'every one of the 169 script(s) CI runs that ship a --self-test has that self-test run by CI'; check-self-test-workflow-commands.mjs (+ --self-test) -> EXIT=0; 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 direct grep -naP control-byte scan of every edited file, of the PR body and of this report. Every edited gate's own --self-test AND normal mode -> EXIT=0: check:org-identifier, check:tenant-chokepoint, check-sdui-manifest.mjs (both invocations), check:docs-image-tag-sync, check:publish-smoke-pin, check:stall-guard. Derived family for the whole diff: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack -> 33 commands, EVERY ONE RUN, all 33 EXIT=0. Whole-repo pnpm lint (eslint . --no-inline-config) under the verify lock -> EXIT_lint=0, no output (not a narrowed scope: the whole repo was linted). RESIDUE, both legs with `--residue README.md`: undetermined 47 (base f01adfa5c) -> 43 (branch); the four that left are check:org-identifier, check:tenant-chokepoint and check-sdui-manifest.mjs x2; declared-no-path-population rows 5 -> 8. PER-GATE A/B with --commands on one representative card path, base leg then branch leg: examples/app-crm/package.json 0->1 (check:org-identifier); packages/drivers/driver-sql/src/sql-driver.ts 0->1 (check:tenant-chokepoint); sdui.manifest.json 0->2, .objectui-sha 0->2, scripts/sdui-manifest.record.json 0->2 (check-sdui-manifest.mjs, two CI invocations of one file). The base zeros are structural as well as measured: at base every one of these families had `hints: []` and no marker, so no path could match them. Three further branch-leg probes were taken and all hit (check:org-identifier on apps/docs/package.json and packages/core/src/index.ts, check:tenant-chokepoint on driver-turso); their base legs are the same structural zero, not separately re-run. NO ablation was performed and none is claimed. NOT MEASURED, stated: nothing exited 3 in this run; the one exit-3 met (a pre-install check-optional-error-sink-contract run, 'ts-parse: PREREQUISITE NOT MET') was re-run after pnpm install and is not reported as a result.", "mcp_calls": "0 — every GitHub read and write went through repo-scoped REST (probe: GET /issues/15341 -> 200); no MCP GitHub tool was called at any point in this run.", "open_questions": [ { "question": "#15341 asks for a ROOT_DIR_WATCH_HINTS declaration on every subtree-walking gate. scripts/pm/bare-root-worklist.mjs REFUSES that declaration for this class, per row, with measured precision and a maintainer ruling behind its vocabulary (2026-08-26, verbatim 「同意」). Eleven of the sixteen families the card names fall on the refused side. Which lane governs — and if it is the card, who withdraws the map's rows?", "options": [ "A. Honour the map (what this PR does). The eleven stay undeclared; their reason already exists in the tree as a dated, measured row rather than as unexamined silence. COST: eleven gates CI runs stay unnameable by any dispatch brief, which is exactly the recall gap the card was filed about, and #15341 stays open with its larger half unaddressed. BENEFIT: the matched column keeps discriminating; no shrink-only, maintainer-ruled map is overridden by a dev seat.", "B. Honour the card. Declare all eleven and DELETE the six contradicted rows from bare-root-worklist's map (the map's own contradiction message permits this as 'withdraw the VERDICT, if the declaration is deliberate'). COST: measured, not rhetorical — check:optional-error-sink, check:resume-authority-declared and check:verify-stand-in would each be named on every card touching packages/ at 39% precision, check:runner-env-posture at 35%, check-declaration-mirrors on 261 scripts/ files to reach 2 (0.77%), check:meta-type-normalized false 6 times in 7. Five more of the same shape ride along with no row anyone can later re-examine. BENEFIT: sixteen gates become nameable; the matched column trades precision for recall fleet-wide.", "C. Split by measured precision with a stated threshold, and record the threshold where the map's vocabulary lives. COST: a new judgement to write, own and maintain, and every existing row re-read against it; nothing lands until that is decided. BENEFIT: the two lanes stop contradicting each other by construction rather than case by case, and #15341's residue shrinks by whatever the threshold admits.", "D. Give the derivation a THIRD channel for this class — a 'wide-population' declaration that puts the gate in the residue's declared column (like no-path-population) without putting it in the matched column. COST: a real change to dispatch-gates plus self-test cases; the largest engineering cost of the four. BENEFIT: it answers what BOTH lanes actually want — the card wants the gate to stop being unexamined silence, the map wants it out of the matched column — and neither map has to be overridden." ], "recommendation": "D, with A as the interim (which is what this PR ships). The two lanes are not really disagreeing about these gates: the card wants a seat to be TOLD about a gate CI runs, and the map refuses one specific way of telling them because it damages the column whose value is precision. no-path-population already proves the pattern — a declared reason that leaves the family unplaced and out of the matched column, which is precisely what REFUSE-WIDE wants and what the card would accept. B is the option I would argue against hardest: its costs are already measured in the map's own rows, and a dev seat deleting six rows from a shrink-only, maintainer-ruled map on its own judgement is the shape this repo refuses everywhere else. If D is too large for one card, A now and C as a follow-up keeps every option open." } ], "out_of_scope_findings": [ "filed as #15468: bare-root-worklist's POPULATION_CONSTANT regex requires a literal underscore, so a bare `ROOTS` or `DIRS` constant never enters the sweep — measured: 7 files under scripts/ open with `const ROOTS = [`, two of them (check-live-db-isolation, check-org-identifier) bare-root walkers of the very class the map triages, judged neither way. Duplicate-checked over 378 tooling-labelled issues, open AND closed, via the repo-scoped REST list endpoint; nearest neighbour #14695 is one level later (rows that could be written and were not), not this." ] }
Generated by Claude Code
PM ruling (interim) + decision box — PM seat
domain:devx @ objectstack(#6023), sessionsession_012zGPuVVX3deAx9LdjK8jCk.PR #15466 is ACCEPTED as the half neither map refuses (
Part of; this card stays open): 3 families declared + 1 coupledROOT_WALK_RESIDUE_LEDGERrow cleared + 3no-path-populationmarkers; residue 47 → 43.The dev's open question (its report, comment 5543976876) is not this seat's to rule: the eleven withdrawn families are refused per row by
scripts/pm/bare-root-worklist.mjs, a shrink-only map whose vocabulary carries a maintainer ruling (2026-08-26). Overriding it is a maintainer decision, so this card moves toneeds-user-decisionwith the four options as the dev laid them out:- A honour the map — the eleven stay undeclared, reason recorded per row (what fix(scripts): the subtree-walking gates declare their watch hints, so dispatch-gates names them (#15341) #15466 ships; the interim state).
- B honour the card — declare all eleven and delete six contradicted rows; cost measured in the map's own rows (39% / 35% / 0.77% precision).
- C a stated precision threshold recorded where the map's vocabulary lives.
- D a third derivation channel (
wide-population: declared, unplaced, out of the matched column — theno-path-populationpattern applied to REFUSE-WIDE).
Seat recommendation, aligned with the dev's: A now, D as the follow-up; ⛔ not B by a dev seat.
pm:dispatchedand the assignee are stripped so the card reads as awaiting a ruling, not as in flight. When ruled: A closes the card by comment, C/D re-enterpm:queueas a dispatch ondispatch-gates.mjs(serial with #15414). #15468 (dev-filed,ROOTS/DIRSconstants escape the map'sPOPULATION_CONSTANTregex) is graded separately.
Generated by Claude Code
LANDED (the
Part ofhalf) — PM seatdomain:devx @ objectstack(#6023), sessionsession_012zGPuVVX3deAx9LdjK8jCk.PR #15466 merged 2026-09-04T17:50Z (merge-queue;
merged: true, mainbc54b2688). Probe on the re-fetched main:ROOT_DIR_WATCH_HINTSincheck-org-identifier.mjs:305,DECLARED_WATCH_HINTSincheck-tenant-chokepoint.mjs:153,ROOT_WATCH_HINTSincheck-sdui-manifest.mjs:92, theno-path-populationmarker in all three runner/rewriter files, and zero mentions ofcheck:org-identifierleft inscripts/pm/dispatch-gates.mjs(the ledger row is gone).node scripts/pm/dispatch-gates.mjs --self-teston the PM checkout: dispatch-gates self-test exit=0 —✓ dispatch-gates self-test: 1402 cases pass..This card stays open in the decision box (
needs-user-decision, ruling note 5544015357) for the eleven refused families. #15414 is now dispatchable ondispatch-gates.mjs.
Generated by Claude Code
Maintainer ruling recorded — D, with A as the interim (the current state):
dispatch-gates.mjsgains a third derivation channel,wide-population— a gate declares "CI runs me over a population too wide to place", which lists it in the residue's declared column and keeps it OUT of the matched column; the elevenREFUSE-WIDE/REFUSE-UNSPELLABLEfamilies move onto it;bare-root-worklist.mjs's rows are not deletedDirector seat, summon #14, session
session_01LsEjuNMPitCHwEfYftZ1um(GitHubos-warren), 2026-09-05. Provenance: maintainer, live PM chat, decision batch #43 (item 3, presented with the recommendation D, A interim), verbatim reply 「同意」. Premise: dev report 5543976876 and the devx seat's disposition 5544015357 — PR #15466 (merged 17:50Z) landed the half neither map refuses (3 declarations + 3no-path-populationmarkers, undetermined 47 → 43); the remaining eleven are refused per row by the shrink-only map whose vocabulary carries the 2026-08-26 ruling, at measured precision 39% / 35% / 0.77%.Ruled: D. The two lanes want compatible things — the card wants a seat to be told a gate CI runs; the map refuses one way of telling them because it damages the matched column's precision.
no-path-populationalready proves the shape. Not taken: B (a dev seat deleting six rows from a maintainer-ruled map), C (a threshold to own and re-argue), A alone (eleven gates stay unexamined silence).Why (① ≥50%): a declared reason that leaves the family unplaced is what
REFUSE-WIDEasks for and what the card accepts; no ruled map is overridden. ③ silence becomes a declaration; ④ one channel, once.Execution:
domain:devxseat, M: thewide-populationmarker and channel inscripts/pm/dispatch-gates.mjs(self-test cases for both columns), the eleven declarations,bare-root-worklist.mjstaught to accept the marker as the deliberate-declaration form its contradiction message already permits,check:declared-population-live/check:watch-hint-literal/check:pm-dispatch-gatesgreen; serial ondispatch-gates.mjsafter #15414;.claude/**is governed — draft,os-zhuang+hotlong, human merge. Residue target: undetermined 43 → ≤ 32. #15468 (ROOTS/DIRSconstants escaping the map's regex) is graded separately.State transition, same stroke:
needs-user-decision→pm:queue.tooling·domain:devx·findingunchanged. Ledger: director seat post #12708, batch #43. Related: #15082 · PR #15466 · #15414 · #15468.
Generated by Claude Code
Claim: PM seat
domain:devx @ objectstack(#6023), sessionsession_012zGPuVVX3deAx9LdjK8jCk, 2026-09-05T03:56Z — re-claiming after the maintainer ruling (5548765257, D with A interim) and dispatching to anos-devsubagent on branchclaude/issue-15341-wide-population-channel(lock depth read before dispatch per #14944: holder present, queue empty → admitted). Ruling carried verbatim in spirit:scripts/pm/dispatch-gates.mjsgains a THIRD derivation channel,wide-population— a gate declares "CI runs me over a population too wide to place"; the family is listed in the residue's DECLARED column and kept OUT of the matched column (theno-path-populationpattern applied to REFUSE-WIDE); self-test cases for both columns; the elevenREFUSE-WIDE/REFUSE-UNSPELLABLEfamilies (the ones withdrawn in report5543976876) move onto it;scripts/pm/bare-root-worklist.mjsis taught to accept the marker as the deliberate-declaration form its contradiction message already permits — ⛔ its rows are NOT deleted;check:declared-population-live/check:watch-hint-literal/check:pm-dispatch-gatesgreen; residue target undetermined 43 → ≤ 32. Serial ondispatch-gates.mjs(FREE — #15414 closed);.claude/**files, if any of the eleven live there, make the PR governed (draft, os-zhuang + hotlong, human merge). #15468 stays separate (after this).pm:queue→pm:dispatched, assignee set.
Generated by Claude Code
os-dev-report
{ "issue": 15341, "status": "done", "branch": "claude/issue-15341-wide-population-channel", "pr": "https://github.com/objectstack-ai/objectstack/pull/15737", "premise_still_valid": true, "summary": "Implements the maintainer ruling 5548765257 (option D): scripts/pm/dispatch-gates.mjs gains a third derivation channel, `wide-population`, spelled as the exact sibling of `no-path-population` and `whole-tree-population` in both comment forms, with a REQUIRED reason that must name the roots walked and why no subtree glob places them. A declaring family leaves `undetermined` for a verdict of its own, renders under a `Declared WIDE population` heading with its reason, is never placed by a card's paths, and is deliberately NOT in the runnable union `--commands` prints (the one difference from the whole-tree channel, whose commands ARE in every card's total); `--json` carries a `widePopulation` key and the stderr accounting states the omission out loud. `widePopulationRefusal` refuses the marker paired with either sibling or sitting above a scanned path population, and `wholeTreePopulationRefusal` states the mirror, so a gate declares exactly ONE population shape. scripts/pm/bare-root-worklist.mjs is taught the marker as the deliberate-declaration form its CONTRADICTED message already permitted: the check is now the pure `contradictedRows(rows, triage)`, a covered row whose gate carries the marker is not contradicted (it AGREES with the refusal rather than overriding it), and NO row is deleted, edited or re-pointed. TWO DEVIATIONS FROM THE DISPATCH, both re-derived rather than carried: (1) TEN declarations, not eleven — scripts/check-declaration-mirrors.mjs (two invocations) has since declared a real population (scripts/**/*.d.mts, scripts/**/*.mjs), is `silent` rather than `undetermined`, and no longer needs the marker; its REFUSE-UNSPELLABLE row is untouched and uncontradicted. (2) The residue BEFORE figure is 41, not the card's 43 — the tree grew (259 families discovered, not 254), so 43 is stale rather than wrong; 41 -> 31 at the branch point and 40 -> 30 at the final head, both ten below their own paired before-leg and both under the ruling's ceiling of 32. One judgement call is documented at the seam and in the PR body rather than left implicit: the declaration is a claim about the POPULATION, so it does NOT suppress coveringKey's IDENTITY key — a card editing the gate's own script still matches it and still gets its command, which is why `--changed --commands` on this very diff emits all ten. That is also what the dispatch expected (\"it will be many - the eleven gates are in the change set\"). The asymmetry with the whole-tree channel (consulted BEFORE the classifier, and suppressing identity) is pinned in both directions so neither can be tidied into the other. The PR is NOT governed: none of the twelve files is under a governed surface; it stays draft because every os-dev PR does.", "tests": "All on the FINAL head 44e6f63bb (git rev-parse --short HEAD at the run) unless stated; exit codes captured BEFORE any pipe (`cmd > log 2>&1; EXIT=$?`); verdict lines quoted from each gate's own stdout. DERIVED FAMILY, RUN IN FULL: `node scripts/pm/dispatch-gates.mjs --changed --commands --repo objectstack-ai/objectstack` -> 39 commands, EVERY ONE RUN, plus `node scripts/pm/dispatch-gates.mjs --self-test` = 40 of 40 EXIT=0, in ONE locked batch (OS_VERIFY_LOCK_SLOT=issue-15341), lock VERDICT quoted verbatim: 'VERDICT command-exit 0 - held the lock 1085s (18m05s) - waited 45s'. The command set was re-derived after merging origin/main and is byte-identical to the pre-merge derivation. VERDICT LINES: 'dispatch-gates self-test: 1478 cases pass.' (base measured 1445 at 8e8860ed8; +33, no case weakened or deleted) - the identical line from `pnpm check:pm-dispatch-gates`. bare-root-worklist --self-test: 'OK self-test: 54 live row(s), 46 unreachable as spelled, 46 recorded verdict(s) - none stale, none missing, none contradicted (9 row(s) whose gate carries the dispatch-gates wide-population declaration, the deliberate-declaration form this file accepts without withdrawing a verdict; none of them is covered, so none is excused by it today).' `check:declared-population-live`: '214 of 259 famil(ies) declare a path population, and every one of them reaches this tree's 7600 tracked file(s).' `check:watch-hint-literal`: '58 declaration(s) across 4 rostered name(s) ... no unrostered spelling of the idiom in the tree.' `check:nul-bytes`: 'OK (scanned 7593 text file(s) ... no raw ASCII control bytes)', plus a direct grep -naP control-byte scan of the PR body and of this report. `check-self-test-wired.mjs` and its --self-test: 'every one of the 172 script(s) CI runs that ship a --self-test has that self-test run by CI.' Each of the ten edited gates' own check:* (self-test leg AND production leg): EXIT=0. RESIDUE, paired on ONE tree each time, `--residue README.md`: merge base 8e8860ed8 = 41 undetermined / 0 declared-wide; branch 2bc5ece11 = 31 / 10; final head 44e6f63bb with the channel ABLATED = 40 / 0; final head as pushed = 30 / 10. BEHAVIOURAL PROOF, matched column: `node scripts/pm/dispatch-gates.mjs --commands packages/rest/src/rest-server.ts` on the final head -> EXIT=0, 39 commands, ZERO of the ten among them (grep count 0), and stderr states '+ 10 famil(ies) DECLARE a population too wide to place and are NOT above'. At base those ten had hints: [] and no marker, so the zero is structural as well as measured. The identity direction is proved by the same tool on this card's own change set: --changed --commands emits all ten. ABLATION (trap-guarded, absolute paths, on-disk proof BOTH directions, blob-hash restore): mutation = delete the `widePopulationReason` branch from placeFamily. The script ABORTS unless the working-tree blob already equals the HEAD blob, so it can only ever measure the committed implementation. Full run at 2bc5ece11: HEAD_BLOB = BEFORE_HASH = cf58c06142574ca2d0eea479b9722f891085c877; marker lines 1 -> 0 and MUTATED_HASH dd0a6b350f53ccf939274de3c0f53d1c19c0870f, i.e. the mutation was confirmed ON DISK by both a grep -cF count and a changed blob hash, never by an editor's exit code; ablated residue 41 undetermined / 0 declared-wide (exactly the BEFORE value); ablated self-test EXIT=1 with 5 failing cases, all of them this channel's placement pins (3 fixture + 2 live: 'DECLARED column: a declaring family is placed as wide-population, not undetermined', 'MATCHED column: a card under the root it walks does NOT match it', 'NOT silent either', 'no live wide-population family is matched by a card under the roots it walks', 'and none of them is left in undetermined for a card that touches nothing of theirs'). RESTORE leg proved to the same standard: RESTORED_HASH == HEAD blob, `git diff HEAD` EMPTY, marker lines back to 1, restored residue 31 / 10. Residue legs re-run at the final head 44e6f63bb with identical hash evidence: ablated 40 / 0, restored 30 / 10. NO BUILD LEG APPLIES AND NONE IS CLAIMED: `node scripts/pm/dispatch-gates.mjs` executes the source file directly and the self-test lives in that same file - no package `exports` resolution, no dist/, so the dist-preflight discipline has nothing to check here. GOVERNED: `node scripts/pm/check-governed-merges.mjs --test` over the final twelve-file list -> EXIT=0, 'governed-surface predicate: 0 of 12 path(s) hit the register (5 surfaces, repo-agnostic). NOT governed - ordinary queue landing applies to a PR with exactly this file list.' No review requested on governance grounds; the PR is draft and stays draft. NOT MEASURED, by name: (a) no ablation of the bare-root-worklist acceptance was performed - its LIVE direction is vacuous on this tree (9 rows' gates carry the marker, none of them covered), which is stated in the self-test's own verdict line and is why that half is carried by fixture pins in both directions plus a control naming the handoff to widePopulationRefusal; (b) whole-repo `pnpm lint` was NOT run and no narrowing is claimed for it - it is left to CI; (c) nothing in this run exited 3 and no PREREQUISITE NOT MET was met; (d) CI on the PR had not reported at report time (draft opened, report delivered immediately per the dev contract).", "mcp_calls": "0 - every GitHub read and write went through repo-scoped REST (probe: GET /issues/15341 -> HTTP 200); no MCP GitHub tool was called at any point in this run.", "open_questions": [ { "question": "The ruling says the channel 'keeps it OUT of the matched column'. Does that also mean OUT for a card that edits the gate's own script, where coveringKey's IDENTITY key (not a population key) would otherwise match it? Implemented as NO - identity survives - and pinned; flagged because it is the one clause of the ruling this seat had to read rather than execute.", "options": [ "A. Identity survives (what this PR ships). The declaration is a claim about the POPULATION; coveringKey's own docblock calls the identity key 'an identity claim about a single FILE'. A card editing the gate is a 100%-precise lead, and the dispatch's own expectation ('the eleven gates are in the change set') only holds this way. COST: a reader who takes 'never matched' absolutely will find one card class where these families do appear in --commands.", "B. Suppress identity too, mirroring the whole-tree channel exactly (declaration consulted BEFORE the classifier). COST: measured, not rhetorical - the ten gates would leave --commands even for the PR that edits them, so a dev editing a gate would not be told to run it; a channel added to ADD information would subtract some on the one card class where the derivation is exactly right." ], "recommendation": "A, which is what shipped. If the maintainer reads the ruling as B, the change is two lines in placeFamily plus flipping the two pins that currently assert the difference - the pins were written as a DIFFERENCE between the two channels precisely so that reversal is mechanical rather than archaeological." } ], "out_of_scope_findings": [] }
Generated by Claude Code
LANDED — PR #15737 merged as
a9b9c7dc9. Card closed byFixes.Probe on re-fetched
origin/main(a9b9c7dc9), PM seat, plain node (EXIT read before any pipe):declaredWidePopulation:2428,widePopulationRefusal:2597,widePopulationLines:9255present inscripts/pm/dispatch-gates.mjs.node scripts/pm/dispatch-gates.mjs --residue README.md→ EXIT=0,Declared WIDE population — 10 famil(ies) DECLARE that CI runs them over a population too wide to place …,Undetermined (source names no path at all — NOT known irrelevant): 30 famil(ies).(main before: 40 / no declared-wide block).--self-test→ EXIT=0,✓ dispatch-gates self-test: 1478 cases pass.node scripts/pm/bare-root-worklist.mjs --self-test→ EXIT=0,OK self-test: 54 live row(s), 46 unreachable as spelled, 46 recorded verdict(s) — none stale, none missing, none contradicted (9 row(s) whose gate carries the dispatch-gates wide-population declaration …).
Stripping
pm:dispatchedand the assignee in the same action. Freesscripts/pm/bare-root-worklist.mjs+dispatch-gates.mjs→ #15468 is now dispatchable.
Generated by Claude Code
- added a commit that references this issue
on Sep 9, 2026
Filed unassigned by the #15312 dev seat (session
session_012zGPuVVX3deAx9LdjK8jCk), which measured the class while landing that card's fix and reported it rather than widening its own PR into it.The class
scripts/pm/dispatch-gates.mjsderives a card's gate families from the paths each gate declares. #15312 closed one shape of the gap — a gate whose population is the WHOLE TREE now says so with thewhole-tree-populationmarker. This card is the neighbouring shape, measured in the same sweep: a gate that declares no path literal at all (undetermined) and walks a SUBTREE, seeded from a runtime constant no source scan reads.Those gates are scored
undeterminedfor every card, appear in no--commandsharvest, and CI runs every one of them. Same consequence as #15312: a seat's local green is not evidence, and the red arrives a cycle later.Distinct from #15082, deliberately. That card is the
silent/ artifact-roster class — gates whose declared literals all name tracked FILES. These declare nothing at all. The two are complementary halves of the same residue and the remedy is the same idiom (ROOT_DIR_WATCH_HINTS, the #13519 repair), so they may want one lane, but they are different populations and neither measurement finds the other's members.Measured, at
cd1f8ee96Method (reproducible; the seat's script is in #15312's report): every gate script CI runs, per
check-self-test-wired.mjs's owncollectInvocations, diffed against the union of everythingdispatch-gatescan ever name — the matched derivation over the whole tracked tree as one probe card MINUS each family's own file closure, plus the convention block, the whole-tree bucket and the artifact-roster block.16 of the 43 are this class. Eleven carry a directory walk (
readdirSync) seeded from literals this scan can read; five carry no walk at all and their population is simply unread.check:init-service-contractpackagescheck:live-db-isolationpackages,apps,examplescheck:meta-type-normalizedpackagescheck:optional-error-sinkpackagescheck:resume-authority-declaredpackages,examplescheck:runner-env-posturepackages,apps,examplescheck:settings-bind-windowpackagescheck:startup-registry-verdictpackagescheck:verify-stand-inpackages,examplescheck:wildcard-fallthroughpackagesscripts/check-declaration-mirrors.mjs(+--self-test)check:stall-guardcheck:docs-image-tag-synccheck:publish-smoke-pincheck:tenant-chokepointscripts/check-sdui-manifest.mjs(+--self-test)One row is already ruled by a neighbour and should be checked first:
check:org-identifierwas excluded from #15312's whole-tree bucket with aROOT_WALK_RESIDUE_LEDGERrow precisely because itsgit ls-files -- examples apps packagesis three subtrees. Its remedy is this card's idiom, and landing it should clear that ledger row (the ledger's own live case reds on a stale row, so the two moves are coupled by construction).Remedy, per gate
Declare the scan surface the gate really walks, in the subtree spelling, using the
ROOT_DIR_WATCH_HINTSidiom its peers use — and pair it with the assertion in that gate's OWN self-test tying the hints to the roots constant, the waycheck-adr-symbol-anchors.mjsandcheck-agent-test-spelling.mjsalready do. Once a population is declared the family is MATCHED and leaves the residue.⛔ Not a whole-tree marker: for every gate here that would be false, and #15312's bucket is explicit that a row on every card is a fabricated lead unless the gate really reads every file.
Why this was not folded into #15312
That card names one class — WHOLE-TREE — and its fix is one declaration plus a computed guard over that class. Sixteen per-gate population judgements are a different size and a different set of owners, and a guard that swallowed them would need sixteen justified exclusion rows nobody would revisit, which is the shape
artifactRosterLinesrefuses for its own members.Generated by Claude Code