@anhth2/spec-driven-dev-plugin 0.11.0 → 0.14.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 (173) hide show
  1. package/commands/debug.md +47 -7
  2. package/commands/define-product.md +47 -7
  3. package/commands/dev-gen-test.md +65 -17
  4. package/commands/dev-run-test.md +66 -18
  5. package/commands/dev-run-test.tmpl +1 -1
  6. package/commands/dev-smoke-test.md +47 -7
  7. package/commands/fix-bug.md +83 -13
  8. package/commands/fix-bug.tmpl +36 -6
  9. package/commands/generate-bdd.md +74 -21
  10. package/commands/generate-bdd.tmpl +9 -4
  11. package/commands/generate-code.md +118 -35
  12. package/commands/generate-code.tmpl +53 -18
  13. package/commands/generate-design-spec.md +47 -7
  14. package/commands/generate-prd.md +47 -7
  15. package/commands/generate-spec-manifest.md +47 -7
  16. package/commands/generate-tech-docs.md +234 -20
  17. package/commands/generate-tech-docs.tmpl +187 -13
  18. package/commands/learn.md +47 -7
  19. package/commands/map-testids.md +564 -0
  20. package/commands/map-testids.tmpl +81 -0
  21. package/commands/propose-scenario.md +78 -18
  22. package/commands/propose-scenario.tmpl +31 -11
  23. package/commands/qc-analyze.md +67 -12
  24. package/commands/qc-analyze.tmpl +20 -5
  25. package/commands/qc-design-test.md +51 -10
  26. package/commands/qc-design-test.tmpl +4 -3
  27. package/commands/qc-plan.md +50 -10
  28. package/commands/qc-plan.tmpl +3 -3
  29. package/commands/qc-report.md +60 -8
  30. package/commands/qc-report.tmpl +13 -1
  31. package/commands/qc-review.md +49 -9
  32. package/commands/qc-review.tmpl +2 -2
  33. package/commands/qc-run-test.md +75 -20
  34. package/commands/qc-run-test.tmpl +10 -3
  35. package/commands/refine-prd.md +47 -7
  36. package/commands/report-bug.md +63 -9
  37. package/commands/report-bug.tmpl +16 -2
  38. package/commands/review-code.md +47 -7
  39. package/commands/review-context.md +47 -7
  40. package/commands/review-tech-docs.md +50 -9
  41. package/commands/review-tech-docs.tmpl +3 -2
  42. package/commands/setup-ai-first.md +37 -4
  43. package/commands/setup-ai-first.tmpl +2 -2
  44. package/commands/sync.md +47 -11
  45. package/commands/sync.tmpl +12 -9
  46. package/commands/update-framework.md +35 -2
  47. package/commands/validate-traces.md +98 -40
  48. package/commands/validate-traces.tmpl +51 -33
  49. package/core/FRAMEWORK_VERSION +1 -1
  50. package/core/commands/debug.md +47 -7
  51. package/core/commands/define-product.md +47 -7
  52. package/core/commands/dev-gen-test.md +65 -17
  53. package/core/commands/dev-run-test.md +66 -18
  54. package/core/commands/dev-smoke-test.md +47 -7
  55. package/core/commands/fix-bug.md +83 -13
  56. package/core/commands/generate-bdd.md +74 -21
  57. package/core/commands/generate-code.md +118 -35
  58. package/core/commands/generate-design-spec.md +47 -7
  59. package/core/commands/generate-prd.md +47 -7
  60. package/core/commands/generate-spec-manifest.md +47 -7
  61. package/core/commands/generate-tech-docs.md +234 -20
  62. package/core/commands/learn.md +47 -7
  63. package/core/commands/map-testids.md +564 -0
  64. package/core/commands/propose-scenario.md +78 -18
  65. package/core/commands/qc-analyze.md +67 -12
  66. package/core/commands/qc-design-test.md +51 -10
  67. package/core/commands/qc-plan.md +50 -10
  68. package/core/commands/qc-report.md +60 -8
  69. package/core/commands/qc-review.md +49 -9
  70. package/core/commands/qc-run-test.md +75 -20
  71. package/core/commands/refine-prd.md +47 -7
  72. package/core/commands/report-bug.md +63 -9
  73. package/core/commands/review-code.md +47 -7
  74. package/core/commands/review-context.md +47 -7
  75. package/core/commands/review-tech-docs.md +50 -9
  76. package/core/commands/setup-ai-first.md +37 -4
  77. package/core/commands/sync.md +47 -11
  78. package/core/commands/update-framework.md +35 -2
  79. package/core/commands/validate-traces.md +98 -40
  80. package/core/modules/qc-playwright/stack-profile.yaml +4 -3
  81. package/core/skills/code/SKILL.md +82 -9
  82. package/core/skills/debug/SKILL.md +117 -11
  83. package/core/skills/design-spec/SKILL.md +47 -7
  84. package/core/skills/discovery/SKILL.md +47 -7
  85. package/core/skills/prd/SKILL.md +70 -4
  86. package/core/skills/qc/qa-analyst/acceptance-criteria.md +5 -1
  87. package/core/skills/qc/qa-analyst/business-rules.md +6 -2
  88. package/core/skills/qc/qa-analyst/data-flow.md +6 -2
  89. package/core/skills/qc/qa-analyst/spec-breakdown.md +7 -3
  90. package/core/skills/qc/qa-designer/e2e/journey.md +1 -1
  91. package/core/skills/qc/qa-designer/exploratory/charter.md +2 -2
  92. package/core/skills/qc/qa-designer/exploratory/explore-to-functional.md +1 -1
  93. package/core/skills/qc/qa-designer/functional/api.md +1 -1
  94. package/core/skills/qc/qa-designer/functional/gui-feature.md +1 -1
  95. package/core/skills/qc/qa-designer/functional/gui-screen.md +1 -1
  96. package/core/skills/qc/qa-designer/integration/api.md +1 -1
  97. package/core/skills/qc/qa-designer/integration/db.md +1 -1
  98. package/core/skills/qc/qa-designer/integration/gui.md +1 -1
  99. package/core/skills/qc/qa-designer/integration/kafka.md +1 -1
  100. package/core/skills/qc/qa-designer/non-functional.md +1 -1
  101. package/core/skills/qc/qa-planner/test-plan.md +4 -4
  102. package/core/skills/qc/qa-runner/exploratory/session.md +2 -2
  103. package/core/skills/setup-ai-first/SKILL.md +35 -2
  104. package/core/skills/spec/SKILL.md +70 -4
  105. package/core/skills/test/SKILL.md +129 -16
  106. package/core/steps/context-loader.md +12 -5
  107. package/core/steps/report-footer.md +35 -2
  108. package/core/steps/trace-mirror.md +18 -10
  109. package/core/templates/project-context.yaml +27 -6
  110. package/docs/01-getting-started/core-concepts.md +7 -7
  111. package/docs/01-getting-started/installation.md +4 -2
  112. package/docs/01-getting-started/quickstart.md +1 -1
  113. package/docs/02-guides/README.md +1 -2
  114. package/docs/02-guides/developer/README.md +1 -1
  115. package/docs/02-guides/developer/bdd-and-trace.md +10 -8
  116. package/docs/02-guides/developer/commands.md +4 -4
  117. package/docs/02-guides/developer/scenarios.md +26 -14
  118. package/docs/02-guides/developer/workflow.md +81 -19
  119. package/docs/02-guides/product-owner/README.md +6 -4
  120. package/docs/02-guides/product-owner/commands.md +1 -1
  121. package/docs/02-guides/product-owner/scenarios.md +80 -1
  122. package/docs/02-guides/tester/README.md +13 -10
  123. package/docs/02-guides/tester/bug-reporting.md +2 -2
  124. package/docs/02-guides/tester/qc-automation.md +165 -0
  125. package/docs/02-guides/tester/reading-specs.md +4 -4
  126. package/docs/02-guides/tester/scenarios.md +5 -5
  127. package/docs/02-guides/tester/spec-manifest.md +17 -12
  128. package/docs/02-guides/tester/test-checklist.md +3 -3
  129. package/docs/02-guides/tester/workflow.md +12 -14
  130. package/docs/03-concepts/architecture.md +7 -4
  131. package/docs/03-concepts/pipeline.md +37 -12
  132. package/docs/03-concepts/traceability.md +19 -18
  133. package/docs/04-operations/README.md +1 -1
  134. package/docs/04-operations/bug-flow.md +46 -5
  135. package/docs/04-operations/sync-and-update.md +186 -24
  136. package/docs/05-reference/README.md +3 -0
  137. package/docs/05-reference/command-cheatsheet.md +147 -0
  138. package/docs/05-reference/commands.md +73 -70
  139. package/docs/05-reference/modules.md +4 -4
  140. package/docs/05-reference/trace-schema.md +23 -16
  141. package/docs/README.md +3 -5
  142. package/modules/qc-playwright/stack-profile.yaml +4 -3
  143. package/package.json +1 -1
  144. package/skills/code/SKILL.md +82 -9
  145. package/skills/debug/SKILL.md +117 -11
  146. package/skills/design-spec/SKILL.md +47 -7
  147. package/skills/discovery/SKILL.md +47 -7
  148. package/skills/prd/SKILL.md +70 -4
  149. package/skills/qc/qa-analyst/acceptance-criteria.md +5 -1
  150. package/skills/qc/qa-analyst/business-rules.md +6 -2
  151. package/skills/qc/qa-analyst/data-flow.md +6 -2
  152. package/skills/qc/qa-analyst/spec-breakdown.md +7 -3
  153. package/skills/qc/qa-designer/e2e/journey.md +1 -1
  154. package/skills/qc/qa-designer/exploratory/charter.md +2 -2
  155. package/skills/qc/qa-designer/exploratory/explore-to-functional.md +1 -1
  156. package/skills/qc/qa-designer/functional/api.md +1 -1
  157. package/skills/qc/qa-designer/functional/gui-feature.md +1 -1
  158. package/skills/qc/qa-designer/functional/gui-screen.md +1 -1
  159. package/skills/qc/qa-designer/integration/api.md +1 -1
  160. package/skills/qc/qa-designer/integration/db.md +1 -1
  161. package/skills/qc/qa-designer/integration/gui.md +1 -1
  162. package/skills/qc/qa-designer/integration/kafka.md +1 -1
  163. package/skills/qc/qa-designer/non-functional.md +1 -1
  164. package/skills/qc/qa-planner/test-plan.md +4 -4
  165. package/skills/qc/qa-runner/exploratory/session.md +2 -2
  166. package/skills/setup-ai-first/SKILL.md +35 -2
  167. package/skills/spec/SKILL.md +70 -4
  168. package/skills/test/SKILL.md +129 -16
  169. package/steps/context-loader.md +12 -5
  170. package/steps/report-footer.md +35 -2
  171. package/steps/trace-mirror.md +18 -10
  172. package/templates/project-context.yaml +27 -6
  173. package/docs/02-guides/qc-automation.md +0 -92
@@ -17,7 +17,7 @@
17
17
  7. [Project Lessons — không để AI lặp lỗi](#7-project-lessons--không-để-ai-lặp-lỗi)
18
18
  8. [Câu hỏi thường gặp](#8-câu-hỏi-thường-gặp)
19
19
 
20
- > Pipeline QC native (`/qc-*`) có trang riêng — xem [Guide · QC Automation](../02-guides/qc-automation.md). Ở đây chỉ điểm qua chỗ `/sync` chạm vào QC.
20
+ > Pipeline QC native (`/qc-*`) có trang riêng — xem [chương QC Automation](../02-guides/tester/qc-automation.md). Ở đây chỉ điểm qua chỗ `/sync` chạm vào QC.
21
21
 
22
22
  ---
23
23
 
@@ -48,7 +48,7 @@ Có 2 thứ cần update, **nguồn khác nhau, tần suất khác nhau**:
48
48
 
49
49
  - Pull specs (spec submodule) + services (service submodules).
50
50
  - Refresh Living Docs panel (regenerate trace report — xem [§5](#5-living-docs-sync)).
51
- - Liệt kê **📥 New tester feedback** — bug report / scenario proposal mới từ tester trong vùng `feedback/` của spec repo.
51
+ - Liệt kê **📥 New tester feedback** — bug report / scenario proposal mới từ tester trong vùng `feedback/` của spec repo. Chỉ surface bug có `State: Open` là đang chờ; `State: Fixed` (chờ QC re-verify) / `Closed` liệt kê riêng để không làm nhiễu view của PO/PM. Vòng đời đầy đủ: [bug-flow.md §10](bug-flow.md).
52
52
 
53
53
  ```bash
54
54
  /sync
@@ -78,12 +78,54 @@ Service submodules không bị ảnh hưởng — luôn checkout đúng SHA mà
78
78
 
79
79
  > **Umbrella mode:** `/update-framework` chỉ cần chạy ở **umbrella root**. Service submodule chỉ chứa `.agent/project-context.yaml` (config), không có command files → không cần nâng cấp riêng.
80
80
 
81
+ > ⚠️ **`--init` ghi đè TOÀN BỘ `.agent/`** (gồm cả `.agent/skills/qc/`) — KHÔNG đụng `.agent/project-context.yaml` (config của bạn) và mọi thứ **ngoài** `.agent/`.
82
+ > **Hệ quả với skill QC:** nếu QC sửa skill **trực tiếp trong `.agent/skills/qc/`** thì sẽ **mất sau upgrade**. Để skill QC tồn tại độc lập, trỏ `paths.qc_skills_dir` (trong `.agent/project-context.yaml`) tới **repo QC riêng / submodule** (vd `qc-base/.claude/skills`) — `qc_skills_dir` nằm ngoài `.agent/` nên upgrade không bao giờ chạm. Chi tiết: [chương QC Automation](../02-guides/tester/qc-automation.md#skill-sourcing--upgrade-safety).
83
+
81
84
  ---
82
85
 
83
86
  ## 4. Umbrella mode & git submodule
84
87
 
85
88
  Claude Code luôn mở ở **umbrella repo** (không mở trong service submodule). Umbrella thấy được cả spec submodule (read-only) lẫn service submodule (code).
86
89
 
90
+ ### Ai commit vào repo nào? (git flow theo role)
91
+
92
+ 3 repo độc lập (mỗi cái có origin riêng), umbrella chỉ giữ **pointer**. Mỗi role ghi vào repo khác nhau → số "tầng push" khác nhau:
93
+
94
+ ```
95
+ UMBRELLA REPO (Claude Code mở ở đây · .gitmodules + docs/)
96
+ │ giữ pointer (SHA) tới từng submodule
97
+ ┌─────────────┴──────────────┐
98
+ ▼ ▼
99
+ SPEC SUBMODULE SERVICE SUBMODULE(s)
100
+ (PO sở hữu · origin riêng) (Dev sở hữu · origin riêng)
101
+ specs/prd · specs/bdd (web/app/system) src/ (chỉ code + tooling)
102
+ specs/design-spec · specs/tech-docs
103
+ feedback/ (bug · proposal · prd-change)
104
+ .trace/*.tsv (qc_status + dev_selftest — write area của dev/QC)
105
+ ```
106
+
107
+ > **Tất cả spec + `.trace/` ở SPEC repo; service submodule chỉ chứa code.** PRD/BDD/design-spec/tech-docs read-only với dev/QC; `feedback/` và `.trace/` là vùng dev/QC được ghi.
108
+
109
+ | Role | Tạo gì | Repo đích | Push mấy tầng |
110
+ |------|--------|-----------|---------------|
111
+ | **PO** | PRD · BDD (web/app/system) · design-spec · sửa PRD theo change-request | SPEC repo | **1 tầng** (spec repo) |
112
+ | **Dev (FE/BE)** | tech-docs · code · dev test (`dev_selftest`) | tech-docs → SPEC repo · `dev_selftest` → SPEC `.trace/` · code → SERVICE | code: **2 tầng** (service → umbrella pointer) · tech-docs + trace: 1 tầng ở spec repo (cross-repo write) |
113
+ | **QC / Tester (QA)** | QC pipeline (analysis/test-cases · `qc_status`) · bug report · scenario proposal · prd-change-request | artifacts → `{qc_dir}/{UC-ID}/` (umbrella `docs/`) · `qc_status` → SPEC `.trace/` · bug/proposal/change-request → SPEC `feedback/` | artifacts: 1 tầng (umbrella) · trace + feedback: **1 tầng** (spec repo) — read-only trên specs/code |
114
+
115
+ > **QC = Tester (một vai trò QA):** cùng một người chạy pipeline `/qc-*` (sinh `qc_status` chính thức) **và** `/report-bug` · `/propose-scenario`. Phân biệt thật sự là **Dev self-test (`dev_selftest`) vs QC/Tester authoritative (`qc_status`)** — không phải QC vs Tester.
116
+
117
+ Thứ tự bàn giao (mỗi mũi tên = `git push` rồi role kế tiếp `/sync`):
118
+
119
+ ```
120
+ PO ─push spec─▶ Dev /sync ─code 2 tầng─▶ QC/Tester /sync ─qc_status + bug 1 tầng (spec)─▶ PO/Dev /sync
121
+ BDD approved tech-docs + src test + report fix code / sửa PRD → /generate-bdd lại
122
+ (vòng feedback: xem Bug Flow §9)
123
+ ```
124
+
125
+ > **`qc_status` ở spec repo nhưng QC analysis docs ở umbrella root:** `qc_status` ghi vào `.trace/` (đã dồn về `{spec_source}/.trace`), còn `qc_dir` (analysis/test-cases, mặc định `docs/`) **không** auto-route — nằm ở umbrella root. Muốn artifacts QC nằm chỗ khác → set `paths.qc_dir` trong `.agent/project-context.yaml`, hoặc trỏ ra repo QC riêng.
126
+
127
+ > **Git flow `git` cụ thể cho từng role** (ví dụ end-to-end một feature, kèm `cd`/`add`/`commit`/`push` thực tế): [§4.7](#47--git-flow-cụ-thể-theo-role-ví-dụ-feature-ft-042-checkout-domain-payment).
128
+
87
129
  ### 4.1 — Clone lần đầu
88
130
 
89
131
  ```bash
@@ -126,10 +168,10 @@ git push
126
168
  ### 4.4 — Commit 2 tầng (thay đổi trong service submodule)
127
169
 
128
170
  ```bash
129
- # Tầng 1: commit trong service submodule
171
+ # Tầng 1: commit trong service submodule (CHỈ code — BDD, tech-docs, .trace đều ở spec repo)
130
172
  cd user-service
131
- git add specs/bdd/ src/
132
- git commit -m "feat(FEAT-01): add BDD and implementation"
173
+ git add src/
174
+ git commit -m "feat(FEAT-01): implementation"
133
175
  git push origin main
134
176
  cd ..
135
177
 
@@ -142,10 +184,12 @@ git push
142
184
  > ⚠️ **PHẢI push cả 2 tầng.** Push umbrella mà quên push submodule → người khác pull về bị lỗi "commit không tồn tại".
143
185
  >
144
186
  > **Tech-docs (API contract):** khi `setup.spec_source` được set, tech-design **luôn** nằm ở `{spec_source}/specs/tech-docs` (spec repo chung) — commit + push riêng trong spec submodule, FE/App đọc qua `/sync`. Per-service tech-docs chỉ dùng khi **không** có `spec_source`.
187
+ >
188
+ > **`.trace/` cũng ở spec repo:** khi `spec_source` set, `/generate-code` · `/dev-run-test` · `/qc-run-test` chạy trong service nhưng ghi trace vào `{spec_source}/.trace` → commit + push **trong spec submodule** (1 tầng, cross-repo, giống `feedback/`). Service submodule **không** còn `.trace/`.
145
189
 
146
- ### 4.5 — Lỡ tay sửa file trong spec submodule (read-only)
190
+ ### 4.5 — Lỡ tay sửa **spec** trong spec submodule (PRD/BDD/design-spec/tech-docs read-only)
147
191
 
148
- Spec submodule là **read-only** cho dev/tester. Nếu lỡ sửa → bỏ thay đổi:
192
+ PRD/BDD/design-spec/tech-docs trong spec submodule là **read-only** cho dev/tester (chỉ PO sửa). `feedback/` và `.trace/` thì dev/QC được ghi. Nếu lỡ sửa spec → bỏ thay đổi:
149
193
 
150
194
  ```bash
151
195
  cd my-project-specs
@@ -164,6 +208,123 @@ Muốn cập nhật PRD → báo PO sửa trong spec repo của họ rồi push.
164
208
  | Submodule ở `detached HEAD` | Bình thường khi dùng submodule | Không cần lo nếu không sửa file trong đó |
165
209
  | Conflict trong submodule pointer | 2 người cùng update submodule | `git checkout --theirs <sub> && git add <sub>` |
166
210
 
211
+ ### 4.7 — Git flow cụ thể theo role (ví dụ feature **FT-042 Checkout**, domain `payment`)
212
+
213
+ Topology giả định cho mọi ví dụ dưới đây:
214
+
215
+ | Repo | Vai trò | Ai sở hữu |
216
+ |------|---------|-----------|
217
+ | `my-project/` | **umbrella** — Claude Code mở ở đây, giữ pointer | team |
218
+ | `my-project-specs/` | **spec** submodule — PRD/BDD/design-spec/tech-docs + `.trace/` + `feedback/` | PO |
219
+ | `payment-be/` | **service** submodule — chỉ code BE | BE dev |
220
+ | `my-project-web/` | **service** submodule — chỉ code FE | FE dev |
221
+
222
+ > **Quy tắc 1 dòng:** chỉ **code** mới push **2 tầng** (service → umbrella pointer). Mọi thứ khác — PRD/BDD/tech-docs/`.trace/`/`feedback/` ở spec repo, và QC artifacts ở umbrella — đều **1 tầng**.
223
+
224
+ **① PO — 1 tầng (spec repo)**
225
+ ```bash
226
+ cd my-project-specs && git pull
227
+ # /generate-prd · /generate-design-spec · /generate-bdd (web/app/system) · set @trace.status: approved
228
+ git add specs/prd/payment/FT-042-checkout.md \
229
+ specs/design-spec/payment/FT-042-checkout-design.md \
230
+ specs/bdd/payment/system/FT-042-UC1-checkout-system.feature \
231
+ specs/bdd/payment/web/FT-042-UC1-checkout-web.feature \
232
+ specs/bdd/payment/app/FT-042-UC1-checkout-app.feature
233
+ git commit -m "feat(payment): FT-042 checkout — PRD + design-spec + BDD (web/app/system)"
234
+ git push origin main # → báo Dev team chạy /sync
235
+ ```
236
+
237
+ **② BE Dev — code 2 tầng · tech-docs + trace 1 tầng (cross-repo)**
238
+ ```bash
239
+ cd my-project && /sync # umbrella root: pull spec + services + Living Docs
240
+
241
+ # (a) tech-docs (API contract) → SPEC repo [1 tầng]
242
+ # /generate-tech-docs payment/system/FT-042-UC1 ghi vào my-project-specs/specs/tech-docs/payment/
243
+ cd my-project-specs
244
+ git add specs/tech-docs/payment/FT-042-UC1-tech-design.md
245
+ git commit -m "docs(payment): FT-042 UC1 BE API contract"
246
+ git push origin main
247
+ cd ..
248
+
249
+ # (b) code → SERVICE repo [Tầng 1]
250
+ # /generate-code payment/system/FT-042-UC1 ghi vào payment-be/src/
251
+ cd payment-be
252
+ git checkout -b feat/FT-042-checkout
253
+ git add src/
254
+ git commit -m "feat(payment): FT-042 UC1 checkout endpoint + service"
255
+ git push origin feat/FT-042-checkout # → mở MR trong payment-be
256
+ cd ..
257
+
258
+ # (c) dev_selftest → SPEC repo .trace [1 tầng, cross-repo]
259
+ # /dev-run-test ghi my-project-specs/.trace/FT-042.tsv
260
+ cd my-project-specs
261
+ git add .trace/FT-042.tsv
262
+ git commit -m "chore(trace): FT-042 dev_selftest=pass"
263
+ git push origin main
264
+ cd ..
265
+
266
+ # (d) sau khi MR payment-be merge → bump umbrella pointer [Tầng 2]
267
+ cd payment-be && git checkout main && git pull && cd ..
268
+ git add payment-be
269
+ git commit -m "chore: bump payment-be → FT-042 checkout"
270
+ git push origin main
271
+ ```
272
+
273
+ **③ FE/Web Dev — 2 phase; push giống BE (code 2 tầng · tech-docs + trace 1 tầng)**
274
+ ```bash
275
+ cd my-project && /sync
276
+
277
+ # Phase 1 — UI + mock (chưa cần BE deploy)
278
+ # /generate-code payment/web/FT-042-UC1 --phase=ui → code trong my-project-web
279
+ cd my-project-web
280
+ git checkout -b feat/FT-042-checkout-ui
281
+ git add src/
282
+ git commit -m "feat(payment): FT-042 checkout UI + mock adapter"
283
+ git push origin feat/FT-042-checkout-ui
284
+ cd ..
285
+
286
+ # Phase 2 — khi BE System BDD + contract approved:
287
+ # (a) FE tech-design (§2b test-ids + §4 API map) → SPEC repo [1 tầng]
288
+ cd my-project-specs
289
+ git add specs/tech-docs/payment/FT-042-UC1-tech-design-web.md
290
+ git commit -m "docs(payment): FT-042 UC1 FE web tech-design (§2b test-ids + §4 API)"
291
+ git push origin main
292
+ cd ..
293
+ # (b) /generate-code payment/web/FT-042-UC1 --phase=integration → wire API thật [Tầng 1]
294
+ cd my-project-web
295
+ git add src/
296
+ git commit -m "feat(payment): FT-042 wire real checkout API"
297
+ git push origin feat/FT-042-checkout-ui
298
+ cd ..
299
+ # (c) dev_selftest → spec .trace + (d) bump umbrella pointer sau merge — giống BE bước (c)(d)
300
+ ```
301
+
302
+ **④ QC / Tester (một vai trò QA) — artifacts 1 tầng (umbrella) · qc_status + bug/proposal 1 tầng (spec repo)**
303
+
304
+ > QC và Tester là **cùng một người**: vừa chạy pipeline `/qc-*` (sinh `qc_status` chính thức) vừa `/report-bug` · `/propose-scenario`. Read-only trên specs + code.
305
+
306
+ ```bash
307
+ cd my-project && /sync # đọc specs read-only
308
+ # /qc-analyze · /qc-plan · /qc-design-test · /qc-review · /qc-run-test · /qc-report
309
+
310
+ # (a) artifacts phân tích/test-case → {qc_dir}/{UC-ID}/ (qc_dir mặc định = docs/) → commit UMBRELLA [1 tầng]
311
+ git add docs/FT-042/ # REQUIREMENT_ANALYSIS.md · TEST_PLAN.md · test-cases/*.Test.md
312
+ git commit -m "qc(payment): FT-042 analysis + test design"
313
+ git push origin main
314
+
315
+ # (b) qc_status → SPEC .trace + bug/proposal/change-request → SPEC feedback/ [1 tầng, cross-repo]
316
+ cd my-project-specs
317
+ git add .trace/FT-042.tsv
318
+ git add feedback/bugs/FT-042-UC1-SC3-bug.md # /report-bug khi qc_status=fail
319
+ # hoặc: feedback/bdd-proposals/FT-042-new-scenario.md # /propose-scenario (edge case ngoài BDD)
320
+ # hoặc: feedback/prd-change-requests/FT-042-change.md # đề xuất sửa PRD
321
+ git commit -m "qc(payment): FT-042 qc_status=fail (SC3) + bug report"
322
+ git push origin main # → PO/Dev /sync thấy '📥 New tester feedback' → /fix-bug · promote
323
+ cd ..
324
+ ```
325
+
326
+ > **Tóm tắt số tầng push:** chỉ **code = 2 tầng** (service → umbrella pointer); PRD/BDD/tech-docs/`.trace`/`feedback` (spec repo) = **1 tầng**; QC artifacts `qc_dir` (umbrella) = **1 tầng**. Lỡ tay sửa spec read-only → §4.5.
327
+
167
328
  ---
168
329
 
169
330
  ## 5. Living Docs sync
@@ -174,12 +335,12 @@ Living Docs panel hiển thị trạng thái trace của toàn bộ feature. Ref
174
335
  /validate-traces
175
336
  ```
176
337
 
177
- - Đọc TSVs từ **tất cả** service submodule (`.trace/*.tsv` authoritative — commit mỗi service).
338
+ - Đọc TSVs từ **một nơi duy nhất** `{spec_source}/.trace/*.tsv` (authoritative — commit trong spec repo; mỗi scenario mang `@trace.service` để biết service nào). KHÔNG còn quét/merge từng service.
178
339
  - Cập nhật cột `dev_selftest` (pass/fail/not_run) + `dev_selftest_at`.
179
- - Ghi canonical `trace-report.json` + bản TSV mirror → `{spec_source}/.living-docs/` (gitignored).
340
+ - Ghi `trace-report.json` → `{spec_source}/.living-docs/` (generated, gitignored).
180
341
  - Mirror thêm về `./.trace` của workspace hiện tại → panel không rỗng kể cả khi đứng trong 1 service submodule đơn lẻ.
181
342
 
182
- > **Report nằm ở đâu:** canonical `trace-report.json` + TSV mirror ở **spec module** tại `{spec_source}/.living-docs/` (gitignored, regenerate bởi `/sync` hoặc `/validate-traces`). Authoritative per-service `.trace/*.tsv` vẫn commit trong mỗi service.
343
+ > **Report nằm ở đâu:** authoritative `.trace/*.tsv` ở **spec module** `{spec_source}/.trace/` (committed — một chỗ cho PM). Report `trace-report.json` ở `{spec_source}/.living-docs/` + panel mirror `./.trace` đều **generated, gitignored** — regenerate bởi `/sync` hoặc `/validate-traces`.
183
344
  >
184
345
  > **.gitignore:** thêm `.trace/` trong repo hiện tại **và** `.living-docs/` trong spec module — đều là mirror read-only, không commit.
185
346
 
@@ -209,7 +370,7 @@ git pull
209
370
  /review-context --fix {prd-file} # auto-fix vấn đề nhỏ
210
371
  # → update @trace.status: approved khi PRD sẵn sàng
211
372
  /generate-design-spec {prd-file} # FE/App
212
- /generate-bdd {prd-file} # web / app / system (lần lượt)
373
+ /generate-bdd {prd-file} # outside-in: web app system (System BDD tổng hợp từ web+app)
213
374
 
214
375
  git add specs/
215
376
  git commit -m "feat({domain}): add {TICKET-ID} PRD, design spec, and BDD"
@@ -228,16 +389,17 @@ git add my-project-specs && git commit -m "chore: sync specs" && git push
228
389
  # Đọc Web BDD do PO generate (KHÔNG tự generate BDD):
229
390
  # my-project-specs/specs/bdd/{domain}/web/{TICKET-ID}-UC*.feature
230
391
 
231
- /generate-tech-docs {domain}/{TICKET-ID}-UC1
232
- /review-tech-docs {domain}/{TICKET-ID}-UC1
233
-
234
- # ── BE chưa sẵn sàng ──
235
- /generate-code {domain}/{TICKET-ID}-UC1 --phase=ui # UI + mock adapter (tester test ngay)
392
+ # ── BE chưa deploy API → làm UI trước ──
393
+ /generate-code {domain}/web/{TICKET-ID}-UC1 --phase=ui # UI + mock (shape: BE contract nếu có, else System BDD + warn)
236
394
  /dev-gen-test {domain}/{TICKET-ID}-UC1
237
395
  /review-code {files-changed}
238
- /dev-run-test # dev self-check (dev_selftest)
396
+ /dev-run-test # dev self-check (dev_selftest)
397
+
398
+ # ── Khi BE đã có System BDD + tech-docs (API contract) approved ──
399
+ /generate-tech-docs {domain}/web/{TICKET-ID}-UC1 # FE client design — GATED: cần System BDD + BE contract
400
+ /review-tech-docs {domain}/{TICKET-ID}-UC1-web # SA/Lead review (bump revision)
239
401
  # → sau khi sign-off gate approved:
240
- /generate-code {domain}/{TICKET-ID}-UC1 --phase=integration # wire API thật
402
+ /generate-code {domain}/web/{TICKET-ID}-UC1 --phase=integration # wire API thật theo §4 FE tech-design
241
403
 
242
404
  # ── API đã có sẵn ──
243
405
  /generate-code {domain}/{TICKET-ID}-UC1 # không cần --phase
@@ -245,7 +407,7 @@ git add my-project-specs && git commit -m "chore: sync specs" && git push
245
407
  /review-code {files-changed}
246
408
  /dev-run-test
247
409
 
248
- # Commit 2 tầng (xem §4.4)
410
+ # Commit 2 tầng (code) + 1 tầng (tech-docs/trace) — git flow cụ thể: §4.7 ②③
249
411
  ```
250
412
 
251
413
  ### BE Dev — Nhận task mới
@@ -265,12 +427,12 @@ cd my-project-be
265
427
  /review-code {files-changed} # AI lặp lỗi → accept "Record as lesson?"
266
428
  /dev-run-test
267
429
 
268
- # Commit 2 tầng vào đúng service submodule theo domain (xem §4.4)
430
+ # Commit 2 tầng vào service submodule theo domain + tech-docs/trace 1 tầng — git flow cụ thể: §4.7 ②
269
431
  ```
270
432
 
271
- ### QC — Chạy native QC pipeline (tóm tắt)
433
+ ### QC / Tester — Chạy native QC pipeline (tóm tắt)
272
434
 
273
- Điều kiện: BDD đã `approved`. Module `qc-playwright` (Python + pytest-playwright + Page Object).
435
+ QC và Tester là **một vai trò QA** (xem [Tester guide](../02-guides/tester/README.md)) — cùng người chạy pipeline `/qc-*` **và** `/report-bug` · `/propose-scenario`. Điều kiện: BDD đã `approved`. Module `qc-playwright` (Python + pytest-playwright + Page Object).
274
436
 
275
437
  ```bash
276
438
  cd my-project-web
@@ -279,7 +441,7 @@ cd my-project-web
279
441
  /validate-traces # refresh dashboard → qc_status hiện trên Living Docs
280
442
  ```
281
443
 
282
- > `/qc-run-test` ghi `qc_status` + `qc_run_at` vào trace TSV. Chi tiết từng layer: [Guide · QC Automation](../02-guides/qc-automation.md).
444
+ > `/qc-run-test` ghi `qc_status` + `qc_run_at` vào trace TSV. Chi tiết từng layer: [chương QC Automation](../02-guides/tester/qc-automation.md). Git flow cụ thể (artifacts umbrella + qc_status/bug/proposal → spec): §4.7 ④ (QC/Tester là một role).
283
445
 
284
446
  ---
285
447
 
@@ -309,7 +471,7 @@ A: Không. Chỉ cài ở umbrella repo. Service submodule là git repo thườn
309
471
  A: Luôn ở **umbrella repo** — có config và thấy được cả spec submodule lẫn service submodule.
310
472
 
311
473
  **Q: Generate BDD ra file ở đâu?**
312
- A: Phụ thuộc `@trace.domain` trong PRD. Context-loader tra `services.{domain}.specs_dir`. Vd `@trace.domain: user` `user-service/specs/bdd/user/`.
474
+ A: Khi `spec_source` (umbrella) **spec repo**: `{spec_source}/specs/bdd/{domain}/…` (tất cả BDD web/app/system đều ở đây, cross-team). Trace `.tsv` **cũng** ở spec repo (`{spec_source}/.trace`) — một chỗ cho PM. Service submodule chỉ chứa code. Chỉ khi KHÔNG có `spec_source` thì BDD + trace mới per-service.
313
475
 
314
476
  **Q: Quên push service submodule, chỉ push umbrella, người khác báo lỗi?**
315
477
  A: `cd <service> && git push origin main` — xong, người khác pull lại hết lỗi.
@@ -12,6 +12,7 @@ Dùng mục này khi bạn đã biết mình muốn làm gì và chỉ cần tra
12
12
 
13
13
  | Trang | Nội dung |
14
14
  |-------|----------|
15
+ | [Command Cheat-Sheet](command-cheatsheet.md) | **Bắt đầu ở đây nếu bối rối:** bản đồ 1 trang — luồng end-to-end (ai chạy gì), chọn lệnh review nào, vòng review→Board→resume, giải mã flag `--fix`/`--resume`. |
15
16
  | [Command Reference](commands.md) | Bảng đầy đủ MỌI slash command — gom theo phase, kèm input/output/when. Cộng phần Command Internals (step architecture). |
16
17
  | [Trace TSV Schema](trace-schema.md) | Header chuẩn của `.trace/{UC-ID}.tsv`, ý nghĩa từng cột (gồm `dev_selftest`, `qc_status`…), các `@trace.*` tag, và JSON report. |
17
18
  | [Stack Modules](modules.md) | 15 module dưới `modules/`, cách gom theo `platform_type` (backend / web-frontend / mobile), và module QC `qc-playwright`. |
@@ -20,6 +21,8 @@ Dùng mục này khi bạn đã biết mình muốn làm gì và chỉ cần tra
20
21
 
21
22
  ## Điều hướng nhanh
22
23
 
24
+ - **"Tôi nên chạy lệnh nào / theo thứ tự nào?"** → [Command Cheat-Sheet](command-cheatsheet.md)
25
+ - **"Review PRD/BDD/tech/code dùng lệnh nào? `--fix` vs `--resume`?"** → [Command Cheat-Sheet](command-cheatsheet.md)
23
26
  - **"Lệnh này nhận gì, sinh ra gì?"** → [Command Reference](commands.md)
24
27
  - **"Cột `qc_status` vs `dev_selftest` khác nhau thế nào?"** → [Trace TSV Schema](trace-schema.md)
25
28
  - **"Stack của tôi map sang module nào?"** → [Stack Modules](modules.md)
@@ -0,0 +1,147 @@
1
+ [📚 Docs](../README.md) › [Reference](README.md) › Command Cheat-Sheet
2
+
3
+ # Command Cheat-Sheet — luồng & chọn lệnh
4
+
5
+ > Bối rối không biết **chạy lệnh nào, theo thứ tự nào, ai chạy**? Trang này là bản đồ 1 trang. Chi tiết Input/Output từng lệnh: [Command Reference](commands.md).
6
+
7
+ - [Luồng end-to-end (ai chạy gì)](#luồng-end-to-end-ai-chạy-gì)
8
+ - [Tôi muốn REVIEW thứ này → dùng lệnh nào?](#tôi-muốn-review-thứ-này--dùng-lệnh-nào)
9
+ - [Vòng review chuẩn: 3 bước (review → Board → resume)](#vòng-review-chuẩn-3-bước-review--board--resume)
10
+ - [Giải mã flag: mặc định vs --fix vs --resume](#giải-mã-flag-mặc-định-vs---fix-vs---resume)
11
+ - [QC pipeline — 6 bước tuần tự](#qc-pipeline--6-bước-tuần-tự)
12
+ - [dev-* vs qc-* — đừng nhầm](#dev--vs-qc---đừng-nhầm)
13
+
14
+ ---
15
+
16
+ ## Luồng end-to-end (ai chạy gì)
17
+
18
+ Mỗi mũi tên = "xong cái trước mới sang cái sau". Nhãn dưới mỗi lệnh là **vai trò** chạy nó.
19
+
20
+ ```mermaid
21
+ flowchart LR
22
+ A["/define-product<br/><b>PO</b>"] --> B["/generate-prd<br/><b>PO</b>"]
23
+ B --> C["/refine-prd<br/><b>PO</b> + Board"]
24
+ C --> D["/review-context (PRD)<br/><b>PO</b> · cổng chất lượng"]
25
+ D --> E["/generate-design-spec<br/><b>PO</b> (chỉ FE/App)"]
26
+ E --> F["/generate-bdd<br/><b>PO</b> · web→app→system"]
27
+ F --> G["/review-context (BDD)<br/><b>SA/Dev</b>"]
28
+ G --> H["/generate-tech-docs<br/><b>Dev</b> · BE trước, FE sau"]
29
+ H --> I["/review-tech-docs<br/><b>Dev</b> + Board"]
30
+ I --> J["/generate-code<br/><b>Dev</b>"]
31
+ J --> K["/review-code<br/><b>Dev</b> · 4 lens"]
32
+ K --> L["/dev-gen-test → /dev-run-test<br/><b>Dev</b> · self-check"]
33
+ L --> M["/qc-* (6 bước)<br/><b>QC/Tester</b>"]
34
+ M --> N["/validate-traces<br/><b>Tech Lead</b>"]
35
+ ```
36
+
37
+ > **BE bỏ qua Design Spec** (bước E) — đọc PRD trực tiếp rồi `/generate-bdd`. **Full-stack/không tách mock** → `/generate-code` một lần (bỏ qua FE 2-phase). Cross-cutting (`/sync`, `/fix-bug`, `/debug`, `/learn`, `/report-bug`, `/propose-scenario`) chạy bất cứ lúc nào, không nằm trong chuỗi này.
38
+
39
+ <details>
40
+ <summary>Bản text (ASCII fallback)</summary>
41
+
42
+ ```
43
+ PO ───────────────────────────────────────────────────────────────────────────
44
+ /define-product → /generate-prd → /refine-prd → /review-context(PRD)
45
+ → /generate-design-spec (FE/App)
46
+ → /generate-bdd (web→app→system)
47
+ SA/Dev ────────────────────────────────────────────────────────────────────────
48
+ /review-context(BDD) → /generate-tech-docs → /review-tech-docs
49
+ → /generate-code → /review-code → /dev-gen-test → /dev-run-test
50
+ QC/Tester ──────────────────────────────────────────────────────────────────────
51
+ /qc-analyze → /qc-plan → /qc-design-test → /qc-review → /qc-run-test → /qc-report
52
+ Tech Lead ──────────────────────────────────────────────────────────────────────
53
+ /validate-traces
54
+ ```
55
+ </details>
56
+
57
+ ---
58
+
59
+ ## Tôi muốn REVIEW thứ này → dùng lệnh nào?
60
+
61
+ Có **4 lệnh review** cho **4 loại artifact khác nhau**. Đây là điểm hay nhầm nhất:
62
+
63
+ | Tôi muốn review… | Cách dùng (ví dụ) | Nó kiểm cái gì | Ai chạy |
64
+ |---|---|---|---|
65
+ | **PRD — nội dung & độ đầy đủ** | `/refine-prd specs/prd/auth/FEAT-01-login.md` | 4 lens QA·DEV·SA·PO: AC có test được? edge case? scope rõ? | PO |
66
+ | **PRD — chất lượng trước khi approve** | `/review-context specs/prd/auth/FEAT-01-login.md` | P-checks: banned term, mơ hồ, mâu thuẫn PRD khác, thiếu section, routing `@trace.domain` | PO |
67
+ | **BDD `.feature`** | `/review-context specs/bdd/auth/system/FEAT-01-UC1-login.feature` | B-checks: mỗi AC/BR → có ≥1 scenario? Gherkin R1–R10, compliance C1–C5 | SA/Dev |
68
+ | **Tech design** | `/review-tech-docs tech-docs/auth/FEAT-01-UC1-tech-design.md` | T-checks: đúng layer/architecture, entity, trace BDD, cross-team API sign-off | Dev/SA |
69
+ | **Code** | `/review-code FEAT-01-UC1` | 4 lens: Security · Performance · Architecture · Test coverage | Dev |
70
+
71
+ > **Vì sao PRD có 2 lệnh review?** `/refine-prd` làm **trước** (cải thiện nội dung, fan-out 4 lens). `/review-context` làm **sau** như **cổng chất lượng cuối** trước khi approve + sang BDD. Thứ tự: `generate-prd → refine-prd → review-context → approve`.
72
+ >
73
+ > **Vì sao `/review-context` dùng cho cả PRD lẫn BDD?** Nó tự nhận loại theo file: `.md` trong `prd/` → PRD mode (P-checks); `.feature` → BDD mode (B-checks). Cùng một "cổng chất lượng", hai bộ tiêu chí.
74
+
75
+ ---
76
+
77
+ ## Vòng review chuẩn: 3 bước (review → Board → resume)
78
+
79
+ Mọi lệnh review (`/refine-prd`, `/review-context`, `/review-tech-docs`) đều chạy **cùng một vòng 3 bước**. Lệnh review **không sửa file** — nó chỉ ghi ra findings; bạn duyệt ở Review Board; rồi `--resume` mới áp dụng.
80
+
81
+ ```
82
+ ① /refine-prd {file} ② Mở Review Board (extension) ③ /… --resume {file}
83
+ ─────────────────────────── ────────────────────────────── ──────────────────────────
84
+ PHÂN TÍCH (read-only) → DUYỆT từng finding: → ÁP DỤNG cái đã accept
85
+ ghi .agent/review/ ✓Accept ✎Modify ⏸Defer ✗Reject + bump version + changelog
86
+ {slug}-findings.yaml 💬 Giải thích (nếu khó hiểu)
87
+ ```
88
+
89
+ - **① không đụng vào file gốc.** An toàn chạy bất cứ lúc nào.
90
+ - **② Review Board** = panel của extension *Spec Driven Dev*. Right-click file `*-findings.yaml` → Open Review Board, hoặc bấm thông báo khi findings vừa tạo. Finding khó hiểu → bấm **💬 Giải thích** (no-tech + đề xuất phương án, chờ confirm).
91
+ - **③ `--resume`** đọc các finding `accepted`/`modified` và áp vào file gốc, rồi bump version. Nút **⚡ Apply** trên Board tự chạy đúng lệnh `--resume` này cho bạn.
92
+
93
+ ---
94
+
95
+ ## Giải mã flag: mặc định vs --fix vs --resume
96
+
97
+ Cùng một lệnh `/review-context` (và họ review nói chung) có **3 chế độ**. Đây là khác biệt:
98
+
99
+ | Chế độ | Lệnh | Làm gì | Khi nào |
100
+ |---|---|---|---|
101
+ | **Phân tích** (mặc định, không flag) | `/review-context {file}` | Chỉ phân tích → ghi findings. **Không sửa file.** | Bước ① mọi vòng review |
102
+ | **`--fix`** | `/review-context --fix {file}` | Phân tích **rồi tự áp ngay** các finding `auto_fixable` (banned term, metadata, coverage matrix…). Bỏ qua Board. | Dev muốn dọn nhanh lỗi máy-sửa-được, không cần người quyết |
103
+ | **`--resume`** | `/review-context --resume {file}` | **Không phân tích lại.** Đọc findings file, áp các finding **người đã accept** ở Board. | Bước ③ sau khi duyệt ở Board |
104
+
105
+ > **Nhớ nhanh:** `--fix` = "máy tự sửa cái an toàn **ngay**" · `--resume` = "áp cái **tôi đã duyệt**". Không flag = "chỉ xem, đừng động vào file".
106
+
107
+ ---
108
+
109
+ ## QC pipeline — 6 bước tuần tự
110
+
111
+ QC là **chuỗi 6 lệnh chạy theo thứ tự** sau khi BDD đã approved. Output bước trước là input bước sau:
112
+
113
+ ```
114
+ /qc-analyze → /qc-plan → /qc-design-test → /qc-review → /qc-run-test → /qc-report
115
+ scope test test-case duyệt chạy + report
116
+ + gaps plan chi tiết TC/script qc_status HTML
117
+ ```
118
+
119
+ | # | Lệnh | Ra cái gì |
120
+ |---|---|---|
121
+ | 1 | `/qc-analyze` | `REQUIREMENT_ANALYSIS.md` + `DOC_GAPS.md` |
122
+ | 2 | `/qc-plan` | `TEST_PLAN.md` (scope, layer, ưu tiên) |
123
+ | 3 | `/qc-design-test` | `test-cases/*.Test.md` |
124
+ | 4 | `/qc-review` | Verdict APPROVED / NEEDS_FIX (inline) |
125
+ | 5 | `/qc-run-test` | Script Python + ghi `qc_status` vào trace TSV |
126
+ | 6 | `/qc-report` | `report.html` (Playwright trace + pytest-html) |
127
+
128
+ > Chi tiết: [chương QC Automation](../02-guides/tester/qc-automation.md). Stack `qc-playwright`, độc lập với module code của dev.
129
+
130
+ ---
131
+
132
+ ## dev-* vs qc-* — đừng nhầm
133
+
134
+ Hai luồng test **tách biệt**, ghi **hai cột khác nhau** trong trace TSV:
135
+
136
+ | | `/dev-*` (dev self-check) | `/qc-*` (QC chính thức) |
137
+ |---|---|---|
138
+ | Ai chạy | **Dev** — tự kiểm code mình | **QC/Tester** |
139
+ | Lệnh | `/dev-gen-test` · `/dev-run-test` · `/dev-smoke-test` | `/qc-analyze` … `/qc-report` (6 bước) |
140
+ | Ghi signal | `dev_selftest` (pass/fail/not_run) | `qc_status` (pass/fail/skip/not_run) |
141
+ | Là coverage chính thức? | **KHÔNG** — chỉ tín hiệu "dev đã smoke" | **CÓ** — coverage authoritative |
142
+
143
+ > Cả hai hiển thị **cạnh nhau** trong Living Docs. `dev_selftest: pass` **không** thay thế QC. Xem [Traceability](../03-concepts/traceability.md#hai-tín-hiệu-test-dev_selftest-vs-qc_status).
144
+
145
+ ---
146
+
147
+ *Xem thêm:* [Command Reference (chi tiết)](commands.md) · [Concepts › Pipeline](../03-concepts/pipeline.md) · [Developer › Workflow](../02-guides/developer/workflow.md)