@anhth2/spec-driven-dev-plugin 0.9.2 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/commands/debug.md +50 -20
  2. package/commands/define-product.md +49 -19
  3. package/commands/{generate-tests.md → dev-gen-test.md} +85 -23
  4. package/commands/{generate-tests.tmpl → dev-gen-test.tmpl} +18 -4
  5. package/{core/commands/run-tests.md → commands/dev-run-test.md} +102 -21
  6. package/commands/{run-tests.tmpl → dev-run-test.tmpl} +35 -2
  7. package/commands/{smoke-test.md → dev-smoke-test.md} +54 -24
  8. package/commands/{smoke-test.tmpl → dev-smoke-test.tmpl} +5 -5
  9. package/commands/fix-bug.md +50 -20
  10. package/commands/generate-bdd.md +78 -21
  11. package/commands/generate-bdd.tmpl +11 -2
  12. package/commands/generate-code.md +123 -23
  13. package/commands/generate-code.tmpl +56 -4
  14. package/commands/generate-design-spec.md +142 -47
  15. package/commands/generate-design-spec.tmpl +93 -28
  16. package/commands/generate-prd.md +49 -19
  17. package/commands/generate-spec-manifest.md +49 -19
  18. package/commands/generate-tech-docs.md +50 -20
  19. package/commands/generate-tech-docs.tmpl +1 -1
  20. package/commands/learn.md +50 -20
  21. package/commands/propose-scenario.md +50 -20
  22. package/commands/propose-scenario.tmpl +1 -1
  23. package/commands/qc-analyze.md +514 -0
  24. package/commands/qc-analyze.tmpl +71 -0
  25. package/commands/qc-design-test.md +510 -0
  26. package/commands/qc-design-test.tmpl +67 -0
  27. package/commands/qc-plan.md +492 -0
  28. package/commands/qc-plan.tmpl +49 -0
  29. package/commands/qc-report.md +491 -0
  30. package/commands/qc-report.tmpl +48 -0
  31. package/commands/qc-review.md +496 -0
  32. package/commands/qc-review.tmpl +53 -0
  33. package/commands/qc-run-test.md +538 -0
  34. package/commands/qc-run-test.tmpl +77 -0
  35. package/commands/refine-prd.md +203 -24
  36. package/commands/refine-prd.tmpl +16 -5
  37. package/commands/report-bug.md +49 -19
  38. package/commands/review-code.md +51 -21
  39. package/commands/review-code.tmpl +1 -1
  40. package/commands/review-context.md +198 -20
  41. package/commands/review-context.tmpl +11 -1
  42. package/commands/review-tech-docs.md +49 -19
  43. package/commands/setup-ai-first.md +14 -7
  44. package/commands/sync.md +30 -20
  45. package/commands/sync.tmpl +16 -13
  46. package/commands/update-framework.md +14 -7
  47. package/commands/validate-traces.md +106 -45
  48. package/commands/validate-traces.tmpl +57 -26
  49. package/core/FRAMEWORK_VERSION +1 -1
  50. package/core/commands/debug.md +50 -20
  51. package/core/commands/define-product.md +49 -19
  52. package/core/commands/{generate-tests.md → dev-gen-test.md} +85 -23
  53. package/{commands/run-tests.md → core/commands/dev-run-test.md} +102 -21
  54. package/core/commands/{smoke-test.md → dev-smoke-test.md} +54 -24
  55. package/core/commands/fix-bug.md +50 -20
  56. package/core/commands/generate-bdd.md +78 -21
  57. package/core/commands/generate-code.md +123 -23
  58. package/core/commands/generate-design-spec.md +142 -47
  59. package/core/commands/generate-prd.md +49 -19
  60. package/core/commands/generate-spec-manifest.md +49 -19
  61. package/core/commands/generate-tech-docs.md +50 -20
  62. package/core/commands/learn.md +50 -20
  63. package/core/commands/propose-scenario.md +50 -20
  64. package/core/commands/qc-analyze.md +514 -0
  65. package/core/commands/qc-design-test.md +510 -0
  66. package/core/commands/qc-plan.md +492 -0
  67. package/core/commands/qc-report.md +491 -0
  68. package/core/commands/qc-review.md +496 -0
  69. package/core/commands/qc-run-test.md +538 -0
  70. package/core/commands/refine-prd.md +203 -24
  71. package/core/commands/report-bug.md +49 -19
  72. package/core/commands/review-code.md +51 -21
  73. package/core/commands/review-context.md +198 -20
  74. package/core/commands/review-tech-docs.md +49 -19
  75. package/core/commands/setup-ai-first.md +14 -7
  76. package/core/commands/sync.md +30 -20
  77. package/core/commands/update-framework.md +14 -7
  78. package/core/commands/validate-traces.md +106 -45
  79. package/core/modules/qc-playwright/stack-profile.yaml +65 -0
  80. package/core/skills/code/SKILL.md +63 -26
  81. package/core/skills/debug/SKILL.md +78 -34
  82. package/core/skills/design-spec/SKILL.md +49 -19
  83. package/core/skills/discovery/SKILL.md +49 -19
  84. package/core/skills/prd/SKILL.md +28 -14
  85. package/core/skills/qc/qa-analyst/DOC_GAPS.template.md +63 -0
  86. package/core/skills/qc/qa-analyst/acceptance-criteria.md +56 -0
  87. package/core/skills/qc/qa-analyst/business-rules.md +55 -0
  88. package/core/skills/qc/qa-analyst/data-flow.md +60 -0
  89. package/core/skills/qc/qa-analyst/spec-breakdown.md +57 -0
  90. package/core/skills/qc/qa-designer/e2e/journey.md +41 -0
  91. package/core/skills/qc/qa-designer/exploratory/charter.md +68 -0
  92. package/core/skills/qc/qa-designer/exploratory/explore-to-functional.md +43 -0
  93. package/core/skills/qc/qa-designer/functional/api.md +45 -0
  94. package/core/skills/qc/qa-designer/functional/gui-feature.md +46 -0
  95. package/core/skills/qc/qa-designer/functional/gui-screen.md +52 -0
  96. package/core/skills/qc/qa-designer/integration/api.md +42 -0
  97. package/core/skills/qc/qa-designer/integration/db.md +39 -0
  98. package/core/skills/qc/qa-designer/integration/gui.md +40 -0
  99. package/core/skills/qc/qa-designer/integration/kafka.md +40 -0
  100. package/core/skills/qc/qa-designer/non-functional.md +40 -0
  101. package/core/skills/qc/qa-planner/test-plan.md +120 -0
  102. package/core/skills/qc/qa-reviewer/script/e2e.md +87 -0
  103. package/core/skills/qc/qa-reviewer/script/exploratory.md +45 -0
  104. package/core/skills/qc/qa-reviewer/script/functional.md +101 -0
  105. package/core/skills/qc/qa-reviewer/script/integration.md +91 -0
  106. package/core/skills/qc/qa-reviewer/script/non-functional.md +126 -0
  107. package/core/skills/qc/qa-reviewer/test-case/e2e.md +73 -0
  108. package/core/skills/qc/qa-reviewer/test-case/exploratory.md +43 -0
  109. package/core/skills/qc/qa-reviewer/test-case/functional.md +76 -0
  110. package/core/skills/qc/qa-reviewer/test-case/integration.md +69 -0
  111. package/core/skills/qc/qa-reviewer/test-case/non-functional.md +73 -0
  112. package/core/skills/qc/qa-runner/e2e.md +49 -0
  113. package/core/skills/qc/qa-runner/exploratory/session.md +36 -0
  114. package/core/skills/qc/qa-runner/functional/api.md +35 -0
  115. package/core/skills/qc/qa-runner/functional/gui-feature.md +51 -0
  116. package/core/skills/qc/qa-runner/functional/gui-screen.md +55 -0
  117. package/core/skills/qc/qa-runner/integration.md +47 -0
  118. package/core/skills/qc/qa-runner/non-functional.md +49 -0
  119. package/core/skills/qc/qa-runner/report/report.md +37 -0
  120. package/core/skills/setup-ai-first/SKILL.md +14 -7
  121. package/core/skills/spec/SKILL.md +28 -14
  122. package/core/skills/test/SKILL.md +121 -54
  123. package/core/steps/capture-lesson.md +1 -1
  124. package/core/steps/context-loader.md +35 -12
  125. package/core/steps/report-footer.md +14 -7
  126. package/core/steps/review-fanout.md +138 -0
  127. package/core/steps/spawn-agent.md +1 -1
  128. package/core/steps/trace-mirror.md +18 -0
  129. package/core/templates/design-spec.template.md +16 -8
  130. package/core/templates/project-context.yaml +8 -0
  131. package/docs/01-getting-started/README.md +19 -0
  132. package/docs/01-getting-started/core-concepts.md +102 -0
  133. package/docs/01-getting-started/installation.md +154 -0
  134. package/docs/01-getting-started/quickstart.md +85 -0
  135. package/docs/02-guides/README.md +27 -0
  136. package/docs/02-guides/developer/README.md +46 -0
  137. package/docs/02-guides/developer/bdd-and-trace.md +123 -0
  138. package/docs/02-guides/developer/commands.md +76 -0
  139. package/docs/02-guides/developer/pr-checklist.md +15 -0
  140. package/docs/02-guides/developer/scenarios.md +448 -0
  141. package/docs/02-guides/developer/workflow.md +59 -0
  142. package/docs/02-guides/product-owner/README.md +77 -0
  143. package/docs/02-guides/product-owner/commands.md +30 -0
  144. package/docs/02-guides/product-owner/handoff-checklist.md +42 -0
  145. package/docs/02-guides/product-owner/prd-writing-rules.md +45 -0
  146. package/docs/02-guides/product-owner/scenarios.md +357 -0
  147. package/docs/02-guides/qc-automation.md +92 -0
  148. package/docs/02-guides/tester/README.md +72 -0
  149. package/docs/02-guides/tester/bug-reporting.md +117 -0
  150. package/docs/02-guides/tester/reading-specs.md +79 -0
  151. package/docs/02-guides/tester/scenarios.md +186 -0
  152. package/docs/02-guides/tester/spec-manifest.md +124 -0
  153. package/docs/02-guides/tester/test-checklist.md +31 -0
  154. package/docs/02-guides/tester/workflow.md +79 -0
  155. package/docs/03-concepts/README.md +19 -0
  156. package/docs/03-concepts/architecture.md +243 -0
  157. package/docs/03-concepts/pipeline.md +249 -0
  158. package/docs/03-concepts/traceability.md +148 -0
  159. package/docs/04-operations/README.md +33 -0
  160. package/docs/04-operations/bug-flow.md +321 -0
  161. package/docs/04-operations/publishing.md +137 -0
  162. package/docs/04-operations/sync-and-update.md +328 -0
  163. package/docs/05-reference/README.md +29 -0
  164. package/docs/05-reference/commands.md +229 -0
  165. package/docs/05-reference/modules.md +110 -0
  166. package/docs/05-reference/trace-schema.md +146 -0
  167. package/docs/README.md +51 -0
  168. package/modules/qc-playwright/stack-profile.yaml +65 -0
  169. package/package.json +2 -2
  170. package/skills/code/SKILL.md +63 -26
  171. package/skills/debug/SKILL.md +78 -34
  172. package/skills/debug/SKILL.tmpl +1 -1
  173. package/skills/design-spec/SKILL.md +49 -19
  174. package/skills/discovery/SKILL.md +49 -19
  175. package/skills/prd/SKILL.md +28 -14
  176. package/skills/qc/qa-analyst/DOC_GAPS.template.md +63 -0
  177. package/skills/qc/qa-analyst/acceptance-criteria.md +56 -0
  178. package/skills/qc/qa-analyst/business-rules.md +55 -0
  179. package/skills/qc/qa-analyst/data-flow.md +60 -0
  180. package/skills/qc/qa-analyst/spec-breakdown.md +57 -0
  181. package/skills/qc/qa-designer/e2e/journey.md +41 -0
  182. package/skills/qc/qa-designer/exploratory/charter.md +68 -0
  183. package/skills/qc/qa-designer/exploratory/explore-to-functional.md +43 -0
  184. package/skills/qc/qa-designer/functional/api.md +45 -0
  185. package/skills/qc/qa-designer/functional/gui-feature.md +46 -0
  186. package/skills/qc/qa-designer/functional/gui-screen.md +52 -0
  187. package/skills/qc/qa-designer/integration/api.md +42 -0
  188. package/skills/qc/qa-designer/integration/db.md +39 -0
  189. package/skills/qc/qa-designer/integration/gui.md +40 -0
  190. package/skills/qc/qa-designer/integration/kafka.md +40 -0
  191. package/skills/qc/qa-designer/non-functional.md +40 -0
  192. package/skills/qc/qa-planner/test-plan.md +120 -0
  193. package/skills/qc/qa-reviewer/script/e2e.md +87 -0
  194. package/skills/qc/qa-reviewer/script/exploratory.md +45 -0
  195. package/skills/qc/qa-reviewer/script/functional.md +101 -0
  196. package/skills/qc/qa-reviewer/script/integration.md +91 -0
  197. package/skills/qc/qa-reviewer/script/non-functional.md +126 -0
  198. package/skills/qc/qa-reviewer/test-case/e2e.md +73 -0
  199. package/skills/qc/qa-reviewer/test-case/exploratory.md +43 -0
  200. package/skills/qc/qa-reviewer/test-case/functional.md +76 -0
  201. package/skills/qc/qa-reviewer/test-case/integration.md +69 -0
  202. package/skills/qc/qa-reviewer/test-case/non-functional.md +73 -0
  203. package/skills/qc/qa-runner/e2e.md +49 -0
  204. package/skills/qc/qa-runner/exploratory/session.md +36 -0
  205. package/skills/qc/qa-runner/functional/api.md +35 -0
  206. package/skills/qc/qa-runner/functional/gui-feature.md +51 -0
  207. package/skills/qc/qa-runner/functional/gui-screen.md +55 -0
  208. package/skills/qc/qa-runner/integration.md +47 -0
  209. package/skills/qc/qa-runner/non-functional.md +49 -0
  210. package/skills/qc/qa-runner/report/report.md +37 -0
  211. package/skills/setup-ai-first/SKILL.md +14 -7
  212. package/skills/spec/SKILL.md +28 -14
  213. package/skills/test/SKILL.md +121 -54
  214. package/skills/test/SKILL.tmpl +9 -9
  215. package/steps/capture-lesson.md +1 -1
  216. package/steps/context-loader.md +35 -12
  217. package/steps/report-footer.md +14 -7
  218. package/steps/review-fanout.md +138 -0
  219. package/steps/spawn-agent.md +1 -1
  220. package/steps/trace-mirror.md +18 -0
  221. package/templates/design-spec.template.md +16 -8
  222. package/templates/project-context.yaml +8 -0
  223. package/ARCHITECTURE.md +0 -247
@@ -165,7 +165,7 @@ If `services` section is present:
165
165
 
166
166
  **2. Route to service** — if active domain matches a key in `services`:
167
167
  - Override `paths.specs_dir` → `services.{domain}.specs_dir`
168
- - Override `paths.tech_docs_dir` → `services.{domain}.tech_docs_dir`
168
+ - Override `paths.tech_docs_dir` → `services.{domain}.tech_docs_dir` — **only if `setup.spec_source` is NOT set.** When `spec_source` IS set, the tech-design (API contract) is a cross-team artifact and must live in the shared spec repo (handled in step 4), so leave `tech_docs_dir` for step 4 to route — do NOT pin it per-service here.
169
169
  - Store `active_service` = `services.{domain}.path`
170
170
  - Store `active_service_module` = `services.{domain}.module`
171
171
  - If service has its own `module` → use it as `active_module` (overrides `tech_stack.module`)
@@ -177,7 +177,7 @@ If `services` section is present:
177
177
  **4. Spec source auto-override** — if `setup.spec_source` is set AND the corresponding path was not already explicitly set in `paths:`:
178
178
  - Override `paths.prd_dir` → `{spec_source}/specs/prd`
179
179
  - Override `paths.design_spec_dir` → `{spec_source}/specs/design-spec`
180
- - Override `paths.tech_docs_dir` → `{spec_source}/specs/tech-docs` — **only if step 2 did not already route it to a service** (multi-service umbrellas keep per-service tech-docs). This publishes the BE-authored API contract into the shared spec repo so FE/App can read it via the spec submodule at `/generate-code --phase=integration`.
180
+ - Override `paths.tech_docs_dir` → `{spec_source}/specs/tech-docs` — **always when `spec_source` is set** (step 2 no longer pins tech-docs per-service in this case). The tech-design IS the cross-team API contract: BE authors it here, and FE/App read it from the same spec submodule at `/generate-code --phase=integration`. *(Per-service tech-docs only happen when there is no `spec_source` — a pure multi-service BE repo with no shared spec module.)*
181
181
  - Override `paths.domain_knowledge_dir` → `{spec_source}/specs/domain-knowledge`
182
182
  - Override `paths.business_dictionary` → `{spec_source}/specs/domain-knowledge/business-dictionary.md`
183
183
  - Override `paths.core_entities` → `{spec_source}/specs/domain-knowledge/core-entities.md`
@@ -208,7 +208,7 @@ When `active_service` has been resolved to a real path in Step 1.5 (e.g., `user-
208
208
  | `paths.specs_dir` | `{active_service}/{service paths.specs_dir}` (if set in service config, else keep Step 1.5 override) |
209
209
 
210
210
  **3. Store** `service_root = {active_service}` as the working directory anchor for all downstream commands:
211
- - Shell commands (`/run-tests`, `/generate-tests`) run **from within** `service_root`
211
+ - Shell commands (`/dev-run-test`, `/dev-gen-test`) run **from within** `service_root`
212
212
  - File write operations (test files, trace TSVs) use paths **relative to** `service_root`
213
213
 
214
214
  **4. If service config not found** — keep umbrella defaults, still set `service_root = {active_service}` (path anchor is always needed even without a config override).
@@ -223,19 +223,41 @@ If the file does not exist → skip silently.
223
223
 
224
224
  ---
225
225
 
226
- ## Step 3 — [CRITICAL] Load CLAUDE.md
226
+ ## Step 3 — [CRITICAL] Load CLAUDE.md (layered: root + service overlay)
227
227
 
228
228
  *This is the highest-priority context — it defines HOW to write code and documents for this project.*
229
229
 
230
- Read `CLAUDE.md`. Extract and store:
230
+ CLAUDE.md is loaded in **two layers** so umbrella-wide rules and service-specific
231
+ architecture/coding standards compose correctly. The agent always sits at the umbrella
232
+ root, but the implementation code lives in a service submodule with its OWN stack,
233
+ architecture, and conventions — so the service's CLAUDE.md must win for code generation.
234
+
235
+ **Layer 1 — [BASE] Root CLAUDE.md (umbrella-wide).**
236
+ Read `CLAUDE.md` at the repo root. Treat its contents as the **shared baseline** for the
237
+ whole umbrella — git conventions, data-protection posture, cross-cutting rules, and (in
238
+ single-service mode) the project's only architecture + coding standards.
239
+
240
+ **Layer 2 — [OVERLAY] Service CLAUDE.md (umbrella mode only).**
241
+ *Run only if `service_root` was set in Step 1.6 (i.e. a real service was routed to).*
242
+ Read `{service_root}/CLAUDE.md`. This file defines the architecture + coding standards of
243
+ the **actual stack being implemented** (e.g. `user-service` = java-spring, `web` = nextjs).
244
+ Overlay it on top of Layer 1: **on any conflict, the service value WINS** for architecture,
245
+ coding standards, and error handling. Layer-1 values that the service does not redefine
246
+ (e.g. git conventions, banned patterns shared org-wide) remain in effect.
247
+
248
+ From the **merged** result, extract and store:
231
249
 
232
250
  - **§1 Project Overview** → project name, language, framework, build/test commands, domains
233
- - **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules
234
- - **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns
235
- - **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name
236
- - **§7 Git Conventions** → branch naming pattern, commit message format
251
+ - **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules — *service overlay wins*
252
+ - **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns — *service overlay wins*
253
+ - **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name — *service overlay wins*
254
+ - **§7 Git Conventions** → branch naming pattern, commit message format — *root baseline unless service redefines*
237
255
 
238
- If `CLAUDE.md` does not exist → note it as missing and continue with project-context.yaml data only.
256
+ **Resolution rules:**
257
+ - If both layers exist → merge as above; record `claude_md_source = root + {service_root}`.
258
+ - If only the service overlay exists (no root CLAUDE.md) → use the service file alone; `claude_md_source = {service_root}`.
259
+ - If `service_root` is set but `{service_root}/CLAUDE.md` is **missing** → fall back to root CLAUDE.md and flag ⚠️ in the Step 7 recap (the service has no architecture/coding-standards definition — code generation will use umbrella defaults, which may be the wrong stack).
260
+ - If neither exists → note CLAUDE.md as missing and continue with project-context.yaml data only.
239
261
 
240
262
  ---
241
263
 
@@ -301,7 +323,7 @@ active_module = tech_stack.module (e.g. "java-spring", "react", "flutter")
301
323
 
302
324
  If `tech_stack.module` is blank or not recognized → set `platform_type = "unknown"` and flag as ⚠️ in the Step 7 recap.
303
325
 
304
- These two variables (`active_module`, `platform_type`) are the canonical source for all branching logic in commands that need platform-specific behavior (generate-tests, debug, fix-bug, smoke-test).
326
+ These two variables (`active_module`, `platform_type`) are the canonical source for all branching logic in commands that need platform-specific behavior (dev-gen-test, debug, fix-bug, dev-smoke-test).
305
327
 
306
328
  ---
307
329
 
@@ -335,7 +357,8 @@ Output exactly this block:
335
357
  [CTX LOADED]
336
358
  Stack : {language} / {framework} / {database}
337
359
  Platform : {active_module} ({platform_type})
338
- Layers : {layer order from CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
360
+ Layers : {layer order from merged CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
361
+ CLAUDE.md : {root + {service_root} | {service_root} only | root only | ⚠️ service overlay MISSING — using root | missing}
339
362
  Ticket : {ticket_prefix}-
340
363
  Dict : {loaded — N canonical terms, M banned terms | missing}
341
364
  Entities : {loaded — EntityA, EntityB, EntityC | missing}
@@ -376,8 +399,12 @@ Check whether `services` array exists in `project-context.yaml`.
376
399
  - Use `services[N].trace_dir` if explicitly set
377
400
  - Otherwise default to `{services[N].path}/.trace`
378
401
  - Set `all_trace_dirs = [ dir1, dir2, ... ]` — one per service
379
- - Set `umbrella_root_trace = ".trace"` (at umbrella workspace root)
380
402
  - Step 1 will read TSVs from ALL dirs in `all_trace_dirs`, tagged by service name
403
+ - **Resolve the Living Docs home (canonical report location):**
404
+ - If `setup.spec_source` is set → `living_docs_dir = {spec_source}/.living-docs`
405
+ *(the shared specs module — mounted inside every service/umbrella workspace, so the panel resolves it no matter which submodule the dev is standing in)*
406
+ - Else (umbrella without a separate spec repo) → `living_docs_dir = .living-docs` at umbrella root
407
+ - **Resolve the panel mirror:** `panel_mirror = ./.trace` at the **current workspace root** (wherever this command runs). The VS Code panel reads `.trace/trace-report.json` from the open workspace — writing the merged report here is what makes the view non-empty when a dev opens a service submodule directly.
381
408
 
382
409
  **If no `services` key (single-service mode):**
383
410
  - Set `all_trace_dirs = [ {paths.trace_dir} ]`
@@ -440,6 +467,7 @@ If code was generated from an older revision → flag `TECHDOC_DRIFT`.
440
467
  *Skip this step if no TSV files existed (handled by Step 1 no-TSV path).*
441
468
 
442
469
  For each `.tsv` file processed: write updated `spec_ver`, `status`, `last_updated` back to disk.
470
+ Do **not** modify `dev_selftest`/`dev_selftest_at` (owned by `/dev-run-test`) or `qc_status`/`qc_run_at` (owned by `/qc-run-test`); this command only reads them for the report.
443
471
 
444
472
  ### Step 7 — Compute dashboard aggregates
445
473
 
@@ -455,6 +483,17 @@ test_coverage = rows where test_count > 0 / total_scs
455
483
  drift_count = rows where status == DRIFT
456
484
  untracked_count = rows where status == UNTRACKED
457
485
  gap_count = rows where status == GAP
486
+ dev_selftest_passing = rows where dev_selftest == pass
487
+ dev_selftest_failing = rows where dev_selftest == fail
488
+ dev_selftest_not_run = rows where dev_selftest in (not_run, —)
489
+ # NOTE: dev_selftest is the DEV self-check signal (did the dev run their own smoke tests),
490
+ # NOT official coverage — keep it labeled as such on the dashboard.
491
+ qc_passing = rows where qc_status == pass
492
+ qc_failing = rows where qc_status == fail
493
+ qc_skipped = rows where qc_status == skip
494
+ qc_not_run = rows where qc_status in (not_run, —)
495
+ # qc_status is the OFFICIAL QC automation result (set by /qc-run-test),
496
+ # shown alongside — never merged with — dev_selftest.
458
497
  tech_docs_count = count .md files in {paths.tech_docs_dir}/{domain}/
459
498
  ```
460
499
 
@@ -482,6 +521,13 @@ Schema:
482
521
  "drift_count": 0,
483
522
  "gap_count": 0,
484
523
  "untracked_count": 0,
524
+ "dev_selftest_passing": 0,
525
+ "dev_selftest_failing": 0,
526
+ "dev_selftest_not_run": 0,
527
+ "qc_passing": 0,
528
+ "qc_failing": 0,
529
+ "qc_skipped": 0,
530
+ "qc_not_run": 0,
485
531
  "tech_docs_count": 0
486
532
  },
487
533
  "prds": [
@@ -507,6 +553,10 @@ Schema:
507
553
  "implemented_by": "<ClassName.method or null>",
508
554
  "test_count": 0,
509
555
  "test_classes": ["<TestClass1>", "<TestClass2>"],
556
+ "dev_selftest": "pass | fail | not_run",
557
+ "dev_selftest_at": "<YYYY-MM-DD or null>",
558
+ "qc_status": "pass | fail | skip | not_run",
559
+ "qc_run_at": "<YYYY-MM-DD or null>",
510
560
  "prd_version": "<prd version when BDD was generated>",
511
561
  "bdd_version": "<bdd version when code was generated>",
512
562
  "tech_doc_revision": 0,
@@ -533,7 +583,7 @@ Schema:
533
583
  "sc_id": "<SC-ID>",
534
584
  "sc_title": "<title>",
535
585
  "implemented_by": "<method>",
536
- "fix": "/generate-tests <UC-ID>"
586
+ "fix": "/dev-gen-test <UC-ID>"
537
587
  }
538
588
  ],
539
589
  "untracked": [
@@ -571,37 +621,40 @@ Schema:
571
621
  - `tech_doc_revision`: use integer; `0` if not yet generated
572
622
  - `code_coverage_pct` / `test_coverage_pct`: round to nearest integer (0–100)
573
623
  - Always write to `{paths.trace_dir}/trace-report.json` regardless of domain filter — if a domain filter was applied, include only those PRDs in `prds[]` but note the domain in the `domain` field
574
- - **TSV `"—"` mapping**: when reading TSV files, map dash values to JSON types: `implemented_by: "—"` → `null`; `test_count: "—"` → `0`; `test_classes: "—"` → `[]`; `tech_doc_revision: "—"` → `0`
624
+ - **TSV `"—"` mapping**: when reading TSV files, map dash values to JSON types: `implemented_by: "—"` → `null`; `test_count: "—"` → `0`; `test_classes: "—"` → `[]`; `tech_doc_revision: "—"` → `0`; `dev_selftest: "—"` → `"not_run"`; `dev_selftest_at: "—"` → `null`; `qc_status: "—"` → `"not_run"`; `qc_run_at: "—"` → `null`
575
625
 
576
- ### Step 8b — Umbrella Living Docs Sync *(umbrella mode only)*
626
+ ### Step 8b — Living Docs Sync *(umbrella mode only)*
577
627
 
578
628
  *Skip this step in single-service mode.*
579
629
 
580
- After writing each service's `trace-report.json`, sync trace files to the umbrella root so the Living Docs VS Code panel (opened at umbrella root) can read them:
630
+ Authoritative trace state stays in each service submodule's `.trace/` (committed there).
631
+ This step publishes the merged report to the **canonical Living Docs home** (the specs
632
+ module) and drops a local mirror so the panel is never empty.
581
633
 
582
- 1. Create directory `{umbrella_root_trace}/` if it does not exist (`mkdir -p .trace`).
583
-
584
- 2. **Copy TSV files** from each service trace dir to umbrella trace dir with service namespace:
585
- ```
586
- {service.path}/.trace/{UC-ID}.tsv → .trace/{service-name}/{UC-ID}.tsv
587
- ```
588
- Overwrite if exists. Do not delete files in `.trace/` that no longer have a service source — they may be from a previous run.
634
+ 1. **Write canonical merged report** to `{living_docs_dir}/` (`mkdir -p` it first):
635
+ - `{living_docs_dir}/trace-report.json` — merge every per-service `trace-report.json`
636
+ into one document, add a `"service"` field per scenario row, recalc summary aggregates.
637
+ - `{living_docs_dir}/{service-name}/{UC-ID}.tsv` — copy each service's TSVs, namespaced
638
+ by service. Overwrite; don't delete TSVs whose service source is gone (prior runs).
589
639
 
590
- 3. **Write aggregated `trace-report.json`** to `{umbrella_root_trace}/trace-report.json`:
591
- - Merge all per-service `trace-report.json` data into one document
592
- - Add `"service"` field to each scenario row
593
- - Recalculate summary aggregates across all services
640
+ 2. **Mirror to the panel location** `{panel_mirror}` (`./.trace` at the current workspace
641
+ root) so a dev who opened *this* repo (umbrella **or** a single service submodule) sees
642
+ data immediately: copy `{living_docs_dir}/trace-report.json` `{panel_mirror}/trace-report.json`
643
+ (and the namespaced TSVs). If `panel_mirror` already resolves to `living_docs_dir`, skip.
594
644
 
595
- 4. **Print sync summary:**
645
+ 3. **Print sync summary:**
596
646
  ```
597
- Umbrella sync.trace/
598
- user-service : {N} TSV files copied
599
- order-service : {N} TSV files copied
647
+ Living Docs{living_docs_dir}/ (canonical, in specs module)
648
+ user-service : {N} TSV files
649
+ order-service : {N} TSV files
600
650
  trace-report.json: merged ({total} scenarios across {S} services)
601
- Living Docs panel will reflect this data immediately.
651
+ Panel mirror {panel_mirror}/trace-report.json (current workspace)
602
652
  ```
603
653
 
604
- > **Note:** `.trace/` at umbrella root is a **read-only mirror** do NOT commit it to the umbrella repo. Add `.trace/` to the umbrella's `.gitignore`. Authoritative trace state lives in each service submodule's `.trace/` dir and is committed there.
654
+ > **Note — both locations are generated, gitignored mirrors.** Add `.living-docs/` to the
655
+ > **specs module's** `.gitignore` and `.trace/` to the current repo's `.gitignore`. The only
656
+ > committed, authoritative trace state is each service submodule's own `.trace/`. The report
657
+ > is regenerated by `/validate-traces` or `/sync` — never commit it.
605
658
 
606
659
  ## Output
607
660
 
@@ -641,15 +694,22 @@ Suggest the logical next command based on workflow phase:
641
694
  | /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
642
695
  | /generate-bdd | `/review-context {feature-file}` to verify coverage |
643
696
  | /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
697
+ | /qc-analyze | `/qc-plan {UC-ID}` (resolve 🔴 blocker gaps first) |
698
+ | /qc-plan | `/qc-design-test {UC-ID}` |
699
+ | /qc-design-test | `/qc-review {UC-ID}` (test-case review) |
700
+ | /qc-review (test-case) | `/qc-run-test {UC-ID}` if APPROVED; fix TCs if NEEDS_FIX |
701
+ | /qc-run-test | `/qc-report {UC-ID}` then `/qc-review {UC-ID}` (script review) |
702
+ | /qc-review (script) | `/qc-report {UC-ID}` then create PR if APPROVED |
703
+ | /qc-report | `/validate-traces {UC-ID}` to refresh Living Docs (qc_status) |
644
704
  | /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
645
705
  | /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
646
- | /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/generate-tests {UC-ID}` |
647
- | /generate-tests | `/run-tests {UC-ID}` |
648
- | /run-tests (passing) | `/review-code {UC-ID}` |
649
- | /run-tests (failing) | `/fix-bug {ticket-id}` or `/debug {error}` |
650
- | /review-code | `/smoke-test {UC-ID}` or create PR |
651
- | /smoke-test | Create PR and link to ticket |
652
- | /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/generate-tests {UC-ID}`; all OK → create PR |
706
+ | /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/dev-gen-test {UC-ID}` |
707
+ | /dev-gen-test | `/dev-run-test {UC-ID}` |
708
+ | /dev-run-test (passing) | `/review-code {UC-ID}` |
709
+ | /dev-run-test (failing) | `/fix-bug {ticket-id}` or `/debug {error}` |
710
+ | /review-code | `/dev-smoke-test {UC-ID}` or create PR |
711
+ | /dev-smoke-test | Create PR and link to ticket |
712
+ | /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/dev-gen-test {UC-ID}`; all OK → create PR |
653
713
  | /fix-bug | Create PR and link to ticket |
654
714
  | /debug | `/fix-bug {ticket-id}` if fix needed |
655
715
  | /report-bug | Send to dev (`/fix-bug {BUG-ID}`); if coverage gap → `/propose-scenario {UC-ID}` |
@@ -702,11 +762,12 @@ Tech-Doc Revision Drift:
702
762
 
703
763
  Recommendations:
704
764
  - /generate-code {UC-ID} for DRIFT and UNTRACKED scenarios
705
- - /generate-tests {UC-ID} for GAP (missing tests)
765
+ - /dev-gen-test {UC-ID} for GAP (missing tests)
706
766
  - /generate-bdd {prd-file} for PRD version drift
707
767
 
708
768
  [Umbrella mode only]
709
- Living Docs synced.trace/ (umbrella root)
710
- Tip: run /validate-traces after each codegen session to refresh the panel.
711
- .trace/ at umbrella root is a mirror do not commit it (add to .gitignore).
769
+ Living Docs canonical{living_docs_dir}/ (specs module — shared, gitignored)
770
+ Panel mirror → {panel_mirror}/trace-report.json (current workspace)
771
+ Tip: run /validate-traces (or /sync) after each codegen session to refresh the panel.
772
+ Both are generated mirrors — do not commit (.living-docs/ + .trace/ in .gitignore).
712
773
  ```
@@ -0,0 +1,65 @@
1
+ # QC automation module — Python + pytest-playwright + Page Object
2
+ # Used by the /qc-* commands (the official QC automation pipeline ported from the QC team).
3
+ # This is the QC test-authoring/execution stack, independent of the dev implementation
4
+ # module (java-spring, react, flutter, …). Selected via tech_stack.qc_module or per /qc-* run.
5
+
6
+ build:
7
+ test: "python3 -m pytest"
8
+ e2e: "python3 -m pytest -m e2e"
9
+ report: "python3 -m pytest --html=reports/<feature>/report.html --self-contained-html"
10
+ show_trace: "python3 -m playwright show-trace <test-results/<nodeid>/trace.zip>"
11
+
12
+ architecture:
13
+ style: "Page Object Model over pytest-playwright — Markdown test-case first, Python second"
14
+ key_rules:
15
+ - "Markdown-first: never generate Python until a reviewed .Test.md exists for the feature"
16
+ - "No Allure, no hand-written dashboard, no record_video — use Playwright Trace + pytest-html"
17
+ - "No hard-coded URL/credential/timeout — read from Env.* and CONFIG[...]"
18
+ - "No time.sleep() — use Playwright auto-wait / expect()"
19
+ - "Each test independent via pytest-playwright fixtures (page / logged_in_page / …)"
20
+ - "Page Object extends slim BasePage; split 3 layers: locators _x(), actions verb_noun(), assertions assert_x() using expect()"
21
+ - "Locator priority: data-testid → role → label/text → CSS → avoid XPath"
22
+ - "Group tests by (role, account) so login/logout never interleaves across roles"
23
+ - "Cover 100% of TCs in the .Test.md — every TC ends Pass/Fail/Skip, none left Draft"
24
+ folder_structure: |
25
+ docs/<project>/<feature>/ ← test-case Markdown (.Test.md) — source of truth
26
+ pages/ ← Page Object Model
27
+ │ ├── base_page.py ← slim BasePage (click/fill/wait/screenshot)
28
+ │ └── <feature>_page.py
29
+ tests/ ← pytest scripts, 1-1 with docs/
30
+ │ ├── conftest.py ← fixtures: browser, page, logged_in_page, tracing
31
+ │ └── <project>/test_<feature>.py
32
+ utils/ ← config_loader, logger, steps, test_ordering, report helpers
33
+ test_data/ ← JSON datasets
34
+ config/config.yaml ← browser, timeout, video/screenshot/trace toggles
35
+ reports/ test-results/ ← generated (gitignored): html report, trace.zip, screenshots
36
+
37
+ coding_standards:
38
+ naming:
39
+ test_case_id: "TC_<FEATURE>_<NNN>"
40
+ test_class: "TestFeatureHappyCase"
41
+ test_function: "test_TC<NNN>_<snake_case>"
42
+ page_object: "<feature>_page.py with <Feature>Page class extending BasePage"
43
+ files:
44
+ test_case_md: "docs/<project>/<feature>/TC_<FEATURE>.Test.md"
45
+ page_object: "pages/<feature>_page.py"
46
+ test_script: "tests/<project>/test_<feature>.py"
47
+ patterns:
48
+ steps: "wrap steps with `with step(\"…\")` (from utils.steps import step)"
49
+ assertions: "Playwright expect() — never bare assert on dynamic UI"
50
+ fixtures: "auth fixtures register via register_auth_fixtures([...]) in project conftest"
51
+ fail_triage: "classify each FAIL as script-bug (fix selector/logic) vs product-gap (keep FAIL + evidence, never fake-pass)"
52
+
53
+ testing:
54
+ layers: "functional (gui-screen / gui-feature / api), integration (api/db/gui/kafka), e2e (journey), non-functional, exploratory"
55
+ runner: "pytest-playwright; trace via context.tracing.start in conftest"
56
+ report: "pytest-html (--html ... --self-contained-html) + Playwright Trace viewer"
57
+
58
+ trace_tags:
59
+ # QC tests map back to the framework's scenarios — drives qc_status in the trace TSV.
60
+ verifies: "# @trace.verifies={UC-ID}-SC{N}"
61
+ source: "# @trace.source=<official .feature path>"
62
+ test_type: "# @trace.test_type=functional|integration|e2e|non-functional"
63
+
64
+ # qc_status: /qc-run-test writes pass|fail|skip|not_run + qc_run_at into {trace_dir}/{UC-ID}.tsv
65
+ # (parallel to dev_selftest), surfaced in Living Docs as the OFFICIAL QC automation result.
@@ -190,7 +190,7 @@ If `services` section is present:
190
190
 
191
191
  **2. Route to service** — if active domain matches a key in `services`:
192
192
  - Override `paths.specs_dir` → `services.{domain}.specs_dir`
193
- - Override `paths.tech_docs_dir` → `services.{domain}.tech_docs_dir`
193
+ - Override `paths.tech_docs_dir` → `services.{domain}.tech_docs_dir` — **only if `setup.spec_source` is NOT set.** When `spec_source` IS set, the tech-design (API contract) is a cross-team artifact and must live in the shared spec repo (handled in step 4), so leave `tech_docs_dir` for step 4 to route — do NOT pin it per-service here.
194
194
  - Store `active_service` = `services.{domain}.path`
195
195
  - Store `active_service_module` = `services.{domain}.module`
196
196
  - If service has its own `module` → use it as `active_module` (overrides `tech_stack.module`)
@@ -202,7 +202,7 @@ If `services` section is present:
202
202
  **4. Spec source auto-override** — if `setup.spec_source` is set AND the corresponding path was not already explicitly set in `paths:`:
203
203
  - Override `paths.prd_dir` → `{spec_source}/specs/prd`
204
204
  - Override `paths.design_spec_dir` → `{spec_source}/specs/design-spec`
205
- - Override `paths.tech_docs_dir` → `{spec_source}/specs/tech-docs` — **only if step 2 did not already route it to a service** (multi-service umbrellas keep per-service tech-docs). This publishes the BE-authored API contract into the shared spec repo so FE/App can read it via the spec submodule at `/generate-code --phase=integration`.
205
+ - Override `paths.tech_docs_dir` → `{spec_source}/specs/tech-docs` — **always when `spec_source` is set** (step 2 no longer pins tech-docs per-service in this case). The tech-design IS the cross-team API contract: BE authors it here, and FE/App read it from the same spec submodule at `/generate-code --phase=integration`. *(Per-service tech-docs only happen when there is no `spec_source` — a pure multi-service BE repo with no shared spec module.)*
206
206
  - Override `paths.domain_knowledge_dir` → `{spec_source}/specs/domain-knowledge`
207
207
  - Override `paths.business_dictionary` → `{spec_source}/specs/domain-knowledge/business-dictionary.md`
208
208
  - Override `paths.core_entities` → `{spec_source}/specs/domain-knowledge/core-entities.md`
@@ -233,7 +233,7 @@ When `active_service` has been resolved to a real path in Step 1.5 (e.g., `user-
233
233
  | `paths.specs_dir` | `{active_service}/{service paths.specs_dir}` (if set in service config, else keep Step 1.5 override) |
234
234
 
235
235
  **3. Store** `service_root = {active_service}` as the working directory anchor for all downstream commands:
236
- - Shell commands (`/run-tests`, `/generate-tests`) run **from within** `service_root`
236
+ - Shell commands (`/dev-run-test`, `/dev-gen-test`) run **from within** `service_root`
237
237
  - File write operations (test files, trace TSVs) use paths **relative to** `service_root`
238
238
 
239
239
  **4. If service config not found** — keep umbrella defaults, still set `service_root = {active_service}` (path anchor is always needed even without a config override).
@@ -248,19 +248,41 @@ If the file does not exist → skip silently.
248
248
 
249
249
  ---
250
250
 
251
- ## Step 3 — [CRITICAL] Load CLAUDE.md
251
+ ## Step 3 — [CRITICAL] Load CLAUDE.md (layered: root + service overlay)
252
252
 
253
253
  *This is the highest-priority context — it defines HOW to write code and documents for this project.*
254
254
 
255
- Read `CLAUDE.md`. Extract and store:
255
+ CLAUDE.md is loaded in **two layers** so umbrella-wide rules and service-specific
256
+ architecture/coding standards compose correctly. The agent always sits at the umbrella
257
+ root, but the implementation code lives in a service submodule with its OWN stack,
258
+ architecture, and conventions — so the service's CLAUDE.md must win for code generation.
259
+
260
+ **Layer 1 — [BASE] Root CLAUDE.md (umbrella-wide).**
261
+ Read `CLAUDE.md` at the repo root. Treat its contents as the **shared baseline** for the
262
+ whole umbrella — git conventions, data-protection posture, cross-cutting rules, and (in
263
+ single-service mode) the project's only architecture + coding standards.
264
+
265
+ **Layer 2 — [OVERLAY] Service CLAUDE.md (umbrella mode only).**
266
+ *Run only if `service_root` was set in Step 1.6 (i.e. a real service was routed to).*
267
+ Read `{service_root}/CLAUDE.md`. This file defines the architecture + coding standards of
268
+ the **actual stack being implemented** (e.g. `user-service` = java-spring, `web` = nextjs).
269
+ Overlay it on top of Layer 1: **on any conflict, the service value WINS** for architecture,
270
+ coding standards, and error handling. Layer-1 values that the service does not redefine
271
+ (e.g. git conventions, banned patterns shared org-wide) remain in effect.
272
+
273
+ From the **merged** result, extract and store:
256
274
 
257
275
  - **§1 Project Overview** → project name, language, framework, build/test commands, domains
258
- - **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules
259
- - **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns
260
- - **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name
261
- - **§7 Git Conventions** → branch naming pattern, commit message format
276
+ - **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules — *service overlay wins*
277
+ - **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns — *service overlay wins*
278
+ - **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name — *service overlay wins*
279
+ - **§7 Git Conventions** → branch naming pattern, commit message format — *root baseline unless service redefines*
262
280
 
263
- If `CLAUDE.md` does not exist → note it as missing and continue with project-context.yaml data only.
281
+ **Resolution rules:**
282
+ - If both layers exist → merge as above; record `claude_md_source = root + {service_root}`.
283
+ - If only the service overlay exists (no root CLAUDE.md) → use the service file alone; `claude_md_source = {service_root}`.
284
+ - If `service_root` is set but `{service_root}/CLAUDE.md` is **missing** → fall back to root CLAUDE.md and flag ⚠️ in the Step 7 recap (the service has no architecture/coding-standards definition — code generation will use umbrella defaults, which may be the wrong stack).
285
+ - If neither exists → note CLAUDE.md as missing and continue with project-context.yaml data only.
264
286
 
265
287
  ---
266
288
 
@@ -326,7 +348,7 @@ active_module = tech_stack.module (e.g. "java-spring", "react", "flutter")
326
348
 
327
349
  If `tech_stack.module` is blank or not recognized → set `platform_type = "unknown"` and flag as ⚠️ in the Step 7 recap.
328
350
 
329
- These two variables (`active_module`, `platform_type`) are the canonical source for all branching logic in commands that need platform-specific behavior (generate-tests, debug, fix-bug, smoke-test).
351
+ These two variables (`active_module`, `platform_type`) are the canonical source for all branching logic in commands that need platform-specific behavior (dev-gen-test, debug, fix-bug, dev-smoke-test).
330
352
 
331
353
  ---
332
354
 
@@ -360,7 +382,8 @@ Output exactly this block:
360
382
  [CTX LOADED]
361
383
  Stack : {language} / {framework} / {database}
362
384
  Platform : {active_module} ({platform_type})
363
- Layers : {layer order from CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
385
+ Layers : {layer order from merged CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
386
+ CLAUDE.md : {root + {service_root} | {service_root} only | root only | ⚠️ service overlay MISSING — using root | missing}
364
387
  Ticket : {ticket_prefix}-
365
388
  Dict : {loaded — N canonical terms, M banned terms | missing}
366
389
  Entities : {loaded — EntityA, EntityB, EntityC | missing}
@@ -504,15 +527,22 @@ Suggest the logical next command based on workflow phase:
504
527
  | /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
505
528
  | /generate-bdd | `/review-context {feature-file}` to verify coverage |
506
529
  | /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
530
+ | /qc-analyze | `/qc-plan {UC-ID}` (resolve 🔴 blocker gaps first) |
531
+ | /qc-plan | `/qc-design-test {UC-ID}` |
532
+ | /qc-design-test | `/qc-review {UC-ID}` (test-case review) |
533
+ | /qc-review (test-case) | `/qc-run-test {UC-ID}` if APPROVED; fix TCs if NEEDS_FIX |
534
+ | /qc-run-test | `/qc-report {UC-ID}` then `/qc-review {UC-ID}` (script review) |
535
+ | /qc-review (script) | `/qc-report {UC-ID}` then create PR if APPROVED |
536
+ | /qc-report | `/validate-traces {UC-ID}` to refresh Living Docs (qc_status) |
507
537
  | /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
508
538
  | /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
509
- | /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/generate-tests {UC-ID}` |
510
- | /generate-tests | `/run-tests {UC-ID}` |
511
- | /run-tests (passing) | `/review-code {UC-ID}` |
512
- | /run-tests (failing) | `/fix-bug {ticket-id}` or `/debug {error}` |
513
- | /review-code | `/smoke-test {UC-ID}` or create PR |
514
- | /smoke-test | Create PR and link to ticket |
515
- | /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/generate-tests {UC-ID}`; all OK → create PR |
539
+ | /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/dev-gen-test {UC-ID}` |
540
+ | /dev-gen-test | `/dev-run-test {UC-ID}` |
541
+ | /dev-run-test (passing) | `/review-code {UC-ID}` |
542
+ | /dev-run-test (failing) | `/fix-bug {ticket-id}` or `/debug {error}` |
543
+ | /review-code | `/dev-smoke-test {UC-ID}` or create PR |
544
+ | /dev-smoke-test | Create PR and link to ticket |
545
+ | /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/dev-gen-test {UC-ID}`; all OK → create PR |
516
546
  | /fix-bug | Create PR and link to ticket |
517
547
  | /debug | `/fix-bug {ticket-id}` if fix needed |
518
548
  | /report-bug | Send to dev (`/fix-bug {BUG-ID}`); if coverage gap → `/propose-scenario {UC-ID}` |
@@ -622,15 +652,22 @@ Suggest the logical next command based on workflow phase:
622
652
  | /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
623
653
  | /generate-bdd | `/review-context {feature-file}` to verify coverage |
624
654
  | /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
655
+ | /qc-analyze | `/qc-plan {UC-ID}` (resolve 🔴 blocker gaps first) |
656
+ | /qc-plan | `/qc-design-test {UC-ID}` |
657
+ | /qc-design-test | `/qc-review {UC-ID}` (test-case review) |
658
+ | /qc-review (test-case) | `/qc-run-test {UC-ID}` if APPROVED; fix TCs if NEEDS_FIX |
659
+ | /qc-run-test | `/qc-report {UC-ID}` then `/qc-review {UC-ID}` (script review) |
660
+ | /qc-review (script) | `/qc-report {UC-ID}` then create PR if APPROVED |
661
+ | /qc-report | `/validate-traces {UC-ID}` to refresh Living Docs (qc_status) |
625
662
  | /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
626
663
  | /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
627
- | /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/generate-tests {UC-ID}` |
628
- | /generate-tests | `/run-tests {UC-ID}` |
629
- | /run-tests (passing) | `/review-code {UC-ID}` |
630
- | /run-tests (failing) | `/fix-bug {ticket-id}` or `/debug {error}` |
631
- | /review-code | `/smoke-test {UC-ID}` or create PR |
632
- | /smoke-test | Create PR and link to ticket |
633
- | /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/generate-tests {UC-ID}`; all OK → create PR |
664
+ | /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/dev-gen-test {UC-ID}` |
665
+ | /dev-gen-test | `/dev-run-test {UC-ID}` |
666
+ | /dev-run-test (passing) | `/review-code {UC-ID}` |
667
+ | /dev-run-test (failing) | `/fix-bug {ticket-id}` or `/debug {error}` |
668
+ | /review-code | `/dev-smoke-test {UC-ID}` or create PR |
669
+ | /dev-smoke-test | Create PR and link to ticket |
670
+ | /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/dev-gen-test {UC-ID}`; all OK → create PR |
634
671
  | /fix-bug | Create PR and link to ticket |
635
672
  | /debug | `/fix-bug {ticket-id}` if fix needed |
636
673
  | /report-bug | Send to dev (`/fix-bug {BUG-ID}`); if coverage gap → `/propose-scenario {UC-ID}` |