Per-tool plugin approval_mode ignored for bundled codex-app-tools in Desktop 26.820.60940 / CLI 0.150.0-alpha.8
What version of the Codex App are you using (From “About Codex” dialog)?
ChatGPT Desktop 26.820.60940, build 7119; bundled codex-cli 0.150.0-alpha.8; codex-app-tools@openai-bundled 0.1.3.
What subscription do you have?
ChatGPT Pro
What platform is your computer?
Darwin 25.6.0 arm64 arm
What issue are you seeing?
The documented per-tool plugin approval_mode configuration is accepted by strict configuration validation but ignored at runtime for the bundled codex-app-tools plugin.
Configuration used:
approvals_reviewer = "user"
[plugins."codex-app-tools@openai-bundled".mcp_servers.codex_app.tools.create_thread]
approval_mode = "approve"
[plugins."codex-app-tools@openai-bundled".mcp_servers.codex_app.tools.send_message_to_thread]
approval_mode = "approve"
After a full Codex Desktop restart, both create_thread and send_message_to_thread still generated an MCP approval elicitation. create_thread succeeded only after a human Accept decision. send_message_to_thread remained waiting for approval and failed after a human Decline decision. The strict configuration doctor reported that the configuration and bundled plugin loaded successfully.
The bundled desktop-mcp.json marks automation_update, create_thread, send_message_to_thread, fork_thread, and handoff_thread as prompt. The observed behavior indicates that the documented per-tool override is not applied before the Desktop/MCP approval gate.
What steps can reproduce the bug?
- Add only the two per-tool overrides shown above.
- Fully quit and restart Codex Desktop.
- Run the bundled CLI strict configuration doctor and verify that configuration and plugin loading succeed.
- Invoke create_thread.
- From the created local task, invoke send_message_to_thread back to the source task.
What is the expected behavior?
Only create_thread and send_message_to_thread run without an MCP approval prompt. automation_update, fork_thread, and handoff_thread continue to require approval as declared by the bundled plugin manifest.
Additional information
Actual behavior
Both configured tools still generate ResolveElicitation approval requests. create_thread succeeds only after human acceptance; send_message_to_thread waits for approval and fails when declined. No invalid or unknown configuration is reported.
Additional information
The plugin MCP proxy contains no separate approval logic; it forwards tool discovery and calls to the native host. Please apply the effectively merged per-tool plugin configuration before Desktop/MCP approval gating and expose diagnostics showing the effective approval_mode, configuration source, and precedence per tool.
No secrets, full conversations, repository contents, or raw private logs are included in this report.
2 Comments
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
Additional macOS A/B reproduction from a real multi-task review workflow.
Environment:
26.820.60940(build7119)26.5.2(25F84), Apple Silicon0.150.0-alpha.80.149.0-alpha.4.1Observed regression:
0.149.0-alpha.4.1invokedsend_message_to_threadfour times. Every function call has a paired successfulfunction_call_output; no approval boundary interrupted those callbacks.0.150.0-alpha.8was created in its own clean managed worktree at an exact detached commit.send_message_to_threadcallback recorded the function call but never produced a function-call output. Desktop exposed the task asactiveFlags=["waitingOnApproval"]and showed the approval UI.This rules out cross-worktree filesystem access as the trigger and gives a direct
0.149->0.150behavioral comparison for the same first-party tool.The source coordinator was running with Full Access (
approval_policy=never, disabled/danger-full-access sandbox). The created visible task still received managedon-request/approvals_reviewer=user/workspace-write, consistent with the related inheritance defect in #33282. In0.150.0-alpha.8, the newly introduced task-messaging path then turns the internal callback into a user-blocking MCP approval.Impact: unattended controller/reviewer or executor/controller workflows stop at every result callback, even though the user already authorized the overall local workflow. The current safe workaround is for the controller to poll/pull the child result with
wait_threads, but that makes cross-task messaging asymmetric and defeats the intended callback workflow.Expected behavior:
create_threadshould preserve the effective Full Access posture (or expose an explicit permission selection), and a user-approved per-toolapproval_mode="approve"forsend_message_to_threadshould be applied before Desktop's MCP approval gate.All task IDs, repository names, local paths, prompts, and private logs are intentionally omitted.