@educa-corp/sdd-framework 0.4.2 → 0.6.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 (149) hide show
  1. package/bin/build.js +113 -19
  2. package/bin/gate-trace.js +464 -0
  3. package/bin/index.js +418 -146
  4. package/bin/lint-trace.js +602 -0
  5. package/bin/self-check.js +499 -6
  6. package/bin/trace-schema.json +1449 -692
  7. package/commands/debug.md +123 -510
  8. package/commands/debug.tmpl +3 -0
  9. package/commands/define-product.md +86 -509
  10. package/commands/dev-gen-test.md +120 -516
  11. package/commands/dev-run-test.md +120 -516
  12. package/commands/dev-smoke-test.md +86 -509
  13. package/commands/extend-prd.md +486 -0
  14. package/commands/extend-prd.tmpl +273 -0
  15. package/commands/fix-bug.md +152 -515
  16. package/commands/generate-architecture.md +94 -514
  17. package/commands/generate-architecture.tmpl +3 -0
  18. package/commands/generate-bdd.md +138 -519
  19. package/commands/generate-bdd.tmpl +18 -3
  20. package/commands/generate-code.md +156 -523
  21. package/commands/generate-code.tmpl +36 -7
  22. package/commands/generate-design-spec.md +86 -509
  23. package/commands/generate-prd.md +114 -509
  24. package/commands/generate-prd.tmpl +28 -0
  25. package/commands/generate-spec-manifest.md +86 -509
  26. package/commands/generate-tech-docs.md +86 -509
  27. package/commands/learn.md +172 -495
  28. package/commands/learn.tmpl +70 -3
  29. package/commands/map-testids.md +86 -509
  30. package/commands/propose-scenario.md +136 -508
  31. package/commands/propose-scenario.tmpl +52 -1
  32. package/commands/qc-analyze.md +86 -509
  33. package/commands/qc-design-test.md +87 -509
  34. package/commands/qc-design-test.tmpl +1 -0
  35. package/commands/qc-plan.md +86 -509
  36. package/commands/qc-report.md +86 -509
  37. package/commands/qc-review.md +86 -509
  38. package/commands/qc-run-test.md +133 -517
  39. package/commands/qc-run-test.tmpl +13 -1
  40. package/commands/refine-prd.md +99 -519
  41. package/commands/refine-prd.tmpl +3 -0
  42. package/commands/report-bug.md +86 -509
  43. package/commands/review-code.md +127 -513
  44. package/commands/review-code.tmpl +7 -3
  45. package/commands/review-context.md +96 -515
  46. package/commands/review-context.tmpl +6 -2
  47. package/commands/review-tech-docs.md +90 -510
  48. package/commands/review-tech-docs.tmpl +3 -0
  49. package/commands/setup-ai-first.md +166 -137
  50. package/commands/setup-ai-first.tmpl +72 -0
  51. package/commands/sync.md +86 -118
  52. package/commands/sync.tmpl +84 -16
  53. package/commands/update-framework.md +16 -102
  54. package/commands/update-framework.tmpl +14 -0
  55. package/commands/validate-traces.md +458 -531
  56. package/commands/validate-traces.tmpl +381 -31
  57. package/core/FRAMEWORK_VERSION +1 -1
  58. package/core/README.md +20 -0
  59. package/core/commands/debug.md +123 -510
  60. package/core/commands/define-product.md +86 -509
  61. package/core/commands/dev-gen-test.md +120 -516
  62. package/core/commands/dev-run-test.md +120 -516
  63. package/core/commands/dev-smoke-test.md +86 -509
  64. package/core/commands/extend-prd.md +486 -0
  65. package/core/commands/fix-bug.md +152 -515
  66. package/core/commands/generate-architecture.md +94 -514
  67. package/core/commands/generate-bdd.md +138 -519
  68. package/core/commands/generate-code.md +156 -523
  69. package/core/commands/generate-design-spec.md +86 -509
  70. package/core/commands/generate-prd.md +114 -509
  71. package/core/commands/generate-spec-manifest.md +86 -509
  72. package/core/commands/generate-tech-docs.md +86 -509
  73. package/core/commands/learn.md +172 -495
  74. package/core/commands/map-testids.md +86 -509
  75. package/core/commands/propose-scenario.md +136 -508
  76. package/core/commands/qc-analyze.md +86 -509
  77. package/core/commands/qc-design-test.md +87 -509
  78. package/core/commands/qc-plan.md +86 -509
  79. package/core/commands/qc-report.md +86 -509
  80. package/core/commands/qc-review.md +86 -509
  81. package/core/commands/qc-run-test.md +133 -517
  82. package/core/commands/refine-prd.md +99 -519
  83. package/core/commands/report-bug.md +86 -509
  84. package/core/commands/review-code.md +127 -513
  85. package/core/commands/review-context.md +96 -515
  86. package/core/commands/review-tech-docs.md +90 -510
  87. package/core/commands/setup-ai-first.md +166 -137
  88. package/core/commands/sync.md +86 -118
  89. package/core/commands/update-framework.md +16 -102
  90. package/core/commands/validate-traces.md +458 -531
  91. package/core/hooks/data-guard.js +174 -83
  92. package/core/hooks/settings.json +2 -1
  93. package/core/rules/workflow.md +48 -4
  94. package/core/steps/capture-lesson.md +34 -1
  95. package/core/steps/context-loader.md +24 -3
  96. package/core/steps/gate.md +92 -35
  97. package/core/steps/report-footer.md +26 -2
  98. package/core/steps/trace-mirror.md +34 -7
  99. package/core/templates/README.md +24 -1
  100. package/core/templates/ci/trace-gate.yml +146 -0
  101. package/core/templates/feature.template +1 -1
  102. package/core/templates/hooks/pre-push +61 -0
  103. package/docs/01-getting-started/installation.md +18 -1
  104. package/docs/01-getting-started/what-is-sdd.md +4 -2
  105. package/docs/02-concepts/architecture.md +48 -5
  106. package/docs/02-concepts/pipeline-steps/02-specification.md +39 -3
  107. package/docs/02-concepts/pipeline-steps/04-bdd.md +24 -2
  108. package/docs/02-concepts/pipeline-steps/05-tech-docs.md +18 -1
  109. package/docs/02-concepts/pipeline-steps/06-code.md +35 -4
  110. package/docs/02-concepts/pipeline-steps/09-validate-traces.md +137 -12
  111. package/docs/02-concepts/pipeline-steps/10-feedback-loop.md +59 -3
  112. package/docs/02-concepts/roles-and-hitl.md +1 -1
  113. package/docs/02-concepts/traceability.md +183 -117
  114. package/docs/03-guides/architect.md +63 -0
  115. package/docs/03-guides/developer.md +20 -4
  116. package/docs/03-guides/product-owner.md +72 -68
  117. package/docs/03-guides/tester-qa.md +81 -70
  118. package/docs/04-reference/commands.md +134 -105
  119. package/docs/04-reference/configuration.md +146 -94
  120. package/docs/04-reference/model-selection.md +32 -19
  121. package/docs/04-reference/trace-schema.md +26 -9
  122. package/docs/explain/02-generate-prd.md +80 -78
  123. package/docs/explain/02b-extend-prd.md +125 -0
  124. package/docs/explain/03-refine-prd.md +86 -86
  125. package/docs/explain/04-review-context.md +18 -1
  126. package/docs/explain/06-generate-bdd.md +23 -0
  127. package/docs/explain/08-review-tech-docs.md +20 -5
  128. package/docs/explain/10-review-code.md +36 -2
  129. package/docs/explain/19-qc-run-test.md +87 -67
  130. package/docs/explain/21-validate-traces.md +75 -68
  131. package/docs/explain/23-fix-bug.md +19 -3
  132. package/docs/explain/26-propose-scenario.md +70 -63
  133. package/docs/explain/27-learn.md +5 -3
  134. package/docs/explain/README.md +135 -134
  135. package/hooks/data-guard.js +174 -83
  136. package/hooks/settings.json +2 -1
  137. package/package.json +53 -50
  138. package/rules/workflow.md +48 -4
  139. package/steps/capture-lesson.md +34 -1
  140. package/steps/context-loader.md +24 -3
  141. package/steps/gate.md +92 -35
  142. package/steps/report-footer.md +26 -2
  143. package/steps/trace-mirror.md +34 -7
  144. package/templates/README.md +24 -1
  145. package/templates/ci/trace-gate.yml +146 -0
  146. package/templates/feature.template +1 -1
  147. package/templates/hooks/pre-push +61 -0
  148. package/scripts/init.sh +0 -49
  149. package/scripts/upgrade.sh +0 -94
package/commands/sync.md CHANGED
@@ -259,17 +259,81 @@ Với mỗi entry trong danh sách đó:
259
259
 
260
260
  ---
261
261
 
262
- ## Step 4 — Check `.gitignore`
262
+ ## Step 4 — Check luật git cho sổ trace
263
263
 
264
- Kiểm tra các Living Docs mirror được sinh ra gitignore không:
265
- - `.trace/` trong `.gitignore` của repo hiện tại (hoặc `.git/info/exclude`)
266
- - `.living-docs/` trong `.gitignore` của **specs module** (khi `setup.spec_source` được set)
264
+ *Step 4a/4b kiểm **có được commit hay không** (hai chiều ngược nhau — nhầm chiều là mất dữ liệu).
265
+ Step 4c kiểm **merge thế nào khi hai người cùng ghi**. Cả hai đều là đường mất sổ, và 4c không
266
+ cần ai làm sai cả chỉ cần hai người làm việc cùng lúc.*
267
267
 
268
- Nếu thiếu cái nào:
268
+ *Đọc bảng trước:*
269
+
270
+ | Đường dẫn | Vai trò | Kỳ vọng |
271
+ |---|---|---|
272
+ | `{paths.trace_dir}` (`.trace/` hoặc `{spec_source}/.trace/`) | **AUTHORITATIVE** — TSV + `trace-history.jsonl`, không regenerate được | **PHẢI commit** — gitignore nó là **lỗi nghiêm trọng** |
273
+ | `.trace-mirror/` | bản sao tiện cho panel VS Code | phải gitignore |
274
+ | `.living-docs/` | report sinh ra | phải gitignore |
275
+
276
+ **4a. Cảnh báo mềm — mirror chưa gitignore.**
277
+ Kiểm `.trace-mirror/` trong `.gitignore` của repo hiện tại (hoặc `.git/info/exclude`), và `.living-docs/` trong `.gitignore` của **specs module** (khi `setup.spec_source` được set). Thiếu cái nào:
278
+ ```
279
+ ⚠️ Mirror chưa gitignore — chúng được sinh ra, đừng bao giờ commit:
280
+ echo ".trace-mirror/" >> .gitignore
281
+ echo ".living-docs/" >> {spec_source}/.gitignore # specs module (nếu có spec_source)
282
+ ```
283
+
284
+ **4b. 🔴 Báo động — sổ gốc ĐANG bị bỏ qua.**
285
+ Phân giải `{paths.trace_dir}`; nếu nó nằm trong một git repo, chạy `git -C {repo} check-ignore -q {trace_dir}`. **Trúng** (exit 0) → in ngay, mức chặn:
286
+ ```
287
+ 🔴 NGUY HIỂM — sổ gốc trace ĐANG bị git bỏ qua: {paths.trace_dir}
288
+ Toàn bộ trạng thái theo dõi (spec_ver · gen_ver · implemented_by · test_count ·
289
+ dev_selftest · qc_status) VÀ trace-history.jsonl KHÔNG được lưu vào git.
290
+ Người khác clone repo về sẽ không thấy gì, và lịch sử thì KHÔNG dựng lại được.
291
+
292
+ Sửa:
293
+ 1. Gỡ dòng khớp `.trace` khỏi .gitignore của {repo}
294
+ 2. git -C {repo} add -f {trace_dir} && git -C {repo} commit -m "restore trace state"
295
+ Nguyên nhân thường gặp: bản trước v0.4.3 gọi panel mirror là `.trace` (trùng tên sổ gốc),
296
+ nên gợi ý "gitignore .trace/" của chính lệnh này có thể đã nhắm trúng sổ gốc.
269
297
  ```
270
- ⚠️ Living Docs mirrors not gitignoredthey are generated, never commit them:
271
- echo ".trace/" >> .gitignore
272
- echo ".living-docs/" >> {spec_source}/.gitignore # specs module (if spec_source set)
298
+ > **Vì sao cần báo động này:** trước v0.4.3, mirror và sổ gốc **cùng tên `.trace`**. Khi dev mở thẳng spec repo làm workspace thì hai path bằng nhau Step 4 (bản cũ) gợi ý gitignore theo **tên**, không theo vai trò. Làm theo là mất sổ gốc, **im lặng**: máy vẫn chạy, dashboard vẫn có số; chỉ người thứ hai clone về mới phát hiện. Bản v0.4.3 đổi tên mirror thành `.trace-mirror` để cái bẫy biến mất, nhưng **dự án đã dính từ trước thì vẫn dính** — 4b là để tìm ra chúng.
299
+
300
+ **4c. Luật merge cho sổ trace.**
301
+
302
+ Sổ trace **phải commit** (4b) và **được nhiều người ghi trên nhiều nhánh song song**. Git cần biết
303
+ merge nó thế nào — mặc định thì không biết, và mặc định là đường mất row.
304
+
305
+ Kiểm `{paths.trace_dir}/.gitattributes` có tồn tại và có đủ hai dòng dưới. **Thiếu → tạo/bổ sung
306
+ ngay** (đây là hành động ghi duy nhất của Step 4; nó chỉ thêm file luật, không đụng dữ liệu):
307
+
308
+ ```gitattributes
309
+ # Sổ trace — dữ liệu KHÔNG regenerate được. Hai luật, hai lý do khác nhau:
310
+ #
311
+ # merge=union — giữ row của CẢ HAI nhánh thay vì bắt người chọn một bên. Trùng sc_id sau
312
+ # union là ca ĐÚNG VÀ ĐƯỢC MONG ĐỢI: `--lint-trace` T4 bắt nó, rồi /validate-traces
313
+ # reconcile về một row. Mất row thì KHÔNG có gì bắt được. Đánh đổi có chủ ý — đừng "dọn".
314
+ # (union là driver built-in của git: không ai cần chạy git config gì thêm.)
315
+ #
316
+ # text eol=lf — BẮT BUỘC đi kèm union, không phải cho đẹp. Thiếu nó: một máy ghi CRLF →
317
+ # git thấy MỌI dòng đã đổi → union giữ cả hai bản → NHÂN ĐÔI CẢ FILE, gồm cả dòng header.
318
+ # Team mixed Windows/macOS gặp ca này mà không ai làm gì sai.
319
+ *.tsv text eol=lf merge=union
320
+ *.jsonl text eol=lf merge=union
321
+ ```
322
+
323
+ > **Vì sao đặt `.gitattributes` BÊN TRONG `{paths.trace_dir}` thay vì gốc repo:** `trace_dir` là
324
+ > đường dẫn **cấu hình được** (`.trace/`, `../.trace`, `{spec_source}/.trace/`), nên một luật ở gốc
325
+ > repo phải nhắc lại đúng đường dẫn đó và sẽ lệch ngay khi ai đổi config. Đặt trong thư mục thì
326
+ > pattern là `*.tsv` thuần — không phụ thuộc `trace_dir` tên gì, nằm ở đâu, và **đi theo sổ** khi
327
+ > spec repo được mount vào một umbrella khác. Git đọc `.gitattributes` ở mọi cấp thư mục.
328
+
329
+ > **KHÔNG thêm `*.json`.** `trace-report.json` có thể nằm cùng thư mục và union trên JSON tạo ra
330
+ > **JSON không hợp lệ** — panel VS Code parse lỗi. Nó là file **sinh lại được**: conflict ở đó thì
331
+ > chạy lại `/validate-traces`, đừng merge tay.
332
+
333
+ In vào report:
334
+ ```
335
+ ✅ {paths.trace_dir}/.gitattributes (merge=union + eol=lf)
336
+ (hoặc: ✅ vừa tạo — sổ trace giờ merge được khi hai người cùng ghi)
273
337
  ```
274
338
 
275
339
  ---
@@ -280,12 +344,12 @@ Nếu thiếu cái nào:
280
344
 
281
345
  **Phân giải Living Docs home (cùng quy tắc như `/validate-traces`):**
282
346
  - `living_docs_dir` = `{spec_source}/.living-docs` nếu `setup.spec_source` được set, else `.living-docs` ở umbrella root. *(Specs module được mount trong mọi service workspace, nên panel phân giải nó kể cả khi dev mở một service submodule đơn.)*
283
- - `panel_mirror` = `./.trace` ở gốc workspace hiện tại.
347
+ - `panel_mirror` = `./.trace-mirror` ở gốc workspace hiện tại. *(Cố ý KHÁC tên `.trace` — xem Step 4.)*
284
348
 
285
349
  1. Với mỗi service trong danh sách **đã làm phẳng** ở Step 3 (gồm cả các submodule nằm dưới `by_prd_slug` — bỏ sót chúng là mất trace của các repo chia theo feature): nếu `{service.path}/.trace/` có file `.tsv` → copy chúng vào `{living_docs_dir}/{service-name}/` (tạo dir nếu cần).
286
350
  2. Ghi merged `{living_docs_dir}/trace-report.json`:
287
351
  - Tổng hợp TSV `.trace/` của mỗi service, thêm field `"service"` **và `"platform"`** (suy từ tên file `{UC-ID}-{platform}.tsv`) cho mỗi row, tính lại summary totals. **Không dedupe theo `sc_id` giữa các platform** — `web·SC1` và `system·SC1` là 2 row khác nhau; nhờ field `platform` dashboard hiển thị tách bạch coverage từng platform.
288
- 3. **Mirror tới panel location:** copy `{living_docs_dir}/trace-report.json` (+ TSV namespaced) → `{panel_mirror}/` để panel trong repo đang mở không rỗng. Skip nếu `panel_mirror` đã bằng `living_docs_dir`.
352
+ 3. **Mirror tới panel location:** copy `{living_docs_dir}/trace-report.json` (+ TSV namespaced) → `{panel_mirror}/` để panel trong repo đang mở không rỗng. Skip nếu `panel_mirror` đã bằng `living_docs_dir`, hoặc nếu `{paths.trace_dir}` đã nằm trong workspace hiện tại (panel đọc thẳng ở đó). **KHÔNG** copy `trace-history.jsonl` — nó là dữ liệu tích luỹ, không phải thứ sinh lại được.
289
353
 
290
354
  In kết quả sync:
291
355
  ```
@@ -312,108 +376,8 @@ Nếu `spec-manifest.yaml` tồn tại HOẶC `setup.spec_source` được cấu
312
376
 
313
377
  ## Output
314
378
 
315
- # Report Footer Định dạng output chuẩn cho mọi lệnh
316
-
317
- Mọi report của lệnh phải kết thúc bằng section footer chuẩn này.
318
-
319
- ## Status Badge
320
-
321
- Chọn một theo kết quả:
322
- - `✅ Complete` — mọi bước thành công, không có vấn đề
323
- - `❌ Failed` — lệnh không hoàn thành được do lỗi chặn
324
- - `⚠️ Warnings` — hoàn thành nhưng có vấn đề không chặn, nên review lại
325
-
326
- ## Output Artifacts
327
-
328
- Liệt kê mọi file được tạo hoặc sửa bởi lệnh này:
329
- ```
330
- Output Artifacts:
331
- {created|updated} {file-path} ({mô tả ngắn})
332
- {created|updated} {file-path} ({mô tả ngắn})
333
- ```
334
-
335
- Nếu không ghi file nào (vd: lệnh review hoặc phân tích) → ghi `Output Artifacts: none (read-only)`.
336
-
337
- ## Pipeline Position
338
-
339
- In một sơ đồ pipeline một dòng, đánh dấu phase của lệnh HIỆN TẠI bằng `◀ bạn ở đây`,
340
- để người dùng luôn thấy lệnh này nằm ở đâu trong luồng end-to-end:
341
-
342
- ```
343
- Discovery → PRD → [Design Spec] → BDD → Tech Design → Code → Dev Self-Check → QC → Trace Audit
344
- ```
345
-
346
- Tìm lệnh hiện tại trong bảng phase dưới đây và đánh dấu **phase của nó** trong sơ đồ trên:
347
-
348
- | Phase | Commands |
349
- |-------|----------|
350
- | Discovery | `/define-product` |
351
- | PRD | `/generate-prd` · `/refine-prd` · `/review-context` (PRD) |
352
- | Design Spec | `/generate-design-spec` |
353
- | BDD | `/generate-bdd` · `/review-context` (BDD) |
354
- | Tech Design | `/generate-tech-docs` · `/map-testids` · `/review-tech-docs` |
355
- | Code | `/generate-code` · `/review-code` |
356
- | Dev Self-Check | `/dev-gen-test` · `/dev-run-test` · `/dev-smoke-test` |
357
- | QC | `/qc-analyze` · `/qc-plan` · `/qc-design-test` · `/qc-review` · `/qc-run-test` · `/qc-report` |
358
- | Trace Audit | `/validate-traces` |
359
-
360
- Với **lệnh review**, thêm vòng review 3 bước và đánh dấu bước hiện tại, vd:
361
- `Vòng review: [① phân tích ◀] → ② Review Board → ③ --resume`.
362
-
363
- **Lệnh xuyên suốt** (`/sync`, `/update-framework`, `/fix-bug`, `/debug`, `/learn`,
364
- `/report-bug`, `/propose-scenario`, `/generate-spec-manifest`) nằm ngoài pipeline tuyến tính —
365
- **bỏ hẳn dòng Pipeline** cho các lệnh này (đừng cố nhét chúng vào sơ đồ).
366
-
367
- ## Gợi ý lệnh tiếp theo
368
-
369
- Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
370
-
371
- | Lệnh hiện tại | Gợi ý lệnh tiếp theo |
372
- |-------------------------|-----------------------------------------------|
373
- | /setup-ai-first | `/define-product` để bắt đầu feature đầu tiên |
374
- | /define-product | `/generate-prd {product-definition-file}` |
375
- | /generate-prd | `/refine-prd {prd-file}` rồi `/review-context {prd-file}` |
376
- | /refine-prd | Mở Review Board → cập nhật PRD → `/review-context {prd-file}` |
377
- | /review-context (PRD) | Khi 0 critical → PO đặt `Status: approved`, rồi FE/App: `/generate-design-spec {prd-file}` (→ design sign-off → BDD); BE: `/generate-bdd {prd-file}`. Còn critical/NEEDS_FIX → sửa PRD (giữ draft) |
378
- | /generate-design-spec | Designer review → xác nhận link Figma → PO + Designer sign-off → `/generate-bdd {prd-file}` |
379
- | /generate-bdd | `/review-context {feature-file}` để kiểm tra độ phủ |
380
- | /review-context (BDD) | `/generate-tech-docs {UC-ID}` nếu APPROVED; sinh lại nếu NEEDS_FIX |
381
- | /qc-analyze | `/qc-plan {UC-ID}` (xử lý các gap blocker 🔴 trước) |
382
- | /qc-plan | `/qc-design-test {UC-ID}` |
383
- | /qc-design-test | `/qc-review {UC-ID}` (review test-case) |
384
- | /qc-review (test-case) | `/qc-run-test {UC-ID}` nếu APPROVED; sửa TC nếu NEEDS_FIX |
385
- | /qc-run-test | `/qc-report {UC-ID}` rồi `/qc-review {UC-ID}` (review script) |
386
- | /qc-review (script) | `/qc-report {UC-ID}` rồi tạo PR nếu APPROVED |
387
- | /qc-report | `/validate-traces {UC-ID}` để làm mới Living Docs (qc_status) |
388
- | /map-testids | `/qc-design-test {UC-ID}` (QC dựng Page Object từ contract §4.5.6 vừa ghi) |
389
- | /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
390
- | /review-tech-docs | `/generate-code {feature-file}` nếu APPROVED; sửa doc nếu NEEDS_FIX |
391
- | /generate-code | Lần gen đầu → `/review-code {UC-ID}`; gen lại → `/dev-gen-test {UC-ID}` |
392
- | /dev-gen-test | `/dev-run-test {UC-ID}` |
393
- | /dev-run-test (passing) | `/review-code {UC-ID}` |
394
- | /dev-run-test (failing) | `/fix-bug {ticket-id}` hoặc `/debug {error}` |
395
- | /review-code | `/dev-smoke-test {UC-ID}` hoặc tạo PR |
396
- | /dev-smoke-test | Tạo PR và link tới ticket |
397
- | /validate-traces | **Cờ 🔴 trước (chặn PR):** SEAM_UNWIRED → nối binding sang class thật, xoá/thay stub · STUB_UNRESOLVED → `/generate-code {owner_uc}` (lấp logic tại chỗ + xoá hàm song song) · ORPHANED/TRACE_ORPHAN → quyết định thủ công (xoá code+test, đưa scenario trở lại `.feature`, hoặc sửa `sc_id` của tag). **Rồi:** DRIFT/UNTRACKED → `/generate-code {UC-ID}` · BDD_DRIFT → `/generate-code {feature-file}` · tech-doc lỗi thời vs BDD → `/generate-tech-docs` → `/review-tech-docs` · PRD drift → `/generate-bdd {prd-file}` · GAP → `/dev-gen-test {UC-ID}`. **Chỉ tạo PR khi mọi cờ 🔴 = 0** |
398
- | /fix-bug | `/dev-run-test {UC-ID}` (dev_selftest vừa reset về not_run) → tạo PR; nếu fix một `{BUG-ID}` → QC chạy `/qc-run-test {UC-ID}` để verify + đóng bug |
399
- | /debug | `/fix-bug {ticket-id}` nếu cần sửa |
400
- | /report-bug | Gửi cho dev (`/fix-bug {BUG-ID}`); nếu thiếu coverage → `/propose-scenario {UC-ID}` |
401
- | /propose-scenario | Báo PO/Dev review proposal trong `feedback/bdd-proposals/` |
402
- | /learn | Tiếp tục làm việc — lesson áp dụng ở lệnh kế tiếp |
403
- | /sync | `/validate-traces` để xem độ phủ đầy đủ; xử lý mọi `📥 tester feedback` được nêu |
404
- | /update-framework | Review `git diff .agent/`, commit; `/sync` để đồng bộ nội dung dự án |
405
-
406
- Định dạng footer như sau:
407
- ```
408
- ---
409
- Status : {badge}
410
- {khối Output Artifacts}
411
- Pipeline : Discovery → PRD → [BDD ◀ bạn ở đây] → Tech Design → Code → Dev Self-Check → QC → Trace Audit
412
- (lệnh review) Vòng review: [① phân tích ◀] → ② Review Board → ③ --resume
413
- Next : {lệnh gợi ý kèm ví dụ tham số}
414
- ```
415
- *(Bỏ dòng `Pipeline` cho các lệnh xuyên suốt liệt kê ở trên.)*
416
-
379
+ **Đọc `.agent/steps/report-footer.md`** áp đúng khuôn footer trong đó (Status Badge ·
380
+ Output Artifacts · Next) cho report cuối, kèm khối bên dưới.
417
381
 
418
382
  ```
419
383
  /sync — {Setup | Update}
@@ -444,19 +408,23 @@ Service Configs
444
408
  ⚠️ payment-service — .agent/project-context.yaml missing
445
409
  → create it so /dev-run-test works correctly
446
410
 
447
- .gitignore
448
- ✅ .trace/ is gitignored
449
- (or: ⚠️ Add .trace/ to .gitignore)
411
+ Luật git cho sổ trace
412
+ ✅ .trace-mirror/ + .living-docs/ gitignored (mirror — sinh lại được)
413
+ {paths.trace_dir}/ KHÔNG bị gitignore (sổ gốc — phải commit)
414
+ ✅ {paths.trace_dir}/.gitattributes (merge=union + eol=lf — hai người ghi song song)
415
+ (hoặc: ⚠️ Thêm .trace-mirror/ vào .gitignore)
416
+ (hoặc: 🔴 NGUY HIỂM — sổ gốc {paths.trace_dir} đang bị gitignore, xem Step 4b)
417
+ (hoặc: ✅ vừa tạo .gitattributes — trước đó merge song song sẽ conflict và mất row)
450
418
 
451
419
  Living Docs
452
- .trace/ synced — {N} TSVs across {S} services
453
- (run /validate-traces for full coverage report)
420
+ {panel_mirror}/ synced — {N} TSVs across {S} services
421
+ (chạy /validate-traces để report coverage đầy đủ)
454
422
 
455
423
  Spec Manifest
456
424
  ✅ spec-manifest.yaml — {N} features indexed
457
425
 
458
426
  ---
459
427
  Status : ✅ Complete | ⚠️ Warnings
460
- Output Artifacts: updated .trace/ (umbrella mirror), spec-manifest.yaml
428
+ Output Artifacts: updated .trace-mirror/ (panel mirror), spec-manifest.yaml
461
429
  Next : /validate-traces (full coverage check) | /generate-code {UC-ID} (start coding)
462
430
  ```
@@ -259,17 +259,81 @@ Với mỗi entry trong danh sách đó:
259
259
 
260
260
  ---
261
261
 
262
- ## Step 4 — Check `.gitignore`
262
+ ## Step 4 — Check luật git cho sổ trace
263
263
 
264
- Kiểm tra các Living Docs mirror được sinh ra gitignore không:
265
- - `.trace/` trong `.gitignore` của repo hiện tại (hoặc `.git/info/exclude`)
266
- - `.living-docs/` trong `.gitignore` của **specs module** (khi `setup.spec_source` được set)
264
+ *Step 4a/4b kiểm **có được commit hay không** (hai chiều ngược nhau — nhầm chiều là mất dữ liệu).
265
+ Step 4c kiểm **merge thế nào khi hai người cùng ghi**. Cả hai đều là đường mất sổ, và 4c không
266
+ cần ai làm sai cả chỉ cần hai người làm việc cùng lúc.*
267
267
 
268
- Nếu thiếu cái nào:
268
+ *Đọc bảng trước:*
269
+
270
+ | Đường dẫn | Vai trò | Kỳ vọng |
271
+ |---|---|---|
272
+ | `{paths.trace_dir}` (`.trace/` hoặc `{spec_source}/.trace/`) | **AUTHORITATIVE** — TSV + `trace-history.jsonl`, không regenerate được | **PHẢI commit** — gitignore nó là **lỗi nghiêm trọng** |
273
+ | `.trace-mirror/` | bản sao tiện cho panel VS Code | phải gitignore |
274
+ | `.living-docs/` | report sinh ra | phải gitignore |
275
+
276
+ **4a. Cảnh báo mềm — mirror chưa gitignore.**
277
+ Kiểm `.trace-mirror/` trong `.gitignore` của repo hiện tại (hoặc `.git/info/exclude`), và `.living-docs/` trong `.gitignore` của **specs module** (khi `setup.spec_source` được set). Thiếu cái nào:
278
+ ```
279
+ ⚠️ Mirror chưa gitignore — chúng được sinh ra, đừng bao giờ commit:
280
+ echo ".trace-mirror/" >> .gitignore
281
+ echo ".living-docs/" >> {spec_source}/.gitignore # specs module (nếu có spec_source)
282
+ ```
283
+
284
+ **4b. 🔴 Báo động — sổ gốc ĐANG bị bỏ qua.**
285
+ Phân giải `{paths.trace_dir}`; nếu nó nằm trong một git repo, chạy `git -C {repo} check-ignore -q {trace_dir}`. **Trúng** (exit 0) → in ngay, mức chặn:
286
+ ```
287
+ 🔴 NGUY HIỂM — sổ gốc trace ĐANG bị git bỏ qua: {paths.trace_dir}
288
+ Toàn bộ trạng thái theo dõi (spec_ver · gen_ver · implemented_by · test_count ·
289
+ dev_selftest · qc_status) VÀ trace-history.jsonl KHÔNG được lưu vào git.
290
+ Người khác clone repo về sẽ không thấy gì, và lịch sử thì KHÔNG dựng lại được.
291
+
292
+ Sửa:
293
+ 1. Gỡ dòng khớp `.trace` khỏi .gitignore của {repo}
294
+ 2. git -C {repo} add -f {trace_dir} && git -C {repo} commit -m "restore trace state"
295
+ Nguyên nhân thường gặp: bản trước v0.4.3 gọi panel mirror là `.trace` (trùng tên sổ gốc),
296
+ nên gợi ý "gitignore .trace/" của chính lệnh này có thể đã nhắm trúng sổ gốc.
297
+ ```
298
+ > **Vì sao cần báo động này:** trước v0.4.3, mirror và sổ gốc **cùng tên `.trace`**. Khi dev mở thẳng spec repo làm workspace thì hai path bằng nhau — và Step 4 (bản cũ) gợi ý gitignore theo **tên**, không theo vai trò. Làm theo là mất sổ gốc, **im lặng**: máy vẫn chạy, dashboard vẫn có số; chỉ người thứ hai clone về mới phát hiện. Bản v0.4.3 đổi tên mirror thành `.trace-mirror` để cái bẫy biến mất, nhưng **dự án đã dính từ trước thì vẫn dính** — 4b là để tìm ra chúng.
299
+
300
+ **4c. Luật merge cho sổ trace.**
301
+
302
+ Sổ trace **phải commit** (4b) và **được nhiều người ghi trên nhiều nhánh song song**. Git cần biết
303
+ merge nó thế nào — mặc định thì không biết, và mặc định là đường mất row.
304
+
305
+ Kiểm `{paths.trace_dir}/.gitattributes` có tồn tại và có đủ hai dòng dưới. **Thiếu → tạo/bổ sung
306
+ ngay** (đây là hành động ghi duy nhất của Step 4; nó chỉ thêm file luật, không đụng dữ liệu):
307
+
308
+ ```gitattributes
309
+ # Sổ trace — dữ liệu KHÔNG regenerate được. Hai luật, hai lý do khác nhau:
310
+ #
311
+ # merge=union — giữ row của CẢ HAI nhánh thay vì bắt người chọn một bên. Trùng sc_id sau
312
+ # union là ca ĐÚNG VÀ ĐƯỢC MONG ĐỢI: `--lint-trace` T4 bắt nó, rồi /validate-traces
313
+ # reconcile về một row. Mất row thì KHÔNG có gì bắt được. Đánh đổi có chủ ý — đừng "dọn".
314
+ # (union là driver built-in của git: không ai cần chạy git config gì thêm.)
315
+ #
316
+ # text eol=lf — BẮT BUỘC đi kèm union, không phải cho đẹp. Thiếu nó: một máy ghi CRLF →
317
+ # git thấy MỌI dòng đã đổi → union giữ cả hai bản → NHÂN ĐÔI CẢ FILE, gồm cả dòng header.
318
+ # Team mixed Windows/macOS gặp ca này mà không ai làm gì sai.
319
+ *.tsv text eol=lf merge=union
320
+ *.jsonl text eol=lf merge=union
321
+ ```
322
+
323
+ > **Vì sao đặt `.gitattributes` BÊN TRONG `{paths.trace_dir}` thay vì gốc repo:** `trace_dir` là
324
+ > đường dẫn **cấu hình được** (`.trace/`, `../.trace`, `{spec_source}/.trace/`), nên một luật ở gốc
325
+ > repo phải nhắc lại đúng đường dẫn đó và sẽ lệch ngay khi ai đổi config. Đặt trong thư mục thì
326
+ > pattern là `*.tsv` thuần — không phụ thuộc `trace_dir` tên gì, nằm ở đâu, và **đi theo sổ** khi
327
+ > spec repo được mount vào một umbrella khác. Git đọc `.gitattributes` ở mọi cấp thư mục.
328
+
329
+ > **KHÔNG thêm `*.json`.** `trace-report.json` có thể nằm cùng thư mục và union trên JSON tạo ra
330
+ > **JSON không hợp lệ** — panel VS Code parse lỗi. Nó là file **sinh lại được**: conflict ở đó thì
331
+ > chạy lại `/validate-traces`, đừng merge tay.
332
+
333
+ In vào report:
269
334
  ```
270
- ⚠️ Living Docs mirrors not gitignored — they are generated, never commit them:
271
- echo ".trace/" >> .gitignore
272
- echo ".living-docs/" >> {spec_source}/.gitignore # specs module (if spec_source set)
335
+ {paths.trace_dir}/.gitattributes (merge=union + eol=lf)
336
+ (hoặc: ✅ vừa tạo — sổ trace giờ merge được khi hai người cùng ghi)
273
337
  ```
274
338
 
275
339
  ---
@@ -280,12 +344,12 @@ Nếu thiếu cái nào:
280
344
 
281
345
  **Phân giải Living Docs home (cùng quy tắc như `/validate-traces`):**
282
346
  - `living_docs_dir` = `{spec_source}/.living-docs` nếu `setup.spec_source` được set, else `.living-docs` ở umbrella root. *(Specs module được mount trong mọi service workspace, nên panel phân giải nó kể cả khi dev mở một service submodule đơn.)*
283
- - `panel_mirror` = `./.trace` ở gốc workspace hiện tại.
347
+ - `panel_mirror` = `./.trace-mirror` ở gốc workspace hiện tại. *(Cố ý KHÁC tên `.trace` — xem Step 4.)*
284
348
 
285
349
  1. Với mỗi service trong danh sách **đã làm phẳng** ở Step 3 (gồm cả các submodule nằm dưới `by_prd_slug` — bỏ sót chúng là mất trace của các repo chia theo feature): nếu `{service.path}/.trace/` có file `.tsv` → copy chúng vào `{living_docs_dir}/{service-name}/` (tạo dir nếu cần).
286
350
  2. Ghi merged `{living_docs_dir}/trace-report.json`:
287
351
  - Tổng hợp TSV `.trace/` của mỗi service, thêm field `"service"` **và `"platform"`** (suy từ tên file `{UC-ID}-{platform}.tsv`) cho mỗi row, tính lại summary totals. **Không dedupe theo `sc_id` giữa các platform** — `web·SC1` và `system·SC1` là 2 row khác nhau; nhờ field `platform` dashboard hiển thị tách bạch coverage từng platform.
288
- 3. **Mirror tới panel location:** copy `{living_docs_dir}/trace-report.json` (+ TSV namespaced) → `{panel_mirror}/` để panel trong repo đang mở không rỗng. Skip nếu `panel_mirror` đã bằng `living_docs_dir`.
352
+ 3. **Mirror tới panel location:** copy `{living_docs_dir}/trace-report.json` (+ TSV namespaced) → `{panel_mirror}/` để panel trong repo đang mở không rỗng. Skip nếu `panel_mirror` đã bằng `living_docs_dir`, hoặc nếu `{paths.trace_dir}` đã nằm trong workspace hiện tại (panel đọc thẳng ở đó). **KHÔNG** copy `trace-history.jsonl` — nó là dữ liệu tích luỹ, không phải thứ sinh lại được.
289
353
 
290
354
  In kết quả sync:
291
355
  ```
@@ -343,19 +407,23 @@ Service Configs
343
407
  ⚠️ payment-service — .agent/project-context.yaml missing
344
408
  → create it so /dev-run-test works correctly
345
409
 
346
- .gitignore
347
- ✅ .trace/ is gitignored
348
- (or: ⚠️ Add .trace/ to .gitignore)
410
+ Luật git cho sổ trace
411
+ ✅ .trace-mirror/ + .living-docs/ gitignored (mirror — sinh lại được)
412
+ {paths.trace_dir}/ KHÔNG bị gitignore (sổ gốc — phải commit)
413
+ ✅ {paths.trace_dir}/.gitattributes (merge=union + eol=lf — hai người ghi song song)
414
+ (hoặc: ⚠️ Thêm .trace-mirror/ vào .gitignore)
415
+ (hoặc: 🔴 NGUY HIỂM — sổ gốc {paths.trace_dir} đang bị gitignore, xem Step 4b)
416
+ (hoặc: ✅ vừa tạo .gitattributes — trước đó merge song song sẽ conflict và mất row)
349
417
 
350
418
  Living Docs
351
- .trace/ synced — {N} TSVs across {S} services
352
- (run /validate-traces for full coverage report)
419
+ {panel_mirror}/ synced — {N} TSVs across {S} services
420
+ (chạy /validate-traces để report coverage đầy đủ)
353
421
 
354
422
  Spec Manifest
355
423
  ✅ spec-manifest.yaml — {N} features indexed
356
424
 
357
425
  ---
358
426
  Status : ✅ Complete | ⚠️ Warnings
359
- Output Artifacts: updated .trace/ (umbrella mirror), spec-manifest.yaml
427
+ Output Artifacts: updated .trace-mirror/ (panel mirror), spec-manifest.yaml
360
428
  Next : /validate-traces (full coverage check) | /generate-code {UC-ID} (start coding)
361
429
  ```
@@ -119,6 +119,20 @@ Tóm tắt cho người dùng:
119
119
  - **Updated commands** — file có nội dung thay đổi
120
120
  - **Removed commands** — file bị xoá trong version mới
121
121
 
122
+ > **Từ v0.5.1, "Removed" là trạng thái CÓ THẬT.** Trước đó `installCore` chỉ copy, không có
123
+ > nhánh xoá nào — nên lệnh bị bỏ ở version mới nằm lại trong `.agent/commands/` và
124
+ > `.claude/commands/` **vĩnh viễn**: vẫn hiện trong menu `/`, vẫn chạy được, vẫn mang logic
125
+ > của version cũ, kể cả khi framework đã bỏ nó *vì nó sai*. Step này từng hứa báo cáo một
126
+ > trạng thái mà installer không thể tạo ra (GAPS-v3 G44).
127
+ > Giờ installer tự in ra ngay sau bước cài — đọc các dòng đó, chúng chính xác hơn `git diff`:
128
+ > ```
129
+ > 🗑️ {n} file framework đã bị BỎ ở version này — đã gỡ khỏi .agent/
130
+ > 🗑️ {n} shortcut của lệnh đã bị bỏ — đã gỡ khỏi .claude/commands/
131
+ > ⚠️ {n} file framework đã bị bỏ NHƯNG bạn đã sửa — GIỮ LẠI
132
+ > ```
133
+ > **Chỉ file còn nguyên bản mới bị gỡ.** File bạn đã sửa luôn được giữ + backup — thà để lại
134
+ > một file lạc còn hơn xoá thứ ai đó đã bỏ công viết.
135
+
122
136
  Nếu có command mới xuất hiện (vd một slash command mới), nêu rõ để user biết nó giờ đã có.
123
137
 
124
138
  **Kiểm file bị ghi đè.** `--init` copy `core/` → `.agent/` **vô điều kiện** — mọi thứ project đã sửa trong `.agent/` (trừ `project-context.yaml`) bị ghi đè. Từ v0.4.2 lệnh cài tự cứu chúng. Kiểm:
@@ -162,108 +176,8 @@ Sau migrate, nhắc chạy `/validate-traces` để reconcile sổ trace với b
162
176
 
163
177
  ## Output
164
178
 
165
- # Report Footer Định dạng output chuẩn cho mọi lệnh
166
-
167
- Mọi report của lệnh phải kết thúc bằng section footer chuẩn này.
168
-
169
- ## Status Badge
170
-
171
- Chọn một theo kết quả:
172
- - `✅ Complete` — mọi bước thành công, không có vấn đề
173
- - `❌ Failed` — lệnh không hoàn thành được do lỗi chặn
174
- - `⚠️ Warnings` — hoàn thành nhưng có vấn đề không chặn, nên review lại
175
-
176
- ## Output Artifacts
177
-
178
- Liệt kê mọi file được tạo hoặc sửa bởi lệnh này:
179
- ```
180
- Output Artifacts:
181
- {created|updated} {file-path} ({mô tả ngắn})
182
- {created|updated} {file-path} ({mô tả ngắn})
183
- ```
184
-
185
- Nếu không ghi file nào (vd: lệnh review hoặc phân tích) → ghi `Output Artifacts: none (read-only)`.
186
-
187
- ## Pipeline Position
188
-
189
- In một sơ đồ pipeline một dòng, đánh dấu phase của lệnh HIỆN TẠI bằng `◀ bạn ở đây`,
190
- để người dùng luôn thấy lệnh này nằm ở đâu trong luồng end-to-end:
191
-
192
- ```
193
- Discovery → PRD → [Design Spec] → BDD → Tech Design → Code → Dev Self-Check → QC → Trace Audit
194
- ```
195
-
196
- Tìm lệnh hiện tại trong bảng phase dưới đây và đánh dấu **phase của nó** trong sơ đồ trên:
197
-
198
- | Phase | Commands |
199
- |-------|----------|
200
- | Discovery | `/define-product` |
201
- | PRD | `/generate-prd` · `/refine-prd` · `/review-context` (PRD) |
202
- | Design Spec | `/generate-design-spec` |
203
- | BDD | `/generate-bdd` · `/review-context` (BDD) |
204
- | Tech Design | `/generate-tech-docs` · `/map-testids` · `/review-tech-docs` |
205
- | Code | `/generate-code` · `/review-code` |
206
- | Dev Self-Check | `/dev-gen-test` · `/dev-run-test` · `/dev-smoke-test` |
207
- | QC | `/qc-analyze` · `/qc-plan` · `/qc-design-test` · `/qc-review` · `/qc-run-test` · `/qc-report` |
208
- | Trace Audit | `/validate-traces` |
209
-
210
- Với **lệnh review**, thêm vòng review 3 bước và đánh dấu bước hiện tại, vd:
211
- `Vòng review: [① phân tích ◀] → ② Review Board → ③ --resume`.
212
-
213
- **Lệnh xuyên suốt** (`/sync`, `/update-framework`, `/fix-bug`, `/debug`, `/learn`,
214
- `/report-bug`, `/propose-scenario`, `/generate-spec-manifest`) nằm ngoài pipeline tuyến tính —
215
- **bỏ hẳn dòng Pipeline** cho các lệnh này (đừng cố nhét chúng vào sơ đồ).
216
-
217
- ## Gợi ý lệnh tiếp theo
218
-
219
- Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
220
-
221
- | Lệnh hiện tại | Gợi ý lệnh tiếp theo |
222
- |-------------------------|-----------------------------------------------|
223
- | /setup-ai-first | `/define-product` để bắt đầu feature đầu tiên |
224
- | /define-product | `/generate-prd {product-definition-file}` |
225
- | /generate-prd | `/refine-prd {prd-file}` rồi `/review-context {prd-file}` |
226
- | /refine-prd | Mở Review Board → cập nhật PRD → `/review-context {prd-file}` |
227
- | /review-context (PRD) | Khi 0 critical → PO đặt `Status: approved`, rồi FE/App: `/generate-design-spec {prd-file}` (→ design sign-off → BDD); BE: `/generate-bdd {prd-file}`. Còn critical/NEEDS_FIX → sửa PRD (giữ draft) |
228
- | /generate-design-spec | Designer review → xác nhận link Figma → PO + Designer sign-off → `/generate-bdd {prd-file}` |
229
- | /generate-bdd | `/review-context {feature-file}` để kiểm tra độ phủ |
230
- | /review-context (BDD) | `/generate-tech-docs {UC-ID}` nếu APPROVED; sinh lại nếu NEEDS_FIX |
231
- | /qc-analyze | `/qc-plan {UC-ID}` (xử lý các gap blocker 🔴 trước) |
232
- | /qc-plan | `/qc-design-test {UC-ID}` |
233
- | /qc-design-test | `/qc-review {UC-ID}` (review test-case) |
234
- | /qc-review (test-case) | `/qc-run-test {UC-ID}` nếu APPROVED; sửa TC nếu NEEDS_FIX |
235
- | /qc-run-test | `/qc-report {UC-ID}` rồi `/qc-review {UC-ID}` (review script) |
236
- | /qc-review (script) | `/qc-report {UC-ID}` rồi tạo PR nếu APPROVED |
237
- | /qc-report | `/validate-traces {UC-ID}` để làm mới Living Docs (qc_status) |
238
- | /map-testids | `/qc-design-test {UC-ID}` (QC dựng Page Object từ contract §4.5.6 vừa ghi) |
239
- | /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
240
- | /review-tech-docs | `/generate-code {feature-file}` nếu APPROVED; sửa doc nếu NEEDS_FIX |
241
- | /generate-code | Lần gen đầu → `/review-code {UC-ID}`; gen lại → `/dev-gen-test {UC-ID}` |
242
- | /dev-gen-test | `/dev-run-test {UC-ID}` |
243
- | /dev-run-test (passing) | `/review-code {UC-ID}` |
244
- | /dev-run-test (failing) | `/fix-bug {ticket-id}` hoặc `/debug {error}` |
245
- | /review-code | `/dev-smoke-test {UC-ID}` hoặc tạo PR |
246
- | /dev-smoke-test | Tạo PR và link tới ticket |
247
- | /validate-traces | **Cờ 🔴 trước (chặn PR):** SEAM_UNWIRED → nối binding sang class thật, xoá/thay stub · STUB_UNRESOLVED → `/generate-code {owner_uc}` (lấp logic tại chỗ + xoá hàm song song) · ORPHANED/TRACE_ORPHAN → quyết định thủ công (xoá code+test, đưa scenario trở lại `.feature`, hoặc sửa `sc_id` của tag). **Rồi:** DRIFT/UNTRACKED → `/generate-code {UC-ID}` · BDD_DRIFT → `/generate-code {feature-file}` · tech-doc lỗi thời vs BDD → `/generate-tech-docs` → `/review-tech-docs` · PRD drift → `/generate-bdd {prd-file}` · GAP → `/dev-gen-test {UC-ID}`. **Chỉ tạo PR khi mọi cờ 🔴 = 0** |
248
- | /fix-bug | `/dev-run-test {UC-ID}` (dev_selftest vừa reset về not_run) → tạo PR; nếu fix một `{BUG-ID}` → QC chạy `/qc-run-test {UC-ID}` để verify + đóng bug |
249
- | /debug | `/fix-bug {ticket-id}` nếu cần sửa |
250
- | /report-bug | Gửi cho dev (`/fix-bug {BUG-ID}`); nếu thiếu coverage → `/propose-scenario {UC-ID}` |
251
- | /propose-scenario | Báo PO/Dev review proposal trong `feedback/bdd-proposals/` |
252
- | /learn | Tiếp tục làm việc — lesson áp dụng ở lệnh kế tiếp |
253
- | /sync | `/validate-traces` để xem độ phủ đầy đủ; xử lý mọi `📥 tester feedback` được nêu |
254
- | /update-framework | Review `git diff .agent/`, commit; `/sync` để đồng bộ nội dung dự án |
255
-
256
- Định dạng footer như sau:
257
- ```
258
- ---
259
- Status : {badge}
260
- {khối Output Artifacts}
261
- Pipeline : Discovery → PRD → [BDD ◀ bạn ở đây] → Tech Design → Code → Dev Self-Check → QC → Trace Audit
262
- (lệnh review) Vòng review: [① phân tích ◀] → ② Review Board → ③ --resume
263
- Next : {lệnh gợi ý kèm ví dụ tham số}
264
- ```
265
- *(Bỏ dòng `Pipeline` cho các lệnh xuyên suốt liệt kê ở trên.)*
266
-
179
+ **Đọc `.agent/steps/report-footer.md`** áp đúng khuôn footer trong đó (Status Badge ·
180
+ Output Artifacts · Next) cho report cuối, kèm khối bên dưới.
267
181
 
268
182
  ```
269
183
  /update-framework — v{current} → v{latest}
@@ -119,6 +119,20 @@ Tóm tắt cho người dùng:
119
119
  - **Updated commands** — file có nội dung thay đổi
120
120
  - **Removed commands** — file bị xoá trong version mới
121
121
 
122
+ > **Từ v0.5.1, "Removed" là trạng thái CÓ THẬT.** Trước đó `installCore` chỉ copy, không có
123
+ > nhánh xoá nào — nên lệnh bị bỏ ở version mới nằm lại trong `.agent/commands/` và
124
+ > `.claude/commands/` **vĩnh viễn**: vẫn hiện trong menu `/`, vẫn chạy được, vẫn mang logic
125
+ > của version cũ, kể cả khi framework đã bỏ nó *vì nó sai*. Step này từng hứa báo cáo một
126
+ > trạng thái mà installer không thể tạo ra (GAPS-v3 G44).
127
+ > Giờ installer tự in ra ngay sau bước cài — đọc các dòng đó, chúng chính xác hơn `git diff`:
128
+ > ```
129
+ > 🗑️ {n} file framework đã bị BỎ ở version này — đã gỡ khỏi .agent/
130
+ > 🗑️ {n} shortcut của lệnh đã bị bỏ — đã gỡ khỏi .claude/commands/
131
+ > ⚠️ {n} file framework đã bị bỏ NHƯNG bạn đã sửa — GIỮ LẠI
132
+ > ```
133
+ > **Chỉ file còn nguyên bản mới bị gỡ.** File bạn đã sửa luôn được giữ + backup — thà để lại
134
+ > một file lạc còn hơn xoá thứ ai đó đã bỏ công viết.
135
+
122
136
  Nếu có command mới xuất hiện (vd một slash command mới), nêu rõ để user biết nó giờ đã có.
123
137
 
124
138
  **Kiểm file bị ghi đè.** `--init` copy `core/` → `.agent/` **vô điều kiện** — mọi thứ project đã sửa trong `.agent/` (trừ `project-context.yaml`) bị ghi đè. Từ v0.4.2 lệnh cài tự cứu chúng. Kiểm: