ccgx-workflow 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/README.md +37 -5
  2. package/README.zh-CN.md +35 -5
  3. package/dist/cli.mjs +1 -1
  4. package/dist/index.mjs +2 -2
  5. package/dist/shared/{ccgx-workflow.WgUzkiC3.mjs → ccgx-workflow.Bq9vAaEw.mjs} +17 -110
  6. package/package.json +2 -1
  7. package/templates/commands/agents/phase-runner.md +321 -321
  8. package/templates/commands/autonomous.md +792 -792
  9. package/templates/commands/cancel.md +132 -132
  10. package/templates/commands/debug.md +226 -226
  11. package/templates/commands/status.md +206 -206
  12. package/templates/commands/team.md +484 -0
  13. package/templates/hooks/ccg-session-state.cjs +566 -510
  14. package/templates/scripts/ccg-phase-runner-launcher.mjs +467 -467
  15. package/templates/scripts/invoke-model.mjs +64 -0
  16. package/templates/skills/domains/ai/SKILL.md +35 -35
  17. package/templates/skills/domains/ai/agent-dev.md +242 -242
  18. package/templates/skills/domains/ai/llm-security.md +288 -288
  19. package/templates/skills/domains/ai/rag-system.md +542 -542
  20. package/templates/skills/domains/architecture/SKILL.md +43 -43
  21. package/templates/skills/domains/architecture/api-design.md +225 -225
  22. package/templates/skills/domains/architecture/cloud-native.md +285 -285
  23. package/templates/skills/domains/architecture/security-arch.md +297 -297
  24. package/templates/skills/domains/data-engineering/SKILL.md +208 -208
  25. package/templates/skills/domains/development/SKILL.md +47 -47
  26. package/templates/skills/domains/development/cpp.md +246 -246
  27. package/templates/skills/domains/development/go.md +323 -323
  28. package/templates/skills/domains/development/java.md +277 -277
  29. package/templates/skills/domains/development/python.md +288 -288
  30. package/templates/skills/domains/development/rust.md +313 -313
  31. package/templates/skills/domains/development/shell.md +313 -313
  32. package/templates/skills/domains/development/typescript.md +277 -277
  33. package/templates/skills/domains/devops/SKILL.md +40 -40
  34. package/templates/skills/domains/devops/database.md +217 -217
  35. package/templates/skills/domains/devops/devsecops.md +198 -198
  36. package/templates/skills/domains/devops/git-workflow.md +181 -181
  37. package/templates/skills/domains/devops/testing.md +283 -283
  38. package/templates/skills/domains/frontend-design/SKILL.md +244 -244
  39. package/templates/skills/domains/frontend-design/claymorphism/SKILL.md +121 -121
  40. package/templates/skills/domains/frontend-design/component-patterns.md +202 -202
  41. package/templates/skills/domains/frontend-design/glassmorphism/SKILL.md +142 -142
  42. package/templates/skills/domains/frontend-design/liquid-glass/SKILL.md +139 -139
  43. package/templates/skills/domains/frontend-design/neubrutalism/SKILL.md +145 -145
  44. package/templates/skills/domains/frontend-design/state-management.md +680 -680
  45. package/templates/skills/domains/frontend-design/ui-aesthetics.md +110 -110
  46. package/templates/skills/domains/frontend-design/ux-principles.md +156 -156
  47. package/templates/skills/domains/infrastructure/SKILL.md +201 -201
  48. package/templates/skills/domains/mobile/SKILL.md +225 -225
  49. package/templates/skills/domains/orchestration/SKILL.md +30 -30
  50. package/templates/skills/domains/orchestration/multi-agent.md +228 -228
  51. package/templates/skills/domains/security/SKILL.md +73 -73
  52. package/templates/skills/domains/security/blue-team.md +436 -436
  53. package/templates/skills/domains/security/code-audit.md +265 -265
  54. package/templates/skills/domains/security/pentest.md +226 -226
  55. package/templates/skills/domains/security/red-team.md +374 -374
  56. package/templates/skills/domains/security/threat-intel.md +372 -372
  57. package/templates/skills/domains/security/vuln-research.md +369 -369
  58. package/templates/skills/tools/lib/shared.js +98 -98
  59. package/templates/skills/tools/override-refusal/SKILL.md +53 -53
  60. package/templates/skills/tools/override-refusal/scripts/refusal_rewriter.js +226 -226
@@ -1,792 +1,792 @@
1
- ---
2
- name: ccg:autonomous
3
- description: 跨 phase 自治长跑:roadmap → wave 并行(默认)spawn phase-runner,仅 blocker 暂停
4
- argument-hint: "[--from N] [--to N] [--only N] [--quality=fast|triple|debate] [--interactive] [--offload] [--sequential] [--max-concurrent N]"
5
- context_budget: orchestrator-15
6
- subagent_freshness: required
7
- allowed-tools:
8
- - Read
9
- - Write
10
- - Edit
11
- - Bash
12
- - Glob
13
- - Grep
14
- - AskUserQuestion
15
- - Task
16
- - Agent
17
- - TodoWrite
18
- ---
19
- <!-- CCG:AUTONOMOUS:START -->
20
-
21
- # Autonomous - 跨 Phase 自治长跑
22
-
23
- ## 职能定位
24
-
25
- `/ccg:autonomous` 是**编排层之上的编排层**:读 `.ccg/roadmap.md` 一次性跑完整个 milestone 的所有 phase,每个 phase 内部委托给 `/ccg:team`(或 `/ccg:spec-impl`)完成 8 阶段流程,仅在 blocker / 灰区接受 / 用户决策点暂停。
26
-
27
- > **v4.1 调度模型变更**:默认行为从 v4.0 的"逐 phase 顺序串行"升级为 **wave 并行**。
28
- > autonomous 用 Kahn 拓扑排序把 EXEC_QUEUE 划分成 wave,wave 内 phase 一次性并行
29
- > spawn `Agent(phase-runner)`(max-concurrent 默认 4),wave 之间顺序执行——这与
30
- > v3.0 起的 `team-exec` wave 调度心智模型对齐,墙钟时间通常压缩 30-40%。
31
- > v4.0 的串行行为通过 `--sequential` flag 保留作为调试 / API 限额场景的降级路径。
32
-
33
- **与 `/ccg:team` 的边界**:
34
-
35
- | 维度 | `/ccg:team` | `/ccg:autonomous` |
36
- |------|-------------|-------------------|
37
- | 范围 | 单个任务的 8 阶段全流程 | 多个 phase 顺序串联 |
38
- | 调用对象 | 直接 spawn Architect / Dev / QA / Reviewer | 调用 `/ccg:team` 或 `/ccg:spec-impl` |
39
- | 状态文件 | `.ccg/state.md`(任务 wave 维度) | `.ccg/roadmap.md`(phase 维度) |
40
- | 暂停条件 | Critical 未修、Phase 6 之后用户确认 | blocker / 灰区 / 跨 phase 依赖断裂 |
41
- | 适合 | 一次性完整开发任务 | 长程 milestone(重构、迁移、多阶段功能) |
42
-
43
- 简言之:autonomous 写 `.ccg/roadmap.md`(phase 进度),team-exec 写 `.ccg/state.md`(wave 任务进度),两份文件分工明确互不交叉。
44
-
45
- ---
46
-
47
- ## 触发场景
48
-
49
- **适合**:
50
- - 长程重构(如 monolith → 微服务,分 5 phase 拆分)
51
- - 多阶段功能开发(认证体系:先后端 schema → API → 前端登录页 → SSO 集成)
52
- - 迁移项目(React 16 → 18、CommonJS → ESM、Jest → Vitest)
53
- - 周末/夜间无人值守跑长链路任务
54
- - 已有清晰 roadmap、各 phase 间依赖明确的项目
55
-
56
- **不适合**:
57
- - 一次性任务(直接用 `/ccg:team`)
58
- - 紧急修复(直接用 `/ccg:debug`)
59
- - 探索性需求未定型(先 `/ccg:spec-research`)
60
- - 单 phase 内的并行实施(用 `/ccg:team-exec`)
61
-
62
- ---
63
-
64
- ## 前置条件
65
-
66
- 1. **`.ccg/roadmap.md` 必须存在**。若不存在,autonomous 第一步引导用户创建(见 Step 1)。
67
- 2. **Agent Teams 已启用**(`CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1`),因为内部要调 `/ccg:team`。
68
- 3. **WORKDIR**:通过 Bash `pwd`(Unix)或 `cd`(Windows)获取当前工作目录绝对路径,禁止从 `$HOME` 推断。
69
-
70
- ---
71
-
72
- ## 工作流程
73
-
74
- ### Step 1: Roadmap 解析与初始化
75
-
76
- 1. 通过 Bash 执行 `pwd` 获取 WORKDIR。
77
- 2. Read `<WORKDIR>/.ccg/roadmap.md`:
78
- - **存在** → 解析所有 `## Phase N: <name> (<status>)` 标题,抽出 `goal` / `depends on` / `started` / `completed` / `outcome` 字段。
79
- - **不存在** → 用 `AskUserQuestion` 询问用户:
80
- ```
81
- 未发现 .ccg/roadmap.md。autonomous 需要 roadmap 列出所有 phase。请选择:
82
- 1. 我来口述 milestone 拆分,由你生成 roadmap.md
83
- 2. 我自己写好 roadmap.md 后再跑 /ccg:autonomous
84
- 3. 跑 /ccg:spec-research <需求> 自动生成 roadmap.md 草案
85
- ```
86
- - 选项 1 → 通过对话补全所有 phase,写入 roadmap.md,请用户确认后继续。
87
- - 选项 2/3 → 终止当前调用。
88
-
89
- 3. **解析校验**:
90
- - 每个 phase 必须有唯一序号(Phase 1、Phase 2、...)
91
- - `Depends on` 引用的 phase 序号必须存在
92
- - 状态值合法:`pending` / `in_progress` / `completed` / `failed` / `skipped`
93
- - 任一不合法 → 终止,列出问题清单要求用户修正
94
-
95
- ### Step 2: 应用 flag 过滤
96
-
97
- 按以下优先级生成执行队列 `EXEC_QUEUE`:
98
-
99
- | 场景 | 行为 |
100
- |------|------|
101
- | `--only N` 提供 | `EXEC_QUEUE = [Phase N]`,其余全跳过 |
102
- | `--from N` 提供 | 从 Phase N 开始,含 N |
103
- | `--to N` 提供 | 跑到 Phase N 结束,含 N,不推进 N+1 |
104
- | 都未提供 | 从第一个非 `completed` phase 开始,跑到末尾 |
105
- | 同时给 `--only` 和 `--from`/`--to` | `--only` 优先,其余忽略并提示 |
106
- | `--interactive` | 每个 phase 内的 plan 阶段保留与用户问答(不自动判定灰区) |
107
- | `--offload` | **重型 phase 自动外包给 codex plugin**(fresh context + 后台 + 主线只 poll status),默认开启自动判定,flag 显式时强制开启 |
108
- | `--sequential` | **降级为 v4.0 行为**:禁用 wave 并行,单 phase 一波顺序串跑。调试 / API 限额场景使用 |
109
- | `--max-concurrent N` | 单 wave 内最大并发 phase 数,默认 4。`--max-concurrent 1` 等价 `--sequential` |
110
- | `--quality=fast\|triple\|debate` | **v4.2 P22 旗舰**:单 phase 内的质量档分级。`fast`=v4.1 单波 + 1 路 verify;`triple`=Plan-Critic-Verify 4 wave(**默认**);`debate`=triple + codex↔gemini 多轮对辩。详见 Step 4.0 |
111
- | `--nested=on\|off` | **v4.5 P1f**:phase-runner 是否启用 nested rescue 委派(CLI 子进程内 spawn `codex:codex-rescue` / `gemini:gemini-rescue` 委派代码改动)。默认 `off` 保守。phase frontmatter `nested_rescue: true\|false` 优先级更高。详见 Step 4.0c |
112
-
113
- 附加规则:
114
- - 状态已是 `completed` 的 phase 默认跳过(除非 `--only N` 强制重跑)
115
- - 状态为 `failed` 的 phase 进入队列时询问用户:重跑 / 跳过 / 终止
116
- - `EXEC_QUEUE` 为空 → 输出"所有 phase 已完成 ✅"并退出
117
-
118
- ### Step 3: 用户确认
119
-
120
- 用 `AskUserQuestion` 展示执行计划:
121
-
122
- ```
123
- 🛣 即将自治执行 Milestone: <project name>
124
-
125
- 执行队列(共 N phase):
126
- - Phase 2: 实现 user API(依赖 Phase 1 ✅)
127
- - Phase 3: 前端登录页(依赖 Phase 2)
128
- - Phase 4: SSO 集成(依赖 Phase 3)
129
-
130
- 预计调用:
131
- - /ccg:team × 3(每个 phase 一次完整 8 阶段)
132
- - 暂停条件:Critical 未修 / 用户决策点 / 跨 phase 依赖断裂
133
-
134
- 模式:<auto | interactive>
135
-
136
- 确认开始?
137
- ```
138
-
139
- `--interactive` 模式下,每个 phase 的 plan 阶段保留与用户问答(不自动判定灰区),其余阶段照常自治。
140
-
141
- ### Step 4: Phase 主循环(v4.1 wave 并行 + v4.2 P22 质量档分级)
142
-
143
- #### 4.0 Ground-Truth 采样(v4.3 P26 / v4.4 P32 集成)
144
-
145
- **进入主循环前**,主线必须采样真实外部接口状态,写入 `.context/ground-truth/<ISO timestamp>.json` + 软链 `latest.json`。
146
- phase-runner 的 prompt 强约束 "写涉及 plugin subagent_type / hook event / settings.json schema / skill 名 等代码前必须 Read latest.json",避免 v4.2.0 `codex:codex-rescue` 同型猜接口事故重演。
147
-
148
- **主线动作**(伪码):
149
-
150
- ```js
151
- import { sampleAll, summarizeGroundTruth } from 'src/utils/ground-truth-sampler'
152
-
153
- const gt = sampleAll({ workdir: process.cwd() })
154
- const ts = gt.sampledAt.replace(/[:.]/g, '-') // 文件名安全
155
- const dir = '.context/ground-truth'
156
-
157
- mkdirSync(dir, { recursive: true })
158
- writeFileSync(`${dir}/${ts}.json`, JSON.stringify(gt, null, 2))
159
-
160
- // 软链 latest.json(POSIX symlinkSync;Windows 退化为复制写入)
161
- try { unlinkSync(`${dir}/latest.json`) } catch {}
162
- try { symlinkSync(`${ts}.json`, `${dir}/latest.json`) }
163
- catch { writeFileSync(`${dir}/latest.json`, JSON.stringify(gt, null, 2)) }
164
-
165
- console.log(summarizeGroundTruth(gt)) // ≤500 token brief 写入主线对话以便 phase-runner 拷贝
166
- ```
167
-
168
- **容错**:若采样抛错,主线打印警告但**不阻塞推进**——单 phase 仍可工作(degraded:phase-runner prompt 走"无 ground truth"分支,凭 spec 文档猜,恢复至 v4.2 行为)。
169
-
170
- **phase-runner 注入路径**:每次 spawn phase-runner 时,主线在 prompt 里加一行 `ground_truth_path: <workdir>/.context/ground-truth/latest.json`,并要求子 agent 在动外部接口代码前必须 Read 该文件。
171
-
172
- #### 4.0a 质量档解析(v4.2 P22 新增,单 phase 内调度)
173
-
174
- 每个 phase 进入主循环前,主线先确定**该 phase 内部使用什么质量档**——这决定单个 phase 的 wave 编排(不是整个 milestone 的 wave 拓扑,那是 4.0b)。
175
-
176
- **优先级(高 → 低)**:
177
-
178
- 1. **phase frontmatter `Quality:` 字段**(roadmap.md 单 phase 覆盖全局 flag)
179
- ```markdown
180
- ## Phase 22: schema migration (pending)
181
- - **Goal**: ...
182
- - **Quality**: debate ← phase 自带,优先级最高
183
- ```
184
- 2. `--quality=<tier>` CLI flag(autonomous 命令行参数)
185
- 3. 默认 `triple`(**v4.2 行为变化**:v4.1 默认是单波 phase-runner = `fast`)
186
-
187
- 主线引用 `src/utils/quality-router.ts` 的 `buildQualityPlan()` helper(实际逻辑已落地为单元测试覆盖;本模板只描述 LLM 主线该做什么):
188
-
189
- ```
190
- qualityPlan = buildQualityPlan(
191
- { cliArgs: <user args>, phaseQuality: <从 frontmatter 读> },
192
- { phaseId, phaseType, quality, workdir, jobId, nestedRescue: <从 frontmatter 读> },
193
- pluginAvailability,
194
- {
195
- useDirectBashInvocation: true, # ⛔ v4.5 P1a 强制 ON
196
- useLauncherWiring: true, # ⛔ v4.5 P1f 强制 ON(解锁 supervisor 全部能力)
197
- },
198
- )
199
- // qualityPlan.tier → 'fast' | 'triple' | 'debate'
200
- // qualityPlan.waves → WavePlan[] (kind ∈ plan|critic|impl|verify|debate)
201
- // qualityPlan.degraded / degradedTo → plugin 缺失自动降阶
202
- ```
203
-
204
- **⛔ v4.5 P1a 强约束(impl wave Bash 直调)**:
205
-
206
- `useDirectBashInvocation: true` 时 impl wave 的 phase-runner spawn 会标
207
- `invocationMode: 'bash-direct'` + 附 `bashCommand`,主线**必须用 Bash 工具**执行
208
- 该命令(启 OS-level `claude -p --agent ccg/phase-runner` 子进程),**不可**走
209
- `Agent(subagent_type="phase-runner")` 主进程 sidechain。
210
-
211
- 理由:v4.4.x dogfood 实测主进程 RSS 7.5h 累积 23GB 把 VM 弄崩,根因是 Agent
212
- sidechain transcript 留在主进程内存。Bash 子进程的 RSS 与主进程隔离,phase
213
- 结束后内存全部回收。详见 `.ccg/v4.5-roadmap.md` P1a。
214
-
215
- **三档对照(dogfood + SOTA 实测预算)**:
216
-
217
- | 档 | wave 序列 | 壁钟膨胀 | token 膨胀 | 质量档(dogfood 估测) |
218
- |----|----------|---------|-----------|----------------------|
219
- | `fast` | impl → verify | +30% | +20% | 6.5/10 → 7.5/10 |
220
- | `triple` | plan → critic → impl → verify | +60-90% | +80% | →8.5/10 |
221
- | `debate` | plan → debate×3 → critic → impl → verify | +100-150% | +150% | →9/10 |
222
-
223
- **降级路径**(plugin 缺失自动):
224
-
225
- | 用户请求 | plugin 状态 | 实际执行 |
226
- |---------|------------|---------|
227
- | `debate` | 双 plugin 都缺 | → `fast`(debate/triple 失去对辩多样性) |
228
- | `debate` | 单 plugin 缺 | → `triple` |
229
- | `triple` | 双 plugin 都缺 | → `fast` |
230
- | `triple` | 单 plugin 缺 | 不降阶,但缺失方向走 `general-purpose` + CCG prompt 模板 |
231
- | `fast` | 双 plugin 都缺 | 主线 reviewer fallback(main-thread Claude 自审) |
232
-
233
- 降级时主线在 roadmap.md 该 phase 标 `Note: quality degraded from <X> to <Y> — <reason>`。
234
-
235
- **设计哲学(基于市面 SOTA Plan-Critic-Verify 实测)**:
236
-
237
- - **Plan 阶段 lateral diversity**(codex+gemini+claude 3 路并行)—— 不同视角生成不同侧重点
238
- - **Critic 阶段 angle-based**(assumptions-analyzer + nyquist-auditor)—— 不是按模型而是按"审视角度"分工
239
- - **Implementer 单 strong model**(phase-runner 全权 Bash)—— 一致性 > 多样性,避免多 implementer 的 merge 痛苦
240
- - **Verify cross-vendor**(codex + gemini)—— 抓 race condition / commit drift / 半成品状态
241
-
242
- #### 4.0c Nested rescue 解析(v4.5 P1f opt-in)
243
-
244
- 每个 phase 进入主循环前,主线确定 phase-runner CLI 子进程内是否启用 **nested rescue 委派**——即在 CLI 子进程内 spawn `Agent(codex:codex-rescue)` / `Agent(gemini:gemini-rescue)` 委派代码改动。
245
-
246
- **优先级(高 → 低)**:
247
-
248
- 1. **phase frontmatter `nested_rescue: true|false`**(roadmap.md 单 phase 覆盖)
249
- ```markdown
250
- ## Phase 6: nested-G-plan-wiring (in_progress)
251
- - **Goal**: ...
252
- - **nested_rescue**: true ← phase 自带,优先级最高
253
- ```
254
- 2. `--nested=on|off` CLI flag(autonomous 命令行参数)
255
- 3. 默认 `false`(保守:与 v4.5 v1 保守路线 100% 等价)
256
-
257
- 主线引用 `src/utils/quality-router.ts` 的 `resolveNestedRescue()` helper:
258
-
259
- ```
260
- nested = resolveNestedRescue({
261
- cliArgs: <user args>,
262
- phaseNestedRescue: <从 frontmatter 读,可空>,
263
- })
264
- // nested.enabled → true | false
265
- // nested.source → 'phase-override' | 'cli-flag' | 'default'
266
- ```
267
-
268
- **phase-runner prompt 注入**:spawn phase-runner 时主线在 prompt 里加:
269
-
270
- ```yaml
271
- nested_rescue: <true | false>
272
- job_id: <主线 launcher 分配> # phase-runner 需 Read .context/jobs/<job_id>/degraded.flag
273
- ```
274
-
275
- phase-runner 按 `nested_rescue` 字段切换实施路径(详见 `~/.claude/agents/ccg/phase-runner.md` "Nested rescue delegation" 段):
276
- - `false` → 自实施(v4.0/v4.4 行为)
277
- - `true` → 按 phase_type 路由 spawn rescue plugin;CAP=3;监听 `degraded.flag`
278
-
279
- **默认 `--nested=off` 行为不变**——与 v4.5 v1 单波 phase-runner 自实施 100% 等价。
280
-
281
- #### 4.0b 拓扑分波(Kahn 算法)
282
-
283
- **默认行为**:把 `EXEC_QUEUE` 按 `Depends on` 字段构建有向无环图,Kahn 拓扑排序分波——
284
- 没有未满足依赖的 phase 进 wave 1,依赖 wave 1 的进 wave 2,依次类推。同 wave 的 phase
285
- 之间无依赖关系,可在主线一个 message 里并行 spawn 多个 `Agent(phase-runner)`,由 Claude
286
- Code 引擎并发执行;不同 wave 之间顺序执行。
287
-
288
- 主线引用 `src/utils/wave-scheduler.ts` 的 `parseRoadmap` + `schedule` helper(实际算法
289
- 已落地为单元测试覆盖,本模板只描述 LLM 主线该做什么):
290
-
291
- ```
292
- phases = parseRoadmap(roadmap.md content)
293
- waves, skipped, batches = schedule(phases, {
294
- maxConcurrent: <user --max-concurrent N or 4>,
295
- skipCompleted: true,
296
- })
297
- ```
298
-
299
- **`--sequential` 降级**:等价 `maxConcurrent = 1`,每 phase 单独成一批,顺序执行。
300
- 调试 / 复现历史 v4.0 行为 / API 限额场景使用。
301
-
302
- **Cascade skip**:若某 phase 状态为 `failed` 或 `skipped`,所有(直接 / 间接)
303
- 依赖它的 phase 自动标 `skipped`,从 EXEC_QUEUE 移除并在 roadmap.md 写
304
- `skipped (cascade from Phase X)`,不进入任何 wave。这避免了下游 phase 在
305
- 依赖断裂时仍尝试 spawn phase-runner 浪费 token。
306
-
307
- **用户确认**:进入 Step 4.1 前 `AskUserQuestion` 展示 wave 划分:
308
-
309
- ```
310
- 🌊 Wave 划分(共 W wave):
311
- Wave 1: Phase 1, 3, 4, 7, 8, 10, 11 ← 并行 spawn 7 phase-runner(max-concurrent=4 → 分 2 批)
312
- Wave 2: Phase 2, 5, 6 ← 等 Wave 1 完成
313
- Wave 3: Phase 9 ← 等 Wave 2 完成
314
- Wave 4: Phase 12 ← 等 Wave 3 完成
315
-
316
- 预计墙钟压缩:~35% vs 顺序执行
317
- 模式:parallel | sequential
318
- ```
319
-
320
- #### 4.1 准备 phase(按 wave 迭代 + 单 phase 质量档子 wave)
321
-
322
- **两层 wave 概念**(v4.2 P22 起):
323
-
324
- - **外层 wave**(4.0b 拓扑):milestone 级别,按 phase 间 Depends on 关系分波,wave 内 phase 并行
325
- - **内层 wave**(4.0a 质量档):单 phase 内部,按 fast/triple/debate 分 2/4/7 个子 wave,**子 wave 之间顺序执行**
326
-
327
- 主循环结构(伪码):
328
-
329
- ```
330
- for outerWave in milestoneWaves:
331
- batches = chunk(outerWave, max-concurrent) # 单 wave 拆批
332
- for batch in batches:
333
- # 每个 phase 独立按其质量档跑内层 wave
334
- results = spawn_parallel(batch, lambda phase:
335
- runPhaseWithQualityPlan(phase, buildQualityPlan(...)))
336
- # 整 wave 完成后批量更新 roadmap.md,处理 cascade
337
- update_roadmap_for_wave(outerWave, results)
338
-
339
- # 单 phase 内层 wave 处理(fast/triple/debate 共用骨架):
340
- runPhaseWithQualityPlan(phase, plan):
341
- designBrief = null
342
- verifyFindings = null
343
- for innerWave in plan.waves:
344
- switch innerWave.kind:
345
- case 'plan': # 仅 triple/debate
346
- contributions = spawn_parallel(innerWave.spawns) # 3 路并行
347
- designBrief = aggregatePlans(contributions)
348
- case 'critic': # 仅 triple/debate
349
- criticReports = spawn_parallel(innerWave.spawns)
350
- if any critical → mark phase requiring revise BEFORE impl
351
- case 'debate': # 仅 debate(共 3 子 wave)
352
- debateRound = spawn_parallel(innerWave.spawns)
353
- # 复用 debate-orchestrator.shouldStop 提前收敛
354
- case 'impl':
355
- # spawn phase-runner,prompt 注入 design_brief / verify_findings
356
- phaseSummary = spawn(phase-runner, prompt={
357
- ...basePromptFields,
358
- design_brief: serializeBriefForPrompt(designBrief),
359
- verify_findings: verifyFindings,
360
- })
361
- case 'verify':
362
- # P27: triple/debate verify wave 现在 3 路并行:
363
- # - codex:codex-rescue — cross-vendor verify (race / commit drift)
364
- # - gemini:gemini-rescue — cross-vendor verify (UX / 半成品)
365
- # - interface-auditor — 跨 phase 接口审计(SSoT / leftover /
366
- # magic-string vs ground truth /
367
- # commit-diff drift / mock-drift)
368
- # fast 模式不加 interface-auditor(fast 优先速度)。
369
- #
370
- # ⛔ v4.4.2 verify wave 强制 Bash 直调 plugin script:
371
- # verifyWave = planVerifyWave(tier, layer, plugins,
372
- # { useDirectBashInvocation: true })
373
- # for each spawn entry where invocationMode === 'bash-direct':
374
- # 主线用 Bash 工具跑 spawn.bashCommand(而非 Agent(subagent_type=...))。
375
- # — 绕开 plugin sonnet wrapper,避免 broker 故障 / 空答时的
376
- # silent contamination(sonnet 自答冒充 cross-vendor 视角)。
377
- # — Bash exit≠0 OR stdout 字节<阈值 → 失败信号 loud,主线据此重试。
378
- # interface-auditor 仍走 Agent(subagent_type="interface-auditor")
379
- # —— CCG 自家 agent 无 sonnet wrapper 风险。
380
- verifyReports = spawn_parallel(innerWave.spawns)
381
- # 主线综合:原 verifier critical 任一 + interface-auditor critical
382
- # 任一 → revise(synthesizeVerifyResults 已统一处理 STATUS/FINDINGS
383
- # 协议;interface-auditor 摘要复用同 schema,无需特判)
384
- decision = synthesizeVerifyResults(verifyReports)
385
- if decision === 'revise' && retryCount < 1:
386
- verifyFindings = synthesizeVerifyFeedback(verifyReports)
387
- retry impl wave once
388
- elif decision === 'escalate':
389
- AskUserQuestion → blocker path
390
- ```
391
-
392
- **impl wave 的 phase-runner prompt 增量**(v4.2 P22):
393
-
394
- triple/debate 模式 plan wave 完成后,主线把 `aggregatePlans` 输出经
395
- `serializeBriefForPrompt()` 序列化(≤500 token)注入 phase-runner prompt 的
396
- `design_brief` 字段(参考 `templates/commands/agents/phase-runner.md` 输入契约)。
397
-
398
- verify wave 后若 decision='revise',主线再 spawn 一次 phase-runner,
399
- `verify_findings` 字段填 `synthesizeVerifyFeedback()` 输出。
400
- **修订仅一轮**(避免无限循环);二次失败标 `partial` 进 blocker。
401
-
402
- 针对**每个**进入并发的 phase,spawn 前做:
403
-
404
- - 在 `.ccg/roadmap.md` 中将该 phase 状态改为 `in_progress`,写入 `Started: <时间戳>`。
405
- 整 wave 一次性写 roadmap(避免多次磁盘写穿透),用 batch update 模式。
406
- - 用 TodoWrite 维护一个跨 phase 进度列表(每 phase 一项),便于用户随时看进度。
407
- - 检查依赖:所有 `Depends on` 列出的 phase 必须为 `completed`(Step 4.0 已保证;
408
- 这里是 belt-and-suspenders 校验)。失败进入 **blocker 路径**(Step 5)。
409
-
410
- #### 4.2 路由:调 `/ccg:spec-impl` / `phase-runner` / `/ccg:team`
411
-
412
- 按以下优先级判定(**前序匹配后短路**):
413
-
414
- 1. **phase 标题含 `opsx://` 引用** → 走 OpenSpec 路径,调 `/ccg:spec-impl` 并传入 change_id
415
- 2. **runner 模式 phase**(`--offload` flag 或 phase 标 `[offload]` tag 或满足重型自动触发)→ 用 `Bash(claude -p --agent ccg/phase-runner ...)` 启 OS-level 子进程(**v4.5 P1a**;详见下方"phase-runner 调用方式"),把 phase 完整定义 + Type 字段写到 prompt 文件传给子进程
416
- 3. **默认** → 走 Agent Teams 路径,调 `/ccg:team <phase goal>`
417
-
418
- ##### runner 模式判定(决定走第 2 路)
419
-
420
- **显式触发**:
421
- - `--offload` flag 提供(强制走 phase-runner,所有 phase 都走)
422
- - 用户在 roadmap.md 里手动标 `[offload]` 或 `Mode: runner`(例 `## Phase 5: 命令收敛 [offload] (pending)`)
423
-
424
- **自动触发**(满足任一即可):
425
- - phase goal 含关键词:`重构 / 迁移 / 全量改 / refactor / migrate / rewrite`
426
- - phase 预估涉及 > 20 个文件
427
- - 上一个 phase 的 plan 文件 > 800 行
428
-
429
- ##### phase-runner 调用方式(v4.5 P1a:Bash 直调 OS 子进程)
430
-
431
- phase-runner 是 CCG v4.0 引入的**单 phase 全权代理 agent**——它按 phase Type
432
- 字段决定工作风格,沙箱外补 git/test/typecheck handoff,最终返回主线 ≤200
433
- token 摘要。详见 `~/.claude/agents/ccg/phase-runner.md`。
434
-
435
- **v4.5 起 phase-runner 通过 OS-level subprocess 启动**(不再用 Agent sidechain)。
436
- **v4.5.1 P1f 起经 launcher 包装**(解锁 Phase 2 supervisor 能力:atomic state /
437
- process-tree kill-tree / cancel.flag 协作 / reconciler)。
438
-
439
- 主线读 `qualityPlan.waves[i].spawns[0]`(impl wave)的 `bashCommand` 字段直接跑:
440
-
441
- ```bash
442
- # 1. 把 phase prompt 写到 .context/jobs/<job-id>/prompt.txt(主线先 Write)
443
- # 2. 用 Bash run_in_background=true 启动 launcher 包装的子进程:
444
- Bash(node '~/.claude/.ccg/scripts/ccg-phase-runner-launcher.mjs' \
445
- --job-id '<job-id>' \
446
- --workdir '<workdir>' \
447
- --prompt-file '.context/jobs/<job-id>/prompt.txt' \
448
- --tier '<fast|triple|debate>' \
449
- --grace-ms 5000 \
450
- > '.context/jobs/<job-id>/progress.jsonl' 2>&1)
451
- # Launcher 内部包装 claude -p --agent ccg/phase-runner ... 并:
452
- # - atomic 写 state.json (parent_pid, cli_pid, process_group_id, cwd, cmd, broker_tx_id)
453
- # - POSIX setsid / Windows DETACHED_PROCESS(process tree 可 kill)
454
- # - 监听 cancel.flag + grace + kill-tree
455
- # - terminal status atomic 写
456
- # 主线轮询 progress.jsonl(wc -l / tail),子进程结束后 parsePhaseRunnerStreamSummary
457
- # 抽末行 result.result 字段拿 ≤200 token SUMMARY
458
- ```
459
-
460
- **裸 `claude -p` 路径**(旧 P1a,无 supervisor 包装)保留作 BC:仅 dev workflow / 单测覆盖。生产走 launcher(`useLauncherWiring: true`)。
461
-
462
- prompt.txt 的内容(**v4.5 P1f 起**新增 `nested_rescue` + `job_id` 字段):
463
-
464
- ```yaml
465
- phase_id: phase-<N>-<slug>
466
- phase_n: <N>
467
- phase_name: <从 roadmap.md 标题提取>
468
- phase_type: <backend | frontend | fullstack | docs | generic>
469
- phase_goal: |
470
- <Goal 段全文>
471
- phase_acceptance: |
472
- <Acceptance 段全文>
473
- phase_depends_on: <已 completed 的 phase 列表 + 它们的产物路径>
474
- workdir: <WORKDIR>
475
- baseline_sha: <最近一次 baseline commit sha7>
476
- report_path: .claude/team-plan/phase-<N>-<slug>-report.md
477
- commit_prefix: feat(v4-p<N>):
478
- enable_challenger: false
479
- nested_rescue: <true | false> # v4.5 P1f:来自 4.0c resolveNestedRescue()
480
- job_id: <主线 launcher 分配的 job-id> # v4.5 P1b:phase-runner 需 Read degraded.flag
481
- ```
482
-
483
- **为什么 Bash 直调**:v4.4.x dogfood 主进程 RSS 7.5h 累积 23GB 撞 VM 极限。
484
- Agent sidechain 的 transcript 留主进程内存;OS 子进程则是独立 PID,phase 结束
485
- 后内存全部回收。三层 OS 进程隔离(主线 / phase-runner / nested rescue)首次
486
- 落地。详见 `.ccg/v4.5-roadmap.md` P1a + `.ccg/poc-v45/poc-results.md` T9。
487
-
488
- **禁用** `Agent(subagent_type="phase-runner")` —— 已弃用。autonomous 主线**不得**
489
- 回退到该路径(除非 P1f gate 失败显式降级,由 release notes 公示)。CLI 子进程内
490
- phase-runner 内部 `Agent` 工具可用——CLI 模式与 sidechain 模式工具白名单不同
491
- (PoC T9 实测);nested rescue 委派由此路径解锁。
492
-
493
- **模型路由委派给 phase-runner**:autonomous 主线不再硬编码 codex/gemini,phase-runner 根据 prompt 里的 `phase_type` 字段决定 spawn `codex:codex-rescue` 还是 `gemini:gemini-rescue`。这修复了 v3.0 路由 bug(autonomous 绕过 `{{FRONTEND_PRIMARY}}/{{BACKEND_PRIMARY}}` 配置)。
494
-
495
- **降级路径**:若 `Agent(phase-runner)` 调用失败(v3.0 旧版未装该 subagent),输出告警 + fallback 到第 3 路 `/ccg:team`,roadmap.md 备注 `Note: phase-runner unavailable, fell back to team`。
496
-
497
- #### 4.3 监控 phase 内信号
498
-
499
- **走 team / spec-impl 路径**(4.2 第 1/3 路):
500
-
501
- - team 会在 `.ccg/state.md` 写 wave-level 任务进度(这是 team-exec 的职责,autonomous 不重写它)。
502
- - team 完成后产出 `.claude/team-plan/<task-id>-report.md`。
503
- - autonomous 读取该 report:
504
- - **Phase 完成且 Critical = 0** → 进入 4.4 推进
505
- - **Phase 完成但 Critical > 0**(用户在 team 内选了"接受失败") → 进入 **blocker 路径**
506
- - **Phase 失败**(team 异常退出 / 测试不可恢复地失败) → 进入 **blocker 路径**
507
-
508
- **走 phase-runner 路径**(4.2 第 2 路,v4.5 P1a Bash 直调 + P1f launcher wiring):
509
-
510
- - 主线 `Bash(run_in_background=true)` 启动 `node ccg-phase-runner-launcher.mjs ...` 子进程后**不阻塞**继续做别的;用 `Bash(wc -l .context/jobs/<id>/progress.jsonl)` / `Bash(tail -n 5 ...)` 轮询观察进度(launcher 透传子进程 stdout 到 progress.jsonl)
511
- - 子进程结束(exit code 写到 background job 状态)后主线读 `progress.jsonl` 末行,调 `parsePhaseRunnerStreamSummary()` helper 抽 `result.result` 字段拿 ≤200 token 摘要
512
- - 主线**不读 transcript、不读 progress.jsonl 中间 stream-event**(仅观察 wc -l 行数 + 末行 result)
513
- - 主线只读 phase-runner 返回的 ≤200 token 摘要:
514
- ```
515
- STATUS: completed | partial | failed | degraded
516
- COMMIT: <sha7> | none
517
- TESTS: <pass>/<total> passed (delta +<n>)
518
- TYPECHECK: pass | fail
519
- HANDOFF_TAKEN: [git_commit, test_run, ...]
520
- CONTEXT_DELTA: <一句话>
521
- NOTES: <一行关键发现 / 灰区决策点>
522
- ```
523
- - 摘要解析后路由:
524
- - `STATUS: completed` → 进入 4.4 推进
525
- - `STATUS: partial` → AskUserQuestion 暂停("重试 / 接受部分 / 跳过 / 终止")
526
- - `STATUS: failed` → AskUserQuestion 暂停("重试 / 跳过 / 终止"),下游依赖 phase 自动 cascade 标 blocked
527
- - `STATUS: degraded` → 警告但继续(rescue plugin 不可用但 phase-runner 已 fallback 完成)
528
- - **心跳超时**:spawn phase-runner 后 30 分钟内无 completion 通知 → AskUserQuestion 提示"等 / 强制 fail / 重 spawn"
529
- - runner 路径**不写** `.ccg/state.md`(state.md 是 team-exec 私域),只在 roadmap.md 该 phase 写 `Mode: runner` + `Plan: .claude/team-plan/<phase-id>-report.md`
530
-
531
- **主线 context 不漂移的关键**:autonomous 主线只接 ≤200 token 摘要,phase-runner 子 agent 的 transcript(包括 codex/gemini rescue 报告全文)都在子 agent 的 fresh context 里,**不进主线**。这正是 GSD"主线 ≤15% / subagent fresh"原则的 Claude Code 原生实现。
532
-
533
- #### 4.4 Phase 推进(wave 级批处理)
534
-
535
- - **4.4.a Critical phase challenger 编排(v4.1 Phase 16)**:
536
- 当 phase 摘要 `STATUS: completed` 时,主线先读 phase frontmatter `Critical:` 字段
537
- (默认 `false`)。若 `Critical: true` 且**未进入修订轮**,主线**不立即推进**,
538
- 改为 spawn 一组 challenger agents 做"双视角对辩 + 假设/边界审计":
539
-
540
- 路由(由 `src/utils/challenger-orchestrator.ts` 的 `planChallengerSpawns` 决定,
541
- 本模板只描述 LLM 该做什么):
542
-
543
- | phase Type | spawn 计划(adversarial=true)|
544
- |-----------|------------------------------|
545
- | `backend` | `Agent(codex:codex-rescue)` + `Agent(assumptions-analyzer)` |
546
- | `frontend` | `Agent(gemini:gemini-rescue)` + `Agent(nyquist-auditor)` |
547
- | `fullstack`| `Agent(codex:codex-rescue)` + `Agent(gemini:gemini-rescue)` + `Agent(assumptions-analyzer)` + `Agent(nyquist-auditor)` |
548
- | `docs`/`generic` | `Agent(assumptions-analyzer)` 单兵 |
549
-
550
- **plugin 缺失降级**(acceptance d):installer 检测不到 `codex:codex-rescue` 或
551
- `gemini:gemini-rescue` 命令时,主线只 spawn specialist(CCG 自家 agent,必装),
552
- **不 fallback** 到 codeagent-wrapper(避免重新建立 v3.0 已退役的依赖)。
553
- roadmap.md 备注 `Note: challenger degraded — plugin <name> missing`。
554
-
555
- spawn 范式(一个 message 内并行):
556
-
557
- ```
558
- Agent({ subagent_type: "codex:codex-rescue",
559
- description: "Phase <N> challenger (codex)",
560
- prompt: <挑战 phase 改动 + 引用 phase-runner 的 commit sha7> })
561
- Agent({ subagent_type: "assumptions-analyzer",
562
- description: "Phase <N> assumption critic",
563
- prompt: <审视 plan 假设、隐藏依赖、未验证前提> })
564
- ```
565
-
566
- challenger 摘要协议(每路 ≤200 token):
567
-
568
- ```
569
- STATUS: complete | error
570
- FINDINGS: [{severity:critical|major|info, category:..., message:...}, ...]
571
- NOTES: <≤80 字>
572
- ```
573
-
574
- 主线综合(由 `decideFromSummaries` helper 决定):
575
-
576
- - **任一 critical finding** → spawn implementer phase-runner **修订一轮**,
577
- prompt 里嵌入 `synthesizeRevisionFeedback()` 输出的 critical 反馈块,
578
- 要求"仅修复 critical 项,不重做整个 phase"。修订仅一轮(避免无限循环);
579
- 第二轮失败标 `partial` 进 blocker 路径。
580
- - **无 critical** → 推进(与非 Critical phase 路径合流)。
581
- - **任一 error** → AskUserQuestion 暂停("重试 challenger / 跳过 challenger 直接推进 / 终止")。
582
-
583
- **跳过条件**:phase frontmatter `Critical: false`(或未声明)→ 跳过 4.4.a,
584
- 直接进 4.4.b 状态写入。
585
-
586
- - **4.4.b 状态写入**:单个 phase 完成时,在 `.ccg/roadmap.md` 中将该 phase 状态改为 `completed`,
587
- 写入 `Completed: <时间戳>`、`Outcome: <一句话总结>`、`Plan: .claude/team-plan/<task-id>/`。
588
- - 整 wave 完成(所有 batch 都返回)后做一次性 cascade 检查:
589
- - 如果该 wave 内任意 phase status=failed/partial(用户选了"跳过"或"接受失败"),
590
- 重跑 `cascadeSkip()` helper,把新增的 cascade-skipped phase 从后续 wave 移除,
591
- 在 roadmap.md 写 `skipped (cascade from Phase X)`。
592
- - 输出 wave 完成提示:
593
- ```
594
- 🌊 Wave 1/4 → completed (Phase 1, 3, 4, 7, 8, 10, 11 — 7 phase 并行)
595
- → 推进 Wave 2/4 (Phase 2, 5, 6)
596
- ```
597
- - 进入下一 wave。
598
-
599
- ### Step 5: Blocker 路径
600
-
601
- 任何 blocker 都通过 `AskUserQuestion` 暂停,向用户报告:
602
-
603
- ```markdown
604
- ⚠️ Autonomous 暂停于 Phase 2
605
-
606
- 原因: <Critical 未修 / 依赖 Phase 1 失败 / API 配额耗尽 / 用户决策点>
607
-
608
- 详情:
609
- <具体内容,含 team 的 report 摘要、错误日志、灰区描述>
610
-
611
- 下一步:
612
- 1. 重试本 phase(重新调 /ccg:team)
613
- 2. 跳过本 phase(标记 skipped,下游依赖 phase 自动 skipped)
614
- 3. 终止 autonomous(保留 roadmap.md 当前进度,下次可续跑)
615
- 4. 我来手动处理(暂停 autonomous,用户处理后回复"继续")
616
- ```
617
-
618
- 用户选择决定后续行为;选 4 时 autonomous 进入挂起态,等用户回到主对话发"继续"信号后从断点恢复。
619
-
620
- ---
621
-
622
- ## 暂停条件 / Blocker 定义
623
-
624
- 必须暂停的场景:
625
-
626
- | 触发 | 描述 |
627
- |------|------|
628
- | Critical 未修 | team 完成 Phase 7 后仍有 Critical,且用户在 team 内选了"接受失败"或修复 2 轮仍失败 |
629
- | 依赖断裂 | 当前 phase 的 `Depends on` 中有 phase 状态为 failed/skipped |
630
- | 灰区接受 | team 在某阶段产出灰区决策(多个合理选项无单一最优解),且未运行 `--interactive` 模式 |
631
- | 测试不可恢复地失败 | Phase 5 测试报告显示核心断言失败且 Phase 7 修复无效 |
632
- | API 配额耗尽 | codeagent-wrapper 多次返回 quota/rate limit 错误 |
633
- | 跨 phase 依赖文件被覆写 | Phase N 修改了 Phase N-1 的产出文件(罕见,靠 team-exec 的文件隔离基本可避免) |
634
- | 用户显式中断 | 用户在主对话发 stop / pause / 取消 |
635
-
636
- ---
637
-
638
- ## 状态文件 `.ccg/roadmap.md` 格式
639
-
640
- autonomous 是 **roadmap.md 的唯一写者**。team-exec 不动它。
641
-
642
- ```markdown
643
- # CCG Project Roadmap
644
-
645
- **Project**: user-auth-system
646
- **Started**: 2026-05-01
647
- **Last Updated**: 2026-05-03 14:30
648
-
649
- ## Phase 1: 数据库 schema 设计 (completed)
650
- - **Goal**: 为 users / sessions / oauth_accounts 设计 schema 与迁移脚本
651
- - **Depends on**: (none)
652
- - **Started**: 2026-05-01 09:00 | **Completed**: 2026-05-01 11:20
653
- - **Plan**: .claude/team-plan/db-schema-20260501-0900/
654
- - **Outcome**: prisma schema 完成,3 张表 + 7 个索引,迁移脚本通过 dry-run
655
-
656
- ## Phase 2: 实现 user API (in_progress)
657
- - **Goal**: 实现 register / login / refresh token / logout 四个 endpoint
658
- - **Depends on**: Phase 1
659
- - **Started**: 2026-05-03 10:00
660
- - **Plan**: .claude/team-plan/user-api-20260503-1000/
661
-
662
- ## Phase 3: 前端登录页 (pending)
663
- - **Goal**: 登录页 + 注册页 + 表单校验 + 错误态
664
- - **Depends on**: Phase 2
665
-
666
- ## Phase 4: SSO 集成 (opsx://add-google-sso)
667
- - **Goal**: 接入 Google OAuth 2.0
668
- - **Depends on**: Phase 3
669
- - **Note**: 走 OpenSpec 路径,autonomous 调 /ccg:spec-impl
670
- ```
671
-
672
- **字段约定**:
673
- - 状态括号在标题尾部:`(pending|in_progress|completed|failed|skipped)`
674
- - `Depends on` 缺省值为 `(none)`
675
- - `Plan` 字段指向该 phase 内 team 产出的 plan 目录
676
- - `Outcome` 一句话总结,便于下次回顾
677
- - `opsx://<change-id>` 标记走 OpenSpec 路径
678
- - `Quality: fast|triple|debate`(**v4.2 P22 新增,可选**):单 phase 覆盖全局 `--quality` flag。例:
679
- ```markdown
680
- ## Phase 22: schema migration (pending)
681
- - **Goal**: 数据库 schema 破坏性变更
682
- - **Quality**: debate ← 这步用最高档(多轮对辩)
683
- - **Depends on**: Phase 21
684
- ```
685
- 缺省时遵循全局 flag,全局也无时默认 `triple`。详见 Step 4.0a。
686
-
687
- ---
688
-
689
- ## 状态文件 `.ccg/state.md` 跨 phase 扩展
690
-
691
- `.ccg/state.md` 由 team-exec 写、记录 wave 任务进度。autonomous 不重写它,但**容许它带 phase 维度**:每个 phase 启动 team 时,team-exec 在 state.md 顶部加一节:
692
-
693
- ```markdown
694
- # CCG Team Execution State
695
-
696
- **Plan**: .claude/team-plan/user-api-20260503-1000.md
697
- **Phase**: 2 / 4 (user-auth-system roadmap)
698
- **Team**: user-api-team
699
- **Started**: 2026-05-03 10:00
700
- ...
701
-
702
- ## Wave 1 (completed)
703
- - [x] T1: ...
704
- ```
705
-
706
- 新增的 `**Phase**:` 行让用户从 state.md 一眼看出当前在 milestone 的哪一步;这是约定,不强制——老 team-exec 不写 Phase 行也兼容。
707
-
708
- **写入时机分工**:
709
-
710
- | 文件 | 写入者 | 写入时机 |
711
- |------|--------|---------|
712
- | `.ccg/roadmap.md` | autonomous | 每个 phase 进入 in_progress / completed / failed / skipped 时 |
713
- | `.ccg/state.md` | team-exec | 每个 wave 结束时(与 W2c 行为完全一致) |
714
- | `.claude/team-plan/<task>-*.md` | team 各阶段 teammate | PRD / 蓝图 / 计划 / 报告产出时 |
715
-
716
- ---
717
-
718
- ## 退出报告格式
719
-
720
- EXEC_QUEUE 全部跑完后(无论全成功还是含失败/跳过),输出 milestone 收尾报告到主对话,**并将精简版追加到 `.ccg/roadmap.md` 末尾的 `## Milestone Summary` 节**。
721
-
722
- ```markdown
723
- # 🏁 Milestone Summary: <project name>
724
-
725
- **Started**: 2026-05-01 09:00
726
- **Ended**: 2026-05-03 18:42
727
- **Total Phases**: 4
728
- **Mode**: auto
729
-
730
- ## 执行结果
731
- | Phase | 名称 | 状态 | 耗时 | 产物 |
732
- |-------|------|------|------|------|
733
- | 1 | 数据库 schema | ✅ completed | 2h20 | prisma/schema.prisma + 3 迁移 |
734
- | 2 | user API | ✅ completed | 3h15 | src/api/auth/* (8 文件) |
735
- | 3 | 前端登录页 | ⚠️ completed (1 Critical 接受) | 4h10 | src/pages/Login.tsx + Signup.tsx |
736
- | 4 | SSO 集成 | ❌ failed | 1h30 | (无完整产出) |
737
-
738
- ## 经验提炼
739
- - Phase 2 的 token 刷新机制设计值得复用到 Phase 4(被忽略)
740
- - Phase 3 灰区:表单校验位置(前端/后端/双端),用户选了双端
741
- - Phase 4 失败原因:Google OAuth callback URL 配置缺失,需 IT 协助
742
-
743
- ## 未解决项
744
- - [Critical-3.2] Login 表单未做 rate limit(接受到下一 milestone)
745
- - [Failure-4] Google SSO 集成阻塞,等 IT 提供 client_id
746
-
747
- ## 推荐下一步
748
- 1. 处理 Phase 4 阻塞后重跑:`/ccg:autonomous --only 4`
749
- 2. 创建新 milestone 处理 rate limit 项
750
- 3. 提交 Phase 1-3 产出:`/ccg:commit`
751
-
752
- ## 产出物索引
753
- - PRD: .claude/team-plan/*-prd.md (4 份)
754
- - 蓝图: .claude/team-plan/*-blueprint.md (4 份)
755
- - 计划: .claude/team-plan/*-plan.md (4 份)
756
- - 报告: .claude/team-plan/*-report.md (4 份)
757
- - 代码变更: 见各 report 的"变更摘要"节
758
- ```
759
-
760
- ---
761
-
762
- ## 与 OpenSpec 协同
763
-
764
- 如果项目使用 OpenSpec,roadmap.md 的 phase 可以引用 OPSX proposal id:
765
-
766
- ```markdown
767
- ## Phase 4: SSO 集成 (opsx://add-google-sso)
768
- - **Goal**: 接入 Google OAuth 2.0
769
- - **Depends on**: Phase 3
770
- ```
771
-
772
- autonomous 检测到 `opsx://` 前缀时:
773
- - 不调 `/ccg:team`,改调 `/ccg:spec-impl <change-id>`
774
- - 由 spec-impl 负责完整的 Plan → Impl → Review → Archive 流程
775
- - spec-impl 完成后写入 OpenSpec 的归档目录,autonomous 仍在 roadmap.md 写 `completed` + `Plan: openspec/archive/<change-id>/`
776
- - Critical 处理与失败暂停逻辑与普通 phase 一致
777
-
778
- 混合 milestone(有 phase 走 team、有 phase 走 spec-impl)受支持,autonomous 按 phase 标题里有无 `opsx://` 自动路由。
779
-
780
- ---
781
-
782
- ## Exit Criteria
783
-
784
- - [ ] `.ccg/roadmap.md` 已存在且解析无误
785
- - [ ] EXEC_QUEUE 中所有 phase 已尝试执行(completed / failed / skipped 状态明确)
786
- - [ ] 每个 phase 都通过 `/ccg:team` 或 `/ccg:spec-impl` 间接执行,autonomous 自身未直接 spawn Architect/Dev/QA/Reviewer
787
- - [ ] roadmap.md 反映最终各 phase 状态
788
- - [ ] 发生 blocker 时已通过 `AskUserQuestion` 暂停并记录用户决策
789
- - [ ] Milestone Summary 已输出到主对话并追加到 roadmap.md
790
- - [ ] 所有 team / state.md 由各 phase 内的 team-exec 自行清理,autonomous 不越权
791
-
792
- <!-- CCG:AUTONOMOUS:END -->
1
+ ---
2
+ name: ccg:autonomous
3
+ description: 跨 phase 自治长跑:roadmap → wave 并行(默认)spawn phase-runner,仅 blocker 暂停
4
+ argument-hint: "[--from N] [--to N] [--only N] [--quality=fast|triple|debate] [--interactive] [--offload] [--sequential] [--max-concurrent N]"
5
+ context_budget: orchestrator-15
6
+ subagent_freshness: required
7
+ allowed-tools:
8
+ - Read
9
+ - Write
10
+ - Edit
11
+ - Bash
12
+ - Glob
13
+ - Grep
14
+ - AskUserQuestion
15
+ - Task
16
+ - Agent
17
+ - TodoWrite
18
+ ---
19
+ <!-- CCG:AUTONOMOUS:START -->
20
+
21
+ # Autonomous - 跨 Phase 自治长跑
22
+
23
+ ## 职能定位
24
+
25
+ `/ccg:autonomous` 是**编排层之上的编排层**:读 `.ccg/roadmap.md` 一次性跑完整个 milestone 的所有 phase,每个 phase 内部委托给 `/ccg:team`(或 `/ccg:spec-impl`)完成 8 阶段流程,仅在 blocker / 灰区接受 / 用户决策点暂停。
26
+
27
+ > **v4.1 调度模型变更**:默认行为从 v4.0 的"逐 phase 顺序串行"升级为 **wave 并行**。
28
+ > autonomous 用 Kahn 拓扑排序把 EXEC_QUEUE 划分成 wave,wave 内 phase 一次性并行
29
+ > spawn `Agent(phase-runner)`(max-concurrent 默认 4),wave 之间顺序执行——这与
30
+ > v3.0 起的 `team-exec` wave 调度心智模型对齐,墙钟时间通常压缩 30-40%。
31
+ > v4.0 的串行行为通过 `--sequential` flag 保留作为调试 / API 限额场景的降级路径。
32
+
33
+ **与 `/ccg:team` 的边界**:
34
+
35
+ | 维度 | `/ccg:team` | `/ccg:autonomous` |
36
+ |------|-------------|-------------------|
37
+ | 范围 | 单个任务的 8 阶段全流程 | 多个 phase 顺序串联 |
38
+ | 调用对象 | 直接 spawn Architect / Dev / QA / Reviewer | 调用 `/ccg:team` 或 `/ccg:spec-impl` |
39
+ | 状态文件 | `.ccg/state.md`(任务 wave 维度) | `.ccg/roadmap.md`(phase 维度) |
40
+ | 暂停条件 | Critical 未修、Phase 6 之后用户确认 | blocker / 灰区 / 跨 phase 依赖断裂 |
41
+ | 适合 | 一次性完整开发任务 | 长程 milestone(重构、迁移、多阶段功能) |
42
+
43
+ 简言之:autonomous 写 `.ccg/roadmap.md`(phase 进度),team-exec 写 `.ccg/state.md`(wave 任务进度),两份文件分工明确互不交叉。
44
+
45
+ ---
46
+
47
+ ## 触发场景
48
+
49
+ **适合**:
50
+ - 长程重构(如 monolith → 微服务,分 5 phase 拆分)
51
+ - 多阶段功能开发(认证体系:先后端 schema → API → 前端登录页 → SSO 集成)
52
+ - 迁移项目(React 16 → 18、CommonJS → ESM、Jest → Vitest)
53
+ - 周末/夜间无人值守跑长链路任务
54
+ - 已有清晰 roadmap、各 phase 间依赖明确的项目
55
+
56
+ **不适合**:
57
+ - 一次性任务(直接用 `/ccg:team`)
58
+ - 紧急修复(直接用 `/ccg:debug`)
59
+ - 探索性需求未定型(先 `/ccg:spec-research`)
60
+ - 单 phase 内的并行实施(用 `/ccg:team-exec`)
61
+
62
+ ---
63
+
64
+ ## 前置条件
65
+
66
+ 1. **`.ccg/roadmap.md` 必须存在**。若不存在,autonomous 第一步引导用户创建(见 Step 1)。
67
+ 2. **Agent Teams 已启用**(`CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1`),因为内部要调 `/ccg:team`。
68
+ 3. **WORKDIR**:通过 Bash `pwd`(Unix)或 `cd`(Windows)获取当前工作目录绝对路径,禁止从 `$HOME` 推断。
69
+
70
+ ---
71
+
72
+ ## 工作流程
73
+
74
+ ### Step 1: Roadmap 解析与初始化
75
+
76
+ 1. 通过 Bash 执行 `pwd` 获取 WORKDIR。
77
+ 2. Read `<WORKDIR>/.ccg/roadmap.md`:
78
+ - **存在** → 解析所有 `## Phase N: <name> (<status>)` 标题,抽出 `goal` / `depends on` / `started` / `completed` / `outcome` 字段。
79
+ - **不存在** → 用 `AskUserQuestion` 询问用户:
80
+ ```
81
+ 未发现 .ccg/roadmap.md。autonomous 需要 roadmap 列出所有 phase。请选择:
82
+ 1. 我来口述 milestone 拆分,由你生成 roadmap.md
83
+ 2. 我自己写好 roadmap.md 后再跑 /ccg:autonomous
84
+ 3. 跑 /ccg:spec-research <需求> 自动生成 roadmap.md 草案
85
+ ```
86
+ - 选项 1 → 通过对话补全所有 phase,写入 roadmap.md,请用户确认后继续。
87
+ - 选项 2/3 → 终止当前调用。
88
+
89
+ 3. **解析校验**:
90
+ - 每个 phase 必须有唯一序号(Phase 1、Phase 2、...)
91
+ - `Depends on` 引用的 phase 序号必须存在
92
+ - 状态值合法:`pending` / `in_progress` / `completed` / `failed` / `skipped`
93
+ - 任一不合法 → 终止,列出问题清单要求用户修正
94
+
95
+ ### Step 2: 应用 flag 过滤
96
+
97
+ 按以下优先级生成执行队列 `EXEC_QUEUE`:
98
+
99
+ | 场景 | 行为 |
100
+ |------|------|
101
+ | `--only N` 提供 | `EXEC_QUEUE = [Phase N]`,其余全跳过 |
102
+ | `--from N` 提供 | 从 Phase N 开始,含 N |
103
+ | `--to N` 提供 | 跑到 Phase N 结束,含 N,不推进 N+1 |
104
+ | 都未提供 | 从第一个非 `completed` phase 开始,跑到末尾 |
105
+ | 同时给 `--only` 和 `--from`/`--to` | `--only` 优先,其余忽略并提示 |
106
+ | `--interactive` | 每个 phase 内的 plan 阶段保留与用户问答(不自动判定灰区) |
107
+ | `--offload` | **重型 phase 自动外包给 codex plugin**(fresh context + 后台 + 主线只 poll status),默认开启自动判定,flag 显式时强制开启 |
108
+ | `--sequential` | **降级为 v4.0 行为**:禁用 wave 并行,单 phase 一波顺序串跑。调试 / API 限额场景使用 |
109
+ | `--max-concurrent N` | 单 wave 内最大并发 phase 数,默认 4。`--max-concurrent 1` 等价 `--sequential` |
110
+ | `--quality=fast\|triple\|debate` | **v4.2 P22 旗舰**:单 phase 内的质量档分级。`fast`=v4.1 单波 + 1 路 verify;`triple`=Plan-Critic-Verify 4 wave(**默认**);`debate`=triple + codex↔gemini 多轮对辩。详见 Step 4.0 |
111
+ | `--nested=on\|off` | **v4.5 P1f**:phase-runner 是否启用 nested rescue 委派(CLI 子进程内 spawn `codex:codex-rescue` / `gemini:gemini-rescue` 委派代码改动)。默认 `off` 保守。phase frontmatter `nested_rescue: true\|false` 优先级更高。详见 Step 4.0c |
112
+
113
+ 附加规则:
114
+ - 状态已是 `completed` 的 phase 默认跳过(除非 `--only N` 强制重跑)
115
+ - 状态为 `failed` 的 phase 进入队列时询问用户:重跑 / 跳过 / 终止
116
+ - `EXEC_QUEUE` 为空 → 输出"所有 phase 已完成 ✅"并退出
117
+
118
+ ### Step 3: 用户确认
119
+
120
+ 用 `AskUserQuestion` 展示执行计划:
121
+
122
+ ```
123
+ 🛣 即将自治执行 Milestone: <project name>
124
+
125
+ 执行队列(共 N phase):
126
+ - Phase 2: 实现 user API(依赖 Phase 1 ✅)
127
+ - Phase 3: 前端登录页(依赖 Phase 2)
128
+ - Phase 4: SSO 集成(依赖 Phase 3)
129
+
130
+ 预计调用:
131
+ - /ccg:team × 3(每个 phase 一次完整 8 阶段)
132
+ - 暂停条件:Critical 未修 / 用户决策点 / 跨 phase 依赖断裂
133
+
134
+ 模式:<auto | interactive>
135
+
136
+ 确认开始?
137
+ ```
138
+
139
+ `--interactive` 模式下,每个 phase 的 plan 阶段保留与用户问答(不自动判定灰区),其余阶段照常自治。
140
+
141
+ ### Step 4: Phase 主循环(v4.1 wave 并行 + v4.2 P22 质量档分级)
142
+
143
+ #### 4.0 Ground-Truth 采样(v4.3 P26 / v4.4 P32 集成)
144
+
145
+ **进入主循环前**,主线必须采样真实外部接口状态,写入 `.context/ground-truth/<ISO timestamp>.json` + 软链 `latest.json`。
146
+ phase-runner 的 prompt 强约束 "写涉及 plugin subagent_type / hook event / settings.json schema / skill 名 等代码前必须 Read latest.json",避免 v4.2.0 `codex:codex-rescue` 同型猜接口事故重演。
147
+
148
+ **主线动作**(伪码):
149
+
150
+ ```js
151
+ import { sampleAll, summarizeGroundTruth } from 'src/utils/ground-truth-sampler'
152
+
153
+ const gt = sampleAll({ workdir: process.cwd() })
154
+ const ts = gt.sampledAt.replace(/[:.]/g, '-') // 文件名安全
155
+ const dir = '.context/ground-truth'
156
+
157
+ mkdirSync(dir, { recursive: true })
158
+ writeFileSync(`${dir}/${ts}.json`, JSON.stringify(gt, null, 2))
159
+
160
+ // 软链 latest.json(POSIX symlinkSync;Windows 退化为复制写入)
161
+ try { unlinkSync(`${dir}/latest.json`) } catch {}
162
+ try { symlinkSync(`${ts}.json`, `${dir}/latest.json`) }
163
+ catch { writeFileSync(`${dir}/latest.json`, JSON.stringify(gt, null, 2)) }
164
+
165
+ console.log(summarizeGroundTruth(gt)) // ≤500 token brief 写入主线对话以便 phase-runner 拷贝
166
+ ```
167
+
168
+ **容错**:若采样抛错,主线打印警告但**不阻塞推进**——单 phase 仍可工作(degraded:phase-runner prompt 走"无 ground truth"分支,凭 spec 文档猜,恢复至 v4.2 行为)。
169
+
170
+ **phase-runner 注入路径**:每次 spawn phase-runner 时,主线在 prompt 里加一行 `ground_truth_path: <workdir>/.context/ground-truth/latest.json`,并要求子 agent 在动外部接口代码前必须 Read 该文件。
171
+
172
+ #### 4.0a 质量档解析(v4.2 P22 新增,单 phase 内调度)
173
+
174
+ 每个 phase 进入主循环前,主线先确定**该 phase 内部使用什么质量档**——这决定单个 phase 的 wave 编排(不是整个 milestone 的 wave 拓扑,那是 4.0b)。
175
+
176
+ **优先级(高 → 低)**:
177
+
178
+ 1. **phase frontmatter `Quality:` 字段**(roadmap.md 单 phase 覆盖全局 flag)
179
+ ```markdown
180
+ ## Phase 22: schema migration (pending)
181
+ - **Goal**: ...
182
+ - **Quality**: debate ← phase 自带,优先级最高
183
+ ```
184
+ 2. `--quality=<tier>` CLI flag(autonomous 命令行参数)
185
+ 3. 默认 `triple`(**v4.2 行为变化**:v4.1 默认是单波 phase-runner = `fast`)
186
+
187
+ 主线引用 `src/utils/quality-router.ts` 的 `buildQualityPlan()` helper(实际逻辑已落地为单元测试覆盖;本模板只描述 LLM 主线该做什么):
188
+
189
+ ```
190
+ qualityPlan = buildQualityPlan(
191
+ { cliArgs: <user args>, phaseQuality: <从 frontmatter 读> },
192
+ { phaseId, phaseType, quality, workdir, jobId, nestedRescue: <从 frontmatter 读> },
193
+ pluginAvailability,
194
+ {
195
+ useDirectBashInvocation: true, # ⛔ v4.5 P1a 强制 ON
196
+ useLauncherWiring: true, # ⛔ v4.5 P1f 强制 ON(解锁 supervisor 全部能力)
197
+ },
198
+ )
199
+ // qualityPlan.tier → 'fast' | 'triple' | 'debate'
200
+ // qualityPlan.waves → WavePlan[] (kind ∈ plan|critic|impl|verify|debate)
201
+ // qualityPlan.degraded / degradedTo → plugin 缺失自动降阶
202
+ ```
203
+
204
+ **⛔ v4.5 P1a 强约束(impl wave Bash 直调)**:
205
+
206
+ `useDirectBashInvocation: true` 时 impl wave 的 phase-runner spawn 会标
207
+ `invocationMode: 'bash-direct'` + 附 `bashCommand`,主线**必须用 Bash 工具**执行
208
+ 该命令(启 OS-level `claude -p --agent ccg/phase-runner` 子进程),**不可**走
209
+ `Agent(subagent_type="phase-runner")` 主进程 sidechain。
210
+
211
+ 理由:v4.4.x dogfood 实测主进程 RSS 7.5h 累积 23GB 把 VM 弄崩,根因是 Agent
212
+ sidechain transcript 留在主进程内存。Bash 子进程的 RSS 与主进程隔离,phase
213
+ 结束后内存全部回收。详见 `.ccg/v4.5-roadmap.md` P1a。
214
+
215
+ **三档对照(dogfood + SOTA 实测预算)**:
216
+
217
+ | 档 | wave 序列 | 壁钟膨胀 | token 膨胀 | 质量档(dogfood 估测) |
218
+ |----|----------|---------|-----------|----------------------|
219
+ | `fast` | impl → verify | +30% | +20% | 6.5/10 → 7.5/10 |
220
+ | `triple` | plan → critic → impl → verify | +60-90% | +80% | →8.5/10 |
221
+ | `debate` | plan → debate×3 → critic → impl → verify | +100-150% | +150% | →9/10 |
222
+
223
+ **降级路径**(plugin 缺失自动):
224
+
225
+ | 用户请求 | plugin 状态 | 实际执行 |
226
+ |---------|------------|---------|
227
+ | `debate` | 双 plugin 都缺 | → `fast`(debate/triple 失去对辩多样性) |
228
+ | `debate` | 单 plugin 缺 | → `triple` |
229
+ | `triple` | 双 plugin 都缺 | → `fast` |
230
+ | `triple` | 单 plugin 缺 | 不降阶,但缺失方向走 `general-purpose` + CCG prompt 模板 |
231
+ | `fast` | 双 plugin 都缺 | 主线 reviewer fallback(main-thread Claude 自审) |
232
+
233
+ 降级时主线在 roadmap.md 该 phase 标 `Note: quality degraded from <X> to <Y> — <reason>`。
234
+
235
+ **设计哲学(基于市面 SOTA Plan-Critic-Verify 实测)**:
236
+
237
+ - **Plan 阶段 lateral diversity**(codex+gemini+claude 3 路并行)—— 不同视角生成不同侧重点
238
+ - **Critic 阶段 angle-based**(assumptions-analyzer + nyquist-auditor)—— 不是按模型而是按"审视角度"分工
239
+ - **Implementer 单 strong model**(phase-runner 全权 Bash)—— 一致性 > 多样性,避免多 implementer 的 merge 痛苦
240
+ - **Verify cross-vendor**(codex + gemini)—— 抓 race condition / commit drift / 半成品状态
241
+
242
+ #### 4.0c Nested rescue 解析(v4.5 P1f opt-in)
243
+
244
+ 每个 phase 进入主循环前,主线确定 phase-runner CLI 子进程内是否启用 **nested rescue 委派**——即在 CLI 子进程内 spawn `Agent(codex:codex-rescue)` / `Agent(gemini:gemini-rescue)` 委派代码改动。
245
+
246
+ **优先级(高 → 低)**:
247
+
248
+ 1. **phase frontmatter `nested_rescue: true|false`**(roadmap.md 单 phase 覆盖)
249
+ ```markdown
250
+ ## Phase 6: nested-G-plan-wiring (in_progress)
251
+ - **Goal**: ...
252
+ - **nested_rescue**: true ← phase 自带,优先级最高
253
+ ```
254
+ 2. `--nested=on|off` CLI flag(autonomous 命令行参数)
255
+ 3. 默认 `false`(保守:与 v4.5 v1 保守路线 100% 等价)
256
+
257
+ 主线引用 `src/utils/quality-router.ts` 的 `resolveNestedRescue()` helper:
258
+
259
+ ```
260
+ nested = resolveNestedRescue({
261
+ cliArgs: <user args>,
262
+ phaseNestedRescue: <从 frontmatter 读,可空>,
263
+ })
264
+ // nested.enabled → true | false
265
+ // nested.source → 'phase-override' | 'cli-flag' | 'default'
266
+ ```
267
+
268
+ **phase-runner prompt 注入**:spawn phase-runner 时主线在 prompt 里加:
269
+
270
+ ```yaml
271
+ nested_rescue: <true | false>
272
+ job_id: <主线 launcher 分配> # phase-runner 需 Read .context/jobs/<job_id>/degraded.flag
273
+ ```
274
+
275
+ phase-runner 按 `nested_rescue` 字段切换实施路径(详见 `~/.claude/agents/ccg/phase-runner.md` "Nested rescue delegation" 段):
276
+ - `false` → 自实施(v4.0/v4.4 行为)
277
+ - `true` → 按 phase_type 路由 spawn rescue plugin;CAP=3;监听 `degraded.flag`
278
+
279
+ **默认 `--nested=off` 行为不变**——与 v4.5 v1 单波 phase-runner 自实施 100% 等价。
280
+
281
+ #### 4.0b 拓扑分波(Kahn 算法)
282
+
283
+ **默认行为**:把 `EXEC_QUEUE` 按 `Depends on` 字段构建有向无环图,Kahn 拓扑排序分波——
284
+ 没有未满足依赖的 phase 进 wave 1,依赖 wave 1 的进 wave 2,依次类推。同 wave 的 phase
285
+ 之间无依赖关系,可在主线一个 message 里并行 spawn 多个 `Agent(phase-runner)`,由 Claude
286
+ Code 引擎并发执行;不同 wave 之间顺序执行。
287
+
288
+ 主线引用 `src/utils/wave-scheduler.ts` 的 `parseRoadmap` + `schedule` helper(实际算法
289
+ 已落地为单元测试覆盖,本模板只描述 LLM 主线该做什么):
290
+
291
+ ```
292
+ phases = parseRoadmap(roadmap.md content)
293
+ waves, skipped, batches = schedule(phases, {
294
+ maxConcurrent: <user --max-concurrent N or 4>,
295
+ skipCompleted: true,
296
+ })
297
+ ```
298
+
299
+ **`--sequential` 降级**:等价 `maxConcurrent = 1`,每 phase 单独成一批,顺序执行。
300
+ 调试 / 复现历史 v4.0 行为 / API 限额场景使用。
301
+
302
+ **Cascade skip**:若某 phase 状态为 `failed` 或 `skipped`,所有(直接 / 间接)
303
+ 依赖它的 phase 自动标 `skipped`,从 EXEC_QUEUE 移除并在 roadmap.md 写
304
+ `skipped (cascade from Phase X)`,不进入任何 wave。这避免了下游 phase 在
305
+ 依赖断裂时仍尝试 spawn phase-runner 浪费 token。
306
+
307
+ **用户确认**:进入 Step 4.1 前 `AskUserQuestion` 展示 wave 划分:
308
+
309
+ ```
310
+ 🌊 Wave 划分(共 W wave):
311
+ Wave 1: Phase 1, 3, 4, 7, 8, 10, 11 ← 并行 spawn 7 phase-runner(max-concurrent=4 → 分 2 批)
312
+ Wave 2: Phase 2, 5, 6 ← 等 Wave 1 完成
313
+ Wave 3: Phase 9 ← 等 Wave 2 完成
314
+ Wave 4: Phase 12 ← 等 Wave 3 完成
315
+
316
+ 预计墙钟压缩:~35% vs 顺序执行
317
+ 模式:parallel | sequential
318
+ ```
319
+
320
+ #### 4.1 准备 phase(按 wave 迭代 + 单 phase 质量档子 wave)
321
+
322
+ **两层 wave 概念**(v4.2 P22 起):
323
+
324
+ - **外层 wave**(4.0b 拓扑):milestone 级别,按 phase 间 Depends on 关系分波,wave 内 phase 并行
325
+ - **内层 wave**(4.0a 质量档):单 phase 内部,按 fast/triple/debate 分 2/4/7 个子 wave,**子 wave 之间顺序执行**
326
+
327
+ 主循环结构(伪码):
328
+
329
+ ```
330
+ for outerWave in milestoneWaves:
331
+ batches = chunk(outerWave, max-concurrent) # 单 wave 拆批
332
+ for batch in batches:
333
+ # 每个 phase 独立按其质量档跑内层 wave
334
+ results = spawn_parallel(batch, lambda phase:
335
+ runPhaseWithQualityPlan(phase, buildQualityPlan(...)))
336
+ # 整 wave 完成后批量更新 roadmap.md,处理 cascade
337
+ update_roadmap_for_wave(outerWave, results)
338
+
339
+ # 单 phase 内层 wave 处理(fast/triple/debate 共用骨架):
340
+ runPhaseWithQualityPlan(phase, plan):
341
+ designBrief = null
342
+ verifyFindings = null
343
+ for innerWave in plan.waves:
344
+ switch innerWave.kind:
345
+ case 'plan': # 仅 triple/debate
346
+ contributions = spawn_parallel(innerWave.spawns) # 3 路并行
347
+ designBrief = aggregatePlans(contributions)
348
+ case 'critic': # 仅 triple/debate
349
+ criticReports = spawn_parallel(innerWave.spawns)
350
+ if any critical → mark phase requiring revise BEFORE impl
351
+ case 'debate': # 仅 debate(共 3 子 wave)
352
+ debateRound = spawn_parallel(innerWave.spawns)
353
+ # 复用 debate-orchestrator.shouldStop 提前收敛
354
+ case 'impl':
355
+ # spawn phase-runner,prompt 注入 design_brief / verify_findings
356
+ phaseSummary = spawn(phase-runner, prompt={
357
+ ...basePromptFields,
358
+ design_brief: serializeBriefForPrompt(designBrief),
359
+ verify_findings: verifyFindings,
360
+ })
361
+ case 'verify':
362
+ # P27: triple/debate verify wave 现在 3 路并行:
363
+ # - codex:codex-rescue — cross-vendor verify (race / commit drift)
364
+ # - gemini:gemini-rescue — cross-vendor verify (UX / 半成品)
365
+ # - interface-auditor — 跨 phase 接口审计(SSoT / leftover /
366
+ # magic-string vs ground truth /
367
+ # commit-diff drift / mock-drift)
368
+ # fast 模式不加 interface-auditor(fast 优先速度)。
369
+ #
370
+ # ⛔ v4.4.2 verify wave 强制 Bash 直调 plugin script:
371
+ # verifyWave = planVerifyWave(tier, layer, plugins,
372
+ # { useDirectBashInvocation: true })
373
+ # for each spawn entry where invocationMode === 'bash-direct':
374
+ # 主线用 Bash 工具跑 spawn.bashCommand(而非 Agent(subagent_type=...))。
375
+ # — 绕开 plugin sonnet wrapper,避免 broker 故障 / 空答时的
376
+ # silent contamination(sonnet 自答冒充 cross-vendor 视角)。
377
+ # — Bash exit≠0 OR stdout 字节<阈值 → 失败信号 loud,主线据此重试。
378
+ # interface-auditor 仍走 Agent(subagent_type="interface-auditor")
379
+ # —— CCG 自家 agent 无 sonnet wrapper 风险。
380
+ verifyReports = spawn_parallel(innerWave.spawns)
381
+ # 主线综合:原 verifier critical 任一 + interface-auditor critical
382
+ # 任一 → revise(synthesizeVerifyResults 已统一处理 STATUS/FINDINGS
383
+ # 协议;interface-auditor 摘要复用同 schema,无需特判)
384
+ decision = synthesizeVerifyResults(verifyReports)
385
+ if decision === 'revise' && retryCount < 1:
386
+ verifyFindings = synthesizeVerifyFeedback(verifyReports)
387
+ retry impl wave once
388
+ elif decision === 'escalate':
389
+ AskUserQuestion → blocker path
390
+ ```
391
+
392
+ **impl wave 的 phase-runner prompt 增量**(v4.2 P22):
393
+
394
+ triple/debate 模式 plan wave 完成后,主线把 `aggregatePlans` 输出经
395
+ `serializeBriefForPrompt()` 序列化(≤500 token)注入 phase-runner prompt 的
396
+ `design_brief` 字段(参考 `templates/commands/agents/phase-runner.md` 输入契约)。
397
+
398
+ verify wave 后若 decision='revise',主线再 spawn 一次 phase-runner,
399
+ `verify_findings` 字段填 `synthesizeVerifyFeedback()` 输出。
400
+ **修订仅一轮**(避免无限循环);二次失败标 `partial` 进 blocker。
401
+
402
+ 针对**每个**进入并发的 phase,spawn 前做:
403
+
404
+ - 在 `.ccg/roadmap.md` 中将该 phase 状态改为 `in_progress`,写入 `Started: <时间戳>`。
405
+ 整 wave 一次性写 roadmap(避免多次磁盘写穿透),用 batch update 模式。
406
+ - 用 TodoWrite 维护一个跨 phase 进度列表(每 phase 一项),便于用户随时看进度。
407
+ - 检查依赖:所有 `Depends on` 列出的 phase 必须为 `completed`(Step 4.0 已保证;
408
+ 这里是 belt-and-suspenders 校验)。失败进入 **blocker 路径**(Step 5)。
409
+
410
+ #### 4.2 路由:调 `/ccg:spec-impl` / `phase-runner` / `/ccg:team`
411
+
412
+ 按以下优先级判定(**前序匹配后短路**):
413
+
414
+ 1. **phase 标题含 `opsx://` 引用** → 走 OpenSpec 路径,调 `/ccg:spec-impl` 并传入 change_id
415
+ 2. **runner 模式 phase**(`--offload` flag 或 phase 标 `[offload]` tag 或满足重型自动触发)→ 用 `Bash(claude -p --agent ccg/phase-runner ...)` 启 OS-level 子进程(**v4.5 P1a**;详见下方"phase-runner 调用方式"),把 phase 完整定义 + Type 字段写到 prompt 文件传给子进程
416
+ 3. **默认** → 走 Agent Teams 路径,调 `/ccg:team <phase goal>`
417
+
418
+ ##### runner 模式判定(决定走第 2 路)
419
+
420
+ **显式触发**:
421
+ - `--offload` flag 提供(强制走 phase-runner,所有 phase 都走)
422
+ - 用户在 roadmap.md 里手动标 `[offload]` 或 `Mode: runner`(例 `## Phase 5: 命令收敛 [offload] (pending)`)
423
+
424
+ **自动触发**(满足任一即可):
425
+ - phase goal 含关键词:`重构 / 迁移 / 全量改 / refactor / migrate / rewrite`
426
+ - phase 预估涉及 > 20 个文件
427
+ - 上一个 phase 的 plan 文件 > 800 行
428
+
429
+ ##### phase-runner 调用方式(v4.5 P1a:Bash 直调 OS 子进程)
430
+
431
+ phase-runner 是 CCG v4.0 引入的**单 phase 全权代理 agent**——它按 phase Type
432
+ 字段决定工作风格,沙箱外补 git/test/typecheck handoff,最终返回主线 ≤200
433
+ token 摘要。详见 `~/.claude/agents/ccg/phase-runner.md`。
434
+
435
+ **v4.5 起 phase-runner 通过 OS-level subprocess 启动**(不再用 Agent sidechain)。
436
+ **v4.5.1 P1f 起经 launcher 包装**(解锁 Phase 2 supervisor 能力:atomic state /
437
+ process-tree kill-tree / cancel.flag 协作 / reconciler)。
438
+
439
+ 主线读 `qualityPlan.waves[i].spawns[0]`(impl wave)的 `bashCommand` 字段直接跑:
440
+
441
+ ```bash
442
+ # 1. 把 phase prompt 写到 .context/jobs/<job-id>/prompt.txt(主线先 Write)
443
+ # 2. 用 Bash run_in_background=true 启动 launcher 包装的子进程:
444
+ Bash(node '~/.claude/.ccg/scripts/ccg-phase-runner-launcher.mjs' \
445
+ --job-id '<job-id>' \
446
+ --workdir '<workdir>' \
447
+ --prompt-file '.context/jobs/<job-id>/prompt.txt' \
448
+ --tier '<fast|triple|debate>' \
449
+ --grace-ms 5000 \
450
+ > '.context/jobs/<job-id>/progress.jsonl' 2>&1)
451
+ # Launcher 内部包装 claude -p --agent ccg/phase-runner ... 并:
452
+ # - atomic 写 state.json (parent_pid, cli_pid, process_group_id, cwd, cmd, broker_tx_id)
453
+ # - POSIX setsid / Windows DETACHED_PROCESS(process tree 可 kill)
454
+ # - 监听 cancel.flag + grace + kill-tree
455
+ # - terminal status atomic 写
456
+ # 主线轮询 progress.jsonl(wc -l / tail),子进程结束后 parsePhaseRunnerStreamSummary
457
+ # 抽末行 result.result 字段拿 ≤200 token SUMMARY
458
+ ```
459
+
460
+ **裸 `claude -p` 路径**(旧 P1a,无 supervisor 包装)保留作 BC:仅 dev workflow / 单测覆盖。生产走 launcher(`useLauncherWiring: true`)。
461
+
462
+ prompt.txt 的内容(**v4.5 P1f 起**新增 `nested_rescue` + `job_id` 字段):
463
+
464
+ ```yaml
465
+ phase_id: phase-<N>-<slug>
466
+ phase_n: <N>
467
+ phase_name: <从 roadmap.md 标题提取>
468
+ phase_type: <backend | frontend | fullstack | docs | generic>
469
+ phase_goal: |
470
+ <Goal 段全文>
471
+ phase_acceptance: |
472
+ <Acceptance 段全文>
473
+ phase_depends_on: <已 completed 的 phase 列表 + 它们的产物路径>
474
+ workdir: <WORKDIR>
475
+ baseline_sha: <最近一次 baseline commit sha7>
476
+ report_path: .claude/team-plan/phase-<N>-<slug>-report.md
477
+ commit_prefix: feat(v4-p<N>):
478
+ enable_challenger: false
479
+ nested_rescue: <true | false> # v4.5 P1f:来自 4.0c resolveNestedRescue()
480
+ job_id: <主线 launcher 分配的 job-id> # v4.5 P1b:phase-runner 需 Read degraded.flag
481
+ ```
482
+
483
+ **为什么 Bash 直调**:v4.4.x dogfood 主进程 RSS 7.5h 累积 23GB 撞 VM 极限。
484
+ Agent sidechain 的 transcript 留主进程内存;OS 子进程则是独立 PID,phase 结束
485
+ 后内存全部回收。三层 OS 进程隔离(主线 / phase-runner / nested rescue)首次
486
+ 落地。详见 `.ccg/v4.5-roadmap.md` P1a + `.ccg/poc-v45/poc-results.md` T9。
487
+
488
+ **禁用** `Agent(subagent_type="phase-runner")` —— 已弃用。autonomous 主线**不得**
489
+ 回退到该路径(除非 P1f gate 失败显式降级,由 release notes 公示)。CLI 子进程内
490
+ phase-runner 内部 `Agent` 工具可用——CLI 模式与 sidechain 模式工具白名单不同
491
+ (PoC T9 实测);nested rescue 委派由此路径解锁。
492
+
493
+ **模型路由委派给 phase-runner**:autonomous 主线不再硬编码 codex/gemini,phase-runner 根据 prompt 里的 `phase_type` 字段决定 spawn `codex:codex-rescue` 还是 `gemini:gemini-rescue`。这修复了 v3.0 路由 bug(autonomous 绕过 `{{FRONTEND_PRIMARY}}/{{BACKEND_PRIMARY}}` 配置)。
494
+
495
+ **降级路径**:若 `Agent(phase-runner)` 调用失败(v3.0 旧版未装该 subagent),输出告警 + fallback 到第 3 路 `/ccg:team`,roadmap.md 备注 `Note: phase-runner unavailable, fell back to team`。
496
+
497
+ #### 4.3 监控 phase 内信号
498
+
499
+ **走 team / spec-impl 路径**(4.2 第 1/3 路):
500
+
501
+ - team 会在 `.ccg/state.md` 写 wave-level 任务进度(这是 team-exec 的职责,autonomous 不重写它)。
502
+ - team 完成后产出 `.claude/team-plan/<task-id>-report.md`。
503
+ - autonomous 读取该 report:
504
+ - **Phase 完成且 Critical = 0** → 进入 4.4 推进
505
+ - **Phase 完成但 Critical > 0**(用户在 team 内选了"接受失败") → 进入 **blocker 路径**
506
+ - **Phase 失败**(team 异常退出 / 测试不可恢复地失败) → 进入 **blocker 路径**
507
+
508
+ **走 phase-runner 路径**(4.2 第 2 路,v4.5 P1a Bash 直调 + P1f launcher wiring):
509
+
510
+ - 主线 `Bash(run_in_background=true)` 启动 `node ccg-phase-runner-launcher.mjs ...` 子进程后**不阻塞**继续做别的;用 `Bash(wc -l .context/jobs/<id>/progress.jsonl)` / `Bash(tail -n 5 ...)` 轮询观察进度(launcher 透传子进程 stdout 到 progress.jsonl)
511
+ - 子进程结束(exit code 写到 background job 状态)后主线读 `progress.jsonl` 末行,调 `parsePhaseRunnerStreamSummary()` helper 抽 `result.result` 字段拿 ≤200 token 摘要
512
+ - 主线**不读 transcript、不读 progress.jsonl 中间 stream-event**(仅观察 wc -l 行数 + 末行 result)
513
+ - 主线只读 phase-runner 返回的 ≤200 token 摘要:
514
+ ```
515
+ STATUS: completed | partial | failed | degraded
516
+ COMMIT: <sha7> | none
517
+ TESTS: <pass>/<total> passed (delta +<n>)
518
+ TYPECHECK: pass | fail
519
+ HANDOFF_TAKEN: [git_commit, test_run, ...]
520
+ CONTEXT_DELTA: <一句话>
521
+ NOTES: <一行关键发现 / 灰区决策点>
522
+ ```
523
+ - 摘要解析后路由:
524
+ - `STATUS: completed` → 进入 4.4 推进
525
+ - `STATUS: partial` → AskUserQuestion 暂停("重试 / 接受部分 / 跳过 / 终止")
526
+ - `STATUS: failed` → AskUserQuestion 暂停("重试 / 跳过 / 终止"),下游依赖 phase 自动 cascade 标 blocked
527
+ - `STATUS: degraded` → 警告但继续(rescue plugin 不可用但 phase-runner 已 fallback 完成)
528
+ - **心跳超时**:spawn phase-runner 后 30 分钟内无 completion 通知 → AskUserQuestion 提示"等 / 强制 fail / 重 spawn"
529
+ - runner 路径**不写** `.ccg/state.md`(state.md 是 team-exec 私域),只在 roadmap.md 该 phase 写 `Mode: runner` + `Plan: .claude/team-plan/<phase-id>-report.md`
530
+
531
+ **主线 context 不漂移的关键**:autonomous 主线只接 ≤200 token 摘要,phase-runner 子 agent 的 transcript(包括 codex/gemini rescue 报告全文)都在子 agent 的 fresh context 里,**不进主线**。这正是 GSD"主线 ≤15% / subagent fresh"原则的 Claude Code 原生实现。
532
+
533
+ #### 4.4 Phase 推进(wave 级批处理)
534
+
535
+ - **4.4.a Critical phase challenger 编排(v4.1 Phase 16)**:
536
+ 当 phase 摘要 `STATUS: completed` 时,主线先读 phase frontmatter `Critical:` 字段
537
+ (默认 `false`)。若 `Critical: true` 且**未进入修订轮**,主线**不立即推进**,
538
+ 改为 spawn 一组 challenger agents 做"双视角对辩 + 假设/边界审计":
539
+
540
+ 路由(由 `src/utils/challenger-orchestrator.ts` 的 `planChallengerSpawns` 决定,
541
+ 本模板只描述 LLM 该做什么):
542
+
543
+ | phase Type | spawn 计划(adversarial=true)|
544
+ |-----------|------------------------------|
545
+ | `backend` | `Agent(codex:codex-rescue)` + `Agent(assumptions-analyzer)` |
546
+ | `frontend` | `Agent(gemini:gemini-rescue)` + `Agent(nyquist-auditor)` |
547
+ | `fullstack`| `Agent(codex:codex-rescue)` + `Agent(gemini:gemini-rescue)` + `Agent(assumptions-analyzer)` + `Agent(nyquist-auditor)` |
548
+ | `docs`/`generic` | `Agent(assumptions-analyzer)` 单兵 |
549
+
550
+ **plugin 缺失降级**(acceptance d):installer 检测不到 `codex:codex-rescue` 或
551
+ `gemini:gemini-rescue` 命令时,主线只 spawn specialist(CCG 自家 agent,必装),
552
+ **不 fallback** 到 codeagent-wrapper(避免重新建立 v3.0 已退役的依赖)。
553
+ roadmap.md 备注 `Note: challenger degraded — plugin <name> missing`。
554
+
555
+ spawn 范式(一个 message 内并行):
556
+
557
+ ```
558
+ Agent({ subagent_type: "codex:codex-rescue",
559
+ description: "Phase <N> challenger (codex)",
560
+ prompt: <挑战 phase 改动 + 引用 phase-runner 的 commit sha7> })
561
+ Agent({ subagent_type: "assumptions-analyzer",
562
+ description: "Phase <N> assumption critic",
563
+ prompt: <审视 plan 假设、隐藏依赖、未验证前提> })
564
+ ```
565
+
566
+ challenger 摘要协议(每路 ≤200 token):
567
+
568
+ ```
569
+ STATUS: complete | error
570
+ FINDINGS: [{severity:critical|major|info, category:..., message:...}, ...]
571
+ NOTES: <≤80 字>
572
+ ```
573
+
574
+ 主线综合(由 `decideFromSummaries` helper 决定):
575
+
576
+ - **任一 critical finding** → spawn implementer phase-runner **修订一轮**,
577
+ prompt 里嵌入 `synthesizeRevisionFeedback()` 输出的 critical 反馈块,
578
+ 要求"仅修复 critical 项,不重做整个 phase"。修订仅一轮(避免无限循环);
579
+ 第二轮失败标 `partial` 进 blocker 路径。
580
+ - **无 critical** → 推进(与非 Critical phase 路径合流)。
581
+ - **任一 error** → AskUserQuestion 暂停("重试 challenger / 跳过 challenger 直接推进 / 终止")。
582
+
583
+ **跳过条件**:phase frontmatter `Critical: false`(或未声明)→ 跳过 4.4.a,
584
+ 直接进 4.4.b 状态写入。
585
+
586
+ - **4.4.b 状态写入**:单个 phase 完成时,在 `.ccg/roadmap.md` 中将该 phase 状态改为 `completed`,
587
+ 写入 `Completed: <时间戳>`、`Outcome: <一句话总结>`、`Plan: .claude/team-plan/<task-id>/`。
588
+ - 整 wave 完成(所有 batch 都返回)后做一次性 cascade 检查:
589
+ - 如果该 wave 内任意 phase status=failed/partial(用户选了"跳过"或"接受失败"),
590
+ 重跑 `cascadeSkip()` helper,把新增的 cascade-skipped phase 从后续 wave 移除,
591
+ 在 roadmap.md 写 `skipped (cascade from Phase X)`。
592
+ - 输出 wave 完成提示:
593
+ ```
594
+ 🌊 Wave 1/4 → completed (Phase 1, 3, 4, 7, 8, 10, 11 — 7 phase 并行)
595
+ → 推进 Wave 2/4 (Phase 2, 5, 6)
596
+ ```
597
+ - 进入下一 wave。
598
+
599
+ ### Step 5: Blocker 路径
600
+
601
+ 任何 blocker 都通过 `AskUserQuestion` 暂停,向用户报告:
602
+
603
+ ```markdown
604
+ ⚠️ Autonomous 暂停于 Phase 2
605
+
606
+ 原因: <Critical 未修 / 依赖 Phase 1 失败 / API 配额耗尽 / 用户决策点>
607
+
608
+ 详情:
609
+ <具体内容,含 team 的 report 摘要、错误日志、灰区描述>
610
+
611
+ 下一步:
612
+ 1. 重试本 phase(重新调 /ccg:team)
613
+ 2. 跳过本 phase(标记 skipped,下游依赖 phase 自动 skipped)
614
+ 3. 终止 autonomous(保留 roadmap.md 当前进度,下次可续跑)
615
+ 4. 我来手动处理(暂停 autonomous,用户处理后回复"继续")
616
+ ```
617
+
618
+ 用户选择决定后续行为;选 4 时 autonomous 进入挂起态,等用户回到主对话发"继续"信号后从断点恢复。
619
+
620
+ ---
621
+
622
+ ## 暂停条件 / Blocker 定义
623
+
624
+ 必须暂停的场景:
625
+
626
+ | 触发 | 描述 |
627
+ |------|------|
628
+ | Critical 未修 | team 完成 Phase 7 后仍有 Critical,且用户在 team 内选了"接受失败"或修复 2 轮仍失败 |
629
+ | 依赖断裂 | 当前 phase 的 `Depends on` 中有 phase 状态为 failed/skipped |
630
+ | 灰区接受 | team 在某阶段产出灰区决策(多个合理选项无单一最优解),且未运行 `--interactive` 模式 |
631
+ | 测试不可恢复地失败 | Phase 5 测试报告显示核心断言失败且 Phase 7 修复无效 |
632
+ | API 配额耗尽 | codeagent-wrapper 多次返回 quota/rate limit 错误 |
633
+ | 跨 phase 依赖文件被覆写 | Phase N 修改了 Phase N-1 的产出文件(罕见,靠 team-exec 的文件隔离基本可避免) |
634
+ | 用户显式中断 | 用户在主对话发 stop / pause / 取消 |
635
+
636
+ ---
637
+
638
+ ## 状态文件 `.ccg/roadmap.md` 格式
639
+
640
+ autonomous 是 **roadmap.md 的唯一写者**。team-exec 不动它。
641
+
642
+ ```markdown
643
+ # CCG Project Roadmap
644
+
645
+ **Project**: user-auth-system
646
+ **Started**: 2026-05-01
647
+ **Last Updated**: 2026-05-03 14:30
648
+
649
+ ## Phase 1: 数据库 schema 设计 (completed)
650
+ - **Goal**: 为 users / sessions / oauth_accounts 设计 schema 与迁移脚本
651
+ - **Depends on**: (none)
652
+ - **Started**: 2026-05-01 09:00 | **Completed**: 2026-05-01 11:20
653
+ - **Plan**: .claude/team-plan/db-schema-20260501-0900/
654
+ - **Outcome**: prisma schema 完成,3 张表 + 7 个索引,迁移脚本通过 dry-run
655
+
656
+ ## Phase 2: 实现 user API (in_progress)
657
+ - **Goal**: 实现 register / login / refresh token / logout 四个 endpoint
658
+ - **Depends on**: Phase 1
659
+ - **Started**: 2026-05-03 10:00
660
+ - **Plan**: .claude/team-plan/user-api-20260503-1000/
661
+
662
+ ## Phase 3: 前端登录页 (pending)
663
+ - **Goal**: 登录页 + 注册页 + 表单校验 + 错误态
664
+ - **Depends on**: Phase 2
665
+
666
+ ## Phase 4: SSO 集成 (opsx://add-google-sso)
667
+ - **Goal**: 接入 Google OAuth 2.0
668
+ - **Depends on**: Phase 3
669
+ - **Note**: 走 OpenSpec 路径,autonomous 调 /ccg:spec-impl
670
+ ```
671
+
672
+ **字段约定**:
673
+ - 状态括号在标题尾部:`(pending|in_progress|completed|failed|skipped)`
674
+ - `Depends on` 缺省值为 `(none)`
675
+ - `Plan` 字段指向该 phase 内 team 产出的 plan 目录
676
+ - `Outcome` 一句话总结,便于下次回顾
677
+ - `opsx://<change-id>` 标记走 OpenSpec 路径
678
+ - `Quality: fast|triple|debate`(**v4.2 P22 新增,可选**):单 phase 覆盖全局 `--quality` flag。例:
679
+ ```markdown
680
+ ## Phase 22: schema migration (pending)
681
+ - **Goal**: 数据库 schema 破坏性变更
682
+ - **Quality**: debate ← 这步用最高档(多轮对辩)
683
+ - **Depends on**: Phase 21
684
+ ```
685
+ 缺省时遵循全局 flag,全局也无时默认 `triple`。详见 Step 4.0a。
686
+
687
+ ---
688
+
689
+ ## 状态文件 `.ccg/state.md` 跨 phase 扩展
690
+
691
+ `.ccg/state.md` 由 team-exec 写、记录 wave 任务进度。autonomous 不重写它,但**容许它带 phase 维度**:每个 phase 启动 team 时,team-exec 在 state.md 顶部加一节:
692
+
693
+ ```markdown
694
+ # CCG Team Execution State
695
+
696
+ **Plan**: .claude/team-plan/user-api-20260503-1000.md
697
+ **Phase**: 2 / 4 (user-auth-system roadmap)
698
+ **Team**: user-api-team
699
+ **Started**: 2026-05-03 10:00
700
+ ...
701
+
702
+ ## Wave 1 (completed)
703
+ - [x] T1: ...
704
+ ```
705
+
706
+ 新增的 `**Phase**:` 行让用户从 state.md 一眼看出当前在 milestone 的哪一步;这是约定,不强制——老 team-exec 不写 Phase 行也兼容。
707
+
708
+ **写入时机分工**:
709
+
710
+ | 文件 | 写入者 | 写入时机 |
711
+ |------|--------|---------|
712
+ | `.ccg/roadmap.md` | autonomous | 每个 phase 进入 in_progress / completed / failed / skipped 时 |
713
+ | `.ccg/state.md` | team-exec | 每个 wave 结束时(与 W2c 行为完全一致) |
714
+ | `.claude/team-plan/<task>-*.md` | team 各阶段 teammate | PRD / 蓝图 / 计划 / 报告产出时 |
715
+
716
+ ---
717
+
718
+ ## 退出报告格式
719
+
720
+ EXEC_QUEUE 全部跑完后(无论全成功还是含失败/跳过),输出 milestone 收尾报告到主对话,**并将精简版追加到 `.ccg/roadmap.md` 末尾的 `## Milestone Summary` 节**。
721
+
722
+ ```markdown
723
+ # 🏁 Milestone Summary: <project name>
724
+
725
+ **Started**: 2026-05-01 09:00
726
+ **Ended**: 2026-05-03 18:42
727
+ **Total Phases**: 4
728
+ **Mode**: auto
729
+
730
+ ## 执行结果
731
+ | Phase | 名称 | 状态 | 耗时 | 产物 |
732
+ |-------|------|------|------|------|
733
+ | 1 | 数据库 schema | ✅ completed | 2h20 | prisma/schema.prisma + 3 迁移 |
734
+ | 2 | user API | ✅ completed | 3h15 | src/api/auth/* (8 文件) |
735
+ | 3 | 前端登录页 | ⚠️ completed (1 Critical 接受) | 4h10 | src/pages/Login.tsx + Signup.tsx |
736
+ | 4 | SSO 集成 | ❌ failed | 1h30 | (无完整产出) |
737
+
738
+ ## 经验提炼
739
+ - Phase 2 的 token 刷新机制设计值得复用到 Phase 4(被忽略)
740
+ - Phase 3 灰区:表单校验位置(前端/后端/双端),用户选了双端
741
+ - Phase 4 失败原因:Google OAuth callback URL 配置缺失,需 IT 协助
742
+
743
+ ## 未解决项
744
+ - [Critical-3.2] Login 表单未做 rate limit(接受到下一 milestone)
745
+ - [Failure-4] Google SSO 集成阻塞,等 IT 提供 client_id
746
+
747
+ ## 推荐下一步
748
+ 1. 处理 Phase 4 阻塞后重跑:`/ccg:autonomous --only 4`
749
+ 2. 创建新 milestone 处理 rate limit 项
750
+ 3. 提交 Phase 1-3 产出:`/ccg:commit`
751
+
752
+ ## 产出物索引
753
+ - PRD: .claude/team-plan/*-prd.md (4 份)
754
+ - 蓝图: .claude/team-plan/*-blueprint.md (4 份)
755
+ - 计划: .claude/team-plan/*-plan.md (4 份)
756
+ - 报告: .claude/team-plan/*-report.md (4 份)
757
+ - 代码变更: 见各 report 的"变更摘要"节
758
+ ```
759
+
760
+ ---
761
+
762
+ ## 与 OpenSpec 协同
763
+
764
+ 如果项目使用 OpenSpec,roadmap.md 的 phase 可以引用 OPSX proposal id:
765
+
766
+ ```markdown
767
+ ## Phase 4: SSO 集成 (opsx://add-google-sso)
768
+ - **Goal**: 接入 Google OAuth 2.0
769
+ - **Depends on**: Phase 3
770
+ ```
771
+
772
+ autonomous 检测到 `opsx://` 前缀时:
773
+ - 不调 `/ccg:team`,改调 `/ccg:spec-impl <change-id>`
774
+ - 由 spec-impl 负责完整的 Plan → Impl → Review → Archive 流程
775
+ - spec-impl 完成后写入 OpenSpec 的归档目录,autonomous 仍在 roadmap.md 写 `completed` + `Plan: openspec/archive/<change-id>/`
776
+ - Critical 处理与失败暂停逻辑与普通 phase 一致
777
+
778
+ 混合 milestone(有 phase 走 team、有 phase 走 spec-impl)受支持,autonomous 按 phase 标题里有无 `opsx://` 自动路由。
779
+
780
+ ---
781
+
782
+ ## Exit Criteria
783
+
784
+ - [ ] `.ccg/roadmap.md` 已存在且解析无误
785
+ - [ ] EXEC_QUEUE 中所有 phase 已尝试执行(completed / failed / skipped 状态明确)
786
+ - [ ] 每个 phase 都通过 `/ccg:team` 或 `/ccg:spec-impl` 间接执行,autonomous 自身未直接 spawn Architect/Dev/QA/Reviewer
787
+ - [ ] roadmap.md 反映最终各 phase 状态
788
+ - [ ] 发生 blocker 时已通过 `AskUserQuestion` 暂停并记录用户决策
789
+ - [ ] Milestone Summary 已输出到主对话并追加到 roadmap.md
790
+ - [ ] 所有 team / state.md 由各 phase 内的 team-exec 自行清理,autonomous 不越权
791
+
792
+ <!-- CCG:AUTONOMOUS:END -->