← Indice documentazione Fondamenti › Guida all'architettura
Guida all'architettura

Metnos

Dal sistema nel suo insieme ai contratti dei componenti

Un solo tutorial, due livelli di dettaglio. Parti dalle idee, segui una richiesta reale, poi entra nei componenti che rendono eseguibile ogni promessa.

Stato: pre-1.0
Formato HTML — stampabile in PDF
Linguaggio semplice, contratti precisi, diagrammi leggibili senza il codice.

Il tuo percorso nel sistema

OrientatiScopo, scommesse, vocabolario e confini. Segui un turnoDalle parole a un risultato misurabile e dichiarato senza ambiguità. Capisci l'azioneExecutor, autorità, placement e sintesi. Vedi cosa restaMemoria, sensi, canali, sicurezza e undo. Apri la macchinaMappa, contratti e guide implementative.
Indice completo dei capitoli
  1. Cos'è Metnos
  2. Le tre scommesse
  3. I concetti chiave
  4. L'architettura a strati
  5. Anatomia di un turno multitool
  6. Executor e autorità
  7. Synt: la fabbrica
  8. Modelli e instradamento deterministico
  9. Memoria
  10. Pipeline immagini
  11. Canali
  12. Sicurezza e reversibilità
  13. Atlante dei componenti
  14. Otto principi
  15. Cosa non è Metnos
  16. Dove andare dopo

Una sola architettura, tre livelli di ingrandimento

PerchéI principi e i limiti che rendono Metnos un assistente particolare.
Cosa succedeIl percorso completo di un turno, compresi diniego, recupero e annullamento.
Come è costruitoContratti canonici: schemi, chiamate, autorità e condizioni di errore.
Come usare questa guida. Per una prima lettura, segui l'ordine dei capitoli. Quando cerchi un dettaglio preciso, usa i collegamenti ai componenti: la panoramica chiarisce il comportamento complessivo, mentre ogni pagina di componente ne definisce il contratto.
Parte I · Orientamento

Capire il sistema nel suo insieme

Prima lo scopo, poi le scelte architetturali, infine il vocabolario usato in tutta la guida.

1. Cos'è Metnos

Metnos è un'architettura ospitata in proprio per un agente governato. Il nucleo non definisce un dominio applicativo: pianifica, applica regole, ricorda, sintetizza, isola e registra. È l'insieme degli executor ammessi a definire cosa può fare davvero una specifica istanza. Gli executor sono piccoli programmi firmati, generati o importati soltanto dentro un vocabolario chiuso e orchestrati da un pianificatore LLM che privilegia i modelli locali. I modelli del livello frontier offrono consulti opzionali, non la sede del sistema.

Il nome viene da mētis (l'intelligenza astuta) + noûs (la mente). Vive su una macchina sotto il tuo controllo fisico e legale. L'istanza di riferimento si usa da Telegram e dal browser (porta 8770), e il suo catalogo corrente copre file, posta, foto, calendari, web, GitHub e operazioni sul server. Sono usi di quel catalogo, non limiti di Metnos. Cambiando gli executor ammessi, le skill e i servizi collegati cambia il dominio operativo, senza cambiare l'architettura che lo governa.

Regola di perimetro. Posta, foto e calendari non appartengono a Metnos: appartengono agli executor del catalogo di riferimento. Manutenere Metnos attraverso GitHub è già un uso diverso della stessa architettura.
Metnos in un colpo d'occhio la tua macchina — dati, logica e modelli restano qui Telefono Telegram, ovunque bottoni di conferma Browser chat + pannello amministrativo HTTP :8770 interrogazione in uscita il processo Metnos Canali servizio Telegram · server web :8770 La mente (cap. 5) intento → memoria dei piani → motore Mētis un piano intero come risultato strutturato confini deterministici attorno alla proposta LLM Le guardie (cap. 12) regole · vaglio (consenso) · isolamento Executor vettoriali (cap. 6) firmati nel catalogo + sintetizzati sotto controllo lista dentro → lista fuori servizi e skill (a tua scelta) file & cartelle mail (IMAP/SMTP) foto & indici calendario web & ricerca GitHub agiscono qui servizio LLM configurato endpoint risolti per fast · middle · wise · creative locale o remoto, senza cambiare il pianificatore pensa qui memoria persistente mnestoma · fastpath · cronologia degli annullamenti · registro (SQLite) livello frontier (cloud, facoltativo) un consulto quando richiesto — mai il motore ospitato in proprio: nessuna dipendenza obbligata da servizi di terzi; il cloud è una porta che apri tu, non una stanza in cui abiti.
Figura 1 — Metnos in un colpo d'occhio. Il processo vive su una macchina tua: i canali ricevono, la mente pianifica tramite i livelli configurati, le guardie filtrano e gli executor agiscono sui servizi attivati. Fornitori remoti e livello frontier sono scelte esplicite.

La carta d'identità

VoceStato reale
FormaProcesso Python ≥ 3.12, microarchitettura a executor e pianificazione vincolata in un singolo passaggio nel motore Mētis (cap. 5).
StrumentiExecutor firmati nel catalogo, più quelli sintetizzati al volo e quelli importati dopo il filtro di ammissione (cap. 7). Tutti vettoriali: lista in ingresso, lista in uscita. La guida dei domini offre la vista utente; nomi e conteggio correnti sono nel catalogo generato.
CervelloEndpoint LLM compatibili, locali o remoti; cinque livelli astratti fast / middle / wise / creative / frontier (cap. 8). frontier indica il cloud facoltativo.
CanaliTelegram (interrogazione in uscita, senza porte aperte) e web sulla porta 8770 (chat e pannello amministrativo), cap. 11.
DispositiviUna parte controllata del catalogo può girare su PC registrati nella stessa rete tramite metnos-client: il server conserva regole, scelta, firma e registro; il dispositivo esegue solo executor dichiarati compatibili. Dettaglio: executor remoti.
SensiElaborazione delle immagini nel processo: semantica, volti ed EXIF confluiscono in un indice unificato (cap. 10).
LinguaContesto per utente e per richiesta. Prompt, descrizioni dei manifest, messaggi visibili e lessico di comprensione hanno fonti e ripieghi dichiarati. Italiano e inglese sono le lingue pienamente supportate; aggiungerne una richiede traduzione e collaudo di tutte e quattro le aree.
Licenza / statoAGPL-3.0; pre-1.0. Repository pubblico: github.com/brunialti/metnos — distribuzione pubblica del codice e dei materiali destinati al rilascio.

2. Le tre scommesse

Tutto il progetto sta in tre scommesse architetturali. Sono scelte di campo, non ottimizzazioni: ciascuna rovescia un'abitudine diffusa delle piattaforme agentiche.

Tre scommesse, un sistema 1 · Vocabolario chiuso Gli strumenti non si importano a fiducia: si sintetizzano dentro una grammatica chiusa e sottoposta a controllo. «non fidarti del pacchetto: il pacchetto deve guadagnarsi il posto» cap. 3 · 6 · 7 2 · Locale prima Il pianificatore è un LLM sul tuo hardware. Niente giro in cloud per pensare o agire. frontier è un consulto opzionale, non il motore cap. 8 3 · Confini deterministici Insieme ammesso, firme, validazione ed esecuzione sono codice controllabile; il modello propone soltanto dentro quei confini. la parte probabilistica resta dichiarata, misurata e soggetta a controllo cap. 5 · 8 insieme: un agente governato, ispezionabile e tuo
Figura 2 — Le tre scommesse. Ognuna rovescia un'abitudine delle piattaforme agentiche: fiducia automatica nelle skill importate, precedenza al cloud, LLM trattato come un oracolo da interrogare a ogni turno.

Il confronto, senza sconti

Piattaforma agentica tipicaMetnos
StrumentiScritti a mano, importati o generati in forma libera, poi eseguiti così come sono, con i privilegi dell'assistenteSintetizzati anche durante l'esecuzione, ma da un vocabolario chiuso e sottoposto a controllo: firmati, fatti decadere nel tempo, provati e vagliati prima di poter girare
SicurezzaCi si fida dell'autore del pacchettoNon ci si fida del pacchetto: deve superare il filtro di ammissione a sette livelli (cap. 7)
LLMSpesso prima il cloudLocale prima; livello frontier facoltativo
InstradamentoIl modello può scegliere liberamente fra strumenti non governatiInsieme tipizzato, grammatica, validatore e firme di validità circoscrivono la proposta. Un piano valido letto dalla cache è riproducibile; una nuova proposta LLM può variare (cap. 8)
RisultatoLibero, diverso per ogni strumentoUniforme: lista in ingresso e lista in uscita, componibile fra passi (cap. 6)
AnnullamentoRaro o senza garanzia completaFunzione fondamentale: catalogo chiuso di operazioni inverse, spostamento = COPIA → verifica → CANCELLAZIONE, ok_count aderente alle operazioni realmente annullate (cap. 12)
LinguaInglese, stringhe nel codiceLingua per utente; prompt, manifest, messaggi e lessico sono dati distinti e convalidati

Dove si trova il determinismo

Metnos non presenta la prosa del modello come prova. Prefiltro, grammatica, validatore, filtro di ammissione, esecuzione e verifica delle cache sono componenti controllabili e coperti da prove. Quando una richiesta ha un piano memorizzato ancora valido, il percorso veloce lo riusa senza una nuova chiamata al modello; quando il piano deve essere generato, la proposta resta probabilistica ma confinata e osservabile (cap. 9).

3. I concetti chiave, in sette carte

Sette parole reggono tutto il documento. Definirle adesso vi risparmia mezz'ora di confusione fra trenta righe; ognuna ha il suo contratto implementativo nell'atlante dei componenti.

executor — una capacità eseguibile: un piccolo programma che fa una cosa sola e bene (leggere file, mandare una mail, spostare messaggi, cercare foto). Accetta liste in ingresso e produce liste in uscita, ha un manifesto che lo descrive, una firma Ed25519 che lo autentica e un profilo di isolamento che lo confina. È l'unica classe di cose che agiscono nel sistema.
vocabolario chiuso — ogni executor si chiama verbo_oggetto[_qualifier[_descriptor]], componendo insiemi governati di azioni e oggetti canonici più qualificatori in quattro famiglie. Non è una convenzione estetica: è il confine di ciò che il sistema può nominare — e quindi sintetizzare. I termini nuovi entrano solo con un governo esplicita (necessario · generale · comprensibile).
manifesto — la carta d'identità TOML di un executor: descrizione in capitoli prescrittivi (SCOPO / PATTERN / NON / OUT), schema degli argomenti, parole di affinità, pattern di reversibilità, digest del codice. Non è documentazione per esseri umani: è il prompt dello strumento, scritto perché un LLM medio lo usi bene (cap. 6).
synt — il processo che crea ciò che l'insieme disponibile non sa ancora fare: una cascata di strategie a costo crescente che prima compone executor esistenti e solo come eccezione documentata genera codice nuovo, in cinque stadi più una verifica semantica (cap. 7). Propone; l'umano approva.
vaglio — il filtro che sta sempre prima dell'esecuzione: una guardia deterministica (percorsi vietati, comandi irrecuperabili) seguita da un giudice che pesa le operazioni in zona grigia e, sopra soglia, chiede conferma esplicita all'utente con bottoni sul canale (cap. 12).
mnest · mnestoma — il mnest è il filo che collega due executor attivati insieme: nasce dal contesto, si rinforza con l'uso, decade se non riusato. Il mnestoma è il grafo di tutti i mnest: la memoria associativa del sistema, su SQLite, curata da un processo notturno (l'ager). Dà al pianificatore l'intuizione di «quale executor di solito segue quale» (cap. 9).
skill ↔ servizio di esecuzione — due assi ortogonali: la skill decide se un gruppo di capacità è attivo, fidato e configurato (dormiente finché manca il prerequisito); il servizio, indicato nel codice come backend, decide come un'azione gira contro un servizio concreto (calendario = ICS locale oppure Google), scelto dalla configurazione — mai dall'LLM. Il pianificatore non vede mai il fornitore.

L'anatomia di un nome

Il vocabolario chiuso è l'idea più fertile del progetto: rende i nomi componibili (il pianificatore può prevedere come si chiama una capacità che non ha mai visto), filtrabili (il filtro preliminare ragiona su verbo e oggetto) e sintetizzabili (synt non può nominare nulla fuori dalla grammatica).

Anatomia di un nome: verbo_oggetto[_qualifier[_descriptor]] find _ images _ indices _ dry-run azione insieme canonico governato read, write, move, find, get, list, filter, send, … oggetto insieme canonico governato files, messages, events, images, urls, entries, … qualifier (opz.) 4 famiglie formato · modalità safety · fornitore descriptor (opz.) kebab-case, max 30 variante comportamentale a parità di argomenti i 5 verbi-produttori, ortogonali find = pattern / query get = id noti o snapshot read = id → contenuto list = enumera il contenitore filter = predicato su lista l'asse è l'input primario, mai un sinonimo read_messages move_files get_urls classify_entries write_files_doc find_issues_github Il vocabolario è CHIUSO: un termine nuovo entra solo se necessario, generale e comprensibile a un LLM medio. Sinonimi prima dell'estensione; escalation umana per ogni parola nuova. La grammatica decide cosa è nominabile.
Figura 3 — L'anatomia di un nome. Quattro livelli posizionali, di cui gli ultimi due opzionali; i cinque verbi-produttori si distinguono per l'input primario, così il pianificatore non deve mai scegliere fra sinonimi.
Parte II · Una richiesta in movimento

Segui un turno dalle parole agli effetti

Gli strati diventano più chiari quando osservi dati, decisioni e autorità attraversarli.

4. L'architettura a strati

Metnos è una cipolla: l'esterno parla col mondo, l'interno esegue. Ogni strato si fida solo di quello più interno e i privilegi calano scendendo verso il centro. Una richiesta — venga da un utente o da un'attività programmata — li attraversa tutti, nell'ordine.

Gli strati, dall'esterno verso il centro 1 · Canali adattatori verso il mondo: servizio Telegram (appaiamento, pulsanti) · server web :8770 (chat, amministrazione, SSE) runtime/channels/ · metnos_http_server 2 · Motore del turno normalizza la richiesta · scorciatoie letterali · estrazione dell'intento (verbo + oggetto + parole chiave) agent_runtime · intent_extractor 3 · Motore cognitivo — Mētis memoria dei piani (L0 · L1) → prefiltro → proponente vincolato → validatore → esecuzione recupero mirato dagli errori · terminatore esplicito nei vicoli ciechi — cap. 5 runtime/engine/* 4 · Guardie regole (tre livelli di autonomia) · Vaglio = guardia + giudice + consenso · isolamento bubblewrap per ogni invocazione policy · vaglio · sandbox 5 · Executor firmati, sintetizzati o importati dopo il filtro di ammissione — tutti vettoriali, tutti col loro manifest executors/ · ~/.local/…/executors/ 6 · Servizi e skill il fornitore concreto (file locali, IMAP, Google Workspace, GitHub, web…) scelto dalla configurazione, mai dall'LLM backends/ · skills 7 · Tessuti persistenti mnestoma · archivi fastpath/autopath · cronologia e copie per l'annullamento · registro a sola aggiunta (SQLite e file) ~/.local/share/metnos/ una richiesta li attraversa in ordine privilegi e fiducia calano scendendo
Figura 4 — I sette strati reali, con i moduli che li implementano. Il motore cognitivo (strato 3) è il cuore del capitolo 5; le guardie (strato 4) stanno sempre fra il piano e l'effetto.

5. Anatomia di un turno con più strumenti

Questo è il capitolo da leggere se ne leggete uno solo. Seguiamo una richiesta esemplificativa — «cerca le mail spam e mettile nel cestino» — dall'ingresso alla risposta: quattro strumenti concatenati, una proposta strutturata e ogni passaggio misurato e annotato.

5.1 La cascata, passo per passo

La regola di fondo: il modello è l'ultima risorsa, non la prima. Prima si tenta la memoria senza LLM; se la richiesta è nuova, il proposer chiede al modello l'intero piano strutturato. Il numero di chiamate dipende dalla configurazione dei candidati e della grammatica; l'esecuzione del piano validato segue regole deterministiche.

Un turno, dall'ingresso alla risposta «cerca le mail spam e mettile nel cestino» scorciatoie letterali tabella chiusa: «che ora è», «dove sono», «annulla»… microsecondi ✗ nessun match → si prosegue intent_extractor — LLM tier fast, ragionamento spento verb = move object = messages kw = spam… ~0,4 s richieste composte → lista ordinata di clausole motore Mētis — un solo punto d'ingresso, ogni strato annota se ha risposto Fastpath L0 — successi registrati automaticamente impronta esatta · semantica solo per piani generalizzabili 0 LLM ✗ miss Autopath L1 — piani confermati dal riscontro cerca per significato della richiesta, poi per intento esatto 0 LLM ✗ miss: richiesta nuova prefiltro → insieme ammesso per la clausola find_messages classify_entries filter_entries move_messages rango: verbo+oggetto » qualificatore » affinità (limite +3) 0 LLM deterministico: stessa richiesta → stesso insieme, stesso ordine Proponente Mētis — livello wise configurato propone l'intero piano: passi + collegamenti + messaggio finale N candidati adattivi, ognuno vincolato dalla grammatica GBNF filtro per verbo sull'insieme · arresto anticipato se il primo convince · rango teleologico LLM vincolato il modello sceglie DENTRO il binario: niente prosa, niente argomenti inventati (cap. 8) Validatore — controllo deterministico del piano gli strumenti esistono? gli argomenti sono ben formati? i riferimenti puntano a passi reali? 0 LLM errore banale → 1 riproposta, mai eseguire Esecuzione deterministica — passo per passo, niente dadi 1 find_messages → 42 entries 2 classify spam / non spam 3 filter → 12 entries 4 move_messages ⚙ vaglio: consenso → ok_count=12 per ogni passo: risolvi from_step e segnaposti → Vaglio → invocazione isolata → osservazione limiti di sicurezza: 12 passi per turno · stesso executor al massimo 3 volte di fila composizione del messaggio finale "Spostate ${step4.ok_count} mail nel cestino." → valori reali L0 registra il successo; L1 osserva L1 diventa attivo dopo un riscontro positivo (cap. 9) un passo fallisce? Recupero mirato classifica: strumento errato · argomenti · ingresso mancante ripropone escludendo lo strumento fallito, poi riesegue Terminatore — vicolo cieco dichiarato «Non posso risolvere: X. Per procedere: Y.» registra la lacuna — mai una risposta inventata «Spostate 12 mail nel cestino.» il registro annota quale livello ha risposto e i millisecondi di ogni fase telemetria per sotto-fase: intent_ms · prefilter_ms · vaglio_ms · exec_ms — ogni turno è misurabile e confrontabile
Figura 5 — L'anatomia di un turno con più strumenti. Le scorciatoie valide si tentano prima; se la richiesta è nuova, il Proponente chiede al modello un piano strutturato e il Validatore lo controlla prima dell'esecuzione. Il Vaglio precede ogni passo che lo richiede; a destra sono indicati il recupero mirato e il vicolo cieco dichiarato.
  1. Scorciatoie letterali. Una tabella chiusa riconosce le frasi notissime («che ora è») in microsecondi. Qui non trova corrispondenze.
  2. Intento. Una chiamata al livello fast (ragionamento spento, ~0,4 s) estrae verbo canonico, oggetto e parole chiave. Le richieste composte diventano una lista ordinata di clausole, ognuna col proprio insieme ammesso.
  3. Memoria dei piani. Fastpath L0 riusa un successo registrato automaticamente; Autopath L1 riusa uno scheletro generalizzato confermato da un riscontro positivo. Entrambi controllano le firme del catalogo e dell'insieme prima di usare la cache. Qui non trovano nulla: è la prima volta.
  4. Prefiltro. Il catalogo si riduce all'insieme pertinente per la clausola: corrispondenza su verbo e oggetto, peso del qualificatore e, per rompere i pareggi fra executor affini, peso dell'affinità curata. Tutto è deterministico: stessa richiesta, stesso insieme, stesso ordine.
  5. Proponente Mētis. Il livello wise produce l'intero piano strutturato: passi, collegamenti e messaggio finale. In base alla configurazione può generare uno o più candidati; la grammatica GBNF limita i nomi disponibili e un ordinamento deterministico sceglie il candidato da convalidare.
  6. Validatore. Controlla il tipo del piano prima di eseguirlo: strumenti esistenti, argomenti ben formati e riferimenti reali. Un errore banale costa una nuova proposta, non un'esecuzione sbagliata.
  7. Esecuzione. Meccanica pura: per ogni passo il motore risolve i segnaposti, passa dal Vaglio, invoca l'executor nell'ambiente isolato e accumula l'osservazione. Limiti: 12 passi per turno e lo stesso executor al massimo tre volte di seguito.
  8. Chiusura. Il messaggio finale viene composto dai risultati effettivi. Se il turno è memorizzabile e riesce, L0 registra il piano; L1 conserva un'osservazione e richiede un riscontro positivo prima di promuovere lo scheletro generalizzato.

5.2 Il piano: cosa propone davvero il modello

Il Proponente non produce prosa: produce un oggetto strutturato — passi, valori da completare e messaggio finale. Questo è il piano reale della nostra richiesta:

{
  "steps": [
    {"tool": "find_messages",
     "args": {"folder": "INBOX", "query": "is:unread"}},
    {"tool": "classify_entries",
     "args": {"from_step": 1, "dimension": "spam"}},
    {"tool": "filter_entries",
     "args": {"from_step": 2, "where_field": "spam", "where_value": "spam"}},
    {"tool": "move_messages",
     "args": {"from_step": 3, "dst_folder": "${FILLER:cestino_folder}"}}
  ],
  "fillers": {
    "cestino_folder": {
      "prompt": "Come si chiama la cartella cestino per questo account?",
      "default": "Trash",
      "tier": "fast"
    }
  },
  "final_message": "Spostate ${step4.ok_count} mail nel cestino."
}

Da notare: il modello non conosce il nome della cartella cestino dell'account — e non lo inventa. Dichiara un valore da completare (${FILLER:cestino_folder}) che il motore riempirà al momento giusto con una breve chiamata economica, conservata in cache, oppure con il valore predefinito.

5.3 Il passaggio dei dati: come comunicano i passi

SegnapostoCosa fa
from_step: NPrende le entries prodotte dal passo N (numerazione da 1) e le passa intere a questo passo. Le liste viaggiano solo così: non vengono mai ricopiate nel prompt.
${stepN.field}Estrae un campo scalare dal risultato del passo N; sono ammessi anche percorsi annidati. Si usa soprattutto nel messaggio finale.
${FILLER:nome}Valore completato al momento da una breve chiamata al livello fast, conservata in cache, oppure dal valore predefinito dichiarato.
${RUNTIME:chiave}Contesto del turno, risolto dal motore: actor (chi parla), lang (lingua), channel (canale).
Il data piping: liste fra gli step, scalari nei segnaposti step 1 · find_messages folder="INBOX" query="is:unread" → entries (42 mail) step 2 · classify_entries from_step: 1 dimension="spam" → entries + campo spam step 3 · filter_entries from_step: 2 where spam == "spam" → entries (12 mail) step 4 · move_messages from_step: 3 dst=${FILLER:cestino_folder} → results, ok_count=12 entries entries entries ${FILLER:cestino_folder} slot dichiarato dal piano, riempito dal runtime: micro-chiamata tier fast (con cache) oppure default → «Trash» ${RUNTIME:actor · lang · channel} contesto del turno, iniettato dal runtime: chi sta parlando, in che lingua, da quale canale final_message — il template della risposta "Spostate ${step4.ok_count} mail nel cestino." riempito a esecuzione finita con i valori reali → «Spostate 12 mail nel cestino.» ${step4.ok_count} scalare, non lista legenda dei collegamenti from_step — liste intere fra passi ${stepN.field} — un campo scalare ${FILLER:nome} — valore completato al momento ${RUNTIME:chiave} — contesto del turno
Figura 6 — Il piano della Figura 5 visto come flusso di dati. Le liste scorrono fra i passi tramite from_step; gli scalari, i valori da completare e il contesto passano per segnaposti tipizzati che l'esecutore risolve in modo deterministico.

Risultati parziali e limiti

Se un limite tronca un risultato, per numero di elementi, byte o passi, l'executor lo dichiara nei campi truncated, used e available_total, quando il contratto li prevede, e il motore lo rende visibile nella risposta. Può proporre di ampliare il limite soltanto quando è tecnicamente possibile e non lo amplia da solo. Un risultato parziale presentato come completo è un errore.

Parte III · Agire

Piccoli programmi, autorità esplicita

Gli executor fanno il lavoro. I manifest lo limitano. Regole e collocazione decidono dove può avvenire.

6. Executor: vettoriali per costruzione

Ogni executor accetta una lista e ritorna una lista — anche quando la lista ha zero o un elemento. Non esiste nessun *_batch: l'executor gestisce già le operazioni per lotti. È la decisione che rende i piani corti e i risultati componibili.

Un solo contratto per N = 0, 1, mille paths = [] paths = ["/tmp/x.txt"] paths = [… ×1000] lista degenere o enorme: stesso ingresso, nessun caso speciale move_files iterazione, paginazione e finestre temporali vivono DENTRO; la diramazione torna al pianificatore limiti espliciti: max_total, max_results, max_bytes sempre una lista, più la verità results = […] ok_count = 12 (reali, non sperati) truncated = true used = 200, available_total = 312 cap_field = "max_total" move_files_batch  non esiste — e non esisterà: la forma vettoriale è l'unica forma.
Figura 7 — Il contratto vettoriale. Zero, uno o mille elementi attraversano lo stesso codice; i limiti sono argomenti espliciti e il troncamento è dichiarato nei campi, mai nascosto.

Dal contratto discendono tre convenzioni che vedrete ovunque:

Il manifest: il prompt dello strumento

Ogni executor porta con sé un manifest TOML. Non è documentazione di cortesia: è ciò che il pianificatore legge quando decide se e come usare lo strumento — scritto su misura per un LLM medio locale, non per un modello frontier. Frasi corte, esempi letterali, valori predefiniti in chiaro; la descrizione segue quattro capitoli prescrittivi:

Lo stesso manifest dichiara anche dove l'executor può girare. I campi platforms e [placement] impediscono di mandare a Windows uno strumento scritto solo per Linux, o di eseguire su un PC un executor non verificato per quel dispositivo. Quando la chat nomina un PC appaiato, il motore usa queste dichiarazioni per decidere se eseguire sul server o sul dispositivo; se il bersaglio non è raggiungibile, l'esito è esplicito e non viene scelto un ripiego silenzioso.

[description]
it = "SCOPO: cerca file per pattern in directory.
      PATTERN: find_files(base_path=\"/\", patterns=[\"*.jpg\"]).
      NON: list_dirs+filter_entries; get_files (lookup ID).
      OUT: entries=[{path,name,type,mime,kind,size,mtime}]."
Il manifest alimenta quattro meccanismi diversi executors/find_files/manifest.toml name = "find_files" affinity = ["trova","cerca","search", "file","glob","pattern",…] [description] SCOPO: … PATTERN: find_files(…) NON: … OUT: entries=[{…}] per lingua (IT+EN), con tracciamento dello stato [args] — JSON Schema base_path (req) · patterns · recursive max_total … tipi, valori predefiniti, esempi reverse_pattern + capabilities es. "swap_src_dst" · fs:read · provider:access [code] digest sha256 + firma files = ["find_files.py"] prefiltro (cap. 5) l'affinità curata rompe i pareggi fra executor affini insieme del Proponente (cap. 5) il modello copia la FORMA dal PATTERN, non inventa grammatica GBNF (cap. 8) lo schema degli argomenti vincola la decodifica annullamento (cap. 12) il pattern inverso viene da un catalogo chiuso il digest firma il codice: se il file cambia senza ri-firma, il caricatore scarta l'executor — niente codice alla deriva
Figura 8 — Un solo manifest, quattro consumatori: prefiltro, insieme del pianificatore, grammatica e annullamento leggono campi diversi dello stesso TOML. L'impronta lega il manifest al codice firmato.

Una sola politica di esecuzione

Ogni chiamata a un executor, locale o remota, attraversa lo stesso motore di esecuzione. In un punto solo il motore applica metriche, retropressione, limiti per risorsa e un tetto derivato dall'hardware. Il comportamento predefinito resta intenzionalmente seriale e il raggruppamento trasversale è spento: adottare l'infrastruttura non cambia l'ordine, gli ingressi, i risultati o le capacità degli executor esistenti.

[execution]
effect = "unknown"
parallelism_class = 0
resource_class = "default"
concurrency_key = "none"
equivalence_gate = "unverified"
ClasseBudget richiestoAmmissione
0Nessun thread trasversale.Predefinita per tutti gli executor esistenti e generati.
1Concorrenza moderata.Solo dopo equivalenza verificata; sempre entro i limiti del motore e dell'hardware.
2Concorrenza alta.
3Massimo controllato.

La classe misura soltanto un budget: non concede autorità e non significa sola lettura. Un futuro executor che crea o modifica oggetti può essere concorrente, ma deve dichiarare una chiave d'isolamento, fornire l'identità della risorsa e superare prove di equivalenza, collisione, idempotenza e postcondizione. Se manca uno di questi riscontri, il caricatore lo riporta alla classe 0.

Anche i tre percorsi che generano executor — proposta Synt, sintesi reattiva e generazione da skill — consumano un unico contratto centrale. Il modello locale può progettare un'implementazione ricca, ma non può riscrivere identità, ciclo di vita, I/O o politica iniziale. Se parallelizza elementi indipendenti, il numero di processi di lavoro arriva dal motore e i risultati devono tornare nell'ordine di ingresso.

Regola di conservazione. Un executor resta seriale finché non dichiara esplicitamente di essere parallelizzabile e non supera la prova di equivalenza. Cambiare la politica centrale propaga limiti e osservabilità a tutti; non promuove implicitamente nessun executor.

Autorità remota: dichiarata una volta, consumata tre volte

Il nome di un fornitore dentro un argomento è un dato, non un permesso. Per un executor conforme, l'accesso remoto esiste solo quando il manifest dichiara una capacità provider:access effettiva. Una condizione when chiusa può attivarla soltanto per il servizio selezionato. Condizioni invalide o non corrispondenti non concedono nulla.

Regola di autorità. Lo stesso collegamento effettivo governa credenziali, rete e collocazione. Nomi, suffissi e argomenti arbitrari non sono percorsi di permesso indipendenti per gli executor conformi.

Esecuzione sul server o su un PC registrato

La forma normale resta semplice: il piano sceglie un executor, il motore lo passa attraverso regole e Vaglio, poi lo invoca nell'ambiente isolato del server. Gli executor remoti aggiungono una sola deviazione controllata: per alcuni executor dichiarati portabili, il punto di esecuzione può essere un PC registrato nella stessa rete o in una rete privata sovrapposta.

Non è un nuovo canale e non è un servizio qualunque. Il canale resta Telegram o web; il servizio resta file, posta, calendario o altro. L'executor remoto indica il luogo in cui gira il piccolo programma firmato. Metnos mantiene sul server la scelta dell'executor, il controllo delle regole, il registro dei dispositivi, la firma del contenuto, la scadenza e il tracciamento.

chat "sul PC ufficio" server Metnos pianificatore + regole + Vaglio manifest: piattaforme + collocazione coda firmata, scadenza, registro metnos-client poll in uscita + verifica firma PC registrato executor compatibile Job Object / bwrap risultato firmato risultato firmato: stessa forma di un executor locale
Figura 8b — L'executor remoto non sposta il cervello: sposta solo l'esecuzione di un executor ammesso. Il server resta l'autorità che decide, firma, attende e registra.

La scelta non dipende dall'indirizzo IP del browser. In una UI web la macchina che apre la pagina può coincidere col server, con un altro PC della rete, o essere dietro un proxy; da Telegram non c'è proprio un browser locale. Per questo Metnos usa il nome del dispositivo appaiato e lo collega al linguaggio della richiesta: «sul portatile» indica una destinazione, «il portatile» da solo non lo è.

Il client remoto non riceve libertà generale. Interroga periodicamente il server, non espone porte; verifica la firma del server prima di eseguire; scarica solo executor firmati e compatibili; scrive il risultato nella coda locale prima di consegnarlo. Se il server non risponde, ritenta la consegna senza rieseguire il lavoro già fatto.

Il client remoto è contenuto per costruzione: su Windows il Job Object limita durata, memoria e albero dei processi; su Linux l'ambiente isolato usa bwrap quando presente. Gli executor remoti possono eseguire sul dispositivo anche operazioni che modificano i file — scrittura, spostamento e cancellazione — applicando le regole richieste: idempotenza, tracciamento e reversibilità legata al dispositivo (operazioni inverse deterministiche e copie accodate allo stesso dispositivo per l'annullamento; resta il limite noto che il ripristino da una copia binaria non è eseguibile da remoto). Gli executor le cui dipendenze non sono risolvibili sul dispositivo restano vincolati al server.

Il dettaglio operativo — appaiamento del PC, installazione dall'interfaccia, segnale periodico di presenza, coda firmata, isolamento per sistema operativo e limiti attuali — sta nel contratto executor remoti.

7. Synt: la fabbrica degli strumenti

Quando l'insieme disponibile non sa fare una cosa, il pianificatore non improvvisa codice nel mezzo del turno: passa la mano a synt, il processo che fa esistere ciò che manca. Prima prova a comporre executor esistenti; solo come eccezione documentata genera un executor nuovo — in cinque stadi, ognuno col suo contratto.

La catena di montaggio: cinque stadi + verifica ogni stadio vede solo la fetta minima di contesto; il vocabolario chiuso entra SOLO allo stadio 1 1 · NOME nome conforme al vocabolario chiuso + reversibile, critico livello middle 2 · FIRMA schema degli argomenti, capacità richieste, pattern di reversibilità livello middle 3 · PROVE 4-6 prove iniziali: caso felice, lista vuota, argomenti non validi, casi limite livello middle 4 · DESCRIZIONE descrizione a capitoli (SCOPO/PATTERN/NON/OUT) + parole di affinità livello middle 5 · CODICE il file Python con def invoke() (+ operazione inversa se serve) livello wise stadio 6 · verifica semantica prudente un LLM separato confronta descrizione e codice: dicono la stessa cosa? nel dubbio rifiuta: meglio perdere un buon synth che ammetterne uno fasullo firma Ed25519 + digest manifest e codice legati insieme prove iniziali in ambiente isolato le 4-6 prove dello stadio 3, eseguite davvero nell'insieme ammesso, accanto agli affini stesso contratto vettoriale, stesso manifest, stesso isolamento degli executor scritti a mano La sintesi è locale: nessun fornitore esterno scrive codice che girerà sulla tua macchina. Un difetto in un executor sintetizzato si corregge migliorando il prompt dello stadio, mai riscrivendo a mano il file generato.
Figura 9 — Il processo di sintesi: quattro stadi procedurali sul livello medio, il codice sul livello alto, poi verifica semantica indipendente, firma e prove iniziali. La successione degli stadi convalida ciò che un singolo prompt non riusciva a garantire.

Due inneschi, una cascata

ModoInnescoTempo
ReattivoDurante un turno: il pianificatore non trova nessun executor che soddisfi la richiesta.Sincrono — l'utente sta aspettando; prima si tenta la composizione di executor esistenti.
IntrovertivoDi notte: l'ager scorre il mnestoma e trova ricorrenze e tracce sovrapposte.Asincrono, in omeostasi: propone soltanto deduplicazioni; generalizzazioni e specializzazioni non sono generatori attivi.

In entrambi i casi vale la stessa regola: synt propone, l'umano approva. Nessuna auto-modifica senza filtro; ogni proposta arriva con motivazione, ed è reversibile.

Il filtro di ammissione a sette livelli

Lo stesso imbuto vale per il codice sintetizzato e per le skill importate da fuori: nessun pacchetto si esegue sulla fiducia.

Il filtro di ammissione: sette livelli, nessuna eccezione pacchetto / synth nuovo non fidato 1 firma Ed25519+digest 2 vocabolario nome + affinità 3 invecchiamento quarantena d'uso 4 isolamento profilo dal manifest 5 prova operativa esecuzione provata 6 verifica LLM descrizione vs codice 7 registro a sola aggiunta executor fidato nell'insieme ammesso «non fidarti del pacchetto — il pacchetto deve guadagnarsi il posto» le skill eseguite senza adattamento usano codice di terzi con i privilegi dell'assistente: per un agente che tocca file, posta e shell eseguono, per loro natura, codice remoto. Metnos sceglie la sicurezza per costruzione. le skill importate attraversano lo stesso filtro degli executor nativi
Figura 10 — Il filtro a sette livelli, identico per executor sintetizzati e importati: firma, vocabolario, quarantena d'uso, isolamento, prova operativa, verifica semantica e registro. Solo in fondo all'imbuto un pacchetto diventa un executor fidato.

8. Cinque livelli, un instradamento governato

I livelli sono ruoli astratti, non modelli inchiodati: fast / middle / wise / creative sono incarichi che leghi a qualunque endpoint tu abbia, frontier è il cloud facoltativo. Più livelli possono condividere un endpoint oppure essere separati: il pianificatore vede sempre il ruolo.

LivelloRuoloVincolo
fastDecisioni brevi e strutturate: intento, filler e riduzioni ristrette.Endpoint configurato; risposta corta. Obbligatorio.
middleLavoro procedurale e giudizi intermedi: estrazioni, classificazioni e stadi 1-3 della sintesi.Policy deterministica del ruolo.
wiseIl pianificatore e la sintesi ad alta fedeltà: piano intero, codice e verifiche.Policy deterministica del ruolo.
creativeProposte divergenti e testo editoriale, incluso lo stadio 4 della sintesi.Policy separata con temperatura 0,35.
frontierUn consulto esterno quando richiesto esplicitamente, per esempio per analizzare una segnalazione.API cloud facoltativa, con ripiego gestito se la chiave non c'è.

Un livello non è un modello

I livelli descrivono ruoli e requisiti, non un modello specifico. Una GPU o una NPU non è obbligatoria: l'amministratore può associare un livello a un endpoint su CPU, a un modello locale già disponibile o, dove previsto, a un servizio esterno. La qualità del modello scelto incide sulla qualità della pianificazione, non sulla validità dell'installazione.

Tre controlli sulla variabilità

Un LLM a temperatura zero non rende automaticamente riproducibile una nuova pianificazione. Metnos riduce la variabilità e, soprattutto, separa la proposta probabilistica dai controlli deterministici che la precedono e la seguono:

Tier astratti a sinistra, controlli a destra fast intent · filler · classify middle synt 1-4 · descrizioni wise piani · codice synth endpoint configurati condivisi o distinti per ruolo cambiano modello e parametri: think · num_predict frontier consulto cloud, facoltativo solo se richiesto, mai il motore Controllo 1 — seme esplicito un seme configurato riduce una fonte di variabilità, ma non trasforma il modello in una funzione matematica pura. METNOS_LLM_SEED=42 (predefinito; -1 = casuale esplicito) Controllo 2 — pareggi rotti da dato curato fra executor affini con lo stesso oggetto decide l'affinità distintiva del manifest (verbi generici esclusi), mai un lancio di moneta. prefilter: bonus = min(|query ∩ affinity|, 3) Controllo 3 — grammatica e validatore dall'insieme del passo si genera una GBNF (unione discriminata): la grammatica limita il risultato quando è attiva; il validatore respinge nomi, argomenti e riferimenti incoerenti. stessa richiesta → stesso insieme; cache valida → stesso piano registrato una nuova proposta può variare; controlli e transizioni restano verificabili vincolo orientativo = «per favore guida a destra» · grammatica = la barriera il primo si può ignorare, il secondo no: ogni token candidato viene filtrato contro la grammatica prima della scelta + filtro per verbo: l'insieme si restringe ai verbi compatibili con l'intento della clausola
Figura 11 — A sinistra i livelli come ruoli legati agli endpoint configurati; a destra i controlli che riducono la variabilità e impediscono di eseguire una proposta strutturalmente non valida.

Struttura controllata

Il Proponente richiede un oggetto strutturato, usa la grammatica quando è configurata e applica comunque un'analisi sintattica bilanciata seguita dalla validazione. Un risultato illeggibile o non conforme non viene eseguito.

Parte IV · Ciò che circonda l'azione

Memoria, sensi, canali e protezioni

Questi tessuti rendono il sistema utile nel tempo, visibile all'utente e abbastanza sicuro da operare.

9. La memoria che accelera

Metnos non addestra modelli: niente riaddestramento, niente RLHF. Tutto ciò che impara è dato ispezionabile — piani, tracce, scorciatoie — e ogni cosa imparata si può leggere, correggere, cancellare. L'effetto pratico: più lo usi, meno chiama il modello.

Il circolo: usare → registrare → riusare quando è sicuro turno riuscito il piano ha funzionato davvero L0 registra; L1 osserva piano, intent e firme del mondo indicizzati per uso futuro richiesta simile, domani se argomenti e firme restano validi: riuso senza nuova pianificazione riscontro positivo esplicito conferma l'osservazione L1 e può promuovere lo scheletro generalizzato mnestoma — il grafo dei mnest (SQLite) due executor attivati insieme → un filo che si rinforza con l'uso e decade se non riusato; le lacune restano come aspirazioni l'orologio è il tempo dell'uso, non il calendario: un sistema che dorme non invecchia manutenzione e proposte governate i job configurati potano record scaduti e possono trasformare ricorrenze utili in candidati di sintesi; la proposta resta distinta dall'applicazione le modifiche passano dal ciclo change_intent (cap. 7) ogni turno lascia tracce imparare = accumulare record ispezionabili, non addestrare il modello
Figura 12 — Il riuso senza addestramento: L0 registra i successi memorizzabili, L1 promuove una generalizzazione dopo il riscontro positivo, le co-attivazioni alimentano il mnestoma e le modifiche proposte restano sottoposte al ciclo di decisione.

10. I sensi: la pipeline immagini

Per cercare nelle foto, Metnos non spedisce nulla a nessuno: tre estrattori nel processo trasformano ogni immagine in tre segnali — cosa si vede, chi c'è, dove e quando — fusi in un indice unificato interrogabile dal vocabolario normale.

Tre segnali da ogni foto, un indice solo una foto dell'archivio semantica — embedder visuale configurato l'immagine diventa un vettore: «tramonto al mare», «torta di compleanno», «sentiero in montagna» volti — rilevamento e riconoscimento configurati trova i volti, li trasforma in impronte d'identità; le persone si registrano con nome solo se lo chiedi tu contesto — EXIF coordinate GPS, data e ora, fotocamera: il dove e il quando senza nessun modello indice unificato un record per foto: scena + persone + luogo + tempo costruito una volta, interrogato sempre «le foto in montagna dell'estate scorsa» find_images_indices stesso vocabolario di tutto il resto tutto nel processo, sulla tua macchina: l'archivio fotografico non lascia mai casa
Figura 13 — La pipeline immagini usa i ruoli configurati per semantica e volti e legge EXIF per luogo e tempo. I tre segnali confluiscono in un indice unificato interrogabile con un normale executor del vocabolario.

La ricerca arriva dal canale come qualunque altra richiesta: il pianificatore compone find_images_indices con i criteri estratti dalla frase, e il canale mostra le anteprime inline. La costruzione dell'indice è un lavoro di fondo, incrementale e riavviabile, che si lancia con una frase («indicizza le foto in…»).

11. I canali: Telegram e web

Un canale è un adattatore: converte un'interfaccia esterna in messaggi e risposte, più una capacità opzionale — rendere bottoni per conferme e scelte. Due canali nascono con l'installazione; aggiungerne altri non tocca il nucleo.

Due porte d'ingresso, zero porte aperte verso Internet la macchina di Metnos server web — porta 8770 chat (streaming SSE) + cruscotto admin daemon Telegram long-poll IN USCITA verso l'API del bot browser in LAN (o via overlay VPN tuo) chiave admin al primo accesso proposte · executor · esecuzioni safety · turni · grafici HTTP :8770 API Telegram il servizio interroga Telegram: niente porte aperte, niente IP pubblico telefono ovunque c'è rete, parli col tuo bot pulsanti nel messaggio chi può parlare? solo chi è appaiato: codici Ed25519 firmati e a scadenza, livello di autorizzazione per persona un mittente sconosciuto viene scartato senza eco; conferme del Vaglio e scelte arrivano come pulsanti sul canale
Figura 14 — I due canali. Il browser parla direttamente col server sulla porta 8770 (chat progressiva e cruscotto); Telegram viene interrogato in uscita, quindi non richiede porte aperte né un indirizzo IP pubblico. In basso, l'appaiamento decide chi può parlare.
CanaleCosa offre
Web :8770Chat nel browser con risposta progressiva (SSE), anteprime delle immagini e pulsanti di riscontro; cruscotto amministrativo per proposte, executor, esecuzioni, sicurezza e turni. La stessa API risponde in JSON o HTML secondo l'Accept. La chiave amministrativa viene creata al primo avvio e salvata con permessi 0600.
TelegramIl tuo bot personale: messaggi, foto e pulsanti nel messaggio per le conferme del Vaglio e per le scelte. L'appaiamento usa il comando /pair e un codice firmato con scadenza.

Il Tutor: spiegare senza eseguire

Le domande esplicite su come usare Metnos vengono intercettate allo stesso confine HTTP/Telegram, prima del pianificatore e senza consumare un dialogo pendente. Il primo passaggio distingue spiegazioni, azioni, richieste miste e intenzioni ancora incerte. Un nome di pagina, un percorso relativo o un URL canonico può identificare direttamente una fonte pubblicata; negli altri casi il modello di rappresentazione configurato confronta la domanda con le unità del catalogo SQLite firmato.

Dopo il recupero, l'identità autenticata filtra le fonti. Una fonte firmata può richiamare soltanto osservazioni di sola lettura registrate e limitate: executor ammessi, servizi, dispositivi posseduti e attività programmate dell'utente. Il modello locale formula la risposta esclusivamente da queste evidenze; non riceve strumenti e usa la risorsa centrale llm in classe seriale.

Se una richiesta contiene anche un'azione separabile, il Tutor risponde alla parte informativa, conserva alla lettera la clausola operativa e chiede se consegnarla al normale motore di Metnos. La consegna è monouso, legata all'utente e alla conversazione e avviene soltanto dopo conferma. Il Tutor non esegue l'azione. I riscontri possono migliorare il recupero per quella sola persona, senza modificare il pianificatore o le cache dei piani.

Il confine del Tutor

Il runtime governa identità, livello di accesso, integrità delle fonti, registro delle osservazioni e consegna delle azioni. Classificazione semantica, recupero e composizione intervengono dove la varietà del linguaggio renderebbe fragile una tabella di frasi. Catalogo non valido, pertinenza debole o contesto insufficiente producono un esito dichiarato, mai una capacità inventata.

12. Sicurezza e reversibilità

La sicurezza non è un modulo: è una catena di guardie indipendenti, e un'azione deve passarle tutte. E siccome anche la guardia migliore sbaglia, l'ultima difesa è poter tornare indietro: annullamento verificabile, per costruzione.

La catena delle guardie — e l'annullamento come ultima difesa appaiamento chi sei? codice firmato, ruolo per persona sconosciuto = scartato regole tre livelli di autonomia: sola lettura · supervisionata · piena capacità per categoria vaglio guardia: vietati e irrecuperabili; giudice + consenso coi bottoni sempre PRIMA di eseguire isolamento bubblewrap con profilo dal manifesto: rete, utente, IPC isolati mai processi secondari privi di recinto firma + registro codice legato al manifesto tramite impronta; ogni azione in un registro a sola aggiunta deriva = scarto silenzioso l'ultima difesa: l'annullamento come funzione fondamentale ● catalogo chiuso di operazioni inverse (5): scambia origine/destinazione · elimina i creati · ripristina dalla copia · cancella per ID ● ogni spostamento è COPIA → verifica → CANCELLAZIONE: mai una cancellazione senza copia confermata ● i contenuti sovrascritti finiscono in blob con hash sha256 nella cronologia del turno: «annulla» li rimette al loro posto ok_count verificabile: se indica 3 operazioni annullate, sono realmente 3 le skill restano dormienti finché manca il prerequisito; disattivarne una toglie di mezzo l'intera superficie la skill di sistema (shell, sudo, pacchetti, montaggi) esiste — ed è per questo che ogni azione privilegiata richiede consenso esplicito, e l'intera skill si può spegnere con una frase
Figura 15 — Cinque guardie in serie (appaiamento, regole, Vaglio, isolamento, firma e registro) e, sotto, la rete di protezione: un annullamento con catalogo chiuso di operazioni inverse, copie verificate prima di ogni cancellazione e conteggi riscontrabili.

Capacità amministrative e loro confine

Con il relativo insieme di executor, un'istanza Metnos può amministrare una macchina mediante interprete dei comandi, sudo, pacchetti e montaggi. Ogni azione privilegiata passa dal Vaglio e dalle autorizzazioni previste, usa i livelli di contenimento applicabili e viene registrata. La skill di sistema può essere disattivata, impedendo a Metnos di usare queste capacità sul sistema operativo.

Parte V · Apri la macchina

Dalle promesse ai contratti dei componenti

Qui la visione e il modello implementativo si incontrano: una mappa, una richiesta guidata e un catalogo di contratti di dettaglio.

13. Atlante dei componenti

L'architettura vista fin qui dice cosa promette il sistema. Questo atlante mostra quale componente possiede ogni promessa e dove vive il suo contratto esatto.

13.1 Dalla visione ai contratti dei componenti

L’architettura di Metnos ha due livelli di ingrandimento. Il livello alto descrive il sistema nel suo insieme: strati, organi, leggi e fini. È il percorso che avete appena seguito dal capitolo 1.

Il livello basso è l'insieme degli approfondimenti collegati qui sotto: un documento HTML per ogni componente, con schemi dei dati, firme delle funzioni, regole d'isolamento e condizioni di errore. Queste pagine spiegano l'implementazione corrente; codice, manifesti caricati e prove ne attestano il comportamento. Se una pagina diverge da quelle fonti, va corretta nello stesso intervento. Una specifica futura resta invece tale finché il codice e le prove non ne dimostrano l'attuazione.

Verifica. Prima di proseguire, dovete aver chiari due punti: (a) il Livello 1 spiega cosa, il Livello 2 spiega come; (b) i documenti del Livello 2 sono contratti, non bozze. Se uno di questi due punti non è ovvio, rileggete il paragrafo precedente prima di andare avanti.

13.2 Quattro nomi, ora come contratti implementativi

Tutto Metnos gira intorno a quattro nomi. Definirli adesso vi risparmia mezz’ora di confusione fra trenta righe.

executor
Una capacità eseguibile: un piccolo programma che fa una cosa sola e bene (leggere file, mandare una mail, calcolare un'impronta, ricavare testo da una scansione, scoprire nuovi indirizzi in un sito). Ogni executor accetta liste in ingresso e produce liste in uscita; ha un manifest che lo descrive, una firma Ed25519 che lo autentica e un profilo d'isolamento che lo confina. L'appartenenza al prodotto, l'origine e il trasporto restano assi distinti. Gli executor GitHub mantenuti da Metnos sono funzioni integrate realizzate a mano, non importati; il catalogo generato è la fonte unica per la suddivisione del codice sorgente.
mnest
Il filo che collega due executor quando sono stati attivati insieme dal pianificatore. Non è un puntatore di codice, è una traccia: nasce dal contesto, si rinforza con la ripetizione, decade se non viene riusato.
mnestoma
Il grafo emergente di tutti i mnest. È la memoria associativa del sistema: vive su SQLite, viene curata da un processo notturno (ager) e fornisce al pianificatore l’intuizione di «quale executor di solito segue quale». La controparte inglese del termine è mnestome.
motore del turno (agent_runtime)
Il componente che orchestra il turno: riceve la richiesta, estrae l'intento, tenta le memorie L0/L1 e, quando serve, chiede al motore Mētis un piano strutturato. Dopo la validazione esegue gli executor in sequenza, raccoglie le osservazioni e applica Vaglio, regole e isolamento a ogni passo.
Verifica. Provate a completare a voce le frasi: «Un’email viene mandata da un…», «Quando due executor lavorano insieme spesso, fra loro nasce un…», «Tutti questi fili insieme formano il…», «Chi decide la sequenza dei passi è l’…». Se rispondete executor, mnest, mnestoma, motore del turno, potete proseguire.

13.3 La mappa dei componenti

I componenti documentati sono organizzati per ruolo. Lo schema sotto raggruppa i nodi principali per ruolo: il bordo nero spesso è il motore centrale, le forme verdi i «servizi» che il motore consulta, le forme azzurre i «tessuti» che memorizzano lo stato, le forme color bronzo gli organi periferici verso l’utente e verso l’ambiente. Le frecce indicano chi chiama chi.

telos — fini ultimi canale (Telegram) appaiamento approval_ux motore del turno piano unico · validazione esecuzione controllata vaglio regole isolamento synt executor ammessi contratti firmati + sintesi controllata scratchpad stato del turno mnest tracce di co-attivazione mnestoma grafo + ager obs. cruscotto orienta
Mappa dei componenti documentati. Tratto continuo: chiamata diretta. Tratto tratteggiato: orientamento o lettura.

Tre osservazioni utili per leggere lo schema.

  1. Il telos è un segnale morbido: orienta i componenti in cui è collegato, senza sostituire richiesta, regole o capacità. Il file del workspace dichiara fini e pesi; non concede autorità.
  2. Il vaglio è sempre prima dell’esecuzione, mai dopo. Una volta che un executor è partito non si torna indietro in modo gratuito: l’annullamento esiste, ma richiede una cronologia e copie di sicurezza.
  3. L'insieme degli executor è estendibile ma governato: Synt prima tenta di comporre capacità esistenti e, quando serve davvero, può generare un nuovo executor. Nome, manifest, prove, firma e ciclo di ammissione restano obbligatori.

13.4 Una seconda richiesta guidata

Per fissare la mappa, seguiamo una richiesta semplice dall’ingresso fino alla risposta: «sposta in ~/Archivio/2026 i PDF di fatture arrivati questa settimana».

  1. Canale. Telegram riceve il messaggio dell’utente. Il servizio controlla che il mittente sia stato appaiato con un livello d’autorizzazione sufficiente; in caso contrario il messaggio viene scartato senza eco. L'appaiamento significa «canale + identificativo del mittente riconosciuto»: si ottiene rispondendo a un codice Ed25519 firmato con scadenza.
  2. Motore del turno — pianificazione. Il motore estrae l’intento (verbo canonico: move; oggetto: files; criterio: PDF allegati a fatture in finestra «ultima settimana»), interroga il prefilter per ridurre il catalogo agli executor pertinenti, chiede al Proponente un piano strutturato e lo valida prima di eseguire il primo passo.
  3. Vaglio — guardia + giudice. Prima di lanciare l’executor il Vaglio controlla due cose: che il percorso non sia vietato, che il comando shell non sia irrecuperabile (rm -rf e simili). Per le operazioni che cadono in zona grigia, regole e giudice determinano se occorre una decisione umana. In quel caso il canale mostra una proposta localizzata che rende riconoscibili azione, obiettivo e conseguenze rilevanti.
  4. Isolamento ed executor. Il motore invoca read_messages dentro bwrap con i parametri derivati dal manifest. Il risultato è una lista di entries; ogni elemento contiene il percorso del PDF e i metadati.
  5. Passaggio dei dati. Il passo successivo è move_files; riceve la lista del passo precedente con from_step: N. La verità sui dati vive nello scratchpad: il pianificatore non vede l’intera lista, ne vede una vista sintetica che gli basta per decidere.
  6. Mnest + mnestoma. La coppia read_messages → move_files rinforza una traccia esistente nel grafo. Se non esiste, viene creata. L’ager notturno farà manutenzione: decadimento, deduplicazioni e scarti.
  7. Risposta. Il motore restituisce all’utente, via Telegram, il numero di file spostati e il primo motivo di scarto se qualcosa è stato escluso. La final_answer include il segnale di troncamento se la lista di partenza era stata limitata.
Verifica. Provate a rispondere senza guardare i passi: chi parla con l’utente? chi decide la sequenza? chi lancia gli executor? chi controlla che l’operazione sia lecita? chi memorizza che le due capacità sono andate a braccetto? Se le risposte sono canale, motore del turno (per entrambe le operazioni), Vaglio, mnestoma, allora la mappa è vostra.

13.5 Gli approfondimenti canonici

Sotto, i documenti sono raggruppati per ruolo. Tutti hanno la controparte inglese in /en/architecture/.

Motore centrale
ComponenteCosa copre
Motore cognitivo Il motore che pianifica ed esegue. Fastpath L0 riusa i successi memorizzabili registrati automaticamente; Autopath L1 riusa scheletri generalizzati confermati dal riscontro positivo. Le firme del catalogo e dell'insieme ammesso vengono controllate prima di usare la cache. Quando serve un piano nuovo, il Proponente produce uno o più candidati strutturati secondo la configurazione, il Validatore li controlla, l'Esecutore esegue il piano ammesso e i percorsi di recupero o terminazione dichiarano l'esito senza inventarlo.
agent_runtime Orchestrazione del turno: canale e identità, estrazione dell'intento, invio al motore per un solo piano, collegamento dei dati fra passi (from_step: int per liste e segnaposti per scalari), dialoghi sospesi, archivio temporaneo, misurazioni e aggiornamento del mnestoma.
scratchpad Archivio temporaneo del turno: conserva le osservazioni voluminose senza occupare il contesto del pianificatore. Funzione integrata scratchpad_read con lettura iniziale, finale o per intervallo.
grammar Generazione vincolata tramite GBNF quando abilitata: unione discriminata di nome e argomenti, schema ricorsivo e filtro sull'insieme contestuale. Il validatore successivo alla decodifica resta obbligatorio e rifiuta combinazioni incoerenti.
fastpath e autopath Due livelli prima del Proponente. L0 conserva il piano completo di un turno riuscito: l'impronta serve la stessa richiesta, mentre il confronto dell'embedder configurato è ammesso soltanto per strutture generalizzabili. L1 conserva lo scheletro di un gruppo affine e diventa attivo dopo un riscontro positivo. Entrambi verificano le firme del mondo corrente; richieste con argomenti specifici restano sul confronto esatto.
Tutor Guida locale che precede il pianificatore: compila manifest ammessi, registri del motore, documentazione pubblicata e procedure curate in un catalogo firmato. Riconosce le fonti pubbliche anche dal nome del file, può aggiungere osservazioni correnti tipizzate e consegna una clausola d'azione al motore soltanto dopo conferma. Il riscontro affina il recupero per il singolo utente senza entrare nelle cache dei piani.
account di posta Configurazione di caselle IMAP/SMTP, anche non Google: collegamenti cifrati, account multipli, compatibilità con i file di ambiente e confine con le funzioni specifiche di Gmail.
lifecycle Ciclo unificato delle modifiche: un oggetto change_intent, una macchina a stati e l'interfaccia /admin/changes. Gli adattatori attivi sono telos, introvertiva, synt e riscontri dell'utente. Il materializzatore giornaliero deduplica le sorgenti; l'applicatore elabora gli accettati ogni dieci minuti; l'osservatore giornaliero misura gli effetti e finalizza o ripristina secondo il tipo.
virtualizzazione dei modelli Come Metnos assegna i ruoli llm, embedder e vlm a fornitori configurabili tramite {llm,embedding,vlm}_tiers.toml. I consumatori chiedono una funzione, non una marca o un modello concreto; servizi locali o HTTP possono quindi cambiare senza riscrivere pianificatore e Tutor.
Capacità eseguibili e loro nascita
ComponenteCosa copre
executor Introduzione didattica: cos'è un executor, anatomia in cinque file, manifesto firmato, recinto di esecuzione, ciclo di vita, tre origini (a mano / generato / di sistema). Tre esempi concreti. Il conteggio corrente vive nel catalogo generato, non in questo testo.
catalogo executor Censimento generato dai manifest firmati: tutti gli executor mantenuti dal progetto, raggruppati per dominio canonico, con scopo, criticità, piattaforme e percorso nel codice sorgente.
remote_executors Come una parte controllata del catalogo degli executor può girare su dispositivi registrati: metnos-client, appaiamento del dispositivo, collocazione dichiarata dal manifest, isolamento per sistema operativo, installazione dall'interfaccia e limiti espliciti su Windows e Linux.
executor intelligenti Agenti a mandato ristretto dietro un normale contratto executor: ciclo adattivo limitato, risolutori deterministici prima del modello, autorità invariata e postcondizioni verificabili. login_sites è il primo esempio.
synt Come nascono nuovi executor: processo a cinque stadi (nome, firma, prove, descrizione e codice), cascata reattiva (composizione → generazione) e manutenzione introvertiva limitata alla deduplicazione.
skill_importer Acquisisce skill locali, da agentskills.io o da GitHub e ne ricava executor Metnos: lettura, traduzione nel vocabolario chiuso, generazione, ammissione, firma e registrazione. La tabella skill_vocab_map.json e il confine del verbo guidano la traduzione; i comandi sono metnos-skills import|list|uninstall|status|evaluate.
skills & backends Perché skill e servizi di esecuzione sono due assi distinti: il servizio dice COME eseguire un verbo_oggetto (configurazione e backend_resolver, invisibili all'LLM); la skill dice SE e QUALI capacità sono sbloccate. Tre livelli (nucleo, mantenuti dal progetto, importati), più fornitori trasparenti al pianificatore e promozione con un consulto frontier una tantum.
Memoria associativa
ComponenteCosa copre
mnest La traccia di co-attivazione fra due executor: struttura, ciclo di vita, decadimento, persistenza e protomnest.
mnestoma Il grafo emergente di tutti i mnest: schema dati SQLite, operazioni atomiche, manutenzione notturna e istantanee. In inglese il termine è mnestome.
Sicurezza, regole e isolamento
ComponenteCosa copre
vaglio Guardia binaria per percorsi vietati e comandi di shell difficili da annullare; giudice graduato basato su regole, con soglia configurabile. Il giudice probabilistico affidato a un modello non è attivo.
policy Registro chiuso delle capacità, matrice fra autonomia e capacità (sola lettura, supervisionata o piena), permessi persistenti limitati alla destinazione e calcolo dell'esito effettivo.
sandbox Profilo bwrap derivato dal manifesto: codice in sola lettura, rete isolata quando nessuna capacità la richiede e ripiego controllato se bwrap non è disponibile. Landlock non è ancora attivo.
Canale verso l’utente
ComponenteCosa copre
channel Interfaccia comune dei canali (send e poll) e adattatore TelegramChannel, con interrogazione prolungata, avanzamento persistente, processo di servizio e unità systemd dell'utente. Per più utenti usa send_to(chat_id, OutboundMessage) e /start <token> per appaiare un ospite.
http_api Servizio HTTP sulla porta 8770: canale uniforme su POST /agent/turn (SSE e JSON), pannello /admin realizzato con htmx, Jinja2 e uPlot, gestione degli utenti, proposte introvertive ed esecuzioni pianificate. L'accesso usa la chiave di amministrazione, con cookie valido sette giorni, oppure il token del dispositivo.
pairing Due percorsi: /pair, con codici Ed25519 firmati per i dispositivi, e /start <token>, con token di breve durata per familiari e ospiti. Il registro users.db separa utente principale, ospiti e canali; il primo avvio crea automaticamente l'utente principale.
approval_ux Flusso delle richieste di conferma nella chat web e in Telegram. Il contratto pubblico è semantico, non impone un numero fisso di righe o pulsanti: identifica azione, scopo e conseguenze, conserva lingua e identità dell'utente e non trasforma una conferma in un permesso permanente implicito.
Multilinguismo
ComponenteCosa copre
multilang Tre livelli multilingue: istruzioni ai modelli (runtime/prompts/<lang>/<role>.j2), descrizioni degli executor (manifesti TOML e file JSON complementare) e messaggi rivolti all'utente (i18n.sqlite). Non esiste una lingua canonica: per ogni contenuto fa fede la versione modificata più di recente. Il comando amministrativo metnos-prompts add-language <codice> prepara una lingua nuova; il livello frontier può migliorare facoltativamente la resa.
Visibilità e fini
ComponenteCosa copre
observability Pannello HTML statico che riunisce le sorgenti dati di Metnos: mnestoma, dispositivi appaiati, turni, decisioni del Vaglio ed esecuzioni pianificate. Viene generato su richiesta, senza un servizio sempre attivo e senza JavaScript.
telos Fini ultimi dell’utente, funzione di allineamento, limite alle interruzioni con quote per le attività pianificate, telos di non-rinuncia (t.coltivazione_strumenti) e clausola di arresto. Il file TELOS.md risiede nello spazio di lavoro.

13.6 Vocabolario e primitive

Il vocabolario chiuso conta 26 azioni (read, write, move, delete, create, find, list, filter, sort, group, classify, get, set, send, describe, render, extract, compress, compute, compare, change, order, share, open, login, act) e 27 oggetti (files, dirs, packages, messages, events, contacts, places, processes, urls, numbers, images, signatures, texts, proposals, persons, tasks, inputs, approval, credentials, issues, pulls, calendars, entries, lists, skills, sites, preferences). I qualifier sono divisi in quattro famiglie: formato (codifica del dato), modalità (come agisce l’executor), criterio di sicurezza e fornitore (per indicare un servizio diverso da quello predefinito, ad esempio _google_workspace). Tutto centralizzato in runtime/vocab.py.

Le liste di elementi prodotte passo per passo durante un turno si manipolano con nove funzioni disponibili al pianificatore. I cinque operatori strutturali o numerici sono filter_entries, filter_lists, sort_entries, group_entries e compute_entries. I quattro operatori semantici eseguiti nello stesso processo sono classify_entries, compare_entries, extract_entries e describe_entries. Il primo gruppo filtra una lista, combina due liste, ordina, unisce/deduplica o calcola un aggregato; il secondo classifica, confronta semanticamente, estrae dati strutturati o sintetizza. L'elenco è verificato contro il registro del runtime e i manifest firmati. Esempio reale: la domanda «c’è un appuntamento HLT che si sovrappone a uno MNM nei prossimi tre mesi?» viene risolta in sei passi: read_events → due filter_entries (uno per HLT, uno per MNM) → filter_lists(op=overlap) → risposta finale. Nell'estrazione le date escono in ISO 8601 quando giorno, mese e anno sono scritti nel testo. Molti siti l'anno lo omettono sulle righe recenti: in quel caso il valore porta l'anno corrente e un asterisco davanti (*2026-05-29), che dichiara l'anno come assunto e non letto. Il campo resta vuoto solo quando nessuna data e’ ricavabile: una data visibile non diventa mai un campo vuoto.

Il numero degli executor non è riportato a mano in questa guida: il catalogo generato viene ricostruito dai manifesti firmati e fornisce l'inventario corrente. Il Compositore applica lo stesso contratto a tutti gli executor e non sceglie in base al trasporto. I verbi produttori ortogonali sono cinque (find per pattern, get per id/stato, read per blob da sorgente, list per container, filter per riduzione).

13.7 Come leggere i contratti

Le pagine collegate da questa guida distinguono ciò che il sistema offre oggi da ciò che è ancora previsto. Per interpretarle senza equivoci:

14. I principi, in otto carte

Se di questo documento doveste ricordare solo otto frasi, sono queste. Tutto il resto — codice, prompt, convenzioni — discende da qui.

1Vettoriale per costruzione. Ogni executor accetta una lista e ritorna una lista, anche degenere. La versione batch è l'executor: *_batch non esiste.
2Vocabolario chiuso, governato. Tutto ciò che agisce ha un nome componibile dentro una grammatica chiusa. Un termine nuovo entra solo se necessario, generale e comprensibile.
3Nessun fallimento silenzioso. I conteggi riflettono ciò che è successo davvero; il troncamento si dichiara, non si nasconde; un parziale presentato come completo è un bug.
4Deterministico > LLM. Dove un automa o una tabella bastano, il modello non si usa. L'LLM entra dove un parser equipotente sarebbe davvero troppo complesso — e ci entra vincolato.
5Mai una cancellazione implicita. Ogni spostamento è copia → verifica → cancellazione; mai DELETE senza COPY confermata.
6Reversibilità con motivazione. Ogni atto evolutivo (sintesi, fusione, archiviazione) è reversibile e motivato. Dire sì costa meno quando si può tornare indietro.
7i18n per costruzione. Ogni stringa e prompt rivolto all'utente è dato per-lingua: una lingua nuova è un pacchetto di traduzione, non un fork del codice.
8Comprensibilità come dovere. Se l'utente non capisce il sistema, il sistema non serve. La semplicità non è estetica: è il criterio che ha selezionato tutto il resto.

15. Cosa NON è Metnos

Metà del progetto sta nei no. Ogni tentazione di aggiungere un elemento di questa lista va respinta.

16. Dove andare dopo

Ora avete entrambi i livelli: il sistema dall'alto e la mappa dei contratti dei componenti. Usate l'atlante per il dettaglio implementativo, oppure proseguite con la visita guidata, il riferimento dei domini e la guida dell'interfaccia.

riferimento
Contratti dei componenti
Torna all'atlante e apri il contratto implementativo esatto che ti serve.
riferimento operativo
Domini ed esempi
Che cosa puoi chiedere a Metnos, dominio per dominio, con frasi naturali pronte da adattare.
guida introduttiva
L'interfaccia
I due canali, le sezioni delle Impostazioni e la mappa delle pagine con il loro percorso.
visita · 10 min
Visita guidata
Il giro veloce con le schermate: cosa si prova a usarlo, prima di studiarlo.
guida operativa
Tutor
Come Metnos compila le fonti correnti e spiega capacità, procedure e pagine senza eseguire operazioni.
contratto del componente
Executor remoti
Come Metnos sposta alcuni executor dal server a un computer registrato, mantenendo regole, tracciamento e limiti espliciti.
codice
Il repository
AGPL-3.0, pre-1.0: la parte pubblicabile dell'istanza in esercizio, programma di installazione compreso.

Metnos — Guida all'architettura.
mētis + noûs: l'intelligenza astuta al servizio della mente — su hardware tuo.
Documentazione in italiano e inglese su metnos.com; codice su github.com/brunialti/metnos.