Skip to content

Commit 198ff4c

Browse files
committed
refactor: split feedback eval types
Separate feedback input payload models from report/output models so ingestion and reporting changes stop colliding in one type file. Made-with: Cursor
1 parent 6253011 commit 198ff4c

4 files changed

Lines changed: 134 additions & 124 deletions

File tree

TODO.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@
7878
### Commands backlog
7979

8080
- [ ] `src/commands/eval/types.rs`: split fixture, pattern, report, and run-option types if churn keeps touching unrelated structs.
81-
- [ ] `src/commands/feedback_eval/types.rs`: separate input payload types from report/output types.
81+
- [x] `src/commands/feedback_eval/types.rs`: separate input payload types from report/output types.
8282
- [x] `src/commands/feedback_eval/input/loading.rs`: split format detection from JSON parsing/loading.
8383
- [x] `src/commands/feedback_eval/input/conversion.rs`: split review-session conversion from label normalization helpers.
8484
- [ ] `src/commands/pr.rs`: separate summary-only flow, full review flow, and comment-posting orchestration.
Lines changed: 9 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -1,123 +1,9 @@
1-
use serde::{Deserialize, Serialize};
2-
use std::path::PathBuf;
3-
4-
#[derive(Debug, Clone, Default)]
5-
pub(super) struct LoadedFeedbackEvalInput {
6-
pub(super) total_comments_seen: usize,
7-
pub(super) total_reviews_seen: usize,
8-
pub(super) comments: Vec<FeedbackEvalComment>,
9-
}
10-
11-
#[derive(Debug, Clone)]
12-
pub(super) struct FeedbackEvalComment {
13-
pub(super) source_kind: String,
14-
pub(super) review_id: Option<String>,
15-
pub(super) repo: Option<String>,
16-
pub(super) pr_number: Option<u32>,
17-
pub(super) title: Option<String>,
18-
pub(super) file_path: Option<PathBuf>,
19-
pub(super) line_number: Option<usize>,
20-
pub(super) file_patterns: Vec<String>,
21-
pub(super) content: String,
22-
pub(super) category: String,
23-
pub(super) severity: Option<String>,
24-
pub(super) confidence: Option<f32>,
25-
pub(super) accepted: bool,
26-
}
27-
28-
#[derive(Debug, Clone, Serialize, Deserialize)]
29-
pub(super) struct FeedbackEvalBucket {
30-
#[serde(default)]
31-
pub(super) name: String,
32-
#[serde(default)]
33-
pub(super) total: usize,
34-
#[serde(default)]
35-
pub(super) accepted: usize,
36-
#[serde(default)]
37-
pub(super) rejected: usize,
38-
#[serde(default)]
39-
pub(super) acceptance_rate: f32,
40-
}
41-
42-
#[derive(Debug, Clone, Copy, Serialize, Deserialize, Default)]
43-
pub(super) struct FeedbackThresholdMetrics {
44-
#[serde(default)]
45-
pub(super) total_scored: usize,
46-
#[serde(default)]
47-
pub(super) true_positive: usize,
48-
#[serde(default)]
49-
pub(super) false_positive: usize,
50-
#[serde(default)]
51-
pub(super) true_negative: usize,
52-
#[serde(default)]
53-
pub(super) false_negative: usize,
54-
#[serde(default)]
55-
pub(super) precision: f32,
56-
#[serde(default)]
57-
pub(super) recall: f32,
58-
#[serde(default)]
59-
pub(super) f1: f32,
60-
#[serde(default)]
61-
pub(super) agreement_rate: f32,
62-
}
63-
64-
#[derive(Debug, Clone, Serialize, Deserialize)]
65-
pub(super) struct FeedbackEvalExample {
66-
#[serde(default)]
67-
pub(super) source_kind: String,
68-
#[serde(default, skip_serializing_if = "Option::is_none")]
69-
pub(super) review_id: Option<String>,
70-
#[serde(default, skip_serializing_if = "Option::is_none")]
71-
pub(super) repo: Option<String>,
72-
#[serde(default, skip_serializing_if = "Option::is_none")]
73-
pub(super) pr_number: Option<u32>,
74-
#[serde(default, skip_serializing_if = "Option::is_none")]
75-
pub(super) title: Option<String>,
76-
#[serde(default, skip_serializing_if = "Option::is_none")]
77-
pub(super) file_path: Option<PathBuf>,
78-
#[serde(default, skip_serializing_if = "Option::is_none")]
79-
pub(super) line_number: Option<usize>,
80-
#[serde(default)]
81-
pub(super) category: String,
82-
#[serde(default, skip_serializing_if = "Option::is_none")]
83-
pub(super) severity: Option<String>,
84-
#[serde(default, skip_serializing_if = "Option::is_none")]
85-
pub(super) confidence: Option<f32>,
86-
#[serde(default)]
87-
pub(super) content: String,
88-
}
89-
90-
#[derive(Debug, Clone, Serialize, Deserialize)]
91-
pub(super) struct FeedbackEvalReport {
92-
#[serde(default)]
93-
pub(super) total_comments_seen: usize,
94-
#[serde(default)]
95-
pub(super) total_reviews_seen: usize,
96-
#[serde(default)]
97-
pub(super) labeled_comments: usize,
98-
#[serde(default)]
99-
pub(super) labeled_reviews: usize,
100-
#[serde(default)]
101-
pub(super) accepted: usize,
102-
#[serde(default)]
103-
pub(super) rejected: usize,
104-
#[serde(default)]
105-
pub(super) acceptance_rate: f32,
106-
#[serde(default)]
107-
pub(super) confidence_threshold: f32,
108-
pub(super) vague_comments: FeedbackEvalBucket,
109-
#[serde(default, skip_serializing_if = "Option::is_none")]
110-
pub(super) confidence_metrics: Option<FeedbackThresholdMetrics>,
111-
#[serde(default)]
112-
pub(super) by_category: Vec<FeedbackEvalBucket>,
113-
#[serde(default)]
114-
pub(super) by_severity: Vec<FeedbackEvalBucket>,
115-
#[serde(default)]
116-
pub(super) by_repo: Vec<FeedbackEvalBucket>,
117-
#[serde(default)]
118-
pub(super) by_file_pattern: Vec<FeedbackEvalBucket>,
119-
#[serde(default)]
120-
pub(super) showcase_candidates: Vec<FeedbackEvalExample>,
121-
#[serde(default)]
122-
pub(super) vague_rejections: Vec<FeedbackEvalExample>,
123-
}
1+
#[path = "types/input.rs"]
2+
mod input;
3+
#[path = "types/report.rs"]
4+
mod report;
5+
6+
pub(super) use input::{FeedbackEvalComment, LoadedFeedbackEvalInput};
7+
pub(super) use report::{
8+
FeedbackEvalBucket, FeedbackEvalExample, FeedbackEvalReport, FeedbackThresholdMetrics,
9+
};
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
use std::path::PathBuf;
2+
3+
#[derive(Debug, Clone, Default)]
4+
pub(in super::super) struct LoadedFeedbackEvalInput {
5+
pub(in super::super) total_comments_seen: usize,
6+
pub(in super::super) total_reviews_seen: usize,
7+
pub(in super::super) comments: Vec<FeedbackEvalComment>,
8+
}
9+
10+
#[derive(Debug, Clone)]
11+
pub(in super::super) struct FeedbackEvalComment {
12+
pub(in super::super) source_kind: String,
13+
pub(in super::super) review_id: Option<String>,
14+
pub(in super::super) repo: Option<String>,
15+
pub(in super::super) pr_number: Option<u32>,
16+
pub(in super::super) title: Option<String>,
17+
pub(in super::super) file_path: Option<PathBuf>,
18+
pub(in super::super) line_number: Option<usize>,
19+
pub(in super::super) file_patterns: Vec<String>,
20+
pub(in super::super) content: String,
21+
pub(in super::super) category: String,
22+
pub(in super::super) severity: Option<String>,
23+
pub(in super::super) confidence: Option<f32>,
24+
pub(in super::super) accepted: bool,
25+
}
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
use serde::{Deserialize, Serialize};
2+
use std::path::PathBuf;
3+
4+
#[derive(Debug, Clone, Serialize, Deserialize)]
5+
pub(in super::super) struct FeedbackEvalBucket {
6+
#[serde(default)]
7+
pub(in super::super) name: String,
8+
#[serde(default)]
9+
pub(in super::super) total: usize,
10+
#[serde(default)]
11+
pub(in super::super) accepted: usize,
12+
#[serde(default)]
13+
pub(in super::super) rejected: usize,
14+
#[serde(default)]
15+
pub(in super::super) acceptance_rate: f32,
16+
}
17+
18+
#[derive(Debug, Clone, Copy, Serialize, Deserialize, Default)]
19+
pub(in super::super) struct FeedbackThresholdMetrics {
20+
#[serde(default)]
21+
pub(in super::super) total_scored: usize,
22+
#[serde(default)]
23+
pub(in super::super) true_positive: usize,
24+
#[serde(default)]
25+
pub(in super::super) false_positive: usize,
26+
#[serde(default)]
27+
pub(in super::super) true_negative: usize,
28+
#[serde(default)]
29+
pub(in super::super) false_negative: usize,
30+
#[serde(default)]
31+
pub(in super::super) precision: f32,
32+
#[serde(default)]
33+
pub(in super::super) recall: f32,
34+
#[serde(default)]
35+
pub(in super::super) f1: f32,
36+
#[serde(default)]
37+
pub(in super::super) agreement_rate: f32,
38+
}
39+
40+
#[derive(Debug, Clone, Serialize, Deserialize)]
41+
pub(in super::super) struct FeedbackEvalExample {
42+
#[serde(default)]
43+
pub(in super::super) source_kind: String,
44+
#[serde(default, skip_serializing_if = "Option::is_none")]
45+
pub(in super::super) review_id: Option<String>,
46+
#[serde(default, skip_serializing_if = "Option::is_none")]
47+
pub(in super::super) repo: Option<String>,
48+
#[serde(default, skip_serializing_if = "Option::is_none")]
49+
pub(in super::super) pr_number: Option<u32>,
50+
#[serde(default, skip_serializing_if = "Option::is_none")]
51+
pub(in super::super) title: Option<String>,
52+
#[serde(default, skip_serializing_if = "Option::is_none")]
53+
pub(in super::super) file_path: Option<PathBuf>,
54+
#[serde(default, skip_serializing_if = "Option::is_none")]
55+
pub(in super::super) line_number: Option<usize>,
56+
#[serde(default)]
57+
pub(in super::super) category: String,
58+
#[serde(default, skip_serializing_if = "Option::is_none")]
59+
pub(in super::super) severity: Option<String>,
60+
#[serde(default, skip_serializing_if = "Option::is_none")]
61+
pub(in super::super) confidence: Option<f32>,
62+
#[serde(default)]
63+
pub(in super::super) content: String,
64+
}
65+
66+
#[derive(Debug, Clone, Serialize, Deserialize)]
67+
pub(in super::super) struct FeedbackEvalReport {
68+
#[serde(default)]
69+
pub(in super::super) total_comments_seen: usize,
70+
#[serde(default)]
71+
pub(in super::super) total_reviews_seen: usize,
72+
#[serde(default)]
73+
pub(in super::super) labeled_comments: usize,
74+
#[serde(default)]
75+
pub(in super::super) labeled_reviews: usize,
76+
#[serde(default)]
77+
pub(in super::super) accepted: usize,
78+
#[serde(default)]
79+
pub(in super::super) rejected: usize,
80+
#[serde(default)]
81+
pub(in super::super) acceptance_rate: f32,
82+
#[serde(default)]
83+
pub(in super::super) confidence_threshold: f32,
84+
pub(in super::super) vague_comments: FeedbackEvalBucket,
85+
#[serde(default, skip_serializing_if = "Option::is_none")]
86+
pub(in super::super) confidence_metrics: Option<FeedbackThresholdMetrics>,
87+
#[serde(default)]
88+
pub(in super::super) by_category: Vec<FeedbackEvalBucket>,
89+
#[serde(default)]
90+
pub(in super::super) by_severity: Vec<FeedbackEvalBucket>,
91+
#[serde(default)]
92+
pub(in super::super) by_repo: Vec<FeedbackEvalBucket>,
93+
#[serde(default)]
94+
pub(in super::super) by_file_pattern: Vec<FeedbackEvalBucket>,
95+
#[serde(default)]
96+
pub(in super::super) showcase_candidates: Vec<FeedbackEvalExample>,
97+
#[serde(default)]
98+
pub(in super::super) vague_rejections: Vec<FeedbackEvalExample>,
99+
}

0 commit comments

Comments
 (0)