---
title: "Claude Code — Architecture Internals Diagrams"
description: "Master loop, tool categories, system prompt assembly, sub-agent isolation"
tags: [architecture, internals, master-loop, tools]
---
# Architecture Internals
What happens under the hood when Claude Code runs.
---
### The Master Loop
Claude Code's core execution is two nested loops: an **inner agent loop** that keeps calling the API as long as tool calls are returned, and an **outer conversation loop** that starts a new turn when the user responds.
```mermaid
flowchart TD
A([User Input]) --> B(Build System Prompt
+ context + tools)
B --> C
subgraph AGENT_LOOP["Agent Loop — repeats until no tool calls"]
C{{Claude API Call}} --> D{Response
contains tool calls?}
D -->|Yes| E(Execute tools in parallel
Glob, Grep, Bash...)
E --> F(Append tool results
to conversation)
F --> C
end
D -->|No| H(Extract text response)
H --> I([Display to User])
I --> J{User sends
next message?}
J -->|Yes| B
J -->|No| K([Session ends])
style A fill:#F5E6D3,color:#333
style C fill:#E87E2F,color:#fff
style D fill:#E87E2F,color:#fff
style E fill:#6DB3F2,color:#fff
style F fill:#6DB3F2,color:#fff
style I fill:#7BC47F,color:#333
style J fill:#E87E2F,color:#fff
style K fill:#B8B8B8,color:#333
click A href "https://github.com/FlorianBruniaux/claude-code-ultimate-guide/blob/main/guide/ultimate-guide.md#12-first-workflow" "User Input"
click B href "https://github.com/FlorianBruniaux/claude-code-ultimate-guide/blob/main/guide/core/architecture.md#1-the-master-loop" "Build System Prompt"
click C href "https://github.com/FlorianBruniaux/claude-code-ultimate-guide/blob/main/guide/core/architecture.md#1-the-master-loop" "Claude API Call"
click D href "https://github.com/FlorianBruniaux/claude-code-ultimate-guide/blob/main/guide/core/architecture.md#1-the-master-loop" "Response contains tool calls?"
click E href "https://github.com/FlorianBruniaux/claude-code-ultimate-guide/blob/main/guide/core/architecture.md#2-the-tool-arsenal" "Execute tools in parallel"
click F href "https://github.com/FlorianBruniaux/claude-code-ultimate-guide/blob/main/guide/core/architecture.md#1-the-master-loop" "Append tool results"
click H href "https://github.com/FlorianBruniaux/claude-code-ultimate-guide/blob/main/guide/core/architecture.md#1-the-master-loop" "Extract text response"
click I href "https://github.com/FlorianBruniaux/claude-code-ultimate-guide/blob/main/guide/ultimate-guide.md#12-first-workflow" "Display to User"
click J href "https://github.com/FlorianBruniaux/claude-code-ultimate-guide/blob/main/guide/core/architecture.md#1-the-master-loop" "User sends next message?"
click K href "https://github.com/FlorianBruniaux/claude-code-ultimate-guide/blob/main/guide/core/architecture.md#1-the-master-loop" "Session ends"
```
ASCII version
```
User Input
│
Build prompt (system + context + tools)
│
┌── Agent Loop ──────────────────────┐
│ Claude API ◄────────────────────┐ │
│ │ │ │
│ Tool calls? │ │
│ ├─ Yes → Execute tools ────────┘ │
│ └─ No → exit loop │
└────────────────────────────────────┘
│
Display response
│
User next msg? ──► Yes → rebuild prompt → loop
└─ No → Session ends
```
> **Source**: [Architecture: Master Loop](../core/architecture.md#master-loop) — Line ~72
>
> *Source-confirmed (2026-03-31): Inner loop is `queryLoop()` async generator. Tools execute via `StreamingToolExecutor` (up to 10 concurrent). Loop exits via one of 10 terminal reasons (`completed`, `max_turns`, `aborted_tools`, etc.).*
---
### Tool Categories & Selection
Claude Code has 6 tool categories, each optimized for different operations. Understanding which tool Claude chooses (and why) helps you write instructions that guide better tool selection.
```mermaid
flowchart TD
ROOT["Claude Code Tools"] --> READ
ROOT --> WRITE
ROOT --> EXECUTE
ROOT --> WEB
ROOT --> WORKFLOW
ROOT --> CONTROL
subgraph READ["📖 Read Tools"]
R1[Glob
Find files by pattern]
R2[Grep
Search file content]
R3[Read
Read file content]
R4[LS
List directory]
end
subgraph WRITE["✏️ Write Tools"]
W1[Write
Create new file]
W2[Edit
Modify existing file]
W3[MultiEdit
Batch modifications]
end
subgraph EXECUTE["⚙️ Execute Tools"]
E1[Bash
Shell commands]
E2[Task
Spawn sub-agent]
end
subgraph WEB["🌐 Web Tools"]
WB1[WebSearch
Search the web]
WB2[WebFetch
Fetch URL content]
end
subgraph WORKFLOW["📋 Workflow Tools"]
WF1[TodoWrite
Manage task list]
WF2[NotebookEdit
Jupyter notebooks]
end
subgraph CONTROL["🎛️ Control Flow Tools"]
CF1[EnterPlanMode / ExitPlanMode
Toggle plan mode]
CF2[EnterWorktree / ExitWorktree
Worktree navigation]
CF3[AskUserQuestion
Request human input]
end
style ROOT fill:#E87E2F,color:#fff
style R1 fill:#6DB3F2,color:#fff
style R2 fill:#6DB3F2,color:#fff
style R3 fill:#6DB3F2,color:#fff
style R4 fill:#6DB3F2,color:#fff
style W1 fill:#F5E6D3,color:#333
style W2 fill:#F5E6D3,color:#333
style W3 fill:#F5E6D3,color:#333
style E1 fill:#E85D5D,color:#fff
style E2 fill:#E87E2F,color:#fff
style WB1 fill:#7BC47F,color:#333
style WB2 fill:#7BC47F,color:#333
style WF1 fill:#B8B8B8,color:#333
style WF2 fill:#B8B8B8,color:#333
style CF1 fill:#B8B8B8,color:#333
style CF2 fill:#B8B8B8,color:#333
style CF3 fill:#B8B8B8,color:#333
click ROOT href "https://github.com/FlorianBruniaux/claude-code-ultimate-guide/blob/main/guide/core/architecture.md#2-the-tool-arsenal" "Claude Code Tools"
click R1 href "https://github.com/FlorianBruniaux/claude-code-ultimate-guide/blob/main/guide/core/architecture.md#2-the-tool-arsenal" "Glob — Find files by pattern"
click R2 href "https://github.com/FlorianBruniaux/claude-code-ultimate-guide/blob/main/guide/core/architecture.md#2-the-tool-arsenal" "Grep — Search file content"
click R3 href "https://github.com/FlorianBruniaux/claude-code-ultimate-guide/blob/main/guide/core/architecture.md#2-the-tool-arsenal" "Read — Read file content"
click R4 href "https://github.com/FlorianBruniaux/claude-code-ultimate-guide/blob/main/guide/core/architecture.md#2-the-tool-arsenal" "LS — List directory"
click W1 href "https://github.com/FlorianBruniaux/claude-code-ultimate-guide/blob/main/guide/core/architecture.md#2-the-tool-arsenal" "Write — Create new file"
click W2 href "https://github.com/FlorianBruniaux/claude-code-ultimate-guide/blob/main/guide/core/architecture.md#2-the-tool-arsenal" "Edit — Modify existing file"
click W3 href "https://github.com/FlorianBruniaux/claude-code-ultimate-guide/blob/main/guide/core/architecture.md#2-the-tool-arsenal" "MultiEdit — Batch modifications"
click E1 href "https://github.com/FlorianBruniaux/claude-code-ultimate-guide/blob/main/guide/core/architecture.md#2-the-tool-arsenal" "Bash — Shell commands"
click E2 href "https://github.com/FlorianBruniaux/claude-code-ultimate-guide/blob/main/guide/ultimate-guide.md#41-what-are-agents" "Task — Spawn sub-agent"
click WB1 href "https://github.com/FlorianBruniaux/claude-code-ultimate-guide/blob/main/guide/core/architecture.md#2-the-tool-arsenal" "WebSearch"
click WB2 href "https://github.com/FlorianBruniaux/claude-code-ultimate-guide/blob/main/guide/core/architecture.md#2-the-tool-arsenal" "WebFetch"
click WF1 href "https://github.com/FlorianBruniaux/claude-code-ultimate-guide/blob/main/guide/core/architecture.md#2-the-tool-arsenal" "TodoWrite — Task list"
click WF2 href "https://github.com/FlorianBruniaux/claude-code-ultimate-guide/blob/main/guide/core/architecture.md#2-the-tool-arsenal" "NotebookEdit — Jupyter"
click CONTROL href "https://github.com/FlorianBruniaux/claude-code-ultimate-guide/blob/main/guide/core/architecture.md#2-the-tool-arsenal" "Control Flow Tools"
click CF1 href "https://github.com/FlorianBruniaux/claude-code-ultimate-guide/blob/main/guide/core/architecture.md#2-the-tool-arsenal" "EnterPlanMode / ExitPlanMode"
click CF2 href "https://github.com/FlorianBruniaux/claude-code-ultimate-guide/blob/main/guide/core/architecture.md#2-the-tool-arsenal" "EnterWorktree / ExitWorktree"
click CF3 href "https://github.com/FlorianBruniaux/claude-code-ultimate-guide/blob/main/guide/core/architecture.md#2-the-tool-arsenal" "AskUserQuestion"
```
ASCII version
```
READ: Glob (find), Grep (search), Read (content), LS (list)
WRITE: Write (create), Edit (modify), MultiEdit (batch)
EXECUTE: Bash (shell), Task (sub-agent) ← most powerful/risky
WEB: WebSearch, WebFetch
WORKFLOW: TodoWrite, NotebookEdit
CONTROL: EnterPlanMode/ExitPlanMode, EnterWorktree/ExitWorktree, AskUserQuestion
```
> **Source**: [Architecture: Tools](../core/architecture.md#tools) — Line ~213
> *Simplified — additional tools available. See [Architecture: Tool Arsenal](../core/architecture.md#tools) for the full list.*
---
### System Prompt Assembly
Before every API call, Claude Code assembles a system prompt from multiple sources in a specific order. The prompt is split into two cache zones separated by a boundary marker.
```mermaid
sequenceDiagram
participant CC as Claude Code
participant G as Global CLAUDE.md
participant P as Project CLAUDE.md
participant T as Tool Registry
participant A as Claude API
Note over CC: STATIC zone (cached globally — shared across all users)
CC->>CC: 1. Load base instructions + safety rules
CC->>G: 2. Read ~/.claude/CLAUDE.md
G->>CC: Global preferences, rules
CC->>P: 3. Read project CLAUDE.md(s)
P->>CC: Project conventions, context
CC->>T: 4. Get available tools list
T->>CC: Tool schemas (Glob, Grep, Bash...)
Note over CC: ── BOUNDARY MARKER ──────────────────────────
Note over CC: DYNAMIC zone (cached per-session, not cross-org)
CC->>CC: 5. Add working directory + git info
CC->>CC: 6. Add MCP server capabilities (uncached — recomputed every turn)
CC->>CC: 7. Add memory (MEMORY.md), session guidance, language
CC->>A: System prompt (assembled)
+ User message
Note over A: One large call with
all context embedded
```
ASCII version
```
STATIC zone (globally cacheable, cross-org):
1. Base instructions (hardcoded)
2. ~/.claude/CLAUDE.md
3. /project/CLAUDE.md + subdirs
4. Tool definitions list
────── BOUNDARY MARKER ──────────
DYNAMIC zone (per-session cache):
5. Working directory + git status
6. MCP server capabilities (always recomputed)
7. Memory, session guidance, language
──────────────────────────────────
→ All combined → Claude API call
```
> **Source**: [Architecture: System Prompt](../core/architecture.md#system-prompt) — Line ~354
>
> *Source-confirmed (2026-03-31): Two-zone architecture via `SYSTEM_PROMPT_DYNAMIC_BOUNDARY` marker. Static zone has `cacheScope: 'global'` (shared across all users). MCP instructions explicitly uncached — comment in source: "servers connect/disconnect between turns".*
---
### Sub-Agent Context Isolation
Sub-agents are completely isolated from the parent — they can't read the parent's conversation or modify parent state. This isolation is a feature (safety) and a constraint (intentional design).
```mermaid
sequenceDiagram
participant P as Parent Claude
participant T as Task Tool
participant S as Sub-Agent
participant EXT as External Services
Note over P: Has full conversation history
P->>T: Task(prompt="do X", tools=[Read,Write,Bash])
Note over T: Creates new Claude instance
T->>S: spawn(prompt + tool grants ONLY)
Note over S: Does NOT receive:
- Parent conversation
- Parent tool results
- Parent state
S->>EXT: read files, bash, web (as granted)
EXT->>S: Results
Note over S: Independent reasoning
with limited context
S->>T: return "task complete: details..."
Note over T: Only text passes back
T->>P: Result string
Note over P: Parent gets text only
No shared state
```
ASCII version
```
Parent (full context)
│
Task(prompt, tools=[...])
│
▼
Sub-Agent (ISOLATED)
Input: prompt + tool grants only
Can: use granted tools independently
Cannot: see parent conversation, modify parent state
Output: text result ONLY
│
▼
Parent receives: text string
```
> **Source**: [Architecture: Sub-Agents](../core/architecture.md#sub-agents) — Line ~444