openai / openai/codex

Desktop send_message_to_thread accepts unsupported thinking override, persists it to an Astra target, and reports success

Open
#45,955 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

app app-server bug subagent
Dominant language
Rust
Stars
125k
Forks
19.4k
PR merge metrics
PR metrics pending

Description

Summary

When a Codex Desktop subagent sends a progress report to its parent using send_message_to_thread with thinking: "none", the tool accepts the call and returns success. It also persists none to the receiving GPT-6 Astra task. The task's next model request then fails with reasoning.effort / unsupported_value.

The sending agent chose an invalid argument despite the tool documentation. The application defect being reported is the lack of target-model compatibility validation before changing persistent task settings, combined with a successful sender-facing result and delayed receiver failure.

Environment

  • Windows, Codex Desktop package 26.908.9136.0.
  • Active local Codex binary reports codex-cli 0.154.0-alpha.6.2.
  • Receiving task: gpt-6-astra, initially high.
  • Sending subagent: gpt-5.6-luna, medium.
  • Tool: installed official desktop tool, exposed locally as mcp__codex_desktop__send_message_to_thread.
  • Observed September 16, 2026. Local task identifiers, file paths, business content, and account information are omitted.

Minimal trigger reconstructed from the observed calls

  1. Have a local Astra task configured with supported reasoning effort high.
  2. While it is running, send it a progress message through the desktop tool:
{
  "hostId": "local",
  "threadId": "<existing-astra-task>",
  "prompt": "Progress report.",
  "thinking": "none"
}
  1. Observe sender success and a receiver thread_settings_applied event with reasoning_effort: "none".
  2. Allow the receiver to finish its current work and start its next goal-continuation turn.
  3. The next turn fails before useful work with:
Unsupported value: 'none' is not supported with the 'gpt-6-astra' model.
Supported values are: 'low', 'medium', 'high', 'xhigh', and 'max'.
param: reasoning.effort
code: unsupported_value

These steps are reconstructed from five observed production calls and their corresponding receiver events; a separate disposable-task reproduction has not been run.

Sanitized evidence

The tool description visible to the sending agent explicitly says:

Omit model and thinking to keep its current settings.

It also says an override must be supported by the selected model. However, the common schema includes none among the possible enum values, and this invalid target-model combination was accepted.

Sender explicitly calls with thinking: "none" (UTC) Receiver setting becomes none (UTC)
11:42:17.307 11:42:24.789
13:30:01.428 13:30:07.249
13:34:26.584 13:34:30
13:53:28.535 13:53:34.248
14:24:47.251 14:24:53.292

For the last two occurrences, the local core log records a ThreadSettings submission with effort: Some(Some(None)), immediately followed by a TurnInput containing a codex_app.send_message_to_thread result attributed to the same sending subagent. The innermost None denotes the explicit reasoning-effort enum, not an omitted argument.

The first sender result was isError: false with the destination thread ID. Five subsequent receiver turns failed with the same unsupported-effort error across the observed incident. Explicitly restoring high only helped until the subagent sent another report with none.

Expected behavior

  • Resolve the effective destination model and reject an incompatible explicit reasoning override before mutating persistent task settings.
  • Preserve the destination's existing valid settings if validation fails.
  • Return a clear error to the sender for this invalid combination.
  • Keep omission of model and thinking as the documented way to preserve destination settings.

A focused regression test could assert that an Astra/high target remains high after a rejected thinking: "none" message attempt, and that omitted overrides deliver the message without changing its model or effort. A separate valid-override case should still work.

Mitigation and limits

The parent instructed its subagents to use native collaboration messages or normal final results instead of desktop task-control messages. If desktop messaging is necessary, they must omit model/effort overrides for routine reports. The parent was restored to high. One corrected subagent work cycle completed without another incompatible override; longer-term monitoring remains ongoing.

This report does not establish a malicious prompt injection, a billing defect, or that the goal engine itself initially generates none. The raw sender call already contains the invalid argument.

Related reports

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start at the desktop send_message_to_thread tool path and trace the ThreadSettings submission and resulting TurnInput event. Add a focused regression test for an Astra/high target rejecting thinking: "none" without changing its settings, while omitted overrides preserve the destination settings and valid overrides still work.

Written by the indexing model from the issue text.

Assessment

Tech stack
rust
Domain
backend-api-design, desktop
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
55/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.