375 lines
19 KiB
Markdown
375 lines
19 KiB
Markdown
|
|
# Troubleshooting
|
||
|
|
|
||
|
|
## Start with deterministic checks
|
||
|
|
|
||
|
|
From the source or extracted release directory:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
make test
|
||
|
|
make validate
|
||
|
|
```
|
||
|
|
|
||
|
|
From an installed environment:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
codex-mmo validate --all-profiles
|
||
|
|
codex-mmo tool-mcp validate
|
||
|
|
codex-mmo doctor --profile PROFILE
|
||
|
|
```
|
||
|
|
|
||
|
|
Add `--live --probe` only after local validation succeeds.
|
||
|
|
|
||
|
|
## A command is rejected or produces unexpected output
|
||
|
|
|
||
|
|
Use command-local help and preserve stderr separately from requested data:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
codex-mmo session list --help
|
||
|
|
codex-mmo session list >sessions.json 2>diagnostics.log
|
||
|
|
printf 'status=%s\n' "$?"
|
||
|
|
```
|
||
|
|
|
||
|
|
Structured commands use human output only when stdout is a terminal; a pipe or redirection selects
|
||
|
|
strict JSON automatically. Use `--json` to force JSON on a terminal. Progress, warnings, usage, and
|
||
|
|
errors stay on stderr, and `--quiet` suppresses only interactive stage progress. A syntax or invalid
|
||
|
|
option combination returns status 2; an operation or validation failure returns status 1. Add
|
||
|
|
`--debug` only when a traceback is useful for diagnosis.
|
||
|
|
|
||
|
|
Global `--json`, `--quiet`, and `--debug` options may appear around a control command but must occur
|
||
|
|
before the explicit `--` that begins Codex-owned arguments. Options are not abbreviated. For
|
||
|
|
noninteractive root work, provide a positional prompt or pipe non-empty input; `codex-mmo exec`
|
||
|
|
deliberately does not read an implicit prompt from a terminal. See [Command-line interface](CLI.md)
|
||
|
|
for the complete output and exit-status contract.
|
||
|
|
|
||
|
|
## The Codex TUI is monochrome, malformed, or does not resize
|
||
|
|
|
||
|
|
Confirm that version 8.0.0 and the exact supported Codex 0.149.0 client are installed:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
codex-mmo version
|
||
|
|
codex --version
|
||
|
|
```
|
||
|
|
|
||
|
|
Start Codex MMO with both stdin and stdout attached to an interactive terminal rather than piping either through a log collector:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
cd /path/to/repository
|
||
|
|
codex-mmo
|
||
|
|
```
|
||
|
|
|
||
|
|
Stderr may be redirected to a diagnostic file without disabling the interactive handoff. Interactive runs preserve the caller's foreground TTY and do not inject `NO_COLOR`. Check whether your shell already exports a color-disabling value:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
printf 'TERM=%s COLORTERM=%s NO_COLOR=%s\n' "$TERM" "${COLORTERM-}" "${NO_COLOR-}"
|
||
|
|
```
|
||
|
|
|
||
|
|
Unset `NO_COLOR` only when you do not want that standard behavior:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
unset NO_COLOR
|
||
|
|
```
|
||
|
|
|
||
|
|
The 8.0.0 acceptance suite exercises the remote Codex TUI through a pseudo-terminal while stderr is redirected, checks raw ANSI passthrough, transfers foreground process-group ownership, changes the terminal from 80x24 to 132x42, and requires the client to receive the resulting resize event while its app-server host remains independent.
|
||
|
|
|
||
|
|
## Codex does not resume an MMO conversation
|
||
|
|
|
||
|
|
Use MMO's lifecycle command rather than forwarding Codex's subcommand through a new run:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
codex-mmo resume --last
|
||
|
|
codex-mmo resume SESSION_ID
|
||
|
|
codex-mmo resume ROOT_CODEX_THREAD_ID
|
||
|
|
codex-mmo resume --last --all
|
||
|
|
```
|
||
|
|
|
||
|
|
`codex-mmo run resume` is rejected because `run` creates a deliberately new isolated session. A valid resume reattaches to the original session ID, one immutable run, snapshot, generated `CODEX_HOME`, app-server host, current root-thread generation, capabilities, budgets, and working-directory boundary. A controller or lost host process may be replaced, but never the MMO session/run identity. An older root thread ID remains a valid locator for the session and resolves to its current generation.
|
||
|
|
|
||
|
|
Inspect the lifecycle with:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
codex-mmo session show SESSION_ID
|
||
|
|
codex-mmo session runs SESSION_ID
|
||
|
|
codex-mmo jobs list --run RUN_ID
|
||
|
|
```
|
||
|
|
|
||
|
|
Only canonical generation-8 sessions with exact package/profile version 8.0.0 in `detached`,
|
||
|
|
`paused`, or `suspended` state are eligible. Other records are rejected without a compatibility
|
||
|
|
reader. If startup exits before
|
||
|
|
MMO records a thread ID, the session fails truthfully; resume never searches rollout files or the
|
||
|
|
user's general Codex history. It may query `thread/list` only inside the pinned session-isolated
|
||
|
|
root home to reconcile a top-level successor already created by the attached stock TUI. Resume
|
||
|
|
restarts a stopped managed gateway before validating generated homes and suspends the same run if
|
||
|
|
the pinned cwd, snapshot, executable, required root-route credential, capability document, or
|
||
|
|
required MCP dependency cannot be restored. Missing optional worker credentials remain explicit
|
||
|
|
degraded routes. Dead current-run workers become `suspended` with retained partial evidence before
|
||
|
|
the root resumes. Terminal `completed`, `failed`, `stopped`, and `cancelled` sessions cannot be resumed.
|
||
|
|
A tainted session requires `--allow-tainted`; delegation and patch-integration restrictions remain.
|
||
|
|
|
||
|
|
If a TUI context refresh appears blank or reopening lands before the refresh, inspect
|
||
|
|
`root_thread_generation`, `root_thread_lineage`, and `root_thread_transition` in `session show`.
|
||
|
|
MMO adopts a fresh thread only when it is persistent, top-level, in the pinned cwd, observed through
|
||
|
|
the root host while the fingerprinted TUI is attached, and the prior root has no active turn. Native
|
||
|
|
child and fork threads are deliberately excluded. Do not start a replacement MMO session or copy
|
||
|
|
rollout files; close the TUI so the session becomes detached, then resume by the MMO session ID or
|
||
|
|
any thread ID already recorded in its lineage.
|
||
|
|
|
||
|
|
## Codex reports that model metadata was not found
|
||
|
|
|
||
|
|
A generated model such as `mmo-<snapshot>-zai_coding_responses__glm_5_3` must appear verbatim in the session's `models.json`, and the same file must be referenced by `model_catalog_json` in that agent home's `config.toml`. Version 8.0.0 generates these files for every external model process.
|
||
|
|
|
||
|
|
Reinstall the current development build after clearing incompatible active state, then start a **new** session:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
./install.sh
|
||
|
|
codex-mmo profile compile adaptive-engineering
|
||
|
|
codex-mmo
|
||
|
|
```
|
||
|
|
|
||
|
|
Inspect the new session with:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
codex-mmo session list
|
||
|
|
codex-mmo session show SESSION_ID
|
||
|
|
```
|
||
|
|
|
||
|
|
The session record exposes each generated `CODEX_HOME`, `model_catalog_json`, and spawn- or control-capable role's `orchestration_skill` path. Verify that `AGENTS.md` and `skills/mmo-profile-orchestration/SKILL.md` match the immutable snapshot payload and that `config.toml` enables the exact `SKILL.md` path through `skills.config`. Verify that the selected `model` exactly matches one `slug` in `models.json`. Hybrid native/external homes must contain both the active Codex bundled rows and the generated external route rows. Do not work around a warning by accepting fallback metadata or copying guidance from another profile: either can change model behavior, context accounting, reasoning controls, compaction, tool shape, or delegation authority.
|
||
|
|
|
||
|
|
## A profile does not compile
|
||
|
|
|
||
|
|
Run:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
codex-mmo profile validate PROFILE
|
||
|
|
codex-mmo profile show PROFILE --resolved
|
||
|
|
codex-mmo catalog model ROUTE__MODEL_KEY
|
||
|
|
```
|
||
|
|
|
||
|
|
Common causes are a missing exact binding, unsupported modality, invalid reasoning level, unknown resource group, prohibited spawn edge, missing output contract, or a route that would lose required multimodal data.
|
||
|
|
|
||
|
|
If the preserved `active-profile` value names a retired bundled profile, select a current profile explicitly:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
codex-mmo profile list
|
||
|
|
codex-mmo profile use adaptive-engineering
|
||
|
|
```
|
||
|
|
|
||
|
|
There is no retired-ID alias, older-generation reader, or automatic profile migration.
|
||
|
|
|
||
|
|
If the error names an undefined Tool MCP server, inspect the profile's per-agent grants and the operator registry:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
codex-mmo tool-mcp list
|
||
|
|
codex-mmo tool-mcp show SERVER
|
||
|
|
```
|
||
|
|
|
||
|
|
Server definitions belong under `~/.config/codex-mmo/tool-mcp.d/*.toml`; a profile intentionally cannot supply one.
|
||
|
|
|
||
|
|
## A route or model is missing
|
||
|
|
|
||
|
|
Inspect the reviewed baseline and live account inventory:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
codex-mmo catalog inventory
|
||
|
|
codex-mmo catalog models --inventory openrouter
|
||
|
|
codex-mmo catalog models --inventory opencode-zen
|
||
|
|
codex-mmo catalog models --inventory opencode-go
|
||
|
|
codex-mmo catalog models --inventory zai-api
|
||
|
|
codex-mmo catalog models --inventory openai-codex
|
||
|
|
codex-mmo catalog verify --remote --codex
|
||
|
|
```
|
||
|
|
|
||
|
|
Hosted inventories change. Refresh only after reviewing the report:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
codex-mmo catalog refresh --install-codex-overlay
|
||
|
|
```
|
||
|
|
|
||
|
|
A discovered model ID is not automatically granted capabilities that the sources did not establish through that complete route.
|
||
|
|
|
||
|
|
## Authentication fails
|
||
|
|
|
||
|
|
For built-in Codex/ChatGPT access:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
codex-mmo auth status
|
||
|
|
codex-mmo auth login
|
||
|
|
```
|
||
|
|
|
||
|
|
For external routes, inspect `~/.config/codex-mmo/credentials.env` and the selected profile's route bindings. Do not place credentials inside profile packs.
|
||
|
|
|
||
|
|
OpenCode Zen and Go use exactly `OPENCODE_API_KEY`; obsolete OpenCode credential names are not recognized or migrated. OpenRouter inference requires `OPENROUTER_API_KEY`, although its catalog-discovery endpoint can currently be queried publicly. Bundled GLM-5.3 roles use exactly `ZAI_CODING_API_KEY`; `ZAI_API_KEY` is a separate General API credential and never a fallback.
|
||
|
|
|
||
|
|
For Tool MCP authentication, run:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
codex-mmo tool-mcp validate SERVER
|
||
|
|
codex-mmo doctor --profile PROFILE
|
||
|
|
```
|
||
|
|
|
||
|
|
The report names missing environment variables but never prints their values. Put the values in `~/.config/codex-mmo/credentials.env` or the launch environment. Tool MCP schema version 8 deliberately does not inherit Codex's `.credentials.json` OAuth sessions.
|
||
|
|
|
||
|
|
## A Tool MCP server is missing or fails to start
|
||
|
|
|
||
|
|
First separate Tool MCP from the internal Agent MCP server. `mmo_mesh` launches profile participants; operator-defined servers provide third-party tools.
|
||
|
|
|
||
|
|
```bash
|
||
|
|
codex-mmo tool-mcp show SERVER
|
||
|
|
codex-mmo tool-mcp validate SERVER
|
||
|
|
codex-mmo profile show PROFILE --resolved
|
||
|
|
codex-mmo doctor --profile PROFILE
|
||
|
|
```
|
||
|
|
|
||
|
|
For STDIO, verify the resolved executable and configured working directory. For Streamable HTTP, verify the URL and environment-backed authentication. `validate` is intentionally non-launching, so a successful readiness result does not prove protocol compatibility or downstream authorization. Start a new session after changing a registry definition because existing sessions remain pinned to their compiled snapshot.
|
||
|
|
|
||
|
|
Native roles share their containing Codex process. The generated root config contains the union of servers required by reachable native roles, while each role layer disables servers and tools it was not granted. This preserves tool visibility but not credential isolation between in-process native roles; use an Agent-MCP participant when that distinction matters.
|
||
|
|
|
||
|
|
## Switchyard does not start
|
||
|
|
|
||
|
|
Check whether the selected profile actually requires it:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
codex-mmo gateway status PROFILE
|
||
|
|
codex-mmo gateway logs PROFILE
|
||
|
|
codex-mmo doctor --profile PROFILE --live
|
||
|
|
```
|
||
|
|
|
||
|
|
Built-in-only profiles do not start Switchyard. For translated routes, verify the Switchyard binary, generated route configuration, endpoint reachability, and route credential.
|
||
|
|
|
||
|
|
## A spawn is rejected for capacity or scope
|
||
|
|
|
||
|
|
Inspect resource and scope admission:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
codex-mmo session show SESSION_ID
|
||
|
|
codex-mmo jobs list --session SESSION_ID
|
||
|
|
codex-mmo jobs status JOB_ID
|
||
|
|
```
|
||
|
|
|
||
|
|
Admission rejects a batch immediately when route capacity, a single-slot local GPU group, the per-role active limit, the session active-agent limit, or a writable scope is unavailable; it does not maintain a capacity queue. A terminal worker releases these leases, so sequential follow-up work does not exhaust a lifetime quota. A `queued` job is only in the brief accepted-before-runner-start transition. Reduce concurrency, wait for the conflicting lease to finish, cancel obsolete work, or divide write ownership into disjoint scopes. If an accepted job remains `queued`, inspect its runner log and reconcile its recorded runner PID.
|
||
|
|
|
||
|
|
## A worker cannot spawn another agent
|
||
|
|
|
||
|
|
Nested delegation is allowed only when the profile grants the edge. Check the caller's `can_spawn` list, maximum depth, active child limit, ancestor-role policy, active resource capacity, and backend availability. Leaf and low-trust agents intentionally receive no delegation authority.
|
||
|
|
|
||
|
|
## A worker result is rejected
|
||
|
|
|
||
|
|
MCP workers may be required to satisfy a JSON output contract. Inspect:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
codex-mmo jobs result JOB_ID
|
||
|
|
codex-mmo jobs result JOB_ID --cursor NEXT_CURSOR
|
||
|
|
codex-mmo jobs status JOB_ID
|
||
|
|
```
|
||
|
|
|
||
|
|
A failed strict result normally indicates invalid JSON, a missing/unexpected field, an invalid URI/date, command evidence absent from captured events, an artifact hash/path mismatch, or a role-specific literal-evidence mismatch. `agents_wait` returns compact state and progress revisions; terminal previews appear only when explicitly requested. Start `agent_result` or `jobs result` at cursor zero and follow each `next_cursor` until null; text pages are contiguous and lossless. When `agent_trace` reports a truncated valid event, use its `record_cursor` with `agent_trace_record` and follow `next_cursor` to reconstruct the exact filtered record. Malformed trace records expose only a bounded diagnostic because they cannot be structurally filtered. Do not open MMO's job result, event, stderr, or socket paths directly from an agent—use the result, inspect, and trace APIs. A result that validated may still be explicitly rejected by the root after review. Reading a result does not accept it, and accepting a writer result does not apply its patch until `agent_patch_integrate` succeeds.
|
||
|
|
|
||
|
|
Strict Agent-MCP roles use app-server `turn/start.outputSchema` when the selected model supports
|
||
|
|
structured output, then validate the complete original contract independently. A malformed first
|
||
|
|
response receives one shape-only repair turn on the same durable thread. There is no JSON-fixer
|
||
|
|
agent and no repair is allowed to invent absent evidence.
|
||
|
|
|
||
|
|
## A long-running root or worker is quiet, paused, or suspended
|
||
|
|
|
||
|
|
Do not ask the model to estimate elapsed time. Inspect the host-owned state and filtered trace:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
codex-mmo jobs status JOB_ID
|
||
|
|
codex-mmo jobs result JOB_ID
|
||
|
|
codex-mmo session show SESSION_ID
|
||
|
|
```
|
||
|
|
|
||
|
|
`stall_warning_seconds` is diagnostic only. It never interrupts a quiet model. Turn-mode roles have
|
||
|
|
no profile task deadline; goal-mode roles use Codex's cumulative token accounting and remain
|
||
|
|
recoverable when the current budget is exhausted. An authorized controller can inspect/trace,
|
||
|
|
pause, continue with an optional larger total budget within the compiled ceiling, request
|
||
|
|
finalization, detach, or fully stop. A worker client/transport failure reconnects to its exact
|
||
|
|
host/thread; root recovery uses the current canonical thread generation. Unrecovered host loss
|
||
|
|
produces `suspended`, not a missing result. A replacement turn-mode worker first settles any
|
||
|
|
orphaned active turn; it starts one continuation only after an interrupted outcome and preserves a
|
||
|
|
result that completed during the race. `stopped`, `failed`, and
|
||
|
|
`cancelled` remain terminal but retain readable partial evidence, terminal history, and patches.
|
||
|
|
|
||
|
|
Do not try to fix a slow model by adding a model-authored “work for N seconds” instruction. The
|
||
|
|
provider `stream_idle_timeout_ms`, app-server initialization/lifecycle request limits, Tool MCP
|
||
|
|
call limits, goal token ceilings, and external smoke/evaluation wall limits are different
|
||
|
|
boundaries. Direct provider idle values must be positive and should be sized for the route's real
|
||
|
|
latency rather than a model instruction. App-server lifecycle waits cover slow MCP startup and
|
||
|
|
thread operations but do not time model turns. Tool calls may retain their own safety bounds; the
|
||
|
|
surrounding thread and evidence survive client detach, transport restart, or interruption.
|
||
|
|
|
||
|
|
For a noninteractive root, `exec --wall-timeout` is only a caller/harness boundary. It detaches
|
||
|
|
without interrupting the app-server goal; use `codex-mmo resume SESSION_ID` to attach to the same
|
||
|
|
work. `session detach` also leaves root and workers running. `session pause` checkpoints partial
|
||
|
|
evidence, interrupts admitted turns, retires root and supervised-worker hosts, and releases their
|
||
|
|
capacity. `session continue` freshly admits and reactivates the same root thread plus the exact
|
||
|
|
paused worker set. Run `session compact` only from that cold-paused state; it temporarily hosts the
|
||
|
|
root, compacts the same thread, and cold-pauses it again. During bootstrap use
|
||
|
|
`session stop` or `session cancel` when no durable thread exists yet. `session stop --grace SECONDS`
|
||
|
|
requests finalization and then retires all hosts; `session cancel` is immediate.
|
||
|
|
|
||
|
|
## A worker is waiting for input or approval
|
||
|
|
|
||
|
|
`approval_policy = "never"` declines escalation automatically inside the role's compiled
|
||
|
|
sandbox. With `untrusted` or `on-request`, an authorized controller sees the raw pending method and
|
||
|
|
request ID through `agent_inspect` and must send that method's exact response object with
|
||
|
|
`agent_respond`. The request and thread remain durable while pending. Do not send a generic
|
||
|
|
approval shape: command, file-change, permission, user-input, and MCP-elicitation methods have
|
||
|
|
different generated app-server response schemas.
|
||
|
|
|
||
|
|
If a mutating control returns a transport error after delivery began, inspect the job before
|
||
|
|
retrying. MMO records that revision as `delivery_unknown`, because the worker may have applied the
|
||
|
|
request before its response was lost. A blind retry could steer, interrupt, finalize, or fork the
|
||
|
|
thread twice. Controls are serialized per job, but serialization cannot turn an ambiguous network
|
||
|
|
outcome into proof of non-application.
|
||
|
|
|
||
|
|
## A job changed files outside its scope
|
||
|
|
|
||
|
|
Writable MCP jobs run in isolated Git worktrees, so they do not edit the canonical checkout directly. An out-of-scope or unsafe patch boundary is a hard job failure that taints the session; inspect the job metadata and isolated artifact. Do not integrate it. Narrow the assignment or use a read-only reviewer, then launch a fresh bounded job if still justified.
|
||
|
|
|
||
|
|
## Cancellation appears incomplete
|
||
|
|
|
||
|
|
Cancel the root session to cascade through descendants:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
codex-mmo session cancel SESSION_ID
|
||
|
|
```
|
||
|
|
|
||
|
|
For one branch:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
codex-mmo jobs cancel JOB_ID --reason "superseded"
|
||
|
|
```
|
||
|
|
|
||
|
|
The supervisor terminates worker process groups and records terminal state. If a process remains, inspect the job stderr and verify that the process was launched by the current installed runtime rather than an unrelated manual command.
|
||
|
|
|
||
|
|
## Native agents and MCP agents disagree
|
||
|
|
|
||
|
|
Do not vote or average their conclusions. Resolve the conflict from primary evidence: source code, commands, logs, tests, specifications, or a reproducible external observation. Use a read-only reviewer when an independent check is useful.
|
||
|
|
|
||
|
|
## Release archives look incomplete
|
||
|
|
|
||
|
|
Verify checksums and member counts before installation:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
sha256sum -c codex-multimodel-orchestrator-8.0.0-SHA256SUMS.txt
|
||
|
|
tar -tzf codex-multimodel-orchestrator-8.0.0-linux.tar.gz | head
|
||
|
|
unzip -Z1 codex-multimodel-orchestrator-8.0.0-linux.zip | head
|
||
|
|
```
|
||
|
|
|
||
|
|
Each archive must contain the top-level package directory, runtime modules, profiles, configuration, documentation, tests, installer, and `PACKAGE-MANIFEST.json`. The release builder rejects a truncated source tree and verifies member hashes before reporting success.
|
||
|
|
|
||
|
|
## Collecting diagnostics
|
||
|
|
|
||
|
|
Preserve the following when investigating a failure:
|
||
|
|
|
||
|
|
- The profile ID and snapshot hash.
|
||
|
|
- `codex-mmo doctor` output.
|
||
|
|
- Session and job IDs.
|
||
|
|
- Job stderr and event logs.
|
||
|
|
- Gateway logs for translated providers.
|
||
|
|
- Route, serving-provider, HTTP status, policy, and retry information.
|
||
|
|
- The exact repository commit and dirty state.
|
||
|
|
- The installed Codex and Switchyard versions.
|
||
|
|
|
||
|
|
Remove credentials before sharing diagnostics.
|