Metnos è un maggiordomo digitale per casa: un assistente AI che vive su un computer di famiglia, parla attraverso i canali che già usi (terminale, Telegram, in futuro voce), esegue azioni reali (leggere file, lanciare comandi, consultare il web) ma chiede il permesso prima di fare qualcosa di serio.
L'analogia del maggiordomo è utile. Un buon maggiordomo:
/etc né ~/.ssh);metnos.com);
Metnos è il nome del processo che gira sul PC
(${METNOS_HOME}/, myclaw-gateway.service). Sono lo
stesso sistema visto da due angolazioni: fuori come nome, dentro come codice.
Tecnicamente è un processo Python ≥ 3.11 che gira a
${METNOS_HOME}/, composto da quattro strati (gateway, policy,
sandbox, workspace/tool). Ogni servizio AI (LLM, STT, TTS, embedding,
speaker-ID) viene consumato tramite un'interfaccia astratta
— Metnos è provider-agnostic per costruzione. Nel caso
specifico dell'ambiente dell'autore l'interfaccia è realizzata da
suprastructure, un package sibling preesistente; in un altro
ambiente potrebbe essere realizzata da qualunque adapter equivalente.
| Obiettivo | Cosa significa concretamente |
|---|---|
| Self-hosted | Vive su una macchina sotto il controllo fisico e legale dell'utente (nel nostro caso il metnos-server). Il laptop e il telefono sono clienti che la interpellano, non la sede di Metnos. Il cloud resta una possibilità opzionale (modelli linguistici remoti, canale Telegram), mai luogo di residenza. Vedi cap. 4 per la topologia per intero. |
| Sicuro di default | Ascolto in locale (127.0.0.1), livello di autonomia Supervised, sandbox obbligatoria, percorsi vietati per costruzione, conferma esplicita per le azioni rischiose. |
| Multi-canale | Stessa "mente", interfacce diverse: CLI, Telegram, poi Signal, voce, cruscotto web. |
| Estendibile | Nuovi strumenti e canali senza riscrivere il nucleo: basta conformarsi a un Protocol. |
| Senza dipendenze obbligate | Lo strato AI vive dietro un'interfaccia astratta: cambiare Claude con Ollama = una riga di configurazione, senza toccare il codice. |
| Senza apprendimento | Metnos non addestra modelli. Non fa fine-tuning. Non fa RLHF. Cambia se stesso attraverso memoria esterna all'LLM (il mnestoma, cap. 9) e attraverso la proposta di nuovi executor filtrata dall'umano (cap. 11). |
Entrambi sono progetti eccellenti e sono stati la fonte di ispirazione primaria. Entrambi però hanno tare che li rendono non-pronti per l'uso domestico qui sul mio PC:
| Progetto | Punti forti | Limiti per il mio caso |
|---|---|---|
| openclaw TypeScript, Node 24+ |
Gateway-first design, 20+ canali, sandbox pluggable (Docker/SSH/OpenShell), skills registry, routing multi-agente | Stack Node estraneo ai miei progetti, default più permissivi, sandbox orientate al cloud |
| zeroclaw Rust 2024 |
Footprint minimo, livelli di autonomia, sandbox a strati (Landlock+Bubblewrap), DM pairing, auth criptato, 129+ test di sicurezza | Rust reintroduce uno stack separato; riscrive da zero il layer LLM/STT/TTS che io ho già risolto con un'interfaccia astratta e una sua implementazione (nel mio caso suprastructure) |
La decisione: prendere i pattern migliori di entrambi (gateway-first di openclaw, autonomy+pairing+sandbox-a-strati di zeroclaw) e reimplementarli in Python, dove:
Prima di entrare nella tecnica, fissiamo cosa Metnos deve essere. Quattro aggettivi, non in ordine di importanza ma in ordine di difficoltà crescente. Il quarto è la novità della v1.1 delle prospettive: prima c'erano tre, ora sono quattro.
| Aggettivo | Che cosa chiede al sistema | Antitesi — la tentazione opposta |
|---|---|---|
| Utile | Fa cose reali per l'utente, non dimostra di essere intelligente. Legge il log, archivia la fattura, ricorda la scadenza. | Demo impressionante ma inutile; agente che parla benissimo e fa poco. |
| Intelligente | Quando tocca la lama dell'LLM lo fa bene: buoni prompt, buoni tool, contesto non rumoroso. | Agente cablato rigidamente a if/else che non sfrutta nulla della flessibilità dei modelli linguistici. |
| Autonomo | Decide da solo quando fare qualcosa senza disturbare, e quando invece fermarsi e chiedere. | Due estremi entrambi tossici: l'agente che chiede conferma per tutto, e l'agente che fa di testa sua senza fermarsi mai. |
| Proattivo | Anticipa, propone, ricorda. Non solo reagisce ma avvia. | L'agente passivo che aspetta sempre un prompt. — Ma anche, all'opposto, l'agente molesto che propone a raffica. |
Il quarto aggettivo è quello che alza l'asticella. Un agente solo reattivo è un chatbot con tool. Un agente proattivo deve avere un motivo per agire, e un freno per non esagerare. Motivo e freno sono il contenuto dei capitoli 9, 10 e 11.
Metnos non vive sul laptop. Vive su un server Linux acceso ventiquattro ore su ventiquattro, e il laptop — come il telefono, come il browser di un dispositivo in viaggio — è un cliente che lo interpella. Questo capitolo, nuovo rispetto alla v1.0, spiega perché è così e cosa ne consegue; in fondo apre la porta a una direzione futura importante: gli executor remoti.
Il termine local-first ha nella letteratura (Kleppmann 2019) un significato preciso che mescola due proprietà: (a) i dati vivono sulla macchina dell'utente; (b) il sistema funziona anche offline. La v1.0 aveva preso entrambe come obiettivo. Messo alla prova della vita reale di una famiglia, il quadro cambia.
La proprietà che davvero conta è la (a): i dati e la logica non stanno in cloud di terzi. Il motivo è di sovranità, di privacy, di assenza di vincoli al fornitore. La proprietà (b) — "funziona offline" — è per noi una mezza verità: un agente che orchestra modelli linguistici, richieste al web e notifiche non è comunque utile senza rete. Se non c'è rete, anche il laptop — nell'ipotesi in cui Metnos vivesse lì — non potrebbe chiamare un modello linguistico, consultare una pagina web, mandare un messaggio.
La v1.1 riformula il principio: Metnos è self-hosted,
non "local-first" in senso stretto. Il dato e la logica vivono su una
macchina sotto il tuo controllo fisico e legale — nel nostro caso
metnos-server, il server di casa. Nessuna dipendenza da fornitori
terzi, nessun canale obbligato verso server di terzi. La nuvola resta
una possibilità opzionale (modelli linguistici remoti, canale
Telegram) ma mai come luogo di residenza.
Pensare il problema bene significa enumerare le alternative prima di decidere. Cinque topologie erano (sono) plausibili per un agente domestico di questa forma:
| # | Topologia | Vantaggi | Costi / perché non va (per ora) |
|---|---|---|---|
| A | Metnos su metnos-server, laptop = cliente.Scelta attuale. |
Coerenza totale (una sola istanza, un solo mnestoma, un solo registro d'audit). Isolamento serio (bubblewrap, landlock). Risorse adeguate per modelli linguistici locali. Proattività sempre desta: il cron lavora anche quando il laptop dorme. |
Fuori dalla LAN serve un overlay di rete per raggiungerlo (→ Headscale). |
| B | Metnos sul laptop, che chiama metnos-server come macchina dedicata ai modelli linguistici. |
Metnos è "con te". Accesso diretto ai file del laptop. | Windows non ha un equivalente di bubblewrap / systemd-run / landlock: l'isolamento diventa debole. Il laptop dorme → la proattività muore con il coperchio chiuso. Memoria fragile (se perdi il laptop perdi tutto, salva la copia sincronizzata). |
| C | Due istanze (una per macchina), mnestoma sincronizzato. | Sempre disponibile, ovunque. | Sincronizzazione distribuita di un grafo di memoria: CRDT, conflitti, elezione del primario. Complessità fuori scala per un agente domestico. Doppia superficie di attacco. |
| D | Metnos su metnos-server, laptop ridotto a terminale puro. |
Massima semplicità. | Alcune azioni utili richiedono risorse del laptop (catturare un'istantanea dello schermo, leggere un file non sincronizzato, pilotare un'applicazione Windows). D le lascia fuori. |
| E | Gateway su metnos-server, alcuni executor girano sul laptop (executor remoti).Direzione futura. |
Unica fonte di verità (mente, memoria, regole su metnos-server), ma accesso alle risorse dei dispositivi dove serve. |
Apre un abisso di considerazioni di sicurezza e affidabilità (vedi più sotto). Non è giusto affrontarle alla prima ora. |
La scelta pragmatica: A come base, con E come direzione esplicita verso cui Metnos può crescere.
metnos-server, sempre acceso e con risorse adeguate; i client (laptop, telefono) lo raggiungono in LAN, via overlay Headscale self-hostato se fuori casa, o via Telegram se più comodo. Non si esce mai dalla sovranità dell'utente.| Canale | Dove funziona | Come |
|---|---|---|
| CLI / cruscotto in LAN | Laptop a casa, stessa rete di metnos-server |
Connessione diretta all'IP metnos-server. Latenza minima. Il canale di uso quotidiano. |
| Overlay Headscale | Laptop fuori casa, ovunque ci sia Internet | WireGuard fra pari verso metnos-server, come se fossi in LAN. Anche il piano di controllo (Headscale) gira su metnos-server: nessun server di coordinamento di terzi. |
| Telegram | Telefono, laptop di un amico, qualunque dispositivo con Telegram | Il bot interroga in uscita metnos-server → api.telegram.org: non servono porte aperte, non serve IP pubblico. Il contenuto passa per Telegram (compromesso noto: canale già nostro per scelta). |
C'è un quarto scenario — sei in aereo, la casa non ha rete per
un'interruzione di corrente: nessun canale raggiunge metnos-server,
Metnos è inattivo per te. È un caso degradato accettabile,
simmetrico a quello di qualsiasi servizio: senza rete non si fa molto.
Molti dei file che vorrai far elaborare a Metnos nascono sul laptop
Windows (fatture, foto, codice di lavoro), ma Metnos gira su
metnos-server. Risolviamo il gap in modo modulare, a
partire dalla soluzione più semplice:
| Livello | Strumento | Quando ha senso |
|---|---|---|
| 0 (dal primo giorno) | Syncthing: una cartella ~/metnos-share/ sul laptop, replicata in tempo reale su metnos-server. |
Nessun server intermedio, sincronizzazione fra pari cifrata, funziona anche sotto Headscale. Metnos vede una cartella locale; non sa nulla della sincronizzazione che la tiene aggiornata. |
| 1 | Nextcloud self-hostato su metnos-server, applicazione desktop sul laptop. |
Se e quando servono interfaccia web, versionamento, condivisione, applicazione mobile. Più potente, più lavoro iniziale. |
| 2 | Executor remoti (vedi sezione successiva). | Quando serve agire sul laptop, non solo vedere file. Per esempio: catturare un'istantanea dello schermo, pilotare un'applicazione Windows, leggere un file che non sta nella cartella condivisa. |
Si parte dal livello 0. Si sale solo quando la carenza si fa sentire in un caso concreto. La semplicità (principio 6) prevale.
L'opzione E della tabella sopra è la più interessante
strutturalmente. Al posto di pretendere che tutti i file finiscano nella
cartella condivisa, si introduce un'idea semplice: gli executor
non vivono tutti su metnos-server. Alcuni girano sul
laptop, sono esposti a metnos-server tramite l'overlay Headscale, e
quando Metnos li invoca riceve il risultato come se fossero locali. Un
unico gateway, un'unica regola, un unico mnestoma; braccia
distribuite.
Non è solo un'ottimizzazione. Per certi casi d'uso diventa
l'unica modalità sensata. L'esempio che fissa l'idea:
riordinare un archivio fotografico di diecimila file sul laptop. La
soluzione "sincronizza tutto su metnos-server, riordina, risincronizza
indietro" comporta gigabyte di traffico, doppia occupazione del disco,
finestre temporali in cui lo stesso file esiste in due stati su due
macchine, il rischio concreto di conflitti durante l'operazione. Una
rinominazione sul posto, eseguita direttamente sul laptop, risolve in un
secondo ciò che la copia impiegherebbe minuti, senza sprecare
spazio e senza rischio di divergenza. Esempi affini: portare in primo
piano un'applicazione, leggere un file che per dimensioni o per natura
non sta nella cartella condivisa, pulire una vecchia cartella scaricamenti,
modificare i permessi di una gerarchia.
Il quinto principio (cap. 14) dice che ogni atto evolutivo è
reversibile. Vale anche per le azioni remote: prima di eseguire
un'operazione che modifica lo stato del laptop, Metnos conserva
su metnos-server un'istantanea del "prima" — solo
quello che serve per tornare indietro, non i dati per intero quando non
occorre. Per un blocco di rinominazioni foto il "prima" può essere
un semplice elenco (percorso_originale, nuovo_percorso, size, hash)
firmato e datato. Se Roberto dice "annulla", Metnos legge il manifest e
manda al laptop lo stesso schema invertito. La duplicazione è
minima (kilobyte, non gigabyte), la reversibilità resta completa, e
il registro d'audit su metnos-server conserva la traccia di entrambi i
lati. Nei casi più rischiosi (per esempio un'eliminazione
definitiva), il manifest può essere promosso a istantanea dei soli
file toccati, conservata finché Roberto non dice "conferma".
metnos-server.
L'executor remoto deve essere un piccolo processo confinato, senza
accesso all'intero filesystem dell'utente, con un elenco di operazioni
consentite verificato anche sul laptop e non solo
su metnos-server.Per questo, anche se la direzione è inevitabile, non si fa tutto subito. La regola è: si introduce un executor remoto alla volta, motivato da un caso d'uso concreto che la cartella condivisa non riesce a coprire. Quel singolo executor nasce con tutte le garanzie della lista qui sopra e il suo contratto vive in un documento di microprogettazione dedicato. La roadmap (cap. 17) colloca il primo executor remoto come fase ideale 5+, ma quel numero non è intoccabile: se un caso d'uso prioritario lo richiede prima — riordinare le foto è il candidato più naturale — la fase si anticipa; i requisiti di sicurezza no.
Un agente che fa tutto quello che vuole è pericoloso. Un agente che chiede conferma per tutto è inutile. Tra i due estremi non c'è una sola tensione, ce ne sono tre. La parola "sicurezza" le confonde tutte sotto un unico termine; questo capitolo le separa, perché solo separate si possono trattare in modo onesto.
Distinguere all'inizio paga interessi per tutto il documento. Le tre parole che ci servono sono safety dell'identità, safety del perimetro e robustezza. La prima è una sola cosa intera; la seconda ha un nucleo e un guscio; la terza è un asse a sé. Tutte e tre stanno in un certo rapporto con la libertà di Metnos, ma il rapporto cambia di natura. Il punto del capitolo è insegnare a riconoscere quale dei tre rapporti si sta esercitando in un momento dato, perché applicarne il criterio sbagliato è un errore frequente di progetto.
| Parola | Cosa protegge | Esempi di violazione |
|---|---|---|
| Safety dell'identità | Che chi parla, chi decide, chi esegue dentro Metnos sia davvero Metnos: l'utente fidato, il proprio LLM, i propri executor firmati, le proprie regole. Riguarda autenticazione, firme, pairing. | Una prompt injection nascosta in una pagina web convince l'LLM a rivelare un segreto. Una dipendenza compromessa diventa un executor. Un messaggio Telegram di uno sconosciuto non pairato impartisce un comando. Un executor remoto non autenticato invoca rm -rf. |
| Safety del perimetro | L'estensione di ciò che Metnos può vedere e toccare: cartelle, comandi shell, rete in uscita, dispositivi esterni. Riguarda il recinto dentro cui l'agente agisce. | Un executor con accesso all'intero filesystem cancella per sbaglio una cartella di sistema. Un comando shell senza confini tocca i file di un altro utente. Un'uscita di rete non controllata raggiunge un servizio non previsto. |
| Robustezza | Che le azioni che Metnos compie davvero non corrompano, non perdano, non lascino strade chiuse. Riguarda gli effetti a valle, non la legittimità di chi agisce. | Un blocco di rinominazioni fallisce a metà e lascia file in stato incoerente. Un cron dimenticato sovrascrive un file in uso. Un bug cancella la riga sbagliata di un csv. Un executor remoto perde la connessione e non torna indietro. |
| Libertà | La latitudine con cui Metnos agisce senza disturbare e senza chiedere conferma. Quanto Roberto tollera di non essere interpellato. | — (la libertà non è una cosa da violare; è una cosa che si concede male o si concede bene.) |
Tre cose, tre relazioni diverse con la libertà. La parte centrale di questo capitolo le esamina una alla volta.
La safety dell'identità non è un limite della libertà di Metnos: è la sua condizione preliminare. Se l'identità cede — LLM dirottato da prompt injection, dipendenza maligna che si traveste da executor, comando ricevuto da uno sconosciuto credendolo l'utente — non c'è più "Metnos che agisce liberamente": c'è qualcun altro, vestito da Metnos, che agisce al posto suo. La libertà di Metnos non può essere la libertà di un impostore.
Per questo gli strumenti di safety dell'identità non sono negoziabili. Non c'è un livello di autonomia che li allenta, non c'è un profilo di sandbox che li spegne, non c'è un caso d'uso che li giustifica:
Questi strumenti non riducono la libertà: la rendono possibile. Il paragone è con le serrature di casa. Una porta che si chiude non limita la libertà di chi vive dentro, limita quella di chi vorrebbe entrare senza essere invitato.
Sull'asse del perimetro il compromesso esiste, ed è serio. Allargare il recinto di Metnos — più cartelle leggibili, più comandi eseguibili, più dispositivi pilotabili — amplia ciò che può fare per te, ma amplia contemporaneamente la superficie su cui un errore (suo o altrui) può manifestarsi: una prompt injection ha più cose potenziali da chiedere; un bug di executor ha più file da poter toccare; uno strumento "vedente" può finire per vedere troppo. Più raggio d'azione, più raggio dell'eventuale danno: i due crescono insieme.
Metnos non risolve il compromesso fingendo che non esista, lo media in due livelli. C'è un nucleo duro che non si discute, e c'è un guscio modulabile intorno.
Il nucleo è ciò che resta vietato anche al più permissivo dei livelli di autonomia. Non si configura da YAML: vive nel codice e nelle Leggi, e per modificarlo serve un rito (revisione, firma, rilascio). Esempi:
~/.ssh,
~/.gnupg, le aree di sistema, la cassaforte dei segreti,
workspace/.audit/. Anche il livello Full non
li passa.bubblewrap o systemd-run con un
profilo firmato. È il processo stesso che non può
uscire dai propri limiti, indipendentemente da quello che gli si chiede
o gli si fa credere di dover fare.Il nucleo è un piccolo cerchio. Dentro non si entra mai. Il fatto che sia piccolo è importante: tutto ciò che è nel nucleo paga il prezzo della rigidità, e la rigidità ha un costo — non si può rilassare quando un caso legittimo lo richiederebbe. Mettere troppe cose nel nucleo trasforma Metnos in un sistema chiuso che non sa più aiutare.
Tutto ciò che sta fuori dal nucleo è il guscio: la latitudine d'azione che si sceglie di concedere a Metnos, modulabile per fascia. La modulazione avviene su tre leve, applicate insieme:
ReadOnly, Supervised, Full.
Definisce quali categorie di azioni Metnos può intraprendere
senza chiedere conferma. La latitudine cresce per fiducia
dimostrata.Full, certe azioni (per esempio l'invio di un
messaggio a terzi, o l'eliminazione definitiva di un file) restano
soggette a conferma esplicita. La soglia non è binaria, è
una funzione del rischio dell'azione e del livello di autonomia
attivo.Il guscio si può allargare e restringere in vita. Si parte da configurazioni strette e si rilassa solo quando l'uso lo richiede e la storia lo giustifica. La direzione opposta — partire larghi e restringere "se succede qualcosa" — non si pratica: i guai sui gusci sono in larga parte irreversibili.
Sul terzo asse il compromesso ha forma diversa. La libertà di Metnos di agire senza chiedere conferma compete con il rischio di azioni che non si possono annullare. Anche qui c'è un principio preciso, ed è economico, non ideologico:
| Tipo di errore | Esempio | Recuperabile? |
|---|---|---|
| Perdita di robustezza | File importante eliminato in modo definitivo; messaggio inviato al capo; blocco di rinominazioni interrotto a metà in stato incoerente; cron che corre in parallelo a se stesso e raddoppia un effetto. | No (o solo a costo di copie esterne: se non c'erano, nulla). |
| Restrizione di libertà | Metnos chiede conferma per un'azione che era innocua; tace una proposta che sarebbe stata utile; aspetta a fare qualcosa che avrebbe potuto fare da sé. | Sì. Roberto approva, la soglia si aggiorna per la volta dopo, il bother budget registra lo schema e si trattiene dall'interpellarlo nei casi affini. |
La reversibilità è il vero strumento che sposta l'equilibrio di questo asse, perché rende quasi-recuperabile ciò che altrimenti non lo sarebbe. Una rinominazione è più "libera" se Metnos conserva l'elenco dei vecchi nomi e sa applicarlo al contrario; uno spostamento di file è più "libero" se la copia di sicurezza esiste; un'esecuzione è più "libera" se è idempotente. Il quinto principio (cap. 14) lavora qui: la reversibilità abbassa il costo del sì.
L'asimmetria precauzionale non deve però trasformarsi in paranoia. Un Metnos che blocca sempre per "non sapere mai cosa può andar male" è un agente inutile: il costo non è solo il "non-danno", è anche il "non-valore". Roberto non vuole il cugino che chiama ogni due minuti; non vuole nemmeno il maggiordomo che chiede permesso per spostare una sedia.
L'architettura distribuisce le contromisure in modo disomogeneo sui tre assi, ed è giusto così. Vale la pena vederlo in colonna.
| Freno | Asse su cui agisce | Come |
|---|---|---|
| Costituzione (4 Leggi) | identità + perimetro (nucleo) + robustezza | Confine duro, binario. Incastonata nei prompt di ogni chiamata LLM e replicata come check a runtime. Modificabile solo per rito. |
| Sandbox + forbidden paths | perimetro (nucleo) | Impedisce tecnicamente che il processo tocchi aree critiche, anche a fronte di LLM dirottato o bug di executor. È il guscio fisico del nucleo. |
| Pairing + firme + autenticazione reciproca | identità | Chi entra deve essere riconosciuto. Mittente, dispositivo, versione di executor, canale interno. |
| Vaglio | identità (guardia) + robustezza (giudice) | La guardia è binaria sulle violazioni delle Leggi; il giudice è graduato sull'allineamento ai telos prima che un'azione produca effetti. |
| Livelli di autonomia | libertà ↔ perimetro (guscio) | ReadOnly / Supervised / Full. La latitudine cresce con la fiducia. È la principale leva esplicita sul guscio. |
| Reversibilità | robustezza | Ogni mossa ha un opposto firmato. Il sì costa meno perché l'errore è annullabile. Applicata anche agli executor remoti col modello "prima/dopo" (cap. 4). |
| Bother budget + limiti di costo | libertà (in alto) + robustezza (in basso) | La frizione cresce con la frequenza e con il costo cumulativo. Evita sia la molestia sia la corsa inflazionaria di azioni. |
Metnos è una cipolla: l'esterno parla con il mondo, l'interno esegue. Ogni strato si fida solo di quello più interno, concedendo meno privilegi man mano che si va verso il centro.
Un singolo processo FastAPI che espone HTTP/WebSocket/SSE su
127.0.0.1:42618. Riceve messaggi dai canali, gestisce le
sessioni, smista webhook, pianifica cron job. È l'unico punto di
contatto con il mondo. Non esegue mai direttamente comandi sensibili.
Il filtro di legalità e di senso. Dato un evento — "utente X chiede di fare Y", oppure "Metnos vuole proporre Z" — risponde: permesso, negato o permesso solo dopo approvazione. Applica il livello di autonomia (cap. 12), i limiti di frequenza, i tetti di costo, i percorsi vietati, e invoca il Vaglio (cap. 11) quando serve: una guardia costituzionale che blocca violazioni delle Leggi, seguita, se la guardia tace, da un giudice teleologico che misura quanto l'azione è allineata ai telos dell'utente.
Quando la policy dice "sì", l'azione non viene comunque eseguita a
mano libera. Per i tool che toccano filesystem o shell si entra in
bubblewrap (o systemd-run con hardening) con un
profilo scelto dal livello di autonomia. Niente subprocess.run
diretto, mai. Docker è un'opzione futura per il modo più
strict.
Dentro la sandbox, un executor (capitolo 9) fa il suo lavoro:
leggere un file dal workspace (${METNOS_HOME}/workspace/),
chiamare un LLM via l'interfaccia astratta, scrivere una riga nell'audit
log. Ogni volta che due executor collaborano, un mnest registra
silenziosamente l'accaduto. L'insieme di tutti i mnest forma il
mnestoma, la memoria relazionale del sistema.
Seguiamo un esempio concreto. Sei in giardino, scrivi da Telegram: "dimmi cosa c'è nel log di stasera".
C'è un secondo tipo di richiesta che non viene mai mostrata nei diagrammi classici degli agenti: la richiesta che nasce da dentro. Un cron, o il grafo delle proto-mnest (cap. 9), o una regolarità notata da Metnos stesso, genera una proposta: "vuoi che archivi le foto di stasera come fai di solito?". Questa proposta entra nello strato 2 dal basso, non dal Gateway: prima passa per il Vaglio (cap. 11) che verifica se viola una Legge e se l'allineamento ai telos è sufficiente, e solo se supera l'uno e l'altro arriva al Gateway, che la inoltra al canale preferito dell'utente come notifica leggera. Se l'utente ignora, la proposta non si ripropone identica: viene registrata e il suo peso decresce.
Un caso d'uso semplice e ricorrente della variante proattiva è
presidiare una casella di posta del dominio (per esempio
[email protected]): controllarla a un ritmo concordato,
classificare i messaggi nuovi (richieste reali, conferme automatiche,
spam mancato dal filtro, ecc.) e consegnare a Roberto un riassunto solo
quando ha senso. Le quattro mosse minime:
imap_status conta i messaggi non letti per cartella senza scaricarli.imap_fetch_headers recupera intestazioni; un classificatore (LLM local-fast, vedi cap. 8) etichetta in tre o quattro categorie.summarize produce due righe per ciascuno.notify manda il riassunto sul canale preferito di Roberto (Telegram, mail personale, voce). Il bother budget e il telos di discrezione regolano la frequenza.
Le quattro mosse non sono una nuova categoria di design: sono una
catena di executor invocata dallo
scheduler (executor builtin, cap. 9 della microprogettazione
executor) a un ritmo accettato una volta in fase di proposta. Vista dal
mnestoma, è una traccia di quattro mnest che si rinforza ogni
mattina; in tempi più lunghi synt (cap. 9) può
proporne una versione fusa, un singolo executor
email_morning_digest che incorpora la catena. Le invocazioni
programmate dallo scheduler consumano una quota separata dal bother budget
delle proposte ad-hoc, perché il consenso al ritmo è
già stato dato.
Metnos non parla mai direttamente con Claude, OpenAI, Ollama o qualunque
altro fornitore di modelli linguistici. Parla con un'interfaccia
astratta (tipicamente un typing.Protocol) che il
registro risolve a runtime in un'implementazione concreta. Lo stesso vale
per STT, TTS, embedding, speaker ID. È il pattern che rende Metnos
provider-agnostic: chi scrive Metnos non deve sapere quale modello
girerà davvero, e chi amministra l'ambiente può cambiarlo con
una riga di configurazione.
Nel diagramma che segue, Metnos è un consumer tra i possibili altri: un assistente domotico per voce e controllo casa, ulteriori bot specializzati su domini ristretti. Tutti condividono la stessa astrazione. Nessuno riscrive il layer AI: lo usa.
suprastructure) resta intercambiabile.Il vantaggio concreto: un nuovo modello (es. Claude 4.7 quando sarà disponibile) si configura una volta sola nell'implementazione dell'interfaccia e tutti i consumer lo ereditano simultaneamente — Metnos compreso. Nessun codice da rifare, nessun deploy da coordinare.
Qui entriamo nel cuore del secondo dialogo. Due domande che sembrano diverse ma sono la stessa: come agisce Metnos? e come ricorda?. La risposta è un piccolo vocabolario di cinque parole. Impararlo bene ora paga il resto del documento.
fs_read,
web_fetch, ocr_image, telegram_send,
archive_pdf, e così via. Nel codice, un executor
implementa il Protocol Tool. Nel disegno concettuale, un
executor è un nodo del grafo di cui parliamo tra poco.
Roberto riceve una fattura in PDF. Metnos la legge
(fs_read), estrae il testo (pdf_ext), archivia
(archive), notifica (notify). Ogni passaggio di
mano tra due executor incrementa il peso del relativo mnest. Dopo un mese,
la traccia "fatture" ha quattro nodi densamente connessi.
Un giorno arriva una fattura che contiene solo un'immagine scansionata.
pdf_ext restituisce stringa vuota. Metnos cerca un executor
che sappia fare OCR. Non c'è. Registra un proto-mnest: "da
pdf_ext vorrei andare a un ipotetico ocr, che
non esiste". Dopo cinque fatture scansionate (tutte con lo stesso
proto-mnest) il synt (cap. 10) propone all'utente: "sto incontrando
ripetutamente PDF-immagine. Vuoi che provi a sintetizzare un executor
ocr_image?". Se Roberto approva, nasce un executor nuovo.
Quando un proto-mnest ricorre, il synt non salta subito a scrivere codice nuovo. Procede per gradi, in una cascata che mette al primo posto il riuso. Il principio è pratico, non estetico: una chiamata a un LLM frontier per generare uno scheletro di executor costa attorno all'euro; cercare una catena di executor già firmati che risolve la stessa cosa non costa nulla. Disciplina del costo e disciplina della libreria coincidono.
A questi due passi reattivi (che rispondono a una richiesta dentro il turno) si affiancano tre passi introvertivi, eseguiti nottetempo dall'ager sul mnestoma e sul pool firmato:
Tutti i passi introvertivi sono proposte: arrivano a Roberto in modo batch, con la stessa pipeline di approvazione di un executor di sintesi reattiva. Niente si sposta nel pool senza firma. La libreria non degrada perché ogni passo, prima di entrare, attraversa la guardia umana.
Un grafo che cresce per accumulo e non si disfa è una discarica. Metnos ha tre meccanismi per restare maneggiabile: emergenza di tracce (la struttura si auto-organizza), ager (invecchiamento per uso, non per calendario), reversibilità (ogni mossa evolutiva ha il suo opposto).
Su scala settimanale, un processo leggero misura la modularità del grafo mnestoma — un'idea che arriva dalla network medicine: cluster di nodi con alta densità interna e bassa densità esterna sono tracce naturali. Metnos non le progetta, le rileva. "Fatture", "foto", "mail" nella figura 5 sono tre tracce emerse.
Le tracce hanno due conseguenze concrete:
Se vai in vacanza un mese e spegni il computer, non vuoi trovare al ritorno Metnos invecchiato di un mese. Il tempo dell'ager è il tempo dell'uso: i cicli avanzano con le invocazioni, non con i giorni. Un sistema che dorme non invecchia. Sembra una sfumatura; non lo è. Il tuo mnestoma è legato a quanto lo hai usato, non a quanto tempo è passato.
Ogni N invocazioni (50, 100 — il parametro è nel file di configurazione) l'ager:
Propone, non esegue. L'ager non ha potere di decisione autonomo. Porta la lista, l'utente decide. Come ogni cosa in Metnos.
Il quinto principio (cap. 14) dice: ogni atto evolutivo è reversibile, con motivazione scritta. Le operazioni hanno nomi specifici:
| Mossa | Cosa fa | Come si torna indietro |
|---|---|---|
| Sintesi (synt) | Crea un nuovo executor da un proto-mnest ricorrente, con approvazione umana. | Archivia l'executor; i mnest che lo coinvolgono vanno in stato "superseded". |
| Fusione | Fonde E1 + E2 in un executor E12 più generale, dentro la stessa traccia. | Defuse: E12 viene dismesso, E1 e E2 tornano attivi, il loro mnest riprende ad aggiornarsi. Motivazione obbligatoria. |
| Archiviazione | Marca come non-attivo un executor in quarantena da troppo tempo. | Ripristino: l'executor torna attivo; il peso iniziale è basso, dovrà riguadagnarselo. |
| Freeze | Dichiari freeze; Metnos salva un mnestshot, ferma ager e decadimento. | Defrost: riparte esattamente dallo stato precedente. Il tempo, nel freeze, non è scorso. |
Un sistema proattivo che non si ferma è un sistema molesto. Un sistema proattivo che si ferma sempre non è proattivo. La coppia telos + vaglio è il meccanismo che regola questo equilibrio. I telos danno il motivo di proporre; il Vaglio decide se la proposta si merita davvero la tua attenzione.
TELOS.md è uno dei cinque file del workspace (cap. 13).
Contiene da tre a sette frasi brevi che descrivono cosa, nella vita
quotidiana, l'utente vuole che Metnos favorisca. Non sono KPI.
Sono tendenze morbide.
### TELOS.md (esempio) 1. Liberare il mio tempo: preferisci ciò che riduce il mio carico manuale ripetitivo. 2. Ordine, non perfezione: meglio una casa di file a posto al 70% in automatico, che uno sforzo continuo per averla perfetta. 3. Nessuna sorpresa sulle spese: soglie chiare, notifiche tempestive. 4. Solitudine protetta: non disturbarmi la sera dopo le 21, salvo urgenze reali. 5. Coltivare gli strumenti: se ti chiedo qualcosa che il tuo pool non sa ancora fare, esaurisci le strategie di sintesi (comporre, generare, chiedere) prima di rispondere "non posso". Il fallimento è lecito, la rinuncia silenziosa no.
Ogni proposta spontanea di Metnos passa per una funzione di allineamento: quanto la proposta favorisce ciascun telos, pesato per la loro importanza relativa. Il risultato è un numero tra 0 e 1. Se è sopra la soglia, la proposta arriva. Se è sotto, resta muta e finisce in un registro di "proposte non fatte", utile per capire in retrospettiva se i telos pesavano davvero come credevi.
Prima che una proposta, spontanea o richiesta, arrivi all'utente, passa per il Vaglio. Il Vaglio ha due fasi in ordine fisso.
Se mescolassi "è lecito?" e "quanto vale?" in un solo punteggio, otterresti ciò che la letteratura chiama self-enhancement bias: il modello tende a giustificare le sue proposte. Separare deontologia (binaria) e teleologia (graduata) è una scelta progettuale precisa. E c'è di più: il giudice teleologico è un LLM diverso dal proponente — contesto separato, prompt separato, possibilmente provider separato. Indipendenza strutturale, non dichiarata.
Il componente di microprogettazione dedicato è vaglio.html; quello dei fini è telos.html. Lì ci sono le tipologie dati, i Protocol, i test di conformità.
Anche con l'allineamento alto, c'è una cosa che il Vaglio valuta: quante proposte ho già fatto di recente?. Il bother budget è un freno moltiplicativo che degrada l'allineamento quando Metnos ha già parlato troppo in una finestra temporale. È la traduzione meccanica di "non essere il cugino che chiama a ogni pensiero".
Concetti ripresi e adattati da zeroclaw. Ogni sessione gira a un livello di autonomia dichiarato; il livello determina quanto Metnos può fare prima di dover chiedere conferma. Ortogonale all'autonomia, il pairing distingue un familiare da uno sconosciuto su canali multi-utente come Telegram.
| Livello | Default per | Cosa può fare senza chiedere | Cosa richiede approvazione |
|---|---|---|---|
| ReadOnly | Primi collegamenti, ospiti | Leggere file nel workspace, chiamare LLM, fare web search | Ogni scrittura, ogni comando shell, ogni invio messaggio esterno |
| Supervised default |
Uso quotidiano | Quanto sopra + scrittura nel workspace, comandi della shell allowlist, proposte via Vaglio sopra soglia | Scrittura fuori dal workspace, comandi non-allowlist, cost > soglia, invio verso terzi |
| Full | Sessioni amministrative esplicite | Quasi tutto dentro il dominio di casa | Azioni toccando forbidden paths (/etc, ~/.ssh, ...): sempre negate, non approvabili |
Full non passa. Lista minima: /etc, /root,
~/.ssh, ~/.aws, ~/.config/claude,
/var/backups, cartelle di altri progetti in /opt/
diverse da Metnos.
Un canale come Telegram è inerentemente multi-utente: chiunque conosca l'handle del bot può scrivergli. Il pairing è il meccanismo che distingue un familiare da un estraneo.
La "personalità" di Metnos non è in un file
Python. È nel workspace/, in sei file markdown che
Roberto può editare quando vuole senza restart. L'idea viene da
openclaw/zeroclaw ed è azzeccata: la configurazione comportamentale
è testo leggibile, non una struttura dati sepolta.
| File | Contenuto |
|---|---|
IDENTITY.md | Chi è l'agente: nome, tono, lingua preferita, stile di risposta. |
USER.md | Chi è l'utente principale: abitudini, fuso orario, preferenze, vincoli. |
MEMORY.md | Fatti long-term: "la password del router è in Bitwarden", "il cane si chiama X". Distinto dal mnestoma, che è memoria relazionale di come funziona il sistema; MEMORY.md è memoria dichiarativa di fatti sul mondo. |
AGENTS.md | Regole di orchestrazione: quando delegare a un sibling agent, come i canali mappano a livelli di autonomia. |
SOUL.md | Principi operativi ad alto livello: "non mentire mai sulle azioni fatte", "se in dubbio, chiedi", "self-hosted prima che cloud". |
TELOS.md | Novità v1.1. Da 3 a 7 frasi brevi: i fini ultimi sui quali il Vaglio misura l'allineamento delle proposte spontanee. Non KPI, non elenchi: tendenze morbide (vedi cap. 11). |
Questi file sono iniettati nel prompt di sistema a ogni chiamata LLM (con opportuno caching per non consumare token). Editarli è il modo primario di "riprogrammare" Metnos.
L'audit log vive in workspace/.audit/ come JSONL append-only:
una riga per ogni tool call, con timestamp, sender, azione, esito, costo
stimato. Ogni mossa evolutiva (synt, fusione, defuse, archiviazione,
ripristino) vi lascia una riga. Questo è l'unico registro che
non si disfa; la reversibilità è nello stato, non
nella storia.
Alla fine del secondo dialogo, Roberto si è imposto di contare i principi sulle dita. Il risultato è un vocabolario minimo che regge tutto il resto del documento. Se dovessi perdere tutto e dovessi ricostruire solo da sei frasi, sarebbero queste.
mnestoma/ e vaglio/. La directory workspace/ guadagna TELOS.md e il file grafo mnestoma.sqlite.metnos-server: una sola
istanza, un solo mnestoma, un solo registro d'audit. Vedi cap. 4 per
la spiegazione completa di questa scelta e per le quattro alternative
scartate.La roadmap è volutamente piccola. Passo uno alla volta, con il documento di microprogettazione che precede il codice.
| Fase | Obiettivo | Gate |
|---|---|---|
| 0 | Livello 1 completo (questo doc + dialoghi + glossario) e microprogettazione | 22 doc in docs/architecture/, tutti approvati (fatto) |
| 1 | Scheletro repo + gateway "hello world" + CLI channel + un executor sandboxato | gateway.html, channel.html, tool.html, sandbox.html — già approvati |
| 2 | Policy engine + workspace markdown + audit log + Telos loader + Vaglio minimale | policy.html, workspace.html, observability.html, telos.html, vaglio.html |
| 3 | Telegram channel + DM pairing | pairing.html + piano di contenimento danni |
| 4 | Mnestoma v1 + ager + synt con approvazione | neuron.html (da rinominare executor.html), synapse.html (da rinominare mnest.html), synthesizer.html, memory.html |
| 5+ | Canale voce, tunnel opzionale, web dashboard minimale | valutato caso per caso |
v1.1. La v1.0 è archiviata nel repository. La v2
arriverà quando la prima implementazione avrà rivelato cosa
è sopravvissuto al passaggio dal testo al codice.
Metnos — Architettura: Introduzione v1.1 — 2026-04-24
Ispirato a openclaw e
zeroclaw, costruito sopra
suprastructure.
v1.1: incorpora il Dialogo sui fini e sui limiti (telos, vaglio, 4 Leggi)
e il Dialogo sugli executor e la memoria distribuita (executor, mnest, mnestoma, tracce, ager).