Files
codex-mmo/docs/EXTERNAL-VERACITY.md
T
2026-08-24 08:11:59 -07:00

37 KiB
Raw Blame History

External Veracity Baseline

This document records the external contracts audited for Codex MMO 8.0.0 through 2026-08-23. It is a release baseline, not a promise that network services, account entitlements, prices, serving routes, or rolling catalogs will remain unchanged. The runtime has no web dependency; live discovery and probes are explicit operator actions. The app-server contract is different: 8.0.0 deliberately requires the exact reviewed Codex 0.149.0 generated schema rather than guessing compatibility. No other Codex release is accepted, migrated, or interpreted.

Version and contract matrix

Surface Release baseline Authoritative evidence Runtime policy
Python 3.11+ language/stdlib contract; tested locally on 3.14.7 Python documentation and pyproject.toml 3.11 targets No third-party Python packages; external executable requirements are documented separately.
Codex Exact 0.149.0 executable and experimental protocol; live account catalog Installed binary plus generated protocol schemas and tagged OpenAI Codex source/model metadata Every new session, reattachment, and replacement root/worker host rejects an executable whose reported version is not exactly 0.149.0. doctor --live performs the complete contract check: exact version, 401 schema files, and digest fcfeaf23728b96ab73916a21302eb7a16629e67ee99f7ee47b60fad6b6e5ee1a. Built-in model availability remains account-derived; every other binary version is rejected.
Codex interactive resume Codex 0.149.0 --remote unix://… resume THREAD_ID Installed CLI help, generated schemas, tagged CLI/app-server source, and live local probe MMO resolves one exact nonterminal immutable session, validates its pinned cwd/home/snapshot/executable/capability/run inventory, then attaches the stock TUI to the current canonical root-thread generation. A TUI-created fresh top-level context advances an audited lineage inside the same MMO run; predecessor IDs locate that session, while native/fork threads are excluded. Plain launch creates a new session; terminal sessions and model/cwd/profile overrides are rejected on resume.
Switchyard 0.2.0 schema (schema_version = 1) and CLI; Rust 1.96.1 MSRV for source installation NVIDIA NeMo Switchyard 0.2.0 source, CLI, and published crate Emit only documented format, base_url, api_key_env, extra_headers, and max_retries client fields; the optional installer pins the verified top-level crate version. Validate the CLI's IpAddr host type early and restrict the unauthenticated managed ingress to loopback.
Codex image CLI Codex 0.149 shared CLI and image crate Tagged OpenAI Codex source plus the installed CLI Accept the upstream PNG/JPEG/GIF/WebP set and place -- before the stdin prompt operand so variadic --image cannot consume - as another image path.
Codex app-server execution and usage Installed Codex 0.149.0 generate-json-schema --experimental, Unix WebSocket listener, official app-server documentation, tagged protocol/source, and Switchyard 0.2.0 translation/usage normalization Exact generated schema set plus official OpenAI documentation and tagged OpenAI Codex/Switchyard source Require Unix app-server hosts for root/workers; send headerless JSON-RPC-shaped messages, one per text frame, after the exact initialize/initialized lifecycle; gate exact thread/goal/turn/control/history/pending/approval requests and method-specific responses. Switchyard 0.2.0 drops Codex's Responses namespace-tool shape, so only that recorded gateway release receives a temporary flat dynamic-tool bridge routed back through Codex's own MCP API. Upstream PR #384/commit c7beccd4891fa5cfe3a3b94fdd376f5765864507 fixes native namespace preservation after the v0.2.0 tag; its first published release triggers the documented native qualification and complete shim removal. Retry only the documented -32001/Server overloaded; retry later. condition with exponential delay and jitter. Persist cumulative token usage without double-counting notifications; price cache categories independently and include root plus workers. No stdio/fallback host exists.
App-server WebSocket RFC 6455 over a local Unix socket RFC 6455 plus official Codex Unix-socket transport documentation Require an HTTP/1.1 101 Upgrade with token-valid Upgrade/Connection, the exact accept hash, and no unsolicited subprotocol or extension. Mask client frames; reject masked server frames, RSV bits, non-minimal lengths, malformed control/fragment sequences, invalid close codes/reasons, binary application messages, and invalid UTF-8; perform a close handshake on normal shutdown or protocol failure.
Codex authentication Codex 0.149 login status and auth storage Tagged OpenAI Codex CLI/login/storage source and installed client Doctor requires both a successful base-home login and an auth.json that can be linked/copied into generated homes. Codex 0.149 keys keyring entries to canonical CODEX_HOME, so keyring-only login is reported as unusable for isolated homes rather than accepted. Generated homes force file storage to preserve the selected link/copy behavior.
Provider HTTP headers RFC 9110; Codex 0.149 and Switchyard 0.2.0 Rust HTTP clients IETF semantics plus tagged/downstream source Validate field names, reject case-insensitive duplicates, and reject non-HTAB C0 controls and DEL; preserve configured Codex environment-backed header values through secret filtering when present.
Provider base URLs RFC 3986 HTTP(S) URI syntax; Codex 0.149 and Switchyard 0.2.0 endpoint builders IETF URI syntax plus tagged downstream source Require an RFC 3986 absolute HTTP(S) URI with a host and no userinfo or malformed percent encoding; reject query/fragment roots because Codex slash-normalizes and appends its path while Switchyard also normalizes known endpoint suffixes, without URI-joining embedded query/fragment components.
MCP Protocol 2025-06-18, STDIO transport Model Context Protocol lifecycle, transport, base schema, and tools specifications One supported revision, explicit initialization state, newline-delimited UTF-8 messages, string/integer request IDs, object parameters, protocol errors for unknown tools or invalid arguments, and isError tool results for execution failures.
JSON-RPC 2.0 JSON-RPC 2.0 specification as narrowed by the MCP schema Exact version/method/params/ID validation; parse, invalid-request, invalid-params, and method-not-found error codes; no notification response.
JSON RFC 8259 IETF JSON specification and Python json documentation Reject NaN, infinities, overflow-to-infinity numbers, duplicate object names, lone UTF-16 surrogates, and non-finite output. This chooses deterministic interoperable behavior where RFC 8259 warns that duplicate names and unpaired surrogates produce unpredictable results.
JSON Schema Project subset informed by Draft 2020-12 JSON Schema 2020-12 core/validation specifications, RFC 3339, RFC 3986, and the official test suite No remote references/vocabularies; unsupported keywords rejected; Python re with portable patterns. date and date-time implement RFC 3339 syntax/ranges including offset-shifted leap seconds and lowercase t/z; uri implements absolute RFC 3986 syntax.
TOML 1.0.0 TOML language specification and Python tomllib documentation Emit valid Unicode scalar values and escape every forbidden basic-string control character, including U+007F.
HTTP readiness RFC 9110 successful-response semantics IETF HTTP Semantics Only status codes 200299 establish readiness. Redirects and errors do not.
Release archives GNU/POSIX tar conventions, PKZIP ZIP metadata, Python 3.11+ tarfile/zipfile APIs Python archive documentation and format specifications Reject traversal, links, special members, count/size excess, negative sizes, duplicates, implicit or extra directory entries, and exact mode drift; stream tar verification/extraction.
XDG paths Base Directory Specification 0.8 freedesktop.org specification Empty or relative base-directory values are ignored. XDG_BIN_HOME is a documented project extension.
Linux process state /proc/<pid>/stat ABI Linux proc_pid_stat(5) documentation Parse fields after the command name's final ); use state, process group, and start-time fields. Persist and recheck PID/start-token fingerprints before signalling app-server groups, publish ownership before protocol bootstrap, and retire live group descendants even when the recorded leader has exited.
Terminal job control and exit status POSIX Issue 7 semantics; Python 3.11+ process_group; GNU Bash signal-status convention POSIX tcsetpgrp()/terminal-interface specifications, Python subprocess documentation, and the Bash manual With terminal stdin/stdout, keep Codex in the controlling-terminal session even if stderr is redirected; use a dedicated foreground process group; restore terminal ownership/modes; preserve the caller's color environment; translate Python's negative signal return code to 128 + signal at command boundaries.
Git writer isolation Git 2.x CLI; tested locally on 2.55.0 Git worktree, diff, apply, and rev-parse manuals plus Python filesystem-codec documentation Run MCP writers in isolated worktrees, capture binary-safe patches and base fingerprints, correlate artifact hashes, hard-fail/taint boundary violations, and require explicit accepted integration into the canonical tree.
Local Qwen/llama.cpp Qwen3.5-9B model card and rolling llama.cpp server docs observed 2026-08-15 Official Qwen model card and llama.cpp server source/docs Distinguish the model's native 262,144-token multimodal capability from the bundled text-only 32K/8K resource cap; pin matching context, Jinja tool, reasoning-off, and no-projector example flags.
OpenCode Go Public catalog of 29 IDs observed 2026-08-23 Commit-pinned OpenCode Go endpoint/pricing docs, live endpoint, and OpenCode-maintained Models.dev IDs are dynamically checked; the explicit endpoint table is transport authority while Models.dev supplies capabilities. Both source values and any disagreement are fingerprinted. Provider time-tier and dash-valued rows remain exact evidence, but no tier or absent scalar is misrepresented as a universal price. Optional capabilities and model-specific effort selectors are asserted only when present. hy3-preview remains visible but non-agent-compatible because it has listing evidence only; the contributor Muse route now has a complete executable join. Bundled translated routes remain text-only pending multimodal-path verification.
OpenCode Zen Public live listing of 64 IDs observed 2026-08-23; shared API base and key Commit-pinned OpenCode Zen endpoint/pricing/deprecation docs, live endpoint, OpenCode-maintained Models.dev, and Switchyard 0.2.0 real-binary local-mock transport probe Join live presence to exact-ID capability metadata; select 25 Responses, 20 Chat, and 13 Anthropic executable routes with OPENCODE_API_KEY; retain 6 Google-native entries as catalog-only. Two IDs present in the live listing and Models.dev but absent from the provider documentation are marked live-undocumented and remain unpriced. Use provider billing rates and expose only representable efforts/prices. Time- and context-tier rows remain evidence rather than false scalar rates. Exclude the listing's request-time created value from normalized model records while retaining the exact raw capture digest.
OpenRouter Public Models API snapshot of 422 text-input/text-output IDs observed 2026-08-23; OpenAI-compatible Chat base OpenRouter Models API/OpenAPI, provider-routing, reasoning, tool-calling, and usage documentation; Switchyard 0.2.0 tagged configuration and real-binary local-mock transport probe Use https://openrouter.ai/api/v1 with openai_chat and OPENROUTER_API_KEY; derive capabilities only from explicit fields; preserve typed provider policy; record requested aggregator route separately from the actual serving provider/endpoint reported; keep translated execution text-only and omit prices the scalar schema cannot represent. Discovery consults stored credentials only for the official origin; an explicit blank key or custom source does not read them.
Z.AI Reviewed General API/Coding Plan records through 2026-08-18; authenticated nine-ID Coding Plan listing observed 2026-08-19 Z.AI model, parameter, pricing, Coding Plan, Codex, and Claude Code integration docs plus the authenticated models endpoint Keep General API and Coding Plan as distinct access products and credentials. Bundled GLM-5.3 uses exactly the Coding Plan Responses base https://api.z.ai/api/v1 and ZAI_CODING_API_KEY, with low, high, and max effort; the separate Chat-compatible base remains /api/coding/paas/v4. The three profile-selected bindings are not aliases for the six other advertised IDs. The Anthropic path remains catalog-only because its Bearer auth is not executable through Switchyard 0.2.0's fixed x-api-key behavior. Mutable documentation-capture drift blocks a current full-fingerprint claim until separately reviewed.

Machine-readable route/model sources and inventory IDs are in config/upstream-inventory.json. The reviewed source records are common, canonical-hash-checked envelopes in config/inventory-snapshots/ for OpenRouter, OpenCode Zen/Go, Z.AI, and Codex. Generated catalog entries keep source; OpenCode Zen/Go and Z.AI rows additionally separate availability_source, capability_source, and pricing_source where no one upstream artifact supplies all three accurately.

Audit classifications

Class Finding and disposition
A — implementation defect Fixed app-server messages that incorrectly carried the omitted jsonrpc header; WebSocket handshakes and frames that accepted invalid RFC 6455 state, masking, lengths, UTF-8, close payloads, fragmentation, subprotocols, or extensions; retries of unrelated -32001 errors rather than only the exact documented overload; an installer that did not resolve, install, and post-verify the one supported Codex version; catalog discovery that consulted OpenRouter credentials for explicit blank-key or custom-source probes; and a stale generic catalog user agent. Also fixed unsupported MCP-version echo, missing lifecycle/envelope validation, acceptance of null/fractional MCP request IDs and positional parameter arrays, and conversion of unknown tools or schema-invalid arguments into execution-error tool results; removed the catalog's case-insensitive raw-upstream-ID fallback so only exact provider-qualified model keys resolve; a doctor probe that sent post-initialize traffic before validating negotiation and a --probe flag silently ignored without --live; false-success exit codes for invalid profile/suite validation, failed evaluation tasks, timed-out job waits, and signal-terminated children; catalog source options silently ignored unless a second flag was supplied and Codex catalog commands bypassing configured binary/home settings; versioned settings/profile/catalog/smoke/evaluation fields silently accepting typos, wrong TOML scalar/container types, boolean schema versions, coerced numeric IDs, explicitly named catalog/smoke files silently disappearing, pack-relative instruction/contract fields pointing outside their documented directories, and working-directory-relative base Codex homes; omission of Codex 0.149's indexed web-search mode and acceptance of arbitrary approval-policy strings; inert cross-driver provider fields and unchecked built-in provider/auth pairs; source installation that followed linked payload members and tolerated missing declared members; installer replacement or recursive uninstall of an unowned install root, or explicitly substituted purge roots, without manifest identity; acceptance of non-finite, duplicate-member, or invalid-scalar JSON and boolean-as-integer JSON manifest versions; Draft 2020-12 boolean/integer mismatches; permissive date, date-time, and uri format checks that rejected valid RFC 3339 leap seconds/lowercase markers while accepting non-RFC timestamps, non-month-end leap seconds, and malformed RFC 3986 URIs; invalid TOML emission for U+007F; redirects accepted as readiness; XDG relative-path acceptance; unsafe /proc tokenization; detached interactive terminal execution, forced color suppression, and false non-interactive classification when only stderr was redirected; Git rename/source-path, file-mode, and filesystem-codec corruption in workspace audits; result truncation that appended its marker beyond the hard character ceiling; stale or discarded-on-failure Codex usage plus cost estimates that conflated base input, cache reads, and cache writes or omitted root usage; OpenCode Go rows that defaulted an optional structured-output capability to true without source evidence, assigned an unsubstantiated blanket high reasoning effort, or copied a time-varying Models.dev price into fields attributed to provider docs; a doctor credential gate that treated unknown built-in authentication as valid, including keyring-only state inaccessible from generated homes, and catalog verification that passed when its requested Codex source was unavailable; root/worker executable divergence that ignored settings.toml for detached workers; a dead global auth-link setting, propagation of unrelated MCP OAuth credentials, and generated-home auto storage that could migrate shared auth into a home-specific keyring namespace; dead/wrong downstream header fields, incomplete header-value and case-insensitive-name validation, filtering of configured environment-backed header secrets, acceptance of unusable HTTP base roots, and late/coercive handling of Codex custom-provider retry values; unsupported Codex root/model/native-role fields, including model_supports_reasoning_summaries, a stale nested multi_agent message key, and nonexistent 0.149 node-REPL flags; static built-in Codex capability overrides; false Codex drift from internal/deprecated rows; gateway identity that omitted context/tool/reasoning route semantics and route verification that tolerated unexpected advertisements; late acceptance of Switchyard-invalid or remotely exposed gateway hosts; archive file-mode comparison that collapsed permissions to executable/non-executable, normalization that concealed directory-mode drift, non-streaming tar inspection that delayed count/size enforcement, and acceptance of archives with implicit missing or extra empty directories; Codex's variadic --image consuming the stdin sentinel; an unpinned optional Switchyard top-level install despite an exact downstream schema target; a falsely executable Z.AI Anthropic route whose Bearer authentication cannot be emitted by Switchyard 0.2.0; and a Z.AI Coding Plan Responses client pointed at the Chat-compatible /api/coding/paas/v4 base instead of the documented Codex /api/v1 base.
B — test defect Updated the Codex stand-in to expose current context/effort, exec-usage fields, plus deprecated/internal rows and variadic image parsing; made MCP tests and the doctor perform and verify the negotiated two-phase handshake; and added boundary regressions for non-finite/duplicate-member/invalid-scalar JSON, JSON Schema boolean/fractional-integer behavior, exact integer manifest versions, TOML U+007F/surrogates, HTTP redirects, HTTP base-root syntax/join safety, Codex custom-route unsigned retry/idle types, closed and strongly typed versioned configuration/missing explicit files, pack-member and absolute-home paths, per-driver fields and built-in provider/auth pairs, closed evaluation fields and fixture safety, exact web-search/approval-policy enums, exact loopback gateway-host parsing, full gateway-route identity, current usage/cache-read/cache-write/failure accounting, exact OpenCode Go structured-output, reasoning-effort, and scalar-pricing sets, exact OpenCode Zen route/capability/pricing counts and snapshot reconstruction, common inventory snapshot integrity and exact snapshot-to-catalog drift, exact OpenRouter capability/pricing counts, pagination completeness, optional-auth discovery without secret leakage to URL overrides, OpenRouter drift comparison, exact Switchyard route generation, truthful command exit/source-option semantics, hard rejection of obsolete credential and header names, link/special/missing members, unowned/mismatched install and uninstall roots plus retained-manifest purge, built-in login/transfer status, keyring-only rejection, auth link-mode precedence/OAuth exclusion, pinned root/worker executables, real Codex strict configuration/model-catalog parsing, real Switchyard dry-run parsing, unavailable requested catalog sources, hard result truncation, pathological /proc names, XDG relative values, terminal foreground ownership/color/resize/restoration with redirected stderr, staged and committed Git changes, trailing-whitespace repository roots, ZIP and tar file/directory permission mutation, pinned Switchyard installation, image prompt separation, the explicit interactive Codex-option boundary, canonical v2 header fields, environment-backed secret propagation, RFC 3339/RFC 3986 format edges, case-insensitive header collisions, OpenCode time-tier parsing, and the exact dedicated Z.AI Responses route. At JSON-Schema-Test-Suite commit 6648e8194c69697b2e1a15fe76a06a480b183a51, all 123 main-suite groups whose schemas are accepted by the project subset passed 469 tests with 0 failures; 239 groups using unsupported keywords were skipped. The annotation-only format.json and remote-vocabulary vocabulary.json files are excluded by policy.
C — documentation defect Corrected an unqualified catalog-model example and ambiguous model-key placeholder, plus the false “no runtime dependencies beyond Python” claim and omitted Bash and Switchyard 0.2.0 Rust-1.96.1 build requirements, absolute secret-isolation language for a necessarily name-based environment filter, a local Qwen example that did not pin the catalog's reduced deployment contract, the package-version command, an interactive image example missing the required Codex-option separator, a smoke example made entirely of nonexistent field names, active-agent/root counting and the derived native-thread limit, plus the single-model provider description, exact base-URL joining behavior, canonical credential fields, downstream retry semantics/defaults, header names, XDG extension claim, JSON Schema scope, Codex/API context distinction, OpenCode/Z.AI provenance, interactive-terminal behavior, archive verification guarantees, and current Z.AI Codex configuration. Repaired dead or indirect source links.
D — stale upstream data Updated the Codex baseline and exact app-server schema to 0.149.0; refreshed OpenCode Go to 29 IDs, OpenCode Zen to 64 IDs, and OpenRouter to 422 reviewed text-input/text-output IDs as observed 2026-08-23. The Go snapshot now includes the complete Muse contributor, DeepSeek vision, and Ox rows while keeping hy3-preview listing-only; complete dash-valued or tiered billing rows remain evidence without invented scalars. Two Zen IDs that are live and present in Models.dev but absent from the provider documentation remain explicitly live-undocumented. Updated OpenRouter field changes without weakening route policy or capability derivation. Runtime discovery remains authoritative.
E — breaking compatibility boundary Every MMO-owned document requires exact schema 8 and, where applicable, exact package/profile version 8.0.0. The redundant lifecycle-version field, retired active-work/rollout/flat-control fields, lifetime-spawn fields, old provider-qualified keys, obsolete credentials/headers, and retired IDs are rejected. No migration, normalization shim, alternate execution host, automatic rewrite, state inspection fallback, or lookup fallback remains. External protocol version labels owned by Codex, MCP, providers, or Switchyard are not MMO compatibility readers.
F — upstream inconsistency OpenAI API limits differ from Codex session-catalog limits. The rolling official app-server page says paginated thread creation is not yet supported, while the exact installed 0.149.0 binary accepted thread/start with historyMode: "paginated" and served the resulting thread/turns/list; MMO follows the exact-pinned executable and generated schema rather than projecting rolling prose onto another release. OpenCode Go's /models description implies metadata while its response currently supplies IDs, five live IDs have Models.dev capability evidence but no current provider endpoint/pricing-table row, and Models.dev's default OpenAI-compatible adapter disagrees with the explicit Anthropic /messages rows for four current Qwen models. OpenCode Zen's endpoint table and live listing are not identical, every live row's created field is regenerated as the request time, two live/Models.dev IDs are absent from the documentation table, its Kimi K2.5 cache-read price differs from Models.dev, and its source repeats one identical Grok 4.6 tier row. OpenRouter's Models overview documents a public listing while its API reference declares Bearer security even though the audited endpoint returned HTTP 200 without a key. Switchyard 0.2.0 exposes one generic reasoning preset list for every reasoning-capable route and equates parallel-tool support with basic tool support in its Codex discovery metadata. The project records both sides and chooses the versioned execution-path authority.
G — feature gap Switchyard 0.2.0 has no Google-native client format, so six live OpenCode Zen Gemini entries are catalog-only; its Responses, Chat, and Anthropic groups remain executable. Switchyard also cannot configure an environment-backed Bearer header for an anthropic_messages client, so the Z.AI Anthropic-compatible path is catalog-only; the executable Z.AI Responses and Chat paths remain available. Other environment-backed arbitrary Switchyard headers are deliberately rejected; use its API credential field or a direct Codex provider. Codex 0.149 has no supported way to alias a keyring entry across canonical CODEX_HOME paths, so isolated MMO homes require file-backed built-in authentication. The bundled OpenCode Zen/Go and OpenRouter translation routes expose text only even where upstream metadata advertises attachments. OpenCode time- or context-tiered prices and OpenRouter's tiered, dynamic, fixed, media, web-search, one-hour-cache-write, and differently priced internal-reasoning charges cannot all fit the catalog's scalar token-rate schema and are retained as snapshot evidence rather than flattened inaccurately.
H — unverified hy3-preview limit/capability metadata; account-wide Codex entitlements beyond the observed catalog and one Luna turn; the cause and duration of the observed OpenCode 403 and Z.AI 429 responses; authenticated provider limits, tools, streaming, cancellation, multimodal fidelity, and all selected model bindings; OpenRouter downstream provider identity for the successful generic Mistral probe; provider-wide rate limits; local OpenAI-compatible server fidelity; Tool MCP server behavior/authorization; and future billing remain external uncertainties. One-shot text inference does not establish portfolio-wide availability or role efficacy. Runtime resume does not depend on rollout-file layout; it relies on the pinned app-server protocol and exact thread history.

The 2026-08-18 independent follow-up classified acceptance of non-month-end leap seconds as an additional A-class implementation defect and corrected it with offset-crossing regressions. It classified the prior 392/78 JSON Schema suite count as a C-class documentation defect because the selection rule was unstated and could not be reproduced from the pinned suite; the B-class row now records the exact reproducible selection and exclusions.

The reduced local Qwen context/modalities are verified as an intentional project deployment policy, not an external-contract discrepancy or legacy-compatibility claim. The documentation now separates that policy from the checkpoint's upstream-native capabilities.

The RFC format follow-up reran all 160 date, date-time, and uri cases in the pinned official Draft 2020-12 optional-format fixtures with zero mismatches. Project tests retain the defect-focused boundary cases offline; release validation does not fetch the upstream suite.

The 2026-08-23 bounded live acceptance probe disabled Switchyard retries and sent one text request with max_output_tokens = 8 through each executable external provider/protocol pairing. OpenRouter Chat through Switchyard returned HTTP 200 for the reviewed Mistral Nemo binding. All Go and Zen Responses, Chat, and Anthropic pairings returned upstream HTTP 403; Z.AI Coding Plan Responses and Chat returned upstream HTTP 429. A separate disposable 0.149.0 app-server completed one low-effort built-in Luna turn. The probes were not retried, did not touch MMO user sessions, and do not prove tools, streaming, multimodal transport, route telemetry, or other model bindings.

Independent adversarial verification follow-up

The final baseline-to-candidate audit found and corrected several integration defects that individual component checks had missed: interactive setup could leave a durable session in starting; failed atomic runner launch records consumed a budget documented as admission-only; direct-provider credential precedence differed from gateway/doctor precedence; cancellation silently truncated state but not audit data; maximum-length evaluation IDs could be created but not loaded; blank evaluation patterns/commands could pass vacuously; normal catalog regeneration printed passed: false after successfully repairing drift; the CLI accepted a result limit below its enforced minimum; install validation reused and deleted a fixed state path; a failed upgrade could leave the preserved credential file migrated while restoring the old payload; a retained uninstall marker could authorize unrelated content recreated at the former install path; a fresh installation could leave an older-generation retained owner marker in active config/state; and release-set publication did not reject a symlink destination before replacement. Regression tests now exercise each boundary.

The same audit reviewed every changed test. The redirected-stderr PTY change is intentional rather than a weakened assertion: stdin and stdout still own the controlling terminal, while the test proves color, foreground process-group transfer, resize delivery, terminal restoration, and successful operation with stderr captured separately. Exact route-qualified model keys remain mandatory throughout the catalog and every bundled profile; no old-key alias exists.

Primary references

Operator verification

Static release acceptance is offline. To observe current external state, run:

codex-mmo catalog verify --remote --codex
codex-mmo doctor --profile PROFILE --live --probe
codex-mmo profile smoke PROFILE --cwd "$PWD"

Missing expected Codex models may be normal account gating. Unknown public models, wrong route/protocol bindings, malformed generated downstream configuration, serving-policy mismatches, or observed IDs absent from a dynamic catalog are surfaced as drift.