@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.
- package/bin/index.js +1 -1
- package/commands/debug.md +1 -1
- package/commands/define-product.md +1 -1
- package/commands/dev-gen-test.md +1 -1
- package/commands/dev-run-test.md +1 -1
- package/commands/dev-smoke-test.md +1 -1
- package/commands/fix-bug.md +1 -1
- package/commands/generate-bdd.md +74 -5
- package/commands/generate-bdd.tmpl +73 -4
- package/commands/generate-code.md +19 -2
- package/commands/generate-code.tmpl +18 -1
- package/commands/generate-design-spec.md +50 -6
- package/commands/generate-design-spec.tmpl +49 -5
- package/commands/generate-prd.md +9 -5
- package/commands/generate-prd.tmpl +1 -0
- package/commands/generate-spec-manifest.md +1 -1
- package/commands/generate-tech-docs.md +2 -1
- package/commands/generate-tech-docs.tmpl +1 -0
- package/commands/learn.md +1 -1
- package/commands/map-testids.md +1 -1
- package/commands/propose-scenario.md +7 -3
- package/commands/propose-scenario.tmpl +6 -2
- package/commands/qc-analyze.md +15 -1
- package/commands/qc-analyze.tmpl +14 -0
- package/commands/qc-design-test.md +1 -1
- package/commands/qc-plan.md +1 -1
- package/commands/qc-report.md +1 -1
- package/commands/qc-review.md +1 -1
- package/commands/qc-run-test.md +1 -1
- package/commands/refine-prd.md +33 -13
- package/commands/refine-prd.tmpl +32 -12
- package/commands/report-bug.md +1 -1
- package/commands/review-code.md +1 -1
- package/commands/review-context.md +49 -27
- package/commands/review-context.tmpl +48 -26
- package/commands/review-tech-docs.md +1 -1
- package/commands/setup-ai-first.md +10 -10
- package/commands/setup-ai-first.tmpl +9 -9
- package/commands/sync.md +1 -1
- package/commands/update-framework.md +1 -1
- package/commands/validate-traces.md +2 -1
- package/commands/validate-traces.tmpl +1 -0
- package/core/FRAMEWORK_VERSION +1 -1
- package/core/commands/debug.md +1 -1
- package/core/commands/define-product.md +1 -1
- package/core/commands/dev-gen-test.md +1 -1
- package/core/commands/dev-run-test.md +1 -1
- package/core/commands/dev-smoke-test.md +1 -1
- package/core/commands/fix-bug.md +1 -1
- package/core/commands/generate-bdd.md +74 -5
- package/core/commands/generate-code.md +19 -2
- package/core/commands/generate-design-spec.md +50 -6
- package/core/commands/generate-prd.md +9 -5
- package/core/commands/generate-spec-manifest.md +1 -1
- package/core/commands/generate-tech-docs.md +2 -1
- package/core/commands/learn.md +1 -1
- package/core/commands/map-testids.md +1 -1
- package/core/commands/propose-scenario.md +7 -3
- package/core/commands/qc-analyze.md +15 -1
- package/core/commands/qc-design-test.md +1 -1
- package/core/commands/qc-plan.md +1 -1
- package/core/commands/qc-report.md +1 -1
- package/core/commands/qc-review.md +1 -1
- package/core/commands/qc-run-test.md +1 -1
- package/core/commands/refine-prd.md +33 -13
- package/core/commands/report-bug.md +1 -1
- package/core/commands/review-code.md +1 -1
- package/core/commands/review-context.md +49 -27
- package/core/commands/review-tech-docs.md +1 -1
- package/core/commands/setup-ai-first.md +10 -10
- package/core/commands/sync.md +1 -1
- package/core/commands/update-framework.md +1 -1
- package/core/commands/validate-traces.md +2 -1
- 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/report-footer.md +1 -1
- package/core/steps/spawn-agent.md +12 -7
- package/core/templates/prd.template.md +7 -4
- package/core/templates/project-context.yaml +2 -2
- package/docs/01-getting-started/core-concepts.md +3 -3
- 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 +4 -3
- package/docs/02-guides/developer/commands.md +3 -3
- package/docs/02-guides/developer/pr-checklist.md +1 -0
- package/docs/02-guides/developer/scenarios.md +2 -2
- package/docs/02-guides/developer/workflow.md +3 -3
- package/docs/02-guides/prd-input-checklist.md +94 -0
- package/docs/02-guides/product-owner/README.md +5 -3
- package/docs/02-guides/product-owner/commands.md +1 -1
- package/docs/02-guides/product-owner/handoff-checklist.md +5 -5
- package/docs/02-guides/product-owner/scenarios.md +19 -17
- 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 +34 -0
- package/docs/03-concepts/pipeline.md +12 -9
- package/docs/03-concepts/traceability.md +7 -4
- package/docs/04-operations/bug-flow.md +2 -0
- package/docs/04-operations/sync-and-update.md +3 -3
- package/docs/05-reference/command-cheatsheet.md +9 -9
- 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/report-footer.md +1 -1
- package/steps/spawn-agent.md +12 -7
- package/templates/prd.template.md +7 -4
- package/templates/project-context.yaml +2 -2
package/bin/index.js
CHANGED
|
@@ -266,7 +266,7 @@ if (isInit) {
|
|
|
266
266
|
` trace_dir: ".trace"`,
|
|
267
267
|
``,
|
|
268
268
|
`# Domain → service submodule routing.`,
|
|
269
|
-
`# Each key must match
|
|
269
|
+
`# Each key must match the PRD's Domain (Metadata row) / folder path segment.`,
|
|
270
270
|
`services:`,
|
|
271
271
|
servicesBlock,
|
|
272
272
|
``,
|
package/commands/debug.md
CHANGED
|
@@ -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}` (
|
|
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 |
|
|
@@ -670,7 +670,7 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
|
|
|
670
670
|
| /define-product | `/generate-prd {product-definition-file}` |
|
|
671
671
|
| /generate-prd | `/refine-prd {prd-file}` rồi `/review-context {prd-file}` |
|
|
672
672
|
| /refine-prd | Mở Review Board → cập nhật PRD → `/review-context {prd-file}` |
|
|
673
|
-
| /review-context (PRD) | FE/App: `/generate-design-spec {prd-file}` (
|
|
673
|
+
| /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) |
|
|
674
674
|
| /generate-design-spec | Designer review → xác nhận link Figma → PO + Designer sign-off → `/generate-bdd {prd-file}` |
|
|
675
675
|
| /generate-bdd | `/review-context {feature-file}` để kiểm tra độ phủ |
|
|
676
676
|
| /review-context (BDD) | `/generate-tech-docs {UC-ID}` nếu APPROVED; sinh lại nếu NEEDS_FIX |
|
package/commands/dev-gen-test.md
CHANGED
|
@@ -960,7 +960,7 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
|
|
|
960
960
|
| /define-product | `/generate-prd {product-definition-file}` |
|
|
961
961
|
| /generate-prd | `/refine-prd {prd-file}` rồi `/review-context {prd-file}` |
|
|
962
962
|
| /refine-prd | Mở Review Board → cập nhật PRD → `/review-context {prd-file}` |
|
|
963
|
-
| /review-context (PRD) | FE/App: `/generate-design-spec {prd-file}` (
|
|
963
|
+
| /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) |
|
|
964
964
|
| /generate-design-spec | Designer review → xác nhận link Figma → PO + Designer sign-off → `/generate-bdd {prd-file}` |
|
|
965
965
|
| /generate-bdd | `/review-context {feature-file}` để kiểm tra độ phủ |
|
|
966
966
|
| /review-context (BDD) | `/generate-tech-docs {UC-ID}` nếu APPROVED; sinh lại nếu NEEDS_FIX |
|
package/commands/dev-run-test.md
CHANGED
|
@@ -684,7 +684,7 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
|
|
|
684
684
|
| /define-product | `/generate-prd {product-definition-file}` |
|
|
685
685
|
| /generate-prd | `/refine-prd {prd-file}` rồi `/review-context {prd-file}` |
|
|
686
686
|
| /refine-prd | Mở Review Board → cập nhật PRD → `/review-context {prd-file}` |
|
|
687
|
-
| /review-context (PRD) | FE/App: `/generate-design-spec {prd-file}` (
|
|
687
|
+
| /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) |
|
|
688
688
|
| /generate-design-spec | Designer review → xác nhận link Figma → PO + Designer sign-off → `/generate-bdd {prd-file}` |
|
|
689
689
|
| /generate-bdd | `/review-context {feature-file}` để kiểm tra độ phủ |
|
|
690
690
|
| /review-context (BDD) | `/generate-tech-docs {UC-ID}` nếu APPROVED; sinh lại nếu NEEDS_FIX |
|
|
@@ -658,7 +658,7 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
|
|
|
658
658
|
| /define-product | `/generate-prd {product-definition-file}` |
|
|
659
659
|
| /generate-prd | `/refine-prd {prd-file}` rồi `/review-context {prd-file}` |
|
|
660
660
|
| /refine-prd | Mở Review Board → cập nhật PRD → `/review-context {prd-file}` |
|
|
661
|
-
| /review-context (PRD) | FE/App: `/generate-design-spec {prd-file}` (
|
|
661
|
+
| /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) |
|
|
662
662
|
| /generate-design-spec | Designer review → xác nhận link Figma → PO + Designer sign-off → `/generate-bdd {prd-file}` |
|
|
663
663
|
| /generate-bdd | `/review-context {feature-file}` để kiểm tra độ phủ |
|
|
664
664
|
| /review-context (BDD) | `/generate-tech-docs {UC-ID}` nếu APPROVED; sinh lại nếu NEEDS_FIX |
|
package/commands/fix-bug.md
CHANGED
|
@@ -693,7 +693,7 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
|
|
|
693
693
|
| /define-product | `/generate-prd {product-definition-file}` |
|
|
694
694
|
| /generate-prd | `/refine-prd {prd-file}` rồi `/review-context {prd-file}` |
|
|
695
695
|
| /refine-prd | Mở Review Board → cập nhật PRD → `/review-context {prd-file}` |
|
|
696
|
-
| /review-context (PRD) | FE/App: `/generate-design-spec {prd-file}` (
|
|
696
|
+
| /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) |
|
|
697
697
|
| /generate-design-spec | Designer review → xác nhận link Figma → PO + Designer sign-off → `/generate-bdd {prd-file}` |
|
|
698
698
|
| /generate-bdd | `/review-context {feature-file}` để kiểm tra độ phủ |
|
|
699
699
|
| /review-context (BDD) | `/generate-tech-docs {UC-ID}` nếu APPROVED; sinh lại nếu NEEDS_FIX |
|
package/commands/generate-bdd.md
CHANGED
|
@@ -401,7 +401,34 @@ 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.
|
|
418
|
+
|
|
419
|
+
---
|
|
420
|
+
|
|
421
|
+
## Guard — PRD đã duyệt chưa
|
|
422
|
+
|
|
423
|
+
Đọc `| **Status** |` từ bảng Metadata của PRD nguồn:
|
|
424
|
+
- `Status: approved` → tiếp tục bình thường.
|
|
425
|
+
- `Status: draft` (hoặc khác `approved`) → **CHECKPOINT cảnh báo mềm** (không chặn cứng — cho phép prototype):
|
|
426
|
+
```
|
|
427
|
+
⚠️ PRD đang ở Status: {status} (chưa duyệt). BDD sinh từ PRD chưa chốt có thể phải làm lại.
|
|
428
|
+
Khuyến nghị: PO review xong đặt `| **Status** | approved |` rồi mới sinh BDD.
|
|
429
|
+
Vẫn sinh BDD bây giờ? (Y/N)
|
|
430
|
+
```
|
|
431
|
+
Chỉ tiếp tục khi người dùng chọn Y.
|
|
405
432
|
|
|
406
433
|
---
|
|
407
434
|
|
|
@@ -595,6 +622,41 @@ Chỉ cần kiểm tra trạng thái đã phân giải:
|
|
|
595
622
|
|
|
596
623
|
---
|
|
597
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
|
+
|
|
598
660
|
## Orchestration Check
|
|
599
661
|
|
|
600
662
|
*Bỏ qua section này nếu đã ở sub-agent mode (Step 0 của Gate đã kích hoạt).*
|
|
@@ -641,7 +703,7 @@ Trước khi sinh, kiểm tra các file `.feature` có sẵn cho PRD này:
|
|
|
641
703
|
- So với version PRD hiện tại.
|
|
642
704
|
- Nếu **giống** → hỏi: "BDD đã sinh từ PRD v{version}. Gen lại? (Y/N)"
|
|
643
705
|
- Nếu **khác** (PRD đã cập nhật):
|
|
644
|
-
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.
|
|
645
707
|
2. Hiện CHECKPOINT:
|
|
646
708
|
```
|
|
647
709
|
⚠️ Phát hiện PRD version drift
|
|
@@ -656,7 +718,7 @@ Trước khi sinh, kiểm tra các file `.feature` có sẵn cho PRD này:
|
|
|
656
718
|
F — gen lại toàn bộ scenario
|
|
657
719
|
N — huỷ
|
|
658
720
|
```
|
|
659
|
-
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).
|
|
660
722
|
|
|
661
723
|
---
|
|
662
724
|
|
|
@@ -679,7 +741,7 @@ Trước khi sinh, kiểm tra các file `.feature` có sẵn cho PRD này:
|
|
|
679
741
|
|
|
680
742
|
| Check | Rule |
|
|
681
743
|
|-------|------|
|
|
682
|
-
| 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. |
|
|
683
745
|
| C.2 PRD Traceability | Mỗi AC và mỗi BR (gồm từng bullet logic) map tới ≥1 SC. |
|
|
684
746
|
| C.3 Business Dictionary | Dùng đúng canonical term từ business-dictionary.md. |
|
|
685
747
|
| C.4 Banned Terms | 0 banned term trong file — grep trước khi gen. |
|
|
@@ -728,6 +790,8 @@ Với mỗi UC trong PRD, trình bày outline SC **trước khi sinh**:
|
|
|
728
790
|
BRs covered: {TICKET-ID}-UC1-BR1, BR2, BR3
|
|
729
791
|
```
|
|
730
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
|
+
|
|
731
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.**
|
|
732
796
|
|
|
733
797
|
---
|
|
@@ -837,10 +901,15 @@ Feature: <Feature name>
|
|
|
837
901
|
# [x] <action 1> → SC1
|
|
838
902
|
# [x] <action 2> → SC2
|
|
839
903
|
# [ ] <action 3> → MISSING ← BLOCK MERGE
|
|
904
|
+
# Design Spec coverage (chỉ FE/App — C.1 mở rộng; bỏ khối này nếu không nạp design-spec):
|
|
905
|
+
# Screen "<screen>": loading → SC?, error → SC?, empty → SC?
|
|
906
|
+
# AC-UI behavioral: AC-UI3 (lỗi+khôi phục) → SC?, AC-UI4 (empty CTA) → SC?
|
|
907
|
+
# (bỏ AC-UI visual thuần: AC-UI1 khớp Figma, AC-UI5 WCAG — Designer/QA review riêng)
|
|
840
908
|
|
|
841
909
|
# === PRE-MERGE CHECKLIST ===
|
|
842
910
|
# - [ ] Mỗi SC có Side-effects + @trace.scenario + @trace.sc_version + @trace.business_rules
|
|
843
911
|
# - [ ] Coverage Matrix: 0 dòng MISSING (C.1)
|
|
912
|
+
# - [ ] FE/App: mỗi Screen State (≠default) + AC-UI behavioral của design-spec có ≥1 SC (C.1 mở rộng)
|
|
844
913
|
# - [ ] Mỗi AC/BR map tới ≥1 SC (C.2)
|
|
845
914
|
# - [ ] 0 banned term (C.4) — grep file trước khi merge
|
|
846
915
|
# - [ ] Feature ≥3 SC có NHÓM grouping theo business theme (C.5)
|
|
@@ -989,7 +1058,7 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
|
|
|
989
1058
|
| /define-product | `/generate-prd {product-definition-file}` |
|
|
990
1059
|
| /generate-prd | `/refine-prd {prd-file}` rồi `/review-context {prd-file}` |
|
|
991
1060
|
| /refine-prd | Mở Review Board → cập nhật PRD → `/review-context {prd-file}` |
|
|
992
|
-
| /review-context (PRD) | FE/App: `/generate-design-spec {prd-file}` (
|
|
1061
|
+
| /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) |
|
|
993
1062
|
| /generate-design-spec | Designer review → xác nhận link Figma → PO + Designer sign-off → `/generate-bdd {prd-file}` |
|
|
994
1063
|
| /generate-bdd | `/review-context {feature-file}` để kiểm tra độ phủ |
|
|
995
1064
|
| /review-context (BDD) | `/generate-tech-docs {UC-ID}` nếu APPROVED; sinh lại nếu NEEDS_FIX |
|
|
@@ -6,7 +6,34 @@
|
|
|
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.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Guard — PRD đã duyệt chưa
|
|
27
|
+
|
|
28
|
+
Đọc `| **Status** |` từ bảng Metadata của PRD nguồn:
|
|
29
|
+
- `Status: approved` → tiếp tục bình thường.
|
|
30
|
+
- `Status: draft` (hoặc khác `approved`) → **CHECKPOINT cảnh báo mềm** (không chặn cứng — cho phép prototype):
|
|
31
|
+
```
|
|
32
|
+
⚠️ PRD đang ở Status: {status} (chưa duyệt). BDD sinh từ PRD chưa chốt có thể phải làm lại.
|
|
33
|
+
Khuyến nghị: PO review xong đặt `| **Status** | approved |` rồi mới sinh BDD.
|
|
34
|
+
Vẫn sinh BDD bây giờ? (Y/N)
|
|
35
|
+
```
|
|
36
|
+
Chỉ tiếp tục khi người dùng chọn Y.
|
|
10
37
|
|
|
11
38
|
---
|
|
12
39
|
|
|
@@ -200,6 +227,41 @@ Chỉ cần kiểm tra trạng thái đã phân giải:
|
|
|
200
227
|
|
|
201
228
|
---
|
|
202
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
|
+
|
|
203
265
|
## Orchestration Check
|
|
204
266
|
|
|
205
267
|
*Bỏ qua section này nếu đã ở sub-agent mode (Step 0 của Gate đã kích hoạt).*
|
|
@@ -246,7 +308,7 @@ Trước khi sinh, kiểm tra các file `.feature` có sẵn cho PRD này:
|
|
|
246
308
|
- So với version PRD hiện tại.
|
|
247
309
|
- Nếu **giống** → hỏi: "BDD đã sinh từ PRD v{version}. Gen lại? (Y/N)"
|
|
248
310
|
- Nếu **khác** (PRD đã cập nhật):
|
|
249
|
-
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.
|
|
250
312
|
2. Hiện CHECKPOINT:
|
|
251
313
|
```
|
|
252
314
|
⚠️ Phát hiện PRD version drift
|
|
@@ -261,7 +323,7 @@ Trước khi sinh, kiểm tra các file `.feature` có sẵn cho PRD này:
|
|
|
261
323
|
F — gen lại toàn bộ scenario
|
|
262
324
|
N — huỷ
|
|
263
325
|
```
|
|
264
|
-
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).
|
|
265
327
|
|
|
266
328
|
---
|
|
267
329
|
|
|
@@ -284,7 +346,7 @@ Trước khi sinh, kiểm tra các file `.feature` có sẵn cho PRD này:
|
|
|
284
346
|
|
|
285
347
|
| Check | Rule |
|
|
286
348
|
|-------|------|
|
|
287
|
-
| 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. |
|
|
288
350
|
| C.2 PRD Traceability | Mỗi AC và mỗi BR (gồm từng bullet logic) map tới ≥1 SC. |
|
|
289
351
|
| C.3 Business Dictionary | Dùng đúng canonical term từ business-dictionary.md. |
|
|
290
352
|
| C.4 Banned Terms | 0 banned term trong file — grep trước khi gen. |
|
|
@@ -333,6 +395,8 @@ Với mỗi UC trong PRD, trình bày outline SC **trước khi sinh**:
|
|
|
333
395
|
BRs covered: {TICKET-ID}-UC1-BR1, BR2, BR3
|
|
334
396
|
```
|
|
335
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
|
+
|
|
336
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.**
|
|
337
401
|
|
|
338
402
|
---
|
|
@@ -442,10 +506,15 @@ Feature: <Feature name>
|
|
|
442
506
|
# [x] <action 1> → SC1
|
|
443
507
|
# [x] <action 2> → SC2
|
|
444
508
|
# [ ] <action 3> → MISSING ← BLOCK MERGE
|
|
509
|
+
# Design Spec coverage (chỉ FE/App — C.1 mở rộng; bỏ khối này nếu không nạp design-spec):
|
|
510
|
+
# Screen "<screen>": loading → SC?, error → SC?, empty → SC?
|
|
511
|
+
# AC-UI behavioral: AC-UI3 (lỗi+khôi phục) → SC?, AC-UI4 (empty CTA) → SC?
|
|
512
|
+
# (bỏ AC-UI visual thuần: AC-UI1 khớp Figma, AC-UI5 WCAG — Designer/QA review riêng)
|
|
445
513
|
|
|
446
514
|
# === PRE-MERGE CHECKLIST ===
|
|
447
515
|
# - [ ] Mỗi SC có Side-effects + @trace.scenario + @trace.sc_version + @trace.business_rules
|
|
448
516
|
# - [ ] Coverage Matrix: 0 dòng MISSING (C.1)
|
|
517
|
+
# - [ ] FE/App: mỗi Screen State (≠default) + AC-UI behavioral của design-spec có ≥1 SC (C.1 mở rộng)
|
|
449
518
|
# - [ ] Mỗi AC/BR map tới ≥1 SC (C.2)
|
|
450
519
|
# - [ ] 0 banned term (C.4) — grep file trước khi merge
|
|
451
520
|
# - [ ] Feature ≥3 SC có NHÓM grouping theo business theme (C.5)
|
|
@@ -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
|
|
|
@@ -802,7 +819,7 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
|
|
|
802
819
|
| /define-product | `/generate-prd {product-definition-file}` |
|
|
803
820
|
| /generate-prd | `/refine-prd {prd-file}` rồi `/review-context {prd-file}` |
|
|
804
821
|
| /refine-prd | Mở Review Board → cập nhật PRD → `/review-context {prd-file}` |
|
|
805
|
-
| /review-context (PRD) | FE/App: `/generate-design-spec {prd-file}` (
|
|
822
|
+
| /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) |
|
|
806
823
|
| /generate-design-spec | Designer review → xác nhận link Figma → PO + Designer sign-off → `/generate-bdd {prd-file}` |
|
|
807
824
|
| /generate-bdd | `/review-context {feature-file}` để kiểm tra độ phủ |
|
|
808
825
|
| /review-context (BDD) | `/generate-tech-docs {UC-ID}` nếu APPROVED; sinh lại nếu NEEDS_FIX |
|
|
@@ -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
|
|
|
@@ -412,6 +412,20 @@ Tiếp tục sang bước kế tiếp của lệnh đang gọi.
|
|
|
412
412
|
|
|
413
413
|
---
|
|
414
414
|
|
|
415
|
+
## Guard — PRD đã duyệt chưa
|
|
416
|
+
|
|
417
|
+
Đọc `| **Status** |` từ bảng Metadata của Business PRD nguồn:
|
|
418
|
+
- `Status: approved` → tiếp tục bình thường.
|
|
419
|
+
- `Status: draft` (hoặc khác `approved`) → **CHECKPOINT cảnh báo mềm** (không chặn cứng — cho phép prototype song song):
|
|
420
|
+
```
|
|
421
|
+
⚠️ Business PRD đang ở Status: {status} (chưa duyệt). Design Spec dựng trên PRD chưa chốt có thể phải làm lại theo PRD.
|
|
422
|
+
Khuyến nghị: PO duyệt PRD (đặt `| **Status** | approved |`) rồi mới sinh Design Spec.
|
|
423
|
+
Vẫn sinh Design Spec bây giờ? (Y/N)
|
|
424
|
+
```
|
|
425
|
+
Chỉ tiếp tục khi người dùng chọn Y.
|
|
426
|
+
|
|
427
|
+
---
|
|
428
|
+
|
|
415
429
|
## Platform Check
|
|
416
430
|
|
|
417
431
|
Dùng `active_module` và `platform_type` suy ra từ context loading:
|
|
@@ -441,6 +455,30 @@ Dùng `active_module` và `platform_type` suy ra từ context loading:
|
|
|
441
455
|
|
|
442
456
|
---
|
|
443
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
|
+
|
|
444
482
|
## Screen Discovery
|
|
445
483
|
|
|
446
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.
|
|
@@ -502,8 +540,8 @@ Nếu một màn chưa có design, gõ none cho màn đó.
|
|
|
502
540
|
|
|
503
541
|
**Gate bắt buộc (không abort — sinh ra draft):**
|
|
504
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 đó
|
|
505
|
-
được gắn cờ,
|
|
506
|
-
|
|
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]`.
|
|
507
545
|
- Thêm một AI Assumption cho mỗi màn thiếu: "Không có Figma frame đọc được cho {screen} — spec
|
|
508
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`."
|
|
509
547
|
|
|
@@ -589,6 +627,7 @@ Ghi `{paths.specs_dir}/{domain}/{prd-slug}/design-spec/{TICKET-ID}-design-spec-{
|
|
|
589
627
|
| **Service** | {active_service} |
|
|
590
628
|
| **Domain** | {domain} |
|
|
591
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} |
|
|
592
631
|
| **Figma** | {figma_url — link file feature} ({linked}/{N} frame đã link) |
|
|
593
632
|
| **Author** | {tên PO hoặc "AI-assisted"} |
|
|
594
633
|
| **Created** | {YYYY-MM-DD} |
|
|
@@ -816,7 +855,7 @@ Exit: {người dùng rời thế nào — back stack / chuyển tab / deeplink
|
|
|
816
855
|
|
|
817
856
|
---
|
|
818
857
|
|
|
819
|
-
##
|
|
858
|
+
## Self-Review Gate *(cổng tự-rà — bắt buộc chạy trước khi ghi)*
|
|
820
859
|
|
|
821
860
|
- [ ] Mọi màn trong Screen Inventory có Screen Spec đầy đủ ở Section 2
|
|
822
861
|
- [ ] Mọi màn có tối thiểu các state: default, loading, error
|
|
@@ -827,7 +866,12 @@ Exit: {người dùng rời thế nào — back stack / chuyển tab / deeplink
|
|
|
827
866
|
- [ ] Link cross-reference Business PRD là relative path hợp lệ
|
|
828
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
|
|
829
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
|
|
830
|
-
- [ ] 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ờ.
|
|
831
875
|
|
|
832
876
|
---
|
|
833
877
|
|
|
@@ -895,7 +939,7 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
|
|
|
895
939
|
| /define-product | `/generate-prd {product-definition-file}` |
|
|
896
940
|
| /generate-prd | `/refine-prd {prd-file}` rồi `/review-context {prd-file}` |
|
|
897
941
|
| /refine-prd | Mở Review Board → cập nhật PRD → `/review-context {prd-file}` |
|
|
898
|
-
| /review-context (PRD) | FE/App: `/generate-design-spec {prd-file}` (
|
|
942
|
+
| /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) |
|
|
899
943
|
| /generate-design-spec | Designer review → xác nhận link Figma → PO + Designer sign-off → `/generate-bdd {prd-file}` |
|
|
900
944
|
| /generate-bdd | `/review-context {feature-file}` để kiểm tra độ phủ |
|
|
901
945
|
| /review-context (BDD) | `/generate-tech-docs {UC-ID}` nếu APPROVED; sinh lại nếu NEEDS_FIX |
|
|
@@ -953,7 +997,7 @@ Next : Chia sẻ với Designer → PO + Designer sign-off (Status: approved)
|
|
|
953
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}
|
|
954
998
|
Output Artifacts:
|
|
955
999
|
created {paths.specs_dir}/{domain}/{prd-slug}/design-spec/{TICKET-ID}-design-spec-{active_platform}-{slug}.md (v1.0, draft)
|
|
956
|
-
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.
|
|
957
1001
|
1. Trong Figma: chọn mỗi frame còn thiếu → chuột phải → Copy link to selection
|
|
958
1002
|
2. Chạy lại /generate-design-spec {prd-file} → AI fetch & ground các frame mới
|
|
959
1003
|
```
|