Repository navigation
Run a Command's sessions on Codex - #404
Merged
Merged
Conversation
harness codex runs every session as codex exec --json, unsandboxed, with stdin null, the Model and Effort as Codex names them and the CLAUDE.md fallback. The Factory skills are linked into .agents/skills/, and each prompt loads its skill as $thirdshift-<skill>. Codex's JSONL stream gives the progress lines, session id, final message and failures. The Model and Effort are checked against codex debug models before any work, replacing the not-supported-yet refusal. The fake gains a codex personality. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Name the Claude stream ClaudeProgress, settle a Codex Model and Effort into a ModelAndEffort, give the token totals their own type, and cover a Merge run, a bare non-zero exit and the prompts' sigil on Codex. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Setup's Harness question (#393) refuses Codex as not supported yet through Harness::unavailable, and its Model check uses test_call. A Run's check now runs Codex sessions, so it checks only that the CLI is on PATH, then makes Claude's test call or settles Codex's names from its catalog. Setup still refuses Codex until #396 turns it on. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 5, 2026
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
With
harness codex, every session of a Command runs on Codex: the implement session, Repairs, a Resume, a Spec run's Ticket Runs and Spec review, and an Architect run's Architecture review. The "not supported yet" refusal is gone.The settled names are what the Command log, Activity log, PR body (
Built with codex · gpt-6.1-sol · max) and Run notification record, and what child Runs and a Base fix get. The fake gains acodexpersonality:debug modelsfrom a fixed catalog,exec --jsonrunning the same per-test scripts as the fakeclaude.prompts/keeps the Claude rendering, with one note on Codex. README and--helpdescribe the Codex sessions.Evidence
thirdshift harness codex <issue>→harness codex, chosen by the harness flag, is not supported yet.After:
tests/codex_sessions.rspasses, and so does the fullcargo testrun (34 test binaries):Merge Danger
Door: two-way
Revert restores the refusal. The only lasting side effects are the
/.agents/skills/thirdshift-*line in.git/info/exclude, and Codex's owntrust_levelentry in~/.codex/config.toml(ADR-0012).Blast Radius: sessions
Claude sessions now go through the shared
Streamtrait andsession_args. Their argv, prompts andprompts/rendering are unchanged, and the Claude suites pass.Choice::checknow settles names in place, sorun_to_end,architect::runandpickup::runtake&mut, andstarted.built_withis called after the run instead of before it.Unaddressed findings
Standards
Choice::checkmutates instead of returning a settledChoice. Skipped: the check has to run insiderun(after the Launch directory checks), so the settled value would need the same plumbing back out toAsksandBaseFixeither way.match harnessin four modules (Repeated Switches / Shotgun Surgery). Skipped: each match sits where its concern lives (skills dir, stream, argv, check). OneHarnesstrait would be speculative with two Harnesses.ClaudeProgressdoesn't overridefailed()/error()(Refused Bequest). Skipped: making a Claudeis_errorresult fatal would change Claude's behaviour, which is out of scope.Choice::codex_argsandsession::codex_argsshare a name. Skipped: this mirrors the existingChoice::claude_args/session::claude_argspair.Asks { harness, ..Asks::of_…() }inarchitectandpickup. Skipped: two three-line sites with different constructors; a helper would add more than it removes.codexborrowspubhelpers from the fakeclaude. Skipped: moving them into a shared module is churn in test-only code for no behaviour change.Spec
~/.codex/config.toml). The union still catches typos and case, and the README documents it.visibility: hideModels from the choices list, and README notes on trust and~/.claude/were not asked for. Kept: each is needed for "just as it does on Claude" (the Resume and killed work go through the sharedSessions), or keeps the progress lines and error messages readable.codex_promptonly rewrites a leading/thirdshift-. Kept: every Session prompt that loads a skill starts that way, and a unit test now covers each kind.turn.failedcan cite a stale retriederror. Skipped: with noturn.failed, the last error Codex reported is the best cause on offer, and it beats none.Closes #394
🤖 Generated with Claude Code