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 firmata dell'istanza.
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 lingua viene risolta una volta dalla richiesta d'istanza firmata e il medesimo valore viene propagato a renderer, pianificatore e Tutor. Il binding canale–utente non può sostituirlo.
Tutti gli utenti della stessa istanza ricevono quindi la stessa lingua. Per offrire due lingue operative simultanee servono due istanze distinte. Una chiave non ancora tradotta segue la catena di ripiego lingua d'istanza → inglese → italiano.
Chiedi a Metnos con una richiesta come quella di questo esempio: «Invia il rapporto a [email protected] 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 [email protected]
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, conversazione e decisione non sono condivisi fra utenti; la lingua appartiene invece all'istanza. |
| 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 propagazione della lingua d'istanza.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.