Repository navigation
Choose the Harness, Model and Effort a Command runs on (Claude Code or Codex) - #401
Merged
Merged
Conversation
The Factory skills stop being a Claude plugin. Each is renamed thirdshift-<skill> in skills/, and names the others in plain prose. thirdshift writes them out once per Command and links each into the worktree's .claude/skills/, kept out of git by a /.claude/skills/thirdshift-* entry in .git/info/exclude, added once. No session gets --plugin-dir, and each prompt's first line is /thirdshift-<skill>. Restores resolving-merge-conflicts, dropped from skills/ by a skills update though the conflict Repair prompts still invoke it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ory skills (#391) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Load the Factory skills from the worktree as thirdshift-<skill>, replacing the Claude plugin
…ser config (#392) harness <name>, model <name> and effort <level> on a Run, an Architect run (not with --plan-only) and a Pickup run, falling back to the User config's [harness] section, then to claude with its own Model and Effort. The choice reaches every session and child Run, is checked before any work (CLI on PATH, a test call for a named Claude Model, codex not supported yet), and is recorded in the Command log, the Activity log, the PR body and the Run notification. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Read [harness.<name>] through Harness::named and Settings::of_mut, keep a User config's Model and Effort as written, move the PR body's Built with line next to the Delivery that writes it, and rewrap doc comments. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Choose the Harness, Model and Effort on the command line and in the User config (#392)
Setup's first questions choose the Harness, listing both and refusing one sessions can't run on here, then the Model and Effort for it, a Claude Model checked with the test call a Run makes. The User config gains [harness], [harness.claude] and [harness.codex] with every key, and completing an existing one now recurses into subsections. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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>
The Harness question defaults to the first Harness sessions can run on, claude when both can, as the issue says, rather than the User config's. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Setup asks for the Harness, Model and Effort (#393)
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>
Run a Command's sessions on Codex
…em with SIGINT first (#395) A Codex sub-agent call still running at turn end is now killed background work, as a command is, so its session gets the one Resume. An interrupt sends a Codex session SIGINT, the only signal Codex stops cleanly on, before SIGTERM and SIGKILL. Tests cover the Resume on Codex ending the same way, counting against no Repair cap, and the interrupt order. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With codex on PATH, Setup accepts it as the Harness, and it's the default answer when it's the only one installed. For Codex, Setup lists the Models codex debug models offers, by slug and display name, then the Efforts the chosen Model supports. Each answer is matched as a Run matches it and written as Codex names it; one the catalog doesn't have is asked again, with the valid choices. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…lled-work tracking (#395) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Resume and interrupt Codex sessions (#395)
When codex debug models fails, Setup says so and leaves the harness settings as they are, rather than asking the Harness again, which with only codex installed could never end. The catalog's errors no longer speak of checking, as Setup reads it to list the choices, and locals in ask_harness and Catalog::efforts get names that say what they hold. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Setup offers Codex (#396)
…tup keeps the configured Harness The headless and Resume lines no longer name Claude's Bash timeout or TaskStop tool unconditionally, since Codex sessions get them too. Re-running Setup offers the Harness already in the User config as the default answer, when it's installed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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
A Command's sessions run on a Harness (
claudeorcodex), with a Model and an Effort, chosen on the command line, then the User config, then the default (claude, and the Harness's own Model and Effort).The Factory skills stop being a Claude plugin (ADR 0012):
A Codex session runs
codex exec --json --dangerously-bypass-approvals-and-sandboxwith stdin null,-m/model_reasoning_effort, and theCLAUDE.mdfallback. Its stream gives the progress lines, Session log, thread id and final message. A Resume runscodex exec resume <thread>with every flag again. A command or sub-agent call left running gets one Resume,turn.failedfails the Run with Codex's error, and an interrupt sends SIGINT before SIGTERM.Setup asks for the Harness. Both are listed, and one that isn't installed is marked and refused. The default answer is the configured Harness if it's installed, otherwise the installed one, so
claudewhen both are. Setup then asks the Model and Effort for that Harness only. For Codex it lists them from Codex's catalog, and it checks each answer the way a Run does.Review clean-ups in the last commit:
TaskStoptool unconditionally.codexas the default answer.Evidence
tests/setup.rson_a_terminal_rerunning_setup_defaults_to_the_harness_already_configured: a config withdefault = "codex"still offered[claude].tests/codex_sessions.rsassert_sessions_on_codexfailed because a Codex prompt said "raising the Bash timeout".After: both pass, and the full
cargo testandcargo clippy --all-targetspass.tests/harness_choice.rs(flags, fallback, checks before work, recording),tests/codex_sessions.rs(Codex sessions end to end), Setup's Harness scenarios intests/setup.rs, plus additions to the Spec run, Pickup run, Architect run and Base fix suites.Merge Danger
Door: two-way
The skill rename changes how every session loads its skills. Claude sessions no longer get
--plugin-dirand instead findthirdshift-*skills in the worktree's.claude/skills/. The.git/info/excludeentries stay in each target repository.Blast Radius: every-session
A user with no Harness settings keeps running on Claude Code with no extra calls. A repository with its own
.claude/skills/or.agents/skills/gainsthirdshift-*links beside its own skills. Codex sessions run unsandboxed, as ADR 0012 records.Unaddressed findings
Standards
ChoicerepeatsModelAndEffort's fields;--sessions-harness/-model/-effortare three loose options). Skipped: folding them is a wide refactor across the session seam for no change in behaviour. Better as its own clean-up.match harnessin harness.rs, session.rs, progress.rs, skills.rs, questions.rs). Skipped: with two Harnesses and Harness-specific choices, a per-Harness adapter trait is a larger redesign than this Spec needs.harness.harness, the twoclaude_args/codex_args,Choice::test_call). Skipped: renaming across the seam is churn with no behaviour change, and the doc comments state each one's role.Choice, partly in session.rs). Skipped for the same reason as the Repeated Switches finding.Harness::namedinconfig.rs. Skipped: it's a match guard, which can't bind the Harness it finds.Catalog::model/Catalog::listed. Skipped: they're small and answer different questions.Stream::failed/errordefaults that only Codex overrides. Skipped: the reviewer judged them acceptable.Spec
-clears a Model or Effort in Setup, and blank keeps the current value (scope creep). Skipped: on re-run, blank keeping the current value is how every Setup question behaves (user story 28). Without-, there would be no way back to the Harness's default.thirdshift-resolving-merge-conflictsskill (scope creep). Skipped: the conflict-repair prompt already loaded that skill, which didn't exist, so the rename tothirdshift-names needed it.thirdshift helpsection on the Harness (scope creep). Skipped: it documents the new flags, which users need.Closes #136
Tickets
🤖 Generated with Claude Code