# 5. Context Management — The Compaction Pipeline > How Claude Code keeps conversations within the model's context window. --- ## The Pipeline ```mermaid %%{init: {'theme': 'dark', 'themeVariables': { 'primaryColor': '#1a1a2e', 'primaryTextColor': '#e0e0e0', 'lineColor': '#fd7e14', 'primaryBorderColor': '#fd7e14'}}}%% flowchart LR RAW["Raw message
history"]:::input S1["SNIP COMPACT
Sliding window
Drop oldest turns
Preserve recent N"]:::stage1 S2["MICRO COMPACT
Truncate individual
tool results exceeding
size thresholds"]:::stage2 S3["AUTO COMPACT
Summarize full conversation
via separate API call
Circuit breaker on failure"]:::stage3 S4["CONTEXT COLLAPSE
Read-time projection
Archived collapsed views
Granular preservation"]:::stage4 FINAL["Messages ready
for API call"]:::output S5["REACTIVE COMPACT
Emergency trigger
on API 413 error
Last resort"]:::emergency RAW ==> S1 ==> S2 ==> S3 ==> S4 ==> FINAL FINAL -. "API returns prompt_too_long" .-> S5 S5 ==> FINAL classDef input fill:#1a2d4a,stroke:#4a9eff,color:#e0e0e0,stroke-width:2px classDef stage1 fill:#0d3d0d,stroke:#28a745,color:#e0e0e0,stroke-width:2px classDef stage2 fill:#0d4f4f,stroke:#17a2b8,color:#e0e0e0,stroke-width:2px classDef stage3 fill:#2d2d0d,stroke:#ffc107,color:#e0e0e0,stroke-width:2px classDef stage4 fill:#2d1b4e,stroke:#6f42c1,color:#e0e0e0,stroke-width:2px classDef output fill:#1a2d4a,stroke:#4a9eff,color:#e0e0e0,stroke-width:2px classDef emergency fill:#4a1a1a,stroke:#dc3545,color:#e0e0e0,stroke-width:2px ``` --- ## Stage Details ### Stage 1: Snip Compact Sliding window that drops the oldest turns. The REPL keeps full history for UI scrollback — snip is a *read-time projection* only affecting what's sent to the API. Feature-gated via `HISTORY_SNIP`. ### Stage 2: Micro Compact Truncates individual tool results exceeding size thresholds. Results are cached by `tool_use_id` so subsequent iterations reuse cached truncations. **Key file:** `src/services/compact/microCompact.ts` (19KB) ### Stage 3: Auto Compact Summarizes the full conversation via a **separate API call**. Has a circuit breaker — too many consecutive failures stops retrying. **Key files:** `autoCompact.ts` (13KB), `compact.ts` (60KB), `prompt.ts` (16KB) ### Stage 4: Context Collapse Read-time projection that archives older segments with granular preservation. Exists in a separate store — the REPL's message array is never modified. ### Stage 5: Reactive Compact Emergency trigger when the API returns `prompt_too_long` (413). Last resort — only runs after a real API failure. Feature-gated via `REACTIVE_COMPACT`. --- ## Token Budget State Machine ```mermaid %%{init: {'theme': 'dark', 'themeVariables': { 'primaryColor': '#1a1a2e', 'primaryTextColor': '#e0e0e0', 'lineColor': '#ffc107', 'primaryBorderColor': '#ffc107'}}}%% flowchart LR N["NORMAL
within limits"]:::green W["WARNING
context > 80%"]:::yellow C["CRITICAL
context > 95%"]:::orange B["BLOCKING
context > 98%
auto-compact OFF"]:::red AC["AUTO COMPACT
fires automatically"]:::blue RC["REACTIVE
emergency on 413"]:::darkred M["MANUAL
user runs /compact"]:::gray N -->|"grows"| W W -->|"grows"| C C -->|"auto-compact ON"| AC C -->|"auto-compact OFF"| B AC -->|"success"| N AC -->|"fails + API 413"| RC RC -->|"success"| N B -->|"user: /compact"| M M -->|"success"| N classDef green fill:#1b3a1b,stroke:#28a745,color:#e0e0e0,stroke-width:2px classDef yellow fill:#2d2d0d,stroke:#ffc107,color:#e0e0e0,stroke-width:2px classDef orange fill:#3d2b00,stroke:#fd7e14,color:#e0e0e0,stroke-width:2px classDef red fill:#4a1a1a,stroke:#dc3545,color:#e0e0e0,stroke-width:2px classDef darkred fill:#3a0a0a,stroke:#a30000,color:#e0e0e0,stroke-width:2px classDef blue fill:#1a2d4a,stroke:#4a9eff,color:#e0e0e0,stroke-width:2px classDef gray fill:#2a2a2a,stroke:#888,color:#e0e0e0,stroke-width:1px ``` ### Transitions - **NORMAL → WARNING** at 80% — UI shows warning indicator - **WARNING → CRITICAL** at 95% — compaction should fire - **CRITICAL → AUTO COMPACT** — if enabled, fires summarization API call - **CRITICAL → BLOCKING** — if auto-compact OFF, blocks new API calls - **BLOCKING → MANUAL** — user runs `/compact` to recover --- ## Tool Result Budget Separate from conversation compaction — a per-message budget for aggregate tool result size. Runs **before** the pipeline every iteration. Oversized results are persisted to disk, replaced with a file path + truncated preview. Tools with `maxResultSizeChars = Infinity` (e.g., FileRead) are exempt. --- **Previous:** [← Permission System](./04-permission-system.md) · **Next:** [State Management →](./06-state-management.md)