A minimal, fully attested Intent that conforms — the base for mutation.
()
| 261 | |
| 262 | /// A minimal, fully attested Intent that conforms — the base for mutation. |
| 263 | fn attested_base() -> CanonicalNode { |
| 264 | let kp = KeyPair::generate(); |
| 265 | let id = Identity::new("lee", &kp); |
| 266 | let node = CanonicalNode { |
| 267 | context: CONTEXT_URL.to_string(), |
| 268 | type_: NodeType::Intent.as_str().to_string(), |
| 269 | id: "urn:atomic:intent:gate-1".to_string(), |
| 270 | human_key: "GATE-1".to_string(), |
| 271 | title: "Gate base".to_string(), |
| 272 | status: "todo".to_string(), |
| 273 | priority: None, |
| 274 | view: None, |
| 275 | motivated_by: None, |
| 276 | informed_by: Vec::new(), |
| 277 | has_acceptance_criterion: Vec::new(), |
| 278 | has_task: Vec::new(), |
| 279 | has_scope_in: Vec::new(), |
| 280 | has_scope_out: Vec::new(), |
| 281 | has_constraint: Vec::new(), |
| 282 | depends_on: Vec::new(), |
| 283 | why: Some("a reason".to_string()), |
| 284 | content_hash: None, |
| 285 | attributed_to: None, |
| 286 | created_at: "2026-06-25T00:00:00Z".to_string(), |
| 287 | proof: None, |
| 288 | }; |
| 289 | proof::attest(node, &id, &kp) |
| 290 | } |
| 291 | |
| 292 | #[test] |
| 293 | fn gate_requires_scope_out_when_scope_in_present() { |