87. Důkazy se indexují podle subjektu a posuzují na předložené revizi
Kontext
ADR 0041 udělalo z důkazu tvrzení zaznamenané provedení. Spojení, které vybudovalo, je podle cesty: tvrzení v docs/CLAIMS.yaml jmenuje soubor testu, TestId převede tu cestu na identitu (suite:<case>, crate:<binary>) a sledovaná kniha .ai/repo/evidence/ledger.json drží poslední provedení každé identity a nic staršího. majordomus evidence show posuzuje každé tvrzení proti té knize na pracovním stromu. Kolik tvrzení dosáhne kterého stavu, vypisuje majordomus evidence show --format json | jq .totals; tento záznam z toho nekopíruje nic.
To spojení odpovídá na jednu otázku o jednom druhu subjektu a každý jiný povrch, který chce říct „ověřeno“, se na ni nemá jak zeptat:
- Nic nepoutá widget webu k subjektu. Panel domovské stránky, stránka funkce, příklad příkazu a stránka nástroje MCP popisují chování a žádný z nich nejmenuje tvrzení, pravidlo ani test, který by ho dokázal. Kde stránka ukazuje důkaz vůbec, slovo bylo umístěno ručně.
- Web se nemůže zeptat, zda je tvrzení prokázáno v commitu, který zobrazuje.
evidence showposuzuje pracovní strom toho, kdo příkaz spustí. Web se sestavuje z jednoho commitu, kterýsite/data/build.jsonpojmenovává, a žádný příkaz tento commit neposuzuje podle záznamu, který je v něm zapsán. - CI své běhy zahazuje. Sada a testy crate běží při každém mergi do masteru a vypisují přesně to, co
evidence recordspotřebovává, a nic z těch běhů se nedostane do účetní knihy (měří to kontext ADR 0080). - Přeskočení se čte
failing.Outcome::proves()platí jen pro úspěšný průchod a oba posudky mapují každé provedení, které nedokázalo, nafailing, takže test, který odmítl běžet, se hlásí jako protidůkaz. Opačně: runner sady zapisujeokpro případ, který odmítne běžet ukončením s nulou, což se zaznamená jako úspěch; PR #629 to opravuje (ADR 0080, rozhodnutí 5). - Modul pravidel drží druhou kopii odvození čerstvosti.
rules/mod.rsmá vlastníchanged_sincea vlastní mapování z provedení na stav, vedle toho vevidence/mod.rs. Oba čtou stejnou knihu a musí se shodnout na tom, co je diff commitu, a drží je pohromadě jen review. - Vstupní preflight navržený v PR #578 přidává další. Jeho kontrola
verification.testspočítá zaznamenaný běh jako aktuální podle vlastního filtru: čistý zaznamenaný strom, diff od commitu běhu, který se dotýká jen ledgeru, a shodný digest. Nemá test obsažení, takže ho může projít běh zaznamenaný na commitu, který HEAD neobsahuje. Jeho kontrolaverification.enforcementpřepočítávárules::reportmísto čtení verdiktu korpusu. - ADR 0068 a ADR 0080 se rozcházejí v tom, kam míří důkazy CI. ADR 0068, „CI evidence is kept where the run happened, and published with the commit it proves“ (navrženo, PR #577), drží důkazy běhu jako artefakt běhu, publikuje je na web jako dataset a říká, že důkazy CI se nekommitují do sledované knihy. ADR 0080, „A CI run reaches the tracked ledger through a recording branch, never through the run that produced it“ (navrženo, PR #629), commituje provedení běhu trunku do sledované knihy přes pull request se záznamem. ADR 0080 necituje ADR 0068 a žádné neříká, které povrch čte, když se liší.
- Jak je PR #577 napsán, záznam běhu se publikuje jako verdikt. Jeho kolektor nejprve zaznamená provádění běhu a zprávu odvodí až poté, takže přepis, který web publikuje jako
current, je verdiktem nad vlastními řádky běhu, zaznamenaným z checkoutu, který nikdo neměřil.
Další návrh, ADR 0071, „Funkce existuje, jen když je její dodání vypočteno a projde každá dimenze“ (navrženo, PR #600), deklaruje dimenze dodání, které čtou testové důkazy, a drží vlastní implementaci toho, zda jeden commit obsahuje jiný.
Tento záznam rozhoduje o modelu, který čte každý z těchto povrchů, dříve než se cokoli z toho postaví, aby se každý řez práce držel jedné definice, nikoli vlastní.
Rozhodnutí
Důkazy se indexují podle předmětu (tvrzení, pravidlo, funkce, příkaz, schopnost, nástroj MCP, případ užití) a každý povrch posuzuje předmět v revizi, kterou prezentuje, přes jednu autoritu, jednu funkci čerstvosti a jednu agregaci. E je commit, na němž byl záznam provedení pořízen, T strom, který jeho běh změřil, P prezentovaná revize a Q prezentovaný strom.
1. Jedna autorita
Verdikt (ProofState) se odvozuje pouze ze sledovaného ledgeru .ai/repo/evidence/ledger.json. Tím se přejímá ADR 0080. Ledger živí dvě věci:
- zaznamenávající větev: běh trunku po merge a podle rozvrhu zaznamená svá provedení pomocí
evidence record --origin ciproti commitu, na němž běžel, a otevře pull request, který mění jen ledger, z větve pojmenované podle toho commitu. Nejvýš jeden takový pull request je otevřen; novější záznam ho nahradí. Prochází týmiž povinnými kontrolami jako každý jiný pull request; - záměrné, commitnuté lokální záznamy.
Záznam se zastaví na pokrytém commitu. Commit trunku C je pokrytý, když ledger zapsaný v C už drží to, co by přidal záznam C: E, commit, který jmenuje nejnovější provedení ci v tom ledgeru (podle jeho zaznamenaného času), je obsažen v C a changed' od E do C je prázdný. Běh trunku pokrytého commitu se nezaznamenává, ať jej spustil merge nebo rozvrh: záznamová úloha skončí dřív, než spustí test. Rozhodnutí 4 posuzuje každé provedení v ledgeru v C stejně jako v E, protože cesta ledgeru je mimo changed', takže diff, který se dotkne jen ledgeru, stále dokazuje. Záznam C by nezměnil nic než commity, které ledger jmenuje, a ta změna by otevřela další záznamový pull request, jehož merge by spustil další běh, bez konce, přičemž každé kolo stojí jeden plný běh sady. Přistání záznamového pull requestu na commitu, který změřil, vytvoří pokrytý commit, ať je sloučen jakkoli: jeho diff od E je samotný ledger. Záznamová úloha, která nemůže E s C porovnat, selže a řekne proč; ani nezaznamená, ani neprohlásí C za pokrytý.
Zastavení čte, co ledger pokrývá, nikdy diff samotného nejnovějšího commitu, protože commit jen s ledgerem není vždy pokrytý. Když záznam merge M1 přistane nad pozdějším merge M2, jehož vlastní záznam se nikdy neotevřel nebo nepřistál, je diff přistávacího commitu od prvního rodiče jen ledger, ale changed' od M1 k němu drží změny M2. Není pokrytý, takže se zaznamená: během běhu, který jeho vlastní přistání spustí, nebo, pokud se ztratí i ten, podle plánu, k čemuž plán na klidném trunku existuje (ADR 0080, rozhodnutí 1). Commit jen s ledgerem nad pokrytým, například záměrný lokální záznam, zůstává pokrytý.
Toto mění ADR 0068 větu po větě. Odstavce jeho sekce Decision, jak byly napsány na větvi PR #577, jsou v pořadí artefakt (¶1), odkaz na běh (¶2), publikace (¶3), obnova dispatche (¶4) a offline odkaz na běh (¶5).
- ¶1, „Zaznamenává provedení přes
majordomus evidence record --origin cia odvozuje zprávu přesmajordomus evidence show.“ Změněno: kolektor nejprve odvodí zprávu pomocíevidence shownad sledovanou účetní knihou ve stavu z commitu běhu a teprve potom zaznamená provedení běhu. Zpráva je verdiktem sledované knihy v daném commitu. - ¶1, „Sledovaný ledger zůstává tím, čím ho udělalo ADR 41, důkazem toho, kdo zaznamenává do stromu. Důkazy CI se do něj necommitují.“ Nahrazeno ADR 0080: provedení z běhu na trunku se do sledovaného ledgeru dostanou přes jeho záznamový pull request a validující běh je nikdy necommituje sám.
- ¶3, „Důkazem publikovaného commitu je
current.“ Změněno:currentpřebírá definici tohoto záznamu (rozhodnutí 3). Dokud není publikace webu typována,scripts/pages evidencepublikujecurrentjen tehdy, když je běh publikovaného commitu, každý job, který spouštěl testy, změřil čistý strom, report byl odvozen na čistém checkoutu toho commitu a nic nechybělo, nebylo odmítnuto ani neselhalo. Jinak publikujestale(běh předka nebo běh, který zaznamenal selhání) nebounknown(běh nemůže report potvrdit), s uvedením každého důvodu. Pravidlo může jen zadržetcurrent; nikdy nemění report. - ¶4, "That publication finds evidence of its own commit and says
current." Změněno stejným způsobem: odeslaná publikace říkácurrentjen tehdy, když tato definice platí. - Změněno, až dočasný oddíl skončí. Tyto věty platí pro dočasný oddíl „Recorded by CI“ a změní se, až publikační řez (I1959) přiměje
scripts/pagesvolatevidence publish. Od té doby publikace webu nese první odpovídající řádek publikační tabulky rozhodnutí 3:- ¶3, „
scripts/pages evidenceběží před sestavením, najde artefaktevidencevalidace masteru zaznamenaný proti publikovanému commitu nebo jeho nejbližšímu předkovi a zapíšesite/data/evidence.json.“ Změněno: skript voláevidence publishv checkoutu sestavení, který čte tento záznam běhu z artefaktu nebo z jeho kopie v gh-pages podevidence/<sha>/. - ¶3, „Důkaz předka se publikuje jako stale a jmenuje commity a změněné soubory mezi nimi.“ Upraveno: záznam předka se uvádí svým commitem, s commity a změněnými soubory mezi nimi. Může omezit verdikty, kterým odporuje (řádek 2), a nikdy neudělá publikaci
current: bez vlastního záznamu P je první odpovídající řádek tabulkydirty,stale,pendingnebounknown. - ¶3, „Žádný důkaz se publikuje jako nedostupný, s důvodem.“ Upraveno: žádný důkaz není
pending, dokud běh CI pro P neskončil, aunknownpoté, s uvedením důvodu.unavailablenení stav publikace a s tou sekcí zaniká. - ¶3, „None of the three blocks publishing.“ Změněno: žádný stav publikace publikování neblokuje. Sestavení webu odmítá jen dataset, který k němu není navázán (I1959).
- ¶4, „If master has moved on, nothing is dispatched: the newer commit's publication already shows this evidence as stale, and the newer commit's own run will refresh it.“ Změněno: publikace novějšího commitu uvádí tyto důkazy jako záznam předka (rozhodnutí 3) a vlastní běh novějšího commitu je obnoví.
- ¶3, „
- Stav, po větách:
- v ¶1 „Důkaz z CI je artefakt běhu, který ho vytvořil.“; věta jmenující job
evidencea zprávy, které dává kolektoru; souhrn pokrytí a manifest; a devadesátidenní uchování; - ¶2 celý;
- v ¶3: nejbližší důkaz a řečení, jak je blízko; dataset jako necommitnutý vstup jednoho nasazení; a jediná věc vyloučená. Dokud prozatímní sekce nezanikne, platí i každá další věta ¶3 kromě věty
current; - v ¶4: refresh jako dispatch, ne řetěz; dispatch
pages.yml, dokud je commit běhu stále špičkou masteru; apages.ymlspuštěné samotným pushem, dispatchovaný běh čekající na běžící publikaci. Dokud prozatímní sekce nezanikne, platí i věta o posunu dál; - ¶5 celý.
- v ¶1 „Důkaz z CI je artefakt běhu, který ho vytvořil.“; věta jmenující job
Čím jsou provedení běhu, řečeno jednou: provedení validujícího běhu nerozhodují žádný verdikt v artefaktu toho běhu ani na webu, kde jsou záznamem běhu (započtena, odkazována a uchována). Provedení běhu na trunku se stávají verdikty, až když je přistane jeho záznamový pull request do sledovaného ledgeru (ADR 0080).
2. Doplňkové záznamy verdikt nikdy nezesilují
- Záznamy běhů se zapisují jednou na volání
evidence recorda uchovávají se v artefaktu CI, na gh-pages podevidence/<sha>/a lokálně pod.ai/local/evidence/runs/, omezeny na nejnovějších 50. - Záznamy pokrytí jsou druhý druh, neseny uvnitř záznamu běhu. Oba druhy nesou svůj vlastní commit a strom.
- ADR 0041 zamítlo úplnou historii provádění ve prospěch posledního provedení na test. To se mění jen mimo sledovaný ledger: ledger dál drží poslední provedení na test a historie žije jen v záznamech běhů.
- Lokální řádky se zapisují pouze s
evidence record --ledger local, do.ai/local/evidence/ledger.json, a jsou poradní: povrch je zobrazí s jejich původem a nic z nich nerozhoduje. evidence recorddál ve výchozím stavu zapisuje sledovaný ledger, jak drží případ 124.
Monotónní pravidlo. Vezměte doplňkový záznam téhož testu, změřený na čistém stromě na commitu R, který obsahuje E a je obsažen v předložené revizi. Je-li jeho výsledek fail, timeout nebo error, omezí verdikt na stale s detailem, který jmenuje záznam (jeho původ, identitu a R). Doplňkový záznam proven zadrží; verdikt nikdy nerozhoduje, proto je strop stale a ne failing.
Pravidlo má dva zdroje:
- pracovní kopie sledované účetní knihy, když se předkládá commit (rozhodnutí 5): každé provedení, které drží a které kniha v předloženém commitu nezaznamenala, ne;
- záznamy spuštění.
Žádný povrch tedy neukazuje silnější verdikt, než je autorita, kterou čte pro revizi, kterou prezentuje; čistý selhávající běh, který vidí, zadrží proven a každý rozdíl jmenuje svůj záznam. evidence show a evidence show --presented HEAD posuzují různé revize (pracovní strom a HEAD tak, jak je commitnut): první může číst failing, kde druhý čte stale, a ani jeden nečte verified.
3. Pravidlo čtení pro každou plochu
| Povrch | Verdikt čten z | Prezentovaná revize | Doplňkové záznamy |
|---|---|---|---|
evidence show; evidence.report přes CLI, HTTP a MCP | sledovaná kniha v pracovním stromu; s --presented kniha tak, jak je commitnutá v předloženém commitu | pracovní strom (HEAD plus sledované, stageované a nesledované změny); s --presented <rev> vyčtený commit (rozhodnutí 5) | pracovní strom: žádný, protože pracovní účetní kniha je autorita. --presented: provedení pracovní účetní knihy, která commitnutá nemá, přes monotónní pravidlo, vypsaná vedle verdiktu |
evidence claim, evidence proves, rules report, rules show, rules proves, včetně verdiktu korpusu pravidel (RulesVerdict, navrženo v PR #597) | sledovaná kniha | pracovní strom | nepřečteno. Verdikt korpusu je proven jen tehdy, když je každé blokující pravidlo proven (rozhodnutí 4) |
evidence subject | sledovaný ledger, přes index subjektů (rozhodnutí 9) | pracovní strom, nebo --presented | lokální index běhů a adresář artefaktů CI zadaný přes --from: uvedeny vedle verdiktu, aplikovány jen přes monotónní pravidlo |
evidence coverage, evidence runs, evidence run | žádné: ukazují jen doplňkové záznamy | jako výše; pokrytí je aktuální jen tak, jak říká rozhodnutí 12 | lokální index běhů; --from |
Kontroly: scripts/evidence-check, evidence show --check | sledovaná kniha | strom v checkoutu | nikdy |
| Cockpit | sledovaná kniha prostřednictvím indexu subjektů | pracovní strom | samostatný, poradní sloupec lokálního běhu, přes monotónní pravidlo |
Web: evidence publish, spuštěno v buildovém checkoutu P | kniha commitnutá v P | build.json.commit, omezeno build.json.dirty | záznam běhu CI pro P, pokud existuje, jinak nejbližšího předka, označený svým commitem; přes monotónní pravidlo |
Prozatímní sekce webu „Recorded by CI“: scripts/pages evidence, ADR 0068 ve znění rozhodnutí 1. Zrušeno, až řez publikace (I1959) přiměje scripts/pages volat evidence publish a řez tras (I1958) sekci složí do sekce běhů | sledovaná kniha tak, jak je commitnuta v commitu běhu, odvozená jobem CI evidence před zaznamenáním provedení běhu | publikovaný commit: current vyžaduje, aby se commit běhu rovnal jemu, a běh předka je stale | manifest běhu (součty, změřené stromy producentů, strom zprávy, co chybělo nebo bylo odmítnuto): může jen zadržet current, nikdy změnit přepis |
Vstupní preflight (majordomus env preflight, PR #578): jeho kontroly verification.tests a verification.enforcement a to, co je vykresluje (vstupní briefing, přehled Cockpit, /api/v1/environment/preflight a nástroj MCP majordomus_preflight). Jediná známá výjimka z rozhodnutí 4 a 8 | sledovaný ledger v pracovním stromě. Testy kontrolují, že počty počítají běh jako aktuální podle vlastního filtru, který nemá test obsažení; kontrola vynucování přepočítává rules::report místo čtení verdiktu korpusu | pracovní strom | nečteno. Navazující řez (I1965) přesouvá kontrolu testů na funkci čerstvosti a kontrolu vynucování na verdikt korpusu |
Dimenze required_tests_current a test_evidence_published zprávy o doručení (PR #600, ADR 0071) | tam dnes pending. Až se spočítá: první projde jen tehdy, když je verdikt subjektu funkce na revizi trunku proven, což rušný trunk nedosáhne (Důsledky; vlastník rozhodne před přistáním I1960, zda to proces umožní, nebo se dimenze naváže na dosažitelný stav); druhá čte publikaci webu, která nese verdikt sledovaného ledgeru na publikovaném commitu (rozhodnutí 1) | revize trunku; publikovaný commit | pouze přes publikaci. Ani jedno nečte vlastní řádky běhu CI a ani jedno nemá vlastního čtenáře |
evidence record (zapisovatel) | ve výchozím stavu zapisuje sledovanou knihu; --ledger local zapisuje .ai/local/evidence/ledger.json | razítkuje E a T, které jeho běh změřil (rozhodnutí 6); do té doby HEAD a vlastní strom záznamníku | zapíše záznam běhu volání; s --ledger local ho také připojí do lokálního indexu běhů |
Stavy publikace jsou slova na úrovni webu, ne stavy důkazu, a každé je již zařazeno jako stavový token designového systému. Řídí publikaci webu přes evidence publish. Prozatímní sekce drží slova ADR 0068 tak, jak je upravuje rozhodnutí 1, mezi nimi unavailable, které není stavem publikace a s touto sekcí zaniká. Publikace nese právě jeden stav, rozhodnutý v době publikace z toho, co dokáže pozorovat: build.json, záznamů běhů, které přečetla, a závěru běhu CI pro P. Vyhrává první odpovídající řádek.
| # | Pozorováno při publikaci | Stav |
|---|---|---|
| 1 | build.json.dirty není false | dirty |
| 2 | přečtený záznam běhu, vlastní P nebo předka, omezí alespoň jeden verdikt ukázaný přes monotónní pravidlo | stale |
| 3 | Záznam běhu P se čte a každý strom, který nese, byl změřen jako čistý | current |
| 4 | Vlastní záznam běhu P se nečte a CI běh P neskončil | pending |
| 5 | cokoli jiného: běh P skončil bez záznamu běhu (jeho job evidence byl přeskočen, zrušen nebo selhal), záznam P nese špinavý nebo neznámý strom, záznam je nedosažitelný (artefakt vypršel a kopie na gh-pages neexistuje), nebo se nenajde žádný běh CI pro P | unknown, s uvedením který |
- Stav a jeho příčiny jsou oddělené: ať se shodl kterýkoli řádek, každý záznam, který omezil verdikt, je uveden vedle něj, takže špinavé sestavení, které záznam také vyvrací, se čte jako
dirtya přesto jmenuje tento záznam. - Záznam samotného předka může pouze omezit verdikt (řádek 2) a nic víc. Publikaci nikdy neučiní
current: bez vlastního záznamu P je stavdirty,stale, když záznam omezil verdikt, a jinakpendingnebounknown, přičemž záznam předka je uveden s jeho commitem, commity mezi nimi a změněnými soubory. Prozatímní pravidlo rozhodnutí 1 publikuje běh předka jakostalejen proto, že tam je přepis sám přepisem předka; tato tabulka toto pravidlo nahradí, až prozatímní část skončí (rozhodnutí 1). pendingje jediný stav, který má pozdější publikace téhož P nahradit, když běh P skončí (obnova dispatch v ADR 0068, ¶4).
4. Čerstvost je jedna funkce
changed' je množina cest změněných od E k předložené straně bez cesty ledgeru. Vyhrává první odpovídající řádek.
| # | Podmínka | Stav |
|---|---|---|
| 1 | žádný test | no_test |
| 2 | cestu neřídí žádný runner | unrunnable |
| 3 | nic nezaznamenáno | not_run |
| 4 | přeskočit | not_run, s důvodem |
| 5 | selhání, timeout nebo chyba | failing |
| 6 | projde; git nemůže porovnat | stale |
| 7 | pass; E není obsaženo | stale |
| 8 | pass; contained; the test's digest moved; no input changed | stale |
| 9 | prošlo; obsaženo; deklarovaný vstup se změnil | stale |
| 10 | pass; contained; changed' prázdné; zaznamenaný strom čistý; prezentovaný strom čistý | proven |
| 11 | jako řádek 10, ale zaznamenaný strom je špinavý nebo neznámý | inputs_unchanged |
| 12 | jako řádek 10, ale předložený strom je špinavý nebo neznámý | inputs_unchanged |
| 13 | pass; contained; changed' non-empty; inputs known and none changed | inputs_unchanged |
| 14 | pass; obsaženo; changed' neprázdné; trasa nejmenuje žádné vstupy | stale |
Pouze řádek 10 zobrazuje „verified“, na každém povrchu: zobrazené slovo, odznak i verdikt korpusu pravidel. rules report říká proven jen tehdy, když je každé blokující pravidlo proven, protože nezměněné vstupy nejsou prokázány (ADR 0041). Diff, který se dotýká pouze ledgeru, stále dokazuje; právě to umožňuje, aby pull request se záznamem, potomek E, dokázal E. Přeskočení nikdy není proven a nikdy není failing.
Vstupy tvrzení jsou jeho zdroj, jeho implementace a zdroj jeho testu; vstupy pravidla jsou zdroj jeho testu a jeho definice; vstupy jakékoli jiné trasy jsou zdroj jejího testu a pro ni odvozené cesty implementace, nebo žádné. Pravidlo se posuzuje toutéž funkcí. Diff pracovního stromu zůstává evidence::changed_since a kopie v modulu pravidel se odstraní.
Vstupní preflight z PR #578 je jedinou známou výjimkou, pojmenovanou v rozhodnutí 3, dokud nepřistane jeho navazující slice: jeho kontrola testů může označit běh za aktuální, když E není obsaženo v HEAD, a jeho kontrola vynucování přepočítává pravidla.
5. Prezentovaná revize
- Předloženou revizí je ve výchozím stavu pracovní strom.
--presented <rev>musí jmenovat vyčekovaný commit. Posuzuje ho ledger commitnutý v něm. Předložený strom se měří, ledger se ignoruje, a strom zadaný na příkazové řádce může toto měření jen oslabit.- Pracovní kopie knihy není autoritou pro prezentovaný commit, a přesto není ani ignorována. Každé provedení, které drží a commitnutá kniha ne, je doplňkový záznam čtený podle monotónního pravidla (rozhodnutí 2). Čistý selhávající běh, který checkout drží necommitnutý, proto zadrží
proven. - Na webu je prezentovanou revizí
build.json.commitabuild.json.dirtyomezuje verdikt. - Posuzování jakéhokoli jiného commitu není postaveno.
6. E a T měří běh
- Runner na konci běhu změří svůj commit a svůj strom, ignoruje své vlastní pojmenované výstupy, a obojí nese vedle svého reportu.
- Razítkuje je záznamník. Odmítne zprávu, jejíž commit není HEAD, a zaznamená T jako
unknown, když není žádné měření. - Commit běhu pull requestu je merge commit GitHubu, s
head_shavedle. Commit kmene může dokázat jen běh kmene. - Report uvádí jen to, co běželo: binárka cratu, která nespustila žádný test nebo jen vyfiltrovanou podmnožinu, je skip.
7. Izolace je jedna implementace
Zda jeden commit obsahuje jiný, se rozhoduje jednou, v git/mod.rs, vedle git::is_ancestor, a sdílí se se subsystémem dodávky (ADR 0071). Subsystém dodávky jej importuje, jakmile je na masteru, a maže svou vlastní kopii. Zahrnutí, o kterém git nedokáže rozhodnout, je řádek 6, nikdy důkaz.
8. Agregace je jedna funkce
Jedna funkce kombinuje části nad deklarovaným pořadím enumu každého stavu:
failingpokud selže kterákoli část;- jinak nejslabší z částí, které mohou nést důkaz;
- jinak nejslabší ze všech částí.
Nikde se nepíše druhé řazení. První krok existuje proto, že deklarované pořadí staví failing nad not_run, takže slabší z selhání a absence by se četlo jako absence: selhání se nikdy neschová za jednu. Součty podle stavů vždy provázejí verdikt.
Verdikt subjektu se počítá z vlastních verdiktů jeho členů, nikdy z jejich surových tras. Člen-pravidlo přispívá jedním deklarovaným mapováním RuleState → ProofState:
RuleState | ProofState | Nese důkaz | Proč |
|---|---|---|---|
proven, inputs_unchanged, stale, failing, not_run, unrunnable | stejné slovo | ano (unrunnable jen když to posoudilo samo pravidlo) | totožný význam |
gated | not_run | ano | kontrola odmítá porušení, ale žádný zaznamenaný běh nedokazuje chování |
reviewed | no_test | ne | pravidlo deklaruje, že ho nic spustitelného nevyjadřuje |
unproven | no_test | ano | blokující pravidlo, které nic nejmenuje, je vada a musí oslabit svůj subjekt |
dangling | unrunnable | ano | pojmenovaný důkaz, který neexistuje; subjekt dostane také nález dangling_member |
9. Index subjektů se pouze odvozuje, v Rustu
Index se odvozuje ze stávajících deklarací a žádný seznam předmětů se nepíše: tvrzení, pravidla, funkce, příkazy s hlavičkami # majordomus-covers: a # majordomus-negative:, schopnosti, jména MCP a hrany případů užití.
| Klíč | Řešení |
|---|---|
claim:<id> | spojení tvrzení z evidence show |
rule:<id> | spojení pravidel z rules report |
feature:<id> | členové: jeho tvrzení, pravidla, příkazy a případy užití |
command:<path> | případy sady, jejichž první řádek # majordomus-covers: nebo # majordomus-negative: pojmenovává příkaz, a příklady CLI v cratu pro příkaz, který nějaký má |
capability:<id> | trasy jeho příkazu |
mcp:<tool> | schopnost, kterou registr pro nástroj uvádí |
use_case:<id> | jeho běh scénáře; členové: příkazy, které spouští, pravidla, která procvičuje, a tvrzení, která dokládá, nikdy jeho vlastnící funkce |
majordomus generatezapisuje index jakosite/data/registry/evidence-subjects.jsondo adresáře site-data spustitelného souboru. Nikdy nezapisuje dosite/data/generated/, které vlastní a celé nahrazuje shellový generátor webu, takže žádný adresář nemá dva zapisovatele.- Index nedrží žádný obsah knihy ani commit, takže
majordomus generate --checkzůstává stabilní. - Web se k němu jen připojuje:
scripts/generate-site-dataspojuje route panelu s klíčem a subjekt, který index nemá, způsobí selhání generování s odmítnutím executable. - Jmenuje shellová odvození, která nahrazuje nebo drží shodná:
testszcommands.jsonvscripts/generate-site-data, čtení hlavičkylib/commands.shascripts/ci/command-furnished. Případ je drží shodná, dokud každé nečte artefakt. Kde se liší, ponechává se pravidlo prvního řádku indexu.
10. Nálezy o subjektu jsou samostatný seznam
feature_without_evidence, freshness_unknown a dangling_member jsou zjištění odpovědi subjektu, nikdy zprávy o tvrzeních, jejíž zjištění jsou tím, na čem evidence show --check kontroluje. Zůstávají doporučující, dokud je řez kontroly (I1962) neučiní odmítajícími a nepřepíše .ai/repo/evidence-baseline.txt ve stejné změně.
11. Kategorie testu se odvozuje z identity testu
suite:<case> je end-to-end; crate:<binary> z tests/<binary>.rs je integrační; poté unit, doctest a scénář, přičemž poslední je běh případu užití. verification.requires se nepřidává do feature/v1: co funkce vyžaduje, je to, co jmenují její členové.
12. Pokrytí je podpůrný důkaz
Pokrytí nikdy nerozhoduje o verdiktu. Je aktuální jen pro svůj vlastní commit, s čistým stromem, a na webu jen když je čistý i prezentovaný strom. Jinak se ukazuje se svým commitem a jako stale.
13. Klíče tokenů stavových slov jsou s pomlčkami
Slova verdiktů jsou v design tokenech vedena s pomlčkami (inputs-unchanged, not-run, no-test), protože vzor názvu tokenu odmítá podtržítka. ProofState::token() je jediné mapování drátového slova na token; žádná šablona slovo nepřepisuje.
14. Veřejná projekce je na seznamu povolených
To, co web publikuje o důkazech, je typovaná projekce, jejíž pole jsou pojmenována jedno po druhém; pole, které není na seznamu, se nepublikuje. Text, který běh vypsal, se k ní dostane jen přes jediný redaktor (I1950) a publikovaný artefakt stále prochází odmítnutím cest strojů a značek přihlašovacích údajů ze strany generátoru.
15. Rozhodnutí o rozhraních
- MCP zpřístupňuje důkazy pouze voláními nástrojů, bez šablon zdrojů.
- Povinná kontrola
cinepotřebuje jobevidence: důkazy se odmítají při publikaci a při finish, ne při merge. - HTML report llvm-cov se publikuje jen pro poslední nasazení.
- Důkazy případů užití nejsou v zapsaném katalogu opatřeny razítkem commitu; k revizi se připojují až publikací při nasazení.
- Nepřidává se žádná nová shellová automatizace (ADR 0069).
16. Záznamový pull request
Pull request otevřený vlastním GITHUB_TOKEN workflow nespustí žádný workflow pull_request, takže by nikdy nedostal povinné kontroly, které od něj vyžaduje rozhodnutí 1. Záznamový pull request se proto otevírá tokenem, jehož události spouštějí povinný workflow: buď záznamový job dispatchuje validate.yml na záznamové branchi, nebo používá token GitHub App. Vlastník mezi nimi rozhodne dřív, než přistane řez zapojení CI (I1954).
Důsledky
- Dokud nepoběží záznamová větev, sledovaná kniha obsahuje jen lokální řádky a web zobrazuje většinou
not_run. To je pravdivý stav a proto zapojení CI předchází odznakům. provenna revizi trunku potřebuje klidný trunk. Řádek 10 platí na commitu trunku jen tehdy, když ho od E odděluje nic než commity jen do knihy. Záznam stojí jeden běh celé sady, jehož dobu trvání měří důsledky ADR 0080, a jeho pull request pak prochází povinnými kontrolami, zatímco kontext ADR 0068 popisuje trunk, který se hýbe každých pár minut. Když v tomto okně přistane merge kódu,changed'od E k přistávacímu commitu není prázdné a přistálý záznam přesouvá tvrzení znot_runnainputs_unchanged(řádek 13) nebostale(řádky 9 a 14), ne naproven. Očekávání ADR 0080, že záznam přesouvá tvrzení naproven, vykreslené „verified“ na webu a dimenze doručenírequired_tests_current(rozhodnutí 3) platí jen po takovém klidném okně. Vlastník rozhodne mezi dvěma cestami ven dříve, než I1960 přistane: proces, který řádek 10 učiní dosažitelným (například merge fronta, která drží merge kódu od commitu běhu trunku, dokud nepřistane jeho záznam), nebo navázánírequired_tests_currenta požadovaného stavu milníku na dosažitelný stav. Tento záznam nevolí.- Commit jen s knihou, který přistane na merge, který žádný přistálý záznam nepokrývá, se zaznamená (rozhodnutí 1), takže ztracený záznam nikdy nenechá merge nezaznamenaný, dokud je trunk klidný.
- ADR 0068 se mění jen ve větách, které jmenuje rozhodnutí 1: některé hned a ostatní, až se přechodná sekce stáhne (I1959). ADR 0041 se mění jen mimo sledovanou účetní knihu: záznamy běhů drží historii a účetní kniha stále drží jedno provedení na test.
- Každé vykreslené „verified“ se vystopuje k řádku 10 jedné funkce a každé slabší slovo, které se mezi povrchy liší, jmenuje záznam, který ho zeslabil.
- Přeskočený test se čte
not_runs důvodem místofailinga zaručené tvrzení, jehož test jen přeskočil, se stále hlásí jako nepodložené. - Verdikt korpusu pravidel navržený v PR #597 dosahuje
provenméně často: korpus, jehož blokující pravidla jsou pouzeinputs_unchanged, se čte jako neprokázaný. - Subsystém dodávky se při rebase vzdává svého soukromého omezení.
- Vstupní preflight zůstává výjimkou, dokud nepřistane I1965. Tento záznam ji jmenuje, aby se nezaměnila s pravidlem.
- Index subjektů je jeden další generovaný artefakt. Deklaruje se jako každý jiný, takže jeho merge řeší odvozený merge driver.
- Práce je sledována jako milník
test-evidence, jeden úkol na řez, I1945 až I1965;majordomus planodvozuje, na čem se smí pracovat a v jakém pořadí.
Zamítnuté alternativy
- Pevně zapsané odznaky a odkazy. Odznak zapsaný do šablony je tvrzení bez provedení za sebou a zastará ve chvíli, kdy se změní ledger.
- Načtení GitHub Actions z prohlížeče. Zveřejněná stránka by závisela na síti a na limitech API v okamžiku čtení, zobrazovala by řádky běhu samotného jako verdikt a
scripts/ci/link-checkrozhoduje o odkazech offline. - Katalogy předmětů pro každé rozhraní zvlášť. Každé rozhraní by se od ostatních rozešlo; spojení příkazu s testem už v shellu existuje vícekrát (rozhodnutí 9).
- Paralelní výčet čerstvosti. Druhý slovník pro tytéž stavy je druhé odvození. Stavy publikace se proto drží stranou od stavů důkazu.
- Rovnost commitů, E = P, jako test pro
proven. Je nedosažitelná, jakmile je záznam commitnut: commit, který záznam přistává, je potomkem E, nikdy E. Diff pouze ledgeru dává stejnou záruku a lze ji splnit, ale jen na commitu trunku, který od E dělí jen commity pouze ledgeru (Důsledky). - Tři úložiště důkazů bez pravidla čtení. Sledovaná účetní kniha, artefakt CI a lokální účetní kniha by každé odpovídaly jinak a čtenář nemohl poznat, které z nich povrch ukázal.
- Zaznamenávat z validujícího běhu samotného. ADR 0080 to zamítá: běh pull requestu nemá co zapisovat do repozitáře, který posuzuje.
- Publikace verdiktu vypočteného z vlastních řádků běhu CI. To je ADR 0068 tak, jak bylo napsáno poprvé: řádky se posuzovaly proti checkoutu, který nikdo neměřil, takže web mohl říct
currento stromu, za který běh neručil.
Anticíle
| Anticíl | Mechanismus |
|---|---|
| odznak ověřený pro revizi, kterou netestoval | řádky aktuálnosti 6, 7 a 10–12; odmítnutí site-build (I1959); kontrola nasazení (I1961) |
| zapisovatel ručící za strom, který neviděl | rozhodnutí 6 |
| záznam běhu publikovaný jako verdikt | dodatek rozhodnutí 1 k ADR 0068 |
| částečný běh zaznamenaný jako úspěšný | pravidlo počtu crate (rozhodnutí 6) |
| přeskočený případ zaznamenaný jako prošlý | slovo pro přeskočení přistane před záznamem CI (Sequence) |
| selhání skryté za nepřítomností | rozhodnutí 8 |
verdikt korpusu proven nad pravidly, jejichž vstupy jsou jen nezměněné | rozhodnutí 4 |
| záznam, který zaznamenává vlastní přistání, bez konce | zastavení rozhodnutí 1 na pokrytém commitu |
| merge zanechaný nezaznamenaný za commitem jen s ledgerem | rozhodnutí 1: zastavení čte, co ledger pokrývá, ne vlastní diff nejnovějšího commitu |
| stav publikace, který by si mohly nárokovat dva řádky, nebo který nepokrývá žádný řádek | publikační tabulka rozhodnutí 3 s první shodou |
| plocha zelenější než ledger | monotónní pravidlo |
pojmenovaná revize posuzovaná proven nad čistým selhávajícím během, který checkout drží necommitnutý | monotónní pravidlo nad necommitnutými provedeními pracovní knihy (rozhodnutí 2 a 5) |
| druhé odvození „proven“ | rozhodnutí 4 a 8; vstupní preflight je jedinou pojmenovanou výjimkou až do navazujícího kusu |
| napevno zapsaný počet v šabloně | validátor důkazů (I1962) a 28_no_hardcoded_values |
| widget bez předmětu | odmítnutí generování (rozhodnutí 9) |
| druhý inventář subjektů | rozhodnutí 9 |
| publikované tajemství | rozhodnutí 14 |
| důkazy ztracené při vypršení artefaktů | gh-pages evidence/<sha>/ |
Zbytkové riziko: ručně upravený řádek knihy, zachycený jen review.
Sekvence
Práce je rozřezána na části, každá jeden úkol pod milníkem test-evidence:
| Řez | Úkol | Branch | Co dodává |
|---|---|---|---|
| Z | I1945 | feature/evidence-subject-adr | tento záznam, milník a úkoly |
| T | I1946 | feature/verdicts-are-status-words | slova verdiktu vedená jako stavové tokeny (rozhodnutí 13) |
| D | I1947 | feature/every-feature-reaches-a-test | každý případ užití vlastní nějaká funkce a funkce Cockpit a nasazení dosahují testu |
| A1 | I1948 | feature/evidence-is-judged-at-the-presented-revision | funkce aktuálnosti, předložená revize, zahrnutí a agregace (rozhodnutí 4, 5, 7 a 8) |
| S577 | I1949 | fix/the-ci-evidence-is-recorded-clean | PR #577's report derived before recording, its producers' trees measured, and the interim current rule (decision 1) |
| R | I1950 | feature/evidence-output-is-redacted-once | jediný redaktor (rozhodnutí 14) |
| A2 | I1951 | feature/evidence-runs-are-typed | záznamy běhů, měřený původ, záznamy pokrytí a pravidlo počtu crate (rozhodnutí 2, 6 a 12) |
| SI | I1952 | feature/evidence-subjects-are-derived | index subjektů (rozhodnutí 9 až 11) |
| C | I1953 | feature/evidence-answers-by-subject | příkazy subject, coverage a run |
| B | I1954 | feature/every-runner-reaches-the-ledger | záznamová větev, její zastavení na pokrytém commitu a změřená zpráva každého runneru (rozhodnutí 1 a 16) |
| P | I1955 | feature/evidence-publication-is-a-projection | povolená publikace a její stavy podle prvního shodujícího se pravidla (rozhodnutí 3 a 14) |
| E | I1956 | feature/cockpit-shows-evidence | pohled na důkazy v Cockpitu |
| A3 | I1957 | feature/every-test-line-is-read | výsledky po jednotlivých testech a lokální index běhů |
| F2a | I1958 | feature/evidence-has-routes | jedna routa důkazů na subjekt a panely spojené se svým subjektem |
| F1 | I1959 | feature/evidence-publication-is-typed | publikace webu přes evidence publish, svázaná se svým buildem a držená na gh-pages |
| F2b | I1960 | feature/every-widget-names-its-proof | odznak na každém widgetu a testovací rozměry zprávy o dodávce |
| G | I1961 | feature/deploy-verifies-evidence-routes | kontrola nasazení tras publikovaných důkazů |
| H | I1962 | feature/evidence-check-reads-widgets | kontroly nad nálezy subjektů a widgety (rozhodnutí 10) |
| I | I1963 | feature/evidence-is-tested-end-to-end | případy napříč všemi povrchy |
| J | I1964 | feature/evidence-is-documented | odkaz na důkazy, držený ke stromu |
| PF | I1965 | feature/the-preflight-reads-the-one-verdict | vstupní preflight na funkci aktuálnosti a verdikt korpusu |
Pořadí částí: tento záznam, T, D, R, A1 a S577 první; poté A1 → {A2, SI} → C → P → A3. Změny schopností mezi nimi přistávají jedna po druhé v tomto pořadí. A1 je navrstveno na PR #597 a S577 na PR #577. Navazující část preflightu (I1965) následuje, až budou PR #578 a PR #597, nesoucí A1, oba na masteru.
Pořadí, ve kterém pull requesty přistávají, určuje vlastník. Tento záznam si ponechává jen omezení, na nichž návrh závisí, ne frontu, která by zastarala:
- PR #629 přistane před PR #577.
- PR #577 přistane až poté, co se do něj mergne jeho oprava CI (S577) a až poté, co mergne master, aby v jeho základu byly PR #627 a PR #629, a až poté, co běh CI ukáže provedení cratů, čisté stromy změřené producentem a čistý strom reportu.
- A1 přistane s PR #597: zmergováno do něj, nebo přesměrováno na master, jakmile PR #597 přistál.
- PR #578 a PR #597 s A1 se mergují čistě v libovolném pořadí.
- Žádný řez tohoto návrhu nezvyšuje verzi: pull request, který posouvá veřejný povrch, zdědí verzi, která už je na masteru, jeho sloučením.
PR #629 předchází PR #577, protože před ním se případ, který odmítne běžet, zapisuje ok a zaznamenává jako prošlý. Automatické zaznamenávání běhů CI na takovém základu by tuto vadu zprůmyslnilo, což je rozhodnutí 5 z ADR 0080.
Dodatek, 2026-10-17: publikované UI čte ledger běhu, dokud neexistuje záznamová větev
Rozhodnutí 1 dělá ze sledovaného ledgeru jedinou autoritu, živenou nahrávací větví z ADR 0080. Ta větev není postavena (I1954). Proto UI snapshot na publikovaném webu 2026-10-16 posuzoval každý test proti sledovanému ledgeru čtrnácti lokálních běhů. Publikoval 154 tvrzení o testech jako „not run“, které validace téhož commitu spustila.
Dokud nepřistane I1954, úloha snímku UI ve workflow Pages vloží ledger.json artefaktu evidence do cesty knihy checkoutu dřív, než se UI přečte:
- Který artefakt. Je to artefakt publikovaného commitu nebo jeho nejbližšího validovaného předka, přes
scripts/pages evidence --ledger-out(I2786). Jeho manifest musí jmenovat commit v publikované historii, jinak se nic nekopíruje. - Jak se řádky posuzují. Nic jiného se nemění: řádky se posuzují podle rozhodnutí 4 na zveřejněném commitu. Řádek předka se čte jako zastaralý nebo se vstupy beze změny, nikdy jako běh zobrazeného commitu.
- Rozsah. Jen checkout publikace. Nic se necommituje a sledovaný ledger v repozitáři zůstává nedotčen.
- Kontrola.
scripts/pages published-evidencepak odmítne publikaci, jejíž report stále počítá více tvrzenínot run, než deklaruje.ai/repo/evidence/published-not-run.txt(pravidloproject.published-evidence-is-what-ci-recorded).
Když záznamová větev přenáší běhy CI do sledovaného ledgeru, překryv nepřidá nic a odstraní se s úkolem, který větev staví. Kontrola zůstává.