@boyingliu01/xp-gate 0.8.19 → 0.8.20

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 (49) hide show
  1. package/lib/init.js +2 -2
  2. package/lib/install-skill.js +13 -4
  3. package/lib/principles.js +5 -0
  4. package/mock-policy/AGENTS.md +3 -3
  5. package/mutation/AGENTS.md +3 -3
  6. package/package.json +1 -1
  7. package/plugins/claude-code/.claude-plugin/plugin.json +1 -1
  8. package/plugins/claude-code/skills/delphi-review/AGENTS.md +3 -3
  9. package/plugins/claude-code/skills/sprint-flow/AGENTS.md +3 -3
  10. package/plugins/claude-code/skills/sprint-flow/SKILL.md +135 -1091
  11. package/plugins/claude-code/skills/sprint-flow/references/orchestration-rules.md +333 -0
  12. package/plugins/claude-code/skills/sprint-flow/references/phase-1-plan.md +17 -46
  13. package/plugins/claude-code/skills/sprint-flow/references/phase-2-build.md +4 -193
  14. package/plugins/claude-code/skills/sprint-flow/references/phase-3-review.md +13 -30
  15. package/plugins/claude-code/skills/sprint-flow/references/phase-6-ship.md +4 -181
  16. package/plugins/claude-code/skills/sprint-flow/references/phase-7-land.md +4 -135
  17. package/plugins/claude-code/skills/sprint-flow/references/phase-8-cleanup.md +4 -187
  18. package/plugins/claude-code/skills/sprint-flow/references/phase-minus-1-isolate.md +58 -0
  19. package/plugins/claude-code/skills/test-specification-alignment/AGENTS.md +3 -3
  20. package/plugins/opencode/package.json +1 -1
  21. package/plugins/opencode/skills/delphi-review/AGENTS.md +3 -3
  22. package/plugins/opencode/skills/sprint-flow/AGENTS.md +3 -3
  23. package/plugins/opencode/skills/sprint-flow/SKILL.md +135 -1091
  24. package/plugins/opencode/skills/sprint-flow/references/orchestration-rules.md +333 -0
  25. package/plugins/opencode/skills/sprint-flow/references/phase-1-plan.md +17 -46
  26. package/plugins/opencode/skills/sprint-flow/references/phase-2-build.md +4 -193
  27. package/plugins/opencode/skills/sprint-flow/references/phase-3-review.md +13 -30
  28. package/plugins/opencode/skills/sprint-flow/references/phase-6-ship.md +4 -181
  29. package/plugins/opencode/skills/sprint-flow/references/phase-7-land.md +4 -135
  30. package/plugins/opencode/skills/sprint-flow/references/phase-8-cleanup.md +4 -187
  31. package/plugins/opencode/skills/sprint-flow/references/phase-minus-1-isolate.md +58 -0
  32. package/plugins/opencode/skills/test-specification-alignment/AGENTS.md +3 -3
  33. package/plugins/qoder/bin/xp-gate-check +5 -1
  34. package/plugins/qoder/skills/delphi-review/AGENTS.md +3 -3
  35. package/plugins/qoder/skills/sprint-flow/AGENTS.md +3 -3
  36. package/plugins/qoder/skills/test-specification-alignment/AGENTS.md +3 -3
  37. package/principles/AGENTS.md +3 -3
  38. package/skills/delphi-review/AGENTS.md +3 -3
  39. package/skills/sprint-flow/AGENTS.md +3 -3
  40. package/skills/sprint-flow/SKILL.md +135 -1091
  41. package/skills/sprint-flow/references/orchestration-rules.md +333 -0
  42. package/skills/sprint-flow/references/phase-1-plan.md +17 -46
  43. package/skills/sprint-flow/references/phase-2-build.md +4 -193
  44. package/skills/sprint-flow/references/phase-3-review.md +13 -30
  45. package/skills/sprint-flow/references/phase-6-ship.md +4 -181
  46. package/skills/sprint-flow/references/phase-7-land.md +4 -135
  47. package/skills/sprint-flow/references/phase-8-cleanup.md +4 -187
  48. package/skills/sprint-flow/references/phase-minus-1-isolate.md +58 -0
  49. package/skills/test-specification-alignment/AGENTS.md +3 -3
@@ -0,0 +1,333 @@
1
+ ## 编排层规则(Orchestration Rules)
2
+
3
+ ### Agent Dispatch Rules
4
+
5
+ | Agent Type | 适用场景 | 不适用场景 | 超时处理 |
6
+ |-----------|---------|-----------|---------|
7
+ | `explore` (bare) | **窄搜索**:单个关键词/pattern,已知文件位置 | 多角度宽泛搜索,读取大文件,3+ search angles | >5min → cancel + 用 `deep` 重试 |
8
+ | `librarian` (bare) | **外部参考**:API 文档、OSS 示例 | 内部代码库宽泛探索 | >5min → cancel + 用 `deep` 重试 |
9
+ | `task(category="deep")` | **复杂研究**:多模块分析,架构决策 | 单文件 trivial fix | 无限制 |
10
+ | `task(category="unspecified-high")` | **高 effort 实现**:新模块、重构 | 单行修改 | 无限制 |
11
+
12
+ **关键规则**:
13
+
14
+ 1. Bare `explore` agent 本质是 contextual grep,**不是研究 agent**。如果任务涉及:
15
+ - 3+ 个独立搜索角度
16
+ - 读取多个大文件(>200 行)
17
+ - 需要跨层分析(如"查 ralph-loop + .sprint-state/ + token 阈值 + phase transition")
18
+
19
+ → **必须用 `task(category="deep", load_skills=[...])` 替代**
20
+
21
+ 2. 如果 `explore` agent >5 分钟未返回 → cancel 并立即用 `task(category="deep")` 重试。不要等待。
22
+
23
+ 3. **并行 explore 仍然是正确模式**。2-4 个窄搜索 explore agent 并行执行是高效且推荐的。问题在于给单一 explore agent 分配宽泛任务。
24
+
25
+ **issue #83 根因**:`bg_1abf2ed9` 被分配了 4 个独立搜索角度的宽泛任务(ralph-loop context + .sprint-state/ + token threshold + phase transition),bare explore agent 超时丢失 session。同批的 `bg_5ecf590d`(窄搜索 OpenCode compaction API)3m35s 正常完成。
26
+
27
+ ### Phase Subagent Dispatch Matrix
28
+
29
+ | Phase | 名称 | Subagent? | Category | load_skills | 执行者 |
30
+ |-------|------|:---------:|----------|-------------|--------|
31
+ | -1 | ISOLATE | ❌ | Bash(直接执行) | 无 | orchestrator |
32
+ | -0.5 | AUTO-ESTIMATE | ❌ | Bash(直接执行) | 无 | orchestrator |
33
+ | 0 | THINK | ✅ | `deep` | `["brainstorming"]` | subagent |
34
+ | 1 | PLAN | ✅ | `deep` | `["autoplan", "delphi-review", "to-issues"]` | subagent |
35
+ | 2 | BUILD | ✅(已有) | ralph-loop | `["test-driven-development"]` | subagent |
36
+ | 3 | REVIEW | ✅ | `deep` | `["delphi-review", "test-specification-alignment"]` | subagent |
37
+ | 4 | USER ACCEPT | ❌ | **强制人工** | 无 | 用户 |
38
+ | 5 | FEEDBACK | ✅ | `quick` | `["learn", "retro", "systematic-debugging"]` | subagent |
39
+ | 6 | SHIP | ✅ | `quick` | `["finishing-a-development-branch", "ship"]` | subagent |
40
+ | 7 | LAND | ✅ | `deep` | `["land-and-deploy"]` | subagent |
41
+ | 8 | CLEANUP | ❌ | Bash(直接执行) | 无 | orchestrator |
42
+
43
+ **上下文隔离原则**:
44
+ - 每个 Subagent 在**独立 session** 中启动,不继承 orchestrator 的对话历史
45
+ - orchestrator session 仅接收 subagent 的最终结果摘要(~13,000 tokens/sprint)
46
+ - 现代模型百万 token 上下文 + 缓存命中 → 单 sprint 不会触发 overflow
47
+
48
+ ### CONTEXT INHERITANCE
49
+
50
+ 每个 Phase subagent 启动时,上下文仅通过以下路径继承:
51
+
52
+ | Phase | 加载来源 | 内容 |
53
+ |-------|---------|------|
54
+ | Phase -1 | 无前置(Bash 操作) | 用户原始需求 + 当前分支状态 |
55
+ | Phase 0 | phase--1-summary(仅路径) | 隔离环境信息(worktree 路径) |
56
+ | Phase 1 | phase-0-summary.md + design-doc | 设计决策 + 结构化规格 |
57
+ | Phase 2 | phase-1-summary.md + specification.yaml | 评审结论 + REQ 列表 |
58
+ | Phase 3 | phase-2-summary.md + MVP 代码 | 构建结果 |
59
+ | Phase 4 | — | **人工验收**。Phase 4 不产生 subagent summary,但用户验收结果记录在 `.sprint-state/phase-outputs/emergent-issues.md`(如有 emergent issues)。Phase 5 加载此文件。 |
60
+ | Phase 5 | phase-4-summary.md + emergent-issues.md | 验收结论 |
61
+ | Phase 6 | phase-5-summary.md + feedback-log.md | 复盘结论 |
62
+ | Phase 7 | phase-6-summary.md + PR URL | 发布准备 |
63
+ | Phase 8 | phase-7-summary(Bash 操作) | 部署结果 |
64
+
65
+ **隔离原则**:每个 Phase subagent 在干净上下文中启动。
66
+ 输入仅限上表对应的摘要文件和一级产出物。
67
+ 不包含前一 Phase 的完整对话、中间文件、失败尝试。
68
+
69
+ **特殊场景**:
70
+ - `--resume-from <phase>`:跳过前置 Phase,直接从指定 Phase 启动。**MUST 先执行 RESUME GATE(Issue #148)** 校验 sprint 状态、git 可达性和文件时效性,再执行 Phase Transition Gate 校验摘要文件格式。例如 `--resume-from build` 要求 `phase-1-summary.md` 和 `specification.yaml` 已存在且非 stale。
71
+ - `--no-isolate`:跳过 Phase -1 ISOLATE,直接在当前分支执行。Phase 0 无 `phase--1-summary` 可用,上下文继承来源为用户原始需求 + 当前 git 状态。所有后续 Phase 的 worktree enforcement 不适用(无 worktree),但仍需保持代码隔离。
72
+ - `next_phase_context` 中的 `{path}` 等变量占位符在实际写入时被替换为具体值。示例中的 `{path}` 应替换为实际 worktree 路径(如 `.worktrees/sprint/sprint-2026-06-01-01`)。
73
+
74
+ ### PHASE TRANSITION RULES
75
+
76
+ 每个 Phase subagent 完成后,必须按顺序执行以下步骤:
77
+
78
+ 1. **写入 Phase 摘要**:创建 `.sprint-state/phase-outputs/phase-{N}-summary.md`
79
+ - 格式:YAML frontmatter + Markdown body(body ≤ 50 行)
80
+ - 大小限制:≤ 40,000 字符(≈ 10,000 tokens)
81
+
82
+ 2. **更新 sprint-state.json**:
83
+ - `phase`: 当前阶段编号
84
+ - `outputs`: 新增当前阶段输出文件路径
85
+ - `phase_history`: 追加或更新当前阶段的记录
86
+ - Phase 开始时:追加 `{ "phase": N, "phase_name": "NAME", "status": "running", "started_at": "<ISO 8601>", "completed_at": null, "duration_seconds": null }`
87
+ - Phase 完成时:更新对应条目,填充 `completed_at`(ISO 8601)和 `duration_seconds`(`completed_at - started_at` 的秒数)
88
+ - Phase 跳过时(如轻量路由跳过 Phase 0 brainstorming):设置 `status: "skipped"`
89
+
90
+ 3. **等待用户确认 checkpoint**(如适用)
91
+
92
+ 4. **展示进度看板**:执行 `node scripts/render-sprint-progress.cjs` 渲染进度看板
93
+ - 脚本自动读取 `.sprint-state/sprint-state.json` 并输出 ASCII 进度看板
94
+ - 渲染规则:已完成阶段显示 ✅ + 耗时,当前阶段 🔄,待做 ⬜,跳过 ⏭️,失败 ❌
95
+ - 进度条:`[████▓░░░░░░] {pct}%`(已完成数/总阶段数 11)
96
+ - 下一步行动:根据当前阶段 + 状态,自动查找对应提示
97
+ - 输出物路径:列出 `outputs` 中已有的文件路径
98
+ - 时机:每个 Phase 完成后的 transition 阶段自动展示,用户无需请求
99
+ - 向后兼容:旧版 `sprint-state.json` 缺少 `phase_history` 时,从 `phase` 字段推断状态
100
+
101
+ ### Phase Summary 格式(YAML Frontmatter Schema)
102
+
103
+ 每个 `phase-N-summary.md` 必须包含以下 YAML frontmatter:
104
+
105
+ ```markdown
106
+ ---
107
+ phase: -1
108
+ phase_name: ISOLATE
109
+ status: completed
110
+ outputs:
111
+ - path: ".worktrees/sprint/sprint-YYYY-MM-DD-NN"
112
+ type: directory
113
+ decisions:
114
+ - title: "Worktree isolation enabled"
115
+ rationale: "Prevent main branch pollution"
116
+ unresolved_issues: []
117
+ next_phase_context: "Worktree created at {path}. All subsequent edits MUST use this workdir."
118
+ ---
119
+
120
+ ## Phase Summary
121
+ {简明摘要,不超过 50 行}
122
+ ```
123
+
124
+ **必填字段**: `phase`, `phase_name`, `status`, `outputs`, `decisions`, `next_phase_context`
125
+ **可选字段**: `unresolved_issues`
126
+
127
+ ### Phase Transition Gate
128
+
129
+ Orchestrator dispatch 下一 Phase 前必须执行验证:
130
+
131
+ ```bash
132
+ # === Phase Transition Gate ===
133
+
134
+ # 1. Phase summary file validation
135
+ SUMMARY=".sprint-state/phase-outputs/phase-${N}-summary.md"
136
+ [ -f "$SUMMARY" ] || { echo "[BLOCK] phase-${N}-summary 不存在"; exit 1; }
137
+ FRONTMARKERS=$(grep -c "^---" "$SUMMARY" 2>/dev/null || echo 0)
138
+ [ "$FRONTMARKERS" -ge 2 ] || { echo "[BLOCK] YAML frontmatter 格式不完整"; exit 1; }
139
+ grep -q "^phase:" "$SUMMARY" || { echo "[BLOCK] 缺少 phase 字段"; exit 1; }
140
+ grep -q "^phase_name:" "$SUMMARY" || { echo "[BLOCK] 缺少 phase_name 字段"; exit 1; }
141
+ grep -q "^status:" "$SUMMARY" || { echo "[BLOCK] 缺少 status 字段"; exit 1; }
142
+ grep -q "^decisions:" "$SUMMARY" || { echo "[BLOCK] 缺少 decisions 字段"; exit 1; }
143
+ grep -q "^outputs:" "$SUMMARY" || { echo "[BLOCK] 缺少 outputs 字段"; exit 1; }
144
+ grep -q "^next_phase_context:" "$SUMMARY" || { echo "[BLOCK] 缺少 next_phase_context"; exit 1; }
145
+ CHARS=$(wc -c < "$SUMMARY" | tr -d ' ')
146
+ [ "$CHARS" -le 40000 ] || { echo "[BLOCK] 摘要超出大小限制 (${CHARS}/40000 chars)"; exit 1; }
147
+
148
+ # 2. sprint-state.json enforcement check (Issue #146)
149
+ SPRINT_STATE=".sprint-state/sprint-state.json"
150
+ [ -f "$SPRINT_STATE" ] || { echo "[BLOCK] sprint-state.json 不存在"; exit 1; }
151
+
152
+ # Verify phase_history includes current phase with completed_at
153
+ PHASE_HISTORY_CHECK=$(grep -c "\"phase\": $N" "$SPRINT_STATE" 2>/dev/null || echo 0)
154
+ [ "$PHASE_HISTORY_CHECK" -gt 0 ] || {
155
+ echo "[BLOCK] sprint-state.json phase_history 缺少 phase $N 的记录"
156
+ echo "[ACTION] 在 dispatch 下一 Phase 前更新 sprint-state.json:"
157
+ echo " - phase: $N"
158
+ echo " - phase_history: 追加 {phase:N, status:completed, completed_at:<ISO8601>}"
159
+ echo " - outputs: 追加当前 phase 的输出文件"
160
+ exit 1
161
+ }
162
+
163
+ # Verify completed_at is set (not null)
164
+ COMPLETED_AT_VALUE=$(grep -A3 "\"phase\": $N" "$SPRINT_STATE" 2>/dev/null | grep "completed_at" | head -1 | grep -o '"[^"]*"$' | tr -d '"')
165
+ [ "$COMPLETED_AT_VALUE" != "null" ] && [ -n "$COMPLETED_AT_VALUE" ] || {
166
+ echo "[BLOCK] sprint-state.json phase $N 的 completed_at 未设置 (null)"
167
+ echo "[ACTION] 设置 completed_at 为当前时间 (ISO 8601):"
168
+ echo " date -u +%Y-%m-%dT%H:%M:%SZ"
169
+ exit 1
170
+ }
171
+ ```
172
+
173
+ **由 orchestrator 强制执行**,不依赖 subagent 自觉遵守。
174
+ 验证失败 → BLOCK,不可 dispatch 下一 Phase。
175
+
176
+ ### RESUME GATE / --resume-from 断点校验(Issue #148)
177
+
178
+ 当使用 `--resume-from <phase>` 时,在执行 Phase Transition Gate 之前,
179
+ orchestrator MUST 先执行以下断点校验。任何一项失败 → BLOCK,拒绝恢复。
180
+
181
+ ```bash
182
+ SPRINT_STATE=".sprint-state/sprint-state.json"
183
+ [ -f "$SPRINT_STATE" ] || { echo "[BLOCK] sprint-state.json 不存在,无法恢复"; exit 1; }
184
+
185
+ # 1. Sprint ID 一致性:确认 resume 的目标 sprint 与 sprint-state.json 匹配
186
+ SPRINT_ID=$(grep -o '"id": "[^"]*"' "$SPRINT_STATE" | head -1 | cut -d'"' -f4)
187
+ CURRENT_SPRINT_ID=$(echo "$TASK_DESCRIPTION" | md5sum | head -8 2>/dev/null || echo "unknown")
188
+ # 实际 sprint id 由 Phase -1 生成,此处仅验证文件存在且包含 id 字段
189
+ [ -n "$SPRINT_ID" ] || { echo "[BLOCK] sprint-state.json 缺少 id 字段"; exit 1; }
190
+
191
+ # 2. 阶段顺序校验:--resume-from 的 phase 必须是最后已完成 phase 的后继
192
+ LAST_COMPLETED_PHASE=$(grep -o '"phase": [0-9]' "$SPRINT_STATE" | tail -1 | awk '{print $2}')
193
+ RESUME_PHASE=$((RESUME_PHASE)) # orchestrator 将 --resume-from 参数值转为整数
194
+ [ "$RESUME_PHASE" -gt "$LAST_COMPLETED_PHASE" ] || {
195
+ echo "[BLOCK] --resume-from phase ($RESUME_PHASE) 必须在最后已完成 phase ($LAST_COMPLETED_PHASE) 之后"
196
+ exit 1
197
+ }
198
+
199
+ # 3. Git 状态校验:isolation branch 仍然可达
200
+ ISOLATION_BRANCH=$(grep -o '"branch": "[^"]*"' "$SPRINT_STATE" | head -1 | cut -d'"' -f4)
201
+ ISOLATION_COMMIT=$(grep -o '"created_from_commit": "[^"]*"' "$SPRINT_STATE" | head -1 | cut -d'"' -f4)
202
+ if [ -n "$ISOLATION_BRANCH" ]; then
203
+ git rev-parse --verify "$ISOLATION_BRANCH" >/dev/null 2>&1 || {
204
+ echo "[BLOCK] isolation branch '$ISOLATION_BRANCH' 已不存在(可能被删除或 force push 覆盖)"
205
+ exit 1
206
+ }
207
+ fi
208
+ if [ -n "$ISOLATION_COMMIT" ]; then
209
+ git cat-file -e "${ISOLATION_COMMIT}^{commit}" 2>/dev/null || {
210
+ echo "[WARN] isolation commit $ISOLATION_COMMIT 不可达(可能被 GC 或 rebase 清理),恢复后可能状态不一致"
211
+ # WARN 而非 BLOCK — 可继续但有风险
212
+ }
213
+ fi
214
+
215
+ # 4. 文件时效性校验:前置摘要文件的 mtime 不晚于其生成 phase 的完成时间
216
+ RESUME_PREREQ_PHASE=$((RESUME_PHASE - 1))
217
+ PREREQ_FILE=".sprint-state/phase-outputs/phase-${RESUME_PREREQ_PHASE}-summary.md"
218
+ [ -f "$PREREQ_FILE" ] || { echo "[BLOCK] 前置摘要文件 ${PREREQ_FILE} 不存在"; exit 1; }
219
+
220
+ # 提取前置 phase 的完成时间
221
+ PREREQ_COMPLETED_AT=$(grep -A3 "\"phase\": $RESUME_PREREQ_PHASE" "$SPRINT_STATE" 2>/dev/null | grep "completed_at" | head -1 | cut -d'"' -f4)
222
+ if [ -n "$PREREQ_COMPLETED_AT" ] && [ "$PREREQ_COMPLETED_AT" != "null" ]; then
223
+ FILE_MTIME=$(stat -c %Y "$PREREQ_FILE" 2>/dev/null || stat -f %m "$PREREQ_FILE" 2>/dev/null)
224
+ COMPLETED_EPOCH=$(date -d "$PREREQ_COMPLETED_AT" +%s 2>/dev/null || echo "")
225
+ if [ -n "$FILE_MTIME" ] && [ -n "$COMPLETED_EPOCH" ]; then
226
+ # 容忍 60 秒时钟偏差
227
+ [ "$FILE_MTIME" -le $((COMPLETED_EPOCH + 60)) ] || {
228
+ echo "[WARN] 前置摘要文件 ${PREREQ_FILE} 在 phase $RESUME_PREREQ_PHASE 完成后被修改(mtime: $(date -d @$FILE_MTIME '+%Y-%m-%d %H:%M:%S'), completed_at: $PREREQ_COMPLETED_AT)"
229
+ echo "[ACTION] 继续恢复前请确认修改是预期的。输入 'confirm' 继续,其他取消:"
230
+ read USER_CONFIRM
231
+ [ "$USER_CONFIRM" = "confirm" ] || { echo "[BLOCK] 用户取消恢复"; exit 1; }
232
+ }
233
+ fi
234
+ fi
235
+
236
+ # 5. specification.yaml 时效性校验(仅 --resume-from build)
237
+ SPEC_FILE="specification.yaml"
238
+ if [ "$RESUME_PHASE" -ge 2 ] && [ -f "$SPEC_FILE" ]; then
239
+ SPEC_MTIME=$(stat -c %Y "$SPEC_FILE" 2>/dev/null || stat -f %m "$SPEC_FILE" 2>/dev/null)
240
+ PLAN_COMPLETED_AT=$(grep -A3 '"phase": 1' "$SPRINT_STATE" 2>/dev/null | grep "completed_at" | head -1 | cut -d'"' -f4)
241
+ if [ -n "$SPEC_MTIME" ] && [ -n "$PLAN_COMPLETED_AT" ] && [ "$PLAN_COMPLETED_AT" != "null" ]; then
242
+ PLAN_EPOCH=$(date -d "$PLAN_COMPLETED_AT" +%s 2>/dev/null || echo "")
243
+ if [ -n "$PLAN_EPOCH" ] && [ "$SPEC_MTIME" -gt $((PLAN_EPOCH + 60)) ]; then
244
+ echo "[WARN] specification.yaml 在 Plan phase 完成后被修改"
245
+ echo "[ACTION] 继续恢复前请确认 specification.yaml 的修改是预期的。输入 'confirm' 继续:"
246
+ read USER_CONFIRM
247
+ [ "$USER_CONFIRM" = "confirm" ] || { echo "[BLOCK] 用户取消恢复"; exit 1; }
248
+ fi
249
+ fi
250
+ fi
251
+
252
+ echo "✅ RESUME GATE PASSED — 断点校验通过"
253
+ # 继续执行 Phase Transition Gate
254
+ ```
255
+
256
+ 验证失败 → BLOCK,不可执行 `--resume-from`。
257
+ orchestrator 必须展示失败原因并建议用户启动新 Sprint 或手动修复后重试。
258
+
259
+ ### WORKTREE ENFORCEMENT(Issue #84)
260
+
261
+ Phase -1 执行完毕后,**所有后续操作(Phase 0 到 Phase 8)的文件编辑、命令执行 MUST 在 worktree 目录下执行**:
262
+
263
+ - **工作目录**:所有 Bash 命令必须通过 `workdir` 参数或 `&&` 链式命令在 worktree 路径下执行
264
+ - **文件写入**:所有 `write`、`edit` 工具的 `filePath` 必须位于 `isolation.worktree_path` 下
265
+ - **验证步骤**:Phase 0 开始前,输出 `[WORKTREE] 后续所有操作将在 {worktree_path} 中进行`
266
+ - **例外**:`.gitignore` 校验(Phase -1 表步 4)和 `git worktree remove`(Phase 8 清理)在仓库根目录执行
267
+ Sprint state is persisted as JSON in `.sprint-state/sprint-state.json`:
268
+ ```json
269
+ {
270
+ "id": "sprint-2026-04-26-01",
271
+ "task_description": "开发访谈机器人,支持多轮对话",
272
+ "phase": -1,
273
+ "status": "running|paused|completed",
274
+ "started_at": "2026-04-26T10:00:00Z",
275
+ "isolation": {
276
+ "worktree_path": ".worktrees/sprint/sprint-2026-04-26-01",
277
+ "branch": "sprint/2026-04-26-01",
278
+ "created_from": "main",
279
+ "created_from_commit": "abc123def..."
280
+ },
281
+ "auto_estimate": {
282
+ "change_type": "删除已存在代码|修改已存在代码|新增功能|Bug修复",
283
+ "metrics": {
284
+ "ref_count": 12,
285
+ "cross_module_count": 3,
286
+ "modules": ["auth", "user", "admin"],
287
+ "circular_dep": true,
288
+ "public_api_count": 5,
289
+ "test_file_count": 4
290
+ },
291
+ "estimated_level": "轻量|标准|复杂",
292
+ "recommended_flow": "轻量流程 (Phase 0-3, reduced-intensity Delphi)|标准流程 (Phase 0-4)|完整 Sprint Flow (Phase 0-8)",
293
+ "risk_warnings": ["循环依赖: user ↔ plane"],
294
+ "user_decision": "accepted|overridden|cancelled",
295
+ "override_reason": null
296
+ },
297
+ "phase_history": [
298
+ {
299
+ "phase": -1,
300
+ "phase_name": "ISOLATE",
301
+ "status": "completed",
302
+ "started_at": "2026-04-26T10:00:00Z",
303
+ "completed_at": "2026-04-26T10:03:00Z",
304
+ "duration_seconds": 180
305
+ }
306
+ ],
307
+ "outputs": {
308
+ "pain_document": "docs/pain-document.md",
309
+ "specification": "specification.yaml",
310
+ "mvp": "mvp-v1/",
311
+ "review_report": "review-report.md"
312
+ },
313
+ "metrics": {
314
+ "tests_passed": 15,
315
+ "tests_failed": 0,
316
+ "coverage_pct": 85
317
+ }
318
+ }
319
+ ```
320
+
321
+ **新增字段说明**:
322
+ - `task_description`: Sprint 需求描述(Phase -1 启动时写入)
323
+ - `started_at`: Sprint 启动时间戳(Phase -1 启动时写入,ISO 8601 格式)
324
+ - `phase_history`: 阶段历史数组,每个元素记录阶段的执行信息:
325
+ - `phase`: 阶段编号
326
+ - `phase_name`: 阶段名称
327
+ - `status`: completed / running / failed / skipped
328
+ - `started_at`: 阶段开始时间(ISO 8601)
329
+ - `completed_at`: 阶段完成时间(null 表示未完成)
330
+ - `duration_seconds`: 耗时秒数(null 表示未完成)
331
+
332
+ **Eval assertions check for:** `phase`, `status`, `isolation.branch`, `outputs.specification`, `metrics.coverage_pct`, `phase_history`, `task_description`.
333
+
@@ -4,17 +4,12 @@
4
4
 
5
5
  多模型评审,达成 APPROVED 共识。后续步骤自动从 APPROVED 设计文档提取 specification.yaml。
6
6
 
7
- > **#225**: `autoplan` 是交互式 skill,**必须由 orchestrator 直接执行**。只有 delphi-review 和 to-issues 可以 dispatch 到 subagent。
8
-
9
7
  ---
10
8
 
11
9
  ## 调用 Skills
12
10
 
13
- **Orchestrator 直接执行(可交互)**:
14
- - `autoplan` (gstack) CEO → Design → Eng 自动流水线(orchestrator 级,支持 taste_decisions 交互)
15
-
16
- **Subagent 执行(非交互,fire-and-forget)**:
17
- - `delphi-review` — 多轮匿名评审直到共识(**自动多轮,无需人工中断**)
11
+ - `autoplan` (gstack) — CEO → Design → Eng 自动流水线
12
+ - `delphi-review` — 多轮匿名评审直到共识
18
13
  - specification.yaml 从 APPROVED 设计文档自动生成(无需独立 skill)
19
14
 
20
15
  **Web 前端项目额外注入**:
@@ -79,15 +74,13 @@ autoplan_result:
79
74
  │ │
80
75
  │ IF autoplan_result.verdict == "NEEDS_REVIEW" │
81
76
  │ OR autoplan_result.taste_decisions.length > 0 │
82
- │ → ⚠️ 暂停等待用户确认 taste_decisions
77
+ │ → ⚠️ 暂停等待用户确认 taste_decisions
83
78
  │ → 用户确认后,调用标准 delphi-review │
84
79
  │ → 场景: 存在关键决策分歧或 autoplan 未完全自动通过 │
85
80
  │ │
86
81
  └───────────────────────────────────────────────────────────────────┘
87
82
  ```
88
83
 
89
- > **#218**: Delphi review 的 Round 1→Round 2→Round 3 自动调度在 subagent 内部完成,无需 orchestrator 每轮暂停等待。只有当 Round 结果 REQUEST_CHANGES 时,才在 orchestrator 层面暂停等待用户修复。
90
-
91
84
  ---
92
85
 
93
86
  ### Step 2a: 如果需要用户确认 taste_decisions
@@ -108,48 +101,28 @@ Decision 2: [决策描述]
108
101
  请选择每个决策的选项,或提供您的观点。
109
102
  ```
110
103
 
111
- 用户确认后,继续 Step **2c**(直接 dispatch subagent 执行 delphi-review + to-issues)。
112
-
113
- ---
114
-
115
- ### Step 2b: 无 taste_decisions,直接进入 subagent dispatch
116
-
117
- **IF** autoplan_result.verdict == "AUTO_APPROVED" AND taste_decisions == []:
118
- - 设计文档 + autoplan 评审结论 → 传给 subagent
119
- - 直接进入 Step 2c
104
+ 用户确认后,继续 Step 2b。
120
105
 
121
106
  ---
122
107
 
123
- ### Step 2c: 调用 delphi-review(subagent 自动多轮)
124
-
125
- Dispatch subagent 一次性处理 delphi-review 和 to-issues:
108
+ ### Step 2b: 调用 delphi-review(强制)
126
109
 
127
110
  ```bash
128
- task(
129
- category="deep",
130
- load_skills=["delphi-review", "to-issues"],
131
- run_in_background=false,
132
- prompt="[设计文档 + autoplan 评审结论 + taste_decisions 确认结果(如有)]"
133
- )
111
+ skill(name="delphi-review", user_message="[设计文档 + taste_decisions 确认结果]")
134
112
  ```
135
113
 
136
- **Subagent 内部流程(#218 自动多轮,无需人工中断)**:
137
- 1. 调用 delphi-review:
138
- - Round 1: 3 专家匿名独立评审
139
- - Round 2: 自动交换意见,自动展开下一轮
140
- - Round 3+: 自动继续直到 ≥90% 共识或 5 轮上限
141
- - **不暂停等待用户确认每一轮**
142
- - 如果最终结果 REQUEST_CHANGES: subagent 自行尝试修复常见问题(措辞模糊、AC 缺失等)后自动重评审
143
- - 如果仍无法达成 APPROVED: subagent 输出详细失败报告,orchestrator 暂停等待用户介入
144
- 2. 调用 to-issues(从 APPROVED 设计文档切片)
145
- 3. 输出: specification.yaml(含 user_stories[])+ slices-manifest.json
146
-
147
- **如果 delphi-review 返回 APPROVED**:
148
- - 自动进入 Step 3
114
+ delphi-review 执行:
115
+ - Round 1: 3 专家匿名独立评审
116
+ - Round 2+: 交换意见直到共识
117
+ - 输出: APPROVED / REQUEST_CHANGES
149
118
 
150
- **如果 delphi-review 最终 REQUEST_CHANGES**:
119
+ **如果 REQUEST_CHANGES**:
151
120
  - ⚠️ 暂停等待用户修复
152
- - 用户修复后重新调用 subagent(通过 task_id 延续)
121
+ - 修复后重新评审(从 Round 2 起步)
122
+ - 直到 APPROVED
123
+
124
+ **如果 APPROVED**:
125
+ - 自动进入 Step 3
153
126
 
154
127
  ---
155
128
 
@@ -195,9 +168,7 @@ specification:
195
168
  | 暂停点 | 触发条件 | 用户操作 |
196
169
  |--------|---------|---------|
197
170
  | taste_decisions 确认 | autoplan 无法自动决策 | 用户确认每个决策 |
198
- | delphi-review 最终 REQUEST_CHANGES | subagent 无法自动修复且经过 max_rounds | 用户修复并重新 dispatch |
199
-
200
- > **#218 规则**: 只有 `taste_decisions 确认` 和 `delphi-review 最终 REQUEST_CHANGES(subagent 已尝试自动修复仍失败)` 两个暂停点需要用户介入。Delphi review Round 1→2→3 的自动调度在 subagent 内部完成,不暂停。
171
+ | delphi-review APPROVED | Round 结果 REQUEST_CHANGES | 用户修复并重新评审 |
201
172
 
202
173
  ---
203
174
 
@@ -1,198 +1,9 @@
1
1
  # Phase 2: BUILD(TDD + 并行执行 + 盲评 + 验证)
2
2
 
3
- ## 目标
3
+ **完整指令**: @see SKILL.md `## Phase 2: BUILD` section.
4
4
 
5
- TDD 执行,多 Agent 并行加速,盲评验证,Gate 1 验证通过。生成 MVP v1。
5
+ **摘要**: TDD 执行, Agent 并行加速, 盲评验证, Gate 1 验证通过。
6
6
 
7
- ---
7
+ **关键链路**: DELPHI-GATE → parallel-dispatch/ralph-loop → TDD → freeze → blind-review → unfreeze → verification → cost monitor
8
8
 
9
- ## 调用 Skills
10
-
11
- | 步骤 | Skill | 来源 | 说明 |
12
- |------|-------|------|------|
13
- | 0 | **`dispatching-parallel-agents`** _(新增)_ | superpowers | 检测可并行任务,并行分发独立子任务 |
14
- | 0 | **`executing-plans`** _(新增)_ | superpowers | 在隔离 session 中执行计划,有 review checkpoint |
15
- | 1 | `test-driven-development` | superpowers | RED → GREEN → REFACTOR 铁律 |
16
- | 1.5 | `vercel-react-native-skills` | gstack | React Native 特定测试框架引用(如适用) |
17
- | 2 | `freeze` | gstack | 锁定业务代码,盲评隔离 |
18
- | 3 | `requesting-code-review` | superpowers | 独立 agent 盲评(隔离状态) |
19
- | 4 | `unfreeze` | gstack | 解锁业务代码 |
20
- | 5 | `verification-before-completion` | superpowers | 测试 + lint 证据优先 |
21
- | 6 | 成本监控 | sprint-flow 编排层 | 超阈值 BLOCK + 用户决策 |
22
-
23
- ---
24
-
25
- ## 执行步骤
26
-
27
- ### Step 0: 并行检测与任务分发(新增 — ISSUE29)
28
-
29
- **检测可并行任务**:
30
- 从 specification.yaml 或 Phase 1 输出中提取独立任务。并行条件:
31
- - 无共享状态依赖(不读写同一文件)
32
- - 无文件冲突风险(不同模块/组件)
33
- - 2+ 独立任务存在
34
-
35
- **IF 检测到可并行任务 → dispatching-parallel-agents 模式**:
36
-
37
- ```
38
- Phase 2:
39
- ├── task: [独立A] ──┐
40
- ├── task: [独立B] ──┼── dispatching-parallel-agents (并行)
41
- ├── task: [独立C] ──┘
42
- └── merge → freeze → review → verification
43
- ```
44
-
45
- 每个独立任务调用:
46
- ```
47
- skill(name="executing-plans", user_message="[计划内容] + review checkpoint")
48
- ```
49
-
50
- **IF 无并行机会 → 串行模式**(保持现有行为):
51
- ```
52
- Phase 2: test-driven-development → freeze → review → verification
53
- ```
54
-
55
- ### Step 1: TDD 执行(test-driven-development)
56
-
57
- ```
58
- skill(name="test-driven-development", user_message="[需求描述],基于 specification.yaml")
59
- ```
60
-
61
- **TDD 铁律**:
62
- 1. 🔴 **RED**: 先写测试(根据 specification.yaml 的 acceptance_criteria)
63
- 2. 🟢 **GREEN**: 写最小实现代码让测试通过
64
- 3. 🔵 **REFACTOR**: 重构代码,保持测试通过
65
-
66
- **语言特定 TDD**(通过 `--lang` 参数选择):
67
-
68
- | 语言 | 调用的 TDD skill |
69
- |------|-----------------|
70
- | Spring Boot | `springboot-tdd` |
71
- | Django | `django-tdd` |
72
- | Go | `golang-testing` |
73
-
74
- **输出**: tests + code
75
-
76
- ### Step 1.5: React Native 特定 TDD(如适用)
77
-
78
- **移动端项目特定测试策略**:
79
-
80
- 对于 mobile-react-native 项目:
81
- - 检测 `--type mobile-react-native` 或 `package.json` 中包含 react-native 依赖
82
- - 使用 Jest 进行单元测试 (RN 默认)
83
- - 使用 Detox 进行端到端测试
84
- - 使用 React Native Testing Library 进行组件测试
85
- - TDD 流程: 先写组件测试 → 极简组件实现 → 通过测试 → 重构
86
-
87
- 配置文件:
88
- - `jest.config.js` 用于测试环境设置
89
- - `.detoxrc.js` 包含 Detox 配置
90
- - iOS/Android 模拟器/真机测试支持
91
-
92
- **执行顺序**:
93
- - `npx jest` 运行单元测试
94
- - `npx detox build && npx detox test` 运行 E2E 测试
95
- - `npx jest --coverage` 检查测试覆盖率
96
-
97
- **Flutter 项目**(作为补充):
98
- - 对于 mobile-flutter 项目: `flutter test --coverage` 运行单元和 widget 测试
99
-
100
- ### Step 2: 盲评隔离(freeze)
101
-
102
- ```
103
- skill(name="freeze", user_message="[业务代码文件路径]")
104
- ```
105
-
106
- 锁定所有业务代码文件,排除测试文件。
107
- Navigator agent 在盲评阶段将无法访问业务代码。
108
-
109
- ### Step 3: 独立盲评(requesting-code-review)
110
-
111
- ```
112
- skill(name="requesting-code-review", user_message="[需求] + 测试文件 + 测试结果")
113
- ```
114
-
115
- **关键**: 盲评 agent 只接收需求 + 测试 + 测试结果,**不传业务代码**(freeze 锁定中)。
116
-
117
- **输出**: review findings(问题清单 + 建议)
118
-
119
- ### Step 4: 解锁业务代码(unfreeze)
120
-
121
- ```
122
- skill(name="unfreeze", user_message="[业务代码文件路径]")
123
- ```
124
-
125
- 解锁业务代码文件,允许后续步骤访问。
126
-
127
- ### Step 5: 验证(verification-before-completion)
128
-
129
- ```
130
- skill(name="verification-before-completion", user_message="验证实现完整性")
131
- ```
132
-
133
- **验证内容**:
134
- - 测试全部通过
135
- - Lint 无错误
136
- - 覆盖率 ≥ 80%
137
- - 证据优先:必须运行命令并确认输出
138
-
139
- **失败处理**:
140
- - 自动修复 max 3 次
141
- - 每次失败后修复代码,重新运行验证
142
- - max 3 次失败 → ⚠️ BLOCK,暂停等待用户决定
143
-
144
- ### Step 6: 成本监控(sprint-flow 编排层)
145
-
146
- sprint-flow 编排层监控本次 Phase 2 的成本:
147
-
148
- | 阈值 | 值 | 处理 |
149
- |------|-----|------|
150
- | 单任务阈值 | $0.15 | BLOCK + 提示用户决定 |
151
- | 日阈值 | $1.00 | BLOCK + 提示用户决定 |
152
-
153
- **零降级原则**: 成本超阈值时,必须 BLOCK 并通知用户,由用户决定是否继续。AI 不能自动跳过验证步骤。
154
-
155
- ---
156
-
157
- ## 关键行为保留(原 xp-consensus 17 状态机)
158
-
159
- | 原状态 | 含义 | 新处理方案 |
160
- |--------|------|-----------|
161
- | `CIRCUIT_BREAKER_TRIGGERED` | 成本/资源超阈值 | sprint-flow 编排层监控成本,超阈值 BLOCK + 用户决策 |
162
- | `ROLLBACK_TO_ROUND1` | Gate 1 失败自动修复 → 回退 | verification-before-completion 失败 → 修复 max 3 次 → 仍失败 BLOCK |
163
- | `GATE1_FAILED`/`GATE1_COMPLETE` | 区分可修复 vs 致命失败 | verification-before-completion 内置此区分 |
164
- | `GATE2_RUNNING` | Security Scan 集成 | `cso` (gstack) Phase 1-6 安全审计替代 |
165
- | `SEALED_CODE_ISOLATION` | freeze 技术隔离 | **保留 freeze skill 调用** |
166
- | `MOBILE_TDD_EXECUTION` | React Native/Flutter 特定 TDD 执行 | 根据 `--type` 参数选择: mobile-react-native → RN TDD, mobile-flutter → Flutter TDD |
167
-
168
- ---
169
-
170
- ## Skill 间数据流契约
171
-
172
- | 步骤 | Skill | 输入 | 输出 | 失败回退 |
173
- |------|-------|------|------|----------|
174
- | 0a | dispatching-parallel-agents | specification.yaml + 任务分解 | 并行子任务分发 | 降级为串行 |
175
- | 0b | executing-plans | 子任务计划 | 实现 + review checkpoint | BLOCK |
176
- | 1 | test-driven-development | 需求描述 + 现有代码上下文 | 测试 + 代码 (RED→GREEN→REFACTOR) | 修复 max 3 次 → BLOCK |
177
- | 1.5 | vercel-react-native-skills | 项目类型 (mobile-react-native 或 mobile-flutter), package.json | RN/Flutter 测试执行结果 | RN/Flutter 测试失败 → 修复 max 3 次 → BLOCK |
178
- | 2 | freeze | 业务代码文件路径 | 锁定状态确认 | ❌ BLOCK |
179
- | 3 | requesting-code-review | 需求 + 测试 + 测试结果(**不传业务代码**) | review findings | 继续(记录 findings) |
180
- | 4 | unfreeze | 业务代码文件路径 | 解锁状态确认 | ❌ BLOCK |
181
- | 5 | verification-before-completion | 测试执行结果 | pass/fail 证据 | 修复 max 3 次 → BLOCK |
182
-
183
- ---
184
-
185
- ## 暂停点
186
-
187
- | 暂停点 | 触发条件 | 用户操作 |
188
- |--------|---------|---------|
189
- | 验证 max 3 失败 | verification-before-completion 失败超过 3 次 | 用户决定修复或放弃 |
190
- | 成本超阈值 | 单任务 >$0.15 或日 >$1.00 | 用户决定继续或暂停 |
191
- | RN/Flutter 测试失败 | mobile-react-native 或 mobile-flutter 项目的测试执行失败且自动修复 max 3 次后仍未通过 | 用户决定继续修复或调整方案 |
192
-
193
- ---
194
-
195
- ## 输出
196
-
197
- - MVP v1 (`mvp-v1/` 目录)
198
- - 进入 Phase 3 自动执行
9
+ **输出**: MVP v1