docs(pm): measure and refuse the aggregate fan-in line, recording it beside the refused fifth key - #13465
Merged
os-project-manager merged 1 commit intoAug 30, 2026
Conversation
…side the refused fifth key The follow-up question to the refused import-edge identity key asked whether one aggregate line per edited module could carry the refused information. Measured over 1,862 first-parent commits on origin/main (2026-08-16..30) at 71627f7: the aggregate-proper case fires on 0.6% of cards and changes no decision there; 93% of firings land on tail modules where the value is the names, and every names-shape is already decided (all names = the refused key; capped names = a fan-in cutoff, the volume rule this file refuses; a bare count withholds the witness where it fires most). Docblock only — no behaviour change; the existing pins stay the staleness alarms. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Pk26oZ12t5N1hwGW1m1MgC
This was referenced Aug 30, 2026
os-project-manager
marked this pull request as ready for review
August 30, 2026 13:57
os-project-manager
enabled auto-merge
August 30, 2026 13:57
os-project-manager
deleted the
claude/issue-13251-aggregate-fan-in-line
branch
August 30, 2026 14:14
This was referenced Aug 30, 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.
Fixes #13251
The card is a question, and the measured answer is NO
The card asks whether
dispatch-gatesshould print an aggregate fan-in line for an edited shared module, carrying the information the refused import-edge identity key (#13126 / PR #13247) left on the floor. This PR ships no behaviour change: it records the measured refusal of the aggregate line in the docblock section where the sibling refusal lives, leaning on the same self-test pins as its staleness alarms. The full measurement is in theos-dev-reportcomment on #13251; the load-bearing figures:How often it would fire — over the live card population (1,862 first-parent commits on
origin/main, 2026-08-16..2026-08-30, window proven byscripts/pm/git-history.mjs:git log --first-parent origin/main since 2026-08-16, floor 2026-08-15, measured at 71627f7):scripts/invoked-as.mjsitself on 2;scripts/pm/dispatch-gates.mjsitself (61 cards), whose line would read "imported by 1 discovered family" — withholding the one name that matters, the already-pinnedbare-root-worklist --self-testwitness.Why no printable shape survives — the three shapes trichotomize:
coveringKeykey, refused in PR Price the import-edge identity key at 232 novel leads and refuse it, pinned to the live tree (#13126) #13247 with pins that re-derive the price every run (today: 241 novel of 282 pairs, invoked-as at 121 families, 207/241 on 5 modules);What the refusal costs, re-priced: 231 of the 241 novel pairs sit in UNFILTERED workflows — CI runs those families on every PR, so the miss stays "one CI round", as the existing docblock prices it. 10 pairs (all on head modules) sit behind paths-filtered patrol workflows (
half-state-patrol.yml,required-set-patrol.yml,prerelease-pin-watch.yml,release-coverage-patrol.yml,validate-deps.yml) where a load break defers past the PR — a count line would not fix those either, since it names nothing runnable.The cheaper homes triage preferred (module-header note, opt-in
--explain) are NOT built, deliberately: the "aggregate lines get read" assumption is unmeasured (the card and triage both flag it), a numeric header note re-creates the rotting-prose drift this tool exists to refuse (the card's own 228 was 234 by filing time and 241 today), and under startup-focus discipline the measured value on the table (up to one CI round on ~8% of cards, if anyone runs the flag) does not buy an always-maintained surface today. If a future card demonstrates pull, the measurement here is its baseline.What changed
scripts/pm/dispatch-gates.mjs— 29 added lines of docblock incoveringKey's refused-fifth-key section, recording the second refusal beside the first. No executable line touched.Verification (all at final head 2384780)
pnpm check:pm-dispatch-gates— "dispatch-gates self-test: 944 cases pass." (same 944 as at merge-base 71627f7); the refused-class pins re-derived live: "241 (family, imported module) pair(s) no key reaches, of 282" · "the witness holds" · "a card editing scripts/invoked-as.mjs would name 121 families" · "207 of 241 novel pair(s) land on 5 module(s)"node scripts/pm/bare-root-worklist.mjs --self-test— "OK self-test: 51 live row(s) ... none stale, none missing, none contradicted."node scripts/check-self-test-wired.mjs— "every one of the 151 script(s) CI runs that ship a --self-test has that self-test run by CI."node scripts/check-nul-bytes.mjs— "OK (scanned 7447 text file(s) ...)"node scripts/pm/dispatch-gates.mjs(no paths, the tool's work leg) — banner: "gate list derived from the tree of 'objectstack-ai/objectstack' at commit 2384780"; 15 families named for this diff; the 10 remaining runnable ones all green locally (agent-test-spelling, bash32-floor, cli-command-ids, cross-package-test-inputs, entry-guard, parse-guard, pnpm-filter-targets, watch-hint-literal, ci-filter-parity, shard-attestation).node scripts/check-test-completeness.mjs— NOT MEASURED locally by its own design (exit 3, "PREREQUISITE NOT MET — grades a saved turbo run test log"); CI supplies the teed log on Test Core.Declared narrowing: whole-repo
pnpm lintis CI's run, not re-run locally; every gate above was run on the committed head after the final commit.skip-changesetapplies: the diff is comments inscripts/pm/**only — nothing publishes from any package.Generated by Claude Code
Generated by Claude Code