@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
package/commands/generate-bdd.md
CHANGED
|
@@ -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
|
|
@@ -6,7 +6,20 @@
|
|
|
6
6
|
## Context
|
|
7
7
|
{{include:steps/context-loader.md}}
|
|
8
8
|
|
|
9
|
-
> **Proposal của tester (input tuỳ chọn):** trước khi sinh,
|
|
9
|
+
> **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:
|
|
10
|
+
> - `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.
|
|
11
|
+
> - `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).
|
|
12
|
+
> Bỏ qua sạch nếu folder rỗng.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Sub-Agent Mode — dùng state từ payload *(nếu `_agent_mode`)*
|
|
17
|
+
|
|
18
|
+
*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:
|
|
19
|
+
- `active_platform` = `payload.active_platform` → **bỏ qua** Platform Selection / Service Detection.
|
|
20
|
+
- `design_coverage` = `payload.design_coverage` → **bỏ qua** "Design Spec — Gate & Load"; nếu rỗng thì chỉ phủ Wireframe PRD.
|
|
21
|
+
- **Bỏ qua** Guard "PRD đã duyệt" + Guard Design-Spec bên dưới (orchestrator đã kiểm).
|
|
22
|
+
- Đi thẳng tới UC Decomposition + Generate cho `payload.uc_id`, dùng `design_coverage` để phủ Screen States + AC-UI.
|
|
10
23
|
|
|
11
24
|
---
|
|
12
25
|
|
|
@@ -214,6 +227,41 @@ Chỉ cần kiểm tra trạng thái đã phân giải:
|
|
|
214
227
|
|
|
215
228
|
---
|
|
216
229
|
|
|
230
|
+
## Design Spec — Gate & Load (chỉ FE/App)
|
|
231
|
+
|
|
232
|
+
*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.*
|
|
233
|
+
|
|
234
|
+
**1. Định vị design-spec của platform:**
|
|
235
|
+
`{paths.specs_dir}/{domain}/{prd-slug}/design-spec/{TICKET-ID}-design-spec-{active_platform}-{slug}.md`
|
|
236
|
+
- `app-ios`/`app-android` không có bản riêng → fallback bản `-app-`.
|
|
237
|
+
|
|
238
|
+
**2. Guard — sign-off & độ tươi (cảnh báo MỀM, đồng bộ Guard PRD — không chặn cứng):**
|
|
239
|
+
Đọc `| **Status** |` và `| **Built from PRD** |` từ Metadata design-spec.
|
|
240
|
+
- 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:
|
|
241
|
+
```
|
|
242
|
+
⚠️ 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}).
|
|
243
|
+
BDD FE/App nên sinh từ design-spec đã approved & cập nhật để phủ đúng Screen States + AC-UI.
|
|
244
|
+
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.
|
|
245
|
+
Vẫn sinh BDD bây giờ? (Y/N)
|
|
246
|
+
```
|
|
247
|
+
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).
|
|
248
|
+
- `Status: approved` VÀ `Built from PRD` khớp PRD hiện tại → nạp design-spec, sang bước 2.5.
|
|
249
|
+
|
|
250
|
+
**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):
|
|
251
|
+
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)"):
|
|
252
|
+
- Màn nào thiếu state `loading`/`error`/`empty`.
|
|
253
|
+
- AC-UI nào mơ hồ, không testable ("looks good" / "đẹp" / không pass-fail rõ).
|
|
254
|
+
- Component còn `[NEW]` / `[TODO]` (chưa chốt với designer).
|
|
255
|
+
- Còn `❌ Missing` frame (lẽ ra Status đã `draft` — approved mà vẫn Missing là bất thường).
|
|
256
|
+
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.
|
|
257
|
+
|
|
258
|
+
**3. Trích coverage từ design-spec** (lưu thành `design_coverage`, dùng ở UC Decomposition + Coverage Matrix):
|
|
259
|
+
- **Screen States** ≠ `default` cho mỗi màn: `loading`, `error`, `empty`, `success` (cái nào có).
|
|
260
|
+
- **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).
|
|
261
|
+
- **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ủ.
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
217
265
|
## Orchestration Check
|
|
218
266
|
|
|
219
267
|
*Bỏ qua section này nếu đã ở sub-agent mode (Step 0 của Gate đã kích hoạt).*
|
|
@@ -260,7 +308,7 @@ Trước khi sinh, kiểm tra các file `.feature` có sẵn cho PRD này:
|
|
|
260
308
|
- So với version PRD hiện tại.
|
|
261
309
|
- Nếu **giống** → hỏi: "BDD đã sinh từ PRD v{version}. Gen lại? (Y/N)"
|
|
262
310
|
- Nếu **khác** (PRD đã cập nhật):
|
|
263
|
-
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ó.
|
|
311
|
+
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.
|
|
264
312
|
2. Hiện CHECKPOINT:
|
|
265
313
|
```
|
|
266
314
|
⚠️ Phát hiện PRD version drift
|
|
@@ -275,7 +323,7 @@ Trước khi sinh, kiểm tra các file `.feature` có sẵn cho PRD này:
|
|
|
275
323
|
F — gen lại toàn bộ scenario
|
|
276
324
|
N — huỷ
|
|
277
325
|
```
|
|
278
|
-
3. Tiếp tục theo lựa chọn của người dùng.
|
|
326
|
+
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).
|
|
279
327
|
|
|
280
328
|
---
|
|
281
329
|
|
|
@@ -298,7 +346,7 @@ Trước khi sinh, kiểm tra các file `.feature` có sẵn cho PRD này:
|
|
|
298
346
|
|
|
299
347
|
| Check | Rule |
|
|
300
348
|
|-------|------|
|
|
301
|
-
| C.1 Wireframe Coverage | Mỗi component/action trong Wireframe có ≥1 SC. |
|
|
349
|
+
| 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. |
|
|
302
350
|
| C.2 PRD Traceability | Mỗi AC và mỗi BR (gồm từng bullet logic) map tới ≥1 SC. |
|
|
303
351
|
| C.3 Business Dictionary | Dùng đúng canonical term từ business-dictionary.md. |
|
|
304
352
|
| C.4 Banned Terms | 0 banned term trong file — grep trước khi gen. |
|
|
@@ -347,6 +395,8 @@ Với mỗi UC trong PRD, trình bày outline SC **trước khi sinh**:
|
|
|
347
395
|
BRs covered: {TICKET-ID}-UC1-BR1, BR2, BR3
|
|
348
396
|
```
|
|
349
397
|
|
|
398
|
+
*(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.)*
|
|
399
|
+
|
|
350
400
|
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.**
|
|
351
401
|
|
|
352
402
|
---
|
|
@@ -360,112 +410,10 @@ CHECKPOINT: "Outline này đúng chưa? Bạn muốn thêm hay bớt SC nào kh
|
|
|
360
410
|
Với mỗi UC, ghi vào path đã phân giải ở trên. Dùng từ vựng cho active platform (từ Platform Selection hoặc Service Detection).
|
|
361
411
|
|
|
362
412
|
```gherkin
|
|
363
|
-
|
|
364
|
-
# @trace.id: {TICKET-ID}-UC{N}
|
|
365
|
-
# @trace.title: <Feature name>
|
|
366
|
-
# @trace.revision: 1 ← field tĩnh; dùng @trace.bdd_version để theo dõi version (tăng bởi /review-context --fix hoặc --resume)
|
|
367
|
-
# @trace.domain: <domain>
|
|
368
|
-
# @trace.platform: {active_platform — web | app | system | (bỏ trong umbrella mode)}
|
|
369
|
-
# @trace.service: {active_service — bỏ trong spec repo mode}
|
|
370
|
-
# @trace.module: {active_module trong umbrella mode; "unknown" trong spec repo mode}
|
|
371
|
-
# @trace.status: draft
|
|
372
|
-
# @trace.author: AI-generated
|
|
373
|
-
# @trace.created_at: {YYYY-MM-DD}
|
|
374
|
-
# @trace.prd: {TICKET-ID}
|
|
375
|
-
# @trace.prd_version: {đọc từ metadata PRD "| **Version** |"}
|
|
376
|
-
# @trace.bdd_version: {1.0 nếu gen mới; tăng 0.1 khi gen lại — vd 1.0 → 1.1}
|
|
377
|
-
# @trace.business_rules: {TICKET-ID}-UC{N}-BR1, {TICKET-ID}-UC{N}-BR2
|
|
378
|
-
# @trace.dataset: {domain}.testdata.yaml
|
|
379
|
-
# ============================================================
|
|
380
|
-
|
|
381
|
-
# === CONTEXT ===
|
|
382
|
-
# Actor: <vai trò thực hiện hành động, vd: Consumer, Staff, System>
|
|
383
|
-
# Screens: <các màn liên quan, vd: Cart → Confirm Order → Order Detail>
|
|
384
|
-
# Entities: <business entity, vd: Order, OrderItem, Consumer>
|
|
385
|
-
# Pre-state: <state dùng chung trước khi vào các scenario>
|
|
386
|
-
|
|
387
|
-
# === SCOPE ===
|
|
388
|
-
# In: <UC này phủ gì>
|
|
389
|
-
# Out: <cái gì KHÔNG thuộc UC này — link tới UC/feature khác (R10)>
|
|
390
|
-
|
|
391
|
-
# === BUSINESS DEFINITION ===
|
|
392
|
-
# Tham chiếu nhanh các term dùng trong feature này. Chi tiết SoT: business-dictionary.md
|
|
393
|
-
# <Term 1>: <định nghĩa ngắn>
|
|
394
|
-
# <Term 2>: <định nghĩa ngắn>
|
|
395
|
-
|
|
396
|
-
Feature: <Feature name>
|
|
397
|
-
As a <role>
|
|
398
|
-
I want to <action>
|
|
399
|
-
So that <business value>
|
|
400
|
-
|
|
401
|
-
Background:
|
|
402
|
-
Given <precondition dùng chung — dùng alias từ dataset, không phải ID kỹ thuật>
|
|
403
|
-
|
|
404
|
-
# ==========================================================
|
|
405
|
-
# NHÓM 1: <Business theme> (<BR refs>)
|
|
406
|
-
# ==========================================================
|
|
407
|
-
|
|
408
|
-
# Side-effects: <liệt kê ngắn các Then side-effect cần verify>
|
|
409
|
-
# @trace.scenario: {TICKET-ID}-UC{N}-SC1
|
|
410
|
-
# @trace.sc_version: 1.0
|
|
411
|
-
# @trace.business_rules: {TICKET-ID}-UC{N}-BR1
|
|
412
|
-
@happy
|
|
413
|
-
Scenario: <mô tả business outcome — dùng động từ chính xác: create/receive/assign/block>
|
|
414
|
-
Given <input state — alias từ dataset>
|
|
415
|
-
When <single action>
|
|
416
|
-
Then <main observable outcome>
|
|
417
|
-
And <side-effect 1 khai báo trong header>
|
|
418
|
-
|
|
419
|
-
# Side-effects: <...>
|
|
420
|
-
# @trace.scenario: {TICKET-ID}-UC{N}-SC2
|
|
421
|
-
# @trace.sc_version: 1.0
|
|
422
|
-
# @trace.business_rules: {TICKET-ID}-UC{N}-BR1
|
|
423
|
-
@happy @alternative
|
|
424
|
-
Scenario: <cùng theme NHÓM 1 nhưng path khác — vd: giá trị enum khác>
|
|
425
|
-
Given <state>
|
|
426
|
-
When <action>
|
|
427
|
-
Then <outcome>
|
|
428
|
-
|
|
429
|
-
# ==========================================================
|
|
430
|
-
# NHÓM 2: <Business theme 2> (<BR refs>)
|
|
431
|
-
# ==========================================================
|
|
432
|
-
|
|
433
|
-
# Side-effects: <...>
|
|
434
|
-
# @trace.scenario: {TICKET-ID}-UC{N}-SC3
|
|
435
|
-
# @trace.sc_version: 1.0
|
|
436
|
-
# @trace.business_rules: {TICKET-ID}-UC{N}-BR2
|
|
437
|
-
@edge
|
|
438
|
-
Scenario: <scenario boundary / error>
|
|
439
|
-
Given <state>
|
|
440
|
-
When <action>
|
|
441
|
-
Then <expected error handling>
|
|
413
|
+
{{include:templates/feature.template}}
|
|
442
414
|
```
|
|
443
415
|
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
```gherkin
|
|
447
|
-
# === PRD COVERAGE (C.1 + C.2) ===
|
|
448
|
-
# AC mapping:
|
|
449
|
-
# AC1 (...) → SC1, SC2
|
|
450
|
-
# AC2 (...) → SC3
|
|
451
|
-
# BR mapping (mỗi bullet PHẢI có ≥1 SC — C.2):
|
|
452
|
-
# {TICKET-ID}-UC{N}-BR1 (...) → SC1, SC2
|
|
453
|
-
# {TICKET-ID}-UC{N}-BR2 (...) → SC3
|
|
454
|
-
# Wireframe mapping (mỗi component/action ≥1 SC — C.1):
|
|
455
|
-
# Screen "<screen name>":
|
|
456
|
-
# [x] <action 1> → SC1
|
|
457
|
-
# [x] <action 2> → SC2
|
|
458
|
-
# [ ] <action 3> → MISSING ← BLOCK MERGE
|
|
459
|
-
|
|
460
|
-
# === PRE-MERGE CHECKLIST ===
|
|
461
|
-
# - [ ] Mỗi SC có Side-effects + @trace.scenario + @trace.sc_version + @trace.business_rules
|
|
462
|
-
# - [ ] Coverage Matrix: 0 dòng MISSING (C.1)
|
|
463
|
-
# - [ ] Mỗi AC/BR map tới ≥1 SC (C.2)
|
|
464
|
-
# - [ ] 0 banned term (C.4) — grep file trước khi merge
|
|
465
|
-
# - [ ] Feature ≥3 SC có NHÓM grouping theo business theme (C.5)
|
|
466
|
-
# - [ ] Nếu popup/modal: khai báo Popup/Modal Lifecycle trong BUSINESS DEFINITION
|
|
467
|
-
# - [ ] Nếu display logic ≥2 chiều: Display Logic Matrix trong BUSINESS DEFINITION
|
|
468
|
-
```
|
|
416
|
+
*(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.)*
|
|
469
417
|
|
|
470
418
|
---
|
|
471
419
|
|
|
@@ -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
|
|
|
@@ -27,7 +27,24 @@ Lệnh này giới hạn nghiêm ngặt trong **một file feature** được tr
|
|
|
27
27
|
1. Chỉ file `.feature` đã giới hạn scope
|
|
28
28
|
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)
|
|
29
29
|
3. CLAUDE.md §architecture + §coding_standards
|
|
30
|
-
4. **(chỉ FE/App)** Design Spec
|
|
30
|
+
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.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Guard — BDD & Design Spec đã sẵn sàng chưa *(cảnh báo MỀM — đồng bộ generate-bdd)*
|
|
35
|
+
|
|
36
|
+
**BDD (mọi platform) — DS1:** đọc `# @trace.status:` từ header `.feature` target.
|
|
37
|
+
- `approved` → tiếp tục. Khác `approved` → CHECKPOINT mềm:
|
|
38
|
+
```
|
|
39
|
+
⚠️ 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.
|
|
40
|
+
Vẫn sinh code bây giờ? (Y/N)
|
|
41
|
+
```
|
|
42
|
+
Chỉ tiếp khi chọn Y.
|
|
43
|
+
|
|
44
|
+
**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** |`:
|
|
45
|
+
- 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).
|
|
46
|
+
- **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.
|
|
47
|
+
- `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.
|
|
31
48
|
|
|
32
49
|
---
|
|
33
50
|
|
|
@@ -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
|
```
|
|
@@ -60,6 +60,30 @@ Dùng `active_module` và `platform_type` suy ra từ context loading:
|
|
|
60
60
|
|
|
61
61
|
---
|
|
62
62
|
|
|
63
|
+
## Version Check (PRD drift)
|
|
64
|
+
|
|
65
|
+
Trước khi sinh, kiểm tra design-spec đã tồn tại cho platform này:
|
|
66
|
+
`{paths.specs_dir}/{domain}/{prd-slug}/design-spec/{TICKET-ID}-design-spec-{active_platform}-{slug}.md`
|
|
67
|
+
Đọc `| **Version** |` hiện tại của PRD từ Metadata (vd `1.3`).
|
|
68
|
+
|
|
69
|
+
- **Không tồn tại** → sinh mới; ghi `| **Built from PRD** | v{prd_version hiện tại} |`.
|
|
70
|
+
- **Tồn tại** → đọc row `| **Built from PRD** |` của nó, so với `| **Version** |` PRD hiện tại:
|
|
71
|
+
- **Bằng nhau** → hỏi: "Design Spec đã dựng từ PRD v{x}. Sinh lại? (Y/N)".
|
|
72
|
+
- **Khác** (PRD đã đổi) → CHECKPOINT drift:
|
|
73
|
+
```
|
|
74
|
+
⚠️ Phát hiện PRD version drift
|
|
75
|
+
Design Spec dựng từ PRD v{old}; PRD giờ ở v{new}.
|
|
76
|
+
Thay đổi kể từ v{old} (đọc # Change Log của PRD):
|
|
77
|
+
{changelog rows}
|
|
78
|
+
Options:
|
|
79
|
+
Y — cập nhật phần ảnh hưởng (màn / flow đổi)
|
|
80
|
+
F — sinh lại toàn bộ
|
|
81
|
+
N — huỷ
|
|
82
|
+
```
|
|
83
|
+
- 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.
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
63
87
|
## Screen Discovery
|
|
64
88
|
|
|
65
89
|
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.
|
|
@@ -121,8 +145,8 @@ Nếu một màn chưa có design, gõ none cho màn đó.
|
|
|
121
145
|
|
|
122
146
|
**Gate bắt buộc (không abort — sinh ra draft):**
|
|
123
147
|
- Nếu **bất kỳ** màn nào ❌ Missing → spec được sinh dưới dạng **draft** với các màn đó
|
|
124
|
-
được gắn cờ,
|
|
125
|
-
|
|
148
|
+
được gắn cờ, `Status` giữ `draft` cho tới khi mọi màn có link frame đọc được, đã fetch.
|
|
149
|
+
`/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]`.
|
|
126
150
|
- Thêm một AI Assumption cho mỗi màn thiếu: "Không có Figma frame đọc được cho {screen} — spec
|
|
127
151
|
của màn này chỉ là text và không được sign off cho tới khi thêm link `node-id`."
|
|
128
152
|
|
|
@@ -208,6 +232,7 @@ Ghi `{paths.specs_dir}/{domain}/{prd-slug}/design-spec/{TICKET-ID}-design-spec-{
|
|
|
208
232
|
| **Service** | {active_service} |
|
|
209
233
|
| **Domain** | {domain} |
|
|
210
234
|
| **Business PRD** | [{TICKET-ID}](../{TICKET-ID}-{prd-slug}.md) |
|
|
235
|
+
| **Built from PRD** | v{prd_version — `\| **Version** \|` của PRD lúc sinh; dùng phát hiện drift} |
|
|
211
236
|
| **Figma** | {figma_url — link file feature} ({linked}/{N} frame đã link) |
|
|
212
237
|
| **Author** | {tên PO hoặc "AI-assisted"} |
|
|
213
238
|
| **Created** | {YYYY-MM-DD} |
|
|
@@ -435,7 +460,7 @@ Exit: {người dùng rời thế nào — back stack / chuyển tab / deeplink
|
|
|
435
460
|
|
|
436
461
|
---
|
|
437
462
|
|
|
438
|
-
##
|
|
463
|
+
## Self-Review Gate *(cổng tự-rà — bắt buộc chạy trước khi ghi)*
|
|
439
464
|
|
|
440
465
|
- [ ] Mọi màn trong Screen Inventory có Screen Spec đầy đủ ở Section 2
|
|
441
466
|
- [ ] Mọi màn có tối thiểu các state: default, loading, error
|
|
@@ -446,7 +471,12 @@ Exit: {người dùng rời thế nào — back stack / chuyển tab / deeplink
|
|
|
446
471
|
- [ ] Link cross-reference Business PRD là relative path hợp lệ
|
|
447
472
|
- [ ] 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
|
|
448
473
|
- [ ] 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
|
|
449
|
-
- [ ] Nếu bất kỳ màn nào ❌ Missing → Status giữ `draft`
|
|
474
|
+
- [ ] 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)
|
|
475
|
+
|
|
476
|
+
> **Đâ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**:
|
|
477
|
+
> 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À
|
|
478
|
+
> 2. giữ `| **Status** | draft |` (chưa đủ điều kiện để PO+Designer sign-off `approved`).
|
|
479
|
+
> KHÔNG xuất design-spec như "hoàn chỉnh" khi còn mục fail chưa gắn cờ.
|
|
450
480
|
|
|
451
481
|
---
|
|
452
482
|
|
|
@@ -472,7 +502,7 @@ Next : Chia sẻ với Designer → PO + Designer sign-off (Status: approved)
|
|
|
472
502
|
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}
|
|
473
503
|
Output Artifacts:
|
|
474
504
|
created {paths.specs_dir}/{domain}/{prd-slug}/design-spec/{TICKET-ID}-design-spec-{active_platform}-{slug}.md (v1.0, draft)
|
|
475
|
-
Next : 🔒
|
|
505
|
+
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.
|
|
476
506
|
1. Trong Figma: chọn mỗi frame còn thiếu → chuột phải → Copy link to selection
|
|
477
507
|
2. Chạy lại /generate-design-spec {prd-file} → AI fetch & ground các frame mới
|
|
478
508
|
```
|