1 · claude-sonnet-4-6 1 { 2 "model": "claude-sonnet-4-6", "max_tokens": 32000, 3 "tools": [ 4 { "name":"Bash", "description":"Executes a bash command...", 5 "input_schema":{"type":"object","properties":{…}} }, 6 { "name":"Read", … }, // + Edit, Write, Grep, Glob, … 7 … 30 definitions total … 8 ], 9 "system": [ 10 {"text":"x-anthropic-billing-header: … cch=b2984;"}, // len 85 11 {"text":"You are a Claude agent…", "cache_control":{"ttl":"1h"}}, ◀ BP1 12 {"text":"You are an interactive CLI… [26,934]", "cache_control":{…"1h"}} ◀ BP2 13 ], 14 "messages": [ {"role":"user","content":[ 15 {"text":"<system-reminder> agents…"}, // content[0] 1766 16 {"text":"<system-reminder> skills…"}, // content[1] 3808 17 {"text":"# claudeMd … date 2026-06-22"}, // content[2] 1861 18 {"text":"Turn one. Reply with…"} ] } ] ◀ BP3 slides 19 } tools @ byte 0 — 30 definitions, the biggest, most stable block. Change it and the whole prefix re-keys. 2 system breakpoints (ttl:1h) freeze the ~27K front — written once, read warm after. messages[0] = ONE message, 4 typed blocks. The cache counts blocks, not messages. WHY Three cache_control markers, all ttl=1h: BP1 on system[1], BP2 on system[2], BP3 on the message tail. Zero markers in the tools array — tools fold into BP1. CLAUDE.md, skills, and the date all sit in messages[0], after the system breakpoints. [capture] CC 2.1.150