docs(audits): the self-test shape census — 179 instruments classified by the floor probe, reconciled with #15410's grep - #15655
Merged
Conversation
… by the floor probe, reconciled with #15410's grep (#15410) #15410 asked for the number it says it does not have: the true split between self-tests that go red when they run zero cases and self-tests that pass vacuously. Measured behaviourally with the repo's own instrument (scripts/measure-self-test-floor.mjs, unmodified — driven in slices through its exported population() / probeEarlyReturn(), because main() exposes neither a file slice nor a spawn budget and this container SIGTERMs a foreground command at ~10 minutes). 179 members: 165 HELD, 4 DEFEATED, 1 ACCIDENT, 9 NOT MEASURED (5.0%, every reason published per row). So 165 of 179 provably refuse on zero cases — not 20 of 170 — and the hole is 4 scripts plus 1 accident, not 150. The card's grep is the instrument that is wrong: its three classes sum to 153 against a stated population of 170, and the repo's own published static criterion, run over the content those files had at the card's own sha (a56baa2), answers 164 ROSTER + 1 COUNT + 11 NONE where the card answered 20. The #13799 battery programme had already floored the tree when the card was filed. Also measured: #15573's row is a budget, not a property — scripts/pm/dispatch-gates.mjs reads killed by SIGTERM at the default 120 s and HELD at 900 s (648.6 s), reproducing the hand measurement in ENTRY_BY_HAND. No ratchet ships here; the report says why and what the options are. 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 at What was checked
Generated by Claude Code |
baozhoutao
marked this pull request as ready for review
September 5, 2026 01:55
baozhoutao
enabled auto-merge
September 5, 2026 01:55
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 #15410 — this is the sizing read the card says it does not have. The governed half
(direction 1, writing the shape down in
AGENTS.md) stays open and is a separate PR.Ships one file:
docs/audits/2026-09-self-test-shape-census.md.The number
Measured behaviourally with the repo's own instrument,
scripts/measure-self-test-floor.mjs(unmodified — #15573 is bare on it; it was driven in slices through its exported
population()/probeEarlyReturn()/ENTRY_BY_HAND/runControls(), becausemain()exposes neither a file slice nor a spawn budget and this container SIGTERMs a foreground command
at ~10 minutes). The probe injects
return;as the first statement of the function the dispatchcalls, so the self-test runs zero cases, and reads what the gate then does.
165 of 179 — not 20 of 170 — provably go red on zero cases. The hole is 4 scripts plus 1
accident, not 150.
The 4:
check-closing-keyword-parity.mjs,check-pnpm-filter-targets.mjs,check-settings-bind-window.mjs,pnpm-filter-targets.mjs. All exit 0 printing zero bytes,all four for the same reason — the dispatch discards the self-test's completion, so an early
returnyieldsundefinedandprocess.exit(undefined)is exit 0. The accident:scripts/audits/14744-before-update-per-row-value-census.mjs. Repairing them is #13799's batchprogramme, not this PR.
The reconciliation — the card's grep is the instrument that is wrong
The card published its three totals but not the grep and not a per-script classification, so the
classes cannot be re-run row by row. Two checks are still available and both go against it.
170. Seventeen scripts are in the headline claim's denominator and in none of the three classes.
card answered 20.
classifyFloor()run over the content the census's files had ata56baa2bd: 164 ROSTER + 1 COUNT + 11 NONE (3 not yet in the tree). The 155 of 158 scripts/** self-tests have no assertion floor: a battery that never ran is indistinguishable from one that passed #13799 batteryprogramme had already floored the tree when the card was filed; the card's grep did not see
SELF_TEST_BATTERIES/declaredBatteries, which 165 files underscripts/named at that sha.And the two instruments agree today, with a direction:
Every DEFEATED row is a static
NONE; no floored row is DEFEATED — the directionmeasure-self-test-floor.mjsclaims for its criterion, confirmed against behaviour rather thanasserted.
Also measured: #15573's row is a budget, not a property.
scripts/pm/dispatch-gates.mjsreadskilled by SIGTERMat the instrument's default 120 s and HELD at 900 s (648.6 s), reproducingthe hand measurement recorded in
ENTRY_BY_HAND.⛔ No ratchet ships here — and no unread baseline file either
The dispatch allowed a shrink-only ratchet if the probe cost fits ~30 s. It does not: a
probe-backed assertion spawns every member twice — ~7 minutes for 178 members plus 648 s for the
slowest one. The fallback offered was to ship the baseline JSON with the assertion behind a flag
the workflow does not set. That is declined with the reason on the record: a shrink-only
ratchet baseline that no gate reads is a declared population nothing consumes, and a gate assertion
behind a flag CI never sets is a check that evaluates never — both are the defect class #15410
itself belongs to. The same list is in the audit, dated and tree-stamped, and the baseline can be
regenerated from the instrument in one command once a direction is chosen.
The card's premise is also partly falsified, which is why the direction-2 decision goes back to
the PM rather than being taken here: direction 2 was costed against 150 unknown scripts; against 4
known ones, and at the price of giving
check-self-test-wired.mjsa second subject, the trade isdifferent. The card's documentation half is untouched and stands exactly as filed.
Verification
Tree:
b42fe1ee5(rebased ontoorigin/main1be26b0de). Exit codes captured before anypipe; verdict lines quoted from the gates themselves.
node scripts/measure-self-test-floor.mjs179 file(s) under scripts/ dispatch on --self-test·12 of 179NONE · 166 roster, 1 countnode scripts/pm/dispatch-gates.mjs --changed --commands --repo objectstack-ai/objectstacknode scripts/check-ci-filter-parity.mjsnode scripts/check-closing-keyword-parity.mjsnode scripts/check-closing-keyword-parity.mjs --self-test24 assertions, 5 mutations of the shipped parsers each driven to rednode scripts/check-comment-mask-corpus.mjspnpm --filter @objectstack/lint run check:doc-formula-expressionsPREREQUISITE NOT MET(formula + lint unbuilt) = NOT MEASURED; afterturbo run build --filter=@objectstack/formulaand--filter=@objectstack/lint:58 cases passed,22 record-scoped formula example(s) across 428 files / 1371 TS blocks judged cleanpnpm --filter @objectstack/spec run check:empty-statepnpm --filter @objectstack/spec run check:livenesspnpm --filter @objectstack/spec run check:strictness-ledgerpnpm --filter @objectstack/spec run check:variant-docspnpm check:cross-package-test-inputspnpm check:doc-authoring46 published skill files clean·14808 customer-facing string(s) across 756 spec sources cleanpnpm check:driver-memory-censuspnpm check:merge-driverpnpm check:nul-bytes75 assertions over a temp git repo·scanned 7574 text file(s) ... no raw ASCII control bytespnpm check:refd-timer-probepnpm check:watch-hint-literalNOT MEASURED, by name: the three families dispatch-gates prints as taking a value from the
workflow (
check-cross-package-test-inputs --union-into,check-shard-attestation --emit,check-test-completeness) — their argv carries a variable with no value outside a CI run.check:pm-dispatch-gateswas not derived for this change set and was not run; no script itreads is in the diff.
No changeset: the diff is
docs/audits/**only, which publishes nothing from any package.skip-changesetapplied and read back.🤖 Generated with Claude Code
https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
Generated by Claude Code