@edupia-tutor/spec-driven-docs 0.14.7 → 0.14.9
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.
- package/commands/generate-bdd.md +76 -8
- package/commands/generate-bdd.tmpl +56 -108
- package/commands/generate-code.md +18 -1
- package/commands/generate-code.tmpl +18 -1
- package/commands/generate-design-spec.md +35 -5
- package/commands/generate-design-spec.tmpl +35 -5
- package/commands/generate-prd.md +15 -5
- package/commands/generate-prd.tmpl +1 -0
- package/commands/generate-tech-docs.md +1 -0
- package/commands/generate-tech-docs.tmpl +1 -0
- package/commands/propose-scenario.md +6 -2
- package/commands/propose-scenario.tmpl +6 -2
- package/commands/qc-analyze.md +14 -0
- package/commands/qc-analyze.tmpl +14 -0
- package/commands/refine-prd.md +25 -6
- package/commands/refine-prd.tmpl +18 -6
- package/commands/review-context.md +27 -12
- package/commands/review-context.tmpl +20 -12
- package/commands/validate-traces.md +1 -0
- package/commands/validate-traces.tmpl +1 -0
- package/core/FRAMEWORK_VERSION +1 -1
- package/core/commands/generate-bdd.md +76 -8
- package/core/commands/generate-code.md +18 -1
- package/core/commands/generate-design-spec.md +35 -5
- package/core/commands/generate-prd.md +15 -5
- package/core/commands/generate-tech-docs.md +1 -0
- package/core/commands/propose-scenario.md +6 -2
- package/core/commands/qc-analyze.md +14 -0
- package/core/commands/refine-prd.md +25 -6
- package/core/commands/review-context.md +27 -12
- package/core/commands/validate-traces.md +1 -0
- package/core/skills/code/SKILL.md +7 -759
- package/core/skills/debug/SKILL.md +9 -859
- package/core/skills/design-spec/SKILL.md +3 -582
- package/core/skills/prd/SKILL.md +5 -464
- package/core/skills/setup-ai-first/SKILL.md +3 -208
- package/core/skills/spec/SKILL.md +7 -450
- package/core/skills/test/SKILL.md +10 -1290
- package/core/steps/review-fanout.md +7 -0
- package/core/steps/spawn-agent.md +12 -7
- package/core/templates/feature.template +83 -222
- package/core/templates/prd.template.md +14 -5
- package/core/templates/project-context.yaml +1 -1
- package/docs/01-getting-started/core-concepts.md +2 -2
- package/docs/01-getting-started/quickstart.md +4 -3
- package/docs/02-guides/bdd-input-checklist.md +68 -0
- package/docs/02-guides/developer/README.md +3 -0
- package/docs/02-guides/developer/bdd-and-trace.md +1 -0
- package/docs/02-guides/developer/commands.md +3 -3
- package/docs/02-guides/developer/pr-checklist.md +1 -0
- package/docs/02-guides/developer/workflow.md +2 -2
- package/docs/02-guides/prd-input-checklist.md +94 -0
- package/docs/02-guides/product-owner/README.md +3 -1
- package/docs/02-guides/product-owner/commands.md +1 -1
- package/docs/02-guides/tech-docs-input-checklist.md +82 -0
- package/docs/02-guides/tester/README.md +1 -1
- package/docs/02-guides/tester/bug-reporting.md +1 -1
- package/docs/02-guides/tester/qc-automation.md +1 -1
- package/docs/03-concepts/README.md +1 -0
- package/docs/03-concepts/mechanisms-explained.md +57 -0
- package/docs/03-concepts/pipeline.md +12 -9
- package/docs/03-concepts/traceability.md +4 -1
- package/docs/04-operations/bug-flow.md +2 -0
- package/docs/05-reference/command-cheatsheet.md +8 -8
- package/docs/05-reference/commands.md +12 -10
- package/docs/05-reference/trace-schema.md +2 -1
- package/package.json +1 -1
- package/skills/code/SKILL.md +7 -759
- package/skills/code/SKILL.tmpl +7 -164
- package/skills/debug/SKILL.md +9 -859
- package/skills/debug/SKILL.tmpl +9 -252
- package/skills/design-spec/SKILL.md +3 -582
- package/skills/design-spec/SKILL.tmpl +3 -87
- package/skills/prd/SKILL.md +5 -464
- package/skills/prd/SKILL.tmpl +5 -63
- package/skills/setup-ai-first/SKILL.md +3 -208
- package/skills/setup-ai-first/SKILL.tmpl +3 -108
- package/skills/spec/SKILL.md +7 -450
- package/skills/spec/SKILL.tmpl +7 -162
- package/skills/test/SKILL.md +10 -1290
- package/skills/test/SKILL.tmpl +10 -288
- package/steps/review-fanout.md +7 -0
- package/steps/spawn-agent.md +12 -7
- package/templates/feature.template +83 -222
- package/templates/prd.template.md +14 -5
- package/templates/project-context.yaml +1 -1
|
@@ -401,7 +401,20 @@ Sau khi hoàn thành tất cả các bước, bạn đã nạp:
|
|
|
401
401
|
Tiếp tục sang bước kế tiếp của lệnh đang gọi.
|
|
402
402
|
|
|
403
403
|
|
|
404
|
-
> **Proposal của tester (input tuỳ chọn):** trước khi sinh,
|
|
404
|
+
> **Proposal của tester (input tuỳ chọn):** trước khi sinh, quét `{paths.bdd_proposals_dir}/` (mặc định `{spec_source}/feedback/bdd-proposals/`) tìm `{UC-ID}-*.md`. Với mỗi proposal:
|
|
405
|
+
> - `Status: accepted` (PO/Dev đã duyệt) → chèn scenario vào `.feature` của UC (giữ `@trace`), rồi **lưu trữ**: chuyển file sang `{paths.bdd_proposals_dir}/archived/` + đặt `Status: incorporated`, và **commit + push** spec repo để gỡ khỏi feedback chung.
|
|
406
|
+
> - `Status: proposed`/`rejected` (hoặc thiếu `Status`) → **bỏ qua**, để nguyên cho PO/Dev xử lý (KHÔNG tự đoán, KHÔNG tự đưa vào).
|
|
407
|
+
> Bỏ qua sạch nếu folder rỗng.
|
|
408
|
+
|
|
409
|
+
---
|
|
410
|
+
|
|
411
|
+
## Sub-Agent Mode — dùng state từ payload *(nếu `_agent_mode`)*
|
|
412
|
+
|
|
413
|
+
*Chỉ khi Gate Step 0 phát hiện `_agent_mode: true` (đang chạy như sub-agent do orchestration spawn).* Orchestrator (session chính) đã chạy các Guard + chọn platform + nạp design-spec **một lần**; sub-agent KHÔNG lặp lại:
|
|
414
|
+
- `active_platform` = `payload.active_platform` → **bỏ qua** Platform Selection / Service Detection.
|
|
415
|
+
- `design_coverage` = `payload.design_coverage` → **bỏ qua** "Design Spec — Gate & Load"; nếu rỗng thì chỉ phủ Wireframe PRD.
|
|
416
|
+
- **Bỏ qua** Guard "PRD đã duyệt" + Guard Design-Spec bên dưới (orchestrator đã kiểm).
|
|
417
|
+
- Đi thẳng tới UC Decomposition + Generate cho `payload.uc_id`, dùng `design_coverage` để phủ Screen States + AC-UI.
|
|
405
418
|
|
|
406
419
|
---
|
|
407
420
|
|
|
@@ -609,6 +622,41 @@ Chỉ cần kiểm tra trạng thái đã phân giải:
|
|
|
609
622
|
|
|
610
623
|
---
|
|
611
624
|
|
|
625
|
+
## Design Spec — Gate & Load (chỉ FE/App)
|
|
626
|
+
|
|
627
|
+
*Chỉ chạy khi target platform là FE/App — spec mode: `active_platform ∈ {web, app, app-ios, app-android}`; umbrella mode: `active_module` là module FE/App (react/nextjs/vue/nuxt/angular/flutter/react-native/ios-swiftui/android-compose). Bỏ qua HOÀN TOÀN với `system` và backend/brownfield.*
|
|
628
|
+
|
|
629
|
+
**1. Định vị design-spec của platform:**
|
|
630
|
+
`{paths.specs_dir}/{domain}/{prd-slug}/design-spec/{TICKET-ID}-design-spec-{active_platform}-{slug}.md`
|
|
631
|
+
- `app-ios`/`app-android` không có bản riêng → fallback bản `-app-`.
|
|
632
|
+
|
|
633
|
+
**2. Guard — sign-off & độ tươi (cảnh báo MỀM, đồng bộ Guard PRD — không chặn cứng):**
|
|
634
|
+
Đọc `| **Status** |` và `| **Built from PRD** |` từ Metadata design-spec.
|
|
635
|
+
- Không tìm thấy file, HOẶC `Status ≠ approved`, HOẶC design-spec còn màn ❌ Missing, HOẶC `Built from PRD` ≠ `| **Version** |` của PRD hiện tại (design-spec **lỗi thời** so với PRD) → CHECKPOINT:
|
|
636
|
+
```
|
|
637
|
+
⚠️ Design Spec cho {active_platform} chưa sẵn sàng (Status: {status} / không có / còn màn thiếu Figma / lỗi thời: dựng từ PRD v{old}, PRD giờ v{new}).
|
|
638
|
+
BDD FE/App nên sinh từ design-spec đã approved & cập nhật để phủ đúng Screen States + AC-UI.
|
|
639
|
+
Khuyến nghị: hoàn tất / cập nhật design-spec (chạy lại /generate-design-spec nếu PRD đã đổi) rồi mới sinh BDD.
|
|
640
|
+
Vẫn sinh BDD bây giờ? (Y/N)
|
|
641
|
+
```
|
|
642
|
+
Chỉ tiếp khi chọn Y. Nếu Y mà KHÔNG có design-spec → bỏ qua bước 3 (chỉ phủ Wireframe PRD §4b).
|
|
643
|
+
- `Status: approved` VÀ `Built from PRD` khớp PRD hiện tại → nạp design-spec, sang bước 2.5.
|
|
644
|
+
|
|
645
|
+
**2.5. Sanity-scan nội dung design-spec** (lớp soi độc lập — D1; soi nhanh ngay tại chỗ đã mở file, trước khi dùng):
|
|
646
|
+
Quét tìm cờ đỏ; nếu có → **cảnh báo mềm** (liệt kê + hỏi "Vẫn dùng design-spec này? (Y/N)"):
|
|
647
|
+
- Màn nào thiếu state `loading`/`error`/`empty`.
|
|
648
|
+
- AC-UI nào mơ hồ, không testable ("looks good" / "đẹp" / không pass-fail rõ).
|
|
649
|
+
- Component còn `[NEW]` / `[TODO]` (chưa chốt với designer).
|
|
650
|
+
- Còn `❌ Missing` frame (lẽ ra Status đã `draft` — approved mà vẫn Missing là bất thường).
|
|
651
|
+
Bắt lỗi design-spec **ngay trước khi nó lan xuống BDD**. Chọn N → quay lại hoàn thiện design-spec; chọn Y → sang bước 3.
|
|
652
|
+
|
|
653
|
+
**3. Trích coverage từ design-spec** (lưu thành `design_coverage`, dùng ở UC Decomposition + Coverage Matrix):
|
|
654
|
+
- **Screen States** ≠ `default` cho mỗi màn: `loading`, `error`, `empty`, `success` (cái nào có).
|
|
655
|
+
- **AC-UI behavioral**: giữ AC-UI mà cột `Verified by` là **PO/QA** và mô tả outcome quan sát được (lỗi + đường khôi phục, empty state + CTA, gesture điều hướng, có loading state). **LOẠI AC-UI visual thuần** (khớp Figma trong dung sai, tương phản WCAG, màu/pixel/animation — thường `Verified by: Designer`): Designer/QA review riêng, KHÔNG đưa vào Gherkin (giữ R3/R5/R6).
|
|
656
|
+
- **Dedup**: nếu một Screen State / AC-UI đã trùng một AC nghiệp vụ của PRD → không tạo SC mới, chỉ ghi nhận đã phủ.
|
|
657
|
+
|
|
658
|
+
---
|
|
659
|
+
|
|
612
660
|
## Orchestration Check
|
|
613
661
|
|
|
614
662
|
*Bỏ qua section này nếu đã ở sub-agent mode (Step 0 của Gate đã kích hoạt).*
|
|
@@ -655,7 +703,7 @@ Trước khi sinh, kiểm tra các file `.feature` có sẵn cho PRD này:
|
|
|
655
703
|
- So với version PRD hiện tại.
|
|
656
704
|
- Nếu **giống** → hỏi: "BDD đã sinh từ PRD v{version}. Gen lại? (Y/N)"
|
|
657
705
|
- Nếu **khác** (PRD đã cập nhật):
|
|
658
|
-
1. Đọc `# Change Log` từ PRD — trích tất cả row mới hơn `@trace.prd_version` của BDD hiện có.
|
|
706
|
+
1. Đọc `# Change Log` từ PRD — trích tất cả row mới hơn `@trace.prd_version` của BDD hiện có. **Nếu `@trace.prd_version` của BDD CŨ HƠN row cũ nhất còn trong bảng** (lịch sử đã bị cắt sang `changelog/`) → không thấy đủ diff → **khuyến nghị F** (gen lại toàn bộ), đừng tin Y một phần.
|
|
659
707
|
2. Hiện CHECKPOINT:
|
|
660
708
|
```
|
|
661
709
|
⚠️ Phát hiện PRD version drift
|
|
@@ -670,7 +718,7 @@ Trước khi sinh, kiểm tra các file `.feature` có sẵn cho PRD này:
|
|
|
670
718
|
F — gen lại toàn bộ scenario
|
|
671
719
|
N — huỷ
|
|
672
720
|
```
|
|
673
|
-
3. Tiếp tục theo lựa chọn của người dùng.
|
|
721
|
+
3. Tiếp tục theo lựa chọn của người dùng. **Nếu changelog row không nêu rõ UC/AC/BR bị đổi (mơ hồ) → khuyến nghị F** (gen lại toàn bộ) thay vì Y, để khỏi sót scenario bị ảnh hưởng (lưới an toàn — không chắc đổi ở đâu thì quét rộng).
|
|
674
722
|
|
|
675
723
|
---
|
|
676
724
|
|
|
@@ -693,7 +741,7 @@ Trước khi sinh, kiểm tra các file `.feature` có sẵn cho PRD này:
|
|
|
693
741
|
|
|
694
742
|
| Check | Rule |
|
|
695
743
|
|-------|------|
|
|
696
|
-
| C.1 Wireframe Coverage | Mỗi component/action trong Wireframe có ≥1 SC. |
|
|
744
|
+
| C.1 Wireframe Coverage | Mỗi component/action trong Wireframe (PRD §4b) có ≥1 SC. **FE/App: mỗi Screen State (≠default) và mỗi AC-UI behavioral của design-spec (`design_coverage`) cũng phải có ≥1 SC** — dedup với AC nghiệp vụ PRD; bỏ AC-UI visual thuần. |
|
|
697
745
|
| C.2 PRD Traceability | Mỗi AC và mỗi BR (gồm từng bullet logic) map tới ≥1 SC. |
|
|
698
746
|
| C.3 Business Dictionary | Dùng đúng canonical term từ business-dictionary.md. |
|
|
699
747
|
| C.4 Banned Terms | 0 banned term trong file — grep trước khi gen. |
|
|
@@ -742,6 +790,8 @@ Với mỗi UC trong PRD, trình bày outline SC **trước khi sinh**:
|
|
|
742
790
|
BRs covered: {TICKET-ID}-UC1-BR1, BR2, BR3
|
|
743
791
|
```
|
|
744
792
|
|
|
793
|
+
*(FE/App: nếu đã nạp design-spec (xem "Design Spec — Gate & Load"), đưa Screen State ≠default (loading/error/empty) + AC-UI behavioral của `design_coverage` vào outline — dedup với AC nghiệp vụ, đừng tạo SC trùng.)*
|
|
794
|
+
|
|
745
795
|
CHECKPOINT: "Outline này đúng chưa? Bạn muốn thêm hay bớt SC nào không?" → **Chờ confirm trước khi sinh.**
|
|
746
796
|
|
|
747
797
|
---
|
|
@@ -787,6 +837,20 @@ Với mỗi UC, ghi vào path đã phân giải ở trên. Dùng từ vựng cho
|
|
|
787
837
|
# Tham chiếu nhanh các term dùng trong feature này. Chi tiết SoT: business-dictionary.md
|
|
788
838
|
# <Term 1>: <định nghĩa ngắn>
|
|
789
839
|
# <Term 2>: <định nghĩa ngắn>
|
|
840
|
+
#
|
|
841
|
+
# --- Popup/Modal Lifecycle (tùy chọn — BẮT BUỘC nếu feature là popup/modal; Pre-merge yêu cầu) ---
|
|
842
|
+
# - Open trigger: <khi nào popup hiển thị, vd: click menu sidebar>
|
|
843
|
+
# - Close trigger: <khi nào popup đóng, vd: F5 / click X / ESC / navigate away>
|
|
844
|
+
# - Refresh model: <data refresh khi nào, vd: mỗi lần open (NO CACHE) / persisted / polling>
|
|
845
|
+
# - State reset: <state nào reset khi đóng/mở lại, vd: pagination, expand, dropdown selection>
|
|
846
|
+
#
|
|
847
|
+
# --- Display Logic Matrix (tùy chọn — BẮT BUỘC nếu display logic phụ thuộc ≥2 chiều; Pre-merge yêu cầu) ---
|
|
848
|
+
# Liệt kê đủ ma trận N×M case + map mỗi case → SC. Tên SC theo pattern `<cấu trúc>: <outcome>` (KHÔNG dùng "(Case X)").
|
|
849
|
+
# | # | Dim1 | Dim2 | Format hiển thị | SC |
|
|
850
|
+
# |---|------|------|------------------------|------|
|
|
851
|
+
# | 1 | 0 | 0 | `Tên hàng` | SC{} |
|
|
852
|
+
# | 2 | 0 | 1 | `Tên hàng (đơn vị)` | SC{} |
|
|
853
|
+
# | ... | ... | ... | ... | ... |
|
|
790
854
|
|
|
791
855
|
Feature: <Feature name>
|
|
792
856
|
As a <role>
|
|
@@ -834,11 +898,7 @@ Feature: <Feature name>
|
|
|
834
898
|
Given <state>
|
|
835
899
|
When <action>
|
|
836
900
|
Then <expected error handling>
|
|
837
|
-
```
|
|
838
901
|
|
|
839
|
-
### Coverage Matrix & Pre-merge Checklist *(thêm vào cuối mỗi file)*
|
|
840
|
-
|
|
841
|
-
```gherkin
|
|
842
902
|
# === PRD COVERAGE (C.1 + C.2) ===
|
|
843
903
|
# AC mapping:
|
|
844
904
|
# AC1 (...) → SC1, SC2
|
|
@@ -851,17 +911,25 @@ Feature: <Feature name>
|
|
|
851
911
|
# [x] <action 1> → SC1
|
|
852
912
|
# [x] <action 2> → SC2
|
|
853
913
|
# [ ] <action 3> → MISSING ← BLOCK MERGE
|
|
914
|
+
# Design Spec coverage (chỉ FE/App — C.1 mở rộng; bỏ khối này nếu không nạp design-spec):
|
|
915
|
+
# Screen "<screen>": loading → SC?, error → SC?, empty → SC?
|
|
916
|
+
# AC-UI behavioral: AC-UI3 (lỗi+khôi phục) → SC?, AC-UI4 (empty CTA) → SC?
|
|
917
|
+
# (bỏ AC-UI visual thuần: AC-UI1 khớp Figma, AC-UI5 WCAG — Designer/QA review riêng)
|
|
854
918
|
|
|
855
919
|
# === PRE-MERGE CHECKLIST ===
|
|
856
920
|
# - [ ] Mỗi SC có Side-effects + @trace.scenario + @trace.sc_version + @trace.business_rules
|
|
857
921
|
# - [ ] Coverage Matrix: 0 dòng MISSING (C.1)
|
|
922
|
+
# - [ ] FE/App: mỗi Screen State (≠default) + AC-UI behavioral của design-spec có ≥1 SC (C.1 mở rộng)
|
|
858
923
|
# - [ ] Mỗi AC/BR map tới ≥1 SC (C.2)
|
|
859
924
|
# - [ ] 0 banned term (C.4) — grep file trước khi merge
|
|
860
925
|
# - [ ] Feature ≥3 SC có NHÓM grouping theo business theme (C.5)
|
|
861
926
|
# - [ ] Nếu popup/modal: khai báo Popup/Modal Lifecycle trong BUSINESS DEFINITION
|
|
862
927
|
# - [ ] Nếu display logic ≥2 chiều: Display Logic Matrix trong BUSINESS DEFINITION
|
|
928
|
+
|
|
863
929
|
```
|
|
864
930
|
|
|
931
|
+
*(Template `.feature` là **single-source** ở `templates/feature.template` — sửa file đó để đổi cấu trúc mọi `.feature` sinh ra. Coverage Matrix + Pre-merge Checklist nằm ở **cuối** template, thêm vào cuối mỗi file.)*
|
|
932
|
+
|
|
865
933
|
---
|
|
866
934
|
|
|
867
935
|
## Write Trace State
|
|
@@ -422,7 +422,24 @@ Lệnh này giới hạn nghiêm ngặt trong **một file feature** được tr
|
|
|
422
422
|
1. Chỉ file `.feature` đã giới hạn scope
|
|
423
423
|
2. Tech-doc tại `{paths.tech_docs_dir}/{domain}/{prd-slug}/tech-docs/{UC-ID}-tech-design.md` (nếu tồn tại)
|
|
424
424
|
3. CLAUDE.md §architecture + §coding_standards
|
|
425
|
-
4. **(chỉ FE/App)** Design Spec
|
|
425
|
+
4. **(chỉ FE/App)** Design Spec — nạp qua **Guard** bên dưới (gate approved/độ-tươi + sanity), là nguồn của màn hình, component inventory, và link Figma frame từng-màn.
|
|
426
|
+
|
|
427
|
+
---
|
|
428
|
+
|
|
429
|
+
## Guard — BDD & Design Spec đã sẵn sàng chưa *(cảnh báo MỀM — đồng bộ generate-bdd)*
|
|
430
|
+
|
|
431
|
+
**BDD (mọi platform) — DS1:** đọc `# @trace.status:` từ header `.feature` target.
|
|
432
|
+
- `approved` → tiếp tục. Khác `approved` → CHECKPOINT mềm:
|
|
433
|
+
```
|
|
434
|
+
⚠️ BDD {UC-ID} đang @trace.status: {status} (chưa duyệt). Code sinh từ BDD chưa chốt có thể phải làm lại.
|
|
435
|
+
Vẫn sinh code bây giờ? (Y/N)
|
|
436
|
+
```
|
|
437
|
+
Chỉ tiếp khi chọn Y.
|
|
438
|
+
|
|
439
|
+
**Design Spec (chỉ FE/App — `@trace.platform` = web/app) — DS2:** định vị `{paths.specs_dir}/{domain}/{prd-slug}/design-spec/{TICKET-ID}-design-spec-{@trace.platform}-{slug}.md`, đọc `| **Status** |` + `| **Built from PRD** |`:
|
|
440
|
+
- Không có file, HOẶC `Status ≠ approved`, HOẶC còn màn ❌ Missing, HOẶC `Built from PRD` ≠ `| **Version** |` PRD hiện tại (lỗi thời) → CHECKPOINT mềm (liệt kê lý do + "Vẫn dùng design-spec này? (Y/N)"). Nếu Y mà KHÔNG có design-spec → sinh UI từ BDD + Wireframe PRD (thiếu chi tiết visual).
|
|
441
|
+
- **Sanity-scan** (như generate-bdd bước 2.5): màn thiếu state loading/error/empty, AC-UI không testable, component `[NEW]`/`[TODO]` chưa chốt, còn ❌ Missing frame → cảnh báo trong cùng CHECKPOINT.
|
|
442
|
+
- `Status: approved` VÀ `Built from PRD` khớp PRD hiện tại VÀ sạch cờ đỏ → dùng làm nguồn màn hình / component / Figma.
|
|
426
443
|
|
|
427
444
|
---
|
|
428
445
|
|
|
@@ -455,6 +455,30 @@ Dùng `active_module` và `platform_type` suy ra từ context loading:
|
|
|
455
455
|
|
|
456
456
|
---
|
|
457
457
|
|
|
458
|
+
## Version Check (PRD drift)
|
|
459
|
+
|
|
460
|
+
Trước khi sinh, kiểm tra design-spec đã tồn tại cho platform này:
|
|
461
|
+
`{paths.specs_dir}/{domain}/{prd-slug}/design-spec/{TICKET-ID}-design-spec-{active_platform}-{slug}.md`
|
|
462
|
+
Đọc `| **Version** |` hiện tại của PRD từ Metadata (vd `1.3`).
|
|
463
|
+
|
|
464
|
+
- **Không tồn tại** → sinh mới; ghi `| **Built from PRD** | v{prd_version hiện tại} |`.
|
|
465
|
+
- **Tồn tại** → đọc row `| **Built from PRD** |` của nó, so với `| **Version** |` PRD hiện tại:
|
|
466
|
+
- **Bằng nhau** → hỏi: "Design Spec đã dựng từ PRD v{x}. Sinh lại? (Y/N)".
|
|
467
|
+
- **Khác** (PRD đã đổi) → CHECKPOINT drift:
|
|
468
|
+
```
|
|
469
|
+
⚠️ Phát hiện PRD version drift
|
|
470
|
+
Design Spec dựng từ PRD v{old}; PRD giờ ở v{new}.
|
|
471
|
+
Thay đổi kể từ v{old} (đọc # Change Log của PRD):
|
|
472
|
+
{changelog rows}
|
|
473
|
+
Options:
|
|
474
|
+
Y — cập nhật phần ảnh hưởng (màn / flow đổi)
|
|
475
|
+
F — sinh lại toàn bộ
|
|
476
|
+
N — huỷ
|
|
477
|
+
```
|
|
478
|
+
- Khi sinh / sinh lại → cập nhật `| **Built from PRD** | v{prd_version hiện tại} |`, bump `| **Version** |` Design Spec, **reset `| **Status** | draft |`** (design đổi → sign-off lại), thêm row Changelog.
|
|
479
|
+
|
|
480
|
+
---
|
|
481
|
+
|
|
458
482
|
## Screen Discovery
|
|
459
483
|
|
|
460
484
|
Từ Section 4 của PRD (User Flow + Wireframe), trích xuất mọi tên screen / page / modal được nhắc tới.
|
|
@@ -516,8 +540,8 @@ Nếu một màn chưa có design, gõ none cho màn đó.
|
|
|
516
540
|
|
|
517
541
|
**Gate bắt buộc (không abort — sinh ra draft):**
|
|
518
542
|
- Nếu **bất kỳ** màn nào ❌ Missing → spec được sinh dưới dạng **draft** với các màn đó
|
|
519
|
-
được gắn cờ,
|
|
520
|
-
|
|
543
|
+
được gắn cờ, `Status` giữ `draft` cho tới khi mọi màn có link frame đọc được, đã fetch.
|
|
544
|
+
`/generate-bdd` FE/App sẽ **cảnh báo mềm** (đồng bộ Guard PRD) nếu sinh BDD khi design-spec chưa `approved`. Ghi `missing_frames = [screens]`.
|
|
521
545
|
- Thêm một AI Assumption cho mỗi màn thiếu: "Không có Figma frame đọc được cho {screen} — spec
|
|
522
546
|
của màn này chỉ là text và không được sign off cho tới khi thêm link `node-id`."
|
|
523
547
|
|
|
@@ -603,6 +627,7 @@ Ghi `{paths.specs_dir}/{domain}/{prd-slug}/design-spec/{TICKET-ID}-design-spec-{
|
|
|
603
627
|
| **Service** | {active_service} |
|
|
604
628
|
| **Domain** | {domain} |
|
|
605
629
|
| **Business PRD** | [{TICKET-ID}](../{TICKET-ID}-{prd-slug}.md) |
|
|
630
|
+
| **Built from PRD** | v{prd_version — `\| **Version** \|` của PRD lúc sinh; dùng phát hiện drift} |
|
|
606
631
|
| **Figma** | {figma_url — link file feature} ({linked}/{N} frame đã link) |
|
|
607
632
|
| **Author** | {tên PO hoặc "AI-assisted"} |
|
|
608
633
|
| **Created** | {YYYY-MM-DD} |
|
|
@@ -830,7 +855,7 @@ Exit: {người dùng rời thế nào — back stack / chuyển tab / deeplink
|
|
|
830
855
|
|
|
831
856
|
---
|
|
832
857
|
|
|
833
|
-
##
|
|
858
|
+
## Self-Review Gate *(cổng tự-rà — bắt buộc chạy trước khi ghi)*
|
|
834
859
|
|
|
835
860
|
- [ ] Mọi màn trong Screen Inventory có Screen Spec đầy đủ ở Section 2
|
|
836
861
|
- [ ] Mọi màn có tối thiểu các state: default, loading, error
|
|
@@ -841,7 +866,12 @@ Exit: {người dùng rời thế nào — back stack / chuyển tab / deeplink
|
|
|
841
866
|
- [ ] Link cross-reference Business PRD là relative path hợp lệ
|
|
842
867
|
- [ ] Mọi màn có link Figma frame node-level (`?node-id=`) — và các màn có link đã được fetch qua Figma MCP và dùng để ground spec
|
|
843
868
|
- [ ] Mỗi màn ❌ Missing được gắn cờ trong spec (`> [DRAFT — no Figma frame...]`), liệt kê trong Figma Summary, và có một AI Assumption
|
|
844
|
-
- [ ] Nếu bất kỳ màn nào ❌ Missing → Status giữ `draft`
|
|
869
|
+
- [ ] Nếu bất kỳ màn nào ❌ Missing → Status giữ `draft` (generate-bdd FE/App cảnh báo mềm, không chặn cứng)
|
|
870
|
+
|
|
871
|
+
> **Đây là CỔNG, không phải nhắc nhở:** chạy từng mục trên TRƯỚC khi ghi file. Mục nào **FAIL** → **bắt buộc**:
|
|
872
|
+
> 1. ghi một dòng `⚠️ {mục thiếu — màn/section cụ thể}` vào section **"Giả định AI"** của file (đừng để lọt im lặng), VÀ
|
|
873
|
+
> 2. giữ `| **Status** | draft |` (chưa đủ điều kiện để PO+Designer sign-off `approved`).
|
|
874
|
+
> KHÔNG xuất design-spec như "hoàn chỉnh" khi còn mục fail chưa gắn cờ.
|
|
845
875
|
|
|
846
876
|
---
|
|
847
877
|
|
|
@@ -967,7 +997,7 @@ Next : Chia sẻ với Designer → PO + Designer sign-off (Status: approved)
|
|
|
967
997
|
Status : ⚠️ Warnings — {count} màn không có link Figma frame đọc được: {missing_frames ngăn cách bởi dấu phẩy}
|
|
968
998
|
Output Artifacts:
|
|
969
999
|
created {paths.specs_dir}/{domain}/{prd-slug}/design-spec/{TICKET-ID}-design-spec-{active_platform}-{slug}.md (v1.0, draft)
|
|
970
|
-
Next : 🔒
|
|
1000
|
+
Next : 🔒 Khuyến nghị hoàn tất sign-off trước (đủ link Figma node-id); /generate-bdd FE/App sẽ cảnh báo nếu design-spec chưa approved.
|
|
971
1001
|
1. Trong Figma: chọn mỗi frame còn thiếu → chuột phải → Copy link to selection
|
|
972
1002
|
2. Chạy lại /generate-design-spec {prd-file} → AI fetch & ground các frame mới
|
|
973
1003
|
```
|
|
@@ -624,6 +624,8 @@ Ghi `{paths.specs_dir}/{domain}/{prd-slug}/{TICKET-ID}-{prd-slug}.md` theo cấu
|
|
|
624
624
|
|
|
625
625
|
## b. Phạm vi
|
|
626
626
|
|
|
627
|
+
> **Scope = ranh giới, KHÔNG phải đặc tả.** Mỗi mục một dòng ngắn "làm gì / không làm gì". Đừng nhét **cơ chế** (retry/timeout/nhánh lỗi → BR/BL) hay **định nghĩa thuật ngữ** (vd "điểm khởi tạo = …" → Business Definition / business-dictionary) vào đây.
|
|
628
|
+
|
|
627
629
|
**In Scope**
|
|
628
630
|
- {hạng mục trong phạm vi 1}
|
|
629
631
|
- {hạng mục trong phạm vi 2}
|
|
@@ -642,10 +644,14 @@ Ghi `{paths.specs_dir}/{domain}/{prd-slug}/{TICKET-ID}-{prd-slug}.md` theo cấu
|
|
|
642
644
|
# 2. Acceptance Criteria
|
|
643
645
|
|
|
644
646
|
> Mỗi AC kế thừa liên kết "Bắt nguồn từ BR" của Product Definition (Phase 6), remap sang BR ID của PRD. Vì BR ID đã chứa số UC nên ref BR truy ngược được tới đúng UC.
|
|
647
|
+
>
|
|
648
|
+
> **1 AC = 1 tiêu chí NGHIỆM THU (outcome quan sát/kiểm được) + ref BR.** KHÔNG viết cơ chế trong AC (số lần retry, timeout, tên/chủ cờ, nhánh lỗi chi tiết) — cái đó thuộc **BR/BL** ở §3, AC chỉ trỏ tới. Nếu tiêu chí có **nhiều nhánh** → tách **bullet con** (mỗi ý một dòng), đừng dồn thành câu dài. Khi `/refine-prd` làm rõ thêm: chi tiết cơ chế → đẩy sang BR/BL; ở tầng AC thì tách bullet/AC mới — KHÔNG nối mệnh đề vào câu cũ (tránh AC thành "đoạn văn" và trùng BR).
|
|
645
649
|
|
|
646
650
|
**AC1:** {Tiêu chí nghiệm thu, văn xuôi, kiểm chứng được.} _(BR: {TICKET}-{N}-UC{n}-BR{m})_
|
|
647
651
|
|
|
648
|
-
**AC2:** {
|
|
652
|
+
**AC2:** {Tiêu chí có nhiều nhánh — tách bullet:} _(BR: {TICKET}-{N}-UC{n}-BR{m})_
|
|
653
|
+
- {nhánh/điều kiện 1 → kết quả kỳ vọng}
|
|
654
|
+
- {nhánh/điều kiện 2 → kết quả kỳ vọng}
|
|
649
655
|
|
|
650
656
|
---
|
|
651
657
|
|
|
@@ -752,11 +758,14 @@ _(Nếu không có độ vênh: ghi "Không có — toàn bộ nội dung đã
|
|
|
752
758
|
|
|
753
759
|
# Change Log
|
|
754
760
|
|
|
755
|
-
|
|
761
|
+
> Hiện tại: **v1.0** ({date}) · Lịch sử đầy đủ → [changelog](./changelog/{TICKET}-{N}-{slug}.changelog.md) *(file kho chỉ tạo khi changelog vượt 5 version)*
|
|
762
|
+
|
|
763
|
+
<!-- Bảng phẳng, MỘT dòng/version, MỚI NHẤT TRÊN CÙNG. Chỉ giữ tối đa 5 version gần nhất ở đây;
|
|
764
|
+
cũ hơn → /refine-prd & /review-context tự dồn (rollover) sang file changelog/ ở link trên. -->
|
|
756
765
|
|
|
757
|
-
|
|
|
758
|
-
|
|
759
|
-
|
|
|
766
|
+
| Version | Date | Changes (UC/AC/BR bị ảnh hưởng) |
|
|
767
|
+
|---------|------|---------------------------------|
|
|
768
|
+
| 1.0 | {date} | Bản đầu — sinh từ product-definition. |
|
|
760
769
|
|
|
761
770
|
---
|
|
762
771
|
|
|
@@ -774,6 +783,7 @@ _(Nếu không có độ vênh: ghi "Không có — toàn bộ nội dung đã
|
|
|
774
783
|
## Quality Checklist *(kiểm tra trước khi ghi)*
|
|
775
784
|
|
|
776
785
|
- [ ] Mọi AC đều testable (pass/fail rõ ràng), không có chi tiết kỹ thuật (API/token/DB) hay visual chi tiết (màu sắc, font, animation)
|
|
786
|
+
- [ ] **Altitude (AC vs BR/BL)**: AC chỉ nêu **outcome quan sát/kiểm được + ref BR** — KHÔNG chứa cơ chế (số lần retry, timeout, tên/chủ cờ, nhánh lỗi chi tiết); cơ chế nằm ở **BR/BL** (§3). AC không lặp lại nội dung BR nó ref. **Scope** = ranh giới (KHÔNG định nghĩa thuật ngữ / KHÔNG cơ chế)
|
|
777
787
|
- [ ] Mỗi UC có Actor / Description / Pre-condition / Post-condition
|
|
778
788
|
- [ ] §1c "Phụ thuộc liên service" có mặt: kế thừa từ discovery Phase 1 câu 8 (hoặc "Không có" nếu discovery trống); case partner song song có ghi phụ thuộc partner ở đây
|
|
779
789
|
- [ ] Business Rule (WHAT) và Business Logic (HOW) nằm chung bảng 3 cột `ID | Business Rule | Business Logic`
|
|
@@ -113,6 +113,7 @@ Chờ người dùng trả lời rõ ràng "Y" hoặc "N" rồi mới tiếp t
|
|
|
113
113
|
Rồi: /review-context --resume {feature-file} ← áp dụng các finding được chấp nhận còn lại
|
|
114
114
|
Rồi chạy lại: /generate-tech-docs {feature-file}
|
|
115
115
|
```
|
|
116
|
+
4. **Đồng thời** đọc `# @trace.status:` của `.feature` (tín hiệu duyệt chuẩn — B3): nếu ≠ `approved` → cảnh báo MỀM (đồng bộ qc-analyze/generate-code): "BDD chưa duyệt (@trace.status: {status}) — tech-docs sinh từ BDD chưa chốt có thể phải làm lại. Tiếp tục? (Y/N)". *(Nếu `approved` thì BDD đã sign-off; finding-gate ở trên vẫn chạy để chặn critical sót.)*
|
|
116
117
|
|
|
117
118
|
## Context
|
|
118
119
|
# Context Loader — Nạp toàn bộ context dự án
|
|
@@ -466,7 +466,10 @@ Viết Gherkin nhất quán với convention của `/generate-bdd` cho `active_p
|
|
|
466
466
|
|
|
467
467
|
Ghi vào `{paths.bdd_proposals_dir}/{UC-ID}-{slug}.md` (phân giải về `{spec_source}/feedback/bdd-proposals/` ở umbrella mode; tạo dir nếu cần).
|
|
468
468
|
KHÔNG đụng `.feature` canonical. Doc proposal chứa draft + metadata review
|
|
469
|
-
(xem Output)
|
|
469
|
+
(xem Output), **gồm dòng `Status: proposed`**. Nếu nguồn là một bug, tham chiếu `BUG-ID` của nó.
|
|
470
|
+
|
|
471
|
+
> **Vòng đời proposal** (máy đọc được để `/generate-bdd` intake đúng):
|
|
472
|
+
> `proposed` → PO/Dev duyệt đặt `accepted` (hoặc `rejected`) → `/generate-bdd` chèn cái `accepted` vào `.feature` rồi đặt `incorporated` + lưu trữ. **Chỉ `accepted` mới được đưa vào BDD.**
|
|
470
473
|
|
|
471
474
|
## Step 5 — Handoff (để PO/Dev thực sự thấy)
|
|
472
475
|
|
|
@@ -612,7 +615,8 @@ Scenario đề xuất (DRAFT — chờ PO/Dev review):
|
|
|
612
615
|
|
|
613
616
|
Để PO/Dev promote:
|
|
614
617
|
[ ] AC mapping đúng? (hoặc cập nhật PRD nếu requirement thực sự mới)
|
|
615
|
-
[ ]
|
|
618
|
+
[ ] Đặt `Status: accepted` trong file proposal (để /generate-bdd đưa vào)
|
|
619
|
+
[ ] Chạy lại /generate-bdd {UC-ID} — nó tự chèn proposal `accepted` vào .feature rồi lưu trữ
|
|
616
620
|
[ ] Rồi: /generate-code {UC-ID} + /dev-gen-test {UC-ID}
|
|
617
621
|
|
|
618
622
|
Handoff : {✅ committed + pushed to spec repo | ⚠️ chạy git command ở trên / mở PR}
|
|
@@ -411,6 +411,20 @@ Sau khi hoàn thành tất cả các bước, bạn đã nạp:
|
|
|
411
411
|
Tiếp tục sang bước kế tiếp của lệnh đang gọi.
|
|
412
412
|
|
|
413
413
|
|
|
414
|
+
---
|
|
415
|
+
|
|
416
|
+
## Guard — BDD đã duyệt chưa
|
|
417
|
+
|
|
418
|
+
Đọc `# @trace.status:` từ header file `.feature` của UC target:
|
|
419
|
+
- `approved` → tiếp tục bình thường.
|
|
420
|
+
- `draft` (hoặc khác `approved`) → **CHECKPOINT cảnh báo mềm** (không chặn cứng — cho phép QC sớm/prototype):
|
|
421
|
+
```
|
|
422
|
+
⚠️ BDD của {UC-ID} đang ở @trace.status: {status} (chưa duyệt). QC chạy trên BDD chưa chốt có thể phải làm lại.
|
|
423
|
+
Khuyến nghị: review-context (BDD) sạch + người duyệt đặt `# @trace.status: approved` rồi mới chạy QC.
|
|
424
|
+
Vẫn chạy QC bây giờ? (Y/N)
|
|
425
|
+
```
|
|
426
|
+
Chỉ tiếp khi chọn Y.
|
|
427
|
+
|
|
414
428
|
---
|
|
415
429
|
|
|
416
430
|
## Role
|
|
@@ -574,6 +574,13 @@ mới**, hoặc tới cap cứng **3 vòng**, cái nào đến trước:
|
|
|
574
574
|
List ONLY real, additional issues NOT already in the list — gaps, ambiguities,
|
|
575
575
|
contradictions, missing edge/negative paths, coverage holes, terminology drift,
|
|
576
576
|
structural omissions, and any issue that a fix to an existing finding would expose.
|
|
577
|
+
ALSO flag ROLE-BOUNDARY / altitude violations (you are NOT limited to adding detail):
|
|
578
|
+
content sitting in the WRONG section — detailed mechanism (retry counts, timeouts, flag
|
|
579
|
+
names/owners, error branches) written INSIDE an acceptance criterion or a scope line
|
|
580
|
+
instead of the Business Rule/Logic section; an AC that merely restates its referenced BR
|
|
581
|
+
(same content, converged); a term definition crammed into In/Out Scope. For these, the
|
|
582
|
+
suggestion must be to MOVE the detail to its proper section (AC keeps only the observable
|
|
583
|
+
outcome + BR ref) — NOT to delete it, and NOT to add more detail.
|
|
577
584
|
Do NOT repeat anything already listed. Return the same finding JSON shape, or [] if
|
|
578
585
|
nothing new.
|
|
579
586
|
```
|
|
@@ -638,8 +645,8 @@ Chạy review qua **Quy trình Review** ở trên (`steps/review-fanout.md`).
|
|
|
638
645
|
**DIMENSIONS** = 4 lăng kính dưới đây — fan out một sub-agent cho mỗi lăng kính, mỗi cái quét
|
|
639
646
|
toàn bộ PRD qua đúng lăng kính của nó:
|
|
640
647
|
|
|
641
|
-
- **Lăng kính QA**: AC có
|
|
642
|
-
- **Lăng kính DEV**:
|
|
648
|
+
- **Lăng kính QA (tầng nghiệm thu)**: AC có nêu **outcome quan sát/kiểm được** chưa? — **KHÔNG** hỏi "AC đủ chi tiết chưa" (câu đó kéo cơ chế vào AC). Chi tiết cơ chế (số lần retry, timeout, tên/chủ cờ, nhánh lỗi vụn) thuộc **BR/BL**: nếu gap là cơ chế → suggestion phải **route sang BR/BL + AC ref**, KHÔNG phình AC. AC có lặp lại nội dung BR (trùng tầng) không → nếu có, đề xuất làm mỏng AC.
|
|
649
|
+
- **Lăng kính DEV (tầng cơ chế)**: BR (WHAT) + Business Logic (HOW) đã đủ & rõ chưa — **đây là NƠI chứa chi tiết**: rẽ nhánh, điều kiện biên, retry, error path. Business rule có mơ hồ không? Cross-service deps đủ chưa? Rủi ro kỹ thuật?
|
|
643
650
|
- **Lăng kính SA**: Khớp kiến trúc hiện tại? Hệ luỵ security/auth? Mô hình dữ liệu rõ chưa?
|
|
644
651
|
- **Lăng kính PO**: Scope đã khoanh vùng? Priority rõ chưa? Success metric đã định nghĩa? Rủi ro scope creep?
|
|
645
652
|
|
|
@@ -886,6 +893,7 @@ Nếu có finding nào có `status: "needs_discussion"`, thêm warning block sau
|
|
|
886
893
|
Với mỗi finding được chấp nhận, theo thứ tự severity (critical → major → minor):
|
|
887
894
|
- Đi tới section PRD được chỉ định bởi `finding.section`.
|
|
888
895
|
- Áp dụng `finding.suggestion`. Với finding `status: "modified"`, người đã sửa sẵn `finding.suggestion` trong Review Board — giá trị đã sửa đó CHÍNH LÀ bản fix cần áp dụng.
|
|
896
|
+
- **Giữ ĐÚNG TẦNG + gọn khi áp fix (altitude):** AC = **outcome quan sát được + ref BR**, KHÔNG chứa cơ chế. Nếu fix là **chi tiết cơ chế/rule** (retry N, timeout, tên/chủ cờ, nhánh lỗi) → **ghi vào bảng BR/BL của UC** (hoặc tạo BR mới), AC chỉ **ref**; KHÔNG inline vào câu AC. Nếu fix làm rõ **≥2 điều kiện/nhánh** ở đúng tầng của nó → **tách bullet con** (mỗi ý một dòng ` - …`) hoặc **AC/BR mới**, đừng nối mệnh đề vào câu cũ. Một AC = một tiêu chí kiểm chứng; đừng để AC lặp lại nội dung BR.
|
|
889
897
|
- **Chạy Business Language Guard trên text mới TRƯỚC khi ghi** (xem section "Ngôn ngữ nghiệp vụ"): diễn đạt lại / gỡ thuật ngữ kỹ thuật-UI để fix không tự kéo theo term kỹ thuật vào PRD.
|
|
890
898
|
- Không thay đổi bất kỳ section nào không được tham chiếu bởi một finding được chấp nhận.
|
|
891
899
|
|
|
@@ -909,10 +917,21 @@ Cập nhật `status: "applied"` ở **root level** của file findings (không
|
|
|
909
917
|
- `| **Version** | {new_version} |`
|
|
910
918
|
- `| **Updated** | {today YYYY-MM-DD} |`
|
|
911
919
|
- `| **Status** | draft |` ← reset về draft, phải được duyệt lại
|
|
912
|
-
5.
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
920
|
+
5. Cập nhật `# Change Log` của PRD — **bảng phẳng 1 dòng/version, cửa sổ trượt 5 entry** (nếu gặp format cũ `### v{X}` block → chuẩn hoá sang bảng phẳng khi cập nhật):
|
|
921
|
+
- Thêm row mới lên **đầu** bảng:
|
|
922
|
+
```
|
|
923
|
+
| {new_version} | {today} | {tóm tắt — KÈM UC/AC/BR bị ảnh hưởng, vd "UC2: sửa BR5; thêm AC7"} |
|
|
924
|
+
```
|
|
925
|
+
*(Nêu rõ UC/AC/BR giúp `/generate-bdd` Version Check biết scenario nào cần cập nhật.)*
|
|
926
|
+
- Cập nhật dòng đầu section: `> Hiện tại: **v{new_version}** ({today}) · Lịch sử đầy đủ → [changelog](./changelog/{TICKET-ID}-{prd-slug}.changelog.md)`
|
|
927
|
+
- **Rollover (giữ PRD gọn — đây là chuẩn chung, /review-context cũng theo):** nếu bảng `# Change Log` có **> 5 row** → chuyển **mọi row vượt 5** (cũ nhất) sang **đầu** bảng của file kho `{paths.specs_dir}/{domain}/{prd-slug}/changelog/{TICKET-ID}-{prd-slug}.changelog.md` (giữ thứ tự mới→cũ); PRD chỉ giữ **5 row gần nhất**. Tạo thư mục `changelog/` + file kho nếu chưa có, theo skeleton:
|
|
928
|
+
```
|
|
929
|
+
# Change Log (lịch sử) — {TICKET-ID}
|
|
930
|
+
> PRD: [../{TICKET-ID}-{prd-slug}.md](../{TICKET-ID}-{prd-slug}.md) — 5 version gần nhất nằm trong PRD; đây là phần cũ hơn.
|
|
931
|
+
|
|
932
|
+
| Version | Date | Changes |
|
|
933
|
+
|---------|------|---------|
|
|
934
|
+
```
|
|
916
935
|
6. Ghi `applied_to_version: "{new_version}"` ở **root level** của findings — đóng dấu "PRD đổi tới version này là do lệnh này áp", để lần review delta sau phân biệt được thay đổi của chính mình với thay đổi do actor khác (xem "Chọn full vs delta").
|
|
917
936
|
|
|
918
937
|
### Phase 4 — Report
|
|
@@ -585,6 +585,13 @@ mới**, hoặc tới cap cứng **3 vòng**, cái nào đến trước:
|
|
|
585
585
|
List ONLY real, additional issues NOT already in the list — gaps, ambiguities,
|
|
586
586
|
contradictions, missing edge/negative paths, coverage holes, terminology drift,
|
|
587
587
|
structural omissions, and any issue that a fix to an existing finding would expose.
|
|
588
|
+
ALSO flag ROLE-BOUNDARY / altitude violations (you are NOT limited to adding detail):
|
|
589
|
+
content sitting in the WRONG section — detailed mechanism (retry counts, timeouts, flag
|
|
590
|
+
names/owners, error branches) written INSIDE an acceptance criterion or a scope line
|
|
591
|
+
instead of the Business Rule/Logic section; an AC that merely restates its referenced BR
|
|
592
|
+
(same content, converged); a term definition crammed into In/Out Scope. For these, the
|
|
593
|
+
suggestion must be to MOVE the detail to its proper section (AC keeps only the observable
|
|
594
|
+
outcome + BR ref) — NOT to delete it, and NOT to add more detail.
|
|
588
595
|
Do NOT repeat anything already listed. Return the same finding JSON shape, or [] if
|
|
589
596
|
nothing new.
|
|
590
597
|
```
|
|
@@ -713,8 +720,10 @@ Quét mỗi AC và BR tìm:
|
|
|
713
720
|
| Tham chiếu chưa định nghĩa | "{SomeThing}" được dùng nhưng chưa định nghĩa trong PRD này | Major |
|
|
714
721
|
| Thiếu luồng âm | AC chỉ mô tả happy path nhưng BR có điều kiện lỗi | Minor |
|
|
715
722
|
| Câu bị động giấu actor | "Invoice is created" — ai tạo? | Minor |
|
|
723
|
+
| **AC lấn tầng (chứa cơ chế)** | AC ghi số lần retry / timeout / tên-chủ cờ / nhánh lỗi chi tiết — cái này thuộc BR/BL | Major |
|
|
724
|
+
| **AC ≈ BR (trùng nội dung, hội tụ tầng)** | AC lặp lại đúng nội dung BR nó ref | Major |
|
|
716
725
|
|
|
717
|
-
→ AI không thể auto-fix finding P2. Người
|
|
726
|
+
→ AI không thể auto-fix finding P2. Người viết bản fix trong note "Modify". Với 2 tín hiệu **altitude** (AC lấn tầng / AC≈BR): suggestion là **DI DỜI chi tiết cơ chế xuống BR/BL (§3), AC giữ outcome + ref** — không xoá, không phình.
|
|
718
727
|
|
|
719
728
|
### P3 — Domain Conflict Check
|
|
720
729
|
|
|
@@ -994,8 +1003,10 @@ Lựa chọn tiếp theo:
|
|
|
994
1003
|
→ /review-context --resume {target-file}
|
|
995
1004
|
|
|
996
1005
|
{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
|
-
✅ PRD đã sạch critical. Khi PO hài lòng → đặt `| **Status** | approved |` trong
|
|
998
|
-
|
|
1006
|
+
{If PRD}: ✅ PRD đã sạch critical. Khi PO hài lòng → đặt `| **Status** | approved |` trong
|
|
1007
|
+
Metadata PRD (dấu duyệt nghiệp vụ, do người quyết) → rồi /generate-bdd.
|
|
1008
|
+
{If BDD}: ✅ BDD đã sạch critical. Sau khi review xong → đặt `# @trace.status: approved` trong
|
|
1009
|
+
header file .feature (dấu duyệt BDD, do người quyết) → rồi /generate-tech-docs.
|
|
999
1010
|
```
|
|
1000
1011
|
|
|
1001
1012
|
---
|
|
@@ -1050,8 +1061,8 @@ Sau khi áp dụng mỗi finding, đánh dấu nó `status: "applied"` + `applie
|
|
|
1050
1061
|
### Phase 3 — Version bump
|
|
1051
1062
|
|
|
1052
1063
|
- **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:
|
|
1053
|
-
|
|
1054
|
-
- **BDD**: nếu ≥1 finding được áp dụng → tăng `@trace.bdd_version` lên 0.1
|
|
1064
|
+
`| {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.
|
|
1065
|
+
- **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)
|
|
1055
1066
|
- **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").
|
|
1056
1067
|
|
|
1057
1068
|
### Phase 4 — Report
|
|
@@ -1068,13 +1079,14 @@ Còn pending (cần quyết định của con người): {N}
|
|
|
1068
1079
|
- F00X [{severity}] {tóm tắt finding} ← mở file findings trong Review Board
|
|
1069
1080
|
|
|
1070
1081
|
{If PRD}: Version bumped: {old} → {new} | Status: reset về draft (cần duyệt lại)
|
|
1071
|
-
{If BDD}: bdd_version: {old} → {new}
|
|
1082
|
+
{If BDD}: bdd_version: {old} → {new} | @trace.status: reset về draft (cần duyệt lại)
|
|
1072
1083
|
|
|
1073
1084
|
File findings:
|
|
1074
1085
|
{If PRD}: {paths.refinement_dir}/{prd-slug}-review-context-findings.yaml
|
|
1075
1086
|
{If BDD}: {paths.refinement_dir}/{uc-id}-review-bdd-findings.yaml
|
|
1076
1087
|
Chạy lại /review-context {file} để xác nhận 0 finding critical còn lại.
|
|
1077
|
-
Khi sạch critical + PO duyệt → đặt | **Status** | approved | trong Metadata rồi /generate-bdd.
|
|
1088
|
+
{If PRD}: Khi sạch critical + PO duyệt → đặt | **Status** | approved | trong Metadata rồi /generate-bdd.
|
|
1089
|
+
{If BDD}: Khi sạch critical + duyệt → đặt # @trace.status: approved trong header .feature rồi /generate-tech-docs.
|
|
1078
1090
|
```
|
|
1079
1091
|
|
|
1080
1092
|
Nếu 0 finding nào auto-fixable → in:
|
|
@@ -1108,6 +1120,8 @@ Với mỗi finding `accepted`/`modified` sau khi áp xong → đặt `status: "
|
|
|
1108
1120
|
|
|
1109
1121
|
> **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.
|
|
1110
1122
|
|
|
1123
|
+
> **Giữ ĐÚNG TẦNG + gọn khi áp fix (altitude):** AC = outcome quan sát được + ref BR, KHÔNG chứa cơ chế. Fix là **chi tiết cơ chế/rule** (retry, timeout, tên/chủ cờ, nhánh lỗi) → **di dời vào bảng BR/BL của UC** (hoặc BR mới), AC chỉ ref; KHÔNG inline vào AC. Fix làm rõ ≥2 nhánh ở đúng tầng → **tách bullet con** hoặc AC/BR mới, đừng nối mệnh đề vào câu cũ. Đừng để AC lặp lại nội dung BR.
|
|
1124
|
+
|
|
1111
1125
|
**Với finding PRD:**
|
|
1112
1126
|
| check_id | Làm gì |
|
|
1113
1127
|
|----------|-----------|
|
|
@@ -1117,7 +1131,7 @@ Với mỗi finding `accepted`/`modified` sau khi áp xong → đặt `status: "
|
|
|
1117
1131
|
| P4 (Structure) | Thêm section/metadata field còn thiếu (row Status vắng → thêm mặc định `draft`) |
|
|
1118
1132
|
| P5 (Custom) | Áp dụng như nêu trong suggestion/note |
|
|
1119
1133
|
|
|
1120
|
-
→ 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
|
|
1134
|
+
→ 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").
|
|
1121
1135
|
|
|
1122
1136
|
**Với finding BDD:**
|
|
1123
1137
|
| check_id | Làm gì |
|
|
@@ -1129,8 +1143,8 @@ Với mỗi finding `accepted`/`modified` sau khi áp xong → đặt `status: "
|
|
|
1129
1143
|
| B5 (Metadata) | Thêm @trace header còn thiếu, sinh lại Coverage Matrix / Pre-merge Checklist |
|
|
1130
1144
|
| B6 (Side effects) | Thêm `And <side-effect>` còn thiếu vào block Then |
|
|
1131
1145
|
|
|
1132
|
-
→ Sau khi áp dụng, tăng `@trace.bdd_version` trong header file lên 0.1.
|
|
1133
|
-
→ Đồ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.
|
|
1146
|
+
→ 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).
|
|
1147
|
+
→ Đồ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.
|
|
1134
1148
|
→ Ghi `applied_to_version: "{@trace.bdd_version mới}"` ở root level của findings (xem "Chọn full vs delta").
|
|
1135
1149
|
|
|
1136
1150
|
### Phase 3 — Report
|
|
@@ -1145,8 +1159,9 @@ Changes:
|
|
|
1145
1159
|
- {tóm tắt change 2}
|
|
1146
1160
|
|
|
1147
1161
|
{If PRD}: Version bumped: {old} → {new} | Status: reset về draft (cần duyệt lại)
|
|
1148
|
-
{If BDD}: bdd_version: {old} → {new}
|
|
1162
|
+
{If BDD}: bdd_version: {old} → {new} | @trace.status: reset về draft (cần duyệt lại)
|
|
1149
1163
|
|
|
1150
1164
|
Chạy lại /review-context {file} để xác nhận 0 finding critical còn lại.
|
|
1151
|
-
Khi sạch critical + PO duyệt → đặt | **Status** | approved | trong Metadata rồi /generate-bdd.
|
|
1165
|
+
{If PRD}: Khi sạch critical + PO duyệt → đặt | **Status** | approved | trong Metadata rồi /generate-bdd.
|
|
1166
|
+
{If BDD}: Khi sạch critical + duyệt → đặt # @trace.status: approved trong header .feature rồi /generate-tech-docs.
|
|
1152
1167
|
```
|
|
@@ -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
|