Cache : la ligne MCP du préambule ne manque plus au premier tour après un démarrage

Le préambule système était bâti (InjectSkills → baseSystemPrompt) AVANT que
runChat n'appelle EnabledTools, donc avant que mcpTools n'ouvre les connexions.
mcpPromptLine lisait le pool encore vide : le premier tour après un démarrage
partait sans la ligne MCP, le second avec — tout le prompt à recalculer pour
une ligne. Elle comptait en plus les outils masqués par l'utilisateur, et
s'affichait pour le planner, qui ne reçoit aucun outil MCP.

- prepareTurn calcule les outils UNE fois par tour, puis le préambule à partir
  d'eux ; runChatTools les reprend tels quels (pas de second passage par
  mcpEnsureAll, qui retentait deux fois un serveur en panne).
- mcpPromptLine se déduit de cette tranche : seuls les outils réellement
  envoyés sont comptés, et rien n'est annoncé sans outil MCP.
- trackerList départage les égalités d'horodatage par nom puis slug : la liste
  part dans le contexte, un ordre tiré au sort changeait le prompt.
- Le commentaire de tasks_run.go ne prétend plus que le préfixe d'une tâche
  égale celui du chat (dossier de travail et taskCaps diffèrent).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
MichaelandClaude Opus 5.5 committed 2026-10-04 01:31:00 +02:00
1 parent 9263df404d
commit 7dd319a058
12 files changed
+202 -34

No files matched your search

+13 -1
View File
@@ -107,7 +107,19 @@ func trackerList() []trackerMeta {
}
out = append(out, m)
}
sort.SliceStable(out, func(i, j int) bool { return out[i].LastTS > out[j].LastTS })
// Départage par nom puis slug : allKV parcourt une map, et deux trackers au
// même horodatage (deux points datés du même jour, sans heure) sortaient dans
// un ordre tiré au sort. Cette liste part dans le contexte du modèle — un ordre qui
// change d'un tour à l'autre change le prompt, et tout le cache derrière.
sort.SliceStable(out, func(i, j int) bool {
if out[i].LastTS != out[j].LastTS {
return out[i].LastTS > out[j].LastTS
}
if out[i].Name != out[j].Name {
return out[i].Name < out[j].Name
}
return out[i].Slug < out[j].Slug
})
return out
}