feat(req): 代码评审增加五视角扫描法
CR 从"Git diff + 检查清单"升级为结构化的五视角对抗性审查: - 攻击者:跨租户泄露、越权、注入 - 泄露者:错误消息/日志/响应信息泄露 - 并发者:竞态、幂等、锁粒度 - 边界者:参数校验、类型溢出 - 依赖者:超时、降级、token 区分 每个视角配具体扫描 checklist,CR 报告模板增加五视角分节, /req cr 流程从 1 行扩展为 8 步完整链路。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -125,13 +125,53 @@ Gate 4: 完整性检查 ── 三段式完整 + 验收标准 ≥ 2 条 + PRD
|
|||||||
|
|
||||||
| 离开阶段 | 检查标准 |
|
| 离开阶段 | 检查标准 |
|
||||||
|----------|---------|
|
|----------|---------|
|
||||||
| **review** | CR 任务有文档,字数 ≥ 500,含 `file:line` 代码引用,含结论章节 |
|
| **review** | CR 任务有文档,字数 ≥ 500,含 `file:line` 代码引用,含五视角扫描结果,含结论章节 |
|
||||||
| **testing** | 测试任务有文档,含测试结果表格,含通过/失败结论 |
|
| **testing** | 测试任务有文档,含测试结果表格,含通过/失败结论 |
|
||||||
| **staging** | 部署任务有文档,含健康检查结果 |
|
| **staging** | 部署任务有文档,含健康检查结果 |
|
||||||
|
|
||||||
未通过 → AskUserQuestion(补充文档 or 强制跳过+记录原因)
|
未通过 → AskUserQuestion(补充文档 or 强制跳过+记录原因)
|
||||||
|
|
||||||
### CR 报告最低模板
|
### CR 五视角扫描法
|
||||||
|
|
||||||
|
**核心原则**:实现阶段关注"怎么让它跑通",评审阶段关注"怎么让它出错"。AI 必须**切换到对抗性思维**,逐一用以下 5 个视角扫描代码。
|
||||||
|
|
||||||
|
| 视角 | 思维模式 | 扫描问题 |
|
||||||
|
|------|---------|---------|
|
||||||
|
| **1. 攻击者** | "我怎么绕过/滥用它?" | 跨租户数据泄露、越权访问、参数注入、重放攻击 |
|
||||||
|
| **2. 泄露者** | "它暴露了什么不该暴露的?" | 错误消息泄露信息、日志记录敏感数据、响应包含内部细节 |
|
||||||
|
| **3. 并发者** | "两个请求同时来会怎样?" | 竞态条件、双重扣款、幂等性缺失、锁粒度 |
|
||||||
|
| **4. 边界者** | "极端输入会怎样?" | 空值/零值/负值/超长字符串、类型溢出、分页越界 |
|
||||||
|
| **5. 依赖者** | "外部服务挂了会怎样?" | 超时处理、重试策略、降级方案、连接泄露 |
|
||||||
|
|
||||||
|
**每个视角的具体扫描清单**:
|
||||||
|
|
||||||
|
#### 视角1: 攻击者(多租户安全)
|
||||||
|
- [ ] 所有 Store 层查询是否带 `tenant_id` 过滤?(特别是通过 ID 直接查询的方法)
|
||||||
|
- [ ] 用户只能操作自己的数据?(consumer_id 校验)
|
||||||
|
- [ ] URL/请求参数是否有注入风险?(SQL、URL、命令注入)
|
||||||
|
- [ ] 外部输入是否直接拼接到查询/URL?(应使用参数化查询或编码)
|
||||||
|
|
||||||
|
#### 视角2: 泄露者(信息安全)
|
||||||
|
- [ ] 错误消息是否泄露业务状态?(如"手机号未注册"暴露用户存在性)
|
||||||
|
- [ ] 日志是否打印了密码、token、密钥?
|
||||||
|
- [ ] 响应是否包含不必要的内部字段?(如内部 ID、数据库字段名)
|
||||||
|
|
||||||
|
#### 视角3: 并发者(数据一致性)
|
||||||
|
- [ ] 涉及金额变更是否使用事务 + 悲观锁?
|
||||||
|
- [ ] 关键操作是否有幂等保护?(bizNo 唯一索引)
|
||||||
|
- [ ] 全局状态(如进程内计数器)重启后是否安全?
|
||||||
|
|
||||||
|
#### 视角4: 边界者(健壮性)
|
||||||
|
- [ ] 必填参数是否有 binding:"required" 校验?
|
||||||
|
- [ ] 数值参数是否有范围校验?(min/max)
|
||||||
|
- [ ] 分页参数是否有默认值和上限?
|
||||||
|
|
||||||
|
#### 视角5: 依赖者(可靠性)
|
||||||
|
- [ ] HTTP 客户端是否设置超时?
|
||||||
|
- [ ] 外部 API 调用失败是否有合理的错误处理?
|
||||||
|
- [ ] token 类型是否可区分?(access vs refresh 不同过期策略)
|
||||||
|
|
||||||
|
### CR 报告模板
|
||||||
|
|
||||||
```markdown
|
```markdown
|
||||||
## 代码评审报告 - {需求标题}
|
## 代码评审报告 - {需求标题}
|
||||||
@@ -141,10 +181,32 @@ Gate 4: 完整性检查 ── 三段式完整 + 验收标准 ≥ 2 条 + PRD
|
|||||||
### 变更概要
|
### 变更概要
|
||||||
{1-3 句描述}
|
{1-3 句描述}
|
||||||
|
|
||||||
### 审查发现
|
### 五视角扫描结果
|
||||||
| 严重度 | 文件:行号 | 描述 | 建议 |
|
|
||||||
|--------|----------|------|------|
|
#### 1. 攻击者视角
|
||||||
| {Critical/High/Medium/Low} | {file:line} | {问题} | {建议} |
|
{扫描发现,或 "未发现问题"}
|
||||||
|
|
||||||
|
#### 2. 泄露者视角
|
||||||
|
{扫描发现,或 "未发现问题"}
|
||||||
|
|
||||||
|
#### 3. 并发者视角
|
||||||
|
{扫描发现,或 "未发现问题"}
|
||||||
|
|
||||||
|
#### 4. 边界者视角
|
||||||
|
{扫描发现,或 "未发现问题"}
|
||||||
|
|
||||||
|
#### 5. 依赖者视角
|
||||||
|
{扫描发现,或 "未发现问题"}
|
||||||
|
|
||||||
|
### 审查发现汇总
|
||||||
|
| 严重度 | 文件:行号 | 视角 | 描述 | 建议 |
|
||||||
|
|--------|----------|------|------|------|
|
||||||
|
| {Critical/High/Medium/Low} | {file:line} | {攻击者/泄露者/...} | {问题} | {建议} |
|
||||||
|
|
||||||
|
### 测试覆盖
|
||||||
|
| 测试类型 | 数量 | 状态 |
|
||||||
|
|----------|------|------|
|
||||||
|
| ... | ... | ... |
|
||||||
|
|
||||||
### 结论
|
### 结论
|
||||||
{通过 / 有条件通过 / 需修改}
|
{通过 / 有条件通过 / 需修改}
|
||||||
@@ -207,7 +269,15 @@ Gate 4: 完整性检查 ── 三段式完整 + 验收标准 ≥ 2 条 + PRD
|
|||||||
2. `ai-proj task start --id <task_id>` 更新任务状态为开发中
|
2. `ai-proj task start --id <task_id>` 更新任务状态为开发中
|
||||||
3. `/pr start` 从 origin/main 建分支
|
3. `/pr start` 从 origin/main 建分支
|
||||||
|
|
||||||
**`/req cr [REQ-ID]`** — 代码评审:Git diff 摘要 + 生成检查清单(前置:开发任务完成)
|
**`/req cr [REQ-ID]`** — 代码评审(前置:开发任务完成):
|
||||||
|
1. `ai-proj req tasks --id <id>` 确认所有 implementation 任务已完成
|
||||||
|
2. `git diff` / `find` 确定变更范围(文件数、行数)
|
||||||
|
3. 读取所有变更文件源码(非 test 文件)
|
||||||
|
4. **五视角扫描**:逐一用攻击者/泄露者/并发者/边界者/依赖者视角审查
|
||||||
|
5. `ai-proj task create` 创建【代码评审】任务并关联需求(linkRole=code_review)
|
||||||
|
6. `ai-proj create-and-attach` 附加 CR 报告文档(必须含五视角扫描结果)
|
||||||
|
7. 展示发现摘要,AskUserQuestion 确认是否创建 bug 修复任务
|
||||||
|
8. 若有 High/Critical 发现 → `ai-proj task create` 创建关联修复任务
|
||||||
|
|
||||||
**`/req test [REQ-ID]`** — 测试(前置:代码评审通过),遵循 dev-test 技能的 5-Gate 流程
|
**`/req test [REQ-ID]`** — 测试(前置:代码评审通过),遵循 dev-test 技能的 5-Gate 流程
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user