Is a second model worth the extra time on internal refactors?
Tares lets you decide per session: the second model adds 30 to 90 seconds per plan and one Codex run per commit, and advisory mode keeps findings from blocking. Mark only the refactor sessions where you want a second opinion. Set challenger_mode to advise when you want the review without the fix loop.
How it works
In a challenger session, Claude Code plans and builds as usual. The OpenAI Codex CLI on your laptop critiques the plan and reviews every commit. Tares records the exchange. The costs fall in four places:
- Time per plan. Codex takes 30 to 90 seconds on a plan, so Claude’s first reply after you approve the plan is slower.
- Time per commit. Each
git committriggers a Codex review of that commit. Every review records itsduration_secondson achallenge_commitevent, so you can read the real cost on your own repo. - Time in the fix loop. A
[P1]or[P2]finding on a commit blocks Claude. Claude fixes it, folds the fix into the same commit withgit commit --amend, and Codex reviews again as round 2. The loop is capped at 8 rounds per commit and 5 turn ends per session.[P3]findings are context only, and a Codex timeout, error or inconclusive review never blocks. - A second bill. Codex runs on your laptop against your OpenAI account. A session with a plan and three commits is typically five to eight Codex runs. The summarizer is one Tares agent run per session, metered like every other agent run.
The challenger runs locally and never waits on Tares. If Tares is down or slow, a review is not held up.
Set it up
-
Install the Tares plugin for Claude Code, version 0.2 or later:
/plugin marketplace add glassflow/tares /plugin install tares@tares -
Install the Codex CLI and log in. It bills to your OpenAI account, so this is where the second bill starts.
-
Run Tares locally with its MCP endpoint next to it, or use Tares Cloud, which serves the endpoint itself:
tares up tares mcp --transport streamable-http -
In Claude Code, open your refactor and say “make this a challenger session”, or type
/tares:challenger. Only marked sessions run the challenger. An unmarked session is streamed like any other and nothing runs. -
To keep commit findings from blocking, set the plugin option
challenger_modetoadvise. The default isstrict. -
To drop the second model for the rest of a session, type
/tares:challenger off. -
To override a single blocking finding in strict mode, use
/tares:challenger-waive. It lists the blocking findings and waives one or all. Tares records the waiver as achallenge_waivedevent.
The full walkthrough is in Challenge Claude Code with a second model. If you are setting up the software factory for Claude Code, start with Get started.
What you get
- A cost you control per session. You mark a session or you don’t, so you spend Codex runs only where you want a second opinion.
- Measured time.
challenge_planandchallenge_commitevents carryduration_seconds,finding_countandblocking_count. After a few refactors you can compare what the reviews cost with what they caught. - A review without the loop. In advisory mode, findings never block. Claude does not stop to amend and re-review, so you pay only for the Codex runs themselves.
- One timeline per session. The Sessions list on the project page shows the plan outcome and a
Findings (N)orPassbadge for each reviewed commit. You can see where the time went. - A short summary and memory proposals. When the session ends,
challenger_summarizerwrites what Codex caught per commit and up to five sentences worth remembering for the repo. Nothing reaches memory until you accept it.
The plan critique does not block you either way. Only [P1] counts as blocking on a plan, and even then Claude revises or tells you why it disagrees.
When something else fits
- If a refactor is small and you want zero added seconds, leave the session unmarked or type
/tares:challenger off. Claude Code then runs as it normally does. - If you want the second opinion but not the fix loop and its extra Codex rounds, use
challenger_modeset toadvise. Switch to the defaultstrictmode when you want findings to hold a commit until they are fixed or waived.