pub struct EvidenceReport {
pub head: Option<String>,
pub working_tree: String,
pub presented: PresentedRevision,
pub ledger: LedgerSummary,
pub subject: Subject,
pub claims: Vec<ClaimProof>,
pub totals: BTreeMap<String, usize>,
pub findings: Vec<Finding>,
}Expand description
The whole joined picture: every claim of the matrix against every execution recorded.
What the capability answers, what the gate judges and what the site renders are this one value; the totals and the findings are derived from the claims, never counted twice.
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());§Example
The whole matrix joined to the ledger. satisfied is true when no claim declares a
guarantee the recorded evidence does not support.
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");Fields§
§head: Option<String>The commit the report was derived against.
working_tree: Stringclean, dirty or unknown.
presented: PresentedRevisionWhat the verdicts are about: the working tree, or the checked-out commit judged as committed.
ledger: LedgerSummaryThe ledger this was joined against.
subject: SubjectWhat the report could reach. Read this before reading the tallies: they are counts over the claims the index held, and an index that dropped a file holds fewer.
claims: Vec<ClaimProof>Every claim, in the matrix’s own order.
totals: BTreeMap<String, usize>How many claims are in each state.
findings: Vec<Finding>Claims whose declared status the evidence does not support.
Implementations§
Source§impl EvidenceReport
impl EvidenceReport
Sourcepub fn satisfied(&self) -> bool
pub fn satisfied(&self) -> bool
Does the evidence support every claim that declares a guarantee?
False when the index was incomplete, whatever the findings say. An empty finding list over a matrix that lost entries is not a pass — it is the absence of an answer, and the two must never be spelled the same way.
let mut r = EvidenceReport {
head: None,
working_tree: "clean".into(),
presented: PresentedRevision {
revision: "working_tree".into(),
tree: TreeState::Clean,
uncommitted: vec![],
},
ledger: LedgerSummary {
path: ".ai/repo/evidence/ledger.json".into(),
present: false,
executions: 0,
newest: None,
commits: vec![],
},
subject: Subject { examined: 0, complete: true, excluded: vec![] },
claims: vec![],
totals: BTreeMap::new(),
findings: vec![],
};
assert!(r.satisfied(), "no findings over a whole subject is a pass");
r.subject.complete = false;
assert!(!r.satisfied(), "no findings over a partial subject is not a pass");Trait Implementations§
Source§impl Clone for EvidenceReport
impl Clone for EvidenceReport
Source§fn clone(&self) -> EvidenceReport
fn clone(&self) -> EvidenceReport
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for EvidenceReport
impl Debug for EvidenceReport
Source§impl<'de> Deserialize<'de> for EvidenceReport
impl<'de> Deserialize<'de> for EvidenceReport
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
impl Eq for EvidenceReport
Source§impl JsonSchema for EvidenceReport
impl JsonSchema for EvidenceReport
Source§fn schema_id() -> Cow<'static, str>
fn schema_id() -> Cow<'static, str>
Source§fn json_schema(generator: &mut SchemaGenerator) -> Schema
fn json_schema(generator: &mut SchemaGenerator) -> Schema
Source§fn inline_schema() -> bool
fn inline_schema() -> bool
$ref keyword. Read moreSource§impl PartialEq for EvidenceReport
impl PartialEq for EvidenceReport
Source§fn eq(&self, other: &EvidenceReport) -> bool
fn eq(&self, other: &EvidenceReport) -> bool
self and other values to be equal, and is used by ==.Source§impl Serialize for EvidenceReport
impl Serialize for EvidenceReport
impl StructuralPartialEq for EvidenceReport
Auto Trait Implementations§
impl Freeze for EvidenceReport
impl RefUnwindSafe for EvidenceReport
impl Send for EvidenceReport
impl Sync for EvidenceReport
impl Unpin for EvidenceReport
impl UnsafeUnpin for EvidenceReport
impl UnwindSafe for EvidenceReport
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.