01Porte d'admission en écriture
Admet, rétrograde ou refuse chaque écriture par implication de la source. Aucun concurrent ici n'en a.
Le problème de la mémoire des agents
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 MIT. Auto-hébergé, local-first : pas de compte, pas de clé API, pas de facturation.
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é» ; le mode le plus strict ajoute une vérification d'implication source⊢fait. 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.
Illustratif — la porte en trois verdicts
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.
memory.py · l'écriture passe par la porte, la lecture renvoie la provenance
from engram 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 | Métrique | Résultat | Pour mémoire |
|---|---|---|
| Entailment de la porte d'écriture | AUROC 0.971 | Source⊢fait, indépendant du juge (SNLI). Le moat du chemin d'écriture. |
| Hallucination en aval | 95.9% → 12.2% | −83,7 pp ; McNemar p≈6e-44, répliqué sur 2 graines. Il fonctionne en convertissant la confabulation en abstention (omission 3%→85%), pas en augmentant la justesse — et ce bras est couplé au juge. |
| Over-rejection de faits propres | 30–39% | Le coût honnête au seuil strict. La porte locale distillée (v2) admet 0,924 des faits propres, ce qui referme en grande partie ce point. |
| 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). Un n=300 antérieur donnait 0.909 — optimiste ; le chiffre sur 500 complet est l'honnête. C'est du recall@k, pas une exactitude QA de bout en bout. |
| Retrieval en italien | MRR +52% | 0.466 → 0.710 en basculant sur l'embedder e5, à zéro régression en anglais. |
| Détection de contradictions · HaluMem | TPR 0.66 / FPR 0.0125 | Après la correction de la supersession temporelle. |
| Suite de tests | 5 830 au vert | 764 fichiers de test, ~84k lignes. Auto-exécutés, reproductibles depuis le repo. |
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.
Admet, rétrograde ou refuse chaque écriture par implication de la source. Aucun concurrent ici n'en a.
Chaque fait renvoie status + grounding_score ; update() remplace, history() reste auditable.
valid_until à expiration nette — une mémoire qui sait quand un fait a cessé d'être vrai.
Mode MCP hosted : pas de clé API, pas de facturation au token — le LLM de l'hôte fait le travail.
Un écran anti prompt-injection à l'écriture — italien inclus, pas seulement l'anglais.
228 outils de mémoire au démarrage de session dans Claude Code, Cursor, Cline, Continue, Zed.
| Système | Porte d'écriture | Provenance en lecture | Approche | Maturité |
|---|---|---|---|---|
| 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.
Une sortie publique toute neuve. Personne n'en dépend encore — nous compris, au-delà du poste quotidien du mainteneur.
Installation depuis les sources / git pour l'instant. Un paquet engram-memory est un objectif post-v0.4.0.
Chaque chiffre est reproductible depuis le repo, mais aucun n'est audité par un tiers. À considérer comme reproductibles, pas certifiés.
Mono-utilisateur et local. Le scoping multi-tenant existe au niveau des faits ; un store hébergé / distribué non.
Le moteur entités+PageRank est vivant sur des données réelles mais l'extracteur est du regex déterministe, exécuté en backfill — pas encore branché sur le chemin d'écriture live.
Une revue adverse a jugé gonflée la première démo de conditionnement en réponse. Seul le moat du chemin d'écriture tient sur ses propres preuves — c'est donc tout ce que nous affirmons.
① Python — depuis les sources
pip install "git+https://github.com/aureliocpr-ctrl/verimem.git" Fournit la commande engram et le SDK from engram import Memory. SQLite local, hors-ligne, porte active par défaut.
github.com/aureliocpr-ctrl/verimem ↗ · MIT · README · BENCHMARKS.md
② Comme serveur MCP — Claude Code, Cursor, Cline, Zed
{
"mcpServers": {
"engram": {
"command": "engram",
"args": ["mcp"],
"env": { "ENGRAM_HOSTED": "1" }
}
}
} Redémarre ton hôte ; les outils de mémoire deviennent appelables avec zéro clé API. Le moteur se distribue actuellement sous le nom engram — le renommage en Verimem est en cours.