@anhth2/spec-driven-dev-plugin 0.10.0 → 0.12.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 (207) hide show
  1. package/commands/debug.md +43 -8
  2. package/commands/define-product.md +43 -8
  3. package/commands/dev-gen-test.md +44 -9
  4. package/commands/dev-gen-test.tmpl +1 -1
  5. package/commands/dev-run-test.md +48 -10
  6. package/commands/dev-run-test.tmpl +5 -2
  7. package/commands/dev-smoke-test.md +43 -8
  8. package/commands/fix-bug.md +79 -14
  9. package/commands/fix-bug.tmpl +36 -6
  10. package/commands/generate-bdd.md +49 -10
  11. package/commands/generate-bdd.tmpl +6 -2
  12. package/commands/generate-code.md +44 -9
  13. package/commands/generate-code.tmpl +1 -1
  14. package/commands/generate-design-spec.md +43 -8
  15. package/commands/generate-prd.md +43 -8
  16. package/commands/generate-spec-manifest.md +43 -8
  17. package/commands/generate-tech-docs.md +43 -8
  18. package/commands/learn.md +43 -8
  19. package/commands/propose-scenario.md +74 -19
  20. package/commands/propose-scenario.tmpl +31 -11
  21. package/commands/qc-analyze.md +534 -0
  22. package/commands/qc-analyze.tmpl +86 -0
  23. package/commands/qc-design-test.md +515 -0
  24. package/commands/qc-design-test.tmpl +67 -0
  25. package/commands/qc-plan.md +497 -0
  26. package/commands/qc-plan.tmpl +49 -0
  27. package/commands/qc-report.md +508 -0
  28. package/commands/qc-report.tmpl +60 -0
  29. package/commands/qc-review.md +501 -0
  30. package/commands/qc-review.tmpl +53 -0
  31. package/commands/qc-run-test.md +549 -0
  32. package/commands/qc-run-test.tmpl +83 -0
  33. package/commands/refine-prd.md +43 -8
  34. package/commands/report-bug.md +59 -10
  35. package/commands/report-bug.tmpl +16 -2
  36. package/commands/review-code.md +43 -8
  37. package/commands/review-context.md +43 -8
  38. package/commands/review-tech-docs.md +43 -8
  39. package/commands/setup-ai-first.md +7 -0
  40. package/commands/sync.md +19 -9
  41. package/commands/sync.tmpl +12 -9
  42. package/commands/update-framework.md +7 -0
  43. package/commands/validate-traces.md +67 -12
  44. package/commands/validate-traces.tmpl +24 -4
  45. package/core/FRAMEWORK_VERSION +1 -1
  46. package/core/commands/debug.md +43 -8
  47. package/core/commands/define-product.md +43 -8
  48. package/core/commands/dev-gen-test.md +44 -9
  49. package/core/commands/dev-run-test.md +48 -10
  50. package/core/commands/dev-smoke-test.md +43 -8
  51. package/core/commands/fix-bug.md +79 -14
  52. package/core/commands/generate-bdd.md +49 -10
  53. package/core/commands/generate-code.md +44 -9
  54. package/core/commands/generate-design-spec.md +43 -8
  55. package/core/commands/generate-prd.md +43 -8
  56. package/core/commands/generate-spec-manifest.md +43 -8
  57. package/core/commands/generate-tech-docs.md +43 -8
  58. package/core/commands/learn.md +43 -8
  59. package/core/commands/propose-scenario.md +74 -19
  60. package/core/commands/qc-analyze.md +534 -0
  61. package/core/commands/qc-design-test.md +515 -0
  62. package/core/commands/qc-plan.md +497 -0
  63. package/core/commands/qc-report.md +508 -0
  64. package/core/commands/qc-review.md +501 -0
  65. package/core/commands/qc-run-test.md +549 -0
  66. package/core/commands/refine-prd.md +43 -8
  67. package/core/commands/report-bug.md +59 -10
  68. package/core/commands/review-code.md +43 -8
  69. package/core/commands/review-context.md +43 -8
  70. package/core/commands/review-tech-docs.md +43 -8
  71. package/core/commands/setup-ai-first.md +7 -0
  72. package/core/commands/sync.md +19 -9
  73. package/core/commands/update-framework.md +7 -0
  74. package/core/commands/validate-traces.md +67 -12
  75. package/core/modules/qc-playwright/stack-profile.yaml +65 -0
  76. package/core/skills/code/SKILL.md +50 -8
  77. package/core/skills/debug/SKILL.md +57 -8
  78. package/core/skills/design-spec/SKILL.md +43 -8
  79. package/core/skills/discovery/SKILL.md +43 -8
  80. package/core/skills/prd/SKILL.md +14 -0
  81. package/core/skills/qc/qa-analyst/DOC_GAPS.template.md +63 -0
  82. package/core/skills/qc/qa-analyst/acceptance-criteria.md +60 -0
  83. package/core/skills/qc/qa-analyst/business-rules.md +59 -0
  84. package/core/skills/qc/qa-analyst/data-flow.md +64 -0
  85. package/core/skills/qc/qa-analyst/spec-breakdown.md +61 -0
  86. package/core/skills/qc/qa-designer/e2e/journey.md +41 -0
  87. package/core/skills/qc/qa-designer/exploratory/charter.md +68 -0
  88. package/core/skills/qc/qa-designer/exploratory/explore-to-functional.md +43 -0
  89. package/core/skills/qc/qa-designer/functional/api.md +45 -0
  90. package/core/skills/qc/qa-designer/functional/gui-feature.md +46 -0
  91. package/core/skills/qc/qa-designer/functional/gui-screen.md +52 -0
  92. package/core/skills/qc/qa-designer/integration/api.md +42 -0
  93. package/core/skills/qc/qa-designer/integration/db.md +39 -0
  94. package/core/skills/qc/qa-designer/integration/gui.md +40 -0
  95. package/core/skills/qc/qa-designer/integration/kafka.md +40 -0
  96. package/core/skills/qc/qa-designer/non-functional.md +40 -0
  97. package/core/skills/qc/qa-planner/test-plan.md +120 -0
  98. package/core/skills/qc/qa-reviewer/script/e2e.md +87 -0
  99. package/core/skills/qc/qa-reviewer/script/exploratory.md +45 -0
  100. package/core/skills/qc/qa-reviewer/script/functional.md +101 -0
  101. package/core/skills/qc/qa-reviewer/script/integration.md +91 -0
  102. package/core/skills/qc/qa-reviewer/script/non-functional.md +126 -0
  103. package/core/skills/qc/qa-reviewer/test-case/e2e.md +73 -0
  104. package/core/skills/qc/qa-reviewer/test-case/exploratory.md +43 -0
  105. package/core/skills/qc/qa-reviewer/test-case/functional.md +76 -0
  106. package/core/skills/qc/qa-reviewer/test-case/integration.md +69 -0
  107. package/core/skills/qc/qa-reviewer/test-case/non-functional.md +73 -0
  108. package/core/skills/qc/qa-runner/e2e.md +49 -0
  109. package/core/skills/qc/qa-runner/exploratory/session.md +36 -0
  110. package/core/skills/qc/qa-runner/functional/api.md +35 -0
  111. package/core/skills/qc/qa-runner/functional/gui-feature.md +51 -0
  112. package/core/skills/qc/qa-runner/functional/gui-screen.md +55 -0
  113. package/core/skills/qc/qa-runner/integration.md +47 -0
  114. package/core/skills/qc/qa-runner/non-functional.md +49 -0
  115. package/core/skills/qc/qa-runner/report/report.md +37 -0
  116. package/core/skills/setup-ai-first/SKILL.md +7 -0
  117. package/core/skills/spec/SKILL.md +14 -0
  118. package/core/skills/test/SKILL.md +93 -16
  119. package/core/steps/context-loader.md +36 -8
  120. package/core/steps/report-footer.md +7 -0
  121. package/core/templates/project-context.yaml +27 -1
  122. package/docs/01-getting-started/README.md +19 -0
  123. package/docs/01-getting-started/core-concepts.md +102 -0
  124. package/docs/01-getting-started/installation.md +156 -0
  125. package/docs/01-getting-started/quickstart.md +85 -0
  126. package/docs/02-guides/README.md +27 -0
  127. package/docs/02-guides/developer/README.md +46 -0
  128. package/docs/02-guides/developer/bdd-and-trace.md +123 -0
  129. package/docs/02-guides/developer/commands.md +76 -0
  130. package/docs/02-guides/developer/pr-checklist.md +15 -0
  131. package/docs/02-guides/developer/scenarios.md +448 -0
  132. package/docs/02-guides/developer/workflow.md +61 -0
  133. package/docs/02-guides/product-owner/README.md +77 -0
  134. package/docs/02-guides/product-owner/commands.md +30 -0
  135. package/docs/02-guides/product-owner/handoff-checklist.md +42 -0
  136. package/docs/02-guides/product-owner/prd-writing-rules.md +45 -0
  137. package/docs/02-guides/product-owner/scenarios.md +357 -0
  138. package/docs/02-guides/qc-automation.md +157 -0
  139. package/docs/02-guides/tester/README.md +74 -0
  140. package/docs/02-guides/tester/bug-reporting.md +117 -0
  141. package/docs/02-guides/tester/reading-specs.md +79 -0
  142. package/docs/02-guides/tester/scenarios.md +186 -0
  143. package/docs/02-guides/tester/spec-manifest.md +124 -0
  144. package/docs/02-guides/tester/test-checklist.md +31 -0
  145. package/docs/02-guides/tester/workflow.md +80 -0
  146. package/docs/03-concepts/README.md +19 -0
  147. package/docs/03-concepts/architecture.md +245 -0
  148. package/docs/03-concepts/pipeline.md +262 -0
  149. package/docs/03-concepts/traceability.md +149 -0
  150. package/docs/04-operations/README.md +33 -0
  151. package/docs/04-operations/bug-flow.md +362 -0
  152. package/docs/04-operations/publishing.md +137 -0
  153. package/docs/04-operations/sync-and-update.md +365 -0
  154. package/docs/05-reference/README.md +29 -0
  155. package/docs/05-reference/commands.md +229 -0
  156. package/docs/05-reference/modules.md +110 -0
  157. package/docs/05-reference/trace-schema.md +152 -0
  158. package/docs/README.md +51 -0
  159. package/modules/qc-playwright/stack-profile.yaml +65 -0
  160. package/package.json +2 -2
  161. package/skills/code/SKILL.md +50 -8
  162. package/skills/debug/SKILL.md +57 -8
  163. package/skills/design-spec/SKILL.md +43 -8
  164. package/skills/discovery/SKILL.md +43 -8
  165. package/skills/prd/SKILL.md +14 -0
  166. package/skills/qc/qa-analyst/DOC_GAPS.template.md +63 -0
  167. package/skills/qc/qa-analyst/acceptance-criteria.md +60 -0
  168. package/skills/qc/qa-analyst/business-rules.md +59 -0
  169. package/skills/qc/qa-analyst/data-flow.md +64 -0
  170. package/skills/qc/qa-analyst/spec-breakdown.md +61 -0
  171. package/skills/qc/qa-designer/e2e/journey.md +41 -0
  172. package/skills/qc/qa-designer/exploratory/charter.md +68 -0
  173. package/skills/qc/qa-designer/exploratory/explore-to-functional.md +43 -0
  174. package/skills/qc/qa-designer/functional/api.md +45 -0
  175. package/skills/qc/qa-designer/functional/gui-feature.md +46 -0
  176. package/skills/qc/qa-designer/functional/gui-screen.md +52 -0
  177. package/skills/qc/qa-designer/integration/api.md +42 -0
  178. package/skills/qc/qa-designer/integration/db.md +39 -0
  179. package/skills/qc/qa-designer/integration/gui.md +40 -0
  180. package/skills/qc/qa-designer/integration/kafka.md +40 -0
  181. package/skills/qc/qa-designer/non-functional.md +40 -0
  182. package/skills/qc/qa-planner/test-plan.md +120 -0
  183. package/skills/qc/qa-reviewer/script/e2e.md +87 -0
  184. package/skills/qc/qa-reviewer/script/exploratory.md +45 -0
  185. package/skills/qc/qa-reviewer/script/functional.md +101 -0
  186. package/skills/qc/qa-reviewer/script/integration.md +91 -0
  187. package/skills/qc/qa-reviewer/script/non-functional.md +126 -0
  188. package/skills/qc/qa-reviewer/test-case/e2e.md +73 -0
  189. package/skills/qc/qa-reviewer/test-case/exploratory.md +43 -0
  190. package/skills/qc/qa-reviewer/test-case/functional.md +76 -0
  191. package/skills/qc/qa-reviewer/test-case/integration.md +69 -0
  192. package/skills/qc/qa-reviewer/test-case/non-functional.md +73 -0
  193. package/skills/qc/qa-runner/e2e.md +49 -0
  194. package/skills/qc/qa-runner/exploratory/session.md +36 -0
  195. package/skills/qc/qa-runner/functional/api.md +35 -0
  196. package/skills/qc/qa-runner/functional/gui-feature.md +51 -0
  197. package/skills/qc/qa-runner/functional/gui-screen.md +55 -0
  198. package/skills/qc/qa-runner/integration.md +47 -0
  199. package/skills/qc/qa-runner/non-functional.md +49 -0
  200. package/skills/qc/qa-runner/report/report.md +37 -0
  201. package/skills/setup-ai-first/SKILL.md +7 -0
  202. package/skills/spec/SKILL.md +14 -0
  203. package/skills/test/SKILL.md +93 -16
  204. package/steps/context-loader.md +36 -8
  205. package/steps/report-footer.md +7 -0
  206. package/templates/project-context.yaml +27 -1
  207. package/ARCHITECTURE.md +0 -258
@@ -125,6 +125,8 @@ Read `.agent/project-context.yaml`. Extract and store:
125
125
  - `paths.specs_dir` → BDD specs root
126
126
  - `paths.prd_dir` → PRD documents root
127
127
  - `paths.refinement_dir` → findings/review output dir
128
+ - `paths.qc_dir` → QC automation artifacts root (visible top-level, one subfolder per UC: `{qc_dir}/{UC-ID}/`)
129
+ - `paths.qc_skills_dir` → where qc-* commands load QC skills from (default bundled `.agent/skills/qc`; override to the QC team's own repo/submodule so framework upgrade won't overwrite them)
128
130
  - `paths.product_definitions_dir` → product definitions root
129
131
  - `paths.domain_knowledge_dir` → domain knowledge root
130
132
  - `paths.business_dictionary` → path to business-dictionary.md
@@ -137,6 +139,8 @@ If `paths` section is absent, use these defaults:
137
139
  - `specs_dir` = `specs/bdd`
138
140
  - `prd_dir` = `specs/prd`
139
141
  - `refinement_dir` = `.agent/review`
142
+ - `qc_dir` = `docs`
143
+ - `qc_skills_dir` = `.agent/skills/qc`
140
144
  - `product_definitions_dir` = `specs/product-definition`
141
145
  - `domain_knowledge_dir` = `specs/domain-knowledge`
142
146
  - `business_dictionary` = `specs/domain-knowledge/business-dictionary.md`
@@ -181,6 +185,7 @@ If `services` section is present:
181
185
  - Override `paths.core_entities` → `{spec_source}/specs/domain-knowledge/core-entities.md`
182
186
  - Override `paths.bug_reports_dir` → `{spec_source}/feedback/bug-reports`
183
187
  - Override `paths.bdd_proposals_dir` → `{spec_source}/feedback/bdd-proposals`
188
+ - Override `paths.prd_change_requests_dir` → `{spec_source}/feedback/prd-change-requests`
184
189
 
185
190
  > **Why under `spec_source`:** PRD, design-spec, domain knowledge, the **API contract (tech-docs)**, and tester feedback are all **cross-team artifacts** — they must live in the **shared spec repo** so every umbrella (FE/App/BE) reads the same source via `/sync`. Tech-docs specifically: BE authors the tech-design (API contract), commits + pushes it into the spec submodule (2-layer commit), and FE/App pull it on their next `/sync` to wire the real API in `/generate-code --phase=integration`. In single-service mode (no `spec_source`), these default under the repo root — still shared, same repo.
186
191
 
@@ -221,19 +226,41 @@ If the file does not exist → skip silently.
221
226
 
222
227
  ---
223
228
 
224
- ## Step 3 — [CRITICAL] Load CLAUDE.md
229
+ ## Step 3 — [CRITICAL] Load CLAUDE.md (layered: root + service overlay)
225
230
 
226
231
  *This is the highest-priority context — it defines HOW to write code and documents for this project.*
227
232
 
228
- Read `CLAUDE.md`. Extract and store:
233
+ CLAUDE.md is loaded in **two layers** so umbrella-wide rules and service-specific
234
+ architecture/coding standards compose correctly. The agent always sits at the umbrella
235
+ root, but the implementation code lives in a service submodule with its OWN stack,
236
+ architecture, and conventions — so the service's CLAUDE.md must win for code generation.
237
+
238
+ **Layer 1 — [BASE] Root CLAUDE.md (umbrella-wide).**
239
+ Read `CLAUDE.md` at the repo root. Treat its contents as the **shared baseline** for the
240
+ whole umbrella — git conventions, data-protection posture, cross-cutting rules, and (in
241
+ single-service mode) the project's only architecture + coding standards.
242
+
243
+ **Layer 2 — [OVERLAY] Service CLAUDE.md (umbrella mode only).**
244
+ *Run only if `service_root` was set in Step 1.6 (i.e. a real service was routed to).*
245
+ Read `{service_root}/CLAUDE.md`. This file defines the architecture + coding standards of
246
+ the **actual stack being implemented** (e.g. `user-service` = java-spring, `web` = nextjs).
247
+ Overlay it on top of Layer 1: **on any conflict, the service value WINS** for architecture,
248
+ coding standards, and error handling. Layer-1 values that the service does not redefine
249
+ (e.g. git conventions, banned patterns shared org-wide) remain in effect.
250
+
251
+ From the **merged** result, extract and store:
229
252
 
230
253
  - **§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
254
+ - **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules — *service overlay wins*
255
+ - **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns — *service overlay wins*
256
+ - **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name — *service overlay wins*
257
+ - **§7 Git Conventions** → branch naming pattern, commit message format — *root baseline unless service redefines*
235
258
 
236
- If `CLAUDE.md` does not exist → note it as missing and continue with project-context.yaml data only.
259
+ **Resolution rules:**
260
+ - If both layers exist → merge as above; record `claude_md_source = root + {service_root}`.
261
+ - If only the service overlay exists (no root CLAUDE.md) → use the service file alone; `claude_md_source = {service_root}`.
262
+ - 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).
263
+ - If neither exists → note CLAUDE.md as missing and continue with project-context.yaml data only.
237
264
 
238
265
  ---
239
266
 
@@ -333,7 +360,8 @@ Output exactly this block:
333
360
  [CTX LOADED]
334
361
  Stack : {language} / {framework} / {database}
335
362
  Platform : {active_module} ({platform_type})
336
- Layers : {layer order from CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
363
+ Layers : {layer order from merged CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
364
+ CLAUDE.md : {root + {service_root} | {service_root} only | root only | ⚠️ service overlay MISSING — using root | missing}
337
365
  Ticket : {ticket_prefix}-
338
366
  Dict : {loaded — N canonical terms, M banned terms | missing}
339
367
  Entities : {loaded — EntityA, EntityB, EntityC | missing}
@@ -598,6 +626,13 @@ Suggest the logical next command based on workflow phase:
598
626
  | /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
599
627
  | /generate-bdd | `/review-context {feature-file}` to verify coverage |
600
628
  | /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
629
+ | /qc-analyze | `/qc-plan {UC-ID}` (resolve 🔴 blocker gaps first) |
630
+ | /qc-plan | `/qc-design-test {UC-ID}` |
631
+ | /qc-design-test | `/qc-review {UC-ID}` (test-case review) |
632
+ | /qc-review (test-case) | `/qc-run-test {UC-ID}` if APPROVED; fix TCs if NEEDS_FIX |
633
+ | /qc-run-test | `/qc-report {UC-ID}` then `/qc-review {UC-ID}` (script review) |
634
+ | /qc-review (script) | `/qc-report {UC-ID}` then create PR if APPROVED |
635
+ | /qc-report | `/validate-traces {UC-ID}` to refresh Living Docs (qc_status) |
601
636
  | /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
602
637
  | /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
603
638
  | /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/dev-gen-test {UC-ID}` |
@@ -1,6 +1,8 @@
1
- # /report-bug — File a Spec-Traced Bug (Tester-Facing)
1
+ # /report-bug — File a Spec-Traced Bug (Tester & QC-Facing)
2
2
 
3
- For **testers**. Produces a structured bug report with full spec context, classifies the likely
3
+ For **testers and QC** including **product-gaps** surfaced by the `/qc-*` pipeline
4
+ (`/qc-run-test` FAIL classified product-gap, or a `DOC_GAPS` spec-defect blocker from
5
+ `/qc-analyze`). Produces a structured bug report with full spec context, classifies the likely
4
6
  layer, and saves it for handoff to the dev team.
5
7
 
6
8
  **READ-ONLY on specs and code.** This command never edits PRD, BDD, tech-docs, or source.
@@ -134,6 +136,8 @@ Read `.agent/project-context.yaml`. Extract and store:
134
136
  - `paths.specs_dir` → BDD specs root
135
137
  - `paths.prd_dir` → PRD documents root
136
138
  - `paths.refinement_dir` → findings/review output dir
139
+ - `paths.qc_dir` → QC automation artifacts root (visible top-level, one subfolder per UC: `{qc_dir}/{UC-ID}/`)
140
+ - `paths.qc_skills_dir` → where qc-* commands load QC skills from (default bundled `.agent/skills/qc`; override to the QC team's own repo/submodule so framework upgrade won't overwrite them)
137
141
  - `paths.product_definitions_dir` → product definitions root
138
142
  - `paths.domain_knowledge_dir` → domain knowledge root
139
143
  - `paths.business_dictionary` → path to business-dictionary.md
@@ -146,6 +150,8 @@ If `paths` section is absent, use these defaults:
146
150
  - `specs_dir` = `specs/bdd`
147
151
  - `prd_dir` = `specs/prd`
148
152
  - `refinement_dir` = `.agent/review`
153
+ - `qc_dir` = `docs`
154
+ - `qc_skills_dir` = `.agent/skills/qc`
149
155
  - `product_definitions_dir` = `specs/product-definition`
150
156
  - `domain_knowledge_dir` = `specs/domain-knowledge`
151
157
  - `business_dictionary` = `specs/domain-knowledge/business-dictionary.md`
@@ -190,6 +196,7 @@ If `services` section is present:
190
196
  - Override `paths.core_entities` → `{spec_source}/specs/domain-knowledge/core-entities.md`
191
197
  - Override `paths.bug_reports_dir` → `{spec_source}/feedback/bug-reports`
192
198
  - Override `paths.bdd_proposals_dir` → `{spec_source}/feedback/bdd-proposals`
199
+ - Override `paths.prd_change_requests_dir` → `{spec_source}/feedback/prd-change-requests`
193
200
 
194
201
  > **Why under `spec_source`:** PRD, design-spec, domain knowledge, the **API contract (tech-docs)**, and tester feedback are all **cross-team artifacts** — they must live in the **shared spec repo** so every umbrella (FE/App/BE) reads the same source via `/sync`. Tech-docs specifically: BE authors the tech-design (API contract), commits + pushes it into the spec submodule (2-layer commit), and FE/App pull it on their next `/sync` to wire the real API in `/generate-code --phase=integration`. In single-service mode (no `spec_source`), these default under the repo root — still shared, same repo.
195
202
 
@@ -230,19 +237,41 @@ If the file does not exist → skip silently.
230
237
 
231
238
  ---
232
239
 
233
- ## Step 3 — [CRITICAL] Load CLAUDE.md
240
+ ## Step 3 — [CRITICAL] Load CLAUDE.md (layered: root + service overlay)
234
241
 
235
242
  *This is the highest-priority context — it defines HOW to write code and documents for this project.*
236
243
 
237
- Read `CLAUDE.md`. Extract and store:
244
+ CLAUDE.md is loaded in **two layers** so umbrella-wide rules and service-specific
245
+ architecture/coding standards compose correctly. The agent always sits at the umbrella
246
+ root, but the implementation code lives in a service submodule with its OWN stack,
247
+ architecture, and conventions — so the service's CLAUDE.md must win for code generation.
248
+
249
+ **Layer 1 — [BASE] Root CLAUDE.md (umbrella-wide).**
250
+ Read `CLAUDE.md` at the repo root. Treat its contents as the **shared baseline** for the
251
+ whole umbrella — git conventions, data-protection posture, cross-cutting rules, and (in
252
+ single-service mode) the project's only architecture + coding standards.
253
+
254
+ **Layer 2 — [OVERLAY] Service CLAUDE.md (umbrella mode only).**
255
+ *Run only if `service_root` was set in Step 1.6 (i.e. a real service was routed to).*
256
+ Read `{service_root}/CLAUDE.md`. This file defines the architecture + coding standards of
257
+ the **actual stack being implemented** (e.g. `user-service` = java-spring, `web` = nextjs).
258
+ Overlay it on top of Layer 1: **on any conflict, the service value WINS** for architecture,
259
+ coding standards, and error handling. Layer-1 values that the service does not redefine
260
+ (e.g. git conventions, banned patterns shared org-wide) remain in effect.
261
+
262
+ From the **merged** result, extract and store:
238
263
 
239
264
  - **§1 Project Overview** → project name, language, framework, build/test commands, domains
240
- - **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules
241
- - **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns
242
- - **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name
243
- - **§7 Git Conventions** → branch naming pattern, commit message format
265
+ - **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules — *service overlay wins*
266
+ - **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns — *service overlay wins*
267
+ - **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name — *service overlay wins*
268
+ - **§7 Git Conventions** → branch naming pattern, commit message format — *root baseline unless service redefines*
244
269
 
245
- If `CLAUDE.md` does not exist → note it as missing and continue with project-context.yaml data only.
270
+ **Resolution rules:**
271
+ - If both layers exist → merge as above; record `claude_md_source = root + {service_root}`.
272
+ - If only the service overlay exists (no root CLAUDE.md) → use the service file alone; `claude_md_source = {service_root}`.
273
+ - 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).
274
+ - If neither exists → note CLAUDE.md as missing and continue with project-context.yaml data only.
246
275
 
247
276
  ---
248
277
 
@@ -342,7 +371,8 @@ Output exactly this block:
342
371
  [CTX LOADED]
343
372
  Stack : {language} / {framework} / {database}
344
373
  Platform : {active_module} ({platform_type})
345
- Layers : {layer order from CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
374
+ Layers : {layer order from merged CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
375
+ CLAUDE.md : {root + {service_root} | {service_root} only | root only | ⚠️ service overlay MISSING — using root | missing}
346
376
  Ticket : {ticket_prefix}-
347
377
  Dict : {loaded — N canonical terms, M banned terms | missing}
348
378
  Entities : {loaded — EntityA, EntityB, EntityC | missing}
@@ -423,6 +453,17 @@ State the classification as a suggestion (dev confirms during `/fix-bug`).
423
453
  Assign `BUG-{today YYYYMMDD}-{NN}` (NN = next sequence among existing reports).
424
454
  Write to `{paths.bug_reports_dir}/{BUG-ID}.md` (resolved to `{spec_source}/feedback/bug-reports/` in umbrella mode; create dir if needed) using the structure in the Output block, and also print it for pasting into Jira/Slack.
425
455
 
456
+ ## Step 5.5 — Backfill the trace (pending-view link)
457
+
458
+ If Step 1 matched a specific failing scenario `{UC-ID}-SC{N}` **and** a trace row exists in
459
+ `{paths.trace_dir}/{UC-ID}.tsv`, update **only** that row so the PO/PM "waiting-on" view points
460
+ to this bug — leave every other column (incl. `qc_status`) unchanged:
461
+ - `qc_blocked_by` = `{BUG-ID}`
462
+ - `qc_owner` = `dev` if likely layer ∈ {Code, BDD, Design Spec, Env} · `po` if likely layer = PRD ambiguity
463
+
464
+ Skip silently if no SC matched or no trace file/row exists (a bug can still be filed). This is
465
+ the only write this command makes to operational state — it still **never** edits PRD/BDD/code.
466
+
426
467
  ## Step 6 — Handoff (so PO/Dev actually see it)
427
468
 
428
469
  The report only reaches PO/Dev if it is **committed and pushed to the shared spec repo**. A local file is a dead drop.
@@ -485,6 +526,13 @@ Suggest the logical next command based on workflow phase:
485
526
  | /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
486
527
  | /generate-bdd | `/review-context {feature-file}` to verify coverage |
487
528
  | /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
529
+ | /qc-analyze | `/qc-plan {UC-ID}` (resolve 🔴 blocker gaps first) |
530
+ | /qc-plan | `/qc-design-test {UC-ID}` |
531
+ | /qc-design-test | `/qc-review {UC-ID}` (test-case review) |
532
+ | /qc-review (test-case) | `/qc-run-test {UC-ID}` if APPROVED; fix TCs if NEEDS_FIX |
533
+ | /qc-run-test | `/qc-report {UC-ID}` then `/qc-review {UC-ID}` (script review) |
534
+ | /qc-review (script) | `/qc-report {UC-ID}` then create PR if APPROVED |
535
+ | /qc-report | `/validate-traces {UC-ID}` to refresh Living Docs (qc_status) |
488
536
  | /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
489
537
  | /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
490
538
  | /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/dev-gen-test {UC-ID}` |
@@ -515,6 +563,7 @@ Next : {suggested command with example arguments}
515
563
  🐞 {BUG-ID} → {paths.bug_reports_dir}/{BUG-ID}.md (in shared spec repo)
516
564
 
517
565
  Feature : {UC-ID} — {feature name} | Service: {service} | Severity: {Critical|Major|Minor}
566
+ State : 🟢 Open (lifecycle: Open → Fixed → Closed — set `Fixed` by /fix-bug, `Closed` after /qc-run-test re-verify pass)
518
567
 
519
568
  Spec context
520
569
  PRD : {prd_path} (v{prd_version})
@@ -1,6 +1,8 @@
1
- # /report-bug — File a Spec-Traced Bug (Tester-Facing)
1
+ # /report-bug — File a Spec-Traced Bug (Tester & QC-Facing)
2
2
 
3
- For **testers**. Produces a structured bug report with full spec context, classifies the likely
3
+ For **testers and QC** including **product-gaps** surfaced by the `/qc-*` pipeline
4
+ (`/qc-run-test` FAIL classified product-gap, or a `DOC_GAPS` spec-defect blocker from
5
+ `/qc-analyze`). Produces a structured bug report with full spec context, classifies the likely
4
6
  layer, and saves it for handoff to the dev team.
5
7
 
6
8
  **READ-ONLY on specs and code.** This command never edits PRD, BDD, tech-docs, or source.
@@ -70,6 +72,17 @@ State the classification as a suggestion (dev confirms during `/fix-bug`).
70
72
  Assign `BUG-{today YYYYMMDD}-{NN}` (NN = next sequence among existing reports).
71
73
  Write to `{paths.bug_reports_dir}/{BUG-ID}.md` (resolved to `{spec_source}/feedback/bug-reports/` in umbrella mode; create dir if needed) using the structure in the Output block, and also print it for pasting into Jira/Slack.
72
74
 
75
+ ## Step 5.5 — Backfill the trace (pending-view link)
76
+
77
+ If Step 1 matched a specific failing scenario `{UC-ID}-SC{N}` **and** a trace row exists in
78
+ `{paths.trace_dir}/{UC-ID}.tsv`, update **only** that row so the PO/PM "waiting-on" view points
79
+ to this bug — leave every other column (incl. `qc_status`) unchanged:
80
+ - `qc_blocked_by` = `{BUG-ID}`
81
+ - `qc_owner` = `dev` if likely layer ∈ {Code, BDD, Design Spec, Env} · `po` if likely layer = PRD ambiguity
82
+
83
+ Skip silently if no SC matched or no trace file/row exists (a bug can still be filed). This is
84
+ the only write this command makes to operational state — it still **never** edits PRD/BDD/code.
85
+
73
86
  ## Step 6 — Handoff (so PO/Dev actually see it)
74
87
 
75
88
  The report only reaches PO/Dev if it is **committed and pushed to the shared spec repo**. A local file is a dead drop.
@@ -102,6 +115,7 @@ git push # → PO/Dev see it on their next /sync
102
115
  🐞 {BUG-ID} → {paths.bug_reports_dir}/{BUG-ID}.md (in shared spec repo)
103
116
 
104
117
  Feature : {UC-ID} — {feature name} | Service: {service} | Severity: {Critical|Major|Minor}
118
+ State : 🟢 Open (lifecycle: Open → Fixed → Closed — set `Fixed` by /fix-bug, `Closed` after /qc-run-test re-verify pass)
105
119
 
106
120
  Spec context
107
121
  PRD : {prd_path} (v{prd_version})
@@ -127,6 +127,8 @@ Read `.agent/project-context.yaml`. Extract and store:
127
127
  - `paths.specs_dir` → BDD specs root
128
128
  - `paths.prd_dir` → PRD documents root
129
129
  - `paths.refinement_dir` → findings/review output dir
130
+ - `paths.qc_dir` → QC automation artifacts root (visible top-level, one subfolder per UC: `{qc_dir}/{UC-ID}/`)
131
+ - `paths.qc_skills_dir` → where qc-* commands load QC skills from (default bundled `.agent/skills/qc`; override to the QC team's own repo/submodule so framework upgrade won't overwrite them)
130
132
  - `paths.product_definitions_dir` → product definitions root
131
133
  - `paths.domain_knowledge_dir` → domain knowledge root
132
134
  - `paths.business_dictionary` → path to business-dictionary.md
@@ -139,6 +141,8 @@ If `paths` section is absent, use these defaults:
139
141
  - `specs_dir` = `specs/bdd`
140
142
  - `prd_dir` = `specs/prd`
141
143
  - `refinement_dir` = `.agent/review`
144
+ - `qc_dir` = `docs`
145
+ - `qc_skills_dir` = `.agent/skills/qc`
142
146
  - `product_definitions_dir` = `specs/product-definition`
143
147
  - `domain_knowledge_dir` = `specs/domain-knowledge`
144
148
  - `business_dictionary` = `specs/domain-knowledge/business-dictionary.md`
@@ -183,6 +187,7 @@ If `services` section is present:
183
187
  - Override `paths.core_entities` → `{spec_source}/specs/domain-knowledge/core-entities.md`
184
188
  - Override `paths.bug_reports_dir` → `{spec_source}/feedback/bug-reports`
185
189
  - Override `paths.bdd_proposals_dir` → `{spec_source}/feedback/bdd-proposals`
190
+ - Override `paths.prd_change_requests_dir` → `{spec_source}/feedback/prd-change-requests`
186
191
 
187
192
  > **Why under `spec_source`:** PRD, design-spec, domain knowledge, the **API contract (tech-docs)**, and tester feedback are all **cross-team artifacts** — they must live in the **shared spec repo** so every umbrella (FE/App/BE) reads the same source via `/sync`. Tech-docs specifically: BE authors the tech-design (API contract), commits + pushes it into the spec submodule (2-layer commit), and FE/App pull it on their next `/sync` to wire the real API in `/generate-code --phase=integration`. In single-service mode (no `spec_source`), these default under the repo root — still shared, same repo.
188
193
 
@@ -223,19 +228,41 @@ If the file does not exist → skip silently.
223
228
 
224
229
  ---
225
230
 
226
- ## Step 3 — [CRITICAL] Load CLAUDE.md
231
+ ## Step 3 — [CRITICAL] Load CLAUDE.md (layered: root + service overlay)
227
232
 
228
233
  *This is the highest-priority context — it defines HOW to write code and documents for this project.*
229
234
 
230
- Read `CLAUDE.md`. Extract and store:
235
+ CLAUDE.md is loaded in **two layers** so umbrella-wide rules and service-specific
236
+ architecture/coding standards compose correctly. The agent always sits at the umbrella
237
+ root, but the implementation code lives in a service submodule with its OWN stack,
238
+ architecture, and conventions — so the service's CLAUDE.md must win for code generation.
239
+
240
+ **Layer 1 — [BASE] Root CLAUDE.md (umbrella-wide).**
241
+ Read `CLAUDE.md` at the repo root. Treat its contents as the **shared baseline** for the
242
+ whole umbrella — git conventions, data-protection posture, cross-cutting rules, and (in
243
+ single-service mode) the project's only architecture + coding standards.
244
+
245
+ **Layer 2 — [OVERLAY] Service CLAUDE.md (umbrella mode only).**
246
+ *Run only if `service_root` was set in Step 1.6 (i.e. a real service was routed to).*
247
+ Read `{service_root}/CLAUDE.md`. This file defines the architecture + coding standards of
248
+ the **actual stack being implemented** (e.g. `user-service` = java-spring, `web` = nextjs).
249
+ Overlay it on top of Layer 1: **on any conflict, the service value WINS** for architecture,
250
+ coding standards, and error handling. Layer-1 values that the service does not redefine
251
+ (e.g. git conventions, banned patterns shared org-wide) remain in effect.
252
+
253
+ From the **merged** result, extract and store:
231
254
 
232
255
  - **§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
256
+ - **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules — *service overlay wins*
257
+ - **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns — *service overlay wins*
258
+ - **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name — *service overlay wins*
259
+ - **§7 Git Conventions** → branch naming pattern, commit message format — *root baseline unless service redefines*
237
260
 
238
- If `CLAUDE.md` does not exist → note it as missing and continue with project-context.yaml data only.
261
+ **Resolution rules:**
262
+ - If both layers exist → merge as above; record `claude_md_source = root + {service_root}`.
263
+ - If only the service overlay exists (no root CLAUDE.md) → use the service file alone; `claude_md_source = {service_root}`.
264
+ - 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).
265
+ - If neither exists → note CLAUDE.md as missing and continue with project-context.yaml data only.
239
266
 
240
267
  ---
241
268
 
@@ -335,7 +362,8 @@ Output exactly this block:
335
362
  [CTX LOADED]
336
363
  Stack : {language} / {framework} / {database}
337
364
  Platform : {active_module} ({platform_type})
338
- Layers : {layer order from CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
365
+ Layers : {layer order from merged CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
366
+ CLAUDE.md : {root + {service_root} | {service_root} only | root only | ⚠️ service overlay MISSING — using root | missing}
339
367
  Ticket : {ticket_prefix}-
340
368
  Dict : {loaded — N canonical terms, M banned terms | missing}
341
369
  Entities : {loaded — EntityA, EntityB, EntityC | missing}
@@ -447,6 +475,13 @@ Suggest the logical next command based on workflow phase:
447
475
  | /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
448
476
  | /generate-bdd | `/review-context {feature-file}` to verify coverage |
449
477
  | /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
478
+ | /qc-analyze | `/qc-plan {UC-ID}` (resolve 🔴 blocker gaps first) |
479
+ | /qc-plan | `/qc-design-test {UC-ID}` |
480
+ | /qc-design-test | `/qc-review {UC-ID}` (test-case review) |
481
+ | /qc-review (test-case) | `/qc-run-test {UC-ID}` if APPROVED; fix TCs if NEEDS_FIX |
482
+ | /qc-run-test | `/qc-report {UC-ID}` then `/qc-review {UC-ID}` (script review) |
483
+ | /qc-review (script) | `/qc-report {UC-ID}` then create PR if APPROVED |
484
+ | /qc-report | `/validate-traces {UC-ID}` to refresh Living Docs (qc_status) |
450
485
  | /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
451
486
  | /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
452
487
  | /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/dev-gen-test {UC-ID}` |
@@ -132,6 +132,8 @@ Read `.agent/project-context.yaml`. Extract and store:
132
132
  - `paths.specs_dir` → BDD specs root
133
133
  - `paths.prd_dir` → PRD documents root
134
134
  - `paths.refinement_dir` → findings/review output dir
135
+ - `paths.qc_dir` → QC automation artifacts root (visible top-level, one subfolder per UC: `{qc_dir}/{UC-ID}/`)
136
+ - `paths.qc_skills_dir` → where qc-* commands load QC skills from (default bundled `.agent/skills/qc`; override to the QC team's own repo/submodule so framework upgrade won't overwrite them)
135
137
  - `paths.product_definitions_dir` → product definitions root
136
138
  - `paths.domain_knowledge_dir` → domain knowledge root
137
139
  - `paths.business_dictionary` → path to business-dictionary.md
@@ -144,6 +146,8 @@ If `paths` section is absent, use these defaults:
144
146
  - `specs_dir` = `specs/bdd`
145
147
  - `prd_dir` = `specs/prd`
146
148
  - `refinement_dir` = `.agent/review`
149
+ - `qc_dir` = `docs`
150
+ - `qc_skills_dir` = `.agent/skills/qc`
147
151
  - `product_definitions_dir` = `specs/product-definition`
148
152
  - `domain_knowledge_dir` = `specs/domain-knowledge`
149
153
  - `business_dictionary` = `specs/domain-knowledge/business-dictionary.md`
@@ -188,6 +192,7 @@ If `services` section is present:
188
192
  - Override `paths.core_entities` → `{spec_source}/specs/domain-knowledge/core-entities.md`
189
193
  - Override `paths.bug_reports_dir` → `{spec_source}/feedback/bug-reports`
190
194
  - Override `paths.bdd_proposals_dir` → `{spec_source}/feedback/bdd-proposals`
195
+ - Override `paths.prd_change_requests_dir` → `{spec_source}/feedback/prd-change-requests`
191
196
 
192
197
  > **Why under `spec_source`:** PRD, design-spec, domain knowledge, the **API contract (tech-docs)**, and tester feedback are all **cross-team artifacts** — they must live in the **shared spec repo** so every umbrella (FE/App/BE) reads the same source via `/sync`. Tech-docs specifically: BE authors the tech-design (API contract), commits + pushes it into the spec submodule (2-layer commit), and FE/App pull it on their next `/sync` to wire the real API in `/generate-code --phase=integration`. In single-service mode (no `spec_source`), these default under the repo root — still shared, same repo.
193
198
 
@@ -228,19 +233,41 @@ If the file does not exist → skip silently.
228
233
 
229
234
  ---
230
235
 
231
- ## Step 3 — [CRITICAL] Load CLAUDE.md
236
+ ## Step 3 — [CRITICAL] Load CLAUDE.md (layered: root + service overlay)
232
237
 
233
238
  *This is the highest-priority context — it defines HOW to write code and documents for this project.*
234
239
 
235
- Read `CLAUDE.md`. Extract and store:
240
+ CLAUDE.md is loaded in **two layers** so umbrella-wide rules and service-specific
241
+ architecture/coding standards compose correctly. The agent always sits at the umbrella
242
+ root, but the implementation code lives in a service submodule with its OWN stack,
243
+ architecture, and conventions — so the service's CLAUDE.md must win for code generation.
244
+
245
+ **Layer 1 — [BASE] Root CLAUDE.md (umbrella-wide).**
246
+ Read `CLAUDE.md` at the repo root. Treat its contents as the **shared baseline** for the
247
+ whole umbrella — git conventions, data-protection posture, cross-cutting rules, and (in
248
+ single-service mode) the project's only architecture + coding standards.
249
+
250
+ **Layer 2 — [OVERLAY] Service CLAUDE.md (umbrella mode only).**
251
+ *Run only if `service_root` was set in Step 1.6 (i.e. a real service was routed to).*
252
+ Read `{service_root}/CLAUDE.md`. This file defines the architecture + coding standards of
253
+ the **actual stack being implemented** (e.g. `user-service` = java-spring, `web` = nextjs).
254
+ Overlay it on top of Layer 1: **on any conflict, the service value WINS** for architecture,
255
+ coding standards, and error handling. Layer-1 values that the service does not redefine
256
+ (e.g. git conventions, banned patterns shared org-wide) remain in effect.
257
+
258
+ From the **merged** result, extract and store:
236
259
 
237
260
  - **§1 Project Overview** → project name, language, framework, build/test commands, domains
238
- - **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules
239
- - **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns
240
- - **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name
241
- - **§7 Git Conventions** → branch naming pattern, commit message format
261
+ - **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules — *service overlay wins*
262
+ - **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns — *service overlay wins*
263
+ - **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name — *service overlay wins*
264
+ - **§7 Git Conventions** → branch naming pattern, commit message format — *root baseline unless service redefines*
242
265
 
243
- If `CLAUDE.md` does not exist → note it as missing and continue with project-context.yaml data only.
266
+ **Resolution rules:**
267
+ - If both layers exist → merge as above; record `claude_md_source = root + {service_root}`.
268
+ - If only the service overlay exists (no root CLAUDE.md) → use the service file alone; `claude_md_source = {service_root}`.
269
+ - 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).
270
+ - If neither exists → note CLAUDE.md as missing and continue with project-context.yaml data only.
244
271
 
245
272
  ---
246
273
 
@@ -340,7 +367,8 @@ Output exactly this block:
340
367
  [CTX LOADED]
341
368
  Stack : {language} / {framework} / {database}
342
369
  Platform : {active_module} ({platform_type})
343
- Layers : {layer order from CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
370
+ Layers : {layer order from merged CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
371
+ CLAUDE.md : {root + {service_root} | {service_root} only | root only | ⚠️ service overlay MISSING — using root | missing}
344
372
  Ticket : {ticket_prefix}-
345
373
  Dict : {loaded — N canonical terms, M banned terms | missing}
346
374
  Entities : {loaded — EntityA, EntityB, EntityC | missing}
@@ -779,6 +807,13 @@ Suggest the logical next command based on workflow phase:
779
807
  | /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
780
808
  | /generate-bdd | `/review-context {feature-file}` to verify coverage |
781
809
  | /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
810
+ | /qc-analyze | `/qc-plan {UC-ID}` (resolve 🔴 blocker gaps first) |
811
+ | /qc-plan | `/qc-design-test {UC-ID}` |
812
+ | /qc-design-test | `/qc-review {UC-ID}` (test-case review) |
813
+ | /qc-review (test-case) | `/qc-run-test {UC-ID}` if APPROVED; fix TCs if NEEDS_FIX |
814
+ | /qc-run-test | `/qc-report {UC-ID}` then `/qc-review {UC-ID}` (script review) |
815
+ | /qc-review (script) | `/qc-report {UC-ID}` then create PR if APPROVED |
816
+ | /qc-report | `/validate-traces {UC-ID}` to refresh Living Docs (qc_status) |
782
817
  | /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
783
818
  | /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
784
819
  | /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/dev-gen-test {UC-ID}` |
@@ -129,6 +129,8 @@ Read `.agent/project-context.yaml`. Extract and store:
129
129
  - `paths.specs_dir` → BDD specs root
130
130
  - `paths.prd_dir` → PRD documents root
131
131
  - `paths.refinement_dir` → findings/review output dir
132
+ - `paths.qc_dir` → QC automation artifacts root (visible top-level, one subfolder per UC: `{qc_dir}/{UC-ID}/`)
133
+ - `paths.qc_skills_dir` → where qc-* commands load QC skills from (default bundled `.agent/skills/qc`; override to the QC team's own repo/submodule so framework upgrade won't overwrite them)
132
134
  - `paths.product_definitions_dir` → product definitions root
133
135
  - `paths.domain_knowledge_dir` → domain knowledge root
134
136
  - `paths.business_dictionary` → path to business-dictionary.md
@@ -141,6 +143,8 @@ If `paths` section is absent, use these defaults:
141
143
  - `specs_dir` = `specs/bdd`
142
144
  - `prd_dir` = `specs/prd`
143
145
  - `refinement_dir` = `.agent/review`
146
+ - `qc_dir` = `docs`
147
+ - `qc_skills_dir` = `.agent/skills/qc`
144
148
  - `product_definitions_dir` = `specs/product-definition`
145
149
  - `domain_knowledge_dir` = `specs/domain-knowledge`
146
150
  - `business_dictionary` = `specs/domain-knowledge/business-dictionary.md`
@@ -185,6 +189,7 @@ If `services` section is present:
185
189
  - Override `paths.core_entities` → `{spec_source}/specs/domain-knowledge/core-entities.md`
186
190
  - Override `paths.bug_reports_dir` → `{spec_source}/feedback/bug-reports`
187
191
  - Override `paths.bdd_proposals_dir` → `{spec_source}/feedback/bdd-proposals`
192
+ - Override `paths.prd_change_requests_dir` → `{spec_source}/feedback/prd-change-requests`
188
193
 
189
194
  > **Why under `spec_source`:** PRD, design-spec, domain knowledge, the **API contract (tech-docs)**, and tester feedback are all **cross-team artifacts** — they must live in the **shared spec repo** so every umbrella (FE/App/BE) reads the same source via `/sync`. Tech-docs specifically: BE authors the tech-design (API contract), commits + pushes it into the spec submodule (2-layer commit), and FE/App pull it on their next `/sync` to wire the real API in `/generate-code --phase=integration`. In single-service mode (no `spec_source`), these default under the repo root — still shared, same repo.
190
195
 
@@ -225,19 +230,41 @@ If the file does not exist → skip silently.
225
230
 
226
231
  ---
227
232
 
228
- ## Step 3 — [CRITICAL] Load CLAUDE.md
233
+ ## Step 3 — [CRITICAL] Load CLAUDE.md (layered: root + service overlay)
229
234
 
230
235
  *This is the highest-priority context — it defines HOW to write code and documents for this project.*
231
236
 
232
- Read `CLAUDE.md`. Extract and store:
237
+ CLAUDE.md is loaded in **two layers** so umbrella-wide rules and service-specific
238
+ architecture/coding standards compose correctly. The agent always sits at the umbrella
239
+ root, but the implementation code lives in a service submodule with its OWN stack,
240
+ architecture, and conventions — so the service's CLAUDE.md must win for code generation.
241
+
242
+ **Layer 1 — [BASE] Root CLAUDE.md (umbrella-wide).**
243
+ Read `CLAUDE.md` at the repo root. Treat its contents as the **shared baseline** for the
244
+ whole umbrella — git conventions, data-protection posture, cross-cutting rules, and (in
245
+ single-service mode) the project's only architecture + coding standards.
246
+
247
+ **Layer 2 — [OVERLAY] Service CLAUDE.md (umbrella mode only).**
248
+ *Run only if `service_root` was set in Step 1.6 (i.e. a real service was routed to).*
249
+ Read `{service_root}/CLAUDE.md`. This file defines the architecture + coding standards of
250
+ the **actual stack being implemented** (e.g. `user-service` = java-spring, `web` = nextjs).
251
+ Overlay it on top of Layer 1: **on any conflict, the service value WINS** for architecture,
252
+ coding standards, and error handling. Layer-1 values that the service does not redefine
253
+ (e.g. git conventions, banned patterns shared org-wide) remain in effect.
254
+
255
+ From the **merged** result, extract and store:
233
256
 
234
257
  - **§1 Project Overview** → project name, language, framework, build/test commands, domains
235
- - **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules
236
- - **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns
237
- - **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name
238
- - **§7 Git Conventions** → branch naming pattern, commit message format
258
+ - **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules — *service overlay wins*
259
+ - **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns — *service overlay wins*
260
+ - **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name — *service overlay wins*
261
+ - **§7 Git Conventions** → branch naming pattern, commit message format — *root baseline unless service redefines*
239
262
 
240
- If `CLAUDE.md` does not exist → note it as missing and continue with project-context.yaml data only.
263
+ **Resolution rules:**
264
+ - If both layers exist → merge as above; record `claude_md_source = root + {service_root}`.
265
+ - If only the service overlay exists (no root CLAUDE.md) → use the service file alone; `claude_md_source = {service_root}`.
266
+ - 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).
267
+ - If neither exists → note CLAUDE.md as missing and continue with project-context.yaml data only.
241
268
 
242
269
  ---
243
270
 
@@ -337,7 +364,8 @@ Output exactly this block:
337
364
  [CTX LOADED]
338
365
  Stack : {language} / {framework} / {database}
339
366
  Platform : {active_module} ({platform_type})
340
- Layers : {layer order from CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
367
+ Layers : {layer order from merged CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
368
+ CLAUDE.md : {root + {service_root} | {service_root} only | root only | ⚠️ service overlay MISSING — using root | missing}
341
369
  Ticket : {ticket_prefix}-
342
370
  Dict : {loaded — N canonical terms, M banned terms | missing}
343
371
  Entities : {loaded — EntityA, EntityB, EntityC | missing}
@@ -614,6 +642,13 @@ Suggest the logical next command based on workflow phase:
614
642
  | /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
615
643
  | /generate-bdd | `/review-context {feature-file}` to verify coverage |
616
644
  | /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
645
+ | /qc-analyze | `/qc-plan {UC-ID}` (resolve 🔴 blocker gaps first) |
646
+ | /qc-plan | `/qc-design-test {UC-ID}` |
647
+ | /qc-design-test | `/qc-review {UC-ID}` (test-case review) |
648
+ | /qc-review (test-case) | `/qc-run-test {UC-ID}` if APPROVED; fix TCs if NEEDS_FIX |
649
+ | /qc-run-test | `/qc-report {UC-ID}` then `/qc-review {UC-ID}` (script review) |
650
+ | /qc-review (script) | `/qc-report {UC-ID}` then create PR if APPROVED |
651
+ | /qc-report | `/validate-traces {UC-ID}` to refresh Living Docs (qc_status) |
617
652
  | /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
618
653
  | /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
619
654
  | /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/dev-gen-test {UC-ID}` |
@@ -406,6 +406,13 @@ Suggest the logical next command based on workflow phase:
406
406
  | /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
407
407
  | /generate-bdd | `/review-context {feature-file}` to verify coverage |
408
408
  | /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
409
+ | /qc-analyze | `/qc-plan {UC-ID}` (resolve 🔴 blocker gaps first) |
410
+ | /qc-plan | `/qc-design-test {UC-ID}` |
411
+ | /qc-design-test | `/qc-review {UC-ID}` (test-case review) |
412
+ | /qc-review (test-case) | `/qc-run-test {UC-ID}` if APPROVED; fix TCs if NEEDS_FIX |
413
+ | /qc-run-test | `/qc-report {UC-ID}` then `/qc-review {UC-ID}` (script review) |
414
+ | /qc-review (script) | `/qc-report {UC-ID}` then create PR if APPROVED |
415
+ | /qc-report | `/validate-traces {UC-ID}` to refresh Living Docs (qc_status) |
409
416
  | /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
410
417
  | /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
411
418
  | /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/dev-gen-test {UC-ID}` |