## 功能概述 **目标**: 决定 `REVIEW_ENGINE` 取到未知值时应该静默回落到 agy,还是显式失败。 **动机**: 现状是静默回落。这是 #146 引擎接口重构时**刻意保留**的既有语义,不是设计选择——当时的约束是零行为变更,策略决定被明确推给本 issue。 ## 当前状态 `plugins/plan-review/scripts/plan-review.sh` 的引擎白名单: ```bash case "$REVIEW_ENGINE" in claude) ENGINE_LIB="claude.sh" ; ENGINE_CMD="claude" ;; codex) ENGINE_LIB="codex.sh" ; ENGINE_CMD="${CODEX_BIN:-codex}" ;; *) ENGINE_LIB="agy.sh" ; ENGINE_CMD="agy" ;; esac ``` `*)` 吞掉一切未知值。重构前的脚本只对 `claude` 和 `codex` 做特判,其余全落 agy 路径——包括默认值 `gemini`,也包括 `REVIEW_ENGINE=gemni` 这种拼写错误。 ## 问题 拼错引擎名不会有任何提示,用户以为在用 codex,实际一直在跑 agy。审阅结果里的 `Red Team Review — <engine>` 头部会显示用户输入的原值(如 `gemni`),进一步掩盖了实际用的是别的引擎。 ## 三个候选 | 方案 | 行为 | 代价 | |------|------|------| | A. 维持现状 | 未知值静默走 agy | 拼写错误无提示,可能长期误用 | | B. 未知值 fail-open + WARNING | 走 allow + `[WARNING] 未知 REVIEW_ENGINE=x`,跳过审阅 | 拼错就等于关掉审阅,可能比静默降级更糟 | | C. 未知值回落 agy 但记 WARNING 日志 + stderr | 行为同 A,但用户能看见 | 需要区分「显式 gemini / 未设」与「真未知值」,否则默认路径每次都刷警告 | 倾向 **C**:拼错的代价应该是「看得见的提示」,而不是「静默误用」(A)或「静默关掉审阅」(B)。实现上把 `gemini` 从 `*)` 提出来做显式分支,`*)` 才是真未知值。 注意 B 有个反直觉的风险:审阅是质量门禁,因为一个拼写错误就整体跳过,比降级到另一个可用引擎更危险。 ## 实现步骤 1. [ ] 定方案(需要一次决策,不是纯实现) 2. [ ] `gemini` 提为显式 case 分支,`*)` 只匹配真未知值 3. [ ] 按选定方案处理 `*)` 4. [ ] 补 bats:显式 `gemini` 无警告;未设(默认)无警告;未知值按选定行为 ### 涉及文件 | 文件 | 变更类型 | 说明 | |------|----------|------| | `plugins/plan-review/scripts/plan-review.sh` | 修改 | 引擎白名单 case | | `plugins/plan-review/tests/plan-review.bats` | 修改 | 新增用例 | | `plugins/plan-review/README.md` | 修改 | 若行为变更需同步文档 | ## 兼容性考虑 - 方案 B、C 都是**行为变更**,需按版本铁律同步 bump `plugin.json` 与 `marketplace.json` - 方案 B 会改变现有用户的实际行为(拼错的人从"跑 agy"变成"不审阅"),风险高于 C ## 验证方法 - [ ] `REVIEW_ENGINE=gemini` 显式设置 → 无警告,走 agy - [ ] `REVIEW_ENGINE` 未设 → 无警告,走 agy(默认路径不能刷警告) - [ ] `REVIEW_ENGINE=gemni`(拼错)→ 按选定方案,且提示可见 - [ ] bash 3.2 与 5.3 双版本全绿
功能概述
目标: 决定
REVIEW_ENGINE取到未知值时应该静默回落到 agy,还是显式失败。动机: 现状是静默回落。这是 #146 引擎接口重构时刻意保留的既有语义,不是设计选择——当时的约束是零行为变更,策略决定被明确推给本 issue。
当前状态
plugins/plan-review/scripts/plan-review.sh的引擎白名单:*)吞掉一切未知值。重构前的脚本只对claude和codex做特判,其余全落 agy 路径——包括默认值gemini,也包括REVIEW_ENGINE=gemni这种拼写错误。问题
拼错引擎名不会有任何提示,用户以为在用 codex,实际一直在跑 agy。审阅结果里的
Red Team Review — <engine>头部会显示用户输入的原值(如gemni),进一步掩盖了实际用的是别的引擎。三个候选
[WARNING] 未知 REVIEW_ENGINE=x,跳过审阅倾向 C:拼错的代价应该是「看得见的提示」,而不是「静默误用」(A)或「静默关掉审阅」(B)。实现上把
gemini从*)提出来做显式分支,*)才是真未知值。注意 B 有个反直觉的风险:审阅是质量门禁,因为一个拼写错误就整体跳过,比降级到另一个可用引擎更危险。
实现步骤
gemini提为显式 case 分支,*)只匹配真未知值*)gemini无警告;未设(默认)无警告;未知值按选定行为涉及文件
plugins/plan-review/scripts/plan-review.shplugins/plan-review/tests/plan-review.batsplugins/plan-review/README.md兼容性考虑
plugin.json与marketplace.json验证方法
REVIEW_ENGINE=gemini显式设置 → 无警告,走 agyREVIEW_ENGINE未设 → 无警告,走 agy(默认路径不能刷警告)REVIEW_ENGINE=gemni(拼错)→ 按选定方案,且提示可见