Indice

  1. Cos'è una skill, in trenta secondi
  2. Dal file SKILL al catalogo: la catena di montaggio
  3. Cosa entra: tre sorgenti
  4. Cosa esce: una cartella di executor firmati
  5. I controlli che fanno fede
  6. Credenziali e dialoghi con l'utente
  7. Un esempio dall'inizio alla fine
  8. Per andare più a fondo

1. Cos'è una skill, in trenta secondi

Una skill è la documentazione strutturata di come si usa un servizio (il calendario di Google, una casella di posta, un servizio meteo). Vive in un file di testo che si chiama SKILL.md, accompagnato da qualche piccolo script di supporto. Lo standard pubblico si chiama agentskills.io.

Il file ha un'intestazione (nome, autore, versione, dipendenze) seguita da paragrafi: «cosa fa», «come si configura la prima volta», «esempi di invocazione». Niente di esotico: il formato è pensato per essere letto da un essere umano e poi, di passaggio, da un agente.

Metnos sa importare una skill così com'è: legge il file, ne ricava una serie di executor in formato Metnos, e li mette nel catalogo come se fossero stati scritti a mano. Una volta importati, l'agente li chiama esattamente come gli altri, e l'utente non vede la differenza.

Perché non usare la skill com'è? Le skill non hanno firma digitale, non hanno un recinto di esecuzione, i loro script possono fare qualunque cosa. Eseguirle senza filtri sarebbe imprudente. Importarle in formato Metnos significa: stesso comportamento funzionale, ma dentro il recinto, con firma, con il manifest che dichiara cosa fanno e cosa non possono fare.

2. Dal file SKILL al catalogo: la catena di montaggio

L'importazione è una catena di cinque fasi, tutte automatiche. L'unico passo richiesto all'utente è il via iniziale: «importa la skill X».

1. Lettura

Il parser legge SKILL.md e ricava la struttura: nome, autore, capabilities dichiarate, lista di sotto-comandi con i loro argomenti.

2. Traduzione

Ogni sotto-comando viene mappato sul vocabolario chiuso di Metnos (verbo + oggetto canonico): calendar list diventa read_events, gmail send diventa send_messages.

3. Generazione

Per ciascun executor il generatore produce il file Python e il manifest TOML usando template fissi (Jinja). Solo la descrizione del manifest viene rifinita da un modello linguistico per la cura linguistica.

4. Controlli

Cinque verifiche cumulative: nome nel vocabolario, niente sovrapposizione con executor esistenti, descrizione coerente con il codice, capability dichiarate sensate, contratto in entrata e in uscita valido.

5. Firma

Il manifest viene firmato Ed25519. L'executor entra in una cartella sotto sorveglianza separata da quella degli executor scritti a mano. Il loader lo carica al riavvio.

Tra i cinque, solo il passo 3 (Generazione) si appoggia a un modello linguistico, e solo per due cose specifiche: la descrizione in italiano e inglese, e le otto-quindici parole chiave di affinità che aiutano il pianificatore a scegliere lo strumento giusto. Tutto il resto è deterministico: stesso ingresso, stessa uscita.

Il vocabolario chiuso, una bussola. Metnos accetta 23 azioni (read, find, set, send, delete, share, …) e 19 oggetti (files, messages, events, persons, tasks, …). Una skill che parla di append rows to spreadsheet non genera append_rows: diventa change_files_xlsx. Una che parla di label messages non genera label_messages: viene rifiutata se non c'è un modo coerente di tradurla. La rigidità del vocabolario protegge l'agente da nomi inventati o sinonimi: ogni domanda di lavoro viene indirizzata allo stesso strumento di sempre.

3. Cosa entra: tre sorgenti

La skill può arrivare da tre posti:

Le skill scaricate vengono messe nella cache locale per sette giorni. Importare due volte la stessa skill nello stesso periodo non genera traffico: si attinge dalla copia già in cache.

4. Cosa esce: una cartella di executor firmati

Dopo l'importazione, sul disco compaiono una o più cartelle, una per ogni sotto-comando della skill. Ognuna contiene gli stessi file che trovi in un executor scritto a mano: il file Python con la funzione invoke, il manifest TOML, la firma, il profilo del recinto.

~/.local/share/metnos/executors/skills/google-workspace/
  read_events/
    read_events.py
    manifest.toml
    manifest.toml.sig
    manifest.lang_state.json
  set_events/
    …
  delete_events/
    …
  … (un'altra ventina, per Gmail, Drive, Sheets, Docs, Contatti)

La cartella di destinazione è skills/ (ADR 0160; il nome precedente _imports/ resta letto in modalità back- compat), sotto la cartella degli executor sintetizzati. Questo separa visivamente quanto viene da fuori da quanto Metnos ha scritto da solo, e da quanto è stato scritto a mano. Tutti e tre i tipi finiscono però nello stesso catalogo dell'agente, e tutti passano dagli stessi controlli al momento dell'uso.

Nel manifest di un executor importato compare una sezione in più, che dichiara la sua origine:

[provenance]
synthesized    = true
imported_from  = "agentskills.io/googleworkspace/calendar"
source_version = "1.1.0"
imported_at    = "2026-05-10T22:00:00Z"
source_sha256  = "<impronta digitale del file di origine>"

È l'unico segno che lo distingue da un executor scritto a mano. Tutto il resto — firma, recinto, vocabolario, contratto — è identico.

5. I controlli che fanno fede

Una skill importata non parte automaticamente come affidabile. Cinque controlli cumulativi decidono se ammetterla nel catalogo:

ControlloCosa verificaCosa rifiuta
Nome canonicoIl nome dell'executor è nella forma verbo_oggetto con verbo e oggetto del vocabolario.Nomi di fantasia o inventati, sinonimi non riconosciuti.
Sovrapposizione di affinitàL'executor importato non condivide troppe parole chiave con uno già esistente.Doppioni mascherati, executor che ruberebbero il lavoro a uno già presente.
Coerenza descrizione-codiceUn modello linguistico controlla che ciò che il manifest promette sia ciò che il codice fa davvero.Description ingannevoli, scollature semantiche.
Unicità delle credenzialiSe la skill richiede credenziali (chiave API, token), il loro nome di legame non è già preso da un'altra skill importata.Collisioni invisibili che metterebbero un servizio sopra l'altro.
Asserzioni di instradamentoPer ogni executor accettato, viene aggiunta una piccola batteria di domande prototipiche («elenca i miei appuntamenti di domani» dovrà pescare read_events).Tool che si infilano nel mestiere di altri (regressioni di routing).

I rifiuti vengono registrati in un registro di audit insieme alle motivazioni. Quando un sotto-comando di una skill viene rifiutato, gli altri della stessa skill continuano la corsa: l'importazione è parziale, mai un tutto-o-niente.

Cosa NON viene fatto, oggi. L'importatore non esegue ancora l'analisi statica del codice degli script di supporto della skill. Una skill maliziosa che dichiara leggo eventi ma in realtà spedisce un file su un server remoto non viene catturata dai cinque controlli attuali. L'analisi statica è nella roadmap come «controllo zero», pre-import: un passaggio in più che cerca chiamate di rete inaspettate, scritture fuori cartella, e altri segnali sospetti, e mostra all'utente una scheda di sintesi prima di chiedere l'autorizzazione finale.

6. Credenziali e dialoghi con l'utente

La maggior parte delle skill utili si appoggia a servizi che richiedono una chiave di accesso: una API key, un token OAuth, il file di sessione di un account. L'importatore non chiede mai queste cose in anticipo. La prima volta che l'agente prova a usare un executor che richiede credenziali e non le trova, succede questo:

  1. L'executor risponde decision = "needs_inputs" con un piccolo modulo di richiesta.
  2. L'agente mostra all'utente quel modulo (in chat: testo conversazionale; via web: un form HTML).
  3. L'utente compila ciò che manca (file del client secret, URL di redirezione, chiave API, …).
  4. I valori vengono cifrati in una cassaforte locale (~/.local/share/metnos/credentials/).
  5. L'executor viene ri-invocato con gli stessi argomenti, e ora trova le credenziali al posto loro.

Le invocazioni successive non chiedono nulla. Se il token scade, l'executor segnala error_class = "auth_required" e il flusso ricomincia. Niente token nei file di configurazione, niente password nel codice.

Per consultare cosa è già configurato senza vedere i valori, ci sono tre executor canonici: find_credentials (elenca i collegamenti configurati, solo i metadati), set_credentials (registra una credenziale nuova), delete_credentials (cancella un collegamento). I valori in chiaro non escono mai da quegli executor: il pianificatore e i suoi modelli vedono solo nome del collegamento, impronta digitale, data, e stato («configurato», «scaduto», «mancante»).

7. Un esempio dall'inizio alla fine

Roberto chiede: «importa la skill di Google Workspace».

  1. Comando: metnos-skills import agentskills.io/googleworkspace/google-workspace
  2. Scaricamento: la skill è già nella cache locale (ultimo aggiornamento tre giorni fa); nessun traffico di rete.
  3. Lettura: il parser trova 24 sotto-comandi distribuiti su Gmail, Calendar, Drive, Sheets, Docs, Contatti.
  4. Traduzione: 21 sotto-comandi si traducono pulitamente in nomi canonici; tre vengono rifiutati (gmail reply collide con send_messages; gmail labels non ha qualifier canonico; sheets append collide con la sua update).
  5. Generazione: 21 cartelle di executor, ciascuna con file Python e manifest, vengono scritte sotto skills/google-workspace/ (ADR 0160).
  6. Controlli: tutti i 21 passano i cinque cancelli. Per ognuno viene aggiunta un'asserzione di instradamento alla batteria di test.
  7. Firma: i 21 manifest sono firmati Ed25519.
  8. Pronto: Roberto chiede in chat «che appuntamenti ho domani?». Il pianificatore sceglie read_events (uno dei 21), che risponde servono credenziali e apre il modulo di richiesta. Roberto fornisce il client secret e l'URL di redirezione una sola volta; le invocazioni successive funzionano in silenzio.

Tempo totale, escluso il setup di OAuth la prima volta: meno di tre minuti per ventuno strumenti nuovi.

8. Sette strati di rete di sicurezza

Importare codice scritto da altri (third-party) richiede strati di controllo che il codice handcrafted non ha. Una skill importata potrebbe essere stata manomessa, dichiarare cose diverse da quello che fa, imitare uno strumento esistente per dirottare la chat, o esfiltrare credenziali senza lasciare traccia. I sette strati riducono ognuno un rischio diverso, in modo progressivo. ADR 0159 dettaglia ogni strato.

StratoQuandoCosa intercetta
L1 sign verifyogni avviofile manomesso dopo l'import (digest sha256 + Ed25519)
L2 affinity overlapat-importskill che imita uno strumento esistente (Jaccard ≥0.5 → rifiuto)
L3 efficacy agercron giornalieroskill che fallisce silenziosamente o non viene mai scelta (deprecate 30g, archive 14g)
L5 smoke batteryat-importskill che restituisce schema rotto o crasha
L6 verifier semantico LLMat-importscollamento fra cosa il manifest dichiara e cosa il codice fa
Runtime vaglioogni invocazioneazione attuale viola policy (guard + safe-verb shortcut + judge LLM)
Skill audit JSONLogni invocazioneesfiltrazione / abuso credenziali (traccia append-only per forensics)

Gli executor handcrafted (scritti dal team Metnos) non hanno L2, L6 e audit: il codice è trusted per costruzione, il manifest e il comportamento sono allineati per definizione, e l'audit di chi ha fatto cosa è in git blame.

Gli strati sono indipendenti: se L6 fallisce (LLM down) restano attivi L1/L2/L3/L5; se L2 e' troppo stretto (Jaccard 0.5 puo' rigettare skill legitime affini) il provider qualifier (_google_workspace) distingue (ADR 0136).

9. Per andare più a fondo

Per capire…Leggi
cos'è un executor e come è fattoexecutor
come il Synt scrive un executor da zero (alternativa all'import)synt
il recinto in cui gli executor importati eseguonosandbox
i controlli prima di ogni azione rischiosavaglio
l'archivio decisionale (perché importare invece di adottare lo standard)ADR 0123

Metnos — skill importer, introduzione didattica