--- name: review-pr description: 在 kimi-code 仓库里 review 一个 PR 时使用:按 PR 模板逐节核对描述与 diff,并单独做一轮"回归与用户影响"评审,给出影响等级与评审摘要,评审摘要用用户当前使用的语言。 disable-model-invocation: true --- # Review PR 这个仓库过去的回归大多不是逻辑错误,而是"改动相对于自身意图是对的,但悄悄改掉了某个现有人群依赖的行为":方言分支收窄、默认值翻转、删 system prompt 句子、重构或移植时丢掉旧路径的功能、修复引入启动时序变化。通用 review 会把这类"有意的功能变更"排除在 bug 之外,所以这里把它单列成一轮。 评审判据只有一条:**改动前能工作的任何输入(配置键、环境变量、命令行参数、provider 响应形态、旧版本写的会话数据、客户端请求、hook 载荷)改动后必须行为不变,除非 PR 明确声明了这个变化并给出了退路。** ## 工作流 1. 拉 PR 元数据与描述: ```bash gh pr view --json title,body,url,files,additions,deletions,baseRefName,headRefName ``` 2. 读完整 diff(大 PR 按文件分批读): ```bash gh pr diff ``` 3. 读足够的周边代码来验证描述里的每个断言。只看 diff 看不出"改动前谁走到这个分支"。 4. **第一遍:定性。** 判断改动类型,决定第三遍的深度,见"第一遍:定性"。 5. **第二遍:按模板逐节核对。** 见"模板逐节核对"。 6. **第三遍:回归与用户影响。** 尽量用一个独立子 agent 跑:只给它 PR 号、base 与 head、两三句改动简介和 `surfaces.md` 的路径,不给它作者关于影响范围的结论,让它先从 diff 和代码独立列清单,回来后再与作者填的表对比。没有子 agent 能力时自己按同样顺序做:先列清单,再读作者的表。见"第三遍:回归与用户影响"。 7. 用用户当前使用的语言写评审摘要,格式见"输出"。 ## 第一遍:定性 | 改动类型 | 第三遍深度 | |---|---| | 纯内部重构、测试、文档、测试 CI | 只需给出"没有可观测变化"的证据:哪些分支、默认值、契约文件没动 | | 发布与打包:release、native 构建、VS Code 发布工作流,打包脚本,web 产物同步 | 全做,人群按安装方式与平台分:npm 包、各平台 native 二进制、VS Code 市场、内置 web 产物 | | 新增功能,不动既有路径 | 只查新分支是否抢走了既有输入:新增条件是否排在旧条件之前 | | 行为变更、默认值翻转、校验或权限收紧或放宽 | 全做 | | prompt 文本变更:system prompt、工具描述、提醒、overlay、内置 skill | 全做,且每一句改动单独成行 | | 移植、替换旧路径、大重构:v1 到 v2、runtime binding、协议替换 | 全做,并要求作者给出旧路径功能清单 | | 协议、磁盘格式、SDK 导出、hook 载荷、命令行契约变化 | 全做,并点名仓库外的消费方 | | 修复类改动改了启动顺序、生命周期、异步时序 | 全做,重点看谁依赖原来的顺序 | 一个 PR 可以同时属于多类,按最重的那类处理。 ## 第三遍:回归与用户影响 ### 1. 行为变化清单 列出 diff 改变的每一个可观测行为,包括作者说"不变"的和作者认为"内部"的。内部包会打进 CLI 发布包,"内部"不等于用户无感。 每一行记录:行为、变化前、变化后、变化类型(新增 / 修改 / 删除 / 默认翻转 / 收紧 / 放宽)、证据(改动前后各一个 `file:line`,一侧不存在时给可达路径)。 读法: - 对每个被删除或被收窄的分支、条件、默认值、句子,问"改动前谁走到这里,改动后他们去哪了"。 - 对每个新增的分支或条件,问"哪些既有输入现在会先命中新分支"。#3492 的回归就是这样产生的:数组字段存在时不再读字符串字段,而 OpenRouter 形态的网关两者同时发。 - 测试里"把旧断言改成新行为"的改动是行为变化的直接证据,逐条对应到清单。 - 先看 diff 文件列表有没有命中 `surfaces.md` 的"触发线索"。命中的 surface 必须在清单里有对应行,否则就是漏项。 ### 2. 受影响人群 每一行对应到 `surfaces.md` 里的具体人群,写出人群名字和"这个人群存在"的证据:文档页、issue、配置示例、provider 载荷形态。找不到人群的,不进 finding,进"待作者确认"。 ### 3. 影响等级 等级只由改动的事实决定,不看 changeset、文档、测试这些补救状态。三步判定: 1. 数据丢失、安全边界放宽、老数据不可读、某人群的功能整体不可用:直接 L3。 2. 否则,可感知且有一键退路(config、env、flag):L1;可感知且无退路,旧行为不可恢复:L2;无可观测变化:L0。 3. 静默升级:用户提供的输入(配置、环境变量、数据、请求字段)被忽略或丢弃,且没有任何错误信号,用户无法自行发现:升一级,最高 L3。行为公开地变了、用户能在输出里看到的,不算静默。 广度三档,必须写出人群名字:全体用户 / 某类配置或平台人群 / 边缘环境。 每一行单独定级,PR 的等级取最高。静默升级的理由:没有信号就没有上报,回归会一直存活到有人偶然发现。 ### 4. 补救核对 固定四问,逐条回答有 / 无 / 不适用,并给出证据: - 退路开关:有没有 config、env 或 flag 能恢复旧行为。 - changeset:有没有点明用户**失去了什么**,而不只是新默认是什么;没有退路时是否明说旧行为不可恢复。 - 老数据与老客户端:旧版本写的会话、迁移来的数据、上一版发布的客户端(desktop、web、VS Code、ACP)是否仍然可用;回滚到上一版是否安全。 - guard 测试:有没有一条测试把**未被改动的人群**的旧行为钉住。 再加一问:`docs/en` 与 `docs/zh` 里对这个 surface 的承诺是否同步更新。 ### 等级对应的处理要求 - L3:建议阻塞。必须补 guard 测试,并提供退路、flag 门控或迁移,缺一不可合。 - L2:需要维护者在 PR 里显式拍板;changeset 必须写明失去的行为;文档同步。 - L1:核对 changeset 与文档即可。 - L0:一句话说明为什么是 L0,给出证据。 ### finding 与"待作者确认"的界线 - finding 必须同时有:改动前后各一处 `file:line` 证据,和一个具名人群及其存在证据。两者缺一,降级为"待作者确认"。新增整个文件或删除整段实现时一侧天然为空,这时给存在的那一侧加上受影响可达路径的 `file:line` 即可。 - "待作者确认"最多 5 条,按可能的影响等级排序,多出来的只报数量。 - 不要报:PR 之前就存在的问题(严重的单独一句"顺带发现")、lint 和类型检查会抓的问题、风格问题。 - 不要把这些当成"无影响"的证据:作者说"不变"、没有测试引用被删的句子、改动只在内部包。 ## 模板逐节核对 输出为中文时节名用下表的译名,其他语言沿用模板原文的节名: | English | 中文 | |---------|------| | Requirement or Bug | 需求或 Bug | | Bug Reproduction Steps | Bug 复现步骤 | | Root Cause | 根本原因 | | Code Changes | 代码变更 | | Behavior Changes and Affected Users | 行为变化与受影响人群 | | Checklist | 检查清单 | 旧 PR 若仍用 `Impact Scope` 这一节,按"行为变化与受影响人群"的标准核对。 ### 需求或 Bug - 关联的 issue 是否有效、相关? - 没有 issue 时,需求是否用一两句话说清楚了? ### Bug 复现步骤 - bug 类 PR:步骤是否清晰、可复现? - 按步骤能否在 base 分支上确认 bug 存在? ### 根本原因 - bug 类 PR:根因解释是否令人信服? - 描述的根因与 diff 是否一致? - 是根本修复还是绕过,是否说清楚了? ### 代码变更 - 描述与实际 diff 是否一致? - 可视化大纲(diff 块、调用树、文件树)是否准确、有帮助? - 方案是否合理?有没有更简单的替代? - 有没有作者漏掉的边界情况? ### 行为变化与受影响人群 - 把第三遍独立列出的清单与作者填的表逐行对比:作者漏列的行为就是 finding;作者写了但你没找到证据的,进"待作者确认"。 - 人群是否具名,还是只写了"部分用户"? - 写了 `None` 的,证据是否成立? - 受影响模块与测试覆盖是否与 diff 文件列表一致?有没有带风险的未测路径? ### 检查清单 - 适用的项是否都勾了? - 标为"不需要"的项,你是否同意? ## 输出 用用户当前使用的语言,按下面的顺序,示例为中文: ```markdown ## 结论 一句话:可合 / 需修改 / 建议阻塞。附 PR 影响等级与改动类型。 ## 回归与用户影响 - 改动类型:… - 影响等级:Lx(广度:…;是否静默:…) | 行为 | 变化前 | 变化后 | 受影响人群 | 证据 | 等级 | 退路 | |---|---|---|---|---|---|---| 补救核对: - 退路开关:… - changeset 是否点明失去的行为:… - 老数据与老客户端:… - guard 测试:… - 文档:… 待作者确认(最多 5 条): 1. … ## 模板逐节核对 逐节说明是否填写充分,指出缺失、不准确、与 diff 不一致之处。 ## 需要修改的项 可执行的列表;没有则写"无"。 ``` ## 复盘回填 每次线上回归复盘后,把新发现的人群或触发线索补进 `surfaces.md`,并在它的"历史案例"里加一行。清单不更新就会过时。