{"id":"748678a0-db6f-49a1-94e2-c38da654ed51","shortId":"35gS8x","kind":"skill","title":"forge-bugfix","tagline":"一次修一个 bug + 独立 worktree + 独立 TDD + Bug 修复验收报告 + **多会话并行协调** + dev server 端口治理 + Pass 边界接力（v7.2）。\n每个 bug 从登记开始就创建结构化 Bug 修复验收报告。支持 3-4 个窗口同时修不同功能域的 bug，\n靠 `.forge/active.md` 心跳文件 + 功能域判重 + 合并前 merge 预演避免撞车；\n启动应用时优先使用项目统一 dev entrypoint，避免 worktree 抢端口或测到旧服务。\n在 Codex 环境中，前端复现和修复后自验","description":"> **文档落地路径**：遵循 forge-doc-policy 规范。完整白名单 + frontmatter schema 见\n> `~/claudecode_workspace/工具/forge-cookbook/skills/forge-doc-policy/doc-paths.md`。\n\n# /forge-bugfix：一次一 bug + Bug 修复验收报告\n\n## 设计哲学\n\n**短会话、单 bug 隔离、结构化证据、可追溯、可丢弃。**\n\n核心机制：\n\n- **Bug 修复验收报告**：每个 bug 从登记/领取开始就创建 `docs/bugfix/reviews/BF-XX.md`\n  - 发现时：记录来源、现象、初始截图/日志、关联 Feature Spec\n  - 修复时：记录 worktree、TDD 红绿证据、根因、commit、涉及文件\n  - QA 时：forge-qa 回填前后端地址、环境身份校验、逐步截图、深度断言\n  - 人工验收时：用户只看\"人工验收指南\"和同一组验收地址，填最终结论\n- **两种验收节奏**：\n  - **单 bug 模式**：QA 全过后立即进入 P6.5，等用户验收该 bug\n  - **QA 自动闭环 / 批量模式**：单 bug QA 通过后标记 `qa-pass-pending-final-review`，最后由批次汇总统一交给用户验收\n- **新发现必须分流**（禁止顺手修）：\n  - 原 bug 未 Pass 前：只记录为“待确认新发现”，不进入当前修复\n  - 原 bug 已 Pass 后：先明确告知用户“本次 bug 修复已完成”，再询问是否写入文档\n  - 用户确认后，独立 bug → `docs/bugfix/backlog.md` 的待修区，分配 BF-XX 编号\n  - 用户确认后，新需求 → `docs/bugfix/backlog.md` 的新需求区，建议 /forge-prd 立项\n  - 用户确认后，模糊反馈 → `docs/bugfix/backlog.md` 的待澄清区\n  - 同根（并入当前修复）→ **AI 必须举证**（同文件/同函数/同数据流的具体证据），举证不通过默认独立 bug\n- **Pass 边界接力**：\n  - 只要原 bug 已 Pass，不论新问题来自用户验收、QA 发现，还是 AI 在修复中发现的衍生问题，都不得继续修\n  - AI 必须先说清楚：原 bug 已收敛、证据是什么、当前修复到此关闭\n  - 再问用户：是否把新问题更新到 `docs/bugfix/backlog.md` / 报告中\n  - 用户确认后，AI 完成 P7.5 分流，并给一段简短接力 prompt，让用户开另一个会话继续\n- **下一个 bug 默认建议新会话或 /clear、/compact**：\n  - 上下文干净 + 边界清晰 + 避免长会话的 scope 蔓延\n  - 除非用户明确要共因地一起修\n\n> 演进历史和设计决策背景见 `forge-cookbook/docs/forge-bugfix-changelog.md`。\n\n## 铁律\n\n1. **不做根因分析，就不写修复代码。** 直觉再强也要先验证。\n2. **每次只修 1 bug，或 1-2 个**经 P4.5 确认共因**的 bug**。其余进 `docs/bugfix/backlog.md`。\n3. **每个 bug 独立 worktree + 独立 TDD + 独立 commit + 独立 QA 回归**。批量只做编排，不合并工程单元。\n4. **修完不自动合并**，必须等用户填完单 bug 或批次最终验收结论。\n5. **没有 Bug 修复验收报告不算完**。每个 BF 编号必须有 `docs/bugfix/reviews/BF-XX.md`，经 forge-qa 和用户/批次两层验收后才进 P7。\n6. **新发现的 bug / 新需求 / 模糊反馈 → 原 bug Pass 后询问是否写入 `docs/bugfix/backlog.md`**，绝不在当前修复内夹带。\n7. **同根判定必须举证**。AI 声称\"这条新发现是当前 bug 同根\"时，必须列出具体证据（同文件、同函数、同数据流），证据不足默认为独立 bug。\n8. **并行协调必须登记**（v6.0）。P2 确认范围 + P3 创建 worktree 之后，必须在项目根 `.forge/active.md` 追加一行会话登记；P2 推荐前必须读 `.forge/active.md` 做功能域判重；P7 合并前必须跑 `git merge --no-commit --no-ff` 预演。清理 active 的责任在 forge-fupan 或 /forge-status，不在 forge-bugfix 自己。\n9. **自动闭环有上限**。同一 bug 连续回修失败 3 次，或遇到需求/设计/环境身份不确定，必须标记 `blocked-human` 并让用户判断，禁止无限循环。\n\n---\n\n## 流程总览\n\n```\n═══════════ 会话级（每会话一次，多次修复复用）═══════════\nP0  环境探测（前置脚本，自动执行）\nP1  问题理解 + 强制读 PRD/ENGINEERING/Bugfix 历史/Memory\n\n═══════════ 每次修复（一次一 bug，可循环）═══════════\nP2   范围推荐\n     ├─ AI 从 docs/bugfix/backlog.md 捞候选 + 列出本会话新报告的 bug\n     ├─ AI 接收 forge-qa 发现的结构化 bug（若来自 QA 自动闭环）\n     ├─ 推荐\"本次修 X\"（1 个 / 或 1-2 共因），其余 → backlog\n     └─ 用户确认范围\nP2.5 创建/更新 Bug 修复验收报告 docs/bugfix/reviews/BF-XX.md\n     ├─ 写入来源、现象、初始证据、Feature Spec 场景、功能域、当前状态\n     └─ 同步 backlog.md 的报告链接\nP3   创建 worktree（端口预检）+ 复现\nP4   根因追踪 + 假设验证 + 5 Whys + 修复方案确认\nP5   worktree 内独立 TDD 驱动修复 + 原子提交\nP5.3 ⭐ 更新 Bug 修复验收报告为待 QA 状态\n     ├─ 写入 TDD 红绿证据、根因、修复摘要、commit、涉及文件\n     └─ 写入人工验收指南草案，QA 区域留给 forge-qa\nP6   ⭐ 调用 forge-qa 自动验收\n     ├─ forge-qa 针对每个验证项跑自动化测试\n     ├─ 强校验 Frontend/Backend 地址、PID、cwd、commit 一致性\n     ├─ 把每个前端交互关键步骤截图嵌入报告\n     ├─ QA 全过 → 单 bug 模式进 P6.5；批量模式标记 qa-pass-pending-final-review\n     └─ QA 有挂 → 有界回 P5；达到上限或有疑问则 blocked-human\nP6.5 ⭐ 用户人工验收 / 批次最终验收\n     ├─ AI 输出\"请人工验收 @ docs/bugfix/reviews/BF-XX.md\"\n     ├─ 用户打开文档填\"你的验收\"列 + 最终结论（Pass / Fail / Pass + 新发现）\n     └─ 用户说\"验收了\" → AI 读报告 → 判定\nP7   ⭐ 按最终结论分流\n     ├─ Pass → worktree 合并决策（合并 / 暂存 / 推迟）\n     ├─ Fail → 回 P5（只修原 bug，不接新问题）\n     └─ Pass + 新发现 → 先完成当前修复的合并/暂存决策 → 进 P7.4\nP7.4 ⭐ Pass 边界确认 + 文档更新询问\n     ├─ 告知用户：本次 bug 已完成，当前修复到此关闭\n     ├─ 列出新问题来源：用户反馈 / QA 发现 / AI 发现的衍生问题\n     ├─ 询问是否写入 docs/bugfix/backlog.md / 报告索引\n     ├─ 用户确认 → 进 P7.5 分流，并输出简短接力 prompt\n     └─ 用户不确认 → 不写 backlog，不继续修新问题，结束本次 bugfix\nP7.5 ⭐ 新发现分流到 backlog\n     ├─ 逐条分析，AI 做分类判断（同根 / 独立 bug / 新需求 / 模糊反馈）\n     ├─ 同根（声称时必须举证）→ 新 bug 建议在新会话修\n     ├─ 独立 bug → backlog.md 的 🐛 待修区，分配 BF-XX\n     ├─ 新需求 → backlog.md 的 💡 新需求区，建议 /forge-prd 立项\n     └─ 模糊反馈 → backlog.md 的 🌀 待澄清区\nP8   沉淀：归档 backlog 对应条目 + bugfix 文档补记\n\n═══════════ 出口 ═══════════\n- 用户想继续修下一个 bug → 默认建议新会话或 /clear、/compact\n  （除非明确共因才本会话继续，由用户主动选择）\n- 全部完成 → 建议 /forge-review、/forge-ship 或 /forge-fupan\n```\n\n**红线**：\n1. 写任何修复代码前必须完成 P2-P4（含范围确认和 5 Whys 根因确认）\n2. 每个 BF 编号必须先有 Bug 修复验收报告（P2.5），修复后必须更新报告（P5.3）才能进入 QA\n3. 报告没有用户最终结论或批次最终结论前，**不进 P7**——即使 QA 全过\n4. 同根判定声称必须举证，证据不足默认独立 bug → 原 bug Pass 后问用户是否写入 backlog，再走新会话\n\n---\n\n## P0 环境探测（会话级·前置脚本，自动执行）\n\n```bash\n# === 基础信息 ===\n_BRANCH=$(git branch --show-current 2>/dev/null || echo \"unknown\")\n_ROOT=$(git rev-parse --show-toplevel 2>/dev/null || pwd)\necho \"分支: $_BRANCH\"\necho \"根目录: $_ROOT\"\necho \"---\"\n\n# === Git 状态 ===\necho \"=== Git 状态 ===\"\ngit status --porcelain 2>/dev/null | head -20\necho \"=== 最近 10 条提交 ===\"\ngit log --oneline -10 2>/dev/null\necho \"---\"\n\n# === 现有 worktree 清单 ===\necho \"=== 现有 worktree ===\"\ngit worktree list 2>/dev/null\necho \"---\"\n\n# === 复现引擎 1: gstack/browse → $BROWSE ===\nBROWSE=\"\"\nfor p in \"$_ROOT/.Codex/skills/gstack/browse/dist/browse\" \\\n         \"$HOME/.Codex/skills/gstack/browse/dist/browse\" \\\n         \"$_ROOT/.Codex/skills/browse/dist/browse\" \\\n         \"$HOME/.Codex/skills/browse/dist/browse\"; do\n  [ -x \"$p\" ] && BROWSE=\"$p\" && break\ndone\n[ -n \"$BROWSE\" ] && echo \"BROWSE=$BROWSE\" || echo \"BROWSE=（不可用）\"\n\n# === 复现引擎 2: Playwright → $PW_AVAILABLE ===\nPW_AVAILABLE=\"false\"\nif command -v npx &>/dev/null && npx playwright --version &>/dev/null 2>&1; then\n  PW_AVAILABLE=\"true\"\nelif python3 -c \"from playwright.sync_api import sync_playwright\" 2>/dev/null; then\n  PW_AVAILABLE=\"true\"\nfi\necho \"PW_AVAILABLE=$PW_AVAILABLE\"\n\n# === 框架 / 测试框架 / Dev Server 状态 ===\n# ... 框架探测 / 测试框架探测 ...\n\n# === 统一 dev server 入口 → $APP_URL ===\nAPP_URL=\"\"\nDEV_STATUS=\"\"\nif [ -f \"$_ROOT/package.json\" ] && (cd \"$_ROOT\" && npm run 2>/dev/null | grep -q \"dev:status\"); then\n  DEV_STATUS=\"$(cd \"$_ROOT\" && npm run dev:status 2>/dev/null || true)\"\n  echo \"$DEV_STATUS\"\n  APP_URL=\"$(printf \"%s\\n\" \"$DEV_STATUS\" | awk '/Frontend:/{print $2; exit}')\"\nelif [ -x \"$_ROOT/scripts/dev-stack.sh\" ]; then\n  DEV_STATUS=\"$(cd \"$_ROOT\" && bash scripts/dev-stack.sh status 2>/dev/null || true)\"\n  echo \"$DEV_STATUS\"\n  APP_URL=\"$(printf \"%s\\n\" \"$DEV_STATUS\" | awk '/Frontend:/{print $2; exit}')\"\nelse\n  # 兼容旧项目：只读探测，不把探测结果当作 worktree 启动许可\n  for port in 3456 3000 4000 5173 8080 8000; do\n    if lsof -i :\"$port\" -sTCP:LISTEN &>/dev/null 2>&1; then\n      APP_URL=\"http://localhost:$port\"\n      _PID=$(lsof -ti :\"$port\" -sTCP:LISTEN 2>/dev/null | head -1)\n      _CWD=$(lsof -p \"$_PID\" 2>/dev/null | awk '$4==\"cwd\"{print $9}')\n      echo \"APP_URL=$APP_URL (PID=$_PID cwd=$_CWD)\"\n      break\n    fi\n  done\nfi\n[ -z \"$APP_URL\" ] && echo \"APP_URL=（未检测到运行中的应用）\"\n\n# === 项目文档清单 ===\nDOC_PRD=\"\"; DOC_ENG=\"\"; DOC_QA=\"\"; DOC_BACKLOG=\"\"; DOC_BUGFIX=\"\"; DOC_REVIEWS=\"\"\nfor p in \"$_ROOT/docs/PRD.md\" \"$_ROOT/PRD.md\"; do [ -f \"$p\" ] && DOC_PRD=\"$p\" && echo \"PRD: $p\" && break; done\nfor p in \"$_ROOT/docs/ENGINEERING.md\" \"$_ROOT/ENGINEERING.md\"; do [ -f \"$p\" ] && DOC_ENG=\"$p\" && echo \"ENGINEERING: $p\" && break; done\nfor p in \"$_ROOT/docs/QA.md\" \"$_ROOT/QA.md\"; do [ -f \"$p\" ] && DOC_QA=\"$p\" && echo \"QA: $p\" && break; done\n\n# backlog（bug 任务池，单一入口）\nfor p in \"$_ROOT/docs/bugfix/backlog.md\" \"$_ROOT/backlog.md\"; do\n  [ -f \"$p\" ] && DOC_BACKLOG=\"$p\" && echo \"BACKLOG: $p\" && break\ndone\nif [ -z \"$DOC_BACKLOG\" ]; then\n  DOC_BACKLOG=\"$_ROOT/docs/bugfix/backlog.md\"\n  echo \"BACKLOG（首次使用，将从模板初始化）: $DOC_BACKLOG\"\nfi\n\n# reviews 目录（每个 bug 一个 Bug 修复验收报告）\nDOC_REVIEWS=\"$_ROOT/docs/bugfix/reviews\"\nmkdir -p \"$DOC_REVIEWS\" 2>/dev/null\necho \"REVIEWS 目录: $DOC_REVIEWS\"\n\n[ -d \"$_ROOT/docs/bugfix\" ] && DOC_BUGFIX=\"$_ROOT/docs/bugfix\" && echo \"BUGFIX 历史: $DOC_BUGFIX\"\n\n# === 报告目录 ===\nREPORT_DIR=\"$_ROOT/.gstack/bugfix-reports\"\nmkdir -p \"$REPORT_DIR/screenshots\" 2>/dev/null\necho \"报告目录: $REPORT_DIR\"\n\n# === 并行会话环境（v6.0 新增）===\n# active.md: 跨 worktree 的心跳文件，项目根 .forge/active.md\nmkdir -p \"$_ROOT/.forge\" 2>/dev/null\nACTIVE=\"$_ROOT/.forge/active.md\"\nif [ ! -f \"$ACTIVE\" ]; then\n  # 首次使用，从模板初始化（模板路径按 skill 安装位置回退）\n  for tpl in \"$HOME/.claude/skills/forge-bugfix/templates/active.md\" \\\n             \"$HOME/.claude/skills/forge/skills/forge-bugfix/templates/active.md\"; do\n    [ -f \"$tpl\" ] && cp \"$tpl\" \"$ACTIVE\" && echo \"✅ 初始化 .forge/active.md（请编辑功能域声明区）\" && break\n  done\nfi\necho \"ACTIVE=$ACTIVE\"\n\n# 当前 Claude Code session id（通过 PID 回溯 ~/.claude/sessions/<pid>.json）\nSID_SCRIPT=\"\"\nfor s in \"$HOME/.claude/skills/forge-bugfix/scripts/get-session-id.sh\" \\\n         \"$HOME/.claude/skills/forge/skills/forge-bugfix/scripts/get-session-id.sh\"; do\n  [ -x \"$s\" ] || [ -f \"$s\" ] && SID_SCRIPT=\"$s\" && break\ndone\nCURRENT_SID=\"\"\nif [ -n \"$SID_SCRIPT\" ]; then\n  CURRENT_SID=$(bash \"$SID_SCRIPT\" 2>/dev/null || echo \"\")\nfi\n[ -n \"$CURRENT_SID\" ] && echo \"SESSION_ID=$CURRENT_SID\" || echo \"SESSION_ID=（无法自动获取，后续 P3 会提示）\"\n\n# 扫一眼 active.md 里\"进行中会话\"节，报告当前有哪些并行会话\nif [ -f \"$ACTIVE\" ]; then\n  echo \"--- 当前并行会话 ---\"\n  awk '/^## 进行中会话/{flag=1;next} /^## /{flag=0} flag && /^- /{print}' \"$ACTIVE\" | grep -v '<!--' || echo \"（暂无）\"\nfi\n```\n\n**关键变量**：\n\n| 变量 | 含义 |\n|------|------|\n| `$BROWSE` | gstack/browse 路径，空=不可用 |\n| `$PW_AVAILABLE` | Playwright 是否可用 |\n| `$APP_URL` | 本地应用 URL（优先来自项目 `dev:status` / `dev-stack status`）|\n| `$DOC_PRD` / `$DOC_ENG` / `$DOC_BUGFIX` | 项目文档路径 |\n| `$DOC_BACKLOG` | bug 任务池 `docs/bugfix/backlog.md` |\n| `$DOC_REVIEWS` | Bug 修复验收报告目录 `docs/bugfix/reviews/` |\n| `$REPORT_DIR` | 截图和报告输出目录 |\n| `$ACTIVE` | 并行心跳文件 `.forge/active.md`（v6.0） |\n| `$CURRENT_SID` | 当前 Claude Code session id（v6.0） |\n\n⚠️ **新增**：APP_URL 不再优先扫描常见端口。若项目提供 `npm run dev:status` 或 `scripts/dev-stack.sh`，必须从统一状态输出读取 URL、PID、cwd，防止 worktree 端口劫持（历史踩坑：worktree 旧 uvicorn 抢 8080，主项目改动不生效，30+ 分钟才定位）。\n\n⚠️ **v6.0 新增**：P0 结束时 AI 必须向用户报告当前 `.forge/active.md` 的\"进行中会话\"情况——如果发现疑似僵尸（worktree 目录不存在 / 分支已合并到 main），**建议用户先跑 /forge-status 清理**再继续。AI 不自己清（那是 /forge-status 的职责）。\n\n---\n\n## P1 问题理解 + 上下文采集（会话级·一次执行）\n\n> ⚡ **会话级声明**：本步只在会话首次进入时执行一次。同一会话做多次修复时，P1 不重读，直接复用上下文。\n\n### 1.1 解析用户输入\n\n用户报告 bug 的方式：\n- 直接描述现象 / 粘贴错误 / 提供截图 / 引用已有 Bug ID\n\n### 1.2 强制读取项目文档\n\n**不读 PRD 不知道\"正确\"，不读 ENGINEERING.md 不理解数据流，不读 bugfix 历史会重复排查。**\n\n| 文档 | 必须/按需 | 读什么 |\n|------|-----------|--------|\n| PRD (`$DOC_PRD`) | **必须** | 功能预期行为、验收标准 |\n| ENGINEERING.md (`$DOC_ENG`) | **必须** | 架构、数据流、模块边界 |\n| Bugfix 历史 (`$DOC_BUGFIX`) | **必须** | 已修 bug 的根因 — 防重复排查 |\n| **Backlog (`$DOC_BACKLOG`)** | **必须** | 任务池 — 了解已登记待修 bug / 新需求 / 待澄清反馈 |\n| **已归档已处理区** | **必须** | 历史修复回溯 — 以后遇到类似问题时搜这里 |\n| QA.md (`$DOC_QA`) | 按需 | 已知问题列表 |\n| Memory（MEMORY.md） | **必须** | feedback 类条目 — 历史踩坑 |\n| `git log --since=\"3 days\" -- affected-files` | 按需 | 最近变更（回归 Bug 必看）|\n\n#### Bugfix 历史检索\n\n```bash\nif [ -n \"$DOC_BUGFIX\" ]; then\n  ls -t \"$DOC_BUGFIX\"/*.md 2>/dev/null | head -5\n  grep -rl \"<用户描述的关键词>\" \"$DOC_BUGFIX\" 2>/dev/null\nfi\n```\n\n匹配到历史记录 → AskUserQuestion：\"这个问题与 BF-XXXX-N 类似，上次根因是 XXX，沿用还是重新排查？\"\n\n### 1.3 检查工作区状态\n\n```bash\ngit status --porcelain\n```\n\n主仓库有未提交变更 → AskUserQuestion：\n- A) 先提交 — commit 后再开始（推荐）\n- B) 先暂存 — stash，修复完 pop\n- C) 直接开始 — worktree 隔离，不影响主仓库\n\n### 1.4 信息不足时\n\n通过 AskUserQuestion 一次问一个：什么操作触发？预期行为？实际行为？一直存在还是最近出现？\n\n---\n\n## P2 范围推荐（多来源捞候选 + 写入 backlog.md）\n\n> 🎯 核心：不做\"全量分诊排序后逐个修\"，而是\"AI 推荐单次修复范围，其余进 backlog.md\"。\n> **v6.0 新增**：P2 必须做功能域判重（读 `.forge/active.md`），决定**同域合并到已有会话** vs **异域鼓励新窗口并行**。\n> **v7.0 新增**：forge-qa 发现的问题也是正式入口。QA 自动闭环可以批量登记 bug，但修复执行仍然一次一个 bug。\n\n### 2.0 并行状态读取 + 功能域准备（v6.0 新增）\n\n**硬性步骤**。在 2.1 捞候选之前，AI 必须：\n\n1. **读 `.forge/active.md`**\n   - 解析\"功能域声明\"区 → 得到本项目的合法功能域标签清单 `$DOMAINS`\n   - 解析\"进行中会话\"节 → 得到所有占用中的域集合 `$BUSY_DOMAINS`（多域条目视为同时占用多个）\n   - 如果 `.forge/active.md` 不存在，AI 提示用户\"首次使用并行化，需要你在 .forge/active.md 里声明功能域标签（示例已给出）\"，并暂停等用户确认后再继续\n\n2. **给每条候选 bug 打功能域标签**\n   - 标签必须从 `$DOMAINS` 选取，不得自创\n   - 重构型 bug 允许多域（逗号分隔），任一域与 `$BUSY_DOMAINS` 有交集即判冲突\n   - 无法判定时向用户确认，不猜测\n\n3. **对照判定**\n   - bug.功能域 ∩ `$BUSY_DOMAINS` ≠ 空 → 标记\"⚠️ 域冲突：域 X 当前由 session Y 占用\"\n   - bug.功能域 ∩ `$BUSY_DOMAINS` = 空 → 标记\"✅ 可并行\"\n\n### 2.1 AI 捞候选\n\n候选来源有三个：\n\n1. **用户本会话报告的 bug**（直接描述）\n2. **forge-qa 发现的结构化 bug**（来自功能开发后的 QA 自动闭环或完整 QA 报告）\n3. **`$DOC_BACKLOG` 的 🐛 待修区**（跨会话登记的）\n\nforge-qa 传入的问题必须包含：标题、严重度、关联 Feature Spec 场景、复现步骤、截图/日志证据、Frontend/Backend 地址、环境身份摘要、是否属于本轮功能范围。缺字段则先补齐报告，不直接修。\n\nAI 合并三个来源，推荐**本次修哪个/哪些**：\n\n```\n推荐规则：\n- 默认推荐 1 个 bug\n- 当且仅当 AI 判断 2 个 bug 共享同一根因时，可推荐 1-2 个（必须举证）\n- 共因判断标准：\n  ✓ 修同一组文件\n  ✓ 改同一个函数/数据结构\n  ✓ 同一个上游依赖（如同一个 API 端点失效）\n- 不共因的\"看起来类似\" → 拆开走多次修复（单独会话）\n- 从 backlog 捞候选时，优先级 P0 > P1 > P2，相同优先级按登记时间\n```\n\n### 2.2 AskUserQuestion 确认\n\n```\n🎯 本次修复范围推荐\n\n本会话新报告：N 个问题\nBacklog 待修区：M 个条目（P0: X 个 / P1: Y 个 / P2: Z 个）\n当前并行会话：K 个（域 asr / 域 player ... 被占用）\n\n我推荐本次修：\n\n  ✅ 本次：[Bug A]（BF-0419-2）\n     来源：本会话新报告 / 或 backlog 登记于 2026-04-17\n     功能域：asr\n     并行判定：✅ 可并行（域 asr 当前无活跃会话）\n        或：⚠️ 域冲突（域 asr 已被 session abc-123 占用——建议你切去那个窗口加入而非新开）\n     理由：阻塞核心流程且独立可定位（或：Bug A + Bug C 共因 = XX.tsx 的 source 字段处理）\n\n  📋 推迟到 backlog（下次修复或下次会话再说）：\n     - Bug B: [症状] → 写入 backlog.md 🐛 待修区（P1，域 auth）\n     - Bug D: [症状] → 写入 backlog.md 🐛 待修区（P2，域 player）\n     - 新需求 N1: [描述] → 写入 backlog.md 💡 新需求区（建议 /forge-prd）\n\n我会把推迟的写入 `$DOC_BACKLOG`，把本次修复的在 P3 登记到 `.forge/active.md`。\n\nA) 同意推荐 — 进入 P3 创建 worktree 并登记 active\nB) 调整范围 — 改修 [其他 bug]\nC) 我想多修一些 — 违反单次修复原则，请说明理由\nD) 域冲突，我切到已有会话 — 本次终止，去 session abc-123 的窗口继续\n```\n\n### 2.3 写入 backlog.md\n\n用户确认后，把推迟的条目追加到 `$DOC_BACKLOG` 的对应区：\n\n**🐛 待修区（独立 bug）**：追加一行到表格：\n\n```markdown\n| BF-0419-3 | [症状一句话] | 会话 2026-04-19 用户报告 | [相关文件/模块] | auth | P1 | pending | — | docs/bugfix/reviews/BF-0419-3.md |\n```\n\n**💡 新需求区**：追加一行到表格：\n\n```markdown\n| N-0419-1 | [新需求一句话] | 会话 2026-04-19 用户报告 | 2026-04-19 | 待立项 |\n```\n\n**🌀 待澄清区**：追加一行到列表：\n\n```markdown\n- [2026-04-19] [模糊反馈原话]，未复现 / 待澄清\n```\n\n如果 `$DOC_BACKLOG` 不存在，AI 从模板 `skills/forge-bugfix/templates/backlog.md` 初始化。\n\n### 2.4 Bug 编号\n\n确认范围时为本次修复分配编号：`BF-{MMDD}-{N}`（N = 当日已用编号 +1）。\n- 编号用于：worktree 命名、commit message、Bug 修复验收报告文件名\n- 从 backlog 捞的条目，沿用其原编号，不重新分配\n\n### 2.5 创建 / 更新 Bug 修复验收报告（硬性）\n\n确认本次修复范围后，AI 必须确保 `$REVIEW_DOC=\"$DOC_REVIEWS/${BUG_ID}.md\"` 存在：\n\n```bash\nREVIEW_DOC=\"$DOC_REVIEWS/${BUG_ID}.md\"\nif [ ! -f \"$REVIEW_DOC\" ]; then\n  cp \"$HOME/.claude/skills/forge-bugfix/templates/review-checklist.md\" \"$REVIEW_DOC\"\nfi\n```\n\n然后写入报告的前置事实：\n\n| 区域 | 填什么 |\n|---|---|\n| 当前状态 | `pending` 或 `in-progress` |\n| 问题发现记录 | 来源、原始描述、关联 Feature Spec、初始影响范围 |\n| 初始证据 | 用户截图、QA 截图、console/network 摘要、日志路径 |\n| 复现记录 | 当前复现结论和待执行步骤 |\n| 验收入口 | 如已知 Frontend/Backend 地址，先写入；最终以 P6 forge-qa 强校验结果为准 |\n\n同时把 `$DOC_BACKLOG` 中该 bug 的“报告”列指向 `docs/bugfix/reviews/${BUG_ID}.md`。\n\n**禁止**等到修完代码才创建报告。报告是单个 bug 的过程案卷，不是最后的附录。\n\n---\n\n## P3 创建 worktree + 复现\n\n### 3.1 创建 worktree\n\n```bash\n# Bug 编号已在 P2.4 确定，例如 BF-0418-9\nBUG_ID=\"BF-0418-9\"\nWT_NAME=\"bf-${BUG_ID#BF-}\"  # → bf-0418-9\nWT_PATH=\"$_ROOT/.worktrees/$WT_NAME\"\nWT_BRANCH=\"bugfix/$WT_NAME\"\n\ngit worktree add \"$WT_PATH\" -b \"$WT_BRANCH\"\necho \"✅ worktree 创建: $WT_PATH (分支: $WT_BRANCH)\"\n```\n\n### 3.1.5 登记 .forge/active.md（v6.0 硬性步骤）\n\nworktree 创建成功之后**立即**登记，不得拖到修复结束再补。\n\n```bash\n# 字段：session id / worktree 相对路径 / 任务 id / 功能域\nDOMAIN=\"<P2.0 打好的功能域标签，单域或逗号分隔多域>\"\nREL_WT=\"${WT_PATH#$_ROOT/}\"   # 存相对路径，便于跨机器\nLINE=\"- session: $CURRENT_SID / worktree: $REL_WT / 任务: $BUG_ID / 域: $DOMAIN\"\n\n# 追加到 active.md 的\"进行中会话\"节末尾（用 awk 精确插入在 \"---\" 之前）\npython3 -c \"\nimport pathlib,re\np=pathlib.Path('$ACTIVE')\ntxt=p.read_text()\n# 找到'## 进行中会话'节，在它后面的（暂无进行中会话）或第一个 --- 之前插入\npat=re.compile(r'(## 进行中会话\\n[\\s\\S]*?)(\\n---)', re.M)\nline='''$LINE'''\ndef repl(m):\n    body=m.group(1)\n    # 去掉占位行\n    body=re.sub(r'\\n（暂无进行中会话）', '', body)\n    if not body.endswith('\\n'):\n        body+='\\n'\n    return body + line + '\\n' + m.group(2)\np.write_text(pat.sub(repl, txt, count=1))\n\"\n\necho \"✅ 已登记到 .forge/active.md: session=$CURRENT_SID 域=$DOMAIN\"\n```\n\n**硬性要求**：\n- `$CURRENT_SID` 为空时 AI 必须停下问用户，不得用 \"unknown\" 或占位符登记\n- 登记失败（awk 未匹配等）必须向用户报错，不得静默跳过\n- backlog.md 中对应 bug 的状态同时改 `in-progress`，\"领取会话\"字段填 session id 前 12 位即可\n\n### 3.2 ⚠️ worktree Dev Server 契约\n\n**强制步骤**。历史踩坑：worktree 内启动的服务和主仓库抢同一端口，curl/前端打到旧代码上，调试 30+ 分钟。\n\n如果本 bug 只需读代码和单元测试即可复现，可以不启动应用；一旦需要浏览器、curl、截图或端到端复现，就必须走项目统一 dev server 入口。\n\n```bash\ncd \"$WT_PATH\"\n\nif [ -f package.json ] && npm run 2>/dev/null | grep -q \"dev:status\"; then\n  npm run dev:status || true\n  npm run dev\n  npm run dev:status | tee /tmp/forge-dev-status.txt\n  APP_URL=$(awk '/Frontend:/{print $2; exit}' /tmp/forge-dev-status.txt)\nelif [ -x scripts/dev-stack.sh ]; then\n  bash scripts/dev-stack.sh status || true\n  bash scripts/dev-stack.sh start\n  bash scripts/dev-stack.sh status | tee /tmp/forge-dev-status.txt\n  APP_URL=$(awk '/Frontend:/{print $2; exit}' /tmp/forge-dev-status.txt)\nelse\n  echo \"未发现统一 dev server 入口；必须显式选择非默认端口，并记录 PID/cwd/URL\"\n  echo \"旧项目兜底探测：\"\n  for port in 3456 3000 4000 5173 8080 8000; do\n    PID=$(lsof -ti :\"$port\" -sTCP:LISTEN 2>/dev/null | head -1)\n    if [ -n \"$PID\" ]; then\n      CWD=$(lsof -p \"$PID\" 2>/dev/null | awk '$4==\"cwd\"{print $9}')\n      echo \"端口 $port: PID=$PID cwd=$CWD\"\n    fi\n  done\nfi\n```\n\n**硬性要求**：\n- 有 `npm run dev:status` 或 `scripts/dev-stack.sh` 时，不得裸跑 `uvicorn` / `vite` / `next dev`。\n- `APP_URL` 必须从状态输出读取，传给复现、截图和 forge-qa；不得凭常见端口猜。\n- 状态输出必须显示监听进程 cwd 属于当前 worktree；不一致就先 `npm run dev:stop` / `bash scripts/dev-stack.sh stop` 后重启。\n- 旧项目没有统一入口时，AI 必须把端口、PID、cwd、URL 写进报告，且不得占用主分支固定端口。\n\n### 3.3 切换到 worktree 工作\n\n```bash\ncd \"$WT_PATH\"\n# 后续所有操作（复现、修改、commit）都在 worktree 内进行\n```\n\n### 3.4 复现 Bug\n\n**确定性复现是调查的核心。无法复现就无法验证修复。**\n\n引擎优先级：Codex browser-use:browser（可用时） > Playwright / gstack-browse > 纯代码\n\n#### Codex browser-use:browser（Codex + Browser Use 插件可用时）\n\n用于前端页面、交互、视觉、控制台相关 bug 的复现：\n\n- 打开 P3.2 得到的 `APP_URL`，不得猜端口\n- 按用户路径操作页面，采集 DOM snapshot 和关键状态截图\n- 复现截图写入 `docs/bugfix/reviews/assets/${BUG_ID}/`，并在报告“初始证据 / 复现截图”区内嵌\n- 读取 console logs，错误写入报告\n- 如果代码或 build 刚变更，验证前 reload 页面并重新采集 DOM/screenshot\n\n规则：\n\n1. 执行浏览器动作前必须加载并遵守 `browser-use:browser` skill。\n2. 使用 Codex in-app browser 的 `iab` backend；不要因为 Computer Use 工具可见就跳过 Browser Use。\n3. Computer Use 只在 Browser Use 不可用、被中断或目标不是浏览器页面时兜底，兜底原因必须写入报告。\n4. P3 复现可以用 Browser Use；P6 正式 QA 仍必须交给 forge-qa。\n\n#### gstack/browse（`$BROWSE` 非空时）\n\n```bash\n$BROWSE goto $APP_URL/path/to/page\n$BROWSE screenshot $REPORT_DIR/screenshots/${BUG_ID}-before.png\n$BROWSE snapshot -i              # 查可交互元素\n$BROWSE click @e5                # 触发 bug\n$BROWSE snapshot -D              # 查变化\n$BROWSE console --errors         # 查 JS 错误\n$BROWSE network                  # 查失败请求\n```\n\n#### Playwright（`$PW_AVAILABLE=true`）\n\n```bash\nnpx playwright test --grep \"related-test\"\nnpx playwright screenshot $APP_URL/path /tmp/${BUG_ID}-before.png\n```\n\n#### 纯代码（始终可用）\n\n```bash\ncurl -s $APP_URL/api/endpoint | python3 -m json.tool\nnpm test -- --grep \"related-test\" 2>/dev/null\npython3 -m pytest -k \"related-test\" -v 2>/dev/null\ntail -50 $_ROOT/logs/*.log 2>/dev/null\n```\n\n**无法复现 → 停止**。AskUserQuestion 升级或收集更多证据。\n\n---\n\n## P4 根因追踪 + 假设验证 + 方案确认\n\n### 4.1 根因追踪\n\n从症状回溯到根因：\n1. **Grep 定位引用**：用错误消息、函数名、API 端点搜索\n2. **Read 追踪调用链**：从入口点沿调用链追踪\n3. **画数据流**：输入 → 处理 → 输出，哪一步断裂？\n4. **检查最近变更**：`git log --oneline -20 -- <affected-files>`\n\n### 4.2 模式检查清单（追踪时内嵌）\n\n- **竞态条件** — 间歇性、时序敏感 → 查共享状态并发访问\n- **空值传播** — TypeError → 查可选值缺少守卫\n- **状态不同步** — 数据不一致、部分更新 → 查事务/回调/生命周期\n- **前后端不一致** — 前端异常但 API 正确 → 查字段映射、类型转换\n- **缓存过期** — 旧数据 → 查 Redis/CDN/浏览器/SW 缓存版本号\n- **配置漂移** — 本地正常线上不行 → 查环境变量、特性开关\n- **进程身份** — 改了代码没效果 → 查进程 cwd（worktree 端口劫持是典型）\n- **SQL/查询错误** — 数据缺失或重复 → 查 WHERE/JOIN/去重\n- **开关/数据就绪错位** — API 通过但 UI 仍不对 → 查 feature flag、config、DB settings、后端 `enabled` 字段、测试数据是否足以展示用户问题\n\n### 4.2.1 用户问题闭环检查（前端/交互 bug 必做）\n\n如果 bug 来自用户反馈，AI 必须把用户原话转成一句可验收断言：\n\n```\n用户原话：<用户看到/无法完成的问题>\n闭环断言：修复后，用户在 <页面/流程> 中应该能 <看到/完成的结果>\n证明方式：<截图 / 交互 / API / 测试命令>\n```\n\n后续 P5/P6/P6.5 都以这句闭环断言为准。**接口 200、单测通过、没有 console error 都只是证据，不等于用户问题闭环。**\n\n### 4.2.2 配置 / 开关 / 数据就绪门禁\n\n涉及页面展示、权限边界、数据可见性、灰度发布、冷启动、实验开关的 bug，根因阶段必须检查并写入报告：\n\n| 检查面 | 必查内容 |\n|---|---|\n| Feature flag / config | 配置文件、环境变量、远程配置、DB settings 是否符合预期 |\n| 后端返回状态 | API 是否返回 `enabled/disabled`、权限状态、空态原因 |\n| 数据就绪 | 本地/测试/线上数据是否足以让用户看到目标状态 |\n| UI fallback | 前端是否因开关/空态/error 走了合理 fallback |\n\n如果配置或数据不满足用户闭环断言，不得声称 bug 已修复；应修正配置/数据，或标记 `blocked-human` 请用户确认开关策略。\n\n### 4.3 假设验证（标签化日志）\n\n在疑似根因处加**标签化临时日志**，每条标注假设编号：\n\n```\n命名规则：[DEBUG H{N}] — N 是假设编号\n  console.log('[DEBUG H1] feedItems length:', items.length)\n  logger.info(f'[DEBUG H2] query params: {params}')\n```\n\n复现后查日志，按 `[DEBUG HN]` 过滤验证。\n\n### 4.4 三振出局\n\n3 个假设都失败 → 立即停止。AskUserQuestion：\n\n```\nA) 继续调查 — 我有新假设：[描述]\nB) 升级处理 — 需要更了解系统的人\nC) 埋点等待 — 加日志，下次触发时捕获\nD) 放弃本次尝试 — git worktree remove，开新会话用精炼描述重启\n   （适用于上下文已嘈杂的情况）\n```\n\n### 4.5 5 Whys 根因确认 + 方案确认\n\n**假设验证通过后不直接动手。先向用户解释根因 + 方案，确认后才进 P5。**\n\n通过 AskUserQuestion，用 5 Whys 因果链：\n\n```\n🔍 根因定位完成（{BUG_ID}）\n\n问题：[用户看到的现象]\n\n5 Whys 因果链：\n  1. 为什么 [症状]？→ 因为 [直接原因]\n  2. 为什么 [直接原因]？→ 因为 [更深一层]\n  3. 为什么 [更深一层]？→ 因为 [根因]\n  ✅ 根因：[一句话]\n\n影响范围：[影响哪些功能/页面]\n\nBug 类型：[选一个]\n  数据流断裂 / 前后端不一致 / 状态同步 / 配置漂移\n  / 工具链约束 / UI 渲染 / 兄弟路径遗漏 / 进程身份\n\n修复方案：\n  A) [用\"做什么\"描述，不写代码] （推荐）\n  B) [备选]\n\n推荐 A，理由 [一句话]。\n```\n\n**用户确认才进 P5。**\n\n### 红旗信号\n\n- \"先临时修一下\" — 没有\"临时\"。要么修到位，要么升级。\n- 还没追踪数据流就提方案 — 在猜。\n- 每次修复都暴露新问题 — 错误层级。\n\n---\n\n## P5 worktree 内最小修复 + 原子提交\n\n### 5.1 修复原则\n\n- **修根因不修症状** — 最小变更，消除实际问题\n- **最少文件、最少行数** — 抵制\"顺手重构\"\n- **只修本次范围内的 bug，不加功能**\n\n### 5.2 ⚠️ 修复中的范围控制（默认硬性拒绝 + 同根必须举证）\n\n**修复过程中识别到以下信号 → 立即停下，列为“待确认新发现”，不在本次修复中处理。**\n\n原 bug 尚未 Pass 时，不把这些新问题正式写入 backlog。AI 只在当前报告或会话回复里保留“待确认新发现”摘要，等原 bug 通过 P6/P6.5 后进入 **P7.4 Pass 边界确认**，由用户决定是否写入文档。\n\n| 信号 | 处理 |\n|------|------|\n| 用户说\"顺便加...\"、\"另外...\"、\"延伸需求\"、\"我希望...\"、\"如果能...\" | 列为待确认新需求；原 bug Pass 后询问是否写入 `$DOC_BACKLOG` 的 💡 新需求区，并建议走 /forge-prd 立项 |\n| 验收反馈中描述了当前功能不存在的行为 | 同上（大概率是新需求） |\n| AI 自己想到\"顺手重构\"、\"加 lint\"、\"优化下\" | **硬性拒绝**：不写入 backlog（backlog 不是 AI 想法垃圾桶），在相关代码加 `// REFACTOR: {想法}` 注释即可，下次动到这个文件时再看 |\n| 修复中发现新 bug（明显不共因）| 列为待确认独立 bug；原 bug Pass 后询问是否写入 `$DOC_BACKLOG` 的 🐛 待修区并分配 BF-XX |\n| 修复中怀疑发现\"同根\"的另一个 bug | **必须举证**（下文 5.2.1）否则默认独立 bug |\n\n#### 5.2.1 同根判定的举证要求（硬约束）\n\nAI 不得轻易声称\"这个新发现和当前 bug 同根、要一起修\"。声称同根必须满足以下**至少一项**并向用户展示证据：\n\n- ✓ **同一文件的同一函数** 被两个症状触发（贴代码位置：文件名:行号）\n- ✓ **同一个数据结构/状态字段** 的错误处理引发两个症状（贴字段名 + 引用点）\n- ✓ **同一个上游依赖失效**（同一个 API 端点 / 同一个外部库调用）\n\n举证不足 → 默认独立 bug，先列为待确认新发现；原 bug Pass 后询问是否写入 backlog，再走下次会话。\n\n新发现 bug 的默认处理：\n\n```\n通过 AskUserQuestion：\n\n🆕 修 {当前 BUG_ID} 时发现新 bug：\n   [新 bug 症状]\n\nAI 同根判定：[独立 / 疑似同根（附证据）]\n我会先把它列为“待确认新发现”，不写入 backlog，也不夹带到本次修复。\n等 {当前 BUG_ID} 通过验收后，我会先告知本次 bug 已完成，再问你是否把这个新问题更新到文档中。\n\nA) 默认：本次修复继续，新 bug 等当前 bug Pass 后再决定是否入档（推荐）\nB) 这是共因（AI 举证已给出）→ 并入当前修复（罕见）\nC) 我现在就想修 → 必须先完成当前 bug 并进入 P7.4；确认入档后开新会话接力\n```\n\n### 5.3 爆炸半径控制\n\n修复涉及 >5 个文件 → AskUserQuestion：\n\n```\n本次修复涉及 N 个文件，超出\"最小修复\"预期。\n\nA) 继续 — 根因确实跨这些文件\nB) 拆分 — 先修关键路径，其余开新会话\nC) 重新思考 — 可能有更精准的方案\n```\n\n### 5.4 原子提交（在 worktree 内）\n\n```bash\n# 仍在 $WT_PATH 内\ngit add <修改的文件>\ngit commit -m \"$(cat <<EOF\nfix(${BUG_ID}): <一句话描述>\n\n根因: <根因>\n修复: <修复方式>\nEOF\n)\"\n```\n\n### 5.5 清理临时代码\n\n删除所有 `[DEBUG H` 标签化日志和断言。\n\n```bash\ngrep -rn \"\\[DEBUG H\" --include=\"*.{js,ts,tsx,py,go,rb}\" .\n# 上述命令应返回空\n```\n\n---\n\n## P5.3 更新 Bug 修复验收报告为待 QA 状态\n\n> 🎯 **关键节点**。代码修完 + 独立 TDD 变绿 + 原子提交之后，AI **必须**更新 `docs/bugfix/reviews/{BUG_ID}.md`。没有完整报告，禁止进入 P6。\n\n### 5.3.1 文档存在性\n\n`$REVIEW_DOC` 应该已经在 P2.5 创建。若不存在，说明流程违规，AI 必须回到 P2.5 补建，并在报告中注明“补建原因”。\n\n```bash\nREVIEW_DOC=\"$DOC_REVIEWS/${BUG_ID}.md\"\ntest -f \"$REVIEW_DOC\" || echo \"❌ Bug 修复验收报告缺失，回 P2.5 补建\"\n```\n\n### 5.3.2 AI 填充的内容\n\nAI 负责更新报告的工程事实和人工验收草案：\n\n| 字段 | 填什么 |\n|------|--------|\n| BUG_ID | `BF-{MMDD}-{N}` |\n| Bug 描述 | 一句话用户视角的现象 |\n| 根因 | P4 5 Whys 追到的根因 |\n| 修复做了什么 | 关键逻辑改动，不超过两句话 |\n| 涉及文件 | 本次 commit 改到的文件列表 |\n| 修复时间 | 当前时间 |\n| 修复 commit | 短 hash + commit message 首行 |\n| TDD / 回归用例 | RED 失败证据 + GREEN 通过证据 |\n| 验收入口 | Frontend/Backend URL 草案；最终由 forge-qa 强校验 |\n| 人工验收指南 | 用户要检查什么 / 怎么操作 / 预期效果 / QA 参考截图占位 |\n| 用户问题闭环断言 | 用户原话 / 最终用户可见结果 / 证明方式 |\n| 配置 / 开关 / 数据就绪 | feature flag、config、后端 enabled 状态、测试数据状态 |\n| 当前状态 | `fixed-awaiting-qa` |\n\n同时把 `$DOC_BACKLOG` 中该 bug 状态更新为 `fixed-awaiting-qa`。\n\n### 5.3.3 人工验收指南最少条件\n\n- **至少 3 条**验证项\n- 其中**至少 1 条边界/异常态**（空数据 / 失败场景 / 错误恢复）\n- 每条验证项必须可以**独立验证**（不依赖其他条）\n- 操作步骤用 `1. ... → 2. ...` 方式写，明确可执行\n\n### 5.3.4 禁止行为\n\n- ❌ AI 不得填\"QA 测试过程与截图证据\"节（留给 forge-qa）\n- ❌ AI 不得填\"你的验收\"列或最终结论（留给用户）\n- ❌ AI 不得自行勾选最终结论\n- ❌ AI 不得省略任何验证项（即使 bug 很小，也要最少 3 条）\n- ❌ AI 不得把多个非同根 bug 写进同一份报告\n\n### 5.3.5 完成后向用户报告\n\n```\n✅ Bug 修复验收报告已更新为待 QA (BF-0419-2)\n\n📄 文档路径：docs/bugfix/reviews/BF-0419-2.md\n\n我已经填好：根因、修复记录、TDD 红绿证据、{N} 条人工验收指南。\n接下来我会调用 forge-qa 跑自动验收（P6），\nQA 会把逐步截图、深度断言、前后端环境身份校验写回报告。\n\n现在开始 P6，请稍候。\n```\n\n---\n\n## P6 调用 forge-qa 自动验收（强规范：必须执行）\n\n> 🎯 **不再由 forge-bugfix 内部做 QA**，明确调用 `/forge-qa`。职责分离 + 双层验收。\n> **本节是 AI 必须执行的硬性流程**，任何 QA 跳过都是违规。\n\n### 6.1 触发前置检查（硬性门禁，不通过不得调用）\n\n调用 forge-qa 之前，AI **必须**逐项核对：\n\n| 检查项 | 命令或方式 | 不通过处理 |\n|---|---|---|\n| Bug 修复验收报告存在 | `test -f \"$REVIEW_DOC\" && echo OK` | 回 P2.5 补建报告 |\n| 人工验收指南 ≥ 3 条 | 读报告，数\"人工验收指南\"表格行数 | 回 P5.3 补齐验证项 |\n| QA 证据区未被 AI 越位填写 | 读\"QA 测试过程与截图证据\"节 | AI 越位填过就清空重来 |\n| 独立 TDD 证据已写入 | 读\"TDD / 回归用例\"节 | 回 P5 补 RED/GREEN 证据 |\n| worktree 代码已提交 | `cd \"$WT_PATH\" && git status --porcelain` 应为空 | 补提交 |\n| 独立 worktree 证据 | 报告 Worktree 字段包含 `.worktrees/bf-...` 或项目约定的独立 worktree 路径 | 回 P3 创建/迁移独立 worktree；已有例外必须写明原因并让用户确认 |\n| 用户问题闭环断言 | 报告有\"用户问题闭环断言\"，且结论不为空 | 回 P5.3 补齐 |\n| 配置/开关/数据检查 | 前端/权限/数据可见性 bug 的报告有\"配置 / 开关 / 数据就绪检查\" | 回 P4 重查根因 |\n| APP_URL 来源（如 bug 类型需要） | `APP_URL` 来自 `npm run dev:status` / `scripts/dev-stack.sh status` 输出 | 回 P3.2 重启并重新读取 |\n| 应用可访问（如 bug 类型需要） | `curl -sf \"$APP_URL\" > /dev/null` | 用统一 dev 入口重启 |\n| 前后端进程身份核对 | `dev:status` 或 `lsof -p $PID \\| grep cwd` 指向当前 worktree | 停当前 worktree 服务后重启；无法确认则 blocked-human |\n\n**任一不通过 → 不启动 forge-qa，先补齐。**\n\n### 6.2 触发 forge-qa（必须用 Skill 工具）\n\nAI **必须**通过 Skill 工具触发 forge-qa，**不得**用自然语言\"暗示\"、不得绕过：\n\n调用格式：\n\n```\nSkill(\n  skill=\"forge-qa\",\n  args=\"mode=B review_doc=<报告路径> bug_id=<BF-XXXX> worktree=<路径> app_url=<URL> commit=<hash>\"\n)\n```\n\n**args 字段强制要求**：\n\n| 参数 | 值 | 必填 |\n|------|-----|------|\n| `mode=B` | 指示 forge-qa 进入 Mode B（单 bug 验收）| ✅ |\n| `review_doc=<路径>` | Bug 修复验收报告的绝对路径 | ✅ |\n| `bug_id=BF-{MMDD}-{N}` | 本次 Bug 编号 | ✅ |\n| `worktree=<路径>` | 当前 worktree 绝对路径 | ✅ |\n| `commit=<hash>` | 修复 commit 短 hash | ✅ |\n| `app_url=<URL>` | 本地应用 URL（若 bug 类型需要；必须来自 dev:status/dev-stack status）| 条件必填 |\n\nAI 在调用前向用户说明：\n\n```\n🧪 调用 forge-qa 做自动验收 (BF-0419-2)\n\nBug 修复验收报告: docs/bugfix/reviews/BF-0419-2.md\n模式: Mode B（单 bug 验收）\n传入参数: review_doc, bug_id, worktree, commit, app_url\n\nforge-qa 会跑完所有验证项，把逐步截图、深度断言、环境身份校验回填到报告里，我等它返回。\n```\n\n然后**立刻**执行 Skill 工具调用，不要做任何其他操作。\n\n### 6.3 等待返回 + 重读报告（不依赖记忆）\n\nforge-qa 执行完成后，AI 必须**重新读取 `$REVIEW_DOC`**，以文件内容为准解析结果：\n\n```bash\ncat \"$REVIEW_DOC\"\n```\n\n**禁止**依赖 Skill 工具返回的文本消息推断 QA 结果，只以报告文件内容为准。\n\n### 6.4 结果解析（三态 + 证据完整性门禁）\n\nforge-qa 返回后，AI **必须先跑 Bug 修复验收报告完整性校验器**，再判断能否进入 P6.5。\n\n校验器路径：本 skill 的 `scripts/validate-bugfix-report.py`。\n\n推荐命令：\n\n```bash\npython3 \"<forge-bugfix skill dir>/scripts/validate-bugfix-report.py\" \\\n  \"$REVIEW_DOC\" \\\n  --ready-for-user \\\n  --expect-app-url \"$APP_URL\" \\\n  --require-browser-evidence \\\n  --require-user-problem-closure \\\n  --require-independent-worktree \\\n  --require-config-readiness\n```\n\n`FRONTEND_OR_INTERACTION_BUG` 的判定：\n\n- bug 涉及页面展示、点击、输入、弹窗、路由、视觉、console/network、移动端适配 → 必须传 `--require-browser-evidence`\n- bug 来自用户反馈 → 必须传 `--require-user-problem-closure`\n- 每个 bug 原则上必须传 `--require-independent-worktree`\n- 前端展示、权限边界、数据可见性、灰度/冷启动开关相关 bug → 必须传 `--require-config-readiness`\n- 纯 API / 纯后端 / 纯脚本 bug → 可去掉 `--require-browser-evidence`；若没有 app_url，也去掉 `--expect-app-url \"$APP_URL\"`。报告仍必须写明浏览器证据来源为 `N/A` 和原因\n\n校验器失败即 `QA_INCOMPLETE`。**不得**因为单元测试、curl smoke 或 forge-qa 文本返回看起来通过，就绕过这个门禁。\n\n| 报告状态 | 信号 | 下一步 |\n|---------|------|--------|\n| QA 证据区所有验证项 = PASS，环境一致性 = PASS，用户问题闭环断言 = PASS，且校验器输出 `QA_EVIDENCE_COMPLETE` | `QA_PASS` | 单 bug 模式进 **P6.5**；批量模式标记 `qa-pass-pending-final-review` |\n| 任一验证项 = FAIL 或环境一致性 = FAIL | `QA_FAIL` | 有界回 **P5** 继续修复 |\n| QA 证据区缺少截图、断言、环境校验、截图文件不存在，或校验器失败 | `QA_INCOMPLETE` | **异常兜底**（见 6.6）|\n| 需求/设计/环境身份无法判断 | `BLOCKED_HUMAN` | 标记 `blocked-human`，整理决策卡问用户 |\n\n### 6.5 QA_FAIL 时的回修纪律\n\n未达到自动闭环上限时，AI 直接：\n\n1. 读报告的\"QA 测试过程与截图证据\"和\"QA 自动闭环记录\"节，看哪条 FAIL + 具体原因 + 证据\n2. 回到 P4.1 重新追根因（**不跳过根因分析**）\n3. 修完 → 重提 commit（新 commit 追加，不 amend）\n4. 更新 `$REVIEW_DOC` 的修复记录、TDD 证据和闭环轮次，**不要改用户验收区**\n5. 回到 P6.1 重新走门禁 → 再次触发 forge-qa\n6. **同一 bug 连续失败 3 次**，或失败原因涉及需求/设计/环境不确定 → 标记 `blocked-human`，给用户决策卡\n\n决策卡必须包含：问题、QA 截图/日志证据、已尝试修复、当前疑问、2-3 个可选决策和 AI 推荐理由。\n\n### 6.6 异常兜底\n\n#### 异常 A：Skill 工具调用失败或不可用\n\n```\n❌ forge-qa 调用失败\n\n错误：<原始错误信息>\n\n处理顺序（AI 必须尝试 A → B → C）：\nA) 重试一次（瞬时失败常见）\nB) AI 手动执行 forge-qa Mode B 的等价流程\n   （按 skills/forge-qa/SKILL.md 的 Mode B 章节逐条跑，亲自回填报告）\nC) 若 B 也不可行 → AskUserQuestion 告知用户 QA 环节无法自动化，\n   请用户决定：C1) 自己先过一遍验证项；C2) 暂停本次修复等环境修好\n```\n\n#### 异常 B：QA_INCOMPLETE（报告缺少证据）\n\nAI 先把报告\"当前状态\"和 `$DOC_BACKLOG` 对应条目更新为 `qa-incomplete`，再处理原因。禁止把 `qa-incomplete` 报告描述成 \"pending user verification\"。\n\n```\n⚠️ forge-qa 未跑完所有验证项\n\n已跑：X / N\n漏掉：<验证项列表>\n原因：<读\"QA 测试过程与截图证据\"节>\n校验器输出：\n<粘贴 validate-bugfix-report.py 的 QA_INCOMPLETE 列表>\n\nAI 必须判断：\n1. 是 blocker 导致（服务挂了/依赖不可用）→ 修 blocker → 回 P6.1 重跑\n2. 是报告里有不可自动验证的项 → 在 QA 证据区标 \"N/A 仅人工验收\"，继续 P6.5 或批次最终验收\n3. 是 forge-qa 内部错误 → 报错给用户，按异常 A 处理\n```\n\n注意：第 2 种只适用于**确实不可自动验证**的非前端项。只要 bug 涉及前端页面或交互，就不能用 \"N/A 仅人工验收\" 代替截图；必须补 browser-use/Playwright 截图，或标记 `blocked-human`。\n\n#### 异常 C：报告被 forge-qa 以外的东西污染\n\n```bash\n# 调用后检查报告是否完整、格式没被破坏\ndiff <(wc -l \"$REVIEW_DOC\") <(预期行数)\n```\n\n若报告结构被破坏 → AskUserQuestion 请用户确认，AI 不自行\"修复\"报告。\n\n### 6.7 铁律（总结）\n\n1. **必须用 Skill 工具调用 forge-qa**，不得用自然语言\"暗示\"\n2. **必须通过门禁检查**（6.1 所有项）才能触发\n3. **必须重读报告文件**解析结果，不依赖记忆或返回消息\n4. **必须通过 `validate-bugfix-report.py --ready-for-user`**，否则就是 `QA_INCOMPLETE`\n5. **前端/交互 bug 没有 Markdown 内嵌截图，禁止进入 P6.5**\n6. **QA_FAIL 未达上限时不打扰用户**，AI 自己回 P5 重来\n7. **连续 3 次 QA 失败必须升级用户**，不能无限循环\n8. **不得越位填\"QA 测试过程与截图证据\"节**，那是 forge-qa 的领地\n\n### 6.8 P3 复现工具复用\n\nforge-bugfix 的 browser-use:browser、gstack/browse、Playwright、截图留证等工具在 **P3 复现**阶段由 forge-bugfix 直接调用。P6 阶段这些工具由 forge-qa 统一编排，结果填到 Bug 修复验收报告，不产出散乱的 QA 报告。\n\nCodex 环境中的优先级：\n\n1. 前端页面/交互/视觉 bug：优先 browser-use:browser\n2. 可重复脚本断言：Playwright / 项目测试框架\n3. 快速探索或已有 gstack 项目：gstack/browse\n4. API / 数据 / 静态逻辑：curl、单元测试、代码检查\n\n---\n\n## P6.5 用户人工验收 / 批次最终验收（硬性关卡）\n\n> 🎯 **关键封闭点**。只有 QA 全过才进这里。单 bug 模式需要用户填写该报告的最终结论；QA 自动闭环/批量模式可以先进入 `qa-pass-pending-final-review`，等待批次最终验收包统一收口。\n> 进入本阶段前必须满足：`forge-qa Mode B` 已回填报告，且 `validate-bugfix-report.py --ready-for-user` 输出 `QA_EVIDENCE_COMPLETE`。否则停在 `QA_INCOMPLETE`，不得请用户验收。\n\n### 6.5.1 AI 通知用户\n\n单 bug 模式下，QA 全过后，AI 向用户发送：\n\n```\n✅ forge-qa 自动验收全过 (BF-0419-2)\n\n📄 请你做人工二次验收：\n   docs/bugfix/reviews/BF-0419-2.md\n\n验收地址（QA 也使用同一组地址）：\nFrontend: http://localhost:xxxx\nBackend: http://localhost:yyyy\n环境一致性：PASS\n\n步骤：\n1. 打开文档\n2. 先看\"验收入口与环境身份校验\"，使用同一组前后端地址\n3. 按\"人工验收指南\"逐条亲自验证\n4. 在\"你的验收\"列填 PASS / FAIL + 原因\n5. 在底部\"最终结论\"区勾一个：PASS / FAIL / PASS + 新发现\n6. 如果勾了\"Pass + 新发现\"，在下面的\"新发现\"区把看到的问题一条一行写出来\n7. 填完告诉我一声\"验收了\"\n\n我会读报告，按你的结论推进下一步。\n```\n\n批量模式下，AI 不打断用户逐个验收，而是：\n\n1. 把本 bug 状态写为 `qa-pass-pending-final-review`\n2. 更新 `$DOC_BACKLOG` 对应行\n3. 把本报告加入批次汇总（如 `docs/bugfix/batches/BATCH-YYYY-MM-DD.md`）\n4. 继续处理批次中下一个 bug\n\n批次结束时，才把最终验收包交给用户。\n\n### 6.5.2 等待用户信号\n\nAI 等待用户说\"验收了\"（或同义表达：\"验收完了\"、\"好了你看\"、\"已经填了\"）。\n\n收到信号前 AI 不得：\n- 主动合并 worktree\n- 进入 P7\n- 反复追问\"验收完没\"\n\n可以：\n- 用户问其他问题时正常回答\n- 用户说\"我还没试\"时回应\"不着急，我等你\"\n\n### 6.5.3 读取报告 + 判定\n\n用户说\"验收了\"后：\n\n```bash\n# AI 读取报告\ncat \"$REVIEW_DOC\"\n```\n\n解析\"最终结论\"区，判定三种情况之一：\n\n| 用户勾的是 | AI 下一步 |\n|-----------|----------|\n| PASS | 进 P7 合并决策 |\n| FAIL | 回 P5 继续修（读\"你的验收\"列的 FAIL 原因定位问题）|\n| PASS + 新发现 | 进 P7 完成当前修复的合并/暂存决策 → 进 P7.4 Pass 边界确认 |\n\n### 6.5.4 边界情况\n\n- **用户未填任何勾**：AI 提示\"最终结论还没勾，请选一个再告诉我验收了\"\n- **用户勾了多个**：AI 提示\"最终结论只能选一个，请确认\"\n- **用户填了 ❌ 但也写了新发现**：按 Fail 处理（原 bug 还没修好优先），新发现暂存（不丢），等 Pass 后再分流\n\n---\n\n## P7 按最终结论分流\n\n> 🎯 **Pass 即合并**（不再问\"是否合并\"）。**没有弃用选项**——Fail 走回 P5 继续修，放弃修复走 P4.4 三振出局。\n\n### 7.1 Pass → worktree 合并决策\n\n用户勾了 ✅ Pass，AI **先做合并预演**（v6.0 新增硬性步骤），再询问合并方式。\n\n#### 7.1.0 合并预演（硬性门禁，v6.0 新增）\n\n并行场景下，另一个会话可能已经合并了东西到 main，或者改到了相同文件。正式合并前必须预演：\n\n```bash\n# 进入主仓库（不是 worktree）\ncd \"$_ROOT\"\ngit fetch origin --quiet 2>/dev/null || true\ngit checkout main 2>/dev/null || git checkout master\ngit pull --ff-only 2>/dev/null || true\n\n# --no-commit --no-ff 做一次预演 merge\nif git merge --no-commit --no-ff \"$WT_BRANCH\" 2>/tmp/merge_preview.log; then\n  # 预演成功，立即回退，让下一步真正执行\n  git merge --abort 2>/dev/null\n  MERGE_OK=1\nelse\n  # 冲突了，回退\n  git merge --abort 2>/dev/null\n  MERGE_OK=0\n  echo \"⚠️ 合并预演失败：\"\n  cat /tmp/merge_preview.log\nfi\n```\n\n- `MERGE_OK=1` → 进 7.1.1 询问合并方式\n- `MERGE_OK=0` → 进 7.1.2 冲突处理\n\n#### 7.1.1 合并询问（预演通过时）\n\n```\n🎯 worktree 合并决策 (BF-0419-2)\n\n验收结论：✅ Pass\n合并预演：✅ 无冲突\nworktree: .worktrees/bf-{MMDD}-N\n分支:     bugfix/bf-{MMDD}-N\n本次:     N commits\n\nA) 合并到主分支（推荐）— 我会执行：\n   git checkout main\n   git pull --ff-only\n   git merge --no-ff bugfix/bf-{MMDD}-N\n   git push\n   git worktree remove .worktrees/bf-{MMDD}-N\n   git branch -d bugfix/bf-{MMDD}-N\n\nB) 暂存不合并 — 保留 worktree 和分支待后续\n   （适用于：想攒几个修复一起 review/ship）\n\nC) 推迟决定 — 先做别的，稍后回来处理\n```\n\n合并细节：如果 `git pull` 拉到新的 commits，先在 worktree 内 `git rebase main` 解决冲突，再回主仓库执行 merge。合并后 `git worktree remove` 清理 worktree 并 `git branch -d` 删除分支。\n\n#### 7.1.2 冲突处理（预演失败时）\n\n预演失败说明并行会话改到了相同文件。不自动解决，交给用户决策：\n\n```\n⚠️ 合并冲突 (BF-0419-2)\n\n本次修复合并到 main 会产生冲突。冲突文件：\n{冲突文件列表，来自 /tmp/merge_preview.log}\n\n可能原因：另一个 worktree（查 .forge/active.md）已经合并了修改，或者主分支有新提交。\n\nA) 让我先 rebase（推荐）\n   cd .worktrees/bf-{MMDD}-N\n   git rebase main\n   # 我会尝试自动解决，解决不了的给你标记冲突点\n   解决后回这里重跑 7.1 预演。\n\nB) 暂存这个修复，先处理别的\n   保留 worktree 和分支不动，以后再回来合并。\n\nC) 让我看冲突文件再决定\n   我读冲突文件的当前状态和你的修改对比给你看。\n```\n\n#### 7.1.3 合并后的 active.md 处理（v6.0）\n\n合并成功后 **不立即清理 active.md**——清理的职责分给 forge-fupan（正常结束）或 /forge-status（兜底）。forge-bugfix 只做两件事：\n- 把 `docs/bugfix/backlog.md` 中对应 bug 的状态改 `resolved`，从\"🐛 待修\"剪切到\"🗄️ 已处理\"\n- 保留 active.md 中的那一行（等复盘或 /forge-status 清）\n\n这样如果会话中还要继续修下一个 bug，active.md 的登记仍有效；如果会话在此结束，用户走 /forge-fupan 会一次性清掉。\n\n### 7.2 Fail → 回 P5\n\n```\n❌ 验收未通过 (BF-0419-2)\n\n你标了 ❌ 的验证项：\n  - 第 1 条：「点击登录头像立刻更新」未通过\n    你的说明：登录后头像还是旧的\n\n读 P4 根因链 + P5 修复内容 + 你的反馈，我会回到 P4.1 重新追根因。\n\n不接受新问题进来（新发现请下次验收时说）。\n```\n\n**不弹出 AskUserQuestion**，AI 直接回到 P5 前的根因分析。修完后：\n- 更新 commit（新 commit 追加，不 amend）\n- 更新 `$REVIEW_DOC` 的\"修复 commit\"字段\n- 重跑 P6 → P6.5\n\n### 7.3 Pass + 新发现 → 处置当前修复 + 进 P7.4\n\n```\n✅ Pass + 新发现 (BF-0419-2)\n\n当前 bug 修复已通过你的验收，我会先完成当前修复的合并/暂存决策（同 7.1）。\n新发现不会夹带到当前修复。当前修复处置完成后，我会停在 Pass 边界，\n先告诉你本次 bug 已完成，再问是否把新问题更新到文档中。\n\n处理中...\n```\n\n当前修复处置完成后，立即进入 P7.4（必须问用户，不得自动写 backlog）。\n\n---\n\n## P7.4 Pass 边界确认 + 文档更新询问\n\n> 🎯 **关键边界**：原 bug 一旦 Pass，就先关闭本次修复。新问题可能很重要，但它们不是“当前 bug 未修好”的证据。AI 必须先让用户感知这个边界，再请求是否把新问题入档。\n\n### 7.4.1 触发条件\n\n满足任一条件即进入 P7.4：\n\n- 用户最终结论是 `PASS + 新发现`\n- 用户在当前 bug 已 Pass 后又反馈了新问题\n- forge-qa / 批次最终验收发现了与原 bug 不同的新问题\n- AI 在修复、验证、合并过程中发现了衍生问题，但原 bug 已经通过闭环断言\n\n### 7.4.2 AI 必须先告知“本次 bug 已完成”\n\n输出必须包含三件事：\n\n1. 原 bug 已收敛的依据（用户结论 / QA 结果 / 闭环断言）\n2. 当前修复状态（已合并 / 暂存 / 推迟合并）\n3. 新问题不会在本会话继续修\n\n示例：\n\n```\n✅ {BUG_ID} 本次 bug 修复已完成\n\n证据：\n- forge-qa：PASS\n- 用户最终结论：PASS / PASS + 新发现\n- 用户问题闭环断言：PASS\n- 当前修复状态：已合并到 main / 已暂存 worktree / 推迟合并\n\n你后面提到的这些问题属于新的待处理事项，不再说明 {BUG_ID} 没修好。\n我不会继续在当前修复里改它们。\n```\n\n### 7.4.3 询问是否写入文档\n\n告知完成后，AI 必须用 AskUserQuestion 询问：\n\n```\n要不要我把这些新问题更新到文档里？\n\n我会做的事：\n- 独立 bug → 写入 docs/bugfix/backlog.md 的 🐛 待修区，并分配 BF 编号\n- 新需求 → 写入 docs/bugfix/backlog.md 的 💡 新需求区\n- 模糊反馈 → 写入 docs/bugfix/backlog.md 的 🌀 待澄清区\n- 然后给你一段简短接力 prompt，建议开另一个会话继续\n\nA) 更新到文档，并给接力 prompt（推荐）\nB) 暂不更新，只结束本次 bugfix\nC) 我想先改写这些问题的描述\n```\n\n### 7.4.4 用户选择后的处理\n\n| 用户选择 | AI 行为 |\n|---|---|\n| A | 进入 P7.5，分流写入 backlog / 报告索引，然后输出简短接力 prompt |\n| B | 不写 backlog，不继续修新问题；只总结本次 bugfix 已完成 |\n| C | 请用户给新描述，更新待分流列表后重新询问 A/B |\n\n**禁止行为**：\n- ❌ 不问用户就把新问题写入 backlog\n- ❌ 把新问题当成原 bug 的 Fail 继续回 P5\n- ❌ 在当前会话继续修新问题，除非用户明确要求且重新走 P2-P4；默认仍建议新会话\n- ❌ 给过长、过度规定下个会话方案的接力 prompt\n\n---\n\n## P7.5 新发现分流\n\n> 🎯 **硬性要求**：P7.5 只能在 P7.4 用户确认“更新到文档”后执行。新发现不得直接修、不得进 TODO、不得停在 AI 脑里；确认后必须逐条分类并写入 `docs/bugfix/backlog.md` 对应区。\n\n### 7.5.1 读取新发现\n\n从以下来源合并读取，解析成一条一条的条目（一行一条）：\n\n- Bug 修复验收报告的\"新发现\"区\n- P5.2 修复过程中列出的“待确认新发现”\n- P6/P6.5 中 forge-qa 或用户补充的新问题\n- P7.4 用户改写后的描述\n\n### 7.5.2 AI 逐条分类\n\n对每条新发现，AI 判断属于哪一类：\n\n| 类别 | 判定标准 | 去哪 | 编号 |\n|-----|---------|------|------|\n| 同根关联 bug（罕见）| 符合 P5.2.1 举证要求（同文件同函数/同数据字段/同上游依赖），但原 bug 已 Pass | `$DOC_BACKLOG` 🐛 待修区，标记“共因 with {BUG_ID}”，建议新会话修 | BF-{MMDD}-{N+1}, +2... |\n| 独立 bug | 是可复现的失效行为，但不符合同根标准 | `$DOC_BACKLOG` 🐛 待修区 | BF-{MMDD}-{N+1}, +2... |\n| 新需求 | 描述的是\"希望能...\"、当前功能不存在的能力 | `$DOC_BACKLOG` 💡 新需求区 | N-{MMDD}-{M+1}... |\n| 模糊反馈 | 现象说不清、未复现、\"感觉有点怪\" | `$DOC_BACKLOG` 🌀 待澄清区 | 无编号，时间戳 |\n\n### 7.5.3 AI 必须举证同根\n\n如果 AI 判定某条是\"同根\"，向用户展示证据：\n\n```\n🔍 新发现 #1：登录页右上角铃铛图标偶尔闪一下\n\nAI 判定：疑似同根\n\n举证：\n- 根因位置：AuthStore.ts:45 `onAuthChange` 回调\n- 当前 bug 引用点：Avatar.tsx:23 订阅该回调\n- 新发现引用点：Bell.tsx:17 同样订阅该回调\n- 结论：两者都受 AuthStore.onAuthChange 回调执行时机影响\n\nA) 确认同根 → 建议新会话一起修（我会写进 backlog 并标记\"共因 with BF-0419-2\"）\nB) 我觉得不是 → 按独立 bug 处理，写 backlog.md 🐛 待修区\n```\n\n举证不足 → AI 直接按独立 bug 处理，不问用户（用户如果不认可可覆盖）。\n\n### 7.5.4 分流报告\n\n完成分流后向用户输出总结：\n\n```\n📋 新发现分流完成 (来自 BF-0419-2 的验收)\n\n写入 $DOC_BACKLOG：\n\n🐛 待修 bug:\n  - BF-0419-3 铃铛图标偶尔闪一下（P2，独立）\n  - BF-0419-4 登出时有一次 404 请求（P1，独立）\n\n💡 新需求:\n  - N-0419-1 希望登录页加\"记住我\"选项（建议后续走 /forge-prd）\n\n🌀 待澄清:\n  - [2026-04-19] 翻页时感觉\"卡了一下\"，未复现\n\n接力 prompt（建议开另一个会话继续）：\n\n我刚完成 {BUG_ID}：{原 bug 一句话标题}，原 bug 已通过 QA/人工验收，当前修复状态：{已合并/已暂存/推迟合并}。修复报告：docs/bugfix/reviews/{BUG_ID}.md。过程中发现的新问题已经写入 docs/bugfix/backlog.md：{列出 BF/N 编号和一句话标题}。请从这些新条目里选一个继续 forge-bugfix，先重新判断范围和根因，不要默认沿用上一个 bug 的结论。\n```\n\n接力 prompt 只需要说清：已完成的原 bug、报告路径、backlog 新编号、建议下个会话重新判断。不要塞入完整根因、完整 diff 或强制方案，给下一个会话保留判断空间。\n\n---\n\n---\n\n## P8 沉淀（Bug 修复验收报告作为主产出 + backlog 归档）\n\n### 8.1 主产出：Bug 修复验收报告已就位\n\n`docs/bugfix/reviews/{BUG_ID}.md` 本身已经是最全的历史记录：\n- 问题发现记录（来源 / 初始证据 / Feature Spec 场景）\n- 复现记录与根因分析\n- 修复记录（worktree / TDD 红绿证据 / 文件 / commit）\n- 验收入口与环境身份校验（Frontend / Backend / PID / cwd / commit）\n- 人工验收指南\n- QA 测试过程与 Markdown 内嵌截图证据\n- 最终结论\n\n**不再重写日级别 bugfix 文档的冗余内容**。如果项目有 `docs/bugfix/{日期}.md` 的日汇总习惯，AI 只追加一行索引：\n\n```markdown\n### {BUG_ID}: {一句话标题}\n\n- **状态**: ✅ 已修复 / ❌ 阻塞\n- **Bug 修复验收报告**: [docs/bugfix/reviews/{BUG_ID}.md](./reviews/{BUG_ID}.md)\n- **worktree**: `.worktrees/bf-{MMDD}-N`（已合并 / 暂存）\n```\n\n### 8.2 Backlog 归档（硬动作）\n\n修复完成的 bug，如果原本登记在 `$DOC_BACKLOG` 🐛 待修区，AI 必须：\n\n1. 从\"🐛 待修\"表格中**剪切**该行\n2. 粘贴到\"🗄️ 已处理\"区的对应月份下，格式：\n   ```\n   - **BF-0419-2** 登录头像不刷新 — resolved 2026-04-19 → 详见 docs/bugfix/reviews/BF-0419-2.md\n   ```\n3. **已处理区永久保留**。不做清理，用于将来定位类似问题时回溯。\n\n如果修复过程中有新发现分流进 backlog（P7.5），那些条目是新登记的，保持在待修区。\n\n### 8.2.1 批量最终验收汇总（可选但推荐）\n\n如果本次是 QA 自动闭环或多会话批量修复，AI 必须维护批次汇总文档：\n\n```text\ndocs/bugfix/batches/BATCH-YYYY-MM-DD.md\n```\n\n批次汇总只做聚合，不替代单 bug 报告：\n\n```markdown\n# BATCH-YYYY-MM-DD BugFix 批量修复汇总\n\n## 验收入口\n- Frontend: ...\n- Backend: ...\n- 环境一致性: PASS\n\n## 本批次 Bug\n| Bug ID | 标题 | 状态 | 会话/Worktree | QA | 人工验收 | 报告 |\n|---|---|---|---|---|---|---|\n| BF-0425-1 | ... | qa-pass-pending-final-review | ... | PASS | 待填 | ../reviews/BF-0425-1.md |\n\n## 最终人工验收指南\n{{把本批次需要用户走的关键用户流程合并成一条或少数几条验收路线}}\n```\n\n批次汇总用于让用户最后只验收一次；每个 bug 的技术证据仍回到各自 `BF-XX.md`。\n\n### 8.3 写入 Memory（仅当真的有跨会话价值）\n\n判断标准（严格）：\n\n| 值得 | 不值得 |\n|---|---|\n| 通用踩坑模式（如\"过滤后计数必须联动\"）| 具体代码改动细节 |\n| 新的调试方法论（如\"先查进程 cwd\"）| 一次性配置修复 |\n| 工具使用技巧 | 特定 bug 的症状描述 |\n\n值得 → 写入 `~/.claude/projects/.../memory/feedback_{name}.md`，并在 MEMORY.md 加索引。\n\n> ⚠️ **不要批量写 memory**。默认**不写**，除非你能说出\"这条 memory 在下次会话会触发什么具体行为\"。\n\n### 8.4 同类模式扫描（挪到 /forge-review）\n\n同类模式扫描（grep 全代码库找同类 bug）不是本次修复的范围，挪到 `/forge-review` 做。\n\n---\n\n## 出口：建议下一步\n\nP8 完成后，AskUserQuestion：\n\n```\n✅ 本次修复完成（{BUG_ID}）\n\n📊 当前会话状态：\n  - 已完成的 bug：N 个（{BUG_ID 列表}）\n  - 暂存的 worktree：M 个（git worktree list）\n  - Backlog 待修：K 个（P0: a / P1: b / P2: c）\n\n下一步建议（按场景推荐）：\n\nA) 结束会话，下一个 bug 开新会话（强烈推荐）\n   原因：上下文已经被本次修复占据，继续会引发 scope 蔓延。\n   backlog 里 K 条待修，打开新会话说\"修 bugfix\"即可，我会从 backlog 推荐下一个。\n\nB) 本会话继续修下一个 bug（不推荐，除非明确共因）\n   等价于：立即用 /clear 清上下文，然后回 P2 启动。\n   /compact 也可以，但 /clear 更干净。\n\nC) 暂停修 bug，审查已合并的代码 → /forge-review\n   检查 SQL 安全/竞态条件/枚举完整性等结构性问题。\n\nD) 已合并的 commits 想发布 → /forge-ship\n   更新 CHANGELOG + push + 创建 PR。\n\nE) 想沉淀本会话经验 → /forge-fupan\n   提取知识、诊断 AI/用户协作模式、写复盘文档。\n   （复盘时会自动清理本会话在 .forge/active.md 的登记）\n\nF) 清点所有并行会话 → /forge-status\n   如果你开了多个窗口在修不同 bug，这个命令扫一遍 .forge/active.md，\n   基于 worktree 存在性 + 分支合并状态报告哪些是活跃、哪些是僵尸可清理。\n\nG) 关闭会话 — 没事了\n   ⚠️ 但 .forge/active.md 里本会话的登记还在，下次建议跑 /forge-status 清理。\n\n⚠️ 如果有暂存的 worktree，建议在 review/ship 前先决定它们的去留。\n```\n\n**默认推荐 A**。用户明确偏好：\"新 bug 默认新会话完成工作，或 /clear /compact 后继续\"。\n**走 A) 之前如果用户开了多个并行会话**，AI 可以主动提一句\"别忘了也可以用 /forge-status 总览一下其他会话\"。\n\n---\n\n## AskUserQuestion 格式规范\n\n每次提问结构：\n1. **重新聚焦**：当前项目、分支、正在调查的 BUG_ID\n2. **通俗解释**：高中生能懂的语言\n3. **给出建议**：推荐选项 + 理由\n4. **列出选项**：`A) B) C)`\n\n---\n\n## 重要规则\n\n### 单次修复纪律\n\n1. **每次只修 1 bug，或 1-2 经 P4.5 确认共因的 bug**。其余进 `docs/bugfix/backlog.md`。\n2. **每次一个 worktree**，命名 `.worktrees/bf-{MMDD}-{N}`。\n3. **修完不自动合并**。必须等用户填完单 bug 或批次最终验收结论，AI 才能按 Pass 走 P7 合并。\n4. **新发现的 bug / 新需求 / 模糊反馈 → 原 bug Pass 后先问用户是否写入 backlog.md**。要修就开新会话（默认）或用户明确授权本会话重新走 P2-P4。\n5. **会话出口必须建议下一步**，默认推荐新会话或 /clear、/compact。\n\n### 调查纪律\n\n6. **铁律：不做根因分析就不写修复代码。**\n7. **强制读 PRD + ENGINEERING.md + Bugfix 历史 + backlog.md**（会话级一次）。\n8. **根因必须用 5 Whys 因果链向用户解释，用户确认方案后才动手。**\n9. **3 次假设失败 → 停下来质疑架构（或弃用本次尝试开新会话）。**\n10. **绝不说\"这应该能修好\"**。验证它，证明它。\n11. **修复涉及 >5 个文件 → 必须确认。**\n12. **无法复现就不要修。**\n\n### Bug 修复验收报告纪律（硬性）\n\n13. **P2.5 必须创建或更新 `docs/bugfix/reviews/{BUG_ID}.md`**。没有报告不创建 worktree、不进 P3。\n14. **P5 修复完成后必须更新报告**。根因、修复记录、TDD 红绿证据、人工验收指南缺一不可。\n15. **人工验收指南至少 3 条**，其中至少 1 条边界/异常态。\n16. **AI 不得自行勾选最终结论**。\n17. **没有用户最终结论或批次最终结论不进 P7**，即使 forge-qa 全过。\n17.1. **状态枚举只能使用**：`pending / in-progress / fixed-awaiting-qa / qa-incomplete / qa-failed / qa-pass-pending-user-verification / qa-pass-pending-final-review / qa-pass-user-accepted / blocked-human / resolved / deferred`。\n17.2. **用户问题闭环断言必须存在**。每份报告都要写清：用户原话、最终用户可见结果、证明方式、结论。\n17.3. **配置/开关/数据就绪必须记录**。涉及前端展示、权限边界或数据可见性的 bug，缺少该检查不得进入 QA。\n\n### 自动 QA + 人工验收纪律\n\n18. **P6 明确调用 forge-qa**。不再在 forge-bugfix 内部做 QA。\n19. **forge-qa 全过才进 P6.5 或批次待最终验收状态**。QA 挂了 AI 有界回 P5 继续修，不打扰用户。\n20. **P6 后必须跑报告完整性校验器**：`validate-bugfix-report.py --ready-for-user` 不通过就是 `QA_INCOMPLETE`。\n21. **前端/交互 bug 必须有 Markdown 内嵌 QA 截图**。没有截图、截图路径不存在、环境一致性不是 PASS，都不能交给用户验收。\n22. **P6.5 等用户\"验收了\"信号**。单 bug 模式收到前不合并、不进 P7、不反复追问；批量模式等待最终验收包。\n23. **用户结论三选一**：Pass / Fail / Pass + 新发现。\n24. **Fail 不接受新问题进来**，只继续修原 bug。\n25. **Pass + 新发现**：先完成当前 bug 的合并/暂存决策，再 P7.4 告知“本次 bug 已完成”，询问是否把新问题更新到文档。\n25.0. **Pass 后的新问题必须走确认门**。无论来自用户反馈、QA 发现，还是 AI 发现的衍生问题，只有用户确认后才能写入 backlog / 报告索引。\n25.0.1. **确认入档后必须给简短接力 prompt**。内容只包括：原 bug 已完成、报告路径、已登记的新编号、建议新会话重新判断范围和根因。\n25.1. **自动闭环最多 3 轮**。第 3 次仍失败，或遇到需求/设计/环境身份疑问，必须 `blocked-human`。\n\n### 同根举证纪律（硬约束）\n\n24. **AI 声称\"同根\"必须举证**：同一文件的同一函数 / 同一数据字段 / 同一上游依赖。\n25. **举证不足 → 默认独立 bug 写进 backlog**，不并入当前修复。\n\n### worktree 纪律\n\n26. **worktree 创建后如需启动应用，必须先执行 P3.2 Dev Server 契约**。\n27. **项目存在统一入口时必须使用它**：`npm run dev:status` / `npm run dev` / `scripts/dev-stack.sh`，不得裸跑 `uvicorn`、`vite`、`next dev`。\n28. **不提供 \"弃用 worktree\" 选项**。Fail 走回 P5 继续修；真的要放弃走 P4.4 三振出局。\n29. **多次修复并发允许，但每次独立 worktree + 独立端口**；端口必须来自项目 dev-stack / `.devserver.json` / 状态输出，不能靠猜常见端口。\n29.0. **APP_URL 必须可追溯**：传给浏览器、curl、forge-qa 的 URL 必须能在 dev:status/dev-stack status 中找到对应 cwd。\n29.0.1. **无独立 worktree 不进入 P5**。如果项目无法创建 worktree（磁盘/权限/仓库状态异常），状态改 `blocked-human`，让用户决定，不在主工作区硬修。\n\n### 并行协调纪律（v6.0 新增）\n\n29.1. **P0 必须读 `.forge/active.md`**，把已占用功能域报告给用户；发现僵尸记录建议用户跑 /forge-status 清理。\n29.2. **P2 必须做功能域判重**。同域冲突时优先建议\"切去那个会话\"，不默认新开窗口。\n29.3. **P3 创建 worktree 成功后立即登记 active.md**，不得拖到修复结束。`$CURRENT_SID` 为空必须停下问用户，不得用占位符登记。\n29.4. **功能域标签必须从 `.forge/active.md` 的\"功能域声明\"区选**，AI 不得自创新标签；首次使用的项目由 AI 初始化模板 + 用户编辑域列表后才继续。\n29.5. **P7.1 合并前必须跑 `git merge --no-commit --no-ff` 预演**，冲突就回退 + 让用户决策 rebase 或暂存。\n29.6. **合并成功后不清 active.md**，交给 forge-fupan 或 /forge-status 清理。backlog.md 的状态同步改 `resolved` 是 forge-bugfix 的职责。\n29.7. **不得基于时间戳判定\"会话已死\"**。只认 worktree 存在性 + 分支 merge 状态这两个硬信号。\n\n### Backlog 纪律\n\n30. **新发现分流在用户确认后必须写进 `docs/bugfix/backlog.md`**。不写 TODO.md，不分散到多个文件；用户未确认前不得默默入档。\n31. **\"已处理\"区永久保留**（用户明确要求，用于以后定位问题时回溯）。\n32. **AI 不得往 backlog 塞\"顺手重构\"想法**。那种东西写代码注释 `// REFACTOR: xxx`。\n33. **P2 范围推荐必须先扫 backlog**，把待修区的条目作为候选之一。\n\n### 沉淀纪律\n\n34. **每个修复原子提交**。一个 BUG_ID，一个 commit（或一个 commit 组）。\n34.1. **每个 bug 独立 TDD**。前端 bug 可用 Playwright 断言作为 RED/GREEN，不能只靠截图。\n35. **Bug 修复验收报告即历史产出**，不再重复写 bugfix/{日期}.md（可留索引）。\n36. **Memory 默认不写**。除非能说出\"这条会触发未来什么具体行为\"。\n\n### 完成状态\n\n- **完成** — 根因找到，修复已应用，QA 通过，worktree 已合并/暂存/弃用\n- **完成但有顾虑** — 已修复但无法完全验证（间歇性 Bug、需要线上确认）\n- **阻塞** — 根因不明确，已升级处理\n\n### 升级机制\n\n可以随时停下来说\"超出能力\"或\"对结果没信心\"。\n\n**糟糕的修复比不修更糟。** 升级不会被惩罚。\n\n升级格式：\n```\n状态：阻塞 | 需要更多信息\n原因：[1-2 句话]\n已尝试：[做了什么]\nworktree：[路径，建议保留以便其他人接手]\n建议：[用户接下来做什么]\n```","tags":["forge","bugfix","skills","yike-gunshi","agent-skills","ai-development","claude-code","skill-md","skillsmp"],"capabilities":["skill","source-yike-gunshi","skill-forge-bugfix","topic-agent-skills","topic-ai-development","topic-claude-code","topic-forge","topic-skill-md","topic-skillsmp"],"categories":["forge-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/yike-gunshi/forge-skills/forge-bugfix","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add yike-gunshi/forge-skills","source_repo":"https://github.com/yike-gunshi/forge-skills","install_from":"skills.sh"}},"qualityScore":"0.455","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 11 github stars · SKILL.md body (43,417 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:07:33.221Z","embedding":null,"createdAt":"2026-04-24T07:03:37.862Z","updatedAt":"2026-05-18T19:07:33.221Z","lastSeenAt":"2026-05-18T19:07:33.221Z","tsv":"'+1':1914,5224,5236,5248 '+2':5225,5237 '-04':1751,1863,1881,1885,1892,5354,5511 '-0418':2030,2035,2044 '-0419':1743,1858,1876,3411,3718,4399,4703,4800,4892,4947,5298,5321,5330,5336,5345,5506 '-0425':5563 '-1':938,1877,2337,5346,5564 '-10':726 '-123':1767,1842 '-17':1752 '-19':1864,1882,1886,1893,5355,5512 '-2':243,410,1687,1744,3412,3719,4400,4704,4801,4893,4948,5299,5322,5507,5810,6391 '-20':718,2654 '-3':1859,4038,5331 '-4':26,5337 '-5':1461 '-50':2616 '-9':2031,2036,2045 '/.claude/projects':5604 '/.claude/sessions':1165 '/claudecode_workspace':57 '/clear':219,624,5695,5703,5769,5854 '/compact':220,625,5700,5770,5855 '/dev/null':686,698,716,728,740,781,785,802,838,853,882,921,936,944,1081,1106,1124,1197,1459,1468,2255,2335,2347,2604,2614,2620,3591,4618,4624,4634,4665,4676 '/docs/forge-bugfix-changelog.md':231 '/error':2791 '/forge-bugfix':60 '/forge-cookbook/skills/forge-doc-policy/doc-paths.md':59 '/forge-fupan':633,4884,5727 '/forge-prd':169,607,1810,3003,5351 '/forge-qa':3450 '/forge-review':630,5622,5629,5709 '/forge-ship':631,5719 '/forge-status':345,1340,1346,4856,4876,5738,5755,5778,6221,6276 '/frontend':866,895,2278,2302 '/memory':380 '/memory/feedback_':5605 '/playwright':4187 '/reviews':5472 '/reviews/bf-0425-1.md':5573 '/scripts/validate-bugfix-report.py':3799 '/sw':2682 '/tmp':2583 '/tmp/forge-dev-status.txt':2274,2282,2298,2306 '/tmp/merge_preview.log':4656,4683,4808 '/worktree':5558 '0':1233,4679,4693 '1':233,239,242,406,409,635,743,787,923,1230,1558,1628,1675,1686,2157,2183,2485,2632,2883,3361,3371,3974,4139,4219,4316,4415,4456,4668,4687,4897,5023,5267,5494,5783,5804,5806,5809,5918,6390 '1.1':1359 '1.2':1370 '1.3':1481 '1.4':1504 '10':721,5879 '11':5884 '12':2218,5889 '13':5894 '14':5905 '15':5913 '16':5921 '17':5924 '17.1':5932 '17.2':5970 '17.3':5977 '18':5989 '19':6001 '2':237,644,685,697,715,727,739,770,786,801,837,852,868,881,897,922,935,943,1080,1105,1123,1196,1458,1467,1584,1632,1681,2176,2254,2280,2304,2334,2346,2492,2603,2613,2619,2639,2888,3372,3986,4037,4150,4172,4228,4326,4417,4466,4617,4623,4633,4655,4664,4675,5031,5500,5790,5817 '2.0':1547 '2.1':1554,1624 '2.2':1710 '2.3':1844 '2.4':1905 '2.5':1927 '20':6015 '200':2747 '2026':1750,1862,1880,1884,1891,5353,5510 '21':6026 '22':6040 '23':6052 '24':6058,6115 '25':6063,6123 '25.0':6077 '25.0.1':6089 '25.1':6099 '26':6132 '27':6140 '28':6155 '29':6167 '29.0':6179 '29.0.1':6196 '29.1':6215 '29.2':6223 '29.3':6229 '29.4':6240 '29.5':6252 '29.6':6268 '29.7':6286 '3':25,252,356,655,1435,1602,1643,2508,2643,2837,2893,3356,3399,3486,3991,4020,4160,4233,4266,4330,4421,4471,5036,5515,5793,5824,5875,5915,6101,6104 '3.1':2020 '3.1.5':2072 '3.2':2220 '3.3':2407 '3.4':2422 '30':1322,2232,6297 '3000':909,2322 '31':6304 '32':6309 '33':6319 '34':6325 '34.1':6335 '3456':908,2321 '35':6347 '36':6355 '4':266,662,946,2349,2517,2649,4000,4237,4335,4425,4475,5797,5835 '4.1':2629 '4.2':2655 '4.2.1':2716 '4.2.2':2754 '4.3':2805 '4.4':2835 '4.5':2859 '4000':910,2323 '404':5339 '5':271,440,641,2860,2872,2880,3147,3284,4008,4247,4432,5851,5870,5886 '5.1':2944 '5.2':2956 '5.2.1':3048,3051 '5.3':3144 '5.3.1':3234 '5.3.2':3267 '5.3.3':3353 '5.3.4':3375 '5.3.5':3405 '5.4':3166 '5.5':3193 '5173':911,2324 '6':286,4016,4256,4440,5857 '6.1':3459,4230 '6.2':3619 '6.3':3752 '6.4':3777 '6.5':3967 '6.5.1':4384 '6.5.2':4480 '6.5.3':4505 '6.5.4':4547 '6.6':3956,4042 '6.7':4216 '6.8':4281 '7':297,4264,4447,5860 '7.1':4586,4830,4955 '7.1.0':4597 '7.1.1':4689,4697 '7.1.2':4695,4792 '7.1.3':4842 '7.2':4886 '7.3':4938 '7.4.1':4991 '7.4.2':5016 '7.4.3':5067 '7.4.4':5109 '7.5.1':5169 '7.5.2':5189 '7.5.3':5258 '7.5.4':5315 '8':311,4271,5868 '8.1':5415 '8.2':5482 '8.2.1':5524 '8.3':5581 '8.4':5619 '8000':913,2326 '8080':912,1320,2325 '9':351,949,2352,5874 'a/b':5132 'abc':1766,1841 'abort':4663,4674 'accept':5964 'activ':339,1125,1129,1146,1155,1156,1223,1236,1285,1825,2130 'active.md':1114,1216,2115,4844,4849,4873,4880,6234,6270 'add':2058,3177 'affect':1438 'affected-fil':1437 'ai':177,194,197,209,299,387,393,510,524,560,581,1328,1343,1522,1556,1576,1625,1668,1679,1901,1934,2196,2400,2725,2972,3008,3019,3054,3102,3133,3224,3243,3268,3270,3377,3386,3391,3393,3401,3454,3468,3497,3503,3627,3710,3760,3785,3972,4040,4055,4064,4097,4137,4212,4260,4385,4392,4453,4482,4490,4512,4522,4550,4555,4592,4916,4988,5009,5017,5070,5112,5164,5190,5193,5259,5262,5269,5309,5457,5492,5530,5730,5775,5829,5922,6010,6084,6116,6246,6249,6310 'amend':3999,4927 'api':797,1696,2637,2673,2702,2741,2778,3075,3875,4336 'app':824,826,858,887,925,951,953,964,967,1254,1298,2275,2299,2377,2457,2497,2535,2581,2592,3564,3570,3589,3655,3698,3736,3808,3810,3885,3890,3892,6180 'arg':3645,3658 'askuserquest':1471,1488,1507,1711,2623,2840,2870,3092,3149,4083,4210,4915,5072,5635,5780 'asr':1734,1754,1758,1763 'auth':1793,1868 'authstore.onauthchange':5287 'authstore.ts:45':5274 'avail':773,775,790,805,810,812,1251,2568 'avatar.tsx:23':5280 'await':3341,3351,5940 'awk':865,894,945,1227,2120,2202,2277,2301,2348 'b':1494,1786,1826,2061,2845,2922,3131,3159,3647,3664,3671,3725,4058,4063,4070,4076,4081,4093,4368,4754,4832,5103,5122,5300,5661,5688,5800 'backend':2501,4409,5439,5548 'backlog':413,573,579,616,670,978,1031,1044,1047,1054,1057,1060,1064,1273,1408,1410,1645,1703,1717,1748,1783,1813,1850,1899,1923,2000,2971,2999,3016,3017,3036,3086,3110,3345,4102,4469,4971,5118,5124,5135,5213,5231,5243,5254,5293,5326,5401,5413,5483,5490,5520,5654,5677,5686,6087,6128,6295,6312,6322 'backlog.md':430,595,603,610,1517,1525,1789,1798,1807,1846,2206,5306,5844,5866,6278 'bash':677,878,1193,1447,1483,1944,2023,2082,2245,2287,2291,2294,2395,2411,2532,2570,2589,3171,3199,3249,3766,3797,4200,4511,4607 'batch':5540 'batch-yyyy-mm-dd':5539 'before.png':2543,2586 'bell.tsx:17':5283 'bf':161,276,600,646,1474,1742,1857,1909,2029,2034,2039,2042,2043,3040,3276,3410,3682,3717,4398,4702,4799,4891,4946,5083,5221,5233,5297,5320,5329,5335,5505,5562 'bf-xx':160,599,3039 'bf-xx.md':5580 'bf-xxxx-n':1473 'bf/n':5385 'block':363,505,2802,3611,3960,3964,4027,4191,5966,6111,6208 'blocked-human':362,504,2801,3610,3963,4026,4190,5965,6110,6207 'blocker':4141,4146 'bodi':2155,2159,2164,2169,2172 'body.endswith':2167 'branch':679,681,702,2052,2063,2071,4654,4749,4789 'break':759,959,997,1013,1029,1049,1151,1182 'brows':745,746,757,762,764,765,767,1245,2437,2530,2533,2537,2544,2548,2553,2557,2563 'browser':2430,2432,2441,2443,2445,2488,2490,2498,2506,2512,2520,3814,3846,3882,4185,4289,4291,4323,4325 'browser-us':2429,2440,2487,4184,4288,4322 'bug':5,10,20,22,28,62,63,68,74,77,113,119,124,137,145,151,156,183,187,200,217,240,249,254,269,273,288,292,302,310,354,383,392,399,418,451,489,539,553,585,591,594,622,648,665,667,1032,1069,1071,1274,1279,1362,1368,1405,1414,1443,1544,1546,1586,1593,1604,1617,1630,1637,1677,1683,1740,1773,1775,1785,1794,1830,1854,1906,1920,1930,1940,1949,2002,2007,2013,2024,2032,2040,2110,2208,2235,2424,2452,2467,2541,2552,2584,2720,2723,2764,2796,2876,2903,2954,2966,2977,2995,3027,3030,3032,3045,3050,3057,3080,3083,3089,3095,3098,3100,3114,3118,3125,3127,3140,3185,3214,3228,3254,3262,3274,3279,3347,3396,3403,3407,3474,3556,3568,3585,3651,3673,3678,3680,3686,3703,3720,3727,3732,3787,3832,3834,3848,3857,3868,3878,3927,4018,4177,4250,4309,4320,4351,4388,4458,4477,4565,4865,4879,4950,4962,4978,4985,4999,5007,5014,5020,5025,5039,5042,5063,5077,5137,5174,5200,5209,5218,5227,5278,5303,5311,5328,5363,5366,5369,5379,5393,5399,5411,5417,5420,5460,5466,5469,5473,5487,5536,5552,5553,5578,5600,5626,5637,5641,5644,5669,5690,5707,5740,5766,5788,5807,5814,5827,5837,5841,5891,5898,5983,6029,6046,6062,6067,6074,6094,6126,6328,6337,6341,6348,6373 'bugfix':3,349,576,618,980,1090,1093,1096,1270,1380,1399,1402,1445,1451,1456,1466,2053,3446,4286,4300,4860,5106,5127,5390,5450,5544,5683,5864,5998,6284,6351 'bugfix/bf-':4714,4737,4751 'build':2478 'busi':1570,1597,1606,1619 'c':794,1499,1776,1831,2124,2848,3137,3163,4059,4079,4194,4762,4839,5107,5129,5663,5705,5801 'c1':4088 'c2':4090 'cat':3182,3767,4514,4682 'cd':833,846,876,2246,2412,3519,4611,4820 'changelog':5721 'checkout':4621,4626,4725 'claud':1158,1292 'click':2549 'closur':3820,3855 'code':1159,1293 'codex':43,2428,2439,2444,2494,4314 'command':778 'commit':95,260,333,460,483,1491,1918,2418,3180,3292,3297,3300,3657,3693,3695,3735,3994,3996,4638,4649,4719,4771,4922,4924,4933,5436,5442,5717,6259,6331,6333 'complet':3923,4379 'comput':2503,2509 'config':2709,2770,3333,3827,3872 'consol':2474,2558,2750 'console.log':2817 'console/network':1982,3841 'cookbook':230 'count':2182 'cp':1144,1957 'curl':2229,2239,2590,3587,3902,4339,6184 'current':684,1184,1191,1201,1206,1289,2104,2188,2193,6236 'cwd':482,939,947,957,958,1311,2342,2350,2358,2359,2387,2403,2691,3603,5441,5596,6195 'd':1087,1795,1835,2555,2852,4750,4790,5715 'day':1436 'db':2710,2774 'dd':5543 'debug':2812,2818,2825,2832,3196,3202 'def':2152 'defer':5969 'dev':13,37,815,821,828,841,844,850,856,863,874,885,892,1259,1262,1304,2222,2242,2258,2263,2268,2271,2310,2367,2376,2393,3575,3593,3596,3706,6137,6144,6148,6154,6174,6191 'dev-stack':1261,6173 'devserver.json':6176 'diff':4203,5406 'dir':1099,1110,1283 'dir/screenshots':1104,2540 'doc':50,971,973,975,977,979,981,991,1007,1023,1043,1053,1056,1063,1073,1078,1085,1089,1095,1265,1267,1269,1272,1277,1387,1393,1401,1409,1422,1450,1455,1465,1644,1812,1849,1898,1937,1938,1946,1947,1955,1960,1999,2998,3035,3237,3251,3252,3260,3344,3479,3649,3676,3731,3764,3769,3801,4003,4101,4207,4468,4516,4930,5212,5230,5242,5253,5325,5489 'docs/bugfix':5453 'docs/bugfix/backlog.md':157,166,173,206,251,295,389,563,1276,4863,5079,5087,5092,5167,5383,5816,6299 'docs/bugfix/batches/batch-yyyy-mm-dd.md':4474,5533 'docs/bugfix/reviews':1281,2006,3227,5378,5419,5468,5897 'docs/bugfix/reviews/assets':2466 'docs/bugfix/reviews/bf-0419-2.md':3414,3722,4402,5514 'docs/bugfix/reviews/bf-0419-3.md':1871 'docs/bugfix/reviews/bf-xx.md':80,278,420,513 'dom':2462 'dom/screenshot':2483 'domain':1565,1571,1589,1598,1607,1620,2091,2113,2191 'done':760,961,998,1014,1030,1050,1152,1183,2361 'e':5725 'e5':2550 'echo':687,700,703,706,709,719,729,733,741,763,766,808,855,884,950,966,994,1010,1026,1046,1059,1082,1092,1107,1147,1154,1198,1203,1208,1225,1239,2064,2184,2308,2316,2353,3261,3480,4680 'elif':792,870,2283 'els':899,2307,4669 'enabl':2713,3335 'enabled/disabled':2780 'eng':974,1008,1268,1394 'engin':1011 'engineering.md':1377,1392,5863 'entrypoint':38 'eof':3183,3192 'error':2559,2751 'evid':3815,3847,3883,3922,4378 'exit':869,898,2281,2305 'expect':3807,3889 'expect-app-url':3806,3888 'f':831,989,1005,1021,1041,1128,1142,1177,1222,1953,2250,2824,3258,3477,5736 'fail':519,535,3938,3940,3942,3969,3983,4258,4430,4437,4528,4535,4562,4579,4887,5139,5947,6055,6059,6160 'fallback':2788,2793 'fals':776 'featur':87,424,1656,1975,2707,2768,3331,5427 'feedback':1429 'feeditem':2820 'fetch':4614 'ff':336,4631,4641,4652,4730,4736,6262 'ff-on':4630,4729 'fi':807,960,962,1065,1153,1199,1241,1469,1961,2360,2362,4684 'file':1439 'final':131,497,3935,4360,4464,5569,5958 'fix':3184,3340,3350,5939 'fixed-awaiting-qa':3339,3349,5938 'flag':1229,1232,1234,2708,2769,3332 'forg':2,49,100,229,281,342,348,396,466,471,475,1539,1634,1650,1995,2383,2527,3315,3384,3424,3438,3445,3465,3616,3622,3633,3643,3667,3714,3739,3757,3782,3906,4014,4049,4067,4117,4163,4197,4224,4278,4285,4299,4305,4365,4395,4852,4859,5004,5046,5184,5389,5929,5993,5997,6003,6186,6273,6283 'forge-bugfix':1,347,3444,4284,4298,4858,5388,5996,6282 'forge-cookbook':228 'forge-doc-polici':48 'forge-fupan':341,4851,6272 'forge-qa':99,280,395,465,470,474,1538,1633,1649,1994,2382,2526,3314,3383,3423,3437,3464,3615,3621,3632,3642,3666,3713,3738,3756,3781,3905,4013,4048,4066,4116,4162,4196,4223,4277,4304,4364,4394,5003,5045,5183,5928,5992,6002,6185 'forge/active.md':30,321,325,1119,1149,1287,1330,1531,1560,1574,1580,1817,2074,2186,4813,5734,5742,5752,6218,6242 'frontend':3829,4406,5438,5547 'frontend/backend':479,1662,1989,3310 'frontmatt':54 'fupan':343,4853,6274 'g':5748 'git':329,680,690,707,710,712,723,736,1432,1484,2056,2651,2854,3176,3179,3522,4613,4620,4625,4628,4645,4661,4672,4724,4727,4732,4740,4742,4748,4768,4775,4782,4788,4824,5651,6255 'go':3209 'goto':2534 'green':3307 'grep':839,1237,1462,2256,2574,2599,2633,3200,3602,5624 'gstack':2436,4332 'gstack-brows':2435 'gstack/browse':744,1246,2529,4292,4334 'h':2813,3197,3203 'h1':2819 'h2':2826 'hash':3299,3697 'head':717,937,1460,2336 'hn':2833 'home/.claude/skills/forge-bugfix/scripts/get-session-id.sh':1172 'home/.claude/skills/forge-bugfix/templates/active.md':1139 'home/.claude/skills/forge-bugfix/templates/review-checklist.md':1958 'home/.claude/skills/forge/skills/forge-bugfix/scripts/get-session-id.sh':1173 'home/.claude/skills/forge/skills/forge-bugfix/templates/active.md':1140 'home/.codex/skills/browse/dist/browse':753 'home/.codex/skills/gstack/browse/dist/browse':751 'human':364,506,2803,3612,3961,3965,4028,4192,5967,6112,6209 'iab':2500 'id':1161,1205,1210,1295,1369,1941,1950,2008,2033,2041,2085,2089,2111,2216,2468,2542,2585,2877,3096,3115,3186,3229,3255,3275,3652,3681,3733,5040,5064,5219,5364,5380,5421,5461,5470,5474,5554,5638,5645,5789,5899,6329 'import':798,2125 'in-app':2495 'in-progress':1968,2210,5935 'includ':3204 'incomplet':3899,3953,4095,4106,4111,4135,4246,4382,5944,6025 'independ':3823,3861 'interact':3831 'items.length':2822 'js':2561,3205 'json':1166 'json.tool':2596 'k':1731,2608,5656,5679 'l':4205 'length':2821 'line':2102,2150,2151,2173 'lint':3012 'list':738,5653 'listen':920,934,2333 'localhost':927,4407,4410 'log':724,1433,2475,2618,2652 'logger.info':2823 'ls':1453 'lsof':916,930,940,2329,2343,3599 'm':1719,2154,2595,2606,3181,5247,5649 'm.group':2156,2175 'main':1338,4604,4622,4726,4777,4803,4826,5057 'markdown':1856,1874,1890,4252,5446,5459,5538,6031 'master':4627 'md':1457,1942,1951,2009,3230,3256,5381,5422,5455,5471,5475,5607,5900,6353 'memori':1426,5583,5612,5617,6356 'memory.md':1427,5609 'merg':34,330,4643,4646,4662,4666,4673,4677,4685,4691,4733,4780,6256,6293 'messag':1919,3301 'mkdir':1076,1101,1120 'mm':5542 'mmdd':1910,3277,3683,4711,4715,4738,4746,4752,4822,5222,5234,5246,5478,5822 'mode':3646,3663,3670,3724,4069,4075,4367 'n':761,862,891,1187,1200,1449,1476,1715,1875,1911,1912,2145,2148,2162,2168,2170,2174,2339,2814,2815,3151,3278,3420,3684,4122,4712,4716,4718,4739,4747,4753,4823,5223,5235,5245,5344,5479,5642,5823 'n/a':3895,4155,4180 'n1':1804 'name':2038,2050,2055,5606 'network':2564 'next':1231,2375,6153 'no-commit':331,4636,4647,6257 'no-ff':334,4639,4650,4734,6260 'npm':835,848,1302,2252,2261,2266,2269,2365,2391,2597,3573,6142,6146 'npx':780,782,2571,2578 'ok':3481,4667,4678,4686,4692 'onauthchang':5275 'onelin':725,2653 'origin':4615 'p':748,756,758,941,984,990,993,996,1000,1006,1009,1012,1016,1022,1025,1028,1036,1042,1045,1048,1077,1102,1121,2128,2344,3600 'p.read':2132 'p.write':2177 'p0':371,672,1326,1706,1721,5658,6216 'p1':375,1348,1356,1707,1724,1791,1869,5341,5660 'p2':314,323,385,638,1513,1528,1708,1727,1800,5145,5333,5662,5698,5849,6224,6320 'p2-p4':637,5144,5848 'p2.0':2092 'p2.4':2026 'p2.5':415,650,3239,3245,3265,3483,5895 'p3':316,432,1213,1815,1821,2016,2518,3538,4282,4295,5904,6230 'p3.2':2455,3581,6136 'p4':437,639,2625,3283,3562,4904,5146,5850 'p4.1':3988,4910 'p4.4':4584,6165 'p4.5':246,5812 'p5':443,502,537,2868,2929,2940,3513,3944,4262,4530,4581,4889,4906,4918,5141,5906,6012,6162,6200 'p5.2':5178 'p5.2.1':5203 'p5.3':449,652,3212,3493,3548 'p5/p6/p6.5':2744 'p6':468,1993,2522,3233,3427,3433,3435,4302,4936,5990,6016 'p6.1':4010,4148 'p6.5':117,491,507,3790,3929,4158,4255,4342,4937,6006,6041 'p6/p6.5':2979,5181 'p7':285,327,527,658,4495,4526,4540,4572,5833,5926,6049 'p7.1':6253 'p7.4':546,547,2981,3142,4544,4943,4968,4972,4994,5156,5187,6071 'p7.5':211,567,577,5116,5151,5154,5521 'p8':613,5409,5633 'package.json':2251 'param':2828,2829 'pars':693 'pass':16,129,139,147,184,189,293,495,518,520,529,541,548,668,2968,2982,2996,3033,3084,3128,3915,3917,3919,3925,3933,4358,4413,4429,4436,4438,4442,4462,4524,4537,4545,4570,4574,4587,4591,4706,4939,4944,4959,4973,4980,4996,5001,5048,5050,5051,5054,5211,5550,5567,5571,5831,5842,5950,5956,5962,6038,6054,6056,6064,6078 'pat':2141 'pat.sub':2179 'path':2047,2060,2068,2098,2248,2414,3174,3521 'pathlib':2126 'pathlib.path':2129 'pend':130,496,1870,1966,3934,4113,4359,4463,5568,5934,5951,5957 'pid':481,929,942,955,956,1163,1310,2328,2340,2345,2356,2357,2402,3601,5440 'pid/cwd/url':2315 'player':1736,1802 'playwright':771,783,800,1252,2434,2566,2572,2579,4293,4328,6343 'playwright.sync':796 'polici':51 'pop':1498 'porcelain':714,1486,3524 'port':906,918,928,932,2319,2331,2355 'pr':5724 'prd':972,992,995,1266,1373,1386,1388,5862 'prd/engineering/bugfix':378 'print':867,896,948,1235,2279,2303,2351 'printf':860,889 'problem':3819,3854 'progress':1970,2212,5937 'prompt':214,570,5096,5101,5121,5150,5360,5396,6091 'pull':4629,4728,4769 'push':4741,5722 'pw':772,774,789,804,809,811,1250,2567 'pwd':699 'py':3208 'pytest':2607 'python3':793,2123,2594,2605,3798 'q':840,2257 'qa':97,101,115,120,125,128,191,262,282,397,401,453,463,467,472,476,486,494,499,558,654,660,976,1024,1027,1423,1540,1542,1635,1639,1641,1651,1980,1996,2384,2524,2528,3216,3316,3322,3342,3352,3379,3385,3409,3425,3428,3439,3448,3457,3466,3495,3500,3617,3623,3634,3644,3668,3715,3740,3758,3774,3783,3898,3907,3913,3921,3924,3932,3941,3946,3952,3968,3976,3979,4015,4032,4050,4068,4085,4094,4105,4110,4118,4127,4134,4153,4164,4198,4225,4245,4257,4268,4273,4279,4306,4312,4348,4353,4357,4366,4377,4381,4390,4396,4404,4461,5005,5028,5047,5185,5371,5444,5528,5559,5566,5930,5941,5943,5946,5949,5955,5961,5985,5987,5994,6000,6004,6008,6024,6033,6081,6187,6364 'qa-fail':5945 'qa-incomplet':4104,4109,5942 'qa-pass-pending-final-review':127,493,3931,4356,4460,5565,5954 'qa-pass-pending-user-verif':5948 'qa-pass-user-accept':5960 'qa.md':1421 'queri':2827 'quiet':4616 'r':2143,2161 'rb':3210 're':2127 're.compile':2142 're.m':2149 're.sub':2160 'read':2640 'readi':3803,3828,3873,4241,4373,6020 'ready-for-us':3802,4240,4372,6019 'rebas':4776,4818,4825,6266 'red':3305 'red/green':3515,6345 'redis/cdn':2680 'refactor':3022,6317 'rel':2095,2107 'relat':2576,2601,2610 'related-test':2575,2600,2609 'reload':2481 'remov':2856,4744,4784 'repl':2153,2180 'report':1098,1103,1109,1282,2539 'requir':3813,3817,3822,3826,3845,3852,3860,3871,3881 'require-browser-evid':3812,3844,3880 'require-config-readi':3825,3870 'require-independent-worktre':3821,3859 'require-user-problem-closur':3816,3851 'resolv':4867,5509,5968,6280 'return':2171 'rev':692 'rev-pars':691 'review':132,498,982,1066,1074,1079,1083,1086,1278,1936,1939,1945,1948,1954,1959,3236,3250,3253,3259,3478,3648,3675,3730,3763,3768,3800,3936,4002,4206,4361,4465,4515,4929,5570,5959 'review/ship':4761,5760 'rl':1463 'rn':3201 'root':689,705,834,847,877,2099,4612 'root/.codex/skills/browse/dist/browse':752 'root/.codex/skills/gstack/browse/dist/browse':750 'root/.forge':1122 'root/.forge/active.md':1126 'root/.gstack/bugfix-reports':1100 'root/.worktrees':2048 'root/backlog.md':1039 'root/docs/bugfix':1088,1091 'root/docs/bugfix/backlog.md':1038,1058 'root/docs/bugfix/reviews':1075 'root/docs/engineering.md':1002 'root/docs/prd.md':986 'root/docs/qa.md':1018 'root/engineering.md':1003 'root/logs':2617 'root/package.json':832 'root/prd.md':987 'root/qa.md':1019 'root/scripts/dev-stack.sh':872 'run':836,849,1303,2253,2262,2267,2270,2366,2392,3574,6143,6147 'schema':55 'scope':224,5675 'screenshot':2538,2580 'script':1168,1180,1189,1195 'scripts/dev-stack.sh':879,1307,2285,2288,2292,2295,2370,2396,3577,6149 'scripts/validate-bugfix-report.py':3795 'server':14,816,822,2223,2243,2311,6138 'session':1160,1204,1209,1294,1614,1765,1840,2084,2103,2187,2215 'set':2711,2775 'sf':3588 'show':683,695 'show-curr':682 'show-toplevel':694 'sid':1167,1179,1185,1188,1192,1194,1202,1207,1290,2105,2189,2194,6237 'sinc':1434 'skill':1134,2491,3625,3630,3640,3641,3749,3772,3793,4046,4221 'skill-forge-bugfix' 'skills/forge-bugfix/templates/backlog.md':1903 'skills/forge-qa/skill.md':4073 'smoke':3903 'snapshot':2463,2545,2554 'sourc':1780 'source-yike-gunshi' 'spec':88,425,1657,1976,5428 'sql':2694,5711 'stack':1263,6175 'start':2293 'stash':1496 'status':713,829,842,845,851,857,864,875,880,886,893,1260,1264,1305,1485,2259,2264,2272,2289,2296,2368,3523,3576,3578,3597,3708,6145,6193 'status/dev-stack':3707,6192 'stcp':919,933,2332 'stop':2394,2397 'sync':799 'tail':2615 'tdd':9,92,258,446,456,3221,3303,3418,3506,3509,4005,5433,5910,6339 'tee':2273,2297 'test':2573,2577,2598,2602,2611,3257,3476 'text':2133,2178,5532 'ti':931,2330 'todo':5162 'todo.md':6301 'topic-agent-skills' 'topic-ai-development' 'topic-claude-code' 'topic-forge' 'topic-skill-md' 'topic-skillsmp' 'toplevel':696 'tpl':1137,1143,1145 'true':791,806,854,883,2265,2290,2569,4619,4635 'ts':3206 'tsx':3207 'txt':2131,2181 'typeerror':2663 'ui':2704,2787,2911 'unknown':688,2199 'url':825,827,859,888,926,952,954,965,968,1255,1257,1299,1309,2276,2300,2378,2404,2458,3311,3565,3571,3590,3656,3699,3701,3737,3809,3811,3886,3891,3893,6181,6189 'url/api/endpoint':2593 'url/path':2582 'url/path/to/page':2536 'use':2431,2442,2446,2489,2504,2507,2510,2513,2521,4186,4290,4324 'user':3805,3818,3853,4114,4243,4375,5952,5963,6022 'uvicorn':1318,2373,6151 'v':779,1238,2612 'v6.0':313,1112,1288,1296,1324,1526,1550,2075,4594,4600,4846,6213 'v7.0':1536 'v7.2':18 'validate-bugfix-report.py':4132,4239,4371,6018 'verif':4115,5953 'version':784 'vite':2374,6152 'vs':1534 'wc':4204 'where/join':2698 'whys':441,642,2861,2873,2881,3285,5871 'worktre':7,40,91,256,318,434,444,530,731,735,737,903,1116,1313,1316,1335,1501,1823,1916,2018,2022,2057,2065,2077,2086,2106,2221,2227,2389,2409,2420,2692,2855,2941,3169,3517,3528,3531,3535,3541,3605,3607,3653,3688,3691,3734,3824,3862,4493,4588,4610,4700,4709,4743,4757,4773,4783,4786,4811,4836,5059,5432,5476,5648,5652,5744,5758,5819,5902,6130,6133,6158,6170,6198,6202,6232,6290,6366,6395 'worktrees/bf-':3533,4710,4745,4821,5477,5821 'wt':2037,2046,2049,2051,2054,2059,2062,2067,2070,2096,2097,2108,2247,2413,3173,3520,4653 'x':405,755,871,1175,1612,1722,2284,4121 'xx':162,601,3041 'xx.tsx':1778 'xxx':1479,6318 'xxxx':1475,4408 'y':1615,1725 'yyyi':4411,5541 'z':963,1052,1728 '一个':1070,6327,6330 '一句话':2899,2927 '一句话描述':3187 '一句话标题':5367,5462 '一句话用户视角的现象':3281 '一旦':4979 '一旦需要浏览器':2238 '一次一':61,382 '一次修一个':4 '一次性配置修复':5597 '一次执行':1352 '一次问一个':1508 '一直存在还是最近出现':1512 '一致性':484 '一行一条':5173 '三态':3779 '三振出局':2836,4585,6166 '上下文已经被本次修复占据':5673 '上下文干净':221 '上下文采集':1350 '上次根因是':1478 '上述命令应返回空':3211 '下一个':216,5668 '下一步':3912,4523 '下一步建议':5664 '下文':3047 '下次修复或下次会话再说':1784 '下次动到这个文件时再看':3025 '下次建议跑':5754 '下次触发时捕获':2851 '不':3998,4926 '不一致就先':2390 '不丢':4568 '不产出散乱的':4311 '不依赖其他条':3369 '不依赖记忆':3755 '不依赖记忆或返回消息':4236 '不值得':5588 '不做':1519 '不做根因分析':234 '不做根因分析就不写修复代码':5859 '不做清理':5517 '不共因的':1698 '不再优先扫描常见端口':1300 '不再在':5995 '不再由':3443 '不再说明':5062 '不再重写日级别':5449 '不再重复写':6350 '不再问':4576 '不写':572,5123,5614,6300 '不写代码':2920 '不写入':3015,3109 '不分散到多个文件':6302 '不加功能':2955 '不反复追问':6050 '不可用':768,1249,2514 '不合并工程单元':265 '不同的新问题':5008 '不启动':3614 '不在':346 '不在主工作区硬修':6211 '不在本次修复中处理':2964 '不存在':1575,1900 '不并入当前修复':6129 '不弹出':4914 '不影响主仓库':1503 '不得':3635,3900,4491 '不得停在':5163 '不得凭常见端口猜':2385 '不得基于时间戳判定':6287 '不得填':3378,3387 '不得声称':2795 '不得往':6311 '不得把多个非同根':3402 '不得拖到修复结束':6235 '不得拖到修复结束再补':2081 '不得猜端口':2459 '不得用':2198 '不得用占位符登记':6239 '不得用自然语言':4226 '不得省略任何验证项':3394 '不得绕过':3638 '不得自创':1591 '不得自创新标签':6247 '不得自动写':4970 '不得自行勾选最终结论':3392,5923 '不得裸跑':2372,6150 '不得请用户验收':4383 '不得越位填':4272 '不得轻易声称':3055 '不得进':5161 '不得静默跳过':2205 '不打扰用户':6014 '不打断用户逐个验收':4454 '不把探测结果当作':902 '不把这些新问题正式写入':2970 '不接受新问题进来':4912,6060 '不接新问题':540 '不推荐':5691 '不提供':6156 '不是':3018,4609 '不是最后的附录':2015 '不是本次修复的范围':5627 '不替代单':5535 '不猜测':1601 '不理解数据流':1378 '不直接修':1667 '不着急':4503 '不知道':1374 '不立即清理':4848 '不等于用户问题闭环':2753 '不继续修新问题':574,5125 '不能只靠截图':6346 '不能无限循环':4270 '不能靠猜常见端口':6178 '不自动解决':4796 '不自己清':1344 '不自行':4213 '不要做任何其他操作':3751 '不要因为':2502 '不要塞入完整根因':5404 '不要批量写':5611 '不要改用户验收区':4007 '不要默认沿用上一个':5392 '不论新问题来自用户验收':190 '不读':1372,1376,1379 '不超过两句话':3289 '不跳过根因分析':3990 '不进':657,5903,6048 '不进入':6199 '不进入当前修复':143 '不通过不得调用':3462 '不通过处理':3473 '不通过就是':6023 '不重新分配':1926 '不重读':1357 '不问用户':5313 '不问用户就把新问题写入':5134 '不默认新开窗口':6228 '且':4370 '且不得占用主分支固定端口':2406 '且校验器输出':3920 '且结论不为空':3546 '两种验收节奏':111 '两者都受':5286 '严格':5586 '严重度':1654 '个':244,407,1676,1682,1688,1723,1726,1729,1732,5643,5650,5657 '个假设都失败':2838 '个可选决策和':4039 '个文件':3148,3152,5887 '个条目':1720 '个窗口同时修不同功能域的':27 '个问题':1716 '中':5182 '中对应':2207,4864 '中应该能':2735 '中找到对应':6194 '中的那一行':4874 '中该':2001,3346 '临时':2933 '为什么':2884,2889,2894 '为空必须停下问用户':6238 '为空时':2195 '主产出':5416 '主仓库有未提交变更':1487 '主动合并':4492 '主项目改动不生效':1321 '举证':5272 '举证不足':3078,5308,6124 '举证不通过默认独立':182 '举证已给出':3134 '举证要求':5204 '之前':2122,3467 '之前如果用户开了多个并行会话':5774 '之前插入':2140 '之后':319 '也不可行':4082 '也不夹带到本次修复':3111 '也使用同一组地址':4405 '也去掉':3887 '也可以':5701 '也要最少':3398 '了解已登记待修':1413 '交互':2449,2719,2740,4249,4318,6028 '交给':6271 '交给用户决策':4797 '亲自回填报告':4078 '人工验收':5372,5560 '人工验收指南':108,3318,3485,3490,4423,5443 '人工验收指南最少条件':3354 '人工验收指南缺一不可':5912 '人工验收指南至少':5914 '人工验收时':106 '人工验收纪律':5988 '什么操作触发':1509 '仅人工验收':4156,4181 '仅当真的有跨会话价值':5584 '仍不对':2705 '仍在':3172 '仍必须交给':2525 '从':388,1702,1922,4868,5495 '从以下来源合并读取':5171 '从入口点沿调用链追踪':2642 '从模板':1902 '从模板初始化':1132 '从症状回溯到根因':2631 '从登记':78 '从登记开始就创建结构化':21 '仓库状态异常':6205 '代替截图':4182 '代码修完':3219 '代码已提交':3518 '代码检查':4341 '以后再回来合并':4838 '以后遇到类似问题时搜这里':1420 '以外的东西污染':4199 '以文件内容为准解析结果':3765 '任一不通过':3613 '任一域与':1596 '任一验证项':3937 '任何':3456 '任务':2088,2109 '任务池':1033,1275,1412 '优先':4321 '优先来自项目':1258 '优先级':1705 '优化下':3013 '会一次性清掉':4885 '会产生冲突':4804 '会把逐步截图':3429 '会提示':1214 '会话':1861,1879,5557 '会话出口必须建议下一步':5852 '会话已死':6288 '会话级':368,674,1351 '会话级一次':5867 '会话级声明':1353 '会跑完所有验证项':3741 '传入参数':3729 '传入的问题必须包含':1652 '传给复现':2380 '传给浏览器':6183 '但':5702,5751 '但不符合同根标准':5229 '但也写了新发现':4560 '但修复执行仍然一次一个':1545 '但原':5013,5208 '但它们不是':4983 '但每次独立':6169 '位即可':2219 '你后面提到的这些问题属于新的待处理事项':5061 '你标了':4894 '你的反馈':4908 '你的说明':4901 '你的验收':515,3388,4427,4533 '使用':2493 '使用同一组前后端地址':4420 '例如':2028 '依赖':3771 '依赖不可用':4144 '便于跨机器':2101 '保持在待修区':5523 '保留':4756,4835,4872 '信号':2985,3911,6044 '信息不足时':1505 '修':3093,4145,5682 '修同一组文件':1691 '修复':3190,3296,3694,4214,4932 '修复中发现新':3026 '修复中怀疑发现':3042 '修复中的范围控制':2957 '修复做了什么':3287 '修复内容':4907 '修复原则':2945 '修复后':2731 '修复后必须更新报告':651 '修复完':1497 '修复完成后必须更新报告':5907 '修复完成的':5486 '修复已完成':152,5043 '修复已应用':6363 '修复已通过你的验收':4951 '修复报告':5377 '修复摘要':459 '修复方式':3191 '修复方案':2915 '修复方案确认':442 '修复时':89 '修复时间':3294 '修复涉及':3146,5885 '修复记录':3417,5431,5909 '修复过程中列出的':5179 '修复过程中识别到以下信号':2960 '修复验收报告':11,23,64,75,419,649,1072,1931,3721,4310,5467 '修复验收报告不算完':274 '修复验收报告为待':452,3215 '修复验收报告作为主产出':5412 '修复验收报告即历史产出':6349 '修复验收报告存在':3475 '修复验收报告完整性校验器':3788 '修复验收报告已就位':5418 '修复验收报告已更新为待':3408 '修复验收报告文件名':1921 '修复验收报告的':5175 '修复验收报告的绝对路径':3679 '修复验收报告目录':1280 '修复验收报告纪律':5892 '修复验收报告缺失':3263 '修完':3992 '修完不自动合并':267,5825 '修完后':4920 '修改':2417 '修改的文件':3178 '修根因不修症状':2946 '候选来源有三个':1627 '值':3661 '值得':5587,5602 '假设验证':439,2627,2806 '假设验证通过后不直接动手':2864 '做':5630 '做一次预演':4642 '做了什么':6394 '做什么':2918 '做分类判断':582 '做功能域判重':326 '做自动验收':3716 '停下来质疑架构':5877 '停当前':3606 '停止':2622 '允许多域':1594 '兄弟路径遗漏':2913 '先临时修一下':2931 '先修关键路径':3161 '先做别的':4764 '先做合并预演':4593 '先写入':1991 '先列为待确认新发现':3081 '先向用户解释根因':2865 '先告诉你本次':4961 '先在':4772 '先处理别的':4834 '先完成当前':6066 '先完成当前修复的合并':543 '先把报告':4098 '先提交':1490 '先明确告知用户':149 '先暂存':1495 '先查进程':5595 '先看':4418 '先补齐':3618 '先重新判断范围和根因':5391 '兜底':4857 '兜底原因必须写入报告':2516 '入口':823,2244,2312 '入口重启':3594 '全代码库找同类':5625 '全过':487,661,5931 '全过后':4391 '全过后立即进入':116 '全过才进':6005 '全过才进这里':4349 '全部完成':628 '全量分诊排序后逐个修':1520 '共享同一根因时':1684 '共因':411,1777,5216,5295 '共因判断标准':1690 '关联':86,1655,1974 '关键变量':1242 '关键封闭点':4346 '关键节点':3218 '关键边界':4976 '关键逻辑改动':3288 '关闭会话':5749 '其中':3359 '其中至少':5917 '其他':1829 '其余':412 '其余开新会话':3162 '其余进':250,1524,5815 '具体代码改动细节':5592 '具体原因':3984 '兼容旧项目':900 '内':3170,3175,4774 '内启动的服务和主仓库抢同一端口':2228 '内容只包括':6092 '内嵌':6032 '内嵌截图':4253 '内嵌截图证据':5447 '内最小修复':2942 '内独立':445 '内进行':2421 '内部做':3447,5999 '内部错误':4165 '再':6070 '再判断能否进入':3789 '再回主仓库执行':4779 '再处理原因':4107 '再次触发':4012 '再继续':1342 '再询问合并方式':4596 '再询问是否写入文档':153 '再请求是否把新问题入档':4990 '再走下次会话':3087 '再走新会话':671 '再问你是否把这个新问题更新到文档中':3120 '再问是否把新问题更新到文档中':4964 '再问用户':204 '写':5305 '写任何修复代码前必须完成':636 '写入':455,1516,1788,1797,1806,1845,5078,5086,5091,5324,5582,5603 '写入人工验收指南草案':462 '写入来源':421 '写复盘文档':5732 '写进':6127 '写进同一份报告':3404 '写进报告':2405 '冲突了':4670 '冲突处理':4696,4793 '冲突就回退':6264 '冲突文件':4805 '冲突文件列表':4806 '决定':1532 '决策卡必须包含':4030 '冷启动':2762 '冷启动开关相关':3867 '出口':620,5631 '函数名':2636 '分支':701,2069,4713,5786,6292 '分支合并状态报告哪些是活跃':5746 '分支已合并到':1337 '分流':212,568 '分流写入':5117 '分流报告':5316 '分配':159,598 '分钟':2233 '分钟才定位':1323 '切去那个会话':6227 '切换到':2408 '列':516 '列为':2962 '列为待确认新需求':2993 '列为待确认独立':3029 '列出':5384 '列出新问题来源':556 '列出本会话新报告的':391 '列出选项':5798 '列填':4428 '列或最终结论':3389 '列指向':2005 '列的':4534 '列表':4136,5646 '刚变更':2479 '创建':317,416,433,1822,1928,2017,2021,2066,3240,3539,5723,6231 '创建后如需启动应用':6134 '创建成功之后':2078 '初始化':1148,1904 '初始化模板':6250 '初始影响范围':1977 '初始截图':84 '初始证据':423,1978,2470,5426 '删除分支':4791 '删除所有':3195 '判定':526,4507,5270 '判定三种情况之一':4520 '判定某条是':5263 '判定标准':5196 '判断':1680 '判断属于哪一类':5194 '判断标准':5585 '别忘了也可以用':5777 '前':140,2217 '前先决定它们的去留':5761 '前后端不一致':2671,2907 '前后端环境身份校验写回报告':3431 '前后端进程身份核对':3595 '前的根因分析':4919 '前端':2718,3553,4248,6027,6340 '前端复现和修复后自验':45 '前端展示':3863 '前端异常但':2672 '前端打到旧代码上':2230 '前端是否因开关':2789 '前端页面':4317 '前置脚本':373,675 '剪切':5498 '剪切到':4870 '功能域':427,1605,1618,1753,2090 '功能域准备':1549 '功能域判重':32 '功能域声明':1562,6244 '功能域标签必须从':6241 '功能预期行为':1390 '加':3011 '加日志':2850 '加索引':5610 '匹配到历史记录':1470 '区':1563,4519,5177 '区内嵌':2472 '区勾一个':4435 '区域':1963 '区域留给':464 '区把看到的问题一条一行写出来':4446 '区永久保留':6306 '区的对应月份下':5503 '区选':6245 '升级不会被惩罚':6384 '升级处理':2846 '升级或收集更多证据':2624 '升级机制':6378 '升级格式':6385 '单':67,112,123,488,3672,3726,3926,4350,4387,6045 '单一入口':1034 '单元测试':4340 '单域或逗号分隔多域':2094 '单次修复纪律':5803 '单测通过':2748 '单独会话':1701 '占用':1616,1768 '卡了一下':5357 '即使':659,3395,5927 '即可':5684 '即合并':4575 '历史':379,1094,1400,5865 '历史会重复排查':1381 '历史修复回溯':1419 '历史检索':1446 '历史踩坑':1315,1431,2226 '原':136,144,199,291,666,2965,2994,3031,3082,4564,4977,5024,5365,5368,5840,6093 '原则上必须传':3858 '原因':4125,4431,5672,6389 '原因定位问题':4536 '原始描述':1973 '原始错误信息':4053 '原子提交':448,2943,3167 '原子提交之后':3223 '去':1839 '去哪':5197 '去掉占位行':2158 '去重':2699 '参数':3660 '参考截图占位':3323 '双层验收':3452 '反复追问':4496 '发现':192,559,6082 '发现僵尸记录建议用户跑':6220 '发现时':81 '发现的结构化':398,1636 '发现的衍生问题':561,6085 '发现的问题也是正式入口':1541 '变绿':3222 '变量':1243 '句话':6392 '另一个':4810 '另一个会话可能已经合并了东西到':4603 '另外':2989 '只以报告文件内容为准':3776 '只修原':538 '只修本次范围内的':2953 '只做两件事':4861 '只在':2511 '只在当前报告或会话回复里保留':2973 '只总结本次':5126 '只有':4347 '只有用户确认后才能写入':6086 '只结束本次':5105 '只继续修原':6061 '只能在':5155 '只要':4176 '只要原':186 '只认':6289 '只记录为':141 '只读探测':901 '只追加一行索引':5458 '只需要说清':5397 '只需读代码和单元测试即可复现':2236 '可丢弃':72 '可以':4498 '可以不启动应用':2237 '可以主动提一句':5776 '可以随时停下来说':6379 '可去掉':3879 '可并行':1623,1756 '可循环':384 '可推荐':1685 '可用':6342 '可用时':2433 '可留索引':6354 '可能原因':4809 '可能有更精准的方案':3165 '可追溯':71 '可选但推荐':5526 '可重复脚本断言':4327 '合并':532,5834 '合并三个来源':1669 '合并冲突':4798 '合并决策':531,4527,4589,4701 '合并到主分支':4721 '合并前':33 '合并前必须跑':328,6254 '合并后':4781 '合并后的':4843 '合并成功后':4847 '合并成功后不清':6269 '合并细节':4766 '合并询问':4698 '合并过程中发现了衍生问题':5012 '合并预演':4598,4707 '合并预演失败':4681 '同':4954 '同一':353,4017 '同一上游依赖':6122 '同一个':3074 '同一个上游依赖':1694 '同一个上游依赖失效':3073 '同一个外部库调用':3077 '同一个数据结构':3068 '同一会话做多次修复时':1355 '同一数据字段':6121 '同一文件的同一函数':3063,6120 '同上':3006 '同上游依赖':5207 '同函数':180,307 '同域冲突时优先建议':6226 '同域合并到已有会话':1533 '同意推荐':1819 '同数据字段':5206 '同数据流':308 '同数据流的具体证据':181 '同文件':179,306 '同文件同函数':5205 '同时把':1998,3343 '同样订阅该回调':5284 '同根':175,303,583,588,3043,3058,5264,6118 '同根举证纪律':6113 '同根关联':5199 '同根判定':3103 '同根判定声称必须举证':663 '同根判定必须举证':298 '同根判定的举证要求':3052 '同根必须举证':2959 '同步':429 '同类模式扫描':5620,5623 '后':148,4510 '后先问用户是否写入':5843 '后再决定是否入档':3129 '后再分流':4571 '后再开始':1492 '后又反馈了新问题':5002 '后必须跑报告完整性校验器':6017 '后执行':5159 '后的新问题必须走确认门':6079 '后端':2712,3334 '后端返回状态':2777 '后继续':5771 '后续':1212,2743 '后续所有操作':2415 '后询问是否写入':294,2997,3034,3085 '后进入':2980 '后重启':2398 '后问用户是否写入':669 '向用户发送':4393 '向用户展示证据':5265 '否则停在':4380 '否则就是':4244 '否则默认独立':3049 '含义':1244 '含范围确认和':640 '启动':5699 '启动应用时优先使用项目统一':36 '启动许可':904 '告知':6072 '告知完成后':5069 '告知用户':551,4084 '命令或方式':3472 '命名':1917,5820 '命名规则':2811 '和':3978,4100 '和关键状态截图':2464 '和分支不动':4837 '和分支待后续':4758 '和原因':3896 '和同一组验收地址':109 '和用户':283 '哪一步断裂':2648 '哪些':1672 '哪些是僵尸可清理':5747 '回':536,3264,3482,3492,3512,3537,3547,3561,3580,4147,4529,4888 '回到':3987,4009 '回填前后端地址':102 '回归':263,1442 '回归用例':3304,3510 '回溯':1164 '回调':2669,5276 '回调执行时机影响':5288 '回退':4671 '因为':2886,2891,2896 '因为单元测试':3901 '因果链':2874,2882 '因果链向用户解释':5872 '在':42,1553,3168,4152,4426 '在下次会话会触发什么具体行为':5618 '在下面的':4444 '在修复':5010 '在修复中发现的衍生问题':195 '在它后面的':2137 '在底部':4433 '在当前会话继续修新问题':5142 '在猜':2937 '在疑似根因处加':2808 '在相关代码加':3021 '在调用前向用户说明':3711 '地址':480,1663,1990 '场景':426,1658,5429 '埋点等待':2849 '域':1611,1733,1735,1757,1762,1792,1801,2112,2190 '域冲突':1610,1761,1836 '基于':5743 '基础信息':678 '塞':6313 '填什么':1964,3273 '填充的内容':3269 '填完告诉我一声':4448 '填最终结论':110 '声称':300,6117 '声称同根必须满足以下':3060 '声称时必须举证':589 '处理':2646,2986,4169,4563,4845,5304,5312 '处理中':4965 '处理顺序':4054 '处置当前修复':4941 '备选':2923 '复现':436,2019,2416,2423,4296 '复现可以用':2519 '复现后查日志':2830 '复现工具复用':4283 '复现引擎':742,769 '复现截图':2471 '复现截图写入':2465 '复现步骤':1659 '复现记录':1985 '复现记录与根因分析':5430 '复盘时会自动清理本会话在':5733 '多会话并行协调':12 '多域条目视为同时占用多个':1572 '多来源捞候选':1515 '多次修复复用':370 '多次修复并发允许':6168 '大概率是新需求':3007 '失败场景':3365 '失败必须升级用户':4269 '失败证据':3306 '契约':2224,6139 '好了你看':4487 '如':3567,3584,4473,5590,5594 '如同一个':1695 '如已知':1988 '如果':1573,1897,2722,4767,5261 '如果代码或':2477 '如果会话在此结束':4882 '如果你开了多个窗口在修不同':5739 '如果修复过程中有新发现分流进':5519 '如果勾了':4441 '如果原本登记在':5488 '如果发现疑似僵尸':1334 '如果有暂存的':5757 '如果本':2234 '如果本次是':5527 '如果能':2992 '如果配置或数据不满足用户闭环断言':2794 '如果项目无法创建':6201 '如果项目有':5452 '始终可用':2588 '字段':2083,2714,3272,4934 '字段包含':3532 '字段填':2214 '字段处理':1781 '字段强制要求':3659 '存在':1943 '存在性':5745,6291 '存相对路径':2100 '安全':5712 '安装位置回退':1135 '完成':210,6361 '完成但有顾虑':6370 '完成分流后向用户输出总结':5317 '完成后':5634 '完成后向用户报告':3406 '完成当前修复的合并':4541 '完成状态':6360 '完成的结果':2737 '完整':5405 '完整白名单':53 '定位引用':2634 '实际行为':1511 '实验开关的':2763 '审查已合并的代码':5708 '对应区':5168 '对应条目':617 '对应条目更新为':4103 '对应行':4470 '对每条新发现':5192 '对照判定':1603 '对结果没信心':6382 '导致':4142 '将从模板初始化':1062 '尚未':2967 '就不写修复代码':235 '就不能用':4179 '就先关闭本次修复':4981 '就必须走项目统一':2241 '就绕过这个门禁':3909 '属于当前':2388 '工作':2410 '工具':58,3626 '工具使用技巧':5598 '工具可见就跳过':2505 '工具触发':3631 '工具调用':3750,4222 '工具调用失败或不可用':4047 '工具返回的文本消息推断':3773 '工具链约束':2910 '已':146,188,5000,5210 '已修':1404 '已修复':2797,5464 '已修复但无法完全验证':6371 '已升级处理':6377 '已合并':5033,5374,5480,6367 '已合并到':5056 '已合并的':5716 '已回填报告':4369 '已处理':4871,5502,6305 '已处理区永久保留':5516 '已完成':554,3119,4963,5021,5128,6075,6095 '已完成的':5640 '已完成的原':5398 '已尝试':6393 '已尝试修复':4035 '已归档已处理区':1417 '已收敛':201 '已收敛的依据':5026 '已暂存':5058,5375 '已有例外必须写明原因并让用户确认':3542 '已登记到':2185 '已登记的新编号':6097 '已知问题列表':1425 '已经合并了修改':4814 '已经填了':4488 '已经通过闭环断言':5015 '已被':1764 '已跑':4120 '已通过':5370 '希望登录页加':5347 '希望能':5240 '并':4787 '并入当前修复':176,3135 '并分配':5082 '并向用户展示证据':3062 '并在':5608 '并在报告':2469 '并在报告中注明':3247 '并建议走':3002 '并暂停等用户确认后再继续':1583 '并标记':5294 '并登记':1824 '并给一段简短接力':213 '并给接力':5100 '并行会话环境':1111 '并行判定':1755 '并行协调必须登记':312 '并行协调纪律':6212 '并行场景下':4602 '并行心跳文件':1286 '并行状态读取':1548 '并让用户判断':365 '并记录':2314 '并输出简短接力':569 '并进入':3141 '应为空':3525 '应修正配置':2798 '应用可访问':3583 '应该已经在':3238 '延伸需求':2990 '建议':168,606,629,1809,6398 '建议下一步':5632 '建议下个会话重新判断':5403 '建议你切去那个窗口加入而非新开':1769 '建议保留以便其他人接手':6397 '建议后续走':5350 '建议在':5759 '建议在新会话修':592 '建议开另一个会话继续':5097,5361 '建议新会话一起修':5291 '建议新会话修':5220 '建议新会话重新判断范围和根因':6098 '建议用户先跑':1339 '开关':2700,2756,3329,3551,3559,5979 '开新会话':5670 '开新会话用精炼描述重启':2857 '异域鼓励新窗口并行':1535 '异常':4044,4092,4193 '异常兜底':3954,4043 '异常态':3363,5920 '弃用':6157,6369 '引擎优先级':2427 '引用已有':1367 '引用点':3072,5279 '弹窗':3838 '强制步骤':2225 '强制读':377,5861 '强制读取项目文档':1371 '强校验':478,3317 '强校验结果为准':1997 '强烈推荐':5671 '强规范':3441 '归档':615,5414,5484 '当且仅当':1678 '当前':1157,1291,3094,3113,3690,4949,4984,5277 '当前会话状态':5639 '当前修复到此关闭':203,555 '当前修复处置完成后':4957,4966 '当前修复状态':5032,5055,5373 '当前功能不存在的能力':5241 '当前复现结论和待执行步骤':1986 '当前并行会话':1226,1730 '当前无活跃会话':1759 '当前时间':3295 '当前状态':428,1965,3338,4099 '当前由':1613 '当前疑问':4036 '当前项目':5785 '当日已用编号':1913 '影响哪些功能':2901 '影响范围':2900 '待修':4869,5327,5496,5655 '待修区':597,1647,1718,1790,1799,1852,5081,5214,5232,5307,5491 '待修区并分配':3038 '待填':5572 '待澄清':1896,5352 '待澄清区':612,1888,5094,5255 '待澄清反馈':1416 '待确认新发现':142,2963,2974,3108,5180 '待立项':1887 '很小':3397 '得到所有占用中的域集合':1569 '得到本项目的合法功能域标签清单':1564 '得到的':2456 '心跳文件':31 '必做':2721 '必填':3662 '必查内容':2767 '必看':1444 '必须':1383,1389,1395,1403,1411,1418,1428,1557,3225,3469,3628,3761,5493,6109 '必须举证':178,1689,3046,6119 '必须举证同根':5260 '必须从状态输出读取':2379 '必须从统一状态输出读取':1308 '必须传':3843,3850,3869 '必须做功能域判重':1529,6225 '必须停下问用户':2197 '必须先告知':5018 '必须先完成当前':3139 '必须先执行':6135 '必须先让用户感知这个边界':4989 '必须先说清楚':198 '必须先跑':3786 '必须列出具体证据':305 '必须创建或更新':5896 '必须判断':4138 '必须可追溯':6182 '必须向用户报告当前':1329 '必须向用户报错':2204 '必须回到':3244 '必须在项目根':320 '必须尝试':4056 '必须执行':3442 '必须执行的硬性流程':3455 '必须把用户原话转成一句可验收断言':2726 '必须把端口':2401 '必须显式选择非默认端口':2313 '必须有':6030 '必须来自':3705 '必须标记':361 '必须用':3624,4220,5071 '必须确保':1935 '必须确认':5888 '必须等用户填完单':268,5826 '必须维护批次汇总文档':5531 '必须能在':6190 '必须补':4183 '必须读':6217 '必须通过':4238 '必须通过门禁检查':4229 '必须重读报告文件':4234 '必须问用户':4969 '快速探索或已有':4331 '怎么操作':3320 '总结':4218 '总览一下其他会话':5779 '情况':1333 '想发布':5718 '想攒几个修复一起':4760 '想沉淀本会话经验':5726 '想法':3023,6315 '想法垃圾桶':3020 '感觉有点怪':5252 '成功后立即登记':6233 '我不会继续在当前修复里改它们':5066 '我会从':5685 '我会做的事':5075 '我会停在':4958 '我会先告知本次':3117 '我会先完成当前修复的合并':4952 '我会先把它列为':3107 '我会写进':5292 '我会回到':4909 '我会尝试自动解决':4827 '我会执行':4723 '我会把推迟的写入':1811 '我会读报告':4450 '我切到已有会话':1837 '我刚完成':5362 '我已经填好':3415 '我希望':2991 '我想先改写这些问题的描述':5108 '我想多修一些':1832 '我推荐本次修':1738 '我有新假设':2843 '我现在就想修':3138 '我等你':4504 '我等它返回':3745 '我觉得不是':5301 '我读冲突文件的当前状态和你的修改对比给你看':4841 '我还没试':4501 '或':241,344,408,632,1306,1747,1760,1772,1967,2369,3598,3904,4855,5768,5808,6275,6381 '或一个':6332 '或占位符登记':2200 '或同义表达':4485 '或失败原因涉及需求':4022 '或弃用本次尝试开新会话':5878 '或强制方案':5407 '或批次待最终验收状态':6007 '或批次最终验收':4159 '或批次最终验收结论':270,5828 '或暂存':6267 '或标记':2800,4189 '或校验器失败':3951 '或环境一致性':3939 '或用户明确授权本会话重新走':5847 '或用户补充的新问题':5186 '或第一个':2139 '或者主分支有新提交':4815 '或者改到了相同文件':4605 '或遇到需求':358,6106 '或项目约定的独立':3534 '截图':1660,1981,2739,4033,4188,6034 '截图和':2381 '截图和报告输出目录':1284 '截图或端到端复现':2240 '截图文件不存在':3950 '截图留证等工具在':4294 '截图路径不存在':6036 '所有项':4231 '手动执行':4065 '才把最终验收包交给用户':4479 '才能按':5830 '才能触发':4232 '才能进入':653 '打功能域标签':1587 '打好的功能域标签':2093 '打开':2454 '打开文档':4416 '打开新会话说':5681 '执行':3748 '执行完成后':3759 '执行浏览器动作前必须加载并遵守':2486 '扫一眼':1215 '批次两层验收后才进':284 '批次最终验收':509,4344 '批次最终验收发现了与原':5006 '批次汇总只做聚合':5534 '批次汇总用于让用户最后只验收一次':5576 '批次结束时':4478 '批量修复汇总':5545 '批量只做编排':264 '批量最终验收汇总':5525 '批量模式':122 '批量模式下':4452 '批量模式可以先进入':4355 '批量模式标记':492,3930 '批量模式等待最终验收包':6051 '找到':2134 '把':4862 '把已占用功能域报告给用户':6219 '把待修区的条目作为候选之一':6323 '把推迟的条目追加到':1848 '把新问题当成原':5136 '把本':4457 '把本批次需要用户走的关键用户流程合并成一条或少数几条验收路线':5575 '把本报告加入批次汇总':4472 '把本次修复的在':1814 '把每个前端交互关键步骤截图嵌入报告':485 '把逐步截图':3742 '抢':1319 '抢端口或测到旧服务':41 '报告':1642,2004,3530,4215,4313,5537,5561 '报告中':207 '报告仍必须写明浏览器证据来源为':3894 '报告当前有哪些并行会话':1220 '报告描述成':4112 '报告是单个':2012 '报告有':3544 '报告没有用户最终结论或批次最终结论前':656 '报告状态':3910 '报告目录':1097,1108 '报告索引':564,5119,6088 '报告缺少证据':4096 '报告被':4195 '报告路径':3650,5400,6096 '报错给用户':4166 '抵制':2951 '拆分':3160 '拆开走多次修复':1700 '拉到新的':4770 '挂了':6009 '指向当前':3604 '指示':3665 '按':2831,4072,4422,4561 '按你的结论推进下一步':4451 '按场景推荐':5665 '按异常':4167 '按最终结论分流':528,4573 '按独立':5302 '按用户路径操作页面':2460 '按需':1384,1424,1440 '挪到':5621,5628 '捞候选':390,1626 '捞候选之前':1555 '捞候选时':1704 '捞的条目':1924 '接下来我会调用':3422 '接力':5359,5395 '接口':2746 '接收':394 '控制台相关':2451 '推荐':403,1493,1670,2921,2924,3130,4722,4819,5102 '推荐下一个':5687 '推荐前必须读':324 '推荐单次修复范围':1523 '推荐命令':3796 '推荐理由':4041 '推荐规则':1673 '推荐选项':5795 '推迟':534 '推迟决定':4763 '推迟到':1782 '推迟合并':5035,5060,5376 '描述':1805,2844,2919,3280 '描述的是':5239 '提供截图':1366 '提取知识':5728 '提示':4551,4556 '提示用户':1577 '插件可用时':2447 '摘要':1983,2975 '操作步骤用':3370 '支持':24 '收到信号前':4489 '改了代码没效果':2689 '改修':1828 '改到的文件列表':3293 '改同一个函数':1692 '放弃修复走':4583 '放弃本次尝试':2853 '数':3489 '数据':2799,4337 '数据不一致':2666 '数据可见性':2760,3555,3865 '数据就绪':2783,3330 '数据就绪必须记录':5980 '数据就绪检查':3560 '数据就绪错位':2701 '数据就绪门禁':2757 '数据检查':3552 '数据流':1397 '数据流断裂':2906 '数据结构':1693 '数据缺失或重复':2696 '整理决策卡问用户':3966 '文件':5435 '文件名':3066 '文本返回看起来通过':3908 '文档':1382 '文档存在性':3235 '文档更新询问':550,4975 '文档的冗余内容':5451 '文档落地路径':46 '文档补记':619 '文档路径':3413 '断言':3948 '断言作为':6344 '新':590,3099,3124,3995,4923,5765 '新发现':521,542,3088,4439,4443,4445,4538,4940,4945,4997,5052,5176,5266,6057,6065 '新发现不会夹带到当前修复':4956 '新发现不得直接修':5160 '新发现分流':5152 '新发现分流到':578 '新发现分流在用户确认后必须写进':6298 '新发现分流完成':5318 '新发现引用点':5282 '新发现必须分流':134 '新发现暂存':4567 '新发现的':287,5836 '新发现请下次验收时说':4913 '新增':1113,1297,1325,1527,1537,1551,4601,6214 '新增硬性步骤':4595 '新的调试方法论':5593 '新编号':5402 '新问题不会在本会话继续修':5037 '新问题可能很重要':4982 '新需求':165,289,586,602,1415,1803,5085,5238,5343,5838 '新需求一句话':1878 '新需求区':605,1808,1872,3001,5089,5244 '方式写':3373 '方案':2866 '方案确认':2628,2863 '无冲突':4708 '无法判定时向用户确认':1600 '无法复现':2621 '无法复现就不要修':5890 '无法复现就无法验证修复':2426 '无法完成的问题':2729 '无法确认则':3609 '无法自动获取':1211 '无独立':6197 '无编号':5256 '无论来自用户反馈':6080 '日志':85 '日志证据':1661,4034 '日志路径':1984 '日期':5454,6352 '旧':1317 '旧数据':2678 '旧项目兜底探测':2317 '旧项目没有统一入口时':2399 '时':98,304,2371,2969 '时发现新':3097 '时回应':4502 '时序敏感':2660 '时的回修纪律':3970 '时间戳':5257 '明显不共因':3028 '明确可执行':3374 '明确调用':3449,5991 '是':4140,4161,6281 '是假设编号':2816 '是可复现的失效行为':5228 '是否可用':1253 '是否合并':4577 '是否属于本轮功能范围':1665 '是否把新问题更新到':205 '是否符合预期':2776 '是否返回':2779 '是报告里有不可自动验证的项':4151 '暂不更新':5104 '暂停修':5706 '暂停本次修复等环境修好':4091 '暂存':533,5034,5481,6368 '暂存不合并':4755 '暂存决策':544,4542,4953,6069 '暂存的':5647 '暂存这个修复':4833 '暂无':1240 '暂无进行中会话':2138,2163 '暗示':3637,4227 '更干净':5704 '更新':417,450,1929,3213,3226,4001,4467,4921,4928,5720 '更新到文档':5099,5158 '更新待分流列表后重新询问':5131 '更深一层':2892,2895 '最后由批次汇总统一交给用户验收':133 '最小修复':3154 '最小变更':2947 '最少文件':2949 '最少行数':2950 '最终人工验收指南':5574 '最终以':1992 '最终用户可见结果':3326,5974 '最终由':3313 '最终结论':517,4434,4518,5448 '最终结论只能选一个':4557 '最终结论还没勾':4552 '最近':720 '最近变更':1441 '有':2364 '有交集即判冲突':1599 '有挂':500 '有界回':501,3943,6011 '服务后重启':3608 '服务挂了':4143 '未':138 '未修好':4986 '未匹配等':2203 '未发现统一':2309 '未复现':1895,5251,5358 '未检测到运行中的应用':969 '未跑完所有验证项':4119 '未达上限时不打扰用户':4259 '未达到自动闭环上限时':3971 '未通过':4900 '本':3792 '本会话新报告':1714,1746 '本会话继续修下一个':5689 '本地':2784 '本地应用':1256,3700 '本地正常线上不行':2685 '本批次':5551 '本次':150,552,1739,3291,3685,4717,5019,5041,6073 '本次修':404 '本次修哪个':1671 '本次修复合并到':4802 '本次修复完成':5636 '本次修复涉及':3150 '本次修复继续':3123 '本次修复范围推荐':1713 '本次终止':1838 '本步只在会话首次进入时执行一次':1354 '本节是':3453 '本身已经是最全的历史记录':5423 '权限':3554,6204 '权限状态':2781 '权限边界':2759,3864 '权限边界或数据可见性的':5982 '条':3357,3400,3487,4898,5916 '条人工验收指南':3421 '条件必填':3709 '条待修':5680 '条提交':722 '条边界':3362,5919 '来源':1745,1972,3566,5425 '来自':3572,4807,5319 '来自功能开发后的':1638 '来自用户反馈':2724,3849 '枚举完整性等结构性问题':5714 '架构':1396 '查':2560,2679,2697,2706,4812 '查事务':2668 '查共享状态并发访问':2661 '查变化':2556 '查可交互元素':2547 '查可选值缺少守卫':2664 '查失败请求':2565 '查字段映射':2675 '查环境变量':2686 '查询错误':2695 '查进程':2690 '标签化临时日志':2809 '标签化日志':2807 '标签化日志和断言':3198 '标签必须从':1588 '标记':1609,1622,3962,4025,5215 '标题':1653,5555 '校验器失败即':3897 '校验器路径':3791 '校验器输出':4130 '核心':1518 '核心机制':73 '根因':94,458,2897,2898,3188,3189,3282,3416,5908 '根因不明确':6376 '根因位置':5273 '根因定位完成':2875 '根因必须用':5869 '根因找到':6362 '根因确实跨这些文件':3158 '根因确认':643,2862 '根因追踪':438,2626,2630 '根因链':4905 '根因阶段必须检查并写入报告':2765 '根目录':704 '格式':5504 '格式没被破坏':4202 '格式规范':5781 '框架':813 '框架探测':818 '检查':5710 '检查工作区状态':1482 '检查最近变更':2650 '检查面':2766 '检查项':3471 '模块':1867 '模块边界':1398 '模式':114,3723 '模式下':4389 '模式收到前不合并':6047 '模式检查清单':2656 '模式进':490,3928 '模式需要用户填写该报告的最终结论':4352 '模板路径按':1133 '模糊反馈':172,290,587,609,5090,5249,5839 '模糊反馈原话':1894 '次':357,4021,4267 '次仍失败':6105 '次假设失败':5876 '正在调查的':5787 '正常结束':4854 '正式':2523 '正式合并前必须预演':4606 '正确':1375,2674 '步骤':4414 '每个':19,76,253,275,645,1068,3856,5577,6336 '每个修复原子提交':6326 '每份报告都要写清':5972 '每会话一次':369 '每条标注假设编号':2810 '每条验证项必须可以':3367 '每次一个':5818 '每次修复':381 '每次修复都暴露新问题':2938 '每次只修':238,5805 '每次提问结构':5782 '沉淀':614,5410 '沉淀纪律':6324 '没事了':5750 '没修好':5065 '没有':272,2749,2932,4251 '没有完整报告':3231 '没有弃用选项':4578 '没有截图':6035 '没有报告不创建':5901 '没有用户最终结论或批次最终结论不进':5925 '沿用其原编号':1925 '沿用还是重新排查':1480 '注意':4170 '注释即可':3024 '流程':2734 '流程总览':367 '测试':2785 '测试命令':2742 '测试数据是否足以展示用户问题':2715 '测试数据状态':3337 '测试框架':814 '测试框架探测':819 '测试过程与':5445 '测试过程与截图证据':3380,3501,3977,4128,4274 '浏览器':2681 '消除实际问题':2948 '涉及前端展示':5981 '涉及前端页面或交互':4178 '涉及文件':96,461,3290 '涉及页面展示':2758,3835 '深度断言':105,3430,3743 '清':4877 '清上下文':5696 '清单':732 '清点所有并行会话':5737 '清理':338,1341,4785,5756,6222,6277 '清理临时代码':3194 '清理的职责分给':4850 '渲染':2912 '满足任一条件即进入':4993 '漏掉':4123 '演进历史和设计决策背景见':227 '灰度':3866 '灰度发布':2761 '点击':3836 '点击登录头像立刻更新':4899 '然后':3746 '然后写入报告的前置事实':1962 '然后回':5697 '然后给你一段简短接力':5095 '然后输出简短接力':5120 '爆炸半径控制':3145 '特定':5599 '特性开关':2687 '状态':454,708,711,817,3217,3336,5463,5556,6386 '状态不同步':2665 '状态写为':4459 '状态同步':2908 '状态字段':3069 '状态改':6206 '状态更新为':3348 '状态枚举只能使用':5933 '状态输出':6177 '状态输出必须显示监听进程':2386 '状态这两个硬信号':6294 '独立':6,8,155,255,257,259,261,584,593,1853,3104,3220,3505,3527,5076,5226,5334,5342,6338 '独立端口':6171 '独立验证':3368 '环境一致性':3916,4412,5549 '环境一致性不是':6037 '环境不确定':4024 '环境中':44 '环境中的优先级':4315 '环境变量':2772 '环境探测':372,673 '环境校验':3949 '环境身份不确定':360 '环境身份摘要':1664 '环境身份无法判断':3959 '环境身份校验':103 '环境身份校验回填到报告里':3744 '环境身份疑问':6108 '环节无法自动化':4086 '现在开始':3432 '现有':730,734 '现象':83,422 '现象说不清':5250 '理由':1770,2926,5796 '生命周期':2670 '用':2119,2871,2917 '用于以后定位问题时回溯':6308 '用于前端页面':2448 '用于将来定位类似问题时回溯':5518 '用户不确认':571 '用户人工验收':508,4343 '用户勾了':4590 '用户勾了多个':4554 '用户勾的是':4521 '用户协作模式':5731 '用户原话':2727,3325,5973 '用户反馈':557 '用户只看':107 '用户在':2732 '用户在当前':4998 '用户填了':4559 '用户如果不认可可覆盖':5314 '用户想继续修下一个':621 '用户截图':1979 '用户打开文档填':514 '用户报告':1361,1865,1883 '用户接下来做什么':6399 '用户描述的关键词':1464 '用户改写后的描述':5188 '用户明确偏好':5764 '用户明确要求':6307 '用户最终结论':5049 '用户最终结论是':4995 '用户未填任何勾':4549 '用户未确认前不得默默入档':6303 '用户本会话报告的':1629 '用户看到':2728 '用户看到的现象':2879 '用户确认':565,5157 '用户确认后':154,164,171,208,1847 '用户确认才进':2928 '用户确认方案后才动手':5873 '用户确认范围':414 '用户结论':5027 '用户结论三选一':6053 '用户编辑域列表后才继续':6251 '用户要检查什么':3319 '用户说':522,2987,4500,4508 '用户走':4883 '用户选择':5111 '用户选择后的处理':5110 '用户问其他问题时正常回答':4499 '用户问题闭环断言':3324,3543,3545,3918,5053 '用户问题闭环断言必须存在':5971 '用户问题闭环检查':2717 '用统一':3592 '用自然语言':3636 '用错误消息':2635 '由用户主动选择':627 '由用户决定是否写入文档':2984 '画数据流':2644 '留给':3382 '留给用户':3390 '疑似同根':3105,5271 '症状':1787,1796,2885,3101 '症状一句话':1860 '登出时有一次':5338 '登录后头像还是旧的':4902 '登录头像不刷新':5508 '登录页右上角铃铛图标偶尔闪一下':5268 '登记':2073,2080 '登记于':1749 '登记到':1816 '登记失败':2201 '的':248,596,604,611,1331,1646,1779,2003,2116,2499,3000,3037,3794,4074,4133,4287,4931,5080,5088,5093,5138,6188,6243 '的修复记录':4004 '的判定':3833 '的另一个':3044 '的合并':6068 '的复现':2453 '的对应区':1851 '的待修区':158 '的待澄清区':174 '的心跳文件':1117 '的技术证据仍回到各自':5579 '的报告有':3557 '的报告链接':431 '的新需求区':167 '的方式':1363 '的日汇总习惯':5456 '的根因':1406 '的状态同时改':2209 '的状态同步改':6279 '的状态改':4866 '的症状描述':5601 '的登记':5735 '的登记仍有效':4881 '的窗口继续':1843 '的等价流程':4071 '的结论':5394 '的职责':1347,6285 '的证据':4987 '的责任在':340 '的过程案卷':2014 '的错误处理引发两个症状':3070 '的非前端项':4175 '的领地':4280 '的验收':5323 '的验证项':4895 '的默认处理':3090 '目录':1067,1084 '目录不存在':1336 '直接':3973 '直接原因':2887,2890 '直接回到':4917 '直接复用上下文':1358 '直接开始':1500 '直接按独立':5310 '直接描述':1631 '直接描述现象':1364 '直接调用':4301 '直觉再强也要先验证':236 '相关文件':1866 '相同优先级按登记时间':1709 '相对路径':2087 '看到':2736 '看哪条':3982 '看起来类似':1699 '真的要放弃走':6164 '瞬时失败常见':4062 '短':3298,3696 '短会话':66 '硬动作':5485 '硬性':1932,5893 '硬性关卡':4345 '硬性拒绝':3014 '硬性步骤':1552,2076 '硬性要求':2192,2363,5153 '硬性门禁':3461,4599 '硬约束':3053,6114 '确定':2027 '确定性复现是调查的核心':2425 '确实不可自动验证':4174 '确认':1712 '确认入档后开新会话接力':3143 '确认入档后必须给简短接力':6090 '确认共因':247 '确认共因的':5813 '确认同根':5290 '确认后必须逐条分类并写入':5166 '确认后才进':2867 '确认本次修复范围后':1933 '确认范围':315 '确认范围时为本次修复分配编号':1908 '磁盘':6203 '示例':5038 '示例已给出':1582 '禁止':2010,3770 '禁止把':4108 '禁止无限循环':366 '禁止行为':3376,5133 '禁止进入':3232,4254 '禁止顺手修':135 '种只适用于':4173 '移动端适配':3842 '稍后回来处理':4765 '空':1248,1608,1621 '空值传播':2662 '空态':2790 '空态原因':2782 '空数据':3364 '立刻':3747 '立即':2079 '立即停下':2961 '立即停止':2839 '立即回退':4659 '立即用':5694 '立即进入':4967 '立项':170,608,3004 '竞态条件':2658,5713 '章节逐条跑':4077 '端口':2354 '端口劫持':1314 '端口劫持是典型':2693 '端口必须来自项目':6172 '端口治理':15 '端口预检':435 '端点':3076 '端点失效':1697 '端点搜索':2638 '符合':5202 '第':4171,4896,6103 '等':3112,4569 '等价于':5693 '等到修完代码才创建报告':2011 '等原':2976 '等复盘或':4875 '等当前':3126 '等待批次最终验收包统一收口':4362 '等待用户信号':4481 '等待用户说':4483 '等待返回':3753 '等用户':6042 '等用户验收该':118 '类似':1477 '类别':5195 '类型':2904 '类型转换':2676 '类型需要':3569,3586,3704 '类条目':1430 '粘贴':4131 '粘贴到':5501 '粘贴错误':1365 '精确插入在':2121 '糟糕的修复比不修更糟':6383 '红旗信号':2930 '红线':634 '红绿证据':93,457,3419,5434,5911 '纪律':6131,6296 '纯':3874 '纯代码':2438,2587 '纯后端':3876 '纯脚本':3877 '线上数据是否足以让用户看到目标状态':2786 '组':6334 '经':245,279,5811 '结束会话':5667 '结束时':1327 '结束本次':575 '结构化证据':70 '结果':3775,5029 '结果填到':4308 '结果解析':3778 '结论':5285,5976 '给下一个会话保留判断空间':5408 '给出建议':5794 '给每条候选':1585 '给用户决策卡':4029 '给过长':5148 '绝不在当前修复内夹带':296 '绝不说':5880 '绝对路径':3692 '统一':820 '统一编排':4307 '继续':3157,4157 '继续会引发':5674 '继续修':4531,4582,6013,6163 '继续修复':3945 '继续回':5140 '继续处理批次中下一个':4476 '继续调查':2842 '缓存版本号':2683 '缓存过期':2677 '编号':163,1907,3687,5084,5198 '编号和一句话标题':5386 '编号已在':2025 '编号必须先有':647 '编号必须有':277 '编号用于':1915 '缺字段则先补齐报告':1666 '缺少该检查不得进入':5984 '罕见':3136,5201 '翻页时感觉':5356 '而是':1521,4455 '职责分离':3451 '脑里':5165 '自动':5986 '自动执行':374,676 '自动闭环':121,402,4354 '自动闭环可以批量登记':1543 '自动闭环或多会话批量修复':5529 '自动闭环或完整':1640 '自动闭环最多':6100 '自动闭环有上限':352 '自动闭环记录':3980 '自动验收':473,3440 '自动验收全过':4397 '自己':350 '自己先过一遍验证项':4089 '自己回':4261 '自己想到':3009 '至少':3355,3360 '至少一项':3061 '节':1219,1568,2136,3381,3502,3511,3981,4129,4275 '节末尾':2118 '若':3702,4080 '若不存在':3241 '若报告结构被破坏':4209 '若来自':400 '若没有':3884 '若项目提供':1301 '范围推荐':386,1514 '范围推荐必须先扫':6321 '草案':3312 '蔓延':225,5676 '行为':5113 '行号':3067 '补':3514 '补建':3246,3266 '补建原因':3248 '补建报告':3484 '补提交':3526 '补齐':3549 '补齐验证项':3494 '表格中':5497 '表格行数':3491 '被两个症状触发':3064 '被中断或目标不是浏览器页面时兜底':2515 '被占用':1737 '要一起修':3059 '要不要我把这些新问题更新到文档里':5074 '要么修到位':2934 '要么升级':2935 '要修就开新会话':5845 '见':56,3955 '规则':2484 '规范':52 '视觉':2450,3840,4319 '解决不了的给你标记冲突点':4828 '解决冲突':4778 '解决后回这里重跑':4829 '解析':1561,1566,4517 '解析成一条一条的条目':5172 '解析用户输入':1360 '解析结果':4235 '触发':2551,3620 '触发前置检查':3460 '触发条件':4992 '订阅该回调':5281 '让下一步真正执行':4660 '让我先':4817 '让我看冲突文件再决定':4840 '让用户决定':6210 '让用户决策':6265 '让用户开另一个会话继续':215 '记住我':5348 '记录':90 '记录来源':82 '设计':359,3958,4023,6107 '设计哲学':65 '证据':3516,3529,3985,5044 '证据不足默认为独立':309 '证据不足默认独立':664 '证据区所有验证项':3914 '证据区未被':3496 '证据区标':4154 '证据区缺少截图':3947 '证据和闭环轮次':4006 '证据完整性门禁':3780 '证据已写入':3507 '证据是什么':202 '证明它':5883 '证明方式':2738,3327,5975 '诊断':5729 '询问':5073 '询问合并方式':4690 '询问是否写入':562 '询问是否写入文档':5068 '询问是否把新问题更新到文档':6076 '该行':5499 '详见':5513 '说明流程违规':3242 '请人工验收':512 '请从这些新条目里选一个继续':5387 '请你做人工二次验收':4401 '请求':5340 '请用户决定':4087 '请用户确认':4211 '请用户确认开关策略':2804 '请用户给新描述':5130 '请确认':4558 '请稍候':3434 '请编辑功能域声明区':1150 '请说明理由':1834 '请选一个再告诉我验收了':4553 '读':1530,1559,3499,3508,4126,4532,4903 '读什么':1385 '读取':2473 '读取报告':4506,4513 '读取新发现':5170 '读报告':525,3488 '读报告的':3975 '调整范围':1827 '调查纪律':5856 '调用':469,3436,3463,3712 '调用后检查报告是否完整':4201 '调用失败':4051 '调用格式':3639 '调试':2231 '负责更新报告的工程事实和人工验收草案':3271 '贴代码位置':3065 '贴字段名':3071 '走':5772,5832 '走了合理':2792 '走回':4580,6161 '超出':3153 '超出能力':6380 '越位填写':3498 '越位填过就清空重来':3504 '跑自动验收':3426 '跨':1115 '跨会话登记的':1648 '路径':1247,3536,3654,3677,3689,6396 '路由':3839 '跳过都是违规':3458 '轮':6102 '输入':2645,3837 '输出':511,2647,3579,4376 '输出必须包含三件事':5022 '边界':4960 '边界情况':4548 '边界接力':17,185 '边界清晰':222 '边界确认':549,2983,4546,4974 '达到上限或有疑问则':503 '迁移独立':3540 '过度规定下个会话方案的接力':5149 '过滤后计数必须联动':5591 '过滤验证':2834 '过程中发现的新问题已经写入':5382 '返回后':3784 '还是':193,6083 '还没修好优先':4566 '还没追踪数据流就提方案':2936 '这个命令扫一遍':5741 '这个新发现和当前':3056 '这个问题与':1472 '这应该能修好':5881 '这是共因':3132 '这条':5616 '这条会触发未来什么具体行为':6359 '这条新发现是当前':301 '这样如果会话中还要继续修下一个':4878 '进':545,566,4525,4539,4543,4688,4694,4942 '进入':1820,3669,4494,5115 '进入主仓库':4608 '进入本阶段前必须满足':4363 '进程身份':2688,2914 '进行中会话':1218,1228,1332,1567,2117,2135,2144 '远程配置':2773 '违反单次修复原则':1833 '连续':4265 '连续回修失败':355 '连续失败':4019 '追到的根因':3286 '追加':3997,4925 '追加一行会话登记':322 '追加一行到列表':1889 '追加一行到表格':1855,1873 '追加到':2114 '追踪时内嵌':2657 '追踪调用链':2641 '适用于':4759 '适用于上下文已嘈杂的情况':2858 '选一个':2905 '选取':1590 '选项':5349,6159 '逐条亲自验证':4424 '逐条分析':580 '逐条分类':5191 '逐步截图':104 '逐项核对':3470 '逗号分隔':1595 '通俗解释':5791 '通用踩坑模式':5589 '通知用户':4386 '通过':1162,1506,2869,2978,3091,3629,6365 '通过但':2703 '通过后标记':126 '通过证据':3308 '通过验收后':3116 '遵循':47 '避免':39 '避免长会话的':223 '那些条目是新登记的':5522 '那是':1345,4276 '那种东西写代码注释':6316 '部分更新':2667 '都不得继续修':196 '都不能交给用户验收':6039 '都以这句闭环断言为准':2745 '都只是证据':2752 '都在':2419 '配置':2755,3328,3550,3558,5978 '配置文件':2771 '配置漂移':2684,2909 '采集':2461 '里':1217,5678 '里声明功能域标签':1581 '里本会话的登记还在':5753 '重启并重新读取':3582 '重提':3993 '重新思考':3164 '重新聚焦':5784 '重新读取':3762 '重新走门禁':4011 '重新追根因':3989,4911 '重来':4263 '重构型':1592 '重查根因':3563 '重要规则':5802 '重试一次':4061 '重读报告':3754 '重跑':4149,4935 '针对每个验证项跑自动化测试':477 '铁律':232,4217,5858 '铃铛图标偶尔闪一下':5332 '错误':2562,4052 '错误写入报告':2476 '错误层级':2939 '错误恢复':3366 '闭环断言':2730,5030 '问题':2878,4031 '问题发现记录':1971,5424 '问题理解':376,1349 '间歇性':2659,6372 '防止':1312 '防重复排查':1407 '阶段由':4297 '阶段这些工具由':4303 '阻塞':5465,6375,6387 '阻塞核心流程且独立可定位':1771 '附证据':3106 '除非你能说出':5615 '除非明确共因':5692 '除非明确共因才本会话继续':626 '除非用户明确要共因地一起修':226 '除非用户明确要求且重新走':5143 '除非能说出':6358 '隔离':69,1502 '需求':3957 '需要你在':1579 '需要更了解系统的人':2847 '需要更多信息':6388 '需要线上确认':6374 '静态逻辑':4338 '非空时':2531 '靠':29 '页面':2733,2902 '页面并重新采集':2482 '项目':4333 '项目存在统一入口时必须使用它':6141 '项目文档清单':970 '项目文档路径':1271 '项目根':1118 '项目测试框架':4329 '顺便加':2988 '顺手重构':2952,3010,6314 '预期':3155 '预期效果':3321 '预期行为':1510 '预期行数':4208 '预演':337,4831,6263 '预演失败时':4794 '预演失败说明并行会话改到了相同文件':4795 '预演成功':4658 '预演通过时':4699 '预演避免撞车':35 '领取会话':2213 '领取开始就创建':79 '首次使用':1061,1131 '首次使用并行化':1578 '首次使用的项目由':6248 '首行':3302 '驱动修复':447 '验收':3674,3728 '验收了':523,4449,4484,4509,6043 '验收入口':1987,3309,5546 '验收入口与环境身份校验':4419,5437 '验收反馈中描述了当前功能不存在的行为':3005 '验收地址':4403 '验收完了':4486 '验收完没':4497 '验收未通过':4890 '验收标准':1391 '验收结论':4705 '验证':5011 '验证前':2480 '验证它':5882 '验证项':3358 '验证项列表':4124 '高中生能懂的语言':5792 '默认':3122,5613,5846 '默认不写':6357 '默认仍建议新会话':5147 '默认建议新会话或':218,623 '默认推荐':1674,5762 '默认推荐新会话或':5853 '默认新会话完成工作':5767 '默认独立':3079,6125 '默认硬性拒绝':2958","prices":[{"id":"60146d42-430f-4260-a1f7-64d59ac43159","listingId":"748678a0-db6f-49a1-94e2-c38da654ed51","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"yike-gunshi","category":"forge-skills","install_from":"skills.sh"},"createdAt":"2026-04-24T07:03:37.862Z"}],"sources":[{"listingId":"748678a0-db6f-49a1-94e2-c38da654ed51","source":"github","sourceId":"yike-gunshi/forge-skills/forge-bugfix","sourceUrl":"https://github.com/yike-gunshi/forge-skills/tree/main/skills/forge-bugfix","isPrimary":false,"firstSeenAt":"2026-04-24T07:03:37.862Z","lastSeenAt":"2026-05-18T19:07:33.221Z"}],"details":{"listingId":"748678a0-db6f-49a1-94e2-c38da654ed51","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"yike-gunshi","slug":"forge-bugfix","github":{"repo":"yike-gunshi/forge-skills","stars":11,"topics":["agent-skills","ai-development","claude-code","forge","skill-md","skillsmp"],"license":"mit","html_url":"https://github.com/yike-gunshi/forge-skills","pushed_at":"2026-04-28T05:11:10Z","description":"Forge — 文档驱动的 AI 辅助开发框架 | Document-driven AI development framework with 14 Skills covering brainstorm → PRD → design → engineering → QA → review → ship → retrospective","skill_md_sha":"8b9bbe475c0c1e0ecc6c343fb37fb94613130142","skill_md_path":"skills/forge-bugfix/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/yike-gunshi/forge-skills/tree/main/skills/forge-bugfix"},"layout":"multi","source":"github","category":"forge-skills","frontmatter":{"name":"forge-bugfix","description":"一次修一个 bug + 独立 worktree + 独立 TDD + Bug 修复验收报告 + **多会话并行协调** + dev server 端口治理 + Pass 边界接力（v7.2）。\n每个 bug 从登记开始就创建结构化 Bug 修复验收报告。支持 3-4 个窗口同时修不同功能域的 bug，\n靠 `.forge/active.md` 心跳文件 + 功能域判重 + 合并前 merge 预演避免撞车；\n启动应用时优先使用项目统一 dev entrypoint，避免 worktree 抢端口或测到旧服务。\n在 Codex 环境中，前端复现和修复后自验优先使用 browser-use:browser 的 in-app browser；\nComputer Use 只作为 browser-use 不可用或非浏览器桌面应用的兜底。\n铁律：不做根因分析就不写修复代码 + 每个 bug 独立 worktree/TDD/commit/QA + 没有 Bug 修复验收报告不算完 +\n用户问题闭环断言、配置/开关/数据就绪检查、QA 截图证据完整性门禁缺一不可 +\n新发现禁止当场顺手修（原 bug Pass 后询问，用户确认才分流到 backlog）+ 多 bug 默认不串成长会话 +\n原 bug 已 Pass 后遇到任何新问题，必须先告知“本次 bug 已完成”，询问是否写入文档并给接力 prompt +\n**并行会话必须在 active.md 登记，同域归并会话、异域鼓励并行**。\n\n会话级（一次性）：P0 环境探测（+ 读 active.md 看其他会话）→ P1 问题理解 + 强制读 PRD / ENG / Bugfix 历史 / Memory。\n每次修复（可循环）：\n  P2 范围推荐（用户指定、QA 发现、backlog 候选、按功能域判重）→ P2.5 创建/更新 Bug 修复验收报告\n  → P3 创建 worktree + 写入 active.md + 复现 → P4 根因追踪 + 5 Whys + 方案确认\n  → P5 独立 TDD 驱动修复 + 原子提交 → P5.3 更新报告为待 QA 状态\n  → P6 调用 forge-qa 做自动验收 → P6.5 用户人工验收或批次最终验收等待\n  → P7 按三选一分流（Pass 合并 + merge 预演 / Fail 回 P5 / Pass + 新发现）\n  → P7.4 Pass 边界确认（询问是否把新问题写入文档 + 接力 prompt）\n  → P7.5 新发现分流到 backlog.md → P8 沉淀（active.md 由 forge-fupan 清理）。\n出口：强烈建议新会话或 /clear、/compact 后继续下一个 bug；\n  全部完成 → 建议 /forge-review、/forge-ship、/forge-fupan 或 /forge-status。\n\n触发方式：用户说\"bugfix\"、\"反馈个问题\"、\"修这个 bug\"、\"这里有问题\"、\"为什么不对\"、\"排查一下\"、\"investigate\"、\"forge-bugfix\"，\n或用户报告错误、异常行为、功能失效时主动建议使用。"},"skills_sh_url":"https://skills.sh/yike-gunshi/forge-skills/forge-bugfix"},"updatedAt":"2026-05-18T19:07:33.221Z"}}