Skip to main content

diagnostic

Attribute Macro diagnostic 

Source
#[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 list
  • min_independent = N (required, > 0) — distinct-class floor; the parser rejects min_independent exceeding the number of distinct classes (vacuously unsatisfiable claim).

§Audit hints

  • diagnostic-modality-insufficient — fewer modalities than the floor
  • diagnostic-modalities-class-collapsed — all witnesses share one class
  • diagnostic-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)
}