#[diagnostic]Expand description
Declare convergent multi-modality evidence backing a defense claim.
#[diagnostic(modalities = [...], min_independent = N)] asserts that
at least N distinct WitnessClass categories
converge on this defense. Per ADR-024 §Decision + adversarial C1, the
count is over distinct CLASSES, not raw witness count — running the
same kind of test in triplicate doesn’t add evidence.
§Biology grounding
#[diagnostic] is grounded in clinical medicine, not immunology
proper. The metaphor is the diagnostic workup pattern from
differential-diagnosis literature: a clinician confirms a diagnosis
when independent modalities (history, physical, imaging, labs)
converge on the same finding. A single modality is suggestive; the
convergence is what carries clinical confidence. Per ADR-024 §Biology
grounding — dual-axis honesty, #[diagnostic] sits on the
clinical-medicine axis alongside #[panel], #[ddx], #[rx],
#[triage], #[refer], #[biopsy], #[culture], #[quarantine],
and #[recurrence_anchor]. The convergent-evidence family draws on
both immunology (clonal expansion, IgG class-switching) and clinical
medicine (diagnostic workup) — the dual axis is acknowledged
explicitly rather than collapsed.
§Arguments
modalities = [WitnessClass::X, ...](required) — non-empty listmin_independent = N(required, > 0) — distinct-class floor; the parser rejectsmin_independentexceeding the number of distinct classes (vacuously unsatisfiable claim).
§Audit hints
diagnostic-modality-insufficient— fewer modalities than the floordiagnostic-modalities-class-collapsed— all witnesses share one classdiagnostic-modalities-empty— empty modalities list
§Example
use antigen::{antigen, diagnostic, WitnessClass};
#[diagnostic(
modalities = [WitnessClass::PropertyTest, WitnessClass::FormalVerification],
min_independent = 2,
)]
pub fn checked_arithmetic_sum(a: i64, b: i64) -> Option<i64> {
a.checked_add(b)
}