maestro-flow 0.5.33 → 0.5.35

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 (238) hide show
  1. package/.agents/agents/role-design-author.md +5 -3
  2. package/.agents/agents/workflow-collab-planner.md +1 -0
  3. package/.agents/agents/workflow-planner.md +2 -0
  4. package/.agents/skills/maestro/SKILL.md +8 -1
  5. package/.agents/skills/maestro-help/SKILL.md +39 -10
  6. package/.agents/skills/maestro-help/index/catalog.json +117 -53
  7. package/.agents/skills/maestro-help/phases/01-parse-intent.md +9 -6
  8. package/.agents/skills/maestro-help/phases/02-search-present.md +55 -15
  9. package/.agents/skills/maestro-help/phases/03-workflow-guide.md +35 -2
  10. package/.agents/skills/maestro-plan/SKILL.md +3 -1
  11. package/.agents/skills/maestro-ralph/SKILL.md +55 -19
  12. package/.agents/skills/maestro-ralph-execute/SKILL.md +52 -10
  13. package/.agents/skills/manage-harvest/SKILL.md +3 -0
  14. package/.agents/skills/manage-knowledge-audit/SKILL.md +29 -0
  15. package/.agents/skills/odyssey-debug/SKILL.md +7 -1
  16. package/.agents/skills/odyssey-improve/SKILL.md +7 -1
  17. package/.agents/skills/odyssey-planex/SKILL.md +11 -1
  18. package/.agents/skills/odyssey-review-test-fix/SKILL.md +7 -1
  19. package/.agents/skills/odyssey-ui/SKILL.md +7 -1
  20. package/.agents/skills/quality-review/SKILL.md +3 -0
  21. package/.agents/skills/quality-test/SKILL.md +27 -1
  22. package/.agy/agents/role-design-author.md +5 -3
  23. package/.agy/agents/workflow-collab-planner.md +1 -0
  24. package/.agy/agents/workflow-planner.md +2 -0
  25. package/.agy/skills/maestro/SKILL.md +8 -1
  26. package/.agy/skills/maestro-help/SKILL.md +39 -10
  27. package/.agy/skills/maestro-help/index/catalog.json +117 -53
  28. package/.agy/skills/maestro-help/phases/01-parse-intent.md +9 -6
  29. package/.agy/skills/maestro-help/phases/02-search-present.md +55 -15
  30. package/.agy/skills/maestro-help/phases/03-workflow-guide.md +35 -2
  31. package/.agy/skills/maestro-plan/SKILL.md +3 -1
  32. package/.agy/skills/maestro-ralph/SKILL.md +55 -19
  33. package/.agy/skills/maestro-ralph-execute/SKILL.md +52 -10
  34. package/.agy/skills/manage-harvest/SKILL.md +3 -0
  35. package/.agy/skills/manage-knowledge-audit/SKILL.md +29 -0
  36. package/.agy/skills/odyssey-debug/SKILL.md +7 -1
  37. package/.agy/skills/odyssey-improve/SKILL.md +7 -1
  38. package/.agy/skills/odyssey-planex/SKILL.md +11 -1
  39. package/.agy/skills/odyssey-review-test-fix/SKILL.md +7 -1
  40. package/.agy/skills/odyssey-ui/SKILL.md +7 -1
  41. package/.agy/skills/quality-review/SKILL.md +3 -0
  42. package/.agy/skills/quality-test/SKILL.md +27 -1
  43. package/.claude/agents/role-design-author.md +5 -3
  44. package/.claude/agents/workflow-collab-planner.md +1 -0
  45. package/.claude/agents/workflow-planner.md +2 -0
  46. package/.claude/commands/maestro-plan.md +3 -1
  47. package/.claude/commands/maestro-ralph-execute.md +52 -10
  48. package/.claude/commands/maestro-ralph.md +55 -19
  49. package/.claude/commands/maestro.md +8 -1
  50. package/.claude/commands/manage-harvest.md +3 -0
  51. package/.claude/commands/manage-knowledge-audit.md +29 -0
  52. package/.claude/commands/odyssey-debug.md +7 -1
  53. package/.claude/commands/odyssey-improve.md +7 -1
  54. package/.claude/commands/odyssey-planex.md +11 -1
  55. package/.claude/commands/odyssey-review-test-fix.md +7 -1
  56. package/.claude/commands/odyssey-ui.md +7 -1
  57. package/.claude/commands/quality-review.md +3 -0
  58. package/.claude/commands/quality-test.md +27 -1
  59. package/.claude/skills/maestro-help/SKILL.md +39 -10
  60. package/.claude/skills/maestro-help/index/catalog.json +117 -53
  61. package/.claude/skills/maestro-help/phases/01-parse-intent.md +9 -6
  62. package/.claude/skills/maestro-help/phases/02-search-present.md +55 -15
  63. package/.claude/skills/maestro-help/phases/03-workflow-guide.md +35 -2
  64. package/.codex/skills/maestro/SKILL.md +17 -2
  65. package/.codex/skills/maestro-analyze/SKILL.md +20 -3
  66. package/.codex/skills/maestro-brainstorm/SKILL.md +30 -4
  67. package/.codex/skills/maestro-execute/SKILL.md +25 -3
  68. package/.codex/skills/maestro-grill/SKILL.md +9 -0
  69. package/.codex/skills/maestro-plan/SKILL.md +26 -3
  70. package/.codex/skills/maestro-ralph/SKILL.md +6 -0
  71. package/.codex/skills/maestro-ralph-execute/SKILL.md +51 -10
  72. package/.codex/skills/maestro-roadmap/SKILL.md +30 -1
  73. package/.codex/skills/manage-harvest/SKILL.md +2 -1
  74. package/.codex/skills/quality-review/SKILL.md +13 -2
  75. package/README.md +219 -87
  76. package/README.zh-CN.md +221 -79
  77. package/dashboard/dist-server/dashboard/src/server/wiki/embedding.d.ts +82 -0
  78. package/dashboard/dist-server/dashboard/src/server/wiki/embedding.js +444 -0
  79. package/dashboard/dist-server/dashboard/src/server/wiki/embedding.js.map +1 -0
  80. package/dashboard/dist-server/dashboard/src/server/wiki/graph-analysis.js +9 -4
  81. package/dashboard/dist-server/dashboard/src/server/wiki/graph-analysis.js.map +1 -1
  82. package/dashboard/dist-server/dashboard/src/server/wiki/search.d.ts +54 -5
  83. package/dashboard/dist-server/dashboard/src/server/wiki/search.js +420 -46
  84. package/dashboard/dist-server/dashboard/src/server/wiki/search.js.map +1 -1
  85. package/dashboard/dist-server/dashboard/src/server/wiki/stress.test.js +16 -0
  86. package/dashboard/dist-server/dashboard/src/server/wiki/stress.test.js.map +1 -1
  87. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.d.ts +14 -4
  88. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.js +130 -49
  89. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.js.map +1 -1
  90. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.test.js +64 -22
  91. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.test.js.map +1 -1
  92. package/dashboard/dist-server/dashboard/src/server/wiki/writer-stress.test.js +12 -12
  93. package/dashboard/dist-server/dashboard/src/server/wiki/writer-stress.test.js.map +1 -1
  94. package/dashboard/dist-server/dashboard/src/server/wiki/writer.js +10 -3
  95. package/dashboard/dist-server/dashboard/src/server/wiki/writer.js.map +1 -1
  96. package/dashboard/dist-server/src/commands/hooks.d.ts +3 -0
  97. package/dashboard/dist-server/src/commands/hooks.js +11 -8
  98. package/dashboard/dist-server/src/commands/hooks.js.map +1 -1
  99. package/dashboard/dist-server/src/graph/kg/db/types.d.ts +2 -1
  100. package/dashboard/dist-server/src/graph/kg/db/types.js.map +1 -1
  101. package/dashboard/dist-server/src/graph/kg/extraction/code/code-extractor.js +1 -1
  102. package/dashboard/dist-server/src/graph/kg/extraction/code/code-extractor.js.map +1 -1
  103. package/dashboard/dist-server/src/graph/kg/extraction/knowledge-extractor-registry.d.ts +22 -0
  104. package/dashboard/dist-server/src/graph/kg/extraction/knowledge-extractor-registry.js +64 -0
  105. package/dashboard/dist-server/src/graph/kg/extraction/knowledge-extractor-registry.js.map +1 -0
  106. package/dashboard/dist-server/src/graph/kg/extraction/orchestrator.js +14 -104
  107. package/dashboard/dist-server/src/graph/kg/extraction/orchestrator.js.map +1 -1
  108. package/dashboard/dist-server/src/hooks/keyword-spec-injector.js +5 -2
  109. package/dashboard/dist-server/src/hooks/keyword-spec-injector.js.map +1 -1
  110. package/dashboard/dist-server/src/hooks/wiki-role-loader.js +2 -1
  111. package/dashboard/dist-server/src/hooks/wiki-role-loader.js.map +1 -1
  112. package/dashboard/dist-server/src/tools/domain-loader.js +22 -16
  113. package/dashboard/dist-server/src/tools/domain-loader.js.map +1 -1
  114. package/dashboard/dist-server/src/tools/spec-entry-parser.d.ts +6 -1
  115. package/dashboard/dist-server/src/tools/spec-entry-parser.js +44 -13
  116. package/dashboard/dist-server/src/tools/spec-entry-parser.js.map +1 -1
  117. package/dashboard/dist-server/src/tools/spec-keyword-index.d.ts +2 -0
  118. package/dashboard/dist-server/src/tools/spec-keyword-index.js +4 -9
  119. package/dashboard/dist-server/src/tools/spec-keyword-index.js.map +1 -1
  120. package/dashboard/dist-server/src/tools/spec-loader.js +3 -11
  121. package/dashboard/dist-server/src/tools/spec-loader.js.map +1 -1
  122. package/dashboard/dist-server/src/types/index.d.ts +14 -0
  123. package/dashboard/dist-server/src/utils/frontmatter.d.ts +15 -0
  124. package/dashboard/dist-server/src/utils/frontmatter.js +76 -0
  125. package/dashboard/dist-server/src/utils/frontmatter.js.map +1 -0
  126. package/dist/src/cli.js +1 -0
  127. package/dist/src/cli.js.map +1 -1
  128. package/dist/src/commands/domain.d.ts.map +1 -1
  129. package/dist/src/commands/domain.js +8 -2
  130. package/dist/src/commands/domain.js.map +1 -1
  131. package/dist/src/commands/hooks.d.ts +3 -0
  132. package/dist/src/commands/hooks.d.ts.map +1 -1
  133. package/dist/src/commands/hooks.js +11 -8
  134. package/dist/src/commands/hooks.js.map +1 -1
  135. package/dist/src/commands/install.d.ts.map +1 -1
  136. package/dist/src/commands/install.js +48 -11
  137. package/dist/src/commands/install.js.map +1 -1
  138. package/dist/src/commands/knowhow.d.ts.map +1 -1
  139. package/dist/src/commands/knowhow.js +3 -26
  140. package/dist/src/commands/knowhow.js.map +1 -1
  141. package/dist/src/commands/search.d.ts +6 -1
  142. package/dist/src/commands/search.d.ts.map +1 -1
  143. package/dist/src/commands/search.js +124 -52
  144. package/dist/src/commands/search.js.map +1 -1
  145. package/dist/src/commands/spec.d.ts.map +1 -1
  146. package/dist/src/commands/spec.js +106 -6
  147. package/dist/src/commands/spec.js.map +1 -1
  148. package/dist/src/commands/uninstall.d.ts.map +1 -1
  149. package/dist/src/commands/uninstall.js +12 -3
  150. package/dist/src/commands/uninstall.js.map +1 -1
  151. package/dist/src/commands/update.d.ts.map +1 -1
  152. package/dist/src/commands/update.js +37 -21
  153. package/dist/src/commands/update.js.map +1 -1
  154. package/dist/src/config/cli-tools-config.d.ts.map +1 -1
  155. package/dist/src/config/cli-tools-config.js +2 -0
  156. package/dist/src/config/cli-tools-config.js.map +1 -1
  157. package/dist/src/core/extension-loader.d.ts.map +1 -1
  158. package/dist/src/core/extension-loader.js +4 -0
  159. package/dist/src/core/extension-loader.js.map +1 -1
  160. package/dist/src/core/install-executor.d.ts.map +1 -1
  161. package/dist/src/core/install-executor.js +8 -3
  162. package/dist/src/core/install-executor.js.map +1 -1
  163. package/dist/src/graph/analyzers/fs-analyzer.js +2 -2
  164. package/dist/src/graph/analyzers/fs-analyzer.js.map +1 -1
  165. package/dist/src/graph/kg/db/node-kind-registry.d.ts +18 -0
  166. package/dist/src/graph/kg/db/node-kind-registry.d.ts.map +1 -0
  167. package/dist/src/graph/kg/db/node-kind-registry.js +42 -0
  168. package/dist/src/graph/kg/db/node-kind-registry.js.map +1 -0
  169. package/dist/src/graph/kg/db/types.d.ts +2 -1
  170. package/dist/src/graph/kg/db/types.d.ts.map +1 -1
  171. package/dist/src/graph/kg/db/types.js.map +1 -1
  172. package/dist/src/graph/kg/extraction/code/code-extractor.js +1 -1
  173. package/dist/src/graph/kg/extraction/code/code-extractor.js.map +1 -1
  174. package/dist/src/graph/kg/extraction/knowledge-extractor-registry.d.ts +23 -0
  175. package/dist/src/graph/kg/extraction/knowledge-extractor-registry.d.ts.map +1 -0
  176. package/dist/src/graph/kg/extraction/knowledge-extractor-registry.js +64 -0
  177. package/dist/src/graph/kg/extraction/knowledge-extractor-registry.js.map +1 -0
  178. package/dist/src/graph/kg/extraction/orchestrator.d.ts.map +1 -1
  179. package/dist/src/graph/kg/extraction/orchestrator.js +14 -104
  180. package/dist/src/graph/kg/extraction/orchestrator.js.map +1 -1
  181. package/dist/src/hooks/keyword-spec-injector.d.ts.map +1 -1
  182. package/dist/src/hooks/keyword-spec-injector.js +5 -2
  183. package/dist/src/hooks/keyword-spec-injector.js.map +1 -1
  184. package/dist/src/hooks/wiki-role-loader.d.ts.map +1 -1
  185. package/dist/src/hooks/wiki-role-loader.js +2 -1
  186. package/dist/src/hooks/wiki-role-loader.js.map +1 -1
  187. package/dist/src/index.d.ts +6 -0
  188. package/dist/src/index.d.ts.map +1 -1
  189. package/dist/src/index.js +4 -0
  190. package/dist/src/index.js.map +1 -1
  191. package/dist/src/ralph/cmd-next.d.ts.map +1 -1
  192. package/dist/src/ralph/cmd-next.js +2 -3
  193. package/dist/src/ralph/cmd-next.js.map +1 -1
  194. package/dist/src/tools/domain-loader.d.ts.map +1 -1
  195. package/dist/src/tools/domain-loader.js +22 -16
  196. package/dist/src/tools/domain-loader.js.map +1 -1
  197. package/dist/src/tools/spec-conflict-marker.d.ts +55 -0
  198. package/dist/src/tools/spec-conflict-marker.d.ts.map +1 -0
  199. package/dist/src/tools/spec-conflict-marker.js +228 -0
  200. package/dist/src/tools/spec-conflict-marker.js.map +1 -0
  201. package/dist/src/tools/spec-entry-parser.d.ts +6 -1
  202. package/dist/src/tools/spec-entry-parser.d.ts.map +1 -1
  203. package/dist/src/tools/spec-entry-parser.js +44 -13
  204. package/dist/src/tools/spec-entry-parser.js.map +1 -1
  205. package/dist/src/tools/spec-keyword-index.d.ts +2 -0
  206. package/dist/src/tools/spec-keyword-index.d.ts.map +1 -1
  207. package/dist/src/tools/spec-keyword-index.js +4 -9
  208. package/dist/src/tools/spec-keyword-index.js.map +1 -1
  209. package/dist/src/tools/spec-loader.d.ts.map +1 -1
  210. package/dist/src/tools/spec-loader.js +3 -11
  211. package/dist/src/tools/spec-loader.js.map +1 -1
  212. package/dist/src/tools/spec-writer.d.ts.map +1 -1
  213. package/dist/src/tools/spec-writer.js +2 -6
  214. package/dist/src/tools/spec-writer.js.map +1 -1
  215. package/dist/src/tools/store-knowhow.d.ts.map +1 -1
  216. package/dist/src/tools/store-knowhow.js +6 -52
  217. package/dist/src/tools/store-knowhow.js.map +1 -1
  218. package/dist/src/tui/uninstall-ui/UninstallFlow.d.ts.map +1 -1
  219. package/dist/src/tui/uninstall-ui/UninstallFlow.js +3 -1
  220. package/dist/src/tui/uninstall-ui/UninstallFlow.js.map +1 -1
  221. package/dist/src/types/index.d.ts +14 -0
  222. package/dist/src/types/index.d.ts.map +1 -1
  223. package/dist/src/utils/frontmatter.d.ts +16 -0
  224. package/dist/src/utils/frontmatter.d.ts.map +1 -0
  225. package/dist/src/utils/frontmatter.js +76 -0
  226. package/dist/src/utils/frontmatter.js.map +1 -0
  227. package/dist/src/utils/migration-registry.d.ts.map +1 -1
  228. package/dist/src/utils/migration-registry.js +14 -1
  229. package/dist/src/utils/migration-registry.js.map +1 -1
  230. package/package.json +5 -3
  231. package/workflows/claude-instructions.md +63 -45
  232. package/workflows/codex-instructions.md +105 -28
  233. package/workflows/command-authoring.md +1 -1
  234. package/workflows/plan.md +2 -1
  235. package/.agents/skills/maestro-ralph-beta/SKILL.md +0 -877
  236. package/.agy/skills/maestro-ralph-beta/SKILL.md +0 -873
  237. package/.claude/commands/maestro-ralph-beta.md +0 -875
  238. package/.codex/skills/maestro-ralph-beta/SKILL.md +0 -883
@@ -21,6 +21,7 @@ $ARGUMENTS — intent text, flags, or keywords.
21
21
  **Parse:**
22
22
  ```
23
23
  -y flag → auto_confirm = true
24
+ --roadmap → wants_roadmap = true (强制多发布 roadmap 路径;roadmap 默认 opt-in)
24
25
  .md/.txt path → input_doc (supplementary context only, NEVER substitutes lifecycle stages)
25
26
  Remaining → intent
26
27
  ```
@@ -54,7 +55,7 @@ S_PARSE_ROUTE — 解析参数、路由入口 PERSIST: —
54
55
  S_STATUS — 显示 session 进度 PERSIST: —
55
56
  S_CONTINUE — 恢复执行 PERSIST: —
56
57
  S_RESOLVE_PHASE — 解析 phase + phase_is_new + D-007 milestone PERSIST: session.phase, session.phase_is_new, session.milestone
57
- S_INFER — 基于已解析 phase 推断 lifecycle_position PERSIST: session.lifecycle_position
58
+ S_INFER — 基于已解析 phase 推断 lifecycle_position PERSIST: session.lifecycle_position, session.wants_roadmap
58
59
  S_RESOLVE_SCOPE — 读 macro analyze conclusions.scope_verdict PERSIST: session.scope_verdict, session.analyze_macro_id
59
60
  S_QUALITY_MODE — 决定质量管线模式 PERSIST: session.quality_mode
60
61
  S_PLANNING_MODE — 决定统一/独立规划模式 PERSIST: session.planning_mode
@@ -126,7 +127,7 @@ S_DISPATCH:
126
127
  → END DO: view_file(AbsolutePath="<agy-skills-dir>/maestro-ralph-execute/SKILL.md") + execute inline
127
128
 
128
129
  S_DECISION_EVAL: (decision 节点 == `step.decision` 非空,下述 gate 名取自该字段)
129
- → S_APPLY_VERDICT WHEN: quality-gate (post-execute, post-business-test, post-review, post-test)
130
+ → S_APPLY_VERDICT WHEN: quality-gate (post-execute, post-business-test, post-review, post-test, post-frontend-verify)
130
131
  DO: A_DELEGATE_EVALUATE
131
132
  → S_APPLY_VERDICT WHEN: goal-gate (post-goal-audit)
132
133
  DO: A_GOAL_AUDIT_EVALUATE
@@ -213,6 +214,14 @@ resolve_milestone(phase_number):
213
214
  | blueprint / 规格 / 正式文档 / spec-generate / 7-phase | `blueprint` |
214
215
  | broad/medium intent 无数字 phase (重构/全面/重写/迁移/新功能 X) | `analyze-macro` |
215
216
 
217
+ **Roadmap opt-in detection** (设 `session.wants_roadmap`,缺省 `false`):
218
+ ```
219
+ wants_roadmap = (--roadmap flag)
220
+ OR (intent 含多发布信号: 多发布|多版本|分阶段交付|按里程碑发布|v1.*v2|multi-release|roadmap)
221
+ OR (.workflow/roadmap.md 已存在) ← 向后兼容:既有 roadmap 项目行为不变
222
+ ```
223
+ 默认 `false` → large 项目走单一多波次 `plan --from analyze`,不引入 roadmap 横切层;roadmap 仅多发布场景 opt-in。
224
+
216
225
  **Bootstrap detection:**
217
226
 
218
227
  | Condition | Position |
@@ -227,7 +236,7 @@ resolve_milestone(phase_number):
227
236
  | Condition | Position |
228
237
  |-----------|----------|
229
238
  | `phase_is_new == true` (新 phase) | `analyze` |
230
- | no milestones AND no roadmap.md AND has analyze macro artifact | `roadmap` |
239
+ | no milestones AND no roadmap.md AND has analyze macro artifact | `roadmap` if `wants_roadmap` else `plan` (--from analyze) |
231
240
  | no milestones AND no roadmap.md AND no analyze artifact | `analyze-macro` |
232
241
  | `phase == null` (grill/brainstorm/blueprint/init/roadmap/analyze-macro override 已定) | n/a |
233
242
  | phase 已存在 + 无任何 artifact | `analyze` |
@@ -248,9 +257,9 @@ resolve_milestone(phase_number):
248
257
 
249
258
  | scope_verdict | 链路 |
250
259
  |---------------|------|
251
- | `large` | analyze-macro → roadmap → analyze → plan → execute → ... |
252
- | `medium` / `small` | analyze-macro → plan --from analyze:{ANL_ID} → execute → ...(跳过 roadmap + analyze-phase |
253
- | `unknown` | 默认走 large 路径,post-analyze-scope 决策节点再纠正 |
260
+ | `large` + `wants_roadmap` | analyze-macro → roadmap → analyze → plan → execute → ...(多发布 opt-in) |
261
+ | `large`(默认)/ `medium` / `small` | analyze-macro → plan --from analyze:{ANL_ID} → execute → ...(跳过 roadmap + analyze-phase;单一多波次计划) |
262
+ | `unknown` | 默认走 standalone(plan --from analyze)路径,post-analyze-scope 决策节点再纠正 |
254
263
 
255
264
  **Refine from post-execute results:**
256
265
 
@@ -333,10 +342,10 @@ narrow → derive defaults from intent + codebase, skip questions.
333
342
  ```json
334
343
  { "id": "G1", "goal": "<deliverable>", "boundary": "<in/out note>",
335
344
  "done_when": "<objectively checkable condition>",
336
- "evidence": "verification.json|review.json|uat.md|<test path>",
345
+ "evidence": "verification.json|review.json|uat.md|e2e-results.json|<test path>",
337
346
  "lifecycle": ["analyze","execute"], "status": "pending" }
338
347
  ```
339
- `done_when` 必须客观可验证,且引用 ralph 已产出的 artifact;`lifecycle` 字段映射到产出 evidence 的生命周期 stage
348
+ `done_when` 必须客观可验证,且引用 ralph 已产出的 artifact;`lifecycle` 字段映射到产出 evidence 的生命周期 stage。涉及前端可用性的子目标,`done_when` 应引用 `e2e-results.json`(frontend-verify 门产出),不得仅以后端 API/build 证据判定可用。
340
349
 
341
350
  **5. Persist** (additive): `boundary_contract`, `execution_criteria`, `task_decomposition`。每个 sub-goal 含 `status: "pending"` + `completion_confirmed: false`。
342
351
 
@@ -352,6 +361,7 @@ Generate steps from `session.lifecycle_position` to `milestone-complete`.
352
361
  | brainstorm | `maestro-brainstorm "{intent}" --from grill:{grill_id}` *(if grill ran)* / `maestro-brainstorm "{intent}"` *(otherwise)* | *(same)* | — | all |
353
362
  | blueprint | `maestro-blueprint "{intent}"` | *(same)* | — | all |
354
363
  | init | `maestro-init` | *(same)* | — | all |
364
+ | spec-setup | `spec-setup` | *(same)* | — | all (**仅当 `.workflow/specs/` 不存在时插入**) |
355
365
  | analyze-macro | `maestro-analyze "{intent}"` | *(same)* | `post-analyze-scope` | all |
356
366
  | roadmap | `maestro-roadmap --from analyze:{analyze_macro_id}` | *(same)* | — | all |
357
367
  | analyze | `maestro-analyze {phase}` | `maestro-analyze` | — | all |
@@ -361,6 +371,7 @@ Generate steps from `session.lifecycle_position` to `milestone-complete`.
361
371
  | review | `quality-review {phase}` | `quality-review` | `post-review` | all (quick: append `--tier quick`) |
362
372
  | test-gen | `quality-auto-test {phase}` | `quality-auto-test` | — | full / standard if coverage<80% |
363
373
  | test | `quality-test {phase}` | `quality-test` | `post-test` | full, standard |
374
+ | frontend-verify | `quality-test {phase} --frontend-verify` | `quality-test --frontend-verify` | `post-frontend-verify` | all(**仅当 phase 交付 UI 时插入**:检出 `dashboard/` 或 UI 关键词 `landing\|page\|dashboard\|frontend\|UI\|component\|界面`) |
364
375
  | milestone-audit | `maestro-milestone-audit` | *(same)* | — | all |
365
376
  | goal-audit | *(decision-only)* | *(same)* | `post-goal-audit` | all (only if decomposed) |
366
377
  | milestone-complete | `maestro-milestone-complete` | *(same)* | `post-milestone` | all |
@@ -370,10 +381,12 @@ Generate steps from `session.lifecycle_position` to `milestone-complete`.
370
381
  **Build rules (按顺序应用):**
371
382
 
372
383
  0. **planning_mode 选列**:`unified` → Skill (unified) 列;`independent` → Skill (independent) 列
384
+ 0.5. **specs 预检**:当 `lifecycle_position ∉ {grill, brainstorm, blueprint, init}` 且 `.workflow/specs/` 目录不存在时,在链路最前面插入 `spec-setup` 步骤(stage=`spec-setup`,无 decision)。确保下游 analyze/plan/execute 可获得项目约束规则注入
373
385
  1. **起点**:从 `session.lifecycle_position` 开始
374
386
  2. **跳过已完成**:跳过当前 milestone+phase 下已有 completed artifact 的 stage(按 `session.phase` 过滤);unified 按 milestone 过滤
375
387
  3. **quality_mode 过滤**:按 `session.quality_mode` 排除不匹配 stage
376
388
  3.5. **grill auto_confirm 跳过**:`auto_confirm == true` 时删除 `grill` stage(grill 为交互式苏格拉底拷问,不支持自动模式);brainstorm args 不含 `--from grill:*`
389
+ 3.6. **frontend-verify UI 门控**:仅当当前 phase 交付前端(检出 `dashboard/` 目录,或 phase 目标/计划含 UI 关键词 `landing|page|dashboard|frontend|UI|component|界面`)时保留 `frontend-verify` stage + `post-frontend-verify` decision;纯后端 phase 删除该 stage
377
390
  4. **决策节点**:每个 Decision after 非空的 stage 之后插入 `{ decision: "<gate>", retry_count: 0, max_retries: 2, command_scope: null, command_path: null }`
378
391
  5. **goal-audit 插入**:`task_decomposition` 存在时,在最后一个 evidence-producing stage(execute/review/test)之后、`milestone-complete` 之前插入 `decision:post-goal-audit`
379
392
  6. **终点硬约束**:chain 以 `milestone-complete` 结尾
@@ -388,13 +401,16 @@ Generate steps from `session.lifecycle_position` to `milestone-complete`.
388
401
  - **不在 build 阶段读取 .md 内容**;`<required_reading>` / `<deferred_reading>` 解析与加载由 `maestro ralph next` CLI 在执行期完成
389
402
  10. **每个 step 初始化** `completion_confirmed: false`, `completion_status: null`, `completion_evidence: null`, `deferred_reads: []`, `load: null`(由 `ralph next` 写入)
390
403
  11. **scope_verdict gating**(仅当 chain 起点 = `analyze-macro`):
391
- - `scope_verdict {medium, small}` → 跳过 `roadmap` + `analyze` 两 stage;`plan` 选 standalone 列(`--from analyze:{analyze_macro_id}`),不带 `{phase}`
392
- - `scope_verdict == large` 保留 `roadmap` + `analyze`;`plan` 选 phase 列(`{phase}`)
393
- - `scope_verdict == unknown` → 默认 large 路径;由 `post-analyze-scope` 决策节点在 macro analyze 完成后纠正(A_APPLY_SCOPE_VERDICT)
404
+ - `scope_verdict == large` **且** `wants_roadmap`保留 `roadmap` + `analyze`;`plan` 选 phase 列(`{phase}`)
405
+ - 其余(`medium` / `small`,或 `large` 但非 `wants_roadmap`)→ 跳过 `roadmap` + `analyze` 两 stage;`plan` 选 standalone 列(`--from analyze:{analyze_macro_id}`),不带 `{phase}`
406
+ - `scope_verdict == unknown` → 默认 standalone(非 roadmap)路径;由 `post-analyze-scope` 决策节点在 macro analyze 完成后纠正(A_APPLY_SCOPE_VERDICT)
394
407
  12. **--from 自动注入**:
395
408
  - `analyze_macro_id` 存在且当前 step 是 `roadmap` → args 改为 `--from analyze:{analyze_macro_id}`
396
- - `analyze_macro_id` 存在且 `scope_verdict {medium, small}` 且当前 step `plan` args 改为 `--from analyze:{analyze_macro_id}`
409
+ - `analyze_macro_id` 存在且当前 `plan` step 处于 standalone 列(即非 wants_roadmap 路径:`medium`/`small`,或 `large` 但非 `wants_roadmap`)→ args 改为 `--from analyze:{analyze_macro_id}`
397
410
  - `blueprint_id` 存在 → 当前 step 是 `plan` → args 改为 `--from blueprint:{blueprint_id}`(优先级低于 phase 数字参数)
411
+ - **phase-level deferred chaining**(独立模式,step 含 `{phase}` 占位符):build 阶段前序 artifact 尚未产出,由 A_RESOLVE_ARGS(ralph-execute)运行时从 state.json 查找同 phase+milestone 最新 completed artifact 注入:
412
+ - `plan` step → `--from analyze:{phase_analyze_id}`,写 `source_artifact_ref`
413
+ - `execute` step → `--dir {plan_path}`(现有逻辑),写 `source_artifact_ref = "plan:{id}"`
398
414
  - 写入 `step.source_artifact_ref` 以便审计
399
415
  13. **D-007 Milestone-ref 标注**:每个含 `{phase}` 占位符的 step → `step.milestone_id = session.milestone`(由 A_RESOLVE_PHASE 反查得出),禁止读 `current_milestone`
400
416
  14. **动态插入步骤**(A_APPLY_*)同样应用规则 7-13
@@ -404,7 +420,7 @@ Generate steps from `session.lifecycle_position` to `milestone-complete`.
404
420
  1. Validate: 所有 step 的 `command_scope != "missing"`;否则 raise E006 + 列出缺失 skill
405
421
  2. Write `.workflow/.maestro/ralph-{YYYYMMDD-HHmmss}/status.json` (Appendix: Session Schema)
406
422
  3. Display chain overview:每步显示 `{index}. {skill} [{type}] [{command_scope}]`
407
- 4. If `task_decomposition` present: display **Goal Prompt block** (Appendix),不阻塞流程,继续 handoff
423
+ 4. **Goal Prompt 显示(强制)**:`task_decomposition` 存在时,chain overview 之后**必须逐字显示** Goal Prompt blockAppendix),不得省略或摘要。显示后继续 handoff,不阻塞
408
424
 
409
425
  ### A_DELEGATE_EVALUATE
410
426
 
@@ -417,6 +433,7 @@ Generate steps from `session.lifecycle_position` to `milestone-complete`.
417
433
  | post-business-test | .tests/auto-test/report.json |
418
434
  | post-review | review.json |
419
435
  | post-test | uat.md, .tests/test-results.json |
436
+ | post-frontend-verify | e2e-results.json |
420
437
  4. Check artifact for confidence section → include as signal
421
438
  5. Execute delegate (run_in_background, STOP, wait for callback):
422
439
  ```
@@ -518,14 +535,14 @@ Runs only when `task_decomposition` present.
518
535
 
519
536
  由 `post-analyze-scope` 触发,依据 `session.scope_verdict` 重塑下游链路。
520
537
 
521
- 1. 读 `session.scope_verdict`
522
- 2. 路径 A(`large`):保持当前链;为后续 `roadmap` step 注入 `--from analyze:{analyze_macro_id}`;为后续 `plan` step 选 phase 列;继续推进
523
- 3. 路径 B(`medium` / `small`):
538
+ 1. 读 `session.scope_verdict` + `session.wants_roadmap`
539
+ 2. 路径 A(`large` `wants_roadmap`):保持当前链(roadmap+analyze);为后续 `roadmap` step 注入 `--from analyze:{analyze_macro_id}`;为后续 `plan` step 选 phase 列;继续推进
540
+ 3. 路径 B(`medium` / `small`,或 `large` 但非 `wants_roadmap`):
524
541
  - 删除 `goal-audit` 之前所有未完成的 `roadmap` + `analyze` (phase) step
525
542
  - 把下一个未完成的 `plan` step 改为 `maestro-plan --from analyze:{analyze_macro_id}`,去掉 `{phase}`,`source_artifact_ref = analyze:{analyze_macro_id}`
526
543
  - 后续 `execute` 等沿用同一 standalone scope(不带 `{phase}`,由 plan 写出的 task 列表驱动)
527
544
  4. 路径 C(`unknown`):
528
- - 非 auto_confirm → ask_question 二选一(large / medium-small);auto_confirm → 默认 large
545
+ - 非 auto_confirm → ask_question 二选一(roadmap 多发布 / 单一计划);auto_confirm → 默认路径 B(单一计划,不引入 roadmap)
529
546
  5. Reindex steps,标 decision completed,write status.json
530
547
  6. Display: ◆ Scope verdict: {verdict} → {kept|collapsed to standalone via analyze:{ANL_ID}}
531
548
 
@@ -575,6 +592,7 @@ Runs only when `task_decomposition` present.
575
592
  "quality_mode": "standard", // "full" | "standard" | "quick"
576
593
  "planning_mode": "independent", // "unified" | "independent"
577
594
  "scope_verdict": null, // "large" | "medium" | "small" | "unknown" | null
595
+ "wants_roadmap": false, // roadmap opt-in:--roadmap | 多发布 intent | roadmap.md 已存在
578
596
  "analyze_macro_id": null, // "ANL-xxx" 来自最新 macro analyze
579
597
  "blueprint_id": null, // "BLP-xxx" 若存在
580
598
  "cli_tool": "claude", "passed_gates": [],
@@ -666,6 +684,15 @@ quality-test {phase}
666
684
  decision:post-test {retry+1}
667
685
  ```
668
686
 
687
+ **post-frontend-verify:** (UI 写端点未接线/不可用时)
688
+ ```
689
+ quality-debug --from-frontend-verify "{gap_summary}"
690
+ maestro-plan --gaps {phase}
691
+ maestro-execute {phase}
692
+ quality-test {phase} --frontend-verify
693
+ decision:post-frontend-verify {retry+1}
694
+ ```
695
+
669
696
  **post-goal-audit:** (per unmet sub-goal group)
670
697
  ```
671
698
  # for each unmet sub-goal G{n}, scoped to target_phase:
@@ -682,7 +709,11 @@ decision:post-goal-audit {retry+1}
682
709
  ```
683
710
  📋 任务分解完成。可随时复制以下 /goal 设定终止条件(执行过程中输入即可):
684
711
 
685
- /goal 直到 {session_dir}/status.json 的 task_decomposition[*] 与 steps[*] 全部 completion_confirmed=true 才停。每轮以 status.json 为唯一行动手册,通过 /maestro-ralph-execute 推进 step;decision 节点由其自动 handoff 回 ralph 评估。禁止手动执行 skill 或修改 boundary_contract.out_of_scope。
712
+ /goal 完成以下子目标:
713
+ {for each G in task_decomposition:}
714
+ - {G.id}: {G.goal} — 完成条件: {G.done_when}
715
+ {end for}
716
+ 直到 {session_dir}/status.json 的 task_decomposition[*] 与 steps[*] 全部 completion_confirmed=true 才停。每轮以 status.json 为唯一行动手册,通过 /maestro-ralph-execute 推进 step;decision 节点由其自动 handoff 回 ralph 评估。禁止手动执行 skill 或修改 boundary_contract.out_of_scope。
686
717
  ```
687
718
 
688
719
  `/goal` 由用户输入;ralph 输出提示词后继续 handoff,不阻塞。
@@ -710,12 +741,13 @@ decision:post-goal-audit {retry+1}
710
741
  - [ ] Intent overrides 识别 grill / brainstorm / blueprint / analyze-macro
711
742
  - [ ] auto_confirm=true 时 grill stage 跳过(交互式拷问不支持自动模式)
712
743
  - [ ] A_RESOLVE_SCOPE_VERDICT 读 macro analyze conclusions.scope_verdict,写入 session.scope_verdict + analyze_macro_id
713
- - [ ] 链路起点 = analyze-macro 时:large→roadmap+analyze+plan(phase)medium/small→直跳 plan --from analyze:{ANL_ID}(跳过 roadmap+analyze)
744
+ - [ ] 链路起点 = analyze-macro 时:large+wants_roadmap→roadmap+analyze+plan(phase);其余(含 large 默认/medium/small)→直跳 plan --from analyze:{ANL_ID}(跳过 roadmap+analyze)
714
745
  - [ ] post-analyze-scope decision 节点在 macro analyze 之后插入;A_SCOPE_EVALUATE/A_APPLY_SCOPE_VERDICT 重塑链路
715
746
  - [ ] plan step args 支持三路径:`{phase}` / `--from analyze:{ANL_ID}` / `--from blueprint:{BLP_ID}`,写入 step.source_artifact_ref
716
747
  - [ ] roadmap step args 自动注入 `--from analyze:{analyze_macro_id}`(若存在)
717
748
  - [ ] artifact 过滤按 session.phase;unified 按 milestone
718
749
  - [ ] quality_mode 由 A_DETERMINE_QUALITY_MODE 决定,过滤 build steps
750
+ - [ ] frontend-verify stage 仅在 phase 交付 UI 时插入(test 后、milestone-audit 前);post-frontend-verify 走 quality-gate 评估,evidence=e2e-results.json
719
751
  - [ ] Decomposition: broad intent ≤3 question clarify;narrow auto-derive
720
752
  - [ ] status.json 唯一真源:boundary_contract + execution_criteria + task_decomposition;无外部清单
721
753
  - [ ] 执行 step 含 `command_scope` + `command_path`(通过 `maestro ralph skills --platform agy --json --quiet` 预校验,project 覆盖 global);decision step 通过 `step.decision` 字段标识
@@ -725,8 +757,12 @@ decision:post-goal-audit {retry+1}
725
757
  - [ ] post-goal-audit decision 仅在 decomposed 时插入,位于 milestone-complete 之前
726
758
  - [ ] Unmet sub-goals 动态 grow steps[](goal_ref tagged);max retries → escalate
727
759
  - [ ] planning_mode 显式决定;unified=无 `{phase}`, independent=带 `{phase}`
760
+ - [ ] specs 预检:lifecycle_position 在 init 之后 + `.workflow/specs/` 不存在 → 链路最前面插入 `spec-setup`
728
761
  - [ ] Chain 必须以 `milestone-complete` 结尾
729
762
  - [ ] Decision nodes 由 maestro delegate --role analyze 评估
730
763
  - [ ] Ralph 不执行 step,只 evaluate;Skill("maestro-ralph-execute") handoff
764
+ - [ ] Phase-level deferred chaining:plan/execute step 的 `--from`/`--dir` 注入由 A_RESOLVE_ARGS(ralph-execute)运行时完成;build 阶段标记意图,不预知 artifact ID
765
+ - [ ] Phase-level plan step 运行时获得 `--from analyze:{phase_analyze_id}`(由 ralph-execute 从 state.json 查找注入)
766
+ - [ ] Phase-level execute step 运行时获得 `source_artifact_ref = "plan:{id}"`
731
767
 
732
768
  </appendix>
@@ -51,6 +51,7 @@ HARD RULES:
51
51
  7. **status.json 每步骤后由 CLI 原子写盘** — resume-safe
52
52
  8. **STATUS 枚举受限** — 仅 `DONE | DONE_WITH_CONCERNS | NEEDS_RETRY | BLOCKED`;`NEEDS_CONTEXT` 已废除
53
53
  9. **CLI 输出禁止截断** — `maestro ralph next` 的 stdout 包含完整 skill prompt,必须全量捕获。**严禁** `| head`、`| tail`、`2>&1 | head -N` 等任何截断管道。Bash timeout 可加长但不可截断输出
54
+ 10. **禁止以上下文消耗为由中断自调用链** — harness 自动处理 context compression(消息摘要),模型无需判断上下文剩余空间。自调用链的唯一合法终止条件是:全部 `completion_confirmed`、session paused、或 decision handoff 到 ralph。以"上下文不足"、"已连续完成 N 个 step"、"避免 context overflow"等理由中断属于 invariant violation
54
55
  </invariants>
55
56
 
56
57
  <state_machine>
@@ -131,19 +132,44 @@ S_FALLBACK:
131
132
  | maestro-brainstorm | topic | `"{intent}"` |
132
133
  | maestro-roadmap | description | `"{intent}"` |
133
134
  | maestro-analyze | phase or topic | `{phase}` or `"{intent}"` |
134
- | maestro-plan | phase or --dir | `{phase}`, or `--dir {scratch_dir}` |
135
- | maestro-execute | phase or --dir | `{phase}`, or `--dir {scratch_dir}` |
135
+ | maestro-plan | phase, --from, or --dir | see --from auto-injection below |
136
+ | maestro-execute | phase or --dir | see --from auto-injection below |
136
137
  | quality-debug | gap context | Read previous step's error/gap |
137
138
  | quality-* | phase | `{phase}` |
138
139
 
139
- **Artifact dir resolution for --dir:**
140
+ **--from auto-injection (phase-level artifact chaining):**
141
+
142
+ Phase-level steps 在 build 阶段无法预知前序 artifact ID。A_RESOLVE_ARGS 运行时从 state.json 查找并注入显式引用,打通 analyze→plan→execute 数据管道:
143
+
140
144
  ```
141
- Read state.json filter artifacts by milestone + phase
142
- plan commands: latest type=="analyze" --dir .workflow/scratch/{path}
143
- execute commands: latest type=="plan" → --dir .workflow/scratch/{path}
145
+ Read state.json.artifacts(含 milestone_history 内归档 artifacts
146
+ filter by milestone={session.milestone} + phase={session.phase} + status=="completed"
147
+
148
+ plan step(含 {phase} 占位符,args 无 --from 且无 --dir):
149
+ 1. 查同 phase+milestone 最新 completed type=="analyze" artifact → id = ANL-xxx
150
+ 2. 命中 → args 追加 --from analyze:{id}
151
+ 3. 写 step.source_artifact_ref = "analyze:{id}"
152
+
153
+ execute step(含 {phase} 占位符,args 无 --dir):
154
+ 1. 查同 phase+milestone 最新 completed type=="plan" artifact → id = PLN-xxx, path = scratch/...
155
+ 2. 命中 → args 追加 --dir .workflow/scratch/{path}
156
+ 3. 写 step.source_artifact_ref = "plan:{id}"
144
157
  ```
145
158
 
146
- Write enriched args back to status.json.
159
+ 兜底:查询无结果 不注入,由命令自身 discovery 逻辑处理。已有 `--from` 或 `--dir` 的 step 不覆盖。
160
+
161
+ **Goal context injection:**
162
+
163
+ 当 step.goal_ref 非空且 session.task_decomposition 存在时:
164
+ ```
165
+ goal = session.task_decomposition.find(g => g.id == step.goal_ref)
166
+ if goal:
167
+ goal_snippet = { id: goal.id, goal: goal.goal, done_when: goal.done_when,
168
+ boundary: goal.boundary, evidence: goal.evidence }
169
+ → 传递给 A_EXEC_STEP 用于 inline execution 前注入(见 step 2 goal context pre-injection)
170
+ ```
171
+
172
+ Write enriched args + source_artifact_ref back to status.json.
147
173
 
148
174
  ### A_EXEC_DECISION
149
175
 
@@ -159,13 +185,24 @@ Write enriched args back to status.json.
159
185
  - 退出码 2 → 交给 S_LOCATE
160
186
  - 退出码 3 → active_step_index 已被占用
161
187
  - 退出码 1 → pause session
162
- 2. **Inline execution** — stdout 执行;deferred_reading 按需 Read
163
- 3. **Complete**:
188
+ 2. **Goal context pre-injection** — A_RESOLVE_ARGS 产出了 `goal_snippet`(step.goal_ref 非空),在 ralph next stdout prompt **顶部前置**以下 block,使执行命令感知当前子目标和执行约束:
189
+ ```
190
+ <goal_context>
191
+ Sub-goal: {goal.id} — {goal.goal}
192
+ Done when: {goal.done_when}
193
+ Boundary: {goal.boundary}
194
+ Evidence target: {goal.evidence}
195
+ Execution criteria: {session.execution_criteria joined by '; '}
196
+ </goal_context>
197
+ ```
198
+ 无 goal_snippet 时跳过此步。goal_context block 不替换 ralph next 的 stdout 内容,仅在其前方拼接。
199
+ 3. **Inline execution** — 按 stdout(含 goal_context 前置)执行;deferred_reading 按需 Read
200
+ 4. **Complete**:
164
201
  - `run_command("maestro ralph complete N --status DONE [--evidence <path>]")`
165
202
  - `run_command("maestro ralph complete N --status DONE_WITH_CONCERNS --concerns \"...\"")`
166
203
  - `run_command("maestro ralph retry N")`
167
204
  - `run_command("maestro ralph complete N --status BLOCKED --reason \"...\"")`
168
- 4. **Propagate context signals** — 关键信号 (`PHASE: N` / `scratch_dir: path` / `BLP-xxx`) 写入 `status.json.context`
205
+ 5. **Propagate context signals** — 关键信号 (`PHASE: N` / `scratch_dir: path` / `BLP-xxx`) 写入 `status.json.context`
169
206
 
170
207
  完成后 S_LOCATE 触发 `view_file(AbsolutePath="<agy-skills-dir>/maestro-ralph-execute/SKILL.md") + execute inline` 自调用。
171
208
 
@@ -241,5 +278,10 @@ Display: `[{index}/{total}] ✗ {step.skill} 失败,会话已暂停。/maestro
241
278
  - [ ] Context signals 由执行 step 显式写回 status.json.context(非 ralph-execute 内嵌扫描)
242
279
  - [ ] Auto mode: retry 一次后 pause;interactive 提供 retry/skip/abort
243
280
  - [ ] 自调用持续到全部 completion_confirmed 或 paused
281
+ - [ ] --from auto-injection:phase-level plan step 运行时从 state.json 查找同 phase+milestone 最新 completed analyze artifact → 注入 `--from analyze:{id}`,写 `source_artifact_ref`
282
+ - [ ] --from auto-injection:phase-level execute step 运行时查找同 phase+milestone 最新 completed plan artifact → 注入 `--dir`,写 `source_artifact_ref`
283
+ - [ ] Goal context injection:step.goal_ref 非空时从 task_decomposition 提取 goal_snippet,A_EXEC_STEP 在 ralph next stdout 顶部前置 `<goal_context>` block
284
+ - [ ] Goal context 包含 sub-goal description、done_when、boundary、evidence、execution_criteria
285
+ - [ ] 已有 `--from` 或 `--dir` 的 step 不被 auto-injection 覆盖
244
286
 
245
287
  </appendix>
@@ -46,6 +46,7 @@ Follow '~/.maestro/workflows/harvest.md' Stages 1-8 in order.
46
46
  2. **Dedup before write** — check harvest-log.jsonl and existing stores before each write.
47
47
  3. **Never modify source artifacts** — harvest is purely extractive.
48
48
  4. **Dedup contract with parallel writers** — when appending to `issues.jsonl`, set `source: "harvest"` on each row so concurrent writers (e.g. `manage-issue-discover` with `source: "discover"`) can be distinguished and deduplicated.
49
+ 5. **Conflict pre-check on spec routing** — when routing to spec (Stage 6b), compare new entry against existing specs with same keywords/category. If semantic conflict detected, set `confidence="low"` on the new entry and log conflict note. Use `maestro spec conflict mark` if contradiction is clear.
49
50
 
50
51
  Extraction patterns, classification rules, routing infrastructure, and fragment ID scheme defined in workflow harvest.md.
51
52
 
@@ -60,6 +61,8 @@ Extraction patterns, classification rules, routing infrastructure, and fragment
60
61
  | Wiki graph needs linking | `/manage-wiki connect --fix` |
61
62
  | Issues created | `/manage-issue list --source harvest` |
62
63
  | Specs extracted | `/spec-load --role implement` |
64
+ | Specs extracted (冲突审查) | `/manage-knowledge-audit --scope spec` — 新写入的 spec 可能与现有条目矛盾 |
65
+ | Spec 冲突标记已存在 | `maestro spec conflict list` — 查看当前冲突状态 |
63
66
  | Full phase retrospective | `/quality-retrospective` |
64
67
  </completion>
65
68
 
@@ -45,10 +45,12 @@ Follow `~/.maestro/workflows/knowledge-audit.md` Stages 1-8 in order.
45
45
  **GATE 1: Load → Detect** (Stages 1-2 → Stage 4)
46
46
  - REQUIRED: Scope 解析通过,互斥标志校验完成。
47
47
  - REQUIRED: 三存储按 scope 加载完成。
48
+ - REQUIRED: 加载已有冲突标记: `maestro spec conflict list` → 合并到 finding 池。
48
49
  - BLOCKED if scope 非法或存储不可读: E001/E002。
49
50
 
50
51
  **GATE 2: Detect → Decision** (Stage 4 → Stage 5)
51
52
  - REQUIRED: Finding 池按 P0/P1/P2 分级输出。
53
+ - REQUIRED: 已标记 `contested` 的条目自动归入 P0 finding(来源: conflict-marker)。
52
54
  - REQUIRED: 未 harvest 的 artifact 删除前触发抢救确认(W002)。
53
55
  - BLOCKED if finding 为空: 无需淘汰,直接输出报告。
54
56
 
@@ -63,6 +65,31 @@ Follow `~/.maestro/workflows/knowledge-audit.md` Stages 1-8 in order.
63
65
  - **Deprecate over delete**: 文本存储首选 `status="deprecated"`,保留历史。
64
66
  - **Purge 仅 artifact**: `--purge` 不作用于 spec/knowhow。
65
67
  - **Rescue before delete**: 未抽取 artifact 删除前强制提示先 `/manage-harvest`。
68
+
69
+ ### Conflict Resolution Integration
70
+
71
+ 四态决策(扩展自三态 keep/deprecate/delete):
72
+
73
+ | 动作 | 适用场景 | 执行 |
74
+ |------|---------|------|
75
+ | `keep` | 内容正确,无需变更 | 写 audit-log ignore 记录 |
76
+ | `contest` | 矛盾真实存在,需进一步审查 | `maestro spec conflict mark <file> <line> --note "<evidence>"` |
77
+ | `deprecate` | 内容过时或被取代 | 注入 `status="deprecated"` + `maestro spec conflict clear <file> <line>` |
78
+ | `delete` | 内容明确错误 | 移除 entry + `maestro spec conflict clear <file> <line>` |
79
+
80
+ **关键**: deprecate/delete 执行时,如果目标条目有 conflict-marker,必须同步调用 `maestro spec conflict clear` 清除标记,避免悬空冲突。
81
+
82
+ ### Code-as-Truth 校验(审查核心原则)
83
+
84
+ **代码是唯一真理源。** Spec/knowhow 中的任何声明,必须与代码实际行为一致。
85
+
86
+ 当 detector 发现 spec 条目声称某行为/规则时:
87
+ 1. **代码校验**: grep/read 代码中相关实现,确认 spec 声明是否与代码一致
88
+ 2. **不一致处理**:
89
+ - 代码正确、spec 过时 → `deprecate` 或 `delete` spec 条目
90
+ - 代码正确、spec 不完整 → `contest` 并建议补充
91
+ - 代码有 bug、spec 正确 → `keep` spec,生成 issue 修代码
92
+ 3. **禁止**: 仅凭 spec 文本判断正确性。每个 finding 的 evidence 必须包含代码引用(文件:行号)
66
93
  </execution>
67
94
 
68
95
  <completion>
@@ -73,6 +100,8 @@ Follow `~/.maestro/workflows/knowledge-audit.md` Stages 1-8 in order.
73
100
  | 复审淘汰记录 | 查看 `audit-report-{date}.md` |
74
101
  | 抢救未抽取 artifact | `/manage-harvest <artifact-id>` |
75
102
  | 验证 spec 现状 | `/spec-load --role implement` |
103
+ | 查看冲突标记 | `maestro spec conflict list` |
104
+ | 清除已解决冲突 | `maestro spec conflict clear-all <file>` |
76
105
  | 周期巡检 | `--scope all --report` |
77
106
  </completion>
78
107
 
@@ -57,6 +57,8 @@ Treats every bug as a learning signal with exhaustive iteration until root cause
57
57
  - 关键判断用不同 `--role`(analyze / review / explore)获取多视角
58
58
  - 修复前后各做一次 CLI review 确认
59
59
  - 不同阶段可调用不同工具,综合多方意见再行动
60
+
61
+ 4. **禁止以上下文消耗为由中断** — harness 自动处理 context compression,以"上下文不足"或"已执行 N 个阶段"为由中断属于纪律违反;必须完整走完状态机直到 S_RECORD → END
60
62
  </execution_discipline>
61
63
 
62
64
  <context>
@@ -392,7 +394,11 @@ Goals: {done}/{total} confirmed ({skipped} skipped)
392
394
  ```
393
395
  📋 Debug Odyssey 会话已创建。可随时复制以下 /goal 设定终止条件:
394
396
 
395
- /goal 穷尽迭代:直到根因确认(或明确 INCONCLUSIVE)且修复验证通过
397
+ /goal 完成以下目标:
398
+ {for each G in phase_goals where status != "skipped":}
399
+ - {G.id}: {G.goal} — 完成条件: {G.done_when}
400
+ {end for}
401
+ 穷尽迭代:直到根因确认(或明确 INCONCLUSIVE)且修复验证通过
396
402
  且泛化扫描穷尽(所有 hits 已分类处理)且 phase_goals_all_done=true 才停。
397
403
  假设失败时扩范围→换视角→升级工具,不轻易放弃。
398
404
  泛化发现的同类 bug 全部修复或创建 issue,不允许遗留。
@@ -47,6 +47,8 @@ Baseline-first approach with exhaustive iteration until zero remaining actionabl
47
47
  - survey 阶段: `--role explore` 发现依赖/复杂度热点
48
48
  - audit/diagnose: `--role analyze` 获取多视角分析
49
49
  - fix 前后: `--role review` 确认改进正确性
50
+
51
+ 4. **禁止以上下文消耗为由中断** — harness 自动处理 context compression,以"上下文不足"或"已执行 N 个阶段"为由中断属于纪律违反;必须完整走完状态机直到 S_RECORD → END
50
52
  </execution_discipline>
51
53
 
52
54
  <context>
@@ -431,7 +433,11 @@ Goals: {done}/{total} ({skipped} skipped)
431
433
  ```
432
434
  📋 Improve Odyssey 会话已创建。可随时复制以下 /goal 设定终止条件:
433
435
 
434
- /goal 穷尽迭代:直到 session.json 的 audit_result 中所有 findings 均已处理(fix/issue/decision)
436
+ /goal 完成以下目标:
437
+ {for each G in phase_goals where status != "skipped":}
438
+ - {G.id}: {G.goal} — 完成条件: {G.done_when}
439
+ {end for}
440
+ 穷尽迭代:直到 session.json 的 audit_result 中所有 findings 均已处理(fix/issue/decision)
435
441
  且 phase_goals_all_done=true 才停。修复按 severity 逐轮迭代,每轮修复后 re-verify 修改区域。
436
442
  Baseline metrics 必须在修复前采集,修复后必须与 baseline 对比确认改进。
437
443
  遇到 phase=decision 的 pending 必须 ask_question。不允许"只报告不处理"。
@@ -56,6 +56,8 @@ plan → execute → verify → fix gaps → iterate until ALL criteria pass.
56
56
  - 计划阶段: `--role analyze` 获取任务分解建议
57
57
  - 修复前后: `--role review` 确认无回归
58
58
  - verify 阶段: cli-review 类型标准自动 delegate
59
+
60
+ 4. **禁止以上下文消耗为由中断** — harness 自动处理 context compression,以"上下文不足"或"已执行 N 个阶段"为由中断属于纪律违反;必须完整走完状态机直到 S_RECORD → END
59
61
  </execution_discipline>
60
62
 
61
63
  <context>
@@ -515,7 +517,15 @@ Write understanding.md §6, generalization_stats. Mark G5 done.
515
517
  ```
516
518
  📋 Planex Odyssey 会话已创建。可随时复制以下 /goal 设定终止条件(执行过程中输入即可):
517
519
 
518
- /goal 穷尽迭代:直到 acceptance_criteria[*] 全部 status==passed
520
+ /goal 完成以下目标:
521
+ {for each G in phase_goals where status != "skipped":}
522
+ - {G.id}: {G.goal} — 完成条件: {G.done_when}
523
+ {end for}
524
+ 验收标准:
525
+ {for each AC in acceptance_criteria:}
526
+ - {AC.id}: {AC.criterion} (验证方式: {AC.verify_method})
527
+ {end for}
528
+ 穷尽迭代:直到 acceptance_criteria[*] 全部 status==passed
519
529
  且 phase_goals_all_done=true 才停。verify 失败自动 fix→re-verify 循环。
520
530
  每轮修复后重新验证,新发现的标准违反继续修,不超过 max_iterations。
521
531
  遇到 phase=decision 的 pending 必须 ask_question,不得自行 resolve。
@@ -46,6 +46,8 @@ fix ALL findings → confirm → generalize → discover → persist. Zero-resid
46
46
  3. **多 CLI 辅助** — 利用 `maestro delegate` 调用多个 CLI 工具交叉验证
47
47
  - 关键判断用不同 `--role`(analyze / review / explore)获取多视角
48
48
  - 修复前后各做一次 CLI review 确认
49
+
50
+ 4. **禁止以上下文消耗为由中断** — harness 自动处理 context compression,以"上下文不足"或"已执行 N 个阶段"为由中断属于纪律违反;必须完整走完状态机直到 S_RECORD → END
49
51
  </execution_discipline>
50
52
 
51
53
  <context>
@@ -366,7 +368,11 @@ Goals: {done}/{total} ({skipped} skipped)
366
368
  ```
367
369
  📋 Review-Test-Fix Odyssey 会话已创建。可随时复制以下 /goal 设定终止条件(执行过程中输入即可):
368
370
 
369
- /goal 穷尽迭代:直到 session.json 的 review_result.remaining_actionable == 0
371
+ /goal 完成以下目标:
372
+ {for each G in phase_goals where status != "skipped":}
373
+ - {G.id}: {G.goal} — 完成条件: {G.done_when}
374
+ {end for}
375
+ 穷尽迭代:直到 session.json 的 review_result.remaining_actionable == 0
370
376
  且 confirmation.verdict == "confirmed" 且 phase_goals_all_done == true 才停。
371
377
  修复按 severity 逐轮迭代(critical→high→medium→low),每轮修复后 re-review 修改区域。
372
378
  发现新问题追加到当前轮继续。遇到 phase=decision 的 pending 必须 ask_question。
@@ -47,6 +47,8 @@ fix → verify → generalize → discover → persist. Every pixel is a learnin
47
47
  - survey 阶段: `--role explore` 发现设计系统用法
48
48
  - audit/diverge: `--role analyze` 获取多视角创意
49
49
  - fix 前后: `--role review` 确认视觉正确性
50
+
51
+ 4. **禁止以上下文消耗为由中断** — harness 自动处理 context compression,以"上下文不足"或"已执行 N 个阶段"为由中断属于纪律违反;必须完整走完状态机直到 S_RECORD → END
50
52
  </execution_discipline>
51
53
 
52
54
  <context>
@@ -391,7 +393,11 @@ Goals: {done}/{total} ({skipped} skipped)
391
393
  ```
392
394
  📋 UI Odyssey 会话已创建。可随时复制以下 /goal 设定终止条件(执行过程中输入即可):
393
395
 
394
- /goal 穷尽迭代:直到 session.json 的 audit + diverge findings 均已处理(fix/issue/decision)
396
+ /goal 完成以下目标:
397
+ {for each G in phase_goals where status != "skipped":}
398
+ - {G.id}: {G.goal} — 完成条件: {G.done_when}
399
+ {end for}
400
+ 穷尽迭代:直到 session.json 的 audit + diverge findings 均已处理(fix/issue/decision)
395
401
  且 phase_goals_all_done=true 才停。修复按 impact×severity 逐轮迭代。
396
402
  每轮修复后重审修改区域,新发现追加继续修。
397
403
  遇到 phase=decision 的 pending 必须 ask_question。不允许"只报告不处理"。
@@ -52,6 +52,7 @@ Each artifact's type determines its outputs at `.workflow/{a.path}/`:
52
52
  - Codebase docs: `.workflow/codebase/ARCHITECTURE.md` → component boundaries, layer rules
53
53
  - Wiki constraints: `maestro search "architecture constraint" --json` → documented decisions
54
54
  - Specs: `maestro spec load --category review` → review standards, checklists, knowhow tools
55
+ - Conflict state: `maestro spec conflict list` → 当前已标记冲突的 spec 条目(review 时优先关注)
55
56
  - Role knowledge: `maestro search --category review` → select relevant → `maestro wiki load`
56
57
 
57
58
  **Output**: `REVIEW_DIR = .workflow/scratch/{YYYYMMDD}-review-P{N}-{slug}/` (P{N} = phase number, enables directory-level identification as state.json fallback)
@@ -75,6 +76,7 @@ Follow '~/.maestro/workflows/review.md' completely.
75
76
  - REQUIRED: review.json written with findings, severity distribution, and verdict.
76
77
  - REQUIRED: Issues auto-created based on level thresholds.
77
78
  - REQUIRED: index.json updated with review status.
79
+ - REQUIRED: Spec conflict check — if any finding directly contradicts a loaded spec entry (code behavior ≠ spec rule), suggest `maestro spec conflict mark` on the spec entry. Code is the single source of truth.
78
80
 
79
81
  **Output writes to REVIEW_DIR** (not EXEC_DIR):
80
82
  - `REVIEW_DIR/review.json` — findings, severity distribution, verdict
@@ -129,6 +131,7 @@ maestro ralph complete <idx> --status {STATUS} [--evidence {path}]
129
131
  | PASS verdict | `/quality-test {phase}` |
130
132
  | WARN verdict (non-blocking issues) | `/quality-test {phase}` (proceed with caveats) |
131
133
  | BLOCK verdict (critical findings) | `/maestro-plan {phase} --gaps` (fix first) |
134
+ | Spec contradictions found | `maestro spec conflict list` → `/manage-knowledge-audit --scope spec` |
132
135
  | Want code cleanup | `/quality-refactor {phase}` |
133
136
  </completion>
134
137
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: quality-test
3
3
  description: Use when implementation needs user acceptance testing with interactive verification and gap closure
4
- argument-hint: [phase] [--smoke] [--auto-fix]
4
+ argument-hint: [phase] [--smoke] [--auto-fix] [--frontend-verify]
5
5
  allowed-tools:
6
6
  - ask_question
7
7
  - define_subagent
@@ -29,6 +29,31 @@ Flags, artifact context resolution, and output directory format defined in workf
29
29
  </context>
30
30
 
31
31
  <execution>
32
+ **Mode select:** `--frontend-verify` → 走下方 **Frontend Verify Mode**(确定性浏览器 smoke,**不是**对话式 UAT);否则 Follow '~/.maestro/workflows/test.md' completely.
33
+
34
+ ### Frontend Verify Mode (`--frontend-verify`)
35
+
36
+ 补 ralph 链路缺失的运行时可用性门:确定性验证每个用户可观测能力真正经 UI 可触发,避免"后端绿灯=完成"。
37
+
38
+ 1. **Resolve targets**: 读 phase 的 `plan.json` / `.task/TASK-*.json`,提取所有 `[UI-observable]` convergence.criteria(plan 阶段产出);缺失则枚举后端写端点(POST/PUT/PATCH/DELETE)作为待验证清单。
39
+ 2. **Start app**: `next start`(或从 dashboard/package.json 解析的既有启动脚本);启动失败 → E003。
40
+ 3. **Drive browser**: 用 chrome-devtools MCP(`mcp__claude_dms3-chrome-devtools__*`:navigate / click / fill / take_snapshot / list_network_requests)逐条执行每个 `[UI-observable]` 流程,断言:UI 入口存在且可触发 → 对应写请求返回 2xx → DOM 出现预期结果。
41
+ 4. **Write evidence**: 产出 `e2e-results.json`(结构见下),逐条记 pass/fail + 证据(网络状态码、快照引用)。**确定性断言,禁止"无人应答=全过"**。
42
+ 5. **Verdict**: 任一 `[UI-observable]` fail 或写端点无 UI 入口 → STATUS=NEEDS_RETRY(ralph 经 post-frontend-verify 触发 Fix-Loop);全过 → DONE。
43
+
44
+ ```json
45
+ // e2e-results.json
46
+ { "phase": "{phase}", "app_url": "http://localhost:3000",
47
+ "checks": [ { "criterion": "[UI-observable] ...", "ui_entry": "<selector/route>",
48
+ "request": "POST /api/notes", "status": 201, "dom_assert": "list shows new item",
49
+ "passed": true } ],
50
+ "summary": { "total": 0, "passed": 0, "failed": 0 }, "verdict": "pass|fail" }
51
+ ```
52
+
53
+ Ralph-invoked 完成:`maestro ralph complete <idx> --status {STATUS} --evidence e2e-results.json`。
54
+
55
+ ---
56
+
32
57
  Follow '~/.maestro/workflows/test.md' completely.
33
58
 
34
59
  ### Phase Gates (MANDATORY, BLOCKING)
@@ -146,4 +171,5 @@ maestro ralph complete <idx> --status {STATUS} [--evidence {path}]
146
171
  - [ ] Gaps updated with root_cause, fix_direction, affected_files
147
172
  - [ ] Gap-fix loop triggered if --auto-fix (max 2 iterations)
148
173
  - [ ] Next step routed (phase-transition if pass, verify if auto-fix success, debug --from-uat if issues, test-gen if low coverage)
174
+ - [ ] `--frontend-verify`: 每条 [UI-observable] criterion 经真实浏览器断言,产出 e2e-results.json;任一 fail → NEEDS_RETRY(不放行)
149
175
  </success_criteria>
@@ -190,9 +190,11 @@ All behavioral statements MUST use MUST / SHOULD / MAY / MUST NOT / SHOULD NOT.
190
190
  - [ ] No interrogative sentences (all declarative)
191
191
  - [ ] system-architect: §3 contains "Data Model" and "State Machine" headings
192
192
 
193
- ## Return Protocol
193
+ ## Completion Sequence (MANDATORY ORDER)
194
194
 
195
- Report completion with this structure (the orchestrator reads ONLY this, not the files):
195
+ **Step A Write files**: Use the Write tool to create every file under `output_dir/`. Then verify with Glob that `analysis.md` and each `analysis-F-*.md` exist on disk. If any Write call fails, emit `TASK BLOCKED` and stop.
196
+
197
+ **Step B — Report summary**: ONLY AFTER Step A files are confirmed on disk, emit this text (the orchestrator reads this summary to track progress — it does NOT substitute for the files):
196
198
 
197
199
  ```
198
200
  TASK COMPLETE
@@ -205,7 +207,7 @@ rfc_keyword_count: {N}
205
207
  total_lines: {sum across all files}
206
208
  ```
207
209
 
208
- If blocked: report blocker with `TASK BLOCKED` prefix.
210
+ Never emit `TASK COMPLETE` without files on disk. If blocked: report with `TASK BLOCKED` prefix.
209
211
 
210
212
  ## NEVER
211
213
 
@@ -117,6 +117,7 @@ You are a collaborative planner that works within a pre-allocated task ID range.
117
117
  - Task files must use `convergence.criteria` (array of testable strings), not `done_when`
118
118
  - files must use `[{path, action, target, change}]` format, not `["path"]`
119
119
  - Each task must have convergence.criteria with min 2 testable conditions
120
+ - Vertical slice for UI features: deliver backend + frontend + integration as one end-to-end capability per wave (no backend-only/frontend-only split); each UI delivery wave needs ≥1 task with a `[UI-observable]` convergence criterion (verifiable user-facing flow)
120
121
  - Each task must have `read_first[]` — files the executor MUST read before implementation
121
122
  - `action` must contain concrete values (function signatures, config keys, import paths), not just a verb
122
123
  - Task definitions follow the same schema as workflow-planner output