Repository navigation
test(scripts): batch 7 pilot — floor check-sdui-manifest on its own table row labels - #15271
Merged
Merged
Conversation
…its own row labels Batch 7 pilot for the assertion-floor card: the first of the ten table-driven `scripts/**` self-tests, whose natural roster is the table's own named rows rather than sections. `failures === 0` was this self-test's only success condition, so "every case held" and "the cases never ran" printed the same line. The sink here (`failures++`) writes only on failure, so routing it through `registerCase()` would invert the floor rather than install it: a fully green run would register nothing. So each row label in the literal `cases` table becomes a declared battery with a floor of 1, and `registerCase(name)` is the first statement of the driving loop body — attributing the case to the row actually being run. The roster is a LITERAL the table is checked against, never derived from it: a derived roster lets a deleted row delete its own floor. The roster's own size is pinned, which is also what refuses a duplicate row label at declaration time; a table cross-check names which label collided. No assertion condition touched, no control flow rewritten, the verdict handshake kept as landed. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
…dentical The floor's evidence is the refusal, not the success line, so the green-tree stdout stays exactly as landed. The failure line keeps its corrected wording — floor breaches are counted in the same sink as case failures, so "N case(s) failed" would have been inaccurate — but that line is only reachable on a red run. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
baozhoutao
marked this pull request as ready for review
September 4, 2026 08:28
baozhoutao
enabled auto-merge
September 4, 2026 08:28
baozhoutao
pushed a commit
that referenced
this pull request
Sep 4, 2026
`failed === 0` was this self-test's only success condition, so "every case held" and "the cases never ran" printed the same line (#13489). Recipe A, as the batch 7 pilot (PR #15271) settled it for the table-driven class: each of the 14 rows of the literal `cases` table is a declared battery under its own label verbatim, floor 1, and `registerCase(name)` is the first statement of the driving loop body. The roster is a LITERAL the table is checked against — never derived from it — and its own size is pinned at 14, which is also half of the duplicate-label refusal. No assertion condition touched, no control flow rewritten, no comment promoted to a section head, verdict handshake unchanged. The red-run line becomes `N failure(s) (cases and floor)` because floor breaches report into the same sink; the green line is byte-identical to main's. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
baozhoutao
pushed a commit
that referenced
this pull request
Sep 4, 2026
…-test `failed === 0` was this self-test's only success condition, so "every case held" and "the cases never ran" printed the same line (#13489). Recipe A, as the batch 7 pilot (PR #15271) settled it: each of the 18 rows of the literal `cases` table is a declared battery under its own `label` verbatim, floor 1, roster size pinned at 18. `registerCase(c.label)` is the FIRST statement of the driving loop body — ahead of the `try` whose `catch` ends in `continue` and ahead of the two guards that do the same, because the floor asserts REACH and a registration behind a guard reintroduces the inversion. Scope stated in place: the four discovery-block assertions below the loop are not rows of the table (the verdict has always printed 18 rows, not the 22 assertions that run), so they are left exactly as they are. No assertion condition touched, no control flow rewritten, no comment promoted to a section head, verdict handshake unchanged. Red-run line becomes `N failure(s) (cases and floor)`; the green line is byte-identical to main's. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
baozhoutao
pushed a commit
that referenced
this pull request
Sep 4, 2026
…self-test `failures === 0` was this self-test's only success condition, so "every case held" and "the cases never ran" printed the same line (#13489). Recipe A, as the batch 7 pilot (PR #15271) settled it: each of the 18 rows of the literal `cases` table is a declared battery under its own `name` verbatim, floor 1, roster size pinned at 18, and `registerCase(c.name)` is the first statement of the driving loop body. Scope stated in place: the eight `expectRoot(...)` assertions of the dead-root reverse proof below the loop are not rows of the table — the verdict line has always counted the 18 analysis rows and named that proof separately — so they are left exactly as they are. No assertion condition touched, no control flow rewritten, no comment promoted to a section head, verdict handshake unchanged. Red-run line becomes `N failure(s) (cases and floor)`; the green line is byte-identical to main's. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
baozhoutao
pushed a commit
that referenced
this pull request
Sep 4, 2026
`failed === 0` was this self-test's only success condition, so "every case held" and "the cases never ran" printed the same line (#13489). Recipe A, as the batch 7 pilot (PR #15271) settled it: each of the 23 rows of the literal mask/strip `cases` table is a declared battery under its own label verbatim, floor 1, roster size pinned at 23, and `registerCase(name)` is the first statement of the driving loop body. Scope stated in place: the twelve `interpolation`-view assertions below the corpus loop are NOT a second literal table — their rows exist only because an `x(...)` call pushed them onto `extra` at runtime, so a roster taken from that loop would be DERIVED and a deleted call would delete its own floor. They are left exactly as they are and the verdict keeps counting them separately. This module is a LIBRARY the gates import, so the change is proved from the consumer side too: six importers' `--self-test` runs (comment-mask-corpus, comment-mask-adoption, error-code-casing, entry-guard, declaration-mirrors, watch-hint-literal) are byte-identical to the base tree's on both streams and green in normal mode on the edited tree. No assertion condition touched, no control flow rewritten, no comment promoted to a section head, verdict handshake unchanged. Red-run line becomes `N failure(s) (cases and floor)`; the green line is byte-identical to main's. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
baozhoutao
pushed a commit
that referenced
this pull request
Sep 4, 2026
…ble rows Recipe A as the pilot PR #15271 settled it: each of the 17 row labels of the literal `cases` table is a declared battery with a floor of 1, `registerCase(name)` is the first statement of the driving loop body, and the roster is a LITERAL the table is cross-checked against so a deleted or renamed row names ITSELF rather than deleting its own floor. Roster size pinned at 17; duplicate labels are refused from both sides. The three `// --- ... ---` comments inside the array are grouping rules, not section heads. The boolean `passed` becomes a `failures` counter so the red line can carry the recipe's wording, `N failure(s) (cases and floor)`; no assertion condition is touched and the green line is byte-identical to the base tree's. Part of #13799 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
baozhoutao
pushed a commit
that referenced
this pull request
Sep 4, 2026
…table rows Recipe A per the pilot PR #15271: every row label is a declared battery with a floor of 1, `registerCase(name)` is the first statement of the driving loop, the roster is a LITERAL cross-checked against the table, size pinned at 155. The only deleted line is the red-run verdict, reworded to the recipe's `N failure(s) (cases and floor)`; the green line stays byte-identical. The batch-8 census flagged this table's four `...(() => { ... })()` spreads as an IIFE-produced block whose rows could not take a literal roster key. Measured, that premise does not hold here: each IIFE is a SCOPING device that declares local fixture consts and then returns an array of LITERAL [label, actual, expected] rows. No label is a template string or computed, and no row comes from a map/push/loop. Three independent readings agree on 155 -- labels extracted from source, literal row starts, and the `cases.length` the green line prints on a run -- so ALL 155 rows are floored with no residue, rather than the partition the row anticipated. Part of #13799 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
akarma-synetal
pushed a commit
to akarma-synetal/framework
that referenced
this pull request
Sep 9, 2026
…ectstack-ai#13799 batch 7b) (objectstack-ai#15286) * tooling(scripts): row batteries for check-skill-id-lint's self-test `failed === 0` was this self-test's only success condition, so "every case held" and "the cases never ran" printed the same line (objectstack-ai#13489). Recipe A, as the batch 7 pilot (PR objectstack-ai#15271) settled it for the table-driven class: each of the 14 rows of the literal `cases` table is a declared battery under its own label verbatim, floor 1, and `registerCase(name)` is the first statement of the driving loop body. The roster is a LITERAL the table is checked against — never derived from it — and its own size is pinned at 14, which is also half of the duplicate-label refusal. No assertion condition touched, no control flow rewritten, no comment promoted to a section head, verdict handshake unchanged. The red-run line becomes `N failure(s) (cases and floor)` because floor breaches report into the same sink; the green line is byte-identical to main's. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk * tooling(scripts): row batteries for check-agent-model-declared's self-test `failed === 0` was this self-test's only success condition, so "every case held" and "the cases never ran" printed the same line (objectstack-ai#13489). Recipe A, as the batch 7 pilot (PR objectstack-ai#15271) settled it: each of the 18 rows of the literal `cases` table is a declared battery under its own `label` verbatim, floor 1, roster size pinned at 18. `registerCase(c.label)` is the FIRST statement of the driving loop body — ahead of the `try` whose `catch` ends in `continue` and ahead of the two guards that do the same, because the floor asserts REACH and a registration behind a guard reintroduces the inversion. Scope stated in place: the four discovery-block assertions below the loop are not rows of the table (the verdict has always printed 18 rows, not the 22 assertions that run), so they are left exactly as they are. No assertion condition touched, no control flow rewritten, no comment promoted to a section head, verdict handshake unchanged. Red-run line becomes `N failure(s) (cases and floor)`; the green line is byte-identical to main's. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk * tooling(scripts): row batteries for check-startup-registry-verdict's self-test `failures === 0` was this self-test's only success condition, so "every case held" and "the cases never ran" printed the same line (objectstack-ai#13489). Recipe A, as the batch 7 pilot (PR objectstack-ai#15271) settled it: each of the 18 rows of the literal `cases` table is a declared battery under its own `name` verbatim, floor 1, roster size pinned at 18, and `registerCase(c.name)` is the first statement of the driving loop body. Scope stated in place: the eight `expectRoot(...)` assertions of the dead-root reverse proof below the loop are not rows of the table — the verdict line has always counted the 18 analysis rows and named that proof separately — so they are left exactly as they are. No assertion condition touched, no control flow rewritten, no comment promoted to a section head, verdict handshake unchanged. Red-run line becomes `N failure(s) (cases and floor)`; the green line is byte-identical to main's. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk * tooling(scripts): row batteries for js-comment-mask's self-test `failed === 0` was this self-test's only success condition, so "every case held" and "the cases never ran" printed the same line (objectstack-ai#13489). Recipe A, as the batch 7 pilot (PR objectstack-ai#15271) settled it: each of the 23 rows of the literal mask/strip `cases` table is a declared battery under its own label verbatim, floor 1, roster size pinned at 23, and `registerCase(name)` is the first statement of the driving loop body. Scope stated in place: the twelve `interpolation`-view assertions below the corpus loop are NOT a second literal table — their rows exist only because an `x(...)` call pushed them onto `extra` at runtime, so a roster taken from that loop would be DERIVED and a deleted call would delete its own floor. They are left exactly as they are and the verdict keeps counting them separately. This module is a LIBRARY the gates import, so the change is proved from the consumer side too: six importers' `--self-test` runs (comment-mask-corpus, comment-mask-adoption, error-code-casing, entry-guard, declaration-mirrors, watch-hint-literal) are byte-identical to the base tree's on both streams and green in normal mode on the edited tree. No assertion condition touched, no control flow rewritten, no comment promoted to a section head, verdict handshake unchanged. Red-run line becomes `N failure(s) (cases and floor)`; the green line is byte-identical to main's. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk --------- Co-authored-by: Claude <noreply@anthropic.com>
akarma-synetal
pushed a commit
to akarma-synetal/framework
that referenced
this pull request
Sep 9, 2026
…ecipe-A self-tests (objectstack-ai#15307) * test(scripts): floor measure-test-shard-timings' self-test on a registered battery The 22 bare `if (...) throw ...` assertions in `selfTest()` are each wrapped verbatim in the `check(() => { ... })` thunk PR objectstack-ai#15198 landed: the condition is carried in untouched, so no `!` can be dropped while the case still registers and still passes. Zero named section banners, so one hoisted battery (the PR objectstack-ai#14896 / objectstack-ai#15003 / objectstack-ai#15217 shape), floored at the measured 22 with the roster's own size pinned at 1. The floor throws, matching this file's own sink, and is evaluated before the verdict so the success line can only be printed by a run that actually ran its cases. Part of objectstack-ai#13799 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk * test(scripts): floor measure-position-name-fold-census' self-test on a registered battery The 13 `if (...) problems.push(...)` assertion sites in `selfTest()` are each wrapped verbatim in the `check(() => { ... })` thunk PR objectstack-ai#15198 landed. The sink here is FAILURE-ONLY, so routing `problems.push` itself through `registerCase()` would have inverted the floor rather than installing it: a green run would register nothing and the battery would read DID NOT RUN. Zero named banners, so one hoisted battery, floored at the 24 registrations measured on a run (four of the thirteen sites sit inside loops: 9 + 4 + 4 + 2 + 5). The floor lives inside the `!quiet` branch. `main()` gates the PRODUCTION census on `selfTest({ quiet: true })`, which prints no verdict and so makes no claim for a floor to guard; evaluating it there would let a roster edit change what a census run outputs. Both production modes are byte-identical to the base tree. One site stays outside the roster and says so in place: the `catch` arm of the AUDIT_CONTROLS loop ends in `continue`, illegal inside the thunk's arrow function, and rewriting that control flow is exactly what the verbatim rule forbids. Its sibling in the same loop body is floored, so a loop that stops running still reds. Part of objectstack-ai#13799 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk * test(scripts): floor check-override-consistency's self-test on its table rows Recipe A as the pilot PR objectstack-ai#15271 settled it: each of the 17 row labels of the literal `cases` table is a declared battery with a floor of 1, `registerCase(name)` is the first statement of the driving loop body, and the roster is a LITERAL the table is cross-checked against so a deleted or renamed row names ITSELF rather than deleting its own floor. Roster size pinned at 17; duplicate labels are refused from both sides. The three `// --- ... ---` comments inside the array are grouping rules, not section heads. The boolean `passed` becomes a `failures` counter so the red line can carry the recipe's wording, `N failure(s) (cases and floor)`; no assertion condition is touched and the green line is byte-identical to the base tree's. Part of objectstack-ai#13799 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk * test(scripts): floor check-skill-line-ratchet's self-test on all 155 table rows Recipe A per the pilot PR objectstack-ai#15271: every row label is a declared battery with a floor of 1, `registerCase(name)` is the first statement of the driving loop, the roster is a LITERAL cross-checked against the table, size pinned at 155. The only deleted line is the red-run verdict, reworded to the recipe's `N failure(s) (cases and floor)`; the green line stays byte-identical. The batch-8 census flagged this table's four `...(() => { ... })()` spreads as an IIFE-produced block whose rows could not take a literal roster key. Measured, that premise does not hold here: each IIFE is a SCOPING device that declares local fixture consts and then returns an array of LITERAL [label, actual, expected] rows. No label is a template string or computed, and no row comes from a map/push/loop. Three independent readings agree on 155 -- labels extracted from source, literal row starts, and the `cases.length` the green line prints on a run -- so ALL 155 rows are floored with no residue, rather than the partition the row anticipated. Part of objectstack-ai#13799 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk --------- Co-authored-by: Claude <noreply@anthropic.com>
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 7 PILOT — one file,
scripts/check-sdui-manifest.mjs, the smallest of the ten table-drivenscripts/**self-tests, under recipe A decided in5537261715/5537301204. The pilot exists to settle the shape the other nine copy, so the shape decisions are stated here as a spec rather than left to be read off the diff.failures === 0was this self-test's only success condition, so "every case held" and "the cases never ran" printed the same line.Why the sink cannot carry the floor here
The file is table-driven: one literal
casestable, one loop over it, and a sink (failures++) that writes only when a case fails. Routing that sink throughregisterCase()would register a case only on failure — a fully green run would register 0 and every battery would read DID NOT RUN. That is the floor inverted, not installed. Batch 4's thunk route is no escape for this class either (four of the sibling files carrycontinuein the loop body, which cannot cross a function boundary).The shape, for the next batch to copy verbatim
1. Battery name = the row label, verbatim. The labels already exist in the source as the table's first column, so no authoring judgement is needed, and a refusal line quotes exactly the string a reader greps for. No prefix is added: a prefix would have to be re-derived by every future reader to match a refusal against a row.
Two rows sharing a label are refused at declaration time, by two halves that each hold on their own and were each measured:
SELF_TEST_BATTERIES declares 5 batteries, below the pinned 6;the cases table uses "missing record is RED" as a row label more than once.A shared label would otherwise be one battery for two rows, so the second row could stop running while the first keeps the floor met.
2.
registerCase(name)is the first statement of the driving loop body, attributing the case to the row actually being run, whatever that row asserts afterwards. There is nobattery()opener: for a table-driven self-test the ROW is the battery, so attribution is the loop variable rather than a most-recently-opened section. A per-iteration helper call is already a landed shape (check-doc-frontmatter,check-test-source-alias).3. The roster is a LITERAL the table is checked against — never derived from the table. A derived roster pins nothing: a deleted row would delete its own floor in the same edit. Each row label maps to floor 1, the honest number for a table row (the loop reaches it exactly once per run), and the floors stay floors rather than equalities so a row that grows into several registrations does not red. The roster's own size is pinned at the row count, because deleting an entry silences a floor exactly as effectively as zeroing it.
⛔ No assertion condition touched. ⛔ No control flow rewritten — no
continuetoreturn, no thunk around the loop body, no comment promoted to a section head. The verdict handshake (SELF_TEST_VERDICT) is kept exactly as landed. The twocontinuestatements added live in the new floor block's own loops; the driving loop still has none.One deliberate text change, reachable only on a red run: the failure line reads
N failure(s) (cases and floor)rather thanN case(s) failed, because floor breaches are counted in the same sink as case failures and the old wording would have mis-named them. The green line is byte-identical to the base (below).Verification record
Base worktree at the dispatch pin
460134af8, installed, for the byte comparisons. Branch headfbb42081e.origin/main), +107/−1;skip-changeset(ascripts/**gate publishes from no package)--self-test6 cases behave (green passes; absence, tamper, moved pin, emptiness are RED).sdui.manifest.json is present, intact (sha256 49211fee7792…, 57 components) and fresh at objectui pin 00d3f09c500c…cmpsilent;--self-teststdout sha2566c949991bc56…on both trees, normal-mode stdout449c7ea7428d…on both)declares 6 batteries, below the pinned 7; a single row's floor raised to 2 readsregistered 1 case(s), below its pinned floor of 2, so each row registers exactly once and six rows are declared — 6 registrations, matching the${cases.length}the verdict printsextractWatchHints/^[\w.@][\w.@/*-]*$/over the raw literal, and every row label contains spaces, so no roster key or row label can ever be admitted as a path hint (checked directly against all six labels: all six rejected)node scripts/measure-self-test-floor.mjs --json: NONE 45 to 44, ROSTER 122 to 123, COUNT 2 unchanged — a drop of exactly 1, and the symmetric difference of the two classifications isscripts/check-sdui-manifest.mjsaloneAblations. The implementation was committed before any leg, so the restore had a real reference point. Every mutation is proven on disk by an anchored count plus the blob hash moving off the HEAD blob; every restore by
git checkout HEAD -- paththen hash equality against the HEAD blob and an emptygit diff HEAD; every leg carries atraprestore on EXIT/INT/TERM with absolute paths. Two legs were refused by their own landing check when my anchor assertion miscounted — those are non-measurements, re-run rather than reported as passes.self-test battery "moved pin is RED" DID NOT RUN — 0 cases registered, 1 pinned"moved pin is AMBER" registered 1 case(s) but is not declared in SELF_TEST_BATTERIES, and"moved pin is RED" DID NOT RUNregisterCase()call✗ self-test:case line printed — every original case still passes while the self-test now refusesdeclares 6 batteries, below the pinned 7registered 1 case(s), below its pinned floor of 2declares 5 batteries, below the pinned 6, plus the now-undeclared rowGates
Derived family from
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack, all run in the foreground, plus the always-runs tail and a control-byte scan. Exit codes captured by redirect before any pipe; verdicts quoted from each gate's own line. The full record is in theos-dev-reportcomment on #13799.🤖 Generated with Claude Code
https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
Generated by Claude Code