Záznam rozhodnutí 0005
0005 — Nasazovací brány při pochybnosti zavírají
Stav: přijato · Datum: 2026-09
Kontext
Nasazení prochází skriptem-branou: sestavit, spustit kontroly proti nové verzi a provoz přepnout, jen když kontroly projdou. Chování brány formovaly dva incidenty:
- Kouřový test se nedostal ke službě (špatný port v testovací konfiguraci). Vypsal chybu, nevrátil nic a brána brala „žádné hlášené selhání“ jako úspěch. Rozbité nasazení odešlo ven.
- Kontrola ověřovala, že se stránka vykreslila, ne že ukazuje správná data. Prošla, zatímco čísla na stránce byla špatně.
Obojí je stejná chyba: brát nepřítomnost selhání jako důkaz úspěchu.
Možnosti
- Pustit dál, když žádná kontrola nehlásila selhání.
- Pustit dál, jen když každá očekávaná kontrola nahlásila úspěch; cokoli jiného — kontrola, která neproběhla, vypršela, nepřipojila se nebo vrátila něco nečekaného — je selhání.
Rozhodnutí
Možnost 2. Brána při pochybnosti zavírá:
- Každá kontrola vrací explicitní návratový kód; brána ho vyhodnocuje, ne jen vypíše výstup a jde dál.
- Chybějící, přeskočená nebo nedostupná kontrola je selhání, ne neutrální výsledek.
- Kontroly ověřují obsah (hodnotu, kterou uživatel uvidí), ne jen „stránka se načetla“.
- Každá brána obsahuje jeden záměrně selhávající případ, spuštěný jako první, aby se prokázalo, že brána umí říct ne. Brána, která nikdy neselhala, nebyla otestovaná.
- Brána se nikdy neobchází „jen tentokrát“. Když je špatně, opraví se brána; obejít ji a ručně dohánět její vedlejší účinky (oznámení, kouřové testy) je přesně cesta, kudy projde další tiché selhání.
- Před přepsáním čehokoli na serveru: zálohovat cíl a porovnat ho s tím, co právě běží. Když má server něco, co lokální kopie nemá, sloučit — nikdy nepřepsat novější verzi starší.
V tomto repozitáři
Stejná pravidla běží jako scripts/gate.py, jediný krok CI:
- Nejdřív záměrně selhávající případy —
scripts/forced_fail.pyv dočasné kopii vrátí každou opravu (filtr přístupu pustí všechno, dotaz ztratí omezení přístupem, předpona se počítá jako plná shoda, proxy povolí každou cestu, …) a vyžaduje, aby testy té opravy spadly; pak musí stejné testy projít na nedotčeném kódu. Test, který nemůže spadnout, nic nedokazuje. - Lint.
- Jednotkové a integrační testy nad skutečným Postgresem s
KB_REQUIRE_DB=1: chybějící databáze je selhání, ne přeskočený test, a souhrn musí být čistý průchod.
Krok, který nemůže proběhnout (chybějící nástroj, vypršení času), bránu shodí. Pravidla specifická pro nasazení výše (záloha a porovnání před přepsáním serveru) patří do nasazovací cesty systému, ze kterého byl tento kód vyňat; tento repozitář žádné nasazení neobsahuje.
Cena
- Víc planých poplachů: nestabilní síť teď nasazení zablokuje, místo aby se přehlédla. O to jde — nasazení, které nemůžete ověřit, byste neměli dělat.
- Psaní kontrol trvá déle, protože musejí ověřovat skutečné výsledky.
- Občas správné nasazení čeká na opravenou bránu. Přijato; alternativou bylo vydávat rozbité verze se zelenou.