1use serde::{Deserialize, Serialize};
4
5use crate::feature::FeatureId;
6
7#[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#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
18pub struct InteractiveCheck {
19 pub action: String,
20 #[serde(default)]
21 pub observed: String,
22}
23
24#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
26pub struct TestCase {
27 pub name: String,
28 #[serde(default)]
29 pub verifies: String,
30}
31
32#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
34pub struct TestAdded {
35 pub file: String,
36 #[serde(default)]
37 pub cases: Vec<TestCase>,
38}
39
40#[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#[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#[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#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
71pub struct Deviation {
72 pub step: String,
73 pub reason: String,
74}
75
76#[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#[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#[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}