Sonnet 4.6 came out on Tuesday.
Opus 4.5 performance at Sonnet prices. Same $3/$15 per million tokens. If you're running agent teams, you can use Opus for the lead and Sonnet 4.6 for the workers instead of running Opus everywhere.
Now for the thing I actually want to talk about.
I took a deep dive into agent teams
I spent the last week running agent teams and watching the filesystem while they worked. I wanted to know how the coordination actually works. Not the docs version, the real version.
The full technical reference is here: Claude Code Agent Teams: How They Work Under the Hood
Here's what I found.
The whole system is JSON files on disk. No database, no Redis, no message broker. Team config sits in ~/.claude/teams/{team-name}/config.json. The task queue is individual JSON files in ~/.claude/tasks/{team-name}/. Agent inboxes are JSON arrays in ~/.claude/teams/{team-name}/inboxes/.
You can watch the system work in real time. Open a second terminal while agent teams are running and try this:
# see your team's config and members
cat ~/.claude/teams/*/config.json | python3 -m json.tool
# watch tasks get created and claimed
ls -la ~/.claude/tasks/*/
# read an agent's inbox
cat ~/.claude/teams/*/inboxes/*.json | python3 -m json.toolI kept a terminal open with watch -n 1 'ls -la ~/.claude/tasks/*/' and watched task files appear, get claimed by agents, and flip to completed. Weirdly satisfying.
There are two different multi-agent systems and they cost different amounts. Subagents (the Task tool) are ephemeral. They run, return a result, and they're gone. Agent teams are persistent sessions that idle, wake up when messaged, and coordinate through a shared task queue. Teams use roughly 2x the tokens for the same number of agents because each teammate maintains its own context window across multiple wake cycles and the idle/wake heartbeat adds overhead.
So if you just need to search three directories in parallel, subagents are fine. If you need agents that talk to each other and pick up work from a shared queue, use teams.
Agents can't hear each other unless they call SendMessage. This tripped me up. When an agent types "I'm done with the auth module" in its response, nobody sees it. The system prompt tells every agent: "Your plain text output is NOT visible to the team lead or other teammates. To communicate with anyone on your team, you MUST use this tool." Every message between agents goes through JSON inbox files.
When an agent finishes a turn, it goes idle and starts pinging. Idle notifications come every 2-4 seconds. They tell the team lead "I'm free for work" and double as a heartbeat. If the pings stop, the agent probably crashed.
This explains the orphaned agents problem. When a team lead crashes, workers keep pinging, but nobody's listening.
Task dependencies are computed on the fly, not stored. When task 1 finishes, the system doesn't update task 2's file to say "you're unblocked now." Every time an agent calls TaskList, the system reads all the task files, checks which are completed, and figures out what's available. The blockedBy field never changes. It's evaluated fresh every time.
You can debug dependency problems by reading the JSON directly:
# see which tasks are blocked and by what
python3 -c "
import json, glob
for f in sorted(glob.glob('$HOME/.claude/tasks/*/*.json')):
if f.endswith('.json') and not f.endswith('.lock'):
t = json.load(open(f))
if t.get('blockedBy'):
print(f'{t["id"]}: {t["subject"]} — blocked by {t["blockedBy"]}, status: {t["status"]}')
"The full post covers the message protocol, shutdown handshake, plan approval flow, and pseudocode for building your own orchestration. Read it here.
The memes
That's the week. If you try those filesystem commands while agent teams are running and find something I missed, reply and tell me.
Abhishek
