Codex Desktop crashes on resume: sends unsupported `thread_tools` feature to bundled CLI

Open 💬 6 comments Opened Jun 21, 2026 by mvisl
💡 Likely answer: A maintainer (github-actions[bot], contributor) responded on this thread — see the highlighted reply below.

Summary

Codex Desktop became effectively unusable on macOS because opening/resuming a thread repeatedly crashes the app-server/worker with SIGKILL. The most consistent root error is that the Desktop app sends a feature override named thread_tools, but the bundled CLI does not recognize that feature key.

Environment

  • Codex Desktop: 26.616.51431 (CFBundleVersion 4212)
  • Bundled CLI: codex-cli 0.142.0-alpha.6
  • Platform: macOS, Apple Silicon MacBook Air
  • Active workflow: Codex Desktop app, local project, Figma MCP integration enabled
  • Date observed: 2026-06-21

Main crash

The app repeatedly shows the generic crash screen:

An error has occurred
Codex crashed with the following error:
(code=null, signal=SIGKILL).

The relevant app log line:

target=codex_features
app_server.request ... otel.name="thread/resume" client_name="Codex Desktop" client_version="26.616.51431":
load_with_cli_overrides: unknown feature key in config: thread_tools

Local checks

  • thread_tools was not present in ~/.codex/config.toml.
  • Resetting ~/Library/Application Support/Codex did not fix the issue.
  • codex features list did not include thread_tools.
  • The crash reproduced immediately after restarting the app and resuming the thread.

Likely cause

The Desktop app appears to send an unsupported feature override during thread/resume.

In /Applications/Codex.app/Contents/Resources/app.asar, I found a feature mapping containing:

Lu=`thread_tools`
...
{gateName:`2395575782`,featureKey:Lu}

I also found base instruction construction with:

threadToolsEnabled:!0

This looks like a Desktop build / bundled CLI mismatch: Desktop enables or forwards thread_tools, while the bundled CLI feature parser rejects it.

Workaround tested locally

I backed up the app bundle file:

/Applications/Codex.app/Contents/Resources/app.asar.bak-20260621-thread-tools

Then patched the current app.asar byte-for-byte:

  • replaced ` thread_tools with a valid same-length feature key tool_suggest `
  • replaced threadToolsEnabled:!0 with threadToolsEnabled:!1

After that patch, the thread_tools crash stopped.

Secondary issue after reset

After resetting app state, a different crash appeared from the Figma MCP auth path:

worker quit with fatal: Transport channel closed,
when AuthRequired(AuthRequiredError {
  www_authenticate_header: "Bearer resource_metadata=\"https://mcp.figma.com/.well-known/oauth-protected-resource\", scope=\"mcp:connect\", authorization_uri=\"https://api.figma.com/.well-known/oauth-authorization-server\""
})
target="rmcp::transport::worker"

That may be a separate auth recovery issue, but the original thread_tools crash made the Desktop app unusable before the Figma auth problem was visible.

Impact

  • Existing Codex Desktop thread cannot be used reliably.
  • Repeated SIGKILL crash screens occur during normal work.
  • Resetting local app state does not fix the thread_tools mismatch.
  • The only effective workaround I found was patching the app bundle manually, which is not a reasonable user workaround.

Expected behavior

Codex Desktop should not send unknown feature keys to the bundled CLI, or the bundled CLI should tolerate/ignore unknown Desktop feature gates instead of crashing the worker/app-server flow.

Log locations checked

Per Codex troubleshooting docs:

~/Library/Logs/com.openai.codex/YYYY/MM/DD
~/.codex/sessions
~/.codex/archived_sessions

I can provide more log excerpts if needed, after reviewing them for sensitive data.

View original on GitHub ↗

6 Comments

github-actions[bot] contributor · 29 days ago

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

  • #29322
  • #29140
  • #29118
  • #28427

Powered by Codex Action

mvisl · 29 days ago

Additional crash observed after creating this issue via the GitHub connector.

The app crashed again with a different error:

(code=null, signal=SIGKILL).
Most recent error: {"timestamp":"2026-06-21T20:33:11.715149Z","level":"WARN","fields":{"message":"metrics counter [codex.skill.injected] failed: tag value contains invalid characters: github:github"},"target":"codex_otel::events::session_telemetry"}

This looks like another Desktop/runtime bug: a plugin skill name containing : (github:github) is being used as a telemetry tag value, but the metrics/tag validator rejects it. The rejection then surfaces as another crash screen instead of being swallowed as non-fatal telemetry failure.

This happened in the same Desktop session while using the GitHub plugin to submit the bug report above.

mvisl · 29 days ago

Another crash observed in the same session, this time from the skill loader while processing skill interface icons:

(code=null, signal=SIGKILL).
Most recent error: {"timestamp":"2026-06-21T20:42:45.419944Z","level":"WARN","fields":{"message":"ignoring interface.icon_small: icon path with '..' must resolve under plugin assets/"},"target":"codex_core_skills::loader"}
{"timestamp":"2026-06-21T20:42:45.419955Z","level":"WARN","fields":{"message":"ignoring interface.icon_large: icon path with '..' must resolve under plugin assets/"},"target":"codex_core_skills::loader"}

Local inspection found many temporary plugin candidates under ~/.codex/.tmp/plugins/plugins/... with agents/openai.yaml values such as:

interface:
  icon_small: "../../assets/logo.svg"
  icon_large: "../../assets/logo.svg"

Examples included temporary candidates such as coderabbit, brighthire, twilio-developer-kit, morningstar, teams, etc. The paths are invalid under the current loader rule, but this should remain a non-fatal warning. Instead, it surfaced as yet another crash screen.

Temporary local mitigation: moved ~/.codex/.tmp/plugins aside to a timestamped backup so the loader stops scanning those temporary candidates.

mvisl · 29 days ago

The skill-loader icon-path crash persisted after moving the temporary plugin cache out of the way.

Latest crash screen:

(code=null, signal=SIGKILL).
Most recent error: {"timestamp":"2026-06-21T21:07:55.788148Z","level":"WARN","fields":{"message":"ignoring interface.icon_large: icon path with '..' must resolve under plugin assets/"},"target":"codex_core_skills::loader"}

This is still a warning-level loader event (level":"WARN", message starts with ignoring ...) but the Desktop app presents it as a fatal crash. From the user's perspective, the app is unusable: repeated unrelated warning/error paths keep surfacing as SIGKILL crash screens.

At this point the observed sequence in one session is:

  1. thread_tools feature mismatch on thread resume.
  2. Figma MCP OAuth AuthRequired after app-state reset.
  3. Telemetry crash on skill tag value github:github.
  4. Skill loader icon path warnings (interface.icon_small / interface.icon_large) surfacing as fatal crash screens.

This looks like a broader Codex Desktop/runtime regression where recoverable warnings or integration/config problems are not isolated and instead crash the session.

mvisl · 29 days ago

Another independent crash screen in the same Desktop session:

(code=null, signal=SIGKILL).
Most recent error: {"timestamp":"2026-06-21T21:33:59.516347Z","level":"WARN","fields":{"message":"could not find callback for Integer(7)"},"target":"codex_app_server::outgoing_message"}

This appears to be an app-server outgoing message / callback routing issue. Again, the event is logged as WARN, but the Desktop UI shows it as a fatal crash.

This further supports that the current Desktop build is not isolating recoverable app-server/plugin/MCP/telemetry warnings from the main session. The user keeps hitting unrelated SIGKILL crash screens during normal use.

mvisl · 29 days ago

Latest state from app logs after the UI started rendering mostly ? characters in the crash window.

The screenshot itself is no longer readable: the crash dialog renders repeated red ? / punctuation instead of a usable error message. Pulling from the latest macOS app log shows the actual new failure cause.

Log file:

~/Library/Logs/com.openai.codex/2026/06/21/codex-desktop-3687815b-2571-43bb-8155-dbbf73f78002-22938-t0-i1-214353-0.log

Relevant lines:

2026-06-21T21:43:53.874Z info [AppServerConnection] Current reported app-server version: currentVersion=0.142.0-alpha.6 hostId=local
2026-06-21T21:43:54.925Z info [electron-message-handler] Features enabled enabledFeatures="enable_request_compression, remote_compaction_v2, collaboration_modes, personality, request_rule, image_generation, resize_all_images, image_detail_original, workspace_dependencies, guardian_approval, apply_patch_streaming_events, workspace_owner_usage_nudge, tool_suggest, enable_mcp_apps, apps, plugins, auth_elicitation, tool_call_mcp_elicitation"
2026-06-21T21:48:49.052Z info [AppServerConnection] app_server_connection.closed code=null connectionId=1 hasReason=true reason="{\"timestamp\":\"2026-06-21T21:43:55.506841Z\",\"level\":\"WARN\",\"fields\":{\"message\":\"configured non-curated plugin no longer exists in discovered marketplaces during cache refresh\",\"plugin\":\"documents\",\"marketplace\":\"openai-primary-runtime\"},\"target\":\"codex_core_plugins::loader\"}\n{\"timestamp\":\"2026-06-21T21:43:55.506866Z\",\"level\":\"WARN\",\"fields\":{\"message\":\"configured non-curated plugin no longer exists in discovered marketplaces during cache refresh\",\"plugin\":\"pdf\",\"marketplace\":\"openai-primary-runtime\"},\"target\":\"codex_core_plugins::loader\"}\n{\"timestamp\":\"2026-06-21T21:43:55.506875Z\",\"level\":\"WARN\",\"fields\":{\"message\":\"configured non-curated plugin no longer exists in discovered marketplaces during cache refresh\",\"plugin\":\"presentations\",\"marketplace\":\"openai-primary-runtime\"},\"target\":\"codex_core_plugins::loader\"}\n{\"timestamp\":\"2026-06-21T21:43:55.506882Z\",\"level\":\"WARN\",\"fields\":{\"message\":\"configured non-curated plugin no longer exists in discovered marketplaces during cache refresh\",\"plugin\":\"spreadsheets\",\"marketplace\":\"openai-primary-runtime\"},\"target\":\"codex_core_plugins::loader\"}" signal=SIGKILL transport=stdio
2026-06-21T21:48:49.063Z error [AppServerConnection] Codex CLI process exited classifiedAsExpected=false code=null connectionId=1 signal=SIGKILL transport=stdio
2026-06-21T21:48:49.064Z error [AppServerConnection] fatal_error_broadcasted errorMessage="  (code=null, signal=SIGKILL).\nMost recent error: {\"timestamp\":\"2026-06-21T21:43:55.506841Z\",\"level\":\"WARN\",\"fields\":{\"message\":\"configured non-curated plugin no longer exists in discovered marketplaces during cache refresh\",\"plugin\":\"documents\",\"marketplace\":\"openai-primary-runtime\"},\"target\":\"codex_core_plugins::loader\"}\n..."

Additional UI bug observed in the same log:

2026-06-21T21:50:06.321Z warning [electron-message-handler] Failed to send message from view errorMessage="Error invoking remote method 'codex_desktop:message-from-view': Error: \"open-config-toml\" is not implemented in Electron." message={"type":"open-config-toml"} type=open-config-toml

So the current failure set now includes:

  • Plugin cache refresh warns that configured non-curated plugins (documents, pdf, presentations, spreadsheets) no longer exist in discovered marketplaces.
  • Those WARN entries close the app-server with SIGKILL and are broadcast as a fatal crash.
  • The crash dialog can become unreadable, rendering repeated ? characters instead of a useful message.
  • The crash dialog's Open Config.toml action is wired to open-config-toml, but that action is not implemented in Electron.

At this point the Desktop app is effectively unusable even after the earlier local thread_tools mitigation and Figma MCP re-login.