codex-in-claude v0.18.0
Added
cli_contract.PONTONIER_CONTRACT— the declarative CLI contract in the shared
BackendContractshape, derivation-pinned against the legacy constants.- Surface-honesty gates via
pontonier.testing:FORBIDDEN_SURFACE_PHRASES
(cross-bridge contamination canaries and refused-mechanism claims) enforced
against the built manifest. backend.CodexBackend— this bridge's adapter on the frozen pontonier
AgentBackendprotocol (contract_api_version = 1), validated by an argv
differential against the production command builder.
Changed
-
Every model-bearing run now goes through the pontonier
AgentBackendadapter:
codex.run_codex_execstages viaCodexBackend.prepare()(temp artifacts,
argv from the shared builder, prompt over stdin, help-gate drops surfaced on
PreparedRun.dropped_flags) and keeps only the execution step — timeouts,
output byte caps, and event streaming stay this bridge's. The consult-only
--skip-git-repo-checkmoved from an inline call-site flag to backend policy
derived from the canonicalkind, pinned by the argv differential test (which
now compares against true production argv — it previously validated a variant
without the flag). Wire snapshots are byte-identical; argv is unchanged for
every tier. -
Generic core machinery (
jobs,worktree,gitdiff,redaction,runtime,
gitproc,streamcap,idempotency,workspace,jsoncache) now comes from
the shared pontonier library
instead of the vendored_core/package. This bridge's worktree knobs
(cic-worktree-prefix,codex-in-claude@localbaseline identity) are pinned
inconfig.WORKTREE_CONFIG, so git-visible behavior is unchanged; all wire
snapshots are byte-identical. -
Docs and code comments retire the deleted
_core/package.CONTRIBUTING.md's one-way
import rule named a directory that no longer exists, andSECURITY.md/COMPATIBILITY.md
cited_core/redaction.py/_core/workspace.pyas the authority for security-relevant
behavior; all now point atpontonier.core. Eight source and test comments were updated the
same way, andtests/test_backend.pyno longer calls the protocol "provisional" while every
other doc calls it frozen. No agent-visible surface changed — the built manifest is
byte-identical, so noFINGERPRINTbump. -
Runtime dependency bumps.
fastmcp3.4.5 → 3.4.7. The built manifest is byte-identical
under the new version, so the agent-visible surface is unmoved and noFINGERPRINTbump follows. -
Tracked Codex version is now
0.147.SUPPORTED_VERSIONStracks(0, 147); a0.146CLI
still runs and only draws the advisorycodex_statuswarning. Thedocs/UPGRADING-CODEX.md
procedure was run end to end againstcodex-cli 0.147.0, A/B'd against a side-by-side
0.146.0from npm (the retrieved binary authenticated clean against the committed0.146.0
help snapshots, and an npm-vs-Homebrew diff of the new version retired the cross-channel
concern). Nothing this plugin sends or reads changed: all 11ALWAYS_SEND_FLAGS,--model, and
the three sandbox values are present, and the guarantee semantics were re-probed live —
read-onlyblocked a write,workspace-writeallowed the workspace write and blocked network
egress,--output-last-messagereceived the final message, and an--output-schemarun
validated againstFINDINGS_OUTPUT_SCHEMA. Themodel_reasoning_effortconfig key is still
applied (the backend rejection carried both[ReasoningEffortParam]and[reasoning.effort]),
andcodex execstill has no dedicated effort flag. Contract-drift stderr signatures still
match.docs/codex-help/0.147.0/carries fresh snapshots and the liveintegrationsuite
passes against the new binary. -
KNOWN_MODEL_SLUGSgainsgpt-5.6-sol-wm. The bundled advisory fallback is refreshed from
the0.147.0-writtenmodels_cache.json. The catalog is backend-served rather than shipped in
the binary, so this slug had already appeared under0.146.0— it is catalog drift the upgrade's
slug diff caught, not a0.147change. The reasoning-effort discovery fields still hold their
pinned shape. -
--approve-for-me(new in0.147.0) is deliberately not adopted, andcli_contract.pynow
records why alongside the other never-sent flags: it routes approval requests through an
automatic review under theworkspace-writesandbox, which would let a read-only-tier run
acquire write capability without the caller electing a write tier. -
App-server: the
0.146.0→0.147.0generated-schema diff is additive only on the consumed
surface — an optionalextensionsmap onInitializeParams(not sent), an optionaltitleon
the import progress/completed per-item results (read tolerantly, ignored), and two new
PlanTypevalues,self_serve_business_proliteandenterprise_cbp_automation, already read as
a free-form capped string. Ten unconsumed v2ThreadSection*messages were added; none removed.
Fixed
- Multi-line private-key blocks (PEM/PKCS8/OpenSSH/PGP) in gathered diffs and
returned prose are now redacted statefully (via pontonier): the BEGIN/END
markers stay visible, every body line between them is replaced with a
[redacted: secret value]marker, and an unterminated block fails closed. Previously only the
BEGIN marker was masked while the entire base64 body was sent. - Bare provider tokens are now redacted. The shared redactor adds patterns for
github_pat_,
glpat-,sk-ant-,npm_, andpypi-tokens. The vendored redactor already caught these in a
labelled assignment (token = "…"), because its value-pattern matcher keys on the label; what
changed is the unlabelled case — a bare token in prose, or a diff line with nokey =in front
of it, which that redactor passed through verbatim. Measured old-vs-new over both spellings: five
improvements, and no payload where the new redactor leaks something the old one caught. - Redaction preserves the diff's trailing newline, so delegate diffs are
git apply-able again (ports moonbridge's fix). COMPATIBILITY.mdcorrects the 2026-08-02 "parentAGENTS.mdabove the git root is loaded"
observation. That mechanism does not reproduce on0.146.0or0.147.0: the parent codeword
was absent from both binaries with a projectAGENTS.mdpresent, with it removed, and with
--cdset to a repository subdirectory. The corrected behavior is that codex walks upward from
the resolved workspace directory and stops at the git root. What is retracted is the
mechanism, not the concern — becauseresolve_workspacereturns an explicitworkspace_root
unchanged, the resolved workspace can be a subdirectory, and the walk then crosses above it
(fromrepo/sub, codex loadedrepo/AGENTS.md). The published "the resolved workspace's
AGENTS.md" caveat therefore still understates egress and issue #472's conclusion stands.
Correcting that published wording is aFINGERPRINT-bumping change tracked in #472, so this
entry changes no agent-visible text and carries no bump.config.py's extra-args comment no longer states a plugin-side narrowing as a codex fact.
It claimed an attached-cKEY=VALis "rejected"; codex accepts it (clap attached short-option
value) on both0.146.0and0.147.0. It is this parser that refuses it, because the
attached-form split fires only on long--flag=value. Behavior is unchanged and
safe-direction — the plugin passes through strictly less than codex would take.- Shared-core diagnostics stay inside the server's log configuration. Moving the core out of
codex_in_claude._coremade its loggers siblings of the server namespace rather than children,
sopontonier.core.*records inherited none of the configured handlers and propagated to the
stdlib root logger instead — the exact escapepropagate = Falseexists to prevent, since an
embedding host may have wired root to stdout (the stdio JSON-RPC channel).obs.configure()now
configures thepontoniernamespace alongsidecodex_in_claude, so library diagnostics honor
CODEX_IN_CLAUDE_LOG_LEVEL/CODEX_IN_CLAUDE_LOG_FILEand reach the same stderr and file
handlers.