@anhth2/spec-driven-dev-plugin 0.9.2 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/commands/debug.md +50 -20
  2. package/commands/define-product.md +49 -19
  3. package/commands/{generate-tests.md → dev-gen-test.md} +85 -23
  4. package/commands/{generate-tests.tmpl → dev-gen-test.tmpl} +18 -4
  5. package/{core/commands/run-tests.md → commands/dev-run-test.md} +102 -21
  6. package/commands/{run-tests.tmpl → dev-run-test.tmpl} +35 -2
  7. package/commands/{smoke-test.md → dev-smoke-test.md} +54 -24
  8. package/commands/{smoke-test.tmpl → dev-smoke-test.tmpl} +5 -5
  9. package/commands/fix-bug.md +50 -20
  10. package/commands/generate-bdd.md +78 -21
  11. package/commands/generate-bdd.tmpl +11 -2
  12. package/commands/generate-code.md +123 -23
  13. package/commands/generate-code.tmpl +56 -4
  14. package/commands/generate-design-spec.md +142 -47
  15. package/commands/generate-design-spec.tmpl +93 -28
  16. package/commands/generate-prd.md +49 -19
  17. package/commands/generate-spec-manifest.md +49 -19
  18. package/commands/generate-tech-docs.md +50 -20
  19. package/commands/generate-tech-docs.tmpl +1 -1
  20. package/commands/learn.md +50 -20
  21. package/commands/propose-scenario.md +50 -20
  22. package/commands/propose-scenario.tmpl +1 -1
  23. package/commands/qc-analyze.md +514 -0
  24. package/commands/qc-analyze.tmpl +71 -0
  25. package/commands/qc-design-test.md +510 -0
  26. package/commands/qc-design-test.tmpl +67 -0
  27. package/commands/qc-plan.md +492 -0
  28. package/commands/qc-plan.tmpl +49 -0
  29. package/commands/qc-report.md +491 -0
  30. package/commands/qc-report.tmpl +48 -0
  31. package/commands/qc-review.md +496 -0
  32. package/commands/qc-review.tmpl +53 -0
  33. package/commands/qc-run-test.md +538 -0
  34. package/commands/qc-run-test.tmpl +77 -0
  35. package/commands/refine-prd.md +203 -24
  36. package/commands/refine-prd.tmpl +16 -5
  37. package/commands/report-bug.md +49 -19
  38. package/commands/review-code.md +51 -21
  39. package/commands/review-code.tmpl +1 -1
  40. package/commands/review-context.md +198 -20
  41. package/commands/review-context.tmpl +11 -1
  42. package/commands/review-tech-docs.md +49 -19
  43. package/commands/setup-ai-first.md +14 -7
  44. package/commands/sync.md +30 -20
  45. package/commands/sync.tmpl +16 -13
  46. package/commands/update-framework.md +14 -7
  47. package/commands/validate-traces.md +106 -45
  48. package/commands/validate-traces.tmpl +57 -26
  49. package/core/FRAMEWORK_VERSION +1 -1
  50. package/core/commands/debug.md +50 -20
  51. package/core/commands/define-product.md +49 -19
  52. package/core/commands/{generate-tests.md → dev-gen-test.md} +85 -23
  53. package/{commands/run-tests.md → core/commands/dev-run-test.md} +102 -21
  54. package/core/commands/{smoke-test.md → dev-smoke-test.md} +54 -24
  55. package/core/commands/fix-bug.md +50 -20
  56. package/core/commands/generate-bdd.md +78 -21
  57. package/core/commands/generate-code.md +123 -23
  58. package/core/commands/generate-design-spec.md +142 -47
  59. package/core/commands/generate-prd.md +49 -19
  60. package/core/commands/generate-spec-manifest.md +49 -19
  61. package/core/commands/generate-tech-docs.md +50 -20
  62. package/core/commands/learn.md +50 -20
  63. package/core/commands/propose-scenario.md +50 -20
  64. package/core/commands/qc-analyze.md +514 -0
  65. package/core/commands/qc-design-test.md +510 -0
  66. package/core/commands/qc-plan.md +492 -0
  67. package/core/commands/qc-report.md +491 -0
  68. package/core/commands/qc-review.md +496 -0
  69. package/core/commands/qc-run-test.md +538 -0
  70. package/core/commands/refine-prd.md +203 -24
  71. package/core/commands/report-bug.md +49 -19
  72. package/core/commands/review-code.md +51 -21
  73. package/core/commands/review-context.md +198 -20
  74. package/core/commands/review-tech-docs.md +49 -19
  75. package/core/commands/setup-ai-first.md +14 -7
  76. package/core/commands/sync.md +30 -20
  77. package/core/commands/update-framework.md +14 -7
  78. package/core/commands/validate-traces.md +106 -45
  79. package/core/modules/qc-playwright/stack-profile.yaml +65 -0
  80. package/core/skills/code/SKILL.md +63 -26
  81. package/core/skills/debug/SKILL.md +78 -34
  82. package/core/skills/design-spec/SKILL.md +49 -19
  83. package/core/skills/discovery/SKILL.md +49 -19
  84. package/core/skills/prd/SKILL.md +28 -14
  85. package/core/skills/qc/qa-analyst/DOC_GAPS.template.md +63 -0
  86. package/core/skills/qc/qa-analyst/acceptance-criteria.md +56 -0
  87. package/core/skills/qc/qa-analyst/business-rules.md +55 -0
  88. package/core/skills/qc/qa-analyst/data-flow.md +60 -0
  89. package/core/skills/qc/qa-analyst/spec-breakdown.md +57 -0
  90. package/core/skills/qc/qa-designer/e2e/journey.md +41 -0
  91. package/core/skills/qc/qa-designer/exploratory/charter.md +68 -0
  92. package/core/skills/qc/qa-designer/exploratory/explore-to-functional.md +43 -0
  93. package/core/skills/qc/qa-designer/functional/api.md +45 -0
  94. package/core/skills/qc/qa-designer/functional/gui-feature.md +46 -0
  95. package/core/skills/qc/qa-designer/functional/gui-screen.md +52 -0
  96. package/core/skills/qc/qa-designer/integration/api.md +42 -0
  97. package/core/skills/qc/qa-designer/integration/db.md +39 -0
  98. package/core/skills/qc/qa-designer/integration/gui.md +40 -0
  99. package/core/skills/qc/qa-designer/integration/kafka.md +40 -0
  100. package/core/skills/qc/qa-designer/non-functional.md +40 -0
  101. package/core/skills/qc/qa-planner/test-plan.md +120 -0
  102. package/core/skills/qc/qa-reviewer/script/e2e.md +87 -0
  103. package/core/skills/qc/qa-reviewer/script/exploratory.md +45 -0
  104. package/core/skills/qc/qa-reviewer/script/functional.md +101 -0
  105. package/core/skills/qc/qa-reviewer/script/integration.md +91 -0
  106. package/core/skills/qc/qa-reviewer/script/non-functional.md +126 -0
  107. package/core/skills/qc/qa-reviewer/test-case/e2e.md +73 -0
  108. package/core/skills/qc/qa-reviewer/test-case/exploratory.md +43 -0
  109. package/core/skills/qc/qa-reviewer/test-case/functional.md +76 -0
  110. package/core/skills/qc/qa-reviewer/test-case/integration.md +69 -0
  111. package/core/skills/qc/qa-reviewer/test-case/non-functional.md +73 -0
  112. package/core/skills/qc/qa-runner/e2e.md +49 -0
  113. package/core/skills/qc/qa-runner/exploratory/session.md +36 -0
  114. package/core/skills/qc/qa-runner/functional/api.md +35 -0
  115. package/core/skills/qc/qa-runner/functional/gui-feature.md +51 -0
  116. package/core/skills/qc/qa-runner/functional/gui-screen.md +55 -0
  117. package/core/skills/qc/qa-runner/integration.md +47 -0
  118. package/core/skills/qc/qa-runner/non-functional.md +49 -0
  119. package/core/skills/qc/qa-runner/report/report.md +37 -0
  120. package/core/skills/setup-ai-first/SKILL.md +14 -7
  121. package/core/skills/spec/SKILL.md +28 -14
  122. package/core/skills/test/SKILL.md +121 -54
  123. package/core/steps/capture-lesson.md +1 -1
  124. package/core/steps/context-loader.md +35 -12
  125. package/core/steps/report-footer.md +14 -7
  126. package/core/steps/review-fanout.md +138 -0
  127. package/core/steps/spawn-agent.md +1 -1
  128. package/core/steps/trace-mirror.md +18 -0
  129. package/core/templates/design-spec.template.md +16 -8
  130. package/core/templates/project-context.yaml +8 -0
  131. package/docs/01-getting-started/README.md +19 -0
  132. package/docs/01-getting-started/core-concepts.md +102 -0
  133. package/docs/01-getting-started/installation.md +154 -0
  134. package/docs/01-getting-started/quickstart.md +85 -0
  135. package/docs/02-guides/README.md +27 -0
  136. package/docs/02-guides/developer/README.md +46 -0
  137. package/docs/02-guides/developer/bdd-and-trace.md +123 -0
  138. package/docs/02-guides/developer/commands.md +76 -0
  139. package/docs/02-guides/developer/pr-checklist.md +15 -0
  140. package/docs/02-guides/developer/scenarios.md +448 -0
  141. package/docs/02-guides/developer/workflow.md +59 -0
  142. package/docs/02-guides/product-owner/README.md +77 -0
  143. package/docs/02-guides/product-owner/commands.md +30 -0
  144. package/docs/02-guides/product-owner/handoff-checklist.md +42 -0
  145. package/docs/02-guides/product-owner/prd-writing-rules.md +45 -0
  146. package/docs/02-guides/product-owner/scenarios.md +357 -0
  147. package/docs/02-guides/qc-automation.md +92 -0
  148. package/docs/02-guides/tester/README.md +72 -0
  149. package/docs/02-guides/tester/bug-reporting.md +117 -0
  150. package/docs/02-guides/tester/reading-specs.md +79 -0
  151. package/docs/02-guides/tester/scenarios.md +186 -0
  152. package/docs/02-guides/tester/spec-manifest.md +124 -0
  153. package/docs/02-guides/tester/test-checklist.md +31 -0
  154. package/docs/02-guides/tester/workflow.md +79 -0
  155. package/docs/03-concepts/README.md +19 -0
  156. package/docs/03-concepts/architecture.md +243 -0
  157. package/docs/03-concepts/pipeline.md +249 -0
  158. package/docs/03-concepts/traceability.md +148 -0
  159. package/docs/04-operations/README.md +33 -0
  160. package/docs/04-operations/bug-flow.md +321 -0
  161. package/docs/04-operations/publishing.md +137 -0
  162. package/docs/04-operations/sync-and-update.md +328 -0
  163. package/docs/05-reference/README.md +29 -0
  164. package/docs/05-reference/commands.md +229 -0
  165. package/docs/05-reference/modules.md +110 -0
  166. package/docs/05-reference/trace-schema.md +146 -0
  167. package/docs/README.md +51 -0
  168. package/modules/qc-playwright/stack-profile.yaml +65 -0
  169. package/package.json +2 -2
  170. package/skills/code/SKILL.md +63 -26
  171. package/skills/debug/SKILL.md +78 -34
  172. package/skills/debug/SKILL.tmpl +1 -1
  173. package/skills/design-spec/SKILL.md +49 -19
  174. package/skills/discovery/SKILL.md +49 -19
  175. package/skills/prd/SKILL.md +28 -14
  176. package/skills/qc/qa-analyst/DOC_GAPS.template.md +63 -0
  177. package/skills/qc/qa-analyst/acceptance-criteria.md +56 -0
  178. package/skills/qc/qa-analyst/business-rules.md +55 -0
  179. package/skills/qc/qa-analyst/data-flow.md +60 -0
  180. package/skills/qc/qa-analyst/spec-breakdown.md +57 -0
  181. package/skills/qc/qa-designer/e2e/journey.md +41 -0
  182. package/skills/qc/qa-designer/exploratory/charter.md +68 -0
  183. package/skills/qc/qa-designer/exploratory/explore-to-functional.md +43 -0
  184. package/skills/qc/qa-designer/functional/api.md +45 -0
  185. package/skills/qc/qa-designer/functional/gui-feature.md +46 -0
  186. package/skills/qc/qa-designer/functional/gui-screen.md +52 -0
  187. package/skills/qc/qa-designer/integration/api.md +42 -0
  188. package/skills/qc/qa-designer/integration/db.md +39 -0
  189. package/skills/qc/qa-designer/integration/gui.md +40 -0
  190. package/skills/qc/qa-designer/integration/kafka.md +40 -0
  191. package/skills/qc/qa-designer/non-functional.md +40 -0
  192. package/skills/qc/qa-planner/test-plan.md +120 -0
  193. package/skills/qc/qa-reviewer/script/e2e.md +87 -0
  194. package/skills/qc/qa-reviewer/script/exploratory.md +45 -0
  195. package/skills/qc/qa-reviewer/script/functional.md +101 -0
  196. package/skills/qc/qa-reviewer/script/integration.md +91 -0
  197. package/skills/qc/qa-reviewer/script/non-functional.md +126 -0
  198. package/skills/qc/qa-reviewer/test-case/e2e.md +73 -0
  199. package/skills/qc/qa-reviewer/test-case/exploratory.md +43 -0
  200. package/skills/qc/qa-reviewer/test-case/functional.md +76 -0
  201. package/skills/qc/qa-reviewer/test-case/integration.md +69 -0
  202. package/skills/qc/qa-reviewer/test-case/non-functional.md +73 -0
  203. package/skills/qc/qa-runner/e2e.md +49 -0
  204. package/skills/qc/qa-runner/exploratory/session.md +36 -0
  205. package/skills/qc/qa-runner/functional/api.md +35 -0
  206. package/skills/qc/qa-runner/functional/gui-feature.md +51 -0
  207. package/skills/qc/qa-runner/functional/gui-screen.md +55 -0
  208. package/skills/qc/qa-runner/integration.md +47 -0
  209. package/skills/qc/qa-runner/non-functional.md +49 -0
  210. package/skills/qc/qa-runner/report/report.md +37 -0
  211. package/skills/setup-ai-first/SKILL.md +14 -7
  212. package/skills/spec/SKILL.md +28 -14
  213. package/skills/test/SKILL.md +121 -54
  214. package/skills/test/SKILL.tmpl +9 -9
  215. package/steps/capture-lesson.md +1 -1
  216. package/steps/context-loader.md +35 -12
  217. package/steps/report-footer.md +14 -7
  218. package/steps/review-fanout.md +138 -0
  219. package/steps/spawn-agent.md +1 -1
  220. package/steps/trace-mirror.md +18 -0
  221. package/templates/design-spec.template.md +16 -8
  222. package/templates/project-context.yaml +8 -0
  223. package/ARCHITECTURE.md +0 -247
@@ -0,0 +1,40 @@
1
+ ---
2
+ version: 1.0
3
+ updated: 2026-06-11
4
+ ported_from: ai-automation-qc-base
5
+ ---
6
+
7
+ # Test Case — Integration Kafka (Message/Event)
8
+
9
+ Skill **tự chứa** để viết TC tích hợp qua Kafka: producer phát event đúng, consumer xử lý
10
+ đúng, đảm bảo ordering/idempotency/retry. Chỉ cần load file này.
11
+
12
+ ## Khi nào trigger
13
+ - Action sinh event Kafka (vd tạo ticket → phát event sang service/CRM); verify topic/payload/thứ tự/khử trùng
14
+
15
+ ## Khi KHÔNG trigger
16
+ - Tích hợp đồng bộ qua API → `integration/api` · verify DB → `integration/db`
17
+
18
+ ---
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_GAPS.md)`.
22
+ - **Test Data** dạng list (payload) · **Steps** `[Action]`/`[Verify]` · **Expected** 1 bullet nêu **topic + field payload / hành vi consumer**.
23
+ - Cuối file: Trace matrix + bảng TC block · bỏ nội dung gạch ngang.
24
+
25
+ ## Kỹ thuật áp dụng
26
+ - **Message/event:** verify topic, key, payload schema, điều kiện phát.
27
+ - **Ordering & idempotency:** thứ tự theo key, message trùng/out-of-order.
28
+ - **Error/Retry:** consumer lỗi → retry/DLQ.
29
+
30
+ ## Phase 1 — Clarify
31
+ Topic/key/payload + điều kiện phát (khi nào phát/không) · consumer xử lý gì + side-effect + idempotent ·
32
+ yêu cầu ordering · xử lý trùng/out-of-order/lỗi (retry, DLQ).
33
+
34
+ ## Phase 2 — Write
35
+ Nhóm TC: phát đúng topic+payload (happy) → điều kiện không phát → consumer xử lý đúng → message trùng (idempotent)
36
+ → out-of-order → consumer lỗi → retry/DLQ → ordering theo key. Setup/teardown consumer test.
37
+ Mỗi TC bám Format; trace BR; gap chặn → 🚫 Block.
38
+
39
+ ## Output
40
+ File TC trong `docs/<project>/<feature>/`. Mỗi TC ghi topic, key, payload cần verify + hành vi consumer. Bàn giao `qa-reviewer`.
@@ -0,0 +1,40 @@
1
+ ---
2
+ version: 1.0
3
+ updated: 2026-06-11
4
+ ported_from: ai-automation-qc-base
5
+ ---
6
+
7
+ # Test Case — Non-Functional
8
+
9
+ Skill **tự chứa** để viết TC phi chức năng: performance, security, accessibility, compatibility.
10
+ Trọng tâm "hệ thống hoạt động TỐT thế nào". Chỉ cần load file này.
11
+
12
+ ## Khi nào trigger
13
+ - Yêu cầu hiệu năng/tải, bảo mật, accessibility, tương thích; feature có SLA, dữ liệu nhạy cảm, hoặc data lớn
14
+
15
+ ## Khi KHÔNG trigger
16
+ - Kiểm thử chức năng theo đặc tả → `functional/*` · tích hợp module → `integration/*`
17
+
18
+ ---
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_GAPS.md)`.
22
+ - **Test Data** dạng list · **Steps** `[Action]`/`[Verify]` · **Expected** 1 bullet có **ngưỡng đo cụ thể** (không "nhanh/ổn định").
23
+ - Cuối file: Trace matrix + bảng TC block · bỏ nội dung gạch ngang.
24
+
25
+ ## Kỹ thuật / loại
26
+ - **Performance:** response time dưới tải mục tiêu; danh sách lớn (max data); pagination; concurrency.
27
+ - **Security:** authZ/role (truy cập trái phép → chặn), injection, PII (SĐT) không lộ, session/timeout, rate limit.
28
+ - **Accessibility:** keyboard nav, focus, label/aria, contrast (WCAG).
29
+ - **Compatibility:** trình duyệt/thiết bị/độ phân giải mục tiêu.
30
+
31
+ ## Phase 1 — Clarify
32
+ Loại non-functional + tiêu chí đo (ngưỡng cụ thể: thời gian, số user, WCAG level) · môi trường & công cụ
33
+ (load tool, scanner, axe/lighthouse) · dữ liệu/tải mẫu.
34
+
35
+ ## Phase 2 — Write
36
+ Mỗi TC bám Format; **Expected có ngưỡng pass + công cụ đo**; đánh dấu TC cần môi trường/data đặc biệt.
37
+ Trace BR; gap chặn → 🚫 Block.
38
+
39
+ ## Output
40
+ File TC non-functional trong `docs/<project>/<feature>/`. Mỗi TC ghi tiêu chí đo + ngưỡng + công cụ. Bàn giao `qa-reviewer`.
@@ -0,0 +1,120 @@
1
+ ---
2
+ version: 1.0
3
+ updated: 2026-06-11
4
+ ported_from: ai-automation-qc-base
5
+ ---
6
+
7
+ # Lập Test Plan
8
+
9
+ Tổng hợp **output của qa-analyst** thành **Test Plan** cho một feature.
10
+
11
+ **Đầu vào (bắt buộc, chỉ 2 nguồn):**
12
+ 1. `docs/<project>/<feature>/REQUIREMENT_ANALYSIS.md` — chức năng, BR-xx, AC-xx, data flow (qa-analyst).
13
+ 2. `docs/<project>/<feature>/DOC_GAPS.md` — bảng gap GAP-xx, mức độ, gap Blocker (qa-analyst).
14
+
15
+ ## Khi nào trigger
16
+ - "lập test plan cho [Feature]" / "viết test plan"
17
+ - Sau khi qa-analyst xong (đã có REQUIREMENT_ANALYSIS + DOC_GAPS)
18
+ - Trước khi qa-designer thiết kế chi tiết TC — test plan là khung định hướng
19
+
20
+ ## Khi KHÔNG trigger
21
+ - Chưa có REQUIREMENT_ANALYSIS / DOC_GAPS → chạy qa-analyst trước
22
+ - Thiết kế test case chi tiết (.Test.md) → dùng qa-designer
23
+ - Bóc tách yêu cầu/spec, lập danh sách gap → dùng qa-analyst
24
+
25
+ ---
26
+
27
+ ## Phase 1 — Thu thập đầu vào
28
+
29
+ 1. Đọc `REQUIREMENT_ANALYSIS.md`: nắm chức năng, các BR-xx và AC-xx, data flow,
30
+ integration/failure point.
31
+ 2. Đọc `DOC_GAPS.md`: lấy danh sách gap, đặc biệt **gap Blocker còn Open** → đây là
32
+ nguồn cho cột "Phụ thuộc" và cho Entry criteria.
33
+ 3. Map mỗi nhóm BR sang **layer test** của qa-designer: functional/gui-screen,
34
+ gui-feature, api, integration, e2e/journey, non-functional.
35
+ 4. **Bỏ qua nội dung gạch ngang** (đã loại ở qa-analyst) — không đưa vào plan.
36
+
37
+ ---
38
+
39
+ ## Phase 2 — Lập Test Plan
40
+
41
+ Điền đủ template bên dưới. Nguyên tắc:
42
+ - Mỗi **vùng test** map về BR-xx cụ thể, gắn **Layer + Loại test + Priority + ước lượng TC**;
43
+ hiển thị **rule chi tiết** ngay trong bảng (cột riêng, dùng `<br>` cho nhiều rule).
44
+ - **Priority theo rủi ro suy ra từ BR + gap:** core function / logic định tuyến / sinh
45
+ mã / tiền-dữ liệu = P0.
46
+ - Vùng/journey còn phụ thuộc **gap Blocker** → ghi rõ cột "Phụ thuộc" (GAP#); Entry
47
+ criteria yêu cầu đóng các gap đó trước khi thiết kế TC.
48
+ - Liệt kê **E2E journey** đầy đủ (mỗi journey: tiền điều kiện, kết quả/định tuyến kỳ
49
+ vọng, BR, phụ thuộc, priority) + bộ **verify point chung** sau submit.
50
+ - Mục Rủi ro: rút trực tiếp từ gap Blocker + các BR logic phức tạp.
51
+
52
+ ---
53
+
54
+ ## Output — Template `TEST_PLAN.md`
55
+
56
+ Đặt tại `docs/<project>/<feature>/TEST_PLAN.md`:
57
+
58
+ ```markdown
59
+ # Test Plan – <Feature>
60
+
61
+ | Trường | Giá trị |
62
+ |---|---|
63
+ | Feature / Project / Module | … |
64
+ | Người lập | qa-planner |
65
+ | Ngày / Phiên bản | … |
66
+ | Nguồn | REQUIREMENT_ANALYSIS · DOC_GAPS |
67
+
68
+ ## 1. Mục tiêu
69
+ Mục tiêu test của feature (1–3 câu).
70
+
71
+ ## 2. Phạm vi
72
+ - **In scope:** chức năng/BR được test.
73
+ - **Out of scope:** phần để tài liệu/feature khác; nội dung gạch ngang đã loại.
74
+
75
+ ## 3. Test items theo vùng & độ ưu tiên
76
+ Bảng — mỗi vùng kèm rule chi tiết + metadata:
77
+
78
+ | # | Vùng test | Rule chi tiết | Layer (qa-designer) | Loại test | Pri | Ước lượng |
79
+ |---|---|---|---|---|---|---|
80
+ | ① | <vùng> | **BR-xx:** … <br>**BR-yy:** … | functional/gui-screen | Functional/Negative | P0 | n |
81
+ | … | … | … | … | … | … | … |
82
+
83
+ > Tổng ước lượng sơ bộ: ~N test case (+ E2E).
84
+
85
+ ### 3.1 Danh sách E2E đầy đủ
86
+ Verify points chung (sau Submit): V1 tạo thành công · V2 mã/ID đúng · V3 hiển thị danh
87
+ sách · V4… · Trục bao phủ: <các chiều tổ hợp>.
88
+
89
+ | ID | Journey | Tiền điều kiện | Kết quả kỳ vọng | BR | Phụ thuộc | Pri |
90
+ |---|---|---|---|---|---|---|
91
+ | E2E-XX-01 | … | … | … | BR-… | GAP# | P0 |
92
+
93
+ ## 4. Cách tiếp cận (Test approach)
94
+ Kỹ thuật áp dụng: EP+BVA, Decision Table (cho logic điều kiện), state/lookup,
95
+ integration, negative/exploratory; tự động hoá theo `CLAUDE.md` (Playwright + pytest-playwright + Trace + pytest-html).
96
+
97
+ ## 5. Tiêu chí Vào / Ra
98
+ - **Entry:** gap Blocker (trong DOC_GAPS) đã Answered; doc phụ thuộc sẵn sàng; môi trường + tài khoản role.
99
+ - **Exit:** pass P0=100%, P1≥95%; không còn defect Blocker/Critical; mọi BR/AC được trace; báo cáo pytest-html + Playwright Trace.
100
+
101
+ ## 6. Rủi ro (risk-based)
102
+ | Rủi ro | Ảnh hưởng | Mức | Giảm thiểu |
103
+ (rút từ gap Blocker + BR logic phức tạp)
104
+
105
+ ## 7. Dữ liệu & Môi trường
106
+ Tài khoản các role, dữ liệu mẫu (biên/edge), môi trường staging.
107
+
108
+ ## 8. Deliverables
109
+ Test case `.Test.md`, script Playwright/pytest + Page Object, báo cáo pytest-html + Playwright Trace.
110
+
111
+ ## 9. Lịch trình (milestone phụ thuộc gap)
112
+ | Mốc | Điều kiện | Trạng thái |
113
+ M0 phân tích → M1 đóng gap → M2 thiết kế TC → M3 review TC → M4 chạy → M5 review script.
114
+
115
+ ## 10. Trạng thái hiện tại
116
+ Blocked/Ready + phần có thể làm sớm (không phụ thuộc gap Blocker).
117
+ ```
118
+
119
+ Kết thúc bằng: tóm tắt số vùng test + tổng TC ước lượng + trạng thái (Ready/Blocked dựa
120
+ trên gap Blocker còn Open) và gợi ý bước kế tiếp (bàn giao qa-designer khi đã Ready).
@@ -0,0 +1,87 @@
1
+ ---
2
+ version: 1.0
3
+ updated: 2026-06-11
4
+ ported_from: ai-automation-qc-base
5
+ ---
6
+
7
+ # Review Test Script — E2E Journey
8
+
9
+ Review Python pytest script cho test end-to-end và đánh giá chất lượng code.
10
+
11
+ ## Khi nào trigger
12
+ - "review script E2E cho [Feature]" / "check code E2E quality"
13
+ - Sau khi qa-runner sinh script E2E, trước khi merge
14
+
15
+ ## Khi KHÔNG trigger
16
+ - Review script functional 1 màn → `script/functional`
17
+ - Review script integration → `script/integration`
18
+ - Review session note → `script/exploratory`
19
+
20
+ ---
21
+
22
+ ## Phase 1 — Clarify
23
+
24
+ 1. Đọc file Python test E2E được chỉ định (thường `tests/<project>/e2e/test_*.py`)
25
+ 2. Đọc các Page Object liên quan (nhiều PO cho nhiều màn)
26
+ 3. Đọc TC E2E Markdown gốc để so sánh coverage journey
27
+
28
+ ---
29
+
30
+ ## Phase 2 — Review
31
+
32
+ Đánh giá theo 6 tiêu chí:
33
+
34
+ A. JOURNEY COVERAGE:
35
+ - Mỗi journey trong TC E2E có test function tương ứng không?
36
+ - Test function có traverse đủ các màn/module của journey không?
37
+ - Main flow / alternate flow / exception flow đủ không?
38
+
39
+ B. CROSS-MODULE DATA INTEGRITY:
40
+ - Data nhập ở Page A có được verify ở Page B/DB/hệ thống ngoài không?
41
+ - Assertion sau mỗi chặng (không chỉ assert ở bước cuối)?
42
+ - Không bỏ qua bước trung gian để "shortcut" đến màn cuối?
43
+
44
+ C. FIXTURE & PRECONDITION:
45
+ - Precondition phức tạp (nhiều entity) có fixture riêng, không inline trong test?
46
+ - Fixture tạo data → có teardown/cleanup tương ứng (yield + cleanup)?
47
+ - Không hardcode ID của entity đã tạo ở bước trước → dùng biến trả về fixture?
48
+ - Fixture scope đúng (`function` cho E2E, không dùng `session`)?
49
+
50
+ D. WAIT & TIMING:
51
+ - Timeout đủ dài cho navigation giữa màn (≥15s cho `networkidle`)?
52
+ - Không `time.sleep()`; dùng `wait_for_url` / `wait_for_load_state` / `expect(...).to_be_visible`?
53
+ - Không timeout ngắn (<5s) cho API call cross-module?
54
+
55
+ E. ASSERTION DEPTH:
56
+ - Không chỉ assert URL cuối; phải assert nội dung tại mỗi chặng?
57
+ - Verify đúng data flow: giá trị nhập màn A xuất hiện đúng ở màn B?
58
+ - Negative journey (thất bại giữa chừng): assert đúng màn dừng lại + thông báo lỗi?
59
+
60
+ F. CONVENTION:
61
+ - Marker `@pytest.mark.e2e` + `@pytest.mark.smoke` (nếu critical journey)?
62
+ - Marker phân loại = tên journey; docstring = TC ID + mô tả journey?
63
+ - `with step(...)` (`from utils.steps`) rõ từng chặng (màn nào → hành động nào)?
64
+ - Docstring ghi TC ID + mô tả journey ngắn?
65
+
66
+ ---
67
+
68
+ ## Checklist chi tiết
69
+
70
+ ### Page Objects
71
+ - Mỗi màn có PO riêng; test không gọi `page.click()` / `page.fill()` trực tiếp.
72
+ - Selector constants khai báo đầu class; không rải rác trong test.
73
+ - Action method `return self` để chain; assertion method gọi `take_screenshot()` cuối.
74
+
75
+ ### Test file
76
+ - Fixture `logged_in_page` hoặc fixture composite (vd `logged_in_as_teacher`) làm base.
77
+ - Không dùng biến global chia sẻ state giữa test function.
78
+ - Compile & collect trước submit: `python3 -m py_compile` + `pytest --collect-only -q`.
79
+ - Số journey collect = số TC E2E trong `.md`.
80
+
81
+ ---
82
+
83
+ ## Output
84
+
85
+ Mỗi issue: `file:line` | severity | mô tả | suggestion fix.
86
+ Severity: 🔴 fix ngay (missing cleanup, dữ liệu không verify cross-module, shortcut journey) · 🟠 quan trọng (timeout thiếu, assertion chỉ ở bước cuối) · 🟡 nhỏ (style, docstring/title sai).
87
+ Score: A/B/C/D · Top 5 issue cần fix trước merge.
@@ -0,0 +1,45 @@
1
+ ---
2
+ version: 1.0
3
+ updated: 2026-06-11
4
+ ported_from: ai-automation-qc-base
5
+ ---
6
+
7
+ # Review Session Note — Exploratory
8
+
9
+ Review session note sau khi test, coaching QC cải thiện kỹ năng.
10
+
11
+ ## Khi nào trigger
12
+ - "review session note" / sau khi QC hoàn thành exploratory session
13
+ - Khi lead/senior muốn đánh giá chất lượng session của junior
14
+
15
+ ## Khi KHÔNG trigger
16
+ - Review Python script → dùng qa-reviewer/script/functional
17
+ - Review charter → dùng qa-reviewer/test-case/exploratory
18
+
19
+ ---
20
+
21
+ ## Phase 1 — Read
22
+
23
+ Đọc session note .md được chỉ định.
24
+
25
+ ---
26
+
27
+ ## Phase 2 — Review
28
+
29
+ 7 tiêu chí:
30
+ 1. CHARTER COMPLETION: Đi đúng charter? Coverage %?
31
+ 2. NOTE QUALITY: Ratio #TEST / #BUG ≥ 3:1? Mỗi #TEST có mô tả action + observation?
32
+ 3. BUG QUALITY: Steps rõ? Expected/Actual cụ thể? Severity hợp lý?
33
+ 4. OBSERVATION DEPTH: Có dùng FEW HICCUPPS? Hay chỉ test surface?
34
+ 5. TIME ALLOCATION: Setup <15%, Test >70%, Investigation <15%?
35
+ 6. FOLLOW-UP: #QUESTION gửi dev? #IDEA move vào ideas/?
36
+ 7. DEBRIEF: Có Summary cuối? Coverage, risks, next recommendation?
37
+
38
+ ---
39
+
40
+ ## Output
41
+
42
+ Score: A (excellent) / B (good) / C (needs improvement) / D (redo)
43
+ Mỗi tiêu chí: ✅/⚠️/❌ + feedback cụ thể
44
+ Top 3 improvement suggestions (coaching tone)
45
+ Đề xuất charter tiếp theo nếu chưa đủ coverage
@@ -0,0 +1,101 @@
1
+ ---
2
+ version: 1.0
3
+ updated: 2026-06-11
4
+ ported_from: ai-automation-qc-base
5
+ ---
6
+
7
+ # Review Test Script — Functional
8
+
9
+ Review Python pytest script và đánh giá chất lượng code.
10
+
11
+ ## Khi nào trigger
12
+ - "review script cho [Feature]" / "check code quality"
13
+ - Sau khi qa-runner xong, trước khi merge vào main
14
+
15
+ ## Khi KHÔNG trigger
16
+ - Review TC nghiệp vụ → dùng qa-reviewer
17
+ - Review exploratory session note → dùng qa-reviewer/script/exploratory
18
+
19
+ ---
20
+
21
+ ## Phase 1 — Clarify
22
+
23
+ 1. Đọc file Python test được chỉ định
24
+ 2. Đọc Page Object liên quan
25
+ 3. Đọc TC markdown gốc (để so sánh coverage)
26
+
27
+ ---
28
+
29
+ ## Phase 2 — Review
30
+
31
+ Đánh giá theo 6 tiêu chí:
32
+
33
+ A. LOCATOR:
34
+ - XPath dài/phức tạp → đề xuất data-testid / role
35
+ - Locator phụ thuộc text tiếng Việt → fragile khi đổi copy
36
+ - Locator nằm trong Page Object, KHÔNG hardcode trong test
37
+ - Dùng .first()/[n] → không reliable
38
+
39
+ B. WAIT & TIMING:
40
+ - time.sleep() → phải đổi sang Playwright auto-wait / expect
41
+ - Timeout quá ngắn (<3s) hoặc quá dài (>30s)
42
+
43
+ C. TEST INDEPENDENCE:
44
+ - Hardcode user ID/data ID → fragile
45
+ - Phụ thuộc thứ tự chạy (test_b cần test_a)
46
+ - Thiếu cleanup/teardown khi tạo data
47
+ - Global state
48
+
49
+ D. ASSERTION:
50
+ - assert True / not error → vô nghĩa
51
+ - Chỉ assert URL, không assert content → thiếu
52
+ - Thiếu negative assertion
53
+
54
+ E. CONVENTION:
55
+ - Marker đúng (@pytest.mark.functional + platform)?
56
+ - Tên: test_<feature>_<scenario>_<expected>?
57
+ - Docstring có TC_ID?
58
+ - Fixture từ conftest, không tự tạo browser?
59
+
60
+ F. PAGE OBJECT:
61
+ - Test gọi page.click() trực tiếp → phải qua PO
62
+ - PO method quá dài (>15 dòng) → tách
63
+
64
+ ---
65
+
66
+ ## Checklist chi tiết review code
67
+
68
+ ### Phần 1 — Page Object (`pages/<feature>_page.py`)
69
+ - Kế thừa `BasePage`; selector constants `UPPER_SNAKE_CASE` tập trung đầu class (không rải rác).
70
+ - Tách 3 lớp: Locators (`_private()` chỉ trả `Locator`) → Actions (`public()` + `return self`, KHÔNG decorator) → Assertions (`assert_*()` + `expect()` + `take_screenshot()` cuối).
71
+ - Wait: KHÔNG `time.sleep()`; `wait_for_timeout()` chỉ khi cần (≤1000ms); sau nav/submit dùng `wait_for_load_state("networkidle")`; không `wait_for_timeout` ngay sau `networkidle`.
72
+ - KHÔNG hardcode URL/credential/timeout → `Env.*`, `CONFIG`.
73
+ - Column index dùng named constant (`COL_TTHAI = 7`), không magic number `cells[7]`.
74
+ - Assertion: dùng `expect()` cho element; `assert` Python cho logic (count/regex); screenshot tên `TC<NNN>_mo_ta`; KHÔNG silent fail → `raise AssertionError`, không `log.warning`.
75
+ - Lỗi assertion hay gặp: "ordered" phải verify thứ tự thật (`last_pos`); đúng cột; Counter ≠ Pagination total (không assert `==`); P0 strict / P1 `_or_empty`.
76
+ - Public API: có `get_row_count()`, `get_all_rows()` thay vì test gọi `_private()`; helper trả data là method thường (không cần bọc step).
77
+
78
+ ### Phần 2 — Test file (`tests/test_<feature>.py`)
79
+ - Đủ class `TestFeatureUI` / `TestFeatureFunctional` / `TestFeatureNegative`; fixture scope `function`, base `logged_in_page`.
80
+ - KHÔNG Allure: phân loại/độ ưu tiên qua pytest markers (`smoke`/`regression`/domain); docstring/`__doc__` ghi `TC_FEATURE_NNN – …`; Priority khớp marker (P0→smoke, P1/P2→regression).
81
+ - Marker: ≥1 category (`smoke`/`regression`) + 1 domain (`ui`/`filter`/`search`/`pagination`/`action`/`negative`); đã đăng ký `pytest.ini`.
82
+ - Step: bọc bước bằng `with step("…")` (`from utils.steps import step`) rõ Action/Verify; KHÔNG step rỗng `: pass`.
83
+ - Isolation: độc lập thứ tự; không global state; không gọi `_private()` từ test.
84
+ - Logic nghiệp vụ nghi ngờ → `@pytest.mark.xfail(strict=False, reason=...)` giải thích rõ.
85
+
86
+ ### Phần 4 — Tổng quát
87
+ - Compile & collect bắt buộc trước submit:
88
+ `python3 -m py_compile pages/<f>_page.py tests/test_<f>.py` · `pytest tests/test_<f>.py --collect-only -q`
89
+ - Số test collect = số TC trong `.md`; không warning marker chưa đăng ký.
90
+ - Naming: class `PascalCase`+`Page`; method `test_TC<NNN>_<snake>`; constant `UPPER_SNAKE`; locator `_snake()`; action `verb_noun()`; assert `assert_condition()`.
91
+
92
+ ### Lỗi phổ biến (TC_TRUCLOP)
93
+ empty step `:pass` · test gọi `_private()` · Counter≠Pagination → xfail · "ordered" không verify thứ tự · magic `cells[7]` · silent fail → raise · Reset thiếu domain marker · `wait_for_timeout` thừa sau networkidle · orphan selector constant.
94
+
95
+ ---
96
+
97
+ ## Output
98
+
99
+ Mỗi issue: file:line | severity | mô tả | suggestion fix.
100
+ Severity: 🔴 fix ngay (sai logic, POM breach, silent fail) · 🟠 quan trọng (fragile selector, wrong column, missing assert) · 🟡 nhỏ (style, thừa wait, orphan constant).
101
+ Score: A/B/C/D · Top 5 issue cần fix trước.
@@ -0,0 +1,91 @@
1
+ ---
2
+ version: 1.0
3
+ updated: 2026-06-11
4
+ ported_from: ai-automation-qc-base
5
+ ---
6
+
7
+ # Review Test Script — Integration
8
+
9
+ Review Python pytest script cho test tích hợp (GUI↔Backend, API, DB) và đánh giá chất lượng code.
10
+
11
+ ## Khi nào trigger
12
+ - "review script integration cho [Feature]" / "check code tích hợp"
13
+ - Sau khi qa-runner sinh script integration, trước khi merge
14
+
15
+ ## Khi KHÔNG trigger
16
+ - Review script functional 1 màn/endpoint → `script/functional`
17
+ - Review script E2E xuyên nhiều module → `script/e2e`
18
+ - Review session note → `script/exploratory`
19
+
20
+ ---
21
+
22
+ ## Phase 1 — Clarify
23
+
24
+ 1. Đọc file Python test integration được chỉ định
25
+ 2. Đọc Page Object và API/DB utility liên quan
26
+ 3. Đọc TC integration Markdown gốc để so sánh coverage
27
+
28
+ ---
29
+
30
+ ## Phase 2 — Review
31
+
32
+ Đánh giá theo 6 tiêu chí:
33
+
34
+ A. NO MOCK ON INTEGRATION:
35
+ - Không mock API/DB trong integration test (mock → đây là unit test, không phải integration)?
36
+ - Dùng real network call / real DB query / `page.expect_response()` để capture API thật?
37
+ - Network interception chỉ dùng để **observe** (verify request), không để **stub** response?
38
+
39
+ B. BACKEND STATE VERIFICATION:
40
+ - Sau action UI, có verify trạng thái backend không (DB query / API GET để re-fetch)?
41
+ - **GUI↔Backend:** verify cả request gửi đúng (method/URL/payload) lẫn render UI đúng?
42
+ - **DB:** dùng trực tiếp DB fixture/util để query `bảng.cột = giá trị`; không chỉ verify qua UI?
43
+ - **API:** verify response schema + status code + downstream effect (DB/event)?
44
+
45
+ C. ERROR STATE COVERAGE:
46
+ - Có test 4xx/5xx response → UI hiển thị message đúng?
47
+ - Có test empty state / loading state / timeout state?
48
+ - Concurrency test: mô tả rõ số request đồng thời; assert không race condition (vd unique constraint giữ)?
49
+
50
+ D. DATA SETUP & CLEANUP:
51
+ - Data test được tạo qua fixture (không hardcode ID)?
52
+ - Fixture `yield` + teardown xóa/rollback data sau mỗi test?
53
+ - Không dùng data production hoặc shared data giữa các test?
54
+
55
+ E. WAIT & TIMING:
56
+ - Không `time.sleep()`; chờ API response bằng `page.expect_response()` hoặc `wait_for_response()`?
57
+ - Sau action có side-effect backend, chờ đủ trước khi assert state (vd `wait_for_load_state("networkidle")`)?
58
+ - Timeout đủ cho network round-trip (≥10s)?
59
+
60
+ F. CONVENTION:
61
+ - Marker `@pytest.mark.integration` + sub-domain (`gui`, `api`, `db`)?
62
+ - Marker phân loại = loại tích hợp; docstring = TC ID + điểm tích hợp?
63
+ - `with step(...)` (`from utils.steps`) rõ hành động → API call → verify response/DB?
64
+ - Helper DB/API truy cập trong `utils/`, không rải trong test file?
65
+
66
+ ---
67
+
68
+ ## Checklist chi tiết
69
+
70
+ ### GUI↔Backend
71
+ - Dùng `page.expect_response("**/api/endpoint")` để capture và assert request/response.
72
+ - Assert: status code + response payload + UI change sau response.
73
+
74
+ ### API integration
75
+ - Dùng `requests` hoặc Playwright API context; không dùng UI để trigger API call.
76
+ - Assert schema với JSON schema validator hoặc `assert key in response.json()`.
77
+
78
+ ### DB integration
79
+ - DB fixture trả connection/cursor; cleanup `DELETE WHERE id = created_id`.
80
+ - `assert cursor.fetchone()["column"] == expected_value`; không hardcode row position.
81
+
82
+ ### Compile & collect
83
+ `python3 -m py_compile` + `pytest --collect-only -q`; số test collect = số TC integration `.md`.
84
+
85
+ ---
86
+
87
+ ## Output
88
+
89
+ Mỗi issue: `file:line` | severity | mô tả | suggestion fix.
90
+ Severity: 🔴 fix ngay (mock thay real call, missing DB verify, no cleanup) · 🟠 quan trọng (thiếu error state, hardcode ID, timeout ngắn) · 🟡 nhỏ (style, marker thiếu sub-domain).
91
+ Score: A/B/C/D · Top 5 issue cần fix trước merge.
@@ -0,0 +1,126 @@
1
+ ---
2
+ version: 1.0
3
+ updated: 2026-06-11
4
+ ported_from: ai-automation-qc-base
5
+ ---
6
+
7
+ # Review Test Script — Non-Functional
8
+
9
+ Review Python pytest script cho test phi chức năng (performance, security, accessibility, compatibility) và đánh giá chất lượng code.
10
+
11
+ ## Khi nào trigger
12
+ - "review script non-functional cho [Feature]" / "check code performance/security/accessibility"
13
+ - Sau khi qa-runner sinh script non-functional, trước khi merge
14
+
15
+ ## Khi KHÔNG trigger
16
+ - Review script functional → `script/functional`
17
+ - Review script integration → `script/integration`
18
+ - Review session note → `script/exploratory`
19
+
20
+ ---
21
+
22
+ ## Phase 1 — Clarify
23
+
24
+ 1. Đọc file Python test non-functional được chỉ định
25
+ 2. Xác định loại: performance / security / accessibility / compatibility
26
+ 3. Đọc TC non-functional Markdown gốc để đối chiếu ngưỡng + công cụ đo
27
+
28
+ ---
29
+
30
+ ## Phase 2 — Review
31
+
32
+ Đánh giá theo 6 tiêu chí:
33
+
34
+ A. THRESHOLD ASSERTION — tiêu chí quan trọng nhất:
35
+ - Assertion có dùng **giá trị ngưỡng cụ thể** không? (`assert elapsed < 2.0`, `assert violations == []`)
36
+ - Không dùng assertion mơ hồ: `assert response` / `assert "ok" in text` / `assert True`?
37
+ - Ngưỡng khớp với TC Markdown gốc (không tự đặt giá trị khác)?
38
+
39
+ B. THEO LOẠI:
40
+ - **Performance:**
41
+ - Đo thời gian bằng `page.wait_for_load_state` + `performance.timing` hoặc `time.perf_counter()` (không `time.sleep()`)?
42
+ - Có parametrize tải mục tiêu (concurrent users / data volume)?
43
+ - `pytest-benchmark` hoặc custom fixture đo rõ ràng?
44
+ - Margin hợp lý (không `assert elapsed < 0.001` quá strict)?
45
+ - **Security:**
46
+ - Payload injection được lưu trong fixture/constant, không inline magic string?
47
+ - Test không thực sự tấn công server production; dùng môi trường test?
48
+ - Assert bị chặn đúng: status 4xx, message lỗi, KHÔNG tạo được record?
49
+ - PII test: assert response KHÔNG chứa SĐT/email raw?
50
+ - **Accessibility:**
51
+ - Dùng `axe-playwright` (`AxeBuilder`) hoặc `pytest-axe`?
52
+ - Assert `violations == []` hoặc filter đúng WCAG level (`wcag2a`, `wcag2aa`)?
53
+ - Không assert bằng element count / class name (không liên quan accessibility)?
54
+ - **Compatibility:**
55
+ - Parametrize `@pytest.mark.parametrize` trên browser/device/viewport?
56
+ - Mỗi parameter = 1 target trong TC Markdown?
57
+ - Dùng `playwright_browser_type` fixture, không hardcode `chromium`?
58
+
59
+ C. ENVIRONMENT GUARD:
60
+ - Test cần môi trường đặc biệt (load server, scanner) có `@pytest.mark.skipif` nếu env không đủ?
61
+ - Credentials/endpoint load test không hardcode → `Env.*` / `CONFIG`?
62
+ - Test security không gọi endpoint production?
63
+
64
+ D. DATA SETUP & TEARDOWN:
65
+ - Data lớn (performance) có fixture tạo trước, teardown sau?
66
+ - Không để lại data/artifact sau test (security test không tạo record rác)?
67
+
68
+ E. WAIT & TIMING:
69
+ - Không `time.sleep()` cho wait UI; dùng Playwright auto-wait?
70
+ - Đo elapsed time chính xác: bắt đầu/kết thúc đo rõ ràng, không bao gồm fixture setup?
71
+
72
+ F. CONVENTION:
73
+ - Marker `@pytest.mark.non_functional` + sub-domain (`performance`/`security`/`accessibility`/`compatibility`)?
74
+ - **KHÔNG Allure** (đã gỡ): không `@allure.*`; bọc bước bằng `with step("…")` (`from utils.steps import step`)?
75
+ - `with step(...)` rõ: setup tải → trigger → measure → assert ngưỡng?
76
+ - Docstring ghi TC ID + ngưỡng mục tiêu + công cụ đo?
77
+ - Report = Playwright Trace (`test-results/<nodeid>/trace.zip`, `playwright show-trace`) + pytest-html (`--html=… --self-contained-html`); không tham chiếu report tự viết/Allure?
78
+
79
+ ---
80
+
81
+ ## Checklist chi tiết
82
+
83
+ ### Performance
84
+ ```python
85
+ # ✅ Đúng
86
+ start = time.perf_counter()
87
+ page.goto(Env.BASE_URL + "/list")
88
+ page.wait_for_load_state("networkidle")
89
+ elapsed = time.perf_counter() - start
90
+ assert elapsed < 2.0, f"Load time {elapsed:.2f}s > 2.0s threshold"
91
+ ```
92
+
93
+ ### Security
94
+ ```python
95
+ # ✅ Đúng — payload trong constant, assert bị block
96
+ INJECTION_PAYLOADS = ["<script>alert(1)</script>", "' OR 1=1--"]
97
+ # assert response.status == 400 hoặc record không tồn tại
98
+ ```
99
+
100
+ ### Accessibility
101
+ ```python
102
+ # ✅ Đúng — axe-playwright
103
+ from axe_playwright_python.sync_playwright import Axe
104
+ results = Axe().run(page)
105
+ assert results.violations_count == 0, results.generate_report()
106
+ ```
107
+
108
+ ### Compatibility
109
+ ```python
110
+ # ✅ Đúng — parametrize browser
111
+ @pytest.mark.parametrize("browser_name", ["chromium", "firefox", "webkit"])
112
+ def test_compatibility(browser_name, playwright):
113
+ browser = getattr(playwright, browser_name).launch()
114
+ ...
115
+ ```
116
+
117
+ ### Compile & collect
118
+ `python3 -m py_compile` + `pytest --collect-only -q`; số test collect = số TC non-functional `.md`.
119
+
120
+ ---
121
+
122
+ ## Output
123
+
124
+ Mỗi issue: `file:line` | severity | mô tả | suggestion fix.
125
+ Severity: 🔴 fix ngay (assertion không có ngưỡng, gọi production endpoint, hardcode credential) · 🟠 quan trọng (ngưỡng không khớp TC, thiếu parametrize, không teardown data) · 🟡 nhỏ (style, marker thiếu sub-domain, docstring thiếu ngưỡng).
126
+ Score: A/B/C/D · Top 5 issue cần fix trước merge.