Le registre officiel de la mémoire des agents v0.7.0 · pre-release · AGPL-3.0

Le problème de la mémoire des agents

La mémoire des agents retient tout. Vrai ou faux.

Verimem est une couche de mémoire persistante dont le add() fait passer chaque écriture par une porte d'admission anti-confabulation — la source implique-t-elle vraiment le fait ? — et dont le search() renvoie la provenance à chaque lecture. Un hippocampe avec un notaire à la porte.

100 % gratuit et open source — licence AGPL-3.0. Auto-hébergé, local-first : pas de compte, pas de clé API, pas de facturation.

Admisgrounding 0.97
Écriture candidate
«Le déploiement utilise PostgreSQL 16.»
source ⊢ fait — la note de version citée implique l'affirmation.
statut ADMIS · enregistré avec provenance.
§01 La porte d'admission

Les autres couches de mémoire enregistrent tout ce que produit leur extracteur. Pas Verimem.

À l'écriture, un fait candidat est admis, rétrogradé ou refusé — selon que la source citée l'implique vraiment. Un filtre lexical bon marché, sans LLM, rétrograde d'abord les affirmations non étayées du type «ça marche / vérifié / terminé» ; puis, activée par défaut depuis la v0.5.0, une vérification d'implication source⊢fait refuse toute affirmation que la source citée n'étaye pas vraiment. Mesuré sur SNLI, il atteint AUROC 0.971, et ce chiffre est indépendant du juge.

Une revue structurée de mem0, Zep, Letta, Cognee et MemOS a constaté qu'aucun d'eux n'embarque de porte d'admission en écriture. Cette porte — plus la provenance que chaque lecture rapporte — c'est tout l'enjeu. — et une enquête indépendante 2026 sur les agents always-on (arXiv 2606.30306) constate que le domaine se concentre bien plus sur l'accumulation et la récupération de l'état de l'agent que sur sa gouvernance — précisément le manque du write-admission.

Illustratif — la porte en trois verdicts

Admis0.97
Écriture · impliquée
«Le déploiement utilise PostgreSQL 16.»
ADMIS · enregistré avec provenance
Rétrogradé0.41
Écriture · non étayée
«La migration est faite et tout fonctionne.»
RÉTROGRADÉ · conservé, signalé faible confiance
Refusé0.08
Écriture · contredite
«La limite de l'API est de 10 000 req/s.»
REFUSÉ · la source dit 1 000 — non enregistré

Provenance à chaque lecture

Les lectures ne renvoient pas que du texte — elles renvoient pour chaque fait son status et le grounding_score du moment de l'écriture, pour que ton code conditionne sur la confiance au lieu de faire une confiance aveugle. Et update() ne détruit jamais l'ancien fait : il le remplace (supersede), laissant une trace history() auditable. explain() renvoie un TrustReport complet — provenance, vérifications et tout conflit, déclaré ou avec une abstention motivée.

memory.py · l'écriture passe par la porte, la lecture renvoie la provenance

from verimem import Memory

mem = Memory()                                  # local SQLite, offline
mem.add("The deployment uses PostgreSQL 16.")   # write goes THROUGH the gate

for hit in mem.search("which database?"):       # read returns provenance
    print(hit["text"], hit["status"], hit["grounding_score"])
# -> The deployment uses PostgreSQL 16.  ADMITTED  0.97
§02 Preuves — mesurées, pas proclamées
MétriqueRésultatPour mémoire
Entailment de la porte d'écriture AUROC 0.971 Source⊢fait, indépendant du juge (SNLI). Le moat du chemin d'écriture.
QA end-to-end · HaluMem, pipeline complète 0.66–0.68 Notre extraction → store avec gate → réponse : sept runs complets consécutifs se regroupent à 0.66–0.68 (moyenne 0.667, n=3 propres) contre le 0.672 auto-déclaré de MemOS — parité, pas victoire, et nous le disons ainsi. Le juge est Claude, pas GPT-4 ; fichiers bruts dans le repo.
Généralisation cross-user 0.716 La même recette sur un utilisateur jamais vu (n=169) : 0.716. La recette n'est pas réglée sur les données d'un seul utilisateur.
Abstention memory-boundary 1.000 × 7 runs Refuse d'inventer quand le store ne peut pas soutenir une réponse — 1.000 sur sept runs end-to-end consécutifs. L'axe que les concurrents ne mesurent pas.
Trou multilingue du gate — fermé 8/10 → 0/10 Reproduit depuis des tests réels : la même affirmation hype non étayée passait le gate proprement dans 8 langues sur 10 (le screen lexical était EN/IT seulement). Corrigé par un dual-check sémantique qui utilise l'embedder multilingue lui-même comme détecteur, puis durci par une review adversariale qui a falsifié le premier claim « 0 FP » sur des phrases held-out : questions, négations et discours rapporté sont désormais exclus par des gardes déterministes, by design. Après le fix sur le write path réel : hype signalé dans 10/10 langues, faux positifs held-out 0/14 — script de calibration, findings de la review et fichiers bruts dans le repo.
Résolution de conflits de mémoire 0.15 → 0.82 Une mise à jour contradictoire l'emporte 5,5× plus souvent après le fix ; retraits erronés réduits 99 → 7 avec le plancher de précision (0 cross-attribut). Verdict du critic adverse : claim_holds.
Taux d'hallucination (un curseur) 0.233 → 0.111 −52% comme interrupteur (ENGRAM_GROUNDING_GATE), tout en gardant les bonnes réponses. Tu choisis recall-first ou trust-first — en QA et sur le chemin d'écriture.
Retrieval recall@5 · LongMemEval-s 0.8745 500 complet, sans juge, même embedder e5, zéro API externe. Fusion ON vs 0.8525 OFF (+2,2 pp). C'est du recall@k, pas une exactitude QA de bout en bout.
Latence · concurrence 38ms / 166–237ms Écriture 38ms p50 avec la porte complète ; lecture 166–237ms avec historique + TrustReport à 5k faits. 500 processus concurrents sur un seul store SQLite, 0 erreur (workers légers).
Suite de tests 7 761 au vert Auto-exécutés, reproductibles depuis le repo. Aucun classement tiers. Un test smoke live vers le fournisseur LLM dépend de l'environnement (fournisseur hébergé requis) et est exclu du décompte.
TrustMem-Bench · axes de trust Verimem 60/60 Notre benchmark de trust déterministe — sans LLM, sans réseau : six axes, une commande. Verimem passe 60/60 ; mem0 OSS couvre 40/60 (0/10 sur absence, oubli, provenance). Une baseline raw-store par choix — les concurrents sont invités à l'exécuter.
VeriBench · le standard de confiance déterministe · self-run Le benchmark ouvert pour la mémoire fiable — il mesure ce que recall@k ne voit pas, car un score symétrique ne distingue pas une réponse fausse et sûre d'un honnête « je ne sais pas ». Sur l'axe causal, un store trust-seul qui a corroboré une corrélation fallacieuse finit en négatif même à λ=1 (provenance ≠ causalité). Sur l'axe adversarial — collusion plus un sleeper de confiance — seule une politique à deux canaux (corroboration indépendante et résultat) reste positive ; chaque canal seul cède à une attaque. Sans modèle, une commande, spec dans le repo — les concurrents sont invités à l'exécuter. Résultats complets, protocole et head-to-head →
Source trust sur un corpus RÉEL cartel 0.90 → 0.20 · 3/3 seeds HaluEval held-out, critères pré-enregistrés avant la première exécution : un cartel de 4 identités qui s'auto-confirme à 0.90 sous le comptage naïf ≥2 sources est démoli à 0.20 par indépendance + déconfusion sur l'audit ; les sources honnêtes remontent à 0.95, les réponses hallucinées du cartel disparaissent du recall (→ 0.0). Courbe de robustesse (18 points) : réponses fausses écrites par des trompeurs = 0/18 à tout niveau de bruit ; le résidu, ce sont des erreurs honnêtes — maladie per-claim, déclarée, pas cachée.
Bouton SLA · opère au risque déclaré TCE ≤ 0.011 · risque 1,1 % @ 73 % coverage Un AUROC fort dit que les scores discriminent ; il ne dit pas que le bouton λ opère au risque déclaré (Oxford 2603.21172). Mesuré held-out avec calibration ajustée sur dev seulement : les scores bruts classent quasi-oracle (E-AURC 0.0008) mais promettent un risque différent de celui livré ; après une calibration isotonique pure chaque cible λ déclarée est tenue — TCE ≤ 0.011 sur λ ∈ {0.5–9}, risque observé 1,1 % à 73 % de coverage. Compromis déclaré : la calibration aplatit le classement fin — brut pour classer, calibré pour opérer.

Chaque chiffre ici est auto-exécuté et reproductible depuis le dépôt — ce n'est pas un classement tiers. Les nombres de retrieval sont du recall@k, pas l'exactitude QA de bout en bout que Mem0 et Zep mettent en avant, donc pas directement comparables.

§03 La différence — une combinaison honnête

01Gate d'admission en écriture

Admettre, déclasser ou refuser chaque écriture par entailment de la source. Aucun concurrent ici n'en livre un — et depuis juillet il est multilingue : le même screen sémantique en 10 langues, calibré à 0 faux positifs.

02Provenance + TrustReport

Chaque fait renvoie status + grounding_score ; update() remplace, history() reste auditable ; explain() donne le dossier complet « comment le sais-tu ? ».

03Bi-temporel + time-travel

Deux horloges (appris quand vs vrai quand), réponse-avec-historique (« changé de X à Y le Z »), time-travel as_of et recall profond des faits dormants — pas seulement valid_until.

04Gateway self-host pour équipes

verimem gateway serve : API HTTP multi-tenant sur ta propre machine — clés hashées, stores isolés par tenant, rate limiting, backups à chaud, provisioning distant. Tes données ne quittent jamais ton infrastructure.

05Odomètre de confiance + dashboard

Compteurs persistants de ce que le gate a vraiment FAIT — écritures admises, mises en quarantaine, refusées, abstentions honnêtes — par store et par tenant, avec une page /dashboard sans dépendances. Des actions observables, pas des claims marketing.

06Mémoire documentaire avec citations exactes

Indexe PDF / DOCX / HTML / EPUB ; les passages reviennent avec fichier, version et offsets de caractères, et peuvent être promus en mémoire à travers le gate.

07Import consent-first

Démarre depuis ton export ChatGPT / Claude : les conversations sont d'abord listées, filtrables par titre, date ou projet — rien n'est ingéré sans une sélection explicite.

08Oubli RGPD qui tient

delete(purge_history=True) effondre toute la chaîne — les données effacées ne resurgissent pas de history, as_of ou du recall profond.

09MCP-natif + SDK TypeScript

Outils mémoire au démarrage de session dans Claude Code, Cursor, Cline, Zed — plus un client TypeScript typé et sans dépendances pour le gateway, contract-testé contre le serveur vivant.

10Tourne sur ton abonnement

Mode MCP hosted : pas de clé API, pas de billing au token — le LLM de l'hôte fait le travail. Tourne air-gapped (verimem airgap vérifie le zéro egress).

11Connaissance dérivée, sous gate

L'anneau de composition dérive des faits NOUVEAUX à partir des faits vérifiés et les fait passer par le MÊME gate d'admission que tout écrivain — les survivants entrent signés (les écritures du moteur ne témoignent jamais pour elles-mêmes), tracés (rétractables si un parent tombe) et étiquetés avec le check exact réussi : proven / unbeaten(bound) / refuted(contre-exemple). « Tenu jusqu'à 10^6 » et « prouvé » ne se confondent jamais.

12Gardien en lecture + sondes actives

Une lecture ne fait pas que s'abstenir — quand le store détient une vérité mieux garantie sur le même sujet, il CORRIGE, en citant les deux faits (un fait réfuté n'est jamais servi). Et le store se sonde LUI-MÊME : il construit la requête qui réfuterait un fait — une contre-preuve indépendante propose l'étiquette refuted, survivre fait croître sa borne unbeaten. Une falsification que vous n'avez pas à attendre.

13Signature de provenance

Un HMAC infalsifiable de QUI parle voyage dans le ref de provenance de chaque écriture, en complément du gate d'entailment sur CE QUI mérite l'admission. Authenticité du contenu et authenticité du canal — les deux moitiés qu'aucun filtre de contenu déterministe seul ne peut certifier face à un adversaire adaptatif. Opt-in ; l'audit rapporte la couverture et nomme les contrevenants.

SystèmePorte d'écritureProvenance en lectureApprocheMaturité
Mem0 Vecteur plat + résumé LLM Établi, largement adopté
Zep / Graphiti partielle (temporelle) Graphe de connaissances temporel Commercial, mature
HippoRAG OpenIE + PageRank Recherche
Verimem Fusion recall + porte + consolidation pendant le sommeil Tout nouveau · 0 adoption pour l'instant

Les scores et l'adoption des concurrents varient selon la source et dans le temps ; les deux colonnes sur lesquelles nous tenons — une porte d'écriture et la provenance en lecture — viennent d'une revue structurée, pas d'un tableau marketing.

§04 Ce que Verimem n'est PAS
pour mémoire
  • 0 adoption.

    Une sortie toute neuve. Personne n'en dépend encore — nous compris, au-delà du poste quotidien du mainteneur.

  • Sur PyPI · repo public.

    pip install verimem — v0.7.0 sur PyPI (AGPL-3.0) ; le repo public est sur GitHub, avec le premier CI au vert. Tout neuf, cela dit.

  • Gardes source-trust — reproduites sur corpus réel, toujours opt-in.

    L'indépendance de provenance et la déconfusion par l'audit tiennent désormais sur un corpus réel held-out (HaluEval, critères pré-enregistrés, 3/3 seeds) : un cartel de consensus fabriqué qui s'auto-confirme à 0.90 sous comptage naïf est démoli à 0.20, les sources honnêtes remontent à 0.95, et ses réponses hallucinées disparaissent du recall. Limite honnête, mesurée : sous fort bruit honnête (sources fiables qui se trompent ~15 %+) la séparation se dégrade — le résidu est à 100 % des erreurs honnêtes, maladie per-claim, pas une attaque. Les flags restent default OFF : la preuve informe la bascule, la bascule est une décision produit.

  • Périmètre : provenance, pas causalité.

    Chaque TrustReport le déclare désormais — Verimem certifie qui a affirmé un fait, à quel point il est corroboré indépendamment et sa fraîcheur, pas qu'il soit causalement vrai. Une question do(X) exige un fait interventionnel ; un fait observationnel corroboré ne peut y répondre.

  • Benchmarks maison.

    Chaque chiffre est reproductible depuis le repo, mais aucun n'est audité par un tiers. Le chiffre QA vs MemOS utilise un juge Claude (pas GPT-4) sur n=2 utilisateurs. À considérer comme reproductibles, pas certifiés.

  • Parité end-to-end — auto-jugée.

    La pipeline complète (notre extraction → QA) se regroupe à 0.66–0.68 sur sept runs consécutifs (moyenne 0.667 sur n=3 stores propres) contre le 0.672 de MemOS, et tient 0.716 sur un utilisateur jamais vu. Le caveat demeure : le juge est Claude, pas GPT-4, aucun audit tiers. Nous disons parité, pas « bat ».

  • Self-host oui — cloud managé non.

    Le gateway multi-tenant (stores isolés par tenant, clés hashées, backups, metering) est réel et testé — sur ton infrastructure. Un service cloud managé n'existe pas encore.

  • Graphe d'entités : typé, opt-in, jeune.

    L'extraction d'entités conversationnelles (tier typé) est shipped mais désactivée par défaut ; le raisonnement multi-hop sur le graphe est l'axe mesuré le plus faible (0.39–0.44) et le chantier en cours.

§05 Installer

① Python — depuis les sources

pip install verimem

Fournit la commande verimem et le SDK from verimem import Memoryadd() / search() / history() / explain(). SQLite local, hors-ligne, porte active par défaut.

github.com/aureliocpr-ctrl/verimem ↗ · AGPL-3.0 · README · BENCHMARKS.md

② Comme serveur MCP — Claude Code, Cursor, Cline, Zed

{
  "mcpServers": {
    "verimem": {
      "command": "verimem",
      "args": ["mcp"],
      "env": { "ENGRAM_HOSTED": "1" }
    }
  }
}

Redémarre ton hôte ; les outils de mémoire deviennent appelables avec zéro clé API — le LLM de l'hôte fait le travail.

③ Gateway self-host pour équipes

verimem gateway keys create --tenant acme
verimem gateway serve   # 127.0.0.1:8377 · /ui

verimem gateway keys create --tenant acme puis verimem gateway serve — API HTTP multi-tenant avec stores isolés par tenant, rate limiting et backups à chaud. Ouvre /ui pour l'odomètre de confiance ; un client TypeScript typé est dans le repo.

④ La voir travailler — la console de confiance

verimem console   # your store · odometer · graph · live

verimem console ouvre votre mémoire locale dans le navigateur — odomètre de confiance, graphe de connaissances où chaque conclusion porte sa chaîne de traçabilité, journal des affirmations bloquées, en direct via SSE. La passerelle d'équipe sert la même console sur /ui ; les agents lisent l'état complet via /v1/snapshot.