Why
No skill in .claude/skills/ names a model, and work-issue delegates every stage to a general-purpose subagent without choosing one. So each stage runs on whatever model the session uses. An Opus session spends Opus on implementing and on device tests, which are mostly mechanical. A Sonnet session reviews and triages on Sonnet, where catching problems matters most. On #96 the implement phase started on Opus and had to be stopped by hand and restarted on Sonnet.
Expected outcome
Each stage runs on its declared model however it starts: delegated by work-issue, run as a slash command, or loaded by another agent.
A skill's model: frontmatter on its own is not enough (evidence in the comments). Claude Code applies it only when a person types the slash command. When a skill is loaded through the Skill tool, which is how work-issue and subagents load them, the run stays on the caller's model. A skill with model: plus context: fork runs in its own subagent on the declared model, whichever way it is started.
| Skill |
Frontmatter |
design-feature, triage-issue, review-pr, review-memory |
model: opus, context: fork |
implement-issue, e2e-device |
model: sonnet, context: fork |
file-issue, cut-release |
model: sonnet, no fork |
work-issue, architecture, writing-changelog, writing-user-docs |
none |
file-issue interviews a person, and cut-release waits for an explicit yes. Both need the conversation, so they stay inline: their model applies when typed as a slash command, and they run on the caller's model when loaded through the Skill tool. work-issue runs on the model the person starts it with. The three writing and rule skills load inside other stages, so they must not change that stage's model.
work-issue delegates each stage by invoking its skill with the Skill tool and passing the issue, the branch and the task as arguments. It stops starting a general-purpose agent that then loads the skill. A forked skill starts without the conversation, so the arguments must carry everything the stage needs.
The Skills table in AGENTS.md gains a Model column and a Forked column, which are the one list to edit when the mapping changes.
Constraints and non-goals
- Use the aliases (
opus, sonnet), not dated model IDs, so the mapping follows new releases without edits.
work-issue never passes a model override. A model given when starting a subagent wins over the skill's model, which would undo this change.
- If an organisation's
availableModels excludes a declared model, Claude Code silently falls back to the session model. That is acceptable and needs no handling.
- Non-goal: OpenCode. It ignores this frontmatter, and its stages keep running on the session model.
- Non-goal: changing what any skill does, beyond
work-issue's delegation mechanics.
How we know it is done
- Every skill's frontmatter matches the table above.
AGENTS.md's Skills table has Model and Forked columns matching the frontmatter.
- A check that runs in CI fails when a skill's
model: or context: disagrees with AGENTS.md, or when a skill in .claude/skills/ is missing from the table.
work-issue invokes each stage's skill with the Skill tool and arguments, and still receives that skill's report block.
- The PR shows headless runs (
claude -p … --output-format json, whose modelUsage lists the models used) proving these routes:
- From a Sonnet session, loading
review-pr through the Skill tool runs it on Opus.
- From an Opus session, loading
implement-issue through the Skill tool runs it on Sonnet.
- A forked skill receives the arguments it was invoked with.
Alternatives considered
model: alone in each skill: ignored whenever the skill is loaded through the Skill tool, so it never applies to work-issue's stages.
- One
.claude/agents/<stage>.md per stage with its model: works for delegated runs, but a typed /review-pr also needs an inline model:, so each stage's model would live in two places.
work-issue naming the model in each delegation: a skill run on its own would get no model.
Why
No skill in
.claude/skills/names a model, andwork-issuedelegates every stage to a general-purpose subagent without choosing one. So each stage runs on whatever model the session uses. An Opus session spends Opus on implementing and on device tests, which are mostly mechanical. A Sonnet session reviews and triages on Sonnet, where catching problems matters most. On #96 the implement phase started on Opus and had to be stopped by hand and restarted on Sonnet.Expected outcome
Each stage runs on its declared model however it starts: delegated by
work-issue, run as a slash command, or loaded by another agent.A skill's
model:frontmatter on its own is not enough (evidence in the comments). Claude Code applies it only when a person types the slash command. When a skill is loaded through the Skill tool, which is howwork-issueand subagents load them, the run stays on the caller's model. A skill withmodel:pluscontext: forkruns in its own subagent on the declared model, whichever way it is started.design-feature,triage-issue,review-pr,review-memorymodel: opus,context: forkimplement-issue,e2e-devicemodel: sonnet,context: forkfile-issue,cut-releasemodel: sonnet, no forkwork-issue,architecture,writing-changelog,writing-user-docsfile-issueinterviews a person, andcut-releasewaits for an explicit yes. Both need the conversation, so they stay inline: their model applies when typed as a slash command, and they run on the caller's model when loaded through the Skill tool.work-issueruns on the model the person starts it with. The three writing and rule skills load inside other stages, so they must not change that stage's model.work-issuedelegates each stage by invoking its skill with the Skill tool and passing the issue, the branch and the task as arguments. It stops starting a general-purpose agent that then loads the skill. A forked skill starts without the conversation, so the arguments must carry everything the stage needs.The Skills table in
AGENTS.mdgains a Model column and a Forked column, which are the one list to edit when the mapping changes.Constraints and non-goals
opus,sonnet), not dated model IDs, so the mapping follows new releases without edits.work-issuenever passes a model override. A model given when starting a subagent wins over the skill's model, which would undo this change.availableModelsexcludes a declared model, Claude Code silently falls back to the session model. That is acceptable and needs no handling.work-issue's delegation mechanics.How we know it is done
AGENTS.md's Skills table has Model and Forked columns matching the frontmatter.model:orcontext:disagrees withAGENTS.md, or when a skill in.claude/skills/is missing from the table.work-issueinvokes each stage's skill with the Skill tool and arguments, and still receives that skill's report block.claude -p … --output-format json, whosemodelUsagelists the models used) proving these routes:review-prthrough the Skill tool runs it on Opus.implement-issuethrough the Skill tool runs it on Sonnet.Alternatives considered
model:alone in each skill: ignored whenever the skill is loaded through the Skill tool, so it never applies towork-issue's stages..claude/agents/<stage>.mdper stage with its model: works for delegated runs, but a typed/review-pralso needs an inlinemodel:, so each stage's model would live in two places.work-issuenaming the model in each delegation: a skill run on its own would get no model.