Quick tour & survival kit · giugno 2026

Metnos

Un assistente personale che vive su un server Linux a casa vostra. Pianifica con un LLM locale, si costruisce da solo gli strumenti che gli mancano dentro un vocabolario chiuso e verificabile, chiede il permesso prima di ogni azione che tocca il mondo — e quando dice di aver fatto una cosa, l'ha fatta davvero.
mētis (μῆτις) «intelligenza astuta» + noûs (νοῦς) «mente»
77executor firmati
23 × 22verbi × oggetti, vocabolario chiuso
2 660test automatici
21documenti canonici IT+EN
0cloud richiesto per pensare
stato: pre-1.0, in uso quotidiano sull'istanza di riferimento · installer: incluso nel repo · licenza: AGPL-3.0 · codice: github.com/brunialti/metnos

1 · Cos'è Metnos, in trenta secondi

Gli si parla dal browser o da Telegram, in linguaggio naturale. Legge mail, file, foto, calendario e web; agisce — sposta, scrive, invia, programma — e si ferma a chiedere prima di ogni cosa che non si può rifare. Non c'è un cloud di Metnos, non c'è un «registrati»: i dati e la logica restano in casa.

Quello che succede a ogni richiesta, in un disegno:

Tu browser · Telegram Intent extractor LLM locale · ~0,4 s/query Praxis forma già risolta? Risposta 0 chiamate LLM no: si pianifica Routing deterministico prefiltro per affinità + seme LLM fisso → stesso piano a ogni run Planner ReAct · LLM locale compone executor dal vocabolario chiuso (23 verbi × 22 oggetti) liste in → liste out, i dati passano per riferimento manca uno strumento? Synt 5 stadi: nome → firma args → test → descrizione → codice poi: test di nascita, conferma umana, firma Ed25519 nuovo executor in catalogo Vaglio guardia binaria (mai negoziabile) + giudice graduato sui tuoi telos carta 2 tasti ✓ / ✗ consenso ottenuto (o non necessario) Executor firmato · sandbox bubblewrap profilo per-strumento: filesystem confinato, rete solo se dichiarata osservazione → passo dopo Risposta + riga di audit conteggi reali, troncamenti dichiarati, undo disponibile dove promesso le catene riuscite alimentano Praxis: la prossima volta, stessa richiesta = replay diretto
Fig. 1 — Il giro di un turno. Due proprietà non comuni: il routing è deterministico (stessa richiesta → stesso piano, a ogni esecuzione) e le forme già risolte rientrano da Praxis senza scomodare alcun LLM.

Le quattro proprietà che lo distinguono da un agente generico:

2 · Perché è diverso

Di agenti self-hosted ce ne sono già — quelli da terminale (OpenClaw e simili) e l'ecosistema delle «skill» importabili. Metnos fa scelte opposte su quattro assi, e le fa per una ragione precisa: un planner locale non è un modello di frontiera, e va messo nelle condizioni di non sbagliare.

Framework agentico tipicoMetnos
Strumenti Scritti a mano, importati o generati al volo in forma libera — poi eseguiti così come sono, coi privilegi dell'assistente. Sintetizzati anche a runtime, ma da un vocabolario chiuso e verificato: firmati, testati alla nascita, invecchiati, ammessi solo dopo un cancello a 7 strati.
Instradamento Il modello sceglie uno strumento a ogni turno: chiedete due volte, ottenete due piani. Deterministico per costruzione: seme fisso, pareggi rotti da affinità curate. Stessa richiesta, stesso piano, a ogni run.
Output Forma libera, per strumento. Uniforme: liste in ingresso, liste in uscita, componibili fra passi senza colla.
Undo Raro, o nella migliore delle ipotesi «si spera». Di prima classe: catalogo chiuso di pattern di reverse, move = COPY-poi-DELETE, ok_count onesto.
Lingua Inglese, stringhe cablate nel codice. i18n per costruzione: ogni stringa e prompt è dato per-lingua. IT+EN validate; altre lingue a incastro, non ancora testate.
Sicurezza Ci si fida dell'autore del pacchetto. Non ci si fida del pacchetto: è il pacchetto a dover passare i controlli.

Perché Metnos non ha adottato il formato «skill» standard

I formati di skill in voga sono comodi e pericolosi in pari misura: importate un pacchetto e l'assistente ne esegue il codice coi propri privilegi. Per un assistente che tocca file, mail e shell di casa vostra, è esecuzione remota di codice per disegno: basta un pacchetto malevolo o sciatto. Metnos sceglie la sicurezza per costruzione: vocabolario chiuso (non potete nominare uno strumento che la grammatica non ammette), cancello di ammissione a 7 strati per ogni executor nuovo o importato (firma → sovrapposizione di affinità → invecchiamento → sandbox → test di fumo → verifica LLM → audit append-only), consenso esplicito prima di ogni azione distruttiva. Lo slogan: il pacchetto non si fida, il pacchetto si guadagna il posto. L'ecosistema pubblico delle skill non viene ignorato: viene tradotto dentro questo modello, mai eseguito crudo.

Il determinismo è una scelta, non un caso

La maggior parte degli agenti tratta l'LLM come un oracolo da rilanciare a ogni turno. Metnos fa la scommessa opposta: un planner locale su vocabolario chiuso si può rendere riproducibile — il seme di generazione è fissato, e quando due strumenti fratelli pareggiano decide un segnale di affinità curato, non il caso. Risultato misurabile: il banco di prova interno ripete ogni richiesta cinque volte e pretende lo stesso piano, cinque su cinque. E si compone: una forma di richiesta risolta una volta viene rigiocata da Praxis senza alcuna chiamata LLM — latenza più bassa, costo zero, esito identico. La flessibilità (il modello di frontiera) resta disponibile, ma è la riserva, non il motore.

Cosa fa meglio un agente da terminale

Onestà dovuta: come compagno di chi scrive codice — dentro un repository, in tempo reale — un agente da terminale maturo resta superiore, con un ecosistema di estensioni che Metnos non ha né insegue. Metnos è un'altra cosa: un assistente di casa per posta, foto, calendario, archivio, web e manutenzione del proprio server. I due convivono benissimo.

3 · Otto scene reali

Il modo più rapido per capire è guardare. Ogni scena qui sotto è una richiesta vera fatta all'istanza di riferimento; l'intestazione indica quando è stata verificata dal vivo. Dove c'è un limite, è scritto accanto al merito.

Scena 1 · leggere — verificata 24/05/2026

«Riassumi le mail di oggi»

Dammi il riassunto delle mail importanti di oggi.

find_messages describe_entries risposta
3 mail oggi: l'avvocato chiede il documento entro venerdì; la banca conferma il bonifico di ieri; la sorella sul pranzo di domenica. Vuoi che provi a rispondere a una di queste?
capability mail:read · conferme nessuna — i verbi di sola lettura saltano il giudizio · latenza ~3 s
Scena 2 · agire con consenso — verificata 24/05/2026

«Rispondi tu all'avvocato»

Ok, rispondi tu all'avvocato: digli che invio il documento entro giovedì.

Una mail in uscita verso un destinatario esterno non parte mai in silenzio, a nessun livello di autonomia. Metnos compone la bozza e su Telegram arriva questa bolla con due bottoni:

Posso inviare una mail?
a [email protected] · oggetto: «consegna documento» · ~140 caratteri
reversibile: no · classe: mail:send

Toccate Approva: il daemon verifica che il token sia ancora pendente, non scaduto, e che chi decide sia lo stesso mittente accoppiato che ha chiesto. Poi: «Spedita alle 11:34. Riga di audit #1247.»

capability mail:send (irreversibile) · token monouso, TTL 600 s · identità chi approva == chi ha chiesto

Le tre righe della carta non sono un vezzo: sono cosa, su che cosa, quanto è rifacibile — il minimo per decidere a colpo d'occhio. Alla terza occorrenza identica la carta scende a due righe, poi a una. Vedi approval_ux.

Scena 3 · comporre + annullare — verificata 28/04/2026

«Ordina queste foto per anno e luogo» — e poi «annulla»

Ordina tutti i file immagine in ~/images creando sottocartelle per anno, premettendo al nome data e luogo di scatto. Se il luogo non c'è, metti «unknown».

Non esiste uno strumento «ordina foto»: il planner ne compone quattro della libreria, collegando l'uscita di ognuno all'ingresso del successivo. I dati non transitano dal modello: passano per riferimento (from_step).

  1. find_files(base_path="~/images", patterns=["*.jpg","*.png","*.heic"], recursive=true) → 98 entries (con size e mtime già inclusi)
  2. filter_entries(from_step=1, kind="image") → 98 entries · filtro in memoria, conferma il tipo dichiarato dal MIME
  3. get_files(from_step=2, fields=["dates","place"]) → 98 entries arricchite: EXIF → data; GPS → luogo via reverse-geocode (cache locale); senza GPS → "unknown"
  4. move_files(from_step=3, dst_template="~/images/{anno}/{data}_{luogo}_{nome}") → 98 spostati, 0 errori · ogni coppia sorgente→destinazione registrata nel registro di undo

Quattro executor che non si conoscono fra loro, scelti e collegati dal planner. Run reale del 28/04/2026, 98 foto.

Il giorno dopo, cambio di idea:

Annulla l'ultima operazione.

Ho annullato l'ultima operazione: ho riportato 98 file ai loro percorsi originali.
undo reverse multistage: prima i file, poi le cartelle create — solo se rimaste vuote · latenza undo ~3 s su 98 file · idempotente un secondo «annulla» non fa nulla
Non tutto è annullabile, e Metnos non finge il contrario: una mail spedita non si richiama. L'undo dichiara «X non annullabili» e ribalta il resto. Ogni move è COPY-poi-DELETE: mai una cancellazione senza copia confermata.
Scena 4 · multi-utente + login + ricorrenza — verificata 24/05/2026

«Ogni mattina, il registro scolastico — alla figlia, non a me»

Il portale della scuola richiede login. Il riassunto deve arrivare sul Telegram della figlia, accoppiata come ospite. Tre messaggi di preparazione, poi va da solo.

Aggiungi credenziali per portale-scuola.example: utente roberto.b, password ●●●●●●●.

Metnos riconosce un valore che somiglia a una password e apre una carta dedicata: propone di cifrare il dato in una cassaforte locale e di cancellare il valore in chiaro dal log del turno (<REDACTED:cred>). Approvato, prova un login di test.

Ogni mattina alle 7 cerca le novità sul portale (compiti, voti, circolari), leggi anche i PDF allegati, e manda il riassunto delle 5 più rilevanti alla figlia su Telegram.

scheduler 07:00 · login_session find_urls filter_entries read_urls_html + read_urls_pdf group_entries describe_entries send_messages(to_user="figlia")
Scuola — report 04/05/2026
1. Sciopero docenti 07/05 (circolare 198) — lezioni sospese al mattino
2. Verifica di matematica spostata al 10/05
3. Compiti del fine settimana: capitoli 4–6 + saggio breve
4. Riunione coordinatori venerdì 9/05, ore 15:30
5. Pubblicato il voto di latino
credenziali cifrate in locale, mai nel codice né nei log · cookie riusato ~14 giorni; alla scadenza re-login automatico · LLM 1 sola chiamata per run (il riassunto) — l'HTML si estrae in modo deterministico · latenza ~25–40 s/run
Se anche il re-login fallisce (password cambiata sul portale), il task si mette in pausa e l'host riceve un avviso — non un silenzio, non un report inventato.
Scena 5 · cinque frasi, tre provider — verificata 24/05/2026

Un budget mensile che si aggiorna da solo

Domenica mattina, cinque frasi in fila — foglio su Drive, bollette dalle mail, riepilogo in un Doc, condivisione, ricorrenza:

Crea uno spreadsheet «Budget 2026-05» su Drive con colonne Data, Categoria, Importo, Note, Pagato. — Popolalo con le mail degli ultimi 30 giorni che contengono «fattura». — Fammi un riassunto per categoria in un Google Doc. — Condividi tutto con il familiare. — Aggiornami ogni mattina alle 8.

create_files_spreadsheet write_files_spreadsheet find_messages classify_entries read_files_ocr (solo per le scansioni) compute_entries create_files_doc + write_files_doc find_contacts share_files (con carta) create_tasks(daily@08:00)
3 bollette estratte: energia €213,47 · rifiuti €281,67 · telefono €165,25 — totale €660,39. Foglio e Doc creati; condivisi in sola lettura. Domani alle 8:00 ricostruisco il foglio con le mail nuove.
provider Google Workspace (OAuth vostro) + IMAP cifrato + scheduler locale · privacy il planner gira in casa; in rete escono solo le chiamate API ai VOSTRI documenti · conferme solo la condivisione (capability in uscita) · tempo totale 2–3 minuti di conversazione
Dal test E2E con bollette vere: una scansione senza strato testo è passata da OCR (Tesseract, ~30 s/pagina) con estrazione corretta dell'importo; sull'altra bolletta l'estrazione LLM ha preso fornitore e importo ma ha perso la data di scadenza (il prefiltro aveva tagliato la sezione giusta). L'estrazione da documenti resta probabilistica: i numeri scritti nel foglio sono quelli letti, non inventati — ma un campo può mancare, e va detto.
Scena 6 · synt al volo — verificata 28/04/2026

«Comprimi questo file» — e lo strumento non esiste ancora

Comprimi /tmp/cfg.json in gzip.

Il planner ispeziona il catalogo: nessun executor adatto, e nessuna catena di esistenti chiude il vuoto. Parte la sintesi — cinque stadi piccoli invece di un prompt mostro, ogni stadio vede solo la fetta di contesto che gli serve:

1 nome 2 firma args 3 test di nascita 4 descrizione 5 codice test in sandbox · conferma umana · firma Ed25519 compress_files_gz
Sto costruendo un componente nuovo per estendere le mie capacità. La prima volta richiede due o tre minuti; ogni riuso è immediato. […] Fatto: cfg.json.gz creato.
tempo di sintesi 148 s, tutto su LLM locale — costo €0 · nome conforme al vocabolario chiuso: verbo_oggetto_qualificatore · riuso dalla volta dopo, <100 ms: è una normale chiamata di funzione

È così che il catalogo è arrivato a 77 executor: una capacità alla volta, motivata da una richiesta vera, mai in anticipo. Il meccanismo completo è nel capitolo 7.

Scena 7 · foto: capire, non solo elencare — in produzione 06/2026

«Trova le foto in montagna» — semantica visiva, in casa

Decine di migliaia di foto su un disco di rete. La prima volta Metnos propone di indicizzarle: l'indicizzazione gira in background e avvisa su Telegram a lavoro finito. Da quel momento:

Trova le foto in montagna.

find_images_indices(query="montagna") 20 anteprime + galleria web (100)

Le foto della figlia al mare?

find_persons_indices (volti: dopo un'etichettatura una-tantum «chi è chi») galleria
modelli embedding di scena + riconoscimento volti + EXIF — tutto in-process, sul vostro server · privacy nessuna foto lascia casa; l'indice è un file SQLite ispezionabile · interfaccia anteprime in chat, galleria completa nel browser
Limite noto, a giugno 2026: «la figlia in montagna» — volto e scena nella stessa query — non fonde ancora i due segnali come dovrebbe; le due ricerche separate funzionano. È il cantiere aperto in cima alla lista.
Scena 8 · il repo si mantiene con due frasi — in produzione 06/2026

Manutenzione GitHub senza demone: due comandi schedulati

Il supporto del progetto stesso è gestito così — niente servizio dedicato, niente codice ad hoc: due richieste in linguaggio naturale, registrate come task ricorrenti, che il planner trasforma nelle solite catene di executor.

Ogni 30 minuti: trova le issue nuove del repo, scarta quelle già nel db locale, cerca per ciascuna le issue simili già risolte, classificala e analizzala col tier frontier, salva la bozza di risposta con stato «prepared», e avvisami.

Dopo la mia approvazione: leggi dal db le issue «approved» non ancora pubblicate, pubblica la risposta come commento su GitHub, segnale «posted».

find_issues_github find_issues (dedup nel db locale) classify_entries + consult_frontier write_issues("prepared") approvazione umana send_messages_github write_issues("posted")
macchina a stati new → prepared → approved → posted: il doppio invio lo impedisce lo stato, non la speranza · consenso niente raggiunge GitHub senza un «approva» esplicito · scheduling una frase: «crea un task ricorrente ogni 30 minuti: …»
È un esperimento dichiarato di dogfooding: un'istanza di Metnos che aiuta a mantenere Metnos. Se il tier frontier è giù o fuori budget, l'issue resta «new» e viene marcata per trattamento manuale — mai una risposta inventata, mai uno skip silenzioso.

4 · Dove vive e come gli si parla

Metnos gira su una macchina Linux vostra. L'istanza di riferimento è un piccolo sistema a memoria unificata (96 GB) che serve un modello locale ~35B a circa 80 token/s; ma i livelli LLM sono ruoli astratti, non modelli fissati — un endpoint su CPU, un modello che già servite o il solo ripiego di frontiera sono percorsi di prima classe. Telefoni e laptop sono clienti: la mente, la memoria e l'audit vivono su una macchina sola.

Due superfici, una mente

Il browser: una chat servita dal server stesso (porta 8770), con le anteprime delle foto, la galleria, e i cruscotti di amministrazione (proposte del synt, executor, run, turni). Telegram: lo stesso cervello in tasca, con le carte di conferma come bottoni in linea. Per chi automatizza, l'API HTTP (/agent/turn, anche in streaming) è la stessa porta che usa la chat.

La chat web mostra anche i badge di feedback ✓/✗ per ogni risposta: il gradimento alimenta la cura del catalogo.

Chi siete, per il bot: il pairing

Telegram è una superficie pubblica: chiunque conosca il nome del bot può scrivergli. Metnos lega ogni coppia (canale, mittente) a un livello di autonomia con un codice firmato monouso: /pair PAIR.<codice> (Ed25519, scade in pochi minuti) per gli accoppiamenti decisi dall'host; /start <token> per gli ospiti creati dall'interfaccia di amministrazione. Niente account centrale, niente password: una rubrica per-canale-per-mittente che solo l'host modifica. Vedi pairing.

La lingua è un dato, non una costante

Ogni messaggio visibile, ogni descrizione di strumento e ogni prompt LLM vive come dato per-lingua: italiano e inglese sono validati, una lingua nuova si aggiunge per traduzione dei pacchetti, senza toccare codice (prompts_cli add-language <codice> prepara la struttura; la traduzione si rivede e si promuove a mano). Onestà: oltre IT e EN, oggi, è terreno non testato. Vedi multilang.

5 · Cosa succede quando dice «posso?»

È il pezzo di esperienza più importante del progetto. Ogni azione che cambia lo stato del mondo — inviare, scrivere fuori dal perimetro concesso, eseguire shell — passa per quattro componenti reali, in quest'ordine. Il punto non è chiedere sempre: è chiedere bene, e sempre meno.

FaseCosa fa
1 · PlannerPrepara il passo (executor + argomenti) in memoria. Niente è ancora eseguito.
2 · VaglioPrima la guardia binaria: percorsi vietati (~/.ssh, /etc…) e pattern di shell quasi irrecuperabili (rm -rf /, mkfs, fork bomb) sono negati a prescindere, a ogni livello di autonomia. Poi il giudice graduato: un punteggio di allineamento ai vostri telos (i fini scritti in TELOS.md).
3 · PolicyClasse di capability × livello di autonomia × concessioni persistenti → uno fra allow_silent, approval_required, deny.
4 · CartaTre righe (cosa · su che cosa · quanto è rifacibile) + due bottoni. Token opaco monouso, TTL 600 s, verifica che chi decide sia chi ha chiesto. Solo dopo l'approvazione l'executor parte — dentro una sandbox bubblewrap col profilo dichiarato nel suo manifest firmato.

Sempre meno fastidio, mai meno controllo. La carta si modula sulla ricorrenza: piena le prime volte, poi due righe, poi una. E alla prima approvazione di una tipologia potete concedere un territorio («tutte le scritture dentro ~/Documenti/fatture/») — da quel momento, lì, Metnos smette di chiedere; la concessione è revocabile quando volete. Vedi approval_ux.

E quando ha agito, può tornare indietro. L'undo non è un LLM che «ci prova»: è un catalogo chiuso di pattern di reverse dichiarati nel manifest di ogni executor mutante (scambia sorgente/destinazione, cancella i creati, ripristina il backup del blob, cancella per id). Conteggi onesti: se dice che ha annullato tre cose, erano tre.

Ciò che nessuna autonomia sblocca. La guardia binaria non è configurabile da file: percorsi vietati e pattern catastrofici si cambiano solo cambiando il codice. E la generazione è monocanale per principio (SOUL.md, sei principi operativi): il synt propone solo executor, mai modifiche a se stesso, al vaglio o al runtime — e ogni proposta passa dal vostro sì.

6 · La sua memoria: cosa ricorda e cosa no

Quattro depositi distinti, con durate e regole di scrittura diverse — tabelle SQLite e file di testo che potete aprire, non un vettore opaco da qualche parte.

DepositoOrizzonteCosa contieneRegola
Scratchpadil turnoLe osservazioni dei passi intermedi.si svuota a fine turno
Storico turnigiorni«Cosa ti ho chiesto martedì scorso?»un file per turno, alimenta i cruscotti
Memorie su di voiper sempre«Il compleanno della mamma è il 23/4.»mai scritte di nascosto: propone, voi approvate
Mnestomasu di séQuali strumenti hanno collaborato, con che esito; e i tentativi rimasti a metà.il substrato che il synt legge per proporre

Memoria del mondo (le prime tre righe) e memoria di sé (il mnestoma), tenute separate per disegno. Il quarto deposito è il più insolito: il mnestoma registra anche i vuoti — le richieste che nessuno strumento ha saputo chiudere — perché sono il motore della crescita.

Il dettaglio che conta: Metnos non promuove mai un fatto a memoria permanente da solo. Propone («ho notato che parli spesso del nuovo dentista: lo salvo come contatto abituale?»), voi decidete. E un tentativo fallito non viene dimenticato: resta come proto-mnest — un'aspirazione registrata, con abbastanza contesto per riconoscere la stessa forma la prossima volta. Vedi mnestoma e scratchpad.

7 · Come cresce: synt, skill, backend

Un executor è un piccolo file Python che fa una cosa sola, con un manifest che ne dichiara argomenti, capability e profilo sandbox. Una volta firmato è un artefatto stabile: non impara, non cambia. L'intelligenza di crescita sta altrove — nel sintetizzatore.

La sintesi in cinque stadi

StadioCosa produce
1 · Nomedal vocabolario chiuso — tier middle
2 · Firmaschema args, capability, pattern di reverse
3 · Test4–6 prove di nascita: felice, vuoto, invalido
4 · Descrizioneil «prompt dello strumento» + parole di affinità
5 · Codicetier wise, locale — def invoke(args) → liste

All'uscita, il cancello di ammissione (7 strati): firma → sovrapposizione di affinità → invecchiamento → sandbox → test di fumo → verifica LLM descrizione-vs-codice → audit append-only · poi conferma umana e firma Ed25519.

Cinque prompt piccoli e focalizzati invece di uno monolitico: in convergenza ha prodotto 4 executor corretti su 4, contro il 32% del prompt unico. Solo lo stadio 1 vede il vocabolario chiuso; solo il 5 scrive codice.

La sintesi reattiva (capita in mezzo a un turno, scena 6) è il primo gradino di una cascata per costo crescente: prima componi gli esistenti, poi genera il mancante; di notte le passate introvertive propongono fusioni (due strumenti con tracce sovrapposte), generalizzazioni (tre specializzati collassano in uno parametrico) e specializzazioni (un caso caldo si stacca). Tutto passa dal vostro sì. Due installazioni, in due case, dopo sei mesi avranno cataloghi diversi — ognuno plasmato dall'uso reale. Vedi synt e lifecycle.

Skill e backend: due assi che non si confondono

Tutto ciò che lega Metnos a un servizio esterno è una skill: un gruppo di capacità dormiente finché non configurata, attivabile e disattivabile a piacere (system · photos · mail · web · geo · calendar · github · google-workspace · frontier). Abilitare una skill senza i prerequisiti è innocuo: resta visibile e inerte finché il suo servizio o la sua credenziale non compaiono. Si gestiscono da riga di comando o chiedendolo in chat («quali skill ho?», «disattiva il web»).

Il backend è l'altro asse: come un'azione raggiunge un servizio concreto. Il provider si sceglie da configurazione, deterministicamente — il planner non vede mai «Google»: vede create_events, e il resolver instrada. Aggiungere un secondo provider (es. GitLab accanto a GitHub) è +1 file di backend, zero executor nuovi: niente strumenti fotocopia per provider, niente bias di scelta nel modello locale. Vedi skills_backends.

system è la skill che rende Metnos un assistente del computer, non solo un chatbot: shell, sudo, pacchetti, mount di rete. Ogni azione privilegiata richiede un giudizio del vaglio, e la skill si può spegnere del tutto — Metnos resta fuori dal sistema finché non la riaccendete voi.

8 · Persone e dispositivi: host, ospiti, e la strada verso gli executor remoti

Metnos non è multi-tenant in senso SaaS: è una casa sola. Dentro quella casa c'è un host — il proprietario del server, custode della chiave di firma — e zero o più ospiti, ognuno col suo livello.

LivelloPer chiCosa può
ReadOnlyUn ospite, un canale delicatoSolo executor di lettura; ogni scrittura viene rifiutata con garbo prima ancora di arrivare al planner.
SupervisedL'uso quotidianoTutto il turno; le azioni delicate alzano la carta di conferma sul canale stesso.
FullL'hostIl perimetro più ampio che la policy ammette. I percorsi vietati restano vietati anche qui.

La scena 4 mostra il modello al lavoro: l'host configura, l'ospite riceve, le righe di audit restano separate per accoppiamento. Ogni canale ha la sua porta, la sua chiave, la sua storia.

Executor remoti: dove può arrivare il codice

Un solo server, ma non un solo filesystem: tante cose su cui vorreste agire (i file del laptop, un'applicazione aperta, uno schermo) vivono altrove. La direzione tracciata è tenere gateway, policy e memoria sul server e lasciar girare alcuni executor su dispositivi registrati — un client sottile con identità Ed25519 propria, ammesso con un codice firmato monouso, revocabile dal server in un gesto.

A oggi è una direzione progettata, non un prodotto: il client esiste come prototipo, le decisioni di sicurezza (idempotenza su rete intermittente, protezione dai replay, revoca) sono scritte, e nessun executor remoto è distribuito. Lo diciamo qui perché il disegno del sistema — policy sul server, esecuzione delegata — è pensato per quel futuro, non per gonfiare il presente.

9 · Cosa fa, cosa non farà

✓ Cosa fa oggi

  • Turni multi-passo da browser e Telegram, con piani fino a 12 passi
  • Mail: legge, riassume, archivia, risponde — l'invio sempre dietro carta
  • File: cerca, filtra, sposta, comprime, estrae — con undo dichiarato
  • Foto: indicizza in casa (scena, volti, EXIF) e cerca per significato
  • Google Workspace con un solo OAuth: Gmail, Calendar, Drive, Docs, Sheets
  • GitHub: issue e pull request come oggetti di prima classe
  • Web: ricerca e lettura via servizi self-hosted (ricerca, geocoding)
  • Compiti ricorrenti in linguaggio naturale («ogni mattina alle 7…»)
  • Multi-utente sullo stesso bot, con autonomie e audit separati
  • Sintetizza executor nuovi quando mancano; cura il catalogo di notte
  • Parla italiano e inglese per costruzione; ogni stringa è un dato
  • Audit append-only di ogni azione + cruscotti di osservabilità

— Cosa non fa, per disegno o per ora

  • Agire fuori casa senza consenso: le capability in uscita passano dalla carta
  • Spendere sul tier di frontiera oltre il tetto configurato
  • Toccare ~/.ssh, /etc, ~/.gnupg e simili: lista cablata nel codice, non in un file di configurazione
  • Eseguire pattern catastrofici (rm -rf /, mkfs, fork bomb), a qualunque autonomia
  • Modificare se stesso: il synt genera solo executor, mai il runtime o il vaglio
  • Installare un executor senza la vostra conferma esplicita
  • Ascoltare da un microfono (canale voce in attesa, per scelta)
  • Pilotare un browser o la domotica
  • Eseguire executor su dispositivi remoti (direzione progettata, non distribuita)
  • Fondere volto + scena in una sola ricerca foto (cantiere aperto)
  • Garantire lingue oltre IT/EN: a incastro, ma non ancora testate

Regola trasversale: nessun fallimento silenzioso. Cap raggiunto → lo dice (quanti usati, quanti disponibili) e chiede se allargare. Esito parziale → contato come parziale. Mai un «fatto» che non corrisponde alla realtà.

10 · Dove sta davvero il progetto

Vetrina funzionante, non prodotto rifinito. Metnos è il sistema con cui l'autore vive ogni giorno, costruito per una persona su una macchina — e condiviso perché chi ama homelab e architetture di agenti possa leggerlo, farlo girare, costruirci sopra.

PezzoStato a giugno 2026
Uso quotidianoSì: l'istanza di riferimento è in servizio attivo (mail, foto, scheduler, manutenzione del proprio repo). 77 executor firmati, 2 660 test automatici, 21 documenti canonici bilingui allineati al codice.
InstallerIncluso. Il percorso managed (consigliato) replica un ambiente completo da un checkout pulito — modello, servizi di contorno, dati i18n, executor firmati — profila l'hardware per scegliere un modello adatto e chiude con un turno reale, non un ping. Il percorso custom (dichiarate il vostro LLM) esiste ed è sconsigliato a voce alta.
Repo pubblicoUn sotto-insieme deterministico dell'istanza viva — la fetta essenziale per l'esercizio. Può restare indietro fra una pubblicazione e l'altra: è previsto, non trascuratezza.
Maturitàpre-1.0: API e default cambiano senza strati di compatibilità quando emerge un disegno migliore. Capacità esistenti ma poco esercitate fuori dall'istanza di riferimento (l'i18n non-italiana su tutte). Se qualcosa si rompe: issue, e un filo di pazienza.

Provarlo

Il requisito vero è l'hardware: una macchina che regga un LLM locale capace. I livelli sono ruoli astratti — un endpoint su CPU o un modello già in servizio vanno bene; un modello più debole significa pianificazione più debole, non un'installazione rotta. Nessuna GPU è richiesta per principio.

$ git clone https://github.com/brunialti/metnos.git && cd metnos
$ bash install/bootstrap.sh --check   # solo verifica: non scrive nulla
$ bash install/bootstrap.sh           # interattivo, sei fasi, idempotente

E il supporto è parte dell'esperimento: le issue del repo vengono triagiate da un'istanza di Metnos (scena 8) — bozze preparate dal sistema, pubblicate solo dopo approvazione umana. Se l'assistente non sa aiutarvi a far girare l'assistente, quello è un bug che vogliamo vedere.

La descrizione da mezzo euro

Se portate via una cosa sola: Metnos è un assistente personale self-hosted con tre impegni peculiari — chiede prima di agire (un valutatore ispezionabile, non una sensazione), si costruisce gli strumenti dentro regole verificabili (vocabolario chiuso, firma, test di nascita, cancello a 7 strati), è riproducibile come il software (routing deterministico, conteggi onesti, undo per costruzione). Se questa combinazione vi incuriosisce, siete il pubblico giusto.

11 · Glossario minimo & letture successive

Executor
Uno strumento del catalogo: file Python + manifest + firma Ed25519 + profilo sandbox. Vettoriale per costruzione: liste in ingresso, liste in uscita.
Synt
Il sintetizzatore: la cascata che fa crescere e cura il catalogo (componi, genera; fondi, generalizza, specializza). Sempre dietro conferma umana.
Vaglio
Il valutatore in due fasi fra un'azione proposta e la sua esecuzione: guardia binaria non negoziabile + giudice graduato sui telos.
Telos
I vostri fini, scritti in TELOS.md come tendenze morbide. Il giudice misura le azioni proposte contro di essi.
Praxis
Il sentiero veloce appreso: una forma di richiesta già risolta viene rigiocata senza chiamate LLM. Stesso esito, latenza e costo minimi.
Mnestoma
La memoria che il sistema tiene su di sé: co-attivazioni riuscite (mnest) e tentativi rimasti a metà (proto-mnest). Il substrato delle proposte di crescita.
Skill / Backend
Due assi ortogonali: la skill governa se una capacità è attiva e fidata; il backend governa come raggiunge un provider concreto, scelto da configurazione e mai dal modello.
Pairing
L'ammissione firmata di una coppia (canale, mittente) a un livello di autonomia. Sostituisce il login: niente account, una rubrica che solo l'host tocca.
Carta di conferma
Tre righe e due bottoni: cosa, su che cosa, quanto è rifacibile. Si accorcia con la ricorrenza; può concedere territori revocabili.

Il Glossario completo

~35 voci, alfabetico, con le fonti canoniche.

Continua a leggere

Architettura — Introduzione Il sistema d'insieme: topologia, strati, il flusso di una richiesta, i principi.
Fondamenti · 20 min
Indice della microprogettazione Una pagina per sottosistema, IT+EN, ricche di diagrammi: planner, synt, vaglio, sandbox, skill, fast path, e il resto.
21 documenti
Dialogo sui fini e i limiti La fondazione filosofica di telos e vaglio, in quattro serate.
Riflessione · 25 min
Una nota sul codice Lo stato del codice raccontato dall'autore, senza trucco.
Nota · 5 min