Co to znamená
Pokrytí celého crate je pod 100 % a zděděný dluh je skutečný, takže jediná hranice pro celý crate nemůže zakázat nový dluh: změna může přidat nepokrytý kód, zatímco souhrnné číslo se sotva pohne. Diferenciální invariant úkolu #214 vede hranici tam, kde ji lze udržet bez přepisování historie — u kódu, kterého se změna dotýká. Nový soubor dluží úplné pokrytí, nová funkce ho dluží, změněný spustitelný řádek dluží pokrytí, změněná větev dluží pokrytí; nedotčený starý kód může zůstat, jak je. Invariantem je new_debt == 0 a legacy_debt_after <= legacy_debt_before.
Princip
scripts/rust-coverage --changed <base> čte jediný kanonický export cargo llvm-cov — testovací kód je vyloučen z obou stran každého zlomku, stejné pravidlo řádků/funkcí/regionů jako používá kontrola crate — a protíná ho s řádky, o kterých git diff <base> říká, že je změna přidala nebo se jich dotkla, včetně pracovního stromu, takže necommitnutá úprava se posuzuje jako commitnutá. Změněný řádek, který odpovídá spustitelnému kódu s nulovým počtem, je nález; změněný řádek, který neodpovídá ničemu spustitelnému (komentář, prázdný řádek, use, deklarace typu, testovací kód), není. scripts/ci/coverage-differential je tenká kontrola: určí základ jako merge-base větve s trunkem (nebo explicitní), předá verdikt a rozlišuje PASS, FAIL (kód 10), UNKNOWN (kód 13, základ nelze určit) a BLOCKED (kód 12, toolchain pokrytí chybí nebo jeho běhu nelze věřit). Pravidlem je project.new-code-is-covered; plán CI spouští kontrolu v úloze coverage pro každou změnu pod crate.
Jak to vidět
scripts/ci/coverage-differential # this branch against origin/master's merge-base
scripts/rust-coverage --changed HEAD~1 # against the previous commit
MJ_COVERAGE_EXPORT=cov.json scripts/ci/coverage-differential # reuse an export, no reinstrument
test/cases/132_coverage_differential.sh je spustitelný důkaz: proti syntetické vnitřně konzistentní fixture potvrzuje, že záměrně nepokrytý změněný řádek FAIL (exit 10), týž řádek pokrytý PASS, změna mimo crate není vázána ničím a nerozlišitelný základ je UNKNOWN (exit 13), ne tichý průchod.
Co nepokrývá
Drží dimenze, které cargo-llvm-cov měří pro tento crate — řádek, funkci a region. Netestuje mutacemi: u predikátu, na jehož smyslu záleží (kontrola oprávnění, rozhodnutí o důvěře, přechod stavu), dokládá, že změněný řádek běžel, ne že by test selhal, kdyby byl řádek špatný; tyto subsystémy nesou vlastní adversariální sady a pokrytí je pro ně nutné, nikoli postačující. Nikdy nevyžaduje, aby se platil nedotčený starý dluh — dívá se jen na řádky, jichž se změna dotkla — a git hook spuštěný s --no-verify nebo základ, který mělký klon nedokáže rozřešit, je UNKNOWN, ne průchod, který nelze zdůvodnit.
Proč existuje
Hranice pro celý crate dovolí změně přidat nepokrytý kód a zůstat zelená, protože jedna nová nepokrytá funkce sotva pohne pěticiferným jmenovatelem; dluh narůstá po jednom commitu a nikdy není změna, která by hranici překročila. Úkol #214 činí otázku lokální — je tato změna pokryta — což je jediná podoba otázky, na kterou umí přispěvatel odpovědět a kterou umí kontrola držet bez přepisování historie crate.