@@ -12,11 +12,8 @@ pub const DEFAULT_API_BASE_URL: &str = "https://api.github.com";
1212
1313/// Major version of the coven-code headless execution contract this adapter
1414/// speaks. See `docs/headless-contract.md`. Bump only on breaking changes.
15- pub const HEADLESS_CONTRACT_VERSION : & str = "1 " ;
15+ pub const HEADLESS_CONTRACT_VERSION : & str = "2 " ;
1616
17- fn default_contract_version ( ) -> String {
18- HEADLESS_CONTRACT_VERSION . to_string ( )
19- }
2017const GITHUB_API_VERSION : & str = "2026-03-10" ;
2118
2219#[ derive( Debug , Clone , PartialEq , Eq ) ]
@@ -175,18 +172,18 @@ pub enum TaskKind {
175172
176173/// Structured result envelope written by coven-code --headless.
177174#[ derive( Debug , Clone , Deserialize , Serialize ) ]
175+ #[ serde( deny_unknown_fields) ]
178176pub struct SessionResult {
179- /// Contract major version. Defaults to the current version when a runtime
180- /// omits it, but conformant producers MUST emit it. See
177+ /// Contract major version. Conformant producers MUST emit it. See
181178 /// `docs/headless-contract.md`.
182- #[ serde( default = "default_contract_version" ) ]
183179 pub contract_version : String ,
184180 pub status : SessionStatus ,
185181 pub branch : Option < String > ,
186182 pub commits : Vec < CommitInfo > ,
187183 pub files_changed : Vec < String > ,
188184 pub summary : String ,
189185 pub pr_body : String ,
186+ pub review : ReviewResult ,
190187 pub exit_reason : Option < ExitReason > ,
191188}
192189
@@ -200,11 +197,95 @@ pub enum SessionStatus {
200197}
201198
202199#[ derive( Debug , Clone , Deserialize , Serialize ) ]
200+ #[ serde( deny_unknown_fields) ]
203201pub struct CommitInfo {
204202 pub sha : String ,
205203 pub message : String ,
206204}
207205
206+ #[ derive( Debug , Clone , Deserialize , Serialize ) ]
207+ #[ serde( deny_unknown_fields) ]
208+ pub struct ReviewResult {
209+ pub mode : ReviewMode ,
210+ pub evidence_status : ReviewEvidenceStatus ,
211+ pub reviewed_files : Vec < String > ,
212+ pub supporting_files : Vec < String > ,
213+ pub findings : Vec < ReviewFinding > ,
214+ pub tests_run : Vec < ReviewTestRun > ,
215+ pub no_findings_reason : Option < String > ,
216+ pub limitations : Vec < String > ,
217+ }
218+
219+ impl ReviewResult {
220+ pub fn none ( ) -> Self {
221+ Self {
222+ mode : ReviewMode :: None ,
223+ evidence_status : ReviewEvidenceStatus :: NotApplicable ,
224+ reviewed_files : Vec :: new ( ) ,
225+ supporting_files : Vec :: new ( ) ,
226+ findings : Vec :: new ( ) ,
227+ tests_run : Vec :: new ( ) ,
228+ no_findings_reason : None ,
229+ limitations : Vec :: new ( ) ,
230+ }
231+ }
232+ }
233+
234+ #[ derive( Debug , Clone , Deserialize , Serialize , PartialEq , Eq ) ]
235+ #[ serde( rename_all = "snake_case" ) ]
236+ pub enum ReviewMode {
237+ None ,
238+ PullRequest ,
239+ ReviewComment ,
240+ }
241+
242+ #[ derive( Debug , Clone , Deserialize , Serialize , PartialEq , Eq ) ]
243+ #[ serde( rename_all = "snake_case" ) ]
244+ pub enum ReviewEvidenceStatus {
245+ NotApplicable ,
246+ Complete ,
247+ Partial ,
248+ Missing ,
249+ }
250+
251+ #[ derive( Debug , Clone , Deserialize , Serialize ) ]
252+ #[ serde( deny_unknown_fields) ]
253+ pub struct ReviewFinding {
254+ pub severity : ReviewSeverity ,
255+ pub file : String ,
256+ pub line : Option < u64 > ,
257+ pub title : String ,
258+ pub body : String ,
259+ pub recommendation : Option < String > ,
260+ }
261+
262+ #[ derive( Debug , Clone , Deserialize , Serialize , PartialEq , Eq ) ]
263+ #[ serde( rename_all = "snake_case" ) ]
264+ pub enum ReviewSeverity {
265+ Info ,
266+ Low ,
267+ Medium ,
268+ High ,
269+ Critical ,
270+ }
271+
272+ #[ derive( Debug , Clone , Deserialize , Serialize ) ]
273+ #[ serde( deny_unknown_fields) ]
274+ pub struct ReviewTestRun {
275+ pub command : String ,
276+ pub status : ReviewTestStatus ,
277+ pub output_summary : Option < String > ,
278+ }
279+
280+ #[ derive( Debug , Clone , Deserialize , Serialize , PartialEq , Eq ) ]
281+ #[ serde( rename_all = "snake_case" ) ]
282+ pub enum ReviewTestStatus {
283+ Passed ,
284+ Failed ,
285+ NotRun ,
286+ Unknown ,
287+ }
288+
208289#[ derive( Debug , Clone , Deserialize , Serialize , PartialEq , Eq ) ]
209290#[ serde( rename_all = "snake_case" ) ]
210291pub enum ExitReason {
0 commit comments