Skip to content

fix(server): Codex plans offer Implement again - #13793

Merged
juliusmarminge merged 1 commit into
t3code/codex-turn-mappingfrom
fix/codex-proposed-plan-active
Sep 26, 2026
Merged

juliusmarminge merged 1 commit into
t3code/codex-turn-mappingfrom
fix/codex-proposed-plan-active

Conversation

@juliusmarminge

@juliusmarminge juliusmarminge commented Sep 26, 2026 •

Copy link
Copy Markdown
Member

A Codex plan-mode turn that proposes a plan never offers Implement, and the sidebar never shows "Plan Ready". The composer only has the plain send arrow, and the plan cannot be implemented from the UI.

Seen live on Codex 0.156.1 / gpt-6-luna in Plan mode. After the turn settled, orchestration_v2_projection_plans held the proposed plan with "status":"completed":

Before: a settled Codex plan in Plan mode shows only the send arrow, with no Implement button

Why

The Codex adapter published the finished plan item with status: "completed". Everything downstream treats only active as an open proposal:

  • web hasActionableProposedPlan (the Implement button) and the sidebar's "Plan Ready" pill,
  • the shell's hasActionableProposedPlan,
  • message.dispatch, which rejects sourcePlanRef for a plan that is not active.

completed is the state Implement moves a plan into once it consumes it. Claude (status: "active") and Cursor (completed ? "active" : "draft") already publish finished proposals as active. The streaming deltas in the Codex adapter were already active, so the plan flipped to completed only when the item finished.

Fix

The Codex adapter publishes a finished proposed plan as active. Implement still marks it completed when it runs.

This is separate from #13775, which fixes the server-side sourcePlanRef lookup for every provider. Codex plans also need this change before the Implement button appears, and before #13775's path can accept them.

Verification

  • The proposed_plan Codex replay fixture (recorded on 0.156.1) now asserts that the final proposed plan is active. It fails on the base (expected 'completed' to equal 'active') and passes with the fix.
  • vp test run src/orchestration-v2/testkit/OrchestratorReplayFixtures.integration.test.ts -t "proposed_plan|plan_questions": 5 passed.
  • vp test run src/orchestration-v2/Adapters/CodexAdapterV2.test.ts -t "plan|Plan": 2 passed.
  • vp exec tsc --noEmit -p . in apps/server: clean. vp lint/vp fmt on the touched files show only the two no-unused-vars warnings that already exist in CodexAdapterV2.ts.
  • Not run: the full server suite, and an end-to-end Implement click, because that path also needs fix(server): Implement starts a run from a proposed plan again #13775.

Model: Claude Opus 5.5 (Claude Code)

🤖 Generated with Claude Code


Devin Review

The Codex adapter marked a finished proposed plan "completed". Clients
only offer Implement (and the sidebar only shows Plan Ready) for an
"active" plan, and the server rejects Implement for a plan that is not
active, so a Codex plan could never be implemented. Claude and Cursor
already publish finished proposals as active; Codex now does too, and
Implement still completes the plan when it consumes it.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Sep 26, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ℹ️ No successful main baseline artifact is available yet. This run establishes the initial measurement.

Provider Metric Main baseline This PR Impact PR ceiling
Codex Total thread wire — 4.9 KiB — 6.8 KiB ✅
Codex Thread snapshot wire — 3.7 KiB — 4.9 KiB ✅
Codex Live turn WebSocket wire — 1.2 KiB — 2.0 KiB ✅
Codex Live turn WebSocket decoded — 20.4 KiB — 29.3 KiB ✅
Codex Live turn messages — 2 — 8 ✅
Claude Total thread wire — 4.9 KiB — 6.8 KiB ✅
Claude Thread snapshot wire — 3.7 KiB — 4.9 KiB ✅
Claude Live turn WebSocket wire — 1.2 KiB — 2.0 KiB ✅
Claude Live turn WebSocket decoded — 20.8 KiB — 29.3 KiB ✅
Claude Live turn messages — 2 — 8 ✅

Baseline: unavailable · PR result: 112bbbf · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 106.1 KiB
  • Claude decoded thread snapshot: 106.4 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@macroscopeapp

macroscopeapp Bot commented Sep 26, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 112bbbf

Macroscope's review found this PR approvable — This narrowly scoped Codex lifecycle fix keeps a finished proposed plan actionable until Implement consumes it, while execution nodes and turn items still complete normally. The accompanying fixture assertion covers the behavior, with no schema, infrastructure, default, or static-analysis changes.

You can add or adjust custom eligibility rules. Learn more.

@juliusmarminge
juliusmarminge merged commit 0481b76 into t3code/codex-turn-mapping Sep 26, 2026
24 of 25 checks passed
@juliusmarminge
juliusmarminge deleted the fix/codex-proposed-plan-active branch September 26, 2026 18:16
juliusmarminge added a commit that referenced this pull request Sep 26, 2026
Brings in the V2 bug-hunt fixes merged since this branch was cut
(#13541, #13775, #13786, #13793, #13796, #13802). No conflicts.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XS 0-9 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant