Skip to main content

ainl_contracts/
handoff.rs

1//! Structured worker handoff contract.
2
3use serde::{Deserialize, Serialize};
4
5use crate::feature::FeatureId;
6
7/// Command run during verification with observed outcome.
8#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
9pub struct VerificationCommand {
10    pub command: String,
11    pub exit_code: i32,
12    #[serde(default)]
13    pub observation: String,
14}
15
16/// Interactive/manual check performed by the worker.
17#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
18pub struct InteractiveCheck {
19    pub action: String,
20    #[serde(default)]
21    pub observed: String,
22}
23
24/// One test case added by the worker.
25#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
26pub struct TestCase {
27    pub name: String,
28    #[serde(default)]
29    pub verifies: String,
30}
31
32/// Test file added during feature work.
33#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
34pub struct TestAdded {
35    pub file: String,
36    #[serde(default)]
37    pub cases: Vec<TestCase>,
38}
39
40/// Aggregated test changes from a handoff.
41#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
42pub struct HandoffTests {
43    #[serde(default)]
44    pub added: Vec<TestAdded>,
45    #[serde(default)]
46    pub updated: Vec<String>,
47    #[serde(default, skip_serializing_if = "Option::is_none")]
48    pub coverage: Option<String>,
49}
50
51/// Severity for discovered issues.
52#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
53#[serde(rename_all = "snake_case")]
54pub enum IssueSeverity {
55    Blocking,
56    NonBlocking,
57    Suggestion,
58}
59
60/// Issue discovered during feature implementation.
61#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
62pub struct DiscoveredIssue {
63    pub severity: IssueSeverity,
64    pub description: String,
65    #[serde(default, skip_serializing_if = "Option::is_none")]
66    pub suggested_fix: Option<String>,
67}
68
69/// Deviation from expected procedure.
70#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
71pub struct Deviation {
72    pub step: String,
73    pub reason: String,
74}
75
76/// Feedback on skill/procedure quality from the worker.
77#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
78pub struct SkillFeedback {
79    #[serde(default)]
80    pub followed_procedure: bool,
81    #[serde(default)]
82    pub deviations: Vec<Deviation>,
83    #[serde(default)]
84    pub suggested_changes: Vec<String>,
85}
86
87/// Verification evidence bundled in a handoff.
88#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
89pub struct HandoffVerification {
90    #[serde(default)]
91    pub commands: Vec<VerificationCommand>,
92    #[serde(default)]
93    pub interactive: Vec<InteractiveCheck>,
94}
95
96/// Structured completion record from a feature worker.
97#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
98pub struct Handoff {
99    pub feature_id: FeatureId,
100    pub agent_id: String,
101    #[serde(default)]
102    pub salient_summary: String,
103    #[serde(default)]
104    pub what_was_implemented_md: String,
105    #[serde(default)]
106    pub what_was_left_undone_md: String,
107    #[serde(default)]
108    pub verification: HandoffVerification,
109    #[serde(default)]
110    pub tests: HandoffTests,
111    #[serde(default)]
112    pub discovered_issues: Vec<DiscoveredIssue>,
113    #[serde(default)]
114    pub skill_feedback: SkillFeedback,
115}