Contexte : corrections de relecture — la garde de marge ne compacte plus en boucle, et le preset externe compte comme avant

La garde de marge de génération réclamait 1,2 × la plus longue génération
récente, sans plafond. Une étape de 40 k sur une fenêtre de 65 k (ou de 20 k
sur 32 k, sans budget de raisonnement) demandait plus de place que
l'historique fraîchement compacté n'en laisse : la garde repartait à chaque
étape, et chaque fois résumait le résumé précédent.

- Garde : jamais avant la moitié de la fenêtre. Au-delà, le rejeu sur
  « length » reste le filet.
- Preset externe : le complément « messages arrivés depuis la mesure » ne
  s'applique plus. Son CtxUsed garde le raisonnement, qui couvrait déjà ce
  complément ; l'ajouter le faisait compacter plus tôt qu'avant.
- Journal [ctx] : l'estimation d'avant compaction (début de tour, en tour)
  n'est plus comparée au compte d'une requête compactée, ce qui donnait de
  faux écarts.
- Tests : génération énorme juste après compaction, seuil de 50 % pour toutes
  les fenêtres, comptage externe contre local.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
MichaelandClaude Opus 5.5 committed 2026-10-04 00:53:38 +02:00
1 parent d6023ef8a0
commit 26fc348506
4 files changed
+59 -11

No files matched your search

+7 -1
View File
@@ -234,12 +234,18 @@ func compactNeeded(msgs []Message, used, peakGen int) bool {
// fenêtre pour les petites), plus une petite marge. Fonction pure, testable.
// Plancher et marge sont choisis pour ne JAMAIS devancer le seuil de 75 % à eux
// seuls : seule une génération longue avance la compaction.
//
// Et jamais avant la MOITIÉ de la fenêtre, si longue que soit la génération :
// une étape de 40 k sur 65 k (ou de 20 k sur 32 k) réclamait sinon une place
// que l'historique compacté lui-même — prompt système, outils, résumé, queue —
// ne laisse pas. La garde repartait alors à CHAQUE étape, résumé de résumé, le
// fil perdu pour rien. Au-delà, c'est le rejeu sur « length » qui rattrape.
func genHeadroomShort(used, peakGen, window int) bool {
if used <= 0 || peakGen <= 0 || window <= 0 {
return false
}
need := max(peakGen*6/5, min(8192, window/8)) + min(1024, window/32)
return used+need > window
return used+min(need, window/2) > window
}
// logCtx trace un fait du comptage de contexte (fenêtre pleine, relance après