DocsReference archive
Reference archive
Markdown ↗

Codex native compatibility — 2026-09-25

Reference record from the SDK documentation snapshot. For current setup, use Install & connect.
On this pageCorrection to the earlier tool checkNative fixture evidenceRefresh and policy changesContext and isolation limitsLive requalificationReproduce

These checks use development source after the published SDK 0.1.0 release. The tested installation is Codex CLI 0.157.0 on Linux x64:

  • Native executable SHA-256: 1a822376d4634ac32dddc030e5117c63359f7f8cd4b1b64382c68190287d0258.
  • Adjacent codex-code-mode-host SHA-256: ae34226adad3fe8acb361a78618e81b5a17638861bb7a689fcccaf8c3ef32aa8.

The adapter accepts this exact CLI version. Other versions fail preflight with CLI_UPGRADE_REQUIRED before application content is submitted. Qualification here is Linux-only; client CI does not certify native execution on other systems.

Correction to the earlier tool check

The initial codex exec --json fixture inspected only the top-level Responses tools field. GPT-6 Luna uses Responses Lite, which carries its catalog in additional_tools input items. The check missed native patch, image, goal and collaboration tools. The claim that no native tools were advertised is withdrawn; AD-021 was reopened and live app runs were held. Earlier text, cancellation and usage observations remain valid for that source but do not prove tool isolation. Published 0.1.0 retains the older exec route.

Development source now uses the official app-server protocol. Both thread/start and turn/start receive environments: [], disabling environment access. Threads are ephemeral, retain the native read-only sandbox and never grant approvals. Model fallback is disabled. No application tools or capability roots are registered. The SDK disables agents, goals, hooks, plugins, apps and web search, then disables each inherited MCP server before creating the thread. An empty MCP table alone does not remove inherited entries. Ambiguous server names fail before thread creation.

These contracts are pinned in the native app-server protocol and tool planner. The SDK does not patch the native binary or disable account/network policy.

Native fixture evidence

All 24 checks passed against the complete native installation, using synthetic credentials and a loopback Responses/OAuth service without external connectivity:

  • Two selected accounts, explicit gpt-6-luna and medium reasoning, text, progress, reported usage and diagnostic redaction.
  • Missing sign-in, successful native managed-session refresh and persistence, and expired/reused/revoked refresh-token failures.
  • Authentication, rate-limit, missing-model and unknown provider errors.
  • Effective tools in both top-level and Responses Lite catalogs. The tested catalog contains functions.exec, functions.wait and functions.request_user_input_async; the only nested code tool is clock__curr_time.
  • Actual attempts to use shell execution, patches, image reads, agent spawning, MCP, goals, nested shell calls, filesystem imports and network fetches are denied. No fixture file is created and no private context/image is returned. Native denial can be returned to the model so it can continue with text; that does not indicate a successful tool operation.
  • A probe inside the native code runtime exposes only the clock tool. fetch, process, require and Deno are undefined; importing node:fs is rejected.
  • Seeded ambient hooks/MCP processes do not start. Cancellation closes the model stream and leaves no owned native/helper processes alive.

Calculation and clock utilities remain available internally. This is an audited restricted surface, not an empty native tool catalog. tools: false means registered application tools are unsupported. Separate SDK protocol fixtures verify that requests for tools, approvals, permissions, authentication callbacks and user interaction fail without a grant. Unexpected operation items and mismatched thread/turn messages also fail. The adapter emits completed message items and uses native deltas for progress; textStreaming remains false.

Refresh and policy changes

Successful synthetic refresh made one OAuth call and one model request. In 0.157.0, startup token rotation can invalidate the initial native network-policy generation. The SDK reopens the process once only when that exact startup error occurs before initialization replies. No thread or prompt has been sent. The replacement process loads current native policy; no permission is relaxed. The fixture records two native processes but only one generation request.

This recovery cannot apply after initialization or to a submitted prompt. Repeated startup policy changes fail as CLI_POLICY_CHANGED. Permanent refresh failures return CLI_AUTH_REQUIRED without restarting the process or changing stored credentials. Each expired/reused/revoked fixture recorded two native refresh attempts and two rejected model requests within one process. These are native recovery attempts, not repeated SDK runs.

The fixture wrapper sets CODEX_REFRESH_TOKEN_URL_OVERRIDE to its local OAuth server; the SDK environment allowlist excludes that variable. Real credentials are never read, copied, invalidated or forced to expire by these tests. Native Codex owns sign-in and storage. Synthetic refresh tests do not certify external authorization-server availability.

Context and isolation limits

Global AGENTS.md and global skill descriptions still enter the prompt, including with host skill discovery disabled. The fixture separately verifies that its account-level developer instruction and parent workspace marker do not enter the request. App-server configuration is read through the native protocol to disable inherited MCP entries; this is not exec's --ignore-user-config mode. Restrictions override relevant settings without claiming to remove all native personalization.

For application-only context, use a dedicated OS user or container with a clean home and sign in normally there. accountDirectory alone does not hide global skills. These controls are not a general OS sandbox or a boundary between mutually untrusted tenants. The SDK does not alter user configuration, remove user files or copy credentials.

Live requalification

The user selected the existing local sign-in, gpt-6-luna, medium reasoning. At 17:24 UTC the revised adapter returned exactly AGENTICDRIVER_APP_SERVER_OK for run 3cf915a4-17ef-48fd-bdca-06dbde758966. It emitted native progress, text, reported usage and completion. Usage was 10,184 input, 12 output, zero cached input and zero reasoning tokens. These are native measurements, not an inferred subscription charge. Owned processes were reaped.

At 17:26 UTC, run 41ee194f-bd64-4aa9-8797-86e04a2d0a34 was cancelled two seconds after the native turn/start request. The SDK returned CANCELLED without text or usage. A follow-up process check confirmed the owned processes were reaped; they were not all gone at the immediate terminal-event observation. Remote inference stop time and consumed quota remain unknown.

Other models, accounts, versions, operating systems and application workflows require their own evidence. Native application tools remain separate AD-009 work.

Reproduce

Install Linux bubblewrap, Python 3.10+ and Node.js. Supply the absolute native ELF path, not the npm JavaScript launcher, and retain its adjacent codex-code-mode-host so missing components cannot hide tool behavior.

sh
npm ci
npm run test:codex-native -- \
  --binary /absolute/path/to/native/bin/codex \
  --receipt /tmp/codex-native-receipt.json

The runner hides the real home and /tmp, disables external networking and uses synthetic accounts. The wrapper changes only fixture endpoints, credential-store and telemetry settings; restrictions come from the real SDK. Receipts record native/helper and adapter/process-runner hashes, source revision/dirty state, the effective catalog and individual results. Fixture watchdogs bound test infrastructure only. SDK run and inactivity timeouts remain disabled by default.

Maintained with the AgenticDriver SDKSource snapshot ↗