ADR 0002 — Trust model, evidence sources, and acceptance rules¶
Status: accepted · Date: 2026-10-02
Context¶
The project requires claim-specific evidence acceptance with no universal
numeric trust score, and that unknown / unsupported / stale / untrusted evidence
never becomes allow.
Decision¶
- Evidence categories are explicit (
mock,admin_inventory,host_observation,kubernetes_observation,attestation_verifier) and carried on everyObservation<T>together with a source identity and times. - Observation status is one of
known | unknown | unsupported | error. A knownfalseis distinct from all non-known states. - Acceptance is per-context.
EvaluationContext.accepted_sourceslists the categories accepted for ordinary (non-attestation) claims. Offline / observe defaults includemock. Enforce configuration omitsmock, so synthetic evidence is rejected at enforcement. A not-accepted source yieldsSOURCE_NOT_ACCEPTED→ unresolved, never allow. - Freshness. A known observation is stale (→
EVIDENCE_STALE) if it has no timestamp, is older thanmaxAgeSeconds, or is future-dated beyondmaxClockSkewSeconds.maxAgeSeconds: 0disables the freshness check. - Attestation. A verified attestation claim requires an
attestation_verifiersource that no default provider produces;attestation: requiredis therefore always unresolved (ATTESTATION_REQUIRED) and listed in the decision'sunsupportedRequirements. Enforce mode blocks. - Administrator assertions (region, assigned tenant) are reported as such in
the decision (
adminAssertions); they are not hardware-attested facts. - Node binding. The pure evaluator requires
candidate.nodeUid == snapshot.nodeUid; a mismatch isNODE_INCARNATION_MISMATCH. The Kubernetes observer additionally binds by node UID / incarnation.
Consequences¶
- There is no code path where a missing collector, stale report, or unaccepted
source produces
allow. - The same policy evaluated in
offline/observevsenforcecan differ only by becoming more conservative (fewer accepted sources), never more permissive.