specops 0.2.4 → 0.3.0

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 (160) hide show
  1. package/.opencode/agent/specops-codebase-mapper.md +764 -0
  2. package/.opencode/agent/specops-debugger.md +1246 -0
  3. package/.opencode/agent/specops-executor.md +469 -0
  4. package/.opencode/agent/specops-integration-checker.md +443 -0
  5. package/.opencode/agent/specops-phase-researcher.md +547 -0
  6. package/.opencode/agent/specops-plan-checker.md +690 -0
  7. package/.opencode/agent/specops-planner.md +575 -0
  8. package/.opencode/agent/specops-project-researcher.md +354 -0
  9. package/.opencode/agent/specops-research-synthesizer.md +239 -0
  10. package/.opencode/agent/specops-roadmapper.md +642 -0
  11. package/.opencode/agent/specops-work-verifier.md +573 -0
  12. package/.opencode/references/checkpoints.md +776 -0
  13. package/.opencode/references/continuation-format.md +249 -0
  14. package/.opencode/references/decimal-phase-calculation.md +65 -0
  15. package/.opencode/references/git-integration.md +248 -0
  16. package/.opencode/references/git-planning-commit.md +38 -0
  17. package/.opencode/references/model-profile-resolution.md +34 -0
  18. package/.opencode/references/model-profiles.md +92 -0
  19. package/.opencode/references/phase-argument-parsing.md +61 -0
  20. package/.opencode/references/planning-config.md +196 -0
  21. package/.opencode/references/questioning.md +145 -0
  22. package/.opencode/references/tdd.md +263 -0
  23. package/.opencode/references/ui-brand.md +160 -0
  24. package/.opencode/references/verification-patterns.md +612 -0
  25. package/.opencode/skills/demand-analysis/SKILL.md +142 -10
  26. package/.opencode/templates/DEBUG.md +164 -0
  27. package/.opencode/templates/UAT.md +180 -0
  28. package/.opencode/templates/VALIDATION.md +76 -0
  29. package/.opencode/templates/codebase/architecture.md +255 -0
  30. package/.opencode/templates/codebase/concerns.md +310 -0
  31. package/.opencode/templates/codebase/conventions.md +307 -0
  32. package/.opencode/templates/codebase/integrations.md +280 -0
  33. package/.opencode/templates/codebase/stack.md +186 -0
  34. package/.opencode/templates/codebase/structure.md +285 -0
  35. package/.opencode/templates/codebase/testing.md +480 -0
  36. package/.opencode/templates/context.md +221 -0
  37. package/.opencode/templates/continue-here.md +78 -0
  38. package/.opencode/templates/debug-subagent-prompt.md +91 -0
  39. package/.opencode/templates/discovery.md +147 -0
  40. package/.opencode/templates/milestone-archive.md +123 -0
  41. package/.opencode/templates/milestone.md +115 -0
  42. package/.opencode/templates/phase-prompt.md +333 -0
  43. package/.opencode/templates/planner-subagent-prompt.md +117 -0
  44. package/.opencode/templates/project.md +184 -0
  45. package/.opencode/templates/requirements.md +130 -0
  46. package/.opencode/templates/research-project/ARCHITECTURE.md +204 -0
  47. package/.opencode/templates/research-project/FEATURES.md +147 -0
  48. package/.opencode/templates/research-project/PITFALLS.md +200 -0
  49. package/.opencode/templates/research-project/STACK.md +120 -0
  50. package/.opencode/templates/research-project/SUMMARY.md +170 -0
  51. package/.opencode/templates/research.md +278 -0
  52. package/.opencode/templates/retrospective.md +54 -0
  53. package/.opencode/templates/roadmap.md +202 -0
  54. package/.opencode/templates/state.md +176 -0
  55. package/.opencode/templates/summary-complex.md +59 -0
  56. package/.opencode/templates/summary-minimal.md +41 -0
  57. package/.opencode/templates/summary-standard.md +48 -0
  58. package/.opencode/templates/summary.md +248 -0
  59. package/.opencode/templates/user-setup.md +311 -0
  60. package/.opencode/templates/verification-report.md +322 -0
  61. package/.opencode/workflows/add-phase.md +111 -0
  62. package/.opencode/workflows/add-tests.md +350 -0
  63. package/.opencode/workflows/add-todo.md +157 -0
  64. package/.opencode/workflows/audit-milestone.md +297 -0
  65. package/.opencode/workflows/check-todos.md +176 -0
  66. package/.opencode/workflows/cleanup.md +152 -0
  67. package/.opencode/workflows/complete-milestone.md +763 -0
  68. package/.opencode/workflows/diagnose-issues.md +219 -0
  69. package/.opencode/workflows/discovery-phase.md +288 -0
  70. package/.opencode/workflows/discuss-phase.md +542 -0
  71. package/.opencode/workflows/execute-phase.md +449 -0
  72. package/.opencode/workflows/execute-plan.md +447 -0
  73. package/.opencode/workflows/health.md +156 -0
  74. package/.opencode/workflows/help.md +489 -0
  75. package/.opencode/workflows/insert-phase.md +129 -0
  76. package/.opencode/workflows/list-phase-assumptions.md +178 -0
  77. package/.opencode/workflows/map-codebase.md +315 -0
  78. package/.opencode/workflows/new-milestone.md +382 -0
  79. package/.opencode/workflows/new-project.md +1116 -0
  80. package/.opencode/workflows/pause-work.md +122 -0
  81. package/.opencode/workflows/plan-milestone-gaps.md +274 -0
  82. package/.opencode/workflows/plan-phase.md +569 -0
  83. package/.opencode/workflows/progress.md +381 -0
  84. package/.opencode/workflows/quick.md +453 -0
  85. package/.opencode/workflows/remove-phase.md +154 -0
  86. package/.opencode/workflows/research-phase.md +73 -0
  87. package/.opencode/workflows/resume-project.md +304 -0
  88. package/.opencode/workflows/set-profile.md +80 -0
  89. package/.opencode/workflows/settings.md +213 -0
  90. package/.opencode/workflows/transition.md +544 -0
  91. package/.opencode/workflows/update.md +219 -0
  92. package/.opencode/workflows/verify-phase.md +242 -0
  93. package/.opencode/workflows/verify-work.md +569 -0
  94. package/commands/specops/add-phase.md +43 -0
  95. package/commands/specops/add-tests.md +41 -0
  96. package/commands/specops/add-todo.md +47 -0
  97. package/commands/specops/audit-milestone.md +36 -0
  98. package/commands/specops/check-todos.md +45 -0
  99. package/commands/specops/cleanup.md +18 -0
  100. package/commands/specops/complete-milestone.md +136 -0
  101. package/commands/specops/debug.md +167 -0
  102. package/commands/specops/discuss-phase.md +83 -0
  103. package/commands/specops/execute-phase.md +41 -0
  104. package/commands/specops/health.md +22 -0
  105. package/commands/specops/help.md +22 -0
  106. package/commands/specops/insert-phase.md +32 -0
  107. package/commands/specops/join-discord.md +18 -0
  108. package/commands/specops/list-phase-assumptions.md +46 -0
  109. package/commands/specops/map-codebase.md +71 -0
  110. package/commands/specops/new-milestone.md +44 -0
  111. package/commands/specops/new-project.md +42 -0
  112. package/commands/specops/pause-work.md +38 -0
  113. package/commands/specops/plan-milestone-gaps.md +34 -0
  114. package/commands/specops/plan-phase.md +45 -0
  115. package/commands/specops/progress.md +24 -0
  116. package/commands/specops/quick.md +41 -0
  117. package/commands/specops/reapply-patches.md +111 -0
  118. package/commands/specops/remove-phase.md +31 -0
  119. package/commands/specops/research-phase.md +189 -0
  120. package/commands/specops/resume-work.md +40 -0
  121. package/commands/specops/set-profile.md +34 -0
  122. package/commands/specops/settings.md +36 -0
  123. package/commands/specops/update.md +37 -0
  124. package/commands/specops/verify-work.md +38 -0
  125. package/dist/__e2e__/01-state-engine.e2e.test.js +1 -1
  126. package/dist/acceptance/lazyDetector.js +1 -1
  127. package/dist/acceptance/lazyDetector.test.js +1 -1
  128. package/dist/acceptance/reporter.js +1 -1
  129. package/dist/acceptance/reporter.test.js +1 -1
  130. package/dist/acceptance/runner.js +1 -1
  131. package/dist/acceptance/runner.test.js +1 -1
  132. package/dist/cli.js +1 -1
  133. package/dist/context/index.js +1 -1
  134. package/dist/context/promptTemplate.js +1 -1
  135. package/dist/context/promptTemplate.test.js +1 -1
  136. package/dist/context/techContextLoader.js +1 -1
  137. package/dist/context/techContextLoader.test.js +1 -1
  138. package/dist/engine.js +1 -1
  139. package/dist/evolution/distiller.js +1 -1
  140. package/dist/evolution/index.js +1 -1
  141. package/dist/evolution/memoryGraph.js +1 -1
  142. package/dist/evolution/selector.js +1 -1
  143. package/dist/evolution/signals.js +1 -1
  144. package/dist/evolution/solidify.js +1 -1
  145. package/dist/evolution/store.js +1 -1
  146. package/dist/evolution/types.js +1 -1
  147. package/dist/init.d.ts +4 -3
  148. package/dist/init.js +1 -1
  149. package/dist/machines/agentMachine.js +1 -1
  150. package/dist/machines/agentMachine.test.js +1 -1
  151. package/dist/machines/supervisorMachine.js +1 -1
  152. package/dist/machines/supervisorMachine.test.js +1 -1
  153. package/dist/persistence/schema.js +1 -1
  154. package/dist/persistence/stateFile.js +1 -1
  155. package/dist/persistence/stateFile.test.js +1 -1
  156. package/dist/plugin-engine.js +1 -1
  157. package/dist/plugin.js +1 -1
  158. package/dist/types/index.js +1 -1
  159. package/dist/utils/id.js +1 -1
  160. package/package.json +2 -1
@@ -0,0 +1,449 @@
1
+ <purpose>
2
+ 使用基于波次的并行执行方式执行阶段中的所有计划。编排器保持精简——将计划执行委托给子代理。
3
+ </purpose>
4
+
5
+ <core_principle>
6
+ 编排器负责协调,而非执行。每个子代理加载完整的 execute-plan 上下文。编排器:发现计划 → 分析依赖 → 分组波次 → 生成代理 → 处理检查点 → 收集结果。
7
+ </core_principle>
8
+
9
+ <required_reading>
10
+ 在任何操作之前先读取 STATE.md 以加载项目上下文。
11
+ </required_reading>
12
+
13
+ <process>
14
+
15
+ <step name="initialize" priority="first">
16
+ 一次调用加载所有上下文:
17
+
18
+ ```bash
19
+ INIT=$(node .opencode/bin/specops-tools.cjs init execute-phase "${PHASE_ARG}")
20
+ ```
21
+
22
+ 从 JSON 中解析:`executor_model`、`verifier_model`、`commit_docs`、`parallelization`、`branching_strategy`、`branch_name`、`phase_found`、`phase_dir`、`phase_number`、`phase_name`、`phase_slug`、`plans`、`incomplete_plans`、`plan_count`、`incomplete_count`、`state_exists`、`roadmap_exists`、`phase_req_ids`。
23
+
24
+ **如果 `phase_found` 为 false:** 错误——未找到阶段目录。
25
+ **如果 `plan_count` 为 0:** 错误——阶段中未找到计划。
26
+ **如果 `state_exists` 为 false 但 `.planning/` 存在:** 提供重建或继续的选项。
27
+
28
+ 当 `parallelization` 为 false 时,波次内的计划按顺序执行。
29
+ </step>
30
+
31
+ <step name="handle_branching">
32
+ 从 init 检查 `branching_strategy`:
33
+
34
+ **"none":** 跳过,继续在当前分支上工作。
35
+
36
+ **"phase" 或 "milestone":** 使用 init 预计算的 `branch_name`:
37
+ ```bash
38
+ git checkout -b "$BRANCH_NAME" 2>/dev/null || git checkout "$BRANCH_NAME"
39
+ ```
40
+
41
+ 后续所有提交都到此分支。用户自行处理合并。
42
+ </step>
43
+
44
+ <step name="validate_phase">
45
+ 从 init JSON 获取:`phase_dir`、`plan_count`、`incomplete_count`。
46
+
47
+ 报告:"在 {phase_dir} 中找到 {plan_count} 个计划({incomplete_count} 个未完成)"
48
+ </step>
49
+
50
+ <step name="discover_and_group_plans">
51
+ 一次调用加载带波次分组的计划清单:
52
+
53
+ ```bash
54
+ PLAN_INDEX=$(node .opencode/bin/specops-tools.cjs phase-plan-index "${PHASE_NUMBER}")
55
+ ```
56
+
57
+ 从 JSON 中解析:`phase`、`plans[]`(每个包含 `id`、`wave`、`autonomous`、`objective`、`files_modified`、`task_count`、`has_summary`)、`waves`(波次编号到计划 ID 的映射)、`incomplete`、`has_checkpoints`。
58
+
59
+ **过滤:** 跳过 `has_summary: true` 的计划。如果使用 `--gaps-only`:同时跳过非 gap_closure 计划。如果全部被过滤:"没有匹配的未完成计划" → 退出。
60
+
61
+ 报告:
62
+ ```
63
+ ## 执行计划
64
+
65
+ **阶段 {X}:{Name}** — {total_plans} 个计划,分 {wave_count} 个波次
66
+
67
+ | 波次 | 计划 | 构建内容 |
68
+ |------|------|----------|
69
+ | 1 | 01-01, 01-02 | {从计划目标提取,3-8 个词} |
70
+ | 2 | 01-03 | ... |
71
+ ```
72
+ </step>
73
+
74
+ <step name="execute_waves">
75
+ 按顺序执行每个波次。波次内部:如果 `PARALLELIZATION=true` 则并行,如果为 `false` 则顺序执行。
76
+
77
+ **对于每个波次:**
78
+
79
+ 1. **描述正在构建的内容(生成代理之前):**
80
+
81
+ 读取每个计划的 `<objective>`。提取正在构建的内容和原因。
82
+
83
+ ```
84
+ ---
85
+ ## 波次 {N}
86
+
87
+ **{Plan ID}:{Plan Name}**
88
+ {2-3 句话:构建内容、技术方案、为什么重要}
89
+
90
+ 正在生成 {count} 个代理...
91
+ ---
92
+ ```
93
+
94
+ - 差:「执行地形生成计划」
95
+ - 好:「使用 Perlin 噪声的程序化地形生成器——创建高度图、生态区域和碰撞网格。在车辆物理引擎与地面交互之前必须完成。」
96
+
97
+ 2. **生成执行器代理:**
98
+
99
+ 只传递路径——执行器用它们的全新 200k 上下文自行读取文件。
100
+ 这让编排器上下文保持精简(约 10-15%)。
101
+
102
+ ```
103
+ Task(
104
+ subagent_type="specops-executor",
105
+ model="{executor_model}",
106
+ prompt="
107
+ <objective>
108
+ Execute plan {plan_number} of phase {phase_number}-{phase_name}.
109
+ Commit each task atomically. Create SUMMARY.md. Update STATE.md and ROADMAP.md.
110
+ </objective>
111
+
112
+ <execution_context>
113
+ @.opencode/workflows/execute-plan.md
114
+ @.opencode/templates/summary.md
115
+ @.opencode/references/checkpoints.md
116
+ @.opencode/references/tdd.md
117
+ </execution_context>
118
+
119
+ <files_to_read>
120
+ Read these files at execution start using the Read tool:
121
+ - {phase_dir}/{plan_file} (Plan)
122
+ - .planning/STATE.md (State)
123
+ - .planning/config.json (Config, if exists)
124
+ - ./CLAUDE.md (Project instructions, if exists — follow project-specific guidelines and coding conventions)
125
+ - .agents/skills/ (Project skills, if exists — list skills, read SKILL.md for each, follow relevant rules during implementation)
126
+ </files_to_read>
127
+
128
+ <success_criteria>
129
+ - [ ] All tasks executed
130
+ - [ ] Each task committed individually
131
+ - [ ] SUMMARY.md created in plan directory
132
+ - [ ] STATE.md updated with position and decisions
133
+ - [ ] ROADMAP.md updated with plan progress (via `roadmap update-plan-progress`)
134
+ </success_criteria>
135
+ "
136
+ )
137
+ ```
138
+
139
+ 3. **等待波次中所有代理完成。**
140
+
141
+ 4. **报告完成——先抽查验证声明:**
142
+
143
+ 对于每个 SUMMARY.md:
144
+ - 验证 `key-files.created` 中前 2 个文件在磁盘上存在
145
+ - 检查 `git log --oneline --all --grep="{phase}-{plan}"` 返回 ≥1 个提交
146
+ - 检查是否有 `## Self-Check: FAILED` 标记
147
+
148
+ 如果任何抽查失败:报告哪个计划失败,路由到失败处理程序——询问「重试计划?」或「继续剩余波次?」
149
+
150
+ 如果通过:
151
+ ```
152
+ ---
153
+ ## 波次 {N} 完成
154
+
155
+ **{Plan ID}:{Plan Name}**
156
+ {构建了什么——来自 SUMMARY.md}
157
+ {显著偏差(如有)}
158
+
159
+ {如果还有更多波次:这为下一波次启用了什么}
160
+ ---
161
+ ```
162
+
163
+ - 差:「波次 2 完成。继续波次 3。」
164
+ - 好:「地形系统完成——3 种生态类型、基于高度的纹理、物理碰撞网格。车辆物理(波次 3)现在可以引用地面表面。」
165
+
166
+ 5. **处理失败:**
167
+
168
+ **已知 Claude Code bug(classifyHandoffIfNeeded):** 如果代理报告「失败」且错误包含 `classifyHandoffIfNeeded is not defined`,这是 Claude Code 运行时 bug——不是 SpecOps 或代理的问题。该错误在所有工具调用完成后的完成处理程序中触发。此时:运行与步骤 4 相同的抽查(SUMMARY.md 存在、git 提交存在、无 Self-Check: FAILED)。如果抽查通过 → 视为**成功**。如果抽查失败 → 按下面的真实失败处理。
169
+
170
+ 对于真实失败:报告哪个计划失败 → 询问「继续?」或「停止?」→ 如果继续,依赖计划也可能失败。如果停止,输出部分完成报告。
171
+
172
+ 6. **在波次之间执行检查点计划** — 参见 `<checkpoint_handling>`。
173
+
174
+ 7. **继续下一波次。**
175
+ </step>
176
+
177
+ <step name="checkpoint_handling">
178
+ `autonomous: false` 的计划需要用户交互。
179
+
180
+ **自动模式检查点处理:**
181
+
182
+ 读取自动推进配置:
183
+ ```bash
184
+ AUTO_CFG=$(node .opencode/bin/specops-tools.cjs config-get workflow.auto_advance 2>/dev/null || echo "false")
185
+ ```
186
+
187
+ 当执行器返回检查点且 `AUTO_CFG` 为 `"true"` 时:
188
+ - **human-verify** → 自动生成延续代理,`{user_response}` = `"approved"`。记录 `⚡ 自动批准检查点`。
189
+ - **decision** → 自动生成延续代理,`{user_response}` = 检查点详情中的第一个选项。记录 `⚡ 自动选择:[option]`。
190
+ - **human-action** → 向用户展示(下面的现有行为)。认证门控不能自动化。
191
+
192
+ **标准流程(非自动模式,或 human-action 类型):**
193
+
194
+ 1. 为检查点计划生成代理
195
+ 2. 代理运行直到检查点任务或认证门控 → 返回结构化状态
196
+ 3. 代理返回包括:已完成任务表、当前任务 + 阻塞原因、检查点类型/详情、等待内容
197
+ 4. **向用户展示:**
198
+ ```
199
+ ## 检查点:[Type]
200
+
201
+ **计划:** 03-03 Dashboard Layout
202
+ **进度:** 2/3 任务完成
203
+
204
+ [来自代理返回的检查点详情]
205
+ [来自代理返回的等待部分]
206
+ ```
207
+ 5. 用户响应:"approved"/"done" | 问题描述 | 决策选择
208
+ 6. **生成延续代理(不是恢复)** 使用 continuation-prompt.md 模板:
209
+ - `{completed_tasks_table}`:来自检查点返回
210
+ - `{resume_task_number}` + `{resume_task_name}`:当前任务
211
+ - `{user_response}`:用户提供的内容
212
+ - `{resume_instructions}`:基于检查点类型
213
+ 7. 延续代理验证之前的提交,从恢复点继续
214
+ 8. 重复直到计划完成或用户停止
215
+
216
+ **为什么用新代理而不是恢复:** 恢复依赖于在并行工具调用时会中断的内部序列化。使用显式状态的新代理更可靠。
217
+
218
+ **并行波次中的检查点:** 代理暂停并返回,而其他并行代理可能已完成。展示检查点,生成延续,等待所有代理完成后再进入下一波次。
219
+ </step>
220
+
221
+ <step name="aggregate_results">
222
+ 所有波次完成后:
223
+
224
+ ```markdown
225
+ ## 阶段 {X}:{Name} 执行完成
226
+
227
+ **波次:** {N} | **计划:** {M}/{total} 完成
228
+
229
+ | 波次 | 计划 | 状态 |
230
+ |------|------|------|
231
+ | 1 | plan-01, plan-02 | ✓ 完成 |
232
+ | CP | plan-03 | ✓ 已验证 |
233
+ | 2 | plan-04 | ✓ 完成 |
234
+
235
+ ### 计划详情
236
+ 1. **03-01**:[来自 SUMMARY.md 的一句话]
237
+ 2. **03-02**:[来自 SUMMARY.md 的一句话]
238
+
239
+ ### 遇到的问题
240
+ [从 SUMMARY 汇总,或「无」]
241
+ ```
242
+ </step>
243
+
244
+ <step name="close_parent_artifacts">
245
+ **仅适用于小数/打磨阶段(X.Y 模式):** 通过解决父级 UAT 和调试产物来关闭反馈循环。
246
+
247
+ **如果**阶段编号没有小数点(如 `3`、`04`)则跳过——仅适用于间隙修复阶段如 `4.1`、`03.1`。
248
+
249
+ **1. 检测小数阶段并推导父级:**
250
+ ```bash
251
+ # Check if phase_number contains a decimal
252
+ if [[ "$PHASE_NUMBER" == *.* ]]; then
253
+ PARENT_PHASE="${PHASE_NUMBER%%.*}"
254
+ fi
255
+ ```
256
+
257
+ **2. 查找父级 UAT 文件:**
258
+ ```bash
259
+ PARENT_INFO=$(node .opencode/bin/specops-tools.cjs find-phase "${PARENT_PHASE}" --raw)
260
+ # Extract directory from PARENT_INFO JSON, then find UAT file in that directory
261
+ ```
262
+
263
+ **如果未找到父级 UAT:** 跳过此步骤(间隙修复可能由 VERIFICATION.md 触发而非 UAT)。
264
+
265
+ **3. 更新 UAT 间隙状态:**
266
+
267
+ 读取父级 UAT 文件的 `## Gaps` 部分。对于每个 `status: failed` 的间隙条目:
268
+ - 更新为 `status: resolved`
269
+
270
+ **4. 更新 UAT 前置信息:**
271
+
272
+ 如果所有间隙现在都是 `status: resolved`:
273
+ - 将前置信息 `status: diagnosed` → `status: resolved`
274
+ - 更新前置信息 `updated:` 时间戳
275
+
276
+ **5. 解决引用的调试会话:**
277
+
278
+ 对于每个有 `debug_session:` 字段的间隙:
279
+ - 读取调试会话文件
280
+ - 将前置信息 `status:` → `resolved`
281
+ - 更新前置信息 `updated:` 时间戳
282
+ - 移动到已解决目录:
283
+ ```bash
284
+ mkdir -p .planning/debug/resolved
285
+ mv .planning/debug/{slug}.md .planning/debug/resolved/
286
+ ```
287
+
288
+ **6. 提交更新的产物:**
289
+ ```bash
290
+ node .opencode/bin/specops-tools.cjs commit "docs(phase-${PARENT_PHASE}): resolve UAT gaps and debug sessions after ${PHASE_NUMBER} gap closure" --files .planning/phases/*${PARENT_PHASE}*/*-UAT.md .planning/debug/resolved/*.md
291
+ ```
292
+ </step>
293
+
294
+ <step name="verify_phase_goal">
295
+ 验证阶段是否达成了目标,而不仅仅是完成了任务。
296
+
297
+ ```
298
+ Task(
299
+ prompt="Verify phase {phase_number} goal achievement.
300
+ Phase directory: {phase_dir}
301
+ Phase goal: {goal from ROADMAP.md}
302
+ Phase requirement IDs: {phase_req_ids}
303
+ Check must_haves against actual codebase.
304
+ Cross-reference requirement IDs from PLAN frontmatter against REQUIREMENTS.md — every ID MUST be accounted for.
305
+ Create VERIFICATION.md.",
306
+ subagent_type="specops-verifier",
307
+ model="{verifier_model}"
308
+ )
309
+ ```
310
+
311
+ 读取状态:
312
+ ```bash
313
+ grep "^status:" "$PHASE_DIR"/*-VERIFICATION.md | cut -d: -f2 | tr -d ' '
314
+ ```
315
+
316
+ | 状态 | 操作 |
317
+ |------|------|
318
+ | `passed` | → update_roadmap |
319
+ | `human_needed` | 展示需要人工测试的项目,获取批准或反馈 |
320
+ | `gaps_found` | 展示间隙摘要,提供 `/specops:plan-phase {phase} --gaps` |
321
+
322
+ **如果 human_needed:**
323
+ ```
324
+ ## ✓ 阶段 {X}:{Name} — 需要人工验证
325
+
326
+ 所有自动化检查通过。{N} 个项目需要人工测试:
327
+
328
+ {来自 VERIFICATION.md human_verification 部分}
329
+
330
+ "approved" → 继续 | 报告问题 → 间隙修复
331
+ ```
332
+
333
+ **如果 gaps_found:**
334
+ ```
335
+ ## ⚠ 阶段 {X}:{Name} — 发现间隙
336
+
337
+ **得分:** {N}/{M} 个必需项已验证
338
+ **报告:** {phase_dir}/{phase_num}-VERIFICATION.md
339
+
340
+ ### 缺失内容
341
+ {来自 VERIFICATION.md 的间隙摘要}
342
+
343
+ ---
344
+ ## ▶ 下一步
345
+
346
+ `/specops:plan-phase {X} --gaps`
347
+
348
+ <sub>`/clear` 先清理 → 全新上下文窗口</sub>
349
+
350
+ 也可以:`cat {phase_dir}/{phase_num}-VERIFICATION.md` — 完整报告
351
+ 也可以:`/specops:verify-work {X}` — 先进行手动测试
352
+ ```
353
+
354
+ 间隙修复循环:`/specops:plan-phase {X} --gaps` 读取 VERIFICATION.md → 创建带 `gap_closure: true` 的间隙计划 → 用户运行 `/specops:execute-phase {X} --gaps-only` → 验证器重新运行。
355
+ </step>
356
+
357
+ <step name="update_roadmap">
358
+ **标记阶段完成并更新所有跟踪文件:**
359
+
360
+ ```bash
361
+ COMPLETION=$(node .opencode/bin/specops-tools.cjs phase complete "${PHASE_NUMBER}")
362
+ ```
363
+
364
+ CLI 处理:
365
+ - 用完成日期标记阶段复选框 `[x]`
366
+ - 更新进度表(状态 → 完成、日期)
367
+ - 将计划数更新为最终值
368
+ - 在 STATE.md 中推进到下一阶段
369
+ - 更新 REQUIREMENTS.md 可追溯性
370
+
371
+ 从结果中提取:`next_phase`、`next_phase_name`、`is_last_phase`。
372
+
373
+ ```bash
374
+ node .opencode/bin/specops-tools.cjs commit "docs(phase-{X}): complete phase execution" --files .planning/ROADMAP.md .planning/STATE.md .planning/REQUIREMENTS.md {phase_dir}/*-VERIFICATION.md
375
+ ```
376
+ </step>
377
+
378
+ <step name="offer_next">
379
+
380
+ **例外:** 如果 `gaps_found`,`verify_phase_goal` 步骤已经展示了间隙修复路径(`/specops:plan-phase {X} --gaps`)。不需要额外路由——跳过自动推进。
381
+
382
+ **无转换检查(由自动推进链生成):**
383
+
384
+ 从 $ARGUMENTS 解析 `--no-transition` 标志。
385
+
386
+ **如果存在 `--no-transition` 标志:**
387
+
388
+ execute-phase 由 plan-phase 的自动推进生成。不要运行 transition.md。
389
+ 验证通过且路线图更新后,向父级返回完成状态:
390
+
391
+ ```
392
+ ## PHASE COMPLETE
393
+
394
+ Phase: ${PHASE_NUMBER} - ${PHASE_NAME}
395
+ Plans: ${completed_count}/${total_count}
396
+ Verification: {Passed | Gaps Found}
397
+
398
+ [Include aggregate_results output]
399
+ ```
400
+
401
+ 停止。不要继续自动推进或转换。
402
+
403
+ **如果不存在 `--no-transition` 标志:**
404
+
405
+ **自动推进检测:**
406
+
407
+ 1. 从 $ARGUMENTS 解析 `--auto` 标志
408
+ 2. 从配置读取 `workflow.auto_advance`:
409
+ ```bash
410
+ AUTO_CFG=$(node .opencode/bin/specops-tools.cjs config-get workflow.auto_advance 2>/dev/null || echo "false")
411
+ ```
412
+
413
+ **如果存在 `--auto` 标志或 `AUTO_CFG` 为 true(且验证通过无间隙):**
414
+
415
+ ```
416
+ ╔══════════════════════════════════════════╗
417
+ ║ AUTO-ADVANCING → TRANSITION ║
418
+ ║ Phase {X} verified, continuing chain ║
419
+ ╚══════════════════════════════════════════╝
420
+ ```
421
+
422
+ 内联执行转换工作流(不要使用 Task——编排器上下文约 10-15%,转换需要的阶段完成数据已在上下文中):
423
+
424
+ 读取并执行 `.opencode/workflows/transition.md`,传递 `--auto` 标志使其传播到下一阶段调用。
425
+
426
+ **如果既没有 `--auto` 也没有 `AUTO_CFG` 为 true:**
427
+
428
+ 工作流结束。用户运行 `/specops:progress` 或手动调用转换工作流。
429
+ </step>
430
+
431
+ </process>
432
+
433
+ <context_efficiency>
434
+ 编排器:约 10-15% 上下文。子代理:每个全新 200k。无轮询(Task 阻塞)。无上下文泄漏。
435
+ </context_efficiency>
436
+
437
+ <failure_handling>
438
+ - **classifyHandoffIfNeeded 误报失败:** 代理报告「失败」但错误是 `classifyHandoffIfNeeded is not defined` → Claude Code bug,不是 SpecOps 问题。抽查(SUMMARY 存在、提交存在)→ 如果通过,视为成功
439
+ - **代理在计划中途失败:** 缺少 SUMMARY.md → 报告,询问用户如何处理
440
+ - **依赖链断裂:** 波次 1 失败 → 波次 2 依赖项可能也会失败 → 用户选择尝试或跳过
441
+ - **波次中所有代理都失败:** 系统性问题 → 停止,报告以供调查
442
+ - **检查点无法解决:** 「跳过此计划?」或「中止阶段执行?」→ 在 STATE.md 中记录部分进度
443
+ </failure_handling>
444
+
445
+ <resumption>
446
+ 重新运行 `/specops:execute-phase {phase}` → discover_plans 找到已完成的 SUMMARY → 跳过它们 → 从第一个未完成的计划恢复 → 继续波次执行。
447
+
448
+ STATE.md 跟踪:最后完成的计划、当前波次、待处理的检查点。
449
+ </resumption>