@edupia-tutor/spec-driven-docs 0.14.0 → 0.14.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 (162) hide show
  1. package/bin/index.js +12 -1
  2. package/commands/debug.md +436 -436
  3. package/commands/debug.tmpl +111 -111
  4. package/commands/define-product.md +350 -345
  5. package/commands/define-product.tmpl +69 -64
  6. package/commands/dev-gen-test.md +365 -365
  7. package/commands/dev-gen-test.tmpl +63 -63
  8. package/commands/dev-run-test.md +376 -376
  9. package/commands/dev-run-test.tmpl +74 -74
  10. package/commands/dev-smoke-test.md +341 -341
  11. package/commands/dev-smoke-test.tmpl +60 -60
  12. package/commands/fix-bug.md +403 -403
  13. package/commands/fix-bug.tmpl +78 -78
  14. package/commands/generate-bdd.md +513 -513
  15. package/commands/generate-bdd.tmpl +211 -211
  16. package/commands/generate-code.md +481 -483
  17. package/commands/generate-code.tmpl +179 -181
  18. package/commands/generate-design-spec.md +497 -497
  19. package/commands/generate-design-spec.tmpl +220 -220
  20. package/commands/generate-prd.md +452 -400
  21. package/commands/generate-prd.tmpl +50 -200
  22. package/commands/generate-spec-manifest.md +340 -340
  23. package/commands/generate-spec-manifest.tmpl +59 -59
  24. package/commands/generate-tech-docs.md +365 -365
  25. package/commands/generate-tech-docs.tmpl +84 -84
  26. package/commands/learn.md +347 -347
  27. package/commands/learn.tmpl +22 -22
  28. package/commands/map-testids.md +322 -322
  29. package/commands/map-testids.tmpl +41 -41
  30. package/commands/propose-scenario.md +335 -335
  31. package/commands/propose-scenario.tmpl +54 -54
  32. package/commands/qc-analyze.md +323 -324
  33. package/commands/qc-analyze.tmpl +42 -43
  34. package/commands/qc-design-test.md +304 -304
  35. package/commands/qc-design-test.tmpl +23 -23
  36. package/commands/qc-plan.md +297 -297
  37. package/commands/qc-plan.tmpl +16 -16
  38. package/commands/qc-report.md +302 -302
  39. package/commands/qc-report.tmpl +21 -21
  40. package/commands/qc-review.md +298 -298
  41. package/commands/qc-review.tmpl +17 -17
  42. package/commands/qc-run-test.md +337 -337
  43. package/commands/qc-run-test.tmpl +35 -35
  44. package/commands/refine-prd.md +428 -430
  45. package/commands/refine-prd.tmpl +62 -62
  46. package/commands/report-bug.md +351 -351
  47. package/commands/report-bug.tmpl +70 -70
  48. package/commands/review-code.md +364 -364
  49. package/commands/review-code.tmpl +39 -39
  50. package/commands/review-context.md +578 -580
  51. package/commands/review-context.tmpl +212 -212
  52. package/commands/review-tech-docs.md +427 -427
  53. package/commands/review-tech-docs.tmpl +146 -146
  54. package/commands/setup-ai-first.md +239 -239
  55. package/commands/setup-ai-first.tmpl +133 -133
  56. package/commands/sync.md +145 -145
  57. package/commands/sync.tmpl +93 -93
  58. package/commands/update-framework.md +88 -88
  59. package/commands/update-framework.tmpl +36 -36
  60. package/commands/validate-traces.md +381 -381
  61. package/commands/validate-traces.tmpl +100 -100
  62. package/core/FRAMEWORK_VERSION +1 -1
  63. package/core/commands/debug.md +436 -436
  64. package/core/commands/define-product.md +350 -345
  65. package/core/commands/dev-gen-test.md +365 -365
  66. package/core/commands/dev-run-test.md +376 -376
  67. package/core/commands/dev-smoke-test.md +341 -341
  68. package/core/commands/fix-bug.md +403 -403
  69. package/core/commands/generate-bdd.md +513 -513
  70. package/core/commands/generate-code.md +481 -483
  71. package/core/commands/generate-design-spec.md +497 -497
  72. package/core/commands/generate-prd.md +452 -400
  73. package/core/commands/generate-spec-manifest.md +340 -340
  74. package/core/commands/generate-tech-docs.md +365 -365
  75. package/core/commands/learn.md +347 -347
  76. package/core/commands/map-testids.md +322 -322
  77. package/core/commands/propose-scenario.md +335 -335
  78. package/core/commands/qc-analyze.md +323 -324
  79. package/core/commands/qc-design-test.md +304 -304
  80. package/core/commands/qc-plan.md +297 -297
  81. package/core/commands/qc-report.md +302 -302
  82. package/core/commands/qc-review.md +298 -298
  83. package/core/commands/qc-run-test.md +337 -337
  84. package/core/commands/refine-prd.md +428 -430
  85. package/core/commands/report-bug.md +351 -351
  86. package/core/commands/review-code.md +364 -364
  87. package/core/commands/review-context.md +578 -580
  88. package/core/commands/review-tech-docs.md +427 -427
  89. package/core/commands/setup-ai-first.md +239 -239
  90. package/core/commands/sync.md +145 -145
  91. package/core/commands/update-framework.md +88 -88
  92. package/core/commands/validate-traces.md +381 -381
  93. package/core/skills/code/SKILL.md +389 -389
  94. package/core/skills/debug/SKILL.md +391 -391
  95. package/core/skills/design-spec/SKILL.md +318 -318
  96. package/core/skills/discovery/SKILL.md +7 -547
  97. package/core/skills/prd/SKILL.md +298 -394
  98. package/core/skills/setup-ai-first/SKILL.md +80 -80
  99. package/core/skills/spec/SKILL.md +178 -178
  100. package/core/skills/test/SKILL.md +604 -604
  101. package/core/steps/capture-lesson.md +44 -44
  102. package/core/steps/context-loader.md +175 -175
  103. package/core/steps/gate.md +54 -54
  104. package/core/steps/report-footer.md +52 -52
  105. package/core/steps/review-fanout.md +85 -87
  106. package/core/steps/spawn-agent.md +45 -45
  107. package/core/steps/trace-mirror.md +21 -21
  108. package/core/templates/architecture.template.md +37 -37
  109. package/core/templates/design-spec.template.md +77 -77
  110. package/core/templates/platform-guide.template.md +47 -47
  111. package/core/templates/prd.template.md +107 -232
  112. package/core/templates/product-definition.template.md +101 -88
  113. package/core/templates/project-context.yaml +2 -2
  114. package/docs/01-getting-started/core-concepts.md +1 -1
  115. package/docs/01-getting-started/quickstart.md +7 -7
  116. package/docs/02-guides/developer/bdd-and-trace.md +1 -1
  117. package/docs/02-guides/developer/scenarios.md +5 -5
  118. package/docs/02-guides/product-owner/handoff-checklist.md +1 -1
  119. package/docs/02-guides/product-owner/scenarios.md +23 -23
  120. package/docs/02-guides/tester/bug-reporting.md +2 -2
  121. package/docs/02-guides/tester/reading-specs.md +2 -2
  122. package/docs/02-guides/tester/scenarios.md +1 -1
  123. package/docs/02-guides/tester/spec-manifest.md +3 -3
  124. package/docs/02-guides/tester/workflow.md +1 -1
  125. package/docs/03-concepts/architecture.md +3 -3
  126. package/docs/03-concepts/pipeline.md +3 -3
  127. package/docs/04-operations/publishing.md +20 -3
  128. package/docs/04-operations/sync-and-update.md +5 -5
  129. package/docs/05-reference/command-cheatsheet.md +2 -2
  130. package/docs/05-reference/commands.md +8 -8
  131. package/package.json +1 -1
  132. package/scripts/migrate-specs.js +5 -3
  133. package/scripts/rename-prd-files.js +174 -0
  134. package/skills/code/SKILL.md +389 -389
  135. package/skills/code/SKILL.tmpl +56 -56
  136. package/skills/debug/SKILL.md +391 -391
  137. package/skills/debug/SKILL.tmpl +60 -60
  138. package/skills/design-spec/SKILL.md +318 -318
  139. package/skills/design-spec/SKILL.tmpl +37 -37
  140. package/skills/discovery/SKILL.md +7 -547
  141. package/skills/discovery/SKILL.tmpl +7 -140
  142. package/skills/prd/SKILL.md +298 -394
  143. package/skills/prd/SKILL.tmpl +40 -151
  144. package/skills/setup-ai-first/SKILL.md +80 -80
  145. package/skills/setup-ai-first/SKILL.tmpl +28 -28
  146. package/skills/spec/SKILL.md +178 -178
  147. package/skills/spec/SKILL.tmpl +20 -20
  148. package/skills/test/SKILL.md +604 -604
  149. package/skills/test/SKILL.tmpl +44 -44
  150. package/steps/capture-lesson.md +44 -44
  151. package/steps/context-loader.md +175 -175
  152. package/steps/gate.md +54 -54
  153. package/steps/report-footer.md +52 -52
  154. package/steps/review-fanout.md +85 -87
  155. package/steps/spawn-agent.md +45 -45
  156. package/steps/trace-mirror.md +21 -21
  157. package/templates/architecture.template.md +37 -37
  158. package/templates/design-spec.template.md +77 -77
  159. package/templates/platform-guide.template.md +47 -47
  160. package/templates/prd.template.md +107 -232
  161. package/templates/product-definition.template.md +101 -88
  162. package/templates/project-context.yaml +2 -2
@@ -1,10 +1,10 @@
1
1
  ---
2
- description: Generates unit and integration tests from BDD specs, runs the test suite and reports results, or dev-smoke-tests live API endpoints on a running service. Trigger when: "/dev-gen-test", "/dev-run-test", "/dev-smoke-test", "tạo test", "viết test", "chạy test", "generate tests", "run tests", "test kết quả", "smoke test", "test API", "kiểm tra endpoint đang chạy".
2
+ description: Sinh unit integration test từ BDD spec, chạy test suite report kết quả, hoặc dev-smoke-test các API endpoint live trên service đang chạy. Trigger when: "/dev-gen-test", "/dev-run-test", "/dev-smoke-test", "tạo test", "viết test", "chạy test", "generate tests", "run tests", "test kết quả", "smoke test", "test API", "kiểm tra endpoint đang chạy".
3
3
  ---
4
4
 
5
5
  # Test Skills — Generate, Run & Smoke Test
6
6
 
7
- This skill handles three commands: `/dev-gen-test`, `/dev-run-test`, and `/dev-smoke-test`.
7
+ Skill này xử ba lệnh: `/dev-gen-test`, `/dev-run-test`, `/dev-smoke-test`.
8
8
 
9
9
  ---
10
10
 
@@ -13,102 +13,102 @@ This skill handles three commands: `/dev-gen-test`, `/dev-run-test`, and `/dev-s
13
13
  ### Gate
14
14
 
15
15
  <!-- Directory: specs/*/*/bdd/*.feature — or pass UC-ID/class path as argument -->
16
- # Gate — Universal Entry Procedure
16
+ # Gate — Quy trình vào chuẩn cho mọi lệnh
17
17
 
18
- Every command must execute this gate before proceeding with its specific logic.
18
+ 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ó.
19
19
 
20
- ## Step 0 — Sub-Agent Mode Check
20
+ ## Bước 0 — Kiểm tra chế độ Sub-Agent
21
21
 
22
- Before anything else, check if `$ARGUMENTS` is a JSON payload from an orchestrator:
22
+ Trước tiên, kiểm tra xem `$ARGUMENTS` phải payload JSON từ một orchestrator hay không:
23
23
 
24
- 1. Attempt to parse `$ARGUMENTS` as JSON.
25
- 2. If it parses successfully **and** contains `"_agent_mode": true`:
26
- - **Skip Steps 1, 2, and 3 of this Gate entirely.**
27
- - Set target file = `payload.target_file`
28
- - Set loaded context = `payload.context` (do NOT run context-loader.md)
29
- - Set UC scope = `payload.uc_id` (process only this UC)
30
- - Set line range = `payload.uc_section` (read only that PRD section)
31
- - Proceed directly to the command-specific logic.
32
- 3. If `$ARGUMENTS` is not JSON or `_agent_mode` is absent continue to Step 1 (normal mode).
24
+ 1. Thử parse `$ARGUMENTS` dưới dạng JSON.
25
+ 2. Nếu parse thành công **và** chứa `"_agent_mode": true`:
26
+ - **Bỏ qua hoàn toàn Bước 1, 2 3 của Gate này.**
27
+ - Đặt target file = `payload.target_file`
28
+ - Đặt loaded context = `payload.context` (KHÔNG chạy context-loader.md)
29
+ - Đặt phạm vi UC = `payload.uc_id` (chỉ xử UC này)
30
+ - Đặt line range = `payload.uc_section` (chỉ đọc đúng section đó của PRD)
31
+ - Đi thẳng tới phần logic riêng của lệnh.
32
+ 3. Nếu `$ARGUMENTS` không phải JSON hoặc không có `_agent_mode` tiếp tục sang Bước 1 (chế độ thường).
33
33
 
34
- ## Step 0-B — Model Check
34
+ ## Bước 0-B — Kiểm tra Model
35
35
 
36
- *Skip this step if `_agent_mode: true` (sub-agent — orchestrator already validated).*
36
+ *Bỏ qua bước này nếu `_agent_mode: true` (sub-agent — orchestrator đã kiểm tra rồi).*
37
37
 
38
- Complex generation and review commands require strong reasoning.
39
- Using a smaller model risks missed edge cases, incomplete spec analysis, and architecture violations.
38
+ Các lệnh sinh nội dung và review phức tạp đòi hỏi khả năng suy luận mạnh.
39
+ Dùng model nhỏ hơn sẽ rủi ro: bỏ sót edge case, phân tích spec thiếu sót, vi phạm kiến trúc.
40
40
 
41
- Display and wait for response:
41
+ Hiển thị chờ phản hồi:
42
42
 
43
43
  ```
44
44
  ⚙️ MODEL CHECK
45
45
  ──────────────────────────────────────────────────────────────────
46
- Recommended : claude-opus-4 (or latest Opus model)
47
- Why needed : Spec analysis, architecture review, code generation
48
- require deep reasoning. Smaller models miss edge cases.
46
+ Recommended : claude-opus-4 (hoặc model Opus mới nhất)
47
+ Why needed : Phân tích spec, review kiến trúc, sinh code đòi hỏi
48
+ suy luận sâu. Model nhỏ hơn dễ bỏ sót edge case.
49
49
 
50
- To switch in Claude Code:
51
- • Settings → Model → select "claude-opus"
52
- or: /model → choose claude-opus
50
+ Cách đổi trong Claude Code:
51
+ • Settings → Model → chọn "claude-opus"
52
+ hoặc: /model → chọn claude-opus
53
53
 
54
- Running on claude-opus?
55
- Y — yes, on claude-opus → proceed
56
- S — skip check (I accept lower quality risk with current model)
54
+ Đang chạy claude-opus?
55
+ Y — đúng, đang dùng claude-opus → tiếp tục
56
+ S — bỏ qua kiểm tra (tôi chấp nhận rủi ro chất lượng thấp hơn với model hiện tại)
57
57
  ──────────────────────────────────────────────────────────────────
58
58
  ```
59
59
 
60
- - "Y" → proceed to Step 1.
61
- - "S" → proceed to Step 1 (user accepts risk, add ⚠️ to final report).
62
- - "N" or anything else → **STOP.** Output: "Please switch to claude-opus, then re-run this command."
60
+ - "Y" → tiếp tục sang Bước 1.
61
+ - "S" → tiếp tục sang Bước 1 (người dùng chấp nhận rủi ro, thêm ⚠️ vào report cuối).
62
+ - "N" hoặc bất kỳ giá trị nào khác → **DỪNG.** Xuất: "Vui lòng chuyển sang claude-opus rồi chạy lại lệnh này."
63
63
 
64
- ## Step 1 — Resolve Target File
64
+ ## Bước 1 — Xác định Target File
65
65
 
66
- 1. If `$ARGUMENTS` is provided and points to an existing file → use it directly as the target.
67
- 2. If `$ARGUMENTS` is a **bare UC-ID / ticket ID / partial name** (no path) → resolve it to a file by globbing the feature-package layout. The `{prd-slug}` is **not known yet**, so use a `*` wildcard for that segment, and a recursive `**` under `bdd/` so the platform subfolders (`bdd/web/`, `bdd/app/`, `bdd/system/`) are all covered:
68
- - **BDD commands** (target is a `.feature`): `{specs_dir}/{domain}/*/bdd/**/{UC-ID}*.feature` — or `{specs_dir}/*/*/bdd/**/{UC-ID}*.feature` if the domain is also unknown. If a platform/scope is implied by the command (e.g. a system tech-doc needs the `system/` BDD), prefer the match under that platform subfolder.
69
- - **PRD commands** (target is `prd.md`): `{specs_dir}/{domain}/*/prd.md` (match the feature folder whose id corresponds), else `{specs_dir}/*/*/prd.md`.
70
- - **tech-docs commands**: `{specs_dir}/{domain}/*/tech-docs/{UC-ID}*-tech-design*.md`.
71
- - **design-spec commands**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
66
+ 1. Nếu `$ARGUMENTS` được cung cấp trỏ tới một file tồn tại dùng trực tiếp làm target.
67
+ 2. Nếu `$ARGUMENTS` một **UC-ID / ticket ID / tên rút gọn** (không path) → phân giải thành file bằng cách glob theo bố cục feature-package. `{prd-slug}` lúc này **chưa biết**, nên dùng wildcard `*` cho segment đó, `**` đệ quy dưới `bdd/` để phủ hết các thư mục con theo platform (`bdd/web/`, `bdd/app/`, `bdd/system/`):
68
+ - **Lệnh BDD** (target `.feature`): `{specs_dir}/{domain}/*/bdd/**/{UC-ID}*.feature` — hoặc `{specs_dir}/*/*/bdd/**/{UC-ID}*.feature` nếu domain cũng chưa biết. Nếu lệnh ngụ ý một platform/scope cụ thể (vd: system tech-doc cần BDD `system/`), ưu tiên kết quả trong thư mục con platform đó.
69
+ - **Lệnh PRD** (target file PRD `{TICKET-ID}-{prd-slug}.md` — file `.md` duy nhất ở gốc feature folder, cạnh `bdd/`): `{specs_dir}/{domain}/*/{TICKET-ID}*.md` nếu biết TICKET-ID; nếu không, `{specs_dir}/{domain}/*/*.md` (khớp feature folder id tương ứng), hoặc `{specs_dir}/*/*/*.md` nếu domain cũng chưa biết. *(Glob `*/*.md` ở cấp gốc folder chỉ khớp PRD — tech-docs/design-spec `.md` nằm sâu hơn trong thư mục con.)*
70
+ - **Lệnh tech-docs**: `{specs_dir}/{domain}/*/tech-docs/{UC-ID}*-tech-design*.md`.
71
+ - **Lệnh design-spec**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
72
72
 
73
- Once a file matches: set it as the target **and** record `domain` + `prd_slug` from its path (per the extraction rule in `context-loader.md` Step 1 — `prd_slug` = first segment after `{specs_dir}/{domain}/`). Every path the command later reads or writes (sibling BDD/tech-docs/design-spec/trace) uses **that resolved `prd_slug`**, so all artifacts stay in one feature package. If several files match (e.g. multiple platforms), pick per the command's platform/scope or list them and ask.
74
- 3. If `$ARGUMENTS` is empty or no match found:
75
- - List files in the relevant directory for this command (e.g., `specs/*/*/prd.md` for PRD commands, `specs/*/*/bdd/**/*.feature` for BDD commands).
76
- - Present the list to the user and ask: "Which file do you want to work with? (Enter number or filename)"
77
- - Wait for user selection before continuing.
73
+ Khi một file khớp: đặt làm target **và** ghi lại `domain` + `prd_slug` từ path của nó (theo quy tắc trích xuất trong `context-loader.md` Bước 1 — `prd_slug` = segment đầu tiên sau `{specs_dir}/{domain}/`). Mọi path lệnh đọc/ghi về sau (BDD/tech-docs/design-spec/trace cùng cấp) đều dùng **`prd_slug` đã phân giải đó**, nên tất cả artifact nằm chung một feature package. Nếu nhiều file khớp (vd: nhiều platform), chọn theo platform/scope của lệnh hoặc liệt kê ra và hỏi.
74
+ 3. Nếu `$ARGUMENTS` rỗng hoặc không tìm thấy file khớp:
75
+ - Liệt các file trong thư mục liên quan của lệnh này (vd: `specs/*/*/*.md` file PRD ở gốc mỗi feature folder — cho lệnh PRD, `specs/*/*/bdd/**/*.feature` cho lệnh BDD).
76
+ - Hiển thị danh sách cho người dùng và hỏi: "Bạn muốn làm việc với file nào? (Nhập số thứ tự hoặc tên file)"
77
+ - Chờ người dùng chọn rồi mới tiếp tục.
78
78
 
79
- ## Step 2 — Execute Context Loader
79
+ ## Bước 2 — Chạy Context Loader
80
80
 
81
- Load all project context by following the procedure in `steps/context-loader.md`.
82
- Store all loaded context in memory for use throughout this command session.
81
+ Nạp toàn bộ context của dự án bằng cách làm theo quy trình trong `steps/context-loader.md`.
82
+ Lưu toàn bộ context đã nạp vào bộ nhớ để dùng xuyên suốt phiên làm việc của lệnh.
83
83
 
84
- ## Step 3 — CHECKPOINT
84
+ ## Bước 3 — CHECKPOINT
85
85
 
86
- After completing Steps 1 and 2, display a summary and wait for confirmation:
86
+ Sau khi hoàn thành Bước 1 2, hiển thị bản tóm tắt chờ xác nhận:
87
87
 
88
88
  ```
89
89
  CHECKPOINT
90
90
  -----------
91
91
  Target : {resolved file path}
92
- Project : {project.name from project-context.yaml}
92
+ Project : {project.name từ project-context.yaml}
93
93
  Tech stack : {language} / {framework}
94
- Module : {module if set, else "not configured"}
95
- Domains : {comma-separated domain list}
94
+ Module : {module nếu có, else "not configured"}
95
+ Domains : {danh sách domain, ngăn cách bởi dấu phẩy}
96
96
 
97
- Proceed? (Y/N)
97
+ Tiếp tục? (Y/N)
98
98
  ```
99
99
 
100
- Wait for explicit "Y" or "N" from the user before continuing.
101
- - "Y" → proceed to the command-specific steps below.
102
- - "N" → stop and ask what the user wants to change.
100
+ Chờ người dùng trả lời rõ ràng "Y" hoặc "N" rồi mới tiếp tục.
101
+ - "Y" → tiếp tục sang các bước riêng của lệnh bên dưới.
102
+ - "N" → dừng lại hỏi người dùng muốn thay đổi gì.
103
103
 
104
104
 
105
- Also read:
106
- - `.feature` file to understand expected behaviors
107
- - Find files to test: Controllers with `@trace.implements={UC-ID}`, Service implementations, Facade implementations (if applicable)
105
+ Cũng đọc:
106
+ - File `.feature` để hiểu các behavior kỳ vọng
107
+ - Tìm file cần test: Controller `@trace.implements={UC-ID}`, Service implementation, Facade implementation (nếu áp dụng)
108
108
 
109
109
  ### CHECKPOINT — Test Plan
110
110
 
111
- Before generating, present plan:
111
+ Trước khi sinh, trình bày plan:
112
112
 
113
113
  ```
114
114
  Test Plan — {UC-ID}:
@@ -127,7 +127,7 @@ Total: {N} test classes, ~{M} test cases
127
127
  Proceed? (Y/N)
128
128
  ```
129
129
 
130
- Wait for confirmation.
130
+ Chờ xác nhận.
131
131
 
132
132
  ### Generate
133
133
 
@@ -199,7 +199,7 @@ class {Resource}ControllerTest {
199
199
 
200
200
  ### File Placement
201
201
 
202
- Follow project test structure from CLAUDE.md. Typical:
202
+ Theo cấu trúc test của dự án từ CLAUDE.md. Điển hình:
203
203
  ```
204
204
  src/test/{language}/{package}/
205
205
  ├── service/impl/{Resource}ServiceImplTest.{ext}
@@ -209,11 +209,11 @@ src/test/{language}/{package}/
209
209
 
210
210
  ### Self-Review Checklist
211
211
 
212
- - [ ] `@trace.verifies` tag on every test class
213
- - [ ] Every scenario in .feature has at least one test
214
- - [ ] Mock only the correct layer (no repo mocks in controller tests)
215
- - [ ] Test names follow `methodName_whenCondition_shouldOutcome` pattern
216
- - [ ] No debug print statements in tests
212
+ - [ ] Tag `@trace.verifies` trên mỗi test class
213
+ - [ ] Mỗi scenario trong .feature ít nhất một test
214
+ - [ ] Chỉ mock đúng layer (không mock repo trong controller test)
215
+ - [ ] Test name theo pattern `methodName_whenCondition_shouldOutcome`
216
+ - [ ] Không debug print trong test
217
217
 
218
218
  ### Output
219
219
 
@@ -224,38 +224,38 @@ src/test/{language}/{package}/
224
224
  ✅ controller/{Controller}Test.{ext} ({M} tests)
225
225
  ```
226
226
 
227
- # Report Footer — Standard Command Output Format
227
+ # Report Footer — Định dạng output chuẩn cho mọi lệnh
228
228
 
229
- Every command report must end with this standard footer section.
229
+ Mọi report của lệnh phải kết thúc bằng section footer chuẩn này.
230
230
 
231
231
  ## Status Badge
232
232
 
233
- Choose one based on outcome:
234
- - `✅ Complete` — all steps succeeded, no issues found
235
- - `❌ Failed` — command could not complete due to a blocking error
236
- - `⚠️ Warnings` — completed with non-blocking issues that should be reviewed
233
+ Chọn một theo kết quả:
234
+ - `✅ Complete` — mọi bước thành công, không vấn đề
235
+ - `❌ Failed` — lệnh không hoàn thành được do lỗi chặn
236
+ - `⚠️ Warnings` — hoàn thành nhưng vấn đề không chặn, nên review lại
237
237
 
238
238
  ## Output Artifacts
239
239
 
240
- List every file created or modified by this command:
240
+ Liệt mọi file được tạo hoặc sửa bởi lệnh này:
241
241
  ```
242
242
  Output Artifacts:
243
- {created|updated} {file-path} ({brief description})
244
- {created|updated} {file-path} ({brief description})
243
+ {created|updated} {file-path} ({ tả ngắn})
244
+ {created|updated} {file-path} ({ tả ngắn})
245
245
  ```
246
246
 
247
- If no files were written (e.g., review or analysis commands) → write `Output Artifacts: none (read-only)`.
247
+ Nếu không ghi file nào (vd: lệnh review hoặc phân tích) → ghi `Output Artifacts: none (read-only)`.
248
248
 
249
249
  ## Pipeline Position
250
250
 
251
- Print a one-line map of the pipeline with the CURRENT command's phase marked `◀ bạn ở đây`,
252
- so the user always sees where this command sits in the end-to-end flow:
251
+ In một đồ pipeline một dòng, đánh dấu phase của lệnh HIỆN TẠI bằng `◀ bạn ở đây`,
252
+ để người dùng luôn thấy lệnh này nằm đâu trong luồng end-to-end:
253
253
 
254
254
  ```
255
255
  Discovery → PRD → [Design Spec] → BDD → Tech Design → Code → Dev Self-Check → QC → Trace Audit
256
256
  ```
257
257
 
258
- Find the current command in this phase legend and mark **its** phase in the map above:
258
+ Tìm lệnh hiện tại trong bảng phase dưới đây đánh dấu **phase của nó** trong sơ đồ trên:
259
259
 
260
260
  | Phase | Commands |
261
261
  |-------|----------|
@@ -269,61 +269,61 @@ Find the current command in this phase legend and mark **its** phase in the map
269
269
  | QC | `/qc-analyze` · `/qc-plan` · `/qc-design-test` · `/qc-review` · `/qc-run-test` · `/qc-report` |
270
270
  | Trace Audit | `/validate-traces` |
271
271
 
272
- For a **review command**, also append the 3-step review loop with the current step marked, e.g.:
272
+ Với **lệnh review**, thêm vòng review 3 bước đánh dấu bước hiện tại, vd:
273
273
  `Vòng review: [① phân tích ◀] → ② Review Board → ③ --resume`.
274
274
 
275
- **Cross-cutting commands** (`/sync`, `/update-framework`, `/fix-bug`, `/debug`, `/learn`,
276
- `/report-bug`, `/propose-scenario`, `/generate-spec-manifest`) sit outside the linear pipeline
277
- **omit the Pipeline line entirely** for these (do not force-fit them onto the map).
275
+ **Lệnh xuyên suốt** (`/sync`, `/update-framework`, `/fix-bug`, `/debug`, `/learn`,
276
+ `/report-bug`, `/propose-scenario`, `/generate-spec-manifest`) nằm ngoài pipeline tuyến tính
277
+ **bỏ hẳn dòng Pipeline** cho các lệnh này (đừng cố nhét chúng vào đồ).
278
278
 
279
- ## Next Command Suggestion
279
+ ## Gợi ý lệnh tiếp theo
280
280
 
281
- Suggest the logical next command based on workflow phase:
281
+ Gợi ý lệnh kế tiếp hợp theo phase của workflow:
282
282
 
283
- | Current command | Suggest next |
283
+ | Lệnh hiện tại | Gợi ý lệnh tiếp theo |
284
284
  |-------------------------|-----------------------------------------------|
285
- | /setup-ai-first | `/define-product` to start your first feature |
285
+ | /setup-ai-first | `/define-product` để bắt đầu feature đầu tiên |
286
286
  | /define-product | `/generate-prd {product-definition-file}` |
287
- | /generate-prd | `/refine-prd {prd-file}` then `/review-context {prd-file}` |
288
- | /refine-prd | Open Review Board → update PRD → `/review-context {prd-file}` |
289
- | /review-context (PRD) | FE/App: `/generate-design-spec {prd-file}` (then BDD after sign-off); BE: `/generate-bdd {prd-file}` directly; fix PRD if NEEDS_FIX |
290
- | /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
291
- | /generate-bdd | `/review-context {feature-file}` to verify coverage |
292
- | /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
293
- | /qc-analyze | `/qc-plan {UC-ID}` (resolve 🔴 blocker gaps first) |
287
+ | /generate-prd | `/refine-prd {prd-file}` rồi `/review-context {prd-file}` |
288
+ | /refine-prd | Mở Review Board → cập nhật PRD → `/review-context {prd-file}` |
289
+ | /review-context (PRD) | FE/App: `/generate-design-spec {prd-file}` (rồi BDD sau khi sign-off); BE: `/generate-bdd {prd-file}` trực tiếp; sửa PRD nếu NEEDS_FIX |
290
+ | /generate-design-spec | Designer review → xác nhận link Figma → PO + Designer sign-off → `/generate-bdd {prd-file}` |
291
+ | /generate-bdd | `/review-context {feature-file}` để kiểm tra độ phủ |
292
+ | /review-context (BDD) | `/generate-tech-docs {UC-ID}` nếu APPROVED; sinh lại nếu NEEDS_FIX |
293
+ | /qc-analyze | `/qc-plan {UC-ID}` (xử các gap blocker 🔴 trước) |
294
294
  | /qc-plan | `/qc-design-test {UC-ID}` |
295
- | /qc-design-test | `/qc-review {UC-ID}` (test-case review) |
296
- | /qc-review (test-case) | `/qc-run-test {UC-ID}` if APPROVED; fix TCs if NEEDS_FIX |
297
- | /qc-run-test | `/qc-report {UC-ID}` then `/qc-review {UC-ID}` (script review) |
298
- | /qc-review (script) | `/qc-report {UC-ID}` then create PR if APPROVED |
299
- | /qc-report | `/validate-traces {UC-ID}` to refresh Living Docs (qc_status) |
295
+ | /qc-design-test | `/qc-review {UC-ID}` (review test-case) |
296
+ | /qc-review (test-case) | `/qc-run-test {UC-ID}` nếu APPROVED; sửa TC nếu NEEDS_FIX |
297
+ | /qc-run-test | `/qc-report {UC-ID}` rồi `/qc-review {UC-ID}` (review script) |
298
+ | /qc-review (script) | `/qc-report {UC-ID}` rồi tạo PR nếu APPROVED |
299
+ | /qc-report | `/validate-traces {UC-ID}` để làm mới Living Docs (qc_status) |
300
300
  | /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
301
- | /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
302
- | /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/dev-gen-test {UC-ID}` |
301
+ | /review-tech-docs | `/generate-code {feature-file}` nếu APPROVED; sửa doc nếu NEEDS_FIX |
302
+ | /generate-code | Lần gen đầu → `/review-code {UC-ID}`; gen lại → `/dev-gen-test {UC-ID}` |
303
303
  | /dev-gen-test | `/dev-run-test {UC-ID}` |
304
304
  | /dev-run-test (passing) | `/review-code {UC-ID}` |
305
- | /dev-run-test (failing) | `/fix-bug {ticket-id}` or `/debug {error}` |
306
- | /review-code | `/dev-smoke-test {UC-ID}` or create PR |
307
- | /dev-smoke-test | Create PR and link to ticket |
308
- | /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/dev-gen-test {UC-ID}`; all OK → create PR |
309
- | /fix-bug | Create PR and link to ticket |
310
- | /debug | `/fix-bug {ticket-id}` if fix needed |
311
- | /report-bug | Send to dev (`/fix-bug {BUG-ID}`); if coverage gap → `/propose-scenario {UC-ID}` |
312
- | /propose-scenario | Notify PO/Dev to review the proposal in `feedback/bdd-proposals/` |
313
- | /learn | Continue working — lesson applies on next command |
314
- | /sync | `/validate-traces` for full coverage; act on any `📥 tester feedback` surfaced |
315
- | /update-framework | Review `git diff .agent/`, commit; `/sync` for project content |
316
-
317
- Format the footer as:
305
+ | /dev-run-test (failing) | `/fix-bug {ticket-id}` hoặc `/debug {error}` |
306
+ | /review-code | `/dev-smoke-test {UC-ID}` hoặc tạo PR |
307
+ | /dev-smoke-test | Tạo PR link tới ticket |
308
+ | /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/dev-gen-test {UC-ID}`; tất cả OK → tạo PR |
309
+ | /fix-bug | Tạo PR link tới ticket |
310
+ | /debug | `/fix-bug {ticket-id}` nếu cần sửa |
311
+ | /report-bug | Gửi cho dev (`/fix-bug {BUG-ID}`); nếu thiếu coverage → `/propose-scenario {UC-ID}` |
312
+ | /propose-scenario | Báo PO/Dev review proposal trong `feedback/bdd-proposals/` |
313
+ | /learn | Tiếp tục làm việc — lesson áp dụng lệnh kế tiếp |
314
+ | /sync | `/validate-traces` để xem độ phủ đầy đủ; xử lý mọi `📥 tester feedback` được nêu |
315
+ | /update-framework | Review `git diff .agent/`, commit; `/sync` để đồng bộ nội dung dự án |
316
+
317
+ Định dạng footer như sau:
318
318
  ```
319
319
  ---
320
320
  Status : {badge}
321
- {Output Artifacts block}
321
+ {khối Output Artifacts}
322
322
  Pipeline : Discovery → PRD → [BDD ◀ bạn ở đây] → Tech Design → Code → Dev Self-Check → QC → Trace Audit
323
- (review cmd) Vòng review: [① phân tích ◀] → ② Review Board → ③ --resume
324
- Next : {suggested command with example arguments}
323
+ (lệnh review) Vòng review: [① phân tích ◀] → ② Review Board → ③ --resume
324
+ Next : {lệnh gợi ý kèm ví dụ tham số}
325
325
  ```
326
- *(Omit the `Pipeline` line for cross-cutting commands listed above.)*
326
+ *(Bỏ dòng `Pipeline` cho các lệnh xuyên suốt liệt kê ở trên.)*
327
327
 
328
328
 
329
329
  ---
@@ -332,53 +332,53 @@ Next : {suggested command with example arguments}
332
332
 
333
333
  ### Gate
334
334
 
335
- # Context Loader — Load All Project Context
335
+ # Context Loader — Nạp toàn bộ context dự án
336
336
 
337
- Execute these steps in order. Store everything in memory for the duration of the command session.
337
+ Thực hiện các bước theo đúng thứ tự. Lưu mọi thứ vào bộ nhớ trong suốt phiên làm việc của lệnh.
338
338
 
339
- **Priority guide (anti-lost-in-middle):**
340
- - Steps 1–2 are PROJECT-CONFIG — loaded first, resolve all paths and metadata.
341
- - Step 3 is CRITICAL — architecture + coding standards, the highest-priority facts for generation.
342
- - Step 4 is SAFETY — data protection rules, enforced silently for the entire session.
343
- - Steps 5–6 are DOMAIN KNOWLEDGE — terminology and entity definitions.
344
- - Step 7 is the WORKING MEMORY RECAP — locks critical facts into the top of working memory.
339
+ **Hướng dẫn ưu tiên (chống lost-in-middle):**
340
+ - Bước 1–2 PROJECT-CONFIG — nạp trước, phân giải mọi path metadata.
341
+ - Bước 3 CRITICAL — kiến trúc + coding standards, các sự thật ưu tiên cao nhất khi sinh nội dung.
342
+ - Bước 4 SAFETY — quy tắc bảo vệ dữ liệu, thực thi ngầm suốt cả phiên.
343
+ - Bước 5–6 DOMAIN KNOWLEDGE — thuật ngữ và định nghĩa entity.
344
+ - Bước 7 WORKING MEMORY RECAP — chốt các sự thật quan trọng lên đầu bộ nhớ làm việc.
345
345
 
346
346
  ---
347
347
 
348
- ## Step 1 — [PROJECT-CONFIG] Load project-context.yaml
348
+ ## Bước 1 — [PROJECT-CONFIG] Nạp project-context.yaml
349
349
 
350
- Read `.agent/project-context.yaml`. Extract and store:
350
+ Đọc `.agent/project-context.yaml`. Trích xuất và lưu:
351
351
 
352
352
  **Tech Stack:**
353
- - `tech_stack.language` → active language (e.g., Java 17, TypeScript, C#, Go)
354
- - `tech_stack.framework` → active framework (e.g., Spring Boot 3.2, Angular 17, .NET 8)
355
- - `tech_stack.build_tool` → build tool (e.g., Maven, npm, dotnet, go)
356
- - `tech_stack.test_framework` → test framework (e.g., JUnit 5 + Mockito, Jest, xUnit)
357
- - `tech_stack.database` → database (e.g., PostgreSQL, MySQL, MongoDB)
358
- - `tech_stack.module` → active module profile (e.g., java-spring, angular, dotnet, golang, context-engineering)
353
+ - `tech_stack.language` → ngôn ngữ đang dùng (vd: Java 17, TypeScript, C#, Go)
354
+ - `tech_stack.framework` → framework đang dùng (vd: Spring Boot 3.2, Angular 17, .NET 8)
355
+ - `tech_stack.build_tool` → build tool (vd: Maven, npm, dotnet, go)
356
+ - `tech_stack.test_framework` → test framework (vd: JUnit 5 + Mockito, Jest, xUnit)
357
+ - `tech_stack.database` → database (vd: PostgreSQL, MySQL, MongoDB)
358
+ - `tech_stack.module` → module profile đang dùng (vd: java-spring, angular, dotnet, golang, context-engineering)
359
359
 
360
360
  **Conventions:**
361
- - `conventions.build_command` → how to compile/build
362
- - `conventions.test_command` → how to run tests
363
- - `conventions.service_run` → how to start the service
364
- - `conventions.ticket_prefix` → ticket ID prefix (e.g., PROJ, FEAT, UC)
361
+ - `conventions.build_command` → cách compile/build
362
+ - `conventions.test_command` → cách chạy test
363
+ - `conventions.service_run` → cách khởi động service
364
+ - `conventions.ticket_prefix` → tiền tố ticket ID (vd: PROJ, FEAT, UC)
365
365
 
366
366
  **Domains:**
367
- - `domains` → list of active business domains
368
-
369
- **Paths (if present):**
370
- - `paths.specs_dir` → spec artifacts root — PRD, BDD, tech-docs, design-spec. Structure: `{specs_dir}/{domain}/{prd-slug}/{prd.md | bdd/ | tech-docs/ | design-spec/}`
371
- - `paths.refinement_dir` → findings/review output dir
372
- - `paths.qc_dir` → QC automation artifacts root (visible top-level, one subfolder per UC: `{qc_dir}/{UC-ID}/`)
373
- - `paths.qc_skills_dir` → where qc-* commands load QC skills from (default bundled `.agent/skills/qc`; override to the QC team's own repo/submodule so framework upgrade won't overwrite them)
374
- - `paths.product_definitions_dir` → product definitions root
375
- - `paths.domain_knowledge_dir` → domain knowledge root
376
- - `paths.business_dictionary` → path to business-dictionary.md
377
- - `paths.core_entities` → path to core-entities.md
378
- - `paths.tech_docs_dir` → technical documentation root (merged with specs_dir in feature-package layout — tech-docs live under `{specs_dir}/{domain}/{prd-slug}/tech-docs/`)
379
- - `paths.trace_dir` → trace state directory; structure: `.trace/{domain}/{prd-slug}/{UC-ID}.tsv`
380
-
381
- If `paths` section is absent, use these defaults:
367
+ - `domains` → danh sách các business domain đang hoạt động
368
+
369
+ **Paths (nếu ):**
370
+ - `paths.specs_dir` → gốc của spec artifact — PRD, BDD, tech-docs, design-spec. Cấu trúc: `{specs_dir}/{domain}/{prd-slug}/{ {TICKET-ID}-{prd-slug}.md | bdd/ | tech-docs/ | design-spec/}` (file PRD đặt tên `{TICKET-ID}-{prd-slug}.md`, là file `.md` duy nhất ở gốc feature folder)
371
+ - `paths.refinement_dir` → thư mục output cho findings/review
372
+ - `paths.qc_dir` → gốc artifact QC automation (hiện top-level, mỗi UC một thư mục con: `{qc_dir}/{UC-ID}/`)
373
+ - `paths.qc_skills_dir` → nơi các lệnh qc-* nạp QC skill (mặc định bundled `.agent/skills/qc`; override sang repo/submodule riêng của team QC để bản nâng cấp framework không ghi đè)
374
+ - `paths.product_definitions_dir` → gốc product definition
375
+ - `paths.domain_knowledge_dir` → gốc domain knowledge
376
+ - `paths.business_dictionary` → path tới business-dictionary.md
377
+ - `paths.core_entities` → path tới core-entities.md
378
+ - `paths.tech_docs_dir` → gốc tài liệu kỹ thuật (gộp với specs_dir trong bố cục feature-package — tech-docs nằm dưới `{specs_dir}/{domain}/{prd-slug}/tech-docs/`)
379
+ - `paths.trace_dir` → thư mục trạng thái trace; cấu trúc: `.trace/{domain}/{prd-slug}/{UC-ID}.tsv`
380
+
381
+ Nếu không có section `paths`, dùng các giá trị mặc định:
382
382
  - `specs_dir` = `specs`
383
383
  - `refinement_dir` = `.agent/review`
384
384
  - `qc_dir` = `docs`
@@ -390,184 +390,184 @@ If `paths` section is absent, use these defaults:
390
390
  - `tech_docs_dir` = `specs`
391
391
  - `trace_dir` = `.trace`
392
392
 
393
- Note: In the feature-package layout, `specs_dir` is the unified root. All spec artifact types (PRD, BDD, tech-docs, design-spec) live under `{specs_dir}/{domain}/{prd-slug}/`. The `prd-slug` is the feature-package folder name, not a separate config variable.
393
+ Lưu ý: Trong bố cục feature-package, `specs_dir` gốc thống nhất. Mọi loại spec artifact (PRD, BDD, tech-docs, design-spec) đều nằm dưới `{specs_dir}/{domain}/{prd-slug}/`. `prd-slug` tên folder feature-package, không phải một biến config riêng.
394
394
 
395
- **How to extract `prd_slug` (works for ANY target file, regardless of nesting depth):** given a target path of the form `{specs_dir}/{domain}/{prd-slug}/...`, take the **first path segment after `{specs_dir}/{domain}/`** — i.e. the `{prd-slug}` position. Do NOT use the file's immediate parent folder, because BDD/tech-docs/design-spec artifacts are nested one or two levels deeper inside the package. Examples:
396
- - `specs/payment/create-invoice/prd.md` → `prd_slug = create-invoice`
397
- - `specs/payment/create-invoice/bdd/system/PAY-UC1.feature` → `prd_slug = create-invoice` *(NOT `system`)*
398
- - `specs/payment/create-invoice/bdd/web/PAY-UC1.feature` → `prd_slug = create-invoice` *(NOT `web`)*
399
- - `specs/payment/create-invoice/tech-docs/PAY-UC1-tech-design.md` → `prd_slug = create-invoice` *(NOT `tech-docs`)*
395
+ **Cách trích xuất `prd_slug` (đúng cho MỌI target file, bất kể độ sâu lồng nhau):** với một path target dạng `{specs_dir}/{domain}/{prd-slug}/...`, lấy **segment path đầu tiên sau `{specs_dir}/{domain}/`** — tức vị trí `{prd-slug}`. KHÔNG dùng folder cha trực tiếp của file, artifact BDD/tech-docs/design-spec lồng sâu hơn một hoặc hai cấp bên trong package. Ví dụ:
396
+ - `specs/payment/create-invoice/PAY01-create-invoice.md` → `prd_slug = create-invoice`
397
+ - `specs/payment/create-invoice/bdd/system/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `system`)*
398
+ - `specs/payment/create-invoice/bdd/web/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `web`)*
399
+ - `specs/payment/create-invoice/tech-docs/PAY-UC1-tech-design.md` → `prd_slug = create-invoice` *(KHÔNG phải `tech-docs`)*
400
400
  - `specs/payment/create-invoice/design-spec/PAY-design-spec-web.md` → `prd_slug = create-invoice`
401
401
 
402
- All sibling artifacts of one feature (PRD, every platform's BDD, the BE + FE tech-docs, the design-spec, and the trace TSV) therefore resolve to the **same `prd_slug`** — so a synthesized **system** BDD or **system/BE** tech-doc lands in the same `{specs_dir}/{domain}/{prd-slug}/` package as the web/app artifacts it was derived from.
402
+ Mọi artifact cùng cấp của một feature (PRD, BDD của từng platform, tech-docs BE + FE, design-spec, trace TSV) đều phân giải về **cùng một `prd_slug`** — nên một BDD **system** hay tech-doc **system/BE** được tổng hợp sẽ nằm chung package `{specs_dir}/{domain}/{prd-slug}/` với các artifact web/app được suy ra từ đó.
403
403
 
404
- If `tech_stack.module` is set, also load `.agent/modules/{module}/stack-profile.yaml` if it exists.
404
+ Nếu `tech_stack.module` được đặt, đồng thời nạp `.agent/modules/{module}/stack-profile.yaml` nếu file tồn tại.
405
405
 
406
406
  ---
407
407
 
408
- ## Step 1.5 — [SERVICE ROUTING] Resolve service paths (umbrella mode)
408
+ ## Bước 1.5 — [SERVICE ROUTING] Phân giải path service (chế độ umbrella)
409
409
 
410
- *Skip this step entirely if `setup.mode` is not `"umbrella"` and `services` section is absent from project-context.yaml.*
410
+ *Bỏ qua hoàn toàn bước này nếu `setup.mode` không phải `"umbrella"` không có section `services` trong project-context.yaml.*
411
411
 
412
- If `services` section is present:
412
+ Nếu section `services`:
413
413
 
414
- **1. Detect active domain** (in priority order):
415
- - Read `@trace.domain` from target file frontmatter (if Gate loaded a target file)
416
- - Extract from target file path: `domain` = the first segment after the `specs_dir` base path; `prd_slug` = the next segment (the feature-package folder). This holds for any target depth see the `prd_slug` extraction rule in Step 1.
417
- *(e.g., `specs/user/create-account/prd.md` **and** `specs/user/create-account/bdd/system/UC1.feature` both → domain = `user`, prd_slug = `create-account`)*
418
- - If `$ARGUMENTS` contains a path, extract the domain segment after `specs_dir`
414
+ **1. Phát hiện active domain** (theo thứ tự ưu tiên):
415
+ - Đọc `@trace.domain` từ frontmatter của target file (nếu Gate đã nạp một target file)
416
+ - Trích xuất từ path target file: `domain` = segment đầu tiên sau base path `specs_dir`; `prd_slug` = segment kế tiếp (folder feature-package). Điều này đúng mọi độ sâu target — xem quy tắc trích xuất `prd_slug` Bước 1.
417
+ *(vd: `specs/user/create-account/USR01-create-account.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
418
+ - Nếu `$ARGUMENTS` chứa một path, trích xuất segment domain sau `specs_dir`
419
419
 
420
- **2. Route to service** — if active domain matches a key in `services`:
421
- - Override `paths.specs_dir` → `services.{domain}.specs_dir` — **only if `setup.spec_source` is NOT set.** When `spec_source` IS set, ALL BDD (web/app/**system**) is a shared cross-team artifact leave `specs_dir` for step 4 to route to the spec repo; do NOT pin it per-service here.
422
- - Override `paths.tech_docs_dir` → `services.{domain}.tech_docs_dir` — **only if `setup.spec_source` is NOT set.** When `spec_source` IS set, the tech-design (API contract) is a cross-team artifact and must live in the shared spec repo (handled in step 4), so leave `tech_docs_dir` for step 4 to route — do NOT pin it per-service here.
423
- - Store `active_service` = `services.{domain}.path`
424
- - Store `active_service_module` = `services.{domain}.module`
425
- - If service has its own `module` → use it as `active_module` (overrides `tech_stack.module`)
420
+ **2. Route tới service** — nếu active domain khớp với một key trong `services`:
421
+ - Override `paths.specs_dir` → `services.{domain}.specs_dir` — **chỉ khi `setup.spec_source` KHÔNG được đặt.** Khi `spec_source` ĐƯỢC đặt, MỌI BDD (web/app/**system**) artifact dùng chung liên team → để bước 4 route sang spec repo; KHÔNG pin theo service ở đây.
422
+ - Override `paths.tech_docs_dir` → `services.{domain}.tech_docs_dir` — **chỉ khi `setup.spec_source` KHÔNG được đặt.** Khi `spec_source` ĐƯỢC đặt, tech-design (API contract) artifact liên team phải nằm trong spec repo dùng chung (xử bước 4), nên để bước 4 route `tech_docs_dir` KHÔNG pin theo service ở đây.
423
+ - Lưu `active_service` = `services.{domain}.path`
424
+ - Lưu `active_service_module` = `services.{domain}.module`
425
+ - Nếu service `module` riêng dùng làm `active_module` (override `tech_stack.module`)
426
426
 
427
- **3. Fallback** — if domain not detected or no matching service key:
428
- - Keep default paths from Step 1
429
- - Set `active_service = unresolved`
427
+ **3. Fallback** — nếu không phát hiện được domain hoặc không có service key khớp:
428
+ - Giữ path mặc định từ Bước 1
429
+ - Đặt `active_service = unresolved`
430
430
 
431
- **4. Spec source auto-override** — if `setup.spec_source` is set AND the corresponding path was not already explicitly set in `paths:`:
432
- - Override `paths.specs_dir` → `{spec_source}/specs` — **always when `spec_source` is set.** All spec artifacts (PRD, BDD, tech-docs, design-spec) live under the unified spec root in the shared spec repo using the feature-package layout: `{spec_source}/specs/{domain}/{prd-slug}/`. Every umbrella (FE/App/BE) reads from here. *(Per-service `specs/` only when there is no `spec_source`.)*
433
- - Override `paths.tech_docs_dir` → `{spec_source}/specs` — **always when `spec_source` is set** (step 2 no longer pins tech-docs per-service in this case). Tech-docs live at `{spec_source}/specs/{domain}/{prd-slug}/tech-docs/`. The tech-design IS the cross-team API contract: BE authors it here, and FE/App read it from the same spec submodule at `/generate-code --phase=integration`. *(Per-service tech-docs only happen when there is no `spec_source` — a pure multi-service BE repo with no shared spec module.)*
431
+ **4. Tự động override theo spec source** — nếu `setup.spec_source` được đặt path tương ứng chưa được set tường minh trong `paths:`:
432
+ - Override `paths.specs_dir` → `{spec_source}/specs` — **luôn khi `spec_source` được đặt.** Mọi spec artifact (PRD, BDD, tech-docs, design-spec) nằm dưới gốc spec thống nhất trong spec repo dùng chung theo bố cục feature-package: `{spec_source}/specs/{domain}/{prd-slug}/`. Mọi umbrella (FE/App/BE) đều đọc từ đây. *(`specs/` theo service chỉ khi không `spec_source`.)*
433
+ - Override `paths.tech_docs_dir` → `{spec_source}/specs` — **luôn khi `spec_source` được đặt** (bước 2 không còn pin tech-docs theo service trong trường hợp này). Tech-docs nằm tại `{spec_source}/specs/{domain}/{prd-slug}/tech-docs/`. Tech-design CHÍNH API contract liên team: BE viết đây, FE/App đọc từ cùng spec submodule tại `/generate-code --phase=integration`. *(tech-docs theo service chỉ xảy ra khi không có `spec_source` — repo BE thuần đa-service không spec module dùng chung.)*
434
434
  - Override `paths.domain_knowledge_dir` → `{spec_source}/specs/domain-knowledge`
435
435
  - Override `paths.business_dictionary` → `{spec_source}/specs/domain-knowledge/business-dictionary.md`
436
436
  - Override `paths.core_entities` → `{spec_source}/specs/domain-knowledge/core-entities.md`
437
437
  - Override `paths.bug_reports_dir` → `{spec_source}/feedback/bug-reports`
438
438
  - Override `paths.bdd_proposals_dir` → `{spec_source}/feedback/bdd-proposals`
439
439
  - Override `paths.prd_change_requests_dir` → `{spec_source}/feedback/prd-change-requests`
440
- - Override `paths.trace_dir` → `{spec_source}/.trace` — **always when `spec_source` is set.** Trace TSVs are consolidated in the spec repo (single authoritative location, no per-service split) so the PM/PO has one place to manage status. Internal structure: `.trace/{domain}/{prd-slug}/{UC-ID}.tsv`. Code-side commands (`/generate-code`, `/dev-run-test`, `/qc-run-test`) run from `service_root` but **write their trace row into `{spec_source}/.trace/{domain}/{prd-slug}/`** — like they already push `feedback/` there. *(Per-service `.trace` only when there is no `spec_source`.)*
440
+ - Override `paths.trace_dir` → `{spec_source}/.trace` — **luôn khi `spec_source` được đặt.** Trace TSV được gộp vào spec repo (một nơi authoritative duy nhất, không tách theo service) để PM/PO một chỗ duy nhất quản lý trạng thái. Cấu trúc bên trong: `.trace/{domain}/{prd-slug}/{UC-ID}.tsv`. Các lệnh phía code (`/generate-code`, `/dev-run-test`, `/qc-run-test`) chạy từ `service_root` nhưng **ghi trace row của chúng vào `{spec_source}/.trace/{domain}/{prd-slug}/`** — giống như chúng đã push `feedback/` vào đó. *(`.trace` theo service chỉ khi không `spec_source`.)*
441
441
 
442
- > **Why under `spec_source`:** PRD, BDD, tech-docs, design-spec, domain knowledge, tester feedback, **and the `.trace/` coverage state** are all **cross-team artifacts** — they live in the **shared spec repo** using the feature-package layout so every umbrella (FE/App/BE) and the PM read one source via `/sync`. In the feature-package layout, a single `specs/{domain}/{prd-slug}/` folder groups all artifact types for one PRD, making the spec repo self-contained and navigable by feature. The service submodule holds only **code** (+ build/test tooling). `.trace/` and `feedback/` are the dev/QC **write areas** in the spec repo. In single-service mode (no `spec_source`), everything defaults under the repo root still one repo.
442
+ > ** sao đặt dưới `spec_source`:** PRD, BDD, tech-docs, design-spec, domain knowledge, feedback của tester, ** trạng thái coverage `.trace/`** đều **artifact liên team** — chúng nằm trong **spec repo dùng chung** theo bố cục feature-package để mọi umbrella (FE/App/BE) PM đọc từ một nguồn qua `/sync`. Trong bố cục feature-package, một folder `specs/{domain}/{prd-slug}/` gom tất cả loại artifact của một PRD, giúp spec repo tự đủ dễ điều hướng theo feature. Service submodule chỉ chứa **code** (+ tooling build/test). `.trace/` `feedback/` khu vực **ghi** của dev/QC trong spec repo. chế độ single-service (không `spec_source`), mọi thứ mặc định dưới gốc repo — vẫn một repo.
443
443
 
444
444
  ---
445
445
 
446
- ## Step 1.6 — [SERVICE CONVENTIONS] Load service-specific conventions (umbrella mode)
446
+ ## Bước 1.6 — [SERVICE CONVENTIONS] Nạp convention riêng của service (chế độ umbrella)
447
447
 
448
- *Skip this step entirely if `active_service` is `"unresolved"` or context is single-service mode.*
448
+ *Bỏ qua hoàn toàn bước này nếu `active_service` `"unresolved"` hoặc context chế độ single-service.*
449
449
 
450
- When `active_service` has been resolved to a real path in Step 1.5 (e.g., `user-service/`):
450
+ Khi `active_service` đã được phân giải thành một path thật Bước 1.5 (vd: `user-service/`):
451
451
 
452
- **1. Locate service config** — try in priority order:
452
+ **1. Định vị config của service** — thử theo thứ tự ưu tiên:
453
453
  - `{active_service}/.agent/project-context.yaml`
454
454
  - `{active_service}/project-context.yaml`
455
455
 
456
- **2. If found, override with service-specific values:**
456
+ **2. Nếu tìm thấy, override bằng giá trị riêng của service:**
457
457
 
458
- | Variable | Source |
458
+ | Biến | Nguồn |
459
459
  |----------|--------|
460
- | `conventions.test_command` | service's `conventions.test_command` |
461
- | `conventions.build_command` | service's `conventions.build_command` |
462
- | `paths.trace_dir` | **If `spec_source` is setkeep the Step 4 spec-repo route (`{spec_source}/.trace`); ignore any service-level `trace_dir`.** Only when there is no `spec_source`: `{active_service}/{service paths.trace_dir}` (default `{active_service}/.trace`). |
463
- | `paths.specs_dir` | **If `spec_source` is setkeep the Step 4 spec-repo route (`{spec_source}/specs`); ignore any service-level `specs_dir`** (all spec artifacts are cross-team, never per-service in this mode). Only when there is no `spec_source`: `{active_service}/{service paths.specs_dir}` if set, else the Step 1.5 override. |
460
+ | `conventions.test_command` | `conventions.test_command` của service |
461
+ | `conventions.build_command` | `conventions.build_command` của service |
462
+ | `paths.trace_dir` | **Nếu `spec_source` được đặtgiữ route spec-repo của bước 4 (`{spec_source}/.trace`); bỏ qua mọi `trace_dir` cấp service.** Chỉ khi không `spec_source`: `{active_service}/{service paths.trace_dir}` (mặc định `{active_service}/.trace`). |
463
+ | `paths.specs_dir` | **Nếu `spec_source` được đặtgiữ route spec-repo của bước 4 (`{spec_source}/specs`); bỏ qua mọi `specs_dir` cấp service** (mọi spec artifact đều liên team, không bao giờ theo service chế độ này). Chỉ khi không `spec_source`: `{active_service}/{service paths.specs_dir}` nếu được set, else dùng override ở Bước 1.5. |
464
464
 
465
- **3. Store** `service_root = {active_service}` as the working directory anchor for all downstream commands:
466
- - Shell commands (`/dev-run-test`, `/dev-gen-test`) run **from within** `service_root`
467
- - **Source/test files** are written relative to `service_root`; **trace TSVs** are written to `{paths.trace_dir}` (the spec repo when `spec_source` is seta cross-repo write, committed/pushed to the spec submodule like `feedback/`).
465
+ **3. Lưu** `service_root = {active_service}` làm mốc thư mục làm việc cho mọi lệnh phía sau:
466
+ - Các lệnh shell (`/dev-run-test`, `/dev-gen-test`) chạy **bên trong** `service_root`
467
+ - **File source/test** được ghi tương đối với `service_root`; **trace TSV** được ghi vào `{paths.trace_dir}` ( spec repo khi `spec_source` được đặtmột thao tác ghi liên-repo, commit/push vào spec submodule giống như `feedback/`).
468
468
 
469
- **4. If service config not found** — keep umbrella defaults, still set `service_root = {active_service}` (path anchor is always needed even without a config override).
469
+ **4. Nếu không tìm thấy config của service** — giữ mặc định umbrella, vẫn set `service_root = {active_service}` (luôn cần mốc path kể cả khi không config override).
470
470
 
471
471
  ---
472
472
 
473
- ## Step 2 — [PROJECT-CONFIG] Load module stack profile (conditional)
473
+ ## Bước 2 — [PROJECT-CONFIG] Nạp module stack profile (có điều kiện)
474
474
 
475
- If `tech_stack.module` is set, read `.agent/modules/{module}/stack-profile.yaml`.
476
- Merge framework-specific conventions (layer patterns, test patterns, naming rules) into the loaded context.
477
- If the file does not existskip silently.
475
+ Nếu `tech_stack.module` được đặt, đọc `.agent/modules/{module}/stack-profile.yaml`.
476
+ Merge các convention riêng của framework (layer pattern, test pattern, quy tắc đặt tên) vào context đã nạp.
477
+ Nếu file không tồn tạibỏ qua âm thầm.
478
478
 
479
479
  ---
480
480
 
481
- ## Step 3 — [CRITICAL] Load CLAUDE.md (layered: root + service overlay)
481
+ ## Bước 3 — [CRITICAL] Nạp CLAUDE.md (phân tầng: root + service overlay)
482
482
 
483
- *This is the highest-priority contextit defines HOW to write code and documents for this project.*
483
+ *Đây context ưu tiên cao nhất định nghĩa CÁCH viết code tài liệu cho dự án này.*
484
484
 
485
- CLAUDE.md is loaded in **two layers** so umbrella-wide rules and service-specific
486
- architecture/coding standards compose correctly. The agent always sits at the umbrella
487
- root, but the implementation code lives in a service submodule with its OWN stack,
488
- architecture, and conventions — so the service's CLAUDE.md must win for code generation.
485
+ CLAUDE.md được nạp theo **hai tầng** để các quy tắc toàn-umbrella kiến trúc/coding standards
486
+ riêng của service kết hợp đúng cách. Agent luôn đứng gốc umbrella, nhưng code triển khai nằm
487
+ trong một service submodule với stack, kiến trúc, convention RIÊNG của — nên CLAUDE.md của
488
+ service phải thắng khi sinh code.
489
489
 
490
- **Layer 1 — [BASE] Root CLAUDE.md (umbrella-wide).**
491
- Read `CLAUDE.md` at the repo root. Treat its contents as the **shared baseline** for the
492
- whole umbrella git conventions, data-protection posture, cross-cutting rules, and (in
493
- single-service mode) the project's only architecture + coding standards.
490
+ **Tầng 1 — [BASE] Root CLAUDE.md (toàn umbrella).**
491
+ Đọc `CLAUDE.md` gốc repo. Coi nội dung của **nền tảng dùng chung** cho cả umbrella —
492
+ git convention, thế bảo vệ dữ liệu, quy tắc xuyên suốt, (ở chế độ single-service) là
493
+ kiến trúc + coding standards duy nhất của dự án.
494
494
 
495
- **Layer 2 — [OVERLAY] Service CLAUDE.md (umbrella mode only).**
496
- *Run only if `service_root` was set in Step 1.6 (i.e. a real service was routed to).*
497
- Read `{service_root}/CLAUDE.md`. This file defines the architecture + coding standards of
498
- the **actual stack being implemented** (e.g. `user-service` = java-spring, `web` = nextjs).
499
- Overlay it on top of Layer 1: **on any conflict, the service value WINS** for architecture,
500
- coding standards, and error handling. Layer-1 values that the service does not redefine
501
- (e.g. git conventions, banned patterns shared org-wide) remain in effect.
495
+ **Tầng 2 — [OVERLAY] Service CLAUDE.md (chỉ chế độ umbrella).**
496
+ *Chỉ chạy nếu `service_root` đã được set Bước 1.6 (tức đã route tới một service thật).*
497
+ Đọc `{service_root}/CLAUDE.md`. File này định nghĩa kiến trúc + coding standards của **stack
498
+ thực sự đang được triển khai** (vd: `user-service` = java-spring, `web` = nextjs).
499
+ Overlay lên trên Tầng 1: **khi xung đột, giá trị của service THẮNG** cho kiến trúc,
500
+ coding standards, error handling. Các giá trị Tầng 1 mà service không định nghĩa lại
501
+ (vd: git convention, banned pattern dùng chung toàn tổ chức) vẫn hiệu lực.
502
502
 
503
- From the **merged** result, extract and store:
503
+ Từ kết quả **đã merge**, trích xuất và lưu:
504
504
 
505
- - **§1 Project Overview** → project name, language, framework, build/test commands, domains
506
- - **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules — *service overlay wins*
507
- - **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns — *service overlay wins*
508
- - **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name — *service overlay wins*
509
- - **§7 Git Conventions** → branch naming pattern, commit message format — *root baseline unless service redefines*
505
+ - **§1 Project Overview** → tên dự án, ngôn ngữ, framework, lệnh build/test, domains
506
+ - **§2 Architecture** → thứ tự layer (vd: Controller → Facade → Service → Repository), quy tắc kiến trúc — *service overlay thắng*
507
+ - **§3 Coding Standards** → quy tắc đặt tên (class, method), kiểu response wrapper, pattern bị cấm — *service overlay thắng*
508
+ - **§5 Error Handling** → kiểu exception, mapping HTTP status code, tên class not-found exception — *service overlay thắng*
509
+ - **§7 Git Conventions** → pattern đặt tên branch, format commit message — *lấy theo root trừ khi service định nghĩa lại*
510
510
 
511
- **Resolution rules:**
512
- - If both layers exist → merge as above; record `claude_md_source = root + {service_root}`.
513
- - If only the service overlay exists (no root CLAUDE.md) → use the service file alone; `claude_md_source = {service_root}`.
514
- - If `service_root` is set but `{service_root}/CLAUDE.md` is **missing** → fall back to root CLAUDE.md and flag ⚠️ in the Step 7 recap (the service has no architecture/coding-standards definition — code generation will use umbrella defaults, which may be the wrong stack).
515
- - If neither existsnote CLAUDE.md as missing and continue with project-context.yaml data only.
511
+ **Quy tắc phân giải:**
512
+ - Nếu cả hai tầng tồn tại → merge như trên; ghi `claude_md_source = root + {service_root}`.
513
+ - Nếu chỉ service overlay (không root CLAUDE.md) → dùng file service một mình; `claude_md_source = {service_root}`.
514
+ - Nếu `service_root` được set nhưng `{service_root}/CLAUDE.md` **thiếu** → fallback về root CLAUDE.md gắn cờ ⚠️ trong recap Bước 7 (service không định nghĩa kiến trúc/coding-standards — việc sinh code sẽ dùng mặc định umbrella, thể sai stack).
515
+ - Nếu cả hai đều không tồn tại ghi nhận CLAUDE.md thiếu tiếp tục chỉ với dữ liệu từ project-context.yaml.
516
516
 
517
517
  ---
518
518
 
519
- ## Step 4 — [SAFETY] Load Data Protection Rules
519
+ ## Bước 4 — [SAFETY] Nạp quy tắc bảo vệ dữ liệu
520
520
 
521
- Read `.agent/rules/data-protection.md` (or `rules/data-protection.md` from the framework installation).
521
+ Đọc `.agent/rules/data-protection.md` (hoặc `rules/data-protection.md` từ bản cài đặt framework).
522
522
 
523
- Store the sensitive file patternsyou must **never** read, write, display, or reference content from files matching those patterns for the entire session.
523
+ Lưu các pattern file nhạy cảm bạn **tuyệt đối không** đọc, ghi, hiển thị, hay tham chiếu nội dung từ các file khớp những pattern đó trong suốt cả phiên.
524
524
 
525
- If neither file existsapply built-in defaults: never access `.env*`, `*.key`, `*.pem`, `*secret*`, `*password*`, `*credential*`.
525
+ Nếu cả hai file đều không tồn tại áp dụng mặc định built-in: không bao giờ truy cập `.env*`, `*.key`, `*.pem`, `*secret*`, `*password*`, `*credential*`.
526
526
 
527
527
  ---
528
528
 
529
- ## Step 5 — [DOMAIN] Load Business Dictionary (conditional)
529
+ ## Bước 5 — [DOMAIN] Nạp Business Dictionary (có điều kiện)
530
530
 
531
- Check if the business dictionary file exists (use `paths.business_dictionary` resolved in Step 1).
531
+ Kiểm tra file business dictionary tồn tại không (dùng `paths.business_dictionary` đã phân giải ở Bước 1).
532
532
 
533
- If it exists, read it and extract:
534
- - **Canonical Terms** → complete list of approved terms and their definitions
535
- - **Banned Terms** → complete list of banned terms and their canonical replacements
536
- - **Status / Enum Registry** → allowed enum values per entity
533
+ Nếu tồn tại, đọc trích xuất:
534
+ - **Canonical Terms** → danh sách đầy đủ các thuật ngữ chuẩn và định nghĩa
535
+ - **Banned Terms** → danh sách đầy đủ các thuật ngữ bị cấm và bản thay thế chuẩn
536
+ - **Status / Enum Registry** → các giá trị enum được phép theo từng entity
537
537
 
538
- Store the banned terms list for **active enforcement** throughout the command session:
539
- - When generating any text (PRD, BDD, code comments, tech docs), verify no banned terms appear
540
- - Replace banned terms with their canonical equivalents automatically
538
+ Lưu danh sách banned term để **thực thi chủ động** suốt phiên làm việc của lệnh:
539
+ - Khi sinh bất kỳ văn bản nào (PRD, BDD, comment code, tech docs), kiểm tra không có banned term nào xuất hiện
540
+ - Tự động thay banned term bằng bản chuẩn tương đương
541
541
 
542
- If the file does not existskip silently. Do not warn or block.
542
+ Nếu file không tồn tạibỏ qua âm thầm. Không cảnh báo hay chặn.
543
543
 
544
544
  ---
545
545
 
546
- ## Step 6 — [DOMAIN] Load Core Entities (conditional)
546
+ ## Bước 6 — [DOMAIN] Nạp Core Entities (có điều kiện)
547
547
 
548
- Check if the core entities file exists at `paths.core_entities` (resolved in Step 1).
549
- Default path: `specs/domain-knowledge/core-entities.md`.
548
+ Kiểm tra file core entities tồn tại tại `paths.core_entities` không (đã phân giải ở Bước 1).
549
+ Path mặc định: `specs/domain-knowledge/core-entities.md`.
550
550
 
551
- If it exists, read it and store:
552
- - **Entity catalog** → for each entity: its name, purpose, owner service, key fields (name + type), business invariants, and relationships
553
- - **Field name registry** → canonical field names to use in generated code and documents
554
- - **Relationship map** → how entities relate to each other (1:N, N:N, embedded, etc.)
551
+ Nếu tồn tại, đọc lưu:
552
+ - **Entity catalog** → với mỗi entity: tên, mục đích, service sở hữu, các field chính (tên + kiểu), business invariant, quan hệ
553
+ - **Field name registry** → tên field chuẩn dùng trong code tài liệu được sinh ra
554
+ - **Relationship map** → cách các entity liên hệ với nhau (1:N, N:N, embedded, v.v.)
555
555
 
556
- **How to use this catalog:**
557
- - When generating code: use the field names, types, and relationships defined heredo NOT infer from existing code
558
- - When generating PRD/BDD: reference entity names from this catalog for consistency
559
- - When generating tech-docs: use this catalog as the source-of-truth for entity definitions
556
+ **Cách dùng catalog này:**
557
+ - Khi sinh code: dùng tên field, kiểu, quan hệ định nghĩa ở đây KHÔNG suy đoán từ code có sẵn
558
+ - Khi sinh PRD/BDD: tham chiếu tên entity từ catalog này để nhất quán
559
+ - Khi sinh tech-docs: dùng catalog này làm nguồn chân lý cho định nghĩa entity
560
560
 
561
- If the file does not existskip silently.
561
+ Nếu file không tồn tạibỏ qua âm thầm.
562
562
 
563
563
  ---
564
564
 
565
- ## Step 6.5 — [PLATFORM] Derive active_module and platform_type
565
+ ## Bước 6.5 — [PLATFORM] Suy ra active_module platform_type
566
566
 
567
- Using `tech_stack.module` loaded in Step 1, derive and store two variables for use by all downstream commands:
567
+ Dùng `tech_stack.module` đã nạp Bước 1, suy ra lưu hai biến để mọi lệnh phía sau dùng:
568
568
 
569
569
  ```
570
- active_module = tech_stack.module (e.g. "java-spring", "react", "flutter")
570
+ active_module = tech_stack.module (vd: "java-spring", "react", "flutter")
571
571
  ```
572
572
 
573
573
  | `platform_type` | Modules |
@@ -576,73 +576,73 @@ active_module = tech_stack.module (e.g. "java-spring", "react", "flutter")
576
576
  | `web-frontend` | `react`, `nextjs`, `vue`, `nuxt`, `angular` |
577
577
  | `mobile` | `flutter`, `react-native`, `ios-swiftui`, `android-compose` |
578
578
 
579
- If `tech_stack.module` is blank or not recognized → set `platform_type = "unknown"` and flag as ⚠️ in the Step 7 recap.
579
+ Nếu `tech_stack.module` rỗng hoặc không nhận diện được → set `platform_type = "unknown"` gắn cờ ⚠️ trong recap Bước 7.
580
580
 
581
- These two variables (`active_module`, `platform_type`) are the canonical source for all branching logic in commands that need platform-specific behavior (dev-gen-test, debug, fix-bug, dev-smoke-test).
581
+ Hai biến này (`active_module`, `platform_type`) nguồn chuẩn cho mọi logic rẽ nhánh trong các lệnh cần hành vi riêng theo platform (dev-gen-test, debug, fix-bug, dev-smoke-test).
582
582
 
583
583
  ---
584
584
 
585
- ## Step 6.7 — [GUARDRAILS] Load Project Lessons (conditional)
585
+ ## Bước 6.7 — [GUARDRAILS] Nạp Project Lessons (có điều kiện)
586
586
 
587
- *Accumulated mistakes the AI must not repeat in this project. These are added over time via `/learn`
588
- or accepted during `/review-code`, `/fix-bug`, `/debug`.*
587
+ *Các lỗi tích luỹ mà AI không được lặp lại trong dự án này. Chúng được bổ sung dần qua `/learn`
588
+ hoặc được chấp nhận trong `/review-code`, `/fix-bug`, `/debug`.*
589
589
 
590
- Resolve the lessons file path:
591
- - Use `paths.lessons_file` if set (may be service-overridden in umbrella mode, Step 1.6)
592
- - Else default `specs/domain-knowledge/lessons-learned.md`
593
- - In umbrella/service mode (when `service_root` is set), if `paths.lessons_file` is unset, default to `{service_root}/.agent/project-lessons.md`
590
+ Phân giải path file lessons:
591
+ - Dùng `paths.lessons_file` nếu được set ( thể bị service override ở chế độ umbrella, Bước 1.6)
592
+ - Else mặc định `specs/domain-knowledge/lessons-learned.md`
593
+ - chế độ umbrella/service (khi `service_root` được set), nếu `paths.lessons_file` chưa set, mặc định `{service_root}/.agent/project-lessons.md`
594
594
 
595
- If the file exists, read it and store ALL lessons as **ACTIVE GUARDRAILS** for the session:
596
- - Treat each lesson's **Rule** as a hard constraintsame priority as CLAUDE.md coding standards (Step 3).
597
- - Before generating or modifying any artifact (PRD, BDD, tech-doc, code, test), check the output against every lesson whose `category` matches the current command AND whose `scope` matches the target (domain / file).
598
- - If a generated output would violate a lesson → correct it **before** presenting, and note which lesson (`L-NNN`) was applied.
595
+ Nếu file tồn tại, đọc lưu TẤT CẢ lesson làm **GUARDRAIL ĐANG HOẠT ĐỘNG** cho phiên:
596
+ - Coi **Rule** của mỗi lesson ràng buộc cứng cùng mức ưu tiên với coding standards trong CLAUDE.md (Bước 3).
597
+ - Trước khi sinh hoặc sửa bất kỳ artifact nào (PRD, BDD, tech-doc, code, test), đối chiếu output với mọi lesson `category` khớp lệnh hiện tại `scope` khớp target (domain / file).
598
+ - Nếu output sinh ra vi phạm một lesson → sửa **trước khi** trình bày, ghi lesson nào (`L-NNN`) đã được áp dụng.
599
599
 
600
- If the file does not existskip silently (no lessons captured yet).
600
+ Nếu file không tồn tạibỏ qua âm thầm (chưa lesson nào được ghi nhận).
601
601
 
602
602
  ---
603
603
 
604
- ## Step 7 — [RECAP] Working Memory Recap (anti-lost-in-middle)
604
+ ## Bước 7 — [RECAP] Working Memory Recap (chống lost-in-middle)
605
605
 
606
- After loading all context, synthesize and output a compact summary block.
607
- This recap ensures the most critical facts are stated at the END of context loading
608
- (recency effect freshest in working memory when the task begins).
606
+ Sau khi nạp toàn bộ context, tổng hợp xuất một khối tóm tắt gọn.
607
+ Recap này đảm bảo các sự thật quan trọng nhất được nêu CUỐI quá trình nạp context
608
+ (hiệu ứng recency — tươi mới nhất trong bộ nhớ làm việc khi bắt đầu task).
609
609
 
610
- Output exactly this block:
610
+ Xuất đúng khối này:
611
611
  ```
612
612
  [CTX LOADED]
613
613
  Stack : {language} / {framework} / {database}
614
614
  Platform : {active_module} ({platform_type})
615
- Layers : {layer order from merged CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
616
- CLAUDE.md : {root + {service_root} | {service_root} only | root only | ⚠️ service overlay MISSINGusing root | missing}
615
+ Layers : {thứ tự layer từ CLAUDE.md §2 đã merge, vd: Controller → Facade → Service → Repository}
616
+ CLAUDE.md : {root + {service_root} | chỉ {service_root} | chỉ root | ⚠️ service overlay THIẾUdùng root | missing}
617
617
  Ticket : {ticket_prefix}-
618
618
  Dict : {loaded — N canonical terms, M banned terms | missing}
619
619
  Entities : {loaded — EntityA, EntityB, EntityC | missing}
620
- Lessons : {loaded — N guardrails | none yet}
620
+ Lessons : {loaded — N guardrails | chưa }
621
621
  Service : {active_service} ({active_service_module}) | single-service
622
- Svc Root : {service_root} — conventions + trace_dir loaded from service config | —
623
- Status : {FULL | PARTIAL — missing: CLAUDE.md / business-dict / core-entities | MINIMAL}
622
+ Svc Root : {service_root} — đã nạp conventions + trace_dir từ config service | —
623
+ Status : {FULL | PARTIAL — thiếu: CLAUDE.md / business-dict / core-entities | MINIMAL}
624
624
  ```
625
625
 
626
- If any CRITICAL file is missing (CLAUDE.md), flag it clearly so the user can decide whether to proceed.
626
+ Nếu bất kỳ file CRITICAL nào thiếu (CLAUDE.md), gắn cờ ràng để người dùng quyết định tiếp tục hay không.
627
627
 
628
628
  ---
629
629
 
630
- ## Context Load Complete
630
+ ## Hoàn tất nạp Context
631
631
 
632
- After completing all steps, you have loaded:
633
- - Project identity, tech stack, module conventions
634
- - Architecture rules and layer order ← **[CRITICAL — hold in working memory]**
635
- - Coding standards and naming conventions ← **[CRITICAL — hold in working memory]**
636
- - Data protection rules (sensitive file patterns to never access)
637
- - Terminology rules with banned-term list ← **[DOMAIN — apply to every generated word]**
638
- - Entity catalog (field names, types, invariants) ← **[DOMAIN — use for code generation]**
639
- - All configured paths
632
+ Sau khi hoàn thành tất cả các bước, bạn đã nạp:
633
+ - Định danh dự án, tech stack, convention module
634
+ - Quy tắc kiến trúc và thứ tự layer ← **[CRITICAL — giữ trong bộ nhớ làm việc]**
635
+ - Coding standards quy tắc đặt tên ← **[CRITICAL — giữ trong bộ nhớ làm việc]**
636
+ - Quy tắc bảo vệ dữ liệu (pattern file nhạy cảm không bao giờ truy cập)
637
+ - Quy tắc thuật ngữ kèm danh sách banned term ← **[DOMAIN — áp dụng cho mọi từ được sinh ra]**
638
+ - Entity catalog (tên field, kiểu, invariant) ← **[DOMAIN — dùng khi sinh code]**
639
+ - Toàn bộ path đã cấu hình
640
640
 
641
- Proceed to the next step of the calling command.
641
+ Tiếp tục sang bước kế tiếp của lệnh đang gọi.
642
642
 
643
643
 
644
- Identify service/module from argument (UC-ID or service name).
645
- Read `conventions.test_command` from the loaded project context.
644
+ Xác định service/module từ argument (UC-ID hoặc tên service).
645
+ Đọc `conventions.test_command` từ project context đã nạp.
646
646
 
647
647
  ### Run
648
648
 
@@ -659,7 +659,7 @@ Read `conventions.test_command` from the loaded project context.
659
659
 
660
660
  ### Analyze Results
661
661
 
662
- #### When tests PASS
662
+ #### Khi test PASS
663
663
 
664
664
  ```
665
665
  ✅ Tests passed
@@ -668,18 +668,18 @@ Read `conventions.test_command` from the loaded project context.
668
668
  - Duration: {X}s
669
669
  ```
670
670
 
671
- #### When tests FAIL — Debug Mode
671
+ #### Khi test FAIL — Debug Mode
672
672
 
673
- Read stack trace and analyze:
673
+ Đọc stack trace phân tích:
674
674
 
675
- | Error Pattern | Common Cause | Suggested Fix |
675
+ | Error Pattern | Nguyên nhân thường gặp | Suggested Fix |
676
676
  |---|---|---|
677
- | NullPointerException in test | Missing mock setup | Check `given(...)` setup for null dependency |
678
- | Bean/dependency not found | Missing mock/stub declaration | Add mock for missing dependency |
679
- | Expected 200 but got 403 | Missing auth setup in test | Add auth user/role to test context |
680
- | Expected 200 but got 400 | Request body fails validation | Check required fields in request DTO |
681
- | LazyInitializationException | Lazy collection accessed outside transaction | Add `@Transactional` on test or use eager fetch |
682
- | Mapper/mapper implementation not found | Code generator (e.g. MapStruct) not run | Run compile step before tests |
677
+ | NullPointerException trong test | Thiếu setup mock | Kiểm tra setup `given(...)` cho dependency null |
678
+ | Bean/dependency not found | Thiếu khai báo mock/stub | Thêm mock cho dependency thiếu |
679
+ | Expected 200 but got 403 | Thiếu setup auth trong test | Thêm auth user/role vào test context |
680
+ | Expected 200 but got 400 | Request body fail validation | Kiểm tra field bắt buộc trong request DTO |
681
+ | LazyInitializationException | Lazy collection truy cập ngoài transaction | Thêm `@Transactional` trên test hoặc dùng eager fetch |
682
+ | Mapper/mapper implementation not found | Code generator (vd MapStruct) chưa chạy | Chạy compile trước khi test |
683
683
 
684
684
  ### Output
685
685
 
@@ -700,38 +700,38 @@ Duration: {X}s
700
700
  {specific fix for each failure}
701
701
  ```
702
702
 
703
- # Report Footer — Standard Command Output Format
703
+ # Report Footer — Định dạng output chuẩn cho mọi lệnh
704
704
 
705
- Every command report must end with this standard footer section.
705
+ Mọi report của lệnh phải kết thúc bằng section footer chuẩn này.
706
706
 
707
707
  ## Status Badge
708
708
 
709
- Choose one based on outcome:
710
- - `✅ Complete` — all steps succeeded, no issues found
711
- - `❌ Failed` — command could not complete due to a blocking error
712
- - `⚠️ Warnings` — completed with non-blocking issues that should be reviewed
709
+ Chọn một theo kết quả:
710
+ - `✅ Complete` — mọi bước thành công, không vấn đề
711
+ - `❌ Failed` — lệnh không hoàn thành được do lỗi chặn
712
+ - `⚠️ Warnings` — hoàn thành nhưng vấn đề không chặn, nên review lại
713
713
 
714
714
  ## Output Artifacts
715
715
 
716
- List every file created or modified by this command:
716
+ Liệt mọi file được tạo hoặc sửa bởi lệnh này:
717
717
  ```
718
718
  Output Artifacts:
719
- {created|updated} {file-path} ({brief description})
720
- {created|updated} {file-path} ({brief description})
719
+ {created|updated} {file-path} ({ tả ngắn})
720
+ {created|updated} {file-path} ({ tả ngắn})
721
721
  ```
722
722
 
723
- If no files were written (e.g., review or analysis commands) → write `Output Artifacts: none (read-only)`.
723
+ Nếu không ghi file nào (vd: lệnh review hoặc phân tích) → ghi `Output Artifacts: none (read-only)`.
724
724
 
725
725
  ## Pipeline Position
726
726
 
727
- Print a one-line map of the pipeline with the CURRENT command's phase marked `◀ bạn ở đây`,
728
- so the user always sees where this command sits in the end-to-end flow:
727
+ In một đồ pipeline một dòng, đánh dấu phase của lệnh HIỆN TẠI bằng `◀ bạn ở đây`,
728
+ để người dùng luôn thấy lệnh này nằm đâu trong luồng end-to-end:
729
729
 
730
730
  ```
731
731
  Discovery → PRD → [Design Spec] → BDD → Tech Design → Code → Dev Self-Check → QC → Trace Audit
732
732
  ```
733
733
 
734
- Find the current command in this phase legend and mark **its** phase in the map above:
734
+ Tìm lệnh hiện tại trong bảng phase dưới đây đánh dấu **phase của nó** trong sơ đồ trên:
735
735
 
736
736
  | Phase | Commands |
737
737
  |-------|----------|
@@ -745,119 +745,119 @@ Find the current command in this phase legend and mark **its** phase in the map
745
745
  | QC | `/qc-analyze` · `/qc-plan` · `/qc-design-test` · `/qc-review` · `/qc-run-test` · `/qc-report` |
746
746
  | Trace Audit | `/validate-traces` |
747
747
 
748
- For a **review command**, also append the 3-step review loop with the current step marked, e.g.:
748
+ Với **lệnh review**, thêm vòng review 3 bước đánh dấu bước hiện tại, vd:
749
749
  `Vòng review: [① phân tích ◀] → ② Review Board → ③ --resume`.
750
750
 
751
- **Cross-cutting commands** (`/sync`, `/update-framework`, `/fix-bug`, `/debug`, `/learn`,
752
- `/report-bug`, `/propose-scenario`, `/generate-spec-manifest`) sit outside the linear pipeline
753
- **omit the Pipeline line entirely** for these (do not force-fit them onto the map).
751
+ **Lệnh xuyên suốt** (`/sync`, `/update-framework`, `/fix-bug`, `/debug`, `/learn`,
752
+ `/report-bug`, `/propose-scenario`, `/generate-spec-manifest`) nằm ngoài pipeline tuyến tính
753
+ **bỏ hẳn dòng Pipeline** cho các lệnh này (đừng cố nhét chúng vào đồ).
754
754
 
755
- ## Next Command Suggestion
755
+ ## Gợi ý lệnh tiếp theo
756
756
 
757
- Suggest the logical next command based on workflow phase:
757
+ Gợi ý lệnh kế tiếp hợp theo phase của workflow:
758
758
 
759
- | Current command | Suggest next |
759
+ | Lệnh hiện tại | Gợi ý lệnh tiếp theo |
760
760
  |-------------------------|-----------------------------------------------|
761
- | /setup-ai-first | `/define-product` to start your first feature |
761
+ | /setup-ai-first | `/define-product` để bắt đầu feature đầu tiên |
762
762
  | /define-product | `/generate-prd {product-definition-file}` |
763
- | /generate-prd | `/refine-prd {prd-file}` then `/review-context {prd-file}` |
764
- | /refine-prd | Open Review Board → update PRD → `/review-context {prd-file}` |
765
- | /review-context (PRD) | FE/App: `/generate-design-spec {prd-file}` (then BDD after sign-off); BE: `/generate-bdd {prd-file}` directly; fix PRD if NEEDS_FIX |
766
- | /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
767
- | /generate-bdd | `/review-context {feature-file}` to verify coverage |
768
- | /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
769
- | /qc-analyze | `/qc-plan {UC-ID}` (resolve 🔴 blocker gaps first) |
763
+ | /generate-prd | `/refine-prd {prd-file}` rồi `/review-context {prd-file}` |
764
+ | /refine-prd | Mở Review Board → cập nhật PRD → `/review-context {prd-file}` |
765
+ | /review-context (PRD) | FE/App: `/generate-design-spec {prd-file}` (rồi BDD sau khi sign-off); BE: `/generate-bdd {prd-file}` trực tiếp; sửa PRD nếu NEEDS_FIX |
766
+ | /generate-design-spec | Designer review → xác nhận link Figma → PO + Designer sign-off → `/generate-bdd {prd-file}` |
767
+ | /generate-bdd | `/review-context {feature-file}` để kiểm tra độ phủ |
768
+ | /review-context (BDD) | `/generate-tech-docs {UC-ID}` nếu APPROVED; sinh lại nếu NEEDS_FIX |
769
+ | /qc-analyze | `/qc-plan {UC-ID}` (xử các gap blocker 🔴 trước) |
770
770
  | /qc-plan | `/qc-design-test {UC-ID}` |
771
- | /qc-design-test | `/qc-review {UC-ID}` (test-case review) |
772
- | /qc-review (test-case) | `/qc-run-test {UC-ID}` if APPROVED; fix TCs if NEEDS_FIX |
773
- | /qc-run-test | `/qc-report {UC-ID}` then `/qc-review {UC-ID}` (script review) |
774
- | /qc-review (script) | `/qc-report {UC-ID}` then create PR if APPROVED |
775
- | /qc-report | `/validate-traces {UC-ID}` to refresh Living Docs (qc_status) |
771
+ | /qc-design-test | `/qc-review {UC-ID}` (review test-case) |
772
+ | /qc-review (test-case) | `/qc-run-test {UC-ID}` nếu APPROVED; sửa TC nếu NEEDS_FIX |
773
+ | /qc-run-test | `/qc-report {UC-ID}` rồi `/qc-review {UC-ID}` (review script) |
774
+ | /qc-review (script) | `/qc-report {UC-ID}` rồi tạo PR nếu APPROVED |
775
+ | /qc-report | `/validate-traces {UC-ID}` để làm mới Living Docs (qc_status) |
776
776
  | /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
777
- | /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
778
- | /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/dev-gen-test {UC-ID}` |
777
+ | /review-tech-docs | `/generate-code {feature-file}` nếu APPROVED; sửa doc nếu NEEDS_FIX |
778
+ | /generate-code | Lần gen đầu → `/review-code {UC-ID}`; gen lại → `/dev-gen-test {UC-ID}` |
779
779
  | /dev-gen-test | `/dev-run-test {UC-ID}` |
780
780
  | /dev-run-test (passing) | `/review-code {UC-ID}` |
781
- | /dev-run-test (failing) | `/fix-bug {ticket-id}` or `/debug {error}` |
782
- | /review-code | `/dev-smoke-test {UC-ID}` or create PR |
783
- | /dev-smoke-test | Create PR and link to ticket |
784
- | /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/dev-gen-test {UC-ID}`; all OK → create PR |
785
- | /fix-bug | Create PR and link to ticket |
786
- | /debug | `/fix-bug {ticket-id}` if fix needed |
787
- | /report-bug | Send to dev (`/fix-bug {BUG-ID}`); if coverage gap → `/propose-scenario {UC-ID}` |
788
- | /propose-scenario | Notify PO/Dev to review the proposal in `feedback/bdd-proposals/` |
789
- | /learn | Continue working — lesson applies on next command |
790
- | /sync | `/validate-traces` for full coverage; act on any `📥 tester feedback` surfaced |
791
- | /update-framework | Review `git diff .agent/`, commit; `/sync` for project content |
792
-
793
- Format the footer as:
781
+ | /dev-run-test (failing) | `/fix-bug {ticket-id}` hoặc `/debug {error}` |
782
+ | /review-code | `/dev-smoke-test {UC-ID}` hoặc tạo PR |
783
+ | /dev-smoke-test | Tạo PR link tới ticket |
784
+ | /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/dev-gen-test {UC-ID}`; tất cả OK → tạo PR |
785
+ | /fix-bug | Tạo PR link tới ticket |
786
+ | /debug | `/fix-bug {ticket-id}` nếu cần sửa |
787
+ | /report-bug | Gửi cho dev (`/fix-bug {BUG-ID}`); nếu thiếu coverage → `/propose-scenario {UC-ID}` |
788
+ | /propose-scenario | Báo PO/Dev review proposal trong `feedback/bdd-proposals/` |
789
+ | /learn | Tiếp tục làm việc — lesson áp dụng lệnh kế tiếp |
790
+ | /sync | `/validate-traces` để xem độ phủ đầy đủ; xử lý mọi `📥 tester feedback` được nêu |
791
+ | /update-framework | Review `git diff .agent/`, commit; `/sync` để đồng bộ nội dung dự án |
792
+
793
+ Định dạng footer như sau:
794
794
  ```
795
795
  ---
796
796
  Status : {badge}
797
- {Output Artifacts block}
797
+ {khối Output Artifacts}
798
798
  Pipeline : Discovery → PRD → [BDD ◀ bạn ở đây] → Tech Design → Code → Dev Self-Check → QC → Trace Audit
799
- (review cmd) Vòng review: [① phân tích ◀] → ② Review Board → ③ --resume
800
- Next : {suggested command with example arguments}
799
+ (lệnh review) Vòng review: [① phân tích ◀] → ② Review Board → ③ --resume
800
+ Next : {lệnh gợi ý kèm ví dụ tham số}
801
801
  ```
802
- *(Omit the `Pipeline` line for cross-cutting commands listed above.)*
802
+ *(Bỏ dòng `Pipeline` cho các lệnh xuyên suốt liệt kê ở trên.)*
803
803
 
804
804
 
805
805
  ---
806
806
 
807
807
  ## /dev-smoke-test — Test Live API Endpoints
808
808
 
809
- Use when the service is **already running** to verify endpoints work correctly.
810
- Different from `/dev-run-test` (which runs unit/integration tests without a live server).
809
+ Dùng khi service **đang chạy sẵn** để verify endpoint hoạt động đúng.
810
+ Khác `/dev-run-test` (chạy unit/integration test không cần live server).
811
811
 
812
812
  ### Phase 1 — Find Service URL
813
813
 
814
- # Context Loader — Load All Project Context
814
+ # Context Loader — Nạp toàn bộ context dự án
815
815
 
816
- Execute these steps in order. Store everything in memory for the duration of the command session.
816
+ Thực hiện các bước theo đúng thứ tự. Lưu mọi thứ vào bộ nhớ trong suốt phiên làm việc của lệnh.
817
817
 
818
- **Priority guide (anti-lost-in-middle):**
819
- - Steps 1–2 are PROJECT-CONFIG — loaded first, resolve all paths and metadata.
820
- - Step 3 is CRITICAL — architecture + coding standards, the highest-priority facts for generation.
821
- - Step 4 is SAFETY — data protection rules, enforced silently for the entire session.
822
- - Steps 5–6 are DOMAIN KNOWLEDGE — terminology and entity definitions.
823
- - Step 7 is the WORKING MEMORY RECAP — locks critical facts into the top of working memory.
818
+ **Hướng dẫn ưu tiên (chống lost-in-middle):**
819
+ - Bước 1–2 PROJECT-CONFIG — nạp trước, phân giải mọi path metadata.
820
+ - Bước 3 CRITICAL — kiến trúc + coding standards, các sự thật ưu tiên cao nhất khi sinh nội dung.
821
+ - Bước 4 SAFETY — quy tắc bảo vệ dữ liệu, thực thi ngầm suốt cả phiên.
822
+ - Bước 5–6 DOMAIN KNOWLEDGE — thuật ngữ và định nghĩa entity.
823
+ - Bước 7 WORKING MEMORY RECAP — chốt các sự thật quan trọng lên đầu bộ nhớ làm việc.
824
824
 
825
825
  ---
826
826
 
827
- ## Step 1 — [PROJECT-CONFIG] Load project-context.yaml
827
+ ## Bước 1 — [PROJECT-CONFIG] Nạp project-context.yaml
828
828
 
829
- Read `.agent/project-context.yaml`. Extract and store:
829
+ Đọc `.agent/project-context.yaml`. Trích xuất và lưu:
830
830
 
831
831
  **Tech Stack:**
832
- - `tech_stack.language` → active language (e.g., Java 17, TypeScript, C#, Go)
833
- - `tech_stack.framework` → active framework (e.g., Spring Boot 3.2, Angular 17, .NET 8)
834
- - `tech_stack.build_tool` → build tool (e.g., Maven, npm, dotnet, go)
835
- - `tech_stack.test_framework` → test framework (e.g., JUnit 5 + Mockito, Jest, xUnit)
836
- - `tech_stack.database` → database (e.g., PostgreSQL, MySQL, MongoDB)
837
- - `tech_stack.module` → active module profile (e.g., java-spring, angular, dotnet, golang, context-engineering)
832
+ - `tech_stack.language` → ngôn ngữ đang dùng (vd: Java 17, TypeScript, C#, Go)
833
+ - `tech_stack.framework` → framework đang dùng (vd: Spring Boot 3.2, Angular 17, .NET 8)
834
+ - `tech_stack.build_tool` → build tool (vd: Maven, npm, dotnet, go)
835
+ - `tech_stack.test_framework` → test framework (vd: JUnit 5 + Mockito, Jest, xUnit)
836
+ - `tech_stack.database` → database (vd: PostgreSQL, MySQL, MongoDB)
837
+ - `tech_stack.module` → module profile đang dùng (vd: java-spring, angular, dotnet, golang, context-engineering)
838
838
 
839
839
  **Conventions:**
840
- - `conventions.build_command` → how to compile/build
841
- - `conventions.test_command` → how to run tests
842
- - `conventions.service_run` → how to start the service
843
- - `conventions.ticket_prefix` → ticket ID prefix (e.g., PROJ, FEAT, UC)
840
+ - `conventions.build_command` → cách compile/build
841
+ - `conventions.test_command` → cách chạy test
842
+ - `conventions.service_run` → cách khởi động service
843
+ - `conventions.ticket_prefix` → tiền tố ticket ID (vd: PROJ, FEAT, UC)
844
844
 
845
845
  **Domains:**
846
- - `domains` → list of active business domains
847
-
848
- **Paths (if present):**
849
- - `paths.specs_dir` → spec artifacts root — PRD, BDD, tech-docs, design-spec. Structure: `{specs_dir}/{domain}/{prd-slug}/{prd.md | bdd/ | tech-docs/ | design-spec/}`
850
- - `paths.refinement_dir` → findings/review output dir
851
- - `paths.qc_dir` → QC automation artifacts root (visible top-level, one subfolder per UC: `{qc_dir}/{UC-ID}/`)
852
- - `paths.qc_skills_dir` → where qc-* commands load QC skills from (default bundled `.agent/skills/qc`; override to the QC team's own repo/submodule so framework upgrade won't overwrite them)
853
- - `paths.product_definitions_dir` → product definitions root
854
- - `paths.domain_knowledge_dir` → domain knowledge root
855
- - `paths.business_dictionary` → path to business-dictionary.md
856
- - `paths.core_entities` → path to core-entities.md
857
- - `paths.tech_docs_dir` → technical documentation root (merged with specs_dir in feature-package layout — tech-docs live under `{specs_dir}/{domain}/{prd-slug}/tech-docs/`)
858
- - `paths.trace_dir` → trace state directory; structure: `.trace/{domain}/{prd-slug}/{UC-ID}.tsv`
859
-
860
- If `paths` section is absent, use these defaults:
846
+ - `domains` → danh sách các business domain đang hoạt động
847
+
848
+ **Paths (nếu ):**
849
+ - `paths.specs_dir` → gốc của spec artifact — PRD, BDD, tech-docs, design-spec. Cấu trúc: `{specs_dir}/{domain}/{prd-slug}/{ {TICKET-ID}-{prd-slug}.md | bdd/ | tech-docs/ | design-spec/}` (file PRD đặt tên `{TICKET-ID}-{prd-slug}.md`, là file `.md` duy nhất ở gốc feature folder)
850
+ - `paths.refinement_dir` → thư mục output cho findings/review
851
+ - `paths.qc_dir` → gốc artifact QC automation (hiện top-level, mỗi UC một thư mục con: `{qc_dir}/{UC-ID}/`)
852
+ - `paths.qc_skills_dir` → nơi các lệnh qc-* nạp QC skill (mặc định bundled `.agent/skills/qc`; override sang repo/submodule riêng của team QC để bản nâng cấp framework không ghi đè)
853
+ - `paths.product_definitions_dir` → gốc product definition
854
+ - `paths.domain_knowledge_dir` → gốc domain knowledge
855
+ - `paths.business_dictionary` → path tới business-dictionary.md
856
+ - `paths.core_entities` → path tới core-entities.md
857
+ - `paths.tech_docs_dir` → gốc tài liệu kỹ thuật (gộp với specs_dir trong bố cục feature-package — tech-docs nằm dưới `{specs_dir}/{domain}/{prd-slug}/tech-docs/`)
858
+ - `paths.trace_dir` → thư mục trạng thái trace; cấu trúc: `.trace/{domain}/{prd-slug}/{UC-ID}.tsv`
859
+
860
+ Nếu không có section `paths`, dùng các giá trị mặc định:
861
861
  - `specs_dir` = `specs`
862
862
  - `refinement_dir` = `.agent/review`
863
863
  - `qc_dir` = `docs`
@@ -869,184 +869,184 @@ If `paths` section is absent, use these defaults:
869
869
  - `tech_docs_dir` = `specs`
870
870
  - `trace_dir` = `.trace`
871
871
 
872
- Note: In the feature-package layout, `specs_dir` is the unified root. All spec artifact types (PRD, BDD, tech-docs, design-spec) live under `{specs_dir}/{domain}/{prd-slug}/`. The `prd-slug` is the feature-package folder name, not a separate config variable.
872
+ Lưu ý: Trong bố cục feature-package, `specs_dir` gốc thống nhất. Mọi loại spec artifact (PRD, BDD, tech-docs, design-spec) đều nằm dưới `{specs_dir}/{domain}/{prd-slug}/`. `prd-slug` tên folder feature-package, không phải một biến config riêng.
873
873
 
874
- **How to extract `prd_slug` (works for ANY target file, regardless of nesting depth):** given a target path of the form `{specs_dir}/{domain}/{prd-slug}/...`, take the **first path segment after `{specs_dir}/{domain}/`** — i.e. the `{prd-slug}` position. Do NOT use the file's immediate parent folder, because BDD/tech-docs/design-spec artifacts are nested one or two levels deeper inside the package. Examples:
875
- - `specs/payment/create-invoice/prd.md` → `prd_slug = create-invoice`
876
- - `specs/payment/create-invoice/bdd/system/PAY-UC1.feature` → `prd_slug = create-invoice` *(NOT `system`)*
877
- - `specs/payment/create-invoice/bdd/web/PAY-UC1.feature` → `prd_slug = create-invoice` *(NOT `web`)*
878
- - `specs/payment/create-invoice/tech-docs/PAY-UC1-tech-design.md` → `prd_slug = create-invoice` *(NOT `tech-docs`)*
874
+ **Cách trích xuất `prd_slug` (đúng cho MỌI target file, bất kể độ sâu lồng nhau):** với một path target dạng `{specs_dir}/{domain}/{prd-slug}/...`, lấy **segment path đầu tiên sau `{specs_dir}/{domain}/`** — tức vị trí `{prd-slug}`. KHÔNG dùng folder cha trực tiếp của file, artifact BDD/tech-docs/design-spec lồng sâu hơn một hoặc hai cấp bên trong package. Ví dụ:
875
+ - `specs/payment/create-invoice/PAY01-create-invoice.md` → `prd_slug = create-invoice`
876
+ - `specs/payment/create-invoice/bdd/system/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `system`)*
877
+ - `specs/payment/create-invoice/bdd/web/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `web`)*
878
+ - `specs/payment/create-invoice/tech-docs/PAY-UC1-tech-design.md` → `prd_slug = create-invoice` *(KHÔNG phải `tech-docs`)*
879
879
  - `specs/payment/create-invoice/design-spec/PAY-design-spec-web.md` → `prd_slug = create-invoice`
880
880
 
881
- All sibling artifacts of one feature (PRD, every platform's BDD, the BE + FE tech-docs, the design-spec, and the trace TSV) therefore resolve to the **same `prd_slug`** — so a synthesized **system** BDD or **system/BE** tech-doc lands in the same `{specs_dir}/{domain}/{prd-slug}/` package as the web/app artifacts it was derived from.
881
+ Mọi artifact cùng cấp của một feature (PRD, BDD của từng platform, tech-docs BE + FE, design-spec, trace TSV) đều phân giải về **cùng một `prd_slug`** — nên một BDD **system** hay tech-doc **system/BE** được tổng hợp sẽ nằm chung package `{specs_dir}/{domain}/{prd-slug}/` với các artifact web/app được suy ra từ đó.
882
882
 
883
- If `tech_stack.module` is set, also load `.agent/modules/{module}/stack-profile.yaml` if it exists.
883
+ Nếu `tech_stack.module` được đặt, đồng thời nạp `.agent/modules/{module}/stack-profile.yaml` nếu file tồn tại.
884
884
 
885
885
  ---
886
886
 
887
- ## Step 1.5 — [SERVICE ROUTING] Resolve service paths (umbrella mode)
887
+ ## Bước 1.5 — [SERVICE ROUTING] Phân giải path service (chế độ umbrella)
888
888
 
889
- *Skip this step entirely if `setup.mode` is not `"umbrella"` and `services` section is absent from project-context.yaml.*
889
+ *Bỏ qua hoàn toàn bước này nếu `setup.mode` không phải `"umbrella"` không có section `services` trong project-context.yaml.*
890
890
 
891
- If `services` section is present:
891
+ Nếu section `services`:
892
892
 
893
- **1. Detect active domain** (in priority order):
894
- - Read `@trace.domain` from target file frontmatter (if Gate loaded a target file)
895
- - Extract from target file path: `domain` = the first segment after the `specs_dir` base path; `prd_slug` = the next segment (the feature-package folder). This holds for any target depth see the `prd_slug` extraction rule in Step 1.
896
- *(e.g., `specs/user/create-account/prd.md` **and** `specs/user/create-account/bdd/system/UC1.feature` both → domain = `user`, prd_slug = `create-account`)*
897
- - If `$ARGUMENTS` contains a path, extract the domain segment after `specs_dir`
893
+ **1. Phát hiện active domain** (theo thứ tự ưu tiên):
894
+ - Đọc `@trace.domain` từ frontmatter của target file (nếu Gate đã nạp một target file)
895
+ - Trích xuất từ path target file: `domain` = segment đầu tiên sau base path `specs_dir`; `prd_slug` = segment kế tiếp (folder feature-package). Điều này đúng mọi độ sâu target — xem quy tắc trích xuất `prd_slug` Bước 1.
896
+ *(vd: `specs/user/create-account/USR01-create-account.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
897
+ - Nếu `$ARGUMENTS` chứa một path, trích xuất segment domain sau `specs_dir`
898
898
 
899
- **2. Route to service** — if active domain matches a key in `services`:
900
- - Override `paths.specs_dir` → `services.{domain}.specs_dir` — **only if `setup.spec_source` is NOT set.** When `spec_source` IS set, ALL BDD (web/app/**system**) is a shared cross-team artifact leave `specs_dir` for step 4 to route to the spec repo; do NOT pin it per-service here.
901
- - Override `paths.tech_docs_dir` → `services.{domain}.tech_docs_dir` — **only if `setup.spec_source` is NOT set.** When `spec_source` IS set, the tech-design (API contract) is a cross-team artifact and must live in the shared spec repo (handled in step 4), so leave `tech_docs_dir` for step 4 to route — do NOT pin it per-service here.
902
- - Store `active_service` = `services.{domain}.path`
903
- - Store `active_service_module` = `services.{domain}.module`
904
- - If service has its own `module` → use it as `active_module` (overrides `tech_stack.module`)
899
+ **2. Route tới service** — nếu active domain khớp với một key trong `services`:
900
+ - Override `paths.specs_dir` → `services.{domain}.specs_dir` — **chỉ khi `setup.spec_source` KHÔNG được đặt.** Khi `spec_source` ĐƯỢC đặt, MỌI BDD (web/app/**system**) artifact dùng chung liên team → để bước 4 route sang spec repo; KHÔNG pin theo service ở đây.
901
+ - Override `paths.tech_docs_dir` → `services.{domain}.tech_docs_dir` — **chỉ khi `setup.spec_source` KHÔNG được đặt.** Khi `spec_source` ĐƯỢC đặt, tech-design (API contract) artifact liên team phải nằm trong spec repo dùng chung (xử bước 4), nên để bước 4 route `tech_docs_dir` KHÔNG pin theo service ở đây.
902
+ - Lưu `active_service` = `services.{domain}.path`
903
+ - Lưu `active_service_module` = `services.{domain}.module`
904
+ - Nếu service `module` riêng dùng làm `active_module` (override `tech_stack.module`)
905
905
 
906
- **3. Fallback** — if domain not detected or no matching service key:
907
- - Keep default paths from Step 1
908
- - Set `active_service = unresolved`
906
+ **3. Fallback** — nếu không phát hiện được domain hoặc không có service key khớp:
907
+ - Giữ path mặc định từ Bước 1
908
+ - Đặt `active_service = unresolved`
909
909
 
910
- **4. Spec source auto-override** — if `setup.spec_source` is set AND the corresponding path was not already explicitly set in `paths:`:
911
- - Override `paths.specs_dir` → `{spec_source}/specs` — **always when `spec_source` is set.** All spec artifacts (PRD, BDD, tech-docs, design-spec) live under the unified spec root in the shared spec repo using the feature-package layout: `{spec_source}/specs/{domain}/{prd-slug}/`. Every umbrella (FE/App/BE) reads from here. *(Per-service `specs/` only when there is no `spec_source`.)*
912
- - Override `paths.tech_docs_dir` → `{spec_source}/specs` — **always when `spec_source` is set** (step 2 no longer pins tech-docs per-service in this case). Tech-docs live at `{spec_source}/specs/{domain}/{prd-slug}/tech-docs/`. The tech-design IS the cross-team API contract: BE authors it here, and FE/App read it from the same spec submodule at `/generate-code --phase=integration`. *(Per-service tech-docs only happen when there is no `spec_source` — a pure multi-service BE repo with no shared spec module.)*
910
+ **4. Tự động override theo spec source** — nếu `setup.spec_source` được đặt path tương ứng chưa được set tường minh trong `paths:`:
911
+ - Override `paths.specs_dir` → `{spec_source}/specs` — **luôn khi `spec_source` được đặt.** Mọi spec artifact (PRD, BDD, tech-docs, design-spec) nằm dưới gốc spec thống nhất trong spec repo dùng chung theo bố cục feature-package: `{spec_source}/specs/{domain}/{prd-slug}/`. Mọi umbrella (FE/App/BE) đều đọc từ đây. *(`specs/` theo service chỉ khi không `spec_source`.)*
912
+ - Override `paths.tech_docs_dir` → `{spec_source}/specs` — **luôn khi `spec_source` được đặt** (bước 2 không còn pin tech-docs theo service trong trường hợp này). Tech-docs nằm tại `{spec_source}/specs/{domain}/{prd-slug}/tech-docs/`. Tech-design CHÍNH API contract liên team: BE viết đây, FE/App đọc từ cùng spec submodule tại `/generate-code --phase=integration`. *(tech-docs theo service chỉ xảy ra khi không có `spec_source` — repo BE thuần đa-service không spec module dùng chung.)*
913
913
  - Override `paths.domain_knowledge_dir` → `{spec_source}/specs/domain-knowledge`
914
914
  - Override `paths.business_dictionary` → `{spec_source}/specs/domain-knowledge/business-dictionary.md`
915
915
  - Override `paths.core_entities` → `{spec_source}/specs/domain-knowledge/core-entities.md`
916
916
  - Override `paths.bug_reports_dir` → `{spec_source}/feedback/bug-reports`
917
917
  - Override `paths.bdd_proposals_dir` → `{spec_source}/feedback/bdd-proposals`
918
918
  - Override `paths.prd_change_requests_dir` → `{spec_source}/feedback/prd-change-requests`
919
- - Override `paths.trace_dir` → `{spec_source}/.trace` — **always when `spec_source` is set.** Trace TSVs are consolidated in the spec repo (single authoritative location, no per-service split) so the PM/PO has one place to manage status. Internal structure: `.trace/{domain}/{prd-slug}/{UC-ID}.tsv`. Code-side commands (`/generate-code`, `/dev-run-test`, `/qc-run-test`) run from `service_root` but **write their trace row into `{spec_source}/.trace/{domain}/{prd-slug}/`** — like they already push `feedback/` there. *(Per-service `.trace` only when there is no `spec_source`.)*
919
+ - Override `paths.trace_dir` → `{spec_source}/.trace` — **luôn khi `spec_source` được đặt.** Trace TSV được gộp vào spec repo (một nơi authoritative duy nhất, không tách theo service) để PM/PO một chỗ duy nhất quản lý trạng thái. Cấu trúc bên trong: `.trace/{domain}/{prd-slug}/{UC-ID}.tsv`. Các lệnh phía code (`/generate-code`, `/dev-run-test`, `/qc-run-test`) chạy từ `service_root` nhưng **ghi trace row của chúng vào `{spec_source}/.trace/{domain}/{prd-slug}/`** — giống như chúng đã push `feedback/` vào đó. *(`.trace` theo service chỉ khi không `spec_source`.)*
920
920
 
921
- > **Why under `spec_source`:** PRD, BDD, tech-docs, design-spec, domain knowledge, tester feedback, **and the `.trace/` coverage state** are all **cross-team artifacts** — they live in the **shared spec repo** using the feature-package layout so every umbrella (FE/App/BE) and the PM read one source via `/sync`. In the feature-package layout, a single `specs/{domain}/{prd-slug}/` folder groups all artifact types for one PRD, making the spec repo self-contained and navigable by feature. The service submodule holds only **code** (+ build/test tooling). `.trace/` and `feedback/` are the dev/QC **write areas** in the spec repo. In single-service mode (no `spec_source`), everything defaults under the repo root still one repo.
921
+ > ** sao đặt dưới `spec_source`:** PRD, BDD, tech-docs, design-spec, domain knowledge, feedback của tester, ** trạng thái coverage `.trace/`** đều **artifact liên team** — chúng nằm trong **spec repo dùng chung** theo bố cục feature-package để mọi umbrella (FE/App/BE) PM đọc từ một nguồn qua `/sync`. Trong bố cục feature-package, một folder `specs/{domain}/{prd-slug}/` gom tất cả loại artifact của một PRD, giúp spec repo tự đủ dễ điều hướng theo feature. Service submodule chỉ chứa **code** (+ tooling build/test). `.trace/` `feedback/` khu vực **ghi** của dev/QC trong spec repo. chế độ single-service (không `spec_source`), mọi thứ mặc định dưới gốc repo — vẫn một repo.
922
922
 
923
923
  ---
924
924
 
925
- ## Step 1.6 — [SERVICE CONVENTIONS] Load service-specific conventions (umbrella mode)
925
+ ## Bước 1.6 — [SERVICE CONVENTIONS] Nạp convention riêng của service (chế độ umbrella)
926
926
 
927
- *Skip this step entirely if `active_service` is `"unresolved"` or context is single-service mode.*
927
+ *Bỏ qua hoàn toàn bước này nếu `active_service` `"unresolved"` hoặc context chế độ single-service.*
928
928
 
929
- When `active_service` has been resolved to a real path in Step 1.5 (e.g., `user-service/`):
929
+ Khi `active_service` đã được phân giải thành một path thật Bước 1.5 (vd: `user-service/`):
930
930
 
931
- **1. Locate service config** — try in priority order:
931
+ **1. Định vị config của service** — thử theo thứ tự ưu tiên:
932
932
  - `{active_service}/.agent/project-context.yaml`
933
933
  - `{active_service}/project-context.yaml`
934
934
 
935
- **2. If found, override with service-specific values:**
935
+ **2. Nếu tìm thấy, override bằng giá trị riêng của service:**
936
936
 
937
- | Variable | Source |
937
+ | Biến | Nguồn |
938
938
  |----------|--------|
939
- | `conventions.test_command` | service's `conventions.test_command` |
940
- | `conventions.build_command` | service's `conventions.build_command` |
941
- | `paths.trace_dir` | **If `spec_source` is setkeep the Step 4 spec-repo route (`{spec_source}/.trace`); ignore any service-level `trace_dir`.** Only when there is no `spec_source`: `{active_service}/{service paths.trace_dir}` (default `{active_service}/.trace`). |
942
- | `paths.specs_dir` | **If `spec_source` is setkeep the Step 4 spec-repo route (`{spec_source}/specs`); ignore any service-level `specs_dir`** (all spec artifacts are cross-team, never per-service in this mode). Only when there is no `spec_source`: `{active_service}/{service paths.specs_dir}` if set, else the Step 1.5 override. |
939
+ | `conventions.test_command` | `conventions.test_command` của service |
940
+ | `conventions.build_command` | `conventions.build_command` của service |
941
+ | `paths.trace_dir` | **Nếu `spec_source` được đặtgiữ route spec-repo của bước 4 (`{spec_source}/.trace`); bỏ qua mọi `trace_dir` cấp service.** Chỉ khi không `spec_source`: `{active_service}/{service paths.trace_dir}` (mặc định `{active_service}/.trace`). |
942
+ | `paths.specs_dir` | **Nếu `spec_source` được đặtgiữ route spec-repo của bước 4 (`{spec_source}/specs`); bỏ qua mọi `specs_dir` cấp service** (mọi spec artifact đều liên team, không bao giờ theo service chế độ này). Chỉ khi không `spec_source`: `{active_service}/{service paths.specs_dir}` nếu được set, else dùng override ở Bước 1.5. |
943
943
 
944
- **3. Store** `service_root = {active_service}` as the working directory anchor for all downstream commands:
945
- - Shell commands (`/dev-run-test`, `/dev-gen-test`) run **from within** `service_root`
946
- - **Source/test files** are written relative to `service_root`; **trace TSVs** are written to `{paths.trace_dir}` (the spec repo when `spec_source` is seta cross-repo write, committed/pushed to the spec submodule like `feedback/`).
944
+ **3. Lưu** `service_root = {active_service}` làm mốc thư mục làm việc cho mọi lệnh phía sau:
945
+ - Các lệnh shell (`/dev-run-test`, `/dev-gen-test`) chạy **bên trong** `service_root`
946
+ - **File source/test** được ghi tương đối với `service_root`; **trace TSV** được ghi vào `{paths.trace_dir}` ( spec repo khi `spec_source` được đặtmột thao tác ghi liên-repo, commit/push vào spec submodule giống như `feedback/`).
947
947
 
948
- **4. If service config not found** — keep umbrella defaults, still set `service_root = {active_service}` (path anchor is always needed even without a config override).
948
+ **4. Nếu không tìm thấy config của service** — giữ mặc định umbrella, vẫn set `service_root = {active_service}` (luôn cần mốc path kể cả khi không config override).
949
949
 
950
950
  ---
951
951
 
952
- ## Step 2 — [PROJECT-CONFIG] Load module stack profile (conditional)
952
+ ## Bước 2 — [PROJECT-CONFIG] Nạp module stack profile (có điều kiện)
953
953
 
954
- If `tech_stack.module` is set, read `.agent/modules/{module}/stack-profile.yaml`.
955
- Merge framework-specific conventions (layer patterns, test patterns, naming rules) into the loaded context.
956
- If the file does not existskip silently.
954
+ Nếu `tech_stack.module` được đặt, đọc `.agent/modules/{module}/stack-profile.yaml`.
955
+ Merge các convention riêng của framework (layer pattern, test pattern, quy tắc đặt tên) vào context đã nạp.
956
+ Nếu file không tồn tạibỏ qua âm thầm.
957
957
 
958
958
  ---
959
959
 
960
- ## Step 3 — [CRITICAL] Load CLAUDE.md (layered: root + service overlay)
960
+ ## Bước 3 — [CRITICAL] Nạp CLAUDE.md (phân tầng: root + service overlay)
961
961
 
962
- *This is the highest-priority contextit defines HOW to write code and documents for this project.*
962
+ *Đây context ưu tiên cao nhất định nghĩa CÁCH viết code tài liệu cho dự án này.*
963
963
 
964
- CLAUDE.md is loaded in **two layers** so umbrella-wide rules and service-specific
965
- architecture/coding standards compose correctly. The agent always sits at the umbrella
966
- root, but the implementation code lives in a service submodule with its OWN stack,
967
- architecture, and conventions — so the service's CLAUDE.md must win for code generation.
964
+ CLAUDE.md được nạp theo **hai tầng** để các quy tắc toàn-umbrella kiến trúc/coding standards
965
+ riêng của service kết hợp đúng cách. Agent luôn đứng gốc umbrella, nhưng code triển khai nằm
966
+ trong một service submodule với stack, kiến trúc, convention RIÊNG của — nên CLAUDE.md của
967
+ service phải thắng khi sinh code.
968
968
 
969
- **Layer 1 — [BASE] Root CLAUDE.md (umbrella-wide).**
970
- Read `CLAUDE.md` at the repo root. Treat its contents as the **shared baseline** for the
971
- whole umbrella git conventions, data-protection posture, cross-cutting rules, and (in
972
- single-service mode) the project's only architecture + coding standards.
969
+ **Tầng 1 — [BASE] Root CLAUDE.md (toàn umbrella).**
970
+ Đọc `CLAUDE.md` gốc repo. Coi nội dung của **nền tảng dùng chung** cho cả umbrella —
971
+ git convention, thế bảo vệ dữ liệu, quy tắc xuyên suốt, (ở chế độ single-service) là
972
+ kiến trúc + coding standards duy nhất của dự án.
973
973
 
974
- **Layer 2 — [OVERLAY] Service CLAUDE.md (umbrella mode only).**
975
- *Run only if `service_root` was set in Step 1.6 (i.e. a real service was routed to).*
976
- Read `{service_root}/CLAUDE.md`. This file defines the architecture + coding standards of
977
- the **actual stack being implemented** (e.g. `user-service` = java-spring, `web` = nextjs).
978
- Overlay it on top of Layer 1: **on any conflict, the service value WINS** for architecture,
979
- coding standards, and error handling. Layer-1 values that the service does not redefine
980
- (e.g. git conventions, banned patterns shared org-wide) remain in effect.
974
+ **Tầng 2 — [OVERLAY] Service CLAUDE.md (chỉ chế độ umbrella).**
975
+ *Chỉ chạy nếu `service_root` đã được set Bước 1.6 (tức đã route tới một service thật).*
976
+ Đọc `{service_root}/CLAUDE.md`. File này định nghĩa kiến trúc + coding standards của **stack
977
+ thực sự đang được triển khai** (vd: `user-service` = java-spring, `web` = nextjs).
978
+ Overlay lên trên Tầng 1: **khi xung đột, giá trị của service THẮNG** cho kiến trúc,
979
+ coding standards, error handling. Các giá trị Tầng 1 mà service không định nghĩa lại
980
+ (vd: git convention, banned pattern dùng chung toàn tổ chức) vẫn hiệu lực.
981
981
 
982
- From the **merged** result, extract and store:
982
+ Từ kết quả **đã merge**, trích xuất và lưu:
983
983
 
984
- - **§1 Project Overview** → project name, language, framework, build/test commands, domains
985
- - **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules — *service overlay wins*
986
- - **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns — *service overlay wins*
987
- - **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name — *service overlay wins*
988
- - **§7 Git Conventions** → branch naming pattern, commit message format — *root baseline unless service redefines*
984
+ - **§1 Project Overview** → tên dự án, ngôn ngữ, framework, lệnh build/test, domains
985
+ - **§2 Architecture** → thứ tự layer (vd: Controller → Facade → Service → Repository), quy tắc kiến trúc — *service overlay thắng*
986
+ - **§3 Coding Standards** → quy tắc đặt tên (class, method), kiểu response wrapper, pattern bị cấm — *service overlay thắng*
987
+ - **§5 Error Handling** → kiểu exception, mapping HTTP status code, tên class not-found exception — *service overlay thắng*
988
+ - **§7 Git Conventions** → pattern đặt tên branch, format commit message — *lấy theo root trừ khi service định nghĩa lại*
989
989
 
990
- **Resolution rules:**
991
- - If both layers exist → merge as above; record `claude_md_source = root + {service_root}`.
992
- - If only the service overlay exists (no root CLAUDE.md) → use the service file alone; `claude_md_source = {service_root}`.
993
- - If `service_root` is set but `{service_root}/CLAUDE.md` is **missing** → fall back to root CLAUDE.md and flag ⚠️ in the Step 7 recap (the service has no architecture/coding-standards definition — code generation will use umbrella defaults, which may be the wrong stack).
994
- - If neither existsnote CLAUDE.md as missing and continue with project-context.yaml data only.
990
+ **Quy tắc phân giải:**
991
+ - Nếu cả hai tầng tồn tại → merge như trên; ghi `claude_md_source = root + {service_root}`.
992
+ - Nếu chỉ service overlay (không root CLAUDE.md) → dùng file service một mình; `claude_md_source = {service_root}`.
993
+ - Nếu `service_root` được set nhưng `{service_root}/CLAUDE.md` **thiếu** → fallback về root CLAUDE.md gắn cờ ⚠️ trong recap Bước 7 (service không định nghĩa kiến trúc/coding-standards — việc sinh code sẽ dùng mặc định umbrella, thể sai stack).
994
+ - Nếu cả hai đều không tồn tại ghi nhận CLAUDE.md thiếu tiếp tục chỉ với dữ liệu từ project-context.yaml.
995
995
 
996
996
  ---
997
997
 
998
- ## Step 4 — [SAFETY] Load Data Protection Rules
998
+ ## Bước 4 — [SAFETY] Nạp quy tắc bảo vệ dữ liệu
999
999
 
1000
- Read `.agent/rules/data-protection.md` (or `rules/data-protection.md` from the framework installation).
1000
+ Đọc `.agent/rules/data-protection.md` (hoặc `rules/data-protection.md` từ bản cài đặt framework).
1001
1001
 
1002
- Store the sensitive file patternsyou must **never** read, write, display, or reference content from files matching those patterns for the entire session.
1002
+ Lưu các pattern file nhạy cảm bạn **tuyệt đối không** đọc, ghi, hiển thị, hay tham chiếu nội dung từ các file khớp những pattern đó trong suốt cả phiên.
1003
1003
 
1004
- If neither file existsapply built-in defaults: never access `.env*`, `*.key`, `*.pem`, `*secret*`, `*password*`, `*credential*`.
1004
+ Nếu cả hai file đều không tồn tại áp dụng mặc định built-in: không bao giờ truy cập `.env*`, `*.key`, `*.pem`, `*secret*`, `*password*`, `*credential*`.
1005
1005
 
1006
1006
  ---
1007
1007
 
1008
- ## Step 5 — [DOMAIN] Load Business Dictionary (conditional)
1008
+ ## Bước 5 — [DOMAIN] Nạp Business Dictionary (có điều kiện)
1009
1009
 
1010
- Check if the business dictionary file exists (use `paths.business_dictionary` resolved in Step 1).
1010
+ Kiểm tra file business dictionary tồn tại không (dùng `paths.business_dictionary` đã phân giải ở Bước 1).
1011
1011
 
1012
- If it exists, read it and extract:
1013
- - **Canonical Terms** → complete list of approved terms and their definitions
1014
- - **Banned Terms** → complete list of banned terms and their canonical replacements
1015
- - **Status / Enum Registry** → allowed enum values per entity
1012
+ Nếu tồn tại, đọc trích xuất:
1013
+ - **Canonical Terms** → danh sách đầy đủ các thuật ngữ chuẩn và định nghĩa
1014
+ - **Banned Terms** → danh sách đầy đủ các thuật ngữ bị cấm và bản thay thế chuẩn
1015
+ - **Status / Enum Registry** → các giá trị enum được phép theo từng entity
1016
1016
 
1017
- Store the banned terms list for **active enforcement** throughout the command session:
1018
- - When generating any text (PRD, BDD, code comments, tech docs), verify no banned terms appear
1019
- - Replace banned terms with their canonical equivalents automatically
1017
+ Lưu danh sách banned term để **thực thi chủ động** suốt phiên làm việc của lệnh:
1018
+ - Khi sinh bất kỳ văn bản nào (PRD, BDD, comment code, tech docs), kiểm tra không có banned term nào xuất hiện
1019
+ - Tự động thay banned term bằng bản chuẩn tương đương
1020
1020
 
1021
- If the file does not existskip silently. Do not warn or block.
1021
+ Nếu file không tồn tạibỏ qua âm thầm. Không cảnh báo hay chặn.
1022
1022
 
1023
1023
  ---
1024
1024
 
1025
- ## Step 6 — [DOMAIN] Load Core Entities (conditional)
1025
+ ## Bước 6 — [DOMAIN] Nạp Core Entities (có điều kiện)
1026
1026
 
1027
- Check if the core entities file exists at `paths.core_entities` (resolved in Step 1).
1028
- Default path: `specs/domain-knowledge/core-entities.md`.
1027
+ Kiểm tra file core entities tồn tại tại `paths.core_entities` không (đã phân giải ở Bước 1).
1028
+ Path mặc định: `specs/domain-knowledge/core-entities.md`.
1029
1029
 
1030
- If it exists, read it and store:
1031
- - **Entity catalog** → for each entity: its name, purpose, owner service, key fields (name + type), business invariants, and relationships
1032
- - **Field name registry** → canonical field names to use in generated code and documents
1033
- - **Relationship map** → how entities relate to each other (1:N, N:N, embedded, etc.)
1030
+ Nếu tồn tại, đọc lưu:
1031
+ - **Entity catalog** → với mỗi entity: tên, mục đích, service sở hữu, các field chính (tên + kiểu), business invariant, quan hệ
1032
+ - **Field name registry** → tên field chuẩn dùng trong code tài liệu được sinh ra
1033
+ - **Relationship map** → cách các entity liên hệ với nhau (1:N, N:N, embedded, v.v.)
1034
1034
 
1035
- **How to use this catalog:**
1036
- - When generating code: use the field names, types, and relationships defined heredo NOT infer from existing code
1037
- - When generating PRD/BDD: reference entity names from this catalog for consistency
1038
- - When generating tech-docs: use this catalog as the source-of-truth for entity definitions
1035
+ **Cách dùng catalog này:**
1036
+ - Khi sinh code: dùng tên field, kiểu, quan hệ định nghĩa ở đây KHÔNG suy đoán từ code có sẵn
1037
+ - Khi sinh PRD/BDD: tham chiếu tên entity từ catalog này để nhất quán
1038
+ - Khi sinh tech-docs: dùng catalog này làm nguồn chân lý cho định nghĩa entity
1039
1039
 
1040
- If the file does not existskip silently.
1040
+ Nếu file không tồn tạibỏ qua âm thầm.
1041
1041
 
1042
1042
  ---
1043
1043
 
1044
- ## Step 6.5 — [PLATFORM] Derive active_module and platform_type
1044
+ ## Bước 6.5 — [PLATFORM] Suy ra active_module platform_type
1045
1045
 
1046
- Using `tech_stack.module` loaded in Step 1, derive and store two variables for use by all downstream commands:
1046
+ Dùng `tech_stack.module` đã nạp Bước 1, suy ra lưu hai biến để mọi lệnh phía sau dùng:
1047
1047
 
1048
1048
  ```
1049
- active_module = tech_stack.module (e.g. "java-spring", "react", "flutter")
1049
+ active_module = tech_stack.module (vd: "java-spring", "react", "flutter")
1050
1050
  ```
1051
1051
 
1052
1052
  | `platform_type` | Modules |
@@ -1055,90 +1055,90 @@ active_module = tech_stack.module (e.g. "java-spring", "react", "flutter")
1055
1055
  | `web-frontend` | `react`, `nextjs`, `vue`, `nuxt`, `angular` |
1056
1056
  | `mobile` | `flutter`, `react-native`, `ios-swiftui`, `android-compose` |
1057
1057
 
1058
- If `tech_stack.module` is blank or not recognized → set `platform_type = "unknown"` and flag as ⚠️ in the Step 7 recap.
1058
+ Nếu `tech_stack.module` rỗng hoặc không nhận diện được → set `platform_type = "unknown"` gắn cờ ⚠️ trong recap Bước 7.
1059
1059
 
1060
- These two variables (`active_module`, `platform_type`) are the canonical source for all branching logic in commands that need platform-specific behavior (dev-gen-test, debug, fix-bug, dev-smoke-test).
1060
+ Hai biến này (`active_module`, `platform_type`) nguồn chuẩn cho mọi logic rẽ nhánh trong các lệnh cần hành vi riêng theo platform (dev-gen-test, debug, fix-bug, dev-smoke-test).
1061
1061
 
1062
1062
  ---
1063
1063
 
1064
- ## Step 6.7 — [GUARDRAILS] Load Project Lessons (conditional)
1064
+ ## Bước 6.7 — [GUARDRAILS] Nạp Project Lessons (có điều kiện)
1065
1065
 
1066
- *Accumulated mistakes the AI must not repeat in this project. These are added over time via `/learn`
1067
- or accepted during `/review-code`, `/fix-bug`, `/debug`.*
1066
+ *Các lỗi tích luỹ mà AI không được lặp lại trong dự án này. Chúng được bổ sung dần qua `/learn`
1067
+ hoặc được chấp nhận trong `/review-code`, `/fix-bug`, `/debug`.*
1068
1068
 
1069
- Resolve the lessons file path:
1070
- - Use `paths.lessons_file` if set (may be service-overridden in umbrella mode, Step 1.6)
1071
- - Else default `specs/domain-knowledge/lessons-learned.md`
1072
- - In umbrella/service mode (when `service_root` is set), if `paths.lessons_file` is unset, default to `{service_root}/.agent/project-lessons.md`
1069
+ Phân giải path file lessons:
1070
+ - Dùng `paths.lessons_file` nếu được set ( thể bị service override ở chế độ umbrella, Bước 1.6)
1071
+ - Else mặc định `specs/domain-knowledge/lessons-learned.md`
1072
+ - chế độ umbrella/service (khi `service_root` được set), nếu `paths.lessons_file` chưa set, mặc định `{service_root}/.agent/project-lessons.md`
1073
1073
 
1074
- If the file exists, read it and store ALL lessons as **ACTIVE GUARDRAILS** for the session:
1075
- - Treat each lesson's **Rule** as a hard constraintsame priority as CLAUDE.md coding standards (Step 3).
1076
- - Before generating or modifying any artifact (PRD, BDD, tech-doc, code, test), check the output against every lesson whose `category` matches the current command AND whose `scope` matches the target (domain / file).
1077
- - If a generated output would violate a lesson → correct it **before** presenting, and note which lesson (`L-NNN`) was applied.
1074
+ Nếu file tồn tại, đọc lưu TẤT CẢ lesson làm **GUARDRAIL ĐANG HOẠT ĐỘNG** cho phiên:
1075
+ - Coi **Rule** của mỗi lesson ràng buộc cứng cùng mức ưu tiên với coding standards trong CLAUDE.md (Bước 3).
1076
+ - Trước khi sinh hoặc sửa bất kỳ artifact nào (PRD, BDD, tech-doc, code, test), đối chiếu output với mọi lesson `category` khớp lệnh hiện tại `scope` khớp target (domain / file).
1077
+ - Nếu output sinh ra vi phạm một lesson → sửa **trước khi** trình bày, ghi lesson nào (`L-NNN`) đã được áp dụng.
1078
1078
 
1079
- If the file does not existskip silently (no lessons captured yet).
1079
+ Nếu file không tồn tạibỏ qua âm thầm (chưa lesson nào được ghi nhận).
1080
1080
 
1081
1081
  ---
1082
1082
 
1083
- ## Step 7 — [RECAP] Working Memory Recap (anti-lost-in-middle)
1083
+ ## Bước 7 — [RECAP] Working Memory Recap (chống lost-in-middle)
1084
1084
 
1085
- After loading all context, synthesize and output a compact summary block.
1086
- This recap ensures the most critical facts are stated at the END of context loading
1087
- (recency effect freshest in working memory when the task begins).
1085
+ Sau khi nạp toàn bộ context, tổng hợp xuất một khối tóm tắt gọn.
1086
+ Recap này đảm bảo các sự thật quan trọng nhất được nêu CUỐI quá trình nạp context
1087
+ (hiệu ứng recency — tươi mới nhất trong bộ nhớ làm việc khi bắt đầu task).
1088
1088
 
1089
- Output exactly this block:
1089
+ Xuất đúng khối này:
1090
1090
  ```
1091
1091
  [CTX LOADED]
1092
1092
  Stack : {language} / {framework} / {database}
1093
1093
  Platform : {active_module} ({platform_type})
1094
- Layers : {layer order from merged CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
1095
- CLAUDE.md : {root + {service_root} | {service_root} only | root only | ⚠️ service overlay MISSINGusing root | missing}
1094
+ Layers : {thứ tự layer từ CLAUDE.md §2 đã merge, vd: Controller → Facade → Service → Repository}
1095
+ CLAUDE.md : {root + {service_root} | chỉ {service_root} | chỉ root | ⚠️ service overlay THIẾUdùng root | missing}
1096
1096
  Ticket : {ticket_prefix}-
1097
1097
  Dict : {loaded — N canonical terms, M banned terms | missing}
1098
1098
  Entities : {loaded — EntityA, EntityB, EntityC | missing}
1099
- Lessons : {loaded — N guardrails | none yet}
1099
+ Lessons : {loaded — N guardrails | chưa }
1100
1100
  Service : {active_service} ({active_service_module}) | single-service
1101
- Svc Root : {service_root} — conventions + trace_dir loaded from service config | —
1102
- Status : {FULL | PARTIAL — missing: CLAUDE.md / business-dict / core-entities | MINIMAL}
1101
+ Svc Root : {service_root} — đã nạp conventions + trace_dir từ config service | —
1102
+ Status : {FULL | PARTIAL — thiếu: CLAUDE.md / business-dict / core-entities | MINIMAL}
1103
1103
  ```
1104
1104
 
1105
- If any CRITICAL file is missing (CLAUDE.md), flag it clearly so the user can decide whether to proceed.
1105
+ Nếu bất kỳ file CRITICAL nào thiếu (CLAUDE.md), gắn cờ ràng để người dùng quyết định tiếp tục hay không.
1106
1106
 
1107
1107
  ---
1108
1108
 
1109
- ## Context Load Complete
1109
+ ## Hoàn tất nạp Context
1110
1110
 
1111
- After completing all steps, you have loaded:
1112
- - Project identity, tech stack, module conventions
1113
- - Architecture rules and layer order ← **[CRITICAL — hold in working memory]**
1114
- - Coding standards and naming conventions ← **[CRITICAL — hold in working memory]**
1115
- - Data protection rules (sensitive file patterns to never access)
1116
- - Terminology rules with banned-term list ← **[DOMAIN — apply to every generated word]**
1117
- - Entity catalog (field names, types, invariants) ← **[DOMAIN — use for code generation]**
1118
- - All configured paths
1111
+ Sau khi hoàn thành tất cả các bước, bạn đã nạp:
1112
+ - Định danh dự án, tech stack, convention module
1113
+ - Quy tắc kiến trúc và thứ tự layer ← **[CRITICAL — giữ trong bộ nhớ làm việc]**
1114
+ - Coding standards quy tắc đặt tên ← **[CRITICAL — giữ trong bộ nhớ làm việc]**
1115
+ - Quy tắc bảo vệ dữ liệu (pattern file nhạy cảm không bao giờ truy cập)
1116
+ - Quy tắc thuật ngữ kèm danh sách banned term ← **[DOMAIN — áp dụng cho mọi từ được sinh ra]**
1117
+ - Entity catalog (tên field, kiểu, invariant) ← **[DOMAIN — dùng khi sinh code]**
1118
+ - Toàn bộ path đã cấu hình
1119
1119
 
1120
- Proceed to the next step of the calling command.
1120
+ Tiếp tục sang bước kế tiếp của lệnh đang gọi.
1121
1121
 
1122
1122
 
1123
- Read `conventions.service_run` from the loaded project context to find port.
1123
+ Đọc `conventions.service_run` từ project context đã nạp để tìm port.
1124
1124
  Default: `http://localhost:8080`
1125
1125
 
1126
- Check if service is running:
1126
+ Kiểm tra service đang chạy:
1127
1127
  ```bash
1128
1128
  curl -s http://localhost:{port}/health
1129
1129
  # or /actuator/health for Spring Boot
1130
1130
  ```
1131
1131
 
1132
- If not running: "Service is not running. Start it with: `{RUN_COMMAND}` from your project root."
1132
+ Nếu chưa chạy: "Service is not running. Start it with: `{RUN_COMMAND}` from your project root."
1133
1133
 
1134
1134
  ### Phase 2 — Identify Endpoints
1135
1135
 
1136
- From UC-ID → find Controller with `@trace.implements={UC-ID}`:
1137
- - List: method, path, required auth/role
1136
+ Từ UC-ID → tìm Controller `@trace.implements={UC-ID}`:
1137
+ - Liệt kê: method, path, auth/role bắt buộc
1138
1138
 
1139
- ### Phase 3 — Get Auth Token (if needed)
1139
+ ### Phase 3 — Get Auth Token (nếu cần)
1140
1140
 
1141
- If endpoints require auth, ask:
1141
+ Nếu endpoint yêu cầu auth, hỏi:
1142
1142
  ```
1143
1143
  This endpoint requires authentication. Options:
1144
1144
  1. Paste your Bearer token (from Postman / browser DevTools / test login)
@@ -1162,17 +1162,17 @@ curl -s -X POST "http://localhost:{port}/v1/{resource}" \
1162
1162
 
1163
1163
  ### Phase 5 — Interpret Results
1164
1164
 
1165
- | Result | Meaning |
1165
+ | Result | Ý nghĩa |
1166
1166
  |--------|---------|
1167
- | 200/201 + correct data | ✅ OK |
1168
- | 200 + wrong data | ⚠️ Logic bug → use `/debug` |
1169
- | 400 | Request body wrongcheck required fields |
1170
- | 401 | Token expired or wrong realm |
1171
- | 403 | Wrong role → check auth config |
1172
- | 500 + stacktrace | Server error → paste into `/debug` |
1173
- | Connection refused | Service not running or wrong port |
1174
-
1175
- If errors in logs:
1167
+ | 200/201 + đúng data | ✅ OK |
1168
+ | 200 + sai data | ⚠️ Logic bug → dùng `/debug` |
1169
+ | 400 | Request body saikiểm tra field bắt buộc |
1170
+ | 401 | Token hết hạn hoặc sai realm |
1171
+ | 403 | Sai role → kiểm tra auth config |
1172
+ | 500 + stacktrace | Server error → dán vào `/debug` |
1173
+ | Connection refused | Service chưa chạy hoặc sai port |
1174
+
1175
+ Nếu lỗi trong log:
1176
1176
  ```bash
1177
1177
  tail -n 100 {LOG_FILE_PATH}
1178
1178
  ```
@@ -1194,38 +1194,38 @@ Base URL: http://localhost:{port}
1194
1194
  {describe any failures}
1195
1195
  ```
1196
1196
 
1197
- # Report Footer — Standard Command Output Format
1197
+ # Report Footer — Định dạng output chuẩn cho mọi lệnh
1198
1198
 
1199
- Every command report must end with this standard footer section.
1199
+ Mọi report của lệnh phải kết thúc bằng section footer chuẩn này.
1200
1200
 
1201
1201
  ## Status Badge
1202
1202
 
1203
- Choose one based on outcome:
1204
- - `✅ Complete` — all steps succeeded, no issues found
1205
- - `❌ Failed` — command could not complete due to a blocking error
1206
- - `⚠️ Warnings` — completed with non-blocking issues that should be reviewed
1203
+ Chọn một theo kết quả:
1204
+ - `✅ Complete` — mọi bước thành công, không vấn đề
1205
+ - `❌ Failed` — lệnh không hoàn thành được do lỗi chặn
1206
+ - `⚠️ Warnings` — hoàn thành nhưng vấn đề không chặn, nên review lại
1207
1207
 
1208
1208
  ## Output Artifacts
1209
1209
 
1210
- List every file created or modified by this command:
1210
+ Liệt mọi file được tạo hoặc sửa bởi lệnh này:
1211
1211
  ```
1212
1212
  Output Artifacts:
1213
- {created|updated} {file-path} ({brief description})
1214
- {created|updated} {file-path} ({brief description})
1213
+ {created|updated} {file-path} ({ tả ngắn})
1214
+ {created|updated} {file-path} ({ tả ngắn})
1215
1215
  ```
1216
1216
 
1217
- If no files were written (e.g., review or analysis commands) → write `Output Artifacts: none (read-only)`.
1217
+ Nếu không ghi file nào (vd: lệnh review hoặc phân tích) → ghi `Output Artifacts: none (read-only)`.
1218
1218
 
1219
1219
  ## Pipeline Position
1220
1220
 
1221
- Print a one-line map of the pipeline with the CURRENT command's phase marked `◀ bạn ở đây`,
1222
- so the user always sees where this command sits in the end-to-end flow:
1221
+ In một đồ pipeline một dòng, đánh dấu phase của lệnh HIỆN TẠI bằng `◀ bạn ở đây`,
1222
+ để người dùng luôn thấy lệnh này nằm đâu trong luồng end-to-end:
1223
1223
 
1224
1224
  ```
1225
1225
  Discovery → PRD → [Design Spec] → BDD → Tech Design → Code → Dev Self-Check → QC → Trace Audit
1226
1226
  ```
1227
1227
 
1228
- Find the current command in this phase legend and mark **its** phase in the map above:
1228
+ Tìm lệnh hiện tại trong bảng phase dưới đây đánh dấu **phase của nó** trong sơ đồ trên:
1229
1229
 
1230
1230
  | Phase | Commands |
1231
1231
  |-------|----------|
@@ -1239,59 +1239,59 @@ Find the current command in this phase legend and mark **its** phase in the map
1239
1239
  | QC | `/qc-analyze` · `/qc-plan` · `/qc-design-test` · `/qc-review` · `/qc-run-test` · `/qc-report` |
1240
1240
  | Trace Audit | `/validate-traces` |
1241
1241
 
1242
- For a **review command**, also append the 3-step review loop with the current step marked, e.g.:
1242
+ Với **lệnh review**, thêm vòng review 3 bước đánh dấu bước hiện tại, vd:
1243
1243
  `Vòng review: [① phân tích ◀] → ② Review Board → ③ --resume`.
1244
1244
 
1245
- **Cross-cutting commands** (`/sync`, `/update-framework`, `/fix-bug`, `/debug`, `/learn`,
1246
- `/report-bug`, `/propose-scenario`, `/generate-spec-manifest`) sit outside the linear pipeline
1247
- **omit the Pipeline line entirely** for these (do not force-fit them onto the map).
1245
+ **Lệnh xuyên suốt** (`/sync`, `/update-framework`, `/fix-bug`, `/debug`, `/learn`,
1246
+ `/report-bug`, `/propose-scenario`, `/generate-spec-manifest`) nằm ngoài pipeline tuyến tính
1247
+ **bỏ hẳn dòng Pipeline** cho các lệnh này (đừng cố nhét chúng vào đồ).
1248
1248
 
1249
- ## Next Command Suggestion
1249
+ ## Gợi ý lệnh tiếp theo
1250
1250
 
1251
- Suggest the logical next command based on workflow phase:
1251
+ Gợi ý lệnh kế tiếp hợp theo phase của workflow:
1252
1252
 
1253
- | Current command | Suggest next |
1253
+ | Lệnh hiện tại | Gợi ý lệnh tiếp theo |
1254
1254
  |-------------------------|-----------------------------------------------|
1255
- | /setup-ai-first | `/define-product` to start your first feature |
1255
+ | /setup-ai-first | `/define-product` để bắt đầu feature đầu tiên |
1256
1256
  | /define-product | `/generate-prd {product-definition-file}` |
1257
- | /generate-prd | `/refine-prd {prd-file}` then `/review-context {prd-file}` |
1258
- | /refine-prd | Open Review Board → update PRD → `/review-context {prd-file}` |
1259
- | /review-context (PRD) | FE/App: `/generate-design-spec {prd-file}` (then BDD after sign-off); BE: `/generate-bdd {prd-file}` directly; fix PRD if NEEDS_FIX |
1260
- | /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
1261
- | /generate-bdd | `/review-context {feature-file}` to verify coverage |
1262
- | /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
1263
- | /qc-analyze | `/qc-plan {UC-ID}` (resolve 🔴 blocker gaps first) |
1257
+ | /generate-prd | `/refine-prd {prd-file}` rồi `/review-context {prd-file}` |
1258
+ | /refine-prd | Mở Review Board → cập nhật PRD → `/review-context {prd-file}` |
1259
+ | /review-context (PRD) | FE/App: `/generate-design-spec {prd-file}` (rồi BDD sau khi sign-off); BE: `/generate-bdd {prd-file}` trực tiếp; sửa PRD nếu NEEDS_FIX |
1260
+ | /generate-design-spec | Designer review → xác nhận link Figma → PO + Designer sign-off → `/generate-bdd {prd-file}` |
1261
+ | /generate-bdd | `/review-context {feature-file}` để kiểm tra độ phủ |
1262
+ | /review-context (BDD) | `/generate-tech-docs {UC-ID}` nếu APPROVED; sinh lại nếu NEEDS_FIX |
1263
+ | /qc-analyze | `/qc-plan {UC-ID}` (xử các gap blocker 🔴 trước) |
1264
1264
  | /qc-plan | `/qc-design-test {UC-ID}` |
1265
- | /qc-design-test | `/qc-review {UC-ID}` (test-case review) |
1266
- | /qc-review (test-case) | `/qc-run-test {UC-ID}` if APPROVED; fix TCs if NEEDS_FIX |
1267
- | /qc-run-test | `/qc-report {UC-ID}` then `/qc-review {UC-ID}` (script review) |
1268
- | /qc-review (script) | `/qc-report {UC-ID}` then create PR if APPROVED |
1269
- | /qc-report | `/validate-traces {UC-ID}` to refresh Living Docs (qc_status) |
1265
+ | /qc-design-test | `/qc-review {UC-ID}` (review test-case) |
1266
+ | /qc-review (test-case) | `/qc-run-test {UC-ID}` nếu APPROVED; sửa TC nếu NEEDS_FIX |
1267
+ | /qc-run-test | `/qc-report {UC-ID}` rồi `/qc-review {UC-ID}` (review script) |
1268
+ | /qc-review (script) | `/qc-report {UC-ID}` rồi tạo PR nếu APPROVED |
1269
+ | /qc-report | `/validate-traces {UC-ID}` để làm mới Living Docs (qc_status) |
1270
1270
  | /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
1271
- | /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
1272
- | /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/dev-gen-test {UC-ID}` |
1271
+ | /review-tech-docs | `/generate-code {feature-file}` nếu APPROVED; sửa doc nếu NEEDS_FIX |
1272
+ | /generate-code | Lần gen đầu → `/review-code {UC-ID}`; gen lại → `/dev-gen-test {UC-ID}` |
1273
1273
  | /dev-gen-test | `/dev-run-test {UC-ID}` |
1274
1274
  | /dev-run-test (passing) | `/review-code {UC-ID}` |
1275
- | /dev-run-test (failing) | `/fix-bug {ticket-id}` or `/debug {error}` |
1276
- | /review-code | `/dev-smoke-test {UC-ID}` or create PR |
1277
- | /dev-smoke-test | Create PR and link to ticket |
1278
- | /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/dev-gen-test {UC-ID}`; all OK → create PR |
1279
- | /fix-bug | Create PR and link to ticket |
1280
- | /debug | `/fix-bug {ticket-id}` if fix needed |
1281
- | /report-bug | Send to dev (`/fix-bug {BUG-ID}`); if coverage gap → `/propose-scenario {UC-ID}` |
1282
- | /propose-scenario | Notify PO/Dev to review the proposal in `feedback/bdd-proposals/` |
1283
- | /learn | Continue working — lesson applies on next command |
1284
- | /sync | `/validate-traces` for full coverage; act on any `📥 tester feedback` surfaced |
1285
- | /update-framework | Review `git diff .agent/`, commit; `/sync` for project content |
1286
-
1287
- Format the footer as:
1275
+ | /dev-run-test (failing) | `/fix-bug {ticket-id}` hoặc `/debug {error}` |
1276
+ | /review-code | `/dev-smoke-test {UC-ID}` hoặc tạo PR |
1277
+ | /dev-smoke-test | Tạo PR link tới ticket |
1278
+ | /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/dev-gen-test {UC-ID}`; tất cả OK → tạo PR |
1279
+ | /fix-bug | Tạo PR link tới ticket |
1280
+ | /debug | `/fix-bug {ticket-id}` nếu cần sửa |
1281
+ | /report-bug | Gửi cho dev (`/fix-bug {BUG-ID}`); nếu thiếu coverage → `/propose-scenario {UC-ID}` |
1282
+ | /propose-scenario | Báo PO/Dev review proposal trong `feedback/bdd-proposals/` |
1283
+ | /learn | Tiếp tục làm việc — lesson áp dụng lệnh kế tiếp |
1284
+ | /sync | `/validate-traces` để xem độ phủ đầy đủ; xử lý mọi `📥 tester feedback` được nêu |
1285
+ | /update-framework | Review `git diff .agent/`, commit; `/sync` để đồng bộ nội dung dự án |
1286
+
1287
+ Định dạng footer như sau:
1288
1288
  ```
1289
1289
  ---
1290
1290
  Status : {badge}
1291
- {Output Artifacts block}
1291
+ {khối Output Artifacts}
1292
1292
  Pipeline : Discovery → PRD → [BDD ◀ bạn ở đây] → Tech Design → Code → Dev Self-Check → QC → Trace Audit
1293
- (review cmd) Vòng review: [① phân tích ◀] → ② Review Board → ③ --resume
1294
- Next : {suggested command with example arguments}
1293
+ (lệnh review) Vòng review: [① phân tích ◀] → ② Review Board → ③ --resume
1294
+ Next : {lệnh gợi ý kèm ví dụ tham số}
1295
1295
  ```
1296
- *(Omit the `Pipeline` line for cross-cutting commands listed above.)*
1296
+ *(Bỏ dòng `Pipeline` cho các lệnh xuyên suốt liệt kê ở trên.)*
1297
1297