现状
全量 review 发现 review/check 模式在跨层契约中是裸字符串:
src-tauri/src/model.rs:19 Candidate.kind: String
src-tauri/src/model.rs:67 PullRequestView.kind: String
src-tauri/src/review/session.rs:61 SessionInfo.kind: String
src-tauri/src/review/engine.rs:18 ReviewEngine::start(... kind: &str)
src-tauri/src/review/commands.rs:57 Tauri command start_review 接收 kind: String 并直接传入 engine。
src-tauri/src/review/session.rs:431 的 skill_command 对非 "check" 全部默认为 review。
src/types.ts:9、src/review/api.ts:26、src/review/useReviewStore.ts:223 也都是 string。
同时 command 边界没有拒绝 pr_number == 0 或非法 kind,非法状态可进入 session/registry UI。
三维根因
- 代码:字符串约定靠注释维护,非法值在后端被静默降级。
- 架构:这是跨 Rust/TS、ledger、session、engine trait 的契约,但没有类型载体。
- 历史:初期只有两个模式,直接用字符串实现;后续 auto-dispatch/session/ledger 扩展后,字符串扩散到多个边界。
影响
- 拼写错误或外部 IPC 非法参数无法在类型层发现。
- session 列表可显示非法 kind,但实际执行的是 review,UI 和行为不一致。
- 新增模式时容易遗漏 ledger/session/frontend 等调用点。
修复方向
- 最小方案:在
start_review command 边界拒绝 pr_number == 0 和非 review/check kind。
- 彻底方案:引入 Rust
ReviewKind enum,serde pin 为 "review" | "check";TS 增加 type ReviewKind = "review" | "check"。
- 重构方案:让
Candidate、PullRequestView、SessionInfo、ledger event、ReviewEngine trait 全部使用 ReviewKind,并补 serde golden + API wrapper tests。
Files
src-tauri/src/model.rs:19
src-tauri/src/model.rs:67
src-tauri/src/review/engine.rs:18
src-tauri/src/review/commands.rs:57
src-tauri/src/review/session.rs:61
src-tauri/src/review/session.rs:431
src/types.ts:9
src/review/api.ts:26
src/review/useReviewStore.ts:223
Source
Discovered via full-project review with 6 subagents on 2026-06-17.
现状
全量 review 发现
review/check模式在跨层契约中是裸字符串:src-tauri/src/model.rs:19Candidate.kind: Stringsrc-tauri/src/model.rs:67PullRequestView.kind: Stringsrc-tauri/src/review/session.rs:61SessionInfo.kind: Stringsrc-tauri/src/review/engine.rs:18ReviewEngine::start(... kind: &str)src-tauri/src/review/commands.rs:57Tauri commandstart_review接收kind: String并直接传入 engine。src-tauri/src/review/session.rs:431的skill_command对非"check"全部默认为 review。src/types.ts:9、src/review/api.ts:26、src/review/useReviewStore.ts:223也都是string。同时 command 边界没有拒绝
pr_number == 0或非法 kind,非法状态可进入 session/registry UI。三维根因
影响
修复方向
start_reviewcommand 边界拒绝pr_number == 0和非review/checkkind。ReviewKindenum,serde pin 为"review" | "check";TS 增加type ReviewKind = "review" | "check"。Candidate、PullRequestView、SessionInfo、ledger event、ReviewEnginetrait 全部使用ReviewKind,并补 serde golden + API wrapper tests。Files
src-tauri/src/model.rs:19src-tauri/src/model.rs:67src-tauri/src/review/engine.rs:18src-tauri/src/review/commands.rs:57src-tauri/src/review/session.rs:61src-tauri/src/review/session.rs:431src/types.ts:9src/review/api.ts:26src/review/useReviewStore.ts:223Source
Discovered via full-project review with 6 subagents on 2026-06-17.