Repository navigation
[Windows] "Unable to load browser request-header policy": ~4.8 MB Statsig initialize payload appears to exceed the nodeRepl.fetch response limit #46129
Description
Summary
On Windows, every browser command through the Edge extension fails before any tab access with:
Unable to load browser request-header policy. Retry the browser command.
The extension, native-messaging host, and browser registration are all healthy, and codex doctor (run outside the sandbox) reports everything green. Directly fetching the same policy endpoint from the same machine returns HTTP 200 with a 4.2–4.8 MB body, which points at the privileged authenticated_fetch response limit on this path rather than at the user's network or at the extension.
This report adds the payload-size evidence that the related reports do not contain.
Environment
- Codex Desktop
26.908.9136(Windows 11 build 26200, MSIX; "Powered by Codex & OWL") - Bundled plugins:
browser@openai-bundled 26.908.70816,chrome@openai-bundled 26.908.70816 - ChatGPT browser extension:
odlomjlbamekndcpllcnffbgeohgkmjhv1.26.901.11451(Microsoft Edge, enabled, Default profile) - Failing gate:
codex_browser_use_agent_request_header, checked inbrowser-service.mjs(_k()); enforced from the extension browser client'ssendSessionRequest()
Steps to reproduce
- Start a browser task that uses the installed Edge extension (an
@Edgemention in the desktop app), or callcua.getState()/cua.listTabs()throughcua_repl. - Every call fails after roughly 20 seconds with:
{"apps":[],"browsers":[],"errors":["Browsers: Error: Unable to load browser request-header policy. Retry the browser command."]}- Retrying, restarting the app, reinstalling the extension, re-materializing the plugin cache, and re-registering the native host all reproduce the failure.
@Browser(the in-app browser) is unaffected.
Evidence that the user-side chain is healthy
scripts/check-native-host-manifest.js --browser edge --json→correct: true(registry key, manifest file,allowed_originsall valid)extension-host.exeis launched by Edge through native messaging and listens on loopback- The browser is registered with the browser service (
extensionInstanceIdis returned bycua.listBrowsers()) codex doctor(outside the sandbox) → provider reachability OK, MCP OK, sandbox OK
Evidence pointing at the privileged fetch / payload size
Replaying the SDK's own initialize request from the bundled Node runtime on the same machine:
POST https://ab.chatgpt.com/v1/initialize?k=<browser-service client key>&st=js-mono&sv=3.33.1&t=…&sid=…
body: {"user":{"userID":"…"},"statsigMetadata":{"sdkType":"js-mono","sdkVersion":"3.33.1"},"sinceTime":0}
→ HTTP 200, 4,774,624 bytes
dynamic_configs: 1128 entries → 4,532,289 bytes (~95%)
layer_configs: 162 entries → 133,352 bytes
feature_gates: 398 entries → 107,727 bytes
(the hashed name for `codex_browser_use_agent_request_header` is present; `is_delta:false`)
- The response is 4.15–4.8 MB across repeated calls (it tracks the server-side config set; the request body contains no tab, page, or browsing data — a synthetic
userIDwas used for the measurement). - Because the Statsig client starts cold (
sinceTime: 0, no cached values), the SDK always asks for the full payload and the server never returns a delta. - Small responses through the same privileged path succeed (e.g.
https://chatgpt.com/backend-api/aura/identity), so authentication and the IPC bridge itself work; the difference between the working and the failing call is the response size. node_repl.execontains the error stringnodeRepl.fetch response is too large, andauthenticated_fetch.rsexposesnodeRepl.fetch request failed/nodeRepl.fetch response read failed— consistent with a response-size limit on this path.- Because
browser-service.mjscaches the initialization state in the module-levelVrsingleton, a single failed initialization makes_k()throw the fail-closed error for every later call in that process (this matches the behaviour described in Bug Report: Codex Desktop (Windows) Browser Use — Persistent Statsig Initialization Failure Within a Session #45366).
Expected behavior
Either the privileged fetch should be able to deliver the Statsig payload (or request a delta / use a compact endpoint), or a policy-initialization failure should degrade to "request-header capability disabled" instead of failing the whole extension browser client closed. The current message tells the user to retry, but a retry inside the same process cannot succeed.
Impact
Extension-based browser automation (Edge/Chrome) is completely unusable on the affected machine — no tab listing, no page reads — even though the extension and native-messaging host are healthy and @Browser still works.
Local mitigation in place (not a fix)
On the reporting machine the policy check was made fail-soft locally (an unavailable policy is treated as "request-header capability disabled"), which restores tab/page operations without granting any additional capability — the request-header feature stays off. This is only a local workaround; reporting here so the underlying fetch limit can be fixed properly.
Related reports
#44112, #44140, #44169, #44761, #44988, #45366, #45678, #45910, #45990
Activity
github-actions commentedon Sep 17, 2026
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
knightli commentedon Sep 21, 2026
Local reproduction: large Statsig initialization response, proxy path, and two 10-second timeouts
I reproduced a closely related failure on Windows with Codex Desktop
26.915.4065.0and CUA/browser runtime26.915.31945. The symptoms are very close to the large Statsig initialize payload described here, but I think several layers should be separated.My original local bridge workaround hard-coded an older Desktop/CUA directory. After Desktop updated, it no longer matched the active configuration, so
cua_repldid not inherit the existing proxy variables. The initial error was:I changed the workaround to discover the active CUA configuration and trusted service by capability rather than by version, and to inherit the existing
HTTP_PROXY,HTTPS_PROXY,ALL_PROXY, andNO_PROXYvalues. The error then changed to:That transition was useful evidence: the proxy path was now working, but Statsig initialization still did not complete within the bundled browser service's deadline. A request to
https://ab.chatgpt.com/v1/initializethrough the same proxy returned HTTP 200 with a body of about 4.9 MB; on this network path the complete response took roughly 7–15 seconds. The current service has two separate 10-second limits: one around Statsig initialization and one for the network request. The log contained:For local diagnosis, I raised both limits to 30 seconds only after matching the expected browser-service capability shape, and kept a backup of the original source. After restarting:
cua.getState()returned no browser errors;createBrowserTab("https://example.com")succeeded;getAXState()returned the visible Example Domain content.This verifies the CUA trusted browser service path; it is not, by itself, proof that every Edge/Chrome-extension-specific request-header path is covered.
My current assessment is that this is the same problem family as the large Statsig initialization/fetch failure reported here, but I cannot prove that this machine hit exactly the
nodeRepl.fetchresponse-size limit described in this issue. There is also a concrete 10-second timeout problem. If the failed initialization state is then cached at module scope, the persistent failure behavior described in #45366 can be layered on top.Possible upstream fixes:
The local workaround is only diagnostic: ensure the actual CUA process inherits the proxy variables, then make a capability-checked, reversible adjustment to the two Statsig 10-second windows in the current trusted browser service. It does not bypass policy evaluation; Statsig still has to initialize successfully and reach
Ready. It is not an official fix and should be revalidated after upgrades; a hard-coded version path is not reliable.b0807249 commentedon Sep 26, 2026
Another Windows data point, in case it helps narrow this down.
Environment: Windows 11 (build 26200), Codex Desktop MSIX 26.917.9434 → updated to 26.924.1866 during the incident; bundled browser/chrome plugin 26.917.71314 → 26.924.20706; cua_node runtime Node v24.21.0; ChatGPT Chrome extension 1.26.901.11451 (Chrome, extension backend).
Symptom: same as above:
Unable to load browser request-header policy. Retry the browser command.before any tab access, oncua.listTabs,cua.getTab,cua.getState, andcua.createBrowserTab.What the local session logs show (browser calls classified by pattern, so rates are approximate):
Things ruled out on this machine:
Codex auth token is unavailable, and the same runtime flips fail → ok → fail within minutes.ab.chatgpt.comcompletes in ~0.27 s (DNS 34 ms, TCP 9 ms, TLS 71 ms, first byte 153 ms). DNS returns IPv4 only, and the bundled Node hasautoSelectFamily=true, so there is no IPv6 stall.timeoutMs: 1e4for Statsig initialize/updateUser, same default 10 s network timeout).This fits the payload-size /
authenticated_fetchexplanation in this issue: the endpoint itself is fast, but the large initialize response through the privileged fetch path intermittently exceeds the 10 s windows. A longer or configurable timeout, failing soft when the policy can't be loaded, or a smaller/cached policy payload for cold starts would each help. Happy to test a build.b0807249 commentedon Sep 26, 2026
Follow-up / correction to my comment above:
ab.chatgpt.com) came from a credential-free request that got a 403 from the edge. It shows the host is reachable, not that the initialize path behind it was fast. Please don't read it as ruling out the server side.kirrrto commentedon Sep 28, 2026
Additional Windows/Chrome reproduction on 2026-09-28:
cua.getState()returnsapps: [],browsers: [], andBrowsers: Error: Unable to load browser request-header policy. Retry the browser command.An explicitcua.getTab(..., {browser: 'chrome'})fails with the same error before the tab can be read. Repeated calls and a CUA JavaScript runtime reset did not change the result.codex doctor --summaryreports provider endpoint reachability and WebSocket connectivity; I am not claiming that all doctor checks pass.This persists on 26.924 and blocks browser tab discovery. Please expose the underlying policy-initialization error and fix the external-browser path. No policy bypass or security-setting changes were attempted.
kang-yuhang commentedon Oct 1, 2026
Windows / Edge: Brotli transport workaround verified with a patched-stock-patched comparison
Adding a Windows/Edge validation of the approach in #44988 (comment). This is a local workaround, not an official fix or proof that every instance of this error has the same cause.
Environment
26.928.31416, build12553; MSIX package version26.928.3736.0.1.26.901.11451_0, installed and enabled.correct: true.@oai/browser-desktop/servicein the bundledcua_noderuntime, not the older browser-plugin cache copy.Failure
External Edge control failed before page access with:
The in-app browser worked, but was not treated as evidence that Edge was repaired. Increasing the initialization timeout to 30 seconds did not help. Increasing initialization to 45 seconds and the network timeout to 30 seconds also did not help; both changes were reverted.
Narrow workaround
Only the Statsig
networkOverrideFuncforhttps://ab.chatgpt.com/v1/initializewas wrapped:Accept-Encoding: br, still calling the original bound transport fetch and preserving the original identity, method, body, signal and other request options.Controlled validation, with the network configuration unchanged
Times above are complete tool-call wall times, not isolated HTTP request timings. An Edge page screenshot was also obtained successfully. Eleven local tests passed, covering compressed responses with/without encoding metadata, already-decoded JSON, unrelated URLs, HTTP/transport failures, malformed data, non-JSON output, decompression size limits and preservation of original request options.
This comparison supports the initialization response transport/decoding path as an actionable failure point on this installation. It does not establish an exact internal response-size limit, exclude every network/server contribution, or independently prove which layer mishandles encoding metadata.
No proxy/VPN settings, firewall rules, browser profile, cookies or login state were changed during this comparison. The runtime edit was backed up and remains reversible; an app update may replace it. Do not overwrite a newer runtime with an old bundle.
Upstream request: please support compressed initialization responses end-to-end through the existing authenticated transport, preserve fail-closed policy checks, and expose the underlying transfer/decode/timeout error instead of only the generic retry message.
No credentials, account identifiers, private browsing data, local usernames/paths, IP addresses or raw session logs are included.
masashinew-byte commentedon Oct 2, 2026
Additional offline findings for the request-header policy failure on Windows. The currently inspected installation is Codex Desktop 26.930.21537 (build 12776); this does not establish which build was running when the original incident began.
I extracted the installed browser-service readiness functions, relevant Statsig SDK methods, and privileged-fetch bridge into a deterministic harness. Storage, network, and IPC were replaced with local fixtures. No live requests or installed-file modifications were made.
success: falseis still marked initialized. Repeated initialization/policy reads reuse the failed promise, even after the simulated transport becomes healthy. A late successful response does not change that settled result.updateUserAsyncpromise. The service has a metadata return path before that normal user-update hook. This supports a failure-persistence mechanism, not a claim that every command is permanently stuck.An isolated guard prototype preserves the existing 10-second timeout, shares one ordinary SDK recovery update among concurrent policy readers, preserves failure causes, and keeps recognized gate values and unrecognized-gate rejection unchanged. Rejected initialization remains fail-closed; only resolved unsuccessful results are recovered. All 16 original-behavior/prototype checks passed.
These tests establish persistence and diagnostic-loss mechanisms. They do not establish the original live transport failure or a response-size limit on this machine. Capturing SDK update details, response byte counts, and correlated privileged IPC outcomes would distinguish those causes. The prototype has not been integrated into the installed runtime.
minyewu commentedon Oct 3, 2026
Windows Chrome / Edge: update-safe handling of the Brotli workaround (official build first)
Following up on the Brotli transport workaround above, with an update regression and a way to avoid automatically applying an obsolete patch after an official fix.
What happened on this installation
After upgrading to Windows MSIX package
26.930.3748.0, Chrome and Edge again reportedUnable to load browser request-header policy. The update replaced the CUA runtime directory and restored the unmodifiedbrowser-service.mjs. Its SHA-256 was identical to the previously backed-up original:After independently backing up the new runtime's original file, the same narrow Brotli wrapper was reapplied. Two test rounds, each starting with a fresh CUA kernel, passed in both external browsers: four opens/page reads total, plus click/back checks in the first round and screenshots in the second. These were Chrome/Edge extension tests, not a substitution with the in-app browser.
The wrapper only handles POST requests to
https://ab.chatgpt.com/v1/initializethrough the existing authenticated fetch. It requests Brotli, accepts already-decoded JSON, otherwise performs bounded Brotli decoding with strict UTF-8/JSON validation. Authentication, request identity/options, timeouts, recognized policy checks and rejection on initialization failure remain intact. It does not fabricate policy data or disable the policy check.Why checking only the browser-service hash is insufficient
An official fix could land in the desktop app or native/privileged transport while leaving
browser-service.mjsunchanged. An update watcher that blindly reapplies a matching old patch could then keep an unnecessary workaround indefinitely.I implemented a local PowerShell launcher with a stricter, original-first rule:
The core decision flow is:
Implementation safeguards
Sort-Objectproduced different ordering between PowerShell 5.1 and 7 despite identical inputs. Use explicit UTF-8 for JSON, and UTF-8 BOM for scripts containing non-ASCII text when supporting 5.1. For the .NETFile.Replaceoverload used here,[NullString]::Valueavoids the empty-path binding problem encountered with$null.Validation and limits
18 offline transport tests and 25 isolated launcher/guard tests passed. The guard tests included changed desktop/backend bytes with unchanged service source, approval invalidation, stock restoration, unknown-source rejection, exact-error approval, backups, atomic apply/restore, running-process refusal, and UTF-8 state round-tripping. Cross-PowerShell fingerprint consistency and the real running-process refusal were also checked.
The isolated guard tests did not launch the real desktop app, and a complete desktop restart after installing this launcher has not yet been tested. The browser passes above validate the reapplied transport workaround, not the launcher's full restart path or long-term reliability. An earlier stock rollback also temporarily worked on this installation, so this does not prove a unique root cause or exclude intermittent server/network contributions. A hash cannot detect a server-side fix; the restore/disable action remains useful even without a local build change.
This remains a reversible local workaround. The preferred outcome is an upstream transport fix, retaining rejection when policy initialization fails and providing the underlying transfer/decode/timeout cause. Once a new official build works unmodified, it should stay unmodified.
masashinew-byte commentedon Oct 4, 2026
Follow-up: request-header policy failure recurs on Windows MSIX 26.930.3930.0
The same policy-loading failure recurred on 2026-10-04 during a Chrome-extension-backed browser workflow. The initial
cua.getState()call and one ordinary reacquisition both failed withUnable to load browser request-header policy. Retry the browser command.The workflow stopped before owner-page verification or any new page action.Read-only environment verification:
26.930.3930.0.@oai/browser-desktoppackage:0.1.1.64b3e6758957d209c58755c9d198237021124f14060b14edb4f9b74288851667, byte-identical to the service examined in my earlier comment #5955162116.1.26.901.11451; background script SHA-256:83b7b7708ab82ecc9aa2ccad20a2167941a706b38a9467dee0bb124d13f0033e.The inspected code still collapses unsuccessful readiness into the generic policy error. A failed initialization can be retained on paths that skip the normal same-user update. The ordinary same-user update can recover, so this is a conditional failure-retention mechanism rather than proof that all browser calls permanently fail. Our earlier deterministic extraction tests establish that mechanism; this follow-up verifies the identical inspected service and a new real failure.
The initial fetch status, response byte count, SDK error, elapsed time and privileged IPC completion are absent from the saved call observation. Consequently, we cannot establish whether this recurrence was triggered by an oversized response, network failure, IPC failure or another initialization error. The payload-size findings in this issue have not been verified on this installation.
A bounded desktop-log review found network-change/disconnection/DNS errors at 06:40–06:49 UTC. The later failed workflow ran around 07:26–07:30 UTC; the retained excerpts contain no matching network errors in that later window and no request correlation tying the earlier burst to policy initialization.
Could the policy-loading error preserve the underlying readiness failure class and report sanitized status/bytes/duration/IPC outcome? That would distinguish the initial trigger from retained failure state. Installed runtime files were unchanged during this investigation; no private endpoint requests were made.
kingsleyonoh commentedon Oct 10, 2026
Windows Chrome policy initialization failure, Codex 26.1007.21434 build 13901
Authenticated Chrome discovery succeeds. nameSession and user.openTabs fail after about 20 seconds with: Unable to load browser request-header policy. Retry the browser command.
Reproduces after Chrome restart, Codex restart, extension reinstall, and a fresh chat. Browser native-host and extension diagnostics previously passed. No Chrome profile, cookie, or login changes were made.
A synthetic, credential-free initialization request to https://ab.chatgpt.com/v1/initialize using the public browser-service SDK client key returned HTTP 200, 5,520,907 bytes in 5.47 seconds. This was a separate diagnostic request, not the failing runtime request. It suggests the large-response failure reported in #46129, but does not prove a size-limit exception here.
The active @oai/browser-desktop/service creates its Statsig client with networkOverrideFunc calling the runtime fetch. That runtime is built from the privileged nodeRepl bridge. The bundled node_repl binary contains the response-is-too-large error string. The service uses 10-second initialization/readiness deadlines. The visible error omits the underlying fetch status, response size, and failure reason.
Current desktop log also records post-login Statsig bootstrap timeouts and a networking error on an initialization POST. These are renderer logs and should not be mistaken for the exact browser-service response.
Please expose the underlying authenticated_fetch failure and provide a supported repair for initialization with large payloads. Policy enforcement should remain intact. We have not patched policy results, bypassed checks, or disabled protections.