Claude Code Agent Progress Summaries

Canonical version: Claude Code Agent Progress Summaries.

Agent progress summaries are the short status lines (3 to 5 words, like "Running the test suite") that Claude Code shows next to each background agent in the agents panel. To write each line, Claude Code sends the agent's full transcript to the agent's own model, usually Opus, about every 30 seconds per agent. That's a lot of tokens for three words.

It was found in late October 2026 by Flamerix AI, who published the analysis and a workaround as a GitHub gist. The Hacker News thread (589 points, 236 comments) made it a bigger story.

How it works

  • Internal name: query_source = agent_summary in Claude Code's OpenTelemetry claude_code.api_request events. That's how it was spotted: grouping requests by query_source
  • The timer comes from a server flag per model family, clamped between 30 and 240 seconds. The default is the 30-second minimum
  • Each call is a temporary fork of the agent's conversation, so about 98% of the calls read the transcript from the prompt cache. The ~2% that hit a cold cache carry more than a third of the cost
  • A cheaper short mode (about 2K tokens of notes, optionally on a smaller model) exists since v2.1.310, but it's switched off

History: the code appeared in v2.1.32 (February 2026), became an SDK opt-in in v2.1.72, reached the interactive CLI in v2.1.117, and has been on by default for interactive background agents since v2.1.232 (August 2026).

When it fires

  • Interactive background agents: on by default
  • Fork subagents and forked skills: always summarized, also through the SDK (it shows up as a task_progress event)
  • Headless claude -p: off unless you set CLAUDE_CODE_AGENT_PROGRESS_SUMMARIES=1
  • Workflows: one HN tester (jakozaur) found it affects subagents but not workflows

The row summaries in Claude Code Agent View are a different mechanism: the docs describe a Haiku-class model refreshing every few minutes.

What it costs

The numbers vary a lot with the workload, so read them as a range:

  • Flamerix AI, one week before the hook: 16.4% of all Claude Code spend (the main conversation was 15.7%), 19.7% of all API requests, 96% of it on Opus, about 9,000 input tokens per output token
  • Their weekly share grew from 3.5-7% in July to about 16% by mid-October 2026
  • GitHub issue #86879 collects four independent measurements between 18% and 26%
  • A replay over a week of one user's transcripts gave about 8% of list-price spend, and jakozaur measured "~8% at most" in his sessions

These figures are Claude Code's own per-request cost estimates, not invoices. On a subscription you don't pay more money; you burn through your 5-hour and weekly limits faster.

How to turn it off

There is no supported switch. None of these work:

  • "awaySummaryEnabled": false only turns off the "welcome back" recap
  • The SDK option agentProgressSummaries and CLAUDE_CODE_AGENT_PROGRESS_SUMMARIES can only turn summaries on
  • CLAUDE_CODE_FORK_SUBAGENT=0 and CLAUDE_CODE_DISABLE_BACKGROUND_TASKS=1 do stop it, but they also remove fork subagents or background agents

The gist ships no-agent-summary.js, a Bun preload script (MIT). Claude Code ships as Bun bytecode, so patching its JavaScript changes nothing. Instead, the script wraps the global setTimeout and returns an inert timer when the callback's source contains "[AgentSummary] Timer fired" or "agent_summary". You load it with BUN_OPTIONS="--preload=$HOME/.local/share/no-agent-summary.js" (the = form matters; with a space, every bun subcommand breaks) and restart the daemon with claude daemon stop --any.

The trade-offs: the agent status line stops updating, and the hook fails open. If Anthropic renames the strings or moves the timer, it silently stops working, so check its log after each update. On Windows, the original gate didn't match and needed a fix from the comments.

Caveats

  • The gist claims the summary "never reaches the model or your conversation". A commenter showed that's too strong: an accepted summary can end up in task.progress.summary and later in API-bound context. Nobody showed that disabling it causes a regression, though
  • The headline 16% is one user's workload. Heavy background-agent users pay more, people who rarely run background agents pay close to nothing

My take

The feature isn't absurd: a live status per agent is useful when you run several at once. What bothers me is the default. Sending a full transcript to Opus every 30 seconds to produce three words, with a cheaper mode already written but switched off, and no way to opt out, is the wrong trade for the user. It's a small example of a bigger point raised in the thread: when the same company makes the model and the harness, nobody has a strong reason to save your tokens.

I run a lot of background agents, so this is worth measuring in my own setup before patching anything. The OpenTelemetry export grouped by query_source is the reliable way to know. And the lesson goes beyond this feature: "hidden" model calls are a line item in AI Cost Management, and only telemetry shows them.

References


About Sébastien

Ready to get to the next level?

Found this valuable? Share it with someone who needs it.

Join 6,000+ readers. Get practical systems for knowledge & AI. Free.

Subscribe ✨

Free: Knowledge System Checklist

A clear roadmap to building your own knowledge system. Subscribe and get it straight to your inbox.

6,000+ readers. No spam. Unsubscribe anytime.

Subscribe