Regression in codex-cli 0.143.0: Existing conversation fails with Unknown parameter: input[...].namespace, but works in 0.142.0
What version of the Codex App are you using (From “About Codex” dialog)?
Codex CLI: 0.143.0
What subscription do you have?
plus
What platform is your computer?
6.18.33.2-microsoft-standard-WSL2 #1 SMP PREEMPT_DYNAMIC Thu Jun 18 21:54:43 UTC 2026 x86_64 x86_64 x86_64 GNU/Linuxx
What issue are you seeing?
After upgrading from codex-cli 0.142.0 to 0.143.0, one of my existing conversations can no longer continue.
Every new prompt in that conversation fails with the following error:
{
"type": "error",
"error": {
"type": "invalid_request_error",
"message": "[ObjectParam] [input[591].namespace] [unknown_parameter] Unknown parameter: 'input[591].namespace'."
},
"status": 400
}
If I downgrade back to codex-cli 0.142.0, the exact same conversation works normally again without any other changes.
This appears to be a regression introduced in 0.143.0, possibly related to how existing conversation history is serialized or sent to the Responses API.
What steps can reproduce the bug?
Start with an existing conversation created before upgrading.
Upgrade Codex CLI from 0.142.0 to 0.143.0.
Continue the existing conversation.
Observe the Unknown parameter: input[591].namespace error.
Downgrade back to 0.142.0.
Continue the same conversation again.
The conversation works normally.
What is the expected behavior?
Existing conversations should continue to work after upgrading the CLI.
Additional information
New conversations may work normally.
The issue only affects at least one existing conversation.
The same conversation succeeds immediately after downgrading to 0.142.0, which suggests the problem is version-specific rather than caused by the conversation content itself.
15 Comments
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
+1
+1
I can reproduce the same
input[...].namespacefailure on the current macOS desktop app, so this is not limited to CLI 0.143.0 or WSL.Environment
26.721.318360.146.0-alpha.3.1Additional evidence
The affected existing thread originally used
gpt-5.5. After a response-annotation/review turn, its recorded model changed to the internalcodex-auto-reviewmodel and remained there for subsequent normal turns.The rollout then contained six response items shaped like:
Every later attempt to continue that thread failed with HTTP 400:
Restarting the updated desktop app did not repair the thread. New threads continued to work.
thread_dynamic_toolshad no namespaced rows for this thread, so this does not appear to be stale MCP registration.Controlled recovery / A-B result
For diagnosis only (after backing up local state), I quit the app and removed only the six
"namespace":"exec"properties from the affectedcustom_tool_callhistory items. JSONL validity and SQLite integrity remained OK.After reopening the same thread, the previously failing prompt completed successfully. However, that successful turn on embedded Codex
0.146.0-alpha.3.1immediately persisted two newcustom_tool_callitems with"namespace":"exec". This shows that editing old history only unblocks one replay; the current client/model path can recreate the incompatible field.As a local mitigation I stripped the two new fields and changed that thread's stored model from
codex-auto-reviewback to the user's normal model. I am not proposing manual history/database editing as an end-user workaround; this was only an A/B diagnostic with backups.Suspected compatibility gap
This looks like an output/replay schema mismatch:
namespaceoncustom_tool_call;This may be related to #30302, which intentionally preserves custom-tool namespaces through app-server replay. The replay endpoint and client serialization need to agree on whether
CustomToolCall.namespaceis accepted. Separately, it may be worth checking why a response-annotation turn left the user thread persisted oncodex-auto-reviewinstead of returning to the selected model.I can provide additional sanitized field-level diagnostics if useful, but I will not upload full rollout files because they contain private conversation and local-environment data.
Follow-up verification
After applying the model-state mitigation, I verified two consecutive turns in the original thread. Both turns completed successfully on
gpt-5.6-sol, both invoked the local shell tool, and the persisted items were normal unnamespaced calls:No HTTP 400 recurred. This strengthens the correlation with the thread being left on
codex-auto-review: the same repaired history is stable after returning to the normal model, while the auto-review path had emittedcustom_tool_call(name="exec", namespace="exec")and poisoned later full-history replay.Additional Windows reproduction (2026-07-28)
I can reproduce the same
input[...].namespacefailure in the current Windows desktop app.Environment
26.721.4979.00.146.0-alpha.3.1Important difference from the earlier reports: this now affects brand-new threads, not only conversations created before an upgrade.
Reproduction
exectool.{"type":"custom_tool_call","name":"exec","namespace":"exec"}(call IDs and inputs omitted).[ObjectParam] [input[9].namespace] [unknown_parameter] Unknown parameter: 'input[9].namespace'.execcall reproduces the failure again. A longer affected thread reportedinput[13].namespace.Direct first-class tool calls (for example normal shell/function calls) continue to work because they do not persist the namespaced
custom_tool_call. Avoidingfunctions.execis therefore a mitigation, but it is not a complete product fix when a capability is only exposed through that tool.This began reproducing on 2026-07-28 even though the desktop package was installed on 2026-07-25, which suggests a client/backend/model rollout interaction rather than project state. Restarting and creating a new thread do not prevent recurrence once
execis invoked.I am not attaching complete rollout files because they contain private conversation and local-environment data.
Current macOS reproduction with exact two-stage failure (2026-07-30)
I can reproduce this again on the current macOS desktop-hosted Codex surface. I inspected the local rollout records without editing them.
Environment
26.721.81911(build5973)0.146.0-alpha.3.126.5.2arm64Exact poisoned item and failure sequence
Immediately after a successful compaction, the rollout persisted this response item (IDs and input redacted):
The next recorded output was:
This shows the same field first breaks local dispatch:
namespace=execplusname=execis routed as a namespaced tool and misses the plain built-inexechandler.The malformed item remains in persisted conversation history. On the next full replay/resume, the request fails before model execution:
The index is reconstructable from the persisted order:
input[127]andinput[128];custom_tool_callis thereforeinput[129].Forking the conversation does not help because the fork copies the poisoned item and fails at the same fixed index.
Scope
This is not tied to one repository or one conversation. In the local Codex state I found:
8, 9, 12, 13, 32, 33, 129, 228, 260;codex-auto-reviewandgpt-5.6-solthread state.Fresh threads can still work when
custom_tool_call(name="exec")is persisted withnamespace: null, but any thread containing the non-null self-namespace is poisoned for later replay.Version boundary
The protocol source matches the regression shape:
rust-v0.142.0:CustomToolCallhas nonamespacefield.rust-v0.143.0: optional serializednamespacewas added.The current client persists that field, while the replay validator used by this conversation rejects it. This looks like a compatibility gap between custom-tool output persistence, built-in tool routing, and full-history replay.
Current service incident
OpenAI Status currently reports elevated errors affecting ChatGPT conversations, with mitigation applied and recovery being monitored. However, the earliest local
input[...].namespacefailure was at2026-07-30T12:01:34Z, about 2.5 hours before the incident's published14:35Zstart, so the incident correlates with today's elevated failures but does not fully explain this regression's timeline.Suggested recovery requirements
A complete fix likely needs all three:
CustomToolCall.namespaceconsistently on full-history replay;I am not attaching full rollout files because they contain private conversation and local-environment data, but I can provide additional sanitized field-level evidence if useful.
I can reproduce this regression on macOS with both Codex Desktop and newer CLI versions.
Environment:
Observed:
[ObjectParam] [input[n].namespace] [unknown_parameter] Unknown parameter: 'input[n].namespace'.
enabled=0,live_takeover_active=0), so this is reproducible without requests being routed through its local proxy.This appears to be a Codex history replay/serialization compatibility regression, consistent with this issue.
Could the Codex client strip unsupported
namespacefields when replaying older input items, or could the backend accept them? Please confirm the target release for a fix or provide a supported migration/workaround for affected conversations.Auto-review / guardian reproduction on Windows (2026-08-01)
I can reproduce the same
custom_tool_call/namespaceround-trip failure described in this Windows reproduction, but in my case it occurs inside the hidden automatic-approval reviewer thread.Environment
26.727.6591.00.146.0-alpha.9.2approvals_reviewer = "auto_review")User-visible error
What the local rollout shows
codex-auto-reviewmodel.exectool.``
json
``{"type":"custom_tool_call","name":"exec","namespace":"exec","status":"completed"}
custom_tool_call_outputis recorded.input[49].namespaceis rejected.Automatic approval review failed, so the requested action is blocked before the guardian can return an approval assessment.The namespaced
custom_tool_callis the only retained response item with anamespacefield in the affected guardian rollout. I found the same error propagated through two separate parent-task / guardian-session pairs on the same day, so this was not a single stale-thread occurrence.This suggests the bug affects not only normal conversation continuation but also the dedicated auto-review path. Starting a fresh parent task is not a reliable workaround if the new guardian reviewer invokes
execagain. Switching from automatic review to manual user approval avoids invoking the affected reviewer path, but the product-level fix still appears to require stripping the output-only/self-referentialnamespacebefore replay, accepting it on input, or preventing it from being emitted for the built-in customexectool.I am omitting full rollout files, call IDs, tool inputs, paths, and conversation content because they contain private local data.
Somewhat ironically, my first attempt to submit this very comment through Codex was itself blocked by the same automatic-review failure—this time as
Unknown parameter: 'input[13].namespace'.Isolated to the guardian request builder: main-model path sanitizes
namespace, auto-review path does not (2026-08-01)Reproducing the auto-review variant reported above on macOS CLI. I have full outbound HTTP bodies for this session, which lets me narrow the failure past "the field round-trips" to the specific serialization path that emits it.
Environment
0.146.0(standalone, not desktop)26.5.2arm64approvals_reviewer = "guardian_subagent", main modelgpt-5.6-luna, effortxhighexeccustom tool)User-visible error
The offending item, from the actual logged request body
Rather than infer the index from the rollout, I pulled the guardian's outbound POST body out of the local trace log (
~/.codex/logs_2.sqlite, targetcodex_http_client::transport). The request ismodel: "codex-auto-review"with 127 input items, andinput[118]is exactly:Neighbouring items for context — only the
custom_tool_callcarries the extra key:The narrowing result: it is the reviewer's serializer, not the model or the history
I parsed every logged request body in this session's history and counted
custom_tool_callitems against the presence ofnamespace:| model | bodies with
custom_tool_call|custom_tool_callitems | items carryingnamespace||---|---:|---:|---:|
|
codex-auto-review(guardian) | 24 | 24 | 24 ||
gpt-5.6-luna(main) | 74 | 7141 | 0 ||
gpt-5.6-sol| 54 | 1460 | 0 ||
gpt-5.6-terra| 10 | 1185 | 0 |9,786
custom_tool_callitems go out on main-model requests over the same conversation history and not one carriesnamespace. Every one of the 24 that goes out on the auto-review path does.Cross-checked at the level of a single item: for one specific
call_id, 8 logged requests contain that item, all 8 arecodex-auto-review, all 8 carrynamespace. The identical item on the main path is emitted without it.So the main request builder already strips this field somewhere before the wire. The reviewer builder serializes
ResponseItemwithout that sanitization step. That looks like the whole bug — the fix is presumably applying the same normalization on the reviewer path rather than changing the type.For reference, on current
mainthe field is serialized whenever set, on both variants:skip_serializing_if = Option::is_noneonly omits it when absent; once code mode sets it toSome("exec")it is emitted, so nothing in the type prevents this. This is consistent with the bisect earlier in the thread — #30302 "Preserve namespaces on custom tool calls" (merged 2026-06-27, shipped 0.143.0) is where preservation was introduced.Two notes that may matter for triage
1. Rollout persistence is inconsistent, so the rollout is a misleading source of truth. My 2026-07-30 rollout persisted
"namespace":"exec"on itsexecitems. My 2026-07-31 rollout persisted zeronamespacefields across 125execcalls — yet the guardian request from that same session still emittednamespaceand still 400'd. Anyone triaging by grepping rollout JSONL will get false negatives; the field is present in the request regardless of whether it was persisted.2. Fail-closed converts a client-side 400 into a risk verdict, and this is arguably the more damaging half. The error text tells the model it was rejected for unacceptable risk, and appends anti-circumvention language instructing it not to retry or route around the decision. In my case the agent correctly obeyed: it concluded its environment was denying network and MCP access on policy grounds, stopped attempting the task, and reported to me that access was restricted. Nothing had actually been denied — a malformed outbound request was being reported as a security decision.
Worth distinguishing transport/serialization failures from genuine policy denials in that code path, whatever happens with the
namespacefix. A 400 from the reviewer endpoint is an infrastructure failure and should surface as one; as written it silently degrades agent behavior for the rest of the session in a way that is very hard to attribute.Scope
This gates MCP tool calls as well as shell escalations — the specific call that tripped it for me was an MCP tool invocation, not a command. And it is not intermittent: once any
execcall is in history, every subsequent approval review in that session fails, permanently.Happy to provide the full redacted request body if that would help.
Still happens on Codex Mac Desktop, even on the new conversations.
"unknown_parameter: input[20].namespace"
This is from conversation created Today (03.08.2026), on version "26.727.51351" of Codex Mac Desktop
Unsubscribe
On Mon, Aug 3, 2026 at 9:09 AM locycloid @.***> wrote:
I'm experiencing the same error.
[ObjectParam] [input[7].namespace] [unknown_parameter] Unknown parameter: 'input[7].namespace'.
I'm experiencing the same error.
Hitting this exact issue too @tibo-openai this is more important than resets since this is basically blocking the auto approver from allowing normal commands
I put up a candidate fix on my fork:
Branch: https://github.com/LHMQ878/codex/tree/fix/31754-strip-namespace-guardian
Compare: https://github.com/openai/codex/compare/main...LHMQ878:codex:fix/31754-strip-namespace-guardian
Change: strip
amespace from FunctionCall / CustomToolCall in Prompt::get_formatted_input_for_request before the Responses API request is built. Local history still keeps the field for dispatch.
Why: #30302 preserved namespaces for local routing, but the Responses API rejects input[].namespace (unknown_parameter). That hits resumed threads and especially guardian/auto-review (which serializes those history items).
Test: cargo test -p codex-core --lib client_common::tests (all passed locally).
I was not able to open a PR against openai/codex from this account (API returns 404 / CreatePullRequest permission). Happy for a maintainer to cherry-pick or open the PR from the branch above.