feat(pm): wide-population, a third dispatch-gates derivation channel - #15737
Conversation
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
…de-population-channel
|
ACCEPT — PR #15737 (head Ruling on the open question (identity-key survival): A, as shipped. The wide-population declaration is a claim about the gate's population; Ten declarations, not eleven: accepted. Measured by this seat (branch checked out detached at
Serial-file hold: NOT MEASURED here: the ten gates' own On landing: #15341 closes; #15468 unblocks. Generated by Claude Code |
|
Flipped ready + auto-merge enabled (05:52Z, Generated by Claude Code |
Fixes #15341
Implements the maintainer ruling recorded in comment 5548765257 (decision batch #43, verbatim reply 「同意」): option D, a third derivation channel. PR #15466 landed the
Part ofhalf (the families neither map refused); this lands the half that needed the ruling.The channel's contract
Marker, spelled as the exact sibling of the two that already exist, in both comment forms:
undeterminedbucket for a verdict of its own,wide-population, and is rendered under its own heading —Declared WIDE population— with the gate's reason. That is the residue's declared column the ruling names.--commands. No card's paths place it, and its command is deliberately not in the runnable union. This is the one difference fromwhole-tree-populationbeside it: a whole-tree gate is owed by every card so its command sits inside every card's total; a wide-population gate is owed by CI and by no card in particular, and pasting it into every harvest would be the fabricated leadbare-root-worklist.mjsrefused in the first place. The--commands/--jsonstderr accounting states the omission out loud, and--jsoncarries awidePopulationkey besidealwaysRunsPopulation.widePopulationRefusalrefuses the marker paired withno-path-population, paired withwhole-tree-population, or sitting above a scanned path population (it names the literals so a reader can decide which half is wrong).wholeTreePopulationRefusalstates the mirror, so whichever channel a reader arrives through, the pair is refused rather than resolved by a coin toss.One boundary that is a judgement, stated rather than buried
The declaration is a claim about the gate's population. It therefore does not suppress
coveringKey's identity key: a card that edits the gate's own script still matches it and still gets its command.coveringKey's own docblock calls the identity key "an identity claim about a single FILE", not a population claim; the ruling's "keeps it OUT of the matched column" is about the roots the gate walks, and the gate you are editing is the one gate you certainly owe. Suppressing it would make a channel added to ADD information subtract some, silently, on the one card class where the derivation is exactly right. This is whyplaceFamilyconsults this declaration AFTER the classifier while the whole-tree one is consulted BEFORE it — the asymmetry is the design, it is documented at the seam, and both directions are pinned (including a case asserting the whole-tree channel still DOES suppress the identity match, so neither can be tidied into the other).The declarations — ten, not eleven
Re-derived on today's
origin/mainrather than carried from report 5543976876. Ten of the eleven withdrawn families are stillundeterminedand now declare. The eleventh,scripts/check-declaration-mirrors.mjs(two invocations), has since declared a real population (scripts/**/*.d.mts,scripts/**/*.mjs) and issilent, notundetermined— it no longer needs the marker, and itsREFUSE-UNSPELLABLErow is untouched and uncontradicted (neither hint reaches an arbitrary file at the top ofscripts).Each reason names the roots walked, the recorded share, and the verdict it agrees with:
check:init-service-contractwalk(join(ROOT, 'packages')), non-test.ts— 2182 of 5837 (37.4%, base 2aa8456)check:live-db-isolationROOTS= packages, apps, examples; every.ts/.mtsnon-.d.ts— 5269 of 5837 (90.3%)check:meta-type-normalizedSCAN_DIRS=packages/rest/src, non-test sources — 21 of 154 (14%): the file-KIND filter is what cannot be spelled, not the subtreecheck:optional-error-sinkSCAN_ROOTS= packages, non-test.ts— 1898 of 4903 (39%)check:resume-authority-declaredDEFAULT_SCAN_ROOTS= packages, examples — 39% and 68%, refused togethercheck:runner-env-postureSCANNED_ROOTS= packages, apps, examples; non-test source beneath asrcsegment — 35%, 62%, and 0 of 35 under appscheck:settings-bind-windowwalk(join(ROOT, 'packages')), non-test.ts— 2182 of 5837 (37.4%)check:startup-registry-verdictjoin(ROOT, 'packages'), non-test.ts— 2182 of 5837 (37.4%)check:verify-stand-inSCAN_ROOTS= packages, examples — 39% and 68%, refused togethercheck:wildcard-fallthroughwalk(join(ROOT, 'packages')), non-test.ts— 2182 of 5837 (37.4%)Every share is the one recorded in
scripts/pm/bare-root-worklist.mjsat the base that row names, cited as such — not a fresh measurement wearing that row's digits.bare-root-worklist.mjs: the marker accepted, no row deletedThe contradiction check is now the pure
contradictedRows(rows, triage), and a covered row whose gate carries the marker is not contradicted: the marker agrees with the recorded refusal instead of overriding it, which is the deliberate-declaration form the message already permitted — at last without the cost that resolution used to carry (withdrawing the verdict and losing the measured reason). No row is deleted, edited or re-pointed.Both directions are pinned on fixtures, and the fixtures are the point: the live direction is vacuous on this tree (9 rows' gates carry the marker, none of them covered), so a live-only pin would be an assertion over an empty set that reads exactly like a pass. Beside them, a control names the handoff: the shape this file excuses — a marker sitting above a covering hint — is REFUSED by
widePopulationRefusalin the file that owns markers, so no configuration is excused by both. The self-test verdict line now carries the count.Measurements
Every exit code captured before any pipe (
cmd > log 2>&1; EXIT=$?); every verdict quoted from the gate's own stdout.Residue, both legs on one tree (
--residue README.md, probe path touches none of the ten):8e8860ed82bc5ece1144e6f63bb, channel ablated44e6f63bb41 is today's re-measure of the card's stated 43 — the tree grew (259 families discovered, not 254), so the card's number is stale rather than wrong. Target was ≤ 32; both paired readings are ten below their own before-leg, and the last two are the same tree with only this channel differing. The final-head pair moved to 40/30 because
origin/mainlanded work between the two measurements, which is why both are quoted with the commit they were taken at.Behavioural proof, matched column:
node scripts/pm/dispatch-gates.mjs --commands packages/rest/src/rest-server.ts— exit 0, 39 commands, and none of the ten is among them; stderr states+ 10 famil(ies) DECLARE a population too wide to place and are NOT above. At base those ten hadhints: []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 --commandsemits all ten, because the diff edits their scripts.Ablation (trap-guarded, absolute paths, on-disk proof in both directions). No build leg applies and none is claimed:
node scripts/pm/dispatch-gates.mjsexecutes the source file directly and the self-test lives in that same file — no packageexportsresolution, nodist/.Run twice: the full instrument at
2bc5ece11, and the residue legs again at the final head44e6f63bbso the numbers quoted above belong to the tree that was pushed.The five failing cases are exactly this channel's placement pins, three fixture and two live:
Gates. The derived family for this diff —
node scripts/pm/dispatch-gates.mjs --changed --commands --repo objectstack-ai/objectstack, 39 commands — was run in full, plusnode scripts/pm/dispatch-gates.mjs --self-test: 40 of 40 exit 0, on the final head44e6f63bb(git rev-parse --short HEADat that run), in one locked batch —os-verify-lockslotissue-15341,VERDICT command-exit 0 · held the lock 1085s (18m05s) · waited 45s. The command set was re-derived after mergingorigin/mainand is identical to the pre-merge derivation. Verdict lines:✓ dispatch-gates self-test: 1478 cases pass.(base was 1445; +33, none weakened, none deleted) — the same line frompnpm 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).✓ check-self-test-wired: every one of the 172 script(s) CI runs that ship a --self-test has that self-test run by CI.check:*(self-test leg and production leg): exit 0.check-declared-population-live.mjsandcheck-watch-hint-literal.mjswere not edited — rostering the marker required nothing there: it is a comment, not a declaration array.Governed:
node scripts/pm/check-governed-merges.mjs --testover the final twelve-file list — exit 0,governed-surface predicate: 0 of 12 path(s) hit the register (5 surfaces, repo-agnostic). ✅ NOT governed. So this is an ordinary PR, not the governed draft the ruling anticipated: none of the ten gates lives under.claude/**,skills/**ordocs/adr/**. It stays draft because every os-dev PR does, and no review is requested on governance grounds.No changeset:
scripts/publishes nothing from any released package;skip-changesetapplied.NOT MEASURED, by name: no ablation of the
bare-root-worklistacceptance was performed (its live direction is vacuous, as stated above — the fixture pins are what carry it); the whole-repopnpm lintwas not run here and is left to CI; nothing in this run exited 3 or hit aPREREQUISITE NOT MET.🤖 Generated with Claude Code
https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
Generated by Claude Code