Přeskočit na obsah

Tato stránka byla automaticky přeložena z angličtiny, jediného jazyka, ve kterém se tento web píše. Číst originál.

Důkazy se indexují podle předmětu a posuzují na předložené revizi

Důkazy se indexují podle předmětu a posuzují na předložené revizi

majordomus://adr/adr-0087navrženo evidencetvrzeníciověřeníweb

odkazuje na

odkazuje na něj

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 show posuzuje pracovní strom toho, kdo příkaz spustí. Web se sestavuje z jednoho commitu, který site/data/build.json pojmenová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 record spotř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, na failing, takže test, který odmítl běžet, se hlásí jako protidůkaz. Opačně: runner sady zapisuje ok pro 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.rs má vlastní changed_since a vlastní mapování z provedení na stav, vedle toho v evidence/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.tests počí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 kontrola verification.enforcement přepočítává rules::report mí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 ci proti 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 ci a odvozuje zprávu přes majordomus evidence show.“ Změněno: kolektor nejprve odvodí zprávu pomocí evidence show nad 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: current přebírá definici tohoto záznamu (rozhodnutí 3). Dokud není publikace webu typována, scripts/pages evidence publikuje current jen 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 publikuje stale (běh předka nebo běh, který zaznamenal selhání) nebo unknown (běh nemůže report potvrdit), s uvedením každého důvodu. Pravidlo může jen zadržet current; 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á current jen 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/pages volat evidence publish. Od té doby publikace webu nese první odpovídající řádek publikační tabulky rozhodnutí 3:
    • ¶3, „scripts/pages evidence běží před sestavením, najde artefakt evidence validace masteru zaznamenaný proti publikovanému commitu nebo jeho nejbližšímu předkovi a zapíše site/data/evidence.json.“ Změněno: skript volá evidence publish v checkoutu sestavení, který čte tento záznam běhu z artefaktu nebo z jeho kopie v gh-pages pod evidence/<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 tabulky dirty, stale, pending nebo unknown.
    • ¶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, a unknown poté, s uvedením důvodu. unavailable není 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í.
  • Stav, po větách:
    • v ¶1 „Důkaz z CI je artefakt běhu, který ho vytvořil.“; věta jmenující job evidence a 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; a pages.yml spuš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ý.

Čí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 record a uchovávají se v artefaktu CI, na gh-pages pod evidence/<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 record dá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

PovrchVerdikt čten zPrezentovaná revizeDoplňkové záznamy
evidence show; evidence.report přes CLI, HTTP a MCPsledovaná kniha v pracovním stromu; s --presented kniha tak, jak je commitnutá v předloženém commitupracovní 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á knihapracovní stromnepřečteno. Verdikt korpusu je proven jen tehdy, když je každé blokující pravidlo proven (rozhodnutí 4)
evidence subjectsledovaný ledger, přes index subjektů (rozhodnutí 9)pracovní strom, nebo --presentedloká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áznamyjako výše; pokrytí je aktuální jen tak, jak říká rozhodnutí 12lokální index běhů; --from
Kontroly: scripts/evidence-check, evidence show --checksledovaná knihastrom v checkoutunikdy
Cockpitsledovaná kniha prostřednictvím indexu subjektůpracovní stromsamostatný, poradní sloupec lokálního běhu, přes monotónní pravidlo
Web: evidence publish, spuštěno v buildovém checkoutu Pkniha commitnutá v Pbuild.json.commit, omezeno build.json.dirtyzá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ěhupublikovaný commit: current vyžaduje, aby se commit běhu rovnal jemu, a běh předka je stalemanifest 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 8sledovaný 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 korpusupracovní stromneč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ý commitpouze 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.jsonrazítkuje E a T, které jeho běh změřil (rozhodnutí 6); do té doby HEAD a vlastní strom záznamníkuzapíš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 publikaciStav
1build.json.dirty není falsedirty
2přečtený záznam běhu, vlastní P nebo předka, omezí alespoň jeden verdikt ukázaný přes monotónní pravidlostale
3Záznam běhu P se čte a každý strom, který nese, byl změřen jako čistýcurrent
4Vlastní záznam běhu P se nečte a CI běh P neskončilpending
5cokoli 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 Punknown, 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 dirty a 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 stav dirty, stale, když záznam omezil verdikt, a jinak pending nebo unknown, 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 jako stale jen proto, že tam je přepis sám přepisem předka; tato tabulka toto pravidlo nahradí, až prozatímní část skončí (rozhodnutí 1).
  • pending je 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ínkaStav
1žádný testno_test
2cestu neřídí žádný runnerunrunnable
3nic nezaznamenánonot_run
4přeskočitnot_run, s důvodem
5selhání, timeout nebo chybafailing
6projde; git nemůže porovnatstale
7pass; E není obsaženostale
8pass; contained; the test's digest moved; no input changedstale
9prošlo; obsaženo; deklarovaný vstup se změnilstale
10pass; contained; changed' prázdné; zaznamenaný strom čistý; prezentovaný strom čistýproven
11jako řádek 10, ale zaznamenaný strom je špinavý nebo neznámýinputs_unchanged
12jako řádek 10, ale předložený strom je špinavý nebo neznámýinputs_unchanged
13pass; contained; changed' non-empty; inputs known and none changedinputs_unchanged
14pass; obsaženo; changed' neprázdné; trasa nejmenuje žádné vstupystale

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.commit a build.json.dirty omezuje 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_sha vedle. 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:

  • failing pokud 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:

RuleStateProofStateNese důkazProč
proven, inputs_unchanged, stale, failing, not_run, unrunnablestejné slovoano (unrunnable jen když to posoudilo samo pravidlo)totožný význam
gatednot_runanokontrola odmítá porušení, ale žádný zaznamenaný běh nedokazuje chování
reviewedno_testnepravidlo deklaruje, že ho nic spustitelného nevyjadřuje
unprovenno_testanoblokující pravidlo, které nic nejmenuje, je vada a musí oslabit svůj subjekt
danglingunrunnableanopojmenovaný 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 generate zapisuje index jako site/data/registry/evidence-subjects.json do adresáře site-data spustitelného souboru. Nikdy nezapisuje do site/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 --check zůstává stabilní.
  • Web se k němu jen připojuje: scripts/generate-site-data spojuje 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á: tests z commands.json v scripts/generate-site-data, čtení hlavičky lib/commands.sh a scripts/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 ci nepotřebuje job evidence: 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.
  • proven na 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í z not_run na inputs_unchanged (řádek 13) nebo stale (řádky 9 a 14), ne na proven. Očekávání ADR 0080, že záznam přesouvá tvrzení na proven, 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_current a 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_run s důvodem místo failing a 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 proven méně často: korpus, jehož blokující pravidla jsou pouze inputs_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 plan odvozuje, 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-check rozhoduje 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 current o stromu, za který běh neručil.

Anticíle

AnticílMechanismus
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ělrozhodnutí 6
záznam běhu publikovaný jako verdiktdodatek 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 koncezastavení rozhodnutí 1 na pokrytém commitu
merge zanechaný nezaznamenaný za commitem jen s ledgeremrozhodnutí 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ý řádekpublikační tabulka rozhodnutí 3 s první shodou
plocha zelenější než ledgermonotó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ětuodmí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ÚkolBranchCo dodává
ZI1945feature/evidence-subject-adrtento záznam, milník a úkoly
TI1946feature/verdicts-are-status-wordsslova verdiktu vedená jako stavové tokeny (rozhodnutí 13)
DI1947feature/every-feature-reaches-a-testkaždý případ užití vlastní nějaká funkce a funkce Cockpit a nasazení dosahují testu
A1I1948feature/evidence-is-judged-at-the-presented-revisionfunkce aktuálnosti, předložená revize, zahrnutí a agregace (rozhodnutí 4, 5, 7 a 8)
S577I1949fix/the-ci-evidence-is-recorded-cleanPR #577's report derived before recording, its producers' trees measured, and the interim current rule (decision 1)
RI1950feature/evidence-output-is-redacted-oncejediný redaktor (rozhodnutí 14)
A2I1951feature/evidence-runs-are-typedzáznamy běhů, měřený původ, záznamy pokrytí a pravidlo počtu crate (rozhodnutí 2, 6 a 12)
SII1952feature/evidence-subjects-are-derivedindex subjektů (rozhodnutí 9 až 11)
CI1953feature/evidence-answers-by-subjectpříkazy subject, coverage a run
BI1954feature/every-runner-reaches-the-ledgerzáznamová větev, její zastavení na pokrytém commitu a změřená zpráva každého runneru (rozhodnutí 1 a 16)
PI1955feature/evidence-publication-is-a-projectionpovolená publikace a její stavy podle prvního shodujícího se pravidla (rozhodnutí 3 a 14)
EI1956feature/cockpit-shows-evidencepohled na důkazy v Cockpitu
A3I1957feature/every-test-line-is-readvýsledky po jednotlivých testech a lokální index běhů
F2aI1958feature/evidence-has-routesjedna routa důkazů na subjekt a panely spojené se svým subjektem
F1I1959feature/evidence-publication-is-typedpublikace webu přes evidence publish, svázaná se svým buildem a držená na gh-pages
F2bI1960feature/every-widget-names-its-proofodznak na každém widgetu a testovací rozměry zprávy o dodávce
GI1961feature/deploy-verifies-evidence-routeskontrola nasazení tras publikovaných důkazů
HI1962feature/evidence-check-reads-widgetskontroly nad nálezy subjektů a widgety (rozhodnutí 10)
II1963feature/evidence-is-tested-end-to-endpřípady napříč všemi povrchy
JI1964feature/evidence-is-documentedodkaz na důkazy, držený ke stromu
PFI1965feature/the-preflight-reads-the-one-verdictvstupní 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-evidence pak odmítne publikaci, jejíž report stále počítá více tvrzení not run, než deklaruje .ai/repo/evidence/published-not-run.txt (pravidlo project.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á.

Odkud to pochází

kanonický soubor
.ai/repo/adrs/0087-evidence-is-indexed-by-subject-and-judged-at-the-presented-revision.md
identity
adr-0087
dostupné také jako
Zdroj MCP majordomus://adr/adr-0087 · majordomus entity show adr/adr-0087 · GET /api/v1/entity?uri=majordomus://adr/adr-0087
v Cockpitu
/cockpit/objects/adr/adr-0087

Tato stránka je generována z výše uvedeného souboru pomocí scripts/generate-site-data; úprava stránky nic nemění, úprava souboru změní všechna rozhraní. Výše uvedené vztahy jsou hrany docs/generated/graph.json, které spustitelný program zapisuje ze stejného indexu.

Prohledává názvy a popisy všech stránek, které tento web publikuje.