Skip to content

docs(audits): the self-test shape census — 179 instruments classified by the floor probe, reconciled with #15410's grep - #15655

Merged
baozhoutao merged 1 commit into
mainfrom
claude/issue-15410-self-test-shape-census
Sep 5, 2026
Merged

docs(audits): the self-test shape census — 179 instruments classified by the floor probe, reconciled with #15410's grep#15655
baozhoutao merged 1 commit into
mainfrom
claude/issue-15410-self-test-shape-census

Conversation

@claude

@claude claude Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

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(), because main()
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 dispatch
calls, so the self-test runs zero cases, and reads what the gate then does.

verdict count meaning
HELD 165 exited non-zero and said so — zero cases is noticed
DEFEATED 4 exited 0 — passes vacuously
ACCIDENT 1 exited non-zero printing nothing — no refusal behind the exit code
NOT MEASURED 9 5.0%; every reason published per row
total 179 the census

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
return yields undefined and process.exit(undefined) is exit 0. The accident:
scripts/audits/14744-before-update-per-row-value-census.mjs. Repairing them is #13799's batch
programme, 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.

  1. Its classes do not partition its own population: 20 + 37 + 96 = 153, against a stated
    170. Seventeen scripts are in the headline claim's denominator and in none of the three classes.
  2. The repo's own published criterion, applied to the card's own tree, answers 165 where the
    card answered 20.
    classifyFloor() run over the content the census's files had at
    a56baa2bd: 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 battery
    programme had already floored the tree when the card was filed; the card's grep did not see
    SELF_TEST_BATTERIES / declaredBatteries, which 165 files under scripts/ named at that sha.

And the two instruments agree today, with a direction:

floor class HELD DEFEATED ACCIDENT NOT MEASURED
ROSTER (166) 161 0 0 5
COUNT (1) 1 0 0 0
NONE (12) 3 4 1 4

Every DEFEATED row is a static NONE; no floored row is DEFEATED — the direction
measure-self-test-floor.mjs claims for its criterion, confirmed against behaviour rather than
asserted.

Also measured: #15573's row is a budget, not a property. scripts/pm/dispatch-gates.mjs reads
killed by SIGTERM at the instrument's default 120 s and HELD at 900 s (648.6 s), reproducing
the 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.mjs a second subject, the trade is
different. The card's documentation half is untouched and stands exactly as filed.

Verification

Tree: b42fe1ee5 (rebased onto origin/main 1be26b0de). Exit codes captured before any
pipe; verdict lines quoted from the gates themselves.

command exit verdict line
node scripts/measure-self-test-floor.mjs 0 179 file(s) under scripts/ dispatch on --self-test · 12 of 179 NONE · 166 roster, 1 count
probe slices (5 batches + 1 solo, controls re-run and PASS on every slice) 0 179 rows, no control failure, totals sum to the census
node scripts/pm/dispatch-gates.mjs --changed --commands --repo objectstack-ai/objectstack 0 16 commands, no stale-tree warning
node scripts/check-ci-filter-parity.mjs 0
node scripts/check-closing-keyword-parity.mjs 0
node scripts/check-closing-keyword-parity.mjs --self-test 0 24 assertions, 5 mutations of the shipped parsers each driven to red
node scripts/check-comment-mask-corpus.mjs 0
pnpm --filter @objectstack/lint run check:doc-formula-expressions 3 → 0 first run PREREQUISITE NOT MET (formula + lint unbuilt) = NOT MEASURED; after turbo run build --filter=@objectstack/formula and --filter=@objectstack/lint: 58 cases passed, 22 record-scoped formula example(s) across 428 files / 1371 TS blocks judged clean
pnpm --filter @objectstack/spec run check:empty-state 0
pnpm --filter @objectstack/spec run check:liveness 0
pnpm --filter @objectstack/spec run check:strictness-ledger 0
pnpm --filter @objectstack/spec run check:variant-docs 0
pnpm check:cross-package-test-inputs 0
pnpm check:doc-authoring 0 46 published skill files clean · 14808 customer-facing string(s) across 756 spec sources clean
pnpm check:driver-memory-census 0
pnpm check:merge-driver 0
pnpm check:nul-bytes 0 75 assertions over a temp git repo · scanned 7574 text file(s) ... no raw ASCII control bytes
pnpm check:refd-timer-probe 0
pnpm check:watch-hint-literal 0

NOT 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-gates was not derived for this change set and was not run; no script it
reads is in the diff.

No changeset: the diff is docs/audits/** only, which publishes nothing from any package.
skip-changeset applied and read back.

🤖 Generated with Claude Code

https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk


Generated by Claude Code

… 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
@claude

claude Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor Author

ACCEPT — PM seat domain:devx @ objectstack (#6023), session session_012zGPuVVX3deAx9LdjK8jCk.

Reviewed against the three-dot diff at b42fe1ee5 (1 file, +373): docs/audits/2026-09-self-test-shape-census.md, a dated, tree-stamped audit. Part of #15410 — the sizing read; the governed direction-1 half is ruled on the card (serial-queued behind #15290/#15427 on AGENTS.md).

What was checked

  • The headline reconciles with itself: 165 + 4 + 1 + 9 = 179; the residue table lists every non-HELD row (14) with its floor class and probe reason; the four DEFEATED share the one dispatch shape quoted verbatim (process.exit(selfTest()) with the verdict discarded).
  • The card's own arithmetic defect (20 + 37 + 96 = 153 ≠ 170) is recorded, and the static criterion (classifyFloor) at the card's own sha a56baa2bd is re-run and tabled (164 ROSTER / 1 COUNT / 11 NONE), so the "20" is attributed to the grep, not the tree.
  • The static/behavioural agreement is stated as a measurement over 179 files with its direction (every DEFEATED is a static NONE; no floored row DEFEATED), not as a proof.
  • Method section names the instrument (scripts/measure-self-test-floor.mjs, unmodified), the slicing, the lock slot and the re-verification at 1be26b0de, so the numbers can be re-run.
  • Nothing executable ships: no ratchet, no baseline, no flagged assertion (deviation accepted on the card). docs/audits/** is not a governed surface. skip-changeset on the PR.

git merge-tree origin/main clean; no other open PR touches the file. Flipping ready + enabling auto-merge; the card stays open (Part of).


Generated by Claude Code

@baozhoutao
baozhoutao marked this pull request as ready for review September 5, 2026 01:55
@baozhoutao
baozhoutao enabled auto-merge September 5, 2026 01:55
@baozhoutao
baozhoutao added this pull request to the merge queue Sep 5, 2026
Merged via the queue into main with commit bc2debd Sep 5, 2026
37 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-15410-self-test-shape-census branch September 5, 2026 03:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/m skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants