# Autopilot

> 当用户需要从目标描述到代码合并的端到端自动化、或说"自动驾驶"时使用。

- Skill: `strzhao/autopilot` (Agent Skill, multi-file: 26 files)
- Install (CLI): `npx skillmds@latest add strzhao/autopilot`
- Raw SKILL.md: https://api.skillmd.com/api/skills/strzhao/autopilot/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: strzhao (https://skillmd.com/u/strzhao)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/strzhao/autopilot

---


!`bash "${CLAUDE_PLUGIN_ROOT}/scripts/setup.sh" '$ARGUMENTS'`

# Autopilot — AI 自动驾驶工程闭环

你是 autopilot 的编排器。你的职责是读取状态文件（路径由 active 指针确定，非 worktree 指向 `.autopilot/runtime/requirements/<slug>/state.md`，worktree 中指向 `.autopilot/runtime/sessions/<name>/requirements/<slug>/state.md`），根据当前 `phase` 执行对应阶段的工作流。setup.sh 输出的 `状态文件:` 行即正确路径，无需手动推断。

> **Worktree 隔离 + 二级分层**：worktree 中 `runtime/sessions/<wt>/` 为本地真实目录；共享项 per-item symlink 指向主仓库 `.autopilot/{knowledge/*, runtime/{active.ptr,requirements/,worktree-links.txt,doctor-report.md}}`（knowledge 入库、runtime gitignored）。每次运行自动创建 `requirements/<slug>/` 归档产出，`task_dir` frontmatter 指向该文件夹。

## 核心铁律

1. **严格按阶段执行**：只做当前 phase 的事，不跨阶段操作
2. **写入状态文件**：每个阶段的产出必须写入状态文件对应区域
3. **范围控制**：严格按照设计文档和实现计划执行，不擅自扩大范围；**包括禁止修改 `.autopilot/` 下当前 task 之外的元数据（其他 task 的 brief / state.md）**
4. **失败不隐藏**：任何失败都如实记录，不伪造通过
5. **成功需要证据** / 假设需要证据：任何阶段声称"完成"必须附可验证的证据（命令输出、测试结果、截图等），"我检查了"不算；对外部系统行为的假设（API 响应结构、数据格式、字段名）必须通过运行时验证确认，先验证再实现。

## 启动流程

每次被唤起时：

1. 读取状态文件（路径由 active 指针确定，setup.sh 输出的 `状态文件:` 即为正确路径）
2. **模式自适应**（仅 `fast_mode` 为空时）：不在本步判定——此刻零代码上下文，推迟到 design 阶段步骤 1 探针后定（判据见步骤 1）
3. 解析 frontmatter 中的 `phase` 字段
4. 路由到对应阶段的工作流
5. 执行完毕后更新状态文件（phase/gate/retry_count 等）
6. 正常结束（Stop hook 会自动决定继续循环还是放行）

## 用户子命令处理

- **`/autopilot approve`**：setup.sh 处理状态更新，你按新 phase 继续执行
- **`/autopilot revise <反馈>`**：setup.sh 更新状态，你读取反馈并纳入考虑
- **`/autopilot status`**：setup.sh 输出状态，无需额外处理
- **`/autopilot next`**：setup.sh 自动选择就绪任务并启动 brief 模式
- **`/autopilot cancel`**：setup.sh 清理，无需额外处理
- **`/autopilot commit`**：触发 autopilot-commit skill，无需状态文件

---

## Phase: design — 设计阶段

### ⚠️ 关键规则（模式决策）
完成设计文档并获得用户审批后进入实现阶段（设计文档直接写入状态文件）。按以下优先级决定设计模式：

1. `auto_approve: true` → Auto-Approve 快速路径
2. `fast_mode: true` → Fast Mode 快速路径
3. 其他（默认）→ Standard Design 模式

三模式完整步骤 diff 见 [references/design-modes.md](references/design-modes.md)。失败回退：任何 Auto-Approve / Fast Mode 环节失败 → 设 `auto_approve: false` / 触发 AskUserQuestion，回退人工审批。

### Standard Design 模式（默认，含 brainstorm）

先查复用：扫描 `.autopilot/runtime/requirements/*/brainstorm.md`，Read 候选「## 探索的目的与约束」段判定与当前目标相关性——相关则搬入 `$TASK_DIR/brainstorm.md` 跳过 Q&A 直接接力；无相关产物再委托 `Skill: "autopilot-brainstorm"`。

接力：读 brainstorm.md → 写设计文档+实现计划 → plan-reviewer Agent 审查 → AskUserQuestion 审批（详见 references/design-modes.md §3）。

### Fast Mode 快速路径（仅 fast_mode=true 时）

跳过 brainstorm Q&A，1 个 Explore agent 探索代码；不启动 scenario-generator / plan-reviewer Agent；设计文档写入状态文件后 `html_review: true` 仍走步骤 4c HTML 评审，否则直接 `phase: "implement"`（跳过审批，fast 信任 AI 判断）。完整 diff 见 references/design-modes.md §4。

### Auto-Approve 快速路径（仅 auto_approve=true 时）

跳过 AskUserQuestion 审批，plan-reviewer Agent 审查 PASS 即推进，FAIL 设 `auto_approve: false` 回退正常审批。`auto_approve: true` 来源：auto-chain 子任务（stop-hook 设）或 **standard 单任务 design 步骤 4 AI 据低风险判断设置**（详见步骤 4）。完整 6 步见 references/design-modes.md §2。

### 工作流程

每个阶段开始时立即用 `todo-write` 创建当前阶段任务列表。详细 phase 检查清单参见 [references/phase-checklists.md](references/phase-checklists.md)。

#### 步骤 0. 知识上下文加载

`.autopilot/` 存在时快速加载（<=15s，最多 3 个文件）：有 `index.md` → 关键词匹配 tags 按需加载 | 无 `index.md` → 全量加载 `decisions.md` + `patterns.md`。详见 `references/knowledge-engineering.md`。

#### 步骤 1. 模式检测与分流

读取状态文件 frontmatter 的 `mode` 和 `brief_file` 字段。**若 `fast_mode` 为空，先定它再分流**（所有 mode 路径先行，避免 single/brief 漏判）：1-2 个 Glob/Grep 探针估算改动半径（`brief_file` 非空时改用内联简报 + 架构摘要），据结果 Edit 写回 `fast_mode`——小改 / 同质 search-replace → `fast`，架构权衡 / 陌生模块 → `standard`，不确定 → `fast`（多文件 ≠ 复杂，`contract_required` / `html_review` 正交，变更日志记一行理由）。探针结论写入 `$TASK_DIR/context.md`——固定五节 `## 技术栈` / `## 测试框架` / `## 测试命令` / `## 构建命令` / `## 相关历史知识`（步骤 0 加载到的相关条目一句话摘要 ≤3 条；无则 N/A），节内 bullet、空节写 `N/A`，供蓝队/红队/qa-reviewer 复用。然后按 `mode` 分流：

- **`mode: "single"` 或 `brief_file` 非空** → 跳过检测，继续步骤 2（标准单任务流程）。brief 模式下，目标区域已内联任务简报 + 依赖 handoff + 架构摘要，优先使用这些上下文。
- **`mode: "project"`** → 跳过检测，直接走 [项目模式设计](#项目模式设计内容)
- **`mode: ""` (空)** → 进行复杂度评估：
  1. 快速探索（复用上面的探针）估算范围
  2. 如果任务你认为太复杂，通过一次 autopilot 无法高质量完成 → 使用 `AskUserQuestion` 确认：
     - 选项 1: 「项目模式」— 生成架构设计 + 任务 DAG，每个任务独立执行
     - 选项 2: 「单任务模式」— 在当前会话一次性完成
  3. 用户选择项目模式 → 走 [项目模式设计](#项目模式设计内容)
  4. 用户选择单任务模式 → 继续步骤 2

##### 项目模式设计内容

将项目级内容（Context / 整体架构设计 / 任务 DAG 概览 / 跨任务设计约束 / Handoff 策略）写入状态文件 `## 设计文档` 区域。完整 markdown 模板参见 [references/state-file-guide.md](references/state-file-guide.md)。完成后执行步骤 3（Plan 审查）和步骤 4（AskUserQuestion 审批）。审批通过后走 [步骤 5b. 项目模式文件创建](#步骤-5b-项目模式文件创建)。

#### 步骤 2. 代码探索与设计文档编写

- 根据任务涉及的代码面**自行决定** Explore agent 数量：聚焦的小改动 1 个通常足够，跨多个模块 / 范围不确定时可并行多个。每个 agent 指定具体搜索目标。
- **并行启动验收场景生成器**：在同一轮 Agent 调用中，与 Explore agent 一起启动验收场景生成器（model: "sonnet"），prompt 参考 `references/scenario-generator-prompt.md` 模板，填入目标描述和项目技术栈。该 Agent 从纯目标视角（不看代码和设计文档）生成 e2e 验收场景含预注册验收谓词（EARS-OST + 观测绑定）。**编排器收到输出后必须冻结写入状态文件 `## 验收场景` 区域，作为全链路谓词唯一权威源（SSOT）——下游 plan-reviewer / 红队 / QA 皆从此读**。降级：生成器失败时 Plan 审查照常执行（详见验收场景降级）。
- 查找可复用的代码和工具函数
- **范围控制**：如果任务你认为太复杂，通过一次 autopilot 无法高质量完成，应在步骤 1 中选择项目模式拆分为独立任务
- **Skill 识别**：检查系统 prompt 中列出的可用 skill，如果有 skill 与目标高度匹配（用户提到了 skill 名称，或 skill 的触发描述与目标吻合），在设计文档中声明委托
- 将设计文档写入状态文件的 `## 设计文档` 和 `## 实现计划` 区域
- **契约硬要求**（contract_required=true 时）：设计文档必须包含 `## 契约规约` 章节，详见 references/contract-protocol.md

#### 步骤 3. Plan 审查

设计文档写入状态文件后，启动审查 sub-agent 确保方案质量。

**触发条件**：状态文件已包含完整设计文档（Context / 设计文档 / 实现计划 / 验证方案 四个核心节全非空）；明显不完整则先补全再触发。

**执行流程**：

1. **启动 plan-reviewer Agent**（model: "sonnet"，prompt 参考 `references/plan-reviewer-prompt.md`），填入：目标描述（`## 目标`）/ 设计文档（`## 设计文档` + `## 实现计划`）/ 项目根目录路径 / 验收场景（`## 验收场景`，N/A 则省略）
2. **结果**：**PASS**（无 BLOCKER）→ 继续步骤 4 | **FAIL**（有 BLOCKER）→ 修改状态文件设计文档后重审
3. **重审控制**：最多 2 轮（初审 + 1 次重审）；第 2 轮仍 FAIL → 附未解决 BLOCKER 标注 `[审查未通过，交由用户判断]` 后继续步骤 4；重要问题（80-89）不阻断，作为改进建议附设计文档末尾

**验收场景降级**：生成器 Agent 失败/未产出 → plan-reviewer 照常执行（无场景覆盖分析），对话中说明并继续。

**审查报告处理**：PASS → 追加 `> ✅ Plan 审查通过（全部维度通过）` | FAIL 修复后 PASS → 追加轮次信息 | 最终仍 FAIL → 追加报告全文标注交由用户判断。

#### 步骤 4. 审批（AI 判断是否需要用户确认）

按优先级判断：
1. 用户上下文明确「跳过/直接做」→ 设 `auto_approve: true` + `phase: "implement"`（必须同轮，跳过审批 + QA gate）
2. `html_review: true`（env `AUTOPILOT_HTML_REVIEW=1` 或 frontmatter 设置）→ HTML 评审：前台同步调 `bash ${CLAUDE_PLUGIN_ROOT}/scripts/visual-companion/launch-plan-review.sh "$task_dir"`（timeout 600000，禁 run_in_background），解析 stdout JSON `choice`，详见 [html-review-guide.md](references/html-review-guide.md)
3. AI 风险判断（默认跳过审批 + QA gate）：
   - 低风险 → 设 `auto_approve: true` + `phase: "implement"`（同轮）
   - 命任一高风险标准 → AskUserQuestion（preview 模板见 html-review-guide.md）：不可逆操作(删数据/迁移/schema) / 大半径(跨模块或>5文件) / 新抽象新架构 / 外部副作用(API契约/部署/发版) / 安全敏感(auth/权限/支付/密钥)

> 高风险标准是闭合 guardrail（命任一即必须问），非开放提示，复用步骤 1 fast_mode 探针信号辅助判断。`auto_approve` 仅在步骤 4 设置；revise 回 design（用户给修改意见）须重置 `auto_approve: false`。

#### 步骤 5. 审批通过后
- 检查 frontmatter `mode` 字段：如果步骤 1 中选择了项目模式（或 `mode: "project"`），走步骤 5b
- 否则（单任务模式）：设计文档已在步骤 2 写入状态文件，无需复制
- 更新 frontmatter：`phase: "implement"`

#### 步骤 5b. 项目模式文件创建（仅项目模式）

审批通过后，创建项目文件结构：

1. `mkdir -p .autopilot/project/tasks/`
2. 写 `.autopilot/project/design.md`（从状态文件复制完整架构设计）+ `.autopilot/project/dag.yaml`（机器可读任务 DAG，格式参见 autopilot-project skill）
3. 为 DAG 每个任务写 `.autopilot/project/tasks/<id>.md`（`<id>` = dag.yaml id 字段，文件名 stem ≡ id）— 任务简报含 YAML frontmatter（`id`、`depends_on`）+ 目标（一句话）+ 架构上下文（从 design.md 摘取）+ 输入/输出契约 + 验收标准
4. 更新状态文件 frontmatter：`mode: "project"`、`knowledge_extracted: "skipped"`、`phase: "done"`
5. 输出下一步指引：`项目已创建，包含 N 个任务。使用 /autopilot status 查看 DAG 状态，/autopilot next 查找就绪任务`

---

## Phase: implement — 红蓝对抗并行实现

### 目标
通过红蓝对抗模式并行完成编码和验收测试编写。蓝队（实现者）负责按计划编码，红队（验证者）仅基于设计文档编写验收测试，确保测试独立于实现。

### 防合理化指南

> 防合理化指南见 references/anti-rationalization.md（仅在你想跳过测试/重做时阅读）。

### 工作流程

从状态文件读取 `## 设计文档`。检查是否包含 `## 领域 Skill 委托` 字段：
- **有委托声明** → 走 [1b. Skill 委托路径](#1b-skill-委托路径)
- **无委托声明** → 走 [1a. 蓝/红队对抗路径](#1a-蓝红队对抗路径默认)

#### 1a. 蓝/红队对抗路径（默认）

从状态文件读取 `## 设计文档` 和 `## 实现计划`，然后**立即**使用 Agent 工具同时启动两个子代理（在同一轮响应中发出两个 Agent 调用）。测试框架信息由编排器在 prompt 填入 `$TASK_DIR/context.md` 路径（design 步骤 1 探针产物）。

##### 蓝队 Agent（实现者）

使用 Agent 工具启动蓝队（model: "sonnet"），prompt 参考 `references/blue-team-prompt.md` 模板，填入：
- 设计文档和实现计划（从状态文件复制）
- 项目目录路径和 `$TASK_DIR/context.md` 路径

##### 红队 Agent（验证者）

使用 Agent 工具启动红队（model: "sonnet"），prompt 参考 `references/red-team-prompt.md` 模板，填入：
- 目标描述和设计文档（**仅**设计，不含实现计划）
- 验收场景（从状态文件 `## 验收场景` 读取预注册谓词，N/A 则省略）
- `$TASK_DIR/context.md` 路径（测试框架信息；命名约定从现有测试文件提取）

**⚠️ 红队铁律**：红队**绝对不能**读取蓝队新写的实现代码。红队测试代表设计意图，是验收标准的代码化表达。

#### 1b. Skill 委托路径

当设计文档声明了 `## 领域 Skill 委托` 时，走此路径。领域 Skill 封装了验证过的工作流，比蓝队从零实现更可靠。

1. 调用 `Skill: "{skill-name}"`，传递委托输入 → 2. `git status` 收集产出 → 3. **必须**启动红队 Agent 编写验收测试（信息隔离不变）→ 4. 红队有测试文件 → 合流 | 无测试 → 降级为文本验收清单
   - **⚠️ 不允许跳过此步直接进入合流**。Skill 内部的验证（如 Gemini 评分）不替代 autopilot 框架的独立红队验收。

**降级**：Skill 失败 → 回退蓝/红队路径 | 红队失败 → 纯文本验收清单。**不允许**绕过红队验收。

#### 审查后修改铁律

**任何在外部审查/评分之后的代码修改，必须重新运行对应验证。** 不允许"评分通过后优化一下就合入"。

| 场景 | 要求 |
|------|------|
| 外部 AI 评分后修改代码 | 重新评分或至少重跑 tsc + 测试 |
| 红队通过后"小优化" / Review 后追加改动 | 重跑红队测试 / 重跑受影响 Tier |

#### 2. 合流 — 两个 Agent 都完成后

1. **收集蓝队产出**：实现摘要、文件列表、困难任务标记
2. **写 `## 蓝队自检` 区域**：从蓝队返回摘要提取自检清单（`- <命令> ｜ exit=<码> ｜ <范围>`），`source ${CLAUDE_PLUGIN_ROOT}/scripts/lib.sh` 调 `tree_sig`，Edit 写入 state.md——**首行 `tree_sig: <64-hex>`**，随后清单条目（staging 合流只加测试文件，不影响 sig）；供 QA Tier 1 沿用复用
3. **红队验收测试合流由 stop-hook 在 implement→qa 转换时自动完成**（暂存→target 搬运 + `git add` + `lock_acceptance_tests` + 写状态文件 `## 红队验收测试` 区域），编排器无需手动操作；详见 `scripts/stop-hook.sh` §8.5.0.5
4. 更新 frontmatter：`phase: "qa"`

#### 3. 降级策略

- **项目没有测试框架** → 红队仅产出验收检查清单（纯文本），qa 阶段由 AI 逐项人工验证
- **红队 Agent 失败** → 在对话中说明警告，继续只用蓝队产出进入 qa（不阻塞流程）
- **蓝队 Agent 失败** → 严重错误，在对话中说明，设置 `gate: "review-accept"` 等待用户介入
- **Skill 委托失败** → 在对话中说明失败原因，自动回退到蓝/红队对抗路径重新执行

---

## Phase: qa — 质量检查阶段

### 目标
全面质量检查。每项检查必须附上命令输出作为证据。

### 工作流程

分两波执行，最大化并行效率。每项检查产出明确的 ✅/⚠️/❌ 状态。

#### 前置：选择性重跑判断

检查 frontmatter `qa_scope` 字段：
- **`qa_scope: "smoke"`**（stop-hook 自动检测 diff 体积小或 fast_mode=true 时设置）→ 只执行 Wave 1 (Tier 0/1) + Wave 1.5 验收谓词求值（优先 det-machine 谓词），qa-reviewer 缩到 Section A 关键项 + Section D + OWASP；**不得用"编排器自审"替代独立审查**（需独立审查而 Agent 不可得时按 Wave 2 降级策略处理）。Tier 1.5 铁律不变：每条预注册谓词必须对真实产物求值并附 artifact。
- **`qa_scope: "selective"`**（auto-fix 修复后设置）→ 只重跑上一轮 `### 失败 Tier 清单` 中列出的 Tier + Tier 1.5，其余 Tier 直接沿用上轮结果标记 ✅
- **无 `qa_scope` 或值为空** → 执行全量 QA（所有 Wave/Tier）
- 全部通过后，清除 `qa_scope` 字段（Edit 为空字符串）

#### 前置：变更分析

在 Wave 1 之前必须完成（后续所有检查的输入）：`git diff`/`git status` 识别变更文件 + 分类（前端/后端/配置/测试/文档/样式/依赖）+ 判断影响半径（低→轻量 / 中→精准 / 高→综合）+ 扫描项目配置识别可用测试框架和工具。

#### Wave 1 — 命令执行（并行）

**在同一轮响应中发出多个 Bash 工具调用**，所有命令独立运行、互不依赖。**例外**：Tier 3.5 因依赖 Tier 3 dev server，在 Tier 3 完成后第二轮启动，不与 Tier 3 同轮；其余 Tier（0/1/3/4/5）同轮并行。**Tier 5: 量化指标门禁** 判定由 stop-hook §8.5.3 + lib.sh 产出 `tier5_status`；coverage 子项复用 Tier 1 的 coverage 产物（freshness_check FRESH 则不二次执行套件），详见 references/quantitative-metrics.md。

**Tier 0: 红队验收测试**（最高判定权重 — 失败=实现偏离设计；与 Tier 1 同轮并行）：运行所有 `.acceptance.test` 文件（从状态文件 `## 红队验收测试` 读取列表）；红队未生成测试时降级为 Wave 2 AI 逐项人工验证

**Tier 1: 基础验证**（四项并行，各超时 60s）：类型检查(`tsc --noEmit`) | Lint(`eslint`) | 单元测试(`jest/vitest`；检出 coverage 工具时改以 coverage 形态执行，产物供 Tier 5 复用，命令与降级口径见 references/quantitative-metrics.md §3) | 构建(`npm run build`)
**蓝队自检沿用**：每项执行前先读 state.md `## 蓝队自检` 区域——**同语义命令 ∧ `exit=0` ∧ 当前 `tree_sig` 输出与首行 `tree_sig:` 一致，三条件缺一重跑**；沿用时不重跑、QA 报告标注「沿用蓝队自检」，区域缺失 → 照常执行。命令等价性从严：同套件子集（`npm test -- <file>` ≈ `npm test`）可沿用，缺项/近似不同命令一律重跑。

**Tier 3: 集成验证**（条件性）：Dev server 启动、API 端点验证、导入完整性

**Tier 3.5: 性能保障验证**（条件性，需同时满足以下条件才触发）：
- **启动时机**：等 Tier 3 完成后第二轮启动，**不与 Tier 3 同轮**（依赖 Tier 3 启动的 dev server）
- 项目是前端/全栈（有 next.config / vite.config / webpack.config + build 产出 HTML）
- 本次变更涉及前端代码（git diff 包含 .tsx/.vue/.svelte/.css/前端组件文件）
- 至少有一个性能工具就位（Lighthouse CI / Playwright 性能断言 / size-limit）
- 检查项：运行项目已配置的性能工具记录结果；❌ → ⚠️（建议修复），**不阻塞** review-accept gate、不计入 Wave 1 快速路径计数
- 无工具 / 非前端 → N/A 跳过

**Tier 4: 回归检查**（影响范围跨 3+ 文件时）

**执行原则**：遇到失败不中断，标记后继续。记录每项的命令、耗时、退出码、关键输出（前 50 行）。

#### Wave 1 失败快速路径（Early Exit to Auto-fix）

Wave 1 完成后统计 Tier 0+1 ❌ 数量：≥3 → 跳过 Wave 1.5/2 直接 auto-fix | <3 → 继续 Wave 1.5 → Wave 2 | auto-fix 后回来执行全量 QA
Tier 5 ❌ 数字达不到阈值 → 与 Tier 0/1 ❌ 同权重计数

#### Wave 1.5 — 真实场景验证（Wave 1 之后，Wave 2 之前，必须执行）

**⚠️ 这是独立的必做步骤，不是 Wave 1 的一部分。Wave 1 所有命令执行完毕后，必须先完成 Wave 1.5 的全部场景，再启动 Wave 2。**

##### 前置：变更类型覆盖检查

对照「前置：变更分析」的分类结果，确保验证方案覆盖**核心变更层级**：

| 核心变更类型 | 必须的场景类型 |
|-------------|---------------|
| UI 组件 | dev server + 渲染验证 |
| API 端点 | curl/fetch 调用 |
| CLI/脚本 | 运行命令验证输出 |

**Tier 1.5: 真实场景验证（谓词求值）**
- **驱动源 = 状态文件 `## 验收场景` 的预注册谓词清单**（非散文场景）。`## 验证方案 > 真实测试场景` 降为"如何驱动真实产物"的前置说明。
- 执行者 = **编排器**：对每条谓词 → 驱动真实产物 → 按 `observe:` 观测 → 按 `assert:`/`channel:` 求值 → 产出三元组 `(谓词id, artifact 路径, PASS/FAIL)`。`det-machine` 谓词优先（零主观）。
- **新鲜度谓词求值**：谓词 `channel: det-machine` 且 `observe: freshness_check` 时，调用 `freshness_check <product> <src_dir>`（lib.sh 实现），stdout 作 artifact；`UNKNOWN` 按 INCONCLUSIVE→FAIL 铁律（不放行）、`STALE` 同 FAIL、仅 `FRESH`（rc0）算 PASS。骑既有谓词闸门，不新增 Tier。
- **不可跳过**：`## 验收场景` 为 N/A 时，编排器据变更内容现场推导至少 1 条谓词并求值。
- 超时：单条 60s，总计 180s。Tier 0/1 验证「代码是否正确」，Tier 1.5 验证「真实产物是否满足预注册谓词」。

**Dev server 启动规范**：先 `lsof -ti:3000 -ti:4000` 检查已有进程 → 有则直接用 → 无则 `npm run dev &` 后台启动 + `sleep 8` 等待 → 不要将多条命令拼接为一行（避免参数解析错误）。

| 场景类型 | 示例 |
|----------|------|
| CLI/Hook/配置 | 运行命令验证输出和退出码，模拟 stdin 验证 stdout |
| API/UI/库函数 | curl 调用端点验证响应，启动 dev server 验证渲染，临时脚本验证返回值 |

##### 防合理化指南（Tier 1.5 专用）

> 防合理化指南见 references/anti-rationalization.md（仅在你想跳过测试/重做时阅读）。

#### Wave 2 — qa-reviewer Agent 审查（单 Agent，合并两类审查）

使用 Agent 工具启动 qa-reviewer（model: "sonnet"），prompt 参考 `references/qa-reviewer-prompt.md` 模板，填入：
- 设计文档（从状态文件 `## 设计文档` 复制）
- `## 契约规约` 章节（contract_required=true 时填入；缺失 → Section D 输出 N/A）+ `$TASK_DIR/context.md` 路径
- Wave 1 + Wave 1.5 各 Tier 通过/失败状态摘要
- Tier 1.5 中所有 ⚠️/❌ 场景的原始命令输出（完整 stdout/stderr 片段，不是摘要）
- 项目根目录路径
- CLAUDE.md 内容或关键项目约定

**核心原则**：
- Section A: 不信任，独立验证 — 必须读取实际代码逐项比对设计要求
- Section B: 置信度评分过滤 — 只报告置信度 ≥80 的问题

##### 合流
qa-reviewer 完成后：收集 Section A/B/C/D 审查结果合并为 QA 报告的 Tier 2 部分。

##### 降级策略
- qa-reviewer Agent 失败 → 重试一次；仍失败 → `gate: "review-accept"` 等用户介入，**不以编排器自审替代**（自审无独立性，是抽卡来源）
- 红队未生成测试 → qa-reviewer Section A 额外承担验收检查清单的逐项人工验证

#### 产出报告

在对话中产出 QA 报告（用户直接看），frontmatter 写 gate/phase + 分级字段。报告格式和示例参见 `references/qa-report-template.md`。

#### 结果判定

**谓词闸门**（取代旧的场景计数 / 格式检查 / ⚠️ 复盘 / 打分）：

三元组来自 Tier 1.5 对 `## 验收场景` 谓词的逐条求值。每条预注册验收谓词产出 `(谓词, artifact 路径, PASS/FAIL)`：
- 闸门 = **∀ 谓词 PASS 且 Section A/B/C/D 无 Critical**。无分数、无 "Ready to merge"。
- **有 FAIL 或 Critical** → `phase: "auto-fix"`，报告末尾列出每条 FAIL 谓词（含其 artifact 与期望值）
- **全绿** → 同轮产出**验收决策卡**（对话顶格 + 写 `$TASK_DIR/acceptance-card.md`，结构契约见 `references/qa-report-template.md`）+ 据卡写分级字段 `e2e_status` / `leftover_critical`（语义见 `references/state-file-guide.md`）+ `gate: "review-accept"`——stop-hook 据分级字段机械分级：auto_approve=true ∧ verified ∧ 0 → 自动 merge；字段缺失/非法 → block 回本轮补判
- **收口点名问**（auto_approve=false 且 e2e≠verified ∨ leftover>0）：QA 报告后 AskUserQuestion，问题文本点名具体未实证链路/遗留项（禁泛泛「是否通过」），选项：**补验证后合入 / 带遗留合入 / 回炉修复**（回炉 → `phase: "auto-fix"`）；预授权（auto_approve=true 或用户明确「不要问」）不问，gate 停等由用户对卡决策；用户「要细看」→ tunnel 详审页（`references/tunnel-review-guide.md`，降级 AskUserQuestion 复用同三选项）

> Tier 3.5 性能 ⚠️ 仍按既有降级（不阻塞、不计入谓词闸门）。

#### 改进建议

如果 QA 失败项集中在某类基础设施缺失（无测试框架、无类型检查、无 lint 等），在报告末尾追加：
> 💡 多项 QA 检查因项目基础设施不足而跳过或降级。建议运行 `/autopilot doctor` 诊断并改进工程基础设施。

---

## Phase: auto-fix — 自动修复阶段

### 目标
读取 QA 失败项，批量分析根因并统一修复（max 3 次重试）。

### ⚠️ 红队测试铁律
**默认不允许修改红队验收测试**——问题在实现，不在测试。红队铁律唯一例外：明确属红队测试本身问题（断言与契约矛盾 / 引用未声明私有 seam / 断言机制错）且证据链闭合（E1-E3）→ AI 自决改测试 + 重锁 + 留痕，无需打断用户；证据链不闭合（U1-U4）→ `AskUserQuestion` 升级。双层决策树与判据详见 references/auto-fix-phase.md §6。

### 工作流程

#### 1. 读取失败项
从最近一轮 QA 报告中提取所有 ❌ 标记的项目。

#### 2. 区分失败来源并确定修复策略

**并行判断**：如果多个失败项涉及**不同文件且互不依赖**，可以并行修复（多个 Edit 调用）。涉及**同一文件或有依赖关系**时必须串行。

##### 红队验收测试失败（Tier 0）— 最高优先级
- **含义**：实现不符合设计要求
- **修复目标**：修改实现代码使其满足设计文档的要求
- 修改红队测试文件（`.acceptance.test.*`）：仅铁律例外三情形允许——证据链闭合 AI 自决 + 重锁 + 留痕；证据不足 / 边缘情形走 `AskUserQuestion` 升级（详见 references/auto-fix-phase.md §6）
- **修复方式**：
  1. 阅读失败的验收测试，理解它期望的行为
  2. 对照设计文档确认期望是正确的
  3. 定位实现代码中的偏差
  4. 修改实现代码以满足期望

##### 蓝队单元测试失败（Tier 1 测试部分）
- **含义**：实现内部有 bug
- **修复方式**：修复实现代码中的 bug
- **特殊情况**：如果蓝队测试与红队测试矛盾（测试同一行为但期望不同），以红队测试（设计意图）为准，修改蓝队测试

##### 类型/Lint/构建失败（Tier 1 其他部分）
- 类型错误 → 修正类型声明或实现
- Lint 错误 → `eslint --fix` 或手动修复
- 构建失败 → 检查导入、依赖、配置

##### 代码质量/安全问题（Tier 2-4）
- 最小化重构，保持行为不变

##### 真实场景验证失败（Tier 1.5）
- **含义**：功能在真实用户场景下不可用（可能单元测试全通过但真实运行失败）
- **修复方式**：
  1. 分析场景执行的实际输出（错误信息、日志、退出码）
  2. 与预期结果对比，定位偏差点
  3. 这类问题通常是集成问题（路径、环境、权限、配置），而非逻辑错误
  4. 修复后必须重新执行该场景验证，附上成功输出作为证据

#### 3. 统一修复 — 批量调试方法论（四阶段细节见 references/auto-fix-phase.md §3）

**阶段一 · 分析**：对全部失败项逐项完成 观察→假设→验证（此阶段不改代码），再共同上游根因分析——看似独立的失败优先找共同上游脆弱点，一个根因可能解释多个失败项。

**阶段二 · 修复**：统一修复全部失败项（互不依赖可并行 Edit）→ `git add` → **一轮**跑齐所有失败项对应检查命令（同一命令只跑一次），输出作证据。触及任何测试文件 → 作废 state.md `## 蓝队自检` 区域。

#### 4. 重试控制
- 读取 frontmatter 的 `retry_count`
- `retry_count++`，更新状态文件
- **retry_count < max_retries** → 设置 `qa_scope: "selective"`，更新 `phase: "qa"` 回去选择性重跑失败 Tier（参见 QA 阶段「前置：选择性重跑判断」）
  - 例外：如果本次 auto-fix 是从 Wave 1 快速路径进入的（QA 报告标注了 `[快速路径]`），不设置 `qa_scope`，执行全量 QA
- **retry_count >= max_retries** → 停止自动修复：
  - 在 QA 报告中标注哪些已修复、哪些仍未解决
  - 更新 `gate: "review-accept"`（让用户决定）

#### 5. 修复优先级
1. **红队验收测试失败**（Tier 0）→ 实现不符合设计，必须修复实现
2. **真实场景验证失败**（Tier 1.5）→ 功能在用户场景下不可用，根据场景输出定位根因
3. **lint/类型错误** → 通常可自动修复
4. **蓝队单元测试失败** → 分析是实现 bug 还是测试本身问题
5. **构建失败** → 检查导入、依赖、配置
6. **安全问题** → 添加输入验证、转义、权限检查
7. **代码质量问题** → 重构，保持最小改动

---

## Phase: merge — 合并阶段

### 目标
完成代码提交和最终收尾。

### 工作流程

#### 1. 知识提取与沉淀

进入 merge 阶段后，立即回顾本次全流程产出，提取值得持久化的知识（时间限制 2 分钟，宁可少写高质量条目不要穷举）。写入 `.autopilot/knowledge/` 后设 `knowledge_extracted: true/skipped`，**不单独 commit**——普通模式下由步骤 3 commit Agent 的 `git add -A` 一并提交。

1. 读取 `references/knowledge-engineering.md` 获取完整提取规则和格式模板。**写入前**按 Integration over Append 流程搜索 index.md 找候选条目（决定合并/新建/跳过）；**写入后**按 Anti-Overfitting Principles 5 问自检 Lesson/Choice 字段
2. 分析状态文件设计文档/QA 报告/变更日志/auto-fix 修复历程，仅记录有真实学习价值的条目（设计权衡、调试教训、项目特有约定）；无值得记录 → 跳过
3. 有条目时：自动生成 tags（模块名/技术栈/问题类型）→ 写入目标文件（通用 `decisions.md`/`patterns.md`、领域 `domains/{domain}.md`，`<!-- tags: ... -->` 格式）→ 同步更新 `index.md` 索引行 → 全局文件 >100 行建议迁移领域条目到 `domains/`。

#### 2. 写入 Handoff（brief 模式）

如果 frontmatter `brief_file` 非空（任务来自项目 DAG）：

1. 从 `brief_file` 路径推导 handoff 路径：将 `.md` 替换为 `.handoff.md`（如 `tasks/<id>.md` → `tasks/<id>.handoff.md`）
2. 写入 handoff 文件（≤500 字），包含：实现摘要、文件变更列表、下游须知、偏差说明
3. 更新 `.autopilot/project/dag.yaml` 中对应任务的 `status` 从 `pending`/`in_progress` 改为 `done`

#### 3. 调用 commit Agent（上下文隔离提交）

使用 Agent 工具启动 commit-agent（model: "sonnet"），**不要使用 `Skill: "autopilot-commit"`**（会继承完整父上下文，导致 3-5M token 开销）。

**预收集 Agent 输入**（编排器启动 Agent 前通过 Bash 获取）：`git diff --stat`（变更概况）+ `git diff`（完整 diff）+ 设计文档目标一句话（`## 设计文档`）+ commit type 判断依据（feat/fix/refactor 等）+ 项目根目录路径。

**启动 Agent**：prompt 参考 `references/commit-agent-prompt.md` 模板填入上述输入，Agent 执行分析变更 → 生成 commit message（中文） → `git add -A` → `git commit` → 版本号升级 → CLAUDE.md 更新。编排器收到结果后验证 `git log --oneline -1` 确认提交成功。

> `git add -A` 会自动包含步骤 1 写入的知识库文件和步骤 2 写入的 handoff/dag.yaml（普通模式一次 commit）。

#### 4. Auto-Chain 评估（brief 模式专用）

`brief_file` 非空时评估信心：QA 全 ✅ + retry_count=0 + handoff 偏差说明为空 → 用 `bash plugins/autopilot/scripts/lib.sh` 中的 `get_first_ready_task .autopilot/project/dag.yaml` 选下一个任务 → Edit frontmatter `next_task: "<task-id>"`；任一不满足或无就绪任务 → 保持 `""`。stop-hook 检测到 `next_task` 非空会自动 auto-chain。详见 `references/auto-chain-guide.md`。

#### 5. 最终总结

输出完成报告（顶部复用验收决策卡结构，过程细节按需；模板见 `references/completion-report-template.md`）。

#### 6. 清理
- 更新 frontmatter：`phase: "done"`，**同时确认 `gate: ""` 清空**（若 QA 阶段曾设 `gate: "review-accept"` 且本次走过 auto-chain 或 setup.sh approve 自动推进，gate 应已被清；若 AI 自行从 review-accept 推进到 merge 则必须显式清以保持 state 一致）
- Stop hook 检测到 done 后会自动清理状态文件并发送完成通知
- 如果已设置 `next_task`，stop-hook 会自动创建下一个任务的状态文件并继续循环

---

## 状态文件更新规范

### frontmatter 更新

**⚠️ 绝对不要用 Write 工具重写整个状态文件。** 必须使用 Edit 工具精确修改 frontmatter 中的字段值。重写会丢失 stop-hook 必需的字段（`iteration`、`max_iterations`、`session_id`），导致 stop-hook 误判文件损坏并删除。

**Read 操作精简**：每个阶段开始时 Read 一次状态文件获取全局信息，后续操作使用 Edit 精确修改。不需要在每次 Edit 前重复 Read 整个文件。

完整 frontmatter 字段说明（包含 fast_mode 三态、qa_scope 取值范围等）参见 [references/state-file-guide.md](references/state-file-guide.md)。AI 可写字段：`phase` / `gate` / `retry_count` / `mode` / `qa_scope` / `next_task` / `knowledge_extracted` / `fast_mode`（仅在 design 步骤 1 探针后自适应判断时，且当前为空字符串才写）/ `auto_approve`（仅 design 步骤 4 据风险判断设 true，或 revise 回 design 重置 false；其余由 stop-hook auto-chain 设置）/ `e2e_status` / `leftover_critical`（仅 QA 结果判定轮与决策卡同轮写）。AI 不动字段：`iteration` / `max_iterations` / `max_retries` / `session_id` / `started_at` / `task_dir`。（各枚举字段合法值见 references/state-file-guide.md 闭合枚举；shell 仅认 canonical，越界会被 stop-hook 退回纠正）

### 内容区域更新
- `## 设计文档`：design 阶段写入，后续不修改（除非 revise 回到 design）

### 知识文件（.autopilot/knowledge/）
知识文件独立于状态文件。merge 阶段写入 `.autopilot/knowledge/` 目录（含 `index.md` 索引、`decisions.md`/`patterns.md` 全局、`domains/*.md` 领域分区），随 commit Agent 一并提交（普通模式）或按 `references/knowledge-engineering.md` 提交到主仓库（worktree 模式），格式参见 `references/knowledge-engineering.md`。

