mnest — la traccia di co-attivazione fra due executorQuesto documento definisce cosa è un mnest: la traccia, conservata nel mnestoma, di un passaggio di output fra due executor. È il secondo dei tre doc canonici introdotti dal Dialogo sugli executor e la memoria distribuita. Sostituisce e ridefinisce il vecchio synapse.html: cambia il nome (sinapsi → mnest) e cambia la semantica (la sinapsi era una «concomitanza» passiva, il mnest è un passaggio di dati osservato).
Il documento copre:
Non copre, e demanda altrove:
Un mnest è un nodo del mnestoma che registra un fatto specifico:
Il mnest è quindi una traccia di co-attivazione osservata: non un'inferenza statistica a posteriori, non una dichiarazione di intenti, ma una constatazione di un evento davvero accaduto, registrato dal gateway al termine del turno.
Da qui derivano tutte le sue proprietà importanti:
La microprogettazione precedente (synapse.html, oggi deprecata) chiamava questa entità sinapsi e la descriveva come «un collegamento dichiarato o osservato fra neuroni: quando si attiva A, tende ad attivarsi anche B». La ridefinizione del 2026-04-24 cambia tre cose:
| Aspetto | Sinapsi (v1.0, deprecata) | Mnest (v1.1, canonico) |
|---|---|---|
| Cosa registra | Una correlazione di attivazioni: «A acceso, poco dopo B acceso». | Un passaggio di dati: «l'output di A è stato l'input di B». |
| Generazione | Inferita da osservazione statistica delle co-occorrenze nelle finestre di tempo. | Generata in modo deterministico dal gateway alla chiusura del turno: o c'è stato il passaggio o non c'è stato. |
| Significato per la sintesi | Una sinapsi forte suggerisce una vicinanza concettuale. | Un mnest forte verso un executor che non esiste (proto-mnest, cap. 8) è un buco operativo concreto, non un'analogia. |
Il guadagno della ridefinizione è che il mnest vede dati che si sono mossi, non solo eventi che si sono accesi. Un grafo di mnest è un grafo di flussi reali; un grafo di sinapsi era un grafo di indizi.
Un mnest, in forma serializzata, contiene questi campi obbligatori:
{
"id": "mnest_01HW...", // ULID
"src_executor": "fs_read", // nome canonico del chiamante
"src_version": "1.0.0",
"dst_executor": "pdf_extract", // nome canonico del chiamato
"dst_version": "2.0.0",
"weight": 0.42, // [0..1], normalizzato
"uses": 17, // contatore d'uso totale
"ts_first": "2026-03-12T18:04:00Z",
"ts_last": "2026-04-23T09:21:00Z",
"decay_lambda": 0.018, // /giorno, vedi cap. 6
"tags": ["fattura", "pdf"], // facoltativi
"state": "active" // active | proto | decaying | superseded
}
Tre invarianti valgono sempre:
(src_executor, src_version, dst_executor, dst_version) è chiave: può esistere al massimo un mnest attivo per quella tupla.weight è sempre in [0, 1], calcolato come funzione esponenziale del numero di usi recenti (vedi formula al cap. 6).ts_last >= ts_first; uses >= 1.I tag sono un'aggiunta opzionale che non influenza il calcolo del peso, ma serve all'ager e al synt per identificare cluster di mnest che vivono nello stesso dominio applicativo (per esempio «fattura», «foto», «email lavoro»). I tag vengono propagati dal contesto del turno al mnest in nascita; l'utente li può ribattere o cancellare in fase di rilettura.
Un mnest non si dichiara, si osserva. La regola operativa, applicata dal gateway alla chiusura di ogni turno:
(A, ver_A, B, ver_B);uses, aggiorna ts_last, ricalcola il peso;uses=1, weight iniziale, state="active".Il peso di un mnest è aggiornato a ogni evento secondo una formula con due componenti:
weight(t) = clamp01( weight(t-Δt) * exp(-λ * Δt) + reinforcement(t) )
Δt è il tempo (in giorni) trascorso dall'ultimo aggiornamento.λ è il decay lambda, parametrizzabile per tag (default 0.018/giorno: dimezzamento in ~38 giorni).reinforcement(t) è +0.15 per ogni uso registrato nel turno corrente, saturato dal clamp01.
La curva è ispirata al modello di Ebbinghaus, ma il valore di
λ è conservativo: a parità d'uso, un
mnest non si dimentica mai del tutto in tempi rapidi. La gradualità
serve a evitare oscillazioni dovute a periodi di vacanza, malattia,
distrazione: l'utente vuole che, quando torna, Metnos ricordi.
| Soglia | Valore di default | Effetto |
|---|---|---|
| peso minimo proto | 0.05 | Sotto questo valore, il proto-mnest è rimosso (anti-rumore). |
| peso decay | 0.20 | Sotto questo valore, il mnest entra in stato decaying: l'ager lo segnala. |
| peso archive | 0.05 | Sotto questo valore (e con uses ≥ 1 ma ts_last ≥ 90 giorni fa), proposta di archiviazione. |
| peso bootstrap | 0.30 | Peso iniziale dei mnest seed (creati al primo avvio). |
| Stato | Significato | Transizioni |
|---|---|---|
proto | Il mnest registra un passaggio verso un executor che non esiste (vedi cap. 8): dst_executor punta a un nome non risolto. | → active alla nascita dell'executor mancante; → cancellato se peso scende sotto la soglia proto. |
active | Mnest «normale»: due executor reali, uso recente. | → decaying sotto la soglia di decadimento; → superseded dopo una fusione. |
decaying | Peso sotto soglia, segnalato dall'ager. Ancora invocabile, ma proposto per archiviazione. | → active per uso ripreso; → archiviato (rimosso dal grafo attivo, conservato nello snapshot mensile). |
superseded | Sostituito da un mnest più recente o da un executor fuso (vedi executor.html cap. 6). | → archiviato dopo un periodo di grazia. |
Il proto-mnest è un mnest in stato
proto: registra che, in un turno, Metnos ha desiderato
passare l'output di un executor a un secondo executor che non
esiste ancora. La struttura è quasi identica a quella di un
mnest normale, con due differenze:
dst_executor è un «nome desiderato», non un nome risolvibile (per esempio: extract_invoice_number);dst_version è null;desired_signature con la sintesi della firma attesa: che cosa l'executor dovrebbe fare, quale forma di output, quali errori tipici.{
"id": "mnest_01HW...",
"src_executor": "fs_read",
"src_version": "1.0.0",
"dst_executor": "extract_invoice_number", // non esiste
"dst_version": null,
"desired_signature": {
"summary": "Estrarre il numero fattura da un PDF.",
"inputs": ["bytes (pdf)"],
"outputs": ["str (codice alfanumerico)"],
"errors": ["NotFound", "Unparseable"]
},
"weight": 0.34,
"uses": 4,
"state": "proto"
}
La differenza con «una richiesta di feature» nel senso classico è importante: il proto-mnest non è chiesto dall'utente, è constatato dal gateway. Roberto non ha formulato il bisogno: il bisogno è emerso dal fatto che l'avrebbe voluto più volte. Il proto-mnest, quando ricorre, è l'innesco della sintesi (vedi executor.html cap. 7).
| Componente | Cosa cerca |
|---|---|
| Gateway (planner) | Dato un input, propone all'LLM una lista di executor candidati ordinata per peso dei mnest che li raggiungono dal contesto attuale. |
| Vaglio | Per giudicare una proposta spontanea: un mnest forte verso un'azione già svolta in passato è un indizio di allineamento al telos. |
| Synt | Cerca proto-mnest che hanno superato una soglia di ricorrenza per innescare la pipeline di sintesi. |
| Ager | Scorre periodicamente il grafo per applicare il decadimento, segnalare i decaying, proporre archiviazione dei superseded. |
| Osservabilità | L'utente può ispezionare il grafo (lista, filtri per tag, top-k per peso) per capire cosa Metnos «pensa di sapere fare insieme». |
I mnest vivono in workspace/.mnestoma/mnest.sqlite:
mnests con i campi del cap. 4 + indici su (src_executor, dst_executor) e weight;events append-only con i singoli rinforzi, per poter ricostruire lo storico del peso (utile per debug e per ager);v_mnestoma che proietta lo stato corrente del grafo (active + proto), per le query di lettura.
Il sistema fa uno snapshot mensile del file SQLite in
workspace/.mnestoma/snapshots/YYYY-MM.sqlite. Lo snapshot
serve a tre cose: rollback in caso di danneggiamento del file vivo,
analisi storica del grafo, traccia per chi vuole capire come si
è mosso Metnos nel tempo. Gli snapshot più vecchi di 12
mesi sono compressi in .zst ma non eliminati.
Il file SQLite vivo è incluso nel backup notturno del workspace (vedi workspace.html, da riscrivere) con le stesse politiche di tutto il resto del workspace. La perdita del mnestoma non è catastrofica (il sistema riparte vuoto e si ricostruisce dall'uso) ma è uno dei dati più preziosi: contiene la storia operativa che Metnos ha imparato a riconoscere.
Per fissare i concetti, ecco una sequenza tipica di mnest che si forma attorno al flusso «archivia una fattura PDF»:
1. fs_read v1.0 → pdf_extract v2.0 (peso 0.85, uses 47, "fattura")
2. pdf_extract v2.0 → invoice_classify v1.0 (peso 0.78, uses 41, "fattura")
3. invoice_classify → workspace_save v1.0 (peso 0.81, uses 44, "fattura")
# proto-mnest che ricorre ma non è ancora un executor:
4. pdf_extract v2.0 → extract_invoice_number (peso 0.34, uses 4, "fattura")
Il quarto, se continua a ripetersi, alzerà il peso fino alla
soglia di sintesi e il synt proporrà a Roberto la
sintesi del nuovo executor extract_invoice_number. Una
volta approvato e firmato, il proto-mnest passerà ad
active con il dst_version reso concreto.
λ diverso per executor side-effect-free vs side-effect-pieni? Aperta.
Metnos — mnest microprogettazione v1.1 — 2026-04-24
Doc canonico nuovo. Sostituisce synapse.html (deprecato).