eo-change-review · diff
git:20260724.2f43c94 to git:20260815.469185b
40 added, 144 removed. Audit A to A.
---
name: eo-change-review
description: |
- 对 change.md 做方案级审查(AC 质量、TODO↔AC 映射、粒度合规、意图一致性)。触发:审查 change / change 审查 / 审方案 / /eo-change-review。
- NOT FOR: 代码审查(/eo-review)、implement 内的回归审查。
+ 按需方案审查:风险信号命中或用户点名时,对 change.md 做方案级审查(AC 质量、TODO↔AC 映射、前提真实性),产简版 change-review.md。触发:审查 change / change 审查 / 审方案 / /eo-change-review。
+ NOT FOR: 代码审查(/eo-review);默认主路(无信号时不强制)。
---
- # eo-change-review — Change 方案审查
-
- 对一个 change 做方案级审查,在 implement 前把牢「方向是否正确、AC 是否可验收、TODO 是否完整、粒度是否合规」。**可选环节**——小 change 可跳过;AC ≥5 条 / 含 §5 技术方案 / type=refactor / 高风险 change 建议跑。
-
- ## 与另一种 review 的关系
-
- | Skill | 审查对象 | 问的问题 |
- |-------|---------|---------|
- | **`eo-change-review`**(本技能) | 某个 change 的 `change.md` | 方案对不对?AC 质量、TODO 完整性? |
- | `eo-review` | change 实施后的代码 | 代码对不对?实现 vs AC? |
+ # eo-change-review — Change 方案审查(按需闸门)
- 两者关注点、上下文、回退动作完全不同,**不要混用**。
+ v3 起本 skill 是**可选闸门**:在 implement 前把牢「方向是否正确、AC 是否可验收、TODO 是否完整」。调用依据:[../eo-shared/granularity.md](../eo-shared/granularity.md) §5 风险信号命中(且用户未豁免)或用户显式点名。
## 核心原则
1. **方案级审查,不替作者做决定**:只产出报告,修订由用户回 `/eo-change` 执行
- 2. **AC 是重中之重**:change 的价值密度集中在 §2 验收清单;AC 不可验收,后面全白做
- 3. **不审实施质量**:此时代码还没写,不审代码质量;但维度 7 的**前提校验落到真实代码**——state 文档可能过期,读码取证不等于审码
- 4. **固定产出**:`eo-doc/changes/<change-id>/change-review.md`
- 5. **采样式质检,不是穷尽式收敛**:只有 P0 阻塞流程,P1 移交起草方裁决;复审默认增量核销,不重开全文;累计上限 3 轮,到限升级用户裁决
+ 2. **AC 是重中之重**:change 的价值密度集中在 §2;AC 不可验收,后面全白做
+ 3. **不审实施质量**:此时代码还没写;维度 7 的前提校验落到真实代码(state 文档可能过期,读码取证不等于审码)
+ 4. **简版报告**:`eo-doc/changes/<change-id>/change-review.md`,复审**覆盖重写**(历史由 git 兜)
+ 5. **只有 P0 阻塞**:P1/P2 移交起草方裁决,不阻塞流程
## 前置条件
- - **必须能找到 `.eo-project.json`**。同目录存在 `.eo-project.local.json` 时顶层字段覆盖合并(local 优先)。找不到 → 报错退出,提示运行 `/eo-project-init`
+ - **必须能找到 `.eo-project.json`**。找不到 → 报错退出,提示运行 `/eo-project-init`
- `eo-doc/changes/<change-id>/change.md` 存在,status 为 `draft` 或 `confirmed`(implementing 及之后 → 提示应走 /eo-review)
## 工作流程
- ### 第零步:轮次与模式判定
-
- - **首轮**(目录下无 change-review.md):全量审查
- - **复审轮**(已有 change-review.md):默认**增量**。命中下表任一信号(机械可判,不做主观裁量)→ 自动升级**全量**并向用户播报命中哪条;用户显式指定模式时以用户为准,优先于自动判定
-
- | 升级信号 | 为什么 |
- |---------|--------|
- | AC 有增删,或既有 AC 语义性改写(非措辞微调) | AC 是映射与覆盖检查的锚,锚动则增量核对失效 |
- | §1 已钉决策变动 | 意图层变化使上轮一致性结论作废 |
- | 修订触及超过 1/3 的 TODO,或修订量超全文 30% | 波及面超出定点核对范围 |
- | finding 台账或处置落点缺失(如跨会话丢上下文) | 增量输入不存在,全量兜底 |
-
- - **全量复审 ≠ 从零**:台账中 `wont-fix` 项在任何轮次、任何模式下豁免,不得重报
- - **轮数纪律**:复审累计上限 **3 轮**(升级全量不重置计数);到限仍有未决 P0 → 停止循环,把未决项列给用户裁决(终态措辞见第四步)
- - **revision 边界**:轮数与 wont-fix 豁免均以 change.md frontmatter `plan_revision`(缺省视为 1)为界——回炉进入新 revision 后轮数从 1 起算、旧 revision 的 wont-fix 失效(新方案下可重报);新 revision 首轮按全量跑,报告在「速报」前另起 `## Revision R 审查` 分段,旧 revision 内容冻结不改
-
### 第一步:阅读上下文
- **tier: light 的 change 不适用本 skill**(轻档方案审查由探针对齐替代,见 [../eo-shared/granularity.md](../eo-shared/granularity.md) §5)——提示直接 `/eo-implement` 轻模式。
-
- **全量(首轮 / 升级)**:
-
- 1. 读目标 change.md 全文(v2 模板:§1 意图 + 已钉决策、§2 AC、§3 TODO、条件节 §4-§8)
+ 1. 读目标 change.md 全文(§1 意图 + 已钉决策、§2 AC、§5 TODO、§6 风险)
2. 读 `eo-doc/changes/INDEX.md` 最近 3 条(避免与在途/已归档 change 冲突或重复)
3. 读 `eo-doc/state/` 相关篇目(系统现状,校验变更前提)
- 4. frontmatter `type` 缺失或不在枚举(bootstrap/feature/enhance/refactor)→ 直接 P0 报告,**不向用户追问类型归属**
- 5. 复审轮另加:读 finding 台账,继承 `wont-fix` 豁免与已核销记录
-
- **增量复审**:
-
- - **同会话**:上轮 finding 与修订过程已在上下文,**不重读任何文件**,直接进入核销
- - **跨会话**:读 change-review.md(台账 + 上轮报告)→ 按台账「处置」列的改动落点**定点读** change.md 对应段落,不读全文
-
- ### 第二步:系统审查
-
- **增量复审只做两件事**,不重开全文:
-
- 1. **核销**:逐条验证台账未决 P0/P1 的修复——按处置落点核对,改到位 → `verified`;没改到位 → 保持 `open` 并一句话说明
- 2. **审增量**:只对本轮修订引入/改动的内容找新 finding。**新 finding 必须能指认「由本轮修订引入」,否则无效**——首轮就该发现的问题不允许复审轮补报(对审查采样噪声的抑制闸)
-
- **全量审查**跑满以下 7 维度:
+ 4. 复审轮另加:读上一版 change-review.md 的 Finding 清单(核销后再找新 finding)
- - **维度 1 · AC 质量(最关键)**:对照 [../eo-shared/ac-spec.md](../eo-shared/ac-spec.md) 逐条检查——用户视角?可独立验证(声明 + 验证栏合读能得出怎么操作、看什么;验证栏按增量制省略不算缺)?技术无关且可度量(无「正常工作」类主观词)?覆盖异常路径(至少 1 条失败/边界 AC)?refactor 类是否写了「行为不变」的回归口径?
- - **维度 2 · TODO↔AC 映射**:每条 TODO 标注了对应 AC 且映射成立?每条 AC 至少被一条 TODO 覆盖?出现映射不到 AC 的 TODO(越界)或没有 TODO 的 AC(悬空)→ P0
- - **维度 3 · TODO 拆解质量**:三要素齐全(描述/文件/对应 AC)?多条 TODO 对同一 AC 时是否逐条写了完成判据(一对一不要求)?**占位符检测**(「补充错误处理」「后续完善」→ P0)?Batch 分组合理、Batch 1 是可独立验证的 MVP?依赖自洽无循环?**并行组核验**(存在字母后缀批时):同层批文件集相交,或存在逻辑依赖(一批消费另一批的接口/数据结构,[../eo-shared/granularity.md](../eo-shared/granularity.md) §6)→ P1(并行不安全,建议去后缀转串行)
- - **维度 4 · 粒度合规**:对照 [../eo-shared/granularity.md](../eo-shared/granularity.md)——TODO 数与全文行数在软标内(超软标 P1 建议拆、超硬标 P0 必须拆);反向检查:是否 trivial 到根本不该开 change(→ P1 建议转直改)
- - **维度 5 · 意图一致性**:§1 已钉决策与 §2/§3 是否自洽(TODO 有没有偷偷推翻已钉结论)?`type` 与实际内容匹配(宣称 refactor 却新增用户可见能力 → 应改 feature)?混入多个不相关改动 → 建议拆;AC/TODO 是否超出 §1 意图自行扩面(镀金,见 [../eo-shared/ac-spec.md](../eo-shared/ac-spec.md)「不镀金」)→ P1 建议裁剪或转 backlog;**速览一致性**:速览缺失、行为差异与 §1/§2 冲突、或复述 AC 条文而非用户可见差异 → P1
- - **维度 6 · 条件节合规**:触发条件满足却缺节(有 TODO 未覆盖的连带文件但无 §4;有新外部依赖但无 §5;有不可逆操作但无 §7)→ P1;触发条件不满足却写了 → P2(瘦身建议);§8 defer 超过 3 条 → P1;change 含 §6 流程图时对照 [../eo-doc-manager/references/mermaid.md](../eo-doc-manager/references/mermaid.md) §5 审查清单核对
- - **维度 7 · 前提真实性抽查**:方案前提落到**真实代码**核验(state 文档可能过期,不能只对文档校验)——
- - **机械核验**(全量跑,不占抽样名额):§3 每条 TODO 按文件栏操作类型分型核验——`新增:` 查父目录/模块惯例/命名冲突;`修改:`(含缺省)查对象存在与形态相符;`删除:` 查对象存在与引用面
- - **高风险前提抽样**:候选池 = §1/§4/§5/§7 中对现状事实、兼容性、唯一性、外部契约的断言;按不可逆性 > 数据/权限风险 > 跨模块面排序取 **2-3 条**定点读码核验。每条前提标基线:「变更前事实」审 `base_commit`(首轮审查时即 HEAD;回炉复审用 `git show <base_commit>:<path>`——防被上一轮实施在 HEAD 造出的代码自证);「当前兼容性」读 HEAD + 本 change 未提交 diff
- - 报告固定四栏:断言 / 基线 / 证据(file:line 或命令输出)/ 判定。**前提不成立 → P0(必须附直接证据);证据不足 → P1 要求补证,不猜 P0**
+ ### 第二步:审查(7 维度)
- **定级纪律(全模式通用)**:
+ - **维度 1 · AC 质量(最关键)**:对照 [../eo-shared/ac-spec.md](../eo-shared/ac-spec.md) 逐条检查——用户视角?可独立验证?技术无关且可度量(无「正常工作」类主观词)?覆盖异常路径?refactor 类是否写了「行为不变」的回归口径?
+ - **维度 2 · TODO↔AC 映射**:每条 TODO 标注了对应 AC 且映射成立?每条 AC 至少被一条 TODO 覆盖?越界 TODO 或悬空 AC → P0
+ - **维度 3 · TODO 拆解质量**:三要素齐全?占位符检测(「补充错误处理」「后续完善」→ P0)?Batch 分组合理、Batch 1 是可独立验证的 MVP?**并行组核验**(存在字母后缀批时):文件集相交或有逻辑依赖 → P1
+ - **维度 4 · 粒度合规**:对照 granularity.md——超软标 P1 建议拆、超硬标 P0 必须拆;反向检查:trivial 到不该开 change → P1 建议转直改
+ - **维度 5 · 意图一致性**:§1 已钉决策与 §2/§5 自洽?`type` 与实际内容匹配?AC/TODO 超出 §1 意图自行扩面(镀金)→ P1 建议裁剪或转 backlog;§2 是否真是用户口吻(复述实现细节 → P1)
+ - **维度 6 · 条件节合规**:命中风险信号却未在 §6 记录(含豁免)→ P1;defer 超 3 条 → P1
+ - **维度 7 · 前提真实性抽查**:§1/§5/§6 中对现状事实、兼容性、唯一性、外部契约的断言,按不可逆性 > 数据/权限风险 > 跨模块面排序取 2-3 条定点读码核验。每条前提标基线(变更前事实审 `base_commit` 或 HEAD)。**前提不成立 → P0(必须附直接证据 file:line);证据不足 → P1 要求补证,不猜 P0**
- - **P0 只收客观可判项**:TODO↔AC 映射断裂 / 占位符 / 粒度超硬标 / AC 不可验证(声明与验证栏合读仍不知怎么验)/ type 缺失或不在枚举 / TODO 推翻已钉决策 / **前提不成立(维度 7,附直接证据)**。程度与取舍类判断(粒度软标、条件节取舍、表述质量、意图一致性的程度问题)最高 P1
- - **不确定就降级**:拿不准 P0 报 P1,拿不准 P1 报 P2;每条 P0/P1 必须落到具体位置(§X / 条目号)并附可执行修复建议,给不出的不报
+ **定级纪律**:
- ### 第三步:撰写报告
+ - **P0 只收客观可判项**:TODO↔AC 映射断裂 / 占位符 / 粒度超硬标 / AC 不可验证 / TODO 推翻已钉决策 / 前提不成立(附直接证据)。程度与取舍类判断最高 P1
+ - **不确定就降级**:拿不准 P0 报 P1,拿不准 P1 报 P2;每条 P0/P1 必须落到具体位置并附可执行修复建议,给不出的不报
- - **首轮**:按下方模板写入 `eo-doc/changes/<change-id>/change-review.md`(含 Finding 台账)
- - **复审轮**:**不重写报告**——只更新台账状态列,在「速报」节之前追加一节 `## 复审记录(第 N 轮 · 增量/全量 · YYYY-MM-DD)`(核销结果 / 新增 finding / 未决清单),并原地更新「速报」节。「速报」必须始终是文件末节(编排方按"末尾速报"取下一步)
+ ### 第三步:报告与速报
- ### 第四步:对话速报(硬性——缺速报 = 流程未完成)
+ 1. 写入 `change-review.md`(覆盖式;模板见下)。复审轮先核销上一版 Finding(fixed → verified / 回 open;`wont-fix` 项豁免不重报),新 finding 必须能指认由本轮修订引入
+ 2. **对话速报(硬性)**:
```
- 结论:通过 / 不通过(P0 x 条)[第 N 轮 · 全量/增量]
+ 结论:通过 / 不通过(P0 x 条)
P0(阻塞 implement):
1. <一句话> — change.md §X
- P1(移交起草方裁决,不阻塞循环):
+ P1(移交起草方裁决,不阻塞):
2. <一句话> — change.md §X
- P2(可后置):
- 3. <一句话>
- 下一步:<见下方终态措辞>
+ 下一步:<通过 → /eo-implement(status 仍为 draft 先回 /eo-change 确认)/ 需修订 → 回 /eo-change 逐条处置后再跑本 skill 复审>
(详细分析见 <change-review.md 路径>)
```
- 终态措辞**三选一,严禁混用**:
-
- - **通过(P0=0)**:「下一步 `/eo-implement <change-path>`(status 若仍为 draft,先回 /eo-change 对话确认)。未决 P1 已入台账,由起草方裁决:采纳的回 /eo-change 顺手修(**不触发复审**),不采纳的标 wont-fix 附理由。注意:`/eo-review` 是代码审查,要在 implement 之后,现在还不轮到它。」
- - **需修订(P0>0 且未到 3 轮)**:「回 `/eo-change <change-path>` 逐条处置:修复的在台账标注改动落点,不认同的标 wont-fix 附理由;然后再跑 `/eo-change-review` 复审(默认增量,锚变动自动升全量),循环到 **P0=0**。当前第 N/3 轮。🚫 不要跳过复审直接 implement,不要跑 /eo-review(代码还没写)。」
- - **到限(第 3 轮仍有未决 P0)**:「复审已达 3 轮上限,停止循环。未决 P0:<清单>。请裁决:a) 显式豁免并放行 implement(豁免记录入台账与 change.md §8) b) 指定修复后仅做一次核销复审 c) 回炉重做 change。」
-
## 固定模板 — change-review.md
```markdown
---
title: <标题> Change 审查报告
change_id: <change-id>
created: YYYY-MM-DD
- status: active
- summary: >
- 一句话审查结论。
+ summary: 一句话审查结论。
---
# <标题> Change 审查报告
> 关联:[change.md](change.md) | 审查日期:YYYY-MM-DD | change status:draft / confirmed
-
- ## 审查总结
- 一段话 + 明确结论:✅ 可进入 implement / ⚠️ 小幅修订后进入 / ❌ 需大幅修订
-
- ## Finding 台账
+ > 结论:✅ 可进入 implement / ⚠️ 小幅修订后进入 / ❌ 需大幅修订
- <!-- 状态单一来源:本 skill 建条与核销(open→verified),修订方(/eo-change)填「处置」列。wont-fix 项后续任何轮次不得重报 -->
+ ## Finding 清单
| ID | 级别 | 摘要 | 位置 | 状态 | 处置(修订方填) |
|----|------|------|------|------|------------------|
| P0-1 | P0 | <一句话> | §3 | open / fixed / verified / wont-fix | <改动落点 或 wont-fix 理由> |
## P0 - 必须修订(阻塞 implement)
### [P0-1] <标题>
- - 类型:AC 不可验收 / 映射断裂 / 占位符 / 粒度超硬标 / 类型错配
- - 位置:change.md §X | 描述 | 影响 | 建议
+ - 类型 | 位置:change.md §X | 描述 | 影响 | 建议
- ## P1 - 建议修订(移交起草方裁决,不阻塞)
- ### [P1-1] <标题>(类型:粒度超软标 / 条件节缺失 / 异常路径未覆盖 / defer 超限…)
+ ## P1 - 建议修订(不阻塞)
## P2 - 可选优化
- ## AC 质量检查
- | AC | 用户视角 | 可验证 | 技术无关 | 备注 |
- |----|---------|--------|---------|------|
-
- ## TODO↔AC 映射检查
- | TODO | 对应 AC | 状态 |
- |------|---------|------|
- | TODO-1 | AC-1 | ✅ / ⚠️ / ❌ |
-
- ## 粒度检查
- TODO 数:N(软标 3-7 / 硬标 10)| 全文:N 行(软标 500 / 硬标 700)| 结论:合规 / 建议拆 / 必须拆
-
## 前提真实性抽查(维度 7)
- <!-- 机械核验全量跑(TODO 文件栏按操作类型),高风险前提抽 2-3 条;前提不成立 → P0 附直接证据 -->
-
- | 断言 | 基线 | 证据 | 判定 |
- |------|------|------|------|
- | <一句话前提> | base_commit / HEAD | `file:line` 或命令输出 | ✅ 成立 / ❌ 不成立 / ⚠️ 证据不足(P1 补证) |
-
- ## 结构完整性
- | 节 | 状态 | 备注 |
- |----|------|------|
- | 速览 | ✅/⚠️/❌ | 人读投影与 §1/§2 一致 |
- | §1 意图 + 已钉决策 | ✅/⚠️/❌ | |
- | §2 验收清单 | ✅/⚠️/❌ | |
- | §3 TODO(Batch) | ✅/⚠️/❌ | |
- | 条件节 §4-§8 | ✅/⚠️/❌ | 触发条件 vs 实际取舍 |
-
- <!-- 复审轮在「速报」之前追加,不重写上文;回炉进新 revision 时在「速报」前另起
- 「## Revision R 审查(YYYY-MM-DD · 全量)」分段,其内轮次从第 1 轮重计,旧 revision 段冻结不改 -->
- ## 复审记录(第 2 轮 · 增量 · YYYY-MM-DD)
-
- - 核销:P0-1 verified(<落点一句话>);P1-1 wont-fix(<理由>)
- - 新增:无 / P0-2 <一句话>(由本轮修订引入:<指认>)
- - 未决:无 → 结论:通过
-
- ## 速报
-
- 结论:通过 / 不通过(P0 x)[第 N 轮 · 全量/增量]
- 下一步:(通过)status 为 draft 时先回 /eo-change 完成确认 → /eo-implement / (需修订)回 /eo-change 处置后复审(第 N+1/3 轮) / (到限)交用户裁决
+ | 断言 | 基线 | 证据(file:line) | 判定 |
+ |------|------|------------------|------|
+ | <一句话前提> | HEAD | `file:line` | ✅ 成立 / ❌ 不成立 / ⚠️ 证据不足 |
```
- 末尾「速报」节必填——它是报告的机器可读出口(编排方读文件即取下一步),与第四步对话速报同款内容。
-
## 关键约束
- **不改 change.md**:只产报告,修订归 `/eo-change`
- - **P0 精准且客观**:只有阻塞 implement 的客观可判问题才 P0(白名单见第二步定级纪律);不确定就降级
- - **只有 P0 阻塞循环**:P1 移交起草方裁决,P1 的修复不触发复审
- - **复审不重开全文**:增量为默认;复审轮新 finding 必须指认由本轮修订引入;wont-fix 项永不重报
- - **报告追加不覆盖**:复审只更新台账 + 追加复审记录,上轮报告原文保留
- - **轮数上限 3 轮**:升级全量不重置计数,到限交用户裁决
- - **不审实施质量**(代码质量归 /eo-review;维度 7 读码仅为前提取证)、不审业务方向本身(方向的家在 brainstorming/意图确认)
- - **避免触发钩子噪声**:报告中避免使用「关键决策」等字样(可能触发上游配置的记录钩子),用「设计判断」「模式选择」代替
+ - **P0 精准且客观**:只有阻塞 implement 的客观可判问题才 P0;不确定就降级
+ - **只有 P0 阻塞**:P1 移交起草方裁决,其修复不强制复审
+ - **报告覆盖式**:复审先核销再重写;wont-fix 项不重报
+ - **不审实施质量**(归 /eo-review)、不审业务方向本身(方向的家在 brainstorming / 意图确认)
- **可操作**:每个问题的建议必须具体到用户能直接行动