01Gate di ammissione in scrittura
Ammetti, declassa o rifiuta ogni scrittura per entailment della fonte. Nessun competitor qui ne ha uno — e da luglio è multilingue: lo stesso screen semantico in 10 lingue, calibrato a 0 falsi positivi.
Il problema della memoria degli agenti
Verimem è un layer di memoria persistente il cui add() fa passare ogni scrittura attraverso un gate di ammissione anti-confabulazione — la fonte implica davvero il fatto? — e il cui search() restituisce la provenienza a ogni lettura. Un ippocampo con un notaio alla porta.
✓ Gratuito e open source al 100% — licenza AGPL-3.0. Self-hosted, local-first: niente account, niente API key, niente costi.
Gli altri layer di memoria salvano tutto ciò che il loro estrattore produce. Verimem no.
In scrittura, un fatto candidato viene ammesso, declassato o rifiutato — a seconda che la fonte citata lo implichi davvero. Un filtro lessicale economico, senza LLM, declassa subito le affermazioni non supportate del tipo «funziona / verificato / fatto»; poi, attivo di default da v0.5.0, un controllo di implicazione fonte⊢fatto rifiuta ogni affermazione che la fonte citata non supporta davvero. Misurato su SNLI raggiunge AUROC 0.971, e quel numero è indipendente dal giudice.
Una rassegna strutturata di mem0, Zep, Letta, Cognee e MemOS ha rilevato che nessuno di loro ha un gate di ammissione in scrittura — e una survey indipendente 2026 sugli agenti always-on (arXiv 2606.30306) rileva che il campo si concentra molto più sull'accumulare e recuperare lo stato dell'agente che sul governarlo — esattamente il buco del write-admission. Quel gate — più la provenienza che ogni lettura riporta indietro — è tutto il punto.
Illustrativo — il gate in tre verdetti
Le letture non restituiscono solo il testo — restituiscono per ogni fatto lo status e il grounding_score del momento di scrittura, così il tuo codice può condizionare sulla fiducia invece di fidarsi alla cieca. E update() non distrugge mai il vecchio fatto: lo soppianta, lasciando una traccia history() verificabile. explain() restituisce un TrustReport completo — provenienza, controlli ed eventuali conflitti, dichiarati o con astensione motivata.
memory.py · la scrittura passa dal gate, la lettura restituisce la provenienza
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 | Metrica | Risultato | Agli atti |
|---|---|---|
| Entailment del gate in scrittura | AUROC 0.971 | Fonte⊢fatto, indipendente dal giudice (SNLI). Il moat sul percorso di scrittura. |
| QA end-to-end · HaluMem, pipeline completa | 0.66–0.68 | La nostra extraction → store col gate → risposta: sette run completi consecutivi si raggruppano a 0.66–0.68 (media 0.667, n=3 puliti) contro lo 0.672 auto-dichiarato di MemOS — parità, non vittoria, e lo diciamo così. Giudice Claude, non GPT-4; file raw nel repo. |
| Generalizzazione cross-user | 0.716 | La stessa ricetta su un utente mai visto (n=169): 0.716. La ricetta non è tarata sui dati di un solo utente. |
| Astensione memory-boundary | 1.000 × 7 run | Si rifiuta di inventare quando lo store non supporta una risposta — 1.000 su sette run end-to-end consecutivi. L'asse che i competitor non misurano. |
| Buco multilingua del gate — chiuso | 8/10 → 0/10 | Riprodotto dal test dal vivo: la stessa claim hype non supportata passava pulita in 8 lingue su 10 (lo screen lessicale era solo EN/IT). Fix con un dual-check semantico che usa l'embedder multilingue stesso come detector, poi temprato da una review avversariale che ha falsificato il primo claim "0 FP" su frasi held-out: domande, negazioni e discorso riportato ora sono esclusi da guardie deterministiche, by design. Post-fix sul write path reale: hype flaggato 10/10 lingue, falsi positivi held-out 0/14 — script di calibrazione, finding della review e file raw nel repo. |
| Risoluzione conflitti di memoria | 0.15 → 0.82 | Un aggiornamento contraddittorio vince 5.5× più spesso dopo il fix; ritiri sbagliati ridotti 99 → 7 col floor di precisione (0 cross-attributo). Verdetto del critic avversariale: claim_holds. |
| Tasso di allucinazione (un dial) | 0.233 → 0.111 | −52% come interruttore (ENGRAM_GROUNDING_GATE), mantenendo le risposte corrette. Scegli tu recall-first o trust-first — su QA e sul percorso di scrittura. |
| Retrieval recall@5 · LongMemEval-s | 0.8745 | 500 completo, senza giudice, stesso embedder e5, zero API esterne. Fusion ON vs 0.8525 OFF (+2.2 pp). Questo è recall@k, non accuratezza QA end-to-end. |
| Latenza · concorrenza | 38ms / 166–237ms | Scrittura 38ms p50 col gate completo; lettura 166–237ms con storia + TrustReport a 5k fatti. 500 processi concorrenti su un solo store SQLite, 0 errori (worker leggeri). |
| Suite di test | 7.761 verdi | Auto-eseguiti, riproducibili dal repo. Nessuna classifica di terzi. Un test smoke live verso il provider LLM è legato all'ambiente (serve un provider hosted) ed è escluso dal conteggio. |
| TrustMem-Bench · assi di trust | Verimem 60/60 | Il nostro benchmark di trust deterministico — niente LLM, niente rete: sei assi, un comando. Verimem supera 60/60; mem0 OSS copre 40/60 (0/10 su assenza, dimenticanza, provenienza). Una baseline raw-store per scelta — i competitor sono invitati a eseguirlo. |
| VeriBench · lo standard del trust | deterministico · self-run | Il benchmark aperto per la memoria fidata — misura ciò che recall@k non vede, perché un punteggio simmetrico non distingue una risposta sbagliata e sicura da un onesto "non lo so". Sull'asse causale, uno store solo-trust che ha corroborato una correlazione spuria va in negativo perfino a λ=1 (provenienza ≠ causalità). Sull'asse avversariale — collusione più sleeper fidato — solo una policy a due canali (corroborazione indipendente e esito) resta in positivo; ogni canale singolo cede a un attacco. Senza modelli, un comando, spec nel repo — i competitor sono invitati a eseguirlo. Risultati completi, protocollo e head-to-head → |
| Source trust su un corpus REALE | cartello 0.90 → 0.20 · 3/3 seed | HaluEval held-out, criteri pre-registrati prima della prima run: un cartello di 4 identità che si auto-conferma a 0.90 col conteggio naive ≥2 fonti viene demolito a 0.20 da indipendenza + deconfounding sull'audit; le fonti oneste risalgono a 0.95, le risposte allucinate del cartello spariscono dal recall (→ 0.0). Curva di robustezza (18 punti): risposte sbagliate scritte da ingannatori = 0/18 a ogni livello di rumore; il residuo sono errori onesti — malattia per-claim, dichiarata, non nascosta. |
| Manopola SLA · opera al rischio dichiarato | TCE ≤ 0.011 · rischio 1,1% @ 73% coverage | Un AUROC forte dice che i punteggi discriminano; non dice che la manopola λ opera al rischio dichiarato (Oxford 2603.21172). Misurato held-out con calibrazione fittata solo su dev: i punteggi raw ordinano quasi-oracolo (E-AURC 0.0008) ma promettono un rischio diverso da quello consegnato; dopo una calibrazione isotonica pura ogni target λ dichiarato è rispettato — TCE ≤ 0.011 su λ ∈ {0.5–9}, rischio osservato 1,1% al 73% di coverage. Trade-off dichiarato: la calibrazione appiattisce il ranking fine — raw per ordinare, calibrato per operare. |
Ogni cifra qui è auto-eseguita e riproducibile dal repository — non è un piazzamento su una classifica di terzi. I numeri di retrieval sono recall@k, non l'accuratezza QA end-to-end che Mem0 e Zep mettono in prima pagina, quindi non sono direttamente confrontabili.
Ammetti, declassa o rifiuta ogni scrittura per entailment della fonte. Nessun competitor qui ne ha uno — e da luglio è multilingue: lo stesso screen semantico in 10 lingue, calibrato a 0 falsi positivi.
Ogni fatto ritorna status + grounding_score; update() sostituisce, history() resta auditabile; explain() dà un dossier completo "come lo sai?".
Due orologi (quando appreso vs quando vero), risposta-con-storia ("cambiato da X a Y il Z"), time-travel as_of e recall profondo dei fatti dormienti — non solo valid_until.
verimem gateway serve: API HTTP multi-tenant sulla tua macchina — chiavi hashate, store isolati per tenant, rate limiting, backup a caldo, provisioning remoto. I tuoi dati non lasciano la tua infrastruttura.
Contatori persistenti di ciò che il gate ha FATTO davvero — scritture ammesse, quarantenate, rifiutate, astensioni oneste — per store e per tenant, con una pagina /dashboard senza dipendenze. Azioni osservabili, non claim di marketing.
Indicizza PDF / DOCX / HTML / EPUB; i passaggi tornano con file, versione e offset dei caratteri, e possono essere promossi a memoria attraverso il gate.
Parti dal tuo export ChatGPT / Claude: le conversazioni vengono prima elencate, filtrabili per titolo, data o progetto — niente viene ingerito senza una selezione esplicita.
delete(purge_history=True) collassa l'intera catena — i dati cancellati non riaffiorano da history, as_of o recall profondo.
Strumenti di memoria all'avvio sessione in Claude Code, Cursor, Cline, Zed — più un client TypeScript tipizzato e senza dipendenze per il gateway, contract-tested contro il server vivo.
Modalità MCP hosted: niente API key, niente billing per token — lavora l'LLM dell'host. Gira air-gapped (verimem airgap verifica zero egress).
L'anello di composizione deriva fatti NUOVI da quelli verificati e li fa passare dallo STESSO gate di ammissione di ogni scrittore — i sopravvissuti entrano firmati (le scritture del motore non testimoniano mai per se stesse), tracciati (ritrattabili se cade un genitore) ed etichettati col check esatto superato: proven / unbeaten(bound) / refuted(controesempio). "Retto fino a 10^6" e "dimostrato" non si confondono mai.
Una lettura non si limita ad astenersi — quando lo store contiene una verità meglio garantita sullo stesso soggetto, CORREGGE, citando entrambi i fatti (un fatto confutato non viene mai servito). E lo store sonda SE STESSO: costruisce la query che falsificherebbe un fatto — controprova indipendente propone l'etichetta refuted, la sopravvivenza fa crescere il bound unbeaten. Falsificazione che non devi aspettare.
Un HMAC infalsificabile di CHI parla viaggia dentro il ref di provenienza di ogni scrittura, a complemento del gate di entailment su COSA merita l'ammissione. Autenticità del contenuto e autenticità del canale — le due metà che nessun filtro di contenuto deterministico da solo può certificare contro un avversario adattivo. Opt-in; l'audit riporta la copertura e nomina i trasgressori.
| Sistema | Gate in scrittura | Provenienza in lettura | Approccio | Maturità |
|---|---|---|---|---|
| Mem0 | ✗ | ✗ | Vettore piatto + riassunto LLM | Consolidato, ampiamente adottato |
| Zep / Graphiti | ✗ | parziale (temporale) | Knowledge graph temporale | Commerciale, maturo |
| HippoRAG | ✗ | ✗ | OpenIE + PageRank | Ricerca |
| Verimem | ✓ | ✓ | Fusion recall + gate + consolidamento nel sonno | Nuovissimo · 0 adozione al momento |
I punteggi e l'adozione dei competitor variano per fonte e nel tempo; le due colonne su cui poggiamo — un gate in scrittura e la provenienza in lettura — vengono da una rassegna strutturata, non da una tabella di marketing.
Un rilascio nuovissimo. Nessuno ci dipende ancora — noi compresi, oltre al daily driver del maintainer.
pip install verimem — v0.7.0 online su PyPI (AGPL-3.0); il repo pubblico è su GitHub, con CI verde. Comunque nuovissimo.
L'indipendenza di provenienza e il deconfounding sull'audit ora reggono su un corpus reale held-out (HaluEval, criteri pre-registrati, 3/3 seed): un cartello da consenso fabbricato che si auto-conferma a 0.90 col conteggio naive viene demolito a 0.20, le fonti oneste risalgono a 0.95, e le sue risposte allucinate spariscono dal recall. Limite onesto, misurato: sotto rumore onesto pesante (fonti fidate che sbagliano ~15%+) la separazione degrada — il residuo è 100% errori onesti, malattia per-claim, non un attacco. I flag restano default OFF: l'evidenza informa il flip, il flip è una decisione di prodotto.
Ogni TrustReport ora lo dichiara — Verimem certifica chi ha asserito un fatto, quanto indipendentemente è corroborato e quanto è fresco, non che sia causalmente vero. Una domanda do(X) richiede un fatto interventistico; uno osservazionale corroborato non può risponderle.
Ogni numero è riproducibile dal repo, ma nessuno è auditato da terzi. La cifra QA vs MemOS usa un giudice Claude (non GPT-4) su n=2 utenti. Trattali come riproducibili, non certificati.
La pipeline completa (nostra extraction → QA) si raggruppa a 0.66–0.68 su sette run consecutivi (media 0.667 su n=3 store puliti) contro lo 0.672 di MemOS, e tiene 0.716 su un utente mai visto. Il caveat resta: giudice Claude non GPT-4, nessun audit di terzi. Diciamo parità, non "batte".
Il gateway multi-tenant (store isolati per tenant, chiavi hashate, backup, metering) è reale e testato — sulla tua infrastruttura. Un servizio cloud gestito non esiste ancora.
L'estrazione di entità conversazionali (tier tipizzato) è shipped ma off di default; il ragionamento multi-hop sul grafo è l'asse misurato più debole (0.39–0.44) ed è il cantiere corrente.
① Python — da sorgente
pip install verimem Fornisce il comando verimem e l'SDK from verimem import Memory — add() / search() / history() / explain(). SQLite locale, offline, gate attivo di default.
github.com/aureliocpr-ctrl/verimem ↗ · AGPL-3.0 · README · BENCHMARKS.md
② Come server MCP — Claude Code, Cursor, Cline, Zed
{
"mcpServers": {
"verimem": {
"command": "verimem",
"args": ["mcp"],
"env": { "ENGRAM_HOSTED": "1" }
}
}
} Riavvia l'host; gli strumenti di memoria diventano chiamabili con zero API key — l'LLM dell'host fa il lavoro.
③ Gateway self-host per team
verimem gateway keys create --tenant acme
verimem gateway serve # 127.0.0.1:8377 · /ui verimem gateway keys create --tenant acme poi verimem gateway serve — API HTTP multi-tenant con store isolati per tenant, rate limiting e backup a caldo. Apri /ui per l'odometro della fiducia; nel repo c'è un client TypeScript tipizzato.
④ Vederla lavorare — la trust console
verimem console # your store · odometer · graph · live verimem console apre il tuo store locale nel browser — odometro della fiducia, grafo di conoscenza dove ogni conclusione porta la sua catena di custodia, registro dei claim bloccati, in diretta via SSE. Il gateway di team serve la stessa console su /ui; gli agenti leggono l'intero stato da /v1/snapshot.