Desktop send_message_to_thread accepts unsupported thinking override, persists it to an Astra target, and reports success
Nobody has claimed this yet.
- 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, initiallyhigh. - 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
- Have a local Astra task configured with supported reasoning effort
high. - While it is running, send it a progress message through the desktop tool:
{
"hostId": "local",
"threadId": "<existing-astra-task>",
"prompt": "Progress report.",
"thinking": "none"
}
- Observe sender success and a receiver
thread_settings_appliedevent withreasoning_effort: "none". - Allow the receiver to finish its current work and start its next goal-continuation turn.
- 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
modelandthinkingas 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
- https://github.com/openai/codex/issues/44184 - similar visible symptom of Astra/none reappearing. The explicit sender-side override identified here may be a distinct cause; this report does not claim to explain that reporter's incident.
- https://github.com/openai/codex/issues/38687 - subagents inheriting application task controls. Related capability surface, not proof of an identical defect.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- 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