fastpath.py)autopath.py)Chiedi a Metnos con una richiesta come quella di questo esempio: «Trova i file PDF modificati oggi». Se ripeti la richiesta, Metnos può riusare il piano già riuscito; non devi scegliere o attivare manualmente il fastpath.
Prima di interpellare il pianificatore, Metnos prova a riconoscere la richiesta. Se esiste un piano riutilizzabile e ancora valido, esegue quella sequenza di executor. Se il contesto o il catalogo sono cambiati, tratta la voce come non valida e torna alla pianificazione normale.
La pianificazione serve quando la richiesta è nuova o richiede una nuova
composizione di capacità. Ripeterla quando il sistema possiede già un
piano valido aggiunge invece lavoro e variabilità senza migliorare il
risultato. Per esempio, una richiesta già risolta con
get_urls e describe_entries può riusare quella
sequenza, purché gli argomenti vengano ricavati dalla richiesta corrente.
Resta da capire come riconoscere una richiesta nota — e quando una soltanto somigliante è abbastanza vicina da trattarla allo stesso modo. Se ne occupano due livelli di riuso: riconoscono gradi diversi di somiglianza, ma hanno lo stesso scopo, eseguire un piano noto senza chiedere al pianificatore di costruirlo di nuovo.
I due livelli si distinguono per ciò che riconoscono del percorso. L0 riconosce l'intero piano, compresi gli argomenti: la stessa richiesta, con gli stessi valori concreti. L1 riconosce invece la struttura della soluzione, senza gli argomenti della richiesta d'origine, e può quindi servire un'intera famiglia di richieste affini.
| Livello | Cosa riconosce | Come |
|---|---|---|
| L0 | Una richiesta già risolta. La corrispondenza esatta può conservare un piano specifico; quella semantica è limitata ai piani generalizzabili. | Impronta deterministica (0a), poi similarità tramite l'embedder configurato (0b) |
| L1 | Una famiglia di richieste. Riusa un piano generale associato a un intento completo e a un cluster semantico. | Intento, cluster semantico e ordinamento deterministico dei piani campione |
L'ordine è fisso: prima si tenta L0; se non trova corrispondenza si passa a L1. Se mancano entrambi, la richiesta arriva al pianificatore (il motore), come sempre.
Il pianificatore non scompare: L0 e L1 sono scorciatoie controllate. Una richiesta nuova, ambigua, accompagnata da allegati o priva di una corrispondenza valida prosegue nel motore normale.
fastpath.py)
Il primo livello vive in runtime/engine/fastpath.py e custodisce,
in un database SQLite (fastpaths.sqlite), i piani già
eseguiti. Le voci nascono da sole: ogni volta che un turno va a buon fine
— un piano nuovo del motore, il riuso di L1 oppure una corrispondenza
semantica L0 — Metnos annota la richiesta canonica, la sua impronta,
l'embedding prodotto dal modello configurato, il piano completo (la struttura,
o framework) e l'intento, cioè il verbo e l'oggetto della
richiesta. Non occorre un'approvazione separata: gli executor hanno già
superato i controlli di ammissione e il turno ha avuto esito positivo.
La ricerca avviene in due fasi:
Una voce L0 eliminata per invecchiamento, invalidazione o riscontro negativo può essere ricreata dal successivo turno riuscito. La cancellazione non rende quindi indisponibile la capacità sottostante.
undo_last_turn,
get_inputs, get_approval e gli strumenti di
navigazione autenticata non generano fastpath, perché il loro significato
o il loro identificatore di sessione dipendono dal turno in corso.since_iso="2026-06-11") non si registra: rieseguirlo un
altro giorno aprirebbe una finestra temporale ormai congelata. Le date relative
(time_window="today") invece sì, perché a
ogni riesecuzione si ricalcolano da capo.autopath.py)
Il secondo livello vive in runtime/engine/autopath.py. Non cerca
la ripetizione della stessa frase: individua una famiglia semantica, verifica
che l'oggetto dell'intento coincida e riusa soltanto piani privi di argomenti
letterali legati alla richiesta d'origine. Prima dell'esecuzione gli argomenti
variabili vengono ricavati di nuovo dalla richiesta corrente.
Un autopath può nascere in due modi. Un riscontro positivo promuove un piano riuscito quando raggiunge la soglia configurata, pari a una conferma per impostazione predefinita. In alternativa, due esecuzioni riuscite dello stesso intento possono creare un autopath shadow quando il piano appena eseguito comprende almeno quattro passi. La voce shadow è utilizzabile, ma resta distinta da un piano confermato; il primo riscontro positivo la conferma. Questa seconda via riduce il costo delle richieste ricorrenti senza far passare per approvazione umana un segnale che non lo è.
Il confine è deliberato: L0 privilegia la ripetizione della stessa richiesta; L1 generalizza a un gruppo di intenti e può derivare da un riscontro esplicito oppure dalla semina shadow appena descritta. L0 viene prima nella cascata, ma entrambi devono superare gli stessi controlli di validità, corrispondenza degli argomenti con la richiesta e sicurezza prima dell'esecuzione.
Ogni piano memorizzato porta due firme: una per gli executor che usa e una per la famiglia di candidati disponibile per quell'intento. La firma incorpora anche la versione delle regole di instradamento e presentazione. Al momento del riuso Metnos le ricalcola: un executor modificato o rimosso, una nuova capacità concorrente o una modifica all'instradamento trasformano la voce in un miss. Il sistema ripianifica invece di eseguire una decisione presa in un contesto ormai diverso.
Le firme sono indipendenti dall'utente e non contengono profili, affinità o preferenze personali. L1 rimane quindi una cache condivisa di decisioni di piano, con chiavi deterministiche. Gli effetti autorizzati per l'utente e la presentazione finale — lingua, tono, lunghezza e formato — si applicano fuori dalla chiave del piano.
La famiglia dei candidati deriva dal vocabolario canonico, comprese le
relazioni tra contenuti specializzati e carrier del filesystem: per esempio,
una nuova capacità sui files può cambiare un piano che opera su
images o texts. Non vengono inserite nella firma le
parole della domanda o le affinity del manifest; in questo modo
l'invalidazione segue la semantica del catalogo senza rendere L1 specifica per
utente o per formulazione.
I fastpath L0 vengono conservati o ritirati secondo regole fisse, senza
decisioni di un modello. Ogni notte il processo
task_state_reaper applica tre regole d'invecchiamento e quattro
condizioni di ritiro.
| Regola | Criterio | Default | Env |
|---|---|---|---|
| Mai riusato | Creato da oltre N giorni ma mai eseguito una seconda volta | 14 giorni | METNOS_FASTPATH_GRACE_DAYS |
| Non usato di recente | Ultimo uso oltre N giorni fa | 30 giorni | METNOS_FASTPATH_STALE_DAYS |
| Limite LRU | Numero di voci superiore al limite; vengono rimosse prima quelle meno recenti | 500 | METNOS_FASTPATH_MAX |
| Codice | Causa | Trasferisce gli utilizzi |
|---|---|---|
| C1 | Uno strumento del piano non esiste più nel catalogo (ritirato, rinominato, archiviato). La riesecuzione fallirebbe. | No |
| C2 provenienza | Il fastpath è stato promosso a executor sintetico (vedi §9) e quell'executor è ora nel catalogo. | Sì |
| C2 nome | Esiste un executor con nome {verbo}_{oggetto} corrispondente all'intent, ma nessuno strumento del piano appartiene a quella famiglia. Il fastpath oscurerebbe l'executor. | Sì |
| C2 pre-filtro | Per i piani a più passi: il pre-filtro di instradamento deterministico sulla query canonica indica che un singolo executor copre l'intent (anche con nome diverso). | Sì |
Quando un fastpath viene ritirato perché un executor lo ha sostituito (le
condizioni C2), i suoi conteggi d'uso (n_uses) passano a
quell'executor attraverso il registro usato per il suo ciclo di vita. Gli
utilizzi già osservati non vengono quindi azzerati.
La rimozione riguarda il percorso memorizzato, non gli executor. Se la stessa richiesta torna e viene risolta correttamente, L0 può registrare di nuovo il piano aggiornato.
Riconoscere la richiesta è metà del lavoro. L'altra metà
è ricavarne i valori concreti: quali percorsi, quali URL, quale data, quale
soglia. Se ne occupa un estrattore a regole (args_extractor.py),
anch'esso senza modello:
https://...), path (~/... o /..., con la
scorciatoia «home» che diventa ~/), email, numeri,
estensioni di file («file PDF» → *.pdf), date
(oggi, ieri, domani, dopodomani — in italiano e in inglese —
tradotte in formato ISO) e finestre temporali («questa settimana»,
«ultime 24 ore», «last 7 days»).
Le soglie di fastpath e autopath sono lette dalle variabili d'ambiente del
processo Metnos; se una variabile manca, vale il valore predefinito nel modulo.
Le vecchie sezioni [fast_path] e
[multi_tool_fast_path] di
~/.config/metnos/runtime.toml sono state ritirate e vengono
ignorate. La pagina Praxis permette di osservare e svuotare le cache, ma non
modifica queste soglie. Per rendere permanente un override, va quindi inserito
nella configurazione del servizio; le costanti lette all'importazione richiedono
il riavvio del processo.
| Variabile | Valore predefinito | Significato |
|---|---|---|
METNOS_FASTPATH | 1 | Abilita L0; il valore 0 lo disabilita |
METNOS_CLUSTER_COSINE_HIGH | 0,90 | Soglia semantica di base; il confronto L0 usa questa soglia più 0,02 |
METNOS_FASTPATH_STALE_DAYS | 30 | Giorni dopo cui viene rimossa una voce non usata |
METNOS_FASTPATH_GRACE_DAYS | 14 | Periodo di conservazione delle voci mai riusate |
METNOS_FASTPATH_MAX | 500 | Numero massimo di righe, con rimozione LRU |
| Variabile | Valore predefinito | Significato |
|---|---|---|
METNOS_AUTOPATH | 1 | Abilita L1; il valore 0 lo disabilita |
METNOS_AUTOPATH_MIN_OBS | 1 | Osservazioni positive minime per promuovere un autopath |
METNOS_AUTOPATH_FLOOR | 0,87 | Similarità semantica minima nel ripiego per intento |
METNOS_AUTOPATH_TTL_ANTI | 2592000 (30 gg) | Durata di un'anti-autopath in secondi |
METNOS_AUTOPATH_TTL_REPEAT | 3600 (1 h) | Esclusione temporanea dopo una richiesta di ripetizione |
METNOS_AUTOPATH_KEEP_OBS | 5000 | Numero massimo di osservazioni recenti senza verdetto conservate |
METNOS_AUTOPATH_STALE_DAYS | 90 | Inattività dopo cui un autopath attivo viene rimosso |
METNOS_AUTOPATH_DEMOTED_TTL_DAYS | 30 | Conservazione di un autopath retrocesso |
METNOS_SEED_STEPS | 4 | Numero minimo di passi per la semina shadow |
METNOS_SEED_REPEAT | 2 | Osservazioni riuscite dello stesso intento richieste per la semina shadow |
| Variabile | Valore predefinito | Significato |
|---|---|---|
METNOS_FP_PROMOTE_MIN_CLUSTER | 3 | Numero minimo di fastpath distinti nel gruppo |
METNOS_FP_PROMOTE_MIN_USES | 15 | Numero minimo di utilizzi complessivi |
METNOS_FP_PROMOTE_MIN_AGE_DAYS | 30 | Età minima del gruppo |
METNOS_FP_PROMOTE_MAX_PER_NIGHT | 3 | Massimo di nuove proposte per notte |
METNOS_FASTPATH_AUTOPROMOTE | off | Abilita l'auto-promozione di Modalità 2 (senza approvazione) |
METNOS_FP_AUTOPROMOTE_MIN_CLUSTER | 5 | Fastpath distinti minimi per l'auto-promozione |
METNOS_FP_AUTOPROMOTE_MIN_USES | 50 | Utilizzi cumulativi minimi per l'auto-promozione |
METNOS_FP_AUTOPROMOTE_MIN_NIGHTS | 3 | Notti in cui la stessa proposta deve essere stata osservata |
Quando più fastpath L0 ricorrenti condividono la stessa struttura di
piano (l'impronta dello scheletro) e lo stesso intent, ogni notte il processo
task_fastpath_promotion li valuta come candidati a diventare un
executor sintetico. Conta il gruppo, non la singola voce: servono almeno tre
fastpath distinti, quindici utilizzi complessivi e trenta giorni di età.
Sono ammessi soltanto i piani a più passi: una sequenza di un solo passo
corrisponde già a un executor e il fastpath evita soltanto una nuova
chiamata al pianificatore.
Perché da L0 e non da L1. L'analisi guarda i fastpath L0, non gli autopath L1, perché la traccia delle richieste reali è in L0: quante richieste concrete e distinte tornano, quante volte, da quanto tempo (i tre numeri qui sopra). L1 è già generale e nasce dal riscontro dell'utente oppure dalla semina shadow, ma non conserva quel conteggio di richieste distinte. La generalizzazione avviene quindi qui, raggruppando i fastpath L0 per forma del piano e intento.
Per i candidati la cui famiglia è libera, Metnos annota nella tabella
promotions gli identificatori e le impronte dei fastpath di
origine. Quando il nuovo executor entra nel catalogo, il processo notturno usa
quel legame per ritirare esattamente le voci che lo hanno generato. I candidati
di composizione non ricevono questa provenienza automatica, perché il loro
nome finale dipende dal qualificatore scelto da una persona; le relative voci
L0 restano gestibili da Impostazioni > Memoria > Praxis.
© 2026 Roberto Brunialti · documentazione Metnos