@edupia-tutor/spec-driven-docs 0.14.6 → 0.14.8

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 (130) hide show
  1. package/bin/index.js +1 -1
  2. package/commands/debug.md +1 -1
  3. package/commands/define-product.md +1 -1
  4. package/commands/dev-gen-test.md +1 -1
  5. package/commands/dev-run-test.md +1 -1
  6. package/commands/dev-smoke-test.md +1 -1
  7. package/commands/fix-bug.md +1 -1
  8. package/commands/generate-bdd.md +74 -5
  9. package/commands/generate-bdd.tmpl +73 -4
  10. package/commands/generate-code.md +19 -2
  11. package/commands/generate-code.tmpl +18 -1
  12. package/commands/generate-design-spec.md +50 -6
  13. package/commands/generate-design-spec.tmpl +49 -5
  14. package/commands/generate-prd.md +9 -5
  15. package/commands/generate-prd.tmpl +1 -0
  16. package/commands/generate-spec-manifest.md +1 -1
  17. package/commands/generate-tech-docs.md +2 -1
  18. package/commands/generate-tech-docs.tmpl +1 -0
  19. package/commands/learn.md +1 -1
  20. package/commands/map-testids.md +1 -1
  21. package/commands/propose-scenario.md +7 -3
  22. package/commands/propose-scenario.tmpl +6 -2
  23. package/commands/qc-analyze.md +15 -1
  24. package/commands/qc-analyze.tmpl +14 -0
  25. package/commands/qc-design-test.md +1 -1
  26. package/commands/qc-plan.md +1 -1
  27. package/commands/qc-report.md +1 -1
  28. package/commands/qc-review.md +1 -1
  29. package/commands/qc-run-test.md +1 -1
  30. package/commands/refine-prd.md +33 -13
  31. package/commands/refine-prd.tmpl +32 -12
  32. package/commands/report-bug.md +1 -1
  33. package/commands/review-code.md +1 -1
  34. package/commands/review-context.md +49 -27
  35. package/commands/review-context.tmpl +48 -26
  36. package/commands/review-tech-docs.md +1 -1
  37. package/commands/setup-ai-first.md +10 -10
  38. package/commands/setup-ai-first.tmpl +9 -9
  39. package/commands/sync.md +1 -1
  40. package/commands/update-framework.md +1 -1
  41. package/commands/validate-traces.md +2 -1
  42. package/commands/validate-traces.tmpl +1 -0
  43. package/core/FRAMEWORK_VERSION +1 -1
  44. package/core/commands/debug.md +1 -1
  45. package/core/commands/define-product.md +1 -1
  46. package/core/commands/dev-gen-test.md +1 -1
  47. package/core/commands/dev-run-test.md +1 -1
  48. package/core/commands/dev-smoke-test.md +1 -1
  49. package/core/commands/fix-bug.md +1 -1
  50. package/core/commands/generate-bdd.md +74 -5
  51. package/core/commands/generate-code.md +19 -2
  52. package/core/commands/generate-design-spec.md +50 -6
  53. package/core/commands/generate-prd.md +9 -5
  54. package/core/commands/generate-spec-manifest.md +1 -1
  55. package/core/commands/generate-tech-docs.md +2 -1
  56. package/core/commands/learn.md +1 -1
  57. package/core/commands/map-testids.md +1 -1
  58. package/core/commands/propose-scenario.md +7 -3
  59. package/core/commands/qc-analyze.md +15 -1
  60. package/core/commands/qc-design-test.md +1 -1
  61. package/core/commands/qc-plan.md +1 -1
  62. package/core/commands/qc-report.md +1 -1
  63. package/core/commands/qc-review.md +1 -1
  64. package/core/commands/qc-run-test.md +1 -1
  65. package/core/commands/refine-prd.md +33 -13
  66. package/core/commands/report-bug.md +1 -1
  67. package/core/commands/review-code.md +1 -1
  68. package/core/commands/review-context.md +49 -27
  69. package/core/commands/review-tech-docs.md +1 -1
  70. package/core/commands/setup-ai-first.md +10 -10
  71. package/core/commands/sync.md +1 -1
  72. package/core/commands/update-framework.md +1 -1
  73. package/core/commands/validate-traces.md +2 -1
  74. package/core/skills/code/SKILL.md +7 -759
  75. package/core/skills/debug/SKILL.md +9 -859
  76. package/core/skills/design-spec/SKILL.md +3 -582
  77. package/core/skills/prd/SKILL.md +5 -464
  78. package/core/skills/setup-ai-first/SKILL.md +3 -208
  79. package/core/skills/spec/SKILL.md +7 -450
  80. package/core/skills/test/SKILL.md +10 -1290
  81. package/core/steps/report-footer.md +1 -1
  82. package/core/steps/spawn-agent.md +12 -7
  83. package/core/templates/prd.template.md +7 -4
  84. package/core/templates/project-context.yaml +2 -2
  85. package/docs/01-getting-started/core-concepts.md +3 -3
  86. package/docs/01-getting-started/quickstart.md +4 -3
  87. package/docs/02-guides/bdd-input-checklist.md +68 -0
  88. package/docs/02-guides/developer/README.md +3 -0
  89. package/docs/02-guides/developer/bdd-and-trace.md +4 -3
  90. package/docs/02-guides/developer/commands.md +3 -3
  91. package/docs/02-guides/developer/pr-checklist.md +1 -0
  92. package/docs/02-guides/developer/scenarios.md +2 -2
  93. package/docs/02-guides/developer/workflow.md +3 -3
  94. package/docs/02-guides/prd-input-checklist.md +94 -0
  95. package/docs/02-guides/product-owner/README.md +5 -3
  96. package/docs/02-guides/product-owner/commands.md +1 -1
  97. package/docs/02-guides/product-owner/handoff-checklist.md +5 -5
  98. package/docs/02-guides/product-owner/scenarios.md +19 -17
  99. package/docs/02-guides/tech-docs-input-checklist.md +82 -0
  100. package/docs/02-guides/tester/README.md +1 -1
  101. package/docs/02-guides/tester/bug-reporting.md +1 -1
  102. package/docs/02-guides/tester/qc-automation.md +1 -1
  103. package/docs/03-concepts/README.md +1 -0
  104. package/docs/03-concepts/mechanisms-explained.md +34 -0
  105. package/docs/03-concepts/pipeline.md +12 -9
  106. package/docs/03-concepts/traceability.md +7 -4
  107. package/docs/04-operations/bug-flow.md +2 -0
  108. package/docs/04-operations/sync-and-update.md +3 -3
  109. package/docs/05-reference/command-cheatsheet.md +9 -9
  110. package/docs/05-reference/commands.md +12 -10
  111. package/docs/05-reference/trace-schema.md +2 -1
  112. package/package.json +1 -1
  113. package/skills/code/SKILL.md +7 -759
  114. package/skills/code/SKILL.tmpl +7 -164
  115. package/skills/debug/SKILL.md +9 -859
  116. package/skills/debug/SKILL.tmpl +9 -252
  117. package/skills/design-spec/SKILL.md +3 -582
  118. package/skills/design-spec/SKILL.tmpl +3 -87
  119. package/skills/prd/SKILL.md +5 -464
  120. package/skills/prd/SKILL.tmpl +5 -63
  121. package/skills/setup-ai-first/SKILL.md +3 -208
  122. package/skills/setup-ai-first/SKILL.tmpl +3 -108
  123. package/skills/spec/SKILL.md +7 -450
  124. package/skills/spec/SKILL.tmpl +7 -162
  125. package/skills/test/SKILL.md +10 -1290
  126. package/skills/test/SKILL.tmpl +10 -288
  127. package/steps/report-footer.md +1 -1
  128. package/steps/spawn-agent.md +12 -7
  129. package/templates/prd.template.md +7 -4
  130. package/templates/project-context.yaml +2 -2
@@ -641,7 +641,9 @@ Convergence: {convergence_rounds} vòng critic — file findings đã đầy đ
641
641
  - **Tồn tại** + có `--full` → **FULL**: bỏ qua findings cũ.
642
642
  - **Tồn tại** + KHÔNG `--full` → so `source_version` trong findings cũ với version target hiện tại (PRD: Metadata `Version`; BDD: `@trace.bdd_version`):
643
643
  - **Bằng nhau** (target chưa đổi từ lần review trước) → DỪNG, báo: `"Target chưa đổi từ v{X} (lần review gần nhất). Không có gì để review lại — dùng --full nếu vẫn muốn quét toàn bộ."`
644
- - **Khác** → **DELTA**: `CHANGED_SCOPE` = { `uc_id`/`section` của finding đã xử (status `accepted`/`modified`/`applied_automatically`) trong findings } { UC trong target hiện tại nhưng chưa từng xuất hiện ở findings cũ }.
644
+ - **Khác** → kiểm tra `applied_to_version` trong findings (version lần `--fix`/`--resume` gần nhất của CHÍNH lệnh này đã bump target tới) để biết ai gây ra thay đổi:
645
+ - **`applied_to_version` có mặt VÀ `==` version target hiện tại** → target đổi đúng bằng phần lệnh này tự áp, không actor khác động vào → **DELTA**: `CHANGED_SCOPE` = { `uc_id`/`section` của finding đã xử lý (status `accepted`/`modified`/`applied`) trong findings cũ } ∪ { UC có trong target hiện tại nhưng chưa từng xuất hiện ở findings cũ }.
646
+ - **`applied_to_version` vắng mặt HOẶC `≠` version hiện tại** → target đã bị sửa bởi **actor khác** (lệnh `/refine-prd`, `/generate-bdd` regen, sửa tay…) sau lần áp này → KHÔNG tin được phạm vi hẹp → **FULL** (KHÔNG truyền `CHANGED_SCOPE`), kèm cảnh báo: `"Target đổi ngoài tầm theo dõi của findings (applied_to_version={A} ≠ hiện tại={C}); quét lại toàn bộ để khỏi sót UC do người/lệnh khác sửa."`
645
647
 
646
648
  ---
647
649
 
@@ -653,7 +655,7 @@ Convergence: {convergence_rounds} vòng critic — file findings đã đầy đ
653
655
 
654
656
  Khi `setup.mode = umbrella`, PRD phải có metadata routing đúng để context-loader Bước 1.5 có thể đưa output sinh ra tới đúng service submodule. Chạy các check này **trước P1–P5**:
655
657
 
656
- > **Nguồn đọc:** PRD mang Domain/Status ở **bảng Metadata** (`| **Domain** | … |`, `| **Status** | … |`) — **KHÔNG** phải frontmatter `@trace.*` (cái đó dành cho file `.feature`/tech-docs do máy đọc). Routing umbrella dựa trên Domain (bảng) + path, đúng như context-loader Bước 1.5 và `generate-bdd` (đọc `| **Status** |`).
658
+ > **Nguồn đọc:** PRD mang **Domain** ở **bảng Metadata** (`| **Domain** | … |`) — **KHÔNG** phải frontmatter `@trace.*` (cái đó dành cho file `.feature`/tech-docs do máy đọc). Routing umbrella dựa trên Domain (bảng) + path, đúng như context-loader Bước 1.5.
657
659
 
658
660
  **P0.1 — Row `Domain` có mặt trong Metadata**
659
661
  - Đọc bảng Metadata của PRD, lấy row `| **Domain** |`.
@@ -673,11 +675,7 @@ Khi `setup.mode = umbrella`, PRD phải có metadata routing đúng để contex
673
675
  - `suggestion`: "Cập nhật section services trong `.agent/project-context.yaml` với mapping domain-to-submodule trước khi sinh BDD."
674
676
  - `auto_fixable: false`
675
677
 
676
- **P0.3 Check row `Status` trong Metadata**
677
- - Nếu row `| **Status** |` **vắng mặt** → **minor**, `auto_fixable: true` (thêm `| **Status** | draft |`)
678
- - Nếu `Status: draft` → **major**, `auto_fixable: false`:
679
- - `finding`: "PRD status là `draft`. Team dev không nên sinh BDD từ một PRD chưa được duyệt."
680
- - `suggestion`: "PO/SA nên review và cập nhật Status thành `approved` trước khi team dev tiếp tục."
678
+ > **Status KHÔNG còn là check của P0.** PRD chưa duyệt (`Status: draft`) trạng thái **bình thường** lúc review — việc duyệt diễn ra *sau khi* review-context sạch, nên báo draft là "lỗi" ở đây chỉ gây nhiễu. Gác duyệt do `/generate-bdd` lo (cảnh báo mềm, áp **mọi mode**); lời nhắc đặt `approved` nằm ở Report (mọi mode). P4 chỉ lo trường hợp row Status **vắng mặt** (auto-fix mặc định `draft`).
681
679
 
682
680
  > **P0 là một gate check:** Nếu P0.1 hoặc P0.2 cho finding critical, hiển thị cảnh báo trước khi tiếp tục:
683
681
  > ```
@@ -741,7 +739,7 @@ hoặc định nghĩa lại field/status transition của một entity khác đi
741
739
  - [ ] Có section `# Change Log`
742
740
  - [ ] Không còn giá trị `{{PLACEHOLDER}}` chưa điền
743
741
 
744
- → Section/field thiếu hoặc lệch cấu trúc: **major**. AI có thể thêm skeleton khi `--resume` nếu được chấp nhận. Riêng **"Nhất quán 2 chiều"** lệch → **major**, `auto_fixable: false` (người xác nhận AC↔UC, AI không tự đoán). **API Source: existing thiếu contract** → **major**, `auto_fixable: false` (cần nguồn contract); **greenfield còn sót section "Existing API Contract" rỗng** → **minor**, `auto_fixable: true` (xoá section).
742
+ → Section/field thiếu hoặc lệch cấu trúc: **major**. AI có thể thêm skeleton khi `--resume` nếu được chấp nhận. Riêng **"Nhất quán 2 chiều"** lệch → **major**, `auto_fixable: false` (người xác nhận AC↔UC, AI không tự đoán). **API Source: existing thiếu contract** → **major**, `auto_fixable: false` (cần nguồn contract); **greenfield còn sót section "Existing API Contract" rỗng** → **minor**, `auto_fixable: true` (xoá section). Riêng **row `Status` vắng mặt** → **minor**, `auto_fixable: true` (thêm `| **Status** | draft |`) — KHÔNG flag *giá trị* draft (đó là trạng thái bình thường lúc review; gác duyệt do `/generate-bdd` lo).
745
743
 
746
744
  ### P5 — Custom Criteria (tuỳ chọn)
747
745
 
@@ -826,6 +824,7 @@ Sau khi chạy hết các check, ghi `{paths.refinement_dir}/{slug}-review-*-fin
826
824
  ```yaml
827
825
  source_file: "{absolute path to reviewed file}"
828
826
  source_version: "{version target lúc sinh findings — PRD: Metadata Version; BDD: @trace.bdd_version — dùng chọn full/delta lần chạy sau}"
827
+ applied_to_version: "" # để trống lúc phân tích; --fix/--resume sẽ ghi version target vừa bump tới. Lần delta sau: nếu version target hiện tại ≠ giá trị này → target bị actor khác sửa → fallback FULL (xem "Chọn full vs delta")
829
828
  generated_at: "{ISO datetime}"
830
829
  review_type: "{prd | bdd}"
831
830
  status: "pending_review"
@@ -840,7 +839,8 @@ findings:
840
839
  finding: "{mô tả rõ ràng vấn đề}"
841
840
  suggestion: "{bản fix cụ thể, hành động được — AI sẽ áp dụng khi --resume nếu được chấp nhận}"
842
841
  auto_fixable: true # true = AI áp dụng được; false = người phải viết note trong Review Board
843
- status: "pending" # pending | accepted | modified | rejected | deferred
842
+ status: "pending" # pending | accepted | modified | rejected | needs_discussion | deferred | applied (vòng đời chung — xem chú thích dưới)
843
+ applied_via: "" # set khi status='applied': "fix" (auto qua --fix) | "resume" (người duyệt qua --resume)
844
844
 
845
845
  summary:
846
846
  total_findings: {N}
@@ -850,6 +850,15 @@ summary:
850
850
  recommendation: "APPROVED | NEEDS_REVISION | BLOCKED"
851
851
  ```
852
852
 
853
+ > **Vòng đời finding-level (CHUNG với `/refine-prd` — một Review Board đọc cả hai loại file nên enum phải khớp):**
854
+ > - `pending` → mới, chưa review
855
+ > - `accepted` → nhận suggestion gốc → `--resume` sẽ áp
856
+ > - `modified` → người đã sửa suggestion trong Review Board → `--resume` dùng bản đã sửa
857
+ > - `rejected` → bác bỏ, không áp
858
+ > - `needs_discussion` → xung đột/chưa ngã ngũ → **chặn** `--resume` (bỏ qua + cảnh báo) tới khi người quyết
859
+ > - `deferred` → cố ý hoãn (không chặn), bỏ qua lượt này, xem lại sau
860
+ > - `applied` → đã áp vào target; `applied_via` ghi cách áp: `"fix"` (auto qua `--fix`) hoặc `"resume"` (người duyệt qua `--resume`)
861
+
853
862
  > **Field định vị (`quote` + `uc_id`) — bắt buộc cho source-jump của Review Board.**
854
863
  > Với mỗi finding, copy một đoạn `quote` **nguyên văn** thẳng từ file đang review tại đúng
855
864
  > chỗ lỗi xảy ra — KHÔNG diễn giải lại; nó được so khớp với tài liệu để định vị dòng.
@@ -928,7 +937,7 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
928
937
  | /define-product | `/generate-prd {product-definition-file}` |
929
938
  | /generate-prd | `/refine-prd {prd-file}` rồi `/review-context {prd-file}` |
930
939
  | /refine-prd | Mở Review Board → cập nhật PRD → `/review-context {prd-file}` |
931
- | /review-context (PRD) | FE/App: `/generate-design-spec {prd-file}` (rồi BDD sau khi sign-off); BE: `/generate-bdd {prd-file}` trực tiếp; sửa PRD nếu NEEDS_FIX |
940
+ | /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) |
932
941
  | /generate-design-spec | Designer review → xác nhận link Figma → PO + Designer sign-off → `/generate-bdd {prd-file}` |
933
942
  | /generate-bdd | `/review-context {feature-file}` để kiểm tra độ phủ |
934
943
  | /review-context (BDD) | `/generate-tech-docs {UC-ID}` nếu APPROVED; sinh lại nếu NEEDS_FIX |
@@ -983,6 +992,12 @@ Lựa chọn tiếp theo:
983
992
  → áp dụng ngay mọi finding auto-fixable
984
993
  B) Review Board: mở file findings → accept/modify/reject
985
994
  → /review-context --resume {target-file}
995
+
996
+ {CHỈ in khối này khi 0 finding critical còn lại — còn critical thì nhắc duyệt là vô nghĩa}:
997
+ {If PRD}: ✅ PRD đã sạch critical. Khi PO hài lòng → đặt `| **Status** | approved |` trong
998
+ Metadata PRD (dấu duyệt nghiệp vụ, do người quyết) → rồi /generate-bdd.
999
+ {If BDD}: ✅ BDD đã sạch critical. Sau khi review xong → đặt `# @trace.status: approved` trong
1000
+ header file .feature (dấu duyệt BDD, do người quyết) → rồi /generate-tech-docs.
986
1001
  ```
987
1002
 
988
1003
  ---
@@ -1012,10 +1027,9 @@ Với mỗi finding có `auto_fixable: true`, theo thứ tự (critical → majo
1012
1027
 
1013
1028
  | check_id | Áp dụng gì |
1014
1029
  |----------|--------------|
1015
- | P0.3 (Thiếu status) | Thêm row `| **Status** | draft |` vào bảng Metadata |
1016
1030
  | P1 (Banned term) | Thay mọi lần xuất hiện banned term bằng canonical term |
1017
1031
  | P1 (Thuật ngữ kỹ thuật/UI) | Diễn đạt lại theo Business Language Guard (Nhóm 1) / chuyển Design Spec (2) / bỏ về Tech Docs (3) |
1018
- | P4 (Structure) | Thêm skeleton section/metadata còn thiếu; greenfield → xoá section "Existing API Contract" rỗng |
1032
+ | P4 (Structure) | Thêm skeleton section/metadata còn thiếu (row Status vắng → thêm mặc định `draft`); greenfield → xoá section "Existing API Contract" rỗng |
1019
1033
 
1020
1034
  > **Chạy Business Language Guard trên text vừa sửa TRƯỚC khi ghi** (xem section "Ngôn ngữ nghiệp vụ") — không để bản auto-fix tự kéo thuật ngữ kỹ thuật vào.
1021
1035
 
@@ -1033,13 +1047,14 @@ Với mỗi finding có `auto_fixable: true`, theo thứ tự (critical → majo
1033
1047
  | B5 | Thêm @trace header còn thiếu, sinh lại Coverage Matrix / Pre-merge Checklist |
1034
1048
  | B6 | Thêm `And <side-effect>` còn thiếu vào block Then |
1035
1049
 
1036
- Sau khi áp dụng mỗi finding, đánh dấu nó `status: "applied_automatically"` trong file findings.
1050
+ Sau khi áp dụng mỗi finding, đánh dấu nó `status: "applied"` + `applied_via: "fix"` trong file findings.
1037
1051
 
1038
1052
  ### Phase 3 — Version bump
1039
1053
 
1040
- - **PRD**: nếu ≥1 finding được áp dụng → bump version **minor** (auto-fix chỉ áp dụng thay banned-term P1 và thêm skeleton P4 — không bao giờ thay đổi cấu trúc UC hay nội dung BR, nên minor bump luôn đúng), thêm entry Changelog:
1041
- `Auto-fix: applied {N} auto-fixable review-context findings`
1042
- - **BDD**: nếu ≥1 finding được áp dụng → tăng `@trace.bdd_version` lên 0.1
1054
+ - **PRD**: nếu ≥1 finding được áp dụng → bump version **minor** (auto-fix chỉ áp dụng thay banned-term P1 và thêm skeleton P4 — không bao giờ thay đổi cấu trúc UC hay nội dung BR, nên minor bump luôn đúng), **reset `| **Status** | draft |` trong Metadata** (PRD vừa đổi sau khi duyệt → con dấu duyệt cũ hết hiệu lực, phải duyệt lại — đồng bộ với /refine-prd), thêm entry Changelog:
1055
+ `| {new_version} | {today} | Auto-fix: applied {N} auto-fixable findings |` — bảng phẳng + **rollover giữ 5 row gần nhất** (dồn dư sang `changelog/{TICKET-ID}-{prd-slug}.changelog.md`); xem quy ước đầy đủ ở refine-prd Phase 3.
1056
+ - **BDD**: nếu ≥1 finding được áp dụng → tăng `@trace.bdd_version` lên 0.1, **reset `# @trace.status: draft`** trong header (BDD đổi sau khi duyệt → phải duyệt lại — đồng bộ với cơ chế reset draft của PRD)
1057
+ - **Cả hai**: ghi `applied_to_version: "{version vừa bump tới}"` ở root level của findings — đóng dấu "target đổi tới version này là do lệnh này áp", để lần review delta sau phân biệt thay đổi của chính mình với thay đổi do actor khác (xem "Chọn full vs delta").
1043
1058
 
1044
1059
  ### Phase 4 — Report
1045
1060
 
@@ -1054,13 +1069,15 @@ Auto-fixed : {N} findings ({critical} critical, {major} major, {minor} minor)
1054
1069
  Còn pending (cần quyết định của con người): {N}
1055
1070
  - F00X [{severity}] {tóm tắt finding} ← mở file findings trong Review Board
1056
1071
 
1057
- {If PRD}: Version bumped: {old} → {new}
1058
- {If BDD}: bdd_version: {old} → {new}
1072
+ {If PRD}: Version bumped: {old} → {new} | Status: reset về draft (cần duyệt lại)
1073
+ {If BDD}: bdd_version: {old} → {new} | @trace.status: reset về draft (cần duyệt lại)
1059
1074
 
1060
1075
  File findings:
1061
1076
  {If PRD}: {paths.refinement_dir}/{prd-slug}-review-context-findings.yaml
1062
1077
  {If BDD}: {paths.refinement_dir}/{uc-id}-review-bdd-findings.yaml
1063
1078
  Chạy lại /review-context {file} để xác nhận 0 finding critical còn lại.
1079
+ {If PRD}: Khi sạch critical + PO duyệt → đặt | **Status** | approved | trong Metadata rồi /generate-bdd.
1080
+ {If BDD}: Khi sạch critical + duyệt → đặt # @trace.status: approved trong header .feature rồi /generate-tech-docs.
1064
1081
  ```
1065
1082
 
1066
1083
  Nếu 0 finding nào auto-fixable → in:
@@ -1082,26 +1099,28 @@ Mở file findings trong Review Board → rồi chạy: /review-context --resume
1082
1099
  - PRD: `{paths.refinement_dir}/{prd-slug}-review-context-findings.yaml`
1083
1100
  - BDD: `{paths.refinement_dir}/{uc-id}-review-bdd-findings.yaml`
1084
1101
  2. Đọc file findings.
1085
- 3. Gom các finding có `status: "accepted"` hoặc `status: "modified"`.
1102
+ 3. Gom các finding có `status: "accepted"` hoặc `status: "modified"`. Bỏ qua `rejected`/`deferred`.
1086
1103
  4. Nếu không có → báo "No accepted findings. File unchanged." và dừng.
1104
+ 5. Nếu còn finding `status: "needs_discussion"` → cảnh báo (không dừng): `"⚠️ {N} finding chưa ngã ngũ (needs_discussion) — bỏ qua lần áp này; giải quyết trong Review Board rồi --resume lại."`
1087
1105
 
1088
1106
  ### Phase 2 — Áp dụng fix
1089
1107
 
1090
1108
  Áp dụng theo thứ tự: critical → major → minor.
1091
1109
 
1110
+ Với mỗi finding `accepted`/`modified` sau khi áp xong → đặt `status: "applied"` + `applied_via: "resume"` trong findings (hoàn tất vòng đời, cùng quy ước với `--fix` và `/refine-prd`).
1111
+
1092
1112
  > **Chạy Business Language Guard trên text vừa sửa TRƯỚC khi ghi** (xem section "Ngôn ngữ nghiệp vụ") — đặc biệt với P2 (sửa câu mơ hồ) / P4 skeleton: không để bản fix tự kéo thuật ngữ kỹ thuật-UI vào PRD.
1093
1113
 
1094
1114
  **Với finding PRD:**
1095
1115
  | check_id | Làm gì |
1096
1116
  |----------|-----------|
1097
- | P0.3 (Thiếu status) | Thêm row `| **Status** | draft |` vào bảng Metadata |
1098
1117
  | P1 (Banned term) | Thay banned term bằng canonical; thuật ngữ kỹ thuật/UI → diễn đạt lại theo Business Language Guard |
1099
1118
  | P2 (Ambiguity) | Áp dụng fix nêu trong `suggestion` hoặc note `modified` |
1100
1119
  | P3 (Conflict) | Áp dụng cách giải quyết nêu trong note modified |
1101
- | P4 (Structure) | Thêm section/metadata field còn thiếu |
1120
+ | P4 (Structure) | Thêm section/metadata field còn thiếu (row Status vắng → thêm mặc định `draft`) |
1102
1121
  | P5 (Custom) | Áp dụng như nêu trong suggestion/note |
1103
1122
 
1104
- → Sau khi áp dụng, bump version PRD (minor) thêm entry Changelog.
1123
+ → Sau khi áp dụng, bump version PRD (minor), **reset `| **Status** | draft |` trong Metadata** (PRD vừa đổi sau khi duyệt → phải duyệt lại — đồng bộ với /refine-prd), thêm row Changelog (bảng phẳng, **kê UC/AC/BR bị ảnh hưởng**, + **rollover giữ 5 row gần nhất** dồn dư sang `changelog/` — xem quy ước ở refine-prd Phase 3), và ghi `applied_to_version: "{new_version}"` ở root level của findings (xem "Chọn full vs delta").
1105
1124
 
1106
1125
  **Với finding BDD:**
1107
1126
  | check_id | Làm gì |
@@ -1113,22 +1132,25 @@ Mở file findings trong Review Board → rồi chạy: /review-context --resume
1113
1132
  | B5 (Metadata) | Thêm @trace header còn thiếu, sinh lại Coverage Matrix / Pre-merge Checklist |
1114
1133
  | B6 (Side effects) | Thêm `And <side-effect>` còn thiếu vào block Then |
1115
1134
 
1116
- → Sau khi áp dụng, tăng `@trace.bdd_version` trong header file lên 0.1.
1117
- → Đồng thời cập nhật `{paths.trace_dir}/{domain}/{prd-slug}/{UC-ID}.tsv`: đặt cột `bdd_version` thành giá trị `@trace.bdd_version` mới cho mọi row, và đặt `last_updated` thành ngày hôm nay.
1135
+ → Sau khi áp dụng, tăng `@trace.bdd_version` trong header file lên 0.1, **reset `# @trace.status: draft`** trong header (BDD đổi sau khi duyệt → phải duyệt lại).
1136
+ → Đồng thời cập nhật `{paths.trace_dir}/{domain}/{prd-slug}/{UC-ID}.tsv`: đặt cột `bdd_version` thành giá trị `@trace.bdd_version` mới cho mọi row, đặt `uc_status = draft` (khớp header), và đặt `last_updated` thành ngày hôm nay.
1137
+ → Ghi `applied_to_version: "{@trace.bdd_version mới}"` ở root level của findings (xem "Chọn full vs delta").
1118
1138
 
1119
1139
  ### Phase 3 — Report
1120
1140
 
1121
1141
  ```
1122
1142
  /review-context --resume Đã áp dụng — {target file}
1123
1143
  Applied : {N} findings ({critical} critical, {major} major, {minor} minor)
1124
- Skipped : {N} rejected/deferred
1144
+ Skipped : {N} rejected/deferred/needs_discussion
1125
1145
 
1126
1146
  Changes:
1127
1147
  - {tóm tắt change 1}
1128
1148
  - {tóm tắt change 2}
1129
1149
 
1130
- {If PRD}: Version bumped: {old} → {new}
1131
- {If BDD}: bdd_version: {old} → {new}
1150
+ {If PRD}: Version bumped: {old} → {new} | Status: reset về draft (cần duyệt lại)
1151
+ {If BDD}: bdd_version: {old} → {new} | @trace.status: reset về draft (cần duyệt lại)
1132
1152
 
1133
1153
  Chạy lại /review-context {file} để xác nhận 0 finding critical còn lại.
1154
+ {If PRD}: Khi sạch critical + PO duyệt → đặt | **Status** | approved | trong Metadata rồi /generate-bdd.
1155
+ {If BDD}: Khi sạch critical + duyệt → đặt # @trace.status: approved trong header .feature rồi /generate-tech-docs.
1134
1156
  ```
@@ -58,7 +58,9 @@ Suy ra tên file findings output:
58
58
  - **Tồn tại** + có `--full` → **FULL**: bỏ qua findings cũ.
59
59
  - **Tồn tại** + KHÔNG `--full` → so `source_version` trong findings cũ với version target hiện tại (PRD: Metadata `Version`; BDD: `@trace.bdd_version`):
60
60
  - **Bằng nhau** (target chưa đổi từ lần review trước) → DỪNG, báo: `"Target chưa đổi từ v{X} (lần review gần nhất). Không có gì để review lại — dùng --full nếu vẫn muốn quét toàn bộ."`
61
- - **Khác** → **DELTA**: `CHANGED_SCOPE` = { `uc_id`/`section` của finding đã xử (status `accepted`/`modified`/`applied_automatically`) trong findings } { UC trong target hiện tại nhưng chưa từng xuất hiện ở findings cũ }.
61
+ - **Khác** → kiểm tra `applied_to_version` trong findings (version lần `--fix`/`--resume` gần nhất của CHÍNH lệnh này đã bump target tới) để biết ai gây ra thay đổi:
62
+ - **`applied_to_version` có mặt VÀ `==` version target hiện tại** → target đổi đúng bằng phần lệnh này tự áp, không actor khác động vào → **DELTA**: `CHANGED_SCOPE` = { `uc_id`/`section` của finding đã xử lý (status `accepted`/`modified`/`applied`) trong findings cũ } ∪ { UC có trong target hiện tại nhưng chưa từng xuất hiện ở findings cũ }.
63
+ - **`applied_to_version` vắng mặt HOẶC `≠` version hiện tại** → target đã bị sửa bởi **actor khác** (lệnh `/refine-prd`, `/generate-bdd` regen, sửa tay…) sau lần áp này → KHÔNG tin được phạm vi hẹp → **FULL** (KHÔNG truyền `CHANGED_SCOPE`), kèm cảnh báo: `"Target đổi ngoài tầm theo dõi của findings (applied_to_version={A} ≠ hiện tại={C}); quét lại toàn bộ để khỏi sót UC do người/lệnh khác sửa."`
62
64
 
63
65
  ---
64
66
 
@@ -70,7 +72,7 @@ Suy ra tên file findings output:
70
72
 
71
73
  Khi `setup.mode = umbrella`, PRD phải có metadata routing đúng để context-loader Bước 1.5 có thể đưa output sinh ra tới đúng service submodule. Chạy các check này **trước P1–P5**:
72
74
 
73
- > **Nguồn đọc:** PRD mang Domain/Status ở **bảng Metadata** (`| **Domain** | … |`, `| **Status** | … |`) — **KHÔNG** phải frontmatter `@trace.*` (cái đó dành cho file `.feature`/tech-docs do máy đọc). Routing umbrella dựa trên Domain (bảng) + path, đúng như context-loader Bước 1.5 và `generate-bdd` (đọc `| **Status** |`).
75
+ > **Nguồn đọc:** PRD mang **Domain** ở **bảng Metadata** (`| **Domain** | … |`) — **KHÔNG** phải frontmatter `@trace.*` (cái đó dành cho file `.feature`/tech-docs do máy đọc). Routing umbrella dựa trên Domain (bảng) + path, đúng như context-loader Bước 1.5.
74
76
 
75
77
  **P0.1 — Row `Domain` có mặt trong Metadata**
76
78
  - Đọc bảng Metadata của PRD, lấy row `| **Domain** |`.
@@ -90,11 +92,7 @@ Khi `setup.mode = umbrella`, PRD phải có metadata routing đúng để contex
90
92
  - `suggestion`: "Cập nhật section services trong `.agent/project-context.yaml` với mapping domain-to-submodule trước khi sinh BDD."
91
93
  - `auto_fixable: false`
92
94
 
93
- **P0.3 Check row `Status` trong Metadata**
94
- - Nếu row `| **Status** |` **vắng mặt** → **minor**, `auto_fixable: true` (thêm `| **Status** | draft |`)
95
- - Nếu `Status: draft` → **major**, `auto_fixable: false`:
96
- - `finding`: "PRD status là `draft`. Team dev không nên sinh BDD từ một PRD chưa được duyệt."
97
- - `suggestion`: "PO/SA nên review và cập nhật Status thành `approved` trước khi team dev tiếp tục."
95
+ > **Status KHÔNG còn là check của P0.** PRD chưa duyệt (`Status: draft`) trạng thái **bình thường** lúc review — việc duyệt diễn ra *sau khi* review-context sạch, nên báo draft là "lỗi" ở đây chỉ gây nhiễu. Gác duyệt do `/generate-bdd` lo (cảnh báo mềm, áp **mọi mode**); lời nhắc đặt `approved` nằm ở Report (mọi mode). P4 chỉ lo trường hợp row Status **vắng mặt** (auto-fix mặc định `draft`).
98
96
 
99
97
  > **P0 là một gate check:** Nếu P0.1 hoặc P0.2 cho finding critical, hiển thị cảnh báo trước khi tiếp tục:
100
98
  > ```
@@ -158,7 +156,7 @@ hoặc định nghĩa lại field/status transition của một entity khác đi
158
156
  - [ ] Có section `# Change Log`
159
157
  - [ ] Không còn giá trị `{{PLACEHOLDER}}` chưa điền
160
158
 
161
- → Section/field thiếu hoặc lệch cấu trúc: **major**. AI có thể thêm skeleton khi `--resume` nếu được chấp nhận. Riêng **"Nhất quán 2 chiều"** lệch → **major**, `auto_fixable: false` (người xác nhận AC↔UC, AI không tự đoán). **API Source: existing thiếu contract** → **major**, `auto_fixable: false` (cần nguồn contract); **greenfield còn sót section "Existing API Contract" rỗng** → **minor**, `auto_fixable: true` (xoá section).
159
+ → Section/field thiếu hoặc lệch cấu trúc: **major**. AI có thể thêm skeleton khi `--resume` nếu được chấp nhận. Riêng **"Nhất quán 2 chiều"** lệch → **major**, `auto_fixable: false` (người xác nhận AC↔UC, AI không tự đoán). **API Source: existing thiếu contract** → **major**, `auto_fixable: false` (cần nguồn contract); **greenfield còn sót section "Existing API Contract" rỗng** → **minor**, `auto_fixable: true` (xoá section). Riêng **row `Status` vắng mặt** → **minor**, `auto_fixable: true` (thêm `| **Status** | draft |`) — KHÔNG flag *giá trị* draft (đó là trạng thái bình thường lúc review; gác duyệt do `/generate-bdd` lo).
162
160
 
163
161
  ### P5 — Custom Criteria (tuỳ chọn)
164
162
 
@@ -243,6 +241,7 @@ Sau khi chạy hết các check, ghi `{paths.refinement_dir}/{slug}-review-*-fin
243
241
  ```yaml
244
242
  source_file: "{absolute path to reviewed file}"
245
243
  source_version: "{version target lúc sinh findings — PRD: Metadata Version; BDD: @trace.bdd_version — dùng chọn full/delta lần chạy sau}"
244
+ applied_to_version: "" # để trống lúc phân tích; --fix/--resume sẽ ghi version target vừa bump tới. Lần delta sau: nếu version target hiện tại ≠ giá trị này → target bị actor khác sửa → fallback FULL (xem "Chọn full vs delta")
246
245
  generated_at: "{ISO datetime}"
247
246
  review_type: "{prd | bdd}"
248
247
  status: "pending_review"
@@ -257,7 +256,8 @@ findings:
257
256
  finding: "{mô tả rõ ràng vấn đề}"
258
257
  suggestion: "{bản fix cụ thể, hành động được — AI sẽ áp dụng khi --resume nếu được chấp nhận}"
259
258
  auto_fixable: true # true = AI áp dụng được; false = người phải viết note trong Review Board
260
- status: "pending" # pending | accepted | modified | rejected | deferred
259
+ status: "pending" # pending | accepted | modified | rejected | needs_discussion | deferred | applied (vòng đời chung — xem chú thích dưới)
260
+ applied_via: "" # set khi status='applied': "fix" (auto qua --fix) | "resume" (người duyệt qua --resume)
261
261
 
262
262
  summary:
263
263
  total_findings: {N}
@@ -267,6 +267,15 @@ summary:
267
267
  recommendation: "APPROVED | NEEDS_REVISION | BLOCKED"
268
268
  ```
269
269
 
270
+ > **Vòng đời finding-level (CHUNG với `/refine-prd` — một Review Board đọc cả hai loại file nên enum phải khớp):**
271
+ > - `pending` → mới, chưa review
272
+ > - `accepted` → nhận suggestion gốc → `--resume` sẽ áp
273
+ > - `modified` → người đã sửa suggestion trong Review Board → `--resume` dùng bản đã sửa
274
+ > - `rejected` → bác bỏ, không áp
275
+ > - `needs_discussion` → xung đột/chưa ngã ngũ → **chặn** `--resume` (bỏ qua + cảnh báo) tới khi người quyết
276
+ > - `deferred` → cố ý hoãn (không chặn), bỏ qua lượt này, xem lại sau
277
+ > - `applied` → đã áp vào target; `applied_via` ghi cách áp: `"fix"` (auto qua `--fix`) hoặc `"resume"` (người duyệt qua `--resume`)
278
+
270
279
  > **Field định vị (`quote` + `uc_id`) — bắt buộc cho source-jump của Review Board.**
271
280
  > Với mỗi finding, copy một đoạn `quote` **nguyên văn** thẳng từ file đang review tại đúng
272
281
  > chỗ lỗi xảy ra — KHÔNG diễn giải lại; nó được so khớp với tài liệu để định vị dòng.
@@ -300,6 +309,12 @@ Lựa chọn tiếp theo:
300
309
  → áp dụng ngay mọi finding auto-fixable
301
310
  B) Review Board: mở file findings → accept/modify/reject
302
311
  → /review-context --resume {target-file}
312
+
313
+ {CHỈ in khối này khi 0 finding critical còn lại — còn critical thì nhắc duyệt là vô nghĩa}:
314
+ {If PRD}: ✅ PRD đã sạch critical. Khi PO hài lòng → đặt `| **Status** | approved |` trong
315
+ Metadata PRD (dấu duyệt nghiệp vụ, do người quyết) → rồi /generate-bdd.
316
+ {If BDD}: ✅ BDD đã sạch critical. Sau khi review xong → đặt `# @trace.status: approved` trong
317
+ header file .feature (dấu duyệt BDD, do người quyết) → rồi /generate-tech-docs.
303
318
  ```
304
319
 
305
320
  ---
@@ -329,10 +344,9 @@ Với mỗi finding có `auto_fixable: true`, theo thứ tự (critical → majo
329
344
 
330
345
  | check_id | Áp dụng gì |
331
346
  |----------|--------------|
332
- | P0.3 (Thiếu status) | Thêm row `| **Status** | draft |` vào bảng Metadata |
333
347
  | P1 (Banned term) | Thay mọi lần xuất hiện banned term bằng canonical term |
334
348
  | P1 (Thuật ngữ kỹ thuật/UI) | Diễn đạt lại theo Business Language Guard (Nhóm 1) / chuyển Design Spec (2) / bỏ về Tech Docs (3) |
335
- | P4 (Structure) | Thêm skeleton section/metadata còn thiếu; greenfield → xoá section "Existing API Contract" rỗng |
349
+ | P4 (Structure) | Thêm skeleton section/metadata còn thiếu (row Status vắng → thêm mặc định `draft`); greenfield → xoá section "Existing API Contract" rỗng |
336
350
 
337
351
  > **Chạy Business Language Guard trên text vừa sửa TRƯỚC khi ghi** (xem section "Ngôn ngữ nghiệp vụ") — không để bản auto-fix tự kéo thuật ngữ kỹ thuật vào.
338
352
 
@@ -350,13 +364,14 @@ Với mỗi finding có `auto_fixable: true`, theo thứ tự (critical → majo
350
364
  | B5 | Thêm @trace header còn thiếu, sinh lại Coverage Matrix / Pre-merge Checklist |
351
365
  | B6 | Thêm `And <side-effect>` còn thiếu vào block Then |
352
366
 
353
- Sau khi áp dụng mỗi finding, đánh dấu nó `status: "applied_automatically"` trong file findings.
367
+ Sau khi áp dụng mỗi finding, đánh dấu nó `status: "applied"` + `applied_via: "fix"` trong file findings.
354
368
 
355
369
  ### Phase 3 — Version bump
356
370
 
357
- - **PRD**: nếu ≥1 finding được áp dụng → bump version **minor** (auto-fix chỉ áp dụng thay banned-term P1 và thêm skeleton P4 — không bao giờ thay đổi cấu trúc UC hay nội dung BR, nên minor bump luôn đúng), thêm entry Changelog:
358
- `Auto-fix: applied {N} auto-fixable review-context findings`
359
- - **BDD**: nếu ≥1 finding được áp dụng → tăng `@trace.bdd_version` lên 0.1
371
+ - **PRD**: nếu ≥1 finding được áp dụng → bump version **minor** (auto-fix chỉ áp dụng thay banned-term P1 và thêm skeleton P4 — không bao giờ thay đổi cấu trúc UC hay nội dung BR, nên minor bump luôn đúng), **reset `| **Status** | draft |` trong Metadata** (PRD vừa đổi sau khi duyệt → con dấu duyệt cũ hết hiệu lực, phải duyệt lại — đồng bộ với /refine-prd), thêm entry Changelog:
372
+ `| {new_version} | {today} | Auto-fix: applied {N} auto-fixable findings |` — bảng phẳng + **rollover giữ 5 row gần nhất** (dồn dư sang `changelog/{TICKET-ID}-{prd-slug}.changelog.md`); xem quy ước đầy đủ ở refine-prd Phase 3.
373
+ - **BDD**: nếu ≥1 finding được áp dụng → tăng `@trace.bdd_version` lên 0.1, **reset `# @trace.status: draft`** trong header (BDD đổi sau khi duyệt → phải duyệt lại — đồng bộ với cơ chế reset draft của PRD)
374
+ - **Cả hai**: ghi `applied_to_version: "{version vừa bump tới}"` ở root level của findings — đóng dấu "target đổi tới version này là do lệnh này áp", để lần review delta sau phân biệt thay đổi của chính mình với thay đổi do actor khác (xem "Chọn full vs delta").
360
375
 
361
376
  ### Phase 4 — Report
362
377
 
@@ -371,13 +386,15 @@ Auto-fixed : {N} findings ({critical} critical, {major} major, {minor} minor)
371
386
  Còn pending (cần quyết định của con người): {N}
372
387
  - F00X [{severity}] {tóm tắt finding} ← mở file findings trong Review Board
373
388
 
374
- {If PRD}: Version bumped: {old} → {new}
375
- {If BDD}: bdd_version: {old} → {new}
389
+ {If PRD}: Version bumped: {old} → {new} | Status: reset về draft (cần duyệt lại)
390
+ {If BDD}: bdd_version: {old} → {new} | @trace.status: reset về draft (cần duyệt lại)
376
391
 
377
392
  File findings:
378
393
  {If PRD}: {paths.refinement_dir}/{prd-slug}-review-context-findings.yaml
379
394
  {If BDD}: {paths.refinement_dir}/{uc-id}-review-bdd-findings.yaml
380
395
  Chạy lại /review-context {file} để xác nhận 0 finding critical còn lại.
396
+ {If PRD}: Khi sạch critical + PO duyệt → đặt | **Status** | approved | trong Metadata rồi /generate-bdd.
397
+ {If BDD}: Khi sạch critical + duyệt → đặt # @trace.status: approved trong header .feature rồi /generate-tech-docs.
381
398
  ```
382
399
 
383
400
  Nếu 0 finding nào auto-fixable → in:
@@ -399,26 +416,28 @@ Mở file findings trong Review Board → rồi chạy: /review-context --resume
399
416
  - PRD: `{paths.refinement_dir}/{prd-slug}-review-context-findings.yaml`
400
417
  - BDD: `{paths.refinement_dir}/{uc-id}-review-bdd-findings.yaml`
401
418
  2. Đọc file findings.
402
- 3. Gom các finding có `status: "accepted"` hoặc `status: "modified"`.
419
+ 3. Gom các finding có `status: "accepted"` hoặc `status: "modified"`. Bỏ qua `rejected`/`deferred`.
403
420
  4. Nếu không có → báo "No accepted findings. File unchanged." và dừng.
421
+ 5. Nếu còn finding `status: "needs_discussion"` → cảnh báo (không dừng): `"⚠️ {N} finding chưa ngã ngũ (needs_discussion) — bỏ qua lần áp này; giải quyết trong Review Board rồi --resume lại."`
404
422
 
405
423
  ### Phase 2 — Áp dụng fix
406
424
 
407
425
  Áp dụng theo thứ tự: critical → major → minor.
408
426
 
427
+ Với mỗi finding `accepted`/`modified` sau khi áp xong → đặt `status: "applied"` + `applied_via: "resume"` trong findings (hoàn tất vòng đời, cùng quy ước với `--fix` và `/refine-prd`).
428
+
409
429
  > **Chạy Business Language Guard trên text vừa sửa TRƯỚC khi ghi** (xem section "Ngôn ngữ nghiệp vụ") — đặc biệt với P2 (sửa câu mơ hồ) / P4 skeleton: không để bản fix tự kéo thuật ngữ kỹ thuật-UI vào PRD.
410
430
 
411
431
  **Với finding PRD:**
412
432
  | check_id | Làm gì |
413
433
  |----------|-----------|
414
- | P0.3 (Thiếu status) | Thêm row `| **Status** | draft |` vào bảng Metadata |
415
434
  | P1 (Banned term) | Thay banned term bằng canonical; thuật ngữ kỹ thuật/UI → diễn đạt lại theo Business Language Guard |
416
435
  | P2 (Ambiguity) | Áp dụng fix nêu trong `suggestion` hoặc note `modified` |
417
436
  | P3 (Conflict) | Áp dụng cách giải quyết nêu trong note modified |
418
- | P4 (Structure) | Thêm section/metadata field còn thiếu |
437
+ | P4 (Structure) | Thêm section/metadata field còn thiếu (row Status vắng → thêm mặc định `draft`) |
419
438
  | P5 (Custom) | Áp dụng như nêu trong suggestion/note |
420
439
 
421
- → Sau khi áp dụng, bump version PRD (minor) thêm entry Changelog.
440
+ → Sau khi áp dụng, bump version PRD (minor), **reset `| **Status** | draft |` trong Metadata** (PRD vừa đổi sau khi duyệt → phải duyệt lại — đồng bộ với /refine-prd), thêm row Changelog (bảng phẳng, **kê UC/AC/BR bị ảnh hưởng**, + **rollover giữ 5 row gần nhất** dồn dư sang `changelog/` — xem quy ước ở refine-prd Phase 3), và ghi `applied_to_version: "{new_version}"` ở root level của findings (xem "Chọn full vs delta").
422
441
 
423
442
  **Với finding BDD:**
424
443
  | check_id | Làm gì |
@@ -430,22 +449,25 @@ Mở file findings trong Review Board → rồi chạy: /review-context --resume
430
449
  | B5 (Metadata) | Thêm @trace header còn thiếu, sinh lại Coverage Matrix / Pre-merge Checklist |
431
450
  | B6 (Side effects) | Thêm `And <side-effect>` còn thiếu vào block Then |
432
451
 
433
- → Sau khi áp dụng, tăng `@trace.bdd_version` trong header file lên 0.1.
434
- → Đồng thời cập nhật `{paths.trace_dir}/{domain}/{prd-slug}/{UC-ID}.tsv`: đặt cột `bdd_version` thành giá trị `@trace.bdd_version` mới cho mọi row, và đặt `last_updated` thành ngày hôm nay.
452
+ → Sau khi áp dụng, tăng `@trace.bdd_version` trong header file lên 0.1, **reset `# @trace.status: draft`** trong header (BDD đổi sau khi duyệt → phải duyệt lại).
453
+ → Đồng thời cập nhật `{paths.trace_dir}/{domain}/{prd-slug}/{UC-ID}.tsv`: đặt cột `bdd_version` thành giá trị `@trace.bdd_version` mới cho mọi row, đặt `uc_status = draft` (khớp header), và đặt `last_updated` thành ngày hôm nay.
454
+ → Ghi `applied_to_version: "{@trace.bdd_version mới}"` ở root level của findings (xem "Chọn full vs delta").
435
455
 
436
456
  ### Phase 3 — Report
437
457
 
438
458
  ```
439
459
  /review-context --resume Đã áp dụng — {target file}
440
460
  Applied : {N} findings ({critical} critical, {major} major, {minor} minor)
441
- Skipped : {N} rejected/deferred
461
+ Skipped : {N} rejected/deferred/needs_discussion
442
462
 
443
463
  Changes:
444
464
  - {tóm tắt change 1}
445
465
  - {tóm tắt change 2}
446
466
 
447
- {If PRD}: Version bumped: {old} → {new}
448
- {If BDD}: bdd_version: {old} → {new}
467
+ {If PRD}: Version bumped: {old} → {new} | Status: reset về draft (cần duyệt lại)
468
+ {If BDD}: bdd_version: {old} → {new} | @trace.status: reset về draft (cần duyệt lại)
449
469
 
450
470
  Chạy lại /review-context {file} để xác nhận 0 finding critical còn lại.
471
+ {If PRD}: Khi sạch critical + PO duyệt → đặt | **Status** | approved | trong Metadata rồi /generate-bdd.
472
+ {If BDD}: Khi sạch critical + duyệt → đặt # @trace.status: approved trong header .feature rồi /generate-tech-docs.
451
473
  ```
@@ -682,7 +682,7 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
682
682
  | /define-product | `/generate-prd {product-definition-file}` |
683
683
  | /generate-prd | `/refine-prd {prd-file}` rồi `/review-context {prd-file}` |
684
684
  | /refine-prd | Mở Review Board → cập nhật PRD → `/review-context {prd-file}` |
685
- | /review-context (PRD) | FE/App: `/generate-design-spec {prd-file}` (rồi BDD sau khi sign-off); BE: `/generate-bdd {prd-file}` trực tiếp; sửa PRD nếu NEEDS_FIX |
685
+ | /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) |
686
686
  | /generate-design-spec | Designer review → xác nhận link Figma → PO + Designer sign-off → `/generate-bdd {prd-file}` |
687
687
  | /generate-bdd | `/review-context {feature-file}` để kiểm tra độ phủ |
688
688
  | /review-context (BDD) | `/generate-tech-docs {UC-ID}` nếu APPROVED; sinh lại nếu NEEDS_FIX |
@@ -140,15 +140,15 @@ Rồi:
140
140
  - Artifact theo từng feature (`specs/{domain}/{prd-slug}/{ {TICKET-ID}-{prd-slug}.md, bdd/, tech-docs/, design-spec/}`) được tạo on demand bởi các lệnh generate — ĐỪNG tạo trước
141
141
  - Skip: `.trace/` (theo service, sống cạnh code trong mỗi service submodule)
142
142
  - Sinh `CLAUDE.md` tối thiểu chỉ với §1 (project overview) và §7 (git conventions)
143
- - Hỏi người dùng: **"Liệt kê các business domain của bạn (vd auth, payment, loyalty):"** — lưu thành domain list cho `project-context.yaml` và nhắc PO các tên này phải được dùng nhất quán làm `@trace.domain` trong mọi PRD
143
+ - Hỏi người dùng: **"Liệt kê các business domain của bạn (vd auth, payment, loyalty):"** — lưu thành domain list cho `project-context.yaml` và nhắc PO các tên này phải được dùng nhất quán row `| **Domain** |` của bảng Metadata trong mọi PRD
144
144
  - Thông báo:
145
145
  - Lệnh cho PO repo: `/define-product`, `/generate-prd`, `/review-context`, `/generate-design-spec`
146
- - **Quan trọng cho handoff team dev:** Mọi PRD phải có `@trace.domain: {domain}` trong frontmatter. Team dev dùng nó để route BDD/code sinh ra tới đúng service submodule. Tên domain không nhất quán sẽ phá routing.
147
- - Frontmatter PRD khuyến nghị:
146
+ - **Quan trọng cho handoff team dev:** Mọi PRD phải có row `| **Domain** | {domain} |` trong **bảng Metadata**. Team dev dùng nó để route BDD/code sinh ra tới đúng service submodule. Tên domain không nhất quán sẽ phá routing.
147
+ - Bảng Metadata PRD (do `/generate-prd` điền sẵn theo template):
148
148
  ```
149
- @trace.domain: {domain} ← phải khớp một key trong services config của team dev
150
- @trace.id: {TICKET-ID}
151
- @trace.status: draft | approved
149
+ | **Domain** | {domain} | ← phải khớp một key trong services config của team dev
150
+ | **Ticket** | {TICKET-ID} |
151
+ | **Status** | draft | approved |
152
152
  ```
153
153
 
154
154
  ## Step 1 — Tạo cấu trúc thư mục
@@ -446,7 +446,7 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
446
446
  | /define-product | `/generate-prd {product-definition-file}` |
447
447
  | /generate-prd | `/refine-prd {prd-file}` rồi `/review-context {prd-file}` |
448
448
  | /refine-prd | Mở Review Board → cập nhật PRD → `/review-context {prd-file}` |
449
- | /review-context (PRD) | FE/App: `/generate-design-spec {prd-file}` (rồi BDD sau khi sign-off); BE: `/generate-bdd {prd-file}` trực tiếp; sửa PRD nếu NEEDS_FIX |
449
+ | /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) |
450
450
  | /generate-design-spec | Designer review → xác nhận link Figma → PO + Designer sign-off → `/generate-bdd {prd-file}` |
451
451
  | /generate-bdd | `/review-context {feature-file}` để kiểm tra độ phủ |
452
452
  | /review-context (BDD) | `/generate-tech-docs {UC-ID}` nếu APPROVED; sinh lại nếu NEEDS_FIX |
@@ -510,7 +510,7 @@ Next:
510
510
  Next:
511
511
  1. Review .agent/project-context.yaml:
512
512
  - Cập nhật services[].path khớp tên thư mục submodule thực tế
513
- - Cập nhật domain key của services khớp @trace.domain trong các file PRD
513
+ - Cập nhật domain key của services khớp row `Domain` (bảng Metadata) trong các file PRD
514
514
  - Xác nhận path spec_source đúng
515
515
 
516
516
  2. Chạy /sync — một lệnh lo mọi thứ còn lại:
@@ -529,7 +529,7 @@ Next:
529
529
  ```
530
530
  Next:
531
531
  1. Điền .agent/project-context.yaml:
532
- - domains: [liệt kê mọi business domain — chúng thành giá trị @trace.domain trong PRD]
532
+ - domains: [liệt kê mọi business domain — chúng thành row `Domain` (bảng Metadata) trong PRD]
533
533
  - project.name, project.description
534
534
  2. Điền specs/domain-knowledge/business-dictionary.md ← canonical terms
535
535
  3. Điền specs/domain-knowledge/core-entities.md ← entity glossary
@@ -539,7 +539,7 @@ Next:
539
539
  6. /define-product để bắt đầu feature đầu tiên
540
540
 
541
541
  ⚠️ Nhắc handoff team dev:
542
- - Mỗi PRD phải có @trace.domain khớp một trong domains list của bạn
542
+ - Mỗi PRD phải có row `Domain` (bảng Metadata) khớp một trong domains list của bạn
543
543
  - Khi team dev setup umbrella repo của họ, họ map các tên domain này
544
544
  tới path service submodule trong section services của project-context.yaml
545
545
  - Chia sẻ tên domain với team dev trước khi họ cấu hình umbrella
@@ -52,15 +52,15 @@ Rồi:
52
52
  - Artifact theo từng feature (`specs/{domain}/{prd-slug}/{ {TICKET-ID}-{prd-slug}.md, bdd/, tech-docs/, design-spec/}`) được tạo on demand bởi các lệnh generate — ĐỪNG tạo trước
53
53
  - Skip: `.trace/` (theo service, sống cạnh code trong mỗi service submodule)
54
54
  - Sinh `CLAUDE.md` tối thiểu chỉ với §1 (project overview) và §7 (git conventions)
55
- - Hỏi người dùng: **"Liệt kê các business domain của bạn (vd auth, payment, loyalty):"** — lưu thành domain list cho `project-context.yaml` và nhắc PO các tên này phải được dùng nhất quán làm `@trace.domain` trong mọi PRD
55
+ - Hỏi người dùng: **"Liệt kê các business domain của bạn (vd auth, payment, loyalty):"** — lưu thành domain list cho `project-context.yaml` và nhắc PO các tên này phải được dùng nhất quán row `| **Domain** |` của bảng Metadata trong mọi PRD
56
56
  - Thông báo:
57
57
  - Lệnh cho PO repo: `/define-product`, `/generate-prd`, `/review-context`, `/generate-design-spec`
58
- - **Quan trọng cho handoff team dev:** Mọi PRD phải có `@trace.domain: {domain}` trong frontmatter. Team dev dùng nó để route BDD/code sinh ra tới đúng service submodule. Tên domain không nhất quán sẽ phá routing.
59
- - Frontmatter PRD khuyến nghị:
58
+ - **Quan trọng cho handoff team dev:** Mọi PRD phải có row `| **Domain** | {domain} |` trong **bảng Metadata**. Team dev dùng nó để route BDD/code sinh ra tới đúng service submodule. Tên domain không nhất quán sẽ phá routing.
59
+ - Bảng Metadata PRD (do `/generate-prd` điền sẵn theo template):
60
60
  ```
61
- @trace.domain: {domain} ← phải khớp một key trong services config của team dev
62
- @trace.id: {TICKET-ID}
63
- @trace.status: draft | approved
61
+ | **Domain** | {domain} | ← phải khớp một key trong services config của team dev
62
+ | **Ticket** | {TICKET-ID} |
63
+ | **Status** | draft | approved |
64
64
  ```
65
65
 
66
66
  ## Step 1 — Tạo cấu trúc thư mục
@@ -322,7 +322,7 @@ Next:
322
322
  Next:
323
323
  1. Review .agent/project-context.yaml:
324
324
  - Cập nhật services[].path khớp tên thư mục submodule thực tế
325
- - Cập nhật domain key của services khớp @trace.domain trong các file PRD
325
+ - Cập nhật domain key của services khớp row `Domain` (bảng Metadata) trong các file PRD
326
326
  - Xác nhận path spec_source đúng
327
327
 
328
328
  2. Chạy /sync — một lệnh lo mọi thứ còn lại:
@@ -341,7 +341,7 @@ Next:
341
341
  ```
342
342
  Next:
343
343
  1. Điền .agent/project-context.yaml:
344
- - domains: [liệt kê mọi business domain — chúng thành giá trị @trace.domain trong PRD]
344
+ - domains: [liệt kê mọi business domain — chúng thành row `Domain` (bảng Metadata) trong PRD]
345
345
  - project.name, project.description
346
346
  2. Điền specs/domain-knowledge/business-dictionary.md ← canonical terms
347
347
  3. Điền specs/domain-knowledge/core-entities.md ← entity glossary
@@ -351,7 +351,7 @@ Next:
351
351
  6. /define-product để bắt đầu feature đầu tiên
352
352
 
353
353
  ⚠️ Nhắc handoff team dev:
354
- - Mỗi PRD phải có @trace.domain khớp một trong domains list của bạn
354
+ - Mỗi PRD phải có row `Domain` (bảng Metadata) khớp một trong domains list của bạn
355
355
  - Khi team dev setup umbrella repo của họ, họ map các tên domain này
356
356
  tới path service submodule trong section services của project-context.yaml
357
357
  - Chia sẻ tên domain với team dev trước khi họ cấu hình umbrella
package/commands/sync.md CHANGED
@@ -364,7 +364,7 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
364
364
  | /define-product | `/generate-prd {product-definition-file}` |
365
365
  | /generate-prd | `/refine-prd {prd-file}` rồi `/review-context {prd-file}` |
366
366
  | /refine-prd | Mở Review Board → cập nhật PRD → `/review-context {prd-file}` |
367
- | /review-context (PRD) | FE/App: `/generate-design-spec {prd-file}` (rồi BDD sau khi sign-off); BE: `/generate-bdd {prd-file}` trực tiếp; sửa PRD nếu NEEDS_FIX |
367
+ | /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) |
368
368
  | /generate-design-spec | Designer review → xác nhận link Figma → PO + Designer sign-off → `/generate-bdd {prd-file}` |
369
369
  | /generate-bdd | `/review-context {feature-file}` để kiểm tra độ phủ |
370
370
  | /review-context (BDD) | `/generate-tech-docs {UC-ID}` nếu APPROVED; sinh lại nếu NEEDS_FIX |
@@ -187,7 +187,7 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
187
187
  | /define-product | `/generate-prd {product-definition-file}` |
188
188
  | /generate-prd | `/refine-prd {prd-file}` rồi `/review-context {prd-file}` |
189
189
  | /refine-prd | Mở Review Board → cập nhật PRD → `/review-context {prd-file}` |
190
- | /review-context (PRD) | FE/App: `/generate-design-spec {prd-file}` (rồi BDD sau khi sign-off); BE: `/generate-bdd {prd-file}` trực tiếp; sửa PRD nếu NEEDS_FIX |
190
+ | /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) |
191
191
  | /generate-design-spec | Designer review → xác nhận link Figma → PO + Designer sign-off → `/generate-bdd {prd-file}` |
192
192
  | /generate-bdd | `/review-context {feature-file}` để kiểm tra độ phủ |
193
193
  | /review-context (BDD) | `/generate-tech-docs {UC-ID}` nếu APPROVED; sinh lại nếu NEEDS_FIX |
@@ -488,6 +488,7 @@ Skip loại nào không có doc / không có revision đã lưu (`—`).
488
488
  *Bỏ qua step này nếu không có file TSV nào (đã xử lý bởi path no-TSV của Step 1).*
489
489
 
490
490
  Với mỗi file `.tsv` đã xử lý: ghi `spec_ver`, `status`, `last_updated` đã cập nhật lại disk.
491
+ Đồng thời **đồng bộ `uc_status` ← `@trace.status`** của file `.feature` tương ứng (header `.feature` là nguồn-sự-thật về duyệt BDD — người đặt `approved` sau khi review sạch, giống PO đặt PRD Metadata `Status`). Nhờ vậy `approved_ucs` trên dashboard phản ánh đúng thay vì luôn = 0.
491
492
  **Đừng** sửa `dev_selftest`/`dev_selftest_at` (do `/dev-run-test` sở hữu) hay `qc_status`/`qc_run_at`/`qc_owner`/`qc_blocked_by` (do `/qc-run-test` + `/report-bug` sở hữu); lệnh này chỉ đọc chúng cho report.
492
493
 
493
494
  ### Step 7 — Tính aggregate cho dashboard
@@ -757,7 +758,7 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
757
758
  | /define-product | `/generate-prd {product-definition-file}` |
758
759
  | /generate-prd | `/refine-prd {prd-file}` rồi `/review-context {prd-file}` |
759
760
  | /refine-prd | Mở Review Board → cập nhật PRD → `/review-context {prd-file}` |
760
- | /review-context (PRD) | FE/App: `/generate-design-spec {prd-file}` (rồi BDD sau khi sign-off); BE: `/generate-bdd {prd-file}` trực tiếp; sửa PRD nếu NEEDS_FIX |
761
+ | /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) |
761
762
  | /generate-design-spec | Designer review → xác nhận link Figma → PO + Designer sign-off → `/generate-bdd {prd-file}` |
762
763
  | /generate-bdd | `/review-context {feature-file}` để kiểm tra độ phủ |
763
764
  | /review-context (BDD) | `/generate-tech-docs {UC-ID}` nếu APPROVED; sinh lại nếu NEEDS_FIX |
@@ -93,6 +93,7 @@ Skip loại nào không có doc / không có revision đã lưu (`—`).
93
93
  *Bỏ qua step này nếu không có file TSV nào (đã xử lý bởi path no-TSV của Step 1).*
94
94
 
95
95
  Với mỗi file `.tsv` đã xử lý: ghi `spec_ver`, `status`, `last_updated` đã cập nhật lại disk.
96
+ Đồng thời **đồng bộ `uc_status` ← `@trace.status`** của file `.feature` tương ứng (header `.feature` là nguồn-sự-thật về duyệt BDD — người đặt `approved` sau khi review sạch, giống PO đặt PRD Metadata `Status`). Nhờ vậy `approved_ucs` trên dashboard phản ánh đúng thay vì luôn = 0.
96
97
  **Đừng** sửa `dev_selftest`/`dev_selftest_at` (do `/dev-run-test` sở hữu) hay `qc_status`/`qc_run_at`/`qc_owner`/`qc_blocked_by` (do `/qc-run-test` + `/report-bug` sở hữu); lệnh này chỉ đọc chúng cho report.
97
98
 
98
99
  ### Step 7 — Tính aggregate cho dashboard
@@ -1 +1 @@
1
- 0.14.6
1
+ 0.14.8
@@ -672,7 +672,7 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
672
672
  | /define-product | `/generate-prd {product-definition-file}` |
673
673
  | /generate-prd | `/refine-prd {prd-file}` rồi `/review-context {prd-file}` |
674
674
  | /refine-prd | Mở Review Board → cập nhật PRD → `/review-context {prd-file}` |
675
- | /review-context (PRD) | FE/App: `/generate-design-spec {prd-file}` (rồi BDD sau khi sign-off); BE: `/generate-bdd {prd-file}` trực tiếp; sửa PRD nếu NEEDS_FIX |
675
+ | /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) |
676
676
  | /generate-design-spec | Designer review → xác nhận link Figma → PO + Designer sign-off → `/generate-bdd {prd-file}` |
677
677
  | /generate-bdd | `/review-context {feature-file}` để kiểm tra độ phủ |
678
678
  | /review-context (BDD) | `/generate-tech-docs {UC-ID}` nếu APPROVED; sinh lại nếu NEEDS_FIX |