Repository navigation
Windows/Edge: Chrome plugin update leaves locked host, partial cache, stale app-server manifest, and an uninstallable plugin #32706
Description
Environment
- Windows:
10.0.26200.8457 - Microsoft Edge:
150.0.4078.48 - Codex AppX:
26.707.8168.0 - Codex CLI:
0.144.0-alpha.4 - Chrome plugin before update:
26.623.81905 - Chrome plugin reported after update:
26.707.61608 - Browser: Microsoft Edge with the Codex Chrome Extension installed and enabled
Summary
When Codex updates while the Codex Chrome Extension is enabled in Edge, Edge keeps launching the plugin's extension-host.exe. The process holds files inside the versioned plugin cache. The update can then leave a partially copied plugin directory while Codex reports the new version as installed and enabled. The plugin UI may also be unable to uninstall the plugin.
In this reproduction, four pieces of state diverged:
- Installed-plugin state reported
26.707.61608. - The native messaging manifest still launched
26.623.81905. - The
latestjunction still targeted26.623.81905. chrome-native-hosts-v2.jsonstill referenced a removed AppX resources directory from26.707.3748.0, while the installed AppX was26.707.8168.0.
Reproduction and evidence
- Keep Microsoft Edge running with the Codex Chrome Extension enabled.
- Update Codex while Edge continues to launch
extension-host.exefrom the old versioned plugin cache. - After the update:
- Codex reports the new plugin as installed and enabled.
- The cache can be incomplete. A clean source contained 375 files, but the newly installed cache contained only 342 files and was missing both
docs/and.codex-plugin/plugin.json. - The native messaging manifest still points to the old versioned
extension-host.exe. - The plugin UI cannot reliably uninstall the plugin.
- Browser communication becomes partially functional:
- Codex could enumerate 273 open Edge tabs.
- Claiming/controlling a specific HTTPS tab timed out.
- After a CLI remove/add cycle, the cache was again incomplete because the extension host was relaunched during installation.
- The extension then showed:
Unable to start ChatGPT
Codex app-server manifest entry is missing required path resourcesPath
chrome-native-hosts-v2.jsondid contain aresourcesPath, but it pointed to an AppX directory that no longer existed:
...OpenAI.Codex_26.707.3748.0...\app\resources
The currently installed package was:
OpenAI.Codex_26.707.8168.0
Expected behavior
- Codex should stop or detach the running native host before replacing plugin files.
- A plugin version should become active only after its complete cache has been staged and validated.
- Installed-plugin state,
latest, the native messaging manifest, andchrome-native-hosts-v2.jsonshould be updated as one recoverable transaction. - On startup, Codex should detect a missing or stale
resourcesPathand regenerate the app-server/native-host entry automatically. - Uninstall should work even if the native host is running: stop the owned process, remove state, and report an actionable error if cleanup fails.
Suggested improvements
- Stage into a temporary version directory, validate required files, then atomically rename/switch
latest. - Before update/remove, identify and stop only the extension-host processes owned by that plugin cache.
- Repoint the native messaging manifest to a stable
latestpath before deleting an old version. - Refresh the AppX
resourcesPathafter every desktop update and validate that it exists. - Add startup self-healing for mismatched plugin version, host version, junction target, and app-server manifest.
- Add a UI repair action that performs the supported stop/reinstall/re-register workflow and preserves a rollback copy.
Comparison
On the same machine, the user's comparable Claude browser integration has not exhibited this update-time lock, partial-install, or stale-manifest failure. This suggests Codex could improve lifecycle coordination and atomicity rather than requiring users to disable the Edge extension before every desktop update.
Temporary recovery used for diagnosis
- Back up plugin/config/native-host state.
- Disable or stop the running extension host.
- Restore a complete plugin cache from the bundled source.
- Reinstall the plugin through Codex's plugin command.
- Rebuild stale app-server/native-host registration on the next Codex startup.
The workaround is fragile; the product should self-heal without manual cache or manifest intervention.
Activity
github-actions commentedon Jul 13, 2026
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
isCopyman commentedon Jul 13, 2026
Resolution update: clean uninstall/reinstall restored the integration
The user completed the reinstall, and the resulting state has now been verified locally.
Additional lock source found during uninstall
Stopping
extension-host.exealone was not enough. The Codex browser diagnostic session had also loaded a nativeclassic-levelmodule from the Chrome plugin cache. Resetting the diagnostic session did not terminate all of its childnode.exeprocesses, socodex plugin remove chrome@openai-bundledcontinued to fail with Windows error 5 (Access is denied).After identifying and stopping only the Codex diagnostic Node children associated with that browser session, the official CLI uninstall succeeded:
not installedextension-host.exe: 0This suggests uninstall/update should also terminate or detach browser-client/Node processes that have native modules loaded from the plugin cache, not only the native extension host.
Recovery sequence that worked
extension-host.exe.codex plugin remove chrome@openai-bundled.A stale
chrome-native-hosts-v2.jsonhad been backed up and removed before restart. Codex then regenerated it correctly during the clean reinstall.Post-reinstall verification
26.707.61608docs/.codex-plugin/plugin.jsonscripts/browser-client.mjsextension-host/windows/x64/extension-host.exelatestjunction targets26.707.6160826.707.61608hostchrome-native-hosts-v2.jsonnow reports:26.707.61608resourcesPathpointing to the currently installed AppXOpenAI.Codex_26.707.8168.0resourcesPathexistsextension-host.execomes from the current plugin cacheThe user reports the browser integration is functioning normally again.
Product implication
The update/remove lifecycle should account for every process that can load files from the plugin cache:
The product should stop/detach these processes before deletion, stage and validate the new cache atomically, then update
latest, Native Messaging registration, and the app-server manifest together.buchicao-star commentedon Jul 17, 2026
Additional reproduction on Google Chrome and a newer Windows build
I can reproduce a closely related stale-state failure on Codex Desktop for Windows.
Sanitized environment
26.715.2305.026.715.2142526.707.62119Observed state
%USERPROFILE%\.codex\plugins\cache\openai-bundled\chrome\26.715.21425is complete. It contains.codex-plugin/plugin.json,assets,scripts/browser-client.mjs, andextension-host.exe.latestjunction still points to the missing directory26.707.62119.%LOCALAPPDATA%\OpenAI\extension\com.openai.codexextension.jsonalso points to the missing26.707.62119\...\extension-host.exe.extension-host.exewere fully closed, then Codex Desktop was restarted. The current plugin directory was regenerated successfully, but the stalelatestjunction and native-host manifest were not reconciled.Chrome) and exact ID (chrome@openai-bundled). At the time of these attempts, there were zerochrome.exeand zeroextension-host.exeprocesses. The UI/API returned only a genericFailed to uninstall pluginresult.Expected behavior
latestto the complete current plugin version.extension-host.exe.No manual registry or native-host modifications were made.
FeyZha commentedon Jul 18, 2026
One additional recovery condition from a closely related reproduction on Codex Desktop
26.715.4045.0/ Chrome plugin26.715.31925.After the complete current plugin version existed, the following could still remain absent or stale:
chrome/latest.plugin-appserverchrome-native-hosts-v2.jsonThere were two independent blockers:
extension-host.exeor diagnostic Node workers holding plugin-cache files; andArchive, Encrypted, causing Electron/Node copy operations to fail with Windows error 6000.After closing the plugin-owned processes, I copied the official signed runtime files and bundled marketplace to verified user-writable cache/mirror locations using decrypted-destination semantics (
robocopy /COPY:DT), then used the supported plugin install flow. The desktop app's own native-host reconciliation was then able to atomically pointlatestat the current version and regenerate the v2 state, manifest, and HKCU registration.A useful diagnostic distinction:
codex plugin addsucceeding only proves the payload install completed. It does not prove that desktop native-host reconciliation ran. Verify the junction, v2 entry, manifest target, registry value, current AppXresourcesPath, and an actual browser handshake.The real Chrome extension backend subsequently created a tab, navigated to
https://example.com/, and read the page successfully. No manual manifest/registry fabrication was used.This reinforces the need for update/remove to stop every plugin-cache consumer, stage/validate atomically, and reconcile all host state after each AppX/plugin version change.
Barry-886 commentedon Aug 1, 2026
Additional deterministic reproduction on a newer Windows build.
Environment:
26.727.4816.026.721.31836The supported plugin uninstall path returns only
Failed to uninstall plugin, but it is not a no-op. It partially deletes the cache:.codex-plugin/,assets/, anddocs/extension-host/,scripts/, andskills/remainfailed to load plugin: missing or invalid plugin.jsonRestoring the three missing directories from the bundled same-version source returned the cache to 376 files, with matching SHA-256 hashes and zero changed/extra files. Retrying the supported uninstall reproduced the same 376 -> 342 partial deletion and generic failure.
This shows the uninstall operation is non-transactional on this build: it mutates the installed cache before failing and leaves the plugin marked/configured in a broken half-installed state. No registry or native-host files were manually modified.
PRM333 commentedon Aug 4, 2026
Additional reproduction: AppX physically installed on a secondary encrypted drive
I encountered the same user-visible error on Windows x64 with Google Chrome:
Environment
26.727.6591.026.727.51351Observed state
Get-AppxPackagereported a compatibility path underC:\Program Files\WindowsApps\OpenAI.Codex_....D:\WindowsApps\OpenAI.Codex_....Directory, Archive, Encryptedattributes.Recovery and verification
I used the supported Windows Move action to move ChatGPT from D: to OS (C:), then restarted it. After the move:
extension-host.exe; andMoving the AppX may also have forced stale registration state to regenerate, so the secondary-drive/encryption condition is a strong correlation rather than proof of the sole cause. Still, Move to C: was the change that turned this reproduction from broken to working.
OpenAI feedback ID:
019fcdba-0bf9-70e0-a623-764b48dd6dc6zemeng5208 commentedon Aug 12, 2026
Author disclosure: I maintain WinBridge Recovery, an independent Windows recovery project for Codex Desktop.
This report is particularly relevant to the state the tool checks: a versioned plugin cache can be incomplete while
latest, the native-host registration, and the currently installed AppX resources point at different generations. WinBridge Recovery resolves the currently installed official Codex package, checks those version/path relationships, detects stale/partial user-side state, and repairs only the inconsistent pieces with backup/rollback support.I’m sharing it here as a possible recovery aid for users who hit this specific cache/pointer/registration drift after an update, not as a claim that it fixes the underlying updater race. It does not modify WindowsApps contents, bypass file locks by changing ownership, or weaken sandbox/security policy. If the failure is caused by a product runtime bug rather than stale local state, it deliberately leaves that outside its scope.
dallall123 commentedon Aug 20, 2026
I am experiencing the same Windows Chrome native-host failure.
Feedback ID:
no-active-thread-01a01f0b-2a7b-7a53-aa74-263206d90512
Environment:
The side panel loads and can read the selected tab, but tab enumeration, navigation and control remain unavailable. The extension reports that the Codex Chrome native host is out of date.
A clean app/extension/plugin reinstall, regenerated native-host configuration, corrected resourcesPath and nodePath, and a full restart did not resolve it.
ryandaly49 commentedon Aug 20, 2026
Additional reproduction on Windows, August 20, 2026.
Incident timestamp: August 20, 2026 at 10:18 AM EDT (America/New_York)
This appears to reproduce the same update-time state divergence described in this issue, with a newer Codex build.
Environment
26.814.5517.0C:\Program Files\WindowsApps\OpenAI.Codex_26.814.5517.0_x64__2p2nqsd0c76g01.2.27267.1537526.803.81509Failure sequence observed
Unable to start ChatGPTCodex app-server manifest entry is missing required path resourcesPathextension-host.exe.C:\Users\Ryan\.codex\chrome-native-hosts-v2.jsoncontained two stale runtime entries referencing older removed AppX resource directories:OpenAI.Codex_26.803.8161.0...\app\resourcesOpenAI.Codex_26.803.10989.0...\app\resourcesTest-Pathas:C:\Program Files\WindowsApps\OpenAI.Codex_26.814.5517.0_x64__2p2nqsd0c76g0\app\resourcesresourcesPathvalues to the current verified AppX resources directory, the error changed to:Codex app-server manifest entry is missing required path nodePathC:\Users\Ryan\.codex\plugins\cache\openai-bundled\chrome\latestwas renamed out of the way so Codex could regenerate it on restart.Impact
The Chrome sidebar is used for active production workflows and browser-control tasks. The failure blocks or degrades access to the user's existing logged-in Chrome state and interrupts those workflows.
Additional observation
The failure mode changes as individual stale paths are repaired, suggesting the AppX version, plugin cache, native host, Node runtime paths, and app-server manifest are not being regenerated/validated atomically after an update.
This also appears related to #39531, which reports the native host remaining outdated/read-only on the same current ChatGPT/Codex desktop version
26.814.5517.0.A product-side self-heal that rebuilds all version-specific paths (
resourcesPath,nodePath, host paths, cache/junction state) together after an AppX update would likely prevent this class of failure.dallall123 commentedon Aug 20, 2026
Clean reproduction after complete removal and reinstall:
Windows ChatGPT app: 26.818.2441.0
Bundled Chrome plugin: 26.818.21641
Chrome extension ID: hehggadaopoacecdllhhajmbjkdcmajg
Verified:
Result:
Selected-tab text works, but tab enumeration/navigation/control fails with:
“Codex Chrome native host is out of date.”
Feedback ID:
no-active-thread-01a01f0b-2a7b-7a53-aa74-263206d90512
ryandaly49 commentedon Aug 20, 2026
Additional recurrence on the same Windows/Chrome integration failure.
Incident timestamp: August 20, 2026 at 12:37 PM EDT (America/New_York)
The ChatGPT Chrome sidebar froze again while attempting to resume a production Active Listings audit after the earlier native-host / manifest repairs documented above.
What was happening when it froze
The sidebar had been given a continuation handoff to run a full manual August 20 combined STATUS + PRICE audit against a SharePoint production workbook containing roughly 1,829 active properties. The audit is designed to research current listing status and current asking price, then write a single reconciled result back to the exact production workbook.
Verified impact of this freeze
After the sidebar froze, the production workbook was re-fetched directly from SharePoint to determine whether any safe checkpoint had been committed.
Findings:
AuditControlTablestill shows the prior August 17 run asIncomplete, ErrorCount4, RunIDAUDIT-20260817-094224-ET.AuditRunLogcontains no August 20 audit run entry at all.PriceTrackingTablestill carries prior-day / August 19 baseline/check state and no August 20 completed price-lane run.Because the sidebar froze before a run-control/log write was committed, any live browser research it had already performed cannot be trusted as resumable state. The next sidebar session must re-fetch the workbook and restart the full audit from a clean current-state baseline to avoid partial or duplicate writeback.
Why this matters for usage / credits
This is now forcing repeated execution of a large, research-heavy workflow. A single failed sidebar session can require the next session to redo substantial browser research across a large active-property population because no durable checkpoint survives the freeze. That repeated research is a plausible contributor to unusually high weekly Codex usage and is materially disruptive to production work.
This recurrence should be considered part of the same lifecycle/state-divergence problem: after update/repair, the sidebar can still degrade or freeze during real browser-control work rather than returning to a stable, self-healed state.
darcyolynyk-cpu commentedon Aug 20, 2026
Additional Windows/Google Chrome reproduction: stale
resourcesPath, recovery-path package mismatch, and verified recoveryI hit a closely related failure on Windows with Google Chrome and collected a read-only forensic trace before repair. This reproduction adds a recovery-path case where the Codex package itself was removed and a subsequent ChatGPT-branded install installed ChatGPT Classic (
OpenAI.ChatGPT-Desktop) rather than restoringOpenAI.Codex.Failure sequence
Failed to uninstall pluginresult. A later reinstall reported success, but browser control still failed.0x80073D02becauseOpenAI.Codexwas still running.OpenAI.Codex_26.814.5517.0was then successfully removed.OpenAI.ChatGPT-Desktop 1.2026.190.0(display name ChatGPT Classic) instead of restoringOpenAI.Codex. That package contained no Codex binaries/app-server resources.chrome-native-hosts-v2.jsonstill referenced the removed Codex package:Test-Pathon thatresourcesPathwas false, while every other path in the manifest entry existed.8. The resulting UI error was:
The error strings and
required_path_missingenum were also found in the activeextension-host.exebinary. At this point Chrome native messaging itself was demonstrably reachingextension-host.exe; the missing Codex package/resources path was the blocker.Correct-package recovery
Installing/opening the current non-Classic ChatGPT/Codex application restored:
with a populated:
The Chrome plugin cache regenerated to
26.818.22352;latestrepointed to that build; both copies ofchrome-native-hosts-v2.jsonbecame byte-identical and gained a new valid entry whoseresourcesPathresolves to the currentOpenAI.Codex_26.818.2872.0package. Native Messaging registration andcom.openai.codexextension.jsonwere valid.One noteworthy residual state: the regenerated v2 manifest retained the old stale entry for
26.814.41957/ removedOpenAI.Codex_26.814.5517.0alongside the new valid entry. The old entry has a deadpresence.pid; the new entry has a live app PID. So startup/self-healing added a valid entry but did not purge the dangling one.Live post-recovery validation
After restarting Chrome so the pre-repair
extension-host.execould not serve the test, a trivial Codex browser task succeeded:No native-host, app-server,
resourcesPath, or browser-control error occurred. A subsequent attachment-only validation also successfully claimed an existing normalhttps://claude.ai/chat/...Chrome tab and confirmed the exact expected session without typing or sending anything.So the repaired chain was verified end-to-end:
Product implications
This reproduction supports the lifecycle/self-healing concerns already described in this issue, and adds two points:
OpenAI.ChatGPT-Desktop/ ChatGPT Classic is a separate package and does not replace the missingOpenAI.Codexapp-server resources. A user following a generic ChatGPT reinstall path can therefore remain broken while believing the desktop app was reinstalled successfully. The recovery flow should identify/verify the required package identity when Codex browser integration is being repaired.No manual registry edits,
resourcesPathedits, junction edits, or hand-built native-host configuration were used to obtain the successful recovery.evilrix commentedon Aug 28, 2026
I hit this exact error on Windows:
Unable to start ChatGPTCodex app-server manifest entry is missing required path resourcesPathBefore trying the more involved reinstall/manifest recovery steps, I found a much simpler workaround:
Open the Codex desktop app and tell Codex to connect to Chrome.
Doing that once appears to initialise/regenerate whatever browser integration state was missing. Immediately afterwards, the ChatGPT Chrome extension/sidebar started working normally.
I didn't need to reinstall the extension, manually edit any manifests, or remove/re-add the browser integration.
It might be worth adding this as the first troubleshooting step, since it appears that explicitly asking Codex to connect to Chrome can self-heal this particular state.
medking82 commentedon Aug 28, 2026
Additional current-version reproduction: AppX
26.825.4187.0, Chrome and EdgeI reproduced the same update-time state divergence on a newer Codex Windows build. This affected both the official Chrome and Edge side panels and also produced the exact
nodePatherror reported in #35705.I previously reported the missing
latestalias and the native-host diagnostic false green in #30265, with a second current-build reproduction here. That case was observed while using a WSL-native workspace. The reproduction below occurred in a native Windows project context and adds a partially materialized current cache, stale schema-v2 entries, and a missing Edge origin, so the lifecycle failure appears broader than the original WSL path-normalization case.Sanitized environment
10.0.26200x6426.825.4187.00.150.0-alpha.12.226.825.32147152.0.7977.64151.0.4129.1071.2.27268.516121.2.30001.51613User-specific paths, PIDs, tokens, account identifiers, and browser-profile data are omitted.
User-visible failure sequence
The Edge side panel initially showed:
After repairing only the native-host executable/registration layer, the two browsers exposed the next layer of the same failure:
and:
State observed before the full diagnostic repair
%LOCALAPPDATA%\OpenAI\extension\com.openai.codexextension.jsonpointed at a missingchrome\latest\...\extension-host.exetarget.allowed_originscontained the Chrome extension ID but omitted the installed Edge extension ID.%USERPROFILE%\.codex\plugins\cache\openai-bundled\chrome\26.825.32147was only partially materialized: it contained.codex-pluginandskills, but was missing the runtimeextension-hostandscriptscontent.%LOCALAPPDATA%\OpenAI\Codex\chrome-native-hosts-v2.json%USERPROFILE%\.codex\chrome-native-hosts-v2.json26.715.72359; its presence PID was dead and its versioned Node/runtime paths had already been removed.Reversible diagnostic repair and verification
The user-owned state was backed up before repair. The diagnostic repair then:
26.825.32147plugin into the immutable versioned cache.chrome\latestas a junction to that complete current version.nodePath,nodeReplPath,resourcesPath, browser client/service paths, and current protocol versions, to both state-file locations.Post-repair process-tree verification showed:
extension-host.exeper browser;codex.exe app-server --analytics-default-enabledchild;This low-level green loop was not possible before the cache,
latest, native manifest, app-server binaries, and schema-v2 state were reconciled together.Product implication
This confirms that the lifecycle/state-divergence class described here still reproduces on the
26.825generation. Repairing only the browser extension or only the native messaging manifest is insufficient because it can merely expose the next stale layer.The updater/startup repair path should treat these as one recoverable transaction:
latest;medking82 commentedon Aug 28, 2026
Concrete fix proposal: one committed browser-host generation, with atomic uninstall and startup reconciliation
The current reproduction now has a stable red-to-green boundary, so this can be reduced to an implementation contract rather than another generic reinstall report.
Root cause boundary established by the reproduction
The browser extension itself was present in both Chrome and Edge, and the current AppX resources plus bundled Node runtime existed. The broken state instead spanned four independently updated surfaces:
latestactivation pointer and Native Messaging manifest;Reconciling all four surfaces together immediately produced a fresh native host for each browser and a current
codex.exe app-serverchild. Repairing only one surface merely exposed the next error. This supports a lifecycle transaction failure rather than a browser-store, system-Node, or antivirus root cause.Public source already shows two concrete cache-lifecycle gaps
On current
openai/codexmain:PluginStore::is_installedis equivalent to “a syntactically valid version directory exists.” It does not establish that the active bundle is complete or runnable. A partially deleted Chrome bundle can therefore remain false-green.PluginStore::uninstallcallsremove_existing_target, which directly callsremove_dir_all. On Windows, a locked executable/native module can make that operation fail after some children have already been removed, leaving the cache mutated but still discoverable as installed.replace_plugin_root_atomically. The missing piece is extending the same commit semantics to uninstall and to the desktop browser-host activation state.The browser-specific
latestjunction, Native Messaging manifest, browser origins, andchrome-native-hosts-v2.jsonreconciliation do not appear in the public repository, so the complete fix needs a small publicPluginStorehardening plus a desktop/browser-host change.Proposed patch split
1. Make local uninstall logically atomic in
PluginStoreReplace direct recursive deletion of the active plugin root with a same-parent tombstone transition:
.plugin-remove-<uuid>.This gives only two observable states: the previous complete plugin remains active, or it is atomically absent. It removes the current third state where
remove_dir_allhas deleted only part of the active bundle.2. Separate
InstalledfromReadyDo not let the presence of a version directory alone drive the Settings UI. Add an installation validation result such as:
Generic validation should at least require a readable/valid selected manifest. The bundled browser plugin should also have a package-owned readiness validator for its runtime contract, including:
.codex-plugin/plugin.json;extension-host/windows/<arch>/extension-host.exeand its config;scripts/browser-client.mjsandscripts/browser-service.mjs;nodePath,nodeReplPath, andresourcesPath; andallowed_originsincludes every enabled supported browser.Settings should show
Manage/Installedonly forReady;NeedsRepairshould expose a single supported Repair action.3. Reconcile one immutable browser-host generation
Create one canonical
BrowserHostGenerationdescriptor containing the AppX version, bundled plugin version, protocol versions, host path, Node paths, app-server path, resources path, and browser origins. Treat the existing junction, Native Messaging manifest/registry entry, and schema-v2 files as derived state from that descriptor.The update/startup flow should be idempotent:
extension-host, browser-service Node workers, and app-server children to exit; after a bounded timeout, terminate only processes whose executable/command path belongs to the old Codex plugin generation.latestto the validated version.Readyto Settings.If any step before activation fails, keep the previous known-good generation active. If the app exits between derived-state writes, the next startup should regenerate every derived file from the committed descriptor rather than trusting whichever file was written last.
4. Add a real Repair action
The Repair action should run the same reconciliation state machine, not a separate collection of ad-hoc fixes. It should preserve the previous generation until the new handshake passes and report a typed failing phase such as:
This would also eliminate the current diagnostic false-green where plugin installation succeeds but Native Messaging/app-server reconciliation never completed.
Regression tests / acceptance criteria
The Windows integration suite should cover the exact failure class:
extension-host.exe..codex-plugin/andskills/in the current version directory; assertNeedsRepair, notInstalled.latest, a manifest targeting a deleted version, and 20 protocol-compatible but unusable schema-v2 entries; assert one startup reconciliation produces one usable current generation.codex.exe app-serverspawn.Acceptance should be strict:
Installed/Managestate before the end-to-end handshake; andThis is intentionally scoped to the observed lifecycle boundary. It does not require redesigning browser control or app-server protocols; it makes the existing generation changes transactional and self-healing.
medking82 commentedon Aug 29, 2026
Recurrence on the very next Desktop update: AppX
26.825.5331.0/ bundled Chrome plugin26.825.41651This reproduced again on 2026-08-29, immediately after the previous AppX
26.825.4187.0/ plugin26.825.32147state had been fully reconciled and verified green. This recurrence is therefore not leftover corruption from the earlier repair.Red state after the update
Codex app-server manifest entry is missing required path nodePath.26.825.5331.0, and its bundled Chrome plugin was26.825.41651, butchrome/latestand the registered browser-host generation were still on26.825.32147....\runtimes\cua_node\e4d75eceaa042f20\bin\node.exe), andOpenAI.Codex_26.825.4187.0_...\app\resources).0/21entries had both a usablenodePathand a usableresourcesPath.Reconcile performed
The same reversible repair described above was run against the currently installed package:
26.825.41651in an immutable cache directory, then switchchrome/latestto that generation.codex.exe app-serverchildren.Green evidence
Healthy: true, exit code0.26.825.41651.nodePath,nodeReplPath,resourcesPath,codexCliPath,extensionHostPath,browserClientPath, andbrowserServicePath.chrome/latesttarget and has live app-server child processes.Assessment
The local reconcile is a reliable, idempotent workaround for this stale-generation failure class, but it is not a permanent product fix: the next Desktop update can still leave the derived browser-host state pointing at paths removed by the update.
The fix proposal in the preceding comment still fits this new reproduction: commit one
BrowserHostGenerationtransaction across the immutable plugin directory,latest, signed app-server, native manifest/origins, and both schema-v2 ledgers; distinguishInstalledfromReady; validate readiness before commit; and reconcile/prune stale state at startup.A focused regression test would be:
This is also the same exact
nodePatherror reported in #35705.darcyolynyk-cpu commentedon Aug 30, 2026
Counter-observation: the
26.825.5331.0/26.825.41651update reconciled cleanly on this machineFollowing up on my earlier reproduction in this thread and on the recurrence reported for this same generation. On this workstation the update to AppX
26.825.5331.0/ bundled Chrome plugin26.825.41651self-reconciled with no manual repair. I am reporting it because it appears to bound the trigger: the update transaction can complete correctly, so the failure is not deterministic for this generation.Sanitized environment
10.0.19045.6456x6426.825.4187.0->26.825.5331.026.825.32147->26.825.41651cliVersion):26.825.41651152.0.7977.651.2.27268.51612User-specific paths, PIDs, tokens, and account identifiers are omitted.
Observed post-update state
A read-only check roughly forty minutes before the update showed the prior generation healthy. The update then landed with no intervention and, on its own:
26.825.41651plugin into the versioned cache;chrome\latestto that version;nodePath,nodeReplPath,resourcesPath,codexCliPath,extensionHostPath,browserClientPath, andbrowserServicePathall resolve to existing files.The Native Messaging manifest needed no rewrite, because it targets the junction rather than a pinned version:
Read-only live verification.
extension-host.exewas launched by Chrome itself over native messaging:and it spawned a current app-server child on first side-panel use:
Two residual defects that survived the clean update
1. Dangling entries persist across generations, though not indefinitely.
The ledger now holds one valid entry and four dangling ones:
Every dangling entry fails on exactly the same three keys: the removed Node runtime and the removed AppX resources directory. The legacy v1 ledger is also still present.
The
26.814.41957entry named in my earlier comment is no longer there, so entries do get dropped at some point. I did not determine the mechanism or the retention window, and I did not prune anything manually. What is reproducible is narrower and still a defect: a fully successful reconcile adds a valid entry without pruning the generation it directly replaces.26.825.32147was the serving entry earlier the same day and is now dangling alongside three older ones. Four generations' worth accumulate this way, which is presumably how the 20+ entry ledgers reported elsewhere in this thread are reached.2.
presenceon the current entry goes stale within the same session.The valid
26.825.41651entry records apresence.pid,startedAt, andlastSeenAtfrom the reconcile at update time. Roughly three hours later the live app-server child was running under a different PID and the entry had not been updated.presencetherefore reflects the process that existed when the entry was written, not the process currently serving the browser.This matters for the pruning proposals in this thread: if reconciliation uses dead-PID detection to decide what to discard,
presenceis not maintained for live entries either, so a live generation can look as dead as a genuinely orphaned one.A read-only pass/fail test for other users
Several reports here infer success or failure from the UI. That is not sufficient. The extension renders its side panel and loads prior conversations over the network with no native host involved, so a broken native path can look identical to a working one. I nearly drew the wrong conclusion this way.
The cheap discriminator is the process tree:
If the host has no app-server child, the panel is talking to the service and nothing else.
Separately,
extension-host-config.jsonis absent on this machine and the host runs correctly regardless, so its absence is not on its own diagnostic.No registry edits,
resourcesPathedits, junction edits, or hand-built native-host configuration were used. The state above is what the updater produced unaided.medking82 commentedon Oct 3, 2026
October 3 follow-up: browser-integration guardian intervened after two current-build updates
Following up on my August reproductions and fix proposal in this issue. We have kept a local scheduled guardian that checks the current Windows browser integration and reconciles mismatched state. The integration is healthy after its repairs, but that post-repair result should not be interpreted as evidence that the official update path has been fixed.
Two repair events today
Windows 11 Pro for Workstations, x64. All events below occurred on 2026-10-03. Local time is MYT (UTC+08:00).
26.930.3748.026.930.3142826.930.3930.026.930.31730Both events logged the same conditions before repair:
Plugin cache latest does not target version <current bundled Chrome plugin>.Native-host config is missing or has a stale nodePath.Native-host config is missing or has a stale nodeReplPath.App-server ledger has no unique current entryat both%LOCALAPPDATA%\OpenAI\Codex\chrome-native-hosts-v2.jsonand%USERPROFILE%\.codex\chrome-native-hosts-v2.json.The guardian reported successful repair for each corresponding package/plugin pair. A fresh read-only
CheckOnlyafter the latest repair reportsHealthy: true, no issues, current package26.930.3930.0, current plugin26.930.31730, andchrome/latesttargeting that current plugin.What this does and does not establish
This is direct evidence that our guardian detected configuration mismatches against its expected current generation and then reconciled them on these two current builds. The guardian's health check validates the current generation's paths and configuration; it is not an end-to-end browser handshake test.
The log messages are the guardian's own diagnostic predicates: “missing or stale” does not distinguish absence from an old path, and “no unique current entry” means that the number matching all of our expected version/path fields is not exactly one, rather than establishing that every existing ledger entry is unusable. We did not capture a raw pre-repair ledger snapshot or a browser-side error/handshake for these two events, and did not disable the guardian to determine whether the official app would eventually self-reconcile. Our check also requires a specific current-generation configuration, which may be stricter than the product's minimum working requirements; it selects the most recently modified complete Node runtime directory, which need not prove the runtime the official app intended to use.
Accordingly, we can confirm that today's healthy state follows our local repair; we cannot use that healthy state to certify an upstream fix, nor claim these observations prove the extension fails on every update or on every machine.
Request for the maintainers
Could you confirm whether a fix for the Windows update/startup browser-host reconciliation described in this issue and #35705 has shipped? If so, please identify the desktop build and expected activation/self-reconciliation behavior, including any delay.
A useful acceptance check for the product fix remains: update a working generation N to N+1 with an existing browser host, allow N's versioned paths to be removed, and verify without a third-party guardian that the selected native host and app-server entry resolve to usable current runtime/resources and complete a browser handshake. Repeat startup/reconciliation to check that healthy state remains stable.
Until that is verified on this workstation, we are retaining the guardian workaround. The earlier transaction/reconciliation proposal in this thread remains relevant to the observed generation drift.
Concrete solution: local implementation and proposed product repair
The solution is to reconcile the browser integration as one owned generation when the desktop updates or starts, rather than treating plugin-directory presence as readiness. Below is the local repair we actually use, followed by the stronger transaction contract proposed for the official implementation.
Implemented local guardian workaround
The existing guardian runs at logon and every five minutes, takes a maintenance mutex, and returns without changing files or restarting processes when its configuration checks pass. It defers repair until the desktop's current runtime is available. Its repair script:
chrome/latestto that version.plugins/.plugin-appserverroot, stages the managed binaries from that runtime, backs up/replaces the old runtime directory, and compares source/destination SHA-256 hashes.The local code atomically replaces individual JSON files and stages the app-server directory with a restoration path for a failed directory move. Cache copying is in place and the junction switch uses separate delete/create operations. The runtime restoration catch covers a failed directory move; later hash/config/registry/ledger failures do not automatically roll back earlier changes. It is not a single crash-atomic transaction across cache, junction, manifest and both ledgers, and its configuration check is not a browser handshake. It is an implemented workaround, not the complete product architecture proposed below.
Process-exit improvement already implemented and tested
The previous helper requested termination and then polled path-filtered process discovery. A previously verified process could disappear from that discovery while its original process had not finished exiting. The helper now retains original process handles and confirms exit before the protected file replacement proceeds.
The implemented sequence is:
The main desktop app and Chrome are outside the helper's selected roots; this change does not add termination targets. It is not a general system-wide process or SQLite repair.
Validation already completed for this local change:
These checks validate the helper and local deployment. They do not establish the cause of either historical desktop startup incident or a full browser handshake for today's two repair events.
Proposed official update/startup reconciliation
Use a canonical browser-host generation containing the desktop package, plugin, authoritative Node and CLI runtime identities, protocol versions, required paths and supported extension origins. Derive activation pointers, manifests and resolver entries from that one generation.
Implementation requirements:
presence.pidalone is insufficient evidence that a generation is unusable; it can be stale while a replacement child is serving.Product regression checks
latesttarget, missing resolver fields, incompatible protocols and multiple compatible entries. Check deterministic selection/reconciliation rather than exact-one-entry assumptions.This supplies the concrete repair sequence and the tested process-lifecycle improvement behind our workaround. The official generation transaction and handshake are proposed implementation work; no upstream source patch or PR has been submitted as part of this comment.
davidefasolosalvagnini commentedon Oct 12, 2026
October 12 recurrence: stale resourcesPath after a newer Windows desktop update
Additional evidence for the stale AppX resourcesPath portion of this issue, on Google Chrome. A previous local repair was performed on October 7; the user reported the integration failing again on October 12.
Environment:
Observed before this repair:
Test-Path returned false. The currently installed package's resources directory existed at:
Reversible diagnostic repair:
Scope of the evidence: agent-side Chrome discovery and navigation to a public documentation page also worked before this repair. The exact user-facing side-panel error was not captured, and the user has not yet confirmed the original UI symptom is resolved. This report establishes a recurring stale registration and successful post-repair runtime initialization; it does not establish that every browser feature was failing, or reproduce the file-lock/partial-cache portions of this issue.
Please reconcile version-specific AppX resources paths on desktop update/startup, validate the selected entry's required paths, and expose a supported repair action. A regression check should update a working installation from N to N+1, remove N's package directory, and verify actual native-host/app-server initialization with no manual JSON repair. A local repair should not have to be repeated after another app update.
User-specific paths, account identifiers, tokens, runtime URLs, session IDs, browser-tab data and raw logs are omitted.