codex-in-claude v0.21.0
A caller-steering release. Consult and review gain an optional developer_instructions
parameter — caller stance for Codex's developer turn, always behind this server's framing, with
a {sha256, bytes} fingerprint reported in meta — and the operator passthrough loses the
ability to set the instruction-bearing config keys that could outrank that framing (the one
breaking change, operator surface only). The bundled skill teaches agents how to route content
into the new parameter and how to recover its refusals. The result fingerprint moves
schema-84 → schema-85 and the persisted RESULT_FORMAT 10 → 11 (both additive); the tracked
Codex version moves to 0.151 with no contract break.
Added
developer_instructionsoncodex_consult,codex_consult_async,codex_review_changes,
andcodex_review_changes_async(#556): optional caller stance/focus text for Codex's
developer turn, composed into ONE-c developer_instructionsvalue — this server's framing
always leads, the caller text is delimited on both sides, and the closing marker outranks
anything between the markers. codex places the value as the first developer-role message,
ahead of its own developer messages (verified viacodex debug prompt-inputon0.151.0), so
that placement is disclosed rather than reordered. Normalized once (stripped; blank =
omitted); refused pre-spend over 4096 bytes, on control characters (C0 except tab/LF/CR, DEL,
NUL) or lone surrogates, or when the text carries a framing-marker line (invalid_arguments
with a reason namingforged_framing_marker); counted against
CODEX_IN_CLAUDE_MAX_INPUT_BYTESwith the call's other caller-authored inputs. Emitted only
when text is present, so the common run's argv is byte-identical to0.20.0's and never arms
--strict-config; an instruction-carrying run does arm it, and a strict-config rejection of
the plugin's own key is attributed to the plugin (cli_contract_changed), never to the user's
config.metagains adeveloper_instructions{sha256, bytes}fingerprint on sync results,
the async launch handle, and fetched job results; the text itself is never echoed, though it
does ride the codex command line and the on-disk background-job record — the tool description
and skill disclose both carriers. Deliberately NOT oncodex_delegate/codex_delegate_async.
Newdeveloper_instructionsparameter contract incodex://params.fingerprint
schema-84→schema-85; persistedRESULT_FORMAT10 → 11 (newMetafield). Non-breaking
(additive).- The bundled skill teaches when and how to use
developer_instructions(#560): a
content-routing rule (stance/persona/emphasis indeveloper_instructions; the target via the
review scope or a consult'squestion; facts and quoted artifacts inextra_context; data
never in the developer turn), refusal recovery forforged_framing_markerand the two byte
limits, a dry-run caveat (codex_dry_runtakes nodeveloper_instructions), an independence
hazard (a stance hinting at Claude's approach forfeits the two-member pattern), and framing
stability across review–revise passes with themeta.developer_instructionsfingerprint as
the equality check. SKILL.md gains a Data-exposure bullet for the argv/job-record carriers and
three binding rules (routing, exposure, independence) so the rules agents apply are as wide as
the disclosures. Skill prose only — no wire text.
Changed
- BREAKING (operator surface): the extra-args passthrough can no longer set the
instruction-bearing config keys (#555).CODEX_IN_CLAUDE_EXTRA_ARGSnow refuses
-c developer_instructions=…,model_instructions_file, its deprecated alias
experimental_instructions_file, the documented-as-reservedinstructions, and
model_catalog_json(a catalog entry can redefine a model'sbase_instructions) — plus the
usual case/quote lookalikes — at parse time withextra_args_rejected, before any spend.
Every framing string this server sends rides the user turn whiledeveloper_instructions
lands as the first developer-role message, so a passthrough value outranked the server's own
guardrails with nometarecord; the per-call, meta-reported parameter (above) is the
first-class replacement.--profileand, atinheritisolation, the user'sconfig.toml
remain the documented operator-trust boundary. Not itself afingerprintmove: the denylist
is not part of the discovered surface. - pontonier 0.6.0 → 0.7.0: the caller text crosses the backend adapter on the new
first-classRunRequest.instructions_appendfield (pontonier#12) instead of riding
extra_args, which the protocol reserves for operator descriptors;
CodexBackend.validate_requestmirrors the server boundary andprepare()fails closed for
direct adapter callers (#558). - Tracked Codex version is now
0.151.SUPPORTED_VERSIONStracks(0, 151); a0.149
or0.150CLI still runs and reports the advisory untracked-version warning in
codex_status. Verified end to end againstcodex-cli 0.151.0and A/B'd against a
side-by-side0.149.1. No contract break and no agent-visible change.- All 12
ALWAYS_SENDflags, the--modelhelp-gated flag, and all three--sandboxvalues
are present; the five relevant help screens are byte-identical to0.149.1. - Both security pins re-verified live with positive controls, each against the config file
and an operator--profile:sandbox_workspace_write.network_access=falsestill blocks
egress, andsandbox_workspace_write.writable_roots=[]still blocks writes outside the
workspace; upstream'sSandboxWorkspaceWritestruct still carries exactly the four fields
COMPATIBILITY.mdaccounts for. - The
--strict-configgrammars still parse,--ignore-user-configstill exempts the config
file, and the app-server schema diff left all seven consumed schemas byte-identical. KNOWN_MODEL_SLUGSis unchanged, and the implicit-context presence matrix (AGENTS.md
sources and both skills roots) is identical to0.149.1under the read-forbidding probe.
0.151adds a default-offskip_host_skill_discoveryfeature flag — inert here, but the
flag to re-probe first when it stages.- New
0.151surface is deliberately not adopted;remote_plugin,view_image, and
recommended_pluginsall hold their recorded stage and default.
- All 12