Co to znamená
Existují dvě třídy. blocking znamená, že porušení ukončí příkaz nenulovým exit kódem; advisory znamená, že porušení je nahlášeno a příkaz přesto uspěje. Třída se čte v okamžiku dispatche a určuje, kam nález půjde, takže je to mechanismus, ne štítek.
Princip
Validátor nikdy nevolá mj_fail přímo. Volá mj_doctrine_fail, který čte MJ_DOCTRINE_CLASS — nastavené dispatcherem z registru — a vydává FAIL pro blokující doktrínu a WARN pro poradní. Pouze FAIL a DRIFT zvyšují čítač, který příkaz promění v svůj návratový kód. Neznámá třída není ani jedno: je to chyba konfigurace, hlásí se jako taková a selže uzavřeně, místo aby se výchozně chovala jako poradní.
watch je jediný příkaz, který toto přebíjí, a to záměrně. Nikdy neblokuje práci — hlásí, co se pohnulo, a končí kódem 11, aby řekl, že něco našel — takže pod watch je každá odchylka drift, včetně doporučujících.
Jak to vidět
majordomus check # WARN checkpoint … 40m ago, interval 15m → exit 0
# change class: advisory to class: blocking for majordomus.checkpoint-freshness
majordomus check # FAIL checkpoint … 40m ago, interval 15m → exit 10
test/cases/17_doctrine_enforcement.sh provede přesně tuto úpravu v jednorázové kopii nástroje a ověří, že se změní návratový kód.
Co nepokrývá
Třída říká, co porušení stojí, ne jak závažný je podkladový problém. Neexistuje žebříček závažnosti a jeho přidání by znamenalo přidat úroveň, která neblokuje ani nestojí za hlášení.
Proč existuje
Systémy vynucování mají tendenci sklouznout ke střednímu nastavení, kde je pravidlo nominálně vynucováno a nikdy nic neselže. Dvě třídy to znemožňují vyjádřit: pravidlo buď práci zastaví, nebo ne, a registr říká které, jedním slovem, které kód čte.