fix(server): coalesce Codex child progress before ingestion - #6004

Open
cheruvian wants to merge 1 commit into
pingdotgg:mainfrom
cheruvian:release/coalesce-codex-progress-ingestion
Open

fix(server): coalesce Codex child progress before ingestion#6004
cheruvian wants to merge 1 commit into
pingdotgg:mainfrom
cheruvian:release/coalesce-codex-progress-ingestion

Conversation

@cheruvian

@cheruviancheruvian commented Aug 10, 2026

Copy link
Copy Markdown

What Changed

  • Coalesce Codex child item and token-usage progress independently per session and child before provider runtime ingestion.
  • Keep separate latest-value lanes and flush them before child completion, close, failure, idle, and interruption events.
  • Cancel scoped best-effort progress work during session shutdown so it cannot emit after close.
  • Add focused race, isolation, lifecycle-ordering, shutdown, and durable-ingestion coverage.

Why

Codex can emit child item and cumulative token-usage notifications at high frequency. Each notification previously became its own task.progress, durable thread.activity-appended event, and serial projection input, delaying unrelated threads even though the final projection retained only the newest values.

For the representative 32-item and 32-usage burst, durable child progress events fall from 64 to 2 while preserving latest-query-31, totalTokens: 10031, and ordering both before child completion.

Closes#5681.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • No UI changes

Implemented and verified with GPT-5.6-sol in the Codex harness.


Note

Medium Risk
Changes Codex multi-agent event ordering and volume at the provider boundary; mitigated by explicit flush rules, scoped close, and ingestion tests, but could affect UI timing of child task progress.

Overview
Adds makeCodexProgressCoalescer, which batches Codex child-agent task.progress per child thread into separate item and tokenUsage lanes (250ms windows, latest value per lane) before they hit the runtime event queue.

CodexAdapter wires this in per session: collabAgent/item and collabAgent/tokenUsage go through the coalescer; pending lanes are flushed before terminal collab events (turn completed, closed, idle, system error, interruption). Session stop and failed start close the coalescer so nothing emits after shutdown.

Tests cover coalescer timing/races/isolation, adapter flush ordering and post-close behavior, and an end-to-end ingestion case where a 32× burst of child updates yields two durable task.progress activities (latest query + token totals) still ordered before child completion.

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

Note

Coalesce Codex child agent progress events before durable activity ingestion

  • Introduces makeCodexProgressCoalescer, a scoped utility that batches task.progress events per child agent thread into two lanes (item and tokenUsage) within a 250ms fixed window, emitting only the newest value per lane.
  • Integrates the coalescer into makeCodexAdapter: child progress events are routed through the coalescer and flushed before terminal collabAgent lifecycle events (turn completed, closed, interrupted, idle, or system error).
  • Ensures the coalescer is closed on session stop and on start failure to cancel any pending emissions.
  • Behavioral Change: child task.progress events are no longer emitted individually — only the latest value per lane within each window is forwarded to ingestion.

Macroscope summarized 8d27611.

@coderabbitai

coderabbitaiBot commented Aug 10, 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: d1d811d6-4797-4b4d-ac70-ac90e796e62f

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:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 10, 2026

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One convention finding: the new coalescer's public interface is re-declared locally in CodexAdapter.ts instead of being imported from its owning module. Everything else in the changed scope (namespace subpath imports, scoped make construction, callback-based emit rather than service injection, test-only service instance passing) follows the conventions.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/provider/Layers/CodexAdapter.ts Outdated
@macroscopeapp

macroscopeappBot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new CodexProgressCoalescer utility that changes how child progress events are processed - adding 250ms windowed batching before durable ingestion. This is substantial new runtime behavior affecting event timing and coalescing, not a simple fix.

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

Coalesce Codex child item and token-usage notifications independently per session and child before provider runtime ingestion. Flush pending progress before terminal lifecycle events and cancel pending work when the runtime closes.
Add focused adapter and ingestion coverage for bounded durable event volume, latest-value preservation, terminal ordering, isolation, and shutdown.
@cheruvian
cheruvianforce-pushed the release/coalesce-codex-progress-ingestion branch from a0e69c6 to 8d27611CompareAugust 10, 2026 14:34
Andrey170170 added a commit to Andrey170170/t3code that referenced this pull request Aug 31, 2026
Semantically ports pingdotgg#6004 onto current main and flushes buffered progress before identity refinements as well as terminal lifecycle events.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Codex subagent progress floods orchestration ingestion and delays unrelated threads

1 participant

@cheruvian
, '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): coalesce Codex child progress before ingestion - #6004

Open
cheruvian wants to merge 1 commit into
pingdotgg:mainfrom
cheruvian:release/coalesce-codex-progress-ingestion
Open

fix(server): coalesce Codex child progress before ingestion#6004
cheruvian wants to merge 1 commit into
pingdotgg:mainfrom
cheruvian:release/coalesce-codex-progress-ingestion

Conversation

@cheruvian

@cheruviancheruvian commented Aug 10, 2026

Copy link
Copy Markdown

What Changed

  • Coalesce Codex child item and token-usage progress independently per session and child before provider runtime ingestion.
  • Keep separate latest-value lanes and flush them before child completion, close, failure, idle, and interruption events.
  • Cancel scoped best-effort progress work during session shutdown so it cannot emit after close.
  • Add focused race, isolation, lifecycle-ordering, shutdown, and durable-ingestion coverage.

Why

Codex can emit child item and cumulative token-usage notifications at high frequency. Each notification previously became its own task.progress, durable thread.activity-appended event, and serial projection input, delaying unrelated threads even though the final projection retained only the newest values.

For the representative 32-item and 32-usage burst, durable child progress events fall from 64 to 2 while preserving latest-query-31, totalTokens: 10031, and ordering both before child completion.

Closes#5681.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • No UI changes

Implemented and verified with GPT-5.6-sol in the Codex harness.


Note

Medium Risk
Changes Codex multi-agent event ordering and volume at the provider boundary; mitigated by explicit flush rules, scoped close, and ingestion tests, but could affect UI timing of child task progress.

Overview
Adds makeCodexProgressCoalescer, which batches Codex child-agent task.progress per child thread into separate item and tokenUsage lanes (250ms windows, latest value per lane) before they hit the runtime event queue.

CodexAdapter wires this in per session: collabAgent/item and collabAgent/tokenUsage go through the coalescer; pending lanes are flushed before terminal collab events (turn completed, closed, idle, system error, interruption). Session stop and failed start close the coalescer so nothing emits after shutdown.

Tests cover coalescer timing/races/isolation, adapter flush ordering and post-close behavior, and an end-to-end ingestion case where a 32× burst of child updates yields two durable task.progress activities (latest query + token totals) still ordered before child completion.

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

Note

Coalesce Codex child agent progress events before durable activity ingestion

  • Introduces makeCodexProgressCoalescer, a scoped utility that batches task.progress events per child agent thread into two lanes (item and tokenUsage) within a 250ms fixed window, emitting only the newest value per lane.
  • Integrates the coalescer into makeCodexAdapter: child progress events are routed through the coalescer and flushed before terminal collabAgent lifecycle events (turn completed, closed, interrupted, idle, or system error).
  • Ensures the coalescer is closed on session stop and on start failure to cancel any pending emissions.
  • Behavioral Change: child task.progress events are no longer emitted individually — only the latest value per lane within each window is forwarded to ingestion.

Macroscope summarized 8d27611.

@coderabbitai

coderabbitaiBot commented Aug 10, 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: d1d811d6-4797-4b4d-ac70-ac90e796e62f

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:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 10, 2026

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One convention finding: the new coalescer's public interface is re-declared locally in CodexAdapter.ts instead of being imported from its owning module. Everything else in the changed scope (namespace subpath imports, scoped make construction, callback-based emit rather than service injection, test-only service instance passing) follows the conventions.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/provider/Layers/CodexAdapter.ts Outdated
@macroscopeapp

macroscopeappBot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new CodexProgressCoalescer utility that changes how child progress events are processed - adding 250ms windowed batching before durable ingestion. This is substantial new runtime behavior affecting event timing and coalescing, not a simple fix.

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

Coalesce Codex child item and token-usage notifications independently per session and child before provider runtime ingestion. Flush pending progress before terminal lifecycle events and cancel pending work when the runtime closes.
Add focused adapter and ingestion coverage for bounded durable event volume, latest-value preservation, terminal ordering, isolation, and shutdown.
@cheruvian
cheruvianforce-pushed the release/coalesce-codex-progress-ingestion branch from a0e69c6 to 8d27611CompareAugust 10, 2026 14:34
Andrey170170 added a commit to Andrey170170/t3code that referenced this pull request Aug 31, 2026
Semantically ports pingdotgg#6004 onto current main and flushes buffered progress before identity refinements as well as terminal lifecycle events.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Codex subagent progress floods orchestration ingestion and delays unrelated threads

1 participant

@cheruvian
, '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): coalesce Codex child progress before ingestion - #6004

Open
cheruvian wants to merge 1 commit into
pingdotgg:mainfrom
cheruvian:release/coalesce-codex-progress-ingestion
Open

fix(server): coalesce Codex child progress before ingestion#6004
cheruvian wants to merge 1 commit into
pingdotgg:mainfrom
cheruvian:release/coalesce-codex-progress-ingestion

Conversation

@cheruvian

@cheruviancheruvian commented Aug 10, 2026

Copy link
Copy Markdown

What Changed

  • Coalesce Codex child item and token-usage progress independently per session and child before provider runtime ingestion.
  • Keep separate latest-value lanes and flush them before child completion, close, failure, idle, and interruption events.
  • Cancel scoped best-effort progress work during session shutdown so it cannot emit after close.
  • Add focused race, isolation, lifecycle-ordering, shutdown, and durable-ingestion coverage.

Why

Codex can emit child item and cumulative token-usage notifications at high frequency. Each notification previously became its own task.progress, durable thread.activity-appended event, and serial projection input, delaying unrelated threads even though the final projection retained only the newest values.

For the representative 32-item and 32-usage burst, durable child progress events fall from 64 to 2 while preserving latest-query-31, totalTokens: 10031, and ordering both before child completion.

Closes#5681.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • No UI changes

Implemented and verified with GPT-5.6-sol in the Codex harness.


Note

Medium Risk
Changes Codex multi-agent event ordering and volume at the provider boundary; mitigated by explicit flush rules, scoped close, and ingestion tests, but could affect UI timing of child task progress.

Overview
Adds makeCodexProgressCoalescer, which batches Codex child-agent task.progress per child thread into separate item and tokenUsage lanes (250ms windows, latest value per lane) before they hit the runtime event queue.

CodexAdapter wires this in per session: collabAgent/item and collabAgent/tokenUsage go through the coalescer; pending lanes are flushed before terminal collab events (turn completed, closed, idle, system error, interruption). Session stop and failed start close the coalescer so nothing emits after shutdown.

Tests cover coalescer timing/races/isolation, adapter flush ordering and post-close behavior, and an end-to-end ingestion case where a 32× burst of child updates yields two durable task.progress activities (latest query + token totals) still ordered before child completion.

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

Note

Coalesce Codex child agent progress events before durable activity ingestion

  • Introduces makeCodexProgressCoalescer, a scoped utility that batches task.progress events per child agent thread into two lanes (item and tokenUsage) within a 250ms fixed window, emitting only the newest value per lane.
  • Integrates the coalescer into makeCodexAdapter: child progress events are routed through the coalescer and flushed before terminal collabAgent lifecycle events (turn completed, closed, interrupted, idle, or system error).
  • Ensures the coalescer is closed on session stop and on start failure to cancel any pending emissions.
  • Behavioral Change: child task.progress events are no longer emitted individually — only the latest value per lane within each window is forwarded to ingestion.

Macroscope summarized 8d27611.

@coderabbitai

coderabbitaiBot commented Aug 10, 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: d1d811d6-4797-4b4d-ac70-ac90e796e62f

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:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 10, 2026

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One convention finding: the new coalescer's public interface is re-declared locally in CodexAdapter.ts instead of being imported from its owning module. Everything else in the changed scope (namespace subpath imports, scoped make construction, callback-based emit rather than service injection, test-only service instance passing) follows the conventions.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/provider/Layers/CodexAdapter.ts Outdated
@macroscopeapp

macroscopeappBot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new CodexProgressCoalescer utility that changes how child progress events are processed - adding 250ms windowed batching before durable ingestion. This is substantial new runtime behavior affecting event timing and coalescing, not a simple fix.

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

Coalesce Codex child item and token-usage notifications independently per session and child before provider runtime ingestion. Flush pending progress before terminal lifecycle events and cancel pending work when the runtime closes.
Add focused adapter and ingestion coverage for bounded durable event volume, latest-value preservation, terminal ordering, isolation, and shutdown.
@cheruvian
cheruvianforce-pushed the release/coalesce-codex-progress-ingestion branch from a0e69c6 to 8d27611CompareAugust 10, 2026 14:34
Andrey170170 added a commit to Andrey170170/t3code that referenced this pull request Aug 31, 2026
Semantically ports pingdotgg#6004 onto current main and flushes buffered progress before identity refinements as well as terminal lifecycle events.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Codex subagent progress floods orchestration ingestion and delays unrelated threads

1 participant

@cheruvian
, '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): coalesce Codex child progress before ingestion - #6004

Open
cheruvian wants to merge 1 commit into
pingdotgg:mainfrom
cheruvian:release/coalesce-codex-progress-ingestion
Open

fix(server): coalesce Codex child progress before ingestion#6004
cheruvian wants to merge 1 commit into
pingdotgg:mainfrom
cheruvian:release/coalesce-codex-progress-ingestion

Conversation

@cheruvian

@cheruviancheruvian commented Aug 10, 2026

Copy link
Copy Markdown

What Changed

  • Coalesce Codex child item and token-usage progress independently per session and child before provider runtime ingestion.
  • Keep separate latest-value lanes and flush them before child completion, close, failure, idle, and interruption events.
  • Cancel scoped best-effort progress work during session shutdown so it cannot emit after close.
  • Add focused race, isolation, lifecycle-ordering, shutdown, and durable-ingestion coverage.

Why

Codex can emit child item and cumulative token-usage notifications at high frequency. Each notification previously became its own task.progress, durable thread.activity-appended event, and serial projection input, delaying unrelated threads even though the final projection retained only the newest values.

For the representative 32-item and 32-usage burst, durable child progress events fall from 64 to 2 while preserving latest-query-31, totalTokens: 10031, and ordering both before child completion.

Closes#5681.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • No UI changes

Implemented and verified with GPT-5.6-sol in the Codex harness.


Note

Medium Risk
Changes Codex multi-agent event ordering and volume at the provider boundary; mitigated by explicit flush rules, scoped close, and ingestion tests, but could affect UI timing of child task progress.

Overview
Adds makeCodexProgressCoalescer, which batches Codex child-agent task.progress per child thread into separate item and tokenUsage lanes (250ms windows, latest value per lane) before they hit the runtime event queue.

CodexAdapter wires this in per session: collabAgent/item and collabAgent/tokenUsage go through the coalescer; pending lanes are flushed before terminal collab events (turn completed, closed, idle, system error, interruption). Session stop and failed start close the coalescer so nothing emits after shutdown.

Tests cover coalescer timing/races/isolation, adapter flush ordering and post-close behavior, and an end-to-end ingestion case where a 32× burst of child updates yields two durable task.progress activities (latest query + token totals) still ordered before child completion.

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

Note

Coalesce Codex child agent progress events before durable activity ingestion

  • Introduces makeCodexProgressCoalescer, a scoped utility that batches task.progress events per child agent thread into two lanes (item and tokenUsage) within a 250ms fixed window, emitting only the newest value per lane.
  • Integrates the coalescer into makeCodexAdapter: child progress events are routed through the coalescer and flushed before terminal collabAgent lifecycle events (turn completed, closed, interrupted, idle, or system error).
  • Ensures the coalescer is closed on session stop and on start failure to cancel any pending emissions.
  • Behavioral Change: child task.progress events are no longer emitted individually — only the latest value per lane within each window is forwarded to ingestion.

Macroscope summarized 8d27611.

@coderabbitai

coderabbitaiBot commented Aug 10, 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: d1d811d6-4797-4b4d-ac70-ac90e796e62f

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:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 10, 2026

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One convention finding: the new coalescer's public interface is re-declared locally in CodexAdapter.ts instead of being imported from its owning module. Everything else in the changed scope (namespace subpath imports, scoped make construction, callback-based emit rather than service injection, test-only service instance passing) follows the conventions.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/provider/Layers/CodexAdapter.ts Outdated
@macroscopeapp

macroscopeappBot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new CodexProgressCoalescer utility that changes how child progress events are processed - adding 250ms windowed batching before durable ingestion. This is substantial new runtime behavior affecting event timing and coalescing, not a simple fix.

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

Coalesce Codex child item and token-usage notifications independently per session and child before provider runtime ingestion. Flush pending progress before terminal lifecycle events and cancel pending work when the runtime closes.
Add focused adapter and ingestion coverage for bounded durable event volume, latest-value preservation, terminal ordering, isolation, and shutdown.
@cheruvian
cheruvianforce-pushed the release/coalesce-codex-progress-ingestion branch from a0e69c6 to 8d27611CompareAugust 10, 2026 14:34
Andrey170170 added a commit to Andrey170170/t3code that referenced this pull request Aug 31, 2026
Semantically ports pingdotgg#6004 onto current main and flushes buffered progress before identity refinements as well as terminal lifecycle events.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Codex subagent progress floods orchestration ingestion and delays unrelated threads

1 participant

@cheruvian
, '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): coalesce Codex child progress before ingestion - #6004

Open
cheruvian wants to merge 1 commit into
pingdotgg:mainfrom
cheruvian:release/coalesce-codex-progress-ingestion
Open

fix(server): coalesce Codex child progress before ingestion#6004
cheruvian wants to merge 1 commit into
pingdotgg:mainfrom
cheruvian:release/coalesce-codex-progress-ingestion

Conversation

@cheruvian

@cheruviancheruvian commented Aug 10, 2026

Copy link
Copy Markdown

What Changed

  • Coalesce Codex child item and token-usage progress independently per session and child before provider runtime ingestion.
  • Keep separate latest-value lanes and flush them before child completion, close, failure, idle, and interruption events.
  • Cancel scoped best-effort progress work during session shutdown so it cannot emit after close.
  • Add focused race, isolation, lifecycle-ordering, shutdown, and durable-ingestion coverage.

Why

Codex can emit child item and cumulative token-usage notifications at high frequency. Each notification previously became its own task.progress, durable thread.activity-appended event, and serial projection input, delaying unrelated threads even though the final projection retained only the newest values.

For the representative 32-item and 32-usage burst, durable child progress events fall from 64 to 2 while preserving latest-query-31, totalTokens: 10031, and ordering both before child completion.

Closes#5681.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • No UI changes

Implemented and verified with GPT-5.6-sol in the Codex harness.


Note

Medium Risk
Changes Codex multi-agent event ordering and volume at the provider boundary; mitigated by explicit flush rules, scoped close, and ingestion tests, but could affect UI timing of child task progress.

Overview
Adds makeCodexProgressCoalescer, which batches Codex child-agent task.progress per child thread into separate item and tokenUsage lanes (250ms windows, latest value per lane) before they hit the runtime event queue.

CodexAdapter wires this in per session: collabAgent/item and collabAgent/tokenUsage go through the coalescer; pending lanes are flushed before terminal collab events (turn completed, closed, idle, system error, interruption). Session stop and failed start close the coalescer so nothing emits after shutdown.

Tests cover coalescer timing/races/isolation, adapter flush ordering and post-close behavior, and an end-to-end ingestion case where a 32× burst of child updates yields two durable task.progress activities (latest query + token totals) still ordered before child completion.

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

Note

Coalesce Codex child agent progress events before durable activity ingestion

  • Introduces makeCodexProgressCoalescer, a scoped utility that batches task.progress events per child agent thread into two lanes (item and tokenUsage) within a 250ms fixed window, emitting only the newest value per lane.
  • Integrates the coalescer into makeCodexAdapter: child progress events are routed through the coalescer and flushed before terminal collabAgent lifecycle events (turn completed, closed, interrupted, idle, or system error).
  • Ensures the coalescer is closed on session stop and on start failure to cancel any pending emissions.
  • Behavioral Change: child task.progress events are no longer emitted individually — only the latest value per lane within each window is forwarded to ingestion.

Macroscope summarized 8d27611.

@coderabbitai

coderabbitaiBot commented Aug 10, 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: d1d811d6-4797-4b4d-ac70-ac90e796e62f

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:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 10, 2026

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One convention finding: the new coalescer's public interface is re-declared locally in CodexAdapter.ts instead of being imported from its owning module. Everything else in the changed scope (namespace subpath imports, scoped make construction, callback-based emit rather than service injection, test-only service instance passing) follows the conventions.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/provider/Layers/CodexAdapter.ts Outdated
@macroscopeapp

macroscopeappBot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new CodexProgressCoalescer utility that changes how child progress events are processed - adding 250ms windowed batching before durable ingestion. This is substantial new runtime behavior affecting event timing and coalescing, not a simple fix.

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

Coalesce Codex child item and token-usage notifications independently per session and child before provider runtime ingestion. Flush pending progress before terminal lifecycle events and cancel pending work when the runtime closes.
Add focused adapter and ingestion coverage for bounded durable event volume, latest-value preservation, terminal ordering, isolation, and shutdown.
@cheruvian
cheruvianforce-pushed the release/coalesce-codex-progress-ingestion branch from a0e69c6 to 8d27611CompareAugust 10, 2026 14:34
Andrey170170 added a commit to Andrey170170/t3code that referenced this pull request Aug 31, 2026
Semantically ports pingdotgg#6004 onto current main and flushes buffered progress before identity refinements as well as terminal lifecycle events.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Codex subagent progress floods orchestration ingestion and delays unrelated threads

1 participant

@cheruvian
, '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): coalesce Codex child progress before ingestion - #6004

Open
cheruvian wants to merge 1 commit into
pingdotgg:mainfrom
cheruvian:release/coalesce-codex-progress-ingestion
Open

fix(server): coalesce Codex child progress before ingestion#6004
cheruvian wants to merge 1 commit into
pingdotgg:mainfrom
cheruvian:release/coalesce-codex-progress-ingestion

Conversation

@cheruvian

@cheruviancheruvian commented Aug 10, 2026

Copy link
Copy Markdown

What Changed

  • Coalesce Codex child item and token-usage progress independently per session and child before provider runtime ingestion.
  • Keep separate latest-value lanes and flush them before child completion, close, failure, idle, and interruption events.
  • Cancel scoped best-effort progress work during session shutdown so it cannot emit after close.
  • Add focused race, isolation, lifecycle-ordering, shutdown, and durable-ingestion coverage.

Why

Codex can emit child item and cumulative token-usage notifications at high frequency. Each notification previously became its own task.progress, durable thread.activity-appended event, and serial projection input, delaying unrelated threads even though the final projection retained only the newest values.

For the representative 32-item and 32-usage burst, durable child progress events fall from 64 to 2 while preserving latest-query-31, totalTokens: 10031, and ordering both before child completion.

Closes#5681.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • No UI changes

Implemented and verified with GPT-5.6-sol in the Codex harness.


Note

Medium Risk
Changes Codex multi-agent event ordering and volume at the provider boundary; mitigated by explicit flush rules, scoped close, and ingestion tests, but could affect UI timing of child task progress.

Overview
Adds makeCodexProgressCoalescer, which batches Codex child-agent task.progress per child thread into separate item and tokenUsage lanes (250ms windows, latest value per lane) before they hit the runtime event queue.

CodexAdapter wires this in per session: collabAgent/item and collabAgent/tokenUsage go through the coalescer; pending lanes are flushed before terminal collab events (turn completed, closed, idle, system error, interruption). Session stop and failed start close the coalescer so nothing emits after shutdown.

Tests cover coalescer timing/races/isolation, adapter flush ordering and post-close behavior, and an end-to-end ingestion case where a 32× burst of child updates yields two durable task.progress activities (latest query + token totals) still ordered before child completion.

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

Note

Coalesce Codex child agent progress events before durable activity ingestion

  • Introduces makeCodexProgressCoalescer, a scoped utility that batches task.progress events per child agent thread into two lanes (item and tokenUsage) within a 250ms fixed window, emitting only the newest value per lane.
  • Integrates the coalescer into makeCodexAdapter: child progress events are routed through the coalescer and flushed before terminal collabAgent lifecycle events (turn completed, closed, interrupted, idle, or system error).
  • Ensures the coalescer is closed on session stop and on start failure to cancel any pending emissions.
  • Behavioral Change: child task.progress events are no longer emitted individually — only the latest value per lane within each window is forwarded to ingestion.

Macroscope summarized 8d27611.

@coderabbitai

coderabbitaiBot commented Aug 10, 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: d1d811d6-4797-4b4d-ac70-ac90e796e62f

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:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 10, 2026

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One convention finding: the new coalescer's public interface is re-declared locally in CodexAdapter.ts instead of being imported from its owning module. Everything else in the changed scope (namespace subpath imports, scoped make construction, callback-based emit rather than service injection, test-only service instance passing) follows the conventions.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/provider/Layers/CodexAdapter.ts Outdated
@macroscopeapp

macroscopeappBot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new CodexProgressCoalescer utility that changes how child progress events are processed - adding 250ms windowed batching before durable ingestion. This is substantial new runtime behavior affecting event timing and coalescing, not a simple fix.

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

Coalesce Codex child item and token-usage notifications independently per session and child before provider runtime ingestion. Flush pending progress before terminal lifecycle events and cancel pending work when the runtime closes.
Add focused adapter and ingestion coverage for bounded durable event volume, latest-value preservation, terminal ordering, isolation, and shutdown.
@cheruvian
cheruvianforce-pushed the release/coalesce-codex-progress-ingestion branch from a0e69c6 to 8d27611CompareAugust 10, 2026 14:34
Andrey170170 added a commit to Andrey170170/t3code that referenced this pull request Aug 31, 2026
Semantically ports pingdotgg#6004 onto current main and flushes buffered progress before identity refinements as well as terminal lifecycle events.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Codex subagent progress floods orchestration ingestion and delays unrelated threads

1 participant

@cheruvian
, '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): coalesce Codex child progress before ingestion - #6004

Open
cheruvian wants to merge 1 commit into
pingdotgg:mainfrom
cheruvian:release/coalesce-codex-progress-ingestion
Open

fix(server): coalesce Codex child progress before ingestion#6004
cheruvian wants to merge 1 commit into
pingdotgg:mainfrom
cheruvian:release/coalesce-codex-progress-ingestion

Conversation

@cheruvian

@cheruviancheruvian commented Aug 10, 2026

Copy link
Copy Markdown

What Changed

  • Coalesce Codex child item and token-usage progress independently per session and child before provider runtime ingestion.
  • Keep separate latest-value lanes and flush them before child completion, close, failure, idle, and interruption events.
  • Cancel scoped best-effort progress work during session shutdown so it cannot emit after close.
  • Add focused race, isolation, lifecycle-ordering, shutdown, and durable-ingestion coverage.

Why

Codex can emit child item and cumulative token-usage notifications at high frequency. Each notification previously became its own task.progress, durable thread.activity-appended event, and serial projection input, delaying unrelated threads even though the final projection retained only the newest values.

For the representative 32-item and 32-usage burst, durable child progress events fall from 64 to 2 while preserving latest-query-31, totalTokens: 10031, and ordering both before child completion.

Closes#5681.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • No UI changes

Implemented and verified with GPT-5.6-sol in the Codex harness.


Note

Medium Risk
Changes Codex multi-agent event ordering and volume at the provider boundary; mitigated by explicit flush rules, scoped close, and ingestion tests, but could affect UI timing of child task progress.

Overview
Adds makeCodexProgressCoalescer, which batches Codex child-agent task.progress per child thread into separate item and tokenUsage lanes (250ms windows, latest value per lane) before they hit the runtime event queue.

CodexAdapter wires this in per session: collabAgent/item and collabAgent/tokenUsage go through the coalescer; pending lanes are flushed before terminal collab events (turn completed, closed, idle, system error, interruption). Session stop and failed start close the coalescer so nothing emits after shutdown.

Tests cover coalescer timing/races/isolation, adapter flush ordering and post-close behavior, and an end-to-end ingestion case where a 32× burst of child updates yields two durable task.progress activities (latest query + token totals) still ordered before child completion.

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

Note

Coalesce Codex child agent progress events before durable activity ingestion

  • Introduces makeCodexProgressCoalescer, a scoped utility that batches task.progress events per child agent thread into two lanes (item and tokenUsage) within a 250ms fixed window, emitting only the newest value per lane.
  • Integrates the coalescer into makeCodexAdapter: child progress events are routed through the coalescer and flushed before terminal collabAgent lifecycle events (turn completed, closed, interrupted, idle, or system error).
  • Ensures the coalescer is closed on session stop and on start failure to cancel any pending emissions.
  • Behavioral Change: child task.progress events are no longer emitted individually — only the latest value per lane within each window is forwarded to ingestion.

Macroscope summarized 8d27611.

@coderabbitai

coderabbitaiBot commented Aug 10, 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: d1d811d6-4797-4b4d-ac70-ac90e796e62f

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:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 10, 2026

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One convention finding: the new coalescer's public interface is re-declared locally in CodexAdapter.ts instead of being imported from its owning module. Everything else in the changed scope (namespace subpath imports, scoped make construction, callback-based emit rather than service injection, test-only service instance passing) follows the conventions.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/provider/Layers/CodexAdapter.ts Outdated
@macroscopeapp

macroscopeappBot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new CodexProgressCoalescer utility that changes how child progress events are processed - adding 250ms windowed batching before durable ingestion. This is substantial new runtime behavior affecting event timing and coalescing, not a simple fix.

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

Coalesce Codex child item and token-usage notifications independently per session and child before provider runtime ingestion. Flush pending progress before terminal lifecycle events and cancel pending work when the runtime closes.
Add focused adapter and ingestion coverage for bounded durable event volume, latest-value preservation, terminal ordering, isolation, and shutdown.
@cheruvian
cheruvianforce-pushed the release/coalesce-codex-progress-ingestion branch from a0e69c6 to 8d27611CompareAugust 10, 2026 14:34
Andrey170170 added a commit to Andrey170170/t3code that referenced this pull request Aug 31, 2026
Semantically ports pingdotgg#6004 onto current main and flushes buffered progress before identity refinements as well as terminal lifecycle events.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Codex subagent progress floods orchestration ingestion and delays unrelated threads

1 participant

@cheruvian
, '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): coalesce Codex child progress before ingestion - #6004

Open
cheruvian wants to merge 1 commit into
pingdotgg:mainfrom
cheruvian:release/coalesce-codex-progress-ingestion
Open

fix(server): coalesce Codex child progress before ingestion#6004
cheruvian wants to merge 1 commit into
pingdotgg:mainfrom
cheruvian:release/coalesce-codex-progress-ingestion

Conversation

@cheruvian

@cheruviancheruvian commented Aug 10, 2026

Copy link
Copy Markdown

What Changed

  • Coalesce Codex child item and token-usage progress independently per session and child before provider runtime ingestion.
  • Keep separate latest-value lanes and flush them before child completion, close, failure, idle, and interruption events.
  • Cancel scoped best-effort progress work during session shutdown so it cannot emit after close.
  • Add focused race, isolation, lifecycle-ordering, shutdown, and durable-ingestion coverage.

Why

Codex can emit child item and cumulative token-usage notifications at high frequency. Each notification previously became its own task.progress, durable thread.activity-appended event, and serial projection input, delaying unrelated threads even though the final projection retained only the newest values.

For the representative 32-item and 32-usage burst, durable child progress events fall from 64 to 2 while preserving latest-query-31, totalTokens: 10031, and ordering both before child completion.

Closes#5681.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • No UI changes

Implemented and verified with GPT-5.6-sol in the Codex harness.


Note

Medium Risk
Changes Codex multi-agent event ordering and volume at the provider boundary; mitigated by explicit flush rules, scoped close, and ingestion tests, but could affect UI timing of child task progress.

Overview
Adds makeCodexProgressCoalescer, which batches Codex child-agent task.progress per child thread into separate item and tokenUsage lanes (250ms windows, latest value per lane) before they hit the runtime event queue.

CodexAdapter wires this in per session: collabAgent/item and collabAgent/tokenUsage go through the coalescer; pending lanes are flushed before terminal collab events (turn completed, closed, idle, system error, interruption). Session stop and failed start close the coalescer so nothing emits after shutdown.

Tests cover coalescer timing/races/isolation, adapter flush ordering and post-close behavior, and an end-to-end ingestion case where a 32× burst of child updates yields two durable task.progress activities (latest query + token totals) still ordered before child completion.

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

Note

Coalesce Codex child agent progress events before durable activity ingestion

  • Introduces makeCodexProgressCoalescer, a scoped utility that batches task.progress events per child agent thread into two lanes (item and tokenUsage) within a 250ms fixed window, emitting only the newest value per lane.
  • Integrates the coalescer into makeCodexAdapter: child progress events are routed through the coalescer and flushed before terminal collabAgent lifecycle events (turn completed, closed, interrupted, idle, or system error).
  • Ensures the coalescer is closed on session stop and on start failure to cancel any pending emissions.
  • Behavioral Change: child task.progress events are no longer emitted individually — only the latest value per lane within each window is forwarded to ingestion.

Macroscope summarized 8d27611.

@coderabbitai

coderabbitaiBot commented Aug 10, 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: d1d811d6-4797-4b4d-ac70-ac90e796e62f

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:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 10, 2026

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One convention finding: the new coalescer's public interface is re-declared locally in CodexAdapter.ts instead of being imported from its owning module. Everything else in the changed scope (namespace subpath imports, scoped make construction, callback-based emit rather than service injection, test-only service instance passing) follows the conventions.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/provider/Layers/CodexAdapter.ts Outdated
@macroscopeapp

macroscopeappBot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new CodexProgressCoalescer utility that changes how child progress events are processed - adding 250ms windowed batching before durable ingestion. This is substantial new runtime behavior affecting event timing and coalescing, not a simple fix.

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

Coalesce Codex child item and token-usage notifications independently per session and child before provider runtime ingestion. Flush pending progress before terminal lifecycle events and cancel pending work when the runtime closes.
Add focused adapter and ingestion coverage for bounded durable event volume, latest-value preservation, terminal ordering, isolation, and shutdown.
@cheruvian
cheruvianforce-pushed the release/coalesce-codex-progress-ingestion branch from a0e69c6 to 8d27611CompareAugust 10, 2026 14:34
Andrey170170 added a commit to Andrey170170/t3code that referenced this pull request Aug 31, 2026
Semantically ports pingdotgg#6004 onto current main and flushes buffered progress before identity refinements as well as terminal lifecycle events.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Codex subagent progress floods orchestration ingestion and delays unrelated threads

1 participant

@cheruvian