Le coût caché du contexte : 6 milliards de tokens re-payés en 14 jours
d'historique re-lus par le cache en 14 jours — 45 sessions Claude Code, zéro compaction spontanée observée. 96 % du volume total n'est pas du travail neuf : c'est la même conversation, re-lue à chaque appel. (Run de référence du 23/07/2026, artefact local
compaction_rejeu.json, recalculable.)
Le phénomène
Une session d'agent de code re-envoie tout son historique à chaque message (API sans état).
Le cache d'Anthropic rend cette relecture ~10× moins chère, mais elle domine quand même la
facture : sur nos données réelles, 96 % des tokens comptés sont du
cache_read. Personne ne compacte : sur 14 jours et 45 sessions, aucune
compaction spontanée. Le seul mécanisme sanctionné qui réduit un historique déjà payé est
/compact — encore faut-il savoir quand il rapporte.
Le rejeu contrefactuel
Nous avons rejoué les 45 sessions avec une politique simple : « compacter dès que le poids d'historique dépasse θ » (simulation au 1er ordre : coût de compaction = relecture + résumé ; contexte post-compaction S0 = 12k, annoncé comme estimation).
| Seuil θ | Écart vs réel (tokens d'historique) |
|---|---|
| 400 000 | −36,0 % |
| 200 000 | −65,2 % |
| 120 000 | −78,4 % |
Résultat négatif assumé : un seuil « appris » par session ne bat PAS le meilleur seuil fixe au coût-tokens pur (oracle par-session : +0,0 % sur 45/45 sessions) — l'optimum réel est borné par la qualité, pas par l'arithmétique. Nous publions aussi ce qui ne marche pas.
Ce que Chaser en a fait (livré, mesuré)
- Conseiller de compaction piloté par le coût — à chaque prompt, le poids réel d'historique de VOTRE session est lu ; au-delà du seuil, un conseil chiffré s'affiche (« /compact libérerait ~416k par tour »). Effet causal mesuré par holdout 10 % (une fraction des conseils est silencieusement retenue — les deux bras sont journalisés).
- Tier 0 chat — un « merci » dans une session chargée re-paye tout l'historique pour rien. Les messages purement sociaux (liste blanche fermée) sont interceptés avant l'envoi et servis en local : 0 token d'abonnement, tour évité journalisé. Première interception observée en production : 610 246 tokens évités en un message.
- Auto-compacteur trois étages — auto-compact natif abaissé, veilleur qui compacte les sessions dormantes via l'interface officielle, conseiller sur les sessions actives.
- Attribution par demande — chaque prompt affiche son coût décomposé : tokens frais vs historique re-payé (sémantique OpenTelemetry GenAI), et l'affichage principal est en « équivalent plein tarif » (relecture cache ×0,10, écriture ×1,25 — pondération officielle).
Antériorité et limites
Art antérieur identifié au 23/07/2026 : compression de prompt avant envoi, heuristiques
manuelles de compaction publiées en blog. Aucun équivalent public identifié des mécanismes
ci-dessus à cette date. Limites annoncées : le rejeu est une simulation au 1er
ordre (perte de qualité non modélisée) ; la pondération de la relecture de cache dans les
limites d'abonnement est propriétaire ; toute conversion tokens↔caractères utilise un ratio
calibré sur le compteur officiel count_tokens.
Chaque chiffre de ce rapport provient d'un journal local auditable
(JSONL horodaté) et se recalcule avec le script de rejeu fourni avec Chaser
(experiments/compaction_optimale/mesurer.py). Chaser est 100 % local :
vos transcripts ne quittent jamais votre machine.