Add per-call `effort` to the Task/Agent tool

Status Closed — duplicate
Reported on v2.1.233
Maintainer reply None cached
Activity 1 comment · opened Aug 17, 2026 · closed Aug 20, 2026

Following #64706 (per-agent effort: frontmatter, confirmed working on 2.1.233): there is still no way to set effort per spawn. The Task/Agent tool accepts subagent_type and model, but not effort.

So effort can only be varied by pre-declaring an agent type for each level. A subagent spawned as general-purpose always inherits the session's effort.

Why this matters

In a long orchestration run, effort should track the task, not a pre-declared role. Root-cause diagnosis against a database wants xhigh; running a formatter or reaping stray processes wants low. Today that means maintaining near-duplicate agent definitions differing in a single frontmatter line — and it cannot respond to what the orchestrator learns mid-run.

Concretely: I was orchestrating a long debugging campaign with ~10 concurrent subagents. Diagnosis agents (reading SQLite ledgers, tracing defects to file:line) and mechanical agents (formatting, lint cleanup, killing stray fixture processes) were all spawned as general-purpose and therefore all ran at the session's effort. There was no way to raise the former or lower the latter without declaring an agent type per tier up front.

Measurement context

From my own testing on 2.1.223 (thread) — these numbers predate 2.1.233 and I have not re-measured them on it:

Subagent thinking is only visible with --forward-subagent-text. Without it you see only the parent's thinking blocks, which looks like evidence that subagents don't think at all:

P="Spawn one Explore subagent and have it reason step by step about what 17*23 is."

claude -p --output-format stream-json --verbose --forward-subagent-text \
  --settings '{"env":{"MAX_THINKING_TOKENS":"16000"}}' -- "$P" > on.json

claude -p --output-format stream-json --verbose --forward-subagent-text -- "$P" > off.json

Then bucket the thinking blocks by emitter:

for f in on off; do
  echo "== $f =="
  jq -r 'select((.message.content//[])|map(.type)|index("thinking"))
    | (if .parent_tool_use_id then "SUBAGENT" else "PARENT" end)' $f.json | sort | uniq -c
done

== on ==
  2 PARENT
  1 SUBAGENT
== off ==
  (nothing)

Fan-out overhead is roughly fixed: ~10s flat for the fan-out, ~5s flat for thinking. Three trivial greps, one run each:

  • sequential 7s / fan-out 17s (thinking off)
  • sequential 12s / fan-out 23s (thinking on)

Since the overhead is fixed, fan-out only pays once the work is bigger than it — which is exactly why per-call effort control is valuable for the cheap probes, where you want it low or off.

Request

Add an optional effort parameter to the Task/Agent tool, overriding both the agent definition and the session level.

Note that Workflow's agent() does accept effort per call. The asymmetry between the two spawn paths is the actual gap here.

Versions: the missing effort parameter on the Task/Agent tool is observed on 2.1.233. The timing and thinking-block measurements above were taken on 2.1.223 and have not been re-run since.

View original on GitHub ↗

This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗