Apeși Allow pe un ecran de consimțământ Google și se întoarce un token. Ce ai autorizat mai exact?
Majoritatea oamenilor răspund cu numele permisiunilor care le-au fost arătate, ceea ce este instinctul corect și un răspuns incomplet. În golul dintre cele două stă riscul interesant.
Permisiunile sunt mai largi decât par
O permisiune este o categorie, nu o regulă. gmail.modify sună a editarea unui
mesaj. Acoperă și mutarea corespondenței între etichete, marcarea ca citit și
aruncarea firelor la coș. drive nu înseamnă „fișierele la care te gândeai” —
înseamnă Drive-ul tău.
Furnizorii proiectează permisiunile pentru cea mai largă utilizare plauzibilă a unui API, pentru că o permisiune prea îngustă generează tichete de suport, iar una prea largă nu generează nimic. Stimulentul merge într-o singură direcție.
Așa că citirea onestă a oricărui ecran de consimțământ este: această aplicație poate face orice din această categorie, oricărui lucru din acest cont, oricând, până când revoc.
Ceea ce e în regulă când aplicația este un client de email al cărui comportament îl poți prezice. Un agent nu este așa ceva.
De ce modelul nu este granița
Instinctul este să scrii regula în prompt. „Poți citi din CRM, dar nu ai voie să ștergi niciodată o înregistrare.”
Aceea este o sugestie. Un prompt de sistem este o intrare printre altele, care concurează cu mesajul utilizatorului, cu descrierile instrumentelor și cu ce a returnat ultimul apel — și nu câștigă automat.
Nu ai nevoie de injecție de prompt ca să se rupă. Ambiguitatea obișnuită ajunge:
- Cineva îi cere agentului să „curețe contactele duplicate”. Ștergerea duplicatelor este sarcina. Ce instrucțiune ar trebui să câștige?
- Un instrument se numește
contacts.merge. Șterge una dintre cele două înregistrări. Numele nu spune nimic despre asta. - Conversația se lungește, primele mesaje ies din context și regula iese cu ele.
Niciunul nu este un atac. Iar din momentul în care adaugi rezultate din lumea exterioară — un email de suport, o pagină web, un tichet deschis de cineva — ai și text care ajunge în contextul modelului scris de cineva care nu ești tu. Orice server care returnează astfel de conținut ar trebui să îl eticheteze ca date neîncrezute, nu să îl lase să se citească drept instrucțiune.
Unde poate sta o graniță reală
Între agent și API. Fiecare apel trebuie să treacă pe undeva, iar acel undeva poate decide.
Forma utilă este să clasifici instrumentele după ce fac lumii, apoi să stabilești reguli pentru fiecare aplicație:
| Categorie | Ce înseamnă | Exemple |
|---|---|---|
| Citire | Aduce și caută. Nu poate schimba nimic. | GMAIL_LIST_MESSAGES, GITHUB_SEARCH_ISSUES |
| Scriere | Creează și actualizează. Schimbă date, dar nu le elimină. | SLACK_SEND_MESSAGE, NOTION_CREATE_PAGE |
| Distructiv | Șterge, revocă sau suprascrie. Greu sau imposibil de anulat. | GMAIL_TRASH_MESSAGE, GITHUB_DELETE_REPO |
„Agentul acesta poate citi orice și nu poate șterge nimic” devine atunci o regulă per aplicație, nu o regulă per instrument, și este verificată când ajunge apelul, nu sperată în timp ce este decis.
Două detalii fac diferența între „funcționează” și „doar există”. Instrumentele blocate nu ar trebui oferite — un agent care nu vede niciodată un instrument de ștergere nu încearcă să îl folosească. Iar un refuz ar trebui să numească regula, ca agentul să poată raporta de ce s-a oprit, în loc să reîncerce orbește sau să facă altceva în tăcere.
De ce nu există „întreabă-mă întâi”
Opțiunea evident lipsă este una intermediară: permite citirile, blochează ștergerile, întreabă-mă pentru scrieri.
Peste un protocol HTTP fără stare, întrebarea aceea nu are unde să stea. Nu există o sesiune care ține o conversație deschisă cât timp un om se uită la o casetă de dialog și niciun canal înapoi către cine ar trebui întrebat. Un apel este permis sau refuzat când ajunge.
Merită acceptată constrângerea, nu ocolită prin inginerie. O regulă decisă calm, dinainte, este o regulă mai bună decât una la care răspunde sub presiune de timp cine se întâmplă să fie atent — iar un prompt de aprobare care apare de patruzeci de ori pe oră este un prompt pe care toată lumea îl închide fără să îl citească.
Întrebările care chiar merită puse
Înainte să conectezi ceva la un agent:
În numele cui acționează agentul? O autorizare în browser înseamnă că acționează ca persoana care a aprobat-o, iar fiecare acțiune poartă numele ei. O cheie partajată înseamnă că totul este atribuibil cheii și nimic unei persoane. Prima variantă este mai bună și merită folosiți clienții care o susțin.
Ce se întâmplă când pleacă cineva? Dacă accesul este verificat la fiecare apel, scoaterea unei persoane îi taie agentul imediat. Dacă este verificat când se emite un token, agentul ei funcționează până expiră acel token.
Poți vedea ce a făcut? Nu „a reușit?” — ci ce instrument, ce argumente, ce
conexiune, în numele cui și ce a primit înapoi. Dacă răspunsul este o linie de
jurnal care spune tool_call ok, nu poți investiga nimic.
Cât timp se păstrează și cine poate citi? Argumentele și răspunsurile sunt cel mai sensibil lucru din orice pistă de audit. Ar trebui să aibă o retenție mai scurtă decât metadatele, retenția aceea ar trebui aplicată de ceva care rulează, nu de un document de politică, iar citirea lor ar trebui să fie un privilegiu de administrator, nu de membru.
Pe scurt
Token-ul este mai larg decât sugera ecranul de consimțământ. Promptul nu este o graniță. Granița stă între agent și API, este aplicată la fiecare apel și este decisă dinainte — pentru că din momentul în care o decizi pe loc, ai pierdut deja discuția cu un sistem mai rapid decât tine.
Exact asta este Spinrun
Noi am construit gateway-ul descris mai sus, deci citește partea asta ca pe o pledoarie — dar este și pur și simplu forma răspunsului.
Fiecare instrument este clasificat citire, scriere sau distructiv după verbul din numele lui. Stabilești o regulă per aplicație, două stări, permis sau blocat. Verificarea rulează înainte ca ceva să ajungă la furnizor, instrumentele blocate nu îi sunt niciodată oferite agentului, iar un refuz numește regula. Clienții care pot deschide un browser se autorizează ca o persoană, nu ca o cheie partajată, apartenența este verificată la fiecare apel, iar fiecare apel ajunge într-un jurnal de activitate cu argumentele, rezultatul și persoana în numele căreia a acționat — cu o retenție mai scurtă pentru conținut decât pentru metadate, aplicată de un job care rulează noaptea, nu de un document de politică.
Nimic din toate astea nu îți cere să ai încredere în noi privind comportamentul modelului, și exact ăsta e scopul. Regulile țin indiferent ce decide modelul.