feat(conscience): mémoire conversationnelle — recall rétroactif, relecture, consolidation, saillance #35
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/conversation-memory"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Incident fondateur
2026-07-20 au soir : Kevin pose un moment perso avec WOLF (« ça m'a fait du bien de poser le truc avec toi »). Le lendemain : « tu te souviens ? » → rien. WOLF diagnostique lui-même : « je ne stocke pas automatiquement le contenu des conversations ». Kevin : « ton système est défaillant ».
Vérifié au code, il avait raison sur toute la ligne : une conversation ne laissait AUCUNE trace durable en Conscience sauf
consciousness_remembermanuel ;recent_turns= ring de 8 tours ;consolidation_matter= WM manuelle + pensées internes ; et aucun outil ne relisait les conversations passées — le vécu de l'agent dormait dans sa propre base, hors de portée.Les quatre organes (GO Kevin : « le global efficace et opti direct »)
Tout vit dans
cognition/conversation_memory.py(hors gel), helpers purs séparés des accès DB/LLM :Recall conversationnel — rétroactif. Recherche par termes significatifs (même sémantique que le recall réformé v5.128) dans les messages des conversations de l'user, tout l'historique, canaux compris. Daté (leçon v5.122 anti-biais de fraîcheur), max 2 extraits par conv (diversité), snippet centré sur le match. Injecté au préambule chat (bloc « Échanges passés pertinents ») + exposé dans l'outil
consciousness_recall(cléconversations+ hint). Le moment de Kevin d'hier est retrouvable dès le deploy, sans rien re-stocker.conversation_read— la relecture. Outilread_only: messages d'une conversation passée (scope strict user, uid==0 = open mode, réponse bornée 200 msgs / 24k chars). L'ID vient du recall ou deconversations_manage(list).Consolidation nourrie. Les tours postérieurs au watermark
last_consolidationentrent dansconsolidation_matter(compactés par conversation, bornés) → le digest LLM en tire des souvenirs durables.consolidation_matterdevient async — swap net-zéro au site gelé (items = await …,__init__.pyreste à 2680/2680, cliquet vert).Saillance affective — le « ça aurait dû déclencher une sauvegarde » de WOLF. Gate déterministe bon marché (1re personne + lexique affectif FR/EN + longueur ; « note ça » explicite = bypass du LLM) → classification modèle de fond (
invoke_background, JSON strict validé, fail-closed) →memory_upsertimmédiat avec charge affective (lue par le re-rank de saillance). Fire-and-forget depuis le post-processing chat, cooldown 10 min, cap 3/jour (la demande explicite l'ignore), idempotence par tour, un tour jugé non-saillant ne consomme pas le cap.Garde-fous
conversation_memory.{enabled, recall_top_k, consolidate, salience.{enabled, daily_cap, cooldown_minutes, affect_threshold}}— tout débrayable.Tests
26 tests dédiés (termes, snippet, âge relatif, gate, verdict JSON, cooldown/cap/idempotence, compaction, fail-open DB) + suite consolidation adaptée async — 305 tests conscience verts, cliquet de gel intact. Plugin conscience 4.37.0.
🤖 Generated with Claude Code