Quando la policy richiede una decisione umana, Metnos non esegue il passo. Registra una proposta pendente, la presenta sul canale dell'utente e riprende soltanto dopo una decisione valida. Testo, etichette e pulsanti seguono la lingua del singolo utente.
Il vaglio e la policy
valutano il passo preparato dal pianificatore. L'esito può consentire l'esecuzione,
negarla oppure produrre una proposta approval_required. Soltanto il terzo
caso apre un dialogo di consenso.
La forma della proposta dipende dalla capability e dal canale. Non esiste un contratto pubblico che imponga sempre tre righe o sempre due pulsanti. Il contratto stabile è semantico: la persona deve poter riconoscere l'azione, il suo obiettivo e le conseguenze rilevanti prima di decidere.
cap_pending, legato al mittente e al turn_id.Per i flussi che usano il registro atomico approval_registry, il token
è inoltre monouso, ha una scadenza predefinita di dieci minuti ed è vincolato a
canale e mittente. Il registro applica la transizione con una transazione SQLite.
| Canale | Presentazione | Decisione |
|---|---|---|
| Chat web | La proposta compare nella conversazione; i dialoghi strutturati possono aprirsi come modulo incorporato. | La risposta o il modulo vengono risolti nella stessa conversazione e nello stesso spazio utente. |
| Telegram | Quando il tipo lo consente, il messaggio include i pulsanti localizzati Approva e Rifiuta. I dialoghi non rappresentabili come pulsanti restano testuali. | Il callback cap:<turn_id>:yes|no
deve coincidere con la proposta ancora pendente. Anche una risposta testuale sì/no
usa lo stesso stato. |
Il trasferimento di una conversazione tra dispositivi non trasferisce l'identità a un altro utente: conversazione, sessione attiva e stato pendente restano nello spazio del proprietario.
Le etichette user-facing sono chiavi del catalogo i18n, non stringhe possedute dal
renderer. La preferenza lang viene risolta dal binding canale–utente e
applicata al solo turno tramite un contesto locale. Lo stesso contesto viene propagato
ai processi che eseguono il pianificatore e al Tutor.
Due utenti possono quindi usare lingue diverse nello stesso processo senza
modificare METNOS_LANG. Se viene aggiunta una lingua, la pagina delle
preferenze ricava l'elenco dal catalogo i18n; una chiave non ancora tradotta segue la
catena di ripiego lingua utente → inglese → italiano.
Chiedi a Metnos con una richiesta come quella di questo esempio: «Invia il rapporto a direzione@example.org e mostrami cosa verrà inviato prima di procedere».
Metnos prepara il passo e, se la policy richiede conferma, mostra una proposta localizzata. Un possibile contenuto è:
Inviare il rapporto mensile a direzione@example.org
Operazione non annullabile dopo la consegna
[Approva] [Rifiuta]
L'esempio illustra le informazioni necessarie, non un layout fisso. Su Telegram le scelte possono essere pulsanti; nella chat web possono essere una risposta o un modulo incorporato.
| Invariante | Effetto |
|---|---|
| Decisore = richiedente | Inoltrare un messaggio o conoscere un token non trasferisce l'autorità a un'altra persona. |
| Identificatore corrente | Un pulsante appartenente a un turno precedente viene rifiutato. |
| Consumo prima dell'esecuzione | Doppi clic e retry non duplicano l'azione. |
| Scadenza | Una proposta troppo vecchia deve essere generata di nuovo. |
| Isolamento per utente | Stato, lingua, conversazione e decisione non sono condivisi fra utenti. |
| Nessuna delega implicita | Approvare un passo non crea automaticamente un permesso generale o permanente. |
Una concessione persistente deve essere rappresentata esplicitamente dalla policy, avere un ambito riconoscibile e offrire un percorso di revoca. Metnos non la deduce dalla frequenza delle approvazioni, dalla loro formulazione o dal silenzio dell'utente.
runtime/channels/inline_ui.py: pulsanti e callback Telegram.runtime/channels/daemon.py: stato pendente, consumo e dispatch.runtime/http_routes_agent.py: percorso equivalente della chat web.runtime/approval_registry.py: token atomici con TTL e verifica del decisore.runtime/i18n.py: catalogo e contesto lingua per richiesta.tests/runtime/channels/test_telegram_authorization_buttons.py e
tests/runtime/safety/test_approval_registry_atomic.py: regressioni principali.Per il percorso utente delle pagine e dei canali, vedi la guida all'interfaccia.