T1: Load top-30 UserMemory facts into system prompt at session start. T2: remember_user_fact tool (auto-write bounded to safe categories, USER_STATED for all). list_my_memories read tool. T3: User CRUD routes (DELETE/PATCH) with strict userId scoping. 57/57 Vitest green. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
3.8 KiB
RAPPORT-2B — Mémoire conversationnelle d'Август
Date : 01/06/2026 Session : 148 (suite)
1. Précondition
UserMemory = 0 rows (vérifié sur VPS). Le flag directExecution vit dans ChatPreference (modèle dédié). UserMemory est vierge pour le câblage conversationnel. Pas de migration nécessaire.
2. T1 — Lecture mémoire au mount de session
Implémentation : loadUserMemory(userId) dans agent-chat.service.ts charge les top 30 faits par confiance/récence (confiance >= 0.3, non expirés).
Injection : les faits sont formatés par catégorie dans le system prompt via formatMemoryForPrompt() dans system-prompt-builder.ts, sous la section "ЧТО ТЫ ЗНАЕШЬ О ПОЛЬЗОВАТЕЛЕ".
Borne de volume : MAX_FACTS = 30 (configurable).
3. T2 — Écriture auto bornée
Tool remember_user_fact (sans confirmation, source automatique) :
| Source | Catégories autorisées | Confiance |
|---|---|---|
| OBSERVED | PREFERENCE, WORK_PATTERN, TOOL_USAGE, COMMUNICATION_STYLE | 0.7 |
| INFERRED | PREFERENCE, WORK_PATTERN, TOOL_USAGE, COMMUNICATION_STYLE | 0.5 |
| USER_STATED | Toutes les 10 catégories | 1.0 |
Catégories interdites en auto : CONTACT_RELATIONSHIP, DECISION_HISTORY, EXPERTISE_DOMAIN, PROJECT_CONTEXT, GOAL_OBJECTIVE, CONSTRAINT → uniquement sur ordre explicite (USER_STATED).
Upsert : si le fait existe (même userId+category+factKey), met à jour la valeur + renforce la confiance (+0.1) + incrémente evidenceCount.
Instruction system prompt : Август sait quand utiliser le tool (faits factuels observés) et quand attendre l'ordre explicite ("запомни что...", "retiens que...").
Read tool list_my_memories ajouté : l'utilisateur peut demander "что ты обо мне знаешь?" et voir la liste formatée.
4. T3 — Interface user : routes CRUD
Routes ajoutées dans user-memory.routes.ts (scoping strict userId) :
| Méthode | Route | Opération |
|---|---|---|
| GET | /api/v1/engagement/user-memory |
Liste ses propres faits (existait) |
| DELETE | /api/v1/engagement/user-memory/:id |
Supprimer un fait propre |
| PATCH | /api/v1/engagement/user-memory/:id |
Éditer un fait → repasse en USER_STATED, confiance 1.0 |
Scoping : chaque opération vérifie fact.userId === req.user.id. Un user ne peut ni voir ni modifier la mémoire d'un autre.
UI Настройки : non implémentée dans ce sous-bloc (les routes API suffisent pour la validation). Le frontend Settings sera ajouté quand le backlog UI le justifiera.
5. Tests
57/57 Vitest green (6 nouveaux + 51 existants) :
| Test | Description |
|---|---|
| T-2B-01 | Auto-write PREFERENCE avec source OBSERVED → accepté |
| T-2B-02 | Auto-write DECISION_HISTORY avec OBSERVED → refusé |
| T-2B-03 | USER_STATED sur catégorie sensible → accepté |
| T-2B-04 | Source USER_STATED → confiance 1.0 |
| T-2B-05 | list_my_memories retourne table formatée |
| T-2B-06 | list_my_memories vide → message approprié |
6. Validation visuelle recommandée
- Ouvrir le Copilot, dire : « Я предпочитаю получать уведомления утром » → Август utilise
remember_user_fact(OBSERVED, PREFERENCE) → vérifier via APIGET /api/v1/engagement/user-memoryque le fait est enregistré. - Dire : « Запомни, что мой главный поставщик — ТЛТ » → USER_STATED, devrait être accepté même pour une catégorie sensible.
- Fermer le drawer, en ouvrir un nouveau, dire : « Что ты обо мне знаешь? » → Август liste les faits via
list_my_memories. - Supprimer un fait via
DELETE /api/v1/engagement/user-memory/{id}→ vérifier qu'il disparaît de la prochaine session.