# ShowenV2 代码审核标准

## 审核流程

### 两级审核制度
```
开发者提交 → PM 初审 → CEO 终审 → git commit
```

### PM 初审职责
1. **编译检查**: cargo check 必须通过，零 warning
2. **基本逻辑**: 代码逻辑正确，无明显 bug
3. **风格一致**: 符合项目代码风格
4. **测试验证**: 关键功能手动测试通过

### CEO 终审职责
1. **架构审核**: 是否符合整体架构设计
2. **性能审核**: 是否有性能问题
3. **安全审核**: 是否有安全隐患
4. **质量审核**: 代码质量是否达标

---

## 代码质量标准

### 必须满足（P0）
- [ ] cargo check 零 warning
- [ ] cargo clippy 零 warning
- [ ] 无 unsafe 代码（除非有充分理由并注释说明）
- [ ] 无 unwrap/expect（使用 ? 或 match 处理错误）
- [ ] 无 panic（除非是不可恢复的错误）
- [ ] 所有 public API 有文档注释
- [ ] 关键逻辑有注释说明

### 应该满足（P1）
- [ ] 函数长度 < 100 行
- [ ] 圈复杂度 < 10
- [ ] 嵌套层级 < 4
- [ ] 变量命名清晰（避免 a/b/tmp 等）
- [ ] 错误信息有上下文
- [ ] 日志级别合理（debug/info/warn/error）

### 建议满足（P2）
- [ ] 单元测试覆盖关键逻辑
- [ ] 性能敏感代码有 benchmark
- [ ] 复杂算法有示例和图解
- [ ] 使用 trait 抽象而非具体类型

---

## 架构审核标准

### 插件设计
- [ ] 插件之间零耦合，只通过消息通信
- [ ] 插件不直接访问其他插件的状态
- [ ] 插件可独立编译和测试
- [ ] 插件配置通过 Config 传入

### 消息设计
- [ ] 消息类型语义清晰
- [ ] 消息字段最小化（避免冗余）
- [ ] 消息实现 Clone（如果需要 Broadcast）
- [ ] 消息处理无阻塞（长时间操作用独立线程）

### 并发设计
- [ ] 避免共享可变状态
- [ ] 使用消息传递而非锁
- [ ] 阻塞操作在独立线程
- [ ] 异步代码用 tokio，同步代码用 std::thread

### 错误处理
- [ ] 使用 Result 而非 panic
- [ ] 错误类型有上下文信息
- [ ] 错误向上传播，在合适的层级处理
- [ ] 用户可见的错误有友好提示

---

## 性能审核标准

### 内存管理
- [ ] 避免不必要的 clone
- [ ] 大对象用引用传递
- [ ] 及时释放资源（文件句柄、网络连接）
- [ ] 避免内存泄漏（检查循环引用）

### 计算效率
- [ ] 避免重复计算（缓存结果）
- [ ] 选择合适的数据结构（HashMap vs Vec）
- [ ] 热点路径优化（避免分配、减少拷贝）
- [ ] 考虑并行化（rayon、tokio）

### IO 效率
- [ ] 网络 IO 用异步（tokio）
- [ ] 文件 IO 用 BufReader/BufWriter
- [ ] 避免频繁的小 IO（批量处理）
- [ ] 考虑零拷贝（sendfile、mmap）

---

## 安全审核标准

### 输入验证
- [ ] 所有外部输入必须验证
- [ ] 配置文件解析有错误处理
- [ ] HTTP 请求参数有校验
- [ ] 文件路径防止目录遍历

### 资源限制
- [ ] 防止无限循环
- [ ] 防止内存耗尽（限制缓冲区大小）
- [ ] 防止 CPU 耗尽（限制并发数）
- [ ] 防止文件描述符耗尽

### 权限控制
- [ ] 最小权限原则
- [ ] 敏感操作需要验证
- [ ] 日志不包含敏感信息

---

## 风格审核标准

### 命名规范
- 类型名：PascalCase（VideoProcessor）
- 函数名：snake_case（handle_message）
- 常量名：SCREAMING_SNAKE_CASE（MAX_BUFFER_SIZE）
- 模块名：snake_case（video_processor）

### 注释规范
```rust
/// 公共 API 文档注释（三斜杠）
/// 
/// # Arguments
/// * `config` - 配置对象
/// 
/// # Returns
/// 成功返回 Ok(())，失败返回错误
pub fn init(config: Config) -> Result<()> {
    // 实现细节注释（双斜杠）
    // 解释为什么这样做，而不是做了什么
}
```

### 格式规范
- 使用 rustfmt 自动格式化
- 行宽 100 字符
- 缩进 4 空格
- 导入按字母排序

---

## 审核检查清单

### PM 初审清单
```
[ ] cargo check 通过
[ ] cargo clippy 通过
[ ] 手动测试基本功能
[ ] 代码风格一致
[ ] 无明显逻辑错误
[ ] 错误处理完善
[ ] 注释清晰
```

### CEO 终审清单
```
[ ] 符合架构设计
[ ] 插件边界清晰
[ ] 消息设计合理
[ ] 无性能问题
[ ] 无安全隐患
[ ] 代码质量达标
[ ] 可维护性好
```

---

## 不合格处理

### 初审不合格
- PM 在 TEAM_CHAT.md 记录问题
- 开发者修复后重新提交
- 连续 3次不合格 → 绩效扣分

### 终审不合格
- CEO 在 TEAM_CHAT.md 详细说明问题
- 可能需要重新设计
- 严重问题 → 考虑换人

### 绩效影响
- 一次不合格：-1 分
- 严重问题（架构/安全）：-3 分
- 优秀代码（超出预期）：+2 分

---

## 审核时间要求

- PM 初审：2小时内完成
- CEO 终审：24小时内完成
- 紧急 bug 修复：1小时内完成

---

**文档版本**: v1.0  
**最后更新**: 2026-03-12  
**负责人**: 陈逸飞 (CEO)
