@educa-corp/sdd-framework 0.9.4 → 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.
- package/bin/lint-trace.js +230 -2
- package/bin/self-check.js +24 -0
- package/bin/trace-schema.json +58 -4
- package/core/FRAMEWORK_VERSION +1 -1
- package/core/commands/generate-bdd.md +1 -0
- package/core/commands/generate-code.md +39 -2
- package/core/commands/generate-tech-docs.md +21 -2
- package/core/commands/map-testids.md +88 -8
- package/core/commands/qc-analyze.md +424 -354
- package/core/commands/qc-design-test.md +246 -182
- package/core/commands/qc-plan.md +92 -79
- package/core/commands/qc-report.md +76 -60
- package/core/commands/qc-review.md +130 -114
- package/core/commands/qc-run-test.md +230 -156
- package/core/commands/review-tech-docs.md +20 -0
- package/core/modules/qc-playwright/stack-profile.yaml +1 -1
- package/core/rules/data-protection.md +52 -0
- package/core/skills/qc/_shared/self-review-principles.md +112 -0
- package/core/skills/qc/qa-runner/e2e.md +2 -2
- package/core/skills/qc/qa-runner/functional/gui-feature.md +9 -3
- package/core/skills/qc/qa-runner/functional/gui-screen.md +9 -3
- package/core/skills/qc/qa-runner/integration.md +1 -1
- package/core/skills/qc/qa-runner/non-functional.md +1 -1
- package/core/skills/spec/SKILL.md +1 -1
- package/core/steps/context-loader.md +7 -2
- package/core/steps/gap-verify.md +67 -0
- package/core/steps/report-footer.md +3 -3
- package/core/templates/feature.template +1 -0
- package/core/templates/tech-design.template.md +1 -0
- package/docs/04-reference/commands.md +1 -1
- package/docs/04-reference/trace-schema.md +38 -0
- package/docs/explain/11-map-testids.md +70 -69
- package/docs/plans/qc-surgery/00-nhat-ky.md +497 -0
- package/docs/plans/qc-surgery/01-checklist.md +92 -0
- package/docs/plans/qc-surgery/02-lo-trinh.md +266 -0
- package/docs/plans/qc-surgery/buoc/0-01-testid-attr-co-cho-o.md +157 -0
- package/docs/plans/qc-surgery/buoc/0-02-mot-nguon-cho-testid-attr.md +135 -0
- package/docs/plans/qc-surgery/buoc/0-03-skill-thoi-day-do-dom.md +167 -0
- package/docs/plans/qc-surgery/buoc/0-04-may-canh-hop-dong.md +173 -0
- package/docs/plans/qc-surgery/buoc/0-05-don-nhan-cot-va-2b.md +133 -0
- package/docs/plans/qc-surgery/buoc/0-06-hop-dong-truoc-code.md +226 -0
- package/docs/plans/qc-surgery/buoc/1-01-guard-br-tag.md +156 -0
- package/docs/plans/qc-surgery/buoc/1-02-guard-sc-coverage.md +153 -0
- package/docs/plans/qc-surgery/buoc/1-03-fail-3-nhan.md +176 -0
- package/docs/plans/qc-surgery/buoc/1-04-self-review-dung-chung.md +175 -0
- package/docs/plans/qc-surgery/buoc/1-05-spec-la-du-lieu.md +164 -0
- package/docs/plans/qc-surgery/buoc/1-06-gap-verify-du-bo.md +162 -0
- package/docs/plans/qc-surgery/buoc/README.md +85 -0
- package/docs/plans/qc-surgery/exec-d0-b1-testid-attr-header.md +147 -0
- package/docs/plans/qc-surgery/exec-d0-b2-thong-nhat-nguon-testid-attr.md +152 -0
- package/docs/plans/qc-surgery/exec-d0-b3-sua-skill-probe-dom.md +173 -0
- package/docs/plans/qc-surgery/exec-d0-b4-may-canh-4-5-6.md +168 -0
- package/docs/plans/qc-surgery/exec-d0-b5-don-nhan-lech.md +196 -0
- package/docs/plans/qc-surgery/exec-d0-b6-contract-truoc-code.md +350 -0
- package/docs/plans/qc-surgery/exec-d1-b1-guard-br-tag.md +129 -0
- package/docs/plans/qc-surgery/exec-d1-b2-guard-sc-coverage.md +159 -0
- package/docs/plans/qc-surgery/exec-d1-b3-fail-3-bucket.md +158 -0
- package/docs/plans/qc-surgery/exec-d1-b4-self-review-principles.md +145 -0
- package/docs/plans/qc-surgery/exec-d1-b5-noi-quy-spec-la-du-lieu.md +156 -0
- package/docs/plans/qc-surgery/exec-d1-b6-gap-verify-mo-rong.md +179 -0
- package/docs/plans/qc-surgery/exec-d2-b1-tach-qc-review.md +166 -0
- package/docs/plans/qc-surgery/exec-d2-b2-tach-qc-run-test-atomic.md +267 -0
- package/docs/plans/qc-surgery/exec-d2-b3-qc-automation-assess.md +198 -0
- package/docs/plans/qc-surgery/exec-d3-b1-qc-report-gate-decision.md +209 -0
- package/docs/plans/qc-surgery/exec-d4-b1-qc-design-testdata.md +146 -0
- package/docs/plans/qc-surgery/exec-d4-b2-qc-smoke-test.md +179 -0
- package/docs/plans/qc-surgery/exec-d4-b3-qc-metrics-va-lint.md +198 -0
- package/docs/plans/qc-surgery/exec-d4-b4-lint-spec-injection.md +199 -0
- package/package.json +1 -1
package/core/commands/qc-plan.md
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
---
|
|
2
|
-
version: 1.0
|
|
3
|
-
updated: 2026-06-11
|
|
4
|
-
ported_from: ai-automation-qc-base
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# /qc-plan — QC Test Plan & Risk Analysis
|
|
8
|
-
|
|
9
|
-
> Stage 2 của QC automation pipeline native (qc-analyze → qc-plan → qc-design-test → qc-review → qc-run-test → qc-report). Port từ qa-planner của team QC.
|
|
10
|
-
|
|
11
|
-
## Gate
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-06-11
|
|
4
|
+
ported_from: ai-automation-qc-base
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# /qc-plan — QC Test Plan & Risk Analysis
|
|
8
|
+
|
|
9
|
+
> Stage 2 của QC automation pipeline native (qc-analyze → qc-plan → qc-design-test → qc-review → qc-run-test → qc-report). Port từ qa-planner của team QC.
|
|
10
|
+
|
|
11
|
+
## Gate
|
|
12
12
|
# Gate — Quy trình vào chuẩn cho mọi lệnh
|
|
13
13
|
|
|
14
14
|
Mọi lệnh PHẢI chạy gate này trước khi thực thi phần logic riêng của nó.
|
|
@@ -160,83 +160,96 @@ Mỗi dòng ⚠️/🔴 phải ứng với một trạng thái **context-loader
|
|
|
160
160
|
- "N" → dừng, hỏi người dùng muốn thay đổi gì.
|
|
161
161
|
- Có `--yes` và mức *chặn thường* → coi như "Y", **nhưng vẫn IN khối CHECKPOINT** nếu có cờ
|
|
162
162
|
🔴/⚠️ (không chặn ≠ không báo — người đọc log sau này vẫn cần thấy).
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
*Lưu ý: Với lệnh này, target ở Bước 1 là một **TICKET-ID** (mã PRD) — hoặc UC-ID / file feature, cả hai quy về TICKET-ID ở §Phạm vi QC. Đọc output của qc-analyze (`REQUIREMENT_ANALYSIS.md` + `DOC_GAP.md`) từ `{qc_artifact_dir}` và file `.feature` của đúng nền đó.*
|
|
166
|
-
|
|
167
|
-
## Context
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
*Lưu ý: Với lệnh này, target ở Bước 1 là một **TICKET-ID** (mã PRD) — hoặc UC-ID / file feature, cả hai quy về TICKET-ID ở §Phạm vi QC. Đọc output của qc-analyze (`REQUIREMENT_ANALYSIS.md` + `DOC_GAP.md`) từ `{qc_artifact_dir}` và file `.feature` của đúng nền đó.*
|
|
166
|
+
|
|
167
|
+
## Context
|
|
168
168
|
**BẮT BUỘC — đọc `.agent/steps/context-loader.md` và thực thi TOÀN BỘ quy trình trong đó**,
|
|
169
169
|
rồi mới tiếp tục phần bên dưới.
|
|
170
170
|
|
|
171
171
|
Bỏ qua bước này thì `{paths.*}`, `{tech_stack.*}`, `{conventions.*}`, guardrail từ
|
|
172
172
|
`project-lessons`, và routing service (chế độ umbrella) đều **chưa được phân giải** — mọi
|
|
173
|
-
placeholder bên dưới sẽ rỗng và lệnh sẽ đọc/ghi sai chỗ.
|
|
174
|
-
|
|
175
|
-
---
|
|
176
|
-
|
|
177
|
-
## Phạm vi QC
|
|
178
|
-
|
|
173
|
+
placeholder bên dưới sẽ rỗng và lệnh sẽ đọc/ghi sai chỗ.
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## Phạm vi QC
|
|
178
|
+
|
|
179
179
|
**BẮT BUỘC — đọc `.agent/steps/qc-scope.md` và thực thi TOÀN BỘ quy trình trong đó**,
|
|
180
180
|
rồi mới tiếp tục phần bên dưới.
|
|
181
181
|
|
|
182
182
|
Nó chốt bốn thứ mà mọi trạm QC đều cần: `TICKET-ID` · `active_platform` ·
|
|
183
183
|
`qc_artifact_dir` · `uc_list` (kèm trạng thái BDD từng UC, và cờ `--include-draft`).
|
|
184
184
|
Bỏ qua thì artifact QC ghi vào **sai thư mục** và `qc_status` ghi vào **sai sổ trace** —
|
|
185
|
-
cả hai đều xảy ra trong im lặng, không có bước nào phía sau bắt được.
|
|
186
|
-
|
|
187
|
-
> **Trạm này chạy CẢ PRD, đúng như trạm 1** *(B11)* — một `TEST_PLAN.md` cho mỗi (PRD × nền).
|
|
188
|
-
> `qa-planner/test-plan.md` vốn viết *"Test Plan cho một **feature**"* và template của nó là
|
|
189
|
-
> `# Test Plan – <Feature>` với metadata `Feature / Project / Module`: đây là quay về đúng
|
|
190
|
-
> tầng mà skill gốc được viết cho.
|
|
191
|
-
>
|
|
192
|
-
> `uc_list` ở đây **phải khớp** bảng *Phạm vi phân tích* trong `DOC_GAP.md`. Lệch nhau nghĩa là
|
|
193
|
-
> BDD đã đổi trạng thái sau lần chạy trạm 1 → nêu ra và khuyên chạy lại `/qc-analyze`, đừng
|
|
194
|
-
> âm thầm lập plan cho một tập UC khác với tập đã phân tích.
|
|
195
|
-
|
|
196
|
-
---
|
|
197
|
-
|
|
198
|
-
## Role
|
|
199
|
-
|
|
200
|
-
Bạn là **QC Planner** — stage 2. Từ output của qc-analyze, tạo TEST PLAN:
|
|
201
|
-
phân tích rủi ro, scenario what-if, scope/strategy test theo từng layer, và `questions-for-dev`
|
|
202
|
-
cho mọi gap open/blocker. Bạn trả lời *"rủi ro ở đâu, phải hỏi gì?"* — bạn không
|
|
203
|
-
thiết kế test case cụ thể (đó là qc-design-test).
|
|
204
|
-
|
|
205
|
-
## Skills (`{paths.qc_skills_dir}/qa-planner/`)
|
|
206
|
-
|
|
207
|
-
- `test-plan.md` — khung plan: scope theo từng test layer (functional / integration /
|
|
208
|
-
e2e / non-functional), what-if, entry/exit criteria, và danh sách questions-for-dev
|
|
209
|
-
suy ra từ `DOC_GAP.md`.
|
|
210
|
-
- `risk-model.md` — **cách tính** mức rủi ro: 7 nguồn rủi ro · khả năng × thiệt hại → P0–P3 ·
|
|
211
|
-
và dùng mức đó chia **độ sâu** test. `test-plan.md` có khung bảng `§6`; file này là cách điền.
|
|
212
|
-
Nạp cùng lúc, không phải thay thế.
|
|
213
|
-
|
|
214
|
-
## Output
|
|
215
|
-
|
|
216
|
-
Ghi **đúng MỘT** test plan cho cả PRD vào `{qc_artifact_dir}TEST_PLAN.md`
|
|
217
|
-
(= `{paths.qc_dir}/{TICKET-ID}/{active_platform}/TEST_PLAN.md`). Giới hạn plan trong các
|
|
218
|
-
scenario của **các UC trong phạm vi** (`{UC-ID}-SC{N}` từ `.feature` của nền này) để
|
|
219
|
-
qc-design-test thiết kế case theo từng scenario.
|
|
220
|
-
|
|
221
|
-
Bắt buộc:
|
|
222
|
-
- **Bảng `§3 Test items` có cột `UC`** — một plan giờ phủ nhiều UC, không có cột đó thì không
|
|
223
|
-
ai biết vùng test nào thuộc UC nào.
|
|
224
|
-
- **`§2 Phạm vi`** liệt kê rõ UC `⏸ Chưa xét` ở phần *Out of scope*, kèm lý do (BDD chưa
|
|
225
|
-
approved). *Không có dòng này thì một UC bị bỏ trông giống một UC không có gì để test.*
|
|
226
|
-
- **`§5 Entry criteria` chặn theo từng UC**, không chặn cả PRD: gap 🔴 Blocker ở UC3 không
|
|
227
|
-
dừng việc thiết kế test cho UC1. Ghi `Ready` / `Blocked` cho **mỗi** UC.
|
|
228
|
-
|
|
229
|
-
## Report
|
|
230
|
-
|
|
185
|
+
cả hai đều xảy ra trong im lặng, không có bước nào phía sau bắt được.
|
|
186
|
+
|
|
187
|
+
> **Trạm này chạy CẢ PRD, đúng như trạm 1** *(B11)* — một `TEST_PLAN.md` cho mỗi (PRD × nền).
|
|
188
|
+
> `qa-planner/test-plan.md` vốn viết *"Test Plan cho một **feature**"* và template của nó là
|
|
189
|
+
> `# Test Plan – <Feature>` với metadata `Feature / Project / Module`: đây là quay về đúng
|
|
190
|
+
> tầng mà skill gốc được viết cho.
|
|
191
|
+
>
|
|
192
|
+
> `uc_list` ở đây **phải khớp** bảng *Phạm vi phân tích* trong `DOC_GAP.md`. Lệch nhau nghĩa là
|
|
193
|
+
> BDD đã đổi trạng thái sau lần chạy trạm 1 → nêu ra và khuyên chạy lại `/qc-analyze`, đừng
|
|
194
|
+
> âm thầm lập plan cho một tập UC khác với tập đã phân tích.
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## Role
|
|
199
|
+
|
|
200
|
+
Bạn là **QC Planner** — stage 2. Từ output của qc-analyze, tạo TEST PLAN:
|
|
201
|
+
phân tích rủi ro, scenario what-if, scope/strategy test theo từng layer, và `questions-for-dev`
|
|
202
|
+
cho mọi gap open/blocker. Bạn trả lời *"rủi ro ở đâu, phải hỏi gì?"* — bạn không
|
|
203
|
+
thiết kế test case cụ thể (đó là qc-design-test).
|
|
204
|
+
|
|
205
|
+
## Skills (`{paths.qc_skills_dir}/qa-planner/`)
|
|
206
|
+
|
|
207
|
+
- `test-plan.md` — khung plan: scope theo từng test layer (functional / integration /
|
|
208
|
+
e2e / non-functional), what-if, entry/exit criteria, và danh sách questions-for-dev
|
|
209
|
+
suy ra từ `DOC_GAP.md`.
|
|
210
|
+
- `risk-model.md` — **cách tính** mức rủi ro: 7 nguồn rủi ro · khả năng × thiệt hại → P0–P3 ·
|
|
211
|
+
và dùng mức đó chia **độ sâu** test. `test-plan.md` có khung bảng `§6`; file này là cách điền.
|
|
212
|
+
Nạp cùng lúc, không phải thay thế.
|
|
213
|
+
|
|
214
|
+
## Output
|
|
215
|
+
|
|
216
|
+
Ghi **đúng MỘT** test plan cho cả PRD vào `{qc_artifact_dir}TEST_PLAN.md`
|
|
217
|
+
(= `{paths.qc_dir}/{TICKET-ID}/{active_platform}/TEST_PLAN.md`). Giới hạn plan trong các
|
|
218
|
+
scenario của **các UC trong phạm vi** (`{UC-ID}-SC{N}` từ `.feature` của nền này) để
|
|
219
|
+
qc-design-test thiết kế case theo từng scenario.
|
|
220
|
+
|
|
221
|
+
Bắt buộc:
|
|
222
|
+
- **Bảng `§3 Test items` có cột `UC`** — một plan giờ phủ nhiều UC, không có cột đó thì không
|
|
223
|
+
ai biết vùng test nào thuộc UC nào.
|
|
224
|
+
- **`§2 Phạm vi`** liệt kê rõ UC `⏸ Chưa xét` ở phần *Out of scope*, kèm lý do (BDD chưa
|
|
225
|
+
approved). *Không có dòng này thì một UC bị bỏ trông giống một UC không có gì để test.*
|
|
226
|
+
- **`§5 Entry criteria` chặn theo từng UC**, không chặn cả PRD: gap 🔴 Blocker ở UC3 không
|
|
227
|
+
dừng việc thiết kế test cho UC1. Ghi `Ready` / `Blocked` cho **mỗi** UC.
|
|
228
|
+
|
|
229
|
+
## Self-Review *(trước khi in Report)*
|
|
230
|
+
|
|
231
|
+
Theo 3 nhóm ở `{paths.qc_skills_dir}/_shared/self-review-principles.md` — **không chép lại ở đây**.
|
|
232
|
+
|
|
233
|
+
- **Bịa:** mỗi dòng rủi ro neo được vào một `BR`/`AC`/`GAP` **có thật** trong
|
|
234
|
+
`REQUIREMENT_ANALYSIS.md`/`DOC_GAP.md` — không phải rủi ro chung chung tự nghĩ ra kiểu *"hiệu
|
|
235
|
+
năng có thể chậm"*? Mỗi `questions-for-dev` suy ra từ một gap cụ thể?
|
|
236
|
+
- **Nhảy bước:** đã đọc **cả hai** file đầu vào (`REQUIREMENT_ANALYSIS.md` + `DOC_GAP.md`) và lọc
|
|
237
|
+
theo cột `UC` — không chỉ đọc file thứ nhất?
|
|
238
|
+
- **Số liệu:** `{risks}`/`{questions}` in ở report = đúng số dòng thật trong `TEST_PLAN.md` vừa
|
|
239
|
+
ghi, không phải đếm nhẩm?
|
|
240
|
+
|
|
241
|
+
## Report
|
|
242
|
+
|
|
231
243
|
**Đọc `.agent/steps/report-footer.md`** và áp đúng khuôn footer trong đó (Status Badge ·
|
|
232
|
-
Output Artifacts · Next) cho report cuối, kèm khối bên dưới.
|
|
233
|
-
|
|
234
|
-
```
|
|
235
|
-
/qc-plan Hoàn tất — {TICKET-ID} ({active_platform})
|
|
236
|
-
Phạm vi: {n} UC trong plan{nếu có: " · ⏸ {m} chưa xét"}
|
|
237
|
-
Plan: {risks} rủi ro · {questions} câu hỏi mở cho dev · layers: {list}
|
|
238
|
-
File: {paths.qc_dir}/{TICKET-ID}/{active_platform}/TEST_PLAN.md
|
|
239
|
-
Sẵn sàng: {danh sách UC Ready} | Chặn: {danh sách UC Blocked + GAP-ID chặn nó}
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
244
|
+
Output Artifacts · Next) cho report cuối, kèm khối bên dưới.
|
|
245
|
+
|
|
246
|
+
```
|
|
247
|
+
/qc-plan Hoàn tất — {TICKET-ID} ({active_platform})
|
|
248
|
+
Phạm vi: {n} UC trong plan{nếu có: " · ⏸ {m} chưa xét"}
|
|
249
|
+
Plan: {risks} rủi ro · {questions} câu hỏi mở cho dev · layers: {list}
|
|
250
|
+
File: {paths.qc_dir}/{TICKET-ID}/{active_platform}/TEST_PLAN.md
|
|
251
|
+
Sẵn sàng: {danh sách UC Ready} | Chặn: {danh sách UC Blocked + GAP-ID chặn nó}
|
|
252
|
+
Self-review: {✅ sạch | ⚠️ {n} điểm cần chú ý — liệt kê}
|
|
253
|
+
Next: /qc-design-test {UC-ID} ← thiết kế test case, chạy cho từng UC đã Ready
|
|
254
|
+
(gửi questions-for-dev cho PO/Dev cho các UC còn Blocked)
|
|
255
|
+
```
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
---
|
|
2
|
-
version: 1.0
|
|
3
|
-
updated: 2026-06-11
|
|
4
|
-
ported_from: ai-automation-qc-base
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# /qc-report — QC Test Report & Evidence
|
|
8
|
-
|
|
9
|
-
> Stage 6 (cuối) của QC automation pipeline native (qc-analyze → qc-plan → qc-design-test → qc-review → qc-run-test → qc-report). Port từ bước report của qa-runner team QC.
|
|
10
|
-
|
|
11
|
-
## Gate
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-06-11
|
|
4
|
+
ported_from: ai-automation-qc-base
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# /qc-report — QC Test Report & Evidence
|
|
8
|
+
|
|
9
|
+
> Stage 6 (cuối) của QC automation pipeline native (qc-analyze → qc-plan → qc-design-test → qc-review → qc-run-test → qc-report). Port từ bước report của qa-runner team QC.
|
|
10
|
+
|
|
11
|
+
## Gate
|
|
12
12
|
# Gate — Quy trình vào chuẩn cho mọi lệnh
|
|
13
13
|
|
|
14
14
|
Mọi lệnh PHẢI chạy gate này trước khi thực thi phần logic riêng của nó.
|
|
@@ -160,58 +160,74 @@ Mỗi dòng ⚠️/🔴 phải ứng với một trạng thái **context-loader
|
|
|
160
160
|
- "N" → dừng, hỏi người dùng muốn thay đổi gì.
|
|
161
161
|
- Có `--yes` và mức *chặn thường* → coi như "Y", **nhưng vẫn IN khối CHECKPOINT** nếu có cờ
|
|
162
162
|
🔴/⚠️ (không chặn ≠ không báo — người đọc log sau này vẫn cần thấy).
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
*Lưu ý: Với lệnh này, target ở Bước 1 là một UC-ID. Sinh report từ lần chạy `/qc-run-test` gần nhất. Dùng module **qc-playwright** (pytest-html + Playwright Trace — không Allure, không dashboard viết tay).*
|
|
166
|
-
|
|
167
|
-
## Context
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
*Lưu ý: Với lệnh này, target ở Bước 1 là một UC-ID. Sinh report từ lần chạy `/qc-run-test` gần nhất. Dùng module **qc-playwright** (pytest-html + Playwright Trace — không Allure, không dashboard viết tay).*
|
|
166
|
+
|
|
167
|
+
## Context
|
|
168
168
|
**BẮT BUỘC — đọc `.agent/steps/context-loader.md` và thực thi TOÀN BỘ quy trình trong đó**,
|
|
169
169
|
rồi mới tiếp tục phần bên dưới.
|
|
170
170
|
|
|
171
171
|
Bỏ qua bước này thì `{paths.*}`, `{tech_stack.*}`, `{conventions.*}`, guardrail từ
|
|
172
172
|
`project-lessons`, và routing service (chế độ umbrella) đều **chưa được phân giải** — mọi
|
|
173
|
-
placeholder bên dưới sẽ rỗng và lệnh sẽ đọc/ghi sai chỗ.
|
|
174
|
-
|
|
175
|
-
---
|
|
176
|
-
|
|
177
|
-
## Role
|
|
178
|
-
|
|
179
|
-
Bạn là stage **QC Report** — biến lần chạy gần nhất thành report + evidence chia sẻ được.
|
|
180
|
-
|
|
181
|
-
## Skill (`{paths.qc_skills_dir}/qa-runner/report/`)
|
|
182
|
-
|
|
183
|
-
- `report.md` — tự đủ: pytest-html (`--html=reports/<feature>/report.html
|
|
184
|
-
--self-contained-html`) + Playwright Trace (`test-results/<nodeid>/trace.zip`, xem qua
|
|
185
|
-
`python3 -m playwright show-trace <file>`), kèm screenshot/evidence đính trên FAIL/SKIP.
|
|
186
|
-
|
|
187
|
-
## Procedure
|
|
188
|
-
|
|
189
|
-
1. Định vị artifact của lần chạy gần nhất cho `{UC-ID}` (report pytest-html + trace).
|
|
190
|
-
2. Sinh/làm mới `reports/<feature>/report.html` (self-contained) và đảm bảo mỗi
|
|
191
|
-
FAIL/SKIP có trace + screenshot đính kèm.
|
|
192
|
-
3. Tóm tắt TOTAL / PASS / FAIL / SKIP; với mỗi FAIL gồm lệnh `show-trace` và
|
|
193
|
-
phân loại là script-bug hay product-gap.
|
|
194
|
-
4. **Bàn giao product-gap về spec (có nhắc).** Với mỗi FAIL phân loại **product-gap**
|
|
195
|
-
(defect thật, impl ≠ spec — không phải script-bug), in một
|
|
196
|
-
`/report-bug {UC-ID} {one-line expected-vs-actual}` sẵn-chạy để QC file nó vào spec repo dùng chung.
|
|
197
|
-
BUG_FLOW của `/report-bug` rồi định tuyến root cause (Code / BDD / PRD / Design / Env). Không bao giờ
|
|
198
|
-
fake-pass một product-gap — nó giữ FAIL trong `qc_status` cho tới khi fix + chạy lại. **script-bug
|
|
199
|
-
KHÔNG được file** (QC fix script và chạy lại). Liệt kê các lệnh; đừng tự tạo report.
|
|
200
|
-
|
|
201
|
-
## Report
|
|
202
|
-
|
|
173
|
+
placeholder bên dưới sẽ rỗng và lệnh sẽ đọc/ghi sai chỗ.
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## Role
|
|
178
|
+
|
|
179
|
+
Bạn là stage **QC Report** — biến lần chạy gần nhất thành report + evidence chia sẻ được.
|
|
180
|
+
|
|
181
|
+
## Skill (`{paths.qc_skills_dir}/qa-runner/report/`)
|
|
182
|
+
|
|
183
|
+
- `report.md` — tự đủ: pytest-html (`--html=reports/<feature>/report.html
|
|
184
|
+
--self-contained-html`) + Playwright Trace (`test-results/<nodeid>/trace.zip`, xem qua
|
|
185
|
+
`python3 -m playwright show-trace <file>`), kèm screenshot/evidence đính trên FAIL/SKIP.
|
|
186
|
+
|
|
187
|
+
## Procedure
|
|
188
|
+
|
|
189
|
+
1. Định vị artifact của lần chạy gần nhất cho `{UC-ID}` (report pytest-html + trace).
|
|
190
|
+
2. Sinh/làm mới `reports/<feature>/report.html` (self-contained) và đảm bảo mỗi
|
|
191
|
+
FAIL/SKIP có trace + screenshot đính kèm.
|
|
192
|
+
3. Tóm tắt TOTAL / PASS / FAIL / SKIP; với mỗi FAIL gồm lệnh `show-trace` và
|
|
193
|
+
phân loại là script-bug hay product-gap.
|
|
194
|
+
4. **Bàn giao product-gap về spec (có nhắc).** Với mỗi FAIL phân loại **product-gap**
|
|
195
|
+
(defect thật, impl ≠ spec — không phải script-bug), in một
|
|
196
|
+
`/report-bug {UC-ID} {one-line expected-vs-actual}` sẵn-chạy để QC file nó vào spec repo dùng chung.
|
|
197
|
+
BUG_FLOW của `/report-bug` rồi định tuyến root cause (Code / BDD / PRD / Design / Env). Không bao giờ
|
|
198
|
+
fake-pass một product-gap — nó giữ FAIL trong `qc_status` cho tới khi fix + chạy lại. **script-bug
|
|
199
|
+
KHÔNG được file** (QC fix script và chạy lại). Liệt kê các lệnh; đừng tự tạo report.
|
|
200
|
+
|
|
201
|
+
## Self-Review *(trước khi in Report)*
|
|
202
|
+
|
|
203
|
+
Theo 3 nhóm ở `{paths.qc_skills_dir}/_shared/self-review-principles.md` — **không chép lại ở đây**.
|
|
204
|
+
|
|
205
|
+
- **Bịa:** mọi con số trong báo cáo trích được về **một dòng cụ thể** của sổ trace / output
|
|
206
|
+
runner / bug report — không nội suy khi thiếu mẫu?
|
|
207
|
+
- **Nhảy bước:** đã tổng hợp trên **toàn bộ** SC trong phạm vi, không chỉ những SC có kết quả
|
|
208
|
+
đẹp? Đã liệt kê cả SC `not_run` và `flaky`, không im lặng bỏ khỏi bảng?
|
|
209
|
+
- **Số liệu:** mọi `%` là phép chia thật **và nói rõ mẫu số**? Chỗ thiếu dữ liệu ghi **"chưa đủ
|
|
210
|
+
dữ liệu"** thay vì điền một số cho đủ bảng?
|
|
211
|
+
|
|
212
|
+
> **Trạm này là nơi số liệu đi ra khỏi đội QC.** Một con số sai ở các trạm trước còn người trong
|
|
213
|
+
> đội nhìn thấy; sai ở đây là đi vào báo cáo cho Lead/PM. Nhóm 3 vì vậy là nhóm nặng nhất ở đây:
|
|
214
|
+
> *"một bảng đầy số sai tệ hơn một bảng có ô trống ghi rõ lý do"*.
|
|
215
|
+
|
|
216
|
+
## Report
|
|
217
|
+
|
|
203
218
|
**Đọc `.agent/steps/report-footer.md`** và áp đúng khuôn footer trong đó (Status Badge ·
|
|
204
|
-
Output Artifacts · Next) cho report cuối, kèm khối bên dưới.
|
|
205
|
-
|
|
206
|
-
```
|
|
207
|
-
/qc-report Hoàn tất — {UC-ID}
|
|
208
|
-
Report: reports/<feature>/report.html (TOTAL {N} · PASS {p} · FAIL {f} · SKIP {s})
|
|
209
|
-
Trace : test-results/<nodeid>/trace.zip (python3 -m playwright show-trace <file>)
|
|
210
|
-
|
|
211
|
-
Product-gap cần file ({g}): ← chạy các lệnh này để PO/Dev thấy trên /sync (script-bug bị loại)
|
|
212
|
-
/report-bug {UC-ID} {gap 1 — expected vs actual}
|
|
213
|
-
/report-bug {UC-ID} {gap 2 …}
|
|
214
|
-
(không có → skip)
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
219
|
+
Output Artifacts · Next) cho report cuối, kèm khối bên dưới.
|
|
220
|
+
|
|
221
|
+
```
|
|
222
|
+
/qc-report Hoàn tất — {UC-ID}
|
|
223
|
+
Report: reports/<feature>/report.html (TOTAL {N} · PASS {p} · FAIL {f} · SKIP {s})
|
|
224
|
+
Trace : test-results/<nodeid>/trace.zip (python3 -m playwright show-trace <file>)
|
|
225
|
+
|
|
226
|
+
Product-gap cần file ({g}): ← chạy các lệnh này để PO/Dev thấy trên /sync (script-bug bị loại)
|
|
227
|
+
/report-bug {UC-ID} {gap 1 — expected vs actual}
|
|
228
|
+
/report-bug {UC-ID} {gap 2 …}
|
|
229
|
+
(không có → skip)
|
|
230
|
+
|
|
231
|
+
Self-review: {✅ sạch | ⚠️ {n} điểm cần chú ý — liệt kê}
|
|
232
|
+
Next: /validate-traces {UC-ID} ← làm mới Living Docs (qc_status), rồi tạo PR
|
|
233
|
+
```
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
---
|
|
2
|
-
version: 1.0
|
|
3
|
-
updated: 2026-06-11
|
|
4
|
-
ported_from: ai-automation-qc-base
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# /qc-review — QC Review Gate (test case & script)
|
|
8
|
-
|
|
9
|
-
> Stage 4 của QC automation pipeline native (qc-analyze → qc-plan → qc-design-test → qc-review → qc-run-test → qc-report). Port từ qa-reviewer của team QC. Một gate hai chiều: review test case (sau qc-design-test) VÀ script (sau qc-run-test).
|
|
10
|
-
|
|
11
|
-
## Gate
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-06-11
|
|
4
|
+
ported_from: ai-automation-qc-base
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# /qc-review — QC Review Gate (test case & script)
|
|
8
|
+
|
|
9
|
+
> Stage 4 của QC automation pipeline native (qc-analyze → qc-plan → qc-design-test → qc-review → qc-run-test → qc-report). Port từ qa-reviewer của team QC. Một gate hai chiều: review test case (sau qc-design-test) VÀ script (sau qc-run-test).
|
|
10
|
+
|
|
11
|
+
## Gate
|
|
12
12
|
# Gate — Quy trình vào chuẩn cho mọi lệnh
|
|
13
13
|
|
|
14
14
|
Mọi lệnh PHẢI chạy gate này trước khi thực thi phần logic riêng của nó.
|
|
@@ -160,118 +160,134 @@ Mỗi dòng ⚠️/🔴 phải ứng với một trạng thái **context-loader
|
|
|
160
160
|
- "N" → dừng, hỏi người dùng muốn thay đổi gì.
|
|
161
161
|
- Có `--yes` và mức *chặn thường* → coi như "Y", **nhưng vẫn IN khối CHECKPOINT** nếu có cờ
|
|
162
162
|
🔴/⚠️ (không chặn ≠ không báo — người đọc log sau này vẫn cần thấy).
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
*Lưu ý: Với lệnh này, target ở Bước 1 là một UC-ID (`active_platform` + `qc_artifact_dir` do §Phạm vi QC phân giải). Phát hiện review mode từ `$ARGUMENTS`/context: review test-case `.Test.md` (sau design) hoặc review Python script (sau run). Đọc artifact từ `{qc_artifact_dir}` và source test/page-object đã sinh.*
|
|
166
|
-
|
|
167
|
-
## Context
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
*Lưu ý: Với lệnh này, target ở Bước 1 là một UC-ID (`active_platform` + `qc_artifact_dir` do §Phạm vi QC phân giải). Phát hiện review mode từ `$ARGUMENTS`/context: review test-case `.Test.md` (sau design) hoặc review Python script (sau run). Đọc artifact từ `{qc_artifact_dir}` và source test/page-object đã sinh.*
|
|
166
|
+
|
|
167
|
+
## Context
|
|
168
168
|
**BẮT BUỘC — đọc `.agent/steps/context-loader.md` và thực thi TOÀN BỘ quy trình trong đó**,
|
|
169
169
|
rồi mới tiếp tục phần bên dưới.
|
|
170
170
|
|
|
171
171
|
Bỏ qua bước này thì `{paths.*}`, `{tech_stack.*}`, `{conventions.*}`, guardrail từ
|
|
172
172
|
`project-lessons`, và routing service (chế độ umbrella) đều **chưa được phân giải** — mọi
|
|
173
|
-
placeholder bên dưới sẽ rỗng và lệnh sẽ đọc/ghi sai chỗ.
|
|
174
|
-
|
|
175
|
-
## Phạm vi QC
|
|
176
|
-
|
|
173
|
+
placeholder bên dưới sẽ rỗng và lệnh sẽ đọc/ghi sai chỗ.
|
|
174
|
+
|
|
175
|
+
## Phạm vi QC
|
|
176
|
+
|
|
177
177
|
**BẮT BUỘC — đọc `.agent/steps/qc-scope.md` và thực thi TOÀN BỘ quy trình trong đó**,
|
|
178
178
|
rồi mới tiếp tục phần bên dưới.
|
|
179
179
|
|
|
180
180
|
Nó chốt bốn thứ mà mọi trạm QC đều cần: `TICKET-ID` · `active_platform` ·
|
|
181
181
|
`qc_artifact_dir` · `uc_list` (kèm trạng thái BDD từng UC, và cờ `--include-draft`).
|
|
182
182
|
Bỏ qua thì artifact QC ghi vào **sai thư mục** và `qc_status` ghi vào **sai sổ trace** —
|
|
183
|
-
cả hai đều xảy ra trong im lặng, không có bước nào phía sau bắt được.
|
|
184
|
-
|
|
185
|
-
> **Trạm này vẫn gọi theo TỪNG UC** *(B11)* — thiết kế và chạy test **thật sự** làm tăng dần
|
|
186
|
-
> theo UC, nên giữ khả năng làm UC1 khi UC3 chưa xong là đúng. Chỉ **chỗ đọc/ghi** đổi: mọi
|
|
187
|
-
> artifact nằm chung ở `{qc_artifact_dir}` cấp PRD, không còn một thư mục mỗi UC.
|
|
188
|
-
>
|
|
189
|
-
> Nên `DOC_GAP.md` / `TEST_PLAN.md` đọc được ở đây phủ **cả PRD**: **lọc theo cột `UC`** để lấy
|
|
190
|
-
> phần của UC đang làm. Đừng coi toàn bộ bảng gap là của UC này — sẽ chặn oan.
|
|
191
|
-
|
|
192
|
-
---
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
---
|
|
196
|
-
|
|
197
|
-
## Role
|
|
198
|
-
|
|
199
|
-
Bạn là **QC Reviewer** — gate review dùng chung, chạy hai lần trong pipeline:
|
|
200
|
-
1. **Sau qc-design-test** → review test-case `.Test.md` (coverage, độ rõ ràng, trace).
|
|
201
|
-
2. **Sau qc-run-test** → review Python script / Page Object đã sinh.
|
|
202
|
-
|
|
203
|
-
Phát hiện mode: nếu artifact target là `.Test.md` → review test-case; nếu file Python test/PO
|
|
204
|
-
tồn tại cho UC và mới hơn → review script. Nếu mơ hồ, hỏi.
|
|
205
|
-
|
|
206
|
-
## Skills (`{paths.qc_skills_dir}/qa-reviewer/`)
|
|
207
|
-
|
|
208
|
-
**Nạp trước — nhưng đúng vai:**
|
|
209
|
-
|
|
210
|
-
| File | Vai nào | Cho gì |
|
|
211
|
-
|---|---|---|
|
|
212
|
-
| `shared/read-doc-gap-inputs.md` | **cả hai** | Nạp **đủ** mọi tài liệu nguồn theo bảng *Tài liệu đầu vào đã đọc* của `DOC_GAP.md` — soát mù thì kết luận "0 lỗi" là vô nghĩa |
|
|
213
|
-
| `shared/review-file-template.md` | **cả hai** | Khuôn file kết quả · thang điểm `XX/100` · luật ghi file · nguyên tắc *mặc định hoài nghi* |
|
|
214
|
-
| ↳ §*Kiểm tra cấu trúc TC* của file đó | **chỉ vai 1** | Tầng kiểm các luật của trạm 3: ATOMIC 1-bullet · không ký tự `\|` · cụm từ mơ hồ · teardown đúng chỗ · marker ≠ oracle |
|
|
215
|
-
| `shared/review-check-groups.md` | **chỉ vai 1** | **7 nhóm kiểm tra** chạy tuần tự · registry 46 nhãn lỗi · **7 mẫu-hay-thiếu** của Nhóm 6 · nền tảng ISTQB · anti-pattern |
|
|
216
|
-
|
|
217
|
-
> ⚠️ **Vai 2 (soát code) KHÔNG nạp 7 nhóm kiểm tra.** Chúng kiểm **cấu trúc file test case** —
|
|
218
|
-
> áp vào file Python là bảo reviewer đi tìm `#### Expected Result` trong một Page Object, rồi
|
|
219
|
-
> gắn nhãn lỗi cho thứ đáng lẽ không có ở đó. Vai 2 dùng bộ tiêu chí riêng ở `script/*.md`.
|
|
220
|
-
|
|
221
|
-
**Rồi chọn theo vai + tầng, nạp MỘT file:**
|
|
222
|
-
- Soát test-case: `test-case/{functional,e2e,integration,non-functional,exploratory}.md`
|
|
223
|
-
- Soát script: `script/{functional,e2e,integration,non-functional,exploratory}.md`
|
|
224
|
-
|
|
225
|
-
## Review focus
|
|
226
|
-
|
|
227
|
-
- **Test-case:** mọi `{UC-ID}-SC{N}` đã phủ? happy + negative + boundary? expected cụ thể? trace (`BR-xx` + `@trace.verifies` SC) có mặt? không có TC orphan?
|
|
228
|
-
- **Script:** khớp `.Test.md` 1-1? Page Object 3 lớp + BasePage gọn? `expect()` không phải bare assert? không hard-code URL/cred/timeout, không `time.sleep`, không Allure? selector theo priority (data-testid→role→…)? 100% TC đã script (không còn Draft)?
|
|
229
|
-
|
|
230
|
-
Sinh findings (mức độ + vị trí + cách sửa), chấm điểm, ra verdict.
|
|
231
|
-
|
|
232
|
-
**KHÔNG tự sửa** file TC hay code. Chỉ nhận xét và chấm điểm — người sửa là `/qc-design-test`
|
|
233
|
-
(vai 1) hoặc `/qc-run-test` (vai 2). *Reviewer tự sửa rồi tự duyệt là bỏ mất cái cổng.*
|
|
234
|
-
|
|
235
|
-
## Output
|
|
236
|
-
|
|
237
|
-
Ghi vào **`{qc_artifact_dir}test-cases/REVIEW_<FEATURE>.md`** — đứng **cạnh** file TC vừa soát:
|
|
238
|
-
|
|
239
|
-
```
|
|
240
|
-
{qc_artifact_dir}test-cases/
|
|
241
|
-
├── TC_<FEATURE>.Test.md
|
|
242
|
-
├── REVIEW_<FEATURE>.md ← soát file trên
|
|
243
|
-
├── TC_<FEATURE>_API.Test.md
|
|
244
|
-
└── REVIEW_<FEATURE>_API.md ← soát file trên
|
|
245
|
-
```
|
|
246
|
-
|
|
247
|
-
⚠️ **Tên file review KHÔNG có đuôi `.Test.md`.** Đuôi đó là của file test case; gắn vào file
|
|
248
|
-
review sẽ làm `/qc-run-test` nhặt nó lên như một file test case rồi cố sinh script từ một bảng điểm.
|
|
249
|
-
|
|
250
|
-
Khuôn đầy đủ + quy tắc ghi: `shared/review-file-template.md`. Ba điều bắt buộc:
|
|
251
|
-
|
|
252
|
-
- **Điểm `XX/100`** — trừ 5đ mỗi `FAIL`, 2đ mỗi `WARN`. Verdict **suy ra được**:
|
|
253
|
-
`≥80` VÀ không còn `FAIL` chặn → `APPROVED`; ngược lại `NEEDS_FIX`.
|
|
254
|
-
- **Bảng Tổng quan THÊM một hàng mỗi vòng**, không ghi đè — đó là cách duy nhất thấy được điểm
|
|
255
|
-
có tăng không. Các bảng chi tiết thì ghi đè phần của tầng mình.
|
|
256
|
-
- **Hai vai ghi vào CÙNG một file**, phân biệt bằng cột `Tầng`. Chúng cách nhau một trạm, nên
|
|
257
|
-
hàng của vai sau **không được ghi đè** hàng của vai trước.
|
|
258
|
-
|
|
259
|
-
> **Vì sao cổng này phải ghi ra file** *(B13)*. Trước đây lệnh chỉ nói *"sinh findings"* — không
|
|
260
|
-
> nói ghi đâu, dạng gì, và điểm là `A/B/C/D` **không có luật chấm**. Hệ quả: hai người soát ra
|
|
261
|
-
> hai kết quả, và **vòng 2 không so được với vòng 1** — tức không ai biết sửa xong có tốt lên
|
|
262
|
-
> không. Một cổng không để lại dấu vết đo được thì không phải cổng, nó là một lượt đọc.
|
|
263
|
-
|
|
264
|
-
## Report
|
|
265
|
-
|
|
183
|
+
cả hai đều xảy ra trong im lặng, không có bước nào phía sau bắt được.
|
|
184
|
+
|
|
185
|
+
> **Trạm này vẫn gọi theo TỪNG UC** *(B11)* — thiết kế và chạy test **thật sự** làm tăng dần
|
|
186
|
+
> theo UC, nên giữ khả năng làm UC1 khi UC3 chưa xong là đúng. Chỉ **chỗ đọc/ghi** đổi: mọi
|
|
187
|
+
> artifact nằm chung ở `{qc_artifact_dir}` cấp PRD, không còn một thư mục mỗi UC.
|
|
188
|
+
>
|
|
189
|
+
> Nên `DOC_GAP.md` / `TEST_PLAN.md` đọc được ở đây phủ **cả PRD**: **lọc theo cột `UC`** để lấy
|
|
190
|
+
> phần của UC đang làm. Đừng coi toàn bộ bảng gap là của UC này — sẽ chặn oan.
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## Role
|
|
198
|
+
|
|
199
|
+
Bạn là **QC Reviewer** — gate review dùng chung, chạy hai lần trong pipeline:
|
|
200
|
+
1. **Sau qc-design-test** → review test-case `.Test.md` (coverage, độ rõ ràng, trace).
|
|
201
|
+
2. **Sau qc-run-test** → review Python script / Page Object đã sinh.
|
|
202
|
+
|
|
203
|
+
Phát hiện mode: nếu artifact target là `.Test.md` → review test-case; nếu file Python test/PO
|
|
204
|
+
tồn tại cho UC và mới hơn → review script. Nếu mơ hồ, hỏi.
|
|
205
|
+
|
|
206
|
+
## Skills (`{paths.qc_skills_dir}/qa-reviewer/`)
|
|
207
|
+
|
|
208
|
+
**Nạp trước — nhưng đúng vai:**
|
|
209
|
+
|
|
210
|
+
| File | Vai nào | Cho gì |
|
|
211
|
+
|---|---|---|
|
|
212
|
+
| `shared/read-doc-gap-inputs.md` | **cả hai** | Nạp **đủ** mọi tài liệu nguồn theo bảng *Tài liệu đầu vào đã đọc* của `DOC_GAP.md` — soát mù thì kết luận "0 lỗi" là vô nghĩa |
|
|
213
|
+
| `shared/review-file-template.md` | **cả hai** | Khuôn file kết quả · thang điểm `XX/100` · luật ghi file · nguyên tắc *mặc định hoài nghi* |
|
|
214
|
+
| ↳ §*Kiểm tra cấu trúc TC* của file đó | **chỉ vai 1** | Tầng kiểm các luật của trạm 3: ATOMIC 1-bullet · không ký tự `\|` · cụm từ mơ hồ · teardown đúng chỗ · marker ≠ oracle |
|
|
215
|
+
| `shared/review-check-groups.md` | **chỉ vai 1** | **7 nhóm kiểm tra** chạy tuần tự · registry 46 nhãn lỗi · **7 mẫu-hay-thiếu** của Nhóm 6 · nền tảng ISTQB · anti-pattern |
|
|
216
|
+
|
|
217
|
+
> ⚠️ **Vai 2 (soát code) KHÔNG nạp 7 nhóm kiểm tra.** Chúng kiểm **cấu trúc file test case** —
|
|
218
|
+
> áp vào file Python là bảo reviewer đi tìm `#### Expected Result` trong một Page Object, rồi
|
|
219
|
+
> gắn nhãn lỗi cho thứ đáng lẽ không có ở đó. Vai 2 dùng bộ tiêu chí riêng ở `script/*.md`.
|
|
220
|
+
|
|
221
|
+
**Rồi chọn theo vai + tầng, nạp MỘT file:**
|
|
222
|
+
- Soát test-case: `test-case/{functional,e2e,integration,non-functional,exploratory}.md`
|
|
223
|
+
- Soát script: `script/{functional,e2e,integration,non-functional,exploratory}.md`
|
|
224
|
+
|
|
225
|
+
## Review focus
|
|
226
|
+
|
|
227
|
+
- **Test-case:** mọi `{UC-ID}-SC{N}` đã phủ? happy + negative + boundary? expected cụ thể? trace (`BR-xx` + `@trace.verifies` SC) có mặt? không có TC orphan?
|
|
228
|
+
- **Script:** khớp `.Test.md` 1-1? Page Object 3 lớp + BasePage gọn? `expect()` không phải bare assert? không hard-code URL/cred/timeout, không `time.sleep`, không Allure? selector theo priority (data-testid→role→…)? 100% TC đã script (không còn Draft)?
|
|
229
|
+
|
|
230
|
+
Sinh findings (mức độ + vị trí + cách sửa), chấm điểm, ra verdict.
|
|
231
|
+
|
|
232
|
+
**KHÔNG tự sửa** file TC hay code. Chỉ nhận xét và chấm điểm — người sửa là `/qc-design-test`
|
|
233
|
+
(vai 1) hoặc `/qc-run-test` (vai 2). *Reviewer tự sửa rồi tự duyệt là bỏ mất cái cổng.*
|
|
234
|
+
|
|
235
|
+
## Output
|
|
236
|
+
|
|
237
|
+
Ghi vào **`{qc_artifact_dir}test-cases/REVIEW_<FEATURE>.md`** — đứng **cạnh** file TC vừa soát:
|
|
238
|
+
|
|
239
|
+
```
|
|
240
|
+
{qc_artifact_dir}test-cases/
|
|
241
|
+
├── TC_<FEATURE>.Test.md
|
|
242
|
+
├── REVIEW_<FEATURE>.md ← soát file trên
|
|
243
|
+
├── TC_<FEATURE>_API.Test.md
|
|
244
|
+
└── REVIEW_<FEATURE>_API.md ← soát file trên
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
⚠️ **Tên file review KHÔNG có đuôi `.Test.md`.** Đuôi đó là của file test case; gắn vào file
|
|
248
|
+
review sẽ làm `/qc-run-test` nhặt nó lên như một file test case rồi cố sinh script từ một bảng điểm.
|
|
249
|
+
|
|
250
|
+
Khuôn đầy đủ + quy tắc ghi: `shared/review-file-template.md`. Ba điều bắt buộc:
|
|
251
|
+
|
|
252
|
+
- **Điểm `XX/100`** — trừ 5đ mỗi `FAIL`, 2đ mỗi `WARN`. Verdict **suy ra được**:
|
|
253
|
+
`≥80` VÀ không còn `FAIL` chặn → `APPROVED`; ngược lại `NEEDS_FIX`.
|
|
254
|
+
- **Bảng Tổng quan THÊM một hàng mỗi vòng**, không ghi đè — đó là cách duy nhất thấy được điểm
|
|
255
|
+
có tăng không. Các bảng chi tiết thì ghi đè phần của tầng mình.
|
|
256
|
+
- **Hai vai ghi vào CÙNG một file**, phân biệt bằng cột `Tầng`. Chúng cách nhau một trạm, nên
|
|
257
|
+
hàng của vai sau **không được ghi đè** hàng của vai trước.
|
|
258
|
+
|
|
259
|
+
> **Vì sao cổng này phải ghi ra file** *(B13)*. Trước đây lệnh chỉ nói *"sinh findings"* — không
|
|
260
|
+
> nói ghi đâu, dạng gì, và điểm là `A/B/C/D` **không có luật chấm**. Hệ quả: hai người soát ra
|
|
261
|
+
> hai kết quả, và **vòng 2 không so được với vòng 1** — tức không ai biết sửa xong có tốt lên
|
|
262
|
+
> không. Một cổng không để lại dấu vết đo được thì không phải cổng, nó là một lượt đọc.
|
|
263
|
+
|
|
264
|
+
## Self-Review *(trước khi in Report)*
|
|
265
|
+
|
|
266
|
+
Theo 3 nhóm ở `{paths.qc_skills_dir}/_shared/self-review-principles.md` — **không chép lại ở đây**.
|
|
267
|
+
|
|
268
|
+
- **Bịa:** mỗi finding trỏ được về **dòng cụ thể** trong artifact đang soát — không phải nhận xét
|
|
269
|
+
chung chung? Và **cấm dùng chính field `quote` của finding làm bằng chứng cho nó** — mở lại file
|
|
270
|
+
đọc lại đoạn đó.
|
|
271
|
+
- **Nhảy bước:** đã đi hết bộ tiêu chí của **đúng vai** (test-case hay script), không trộn hai
|
|
272
|
+
bộ? Verdict `APPROVED` phát ra **sau** khi soát đủ, không phải vì "trông ổn"?
|
|
273
|
+
- **Số liệu:** số finding theo mức (critical/major/minor) = đếm thật trên file findings vừa ghi?
|
|
274
|
+
|
|
275
|
+
> **Verdict của lệnh này là cổng cho trạm sau.** Một `APPROVED` phát ra sớm không chỉ sai ở đây —
|
|
276
|
+
> nó mở đường cho `/qc-run-test` sinh script từ một bộ TC chưa đạt. Đây là chỗ self-review đắt
|
|
277
|
+
> nhất nếu bỏ qua.
|
|
278
|
+
|
|
279
|
+
## Report
|
|
280
|
+
|
|
266
281
|
**Đọc `.agent/steps/report-footer.md`** và áp đúng khuôn footer trong đó (Status Badge ·
|
|
267
|
-
Output Artifacts · Next) cho report cuối, kèm khối bên dưới.
|
|
268
|
-
|
|
269
|
-
```
|
|
270
|
-
/qc-review Hoàn tất — {UC-ID} ({soát test-case | soát script}) vòng #{N}
|
|
271
|
-
Điểm : {XX}/100 ({fail} FAIL × −5đ · {warn} WARN × −2đ){nếu có vòng trước: " ← vòng #{N-1}: {YY}/100"}
|
|
272
|
-
Verdict: {APPROVED | NEEDS_FIX} — {n} findings ({crit} chặn)
|
|
273
|
-
File : {qc_artifact_dir}test-cases/REVIEW_<FEATURE>.md (thêm 1 hàng vào bảng Tổng quan)
|
|
274
|
-
|
|
275
|
-
Next (
|
|
276
|
-
|
|
277
|
-
|
|
282
|
+
Output Artifacts · Next) cho report cuối, kèm khối bên dưới.
|
|
283
|
+
|
|
284
|
+
```
|
|
285
|
+
/qc-review Hoàn tất — {UC-ID} ({soát test-case | soát script}) vòng #{N}
|
|
286
|
+
Điểm : {XX}/100 ({fail} FAIL × −5đ · {warn} WARN × −2đ){nếu có vòng trước: " ← vòng #{N-1}: {YY}/100"}
|
|
287
|
+
Verdict: {APPROVED | NEEDS_FIX} — {n} findings ({crit} chặn)
|
|
288
|
+
File : {qc_artifact_dir}test-cases/REVIEW_<FEATURE>.md (thêm 1 hàng vào bảng Tổng quan)
|
|
289
|
+
Self-review: {✅ sạch | ⚠️ {n} điểm cần chú ý — liệt kê}
|
|
290
|
+
Next (test-case APPROVED): /qc-run-test {UC-ID}
|
|
291
|
+
Next (script APPROVED) : /qc-report {UC-ID} rồi tạo PR
|
|
292
|
+
(NEEDS_FIX → fix artifact bị gắn cờ, rồi chạy lại /qc-review {UC-ID})
|
|
293
|
+
```
|