feat(review): per-agent model + effort, defaulting to a cheaper review - #12
Merged
Merged
Conversation
The review workflow ran both agents on one model at the model's own default effort. Measured on a real intendent PR that is $1.54 per pull request: $1.00 for the reviewer (18 turns) and $0.53 for the test-plan agent (14). The two halves are not equally hard. The reviewer does adversarial audit, where model tier buys real findings. The test-plan agent does read-only analysis and emits a checklist — work well inside Haiku's range, at $1/$5 per MTok against Sonnet's $3/$15. Splitting the single `model` input lets each sit where it belongs. Adds four inputs — review-model, test-plan-model, review-effort, test-plan-effort — and changes two defaults so consumers get the saving on the bump without editing anything: test-plan-model to claude-haiku-4-5, and review-effort to medium (below the model's own high). An empty model falls back to `model`; an empty effort passes no flag at all, so any agent left unconfigured behaves exactly as before. test-plan-effort defaults to empty by necessity: effort is rejected by Haiku 4.5 and Sonnet 4.5, so pairing it with the default test-plan-model would fail the request. Documented at the input, in the README, and in the upgrade notes. Note for callers that set `model:` — it no longer reaches both agents, since test-plan-model's non-empty default takes precedence over the fallback. Changelog lands under the in-flight v3.0.0 rather than claiming a release of its own: this stacks on the gates-exit-code fix and changes default behavior, which is MAJOR under LIFECYCLE either way. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01T3dRiaun8tKHmqQWCpMWMo
craigmbooth
changed the base branch from
fix/gates-enforce-exit-codes-and-skip-unchanged-deps
to
main
August 1, 2026 23:08
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.
What
The review workflow ran both agents on a single
modelat the model's own default effort. This splits that into per-agent controls and moves two defaults down, so consumers get a cheaper review on the bump without editing anything.Why, with numbers
Measured on a real intendent PR (the agents self-report
total_cost_usd):reviewtest-plan$1.54 per pull request. The two halves aren't equally hard: the reviewer does adversarial audit, where model tier buys real findings; the test-plan agent does read-only analysis and emits a checklist — well inside Haiku's range, at $1/$5 per MTok against Sonnet's $3/$15.
Changed defaults
test-plan-model→claude-haiku-4-5(was: inheritedmodel, i.e. Sonnet 4.6)review-effort→medium(was: the model's ownhigh)The reviewer deliberately stays on Sonnet. Dropping it to Haiku would save more and cost exactly the thing this workflow exists to produce.
New inputs
review-model,test-plan-model,review-effort,test-plan-effort. Empty model falls back tomodel; empty effort passes no flag at all, so an unconfigured agent behaves exactly as before.Two sharp edges, both documented
effortis rejected by Haiku 4.5 and Sonnet 4.5. That's whytest-plan-effortdefaults to empty — by necessity, not preference. Setting it whiletest-plan-modelis on the default Haiku will fail the request. This is the one thing most likely to bite someone; it's called out at the input, in the README, and in the upgrade notes.model:no longer reaches both agents.test-plan-model's non-empty default takes precedence over the fallback, so a caller settingmodel:and expecting it everywhere now needs a matchingtest-plan-model:.For the reviewer
v3.0.0rather than claiming its own version — this stacks on fix(gates)!: tee no longer masks exit codes; skip deps scan when unchanged #11 and changes default behavior, which is MAJOR under LIFECYCLE regardless. If you'd rather it be a separate release, it needs splitting out before tag.review.ymlYAML-validates and the expressions render correctly, but no PR has actually executed with these defaults. First real exercise will be this PR's own review — which, being a workflow-file change, may trip the GitHub App workflow-validation guard and skip.Also worth knowing
v2.4.0has a changelog entry onmainbut no git tag — the review-ticket skill is merged and unreleased. And #11 cutsv3.0.0without bumpingplugin/.claude-plugin/plugin.json, which still reads2.4.0; past releases kept it in lockstep with the single SemVer stream. Both are outside this PR's scope but want resolving before the tag.🤖 Generated with Claude Code
https://claude.ai/code/session_01T3dRiaun8tKHmqQWCpMWMo