@educa-corp/sdd-framework 0.9.3 → 0.9.5

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 (118) hide show
  1. package/bin/build.js +11 -0
  2. package/bin/lint-trace.js +230 -2
  3. package/bin/qc-base-map.json +119 -49
  4. package/bin/self-check.js +54 -0
  5. package/bin/trace-schema.json +58 -4
  6. package/core/FRAMEWORK_VERSION +1 -1
  7. package/core/commands/generate-bdd.md +1 -0
  8. package/core/commands/generate-code.md +39 -2
  9. package/core/commands/generate-tech-docs.md +21 -2
  10. package/core/commands/map-testids.md +88 -8
  11. package/core/commands/qc-analyze.md +429 -472
  12. package/core/commands/qc-design-test.md +251 -207
  13. package/core/commands/qc-plan.md +97 -197
  14. package/core/commands/qc-report.md +76 -60
  15. package/core/commands/qc-review.md +135 -185
  16. package/core/commands/qc-run-test.md +235 -274
  17. package/core/commands/review-tech-docs.md +20 -0
  18. package/core/commands/setup-ai-first.md +5 -5
  19. package/core/commands/update-framework.md +1 -1
  20. package/core/commands/validate-traces.md +1 -1
  21. package/core/modules/qc-playwright/stack-profile.yaml +1 -1
  22. package/core/rules/data-protection.md +52 -0
  23. package/core/rules/workflow.md +1 -1
  24. package/core/skills/qc/_shared/self-review-principles.md +112 -0
  25. package/core/skills/qc/qa-analyst/DOC_GAP.template.md +1 -1
  26. package/core/skills/qc/qa-analyst/spec-breakdown.md +2 -2
  27. package/core/skills/qc/qa-designer/api/auth-chain.md +155 -0
  28. package/core/skills/qc/qa-designer/api/auth-sequence.md +75 -0
  29. package/core/skills/qc/qa-designer/api/common-headers.md +61 -0
  30. package/core/skills/qc/qa-designer/api/crud-sequence.md +122 -0
  31. package/core/skills/qc/qa-designer/api/endpoint.md +231 -0
  32. package/core/skills/qc/qa-designer/api/http-status-codes.md +102 -0
  33. package/core/skills/qc/qa-designer/e2e/journey.md +13 -8
  34. package/core/skills/qc/qa-designer/exploratory/charter.md +2 -0
  35. package/core/skills/qc/qa-designer/exploratory/explore-to-functional.md +7 -4
  36. package/core/skills/qc/qa-designer/functional/api.md +87 -18
  37. package/core/skills/qc/qa-designer/functional/gui-feature.md +12 -9
  38. package/core/skills/qc/qa-designer/functional/gui-screen.md +12 -10
  39. package/core/skills/qc/qa-designer/integration/api.md +12 -5
  40. package/core/skills/qc/qa-designer/integration/db.md +12 -6
  41. package/core/skills/qc/qa-designer/integration/gui.md +12 -5
  42. package/core/skills/qc/qa-designer/integration/kafka.md +12 -5
  43. package/core/skills/qc/qa-designer/non-functional.md +12 -5
  44. package/core/skills/qc/qa-designer/shared/action-keywords-glossary.md +91 -0
  45. package/core/skills/qc/qa-designer/shared/duplicate-check-procedure.md +105 -0
  46. package/core/skills/qc/qa-designer/shared/implicit-scenarios.md +22 -0
  47. package/core/skills/qc/qa-designer/shared/precision-rules.md +198 -0
  48. package/core/skills/qc/qa-designer/shared/read-doc-gap-inputs.md +25 -0
  49. package/core/skills/qc/qa-designer/shared/skill-decision-tree.md +93 -0
  50. package/core/skills/qc/qa-designer/shared/tc-metadata-format.md +243 -0
  51. package/core/skills/qc/qa-planner/risk-model.md +1 -1
  52. package/core/skills/qc/qa-reviewer/script/e2e.md +9 -1
  53. package/core/skills/qc/qa-reviewer/script/exploratory.md +9 -1
  54. package/core/skills/qc/qa-reviewer/script/functional.md +9 -1
  55. package/core/skills/qc/qa-reviewer/script/integration.md +9 -1
  56. package/core/skills/qc/qa-reviewer/script/non-functional.md +9 -1
  57. package/core/skills/qc/qa-reviewer/shared/read-doc-gap-inputs.md +26 -0
  58. package/core/skills/qc/qa-reviewer/shared/review-check-groups.md +207 -0
  59. package/core/skills/qc/qa-reviewer/shared/review-file-template.md +228 -0
  60. package/core/skills/qc/qa-reviewer/test-case/e2e.md +71 -13
  61. package/core/skills/qc/qa-reviewer/test-case/exploratory.md +53 -4
  62. package/core/skills/qc/qa-reviewer/test-case/functional.md +63 -15
  63. package/core/skills/qc/qa-reviewer/test-case/integration.md +64 -12
  64. package/core/skills/qc/qa-reviewer/test-case/non-functional.md +72 -13
  65. package/core/skills/qc/qa-runner/e2e.md +3 -3
  66. package/core/skills/qc/qa-runner/functional/gui-feature.md +9 -3
  67. package/core/skills/qc/qa-runner/functional/gui-screen.md +9 -3
  68. package/core/skills/qc/qa-runner/integration.md +1 -1
  69. package/core/skills/qc/qa-runner/non-functional.md +1 -1
  70. package/core/skills/spec/SKILL.md +1 -1
  71. package/core/steps/context-loader.md +7 -2
  72. package/core/steps/gap-verify.md +67 -0
  73. package/core/steps/report-footer.md +3 -3
  74. package/core/templates/feature.template +1 -0
  75. package/core/templates/tech-design.template.md +1 -0
  76. package/docs/02-concepts/pipeline-steps/09-validate-traces.md +1 -1
  77. package/docs/04-reference/commands.md +1 -1
  78. package/docs/04-reference/trace-schema.md +39 -1
  79. package/docs/explain/00-setup-ai-first.md +1 -1
  80. package/docs/explain/11-map-testids.md +70 -69
  81. package/docs/plans/qc-implementation-log.md +145 -3
  82. package/docs/plans/qc-surgery/00-nhat-ky.md +497 -0
  83. package/docs/plans/qc-surgery/01-checklist.md +92 -0
  84. package/docs/plans/qc-surgery/02-lo-trinh.md +266 -0
  85. package/docs/plans/qc-surgery/buoc/0-01-testid-attr-co-cho-o.md +157 -0
  86. package/docs/plans/qc-surgery/buoc/0-02-mot-nguon-cho-testid-attr.md +135 -0
  87. package/docs/plans/qc-surgery/buoc/0-03-skill-thoi-day-do-dom.md +167 -0
  88. package/docs/plans/qc-surgery/buoc/0-04-may-canh-hop-dong.md +173 -0
  89. package/docs/plans/qc-surgery/buoc/0-05-don-nhan-cot-va-2b.md +133 -0
  90. package/docs/plans/qc-surgery/buoc/0-06-hop-dong-truoc-code.md +226 -0
  91. package/docs/plans/qc-surgery/buoc/1-01-guard-br-tag.md +156 -0
  92. package/docs/plans/qc-surgery/buoc/1-02-guard-sc-coverage.md +153 -0
  93. package/docs/plans/qc-surgery/buoc/1-03-fail-3-nhan.md +176 -0
  94. package/docs/plans/qc-surgery/buoc/1-04-self-review-dung-chung.md +175 -0
  95. package/docs/plans/qc-surgery/buoc/1-05-spec-la-du-lieu.md +164 -0
  96. package/docs/plans/qc-surgery/buoc/1-06-gap-verify-du-bo.md +162 -0
  97. package/docs/plans/qc-surgery/buoc/README.md +85 -0
  98. package/docs/plans/qc-surgery/exec-d0-b1-testid-attr-header.md +147 -0
  99. package/docs/plans/qc-surgery/exec-d0-b2-thong-nhat-nguon-testid-attr.md +152 -0
  100. package/docs/plans/qc-surgery/exec-d0-b3-sua-skill-probe-dom.md +173 -0
  101. package/docs/plans/qc-surgery/exec-d0-b4-may-canh-4-5-6.md +168 -0
  102. package/docs/plans/qc-surgery/exec-d0-b5-don-nhan-lech.md +196 -0
  103. package/docs/plans/qc-surgery/exec-d0-b6-contract-truoc-code.md +350 -0
  104. package/docs/plans/qc-surgery/exec-d1-b1-guard-br-tag.md +129 -0
  105. package/docs/plans/qc-surgery/exec-d1-b2-guard-sc-coverage.md +159 -0
  106. package/docs/plans/qc-surgery/exec-d1-b3-fail-3-bucket.md +158 -0
  107. package/docs/plans/qc-surgery/exec-d1-b4-self-review-principles.md +145 -0
  108. package/docs/plans/qc-surgery/exec-d1-b5-noi-quy-spec-la-du-lieu.md +156 -0
  109. package/docs/plans/qc-surgery/exec-d1-b6-gap-verify-mo-rong.md +179 -0
  110. package/docs/plans/qc-surgery/exec-d2-b1-tach-qc-review.md +166 -0
  111. package/docs/plans/qc-surgery/exec-d2-b2-tach-qc-run-test-atomic.md +267 -0
  112. package/docs/plans/qc-surgery/exec-d2-b3-qc-automation-assess.md +198 -0
  113. package/docs/plans/qc-surgery/exec-d3-b1-qc-report-gate-decision.md +209 -0
  114. package/docs/plans/qc-surgery/exec-d4-b1-qc-design-testdata.md +146 -0
  115. package/docs/plans/qc-surgery/exec-d4-b2-qc-smoke-test.md +179 -0
  116. package/docs/plans/qc-surgery/exec-d4-b3-qc-metrics-va-lint.md +198 -0
  117. package/docs/plans/qc-surgery/exec-d4-b4-lint-spec-injection.md +199 -0
  118. package/package.json +1 -1
@@ -0,0 +1,231 @@
1
+ ---
2
+ version: 1.0
3
+ updated: 2026-09-04
4
+ ported_from: ui-automation-testing
5
+ upstream_path: skills/qa-tc-designer/api-testcase-designer/api/templates/endpoint.md
6
+ upstream_sha: 7b38edd94e5efd37ff561f53cff92adedabaff7f
7
+ ---
8
+
9
+ > **VIẾT LẠI, không copy** *(B12)*. Bản upstream ra đời **trước** luật ATOMIC (đội QC chốt
10
+ > 2026-07-09) nên mỗi mẫu của nó gộp nhiều kết cục vào một `**Expected:**` nối bằng `;`, và
11
+ > dùng hệ mã `API-<FEATURE>-001` khác với `TC_<FEATURE>_NNN` mà phần còn lại dùng.
12
+ >
13
+ > Port nguyên là **dạy AI làm ngược luật vừa chốt** — mẫu cụ thể luôn thắng luật trừu tượng.
14
+ > Nội dung phủ (5 nhóm ca) giữ nguyên; cấu trúc TC theo `shared/tc-metadata-format.md`.
15
+
16
+ # Khuôn TC — một endpoint đơn
17
+
18
+ Mẫu khi viết TC cho 1 endpoint (GET / POST / PUT / DELETE). Thay mọi `<placeholder>` bằng giá
19
+ trị thật từ `TEST_PLAN.md` + hợp đồng API §4 của tech-doc gộp.
20
+
21
+ Phủ **5 nhóm ca**: happy · validation · auth thiếu token · auth sai quyền · not found.
22
+ Mã lỗi tra ở `http-status-codes.md`; header tra ở `common-headers.md`.
23
+
24
+ ---
25
+
26
+ ## Nhóm ca 1 — Happy case
27
+
28
+ ⚠️ **Một request thành công sinh RA NHIỀU kết cục → nhiều TC độc lập.** Upstream gộp
29
+ `HTTP 201; body.id = x; bản ghi có trong DB` vào một dòng — đó là **ba** kết cục:
30
+
31
+ ### TC_<FEATURE>_001 — <METHOD> <path> trả về <success_code>
32
+
33
+ - **Title:** <METHOD> <path> với request hợp lệ trả về <success_code>
34
+ - **Feature:** <TICKET-ID> — <Tên feature>
35
+ - **Priority:** P0
36
+ - **Status:** Draft
37
+ - **Author:** AI
38
+ - **Tags:** api, happy-path, <feature-tag>
39
+ - **Trace:** BR-xx
40
+ - **@trace.verifies:** {UC-ID}-SC{N}
41
+
42
+ #### Preconditions
43
+ - Tài khoản role `<role>` đã có token hợp lệ.
44
+ - <Dữ liệu nền cần có, vd "đã tồn tại course id = 123">
45
+
46
+ #### Test Data
47
+ - Method: <GET|POST|PUT|DELETE>
48
+ - Path: `<path>`
49
+ - Headers:
50
+ - Authorization: Bearer `<valid_token_<role>>`
51
+ - Content-Type: application/json
52
+ - Body:
53
+ ```json
54
+ { "<field1>": "<valid_value>", "<field2>": "<valid_value>" }
55
+ ```
56
+
57
+ #### Test Steps
58
+ 1. **[Action]** Gửi `<METHOD> <path>` với headers và body trên.
59
+ 2. **[Verify]** Đọc status code của response.
60
+
61
+ #### Expected Result
62
+ - HTTP `<success_code>`
63
+
64
+ #### Teardown
65
+ - `DELETE <base_path>/{body.id}` — xoá bản ghi vừa tạo *(chỉ khi TC này tạo bản ghi thật)*
66
+
67
+ ### TC_<FEATURE>_002 — body response chứa `<key_field>` đúng
68
+
69
+ - **Title:** <METHOD> <path> — body response có `<key_field>` = `<expected_value>`
70
+ - **Feature:** <TICKET-ID> — <Tên feature>
71
+ - **Priority:** P0
72
+ - **Status:** Draft
73
+ - **Author:** AI
74
+ - **Tags:** api, happy-path, <feature-tag>
75
+ - **Trace:** BR-xx
76
+ - **@trace.verifies:** {UC-ID}-SC{N}
77
+
78
+ #### Preconditions
79
+ - *(copy nguyên từ TC_001 — mỗi TC tách là testcase ĐỘC LẬP, giữ FULL steps)*
80
+
81
+ #### Test Data
82
+ - *(copy nguyên từ TC_001)*
83
+
84
+ #### Test Steps
85
+ 1. **[Action]** Gửi `<METHOD> <path>` với headers và body trên.
86
+ 2. **[Verify]** Đọc trường `<key_field>` trong body response.
87
+
88
+ #### Expected Result
89
+ - `body.<key_field>` = `<expected_value>`
90
+
91
+ #### Teardown
92
+ - `DELETE <base_path>/{body.id}` *(chỉ khi TC này tạo bản ghi thật)*
93
+
94
+ ### TC_<FEATURE>_003 — side-effect được ghi
95
+
96
+ *Chỉ viết khi có side-effect cần verify. Nếu side-effect nằm ở DB/Kafka, TC này thuộc
97
+ **nhóm Integration API/DB/Kafka**, không thuộc nhóm Endpoint.*
98
+
99
+ - **Title:** <METHOD> <path> — bản ghi xuất hiện trong `<bảng>` với id = body.id
100
+ - **Priority:** P0
101
+ - **Tags:** api, integration, <feature-tag>
102
+ - **Trace:** BR-xx
103
+
104
+ #### Expected Result
105
+ - `<bảng>.id` = `body.id` AND `<bảng>.<cột>` = `<giá trị>`
106
+
107
+ > ✅ Bullet compound `A AND B` ở đây **hợp lệ**: cả hai vế nói về **cùng một** kết cục
108
+ > ("bản ghi đã được ghi đúng"). Còn `HTTP 201; body.id = x` là **hai** kết cục — phải tách.
109
+ > Phép soi nhanh: bullet nối bằng `;`, hoặc nối một khẳng định với một phủ định, là 2 kết cục.
110
+
111
+ ---
112
+
113
+ ## Nhóm ca 2 — Validation: field bắt buộc để trống
114
+
115
+ ### TC_<FEATURE>_004 — thiếu `<required_field>` trả về 400
116
+
117
+ - **Title:** POST <path> — thiếu `<required_field>` trả về 400
118
+ - **Priority:** P1
119
+ - **Status:** Draft
120
+ - **Author:** AI
121
+ - **Tags:** api, negative, validation, ep
122
+ - **Trace:** BR-xx
123
+
124
+ #### Test Data
125
+ - Method: POST
126
+ - Path: `<path>`
127
+ - Headers:
128
+ - Authorization: Bearer `<valid_token_<role>>`
129
+ - Content-Type: application/json
130
+ - Body: `{ }` — bỏ hẳn `<required_field>`
131
+
132
+ #### Test Steps
133
+ 1. **[Action]** Gửi POST không có `<required_field>`.
134
+ 2. **[Verify]** Đọc status code.
135
+
136
+ #### Expected Result
137
+ - HTTP 400
138
+
139
+ **Thông báo lỗi là một TC RIÊNG** — nội dung thông báo là oracle khác với mã trạng thái:
140
+
141
+ ### TC_<FEATURE>_005 — thông báo lỗi nêu đúng field thiếu
142
+
143
+ #### Expected Result
144
+ - `body.message` contains `"<chuỗi nguyên văn từ PRD/tech-doc>"`
145
+
146
+ > ⚠️ Chuỗi này phải **có thật** trong PRD hoặc tech-doc của **chính feature này**. Chưa chốt →
147
+ > để trống + gắn `🚫 Block: [GAP-UC{N}-{nnn}](../DOC_GAP.md)`, **đừng bịa oracle**.
148
+
149
+ *Mỗi field bắt buộc là một cặp TC như trên. Field có ràng buộc độ dài/khoảng giá trị → thêm TC
150
+ BVA riêng, số giá trị biên tra ở `../shared/precision-rules.md` §7.*
151
+
152
+ ---
153
+
154
+ ## Nhóm ca 3 — Auth: không có token
155
+
156
+ ### TC_<FEATURE>_006 — thiếu Authorization header trả về 401
157
+
158
+ - **Priority:** P0
159
+ - **Tags:** api, negative, auth, security
160
+ - **Trace:** BR-xx
161
+
162
+ #### Test Data
163
+ - Method: <METHOD>
164
+ - Path: `<path>`
165
+ - Headers: Content-Type: application/json — **bỏ hẳn** `Authorization`
166
+
167
+ #### Test Steps
168
+ 1. **[Action]** Gửi `<METHOD> <path>` không kèm header `Authorization`.
169
+ 2. **[Verify]** Đọc status code.
170
+
171
+ #### Expected Result
172
+ - HTTP 401
173
+
174
+ *Biến thể theo `common-headers.md` §"TC Negative liên quan header": token sai định dạng → 401 ·
175
+ `Content-Type` sai → 400 hoặc 415. Mỗi cái một TC.*
176
+
177
+ ---
178
+
179
+ ## Nhóm ca 4 — Auth: đúng token, sai quyền
180
+
181
+ ### TC_<FEATURE>_007 — token role `<wrong_role>` trả về 403
182
+
183
+ - **Priority:** P0
184
+ - **Tags:** api, negative, auth, security
185
+ - **Trace:** BR-xx
186
+
187
+ #### Test Data
188
+ - Headers: Authorization: Bearer `<valid_token_<wrong_role>>`
189
+
190
+ #### Test Steps
191
+ 1. **[Action]** Gửi `<METHOD> <path>` bằng token của role không được phép.
192
+ 2. **[Verify]** Đọc status code.
193
+
194
+ #### Expected Result
195
+ - HTTP 403
196
+
197
+ > **401 vs 403 là hai chuyện khác nhau** — 401 = chưa xác thực được anh là ai; 403 = biết anh
198
+ > là ai nhưng anh không được phép. Trộn hai cái là bỏ mất một lớp bảo mật khỏi phạm vi test.
199
+
200
+ ---
201
+
202
+ ## Nhóm ca 5 — Not found
203
+
204
+ ### TC_<FEATURE>_008 — ID không tồn tại trả về 404
205
+
206
+ - **Priority:** P1
207
+ - **Tags:** api, negative, not-found
208
+ - **Trace:** BR-xx
209
+
210
+ #### Test Data
211
+ - Method: <GET|PUT|DELETE>
212
+ - Path: `<base_path>/<nonexistent_id>` (vd `/api/v1/courses/999999`)
213
+ - Headers: Authorization: Bearer `<valid_token_<role>>`
214
+
215
+ #### Test Steps
216
+ 1. **[Action]** Gửi `<METHOD>` với ID chắc chắn không tồn tại trong hệ thống.
217
+ 2. **[Verify]** Đọc status code.
218
+
219
+ #### Expected Result
220
+ - HTTP 404
221
+
222
+ ---
223
+
224
+ ## Nhắc lại ba luật hay bị bỏ
225
+
226
+ 1. **Placeholder có tên rõ nghĩa** — `<valid_token_admin>`, `<expired_token>`,
227
+ `<token_wrong_role>`; **không** dùng `<token>` chung chung *(`common-headers.md` §Quy ước)*.
228
+ 2. **`#### Teardown` là section riêng, KHÔNG phải bullet của Expected Result.** TC tạo bản ghi
229
+ thật thì bắt buộc có; TC chỉ GET hoặc chỉ cấu hình mock thì **không cần**.
230
+ 3. **Mọi TC tách vẫn giữ FULL Test Steps** — lặp đủ bước để tới trạng thái assert. Không cắt
231
+ bước theo từng bullet, không đánh `(1/N)`, không hậu tố `001a`/`001b`.
@@ -0,0 +1,102 @@
1
+ ---
2
+ version: 1.0
3
+ updated: 2026-09-04
4
+ ported_from: ui-automation-testing
5
+ upstream_path: skills/qa-tc-designer/api-testcase-designer/api/references/http-status-codes.md
6
+ upstream_sha: a82baa99350f63955245764a6aa57c9dca6d055f
7
+ ---
8
+ # Bảng tra cứu — HTTP Status Codes
9
+
10
+ Dùng để điền chính xác mã lỗi vào cột Expected của TC API.
11
+ Tra theo nhóm (2xx/4xx/5xx) hoặc theo tình huống.
12
+
13
+ ---
14
+
15
+ ## 2xx — Thành công
16
+
17
+ | Mã | Tên | Dùng khi | Expected điển hình |
18
+ |---|---|---|---|
19
+ | 200 | OK | GET, PUT thành công; login | Body chứa data/resource |
20
+ | 201 | Created | POST tạo bản ghi mới | Body chứa `id` + resource mới |
21
+ | 204 | No Content | DELETE thành công; PUT không trả body | Body rỗng |
22
+
23
+ ---
24
+
25
+ ## 4xx — Lỗi phía client
26
+
27
+ | Mã | Tên | Dùng khi | Expected điển hình |
28
+ |---|---|---|---|
29
+ | 400 | Bad Request | Body/params sai format, thiếu field bắt buộc, giá trị không hợp lệ | `body.message` hoặc `body.errors` mô tả field lỗi |
30
+ | 401 | Unauthorized | Không có token, token hết hạn, token sai | `body.message` = "Unauthorized" hoặc "Token invalid/expired" |
31
+ | 403 | Forbidden | Token hợp lệ nhưng không đủ quyền (sai role) | `body.message` = "Forbidden" hoặc "Access denied" |
32
+ | 404 | Not Found | Resource ID không tồn tại | `body.message` = "Not found" |
33
+ | 409 | Conflict | Tạo trùng bản ghi (unique constraint) | `body.message` mô tả field trùng |
34
+ | 422 | Unprocessable Entity | Business rule validation (vd: ngày end < ngày start) | `body.errors` liệt kê vi phạm |
35
+ | 429 | Too Many Requests | Vượt rate limit | `Retry-After` header; body thông báo limit |
36
+
37
+ ---
38
+
39
+ ## 5xx — Lỗi phía server (không test chủ động; ghi vào TC edge nếu plan đề cập)
40
+
41
+ | Mã | Tên | Ghi chú |
42
+ |---|---|---|
43
+ | 500 | Internal Server Error | Không nên trigger trong test bình thường; ghi vào TC nếu plan có scenario |
44
+ | 503 | Service Unavailable | Chỉ test trong integration/availability scope |
45
+
46
+ ---
47
+
48
+ ## Mapping tình huống → mã (LMS Edupia)
49
+
50
+ | Tình huống | Mã kỳ vọng | Ghi chú |
51
+ |---|---|---|
52
+ | Login đúng | 200 | Body có `access_token` |
53
+ | Login sai password | 401 hoặc 400 | Xác nhận lại với dev |
54
+ | Tạo mới thành công | 201 | Body có `id` |
55
+ | Lấy danh sách | 200 | Body có `data[]` + `pagination` |
56
+ | Lấy 1 record hợp lệ | 200 | Body có đầy đủ fields |
57
+ | Xóa thành công | 200 hoặc 204 | Xác nhận lại với dev |
58
+ | Field bắt buộc để trống | 400 | `body.errors` có field name |
59
+ | Vượt độ dài tối đa | 400 | `body.errors` có field name + giới hạn |
60
+ | Format sai (email/phone) | 400 | `body.errors` mô tả format |
61
+ | Token không có | 401 | — |
62
+ | Token hết hạn | 401 | — |
63
+ | Role không đủ quyền | 403 | — |
64
+ | ID không tồn tại | 404 | — |
65
+ | Tên/code trùng | 409 | Xác nhận field unique với dev |
66
+ | Ngày end trước ngày start | 422 | Business rule validation |
67
+
68
+ ---
69
+
70
+ ## Cấu trúc body lỗi chuẩn (tham khảo)
71
+
72
+ ```json
73
+ // 400 / 422 — validation error
74
+ {
75
+ "statusCode": 400,
76
+ "message": "Validation failed",
77
+ "errors": [
78
+ { "field": "name", "message": "Trường này là bắt buộc" },
79
+ { "field": "startDate", "message": "Ngày bắt đầu không được để trống" }
80
+ ]
81
+ }
82
+
83
+ // 401 — unauthorized
84
+ {
85
+ "statusCode": 401,
86
+ "message": "Unauthorized"
87
+ }
88
+
89
+ // 403 — forbidden
90
+ {
91
+ "statusCode": 403,
92
+ "message": "Forbidden resource"
93
+ }
94
+
95
+ // 404 — not found
96
+ {
97
+ "statusCode": 404,
98
+ "message": "Resource not found"
99
+ }
100
+ ```
101
+
102
+ > Cấu trúc thực tế có thể khác — xác nhận với dev/API spec trước khi điền vào TC.
@@ -17,11 +17,14 @@ Skill **tự chứa** để viết TC end-to-end: hành trình đầu→cuối x
17
17
 
18
18
  ---
19
19
 
20
- ## Format file TC (bắt buộc)
21
- - Metadata **list**: Title · Feature · Priority · Status(Draft) · Author(AI) · Tags · **Trace** `[BR-xx](REQUIREMENT_ANALYSIS.md#3-business-rules)` (không có → `⚠️ Chưa có Business Rule`) · **🚫 Block** `[GAP-xx](DOC_GAP.md)`.
22
- - **Test Data** dạng list (tài khoản/role, dữ liệu lớp/buổi…) · **Steps** `[Action]`/`[Verify]` xuyên các màn ·
23
- **Expected** 1 bullet = chuỗi verify point (tạo thành công, đúng, định tuyến đúng, đồng bộ đúng, hiển thị danh sách).
24
- - ID journey `E2E-<FEATURE>-NN` · cuối file: Trace matrix + bảng TC block · bỏ nội dung gạch ngang.
20
+ ## Format file TC
21
+
22
+ > **Nạp `{paths.qc_skills_dir}/qa-designer/shared/tc-metadata-format.md`** khuôn TC, luật
23
+ > ATOMIC (1 kết cục = 1 TC), cách phân nhóm, hai file `.Test.md`, Trace + `@trace.verifies`,
24
+ > `🚫 Block`, dòng `Test-ID attribute`. **Không lặp lại luật format đây.**
25
+ >
26
+ > Khi viết Expected Result / Test Data: nạp thêm `shared/precision-rules.md` (cấm từ mơ hồ,
27
+ > đơn vị, toán tử) + `shared/action-keywords-glossary.md` (một hành động một từ).
25
28
 
26
29
  ## Kỹ thuật áp dụng
27
30
  - **Use Case/Scenario:** mỗi journey = main + alternate + exception flow.
@@ -34,8 +37,10 @@ Lấy danh sách journey + trục bao phủ + verify points từ TEST_PLAN · m
34
37
 
35
38
  ## Phase 2 — Write
36
39
  Mỗi journey → 1 TC bám Format; Expected = chuỗi verify point; chuẩn bị tiền điều kiện & cleanup, mỗi journey độc lập.
37
- **Journey phụ thuộc gap vẫn viết + 🚫 Block: GAP-xx**, định tuyến ghi "dự kiến theo BR". Trace BR.
40
+ **Journey phụ thuộc gap vẫn viết + 🚫 Block: [GAP-UC{N}-{nnn}]**, định tuyến ghi "dự kiến theo BR". Trace BR.
38
41
 
39
42
  ## Output
40
- File TC e2e (hoặc nhóm E2E trong file feature) trong `{qc_artifact_dir}test-cases/`.
41
- In bảng `E2E-ID | Journey | Pri | Trace | Block` + bảng TC block. Bàn giao `qa-reviewer`.
43
+
44
+ Ghi vào `{qc_artifact_dir}test-cases/TC_<FEATURE>.Test.md` **Nhóm 6 E2E**. Mỗi journey một TC; tiền điều kiện · kết quả/định tuyến kỳ vọng · BR · phụ thuộc gap · priority ghi dạng trường danh sách.
45
+
46
+ **Dạng danh sách, KHÔNG bảng** — file TC không được có ký tự `|` (`shared/tc-metadata-format.md` §Nguyên tắc format file). Cuối file: Trace matrix + danh sách TC bị block, cũng dạng danh sách. Bàn giao `/qc-review`.
@@ -66,3 +66,5 @@ Sinh 10-15 câu hỏi cho dev/BA (assumptions, edge case, error handling, securi
66
66
  Charter files: {paths.qc_dir}/exploratory/charters/<feature>_01.md, _02.md...
67
67
  Ideas file: {paths.qc_dir}/exploratory/ideas/<feature>.md
68
68
  Bảng tổng kết: STT | Charter | Tour | Risk | Time-box
69
+
70
+ *(Charter KHÔNG phải file TC — luật "không bảng" chỉ áp cho `*.Test.md`. Charter chuyển thành TC ở `explore-to-functional.md`, lúc đó mới theo luật đó.)*
@@ -32,12 +32,15 @@ So requirement vs draft: requirement chưa phủ → thêm TC · TC sai logic
32
32
  chỉnh Priority theo business. Không có requirement → giữ draft Phase 2.
33
33
 
34
34
  ## Phase 4 — Convert to Functional (format chuẩn)
35
- Chuyển draft → TC chính thức bám **format file `TC_<FEATURE>.md`**:
35
+ Chuyển draft → TC chính thức bám **format file `TC_<FEATURE>.Test.md`**:
36
36
  - Metadata **list**: Title · Feature · Priority(P0/P1/P2) · Status(Draft) · Author(AI) · Tags ·
37
- **Trace** `[BR-xx](REQUIREMENT_ANALYSIS.md#3-business-rules)` (không có BR → `⚠️ Chưa có Business Rule`) · **🚫 Block** `[GAP-xx]` nếu chặn.
37
+ **Trace** `[BR-xx](../REQUIREMENT_ANALYSIS.md#3-business-rules)` (không có BR → `⚠️ Chưa có Business Rule`) · **🚫 Block** `[GAP-UC{N}-{nnn}]` nếu chặn.
38
38
  - **Test Data** dạng list · **Steps** `[Action]`/`[Verify]` · **Expected** 1 bullet cụ thể.
39
39
  - Phân nhóm GUI/Functional · cuối file: Trace matrix + bảng TC block · bỏ nội dung gạch ngang.
40
- - Đặt file `{qc_artifact_dir}test-cases/TC_<FEATURE>.md`.
40
+ - Đặt file `{qc_artifact_dir}test-cases/TC_<FEATURE>.Test.md` (nhóm 3 Functional).
41
41
 
42
42
  ## Output
43
- File TC functional + bảng `TC_ID | Title | Priority | Technique | Trace`. Bàn giao `qa-reviewer`.
43
+
44
+ Ghi TC đã chuyển thành functional vào `{qc_artifact_dir}test-cases/TC_<FEATURE>.Test.md` — **Nhóm 3 Functional**.
45
+
46
+ **Dạng danh sách, KHÔNG bảng** — file TC không được có ký tự `|` (`shared/tc-metadata-format.md` §Nguyên tắc format file). Cuối file: Trace matrix + danh sách TC bị block, cũng dạng danh sách. Bàn giao `/qc-review`.
@@ -1,13 +1,15 @@
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-designer/api-testcase-designer.md
6
+ upstream_sha: 211c18728baf029a7572f0ffb161e92a933fa8fb
5
7
  ---
6
8
 
7
9
  # Test Case — Functional API (không qua UI)
8
10
 
9
- Skill **tự chứa** để viết TC kiểm thử một API endpoint ở mức chức năng (request → response).
10
- Chỉ cần load file này.
11
+ Viết TC kiểm thử một API endpoint ở mức chức năng (request → response).
12
+ Nạp cùng `shared/` (khuôn + độ chính xác + từ điển hành động) và `../api/` (mẫu + bảng tra).
11
13
 
12
14
  ## Khi nào trigger
13
15
  - "viết test case cho API [method] [path]" — verify contract, validation, mã lỗi của endpoint
@@ -18,28 +20,95 @@ Chỉ cần load file này.
18
20
 
19
21
  ---
20
22
 
21
- ## Format file `TC_<FEATURE>.md` (bắt buộc)
22
- - 1 file/feature · mỗi TC **1 concept** · metadata **list** (không bảng/emoji): Title · Feature ·
23
- Priority(P0/P1/P2) · Status(Draft) · Author(AI) · Tags · Trace · 🚫 Block(nếu có).
24
- - **Trace:** `[BR-xx](REQUIREMENT_ANALYSIS.md#3-business-rules)`; không có BR → `⚠️ Chưa có Business Rule`.
25
- - **🚫 Block:** TC phụ thuộc gap vẫn viết đủ + `[GAP-xx](DOC_GAP.md) — lý do`.
26
- - **Test Data:** dạng **list** (request cụ thể: method/path/headers/body). **Steps:** `[Action]`/`[Verify]`.
27
- **Expected:** 1 bullet nêu rõ **status code + field response cần chốt** (không ✅/❌).
28
- - Cuối file: **Trace matrix** (BR↔TC, ⚠️ TC thiếu BR) + **bảng TC bị block** · bỏ nội dung gạch ngang.
23
+ ## Format file TC
29
24
 
30
- ## Kỹ thuật áp dụng
31
- - Mỗi field request **EP** (phân vùng valid/invalid) + **BVA** (biên độ dài/giá trị).
32
- - Tổ hợp điều kiện (auth × param × state) **Decision Table**.
25
+ > **Nạp `{paths.qc_skills_dir}/qa-designer/shared/tc-metadata-format.md`** khuôn TC, luật
26
+ > ATOMIC (1 kết cục = 1 TC), cách phân nhóm, hai file `.Test.md`, Trace + `@trace.verifies`,
27
+ > `🚫 Block`, dòng `Test-ID attribute`. **Không lặp lại luật format đây.**
28
+ >
29
+ > Khi viết Expected Result / Test Data: nạp thêm `shared/precision-rules.md` (cấm từ mơ hồ,
30
+ > đơn vị, toán tử) + `shared/action-keywords-glossary.md` (một hành động một từ).
31
+
32
+ ## Đầu vào — sáu trường bắt buộc cho mỗi endpoint
33
+
34
+ Trước khi viết TC, mỗi endpoint phải biết đủ **sáu** thứ. Thiếu bất kỳ trường nào → **hỏi, đừng đoán**:
35
+
36
+ | # | Trường | Lấy ở đâu |
37
+ |---|---|---|
38
+ | 1 | Endpoint (method + path) | tech-doc gộp §4 Hợp đồng API |
39
+ | 2 | Auth / role được phép | §4 + PRD phần phân quyền |
40
+ | 3 | Schema request (field · kiểu · bắt buộc · ràng buộc) | §4 |
41
+ | 4 | Response thành công (mã + schema) | §4 |
42
+ | 5 | **Các mã lỗi** và body lỗi | §4 + §8 Xử lý lỗi & biên |
43
+ | 6 | Side-effect (ghi DB, phát event) | §6 Điểm tích hợp |
44
+
45
+ Trường 5 và 6 là hai chỗ hay thiếu nhất. Thiếu 5 → không viết được nhóm negative. Thiếu 6 →
46
+ side-effect không ai verify, và lỗi mất dữ liệu lọt qua toàn bộ dây chuyền.
47
+
48
+ ## Kỹ thuật ISTQB cho tầng API *(CTFL v4.0)*
49
+
50
+ | Tình huống | Kỹ thuật |
51
+ |---|---|
52
+ | Tham số có kiểu / phạm vi / định dạng | **EP + BVA** |
53
+ | Tổ hợp điều kiện (quyền × trạng thái × input) | **Decision Table** |
54
+ | Spec mỏng, nghi có lỗi tiềm ẩn | **Error Guessing** |
55
+
56
+ - **EP/BVA từng tham số**: valid + invalid (thiếu · sai kiểu · vượt biên · rỗng · quá dài).
57
+ Mỗi phân vùng một TC. Số giá trị biên (3 hay 4) tra `../shared/precision-rules.md` §7.
58
+ - **Decision Table cho phân quyền**: điều kiện = (role, sở hữu resource, trạng thái resource)
59
+ → hành động = mã trạng thái. **Mỗi rule một TC**, kể cả rule mà kết quả là "không làm gì".
60
+ - **Error Guessing theo mã trạng thái** — phủ đủ mã **áp dụng được** cho endpoint đó:
61
+
62
+ | Mã | Khi nào |
63
+ |---|---|
64
+ | 400 | thiếu / sai tham số |
65
+ | 401 | thiếu hoặc sai token |
66
+ | 403 | đúng token, sai quyền |
67
+ | 404 | resource không tồn tại |
68
+ | 409 | trùng giá trị unique |
69
+ | 422 | validate nghiệp vụ (đúng định dạng, sai luật) |
70
+ | 5xx | lỗi hệ thống / dịch vụ phụ thuộc |
71
+
72
+ Bảng đầy đủ + nghĩa trong ngữ cảnh: `../api/http-status-codes.md`. **401 ≠ 403** — trộn hai cái
73
+ là bỏ mất một lớp bảo mật khỏi phạm vi test.
74
+
75
+ ## Thứ tự viết
76
+
77
+ **1. Positive → 2. Negative → 3. Edge → 4. Implicit.**
78
+
79
+ Bước 4 nạp `../shared/implicit-scenarios.md` — 7 tình huống bắt buộc nghĩ tới (rate limit ·
80
+ đồng thời · hết hạn phiên · trạng thái rỗng · dữ liệu tối đa · ký tự đặc biệt · ghi log).
81
+ Áp cho **mọi** nhóm TC, không riêng nhóm edge.
82
+
83
+ **Trước khi viết TC mới**: nạp `../shared/duplicate-check-procedure.md` — grep từ khoá trong file
84
+ TC hiện có. Một TC "email đã tồn tại" có thể đã nằm ở nhóm Validation của file giao diện.
85
+
86
+ ## Năm luật chất lượng *(để reviewer không phải trả lại)*
87
+
88
+ 1. **Title ≤ 60 ký tự**, nêu được cả tình huống lẫn kết quả.
89
+ 2. **Test Steps ≥ 2 bước.** Chỉ một hành động → thêm bước `[Verify]` quan sát kết quả.
90
+ 3. **Expected Result đo được** — cấm cụm mơ hồ. Phép thử: *hai QC đọc có ra cùng một kết luận
91
+ pass/fail không?* Danh sách 9 cụm bị cấm: `../shared/precision-rules.md` §1.
92
+ 4. **Test Data ghi note kỹ thuật**: `EP: valid`, `BVA: biên trên`, `DT: rule 3`.
93
+ 5. **Priority có nghĩa cố định**: P0 = chặn phát hành · P1 = smoke · P2 = regression.
33
94
 
34
95
  ## Phase 1 — Clarify
35
96
  Endpoint (method/path/auth/role/content-type) · request (path/query/body schema: field, kiểu, bắt buộc, ràng buộc) ·
36
97
  response (schema thành công + các mã lỗi 4xx/5xx + body lỗi) · side-effect (nếu cần verify → cân nhắc `integration/api`).
37
98
 
99
+ *Có `TEST_PLAN.md` đủ sáu trường trên → bỏ qua Phase 1, sang thẳng Phase 2.*
100
+
38
101
  ## Phase 2 — Write
39
- - Nhóm TC: happy (200 + schema đúng) → validation (400 từng field, dùng EP/BVA) → auth (401/403)
102
+ - Nhóm TC: happy ( thành công + schema) → validation (400 từng field, EP/BVA) → auth (401/403)
40
103
  → not found (404) → edge (payload lớn, ký tự đặc biệt, rate limit).
41
- - Mỗi TC bám khối Format; Expected ghi status code + phần body verify; trace BR; gap chặn → 🚫 Block.
104
+ - Mỗi TC bám mẫu `../api/endpoint.md`; chuỗi nhiều bước bám `../api/auth-chain.md`.
105
+ - **Không hardcode URL / thông tin đăng nhập.** Placeholder có tên rõ nghĩa
106
+ (`<valid_token_admin>`, không phải `<token>`).
42
107
 
43
108
  ## Output
44
- File TC (`TC_<FEATURE>_API.md` hoặc gộp trong file feature) trong `{qc_artifact_dir}test-cases/`.
45
- In bảng TC + Trace matrix. Bàn giao `qa-reviewer`.
109
+
110
+ Ghi vào `{qc_artifact_dir}test-cases/TC_<FEATURE>_API.Test.md` **Nhóm 1 Endpoint**.
111
+
112
+ File này chỉ sinh khi có cờ `--api` hoặc `--all`. Mẫu TC: `../api/endpoint.md` · chuỗi auth: `../api/auth-chain.md` · tra mã: `../api/http-status-codes.md` · header: `../api/common-headers.md`.
113
+
114
+ **Dạng danh sách, KHÔNG bảng** — file TC không được có ký tự `|` (`shared/tc-metadata-format.md` §Nguyên tắc format file). Cuối file: Trace matrix + danh sách TC bị block, cũng dạng danh sách. Bàn giao `/qc-review`.
@@ -18,13 +18,14 @@ Skill **tự chứa** để viết TC functional cho feature có luồng span
18
18
 
19
19
  ---
20
20
 
21
- ## Format file `TC_<FEATURE>.md` (bắt buộc)
22
- - 1 file/feature · mỗi TC **1 concept** · metadata **list** (không bảng/emoji): Title · Feature ·
23
- Priority(P0/P1/P2) · Status(Draft) · Author(AI) · Tags · Trace · 🚫 Block(nếu có).
24
- - **Trace:** `[BR-xx](REQUIREMENT_ANALYSIS.md#3-business-rules)`; không BR `⚠️ Chưa Business Rule`.
25
- - **🚫 Block:** TC phụ thuộc gap vẫn viết đủ + `[GAP-xx](DOC_GAP.md) — lý do`.
26
- - **Test Data:** dạng **list** (không bảng). **Steps:** `[Action]`/`[Verify]`, không `*Expected:*`/bước. **Expected:** 1 bullet cụ thể.
27
- - Cuối file: **Trace matrix** (BR↔TC, ⚠️ TC thiếu BR) + **bảng TC bị block** · không `#### Python Test Mapping` · bỏ nội dung gạch ngang.
21
+ ## Format file TC
22
+
23
+ > **Nạp `{paths.qc_skills_dir}/qa-designer/shared/tc-metadata-format.md`** khuôn TC, luật
24
+ > ATOMIC (1 kết cục = 1 TC), cách phân nhóm, hai file `.Test.md`, Trace + `@trace.verifies`,
25
+ > `🚫 Block`, dòng `Test-ID attribute`. **Không lặp lại luật format đây.**
26
+ >
27
+ > Khi viết Expected Result / Test Data: nạp thêm `shared/precision-rules.md` (cấm từ hồ,
28
+ > đơn vị, toán tử) + `shared/action-keywords-glossary.md` (một hành động một từ).
28
29
 
29
30
  ## Kỹ thuật áp dụng
30
31
  - **Use Case** cho flow tổng: main (P0) → alternate (P1) → exception (negative).
@@ -42,5 +43,7 @@ Liệt kê các màn/route + thứ tự điều hướng · state/dữ liệu tr
42
43
  - Mỗi TC bám khối Format; trace BR; gap chặn → 🚫 Block.
43
44
 
44
45
  ## Output
45
- File `TC_<FEATURE>.md` trong `{qc_artifact_dir}test-cases/`. In bảng TC + Trace matrix + bảng TC block.
46
- Bàn giao `qa-reviewer` (test-case).
46
+
47
+ Ghi vào `{qc_artifact_dir}test-cases/TC_<FEATURE>.Test.md` — **Nhóm 3 Functional** (luồng đa màn trong cùng một feature).
48
+
49
+ **Dạng danh sách, KHÔNG bảng** — file TC không được có ký tự `|` (`shared/tc-metadata-format.md` §Nguyên tắc format file). Cuối file: Trace matrix + danh sách TC bị block, cũng dạng danh sách. Bàn giao `/qc-review`.
@@ -18,14 +18,14 @@ Skill **tự chứa** để viết TC functional cho 1 màn hình đơn lẻ (we
18
18
 
19
19
  ---
20
20
 
21
- ## Format file `TC_<FEATURE>.md` (bắt buộc)
22
- - 1 file/feature · mỗi TC **1 concept** · metadata **list** (mỗi trường 1 dòng, không bảng/emoji):
23
- Title · Feature · Priority(P0/P1/P2) · Status(Draft) · Author(AI) · Tags · Trace · 🚫 Block(nếu có).
24
- - **Trace:** `[BR-xx](REQUIREMENT_ANALYSIS.md#3-business-rules)`; TC không BR `⚠️ Chưa Business Rule`.
25
- - **🚫 Block:** TC phụ thuộc gap **vẫn viết đủ** + `[GAP-xx](DOC_GAP.md) do`; chưa chạy tới khi gap Answered.
26
- - **Test Data:** dạng **list** (`- **Trường:** giá trị`), không bảng.
27
- - **Test Steps:** `**[Action]**` / `**[Verify]**`, KHÔNG `- *Expected:*` sau bước. **Expected:** 1 bullet cụ thể (không ✅/❌).
28
- - Phân nhóm GUI/Functional · cuối file: **Trace matrix** (BR↔TC, ⚠️ TC thiếu BR) + **bảng TC bị block** · KHÔNG `#### Python Test Mapping` · bỏ nội dung gạch ngang.
21
+ ## Format file TC
22
+
23
+ > **Nạp `{paths.qc_skills_dir}/qa-designer/shared/tc-metadata-format.md`** khuôn TC, luật
24
+ > ATOMIC (1 kết cục = 1 TC), cách phân nhóm, hai file `.Test.md`, Trace + `@trace.verifies`,
25
+ > `🚫 Block`, dòng `Test-ID attribute`. **Không lặp lại luật format đây.**
26
+ >
27
+ > Khi viết Expected Result / Test Data: nạp thêm `shared/precision-rules.md` (cấm từ hồ,
28
+ > đơn vị, toán tử) + `shared/action-keywords-glossary.md` (một hành động một từ).
29
29
 
30
30
  ## Kỹ thuật áp dụng
31
31
  - Field có ràng buộc (độ dài/số/ngày) → **EP** (mỗi phân vùng 1 TC, tag `ep`) + **BVA** (4 TC min−1/min/max/max+1, tag `bva`).
@@ -48,5 +48,7 @@ chức năng (input/action/display/nav) · constraint (required/min-max/format/e
48
48
  - Mỗi TC bám khối Format trên; trace BR; TC chặn bởi gap → 🚫 Block.
49
49
 
50
50
  ## Output
51
- File `TC_<FEATURE>.md` trong `{qc_artifact_dir}test-cases/`. In bảng `TC_ID | Title | Priority | Tags | Trace`
52
- + Trace matrix + bảng TC block. Bàn giao `qa-reviewer` (test-case).
51
+
52
+ Ghi vào `{qc_artifact_dir}test-cases/TC_<FEATURE>.Test.md` **Nhóm 1 GUI** · **Nhóm 2 Validation** · **Nhóm 3 Functional**.
53
+
54
+ **Dạng danh sách, KHÔNG bảng** — file TC không được có ký tự `|` (`shared/tc-metadata-format.md` §Nguyên tắc format file). Cuối file: Trace matrix + danh sách TC bị block, cũng dạng danh sách. Bàn giao `/qc-review`.
@@ -19,10 +19,14 @@ verify luồng dữ liệu & contract giữa các thành phần. Chỉ cần loa
19
19
 
20
20
  ---
21
21
 
22
- ## Format file TC (bắt buộc)
23
- - Metadata **list**: Title · Feature · Priority · Status(Draft) · Author(AI) · Tags · **Trace** `[BR-xx](REQUIREMENT_ANALYSIS.md#3-business-rules)` (không có → `⚠️ Chưa có Business Rule`) · **🚫 Block** `[GAP-xx](DOC_GAP.md)` (TC chặn vẫn viết đủ).
24
- - **Test Data** dạng list · **Steps** `[Action]`/`[Verify]` · **Expected** 1 bullet nêu rõ chặng verify (response/bản ghi/event).
25
- - Cuối file: Trace matrix + bảng TC block · bỏ nội dung gạch ngang.
22
+ ## Format file TC
23
+
24
+ > **Nạp `{paths.qc_skills_dir}/qa-designer/shared/tc-metadata-format.md`** khuôn TC, luật
25
+ > ATOMIC (1 kết cục = 1 TC), cách phân nhóm, hai file `.Test.md`, Trace + `@trace.verifies`,
26
+ > `🚫 Block`, dòng `Test-ID attribute`. **Không lặp lại luật format ở đây.**
27
+ >
28
+ > Khi viết Expected Result / Test Data: nạp thêm `shared/precision-rules.md` (cấm từ mơ hồ,
29
+ > đơn vị, toán tử) + `shared/action-keywords-glossary.md` (một hành động một từ).
26
30
 
27
31
  ## Kỹ thuật áp dụng
28
32
  - **Interface/Contract:** verify schema request/response giữa caller↔callee.
@@ -39,4 +43,7 @@ Nhóm TC: happy (dữ liệu đúng đầu→cuối) → contract negative (inpu
39
43
  → concurrency → điều kiện đồng bộ (đổ/không đổ). Mỗi TC bám Format; trace BR; gap chặn → 🚫 Block.
40
44
 
41
45
  ## Output
42
- File TC integration trong `{qc_artifact_dir}test-cases/`. Ưu tiên P0 cho định tuyến & tiền-dữ liệu. Bàn giao `qa-reviewer`.
46
+
47
+ Ghi vào `{qc_artifact_dir}test-cases/TC_<FEATURE>_API.Test.md` — **Nhóm 2 Integration API/DB/Kafka**. Ưu tiên P0 cho định tuyến & tiền-dữ liệu. Chuỗi gọi phụ thuộc nhau: `../api/crud-sequence.md`.
48
+
49
+ **Dạng danh sách, KHÔNG bảng** — file TC không được có ký tự `|` (`shared/tc-metadata-format.md` §Nguyên tắc format file). Cuối file: Trace matrix + danh sách TC bị block, cũng dạng danh sách. Bàn giao `/qc-review`.