eliziff makes Codex a serious subscription-backed assistant

This fork turns OpenAI Codex into a persistent, recoverable assistant channel built for real working sessions.

integrationinfrastructure

eliziff has spent two weeks treating Codex as an operational dependency, not a novelty. The work centres on the subscription-based command-line route, with the awkward parts of running an external AI assistant handled explicitly.

  • Sessions can resume after a crash, and interrupted responses get one retry.
  • Long-running work uses progress-aware deadlines instead of a fixed timer that may cut off useful work.
  • The assistant can run in a sandbox, including when the application itself is inside Docker.
  • Usage and cache information are recorded without storing private context details.
  • A bounded PDF-repair mode is available for a narrow document-fix task.

The fork also keeps unavailable model options out of the chooser, which matters when a legal team needs the interface to reflect what is actually configured.

Teams considering subscription-backed AI assistants should care: this is a useful case study in making that route dependable enough for day-to-day legal work.

So what For legal-tech teams weighing a subscription-backed AI assistant, eliziff offers a practical look at the reliability and containment work required before it belongs in a working product.

View this fork on GitHub →

Spotted something wrong? Or know the PR text has fresher detail than the writeup above?

Commits in this thread

33 commits from eliziff/Beaver, oldest first. Source extracted verbatim from the harvested git log.

SHA Subject Author Date
fcfd924c Fix local assistant effort selection Eli Ziff 2026-07-25 ↗ GitHub
9c9a7c61 Separate Codex effort control Eli Ziff 2026-07-25 ↗ GitHub
f3449c7c Connect Codex to local Mike Library Eli Ziff 2026-07-25 ↗ GitHub
771a5ae0 fix: handle fast codex process exits Eli Ziff 2026-07-27 ↗ GitHub
2f8c7ed0 feat: record privacy-safe LLM context metrics Eli Ziff 2026-07-27 ↗ GitHub
2a200109 feat: capture Codex cache usage Eli Ziff 2026-07-27 ↗ GitHub
1b8095db feat: resume crash-safe Codex chat sessions Eli Ziff 2026-07-27 ↗ GitHub
3812c538 feat: add bounded Codex PDF repair Eli Ziff 2026-07-27 ↗ GitHub
c85ef03a perf: stream Codex turns over a persistent app-server Eli Ziff 2026-07-27 ↗ GitHub
commit body
`codex exec` respawned the CLI every turn (~320-930ms of process init) and
emitted the assistant message only as a single item.completed lump, so
firstContentLatencyMs landed within ~0.4s of totalLatencyMs - users waited out
the whole generation before seeing a character.

Adds a `codex app-server` adapter: one persistent JSON-RPC child per auth
identity, newline-delimited framing, real `item/agentMessage/delta` streaming,
per-thread mike_runtime MCP bridge config, turn/interrupt-backed aborts, and a
transparent fallback to the exec path (BEAVER_CODEX_EXEC=1 forces it).

The app-server has no --ignore-user-config, so it runs against an isolated
CODEX_HOME that mirrors the CLI login; that keeps the operator config.toml MCP
servers, hooks, and plugins out of Beaver turns as the exec path already does.

Measured on codex-cli 0.145.0, gpt-5.3-codex-spark, effort low:
exec 1 content delta at 3.4-4.9s; app-server 8-9 deltas at 2.0-2.9s.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QUsMXzBsEJ27DjJVPSfW5o
b0670521 fix: reasoning deltas disqualify Codex exec replay Eli Ziff 2026-07-27 ↗ GitHub
commit body
Reasoning summaries stream to the client and persist as transcript
events, so falling back to exec after one has escaped would duplicate
the thinking block in the saved chat. Also verified live under review:
two concurrent turns on the shared app-server singleton show no
cross-talk and no truncation (every notification carries a required
top-level threadId per the generated 0.145 protocol schema).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QUsMXzBsEJ27DjJVPSfW5o
e52c9779 feat: env-gated codex preamble stripping for benchmark runs Eli Ziff 2026-07-28 ↗ GitHub
commit body
MIKE_CODEX_BASE_INSTRUCTIONS replaces the Codex base prompt and
MIKE_CODEX_FEATURES_OFF disables tool-suite features via thread/start
overrides. Measured 15.8k -> 9.7k input tokens/turn on the ChatGPT
backend; the rest is server-side and not removable.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016yXxuitxX5h4wm1v88hnga
ecb84464 feat: codex-api provider for bare subscription-backend calls Eli Ziff 2026-07-28 ↗ GitHub
commit body
Direct Responses calls to chatgpt.com/backend-api/codex with OAuth borrowed from the Codex CLI (flow ported from simonw/llm-openai-via-codex, MIT). 24-45 input tokens/turn vs ~16k through the harness; measured live. codex: app-server route unchanged for chat.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

Claude-Session: https://claude.ai/code/session_016yXxuitxX5h4wm1v88hnga
23a56d6a refactor: direct backend is the only codex path Eli Ziff 2026-07-28 ↗ GitHub
commit body
Delete the app-server bridge, exec adapter, and MCP tool bridge; codex:
models now stream through codexApi (native function calls, ~50 tokens
overhead vs ~16k). Drop codex-exec legacy id, codex-api: alias, and the
chat isCodex special-cases. Verified live: legalbench abercrombie 84.0
(parity with harness sweep) and a native tool-call round trip.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016yXxuitxX5h4wm1v88hnga
67d549ae Hide unconfigured model providers Eli Ziff 2026-07-28 ↗ GitHub
54e40d2a Align model selector tests with configured providers Eli Ziff 2026-07-28 ↗ GitHub
9dd04879 Finish Codex model catalog loading Eli Ziff 2026-07-28 ↗ GitHub
175d5b08 Correct LAB protocol: model held constant, codex is pilot-only Eli Ziff 2026-07-28 ↗ GitHub
commit body
The experiment measures LAB harness vs Beaver harness with the model
held constant per pairing (sonnet-4-6 via headless Claude Code; desktop
qwen via ollama). Codex rows are pilot history - no codex in any
experiment cell. Claude-Code-as-product runs relabeled cc-harness-* as
a side observation. AGENTS.md gains the .CMD-shim argv trap and the
corrected design note.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018bhP89cYSdEEjHNPnxacns
a779ebb8 Retry overloaded upstream before failing the turn Eli Ziff 2026-07-29 ↗ GitHub
commit body
server_is_overloaded killed five benchmark turns today; the Responses
transport now retries an attempt up to twice with linear backoff, but
only while nothing from that attempt has reached the caller - a replay
after emitted deltas or tool-call starts would duplicate output. The
persistent-thread response id rolls back to its pre-attempt checkpoint
on retry.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012AgUm5EcRKbT3duVFMbrQD
74859870 Header generator: exponential backoff on codex 429s Eli Ziff 2026-07-30 ↗ GitHub
commit body
Measured 1,502/2,008 rate-limit errors at c=12 (short low-effort calls
push request rate far above the rerank arms' profile); retry up to 5x
with jittered backoff, error rows re-run via resume.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012AgUm5EcRKbT3duVFMbrQD
759a83e9 Fix native Codex exec policy flags Eli Ziff 2026-08-02 ↗ GitHub
9bf4a1dd Record native Codex prelaunch correction Eli Ziff 2026-08-02 ↗ GitHub
be980856 Attach stdin for native Codex runs Eli Ziff 2026-08-02 ↗ GitHub
13b49d9b Allow nested Codex sandbox in Docker Eli Ziff 2026-08-02 ↗ GitHub
f0c1a74d Preregister one native Codex sandbox trial Eli Ziff 2026-08-02 ↗ GitHub
7d9e2ecd Add grounded harness arm and explicit Codex caching Eli Ziff 2026-08-02 ↗ GitHub
72423102 Respect Codex cache-control compatibility Eli Ziff 2026-08-02 ↗ GitHub
c031ca4c Preregister Codex-compatible cache run Eli Ziff 2026-08-02 ↗ GitHub
6e5cb15e fix(harness): restore codex cli tool bridge Eli Ziff 2026-08-03 ↗ GitHub
2b107841 bench: fingerprint codex cli transport Eli Ziff 2026-08-03 ↗ GitHub
df258642 fix(lab): judge through codex cli subscription Eli Ziff 2026-08-03 ↗ GitHub
2014a77f fix: retry interrupted Codex streams once Eli Ziff 2026-08-03 ↗ GitHub
730a5ec6 bench: record Codex transport retries Eli Ziff 2026-08-03 ↗ GitHub
3e10805e Use progress-aware Codex invocation deadlines Eli Ziff 2026-08-08 ↗ GitHub

Capture this thread into my fork

Download a single Markdown prompt that tells Claude how to port every commit above into your working tree — adapting paths and structure to match your repo. Run it via claude -p < capture-thread-836.md from inside the repo you want the changes in.

⬇ Download capture-thread-836.md