Co to znamená
majordomus evidence show --check skončí s exit 10, když je jakékoli tvrzení deklarující status: guaranteed ve stavu, který zaznamenané důkazy nepodporují, a každé pojmenuje s důvodem a příkazem, který by to vyřešil. scripts/evidence-check vykreslí tutéž odpověď a ratchetuje ji proti .ai/repo/evidence-baseline.txt, takže záruka, která ztratí důkazy, je selhání, zatímco dluh, který už existoval, je znám a neblokuje.
Posuzují se pouze tvrzení guaranteed. advisory uvádí, že vynucování není zvenčí pozorovatelné, planned že chování zatím nic neimplementuje a rejected že ho nebude implementovat nic; požadovat aktuální důkaz o tom by znamenalo požadovat důkaz o věci, o které tvrzení samo říká, že tam není.
Princip
Ze sedmi stavů důkazu jsou tři, které za sebou mají prošlý běh — proven, inputs_unchanged a stale — přijaty jako podpora a nikdy se netisknou jako totéž. Ostatní čtyři jsou zjištění: failing, protože tvrzení zaručuje chování, jehož test naposledy selhal; not_run, protože jmenuje test, jehož běh nebyl nikdy zaznamenán; unrunnable, protože jmenuje cestu, kterou nehýbe žádný runner, takže žádné její provedení nemůže existovat; a no_test, protože nejmenuje žádný test. Každé zjištění nese tvrzení, stav, který deklaruje, stav, který důkazy podporují, důvod slovy a příkaz k reprodukci, kdyby věc rozhodlo spuštění něčeho.
scripts/evidence-check sám nic neodvozuje. Ptá se executable na evidence show --format json a nálezy čte z jeho odpovědi, protože kontrola s druhým názorem na to, co je dokázáno, by byla druhým modelem důkazu. Vypisuje součty za celou matici, nejen selhání, takže čtenář vidí tvar důkazů a kdy byly naposledy zaznamenány. Bez buildu skončí s 12 a řekne to, místo aby tiše prošla.
Ratchet není členství v seznamu jmen. Byl, a vadou nebyla přísnost, ale toto: baseline pojmenovává záruky, které byly nepodložené v den jeho zápisu, takže tvrzení napsané po tomto dni v něm chybí z jediného důvodu, proč může tvrzení chybět ve snímku minulosti — ještě neexistovalo. Při členství bylo každé nově sloučené zaručené tvrzení hlášeno jako ztráta důkazů, které nikdy nemělo, a zčervenalo kmen pro každou větev, která se sloučila potom. Ratchet, jehož poplach zazní při růstu, a ne při regresi, měří špatnou věc.
Baseline tedy zaznamenává stav pro každé tvrzení — řádek + pro záruku, kterou běh podpořil, holý řádek pro tu, kterou žádný běh nepodpořil — a kontrolu shodí dvě věci. Ztraceno: tvrzení, které baseline zaznamenala jako podpořené a důkazy ho už nepodporují; mělo důkaz a nyní nemá, a členství to nikdy nemohlo vidět, protože tvrzení, které ztratí důkaz, se přidá do množiny nepodpořených přesně jako nové tvrzení. Staženo: podpořená záruka, která už vůbec není zaručeným tvrzením matice; nic se nestalo nedokázaným, jen se zmenšil jmenovatel, a tak ratchet shnije, aniž by kdy zčervenal.
Zaručené tvrzení, které základní stav (baseline) neznal a které přijde bez zaznamenaného běhu, se ohlásí a započítá jako nový dluh, ale kontrolu neshodí — jeho odmítnutí je chybné chování popsané výše. Přijímá ho scripts/evidence-check --baseline, ve vlastním commitu a s odůvodněním. Řádek baseline, který je nyní podložený, se ohlásí, aby se seznam zužoval, místo aby zahnil. Soubor zapisuje --baseline a nikdy se nepíše ručně; jeho nepodložená polovina se zmenšuje jen jedním směrem — zaznamenáním běhu, který tvrzení dokládá, nikdy přidáním řádku.
Kontrola je deklarována v .ai/repo/ci/gates.yaml pod jobem structure s always: true a třída změn evidence do ní směruje ledger, základní hodnotu, kontrolu, matici, stránky tvrzení a docs/EVIDENCE.md.
Jak to vidět
majordomus evidence show --check # exit 10 with the unsupported guarantees
majordomus evidence show --findings --format json # the findings alone, with reasons
scripts/evidence-check # the ratcheted verdict, with the tallies
scripts/evidence-check --strict # every unsupported guarantee fails
scripts/evidence-check --baseline # rewrite the baseline from what is found now
scripts/evidence-check --repo PATH # judge that repository instead of this one
Filtrování nikdy nezužuje součty: odpověď ukazující jedno tvrzení stále hlásí, kolik matice bylo zkoumáno, takže filtrované čtení nemůže zkreslit pokrytí.
Co nepokrývá
Dnes je poradní a tvrdit něco jiného by bylo druhem tvrzení, které tento subsystém existuje, aby odmítal. Ledger začíná prázdný, takže v den příchodu kontroly bylo každé zaručené tvrzení not_run — pravdivě, a jako blokující kontrola by to znamenalo, že nikdo nemůže nic mergovat, dokud nebude zaznamenán běh celé sady. Každé z těchto tvrzení je v základu, takže to, co kontrola právě teď odmítá, je záruka, která ztratila důkaz nebo opustila matici, ne nedokázaná záruka. Nové nedokázané záruky se pojmenují a počítají a nezpůsobují selhání. --strict ignoruje základ a selže na všech; je to koncový stav, dosažitelný, až bude nepodporovaná polovina základu prázdná, a CI na něj tehdy přepne.
Kontrola nic nespouští. Čte, co bylo zaznamenáno, takže tvrzení doložené během, který nikdo nezaznamenal, se nedá odlišit od takového, který nikdo nespustil, a nápravou nálezu je spustit jmenovaný příkaz a zaznamenat jej — nebo opravit, co se rozbilo.
Posuzuje deklarovaný stav proti důkazům, ne tvrzení proti realitě. Zda pojmenovaný test skutečně zkouší tvrzenou větu, je otázka pro review, kterou drží project.no-claim-without-test; záruka stale kontrolou projde, protože důkaz starší než jeho předmět je stále důkaz, který byl vytvořen.
A není to kontrola proti manipulaci. Ledger je trackovaný soubor, ručně upravený výsledek je řádek v diffu a kontrola věří tomu, co ledger říká.
Proč existuje
Záruka je to nejsilnější, co tento repozitář o sobě říká, a byla jedinou věcí, kterou nic nekontrolovalo: matice mohla deklarovat chování jako zaručené, pojmenovat test a být publikována jako záruka, aniž za ní kdekoli stál nějaký běh. Zviditelnění muselo přijít před tím, než se z toho stane fatální chyba, protože kontrola, která blokuje v den příchodu, je kontrola, která se vypne. Dluh se tedy změřil, jednou zapsal a donutil klesat jedním směrem — čímž se kontrola, kterou nikdo nesplní, stává kontrolou, kterou nikdo nezhorší.