48. Pravidlo deklaruje, jak je vynucováno, a revize je jedním ze tří způsobů
Kontext
Pravidlo tohoto repozitáře deklaruje class. blocking znamená, že kontrola odmítne práci, která je porušuje. To je tvrzení o světě a buď je pravdivé, nebo není.
Do 2026-09-11 nerozhodovalo nic, které. x-majordomus četla právě jedna otázka — existuje blok? — a každý povrch položil tuto otázku a z odpovědi vytiskl odznak. product.rs to řeklo na jednom řádku: enforced: o.metadata.get("x-majordomus") .is_some(). Pravidlo mohlo jmenovat test/cases/28_no_hardcoded_values.sh v sekci # Verification psané pro lidského čtenáře, ten případ se mohl přejmenovat a pravidlo se dál všude četlo jako vynucené. Vztah šel jedním směrem, s nevlastněným opakem — tvar, který tento repozitář stále znovu objevuje, naposledy v scripts/ci/reference-check a v matici tvrzení, o které ADR 0041 je.
scripts/ci/rule-proof-check uzavřelo polovinu pojmenování: pravidlo pojmenovává svůj důkaz ve front matteru a pojmenovaná cesta, která ve stromě není, rovnou selže. Přistálo se základem deseti blokujících pravidel, která nepojmenovávala nic.
Změřeno při zpracování oné baseline, odkud toto rozhodnutí pochází:
- Šest z deseti už mělo spustitelný důkaz.
apps/majordomus-cli/tests/quality.rsdokázalproject.operation-transport-parity;test/cases/99_adr.shdokázalmajordomus.decision-threshold. Důkaz existoval a byl pojmenován v próze, kterou nic nečte. Migrace těchto šesti spočívala v přesunu cesty z angličtiny do YAML. - Dvě mohla mít důkaz a neměla.
project.english-onlyiproject.finding-carries-reproduceříkaly „Review.“ a nic víc. - Čtyři nemohly mít důkaz a nikdy nebudou moci.
project.clean-roomse týká původu toho, co bylo napsáno — žádný program v tomto stromě nepozná, odkud pochází odstavec zdroje.project.optional-complexityse ptá, zda si mechanismus zaslouží svou cenu, což je úsudek, a kontrola, která by předstírala, že ho činí, by byla horší než žádná.
Základ držel všech deset jako jeden druh věci: „blokující pravidla, která nejmenují žádný spustitelný důkaz: dnes vynucována revizí“. Slovo dnes je vada. Čte se jako práce, která zbývá, a u čtyř z deseti nikdy nebyla. Seznam, který nerozliší tohle nikdo neumí zautomatizovat od nikdo se k tomu nedostal, druhé skryje tím, že ho zahrabe do prvního, a první nechá vypadat jako nedbalost.
Rozhodnutí
Blok vynucování pravidla deklaruje jeden ze tří režimů a tvar bloku je deklarace. Žádné slovo režimu se nepíše, a proto je nelze chybně napsat:
| režim | názvy bloků | kdo to spouští |
|---|---|---|
| odesláno | validator, s category, exit_code, enforced_by a testem | mj_doctrine_dispatch, u příkazů, které enforced_by jmenuje |
| řízeno kontrolou | tests, a žádný validátor | kontrola CI, nebo behaviorální sada |
| zrevidováno | reviewed_because a ani jedno z výše uvedených | člověk |
reviewed_because nese důvod a nic jiného nenese deklaraci. Vedle něj záměrně není žádný boolean. Příznak lze nastavit; důvod nelze nastavit bez napsání jednoho, takže výjimka je vždy věta, kterou někdo musel obhájit a revizor ji může číst. Blok s jedním slovem a bez důvodu není deklarace — propadne na unproven, což je zjištění, které měl nahradit.
Spustitelný důkaz vždy vítězí. Režim se rozhoduje v pořadí: validátor jej činí dispečerským, test řízeným kontrolou a teprve potom se čte důvod. Pravidlo, které získá případ, přestane být vynucováno revizí, ať je důvod ještě v jeho front matter, nebo ne, takže deklarace nemůže přežít vlastní potřebu zapomnětlivostí kohokoli.
Revidované pravidlo se počítá zvlášť, na každé ploše, vždy. rule-proof-check vypíše každé jako NOTE — nikdy jako úspěch, nikdy jako selhání — a uvede počet vedle změřeného celku. Typovaná zpráva je počítá v review_only, nikdy v passing a nikdy v named_proof. Když toto číslo roste, governance slábne, a nic jej nezapočítá do celku, který by to skryl.
Graf důkazů je jiná otázka než dispatcher a nesloučí se. majordomus doctrine se ptá, zda repozitář pravidlo právě teď splňuje — otázka o stromu. majordomus rules se ptá, zda je pravidlo ve stavu, ve kterém by vůbec mohlo být splněno — otázka o pravidle. crate::rules odpovídá na druhou spojením každého pravidla se stromem a s knihou důkazů z ADR 0041, přičemž znovu používá tento slovník, místo aby vymýšlel druhý, a hlásí deset stavů, z nichž tři se nikdy nesmějí splynout: proven (úspěšný běh, od té doby se nic nezměnilo), gated (mechanismus, který odmítá porušení, bez zaznamenaného verdiktu) a reviewed.
Stav pravidla je nejslabší z jeho částí. Jeden visící případ činí pravidlo visícím, kolik jeho dalších případů prochází, protože polovina, která se neřeší, je ta, které by čtenář věřil.
Důsledky
Základní linie rule-proof je prázdná. Každé blokující pravidlo v tomto repozitáři jmenuje spustitelný důkaz, nebo deklaruje s důvodem, proč je důkazem čtenář. Rohatka zůstává, takže další blokující pravidlo, které nejmenuje nic, je nový dluh a shodí kontrolu.
Dvě pravidla získala skutečné kontroly, obě přistály s prázdnými základními hodnotami, ne jako ratchety nad vlastními prvními zjištěními. scripts/ci/english-only-check je test abecedy a tak se tváří — anglická próza obsahující větu v jiném jazyce zapsanou v ASCII jím projde a vždy projde, takže pravidlo zůstává širší než kontrola, což je poctivý vztah mezi nimi. scripts/ci/finding-reproduce-check našlo devět skutečných porušení v lib/doctor.sh a lib/watch.sh; byla opravena, ne zaznamenána, takže drží hranici na nule.
Vztah je nyní čitelný v obou směrech. rules proves <test> jmenuje pravidla, která test dokazuje, a pravidla, která by zůstala bez jakéhokoli důkazu, kdyby byl smazán — otázku, kterou je třeba položit před přejmenováním případu a na kterou jednosměrný vztah nemohl odpovědět.
Čtyři pravidla jsou nyní trvale a viditelně vynucována revizí. To je smysl, ne regrese: číslo je malé, uvádí se při každém běhu a může klesnout jen tehdy, napíše-li někdo případ. Co už nemůže, je skrývat se uvnitř seznamu nazvaného dluh.
Cenou je změna schématu. reviewed_because je nové pole proto pravidla, takže share/allow/rule.txt a vedle něj schéma JSON se znovu generují a pravidlo používající klíč proti staršímu spustitelnému souboru je odmítnuto jako neznámý klíč front matter. Toto odmítnutí je správné a je to, k čemu guard generování existuje; je to i důvod, proč nelze tuto změnu aplikovat na strom bez předchozí regenerace.
Zamítnuté alternativy
Nechat čtyři v základní hodnotě. Současný stav. Zamítnuto, protože hlavička základní hodnoty sama říká „dnes vynucováno revizí“ a pro těchto čtyřech neexistuje den, kdy by to přestalo platit — seznam tak trvale špatně popisuje třetinu vlastního obsahu a položky, které dočasné jsou, jsou maskovány těmi, které nejsou.
Booleovský review_enforced: true. Zamítnuto právě proto, že je levný. Celá hodnota mechanismu spočívá v tom, že nárokovat výjimku stojí větu, kterou recenzent přečte; příznak činí výjimku zdarma a ze čtyř by se do čtvrtletí stalo čtyřicet.
Udělat z třídy místo toho advisory. Zamítnuto, protože to mění, co pravidlo znamená, aby se opravilo, jak je sledováno. project.clean-room skutečně blokuje — porušení se nezmerguje — a degradovat ho na advisory kvůli vyčištění seznamu by byla falešná zelená, kterou doktrína tohoto repozitáře přímo jmenuje.
Napsat pro ty čtyři slabé kontroly. Grep na „provenance“ by kontrolu splnil a nic by nerozhodl. Zamítnuto: kontrola, která nemůže selhat, je horší než žádná, protože poctivou absenci mění v nepoctivý průchod.
Zapracovat graf důkazů do majordomus doctrine. Zamítnuto, protože odpovídají na různé otázky a sloučený příkaz by odpověděl na obě jedním exit kódem. „Repozitář je v pořádku“ a „pravidlo je v pořádku“ nejsou stejná věta a jejich splynutí je způsob, jak zelený odznak přestane cokoli znamenat — stejná úvaha, kterou ADR 0041 odmítá splynutí proven a inputs unchanged.
Zaznamenat verdikt pro kontroly, aby gated mohlo dosáhnout proven. Lákavé a prozatím zamítnuté: ledger tohoto repozitáře zaznamenává případy sady a testy crate a naučit ho zaznamenávat exit kód libovolné kontroly je větší změna, než toto rozhodnutí potřebuje. gated říká přesně to, co je pravda — porušení se odmítají a žádný verdikt se zde nezaznamenává — a stav, který uvádí vlastní hranici, není mezera.