Cada prompt segue o mesmo formato: Objetivo (o que ele faz), o bloco colável (copie e troque as partes entre <chevrons>) e Como verificar (o que olhar no usage pra saber que funcionou). Todos apoiam na mesma verdade: cache é casamento de prefixo, e a soma de cache_read_input_tokens + cache_creation_input_tokens + input_tokens é o tamanho do prompt.
Legenda: os três passos roxos preparam e rodam; o passo ciano confirma no usage se o cache melhorou.
🕵️ Auditar cache de um pipeline
Use quando o cache "não bate" e você não sabe por quê. Este prompt faz o Claude Code varrer o código que monta o prefixo e devolver uma lista acionável de silent invalidators, cada um com arquivo, linha e fix.
Objetivo
Listar cada byte de variação que impede o cache no seu pipeline, priorizado por impacto.
Prompt (copie e troque <…>)
Audite o prompt caching do meu pipeline em <caminho/do/projeto>. Varra TUDO que alimenta o prefixo (a lista de `tools`, o `system` e o começo estável das `messages`) e liste cada silent invalidator: - datetime.now() / Date.now() / uuid / id aleatório no prefixo; - json.dumps sem sort_keys=True; - iteração de set (ordem não garantida); - tools montadas por usuário/modo; - seção condicional no system (if flag: system += ...). Para cada achado, dê: arquivo, linha, por que quebra o cache e o fix mínimo. Ordene por impacto — o que fica mais na FRENTE do prefixo primeiro.
Como verificar
Aplique os fixes e rode duas requisições iguais. No usage, cache_read_input_tokens deve deixar de ser 0 a partir da 2ª. Se ainda vier 0, sobrou um invalidator — use o Prompt 4.
Tools + system + messages
Achado acionável
Frente do prefixo antes
read > 0 no 2º request
🔤 Tornar a lista de tools determinística
Use quando as tools saem de um set/dict e a ordem pode variar. Como as tools ficam na posição 0, qualquer troca de ordem invalida o prefixo inteiro.
Objetivo
Garantir que a lista de tools saia sempre na mesma ordem entre requests.
Prompt (copie e troque <…>)
Em <caminho/do/arquivo>, a lista de `tools` é montada assim: <cole aqui o trecho que monta as tools> Reescreva pra serialização ficar DETERMINÍSTICA: 1) ordene as tools por nome antes de enviar (ex.: sorted(tools, key=lambda t: t["name"])); 2) garanta que cada objeto interno saia ordenado (json.dumps(..., sort_keys=True)); 3) confirme que a ordem é IDÊNTICA entre dois requests. Mostre o diff e explique por que isso preserva o prefixo (posição 0).
Como verificar
Dispare dois requests iguais: cache_read_input_tokens passa a ser > 0 no 2º. Antes da correção, ele ficava 0 mesmo repetindo o mesmo prompt.
Tools antes de tudo
Ordene por nome
Objetos internos também
Entre requests
🤔 Decidir compactar vs continuar
Use quando o contexto cresceu e você não sabe se vale /compact. Este prompt põe números na decisão: custo por turno de continuar vs custo único de compactar, com o payback.
Objetivo
Comparar o custo por turno de carregar o contexto atual com o custo único de compactar, e recomendar.
Prompt (copie e troque <…>)
Estou com um contexto de ~<N> tokens e ainda faltam ~<M> turnos.
Compare os dois caminhos (use read≈0,1× · write 5min≈1,25×):
(a) CONTINUAR sem compactar: custo por turno = N @ 0,1× ≈ N/10-equiv,
repetido em todos os <M> turnos;
(b) COMPACTAR pra ~<K> tokens: 1 write frio K @ 1,25× (uma vez) e
depois K @ 0,1× por turno.
Diga o payback (em quantos turnos a compactação se paga) e recomende
compactar OU continuar — considerando também o teto de 1M e a qualidade
(context rot). Se a conversa for curta, avise que continuar pode ser melhor.Como verificar
A recomendação deve seguir a régua do módulo 3.1: contexto pequeno / poucos turnos → continuar (preserva o cache quente); contexto grande, perto do teto ou qualidade caindo → compactar (payback em ~1 turno).
N @ 0,1×
K @ 1,25×, uma vez
Em quantos turnos paga
Pequeno→continuar
🩺 Diagnosticar cache_read = 0
Use quando cache_read_input_tokens vem sempre 0 mesmo repetindo o mesmo prompt. É a prova de que existe um silent invalidator; este prompt faz o diff dos bytes pra achar o culpado.
Legenda: dois prefixos "iguais", um único trecho diferente. Esse byte é o motivo de cache_read ficar 0.
Objetivo
Achar o primeiro byte que muda entre dois requests iguais e a sua origem.
Prompt (copie e troque <…>)
Meu cache_read_input_tokens vem SEMPRE 0 repetindo o MESMO prompt. Capture os bytes exatos do prefixo (tools + system + começo das messages) de DOIS requests consecutivos e faça o diff entre eles. Aponte o PRIMEIRO ponto que difere e explique a origem (relógio/datetime.now(), uuid, ordem de set/dict, json.dumps sem sort_keys, seção condicional no system). Proponha o fix determinístico. Arquivos que montam o prefixo: <cole os caminhos>.
Como verificar
Depois do fix, refaça o diff dos dois prefixos: ele deve ficar vazio. Aí cache_read_input_tokens passa a subir a cada turno repetido.
O sintoma
Iguais, consecutivos
1º byte que muda
Diff limpo = resolvido
🧊 Revisar system prompt pró-cache
Use quando o system tem data, nome do usuário ou modo interpolados. Este prompt congela o system e move o contexto dinâmico pro fim das messages, sem perder informação.
Objetivo
Tirar toda interpolação dinâmica do system e devolvê-la como bloco pronto pro fim das messages.
Prompt (copie e troque <…>)
Aqui está meu system prompt: <cole o system prompt inteiro> Remova TODA interpolação dinâmica dele (data/hora, nome do usuário, modo, e qualquer valor que muda entre requests) e mova esse contexto pro FIM das messages — nunca no system. Devolva: 1) o system CONGELADO (fixo, sem variáveis); 2) o bloco de contexto dinâmico pronto pra ir nas messages; 3) o diff comentado, explicando por que cada mudança preserva o prefixo.
Como verificar
Depois da troca, o system fica idêntico byte a byte entre requests. O cache de tools + system para de invalidar e cache_read_input_tokens cobre esse trecho.
System sem variáveis
Dinâmico → fim das messages
Contexto continua lá
Prefixo idêntico
📍 Estratégia de breakpoints
Use quando você controla os cache_control à mão (fora do Claude Code, na API). São no máximo 4 por request; este prompt sugere onde colocá-los e alerta sobre o 20-block lookback.
Legenda: dois breakpoints bem postos (fim do system, fim do trecho compartilhado) cobrem quase tudo; a parte variável fica de fora de propósito.
Objetivo
Decidir onde posicionar os cache_control e evitar o furo do 20-block lookback.
Prompt (copie e troque <…>)
Meu prompt tem esta estrutura: <descreva: tamanho do system; se as tools mudam; se há um trecho compartilhado seguido de um sufixo que varia por request> Sugira onde colocar os cache_control (MÁX. 4 por request). Tipicamente: - no fim do `system` estável; - no fim do maior trecho COMPARTILHADO, antes da parte variável. Alerte sobre o 20-block lookback: se um turno adiciona >20 blocos (loops com muitos tool_use/tool_result), proponha um breakpoint intermediário (~a cada 15 blocos). Explique cada escolha.
Como verificar
cache_read_input_tokens fica alto e estável turno a turno. Se algum turno com muitos blocos derruba o read pra 0, faltou o breakpoint intermediário do lookback.
Breakpoints por request
Cacheia tools+system
Antes da parte variável
Lookback: pt. intermediário
O kit completo
cache_control e o alerta do 20-block lookback.Fim da Trilha 3
Você fechou as boas práticas avançadas: decidir cache vs compactação, montar uma arquitetura pró-cache e ter os prompts na mão. Marque os tópicos como lidos e acompanhe o progresso em "Minha jornada".