review · git:20260817.d00a470 · 2026-08-17 · sha256 115946b114eff565

review git:20260817.d00a470A

Immutable. This exact content is served forever at /api/v1/blob/115946b114eff565.

---
name: review
description: 审查一批改动时用。缺陷优先,并按这个仓库特有的失效方式去找问题——那些编译通过、类型正确、看起来合理的写法。
---

# 审查改动

## 先定范围

```bash
git diff                    # 未提交的
git diff --stat master...HEAD   # 相对基线分支的整条分支
```

范围大的时候起一个 `explore` 子 agent 去摸背景(它只读、便宜),自己留着
上下文做判断。

## 该找什么

这个仓库的 bug 基本都是**「编译通过、类型正确、看起来合理」**的那种。所以
不要花力气在命名、格式、能不能少写两行上——那些 clippy 和 fmt 管了。按下面
这几类去找:

**1. 静默的错答案。** 结果不完整而没说出来是最典型的:截断了、超时提前收工、
搜索没走完、工具结果被落盘替换成预览——只要模型可能把半份东西当全部,就是
一个 bug,而它不报错不崩,只是结论错。

真实案例:搜索因超时收工且没有匹配时返回「没有找到」,那是把「没搜」说成
「不存在」,模型据此断定这东西不存在。

**2. fail-closed 的方向反了。** 认不出的输入、解析失败、超时、无人应答,
必须落在保守那一侧。逐项问:这条路上「不确定」会变成「放行」吗?

- 权限:`ask` 在无人应答时必须收敛成 **deny**,不是 allow。
- 工具:认不出的类型/参数按「会写」算,不按「只读」算。
- 判危:判不准必须是 Hold,不能是 Safe。

**3. 安全检查被绕过。** 决策链的顺序是有意义的:安全检查排在 bypass 模式
**前面**,工具自己返回的 `Allow` **不是终点**。改动里如果有提前 `return`、
新增的短路、或者把 `Passthrough` 改成 `Allow`,都要问一遍它是不是跳过了
第 4 步。

同类:hook 的 `allow` 不能压过 settings 的 deny/ask;分类器的权力不能超过
bypass 模式(判据是 `yields_to_bypass()`)。

**4. 有实现没测试守着。** 这是最难看出来的一类,而仓库里真出过:决策链
第 3 步拿到工具的 `Allow` 后必须继续走安全检查,实现是对的,但**没有任何
测试守着那一行**。

审查时对每个关键分支问:把这行删掉/改反,会有测试红吗?答不上来就是个发现。
碰上权限层、路径围栏、文件工具、进程执行器,直接建议跑 `mutate`。

**5. 断言的是「失败了」还是「以正确的理由失败」。** 只断言 `!is_ok` 往往
不够。同一个拒绝,理由从「你还没读过」变成「文件内容对不上」,对模型是
实打实的区别——前者让它先读,后者让它以为有人在并发改文件,白跑一轮。

**6. prompt cache 前缀被打碎。** 工具注册顺序变了、system prompt 分段动了、
技能清单顺序不稳定(`read_dir` 的随机顺序)、beta header 集合中途变化——
这些都不报错,只是悄悄变贵。

**7. 注入的边界被绕开。** 内核里直接 `SystemTime::now()` / `std::fs` /
`std::process` / `tokio::time::sleep`,或者给它们加 `#[allow(clippy::disallowed_methods)]`
而理由不成立。黄金回放要成立就靠这条。

**8. 协议改动的两侧。** 改了 `crates/riot-protocol` 的类型:`pnpm gen` 跑了吗?
新字段带 `#[serde(default)]` 吗(不带就读不了老配置/老 transcript,表现为
「我配的东西全没了」)?枚举加了 variant,穷举 match 那几处都重审过吗?

## 怎么报

按**严重程度**排,不按文件顺序。每条给:

- 位置(用 `起始行:结束行:路径` 的代码引用格式,界面上能点开);
- **这个问题会怎么表现**——具体症状,不是「可能有风险」。说不出症状的
  发现多半不是发现;
- 建议的改法,或者「需要一个测试守着这里」。

最后单独说一句「没发现问题的部分」范围有多大——审了 3 个文件和审了 30 个
文件,同一句「看起来没问题」的含义完全不同。

## 不要做的事

不要顺手改。审查的产出是判断,改不改、怎么改由用户决定。