fix(pm): stream dispatch-gates self-test verdicts, document detached run - #14520

Merged
baozhoutao merged 1 commit into
mainfrom
claude/issue-14281-self-test-stream-verdicts
Sep 2, 2026
Merged

fix(pm): stream dispatch-gates self-test verdicts, document detached run#14520
baozhoutao merged 1 commit into
mainfrom
claude/issue-14281-self-test-stream-verdicts

Conversation

@claude

@claudeclaudeBot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Fixes#14281

What changed

scripts/pm/dispatch-gates.mjsselfTest() now streams each case's /
verdict the moment it is decided, instead of buffering every case into an
array and printing them only after the last one. The t(name, cond) collector
now prints the line at the call site (still pushing to cases for the
summary); the tail loop is reduced to the failed/length summary, unchanged
in wording and exit codes. On this container the battery cannot finish in the
foreground (the ~10-minute cap SIGTERMs it, exit 143), and a killed run used
to leave zero diagnostic lines — now it leaves every case decided before the
kill. Verified live on ed4451219: a full detached run prints 1240 lines
matching 1240 cases pass, and a second run killed with SIGTERM at ~70s
leaves 41 lines and no summary line at all (see the issue comment for
both excerpts) — not a frozen count, just what this run measured.

Both files' headers gain a "run this detached on an agent container" section
with the exact command. The ruling's "record it in package.json's script
comment" lands in scripts/pm/check-dispatch-gates.mjs's header instead —
package.json is JSON and holds no comments, and that file is what
check:pm-dispatch-gates actually runs.

Option 2 (share one derivation across the end-to-end cases) is deferred per
the triage ruling — no case is merged, no spawn removed, no case's name,
condition or order moved.

Scope

File surface: scripts/pm/dispatch-gates.mjs (selfTest()'s t() collector

  • tail verdict loop, plus the module header) and scripts/pm/check-dispatch-gates.mjs
    (header only). package.json untouched.

Changeset

None — scripts/**-only diff (tooling/tests, no package publishes). skip-changeset label applied.


Generated by Claude Code

selfTest()'s t() collector now prints each case's ✓/✗ line the moment the
case is decided, instead of buffering all cases into an array and printing
them only after the last one in the tail loop. The tail is reduced to the
failed/length summary, unchanged in wording and exit codes.
On an agent container the battery cannot finish in the foreground (the
container's ~10-minute cap SIGTERMs it), and a killed run used to leave zero
diagnostic lines. Streaming means a killed run now leaves every case decided
before the kill readable in the log.
Both files' headers gain a "run this detached on an agent container" section
with the exact command. The triage's "record it in package.json's script
comment" instruction lands in check-dispatch-gates.mjs's header instead —
package.json is JSON and holds no comments, and that file is what
check:pm-dispatch-gates actually runs.
Option 2 from the triage (share one derivation across the end-to-end cases)
is deferred per the ruling — no case is merged, no spawn removed, no case's
name, condition or order moved.
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

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(pm): stream dispatch-gates self-test verdicts, document detached run - #14520

Merged
baozhoutao merged 1 commit into
mainfrom
claude/issue-14281-self-test-stream-verdicts
Sep 2, 2026
Merged

fix(pm): stream dispatch-gates self-test verdicts, document detached run#14520
baozhoutao merged 1 commit into
mainfrom
claude/issue-14281-self-test-stream-verdicts

Conversation

@claude

@claudeclaudeBot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Fixes#14281

What changed

scripts/pm/dispatch-gates.mjsselfTest() now streams each case's /
verdict the moment it is decided, instead of buffering every case into an
array and printing them only after the last one. The t(name, cond) collector
now prints the line at the call site (still pushing to cases for the
summary); the tail loop is reduced to the failed/length summary, unchanged
in wording and exit codes. On this container the battery cannot finish in the
foreground (the ~10-minute cap SIGTERMs it, exit 143), and a killed run used
to leave zero diagnostic lines — now it leaves every case decided before the
kill. Verified live on ed4451219: a full detached run prints 1240 lines
matching 1240 cases pass, and a second run killed with SIGTERM at ~70s
leaves 41 lines and no summary line at all (see the issue comment for
both excerpts) — not a frozen count, just what this run measured.

Both files' headers gain a "run this detached on an agent container" section
with the exact command. The ruling's "record it in package.json's script
comment" lands in scripts/pm/check-dispatch-gates.mjs's header instead —
package.json is JSON and holds no comments, and that file is what
check:pm-dispatch-gates actually runs.

Option 2 (share one derivation across the end-to-end cases) is deferred per
the triage ruling — no case is merged, no spawn removed, no case's name,
condition or order moved.

Scope

File surface: scripts/pm/dispatch-gates.mjs (selfTest()'s t() collector

  • tail verdict loop, plus the module header) and scripts/pm/check-dispatch-gates.mjs
    (header only). package.json untouched.

Changeset

None — scripts/**-only diff (tooling/tests, no package publishes). skip-changeset label applied.


Generated by Claude Code

selfTest()'s t() collector now prints each case's ✓/✗ line the moment the
case is decided, instead of buffering all cases into an array and printing
them only after the last one in the tail loop. The tail is reduced to the
failed/length summary, unchanged in wording and exit codes.
On an agent container the battery cannot finish in the foreground (the
container's ~10-minute cap SIGTERMs it), and a killed run used to leave zero
diagnostic lines. Streaming means a killed run now leaves every case decided
before the kill readable in the log.
Both files' headers gain a "run this detached on an agent container" section
with the exact command. The triage's "record it in package.json's script
comment" instruction lands in check-dispatch-gates.mjs's header instead —
package.json is JSON and holds no comments, and that file is what
check:pm-dispatch-gates actually runs.
Option 2 from the triage (share one derivation across the end-to-end cases)
is deferred per the ruling — no case is merged, no spawn removed, no case's
name, condition or order moved.
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

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(pm): stream dispatch-gates self-test verdicts, document detached run - #14520

Merged
baozhoutao merged 1 commit into
mainfrom
claude/issue-14281-self-test-stream-verdicts
Sep 2, 2026
Merged

fix(pm): stream dispatch-gates self-test verdicts, document detached run#14520
baozhoutao merged 1 commit into
mainfrom
claude/issue-14281-self-test-stream-verdicts

Conversation

@claude

@claudeclaudeBot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Fixes#14281

What changed

scripts/pm/dispatch-gates.mjsselfTest() now streams each case's /
verdict the moment it is decided, instead of buffering every case into an
array and printing them only after the last one. The t(name, cond) collector
now prints the line at the call site (still pushing to cases for the
summary); the tail loop is reduced to the failed/length summary, unchanged
in wording and exit codes. On this container the battery cannot finish in the
foreground (the ~10-minute cap SIGTERMs it, exit 143), and a killed run used
to leave zero diagnostic lines — now it leaves every case decided before the
kill. Verified live on ed4451219: a full detached run prints 1240 lines
matching 1240 cases pass, and a second run killed with SIGTERM at ~70s
leaves 41 lines and no summary line at all (see the issue comment for
both excerpts) — not a frozen count, just what this run measured.

Both files' headers gain a "run this detached on an agent container" section
with the exact command. The ruling's "record it in package.json's script
comment" lands in scripts/pm/check-dispatch-gates.mjs's header instead —
package.json is JSON and holds no comments, and that file is what
check:pm-dispatch-gates actually runs.

Option 2 (share one derivation across the end-to-end cases) is deferred per
the triage ruling — no case is merged, no spawn removed, no case's name,
condition or order moved.

Scope

File surface: scripts/pm/dispatch-gates.mjs (selfTest()'s t() collector

  • tail verdict loop, plus the module header) and scripts/pm/check-dispatch-gates.mjs
    (header only). package.json untouched.

Changeset

None — scripts/**-only diff (tooling/tests, no package publishes). skip-changeset label applied.


Generated by Claude Code

selfTest()'s t() collector now prints each case's ✓/✗ line the moment the
case is decided, instead of buffering all cases into an array and printing
them only after the last one in the tail loop. The tail is reduced to the
failed/length summary, unchanged in wording and exit codes.
On an agent container the battery cannot finish in the foreground (the
container's ~10-minute cap SIGTERMs it), and a killed run used to leave zero
diagnostic lines. Streaming means a killed run now leaves every case decided
before the kill readable in the log.
Both files' headers gain a "run this detached on an agent container" section
with the exact command. The triage's "record it in package.json's script
comment" instruction lands in check-dispatch-gates.mjs's header instead —
package.json is JSON and holds no comments, and that file is what
check:pm-dispatch-gates actually runs.
Option 2 from the triage (share one derivation across the end-to-end cases)
is deferred per the ruling — no case is merged, no spawn removed, no case's
name, condition or order moved.
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

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(pm): stream dispatch-gates self-test verdicts, document detached run - #14520

Merged
baozhoutao merged 1 commit into
mainfrom
claude/issue-14281-self-test-stream-verdicts
Sep 2, 2026
Merged

fix(pm): stream dispatch-gates self-test verdicts, document detached run#14520
baozhoutao merged 1 commit into
mainfrom
claude/issue-14281-self-test-stream-verdicts

Conversation

@claude

@claudeclaudeBot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Fixes#14281

What changed

scripts/pm/dispatch-gates.mjsselfTest() now streams each case's /
verdict the moment it is decided, instead of buffering every case into an
array and printing them only after the last one. The t(name, cond) collector
now prints the line at the call site (still pushing to cases for the
summary); the tail loop is reduced to the failed/length summary, unchanged
in wording and exit codes. On this container the battery cannot finish in the
foreground (the ~10-minute cap SIGTERMs it, exit 143), and a killed run used
to leave zero diagnostic lines — now it leaves every case decided before the
kill. Verified live on ed4451219: a full detached run prints 1240 lines
matching 1240 cases pass, and a second run killed with SIGTERM at ~70s
leaves 41 lines and no summary line at all (see the issue comment for
both excerpts) — not a frozen count, just what this run measured.

Both files' headers gain a "run this detached on an agent container" section
with the exact command. The ruling's "record it in package.json's script
comment" lands in scripts/pm/check-dispatch-gates.mjs's header instead —
package.json is JSON and holds no comments, and that file is what
check:pm-dispatch-gates actually runs.

Option 2 (share one derivation across the end-to-end cases) is deferred per
the triage ruling — no case is merged, no spawn removed, no case's name,
condition or order moved.

Scope

File surface: scripts/pm/dispatch-gates.mjs (selfTest()'s t() collector

  • tail verdict loop, plus the module header) and scripts/pm/check-dispatch-gates.mjs
    (header only). package.json untouched.

Changeset

None — scripts/**-only diff (tooling/tests, no package publishes). skip-changeset label applied.


Generated by Claude Code

selfTest()'s t() collector now prints each case's ✓/✗ line the moment the
case is decided, instead of buffering all cases into an array and printing
them only after the last one in the tail loop. The tail is reduced to the
failed/length summary, unchanged in wording and exit codes.
On an agent container the battery cannot finish in the foreground (the
container's ~10-minute cap SIGTERMs it), and a killed run used to leave zero
diagnostic lines. Streaming means a killed run now leaves every case decided
before the kill readable in the log.
Both files' headers gain a "run this detached on an agent container" section
with the exact command. The triage's "record it in package.json's script
comment" instruction lands in check-dispatch-gates.mjs's header instead —
package.json is JSON and holds no comments, and that file is what
check:pm-dispatch-gates actually runs.
Option 2 from the triage (share one derivation across the end-to-end cases)
is deferred per the ruling — no case is merged, no spawn removed, no case's
name, condition or order moved.
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

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(pm): stream dispatch-gates self-test verdicts, document detached run - #14520

Merged
baozhoutao merged 1 commit into
mainfrom
claude/issue-14281-self-test-stream-verdicts
Sep 2, 2026
Merged

fix(pm): stream dispatch-gates self-test verdicts, document detached run#14520
baozhoutao merged 1 commit into
mainfrom
claude/issue-14281-self-test-stream-verdicts

Conversation

@claude

@claudeclaudeBot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Fixes#14281

What changed

scripts/pm/dispatch-gates.mjsselfTest() now streams each case's /
verdict the moment it is decided, instead of buffering every case into an
array and printing them only after the last one. The t(name, cond) collector
now prints the line at the call site (still pushing to cases for the
summary); the tail loop is reduced to the failed/length summary, unchanged
in wording and exit codes. On this container the battery cannot finish in the
foreground (the ~10-minute cap SIGTERMs it, exit 143), and a killed run used
to leave zero diagnostic lines — now it leaves every case decided before the
kill. Verified live on ed4451219: a full detached run prints 1240 lines
matching 1240 cases pass, and a second run killed with SIGTERM at ~70s
leaves 41 lines and no summary line at all (see the issue comment for
both excerpts) — not a frozen count, just what this run measured.

Both files' headers gain a "run this detached on an agent container" section
with the exact command. The ruling's "record it in package.json's script
comment" lands in scripts/pm/check-dispatch-gates.mjs's header instead —
package.json is JSON and holds no comments, and that file is what
check:pm-dispatch-gates actually runs.

Option 2 (share one derivation across the end-to-end cases) is deferred per
the triage ruling — no case is merged, no spawn removed, no case's name,
condition or order moved.

Scope

File surface: scripts/pm/dispatch-gates.mjs (selfTest()'s t() collector

  • tail verdict loop, plus the module header) and scripts/pm/check-dispatch-gates.mjs
    (header only). package.json untouched.

Changeset

None — scripts/**-only diff (tooling/tests, no package publishes). skip-changeset label applied.


Generated by Claude Code

selfTest()'s t() collector now prints each case's ✓/✗ line the moment the
case is decided, instead of buffering all cases into an array and printing
them only after the last one in the tail loop. The tail is reduced to the
failed/length summary, unchanged in wording and exit codes.
On an agent container the battery cannot finish in the foreground (the
container's ~10-minute cap SIGTERMs it), and a killed run used to leave zero
diagnostic lines. Streaming means a killed run now leaves every case decided
before the kill readable in the log.
Both files' headers gain a "run this detached on an agent container" section
with the exact command. The triage's "record it in package.json's script
comment" instruction lands in check-dispatch-gates.mjs's header instead —
package.json is JSON and holds no comments, and that file is what
check:pm-dispatch-gates actually runs.
Option 2 from the triage (share one derivation across the end-to-end cases)
is deferred per the ruling — no case is merged, no spawn removed, no case's
name, condition or order moved.
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

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(pm): stream dispatch-gates self-test verdicts, document detached run - #14520

Merged
baozhoutao merged 1 commit into
mainfrom
claude/issue-14281-self-test-stream-verdicts
Sep 2, 2026
Merged

fix(pm): stream dispatch-gates self-test verdicts, document detached run#14520
baozhoutao merged 1 commit into
mainfrom
claude/issue-14281-self-test-stream-verdicts

Conversation

@claude

@claudeclaudeBot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Fixes#14281

What changed

scripts/pm/dispatch-gates.mjsselfTest() now streams each case's /
verdict the moment it is decided, instead of buffering every case into an
array and printing them only after the last one. The t(name, cond) collector
now prints the line at the call site (still pushing to cases for the
summary); the tail loop is reduced to the failed/length summary, unchanged
in wording and exit codes. On this container the battery cannot finish in the
foreground (the ~10-minute cap SIGTERMs it, exit 143), and a killed run used
to leave zero diagnostic lines — now it leaves every case decided before the
kill. Verified live on ed4451219: a full detached run prints 1240 lines
matching 1240 cases pass, and a second run killed with SIGTERM at ~70s
leaves 41 lines and no summary line at all (see the issue comment for
both excerpts) — not a frozen count, just what this run measured.

Both files' headers gain a "run this detached on an agent container" section
with the exact command. The ruling's "record it in package.json's script
comment" lands in scripts/pm/check-dispatch-gates.mjs's header instead —
package.json is JSON and holds no comments, and that file is what
check:pm-dispatch-gates actually runs.

Option 2 (share one derivation across the end-to-end cases) is deferred per
the triage ruling — no case is merged, no spawn removed, no case's name,
condition or order moved.

Scope

File surface: scripts/pm/dispatch-gates.mjs (selfTest()'s t() collector

  • tail verdict loop, plus the module header) and scripts/pm/check-dispatch-gates.mjs
    (header only). package.json untouched.

Changeset

None — scripts/**-only diff (tooling/tests, no package publishes). skip-changeset label applied.


Generated by Claude Code

selfTest()'s t() collector now prints each case's ✓/✗ line the moment the
case is decided, instead of buffering all cases into an array and printing
them only after the last one in the tail loop. The tail is reduced to the
failed/length summary, unchanged in wording and exit codes.
On an agent container the battery cannot finish in the foreground (the
container's ~10-minute cap SIGTERMs it), and a killed run used to leave zero
diagnostic lines. Streaming means a killed run now leaves every case decided
before the kill readable in the log.
Both files' headers gain a "run this detached on an agent container" section
with the exact command. The triage's "record it in package.json's script
comment" instruction lands in check-dispatch-gates.mjs's header instead —
package.json is JSON and holds no comments, and that file is what
check:pm-dispatch-gates actually runs.
Option 2 from the triage (share one derivation across the end-to-end cases)
is deferred per the ruling — no case is merged, no spawn removed, no case's
name, condition or order moved.
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

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(pm): stream dispatch-gates self-test verdicts, document detached run - #14520

Merged
baozhoutao merged 1 commit into
mainfrom
claude/issue-14281-self-test-stream-verdicts
Sep 2, 2026
Merged

fix(pm): stream dispatch-gates self-test verdicts, document detached run#14520
baozhoutao merged 1 commit into
mainfrom
claude/issue-14281-self-test-stream-verdicts

Conversation

@claude

@claudeclaudeBot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Fixes#14281

What changed

scripts/pm/dispatch-gates.mjsselfTest() now streams each case's /
verdict the moment it is decided, instead of buffering every case into an
array and printing them only after the last one. The t(name, cond) collector
now prints the line at the call site (still pushing to cases for the
summary); the tail loop is reduced to the failed/length summary, unchanged
in wording and exit codes. On this container the battery cannot finish in the
foreground (the ~10-minute cap SIGTERMs it, exit 143), and a killed run used
to leave zero diagnostic lines — now it leaves every case decided before the
kill. Verified live on ed4451219: a full detached run prints 1240 lines
matching 1240 cases pass, and a second run killed with SIGTERM at ~70s
leaves 41 lines and no summary line at all (see the issue comment for
both excerpts) — not a frozen count, just what this run measured.

Both files' headers gain a "run this detached on an agent container" section
with the exact command. The ruling's "record it in package.json's script
comment" lands in scripts/pm/check-dispatch-gates.mjs's header instead —
package.json is JSON and holds no comments, and that file is what
check:pm-dispatch-gates actually runs.

Option 2 (share one derivation across the end-to-end cases) is deferred per
the triage ruling — no case is merged, no spawn removed, no case's name,
condition or order moved.

Scope

File surface: scripts/pm/dispatch-gates.mjs (selfTest()'s t() collector

  • tail verdict loop, plus the module header) and scripts/pm/check-dispatch-gates.mjs
    (header only). package.json untouched.

Changeset

None — scripts/**-only diff (tooling/tests, no package publishes). skip-changeset label applied.


Generated by Claude Code

selfTest()'s t() collector now prints each case's ✓/✗ line the moment the
case is decided, instead of buffering all cases into an array and printing
them only after the last one in the tail loop. The tail is reduced to the
failed/length summary, unchanged in wording and exit codes.
On an agent container the battery cannot finish in the foreground (the
container's ~10-minute cap SIGTERMs it), and a killed run used to leave zero
diagnostic lines. Streaming means a killed run now leaves every case decided
before the kill readable in the log.
Both files' headers gain a "run this detached on an agent container" section
with the exact command. The triage's "record it in package.json's script
comment" instruction lands in check-dispatch-gates.mjs's header instead —
package.json is JSON and holds no comments, and that file is what
check:pm-dispatch-gates actually runs.
Option 2 from the triage (share one derivation across the end-to-end cases)
is deferred per the ruling — no case is merged, no spawn removed, no case's
name, condition or order moved.
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

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(pm): stream dispatch-gates self-test verdicts, document detached run - #14520

Merged
baozhoutao merged 1 commit into
mainfrom
claude/issue-14281-self-test-stream-verdicts
Sep 2, 2026
Merged

fix(pm): stream dispatch-gates self-test verdicts, document detached run#14520
baozhoutao merged 1 commit into
mainfrom
claude/issue-14281-self-test-stream-verdicts

Conversation

@claude

@claudeclaudeBot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Fixes#14281

What changed

scripts/pm/dispatch-gates.mjsselfTest() now streams each case's /
verdict the moment it is decided, instead of buffering every case into an
array and printing them only after the last one. The t(name, cond) collector
now prints the line at the call site (still pushing to cases for the
summary); the tail loop is reduced to the failed/length summary, unchanged
in wording and exit codes. On this container the battery cannot finish in the
foreground (the ~10-minute cap SIGTERMs it, exit 143), and a killed run used
to leave zero diagnostic lines — now it leaves every case decided before the
kill. Verified live on ed4451219: a full detached run prints 1240 lines
matching 1240 cases pass, and a second run killed with SIGTERM at ~70s
leaves 41 lines and no summary line at all (see the issue comment for
both excerpts) — not a frozen count, just what this run measured.

Both files' headers gain a "run this detached on an agent container" section
with the exact command. The ruling's "record it in package.json's script
comment" lands in scripts/pm/check-dispatch-gates.mjs's header instead —
package.json is JSON and holds no comments, and that file is what
check:pm-dispatch-gates actually runs.

Option 2 (share one derivation across the end-to-end cases) is deferred per
the triage ruling — no case is merged, no spawn removed, no case's name,
condition or order moved.

Scope

File surface: scripts/pm/dispatch-gates.mjs (selfTest()'s t() collector

  • tail verdict loop, plus the module header) and scripts/pm/check-dispatch-gates.mjs
    (header only). package.json untouched.

Changeset

None — scripts/**-only diff (tooling/tests, no package publishes). skip-changeset label applied.


Generated by Claude Code

selfTest()'s t() collector now prints each case's ✓/✗ line the moment the
case is decided, instead of buffering all cases into an array and printing
them only after the last one in the tail loop. The tail is reduced to the
failed/length summary, unchanged in wording and exit codes.
On an agent container the battery cannot finish in the foreground (the
container's ~10-minute cap SIGTERMs it), and a killed run used to leave zero
diagnostic lines. Streaming means a killed run now leaves every case decided
before the kill readable in the log.
Both files' headers gain a "run this detached on an agent container" section
with the exact command. The triage's "record it in package.json's script
comment" instruction lands in check-dispatch-gates.mjs's header instead —
package.json is JSON and holds no comments, and that file is what
check:pm-dispatch-gates actually runs.
Option 2 from the triage (share one derivation across the end-to-end cases)
is deferred per the ruling — no case is merged, no spawn removed, no case's
name, condition or order moved.
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

2 participants

@baozhoutao@claude