maestro-flow 0.5.34 → 0.5.36

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 (325) hide show
  1. package/.agents/agents/cli-explore-agent.md +71 -68
  2. package/.agents/agents/workflow-analyzer.md +1 -0
  3. package/.agents/agents/workflow-collab-planner.md +1 -0
  4. package/.agents/agents/workflow-debugger.md +1 -0
  5. package/.agents/agents/workflow-executor.md +1 -0
  6. package/.agents/agents/workflow-planner.md +2 -0
  7. package/.agents/skills/domain-add/SKILL.md +71 -0
  8. package/.agents/skills/maestro/SKILL.md +7 -6
  9. package/.agents/skills/maestro-amend/SKILL.md +0 -2
  10. package/.agents/skills/maestro-analyze/SKILL.md +9 -0
  11. package/.agents/skills/maestro-brainstorm/SKILL.md +10 -1
  12. package/.agents/skills/maestro-collab/SKILL.md +14 -1
  13. package/.agents/skills/maestro-help/SKILL.md +1 -1
  14. package/.agents/skills/maestro-help/index/catalog.json +0 -1
  15. package/.agents/skills/maestro-help/phases/01-parse-intent.md +1 -1
  16. package/.agents/skills/maestro-next/SKILL.md +15 -4
  17. package/.agents/skills/maestro-overlay/SKILL.md +4 -3
  18. package/.agents/skills/maestro-plan/SKILL.md +15 -4
  19. package/.agents/skills/maestro-ralph/SKILL.md +135 -31
  20. package/.agents/skills/maestro-ralph-execute/SKILL.md +51 -10
  21. package/.agents/skills/maestro-tools-register/SKILL.md +0 -6
  22. package/.agents/skills/maestro-ui-codify/SKILL.md +0 -2
  23. package/.agents/skills/manage-kg-extractors/SKILL.md +0 -2
  24. package/.agents/skills/quality-test/SKILL.md +25 -1
  25. package/.agents/skills/spec-load/SKILL.md +0 -1
  26. package/.agents/skills/spec-setup/SKILL.md +0 -1
  27. package/.agents/skills/team-lifecycle-v4/roles/analyst/role.md +13 -7
  28. package/.agents/skills/team-quality-assurance/roles/scout/role.md +15 -11
  29. package/.agents/skills/team-tech-debt/roles/scanner/role.md +1 -1
  30. package/.agents/skills/team-ultra-analyze/roles/explorer/role.md +23 -16
  31. package/.agy/agents/cli-explore-agent.md +71 -68
  32. package/.agy/agents/workflow-analyzer.md +1 -0
  33. package/.agy/agents/workflow-collab-planner.md +1 -0
  34. package/.agy/agents/workflow-debugger.md +1 -0
  35. package/.agy/agents/workflow-executor.md +1 -0
  36. package/.agy/agents/workflow-planner.md +2 -0
  37. package/.agy/skills/domain-add/SKILL.md +68 -0
  38. package/.agy/skills/maestro/SKILL.md +7 -6
  39. package/.agy/skills/maestro-amend/SKILL.md +0 -2
  40. package/.agy/skills/maestro-analyze/SKILL.md +9 -0
  41. package/.agy/skills/maestro-brainstorm/SKILL.md +10 -1
  42. package/.agy/skills/maestro-collab/SKILL.md +14 -1
  43. package/.agy/skills/maestro-help/SKILL.md +1 -1
  44. package/.agy/skills/maestro-help/index/catalog.json +0 -1
  45. package/.agy/skills/maestro-help/phases/01-parse-intent.md +1 -1
  46. package/.agy/skills/maestro-next/SKILL.md +15 -4
  47. package/.agy/skills/maestro-overlay/SKILL.md +4 -3
  48. package/.agy/skills/maestro-plan/SKILL.md +15 -4
  49. package/.agy/skills/maestro-ralph/SKILL.md +135 -31
  50. package/.agy/skills/maestro-ralph-execute/SKILL.md +51 -10
  51. package/.agy/skills/maestro-tools-register/SKILL.md +0 -6
  52. package/.agy/skills/maestro-ui-codify/SKILL.md +0 -2
  53. package/.agy/skills/manage-kg-extractors/SKILL.md +0 -2
  54. package/.agy/skills/quality-test/SKILL.md +25 -1
  55. package/.agy/skills/spec-load/SKILL.md +0 -1
  56. package/.agy/skills/spec-setup/SKILL.md +0 -1
  57. package/.agy/skills/team-lifecycle-v4/roles/analyst/role.md +13 -7
  58. package/.agy/skills/team-quality-assurance/roles/scout/role.md +15 -11
  59. package/.agy/skills/team-tech-debt/roles/scanner/role.md +1 -1
  60. package/.agy/skills/team-ultra-analyze/roles/explorer/role.md +23 -16
  61. package/.claude/agents/cli-explore-agent.md +71 -68
  62. package/.claude/agents/workflow-analyzer.md +1 -0
  63. package/.claude/agents/workflow-collab-planner.md +1 -0
  64. package/.claude/agents/workflow-debugger.md +1 -0
  65. package/.claude/agents/workflow-executor.md +1 -0
  66. package/.claude/agents/workflow-planner.md +2 -0
  67. package/.claude/commands/domain-add.md +69 -0
  68. package/.claude/commands/maestro-amend.md +0 -2
  69. package/.claude/commands/maestro-analyze.md +9 -0
  70. package/.claude/commands/maestro-brainstorm.md +10 -1
  71. package/.claude/commands/maestro-collab.md +14 -1
  72. package/.claude/commands/maestro-next.md +15 -4
  73. package/.claude/commands/maestro-overlay.md +4 -3
  74. package/.claude/commands/maestro-plan.md +15 -4
  75. package/.claude/commands/maestro-ralph-execute.md +51 -10
  76. package/.claude/commands/maestro-ralph.md +135 -31
  77. package/.claude/commands/maestro-tools-register.md +0 -6
  78. package/.claude/commands/maestro-ui-codify.md +0 -2
  79. package/.claude/commands/maestro.md +7 -6
  80. package/.claude/commands/manage-kg-extractors.md +0 -2
  81. package/.claude/commands/quality-test.md +25 -1
  82. package/.claude/commands/spec-load.md +0 -1
  83. package/.claude/commands/spec-setup.md +0 -1
  84. package/.claude/skills/maestro-help/SKILL.md +1 -1
  85. package/.claude/skills/maestro-help/index/catalog.json +0 -1
  86. package/.claude/skills/maestro-help/phases/01-parse-intent.md +1 -1
  87. package/.claude/skills/team-lifecycle-v4/roles/analyst/role.md +13 -7
  88. package/.claude/skills/team-quality-assurance/roles/scout/role.md +15 -11
  89. package/.claude/skills/team-tech-debt/roles/scanner/role.md +1 -1
  90. package/.claude/skills/team-ultra-analyze/roles/explorer/role.md +23 -16
  91. package/.codex/skills/domain-add/SKILL.md +79 -0
  92. package/.codex/skills/domain-discover/SKILL.md +43 -0
  93. package/.codex/skills/domain-list/SKILL.md +38 -0
  94. package/.codex/skills/learn-follow/SKILL.md +0 -3
  95. package/.codex/skills/learn-investigate/SKILL.md +0 -3
  96. package/.codex/skills/learn-retro/SKILL.md +0 -2
  97. package/.codex/skills/maestro/SKILL.md +34 -13
  98. package/.codex/skills/maestro-amend/SKILL.md +0 -2
  99. package/.codex/skills/maestro-analyze/SKILL.md +36 -6
  100. package/.codex/skills/maestro-blueprint/SKILL.md +0 -4
  101. package/.codex/skills/maestro-brainstorm/SKILL.md +46 -6
  102. package/.codex/skills/maestro-collab/SKILL.md +14 -1
  103. package/.codex/skills/maestro-companion/SKILL.md +0 -2
  104. package/.codex/skills/maestro-execute/SKILL.md +25 -3
  105. package/.codex/skills/maestro-fork/SKILL.md +0 -2
  106. package/.codex/skills/maestro-grill/SKILL.md +9 -1
  107. package/.codex/skills/maestro-next/SKILL.md +12 -5
  108. package/.codex/skills/maestro-plan/SKILL.md +43 -5
  109. package/.codex/skills/maestro-ralph/SKILL.md +10 -3
  110. package/.codex/skills/maestro-ralph-execute/SKILL.md +51 -10
  111. package/.codex/skills/maestro-roadmap/SKILL.md +30 -3
  112. package/.codex/skills/manage-wiki/SKILL.md +0 -2
  113. package/.codex/skills/odyssey-debug/SKILL.md +0 -2
  114. package/.codex/skills/odyssey-improve/SKILL.md +0 -6
  115. package/.codex/skills/odyssey-review-test-fix/SKILL.md +0 -3
  116. package/.codex/skills/odyssey-ui/SKILL.md +0 -3
  117. package/.codex/skills/quality-review/SKILL.md +9 -0
  118. package/.codex/skills/spec-setup/SKILL.md +0 -2
  119. package/.codex/skills/team-coordinate/SKILL.md +0 -3
  120. package/.codex/skills/team-lifecycle-v4/instructions/agent-instruction.md +0 -2
  121. package/README.md +28 -5
  122. package/README.zh-CN.md +28 -5
  123. package/chains/_intent-map.json +36 -0
  124. package/chains/blueprint-driven.json +49 -0
  125. package/chains/grill-driven.json +51 -0
  126. package/dashboard/dist-server/dashboard/src/server/agents/adapter-factory.js +4 -0
  127. package/dashboard/dist-server/dashboard/src/server/agents/adapter-factory.js.map +1 -1
  128. package/dashboard/dist-server/dashboard/src/server/agents/api-explore-adapter.d.ts +6 -0
  129. package/dashboard/dist-server/dashboard/src/server/agents/api-explore-adapter.js +36 -0
  130. package/dashboard/dist-server/dashboard/src/server/agents/api-explore-adapter.js.map +1 -0
  131. package/dashboard/dist-server/dashboard/src/server/agents/stream-json-adapter.d.ts +1 -1
  132. package/dashboard/dist-server/dashboard/src/server/agents/stream-json-adapter.js.map +1 -1
  133. package/dashboard/dist-server/dashboard/src/server/wiki/embedding.d.ts +82 -0
  134. package/dashboard/dist-server/dashboard/src/server/wiki/embedding.js +444 -0
  135. package/dashboard/dist-server/dashboard/src/server/wiki/embedding.js.map +1 -0
  136. package/dashboard/dist-server/dashboard/src/server/wiki/search.d.ts +47 -1
  137. package/dashboard/dist-server/dashboard/src/server/wiki/search.js +426 -19
  138. package/dashboard/dist-server/dashboard/src/server/wiki/search.js.map +1 -1
  139. package/dashboard/dist-server/dashboard/src/server/wiki/stress.test.js +16 -0
  140. package/dashboard/dist-server/dashboard/src/server/wiki/stress.test.js.map +1 -1
  141. package/dashboard/dist-server/dashboard/src/server/wiki/virtual-wiki-adapters.d.ts +11 -0
  142. package/dashboard/dist-server/dashboard/src/server/wiki/virtual-wiki-adapters.js +492 -1
  143. package/dashboard/dist-server/dashboard/src/server/wiki/virtual-wiki-adapters.js.map +1 -1
  144. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.d.ts +18 -0
  145. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.js +192 -9
  146. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.js.map +1 -1
  147. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.test.js +42 -0
  148. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.test.js.map +1 -1
  149. package/dashboard/dist-server/dashboard/src/shared/constants.js +2 -0
  150. package/dashboard/dist-server/dashboard/src/shared/constants.js.map +1 -1
  151. package/dashboard/dist-server/shared/agent-types.d.ts +1 -1
  152. package/dashboard/dist-server/src/commands/hooks.d.ts +3 -0
  153. package/dashboard/dist-server/src/commands/hooks.js +60 -9
  154. package/dashboard/dist-server/src/commands/hooks.js.map +1 -1
  155. package/dashboard/dist-server/src/graph/kg/extraction/code/code-extractor.js +1 -1
  156. package/dashboard/dist-server/src/graph/kg/extraction/code/code-extractor.js.map +1 -1
  157. package/dashboard/dist-server/src/graph/kg/extraction/knowledge/domain-extractor.js +4 -2
  158. package/dashboard/dist-server/src/graph/kg/extraction/knowledge/domain-extractor.js.map +1 -1
  159. package/dashboard/dist-server/src/graph/kg/extraction/knowledge-extractor-registry.js +6 -1
  160. package/dashboard/dist-server/src/graph/kg/extraction/knowledge-extractor-registry.js.map +1 -1
  161. package/dashboard/dist-server/src/graph/kg/extraction/orchestrator.js +2 -6
  162. package/dashboard/dist-server/src/graph/kg/extraction/orchestrator.js.map +1 -1
  163. package/dashboard/dist-server/src/hooks/session-context.js +37 -1
  164. package/dashboard/dist-server/src/hooks/session-context.js.map +1 -1
  165. package/dashboard/dist-server/src/search/daemon.d.ts +42 -0
  166. package/dashboard/dist-server/src/search/daemon.js +180 -0
  167. package/dashboard/dist-server/src/search/daemon.js.map +1 -0
  168. package/dashboard/dist-server/src/tools/domain-loader.d.ts +4 -1
  169. package/dashboard/dist-server/src/tools/domain-loader.js +56 -25
  170. package/dashboard/dist-server/src/tools/domain-loader.js.map +1 -1
  171. package/dashboard/dist-server/src/tools/domain-schema.d.ts +1 -1
  172. package/dashboard/dist-server/src/tools/domain-schema.js +1 -1
  173. package/dist/shared/agent-types.d.ts +1 -1
  174. package/dist/shared/agent-types.d.ts.map +1 -1
  175. package/dist/src/agents/api-explore/agent-loop.d.ts +14 -0
  176. package/dist/src/agents/api-explore/agent-loop.d.ts.map +1 -0
  177. package/dist/src/agents/api-explore/agent-loop.js +86 -0
  178. package/dist/src/agents/api-explore/agent-loop.js.map +1 -0
  179. package/dist/src/agents/api-explore/config.d.ts +42 -0
  180. package/dist/src/agents/api-explore/config.d.ts.map +1 -0
  181. package/dist/src/agents/api-explore/config.js +99 -0
  182. package/dist/src/agents/api-explore/config.js.map +1 -0
  183. package/dist/src/agents/api-explore/index.d.ts +2 -0
  184. package/dist/src/agents/api-explore/index.d.ts.map +1 -0
  185. package/dist/src/agents/api-explore/index.js +102 -0
  186. package/dist/src/agents/api-explore/index.js.map +1 -0
  187. package/dist/src/agents/api-explore/llm.d.ts +28 -0
  188. package/dist/src/agents/api-explore/llm.d.ts.map +1 -0
  189. package/dist/src/agents/api-explore/llm.js +48 -0
  190. package/dist/src/agents/api-explore/llm.js.map +1 -0
  191. package/dist/src/agents/api-explore/prompt-parser.d.ts +23 -0
  192. package/dist/src/agents/api-explore/prompt-parser.d.ts.map +1 -0
  193. package/dist/src/agents/api-explore/prompt-parser.js +73 -0
  194. package/dist/src/agents/api-explore/prompt-parser.js.map +1 -0
  195. package/dist/src/agents/api-explore/runner.d.ts +65 -0
  196. package/dist/src/agents/api-explore/runner.d.ts.map +1 -0
  197. package/dist/src/agents/api-explore/runner.js +196 -0
  198. package/dist/src/agents/api-explore/runner.js.map +1 -0
  199. package/dist/src/agents/api-explore/session.d.ts +23 -0
  200. package/dist/src/agents/api-explore/session.d.ts.map +1 -0
  201. package/dist/src/agents/api-explore/session.js +57 -0
  202. package/dist/src/agents/api-explore/session.js.map +1 -0
  203. package/dist/src/agents/api-explore/stream-json-emitter.d.ts +10 -0
  204. package/dist/src/agents/api-explore/stream-json-emitter.d.ts.map +1 -0
  205. package/dist/src/agents/api-explore/stream-json-emitter.js +19 -0
  206. package/dist/src/agents/api-explore/stream-json-emitter.js.map +1 -0
  207. package/dist/src/agents/api-explore/system-prompt.d.ts +2 -0
  208. package/dist/src/agents/api-explore/system-prompt.d.ts.map +1 -0
  209. package/dist/src/agents/api-explore/system-prompt.js +31 -0
  210. package/dist/src/agents/api-explore/system-prompt.js.map +1 -0
  211. package/dist/src/agents/api-explore/tools.d.ts +11 -0
  212. package/dist/src/agents/api-explore/tools.d.ts.map +1 -0
  213. package/dist/src/agents/api-explore/tools.js +168 -0
  214. package/dist/src/agents/api-explore/tools.js.map +1 -0
  215. package/dist/src/agents/cli-agent-runner.d.ts.map +1 -1
  216. package/dist/src/agents/cli-agent-runner.js +3 -0
  217. package/dist/src/agents/cli-agent-runner.js.map +1 -1
  218. package/dist/src/cli.js +4 -0
  219. package/dist/src/cli.js.map +1 -1
  220. package/dist/src/commands/domain.d.ts.map +1 -1
  221. package/dist/src/commands/domain.js +5 -4
  222. package/dist/src/commands/domain.js.map +1 -1
  223. package/dist/src/commands/explore.d.ts +7 -0
  224. package/dist/src/commands/explore.d.ts.map +1 -0
  225. package/dist/src/commands/explore.js +201 -0
  226. package/dist/src/commands/explore.js.map +1 -0
  227. package/dist/src/commands/hooks.d.ts +3 -0
  228. package/dist/src/commands/hooks.d.ts.map +1 -1
  229. package/dist/src/commands/hooks.js +60 -9
  230. package/dist/src/commands/hooks.js.map +1 -1
  231. package/dist/src/commands/install.d.ts.map +1 -1
  232. package/dist/src/commands/install.js +42 -9
  233. package/dist/src/commands/install.js.map +1 -1
  234. package/dist/src/commands/search.d.ts +26 -4
  235. package/dist/src/commands/search.d.ts.map +1 -1
  236. package/dist/src/commands/search.js +359 -93
  237. package/dist/src/commands/search.js.map +1 -1
  238. package/dist/src/commands/update.d.ts.map +1 -1
  239. package/dist/src/commands/update.js +37 -21
  240. package/dist/src/commands/update.js.map +1 -1
  241. package/dist/src/commands/workspace.d.ts.map +1 -1
  242. package/dist/src/commands/workspace.js +9 -3
  243. package/dist/src/commands/workspace.js.map +1 -1
  244. package/dist/src/config/cli-tools-defaults.json +2 -1
  245. package/dist/src/core/install-executor.d.ts.map +1 -1
  246. package/dist/src/core/install-executor.js +6 -3
  247. package/dist/src/core/install-executor.js.map +1 -1
  248. package/dist/src/graph/kg/extraction/code/code-extractor.js +1 -1
  249. package/dist/src/graph/kg/extraction/code/code-extractor.js.map +1 -1
  250. package/dist/src/graph/kg/extraction/knowledge/domain-extractor.d.ts.map +1 -1
  251. package/dist/src/graph/kg/extraction/knowledge/domain-extractor.js +4 -2
  252. package/dist/src/graph/kg/extraction/knowledge/domain-extractor.js.map +1 -1
  253. package/dist/src/graph/kg/extraction/knowledge-extractor-registry.d.ts.map +1 -1
  254. package/dist/src/graph/kg/extraction/knowledge-extractor-registry.js +6 -1
  255. package/dist/src/graph/kg/extraction/knowledge-extractor-registry.js.map +1 -1
  256. package/dist/src/graph/kg/extraction/orchestrator.d.ts.map +1 -1
  257. package/dist/src/graph/kg/extraction/orchestrator.js +2 -6
  258. package/dist/src/graph/kg/extraction/orchestrator.js.map +1 -1
  259. package/dist/src/graph/kg/surface/cli.d.ts.map +1 -1
  260. package/dist/src/graph/kg/surface/cli.js +5 -2
  261. package/dist/src/graph/kg/surface/cli.js.map +1 -1
  262. package/dist/src/hooks/session-context.d.ts.map +1 -1
  263. package/dist/src/hooks/session-context.js +37 -1
  264. package/dist/src/hooks/session-context.js.map +1 -1
  265. package/dist/src/ralph/cmd-next.d.ts.map +1 -1
  266. package/dist/src/ralph/cmd-next.js +66 -4
  267. package/dist/src/ralph/cmd-next.js.map +1 -1
  268. package/dist/src/ralph/status-schema.d.ts +1 -0
  269. package/dist/src/ralph/status-schema.d.ts.map +1 -1
  270. package/dist/src/search/daemon.d.ts +43 -0
  271. package/dist/src/search/daemon.d.ts.map +1 -0
  272. package/dist/src/search/daemon.js +180 -0
  273. package/dist/src/search/daemon.js.map +1 -0
  274. package/dist/src/tools/__tests__/domain-search-debug.js +3 -1
  275. package/dist/src/tools/__tests__/domain-search-debug.js.map +1 -1
  276. package/dist/src/tools/domain-loader.d.ts +4 -1
  277. package/dist/src/tools/domain-loader.d.ts.map +1 -1
  278. package/dist/src/tools/domain-loader.js +56 -25
  279. package/dist/src/tools/domain-loader.js.map +1 -1
  280. package/dist/src/tools/domain-schema.d.ts +1 -1
  281. package/dist/src/tools/domain-schema.js +1 -1
  282. package/dist/src/utils/update-notices.js +12 -0
  283. package/dist/src/utils/update-notices.js.map +1 -1
  284. package/package.json +5 -1
  285. package/shared/agent-types.ts +1 -1
  286. package/templates/search-tools.md +22 -6
  287. package/workflows/agy-instructions.md +0 -4
  288. package/workflows/analyze.md +2 -2
  289. package/workflows/boundary-grill.md +50 -0
  290. package/workflows/brainstorm.md +6 -5
  291. package/workflows/claude-instructions.md +29 -2
  292. package/workflows/codebase-rebuild.md +0 -1
  293. package/workflows/codex-instructions.md +97 -14
  294. package/workflows/command-authoring.md +1 -1
  295. package/workflows/debug.md +0 -4
  296. package/workflows/domain-add.md +115 -0
  297. package/workflows/execute.md +7 -0
  298. package/workflows/explore-usage.md +128 -0
  299. package/workflows/finish-work.md +2 -6
  300. package/workflows/fork.md +0 -4
  301. package/workflows/grill.md +14 -1
  302. package/workflows/harvest.md +0 -3
  303. package/workflows/impeccable/audit.md +0 -2
  304. package/workflows/impeccable/codex.md +0 -4
  305. package/workflows/init.md +9 -0
  306. package/workflows/interview-mechanics.md +3 -2
  307. package/workflows/issue-analyze.md +0 -5
  308. package/workflows/issue-gaps-analyze.codex.md +0 -6
  309. package/workflows/knowledge-audit.md +0 -4
  310. package/workflows/learn.md +0 -6
  311. package/workflows/maestro.codex.md +0 -4
  312. package/workflows/maestro.md +31 -18
  313. package/workflows/merge.md +0 -4
  314. package/workflows/milestone-complete.md +0 -4
  315. package/workflows/overlays.md +0 -10
  316. package/workflows/plan.md +2 -3
  317. package/workflows/roadmap-common.md +0 -4
  318. package/workflows/tdd.md +0 -2
  319. package/workflows/tools-spec.md +1 -7
  320. package/workflows/ui-codify-extract.md +0 -2
  321. package/workflows/ui-codify-package.md +0 -2
  322. package/.agents/skills/maestro-ralph-beta/SKILL.md +0 -882
  323. package/.agy/skills/maestro-ralph-beta/SKILL.md +0 -878
  324. package/.claude/commands/maestro-ralph-beta.md +0 -880
  325. package/.codex/skills/maestro-ralph-beta/SKILL.md +0 -883
@@ -27,6 +27,7 @@ Produces plan.json + TASK files; registers PLN artifact in state.json.
27
27
  - [plan.json](~/.maestro/templates/plan.json) — read when generating plan output
28
28
  - [task.json](~/.maestro/templates/task.json) — read when generating task files
29
29
  - [state.json](~/.maestro/templates/state.json) — read when registering artifact
30
+ - [boundary-grill.md](~/.maestro/workflows/boundary-grill.md) — read when boundary conflicts detected (in P4)
30
31
  </deferred_reading>
31
32
 
32
33
  <context>
@@ -52,7 +53,7 @@ Scope routing, base flags (`--collab`, `--spec`, `-y`, `--gaps`, `--dir`), outpu
52
53
 
53
54
  **Ad-hoc milestone (D-008):** When scope resolves to "standalone" via the standard standalone resolution (no `--from` source), and `current_milestone == null`, plan auto-creates an adhoc milestone (`type: "adhoc"`) in state.json before proceeding. This ensures downstream milestone-audit/complete have a valid milestone context. See workflow plan.md § "Ad-hoc Milestone Auto-Creation".
54
55
 
55
- **Exception (`--from analyze:ANL-xxx` / `blueprint:BLP-xxx`):** When scope is set to "standalone" by `--from`, skip adhoc milestone auto-creation — the upstream analyze/blueprint artifact already provides the milestone context (or is intentionally milestone-free). Adhoc creation in this path would conflict with the `--from` semantic of "this is a one-shot plan rooted in an existing artifact".
56
+ **`--from analyze:*` / `blueprint:*`**: scope=standalone skip adhoc milestone auto-creation.
56
57
 
57
58
  ### Role Knowledge
58
59
  `maestro search --category arch` → select relevant → `maestro wiki load`
@@ -86,11 +87,19 @@ Follow '~/.maestro/workflows/plan.md' completely.
86
87
  - REQUIRED: Main flow inline planning is FORBIDDEN (see P3 Agent Constraint below).
87
88
  - BLOCKED if missing: plan.json or TASK files not produced by planner agent — do not proceed to checking.
88
89
 
90
+ **GATE P3.5 → P4: Boundary Grill → Plan Check**
91
+ Run boundary grill per `~/.maestro/workflows/boundary-grill.md`.
92
+ Input: plan.json tasks + convergence criteria + upstream context. Scope guard: "only plan scope; do not re-analyze or re-scope".
93
+ IF conflicts → results to plan.json `boundary_grill` section + affected TASK files. DEC conflicts add `boundary_warning` to confidence.
94
+ NON-BLOCKING: warnings, not hard stops.
95
+
89
96
  **GATE P4 → P5: Plan Check → User Confirmation**
90
97
  - REQUIRED: Plan-checker passed (or minor issues acknowledged).
98
+ - REQUIRED: Boundary grill completed (conflicts resolved or accepted as risks).
91
99
  - REQUIRED: Confidence scored with 5-dimension factor model.
92
100
  - REQUIRED: Pressure pass completed on highest-complexity task.
93
- - BLOCKED if: plan-checker found critical issues fix plan before presenting to user.
101
+ - REQUIRED: If plan touches UI (检出 `dashboard/` UI 关键词 `landing|page|dashboard|frontend|UI|component|界面`), each delivery wave has ≥1 `[UI-observable]` convergence criterion (vertical-slice delivery, not backend-only).
102
+ - BLOCKED if: plan-checker found critical issues, OR UI plan missing `[UI-observable]` coverage — fix plan before presenting to user.
94
103
 
95
104
  **GATE P5 → Completion: User Confirmation → Done**
96
105
  - REQUIRED: User confirmation captured (execute/modify/cancel).
@@ -152,8 +161,6 @@ For each created TASK-{NNN}.json that has issue_id:
152
161
  Append history entry: { action: "planned", at: <ISO>, by: "maestro-plan", summary: "Linked to TASK-{NNN}" }
153
162
  ```
154
163
 
155
- This ensures issue → TASK traceability. The `task_refs[]` and `task_plan_dir` fields on the issue allow the dashboard to resolve and display associated TASK details.
156
-
157
164
  ### Mode: Revise / Check
158
165
 
159
166
  Follow workflow plan.md § "Revise Mode" and § "Check Mode" respectively. These modes bypass the standard P1-P5 create pipeline.
@@ -215,7 +222,11 @@ Status verdicts:
215
222
  - [ ] .task/TASK-*.json files created for each task
216
223
  - [ ] Every task has `read_first[]` with at least the file being modified + source of truth files
217
224
  - [ ] Every task has `convergence.criteria[]` with grep-verifiable conditions (no subjective language)
225
+ - [ ] UI plans: each delivery wave has ≥1 `[UI-observable]` convergence criterion (vertical slice; verified at runtime by ralph frontend-verify gate)
218
226
  - [ ] Every task `action` and `implementation` contain concrete values (no "align X with Y")
227
+ - [ ] Boundary grill executed in P3.5 (skip if no conflicts detected)
228
+ - [ ] Boundary grill results written to plan.json `boundary_grill` section (if conflicts found)
229
+ - [ ] DEC conflicts reflected in confidence `boundary_warning` factor
219
230
  - [ ] Plan confidence scored in P4 with 5-dimension factor model
220
231
  - [ ] Plan readiness gate checked before P4.5 collision detection
221
232
  - [ ] Pressure pass completed on highest-complexity task
@@ -24,7 +24,8 @@ $ARGUMENTS — intent text, flags, or keywords.
24
24
 
25
25
  **Parse:**
26
26
  ```
27
- -y flag → auto_confirm = true
27
+ -y flag → auto_confirm = true # 唯一来源:用户显式传入;ralph 不内部推断(invariant 14)
28
+ --roadmap → wants_roadmap = true (强制多发布 roadmap 路径;roadmap 默认 opt-in)
28
29
  .md/.txt path → input_doc (supplementary context only, NEVER substitutes lifecycle stages)
29
30
  Remaining → intent
30
31
  ```
@@ -49,6 +50,9 @@ Remaining → intent
49
50
  11. **task_decomposition 驱动 steps[] 动态生长** — `post-goal-audit` 按 unmet 子目标插入 scoped mini-loop;字段可选/累加,既有字段不删不改
50
51
  12. **Invariant violation = BLOCK** — 违反上述任一 invariant 即阻断当前操作。不得以 "效率" 或 "意图明确" 为由绕过。特别是 invariant 1(ralph 不执行 step)和 invariant 6(completion_confirmed 由 CLI 写入)不可隐性违反。
51
52
  13. **Delegate fallback 必须标记** — A_DELEGATE_EVALUATE 解析 verdict 失败时 fallback 为 "fix",但 MUST 在 decisions.ndjson 记录 `"parse_failed": true, "confidence_score": 0`,后续 step 继承 LOW CONFIDENCE 标记。
53
+ 14. **auto_confirm 单一来源** — `auto_confirm` 仅由用户 `-y` 标志设定;ralph 不得内部推断。`session.auto_mode` 仅反映用户输入。
54
+ 15. **分解契约单一所有者** — `boundary_contract` / `task_decomposition` 由 session 创建者拥有(`source=="ralph"` → `decomposition_owner="ralph"`;`source=="maestro"` → `"maestro"`)。contract 已存在时,后续 S_DECOMPOSE MUST 跳过 ask_user,仅做 shape 校验 + 缺省补齐;goal-audit 只更新 `task_decomposition[*].status/completion_confirmed/completed_at`,禁止改 `goal/done_when/boundary`。
55
+ 16. **控制权优先级(范式治理)** — FSM 独占 session 生命周期 + step 排序 + retry/fix/escalate + cross-step decision 节点;Pipeline 命令只拥有自身 artifact GATE(GATE 失败 → `maestro ralph complete <idx> --status BLOCKED|NEEDS_RETRY`,自身 GATE 全过 → DONE);Router 命令不得出现在 FSM step 内。
52
56
  </invariants>
53
57
 
54
58
  <state_machine>
@@ -58,7 +62,7 @@ S_PARSE_ROUTE — 解析参数、路由入口 PERSIST: —
58
62
  S_STATUS — 显示 session 进度 PERSIST: —
59
63
  S_CONTINUE — 恢复执行 PERSIST: —
60
64
  S_RESOLVE_PHASE — 解析 phase + phase_is_new + D-007 milestone PERSIST: session.phase, session.phase_is_new, session.milestone
61
- S_INFER — 基于已解析 phase 推断 lifecycle_position PERSIST: session.lifecycle_position
65
+ S_INFER — 基于已解析 phase 推断 lifecycle_position PERSIST: session.lifecycle_position, session.wants_roadmap
62
66
  S_RESOLVE_SCOPE — 读 macro analyze conclusions.scope_verdict PERSIST: session.scope_verdict, session.analyze_macro_id
63
67
  S_QUALITY_MODE — 决定质量管线模式 PERSIST: session.quality_mode
64
68
  S_PLANNING_MODE — 决定统一/独立规划模式 PERSIST: session.planning_mode
@@ -130,7 +134,7 @@ S_DISPATCH:
130
134
  → END DO: invoke_skill({ skill: "maestro-ralph-execute" })
131
135
 
132
136
  S_DECISION_EVAL: (decision 节点 == `step.decision` 非空,下述 gate 名取自该字段)
133
- → S_APPLY_VERDICT WHEN: quality-gate (post-execute, post-business-test, post-review, post-test)
137
+ → S_APPLY_VERDICT WHEN: quality-gate (post-execute, post-business-test, post-review, post-test, post-frontend-verify)
134
138
  DO: A_DELEGATE_EVALUATE
135
139
  → S_APPLY_VERDICT WHEN: goal-gate (post-goal-audit)
136
140
  DO: A_GOAL_AUDIT_EVALUATE
@@ -138,11 +142,14 @@ S_DECISION_EVAL: (decision 节点 == `step.decision` 非空,下述 gate 名取
138
142
  DO: A_SCOPE_EVALUATE
139
143
  → S_APPLY_VERDICT WHEN: structural (post-milestone, post-debug-escalate)
140
144
  DO: A_STRUCTURAL_EVALUATE
145
+ → S_APPLY_VERDICT WHEN: reground-gate (post-reground)
146
+ DO: A_REGROUND_EVALUATE
141
147
 
142
148
  S_APPLY_VERDICT:
143
149
  → S_DISPATCH WHEN: verdict == "proceed" DO: A_APPLY_PROCEED
144
- → S_DISPATCH WHEN: post-goal-audit + unmet sub-goals DO: A_APPLY_GOAL_FIX
145
- → S_DISPATCH WHEN: post-goal-audit + all sub-goals met DO: A_APPLY_GOAL_DONE
150
+ → S_DISPATCH WHEN: post-goal-audit + has_unmet DO: A_APPLY_GOAL_FIX
151
+ → S_DISPATCH WHEN: post-goal-audit + all_met + INTENT_ALIGNED=true DO: A_APPLY_GOAL_DONE
152
+ → END WHEN: post-goal-audit + all_met + INTENT_ALIGNED=false DO: A_REGROUND_HALT(尾部漂移熔断)
146
153
  → S_DISPATCH WHEN: post-analyze-scope DO: A_APPLY_SCOPE_VERDICT
147
154
  → S_DISPATCH WHEN: verdict == "fix" DO: A_APPLY_FIX
148
155
  → S_DISPATCH WHEN: verdict == "escalate" DO: A_APPLY_ESCALATE
@@ -150,11 +157,15 @@ S_APPLY_VERDICT:
150
157
  → END WHEN: post-milestone + standard + no next milestone DO: mark completed
151
158
  → END WHEN: post-milestone + adhoc DO: mark completed (adhoc self-contained)
152
159
  → END WHEN: post-debug-escalate (always STOP) DO: A_PAUSE_ESCALATE
160
+ → END WHEN: post-reground + drifted + confidence_score >= 60 DO: A_REGROUND_HALT
161
+ → S_DISPATCH WHEN: post-reground + aligned DO: A_APPLY_PROCEED
162
+ → S_DISPATCH WHEN: post-reground + drifted + confidence_score < 60 DO: A_APPLY_PROCEED (标 LOW CONFIDENCE)
153
163
  GUARD: retry_count >= max_retries → force escalate
154
164
  GUARD: confidence_score < 60 AND proceed → override to fix
155
165
  GUARD: confidence_score > 95 AND fix AND retry > 0 → suggest proceed
156
166
  GUARD: auto_confirm → skip user prompt, apply adjusted verdict
157
167
  GUARD: not auto_confirm → ask_user with override options
168
+ GUARD: post-reground + drifted + confidence_score >= 60 → A_REGROUND_HALT(漂移熔断为安全门,auto_confirm 不跳过)
158
169
 
159
170
  S_FALLBACK:
160
171
  → S_PARSE_ROUTE WHEN: user provides input DO: ask_user
@@ -212,11 +223,19 @@ resolve_milestone(phase_number):
212
223
 
213
224
  | Pattern | Position |
214
225
  |---------|----------|
215
- | 压力测试 / 拷问 / 验证假设 / grill / stress-test | `grill`(**auto_confirm=true 时跳过,直接 `brainstorm`**) |
226
+ | 压力测试 / 拷问 / 验证假设 / grill / stress-test | `grill`(**auto_confirm=true 时透传 `-y`,grill 以 Auto mode 代码代答,不跳过**) |
216
227
  | brainstorm / 头脑风暴 / 探索 / ideate / 设计思路 | `brainstorm` |
217
228
  | blueprint / 规格 / 正式文档 / spec-generate / 7-phase | `blueprint` |
218
229
  | broad/medium intent 无数字 phase (重构/全面/重写/迁移/新功能 X) | `analyze-macro` |
219
230
 
231
+ **Roadmap opt-in detection** (设 `session.wants_roadmap`,缺省 `false`):
232
+ ```
233
+ wants_roadmap = (--roadmap flag)
234
+ OR (intent 含多发布信号: 多发布|多版本|分阶段交付|按里程碑发布|v1.*v2|multi-release|roadmap)
235
+ OR (.workflow/roadmap.md 已存在) ← 向后兼容:既有 roadmap 项目行为不变
236
+ ```
237
+ 默认 `false` → large 项目走单一多波次 `plan --from analyze`,不引入 roadmap 横切层;roadmap 仅多发布场景 opt-in。
238
+
220
239
  **Bootstrap detection:**
221
240
 
222
241
  | Condition | Position |
@@ -231,7 +250,7 @@ resolve_milestone(phase_number):
231
250
  | Condition | Position |
232
251
  |-----------|----------|
233
252
  | `phase_is_new == true` (新 phase) | `analyze` |
234
- | no milestones AND no roadmap.md AND has analyze macro artifact | `roadmap` |
253
+ | no milestones AND no roadmap.md AND has analyze macro artifact | `roadmap` if `wants_roadmap` else `plan` (--from analyze) |
235
254
  | no milestones AND no roadmap.md AND no analyze artifact | `analyze-macro` |
236
255
  | `phase == null` (grill/brainstorm/blueprint/init/roadmap/analyze-macro override 已定) | n/a |
237
256
  | phase 已存在 + 无任何 artifact | `analyze` |
@@ -252,9 +271,9 @@ resolve_milestone(phase_number):
252
271
 
253
272
  | scope_verdict | 链路 |
254
273
  |---------------|------|
255
- | `large` | analyze-macro → roadmap → analyze → plan → execute → ... |
256
- | `medium` / `small` | analyze-macro → plan --from analyze:{ANL_ID} → execute → ...(跳过 roadmap + analyze-phase |
257
- | `unknown` | 默认走 large 路径,post-analyze-scope 决策节点再纠正 |
274
+ | `large` + `wants_roadmap` | analyze-macro → roadmap → analyze → plan → execute → ...(多发布 opt-in) |
275
+ | `large`(默认)/ `medium` / `small` | analyze-macro → plan --from analyze:{ANL_ID} → execute → ...(跳过 roadmap + analyze-phase;单一多波次计划) |
276
+ | `unknown` | 默认走 standalone(plan --from analyze)路径,post-analyze-scope 决策节点再纠正 |
258
277
 
259
278
  **Refine from post-execute results:**
260
279
 
@@ -266,7 +285,8 @@ resolve_milestone(phase_number):
266
285
  | passed==true, no review.json | `business-test` |
267
286
  | review.json: verdict=="BLOCK" | `review-failed` |
268
287
  | review.json: verdict!="BLOCK" | `test` |
269
- | uat.md: all passed | `milestone-audit` |
288
+ | uat.md: all passed + `session.milestone` 存在 | `milestone-audit` |
289
+ | uat.md: all passed + `session.milestone=null` (standalone) | 标记 session completed(无 milestone 可审计) |
270
290
  | uat.md: has failures | `test-failed` |
271
291
 
272
292
  ### A_DETERMINE_QUALITY_MODE
@@ -311,7 +331,9 @@ options:
311
331
 
312
332
  ### A_DECOMPOSE_TASKS
313
333
 
314
- Runs once before chain build; additive to status.json.
334
+ Runs once before chain build; additive to status.json. 设 `session.decomposition_owner = "ralph"`。
335
+
336
+ **0. Ownership guard** (invariant 15): 若 `session.boundary_contract` 或 `session.task_decomposition` 已非空(上游 maestro 已写入,`decomposition_owner == "maestro"`)→ MUST 跳过下述提问,仅做 shape 校验 + 缺省字段补齐,直接进入步骤 6。
315
337
 
316
338
  **1. Classify intent breadth:**
317
339
 
@@ -337,10 +359,10 @@ narrow → derive defaults from intent + codebase, skip questions.
337
359
  ```json
338
360
  { "id": "G1", "goal": "<deliverable>", "boundary": "<in/out note>",
339
361
  "done_when": "<objectively checkable condition>",
340
- "evidence": "verification.json|review.json|uat.md|<test path>",
362
+ "evidence": "verification.json|review.json|uat.md|e2e-results.json|<test path>",
341
363
  "lifecycle": ["analyze","execute"], "status": "pending" }
342
364
  ```
343
- `done_when` 必须客观可验证,且引用 ralph 已产出的 artifact;`lifecycle` 字段映射到产出 evidence 的生命周期 stage
365
+ `done_when` 必须客观可验证,且引用 ralph 已产出的 artifact;`lifecycle` 字段映射到产出 evidence 的生命周期 stage。涉及前端可用性的子目标,`done_when` 应引用 `e2e-results.json`(frontend-verify 门产出),不得仅以后端 API/build 证据判定可用。
344
366
 
345
367
  **5. Persist** (additive): `boundary_contract`, `execution_criteria`, `task_decomposition`。每个 sub-goal 含 `status: "pending"` + `completion_confirmed: false`。
346
368
 
@@ -348,11 +370,11 @@ narrow → derive defaults from intent + codebase, skip questions.
348
370
 
349
371
  ### A_BUILD_STEPS
350
372
 
351
- Generate steps from `session.lifecycle_position` to `milestone-complete`.
373
+ Generate steps from `session.lifecycle_position` to `milestone-complete`(`session.milestone` 存在时)或最后一个质量门(standalone 时)。
352
374
 
353
375
  | Stage | invoke_skill(independent) | invoke_skill(unified) | Decision after | quality_mode |
354
376
  |-------|---------------------|-----------------|----------------|--------------|
355
- | grill | `maestro-grill "{intent}"` | *(same)* | — | all (**skip when auto_confirm**) |
377
+ | grill | `maestro-grill "{intent}"` | *(same)* | — | all (**auto_confirm 透传 `-y` 到 grill args,不删除 stage**) |
356
378
  | brainstorm | `maestro-brainstorm "{intent}" --from grill:{grill_id}` *(if grill ran)* / `maestro-brainstorm "{intent}"` *(otherwise)* | *(same)* | — | all |
357
379
  | blueprint | `maestro-blueprint "{intent}"` | *(same)* | — | all |
358
380
  | init | `maestro-init` | *(same)* | — | all |
@@ -366,6 +388,7 @@ Generate steps from `session.lifecycle_position` to `milestone-complete`.
366
388
  | review | `quality-review {phase}` | `quality-review` | `post-review` | all (quick: append `--tier quick`) |
367
389
  | test-gen | `quality-auto-test {phase}` | `quality-auto-test` | — | full / standard if coverage<80% |
368
390
  | test | `quality-test {phase}` | `quality-test` | `post-test` | full, standard |
391
+ | 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\|界面`) |
369
392
  | milestone-audit | `maestro-milestone-audit` | *(same)* | — | all |
370
393
  | goal-audit | *(decision-only)* | *(same)* | `post-goal-audit` | all (only if decomposed) |
371
394
  | milestone-complete | `maestro-milestone-complete` | *(same)* | `post-milestone` | all |
@@ -379,10 +402,12 @@ Generate steps from `session.lifecycle_position` to `milestone-complete`.
379
402
  1. **起点**:从 `session.lifecycle_position` 开始
380
403
  2. **跳过已完成**:跳过当前 milestone+phase 下已有 completed artifact 的 stage(按 `session.phase` 过滤);unified 按 milestone 过滤
381
404
  3. **quality_mode 过滤**:按 `session.quality_mode` 排除不匹配 stage
382
- 3.5. **grill auto_confirm 跳过**:`auto_confirm == true` 时删除 `grill` stage(grill 为交互式苏格拉底拷问,不支持自动模式);brainstorm args 不含 `--from grill:*`
405
+ 3.5. **grill auto_confirm 透传**:`auto_confirm == true` 时为 `grill` step args 追加 `-y`(grill 自身 Auto mode 用代码代答,见 maestro-grill `<context>` Mode selection);保留 `grill` stage 与 brainstorm `--from grill:*`(grill 仍产出 grill-report/terminology/context-package)
406
+ 3.6. **frontend-verify UI 门控**:仅当当前 phase 交付前端(检出 `dashboard/` 目录,或 phase 目标/计划含 UI 关键词 `landing|page|dashboard|frontend|UI|component|界面`)时保留 `frontend-verify` stage + `post-frontend-verify` decision;纯后端 phase 删除该 stage
383
407
  4. **决策节点**:每个 Decision after 非空的 stage 之后插入 `{ decision: "<gate>", retry_count: 0, max_retries: 2, command_scope: null, command_path: null }`
384
408
  5. **goal-audit 插入**:`task_decomposition` 存在时,在最后一个 evidence-producing stage(execute/review/test)之后、`milestone-complete` 之前插入 `decision:post-goal-audit`
385
- 6. **终点硬约束**:chain `milestone-complete` 结尾
409
+ 5.5. **re-grounding 插入**:当 `task_decomposition` 存在 **且** 链路含 ≥3 个执行 step(不含 decision 节点)时,从第 3 个执行 step 起每隔 3 个执行 step 后插入 `{ decision: "post-reground", retry_count: 0, max_retries: 0, command_scope: null, command_path: null }`。不在最后一个执行 step 之后插入(由 goal-audit 覆盖);不与已有 quality-gate decision 节点相邻(顺延到下一个 3-step 边界);fix-loop 动态插入的 step(index > 原始 chain 长度)不纳入计数
410
+ 6. **终点硬约束**:`session.milestone` 存在时 chain 以 `milestone-complete` 结尾;`session.milestone=null`(standalone)时跳过 `milestone-audit` + `milestone-complete` stage,chain 以最后一个质量门 stage 结尾
386
411
  7. **goal_ref 传播**:`task_decomposition` 存在时,每个 step 按 `step.stage ∈ g.lifecycle` 匹配 `step.goal_ref = g.id`(多匹配取字典序最小);decision 节点不打 goal_ref
387
412
  8. **占位符**:independent 保留 `{phase}` `{intent}`;unified 不带 `{phase}`
388
413
  9. **command_path 解析**(每个执行 step,decision 节点跳过):
@@ -394,13 +419,16 @@ Generate steps from `session.lifecycle_position` to `milestone-complete`.
394
419
  - **不在 build 阶段读取 .md 内容**;`<required_reading>` / `<deferred_reading>` 解析与加载由 `maestro ralph next` CLI 在执行期完成
395
420
  10. **每个 step 初始化** `completion_confirmed: false`, `completion_status: null`, `completion_evidence: null`, `deferred_reads: []`, `load: null`(由 `ralph next` 写入)
396
421
  11. **scope_verdict gating**(仅当 chain 起点 = `analyze-macro`):
397
- - `scope_verdict {medium, small}` → 跳过 `roadmap` + `analyze` 两 stage;`plan` 选 standalone 列(`--from analyze:{analyze_macro_id}`),不带 `{phase}`
398
- - `scope_verdict == large` 保留 `roadmap` + `analyze`;`plan` 选 phase 列(`{phase}`)
399
- - `scope_verdict == unknown` → 默认 large 路径;由 `post-analyze-scope` 决策节点在 macro analyze 完成后纠正(A_APPLY_SCOPE_VERDICT)
422
+ - `scope_verdict == large` **且** `wants_roadmap`保留 `roadmap` + `analyze`;`plan` 选 phase 列(`{phase}`)
423
+ - 其余(`medium` / `small`,或 `large` 但非 `wants_roadmap`)→ 跳过 `roadmap` + `analyze` 两 stage;`plan` 选 standalone 列(`--from analyze:{analyze_macro_id}`),不带 `{phase}`
424
+ - `scope_verdict == unknown` → 默认 standalone(非 roadmap)路径;由 `post-analyze-scope` 决策节点在 macro analyze 完成后纠正(A_APPLY_SCOPE_VERDICT)
400
425
  12. **--from 自动注入**:
401
426
  - `analyze_macro_id` 存在且当前 step 是 `roadmap` → args 改为 `--from analyze:{analyze_macro_id}`
402
- - `analyze_macro_id` 存在且 `scope_verdict {medium, small}` 且当前 step `plan` args 改为 `--from analyze:{analyze_macro_id}`
427
+ - `analyze_macro_id` 存在且当前 `plan` step 处于 standalone 列(即非 wants_roadmap 路径:`medium`/`small`,或 `large` 但非 `wants_roadmap`)→ args 改为 `--from analyze:{analyze_macro_id}`
403
428
  - `blueprint_id` 存在 → 当前 step 是 `plan` → args 改为 `--from blueprint:{blueprint_id}`(优先级低于 phase 数字参数)
429
+ - **phase-level deferred chaining**(独立模式,step 含 `{phase}` 占位符):build 阶段前序 artifact 尚未产出,由 A_RESOLVE_ARGS(ralph-execute)运行时从 state.json 查找同 phase+milestone 最新 completed artifact 注入:
430
+ - `plan` step → `--from analyze:{phase_analyze_id}`,写 `source_artifact_ref`
431
+ - `execute` step → `--dir {plan_path}`(现有逻辑),写 `source_artifact_ref = "plan:{id}"`
404
432
  - 写入 `step.source_artifact_ref` 以便审计
405
433
  13. **D-007 Milestone-ref 标注**:每个含 `{phase}` 占位符的 step → `step.milestone_id = session.milestone`(由 A_RESOLVE_PHASE 反查得出),禁止读 `current_milestone`
406
434
  14. **动态插入步骤**(A_APPLY_*)同样应用规则 7-13
@@ -423,6 +451,7 @@ Generate steps from `session.lifecycle_position` to `milestone-complete`.
423
451
  | post-business-test | .tests/auto-test/report.json |
424
452
  | post-review | review.json |
425
453
  | post-test | uat.md, .tests/test-results.json |
454
+ | post-frontend-verify | e2e-results.json |
426
455
  4. Check artifact for confidence section → include as signal
427
456
  5. Execute delegate (run_in_background, STOP, wait for callback):
428
457
  ```
@@ -481,14 +510,18 @@ Runs only when `task_decomposition` present.
481
510
  1. 读取 status.json.task_decomposition 中 status!=done 的子目标
482
511
  2. 打开 evidence 产物,对照 done_when 严格判定
483
512
  3. 输出 met / unmet,unmet 给出 gap + target_phase
513
+ 4. 对照 intent + definition_of_done 判定累积产出是否仍服务原始意图(意图保真检查)
484
514
  CONTEXT:
485
- status.json = {session_dir}/status.json
486
- evidence = {evidence artifacts}
515
+ status.json = {session_dir}/status.json
516
+ intent = {session.intent}
517
+ definition_of_done = {boundary_contract.definition_of_done}
518
+ evidence = {evidence artifacts}
487
519
  execution_criteria = {execution_criteria}
488
520
  boundary_contract = {boundary_contract}
489
521
  EXPECTED:
490
522
  ---VERDICT---
491
523
  STATUS=all_met|has_unmet
524
+ INTENT_ALIGNED=true|false
492
525
  UNMET=[{id:G2,gap:'...',target_phase:execute}, ...]
493
526
  CONFIDENCE_SCORE=0-100
494
527
  ---END---
@@ -501,9 +534,64 @@ Runs only when `task_decomposition` present.
501
534
  ```
502
535
  4. On callback: 对每个 met 子目标,set `task_decomposition[i].status="done"` + `completion_confirmed=true` + `completed_at=now`
503
536
  5. Append `{session_dir}/decisions.ndjson` with `"type": "goal-gate"`, `unmet_count`, `unmet_ids`
504
- 6. Verdict: `all_met` → A_APPLY_GOAL_DONE; `has_unmet` → A_APPLY_GOAL_FIX
537
+ 6. Verdict routing:
538
+ - `all_met` + `INTENT_ALIGNED=true` → A_APPLY_GOAL_DONE
539
+ - `all_met` + `INTENT_ALIGNED=false` → A_REGROUND_HALT(尾部漂移熔断,auto_confirm 不跳过)
540
+ - `has_unmet` → A_APPLY_GOAL_FIX
505
541
  GUARD: retry_count >= max_retries AND still unmet → A_APPLY_ESCALATE
506
542
 
543
+ ### A_REGROUND_EVALUATE
544
+
545
+ 仅当 `task_decomposition` 存在。周期触发(build rule 5.5)。
546
+
547
+ 1. 从 status.json 读取:`session.intent`、`session.boundary_contract`、`steps[]` 中 `status=="completed"` 的 step + `completion_evidence`、`task_decomposition` 中已 done 子目标的 `goal` + `done_when`
548
+ 2. Delegate read-only audit (run_in_background, STOP, wait):
549
+ ```
550
+ maestro delegate "PURPOSE: 意图保真检查 — 对照 intent 验证累积执行是否漂移
551
+ TASK:
552
+ 1. 读取 intent + boundary_contract.definition_of_done
553
+ 2. 读取已完成 steps 的 completion_evidence + 已 done 子目标 done_when
554
+ 3. 判定累积产出是否仍服务 intent;是否有 step 产出超出 in_scope 或触碰 out_of_scope
555
+ 4. 输出 aligned / drifted,drifted 给出 drift_description + corrective_action
556
+ CONTEXT:
557
+ intent = {session.intent}
558
+ definition_of_done = {boundary_contract.definition_of_done}
559
+ in_scope = {boundary_contract.in_scope}
560
+ out_of_scope = {boundary_contract.out_of_scope}
561
+ completed_steps = [{index, skill, stage, completion_evidence}, ...]
562
+ done_goals = [{id, goal, done_when}, ...]
563
+ EXPECTED:
564
+ ---VERDICT---
565
+ STATUS=aligned|drifted
566
+ DRIFT_DESCRIPTION=<空或具体描述>
567
+ CORRECTIVE_ACTION=<空或建议>
568
+ CONFIDENCE_SCORE=0-100
569
+ ---END---
570
+ CONSTRAINTS:
571
+ - 只评估,不修改文件
572
+ - aligned 阈值:≥80% 已完成产出直接服务 intent
573
+ - 单个 step 触碰 out_of_scope → 直接判 drifted"
574
+ --role analyze --mode analysis
575
+ ```
576
+ 3. On callback: parse verdict
577
+ 4. Append `{session_dir}/decisions.ndjson`:`{ "id": "DEC-{ts}", "type": "reground-gate", "source": "ralph", "node_id": "post-reground", "verdict": "{aligned|drifted}", "confidence_score": {N}, "drift_description": "...", "corrective_action": "..." }`
578
+ 5. Verdict routing:`aligned` → A_APPLY_PROCEED;`drifted` + `confidence_score >= 60` → A_REGROUND_HALT;`drifted` + `confidence_score < 60` → A_APPLY_PROCEED(标 LOW CONFIDENCE)
579
+
580
+ ### A_REGROUND_HALT
581
+
582
+ 漂移熔断(安全门,auto_confirm 不跳过)。
583
+
584
+ 1. Set `session.status = "paused"`,write status.json
585
+ 2. Display:
586
+ ```
587
+ ⚠️ Re-grounding 检测失败 — 执行已偏离 intent。
588
+ Intent: {session.intent}
589
+ Drift: {drift_description}
590
+ 建议回归: {corrective_action}
591
+ 选项:1) /maestro-ralph continue 忽略漂移继续 2) 手动修正后 continue 3) /maestro-ralph status 查看后决定
592
+ ```
593
+ 3. GUARD: auto_confirm 对本动作无效——漂移熔断不可自动跳过
594
+
507
595
  ### A_APPLY_PROCEED
508
596
 
509
597
  1. Mark decision completed, write status.json
@@ -524,14 +612,14 @@ Runs only when `task_decomposition` present.
524
612
 
525
613
  由 `post-analyze-scope` 触发,依据 `session.scope_verdict` 重塑下游链路。
526
614
 
527
- 1. 读 `session.scope_verdict`
528
- 2. 路径 A(`large`):保持当前链;为后续 `roadmap` step 注入 `--from analyze:{analyze_macro_id}`;为后续 `plan` step 选 phase 列;继续推进
529
- 3. 路径 B(`medium` / `small`):
615
+ 1. 读 `session.scope_verdict` + `session.wants_roadmap`
616
+ 2. 路径 A(`large` `wants_roadmap`):保持当前链(roadmap+analyze);为后续 `roadmap` step 注入 `--from analyze:{analyze_macro_id}`;为后续 `plan` step 选 phase 列;继续推进
617
+ 3. 路径 B(`medium` / `small`,或 `large` 但非 `wants_roadmap`):
530
618
  - 删除 `goal-audit` 之前所有未完成的 `roadmap` + `analyze` (phase) step
531
619
  - 把下一个未完成的 `plan` step 改为 `maestro-plan --from analyze:{analyze_macro_id}`,去掉 `{phase}`,`source_artifact_ref = analyze:{analyze_macro_id}`
532
620
  - 后续 `execute` 等沿用同一 standalone scope(不带 `{phase}`,由 plan 写出的 task 列表驱动)
533
621
  4. 路径 C(`unknown`):
534
- - 非 auto_confirm → ask_user 二选一(large / medium-small);auto_confirm → 默认 large
622
+ - 非 auto_confirm → ask_user 二选一(roadmap 多发布 / 单一计划);auto_confirm → 默认路径 B(单一计划,不引入 roadmap)
535
623
  5. Reindex steps,标 decision completed,write status.json
536
624
  6. Display: ◆ Scope verdict: {verdict} → {kept|collapsed to standalone via analyze:{ANL_ID}}
537
625
 
@@ -578,9 +666,12 @@ Runs only when `task_decomposition` present.
578
666
  "phase": null, "phase_is_new": false,
579
667
  "milestone": "", // D-007 反查结果,禁止读 current_milestone
580
668
  "auto_mode": false,
669
+ "decomposition_owner": "ralph", // 分解契约所有者(invariant 15);缺省按 source 推断
670
+
581
671
  "quality_mode": "standard", // "full" | "standard" | "quick"
582
672
  "planning_mode": "independent", // "unified" | "independent"
583
673
  "scope_verdict": null, // "large" | "medium" | "small" | "unknown" | null
674
+ "wants_roadmap": false, // roadmap opt-in:--roadmap | 多发布 intent | roadmap.md 已存在
584
675
  "analyze_macro_id": null, // "ANL-xxx" 来自最新 macro analyze
585
676
  "blueprint_id": null, // "BLP-xxx" 若存在
586
677
  "cli_tool": "claude", "passed_gates": [],
@@ -672,6 +763,15 @@ quality-test {phase}
672
763
  decision:post-test {retry+1}
673
764
  ```
674
765
 
766
+ **post-frontend-verify:** (UI 写端点未接线/不可用时)
767
+ ```
768
+ quality-debug --from-frontend-verify "{gap_summary}"
769
+ maestro-plan --gaps {phase}
770
+ maestro-execute {phase}
771
+ quality-test {phase} --frontend-verify
772
+ decision:post-frontend-verify {retry+1}
773
+ ```
774
+
675
775
  **post-goal-audit:** (per unmet sub-goal group)
676
776
  ```
677
777
  # for each unmet sub-goal G{n}, scoped to target_phase:
@@ -718,14 +818,15 @@ decision:post-goal-audit {retry+1}
718
818
  - [ ] D-007 反查:phase 数字 → `session.milestone`,禁止读 current_milestone;写入 step.milestone_id
719
819
  - [ ] phase_is_new=true → lifecycle_position 强制 `analyze`
720
820
  - [ ] Intent overrides 识别 grill / brainstorm / blueprint / analyze-macro
721
- - [ ] auto_confirm=true 时 grill stage 跳过(交互式拷问不支持自动模式)
821
+ - [ ] auto_confirm=true 时 grill step args 追加 `-y`(grill 以 Auto mode 执行,stage 不跳过,产出 grill-report/terminology/context-package)
722
822
  - [ ] A_RESOLVE_SCOPE_VERDICT 读 macro analyze conclusions.scope_verdict,写入 session.scope_verdict + analyze_macro_id
723
- - [ ] 链路起点 = analyze-macro 时:large→roadmap+analyze+plan(phase)medium/small→直跳 plan --from analyze:{ANL_ID}(跳过 roadmap+analyze)
823
+ - [ ] 链路起点 = analyze-macro 时:large+wants_roadmap→roadmap+analyze+plan(phase);其余(含 large 默认/medium/small)→直跳 plan --from analyze:{ANL_ID}(跳过 roadmap+analyze)
724
824
  - [ ] post-analyze-scope decision 节点在 macro analyze 之后插入;A_SCOPE_EVALUATE/A_APPLY_SCOPE_VERDICT 重塑链路
725
825
  - [ ] plan step args 支持三路径:`{phase}` / `--from analyze:{ANL_ID}` / `--from blueprint:{BLP_ID}`,写入 step.source_artifact_ref
726
826
  - [ ] roadmap step args 自动注入 `--from analyze:{analyze_macro_id}`(若存在)
727
827
  - [ ] artifact 过滤按 session.phase;unified 按 milestone
728
828
  - [ ] quality_mode 由 A_DETERMINE_QUALITY_MODE 决定,过滤 build steps
829
+ - [ ] frontend-verify stage 仅在 phase 交付 UI 时插入(test 后、milestone-audit 前);post-frontend-verify 走 quality-gate 评估,evidence=e2e-results.json
729
830
  - [ ] Decomposition: broad intent ≤3 question clarify;narrow auto-derive
730
831
  - [ ] status.json 唯一真源:boundary_contract + execution_criteria + task_decomposition;无外部清单
731
832
  - [ ] 执行 step 含 `command_scope` + `command_path`(通过 `maestro ralph skills --platform agent --json --quiet` 预校验,project 覆盖 global);decision step 通过 `step.decision` 字段标识
@@ -739,5 +840,8 @@ decision:post-goal-audit {retry+1}
739
840
  - [ ] Chain 必须以 `milestone-complete` 结尾
740
841
  - [ ] Decision nodes 由 maestro delegate --role analyze 评估
741
842
  - [ ] Ralph 不执行 step,只 evaluate;invoke_skill("maestro-ralph-execute") handoff
843
+ - [ ] Phase-level deferred chaining:plan/execute step 的 `--from`/`--dir` 注入由 A_RESOLVE_ARGS(ralph-execute)运行时完成;build 阶段标记意图,不预知 artifact ID
844
+ - [ ] Phase-level plan step 运行时获得 `--from analyze:{phase_analyze_id}`(由 ralph-execute 从 state.json 查找注入)
845
+ - [ ] Phase-level execute step 运行时获得 `source_artifact_ref = "plan:{id}"`
742
846
 
743
847
  </appendix>
@@ -136,19 +136,44 @@ S_FALLBACK:
136
136
  | maestro-brainstorm | topic | `"{intent}"` |
137
137
  | maestro-roadmap | description | `"{intent}"` |
138
138
  | maestro-analyze | phase or topic | `{phase}` or `"{intent}"` |
139
- | maestro-plan | phase or --dir | `{phase}`, or `--dir {scratch_dir}` |
140
- | maestro-execute | phase or --dir | `{phase}`, or `--dir {scratch_dir}` |
139
+ | maestro-plan | phase, --from, or --dir | see --from auto-injection below |
140
+ | maestro-execute | phase or --dir | see --from auto-injection below |
141
141
  | quality-debug | gap context | Read previous step's error/gap |
142
142
  | quality-* | phase | `{phase}` |
143
143
 
144
- **Artifact dir resolution for --dir:**
144
+ **--from auto-injection (phase-level artifact chaining):**
145
+
146
+ Phase-level steps 在 build 阶段无法预知前序 artifact ID。A_RESOLVE_ARGS 运行时从 state.json 查找并注入显式引用,打通 analyze→plan→execute 数据管道:
147
+
145
148
  ```
146
- Read state.json filter artifacts by milestone + phase
147
- plan commands: latest type=="analyze" --dir .workflow/scratch/{path}
148
- execute commands: latest type=="plan" → --dir .workflow/scratch/{path}
149
+ Read state.json.artifacts(含 milestone_history 内归档 artifacts
150
+ filter by milestone={session.milestone} + phase={session.phase} + status=="completed"
151
+
152
+ plan step(含 {phase} 占位符,args 无 --from 且无 --dir):
153
+ 1. 查同 phase+milestone 最新 completed type=="analyze" artifact → id = ANL-xxx
154
+ 2. 命中 → args 追加 --from analyze:{id}
155
+ 3. 写 step.source_artifact_ref = "analyze:{id}"
156
+
157
+ execute step(含 {phase} 占位符,args 无 --dir):
158
+ 1. 查同 phase+milestone 最新 completed type=="plan" artifact → id = PLN-xxx, path = scratch/...
159
+ 2. 命中 → args 追加 --dir .workflow/scratch/{path}
160
+ 3. 写 step.source_artifact_ref = "plan:{id}"
149
161
  ```
150
162
 
151
- Write enriched args back to status.json.
163
+ 兜底:查询无结果 不注入,由命令自身 discovery 逻辑处理。已有 `--from` 或 `--dir` 的 step 不覆盖。
164
+
165
+ **Goal context injection:**
166
+
167
+ 当 step.goal_ref 非空且 session.task_decomposition 存在时:
168
+ ```
169
+ goal = session.task_decomposition.find(g => g.id == step.goal_ref)
170
+ if goal:
171
+ goal_snippet = { id: goal.id, goal: goal.goal, done_when: goal.done_when,
172
+ boundary: goal.boundary, evidence: goal.evidence }
173
+ → 传递给 A_EXEC_STEP 用于 inline execution 前注入(见 step 2 goal context pre-injection)
174
+ ```
175
+
176
+ Write enriched args + source_artifact_ref back to status.json.
152
177
 
153
178
  ### A_EXEC_DECISION
154
179
 
@@ -164,13 +189,24 @@ Write enriched args back to status.json.
164
189
  - 退出码 2 → 交给 S_LOCATE
165
190
  - 退出码 3 → active_step_index 已被占用
166
191
  - 退出码 1 → pause session
167
- 2. **Inline execution** — stdout 执行;deferred_reading 按需 Read
168
- 3. **Complete**:
192
+ 2. **Goal context pre-injection** — A_RESOLVE_ARGS 产出了 `goal_snippet`(step.goal_ref 非空),在 ralph next stdout prompt **顶部前置**以下 block,使执行命令感知当前子目标和执行约束:
193
+ ```
194
+ <goal_context>
195
+ Sub-goal: {goal.id} — {goal.goal}
196
+ Done when: {goal.done_when}
197
+ Boundary: {goal.boundary}
198
+ Evidence target: {goal.evidence}
199
+ Execution criteria: {session.execution_criteria joined by '; '}
200
+ </goal_context>
201
+ ```
202
+ 无 goal_snippet 时跳过此步。goal_context block 不替换 ralph next 的 stdout 内容,仅在其前方拼接。
203
+ 3. **Inline execution** — 按 stdout(含 goal_context 前置)执行;deferred_reading 按需 Read
204
+ 4. **Complete**:
169
205
  - `shell("maestro ralph complete N --status DONE [--evidence <path>]")`
170
206
  - `shell("maestro ralph complete N --status DONE_WITH_CONCERNS --concerns \"...\"")`
171
207
  - `shell("maestro ralph retry N")`
172
208
  - `shell("maestro ralph complete N --status BLOCKED --reason \"...\"")`
173
- 4. **Propagate context signals** — 关键信号 (`PHASE: N` / `scratch_dir: path` / `BLP-xxx`) 写入 `status.json.context`
209
+ 5. **Propagate context signals** — 关键信号 (`PHASE: N` / `scratch_dir: path` / `BLP-xxx`) 写入 `status.json.context`
174
210
 
175
211
  完成后 S_LOCATE 触发 `invoke_skill({ skill: "maestro-ralph-execute" })` 自调用。
176
212
 
@@ -246,5 +282,10 @@ Display: `[{index}/{total}] ✗ {step.skill} 失败,会话已暂停。/maestro
246
282
  - [ ] Context signals 由执行 step 显式写回 status.json.context(非 ralph-execute 内嵌扫描)
247
283
  - [ ] Auto mode: retry 一次后 pause;interactive 提供 retry/skip/abort
248
284
  - [ ] 自调用持续到全部 completion_confirmed 或 paused
285
+ - [ ] --from auto-injection:phase-level plan step 运行时从 state.json 查找同 phase+milestone 最新 completed analyze artifact → 注入 `--from analyze:{id}`,写 `source_artifact_ref`
286
+ - [ ] --from auto-injection:phase-level execute step 运行时查找同 phase+milestone 最新 completed plan artifact → 注入 `--dir`,写 `source_artifact_ref`
287
+ - [ ] Goal context injection:step.goal_ref 非空时从 task_decomposition 提取 goal_snippet,A_EXEC_STEP 在 ralph next stdout 顶部前置 `<goal_context>` block
288
+ - [ ] Goal context 包含 sub-goal description、done_when、boundary、evidence、execution_criteria
289
+ - [ ] 已有 `--from` 或 `--dir` 的 step 不被 auto-injection 覆盖
249
290
 
250
291
  </appendix>
@@ -70,12 +70,8 @@ Parse $ARGUMENTS to determine mode:
70
70
  - Update frontmatter via: `maestro wiki update <id> --frontmatter '{"tool": true, "category": "<cat>", "summary": "<summary>"}'`
71
71
  - Do NOT recreate the document — modify in place
72
72
 
73
- **For all modes** — identify the usage timing: when should an agent or user invoke this tool? This becomes the first line of the entry description (see Step 5).
74
-
75
73
  ### Step 3: Determine Category
76
74
 
77
- **Core principle**: `category` = **who consumes this tool** (which agent type discovers and uses it), not what the content is about.
78
-
79
75
  | Category | Consumer Agent | Decision Question | Signal Words |
80
76
  |---|---|---|---|
81
77
  | `coding` | code-developer, workflow-executor | 开发者实现时需要这个流程吗? | build, deploy, integrate, configure, setup, migrate, api-contract |
@@ -89,8 +85,6 @@ Parse $ARGUMENTS to determine mode:
89
85
  - API verification steps (how to test) → `category: test` (RCP-*, tool: true)
90
86
  - Ask user when ambiguous: "This tool content serves both developers and testers. Split into separate documents?"
91
87
 
92
- **Ambiguous cases**: Choose the **primary consumer** — the agent that would fail without this knowledge.
93
-
94
88
  ### Step 4: Decide Inline vs Ref
95
89
 
96
90
  - Steps <10 and no code blocks → **inline mode**
@@ -45,8 +45,6 @@ Load project UI conventions before extracting design system:
45
45
  maestro spec load --category ui
46
46
  ```
47
47
 
48
- If specs not initialized, continue without — the workflow still produces valid output.
49
-
50
48
  ## 2. Execute Workflow
51
49
 
52
50
  Route to `~/.maestro/workflows/ui-codify.md` and follow completely.
@@ -17,8 +17,6 @@ allowed-tools:
17
17
 
18
18
  <purpose>
19
19
  Analyze current repository's code patterns to auto-generate `.workflow/kg/extractors.yaml` — a declarative config that teaches MaestroGraph's codegraph extractor to recognize project-specific symbols beyond standard function/class/method declarations.
20
-
21
- Detects: builder/factory API registrations, domain constant patterns, custom decorator conventions, framework-specific patterns, module-level constants.
22
20
  </purpose>
23
21
 
24
22
  <context>
@@ -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
  - read_file
7
7
  - write_file
@@ -29,6 +29,29 @@ 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
+ 1. **Resolve targets**: 读 phase 的 `plan.json` / `.task/TASK-*.json`,提取所有 `[UI-observable]` convergence.criteria(plan 阶段产出);缺失则枚举后端写端点(POST/PUT/PATCH/DELETE)作为待验证清单。
37
+ 2. **Start app**: `next start`(或从 dashboard/package.json 解析的既有启动脚本);启动失败 → E003。
38
+ 3. **Drive browser**: 用 chrome-devtools MCP(`mcp__claude_dms3-chrome-devtools__*`:navigate / click / fill / take_snapshot / list_network_requests)逐条执行每个 `[UI-observable]` 流程,断言:UI 入口存在且可触发 → 对应写请求返回 2xx → DOM 出现预期结果。
39
+ 4. **Write evidence**: 产出 `e2e-results.json`(结构见下),逐条记 pass/fail + 证据(网络状态码、快照引用)。**确定性断言,禁止"无人应答=全过"**。
40
+ 5. **Verdict**: 任一 `[UI-observable]` fail 或写端点无 UI 入口 → STATUS=NEEDS_RETRY(ralph 经 post-frontend-verify 触发 Fix-Loop);全过 → DONE。
41
+
42
+ ```json
43
+ // e2e-results.json
44
+ { "phase": "{phase}", "app_url": "http://localhost:3000",
45
+ "checks": [ { "criterion": "[UI-observable] ...", "ui_entry": "<selector/route>",
46
+ "request": "POST /api/notes", "status": 201, "dom_assert": "list shows new item",
47
+ "passed": true } ],
48
+ "summary": { "total": 0, "passed": 0, "failed": 0 }, "verdict": "pass|fail" }
49
+ ```
50
+
51
+ Ralph-invoked 完成:`maestro ralph complete <idx> --status {STATUS} --evidence e2e-results.json`。
52
+
53
+ ---
54
+
32
55
  Follow '~/.maestro/workflows/test.md' completely.
33
56
 
34
57
  ### Phase Gates (MANDATORY, BLOCKING)
@@ -146,4 +169,5 @@ maestro ralph complete <idx> --status {STATUS} [--evidence {path}]
146
169
  - [ ] Gaps updated with root_cause, fix_direction, affected_files
147
170
  - [ ] Gap-fix loop triggered if --auto-fix (max 2 iterations)
148
171
  - [ ] Next step routed (phase-transition if pass, verify if auto-fix success, debug --from-uat if issues, test-gen if low coverage)
172
+ - [ ] `--frontend-verify`: 每条 [UI-observable] criterion 经真实浏览器断言,产出 e2e-results.json;任一 fail → NEEDS_RETRY(不放行)
149
173
  </success_criteria>
@@ -77,4 +77,3 @@ Follow '~/.maestro/workflows/specs-load.md' completely.
77
77
  - [ ] Legacy entries filtered by text grep fallback
78
78
  - [ ] Results displayed with file:category references
79
79
  </success_criteria>
80
- </output>
@@ -48,4 +48,3 @@ Follow '~/.maestro/workflows/specs-setup.md' completely.
48
48
  - [ ] Workflow recipe knowhow created in `.workflow/knowhow/` for each detected operational workflow (test / debug / build / dev / lint). Each recipe matches the `recipe` schema in `~/.maestro/workflows/knowhow.md` Part B and contains at least one runnable command.
49
49
  - [ ] Report displayed grouped by destination (specs / recipes / skipped / deferred), with `.proposed.md` files surfaced when an existing recipe slug was preserved.
50
50
  </success_criteria>
51
- </output>