Skip to content

Windows Codex App: Chrome automation receives HTML instead of JSON; durable WebSocket reconnects return 403 #50412

Open

Description

@nersesmamulyam-pixel

What version of the Codex App are you using?

26.930.2377.0 (installed Windows package version; About dialog not independently captured).
Bundled Chrome plugin: 26.930.21537.
Official ChatGPT Chrome extension: 1.26.901.11451, ID hehggadaopoacecdllhhajmbjkdcmajg.

What subscription do you have?

Pro.

What platform is your computer?

Microsoft Windows NT 10.0.26100.0 x64.

What issue are you seeing?

Chrome automation fails before returning tabs or opening a page:
Unexpected token '<', "\n <"... is not valid JSON

Concurrently, desktop logs show repeated AppServerConnection WebSocket failures approximately every 20 seconds:
2026-10-02T19:00:45.404Z websocket_error: Unexpected server response: 403
2026-10-02T19:01:05.615Z websocket_error: Unexpected server response: 403
2026-10-02T19:01:25.808Z websocket_error: Unexpected server response: 403
The connections are identified as hostId=durable, transport=websocket; closure code1006 follows.
Read-only inspection of the installed desktop code links durableThreadHostConfig to wss://codex-cloud-backend.chatgpt.com/.

What steps can reproduce the bug?

  1. Use the Windows desktop app with the official ChatGPT Chrome extension enabled.
  2. Request the Chrome tab inventory or ask Codex to open https://example.com/ in Chrome.
  3. Observe the HTML-as-JSON parsing error.
  4. Inspect desktop logs for the accompanying durable WebSocket reconnect failures.
    The environment has a Windows system proxy at127.0.0.1:10809, listening process xray. TCP snapshots show Codex/ChatGPT processes connecting to this proxy. The individual durable socket was not uniquely identified.

What is the expected behavior?

Chrome inventory/navigation should succeed, or return an actionable transport/authentication error rather than attempting to parse an HTML response as JSON.

Additional information

Unauthenticated HEAD probes to https://codex-cloud-backend.chatgpt.com/ on2026-10-02:

  • Direct,19:25:07UTC: HTTP403; Content-Type:text/html;charset=UTF-8; Server:cloudflare; CF-RAY:a446175b5d449780-ARN. No cf-mitigated header was present in the selected response headers.
  • Through the existing proxy,19:25:07UTC: CONNECT200, then HTTP403; same Content-Type; Server:cloudflare; cf-mitigated:challenge; CF-RAY:a446175dba5bbc19-VNO.
    Both curl processes exited0 with TLS verification enabled. curl8.21.0/Schannel does not advertise HTTP/2 support in this installation.

The owner opened the same HTTPS address manually in Chrome with proxy settings unchanged and reported:
{"error":{"code":-32002,"message":"identity-edge rejected app-server-backend request authentication"}}
This is an owner-reported response, not a captured browser network trace.

Separate IAB logs show route capture/startup_ready, then successful and failed getInfo calls sharing one turnId, including "No ChatGPT browser route is available". These IAB events are not proven to cause the Chrome error.

Native-host registration/path are valid; latest resolves to Chrome plugin26.930.21537. extension-host.exe --help exits0 with no output; this does not verify its messaging handshake.

Limits: actual durable handshake response headers/body and Ray ID were not captured. The browser, HEAD and WebSocket requests differ in method/authentication. No User-Agent comparison, TLS fingerprint measurement, proxy-disabled desktop restart or authenticated WebSocket probe was performed. Cloudflare client classification, authentication and proxy/upstream effects remain hypotheses. The durable403 and ChromeJSON failure are temporally correlated, not causally linked.

Please help identify which request returns HTML to Chrome automation and whether the durable403 originates from edge mitigation or identity/authentication rejection, and provide a supported way to capture sanitized handshake status/headers without exposing tokens or cookies.

Related context, not a confirmed duplicate:
#21735

No credentials, cookies, private conversation content or full logs are included.

Activity

  1. added
    bugSomething isn't working
    appIssues related to the Codex desktop app
    windows-osIssues related to Codex on Windows systems
    connectivityIssues involving networking or endpoint connectivity problems (disconnections)
    app-serverIssues involving app server protocol or interfaces
    on Oct 2, 2026
  2. github-actions commented on Oct 2, 2026

    @github-actions
    Contributor

    Potential duplicates detected. Please review them and close your issue if it is a duplicate.

    Powered by Codex Action

  3. nersesmamulyam-pixel commented on Oct 2, 2026

    @nersesmamulyam-pixel
    Author

    Regarding the suggested duplicate #49548: that report describes a CUA launcher proxy-environment regression after updates, with successful browser-control verification on an earlier repaired runtime and a restart/live retest still pending for its September 30 build.

    This report adds concurrent AppServerConnection/hostId=durable WebSocket 403 failures and separate unauthenticated HEAD response headers. Importantly, cf-mitigated: challenge was observed only in the HEAD probe through the proxy; actual durable WebSocket response headers were not captured. TCP snapshots also do not establish the proxy configuration or route of the specific CUA process/request that returned HTML.

    We therefore cannot yet confirm either a shared cause or a different mechanism. The CUA proxy-environment regression remains a relevant possibility; the relationship between the durable failures and the Chrome JSON parsing error is unproven. Please compare the affected request/process before treating this as a confirmed duplicate.

  4. tomhda commented on Oct 5, 2026

    @tomhda

    Same durable 403 loop here, starting right after the server closed the connection.

    • Codex desktop 26.930.31730, build 12947 (MSIX OpenAI.Codex 26.930.3930.0)
    • Windows 11, Microsoft Windows NT 10.0.26200.0 x64
    • ChatGPT Pro (5x)
    • Chat type: cloud chat created by Dot, shown as "Cloud" / "Runs on your computer when available", bound to a local Windows project folder
    • Local chats on the same machine work normally

    Earlier the same day the durable connection dropped 7 times (code 1006) and reconnected within 1–2 seconds each time. The last drop did not recover:

    13:57:32Z  durable connected
    15:35:58Z – 15:40:49Z  27 turn/start requests rejected with -32602 (AbsolutePathBuf deserialized without a base path)
    15:41:18Z  app_server_connection.closed code=1006 hostKind=durable   (closed by the server)
    15:41:19Z  websocket_error "Unexpected server response: 403"
    ...        the same 403 on every attempt, every 20 s, 135 times by 16:07Z, still failing
    

    There were two bursts of renderer-requested reconnects (cause=reconnect_requested: 34 within about 7 seconds at 15:42Z, 10 at 15:51Z). I believe these came from pressing Reconnect and retrying sends. They happened after the first 403, so they did not cause it.

    What I checked:

    • The stored ChatGPT access token was still valid (expires 2026-10-05T23:32Z), and local chats kept working. This is not an expired sign-in.
    • An unauthenticated WebSocket upgrade request to https://codex-cloud-backend.chatgpt.com/ from the same machine at 16:01Z returned HTTP 403, Server: cloudflare, Cf-Mitigated: challenge, and an HTML challenge page. I could not capture the response body the desktop app received. It is the same host and status, so the app appears to be receiving a Cloudflare challenge that it cannot answer.

    What the app does with it: it logs Unexpected server response: 403, shows that string in the sidebar tooltip, and retries the same connection every 20 seconds. It does not say that the connection was blocked by a challenge. It does not offer a way to pass the challenge or to re-authenticate, and it never stops retrying.

    While the durable host is disconnected, cloud chats are greyed out in the sidebar and cannot be opened. Opening the chat through the link shown by Dot worked for a while, then stopped working too. Reloading the window does not help.

    Expected:

    • The durable endpoint should not answer an authenticated desktop client with a browser challenge it cannot solve.
    • If the connection is refused, the app should say why and what to do, instead of showing a raw 403.
    • A cloud chat's history should stay readable while the connection is down. Right now the chat cannot be opened at all.
  5. viniciusfoscaches commented on Oct 5, 2026

    @viniciusfoscaches

    Additional Windows observation on October 5, 2026, scoped to the durable WebSocket 403 loop reported here. Chrome automation was not tested in this investigation.

    Verified post-update environment

    • Registered and running desktop package: 26.930.4958.0
    • Bundled CLI and separately installed npm CLI: 0.160.0
    • The running process and current logs point to the updated installation, not an older app instance

    Diagnostic results

    Read-only checks completed at approximately 17:06 UTC:

    • The local app-server completed its stdio handshake successfully at 16:50:04 UTC.
    • The desktop's remote/durable WebSocket connection receives HTTP 403, closes with code 1006 before initialization, and retries approximately every 20 seconds.
    • Native conversation tools are now exposed, but list/read requests return MCP error -32000, including calls explicitly targeting hostId=local.
    • The user reports the UI message “Codex app server not available.”

    The successful local stdio handshake and failed durable connection are separate observations. We have not established the full request path causing the native local-tool calls to fail, nor whether the 403 comes from authentication, an edge challenge, or another service decision. No actual handshake response headers/body were captured, so this report does not identify Cloudflare or a proxy as the cause.

    An earlier connection-refused/socket error was traced to a historical optional-daemon entry dated September 16; it is not evidence that the current stdio app-server is unavailable.

    This follows an earlier existing-local-thread routing report. A causal connection between this 403 loop and that placement-region-15 rejection has not been established. The update likewise does not establish that the update caused this failure.

    Please provide a supported recovery or narrowly scoped diagnostic that distinguishes a refused durable handshake from local app-server startup failure. An actionable explanation in the UI would also help avoid unnecessary restarts or resets.

    No authentication/security settings, credentials, or session stores were changed during these post-update checks. No additional restart was attempted as a repair. Private identifiers, local paths, project contents, credentials, and raw logs are omitted.

  6. jzwtarot98 commented on Oct 5, 2026

    @jzwtarot98

    Additional Windows report of durable WebSocket HTTP 403

    Summary

    On Codex desktop for Windows, my cloud tasks that use the durable / Long-lived host have been unavailable since approximately 2026-10-05 15:47 UTC. The desktop log repeatedly records Unexpected server response: 403 while opening its WebSocket connection. Local sessions still work.

    An independent WebSocket-upgrade probe to wss://codex-cloud-backend.chatgpt.com/ through the same proxy route received HTTP/1.1 403 Forbidden with Cf-Mitigated: challenge. This directly establishes the Cloudflare challenge on the probe. The desktop log records the 403 status but does not include response headers, so I cannot confirm from the log alone that its response was the same challenge.

    Timeline from the desktop log excerpts

    • 2026-10-05 13:27:41 UTC: last recorded transition to next=connected for durable.
    • 2026-10-05 15:41:12 UTC: that established connection closed with WebSocket code 1006. This is a closure event, not a new successful connection.
    • 2026-10-05 15:47:24 UTC: first recorded app_server_connection.websocket_error for durable with Unexpected server response: 403.
    • In the supplied log excerpt through 2026-10-05 17:23:46 UTC, there are 296 websocket_error lines reporting 403 and no further next=connected transition. The much larger count of 4,647 lines mentioning 403 includes repeated state notifications and should not be interpreted as 4,647 separate connection attempts.

    The exact time or cause of any server-side change is unknown. The 15:41–15:47 UTC interval is the interval between the last established connection closing and the first observed 403, not proof of when a mitigation rule changed.

    Network observations

    • A WebSocket upgrade to codex-cloud-backend.chatgpt.com/, without an account token, returned 403 with Cf-Mitigated: challenge and a Cloudflare HTML challenge page.
    • The supplied tests selected six regional routes and then twelve individual nodes. All 18 route-sweep records received 403 and Cf-Mitigated: challenge. These records do not establish that every route was tested with a WebSocket upgrade or verify 18 distinct public egress IP addresses; the separate WebSocket-upgrade probe above confirms that handshake case for one tested route.
    • In plain GET controls from the compared route, chatgpt.com/backend-api/codex/responses returned 405 without a challenge, and ws.chatgpt.com/ returned 404 without a challenge. chatgpt.com/ itself also returned a challenge, so the observation is path-dependent and does not rule out egress reputation as a contributing factor.
    • A probe with an intentionally invalid bearer token received the same challenge. This does not establish how a valid desktop credential would be handled or whether the desktop request reached application authentication.

    Routing comparison added on 2026-10-05 17:19–17:23 UTC

    I also compared two ways to route the desktop traffic through my local proxy: the usual WinDivert-based proxifier and, during a short test interval, TUN routing with that proxifier stopped. The proxy log attributed connections to codex-cloud-backend.chatgpt.com:443 to ProxyBridge_CLI.exe before the switch and to ChatGPT.exe in the TUN test interval. At corresponding times, the desktop continued logging durable WebSocket 403 errors. Both modes used the same selected upstream route.

    This makes a failure confined to the proxifier handoff less likely. It does not rule out the shared proxy/egress path, other client behavior, or server-side causes. The proxy log shows process attribution and destination, while the desktop log supplies the 403; it does not capture the HTTP response headers for the desktop request.

    Environment and impact

    • Windows 11, build 10.0.26300
    • Codex desktop MSIX OpenAI.Codex version 26.930.4958.0
    • Host durable, display name Long-lived, WebSocket endpoint wss://codex-cloud-backend.chatgpt.com/ (endpoint identified in the supplied desktop-bundle excerpt)
    • The cloud task list shows Unexpected server response: 403; opening a cloud task fails to restore its conversation. Local sessions remain usable.

    Request

    Could you check whether a Cloudflare mitigation or risk policy affecting codex-cloud-backend.chatgpt.com changed around 2026-10-05 15:41–15:47 UTC, and whether it can challenge the shipped desktop client's WebSocket handshake? If this behavior is intended, please advise on a supported way for the desktop client to complete the handshake or provide another supported transport. Please also let me know whether there is a client-side recovery step I can take.

    A sanitized evidence appendix with selected timestamps, response headers, and log excerpts is included below. Account, installation, server, and environment identifiers are omitted from this public report.

    Sanitized evidence appendix

    Evidence appendix for durable WebSocket 403

    This appendix contains selected, sanitized observations from a user-supplied diagnostic package. The statements about the desktop are based on its extracted logs; the network headers are from a separate probe through the user's proxy route. No current independent live reproduction was performed while preparing this appendix.

    Desktop log excerpts

    The package contains 171 lines selected by a broad connected-state filter. They are not 171 separate successful connections. Of these, 22 lines show an AppServerConnection transition to next=connected; the latest is:

    2026-10-05T13:27:41.015Z ... app_server_connection.state_changed ... hostId=durable ... initialized=true ... next=connected ... transport=websocket
    

    The later 15:41:12 event is the closure of an already-established connection:

    2026-10-05T15:41:12.761Z ... app_server_connection.state_changed cause=transport_closed closeCode=1006 ... currentState=connected ... hostId=durable ... next=error ... transport=websocket
    

    The first recorded 403 is:

    2026-10-05T15:47:24.776Z error [AppServerConnection] app_server_connection.websocket_error connectionId=44 errorCode=unknown hostKind=durable message="Unexpected server response: 403" transport=websocket
    

    The extracted logs through 2026-10-05 17:23:46 UTC contain 296 app_server_connection.websocket_error lines reporting 403. They also contain 4,647 total lines with the exact 403 message because connection errors are propagated into several state-change and UI notifications. The excerpt has no later next=connected transition. These are counts within the supplied excerpt, not a full re-scan of the user's retained desktop logs.

    Independent probe response

    An unauthenticated WebSocket upgrade to wss://codex-cloud-backend.chatgpt.com/ returned:

    2026-10-05T16:40:46.480Z [ws-noauth] HTTP/1.1 403 Forbidden
    Content-Type: text/html; charset=UTF-8
    Cf-Mitigated: challenge
    Server: cloudflare
    CF-RAY: a45ddeae0f301e11-LAX
    

    The probe records a Cloudflare HTML challenge page. A GET request, a WebSocket-upgrade request with an intentionally invalid bearer token, and a browser-like User-Agent also received 403 with Cf-Mitigated: challenge. The invalid-token comparison is not evidence about a valid desktop token or the backend authentication order.

    Route selections and controls

    The six recorded regional selections (US, JP, HK, SG, TW, Edge) each returned 403 and Cf-Mitigated: challenge. Twelve further sequential node selections each returned the same. The route-sweep logs do not record the HTTP request line or public egress IPs; they cannot establish WebSocket-upgrade failure on all 18 routes or prove 18 distinct egress IPs. The separate ws-noauth record above demonstrates the WebSocket-upgrade case for one tested route.

    Plain GET control requests from the compared route returned:

    Target Result
    chatgpt.com/backend-api/codex/responses 405 Method Not Allowed; no challenge header
    ws.chatgpt.com/ 404 Not Found; no challenge header
    chatgpt.com/ 403; Cf-Mitigated: challenge
    codex-cloud-backend.chatgpt.com/ 403; Cf-Mitigated: challenge

    The responses show path-dependent behavior. They do not establish that all other requests from these routes bypass mitigation.

    Proxifier and TUN comparison

    The updated package adds a proxy-and-desktop-log watch from 2026-10-05 17:19–17:23 UTC. The user reports stopping the WinDivert-based proxifier and enabling TUN routing for a short interval. Before the switch, a proxy entry at 17:19:46 UTC attributed a connection to codex-cloud-backend.chatgpt.com:443 to ProxyBridge_CLI.exe. During the reported TUN test interval, an entry at 17:20:05 UTC attributed a connection to the same destination to ChatGPT.exe. Both entries used the same selected upstream route. The desktop log independently recorded durable WebSocket errors with Unexpected server response: 403 at 17:19:44.856, 17:20:05.243, and repeatedly afterward through 17:22:12.796 UTC, without a connected transition.

    The watch file truncates the app log lines before the 403 message; the full message at those timestamps was checked in the updated applog-durable-403-excerpt.log. The proxy log's process attribution and destination correlate with the app failures but do not provide desktop HTTP response headers or a packet-level link to each error. The watch also records proxifier-attributed traffic again after 17:22 UTC, so the proxifier-off claim applies only to the reported test interval, not the whole watch period. All private and loopback addresses and ephemeral ports have been omitted.

    Source scope and privacy

    Source entries within the supplied package: 01-dots-cloud-403-report.md, applog-excerpts connection excerpts and summary, and evidence files for raw HTTP probes, six regional selections, twelve node selections, host comparison, and the TUN/proxifier watch. The separate airport idle-connection report and its logs concern a different failure mode and are excluded. The tool scripts and original full desktop logs are excluded.

    The source report includes account, installation, server, environment, and machine-name identifiers. The selected public excerpts omit these identifiers, local file paths, proxy or egress IPs, and credentials. The package was checked for obvious credential-bearing headers in the selected logs; none were found. That is not a guarantee about files outside the supplied package.

  7. jzwtarot98 commented on Oct 5, 2026

    @jzwtarot98

    Update to my report above: at approximately 2026-10-05 17:50 UTC, the desktop cloud-task connection recovered after I switched to a different proxy provider, rather than another node within the previous provider.

    The earlier route tests therefore should not be taken as ruling out provider/egress-path effects. The exact mechanism remains unknown; this observation does not identify whether the difference is egress reputation, routing, client classification, or another factor. Recovery is currently based on my desktop observation, not a newly captured handshake trace.

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 appapp-serverIssues involving app server protocol or interfacesbrowserbugSomething isn't workingconnectivityIssues involving networking or endpoint connectivity problems (disconnections)windows-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