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.

HTTP API: evidence

Co skutečně běželo, proti kterému commitu a zda to ještě něco dokazuje. Matice tvrzení váže tvrzení k testu cestou; ledger pod .ai/repo/evidence zaznamenává poslední provedení každého testu s commitem, stavem stromu, otiskem vlastního zdroje testu, časem, původem a příkazem, který jej spustí znovu. Spojení obou odpovídá, za každé tvrzení, zda je repozitář může poctivě nazvat prokázaným — a rozlišuje běh zaznamenaný proti tomuto samému commitu od takového, jehož vstupy se od té doby prostě nezměnily, protože splynutí těchto dvou je způsob, jak zelený odznak přestane něco znamenat.

Vykresleno z docs/generated/openapi.json, který spustitelný soubor generuje ze svého registru schopností a CI jej odmítne, je-li zastaralý. Surový dokument je na /openapi.json; běžící server servíruje stejný dokument na vlastní /openapi.json a Swagger UI na /swagger.

evidence

Co skutečně běželo, proti kterému commitu a zda to ještě něco dokazuje. Matice tvrzení váže tvrzení k testu cestou; ledger pod .ai/repo/evidence zaznamenává poslední provedení každého testu s commitem, stavem stromu, otiskem vlastního zdroje testu, časem, původem a příkazem, který jej spustí znovu. Spojení obou odpovídá, za každé tvrzení, zda je repozitář může poctivě nazvat prokázaným — a rozlišuje běh zaznamenaný proti tomuto samému commitu od takového, jehož vstupy se od té doby prostě nezměnily, protože splynutí těchto dvou je způsob, jak zelený odznak přestane něco znamenat.

GET /api/v1/evidence evidence.report

Každé tvrzení proti zaznamenaným důkazům

Celá matice tvrzení spojená s ledgerem a posouzená v prezentované revizi: ve výchozím stavu pracovní strom, nebo checkoutovaný commit tak, jak byl commitnut, čtený z ledgeru, který ten commit drží. U každého tvrzení: stav důkazu, věta vysvětlující, jak byl stav odvozen, proč, když to stav sám neříká, provedení za ním, soubory změněné od něj a příkaz, který ho vytvoří znovu. Běh na commitu, který prezentovaná revize neobsahuje, je zastaralý, test, který odmítl běžet, nebyl spuštěn, a běh, který drží pracovní ledger a ledger prezentovaného commitu ne, může jen zadržet proven. Součty počítají celou matici i když je odpověď filtrovaná a zjištění pojmenovávají každé tvrzení, které deklaruje záruku, již důkazy nepodporují. Drží se po stavu checkoutu, nikdy déle: ledger je soubor, který se mění mimo tento proces, a jeho úprava, úprava testu nebo jakéhokoli sledovaného souboru, nový nesledovaný soubor, commit nebo nový ref je nová odpověď.

  • query
  • behaviorally_verified
  • vyžaduje se měření výkonu
  • cache checkout (max_entries=8)
  • Nástroj MCP majordomus_evidence
  • Zdroj MCP {"name": "evidence", "uri": "majordomus://evidence"}
  • $ evidence show

Parametry dotazu

názevtyppovinnépopispříklady
state ProofState | null ne Pouze tvrzení v tomto stavu důkazu (`proven`, `inputs_unchanged`, `stale`, `failing`, `not_run`, `unrunnable`, `no_test`). Bez hodnoty: každé tvrzení.
status string ne Pouze tvrzení deklarující tento stav (`guaranteed`, `advisory`, `planned`, `rejected`). Bez zadání: každé tvrzení.
findings_only boolean ne Pouze tvrzení, jejichž deklarovaný stav důkazy nepodporují, se zjištěními. Součty stále počítají celou matici, takže filtrovaná odpověď nikdy nezkreslí, kolik z ní bylo prozkoumáno. findings: true
prezentováno string ne Posuzovat v této revizi tak, jak byla commitnuta, místo v pracovním stromu: `HEAD` nebo libovolné jméno checkoutnutého commitu. Musí to být checkoutnutý commit; ledger se čte tak, jak ho commit drží, a běh, který pracovní ledger drží a ledger commitu ne, může jen odepřít `proven`. Bez zadání: pracovní strom.
presented_tree EvidenceTreeState | null ne Co volající ví o stromu předloženého commitu (`clean`, `dirty`, `unknown`). Může změřený stav jen oslabit, nikdy neprohlásit čistý strom nad špinavým checkoutem, a bez `presented` neznamená nic.

Vyzkoušejte

Port je ten, který server zalogoval; 8741 je ten, o který žádá jako první. Hodnoty jsou první příklad operace.

curl -s "http://127.0.0.1:8741/api/v1/evidence?findings_only=true"

Testováno v apps/majordomus-cli/tests/http_serve.rs, který přehrává routu s těmito hodnotami proti serveru na skutečném socketu.

Odpovědi

statustělovýznam
200 EvidenceReport Každé tvrzení vůči zaznamenanému důkazu: výsledek.
400 ErrorBody invalid_input: Vstup neodpovídá schématu: parametr špatného typu, neznámý parametr nebo hodnota, kterou schopnost odmítne.
404 ErrorBody not_found: Vstup pojmenovává něco, co repozitář nemá.
500 ErrorBody internal: Schopnost selhala z vlastního důvodu; zpráva ho pojmenovává.
výchozí ErrorBody Jakékoli jiné selhání, které transport hlásí: 405 method_not_allowed pro jinou metodu na této cestě, 400 invalid_input pro tělo, které není objektem JSON.
GET /api/v1/evidence/claim evidence.claim

Co toto tvrzení dokládá

Jedno tvrzení se stavem jeho důkazu, za ním stojící provedení — výsledek, doba trvání, commit, stav stromu, digest, čas a původ — příkaz, který ho reprodukuje, a další tvrzení, která dokládá tentýž test. Tvrzení, které matice nedeklaruje, je not-found, nikoli prázdná odpověď, protože překlep, který by se četl jako „toto tvrzení nemá důkazy“, je jediná odpověď, kterou tato schopnost nesmí dát.

  • query
  • behaviorally_verified
  • vyžaduje se měření výkonu
  • cache checkoutu (max_entries=32)
  • Nástroj MCP majordomus_evidence_claim
  • $ evidence claim

Parametry dotazu

názevtyppovinnépopispříklady
claim string ano Id tvrzení tak, jak ho píše `docs/CLAIMS.yaml`. first-claim: "a-candidate-is-routed-by-what-it-is-about"

Vyzkoušejte

Port je ten, který server zalogoval; 8741 je ten, o který žádá jako první. Hodnoty jsou první příklad operace.

curl -s "http://127.0.0.1:8741/api/v1/evidence/claim?claim=a-candidate-is-routed-by-what-it-is-about"

Testováno v apps/majordomus-cli/tests/http_serve.rs, který přehrává routu s těmito hodnotami proti serveru na skutečném socketu.

Odpovědi

statustělovýznam
200 ClaimEvidence Co toto tvrzení dokazuje: výsledek.
400 ErrorBody invalid_input: Vstup neodpovídá schématu: parametr špatného typu, neznámý parametr nebo hodnota, kterou schopnost odmítne.
404 ErrorBody not_found: Vstup pojmenovává něco, co repozitář nemá.
500 ErrorBody internal: Schopnost selhala z vlastního důvodu; zpráva ho pojmenovává.
výchozí ErrorBody Jakékoli jiné selhání, které transport hlásí: 405 method_not_allowed pro jinou metodu na této cestě, 400 invalid_input pro tělo, které není objektem JSON.
GET /api/v1/evidence/test evidence.test

Co tento test dokazuje

Jeden test — podle identity nebo podle cesty, kterou jej tvrzení jmenuje — s jeho posledním provedením, zda jeho zdroj stále dává otisk, který toto provedení zaznamenalo, příkazem, který jej spustí znovu, a každým tvrzením, které jej jmenuje. Toto je opak evidence.claim a čte stejné odvození, takže se oba směry nemohou rozcházet.

  • query
  • behaviorally_verified
  • vyžaduje se měření výkonu
  • cache vypnuta
  • nástroj MCP majordomus_evidence_test
  • $ evidence proves

Parametry dotazu

názevtyppovinnépopispříklady
test string ano `suite:84_distribution_model`, `crate:why`, nebo samotná cesta (`test/cases/84_distribution_model.sh`), která se rozliší na stejnou identitu. first-test: "suite:982_a_candidate_is_routed_by_what_it_is_about"

Vyzkoušejte

Port je ten, který server zalogoval; 8741 je ten, o který žádá jako první. Hodnoty jsou první příklad operace.

curl -s "http://127.0.0.1:8741/api/v1/evidence/test?test=suite%3A982_a_candidate_is_routed_by_what_it_is_about"

Testováno v apps/majordomus-cli/tests/http_serve.rs, který přehrává routu s těmito hodnotami proti serveru na skutečném socketu.

Odpovědi

statustělovýznam
200 TestEvidence Co tento test dokazuje: výsledek.
400 ErrorBody invalid_input: Vstup neodpovídá schématu: parametr špatného typu, neznámý parametr nebo hodnota, kterou schopnost odmítne.
404 ErrorBody not_found: Vstup pojmenovává něco, co repozitář nemá.
500 ErrorBody internal: Schopnost selhala z vlastního důvodu; zpráva ho pojmenovává.
výchozí ErrorBody Jakékoli jiné selhání, které transport hlásí: 405 method_not_allowed pro jinou metodu na této cestě, 400 invalid_input pro tělo, které není objektem JSON.

Schémata

Komponenty, které používají jen operace tohoto tagu. Každý řádek je pole daného typu, jeho doc komentář je popis; typ vlastněný jinou stránkou na ni odkazuje.

ClaimEvidence

object
Jedno tvrzení se vším, co o jeho důkazu repozitář může říct, a cesta zpět k testu, který jej nese.

Důkaz je do odpovědi zploštěn, takže klient čte jedno tvrzení, ne obal důkazu kolem něj; provedení a ostatní tvrzení, která tentýž test dokazuje, leží vedle něj.

use majordomus_cli::capability::builtin::evidence::ClaimEvidence;
use majordomus_cli::evidence::ClaimProof;

let proof: ClaimProof = serde_json::from_value(serde_json::json!({
    "id": "evidence-both-directions",
    "claim": "a claim and its test answer for each other",
    "status": "guaranteed",
    "source": null,
    "implementation": null,
    "test_path": "test/cases/84_distribution_model.sh",
    "test": "suite:84_distribution_model",
    "state": "not_run",
    "meaning": "no run of this test has been recorded",
    "execution": null,
    "changed": [],
    "reproduce": "bash test/run.sh 84_distribution_model"
}))
.unwrap();

let answer = ClaimEvidence {
    proof,
    executions: Vec::new(),
    also_proves: vec!["evidence-record-is-not-networked".to_string()],
};
let json = serde_json::to_value(&answer).unwrap();
assert_eq!(json["id"], "evidence-both-directions");
assert!(json.get("proof").is_none(), "the claim is flattened in, not nested");
assert_eq!(json["also_proves"], serde_json::json!(["evidence-record-is-not-networked"]));
// a list even where the ledger keeps one: retention is a decision that may change,
// and a client that read a bare object would break when it did
assert_eq!(json["executions"], serde_json::json!([]));
vlastnosttyppovinnépopis
id string ano Id tvrzení, jak ho zapisuje docs/CLAIMS.yaml.
claim string ano Věta tvrzení.
status string ano Stav, který tvrzení deklaruje: guaranteed, advisory, planned, rejected.
zdroj string | null ne Dokument, který definuje chování.
implementace string | null ne Soubor, který ji implementuje.
test_path string | null ne Cesta, kterou tvrzení jmenuje jako svůj test, doslova.
test string | null ne Stabilní identita testu, pokud ji vlastní runner.
state ProofState → ProofState ano Co o důkazu může repozitář říct.
význam string ano Tento stav v jedné větě.
provádění EvidenceExecution | null → EvidenceExecution ne Provedení, ze kterého se stav odvodil, pokud nějaké je.
změněno array of string ano Soubory, které toto tvrzení jmenuje a které se liší mezi zaznamenaným commitem a pracovním stromem. Prázdné, dokud stav není ProofState::Stale.

Vždy vydáváno, i prázdné: schéma, které tato schopnost publikuje, říká, že klíč tam je, a klient, který musí rozlišit „žádné soubory se nezměnily“ od „server to neřekl“, čte dvě různé odpovědi jako jednu.

detail string | null ne Proč je stav takový, jaký je, jednou větou, když to samotný stav neříká: test, který odmítl běžet, běh na commitu, který předložená revize neobsahuje, strom, který nebyl svým commitem, selhávající běh, který checkout drží necommitnutý.
reprodukovat string | null ne Příkaz, který důkaz vytvoří znovu, když test vlastní runner.
executions pole EvidenceExecution → EvidenceExecution ano Každé provedení, které kniha drží pro test tohoto tvrzení — dnes jedno, poslední, a seznam proto, že uchovávání v knize je rozhodnutí, které se může změnit, a klient čtoucí holý objekt by se při změně rozbil.
also_proves array of string ano Další tvrzení, která dokládá stejný test. Test sdílený dvanácti tvrzeními je test, jehož selhání je dvanáct nálezů, a čtenář jednoho z nich by měl vidět dalších jedenáct bez hledání.

Používá evidence.claim

EvidenceClaimProof

object
Jedno tvrzení spojené se vším, co o něm repozitář skutečně zaznamenal.

Vlastní pole tvrzení se nesou doslova vedle odvozených, aby čtenář, který stavu nevěří, mohl spojení ověřit, místo aby ho přijal.

use majordomus_cli::evidence::{ClaimProof, ProofState};

let proof = ClaimProof {
    id: "scope-integrity".into(),
    claim: "a commit outside the task's scope is refused".into(),
    status: "guaranteed".into(),
    source: Some("docs/SCOPE.md".into()),
    implementation: Some("apps/majordomus-cli/src/scope.rs".into()),
    test_path: Some("test/cases/07_scope.sh".into()),
    test: Some("suite:07_scope".into()),
    state: ProofState::NotRun,
    meaning: ProofState::NotRun.meaning().to_string(),
    execution: None,
    changed: vec![],
    detail: None,
    reproduce: Some("bash test/run.sh 07_scope".into()),
};

let json = serde_json::to_value(&proof).unwrap();
// `changed` is emitted empty rather than omitted: a client must not have to tell
// "no file changed" from "the server did not say"
assert_eq!(json["changed"], serde_json::json!([]));
// an execution that does not exist is absent, not a null standing in for one
assert!(json.get("execution").is_none());
// and so is a detail the state did not need
assert!(json.get("detail").is_none());
assert_eq!(json["meaning"], serde_json::json!(ProofState::NotRun.meaning()));

Příklad

ClaimProof vytváří report; jeho state je celá odpověď a jeho meaning je ta odpověď ve větě, formulovaná jednou pro každý povrch.

use majordomus_cli::evidence::{report, ClaimProof, Ledger};
use majordomus_cli::synthetic::SyntheticRepository;
let repo = SyntheticRepository::small().unwrap();
let ledger = Ledger::load(repo.root()).unwrap();
let r = report(&repo.index().unwrap(), &ledger);
let proofs: &[ClaimProof] = &r.claims;
assert!(proofs.is_empty(), "a synthetic tree declares no claims");
vlastnosttyppovinnépopis
id string ano Id tvrzení, jak ho zapisuje docs/CLAIMS.yaml.
claim string ano Věta tvrzení.
status string ano Stav, který tvrzení deklaruje: guaranteed, advisory, planned, rejected.
zdroj string | null ne Dokument, který definuje chování.
implementace string | null ne Soubor, který ji implementuje.
test_path string | null ne Cesta, kterou tvrzení jmenuje jako svůj test, doslova.
test string | null ne Stabilní identita testu, pokud ji vlastní runner.
state ProofState → ProofState ano Co o důkazu může repozitář říct.
význam string ano Tento stav v jedné větě.
provádění EvidenceExecution | null → EvidenceExecution ne Provedení, ze kterého se stav odvodil, pokud nějaké je.
změněno array of string ano Soubory, které toto tvrzení jmenuje a které se liší mezi zaznamenaným commitem a pracovním stromem. Prázdné, dokud stav není ProofState::Stale.

Vždy vydáváno, i prázdné: schéma, které tato schopnost publikuje, říká, že klíč tam je, a klient, který musí rozlišit „žádné soubory se nezměnily“ od „server to neřekl“, čte dvě různé odpovědi jako jednu.

detail string | null ne Proč je stav takový, jaký je, jednou větou, když to samotný stav neříká: test, který odmítl běžet, běh na commitu, který předložená revize neobsahuje, strom, který nebyl svým commitem, selhávající běh, který checkout drží necommitnutý.
reprodukovat string | null ne Příkaz, který důkaz vytvoří znovu, když test vlastní runner.

Používá EvidenceReport TestEvidence

EvidenceFinding

object
Tvrzení, jehož deklarovaný stav důkazy nepodporují.

Může ho vyprodukovat jen tvrzení guaranteed: ostatní stavy už říkají, že aktuální důkaz není to, co tvrdí. Nález říká, co bylo tvrzeno, co místo toho podporují důkazy a — kde by to rozhodlo spuštění něčeho — co spustit.

use majordomus_cli::evidence::{Finding, ProofState};

let finding = Finding {
    claim: "scope-integrity".into(),
    status: "guaranteed".into(),
    state: ProofState::NotRun,
    reason: "the claim guarantees a behaviour and names a test, and no run of that \
             test has ever been recorded"
        .into(),
    reproduce: Some("bash test/run.sh 07_scope".into()),
};

// the gap is the finding: what the matrix declares against what the ledger holds
assert_ne!(finding.status, finding.state.label());
assert!(finding.reproduce.unwrap().starts_with("bash test/run.sh"));

Příklad

use majordomus_cli::evidence::{Finding, ProofState};
let f = Finding {
    claim: "some-claim".into(),
    status: "guaranteed".into(),
    state: ProofState::NotRun,
    reason: "the claim names a test nobody has run".into(),
    reproduce: Some("bash test/run.sh 07_scope".into()),
};
assert_eq!(f.state, ProofState::NotRun);
vlastnosttyppovinnépopis
claim string ano Tvrzení.
status string ano Čím tvrzení říká, že je.
state ProofState → ProofState ano Co důkazy podporují.
důvod string ano Proč je to zjištění.
reprodukovat string | null ne Co spustit, když by to spuštění rozhodlo.

Používá EvidenceReport

EvidenceLedgerSummary

object
Čím ledger je a zda tam vůbec je.

Zpráva, která by neřekla, odkud pocházejí její důkazy, by žádala o víru. Toto je původ celé zprávy: soubor, kolik drží, jak starý je nejnovější záznam a proti kterým commitům se kdy cokoli zaznamenalo.

use majordomus_cli::evidence::{Ledger, LedgerSummary, LEDGER_PATH};

let summary: LedgerSummary = Ledger::empty().summary();
assert_eq!(summary.path, LEDGER_PATH);
assert!(!summary.present, "a ledger holding nothing has recorded nothing");
assert_eq!(summary.executions, 0);
assert!(summary.newest.is_none());
assert!(summary.commits.is_empty());

Příklad

use majordomus_cli::evidence::LedgerSummary;
let s = LedgerSummary {
    path: ".ai/repo/evidence/ledger.json".into(),
    present: false,
    executions: 0,
    newest: None,
    commits: vec![],
};
assert!(!s.present, "a repository that recorded nothing says so");
vlastnosttyppovinnépopis
path string ano Kde žije, relativně k repozitáři.
přítomno boolean ano Zda ledger drží alespoň jedno provedení.

Ne zda soubor existuje. Soubor účetní knihy, který nic neobsahuje, a žádný soubor účetní knihy jsou stejná odpověď na jedinou otázku, kterou čtenář klade — bylo něco zaznamenáno — a obojí způsobí, že každé tvrzení se čte jako not_run. Ledger::present odpovídá na otázku souborového systému a nic z ní neodvozuje stav důkazu.

executions integer (uint) ano Kolik provedení obsahuje.
nejnovější string | null ne Nejnovější at v něm, pokud nějaké drží.
commity array of string ano Odlišné commity, proti nimž byla zaznamenána jeho provedení. Vždy se vypisuje, i prázdné, z téhož důvodu jako ClaimProof::changed.

Používá EvidenceReport

EvidencePresentedRevision

object
K čemu byl report posuzován: revize, její strom a běhy, které checkout drží a které vlastní kniha revize neobsahuje.

Verdikt je vždy verdikt k něčemu. evidence show posuzuje pracovní strom; evidence show --presented HEAD posuzuje checkoutnutý commit tak, jak byl commitnut, z ledgeru v něm commitnutého — což je čtení, které potřebuje web sestavený z toho commitu.

use majordomus_cli::evidence::{PresentedRevision, TreeState};

let here = PresentedRevision {
    revision: "working_tree".into(),
    tree: TreeState::Dirty,
    uncommitted: vec![],
};
let json = serde_json::to_value(&here).unwrap();
assert_eq!(json["tree"], "dirty");
// nothing held uncommitted is absent, not an empty list to read past
assert!(json.get("uncommitted").is_none());
vlastnosttyppovinnépopis
revize string ano working_tree, nebo plné id commitu posuzovaného jako commitnutý.
strom EvidenceTreeState → EvidenceTreeState ano Zda strom oné revize byl jejím commitem: pro pracovní strom stav checkoutu; pro commit checkout změřený bez ohledu na pracovní kopii ledgeru a oslabený čímkoli, co volající věděl.
uncommitted array of string ne Testy, jejichž provedení v pracovní kopii ledgeru ledger prezentovaného commitu nedrží, seřazené. Čte se jen proto, aby bylo odepřeno proven, nikdy k rozhodnutí o verdiktu; pro pracovní strom je vždy prázdné, protože jeho ledger je sám autoritou.

Používá EvidenceReport

EvidenceReport

object
Celý spojený obraz: každé tvrzení matice vůči každému zaznamenanému provádění.

Co schopnost odpovídá, co kontrola posuzuje a co web vykresluje, je tatáž hodnota; součty a nálezy se odvozují z tvrzení, nikdy se nepočítají dvakrát.

use majordomus_cli::evidence::{
    EvidenceReport, Finding, Ledger, PresentedRevision, ProofState, Subject, TreeState,
};

let mut report = EvidenceReport {
    head: None,
    working_tree: "unknown".into(),
    presented: PresentedRevision {
        revision: "working_tree".into(),
        tree: TreeState::Unknown,
        uncommitted: vec![],
    },
    ledger: Ledger::empty().summary(),
    subject: Subject { examined: 0, complete: true, excluded: vec![] },
    claims: vec![],
    totals: Default::default(),
    findings: vec![],
};
assert!(report.satisfied(), "nothing claimed, so nothing unsupported");

// and the same report over a subject it could not wholly read is not a pass
let mut partial = report.clone();
partial.subject.complete = false;
assert!(!partial.satisfied(), "an absent answer is not a clean one");

report.findings.push(Finding {
    claim: "scope-integrity".into(),
    status: "guaranteed".into(),
    state: ProofState::Failing,
    reason: "the claim guarantees a behaviour whose test most recently failed".into(),
    reproduce: None,
});
// one unsupported guarantee is enough: the gate is not a proportion
assert!(!report.satisfied());

Příklad

Celá matice spojená s účetní knihou. satisfied je pravda, když žádné tvrzení nedeklaruje záruku, kterou zaznamenané důkazy nepodporují.

use majordomus_cli::evidence::{report, EvidenceReport, Ledger};
use majordomus_cli::synthetic::SyntheticRepository;
let repo = SyntheticRepository::small().unwrap();
let ledger = Ledger::load(repo.root()).unwrap();
let r: EvidenceReport = report(&repo.index().unwrap(), &ledger);
assert!(r.satisfied(), "no claim, so no unsupported guarantee");
vlastnosttyppovinnépopis
head string | null ne Commit, proti kterému byl report odvozen.
working_tree string ano clean, dirty nebo unknown.
prezentováno EvidencePresentedRevision → EvidencePresentedRevision ano O čem verdikty jsou: o pracovním stromu, nebo o checkoutnutém commitu posouzeném tak, jak je commitnutý.
kniha záznamů EvidenceLedgerSummary → EvidenceLedgerSummary ano Ledger, se kterým byl tento záznam spojen.
předmět EvidenceSubject → EvidenceSubject ano Čeho se zpráva mohla dotknout. Přečtěte si to dřív než součty: jsou to počty přes tvrzení, která index držel, a index, který soubor vypustil, jich drží méně.
tvrzení pole EvidenceClaimProof → EvidenceClaimProof ano Každé tvrzení, v pořadí samotné matice.
součty mapa celých čísel (uint) ano Kolik tvrzení je v každém stavu.
zjištění pole EvidenceFinding → EvidenceFinding ano Tvrzení, jejichž deklarovaný stav důkazy nepodporují.

Používá evidence.report

EvidenceSubject

object
Zda report viděl celý svůj předmět.

Verdikt nad maticí, kterou index tiše zmenšil, je selhání, které tento repozitář potkal čtyřikrát za jediný den: objekt je vyloučen, každá projekce menšího indexu je věrnou projekcí a každá kontrola vytiskne pravdivé tvrzení o polovině, kterou vidí. Kontrola aktuálnosti odpoví „vzniklo to z tohoto stromu“, ale nedokáže odpovědět „viděl generátor všechno, co v něm je“, takže odpověď musí nést vlastní jmenovatel.

use majordomus_cli::evidence::Subject;
let whole = Subject { examined: 149, complete: true, excluded: vec![] };
assert!(whole.complete);

let partial = Subject {
    examined: 148,
    complete: false,
    excluded: vec!["docs/CLAIMS.yaml: unknown_key".into()],
};
assert!(!partial.complete, "a shrunken index must not report a clean verdict");
vlastnosttyppovinnépopis
zkoumáno integer (uint) ano Kolik tvrzení index držel a tato zpráva tedy zkoumala.
dokončeno boolean ano Zda index, který je vytvořil, nenesl žádnou chybovou diagnostiku. Když je to false, každý počet a každá absence níže se týká menšího světa než repozitáře a žádný verdikt nad nimi neznamená to, co říká.
vyloučeno array of string ano Diagnostiky, které něco vyloučily, pokud nějaké: <path>: <code>.

Používá EvidenceReport

EvidenceTreeState

"clean" | "dirty" | "unknown"
Zda strom byl commitem, na kterém sedí: tři slova, která ledger a git už používají, typovaná.

unknown není mírnější clean. Je to to, co se zaznamená, když se git nedalo zeptat, a nevědět není důkaz, takže každé zdejší pravidlo to bere jako nečisté.

use majordomus_cli::evidence::freshness::TreeState;

assert_eq!(TreeState::parse("clean"), TreeState::Clean);
assert_eq!(TreeState::parse("dirty"), TreeState::Dirty);
// a word nobody wrote down is not a clean tree
assert_eq!(TreeState::parse("spotless"), TreeState::Unknown);
assert_eq!(TreeState::Dirty.as_str(), "dirty");
assert_eq!(serde_json::to_value(TreeState::Unknown).unwrap(), "unknown");
  • cleanStrom byl commit: nic než kniha důkazů se od něj nelišilo.
  • dirtyOd commitu se lišilo něco jiného než kniha důkazů.
  • unknownGit se nedal zeptat, nebo zaznamenané slovo není žádné ze tří.

Používá evidence.report EvidencePresentedRevision

TestEvidence

object
Jeden test a co dokazuje.

Opačný směr ClaimEvidence, čtený od konce testu: jeho identita, jeho zdroj a zda je tento zdroj stále tím, který běžel, příkaz, který ho spustí znovu, a každé tvrzení, které ho jmenuje.

use majordomus_cli::capability::builtin::evidence::TestEvidence;
use majordomus_cli::evidence::TestId;

let id = TestId::of("apps/majordomus-cli/tests/why.rs").unwrap();
let answer = TestEvidence {
    test: id.as_string(),
    runner: id.runner,
    source: id.source(),
    present: true,
    reproduce: id.reproduce(),
    execution: None,
    digest_matches: None,
    proves: Vec::new(),
};
assert_eq!(answer.test, "crate:why");
assert_eq!(answer.reproduce, "cargo test --test why");

// nothing recorded: the two provenance keys are absent rather than null, so "no
// execution" cannot be read as an execution that said nothing
let json = serde_json::to_value(&answer).unwrap();
assert!(json.get("execution").is_none() && json.get("digest_matches").is_none());
assert_eq!(json["proves"], serde_json::json!([]));
vlastnosttyppovinnépopis
test string ano Stabilní identita: suite:<case> nebo crate:<binary>.
runner EvidenceRunner → EvidenceRunner ano Který runner ji vlastní.
zdroj string ano Vlastní zdroj, relativní k repozitáři.
přítomno boolean ano Zda je tento zdroj v tomto checkoutu.
reprodukovat string ano Příkaz, který spustí tento jeden test.
provádění EvidenceExecution | null → EvidenceExecution ne Poslední zaznamenané provedení, pokud existuje.
digest_matches boolean | null ne Zda zdroj testu stále hashuje na to, co si execution zaznamenal. None, když žádný execution není nebo zdroj není k dispozici k hashování.
proves pole EvidenceClaimProof → EvidenceClaimProof ano Každé tvrzení, které tento test jmenuje, se stavem, v němž je.

Používá evidence.test

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