@educa-corp/sdd-framework 0.7.0 → 0.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/bin/lint-trace.js +64 -3
  2. package/bin/self-check.js +8 -5
  3. package/bin/trace-schema.json +44 -4
  4. package/core/FRAMEWORK_VERSION +1 -1
  5. package/core/commands/amend-prd.md +3 -2
  6. package/core/commands/dev-run-test.md +1 -1
  7. package/core/commands/generate-bdd.md +9 -6
  8. package/core/commands/generate-code.md +2 -2
  9. package/core/commands/generate-tech-docs.md +2 -2
  10. package/core/commands/map-testids.md +1 -1
  11. package/core/commands/validate-traces.md +6 -6
  12. package/core/steps/context-loader.md +1 -1
  13. package/core/templates/ci/trace-gate.gitlab-ci.yml +169 -0
  14. package/core/templates/project-context.yaml +3 -3
  15. package/core/templates/tech-design.template.md +2 -2
  16. package/docs/02-concepts/architecture.md +1 -1
  17. package/docs/02-concepts/overview.md +1 -1
  18. package/docs/02-concepts/pipeline-steps/02-specification.md +13 -7
  19. package/docs/02-concepts/pipeline-steps/07-dev-selftest.md +2 -0
  20. package/docs/02-concepts/pipeline-steps/08-qc-automation.md +1 -0
  21. package/docs/02-concepts/pipeline-steps/09-validate-traces.md +34 -3
  22. package/docs/02-concepts/pipeline-steps/10-feedback-loop.md +10 -1
  23. package/docs/02-concepts/traceability.md +187 -183
  24. package/docs/03-guides/architect.md +15 -5
  25. package/docs/03-guides/developer.md +1 -0
  26. package/docs/03-guides/product-owner.md +89 -72
  27. package/docs/03-guides/tester-qa.md +81 -81
  28. package/docs/04-reference/commands.md +1 -1
  29. package/docs/04-reference/trace-schema.md +8 -1
  30. package/docs/explain/02c-amend-prd.md +1 -1
  31. package/docs/explain/06-generate-bdd.md +1 -1
  32. package/docs/explain/13-dev-run-test.md +15 -1
  33. package/docs/explain/19-qc-run-test.md +91 -87
  34. package/docs/explain/21-validate-traces.md +79 -75
  35. package/package.json +1 -1
@@ -1,75 +1,79 @@
1
- [← /qc-report](20-qc-report.md) · [Explain Home](README.md) · [Next: /generate-spec-manifest →](22-generate-spec-manifest.md)
2
-
3
- # 21 · `/validate-traces` — Ma trận độ phủ spec ↔ code ↔ test
4
-
5
- > **Một câu.** Check **read-only** độ phủ giữa spec, code, test (gồm PRD version drift); phân loại mỗi SC và làm mới Living Docs. Không sửa gì.
6
-
7
- ---
8
-
9
- ## Vấn đề giải quyết
10
-
11
- Traceability chỉ có giá trị khi kiểm được. Command cho bức tranh toàn cục: SC nào có code, có test, hay còn hở — để không "tưởng xong mà chưa xong".
12
-
13
- ---
14
-
15
- ## Vị trí & tiền đề
16
-
17
- - **Vị trí:** Phase Trace Audit (xuyên suốt).
18
- - **Đặc biệt:** read-only — an toàn chạy bất kỳ lúc nào.
19
-
20
- ---
21
-
22
- ## Input / Output
23
-
24
- **Input:** `.trace/…/{UC-ID}-{platform}.tsv` + spec + code + test.
25
-
26
- **Output:** ma trận coverage + `code_coverage`; `trace-report.json` (ghi đè) + **`trace-history.jsonl`** (append 1 dòng delta — **phải commit**, không regenerate được); làm mới Living Docs dashboard.
27
-
28
- **Flag:** `--realign-prd-version {UC-ID}` · `--realign-techdoc-revision {UC-ID}` ngoại lệ kiểm soát của "read-only": chỉ sửa **dòng `@trace.*`** trong code, **từ chối chạy** nếu UC đang `DRIFT`/`ORPHANED`.
29
-
30
- ---
31
-
32
- ## Các bước xử (chi tiết)
33
-
34
- 1. Quét trace `.tsv` + đối chiếu spec/code/test.
35
- 2. Phân loại mỗi SC theo **thứ tự ưu tiên** (rule sớm thắng):
36
- | # | Trạng thái | Điều kiện |
37
- |---|-----------|-----------|
38
- | 1 | UNTRACKED | `gen_ver == —` |
39
- | 2 | DRIFT | code + `spec_ver != gen_ver` |
40
- | 3 | GAP | code + `test_count == —/0` |
41
- | 4 | OK | version khớp + có code + có test |
42
- 3. Dựng dashboard: `dev_selftest` (DEV smoke) **và** `qc_status` (QC chính thức) hiển thị cạnh nhau — **không merge**; cột `qc_owner` + `qc_blocked_by` ("Waiting on"); và **hai trục chia nhóm**: **`by_service`** (coverage theo từng đội — cột `service`) · **`by_platform`** (coverage theo `web`/`app`/`system`).
43
- > `by_platform` trả lời *"web xong bao nhiêu %, system xong bao nhiêu %"* — câu thường ngày khi làm FE và BE song song. Trước v0.5.1 không trả lời được **từ `summary`**: `by_service` là bảng chia nhóm duy nhất, mà cột `service` là `—` ở mọi row của dự án single-service ⇒ nó gộp tất cả vào một ô.
44
- 4. **Lọc báo động oan (Step 4/5).** PRD và tech-doc là tài liệu **gộp** nhiều UC nhưng chỉ **một** số version — thêm UC7 làm mọi UC cũ lệch số dù không đổi một chữ. Đọc **scope của row changelog**: UC trong danh sách → `PRD_DRIFT` 🟠 · không có → `PRD_STALE_REF` ⓘ (sạch bằng `--realign-*`) · row **mơ hồ** → 🟠 cho mọi UC (lưới an toàn).
45
- 5. **Step 5d design-spec drift** *(chỉ FE/App)*: 2 chiều, design-spec→BDD design-spec→code.
46
- 6. **Step 7b hàng đợi**: đếm PRD change request còn `Open` kèm **số ngày chờ** (hàng đợi duy nhất không lệnh nào quét lại mỗi lần chạy).
47
- 7. **Step 8cnhật ký**: append delta vào `trace-history.jsonl` in khối `📈 So lần chạy trước` (đo **tốc độ**, không chỉ trạng thái).
48
-
49
- ---
50
-
51
- ## Checkpoint & Gate
52
-
53
- - ⚪ Read-only, không gate.
54
-
55
- ---
56
-
57
- ## chế đặc biệt
58
-
59
- - **DRIFT xét trước GAP** — code lỗi thời chưa test phải hiện DRIFT (regen) không phải GAP.
60
- - **`dev_selftest` ≠ `qc_status`** — hai cột riêng, không trộn.
61
- - **"Waiting on" column** — `qc_owner`/`qc_blocked_by` trả lời "case nào chờ ai".
62
-
63
- ---
64
-
65
- ## 👓 Góc nhìn tối ưu
66
-
67
- - **Chỉ báo cáo, không hành động** — hành động ở `/generate-code` (regen DRIFT) & QC (bù GAP). Chuỗi phụ thuộc người chạy tiếp.
68
- - **Nguồn sự thật của Living Docs** — chất lượng dashboard phụ thuộc `.tsv` được các lệnh code/test ghi đúng.
69
- - **Là "single pane" để PM/PO nhìn trạng thái** — ứng viên tốt cho UI viewer (blueprint có gợi ý).
70
-
71
- ---
72
-
73
- ## Kết nối
74
-
75
- **Trước:** bất kỳ (đặc biệt sau [`/qc-report`](20-qc-report.md)) · **Sau:** DRIFT/UNTRACKED → [`/generate-code`](09-generate-code.md); GAP → [`/dev-gen-test`](12-dev-gen-test.md); OK → PR.
1
+ [← /qc-report](20-qc-report.md) · [Explain Home](README.md) · [Next: /generate-spec-manifest →](22-generate-spec-manifest.md)
2
+
3
+ # 21 · `/validate-traces` — Ma trận độ phủ spec ↔ code ↔ test
4
+
5
+ > **Một câu.** Check **read-only** độ phủ giữa spec, code, test (gồm PRD version drift); phân loại mỗi SC và làm mới Living Docs. Không sửa gì.
6
+
7
+ ---
8
+
9
+ ## Vấn đề giải quyết
10
+
11
+ Traceability chỉ có giá trị khi kiểm được. Command cho bức tranh toàn cục: SC nào có code, có test, hay còn hở — để không "tưởng xong mà chưa xong".
12
+
13
+ ---
14
+
15
+ ## Vị trí & tiền đề
16
+
17
+ - **Vị trí:** Phase Trace Audit (xuyên suốt).
18
+ - **Đặc biệt:** read-only — an toàn chạy bất kỳ lúc nào.
19
+
20
+ ---
21
+
22
+ ## Input / Output
23
+
24
+ **Input:** `.trace/…/{UC-ID}-{platform}.tsv` + spec + code + test.
25
+
26
+ **Output:** ma trận coverage + `code_coverage`; `trace-report.json` (ghi đè) + **`trace-history.jsonl`** (append 1 dòng delta — **phải commit**, không regenerate được); làm mới Living Docs dashboard.
27
+
28
+ **Flag — phạm vi:** `--domain {d}` · `--prd {TICKET-ID}` · `--uc {UC-ID}`; không cờ nào = **toàn bộ**. Report mang field `scope`, `gate-trace` **G2 fail** nếu `scope.kind !== "all"` **không ngoại lệ**, không đếm số domain trên đĩa. Biên bản có scope **không bao giờ** biên bản đầy đủ; muốn tạo PR thì phải có một lần audit toàn bộ đã commit. *(`/sync` Step 1e nói cho bạn biết scope là gì.)*
29
+
30
+ **Flag — realign:** `--realign-prd-version {UC-ID}` · `--realign-techdoc-revision {UC-ID}` — ngoại lệ có kiểm soát của "read-only": chỉ sửa **dòng `@trace.*`** trong code, **từ chối chạy** nếu UC đang `DRIFT`/`ORPHANED` hoặc bị Step 4/5 xếp 🟠.
31
+
32
+ **Cờ mới `PRD_UNTRACKED_EDIT`** 🔴 *(Step 3.9, chạy **trước** Step 4)* — nội dung PRD đổi mà nhãn `Version` **không** đổi ⇒ có người sửa ngoài `/generate-prd` · `/extend-prd` · `/amend-prd` · `/refine-prd` · `/review-context`. So bằng `git diff` **và** `git status` *(nguồn thứ hai bắt ca sửa **chưa** commit — ca thường gặp nhất)* với mốc `spec_baseline` mà Step 6b ghi. **Không chặn PR** có chủ ý, và **không có `--accept-edit`**: đường ra là bump `Version` + row changelog ⇒ cờ tự tắt.
33
+
34
+ ---
35
+
36
+ ## Các bước xử (chi tiết)
37
+
38
+ 1. Quét trace `.tsv` + đối chiếu spec/code/test.
39
+ 2. Phân loại mỗi SC theo **thứ tự ưu tiên** (rule sớm thắng):
40
+ | # | Trạng thái | Điều kiện |
41
+ |---|-----------|-----------|
42
+ | 1 | UNTRACKED | `gen_ver == —` |
43
+ | 2 | DRIFT | code + `spec_ver != gen_ver` |
44
+ | 3 | GAP |code + `test_count == —/0` |
45
+ | 4 | OK | version khớp + code + test |
46
+ 3. Dựng dashboard: `dev_selftest` (DEV smoke) **và** `qc_status` (QC chính thức) hiển thị cạnh nhau **không merge**; cột `qc_owner` + `qc_blocked_by` ("Waiting on"); và **hai trục chia nhóm**: **`by_service`** (coverage theo từng đội cột `service`) · **`by_platform`** (coverage theo `web`/`app`/`system`).
47
+ > `by_platform` trả lời *"web xong bao nhiêu %, system xong bao nhiêu %"* câu thường ngày khi làm FE và BE song song. Trước v0.5.1 không trả lời được **từ `summary`**: `by_service` bảng chia nhóm duy nhất, mà cột `service` `—` mọi row của dự án single-service ⇒ nó gộp tất cả vào một ô.
48
+ 4. **Lọc báo động oan (Step 4/5).** PRD và tech-doc là tài liệu **gộp** nhiều UC nhưng chỉ **một** số version — thêm UC7 làm mọi UC cũ lệch số dù không đổi một chữ. Đọc **scope của row changelog**: UC có trong danh sách → `PRD_DRIFT` 🟠 · không có → `PRD_STALE_REF` ⓘ (sạch bằng `--realign-*`) · row **mơ hồ** → 🟠 cho mọi UC (lưới an toàn).
49
+ 5. **Step 5d — design-spec drift** *(chỉ FE/App)*: 2 chiều, design-spec→BDD và design-spec→code.
50
+ 6. **Step 7b — hàng đợi**: đếm PRD change request còn `Open` kèm **số ngày chờ** (hàng đợi duy nhất không có lệnh nào quét lại mỗi lần chạy).
51
+ 7. **Step 8c — nhật ký**: append delta vào `trace-history.jsonl` → in khối `📈 So lần chạy trước` (đo **tốc độ**, không chỉ trạng thái).
52
+
53
+ ---
54
+
55
+ ## Checkpoint & Gate
56
+
57
+ - Read-only, không gate.
58
+
59
+ ---
60
+
61
+ ## chế đặc biệt
62
+
63
+ - **DRIFT xét trước GAP** — code lỗi thời chưa test phải hiện DRIFT (regen) không phải GAP.
64
+ - **`dev_selftest` ≠ `qc_status`** — hai cột riêng, không trộn.
65
+ - **"Waiting on" column** `qc_owner`/`qc_blocked_by` trả lời "case nào chờ ai".
66
+
67
+ ---
68
+
69
+ ## 👓 Góc nhìn tối ưu
70
+
71
+ - **Chỉ báo cáo, không hành động** — hành động ở `/generate-code` (regen DRIFT) & QC (bù GAP). Chuỗi phụ thuộc người chạy tiếp.
72
+ - **Nguồn sự thật của Living Docs** — chất lượng dashboard phụ thuộc `.tsv` được các lệnh code/test ghi đúng.
73
+ - **Là "single pane" để PM/PO nhìn trạng thái** — ứng viên tốt cho UI viewer (blueprint có gợi ý).
74
+
75
+ ---
76
+
77
+ ## Kết nối
78
+
79
+ **Trước:** bất kỳ (đặc biệt sau [`/qc-report`](20-qc-report.md)) · **Sau:** DRIFT/UNTRACKED → [`/generate-code`](09-generate-code.md); GAP → [`/dev-gen-test`](12-dev-gen-test.md); OK → PR.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@educa-corp/sdd-framework",
3
- "version": "0.7.0",
3
+ "version": "0.7.2",
4
4
  "description": "Spec Driven Development workflow framework for Claude Code",
5
5
  "bin": {
6
6
  "sdd-framework": "./bin/index.js"