Skip to content

Delete coveringKey's four drifted figures and point at the --self-test that derives them - #13806

Merged
os-project-manager merged 2 commits into
mainfrom
claude/issue-13468-coveringkey-docblock-figures
Aug 31, 2026
Merged

Delete coveringKey's four drifted figures and point at the --self-test that derives them#13806
os-project-manager merged 2 commits into
mainfrom
claude/issue-13468-coveringkey-docblock-figures

Conversation

@claude

@claude claude Bot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Fixes #13468

The coveringKey docblock in scripts/pm/dispatch-gates.mjs stated four derived
quantities as prose literals, while the same file's --self-test re-derived all four
live and printed them a few lines below. Nothing ever compared the two, so the prose
drifted and the gate stayed green throughout. Triage ruled: delete the numbers, point at
the run, keep the argument. That is what this PR does.

The figures, re-derived on this branch

Everything below was measured here, on a tree that contains #13783 (which changed
hintCovers — the denominator these figures rest on). Nothing is relayed.

Head af5103cf0. The command is the one the new docblock now tells the reader to run:

node scripts/pm/dispatch-gates.mjs --self-test \
  | grep -A7 'the refused import-edge class'

Its stdout, verbatim:

  the refused import-edge class is real and NOVEL — 245 (family, imported module) pair(s) no key reaches, of 286
  …and the split the refusal quotes is not invented: 41 pair(s) another key already answers, so the novel half is a measurement and not the raw count
  the witness holds — bare-root-worklist --self-test imports THIS file, and no key names that family for a card editing it
  the refusal is still earned — a card editing scripts/invoked-as.mjs would name 123 families under the refused key
  …and the class is still concentrated: 211 of 245 novel pair(s) land on 5 module(s)

Against what the docblock said. The left column is read from the file itself
(git show origin/main:scripts/pm/dispatch-gates.mjs), not from the card:

quantity docblock prose this tree at af5103cf0
(family, imported module) pairs 273 286
novel — no key reaches them 232 245
concentrated on 5 modules 201 211
invoked-as.mjs fan-out 118 123

The self-test's own size has moved too: it runs 1048 cases here, and passes.

The rot is wider than the four figures — measured

Re-deriving the whole numeric surface of that section on this tree turned up drift in
every tree-derived figure it carries, not only the four the card tabulated:

prose this tree
corpus 183 families x 7347 tracked files 191 x 7593
per-module fan-outs 14 -> 55, 13 -> 37, 17 -> 38, 12 -> 23 14 -> 56, 13 -> 38, 17 -> 40, 12 -> 24
tail 21 modules carrying 31 pairs, median 14 -> 15 24 modules, 34 pairs, median 12 -> 14
narrowing "target is not itself a gate file": 63 novel, card to 55 67 novel, card to 56
narrowing "importer is a self-test family": 12 novel, 8 of the 12 unchanged

Only the four are re-derived by any run, so only the four can be replaced by a pointer at
one. The rest are #13126's own measurements and nothing recomputes them, so they are now
labelled as what they are: dated evidence for a decision already taken, with an explicit
instruction to re-measure from that card's commands rather than from this prose. That is
the idiom the aggregate section immediately below already uses for its own firing rates —
this change copies it rather than inventing one.

The argument did not move

Checked before touching the prose, because #13783 changed the coverage predicate underneath
it:

  • Concentration holds — 211 of 245 on five modules (86%), still a large majority, and
    the self-test's own assertion on it is green.
  • Precision holds, more strongly than before — the worst single lead grew from 118 to
    123 families, so the "a list that long is not read" argument is if anything stronger.
  • The tail is still the opposite shape — 24 modules carrying 34 pairs, the median card
    there moving 12 -> 14 against 14 -> 123 at the head. Fan-in is still the only
    property separating the halves.
  • The witness holdsbare-root-worklist.mjs --self-test still imports this file and
    no key still names that family, asserted green in the run above.
  • The two narrowings still earn nothing.

So the fifth key's refusal stands untouched, and nothing here reopens it.

What changed in the file

One file, comments only. No behaviour, no hintCovers, no unreachableReason, no
assertion added or weakened — in particular the self-test was not made to assert the
prose, which would be pinning with extra steps.

  • The four literals are gone from the prose (and from every other sentence in the file
    that repeated them — 232 appeared five times, 118 four).
  • In their place: the exact command, and the four assertion sentences to read, each with
    the quantity it names spelled out. The shape is copied from unreachableReason, which
    already answers a reader with a git ls-files invocation they can run.
  • The remaining sizes in the section are dated to #13126's tree, as described above.

Verification

Local gate family derived after the final commit with
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack (no paths passed —
the script takes its own change set), at af5103cf0. Exit codes were captured before any
pipe; each verdict quotes the gate's own line, never a bare $?.

gate result observed exit
pnpm check:agent-test-spelling GREEN 0
pnpm check:bash32-floor GREEN 0
pnpm check:cli-command-ids GREEN 0
pnpm check:cross-package-test-inputs GREEN 0
pnpm check:entry-guard GREEN 0
pnpm check:parse-guard GREEN 0
pnpm check:pm-dispatch-gates GREEN — dispatch-gates self-test: 1048 cases pass. 0
pnpm check:pnpm-filter-targets GREEN 0
pnpm check:watch-hint-literal GREEN 0
node scripts/check-ci-filter-parity.mjs GREEN — OK: all 129 declared cross-package glob(s) ... are covered 0
node scripts/check-cross-package-test-inputs.mjs GREEN — OK: 24 package(s) read outside themselves, all declared 0
node scripts/check-self-test-wired.mjs GREEN — every one of the 154 script(s) CI runs that ship a --self-test has that self-test run by CI 0
node scripts/check-shard-attestation.mjs GREEN — 2 aggregate gate(s) count 3 declared leg(s) 0
node scripts/check-test-completeness.mjs NOT MEASURED — PREREQUISITE NOT MET — this gate grades a saved 'turbo run test' log, and no log was named. CI's Test Core job supplies that log. 3

The gate-script convention's own obligation: this file's test suite is its --self-test,
run by check:pm-dispatch-gates above (1048 cases, green). No *.test.* file in the repo
exercises it — the two that mention dispatch-gates do so in prose comments about their
own fixtures.

pnpm lint — the repo-wide eslint . --no-inline-config on CI's unconditional list — was
run in full rather than narrowed: GREEN, exit 0, 116s.

Staleness, stated rather than hidden: the derivation prints a STALE TREE warning because
origin/main moved again while this ran. The family it names was identical before and
after merging origin/main into this branch, so the four newer files it flags did not
change the answer; CI runs the real farm regardless.

Changeset

Check Changeset counts changesets this PR adds (diff-filter=A against the merge base)
and has no path-based exemption, so a comment-only edit under scripts/ goes red without
one. This PR adds 0 changesets and releases nothing — scripts/ publishes no package — so
the skip-changeset label is applied, which the workflow's own text names the preferred
route for a PR that declares no release of its own.


Generated by Claude Code

claude added 2 commits August 31, 2026 12:54
…t derives them

The `coveringKey` docblock's refusal of the fifth key (the module a gate
imports) stated four derived quantities as prose literals — total pairs, the
novel half, the top-5 concentration, and the worst module's fan-out. The same
file's `--self-test` re-derives all four live and prints them a few lines
below, and nothing ever compared the two. All four had drifted; the self-test
stayed green throughout.

Delete the four literals and point at the run instead: the exact command, and
the four assertion sentences to read, each with the quantity it names. The
argument is untouched — precision, concentration and provenance-not-volume all
still hold, and the fifth key stays refused.

The remaining sizes in the section are not re-derived by any run, so they are
now labelled for what they are: #13126's measurements over that day's tree,
dated evidence rather than a description of this one. Same rule the aggregate
section already states for its own firing rates.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pk26oZ12t5N1hwGW1m1MgC
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/m skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants