Zdůvodnění
Pokrytí celého repozitáře je pod 100 % a starý dluh je skutečný; jediná podlaha pro celý crate nemůže zakázat nový dluh, protože změna může přidat nepokrytý kód a souhrnné číslo se sotva pohne. #214 vede čáru tam, kde ji lze udržet bez přepisování historie: kód, kterého se změna dotýká. Nový soubor dluží 100 %, nová funkce dluží 100 %, změněný spustitelný řádek dluží pokrytí a změněná větev dluží pokrytí. Nedotčený starý kód smí zůstat nepokrytý — legacy_debt_after <= legacy_debt_before — ale změna žádný přidat nesmí.
Měření není druhý názor. Je to tentýž export cargo llvm-cov, totéž vyloučení testovacího kódu z obou stran zlomku a totéž pravidlo řádek/funkce/region, které používá kontrola crate (scripts/rust-coverage); diferenciál je tento úsudek protnutý s řádky, kterých se podle gitu změna dotkla. Existuje jediná autorita pokrytí a toto pravidlo je užší otázka, která se jí klade — ne paralelní výpočet, který by se mohl rozcházet.
Požadované chování
- Každý spustitelný řádek, funkce a region, který změna pod
apps/majordomus-cli/src/*.rspřidá nebo se jich dotkne, měřeno proti merge-base větve s trunkem (včetně pracovního stromu), je pokryt testem. - Změněný řádek, který se nemapuje na žádný spustitelný kód — komentář, prázdný řádek,
use, deklarace typu, testovací kód — není vázán: není tam co spouštět, takže diff jen s dokumentací nebo testy projde bez nálezů. - Diferenciál se měří nad jedním kanonickým exportem a jedním vyloučením testů
scripts/rust-coverage --changed; žádný konzument nepočítá pokrytí jiným způsobem. - Kontrola rozlišuje PASS, FAIL, UNKNOWN (základ nelze přeložit) a BLOCKED (toolchain pro coverage chybí nebo jeho běhu nešlo důvěřovat). Unknown není pass; blocked není pass; spadlé měření nikdy není zelené.
Chování při selhání
scripts/ci/coverage-differential skončí kódem 10 a pojmenuje každý změněný spustitelný řádek, funkci nebo oblast, kterou nepokrývá žádný test, se souborem a řádkem; kontrola coverage-differential v .ai/repo/ci/gates.yaml ji spouští pro každou změnu pod crate. Skončí kódem 13, když git nedokáže vyřešit bázi (mělký klon, žádný remote), a 12, když chybí cargo-llvm-cov nebo instrumentovaný běh selhal — každé je odmítnutím certifikovat, nikdy úspěchem. Co statické čtení nevidí — že pravidlo měření je vlastní pravidlo kontroly crate — drží níže uvedený behaviorální případ, který vloží záměrně nepokrytý změněný řádek a dokáže, že kontrola selže, poté ho pokryje a dokáže, že kontrola projde.
Ověření
scripts/ci/coverage-differential (kontrola, kód 10 u nepokryté změněné položky) a test/cases/132_coverage_differential.sh, které pohání scripts/rust-coverage --changed proti pevnému exportu llvm-cov a pevnému diffu: ověřuje, že nepokrytý změněný řádek FAIL (kód 10), pokrytý změněný řádek PASS (kód 0), změna jen v dokumentaci se nepodrobuje ničemu a nevyřešitelná base je UNKNOWN (kód 13), ne tichý průchod.