@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
@@ -1,4 +1,10 @@
1
- # /run-tests — Run Tests & Report Results
1
+ # /dev-run-test — Run Dev Self-Check Tests & Report Results
2
+
3
+ > **Scope — dev self-check (smoke), not the official test suite.** Runs the tests produced
4
+ > by `/dev-gen-test` so the developer can confirm their own code works before review. This
5
+ > is a developer self-check, **not** the QC/dev-team's authoritative test run (separate flow).
6
+ > The pass/fail is published to Living Docs as a **dev self-test** signal — it tells QC the
7
+ > dev ran their checks; it is NOT a statement of official test coverage.
2
8
 
3
9
  ## Gate
4
10
  # Gate — Universal Entry Procedure
@@ -163,7 +169,7 @@ If `services` section is present:
163
169
 
164
170
  **2. Route to service** — if active domain matches a key in `services`:
165
171
  - Override `paths.specs_dir` → `services.{domain}.specs_dir`
166
- - Override `paths.tech_docs_dir` → `services.{domain}.tech_docs_dir`
172
+ - 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.
167
173
  - Store `active_service` = `services.{domain}.path`
168
174
  - Store `active_service_module` = `services.{domain}.module`
169
175
  - If service has its own `module` → use it as `active_module` (overrides `tech_stack.module`)
@@ -175,7 +181,7 @@ If `services` section is present:
175
181
  **4. Spec source auto-override** — if `setup.spec_source` is set AND the corresponding path was not already explicitly set in `paths:`:
176
182
  - Override `paths.prd_dir` → `{spec_source}/specs/prd`
177
183
  - Override `paths.design_spec_dir` → `{spec_source}/specs/design-spec`
178
- - 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`.
184
+ - 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.)*
179
185
  - Override `paths.domain_knowledge_dir` → `{spec_source}/specs/domain-knowledge`
180
186
  - Override `paths.business_dictionary` → `{spec_source}/specs/domain-knowledge/business-dictionary.md`
181
187
  - Override `paths.core_entities` → `{spec_source}/specs/domain-knowledge/core-entities.md`
@@ -206,7 +212,7 @@ When `active_service` has been resolved to a real path in Step 1.5 (e.g., `user-
206
212
  | `paths.specs_dir` | `{active_service}/{service paths.specs_dir}` (if set in service config, else keep Step 1.5 override) |
207
213
 
208
214
  **3. Store** `service_root = {active_service}` as the working directory anchor for all downstream commands:
209
- - Shell commands (`/run-tests`, `/generate-tests`) run **from within** `service_root`
215
+ - Shell commands (`/dev-run-test`, `/dev-gen-test`) run **from within** `service_root`
210
216
  - File write operations (test files, trace TSVs) use paths **relative to** `service_root`
211
217
 
212
218
  **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).
@@ -221,19 +227,41 @@ If the file does not exist → skip silently.
221
227
 
222
228
  ---
223
229
 
224
- ## Step 3 — [CRITICAL] Load CLAUDE.md
230
+ ## Step 3 — [CRITICAL] Load CLAUDE.md (layered: root + service overlay)
225
231
 
226
232
  *This is the highest-priority context — it defines HOW to write code and documents for this project.*
227
233
 
228
- Read `CLAUDE.md`. Extract and store:
234
+ CLAUDE.md is loaded in **two layers** so umbrella-wide rules and service-specific
235
+ architecture/coding standards compose correctly. The agent always sits at the umbrella
236
+ root, but the implementation code lives in a service submodule with its OWN stack,
237
+ architecture, and conventions — so the service's CLAUDE.md must win for code generation.
238
+
239
+ **Layer 1 — [BASE] Root CLAUDE.md (umbrella-wide).**
240
+ Read `CLAUDE.md` at the repo root. Treat its contents as the **shared baseline** for the
241
+ whole umbrella — git conventions, data-protection posture, cross-cutting rules, and (in
242
+ single-service mode) the project's only architecture + coding standards.
243
+
244
+ **Layer 2 — [OVERLAY] Service CLAUDE.md (umbrella mode only).**
245
+ *Run only if `service_root` was set in Step 1.6 (i.e. a real service was routed to).*
246
+ Read `{service_root}/CLAUDE.md`. This file defines the architecture + coding standards of
247
+ the **actual stack being implemented** (e.g. `user-service` = java-spring, `web` = nextjs).
248
+ Overlay it on top of Layer 1: **on any conflict, the service value WINS** for architecture,
249
+ coding standards, and error handling. Layer-1 values that the service does not redefine
250
+ (e.g. git conventions, banned patterns shared org-wide) remain in effect.
251
+
252
+ From the **merged** result, extract and store:
229
253
 
230
254
  - **§1 Project Overview** → project name, language, framework, build/test commands, domains
231
- - **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules
232
- - **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns
233
- - **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name
234
- - **§7 Git Conventions** → branch naming pattern, commit message format
255
+ - **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules — *service overlay wins*
256
+ - **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns — *service overlay wins*
257
+ - **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name — *service overlay wins*
258
+ - **§7 Git Conventions** → branch naming pattern, commit message format — *root baseline unless service redefines*
235
259
 
236
- If `CLAUDE.md` does not exist → note it as missing and continue with project-context.yaml data only.
260
+ **Resolution rules:**
261
+ - If both layers exist → merge as above; record `claude_md_source = root + {service_root}`.
262
+ - If only the service overlay exists (no root CLAUDE.md) → use the service file alone; `claude_md_source = {service_root}`.
263
+ - 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).
264
+ - If neither exists → note CLAUDE.md as missing and continue with project-context.yaml data only.
237
265
 
238
266
  ---
239
267
 
@@ -299,7 +327,7 @@ active_module = tech_stack.module (e.g. "java-spring", "react", "flutter")
299
327
 
300
328
  If `tech_stack.module` is blank or not recognized → set `platform_type = "unknown"` and flag as ⚠️ in the Step 7 recap.
301
329
 
302
- 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).
330
+ 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).
303
331
 
304
332
  ---
305
333
 
@@ -333,7 +361,8 @@ Output exactly this block:
333
361
  [CTX LOADED]
334
362
  Stack : {language} / {framework} / {database}
335
363
  Platform : {active_module} ({platform_type})
336
- Layers : {layer order from CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
364
+ Layers : {layer order from merged CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
365
+ CLAUDE.md : {root + {service_root} | {service_root} only | root only | ⚠️ service overlay MISSING — using root | missing}
337
366
  Ticket : {ticket_prefix}-
338
367
  Dict : {loaded — N canonical terms, M banned terms | missing}
339
368
  Entities : {loaded — EntityA, EntityB, EntityC | missing}
@@ -523,6 +552,47 @@ xcodebuild test -scheme {Scheme} -destination 'platform=iOS Simulator,name=iPhon
523
552
 
524
553
  ---
525
554
 
555
+ ## Write Trace State
556
+
557
+ After the run, persist results to the **authoritative TSV** in the service so they reach
558
+ the Living Docs report at the spec module (via `/sync` + `/validate-traces`). The test
559
+ files themselves stay in the service — only the run *status* is reported.
560
+
561
+ Update `{paths.trace_dir}/{UC-ID}.tsv` — for each scenario row (matched by `sc_id` via its
562
+ test's `@trace.verifies={UC-ID}-SC{N}` tag):
563
+
564
+ | Column | Value |
565
+ |--------|-------|
566
+ | `dev_selftest` | `pass` if all tests for this SC passed · `fail` if any failed · `not_run` if its tests were skipped/absent |
567
+ | `dev_selftest_at` | today `YYYY-MM-DD` |
568
+
569
+ Leave all other columns unchanged — in particular **never** touch `qc_status`/`qc_run_at`
570
+ (the official QC automation result, owned by `/qc-run-test`). `dev_selftest` (dev smoke)
571
+ and `qc_status` (official QC) are separate
572
+ signals. `dev_selftest`/`dev_selftest_at` are also orthogonal to `status`
573
+ (OK/GAP/DRIFT/UNTRACKED): `status` tracks *coverage*, `dev_selftest` tracks the dev's latest *run result*.
574
+
575
+ ## Refresh Panel Mirror
576
+ # Refresh Living Docs panel mirror *(local, umbrella mode)*
577
+
578
+ *Skip entirely in single-service mode (no `services` and no `setup.spec_source`) — there
579
+ the service `.trace/` IS the panel location, so nothing to mirror.*
580
+
581
+ After updating the authoritative service TSV(s) at `{paths.trace_dir}`:
582
+
583
+ 1. Resolve `panel_mirror = ./.trace` at the **current workspace root** (where this command runs).
584
+ 2. If `panel_mirror` resolves to a different path than `{paths.trace_dir}`, copy each
585
+ just-updated `{UC-ID}.tsv` → `{panel_mirror}/{service-name}/{UC-ID}.tsv`
586
+ (create the dir; overwrite). Use `active_service` for `{service-name}`.
587
+
588
+ This keeps the open workspace's Living Docs panel current **between syncs** — it is a
589
+ **local convenience mirror only**. The *canonical* report in the spec module
590
+ (`{spec_source}/.living-docs/`) and the merged `trace-report.json` are rebuilt by
591
+ `/sync` or `/validate-traces` (those need every service's data, so a single per-UC
592
+ command cannot produce them). For orchestrated commands, do this once in the orchestrator
593
+ after all sub-agents return — not inside each sub-agent.
594
+
595
+
526
596
  ## Output
527
597
 
528
598
  # Report Footer — Standard Command Output Format
@@ -561,15 +631,22 @@ Suggest the logical next command based on workflow phase:
561
631
  | /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
562
632
  | /generate-bdd | `/review-context {feature-file}` to verify coverage |
563
633
  | /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
634
+ | /qc-analyze | `/qc-plan {UC-ID}` (resolve 🔴 blocker gaps first) |
635
+ | /qc-plan | `/qc-design-test {UC-ID}` |
636
+ | /qc-design-test | `/qc-review {UC-ID}` (test-case review) |
637
+ | /qc-review (test-case) | `/qc-run-test {UC-ID}` if APPROVED; fix TCs if NEEDS_FIX |
638
+ | /qc-run-test | `/qc-report {UC-ID}` then `/qc-review {UC-ID}` (script review) |
639
+ | /qc-review (script) | `/qc-report {UC-ID}` then create PR if APPROVED |
640
+ | /qc-report | `/validate-traces {UC-ID}` to refresh Living Docs (qc_status) |
564
641
  | /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
565
642
  | /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
566
- | /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/generate-tests {UC-ID}` |
567
- | /generate-tests | `/run-tests {UC-ID}` |
568
- | /run-tests (passing) | `/review-code {UC-ID}` |
569
- | /run-tests (failing) | `/fix-bug {ticket-id}` or `/debug {error}` |
570
- | /review-code | `/smoke-test {UC-ID}` or create PR |
571
- | /smoke-test | Create PR and link to ticket |
572
- | /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/generate-tests {UC-ID}`; all OK → create PR |
643
+ | /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/dev-gen-test {UC-ID}` |
644
+ | /dev-gen-test | `/dev-run-test {UC-ID}` |
645
+ | /dev-run-test (passing) | `/review-code {UC-ID}` |
646
+ | /dev-run-test (failing) | `/fix-bug {ticket-id}` or `/debug {error}` |
647
+ | /review-code | `/dev-smoke-test {UC-ID}` or create PR |
648
+ | /dev-smoke-test | Create PR and link to ticket |
649
+ | /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/dev-gen-test {UC-ID}`; all OK → create PR |
573
650
  | /fix-bug | Create PR and link to ticket |
574
651
  | /debug | `/fix-bug {ticket-id}` if fix needed |
575
652
  | /report-bug | Send to dev (`/fix-bug {BUG-ID}`); if coverage gap → `/propose-scenario {UC-ID}` |
@@ -588,7 +665,7 @@ Next : {suggested command with example arguments}
588
665
 
589
666
 
590
667
  ```
591
- /run-tests Report — {UC-ID} ({active_module})
668
+ /dev-run-test Report — {UC-ID} ({active_module})
592
669
  ✅ Passed: {N} | ❌ Failed: {M} | ⏭️ Skipped: {K} | Duration: {X}s
593
670
 
594
671
  ## Failed Tests
@@ -598,7 +675,11 @@ Next : {suggested command with example arguments}
598
675
  ## Recommendations
599
676
  {specific fix per failure}
600
677
 
678
+ Trace: {paths.trace_dir}/{UC-ID}.tsv updated (dev_selftest, dev_selftest_at)
679
+
601
680
  Next:
602
681
  All tests pass → /review-code {UC-ID}
603
682
  Tests fail → /fix-bug {TICKET_ID} (real bug) or fix test (wrong expectation)
683
+
684
+ 📊 Living Docs: run /validate-traces (or /sync) to push this trace to the spec-module dashboard.
604
685
  ```
@@ -1,4 +1,10 @@
1
- # /run-tests — Run Tests & Report Results
1
+ # /dev-run-test — Run Dev Self-Check Tests & Report Results
2
+
3
+ > **Scope — dev self-check (smoke), not the official test suite.** Runs the tests produced
4
+ > by `/dev-gen-test` so the developer can confirm their own code works before review. This
5
+ > is a developer self-check, **not** the QC/dev-team's authoritative test run (separate flow).
6
+ > The pass/fail is published to Living Docs as a **dev self-test** signal — it tells QC the
7
+ > dev ran their checks; it is NOT a statement of official test coverage.
2
8
 
3
9
  ## Gate
4
10
  {{include:steps/gate.md}}
@@ -170,12 +176,35 @@ xcodebuild test -scheme {Scheme} -destination 'platform=iOS Simulator,name=iPhon
170
176
 
171
177
  ---
172
178
 
179
+ ## Write Trace State
180
+
181
+ After the run, persist results to the **authoritative TSV** in the service so they reach
182
+ the Living Docs report at the spec module (via `/sync` + `/validate-traces`). The test
183
+ files themselves stay in the service — only the run *status* is reported.
184
+
185
+ Update `{paths.trace_dir}/{UC-ID}.tsv` — for each scenario row (matched by `sc_id` via its
186
+ test's `@trace.verifies={UC-ID}-SC{N}` tag):
187
+
188
+ | Column | Value |
189
+ |--------|-------|
190
+ | `dev_selftest` | `pass` if all tests for this SC passed · `fail` if any failed · `not_run` if its tests were skipped/absent |
191
+ | `dev_selftest_at` | today `YYYY-MM-DD` |
192
+
193
+ Leave all other columns unchanged — in particular **never** touch `qc_status`/`qc_run_at`
194
+ (the official QC automation result, owned by `/qc-run-test`). `dev_selftest` (dev smoke)
195
+ and `qc_status` (official QC) are separate
196
+ signals. `dev_selftest`/`dev_selftest_at` are also orthogonal to `status`
197
+ (OK/GAP/DRIFT/UNTRACKED): `status` tracks *coverage*, `dev_selftest` tracks the dev's latest *run result*.
198
+
199
+ ## Refresh Panel Mirror
200
+ {{include:steps/trace-mirror.md}}
201
+
173
202
  ## Output
174
203
 
175
204
  {{include:steps/report-footer.md}}
176
205
 
177
206
  ```
178
- /run-tests Report — {UC-ID} ({active_module})
207
+ /dev-run-test Report — {UC-ID} ({active_module})
179
208
  ✅ Passed: {N} | ❌ Failed: {M} | ⏭️ Skipped: {K} | Duration: {X}s
180
209
 
181
210
  ## Failed Tests
@@ -185,7 +214,11 @@ xcodebuild test -scheme {Scheme} -destination 'platform=iOS Simulator,name=iPhon
185
214
  ## Recommendations
186
215
  {specific fix per failure}
187
216
 
217
+ Trace: {paths.trace_dir}/{UC-ID}.tsv updated (dev_selftest, dev_selftest_at)
218
+
188
219
  Next:
189
220
  All tests pass → /review-code {UC-ID}
190
221
  Tests fail → /fix-bug {TICKET_ID} (real bug) or fix test (wrong expectation)
222
+
223
+ 📊 Living Docs: run /validate-traces (or /sync) to push this trace to the spec-module dashboard.
191
224
  ```
@@ -1,6 +1,6 @@
1
- # /smoke-test — Smoke Test Live Service or App
1
+ # /dev-smoke-test — Smoke Test Live Service or App
2
2
 
3
- Use when service/app is **already running**. Different from `/run-tests` (no live server needed).
3
+ Use when service/app is **already running**. Different from `/dev-run-test` (no live server needed).
4
4
 
5
5
  ## Gate
6
6
  # Gate — Universal Entry Procedure
@@ -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}
@@ -367,7 +390,7 @@ Proceed to the next step of the calling command.
367
390
 
368
391
  ## Service Detection
369
392
 
370
- Read `active_module` from context. Use to select the correct smoke-test approach.
393
+ Read `active_module` from context. Use to select the correct dev-smoke-test approach.
371
394
 
372
395
  | Platform | Modules |
373
396
  |---|---|
@@ -527,7 +550,7 @@ npx react-native run-ios # build + install on iOS simulator
527
550
  # Open Xcode → select simulator → Product → Run
528
551
  ```
529
552
 
530
- ### Phase 2 — Manual smoke-test checklist
553
+ ### Phase 2 — Manual dev-smoke-test checklist
531
554
 
532
555
  For the UC under test, verify on device:
533
556
  1. Navigate to the screen for this UC
@@ -590,15 +613,22 @@ Suggest the logical next command based on workflow phase:
590
613
  | /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
591
614
  | /generate-bdd | `/review-context {feature-file}` to verify coverage |
592
615
  | /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
616
+ | /qc-analyze | `/qc-plan {UC-ID}` (resolve 🔴 blocker gaps first) |
617
+ | /qc-plan | `/qc-design-test {UC-ID}` |
618
+ | /qc-design-test | `/qc-review {UC-ID}` (test-case review) |
619
+ | /qc-review (test-case) | `/qc-run-test {UC-ID}` if APPROVED; fix TCs if NEEDS_FIX |
620
+ | /qc-run-test | `/qc-report {UC-ID}` then `/qc-review {UC-ID}` (script review) |
621
+ | /qc-review (script) | `/qc-report {UC-ID}` then create PR if APPROVED |
622
+ | /qc-report | `/validate-traces {UC-ID}` to refresh Living Docs (qc_status) |
593
623
  | /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
594
624
  | /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
595
- | /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/generate-tests {UC-ID}` |
596
- | /generate-tests | `/run-tests {UC-ID}` |
597
- | /run-tests (passing) | `/review-code {UC-ID}` |
598
- | /run-tests (failing) | `/fix-bug {ticket-id}` or `/debug {error}` |
599
- | /review-code | `/smoke-test {UC-ID}` or create PR |
600
- | /smoke-test | Create PR and link to ticket |
601
- | /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/generate-tests {UC-ID}`; all OK → create PR |
625
+ | /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/dev-gen-test {UC-ID}` |
626
+ | /dev-gen-test | `/dev-run-test {UC-ID}` |
627
+ | /dev-run-test (passing) | `/review-code {UC-ID}` |
628
+ | /dev-run-test (failing) | `/fix-bug {ticket-id}` or `/debug {error}` |
629
+ | /review-code | `/dev-smoke-test {UC-ID}` or create PR |
630
+ | /dev-smoke-test | Create PR and link to ticket |
631
+ | /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/dev-gen-test {UC-ID}`; all OK → create PR |
602
632
  | /fix-bug | Create PR and link to ticket |
603
633
  | /debug | `/fix-bug {ticket-id}` if fix needed |
604
634
  | /report-bug | Send to dev (`/fix-bug {BUG-ID}`); if coverage gap → `/propose-scenario {UC-ID}` |
@@ -617,7 +647,7 @@ Next : {suggested command with example arguments}
617
647
 
618
648
 
619
649
  ```
620
- /smoke-test Report — {UC-ID}
650
+ /dev-smoke-test Report — {UC-ID}
621
651
  Platform: {backend | web-frontend | mobile}
622
652
  | Endpoint / Flow | Status | Result |
623
653
  |-----------------------|-------------|---------|
@@ -1,6 +1,6 @@
1
- # /smoke-test — Smoke Test Live Service or App
1
+ # /dev-smoke-test — Smoke Test Live Service or App
2
2
 
3
- Use when service/app is **already running**. Different from `/run-tests` (no live server needed).
3
+ Use when service/app is **already running**. Different from `/dev-run-test` (no live server needed).
4
4
 
5
5
  ## Gate
6
6
  {{include:steps/gate.md}}
@@ -14,7 +14,7 @@ Use when service/app is **already running**. Different from `/run-tests` (no liv
14
14
 
15
15
  ## Service Detection
16
16
 
17
- Read `active_module` from context. Use to select the correct smoke-test approach.
17
+ Read `active_module` from context. Use to select the correct dev-smoke-test approach.
18
18
 
19
19
  | Platform | Modules |
20
20
  |---|---|
@@ -174,7 +174,7 @@ npx react-native run-ios # build + install on iOS simulator
174
174
  # Open Xcode → select simulator → Product → Run
175
175
  ```
176
176
 
177
- ### Phase 2 — Manual smoke-test checklist
177
+ ### Phase 2 — Manual dev-smoke-test checklist
178
178
 
179
179
  For the UC under test, verify on device:
180
180
  1. Navigate to the screen for this UC
@@ -204,7 +204,7 @@ Paste output into `/debug`.
204
204
  {{include:steps/report-footer.md}}
205
205
 
206
206
  ```
207
- /smoke-test Report — {UC-ID}
207
+ /dev-smoke-test Report — {UC-ID}
208
208
  Platform: {backend | web-frontend | mobile}
209
209
  | Endpoint / Flow | Status | Result |
210
210
  |-----------------------|-------------|---------|
@@ -163,7 +163,7 @@ If `services` section is present:
163
163
 
164
164
  **2. Route to service** — if active domain matches a key in `services`:
165
165
  - Override `paths.specs_dir` → `services.{domain}.specs_dir`
166
- - Override `paths.tech_docs_dir` → `services.{domain}.tech_docs_dir`
166
+ - 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.
167
167
  - Store `active_service` = `services.{domain}.path`
168
168
  - Store `active_service_module` = `services.{domain}.module`
169
169
  - If service has its own `module` → use it as `active_module` (overrides `tech_stack.module`)
@@ -175,7 +175,7 @@ If `services` section is present:
175
175
  **4. Spec source auto-override** — if `setup.spec_source` is set AND the corresponding path was not already explicitly set in `paths:`:
176
176
  - Override `paths.prd_dir` → `{spec_source}/specs/prd`
177
177
  - Override `paths.design_spec_dir` → `{spec_source}/specs/design-spec`
178
- - 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`.
178
+ - 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.)*
179
179
  - Override `paths.domain_knowledge_dir` → `{spec_source}/specs/domain-knowledge`
180
180
  - Override `paths.business_dictionary` → `{spec_source}/specs/domain-knowledge/business-dictionary.md`
181
181
  - Override `paths.core_entities` → `{spec_source}/specs/domain-knowledge/core-entities.md`
@@ -206,7 +206,7 @@ When `active_service` has been resolved to a real path in Step 1.5 (e.g., `user-
206
206
  | `paths.specs_dir` | `{active_service}/{service paths.specs_dir}` (if set in service config, else keep Step 1.5 override) |
207
207
 
208
208
  **3. Store** `service_root = {active_service}` as the working directory anchor for all downstream commands:
209
- - Shell commands (`/run-tests`, `/generate-tests`) run **from within** `service_root`
209
+ - Shell commands (`/dev-run-test`, `/dev-gen-test`) run **from within** `service_root`
210
210
  - File write operations (test files, trace TSVs) use paths **relative to** `service_root`
211
211
 
212
212
  **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).
@@ -221,19 +221,41 @@ If the file does not exist → skip silently.
221
221
 
222
222
  ---
223
223
 
224
- ## Step 3 — [CRITICAL] Load CLAUDE.md
224
+ ## Step 3 — [CRITICAL] Load CLAUDE.md (layered: root + service overlay)
225
225
 
226
226
  *This is the highest-priority context — it defines HOW to write code and documents for this project.*
227
227
 
228
- Read `CLAUDE.md`. Extract and store:
228
+ CLAUDE.md is loaded in **two layers** so umbrella-wide rules and service-specific
229
+ architecture/coding standards compose correctly. The agent always sits at the umbrella
230
+ root, but the implementation code lives in a service submodule with its OWN stack,
231
+ architecture, and conventions — so the service's CLAUDE.md must win for code generation.
232
+
233
+ **Layer 1 — [BASE] Root CLAUDE.md (umbrella-wide).**
234
+ Read `CLAUDE.md` at the repo root. Treat its contents as the **shared baseline** for the
235
+ whole umbrella — git conventions, data-protection posture, cross-cutting rules, and (in
236
+ single-service mode) the project's only architecture + coding standards.
237
+
238
+ **Layer 2 — [OVERLAY] Service CLAUDE.md (umbrella mode only).**
239
+ *Run only if `service_root` was set in Step 1.6 (i.e. a real service was routed to).*
240
+ Read `{service_root}/CLAUDE.md`. This file defines the architecture + coding standards of
241
+ the **actual stack being implemented** (e.g. `user-service` = java-spring, `web` = nextjs).
242
+ Overlay it on top of Layer 1: **on any conflict, the service value WINS** for architecture,
243
+ coding standards, and error handling. Layer-1 values that the service does not redefine
244
+ (e.g. git conventions, banned patterns shared org-wide) remain in effect.
245
+
246
+ From the **merged** result, extract and store:
229
247
 
230
248
  - **§1 Project Overview** → project name, language, framework, build/test commands, domains
231
- - **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules
232
- - **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns
233
- - **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name
234
- - **§7 Git Conventions** → branch naming pattern, commit message format
249
+ - **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules — *service overlay wins*
250
+ - **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns — *service overlay wins*
251
+ - **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name — *service overlay wins*
252
+ - **§7 Git Conventions** → branch naming pattern, commit message format — *root baseline unless service redefines*
235
253
 
236
- If `CLAUDE.md` does not exist → note it as missing and continue with project-context.yaml data only.
254
+ **Resolution rules:**
255
+ - If both layers exist → merge as above; record `claude_md_source = root + {service_root}`.
256
+ - If only the service overlay exists (no root CLAUDE.md) → use the service file alone; `claude_md_source = {service_root}`.
257
+ - 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).
258
+ - If neither exists → note CLAUDE.md as missing and continue with project-context.yaml data only.
237
259
 
238
260
  ---
239
261
 
@@ -299,7 +321,7 @@ active_module = tech_stack.module (e.g. "java-spring", "react", "flutter")
299
321
 
300
322
  If `tech_stack.module` is blank or not recognized → set `platform_type = "unknown"` and flag as ⚠️ in the Step 7 recap.
301
323
 
302
- 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).
324
+ 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).
303
325
 
304
326
  ---
305
327
 
@@ -333,7 +355,8 @@ Output exactly this block:
333
355
  [CTX LOADED]
334
356
  Stack : {language} / {framework} / {database}
335
357
  Platform : {active_module} ({platform_type})
336
- Layers : {layer order from CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
358
+ Layers : {layer order from merged CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
359
+ CLAUDE.md : {root + {service_root} | {service_root} only | root only | ⚠️ service overlay MISSING — using root | missing}
337
360
  Ticket : {ticket_prefix}-
338
361
  Dict : {loaded — N canonical terms, M banned terms | missing}
339
362
  Entities : {loaded — EntityA, EntityB, EntityC | missing}
@@ -533,7 +556,7 @@ If `lessons_path` does not exist, create it with this header first:
533
556
  | code-gen | /generate-code output |
534
557
  | bdd | /generate-bdd output |
535
558
  | tech-docs | /generate-tech-docs output |
536
- | tests | /generate-tests output |
559
+ | tests | /dev-gen-test output |
537
560
  | prd | /generate-prd, /refine-prd output |
538
561
  | general | every command |
539
562
 
@@ -596,15 +619,22 @@ Suggest the logical next command based on workflow phase:
596
619
  | /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
597
620
  | /generate-bdd | `/review-context {feature-file}` to verify coverage |
598
621
  | /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
622
+ | /qc-analyze | `/qc-plan {UC-ID}` (resolve 🔴 blocker gaps first) |
623
+ | /qc-plan | `/qc-design-test {UC-ID}` |
624
+ | /qc-design-test | `/qc-review {UC-ID}` (test-case review) |
625
+ | /qc-review (test-case) | `/qc-run-test {UC-ID}` if APPROVED; fix TCs if NEEDS_FIX |
626
+ | /qc-run-test | `/qc-report {UC-ID}` then `/qc-review {UC-ID}` (script review) |
627
+ | /qc-review (script) | `/qc-report {UC-ID}` then create PR if APPROVED |
628
+ | /qc-report | `/validate-traces {UC-ID}` to refresh Living Docs (qc_status) |
599
629
  | /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
600
630
  | /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
601
- | /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/generate-tests {UC-ID}` |
602
- | /generate-tests | `/run-tests {UC-ID}` |
603
- | /run-tests (passing) | `/review-code {UC-ID}` |
604
- | /run-tests (failing) | `/fix-bug {ticket-id}` or `/debug {error}` |
605
- | /review-code | `/smoke-test {UC-ID}` or create PR |
606
- | /smoke-test | Create PR and link to ticket |
607
- | /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/generate-tests {UC-ID}`; all OK → create PR |
631
+ | /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/dev-gen-test {UC-ID}` |
632
+ | /dev-gen-test | `/dev-run-test {UC-ID}` |
633
+ | /dev-run-test (passing) | `/review-code {UC-ID}` |
634
+ | /dev-run-test (failing) | `/fix-bug {ticket-id}` or `/debug {error}` |
635
+ | /review-code | `/dev-smoke-test {UC-ID}` or create PR |
636
+ | /dev-smoke-test | Create PR and link to ticket |
637
+ | /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/dev-gen-test {UC-ID}`; all OK → create PR |
608
638
  | /fix-bug | Create PR and link to ticket |
609
639
  | /debug | `/fix-bug {ticket-id}` if fix needed |
610
640
  | /report-bug | Send to dev (`/fix-bug {BUG-ID}`); if coverage gap → `/propose-scenario {UC-ID}` |