Workflow tool: expose `effort` in agent() options (today you must create subagents just to pin effort)
Summary
The Workflow tool's agent(prompt, opts) lets you pick a model per stage (opts.model) but has no way to set the reasoning effort for that stage. Effort is the primary cost/quality dial on Opus 4.8 / Fable 5, so per-stage effort control is exactly what you want when orchestrating a multi-stage workflow — yet it's the one knob missing.
Current behavior
agent() options are label, phase, schema, model, isolation, agentType — no effort. Stages appear to inherit the session effort, with no per-stage override.
Why it matters
We assign models per stage to optimize cost (e.g. a cheap model for a throwaway head-capture stage, the strongest model for the final judge). Effort is the other half of that tradeoff: a verify/judge stage wants xhigh/max, a mechanical stage wants low. Without per-stage effort, we either over-spend on cheap stages or under-think on hard ones.
Workaround we resorted to
We created near-empty custom subagents in ~/.claude/agents/ whose only purpose is to pin a model + effort (e.g. fable-xhigh.md with model: fable + effort: xhigh in frontmatter), then route stages via agent(prompt, { agentType: 'fable-xhigh' }). It works — we verified it (same model + byte-identical prompt, opus-max vs opus-low gave 7432 vs 4368 output tokens, the only difference being the effort field). But it has real downsides:
- Agent-file proliferation: one throwaway file per model×effort combination, cluttering the global agents registry, when this should be a single option.
- No mid-session registration: the agent registry is cached at session start, so a newly-created pin agent isn't usable until a full restart — painful when iterating on a workflow. (Filed separately.)
- Conflates two concerns:
agentTypealso carries a prompt/tools/description; using it purely to set effort is a hack, and you can't cleanly combine "this stage's real agent definition" with "but at xhigh effort."
Proposed
Add effort to agent() options, accepting low | medium | high | xhigh | max:
agent(judgePrompt, { model: 'fable', effort: 'xhigh', schema: VERDICT })
Orthogonal to model (and to agentType, so you could override a custom agent's effort per call).
Related (minor)
There's also no way to observe the effort a stage ran at — it's not in the Console Logs, the transcript, /usage, or /status. We could only confirm it indirectly via output-token differences. Surfacing the effective effort somewhere would make per-stage routing verifiable.
This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗