@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}
@@ -630,6 +658,13 @@ Suggest the logical next command based on workflow phase:
630
658
  | /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
631
659
  | /generate-bdd | `/review-context {feature-file}` to verify coverage |
632
660
  | /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
661
+ | /qc-analyze | `/qc-plan {UC-ID}` (resolve 🔴 blocker gaps first) |
662
+ | /qc-plan | `/qc-design-test {UC-ID}` |
663
+ | /qc-design-test | `/qc-review {UC-ID}` (test-case review) |
664
+ | /qc-review (test-case) | `/qc-run-test {UC-ID}` if APPROVED; fix TCs if NEEDS_FIX |
665
+ | /qc-run-test | `/qc-report {UC-ID}` then `/qc-review {UC-ID}` (script review) |
666
+ | /qc-review (script) | `/qc-report {UC-ID}` then create PR if APPROVED |
667
+ | /qc-report | `/validate-traces {UC-ID}` to refresh Living Docs (qc_status) |
633
668
  | /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
634
669
  | /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
635
670
  | /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/dev-gen-test {UC-ID}` |
@@ -130,6 +130,8 @@ Read `.agent/project-context.yaml`. Extract and store:
130
130
  - `paths.specs_dir` → BDD specs root
131
131
  - `paths.prd_dir` → PRD documents root
132
132
  - `paths.refinement_dir` → findings/review output dir
133
+ - `paths.qc_dir` → QC automation artifacts root (visible top-level, one subfolder per UC: `{qc_dir}/{UC-ID}/`)
134
+ - `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)
133
135
  - `paths.product_definitions_dir` → product definitions root
134
136
  - `paths.domain_knowledge_dir` → domain knowledge root
135
137
  - `paths.business_dictionary` → path to business-dictionary.md
@@ -142,6 +144,8 @@ If `paths` section is absent, use these defaults:
142
144
  - `specs_dir` = `specs/bdd`
143
145
  - `prd_dir` = `specs/prd`
144
146
  - `refinement_dir` = `.agent/review`
147
+ - `qc_dir` = `docs`
148
+ - `qc_skills_dir` = `.agent/skills/qc`
145
149
  - `product_definitions_dir` = `specs/product-definition`
146
150
  - `domain_knowledge_dir` = `specs/domain-knowledge`
147
151
  - `business_dictionary` = `specs/domain-knowledge/business-dictionary.md`
@@ -186,6 +190,7 @@ If `services` section is present:
186
190
  - Override `paths.core_entities` → `{spec_source}/specs/domain-knowledge/core-entities.md`
187
191
  - Override `paths.bug_reports_dir` → `{spec_source}/feedback/bug-reports`
188
192
  - Override `paths.bdd_proposals_dir` → `{spec_source}/feedback/bdd-proposals`
193
+ - Override `paths.prd_change_requests_dir` → `{spec_source}/feedback/prd-change-requests`
189
194
 
190
195
  > **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.
191
196
 
@@ -226,19 +231,41 @@ If the file does not exist → skip silently.
226
231
 
227
232
  ---
228
233
 
229
- ## Step 3 — [CRITICAL] Load CLAUDE.md
234
+ ## Step 3 — [CRITICAL] Load CLAUDE.md (layered: root + service overlay)
230
235
 
231
236
  *This is the highest-priority context — it defines HOW to write code and documents for this project.*
232
237
 
233
- Read `CLAUDE.md`. Extract and store:
238
+ CLAUDE.md is loaded in **two layers** so umbrella-wide rules and service-specific
239
+ architecture/coding standards compose correctly. The agent always sits at the umbrella
240
+ root, but the implementation code lives in a service submodule with its OWN stack,
241
+ architecture, and conventions — so the service's CLAUDE.md must win for code generation.
242
+
243
+ **Layer 1 — [BASE] Root CLAUDE.md (umbrella-wide).**
244
+ Read `CLAUDE.md` at the repo root. Treat its contents as the **shared baseline** for the
245
+ whole umbrella — git conventions, data-protection posture, cross-cutting rules, and (in
246
+ single-service mode) the project's only architecture + coding standards.
247
+
248
+ **Layer 2 — [OVERLAY] Service CLAUDE.md (umbrella mode only).**
249
+ *Run only if `service_root` was set in Step 1.6 (i.e. a real service was routed to).*
250
+ Read `{service_root}/CLAUDE.md`. This file defines the architecture + coding standards of
251
+ the **actual stack being implemented** (e.g. `user-service` = java-spring, `web` = nextjs).
252
+ Overlay it on top of Layer 1: **on any conflict, the service value WINS** for architecture,
253
+ coding standards, and error handling. Layer-1 values that the service does not redefine
254
+ (e.g. git conventions, banned patterns shared org-wide) remain in effect.
255
+
256
+ From the **merged** result, extract and store:
234
257
 
235
258
  - **§1 Project Overview** → project name, language, framework, build/test commands, domains
236
- - **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules
237
- - **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns
238
- - **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name
239
- - **§7 Git Conventions** → branch naming pattern, commit message format
259
+ - **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules — *service overlay wins*
260
+ - **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns — *service overlay wins*
261
+ - **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name — *service overlay wins*
262
+ - **§7 Git Conventions** → branch naming pattern, commit message format — *root baseline unless service redefines*
240
263
 
241
- If `CLAUDE.md` does not exist → note it as missing and continue with project-context.yaml data only.
264
+ **Resolution rules:**
265
+ - If both layers exist → merge as above; record `claude_md_source = root + {service_root}`.
266
+ - If only the service overlay exists (no root CLAUDE.md) → use the service file alone; `claude_md_source = {service_root}`.
267
+ - 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).
268
+ - If neither exists → note CLAUDE.md as missing and continue with project-context.yaml data only.
242
269
 
243
270
  ---
244
271
 
@@ -338,7 +365,8 @@ Output exactly this block:
338
365
  [CTX LOADED]
339
366
  Stack : {language} / {framework} / {database}
340
367
  Platform : {active_module} ({platform_type})
341
- Layers : {layer order from CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
368
+ Layers : {layer order from merged CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
369
+ CLAUDE.md : {root + {service_root} | {service_root} only | root only | ⚠️ service overlay MISSING — using root | missing}
342
370
  Ticket : {ticket_prefix}-
343
371
  Dict : {loaded — N canonical terms, M banned terms | missing}
344
372
  Entities : {loaded — EntityA, EntityB, EntityC | missing}
@@ -527,6 +555,13 @@ Suggest the logical next command based on workflow phase:
527
555
  | /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
528
556
  | /generate-bdd | `/review-context {feature-file}` to verify coverage |
529
557
  | /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
558
+ | /qc-analyze | `/qc-plan {UC-ID}` (resolve 🔴 blocker gaps first) |
559
+ | /qc-plan | `/qc-design-test {UC-ID}` |
560
+ | /qc-design-test | `/qc-review {UC-ID}` (test-case review) |
561
+ | /qc-review (test-case) | `/qc-run-test {UC-ID}` if APPROVED; fix TCs if NEEDS_FIX |
562
+ | /qc-run-test | `/qc-report {UC-ID}` then `/qc-review {UC-ID}` (script review) |
563
+ | /qc-review (script) | `/qc-report {UC-ID}` then create PR if APPROVED |
564
+ | /qc-report | `/validate-traces {UC-ID}` to refresh Living Docs (qc_status) |
530
565
  | /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
531
566
  | /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
532
567
  | /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/dev-gen-test {UC-ID}` |
@@ -146,6 +146,8 @@ Read `.agent/project-context.yaml`. Extract and store:
146
146
  - `paths.specs_dir` → BDD specs root
147
147
  - `paths.prd_dir` → PRD documents root
148
148
  - `paths.refinement_dir` → findings/review output dir
149
+ - `paths.qc_dir` → QC automation artifacts root (visible top-level, one subfolder per UC: `{qc_dir}/{UC-ID}/`)
150
+ - `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)
149
151
  - `paths.product_definitions_dir` → product definitions root
150
152
  - `paths.domain_knowledge_dir` → domain knowledge root
151
153
  - `paths.business_dictionary` → path to business-dictionary.md
@@ -158,6 +160,8 @@ If `paths` section is absent, use these defaults:
158
160
  - `specs_dir` = `specs/bdd`
159
161
  - `prd_dir` = `specs/prd`
160
162
  - `refinement_dir` = `.agent/review`
163
+ - `qc_dir` = `docs`
164
+ - `qc_skills_dir` = `.agent/skills/qc`
161
165
  - `product_definitions_dir` = `specs/product-definition`
162
166
  - `domain_knowledge_dir` = `specs/domain-knowledge`
163
167
  - `business_dictionary` = `specs/domain-knowledge/business-dictionary.md`
@@ -202,6 +206,7 @@ If `services` section is present:
202
206
  - Override `paths.core_entities` → `{spec_source}/specs/domain-knowledge/core-entities.md`
203
207
  - Override `paths.bug_reports_dir` → `{spec_source}/feedback/bug-reports`
204
208
  - Override `paths.bdd_proposals_dir` → `{spec_source}/feedback/bdd-proposals`
209
+ - Override `paths.prd_change_requests_dir` → `{spec_source}/feedback/prd-change-requests`
205
210
 
206
211
  > **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.
207
212
 
@@ -242,19 +247,41 @@ If the file does not exist → skip silently.
242
247
 
243
248
  ---
244
249
 
245
- ## Step 3 — [CRITICAL] Load CLAUDE.md
250
+ ## Step 3 — [CRITICAL] Load CLAUDE.md (layered: root + service overlay)
246
251
 
247
252
  *This is the highest-priority context — it defines HOW to write code and documents for this project.*
248
253
 
249
- Read `CLAUDE.md`. Extract and store:
254
+ CLAUDE.md is loaded in **two layers** so umbrella-wide rules and service-specific
255
+ architecture/coding standards compose correctly. The agent always sits at the umbrella
256
+ root, but the implementation code lives in a service submodule with its OWN stack,
257
+ architecture, and conventions — so the service's CLAUDE.md must win for code generation.
258
+
259
+ **Layer 1 — [BASE] Root CLAUDE.md (umbrella-wide).**
260
+ Read `CLAUDE.md` at the repo root. Treat its contents as the **shared baseline** for the
261
+ whole umbrella — git conventions, data-protection posture, cross-cutting rules, and (in
262
+ single-service mode) the project's only architecture + coding standards.
263
+
264
+ **Layer 2 — [OVERLAY] Service CLAUDE.md (umbrella mode only).**
265
+ *Run only if `service_root` was set in Step 1.6 (i.e. a real service was routed to).*
266
+ Read `{service_root}/CLAUDE.md`. This file defines the architecture + coding standards of
267
+ the **actual stack being implemented** (e.g. `user-service` = java-spring, `web` = nextjs).
268
+ Overlay it on top of Layer 1: **on any conflict, the service value WINS** for architecture,
269
+ coding standards, and error handling. Layer-1 values that the service does not redefine
270
+ (e.g. git conventions, banned patterns shared org-wide) remain in effect.
271
+
272
+ From the **merged** result, extract and store:
250
273
 
251
274
  - **§1 Project Overview** → project name, language, framework, build/test commands, domains
252
- - **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules
253
- - **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns
254
- - **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name
255
- - **§7 Git Conventions** → branch naming pattern, commit message format
275
+ - **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules — *service overlay wins*
276
+ - **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns — *service overlay wins*
277
+ - **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name — *service overlay wins*
278
+ - **§7 Git Conventions** → branch naming pattern, commit message format — *root baseline unless service redefines*
256
279
 
257
- If `CLAUDE.md` does not exist → note it as missing and continue with project-context.yaml data only.
280
+ **Resolution rules:**
281
+ - If both layers exist → merge as above; record `claude_md_source = root + {service_root}`.
282
+ - If only the service overlay exists (no root CLAUDE.md) → use the service file alone; `claude_md_source = {service_root}`.
283
+ - 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).
284
+ - If neither exists → note CLAUDE.md as missing and continue with project-context.yaml data only.
258
285
 
259
286
  ---
260
287
 
@@ -354,7 +381,8 @@ Output exactly this block:
354
381
  [CTX LOADED]
355
382
  Stack : {language} / {framework} / {database}
356
383
  Platform : {active_module} ({platform_type})
357
- Layers : {layer order from CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
384
+ Layers : {layer order from merged CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
385
+ CLAUDE.md : {root + {service_root} | {service_root} only | root only | ⚠️ service overlay MISSING — using root | missing}
358
386
  Ticket : {ticket_prefix}-
359
387
  Dict : {loaded — N canonical terms, M banned terms | missing}
360
388
  Entities : {loaded — EntityA, EntityB, EntityC | missing}
@@ -558,6 +586,13 @@ Suggest the logical next command based on workflow phase:
558
586
  | /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
559
587
  | /generate-bdd | `/review-context {feature-file}` to verify coverage |
560
588
  | /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
589
+ | /qc-analyze | `/qc-plan {UC-ID}` (resolve 🔴 blocker gaps first) |
590
+ | /qc-plan | `/qc-design-test {UC-ID}` |
591
+ | /qc-design-test | `/qc-review {UC-ID}` (test-case review) |
592
+ | /qc-review (test-case) | `/qc-run-test {UC-ID}` if APPROVED; fix TCs if NEEDS_FIX |
593
+ | /qc-run-test | `/qc-report {UC-ID}` then `/qc-review {UC-ID}` (script review) |
594
+ | /qc-review (script) | `/qc-report {UC-ID}` then create PR if APPROVED |
595
+ | /qc-report | `/validate-traces {UC-ID}` to refresh Living Docs (qc_status) |
561
596
  | /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
562
597
  | /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
563
598
  | /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/dev-gen-test {UC-ID}` |
package/commands/learn.md CHANGED
@@ -134,6 +134,8 @@ Read `.agent/project-context.yaml`. Extract and store:
134
134
  - `paths.specs_dir` → BDD specs root
135
135
  - `paths.prd_dir` → PRD documents root
136
136
  - `paths.refinement_dir` → findings/review output dir
137
+ - `paths.qc_dir` → QC automation artifacts root (visible top-level, one subfolder per UC: `{qc_dir}/{UC-ID}/`)
138
+ - `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
139
  - `paths.product_definitions_dir` → product definitions root
138
140
  - `paths.domain_knowledge_dir` → domain knowledge root
139
141
  - `paths.business_dictionary` → path to business-dictionary.md
@@ -146,6 +148,8 @@ If `paths` section is absent, use these defaults:
146
148
  - `specs_dir` = `specs/bdd`
147
149
  - `prd_dir` = `specs/prd`
148
150
  - `refinement_dir` = `.agent/review`
151
+ - `qc_dir` = `docs`
152
+ - `qc_skills_dir` = `.agent/skills/qc`
149
153
  - `product_definitions_dir` = `specs/product-definition`
150
154
  - `domain_knowledge_dir` = `specs/domain-knowledge`
151
155
  - `business_dictionary` = `specs/domain-knowledge/business-dictionary.md`
@@ -190,6 +194,7 @@ If `services` section is present:
190
194
  - Override `paths.core_entities` → `{spec_source}/specs/domain-knowledge/core-entities.md`
191
195
  - Override `paths.bug_reports_dir` → `{spec_source}/feedback/bug-reports`
192
196
  - Override `paths.bdd_proposals_dir` → `{spec_source}/feedback/bdd-proposals`
197
+ - Override `paths.prd_change_requests_dir` → `{spec_source}/feedback/prd-change-requests`
193
198
 
194
199
  > **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
200
 
@@ -230,19 +235,41 @@ If the file does not exist → skip silently.
230
235
 
231
236
  ---
232
237
 
233
- ## Step 3 — [CRITICAL] Load CLAUDE.md
238
+ ## Step 3 — [CRITICAL] Load CLAUDE.md (layered: root + service overlay)
234
239
 
235
240
  *This is the highest-priority context — it defines HOW to write code and documents for this project.*
236
241
 
237
- Read `CLAUDE.md`. Extract and store:
242
+ CLAUDE.md is loaded in **two layers** so umbrella-wide rules and service-specific
243
+ architecture/coding standards compose correctly. The agent always sits at the umbrella
244
+ root, but the implementation code lives in a service submodule with its OWN stack,
245
+ architecture, and conventions — so the service's CLAUDE.md must win for code generation.
246
+
247
+ **Layer 1 — [BASE] Root CLAUDE.md (umbrella-wide).**
248
+ Read `CLAUDE.md` at the repo root. Treat its contents as the **shared baseline** for the
249
+ whole umbrella — git conventions, data-protection posture, cross-cutting rules, and (in
250
+ single-service mode) the project's only architecture + coding standards.
251
+
252
+ **Layer 2 — [OVERLAY] Service CLAUDE.md (umbrella mode only).**
253
+ *Run only if `service_root` was set in Step 1.6 (i.e. a real service was routed to).*
254
+ Read `{service_root}/CLAUDE.md`. This file defines the architecture + coding standards of
255
+ the **actual stack being implemented** (e.g. `user-service` = java-spring, `web` = nextjs).
256
+ Overlay it on top of Layer 1: **on any conflict, the service value WINS** for architecture,
257
+ coding standards, and error handling. Layer-1 values that the service does not redefine
258
+ (e.g. git conventions, banned patterns shared org-wide) remain in effect.
259
+
260
+ From the **merged** result, extract and store:
238
261
 
239
262
  - **§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
263
+ - **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules — *service overlay wins*
264
+ - **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns — *service overlay wins*
265
+ - **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name — *service overlay wins*
266
+ - **§7 Git Conventions** → branch naming pattern, commit message format — *root baseline unless service redefines*
244
267
 
245
- If `CLAUDE.md` does not exist → note it as missing and continue with project-context.yaml data only.
268
+ **Resolution rules:**
269
+ - If both layers exist → merge as above; record `claude_md_source = root + {service_root}`.
270
+ - If only the service overlay exists (no root CLAUDE.md) → use the service file alone; `claude_md_source = {service_root}`.
271
+ - 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).
272
+ - If neither exists → note CLAUDE.md as missing and continue with project-context.yaml data only.
246
273
 
247
274
  ---
248
275
 
@@ -342,7 +369,8 @@ Output exactly this block:
342
369
  [CTX LOADED]
343
370
  Stack : {language} / {framework} / {database}
344
371
  Platform : {active_module} ({platform_type})
345
- Layers : {layer order from CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
372
+ Layers : {layer order from merged CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
373
+ CLAUDE.md : {root + {service_root} | {service_root} only | root only | ⚠️ service overlay MISSING — using root | missing}
346
374
  Ticket : {ticket_prefix}-
347
375
  Dict : {loaded — N canonical terms, M banned terms | missing}
348
376
  Entities : {loaded — EntityA, EntityB, EntityC | missing}
@@ -511,6 +539,13 @@ Suggest the logical next command based on workflow phase:
511
539
  | /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
512
540
  | /generate-bdd | `/review-context {feature-file}` to verify coverage |
513
541
  | /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
542
+ | /qc-analyze | `/qc-plan {UC-ID}` (resolve 🔴 blocker gaps first) |
543
+ | /qc-plan | `/qc-design-test {UC-ID}` |
544
+ | /qc-design-test | `/qc-review {UC-ID}` (test-case review) |
545
+ | /qc-review (test-case) | `/qc-run-test {UC-ID}` if APPROVED; fix TCs if NEEDS_FIX |
546
+ | /qc-run-test | `/qc-report {UC-ID}` then `/qc-review {UC-ID}` (script review) |
547
+ | /qc-review (script) | `/qc-report {UC-ID}` then create PR if APPROVED |
548
+ | /qc-report | `/validate-traces {UC-ID}` to refresh Living Docs (qc_status) |
514
549
  | /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
515
550
  | /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
516
551
  | /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/dev-gen-test {UC-ID}` |
@@ -1,7 +1,8 @@
1
- # /propose-scenario — Propose a New BDD Scenario (Tester-Facing)
1
+ # /propose-scenario — Propose a New BDD Scenario (Tester & QC-Facing)
2
2
 
3
- For **testers** who discover an edge case not covered by existing BDD. Drafts a Gherkin scenario
4
- into a **proposals area** for PO/Dev to review and promote.
3
+ For **testers and QC** who discover an edge case not covered by existing BDD (e.g. a `DOC_GAPS`
4
+ missing-coverage gap from `/qc-analyze`). Drafts a Gherkin scenario into a **proposals area** for
5
+ PO/Dev to review and promote.
5
6
 
6
7
  **Does NOT edit the canonical `.feature` file.** BDD is owned by PO/Dev — this command only writes
7
8
  a proposal. Promotion into the real BDD is a PO/Dev action.
@@ -134,6 +135,8 @@ Read `.agent/project-context.yaml`. Extract and store:
134
135
  - `paths.specs_dir` → BDD specs root
135
136
  - `paths.prd_dir` → PRD documents root
136
137
  - `paths.refinement_dir` → findings/review output dir
138
+ - `paths.qc_dir` → QC automation artifacts root (visible top-level, one subfolder per UC: `{qc_dir}/{UC-ID}/`)
139
+ - `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
140
  - `paths.product_definitions_dir` → product definitions root
138
141
  - `paths.domain_knowledge_dir` → domain knowledge root
139
142
  - `paths.business_dictionary` → path to business-dictionary.md
@@ -146,6 +149,8 @@ If `paths` section is absent, use these defaults:
146
149
  - `specs_dir` = `specs/bdd`
147
150
  - `prd_dir` = `specs/prd`
148
151
  - `refinement_dir` = `.agent/review`
152
+ - `qc_dir` = `docs`
153
+ - `qc_skills_dir` = `.agent/skills/qc`
149
154
  - `product_definitions_dir` = `specs/product-definition`
150
155
  - `domain_knowledge_dir` = `specs/domain-knowledge`
151
156
  - `business_dictionary` = `specs/domain-knowledge/business-dictionary.md`
@@ -190,6 +195,7 @@ If `services` section is present:
190
195
  - Override `paths.core_entities` → `{spec_source}/specs/domain-knowledge/core-entities.md`
191
196
  - Override `paths.bug_reports_dir` → `{spec_source}/feedback/bug-reports`
192
197
  - Override `paths.bdd_proposals_dir` → `{spec_source}/feedback/bdd-proposals`
198
+ - Override `paths.prd_change_requests_dir` → `{spec_source}/feedback/prd-change-requests`
193
199
 
194
200
  > **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
201
 
@@ -230,19 +236,41 @@ If the file does not exist → skip silently.
230
236
 
231
237
  ---
232
238
 
233
- ## Step 3 — [CRITICAL] Load CLAUDE.md
239
+ ## Step 3 — [CRITICAL] Load CLAUDE.md (layered: root + service overlay)
234
240
 
235
241
  *This is the highest-priority context — it defines HOW to write code and documents for this project.*
236
242
 
237
- Read `CLAUDE.md`. Extract and store:
243
+ CLAUDE.md is loaded in **two layers** so umbrella-wide rules and service-specific
244
+ architecture/coding standards compose correctly. The agent always sits at the umbrella
245
+ root, but the implementation code lives in a service submodule with its OWN stack,
246
+ architecture, and conventions — so the service's CLAUDE.md must win for code generation.
247
+
248
+ **Layer 1 — [BASE] Root CLAUDE.md (umbrella-wide).**
249
+ Read `CLAUDE.md` at the repo root. Treat its contents as the **shared baseline** for the
250
+ whole umbrella — git conventions, data-protection posture, cross-cutting rules, and (in
251
+ single-service mode) the project's only architecture + coding standards.
252
+
253
+ **Layer 2 — [OVERLAY] Service CLAUDE.md (umbrella mode only).**
254
+ *Run only if `service_root` was set in Step 1.6 (i.e. a real service was routed to).*
255
+ Read `{service_root}/CLAUDE.md`. This file defines the architecture + coding standards of
256
+ the **actual stack being implemented** (e.g. `user-service` = java-spring, `web` = nextjs).
257
+ Overlay it on top of Layer 1: **on any conflict, the service value WINS** for architecture,
258
+ coding standards, and error handling. Layer-1 values that the service does not redefine
259
+ (e.g. git conventions, banned patterns shared org-wide) remain in effect.
260
+
261
+ From the **merged** result, extract and store:
238
262
 
239
263
  - **§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
264
+ - **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules — *service overlay wins*
265
+ - **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns — *service overlay wins*
266
+ - **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name — *service overlay wins*
267
+ - **§7 Git Conventions** → branch naming pattern, commit message format — *root baseline unless service redefines*
244
268
 
245
- If `CLAUDE.md` does not exist → note it as missing and continue with project-context.yaml data only.
269
+ **Resolution rules:**
270
+ - If both layers exist → merge as above; record `claude_md_source = root + {service_root}`.
271
+ - If only the service overlay exists (no root CLAUDE.md) → use the service file alone; `claude_md_source = {service_root}`.
272
+ - 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).
273
+ - If neither exists → note CLAUDE.md as missing and continue with project-context.yaml data only.
246
274
 
247
275
  ---
248
276
 
@@ -342,7 +370,8 @@ Output exactly this block:
342
370
  [CTX LOADED]
343
371
  Stack : {language} / {framework} / {database}
344
372
  Platform : {active_module} ({platform_type})
345
- Layers : {layer order from CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
373
+ Layers : {layer order from merged CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
374
+ CLAUDE.md : {root + {service_root} | {service_root} only | root only | ⚠️ service overlay MISSING — using root | missing}
346
375
  Ticket : {ticket_prefix}-
347
376
  Dict : {loaded — N canonical terms, M banned terms | missing}
348
377
  Entities : {loaded — EntityA, EntityB, EntityC | missing}
@@ -387,15 +416,28 @@ A BDD scenario must trace to a PRD acceptance criterion. Determine which case ap
387
416
  → This is a coverage gap. Proceed to draft the scenario (Step 3), mapped to that AC.
388
417
 
389
418
  **Case B — behavior is NOT in any AC** (genuinely new requirement):
390
- STOP. A scenario here would have nothing to trace to. Do **not** draft it as a BDD proposal.
391
- Instead output a **PRD change request** for the PO:
419
+ Do **not** draft a BDD proposal (a scenario would have nothing to trace to). Instead **write a
420
+ PRD change request file** so the PO actually sees it on `/sync` (do not just print it):
421
+
422
+ Write to `{paths.prd_change_requests_dir}/{UC-ID}-{slug}.md` (resolved to
423
+ `{spec_source}/feedback/prd-change-requests/` in umbrella mode; create dir if needed):
392
424
  ```
393
- ⚠️ Not covered by any PRD AC this is a new requirement, not a coverage gap.
394
- Route to PO: add/extend an AC in {prd_path}, then re-run /generate-bdd.
395
- Requested behavior: {description}
396
- Suggested AC: "{draft AC text}"
425
+ # PRD Change Request{UC-ID}: {short title}
426
+
427
+ > ⚠️ New requirement found in test — NOT covered by any PRD AC (not a coverage gap).
428
+ | Field | Value |
429
+ |---|---|
430
+ | UC / Ticket | {UC-ID} |
431
+ | PRD | {prd_path} (v{prd_version}) |
432
+ | Source | {BUG-ID if any | tester/QC observation} |
433
+ | Requested by | tester/QC |
434
+ | Status | Open |
435
+
436
+ **Requested behavior:** {description}
437
+ **Suggested AC (draft for PO):** "{draft AC text}"
438
+ **Route to PO:** add/extend an AC in {prd_path} → `/refine-prd` → re-run `/generate-bdd` → dev `/generate-code`.
397
439
  ```
398
- Then end (no proposal file written for BDD).
440
+ Then go to Step 5 (handoff applies to this file too). Skip Step 3–4 (no BDD scenario for Case B).
399
441
 
400
442
  If unsure which case → show the AC list and ask the tester which AC this maps to, or confirm it's new.
401
443
 
@@ -424,7 +466,13 @@ git push # → PO/Dev see it on their next /sync
424
466
  ```
425
467
 
426
468
  - No push rights to the spec repo → open a PR / MR instead. Print this fallback.
427
- - For a **PRD change request** (Case B), the same handoff applies — commit the request doc so the PO sees it.
469
+ - For a **PRD change request** (Case B), commit the request file instead:
470
+ ```bash
471
+ cd {spec_source}
472
+ git add feedback/prd-change-requests/{UC-ID}-{slug}.md
473
+ git commit -m "qa(prd-change): {UC-ID} — {title}"
474
+ git push
475
+ ```
428
476
 
429
477
  > PO/Dev are notified through their normal routine: `/sync` lists newly-pulled proposals.
430
478
 
@@ -468,6 +516,13 @@ Suggest the logical next command based on workflow phase:
468
516
  | /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
469
517
  | /generate-bdd | `/review-context {feature-file}` to verify coverage |
470
518
  | /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
519
+ | /qc-analyze | `/qc-plan {UC-ID}` (resolve 🔴 blocker gaps first) |
520
+ | /qc-plan | `/qc-design-test {UC-ID}` |
521
+ | /qc-design-test | `/qc-review {UC-ID}` (test-case review) |
522
+ | /qc-review (test-case) | `/qc-run-test {UC-ID}` if APPROVED; fix TCs if NEEDS_FIX |
523
+ | /qc-run-test | `/qc-report {UC-ID}` then `/qc-review {UC-ID}` (script review) |
524
+ | /qc-review (script) | `/qc-report {UC-ID}` then create PR if APPROVED |
525
+ | /qc-report | `/validate-traces {UC-ID}` to refresh Living Docs (qc_status) |
471
526
  | /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
472
527
  | /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
473
528
  | /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/dev-gen-test {UC-ID}` |
@@ -1,7 +1,8 @@
1
- # /propose-scenario — Propose a New BDD Scenario (Tester-Facing)
1
+ # /propose-scenario — Propose a New BDD Scenario (Tester & QC-Facing)
2
2
 
3
- For **testers** who discover an edge case not covered by existing BDD. Drafts a Gherkin scenario
4
- into a **proposals area** for PO/Dev to review and promote.
3
+ For **testers and QC** who discover an edge case not covered by existing BDD (e.g. a `DOC_GAPS`
4
+ missing-coverage gap from `/qc-analyze`). Drafts a Gherkin scenario into a **proposals area** for
5
+ PO/Dev to review and promote.
5
6
 
6
7
  **Does NOT edit the canonical `.feature` file.** BDD is owned by PO/Dev — this command only writes
7
8
  a proposal. Promotion into the real BDD is a PO/Dev action.
@@ -34,15 +35,28 @@ A BDD scenario must trace to a PRD acceptance criterion. Determine which case ap
34
35
  → This is a coverage gap. Proceed to draft the scenario (Step 3), mapped to that AC.
35
36
 
36
37
  **Case B — behavior is NOT in any AC** (genuinely new requirement):
37
- STOP. A scenario here would have nothing to trace to. Do **not** draft it as a BDD proposal.
38
- Instead output a **PRD change request** for the PO:
38
+ Do **not** draft a BDD proposal (a scenario would have nothing to trace to). Instead **write a
39
+ PRD change request file** so the PO actually sees it on `/sync` (do not just print it):
40
+
41
+ Write to `{paths.prd_change_requests_dir}/{UC-ID}-{slug}.md` (resolved to
42
+ `{spec_source}/feedback/prd-change-requests/` in umbrella mode; create dir if needed):
39
43
  ```
40
- ⚠️ Not covered by any PRD AC this is a new requirement, not a coverage gap.
41
- Route to PO: add/extend an AC in {prd_path}, then re-run /generate-bdd.
42
- Requested behavior: {description}
43
- Suggested AC: "{draft AC text}"
44
+ # PRD Change Request{UC-ID}: {short title}
45
+
46
+ > ⚠️ New requirement found in test — NOT covered by any PRD AC (not a coverage gap).
47
+ | Field | Value |
48
+ |---|---|
49
+ | UC / Ticket | {UC-ID} |
50
+ | PRD | {prd_path} (v{prd_version}) |
51
+ | Source | {BUG-ID if any | tester/QC observation} |
52
+ | Requested by | tester/QC |
53
+ | Status | Open |
54
+
55
+ **Requested behavior:** {description}
56
+ **Suggested AC (draft for PO):** "{draft AC text}"
57
+ **Route to PO:** add/extend an AC in {prd_path} → `/refine-prd` → re-run `/generate-bdd` → dev `/generate-code`.
44
58
  ```
45
- Then end (no proposal file written for BDD).
59
+ Then go to Step 5 (handoff applies to this file too). Skip Step 3–4 (no BDD scenario for Case B).
46
60
 
47
61
  If unsure which case → show the AC list and ask the tester which AC this maps to, or confirm it's new.
48
62
 
@@ -71,7 +85,13 @@ git push # → PO/Dev see it on their next /sync
71
85
  ```
72
86
 
73
87
  - No push rights to the spec repo → open a PR / MR instead. Print this fallback.
74
- - For a **PRD change request** (Case B), the same handoff applies — commit the request doc so the PO sees it.
88
+ - For a **PRD change request** (Case B), commit the request file instead:
89
+ ```bash
90
+ cd {spec_source}
91
+ git add feedback/prd-change-requests/{UC-ID}-{slug}.md
92
+ git commit -m "qa(prd-change): {UC-ID} — {title}"
93
+ git push
94
+ ```
75
95
 
76
96
  > PO/Dev are notified through their normal routine: `/sync` lists newly-pulled proposals.
77
97