@educa-corp/sdd-framework 0.9.3 → 0.9.4

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 (59) hide show
  1. package/bin/build.js +11 -0
  2. package/bin/qc-base-map.json +119 -49
  3. package/bin/self-check.js +30 -0
  4. package/core/FRAMEWORK_VERSION +1 -1
  5. package/core/commands/qc-analyze.md +6 -119
  6. package/core/commands/qc-design-test.md +123 -143
  7. package/core/commands/qc-plan.md +6 -119
  8. package/core/commands/qc-review.md +59 -125
  9. package/core/commands/qc-run-test.md +6 -119
  10. package/core/commands/setup-ai-first.md +5 -5
  11. package/core/commands/update-framework.md +1 -1
  12. package/core/commands/validate-traces.md +1 -1
  13. package/core/rules/workflow.md +1 -1
  14. package/core/skills/qc/qa-analyst/DOC_GAP.template.md +1 -1
  15. package/core/skills/qc/qa-analyst/spec-breakdown.md +2 -2
  16. package/core/skills/qc/qa-designer/api/auth-chain.md +155 -0
  17. package/core/skills/qc/qa-designer/api/auth-sequence.md +75 -0
  18. package/core/skills/qc/qa-designer/api/common-headers.md +61 -0
  19. package/core/skills/qc/qa-designer/api/crud-sequence.md +122 -0
  20. package/core/skills/qc/qa-designer/api/endpoint.md +231 -0
  21. package/core/skills/qc/qa-designer/api/http-status-codes.md +102 -0
  22. package/core/skills/qc/qa-designer/e2e/journey.md +13 -8
  23. package/core/skills/qc/qa-designer/exploratory/charter.md +2 -0
  24. package/core/skills/qc/qa-designer/exploratory/explore-to-functional.md +7 -4
  25. package/core/skills/qc/qa-designer/functional/api.md +87 -18
  26. package/core/skills/qc/qa-designer/functional/gui-feature.md +12 -9
  27. package/core/skills/qc/qa-designer/functional/gui-screen.md +12 -10
  28. package/core/skills/qc/qa-designer/integration/api.md +12 -5
  29. package/core/skills/qc/qa-designer/integration/db.md +12 -6
  30. package/core/skills/qc/qa-designer/integration/gui.md +12 -5
  31. package/core/skills/qc/qa-designer/integration/kafka.md +12 -5
  32. package/core/skills/qc/qa-designer/non-functional.md +12 -5
  33. package/core/skills/qc/qa-designer/shared/action-keywords-glossary.md +91 -0
  34. package/core/skills/qc/qa-designer/shared/duplicate-check-procedure.md +105 -0
  35. package/core/skills/qc/qa-designer/shared/implicit-scenarios.md +22 -0
  36. package/core/skills/qc/qa-designer/shared/precision-rules.md +198 -0
  37. package/core/skills/qc/qa-designer/shared/read-doc-gap-inputs.md +25 -0
  38. package/core/skills/qc/qa-designer/shared/skill-decision-tree.md +93 -0
  39. package/core/skills/qc/qa-designer/shared/tc-metadata-format.md +243 -0
  40. package/core/skills/qc/qa-planner/risk-model.md +1 -1
  41. package/core/skills/qc/qa-reviewer/script/e2e.md +9 -1
  42. package/core/skills/qc/qa-reviewer/script/exploratory.md +9 -1
  43. package/core/skills/qc/qa-reviewer/script/functional.md +9 -1
  44. package/core/skills/qc/qa-reviewer/script/integration.md +9 -1
  45. package/core/skills/qc/qa-reviewer/script/non-functional.md +9 -1
  46. package/core/skills/qc/qa-reviewer/shared/read-doc-gap-inputs.md +26 -0
  47. package/core/skills/qc/qa-reviewer/shared/review-check-groups.md +207 -0
  48. package/core/skills/qc/qa-reviewer/shared/review-file-template.md +228 -0
  49. package/core/skills/qc/qa-reviewer/test-case/e2e.md +71 -13
  50. package/core/skills/qc/qa-reviewer/test-case/exploratory.md +53 -4
  51. package/core/skills/qc/qa-reviewer/test-case/functional.md +63 -15
  52. package/core/skills/qc/qa-reviewer/test-case/integration.md +64 -12
  53. package/core/skills/qc/qa-reviewer/test-case/non-functional.md +72 -13
  54. package/core/skills/qc/qa-runner/e2e.md +1 -1
  55. package/docs/02-concepts/pipeline-steps/09-validate-traces.md +1 -1
  56. package/docs/04-reference/trace-schema.md +1 -1
  57. package/docs/explain/00-setup-ai-first.md +1 -1
  58. package/docs/plans/qc-implementation-log.md +145 -3
  59. package/package.json +1 -1
@@ -1,7 +1,9 @@
1
1
  ---
2
2
  version: 1.0
3
- updated: 2026-06-11
3
+ updated: 2026-09-04
4
4
  ported_from: ui-automation-testing
5
+ upstream_path: skills/qa-tc-reviewer/exploratory-test-reviewer.md
6
+ upstream_sha: 4e068bb896739b977a6a5b1f638010d498c46aef
5
7
  ---
6
8
 
7
9
  # Review Charter — Exploratory
@@ -18,6 +20,30 @@ Review chất lượng test charter trước khi QC chạy session.
18
20
 
19
21
  ---
20
22
 
23
+ ## Trọng tâm review — tầng Exploratory
24
+
25
+ - **Charter có mục tiêu đo được**: nêu rõ vùng thăm dò · tour áp dụng · rủi ro nhắm tới ·
26
+ time-box. Thiếu time-box → charter không kết thúc được.
27
+ - **Không trùng vùng đã có TC scripted**: thăm dò chỗ đã phủ bằng TC là tiêu thời gian mà không
28
+ tăng thông tin → `[DUPLICATE]`.
29
+ - **Phát hiện phải chuyển được thành TC**: mỗi phát hiện đáng giữ phải đủ thông tin để
30
+ `explore-to-functional` biến thành TC chính thức. Không đủ → yêu cầu bổ sung, đừng bỏ.
31
+
32
+ *Charter **không phải** file TC — luật cấu trúc TC (ATOMIC, không bảng) **không áp** ở đây. Chỉ
33
+ áp khi charter đã chuyển thành TC.*
34
+ - **Phân nhóm & `Type`** *(Nhóm 3 riêng của tầng này)*: charter thuộc nhóm **Exploratory**, không
35
+ trộn với TC scripted. Một charter ôm nhiều vùng rủi ro → `[SPLIT_NEEDED]`.
36
+
37
+ ## 7 nhóm kiểm tra
38
+
39
+ > **Nạp `{paths.qc_skills_dir}/qa-reviewer/shared/review-check-groups.md`** — bộ xương 7 nhóm
40
+ > chạy tuần tự · registry nhãn lỗi dùng chung · 7 mẫu-hay-thiếu của Nhóm 6 · nền tảng ISTQB ·
41
+ > anti-pattern. Nhóm 5 (Nội dung TC) trỏ tiếp sang `shared/review-file-template.md`.
42
+ >
43
+ > Dưới đây chỉ là phần **riêng của tầng này**.
44
+
45
+ ---
46
+
21
47
  ## Phase 1 — Read
22
48
 
23
49
  Đọc tất cả charter .md trong folder chỉ định + feature description nếu có.
@@ -37,7 +63,30 @@ Review chất lượng test charter trước khi QC chạy session.
37
63
 
38
64
  ---
39
65
 
66
+ ## Phase 3 — Coverage tổng thể
67
+
68
+ *(Suy ra cho tầng này — bản gốc không có.)*
69
+
70
+ | Trục | Kỳ vọng tối thiểu |
71
+ |---|---|
72
+ | Vùng | Mỗi vùng rủi ro nêu trong TEST_PLAN có ≥1 charter |
73
+ | Tour | Không dùng lặp một tour cho mọi charter — mỗi tour soi một góc khác |
74
+ | Chuyển đổi | Mỗi phát hiện mức P0/P1 đã có đường thành TC chính thức |
75
+
76
+ ---
77
+
40
78
  ## Output
41
-
42
- Mỗi charter: PASS | 🔧 REWORK | ✂️ SPLIT | 🔗 MERGE + feedback cụ thể
43
- Overall assessment + charter bổ sung nếu gap
79
+
80
+ **Ghi vào `{qc_artifact_dir}test-cases/REVIEW_<FEATURE>.md`** đứng cạnh file TC vừa soát.
81
+ Nạp `../shared/review-file-template.md` để lấy khuôn + quy tắc ghi (tích luỹ theo vòng, chỉ sửa
82
+ hàng của tầng mình, KHÔNG ghi đè tầng khác).
83
+
84
+ Mỗi tiêu chí: ✅ PASS | ⚠️ WARN | ❌ FAIL + evidence cụ thể (charter ID)
85
+
86
+ **Điểm `XX/100`** — trừ 5đ mỗi `FAIL`, 2đ mỗi `WARN`. ≥80 đạt · 60–79 cần cải thiện · <60 không đạt.
87
+ **Verdict:** `điểm ≥ 80` VÀ không còn `FAIL` chặn → **`APPROVED`**; ngược lại **`NEEDS_FIX`**.
88
+
89
+ Mỗi charter: ✅ PASS | 🔧 REWORK | ✂️ SPLIT | 🔗 MERGE + feedback cụ thể.
90
+ Charter bổ sung nếu còn gap.
91
+
92
+ **KHÔNG tự sửa file TC** — chỉ nhận xét, chấm điểm, nêu cụ thể sửa gì. Người sửa là `/qc-design-test`.
@@ -1,7 +1,9 @@
1
1
  ---
2
2
  version: 1.0
3
- updated: 2026-06-11
3
+ updated: 2026-09-04
4
4
  ported_from: ui-automation-testing
5
+ upstream_path: skills/qa-tc-reviewer/ui-test-reviewer.md
6
+ upstream_sha: 54f81eb6a132d3fb331f18ce0f1a7eb3a9cf19df
5
7
  ---
6
8
 
7
9
  # Review Test Case — Functional
@@ -10,7 +12,7 @@ Review bộ functional TC và đánh giá chất lượng.
10
12
 
11
13
  ## Khi nào trigger
12
14
  - "review TC cho [Feature]" / "check coverage"
13
- - Sau khi qa-designer xong, trước khi PO approve hoặc trước khi qa-runner
15
+ - Sau khi qa-designer xong, trước khi PO approve hoặc trước khi /qc-run-test
14
16
 
15
17
  ## Khi KHÔNG trigger
16
18
  - Review Python script → dùng qa-reviewer
@@ -18,6 +20,32 @@ Review bộ functional TC và đánh giá chất lượng.
18
20
 
19
21
  ---
20
22
 
23
+ ## Trọng tâm review — tầng Functional / GUI
24
+
25
+ - **Assertion hiển thị đo được**: cấm *"hiển thị đúng"* — phải nêu element / nhãn / chuỗi / màu
26
+ cụ thể. Thiếu → `[VAGUE_EXPECTED]`.
27
+ - **EP + BVA từng field có ràng buộc**: mỗi phân vùng một TC; biên đủ 3 hoặc 4 giá trị tuỳ dạng
28
+ ràng buộc (`../../qa-designer/shared/precision-rules.md` §7). Thiếu → `[GAP]`.
29
+ - **Bảng quyết định cho logic nhiều điều kiện**: có ≥2 điều kiện → **tự dựng bảng** để đếm N rule
30
+ tối thiểu (sau khi gộp don't-care); thiếu TC so với N → `[DT_COVERAGE_GAP]`.
31
+ - **State Transition**: element có vòng đời phải phủ transition hợp lệ **và** transition bị cấm.
32
+ Thiếu nhánh cấm → `[GAP]`.
33
+ - **Phân nhóm GUI vs Functional** *(Nhóm 3 riêng của tầng này)*: GUI = chỉ hiển thị tĩnh, không
34
+ đổi trạng thái · Functional = có hành động / validate / luồng. Sai nhóm → `[WRONG_GROUP]`;
35
+ một TC gánh cả hai → `[SPLIT_NEEDED]`.
36
+ - **`Type` khớp nội dung**: Happy Path (luồng chính lý tưởng) · Positive (input hợp lệ → xử lý
37
+ đúng) · Negative (input sai → chặn & báo lỗi) · Edge (biên/cực trị). Lệch → `[WRONG_TYPE]`.
38
+
39
+ ## 7 nhóm kiểm tra
40
+
41
+ > **Nạp `{paths.qc_skills_dir}/qa-reviewer/shared/review-check-groups.md`** — bộ xương 7 nhóm
42
+ > chạy tuần tự · registry nhãn lỗi dùng chung · 7 mẫu-hay-thiếu của Nhóm 6 · nền tảng ISTQB ·
43
+ > anti-pattern. Nhóm 5 (Nội dung TC) trỏ tiếp sang `shared/review-file-template.md`.
44
+ >
45
+ > Dưới đây chỉ là phần **riêng của tầng này**.
46
+
47
+ ---
48
+
21
49
  ## Phase 1 — Clarify
22
50
 
23
51
  1. Đọc tất cả .Test.md trong folder được chỉ định
@@ -55,22 +83,42 @@ D. ANTI-PATTERN:
55
83
 
56
84
  ---
57
85
 
58
- ## Checklist format file `.md` (đối chiếu skill layer qa-designer)
86
+ ## Phase 3 Coverage tổng thể
87
+
88
+ Sau khi duyệt hết từng TC, kiểm **bộ TC** có đủ bốn nhóm không:
59
89
 
60
- - **Metadata:** đủ Title, Feature, Priority, Status, Author, Tags, **Trace**; Priority `P0/P1/P2` (không emoji); Status `Draft` text thuần; mỗi trường 1 dòng riêng.
61
- - **Trace:** mỗi TC link `[BR-xx](REQUIREMENT_ANALYSIS.md#3-business-rules)`; TC không có BR → phải có ⚠️ cảnh báo (không để trống/`—`).
62
- - **TC bị block:** TC phụ thuộc gap dòng `🚫 Block: [GAP-xx]`; cuối file **Trace matrix** (BR↔TC) + **bảng TC bị block** (Gap↔TC).
63
- - **Test Data:** dạng list (`- **Trường:** giá trị`), không dùng bảng.
64
- - **Test Steps:** phân biệt `[Action]`/`[Verify]`; KHÔNG `- *Expected:* ...` sau mỗi bước.
65
- - **Expected Result:** 1 dòng bullet `-`, cụ thể; KHÔNG `✅ PASS/❌ FAIL`; không viết "hoạt động bình thường".
66
- - **KHÔNG** có section `#### Python Test Mapping`.
67
- - **1 concept/TC**; phân nhóm GUI / Functional.
90
+ | Nhóm | Kỳ vọng tối thiểu |
91
+ |---|---|
92
+ | Display | Mỗi section / vùng giao diện≥1 TC |
93
+ | Validation | Mỗi field có ràng buộc: required + BVA (3 hoặc 4 TC) + định dạng nếu có |
94
+ | State | Mỗi element ≥2 trạng thái: ≥1 TC trạng thái đầu + ≥1 TC chuyển trạng thái |
95
+ | Interaction | Mỗi hành động (click / hover / bàn phím) ≥1 TC |
96
+
97
+ Thiếu nhóm nào → bảng **Coverage gaps** của file review, kèm `[GAP]` + mã TC đề xuất bổ sung.
68
98
 
69
99
  ---
70
-
100
+
101
+ ## Kiểm tra cấu trúc file TC
102
+
103
+ > **Nạp `{paths.qc_skills_dir}/qa-reviewer/shared/review-file-template.md`** §*Kiểm tra cấu trúc
104
+ > TC* — luật ATOMIC 1-bullet · không ký tự `|` · 9 cụm từ mơ hồ · teardown đúng chỗ · marker ≠
105
+ > oracle · 6 dấu vết hỏng sau khi chạy script tách. **Không lặp lại ở đây.**
106
+ >
107
+ > Luật gốc mà trạm 3 phải theo nằm ở `qa-designer/shared/tc-metadata-format.md` +
108
+ > `precision-rules.md`. **Cổng và luật phải đọc từ cùng một chỗ** — giữ hai bản là tự tạo lại
109
+ > chỗ chúng lệch nhau, và cổng lệch thì nó đánh trượt file làm đúng.
110
+
71
111
  ## Output
72
-
73
- Mỗi tiêu chí: PASS | ⚠️ PARTIAL | ❌ MISSING + evidence cụ thể
74
- Score: A (excellent) / B (good) / C (needs improvement) / D (redo)
112
+
113
+ **Ghi vào `{qc_artifact_dir}test-cases/REVIEW_<FEATURE>.md`** đứng cạnh file TC vừa soát.
114
+ Nạp `../shared/review-file-template.md` để lấy khuôn + quy tắc ghi (tích luỹ theo vòng, chỉ sửa
115
+ hàng của tầng mình, KHÔNG ghi đè tầng khác).
116
+
117
+ Mỗi tiêu chí: ✅ PASS | ⚠️ WARN | ❌ FAIL + evidence cụ thể
118
+
119
+ **Điểm `XX/100`** — trừ 5đ mỗi `FAIL`, 2đ mỗi `WARN`. ≥80 đạt · 60–79 cần cải thiện · <60 không đạt.
120
+ **Verdict:** `điểm ≥ 80` VÀ không còn `FAIL` chặn → **`APPROVED`**; ngược lại **`NEEDS_FIX`**.
121
+
75
122
  Đề xuất TC cần thêm/sửa/xoá, sắp theo priority. Liệt kê TC thiếu Trace BR (⚠️) cần bổ sung.
76
123
 
124
+ **KHÔNG tự sửa file TC** — chỉ nhận xét, chấm điểm, nêu cụ thể sửa gì. Người sửa là `/qc-design-test`.
@@ -1,7 +1,9 @@
1
1
  ---
2
2
  version: 1.0
3
- updated: 2026-06-11
3
+ updated: 2026-09-04
4
4
  ported_from: ui-automation-testing
5
+ upstream_path: skills/qa-tc-reviewer/integration-test-reviewer.md
6
+ upstream_sha: 639b54afb68df83b22168581c5c57b0f91d9cf6a
5
7
  ---
6
8
 
7
9
  # Review Test Case — Integration
@@ -10,7 +12,7 @@ Review bộ TC tích hợp (GUI↔Backend, API, DB) và đánh giá chất lư
10
12
 
11
13
  ## Khi nào trigger
12
14
  - "review TC integration cho [Feature]" / "check TC tích hợp"
13
- - Sau khi qa-designer/integration/* xong, trước khi qa-runner
15
+ - Sau khi qa-designer/integration/* xong, trước khi /qc-run-test
14
16
 
15
17
  ## Khi KHÔNG trigger
16
18
  - Review TC functional 1 màn/endpoint → `test-case/functional`
@@ -18,6 +20,30 @@ Review bộ TC tích hợp (GUI↔Backend, API, DB) và đánh giá chất lư
18
20
 
19
21
  ---
20
22
 
23
+ ## Trọng tâm review — tầng Integration
24
+
25
+ - **Verify CẢ HAI phía**: mỗi handshake phải assert trạng thái của **Module A và Module B** +
26
+ tầng dữ liệu (DB/cache nhất quán). Chỉ verify một phía → `[GAP]`.
27
+ - **Phủ đủ chế độ lỗi**: happy → một bên lỗi (suy giảm mềm) → timeout / mất mạng → dữ liệu cũ /
28
+ tranh chấp → tương thích ngược. Thiếu nhánh lỗi → `[GAP]`.
29
+ - **Di trú DB phải có TC rollback**, không chỉ chiều tiến. Thiếu → `[GAP]` **mức cao**.
30
+ - **Chuỗi API**: phủ lỗi một-phần (bước 2 trượt khi bước 1 đã commit) + tính idempotent.
31
+ - **Mock hợp lý**: **không mock cả hai bên** — mock hết thì TC không còn kiểm gì. Kỹ thuật
32
+ State Transition / bảng quyết định phải khớp loại integration.
33
+ - **Phân nhóm & `Type`** *(Nhóm 3 riêng của tầng này)*: TC integration thuộc nhóm **Nghiệp vụ**,
34
+ **không có** nhóm GUI. `Type` khớp nội dung. Sai nhóm → `[WRONG_GROUP]`; `Type` lệch →
35
+ `[WRONG_TYPE]`; một TC gánh nhiều cặp module → `[SPLIT_NEEDED]`.
36
+
37
+ ## 7 nhóm kiểm tra
38
+
39
+ > **Nạp `{paths.qc_skills_dir}/qa-reviewer/shared/review-check-groups.md`** — bộ xương 7 nhóm
40
+ > chạy tuần tự · registry nhãn lỗi dùng chung · 7 mẫu-hay-thiếu của Nhóm 6 · nền tảng ISTQB ·
41
+ > anti-pattern. Nhóm 5 (Nội dung TC) trỏ tiếp sang `shared/review-file-template.md`.
42
+ >
43
+ > Dưới đây chỉ là phần **riêng của tầng này**.
44
+
45
+ ---
46
+
21
47
  ## Phase 1 — Clarify
22
48
 
23
49
  1. Đọc tất cả TC integration trong folder chỉ định; xác định loại: GUI↔Backend / API / DB
@@ -46,24 +72,50 @@ C. QUALITY:
46
72
  - TC concurrency: mô tả rõ 2+ request đồng thời + kết quả kỳ vọng?
47
73
 
48
74
  D. FORMAT & TRACE:
49
- - Metadata đủ; Trace `[BR-xx]` hoặc `⚠️ Chưa có Business Rule`; `🚫 Block: [GAP-xx]` nếu bị chặn?
50
- - Cuối file có Trace matrix + bảng TC block?
75
+ - Metadata đủ; Trace `[BR-xx]` hoặc `⚠️ Chưa có Business Rule`; `🚫 Block: [GAP-UC{N}-{nnn}]` nếu bị chặn?
76
+ - Cuối file có **Trace matrix** (BR ↔ TC ↔ SC) + **danh sách** TC bị block — cả hai **dạng danh sách, KHÔNG bảng** (file TC không được có ký tự `|` — luật B12)?
51
77
  - Steps phân biệt `[Action]`/`[Verify]`; Expected 1 bullet; KHÔNG `✅/❌` inline.
52
78
 
53
79
  ---
54
80
 
55
- ## Checklist format file `.md`
81
+ ## Phase 3 Coverage tổng thể
82
+
83
+ *(Bản gốc không có mục này cho tầng integration — bảng dưới suy ra từ chính các trục phủ ở
84
+ §Trọng tâm review trên.)*
56
85
 
57
- - **Test Data:** dạng list; ghi endpoint/payload/bảng cần kiểm tra.
58
- - **Expected (DB):** phải có dạng `bảng.cột = giá trị` + query kiểm tra + cleanup instruction.
59
- - **Expected (API):** ghi HTTP + cấu trúc response + downstream effect.
60
- - **Expected (GUI):** ghi API gọi + biểu hiện UI (message/state/list cập nhật).
86
+ | Trục | Kỳ vọng tối thiểu |
87
+ |---|---|
88
+ | Happy | Mỗi cặp Module A Module B ≥1 TC verify **cả hai phía** |
89
+ | Failure | Mỗi cặp ≥1 TC một-bên-lỗi (suy giảm mềm) |
90
+ | Timeout | Mỗi lời gọi qua mạng có ≥1 TC timeout / mất mạng |
91
+ | Rollback | Mỗi thao tác ghi có ≥1 TC rollback — **không chỉ chiều tiến** |
92
+
93
+ Điền vào bảng **Coverage handshake (Integration)** ở cuối file review.
61
94
 
62
95
  ---
63
96
 
97
+ ## Kiểm tra cấu trúc file TC
98
+
99
+ > **Nạp `{paths.qc_skills_dir}/qa-reviewer/shared/review-file-template.md`** §*Kiểm tra cấu trúc
100
+ > TC* — luật ATOMIC 1-bullet · không ký tự `|` · 9 cụm từ mơ hồ · teardown đúng chỗ · marker ≠
101
+ > oracle · 6 dấu vết hỏng sau khi chạy script tách. **Không lặp lại ở đây.**
102
+ >
103
+ > Luật gốc mà trạm 3 phải theo nằm ở `qa-designer/shared/tc-metadata-format.md` +
104
+ > `precision-rules.md`. **Cổng và luật phải đọc từ cùng một chỗ** — giữ hai bản là tự tạo lại
105
+ > chỗ chúng lệch nhau, và cổng lệch thì nó đánh trượt file làm đúng.
106
+
64
107
  ## Output
65
108
 
66
- Mỗi tiêu chí: PASS | ⚠️ PARTIAL | ❌ MISSING + evidence (TC ID / điểm tích hợp)
67
- Score: A (excellent) / B (good) / C (needs improvement) / D (redo)
109
+ **Ghi vào `{qc_artifact_dir}test-cases/REVIEW_<FEATURE>.md`** đứng cạnh file TC vừa soát.
110
+ Nạp `../shared/review-file-template.md` để lấy khuôn + quy tắc ghi (tích luỹ theo vòng, chỉ sửa
111
+ hàng của tầng mình, KHÔNG ghi đè tầng khác).
112
+
113
+ Mỗi tiêu chí: ✅ PASS | ⚠️ WARN | ❌ FAIL + evidence cụ thể (TC ID / điểm tích hợp)
114
+
115
+ **Điểm `XX/100`** — trừ 5đ mỗi `FAIL`, 2đ mỗi `WARN`. ≥80 đạt · 60–79 cần cải thiện · <60 không đạt.
116
+ **Verdict:** `điểm ≥ 80` VÀ không còn `FAIL` chặn → **`APPROVED`**; ngược lại **`NEEDS_FIX`**.
117
+
68
118
  Điểm tích hợp thiếu TC; TC Expected mờ nhạt; TC DB thiếu cleanup.
69
- Kết luận: sẵn sàng cho `qa-runner` chưa.
119
+ Điền thêm bảng **Coverage handshake (Integration)** ở cuối file review.
120
+
121
+ **KHÔNG tự sửa file TC** — chỉ nhận xét, chấm điểm, nêu cụ thể sửa gì. Người sửa là `/qc-design-test`.
@@ -1,7 +1,9 @@
1
1
  ---
2
2
  version: 1.0
3
- updated: 2026-06-11
3
+ updated: 2026-09-04
4
4
  ported_from: ui-automation-testing
5
+ upstream_path: skills/qa-tc-reviewer/nfr-test-reviewer.md
6
+ upstream_sha: 5747c7a6bdfaaea1ff3e958688b38b3aeaf9b15a
5
7
  ---
6
8
 
7
9
  # Review Test Case — Non-Functional
@@ -10,7 +12,7 @@ Review bộ TC phi chức năng (performance, security, accessibility, compatibi
10
12
 
11
13
  ## Khi nào trigger
12
14
  - "review TC non-functional cho [Feature]" / "check TC hiệu năng/bảo mật/accessibility"
13
- - Sau khi qa-designer/non-functional xong, trước khi qa-runner
15
+ - Sau khi qa-designer/non-functional xong, trước khi /qc-run-test
14
16
 
15
17
  ## Khi KHÔNG trigger
16
18
  - Review TC chức năng → `test-case/functional`
@@ -18,6 +20,35 @@ Review bộ TC phi chức năng (performance, security, accessibility, compatibi
18
20
 
19
21
  ---
20
22
 
23
+ ## Trọng tâm review — tầng NFR
24
+
25
+ - **Tiêu chí đo lường BẮT BUỘC**: mỗi TC có **ngưỡng + đơn vị + điều kiện môi trường**
26
+ (`P95 < X ms` · `error rate < Y%` · `contrast ≥ 4.5:1` · `Lighthouse a11y ≥ 90`).
27
+ Thiếu ngưỡng → `[VAGUE_EXPECTED]`. Đơn vị chuẩn theo domain:
28
+ `../../qa-designer/shared/precision-rules.md` §3.
29
+ - **Đúng loại + đúng công cụ**: `Type` ∈ {Load · Stress · Spike · Security · A11y · i18n}; có
30
+ công cụ phù hợp (k6 / ZAP / axe-core…) + marker đúng
31
+ (`@pytest.mark.performance|security|a11y|i18n`).
32
+ - **Phủ theo loại**: Performance có baseline + hồ sơ đồng thời · Security phủ OWASP áp dụng được
33
+ (A01/A03/A07…) · A11y phủ **bàn phím + trình đọc màn hình**, không chỉ axe-core tự động ·
34
+ i18n có tiếng Việt dấu đặc biệt (ộ/ề/ắ) + emoji + tràn chữ.
35
+ - **Môi trường**: NFR không chạy CI thường → TC phải ghi rõ môi trường riêng (load-test /
36
+ staging) và lịch chạy (nightly / trước phát hành). Thiếu → `[MISSING_DATA]`.
37
+ - **Phân nhóm & `Type`** *(Nhóm 3 riêng của tầng này)*: TC NFR thuộc nhóm **NFR**, **không có**
38
+ nhóm GUI. `Type` phải là một trong {Load · Stress · Spike · Security · A11y · i18n}. Sai nhóm →
39
+ `[WRONG_GROUP]`; `Type` không thuộc tập trên → `[WRONG_TYPE]`; một TC đo nhiều loại NFR →
40
+ `[SPLIT_NEEDED]`.
41
+
42
+ ## 7 nhóm kiểm tra
43
+
44
+ > **Nạp `{paths.qc_skills_dir}/qa-reviewer/shared/review-check-groups.md`** — bộ xương 7 nhóm
45
+ > chạy tuần tự · registry nhãn lỗi dùng chung · 7 mẫu-hay-thiếu của Nhóm 6 · nền tảng ISTQB ·
46
+ > anti-pattern. Nhóm 5 (Nội dung TC) trỏ tiếp sang `shared/review-file-template.md`.
47
+ >
48
+ > Dưới đây chỉ là phần **riêng của tầng này**.
49
+
50
+ ---
51
+
21
52
  ## Phase 1 — Clarify
22
53
 
23
54
  1. Đọc tất cả TC non-functional trong folder chỉ định; xác định loại: performance / security / accessibility / compatibility
@@ -49,25 +80,53 @@ C. ENVIRONMENT & DATA:
49
80
  - Cleanup / teardown sau mỗi TC (đặc biệt security test)?
50
81
 
51
82
  D. FORMAT & TRACE:
52
- - Metadata đủ; Trace `[BR-xx]` / SLA source rõ; `🚫 Block: [GAP-xx]` nếu bị chặn?
83
+ - Metadata đủ; Trace `[BR-xx]` / SLA source rõ; `🚫 Block: [GAP-UC{N}-{nnn}]` nếu bị chặn?
53
84
  - Steps phân biệt `[Action]`/`[Verify]`; Expected 1 bullet; KHÔNG `✅/❌` inline?
54
- - Cuối file có Trace matrix + bảng TC block?
85
+ - Cuối file có **Trace matrix** (BR ↔ TC ↔ SC) + **danh sách** TC bị block — cả hai **dạng danh sách, KHÔNG bảng** (file TC không được có ký tự `|` — luật B12)?
55
86
 
56
87
  ---
57
88
 
58
- ## Checklist format file `.md`
89
+ ## Phase 3 Coverage tổng thể
59
90
 
60
- - **Expected:** PHẢI`ngưỡng + đơn vị + công cụ đo` không MISSING.
61
- - **Performance TC:** ghi `concurrent users`, `data volume`, `target response time`.
62
- - **Security TC:** ghi `attack vector`, `input payload`, `expected block/response`.
63
- - **Accessibility TC:** ghi `WCAG version + level`, `tool (axe/lighthouse)`.
64
- - **Compatibility TC:** ghi `browser/OS version + device/resolution`.
91
+ *(Bản gốc khôngmục này cho tầng NFR bảng dưới suy ra từ chính các trục phủ ở §Trọng tâm
92
+ review trên.)*
93
+
94
+ | Loại NFR | Kỳ vọng tối thiểu |
95
+ |---|---|
96
+ | Performance | Có baseline + ≥1 hồ sơ tải đồng thời, cả hai có ngưỡng + đơn vị |
97
+ | Security | Phủ các mục OWASP **áp dụng được** cho tính năng này (A01/A03/A07…) |
98
+ | Accessibility | Bàn phím **và** trình đọc màn hình — không chỉ axe-core tự động |
99
+ | i18n | Tiếng Việt dấu đặc biệt + emoji + tràn chữ |
100
+ | Compatibility | Các nền / trình duyệt mà PRD nêu |
101
+
102
+ Loại nào PRD **không** yêu cầu → ghi `N/A` kèm lý do, **đừng bỏ trống**: ô trống không phân biệt
103
+ được *"không áp dụng"* với *"quên kiểm"*.
104
+ Điền vào bảng **Chi tiết NFR** ở cuối file review.
65
105
 
66
106
  ---
67
107
 
108
+ ## Kiểm tra cấu trúc file TC
109
+
110
+ > **Nạp `{paths.qc_skills_dir}/qa-reviewer/shared/review-file-template.md`** §*Kiểm tra cấu trúc
111
+ > TC* — luật ATOMIC 1-bullet · không ký tự `|` · 9 cụm từ mơ hồ · teardown đúng chỗ · marker ≠
112
+ > oracle · 6 dấu vết hỏng sau khi chạy script tách. **Không lặp lại ở đây.**
113
+ >
114
+ > Luật gốc mà trạm 3 phải theo nằm ở `qa-designer/shared/tc-metadata-format.md` +
115
+ > `precision-rules.md`. **Cổng và luật phải đọc từ cùng một chỗ** — giữ hai bản là tự tạo lại
116
+ > chỗ chúng lệch nhau, và cổng lệch thì nó đánh trượt file làm đúng.
117
+
68
118
  ## Output
69
119
 
70
- Mỗi tiêu chí: PASS | ⚠️ PARTIAL | ❌ MISSING + evidence (TC ID)
71
- Score: A (excellent) / B (good) / C (needs improvement) / D (redo)
120
+ **Ghi vào `{qc_artifact_dir}test-cases/REVIEW_<FEATURE>.md`** đứng cạnh file TC vừa soát.
121
+ Nạp `../shared/review-file-template.md` để lấy khuôn + quy tắc ghi (tích luỹ theo vòng, chỉ sửa
122
+ hàng của tầng mình, KHÔNG ghi đè tầng khác).
123
+
124
+ Mỗi tiêu chí: ✅ PASS | ⚠️ WARN | ❌ FAIL + evidence cụ thể (TC ID)
125
+
126
+ **Điểm `XX/100`** — trừ 5đ mỗi `FAIL`, 2đ mỗi `WARN`. ≥80 đạt · 60–79 cần cải thiện · <60 không đạt.
127
+ **Verdict:** `điểm ≥ 80` VÀ không còn `FAIL` chặn → **`APPROVED`**; ngược lại **`NEEDS_FIX`**.
128
+
72
129
  Danh sách TC Expected mờ nhạt (thiếu ngưỡng); loại non-functional thiếu coverage.
73
- Kết luận: sẵn sàng cho `qa-runner` chưa; ghi rõ TC nào cần môi trường đặc biệt.
130
+ Ghi rõ TC nào cần môi trường đặc biệt. Điền thêm bảng **Chi tiết NFR** ở cuối file review.
131
+
132
+ **KHÔNG tự sửa file TC** — chỉ nhận xét, chấm điểm, nêu cụ thể sửa gì. Người sửa là `/qc-design-test`.
@@ -26,7 +26,7 @@ Skill **tự chứa**: convert journey `.Test.md` → Python pytest + Playwright
26
26
 
27
27
  ## Phase 2 — Generate
28
28
  Mỗi journey → 1 test; bọc từng bước `with step("…")`; cuối journey verify đủ V1…Vn (tạo/mã/định tuyến/đồng bộ/danh sách).
29
- Journey còn phụ thuộc gap → tạo test `@pytest.mark.skip(reason="GAP-xx")` hoặc xfail.
29
+ Journey còn phụ thuộc gap → tạo test `@pytest.mark.skip(reason="GAP-UC{N}-{nnn}")` hoặc xfail.
30
30
 
31
31
  ## Phase 3 — Verify
32
32
  `py_compile` + `pytest --collect-only -q` · chạy (môi trường staging + CRM) · cập nhật Status TC.
@@ -40,7 +40,7 @@ Traceability chỉ có giá trị khi **kiểm được**. Bước này cho mộ
40
40
  | Artifact | Nội dung |
41
41
  |----------|----------|
42
42
  | Ma trận coverage spec ↔ code ↔ test | Trạng thái từng SC + `code_coverage` tổng |
43
- | `{trace_dir}/trace-report.json` | Bản máy đọc cho **panel VS Code** ("Spec Driven Docs Tools") — bị **ghi đè** mỗi lần chạy |
43
+ | `{trace_dir}/trace-report.json` | Bản máy đọc cho **panel VS Code** ("SDD Board") — bị **ghi đè** mỗi lần chạy |
44
44
  | `{trace_dir}/trace-history.jsonl` | **Nhật ký append-only** — mỗi lần chạy ghi thêm 1 dòng *delta*. Đây là **dữ liệu**, không phải mirror: **phải commit**, mất là mất vĩnh viễn |
45
45
  | Cờ audit | 6 cờ drift + 4 cờ 🔴 chặn PR + `PRD_UNTRACKED_EDIT` 🔴 (không chặn) + 2 cờ ⓘ (bảng dưới) |
46
46
  | Hàng đợi | Đếm PRD change request còn `Open` kèm **số ngày chờ** (Step 7b) |
@@ -240,7 +240,7 @@ Ca thứ hai là lý do consumer **phải** chuẩn hoá tập bị ảnh hưở
240
240
 
241
241
  ## Xuất JSON cho panel
242
242
 
243
- `trace-report.json` giữ enum `status` **đúng 4 giá trị** `OK`/`DRIFT`/`GAP`/`UNTRACKED` — VS Code extension "Spec Driven Docs Tools" sống ngoài repo framework và switch trên field này. Row `ORPHANED` xuất ra là `"status": "DRIFT"` + `"orphaned": true`; panel cũ hiện nó như DRIFT (đúng nghĩa, không im lặng), panel mới đọc `orphaned` để hiện nhãn riêng. **TSV giữ nguyên chữ `ORPHANED`** — TSV là nguồn-sự-thật.
243
+ `trace-report.json` giữ enum `status` **đúng 4 giá trị** `OK`/`DRIFT`/`GAP`/`UNTRACKED` — VS Code extension "SDD Board" sống ngoài repo framework và switch trên field này. Row `ORPHANED` xuất ra là `"status": "DRIFT"` + `"orphaned": true`; panel cũ hiện nó như DRIFT (đúng nghĩa, không im lặng), panel mới đọc `orphaned` để hiện nhãn riêng. **TSV giữ nguyên chữ `ORPHANED`** — TSV là nguồn-sự-thật.
244
244
 
245
245
  ---
246
246
 
@@ -44,7 +44,7 @@ Mọi command sau đều đọc `project-context.yaml` + `CLAUDE.md` + `domain-k
44
44
  5. **Step 3 · project-context.yaml** — copy từ `templates/project-context.yaml`, điền `{{PLACEHOLDER}}`. Umbrella: verify/sửa `services` (path phải khớp tên submodule thật — generator để placeholder `TODO-…`).
45
45
  6. **Step 4 · business-dictionary.md** — Canonical Terms / Banned Terms / Enum Registry. *(Umbrella skip — sống trong spec submodule.)*
46
46
  7. **Step 5 · core-entities.md** — entity catalog máy-đọc-được (field, invariant, relationship). *(Umbrella skip.)*
47
- 8. **Step 6 · VS Code extension** — khuyến nghị cài "Spec Driven Docs Tools" (Review Board + Living Docs UI).
47
+ 8. **Step 6 · VS Code extension** — khuyến nghị cài "SDD Board" (Review Board + Living Docs UI).
48
48
  9. **Step 7 · Verify** — checklist theo `project_type` (file/folder tồn tại; umbrella check submodule init).
49
49
 
50
50
  ---
@@ -1512,6 +1512,148 @@ xem bản mới có bắt thêm gap thật hay không.
1512
1512
 
1513
1513
  ---
1514
1514
 
1515
+ # ✅ B12 — Rà trạm viết kịch bản kiểm thử theo bản gốc
1516
+
1517
+ Đi theo đúng thứ tự dây chuyền: xong trạm 1 và 2 (B11) thì tới trạm 3 — **trạm quyết định có
1518
+ test hay không có test**.
1519
+
1520
+ ## Hai điều rà ra
1521
+
1522
+ **① Trạm này chưa hề được đụng trong cả đợt merge.** Bản đồ port ghi **21/21 file gốc ở trạng
1523
+ thái "chưa quyết"**. 11 kỹ năng đang chạy đến từ **một nguồn khác** (`lms_autotest`), không phải
1524
+ từ đội QC.
1525
+
1526
+ | | File | Dòng |
1527
+ |---|---|---|
1528
+ | Bản gốc đội QC | 21 | **2.509** |
1529
+ | Framework | 11 | **496** *(~20%)* |
1530
+
1531
+ **② Một lỗi im lặng, cùng lớp với `DOC_GAPS` / `DOC_GAP`:**
1532
+
1533
+ | Ai | Nói tên file là |
1534
+ |---|---|
1535
+ | 2 kỹ năng | `TC_<FEATURE>.md` |
1536
+ | 1 kỹ năng | `TC_<FEATURE>_API.md` |
1537
+ | **4 kỹ năng** | **không nêu tên gì cả** |
1538
+ | Lệnh thiết kế · lệnh chạy · lệnh soát · module Playwright *(13 chỗ)* | `*.Test.md` |
1539
+
1540
+ **Trạm thiết kế ghi ra thứ trạm chạy không tìm thấy.** Và không có gì báo lỗi — file vẫn nằm
1541
+ đó, trạm sau chỉ đơn giản không thấy.
1542
+
1543
+ Framework có **phương pháp** (EP/BVA/bảng quyết định, danh sách nhóm TC); bản gốc có **chi
1544
+ tiết** (cấm từ mơ hồ, khuôn TC, từ điển hành động, bảng tra mã HTTP). Đúng khuôn đã gặp ở B1.
1545
+
1546
+ ## Bốn quyết định
1547
+
1548
+ | # | Chốt | Nghĩa cho người dùng |
1549
+ |---|---|---|
1550
+ | **1** | **Luật ATOMIC, có cả chế độ tách tối đa** | Mỗi test case đúng **một** dòng kết quả mong đợi. Nhiều điểm kiểm → tách thành nhiều TC độc lập |
1551
+ | **2** | **Bỏ bảng trong file test case** | Toàn bộ dạng danh sách, không ký tự `\|` — kể cả mục Tổng hợp và Trace Matrix |
1552
+ | **3** | **Hai file, chia theo "có qua giao diện"** | mặc định → file giao diện (6 nhóm) · `--api` → file API (2 nhóm) · `--all` → cả hai |
1553
+ | **4** | **Lấy trọn 7 file luật chung + cả nhánh API, nhưng VIẾT LẠI 2 file mẫu** | 1.523 dòng |
1554
+
1555
+ ## Chỗ suýt tự bắn vào chân mình
1556
+
1557
+ Nhánh API của bản gốc có 2 file **test case mẫu**. Đọc kỹ thì chúng viết **trước** luật ATOMIC
1558
+ (đội QC chốt 2026-07-09, và văn bản ghi rõ *"ĐẢO rule cũ"*):
1559
+
1560
+ ```
1561
+ MẪU GỐC (cũ hơn luật) ĐÃ VIẾT LẠI
1562
+ **Expected:** #### Expected Result
1563
+ - HTTP 201; body.id = x; - HTTP 201 AND body.id exists
1564
+ bản ghi có trong DB
1565
+ ▲ ba kết cục nối bằng ";" → TC_002: body.<field> = <giá trị>
1566
+ mã: API-<FEATURE>-001 → TC_003: DB có bản ghi id = body.id
1567
+ ▲ hệ mã khác mã: TC_<FEATURE>_NNN
1568
+ ```
1569
+
1570
+ **Lấy nguyên hai file này là dạy AI làm ngược đúng cái luật vừa chốt** — vì mẫu cụ thể luôn
1571
+ thắng luật trừu tượng. Đã viết lại cả hai, và kiểm bằng máy: **13/13 khối kết quả mong đợi có
1572
+ đúng 1 dòng**.
1573
+
1574
+ Cũng bỏ 26 dòng là **bản nháp cũ** của chính họ: một bảng tra mã lỗi 14 dòng nằm gọn trong bảng
1575
+ 95 dòng, một file chuỗi gọi 12 dòng nằm gọn trong hai file dài hơn. Lấy cả hai là có hai bảng
1576
+ tra cùng một thứ, rồi chúng lệch nhau.
1577
+
1578
+ ## Bốn thứ giờ mới có
1579
+
1580
+ | Luật | Nó chặn điều gì |
1581
+ |---|---|
1582
+ | **Cấm 9 cụm từ mơ hồ** | *"hiển thị đúng"* · *"hoạt động bình thường"* · *"không lỗi"* → bắt viết giá trị đo được. Phép thử: **hai QC đọc có ra cùng một kết luận đỗ/trượt không?** |
1583
+ | **Khuôn TC + luật ATOMIC** | Mỗi TC một kết cục; mẫu đầy đủ; 5 bẫy khi đánh số lại hàng loạt |
1584
+ | **Cây quyết định chọn tầng** | ~12 ví dụ phân biệt: *"dropdown có placeholder"* = giao diện, *"dropdown hiện đúng N mục từ API"* = tích hợp |
1585
+ | **Từ điển hành động** | Một hành động **một** từ: Click (web) / Tap (mobile) / Enter (nhập) — cấm dùng Type, Input, Fill lẫn lộn |
1586
+
1587
+ Thêm **kiểm trùng lặp** — thứ framework trước đây **không có gì cả**. Nó quan trọng hơn sau khi
1588
+ bật chế độ tách tối đa: nhân một TC trùng lên 5 mảnh thì thành 5 TC trùng, và không ai đếm
1589
+ được nữa. Nên kiểm trùng phải chạy **trước** khi tách.
1590
+
1591
+ Và B11 vừa gom mọi UC vào **một thư mục** — nên **trùng chéo UC** giờ mới thực sự nhìn thấy
1592
+ được, và mới thực sự xảy ra. Hai UC của cùng tính năng rất hay dùng lại một luật nghiệp vụ;
1593
+ gặp thì trỏ trace về UC nguồn, **không viết lại**.
1594
+
1595
+ ## Chín bản của một luật → một bản
1596
+
1597
+ Khối *"Format file TC"* trước đây **bị chép ở 9 kỹ năng** và câu chữ đã lệch nhau. Giờ một
1598
+ bản dùng chung, 9 kỹ năng trỏ về. **Cùng bệnh 5-bản mà B11 vừa chữa** — và lần này nó không
1599
+ tiết kiệm dòng, nó chỉ bỏ đi khả năng chín bản nói khác nhau.
1600
+
1601
+ Cũng bỏ chữ **"hoặc"**: hai kỹ năng từng ghi *"file riêng **hoặc** gộp trong file feature"*.
1602
+ Chữ "hoặc" nghĩa là AI tự chọn mỗi lần một kiểu — nên hai lần chạy cùng một tính năng có thể ra
1603
+ hai cấu trúc thư mục khác nhau.
1604
+
1605
+ ## Hai lần bị máy bắt lỗi — và đó là điểm sáng
1606
+
1607
+ **Lần 1 — self-check chặn.** Tôi dồn phần `@trace.testid_attr` sang file dùng chung, làm lệnh
1608
+ không còn nhắc tag nữa. Rule R3 đỏ ngay: *"schema khai `qc-design-test` là consumer nhưng lệnh
1609
+ KHÔNG nhắc tới nó"*. Đúng — tôi gộp quá tay. Đã trả lại ở lệnh.
1610
+
1611
+ **Lần 2 — bộ test chặn.** `qc-scope.md` (B11) được 5 lệnh nạp, nên nó bị nướng 5 bản vào 5 file
1612
+ lệnh. Cộng thêm phần B12, tổng vượt ngưỡng: **1203 KB / ngưỡng 1200**. Framework đã có cơ chế
1613
+ cho đúng ca này (đọc-lúc-chạy thay vì nướng vào), chỉ là chưa dùng cho file đó. Chuyển xong:
1614
+ **1174 KB**.
1615
+
1616
+ > Cả hai lỗi đều là **lỗi của tôi**, và **cả hai đều do máy bắt, không phải do tôi đọc lại**.
1617
+ > Đây chính là lập luận cho mục còn treo 2b: thứ có máy canh thì không đi lệch.
1618
+
1619
+ ## Bịt một điểm mù của chính bộ máy canh
1620
+
1621
+ Cập nhật bản đồ port xong, self-check **xanh** — nhưng `functional/api.md` nhận nội dung port mà
1622
+ **không đóng dấu nguồn gốc** nào. Đọc lại luật thì rõ vì sao: nó so dấu với bản đồ **khi file có
1623
+ khai**. File không khai gì thì nó im lặng.
1624
+
1625
+ Đã thêm một nhánh mới: **target đã port thì PHẢI khai** nguồn gốc, không chỉ "khai đúng nếu có
1626
+ khai". Và **thử cháy thật** cả hai góc (bỏ cả hai dòng · bỏ một dòng) — kêu đúng cả hai lần.
1627
+
1628
+ Mất dấu nguồn gốc ở file đích nghĩa là: bản đồ biết file này port từ đâu, còn **người mở file
1629
+ thì không** — và lần đồng bộ sau, mọi thứ thành đoán.
1630
+
1631
+ ## Đã kiểm chứng
1632
+
1633
+ | Phép kiểm | Kết quả |
1634
+ |---|---|
1635
+ | Dựng lại toàn bộ | 41/41 ✅ |
1636
+ | Bộ kiểm tra nội bộ | sạch (giờ có **17** nhánh luật) ✅ |
1637
+ | Bộ test tự động | **199/199** ✅ |
1638
+ | Tổng kích thước lệnh | 1174 KB / ngưỡng 1200 ✅ |
1639
+ | Tên file cũ còn sót | **0** |
1640
+ | Lệnh "in bảng" trong kỹ năng thiết kế | **0** |
1641
+ | Dấu vết mẫu cũ trong nhánh API | **0** |
1642
+ | Khối kết quả mong đợi đúng 1 dòng | **13/13** |
1643
+ | Entry "chưa quyết" của trạm này | **21 → 0** |
1644
+ | Target đã port có đủ dấu nguồn gốc | **23/23** |
1645
+ | File mới tới đủ ba tầng (nguồn → đóng gói → đang chạy) | **13/13/13** |
1646
+
1647
+ ## Cố ý chưa làm
1648
+
1649
+ | Việc | Vì sao |
1650
+ |---|---|
1651
+ | **Máy kiểm cấu trúc file test case** | Vẫn là năng lực mới, và vẫn chờ kết quả phép thử của trạm 1. Nhưng B12 làm nó **rẻ hơn hẳn**: cả hai luật mới đều **đếm được** — "0 ký tự `\|`" và "1 dòng mỗi kết quả". Nếu phép thử kết luận cần máy kiểm thì làm một lượt cho cả file gap và file test case |
1652
+ | **4 file tầng test của bản gốc** *(ui · e2e · integration · nfr — 935 dòng)* | Đã ghi `skipped` **kèm lý do**, không để "chưa quyết". Framework tách tầng UI thành 3 kỹ năng theo cây quyết định thay vì một file 341 dòng; phần khuôn TC và độ chính xác **đã tách ra dùng chung**. Còn lại là phần khai kiến trúc agent — framework không có. Đối chiếu nội dung từng tầng để dành |
1653
+ | **3 trạm còn lại** | Đi theo thứ tự dây chuyền. Trạm soát là trạm kế tiếp, và nó **tiêu thụ** đúng chuẩn B12 vừa đặt ra — làm sau là đúng thứ tự |
1654
+
1655
+ ---
1656
+
1515
1657
  # Tổng kết
1516
1658
 
1517
1659
  | | Quyết định ở B7 | Bằng chứng | |
@@ -1554,7 +1696,7 @@ rồi, giờ bắt nó **so** với hai tài liệu kia"*. Không nạp thêm fi
1554
1696
 
1555
1697
  # Các bước còn lại
1556
1698
 
1557
- **Mười hai bước B0–B11 đã xong.** Không còn bước nào đang chờ quyết định để bắt đầu.
1699
+ **Mười ba bước B0–B12 đã xong.** Không còn bước nào đang chờ quyết định để bắt đầu.
1558
1700
 
1559
1701
  Nhưng có **hai việc chưa validate** và **bốn món nợ** — xem §Còn treo ở cuối.
1560
1702
  Mô tả kế hoạch gốc nằm ở [`qc-merge-plan.md`](qc-merge-plan.md).
@@ -1568,7 +1710,7 @@ Mô tả kế hoạch gốc nằm ở [`qc-merge-plan.md`](qc-merge-plan.md).
1568
1710
  Sau mỗi bước, toàn bộ hệ thống được dựng lại và kiểm tra tự động:
1569
1711
 
1570
1712
  - 41/41 mẫu lệnh dựng thành công
1571
- - Bộ kiểm tra nội bộ báo sạch
1713
+ - Bộ kiểm tra nội bộ báo sạch (17 nhánh luật sau B12)
1572
1714
  - Nội dung mới đã lan đủ ba tầng: bản nguồn → bản đóng gói → bản đang chạy
1573
1715
  - **9** dấu nguồn gốc đều được kiểm chứng khớp với file gốc thật
1574
1716
  - Báo khói đã **thử cháy thật** cả 5 nhánh — không giao một cái chưa bao giờ kêu
@@ -1579,7 +1721,7 @@ Sau mỗi bước, toàn bộ hệ thống được dựng lại và kiểm tra
1579
1721
 
1580
1722
  | # | Câu | Mức | Ai quyết |
1581
1723
  |---|---|---|---|
1582
- | **1** | Chạy thử trên một tính năng thật — **mười hai bước, chưa một lần chạy**. Sau B11 phép thử này còn quan trọng hơn: nó là cách duy nhất biết bản cấp tính năng có bắt được mâu thuẫn chéo UC, và có theo đúng template hay không. Ước lượng chi phí của tôi đã sai 3 lần, đều ước thấp | 🔴 chưa validate | bạn (cần spec thật) |
1724
+ | **1** | Chạy thử trên một tính năng thật — **mười ba bước, chưa một lần chạy**. Sau B11 phép thử này còn quan trọng hơn: nó là cách duy nhất biết bản cấp tính năng có bắt được mâu thuẫn chéo UC, và có theo đúng template hay không. Ước lượng chi phí của tôi đã sai 3 lần, đều ước thấp | 🔴 chưa validate | bạn (cần spec thật) |
1583
1725
  | **2** | Đưa nhật ký cho đội QC xem — họ là chủ sở hữu các kỹ năng này, và định dạng họ nhận đã đổi **hai lần** (B9 rồi B11) | 🟠 | bạn |
1584
1726
  | **2b** | **Máy kiểm cấu trúc file gap** — bệnh *"không theo template"* vẫn chưa có gì chặn bằng máy. Hiện chỉ có chỉ thị bằng văn xuôi, tức **cùng loại** với câu chỉ đường đã thất bại, chỉ mạnh hơn | 🟠 chưa chữa | bạn (sau khi chạy thử B11) |
1585
1727
  | **2c** | `Blocker` ↔ `Critical` — đổi trạm chạy test đọc `Critical` (một dòng) thay vì bắt đội QC đổi thói quen. Kết quả hôm trước cho thấy đổi từ ngữ của họ làm **tăng** khả năng lệch | 🟡 | bạn |