Claude Code Subagents vs Agent Teams: A Better Default for Sequential Workflows A developer documented that Claude Code custom subagents, defined as Markdown files under `.claude/agents/`, are a better default than agent teams for sequential workflows, since subagents run as isolated role-scoped personas that main Claude orchestrates one after another. The developer replaced a prompt-based two-agent team (an Opus planner and a Sonnet implementer) with version-controlled `planner.md` and `implementer.md` files plus a `/task` slash command, and runs the pair automatically inside a GitHub Action. The stated decision rule: use a team only when agents must converse while both are alive. .claude/agents/ .md define a role: tools, model, system prompt, skills. SendMessage each other while both are alive. planner.md , implementer.md and a /task slash command I use instead — and how I run them automatically inside a GitHub Action for a client project. A custom subagent in Claude Code is a Markdown file under .claude/agents/ that defines a role: which tools the agent can call, which model it runs on, its system prompt, and which skills it has access to. Main Claude can spawn it as a child task, hand it work, and read its final output back into the parent context. Subagents are personas. Each invocation gets a fresh context, scoped by the role you defined. They don't share state with each other and they don't talk to each other. This is the bit I got wrong for months. I'd been treating "agent teams" and "custom subagents" as two ways to do the same thing. They aren't. They're orthogonal primitives. A team uses subagents as the role each member plays. Subagents work fine without ever being in a team. The decision rule that finally clicked for me: reach for a team only when agents need to converse while both are alive . If your workflow is sequential — agent A produces output, you or main Claude approve it, then agent B starts — you don't need a team. Main Claude is already the orchestrator. It can spawn one subagent, read the output, then spawn the next. Whenever a task felt like it needed more than one agent, I'd send Claude something like this: Create an agent team for the following task: Before creating an agent team ask me questions if anything is unclear. Spawn two teammates: 1. Planner name: "planner" - Model: Opus - Mode: Default - Role: Analyze the codebase and produce a detailed implementation plan with file-level changes. Flag ambiguities or risks. Output the plan as a structured message. 2. Implementer name: "implementer" - Model: Sonnet - Mode: Default - Role: Implement the approved plan step by step. After 2 failed fix attempts on the same issue, report the blocker to the lead. Coordination: - Create tasks with dependencies: implementer is blocked until planner's plan is approved. - The planner's plan requires approval from both you the lead and me before the implementer starts. Figma: ... This worked. It also did three things I didn't actually need: The role definitions weren't version-controlled. The skill list wasn't tied to the agent. The whole thing lived in my prompt history. Same workflow, expressed as two .claude/agents/ .md files and a /task slash command that orchestrates them. The role definitions live in the repo, get version-controlled, and carry their tool and skill lists with them. --- name: planner description: "Analyzes the codebase and produces a detailed file-level implementation plan for a given task. Flags ambiguities and risks." model: opus color: pink tools: Read, Glob, Grep, Bash, WebFetch, WebSearch, Skill, TaskCreate, TaskGet, mcp figma skills: flutter-apply-architecture-best-practices, flutter-build-responsive-layout, flutter-fix-layout-issues, flutter-implement-json-serialization, flutter-use-http-package, flutter-add-widget-test, flutter-accessibility-audit --- You are the Planner. Your job is to produce a detailed, file-level implementation plan for given task — nothing more. What you do 1. If the task contains Figma links, fetch the design first — before anything else. Extract every relevant design detail: layout, spacing, colors, typography, component structure, text content labels, button text, headings, body copy , icons, images, and interactive states. Do not draft the plan or list open questions until the design has been fully read — many "questions" answer themselves once you see the file. 2. Read the relevant existing code so the plan is grounded in the real codebase, not assumptions. 3. Produce a structured plan covering: - Goal : one-paragraph restatement of the task. - Files to change : every file you expect to touch, listed at the function/class/method level with the specific change and the reason. - Files to add : new files with their purpose and approximate shape key classes, public API . - Test plan : which tests to add or update. - Risks & ambiguities : anything that could go wrong. - Open questions for the lead : things that must be resolved before the implementer starts. 4. Be honest about uncertainty. If you are unsure, list it as an ambiguity with options — do not guess. What you do NOT do - Do not modify files. You have no Edit/Write tools by design. - Do not implement the work. Your output is the plan only. - Do not pad the plan with restatements of project conventions the lead already knows. Focus on what is specific to this task. Output format Return one structured message in this shape: Plan: