@educa-corp/sdd-framework 0.9.6 → 0.9.8

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 (147) hide show
  1. package/bin/lint-trace.js +4 -4
  2. package/bin/qc-base-map.json +13 -11
  3. package/bin/self-check.js +497 -16
  4. package/bin/trace-schema.json +3226 -2656
  5. package/core/FRAMEWORK_VERSION +1 -1
  6. package/core/commands/amend-prd.md +7 -1
  7. package/core/commands/debug.md +8 -2
  8. package/core/commands/define-product.md +38 -1
  9. package/core/commands/dev-gen-test.md +9 -3
  10. package/core/commands/dev-run-test.md +8 -2
  11. package/core/commands/dev-smoke-test.md +7 -1
  12. package/core/commands/extend-prd.md +7 -1
  13. package/core/commands/fix-bug.md +11 -5
  14. package/core/commands/generate-architecture.md +9 -1
  15. package/core/commands/generate-bdd.md +45 -5
  16. package/core/commands/generate-code.md +43 -4
  17. package/core/commands/generate-design-spec.md +7 -1
  18. package/core/commands/generate-prd.md +9 -1
  19. package/core/commands/generate-spec-manifest.md +7 -1
  20. package/core/commands/generate-tech-docs.md +41 -1
  21. package/core/commands/learn.md +7 -1
  22. package/core/commands/map-testids.md +11 -5
  23. package/core/commands/propose-scenario.md +7 -1
  24. package/core/commands/qc-analyze.md +12 -6
  25. package/core/commands/qc-automation-assess.md +356 -0
  26. package/core/commands/qc-design-script.md +430 -0
  27. package/core/commands/qc-design-test.md +98 -20
  28. package/core/commands/qc-plan.md +9 -3
  29. package/core/commands/qc-report.md +92 -77
  30. package/core/commands/qc-review-script.md +342 -0
  31. package/core/commands/{qc-review.md → qc-review-testcase.md} +86 -54
  32. package/core/commands/qc-run-manualtest.md +401 -0
  33. package/core/commands/qc-run-script.md +421 -0
  34. package/core/commands/refine-prd.md +7 -1
  35. package/core/commands/report-bug.md +9 -3
  36. package/core/commands/review-code.md +9 -3
  37. package/core/commands/review-context.md +11 -3
  38. package/core/commands/review-tech-docs.md +11 -3
  39. package/core/commands/setup-ai-first.md +7 -1
  40. package/core/commands/validate-traces.md +10 -4
  41. package/core/modules/qc-playwright-ts/module.yaml +13 -0
  42. package/core/modules/qc-playwright-ts/stack-profile.yaml +99 -0
  43. package/core/modules/qc-wdio-appium/module.yaml +20 -0
  44. package/core/modules/qc-wdio-appium/stack-profile.yaml +107 -0
  45. package/core/rules/workflow.md +2 -2
  46. package/core/skills/qc/_shared/self-review-principles.md +2 -2
  47. package/core/skills/qc/qa-analyst/DOC_GAP.template.md +1 -1
  48. package/core/skills/qc/qa-analyst/data-flow.md +1 -1
  49. package/core/skills/qc/qa-analyst/spec-issue-reporter.md +1 -1
  50. package/core/skills/qc/qa-automation-assess/matrix.md +123 -0
  51. package/core/skills/qc/qa-designer/e2e/journey.md +1 -1
  52. package/core/skills/qc/qa-designer/exploratory/explore-to-functional.md +1 -1
  53. package/core/skills/qc/{qa-runner → qa-designer}/exploratory/session.md +8 -2
  54. package/core/skills/qc/qa-designer/functional/api.md +2 -2
  55. package/core/skills/qc/qa-designer/functional/gui-feature.md +1 -1
  56. package/core/skills/qc/qa-designer/functional/gui-screen.md +1 -1
  57. package/core/skills/qc/qa-designer/functional/job.md +128 -0
  58. package/core/skills/qc/qa-designer/integration/api.md +2 -2
  59. package/core/skills/qc/qa-designer/integration/db.md +2 -2
  60. package/core/skills/qc/qa-designer/integration/gui.md +1 -1
  61. package/core/skills/qc/qa-designer/integration/{kafka.md → queue.md} +21 -5
  62. package/core/skills/qc/qa-designer/non-functional.md +1 -1
  63. package/core/skills/qc/qa-designer/shared/skill-decision-tree.md +17 -0
  64. package/core/skills/qc/qa-designer/shared/tc-metadata-format.md +28 -6
  65. package/core/skills/qc/qa-reviewer/script/_shared/review-rules.md +121 -0
  66. package/core/skills/qc/qa-reviewer/script/api/auth.md +49 -0
  67. package/core/skills/qc/qa-reviewer/script/api/endpoint.md +89 -0
  68. package/core/skills/qc/qa-reviewer/script/api/security.md +46 -0
  69. package/core/skills/qc/qa-reviewer/script/exploratory.md +3 -3
  70. package/core/skills/qc/qa-reviewer/script/mobile/e2e.md +41 -0
  71. package/core/skills/qc/qa-reviewer/script/mobile/functional.md +90 -0
  72. package/core/skills/qc/qa-reviewer/script/mobile/integration.md +41 -0
  73. package/core/skills/qc/qa-reviewer/script/mobile/non-functional.md +43 -0
  74. package/core/skills/qc/qa-reviewer/script/web/e2e.md +46 -0
  75. package/core/skills/qc/qa-reviewer/script/web/functional.md +111 -0
  76. package/core/skills/qc/qa-reviewer/script/web/integration.md +46 -0
  77. package/core/skills/qc/qa-reviewer/script/web/non-functional.md +49 -0
  78. package/core/skills/qc/qa-reviewer/shared/read-doc-gap-inputs.md +1 -1
  79. package/core/skills/qc/qa-reviewer/shared/review-file-template.md +29 -10
  80. package/core/skills/qc/qa-reviewer/test-case/e2e.md +2 -2
  81. package/core/skills/qc/qa-reviewer/test-case/exploratory.md +1 -1
  82. package/core/skills/qc/qa-reviewer/test-case/functional.md +2 -2
  83. package/core/skills/qc/qa-reviewer/test-case/integration.md +2 -2
  84. package/core/skills/qc/qa-reviewer/test-case/non-functional.md +2 -2
  85. package/core/skills/qc/qa-script-designer/_shared/api-conventions.md +94 -0
  86. package/core/skills/qc/qa-script-designer/_shared/file-naming-and-folders.md +109 -0
  87. package/core/skills/qc/qa-script-designer/_shared/mobile-conventions.md +196 -0
  88. package/core/skills/qc/qa-script-designer/_shared/web-conventions.md +257 -0
  89. package/core/skills/qc/qa-script-designer/api/auth.md +43 -0
  90. package/core/skills/qc/qa-script-designer/api/endpoint.md +61 -0
  91. package/core/skills/qc/qa-script-designer/api/security.md +41 -0
  92. package/core/skills/qc/qa-script-designer/mobile/e2e.md +35 -0
  93. package/core/skills/qc/qa-script-designer/mobile/functional/feature.md +32 -0
  94. package/core/skills/qc/qa-script-designer/mobile/functional/screen.md +42 -0
  95. package/core/skills/qc/qa-script-designer/mobile/integration.md +39 -0
  96. package/core/skills/qc/qa-script-designer/mobile/non-functional.md +39 -0
  97. package/core/skills/qc/qa-script-designer/web/e2e.md +36 -0
  98. package/core/skills/qc/qa-script-designer/web/functional/api.md +39 -0
  99. package/core/skills/qc/qa-script-designer/web/functional/gui-feature.md +34 -0
  100. package/core/skills/qc/qa-script-designer/web/functional/gui-screen.md +42 -0
  101. package/core/skills/qc/qa-script-designer/web/integration.md +43 -0
  102. package/core/skills/qc/qa-script-designer/web/non-functional.md +42 -0
  103. package/core/skills/qc/qa-script-runner/mobile/run.md +38 -0
  104. package/core/skills/qc/qa-script-runner/report.md +41 -0
  105. package/core/skills/qc/qa-script-runner/web/run.md +48 -0
  106. package/core/steps/context-loader.md +1 -1
  107. package/core/steps/gate.md +7 -1
  108. package/core/steps/qc-scope.md +45 -2
  109. package/core/steps/qc-stamp.md +4 -4
  110. package/core/steps/report-footer.md +10 -9
  111. package/docs/02-concepts/pipeline-steps/07-dev-selftest.md +1 -1
  112. package/docs/02-concepts/pipeline-steps/08-qc-automation.md +13 -12
  113. package/docs/02-concepts/pipeline-steps/10-feedback-loop.md +3 -3
  114. package/docs/02-concepts/traceability.md +1 -1
  115. package/docs/03-guides/developer.md +1 -1
  116. package/docs/03-guides/tester-qa.md +40 -11
  117. package/docs/04-reference/commands.md +4 -2
  118. package/docs/04-reference/modules.md +2 -1
  119. package/docs/04-reference/trace-schema.md +4 -4
  120. package/docs/explain/17-qc-design-test.md +5 -5
  121. package/docs/explain/18-qc-review.md +42 -20
  122. package/docs/explain/19-qc-run-test.md +13 -10
  123. package/docs/explain/20-qc-report.md +3 -3
  124. package/docs/explain/23-fix-bug.md +2 -2
  125. package/docs/explain/README.md +2 -2
  126. package/docs/plans/qc-surgery/01-checklist.md +86 -21
  127. package/docs/plans/qc-surgery/PLAN_v2.md +295 -0
  128. package/docs/plans/qc-surgery/exec-S-ap-stack-typescript.md +420 -0
  129. package/docs/plans/qc-surgery/exec-S0-guard-cam-stack-cu.md +400 -0
  130. package/docs/plans/qc-surgery/exec-S1-hai-module-thay-qc-playwright.md +267 -0
  131. package/docs/plans/qc-surgery/exec-S2-qa-runner-thanh-script-designer-runner.md +340 -0
  132. package/docs/plans/qc-surgery/exec-S3-viet-lai-tieu-chi-review-script.md +322 -0
  133. package/docs/plans/qc-surgery/exec-S5-an-theo-don-dau-vet-stack-cu.md +292 -0
  134. package/package.json +1 -1
  135. package/core/commands/qc-run-test.md +0 -561
  136. package/core/modules/qc-playwright/stack-profile.yaml +0 -66
  137. package/core/skills/qc/qa-reviewer/script/e2e.md +0 -95
  138. package/core/skills/qc/qa-reviewer/script/functional.md +0 -109
  139. package/core/skills/qc/qa-reviewer/script/integration.md +0 -99
  140. package/core/skills/qc/qa-reviewer/script/non-functional.md +0 -134
  141. package/core/skills/qc/qa-runner/e2e.md +0 -49
  142. package/core/skills/qc/qa-runner/functional/api.md +0 -35
  143. package/core/skills/qc/qa-runner/functional/gui-feature.md +0 -57
  144. package/core/skills/qc/qa-runner/functional/gui-screen.md +0 -61
  145. package/core/skills/qc/qa-runner/integration.md +0 -47
  146. package/core/skills/qc/qa-runner/non-functional.md +0 -49
  147. package/core/skills/qc/qa-runner/report/report.md +0 -37
@@ -1 +1 @@
1
- 0.9.6
1
+ 0.9.8
@@ -108,7 +108,7 @@ Lưu toàn bộ context đã nạp vào bộ nhớ để dùng xuyên suốt phi
108
108
 
109
109
  | Mức | Lệnh nào | `--yes` bỏ qua được? |
110
110
  |---|---|:---:|
111
- | **Không chặn** | Lệnh read-only: `/review-code` · `/validate-traces` · `/debug` · `/review-context` · `/review-tech-docs` | — (vốn không có) |
111
+ | **Không chặn** | `/review-code` · `/validate-traces` · `/debug` **KHÔNG phải vì read-only**: cả ba đều CÓ ghi file. Chúng không chặn vì thao tác ghi của chúng hoặc nằm sau một câu hỏi `(Y/N)`, hoặc nằm sau một cờ, hoặc là `append`/dựng-lại-được | — (vốn không có) |
112
112
  | **Chặn thường** | Mọi lệnh sinh/sửa artifact | ✅ |
113
113
  | **Chặn CỨNG** | Ghi đè file đã tồn tại · `--resume` áp findings · migrate · prune | ❌ **không bao giờ** |
114
114
 
@@ -116,6 +116,12 @@ Lưu toàn bộ context đã nạp vào bộ nhớ để dùng xuyên suốt phi
116
116
  `--` khỏi phần resolve target, nên cờ này không ảnh hưởng việc tìm file.) Mở đường chạy
117
117
  headless: `claude -p "/generate-code UC1 --yes"`.
118
118
 
119
+ > **Tên lệnh trong bảng trên có máy canh — `R19`.** Mỗi hàng bảng vừa nêu một mức vừa nêu
120
+ > tên lệnh sẽ bị đối chiếu với `gate.checkpoint_levels`; lệch là build đỏ. Lý do có rule này:
121
+ > ngày 2026-09-16 hai lệnh đổi mức, schema và `commands/*.tmpl` đều sửa, **build vẫn xanh**,
122
+ > mà bảng này lẫn `rules/workflow.md` đều còn liệt chúng ở mức cũ. `R11` chỉ canh
123
+ > `commands/*.tmpl` ↔ schema — *biết có máy canh không bằng biết máy canh **đến đâu***.
124
+
119
125
  > **KHÔNG tự suy mức từ bảng này.** Mỗi lệnh **tự khai** mức của nó ở một dòng `*Checkpoint: …*`
120
126
  > ngay dưới `## Gate` của chính nó — đọc dòng đó, đừng suy diễn. Bảng trên chỉ giải thích ba mức
121
127
  > **nghĩa là gì**.
@@ -5,7 +5,7 @@ Khác `/fix-bug`: chỉ phân tích, không full workflow, không cần ticket.
5
5
 
6
6
  ## Gate
7
7
 
8
- *Checkpoint: **không chặn** — read-only. Gate Bước 3 bỏ qua CHECKPOINT (Bước 3a).*
8
+ *Checkpoint: **không chặn** — **không phải vì read-only**: lệnh CÓ ghi `{lessons_path}` qua §Capture Lesson (`steps/capture-lesson.md`), nhưng chỉ sau câu hỏi `(Y/N)`. Gate Bước 3 bỏ qua CHECKPOINT (Bước 3a).*
9
9
 
10
10
  # Gate — Quy trình vào chuẩn cho mọi lệnh
11
11
 
@@ -86,7 +86,7 @@ Lưu toàn bộ context đã nạp vào bộ nhớ để dùng xuyên suốt phi
86
86
 
87
87
  | Mức | Lệnh nào | `--yes` bỏ qua được? |
88
88
  |---|---|:---:|
89
- | **Không chặn** | Lệnh read-only: `/review-code` · `/validate-traces` · `/debug` · `/review-context` · `/review-tech-docs` | — (vốn không có) |
89
+ | **Không chặn** | `/review-code` · `/validate-traces` · `/debug` **KHÔNG phải vì read-only**: cả ba đều CÓ ghi file. Chúng không chặn vì thao tác ghi của chúng hoặc nằm sau một câu hỏi `(Y/N)`, hoặc nằm sau một cờ, hoặc là `append`/dựng-lại-được | — (vốn không có) |
90
90
  | **Chặn thường** | Mọi lệnh sinh/sửa artifact | ✅ |
91
91
  | **Chặn CỨNG** | Ghi đè file đã tồn tại · `--resume` áp findings · migrate · prune | ❌ **không bao giờ** |
92
92
 
@@ -94,6 +94,12 @@ Lưu toàn bộ context đã nạp vào bộ nhớ để dùng xuyên suốt phi
94
94
  `--` khỏi phần resolve target, nên cờ này không ảnh hưởng việc tìm file.) Mở đường chạy
95
95
  headless: `claude -p "/generate-code UC1 --yes"`.
96
96
 
97
+ > **Tên lệnh trong bảng trên có máy canh — `R19`.** Mỗi hàng bảng vừa nêu một mức vừa nêu
98
+ > tên lệnh sẽ bị đối chiếu với `gate.checkpoint_levels`; lệch là build đỏ. Lý do có rule này:
99
+ > ngày 2026-09-16 hai lệnh đổi mức, schema và `commands/*.tmpl` đều sửa, **build vẫn xanh**,
100
+ > mà bảng này lẫn `rules/workflow.md` đều còn liệt chúng ở mức cũ. `R11` chỉ canh
101
+ > `commands/*.tmpl` ↔ schema — *biết có máy canh không bằng biết máy canh **đến đâu***.
102
+
97
103
  > **KHÔNG tự suy mức từ bảng này.** Mỗi lệnh **tự khai** mức của nó ở một dòng `*Checkpoint: …*`
98
104
  > ngay dưới `## Gate` của chính nó — đọc dòng đó, đừng suy diễn. Bảng trên chỉ giải thích ba mức
99
105
  > **nghĩa là gì**.
@@ -1,6 +1,11 @@
1
1
  # /define-product — Khám phá tính năng (Q&A 8 Phase)
2
2
 
3
3
  ## Gate
4
+
5
+ *Checkpoint: **chặn CỨNG** — ghi đè product-definition đã có → xoá dấu `✅ PO xác nhận` trên từng mục và đẩy `Completed Phase` về 0, tức bỏ cả vòng discovery đã chạy. `--yes` KHÔNG bỏ qua được (gate Bước 3a).*
6
+
7
+ *Mức cứng chỉ áp khi file **đã tồn tại** và có ≥1 mục mang `✅ PO xác nhận`. Buổi discovery đầu đi thẳng; resume khi chưa mục nào chốt cũng đi thẳng. Xem §Chạy lại.*
8
+
4
9
  # Gate — Quy trình vào chuẩn cho mọi lệnh
5
10
 
6
11
  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ó.
@@ -80,7 +85,7 @@ Lưu toàn bộ context đã nạp vào bộ nhớ để dùng xuyên suốt phi
80
85
 
81
86
  | Mức | Lệnh nào | `--yes` bỏ qua được? |
82
87
  |---|---|:---:|
83
- | **Không chặn** | Lệnh read-only: `/review-code` · `/validate-traces` · `/debug` · `/review-context` · `/review-tech-docs` | — (vốn không có) |
88
+ | **Không chặn** | `/review-code` · `/validate-traces` · `/debug` **KHÔNG phải vì read-only**: cả ba đều CÓ ghi file. Chúng không chặn vì thao tác ghi của chúng hoặc nằm sau một câu hỏi `(Y/N)`, hoặc nằm sau một cờ, hoặc là `append`/dựng-lại-được | — (vốn không có) |
84
89
  | **Chặn thường** | Mọi lệnh sinh/sửa artifact | ✅ |
85
90
  | **Chặn CỨNG** | Ghi đè file đã tồn tại · `--resume` áp findings · migrate · prune | ❌ **không bao giờ** |
86
91
 
@@ -88,6 +93,12 @@ Lưu toàn bộ context đã nạp vào bộ nhớ để dùng xuyên suốt phi
88
93
  `--` khỏi phần resolve target, nên cờ này không ảnh hưởng việc tìm file.) Mở đường chạy
89
94
  headless: `claude -p "/generate-code UC1 --yes"`.
90
95
 
96
+ > **Tên lệnh trong bảng trên có máy canh — `R19`.** Mỗi hàng bảng vừa nêu một mức vừa nêu
97
+ > tên lệnh sẽ bị đối chiếu với `gate.checkpoint_levels`; lệch là build đỏ. Lý do có rule này:
98
+ > ngày 2026-09-16 hai lệnh đổi mức, schema và `commands/*.tmpl` đều sửa, **build vẫn xanh**,
99
+ > mà bảng này lẫn `rules/workflow.md` đều còn liệt chúng ở mức cũ. `R11` chỉ canh
100
+ > `commands/*.tmpl` ↔ schema — *biết có máy canh không bằng biết máy canh **đến đâu***.
101
+
91
102
  > **KHÔNG tự suy mức từ bảng này.** Mỗi lệnh **tự khai** mức của nó ở một dòng `*Checkpoint: …*`
92
103
  > ngay dưới `## Gate` của chính nó — đọc dòng đó, đừng suy diễn. Bảng trên chỉ giải thích ba mức
93
104
  > **nghĩa là gì**.
@@ -423,6 +434,32 @@ Ghi `{paths.product_definitions_dir}/{TICKET-ID}-{slug}.md` theo `templates/prod
423
434
  - Khi Phase 7 pass mà không còn GAP → đặt `Completed Phase: 7` và `Status: completed`.
424
435
  - Nếu discovery bị ngắt giữa chừng, file vẫn được ghi với `Completed Phase` phản ánh phase cao nhất đã xác nhận — buổi sau resume tiếp từ phase kế tiếp.
425
436
 
437
+ ## Chạy lại — product-definition đã tồn tại *(RESUME, không làm lại từ đầu)*
438
+
439
+ File này ghi lại một buổi discovery với PO, và từng mục mang dấu xác nhận của **người**:
440
+
441
+ | Phần | Ai tạo | Sinh lại được? |
442
+ |---|---|:---:|
443
+ | Nội dung AI trích (`🤖 AI trích — chờ PO chốt`) | lệnh này | ✅ |
444
+ | **Dấu `✅ PO xác nhận`** trên từng mục | **PO**, trong buổi làm việc | ❌ **không** |
445
+ | **`Completed Phase`** | lệnh này, nhưng là điểm resume | ❌ về 0 là làm lại cả buổi |
446
+
447
+ **Khi file đã có ≥1 mục `✅ PO xác nhận`, in khối này** *(mức chặn CỨNG)*:
448
+
449
+ ```
450
+ ❌ Product definition đã tồn tại: {path}
451
+ Hiện: Completed Phase {n}/7 · Status {status} · {m} mục đã ✅ PO xác nhận
452
+
453
+ Chạy lại từ đầu xoá mọi dấu ✅ PO xác nhận và đưa Completed Phase về 0,
454
+ tức phải mời PO ngồi lại từ phase 1.
455
+
456
+ Muốn đi tiếp từ chỗ dừng → tiếp tục; lệnh tự resume từ phase {n+1}
457
+ Muốn sửa một mục đã chốt → sửa thẳng trong file, giữ nguyên dấu ✅
458
+ Thật sự muốn làm lại → đổi tên file cũ rồi chạy lại (tự chịu trách nhiệm)
459
+ ```
460
+
461
+ > **Buổi discovery đầu (file chưa có) đi thẳng, không chặn.**
462
+
426
463
  **Đọc `.agent/steps/report-footer.md`** và áp đúng khuôn footer trong đó (Status Badge ·
427
464
  Output Artifacts · Next) cho report cuối, kèm khối bên dưới.
428
465
 
@@ -91,7 +91,7 @@ Lưu toàn bộ context đã nạp vào bộ nhớ để dùng xuyên suốt phi
91
91
 
92
92
  | Mức | Lệnh nào | `--yes` bỏ qua được? |
93
93
  |---|---|:---:|
94
- | **Không chặn** | Lệnh read-only: `/review-code` · `/validate-traces` · `/debug` · `/review-context` · `/review-tech-docs` | — (vốn không có) |
94
+ | **Không chặn** | `/review-code` · `/validate-traces` · `/debug` **KHÔNG phải vì read-only**: cả ba đều CÓ ghi file. Chúng không chặn vì thao tác ghi của chúng hoặc nằm sau một câu hỏi `(Y/N)`, hoặc nằm sau một cờ, hoặc là `append`/dựng-lại-được | — (vốn không có) |
95
95
  | **Chặn thường** | Mọi lệnh sinh/sửa artifact | ✅ |
96
96
  | **Chặn CỨNG** | Ghi đè file đã tồn tại · `--resume` áp findings · migrate · prune | ❌ **không bao giờ** |
97
97
 
@@ -99,6 +99,12 @@ Lưu toàn bộ context đã nạp vào bộ nhớ để dùng xuyên suốt phi
99
99
  `--` khỏi phần resolve target, nên cờ này không ảnh hưởng việc tìm file.) Mở đường chạy
100
100
  headless: `claude -p "/generate-code UC1 --yes"`.
101
101
 
102
+ > **Tên lệnh trong bảng trên có máy canh — `R19`.** Mỗi hàng bảng vừa nêu một mức vừa nêu
103
+ > tên lệnh sẽ bị đối chiếu với `gate.checkpoint_levels`; lệch là build đỏ. Lý do có rule này:
104
+ > ngày 2026-09-16 hai lệnh đổi mức, schema và `commands/*.tmpl` đều sửa, **build vẫn xanh**,
105
+ > mà bảng này lẫn `rules/workflow.md` đều còn liệt chúng ở mức cũ. `R11` chỉ canh
106
+ > `commands/*.tmpl` ↔ schema — *biết có máy canh không bằng biết máy canh **đến đâu***.
107
+
102
108
  > **KHÔNG tự suy mức từ bảng này.** Mỗi lệnh **tự khai** mức của nó ở một dòng `*Checkpoint: …*`
103
109
  > ngay dưới `## Gate` của chính nó — đọc dòng đó, đừng suy diễn. Bảng trên chỉ giải thích ba mức
104
110
  > **nghĩa là gì**.
@@ -627,7 +633,7 @@ Sau khi sinh tất cả file test, cập nhật **sổ của platform đang test
627
633
  | `dev_selftest` | `not_run` (test giờ đã tồn tại nhưng chưa chạy — `/dev-run-test` set pass/fail) |
628
634
  | `last_updated` | hôm nay `YYYY-MM-DD` |
629
635
 
630
- Giữ nguyên mọi cột khác (gồm `dev_selftest_at`, do `/dev-run-test` sở hữu, và `qc_status`/`qc_run_at`, do `/qc-run-test` sở hữu).
636
+ Giữ nguyên mọi cột khác (gồm `dev_selftest_at`, do `/dev-run-test` sở hữu, và `qc_status`/`qc_run_at`, do `/qc-run-script` + `/qc-run-manualtest` sở hữu).
631
637
 
632
638
  ---
633
639
 
@@ -732,7 +738,7 @@ là lần xoá.
732
738
  sinh trước chưa commit"* — hai ca đó nhìn giống hệt nhau trên `git status`. **Dừng oan một lần rẻ
733
739
  hơn xoá nhầm một lần.**
734
740
 
735
- > **Vì sao mặc định là "sinh phần thiếu" chứ không phải "đừng sinh".** `/qc-run-test` (G77) có vòng
741
+ > **Vì sao mặc định là "sinh phần thiếu" chứ không phải "đừng sinh".** `/qc-design-script` (G77) có vòng
736
742
  > đời **chạy nhiều / sinh ít** nên mặc định của nó là *"CHẠY, đừng sinh lại"*. Lệnh này **chỉ sinh**,
737
743
  > không chạy gì — copy nguyên mặc định đó sang là **copy nhầm ngữ cảnh**. *Cùng khuôn không có nghĩa
738
744
  > là cùng thuốc.*
@@ -86,7 +86,7 @@ Lưu toàn bộ context đã nạp vào bộ nhớ để dùng xuyên suốt phi
86
86
 
87
87
  | Mức | Lệnh nào | `--yes` bỏ qua được? |
88
88
  |---|---|:---:|
89
- | **Không chặn** | Lệnh read-only: `/review-code` · `/validate-traces` · `/debug` · `/review-context` · `/review-tech-docs` | — (vốn không có) |
89
+ | **Không chặn** | `/review-code` · `/validate-traces` · `/debug` **KHÔNG phải vì read-only**: cả ba đều CÓ ghi file. Chúng không chặn vì thao tác ghi của chúng hoặc nằm sau một câu hỏi `(Y/N)`, hoặc nằm sau một cờ, hoặc là `append`/dựng-lại-được | — (vốn không có) |
90
90
  | **Chặn thường** | Mọi lệnh sinh/sửa artifact | ✅ |
91
91
  | **Chặn CỨNG** | Ghi đè file đã tồn tại · `--resume` áp findings · migrate · prune | ❌ **không bao giờ** |
92
92
 
@@ -94,6 +94,12 @@ Lưu toàn bộ context đã nạp vào bộ nhớ để dùng xuyên suốt phi
94
94
  `--` khỏi phần resolve target, nên cờ này không ảnh hưởng việc tìm file.) Mở đường chạy
95
95
  headless: `claude -p "/generate-code UC1 --yes"`.
96
96
 
97
+ > **Tên lệnh trong bảng trên có máy canh — `R19`.** Mỗi hàng bảng vừa nêu một mức vừa nêu
98
+ > tên lệnh sẽ bị đối chiếu với `gate.checkpoint_levels`; lệch là build đỏ. Lý do có rule này:
99
+ > ngày 2026-09-16 hai lệnh đổi mức, schema và `commands/*.tmpl` đều sửa, **build vẫn xanh**,
100
+ > mà bảng này lẫn `rules/workflow.md` đều còn liệt chúng ở mức cũ. `R11` chỉ canh
101
+ > `commands/*.tmpl` ↔ schema — *biết có máy canh không bằng biết máy canh **đến đâu***.
102
+
97
103
  > **KHÔNG tự suy mức từ bảng này.** Mỗi lệnh **tự khai** mức của nó ở một dòng `*Checkpoint: …*`
98
104
  > ngay dưới `## Gate` của chính nó — đọc dòng đó, đừng suy diễn. Bảng trên chỉ giải thích ba mức
99
105
  > **nghĩa là gì**.
@@ -388,7 +394,7 @@ Cập nhật **sổ của platform đang test** `{paths.trace_dir}/{domain}/{prd
388
394
  > tay hoặc sổ sinh bởi version framework cũ hơn.
389
395
 
390
396
  Giữ nguyên mọi cột khác — đặc biệt **không bao giờ** đụng `qc_status`/`qc_run_at`
391
- (kết quả QC automation chính thức, do `/qc-run-test` sở hữu; nó có guard riêng cùng loại).
397
+ (kết quả QC automation chính thức, do `/qc-run-script` sở hữu; nó có guard riêng cùng loại).
392
398
  `dev_selftest` (dev smoke) và `qc_status` (QC chính thức) là hai tín hiệu riêng.
393
399
 
394
400
  ## Refresh Panel Mirror
@@ -82,7 +82,7 @@ Lưu toàn bộ context đã nạp vào bộ nhớ để dùng xuyên suốt phi
82
82
 
83
83
  | Mức | Lệnh nào | `--yes` bỏ qua được? |
84
84
  |---|---|:---:|
85
- | **Không chặn** | Lệnh read-only: `/review-code` · `/validate-traces` · `/debug` · `/review-context` · `/review-tech-docs` | — (vốn không có) |
85
+ | **Không chặn** | `/review-code` · `/validate-traces` · `/debug` **KHÔNG phải vì read-only**: cả ba đều CÓ ghi file. Chúng không chặn vì thao tác ghi của chúng hoặc nằm sau một câu hỏi `(Y/N)`, hoặc nằm sau một cờ, hoặc là `append`/dựng-lại-được | — (vốn không có) |
86
86
  | **Chặn thường** | Mọi lệnh sinh/sửa artifact | ✅ |
87
87
  | **Chặn CỨNG** | Ghi đè file đã tồn tại · `--resume` áp findings · migrate · prune | ❌ **không bao giờ** |
88
88
 
@@ -90,6 +90,12 @@ Lưu toàn bộ context đã nạp vào bộ nhớ để dùng xuyên suốt phi
90
90
  `--` khỏi phần resolve target, nên cờ này không ảnh hưởng việc tìm file.) Mở đường chạy
91
91
  headless: `claude -p "/generate-code UC1 --yes"`.
92
92
 
93
+ > **Tên lệnh trong bảng trên có máy canh — `R19`.** Mỗi hàng bảng vừa nêu một mức vừa nêu
94
+ > tên lệnh sẽ bị đối chiếu với `gate.checkpoint_levels`; lệch là build đỏ. Lý do có rule này:
95
+ > ngày 2026-09-16 hai lệnh đổi mức, schema và `commands/*.tmpl` đều sửa, **build vẫn xanh**,
96
+ > mà bảng này lẫn `rules/workflow.md` đều còn liệt chúng ở mức cũ. `R11` chỉ canh
97
+ > `commands/*.tmpl` ↔ schema — *biết có máy canh không bằng biết máy canh **đến đâu***.
98
+
93
99
  > **KHÔNG tự suy mức từ bảng này.** Mỗi lệnh **tự khai** mức của nó ở một dòng `*Checkpoint: …*`
94
100
  > ngay dưới `## Gate` của chính nó — đọc dòng đó, đừng suy diễn. Bảng trên chỉ giải thích ba mức
95
101
  > **nghĩa là gì**.
@@ -103,7 +103,7 @@ Lưu toàn bộ context đã nạp vào bộ nhớ để dùng xuyên suốt phi
103
103
 
104
104
  | Mức | Lệnh nào | `--yes` bỏ qua được? |
105
105
  |---|---|:---:|
106
- | **Không chặn** | Lệnh read-only: `/review-code` · `/validate-traces` · `/debug` · `/review-context` · `/review-tech-docs` | — (vốn không có) |
106
+ | **Không chặn** | `/review-code` · `/validate-traces` · `/debug` **KHÔNG phải vì read-only**: cả ba đều CÓ ghi file. Chúng không chặn vì thao tác ghi của chúng hoặc nằm sau một câu hỏi `(Y/N)`, hoặc nằm sau một cờ, hoặc là `append`/dựng-lại-được | — (vốn không có) |
107
107
  | **Chặn thường** | Mọi lệnh sinh/sửa artifact | ✅ |
108
108
  | **Chặn CỨNG** | Ghi đè file đã tồn tại · `--resume` áp findings · migrate · prune | ❌ **không bao giờ** |
109
109
 
@@ -111,6 +111,12 @@ Lưu toàn bộ context đã nạp vào bộ nhớ để dùng xuyên suốt phi
111
111
  `--` khỏi phần resolve target, nên cờ này không ảnh hưởng việc tìm file.) Mở đường chạy
112
112
  headless: `claude -p "/generate-code UC1 --yes"`.
113
113
 
114
+ > **Tên lệnh trong bảng trên có máy canh — `R19`.** Mỗi hàng bảng vừa nêu một mức vừa nêu
115
+ > tên lệnh sẽ bị đối chiếu với `gate.checkpoint_levels`; lệch là build đỏ. Lý do có rule này:
116
+ > ngày 2026-09-16 hai lệnh đổi mức, schema và `commands/*.tmpl` đều sửa, **build vẫn xanh**,
117
+ > mà bảng này lẫn `rules/workflow.md` đều còn liệt chúng ở mức cũ. `R11` chỉ canh
118
+ > `commands/*.tmpl` ↔ schema — *biết có máy canh không bằng biết máy canh **đến đâu***.
119
+
114
120
  > **KHÔNG tự suy mức từ bảng này.** Mỗi lệnh **tự khai** mức của nó ở một dòng `*Checkpoint: …*`
115
121
  > ngay dưới `## Gate` của chính nó — đọc dòng đó, đừng suy diễn. Bảng trên chỉ giải thích ba mức
116
122
  > **nghĩa là gì**.
@@ -80,7 +80,7 @@ Lưu toàn bộ context đã nạp vào bộ nhớ để dùng xuyên suốt phi
80
80
 
81
81
  | Mức | Lệnh nào | `--yes` bỏ qua được? |
82
82
  |---|---|:---:|
83
- | **Không chặn** | Lệnh read-only: `/review-code` · `/validate-traces` · `/debug` · `/review-context` · `/review-tech-docs` | — (vốn không có) |
83
+ | **Không chặn** | `/review-code` · `/validate-traces` · `/debug` **KHÔNG phải vì read-only**: cả ba đều CÓ ghi file. Chúng không chặn vì thao tác ghi của chúng hoặc nằm sau một câu hỏi `(Y/N)`, hoặc nằm sau một cờ, hoặc là `append`/dựng-lại-được | — (vốn không có) |
84
84
  | **Chặn thường** | Mọi lệnh sinh/sửa artifact | ✅ |
85
85
  | **Chặn CỨNG** | Ghi đè file đã tồn tại · `--resume` áp findings · migrate · prune | ❌ **không bao giờ** |
86
86
 
@@ -88,6 +88,12 @@ Lưu toàn bộ context đã nạp vào bộ nhớ để dùng xuyên suốt phi
88
88
  `--` khỏi phần resolve target, nên cờ này không ảnh hưởng việc tìm file.) Mở đường chạy
89
89
  headless: `claude -p "/generate-code UC1 --yes"`.
90
90
 
91
+ > **Tên lệnh trong bảng trên có máy canh — `R19`.** Mỗi hàng bảng vừa nêu một mức vừa nêu
92
+ > tên lệnh sẽ bị đối chiếu với `gate.checkpoint_levels`; lệch là build đỏ. Lý do có rule này:
93
+ > ngày 2026-09-16 hai lệnh đổi mức, schema và `commands/*.tmpl` đều sửa, **build vẫn xanh**,
94
+ > mà bảng này lẫn `rules/workflow.md` đều còn liệt chúng ở mức cũ. `R11` chỉ canh
95
+ > `commands/*.tmpl` ↔ schema — *biết có máy canh không bằng biết máy canh **đến đâu***.
96
+
91
97
  > **KHÔNG tự suy mức từ bảng này.** Mỗi lệnh **tự khai** mức của nó ở một dòng `*Checkpoint: …*`
92
98
  > ngay dưới `## Gate` của chính nó — đọc dòng đó, đừng suy diễn. Bảng trên chỉ giải thích ba mức
93
99
  > **nghĩa là gì**.
@@ -283,7 +289,7 @@ Với mỗi SC mà regression test phủ (theo `@trace.verifies` của test vừ
283
289
  | `last_updated` | hôm nay `YYYY-MM-DD` |
284
290
 
285
291
  Giữ nguyên mọi cột khác. Đặc biệt:
286
- - **KHÔNG** đụng `qc_status`/`qc_run_at`/`qc_owner`/`qc_blocked_by` — QC sở hữu; `/qc-run-test` sẽ flip khi re-verify (và chính nó đóng `{BUG-ID}` → `🟢 Closed`).
292
+ - **KHÔNG** đụng `qc_status`/`qc_run_at`/`qc_owner`/`qc_blocked_by` — QC sở hữu; `/qc-run-script` sẽ flip khi re-verify (và chính nó đóng `{BUG-ID}` → `🟢 Closed`).
287
293
  - **KHÔNG** đụng `spec_ver`/`gen_ver` — fix bug **không** đổi spec, nên không được tạo tín hiệu DRIFT giả.
288
294
 
289
295
  Rồi làm mới panel mirror:
@@ -364,7 +370,7 @@ git push -u origin fix/{TICKET_ID}-{slug} # rồi mở PR vào branch đư
364
370
 
365
371
  Sau khi fix được commit, cập nhật `{paths.bug_reports_dir}/{BUG-ID}.md`:
366
372
  - Set `State` → `🟡 Fixed` và thêm một **Resolution** ngắn (root cause + link commit/PR).
367
- - Nó **chưa** `Closed` — QC sở hữu verification: khi `/qc-run-test` chạy lại và `qc_status`
373
+ - Nó **chưa** `Closed` — QC sở hữu verification: khi `/qc-run-script` chạy lại và `qc_status`
368
374
  của SC liên kết flip thành `pass`, nó thành `🟢 Closed` (và `qc_owner`/`qc_blocked_by` clear).
369
375
  - Commit report đã cập nhật vào spec repo (cùng push 2 tầng như `/report-bug`) để view
370
376
  "waiting-on" của PO/PM phản ánh nó trên `/sync`.
@@ -511,9 +517,9 @@ Root Cause: {analysis}
511
517
  Changes: {list}
512
518
  ✅ Regression test added | ✅ Build: SUCCESS
513
519
  {Trace: {UC-ID}-{platform}.tsv updated — test_count +{n}, dev_selftest → not_run | nếu có chạm row trace}
514
- {🐞 BUG-{id} → State: Fixed (pushed) — Closed sau khi /qc-run-test re-verify pass | nếu fix một bug đã file}
520
+ {🐞 BUG-{id} → State: Fixed (pushed) — Closed sau khi /qc-run-script re-verify pass | nếu fix một bug đã file}
515
521
  {📝 Lesson L-NNN recorded (nếu đã capture)}
516
522
  Branch: fix/{TICKET_ID}-{slug}
517
523
  Next: /dev-run-test {UC-ID} ← dev_selftest vừa bị reset về not_run, chạy để lấy lại tín hiệu xanh
518
- Rồi tạo PR và link tới ticket. {QC: chạy lại /qc-run-test {UC-ID} để verify + đóng bug | nếu áp dụng}
524
+ Rồi tạo PR và link tới ticket. {QC: chạy lại /qc-run-script {UC-ID} để verify + đóng bug | nếu áp dụng}
519
525
  ```
@@ -17,6 +17,8 @@
17
17
 
18
18
  *Checkpoint: **chặn CỨNG** — ghi đè architecture.md đã verified_by một người thật. `--yes` KHÔNG bỏ qua được (gate Bước 3a).*
19
19
 
20
+ *Mức cứng chỉ áp khi `architecture.md` **đã có** VÀ `verified_by` là `AI-draft`/trống. `verified_by: {người thật}` → **KHÔNG đè**, nhảy Bước 6 refresh có kiểm soát. File chưa có: đi thẳng.*
21
+
20
22
  # Gate — Quy trình vào chuẩn cho mọi lệnh
21
23
 
22
24
  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ó.
@@ -96,7 +98,7 @@ Lưu toàn bộ context đã nạp vào bộ nhớ để dùng xuyên suốt phi
96
98
 
97
99
  | Mức | Lệnh nào | `--yes` bỏ qua được? |
98
100
  |---|---|:---:|
99
- | **Không chặn** | Lệnh read-only: `/review-code` · `/validate-traces` · `/debug` · `/review-context` · `/review-tech-docs` | — (vốn không có) |
101
+ | **Không chặn** | `/review-code` · `/validate-traces` · `/debug` **KHÔNG phải vì read-only**: cả ba đều CÓ ghi file. Chúng không chặn vì thao tác ghi của chúng hoặc nằm sau một câu hỏi `(Y/N)`, hoặc nằm sau một cờ, hoặc là `append`/dựng-lại-được | — (vốn không có) |
100
102
  | **Chặn thường** | Mọi lệnh sinh/sửa artifact | ✅ |
101
103
  | **Chặn CỨNG** | Ghi đè file đã tồn tại · `--resume` áp findings · migrate · prune | ❌ **không bao giờ** |
102
104
 
@@ -104,6 +106,12 @@ Lưu toàn bộ context đã nạp vào bộ nhớ để dùng xuyên suốt phi
104
106
  `--` khỏi phần resolve target, nên cờ này không ảnh hưởng việc tìm file.) Mở đường chạy
105
107
  headless: `claude -p "/generate-code UC1 --yes"`.
106
108
 
109
+ > **Tên lệnh trong bảng trên có máy canh — `R19`.** Mỗi hàng bảng vừa nêu một mức vừa nêu
110
+ > tên lệnh sẽ bị đối chiếu với `gate.checkpoint_levels`; lệch là build đỏ. Lý do có rule này:
111
+ > ngày 2026-09-16 hai lệnh đổi mức, schema và `commands/*.tmpl` đều sửa, **build vẫn xanh**,
112
+ > mà bảng này lẫn `rules/workflow.md` đều còn liệt chúng ở mức cũ. `R11` chỉ canh
113
+ > `commands/*.tmpl` ↔ schema — *biết có máy canh không bằng biết máy canh **đến đâu***.
114
+
107
115
  > **KHÔNG tự suy mức từ bảng này.** Mỗi lệnh **tự khai** mức của nó ở một dòng `*Checkpoint: …*`
108
116
  > ngay dưới `## Gate` của chính nó — đọc dòng đó, đừng suy diễn. Bảng trên chỉ giải thích ba mức
109
117
  > **nghĩa là gì**.
@@ -1,6 +1,11 @@
1
1
  # /generate-bdd — Sinh BDD Feature Files
2
2
 
3
3
  ## Gate
4
+
5
+ *Checkpoint: **chặn CỨNG** — ghi đè `.feature` đã có → mode **F** gen lại TOÀN BỘ scenario và ĐÁNH SỐ LẠI `sc_id`, mà sổ TSV, tag `@trace.verifies` trong code, và `.Test.md` đều đang trỏ vào những id đó. `--yes` KHÔNG bỏ qua được (gate Bước 3a).*
6
+
7
+ *Mức cứng chỉ áp khi Version Check chọn **`F`** (gen lại TOÀN BỘ scenario) — nhánh duy nhất đánh số lại `sc_id`. Chọn **`Y`** (cập nhật hẹp) không mất gì, đi thẳng; lần gen đầu cũng đi thẳng. Xem §Chạy lại.*
8
+
4
9
  # Gate — Quy trình vào chuẩn cho mọi lệnh
5
10
 
6
11
  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ó.
@@ -80,7 +85,7 @@ Lưu toàn bộ context đã nạp vào bộ nhớ để dùng xuyên suốt phi
80
85
 
81
86
  | Mức | Lệnh nào | `--yes` bỏ qua được? |
82
87
  |---|---|:---:|
83
- | **Không chặn** | Lệnh read-only: `/review-code` · `/validate-traces` · `/debug` · `/review-context` · `/review-tech-docs` | — (vốn không có) |
88
+ | **Không chặn** | `/review-code` · `/validate-traces` · `/debug` **KHÔNG phải vì read-only**: cả ba đều CÓ ghi file. Chúng không chặn vì thao tác ghi của chúng hoặc nằm sau một câu hỏi `(Y/N)`, hoặc nằm sau một cờ, hoặc là `append`/dựng-lại-được | — (vốn không có) |
84
89
  | **Chặn thường** | Mọi lệnh sinh/sửa artifact | ✅ |
85
90
  | **Chặn CỨNG** | Ghi đè file đã tồn tại · `--resume` áp findings · migrate · prune | ❌ **không bao giờ** |
86
91
 
@@ -88,6 +93,12 @@ Lưu toàn bộ context đã nạp vào bộ nhớ để dùng xuyên suốt phi
88
93
  `--` khỏi phần resolve target, nên cờ này không ảnh hưởng việc tìm file.) Mở đường chạy
89
94
  headless: `claude -p "/generate-code UC1 --yes"`.
90
95
 
96
+ > **Tên lệnh trong bảng trên có máy canh — `R19`.** Mỗi hàng bảng vừa nêu một mức vừa nêu
97
+ > tên lệnh sẽ bị đối chiếu với `gate.checkpoint_levels`; lệch là build đỏ. Lý do có rule này:
98
+ > ngày 2026-09-16 hai lệnh đổi mức, schema và `commands/*.tmpl` đều sửa, **build vẫn xanh**,
99
+ > mà bảng này lẫn `rules/workflow.md` đều còn liệt chúng ở mức cũ. `R11` chỉ canh
100
+ > `commands/*.tmpl` ↔ schema — *biết có máy canh không bằng biết máy canh **đến đâu***.
101
+
91
102
  > **KHÔNG tự suy mức từ bảng này.** Mỗi lệnh **tự khai** mức của nó ở một dòng `*Checkpoint: …*`
92
103
  > ngay dưới `## Gate` của chính nó — đọc dòng đó, đừng suy diễn. Bảng trên chỉ giải thích ba mức
93
104
  > **nghĩa là gì**.
@@ -846,10 +857,10 @@ sc_id\tsc_title\tspec_ver\tgen_ver\timplemented_by\ttest_count\ttest_classes\tde
846
857
  | `test_classes` | `—` |
847
858
  | `dev_selftest` | `—` (chưa chạy test) |
848
859
  | `dev_selftest_at` | `—` |
849
- | `qc_status` | `—` (kết quả QC automation chính thức — set bởi `/qc-run-test`) |
860
+ | `qc_status` | `—` (kết quả QC automation chính thức — set bởi `/qc-run-script` + `/qc-run-manualtest`) |
850
861
  | `qc_run_at` | `—` |
851
- | `qc_owner` | `—` (SC chưa pass đang chờ ai: `dev` / `po` — set bởi `/qc-run-test` + `/report-bug`) |
852
- | `qc_blocked_by` | `—` (`BUG-{id}` / `GAP-{id}` liên kết — set bởi `/qc-run-test` + `/report-bug`) |
862
+ | `qc_owner` | `—` (SC chưa pass đang chờ ai: `dev` / `po` — set bởi `/qc-run-script` + `/report-bug`) |
863
+ | `qc_blocked_by` | `—` (`BUG-{id}` / `GAP-{id}` liên kết — set bởi `/qc-run-script` + `/report-bug`) |
853
864
  | `prd_version` | `@trace.prd_version` từ header `.feature` |
854
865
  | `bdd_version` | `@trace.bdd_version` từ header `.feature` |
855
866
  | `tech_doc_revision` | `—` (revision tech-doc gộp `{TICKET-ID}-tech-design.md` — set bởi `/generate-code` + `/review-tech-docs`) |
@@ -920,6 +931,35 @@ bên trong từng sub-agent.
920
931
 
921
932
  ## Output
922
933
 
934
+ ## Chạy lại — `.feature` đã tồn tại *(mặc định GIỮ, chỉ `F` mới thay)*
935
+
936
+ Chạy lại trạm này là chuyện bình thường: PRD đổi thì BDD phải theo. Nhưng hai chế độ của Version
937
+ Check **khác hẳn nhau**, và chỉ một chế độ phá:
938
+
939
+ | Chế độ | Làm gì | Mất gì |
940
+ |---|---|---|
941
+ | **Y** — cập nhật hẹp | chỉ đụng scenario thuộc các row changelog mới hơn `@trace.prd_version` | **không mất gì** — `sc_id` cũ giữ nguyên |
942
+ | **F** — gen lại toàn bộ | sinh lại **mọi** scenario của UC | **ĐÁNH SỐ LẠI `sc_id`** |
943
+
944
+ **Trước khi thực thi `F`, in khối này và chờ xác nhận** *(mức chặn CỨNG — `--yes` không bỏ qua)*:
945
+
946
+ ```
947
+ ❌ Sắp gen lại TOÀN BỘ scenario: {feature-path}
948
+ Hiện: {n} scenario · @trace.bdd_version {v} · prd_version {pv}
949
+
950
+ Mode F đánh số lại sc_id từ SC1. Ba chỗ đang trỏ vào số cũ sẽ hỏng:
951
+ • sổ trace {UC-ID}-{platform}.tsv — mỗi row khớp theo sc_id
952
+ • tag @trace.verifies={UC-ID}-SC{N} trong code đã sinh
953
+ • TC_<FEATURE>.Test.md của làn QC — 🚫 Block và bảng phủ đều trỏ sc_id
954
+
955
+ Chỉ đổi phần PRD vừa sửa → chọn Y (cập nhật hẹp), không mất gì
956
+ PRD đã cắt changelog quá xa → F là đúng, nhưng chạy /validate-traces ngay sau để bắt lệch
957
+ Không chắc → Y trước; F luôn làm lại được, số cũ thì không
958
+ ```
959
+
960
+ > **Chọn `Y` thì KHÔNG in khối này và KHÔNG chặn** — cập nhật hẹp không làm mất gì, và hỏi lại
961
+ > một lựa chọn người dùng vừa đưa ra là cách nhanh nhất khiến `Y` thành phản xạ.
962
+
923
963
  **Đọc `.agent/steps/report-footer.md`** và áp đúng khuôn footer trong đó (Status Badge ·
924
964
  Output Artifacts · Next) cho report cuối, kèm khối bên dưới.
925
965
 
@@ -958,7 +998,7 @@ Next (umbrella):
958
998
  🔻 Tín hiệu kiểm thử bị hạ (spec vừa đổi — nghiệm thu cũ hết hiệu lực):
959
999
  {UC-ID}-SC2 dev_selftest pass→not_run · qc_status pass→not_run
960
1000
  ⚠️ {n} test của các SC này viết cho spec CŨ — rà lại nội dung, đừng chỉ chạy lại.
961
- → sau khi /generate-code: /dev-gen-test (rà test) → /dev-run-test → QC /qc-run-test
1001
+ → sau khi /generate-code: /dev-gen-test (rà test) → /dev-run-test → QC /qc-design-script
962
1002
  ℹ️ Coverage "đã kiểm đạt" sẽ TỤT trên dashboard — đó là số đúng; số cũ mới là số sai.
963
1003
  (Tỷ lệ phủ code/test KHÔNG đổi — test_count giữ nguyên vì test vẫn nằm trên đĩa.)
964
1004
 
@@ -1,6 +1,11 @@
1
1
  # /generate-code — Sinh Implementation Code
2
2
 
3
3
  ## Gate
4
+
5
+ *Checkpoint: **chặn CỨNG** — ghi đè mã nguồn đã có → XOÁ bản sửa tay của dev. Đây là artifact đắt nhất trong framework, và tới trước 2026-09-16 lệnh này vẫn ở mức `normal` — tức `--yes` ghi đè nó trong im lặng. `--yes` KHÔNG bỏ qua được (gate Bước 3a).*
6
+
7
+ *Mức cứng chỉ áp khi trạng thái là **`drifted`** hoặc **`synced`** — Bước 1 phân biệt qua sổ TSV. Trạng thái **`new`** đi thẳng, gồm cả ca headless `claude -p "/generate-code UC1 --yes"` mà `steps/gate.md` nêu làm ví dụ. Xem §Chạy lại.*
8
+
4
9
  # Gate — Quy trình vào chuẩn cho mọi lệnh
5
10
 
6
11
  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ó.
@@ -80,7 +85,7 @@ Lưu toàn bộ context đã nạp vào bộ nhớ để dùng xuyên suốt phi
80
85
 
81
86
  | Mức | Lệnh nào | `--yes` bỏ qua được? |
82
87
  |---|---|:---:|
83
- | **Không chặn** | Lệnh read-only: `/review-code` · `/validate-traces` · `/debug` · `/review-context` · `/review-tech-docs` | — (vốn không có) |
88
+ | **Không chặn** | `/review-code` · `/validate-traces` · `/debug` **KHÔNG phải vì read-only**: cả ba đều CÓ ghi file. Chúng không chặn vì thao tác ghi của chúng hoặc nằm sau một câu hỏi `(Y/N)`, hoặc nằm sau một cờ, hoặc là `append`/dựng-lại-được | — (vốn không có) |
84
89
  | **Chặn thường** | Mọi lệnh sinh/sửa artifact | ✅ |
85
90
  | **Chặn CỨNG** | Ghi đè file đã tồn tại · `--resume` áp findings · migrate · prune | ❌ **không bao giờ** |
86
91
 
@@ -88,6 +93,12 @@ Lưu toàn bộ context đã nạp vào bộ nhớ để dùng xuyên suốt phi
88
93
  `--` khỏi phần resolve target, nên cờ này không ảnh hưởng việc tìm file.) Mở đường chạy
89
94
  headless: `claude -p "/generate-code UC1 --yes"`.
90
95
 
96
+ > **Tên lệnh trong bảng trên có máy canh — `R19`.** Mỗi hàng bảng vừa nêu một mức vừa nêu
97
+ > tên lệnh sẽ bị đối chiếu với `gate.checkpoint_levels`; lệch là build đỏ. Lý do có rule này:
98
+ > ngày 2026-09-16 hai lệnh đổi mức, schema và `commands/*.tmpl` đều sửa, **build vẫn xanh**,
99
+ > mà bảng này lẫn `rules/workflow.md` đều còn liệt chúng ở mức cũ. `R11` chỉ canh
100
+ > `commands/*.tmpl` ↔ schema — *biết có máy canh không bằng biết máy canh **đến đâu***.
101
+
91
102
  > **KHÔNG tự suy mức từ bảng này.** Mỗi lệnh **tự khai** mức của nó ở một dòng `*Checkpoint: …*`
92
103
  > ngay dưới `## Gate` của chính nó — đọc dòng đó, đừng suy diễn. Bảng trên chỉ giải thích ba mức
93
104
  > **nghĩa là gì**.
@@ -679,7 +690,7 @@ Mỗi element **có action** (button, input, link, select, toggle, form-submit)
679
690
  - **`--yes` (headless)** → coi như **Y**, nhưng dòng cảnh báo ở report là **bắt buộc**. Không được im lặng: `lint-trace --code` T18 là lưới bắt phía sau, và nó chỉ có nghĩa khi người ta biết có gì để tìm.
680
691
 
681
692
  > **Vì sao hỏi chứ không tự sinh như trước.** Tự sinh rồi *"đối chiếu lúc integration"* nghe hợp lý nhưng thực tế là **code quyết định hợp đồng**: QC đọc §4.5.6 thấy rỗng nên đi dò DOM, còn FE đã gắn một bộ id không ai biết. Đến lúc đối chiếu thì cả hai bên đều đã làm xong theo hai hướng khác nhau. Hỏi ở đây là đặt quyết định đó vào tay người, **đúng lúc nó còn rẻ**.
682
- 2. **TÊN THUỘC TÍNH: đọc `@trace.testid_attr` từ header tech-doc gộp — KHÔNG tự suy từ module.** Đây là **nửa FE của contract FE↔QC**: `/qc-run-test` đọc **chính field này** để cấu hình locator, và `bin/trace-schema.json` khai `artifact: tech-design.md` (`written_by: map-testids`). Hai bên phải đọc **cùng một bản** — nếu FE suy từ module còn QC đọc tech-doc thì FE gắn một kiểu, QC tìm một kiểu, và **không trùng một element nào**.
693
+ 2. **TÊN THUỘC TÍNH: đọc `@trace.testid_attr` từ header tech-doc gộp — KHÔNG tự suy từ module.** Đây là **nửa FE của contract FE↔QC**: `/qc-design-script` đọc **chính field này** để cấu hình locator, và `bin/trace-schema.json` khai `artifact: tech-design.md` (`written_by: map-testids`). Hai bên phải đọc **cùng một bản** — nếu FE suy từ module còn QC đọc tech-doc thì FE gắn một kiểu, QC tìm một kiểu, và **không trùng một element nào**.
683
694
 
684
695
  | Đọc được gì | Làm gì |
685
696
  |---|---|
@@ -687,7 +698,7 @@ Mỗi element **có action** (button, input, link, select, toggle, form-submit)
687
698
  | **Không tìm thấy field** | **Cảnh báo mềm, KHÔNG im lặng hardcode** (khối dưới), rồi mới fallback theo `active_module` |
688
699
  | Header `.feature` cũng khai và **LỆCH** với tech-doc | Ưu tiên tech-doc, nhưng **in cả hai giá trị** — không im lặng chọn một bên. `.feature` là lối cũ, chỉ còn cho stack lai |
689
700
 
690
- Cảnh báo khi thiếu field (cùng khuôn `/qc-run-test` dùng, để hai nửa của contract nói cùng một giọng):
701
+ Cảnh báo khi thiếu field (cùng khuôn `/qc-design-script` dùng, để hai nửa của contract nói cùng một giọng):
691
702
  ```
692
703
  ⚠️ Tech-doc thiếu @trace.testid_attr — fallback theo module ({attr mặc định}).
693
704
  Nếu FE dùng thuộc tính khác thì MỌI locator của QC sẽ trượt, và test sẽ đỏ với
@@ -840,7 +851,7 @@ Bất kể trường hợp nào, in khối này ở report cuối để dev khô
840
851
  🔻 Tín hiệu kiểm thử bị hạ ({spec vừa đổi | vừa lấp stub} — nghiệm thu cũ hết hiệu lực):
841
852
  {sc_id}: dev_selftest pass→not_run · qc_status pass→not_run
842
853
  ⚠️ {n} test của các SC này viết cho bản cũ — rà lại nội dung, đừng chỉ chạy lại.
843
- → /dev-run-test {UC-ID} rồi QC chạy /qc-run-test {UC-ID}
854
+ → /dev-run-test {UC-ID} rồi QC chạy /qc-run-script {UC-ID}
844
855
  ℹ️ Coverage "đã kiểm đạt" trên dashboard sẽ TỤT sau lần này — đó là số đúng;
845
856
  số cũ mới là số sai. (Tỷ lệ phủ code/test không đổi — test_count giữ nguyên.)
846
857
  ```
@@ -938,6 +949,34 @@ git commit -m "{commit_format}: {description}"
938
949
 
939
950
  ## Output
940
951
 
952
+ ## Chạy lại — code của UC đã tồn tại *(GIỮ bản sửa tay, chỉ đụng phần drift)*
953
+
954
+ Đây là artifact đắt nhất trong framework, và tới trước 2026-09-16 lệnh này vẫn ở mức `normal` —
955
+ tức `--yes` ghi đè mã nguồn dev đã sửa tay **trong im lặng**.
956
+
957
+ Khác ba lệnh `hard` cùng nhóm, lệnh này **không có điểm hỏi nào khác**: Bước 1 tự phân biệt
958
+ `new` / `drifted` / `synced` qua sổ TSV rồi đi tiếp. Nên CHECKPOINT là chỗ dừng duy nhất.
959
+
960
+ **Khi trạng thái là `drifted` hoặc `synced`, in khối này** *(mức chặn CỨNG)*:
961
+
962
+ ```
963
+ ❌ Code của {UC-ID} đã tồn tại — trạng thái: {drifted|synced}
964
+ File: {danh sách file mang @trace.implements của UC này}
965
+ Sổ trace: gen_version {gv} · spec_version {sv} · test_count {tc}
966
+
967
+ Sinh lại ghi đè cả phần dev đã sửa tay. Thường mất:
968
+ • xử lý edge-case thêm sau khi /dev-run-test báo đỏ
969
+ • mock/fixture chỉnh tay (chính /dev-run-test hướng dẫn làm)
970
+ • bản vá từ /fix-bug — kèm @trace.fixes / @trace.root_cause
971
+
972
+ Chỉ sửa một lỗi cụ thể → /fix-bug {TICKET_ID} (sửa ĐIỂM, trên nhánh riêng)
973
+ Spec đổi, muốn áp phần đổi → tiếp tục, rồi /dev-run-test ngay để bắt hồi quy
974
+ Muốn xem lệch chỗ nào trước → /validate-traces --prd {domain}/{prd-slug}
975
+ ```
976
+
977
+ > **Trạng thái `new` (chưa có code) đi thẳng, không chặn** — đây là ca headless mà
978
+ > `steps/gate.md` nêu làm ví dụ (`claude -p "/generate-code UC1 --yes"`), và nó không đổi.
979
+
941
980
  **Đọc `.agent/steps/report-footer.md`** và áp đúng khuôn footer trong đó (Status Badge ·
942
981
  Output Artifacts · Next) cho report cuối, kèm khối bên dưới.
943
982
 
@@ -80,7 +80,7 @@ Lưu toàn bộ context đã nạp vào bộ nhớ để dùng xuyên suốt phi
80
80
 
81
81
  | Mức | Lệnh nào | `--yes` bỏ qua được? |
82
82
  |---|---|:---:|
83
- | **Không chặn** | Lệnh read-only: `/review-code` · `/validate-traces` · `/debug` · `/review-context` · `/review-tech-docs` | — (vốn không có) |
83
+ | **Không chặn** | `/review-code` · `/validate-traces` · `/debug` **KHÔNG phải vì read-only**: cả ba đều CÓ ghi file. Chúng không chặn vì thao tác ghi của chúng hoặc nằm sau một câu hỏi `(Y/N)`, hoặc nằm sau một cờ, hoặc là `append`/dựng-lại-được | — (vốn không có) |
84
84
  | **Chặn thường** | Mọi lệnh sinh/sửa artifact | ✅ |
85
85
  | **Chặn CỨNG** | Ghi đè file đã tồn tại · `--resume` áp findings · migrate · prune | ❌ **không bao giờ** |
86
86
 
@@ -88,6 +88,12 @@ Lưu toàn bộ context đã nạp vào bộ nhớ để dùng xuyên suốt phi
88
88
  `--` khỏi phần resolve target, nên cờ này không ảnh hưởng việc tìm file.) Mở đường chạy
89
89
  headless: `claude -p "/generate-code UC1 --yes"`.
90
90
 
91
+ > **Tên lệnh trong bảng trên có máy canh — `R19`.** Mỗi hàng bảng vừa nêu một mức vừa nêu
92
+ > tên lệnh sẽ bị đối chiếu với `gate.checkpoint_levels`; lệch là build đỏ. Lý do có rule này:
93
+ > ngày 2026-09-16 hai lệnh đổi mức, schema và `commands/*.tmpl` đều sửa, **build vẫn xanh**,
94
+ > mà bảng này lẫn `rules/workflow.md` đều còn liệt chúng ở mức cũ. `R11` chỉ canh
95
+ > `commands/*.tmpl` ↔ schema — *biết có máy canh không bằng biết máy canh **đến đâu***.
96
+
91
97
  > **KHÔNG tự suy mức từ bảng này.** Mỗi lệnh **tự khai** mức của nó ở một dòng `*Checkpoint: …*`
92
98
  > ngay dưới `## Gate` của chính nó — đọc dòng đó, đừng suy diễn. Bảng trên chỉ giải thích ba mức
93
99
  > **nghĩa là gì**.
@@ -4,6 +4,8 @@
4
4
 
5
5
  *Checkpoint: **chặn CỨNG** — ghi đè PRD đã có → mất changelog, ĐÁNH SỐ LẠI BR, phá @trace.business_rules trong mọi .feature đã sinh. `--yes` KHÔNG bỏ qua được (gate Bước 3a).*
6
6
 
7
+ *Mức cứng chỉ áp khi PRD **đã tồn tại** — và khi đó Bước 1 **DỪNG HẲN**, không cả hỏi Y/N ("Tồn tại → DỪNG. KHÔNG ghi, KHÔNG hỏi Y/N"). PRD chưa có: đi thẳng.*
8
+
7
9
  # Gate — Quy trình vào chuẩn cho mọi lệnh
8
10
 
9
11
  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ó.
@@ -83,7 +85,7 @@ Lưu toàn bộ context đã nạp vào bộ nhớ để dùng xuyên suốt phi
83
85
 
84
86
  | Mức | Lệnh nào | `--yes` bỏ qua được? |
85
87
  |---|---|:---:|
86
- | **Không chặn** | Lệnh read-only: `/review-code` · `/validate-traces` · `/debug` · `/review-context` · `/review-tech-docs` | — (vốn không có) |
88
+ | **Không chặn** | `/review-code` · `/validate-traces` · `/debug` **KHÔNG phải vì read-only**: cả ba đều CÓ ghi file. Chúng không chặn vì thao tác ghi của chúng hoặc nằm sau một câu hỏi `(Y/N)`, hoặc nằm sau một cờ, hoặc là `append`/dựng-lại-được | — (vốn không có) |
87
89
  | **Chặn thường** | Mọi lệnh sinh/sửa artifact | ✅ |
88
90
  | **Chặn CỨNG** | Ghi đè file đã tồn tại · `--resume` áp findings · migrate · prune | ❌ **không bao giờ** |
89
91
 
@@ -91,6 +93,12 @@ Lưu toàn bộ context đã nạp vào bộ nhớ để dùng xuyên suốt phi
91
93
  `--` khỏi phần resolve target, nên cờ này không ảnh hưởng việc tìm file.) Mở đường chạy
92
94
  headless: `claude -p "/generate-code UC1 --yes"`.
93
95
 
96
+ > **Tên lệnh trong bảng trên có máy canh — `R19`.** Mỗi hàng bảng vừa nêu một mức vừa nêu
97
+ > tên lệnh sẽ bị đối chiếu với `gate.checkpoint_levels`; lệch là build đỏ. Lý do có rule này:
98
+ > ngày 2026-09-16 hai lệnh đổi mức, schema và `commands/*.tmpl` đều sửa, **build vẫn xanh**,
99
+ > mà bảng này lẫn `rules/workflow.md` đều còn liệt chúng ở mức cũ. `R11` chỉ canh
100
+ > `commands/*.tmpl` ↔ schema — *biết có máy canh không bằng biết máy canh **đến đâu***.
101
+
94
102
  > **KHÔNG tự suy mức từ bảng này.** Mỗi lệnh **tự khai** mức của nó ở một dòng `*Checkpoint: …*`
95
103
  > ngay dưới `## Gate` của chính nó — đọc dòng đó, đừng suy diễn. Bảng trên chỉ giải thích ba mức
96
104
  > **nghĩa là gì**.
@@ -84,7 +84,7 @@ Lưu toàn bộ context đã nạp vào bộ nhớ để dùng xuyên suốt phi
84
84
 
85
85
  | Mức | Lệnh nào | `--yes` bỏ qua được? |
86
86
  |---|---|:---:|
87
- | **Không chặn** | Lệnh read-only: `/review-code` · `/validate-traces` · `/debug` · `/review-context` · `/review-tech-docs` | — (vốn không có) |
87
+ | **Không chặn** | `/review-code` · `/validate-traces` · `/debug` **KHÔNG phải vì read-only**: cả ba đều CÓ ghi file. Chúng không chặn vì thao tác ghi của chúng hoặc nằm sau một câu hỏi `(Y/N)`, hoặc nằm sau một cờ, hoặc là `append`/dựng-lại-được | — (vốn không có) |
88
88
  | **Chặn thường** | Mọi lệnh sinh/sửa artifact | ✅ |
89
89
  | **Chặn CỨNG** | Ghi đè file đã tồn tại · `--resume` áp findings · migrate · prune | ❌ **không bao giờ** |
90
90
 
@@ -92,6 +92,12 @@ Lưu toàn bộ context đã nạp vào bộ nhớ để dùng xuyên suốt phi
92
92
  `--` khỏi phần resolve target, nên cờ này không ảnh hưởng việc tìm file.) Mở đường chạy
93
93
  headless: `claude -p "/generate-code UC1 --yes"`.
94
94
 
95
+ > **Tên lệnh trong bảng trên có máy canh — `R19`.** Mỗi hàng bảng vừa nêu một mức vừa nêu
96
+ > tên lệnh sẽ bị đối chiếu với `gate.checkpoint_levels`; lệch là build đỏ. Lý do có rule này:
97
+ > ngày 2026-09-16 hai lệnh đổi mức, schema và `commands/*.tmpl` đều sửa, **build vẫn xanh**,
98
+ > mà bảng này lẫn `rules/workflow.md` đều còn liệt chúng ở mức cũ. `R11` chỉ canh
99
+ > `commands/*.tmpl` ↔ schema — *biết có máy canh không bằng biết máy canh **đến đâu***.
100
+
95
101
  > **KHÔNG tự suy mức từ bảng này.** Mỗi lệnh **tự khai** mức của nó ở một dòng `*Checkpoint: …*`
96
102
  > ngay dưới `## Gate` của chính nó — đọc dòng đó, đừng suy diễn. Bảng trên chỉ giải thích ba mức
97
103
  > **nghĩa là gì**.