Cada prompt sigue el mismo formato: Objetivo (lo que hace), el bloque para pegar (copia y reemplaza las partes entre <chevrons>) e Cómo verificar (qué revisar en el usage para saber que funcionó). Todos se basan en la misma verdad: la caché es una coincidencia de prefijos, y la suma de cache_read_input_tokens + cache_creation_input_tokens + input_tokens es el tamaño del prompt.
Leyenda: los tres pasos morados preparan y ejecutan; el paso cian confirma en usage si la caché mejoró.
🕵️ Auditar el caché de un pipeline
Úsalo cuando el cache «no coincide» y no sabes por qué. Este prompt hace que Claude Code analice el código que arma el prefijo y devuelva una lista de acciones de invalidadores silenciosos, cada uno con archivo, línea y corrección.
Objetivo
Enumera cada byte variable que impide la caché en tu pipeline, priorizado por impacto.
Prompt (cópialo y cambia <…>)
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.
Cómo verificar
Aplica las correcciones y ejecuta dos solicitudes iguales. En el usage, cache_read_input_tokens debe dejar de ser 0 a partir de la 2.ª. Si aún aparece 0, quedó un invalidator: usa el Prompt 4.
Tools + system + messages
Hallazgo útil
Frente del prefijo antes
leer > 0 en la 2.ª solicitud
🔤 Hacer determinista la lista de tools
Úsalo cuando las tools salen de un set/dict y el orden puede variar. Como las tools quedan en posición 0, cualquier cambio en el orden invalida el prefijo completo.
Objetivo
Garantizar que la lista de tools siempre salgan en el mismo orden entre solicitudes.
Prompt (cópialo y cambia <…>)
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).
Cómo verificar
Lanza dos requests iguales: cache_read_input_tokens pasa a ser > 0 en la 2.ª. Antes de la corrección, seguía en 0 aunque se repitiera el mismo prompt.
Tools antes que todo
Ordena por nombre
También los objetos internos
Entre requests
🤔 Decidir entre compactar o continuar
Úsalo cuando el contexto haya crecido y no sepas si conviene /compact. Este prompt pone números en la decisión: costo por turno de continuar frente al costo único de compactar, con el payback.
Objetivo
Compara el costo por turno de cargar el contexto actual con el costo único de compactar, y recomienda.
Prompt (cópialo y cambia <…>)
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.Cómo verificar
La recomendación debe seguir el criterio del módulo 3.1: contexto pequeño / pocos turnos → continuar (conserva el caché caliente); contexto grande, cerca del límite o con calidad en descenso → compactar (se recupera la inversión en ~1 turno).
N @ 0,1×
K @ 1,25×, una vez
En cuántos turnos se amortiza
Pequeño→continuar
🩺 Diagnosticar cache_read = 0
Úsalo cuando cache_read_input_tokens viene siempre 0 aunque repitas el mismo prompt. Es la prueba de que existe un silent invalidator; este prompt hace que diff de los bytes para encontrar al culpable.
Leyenda: dos prefijos "iguales", un único fragmento diferente. Ese byte es el motivo de cache_read quedar en 0.
Objetivo
Encontrar el primer byte que cambia entre dos requests iguales y su origen.
Prompt (cópialo y cambia <…>)
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>.
Cómo verificar
Después del fix, vuelve a comparar los dos prefijos: debe quedar vacío. Entonces cache_read_input_tokens empieza a subir con cada turno repetido.
El síntoma
Iguales, consecutivos
1.er byte que cambia
Diff limpio = resuelto
🧊 Revisar el system prompt pro caché
Úsalo cuando el system tenga la fecha, el nombre del usuario o el modo interpolados. Este prompt congela el system y mueve el contexto dinámico al final de las messages, sin perder información.
Objetivo
Quitar toda interpolación dinámica del system y devolverla como bloque listo para el final de las messages.
Prompt (cópialo y cambia <…>)
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.
Cómo verificar
Después del cambio, el system queda idéntico byte por byte entre requests. El caché de tools + system deja de invalidar y cache_read_input_tokens cubre este fragmento.
System sin variables
Dinámico → final de las messages
El contexto sigue ahí
Prefijo idéntico
📍 Estrategia de breakpoints
Úsalo cuando controles los cache_control manualmente (fuera de Claude Code, en la API). Son como máximo 4 por request; este prompt sugiere dónde colocarlos y advierte sobre el 20-block lookback.
Leyenda: dos breakpoints bien ubicados (al final del system, al final del fragmento compartido) cubren casi todo; la parte variable queda fuera a propósito.
Objetivo
Decidir dónde colocar los cache_control y evitar el fallo del 20-block lookback.
Prompt (cópialo y cambia <…>)
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.
Cómo verificar
cache_read_input_tokens se mantiene alto y estable turno a turno. Si algún turno con muchos bloques reduce el read a 0, faltó el breakpoint intermedio del lookback.
Breakpoints por solicitud
Guarda en caché las herramientas y el sistema
Antes de la parte variable
Lookback: punto intermedio
El kit completo
cache_control y la alerta del 20-block lookback.Fin de la Ruta 3
Ya completaste las buenas prácticas avanzadas: decidir entre caché y compactación, montar una arquitectura favorable al caché y tener los prompts a mano. Marca los temas como leídos y sigue tu progreso en «Mi recorrido».