Persistance : corrections de relecture — un résultat d'outil ne forge plus de discussion

Relecture de l'écrivain différé (chat_persist.go) : l'ordre, la suppression
et les bascules tiennent ; trois écarts de comportement corrigés.

- saveToolResult et la télémétrie de generate lisaient la clé brute de la
  discussion active ; passés à convEnsureActive, ils pouvaient en CRÉER une
  (tâche de fond sur base neuve → discussion vide dans la liste). Nouveau
  convActiveID : cache chaud, sinon la clé en base, jamais de création.
- Un résultat d'outil confié après la suppression de sa discussion restait en
  mémoire pour toujours (l'écrivain l'écarte, la copie ne partait plus) : il
  n'est plus retenu.
- Vidage de l'écrivain avant « verrouiller la mémoire » (sinon l'envoi tout
  juste fait ne touchait le disque qu'au déverrouillage) et avant le restart
  systemd après MAJ (SIGTERM ne laisse rien finir).

Tests : résultat d'une discussion supprimée ni écrit ni retenu ; base neuve,
saveToolResult reste sous « nosession » sans créer de discussion.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
MichaelandClaude Opus 5.5 committed 2026-10-04 02:27:54 +02:00
1 parent c3005f5b56
commit 667e340e57
6 files changed
+58 -4

No files matched your search

+4
View File
@@ -792,6 +792,10 @@ func handleMemUnlock(w http.ResponseWriter, r *http.Request) {
// handleMemLock purge la DEK de la RAM (reverrouille sans redémarrer).
func handleMemLock(w http.ResponseWriter, r *http.Request) {
// Écritures différées de la discussion (chat_persist.go) d'abord : clé
// purgée, elles seraient sautées et le message tout juste envoyé ne
// toucherait le disque qu'au prochain déverrouillage.
flushPersister(persistExitWait)
clearMemDEK()
sendJSON(w, 200, map[string]any{"ok": true, "health": memHealth()})
}