fix(devx): verdict handshake for check-platform-checklist and dispatch-gates self-tests - #14960

Merged
baozhoutao merged 1 commit into
mainfrom
claude/issue-13800-carry-forward-verdict-handshake
Sep 3, 2026
Merged

fix(devx): verdict handshake for check-platform-checklist and dispatch-gates self-tests#14960
baozhoutao merged 1 commit into
mainfrom
claude/issue-13800-carry-forward-verdict-handshake

Conversation

@baozhoutao

Copy link
Copy Markdown
Contributor

Part of #13800

Hole 2 (the verdict handshake) for the four files that card carries forward. Two of the four needed no work — see the falsified premise below — so this PR repairs two and reports measurements for the other two. Fixes is deliberately not used: two rows are delivered as readings, and the card should stay open for triage to close.

Verified at b12a5bda (the head of this branch).

The premise, re-derived — and partly falsified

The card's acceptance criterion was the guard form !== SELF_TEST_VERDICT, with a positive control of 81 files on origin/main, each of the four returning 0.

That marker gives a false zero on two of the four. A second, equally deliberate spelling landed in commit 9acddde9 ("Verdict handshake for 134 scripts/** self-tests that exit 0 on an early return", #14479) — a module-level flag, chosen with the rationale stated in the code: "The self-test's own exit code stays load-bearing, so the handshake is a flag rather than a returned sentinel." Counting only the sentinel cannot see it.

A marker that separates before from after, proven across that commit:

file!== SELF_TEST_VERDICT | ReachedVerdict at 9acddde9^at 9acddde9
check-durability-degradation-log-level.mjs06
check-dispatcher-error-vocabulary.mjs03
check-platform-checklist.mjs00
scripts/pm/dispatch-gates.mjs00

Union control on origin/main: 81 sentinel files + 77 flag files = 158 carrying a handshake in one spelling or the other.

Per-row outcome, each one measured rather than read

Probes inject return; (or a partial early verdict) at a hand-chosen anchor, write the mutation to a copy beside the original — the tracked file is never mutated — prove the mutation is on disk before running, and delete the copy in a finally.

1. scripts/pm/dispatch-gates.mjs — was NOT MEASURED, now measured, defeated, repaired

The card's NOT MEASURED was a property of the instrument, not the file. measure-self-test-floor.mjs's injectEarlyReturn() anchors on the first function selfTest() { in the source; in this file that match is inside a fixture string (a template literal), so the injection only ever produces a SyntaxError. The real definition is at line 10517 and the dispatch was:

if(process.argv.includes('--self-test')){selfTest();// <- result discarded}

Anchored on the real definition, the anchor is unique (1 match) and the reading is clean:

exitoutput
unmodified, before repair0✓ dispatch-gates self-test: 1288 cases pass.
early return, before repair00 bytes
unmodified, after repair0✓ dispatch-gates self-test: 1288 cases pass.
early return, after repair1✗ dispatch-gates self-test: selfTest() returned without reaching its verdict...

Repaired with the landed sentinel form. ENTRY_BY_HAND in measure-self-test-floor.mjs is deliberately left alone: its note stays true of the mechanical probe after this repair, and that file is outside this card's surface.

2. scripts/check-platform-checklist.mjs — was NOT MEASURED, now measured, defeated, repaired

Five batteries returning { checked, failures }, combined by the caller. Both failure shapes the card predicted, measured before the repair:

mutation in selfTestTrapVocabularyexitwhat it printed
return; (bare)1TypeError: Cannot read properties of undefined (reading 'failures') — a crash a one-function probe reads as a handshake
return { failures: [], checked: 0 };0✓ ... 119 assertions (down from 141) — and still claiming in prose that the skipped direction "REFUSES an empty/renamed/reshaped" table

After the repair, all three mutations exit 1 and name the battery that did not finish:

✗ check-platform-checklist self-test: selfTestTrapVocabulary() returned without reaching its verdict,
so its assertions did not all run and no failure of theirs could be reported.

— and the same for selfTestSourceLineCitations(), confirming a late battery is caught too, not just the first.

Spelling: the flag form, not the sentinel, for exactly the reason the two sibling files state — the return value is load-bearing here (it carries checked and failures), so the handshake cannot be the return value. The guard is checked on both legs, including the inline one that runs on every invocation (this gate has no --self-test leg in CI), and it is placed before the .failures read so a bare return reports itself instead of crashing its reader. One requireReachedVerdict() helper carries the landed wording to ten call sites (five batteries × two legs); the check, the message and the exit code are the landed ones — only the tenfold duplication of the prose is factored out.

3. scripts/check-durability-degradation-log-level.mjsalready repaired; untouched

Received hole 2 in 9acddde9 (flag spelling). Both of its entries probed, and both hold:

  • selfTest → exit 1, ✗ ... selfTest() returned without reaching its verdict
  • selfTestReadSeams → exit 1

4. scripts/check-dispatcher-error-vocabulary.mjsalready repaired; untouched

Also from 9acddde9. Probed: exit 1 with the named diagnostic. Its hole 1 (SELF_TEST_BATTERIES, 7 hits, from #13799) is left strictly alone — the two counts are not merged.

The derived list, and the irony

Derived from this worktree after the edits, with --repo asserted:

node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack

One of the two repaired files IS that script. Re-derived both ways on identical explicit inputs — the base version of the script and the repaired one — the derived list is IDENTICAL. The repair changes the self-test handshake, not the derivation.

All 21 derived families re-run at b12a5bda and green, including pnpm check:pm-dispatch-gates (1288 cases) and pnpm check:parse-guard / check:entry-guard / check:nul-bytes. Every exit code was captured before any pipe.

Two derived entries were NOT MEASURED rather than red, both prerequisite refusals and neither a finding:

  • node scripts/check-test-completeness.mjs → exit 3, PREREQUISITE NOT MET — this gate grades a saved turbo run test log, and no log was named. Its own --self-test runs clean (exit 0).
  • node scripts/check-durability-degradation-log-level.mjs on a fresh worktree → exit 3 before pnpm install; re-run after install, exit 0.

One gate is red, and it is red on main too

pnpm check:platform-checklist exits 1 with 4 UNCLASSIFIED coverage findings (batch_endpoints, crud_endpoints, metadata_endpoints, route_generation). Not caused by this PR — the ca3fd4b1 version of the file, run in the same tree, produces the byte-identical four findings (diff of the two finding sets is empty). This gate is deliberately excluded from CI (.github/workflows/lint.yml: "validated by pnpm check:platform-checklist, but by MAINTAINER action"), which is why the drift accumulated unseen. Filed separately rather than fixed here.

skip-changeset: scripts/** publishes nothing.


🤖 Generated with Claude Code

https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk


Generated by Claude Code

…h-gates self-tests
Both dispatches discarded their self-test's completion, so a `return` above the
verdict printed nothing and still exited 0 — an unfinished self-test reported as
a verified gate.
Measured before the repair, on this tree:
* `scripts/pm/dispatch-gates.mjs` — an early return at the real definition of
`selfTest()` took the run from "1288 cases pass" to ZERO bytes of output and
exit 0. The card carried this row as NOT MEASURED because the mechanical
probe anchors on the first `function selfTest() {` in the source, which here
is a fixture STRING: the injection lands inside a template literal and only
ever yields a SyntaxError. That is a limit of the instrument, not of the
file; a hand-read anchor measures it in one run.
* `scripts/check-platform-checklist.mjs` — five batteries returning
`{ checked, failures }` and combined by the caller. A section that stops
running took the verdict from 141 assertions to 119, exited 0, and still
claimed in prose that the direction it had skipped "REFUSES an
empty/renamed/reshaped" table. A bare `return` instead yields `undefined`
and CRASHES the combine — an exit code alone reads that crash as a
handshake rather than as the accident it is.
dispatch-gates takes the landed sentinel form. check-platform-checklist takes
the landed FLAG form (`check-durability-degradation-log-level.mjs`,
`check-dispatcher-error-vocabulary.mjs`) for the reason those files state: the
return value is load-bearing, so the handshake cannot BE the return value. Its
guard is checked on both legs — including the inline one, which is the only leg
CI reaches — before the `.failures` read, so a bare `return` now reports itself
instead of crashing its reader.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 3, 2026
@baozhoutao
baozhoutao marked this pull request as ready for review September 3, 2026 13:51
@baozhoutao
baozhoutao added this pull request to the merge queueSep 3, 2026
Merged via the queue into main with commit 8ea03a9Sep 3, 2026
36 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-13800-carry-forward-verdict-handshake branch September 3, 2026 14:11
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/sskip-changesetPR 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

@baozhoutao@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(devx): verdict handshake for check-platform-checklist and dispatch-gates self-tests - #14960

Merged
baozhoutao merged 1 commit into
mainfrom
claude/issue-13800-carry-forward-verdict-handshake
Sep 3, 2026
Merged

fix(devx): verdict handshake for check-platform-checklist and dispatch-gates self-tests#14960
baozhoutao merged 1 commit into
mainfrom
claude/issue-13800-carry-forward-verdict-handshake

Conversation

@baozhoutao

Copy link
Copy Markdown
Contributor

Part of #13800

Hole 2 (the verdict handshake) for the four files that card carries forward. Two of the four needed no work — see the falsified premise below — so this PR repairs two and reports measurements for the other two. Fixes is deliberately not used: two rows are delivered as readings, and the card should stay open for triage to close.

Verified at b12a5bda (the head of this branch).

The premise, re-derived — and partly falsified

The card's acceptance criterion was the guard form !== SELF_TEST_VERDICT, with a positive control of 81 files on origin/main, each of the four returning 0.

That marker gives a false zero on two of the four. A second, equally deliberate spelling landed in commit 9acddde9 ("Verdict handshake for 134 scripts/** self-tests that exit 0 on an early return", #14479) — a module-level flag, chosen with the rationale stated in the code: "The self-test's own exit code stays load-bearing, so the handshake is a flag rather than a returned sentinel." Counting only the sentinel cannot see it.

A marker that separates before from after, proven across that commit:

file!== SELF_TEST_VERDICT | ReachedVerdict at 9acddde9^at 9acddde9
check-durability-degradation-log-level.mjs06
check-dispatcher-error-vocabulary.mjs03
check-platform-checklist.mjs00
scripts/pm/dispatch-gates.mjs00

Union control on origin/main: 81 sentinel files + 77 flag files = 158 carrying a handshake in one spelling or the other.

Per-row outcome, each one measured rather than read

Probes inject return; (or a partial early verdict) at a hand-chosen anchor, write the mutation to a copy beside the original — the tracked file is never mutated — prove the mutation is on disk before running, and delete the copy in a finally.

1. scripts/pm/dispatch-gates.mjs — was NOT MEASURED, now measured, defeated, repaired

The card's NOT MEASURED was a property of the instrument, not the file. measure-self-test-floor.mjs's injectEarlyReturn() anchors on the first function selfTest() { in the source; in this file that match is inside a fixture string (a template literal), so the injection only ever produces a SyntaxError. The real definition is at line 10517 and the dispatch was:

if(process.argv.includes('--self-test')){selfTest();// <- result discarded}

Anchored on the real definition, the anchor is unique (1 match) and the reading is clean:

exitoutput
unmodified, before repair0✓ dispatch-gates self-test: 1288 cases pass.
early return, before repair00 bytes
unmodified, after repair0✓ dispatch-gates self-test: 1288 cases pass.
early return, after repair1✗ dispatch-gates self-test: selfTest() returned without reaching its verdict...

Repaired with the landed sentinel form. ENTRY_BY_HAND in measure-self-test-floor.mjs is deliberately left alone: its note stays true of the mechanical probe after this repair, and that file is outside this card's surface.

2. scripts/check-platform-checklist.mjs — was NOT MEASURED, now measured, defeated, repaired

Five batteries returning { checked, failures }, combined by the caller. Both failure shapes the card predicted, measured before the repair:

mutation in selfTestTrapVocabularyexitwhat it printed
return; (bare)1TypeError: Cannot read properties of undefined (reading 'failures') — a crash a one-function probe reads as a handshake
return { failures: [], checked: 0 };0✓ ... 119 assertions (down from 141) — and still claiming in prose that the skipped direction "REFUSES an empty/renamed/reshaped" table

After the repair, all three mutations exit 1 and name the battery that did not finish:

✗ check-platform-checklist self-test: selfTestTrapVocabulary() returned without reaching its verdict,
so its assertions did not all run and no failure of theirs could be reported.

— and the same for selfTestSourceLineCitations(), confirming a late battery is caught too, not just the first.

Spelling: the flag form, not the sentinel, for exactly the reason the two sibling files state — the return value is load-bearing here (it carries checked and failures), so the handshake cannot be the return value. The guard is checked on both legs, including the inline one that runs on every invocation (this gate has no --self-test leg in CI), and it is placed before the .failures read so a bare return reports itself instead of crashing its reader. One requireReachedVerdict() helper carries the landed wording to ten call sites (five batteries × two legs); the check, the message and the exit code are the landed ones — only the tenfold duplication of the prose is factored out.

3. scripts/check-durability-degradation-log-level.mjsalready repaired; untouched

Received hole 2 in 9acddde9 (flag spelling). Both of its entries probed, and both hold:

  • selfTest → exit 1, ✗ ... selfTest() returned without reaching its verdict
  • selfTestReadSeams → exit 1

4. scripts/check-dispatcher-error-vocabulary.mjsalready repaired; untouched

Also from 9acddde9. Probed: exit 1 with the named diagnostic. Its hole 1 (SELF_TEST_BATTERIES, 7 hits, from #13799) is left strictly alone — the two counts are not merged.

The derived list, and the irony

Derived from this worktree after the edits, with --repo asserted:

node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack

One of the two repaired files IS that script. Re-derived both ways on identical explicit inputs — the base version of the script and the repaired one — the derived list is IDENTICAL. The repair changes the self-test handshake, not the derivation.

All 21 derived families re-run at b12a5bda and green, including pnpm check:pm-dispatch-gates (1288 cases) and pnpm check:parse-guard / check:entry-guard / check:nul-bytes. Every exit code was captured before any pipe.

Two derived entries were NOT MEASURED rather than red, both prerequisite refusals and neither a finding:

  • node scripts/check-test-completeness.mjs → exit 3, PREREQUISITE NOT MET — this gate grades a saved turbo run test log, and no log was named. Its own --self-test runs clean (exit 0).
  • node scripts/check-durability-degradation-log-level.mjs on a fresh worktree → exit 3 before pnpm install; re-run after install, exit 0.

One gate is red, and it is red on main too

pnpm check:platform-checklist exits 1 with 4 UNCLASSIFIED coverage findings (batch_endpoints, crud_endpoints, metadata_endpoints, route_generation). Not caused by this PR — the ca3fd4b1 version of the file, run in the same tree, produces the byte-identical four findings (diff of the two finding sets is empty). This gate is deliberately excluded from CI (.github/workflows/lint.yml: "validated by pnpm check:platform-checklist, but by MAINTAINER action"), which is why the drift accumulated unseen. Filed separately rather than fixed here.

skip-changeset: scripts/** publishes nothing.


🤖 Generated with Claude Code

https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk


Generated by Claude Code

…h-gates self-tests
Both dispatches discarded their self-test's completion, so a `return` above the
verdict printed nothing and still exited 0 — an unfinished self-test reported as
a verified gate.
Measured before the repair, on this tree:
* `scripts/pm/dispatch-gates.mjs` — an early return at the real definition of
`selfTest()` took the run from "1288 cases pass" to ZERO bytes of output and
exit 0. The card carried this row as NOT MEASURED because the mechanical
probe anchors on the first `function selfTest() {` in the source, which here
is a fixture STRING: the injection lands inside a template literal and only
ever yields a SyntaxError. That is a limit of the instrument, not of the
file; a hand-read anchor measures it in one run.
* `scripts/check-platform-checklist.mjs` — five batteries returning
`{ checked, failures }` and combined by the caller. A section that stops
running took the verdict from 141 assertions to 119, exited 0, and still
claimed in prose that the direction it had skipped "REFUSES an
empty/renamed/reshaped" table. A bare `return` instead yields `undefined`
and CRASHES the combine — an exit code alone reads that crash as a
handshake rather than as the accident it is.
dispatch-gates takes the landed sentinel form. check-platform-checklist takes
the landed FLAG form (`check-durability-degradation-log-level.mjs`,
`check-dispatcher-error-vocabulary.mjs`) for the reason those files state: the
return value is load-bearing, so the handshake cannot BE the return value. Its
guard is checked on both legs — including the inline one, which is the only leg
CI reaches — before the `.failures` read, so a bare `return` now reports itself
instead of crashing its reader.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 3, 2026
@baozhoutao
baozhoutao marked this pull request as ready for review September 3, 2026 13:51
@baozhoutao
baozhoutao added this pull request to the merge queueSep 3, 2026
Merged via the queue into main with commit 8ea03a9Sep 3, 2026
36 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-13800-carry-forward-verdict-handshake branch September 3, 2026 14:11
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/sskip-changesetPR 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

@baozhoutao@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(devx): verdict handshake for check-platform-checklist and dispatch-gates self-tests - #14960

Merged
baozhoutao merged 1 commit into
mainfrom
claude/issue-13800-carry-forward-verdict-handshake
Sep 3, 2026
Merged

fix(devx): verdict handshake for check-platform-checklist and dispatch-gates self-tests#14960
baozhoutao merged 1 commit into
mainfrom
claude/issue-13800-carry-forward-verdict-handshake

Conversation

@baozhoutao

Copy link
Copy Markdown
Contributor

Part of #13800

Hole 2 (the verdict handshake) for the four files that card carries forward. Two of the four needed no work — see the falsified premise below — so this PR repairs two and reports measurements for the other two. Fixes is deliberately not used: two rows are delivered as readings, and the card should stay open for triage to close.

Verified at b12a5bda (the head of this branch).

The premise, re-derived — and partly falsified

The card's acceptance criterion was the guard form !== SELF_TEST_VERDICT, with a positive control of 81 files on origin/main, each of the four returning 0.

That marker gives a false zero on two of the four. A second, equally deliberate spelling landed in commit 9acddde9 ("Verdict handshake for 134 scripts/** self-tests that exit 0 on an early return", #14479) — a module-level flag, chosen with the rationale stated in the code: "The self-test's own exit code stays load-bearing, so the handshake is a flag rather than a returned sentinel." Counting only the sentinel cannot see it.

A marker that separates before from after, proven across that commit:

file!== SELF_TEST_VERDICT | ReachedVerdict at 9acddde9^at 9acddde9
check-durability-degradation-log-level.mjs06
check-dispatcher-error-vocabulary.mjs03
check-platform-checklist.mjs00
scripts/pm/dispatch-gates.mjs00

Union control on origin/main: 81 sentinel files + 77 flag files = 158 carrying a handshake in one spelling or the other.

Per-row outcome, each one measured rather than read

Probes inject return; (or a partial early verdict) at a hand-chosen anchor, write the mutation to a copy beside the original — the tracked file is never mutated — prove the mutation is on disk before running, and delete the copy in a finally.

1. scripts/pm/dispatch-gates.mjs — was NOT MEASURED, now measured, defeated, repaired

The card's NOT MEASURED was a property of the instrument, not the file. measure-self-test-floor.mjs's injectEarlyReturn() anchors on the first function selfTest() { in the source; in this file that match is inside a fixture string (a template literal), so the injection only ever produces a SyntaxError. The real definition is at line 10517 and the dispatch was:

if(process.argv.includes('--self-test')){selfTest();// <- result discarded}

Anchored on the real definition, the anchor is unique (1 match) and the reading is clean:

exitoutput
unmodified, before repair0✓ dispatch-gates self-test: 1288 cases pass.
early return, before repair00 bytes
unmodified, after repair0✓ dispatch-gates self-test: 1288 cases pass.
early return, after repair1✗ dispatch-gates self-test: selfTest() returned without reaching its verdict...

Repaired with the landed sentinel form. ENTRY_BY_HAND in measure-self-test-floor.mjs is deliberately left alone: its note stays true of the mechanical probe after this repair, and that file is outside this card's surface.

2. scripts/check-platform-checklist.mjs — was NOT MEASURED, now measured, defeated, repaired

Five batteries returning { checked, failures }, combined by the caller. Both failure shapes the card predicted, measured before the repair:

mutation in selfTestTrapVocabularyexitwhat it printed
return; (bare)1TypeError: Cannot read properties of undefined (reading 'failures') — a crash a one-function probe reads as a handshake
return { failures: [], checked: 0 };0✓ ... 119 assertions (down from 141) — and still claiming in prose that the skipped direction "REFUSES an empty/renamed/reshaped" table

After the repair, all three mutations exit 1 and name the battery that did not finish:

✗ check-platform-checklist self-test: selfTestTrapVocabulary() returned without reaching its verdict,
so its assertions did not all run and no failure of theirs could be reported.

— and the same for selfTestSourceLineCitations(), confirming a late battery is caught too, not just the first.

Spelling: the flag form, not the sentinel, for exactly the reason the two sibling files state — the return value is load-bearing here (it carries checked and failures), so the handshake cannot be the return value. The guard is checked on both legs, including the inline one that runs on every invocation (this gate has no --self-test leg in CI), and it is placed before the .failures read so a bare return reports itself instead of crashing its reader. One requireReachedVerdict() helper carries the landed wording to ten call sites (five batteries × two legs); the check, the message and the exit code are the landed ones — only the tenfold duplication of the prose is factored out.

3. scripts/check-durability-degradation-log-level.mjsalready repaired; untouched

Received hole 2 in 9acddde9 (flag spelling). Both of its entries probed, and both hold:

  • selfTest → exit 1, ✗ ... selfTest() returned without reaching its verdict
  • selfTestReadSeams → exit 1

4. scripts/check-dispatcher-error-vocabulary.mjsalready repaired; untouched

Also from 9acddde9. Probed: exit 1 with the named diagnostic. Its hole 1 (SELF_TEST_BATTERIES, 7 hits, from #13799) is left strictly alone — the two counts are not merged.

The derived list, and the irony

Derived from this worktree after the edits, with --repo asserted:

node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack

One of the two repaired files IS that script. Re-derived both ways on identical explicit inputs — the base version of the script and the repaired one — the derived list is IDENTICAL. The repair changes the self-test handshake, not the derivation.

All 21 derived families re-run at b12a5bda and green, including pnpm check:pm-dispatch-gates (1288 cases) and pnpm check:parse-guard / check:entry-guard / check:nul-bytes. Every exit code was captured before any pipe.

Two derived entries were NOT MEASURED rather than red, both prerequisite refusals and neither a finding:

  • node scripts/check-test-completeness.mjs → exit 3, PREREQUISITE NOT MET — this gate grades a saved turbo run test log, and no log was named. Its own --self-test runs clean (exit 0).
  • node scripts/check-durability-degradation-log-level.mjs on a fresh worktree → exit 3 before pnpm install; re-run after install, exit 0.

One gate is red, and it is red on main too

pnpm check:platform-checklist exits 1 with 4 UNCLASSIFIED coverage findings (batch_endpoints, crud_endpoints, metadata_endpoints, route_generation). Not caused by this PR — the ca3fd4b1 version of the file, run in the same tree, produces the byte-identical four findings (diff of the two finding sets is empty). This gate is deliberately excluded from CI (.github/workflows/lint.yml: "validated by pnpm check:platform-checklist, but by MAINTAINER action"), which is why the drift accumulated unseen. Filed separately rather than fixed here.

skip-changeset: scripts/** publishes nothing.


🤖 Generated with Claude Code

https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk


Generated by Claude Code

…h-gates self-tests
Both dispatches discarded their self-test's completion, so a `return` above the
verdict printed nothing and still exited 0 — an unfinished self-test reported as
a verified gate.
Measured before the repair, on this tree:
* `scripts/pm/dispatch-gates.mjs` — an early return at the real definition of
`selfTest()` took the run from "1288 cases pass" to ZERO bytes of output and
exit 0. The card carried this row as NOT MEASURED because the mechanical
probe anchors on the first `function selfTest() {` in the source, which here
is a fixture STRING: the injection lands inside a template literal and only
ever yields a SyntaxError. That is a limit of the instrument, not of the
file; a hand-read anchor measures it in one run.
* `scripts/check-platform-checklist.mjs` — five batteries returning
`{ checked, failures }` and combined by the caller. A section that stops
running took the verdict from 141 assertions to 119, exited 0, and still
claimed in prose that the direction it had skipped "REFUSES an
empty/renamed/reshaped" table. A bare `return` instead yields `undefined`
and CRASHES the combine — an exit code alone reads that crash as a
handshake rather than as the accident it is.
dispatch-gates takes the landed sentinel form. check-platform-checklist takes
the landed FLAG form (`check-durability-degradation-log-level.mjs`,
`check-dispatcher-error-vocabulary.mjs`) for the reason those files state: the
return value is load-bearing, so the handshake cannot BE the return value. Its
guard is checked on both legs — including the inline one, which is the only leg
CI reaches — before the `.failures` read, so a bare `return` now reports itself
instead of crashing its reader.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 3, 2026
@baozhoutao
baozhoutao marked this pull request as ready for review September 3, 2026 13:51
@baozhoutao
baozhoutao added this pull request to the merge queueSep 3, 2026
Merged via the queue into main with commit 8ea03a9Sep 3, 2026
36 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-13800-carry-forward-verdict-handshake branch September 3, 2026 14:11
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/sskip-changesetPR 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

@baozhoutao@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(devx): verdict handshake for check-platform-checklist and dispatch-gates self-tests - #14960

Merged
baozhoutao merged 1 commit into
mainfrom
claude/issue-13800-carry-forward-verdict-handshake
Sep 3, 2026
Merged

fix(devx): verdict handshake for check-platform-checklist and dispatch-gates self-tests#14960
baozhoutao merged 1 commit into
mainfrom
claude/issue-13800-carry-forward-verdict-handshake

Conversation

@baozhoutao

Copy link
Copy Markdown
Contributor

Part of #13800

Hole 2 (the verdict handshake) for the four files that card carries forward. Two of the four needed no work — see the falsified premise below — so this PR repairs two and reports measurements for the other two. Fixes is deliberately not used: two rows are delivered as readings, and the card should stay open for triage to close.

Verified at b12a5bda (the head of this branch).

The premise, re-derived — and partly falsified

The card's acceptance criterion was the guard form !== SELF_TEST_VERDICT, with a positive control of 81 files on origin/main, each of the four returning 0.

That marker gives a false zero on two of the four. A second, equally deliberate spelling landed in commit 9acddde9 ("Verdict handshake for 134 scripts/** self-tests that exit 0 on an early return", #14479) — a module-level flag, chosen with the rationale stated in the code: "The self-test's own exit code stays load-bearing, so the handshake is a flag rather than a returned sentinel." Counting only the sentinel cannot see it.

A marker that separates before from after, proven across that commit:

file!== SELF_TEST_VERDICT | ReachedVerdict at 9acddde9^at 9acddde9
check-durability-degradation-log-level.mjs06
check-dispatcher-error-vocabulary.mjs03
check-platform-checklist.mjs00
scripts/pm/dispatch-gates.mjs00

Union control on origin/main: 81 sentinel files + 77 flag files = 158 carrying a handshake in one spelling or the other.

Per-row outcome, each one measured rather than read

Probes inject return; (or a partial early verdict) at a hand-chosen anchor, write the mutation to a copy beside the original — the tracked file is never mutated — prove the mutation is on disk before running, and delete the copy in a finally.

1. scripts/pm/dispatch-gates.mjs — was NOT MEASURED, now measured, defeated, repaired

The card's NOT MEASURED was a property of the instrument, not the file. measure-self-test-floor.mjs's injectEarlyReturn() anchors on the first function selfTest() { in the source; in this file that match is inside a fixture string (a template literal), so the injection only ever produces a SyntaxError. The real definition is at line 10517 and the dispatch was:

if(process.argv.includes('--self-test')){selfTest();// <- result discarded}

Anchored on the real definition, the anchor is unique (1 match) and the reading is clean:

exitoutput
unmodified, before repair0✓ dispatch-gates self-test: 1288 cases pass.
early return, before repair00 bytes
unmodified, after repair0✓ dispatch-gates self-test: 1288 cases pass.
early return, after repair1✗ dispatch-gates self-test: selfTest() returned without reaching its verdict...

Repaired with the landed sentinel form. ENTRY_BY_HAND in measure-self-test-floor.mjs is deliberately left alone: its note stays true of the mechanical probe after this repair, and that file is outside this card's surface.

2. scripts/check-platform-checklist.mjs — was NOT MEASURED, now measured, defeated, repaired

Five batteries returning { checked, failures }, combined by the caller. Both failure shapes the card predicted, measured before the repair:

mutation in selfTestTrapVocabularyexitwhat it printed
return; (bare)1TypeError: Cannot read properties of undefined (reading 'failures') — a crash a one-function probe reads as a handshake
return { failures: [], checked: 0 };0✓ ... 119 assertions (down from 141) — and still claiming in prose that the skipped direction "REFUSES an empty/renamed/reshaped" table

After the repair, all three mutations exit 1 and name the battery that did not finish:

✗ check-platform-checklist self-test: selfTestTrapVocabulary() returned without reaching its verdict,
so its assertions did not all run and no failure of theirs could be reported.

— and the same for selfTestSourceLineCitations(), confirming a late battery is caught too, not just the first.

Spelling: the flag form, not the sentinel, for exactly the reason the two sibling files state — the return value is load-bearing here (it carries checked and failures), so the handshake cannot be the return value. The guard is checked on both legs, including the inline one that runs on every invocation (this gate has no --self-test leg in CI), and it is placed before the .failures read so a bare return reports itself instead of crashing its reader. One requireReachedVerdict() helper carries the landed wording to ten call sites (five batteries × two legs); the check, the message and the exit code are the landed ones — only the tenfold duplication of the prose is factored out.

3. scripts/check-durability-degradation-log-level.mjsalready repaired; untouched

Received hole 2 in 9acddde9 (flag spelling). Both of its entries probed, and both hold:

  • selfTest → exit 1, ✗ ... selfTest() returned without reaching its verdict
  • selfTestReadSeams → exit 1

4. scripts/check-dispatcher-error-vocabulary.mjsalready repaired; untouched

Also from 9acddde9. Probed: exit 1 with the named diagnostic. Its hole 1 (SELF_TEST_BATTERIES, 7 hits, from #13799) is left strictly alone — the two counts are not merged.

The derived list, and the irony

Derived from this worktree after the edits, with --repo asserted:

node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack

One of the two repaired files IS that script. Re-derived both ways on identical explicit inputs — the base version of the script and the repaired one — the derived list is IDENTICAL. The repair changes the self-test handshake, not the derivation.

All 21 derived families re-run at b12a5bda and green, including pnpm check:pm-dispatch-gates (1288 cases) and pnpm check:parse-guard / check:entry-guard / check:nul-bytes. Every exit code was captured before any pipe.

Two derived entries were NOT MEASURED rather than red, both prerequisite refusals and neither a finding:

  • node scripts/check-test-completeness.mjs → exit 3, PREREQUISITE NOT MET — this gate grades a saved turbo run test log, and no log was named. Its own --self-test runs clean (exit 0).
  • node scripts/check-durability-degradation-log-level.mjs on a fresh worktree → exit 3 before pnpm install; re-run after install, exit 0.

One gate is red, and it is red on main too

pnpm check:platform-checklist exits 1 with 4 UNCLASSIFIED coverage findings (batch_endpoints, crud_endpoints, metadata_endpoints, route_generation). Not caused by this PR — the ca3fd4b1 version of the file, run in the same tree, produces the byte-identical four findings (diff of the two finding sets is empty). This gate is deliberately excluded from CI (.github/workflows/lint.yml: "validated by pnpm check:platform-checklist, but by MAINTAINER action"), which is why the drift accumulated unseen. Filed separately rather than fixed here.

skip-changeset: scripts/** publishes nothing.


🤖 Generated with Claude Code

https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk


Generated by Claude Code

…h-gates self-tests
Both dispatches discarded their self-test's completion, so a `return` above the
verdict printed nothing and still exited 0 — an unfinished self-test reported as
a verified gate.
Measured before the repair, on this tree:
* `scripts/pm/dispatch-gates.mjs` — an early return at the real definition of
`selfTest()` took the run from "1288 cases pass" to ZERO bytes of output and
exit 0. The card carried this row as NOT MEASURED because the mechanical
probe anchors on the first `function selfTest() {` in the source, which here
is a fixture STRING: the injection lands inside a template literal and only
ever yields a SyntaxError. That is a limit of the instrument, not of the
file; a hand-read anchor measures it in one run.
* `scripts/check-platform-checklist.mjs` — five batteries returning
`{ checked, failures }` and combined by the caller. A section that stops
running took the verdict from 141 assertions to 119, exited 0, and still
claimed in prose that the direction it had skipped "REFUSES an
empty/renamed/reshaped" table. A bare `return` instead yields `undefined`
and CRASHES the combine — an exit code alone reads that crash as a
handshake rather than as the accident it is.
dispatch-gates takes the landed sentinel form. check-platform-checklist takes
the landed FLAG form (`check-durability-degradation-log-level.mjs`,
`check-dispatcher-error-vocabulary.mjs`) for the reason those files state: the
return value is load-bearing, so the handshake cannot BE the return value. Its
guard is checked on both legs — including the inline one, which is the only leg
CI reaches — before the `.failures` read, so a bare `return` now reports itself
instead of crashing its reader.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 3, 2026
@baozhoutao
baozhoutao marked this pull request as ready for review September 3, 2026 13:51
@baozhoutao
baozhoutao added this pull request to the merge queueSep 3, 2026
Merged via the queue into main with commit 8ea03a9Sep 3, 2026
36 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-13800-carry-forward-verdict-handshake branch September 3, 2026 14:11
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/sskip-changesetPR 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

@baozhoutao@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(devx): verdict handshake for check-platform-checklist and dispatch-gates self-tests - #14960

Merged
baozhoutao merged 1 commit into
mainfrom
claude/issue-13800-carry-forward-verdict-handshake
Sep 3, 2026
Merged

fix(devx): verdict handshake for check-platform-checklist and dispatch-gates self-tests#14960
baozhoutao merged 1 commit into
mainfrom
claude/issue-13800-carry-forward-verdict-handshake

Conversation

@baozhoutao

Copy link
Copy Markdown
Contributor

Part of #13800

Hole 2 (the verdict handshake) for the four files that card carries forward. Two of the four needed no work — see the falsified premise below — so this PR repairs two and reports measurements for the other two. Fixes is deliberately not used: two rows are delivered as readings, and the card should stay open for triage to close.

Verified at b12a5bda (the head of this branch).

The premise, re-derived — and partly falsified

The card's acceptance criterion was the guard form !== SELF_TEST_VERDICT, with a positive control of 81 files on origin/main, each of the four returning 0.

That marker gives a false zero on two of the four. A second, equally deliberate spelling landed in commit 9acddde9 ("Verdict handshake for 134 scripts/** self-tests that exit 0 on an early return", #14479) — a module-level flag, chosen with the rationale stated in the code: "The self-test's own exit code stays load-bearing, so the handshake is a flag rather than a returned sentinel." Counting only the sentinel cannot see it.

A marker that separates before from after, proven across that commit:

file!== SELF_TEST_VERDICT | ReachedVerdict at 9acddde9^at 9acddde9
check-durability-degradation-log-level.mjs06
check-dispatcher-error-vocabulary.mjs03
check-platform-checklist.mjs00
scripts/pm/dispatch-gates.mjs00

Union control on origin/main: 81 sentinel files + 77 flag files = 158 carrying a handshake in one spelling or the other.

Per-row outcome, each one measured rather than read

Probes inject return; (or a partial early verdict) at a hand-chosen anchor, write the mutation to a copy beside the original — the tracked file is never mutated — prove the mutation is on disk before running, and delete the copy in a finally.

1. scripts/pm/dispatch-gates.mjs — was NOT MEASURED, now measured, defeated, repaired

The card's NOT MEASURED was a property of the instrument, not the file. measure-self-test-floor.mjs's injectEarlyReturn() anchors on the first function selfTest() { in the source; in this file that match is inside a fixture string (a template literal), so the injection only ever produces a SyntaxError. The real definition is at line 10517 and the dispatch was:

if(process.argv.includes('--self-test')){selfTest();// <- result discarded}

Anchored on the real definition, the anchor is unique (1 match) and the reading is clean:

exitoutput
unmodified, before repair0✓ dispatch-gates self-test: 1288 cases pass.
early return, before repair00 bytes
unmodified, after repair0✓ dispatch-gates self-test: 1288 cases pass.
early return, after repair1✗ dispatch-gates self-test: selfTest() returned without reaching its verdict...

Repaired with the landed sentinel form. ENTRY_BY_HAND in measure-self-test-floor.mjs is deliberately left alone: its note stays true of the mechanical probe after this repair, and that file is outside this card's surface.

2. scripts/check-platform-checklist.mjs — was NOT MEASURED, now measured, defeated, repaired

Five batteries returning { checked, failures }, combined by the caller. Both failure shapes the card predicted, measured before the repair:

mutation in selfTestTrapVocabularyexitwhat it printed
return; (bare)1TypeError: Cannot read properties of undefined (reading 'failures') — a crash a one-function probe reads as a handshake
return { failures: [], checked: 0 };0✓ ... 119 assertions (down from 141) — and still claiming in prose that the skipped direction "REFUSES an empty/renamed/reshaped" table

After the repair, all three mutations exit 1 and name the battery that did not finish:

✗ check-platform-checklist self-test: selfTestTrapVocabulary() returned without reaching its verdict,
so its assertions did not all run and no failure of theirs could be reported.

— and the same for selfTestSourceLineCitations(), confirming a late battery is caught too, not just the first.

Spelling: the flag form, not the sentinel, for exactly the reason the two sibling files state — the return value is load-bearing here (it carries checked and failures), so the handshake cannot be the return value. The guard is checked on both legs, including the inline one that runs on every invocation (this gate has no --self-test leg in CI), and it is placed before the .failures read so a bare return reports itself instead of crashing its reader. One requireReachedVerdict() helper carries the landed wording to ten call sites (five batteries × two legs); the check, the message and the exit code are the landed ones — only the tenfold duplication of the prose is factored out.

3. scripts/check-durability-degradation-log-level.mjsalready repaired; untouched

Received hole 2 in 9acddde9 (flag spelling). Both of its entries probed, and both hold:

  • selfTest → exit 1, ✗ ... selfTest() returned without reaching its verdict
  • selfTestReadSeams → exit 1

4. scripts/check-dispatcher-error-vocabulary.mjsalready repaired; untouched

Also from 9acddde9. Probed: exit 1 with the named diagnostic. Its hole 1 (SELF_TEST_BATTERIES, 7 hits, from #13799) is left strictly alone — the two counts are not merged.

The derived list, and the irony

Derived from this worktree after the edits, with --repo asserted:

node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack

One of the two repaired files IS that script. Re-derived both ways on identical explicit inputs — the base version of the script and the repaired one — the derived list is IDENTICAL. The repair changes the self-test handshake, not the derivation.

All 21 derived families re-run at b12a5bda and green, including pnpm check:pm-dispatch-gates (1288 cases) and pnpm check:parse-guard / check:entry-guard / check:nul-bytes. Every exit code was captured before any pipe.

Two derived entries were NOT MEASURED rather than red, both prerequisite refusals and neither a finding:

  • node scripts/check-test-completeness.mjs → exit 3, PREREQUISITE NOT MET — this gate grades a saved turbo run test log, and no log was named. Its own --self-test runs clean (exit 0).
  • node scripts/check-durability-degradation-log-level.mjs on a fresh worktree → exit 3 before pnpm install; re-run after install, exit 0.

One gate is red, and it is red on main too

pnpm check:platform-checklist exits 1 with 4 UNCLASSIFIED coverage findings (batch_endpoints, crud_endpoints, metadata_endpoints, route_generation). Not caused by this PR — the ca3fd4b1 version of the file, run in the same tree, produces the byte-identical four findings (diff of the two finding sets is empty). This gate is deliberately excluded from CI (.github/workflows/lint.yml: "validated by pnpm check:platform-checklist, but by MAINTAINER action"), which is why the drift accumulated unseen. Filed separately rather than fixed here.

skip-changeset: scripts/** publishes nothing.


🤖 Generated with Claude Code

https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk


Generated by Claude Code

…h-gates self-tests
Both dispatches discarded their self-test's completion, so a `return` above the
verdict printed nothing and still exited 0 — an unfinished self-test reported as
a verified gate.
Measured before the repair, on this tree:
* `scripts/pm/dispatch-gates.mjs` — an early return at the real definition of
`selfTest()` took the run from "1288 cases pass" to ZERO bytes of output and
exit 0. The card carried this row as NOT MEASURED because the mechanical
probe anchors on the first `function selfTest() {` in the source, which here
is a fixture STRING: the injection lands inside a template literal and only
ever yields a SyntaxError. That is a limit of the instrument, not of the
file; a hand-read anchor measures it in one run.
* `scripts/check-platform-checklist.mjs` — five batteries returning
`{ checked, failures }` and combined by the caller. A section that stops
running took the verdict from 141 assertions to 119, exited 0, and still
claimed in prose that the direction it had skipped "REFUSES an
empty/renamed/reshaped" table. A bare `return` instead yields `undefined`
and CRASHES the combine — an exit code alone reads that crash as a
handshake rather than as the accident it is.
dispatch-gates takes the landed sentinel form. check-platform-checklist takes
the landed FLAG form (`check-durability-degradation-log-level.mjs`,
`check-dispatcher-error-vocabulary.mjs`) for the reason those files state: the
return value is load-bearing, so the handshake cannot BE the return value. Its
guard is checked on both legs — including the inline one, which is the only leg
CI reaches — before the `.failures` read, so a bare `return` now reports itself
instead of crashing its reader.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 3, 2026
@baozhoutao
baozhoutao marked this pull request as ready for review September 3, 2026 13:51
@baozhoutao
baozhoutao added this pull request to the merge queueSep 3, 2026
Merged via the queue into main with commit 8ea03a9Sep 3, 2026
36 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-13800-carry-forward-verdict-handshake branch September 3, 2026 14:11
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/sskip-changesetPR 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

@baozhoutao@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(devx): verdict handshake for check-platform-checklist and dispatch-gates self-tests - #14960

Merged
baozhoutao merged 1 commit into
mainfrom
claude/issue-13800-carry-forward-verdict-handshake
Sep 3, 2026
Merged

fix(devx): verdict handshake for check-platform-checklist and dispatch-gates self-tests#14960
baozhoutao merged 1 commit into
mainfrom
claude/issue-13800-carry-forward-verdict-handshake

Conversation

@baozhoutao

Copy link
Copy Markdown
Contributor

Part of #13800

Hole 2 (the verdict handshake) for the four files that card carries forward. Two of the four needed no work — see the falsified premise below — so this PR repairs two and reports measurements for the other two. Fixes is deliberately not used: two rows are delivered as readings, and the card should stay open for triage to close.

Verified at b12a5bda (the head of this branch).

The premise, re-derived — and partly falsified

The card's acceptance criterion was the guard form !== SELF_TEST_VERDICT, with a positive control of 81 files on origin/main, each of the four returning 0.

That marker gives a false zero on two of the four. A second, equally deliberate spelling landed in commit 9acddde9 ("Verdict handshake for 134 scripts/** self-tests that exit 0 on an early return", #14479) — a module-level flag, chosen with the rationale stated in the code: "The self-test's own exit code stays load-bearing, so the handshake is a flag rather than a returned sentinel." Counting only the sentinel cannot see it.

A marker that separates before from after, proven across that commit:

file!== SELF_TEST_VERDICT | ReachedVerdict at 9acddde9^at 9acddde9
check-durability-degradation-log-level.mjs06
check-dispatcher-error-vocabulary.mjs03
check-platform-checklist.mjs00
scripts/pm/dispatch-gates.mjs00

Union control on origin/main: 81 sentinel files + 77 flag files = 158 carrying a handshake in one spelling or the other.

Per-row outcome, each one measured rather than read

Probes inject return; (or a partial early verdict) at a hand-chosen anchor, write the mutation to a copy beside the original — the tracked file is never mutated — prove the mutation is on disk before running, and delete the copy in a finally.

1. scripts/pm/dispatch-gates.mjs — was NOT MEASURED, now measured, defeated, repaired

The card's NOT MEASURED was a property of the instrument, not the file. measure-self-test-floor.mjs's injectEarlyReturn() anchors on the first function selfTest() { in the source; in this file that match is inside a fixture string (a template literal), so the injection only ever produces a SyntaxError. The real definition is at line 10517 and the dispatch was:

if(process.argv.includes('--self-test')){selfTest();// <- result discarded}

Anchored on the real definition, the anchor is unique (1 match) and the reading is clean:

exitoutput
unmodified, before repair0✓ dispatch-gates self-test: 1288 cases pass.
early return, before repair00 bytes
unmodified, after repair0✓ dispatch-gates self-test: 1288 cases pass.
early return, after repair1✗ dispatch-gates self-test: selfTest() returned without reaching its verdict...

Repaired with the landed sentinel form. ENTRY_BY_HAND in measure-self-test-floor.mjs is deliberately left alone: its note stays true of the mechanical probe after this repair, and that file is outside this card's surface.

2. scripts/check-platform-checklist.mjs — was NOT MEASURED, now measured, defeated, repaired

Five batteries returning { checked, failures }, combined by the caller. Both failure shapes the card predicted, measured before the repair:

mutation in selfTestTrapVocabularyexitwhat it printed
return; (bare)1TypeError: Cannot read properties of undefined (reading 'failures') — a crash a one-function probe reads as a handshake
return { failures: [], checked: 0 };0✓ ... 119 assertions (down from 141) — and still claiming in prose that the skipped direction "REFUSES an empty/renamed/reshaped" table

After the repair, all three mutations exit 1 and name the battery that did not finish:

✗ check-platform-checklist self-test: selfTestTrapVocabulary() returned without reaching its verdict,
so its assertions did not all run and no failure of theirs could be reported.

— and the same for selfTestSourceLineCitations(), confirming a late battery is caught too, not just the first.

Spelling: the flag form, not the sentinel, for exactly the reason the two sibling files state — the return value is load-bearing here (it carries checked and failures), so the handshake cannot be the return value. The guard is checked on both legs, including the inline one that runs on every invocation (this gate has no --self-test leg in CI), and it is placed before the .failures read so a bare return reports itself instead of crashing its reader. One requireReachedVerdict() helper carries the landed wording to ten call sites (five batteries × two legs); the check, the message and the exit code are the landed ones — only the tenfold duplication of the prose is factored out.

3. scripts/check-durability-degradation-log-level.mjsalready repaired; untouched

Received hole 2 in 9acddde9 (flag spelling). Both of its entries probed, and both hold:

  • selfTest → exit 1, ✗ ... selfTest() returned without reaching its verdict
  • selfTestReadSeams → exit 1

4. scripts/check-dispatcher-error-vocabulary.mjsalready repaired; untouched

Also from 9acddde9. Probed: exit 1 with the named diagnostic. Its hole 1 (SELF_TEST_BATTERIES, 7 hits, from #13799) is left strictly alone — the two counts are not merged.

The derived list, and the irony

Derived from this worktree after the edits, with --repo asserted:

node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack

One of the two repaired files IS that script. Re-derived both ways on identical explicit inputs — the base version of the script and the repaired one — the derived list is IDENTICAL. The repair changes the self-test handshake, not the derivation.

All 21 derived families re-run at b12a5bda and green, including pnpm check:pm-dispatch-gates (1288 cases) and pnpm check:parse-guard / check:entry-guard / check:nul-bytes. Every exit code was captured before any pipe.

Two derived entries were NOT MEASURED rather than red, both prerequisite refusals and neither a finding:

  • node scripts/check-test-completeness.mjs → exit 3, PREREQUISITE NOT MET — this gate grades a saved turbo run test log, and no log was named. Its own --self-test runs clean (exit 0).
  • node scripts/check-durability-degradation-log-level.mjs on a fresh worktree → exit 3 before pnpm install; re-run after install, exit 0.

One gate is red, and it is red on main too

pnpm check:platform-checklist exits 1 with 4 UNCLASSIFIED coverage findings (batch_endpoints, crud_endpoints, metadata_endpoints, route_generation). Not caused by this PR — the ca3fd4b1 version of the file, run in the same tree, produces the byte-identical four findings (diff of the two finding sets is empty). This gate is deliberately excluded from CI (.github/workflows/lint.yml: "validated by pnpm check:platform-checklist, but by MAINTAINER action"), which is why the drift accumulated unseen. Filed separately rather than fixed here.

skip-changeset: scripts/** publishes nothing.


🤖 Generated with Claude Code

https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk


Generated by Claude Code

…h-gates self-tests
Both dispatches discarded their self-test's completion, so a `return` above the
verdict printed nothing and still exited 0 — an unfinished self-test reported as
a verified gate.
Measured before the repair, on this tree:
* `scripts/pm/dispatch-gates.mjs` — an early return at the real definition of
`selfTest()` took the run from "1288 cases pass" to ZERO bytes of output and
exit 0. The card carried this row as NOT MEASURED because the mechanical
probe anchors on the first `function selfTest() {` in the source, which here
is a fixture STRING: the injection lands inside a template literal and only
ever yields a SyntaxError. That is a limit of the instrument, not of the
file; a hand-read anchor measures it in one run.
* `scripts/check-platform-checklist.mjs` — five batteries returning
`{ checked, failures }` and combined by the caller. A section that stops
running took the verdict from 141 assertions to 119, exited 0, and still
claimed in prose that the direction it had skipped "REFUSES an
empty/renamed/reshaped" table. A bare `return` instead yields `undefined`
and CRASHES the combine — an exit code alone reads that crash as a
handshake rather than as the accident it is.
dispatch-gates takes the landed sentinel form. check-platform-checklist takes
the landed FLAG form (`check-durability-degradation-log-level.mjs`,
`check-dispatcher-error-vocabulary.mjs`) for the reason those files state: the
return value is load-bearing, so the handshake cannot BE the return value. Its
guard is checked on both legs — including the inline one, which is the only leg
CI reaches — before the `.failures` read, so a bare `return` now reports itself
instead of crashing its reader.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 3, 2026
@baozhoutao
baozhoutao marked this pull request as ready for review September 3, 2026 13:51
@baozhoutao
baozhoutao added this pull request to the merge queueSep 3, 2026
Merged via the queue into main with commit 8ea03a9Sep 3, 2026
36 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-13800-carry-forward-verdict-handshake branch September 3, 2026 14:11
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/sskip-changesetPR 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

@baozhoutao@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(devx): verdict handshake for check-platform-checklist and dispatch-gates self-tests - #14960

Merged
baozhoutao merged 1 commit into
mainfrom
claude/issue-13800-carry-forward-verdict-handshake
Sep 3, 2026
Merged

fix(devx): verdict handshake for check-platform-checklist and dispatch-gates self-tests#14960
baozhoutao merged 1 commit into
mainfrom
claude/issue-13800-carry-forward-verdict-handshake

Conversation

@baozhoutao

Copy link
Copy Markdown
Contributor

Part of #13800

Hole 2 (the verdict handshake) for the four files that card carries forward. Two of the four needed no work — see the falsified premise below — so this PR repairs two and reports measurements for the other two. Fixes is deliberately not used: two rows are delivered as readings, and the card should stay open for triage to close.

Verified at b12a5bda (the head of this branch).

The premise, re-derived — and partly falsified

The card's acceptance criterion was the guard form !== SELF_TEST_VERDICT, with a positive control of 81 files on origin/main, each of the four returning 0.

That marker gives a false zero on two of the four. A second, equally deliberate spelling landed in commit 9acddde9 ("Verdict handshake for 134 scripts/** self-tests that exit 0 on an early return", #14479) — a module-level flag, chosen with the rationale stated in the code: "The self-test's own exit code stays load-bearing, so the handshake is a flag rather than a returned sentinel." Counting only the sentinel cannot see it.

A marker that separates before from after, proven across that commit:

file!== SELF_TEST_VERDICT | ReachedVerdict at 9acddde9^at 9acddde9
check-durability-degradation-log-level.mjs06
check-dispatcher-error-vocabulary.mjs03
check-platform-checklist.mjs00
scripts/pm/dispatch-gates.mjs00

Union control on origin/main: 81 sentinel files + 77 flag files = 158 carrying a handshake in one spelling or the other.

Per-row outcome, each one measured rather than read

Probes inject return; (or a partial early verdict) at a hand-chosen anchor, write the mutation to a copy beside the original — the tracked file is never mutated — prove the mutation is on disk before running, and delete the copy in a finally.

1. scripts/pm/dispatch-gates.mjs — was NOT MEASURED, now measured, defeated, repaired

The card's NOT MEASURED was a property of the instrument, not the file. measure-self-test-floor.mjs's injectEarlyReturn() anchors on the first function selfTest() { in the source; in this file that match is inside a fixture string (a template literal), so the injection only ever produces a SyntaxError. The real definition is at line 10517 and the dispatch was:

if(process.argv.includes('--self-test')){selfTest();// <- result discarded}

Anchored on the real definition, the anchor is unique (1 match) and the reading is clean:

exitoutput
unmodified, before repair0✓ dispatch-gates self-test: 1288 cases pass.
early return, before repair00 bytes
unmodified, after repair0✓ dispatch-gates self-test: 1288 cases pass.
early return, after repair1✗ dispatch-gates self-test: selfTest() returned without reaching its verdict...

Repaired with the landed sentinel form. ENTRY_BY_HAND in measure-self-test-floor.mjs is deliberately left alone: its note stays true of the mechanical probe after this repair, and that file is outside this card's surface.

2. scripts/check-platform-checklist.mjs — was NOT MEASURED, now measured, defeated, repaired

Five batteries returning { checked, failures }, combined by the caller. Both failure shapes the card predicted, measured before the repair:

mutation in selfTestTrapVocabularyexitwhat it printed
return; (bare)1TypeError: Cannot read properties of undefined (reading 'failures') — a crash a one-function probe reads as a handshake
return { failures: [], checked: 0 };0✓ ... 119 assertions (down from 141) — and still claiming in prose that the skipped direction "REFUSES an empty/renamed/reshaped" table

After the repair, all three mutations exit 1 and name the battery that did not finish:

✗ check-platform-checklist self-test: selfTestTrapVocabulary() returned without reaching its verdict,
so its assertions did not all run and no failure of theirs could be reported.

— and the same for selfTestSourceLineCitations(), confirming a late battery is caught too, not just the first.

Spelling: the flag form, not the sentinel, for exactly the reason the two sibling files state — the return value is load-bearing here (it carries checked and failures), so the handshake cannot be the return value. The guard is checked on both legs, including the inline one that runs on every invocation (this gate has no --self-test leg in CI), and it is placed before the .failures read so a bare return reports itself instead of crashing its reader. One requireReachedVerdict() helper carries the landed wording to ten call sites (five batteries × two legs); the check, the message and the exit code are the landed ones — only the tenfold duplication of the prose is factored out.

3. scripts/check-durability-degradation-log-level.mjsalready repaired; untouched

Received hole 2 in 9acddde9 (flag spelling). Both of its entries probed, and both hold:

  • selfTest → exit 1, ✗ ... selfTest() returned without reaching its verdict
  • selfTestReadSeams → exit 1

4. scripts/check-dispatcher-error-vocabulary.mjsalready repaired; untouched

Also from 9acddde9. Probed: exit 1 with the named diagnostic. Its hole 1 (SELF_TEST_BATTERIES, 7 hits, from #13799) is left strictly alone — the two counts are not merged.

The derived list, and the irony

Derived from this worktree after the edits, with --repo asserted:

node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack

One of the two repaired files IS that script. Re-derived both ways on identical explicit inputs — the base version of the script and the repaired one — the derived list is IDENTICAL. The repair changes the self-test handshake, not the derivation.

All 21 derived families re-run at b12a5bda and green, including pnpm check:pm-dispatch-gates (1288 cases) and pnpm check:parse-guard / check:entry-guard / check:nul-bytes. Every exit code was captured before any pipe.

Two derived entries were NOT MEASURED rather than red, both prerequisite refusals and neither a finding:

  • node scripts/check-test-completeness.mjs → exit 3, PREREQUISITE NOT MET — this gate grades a saved turbo run test log, and no log was named. Its own --self-test runs clean (exit 0).
  • node scripts/check-durability-degradation-log-level.mjs on a fresh worktree → exit 3 before pnpm install; re-run after install, exit 0.

One gate is red, and it is red on main too

pnpm check:platform-checklist exits 1 with 4 UNCLASSIFIED coverage findings (batch_endpoints, crud_endpoints, metadata_endpoints, route_generation). Not caused by this PR — the ca3fd4b1 version of the file, run in the same tree, produces the byte-identical four findings (diff of the two finding sets is empty). This gate is deliberately excluded from CI (.github/workflows/lint.yml: "validated by pnpm check:platform-checklist, but by MAINTAINER action"), which is why the drift accumulated unseen. Filed separately rather than fixed here.

skip-changeset: scripts/** publishes nothing.


🤖 Generated with Claude Code

https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk


Generated by Claude Code

…h-gates self-tests
Both dispatches discarded their self-test's completion, so a `return` above the
verdict printed nothing and still exited 0 — an unfinished self-test reported as
a verified gate.
Measured before the repair, on this tree:
* `scripts/pm/dispatch-gates.mjs` — an early return at the real definition of
`selfTest()` took the run from "1288 cases pass" to ZERO bytes of output and
exit 0. The card carried this row as NOT MEASURED because the mechanical
probe anchors on the first `function selfTest() {` in the source, which here
is a fixture STRING: the injection lands inside a template literal and only
ever yields a SyntaxError. That is a limit of the instrument, not of the
file; a hand-read anchor measures it in one run.
* `scripts/check-platform-checklist.mjs` — five batteries returning
`{ checked, failures }` and combined by the caller. A section that stops
running took the verdict from 141 assertions to 119, exited 0, and still
claimed in prose that the direction it had skipped "REFUSES an
empty/renamed/reshaped" table. A bare `return` instead yields `undefined`
and CRASHES the combine — an exit code alone reads that crash as a
handshake rather than as the accident it is.
dispatch-gates takes the landed sentinel form. check-platform-checklist takes
the landed FLAG form (`check-durability-degradation-log-level.mjs`,
`check-dispatcher-error-vocabulary.mjs`) for the reason those files state: the
return value is load-bearing, so the handshake cannot BE the return value. Its
guard is checked on both legs — including the inline one, which is the only leg
CI reaches — before the `.failures` read, so a bare `return` now reports itself
instead of crashing its reader.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 3, 2026
@baozhoutao
baozhoutao marked this pull request as ready for review September 3, 2026 13:51
@baozhoutao
baozhoutao added this pull request to the merge queueSep 3, 2026
Merged via the queue into main with commit 8ea03a9Sep 3, 2026
36 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-13800-carry-forward-verdict-handshake branch September 3, 2026 14:11
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/sskip-changesetPR 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

@baozhoutao@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(devx): verdict handshake for check-platform-checklist and dispatch-gates self-tests - #14960

Merged
baozhoutao merged 1 commit into
mainfrom
claude/issue-13800-carry-forward-verdict-handshake
Sep 3, 2026
Merged

fix(devx): verdict handshake for check-platform-checklist and dispatch-gates self-tests#14960
baozhoutao merged 1 commit into
mainfrom
claude/issue-13800-carry-forward-verdict-handshake

Conversation

@baozhoutao

Copy link
Copy Markdown
Contributor

Part of #13800

Hole 2 (the verdict handshake) for the four files that card carries forward. Two of the four needed no work — see the falsified premise below — so this PR repairs two and reports measurements for the other two. Fixes is deliberately not used: two rows are delivered as readings, and the card should stay open for triage to close.

Verified at b12a5bda (the head of this branch).

The premise, re-derived — and partly falsified

The card's acceptance criterion was the guard form !== SELF_TEST_VERDICT, with a positive control of 81 files on origin/main, each of the four returning 0.

That marker gives a false zero on two of the four. A second, equally deliberate spelling landed in commit 9acddde9 ("Verdict handshake for 134 scripts/** self-tests that exit 0 on an early return", #14479) — a module-level flag, chosen with the rationale stated in the code: "The self-test's own exit code stays load-bearing, so the handshake is a flag rather than a returned sentinel." Counting only the sentinel cannot see it.

A marker that separates before from after, proven across that commit:

file!== SELF_TEST_VERDICT | ReachedVerdict at 9acddde9^at 9acddde9
check-durability-degradation-log-level.mjs06
check-dispatcher-error-vocabulary.mjs03
check-platform-checklist.mjs00
scripts/pm/dispatch-gates.mjs00

Union control on origin/main: 81 sentinel files + 77 flag files = 158 carrying a handshake in one spelling or the other.

Per-row outcome, each one measured rather than read

Probes inject return; (or a partial early verdict) at a hand-chosen anchor, write the mutation to a copy beside the original — the tracked file is never mutated — prove the mutation is on disk before running, and delete the copy in a finally.

1. scripts/pm/dispatch-gates.mjs — was NOT MEASURED, now measured, defeated, repaired

The card's NOT MEASURED was a property of the instrument, not the file. measure-self-test-floor.mjs's injectEarlyReturn() anchors on the first function selfTest() { in the source; in this file that match is inside a fixture string (a template literal), so the injection only ever produces a SyntaxError. The real definition is at line 10517 and the dispatch was:

if(process.argv.includes('--self-test')){selfTest();// <- result discarded}

Anchored on the real definition, the anchor is unique (1 match) and the reading is clean:

exitoutput
unmodified, before repair0✓ dispatch-gates self-test: 1288 cases pass.
early return, before repair00 bytes
unmodified, after repair0✓ dispatch-gates self-test: 1288 cases pass.
early return, after repair1✗ dispatch-gates self-test: selfTest() returned without reaching its verdict...

Repaired with the landed sentinel form. ENTRY_BY_HAND in measure-self-test-floor.mjs is deliberately left alone: its note stays true of the mechanical probe after this repair, and that file is outside this card's surface.

2. scripts/check-platform-checklist.mjs — was NOT MEASURED, now measured, defeated, repaired

Five batteries returning { checked, failures }, combined by the caller. Both failure shapes the card predicted, measured before the repair:

mutation in selfTestTrapVocabularyexitwhat it printed
return; (bare)1TypeError: Cannot read properties of undefined (reading 'failures') — a crash a one-function probe reads as a handshake
return { failures: [], checked: 0 };0✓ ... 119 assertions (down from 141) — and still claiming in prose that the skipped direction "REFUSES an empty/renamed/reshaped" table

After the repair, all three mutations exit 1 and name the battery that did not finish:

✗ check-platform-checklist self-test: selfTestTrapVocabulary() returned without reaching its verdict,
so its assertions did not all run and no failure of theirs could be reported.

— and the same for selfTestSourceLineCitations(), confirming a late battery is caught too, not just the first.

Spelling: the flag form, not the sentinel, for exactly the reason the two sibling files state — the return value is load-bearing here (it carries checked and failures), so the handshake cannot be the return value. The guard is checked on both legs, including the inline one that runs on every invocation (this gate has no --self-test leg in CI), and it is placed before the .failures read so a bare return reports itself instead of crashing its reader. One requireReachedVerdict() helper carries the landed wording to ten call sites (five batteries × two legs); the check, the message and the exit code are the landed ones — only the tenfold duplication of the prose is factored out.

3. scripts/check-durability-degradation-log-level.mjsalready repaired; untouched

Received hole 2 in 9acddde9 (flag spelling). Both of its entries probed, and both hold:

  • selfTest → exit 1, ✗ ... selfTest() returned without reaching its verdict
  • selfTestReadSeams → exit 1

4. scripts/check-dispatcher-error-vocabulary.mjsalready repaired; untouched

Also from 9acddde9. Probed: exit 1 with the named diagnostic. Its hole 1 (SELF_TEST_BATTERIES, 7 hits, from #13799) is left strictly alone — the two counts are not merged.

The derived list, and the irony

Derived from this worktree after the edits, with --repo asserted:

node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack

One of the two repaired files IS that script. Re-derived both ways on identical explicit inputs — the base version of the script and the repaired one — the derived list is IDENTICAL. The repair changes the self-test handshake, not the derivation.

All 21 derived families re-run at b12a5bda and green, including pnpm check:pm-dispatch-gates (1288 cases) and pnpm check:parse-guard / check:entry-guard / check:nul-bytes. Every exit code was captured before any pipe.

Two derived entries were NOT MEASURED rather than red, both prerequisite refusals and neither a finding:

  • node scripts/check-test-completeness.mjs → exit 3, PREREQUISITE NOT MET — this gate grades a saved turbo run test log, and no log was named. Its own --self-test runs clean (exit 0).
  • node scripts/check-durability-degradation-log-level.mjs on a fresh worktree → exit 3 before pnpm install; re-run after install, exit 0.

One gate is red, and it is red on main too

pnpm check:platform-checklist exits 1 with 4 UNCLASSIFIED coverage findings (batch_endpoints, crud_endpoints, metadata_endpoints, route_generation). Not caused by this PR — the ca3fd4b1 version of the file, run in the same tree, produces the byte-identical four findings (diff of the two finding sets is empty). This gate is deliberately excluded from CI (.github/workflows/lint.yml: "validated by pnpm check:platform-checklist, but by MAINTAINER action"), which is why the drift accumulated unseen. Filed separately rather than fixed here.

skip-changeset: scripts/** publishes nothing.


🤖 Generated with Claude Code

https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk


Generated by Claude Code

…h-gates self-tests
Both dispatches discarded their self-test's completion, so a `return` above the
verdict printed nothing and still exited 0 — an unfinished self-test reported as
a verified gate.
Measured before the repair, on this tree:
* `scripts/pm/dispatch-gates.mjs` — an early return at the real definition of
`selfTest()` took the run from "1288 cases pass" to ZERO bytes of output and
exit 0. The card carried this row as NOT MEASURED because the mechanical
probe anchors on the first `function selfTest() {` in the source, which here
is a fixture STRING: the injection lands inside a template literal and only
ever yields a SyntaxError. That is a limit of the instrument, not of the
file; a hand-read anchor measures it in one run.
* `scripts/check-platform-checklist.mjs` — five batteries returning
`{ checked, failures }` and combined by the caller. A section that stops
running took the verdict from 141 assertions to 119, exited 0, and still
claimed in prose that the direction it had skipped "REFUSES an
empty/renamed/reshaped" table. A bare `return` instead yields `undefined`
and CRASHES the combine — an exit code alone reads that crash as a
handshake rather than as the accident it is.
dispatch-gates takes the landed sentinel form. check-platform-checklist takes
the landed FLAG form (`check-durability-degradation-log-level.mjs`,
`check-dispatcher-error-vocabulary.mjs`) for the reason those files state: the
return value is load-bearing, so the handshake cannot BE the return value. Its
guard is checked on both legs — including the inline one, which is the only leg
CI reaches — before the `.failures` read, so a bare `return` now reports itself
instead of crashing its reader.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 3, 2026
@baozhoutao
baozhoutao marked this pull request as ready for review September 3, 2026 13:51
@baozhoutao
baozhoutao added this pull request to the merge queueSep 3, 2026
Merged via the queue into main with commit 8ea03a9Sep 3, 2026
36 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-13800-carry-forward-verdict-handshake branch September 3, 2026 14:11
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/sskip-changesetPR 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

@baozhoutao@claude