# Agent Subagent Map Diagrams Reference
## Table of Contents
- [Purpose and Context](#purpose-and-context)
- [Fundamental Structure Rules](#fundamental-structure-rules)
- [Node Types and Agent Script Elements](#node-types-and-agent-script-elements)
- [Subagent Map Patterns](#subagent-map-patterns)
- [Complete Example: Local_Info_Agent](#complete-example-local_info_agent)
- [Validation Checklist](#validation-checklist)
- [Anti-patterns](#anti-patterns)
---
## Purpose and Context
A Subagent Map diagram is a Mermaid flowchart that visualizes an agent's subagent graph structure. It shows the architecture of an agent before implementation, displaying:
- The start_agent agent_router entry point
- All subagents in the agent
- Subagent transitions and routing logic
- Action calls within subagents (with backing type: Apex, Prompt Template, Flow)
- Gating conditions (available_when expressions)
- Variable state changes
- Escalation and off-topic handling
- Conditional instructions based on variable values
Subagent Map diagrams are the primary visual deliverable in an Agent Spec (design document) and serve both specification and comprehension purposes.
---
## Fundamental Structure Rules
### Graph Orientation
- ALWAYS use `graph TD` (Top-Down orientation)
- Start with start_agent agent_router at the top
- Subagents flow downward from the router
- Never use other orientations
### Node Identification
- Use sequential capital letters (A, B, C, ...) for node IDs
- Start with `A` for start_agent
- Increment sequentially through subagents and decisions
- Use descriptive labels within brackets
### Flow Direction
- Primary flow moves top-to-bottom
- Use `-->` for standard transitions
- Label decision branches with `|Label|` syntax
- Separate paths for different subagents
---
## Node Types and Agent Script Elements
### Start Agent Subagent Router Node
Format: `[start_agent
agent_router]`
Represents the entry point where user input is evaluated and routed to appropriate subagents.
```mermaid
%%{init: {'theme':'neutral'}}%%
graph TD
A[start_agent
agent_router]
```
### Subagent Nodes
Format: `[subagent_name
Subagent]`
Represents a subagent within the agent.
```mermaid
%%{init: {'theme':'neutral'}}%%
graph TD
A[start_agent
agent_router]
B[order_status
Subagent]
C[billing
Subagent]
```
### Action Call Nodes
Format: `[Call action_name
backing: Type]`
Backing types: Apex, Prompt Template, Flow
Example: `[Call check_weather
backing: Apex]`
```mermaid
%%{init: {'theme':'neutral'}}%%
graph TD
A[local_weather
Subagent] --> B[Call check_weather
backing: Apex]
```
### Decision/Gating Nodes
Use curly braces `{}` for conditions. Common formats:
- Variable availability gates: `{Check: variable_name != empty?}`
- Conditional instructions: `{variable_name == value?}`
- Subagent transition logic: `{user_intent matches?}`
```mermaid
%%{init: {'theme':'neutral'}}%%
graph TD
A[subagent
Subagent] --> B{Check: guest_interests
!= empty?}
B -->|Yes| C[Call collect_events
backing: Prompt Template]
B -->|No| D[Ask for clarification]
```
### Variable State Change Nodes
Format: `[Set variable_name = value]`
Shows state modifications that affect downstream behavior.
```mermaid
%%{init: {'theme':'neutral'}}%%
graph TD
A[Call action] --> B[Set reservation_required
= true]
```
### Utility Call Nodes
Format: `[Call @utils.name]`
For escalation and system utilities.
```mermaid
%%{init: {'theme':'neutral'}}%%
graph TD
A[escalation
Subagent] --> B[Call @utils.escalate]
```
---
## Subagent Map Patterns
### Basic Subagent with Single Action
```mermaid
%%{init: {'theme':'neutral'}}%%
graph TD
A[start_agent
agent_router]
A -->|route to subagent| B[simple_subagent
Subagent]
B --> C[Call do_action
backing: Apex]
C --> D[Continue]
```
### Subagent with Gating Condition
Available_when expressions prevent action execution until conditions are met.
```mermaid
%%{init: {'theme':'neutral'}}%%
graph TD
A[subagent_with_gate
Subagent]
A --> B{Check: required_var
!= empty?}
B -->|No| C[Instruction: collect info first]
B -->|Yes| D[Call action
backing: Prompt Template]
C --> E[Wait for input]
E --> A
```
### Subagent with Conditional Instructions
Variable values control which instructions apply to a subagent.
```mermaid
%%{init: {'theme':'neutral'}}%%
graph TD
A[Call process_request
backing: Flow]
A --> B[Set status_flag = complete]
B --> C{Check: status_flag
== complete?}
C -->|Yes| D[Apply conditional
instructions]
D --> E[Continue]
```
### Subagent Transitions
When logic determines a new subagent should be active.
```mermaid
%%{init: {'theme':'neutral'}}%%
graph TD
A[current_subagent
Subagent]
A --> B{Transition
condition?}
B -->|Yes| C[Transition to
next_subagent]
C --> D[next_subagent
Subagent]
B -->|No| E[Continue in
current_subagent]
```
### Off-Topic and Escalation Routing
How the agent handles out-of-scope requests.
```mermaid
%%{init: {'theme':'neutral'}}%%
graph TD
A[start_agent
agent_router]
A -->|out of scope| B[off_topic
Subagent]
A -->|needs help| C[escalation
Subagent]
B --> D[Instruction: redirect user]
C --> E[Call @utils.escalate]
```
---
## Complete Example: Local_Info_Agent
This example demonstrates a complete Subagent Map for a guest information agent with multiple subagents, gating conditions, variable state, and escalation handling.
```mermaid
%%{init: {'theme':'neutral'}}%%
graph TD
A[start_agent
agent_router]
A -->|weather query| B[local_weather
Subagent]
A -->|events query| C[local_events
Subagent]
A -->|hours query| D[resort_hours
Subagent]
A -->|unclear intent| E[ambiguous_question
Subagent]
A -->|out of scope| F[off_topic
Subagent]
A -->|needs escalation| G[escalation
Subagent]
B --> B1[Call check_weather
backing: Apex]
B1 --> B2[Continue]
C --> C1{Check: guest_interests
!= empty?}
C1 -->|No| C2[Instruction: collect guest interests]
C1 -->|Yes| C3[Call check_events
backing: Prompt Template]
C2 --> C4[Pause for input]
C4 --> C
C3 --> C5[Continue]
D --> D1[Call get_resort_hours
backing: Flow]
D1 --> D2[Set reservation_required
= true]
D2 --> D3{Check: reservation_required
== true?}
D3 -->|Yes| D4[Apply booking instructions]
D3 -->|No| D5[Apply standard instructions]
D4 --> D6[Continue]
D5 --> D6
E --> E1[Instruction: ask for clarification]
E1 --> E2[Await user input]
E2 --> A
F --> F1[Instruction: explain available subagents]
F1 --> F2[Continue]
G --> G1[Call @utils.escalate]
G1 --> G2[Continue]
```
### Subagent Descriptions
**local_weather**: Provides weather information via Apex-backed action. No preconditions.
**local_events**: Requires guest_interests variable to be populated (gating: `available_when guest_interests != ""`). Calls Prompt Template-backed action only when gate is satisfied.
**resort_hours**: Calls Flow-backed action that sets reservation_required variable. Conditional instructions applied based on variable state: booking-specific guidance when true, standard guidance when false.
**ambiguous_question**: No actions. Requests clarification and routes back to start_agent.
**off_topic**: No actions. Explains available subagents and continues conversation.
**escalation**: Calls @utils.escalate utility to route to human agent.
**start_agent agent_router**: Routes incoming user input to appropriate subagents based on intent.
---
## Validation Checklist
Before finalizing a Subagent Map diagram:
- [ ] Uses `graph TD` syntax
- [ ] Starts with `%%{init: {'theme':'neutral'}}%%`
- [ ] start_agent agent_router is node A at top
- [ ] Nodes use sequential capital letter IDs
- [ ] All subagents labeled with `[subagent_name
Subagent]` format
- [ ] Action calls include backing type (Apex, Prompt Template, Flow)
- [ ] Gating conditions shown as decision nodes with `{Check: ...?}` format
- [ ] Variable state changes explicitly labeled with `[Set variable = value]`
- [ ] Escalation uses `[Call @utils.escalate]` format
- [ ] All transition branches are labeled
- [ ] Diagram fits in 20-30 nodes
- [ ] Subagent routing from start_agent is clear
- [ ] Off-topic and escalation paths are visible
- [ ] Conditional instruction logic is shown
---
## Anti-patterns
### Don't
- Use `graph LR` or other orientations instead of `graph TD`
- Place start_agent anywhere except top (node A)
- Label actions without backing type information
- Use ambiguous decision node labels (avoid `{Process?}`)
- Hide gating conditions in node descriptions instead of showing as decisions
- Omit variable state changes that affect downstream behavior
- Create subagent routing without labels on the decision logic
- Mix subagent nodes with action nodes at same level without clear containment
- Use custom color styling (breaks in dark mode)
- Leave off-topic and escalation paths out of diagram
### Do
- Keep start_agent agent_router at the top
- Show all subagents reachable from start_agent
- Include backing type for every action call
- Make gating conditions explicit as decision nodes
- Show variable updates as separate nodes when they affect logic flow
- Label all transition branches
- Include off-topic and escalation subagents
- Show conditional instructions with decision nodes
- Use `%%{init: {'theme':'neutral'}}%%` for light/dark mode compatibility
- Focus diagram on subagent structure, not detailed action logic