| 48 | #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] |
| 49 | #[serde(deny_unknown_fields)] |
| 50 | pub struct AcceptanceCriterion { |
| 51 | #[serde(rename = "@type")] |
| 52 | pub type_: String, |
| 53 | #[serde(rename = "@id")] |
| 54 | pub id: String, |
| 55 | pub text: String, |
| 56 | #[serde(rename = "acStatus")] |
| 57 | pub ac_status: String, |
| 58 | #[serde( |
| 59 | rename = "verifiedBy", |
| 60 | default, |
| 61 | skip_serializing_if = "Option::is_none" |
| 62 | )] |
| 63 | pub verified_by: Option<String>, |
| 64 | #[serde(default, skip_serializing_if = "Option::is_none")] |
| 65 | pub evidence: Option<String>, |
| 66 | /// Accumulated verification records (empty is omitted, so existing hashes |
| 67 | /// are byte-identical when there are none). |
| 68 | #[serde(default, skip_serializing_if = "Vec::is_empty")] |
| 69 | pub verifications: Vec<VerificationRecord>, |
| 70 | /// The verification kinds this criterion requires to be `met` (a later |
| 71 | /// milestone derives `acStatus` from these). Empty is omitted. |
| 72 | #[serde( |
| 73 | rename = "requiredKinds", |
| 74 | default, |
| 75 | skip_serializing_if = "Vec::is_empty" |
| 76 | )] |
| 77 | pub required_kinds: Vec<String>, |
| 78 | } |
| 79 | |
| 80 | /// A scope boundary item, lifted from a `:::scope-in` / `:::scope-out` |
| 81 | /// directive. The prose is the unconstrained narrative; the gate enforces |
nothing calls this directly
no outgoing calls
no test coverage detected