Meta: small UX patches to make `codex exec` cleaner for downstream harnesses (cdx exo)
Context
A downstream Codex wrapper called cdx exo (https://github.com/team-wcv/CliTools, exo-tui.mjs and friends) embeds a custom Ink/React TUI that drives codex exec and codex app-server over JSON-RPC for cluster-aware local model serving. Building it surfaced a handful of small \"papercut\" issues in the upstream codex harness — things the TUI currently works around with stderr regexes or ad-hoc client-side filtering, but which would be cleaner to fix at the source so other harnesses benefit.
This meta-issue tracks the seven patches we extracted from the cdx exo workarounds and filed individually. Each is small, scoped, and most ship with a reference branch on a fork. None depend on each other; they can be triaged independently.
Patches
| # | Title | Issue | Reference branch | Status |
| - | ----- | ----- | ---------------- | ------ |
| 1 | Add codex exec --quiet to drop the header chrome | #22047 | team-wcv/codex@feat/exec-quiet-flag | Closed not_planned; maintainer suggested --json instead. We replied with the wrapper-vs-parser context; happy to drop or revisit. |
| 2 | Gate benign rate-limit telemetry behind notifications.rate_limit_telemetry | #22054 | team-wcv/codex@feat/rate-limit-telemetry-gate | Open, awaiting triage. |
| 3 | Demote failed to record rollout items from error! to warn! | #22055 | team-wcv/codex@feat/rollout-persistence-log-demote | Open, awaiting triage. |
| 4 | Collapse MCP startup notifications into a single mcpServer/startupStatus/completed summary | #22059 | team-wcv/codex@feat/mcp-startup-notifications-collapse | Open, awaiting triage. |
| 5 | Local-provider reasoning-summary heuristic + per-model model_overrides | #22061 | team-wcv/codex@feat/local-provider-reasoning-summaries | Open, awaiting triage. |
| 6 | model_providers.<name>.discovery_url for cluster-aware base-URL refresh | #22063 | team-wcv/codex@feat/provider-discovery-url | Open, awaiting triage. |
| 7 | codex exec resume <missing-uuid> falls back to thread/start instead of erroring | #22064 | team-wcv/codex@feat/thread-resume-fallback | Open, awaiting triage. |
Why each one matters (one line each)
- #22047 — wrappers that pass-through human-readable codex output need to suppress the config banner. Closed; documented the wrapper use case for context.
- #22054 — rate-limit telemetry is benign for users that never hit a limit; routes a notification per turn and shows up as noise.
- #22055 — transient rollout-persistence races during shutdown spam scary
ERRORlines that aren't actionable. - #22059 — N MCP servers ⇒ N+ startup notifications during steady-state startup; one aggregate readiness summary is enough.
- #22061 — local providers that ship reasoning models (DeepSeek-R1, QwQ, etc.) silently drop reasoning-summary support unless users hand-edit a global flag.
- #22063 — multi-host inference clusters need to refresh the active node's base URL without restarting
codex. - #22064 —
codex exec resume <uuid>after a pruned rollout / wrong\$CODEX_HOMEsurfaces a confusing error string instead of just starting a new thread.
Bigger picture
The cdx exo TUI's existence is mostly about cluster-aware local model serving and inline UX shortcuts that aren't a fit for upstream codex (e.g. live cluster topology, model-catalog overlay, in-process status badges). What I'd like out of this batch is just to remove the surface-level noise and config papercuts that force harnesses to filter stderr or hand-edit configs.
Happy to:
- split anything that's too coarse-grained.
- drop patches you don't want.
- iterate on any of the reference branches based on feedback.
- coordinate landing if multiple patches touch shared protocol/config surface.
I noticed docs/contributing.md says external contributions are by invitation; that's why each patch is in an issue with a reference branch rather than a PR. If any of these are wanted, very happy to open the corresponding PR(s).