Skip to content

[Windows][26.818.5345.0] openTabs succeeds, but claimTab/tabs.get/tabs.new hang until browser-control reset #40352

Closed

Description

@jiangyuShiro

What version of the Codex App are you using (From “About Codex” dialog)?

26.818.5345.0

What subscription do you have?

ChatGPT Plus

What platform is your computer?

Microsoft Windows NT 10.0.26200.0 x64

What issue are you seeing?

Chrome control can enter an intermittent stale-session state where tab discovery still succeeds, but operations that establish or use interactive control never return.

Observed behavior:

  • browser.user.openTabs() succeeds and returns live Chrome tabs.
  • browser.user.claimTab(tabInfo), using the exact object returned by openTabs(), hangs until the outer execution times out and resets.
  • After reinitializing the packaged browser runtime, browser.tabs.list() can still succeed while browser.tabs.get(id) hangs.
  • In the same affected state, browser.tabs.new() may also hang.
  • Chrome remains open and the tabs remain visible. The failure occurs in the browser-control/session layer before page interaction.

The outer tool eventually reports an execution timeout and resets, but no bounded or actionable browser error is returned.

What steps can reproduce the bug?

The trigger is intermittent, but this sequence reproduced it:

  1. Use Codex Desktop on Windows with the bundled Chrome plugin and ChatGPT Chrome extension.
  2. Run a longer Chrome-control workflow that creates or claims tabs and keeps result tabs available across turns.
  3. After a browser-control execution or session reset, initialize the packaged browser client again.
  4. Run:
const tabs = await chrome.user.openTabs(); // succeeds
await chrome.user.claimTab(tabs[0]);       // hangs until outer timeout/reset
  1. Reinitialize the runtime and run:
const controlled = await chrome.tabs.list(); // succeeds
await chrome.tabs.get(controlled[0].id);      // hangs
  1. In the affected state, creating a new tab may also hang:
await chrome.tabs.new();

The key distinction is that discovery succeeds, while claim/get/new operations subsequently stop returning.

What is the expected behavior?

After openTabs() or tabs.list() returns a live tab, claimTab(), tabs.get(), and tabs.new() should return promptly.

If a previous browser session still owns a tab, or if the native pipe/backend has rotated, the call should fail within a bounded timeout with an actionable error. A failed browser-control execution should also release stale session ownership automatically so later operations are not blocked.

Additional information

Environment:

  • Windows 11 Home Chinese, x64, build 26200
  • Codex App: 26.818.5345.0
  • Bundled Chrome plugin: 26.818.41705
  • ChatGPT Chrome extension: 1.2.27268.51612
  • Google Chrome: 151.0.7922.170
  • Chrome profile: Default

All packaged diagnostics passed:

  • Chrome was running.
  • The extension was installed and enabled.
  • The native host manifest was present and valid.
  • The registry manifest path and expected extension origins were valid.

Temporary recovery:

Fully quitting both Codex and Chrome, then reopening them, cleared the condition. After restart, tabs.new(), navigation to an HTTPS page, and domSnapshot() all worked again.

Possibly related reports:

This is a current Windows reproduction on the 26.818 app/plugin generation.

Activity

  1. added
    appIssues related to the Codex desktop app
    on Aug 24, 2026
  2. added
    bugSomething isn't working
    windows-osIssues related to Codex on Windows systems
    tool-callsIssues related to tool calling
    on Aug 24, 2026
  3. jiangyuShiro commented on Aug 26, 2026

    @jiangyuShiro
    Author

    Still reproducible on a newer Windows app build.

    Environment:

    • Codex App: 26.820.7780.0
    • Bundled Chrome plugin: 26.820.60940
    • Windows 11 x64

    Observed on August 26, 2026:

    • A Chrome tab remained visibly open, but browser control lost its controlled-tab state.
    • A follow-up operation failed with: Tab not found: <tab-id>. Existing tabs: none.
    • In the same workflow, a previously discoverable external Chrome tab became stale and claimTab() did not return promptly.
    • Creating and using a fresh managed tab restored control temporarily.

    This is not byte-for-byte identical to the original failure: the newer build can now return a bounded Tab not found error instead of only hanging. However, the visible Chrome state and the controller's tab state still diverge, so the stale-session/control-state issue does not appear fully resolved.

    Additional recovery observation:

    • Chrome was not restarted.
    • In a later fresh browser-control session, openTabs() returned the current live tab and claimTab() succeeded immediately when passed that exact newly returned tab object.
    • This transient recovery does not indicate that the bug is fixed. It suggests the stale ownership/binding can be released or rebuilt between control sessions, which also makes the failure intermittent.
  4. jiangyuShiro commented on Aug 26, 2026

    @jiangyuShiro
    Author

    Additional local diagnostics from the same August 26 reproduction:

    Timeline (local time, UTC+8):

    • 19:51:52 — the file chooser wait timed out after 3.09 seconds.
    • 19:52:06 — a second file chooser attempt produced an unhandled timeout rejection and reset the browser-control execution environment.
    • 19:52:16 — the desktop logs reported No ChatGPT browser route is available for browser session <redacted> six times, while openTabs() still returned the visible Chrome tab.
    • 19:52:56 — chrome.user.claimTab(), using the exact object returned by openTabs(), timed out after 30.04 seconds and reset the execution environment.
    • Browser-use PiP content upsert also failed twice between 19:51 and 19:53.

    There was also a local UI error spike during the failed-route state: 231 ResizeObserver loop completed with undelivered notifications messages were logged during 19:52, compared with 19–68 per minute during nearby minutes (19:48–19:51 and 19:53). The laptop fan increased noticeably during the repeated read/claim attempts. Historical per-process CPU data was not recorded, so the exact process responsible cannot be confirmed.

    This strengthens the stale route/ownership hypothesis: discovery can still see the external tab after the control route has disappeared, and claimTab() waits until the outer timeout instead of failing promptly or rebuilding the route.

  5. jiangyuShiro commented on Aug 26, 2026

    @jiangyuShiro
    Author

    One more release/cleanup observation immediately after posting the diagnostics above:

    • After the browser task completed, the same Chrome tab remained shown as controlled.
    • Fully exiting Codex did not release the control state; Chrome still showed the tab as controlled after the Codex process was closed.
    • The user had to fully exit and restart Chrome to clear the state.
    • After Chrome restarted, openTabs() returned only the fresh new-tab page, and a new browser-control session could be established normally.

    This suggests that stale ownership can persist on the Chrome extension/tab side rather than only in the Codex process. A Codex-only shutdown does not always clear it. Cleanup should explicitly release extension-owned tab state, or the extension should detect that its backend/control owner has disconnected and clear the stale state automatically.

  6. yukiex commented on Sep 5, 2026

    @yukiex

    Sanitized follow-up reproduction. No private URLs, site names, page titles, tab IDs, usernames, local paths, account data, page content, screenshots, or raw logs are included.

    Current Windows reproduction on newer builds

    This is a related but slightly different manifestation of the stale per-tab browser-control state described in this issue.

    Environment

    • Windows 11 Home, build 26200
    • Codex App: 26.901.5003.0
    • Bundled Chrome plugin: 26.901.41123
    • Chrome backend: extension
    • Codex In-app Browser backend: iab

    What works

    • The Chrome extension backend remains registered.
    • Chrome Native Messaging registry and manifest checks pass.
    • The current native-host entry is valid.
    • extension-host.exe and node_repl.exe remain alive.
    • A different existing Chrome tab can be claimed and read successfully; title and URL retrieval both work.
    • The affected tab remains visible in tab discovery.

    Failure

    One long-lived authenticated SPA tab remains visible in the discovered tab list, but claiming or using browser control for that tab fails immediately with:

    Debugger unattached
    

    No page interaction is reached after this error.

    The failure is specific to the affected tab: another existing Chrome tab in the same browser session can be claimed and read normally.

    Minimal comparison

    1. Leave the affected tab open without reloading it.
    2. Keep the Chrome extension backend connected.
    3. Confirm that the affected tab is still returned by tab discovery.
    4. Attempt to claim the exact discovered tab.
    5. Open the same application in one fresh Chrome tab.
    6. Claim the fresh tab and read its title and URL.

    Actual result:

    • The affected long-lived tab fails with Debugger unattached.
    • The fresh tab is claimable.
    • Read-only title and URL retrieval from the fresh tab succeeds.
    • No Debugger unattached error occurs for the fresh tab.
    • Chrome, Codex, extension-host, and node_repl do not need to be restarted.

    The affected tab's provider correlation metadata is absent. However, the fresh tab also initially lacks that metadata and is still claimable and readable. This suggests that the metadata field itself is not the root cause; the stale state appears to be associated with the affected tab's per-tab debugger or browser-control session.

    Expected behavior

    When a discovered Chrome tab has lost its debugger attachment or browser-control session, Codex should:

    • revalidate and rebuild the per-tab session when safe;
    • or return a bounded, structured error identifying the failing stage;
    • avoid presenting a stale tab as fully controllable;
    • avoid requiring a full Chrome or Codex restart when other tabs remain healthy.

    The error should distinguish at least between:

    • failure during debugger attach;
    • failure while sending a command after attach;
    • stale tab/session correlation;
    • transport or extension-side detachment.

    This reproduction indicates that Chrome extension discovery and Native Messaging are healthy, while a single long-lived web application tab can retain stale browser-control state across continued use.

  7. carabinshely commented on Sep 9, 2026

    @carabinshely

    P1 - Windows follow-up: a failed CDP click can follow a successfully saved edit

    Feedback submitted through Codex Desktop on 2026-09-09: 01a080e7-dec1-7150-b4c2-08a3a4f3d454.
    Related previous task for internal correlation: 01a07ca7-a09b-78a3-aa9e-6a1bdfd48b40.

    Adding concrete saved-action evidence to this existing Windows browser-control issue rather than opening another broad duplicate. This also appears related to the Chrome input-timeout report. Similar symptoms do not establish a shared root cause or prove a route race in this occurrence.

    Environment: Windows x64 (PowerShell reports Microsoft Windows NT 10.0.26200.0 x64); Codex Desktop; Chrome extension backend; mcp__cua_repl.js from unified-computer-use@openai-bundled. Both session headers record embedded agent 0.153.4, originator Codex Desktop, source vscode. The owner subsequently supplied this exact product version text on 2026-09-09: “Powered by Codex & OWL Version 26.901.51231 — Released 5 Sept 2026”. Subscription: ChatGPT Pro. This owner-reported version is distinct from the embedded agent version above; the exact Chrome version at the incident was not captured.

    P1 - Two saved-action counterexamples

    On 2026-09-08, two separate native GitHub PR-description updates each clicked Update comment exactly once. The tool reported failure; subsequent rendered-page readback confirmed that the new description had saved and edit mode had ended. No second save was sent.

    All times below are UTC:

    Event UTC Tool call ID Result
    First save click 14:28:36.674 call_PtrGYE4P50o8VWBr4hY5nPik Input.dispatchMouseEvent timeout after 1000 ms
    First readback 14:28:43.645 call_LUpYkjgJX42TWYPISm5glDDc saved: true; editing: false
    Second save click 14:30:32.417 call_jirhqbRlnbm8iSOeH4HUIH4u Input.dispatchMouseEvent timeout after 998 ms
    Second readback 14:30:41.521 call_583AFV8oi5ngUZ2ellQUGOw9 Editing ended; an overly strict snapshot-string predicate was false
    Targeted rendered-description read 14:30:46.502 call_1wKgMFrA6MQspdbqp8AqJJLA New description confirmed; no retry of the save

    Exact first error:

    Error: Timed out after 1000ms waiting for CDP command Input.dispatchMouseEvent.
    waiting on click for selector internal:role=button[name="Update comment"s]
    

    The false predicate during the second readback was an agent verification mistake, not another product defect. The targeted follow-up established the actual saved state.

    P1 impact: a generic tool failure is not proof that an external mutation did not happen. Blindly retrying non-idempotent actions can duplicate submissions. No duplicates were observed in this workflow because readback preceded retries. A timeout can legitimately leave an unknown outcome; the requested improvement is explicit dispatch/outcome classification and safe recovery guidance, not cross-system transactional guarantees.

    P1 - Matching attachment and recovery symptoms

    In the same continuation, older Chrome tabs intermittently returned Debugger unattached while a fresh tab to the same site later worked without changing permissions or reinstalling the extension. Fresh tabs initially also timed out, so creating a new tab was not a universal remedy. Examples:

    • 2026-09-08 13:59:15.875 UTC: call_p2gkCAwfJjhis2TqBPMacdJ9 - Debugger unattached.
    • 2026-09-08 14:16:14.760 UTC: call_QoW21AaF8q7ziG1MXNDhzgfF - old queue-tab acquisition failed; a new tab was readable.
    • 2026-09-08 14:26:35.769 UTC: call_unYEQeFpCAXhTBzaT4ZGTztd - old PR tab failed; navigation in a working task tab succeeded.

    Browser inventory remaining readable was insufficient to establish that the affected tab's command channel was healthy. No backend switching was used for these observations.

    P2 - File-chooser deadline observation

    While submitting the private support report on 2026-09-09, two chooser attempts on help.openai.com used waitForEvent("filechooser", {timeoutMs: 10000}) with immediate Promise.allSettled handlers around the chooser and click. Both clicks fulfilled; both chooser promises rejected with Timed out after 3000ms waiting for file chooser. despite the requested 10000 ms. The file input was inside the visible ChatKit iframe and accepted images/PDF. No chooser object was returned, no files were uploaded, and the kernel survived. Site behavior, iframe handling and effective timeout budgeting remain possible explanations; cause is not established.

    P1 - Previous-session bootstrap context is already tracked separately

    The previous task timed out and reset at 2026-09-08 10:53:25.658 UTC, then initialization failed at 10:53:31.248 and again at 10:53:45.106, including after an explicit successful reset, with:

    failed to write kernel assets: The system cannot find the path specified. (os error 3)
    

    That signature is already tracked in Issue #41359. It is included only as preceding context; no missing-directory inspection or root-cause confirmation was performed in this occurrence.

    Safe investigation and expected behavior

    Use a disposable PR or test form: acquire the Chrome tab, open its native editor, fill a unique harmless marker, and click Update comment once. If a CDP timeout occurs, inspect the saved page before any retry. This is a field recipe, not a guaranteed deterministic reproducer; do not test it against production publishing workflows.

    • P1: distinguish pre-dispatch expiry, dispatched/response-unknown, detached debugger and vanished target.
    • P1: recover or clearly diagnose a stale per-tab attachment without claiming the entire extension is disconnected when other tabs work.
    • P2: document effective chooser deadlines and immediately handled promise patterns.

    The detailed report and 60 selected sanitized evidence records were also sent privately to OpenAI Support, which stated that the conversation was escalated to a support specialist. Engineering receipt or a fix is not confirmed. Public content here omits business URLs, page contents, email, local paths, screenshots and raw rollouts; the Feedback ID provides the internal correlation point.

  8. jiangyuShiro commented on Sep 10, 2026

    @jiangyuShiro
    Author

    This issue no longer reproduces in my current setup, so I am closing it as resolved for now. I cannot yet confirm whether it might recur; if it does, I will follow up with updated reproduction details.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    appIssues related to the Codex desktop appbrowserbugSomething isn't workingtool-callsIssues related to tool callingwindows-osIssues related to Codex on Windows systems

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions