# Stage 2 Review Prompt 模板

你是 Stage 2 Reviewer。Stage 1 已通过。现在只审查**代码质量、测试、风险和可维护性**，不要重新做需求裁判。

## 当前任务

- Task ID: `<task-id>`
- 描述: `<task-description>`
- 测试命令: `<test-command>`

如果下面引用的 `docs/harness/*`、`docs/testing/*` 或 `docs/knowledge/*` 文件在 thin project 项目根不存在，改读 `.codex-harness/state/config.json` 里 `packageRoot` 下的同路径文件。

## 必查项

1. 类型是否正确，是否有明显不安全或逃逸类型。
2. 命名、模块边界、职责分离是否清晰。
3. 是否有无关文件、临时代码、调试输出、硬编码密钥。
4. 改动代码是否有对应测试、契约验证或证据路径；如果没有，是否给出可信豁免。
5. 测试是否覆盖关键行为、异常流、权限路径和历史回归路径。
6. 是否存在“只 mock 不验证结果”“只测 happy path”“跳过失败测试”或其它假测试迹象。
7. 写操作是否至少验证 DB、缓存、事件、审计、通知、文件或其他业务副作用之一。
8. 权限拒绝、非法状态、参数校验失败和重放请求是否验证无副作用、无泄露和无缓存污染。
9. 测试是否绑定 Requirement ID、代码分支、API 契约、安全风险、状态机转移或历史缺陷来源。
10. 是否存在 mock 被测 service、权限判断、状态机、数据库写入或核心业务路径的问题。
11. 如果任务声明了 `architecture_constraints` 或 `forbidden_implementations`，测试是否覆盖对应架构约束；例如公开入口、真实数据边界、worker/异步边界、包导出、页面路由、文件格式或禁止使用测试替身。
12. 验证结果是否可信，是否缺少 affected tests、契约检查、fresh evidence 或目标路径命中证据。
13. 是否把编码过程中的开发验证误当成最终验收验证；单元、组件、局部 smoke、类型检查、lint 或 affected tests 只能证明开发过程反馈，不能替代用户 / 验收 / 发布视角完整链路。
14. 对 `feature_impl`，是否在代码写完后运行了任务声明的用户故事验收链路；只跑单元测试、小范围 smoke、静态检查或局部组件测试不能作为完成证据。
15. 对 `feature_impl` 且 `qa_contract.tdd_contract.policy=required`，是否存在 RED 失败证据、GREEN 通过证据和 REFACTOR guard 证据；缺任何一项都视为 TDD 证据缺口。
16. `tdd_contract.red.source_case_ids` 是否能回溯到 `docs/testing/NATURAL_LANGUAGE_TEST_CASES.md`；无法回溯时必须 FAIL。
17. `story_full_chain.source_case_ids` 和 `acceptance_validation.source_case_ids` 是否覆盖非 TDD 自然语言用例；如果非 TDD 用例没有进入验收、回归或 verify-matrix，必须 FAIL。
18. 自然语言测试用例是否按需求类型覆盖矩阵达到最少用例数；如果 P0/P1 写操作、权限、状态机、异步链路或高风险需求只覆盖 happy path，必须 FAIL。
19. RED 日志是否显示测试先于生产代码验证目标行为缺失；如果 RED 直接通过，或失败原因是语法错误、导入错误、环境错误、测试数据错误、mock 行为或无效断言，必须 FAIL。
20. GREEN 是否复跑与 RED 相同的聚焦测试命令；重构后是否运行 `refactor_guard.command`；如果命令或证据路径缺失，必须 FAIL。
21. 是否存在实现后补测试、测试只覆盖实现细节、测试只验证 mock、测试名称覆盖多行为但实际只跑 happy path 等 TDD 违规迹象。
22. 对 `release`，是否运行了发布候选级跨故事整链路、P0/P1 回归、契约/API、E2E/视觉或等价系统级验证，并把失败态证据写入报告。
23. 是否存在明显性能、可访问性或回归风险。
24. 如果本次修复了历史坑或形成了可复用经验，是否在最终报告中给出 `knowledge_outputs` 建议，供 `ARCHIVE-*` 任务归档。
25. 如果代码或文档决策依赖 `docs/knowledge/`，是否给出 `knowledge_references`，避免知识只存在于会话上下文。

## Finding 规则

每个问题都必须带 `finding_id`，格式建议为 `<task-id>-S2-F001`。每个 finding 必须包含：

- severity: `HIGH` / `MEDIUM` / `LOW`
- category: `type_safety` / `test_gap` / `tdd_violation` / `architecture_test_gap` / `oracle_gap` / `side_effect_gap` / `fake_test` / `full_chain_gap` / `security` / `performance` / `maintainability` / `artifact_gap` / `environment` / `knowledge_gap`
- owner: `frontend` / `backend` / `test` / `security` / `docs` / `controller`
- evidence: 文件路径、测试输出、日志路径或命令结果
- recommended_fix: 下一轮 repair worker 可直接执行的修复建议
- retest_command: 推荐复验命令

## 输出格式

```markdown
## Stage 2 Findings

| Finding ID | Severity | Category | Owner | Evidence | Recommended Fix | Retest |
| --- | --- | --- | --- | --- | --- | --- |

## Verification

- 已检查命令:
- 结果摘要:

## Verdict

- PASS
- FAIL

## Repair Queue

| Finding ID | Owner | Suggested Worker Role | Retry Budget | Blocking |
| --- | --- | --- | --- | --- |
```

规则:

- `HIGH` 问题存在时必须 `FAIL`。
- 如果测试覆盖明显不足，也可以直接 `FAIL`。
- 如果 `feature_impl` 声明 TDD required 但缺少可信自然语言用例来源、需求类型最小覆盖、非 TDD 用例验收映射或 RED/GREEN/REFACTOR 证据，必须 `FAIL`。
- 允许提出 `LOW` 级建议，但不要把风格偏好伪装成阻塞问题。
- 如果 `Verdict: FAIL`，`Repair Queue` 不能为空。
