---
name: eo-test
description: |
  按需独立测试视角：风险信号命中或用户点名时，对已实现 change 做测试审计、补缺与重验证，产简版 test.md。严禁修改业务代码。触发：找双新眼睛跑测试 / 独立验证 / 给这个 change 补测试 / /eo-test。
  NOT FOR: 与 change 无关的日常跑测试或补单测（直接做即可，不产报告）；默认主路的自验（归 eo-implement）。
---

# eo-test — 独立测试（按需闸门）

v3 起本 skill 是**可选闸门**，不是流程节点。默认主路里 eo-implement 自验足够；只有 [../eo-shared/granularity.md](../eo-shared/granularity.md) §5 风险信号命中（且用户未豁免）或用户显式点名时才调用。价值 = **独立视角**：不是把 implement 跑过的再跑一遍，而是审计真实性 + 补 AC 没想到的输入。

## 职能边界

1. **绝对禁令**：禁止修改任何非测试相关的业务源码。发现 bug 只记录并建议修复，不自行改源码
2. **审计 + 补缺，不重写**：先盘点既有测试并审计真实性（断言是否真实覆盖对应 AC、有无被弱化/删除、有无过拟合/硬编码特判），只为缺口编写
3. **简版报告**：结论 + 未决清单 + 失败定位，写入 `eo-doc/changes/<change-id>/test.md`；同一 change 再次调用时**覆盖重写**（历史由 git 兜），速报恒在对话里给

## 前置条件

- **必须能找到 `.eo-project.json`**。同目录存在 `.eo-project.local.json` 时顶层字段覆盖合并（local 优先）。找不到 → 报错退出，提示运行 `/eo-project-init`
- `eo-doc/changes/<change-id>/change.md` 已存在，相关代码已实现（`status: implementing` 或 `reviewed`）
- 调用依据二选一：change.md §6 记录了命中信号且未豁免 / 用户显式点名。都没有 → 告知用户默认主路不需要本闸门，确认仍要跑再继续

## 工作流程

1. **消费 lessons**：按 [../eo-shared/lessons.md](../eo-shared/lessons.md) §1 扫 INDEX 匹配 trigger——尤其环境相关 lesson（起停命令、单次代价）
2. **盘点覆盖**：读 change.md §2 全部 AC 与 §5 TODO；读 frontmatter `base_commit..HEAD` 的 `[<change-id>]` 提交 diff；建立「AC → 已有证据」映射（既有测试、implement 速报里的一次性执行证据都算输入）
3. **提取缺口**：对照映射列出无覆盖验证点。**AC 决定验什么，代码决定拿什么验**——从 diff 的分支、默认值、空值与边界处理、类型转换里提取 AC 没写、已有测试也没碰、但代码实际会遇到的输入，补进缺口清单（只按 AC 文字正向推导，验的永远只是「AC 想到的路径」）
4. **补缺编写**：只为缺口写测试，遵循项目既有测试目录与命名约定；回归资产分层——逻辑密集 / 边界多 / 共享路径的落成永久测试文件，其余以一次性执行证据作证（命令 + 关键输出记入 test.md）
5. **执行**：跑全部相关测试与必要回归；需要起环境的按 [../eo-shared/ac-spec.md](../eo-shared/ac-spec.md)「起环境的纪律」——探测复用、按环境组合分组跑完
6. **失败分析**：测试代码自身写错 → 直接修正重跑；业务代码 bug → **停手**，记入报告并建议走 /eo-fix 循环内分支
7. **报告与速报**：
   - test.md 简版（覆盖式）：

     ```markdown
     # <标题> 测试报告
     > 日期：YYYY-MM-DD ｜ 基线：<HEAD short-sha> ｜ 结论：通过 / 不通过（失败 x 项）

     ## 未决清单
     | 项 | 失败现象 | 位置 | 修复 commit | 状态 |
     |----|---------|------|------------|------|
     | F-1 | <一句话> | <用例/文件> | | open / fixed / verified |

     ## 缺口补缺摘要
     <补了哪些测试、一次性证据清单（命令 + 关键输出）>
     ```

   - 修复后再跑：核销未决清单（fixed 项复测 → verified / 回 open），覆盖重写报告
   - **对话速报（硬性）**：

     ```
     结论：通过 / 不通过（失败 x 项）［基线 <short-sha>］
     失败项：
     1. <一句话> — <用例/文件>
     未覆盖 AC：<AC-x（原因）>；全覆盖则省略此行
     下一步：<失败 → /eo-fix 循环内分支修复后回本 skill 复验 / 通过 → /eo-archive 或用户指定>
     （详细报告见 <test.md 路径>）
     ```

   - **status 回退边**：结论不通过且当前 status 为 `reviewed` → 当场置回 `implementing`（见 [../eo-shared/conventions.md](../eo-shared/conventions.md) §3）

## 关键约束

- **禁止跨权**：严禁修改业务逻辑代码
- **不重写已覆盖项**：审计通过的不重编；独立性靠审计 + 独立执行保证
- **测试独立性**：用例独立运行，不依赖执行顺序
- **不修改 change 的判据**：AC/TODO 的文字不动——发现写漏/写偏记录到报告并建议回 /eo-implement 确认后补写
- **环境不归你所有**：探测复用、用完不停；按环境组合分组跑
- **输入不只来自 AC**：跳过「读实现取输入」= 只验 AC 想到的路径
- **注释纪律**：测试资产同样遵守 [../eo-shared/conventions.md](../eo-shared/conventions.md) §2.6——溯源标注与「为何正确」辩护不进测试注释
