test(scripts): batch 10f — six-banner battery roster for pm/bare-root-worklist's self-test - #15408
Merged
Merged
Conversation
…self-test `failures.length === 0` was this self-test's only success condition, so "every case held" and "the cases never ran" printed the same verdict line. The Tier B multi-battery recipe closes that: one battery per named section banner, each roster key byte-equal to the banner it stands for, opened under it, with every case registered after that line attributed to it. A battery that stops registering names the banner a reader can go find instead of a number that says only that something moved. The floors are MEASURED on a run, never planned from static `t(` sites: eight of this body's sites sit inside loops over the file's own tables, so two batteries run several times their static count (65 and 43 against 9 and 7 static). The seven cases that run before the first banner have no section head of their own, so the first battery's opener is hoisted to the top of the body and they are attributed to it — no comment is promoted to a section head. The check sits at this body's own verdict site, immediately above the success line. The early-return hole an end-of-body floor would leave open is closed by the existing `SELF_TEST_VERDICT` handshake, which the dispatch refuses anything else than, so the two holes keep their own guards. No assertion condition, message or argument changes; the green line is byte-identical, and so is normal-mode output. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
…tch10f-bare-root-worklist
baozhoutao
marked this pull request as ready for review
September 4, 2026 14:43
baozhoutao
enabled auto-merge
September 4, 2026 14:43
baozhoutao
deleted the
claude/issue-13799-batch10f-bare-root-worklist
branch
September 4, 2026 15:39
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 #13799
Batch 10f of the assertion-floor programme:
scripts/pm/bare-root-worklist.mjstakes the Tier B multi-battery roster over the SIX named section banners of its
selfTest().failures.length === 0was this self-test's only success condition, so "everycase held" and "the cases never ran" printed the same verdict line. The roster
closes that: what is pinned is the registered NAMES, not a number.
Shape
SELF_TEST_BATTERIES— six keys, each byte-equal to the box-drawingbanner it stands for (checked mechanically, all six match, six openers, one
per banner).
SELF_TEST_BATTERY_FLOOR = 6— deleting an entry silences that battery'sfloor as effectively as zeroing it, so the roster's own size is pinned.
UNATTRIBUTED_BATTERY— a case registered with no battery open reds by setdifference rather than inflating whichever battery ran last.
battery(name)opens a section;registerCase()is called from the blockbody of the existing
t(); the floor is evaluated at this body's own verdictsite, immediately above the success line, into the same
failuressink.their own, so the FIRST battery's opener is hoisted to the top of the body and
they are attributed to it — stated at the banner as well. No comment was
promoted to a section head.
The landed recipe refuses a floor placed before a plain
return. That hole isnot open here and the reason is mechanical: this body's only exit a caller
accepts is the
SELF_TEST_VERDICTsentinel returned BELOW the success line, andthe dispatch refuses anything else — so an early return reds at the HANDSHAKE
while a section that runs to the bottom with its cases gone reds at the FLOOR.
Ablation (e) below measures exactly that split.
Floors: MEASURED on a run, never planned from static sites
All six were pinned at 9999 first; one run produced exactly six breach lines
(counted before any number was read), and those numbers are the floors.
t(sitesBoth loop-driven counts are driven by this file's OWN tables (
TRIAGE,SPELLINGS), not by the live tree, so re-measuring a floor is the same editthat changes a row — the discipline the file already states for its rows.
No behaviour change
and verdict lines only:
t()gains aregisterCase()call in its block body,and the FAILURE line gains " (cases and floor)", the landed spelling.
both,
cmp-clean.stderr, over 134 lines of output — with a base-vs-base control run first to
prove the comparison is a measurement and not two empty streams: there is no
varying line in this tool's normal-mode output.
Ablations
Every mutation proven on disk (anchor count before and after, plus the blob
hash) before its run was read; every restore by
git checkout HEAD -- ABSOLUTE PATHproven by blob-hash equality with the HEAD blob AND an emptygit diff HEAD; the driver carriestrap ... EXIT INT TERM. No build ordistis involved — the script is run directly by node.
registerCase()removed fromt()if (false)guardSELF_TEST_BATTERY_FLOORpinned at 9999returnafter the first caseGates
Exit codes captured by redirect before any pipe.
Derived family,
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack(re-derived after merging currentmain, so theanswer is not from a stale tree): 22 commands, ALL GREEN.
check:pm-dispatch-gatesran in the foreground under the shared verify lock(
scripts/pm/os-verify-lock.sh), five attempts across a busy queue, thenVERDICT command-exit 0 · held the lock 375s (6m15s) · waited 127s, with thegate's own line:
✓ dispatch-gates self-test: 1392 cases pass.The four earlierattempts returned the lock's exit 99, which is NOT MEASURED — neither a red nor
part of any green count.
Always-runs tail:
check-self-test-workflow-commands.mjsand its--self-test,check:declared-population-live,check-self-test-wired.mjs(+--self-test),check:ratchet-remedy-authority,check:nul-bytes,check:watch-hint-literal— all exit 0. Verdict lines, quoted:
check-nul-bytes: OK (scanned 7465 text file(s) -- 7465 tracked, 0 untracked-not-ignored; skipped 7 binary; no raw ASCII control bytes).OK check-ratchet-remedy-authority: 202 scripts swept ...check:declared-population-live — 201 of 252 famil(ies) declare a path population, and every one of them reaches this tree's 7472 tracked file(s).The file's own
--self-test: exit 0, green line byte-identical to base.Instrument, before and after (
node scripts/measure-self-test-floor.mjs --json): 170 records before, 170 after; exactly ONE record moved —scripts/pm/bare-root-worklist.mjsfloor: NONEtofloor: ROSTER. Nothingentered the population and nothing else left it.
extractWatchHintsover this file:[]before,[]after — identical, with apositive control in the same session (
check-cli-command-ids.mjsreturns fourhints,
check-nul-bytes.mjstwo), so the empty answer is a measurement ratherthan a silent extractor. This file still declares no population of its own.
Whole-repo
pnpm lint(eslint . --no-inline-config): exit 0 in 88s. Nonarrowing was needed or claimed.
Gate union run at
7f1242569.skip-changeset: this PR publishes nothing from any package — the only changedpath is
scripts/pm/bare-root-worklist.mjs.🤖 Generated with Claude Code
https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
Generated by Claude Code