Co to znamená
Ledger se slučuje po testech, nepřepisuje se po bězích. Záznam nahradí položku každého testu, který zpráva jmenuje, a každou jinou položku ponechá přesně tak, jak byla, takže bash test/run.sh 84_distribution_model následované záznamem aktualizuje jeden řádek a nic jiného na tom, co repozitář dokázal, nezmění.
Právě proto má smysl zaznamenat jediný případ. Zápis celé evidenční knihy na každý běh by potichu smazal důkazy o každém testu, který běh nezahrnul, a změnil by běh jednoho případu v repozitář, který prokázal jedinou věc — což je horší než ten, který neprokázal nic, protože to vypadá záměrně a nic v souboru neříká opak.
Princip
Ledger::merge v apps/majordomus-cli/src/evidence/ledger.rs prochází provedení, která dostane, a pro každé nahradí záznam se stejnou identitou testu nebo přidá nový. Neexistuje cesta, která by zkracovala. Zapisovač v record.rs produkuje provedení jen pro výsledky, které zpráva skutečně jmenovala; test, který se v žádné zprávě neobjeví, se nezapíše a spojení řekne not_run nebo bude dál hlásit starší provedení, podle toho, co platí.
Tři vlastnosti souboru plynou z téhož rozhodnutí. Záznamy jsou řazeny podle identity testu a zapsány s odsazením dvou mezer a koncovým novým řádkem, takže dva běhy téže množiny dají stejné bajty a diff ukazuje, co se změnilo, a ne co se přesunulo. Uchovává se jen poslední provedení každého testu, protože otázka, na kterou evidenční kniha odpovídá — je toto tvrzení nyní prokázáno — čte jen nejnovější a trvalým záznamem toho, co se dělo v čase, je git nad tímto souborem. A chybějící evidenční kniha a prázdná jsou touž odpovědí, not_run pro každé tvrzení, ani jedna není chyba: čerstvý klon má první a repozitář uprostřed adopce druhou.
Kniha, jejíž deklarovanou verzi tento spustitelný soubor nečte, se odmítne s oběma čísly, místo aby se přeinterpretovala, ze stejného důvodu, proč je merge částečný: špatně přečtená kniha je horší než chybějící, protože chybějící hlásí not_run a špatně přečtená by mohla hlásit úspěch.
Jak to vidět
MJ_TEST_REPORT=all.tsv bash test/run.sh
majordomus evidence record --suite all.tsv --origin local
majordomus evidence show --format json | jq '.ledger.executions'
MJ_TEST_REPORT=one.tsv bash test/run.sh 84_distribution_model
majordomus evidence record --suite one.tsv --origin local
majordomus evidence show --format json | jq '.ledger.executions' # unchanged
git diff --stat .ai/repo/evidence/ledger.json # one entry moved
test/cases/124_evidence.sh řídí stejnou posloupnost ve fixture repozitáři a ověřuje počet provedení po částečném běhu, že test, který běh jmenoval, nese novou dobu trvání a původ, a že test, který nejmenoval, stále nese staré.
Co nepokrývá
Dva výsledky téhož testu v jednom záznamu se nesmiřují; vyhrává poslední zapsaný, protože zapisovač výsledky nesoudí a nemá mezi nimi co upřednostnit.
Nic se neořezává. Záznam pro test, který byl mezitím z repozitáře smazán, zůstává v ledgeru, dokud jej pozdější nahrávka nenahradí nebo dokud jej někdo neodstraní v commitu; hlásí se poctivě — majordomus evidence proves říká, že zdroj není přítomen — ale nezametá se, protože soubor, který lze v tomto repozitáři zmenšit jen ručně, je soubor, jehož zmenšení lze posoudit v revizi.
Slučování zachovává, co bylo zaznamenáno, ne co je pravda. Starý záznam k testu, který stále existuje, dál dokazuje to, co dokázal u commitu, který jmenuje, a spojení rozhoduje, zda to stále platí.
Záznam, který není commitnut, je lokální názor. Merge se děje v pracovním stromě; dokud ledger není v commitu, žádný jiný checkout ani čtenář publikovaného webu ho neviděl.
Proč existuje
Spuštění celé sady trvá tak dlouho, že ho nikdo nedělá kvůli kontrole jedné změny, a subsystém, který by přijímal jen běhy celé sady, by byl subsystém, který nikdo nekrmí. Částečný běh je proto běžný případ a invariant, který ho činí bezpečným, musí platit, aniž by na to kdo myslel — proto je ověřen dvakrát: jako unit test nad samotným merge a behaviorálně, přes spustitelný soubor, ve fixture repozitáři.