---
name: request-review
description: >
  向跨家族 peer-reviewer 发送 review 请求（含五件套）。
  Use when: 自检通过后准备请其他猫 review。
  Not for: 收到 review 结果（用 receive-review）、自检（用 quality-gate）。
  Output: Review 请求信（存档到 review-notes/）。
triggers:
  - "请 review"
  - "帮我看看"
  - "request review"
---

> **SOP 位置**: 本 skill 是 `sop-definitions/development.yaml` stage `review` 的执行细节。
> **SOP definition**: `sop-definitions/development.yaml` stage `review`。
> **上一步**: `quality-gate` | **下一步**: `receive-review`

# Request Review

把改动送到 reviewer 眼前，让 reviewer 花时间在重点上——不是基础检查上。

## 核心知识

### 前置条件（三项都要满足才能发请求）

| 条件 | 检查方式 | 未满足时 |
|------|----------|----------|
| `quality-gate` 通过 | 有本轮 gate report | BLOCKED — 先跑 quality-gate |
| 测试全绿 | 附测试命令输出 | BLOCKED — 修到绿灯再发 |
| 原始需求可引用 | Discussion/Interview 文档路径 + ≤5 行摘录 | BLOCKED — reviewer 有权拒绝审查 |
| Architecture ownership 已声明 | 附 `Architecture cell` / `Map delta` / `Why` | BLOCKED — 回 Design Gate / plan 补齐 |
| 前端改动已浏览器实测 | Playwright/Chrome 截图证据 | BLOCKED — 涉及前端必须真实打开浏览器验证 |
| 根目录工件闸门通过 | 无根目录媒体/设计工件（工作树 + 已提交差异） | BLOCKED — 先归档/清理再发 |

> **教训（F041）**：review 信只附了 spec，没附原始 Discussion。结果 10 轮云端 review 全在抓 edge case，没有一轮说"UI 不可用"。Reviewer 没有上下文，无法做愿景验证。

### Reviewer 匹配规则

从 `cat-config.json` 动态匹配，**三猫都不能 review 自己的代码**：

```
优先级（从高到低）：
1. 跨 family（author family ↔ reviewer family）
2. peer-reviewer 角色标记
3. 当前可用（无正在进行的 review 任务）
```

### 工具落点自检（Codex apply_patch 陷阱）

在 worktree 分支上用 `apply_patch` 改代码时，改动可能落到主 worktree（`cat-cafe/`）而非当前 worktree。**发请求前必须确认**：

```bash
git status  # 只在目标 worktree 有变更，主 worktree 干净
```

## 流程

```
BEFORE 发 review 请求:

1. 确认 quality-gate 已通过（拿到本轮 gate report）
2. 确认测试全绿（附这次真实运行的输出）
3. 找到原始 Discussion 文档路径 + 摘录 ≤5 行铲屎官原话
4. 抄入 Architecture ownership 三字段（F191）：
   - `Architecture cell: ...`
   - `Map delta: none | update required | new cell required`
   - `Why: ...`
5. 检查 worktree 工具落点（git status 干净）
5.5 检查根目录工件闸门（两条都要为空）：
   - `git status --short | rg '^.. [^/]+\.(png|jpe?g|webp|gif|webm|mp4|mov|wav|pdf|pen)$'`
   - `git diff --name-only origin/main...HEAD | rg '^[^/]+\.(png|jpe?g|webp|gif|webm|mp4|mov|wav|pdf|pen)$'`
6. 匹配 reviewer（跨 family 优先）
7. 用模板写 review 请求 → 存档 mailbox
8. 发给 reviewer
```

## Review 请求

**使用 `refs/review-request-template.md` 模板**（单一真相源，不在此重复）。

关键字段提醒：
- **Original Requirements**: 必填，≤5 行铲屎官原话 + 来源文档路径，并明确请 reviewer 对照判断
- **Architecture Ownership**: 必填，列 `Architecture cell` / `Map delta` / `Why`，并请 reviewer 检查 diff 是否与 `Map delta` 一致
- **Open Questions**: 分为两类——**技术 OQ**（给 reviewer 的，如实现正确性）和 **价值 OQ**（需要 CVO 判断的，附 Decision Packet——格式见 `refs/decision-matrix.md`）。不混在一起
- **自检证据**: 附 quality-gate report 摘要 + 测试命令输出 + 根目录工件闸门输出

**F191 reviewer 视角**：
- PR 是否新建了并行 `Store` / `Queue` / `Router` / `Adapter` / `Dispatcher` / `Binding`？
- `Map delta: none` 是否与 diff 一致？
- 若修改了 `docs/architecture/ownership/cells/*.md`，是否真是 owner/boundary/extension point/canonical anchor 变化？

存档：`review-notes/YYYY-MM-DD-{topic}-review-request.md`

### Review 沙盒约定（review-target-id）

Review 请求必须包含 `review-target-id`，reviewer 据此创建标准路径的沙盒，merge-gate 回收时依赖此 ID。

**review-target-id 推导规则：**
- 分支名含 `fNNN` → 取 feature ID（如 `f113`）
- 无 Feature ID → 取 branch slug（如 `fix-redis-keyprefix`）

**在 review 请求信中附上：**
```
Review-Target-ID: {id}
Branch: {branch-name}
```

**Reviewer 创建沙盒的标准路径：**
```
/tmp/cat-cafe-review/{review-target-id}/{reviewer-handle}
```
例：`/tmp/cat-cafe-review/f113/codex`

**Reviewer 启动命令（统一入口）：**
```
pnpm review:start
```
说明：
- 该入口默认在 review 沙盒内运行，自动分配隔离端口（起点 3201/3202）
- review 请求信里必须记录实际启动端口（web/api）

沙盒必须是 detached HEAD / read-only。要改代码 = TAKEOVER，开正式 worktree。

## Block 场景

**❌ 没有 quality-gate 报告**

```
⚠️ BLOCKED — 缺少 quality-gate 自检报告

请先运行 quality-gate skill，确认：
- 原始需求逐项对照
- 测试/lint/build 全绿
- 有本轮输出证据

再发 review 请求。
```

**❌ 没有原始需求摘录**

```
⚠️ BLOCKED — 缺少原始需求文档

请附上：
- 铲屎官 Discussion/Interview 文档路径
- ≤5 行铲屎官原话摘录

Reviewer 不只审代码质量，还要判断"这是铲屎官要的吗？"
没有原始需求 = Reviewer 无法做愿景验证 = 有权拒绝审查。
```

**❌ 测试未通过**

```
⚠️ BLOCKED — 测试未全绿

请先修复，再发请求：
  pnpm test                              # 必须 0 failures
  pnpm --filter @cat-cafe/api test:redis # Redis 改动额外跑

Reviewer 不应该是第一个发现测试失败的人。
```

## Reviewer 视角：Failure-Mode Sweep Report（§16e）

R2+ 且同型 finding 再次出现时，reviewer 应期待 author 在 PR comment 提交 **Failure-Mode Sweep Report**（pattern name / scanned N / fixed / N/A 列表）。没有 Sweep Report = author 没做 failure-mode audit → reviewer 有权要求补做后再继续 review，不浪费 round 逐点抓同型。

## 和其他 skill 的区别

| Skill | 关注点 | 时机 |
|-------|--------|------|
| `quality-gate` | 自检（spec 对照 + 证据） | review **之前** |
| **request-review（本 skill）** | 把改动送到 reviewer 面前 | 自检通过**之后** |
| `receive-review` | 处理 reviewer 的反馈 | 收到 review **之后** |
| `merge-gate` | 合入前的门禁 + PR + 云端 review | reviewer 放行**之后** |

## 下一步

Review 请求发出后 → 等 reviewer 回复 → **直接加载 `receive-review`** skill 处理反馈（SOP stage `review`）。SOP 链条自动推进，不要停下来问铲屎官（§17）。
