fix(server): stop Codex threads with queued follow-ups - #5762

Merged
t3dotgg merged 1 commit into
mainfrom
t3code/fix-codex-stop-behavior
Aug 9, 2026
Merged

fix(server): stop Codex threads with queued follow-ups#5762
t3dotgg merged 1 commit into
mainfrom
t3code/fix-codex-stop-behavior

Conversation

@t3dotgg

@t3dotggt3dotgg commented Aug 9, 2026

Copy link
Copy Markdown
Member

Codex stop requests failed when a thread had a queued follow-up. T3 replaced the active provider turn ID with the queued turn ID, so Codex rejected the interrupt.

Keep the existing active turn ID until Codex sends turn lifecycle notifications that advance it. The integration test reproduces the observed active and queued turn ordering.

Test: vp test run apps/server/src/provider/Layers/CodexCollabRuntime.integration.test.ts

Created by GPT-5.6 in T3 Code using the Codex harness.


Note

Medium Risk
Changes turn-tracking used by Stop/interrupt on the Codex provider path; scope is narrow and covered by a new integration test, but incorrect active-turn bookkeeping could still break interrupt behavior.

Overview
Stop on Codex threads failed when a follow-up was queued while the current turn was still running: each turn/start response overwrote activeTurnId with the queued turn id, but Codex turn/interrupt only accepts the currently active turn.

sendTurn now keeps the existing activeTurnId when Codex returns a queued follow-up (session.activeTurnId ?? turnId); lifecycle handlers (turn/started / turn/completed) still advance or clear it. updateSession accepts an updater function so that logic can read the prior session state.

Adds an integration test (two sendTurn calls, then interruptTurn) and extends the collab mock peer with per-call turn ids, optional suppression of a second turn/started, and interrupt validation when the wrong turn id is sent.

Reviewed by Cursor Bugbot for commit 84f5321. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix interruptTurn to target the active turn when Codex has a queued follow-up

  • When Codex accepts a queued follow-up via turn/start, session.activeTurnId was being overwritten with the new (queued) turn id, causing subsequent interrupts to target the wrong turn.
  • Fixes this by switching updateSession calls in the turn/start flow to a functional form that preserves the existing activeTurnId if one is already set.
  • Extends codexCollabMockPeer.mjs to support deterministic turn ids, suppressing turn/started for queued turns, and validating interrupt targets.
  • Adds an integration test in CodexCollabRuntime.integration.test.ts that reproduces the bug and asserts the interrupt targets the first (active) turn id.
📊 Macroscope summarized 84f5321. 2 files reviewed, 0 issues evaluated, 0 issues filtered, 0 comments posted

🗂️ Filtered Issues

No issues evaluated.

@coderabbitai

ghost commented Aug 9, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 95d07107-2a84-4b09-ad13-011cd0a331d0

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Aug 9, 2026
@github-actions

ghost commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire11.3 KiB11.3 KiB+8 B (+0.1%)15.1 KiB
CodexThread snapshot wire5.5 KiB5.5 KiB−5 B (−0.1%)7.3 KiB
CodexLive turn WebSocket wire5.9 KiB5.9 KiB+13 B (+0.2%)7.8 KiB
CodexLive turn WebSocket decoded49.7 KiB49.7 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire11.3 KiB11.3 KiB−7 B (−0.1%)15.1 KiB
ClaudeThread snapshot wire5.5 KiB5.5 KiB−7 B (−0.1%)7.3 KiB
ClaudeLive turn WebSocket wire5.9 KiB5.9 KiB0 B (0.0%)7.8 KiB
ClaudeLive turn WebSocket decoded50.6 KiB50.6 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 49964e3 · PR result: 84f5321 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 94.6 KiB
  • Claude decoded thread snapshot: 95.4 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@macroscopeapp

ghost commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 84f5321

Straightforward bug fix that preserves the active turn ID when Codex queues a follow-up, ensuring interrupt targets the correct turn. Change is small, self-contained, and includes a comprehensive integration test.

You can customize Macroscope's approvability policy. Learn more.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@t3dotgg
, '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(server): stop Codex threads with queued follow-ups - #5762

Merged
t3dotgg merged 1 commit into
mainfrom
t3code/fix-codex-stop-behavior
Aug 9, 2026
Merged

fix(server): stop Codex threads with queued follow-ups#5762
t3dotgg merged 1 commit into
mainfrom
t3code/fix-codex-stop-behavior

Conversation

@t3dotgg

@t3dotggt3dotgg commented Aug 9, 2026

Copy link
Copy Markdown
Member

Codex stop requests failed when a thread had a queued follow-up. T3 replaced the active provider turn ID with the queued turn ID, so Codex rejected the interrupt.

Keep the existing active turn ID until Codex sends turn lifecycle notifications that advance it. The integration test reproduces the observed active and queued turn ordering.

Test: vp test run apps/server/src/provider/Layers/CodexCollabRuntime.integration.test.ts

Created by GPT-5.6 in T3 Code using the Codex harness.


Note

Medium Risk
Changes turn-tracking used by Stop/interrupt on the Codex provider path; scope is narrow and covered by a new integration test, but incorrect active-turn bookkeeping could still break interrupt behavior.

Overview
Stop on Codex threads failed when a follow-up was queued while the current turn was still running: each turn/start response overwrote activeTurnId with the queued turn id, but Codex turn/interrupt only accepts the currently active turn.

sendTurn now keeps the existing activeTurnId when Codex returns a queued follow-up (session.activeTurnId ?? turnId); lifecycle handlers (turn/started / turn/completed) still advance or clear it. updateSession accepts an updater function so that logic can read the prior session state.

Adds an integration test (two sendTurn calls, then interruptTurn) and extends the collab mock peer with per-call turn ids, optional suppression of a second turn/started, and interrupt validation when the wrong turn id is sent.

Reviewed by Cursor Bugbot for commit 84f5321. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix interruptTurn to target the active turn when Codex has a queued follow-up

  • When Codex accepts a queued follow-up via turn/start, session.activeTurnId was being overwritten with the new (queued) turn id, causing subsequent interrupts to target the wrong turn.
  • Fixes this by switching updateSession calls in the turn/start flow to a functional form that preserves the existing activeTurnId if one is already set.
  • Extends codexCollabMockPeer.mjs to support deterministic turn ids, suppressing turn/started for queued turns, and validating interrupt targets.
  • Adds an integration test in CodexCollabRuntime.integration.test.ts that reproduces the bug and asserts the interrupt targets the first (active) turn id.
📊 Macroscope summarized 84f5321. 2 files reviewed, 0 issues evaluated, 0 issues filtered, 0 comments posted

🗂️ Filtered Issues

No issues evaluated.

@coderabbitai

ghost commented Aug 9, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 95d07107-2a84-4b09-ad13-011cd0a331d0

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Aug 9, 2026
@github-actions

ghost commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire11.3 KiB11.3 KiB+8 B (+0.1%)15.1 KiB
CodexThread snapshot wire5.5 KiB5.5 KiB−5 B (−0.1%)7.3 KiB
CodexLive turn WebSocket wire5.9 KiB5.9 KiB+13 B (+0.2%)7.8 KiB
CodexLive turn WebSocket decoded49.7 KiB49.7 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire11.3 KiB11.3 KiB−7 B (−0.1%)15.1 KiB
ClaudeThread snapshot wire5.5 KiB5.5 KiB−7 B (−0.1%)7.3 KiB
ClaudeLive turn WebSocket wire5.9 KiB5.9 KiB0 B (0.0%)7.8 KiB
ClaudeLive turn WebSocket decoded50.6 KiB50.6 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 49964e3 · PR result: 84f5321 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 94.6 KiB
  • Claude decoded thread snapshot: 95.4 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@macroscopeapp

ghost commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 84f5321

Straightforward bug fix that preserves the active turn ID when Codex queues a follow-up, ensuring interrupt targets the correct turn. Change is small, self-contained, and includes a comprehensive integration test.

You can customize Macroscope's approvability policy. Learn more.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@t3dotgg
, '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(server): stop Codex threads with queued follow-ups - #5762

Merged
t3dotgg merged 1 commit into
mainfrom
t3code/fix-codex-stop-behavior
Aug 9, 2026
Merged

fix(server): stop Codex threads with queued follow-ups#5762
t3dotgg merged 1 commit into
mainfrom
t3code/fix-codex-stop-behavior

Conversation

@t3dotgg

@t3dotggt3dotgg commented Aug 9, 2026

Copy link
Copy Markdown
Member

Codex stop requests failed when a thread had a queued follow-up. T3 replaced the active provider turn ID with the queued turn ID, so Codex rejected the interrupt.

Keep the existing active turn ID until Codex sends turn lifecycle notifications that advance it. The integration test reproduces the observed active and queued turn ordering.

Test: vp test run apps/server/src/provider/Layers/CodexCollabRuntime.integration.test.ts

Created by GPT-5.6 in T3 Code using the Codex harness.


Note

Medium Risk
Changes turn-tracking used by Stop/interrupt on the Codex provider path; scope is narrow and covered by a new integration test, but incorrect active-turn bookkeeping could still break interrupt behavior.

Overview
Stop on Codex threads failed when a follow-up was queued while the current turn was still running: each turn/start response overwrote activeTurnId with the queued turn id, but Codex turn/interrupt only accepts the currently active turn.

sendTurn now keeps the existing activeTurnId when Codex returns a queued follow-up (session.activeTurnId ?? turnId); lifecycle handlers (turn/started / turn/completed) still advance or clear it. updateSession accepts an updater function so that logic can read the prior session state.

Adds an integration test (two sendTurn calls, then interruptTurn) and extends the collab mock peer with per-call turn ids, optional suppression of a second turn/started, and interrupt validation when the wrong turn id is sent.

Reviewed by Cursor Bugbot for commit 84f5321. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix interruptTurn to target the active turn when Codex has a queued follow-up

  • When Codex accepts a queued follow-up via turn/start, session.activeTurnId was being overwritten with the new (queued) turn id, causing subsequent interrupts to target the wrong turn.
  • Fixes this by switching updateSession calls in the turn/start flow to a functional form that preserves the existing activeTurnId if one is already set.
  • Extends codexCollabMockPeer.mjs to support deterministic turn ids, suppressing turn/started for queued turns, and validating interrupt targets.
  • Adds an integration test in CodexCollabRuntime.integration.test.ts that reproduces the bug and asserts the interrupt targets the first (active) turn id.
📊 Macroscope summarized 84f5321. 2 files reviewed, 0 issues evaluated, 0 issues filtered, 0 comments posted

🗂️ Filtered Issues

No issues evaluated.

@coderabbitai

ghost commented Aug 9, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 95d07107-2a84-4b09-ad13-011cd0a331d0

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Aug 9, 2026
@github-actions

ghost commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire11.3 KiB11.3 KiB+8 B (+0.1%)15.1 KiB
CodexThread snapshot wire5.5 KiB5.5 KiB−5 B (−0.1%)7.3 KiB
CodexLive turn WebSocket wire5.9 KiB5.9 KiB+13 B (+0.2%)7.8 KiB
CodexLive turn WebSocket decoded49.7 KiB49.7 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire11.3 KiB11.3 KiB−7 B (−0.1%)15.1 KiB
ClaudeThread snapshot wire5.5 KiB5.5 KiB−7 B (−0.1%)7.3 KiB
ClaudeLive turn WebSocket wire5.9 KiB5.9 KiB0 B (0.0%)7.8 KiB
ClaudeLive turn WebSocket decoded50.6 KiB50.6 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 49964e3 · PR result: 84f5321 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 94.6 KiB
  • Claude decoded thread snapshot: 95.4 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@macroscopeapp

ghost commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 84f5321

Straightforward bug fix that preserves the active turn ID when Codex queues a follow-up, ensuring interrupt targets the correct turn. Change is small, self-contained, and includes a comprehensive integration test.

You can customize Macroscope's approvability policy. Learn more.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@t3dotgg
, '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(server): stop Codex threads with queued follow-ups - #5762

Merged
t3dotgg merged 1 commit into
mainfrom
t3code/fix-codex-stop-behavior
Aug 9, 2026
Merged

fix(server): stop Codex threads with queued follow-ups#5762
t3dotgg merged 1 commit into
mainfrom
t3code/fix-codex-stop-behavior

Conversation

@t3dotgg

@t3dotggt3dotgg commented Aug 9, 2026

Copy link
Copy Markdown
Member

Codex stop requests failed when a thread had a queued follow-up. T3 replaced the active provider turn ID with the queued turn ID, so Codex rejected the interrupt.

Keep the existing active turn ID until Codex sends turn lifecycle notifications that advance it. The integration test reproduces the observed active and queued turn ordering.

Test: vp test run apps/server/src/provider/Layers/CodexCollabRuntime.integration.test.ts

Created by GPT-5.6 in T3 Code using the Codex harness.


Note

Medium Risk
Changes turn-tracking used by Stop/interrupt on the Codex provider path; scope is narrow and covered by a new integration test, but incorrect active-turn bookkeeping could still break interrupt behavior.

Overview
Stop on Codex threads failed when a follow-up was queued while the current turn was still running: each turn/start response overwrote activeTurnId with the queued turn id, but Codex turn/interrupt only accepts the currently active turn.

sendTurn now keeps the existing activeTurnId when Codex returns a queued follow-up (session.activeTurnId ?? turnId); lifecycle handlers (turn/started / turn/completed) still advance or clear it. updateSession accepts an updater function so that logic can read the prior session state.

Adds an integration test (two sendTurn calls, then interruptTurn) and extends the collab mock peer with per-call turn ids, optional suppression of a second turn/started, and interrupt validation when the wrong turn id is sent.

Reviewed by Cursor Bugbot for commit 84f5321. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix interruptTurn to target the active turn when Codex has a queued follow-up

  • When Codex accepts a queued follow-up via turn/start, session.activeTurnId was being overwritten with the new (queued) turn id, causing subsequent interrupts to target the wrong turn.
  • Fixes this by switching updateSession calls in the turn/start flow to a functional form that preserves the existing activeTurnId if one is already set.
  • Extends codexCollabMockPeer.mjs to support deterministic turn ids, suppressing turn/started for queued turns, and validating interrupt targets.
  • Adds an integration test in CodexCollabRuntime.integration.test.ts that reproduces the bug and asserts the interrupt targets the first (active) turn id.
📊 Macroscope summarized 84f5321. 2 files reviewed, 0 issues evaluated, 0 issues filtered, 0 comments posted

🗂️ Filtered Issues

No issues evaluated.

@coderabbitai

ghost commented Aug 9, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 95d07107-2a84-4b09-ad13-011cd0a331d0

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Aug 9, 2026
@github-actions

ghost commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire11.3 KiB11.3 KiB+8 B (+0.1%)15.1 KiB
CodexThread snapshot wire5.5 KiB5.5 KiB−5 B (−0.1%)7.3 KiB
CodexLive turn WebSocket wire5.9 KiB5.9 KiB+13 B (+0.2%)7.8 KiB
CodexLive turn WebSocket decoded49.7 KiB49.7 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire11.3 KiB11.3 KiB−7 B (−0.1%)15.1 KiB
ClaudeThread snapshot wire5.5 KiB5.5 KiB−7 B (−0.1%)7.3 KiB
ClaudeLive turn WebSocket wire5.9 KiB5.9 KiB0 B (0.0%)7.8 KiB
ClaudeLive turn WebSocket decoded50.6 KiB50.6 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 49964e3 · PR result: 84f5321 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 94.6 KiB
  • Claude decoded thread snapshot: 95.4 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@macroscopeapp

ghost commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 84f5321

Straightforward bug fix that preserves the active turn ID when Codex queues a follow-up, ensuring interrupt targets the correct turn. Change is small, self-contained, and includes a comprehensive integration test.

You can customize Macroscope's approvability policy. Learn more.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@t3dotgg
, '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(server): stop Codex threads with queued follow-ups - #5762

Merged
t3dotgg merged 1 commit into
mainfrom
t3code/fix-codex-stop-behavior
Aug 9, 2026
Merged

fix(server): stop Codex threads with queued follow-ups#5762
t3dotgg merged 1 commit into
mainfrom
t3code/fix-codex-stop-behavior

Conversation

@t3dotgg

@t3dotggt3dotgg commented Aug 9, 2026

Copy link
Copy Markdown
Member

Codex stop requests failed when a thread had a queued follow-up. T3 replaced the active provider turn ID with the queued turn ID, so Codex rejected the interrupt.

Keep the existing active turn ID until Codex sends turn lifecycle notifications that advance it. The integration test reproduces the observed active and queued turn ordering.

Test: vp test run apps/server/src/provider/Layers/CodexCollabRuntime.integration.test.ts

Created by GPT-5.6 in T3 Code using the Codex harness.


Note

Medium Risk
Changes turn-tracking used by Stop/interrupt on the Codex provider path; scope is narrow and covered by a new integration test, but incorrect active-turn bookkeeping could still break interrupt behavior.

Overview
Stop on Codex threads failed when a follow-up was queued while the current turn was still running: each turn/start response overwrote activeTurnId with the queued turn id, but Codex turn/interrupt only accepts the currently active turn.

sendTurn now keeps the existing activeTurnId when Codex returns a queued follow-up (session.activeTurnId ?? turnId); lifecycle handlers (turn/started / turn/completed) still advance or clear it. updateSession accepts an updater function so that logic can read the prior session state.

Adds an integration test (two sendTurn calls, then interruptTurn) and extends the collab mock peer with per-call turn ids, optional suppression of a second turn/started, and interrupt validation when the wrong turn id is sent.

Reviewed by Cursor Bugbot for commit 84f5321. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix interruptTurn to target the active turn when Codex has a queued follow-up

  • When Codex accepts a queued follow-up via turn/start, session.activeTurnId was being overwritten with the new (queued) turn id, causing subsequent interrupts to target the wrong turn.
  • Fixes this by switching updateSession calls in the turn/start flow to a functional form that preserves the existing activeTurnId if one is already set.
  • Extends codexCollabMockPeer.mjs to support deterministic turn ids, suppressing turn/started for queued turns, and validating interrupt targets.
  • Adds an integration test in CodexCollabRuntime.integration.test.ts that reproduces the bug and asserts the interrupt targets the first (active) turn id.
📊 Macroscope summarized 84f5321. 2 files reviewed, 0 issues evaluated, 0 issues filtered, 0 comments posted

🗂️ Filtered Issues

No issues evaluated.

@coderabbitai

ghost commented Aug 9, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 95d07107-2a84-4b09-ad13-011cd0a331d0

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Aug 9, 2026
@github-actions

ghost commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire11.3 KiB11.3 KiB+8 B (+0.1%)15.1 KiB
CodexThread snapshot wire5.5 KiB5.5 KiB−5 B (−0.1%)7.3 KiB
CodexLive turn WebSocket wire5.9 KiB5.9 KiB+13 B (+0.2%)7.8 KiB
CodexLive turn WebSocket decoded49.7 KiB49.7 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire11.3 KiB11.3 KiB−7 B (−0.1%)15.1 KiB
ClaudeThread snapshot wire5.5 KiB5.5 KiB−7 B (−0.1%)7.3 KiB
ClaudeLive turn WebSocket wire5.9 KiB5.9 KiB0 B (0.0%)7.8 KiB
ClaudeLive turn WebSocket decoded50.6 KiB50.6 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 49964e3 · PR result: 84f5321 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 94.6 KiB
  • Claude decoded thread snapshot: 95.4 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@macroscopeapp

ghost commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 84f5321

Straightforward bug fix that preserves the active turn ID when Codex queues a follow-up, ensuring interrupt targets the correct turn. Change is small, self-contained, and includes a comprehensive integration test.

You can customize Macroscope's approvability policy. Learn more.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@t3dotgg
, '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(server): stop Codex threads with queued follow-ups - #5762

Merged
t3dotgg merged 1 commit into
mainfrom
t3code/fix-codex-stop-behavior
Aug 9, 2026
Merged

fix(server): stop Codex threads with queued follow-ups#5762
t3dotgg merged 1 commit into
mainfrom
t3code/fix-codex-stop-behavior

Conversation

@t3dotgg

@t3dotggt3dotgg commented Aug 9, 2026

Copy link
Copy Markdown
Member

Codex stop requests failed when a thread had a queued follow-up. T3 replaced the active provider turn ID with the queued turn ID, so Codex rejected the interrupt.

Keep the existing active turn ID until Codex sends turn lifecycle notifications that advance it. The integration test reproduces the observed active and queued turn ordering.

Test: vp test run apps/server/src/provider/Layers/CodexCollabRuntime.integration.test.ts

Created by GPT-5.6 in T3 Code using the Codex harness.


Note

Medium Risk
Changes turn-tracking used by Stop/interrupt on the Codex provider path; scope is narrow and covered by a new integration test, but incorrect active-turn bookkeeping could still break interrupt behavior.

Overview
Stop on Codex threads failed when a follow-up was queued while the current turn was still running: each turn/start response overwrote activeTurnId with the queued turn id, but Codex turn/interrupt only accepts the currently active turn.

sendTurn now keeps the existing activeTurnId when Codex returns a queued follow-up (session.activeTurnId ?? turnId); lifecycle handlers (turn/started / turn/completed) still advance or clear it. updateSession accepts an updater function so that logic can read the prior session state.

Adds an integration test (two sendTurn calls, then interruptTurn) and extends the collab mock peer with per-call turn ids, optional suppression of a second turn/started, and interrupt validation when the wrong turn id is sent.

Reviewed by Cursor Bugbot for commit 84f5321. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix interruptTurn to target the active turn when Codex has a queued follow-up

  • When Codex accepts a queued follow-up via turn/start, session.activeTurnId was being overwritten with the new (queued) turn id, causing subsequent interrupts to target the wrong turn.
  • Fixes this by switching updateSession calls in the turn/start flow to a functional form that preserves the existing activeTurnId if one is already set.
  • Extends codexCollabMockPeer.mjs to support deterministic turn ids, suppressing turn/started for queued turns, and validating interrupt targets.
  • Adds an integration test in CodexCollabRuntime.integration.test.ts that reproduces the bug and asserts the interrupt targets the first (active) turn id.
📊 Macroscope summarized 84f5321. 2 files reviewed, 0 issues evaluated, 0 issues filtered, 0 comments posted

🗂️ Filtered Issues

No issues evaluated.

@coderabbitai

ghost commented Aug 9, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 95d07107-2a84-4b09-ad13-011cd0a331d0

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Aug 9, 2026
@github-actions

ghost commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire11.3 KiB11.3 KiB+8 B (+0.1%)15.1 KiB
CodexThread snapshot wire5.5 KiB5.5 KiB−5 B (−0.1%)7.3 KiB
CodexLive turn WebSocket wire5.9 KiB5.9 KiB+13 B (+0.2%)7.8 KiB
CodexLive turn WebSocket decoded49.7 KiB49.7 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire11.3 KiB11.3 KiB−7 B (−0.1%)15.1 KiB
ClaudeThread snapshot wire5.5 KiB5.5 KiB−7 B (−0.1%)7.3 KiB
ClaudeLive turn WebSocket wire5.9 KiB5.9 KiB0 B (0.0%)7.8 KiB
ClaudeLive turn WebSocket decoded50.6 KiB50.6 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 49964e3 · PR result: 84f5321 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 94.6 KiB
  • Claude decoded thread snapshot: 95.4 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@macroscopeapp

ghost commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 84f5321

Straightforward bug fix that preserves the active turn ID when Codex queues a follow-up, ensuring interrupt targets the correct turn. Change is small, self-contained, and includes a comprehensive integration test.

You can customize Macroscope's approvability policy. Learn more.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@t3dotgg
, '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(server): stop Codex threads with queued follow-ups - #5762

Merged
t3dotgg merged 1 commit into
mainfrom
t3code/fix-codex-stop-behavior
Aug 9, 2026
Merged

fix(server): stop Codex threads with queued follow-ups#5762
t3dotgg merged 1 commit into
mainfrom
t3code/fix-codex-stop-behavior

Conversation

@t3dotgg

@t3dotggt3dotgg commented Aug 9, 2026

Copy link
Copy Markdown
Member

Codex stop requests failed when a thread had a queued follow-up. T3 replaced the active provider turn ID with the queued turn ID, so Codex rejected the interrupt.

Keep the existing active turn ID until Codex sends turn lifecycle notifications that advance it. The integration test reproduces the observed active and queued turn ordering.

Test: vp test run apps/server/src/provider/Layers/CodexCollabRuntime.integration.test.ts

Created by GPT-5.6 in T3 Code using the Codex harness.


Note

Medium Risk
Changes turn-tracking used by Stop/interrupt on the Codex provider path; scope is narrow and covered by a new integration test, but incorrect active-turn bookkeeping could still break interrupt behavior.

Overview
Stop on Codex threads failed when a follow-up was queued while the current turn was still running: each turn/start response overwrote activeTurnId with the queued turn id, but Codex turn/interrupt only accepts the currently active turn.

sendTurn now keeps the existing activeTurnId when Codex returns a queued follow-up (session.activeTurnId ?? turnId); lifecycle handlers (turn/started / turn/completed) still advance or clear it. updateSession accepts an updater function so that logic can read the prior session state.

Adds an integration test (two sendTurn calls, then interruptTurn) and extends the collab mock peer with per-call turn ids, optional suppression of a second turn/started, and interrupt validation when the wrong turn id is sent.

Reviewed by Cursor Bugbot for commit 84f5321. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix interruptTurn to target the active turn when Codex has a queued follow-up

  • When Codex accepts a queued follow-up via turn/start, session.activeTurnId was being overwritten with the new (queued) turn id, causing subsequent interrupts to target the wrong turn.
  • Fixes this by switching updateSession calls in the turn/start flow to a functional form that preserves the existing activeTurnId if one is already set.
  • Extends codexCollabMockPeer.mjs to support deterministic turn ids, suppressing turn/started for queued turns, and validating interrupt targets.
  • Adds an integration test in CodexCollabRuntime.integration.test.ts that reproduces the bug and asserts the interrupt targets the first (active) turn id.
📊 Macroscope summarized 84f5321. 2 files reviewed, 0 issues evaluated, 0 issues filtered, 0 comments posted

🗂️ Filtered Issues

No issues evaluated.

@coderabbitai

ghost commented Aug 9, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 95d07107-2a84-4b09-ad13-011cd0a331d0

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Aug 9, 2026
@github-actions

ghost commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire11.3 KiB11.3 KiB+8 B (+0.1%)15.1 KiB
CodexThread snapshot wire5.5 KiB5.5 KiB−5 B (−0.1%)7.3 KiB
CodexLive turn WebSocket wire5.9 KiB5.9 KiB+13 B (+0.2%)7.8 KiB
CodexLive turn WebSocket decoded49.7 KiB49.7 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire11.3 KiB11.3 KiB−7 B (−0.1%)15.1 KiB
ClaudeThread snapshot wire5.5 KiB5.5 KiB−7 B (−0.1%)7.3 KiB
ClaudeLive turn WebSocket wire5.9 KiB5.9 KiB0 B (0.0%)7.8 KiB
ClaudeLive turn WebSocket decoded50.6 KiB50.6 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 49964e3 · PR result: 84f5321 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 94.6 KiB
  • Claude decoded thread snapshot: 95.4 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@macroscopeapp

ghost commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 84f5321

Straightforward bug fix that preserves the active turn ID when Codex queues a follow-up, ensuring interrupt targets the correct turn. Change is small, self-contained, and includes a comprehensive integration test.

You can customize Macroscope's approvability policy. Learn more.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@t3dotgg
, '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(server): stop Codex threads with queued follow-ups - #5762

Merged
t3dotgg merged 1 commit into
mainfrom
t3code/fix-codex-stop-behavior
Aug 9, 2026
Merged

fix(server): stop Codex threads with queued follow-ups#5762
t3dotgg merged 1 commit into
mainfrom
t3code/fix-codex-stop-behavior

Conversation

@t3dotgg

@t3dotggt3dotgg commented Aug 9, 2026

Copy link
Copy Markdown
Member

Codex stop requests failed when a thread had a queued follow-up. T3 replaced the active provider turn ID with the queued turn ID, so Codex rejected the interrupt.

Keep the existing active turn ID until Codex sends turn lifecycle notifications that advance it. The integration test reproduces the observed active and queued turn ordering.

Test: vp test run apps/server/src/provider/Layers/CodexCollabRuntime.integration.test.ts

Created by GPT-5.6 in T3 Code using the Codex harness.


Note

Medium Risk
Changes turn-tracking used by Stop/interrupt on the Codex provider path; scope is narrow and covered by a new integration test, but incorrect active-turn bookkeeping could still break interrupt behavior.

Overview
Stop on Codex threads failed when a follow-up was queued while the current turn was still running: each turn/start response overwrote activeTurnId with the queued turn id, but Codex turn/interrupt only accepts the currently active turn.

sendTurn now keeps the existing activeTurnId when Codex returns a queued follow-up (session.activeTurnId ?? turnId); lifecycle handlers (turn/started / turn/completed) still advance or clear it. updateSession accepts an updater function so that logic can read the prior session state.

Adds an integration test (two sendTurn calls, then interruptTurn) and extends the collab mock peer with per-call turn ids, optional suppression of a second turn/started, and interrupt validation when the wrong turn id is sent.

Reviewed by Cursor Bugbot for commit 84f5321. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix interruptTurn to target the active turn when Codex has a queued follow-up

  • When Codex accepts a queued follow-up via turn/start, session.activeTurnId was being overwritten with the new (queued) turn id, causing subsequent interrupts to target the wrong turn.
  • Fixes this by switching updateSession calls in the turn/start flow to a functional form that preserves the existing activeTurnId if one is already set.
  • Extends codexCollabMockPeer.mjs to support deterministic turn ids, suppressing turn/started for queued turns, and validating interrupt targets.
  • Adds an integration test in CodexCollabRuntime.integration.test.ts that reproduces the bug and asserts the interrupt targets the first (active) turn id.
📊 Macroscope summarized 84f5321. 2 files reviewed, 0 issues evaluated, 0 issues filtered, 0 comments posted

🗂️ Filtered Issues

No issues evaluated.

@coderabbitai

ghost commented Aug 9, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 95d07107-2a84-4b09-ad13-011cd0a331d0

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Aug 9, 2026
@github-actions

ghost commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire11.3 KiB11.3 KiB+8 B (+0.1%)15.1 KiB
CodexThread snapshot wire5.5 KiB5.5 KiB−5 B (−0.1%)7.3 KiB
CodexLive turn WebSocket wire5.9 KiB5.9 KiB+13 B (+0.2%)7.8 KiB
CodexLive turn WebSocket decoded49.7 KiB49.7 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire11.3 KiB11.3 KiB−7 B (−0.1%)15.1 KiB
ClaudeThread snapshot wire5.5 KiB5.5 KiB−7 B (−0.1%)7.3 KiB
ClaudeLive turn WebSocket wire5.9 KiB5.9 KiB0 B (0.0%)7.8 KiB
ClaudeLive turn WebSocket decoded50.6 KiB50.6 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 49964e3 · PR result: 84f5321 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 94.6 KiB
  • Claude decoded thread snapshot: 95.4 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@macroscopeapp

ghost commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 84f5321

Straightforward bug fix that preserves the active turn ID when Codex queues a follow-up, ensuring interrupt targets the correct turn. Change is small, self-contained, and includes a comprehensive integration test.

You can customize Macroscope's approvability policy. Learn more.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@t3dotgg