maestro-flow 0.3.32 → 0.3.34

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 (241) hide show
  1. package/.claude/commands/learn-retro.md +1 -1
  2. package/.claude/commands/maestro-composer.md +2 -2
  3. package/.claude/commands/maestro-ralph-execute.md +1 -1
  4. package/.claude/commands/maestro-ralph.md +11 -11
  5. package/.claude/commands/maestro-verify.md +1 -1
  6. package/.claude/commands/maestro.md +1 -2
  7. package/.claude/commands/quality-auto-test.md +124 -0
  8. package/.claude/commands/quality-refactor.md +1 -1
  9. package/.claude/commands/quality-test.md +3 -3
  10. package/.codex/skills/learn-retro/SKILL.md +1 -1
  11. package/.codex/skills/maestro/SKILL.md +1 -1
  12. package/.codex/skills/maestro-link-coordinate/SKILL.md +1 -1
  13. package/.codex/skills/maestro-milestone-audit/SKILL.md +9 -1
  14. package/.codex/skills/maestro-plan/SKILL.md +72 -6
  15. package/.codex/skills/maestro-ralph/SKILL.md +159 -159
  16. package/.codex/skills/maestro-roadmap/SKILL.md +31 -5
  17. package/.codex/skills/maestro-verify/SKILL.md +1 -1
  18. package/.codex/skills/quality-auto-test/SKILL.md +547 -0
  19. package/.codex/skills/quality-debug/SKILL.md +18 -6
  20. package/.codex/skills/quality-refactor/SKILL.md +8 -1
  21. package/.codex/skills/quality-sync/SKILL.md +23 -4
  22. package/.codex/skills/quality-test/SKILL.md +498 -166
  23. package/dashboard/dist-server/src/config/cli-tools-config.js +5 -20
  24. package/dashboard/dist-server/src/config/cli-tools-config.js.map +1 -1
  25. package/dashboard/dist-server/src/config/cli-tools-defaults.json +17 -0
  26. package/dist/src/commands/config.d.ts.map +1 -1
  27. package/dist/src/commands/config.js +168 -32
  28. package/dist/src/commands/config.js.map +1 -1
  29. package/dist/src/commands/hooks.d.ts +9 -0
  30. package/dist/src/commands/hooks.d.ts.map +1 -1
  31. package/dist/src/commands/hooks.js +1 -1
  32. package/dist/src/commands/hooks.js.map +1 -1
  33. package/dist/src/commands/install.js +1 -1
  34. package/dist/src/commands/install.js.map +1 -1
  35. package/dist/src/commands/overlay.js +1 -1
  36. package/dist/src/commands/overlay.js.map +1 -1
  37. package/dist/src/commands/tools.d.ts.map +1 -1
  38. package/dist/src/commands/tools.js +7 -17
  39. package/dist/src/commands/tools.js.map +1 -1
  40. package/dist/src/commands/uninstall.js +1 -1
  41. package/dist/src/commands/uninstall.js.map +1 -1
  42. package/dist/src/config/cli-tools-config.d.ts.map +1 -1
  43. package/dist/src/config/cli-tools-config.js +5 -20
  44. package/dist/src/config/cli-tools-config.js.map +1 -1
  45. package/dist/src/config/cli-tools-defaults.json +17 -0
  46. package/dist/src/tui/config-ui/ConfigHub.d.ts +14 -0
  47. package/dist/src/tui/config-ui/ConfigHub.d.ts.map +1 -0
  48. package/dist/src/tui/config-ui/ConfigHub.js +125 -0
  49. package/dist/src/tui/config-ui/ConfigHub.js.map +1 -0
  50. package/dist/src/tui/config-ui/ConfigSourcesView.d.ts +6 -0
  51. package/dist/src/tui/config-ui/ConfigSourcesView.d.ts.map +1 -0
  52. package/dist/src/tui/config-ui/ConfigSourcesView.js +25 -0
  53. package/dist/src/tui/config-ui/ConfigSourcesView.js.map +1 -0
  54. package/dist/src/tui/config-ui/HooksPanel.d.ts +6 -0
  55. package/dist/src/tui/config-ui/HooksPanel.d.ts.map +1 -0
  56. package/dist/src/tui/config-ui/HooksPanel.js +92 -0
  57. package/dist/src/tui/config-ui/HooksPanel.js.map +1 -0
  58. package/dist/src/tui/config-ui/SkillConfigDashboard.d.ts +9 -0
  59. package/dist/src/tui/config-ui/SkillConfigDashboard.d.ts.map +1 -0
  60. package/dist/src/tui/config-ui/SkillConfigDashboard.js +64 -0
  61. package/dist/src/tui/config-ui/SkillConfigDashboard.js.map +1 -0
  62. package/dist/src/tui/config-ui/SkillParamEditor.d.ts +12 -0
  63. package/dist/src/tui/config-ui/SkillParamEditor.d.ts.map +1 -0
  64. package/dist/src/tui/config-ui/SkillParamEditor.js +162 -0
  65. package/dist/src/tui/config-ui/SkillParamEditor.js.map +1 -0
  66. package/dist/src/tui/config-ui/SkillsList.d.ts +12 -0
  67. package/dist/src/tui/config-ui/SkillsList.d.ts.map +1 -0
  68. package/dist/src/tui/config-ui/SkillsList.js +91 -0
  69. package/dist/src/tui/config-ui/SkillsList.js.map +1 -0
  70. package/dist/src/tui/config-ui/SpecPanel.d.ts +6 -0
  71. package/dist/src/tui/config-ui/SpecPanel.d.ts.map +1 -0
  72. package/dist/src/tui/config-ui/SpecPanel.js +79 -0
  73. package/dist/src/tui/config-ui/SpecPanel.js.map +1 -0
  74. package/dist/src/tui/config-ui/index.d.ts +23 -0
  75. package/dist/src/tui/config-ui/index.d.ts.map +1 -0
  76. package/dist/src/tui/config-ui/index.js +34 -0
  77. package/dist/src/tui/config-ui/index.js.map +1 -0
  78. package/dist/src/tui/index.d.ts +7 -0
  79. package/dist/src/tui/index.d.ts.map +1 -0
  80. package/dist/src/tui/index.js +10 -0
  81. package/dist/src/tui/index.js.map +1 -0
  82. package/dist/src/tui/install-ui/BackupConfig.d.ts +10 -0
  83. package/dist/src/tui/install-ui/BackupConfig.d.ts.map +1 -0
  84. package/dist/src/tui/install-ui/BackupConfig.js +46 -0
  85. package/dist/src/tui/install-ui/BackupConfig.js.map +1 -0
  86. package/dist/src/tui/install-ui/BlueprintPreview.d.ts +9 -0
  87. package/dist/src/tui/install-ui/BlueprintPreview.d.ts.map +1 -0
  88. package/dist/src/tui/install-ui/BlueprintPreview.js +65 -0
  89. package/dist/src/tui/install-ui/BlueprintPreview.js.map +1 -0
  90. package/dist/src/tui/install-ui/BlueprintPreview.logic.d.ts +33 -0
  91. package/dist/src/tui/install-ui/BlueprintPreview.logic.d.ts.map +1 -0
  92. package/dist/src/tui/install-ui/BlueprintPreview.logic.js +51 -0
  93. package/dist/src/tui/install-ui/BlueprintPreview.logic.js.map +1 -0
  94. package/dist/src/tui/install-ui/ComponentGrid.d.ts +13 -0
  95. package/dist/src/tui/install-ui/ComponentGrid.d.ts.map +1 -0
  96. package/dist/src/tui/install-ui/ComponentGrid.js +75 -0
  97. package/dist/src/tui/install-ui/ComponentGrid.js.map +1 -0
  98. package/dist/src/tui/install-ui/ComponentGrid.logic.d.ts +31 -0
  99. package/dist/src/tui/install-ui/ComponentGrid.logic.d.ts.map +1 -0
  100. package/dist/src/tui/install-ui/ComponentGrid.logic.js +58 -0
  101. package/dist/src/tui/install-ui/ComponentGrid.logic.js.map +1 -0
  102. package/dist/src/tui/install-ui/ConfigPanel.d.ts +11 -0
  103. package/dist/src/tui/install-ui/ConfigPanel.d.ts.map +1 -0
  104. package/dist/src/tui/install-ui/ConfigPanel.js +35 -0
  105. package/dist/src/tui/install-ui/ConfigPanel.js.map +1 -0
  106. package/dist/src/tui/install-ui/CyberItem.d.ts +18 -0
  107. package/dist/src/tui/install-ui/CyberItem.d.ts.map +1 -0
  108. package/dist/src/tui/install-ui/CyberItem.js +33 -0
  109. package/dist/src/tui/install-ui/CyberItem.js.map +1 -0
  110. package/dist/src/tui/install-ui/CyberdeckBlueprint.d.ts +7 -0
  111. package/dist/src/tui/install-ui/CyberdeckBlueprint.d.ts.map +1 -0
  112. package/dist/src/tui/install-ui/CyberdeckBlueprint.js +91 -0
  113. package/dist/src/tui/install-ui/CyberdeckBlueprint.js.map +1 -0
  114. package/dist/src/tui/install-ui/ExecutionView.d.ts +12 -0
  115. package/dist/src/tui/install-ui/ExecutionView.d.ts.map +1 -0
  116. package/dist/src/tui/install-ui/ExecutionView.js +154 -0
  117. package/dist/src/tui/install-ui/ExecutionView.js.map +1 -0
  118. package/dist/src/tui/install-ui/GradientHeader.d.ts +8 -0
  119. package/dist/src/tui/install-ui/GradientHeader.d.ts.map +1 -0
  120. package/dist/src/tui/install-ui/GradientHeader.js +18 -0
  121. package/dist/src/tui/install-ui/GradientHeader.js.map +1 -0
  122. package/dist/src/tui/install-ui/HooksConfig.d.ts +8 -0
  123. package/dist/src/tui/install-ui/HooksConfig.d.ts.map +1 -0
  124. package/dist/src/tui/install-ui/HooksConfig.js +35 -0
  125. package/dist/src/tui/install-ui/HooksConfig.js.map +1 -0
  126. package/dist/src/tui/install-ui/InstallConfirm.d.ts +27 -0
  127. package/dist/src/tui/install-ui/InstallConfirm.d.ts.map +1 -0
  128. package/dist/src/tui/install-ui/InstallConfirm.js +25 -0
  129. package/dist/src/tui/install-ui/InstallConfirm.js.map +1 -0
  130. package/dist/src/tui/install-ui/InstallExecution.d.ts +21 -0
  131. package/dist/src/tui/install-ui/InstallExecution.d.ts.map +1 -0
  132. package/dist/src/tui/install-ui/InstallExecution.js +154 -0
  133. package/dist/src/tui/install-ui/InstallExecution.js.map +1 -0
  134. package/dist/src/tui/install-ui/InstallFlow.d.ts +14 -0
  135. package/dist/src/tui/install-ui/InstallFlow.d.ts.map +1 -0
  136. package/dist/src/tui/install-ui/InstallFlow.js +186 -0
  137. package/dist/src/tui/install-ui/InstallFlow.js.map +1 -0
  138. package/dist/src/tui/install-ui/InstallHub.d.ts +33 -0
  139. package/dist/src/tui/install-ui/InstallHub.d.ts.map +1 -0
  140. package/dist/src/tui/install-ui/InstallHub.js +97 -0
  141. package/dist/src/tui/install-ui/InstallHub.js.map +1 -0
  142. package/dist/src/tui/install-ui/InstallResult.d.ts +7 -0
  143. package/dist/src/tui/install-ui/InstallResult.d.ts.map +1 -0
  144. package/dist/src/tui/install-ui/InstallResult.js +15 -0
  145. package/dist/src/tui/install-ui/InstallResult.js.map +1 -0
  146. package/dist/src/tui/install-ui/McpConfig.d.ts +12 -0
  147. package/dist/src/tui/install-ui/McpConfig.d.ts.map +1 -0
  148. package/dist/src/tui/install-ui/McpConfig.js +69 -0
  149. package/dist/src/tui/install-ui/McpConfig.js.map +1 -0
  150. package/dist/src/tui/install-ui/ResultDashboard.d.ts +8 -0
  151. package/dist/src/tui/install-ui/ResultDashboard.d.ts.map +1 -0
  152. package/dist/src/tui/install-ui/ResultDashboard.js +17 -0
  153. package/dist/src/tui/install-ui/ResultDashboard.js.map +1 -0
  154. package/dist/src/tui/install-ui/ReviewPanel.d.ts +19 -0
  155. package/dist/src/tui/install-ui/ReviewPanel.d.ts.map +1 -0
  156. package/dist/src/tui/install-ui/ReviewPanel.js +25 -0
  157. package/dist/src/tui/install-ui/ReviewPanel.js.map +1 -0
  158. package/dist/src/tui/install-ui/ShortcutFooter.d.ts +7 -0
  159. package/dist/src/tui/install-ui/ShortcutFooter.d.ts.map +1 -0
  160. package/dist/src/tui/install-ui/ShortcutFooter.js +15 -0
  161. package/dist/src/tui/install-ui/ShortcutFooter.js.map +1 -0
  162. package/dist/src/tui/install-ui/StatuslineConfig.d.ts +11 -0
  163. package/dist/src/tui/install-ui/StatuslineConfig.d.ts.map +1 -0
  164. package/dist/src/tui/install-ui/StatuslineConfig.js +39 -0
  165. package/dist/src/tui/install-ui/StatuslineConfig.js.map +1 -0
  166. package/dist/src/tui/install-ui/StepSelector.d.ts +14 -0
  167. package/dist/src/tui/install-ui/StepSelector.d.ts.map +1 -0
  168. package/dist/src/tui/install-ui/StepSelector.js +46 -0
  169. package/dist/src/tui/install-ui/StepSelector.js.map +1 -0
  170. package/dist/src/tui/install-ui/index.d.ts +8 -0
  171. package/dist/src/tui/install-ui/index.d.ts.map +1 -0
  172. package/dist/src/tui/install-ui/index.js +10 -0
  173. package/dist/src/tui/install-ui/index.js.map +1 -0
  174. package/dist/src/tui/install-ui/types.d.ts +35 -0
  175. package/dist/src/tui/install-ui/types.d.ts.map +1 -0
  176. package/dist/src/tui/install-ui/types.js +25 -0
  177. package/dist/src/tui/install-ui/types.js.map +1 -0
  178. package/dist/src/tui/overlay-ui/OverlayList.d.ts +37 -0
  179. package/dist/src/tui/overlay-ui/OverlayList.d.ts.map +1 -0
  180. package/dist/src/tui/overlay-ui/OverlayList.js +146 -0
  181. package/dist/src/tui/overlay-ui/OverlayList.js.map +1 -0
  182. package/dist/src/tui/overlay-ui/index.d.ts +18 -0
  183. package/dist/src/tui/overlay-ui/index.d.ts.map +1 -0
  184. package/dist/src/tui/overlay-ui/index.js +204 -0
  185. package/dist/src/tui/overlay-ui/index.js.map +1 -0
  186. package/dist/src/tui/render.d.ts +13 -0
  187. package/dist/src/tui/render.d.ts.map +1 -0
  188. package/dist/src/tui/render.js +31 -0
  189. package/dist/src/tui/render.js.map +1 -0
  190. package/dist/src/tui/tools-ui/CommandReference.d.ts +7 -0
  191. package/dist/src/tui/tools-ui/CommandReference.d.ts.map +1 -0
  192. package/dist/src/tui/tools-ui/CommandReference.js +33 -0
  193. package/dist/src/tui/tools-ui/CommandReference.js.map +1 -0
  194. package/dist/src/tui/tools-ui/ConfigSources.d.ts +6 -0
  195. package/dist/src/tui/tools-ui/ConfigSources.d.ts.map +1 -0
  196. package/dist/src/tui/tools-ui/ConfigSources.js +27 -0
  197. package/dist/src/tui/tools-ui/ConfigSources.js.map +1 -0
  198. package/dist/src/tui/tools-ui/RegisterSettings.d.ts +8 -0
  199. package/dist/src/tui/tools-ui/RegisterSettings.d.ts.map +1 -0
  200. package/dist/src/tui/tools-ui/RegisterSettings.js +125 -0
  201. package/dist/src/tui/tools-ui/RegisterSettings.js.map +1 -0
  202. package/dist/src/tui/tools-ui/RoleMappings.d.ts +9 -0
  203. package/dist/src/tui/tools-ui/RoleMappings.d.ts.map +1 -0
  204. package/dist/src/tui/tools-ui/RoleMappings.js +104 -0
  205. package/dist/src/tui/tools-ui/RoleMappings.js.map +1 -0
  206. package/dist/src/tui/tools-ui/ToolsDashboard.d.ts +8 -0
  207. package/dist/src/tui/tools-ui/ToolsDashboard.d.ts.map +1 -0
  208. package/dist/src/tui/tools-ui/ToolsDashboard.js +60 -0
  209. package/dist/src/tui/tools-ui/ToolsDashboard.js.map +1 -0
  210. package/dist/src/tui/tools-ui/ToolsOverview.d.ts +9 -0
  211. package/dist/src/tui/tools-ui/ToolsOverview.d.ts.map +1 -0
  212. package/dist/src/tui/tools-ui/ToolsOverview.js +84 -0
  213. package/dist/src/tui/tools-ui/ToolsOverview.js.map +1 -0
  214. package/dist/src/tui/tools-ui/index.d.ts +3 -0
  215. package/dist/src/tui/tools-ui/index.d.ts.map +1 -0
  216. package/dist/src/tui/tools-ui/index.js +6 -0
  217. package/dist/src/tui/tools-ui/index.js.map +1 -0
  218. package/dist/src/tui/uninstall-ui/UninstallFlow.d.ts +7 -0
  219. package/dist/src/tui/uninstall-ui/UninstallFlow.d.ts.map +1 -0
  220. package/dist/src/tui/uninstall-ui/UninstallFlow.js +189 -0
  221. package/dist/src/tui/uninstall-ui/UninstallFlow.js.map +1 -0
  222. package/dist/src/tui/uninstall-ui/index.d.ts +3 -0
  223. package/dist/src/tui/uninstall-ui/index.d.ts.map +1 -0
  224. package/dist/src/tui/uninstall-ui/index.js +6 -0
  225. package/dist/src/tui/uninstall-ui/index.js.map +1 -0
  226. package/package.json +1 -1
  227. package/workflows/auto-test.md +682 -0
  228. package/workflows/business-test.md +570 -0
  229. package/workflows/integration-test.md +1 -1
  230. package/workflows/maestro.codex.md +4 -3
  231. package/workflows/maestro.md +5 -4
  232. package/workflows/status.md +2 -2
  233. package/workflows/test.md +1 -1
  234. package/workflows/verify.md +1 -1
  235. package/.claude/commands/quality-business-test.md +0 -110
  236. package/.claude/commands/quality-integration-test.md +0 -67
  237. package/.claude/commands/quality-test-gen.md +0 -68
  238. package/.codex/skills/maestro-ralph-execute/SKILL.md +0 -219
  239. package/.codex/skills/quality-business-test/SKILL.md +0 -218
  240. package/.codex/skills/quality-integration-test/SKILL.md +0 -427
  241. package/.codex/skills/quality-test-gen/SKILL.md +0 -352
@@ -1,166 +1,498 @@
1
- ---
2
- name: quality-test
3
- description: Conversational UAT with session persistence, auto-diagnosis, and gap-plan closure loop. Interactive testing flow with severity inference and parallel debug agents.
4
- argument-hint: "<phase> [-y] [--auto-fix] [--session ID]"
5
- allowed-tools: Read, Write, Edit, Bash, Glob, Grep, Agent, AskUserQuestion
6
- ---
7
-
8
- <purpose>
9
- Conversational UAT: present expected behavior one test at a time, user confirms or describes issues. Severity inferred from natural language (never asked). Session persists in `uat.md` across context resets. Failed tests trigger parallel debug agent diagnosis and optional gap-fix closure.
10
-
11
- **Philosophy**: Show expected, ask if reality matches.
12
- </purpose>
13
-
14
- <context>
15
- $ARGUMENTS -- phase number or scratch task ID, plus optional flags.
16
-
17
- **Usage**:
18
-
19
- ```bash
20
- $quality-test "3" # test phase 3
21
- $quality-test "3 --smoke" # smoke tests first, then UAT
22
- $quality-test "3 --auto-fix" # auto-trigger gap-fix loop on failures
23
- $quality-test "--session 04-comments" # resume specific session
24
- ```
25
-
26
- **Flags**:
27
- - `<phase>`: Phase number or scratch task ID
28
- - `--smoke`: Run cold-start smoke tests before UAT
29
- - `--auto-fix`: Auto-trigger gap-fix loop (plan --gaps -> execute -> re-verify) on failures
30
- - `--session ID`: Resume a specific UAT session
31
-
32
- `-y` implies `--auto-fix`。UAT 执行本身保持交互(展示预期 → 确认),`-y` 仅自动化 gap closure loop。
33
-
34
- **Output**: `{target_dir}/uat.md` + `.tests/test-plan.json` + `.tests/test-results.json` + `.tests/coverage-report.json`
35
- </context>
36
-
37
- <invariants>
38
- 1. **One test at a time** -- never batch-present tests
39
- 2. **Never ask severity** -- always infer from natural language
40
- 3. **Session persistence** -- uat.md survives context resets, resume from any point
41
- 4. **Batched writes** -- minimize file I/O (on issue, every 5 passes, completion)
42
- 5. **Gap-fix loop max 2 iterations** -- prevent infinite loops
43
- 6. **Agent calls use `run_in_background: false`** for synchronous execution
44
- 7. **Auto-create issues** in `.workflow/issues/issues.jsonl` for every failed test
45
- </invariants>
46
-
47
- <execution>
48
-
49
- ### Step 1: Resolve Target
50
-
51
- 1. Parse `$ARGUMENTS` for phase number, scratch task ID, or flags
52
- 2. **Phase mode**: resolve `PHASE_DIR` via artifact registry in `state.json` to `.workflow/scratch/{YYYYMMDD}-{type}-{slug}/`
53
- 3. **Scratch mode**: set `SCRATCH_DIR = .workflow/scratch/{id}/`
54
- 4. Validate target exists and has `verification.json` -- if missing: **E002**
55
-
56
- ### Step 2: Check Active Sessions
57
-
58
- Scan `.workflow/scratch` and `.workflow/phases` for existing `uat.md` files.
59
-
60
- - If active sessions exist and no target specified: display session table, ask user to resume or start new
61
- - If `--session ID` specified: resume that session directly (skip to Step 9)
62
- - If session exists for target: offer resume or restart
63
-
64
- ### Step 3: Smoke Tests (if --smoke)
65
-
66
- Run basic sanity checks (app starts, routes respond, build clean, deps installed).
67
- If any smoke fails: **E003** -- abort, suggest Skill({ skill: "quality-debug" })
68
-
69
- ### Step 4: Load Verification Context
70
-
71
- Read from target directory (resolved via artifact registry): verification.json, validation.json, index.json, plan.json, `.summaries/TASK-*.md`. Build testable list from user-observable outcomes.
72
-
73
- ### Step 4.5: Load Quality Context
74
-
75
- Query `state.json.artifacts[]` for all artifacts matching `phase === target_phase && milestone === current_milestone`. Each artifact's type determines its outputs: review → review.json (findings become additional test scenarios), debug → understanding.md (confirmed root causes become regression tests). Extract conclusions that may affect test scenario design.
76
-
77
- ### Step 5: Design Test Scenarios
78
-
79
- Create scenarios from testables (id T-001, name, category, expected behavior, requirement_ref). Focus on USER-OBSERVABLE outcomes. Write `{target_dir}/.tests/test-plan.json`.
80
-
81
- ### Step 6: Create UAT File
82
-
83
- Archive previous `uat.md` to `.history/` if exists.
84
- Write `{target_dir}/uat.md` with frontmatter (status, target, started), Current Test section, Tests section (all pending), Summary counters, empty Gaps section.
85
-
86
- ### Step 7: Present Test (Interactive Loop)
87
-
88
- Present one test at a time: show `TEST {number}/{total}: {name}`, expected behavior, then prompt user to type "pass" or describe what is wrong. Wait for user response (plain text).
89
-
90
- ### Step 8: Process Response
91
-
92
- | Response | Action |
93
- |----------|--------|
94
- | empty, "yes", "y", "ok", "pass", "next" | Mark as pass |
95
- | "skip", "can't test", "n/a" | Mark as skipped |
96
- | Anything else | Log as issue, infer severity |
97
-
98
- **Severity inference** (never ask):
99
- - "crashes", "error", "fails completely" -> blocker
100
- - "doesn't work", "wrong behavior", "broken" -> major
101
- - "works but...", "slow", "minor issue" -> minor
102
- - "color", "spacing", "typo" -> cosmetic
103
- - Default: major
104
-
105
- **On issue**: auto-create issue in `.workflow/issues/issues.jsonl` with back-reference.
106
-
107
- **Batched writes**: write to file on issue, every 5 passes, or completion.
108
-
109
- If more tests: update Current Test, loop to Step 7.
110
- If done: go to Step 10.
111
-
112
- ### Step 9: Resume From File
113
-
114
- Read `uat.md`, find first `result: [pending]` test, announce progress, continue from there (go to Step 7).
115
-
116
- ### Step 10: Complete Session
117
-
118
- 1. Update `uat.md` frontmatter: status -> "complete"
119
- 2. Archive previous result artifacts to `.history/`
120
- 3. Write `.tests/test-results.json` and `.tests/coverage-report.json`
121
- 4. Update `index.json` with UAT results
122
- 5. **Register artifact**: Append to `state.json.artifacts[]` with `type: "test"`, `id: TST-NNN`, `path: "scratch/{YYYYMMDD}-test-P{N}-{slug}"`, `depends_on: exec_art.id`. Output directory is independent scratch.
123
- 6. If no issues: go to Step 13
124
- 7. If issues found: go to Step 11
125
-
126
- ### Step 11: Auto-Diagnose
127
-
128
- Cluster related gaps by component/area. Spawn one debug Agent per cluster to investigate UAT failures — find root cause, fix direction, affected files, evidence (file:line). Update `uat.md` gaps with diagnosis results.
129
-
130
- ### Step 12: Gap Closure Decision
131
-
132
- **If `--auto-fix`**: execute gap-fix loop directly.
133
-
134
- **Otherwise**: present diagnosis summary and offer options:
135
- 1. Auto-fix (plan --gaps -> execute -> re-verify, max 2 iterations)
136
- 2. Debug deep -- Skill({ skill: "quality-debug" })
137
- 3. Plan fixes -- Skill({ skill: "maestro-plan", args: "--gaps" })
138
- 4. Manual fix
139
-
140
- Update issue lifecycle during gap-fix loop (registered -> planning -> executing -> completed/failed).
141
-
142
- ### Step 13: Report
143
-
144
- Display summary: target, smoke test results, UAT counts (passed/issues/skipped with severity breakdown), diagnosis coverage, auto-fix results, and suggested next command.
145
- </execution>
146
-
147
- <error_codes>
148
- | Code | Severity | Condition | Recovery |
149
- |------|----------|-----------|----------|
150
- | E001 | error | Phase or task target required | Prompt user for phase number |
151
- | E002 | error | Phase not verified (no verification.json) | Suggest Skill({ skill: "maestro-verify" }) |
152
- | E003 | error | Smoke test failed (app won't start) | Suggest Skill({ skill: "quality-debug" }) |
153
- | W001 | warning | Test scenarios failed | Auto-diagnose, suggest fix options |
154
- | W002 | warning | Coverage below threshold | Suggest Skill({ skill: "quality-test-gen" }) |
155
- </error_codes>
156
-
157
- <success_criteria>
158
- - [ ] Target resolved and verification context loaded
159
- - [ ] Test scenarios designed from user-observable outcomes
160
- - [ ] UAT file created with session persistence
161
- - [ ] Tests presented one at a time, severity inferred (never asked)
162
- - [ ] Issues auto-created for all failures
163
- - [ ] Diagnosis completed for failed test clusters
164
- - [ ] Gap closure offered (auto-fix or manual options)
165
- - [ ] Final report with pass/fail counts and next steps
166
- </success_criteria>
1
+ ---
2
+ name: quality-test
3
+ description: Conversational UAT with session persistence, CSV-parallel debug diagnosis via spawn_agents_on_csv, severity inference, and gap-plan closure loop.
4
+ argument-hint: "<phase> [-y] [--smoke] [--auto-fix] [--session ID]"
5
+ allowed-tools: spawn_agents_on_csv, Read, Write, Edit, Bash, Glob, Grep, AskUserQuestion
6
+ ---
7
+
8
+ <purpose>
9
+ Conversational UAT: present expected behavior one test at a time, user confirms or describes issues. Severity inferred from natural language (never asked). Session persists in `uat.md` across context resets. Failed tests trigger CSV-parallel diagnosis via `spawn_agents_on_csv` and optional gap-fix closure.
10
+
11
+ **Philosophy**: Show expected, ask if reality matches.
12
+
13
+ ```
14
+ +---------------------------------------------------------------------------+
15
+ | UAT CSV DIAGNOSIS PIPELINE |
16
+ +---------------------------------------------------------------------------+
17
+ | |
18
+ | Phase 1: Setup & Scenario Design |
19
+ | +-- Resolve target (phase / scratch) |
20
+ | +-- Check active sessions (resume or new) |
21
+ | +-- Smoke tests (if --smoke) |
22
+ | +-- Load verification context + quality artifacts |
23
+ | +-- Design test scenarios from user-observable outcomes |
24
+ | +-- Create uat.md with all tests pending |
25
+ | |
26
+ | Phase 2: Interactive Testing (one at a time) |
27
+ | +-- Present test: show expected behavior |
28
+ | +-- User responds: pass / skip / describe issue |
29
+ | +-- Severity inferred (never asked) |
30
+ | +-- Issues auto-created in issues.jsonl |
31
+ | +-- Batched writes to uat.md |
32
+ | |
33
+ | Phase 3: Diagnosis (if issues found) |
34
+ | +-- Cluster gaps by component/module |
35
+ | +-- Build diagnosis.csv from gap clusters |
36
+ | +-- Diagnose in parallel via spawn_agents_on_csv |
37
+ | +-- Each agent: find root cause, fix direction, affected files |
38
+ | +-- Merge results into uat.md gaps |
39
+ | |
40
+ | Phase 4: Gap Closure & Report |
41
+ | +-- If --auto-fix: plan --gaps -> execute -> re-verify (max 2) |
42
+ | +-- Otherwise: present options (auto-fix / debug / plan / manual) |
43
+ | +-- Issue lifecycle sync throughout |
44
+ | +-- Report with pass/fail counts and next steps |
45
+ | |
46
+ +---------------------------------------------------------------------------+
47
+ ```
48
+ </purpose>
49
+
50
+ <context>
51
+ ```bash
52
+ $quality-test "3" # test phase 3
53
+ $quality-test "3 --smoke" # smoke tests first, then UAT
54
+ $quality-test "3 --auto-fix" # auto-trigger gap-fix loop on failures
55
+ $quality-test "-y 3" # implies --auto-fix, skip gap closure prompt
56
+ $quality-test "--session 04-comments" # resume specific session
57
+ ```
58
+
59
+ **Flags**:
60
+ - `<phase>`: Phase number or scratch task ID
61
+ - `--smoke`: Run cold-start smoke tests before UAT
62
+ - `--auto-fix`: Auto-trigger gap-fix loop (plan --gaps -> execute -> re-verify) on failures
63
+ - `--session ID`: Resume a specific UAT session
64
+
65
+ `-y` implies `--auto-fix`. UAT itself remains interactive (present expected → user confirms). `-y` only automates the gap closure loop.
66
+
67
+ **Output**:
68
+ - `{target_dir}/uat.md` — session file (persistent)
69
+ - `{target_dir}/.tests/test-plan.json` scenario definitions
70
+ - `{target_dir}/.tests/test-results.json` — pass/fail results
71
+ - `{target_dir}/.tests/coverage-report.json` requirement coverage
72
+ - `.tests/.csv-session/diagnosis.csv` + `diagnosis-results.csv` — diagnosis artifacts
73
+ </context>
74
+
75
+ <csv_schema>
76
+
77
+ ### diagnosis.csv (Gap Diagnosis Phase)
78
+
79
+ ```csv
80
+ id,test_id,cluster,test_name,expected,reported,severity,target_files,issue_id,source_context,root_cause,fix_direction,affected_files,evidence,error
81
+ "DX-001","T-003","auth","Login validation","Valid login returns dashboard","Clicking login does nothing, no error","major","src/auth/login.ts;src/routes/auth.ts","ISS-20260503-001","login.ts calls authService.verify, auth.ts exports POST /login","","","","",""
82
+ "DX-002","T-005","events","Event cleanup on logout","Events unsubscribed after logout","Memory leak warning in console after logout","blocker","src/events/manager.ts","ISS-20260503-002","manager.ts has subscribe() but no unsubscribe in logout flow","","","","",""
83
+ ```
84
+
85
+ **Columns**:
86
+
87
+ | Column | Phase | Description |
88
+ |--------|-------|-------------|
89
+ | `id` | Input | Diagnosis ID (DX-NNN) |
90
+ | `test_id` | Input | Reference to T-NNN test |
91
+ | `cluster` | Input | Gap cluster name (component/area) |
92
+ | `test_name` | Input | Human-readable test name |
93
+ | `expected` | Input | Expected behavior from test scenario |
94
+ | `reported` | Input | User's issue description (verbatim) |
95
+ | `severity` | Input | Inferred severity (blocker/major/minor/cosmetic) |
96
+ | `target_files` | Input | Semicolon-separated source files to investigate |
97
+ | `issue_id` | Input | Back-reference to issues.jsonl entry |
98
+ | `source_context` | Input | Relevant code context (imports, exports, call chains) |
99
+ | `root_cause` | Output | Diagnosed root cause |
100
+ | `fix_direction` | Output | Suggested fix approach |
101
+ | `affected_files` | Output | Semicolon-separated files that need changes |
102
+ | `evidence` | Output | file:line references supporting diagnosis |
103
+ | `error` | Output | Agent error if diagnosis failed |
104
+
105
+ ### Session Structure
106
+
107
+ ```
108
+ {target_dir}/.tests/.csv-session/
109
+ +-- diagnosis.csv (diagnosis input)
110
+ +-- diagnosis-results.csv (diagnosis output)
111
+ ```
112
+ </csv_schema>
113
+
114
+ <invariants>
115
+ 1. **One test at a time** — never batch-present tests
116
+ 2. **Never ask severity** — always infer from natural language
117
+ 3. **Session persistence** — uat.md survives context resets, resume from any point
118
+ 4. **Batched writes** minimize file I/O (on issue, every 5 passes, completion)
119
+ 5. **Gap-fix loop max 2 iterations** — prevent infinite loops
120
+ 6. **CSV parallel diagnosis** — spawn_agents_on_csv for gap clusters, not sequential
121
+ 7. **Auto-create issues** every failed test creates entry in `.workflow/issues/issues.jsonl`
122
+ 8. **Issue lifecycle sync** track issues through registered planning executing completed/failed
123
+ </invariants>
124
+
125
+ <execution>
126
+
127
+ ### Step 1: Resolve Target
128
+
129
+ 1. Parse `$ARGUMENTS` for phase number, scratch task ID, or flags
130
+ 2. **Phase mode**: resolve `PHASE_DIR` via artifact registry in `state.json` (`type='execute'`, matching phase)
131
+ 3. **Scratch mode**: set `SCRATCH_DIR = .workflow/scratch/{id}/`
132
+ 4. Validate target exists and has `verification.json` — if missing: **E002**
133
+
134
+ ### Step 2: Check Active Sessions
135
+
136
+ Scan `.workflow/scratch` for existing `uat.md` files with `status: testing` in frontmatter.
137
+
138
+ - If active sessions exist and no target specified: display session table, ask user to resume or start new:
139
+ ```
140
+ ## Active UAT Sessions
141
+ | # | Target | Status | Current Test | Progress |
142
+ |---|--------|--------|--------------|----------|
143
+ | 1 | 04-comments | testing | 3. Reply to Comment | 2/6 |
144
+ Reply with a number to resume, or provide a phase/task to start new.
145
+ ```
146
+ - If `--session ID` specified: resume that session directly (skip to Step 9)
147
+ - If session exists for target: offer resume or restart
148
+
149
+ ### Step 3: Smoke Tests (if --smoke)
150
+
151
+ Skip if `--smoke` not set.
152
+
153
+ | Smoke Test | Check | Method |
154
+ |------------|-------|--------|
155
+ | App starts | Process runs without crash | Run start command, check exit code |
156
+ | Routes respond | Key endpoints return non-error | curl/fetch main routes |
157
+ | Build clean | No build errors | Build command succeeds |
158
+ | Dependencies | No missing deps | Install check |
159
+
160
+ Record in `uat.md` under `## Smoke Tests`. If any fails: **E003** — abort, suggest `$quality-debug`.
161
+
162
+ ### Step 4: Load Verification Context
163
+
164
+ Read from target directory: `verification.json`, `validation.json`, `index.json`, `plan.json`, `.summaries/TASK-*.md`. Build testable list from user-observable outcomes.
165
+
166
+ ### Step 4.5: Load Quality Context (Cross-Artifact Integration)
167
+
168
+ Query `state.json.artifacts[]` for all artifacts matching current phase and milestone:
169
+
170
+ **Review findings integration**:
171
+ - For `type: "review"` artifacts: read `review.json`, extract critical/high findings
172
+ - Generate additional test scenarios marked `source: "review_finding"`
173
+ - If review verdict is "BLOCK" and review-finding tests fail → auto-enter gap-fix loop
174
+
175
+ **Debug root cause integration**:
176
+ - For `type: "debug"` artifacts: read `understanding.md`, extract confirmed root causes
177
+ - Generate regression test scenarios marked `source: "debug_root_cause"`
178
+
179
+ ### Step 5: Design Test Scenarios
180
+
181
+ Create scenarios from testables:
182
+ - `id`: T-001, T-002, ...
183
+ - `name`: Brief test name
184
+ - `category`: "e2e" | "integration" | "unit"
185
+ - `expected`: Specific observable behavior
186
+ - `requirement_ref`: Which success criterion this covers
187
+ - `source`: "verification" | "review_finding" | "debug_root_cause"
188
+
189
+ Write `{target_dir}/.tests/test-plan.json`:
190
+ ```json
191
+ {
192
+ "target": "{phase or scratch ID}",
193
+ "generated_at": "{ISO}",
194
+ "tests": [...],
195
+ "coverage": {
196
+ "requirements_mapped": ["SC-001"],
197
+ "requirements_unmapped": ["SC-003"]
198
+ }
199
+ }
200
+ ```
201
+
202
+ Focus on USER-OBSERVABLE outcomes. Skip internal/non-observable items.
203
+
204
+ ### Step 6: Create UAT File
205
+
206
+ Archive previous `uat.md` to `.history/` if exists.
207
+
208
+ Write `{target_dir}/uat.md`:
209
+ ```markdown
210
+ ---
211
+ status: testing
212
+ target: {phase slug or scratch ID}
213
+ source: [list of summary files]
214
+ started: {ISO}
215
+ updated: {ISO}
216
+ ---
217
+
218
+ ## Current Test
219
+ number: 1
220
+ name: {first test name}
221
+ expected: |
222
+ {what user should observe}
223
+ awaiting: user response
224
+
225
+ ## Smoke Tests
226
+ {results if ran, otherwise omitted}
227
+
228
+ ## Tests
229
+ ### 1. {Test Name}
230
+ expected: {observable behavior}
231
+ result: [pending]
232
+
233
+ ## Summary
234
+ total: {N} passed: 0 issues: 0 pending: {N} skipped: 0
235
+
236
+ ## Gaps
237
+ [none yet]
238
+ ```
239
+
240
+ ### Step 7: Present Test (Interactive Loop)
241
+
242
+ Present one test at a time:
243
+ ```
244
+ ------------------------------------------------------------
245
+ TEST {number}/{total}: {name}
246
+ ------------------------------------------------------------
247
+
248
+ Expected behavior:
249
+ {expected}
250
+
251
+ ------------------------------------------------------------
252
+ > Type "pass" or describe what's wrong
253
+ ------------------------------------------------------------
254
+ ```
255
+
256
+ Wait for user response (plain text).
257
+
258
+ ### Step 8: Process Response
259
+
260
+ | Response | Action |
261
+ |----------|--------|
262
+ | empty, "yes", "y", "ok", "pass", "next" | Mark as pass |
263
+ | "skip", "can't test", "n/a" | Mark as skipped |
264
+ | Anything else | Log as issue, infer severity |
265
+
266
+ **Severity inference** (never ask):
267
+
268
+ | User says | Infer |
269
+ |-----------|-------|
270
+ | "crashes", "error", "exception", "fails completely", "can't use" | blocker |
271
+ | "doesn't work", "nothing happens", "wrong behavior", "broken" | major |
272
+ | "works but...", "slow", "weird", "minor issue", "inconsistent" | minor |
273
+ | "color", "spacing", "alignment", "looks off", "typo" | cosmetic |
274
+
275
+ Default: **major** if unclear.
276
+
277
+ **On issue**: auto-create issue in `.workflow/issues/issues.jsonl`:
278
+ ```json
279
+ {
280
+ "id": "ISS-{YYYYMMDD}-{NNN}",
281
+ "title": "UAT: {test.name} - {response truncated 100 chars}",
282
+ "status": "registered",
283
+ "priority": "{from severity}",
284
+ "severity": "{inferred}",
285
+ "source": "uat",
286
+ "phase_ref": "{phase}",
287
+ "gap_ref": "{test.id}",
288
+ "description": "Expected: {expected}. Reported: {verbatim}",
289
+ "tags": ["uat"]
290
+ }
291
+ ```
292
+
293
+ Back-reference: set `gap.issue_id = issue_id` in uat.md gap entry.
294
+
295
+ **Batched writes**: write to file on issue, every 5 passes, or completion.
296
+
297
+ If more tests → update Current Test, loop to Step 7.
298
+ If done → go to Step 10.
299
+
300
+ ### Step 9: Resume From File
301
+
302
+ Read `uat.md`, find first `result: [pending]` test, announce progress, continue from there (go to Step 7).
303
+
304
+ ### Step 10: Complete Session
305
+
306
+ 1. Update `uat.md` frontmatter: `status → "complete"`, update timestamp
307
+ 2. Archive previous result artifacts to `.history/`
308
+ 3. Write `.tests/test-results.json`:
309
+ ```json
310
+ { "target": "...", "completed_at": "...", "results": [...], "summary": { "total": N, "passed": N, "issues": N, "skipped": N } }
311
+ ```
312
+ 4. Write `.tests/coverage-report.json`:
313
+ ```json
314
+ { "target": "...", "requirements_covered": [...], "requirements_uncovered": [...], "coverage_percentage": 66.7 }
315
+ ```
316
+ 5. Update `index.json` with UAT results
317
+ 6. **Register artifact** in `state.json.artifacts[]`:
318
+ ```json
319
+ { "id": "TST-NNN", "type": "test", "milestone": "current", "phase": "target_phase", "scope": "phase",
320
+ "path": "scratch/{YYYYMMDD}-test-P{N}-{slug}", "status": "completed|failed", "depends_on": "exec_art.id" }
321
+ ```
322
+ 7. If no issues → go to Step 13
323
+ 8. If issues found → go to Step 11
324
+
325
+ ### Step 11: Auto-Diagnose via CSV Parallel
326
+
327
+ **Cluster gaps and diagnose in parallel via `spawn_agents_on_csv`.**
328
+
329
+ #### 11a. Cluster Gaps
330
+
331
+ Group issues by affected component/area:
332
+ - Same file/module → one cluster
333
+ - Same feature/flow → one cluster
334
+ - Unrelated → separate clusters
335
+
336
+ #### 11b. Build diagnosis.csv
337
+
338
+ ```
339
+ mkdir -p {target_dir}/.tests/.csv-session
340
+
341
+ For each gap in uat.md:
342
+ Resolve target_files from gap context (test expected behavior → source files)
343
+ Gather source_context (imports, exports, call chains from target files)
344
+ Create one diagnosis.csv row with: id, test_id, cluster, test_name, expected, reported, severity, target_files, issue_id, source_context
345
+ ```
346
+
347
+ #### 11c. Parallel Diagnosis via spawn_agents_on_csv
348
+
349
+ ```javascript
350
+ spawn_agents_on_csv({
351
+ csv_path: `${targetDir}/.tests/.csv-session/diagnosis.csv`,
352
+ id_column: "id",
353
+ instruction: `
354
+ You are a UAT failure diagnostician. Investigate ONE gap cluster.
355
+
356
+ ## Task
357
+ - Read all target_files to understand the relevant code
358
+ - Analyze: why does the expected behavior not match what user reported?
359
+ - Find the root cause (not the symptom)
360
+ - Suggest a fix direction (what needs to change, not exact code)
361
+ - List all files that would need modification
362
+
363
+ ## Output
364
+ - root_cause: Concise explanation of why the issue occurs
365
+ - fix_direction: Suggested approach to fix (e.g., "Add null check before accessing user.email")
366
+ - affected_files: Semicolon-separated list of files needing changes
367
+ - evidence: file:line references supporting your diagnosis
368
+
369
+ ## Rules
370
+ - Do NOT modify any files — diagnosis only
371
+ - Focus on root cause, not symptoms
372
+ - Reference issue_id in your findings for traceability
373
+ - If multiple gaps in same cluster share a root cause, note the shared cause
374
+ `,
375
+ max_concurrency: 5,
376
+ max_runtime_seconds: 1200,
377
+ output_csv_path: `${targetDir}/.tests/.csv-session/diagnosis-results.csv`,
378
+ output_schema: { id, root_cause, fix_direction, affected_files, evidence, error }
379
+ })
380
+ ```
381
+
382
+ #### 11d. Merge Results
383
+
384
+ Update `uat.md` gaps with diagnosis:
385
+ ```yaml
386
+ - test: {N}
387
+ truth: "..."
388
+ status: failed
389
+ reason: "..."
390
+ severity: {inferred}
391
+ issue_id: ISS-YYYYMMDD-NNN
392
+ root_cause: "{diagnosed cause}"
393
+ fix_direction: "{suggested approach}"
394
+ affected_files: ["{file1}", "{file2}"]
395
+ ```
396
+
397
+ ### Step 12: Gap Closure Decision
398
+
399
+ **If `--auto-fix` or `-y`**: execute gap-fix loop directly.
400
+
401
+ **Otherwise**: present diagnosis summary and offer options:
402
+ ```
403
+ ### Diagnosis Complete
404
+
405
+ | Gap | Severity | Root Cause | Fix Direction |
406
+ |-----|----------|------------|---------------|
407
+ | T-3 | major | Missing null check | Add guard clause |
408
+ | T-5 | blocker | Event not cleaned | Add cleanup logic |
409
+
410
+ Options:
411
+ 1. Auto-fix — Plan and execute fixes, then re-verify
412
+ 2. Debug deep — $quality-debug per issue
413
+ 3. Plan fixes — $maestro-plan "--gaps"
414
+ 4. Manual fix — Address issues yourself
415
+ ```
416
+
417
+ | Choice | Action |
418
+ |--------|--------|
419
+ | 1 / "auto-fix" | Execute gap-fix loop |
420
+ | 2 / "debug" | Suggest `$quality-debug "--from-uat {phase}"` |
421
+ | 3 / "plan" | Suggest `$maestro-plan "{phase} --gaps"` |
422
+ | 4 / "manual" | Done, report results |
423
+
424
+ **Gap-fix closure loop** (max 2 iterations):
425
+ 1. `$maestro-plan "{phase} --gaps"` — generate fix tasks from gaps
426
+ 2. `$maestro-execute "{phase}"` — execute fix tasks
427
+ 3. `$maestro-verify "{phase}"` — re-verify
428
+
429
+ **Issue lifecycle sync during loop:**
430
+ - Before plan: `registered` → `planning`
431
+ - Before execute: `planning` → `executing`
432
+ - After re-verify: resolved gaps → `completed` (resolution: "auto-fixed via gap-fix loop"), unresolved → `failed`
433
+
434
+ If re-verify passes: update uat.md gaps as resolved, report success.
435
+ If gaps remain after 2 iterations: report remaining, suggest manual intervention.
436
+
437
+ ### Step 13: Report
438
+
439
+ ```
440
+ === UAT RESULTS ===
441
+ Target: {target}
442
+
443
+ Smoke Tests: {smoke_count} run, {smoke_pass} passed (if ran)
444
+ UAT Tests: {total} total
445
+ Passed: {passed}
446
+ Issues: {issues} ({blocker_count} blockers, {major_count} major)
447
+ Skipped: {skipped}
448
+
449
+ Diagnosis: {diagnosed_count}/{issues} gaps diagnosed
450
+ Auto-fix: {fixed_count} gaps resolved (if ran)
451
+
452
+ Files:
453
+ {target_dir}/uat.md
454
+ {target_dir}/.tests/test-results.json
455
+ {target_dir}/.tests/coverage-report.json
456
+ {target_dir}/.tests/.csv-session/diagnosis-results.csv (if diagnosed)
457
+ ```
458
+
459
+ **Next-step routing:**
460
+
461
+ | Result | Next Step |
462
+ |--------|-----------|
463
+ | All passed, no gaps | `$maestro-milestone-audit` |
464
+ | Auto-fix ran and succeeded | `$maestro-verify "{phase}"` |
465
+ | Auto-fix ran but gaps remain | `$quality-debug "--from-uat {phase}"` |
466
+ | Issues found, manual fix needed | `$quality-debug "--from-uat {phase}"` |
467
+ | Coverage below threshold | `$quality-auto-test "{phase}"` |
468
+ | Need integration tests | `$quality-auto-test "{phase}"` |
469
+
470
+ </execution>
471
+
472
+ <error_codes>
473
+ | Code | Severity | Condition | Recovery |
474
+ |------|----------|-----------|----------|
475
+ | E001 | error | Phase or task target required (no active sessions) | Prompt user for phase number |
476
+ | E002 | error | Phase not verified (no verification.json) | Suggest `$maestro-verify` |
477
+ | E003 | error | Smoke test failed (app won't start) | Suggest `$quality-debug` |
478
+ | W001 | warning | Test scenarios failed | Auto-diagnose, suggest fix options |
479
+ | W002 | warning | Coverage below threshold | Suggest `$quality-auto-test` |
480
+ </error_codes>
481
+
482
+ <success_criteria>
483
+ - [ ] Target resolved and verification context loaded
484
+ - [ ] Quality artifacts loaded (review findings → extra tests, debug root causes → regression tests)
485
+ - [ ] Test scenarios designed from user-observable outcomes
486
+ - [ ] UAT file created with session persistence
487
+ - [ ] Tests presented one at a time, severity inferred (never asked)
488
+ - [ ] Issues auto-created in issues.jsonl for all failures
489
+ - [ ] Batched writes: on issue, every 5 passes, or completion
490
+ - [ ] test-results.json and coverage-report.json written
491
+ - [ ] index.json uat fields updated
492
+ - [ ] Artifact registered in state.json
493
+ - [ ] If issues: diagnosis.csv built, spawn_agents_on_csv executed per gap cluster
494
+ - [ ] Gaps updated with root_cause, fix_direction, affected_files
495
+ - [ ] Gap-fix loop triggered if --auto-fix (max 2 iterations)
496
+ - [ ] Issue lifecycle synced through gap-fix loop
497
+ - [ ] Next step routed based on result
498
+ </success_criteria>