Skip to main content

ainl_contracts/
assertion.rs

1//! Validation assertions tied to mission milestones.
2
3use serde::{Deserialize, Serialize};
4
5use crate::feature::VerificationStep;
6
7/// Stable assertion identifier.
8#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
9#[serde(transparent)]
10pub struct AssertionId(pub String);
11
12impl AssertionId {
13    pub fn as_str(&self) -> &str {
14        &self.0
15    }
16}
17
18impl From<String> for AssertionId {
19    fn from(s: String) -> Self {
20        Self(s)
21    }
22}
23
24impl From<&str> for AssertionId {
25    fn from(s: &str) -> Self {
26        Self(s.to_string())
27    }
28}
29
30/// Result state for an assertion check.
31#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
32#[serde(rename_all = "snake_case")]
33pub enum AssertionState {
34    #[default]
35    Pending,
36    Passed,
37    Failed,
38    Blocked,
39}
40
41/// A verifiable claim about mission output quality.
42#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
43pub struct Assertion {
44    pub assertion_id: AssertionId,
45    pub description: String,
46    #[serde(default)]
47    pub verification_steps: Vec<VerificationStep>,
48    pub state: AssertionState,
49    #[serde(default, skip_serializing_if = "Option::is_none")]
50    pub milestone: Option<String>,
51    #[serde(default)]
52    pub failed_count: u32,
53}