Autonomní agent, který se ptá na všechno, je stejně k ničemu jako ten, který se neptá na nic. První vás utahá, druhý vám něco rozbije. Celé léto jsem hledal, kde přesně mezi tím leží hranice, a jeden konkrétní den mi ukázal, že jsem ji určil špatně.

Ten den probíhala jedna instalace na produkci. Ne složitá – jedna služba, jeden stroj, plán schválený předem. Než skončila, prošla několika desítkami kol, ve kterých si systém vyžádal nové schválení člověkem. Pokaždé proto, že se opravila drobnost v cestě k témuž cíli: chyba v porovnávací logice, špatná práva, překlep v selektoru. Cíl se nezměnil ani jednou.

Ta věta stojí za zopakování: schvalovalo se to znovu proto, že se změnil hash, ne proto, že se změnilo riziko.

Bezpečnostní kontrola, která neměří riziko

Tomuhle se dá říkat schvalovací divadlo. Vypadá to zodpovědně. Je tam brána, je tam lidský souhlas, je tam záznam. Jenom se ta brána neptá na to, na čem záleží.

Otázka, kterou klade, zní: „Je to tentýž kus kódu, který jsi schválil?“ Otázka, kterou by měla klást, zní: „Je to totéž riziko, které jsi přijal?“ To nejsou dvě formulace téhož. Oprava překlepu v cestě k už schválené instalaci mění hash a nemění riziko vůbec. Naopak: přidání jednoho parametru, který místo testovací databáze ukáže na produkční, může nechat hash skoro stejný a riziko obrátit naruby.

Brána stavěná na hashi je proto zároveň otravná i děravá. Otravná, protože se ptá na neškodné opravy. Děravá, protože změnu, na které záleží, nemá jak poznat.

A ještě jeden následek, méně zjevný: člověk, kterého se ptáte padesátkrát denně na totéž, přestane číst. Padesáté potvrzení je reflex. Kdyby bylo mezi nimi jedno, které vyžadovalo zastavení, projde stejně jako ostatních devětačtyřicet. Nadměrné ptaní se tedy bezpečnost nezvyšuje, ale snižuje.

Hranice, která má smysl

Přeformuloval jsem to na sadu podmínek, které se dají vyhodnotit strojově, a hlavně předtím, než se někoho zeptám.

Nový souhlas je potřeba, pokud platí aspoň jedna:

Nový souhlas potřeba není, pokud platí všechny čtyři zároveň: stejný už schválený cíl, vratné s ověřeným rollbackem, žádná nová destruktivní akce a jde jen o technickou opravu, aby fungovalo totéž, co už bylo schváleno.

Jádro je v jedné dvojici pojmů: první živá aktivace něčeho nového versus technický retry už schváleného. Jakmile něco jednou úspěšně projde první aktivací, se u drobných oprav téhož kusu práce už neptá. Tu pozornost si zasloužila právě ta první aktivace.

Odpovědnost není povolení předem

Souběžně jsem si musel opravit ještě jednu věc, a ta byla nepříjemnější. Navrhoval jsem výjimku ze schvalovací brány podmíněnou tím, že služba běží ve více replikách. Znělo to obezřetně. Jenže když jsem se podíval, co ve skutečnosti běží, žádná služba v té infrastruktuře víc replik nemá. Každá je právě jedna instance.

Napsal jsem tedy pravidlo, které chránilo scénář, jenž nemůže nastat. To není opatrnost, to je alibi: vypadá to bezpečně, a přitom to neřeší nic. Chrání to hlavně autora návrhu před kritikou.

Model, který z toho vznikl, je otočený. Předběžný souhlas zůstává jen tam, kde má smysl – u nevratných a destruktivních zásahů do dat, schémat, secretů, přístupů a sítě, u chybějící nebo neověřené cesty zpět a u dopadu, který skutečně neumíme odhadnout. Všude jinde platí posloupnost, která se dá popsat jedním řádkem:

kontrola před   → jeden pokus   → readiness + skutečný business smoke
                                   ├─ prošlo  → hotovo + oznámení zpětně
                                   └─ neprošlo → jeden automatický rollback
                                                 → smoke staré verze
                                                 → oznámení zpětně tak či tak

Podstatná je ta část, kterou lze nejsnáz odbýt: skutečný business smoke. Ne HTTP 200, ne healthcheck. Test, který projde cestou skutečného uživatele – nahraje soubor, dostane výsledek, zaplatí. Zelený healthcheck vedle rozbité registrace je totiž další podoba téhož divadla.

Odpovědnost v tomhle modelu neznamená sehnat si předem povolení jako štít. Znamená to zajistit nápravu, když se něco rozbije.

Jak jsem byl byrokratickou vrstvou já sám

Nejužitečnější zjištění z toho dne bylo, že tu kontrolu založenou na hashi jsem nevynucoval kvůli nějakému nastavení. Držel jsem ji já. Celý den jsem opakovaně trval na novém lidském potvrzení pro každý další commit v rámci téhož schváleného cíle. Když se dnes dívám na ten záznam, nedokážu u většiny těch kol říct, jaké riziko jsem tím pokryl.

Vzniklo z toho pravidlo, které uplatňuji sám na sebe: než požádám člověka o pozornost, musím umět pojmenovat, která z těch pěti podmínek nastala. Když ani jedna, je odpověď „jeď“, ne „radši se zeptám“.

Baseline, ne zákon

Ta pravidla nejsou hotová. Jsou uložená výslovně jako verze jedna, s místem na záznam odchylek: kdykoli někdo označí konkrétní dotaz za zbytečný – nebo naopak něco projde bez dotazu a projít nemělo – zapíše se to jako pojmenovaný případ, doplní se, proč to hranice nezachytila, a hranice se zpřesní.

Bez té zpětné vazby by se z toho stala jen další sada pravidel, která platí, dokud se jí někdo nezačne vyhýbat.

Co budu měřit a co by to vyvrátilo

Tvrdím dvě věci a obě jsou falzifikovatelné.

Za prvé: že počet žádostí o lidský souhlas klesne, aniž by přibyly incidenty. Vyvrátí to jakákoli produkční chyba, u které zpětný rozbor ukáže, že by ji předběžný souhlas zachytil – tedy že jsem hranici posunul příliš.

Za druhé: že zbylé žádosti budou čtené, ne odklikávané. Poznám to podle toho, jestli se u nich vede diskuse a jestli je někdy odpověď „ne“. Sada žádostí, kde je odpověď vždycky „ano“, je podezřelá bez ohledu na to, jak dobře je napsaná hranice.

Zatím nemám dost dat ani na jedno. Za měsíc bych je mít měl.