@educa-corp/sdd-framework 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/build.js +9 -0
- package/bin/index.js +115 -4
- package/bin/self-check.js +354 -0
- package/bin/trace-schema.json +1199 -0
- package/commands/debug.md +19 -12
- package/commands/define-product.md +19 -12
- package/commands/dev-gen-test.md +53 -19
- package/commands/dev-run-test.md +55 -20
- package/commands/dev-run-test.tmpl +2 -1
- package/commands/dev-smoke-test.md +19 -12
- package/commands/extend-prd.md +907 -0
- package/commands/extend-prd.tmpl +270 -0
- package/commands/fix-bug.md +101 -15
- package/commands/fix-bug.tmpl +29 -3
- package/commands/generate-architecture.md +19 -12
- package/commands/generate-bdd.md +174 -48
- package/commands/generate-bdd.tmpl +107 -18
- package/commands/generate-code.md +122 -29
- package/commands/generate-code.tmpl +69 -10
- package/commands/generate-design-spec.md +19 -12
- package/commands/generate-prd.md +44 -12
- package/commands/generate-prd.tmpl +25 -0
- package/commands/generate-spec-manifest.md +19 -12
- package/commands/generate-tech-docs.md +22 -15
- package/commands/generate-tech-docs.tmpl +2 -2
- package/commands/learn.md +19 -12
- package/commands/map-testids.md +19 -12
- package/commands/propose-scenario.md +91 -15
- package/commands/propose-scenario.tmpl +72 -3
- package/commands/qc-analyze.md +19 -12
- package/commands/qc-design-test.md +20 -12
- package/commands/qc-design-test.tmpl +1 -0
- package/commands/qc-plan.md +19 -12
- package/commands/qc-report.md +19 -12
- package/commands/qc-review.md +19 -12
- package/commands/qc-run-test.md +88 -22
- package/commands/qc-run-test.tmpl +35 -3
- package/commands/refine-prd.md +19 -12
- package/commands/report-bug.md +19 -12
- package/commands/review-code.md +60 -14
- package/commands/review-code.tmpl +41 -2
- package/commands/review-context.md +62 -16
- package/commands/review-context.tmpl +43 -4
- package/commands/review-tech-docs.md +50 -14
- package/commands/review-tech-docs.tmpl +31 -2
- package/commands/setup-ai-first.md +26 -16
- package/commands/setup-ai-first.tmpl +7 -4
- package/commands/sync.md +43 -18
- package/commands/sync.tmpl +37 -14
- package/commands/update-framework.md +43 -4
- package/commands/update-framework.tmpl +37 -0
- package/commands/validate-traces.md +481 -49
- package/commands/validate-traces.tmpl +462 -37
- package/core/FRAMEWORK_VERSION +1 -1
- package/core/README.md +56 -0
- package/core/commands/debug.md +19 -12
- package/core/commands/define-product.md +19 -12
- package/core/commands/dev-gen-test.md +53 -19
- package/core/commands/dev-run-test.md +55 -20
- package/core/commands/dev-smoke-test.md +19 -12
- package/core/commands/extend-prd.md +907 -0
- package/core/commands/fix-bug.md +101 -15
- package/core/commands/generate-architecture.md +19 -12
- package/core/commands/generate-bdd.md +174 -48
- package/core/commands/generate-code.md +122 -29
- package/core/commands/generate-design-spec.md +19 -12
- package/core/commands/generate-prd.md +44 -12
- package/core/commands/generate-spec-manifest.md +19 -12
- package/core/commands/generate-tech-docs.md +22 -15
- package/core/commands/learn.md +19 -12
- package/core/commands/map-testids.md +19 -12
- package/core/commands/propose-scenario.md +91 -15
- package/core/commands/qc-analyze.md +19 -12
- package/core/commands/qc-design-test.md +20 -12
- package/core/commands/qc-plan.md +19 -12
- package/core/commands/qc-report.md +19 -12
- package/core/commands/qc-review.md +19 -12
- package/core/commands/qc-run-test.md +88 -22
- package/core/commands/refine-prd.md +19 -12
- package/core/commands/report-bug.md +19 -12
- package/core/commands/review-code.md +60 -14
- package/core/commands/review-context.md +62 -16
- package/core/commands/review-tech-docs.md +50 -14
- package/core/commands/setup-ai-first.md +26 -16
- package/core/commands/sync.md +43 -18
- package/core/commands/update-framework.md +43 -4
- package/core/commands/validate-traces.md +481 -49
- package/core/modules/android-compose/stack-profile.yaml +1 -1
- package/core/modules/flutter/stack-profile.yaml +1 -1
- package/core/modules/ios-swiftui/stack-profile.yaml +1 -1
- package/core/modules/java-spring/stack-profile.yaml +1 -1
- package/core/modules/nextjs/stack-profile.yaml +1 -1
- package/core/modules/nuxt/stack-profile.yaml +1 -1
- package/core/modules/phaser-game/stack-profile.yaml +1 -1
- package/core/modules/php-laravel/stack-profile.yaml +1 -1
- package/core/modules/qc-playwright/stack-profile.yaml +1 -1
- package/core/modules/react/stack-profile.yaml +1 -1
- package/core/modules/react-native/stack-profile.yaml +1 -1
- package/core/modules/vue/stack-profile.yaml +1 -1
- package/core/rules/workflow.md +29 -0
- package/core/steps/gate.md +13 -8
- package/core/steps/report-footer.md +6 -4
- package/core/steps/trace-mirror.md +34 -7
- package/core/templates/README.md +47 -0
- package/core/templates/feature.template +14 -11
- package/core/templates/project-context.yaml +26 -14
- package/core/templates/tech-design.template.md +1 -1
- package/docs/01-getting-started/installation.md +18 -1
- package/docs/01-getting-started/what-is-sdd.md +4 -2
- package/docs/02-concepts/architecture.md +27 -3
- package/docs/02-concepts/pipeline-steps/02-specification.md +39 -3
- package/docs/02-concepts/pipeline-steps/04-bdd.md +24 -2
- package/docs/02-concepts/pipeline-steps/05-tech-docs.md +18 -1
- package/docs/02-concepts/pipeline-steps/06-code.md +35 -4
- package/docs/02-concepts/pipeline-steps/09-validate-traces.md +137 -12
- package/docs/02-concepts/pipeline-steps/10-feedback-loop.md +59 -3
- package/docs/02-concepts/roles-and-hitl.md +1 -1
- package/docs/02-concepts/traceability.md +126 -94
- package/docs/03-guides/developer.md +20 -4
- package/docs/03-guides/product-owner.md +72 -68
- package/docs/03-guides/tester-qa.md +81 -70
- package/docs/04-reference/commands.md +134 -105
- package/docs/04-reference/configuration.md +146 -94
- package/docs/04-reference/trace-schema.md +145 -37
- package/docs/explain/02-generate-prd.md +80 -78
- package/docs/explain/02b-extend-prd.md +125 -0
- package/docs/explain/03-refine-prd.md +86 -86
- package/docs/explain/04-review-context.md +18 -1
- package/docs/explain/06-generate-bdd.md +23 -0
- package/docs/explain/08-review-tech-docs.md +20 -5
- package/docs/explain/10-review-code.md +36 -2
- package/docs/explain/19-qc-run-test.md +87 -67
- package/docs/explain/21-validate-traces.md +74 -68
- package/docs/explain/23-fix-bug.md +19 -3
- package/docs/explain/26-propose-scenario.md +70 -63
- package/docs/explain/README.md +135 -134
- package/modules/android-compose/stack-profile.yaml +1 -1
- package/modules/flutter/stack-profile.yaml +1 -1
- package/modules/ios-swiftui/stack-profile.yaml +1 -1
- package/modules/java-spring/stack-profile.yaml +1 -1
- package/modules/nextjs/stack-profile.yaml +1 -1
- package/modules/nuxt/stack-profile.yaml +1 -1
- package/modules/phaser-game/stack-profile.yaml +1 -1
- package/modules/php-laravel/stack-profile.yaml +1 -1
- package/modules/qc-playwright/stack-profile.yaml +1 -1
- package/modules/react/stack-profile.yaml +1 -1
- package/modules/react-native/stack-profile.yaml +1 -1
- package/modules/vue/stack-profile.yaml +1 -1
- package/package.json +5 -4
- package/rules/workflow.md +29 -0
- package/scripts/migrate-bdd-platform.js +286 -0
- package/steps/gate.md +13 -8
- package/steps/report-footer.md +6 -4
- package/steps/trace-mirror.md +34 -7
- package/templates/README.md +47 -0
- package/templates/feature.template +14 -11
- package/templates/project-context.yaml +26 -14
- package/templates/tech-design.template.md +1 -1
|
@@ -35,23 +35,23 @@ Hiển thị và chờ phản hồi:
|
|
|
35
35
|
```
|
|
36
36
|
⚙️ MODEL CHECK
|
|
37
37
|
──────────────────────────────────────────────────────────────────
|
|
38
|
-
Recommended :
|
|
38
|
+
Recommended : model Opus mới nhất
|
|
39
39
|
Why needed : Phân tích spec, review kiến trúc, sinh code đòi hỏi
|
|
40
|
-
suy luận sâu. Model nhỏ hơn dễ bỏ sót edge case.
|
|
40
|
+
suy luận sâu. Model nhỏ hơn (Haiku/Sonnet) dễ bỏ sót edge case.
|
|
41
41
|
|
|
42
42
|
Cách đổi trong Claude Code:
|
|
43
|
-
•
|
|
44
|
-
• hoặc:
|
|
43
|
+
• /model → chọn model Opus
|
|
44
|
+
• hoặc: Settings → Model
|
|
45
45
|
|
|
46
|
-
Đang chạy
|
|
47
|
-
Y — đúng
|
|
46
|
+
Đang chạy một model Opus?
|
|
47
|
+
Y — đúng → tiếp tục
|
|
48
48
|
S — bỏ qua kiểm tra (tôi chấp nhận rủi ro chất lượng thấp hơn với model hiện tại)
|
|
49
49
|
──────────────────────────────────────────────────────────────────
|
|
50
50
|
```
|
|
51
51
|
|
|
52
52
|
- "Y" → tiếp tục sang Bước 1.
|
|
53
53
|
- "S" → tiếp tục sang Bước 1 (người dùng chấp nhận rủi ro, thêm ⚠️ vào report cuối).
|
|
54
|
-
- "N" hoặc bất kỳ giá trị nào khác → **DỪNG.** Xuất: "Vui lòng chuyển sang
|
|
54
|
+
- "N" hoặc bất kỳ giá trị nào khác → **DỪNG.** Xuất: "Vui lòng chuyển sang một model Opus (`/model`) rồi chạy lại lệnh này."
|
|
55
55
|
|
|
56
56
|
## Bước 1 — Xác định Target File
|
|
57
57
|
|
|
@@ -60,7 +60,12 @@ Hiển thị và chờ phản hồi:
|
|
|
60
60
|
2. Nếu `$ARGUMENTS` là một **UC-ID / ticket ID / tên rút gọn** (không có path) → phân giải thành file bằng cách glob theo bố cục feature-package. `{prd-slug}` lúc này **chưa biết**, nên dùng wildcard `*` cho segment đó, và `**` đệ quy dưới `bdd/` để phủ hết các thư mục con theo platform (`bdd/web/`, `bdd/app/`, `bdd/system/`):
|
|
61
61
|
- **Lệnh BDD** (target là `.feature`): `{specs_dir}/{domain}/*/bdd/**/{UC-ID}*.feature` — hoặc `{specs_dir}/*/*/bdd/**/{UC-ID}*.feature` nếu domain cũng chưa biết. Nếu lệnh ngụ ý một platform/scope cụ thể (vd: system tech-doc cần BDD `system/`), ưu tiên kết quả trong thư mục con platform đó.
|
|
62
62
|
- **Lệnh PRD** (target là file PRD `{TICKET-ID}-{prd-slug}.md` — file `.md` duy nhất ở gốc feature folder, cạnh `bdd/`): `{specs_dir}/{domain}/*/{TICKET-ID}*.md` nếu biết TICKET-ID; nếu không, `{specs_dir}/{domain}/*/*.md` (khớp feature folder có id tương ứng), hoặc `{specs_dir}/*/*/*.md` nếu domain cũng chưa biết. *(Glob `*/*.md` ở cấp gốc folder chỉ khớp PRD — tech-docs/design-spec `.md` nằm sâu hơn trong thư mục con.)*
|
|
63
|
-
- **Lệnh tech-docs
|
|
63
|
+
- **Lệnh tech-docs** — target là tech-doc **gộp cấp PRD** `{TICKET-ID}-tech-design.md` (MỘT doc phủ nhiều UC; danh sách UC nằm ở `@trace.ucs`). Vì tên file mang `{TICKET-ID}` chứ **không** mang `{UC-ID}`, phải tách trước khi glob:
|
|
64
|
+
- `$ARGUMENTS` là **UC-ID** (`{TICKET-ID}-UC{N}`) → lấy `{TICKET-ID}` = phần **trước** `-UC`, rồi glob `{specs_dir}/{domain}/*/tech-docs/{TICKET-ID}-tech-design.md`.
|
|
65
|
+
- `$ARGUMENTS` là **TICKET-ID** → glob trực tiếp như trên.
|
|
66
|
+
- Chưa biết domain → `{specs_dir}/*/*/tech-docs/{TICKET-ID}-tech-design.md`.
|
|
67
|
+
- Vẫn không khớp → glob rộng `{specs_dir}/*/*/tech-docs/*tech-design*.md` rồi liệt kê để người dùng chọn.
|
|
68
|
+
*(Đừng glob `{UC-ID}*-tech-design*.md` — nó nở thành `FT-001-UC1*-tech-design*.md` và **không bao giờ** khớp `FT-001-tech-design.md`.)*
|
|
64
69
|
- **Lệnh design-spec**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
|
|
65
70
|
|
|
66
71
|
Khi một file khớp: đặt nó làm target **và** ghi lại `domain` + `prd_slug` từ path của nó (theo quy tắc trích xuất trong `context-loader.md` Bước 1 — `prd_slug` = segment đầu tiên sau `{specs_dir}/{domain}/`). Mọi path mà lệnh đọc/ghi về sau (BDD/tech-docs/design-spec/trace cùng cấp) đều dùng **`prd_slug` đã phân giải đó**, nên tất cả artifact nằm chung một feature package. Nếu nhiều file khớp (vd: nhiều platform), chọn theo platform/scope của lệnh hoặc liệt kê ra và hỏi.
|
|
@@ -562,6 +567,32 @@ Dùng catalog core-entities đã nạp:
|
|
|
562
567
|
| §10 UC Coverage sót một (platform, SC) đã có BDD | Major | Yes — thêm dòng coverage + section tương ứng |
|
|
563
568
|
| SC ghi trong §5/§10 **không kèm platform** (bare `UC1-SC1`) → nhập nhằng | Major | Yes — gắn platform vào SC ref |
|
|
564
569
|
|
|
570
|
+
### T3b — BDD Freshness *(tech-doc còn khớp BDD hiện tại không)*
|
|
571
|
+
|
|
572
|
+
*T3 kiểm **nội dung** khớp không. T3b kiểm **độ tươi**: doc này dựng từ BDD version nào, BDD giờ ở version nào. Đây là lỗ hổng cũ — không lệnh nào so hai giá trị này, nên tech-doc âm thầm lỗi thời mà vẫn giữ `@trace.status: approved`.*
|
|
573
|
+
|
|
574
|
+
Header tech-doc mang `@trace.bdd_versions` (**số nhiều** — map theo platform, vd `system=1.5, web=1.9`). Với **mỗi** entry trong map, đọc `@trace.bdd_version` (**số ít**, scalar) của `.feature` tương ứng (`{paths.specs_dir}/{domain}/{prd-slug}/bdd/{platform}/{TICKET-ID}-UC*.feature`):
|
|
575
|
+
|
|
576
|
+
| Điều kiện | Severity | Auto-fixable? |
|
|
577
|
+
|---|---|---|
|
|
578
|
+
| Map khớp `.feature` | *(sạch)* | — |
|
|
579
|
+
| `.feature` **mới hơn** map | **Major** | **No** — cần người review §4/§4.5 rồi bump `@trace.revision` |
|
|
580
|
+
| Platform có `.feature` nhưng **vắng** trong map | **Major** | Yes — thêm entry sau khi xác nhận §4 đã phủ platform đó |
|
|
581
|
+
| Map có platform mà **không** có `.feature` | Minor | Yes — xoá entry (BDD đã bỏ platform đó) |
|
|
582
|
+
|
|
583
|
+
Prose của finding "`.feature` mới hơn": *"tech-doc dựng từ BDD {platform}=v{old}, BDD giờ v{new} — §4 contract có thể đã lệch so với behavior đã chốt. Review lại §4.1–4.3 (+ §4.5 nếu FE) rồi bump `@trace.revision`."*
|
|
584
|
+
|
|
585
|
+
> **Vì sao là Major chứ không phải Minor:** `/generate-code` DS3 thấy tech-doc `@trace.status: approved` + 0 blocker-GAP thì lấy shape DTO/endpoint/error ở §4 **nguyên văn** làm contract "đã chốt". Contract dựng từ BDD cũ sẽ lan **thẳng** vào code, không cảnh báo. Đây là ca tệ hơn drift-về-code vì nó sai từ nguồn.
|
|
586
|
+
|
|
587
|
+
**Cổng chặn `approved` (chặn MỀM — đồng bộ với DS3/DS4 của `/generate-code`, không chặn cứng):** còn ≥1 finding T3b Major ở trạng thái `open` → khi người dùng định đặt `@trace.status: approved`, hiện CHECKPOINT:
|
|
588
|
+
```
|
|
589
|
+
⚠️ {n} platform có BDD mới hơn bản mà tech-doc này dựng từ:
|
|
590
|
+
{platform}: doc dựng từ v{old} · .feature giờ v{new}
|
|
591
|
+
Duyệt doc bây giờ = chốt một contract có thể đã lệch behavior.
|
|
592
|
+
Vẫn đặt approved? (Y/N)
|
|
593
|
+
```
|
|
594
|
+
Chỉ tiếp khi `Y`. *(Khác GATE của §12 blocker-GAP — cái đó chặn cứng. Ở đây chặn mềm vì BDD có thể bump vì lý do không chạm contract, vd sửa từ ngữ step; người review là người biết.)*
|
|
595
|
+
|
|
565
596
|
### T4 — Cross-PRD Endpoint Conflict Check *(targeted, load-on-hit)*
|
|
566
597
|
|
|
567
598
|
Mỗi PRD giờ chỉ 1 doc → xung đột TRONG doc đã do **T5** lo. T4 chỉ soi xung đột **liên-PRD** theo cách rẻ, KHÔNG nạp full doc khác:
|
|
@@ -722,7 +753,7 @@ sign_off_gate: blocked # blocked | ready — "ready" chỉ khi tất c
|
|
|
722
753
|
|
|
723
754
|
findings:
|
|
724
755
|
- id: "F001"
|
|
725
|
-
check_id: "T1" # T1
|
|
756
|
+
check_id: "T1" # T1 · T2 · T3 · T3b · T4 · T5 · T6 · T7 · T8 · T9
|
|
726
757
|
severity: "critical" # critical | major | minor
|
|
727
758
|
section: "{section heading hoặc tên component nơi tìm thấy lỗi}"
|
|
728
759
|
uc_id: "{UC-ID}" # UC mà finding này thuộc về (một trong `ucs`; đọc §10 để xác định)
|
|
@@ -784,7 +815,7 @@ Tìm lệnh hiện tại trong bảng phase dưới đây và đánh dấu **pha
|
|
|
784
815
|
| Phase | Commands |
|
|
785
816
|
|-------|----------|
|
|
786
817
|
| Discovery | `/define-product` |
|
|
787
|
-
| PRD | `/generate-prd` · `/refine-prd` · `/review-context` (PRD) |
|
|
818
|
+
| PRD | `/generate-prd` · `/extend-prd` · `/refine-prd` · `/review-context` (PRD) |
|
|
788
819
|
| Design Spec | `/generate-design-spec` |
|
|
789
820
|
| BDD | `/generate-bdd` · `/review-context` (BDD) |
|
|
790
821
|
| Tech Design | `/generate-tech-docs` · `/map-testids` · `/review-tech-docs` |
|
|
@@ -809,6 +840,7 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
|
|
|
809
840
|
| /setup-ai-first | `/define-product` để bắt đầu feature đầu tiên |
|
|
810
841
|
| /define-product | `/generate-prd {product-definition-file}` |
|
|
811
842
|
| /generate-prd | `/refine-prd {prd-file}` rồi `/review-context {prd-file}` |
|
|
843
|
+
| /extend-prd | `/refine-prd {prd-file}` (soi phần vừa thêm) rồi `/review-context {prd-file}` → PO duyệt → `/generate-bdd` **chỉ cho UC MỚI**; UC cũ dùng `/validate-traces --realign-prd-version {UC-ID}` |
|
|
812
844
|
| /refine-prd | Mở Review Board → cập nhật PRD → `/review-context {prd-file}` |
|
|
813
845
|
| /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) |
|
|
814
846
|
| /generate-design-spec | Designer review → xác nhận link Figma → PO + Designer sign-off → `/generate-bdd {prd-file}` |
|
|
@@ -821,6 +853,7 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
|
|
|
821
853
|
| /qc-run-test | `/qc-report {UC-ID}` rồi `/qc-review {UC-ID}` (review script) |
|
|
822
854
|
| /qc-review (script) | `/qc-report {UC-ID}` rồi tạo PR nếu APPROVED |
|
|
823
855
|
| /qc-report | `/validate-traces {UC-ID}` để làm mới Living Docs (qc_status) |
|
|
856
|
+
| /map-testids | `/qc-design-test {UC-ID}` (QC dựng Page Object từ contract §4.5.6 vừa ghi) |
|
|
824
857
|
| /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
|
|
825
858
|
| /review-tech-docs | `/generate-code {feature-file}` nếu APPROVED; sửa doc nếu NEEDS_FIX |
|
|
826
859
|
| /generate-code | Lần gen đầu → `/review-code {UC-ID}`; gen lại → `/dev-gen-test {UC-ID}` |
|
|
@@ -829,11 +862,11 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
|
|
|
829
862
|
| /dev-run-test (failing) | `/fix-bug {ticket-id}` hoặc `/debug {error}` |
|
|
830
863
|
| /review-code | `/dev-smoke-test {UC-ID}` hoặc tạo PR |
|
|
831
864
|
| /dev-smoke-test | Tạo PR và link tới ticket |
|
|
832
|
-
| /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}
|
|
833
|
-
| /fix-bug |
|
|
865
|
+
| /validate-traces | **Cờ 🔴 trước (chặn PR):** SEAM_UNWIRED → nối binding sang class thật, xoá/thay stub · STUB_UNRESOLVED → `/generate-code {owner_uc}` (lấp logic tại chỗ + xoá hàm song song) · ORPHANED/TRACE_ORPHAN → quyết định thủ công (xoá code+test, đưa scenario trở lại `.feature`, hoặc sửa `sc_id` của tag). **Rồi:** DRIFT/UNTRACKED → `/generate-code {UC-ID}` · BDD_DRIFT → `/generate-code {feature-file}` · tech-doc lỗi thời vs BDD → `/generate-tech-docs` → `/review-tech-docs` · PRD drift → `/generate-bdd {prd-file}` · GAP → `/dev-gen-test {UC-ID}`. **Chỉ tạo PR khi mọi cờ 🔴 = 0** |
|
|
866
|
+
| /fix-bug | `/dev-run-test {UC-ID}` (dev_selftest vừa reset về not_run) → tạo PR; nếu fix một `{BUG-ID}` → QC chạy `/qc-run-test {UC-ID}` để verify + đóng bug |
|
|
834
867
|
| /debug | `/fix-bug {ticket-id}` nếu cần sửa |
|
|
835
868
|
| /report-bug | Gửi cho dev (`/fix-bug {BUG-ID}`); nếu thiếu coverage → `/propose-scenario {UC-ID}` |
|
|
836
|
-
| /propose-scenario |
|
|
869
|
+
| /propose-scenario | **Case A** (thiếu scenario cho AC có sẵn) → báo PO/Dev review trong `feedback/bdd-proposals/`; `/generate-bdd` tự chèn khi `Status: accepted`. **Case B** (requirement mới) → `feedback/prd-change-requests/` — PO phải đưa vào PRD trước, KHÔNG tự vào BDD được; `/validate-traces` nhắc lại kèm số ngày chờ chừng nào `Status: Open` |
|
|
837
870
|
| /learn | Tiếp tục làm việc — lesson áp dụng ở lệnh kế tiếp |
|
|
838
871
|
| /sync | `/validate-traces` để xem độ phủ đầy đủ; xử lý mọi `📥 tester feedback` được nêu |
|
|
839
872
|
| /update-framework | Review `git diff .agent/`, commit; `/sync` để đồng bộ nội dung dự án |
|
|
@@ -894,6 +927,7 @@ Next: Mở trong Review Board → Accept/Modify/Reject từng finding
|
|
|
894
927
|
| T1 (Architecture) | Áp dụng fix cấu trúc từ note finding — chuyển logic về đúng layer, cập nhật mô tả component |
|
|
895
928
|
| T2 (Tên field) | Đổi field về tên canonical từ core-entities.md xuyên suốt tài liệu |
|
|
896
929
|
| T3 (Thiếu design note) | Thêm design decision note cho scenario chưa phủ |
|
|
930
|
+
| T3b (map bdd_version) | **Chỉ 2 ca auto-fixable:** platform vắng trong map → thêm entry `{platform}={bdd_version hiện tại}`; platform không còn `.feature` → xoá entry. Ca **`.feature` mới hơn** thì KHÔNG được chỉ sửa số trong map — làm vậy là dán nhãn "đã đồng bộ" lên một contract chưa ai review. Chỉ cập nhật entry sau khi note của reviewer xác nhận §4 đã được đối chiếu lại. |
|
|
897
931
|
| T5 (Internal inconsistency) | Căn chỉnh các section mâu thuẫn theo quyết định nêu trong note |
|
|
898
932
|
| T6 (Thiếu section) | Thêm skeleton section với prompt placeholder cho tech lead điền |
|
|
899
933
|
| T8 (cross-field invariant) | Thêm note invariant còn thiếu *(chỉ mục minor auto-fixable; enum mồ côi / PRD-BR bỏ sót / leak boundary cần người)* |
|
|
@@ -910,7 +944,9 @@ Sửa file tech-doc trực tiếp:
|
|
|
910
944
|
- (a) sign_off_gate = `ready` (tất cả sign-off done; hoặc doc không có phần system → không cần sign-off), **VÀ**
|
|
911
945
|
- (b) §12 GAP Register **không còn 🔴 blocker nào ở trạng thái `open`** (đếm ở T9).
|
|
912
946
|
Thiếu (a) hoặc (b) → set `in-review` (chặn `/generate-code`); ghi rõ lý do vào report (sign-off pending / còn N blocker-GAP open).
|
|
913
|
-
|
|
947
|
+
**Ngoài ra — cổng T3b (chặn MỀM):** còn ≥1 finding T3b Major `open` (`.feature` mới hơn map `@trace.bdd_versions`) → hiện CHECKPOINT ở T3b và chỉ set `approved` khi người dùng chọn `Y`; chọn `N` → `in-review` + nêu lý do.
|
|
948
|
+
3. **Làm mới map `@trace.bdd_versions`** — chỉ cho các platform mà finding T3b đã được **giải quyết** (reviewer xác nhận §4 đã đối chiếu lại, hoặc là ca thêm/xoá entry auto-fixable). Platform còn finding `open` thì **giữ nguyên số cũ**: để nó lệch chính là thứ giữ cờ `TECHDOC_STALE_VS_BDD` của `/validate-traces` sáng đèn.
|
|
949
|
+
4. Nếu block `@trace.sign_off` vắng và đây là tech doc system BDD → thêm nó với tất cả giá trị `pending`.
|
|
914
950
|
|
|
915
951
|
Ghi cả hai thay đổi vào file.
|
|
916
952
|
|
|
@@ -88,6 +88,32 @@ Dùng catalog core-entities đã nạp:
|
|
|
88
88
|
| §10 UC Coverage sót một (platform, SC) đã có BDD | Major | Yes — thêm dòng coverage + section tương ứng |
|
|
89
89
|
| SC ghi trong §5/§10 **không kèm platform** (bare `UC1-SC1`) → nhập nhằng | Major | Yes — gắn platform vào SC ref |
|
|
90
90
|
|
|
91
|
+
### T3b — BDD Freshness *(tech-doc còn khớp BDD hiện tại không)*
|
|
92
|
+
|
|
93
|
+
*T3 kiểm **nội dung** khớp không. T3b kiểm **độ tươi**: doc này dựng từ BDD version nào, BDD giờ ở version nào. Đây là lỗ hổng cũ — không lệnh nào so hai giá trị này, nên tech-doc âm thầm lỗi thời mà vẫn giữ `@trace.status: approved`.*
|
|
94
|
+
|
|
95
|
+
Header tech-doc mang `@trace.bdd_versions` (**số nhiều** — map theo platform, vd `system=1.5, web=1.9`). Với **mỗi** entry trong map, đọc `@trace.bdd_version` (**số ít**, scalar) của `.feature` tương ứng (`{paths.specs_dir}/{domain}/{prd-slug}/bdd/{platform}/{TICKET-ID}-UC*.feature`):
|
|
96
|
+
|
|
97
|
+
| Điều kiện | Severity | Auto-fixable? |
|
|
98
|
+
|---|---|---|
|
|
99
|
+
| Map khớp `.feature` | *(sạch)* | — |
|
|
100
|
+
| `.feature` **mới hơn** map | **Major** | **No** — cần người review §4/§4.5 rồi bump `@trace.revision` |
|
|
101
|
+
| Platform có `.feature` nhưng **vắng** trong map | **Major** | Yes — thêm entry sau khi xác nhận §4 đã phủ platform đó |
|
|
102
|
+
| Map có platform mà **không** có `.feature` | Minor | Yes — xoá entry (BDD đã bỏ platform đó) |
|
|
103
|
+
|
|
104
|
+
Prose của finding "`.feature` mới hơn": *"tech-doc dựng từ BDD {platform}=v{old}, BDD giờ v{new} — §4 contract có thể đã lệch so với behavior đã chốt. Review lại §4.1–4.3 (+ §4.5 nếu FE) rồi bump `@trace.revision`."*
|
|
105
|
+
|
|
106
|
+
> **Vì sao là Major chứ không phải Minor:** `/generate-code` DS3 thấy tech-doc `@trace.status: approved` + 0 blocker-GAP thì lấy shape DTO/endpoint/error ở §4 **nguyên văn** làm contract "đã chốt". Contract dựng từ BDD cũ sẽ lan **thẳng** vào code, không cảnh báo. Đây là ca tệ hơn drift-về-code vì nó sai từ nguồn.
|
|
107
|
+
|
|
108
|
+
**Cổng chặn `approved` (chặn MỀM — đồng bộ với DS3/DS4 của `/generate-code`, không chặn cứng):** còn ≥1 finding T3b Major ở trạng thái `open` → khi người dùng định đặt `@trace.status: approved`, hiện CHECKPOINT:
|
|
109
|
+
```
|
|
110
|
+
⚠️ {n} platform có BDD mới hơn bản mà tech-doc này dựng từ:
|
|
111
|
+
{platform}: doc dựng từ v{old} · .feature giờ v{new}
|
|
112
|
+
Duyệt doc bây giờ = chốt một contract có thể đã lệch behavior.
|
|
113
|
+
Vẫn đặt approved? (Y/N)
|
|
114
|
+
```
|
|
115
|
+
Chỉ tiếp khi `Y`. *(Khác GATE của §12 blocker-GAP — cái đó chặn cứng. Ở đây chặn mềm vì BDD có thể bump vì lý do không chạm contract, vd sửa từ ngữ step; người review là người biết.)*
|
|
116
|
+
|
|
91
117
|
### T4 — Cross-PRD Endpoint Conflict Check *(targeted, load-on-hit)*
|
|
92
118
|
|
|
93
119
|
Mỗi PRD giờ chỉ 1 doc → xung đột TRONG doc đã do **T5** lo. T4 chỉ soi xung đột **liên-PRD** theo cách rẻ, KHÔNG nạp full doc khác:
|
|
@@ -248,7 +274,7 @@ sign_off_gate: blocked # blocked | ready — "ready" chỉ khi tất c
|
|
|
248
274
|
|
|
249
275
|
findings:
|
|
250
276
|
- id: "F001"
|
|
251
|
-
check_id: "T1" # T1
|
|
277
|
+
check_id: "T1" # T1 · T2 · T3 · T3b · T4 · T5 · T6 · T7 · T8 · T9
|
|
252
278
|
severity: "critical" # critical | major | minor
|
|
253
279
|
section: "{section heading hoặc tên component nơi tìm thấy lỗi}"
|
|
254
280
|
uc_id: "{UC-ID}" # UC mà finding này thuộc về (một trong `ucs`; đọc §10 để xác định)
|
|
@@ -320,6 +346,7 @@ Next: Mở trong Review Board → Accept/Modify/Reject từng finding
|
|
|
320
346
|
| T1 (Architecture) | Áp dụng fix cấu trúc từ note finding — chuyển logic về đúng layer, cập nhật mô tả component |
|
|
321
347
|
| T2 (Tên field) | Đổi field về tên canonical từ core-entities.md xuyên suốt tài liệu |
|
|
322
348
|
| T3 (Thiếu design note) | Thêm design decision note cho scenario chưa phủ |
|
|
349
|
+
| T3b (map bdd_version) | **Chỉ 2 ca auto-fixable:** platform vắng trong map → thêm entry `{platform}={bdd_version hiện tại}`; platform không còn `.feature` → xoá entry. Ca **`.feature` mới hơn** thì KHÔNG được chỉ sửa số trong map — làm vậy là dán nhãn "đã đồng bộ" lên một contract chưa ai review. Chỉ cập nhật entry sau khi note của reviewer xác nhận §4 đã được đối chiếu lại. |
|
|
323
350
|
| T5 (Internal inconsistency) | Căn chỉnh các section mâu thuẫn theo quyết định nêu trong note |
|
|
324
351
|
| T6 (Thiếu section) | Thêm skeleton section với prompt placeholder cho tech lead điền |
|
|
325
352
|
| T8 (cross-field invariant) | Thêm note invariant còn thiếu *(chỉ mục minor auto-fixable; enum mồ côi / PRD-BR bỏ sót / leak boundary cần người)* |
|
|
@@ -336,7 +363,9 @@ Sửa file tech-doc trực tiếp:
|
|
|
336
363
|
- (a) sign_off_gate = `ready` (tất cả sign-off done; hoặc doc không có phần system → không cần sign-off), **VÀ**
|
|
337
364
|
- (b) §12 GAP Register **không còn 🔴 blocker nào ở trạng thái `open`** (đếm ở T9).
|
|
338
365
|
Thiếu (a) hoặc (b) → set `in-review` (chặn `/generate-code`); ghi rõ lý do vào report (sign-off pending / còn N blocker-GAP open).
|
|
339
|
-
|
|
366
|
+
**Ngoài ra — cổng T3b (chặn MỀM):** còn ≥1 finding T3b Major `open` (`.feature` mới hơn map `@trace.bdd_versions`) → hiện CHECKPOINT ở T3b và chỉ set `approved` khi người dùng chọn `Y`; chọn `N` → `in-review` + nêu lý do.
|
|
367
|
+
3. **Làm mới map `@trace.bdd_versions`** — chỉ cho các platform mà finding T3b đã được **giải quyết** (reviewer xác nhận §4 đã đối chiếu lại, hoặc là ca thêm/xoá entry auto-fixable). Platform còn finding `open` thì **giữ nguyên số cũ**: để nó lệch chính là thứ giữ cờ `TECHDOC_STALE_VS_BDD` của `/validate-traces` sáng đèn.
|
|
368
|
+
4. Nếu block `@trace.sign_off` vắng và đây là tech doc system BDD → thêm nó với tất cả giá trị `pending`.
|
|
340
369
|
|
|
341
370
|
Ghi cả hai thay đổi vào file.
|
|
342
371
|
|
|
@@ -34,23 +34,23 @@ Hiển thị và chờ phản hồi:
|
|
|
34
34
|
```
|
|
35
35
|
⚙️ MODEL CHECK
|
|
36
36
|
──────────────────────────────────────────────────────────────────
|
|
37
|
-
Recommended :
|
|
37
|
+
Recommended : model Opus mới nhất
|
|
38
38
|
Why needed : Phân tích spec, review kiến trúc, sinh code đòi hỏi
|
|
39
|
-
suy luận sâu. Model nhỏ hơn dễ bỏ sót edge case.
|
|
39
|
+
suy luận sâu. Model nhỏ hơn (Haiku/Sonnet) dễ bỏ sót edge case.
|
|
40
40
|
|
|
41
41
|
Cách đổi trong Claude Code:
|
|
42
|
-
•
|
|
43
|
-
• hoặc:
|
|
42
|
+
• /model → chọn model Opus
|
|
43
|
+
• hoặc: Settings → Model
|
|
44
44
|
|
|
45
|
-
Đang chạy
|
|
46
|
-
Y — đúng
|
|
45
|
+
Đang chạy một model Opus?
|
|
46
|
+
Y — đúng → tiếp tục
|
|
47
47
|
S — bỏ qua kiểm tra (tôi chấp nhận rủi ro chất lượng thấp hơn với model hiện tại)
|
|
48
48
|
──────────────────────────────────────────────────────────────────
|
|
49
49
|
```
|
|
50
50
|
|
|
51
51
|
- "Y" → tiếp tục sang Bước 1.
|
|
52
52
|
- "S" → tiếp tục sang Bước 1 (người dùng chấp nhận rủi ro, thêm ⚠️ vào report cuối).
|
|
53
|
-
- "N" hoặc bất kỳ giá trị nào khác → **DỪNG.** Xuất: "Vui lòng chuyển sang
|
|
53
|
+
- "N" hoặc bất kỳ giá trị nào khác → **DỪNG.** Xuất: "Vui lòng chuyển sang một model Opus (`/model`) rồi chạy lại lệnh này."
|
|
54
54
|
|
|
55
55
|
## Bước 1 — Xác định Target File
|
|
56
56
|
|
|
@@ -59,7 +59,12 @@ Hiển thị và chờ phản hồi:
|
|
|
59
59
|
2. Nếu `$ARGUMENTS` là một **UC-ID / ticket ID / tên rút gọn** (không có path) → phân giải thành file bằng cách glob theo bố cục feature-package. `{prd-slug}` lúc này **chưa biết**, nên dùng wildcard `*` cho segment đó, và `**` đệ quy dưới `bdd/` để phủ hết các thư mục con theo platform (`bdd/web/`, `bdd/app/`, `bdd/system/`):
|
|
60
60
|
- **Lệnh BDD** (target là `.feature`): `{specs_dir}/{domain}/*/bdd/**/{UC-ID}*.feature` — hoặc `{specs_dir}/*/*/bdd/**/{UC-ID}*.feature` nếu domain cũng chưa biết. Nếu lệnh ngụ ý một platform/scope cụ thể (vd: system tech-doc cần BDD `system/`), ưu tiên kết quả trong thư mục con platform đó.
|
|
61
61
|
- **Lệnh PRD** (target là file PRD `{TICKET-ID}-{prd-slug}.md` — file `.md` duy nhất ở gốc feature folder, cạnh `bdd/`): `{specs_dir}/{domain}/*/{TICKET-ID}*.md` nếu biết TICKET-ID; nếu không, `{specs_dir}/{domain}/*/*.md` (khớp feature folder có id tương ứng), hoặc `{specs_dir}/*/*/*.md` nếu domain cũng chưa biết. *(Glob `*/*.md` ở cấp gốc folder chỉ khớp PRD — tech-docs/design-spec `.md` nằm sâu hơn trong thư mục con.)*
|
|
62
|
-
- **Lệnh tech-docs
|
|
62
|
+
- **Lệnh tech-docs** — target là tech-doc **gộp cấp PRD** `{TICKET-ID}-tech-design.md` (MỘT doc phủ nhiều UC; danh sách UC nằm ở `@trace.ucs`). Vì tên file mang `{TICKET-ID}` chứ **không** mang `{UC-ID}`, phải tách trước khi glob:
|
|
63
|
+
- `$ARGUMENTS` là **UC-ID** (`{TICKET-ID}-UC{N}`) → lấy `{TICKET-ID}` = phần **trước** `-UC`, rồi glob `{specs_dir}/{domain}/*/tech-docs/{TICKET-ID}-tech-design.md`.
|
|
64
|
+
- `$ARGUMENTS` là **TICKET-ID** → glob trực tiếp như trên.
|
|
65
|
+
- Chưa biết domain → `{specs_dir}/*/*/tech-docs/{TICKET-ID}-tech-design.md`.
|
|
66
|
+
- Vẫn không khớp → glob rộng `{specs_dir}/*/*/tech-docs/*tech-design*.md` rồi liệt kê để người dùng chọn.
|
|
67
|
+
*(Đừng glob `{UC-ID}*-tech-design*.md` — nó nở thành `FT-001-UC1*-tech-design*.md` và **không bao giờ** khớp `FT-001-tech-design.md`.)*
|
|
63
68
|
- **Lệnh design-spec**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
|
|
64
69
|
|
|
65
70
|
Khi một file khớp: đặt nó làm target **và** ghi lại `domain` + `prd_slug` từ path của nó (theo quy tắc trích xuất trong `context-loader.md` Bước 1 — `prd_slug` = segment đầu tiên sau `{specs_dir}/{domain}/`). Mọi path mà lệnh đọc/ghi về sau (BDD/tech-docs/design-spec/trace cùng cấp) đều dùng **`prd_slug` đã phân giải đó**, nên tất cả artifact nằm chung một feature package. Nếu nhiều file khớp (vd: nhiều platform), chọn theo platform/scope của lệnh hoặc liệt kê ra và hỏi.
|
|
@@ -241,11 +246,14 @@ forbidden:
|
|
|
241
246
|
- "Debug print statements"
|
|
242
247
|
|
|
243
248
|
# §4. Traceability
|
|
244
|
-
# Every
|
|
245
|
-
#
|
|
246
|
-
# @trace.
|
|
249
|
+
# Every entry-point method must carry the FULL block (repeat it per UC in a
|
|
250
|
+
# multi-UC file — the version tags are per-UC scalars, never merge them):
|
|
251
|
+
# @trace.implements={UC-ID}-SC{N}
|
|
252
|
+
# @trace.prd_version={PRD version} / @trace.bdd_version={BDD version} / @trace.tech_doc_revision={n}
|
|
253
|
+
# @trace.source=specs/{domain}/{prd-slug}/bdd/{platform}/{UC-ID}-{slug}.feature
|
|
254
|
+
# ({platform} = web|app|system · adjust the root if specs_dir differs in .agent/project-context.yaml)
|
|
247
255
|
# Tests must be tagged:
|
|
248
|
-
# @trace.verifies={UC-ID}
|
|
256
|
+
# @trace.verifies={UC-ID}-SC{N}
|
|
249
257
|
|
|
250
258
|
# §5. Error Handling
|
|
251
259
|
not_found: "{{NOT_FOUND_EXCEPTION}}"
|
|
@@ -438,7 +446,7 @@ Tìm lệnh hiện tại trong bảng phase dưới đây và đánh dấu **pha
|
|
|
438
446
|
| Phase | Commands |
|
|
439
447
|
|-------|----------|
|
|
440
448
|
| Discovery | `/define-product` |
|
|
441
|
-
| PRD | `/generate-prd` · `/refine-prd` · `/review-context` (PRD) |
|
|
449
|
+
| PRD | `/generate-prd` · `/extend-prd` · `/refine-prd` · `/review-context` (PRD) |
|
|
442
450
|
| Design Spec | `/generate-design-spec` |
|
|
443
451
|
| BDD | `/generate-bdd` · `/review-context` (BDD) |
|
|
444
452
|
| Tech Design | `/generate-tech-docs` · `/map-testids` · `/review-tech-docs` |
|
|
@@ -463,6 +471,7 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
|
|
|
463
471
|
| /setup-ai-first | `/define-product` để bắt đầu feature đầu tiên |
|
|
464
472
|
| /define-product | `/generate-prd {product-definition-file}` |
|
|
465
473
|
| /generate-prd | `/refine-prd {prd-file}` rồi `/review-context {prd-file}` |
|
|
474
|
+
| /extend-prd | `/refine-prd {prd-file}` (soi phần vừa thêm) rồi `/review-context {prd-file}` → PO duyệt → `/generate-bdd` **chỉ cho UC MỚI**; UC cũ dùng `/validate-traces --realign-prd-version {UC-ID}` |
|
|
466
475
|
| /refine-prd | Mở Review Board → cập nhật PRD → `/review-context {prd-file}` |
|
|
467
476
|
| /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) |
|
|
468
477
|
| /generate-design-spec | Designer review → xác nhận link Figma → PO + Designer sign-off → `/generate-bdd {prd-file}` |
|
|
@@ -475,6 +484,7 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
|
|
|
475
484
|
| /qc-run-test | `/qc-report {UC-ID}` rồi `/qc-review {UC-ID}` (review script) |
|
|
476
485
|
| /qc-review (script) | `/qc-report {UC-ID}` rồi tạo PR nếu APPROVED |
|
|
477
486
|
| /qc-report | `/validate-traces {UC-ID}` để làm mới Living Docs (qc_status) |
|
|
487
|
+
| /map-testids | `/qc-design-test {UC-ID}` (QC dựng Page Object từ contract §4.5.6 vừa ghi) |
|
|
478
488
|
| /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
|
|
479
489
|
| /review-tech-docs | `/generate-code {feature-file}` nếu APPROVED; sửa doc nếu NEEDS_FIX |
|
|
480
490
|
| /generate-code | Lần gen đầu → `/review-code {UC-ID}`; gen lại → `/dev-gen-test {UC-ID}` |
|
|
@@ -483,11 +493,11 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
|
|
|
483
493
|
| /dev-run-test (failing) | `/fix-bug {ticket-id}` hoặc `/debug {error}` |
|
|
484
494
|
| /review-code | `/dev-smoke-test {UC-ID}` hoặc tạo PR |
|
|
485
495
|
| /dev-smoke-test | Tạo PR và link tới ticket |
|
|
486
|
-
| /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}
|
|
487
|
-
| /fix-bug |
|
|
496
|
+
| /validate-traces | **Cờ 🔴 trước (chặn PR):** SEAM_UNWIRED → nối binding sang class thật, xoá/thay stub · STUB_UNRESOLVED → `/generate-code {owner_uc}` (lấp logic tại chỗ + xoá hàm song song) · ORPHANED/TRACE_ORPHAN → quyết định thủ công (xoá code+test, đưa scenario trở lại `.feature`, hoặc sửa `sc_id` của tag). **Rồi:** DRIFT/UNTRACKED → `/generate-code {UC-ID}` · BDD_DRIFT → `/generate-code {feature-file}` · tech-doc lỗi thời vs BDD → `/generate-tech-docs` → `/review-tech-docs` · PRD drift → `/generate-bdd {prd-file}` · GAP → `/dev-gen-test {UC-ID}`. **Chỉ tạo PR khi mọi cờ 🔴 = 0** |
|
|
497
|
+
| /fix-bug | `/dev-run-test {UC-ID}` (dev_selftest vừa reset về not_run) → tạo PR; nếu fix một `{BUG-ID}` → QC chạy `/qc-run-test {UC-ID}` để verify + đóng bug |
|
|
488
498
|
| /debug | `/fix-bug {ticket-id}` nếu cần sửa |
|
|
489
499
|
| /report-bug | Gửi cho dev (`/fix-bug {BUG-ID}`); nếu thiếu coverage → `/propose-scenario {UC-ID}` |
|
|
490
|
-
| /propose-scenario |
|
|
500
|
+
| /propose-scenario | **Case A** (thiếu scenario cho AC có sẵn) → báo PO/Dev review trong `feedback/bdd-proposals/`; `/generate-bdd` tự chèn khi `Status: accepted`. **Case B** (requirement mới) → `feedback/prd-change-requests/` — PO phải đưa vào PRD trước, KHÔNG tự vào BDD được; `/validate-traces` nhắc lại kèm số ngày chờ chừng nào `Status: Open` |
|
|
491
501
|
| /learn | Tiếp tục làm việc — lesson áp dụng ở lệnh kế tiếp |
|
|
492
502
|
| /sync | `/validate-traces` để xem độ phủ đầy đủ; xử lý mọi `📥 tester feedback` được nêu |
|
|
493
503
|
| /update-framework | Review `git diff .agent/`, commit; `/sync` để đồng bộ nội dung dự án |
|
|
@@ -152,11 +152,14 @@ forbidden:
|
|
|
152
152
|
- "Debug print statements"
|
|
153
153
|
|
|
154
154
|
# §4. Traceability
|
|
155
|
-
# Every
|
|
156
|
-
#
|
|
157
|
-
# @trace.
|
|
155
|
+
# Every entry-point method must carry the FULL block (repeat it per UC in a
|
|
156
|
+
# multi-UC file — the version tags are per-UC scalars, never merge them):
|
|
157
|
+
# @trace.implements={UC-ID}-SC{N}
|
|
158
|
+
# @trace.prd_version={PRD version} / @trace.bdd_version={BDD version} / @trace.tech_doc_revision={n}
|
|
159
|
+
# @trace.source=specs/{domain}/{prd-slug}/bdd/{platform}/{UC-ID}-{slug}.feature
|
|
160
|
+
# ({platform} = web|app|system · adjust the root if specs_dir differs in .agent/project-context.yaml)
|
|
158
161
|
# Tests must be tagged:
|
|
159
|
-
# @trace.verifies={UC-ID}
|
|
162
|
+
# @trace.verifies={UC-ID}-SC{N}
|
|
160
163
|
|
|
161
164
|
# §5. Error Handling
|
|
162
165
|
not_found: "{{NOT_FOUND_EXCEPTION}}"
|
package/commands/sync.md
CHANGED
|
@@ -261,16 +261,37 @@ Với mỗi entry trong danh sách đó:
|
|
|
261
261
|
|
|
262
262
|
## Step 4 — Check `.gitignore`
|
|
263
263
|
|
|
264
|
-
|
|
265
|
-
- `.trace/` trong `.gitignore` của repo hiện tại (hoặc `.git/info/exclude`)
|
|
266
|
-
- `.living-docs/` trong `.gitignore` của **specs module** (khi `setup.spec_source` được set)
|
|
264
|
+
*Bước này kiểm **hai chiều ngược nhau**, và nhầm chiều là mất dữ liệu — đọc bảng trước:*
|
|
267
265
|
|
|
268
|
-
|
|
266
|
+
| Đường dẫn | Vai trò | Kỳ vọng |
|
|
267
|
+
|---|---|---|
|
|
268
|
+
| `{paths.trace_dir}` (`.trace/` hoặc `{spec_source}/.trace/`) | **AUTHORITATIVE** — TSV + `trace-history.jsonl`, không regenerate được | **PHẢI commit** — gitignore nó là **lỗi nghiêm trọng** |
|
|
269
|
+
| `.trace-mirror/` | bản sao tiện cho panel VS Code | phải gitignore |
|
|
270
|
+
| `.living-docs/` | report sinh ra | phải gitignore |
|
|
271
|
+
|
|
272
|
+
**4a. Cảnh báo mềm — mirror chưa gitignore.**
|
|
273
|
+
Kiểm `.trace-mirror/` trong `.gitignore` của repo hiện tại (hoặc `.git/info/exclude`), và `.living-docs/` trong `.gitignore` của **specs module** (khi `setup.spec_source` được set). Thiếu cái nào:
|
|
274
|
+
```
|
|
275
|
+
⚠️ Mirror chưa gitignore — chúng được sinh ra, đừng bao giờ commit:
|
|
276
|
+
echo ".trace-mirror/" >> .gitignore
|
|
277
|
+
echo ".living-docs/" >> {spec_source}/.gitignore # specs module (nếu có spec_source)
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
**4b. 🔴 Báo động — sổ gốc ĐANG bị bỏ qua.**
|
|
281
|
+
Phân giải `{paths.trace_dir}`; nếu nó nằm trong một git repo, chạy `git -C {repo} check-ignore -q {trace_dir}`. **Trúng** (exit 0) → in ngay, mức chặn:
|
|
269
282
|
```
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
283
|
+
🔴 NGUY HIỂM — sổ gốc trace ĐANG bị git bỏ qua: {paths.trace_dir}
|
|
284
|
+
Toàn bộ trạng thái theo dõi (spec_ver · gen_ver · implemented_by · test_count ·
|
|
285
|
+
dev_selftest · qc_status) VÀ trace-history.jsonl KHÔNG được lưu vào git.
|
|
286
|
+
Người khác clone repo về sẽ không thấy gì, và lịch sử thì KHÔNG dựng lại được.
|
|
287
|
+
|
|
288
|
+
Sửa:
|
|
289
|
+
1. Gỡ dòng khớp `.trace` khỏi .gitignore của {repo}
|
|
290
|
+
2. git -C {repo} add -f {trace_dir} && git -C {repo} commit -m "restore trace state"
|
|
291
|
+
Nguyên nhân thường gặp: bản trước v0.4.3 gọi panel mirror là `.trace` (trùng tên sổ gốc),
|
|
292
|
+
nên gợi ý "gitignore .trace/" của chính lệnh này có thể đã nhắm trúng sổ gốc.
|
|
273
293
|
```
|
|
294
|
+
> **Vì sao cần báo động này:** trước v0.4.3, mirror và sổ gốc **cùng tên `.trace`**. Khi dev mở thẳng spec repo làm workspace thì hai path bằng nhau — và Step 4 (bản cũ) gợi ý gitignore theo **tên**, không theo vai trò. Làm theo là mất sổ gốc, **im lặng**: máy vẫn chạy, dashboard vẫn có số; chỉ người thứ hai clone về mới phát hiện. Bản v0.4.3 đổi tên mirror thành `.trace-mirror` để cái bẫy biến mất, nhưng **dự án đã dính từ trước thì vẫn dính** — 4b là để tìm ra chúng.
|
|
274
295
|
|
|
275
296
|
---
|
|
276
297
|
|
|
@@ -280,12 +301,12 @@ Nếu thiếu cái nào:
|
|
|
280
301
|
|
|
281
302
|
**Phân giải Living Docs home (cùng quy tắc như `/validate-traces`):**
|
|
282
303
|
- `living_docs_dir` = `{spec_source}/.living-docs` nếu `setup.spec_source` được set, else `.living-docs` ở umbrella root. *(Specs module được mount trong mọi service workspace, nên panel phân giải nó kể cả khi dev mở một service submodule đơn.)*
|
|
283
|
-
- `panel_mirror` = `./.trace` ở gốc workspace hiện tại.
|
|
304
|
+
- `panel_mirror` = `./.trace-mirror` ở gốc workspace hiện tại. *(Cố ý KHÁC tên `.trace` — xem Step 4.)*
|
|
284
305
|
|
|
285
306
|
1. Với mỗi service trong danh sách **đã làm phẳng** ở Step 3 (gồm cả các submodule nằm dưới `by_prd_slug` — bỏ sót chúng là mất trace của các repo chia theo feature): nếu `{service.path}/.trace/` có file `.tsv` → copy chúng vào `{living_docs_dir}/{service-name}/` (tạo dir nếu cần).
|
|
286
307
|
2. Ghi merged `{living_docs_dir}/trace-report.json`:
|
|
287
308
|
- Tổng hợp TSV `.trace/` của mỗi service, thêm field `"service"` **và `"platform"`** (suy từ tên file `{UC-ID}-{platform}.tsv`) cho mỗi row, tính lại summary totals. **Không dedupe theo `sc_id` giữa các platform** — `web·SC1` và `system·SC1` là 2 row khác nhau; nhờ field `platform` dashboard hiển thị tách bạch coverage từng platform.
|
|
288
|
-
3. **Mirror tới panel location:** copy `{living_docs_dir}/trace-report.json` (+ TSV namespaced) → `{panel_mirror}/` để panel trong repo đang mở không rỗng. Skip nếu `panel_mirror` đã bằng `living_docs_dir
|
|
309
|
+
3. **Mirror tới panel location:** copy `{living_docs_dir}/trace-report.json` (+ TSV namespaced) → `{panel_mirror}/` để panel trong repo đang mở không rỗng. Skip nếu `panel_mirror` đã bằng `living_docs_dir`, hoặc nếu `{paths.trace_dir}` đã nằm trong workspace hiện tại (panel đọc thẳng ở đó). **KHÔNG** copy `trace-history.jsonl` — nó là dữ liệu tích luỹ, không phải thứ sinh lại được.
|
|
289
310
|
|
|
290
311
|
In kết quả sync:
|
|
291
312
|
```
|
|
@@ -348,7 +369,7 @@ Tìm lệnh hiện tại trong bảng phase dưới đây và đánh dấu **pha
|
|
|
348
369
|
| Phase | Commands |
|
|
349
370
|
|-------|----------|
|
|
350
371
|
| Discovery | `/define-product` |
|
|
351
|
-
| PRD | `/generate-prd` · `/refine-prd` · `/review-context` (PRD) |
|
|
372
|
+
| PRD | `/generate-prd` · `/extend-prd` · `/refine-prd` · `/review-context` (PRD) |
|
|
352
373
|
| Design Spec | `/generate-design-spec` |
|
|
353
374
|
| BDD | `/generate-bdd` · `/review-context` (BDD) |
|
|
354
375
|
| Tech Design | `/generate-tech-docs` · `/map-testids` · `/review-tech-docs` |
|
|
@@ -373,6 +394,7 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
|
|
|
373
394
|
| /setup-ai-first | `/define-product` để bắt đầu feature đầu tiên |
|
|
374
395
|
| /define-product | `/generate-prd {product-definition-file}` |
|
|
375
396
|
| /generate-prd | `/refine-prd {prd-file}` rồi `/review-context {prd-file}` |
|
|
397
|
+
| /extend-prd | `/refine-prd {prd-file}` (soi phần vừa thêm) rồi `/review-context {prd-file}` → PO duyệt → `/generate-bdd` **chỉ cho UC MỚI**; UC cũ dùng `/validate-traces --realign-prd-version {UC-ID}` |
|
|
376
398
|
| /refine-prd | Mở Review Board → cập nhật PRD → `/review-context {prd-file}` |
|
|
377
399
|
| /review-context (PRD) | Khi 0 critical → PO đặt `Status: approved`, rồi FE/App: `/generate-design-spec {prd-file}` (→ design sign-off → BDD); BE: `/generate-bdd {prd-file}`. Còn critical/NEEDS_FIX → sửa PRD (giữ draft) |
|
|
378
400
|
| /generate-design-spec | Designer review → xác nhận link Figma → PO + Designer sign-off → `/generate-bdd {prd-file}` |
|
|
@@ -385,6 +407,7 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
|
|
|
385
407
|
| /qc-run-test | `/qc-report {UC-ID}` rồi `/qc-review {UC-ID}` (review script) |
|
|
386
408
|
| /qc-review (script) | `/qc-report {UC-ID}` rồi tạo PR nếu APPROVED |
|
|
387
409
|
| /qc-report | `/validate-traces {UC-ID}` để làm mới Living Docs (qc_status) |
|
|
410
|
+
| /map-testids | `/qc-design-test {UC-ID}` (QC dựng Page Object từ contract §4.5.6 vừa ghi) |
|
|
388
411
|
| /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
|
|
389
412
|
| /review-tech-docs | `/generate-code {feature-file}` nếu APPROVED; sửa doc nếu NEEDS_FIX |
|
|
390
413
|
| /generate-code | Lần gen đầu → `/review-code {UC-ID}`; gen lại → `/dev-gen-test {UC-ID}` |
|
|
@@ -393,11 +416,11 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
|
|
|
393
416
|
| /dev-run-test (failing) | `/fix-bug {ticket-id}` hoặc `/debug {error}` |
|
|
394
417
|
| /review-code | `/dev-smoke-test {UC-ID}` hoặc tạo PR |
|
|
395
418
|
| /dev-smoke-test | Tạo PR và link tới ticket |
|
|
396
|
-
| /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}
|
|
397
|
-
| /fix-bug |
|
|
419
|
+
| /validate-traces | **Cờ 🔴 trước (chặn PR):** SEAM_UNWIRED → nối binding sang class thật, xoá/thay stub · STUB_UNRESOLVED → `/generate-code {owner_uc}` (lấp logic tại chỗ + xoá hàm song song) · ORPHANED/TRACE_ORPHAN → quyết định thủ công (xoá code+test, đưa scenario trở lại `.feature`, hoặc sửa `sc_id` của tag). **Rồi:** DRIFT/UNTRACKED → `/generate-code {UC-ID}` · BDD_DRIFT → `/generate-code {feature-file}` · tech-doc lỗi thời vs BDD → `/generate-tech-docs` → `/review-tech-docs` · PRD drift → `/generate-bdd {prd-file}` · GAP → `/dev-gen-test {UC-ID}`. **Chỉ tạo PR khi mọi cờ 🔴 = 0** |
|
|
420
|
+
| /fix-bug | `/dev-run-test {UC-ID}` (dev_selftest vừa reset về not_run) → tạo PR; nếu fix một `{BUG-ID}` → QC chạy `/qc-run-test {UC-ID}` để verify + đóng bug |
|
|
398
421
|
| /debug | `/fix-bug {ticket-id}` nếu cần sửa |
|
|
399
422
|
| /report-bug | Gửi cho dev (`/fix-bug {BUG-ID}`); nếu thiếu coverage → `/propose-scenario {UC-ID}` |
|
|
400
|
-
| /propose-scenario |
|
|
423
|
+
| /propose-scenario | **Case A** (thiếu scenario cho AC có sẵn) → báo PO/Dev review trong `feedback/bdd-proposals/`; `/generate-bdd` tự chèn khi `Status: accepted`. **Case B** (requirement mới) → `feedback/prd-change-requests/` — PO phải đưa vào PRD trước, KHÔNG tự vào BDD được; `/validate-traces` nhắc lại kèm số ngày chờ chừng nào `Status: Open` |
|
|
401
424
|
| /learn | Tiếp tục làm việc — lesson áp dụng ở lệnh kế tiếp |
|
|
402
425
|
| /sync | `/validate-traces` để xem độ phủ đầy đủ; xử lý mọi `📥 tester feedback` được nêu |
|
|
403
426
|
| /update-framework | Review `git diff .agent/`, commit; `/sync` để đồng bộ nội dung dự án |
|
|
@@ -444,18 +467,20 @@ Service Configs
|
|
|
444
467
|
→ create it so /dev-run-test works correctly
|
|
445
468
|
|
|
446
469
|
.gitignore
|
|
447
|
-
✅ .trace/
|
|
448
|
-
|
|
470
|
+
✅ .trace-mirror/ + .living-docs/ gitignored (mirror — sinh lại được)
|
|
471
|
+
✅ {paths.trace_dir}/ KHÔNG bị gitignore (sổ gốc — phải commit)
|
|
472
|
+
(hoặc: ⚠️ Thêm .trace-mirror/ vào .gitignore)
|
|
473
|
+
(hoặc: 🔴 NGUY HIỂM — sổ gốc {paths.trace_dir} đang bị gitignore, xem Step 4b)
|
|
449
474
|
|
|
450
475
|
Living Docs
|
|
451
|
-
✅
|
|
452
|
-
(
|
|
476
|
+
✅ {panel_mirror}/ synced — {N} TSVs across {S} services
|
|
477
|
+
(chạy /validate-traces để có report coverage đầy đủ)
|
|
453
478
|
|
|
454
479
|
Spec Manifest
|
|
455
480
|
✅ spec-manifest.yaml — {N} features indexed
|
|
456
481
|
|
|
457
482
|
---
|
|
458
483
|
Status : ✅ Complete | ⚠️ Warnings
|
|
459
|
-
Output Artifacts: updated .trace/ (
|
|
484
|
+
Output Artifacts: updated .trace-mirror/ (panel mirror), spec-manifest.yaml
|
|
460
485
|
Next : /validate-traces (full coverage check) | /generate-code {UC-ID} (start coding)
|
|
461
486
|
```
|
package/commands/sync.tmpl
CHANGED
|
@@ -261,16 +261,37 @@ Với mỗi entry trong danh sách đó:
|
|
|
261
261
|
|
|
262
262
|
## Step 4 — Check `.gitignore`
|
|
263
263
|
|
|
264
|
-
|
|
265
|
-
- `.trace/` trong `.gitignore` của repo hiện tại (hoặc `.git/info/exclude`)
|
|
266
|
-
- `.living-docs/` trong `.gitignore` của **specs module** (khi `setup.spec_source` được set)
|
|
264
|
+
*Bước này kiểm **hai chiều ngược nhau**, và nhầm chiều là mất dữ liệu — đọc bảng trước:*
|
|
267
265
|
|
|
268
|
-
|
|
266
|
+
| Đường dẫn | Vai trò | Kỳ vọng |
|
|
267
|
+
|---|---|---|
|
|
268
|
+
| `{paths.trace_dir}` (`.trace/` hoặc `{spec_source}/.trace/`) | **AUTHORITATIVE** — TSV + `trace-history.jsonl`, không regenerate được | **PHẢI commit** — gitignore nó là **lỗi nghiêm trọng** |
|
|
269
|
+
| `.trace-mirror/` | bản sao tiện cho panel VS Code | phải gitignore |
|
|
270
|
+
| `.living-docs/` | report sinh ra | phải gitignore |
|
|
271
|
+
|
|
272
|
+
**4a. Cảnh báo mềm — mirror chưa gitignore.**
|
|
273
|
+
Kiểm `.trace-mirror/` trong `.gitignore` của repo hiện tại (hoặc `.git/info/exclude`), và `.living-docs/` trong `.gitignore` của **specs module** (khi `setup.spec_source` được set). Thiếu cái nào:
|
|
274
|
+
```
|
|
275
|
+
⚠️ Mirror chưa gitignore — chúng được sinh ra, đừng bao giờ commit:
|
|
276
|
+
echo ".trace-mirror/" >> .gitignore
|
|
277
|
+
echo ".living-docs/" >> {spec_source}/.gitignore # specs module (nếu có spec_source)
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
**4b. 🔴 Báo động — sổ gốc ĐANG bị bỏ qua.**
|
|
281
|
+
Phân giải `{paths.trace_dir}`; nếu nó nằm trong một git repo, chạy `git -C {repo} check-ignore -q {trace_dir}`. **Trúng** (exit 0) → in ngay, mức chặn:
|
|
269
282
|
```
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
283
|
+
🔴 NGUY HIỂM — sổ gốc trace ĐANG bị git bỏ qua: {paths.trace_dir}
|
|
284
|
+
Toàn bộ trạng thái theo dõi (spec_ver · gen_ver · implemented_by · test_count ·
|
|
285
|
+
dev_selftest · qc_status) VÀ trace-history.jsonl KHÔNG được lưu vào git.
|
|
286
|
+
Người khác clone repo về sẽ không thấy gì, và lịch sử thì KHÔNG dựng lại được.
|
|
287
|
+
|
|
288
|
+
Sửa:
|
|
289
|
+
1. Gỡ dòng khớp `.trace` khỏi .gitignore của {repo}
|
|
290
|
+
2. git -C {repo} add -f {trace_dir} && git -C {repo} commit -m "restore trace state"
|
|
291
|
+
Nguyên nhân thường gặp: bản trước v0.4.3 gọi panel mirror là `.trace` (trùng tên sổ gốc),
|
|
292
|
+
nên gợi ý "gitignore .trace/" của chính lệnh này có thể đã nhắm trúng sổ gốc.
|
|
273
293
|
```
|
|
294
|
+
> **Vì sao cần báo động này:** trước v0.4.3, mirror và sổ gốc **cùng tên `.trace`**. Khi dev mở thẳng spec repo làm workspace thì hai path bằng nhau — và Step 4 (bản cũ) gợi ý gitignore theo **tên**, không theo vai trò. Làm theo là mất sổ gốc, **im lặng**: máy vẫn chạy, dashboard vẫn có số; chỉ người thứ hai clone về mới phát hiện. Bản v0.4.3 đổi tên mirror thành `.trace-mirror` để cái bẫy biến mất, nhưng **dự án đã dính từ trước thì vẫn dính** — 4b là để tìm ra chúng.
|
|
274
295
|
|
|
275
296
|
---
|
|
276
297
|
|
|
@@ -280,12 +301,12 @@ Nếu thiếu cái nào:
|
|
|
280
301
|
|
|
281
302
|
**Phân giải Living Docs home (cùng quy tắc như `/validate-traces`):**
|
|
282
303
|
- `living_docs_dir` = `{spec_source}/.living-docs` nếu `setup.spec_source` được set, else `.living-docs` ở umbrella root. *(Specs module được mount trong mọi service workspace, nên panel phân giải nó kể cả khi dev mở một service submodule đơn.)*
|
|
283
|
-
- `panel_mirror` = `./.trace` ở gốc workspace hiện tại.
|
|
304
|
+
- `panel_mirror` = `./.trace-mirror` ở gốc workspace hiện tại. *(Cố ý KHÁC tên `.trace` — xem Step 4.)*
|
|
284
305
|
|
|
285
306
|
1. Với mỗi service trong danh sách **đã làm phẳng** ở Step 3 (gồm cả các submodule nằm dưới `by_prd_slug` — bỏ sót chúng là mất trace của các repo chia theo feature): nếu `{service.path}/.trace/` có file `.tsv` → copy chúng vào `{living_docs_dir}/{service-name}/` (tạo dir nếu cần).
|
|
286
307
|
2. Ghi merged `{living_docs_dir}/trace-report.json`:
|
|
287
308
|
- Tổng hợp TSV `.trace/` của mỗi service, thêm field `"service"` **và `"platform"`** (suy từ tên file `{UC-ID}-{platform}.tsv`) cho mỗi row, tính lại summary totals. **Không dedupe theo `sc_id` giữa các platform** — `web·SC1` và `system·SC1` là 2 row khác nhau; nhờ field `platform` dashboard hiển thị tách bạch coverage từng platform.
|
|
288
|
-
3. **Mirror tới panel location:** copy `{living_docs_dir}/trace-report.json` (+ TSV namespaced) → `{panel_mirror}/` để panel trong repo đang mở không rỗng. Skip nếu `panel_mirror` đã bằng `living_docs_dir
|
|
309
|
+
3. **Mirror tới panel location:** copy `{living_docs_dir}/trace-report.json` (+ TSV namespaced) → `{panel_mirror}/` để panel trong repo đang mở không rỗng. Skip nếu `panel_mirror` đã bằng `living_docs_dir`, hoặc nếu `{paths.trace_dir}` đã nằm trong workspace hiện tại (panel đọc thẳng ở đó). **KHÔNG** copy `trace-history.jsonl` — nó là dữ liệu tích luỹ, không phải thứ sinh lại được.
|
|
289
310
|
|
|
290
311
|
In kết quả sync:
|
|
291
312
|
```
|
|
@@ -344,18 +365,20 @@ Service Configs
|
|
|
344
365
|
→ create it so /dev-run-test works correctly
|
|
345
366
|
|
|
346
367
|
.gitignore
|
|
347
|
-
✅ .trace/
|
|
348
|
-
|
|
368
|
+
✅ .trace-mirror/ + .living-docs/ gitignored (mirror — sinh lại được)
|
|
369
|
+
✅ {paths.trace_dir}/ KHÔNG bị gitignore (sổ gốc — phải commit)
|
|
370
|
+
(hoặc: ⚠️ Thêm .trace-mirror/ vào .gitignore)
|
|
371
|
+
(hoặc: 🔴 NGUY HIỂM — sổ gốc {paths.trace_dir} đang bị gitignore, xem Step 4b)
|
|
349
372
|
|
|
350
373
|
Living Docs
|
|
351
|
-
✅
|
|
352
|
-
(
|
|
374
|
+
✅ {panel_mirror}/ synced — {N} TSVs across {S} services
|
|
375
|
+
(chạy /validate-traces để có report coverage đầy đủ)
|
|
353
376
|
|
|
354
377
|
Spec Manifest
|
|
355
378
|
✅ spec-manifest.yaml — {N} features indexed
|
|
356
379
|
|
|
357
380
|
---
|
|
358
381
|
Status : ✅ Complete | ⚠️ Warnings
|
|
359
|
-
Output Artifacts: updated .trace/ (
|
|
382
|
+
Output Artifacts: updated .trace-mirror/ (panel mirror), spec-manifest.yaml
|
|
360
383
|
Next : /validate-traces (full coverage check) | /generate-code {UC-ID} (start coding)
|
|
361
384
|
```
|