fix(codex): treat usage-limit stops as quota, not errors - #9236

Open
vitalyiegorov wants to merge 1 commit into
pingdotgg:mainfrom
vitalyiegorov:fix/codex-workspace-credits-stop
Open

fix(codex): treat usage-limit stops as quota, not errors#9236
vitalyiegorov wants to merge 1 commit into
pingdotgg:mainfrom
vitalyiegorov:fix/codex-workspace-credits-stop

Conversation

@vitalyiegorov

@vitalyiegorovvitalyiegorov commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

What Changed

When Codex stops a turn because the account is out of quota, the thread now shows a warning row with Codex's own sentence and the turn ends quietly, instead of the thread going red with a generic runtime error banner.

Codex reports three different stops under one error code, usageLimitExceeded: personal plan windows ("Your limit will reset at 6:00 PM"), Business/Enterprise workspace credits ("Your workspace is out of credits. Ask your workspace owner to refill…"), and workspace spend caps. CodexAdapter now recognizes that code in both places it arrives:

  • the error notification becomes a runtime.warning (the labeled work-log row the clients already render) rather than a runtime.error, so the session is not marked errored;
  • the turn/completed that follows is reported as cancelled rather than failed, with no errorMessage, so session.lastError stays empty and no red banner appears. The warning row already said why the turn ended.

Every other Codex error keeps its existing path: runtime.error with provider_error, failed turn, red banner. Adapter-only — no contract, schema, migration, or client changes. A short FAQ in docs/user/providers-codex.md explains what the two kinds of message mean and what to do.

Why

Fixes#9234. Out of quota is not a malfunction. Painting it as one makes users chase a crash that never happened, and for Business accounts (which stop on credits, not on a resetting window) the red banner is the only thing they see. Codex already tells us it is a limit; the adapter was throwing that classification away.

Handling it at the adapter boundary keeps orchestration untouched: ingestion already maps a non-failed turn to ready / lastError: null, and the projection derives latestTurn.state from the session status, so the thread lands as a settled turn with the warning row as its last entry. cancelled is used rather than interrupted because clients label an interrupted latest turn "You stopped this response", which would be false here.

This is the Codex half of the problem #7165 addresses for Claude; that PR will be trimmed to Claude only so each provider is one concern.

UI Changes

No new components: the after-state is the existing runtime.warning row in the work log. Both captures below come from the same local T3 server driving a fake codex app-server that replays, byte for byte in the vendored schema, the sequence codex-rs emits for a Business workspace credit stop (error with codexErrorInfo: "usageLimitExceeded", account/rateLimits/updated with workspace_member_credits_depleted, then turn/completedfailed). Only the branch differs.

Before (main) — generic thread error banner, red "Runtime error" row, thread badged Failed in the sidebar:

Before: red banner reading Your workspace is out of credits, and a red Runtime error row in the work log

After (this branch) — the same sentence as a warning row, no banner, no error state, composer ready:

After: the credit message shown as a warning row under Worked for 2.0s, with no banner

For reference, the original report from a real Business account (#9234) shows the same red banner as the before state.

Related work

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes — n/a, no motion

Built with Claude Fable 5 in Claude Code.

🤖 Generated with Claude Code

Codex classifies plan limits, Business workspace credits, and spend caps
alike as usageLimitExceeded. The adapter turned that into a runtime.error
and a failed turn, so the thread went red with a generic error banner as
if the provider had crashed.
At the adapter boundary, a usage-limit stop now surfaces as a warning row
carrying Codex's own sentence (reset time or workspace owner), and the turn
it ends is cancelled rather than failed. Other errors are unchanged.
Built with Claude Fable 5 in Claude Code.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Sep 2, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 14c6036

Macroscope's review found this PR approvable — This is a focused Codex adapter bug fix that reclassifies provider-reported quota exhaustion using existing warning and cancelled-turn states. Tests cover the new mappings and preserve non-quota error behavior, while the documentation-only change has no runtime impact.

You can add or adjust custom eligibility rules. 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: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 Business workspace credit exhaustion shows as a generic runtime error, not a usage-limit stop

1 participant

@vitalyiegorov
, '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(codex): treat usage-limit stops as quota, not errors - #9236

Open
vitalyiegorov wants to merge 1 commit into
pingdotgg:mainfrom
vitalyiegorov:fix/codex-workspace-credits-stop
Open

fix(codex): treat usage-limit stops as quota, not errors#9236
vitalyiegorov wants to merge 1 commit into
pingdotgg:mainfrom
vitalyiegorov:fix/codex-workspace-credits-stop

Conversation

@vitalyiegorov

@vitalyiegorovvitalyiegorov commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

What Changed

When Codex stops a turn because the account is out of quota, the thread now shows a warning row with Codex's own sentence and the turn ends quietly, instead of the thread going red with a generic runtime error banner.

Codex reports three different stops under one error code, usageLimitExceeded: personal plan windows ("Your limit will reset at 6:00 PM"), Business/Enterprise workspace credits ("Your workspace is out of credits. Ask your workspace owner to refill…"), and workspace spend caps. CodexAdapter now recognizes that code in both places it arrives:

  • the error notification becomes a runtime.warning (the labeled work-log row the clients already render) rather than a runtime.error, so the session is not marked errored;
  • the turn/completed that follows is reported as cancelled rather than failed, with no errorMessage, so session.lastError stays empty and no red banner appears. The warning row already said why the turn ended.

Every other Codex error keeps its existing path: runtime.error with provider_error, failed turn, red banner. Adapter-only — no contract, schema, migration, or client changes. A short FAQ in docs/user/providers-codex.md explains what the two kinds of message mean and what to do.

Why

Fixes#9234. Out of quota is not a malfunction. Painting it as one makes users chase a crash that never happened, and for Business accounts (which stop on credits, not on a resetting window) the red banner is the only thing they see. Codex already tells us it is a limit; the adapter was throwing that classification away.

Handling it at the adapter boundary keeps orchestration untouched: ingestion already maps a non-failed turn to ready / lastError: null, and the projection derives latestTurn.state from the session status, so the thread lands as a settled turn with the warning row as its last entry. cancelled is used rather than interrupted because clients label an interrupted latest turn "You stopped this response", which would be false here.

This is the Codex half of the problem #7165 addresses for Claude; that PR will be trimmed to Claude only so each provider is one concern.

UI Changes

No new components: the after-state is the existing runtime.warning row in the work log. Both captures below come from the same local T3 server driving a fake codex app-server that replays, byte for byte in the vendored schema, the sequence codex-rs emits for a Business workspace credit stop (error with codexErrorInfo: "usageLimitExceeded", account/rateLimits/updated with workspace_member_credits_depleted, then turn/completedfailed). Only the branch differs.

Before (main) — generic thread error banner, red "Runtime error" row, thread badged Failed in the sidebar:

Before: red banner reading Your workspace is out of credits, and a red Runtime error row in the work log

After (this branch) — the same sentence as a warning row, no banner, no error state, composer ready:

After: the credit message shown as a warning row under Worked for 2.0s, with no banner

For reference, the original report from a real Business account (#9234) shows the same red banner as the before state.

Related work

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes — n/a, no motion

Built with Claude Fable 5 in Claude Code.

🤖 Generated with Claude Code

Codex classifies plan limits, Business workspace credits, and spend caps
alike as usageLimitExceeded. The adapter turned that into a runtime.error
and a failed turn, so the thread went red with a generic error banner as
if the provider had crashed.
At the adapter boundary, a usage-limit stop now surfaces as a warning row
carrying Codex's own sentence (reset time or workspace owner), and the turn
it ends is cancelled rather than failed. Other errors are unchanged.
Built with Claude Fable 5 in Claude Code.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Sep 2, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 14c6036

Macroscope's review found this PR approvable — This is a focused Codex adapter bug fix that reclassifies provider-reported quota exhaustion using existing warning and cancelled-turn states. Tests cover the new mappings and preserve non-quota error behavior, while the documentation-only change has no runtime impact.

You can add or adjust custom eligibility rules. 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: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 Business workspace credit exhaustion shows as a generic runtime error, not a usage-limit stop

1 participant

@vitalyiegorov
, '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(codex): treat usage-limit stops as quota, not errors - #9236

Open
vitalyiegorov wants to merge 1 commit into
pingdotgg:mainfrom
vitalyiegorov:fix/codex-workspace-credits-stop
Open

fix(codex): treat usage-limit stops as quota, not errors#9236
vitalyiegorov wants to merge 1 commit into
pingdotgg:mainfrom
vitalyiegorov:fix/codex-workspace-credits-stop

Conversation

@vitalyiegorov

@vitalyiegorovvitalyiegorov commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

What Changed

When Codex stops a turn because the account is out of quota, the thread now shows a warning row with Codex's own sentence and the turn ends quietly, instead of the thread going red with a generic runtime error banner.

Codex reports three different stops under one error code, usageLimitExceeded: personal plan windows ("Your limit will reset at 6:00 PM"), Business/Enterprise workspace credits ("Your workspace is out of credits. Ask your workspace owner to refill…"), and workspace spend caps. CodexAdapter now recognizes that code in both places it arrives:

  • the error notification becomes a runtime.warning (the labeled work-log row the clients already render) rather than a runtime.error, so the session is not marked errored;
  • the turn/completed that follows is reported as cancelled rather than failed, with no errorMessage, so session.lastError stays empty and no red banner appears. The warning row already said why the turn ended.

Every other Codex error keeps its existing path: runtime.error with provider_error, failed turn, red banner. Adapter-only — no contract, schema, migration, or client changes. A short FAQ in docs/user/providers-codex.md explains what the two kinds of message mean and what to do.

Why

Fixes#9234. Out of quota is not a malfunction. Painting it as one makes users chase a crash that never happened, and for Business accounts (which stop on credits, not on a resetting window) the red banner is the only thing they see. Codex already tells us it is a limit; the adapter was throwing that classification away.

Handling it at the adapter boundary keeps orchestration untouched: ingestion already maps a non-failed turn to ready / lastError: null, and the projection derives latestTurn.state from the session status, so the thread lands as a settled turn with the warning row as its last entry. cancelled is used rather than interrupted because clients label an interrupted latest turn "You stopped this response", which would be false here.

This is the Codex half of the problem #7165 addresses for Claude; that PR will be trimmed to Claude only so each provider is one concern.

UI Changes

No new components: the after-state is the existing runtime.warning row in the work log. Both captures below come from the same local T3 server driving a fake codex app-server that replays, byte for byte in the vendored schema, the sequence codex-rs emits for a Business workspace credit stop (error with codexErrorInfo: "usageLimitExceeded", account/rateLimits/updated with workspace_member_credits_depleted, then turn/completedfailed). Only the branch differs.

Before (main) — generic thread error banner, red "Runtime error" row, thread badged Failed in the sidebar:

Before: red banner reading Your workspace is out of credits, and a red Runtime error row in the work log

After (this branch) — the same sentence as a warning row, no banner, no error state, composer ready:

After: the credit message shown as a warning row under Worked for 2.0s, with no banner

For reference, the original report from a real Business account (#9234) shows the same red banner as the before state.

Related work

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes — n/a, no motion

Built with Claude Fable 5 in Claude Code.

🤖 Generated with Claude Code

Codex classifies plan limits, Business workspace credits, and spend caps
alike as usageLimitExceeded. The adapter turned that into a runtime.error
and a failed turn, so the thread went red with a generic error banner as
if the provider had crashed.
At the adapter boundary, a usage-limit stop now surfaces as a warning row
carrying Codex's own sentence (reset time or workspace owner), and the turn
it ends is cancelled rather than failed. Other errors are unchanged.
Built with Claude Fable 5 in Claude Code.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Sep 2, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 14c6036

Macroscope's review found this PR approvable — This is a focused Codex adapter bug fix that reclassifies provider-reported quota exhaustion using existing warning and cancelled-turn states. Tests cover the new mappings and preserve non-quota error behavior, while the documentation-only change has no runtime impact.

You can add or adjust custom eligibility rules. 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: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 Business workspace credit exhaustion shows as a generic runtime error, not a usage-limit stop

1 participant

@vitalyiegorov
, '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(codex): treat usage-limit stops as quota, not errors - #9236

Open
vitalyiegorov wants to merge 1 commit into
pingdotgg:mainfrom
vitalyiegorov:fix/codex-workspace-credits-stop
Open

fix(codex): treat usage-limit stops as quota, not errors#9236
vitalyiegorov wants to merge 1 commit into
pingdotgg:mainfrom
vitalyiegorov:fix/codex-workspace-credits-stop

Conversation

@vitalyiegorov

@vitalyiegorovvitalyiegorov commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

What Changed

When Codex stops a turn because the account is out of quota, the thread now shows a warning row with Codex's own sentence and the turn ends quietly, instead of the thread going red with a generic runtime error banner.

Codex reports three different stops under one error code, usageLimitExceeded: personal plan windows ("Your limit will reset at 6:00 PM"), Business/Enterprise workspace credits ("Your workspace is out of credits. Ask your workspace owner to refill…"), and workspace spend caps. CodexAdapter now recognizes that code in both places it arrives:

  • the error notification becomes a runtime.warning (the labeled work-log row the clients already render) rather than a runtime.error, so the session is not marked errored;
  • the turn/completed that follows is reported as cancelled rather than failed, with no errorMessage, so session.lastError stays empty and no red banner appears. The warning row already said why the turn ended.

Every other Codex error keeps its existing path: runtime.error with provider_error, failed turn, red banner. Adapter-only — no contract, schema, migration, or client changes. A short FAQ in docs/user/providers-codex.md explains what the two kinds of message mean and what to do.

Why

Fixes#9234. Out of quota is not a malfunction. Painting it as one makes users chase a crash that never happened, and for Business accounts (which stop on credits, not on a resetting window) the red banner is the only thing they see. Codex already tells us it is a limit; the adapter was throwing that classification away.

Handling it at the adapter boundary keeps orchestration untouched: ingestion already maps a non-failed turn to ready / lastError: null, and the projection derives latestTurn.state from the session status, so the thread lands as a settled turn with the warning row as its last entry. cancelled is used rather than interrupted because clients label an interrupted latest turn "You stopped this response", which would be false here.

This is the Codex half of the problem #7165 addresses for Claude; that PR will be trimmed to Claude only so each provider is one concern.

UI Changes

No new components: the after-state is the existing runtime.warning row in the work log. Both captures below come from the same local T3 server driving a fake codex app-server that replays, byte for byte in the vendored schema, the sequence codex-rs emits for a Business workspace credit stop (error with codexErrorInfo: "usageLimitExceeded", account/rateLimits/updated with workspace_member_credits_depleted, then turn/completedfailed). Only the branch differs.

Before (main) — generic thread error banner, red "Runtime error" row, thread badged Failed in the sidebar:

Before: red banner reading Your workspace is out of credits, and a red Runtime error row in the work log

After (this branch) — the same sentence as a warning row, no banner, no error state, composer ready:

After: the credit message shown as a warning row under Worked for 2.0s, with no banner

For reference, the original report from a real Business account (#9234) shows the same red banner as the before state.

Related work

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes — n/a, no motion

Built with Claude Fable 5 in Claude Code.

🤖 Generated with Claude Code

Codex classifies plan limits, Business workspace credits, and spend caps
alike as usageLimitExceeded. The adapter turned that into a runtime.error
and a failed turn, so the thread went red with a generic error banner as
if the provider had crashed.
At the adapter boundary, a usage-limit stop now surfaces as a warning row
carrying Codex's own sentence (reset time or workspace owner), and the turn
it ends is cancelled rather than failed. Other errors are unchanged.
Built with Claude Fable 5 in Claude Code.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Sep 2, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 14c6036

Macroscope's review found this PR approvable — This is a focused Codex adapter bug fix that reclassifies provider-reported quota exhaustion using existing warning and cancelled-turn states. Tests cover the new mappings and preserve non-quota error behavior, while the documentation-only change has no runtime impact.

You can add or adjust custom eligibility rules. 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: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 Business workspace credit exhaustion shows as a generic runtime error, not a usage-limit stop

1 participant

@vitalyiegorov
, '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(codex): treat usage-limit stops as quota, not errors - #9236

Open
vitalyiegorov wants to merge 1 commit into
pingdotgg:mainfrom
vitalyiegorov:fix/codex-workspace-credits-stop
Open

fix(codex): treat usage-limit stops as quota, not errors#9236
vitalyiegorov wants to merge 1 commit into
pingdotgg:mainfrom
vitalyiegorov:fix/codex-workspace-credits-stop

Conversation

@vitalyiegorov

@vitalyiegorovvitalyiegorov commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

What Changed

When Codex stops a turn because the account is out of quota, the thread now shows a warning row with Codex's own sentence and the turn ends quietly, instead of the thread going red with a generic runtime error banner.

Codex reports three different stops under one error code, usageLimitExceeded: personal plan windows ("Your limit will reset at 6:00 PM"), Business/Enterprise workspace credits ("Your workspace is out of credits. Ask your workspace owner to refill…"), and workspace spend caps. CodexAdapter now recognizes that code in both places it arrives:

  • the error notification becomes a runtime.warning (the labeled work-log row the clients already render) rather than a runtime.error, so the session is not marked errored;
  • the turn/completed that follows is reported as cancelled rather than failed, with no errorMessage, so session.lastError stays empty and no red banner appears. The warning row already said why the turn ended.

Every other Codex error keeps its existing path: runtime.error with provider_error, failed turn, red banner. Adapter-only — no contract, schema, migration, or client changes. A short FAQ in docs/user/providers-codex.md explains what the two kinds of message mean and what to do.

Why

Fixes#9234. Out of quota is not a malfunction. Painting it as one makes users chase a crash that never happened, and for Business accounts (which stop on credits, not on a resetting window) the red banner is the only thing they see. Codex already tells us it is a limit; the adapter was throwing that classification away.

Handling it at the adapter boundary keeps orchestration untouched: ingestion already maps a non-failed turn to ready / lastError: null, and the projection derives latestTurn.state from the session status, so the thread lands as a settled turn with the warning row as its last entry. cancelled is used rather than interrupted because clients label an interrupted latest turn "You stopped this response", which would be false here.

This is the Codex half of the problem #7165 addresses for Claude; that PR will be trimmed to Claude only so each provider is one concern.

UI Changes

No new components: the after-state is the existing runtime.warning row in the work log. Both captures below come from the same local T3 server driving a fake codex app-server that replays, byte for byte in the vendored schema, the sequence codex-rs emits for a Business workspace credit stop (error with codexErrorInfo: "usageLimitExceeded", account/rateLimits/updated with workspace_member_credits_depleted, then turn/completedfailed). Only the branch differs.

Before (main) — generic thread error banner, red "Runtime error" row, thread badged Failed in the sidebar:

Before: red banner reading Your workspace is out of credits, and a red Runtime error row in the work log

After (this branch) — the same sentence as a warning row, no banner, no error state, composer ready:

After: the credit message shown as a warning row under Worked for 2.0s, with no banner

For reference, the original report from a real Business account (#9234) shows the same red banner as the before state.

Related work

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes — n/a, no motion

Built with Claude Fable 5 in Claude Code.

🤖 Generated with Claude Code

Codex classifies plan limits, Business workspace credits, and spend caps
alike as usageLimitExceeded. The adapter turned that into a runtime.error
and a failed turn, so the thread went red with a generic error banner as
if the provider had crashed.
At the adapter boundary, a usage-limit stop now surfaces as a warning row
carrying Codex's own sentence (reset time or workspace owner), and the turn
it ends is cancelled rather than failed. Other errors are unchanged.
Built with Claude Fable 5 in Claude Code.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Sep 2, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 14c6036

Macroscope's review found this PR approvable — This is a focused Codex adapter bug fix that reclassifies provider-reported quota exhaustion using existing warning and cancelled-turn states. Tests cover the new mappings and preserve non-quota error behavior, while the documentation-only change has no runtime impact.

You can add or adjust custom eligibility rules. 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: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 Business workspace credit exhaustion shows as a generic runtime error, not a usage-limit stop

1 participant

@vitalyiegorov
, '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(codex): treat usage-limit stops as quota, not errors - #9236

Open
vitalyiegorov wants to merge 1 commit into
pingdotgg:mainfrom
vitalyiegorov:fix/codex-workspace-credits-stop
Open

fix(codex): treat usage-limit stops as quota, not errors#9236
vitalyiegorov wants to merge 1 commit into
pingdotgg:mainfrom
vitalyiegorov:fix/codex-workspace-credits-stop

Conversation

@vitalyiegorov

@vitalyiegorovvitalyiegorov commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

What Changed

When Codex stops a turn because the account is out of quota, the thread now shows a warning row with Codex's own sentence and the turn ends quietly, instead of the thread going red with a generic runtime error banner.

Codex reports three different stops under one error code, usageLimitExceeded: personal plan windows ("Your limit will reset at 6:00 PM"), Business/Enterprise workspace credits ("Your workspace is out of credits. Ask your workspace owner to refill…"), and workspace spend caps. CodexAdapter now recognizes that code in both places it arrives:

  • the error notification becomes a runtime.warning (the labeled work-log row the clients already render) rather than a runtime.error, so the session is not marked errored;
  • the turn/completed that follows is reported as cancelled rather than failed, with no errorMessage, so session.lastError stays empty and no red banner appears. The warning row already said why the turn ended.

Every other Codex error keeps its existing path: runtime.error with provider_error, failed turn, red banner. Adapter-only — no contract, schema, migration, or client changes. A short FAQ in docs/user/providers-codex.md explains what the two kinds of message mean and what to do.

Why

Fixes#9234. Out of quota is not a malfunction. Painting it as one makes users chase a crash that never happened, and for Business accounts (which stop on credits, not on a resetting window) the red banner is the only thing they see. Codex already tells us it is a limit; the adapter was throwing that classification away.

Handling it at the adapter boundary keeps orchestration untouched: ingestion already maps a non-failed turn to ready / lastError: null, and the projection derives latestTurn.state from the session status, so the thread lands as a settled turn with the warning row as its last entry. cancelled is used rather than interrupted because clients label an interrupted latest turn "You stopped this response", which would be false here.

This is the Codex half of the problem #7165 addresses for Claude; that PR will be trimmed to Claude only so each provider is one concern.

UI Changes

No new components: the after-state is the existing runtime.warning row in the work log. Both captures below come from the same local T3 server driving a fake codex app-server that replays, byte for byte in the vendored schema, the sequence codex-rs emits for a Business workspace credit stop (error with codexErrorInfo: "usageLimitExceeded", account/rateLimits/updated with workspace_member_credits_depleted, then turn/completedfailed). Only the branch differs.

Before (main) — generic thread error banner, red "Runtime error" row, thread badged Failed in the sidebar:

Before: red banner reading Your workspace is out of credits, and a red Runtime error row in the work log

After (this branch) — the same sentence as a warning row, no banner, no error state, composer ready:

After: the credit message shown as a warning row under Worked for 2.0s, with no banner

For reference, the original report from a real Business account (#9234) shows the same red banner as the before state.

Related work

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes — n/a, no motion

Built with Claude Fable 5 in Claude Code.

🤖 Generated with Claude Code

Codex classifies plan limits, Business workspace credits, and spend caps
alike as usageLimitExceeded. The adapter turned that into a runtime.error
and a failed turn, so the thread went red with a generic error banner as
if the provider had crashed.
At the adapter boundary, a usage-limit stop now surfaces as a warning row
carrying Codex's own sentence (reset time or workspace owner), and the turn
it ends is cancelled rather than failed. Other errors are unchanged.
Built with Claude Fable 5 in Claude Code.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Sep 2, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 14c6036

Macroscope's review found this PR approvable — This is a focused Codex adapter bug fix that reclassifies provider-reported quota exhaustion using existing warning and cancelled-turn states. Tests cover the new mappings and preserve non-quota error behavior, while the documentation-only change has no runtime impact.

You can add or adjust custom eligibility rules. 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: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 Business workspace credit exhaustion shows as a generic runtime error, not a usage-limit stop

1 participant

@vitalyiegorov
, '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(codex): treat usage-limit stops as quota, not errors - #9236

Open
vitalyiegorov wants to merge 1 commit into
pingdotgg:mainfrom
vitalyiegorov:fix/codex-workspace-credits-stop
Open

fix(codex): treat usage-limit stops as quota, not errors#9236
vitalyiegorov wants to merge 1 commit into
pingdotgg:mainfrom
vitalyiegorov:fix/codex-workspace-credits-stop

Conversation

@vitalyiegorov

@vitalyiegorovvitalyiegorov commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

What Changed

When Codex stops a turn because the account is out of quota, the thread now shows a warning row with Codex's own sentence and the turn ends quietly, instead of the thread going red with a generic runtime error banner.

Codex reports three different stops under one error code, usageLimitExceeded: personal plan windows ("Your limit will reset at 6:00 PM"), Business/Enterprise workspace credits ("Your workspace is out of credits. Ask your workspace owner to refill…"), and workspace spend caps. CodexAdapter now recognizes that code in both places it arrives:

  • the error notification becomes a runtime.warning (the labeled work-log row the clients already render) rather than a runtime.error, so the session is not marked errored;
  • the turn/completed that follows is reported as cancelled rather than failed, with no errorMessage, so session.lastError stays empty and no red banner appears. The warning row already said why the turn ended.

Every other Codex error keeps its existing path: runtime.error with provider_error, failed turn, red banner. Adapter-only — no contract, schema, migration, or client changes. A short FAQ in docs/user/providers-codex.md explains what the two kinds of message mean and what to do.

Why

Fixes#9234. Out of quota is not a malfunction. Painting it as one makes users chase a crash that never happened, and for Business accounts (which stop on credits, not on a resetting window) the red banner is the only thing they see. Codex already tells us it is a limit; the adapter was throwing that classification away.

Handling it at the adapter boundary keeps orchestration untouched: ingestion already maps a non-failed turn to ready / lastError: null, and the projection derives latestTurn.state from the session status, so the thread lands as a settled turn with the warning row as its last entry. cancelled is used rather than interrupted because clients label an interrupted latest turn "You stopped this response", which would be false here.

This is the Codex half of the problem #7165 addresses for Claude; that PR will be trimmed to Claude only so each provider is one concern.

UI Changes

No new components: the after-state is the existing runtime.warning row in the work log. Both captures below come from the same local T3 server driving a fake codex app-server that replays, byte for byte in the vendored schema, the sequence codex-rs emits for a Business workspace credit stop (error with codexErrorInfo: "usageLimitExceeded", account/rateLimits/updated with workspace_member_credits_depleted, then turn/completedfailed). Only the branch differs.

Before (main) — generic thread error banner, red "Runtime error" row, thread badged Failed in the sidebar:

Before: red banner reading Your workspace is out of credits, and a red Runtime error row in the work log

After (this branch) — the same sentence as a warning row, no banner, no error state, composer ready:

After: the credit message shown as a warning row under Worked for 2.0s, with no banner

For reference, the original report from a real Business account (#9234) shows the same red banner as the before state.

Related work

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes — n/a, no motion

Built with Claude Fable 5 in Claude Code.

🤖 Generated with Claude Code

Codex classifies plan limits, Business workspace credits, and spend caps
alike as usageLimitExceeded. The adapter turned that into a runtime.error
and a failed turn, so the thread went red with a generic error banner as
if the provider had crashed.
At the adapter boundary, a usage-limit stop now surfaces as a warning row
carrying Codex's own sentence (reset time or workspace owner), and the turn
it ends is cancelled rather than failed. Other errors are unchanged.
Built with Claude Fable 5 in Claude Code.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Sep 2, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 14c6036

Macroscope's review found this PR approvable — This is a focused Codex adapter bug fix that reclassifies provider-reported quota exhaustion using existing warning and cancelled-turn states. Tests cover the new mappings and preserve non-quota error behavior, while the documentation-only change has no runtime impact.

You can add or adjust custom eligibility rules. 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: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 Business workspace credit exhaustion shows as a generic runtime error, not a usage-limit stop

1 participant

@vitalyiegorov
, '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(codex): treat usage-limit stops as quota, not errors - #9236

Open
vitalyiegorov wants to merge 1 commit into
pingdotgg:mainfrom
vitalyiegorov:fix/codex-workspace-credits-stop
Open

fix(codex): treat usage-limit stops as quota, not errors#9236
vitalyiegorov wants to merge 1 commit into
pingdotgg:mainfrom
vitalyiegorov:fix/codex-workspace-credits-stop

Conversation

@vitalyiegorov

@vitalyiegorovvitalyiegorov commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

What Changed

When Codex stops a turn because the account is out of quota, the thread now shows a warning row with Codex's own sentence and the turn ends quietly, instead of the thread going red with a generic runtime error banner.

Codex reports three different stops under one error code, usageLimitExceeded: personal plan windows ("Your limit will reset at 6:00 PM"), Business/Enterprise workspace credits ("Your workspace is out of credits. Ask your workspace owner to refill…"), and workspace spend caps. CodexAdapter now recognizes that code in both places it arrives:

  • the error notification becomes a runtime.warning (the labeled work-log row the clients already render) rather than a runtime.error, so the session is not marked errored;
  • the turn/completed that follows is reported as cancelled rather than failed, with no errorMessage, so session.lastError stays empty and no red banner appears. The warning row already said why the turn ended.

Every other Codex error keeps its existing path: runtime.error with provider_error, failed turn, red banner. Adapter-only — no contract, schema, migration, or client changes. A short FAQ in docs/user/providers-codex.md explains what the two kinds of message mean and what to do.

Why

Fixes#9234. Out of quota is not a malfunction. Painting it as one makes users chase a crash that never happened, and for Business accounts (which stop on credits, not on a resetting window) the red banner is the only thing they see. Codex already tells us it is a limit; the adapter was throwing that classification away.

Handling it at the adapter boundary keeps orchestration untouched: ingestion already maps a non-failed turn to ready / lastError: null, and the projection derives latestTurn.state from the session status, so the thread lands as a settled turn with the warning row as its last entry. cancelled is used rather than interrupted because clients label an interrupted latest turn "You stopped this response", which would be false here.

This is the Codex half of the problem #7165 addresses for Claude; that PR will be trimmed to Claude only so each provider is one concern.

UI Changes

No new components: the after-state is the existing runtime.warning row in the work log. Both captures below come from the same local T3 server driving a fake codex app-server that replays, byte for byte in the vendored schema, the sequence codex-rs emits for a Business workspace credit stop (error with codexErrorInfo: "usageLimitExceeded", account/rateLimits/updated with workspace_member_credits_depleted, then turn/completedfailed). Only the branch differs.

Before (main) — generic thread error banner, red "Runtime error" row, thread badged Failed in the sidebar:

Before: red banner reading Your workspace is out of credits, and a red Runtime error row in the work log

After (this branch) — the same sentence as a warning row, no banner, no error state, composer ready:

After: the credit message shown as a warning row under Worked for 2.0s, with no banner

For reference, the original report from a real Business account (#9234) shows the same red banner as the before state.

Related work

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes — n/a, no motion

Built with Claude Fable 5 in Claude Code.

🤖 Generated with Claude Code

Codex classifies plan limits, Business workspace credits, and spend caps
alike as usageLimitExceeded. The adapter turned that into a runtime.error
and a failed turn, so the thread went red with a generic error banner as
if the provider had crashed.
At the adapter boundary, a usage-limit stop now surfaces as a warning row
carrying Codex's own sentence (reset time or workspace owner), and the turn
it ends is cancelled rather than failed. Other errors are unchanged.
Built with Claude Fable 5 in Claude Code.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Sep 2, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 14c6036

Macroscope's review found this PR approvable — This is a focused Codex adapter bug fix that reclassifies provider-reported quota exhaustion using existing warning and cancelled-turn states. Tests cover the new mappings and preserve non-quota error behavior, while the documentation-only change has no runtime impact.

You can add or adjust custom eligibility rules. 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: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 Business workspace credit exhaustion shows as a generic runtime error, not a usage-limit stop

1 participant

@vitalyiegorov