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:
2026-03-14 08:12:41 +10:30
parent 43585b8504
commit f7f5428812

View File

@@ -125,13 +125,53 @@ Gate 4: 完整性检查 ── 三段式完整 + 验收标准 ≥ 2 条 + PRD
| 离开阶段 | 检查标准 |
|----------|---------|
| **review** | CR 任务有文档,字数 ≥ 500`file:line` 代码引用,含结论章节 |
| **review** | CR 任务有文档,字数 ≥ 500`file:line` 代码引用,含五视角扫描结果,含结论章节 |
| **testing** | 测试任务有文档,含测试结果表格,含通过/失败结论 |
| **staging** | 部署任务有文档,含健康检查结果 |
未通过 → 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
## 代码评审报告 - {需求标题}
@@ -141,10 +181,32 @@ Gate 4: 完整性检查 ── 三段式完整 + 验收标准 ≥ 2 条 + PRD
### 变更概要
{1-3 句描述}
### 审查发现
| 严重度 | 文件:行号 | 描述 | 建议 |
|--------|----------|------|------|
| {Critical/High/Medium/Low} | {file:line} | {问题} | {建议} |
### 五视角扫描结果
#### 1. 攻击者视角
{扫描发现,或 "未发现问题"}
#### 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>` 更新任务状态为开发中
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 流程