@educa-corp/sdd-framework 0.9.0 → 0.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/bin/lint-trace.js +56 -12
  2. package/bin/qc-base-map.json +595 -0
  3. package/bin/self-check.js +146 -0
  4. package/bin/trace-schema.json +5 -0
  5. package/core/FRAMEWORK_VERSION +1 -1
  6. package/core/commands/generate-code.md +3 -2
  7. package/core/commands/propose-scenario.md +1 -1
  8. package/core/commands/qc-analyze.md +260 -22
  9. package/core/commands/qc-design-test.md +1 -1
  10. package/core/commands/qc-plan.md +7 -4
  11. package/core/commands/qc-run-test.md +1 -1
  12. package/core/commands/refine-prd.md +47 -20
  13. package/core/commands/report-bug.md +1 -1
  14. package/core/commands/review-context.md +27 -1
  15. package/core/commands/validate-traces.md +26 -2
  16. package/core/skills/qc/qa-analyst/DOC_GAP.template.md +117 -0
  17. package/core/skills/qc/qa-analyst/acceptance-criteria.md +4 -2
  18. package/core/skills/qc/qa-analyst/business-rules.md +38 -4
  19. package/core/skills/qc/qa-analyst/data-flow.md +5 -3
  20. package/core/skills/qc/qa-analyst/exhaustive-gap-scanner.md +174 -0
  21. package/core/skills/qc/qa-analyst/spec-breakdown.md +9 -7
  22. package/core/skills/qc/qa-analyst/spec-issue-reporter.md +100 -0
  23. package/core/skills/qc/qa-designer/e2e/journey.md +2 -2
  24. package/core/skills/qc/qa-designer/exploratory/charter.md +1 -1
  25. package/core/skills/qc/qa-designer/exploratory/explore-to-functional.md +1 -1
  26. package/core/skills/qc/qa-designer/functional/api.md +2 -2
  27. package/core/skills/qc/qa-designer/functional/gui-feature.md +2 -2
  28. package/core/skills/qc/qa-designer/functional/gui-screen.md +2 -2
  29. package/core/skills/qc/qa-designer/integration/api.md +2 -2
  30. package/core/skills/qc/qa-designer/integration/db.md +2 -2
  31. package/core/skills/qc/qa-designer/integration/gui.md +2 -2
  32. package/core/skills/qc/qa-designer/integration/kafka.md +2 -2
  33. package/core/skills/qc/qa-designer/non-functional.md +2 -2
  34. package/core/skills/qc/qa-planner/risk-model.md +106 -0
  35. package/core/skills/qc/qa-planner/test-plan.md +13 -10
  36. package/core/skills/qc/qa-reviewer/script/e2e.md +1 -1
  37. package/core/skills/qc/qa-reviewer/script/exploratory.md +1 -1
  38. package/core/skills/qc/qa-reviewer/script/functional.md +1 -1
  39. package/core/skills/qc/qa-reviewer/script/integration.md +1 -1
  40. package/core/skills/qc/qa-reviewer/script/non-functional.md +1 -1
  41. package/core/skills/qc/qa-reviewer/test-case/e2e.md +1 -1
  42. package/core/skills/qc/qa-reviewer/test-case/exploratory.md +1 -1
  43. package/core/skills/qc/qa-reviewer/test-case/functional.md +1 -1
  44. package/core/skills/qc/qa-reviewer/test-case/integration.md +2 -2
  45. package/core/skills/qc/qa-reviewer/test-case/non-functional.md +1 -1
  46. package/core/skills/qc/qa-runner/e2e.md +1 -1
  47. package/core/skills/qc/qa-runner/exploratory/session.md +1 -1
  48. package/core/skills/qc/qa-runner/functional/api.md +1 -1
  49. package/core/skills/qc/qa-runner/functional/gui-feature.md +1 -1
  50. package/core/skills/qc/qa-runner/functional/gui-screen.md +1 -1
  51. package/core/skills/qc/qa-runner/integration.md +1 -1
  52. package/core/skills/qc/qa-runner/non-functional.md +1 -1
  53. package/core/skills/qc/qa-runner/report/report.md +1 -1
  54. package/core/steps/gap-verify.md +231 -0
  55. package/core/steps/review-fanout.md +27 -1
  56. package/core/templates/project-context.yaml +2 -2
  57. package/docs/02-concepts/pipeline-steps/08-qc-automation.md +2 -2
  58. package/docs/04-reference/commands.md +1 -1
  59. package/docs/explain/03-refine-prd.md +8 -6
  60. package/docs/explain/15-qc-analyze.md +10 -7
  61. package/docs/explain/16-qc-plan.md +2 -2
  62. package/docs/plans/qc-implementation-log.md +1446 -0
  63. package/docs/plans/qc-merge-plan.md +502 -0
  64. package/docs/plans/qc-sync-command.md +358 -0
  65. package/package.json +1 -1
  66. package/core/skills/qc/qa-analyst/DOC_GAPS.template.md +0 -63
@@ -1,7 +1,9 @@
1
1
  ---
2
2
  version: 1.0
3
3
  updated: 2026-06-11
4
- ported_from: ai-automation-qc-base
4
+ ported_from: ui-automation-testing
5
+ upstream_path: skills/qa-tc-analyst/test-plan.md
6
+ upstream_sha: f259b4d123c565a42ba6c6ec96980a8e4c66284f
5
7
  ---
6
8
 
7
9
  # Lập Test Plan
@@ -10,15 +12,15 @@ Tổng hợp **output của qa-analyst** thành **Test Plan** cho một feature.
10
12
 
11
13
  **Đầu vào (bắt buộc, chỉ 2 nguồn — đúng 2 file qa-analyst trả ra):**
12
14
  1. `{paths.qc_dir}/{UC-ID}/REQUIREMENT_ANALYSIS.md` — chức năng, BR-xx, AC-xx, data flow (qa-analyst).
13
- 2. `{paths.qc_dir}/{UC-ID}/DOC_GAPS.md` — bảng gap GAP-xx, mức độ, gap Blocker (qa-analyst).
15
+ 2. `{paths.qc_dir}/{UC-ID}/DOC_GAP.md` — bảng gap GAP-xx, mức độ, gap Blocker (qa-analyst).
14
16
 
15
17
  ## Khi nào trigger
16
18
  - "lập test plan cho [Feature]" / "viết test plan"
17
- - Sau khi qa-analyst xong (đã có REQUIREMENT_ANALYSIS + DOC_GAPS)
19
+ - Sau khi qa-analyst xong (đã có REQUIREMENT_ANALYSIS + DOC_GAP)
18
20
  - Trước khi qa-designer thiết kế chi tiết TC — test plan là khung định hướng
19
21
 
20
22
  ## Khi KHÔNG trigger
21
- - Chưa có REQUIREMENT_ANALYSIS / DOC_GAPS → chạy qa-analyst trước
23
+ - Chưa có REQUIREMENT_ANALYSIS / DOC_GAP → chạy qa-analyst trước
22
24
  - Thiết kế test case chi tiết (.Test.md) → dùng qa-designer
23
25
  - Bóc tách yêu cầu/spec, lập danh sách gap → dùng qa-analyst
24
26
 
@@ -28,7 +30,7 @@ Tổng hợp **output của qa-analyst** thành **Test Plan** cho một feature.
28
30
 
29
31
  1. Đọc `REQUIREMENT_ANALYSIS.md`: nắm chức năng, các BR-xx và AC-xx, data flow,
30
32
  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à
33
+ 2. Đọc `DOC_GAP.md`: lấy danh sách gap, đặc biệt **gap Blocker còn Open** → đây là
32
34
  nguồn cho cột "Phụ thuộc" và cho Entry criteria.
33
35
  3. Map mỗi nhóm BR sang **layer test** của qa-designer: functional/gui-screen,
34
36
  gui-feature, api, integration, e2e/journey, non-functional.
@@ -47,7 +49,8 @@ Tổng hợp **output của qa-analyst** thành **Test Plan** cho một feature.
47
49
  criteria yêu cầu đóng các gap đó trước khi thiết kế TC.
48
50
  - Liệt kê **E2E journey** đầy đủ (mỗi journey: tiền điều kiện, kết quả/định tuyến kỳ
49
51
  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.
52
+ - Mục Rủi ro: **nạp `risk-model.md`** quét đủ 7 nguồn, chấm khả năng × thiệt hại → P0–P3,
53
+ rồi dùng mức đó chia độ sâu test. Đừng chấm thẳng ra P0/P1 theo cảm tính.
51
54
 
52
55
  ---
53
56
 
@@ -63,7 +66,7 @@ Tổng hợp **output của qa-analyst** thành **Test Plan** cho một feature.
63
66
  | Feature / Project / Module | … |
64
67
  | Người lập | qa-planner |
65
68
  | Ngày / Phiên bản | … |
66
- | Nguồn | REQUIREMENT_ANALYSIS · DOC_GAPS |
69
+ | Nguồn | REQUIREMENT_ANALYSIS · DOC_GAP |
67
70
 
68
71
  ## 1. Mục tiêu
69
72
  Mục tiêu test của feature (1–3 câu).
@@ -95,12 +98,12 @@ Kỹ thuật áp dụng: EP+BVA, Decision Table (cho logic điều kiện), stat
95
98
  integration, negative/exploratory; tự động hoá theo `CLAUDE.md` (Playwright + pytest-playwright + Trace + pytest-html).
96
99
 
97
100
  ## 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.
101
+ - **Entry:** gap Blocker (trong DOC_GAP) đã Answered; doc phụ thuộc sẵn sàng; môi trường + tài khoản role.
99
102
  - **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
103
 
101
104
  ## 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)
105
+ | Rủi ro | Nguồn | Khả năng | Thiệt hại | Mức | Giảm thiểu |
106
+ (cách chấm mức + 7 nguồn rủi ro + cách dùng mức để chia độ sâu test: xem `risk-model.md`)
104
107
 
105
108
  ## 7. Dữ liệu & Môi trường
106
109
  Tài khoản các role, dữ liệu mẫu (biên/edge), môi trường staging.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  version: 1.0
3
3
  updated: 2026-06-11
4
- ported_from: ai-automation-qc-base
4
+ ported_from: ui-automation-testing
5
5
  ---
6
6
 
7
7
  # Review Test Script — E2E Journey
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  version: 1.0
3
3
  updated: 2026-06-11
4
- ported_from: ai-automation-qc-base
4
+ ported_from: ui-automation-testing
5
5
  ---
6
6
 
7
7
  # Review Session Note — Exploratory
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  version: 1.0
3
3
  updated: 2026-06-11
4
- ported_from: ai-automation-qc-base
4
+ ported_from: ui-automation-testing
5
5
  ---
6
6
 
7
7
  # Review Test Script — Functional
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  version: 1.0
3
3
  updated: 2026-06-11
4
- ported_from: ai-automation-qc-base
4
+ ported_from: ui-automation-testing
5
5
  ---
6
6
 
7
7
  # Review Test Script — Integration
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  version: 1.0
3
3
  updated: 2026-06-11
4
- ported_from: ai-automation-qc-base
4
+ ported_from: ui-automation-testing
5
5
  ---
6
6
 
7
7
  # Review Test Script — Non-Functional
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  version: 1.0
3
3
  updated: 2026-06-11
4
- ported_from: ai-automation-qc-base
4
+ ported_from: ui-automation-testing
5
5
  ---
6
6
 
7
7
  # Review Test Case — E2E Journey
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  version: 1.0
3
3
  updated: 2026-06-11
4
- ported_from: ai-automation-qc-base
4
+ ported_from: ui-automation-testing
5
5
  ---
6
6
 
7
7
  # Review Charter — Exploratory
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  version: 1.0
3
3
  updated: 2026-06-11
4
- ported_from: ai-automation-qc-base
4
+ ported_from: ui-automation-testing
5
5
  ---
6
6
 
7
7
  # Review Test Case — Functional
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  version: 1.0
3
3
  updated: 2026-06-11
4
- ported_from: ai-automation-qc-base
4
+ ported_from: ui-automation-testing
5
5
  ---
6
6
 
7
7
  # Review Test Case — Integration
@@ -21,7 +21,7 @@ Review bộ TC tích hợp (GUI↔Backend, API, DB) và đánh giá chất lư
21
21
  ## Phase 1 — Clarify
22
22
 
23
23
  1. Đọc tất cả TC integration trong folder chỉ định; xác định loại: GUI↔Backend / API / DB
24
- 2. Đọc REQUIREMENT_ANALYSIS + DOC_GAPS nếu có
24
+ 2. Đọc REQUIREMENT_ANALYSIS + DOC_GAP nếu có
25
25
  3. Xác định chuỗi tích hợp (caller → component → downstream)
26
26
 
27
27
  ---
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  version: 1.0
3
3
  updated: 2026-06-11
4
- ported_from: ai-automation-qc-base
4
+ ported_from: ui-automation-testing
5
5
  ---
6
6
 
7
7
  # Review Test Case — Non-Functional
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  version: 1.0
3
3
  updated: 2026-06-11
4
- ported_from: ai-automation-qc-base
4
+ ported_from: ui-automation-testing
5
5
  ---
6
6
 
7
7
  # Gen Script — E2E Journey
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  version: 1.0
3
3
  updated: 2026-06-11
4
- ported_from: ai-automation-qc-base
4
+ ported_from: ui-automation-testing
5
5
  ---
6
6
 
7
7
  # Session Template & Convert Findings — Exploratory
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  version: 1.0
3
3
  updated: 2026-06-11
4
- ported_from: ai-automation-qc-base
4
+ ported_from: ui-automation-testing
5
5
  ---
6
6
 
7
7
  # Gen Script — Functional API
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  version: 1.0
3
3
  updated: 2026-06-11
4
- ported_from: ai-automation-qc-base
4
+ ported_from: ui-automation-testing
5
5
  ---
6
6
 
7
7
  # Gen Script — Functional GUI Feature (đa màn hình)
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  version: 1.0
3
3
  updated: 2026-06-11
4
- ported_from: ai-automation-qc-base
4
+ ported_from: ui-automation-testing
5
5
  ---
6
6
 
7
7
  # Gen Script — Functional GUI Screen (1 màn hình)
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  version: 1.0
3
3
  updated: 2026-06-11
4
- ported_from: ai-automation-qc-base
4
+ ported_from: ui-automation-testing
5
5
  ---
6
6
 
7
7
  # Gen Script — Integration
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  version: 1.0
3
3
  updated: 2026-06-11
4
- ported_from: ai-automation-qc-base
4
+ ported_from: ui-automation-testing
5
5
  ---
6
6
 
7
7
  # Gen Script — Non-Functional
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  version: 1.1
3
3
  updated: 2026-06-11
4
- ported_from: ai-automation-qc-base
4
+ ported_from: ui-automation-testing
5
5
  ---
6
6
 
7
7
  # Report — Playwright Trace + pytest-html (stack chuẩn)
@@ -0,0 +1,231 @@
1
+ # Gap Verify — cổng thẩm định độc lập, chống finding bịa
2
+
3
+ **Vì sao có cái này:** `steps/review-fanout.md` chỉ có một chiều lực — vòng
4
+ completeness-critic ở Phase 2 luôn hỏi *"còn thiếu gì nữa?"*, nên nó đẩy **recall** lên
5
+ và **không có gì kéo precision lại**. Fan-out càng rộng, critic càng lặp, thì finding bịa
6
+ càng nhiều: khẳng định hành vi spec không nêu, trích evidence sai, hoặc gắn nhãn "gap"
7
+ cho thứ thực ra là chuyện làm-kỹ-test.
8
+
9
+ Bước này là nửa còn thiếu đó. Nó **mở lại tài liệu nguồn** và bắt mỗi finding tự chứng minh
10
+ trước khi được giữ.
11
+
12
+ > **Nguyên tắc tối thượng:** một finding chỉ hợp lệ khi có **ĐỦ 2 vế** —
13
+ > **(1)** spec nguồn nêu hoặc ngụ ý hành vi X, **VÀ** **(2)** không tài liệu nào trong nguồn
14
+ > trả lời/phủ X. Thiếu một trong hai → **không phải finding**.
15
+
16
+ > ⚠️ **Cấm dùng chính trường evidence/quote của finding làm bằng chứng.** Phải mở file nguồn
17
+ > và đọc lại đoạn được trích — evidence có thể bị diễn giải sai hoặc bịa. Đây là toàn bộ lý do
18
+ > bước này tồn tại; bỏ qua nó thì bước này chỉ là một vòng critic nữa.
19
+
20
+ *Ported từ `ui-automation-testing` — `skills/qa-tc-analyst/gap-verifier.md`.*
21
+
22
+ ---
23
+
24
+ ## Tham số lệnh gọi truyền vào
25
+
26
+ | Tham số | Bắt buộc | Nghĩa |
27
+ |---|:---:|---|
28
+ | `FINDINGS` | ✅ | Tập finding cần thẩm định. Chỉ xét cái đang ở trạng thái mở (`Open` / `pending`); bỏ qua cái đã đóng trừ khi được yêu cầu soát lại. |
29
+ | `EVIDENCE_ROOT` | ✅ | Nơi chứa **sự thật gốc** — mặc định `{paths.specs_dir}` (spec submodule của PO). Verifier chỉ được lấy căn cứ từ đây. |
30
+ | `VERDICT_FIELD` | ✅ | Ghi kết quả vào đâu. `/qc-analyze` → cột `Trạng thái` + `Câu trả lời` của bảng gap; `/refine-prd` · `/review-context` → `status` + `suggestion` của findings YAML. |
31
+ | `RERATE` | | `on` (mặc định) chạy GIAI ĐOẠN 1B — hiệu chỉnh mức độ. `off` bỏ qua, chỉ giữ/bỏ. |
32
+
33
+ > **Bỏ qua ở chế độ sub-agent:** nếu Gate Bước 0 đã set `_agent_mode: true`, orchestrator
34
+ > chịu trách nhiệm gọi bước này một lần trên tập finding đã hợp nhất — sub-agent **không**
35
+ > tự verify phần của mình (verify từng mảnh rời không thấy được T6 trùng lặp).
36
+
37
+ ---
38
+
39
+ ## RÀNG BUỘC NGUỒN
40
+
41
+ - **Chỉ `EVIDENCE_ROOT`** làm căn cứ. **KHÔNG** dùng artifact nội bộ do chính pipeline sinh ra
42
+ (`{paths.qc_dir}/**`, `{paths.refinement_dir}/**`, test-case, report) — đó là vòng lặp:
43
+ lấy kết luận của mình làm bằng chứng cho mình.
44
+ - **Bỏ qua** — không đọc, không trích làm căn cứ — các section **Change Log**, **Appendix**,
45
+ và **Giả định AI / AI Assumptions** trong mọi tài liệu. Căn cứ chỉ lấy từ **thân bài**
46
+ (AC · BR · UC · Wireframe · Screen Spec · Scenario).
47
+ *Change log là "delta narrative", phải re-ground về thân bài; Appendix và Giả định AI là
48
+ ghi chú nháp, không phải nguồn chân lý.*
49
+ - Đọc **cả tài liệu gốc cấp trên** (`{paths.product_definitions_dir}/`) và **tài liệu liên quan**
50
+ (`{paths.business_dictionary}`, `{paths.core_entities}`) — một finding có thể đã được trả lời
51
+ ở tài liệu khác, không riêng spec đang xét.
52
+
53
+ ---
54
+
55
+ ## 5 anti-pattern — nhận diện trước khi kết luận
56
+
57
+ | # | Anti-pattern | Dấu hiệu |
58
+ |---|---|---|
59
+ | **AP1** | Phạm vi tích hợp lẫn vào spec nghiệp vụ | Finding nói về API contract, queue, service-to-service, retry backend, webhook — thứ PRD đã khai "ngoài phạm vi" |
60
+ | **AP2** | Rule cha bị tính là thiếu ở con | *"PRD con không mô tả X"* mà X đã có trong `{paths.product_definitions_dir}/` — PRD con **kế thừa** cha theo thiết kế |
61
+ | **AP3** | Finding UI tạo ra mà chưa đọc design-spec | *"thiếu behavior/navigation/state X"* mà X được mô tả rõ trong design-spec §Actions / §Screen States |
62
+ | **AP4** | Bias "nhiều finding = làm kỹ" | Cố sinh nhiều để thể hiện thoroughness. **5 finding thật tốt hơn 22 finding với 20 cái ảo.** Không cần điền đủ K nếu thực tế chỉ có M < K |
63
+ | **AP5** | Trích từ nguồn cấm | Evidence tham chiếu §Giả định AI / AI Assumptions / Change Log |
64
+ | **AP6** | Nâng note thứ cấp thành finding | Một ghi chú *"nghi X lệch"* trong BDD/design-spec là **claim cần verify, KHÔNG phải bằng chứng**. Chưa mở nguồn sơ cấp (PRD·BR·contract·Figma) thì chưa được raise. Không mở được asset → ghi *"chưa verify — cần Designer xác nhận"*, KHÔNG khẳng định *"asset đang sai"* |
65
+
66
+ ---
67
+
68
+ ## 3 câu hỏi lọc bắt buộc
69
+
70
+ Mỗi finding phải vượt **cả ba**. Rớt bất kỳ câu nào → loại.
71
+
72
+ | Câu | Giữ khi | Rớt thì |
73
+ |---|---|---|
74
+ | **Q1** — *"X đã được spec ở design-spec / product-definition / tech-docs chưa?"* | **Chưa** — tìm khắp `EVIDENCE_ROOT` không thấy | `❌ INVALID — spec đã trả lời` |
75
+ | **Q2** — *"X có thuộc phạm vi spec này không?"* | **Có** — spec này đặc tả hành vi X | `❌ INVALID — ngoài phạm vi` |
76
+ | **Q3** — *"Người thực thi tự quyết được không cần PO/BA confirm?"* | **Không** — bắt buộc cần PO/BA chốt | `⚠️ RECLASSIFY` (xem T5d/T5e) |
77
+
78
+ > **Q3 là câu bảo vệ thời gian của PO.** Mọi thứ QC/dev tự quyết được mà vẫn đẩy lên PO
79
+ > đều là chi phí thuần — và tệ hơn, nó làm loãng những câu thật.
80
+
81
+ ---
82
+
83
+ ## GIAI ĐOẠN 1 — T1…T6 cho từng finding
84
+
85
+ Chạy tuần tự. Rớt bất kỳ test nào → không hợp lệ, ghi verdict tương ứng.
86
+
87
+ ### T1 — Evidence có thật & đúng nội dung *(chống bịa trích dẫn)*
88
+ Mở đúng file/section mà finding trích. Tìm đoạn nguyên văn.
89
+ - **FAIL nếu:** trích dẫn không tồn tại · bị diễn giải sai lệch nghĩa · hoặc đoạn trích
90
+ **không thực sự nói điều finding khẳng định**.
91
+ - **FAIL nếu evidence trích từ Change Log / Appendix / Giả định AI** — nguồn cấm.
92
+ Phải re-ground về thân AC/BR/UC/Wireframe; thân bài không nói điều đó → finding sai.
93
+ - → `❌ INVALID — evidence bịa/sai/nguồn-cấm`
94
+
95
+ ### T2 — Hành vi "thiếu" đúng là yêu cầu của spec *(chống bịa yêu cầu)*
96
+ Với finding MISSING/AMBIGUOUS: spec nguồn **có thật sự nêu hoặc ngụ ý** hành vi X không?
97
+ - **FAIL nếu:** X **không được tài liệu nào yêu cầu** — finding tự nghĩ ra một yêu cầu
98
+ rồi than spec không mô tả nó.
99
+ - → `❌ INVALID — yêu cầu tự bịa`
100
+
101
+ ### T3 — Chưa được trả lời ở nơi khác *(chống finding đã cover)*
102
+ Tìm khắp `EVIDENCE_ROOT` (gồm tài liệu gốc + liên quan) xem câu hỏi đã có lời đáp chưa —
103
+ kể cả **trả lời ngầm định** bằng cách diễn đạt điều kiện.
104
+ - → `❌ INVALID — spec đã trả lời` *(kèm trích nguồn trả lời)*
105
+
106
+ ### T3b — Mâu thuẫn thật hay chỉ khác UC/pha *(chỉ áp cho finding CONTRADICTORY)*
107
+ Xác định **UC + pha** của TỪNG rule (chuẩn bị / thực hiện / nộp / công bố / quay lại).
108
+ - **FAIL nếu:** hai rule thuộc **UC/pha khác nhau** → thường là ngữ cảnh **tuần tự** hoặc
109
+ **không giao nhau**, không phải mâu thuẫn tại cùng một thời điểm quyết định.
110
+ - → `❌ INVALID — khác UC/pha, không mâu thuẫn`
111
+
112
+ ### T4 — Kế thừa tài liệu gốc *(chống "con không lặp lại cha")*
113
+ Rule đã định nghĩa trong `{paths.product_definitions_dir}/` thì việc spec con không lặp lại
114
+ **không phải finding**.
115
+ - → `❌ INVALID — đã có ở tài liệu gốc`
116
+
117
+ ### T5 — Đúng loại *(chống phân loại nhầm)*
118
+
119
+ > ⚠️ **BẮT BUỘC xác định HƯỚNG trước khi gán loại** (tài liệu dẫn xuất so với PRD):
120
+ > - **THIẾU (dẫn xuất < PRD):** PRD yêu cầu màn/rule mà design/BDD KHÔNG có → `MISSING`.
121
+ > Xử lý = bổ sung vào tài liệu dẫn xuất.
122
+ > - **THỪA (dẫn xuất > PRD):** design/BDD **tự thêm** hành vi PRD không sanction →
123
+ > `CONTRADICTORY`, **KHÔNG dùng `MISSING`**. Xử lý = PO chốt giữ (định nghĩa hệ quả vào PRD)
124
+ > hay gỡ.
125
+ >
126
+ > Sai hướng = framing sai — gọi *"design thiếu"* trong khi design **thừa**.
127
+
128
+ | Nhóm | Nghĩa | Verdict |
129
+ |---|---|---|
130
+ | **(a)** Finding nghiệp vụ thật | spec nêu hành vi, không tài liệu nào phủ | `✅ VALID` — giữ mở |
131
+ | **(b)** Lệch đồng bộ (SYNC) | PRD đã cập nhật nhưng design-spec / BDD chưa phản ánh nội dung mới | `✅ VALID — SYNC` — **giữ mở**, mức Low–Medium, giao đội spec. KHÔNG đóng: cần track để cập nhật |
132
+ | **(c)** Metadata lệch | chênh version header, sai tên trace, format — **nội dung nghiệp vụ vẫn đúng** | `⚠️ RECLASSIFY — metadata` |
133
+ | **(d)** Làm-kỹ-test | thêm giá trị biên, liệt kê đủ ô decision table, biến thể dữ liệu — mà **rule/behavior đã được phủ** | `⚠️ RECLASSIFY — làm-kỹ-test` |
134
+ | **(e)** Tech/UX tự quyết | số lần retry, timeout/delay, loading spinner, animation, exact-copy nút/label, xử lý crash, cơ chế lưu session — thuộc Dev/Design, không phải PO/BA | `⚠️ RECLASSIFY — tech/UX tự quyết` |
135
+
136
+ > **Ranh giới SYNC vs metadata:** SYNC = *nội dung* PRD mới chưa được phản ánh vào tài liệu
137
+ > dẫn xuất (section còn thiếu). Metadata = chỉ số version lệch, nội dung đã đúng.
138
+ >
139
+ > **Ranh giới (c)(d) vs (a):** nếu **bản thân hành vi/rule đã có scenario hoặc mô tả phủ**,
140
+ > mọi đề xuất *"thêm ca biên / thêm giá trị / đủ ô bảng"* đều là (d), KHÔNG phải finding.
141
+ >
142
+ > **Ngoại lệ GIỮ ở (e):** *ý chính / khung thông điệp* của popup do PO chốt intent;
143
+ > và mọi ranh giới pháp lý / privacy.
144
+
145
+ ### T6 — Không trùng lặp *(chống double-count)*
146
+ So với các finding còn lại: cùng root cause → merge, giữ một, ghi rõ *"merge từ …"*.
147
+ - → `🔁 MERGE → {id}`
148
+
149
+ **Qua sạch T1–T6 (+T3b nếu CONTRADICTORY) → `✅ VALID`.**
150
+
151
+ ---
152
+
153
+ ## GIAI ĐOẠN 1B — Hiệu chỉnh mức độ *(chạy khi `RERATE=on`)*
154
+
155
+ T1–T6 quyết định finding **còn hay bỏ**; giai đoạn này quyết định cái còn lại **nặng hay nhẹ**.
156
+ Nhiều finding hợp lệ về mặt tồn tại nhưng **bị gán mức quá cao** — và một danh sách toàn
157
+ 🔴 Critical thì không xếp được ưu tiên, tức mất luôn giá trị của cột mức độ.
158
+
159
+ Với **mỗi** finding còn mở, hạ mức hoặc chuyển sang "ghi chú phạm vi" nếu rơi vào một trong
160
+ năm nhóm sau — cả năm đều **không phải lỗ hổng của feature đang xét**:
161
+
162
+ | # | Nhóm | Dấu hiệu | Xử lý |
163
+ |---|---|---|---|
164
+ | **R1** | Lệch pha với tài liệu gốc | Mâu thuẫn thật giữa PRD con (đã duyệt, version mới hơn) và product-definition / dictionary về cùng một quan sát | → **Low**, nhãn *"master-sync"*. Con chi phối ⇒ không ảnh hưởng test. Không chặn |
165
+ | **R2** | Spec con tự rõ, chỉ nền domain lệch | PRD con phát biểu dứt khoát; chỉ dictionary/master mâu thuẫn | → **ghi chú phạm vi** (không phải finding của feature); đề nghị sync riêng nền domain |
166
+ | **R3** | Nguồn tự đánh dấu "giả định" | Evidence là mục trong design-spec có cảnh báo ⚠️ *"là giả định, cần Designer bổ sung"* | → **ghi chú phạm vi**, không lập finding *(đồng nhất luật AP5)* |
167
+ | **R4** | Nhánh phòng vệ bất-khả-đạt | Nhánh guard chỉ chạy trên dữ liệu **ngoài** enum hợp lệ; ca đạt tới được đã có phủ | → **Low**, nhãn *"test-design"* — vấn đề cách mô phỏng dữ liệu, không phải mơ hồ spec |
168
+ | **R5** | Greenfield thiếu tech-doc | Thiếu openapi/tech-doc cho hành động lõi ở feature xây mới | → nhãn *"feasibility"* — chặn **tự-động-hoá**, KHÔNG phải khuyết tật nghiệp vụ ở tầng PRD |
169
+
170
+ > **Mẹo chi phối:** một *pass-through rule* (hệ thống KHÔNG validate gì) làm tan phần lớn
171
+ > "mơ hồ" vì không có bề mặt test → hạ mạnh. Ngược lại, drift mà **chính PRD tự flag**, hoặc
172
+ > mơ hồ ở **luồng chính có giao diện**, là finding THẬT — giữ nguyên mức.
173
+
174
+ **Cách ghi:** GIỮ mô tả gốc (audit trail), thêm mục *"Phản biện & Re-rating"* liệt kê lý do
175
+ từng thay đổi mức, rồi cập nhật cột mức độ. Finding chuyển hẳn sang "ghi chú phạm vi" thì
176
+ đánh dấu rõ — **KHÔNG xoá**.
177
+
178
+ ---
179
+
180
+ ## GIAI ĐOẠN 2 — Bảng thẩm định
181
+
182
+ Xuất bảng verdict *(không chèn dòng trắng giữa các hàng — dòng trắng làm vỡ bảng Markdown)*:
183
+
184
+ | ID | Verdict | Test rớt | Bằng chứng thẩm định (mở file nguồn) |
185
+ |---|---|---|---|
186
+ | … | `✅ VALID` / `❌ INVALID` / `⚠️ RECLASSIFY` / `🔁 MERGE` | T1..T6 / — | trích đúng dòng trong `EVIDENCE_ROOT` chứng minh verdict |
187
+
188
+ **Số liệu tổng:** tổng verify = N · VALID = a · INVALID = b · RECLASSIFY = c · MERGE = d.
189
+
190
+ ---
191
+
192
+ ## GIAI ĐOẠN 3 — Áp verdict vào `VERDICT_FIELD`
193
+
194
+ **KHÔNG XOÁ finding nào** — giữ audit trail. Đóng kèm lý do thì kiểm chứng được; xoá thì không.
195
+
196
+ | Verdict | Áp thế nào |
197
+ |---|---|
198
+ | `✅ VALID` | giữ nguyên, trạng thái mở |
199
+ | `✅ VALID — SYNC` | giữ mở, loại `SYNC`, mức Low–Medium, giao đội spec; phần trả lời để trống |
200
+ | `❌ INVALID` | → **đóng**; ghi lý do ngắn + trích nguồn (vd *"Closed — spec đã trả lời tại §BR13: …"*) |
201
+ | `⚠️ RECLASSIFY` | → **đóng**; ghi rõ *"Không phải finding nghiệp vụ — [metadata / làm-kỹ-test / tech-UX tự quyết]"* + đề xuất chuyển sang mục việc tương ứng |
202
+ | `🔁 MERGE` | → **đóng**; ghi *"Trùng root cause với {id}"* |
203
+
204
+ Sau khi áp:
205
+ 1. Cập nhật **tổng số** ở header + bảng **ưu tiên xử lý** — chỉ đếm cái còn mở.
206
+ 2. Kiểm format bảng Markdown: **không có dòng trắng giữa các hàng**.
207
+ 3. Nếu artifact có section liệt kê **tài liệu đã đọc**: verifier vừa mở trực tiếp nguồn nên
208
+ đối chiếu lại — file đã dùng làm evidence mà **thiếu** trong bảng, hoặc file liệt kê nhưng
209
+ không tồn tại → sửa cho khớp.
210
+
211
+ ---
212
+
213
+ ## Đầu ra + cam kết
214
+
215
+ In tóm tắt:
216
+
217
+ ```
218
+ [GAP VERIFY] {artifact} — verify {N} finding đang mở:
219
+ ✅ VALID: {a} | ❌ INVALID: {b} | ⚠️ RECLASSIFY: {c} | 🔁 MERGE: {d}
220
+ INVALID chi tiết: {id} (evidence bịa), {id} (spec đã trả lời), …
221
+ Sau verify còn {a} finding nghiệp vụ đang mở.
222
+ ```
223
+
224
+ **Cam kết cuối — bắt buộc in nguyên văn:**
225
+
226
+ > *"Đã mở trực tiếp file nguồn trong `{EVIDENCE_ROOT}` để kiểm chứng từng finding — KHÔNG dựa
227
+ > vào trường evidence của artifact. Mỗi finding còn mở đều có đủ 2 vế: spec nêu hành vi +
228
+ > không tài liệu nào phủ. Không giữ lại finding bịa/sai sự thật."*
229
+
230
+ Cam kết này **không phải nghi thức**: nó là chỗ duy nhất bước này tự khai đã làm đúng việc
231
+ mà không ai kiểm được từ bên ngoài. Không in được cam kết ⇒ chưa chạy đúng bước.
@@ -8,10 +8,11 @@ vòng không sinh thêm gì mới, *trước khi* ghi file findings.
8
8
 
9
9
  Lệnh gọi cung cấp hai thứ bắt buộc + hai tuỳ chọn:
10
10
  - **DIMENSIONS** — danh sách các chiều review để fan out
11
- (`/refine-prd` → 3 lăng kính; `/review-context` → các P-check hoặc B-check).
11
+ (`/refine-prd` → 4 lăng kính; `/review-context` → các P-check hoặc B-check; `/qc-analyze` → 3 lăng kính quét gap).
12
12
  - **FINDINGS SCHEMA** — dạng YAML mà mỗi finding phải theo (định nghĩa trong lệnh).
13
13
  - **GRANULARITY** *(tuỳ chọn, mặc định `auto`)* — `auto`: chọn độ mịn fan-out theo bảng ngưỡng kích thước ở Phase 1 (hành vi cũ). `per-uc`: **LUÔN** fan-out theo từng UC, **bỏ qua ngưỡng** — dùng cho review cần độ đầy đủ cao (`/refine-prd` truyền cái này để lần đầu đã quét sâu). Lệnh không truyền → `auto` → hành vi không đổi.
14
14
  - **CHANGED_SCOPE** *(tuỳ chọn)* — danh sách UC/section đã thay đổi (review **delta**). Nếu được truyền, Phase 1 chỉ fan-out trên các phạm vi này + PRD-global; Phase 2 critic vẫn quét **toàn doc** làm lưới an toàn. Không truyền → quét toàn bộ như thường.
15
+ - **VERIFY** *(tuỳ chọn, mặc định `off`)* — `on` chèn **Phase 2.5** (`steps/gap-verify.md`) giữa critic và dedup: mỗi finding phải mở lại tài liệu nguồn tự chứng minh trước khi được giữ. Không truyền → hành vi không đổi.
15
16
 
16
17
  > **Bỏ qua ở chế độ sub-agent:** Nếu Gate Bước 0 đã set `_agent_mode: true`, toàn bộ
17
18
  > quy trình này bị **bỏ qua** — orchestrator đã chạy sẵn một dimension/UC cho mỗi
@@ -130,6 +131,31 @@ Ghi lại `convergence_rounds` (số vòng critic đã chạy) cho report.
130
131
 
131
132
  ---
132
133
 
134
+ ## Phase 2.5 — Thẩm định *(chỉ chạy khi `VERIFY = on`)*
135
+
136
+ **Vì sao có bước này.** Phase 1 và Phase 2 chỉ có **một chiều lực**: fan-out mở rộng bề
137
+ ngang, critic lặp cho tới khi không còn gì mới — cả hai đều hỏi *"còn thiếu gì nữa?"*.
138
+ Không có gì hỏi ngược lại *"cái vừa tìm ra có thật không?"*. Nên quy trình này đẩy **recall**
139
+ lên mà **không có gì kéo precision lại**, và càng lặp critic thì tỉ lệ finding bịa càng cao —
140
+ đúng thứ nó tự sinh ra: khẳng định hành vi tài liệu không nêu, trích evidence sai, hoặc gắn
141
+ nhãn vấn đề cho thứ thực ra là chuyện làm-kỹ-hơn.
142
+
143
+ Chạy `steps/gap-verify.md` trên `ALL_FINDINGS` với:
144
+ - `FINDINGS` = `ALL_FINDINGS` (sau Phase 2)
145
+ - `EVIDENCE_ROOT` = `{paths.specs_dir}` — hoặc giá trị lệnh gọi chỉ định
146
+ - `VERDICT_FIELD` = trường trạng thái của FINDINGS SCHEMA mà lệnh định nghĩa
147
+ - `RERATE` = `on`
148
+
149
+ Finding bị `❌ INVALID` / `⚠️ RECLASSIFY` / `🔁 MERGE` **không đi tiếp sang Phase 3** — nhưng
150
+ **KHÔNG bị xoá**: chúng vào file findings với trạng thái đóng + lý do, để người đọc kiểm chứng
151
+ được vì sao chúng bị loại. Ghi lại số liệu verdict cho report.
152
+
153
+ > **Chạy TRƯỚC Phase 3, không phải sau.** Dedup và giải quyết xung đột là việc tốn suy luận;
154
+ > làm nó trên một tập còn lẫn finding bịa là vừa phí, vừa nguy hiểm — một finding ảo có thể
155
+ > "thắng" một finding thật ở bước giữ-cái-severity-cao-hơn.
156
+
157
+ ---
158
+
133
159
  ## Phase 3 — Dedup, giải quyết xung đột, merge
134
160
 
135
161
  Các sub-agent chạy **mù với nhau** (độc lập = độ phủ đa dạng). Chúng không bao giờ
@@ -63,14 +63,14 @@ paths:
63
63
  refinement_dir: ".agent/review"
64
64
 
65
65
  # QC's OWN analysis/design working docs (qc-analyze/plan/design-test outputs:
66
- # REQUIREMENT_ANALYSIS.md, DOC_GAPS.md, TEST_PLAN.md, test-cases/*.Test.md).
66
+ # REQUIREMENT_ANALYSIS.md, DOC_GAP.md, TEST_PLAN.md, test-cases/*.Test.md).
67
67
  # One subfolder per UC: {qc_dir}/{UC-ID}/. Default "docs" (the QC team's own
68
68
  # convention), VISIBLE — not hidden under .agent/. NOTE: specs (PRD / .feature /
69
69
  # design-spec) are NOT here — they come from the PO spec submodule (spec_source).
70
70
  qc_dir: "docs"
71
71
 
72
72
  # WHERE the qc-* commands LOAD their skills from (qa-analyst / qa-designer / qa-planner
73
- # / qa-reviewer / qa-runner + DOC_GAPS.template.md). Default = the framework-bundled
73
+ # / qa-reviewer / qa-runner + DOC_GAP.template.md). Default = the framework-bundled
74
74
  # copy at .agent/skills/qc (works standalone). The QC team OWNS these skills in their
75
75
  # canonical repo (ai-automation-qc-base) — point this at that repo/submodule (e.g.
76
76
  # "qc-base/.claude/skills") so the skills evolve INDEPENDENTLY and are NOT overwritten
@@ -38,7 +38,7 @@
38
38
 
39
39
  | Artifact | Nội dung |
40
40
  |----------|----------|
41
- | `docs/{UC-ID}/…` | `REQUIREMENT_ANALYSIS.md`, `DOC_GAPS.md`, `TEST_PLAN.md`, `test-cases/*.Test.md` |
41
+ | `docs/{UC-ID}/…` | `REQUIREMENT_ANALYSIS.md`, `DOC_GAP.md`, `TEST_PLAN.md`, `test-cases/*.Test.md` |
42
42
  | Script Python pytest-playwright | Sinh từ `.Test.md` đã review |
43
43
  | Cột `qc_status` trong `.trace/…/{UC-ID}-{platform}.tsv` | Trạng thái QC **chính thức** |
44
44
  | Evidence + report | `/qc-report` — kèm product-gap đẩy về PO/Dev |
@@ -70,7 +70,7 @@ Dây chuyền **6 trạm**, output trạm trước là input trạm sau:
70
70
 
71
71
  | # | Trạm | Việc |
72
72
  |---|------|------|
73
- | 1 | `/qc-analyze` | Phân rã yêu cầu + phát hiện **gap tài liệu** (`DOC_GAPS.md`) |
73
+ | 1 | `/qc-analyze` | Phân rã yêu cầu + phát hiện **gap tài liệu** (`DOC_GAP.md`) |
74
74
  | 2 | `/qc-plan` | Đánh giá **rủi ro** + câu hỏi cho dev (`TEST_PLAN.md`) |
75
75
  | 3 | `/qc-design-test` | Thiết kế **test case** dạng Markdown (`*.Test.md`) |
76
76
  | 4 | `/qc-review` | 🛑 **Cổng review** hai chiều: test case & script trước khi chạy |
@@ -89,7 +89,7 @@ Mọi lệnh chạy chung một **Gate** (model check → target → context-loa
89
89
 
90
90
  | Lệnh | Input | Output | Owner |
91
91
  |------|-------|--------|-------|
92
- | `/qc-analyze` | UC + spec | `REQUIREMENT_ANALYSIS.md`, `DOC_GAPS.md` | QA |
92
+ | `/qc-analyze` | UC + spec | `REQUIREMENT_ANALYSIS.md`, `DOC_GAP.md` | QA |
93
93
  | `/qc-plan` | Analysis | `TEST_PLAN.md` (rủi ro) | QA |
94
94
  | `/qc-design-test` | Plan | `test-cases/*.Test.md` | QA |
95
95
  | `/qc-review` | Test case/script | 🛑 Cổng review | QA |
@@ -1,8 +1,8 @@
1
1
  [← /extend-prd](02b-extend-prd.md) · [Explain Home](README.md) · [Next: /review-context →](04-review-context.md)
2
2
 
3
- # 03 · `/refine-prd` — Tinh chỉnh PRD qua 3 lăng kính
3
+ # 03 · `/refine-prd` — Tinh chỉnh PRD qua 4 lăng kính
4
4
 
5
- > **Một câu.** Fan-out review PRD qua **3 lăng kính DEV / SA / PO**, chạy **vòng lặp completeness-critic** để hội tụ đầy đủ trong một lần, rồi sinh file findings cho PO accept/reject ở Review Board.
5
+ > **Một câu.** Fan-out review PRD qua **4 lăng kính QA / DEV / SA / PO**, chạy **vòng lặp completeness-critic** để hội tụ đầy đủ trong một lần, rồi sinh file findings cho PO accept/reject ở Review Board.
6
6
 
7
7
  ---
8
8
 
@@ -33,9 +33,10 @@ Một lượt review đơn không bao giờ liệt kê hết vấn đề — mod
33
33
  Chạy qua step **review-fanout** với tham số `GRANULARITY = per-uc`:
34
34
 
35
35
  ### Phase 1 — Fan-out song song theo dimension
36
- - **DIMENSIONS = 3 lăng kính** (mỗi lăng kính một sub-agent, context window mới, quét toàn PRD chỉ qua lăng kính đó):
36
+ - **DIMENSIONS = 4 lăng kính** (mỗi lăng kính một sub-agent, context window mới, quét toàn PRD chỉ qua lăng kính đó):
37
37
  | Lăng kính | Soi gì |
38
38
  |-----------|--------|
39
+ | **QA** (tầng nghiệm thu) *(bật 2026-08-25)* | AC có nêu **outcome quan sát/kiểm được** chưa? AC có lặp nội dung BR (trùng tầng) không? — hỏi về **HÌNH THỨC**, KHÔNG về nội dung thiếu |
39
40
  | **DEV** (cơ chế nghiệp vụ) | BR + Business Logic đã đủ & không mơ hồ để build không phải đoán chưa? Nhánh nghiệp vụ thiếu, điều kiện biên, đường lỗi bỏ ngỏ |
40
41
  | **SA** (thông suốt & nhất quán) | Luồng nghiệp vụ thông suốt trên cả feature/domain? Tương tác UC, quan hệ entity, vòng đời trạng thái, ai-làm-gì |
41
42
  | **PO** | Scope khoanh vùng? Priority? Success metric? Rủi ro scope creep? |
@@ -66,7 +67,8 @@ Chạy qua step **review-fanout** với tham số `GRANULARITY = per-uc`:
66
67
 
67
68
  ## Cơ chế đặc biệt
68
69
 
69
- - **Không `--fix` mode** (khác `/review-context`)finding 3 lăng kính phán đoán DEV/SA/PO, **bắt buộc qua người** Board; `auto_fixable` chỉgợi ý quick-accept.
70
+ - **Lăng kính QA hẹp chủ ý** hỏi *"phát biểu này kiểm chứng được không?"*, KHÔNG hỏi *"còn thiếu gì?"*. Ở thời điểm PRD chỉ có PRD (design-spec/BDD/tech-doc chưa tồn tại), nên không phân biệt được *"PRD thiếu X"* với *"PRD để X cho design-spec"*. Câu hỏi nội dung thuộc `/qc-analyze`. Số liệu: review chỉ-PRD ra ~14 gap, review đủ 4 nguồn ra ~9,4 — chênh lệch câu tài liệu sau trả lời hộ.
71
+ - **Không có `--fix` mode** (khác `/review-context`) — finding 4 lăng kính là phán đoán QA/DEV/SA/PO, **bắt buộc qua người** ở Board; `auto_fixable` chỉ là gợi ý quick-accept.
70
72
  - **`resolution_edge_cases`** — phân tích bậc-hai (chỉ critical/major): "nếu chốt phương án này thì đẻ ra edge case gì?" → PO thấy trước khi accept (advisory, không chặn).
71
73
  - **QA lens đang DISABLED** (comment trong file) — có hướng dẫn bật lại nếu cần.
72
74
 
@@ -74,10 +76,10 @@ Chạy qua step **review-fanout** với tham số `GRANULARITY = per-uc`:
74
76
 
75
77
  ## 👓 Góc nhìn tối ưu
76
78
 
77
- - **Đây là command tốn agent/token nhất phía thượng nguồn** — `per-uc` × 3 lăng kính × (UC+1) + tới 3 vòng critic. `AGENT_CAP=12` là núm chỉnh chính. Với PRD lớn, đây là điểm cần cân đối chi phí ↔ độ đầy đủ.
79
+ - **Đây là command tốn agent/token nhất phía thượng nguồn** — `per-uc` × 4 lăng kính × (UC+1) + tới 3 vòng critic. `AGENT_CAP=12` là núm chỉnh chính. Với PRD lớn, đây là điểm cần cân đối chi phí ↔ độ đầy đủ.
78
80
  - **Completeness-critic tới 3 vòng** — điểm đáng đo: thực tế hội tụ ở vòng mấy? Nếu thường 1–2 vòng thì cap 3 hợp lý.
79
81
  - **Full/delta logic phức tạp** (`applied_to_version` tracking) — mạnh nhưng nhiều nhánh; dễ rơi về FULL khi có actor khác sửa PRD (vd `/review-context` xen giữa).
80
- - **Ranh giới với `/review-context`** — cả hai đều review PRD, dùng chung review-fanout. `/refine-prd` = phán đoán chất lượng nghiệp vụ (3 lăng kính); `/review-context` = check có mã P0–P5 + auto-fix. Chồng lấn có chủ đích hay có thể gộp?
82
+ - **Ranh giới với `/review-context`** — cả hai đều review PRD, dùng chung review-fanout. `/refine-prd` = phán đoán chất lượng nghiệp vụ (4 lăng kính); `/review-context` = check có mã P0–P5 + auto-fix. Chồng lấn có chủ đích hay có thể gộp?
81
83
 
82
84
  ---
83
85