Co to znamená
Každý push do masteru spouští behaviorální sadu, testy crate a měření pokrytí. Tyto běhy jsou důkazem pro většinu matice a až do tohoto tvrzení se žádný z nich nedostal k ničemu, co by čtenář viděl. CI nyní uchovává, co spustilo, a výsledek každého testu jako zaznamenané provedení. Každé nese commit, proti kterému běželo, a běh, v němž proběhlo: identifikátor běhu, pokus, workflow, job a adresu, kterou přidělil provider. U pull requestu je tím commitem merge commit, který běžel, a head, z něhož vznikl, je nesen vedle něj.
To, co web publikuje vedle tvrzení, je verdikt sledované účetní knihy u commitu, nad nímž běželo CI, ne verdikt, který rozhodla vlastní spuštění CI. Ta spuštění jsou záznam běhu: počítají se a o ničem nerozhodují. Web pak říká, zda běh CI tento verdikt pro commit, z něhož byl web sestaven, potvrzuje. Je aktuální jen tehdy, když je běh právě onoho commitu, každá úloha, která spouštěla testy, měřila čistý strom, zpráva byla odvozena na čistém checkoutu a dostala se do artefaktu a nic nechybělo, nebylo odmítnuto ani neselhalo. Běh staršího commitu je zastaralý, s počtem commitů a změněných souborů mezi nimi, a stejně tak běh onoho commitu, který zaznamenal selhání. Běh onoho commitu, který zprávu nemůže potvrdit, je neznámý, se všemi důvody, a zpráva, kterou kolektor nedokázal odvodit, je jedním z nich. Žádný důkaz vůbec je nedostupný, s důvodem. Jako aktuální se na stránce ukáže jen potvrzující běh právě onoho commitu.
Princip
Job evidence z validate.yml stáhne do dočasného adresáře runneru zprávy, které zanechaly joby suite, crate a coverage, a měření, která suite a job rust pořídily ze stromů, v nichž běžely, a předá je scripts/ci/evidence-collect. Každé měření vylučuje jménem výstupy, které jmenuje jeho vlastní běh, na cestách, kam tento běh zapisuje, a nic jiného: zprávu suite v kořeni a časování a adresář artefaktů jobu rust v adresáři crate, kde běží scripts/rust-check.
Kolektor nejdřív odvodí report: změří vlastní checkout a spustí majordomus evidence show, než se cokoli zaznamená, takže report je verdiktem sledovaného ledgeru na onom commitu. Teprve potom reporty zaznamená přes majordomus evidence record --origin ci. Pro původ ci uvnitř prostředí GitHub Actions to opatří každé provedení run čteným RunRef::from_env; lokální záznam nejmenuje žádný běh, ani uvnitř CI shellu. Report, jehož job změřil jiný commit, je odmítnut a nikdy se nezaznamená, a report, který nepřinesl žádné provedení, je označen jako chybějící. Kolektor shrne pokrytí přes scripts/rust-coverage --summary-json a zapíše manifest, který nese měření producentů, z nich odvozený pracovní strom, strom, v němž byl report odvozen, a to, co chybělo nebo bylo odmítnuto. Výsledek se uchovává jako artefakt evidence.
Před každým buildem pages.yml spustí scripts/pages evidence. Najde artefakt zaznamenaný k publikovanému commitu nebo jeho nejbližšímu předkovi a zapíše site/data/evidence.json, který se nikdy necommituje. Publikuje zprávu tak, jak byla odvozena, a manifest čte jen proto, aby rozhodl o stavu: důvod může odepřít stav aktuální, ale zprávu nikdy nemění. /evidence/ ji vykreslí stejným terminálem, ve kterém domovská stránka přehrává běhy, a pod stavem vypíše každý důvod. Když běh masteru skončí, zatímco jeho commit je stále špičkou, znovu spustí workflow Pages a tato publikace řekne aktuální, když běh zprávu potvrdí.
Rozhodnutí je ADR 68, jak ho mění ADR 0087. Validační běh nikdy necommituje své řádky a řádky běhu na trunku se dostanou do sledovaného ledgeru jen přes zaznamenávací pull request z ADR 0080.
Jak to vidět
bash test/run.sh 357_ci_records_evidence
scripts/pages evidence --commit HEAD --out /tmp/evidence.json && jq 'del(.panels)' /tmp/evidence.json
Případ zaznamenává uvnitř popsaného běhu i mimo něj a sbírá běhy ve fixture s vlastní maticí tvrzení. Ukazuje, že tvrzení prokázané jen během běhu se ve sebraném reportu stále čte jako not_run, že strom je ten, který změřily produkující joby (jeden neměřený runner ho nechá neznámým vedle čistého) a že report změřený na jiném commitu je odmítnut. Publikuje sebrané důkazy proti publikovanému commitu, potvrzené i nepotvrzené, včetně reportu, který nebyl odvozen nebo nebyl přenesen, proti jeho rodiči a proti commitu mimo jeho historii. Čte commitnuté validate.yml kvůli zapojení a vylučované cesty jobu rust bere z jeho kroku rust-check a z místa, kde běží scripts/rust-check.
Co nepokrývá
Důkazy jsou připojeny k tvrzením, zatím ne k funkcím, příkazům, nástrojům MCP ani pravidlům, a pokrytí se hlásí pro crate a jeho doménu relací, ne pro jednotlivé subjekty. Zaznamenané řádky stále nesou razítko stromu samotného zapisovače, ne měření producentů, které manifest drží zvlášť; označení měření do každého řádku je pozdější změna. Řádky běhu na kmeni se zatím necommitují do sledovaného ledgeru, protože zaznamenávající pull request není zapojen. Job evidence nebrání sloučení: rozbitý kolektor způsobí, že web hlásí nedostupné, což je vidět a nic neodmítá. Vlastní kód shellového nástroje nemá žádné měření pokrytí a nic zde nepředstírá, že ho má.
Proč existuje
Většina tvrzení hlásí not_run v repozitáři, jehož CI spouštělo jejich testy při každém pushi. Důkaz, který se stane a zahodí se, je pro čtenáře totéž co žádný důkaz. A důkaz publikovaný nad vlastními řádky běhu, z checkoutu, který nezměřil nic, co běželo, pod odznakem hlásícím aktuálnost, je horší: vypadá jako verdikt autority a není jím.