Un solo tutorial, due livelli di dettaglio. Parti dalle idee, segui una richiesta reale, poi entra nei componenti che rendono eseguibile ogni promessa.
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.
frontier sono scelte esplicite.| Voce | Stato reale |
|---|---|
| Forma | Processo Python ≥ 3.12, microarchitettura a executor e pianificazione vincolata in un singolo passaggio nel motore Mētis (cap. 5). |
| Strumenti | Executor 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. |
| Cervello | Endpoint LLM compatibili, locali o remoti; cinque livelli astratti fast / middle / wise / creative / frontier (cap. 8). frontier indica il cloud facoltativo. |
| Canali | Telegram (interrogazione in uscita, senza porte aperte) e web sulla porta 8770 (chat e pannello amministrativo), cap. 11. |
| Dispositivi | Una 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. |
| Sensi | Elaborazione delle immagini nel processo: semantica, volti ed EXIF confluiscono in un indice unificato (cap. 10). |
| Lingua | Contesto 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 / stato | AGPL-3.0; pre-1.0. Repository pubblico: github.com/brunialti/metnos — distribuzione pubblica del codice e dei materiali destinati al rilascio. |
Tutto il progetto sta in tre scommesse architetturali. Sono scelte di campo, non ottimizzazioni: ciascuna rovescia un'abitudine diffusa delle piattaforme agentiche.
| Piattaforma agentica tipica | Metnos | |
|---|---|---|
| Strumenti | Scritti a mano, importati o generati in forma libera, poi eseguiti così come sono, con i privilegi dell'assistente | Sintetizzati 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 |
| Sicurezza | Ci si fida dell'autore del pacchetto | Non ci si fida del pacchetto: deve superare il filtro di ammissione a sette livelli (cap. 7) |
| LLM | Spesso prima il cloud | Locale prima; livello frontier facoltativo |
| Instradamento | Il modello può scegliere liberamente fra strumenti non governati | Insieme 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) |
| Risultato | Libero, diverso per ogni strumento | Uniforme: lista in ingresso e lista in uscita, componibile fra passi (cap. 6) |
| Annullamento | Raro o senza garanzia completa | Funzione fondamentale: catalogo chiuso di operazioni inverse, spostamento = COPIA → verifica → CANCELLAZIONE, ok_count aderente alle operazioni realmente annullate (cap. 12) |
| Lingua | Inglese, stringhe nel codice | Lingua per utente; prompt, manifest, messaggi e lessico sono dati distinti e convalidati |
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).
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.
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).
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.
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).
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.
intent_ms, prefilter_ms, vaglio_ms, exec_ms), limiti di sicurezza e registro.subprocess a mano libera, mai: ogni effetto passa da regole, Vaglio e isolamento (cap. 12).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.
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.
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.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.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.
| Segnaposto | Cosa fa |
|---|---|
from_step: N | Prende 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). |
from_step; gli scalari, i valori da completare e il contesto passano per segnaposti tipizzati che l'esecutore risolve in modo deterministico.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.
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.
Dal contratto discendono tre convenzioni che vedrete ovunque:
entries e results — chi arricchisce o legge una lista restituisce entries (lo schema dei record si conserva e il flusso può continuare); chi trasforma restituisce results (lo schema cambia: esiti, non record).0 come segnaposto vale «nessun limite»; per impostazione predefinita i confronti non distinguono maiuscole e minuscole; nei domini testuali aperti * e ? indicano un modello di ricerca, mentre nei domini chiusi (identificativi e ambiti) la corrispondenza è esatta. Così le inclinazioni dell'LLM non diventano fallimenti silenziosi.ok_count conta gli elementi realmente processati. Mai dichiarare un esito che non corrisponde alla realtà.
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}]."
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"
| Classe | Budget richiesto | Ammissione |
|---|---|---|
| 0 | Nessun thread trasversale. | Predefinita per tutti gli executor esistenti e generati. |
| 1 | Concorrenza moderata. | Solo dopo equivalenza verificata; sempre entro i limiti del motore e dell'hardware. |
| 2 | Concorrenza alta. | |
| 3 | Massimo 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.
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.
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.
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.
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.
| Modo | Innesco | Tempo |
|---|---|---|
| Reattivo | Durante 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. |
| Introvertivo | Di 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.
Lo stesso imbuto vale per il codice sintetizzato e per le skill importate da fuori: nessun pacchetto si esegue sulla fiducia.
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.
| Livello | Ruolo | Vincolo |
|---|---|---|
fast | Decisioni brevi e strutturate: intento, filler e riduzioni ristrette. | Endpoint configurato; risposta corta. Obbligatorio. |
middle | Lavoro procedurale e giudizi intermedi: estrazioni, classificazioni e stadi 1-3 della sintesi. | Policy deterministica del ruolo. |
wise | Il pianificatore e la sintesi ad alta fedeltà: piano intero, codice e verifiche. | Policy deterministica del ruolo. |
creative | Proposte divergenti e testo editoriale, incluso lo stadio 4 della sintesi. | Policy separata con temperatura 0,35. |
frontier | Un consulto esterno quando richiesto esplicitamente, per esempio per analizzare una segnalazione. | API cloud facoltativa, con ripiego gestito se la chiave non c'è. |
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.
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:
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.
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.
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.
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…»).
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.
| Canale | Cosa offre |
|---|---|
| Web :8770 | Chat 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. |
| Telegram | Il 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. |
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 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.
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.
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.
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.
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.
Tutto Metnos gira intorno a quattro nomi. Definirli adesso vi risparmia mezz’ora di confusione fra trenta righe.
agent_runtime)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.
Tre osservazioni utili per leggere lo schema.
Per fissare la mappa, seguiamo una richiesta semplice dall’ingresso
fino alla risposta: «sposta in ~/Archivio/2026 i PDF di
fatture arrivati questa settimana».
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.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.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.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.read_messages → move_files rinforza una
traccia esistente nel grafo. Se non esiste, viene creata. L’ager
notturno farà manutenzione: decadimento, deduplicazioni e scarti.
Sotto, i documenti sono raggruppati per ruolo. Tutti hanno la
controparte inglese in
/en/architecture/.
| Componente | Cosa 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. |
| Componente | Cosa 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. |
| Componente | Cosa 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. |
| Componente | Cosa 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. |
| Componente | Cosa 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. |
| Componente | Cosa 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. |
| Componente | Cosa 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. |
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).
Le pagine collegate da questa guida distinguono ciò che il sistema offre oggi da ciò che è ancora previsto. Per interpretarle senza equivoci:
carattere monospaziato sono identificatori tecnici:
non vanno letti come parole dell'interfaccia;Se di questo documento doveste ricordare solo otto frasi, sono queste. Tutto il resto — codice, prompt, convenzioni — discende da qui.
*_batch non esiste.Metà del progetto sta nei no. Ogni tentazione di aggiungere un elemento di questa lista va respinta.
frontier è un consulto esplicito, mai la sede. Nessuna apertura non scelta.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.
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.