Part of the AI Coding Harness Guide — environment design for coding agents in production.

Claude Code subagentStatusLine Stopped Working in 2.1.323#

Published by

Claude Code 2.1.323 removed the subagentStatusLine setting. Settings files that hold the key still load, but its command never runs, so every subagent row shows the default name and activity. To keep custom rows, install 2.1.322 and turn off auto-update. To keep the data, read subagent transcripts from your main statusLine command.[1]

What changed in 2.1.323#

The 2.1.323 release notes say: "Removed the subagentStatusLine setting: subagent rows always use the default look, and settings files that still hold the key load as before." The settings schema now describes the key as "Deprecated: no longer has any effect. Subagent rows always use the default look." Claude Code shows no warning at startup.[1]

A row such as ○ 8% 82.6K/1.0M │flights:foreman│opus·medium│running 5m:40s became flights:foreman Running grep. The default row has no model, effort, context use or cost for each agent. A command that printed empty content to hide the built-in rows also stops working, so those rows come back.[2]

2.1.325, the newest release on 2026-11-14, keeps the same behavior. Its schema text for the key is unchanged.

Why it was removed, and what comes next#

In issue #109446, a Claude Code maintainer said the setting was removed because a plugin's own settings.json supports only two keys, subagentStatusLine among them, which did not fit the plugin model. The same comment says the removal should have had a grace period, that work had started to add one in the next release, and that the plan is to move custom agent rows to mods. The issue reached 32 reactions within a day of being opened on 2026-11-13.[2]

Until a release note says the grace period shipped, treat the setting as gone.

Option 1: stay on 2.1.322#

2.1.322 is the last release that runs the command. Install it and stop background updates:

claude install 2.1.322
{
  "env": {
    "DISABLE_AUTOUPDATER": "1"
  }
}

DISABLE_AUTOUPDATER stops background updates only, so claude update still moves you to the newest release. Remove the variable when a release brings the setting back or a replacement arrives. You also miss every fix after 2.1.322, including the 2.1.325 fix for subagents moved to the plan-mode model under opusplan. More controls are in the install and update guide.

Option 2: show subagents in the main status line#

The main statusLine command still runs, and its JSON input has transcript_path, the session transcript at ~/.claude/projects/<project>/<session-id>.jsonl. Each subagent of that session writes two files next to it, in <session-id>/subagents/:

FileHolds
agent-<id>.jsonlThe agent's transcript. Each assistant entry has message.model and message.usage (input, cache read, cache write and output tokens).
agent-<id>.meta.jsonagentType, description, requestShape (for example background) and finished.

This script prints one segment for each subagent: its type, model, current context in thousands of tokens, and whether it is done:

#!/usr/bin/env python3
# ~/.claude/agents-status.py
import json, sys, glob, os
data = json.load(sys.stdin)
session_dir = os.path.splitext(data["transcript_path"])[0]
parts = []
for meta_path in sorted(glob.glob(os.path.join(session_dir, "subagents", "*.meta.json"))):
    meta = json.load(open(meta_path))
    usage, model = None, "?"
    for line in open(meta_path.replace(".meta.json", ".jsonl")):
        entry = json.loads(line)
        msg = entry.get("message") or {}
        if entry.get("type") == "assistant" and msg.get("usage"):
            usage, model = msg["usage"], msg.get("model", "?")
    ctx = 0 if usage is None else usage["input_tokens"] + usage["cache_read_input_tokens"] + usage["cache_creation_input_tokens"]
    state = "done" if meta.get("finished") else "running"
    parts.append(f'{meta.get("agentType", "agent")} {model.replace("claude-", "")} {ctx // 1000}K {state}')
print(" │ ".join(parts) or "no subagents")

It prints, for example, general-purpose fable-5-2 95K done. Point statusLine at it, with refreshInterval so the line updates while the main session waits on background agents:

{
  "statusLine": {
    "type": "command",
    "command": "python3 ~/.claude/agents-status.py",
    "refreshInterval": 5
  }
}

The limits: it is one line, not one row per agent; it cannot hide the built-in rows; and the transcript layout is not documented, so a release can change it. Reading a long transcript on every refresh is slow, so cache by file size if your agents run for hours.

Timeline#

VersionPublishedChange
v2.1.1132026-04-17subagentStatusLine is already present.
v2.1.2142026-07-18Reasoning effort added to the payload, so rows can show model and effort.
v2.1.2932026-10-07agentType added to the payload.
v2.1.3192026-11-06$ substituted in a plugin-provided command.
v2.1.3222026-11-10Last release that runs the command.
v2.1.3232026-11-12Setting removed. The key loads but has no effect.
v2.1.3252026-11-13Still removed.

Should you downgrade?#

Stay on 2.1.322 if per-agent rows are how you watch cost and context in sessions with several background agents, and you can go a week or two without newer fixes. Move to option 2 if you only need the numbers, not one row per agent. If you used the setting only to hide built-in rows, there is no workaround on 2.1.323 or later.


FAQ#

Q: Why did my subagentStatusLine stop working?

A: Claude Code 2.1.323 removed the setting. The key still loads without an error, but the command never runs and subagent rows use the default look.

Q: Which version removed subagentStatusLine?

A: v2.1.323, published 2026-11-12. v2.1.322 is the last release that runs it.

Q: Is there a replacement for subagentStatusLine?

A: Not in 2.1.325. A maintainer said in issue #109446 that a grace period would come in a following release and that custom agent rows will move to mods.

Q: How do I get subagentStatusLine back?

A: Run claude install 2.1.322 and set DISABLE_AUTOUPDATER=1 in the env block of ~/.claude/settings.json.

Q: Can the main statusLine show subagent model and context?

A: Yes, as one line. Its input has transcript_path, and each subagent's transcript and metadata are in <session-id>/subagents/ next to that file.

Q: How do I hide the subagent rows under the prompt?

A: On 2.1.323 or later you cannot. On 2.1.322, a subagentStatusLine command that prints empty content hides them.


Sources: [1] Claude Code changelog, v2.1.323 | [2] anthropics/claude-code issue #109446

Related: Install and update Claude Code | Background agent labels and CLAUDE_CODE_FORK_SUBAGENT=0 | Claude Code v2.1.215 analysis | Claude Code versions

Get the weekly digest

New Claude Code, Codex, Gemini CLI and OpenCode guides and release analyses, once a week, plus occasional notes.

One email a week plus occasional notes. Confirm by email; unsubscribe from any issue. Privacy