Make Codex (and, later, other CLIs) a first-class coding engine on par with Claude: driven through its own structured event stream instead of scraped raw stdout, with the same clarity Claude already has about how it's invoked and who pays. Today Claude is the only structured engine (mode = clientType === "claude" ? "stream-json" : "raw" in headless.ts); every other engine is spawned raw, so its output is noisy/truncated, its spend is unmetered, and its acts are unattributed.
The work
Dependency chain (runner):
Independent (UX / config clarity):
Downstream — consequences fixed once the chain lands (not to be worked directly):
Cross-cutting obligations (don't let these fall through)
Open strategic question
#730 (engine-side resume) vs #693 ("platform owns the conversation" — seed continuity from coding_timeline, demote the engine's own memory). #730 is a deferred-#693 stopgap; if its spike fails, route Codex continuity through #693 instead. Resolve before scheduling #730's follow-up.
Provenance: decomposition + this framing came out of an adversarial 3-lens review (technical accuracy, scope/duplication, UX) on 2026-08-22.
Make Codex (and, later, other CLIs) a first-class coding engine on par with Claude: driven through its own structured event stream instead of scraped raw stdout, with the same clarity Claude already has about how it's invoked and who pays. Today Claude is the only structured engine (
mode = clientType === "claude" ? "stream-json" : "raw"inheadless.ts); every other engine is spawned raw, so its output is noisy/truncated, its spend is unmetered, and its acts are unattributed.The work
Dependency chain (runner):
codex exec --json(structured), not raw stdout capture #729 — Codex viacodex exec --json(structured) — fixture-spike first;--jsonis an unverified premise + unstable with active toolsIndependent (UX / config clarity):
Downstream — consequences fixed once the chain lands (not to be worked directly):
--jsontrack lives in [design] Structured engine adapters — parse each CLI's own JSON event stream, not a claude-or-raw switch #728/First-class Codex engine viacodex exec --json(structured), not raw stdout capture #729acts[].okabsent for raw engines), The handoff prompt a user answers is scraped from prose, because no structured field exists to prefer #621 (handoff scraped from prose) — all become tractable once raw engines emit structured usage/acts.Cross-cutting obligations (don't let these fall through)
docs/coding-engines.mdmust be updated by First-class Codex engine viacodex exec --json(structured), not raw stdout capture #729/[spike] Codex session continuity — verify resume-by-id is viable before building it #730 — its "why no shipped preset resumes" and "what one-shot costs" sections go stale for Codex.--json-equivalent investigation) — recorded here so "Codex only" is a decision, not a forgotten gap. File aP3: lateradapter issue if/when demand appears.Open strategic question
#730 (engine-side resume) vs #693 ("platform owns the conversation" — seed continuity from
coding_timeline, demote the engine's own memory). #730 is a deferred-#693 stopgap; if its spike fails, route Codex continuity through #693 instead. Resolve before scheduling #730's follow-up.Provenance: decomposition + this framing came out of an adversarial 3-lens review (technical accuracy, scope/duplication, UX) on 2026-08-22.