test-evidence — Každé ověřitelné tvrzení a widget se řeší na testovací důkaz vázaný na revizi, na každém rozhraní
Důkazy jsou indexovány podle subjektu a posuzovány v prezentované revizi, jak zaznamenává ADR 0087. Každé tvrzení, pravidlo, funkce, příkaz, schopnost, nástroj MCP a případ užití je subjektem jednoho odvozeného indexu a každý widget, který tvrdí chování, jeden pojmenovává. Každý povrch čte svůj verdikt jen ze sledovaného ledgeru, jednou funkcí čerstvosti a jednou agregací, v revizi, kterou prezentuje: CLI, HTTP a MCP v pracovním stromě nebo checkoutovaném commitu, web v commitu, ze kterého byl sestaven. Běh na trunku se do ledgeru dostane přes revidovaný záznamový pull request a doplňkový záznam (záznam běhu, pokrytí, lokální řádek) může verdikt jen oslabit, a když to udělá, pojmenuje se. Verified se vykresluje jen pro jediný dokázaný řádek tabulky čerstvosti, na každém povrchu.
AKTIVNÍ 16 of 32 issues done
- připraveno
- 4
- blokováno
- 12
- aktivní
- 0
- verify
- 0
- hotovo
- 16
- zrušeno
- 0
Problém
Tvrzení se s testy vážou cestou a pouze `majordomus evidence show` se ptá, zda je tvrzení prokázáno, vždy v pracovním stromu toho, kdo ho spouští. Web se nemůže na tuto otázku zeptat o commitu, ze kterého byl sestaven, a žádný widget na něm nepojmenovává předmět, který by prokázal, co zobrazuje: kde stránka říká ověřeno, slovo bylo vloženo ručně. CI spouští sadu i testy cratů při každém merge a nic z toho neukládá do záznamu. Test, který odmítl běžet, se čte jako `failing`, zatímco případ, který odmítne ukončením s nulou, se zaznamená jako úspěšný. Modul pravidel drží druhou kopii odvození čerstvosti, vstupní preflight navržený v PR #578 počítá běh za aktuální vlastním filtrem bez testu zahrnutí a ADR 0068 a ADR 0080 se rozcházejí v tom, kam patří důkazy z CI. Každé rozhraní, které chce říct ověřeno, to odvozuje jinak, nebo vůbec.
Výsledek
Důkazy jsou indexovány podle subjektu a posuzovány v prezentované revizi, jak zaznamenává ADR 0087. Každé tvrzení, pravidlo, funkce, příkaz, schopnost, nástroj MCP a případ užití je subjektem jednoho odvozeného indexu a každý widget, který tvrdí chování, jeden pojmenovává. Každý povrch čte svůj verdikt jen ze sledovaného ledgeru, jednou funkcí čerstvosti a jednou agregací, v revizi, kterou prezentuje: CLI, HTTP a MCP v pracovním stromě nebo checkoutovaném commitu, web v commitu, ze kterého byl sestaven. Běh na trunku se do ledgeru dostane přes revidovaný záznamový pull request a doplňkový záznam (záznam běhu, pokrytí, lokální řádek) může verdikt jen oslabit, a když to udělá, pojmenuje se. Verified se vykresluje jen pro jediný dokázaný řádek tabulky čerstvosti, na každém povrchu.
Aktuální stav
Na masteru na 5a0770c437 drží sledovaná kniha jen lokální záznamy a kolik tvrzení dosáhlo každého stavu, vypíše `majordomus evidence show --format json | jq .totals`. Neexistuje žádný index subjektů; spojení příkaz-test se odvozuje v shellu víckrát (`scripts/generate-site-data`, `lib/commands.sh`, `scripts/ci/command-furnished`). `rules/mod.rs` nese vlastní `changed_since` a vlastní mapování stavů vedle `evidence/mod.rs`. Rozhodnutí, na nichž tento milník staví, jsou navržená a nepřistála: ADR 0068 na PR #577 (CI evidence jako artefakt a publikovaný dataset), ADR 0080 na PR #629 (zaznamenávací větev a slovo skip), ADR 0071 na PR #600 (dimenze doručení se soukromou implementací obsažení); PR #597 přidává verdikt korpusu pravidel a PR #578 vstupní preflight.
Cílový stav
Čtenář jakékoli stránky webu následuje odznak widgetu k důkazům jeho subjektu a vidí verdikt na commitu, z něhož byla stránka sestavena, s během, který ho vytvořil, a každým záznamem, který ho oslabil. `majordomus evidence subject <key>` odpovídá na stejnou otázku z terminálu, přes HTTP i přes MCP, a Cockpit ukazuje stejný verdikt. Po merge na master následuje zaznamenávací pull request, který přistane provedení svého běhu v knize. Tvrzení pak na commitu trunku, od zaznamenaného odděleném jen commity pouze s knihou, čte `proven`, a tam, kde mezitím přistály jiné merge, `inputs_unchanged` nebo `stale` s uvedením, co se změnilo; zda proces učiní první pravidlem, je rozhodnutí vlastníka (ADR 0087, Consequences). Přeskočený test se čte `not_run` s důvodem a žádný povrch nikde nevypadá zelenější než kniha pro revizi, kterou prezentuje.
Rozsah
- .ai/repo/adrs
- .ai/repo/project
- .ai/repo/evidence
- .ai/repo/evidence-baseline.txt
- .ai/repo/features/evidence.md
- .ai/repo/ci
- apps/majordomus-cli/src/evidence
- apps/majordomus-cli/src/rules
- apps/majordomus-cli/src/git
- apps/majordomus-cli/src/capability/builtin/evidence.rs
- apps/majordomus-cli/src/commands/evidence.rs
- apps/majordomus-cli/src/cockpit
- apps/majordomus-cli/src/environment/preflight.rs
- apps/majordomus-cli/src/redaction.rs
- .github/workflows
- scripts/ci
- scripts/pages
- scripts/generate-site-data
- scripts/evidence-check
- share/design/tokens.yaml
- site/templates
- site/data/registry/evidence-subjects.json
- docs/EVIDENCE.md
- docs/CLAIMS.yaml
- docs/claims
- test/cases
Mimo rozsah
- Přijetí ADR 0041, 0068, 0080 nebo 0087; přijetí je úkon vlastníka
- Zvyšování verze; pull request, který posouvá veřejný povrch, zdědí verzi, která už je na masteru, jejím mergem
- Posuzování jiného commitu než toho, který je právě checkoutnutý, nebo commitu, ze kterého byl web sestaven
- šablony zdrojů MCP na předmět; k důkazům se přistupuje voláním nástrojů
- Nechat požadovanou kontrolu `ci` záviset na úloze důkazů
- Nová shellová automatizace (ADR 0069)
- Crate pro regulární výrazy nebo jakákoli jiná nová závislost pro redaktor
- Označení důkazů případu užití commitem v commitovaném katalogu
Kritéria přijetí
- Model: jedna funkce čerstvosti, jedna předložená revize, jedno ohraničení a jedna agregace posuzují každý verdikt, přeskočení se čte jako `not_run` a jeden odvozený index jmenuje každý subjekt; dokázáno testy test/cases/502_evidence_is_judged_at_the_presented_revision.sh, test/cases/507_evidence_subjects_are_derived.sh a test/cases/501_verdict_words_are_status_words.sh
- Producent: každý zaznamenaný běh nese commit a strom, které měřil, binárka cratu, která nic nespustila, je skip, report z CI je verdikt sledované knihy odvozený před zaznamenáním běhu a běh na trunku se do knihy dostane jedním zaznamenávacím pull requestem, zastaví se na commitu, který kniha pokrývá, a zaznamená commit jen s knihou přes nezaznamenaný merge; dokazují to test/cases/505_a_recording_carries_what_its_run_measured.sh, test/cases/506_a_crate_binary_that_ran_nothing_is_not_a_pass.sh, test/cases/357_ci_records_evidence.sh, test/cases/510_ci_evidence_reaches_the_ledger_through_a_recording_branch.sh a test/cases/511_every_runner_report_carries_its_revision_and_reason.sh
- Povrchy: CLI, HTTP, MCP, Cockpit a vstupní preflight odpovídají podle předmětu z jediné autority a doplňkový záznam jen oslabuje; dokázáno test/cases/508_evidence_answers_by_subject.sh, test/cases/509_supplementary_records_only_weaken.sh, test/cases/513_cockpit_shows_evidence.sh, test/cases/514_every_test_line_is_read.sh, test/cases/515_a_local_run_stays_local.sh a test/cases/529_the_preflight_reads_the_one_verdict.sh
- Web: každý widget jmenuje svůj subjekt, každý subjekt má trasu důkazů, publikace je vázána na své sestavení a na seznam povolených a publikovaný text je redigován jednou; doloženo test/cases/504_public_text_is_redacted_once.sh, test/cases/512_evidence_publication_is_a_projection.sh, test/cases/516_evidence_routes_render_from_the_subject_index.sh, test/cases/517_a_panel_subject_is_joined_from_its_route.sh, test/cases/518_evidence_publication_is_bound_to_its_build.sh a test/cases/520_every_widget_names_its_proof.sh
- Politika: nálezy subjektů odmítají, základna důkazů se přepisuje v téže změně a validátor čte každý widget; dokázáno testy test/cases/522_evidence_check_reads_widgets.sh a test/cases/523_evidence_rules_are_gated.sh
- Testy: žádná plocha není zelenější než účetní kniha, odznak funguje v prohlížeči na šířce telefonu, zfalšované důkazy se odmítnou a pokrytí se ukazuje s jeho commitem; dokázáno testy test/cases/524_no_surface_is_greener_than_the_ledger.sh, test/cases/525_an_evidence_badge_works_in_a_browser.sh, test/cases/526_tampered_evidence_is_refused.sh a test/cases/527_coverage_is_shown_with_its_commit.sh
- Dokumentace: reference důkazů jmenuje, co kód deklaruje, a je držena ke stromu; dokázáno testem test/cases/528_the_evidence_reference_is_held_to_the_tree.sh
- Deploy: deploy ověřuje routy s důkazy, které publikuje, a důkazy přežijí vypršení artefaktů na gh-pages; dokázáno test/cases/521_deploy_verifies_evidence_routes.sh, test/cases/519_evidence_survives_artifact_expiry.sh a živou stránkou https://majordomus.dev/evidence/
Validace
- bin/majordomus adr check
- bin/majordomus plan validate
- bin/majordomus-cli evidence show --check
- scripts/evidence-check
- scripts/ci/claim-proof-check --strict
- bash test/run.sh
- cargo test --workspace --all-features
- majordomus generate --check
- scripts/ci/pages-check
Požadované důkazy
- one_authority_one_freshness
- subjects_derived_once
- runs_measured_where_they_ran
- no_surface_greener_than_the_ledger
- every_widget_names_its_subject
- publication_bound_to_its_build
Rizika
- Dokud nezačne běžet záznamová větev, sledovaný ledger drží jen lokální řádky a web zobrazuje většinou `not_run`. To je pravdivý stav; odznaky z toho důvodu následují zapojení CI.
- Rozhodnutí, na kterých tento milník staví, jsou navržena v otevřených pull requestech (#577, #578, #597, #600, #629). Slice naskládaný na jedno z nich na něj čeká a pořadí přistání určuje vlastník.
- `proven` na revizi trunku potřebuje klidný trunk: zaznamenání stojí běh celé sady a pak povinné kontroly a merge kódu, který v tom okně přistane, nechá tvrzení `inputs_unchanged` nebo `stale` na commitu přistání. Dokud vlastník nerozhodne, zda proces činí `proven` dosažitelným, nebo zda se `required_tests_current` váže na dosažitelný stav, na rušném trunku dimenze dodávky zřídka projde a web zřídka vykreslí ověřeno (ADR 0087, Důsledky).
- Zaznamenávací pull request potřebuje token, jehož události spustí požadovaný workflow. Dokud se vlastník nerozhodne mezi spouštěním validate.yml a tokenem App, nemůže část s napojením CI přistát.
- Každé přistání způsobí, že pull requesty otevřených řezů kolidují na odvozených souborech; každý se obnovuje merge masteru s odvozeným ovladačem merge, nikdy rebase.
Úkoly
Každý z nich je prováděcí kontrakt s vlastními kritérii přijetí, validačním příkazem a požadovanými důkazy. Sloupec wave je vrstva grafu závislostí, v níž úkol leží.
| issue | status | vlna | závisí na | název |
|---|---|---|---|---|
| I1945 | HOTOVO | 0 | — | Rozhodnutí o testovacích důkazech a jeho plán jsou zaznamenány |
| I1946 | HOTOVO | 0 | — | Slova verdiktu jsou stavová slova designového systému |
| I1947 | HOTOVO | 0 | — | Každá funkce dosáhne k testu a každý případ užití má funkci |
| I1948 | HOTOVO | 0 | — | Důkazy se posuzují na předložené revizi jednou funkcí čerstvosti |
| I1949 | HOTOVO | 0 | — | Důkazy z CI se zaznamenávají čisté a jejich report je verdiktem sledovaného ledgeru |
| I1950 | HOTOVO | 0 | — | Text, který běh vytiskl, se redaktuje jednou sadou pravidel |
| I1951 | PŘIPRAVENO | 1 | I1948, I1949 | Běhy důkazů jsou typované a záznam nese to, co jeho běh změřil |
| I1952 | HOTOVO | 1 | I1948, I1947 | Subjekty důkazů se odvozují jednou, v Rustu |
| I1953 | BLOKOVÁNO | 2 | I1952, I1951 | Důkazy odpovídají podle subjektu, na každém povrchu |
| I1954 | BLOKOVÁNO | 2 | I1951 | Každý runner se dostane k ledgeru přes zaznamenávací větev |
| I1955 | BLOKOVÁNO | 3 | I1953, I1950 | Publikace důkazů je projekce omezená povolenou množinou |
| I1956 | BLOKOVÁNO | 3 | I1953 | Cockpit ukazuje důkazy podle subjektu |
| I1957 | BLOKOVÁNO | 4 | I1955 | Čte se každý řádek testu a lokální běh zůstává lokální |
| I1958 | BLOKOVÁNO | 4 | I1952, I1946, I1955 | Důkazy mají jednu cestu na subjekt a každý panel je s nimi svázán |
| I1959 | BLOKOVÁNO | 4 | I1955, I1954 | Publikace důkazů je typovaná, svázaná se svým buildem a uchovaná na gh-pages |
| I1960 | BLOKOVÁNO | 5 | I1958, I1959, I1946 | Každý widget jmenuje svůj důkaz |
| I1961 | BLOKOVÁNO | 5 | I1959, I1958 | Nasazení ověří cesty k důkazům, které publikuje |
| I1962 | BLOKOVÁNO | 6 | I1960, I1953, I1952 | Kontroly důkazů čtou nálezy subjektů a widgety |
| I1963 | BLOKOVÁNO | 6 | I1960, I1956, I1959 | Důkazy jsou testovány od začátku do konce |
| I1964 | BLOKOVÁNO | 7 | I1962, I1963 | Reference důkazů je zdokumentována a držena v souladu se stromem |
| I1965 | PŘIPRAVENO | 1 | I1948 | Vstupní preflight čte jediný verdikt |
| I2282 | HOTOVO | 0 | — | Odeslaný verdikt pull requestu se záznamem nesplňuje ochranu větve |
| I2296 | HOTOVO | 0 | — | Executor znovu otevře pull request se záznamem, pro který nebyl spuštěn žádný běh |
| I2298 | HOTOVO | 0 | — | Pull request navázaný na ten, který přistál, se zmerguje na verdikt, který jeho head už má |
| I2303 | HOTOVO | 0 | — | Release publikuje svá metadata na web dřív, než přistane jeho záznam, a web se nikdy nevrací o release zpět |
| I2396 | HOTOVO | 0 | — | Kritická cesta CI z 2026-10-10 je změřena, zaznamenána a vysvětlena dřív, než se cokoli změní |
| I2416 | HOTOVO | 0 | — | Verdikt ci žádá od každé vybrané kontroly stvrzenku a kontrola, jejíž krok nikdy neběžel, je červená |
| I2786 | HOTOVO | 0 | — | Publikované UI čte důkazy zaznamenané CI a publikace, která by ukázala testy jako neběžící, se odmítne |
| I2795 | HOTOVO | 0 | — | Zaznamenaný běh trunku se dostane do sledovaného ledgeru důkazů a baseline se k němu utáhne |
| I2845 | PŘIPRAVENO | 0 | — | a run cancelled midway is not the publication's evidence while a complete one is near |
| I2853 | HOTOVO | 0 | — | nasazení Pages na čerstvém masteru není odmítnuto kvůli tvrzením novějším, než je ledger, který čte |
| I3013 | PŘIPRAVENO | 0 | — | The evidence job runs only when a planned lane ran tests, so a records-only pull request is not red |
Graf
flowchart LR
I1945["I1945<br/>The test-evidence decision and its plan are recorded"]:::done
I1946["I1946<br/>The verdict words are status words of the design system"]:::done
I1947["I1947<br/>Every feature reaches a test, and every use case has a feature"]:::done
I1948["I1948<br/>Evidence is judged at the presented revision, by one freshness function"]:::done
I1949["I1949<br/>CI evidence is recorded clean, and its report is the tracked ledger's verdict"]:::done
I1950["I1950<br/>Text a run printed is redacted by one rule set"]:::done
I1951["I1951<br/>Evidence runs are typed, and a recording carries what its run measured"]:::ready
I1952["I1952<br/>Evidence subjects are derived once, in Rust"]:::done
I1953["I1953<br/>Evidence answers by subject, on every surface"]:::blocked
I1954["I1954<br/>Every runner reaches the ledger, through the recording branch"]:::blocked
I1955["I1955<br/>The evidence publication is an allow-listed projection"]:::blocked
I1956["I1956<br/>The Cockpit shows evidence by subject"]:::blocked
I1957["I1957<br/>Every test line is read, and a local run stays local"]:::blocked
I1958["I1958<br/>Evidence has one route per subject, and every panel is joined to its subject"]:::blocked
I1959["I1959<br/>The evidence publication is typed, bound to its build, and kept on gh-pages"]:::blocked
I1960["I1960<br/>Every widget names its proof"]:::blocked
I1961["I1961<br/>A deploy verifies the evidence routes it publishes"]:::blocked
I1962["I1962<br/>The evidence gates read subject findings and widgets"]:::blocked
I1963["I1963<br/>Evidence is tested end to end"]:::blocked
I1964["I1964<br/>The evidence reference is documented and held to the tree"]:::blocked
I1965["I1965<br/>The entry preflight reads the one verdict"]:::ready
I2282["I2282<br/>The record pull request's dispatched verdict does not satisfy branch protection"]:::done
I2296["I2296<br/>The executor reopens a record pull request no run was started for"]:::done
I2298["I2298<br/>A pull request stacked on one that landed merges on the verdict its head already has"]:::done
I2303["I2303<br/>A release publishes its metadata to the site before its record lands, and the site never goes back a release"]:::done
I2396["I2396<br/>The CI critical path of 2026-10-10 is measured, recorded, and explained before anything is changed"]:::done
I2416["I2416<br/>The ci verdict asks every selected gate for a receipt, and a gate whose step never ran is red"]:::done
I2786["I2786<br/>The published UI reads the evidence CI recorded, and a publication that would show tests as not run is refused"]:::done
I2795["I2795<br/>The trunk's recorded run reaches the tracked evidence ledger, and the baseline is tightened to it"]:::done
I2845["I2845<br/>a run cancelled midway is not the publication's evidence while a complete one is near"]:::ready
I2853["I2853<br/>a Pages deploy on a fresh master is not refused for claims newer than the ledger it reads"]:::done
I3013["I3013<br/>The evidence job runs only when a planned lane ran tests, so a records-only pull request is not red"]:::ready
I1946 --> I1958
I1946 --> I1960
I1947 --> I1952
I1948 --> I1951
I1948 --> I1952
I1948 --> I1965
I1949 --> I1951
I1950 --> I1955
I1951 --> I1953
I1951 --> I1954
I1952 --> I1953
I1952 --> I1958
I1952 --> I1962
I1953 --> I1955
I1953 --> I1956
I1953 --> I1962
I1954 --> I1959
I1955 --> I1957
I1955 --> I1958
I1955 --> I1959
I1956 --> I1963
I1958 --> I1960
I1958 --> I1961
I1959 --> I1960
I1959 --> I1961
I1959 --> I1963
I1960 --> I1962
I1960 --> I1963
I1962 --> I1964
I1963 --> I1964
classDef done stroke:#16a34a,fill:#dcfce7,color:#14532d,stroke-width:2px
classDef active stroke:#2563eb,fill:#eff6ff,color:#1e3a8a,stroke-width:2px
classDef verify stroke:#7c3aed,fill:#f5f3ff,color:#4c1d95,stroke-width:2px
classDef ready stroke:#0891b2,fill:#ecfeff,color:#164e63,stroke-width:2px
classDef planned stroke:#0891b2,fill:#ecfeff,color:#164e63,stroke-width:2px
classDef blocked stroke:#b45309,fill:#fffbeb,color:#78350f,stroke-width:2px
classDef cancelled stroke:#6b7280,fill:#f9fafb,color:#374151,stroke-width:2px
classDef superseded stroke:#6b7280,fill:#f9fafb,color:#374151,stroke-width:2pxOdkazuje se z tohoto diagramu (32)
- I1945 Rozhodnutí o testovacích důkazech a jeho plán jsou zaznamenány
- I1946 Slova verdiktů jsou stavová slova designového systému
- I1947 Každá funkce dosáhne k testu a každý případ užití má funkci
- I1948 Důkazy se posuzují na předložené revizi jednou funkcí aktuálnosti
- I1949 Důkazy z CI se zaznamenávají čistě a jejich report je verdiktem sledované knihy
- I1950 Text, který běh vypsal, se redaguje jednou sadou pravidel
- I1951 Běhy důkazů jsou typované a záznam nese, co jeho běh změřil
- I1952 Subjekty důkazů se odvozují jednou, v Rustu
- I1953 Důkazy odpovídají podle předmětu na každém povrchu
- I1954 Každý runner se dostane do knihy, přes zaznamenávací branch
- I1955 Publikace důkazů je projekce ze seznamu povolených
- I1956 Cockpit zobrazuje důkazy podle předmětu
- I1957 Každý řádek testu se čte a lokální běh zůstává lokální
- I1958 Důkazy mají jednu cestu na předmět a každý panel je napojen na svůj předmět
- I1959 Publikace důkazů je typovaná, vázaná na svůj build a drží se na gh-pages
- I1960 Každý widget jmenuje svůj důkaz
- I1961 Deploy ověřuje trasy důkazů, které publikuje
- I1962 Kontroly důkazů čtou nálezy a widgety podle předmětu
- I1963 Důkazy jsou testovány od začátku do konce
- I1964 Reference důkazů je zdokumentovaná a drží se stromu
- I1965 Vstupní preflight čte jediný verdikt
- I2282 Odeslaný verdikt pull requestu se záznamem nesplňuje ochranu větve
- I2296 Executor znovu otevře zaznamenávací pull request, pro který nebyl spuštěn žádný běh
- I2298 Pull request navršený na jiný, který přistál, se merguje na verdikt, který jeho head už má
- I2303 Release publikuje svá metadata na web dřív, než přistane jeho záznam, a web se nikdy nevrátí o release zpět
- I2396 Kritická cesta CI z 2026-10-10 se změří, zaznamená a vysvětlí, než se cokoli změní
- I2416 Verdikt ci žádá o doklad každou vybranou kontrolu a kontrola, jejíž krok nikdy neproběhl, je červená
- I2786 Publikované UI čte důkazy, které zaznamenalo CI, a publikace, která by ukázala testy jako neprovedené, se odmítne
- I2795 Zaznamenaný běh trunku se dostane do sledovaného ledgeru důkazů a základní linie se na něj zpřísní
- I2845 a run cancelled midway is not the publication's evidence while a complete one is near
- I2853 nasazení Pages na čerstvém masteru není odmítnuto kvůli tvrzením novějším, než je ledger, který čte
- I3013 The evidence job runs only when a planned lane ran tests, so a records-only pull request is not red
Kanonický záznam: .ai/repo/project/milestones/test-evidence.yaml. Přečtěte ho zpět pomocí majordomus plan show test-evidence.