Verifikační skript chybu vypíše, ale vrátí exit 0 — fail-open kontrola
import { Aside } from ‘@astrojs/starlight/components’;
Symptom
Sekce “Symptom”Operační runner (preflight → apply → verify) „prošel” i ve stavu, kdy cílová funkce nefungovala: lookup vracel prázdno, služba byla dál dostupná, kontrolní počty nesouhlasily. V logu byly ✗ řádky — ale exit 0, takže navazující krok pokračoval.
Root cause
Sekce “Root cause”Čtyři nezávislé vady téhož vzoru:
# 1. || true maskuje selhání nástroje, ne jen "nula nálezů"POCET=$(remote "tool list | grep -c 'vzor' || true") # tool spadl → "0", rc 0
# 2. kontrola jen vypíše výsledek, nikdo ho neporovnáecho "souborů: $(remote "find $DIR -type f | wc -l")" # baseline nikam neuloží
# 3. chyba se vypíše, ale FAILED flag se nepromítne do exitu[ "$LOOKUP" = "$EXPECTED" ] || echo "✗ lookup nesedí" # a jede se dál
# 4. nerozlišené návratové kódy: "cokoliv nenulového = OK"if ! remote "check user"; then echo "účet blokován ✓"; fi # i výpadek ssh (255)!Fix
Sekce “Fix”- Selhání nástroje oddělit od legitimní nuly sentinelem:
out=$(tool 2>&1) || { echo SENTINEL_FAIL; exit 9; }a sentinel v callerovi kontrolovat. - Každý změřený údaj uložit (durable marker soubor) a v verify tvrdě porovnat; odchylka ⇒ nenulový exit.
- Očekávaný návratový kód uvádět PŘESNĚ (např. „úspěch = rc 67”, nikoli „cokoli mimo 0”); transportní chyby (ssh 255) jsou vždy FAIL.
- Adresář před
find | wc -lověřittest -d && test -r— jinak neexistující cesta tiše vrátí 0. - Teeth testy: mock transportu (fake ssh/binárka řízená env proměnnými) + scénáře selhání, každý musí skončit exit ≠ 0 a výstup nesmí obsahovat žádnou úspěšnou hlášku.
Jak se tomu vyvarovat v jiných systémech
Sekce “Jak se tomu vyvarovat v jiných systémech”- Detection: grep runbooků na
|| true,2>/dev/nullu kontrol,echobez porovnání; spusť skript proti záměrně rozbitému prostředí — vrátí-li 0, je fail-open. - Anti-pattern: „kontrola” = vypsání hodnoty do logu; rc agregovaný
přes pipeline bez
pipefail; jedenifvětvící úspěch i výpadek. - Lepší přístup: verifikace jako stavový stroj s durable markerem (preflight → applied → verified), každý přechod fail-closed.