{"slug":"eo-fix","title":"eo-fix","summary":"缺陷修复方法论唯一入口：口喷 bug 定位直修；implement-test-review 循环内的反馈修复也走本 skill（循环内分支，原 impl worker 执行）。触发：修 bug / 有个 bug / 报错了 / 行为不对 / fix / /eo-fix。 NOT FOR: 明确的业务变更（走 /eo-change）。","platform":"Claude","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-09-02T16:13:06.154671Z","repo":{"url":"https://github.com/SimpleEve/eo-skills","stars":31,"forks":6,"license":"MIT","updatedAt":"2026-09-24T03:41:00Z"},"bodyHtml":"<hr>\n<h2>name: eo-fix\ndescription: |\n缺陷修复方法论唯一入口：口喷 bug 定位直修；implement-test-review 循环内的反馈修复也走本 skill（循环内分支，原 impl worker 执行）。触发：修 bug / 有个 bug / 报错了 / 行为不对 / fix / /eo-fix。\nNOT FOR: 明确的业务变更（走 /eo-change）。</h2>\n<h1>eo-fix — Bug 修复</h1>\n<p>三层<strong>按需付费</strong>：默认快路 ≈ 直接修 + 30 秒记账；只有要推翻一个「可能是有意的行为」时才取证；只有定位不了才深挖。对一个 typo，本 skill 的开销趋近于零——任何不触发的层都不存在。</p>\n<h2>核心原则</h2>\n<ol>\n<li><strong>快路优先</strong>：明显缺陷（报错、崩溃、数据错、无争议逻辑错）不查任何文档，直接修</li>\n<li><strong>推翻行为前必取证</strong>：现象是「应该/不应该」类语义分歧时，先花几百 token 确认该行为不是有意设计——防止静默推翻已确认的决策</li>\n<li><strong>落点记账不豁免</strong>：修复必须落进体系（勾 AC / commit 前缀），这是 archive 归集、看板、retro 统计的输入</li>\n<li><strong>定位靠代码反查</strong>：症状 grep 源码 + git log 前缀追溯，精确且便宜；禁止全局 grep eo-doc 正文</li>\n<li><strong>深挖有门</strong>：升级必宣告、结束必还原</li>\n</ol>\n<h2>前置</h2>\n<p><strong>必须能找到 <code>.eo-project.json</code></strong>。同目录存在 <code>.eo-project.local.json</code> 时顶层字段覆盖合并（local 优先）。找不到 → 报错退出，提示运行 <code>/eo-project-init</code>。</p>\n<h2>工作流程</h2>\n<h3>第一步：分诊（一眼定路）</h3>\n<table>\n<thead>\n<tr>\n<th>现象特征</th>\n<th>走</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>「坏了 / 报错 / 崩了 / 数据不对」——对错无需文档裁决</td>\n<td><strong>快路</strong>（第二步 → 第三步）</td>\n</tr>\n<tr>\n<td>「这里应该… / 为什么会… / 这个行为不对吧」——行为疑似有意实现、涉及业务规则或数值</td>\n<td><strong>取证路</strong>（第二步 → 第四步）</td>\n</tr>\n<tr>\n<td>描述弥散、无从下手</td>\n<td>第二步定位；仍无果 → 深挖（第五步）</td>\n</tr>\n</tbody>\n</table>\n<p>同时按 <a href=\"../eo-shared/lessons.md\">../eo-shared/lessons.md</a> §1 消费 lessons——同类坑踩过的，「规则」节直接给答案或作假设先验。</p>\n<h3>第二步：定位（代码反查为主，~500-900 token）</h3>\n<ol>\n<li><strong>锚定代码</strong>：有症状字符串（报错文案 / UI 文案）→ 直接 grep 源码，几乎一步中的；没有 → <code>.codegraph/</code> 索引存在则 <code>codegraph explore</code> 定位模块入口，不存在则按目录收敛直读源码</li>\n<li><strong>反查归属</strong>：<code>git log --oneline -n 20 -- &lt;嫌疑文件&gt;</code> 看 commit 前缀——<code>[&lt;change-id&gt;]</code>（slug 或存量数字前缀）→ 相关 change 直达；<code>fix:</code> / <code>ui:</code> → 直改历史（无书面期望）；无前缀 → 存量代码</li>\n<li>需要书面期望时只读该 change 的 frontmatter + §2 AC，<strong>不通读</strong></li>\n</ol>\n<p><strong>辅路</strong>（代码反查不灵时才用）：扫 <code>eo-doc/changes/INDEX.md</code>——活跃 change 置顶且通常只有 0-3 个，先看它们（刚做完的最容易坏）；不中再按关键词扫 archived 区。候选 &gt;3 或全无匹配 → 追问用户。</p>\n<h3>第三步：快路修复</h3>\n<p>最小变更修复 → 用户给的复现步骤转成回归验证跑通 → 跳到第六步落点记账。中途发现行为其实可能是有意的 → 转第四步。修复代码<strong>注释零溯源</strong>：change/AC/finding 标记与修复辩护不进注释（项目级完整纪律见 <code>eo-doc/agent-handbook/comments.md</code>，如已启用）。</p>\n<p><strong>复现与回归都取最低成本层</strong>：修前先在该层复现失败（这是根因判断的依据，也是「改完看起来对了」之外唯一的证据），修后在同层验通过。层的选法——纯逻辑用单测 / <code>node -e</code> 等价复刻（秒级），接口契约用一次请求，<strong>确属集成 / UI 态才起环境</strong>（环境纪律见 <a href=\"../eo-shared/ac-spec.md\">../eo-shared/ac-spec.md</a>）。不要每改一行就重新 build + 起环境。</p>\n<h3>第四步：取证路（仅语义分歧）</h3>\n<p><strong>证据瀑布</strong>——期望行为不是单一锚点，按可得性降级取证：</p>\n<table>\n<thead>\n<tr>\n<th>优先</th>\n<th>证据</th>\n<th>作用</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1</td>\n<td>用户当下的口述</td>\n<td>最高权威，永远存在</td>\n</tr>\n<tr>\n<td>2</td>\n<td>相关 change 的 §2 AC（若有）</td>\n<td>最优书面期望</td>\n</tr>\n<tr>\n<td>3</td>\n<td><code>eo-doc/state/</code> 现状篇（若 <code>state.enabled</code> 启用）</td>\n<td><strong>意图佐证</strong>：行为被现状篇记为规则 = 曾被认为正常（state 是代码派生快照，只能佐证不能裁决）；篇≠码 → 文档陈旧，提示可跑 <code>/eo-doc-manager sync</code></td>\n</tr>\n<tr>\n<td>4</td>\n<td><code>&lt;project_root&gt;/decisions/</code> 与 brainstorm/ 的记录</td>\n<td><strong>意图佐证</strong>：行为被钉为决策 = 曾被认为正常（只能佐证意图，不能裁决代码对错）</td>\n</tr>\n<tr>\n<td>5</td>\n<td>git 归属（commit 前缀）</td>\n<td>追溯行为来源</td>\n</tr>\n</tbody>\n</table>\n<p>判定与动作：</p>\n<table>\n<thead>\n<tr>\n<th>取证结果</th>\n<th>动作</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>行为查无出处（无 AC 声明、decisions 无记载）且按口述明显是缺陷</td>\n<td>按快路修（第三步）</td>\n</tr>\n<tr>\n<td><strong>行为是有意设计</strong>（AC 声明过 / decisions 钉为规则 / change 意图明确）</td>\n<td>停手告知：「这是 </td>\n</tr>\n<tr>\n<td>AC 写漏且 change 未 archived</td>\n<td>确认后先补 §2/§3 再修（Update preserves context）</td>\n</tr>\n<tr>\n<td>记录与代码矛盾</td>\n<td>以代码为准重判</td>\n</tr>\n</tbody>\n</table>\n<p><strong>修复范围守界</strong>：预估改动超出 trivial 量级（需方案权衡、动对外接口，判据见 <a href=\"../eo-shared/granularity.md\">../eo-shared/granularity.md</a> §2）→ 停手建议开 change，不硬修。</p>\n<h3>第五步：深挖模式（自动升级）</h3>\n<p>触发即向用户宣告：<strong>「常规定位失败，进入深挖模式：会临时插桩/加日志/git bisect，结束后还原现场。」</strong></p>\n<ol>\n<li>读 <a href=\"references/investigation.md\">references/investigation.md</a>，按四阶段执行（固定复现 → 假设清单 → 二分排除 → 验证还原）</li>\n<li>调查记录写 <code>tmp/eo/fix/&lt;date&gt;-&lt;slug&gt;.md</code>（可丢弃工件）</li>\n<li>根因确认后回第一步分诊定路，再走修复</li>\n<li>根因有普适教训 → 提议 <code>/eo-project-record</code> 沉淀</li>\n</ol>\n<h3>第六步：落点记账（任何路都不豁免，~30 秒）</h3>\n<ul>\n<li>有相关<strong>活跃 change</strong> → 勾选涉及的 TODO/AC（人工项不代勾，勾选权归用户；被本次改动弄脏的已勾项按 <a href=\"../eo-shared/ac-spec.md\">../eo-shared/ac-spec.md</a>「勾变脏即取消」处理），commit 带 <code>[&lt;change-id&gt;]</code> 前缀；改动影响其 acceptance.md 人工项的入口/行为 → 按 <a href=\"../eo-shared/acceptance.md\">../eo-shared/acceptance.md</a>「失效与重置」取消该项勾选并注明原因；改动影响其 evidence.md 的入口/行为/截图事实 → 按 <a href=\"../eo-shared/evidence.md\">../eo-shared/evidence.md</a>「刷新与失效」同步刷新对应段；顺带更新其 frontmatter 的 <code>brief</code>（写法见 <a href=\"../eo-shared/summary.md\">../eo-shared/summary.md</a>；写不出留空）</li>\n<li>无 → 直改落地：commit 带 <code>fix:</code> 前缀（见 <a href=\"../eo-shared/conventions.md\">../eo-shared/conventions.md</a>）</li>\n<li><strong><code>state.enabled</code> 且 <code>eo-doc/.sync-cursor</code> 已存在时</strong>才顺带报 sync 游标落后量（<code>last_commit..HEAD</code> commit 数）：落后 &gt;10 个 commit → 建议顺手跑一次 <code>/eo-doc-manager sync</code>（直改提交会被 sync 按路径增量收割）。未启用 state 或游标未建立（尚未首次同步）→ 不报，零打扰</li>\n</ul>\n<h3>第七步：收尾速报</h3>\n<pre><code>修复完成：&lt;一句话根因&gt;\n- 改动：&lt;file:line 级别的简述&gt;\n- 验证：&lt;复现步骤回归结果 / AC 核对结果&gt;\n- 落点：计入 &lt;change-id&gt; / 直改（fix: commit &lt;hash&gt;）\n- （取证时）行为出处：&lt;AC-x / decisions 记载 / 查无出处&gt;\n- （深挖时）调查记录：tmp/eo/fix/&lt;file&gt;；建议沉淀 lesson：&lt;是/否&gt;\n</code></pre>\n<h2>循环内分支（implement-test-review 反馈修复）</h2>\n<p><strong>适用</strong>：<code>test.md</code> 有未决失败项，<code>review.md</code> 有 open P0/P1，或 <code>acceptance.md</code> 有「不通过」项。由 /eo-loop 派发到<strong>原 impl worker</strong> 执行（worker 复用纪律不变——本分支只是换方法论，不换人），或循环会话内直接调用。status 为 <code>reviewed</code> 时（产出阻塞结果的 skill 正常已按回退边置回；没置则此刻补）→ 先置回 <code>implementing</code>。</p>\n<p>与口喷路径的差异只有两条：<strong>免定位</strong>（反馈报告即定位输入，跳过第二步）；<strong>带核销职责</strong>（第 1/5 步与交接速报）。分诊三路由原样生效——明显缺陷走快路；finding 与已确认 AC / 已钉决策冲突（「这个行为本来就不对」类）走取证路，防静默推翻；定位不了或链路连环失败走深挖，链路类缺陷用「全链审查」变体（见 <a href=\"references/investigation.md\">references/investigation.md</a>）。</p>\n<ol start=\"0\">\n<li><strong>熔断检查</strong>（修复动手前）\n<ul>\n<li>凭报告与对话机械可判：同一 change 修复轮次 ≥3，或各轮失败触发位置互不相同（打地鼠信号）→ <strong>停，不开始修复</strong>，用户三选一：\n<ol type=\"a\">\n<li><strong>豁免一轮</strong>：放行本轮，change.md 末尾记「熔断豁免：&lt;日期&gt;」</li>\n<li><strong>卡点检查</strong>：走下方子流程，按根因结论定出口</li>\n<li><strong>回炉</strong>：转 /eo-change 回炉子流程（方案实质修订 + 重新确认）</li>\n</ol>\n</li>\n</ul>\n</li>\n<li><strong>读取反馈</strong>：同会话反馈已在上下文 → <strong>不重读报告文件</strong>；跨会话 → 只读报告的未决清单 + 结论，按 open 项定点读详情，不通读全文。根因为 <code>test-asset</code> 的 finding 不由本分支消费，交 <code>/eo-test</code>；本分支只处理业务实现项</li>\n<li><strong>分诊定路 + 修复</strong>：按 P0 &gt; P1 &gt; P2 逐一过第一步分诊表定路，各走快路 / 取证 / 深挖；修复代码<strong>注释零溯源</strong>（纪律同上）</li>\n<li><strong>双向取证，取最低成本层</strong>：每个缺陷<strong>先复现失败、修后在同层验通过</strong>——「改完看起来对了」不算证据；层选法同主流程第三步</li>\n<li>涉及的<strong>自动 AC 就地重验</strong>；被本次修复弄脏的<strong>已勾</strong> AC 按 <a href=\"../eo-shared/ac-spec.md\">../eo-shared/ac-spec.md</a>「勾变脏即取消」处理；修复改变了人工项的入口/行为 → 按 <a href=\"../eo-shared/acceptance.md\">../eo-shared/acceptance.md</a>「失效与重置」更新对应验收项；修复改变了入口/行为/截图事实 → 按 <a href=\"../eo-shared/evidence.md\">../eo-shared/evidence.md</a>「刷新与失效」同步刷新 evidence.md 对应段</li>\n<li><strong>回写未决清单</strong>：每个业务实现缺陷修复并同层验通过后，把对应报告清单行置 <code>fixed</code> 并填修复 commit——<code>verified</code> 由复审方核销，本分支不写</li>\n<li>修复提交带 <code>[&lt;change-id&gt;]</code> 前缀</li>\n<li><strong>交接</strong>：回原复审方核销（增量，不重开全文）。交付速报列：<code>反馈来源</code>、<code>修复 commit</code>、<code>受影响 AC</code>、<code>局部验证</code>、<code>下一节点</code></li>\n<li>修复不开新 change；发现根源是方案/需求问题 → 停下告知用户，转 /eo-change <strong>回炉子流程</strong>（实质修订 + 重新确认；意图不变的口径精化不必回炉，就地补 AC 即可）</li>\n</ol>\n<h3>卡点检查子流程（熔断三选一选 b 时执行）</h3>\n<p>spawn 一个<strong>新鲜上下文 subagent</strong>（执行者自述不作数——修了 3 轮的 agent 是判断自己为何修不好的最差人选），输入按 manifest 给，<strong>禁止默认通读报告全史</strong>：</p>\n<ul>\n<li>change.md 全文</li>\n<li>test.md / review.md 的未决清单 + 结论 + open/fixed 项定点详情</li>\n<li>change-review.md 当前结论、acceptance.md 不通过项、implement.md 偏差记录（各自存在时）</li>\n<li><code>[&lt;change-id&gt;]</code> 提交列表与涉及文件的 scoped diff、本 change 相关的未提交脏 diff</li>\n</ul>\n<p>产出五分类根因 + 建议出口：</p>\n<table>\n<thead>\n<tr>\n<th>根因</th>\n<th>出口</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>change 方案/架构不合理</td>\n<td>转 /eo-change 回炉子流程</td>\n</tr>\n<tr>\n<td>链路失败语义残缺（向前写链，恢复面的洞逐次暴露）</td>\n<td>走深挖「全链审查」变体：枚举链上全部可死点 + 逐点恢复证明矩阵，按矩阵批量修</td>\n</tr>\n<tr>\n<td>AC 口径漂移（各轮按不同理解打回）</td>\n<td>回 /eo-change 钉死口径（意图不变的精化，不必回炉）</td>\n</tr>\n<tr>\n<td>纯实施质量问题</td>\n<td>方向没错，建议豁免一轮继续修</td>\n</tr>\n<tr>\n<td>测试基建/环境假失败</td>\n<td>修基建；报告未决清单注明假失败供用户裁决</td>\n</tr>\n</tbody>\n</table>\n<p>结论一行写入 change.md 末尾：<code>卡点检查：&lt;根因&gt;，&lt;日期&gt;</code>。<strong>失败关闭</strong>：subagent 起不了（槽位/工具不可用）→ 不得用执行者自述替代，记「卡点检查未执行」，用户在「稍后重试 / 直接回炉 / 单轮豁免」中裁决。</p>\n<h2>关键约束</h2>\n<table>\n<thead>\n<tr>\n<th>约束</th>\n<th>说明</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>明显缺陷不查文档</td>\n<td>快路不做任何取证，速度对齐「直接修」</td>\n</tr>\n<tr>\n<td>推翻行为前必取证</td>\n<td>语义分歧不取证就改代码 = 可能静默推翻已确认决策，禁止</td>\n</tr>\n<tr>\n<td>落点记账不豁免</td>\n<td>三层里唯一的必做项</td>\n</tr>\n<tr>\n<td>验证取最低成本层</td>\n<td>能复现该缺陷的最便宜的层就是对的层（纯逻辑 → <code>node -e</code> / 单测，秒级）；起环境是最后手段，不是默认</td>\n</tr>\n<tr>\n<td>定位禁全局 grep eo-doc</td>\n<td>代码反查为主，INDEX 辅路</td>\n</tr>\n<tr>\n<td>修复范围守界</td>\n<td>超 trivial 量级 / 需方案权衡 → 转 change，不硬修</td>\n</tr>\n<tr>\n<td>深挖必宣告、必还原</td>\n<td>插桩/日志/bisect 结束后全部还原</td>\n</tr>\n<tr>\n<td>需求变更不伪装成 fix</td>\n<td><strong>功能语义 / 交互逻辑</strong>的期望变更就是 /eo-change 的事，哪怕改动很小；纯外观 / 样式 / 文案的期望变更不算——按 granularity §2 trivial 直改（前缀选择见 conventions §2.5）</td>\n</tr>\n<tr>\n<td>注释纪律</td>\n<td>一切流程溯源标注（change 编号/slug、TODO/AC、finding P0-x/P1-x、FAIL-x）严禁进代码注释（溯源走 commit 前缀）；不写「为何正确」的辩护；提交前对新增注释自检一眼；存量过时/误导注释顺手清理。项目启用 <code>eo-doc/agent-handbook/comments.md</code> 时以该篇为准</td>\n</tr>\n<tr>\n<td>循环内修复归本 skill</td>\n<td>test/review/acceptance 反馈的修复走循环内分支（原 impl worker 执行）；eo-implement 无独立修复模式</td>\n</tr>\n</tbody>\n</table>\n<h2>典型场景</h2>\n<p><strong>场景 1 · 明显缺陷（快路，全程不碰 eo-doc）</strong>：「导出报错了」→ grep 报错文案锁定文件 → 修 → 回归验证 → <code>git log</code> 见 <code>[batch-export]</code> 且该 change 活跃 → 勾 AC、<code>[batch-export]</code> 前缀提交。</p>\n<p><strong>场景 2 · 有意设计被误报（取证路的价值时刻）</strong>：「列表怎么把已归档的也显示出来了，去掉」→ 反查归属 <code>[list-archive-view]</code> → 该 change 的 AC-3 白纸黑字「归档项默认可见」→ 停手：「这是 list-archive-view 特意做的，要推翻它就是需求变更」→ 用户确认后转 /eo-change。<strong>没有这一步，这个已确认决策就被静默推翻了。</strong></p>\n<p><strong>场景 3 · 需求变更伪装</strong>：「积分过期改成 90 天了」→ decisions 记载 30 天规则、代码一致——有意设计 → 转 /eo-change。</p>\n<p><strong>场景 4 · 难缠 bug</strong>：「偶发卡死，复现不稳定」→ 定位无果 → 宣告深挖 → 四阶段 → 根因回分诊 → 修复 + 还原 + 建议沉淀 lesson。</p>\n<p><strong>场景 5 · 循环内打地鼠（全链审查）</strong>：记账链 Test 连续 FAIL 且各轮触发点互不相同（终局等待面 / 锁权限 / 重试误判已入账）→ loop 打地鼠信号命中，用户选全链审查 → 原 impl worker 走深挖链路变体：枚举链上全部可死点，配不出恢复证明的点 = 洞 → 按死点矩阵批量修 → 台账置 <code>fixed</code>，回原 tester 复验。</p>\n","files":[{"path":"references/investigation.md","sizeBytes":5133,"isText":true},{"path":"SKILL.md","sizeBytes":15996,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"trusted-source-unreviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"trusted-source-unreviewed","screen":{"ran":true,"outcome":"clean","suspicious":0,"notes":0,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-09-27T19:48:37.860277Z","sha256":"E3FD16BEAA7807B3D95485C1B6CD0CA98EC34B5CE14B3B9C0122ADC3806EE23B","sizeBytes":11055},"review":null,"source":{"repositoryUrl":"https://github.com/SimpleEve/eo-skills","path":"eo-fix","license":"MIT","commit":"a5062887a6abcb255b4745f871208be292484bfa","subtreeSha":"156D05D7B48F209A530A26C2EBA63633B63F782B0DAA2ED94AB0B55A9AF20B15","lastSyncedAt":"2026-09-27T19:48:06.599057Z"},"reviewedAt":"2026-09-27T19:48:40.887661Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/SimpleEve/eo-skills/tree/main/eo-fix"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install simpleeve-eo-skills@llmmart"},{"target":"git","command":"git clone https://github.com/SimpleEve/eo-skills.git"}]}