metallkart-erp/RAPPORT-2B.md
louis c64c1cb914 feat(copilot): 2B conversational memory — read/write UserMemory
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>
2026-06-01 16:35:46 +04:00

3.8 KiB
Raw Blame History

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

  1. Ouvrir le Copilot, dire : « Я предпочитаю получать уведомления утром » → Август utilise remember_user_fact (OBSERVED, PREFERENCE) → vérifier via API GET /api/v1/engagement/user-memory que le fait est enregistré.
  2. Dire : « Запомни, что мой главный поставщик — ТЛТ » → USER_STATED, devrait être accepté même pour une catégorie sensible.
  3. Fermer le drawer, en ouvrir un nouveau, dire : « Что ты обо мне знаешь? » → Август liste les faits via list_my_memories.
  4. Supprimer un fait via DELETE /api/v1/engagement/user-memory/{id} → vérifier qu'il disparaît de la prochaine session.