ENCSPožádat o přístup ke kódu

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:

  1. 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.
  2. 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

  1. Pustit dál, když žádná kontrola nehlásila selhání.
  2. 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:

  1. Nejdřív záměrně selhávající případy — scripts/forced_fail.py v 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.
  2. Lint.
  3. 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.