Zdůvodnění
doctor v jednom běhu ohlásil:
OK doctrine 41 doctrines — validator, dispatch, propagation, test and CI resolve for every one
OK rules 122 rule(s) — resolve in one deterministic order
Obě věty jsou pravdivé. Čtené spolu říkají, že repozitář je pokryt. Ve skutečnosti říkají, že 41 ze 122 pravidel má validátor a že těch 41 je správně zapojeno; o dalších 81 první řádek neříká vůbec nic a nic ve větě to čtenáři neřekne. Povrch doktríny také hlásil missing validators: 0, což platilo o jeho registru a mlčelo o 57 blokujících pravidlech, která v registru nejsou — pravidlu bez validátoru nemůže validátor chybět, protože nebylo nikdy započítáno.
Je to táž vada jako u ADR 0041: subsystém šest dní mlčel, zatímco všechny kontroly zdraví procházely, protože každá kontrola hleděla na podmnožinu, která jej vylučovala. Číslo, které nenese svého jmenovatele, se nemůže mýlit, a proto je nebezpečné.
Druhá polovina pravidla je strana detektoru téže myšlenky a dorazila jako tři kontroly za jediný den, u nichž byla chybná měření, ne jejich předmět:
scripts/ci/order-checkhlásilo „nepinované shell sorty vzrostly z 0 na 13“. Jedenáct ze třinácti bylo vestavěnýchsortv jq — sedm v programu.jq, čtyři uvnitř filtrů jq v jednoduchých uvozovkách v shell případu. Nikdo nemůže sort v jq připnout pomocíLC_ALL=C, takže ratchet nemohl nikdo splnit a selhal na každé větvi.scripts/ci/lease-reader-checkohlásila sama sebe. Jejím předmětem je soubor, který parsuje lease sdíleného serveru; její detektor je grep na jméno souboru lease; a jeden z jejích vlastních komentářů vysvětluje, proč se musí holé jméno souboru shodovat. Kontrola započítala vlastní dokumentaci svého předmětu jako svůj předmět.scripts/ci/pipefail-checkohlásillib/context.shjako skript, který používá pipe podset -ebezpipefail.lib/context.shnenastavuje nic: obsahuje komentář vysvětlující jemnost errexit a detektor ten komentář zachytil.
Každá kontrola měla pravdu v tom, co chtěla, a mýlila se v tom, na co se dívala. Způsob selhání je konkrétní a stojí za pojmenování: detektor, který hledá literál, najde i text, který literál vysvětluje, fixturu, která jej předvádí, a jiný jazyk, který jej píše stejně. Kontrola, která dokumentuje svůj vlastní předmět, nutně svůj předmět obsahuje.
Požadované chování
Verdikt uvádí svůj jmenovatel. Kontrola, která hlásí počet, hlásí, z čeho ten počet je, a kontrola, která říká „každý“, uvede kolik. 40 of 121 rule(s) carry a validator je verdikt; 40 doctrines — resolve for every one není, protože čtenář nemůže poznat, zda je těch 40 celá populace.
Verdikt jmenuje, co neprozkoumal. Kde kontrola vidí podmnožinu, zbytek je uveden stejným dechem, aby čtenář nemohl vzít podmnožinu za celek.
Nula je selhání, pokud není nula deklarována jako očekávaná. Kontrola, která nic neprověřila, to řekne a selže; project.empty-is-not-failure řídí případy, kdy je prázdná populace správnou odpovědí, a ty to říkají nahlas.
Detektor rozlišuje svůj předmět. Kontrola založená na grepu vylučuje komentáře, programový text jiného jazyka v jednoduchých uvozovkách, těla heredoc, která sama tvoří jako fixtures, a soubory jazyka, který neměří. Kde vyloučení nemůže být přesné, kontrola řekne, kterým směrem chybuje.
Ratchet nad vlastní základní hodnotou je chyba, ne nález. Základní hodnota, nad kterou už strom je, je nedosažitelná pro kohokoli a blokuje každou větev. Když ratchet selže, první otázka je, zda je jeho detektor správný, a odpovědí nikdy není zvýšit základní hodnotu, protože číslo vzrostlo.
Slib jmenuje důkaz. Pravidlo deklarované blocking a tvrzení označené guaranteed každé jmenuje něco, co stroj může sledovat až ke kódu, který běží. O tom rozhodují dvě kontroly, po jedné pro každou populaci, a každá je ratchet ze stejného důvodu — dluh je skutečný a předchází pravidlu: scripts/ci/rule-proof-check pro pravidla, scripts/ci/claim-proof-check pro tvrzení.
Kontrola říká, o které populaci není. Kde dvě kontroly měří sousední populace, každá při každém běhu jmenuje tu druhou, místo aby čtenáře nechala odvozovat ji ze seznamu identifikátorů. Obě výše uvedené kontroly byly jeden skript nesoucí obě poloviny a jeho zpráva o selhání tiskla id pravidel a id tvrzení v jednom seznamu pod odstavcem s nápravou, který začínal blokujícími pravidly; seznam nedokázaných tvrzení se četl jako seznam nedokázaných pravidel a obě kontroly byly hlášeny jako protichůdné, přestože se shodovaly. Verdikt, který uvádí svého jmenovatele, ale ne svou populaci, stále není verdiktem o ničem pojmenovatelném.
Jedna vlastnost má jednoho čtenáře. Druhý inventář vlastnosti, kterou už vlastní jiná kontrola, není neškodná redundance — rozchází se a slabší z obou se stane nesprávným. Odstraněná polovina přijímala jakýkoli blok x-majordomus jako důkaz, takže když ADR 0048 vložilo reviewed_because: dovnitř tohoto bloku, četla čtyři pravidla, která deklarují, že je vynucuje člověk, jako strojově sledované vynucování a hlásila výjimky jako sliby, které získaly důkaz. Náprava je smazat duplicitního čtenáře, nikdy ne učit ty dva, aby se shodovali.
Chování při selhání
scripts/ci/rule-proof-check skončí 10 u blokujícího pravidla, jehož důkaz žádný stroj nedokáže sledovat a které .ai/repo/rule-proof-baseline.txt nenese, a scripts/ci/claim-proof-check skončí 10 u zaručeného tvrzení, jehož test je nejmenuje zpět a které .ai/repo/claim-proof-baseline.txt nenese. Každý uvádí oba jmenovatele a jmenuje populaci, kterou neměřil. doctor hlásí součet balíčku pravidel s oběma čísly vedle sebe a blokující pravidla bez validátoru hlásí jako pojmenovaný nález, místo aby je nechal tam, kde je vidí jen jiný povrch.
Holý počet v nové kontrole se při revizi odmítne. Kontrola, jejíž detektor nerozliší svůj předmět, je vada kontroly a opravuje se v kontrole — nikdy zaznamenáním jejích falešných poplachů do základu, což mění rozbitý detektor v trvalý dluh.
Ověření
test/cases/230_verdict_states_its_subject.sh to dokládá mutací nad stromy fixtur, ne nad tímto checkoutem: blokující pravidlo, které nepojmenovává žádný důkaz, je odmítnuto a to, které pojmenovává validátor nebo případ, je přijato; pravidlo nesoucí jen reviewed_because: se hlásí zvlášť a nikdy jako důkaz; zaručené tvrzení, jehož test je nepojmenuje zpět, se počítá; pravidlo, jehož tělo cituje class: blocking, zatímco front matter říká něco jiného, se nepočítá; a populace, která je prázdná tam, kde předmět existuje, skončí jako nepoužitelná, ne čistá. Sekce, která určuje hranici, provede jedním stromem s nedoloženým pravidlem i nedoloženým tvrzením obě kontroly a vyžaduje, aby každá hlásila svůj nález, nehlásila nález druhé a slovy řekla, kterou populaci neměřila. scripts/ci/rule-proof-check --strict a scripts/ci/claim-proof-check --strict hlásí každá svou populaci s jmenovatelem; bin/majordomus doctor vypisuje součet pravidel.