@edupia-tutor/spec-driven-docs 0.14.0 → 0.14.1

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 (141) hide show
  1. package/commands/debug.md +435 -435
  2. package/commands/debug.tmpl +111 -111
  3. package/commands/define-product.md +330 -327
  4. package/commands/define-product.tmpl +50 -47
  5. package/commands/dev-gen-test.md +364 -364
  6. package/commands/dev-gen-test.tmpl +63 -63
  7. package/commands/dev-run-test.md +375 -375
  8. package/commands/dev-run-test.tmpl +74 -74
  9. package/commands/dev-smoke-test.md +340 -340
  10. package/commands/dev-smoke-test.tmpl +60 -60
  11. package/commands/fix-bug.md +402 -402
  12. package/commands/fix-bug.tmpl +78 -78
  13. package/commands/generate-bdd.md +512 -512
  14. package/commands/generate-bdd.tmpl +211 -211
  15. package/commands/generate-code.md +480 -482
  16. package/commands/generate-code.tmpl +179 -181
  17. package/commands/generate-design-spec.md +495 -495
  18. package/commands/generate-design-spec.tmpl +219 -219
  19. package/commands/generate-prd.md +445 -396
  20. package/commands/generate-prd.tmpl +45 -198
  21. package/commands/generate-spec-manifest.md +337 -337
  22. package/commands/generate-spec-manifest.tmpl +57 -57
  23. package/commands/generate-tech-docs.md +364 -364
  24. package/commands/generate-tech-docs.tmpl +84 -84
  25. package/commands/learn.md +346 -346
  26. package/commands/learn.tmpl +22 -22
  27. package/commands/map-testids.md +321 -321
  28. package/commands/map-testids.tmpl +41 -41
  29. package/commands/propose-scenario.md +334 -334
  30. package/commands/propose-scenario.tmpl +54 -54
  31. package/commands/qc-analyze.md +322 -323
  32. package/commands/qc-analyze.tmpl +42 -43
  33. package/commands/qc-design-test.md +303 -303
  34. package/commands/qc-design-test.tmpl +23 -23
  35. package/commands/qc-plan.md +296 -296
  36. package/commands/qc-plan.tmpl +16 -16
  37. package/commands/qc-report.md +301 -301
  38. package/commands/qc-report.tmpl +21 -21
  39. package/commands/qc-review.md +297 -297
  40. package/commands/qc-review.tmpl +17 -17
  41. package/commands/qc-run-test.md +336 -336
  42. package/commands/qc-run-test.tmpl +35 -35
  43. package/commands/refine-prd.md +426 -428
  44. package/commands/refine-prd.tmpl +61 -61
  45. package/commands/report-bug.md +350 -350
  46. package/commands/report-bug.tmpl +70 -70
  47. package/commands/review-code.md +363 -363
  48. package/commands/review-code.tmpl +39 -39
  49. package/commands/review-context.md +577 -579
  50. package/commands/review-context.tmpl +212 -212
  51. package/commands/review-tech-docs.md +426 -426
  52. package/commands/review-tech-docs.tmpl +146 -146
  53. package/commands/setup-ai-first.md +237 -237
  54. package/commands/setup-ai-first.tmpl +131 -131
  55. package/commands/sync.md +145 -145
  56. package/commands/sync.tmpl +93 -93
  57. package/commands/update-framework.md +88 -88
  58. package/commands/update-framework.tmpl +36 -36
  59. package/commands/validate-traces.md +379 -379
  60. package/commands/validate-traces.tmpl +99 -99
  61. package/core/FRAMEWORK_VERSION +1 -1
  62. package/core/commands/debug.md +435 -435
  63. package/core/commands/define-product.md +330 -327
  64. package/core/commands/dev-gen-test.md +364 -364
  65. package/core/commands/dev-run-test.md +375 -375
  66. package/core/commands/dev-smoke-test.md +340 -340
  67. package/core/commands/fix-bug.md +402 -402
  68. package/core/commands/generate-bdd.md +512 -512
  69. package/core/commands/generate-code.md +480 -482
  70. package/core/commands/generate-design-spec.md +495 -495
  71. package/core/commands/generate-prd.md +445 -396
  72. package/core/commands/generate-spec-manifest.md +337 -337
  73. package/core/commands/generate-tech-docs.md +364 -364
  74. package/core/commands/learn.md +346 -346
  75. package/core/commands/map-testids.md +321 -321
  76. package/core/commands/propose-scenario.md +334 -334
  77. package/core/commands/qc-analyze.md +322 -323
  78. package/core/commands/qc-design-test.md +303 -303
  79. package/core/commands/qc-plan.md +296 -296
  80. package/core/commands/qc-report.md +301 -301
  81. package/core/commands/qc-review.md +297 -297
  82. package/core/commands/qc-run-test.md +336 -336
  83. package/core/commands/refine-prd.md +426 -428
  84. package/core/commands/report-bug.md +350 -350
  85. package/core/commands/review-code.md +363 -363
  86. package/core/commands/review-context.md +577 -579
  87. package/core/commands/review-tech-docs.md +426 -426
  88. package/core/commands/setup-ai-first.md +237 -237
  89. package/core/commands/sync.md +145 -145
  90. package/core/commands/update-framework.md +88 -88
  91. package/core/commands/validate-traces.md +379 -379
  92. package/core/skills/code/SKILL.md +388 -388
  93. package/core/skills/debug/SKILL.md +390 -390
  94. package/core/skills/design-spec/SKILL.md +316 -316
  95. package/core/skills/discovery/SKILL.md +7 -547
  96. package/core/skills/prd/SKILL.md +298 -394
  97. package/core/skills/setup-ai-first/SKILL.md +79 -79
  98. package/core/skills/spec/SKILL.md +176 -176
  99. package/core/skills/test/SKILL.md +602 -602
  100. package/core/steps/capture-lesson.md +44 -44
  101. package/core/steps/context-loader.md +174 -174
  102. package/core/steps/gate.md +54 -54
  103. package/core/steps/report-footer.md +52 -52
  104. package/core/steps/review-fanout.md +85 -87
  105. package/core/steps/spawn-agent.md +45 -45
  106. package/core/steps/trace-mirror.md +21 -21
  107. package/core/templates/architecture.template.md +37 -37
  108. package/core/templates/design-spec.template.md +77 -77
  109. package/core/templates/platform-guide.template.md +47 -47
  110. package/core/templates/prd.template.md +106 -231
  111. package/core/templates/product-definition.template.md +101 -88
  112. package/docs/04-operations/publishing.md +20 -3
  113. package/package.json +1 -1
  114. package/skills/code/SKILL.md +388 -388
  115. package/skills/code/SKILL.tmpl +56 -56
  116. package/skills/debug/SKILL.md +390 -390
  117. package/skills/debug/SKILL.tmpl +60 -60
  118. package/skills/design-spec/SKILL.md +316 -316
  119. package/skills/design-spec/SKILL.tmpl +36 -36
  120. package/skills/discovery/SKILL.md +7 -547
  121. package/skills/discovery/SKILL.tmpl +7 -140
  122. package/skills/prd/SKILL.md +298 -394
  123. package/skills/prd/SKILL.tmpl +40 -151
  124. package/skills/setup-ai-first/SKILL.md +79 -79
  125. package/skills/setup-ai-first/SKILL.tmpl +27 -27
  126. package/skills/spec/SKILL.md +176 -176
  127. package/skills/spec/SKILL.tmpl +18 -18
  128. package/skills/test/SKILL.md +602 -602
  129. package/skills/test/SKILL.tmpl +44 -44
  130. package/steps/capture-lesson.md +44 -44
  131. package/steps/context-loader.md +174 -174
  132. package/steps/gate.md +54 -54
  133. package/steps/report-footer.md +52 -52
  134. package/steps/review-fanout.md +85 -87
  135. package/steps/spawn-agent.md +45 -45
  136. package/steps/trace-mirror.md +21 -21
  137. package/templates/architecture.template.md +37 -37
  138. package/templates/design-spec.template.md +77 -77
  139. package/templates/platform-guide.template.md +47 -47
  140. package/templates/prd.template.md +106 -231
  141. package/templates/product-definition.template.md +101 -88
@@ -1,143 +1,143 @@
1
- # /generate-bdd — Generate BDD Feature Files
1
+ # /generate-bdd — Sinh BDD Feature Files
2
2
 
3
3
  ## Gate
4
- # Gate — Universal Entry Procedure
4
+ # Gate — Quy trình vào chuẩn cho mọi lệnh
5
5
 
6
- Every command must execute this gate before proceeding with its specific logic.
6
+ 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ó.
7
7
 
8
- ## Step 0 — Sub-Agent Mode Check
8
+ ## Bước 0 — Kiểm tra chế độ Sub-Agent
9
9
 
10
- Before anything else, check if `$ARGUMENTS` is a JSON payload from an orchestrator:
10
+ Trước tiên, kiểm tra xem `$ARGUMENTS` phải payload JSON từ một orchestrator hay không:
11
11
 
12
- 1. Attempt to parse `$ARGUMENTS` as JSON.
13
- 2. If it parses successfully **and** contains `"_agent_mode": true`:
14
- - **Skip Steps 1, 2, and 3 of this Gate entirely.**
15
- - Set target file = `payload.target_file`
16
- - Set loaded context = `payload.context` (do NOT run context-loader.md)
17
- - Set UC scope = `payload.uc_id` (process only this UC)
18
- - Set line range = `payload.uc_section` (read only that PRD section)
19
- - Proceed directly to the command-specific logic.
20
- 3. If `$ARGUMENTS` is not JSON or `_agent_mode` is absent continue to Step 1 (normal mode).
12
+ 1. Thử parse `$ARGUMENTS` dưới dạng JSON.
13
+ 2. Nếu parse thành công **và** chứa `"_agent_mode": true`:
14
+ - **Bỏ qua hoàn toàn Bước 1, 2 3 của Gate này.**
15
+ - Đặt target file = `payload.target_file`
16
+ - Đặt loaded context = `payload.context` (KHÔNG chạy context-loader.md)
17
+ - Đặt phạm vi UC = `payload.uc_id` (chỉ xử UC này)
18
+ - Đặt line range = `payload.uc_section` (chỉ đọc đúng section đó của PRD)
19
+ - Đi thẳng tới phần logic riêng của lệnh.
20
+ 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).
21
21
 
22
- ## Step 0-B — Model Check
22
+ ## Bước 0-B — Kiểm tra Model
23
23
 
24
- *Skip this step if `_agent_mode: true` (sub-agent — orchestrator already validated).*
24
+ *Bỏ qua bước này nếu `_agent_mode: true` (sub-agent — orchestrator đã kiểm tra rồi).*
25
25
 
26
- Complex generation and review commands require strong reasoning.
27
- Using a smaller model risks missed edge cases, incomplete spec analysis, and architecture violations.
26
+ 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.
27
+ 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.
28
28
 
29
- Display and wait for response:
29
+ Hiển thị chờ phản hồi:
30
30
 
31
31
  ```
32
32
  ⚙️ MODEL CHECK
33
33
  ──────────────────────────────────────────────────────────────────
34
- Recommended : claude-opus-4 (or latest Opus model)
35
- Why needed : Spec analysis, architecture review, code generation
36
- require deep reasoning. Smaller models miss edge cases.
34
+ Recommended : claude-opus-4 (hoặc model Opus mới nhất)
35
+ Why needed : Phân tích spec, review kiến trúc, sinh code đòi hỏi
36
+ suy luận sâu. Model nhỏ hơn dễ bỏ sót edge case.
37
37
 
38
- To switch in Claude Code:
39
- • Settings → Model → select "claude-opus"
40
- or: /model → choose claude-opus
38
+ Cách đổi trong Claude Code:
39
+ • Settings → Model → chọn "claude-opus"
40
+ hoặc: /model → chọn claude-opus
41
41
 
42
- Running on claude-opus?
43
- Y — yes, on claude-opus → proceed
44
- S — skip check (I accept lower quality risk with current model)
42
+ Đang chạy claude-opus?
43
+ Y — đúng, đang dùng claude-opus → tiếp tục
44
+ 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)
45
45
  ──────────────────────────────────────────────────────────────────
46
46
  ```
47
47
 
48
- - "Y" → proceed to Step 1.
49
- - "S" → proceed to Step 1 (user accepts risk, add ⚠️ to final report).
50
- - "N" or anything else → **STOP.** Output: "Please switch to claude-opus, then re-run this command."
48
+ - "Y" → tiếp tục sang Bước 1.
49
+ - "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).
50
+ - "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."
51
51
 
52
- ## Step 1 — Resolve Target File
52
+ ## Bước 1 — Xác định Target File
53
53
 
54
- 1. If `$ARGUMENTS` is provided and points to an existing file → use it directly as the target.
55
- 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:
56
- - **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.
57
- - **PRD commands** (target is `prd.md`): `{specs_dir}/{domain}/*/prd.md` (match the feature folder whose id corresponds), else `{specs_dir}/*/*/prd.md`.
58
- - **tech-docs commands**: `{specs_dir}/{domain}/*/tech-docs/{UC-ID}*-tech-design*.md`.
59
- - **design-spec commands**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
54
+ 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.
55
+ 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/`):
56
+ - **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 đó.
57
+ - **Lệnh PRD** (target `prd.md`): `{specs_dir}/{domain}/*/prd.md` (khớp feature folder id tương ứng), nếu không thì `{specs_dir}/*/*/prd.md`.
58
+ - **Lệnh tech-docs**: `{specs_dir}/{domain}/*/tech-docs/{UC-ID}*-tech-design*.md`.
59
+ - **Lệnh design-spec**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
60
60
 
61
- 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.
62
- 3. If `$ARGUMENTS` is empty or no match found:
63
- - List files in the relevant directory for this command (e.g., `specs/*/*/prd.md` for PRD commands, `specs/*/*/bdd/**/*.feature` for BDD commands).
64
- - Present the list to the user and ask: "Which file do you want to work with? (Enter number or filename)"
65
- - Wait for user selection before continuing.
61
+ 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.
62
+ 3. Nếu `$ARGUMENTS` rỗng hoặc không tìm thấy file khớp:
63
+ - Liệt các file trong thư mục liên quan của lệnh này (vd: `specs/*/*/prd.md` cho lệnh PRD, `specs/*/*/bdd/**/*.feature` cho lệnh BDD).
64
+ - 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)"
65
+ - Chờ người dùng chọn rồi mới tiếp tục.
66
66
 
67
- ## Step 2 — Execute Context Loader
67
+ ## Bước 2 — Chạy Context Loader
68
68
 
69
- Load all project context by following the procedure in `steps/context-loader.md`.
70
- Store all loaded context in memory for use throughout this command session.
69
+ 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`.
70
+ 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.
71
71
 
72
- ## Step 3 — CHECKPOINT
72
+ ## Bước 3 — CHECKPOINT
73
73
 
74
- After completing Steps 1 and 2, display a summary and wait for confirmation:
74
+ Sau khi hoàn thành Bước 1 2, hiển thị bản tóm tắt chờ xác nhận:
75
75
 
76
76
  ```
77
77
  CHECKPOINT
78
78
  -----------
79
79
  Target : {resolved file path}
80
- Project : {project.name from project-context.yaml}
80
+ Project : {project.name từ project-context.yaml}
81
81
  Tech stack : {language} / {framework}
82
- Module : {module if set, else "not configured"}
83
- Domains : {comma-separated domain list}
82
+ Module : {module nếu có, else "not configured"}
83
+ Domains : {danh sách domain, ngăn cách bởi dấu phẩy}
84
84
 
85
- Proceed? (Y/N)
85
+ Tiếp tục? (Y/N)
86
86
  ```
87
87
 
88
- Wait for explicit "Y" or "N" from the user before continuing.
89
- - "Y" → proceed to the command-specific steps below.
90
- - "N" → stop and ask what the user wants to change.
88
+ Chờ người dùng trả lời rõ ràng "Y" hoặc "N" rồi mới tiếp tục.
89
+ - "Y" → tiếp tục sang các bước riêng của lệnh bên dưới.
90
+ - "N" → dừng lại hỏi người dùng muốn thay đổi gì.
91
91
 
92
92
 
93
93
  ## Context
94
- # Context Loader — Load All Project Context
94
+ # Context Loader — Nạp toàn bộ context dự án
95
95
 
96
- Execute these steps in order. Store everything in memory for the duration of the command session.
96
+ 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.
97
97
 
98
- **Priority guide (anti-lost-in-middle):**
99
- - Steps 1–2 are PROJECT-CONFIG — loaded first, resolve all paths and metadata.
100
- - Step 3 is CRITICAL — architecture + coding standards, the highest-priority facts for generation.
101
- - Step 4 is SAFETY — data protection rules, enforced silently for the entire session.
102
- - Steps 5–6 are DOMAIN KNOWLEDGE — terminology and entity definitions.
103
- - Step 7 is the WORKING MEMORY RECAP — locks critical facts into the top of working memory.
98
+ **Hướng dẫn ưu tiên (chống lost-in-middle):**
99
+ - Bước 1–2 PROJECT-CONFIG — nạp trước, phân giải mọi path metadata.
100
+ - 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.
101
+ - Bước 4 SAFETY — quy tắc bảo vệ dữ liệu, thực thi ngầm suốt cả phiên.
102
+ - Bước 5–6 DOMAIN KNOWLEDGE — thuật ngữ và định nghĩa entity.
103
+ - 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.
104
104
 
105
105
  ---
106
106
 
107
- ## Step 1 — [PROJECT-CONFIG] Load project-context.yaml
107
+ ## Bước 1 — [PROJECT-CONFIG] Nạp project-context.yaml
108
108
 
109
- Read `.agent/project-context.yaml`. Extract and store:
109
+ Đọc `.agent/project-context.yaml`. Trích xuất và lưu:
110
110
 
111
111
  **Tech Stack:**
112
- - `tech_stack.language` → active language (e.g., Java 17, TypeScript, C#, Go)
113
- - `tech_stack.framework` → active framework (e.g., Spring Boot 3.2, Angular 17, .NET 8)
114
- - `tech_stack.build_tool` → build tool (e.g., Maven, npm, dotnet, go)
115
- - `tech_stack.test_framework` → test framework (e.g., JUnit 5 + Mockito, Jest, xUnit)
116
- - `tech_stack.database` → database (e.g., PostgreSQL, MySQL, MongoDB)
117
- - `tech_stack.module` → active module profile (e.g., java-spring, angular, dotnet, golang, context-engineering)
112
+ - `tech_stack.language` → ngôn ngữ đang dùng (vd: Java 17, TypeScript, C#, Go)
113
+ - `tech_stack.framework` → framework đang dùng (vd: Spring Boot 3.2, Angular 17, .NET 8)
114
+ - `tech_stack.build_tool` → build tool (vd: Maven, npm, dotnet, go)
115
+ - `tech_stack.test_framework` → test framework (vd: JUnit 5 + Mockito, Jest, xUnit)
116
+ - `tech_stack.database` → database (vd: PostgreSQL, MySQL, MongoDB)
117
+ - `tech_stack.module` → module profile đang dùng (vd: java-spring, angular, dotnet, golang, context-engineering)
118
118
 
119
119
  **Conventions:**
120
- - `conventions.build_command` → how to compile/build
121
- - `conventions.test_command` → how to run tests
122
- - `conventions.service_run` → how to start the service
123
- - `conventions.ticket_prefix` → ticket ID prefix (e.g., PROJ, FEAT, UC)
120
+ - `conventions.build_command` → cách compile/build
121
+ - `conventions.test_command` → cách chạy test
122
+ - `conventions.service_run` → cách khởi động service
123
+ - `conventions.ticket_prefix` → tiền tố ticket ID (vd: PROJ, FEAT, UC)
124
124
 
125
125
  **Domains:**
126
- - `domains` → list of active business domains
127
-
128
- **Paths (if present):**
129
- - `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/}`
130
- - `paths.refinement_dir` → findings/review output dir
131
- - `paths.qc_dir` → QC automation artifacts root (visible top-level, one subfolder per UC: `{qc_dir}/{UC-ID}/`)
132
- - `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)
133
- - `paths.product_definitions_dir` → product definitions root
134
- - `paths.domain_knowledge_dir` → domain knowledge root
135
- - `paths.business_dictionary` → path to business-dictionary.md
136
- - `paths.core_entities` → path to core-entities.md
137
- - `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/`)
138
- - `paths.trace_dir` → trace state directory; structure: `.trace/{domain}/{prd-slug}/{UC-ID}.tsv`
139
-
140
- If `paths` section is absent, use these defaults:
126
+ - `domains` → danh sách các business domain đang hoạt động
127
+
128
+ **Paths (nếu ):**
129
+ - `paths.specs_dir` → gốc của spec artifact — PRD, BDD, tech-docs, design-spec. Cấu trúc: `{specs_dir}/{domain}/{prd-slug}/{prd.md | bdd/ | tech-docs/ | design-spec/}`
130
+ - `paths.refinement_dir` → thư mục output cho findings/review
131
+ - `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}/`)
132
+ - `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 đè)
133
+ - `paths.product_definitions_dir` → gốc product definition
134
+ - `paths.domain_knowledge_dir` → gốc domain knowledge
135
+ - `paths.business_dictionary` → path tới business-dictionary.md
136
+ - `paths.core_entities` → path tới core-entities.md
137
+ - `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/`)
138
+ - `paths.trace_dir` → thư mục trạng thái trace; cấu trúc: `.trace/{domain}/{prd-slug}/{UC-ID}.tsv`
139
+
140
+ Nếu không có section `paths`, dùng các giá trị mặc định:
141
141
  - `specs_dir` = `specs`
142
142
  - `refinement_dir` = `.agent/review`
143
143
  - `qc_dir` = `docs`
@@ -149,184 +149,184 @@ If `paths` section is absent, use these defaults:
149
149
  - `tech_docs_dir` = `specs`
150
150
  - `trace_dir` = `.trace`
151
151
 
152
- 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.
152
+ 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.
153
153
 
154
- **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:
154
+ **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ụ:
155
155
  - `specs/payment/create-invoice/prd.md` → `prd_slug = create-invoice`
156
- - `specs/payment/create-invoice/bdd/system/PAY-UC1.feature` → `prd_slug = create-invoice` *(NOT `system`)*
157
- - `specs/payment/create-invoice/bdd/web/PAY-UC1.feature` → `prd_slug = create-invoice` *(NOT `web`)*
158
- - `specs/payment/create-invoice/tech-docs/PAY-UC1-tech-design.md` → `prd_slug = create-invoice` *(NOT `tech-docs`)*
156
+ - `specs/payment/create-invoice/bdd/system/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `system`)*
157
+ - `specs/payment/create-invoice/bdd/web/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `web`)*
158
+ - `specs/payment/create-invoice/tech-docs/PAY-UC1-tech-design.md` → `prd_slug = create-invoice` *(KHÔNG phải `tech-docs`)*
159
159
  - `specs/payment/create-invoice/design-spec/PAY-design-spec-web.md` → `prd_slug = create-invoice`
160
160
 
161
- 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.
161
+ 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ừ đó.
162
162
 
163
- If `tech_stack.module` is set, also load `.agent/modules/{module}/stack-profile.yaml` if it exists.
163
+ 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.
164
164
 
165
165
  ---
166
166
 
167
- ## Step 1.5 — [SERVICE ROUTING] Resolve service paths (umbrella mode)
167
+ ## Bước 1.5 — [SERVICE ROUTING] Phân giải path service (chế độ umbrella)
168
168
 
169
- *Skip this step entirely if `setup.mode` is not `"umbrella"` and `services` section is absent from project-context.yaml.*
169
+ *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.*
170
170
 
171
- If `services` section is present:
171
+ Nếu section `services`:
172
172
 
173
- **1. Detect active domain** (in priority order):
174
- - Read `@trace.domain` from target file frontmatter (if Gate loaded a target file)
175
- - 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.
176
- *(e.g., `specs/user/create-account/prd.md` **and** `specs/user/create-account/bdd/system/UC1.feature` both → domain = `user`, prd_slug = `create-account`)*
177
- - If `$ARGUMENTS` contains a path, extract the domain segment after `specs_dir`
173
+ **1. Phát hiện active domain** (theo thứ tự ưu tiên):
174
+ - Đọc `@trace.domain` từ frontmatter của target file (nếu Gate đã nạp một target file)
175
+ - 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.
176
+ *(vd: `specs/user/create-account/prd.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
177
+ - Nếu `$ARGUMENTS` chứa một path, trích xuất segment domain sau `specs_dir`
178
178
 
179
- **2. Route to service** — if active domain matches a key in `services`:
180
- - 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.
181
- - 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.
182
- - Store `active_service` = `services.{domain}.path`
183
- - Store `active_service_module` = `services.{domain}.module`
184
- - If service has its own `module` → use it as `active_module` (overrides `tech_stack.module`)
179
+ **2. Route tới service** — nếu active domain khớp với một key trong `services`:
180
+ - 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.
181
+ - 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.
182
+ - Lưu `active_service` = `services.{domain}.path`
183
+ - Lưu `active_service_module` = `services.{domain}.module`
184
+ - Nếu service `module` riêng dùng làm `active_module` (override `tech_stack.module`)
185
185
 
186
- **3. Fallback** — if domain not detected or no matching service key:
187
- - Keep default paths from Step 1
188
- - Set `active_service = unresolved`
186
+ **3. Fallback** — nếu không phát hiện được domain hoặc không có service key khớp:
187
+ - Giữ path mặc định từ Bước 1
188
+ - Đặt `active_service = unresolved`
189
189
 
190
- **4. Spec source auto-override** — if `setup.spec_source` is set AND the corresponding path was not already explicitly set in `paths:`:
191
- - 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`.)*
192
- - 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.)*
190
+ **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:`:
191
+ - 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`.)*
192
+ - 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.)*
193
193
  - Override `paths.domain_knowledge_dir` → `{spec_source}/specs/domain-knowledge`
194
194
  - Override `paths.business_dictionary` → `{spec_source}/specs/domain-knowledge/business-dictionary.md`
195
195
  - Override `paths.core_entities` → `{spec_source}/specs/domain-knowledge/core-entities.md`
196
196
  - Override `paths.bug_reports_dir` → `{spec_source}/feedback/bug-reports`
197
197
  - Override `paths.bdd_proposals_dir` → `{spec_source}/feedback/bdd-proposals`
198
198
  - Override `paths.prd_change_requests_dir` → `{spec_source}/feedback/prd-change-requests`
199
- - 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`.)*
199
+ - 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`.)*
200
200
 
201
- > **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.
201
+ > ** 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.
202
202
 
203
203
  ---
204
204
 
205
- ## Step 1.6 — [SERVICE CONVENTIONS] Load service-specific conventions (umbrella mode)
205
+ ## Bước 1.6 — [SERVICE CONVENTIONS] Nạp convention riêng của service (chế độ umbrella)
206
206
 
207
- *Skip this step entirely if `active_service` is `"unresolved"` or context is single-service mode.*
207
+ *Bỏ qua hoàn toàn bước này nếu `active_service` `"unresolved"` hoặc context chế độ single-service.*
208
208
 
209
- When `active_service` has been resolved to a real path in Step 1.5 (e.g., `user-service/`):
209
+ Khi `active_service` đã được phân giải thành một path thật Bước 1.5 (vd: `user-service/`):
210
210
 
211
- **1. Locate service config** — try in priority order:
211
+ **1. Định vị config của service** — thử theo thứ tự ưu tiên:
212
212
  - `{active_service}/.agent/project-context.yaml`
213
213
  - `{active_service}/project-context.yaml`
214
214
 
215
- **2. If found, override with service-specific values:**
215
+ **2. Nếu tìm thấy, override bằng giá trị riêng của service:**
216
216
 
217
- | Variable | Source |
217
+ | Biến | Nguồn |
218
218
  |----------|--------|
219
- | `conventions.test_command` | service's `conventions.test_command` |
220
- | `conventions.build_command` | service's `conventions.build_command` |
221
- | `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`). |
222
- | `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. |
219
+ | `conventions.test_command` | `conventions.test_command` của service |
220
+ | `conventions.build_command` | `conventions.build_command` của service |
221
+ | `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`). |
222
+ | `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. |
223
223
 
224
- **3. Store** `service_root = {active_service}` as the working directory anchor for all downstream commands:
225
- - Shell commands (`/dev-run-test`, `/dev-gen-test`) run **from within** `service_root`
226
- - **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/`).
224
+ **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:
225
+ - Các lệnh shell (`/dev-run-test`, `/dev-gen-test`) chạy **bên trong** `service_root`
226
+ - **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/`).
227
227
 
228
- **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).
228
+ **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).
229
229
 
230
230
  ---
231
231
 
232
- ## Step 2 — [PROJECT-CONFIG] Load module stack profile (conditional)
232
+ ## Bước 2 — [PROJECT-CONFIG] Nạp module stack profile (có điều kiện)
233
233
 
234
- If `tech_stack.module` is set, read `.agent/modules/{module}/stack-profile.yaml`.
235
- Merge framework-specific conventions (layer patterns, test patterns, naming rules) into the loaded context.
236
- If the file does not existskip silently.
234
+ Nếu `tech_stack.module` được đặt, đọc `.agent/modules/{module}/stack-profile.yaml`.
235
+ Merge các convention riêng của framework (layer pattern, test pattern, quy tắc đặt tên) vào context đã nạp.
236
+ Nếu file không tồn tạibỏ qua âm thầm.
237
237
 
238
238
  ---
239
239
 
240
- ## Step 3 — [CRITICAL] Load CLAUDE.md (layered: root + service overlay)
240
+ ## Bước 3 — [CRITICAL] Nạp CLAUDE.md (phân tầng: root + service overlay)
241
241
 
242
- *This is the highest-priority contextit defines HOW to write code and documents for this project.*
242
+ *Đâ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.*
243
243
 
244
- CLAUDE.md is loaded in **two layers** so umbrella-wide rules and service-specific
245
- architecture/coding standards compose correctly. The agent always sits at the umbrella
246
- root, but the implementation code lives in a service submodule with its OWN stack,
247
- architecture, and conventions — so the service's CLAUDE.md must win for code generation.
244
+ CLAUDE.md được nạp theo **hai tầng** để các quy tắc toàn-umbrella kiến trúc/coding standards
245
+ 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
246
+ trong một service submodule với stack, kiến trúc, convention RIÊNG của — nên CLAUDE.md của
247
+ service phải thắng khi sinh code.
248
248
 
249
- **Layer 1 — [BASE] Root CLAUDE.md (umbrella-wide).**
250
- Read `CLAUDE.md` at the repo root. Treat its contents as the **shared baseline** for the
251
- whole umbrella git conventions, data-protection posture, cross-cutting rules, and (in
252
- single-service mode) the project's only architecture + coding standards.
249
+ **Tầng 1 — [BASE] Root CLAUDE.md (toàn umbrella).**
250
+ Đọc `CLAUDE.md` gốc repo. Coi nội dung của **nền tảng dùng chung** cho cả umbrella —
251
+ git convention, thế bảo vệ dữ liệu, quy tắc xuyên suốt, (ở chế độ single-service) là
252
+ kiến trúc + coding standards duy nhất của dự án.
253
253
 
254
- **Layer 2 — [OVERLAY] Service CLAUDE.md (umbrella mode only).**
255
- *Run only if `service_root` was set in Step 1.6 (i.e. a real service was routed to).*
256
- Read `{service_root}/CLAUDE.md`. This file defines the architecture + coding standards of
257
- the **actual stack being implemented** (e.g. `user-service` = java-spring, `web` = nextjs).
258
- Overlay it on top of Layer 1: **on any conflict, the service value WINS** for architecture,
259
- coding standards, and error handling. Layer-1 values that the service does not redefine
260
- (e.g. git conventions, banned patterns shared org-wide) remain in effect.
254
+ **Tầng 2 — [OVERLAY] Service CLAUDE.md (chỉ chế độ umbrella).**
255
+ *Chỉ chạy nếu `service_root` đã được set Bước 1.6 (tức đã route tới một service thật).*
256
+ Đọc `{service_root}/CLAUDE.md`. File này định nghĩa kiến trúc + coding standards của **stack
257
+ thực sự đang được triển khai** (vd: `user-service` = java-spring, `web` = nextjs).
258
+ Overlay lên trên Tầng 1: **khi xung đột, giá trị của service THẮNG** cho kiến trúc,
259
+ coding standards, error handling. Các giá trị Tầng 1 mà service không định nghĩa lại
260
+ (vd: git convention, banned pattern dùng chung toàn tổ chức) vẫn hiệu lực.
261
261
 
262
- From the **merged** result, extract and store:
262
+ Từ kết quả **đã merge**, trích xuất và lưu:
263
263
 
264
- - **§1 Project Overview** → project name, language, framework, build/test commands, domains
265
- - **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules — *service overlay wins*
266
- - **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns — *service overlay wins*
267
- - **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name — *service overlay wins*
268
- - **§7 Git Conventions** → branch naming pattern, commit message format — *root baseline unless service redefines*
264
+ - **§1 Project Overview** → tên dự án, ngôn ngữ, framework, lệnh build/test, domains
265
+ - **§2 Architecture** → thứ tự layer (vd: Controller → Facade → Service → Repository), quy tắc kiến trúc — *service overlay thắng*
266
+ - **§3 Coding Standards** → quy tắc đặt tên (class, method), kiểu response wrapper, pattern bị cấm — *service overlay thắng*
267
+ - **§5 Error Handling** → kiểu exception, mapping HTTP status code, tên class not-found exception — *service overlay thắng*
268
+ - **§7 Git Conventions** → pattern đặt tên branch, format commit message — *lấy theo root trừ khi service định nghĩa lại*
269
269
 
270
- **Resolution rules:**
271
- - If both layers exist → merge as above; record `claude_md_source = root + {service_root}`.
272
- - If only the service overlay exists (no root CLAUDE.md) → use the service file alone; `claude_md_source = {service_root}`.
273
- - 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).
274
- - If neither existsnote CLAUDE.md as missing and continue with project-context.yaml data only.
270
+ **Quy tắc phân giải:**
271
+ - Nếu cả hai tầng tồn tại → merge như trên; ghi `claude_md_source = root + {service_root}`.
272
+ - Nếu chỉ service overlay (không root CLAUDE.md) → dùng file service một mình; `claude_md_source = {service_root}`.
273
+ - 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).
274
+ - 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.
275
275
 
276
276
  ---
277
277
 
278
- ## Step 4 — [SAFETY] Load Data Protection Rules
278
+ ## Bước 4 — [SAFETY] Nạp quy tắc bảo vệ dữ liệu
279
279
 
280
- Read `.agent/rules/data-protection.md` (or `rules/data-protection.md` from the framework installation).
280
+ Đọc `.agent/rules/data-protection.md` (hoặc `rules/data-protection.md` từ bản cài đặt framework).
281
281
 
282
- Store the sensitive file patternsyou must **never** read, write, display, or reference content from files matching those patterns for the entire session.
282
+ 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.
283
283
 
284
- If neither file existsapply built-in defaults: never access `.env*`, `*.key`, `*.pem`, `*secret*`, `*password*`, `*credential*`.
284
+ 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*`.
285
285
 
286
286
  ---
287
287
 
288
- ## Step 5 — [DOMAIN] Load Business Dictionary (conditional)
288
+ ## Bước 5 — [DOMAIN] Nạp Business Dictionary (có điều kiện)
289
289
 
290
- Check if the business dictionary file exists (use `paths.business_dictionary` resolved in Step 1).
290
+ Kiểm tra file business dictionary tồn tại không (dùng `paths.business_dictionary` đã phân giải ở Bước 1).
291
291
 
292
- If it exists, read it and extract:
293
- - **Canonical Terms** → complete list of approved terms and their definitions
294
- - **Banned Terms** → complete list of banned terms and their canonical replacements
295
- - **Status / Enum Registry** → allowed enum values per entity
292
+ Nếu tồn tại, đọc trích xuất:
293
+ - **Canonical Terms** → danh sách đầy đủ các thuật ngữ chuẩn và định nghĩa
294
+ - **Banned Terms** → danh sách đầy đủ các thuật ngữ bị cấm và bản thay thế chuẩn
295
+ - **Status / Enum Registry** → các giá trị enum được phép theo từng entity
296
296
 
297
- Store the banned terms list for **active enforcement** throughout the command session:
298
- - When generating any text (PRD, BDD, code comments, tech docs), verify no banned terms appear
299
- - Replace banned terms with their canonical equivalents automatically
297
+ Lưu danh sách banned term để **thực thi chủ động** suốt phiên làm việc của lệnh:
298
+ - 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
299
+ - Tự động thay banned term bằng bản chuẩn tương đương
300
300
 
301
- If the file does not existskip silently. Do not warn or block.
301
+ Nếu file không tồn tạibỏ qua âm thầm. Không cảnh báo hay chặn.
302
302
 
303
303
  ---
304
304
 
305
- ## Step 6 — [DOMAIN] Load Core Entities (conditional)
305
+ ## Bước 6 — [DOMAIN] Nạp Core Entities (có điều kiện)
306
306
 
307
- Check if the core entities file exists at `paths.core_entities` (resolved in Step 1).
308
- Default path: `specs/domain-knowledge/core-entities.md`.
307
+ Kiểm tra file core entities tồn tại tại `paths.core_entities` không (đã phân giải ở Bước 1).
308
+ Path mặc định: `specs/domain-knowledge/core-entities.md`.
309
309
 
310
- If it exists, read it and store:
311
- - **Entity catalog** → for each entity: its name, purpose, owner service, key fields (name + type), business invariants, and relationships
312
- - **Field name registry** → canonical field names to use in generated code and documents
313
- - **Relationship map** → how entities relate to each other (1:N, N:N, embedded, etc.)
310
+ Nếu tồn tại, đọc lưu:
311
+ - **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ệ
312
+ - **Field name registry** → tên field chuẩn dùng trong code tài liệu được sinh ra
313
+ - **Relationship map** → cách các entity liên hệ với nhau (1:N, N:N, embedded, v.v.)
314
314
 
315
- **How to use this catalog:**
316
- - When generating code: use the field names, types, and relationships defined heredo NOT infer from existing code
317
- - When generating PRD/BDD: reference entity names from this catalog for consistency
318
- - When generating tech-docs: use this catalog as the source-of-truth for entity definitions
315
+ **Cách dùng catalog này:**
316
+ - 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
317
+ - Khi sinh PRD/BDD: tham chiếu tên entity từ catalog này để nhất quán
318
+ - Khi sinh tech-docs: dùng catalog này làm nguồn chân lý cho định nghĩa entity
319
319
 
320
- If the file does not existskip silently.
320
+ Nếu file không tồn tạibỏ qua âm thầm.
321
321
 
322
322
  ---
323
323
 
324
- ## Step 6.5 — [PLATFORM] Derive active_module and platform_type
324
+ ## Bước 6.5 — [PLATFORM] Suy ra active_module platform_type
325
325
 
326
- Using `tech_stack.module` loaded in Step 1, derive and store two variables for use by all downstream commands:
326
+ 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:
327
327
 
328
328
  ```
329
- active_module = tech_stack.module (e.g. "java-spring", "react", "flutter")
329
+ active_module = tech_stack.module (vd: "java-spring", "react", "flutter")
330
330
  ```
331
331
 
332
332
  | `platform_type` | Modules |
@@ -335,122 +335,122 @@ active_module = tech_stack.module (e.g. "java-spring", "react", "flutter")
335
335
  | `web-frontend` | `react`, `nextjs`, `vue`, `nuxt`, `angular` |
336
336
  | `mobile` | `flutter`, `react-native`, `ios-swiftui`, `android-compose` |
337
337
 
338
- If `tech_stack.module` is blank or not recognized → set `platform_type = "unknown"` and flag as ⚠️ in the Step 7 recap.
338
+ 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.
339
339
 
340
- 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).
340
+ 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).
341
341
 
342
342
  ---
343
343
 
344
- ## Step 6.7 — [GUARDRAILS] Load Project Lessons (conditional)
344
+ ## Bước 6.7 — [GUARDRAILS] Nạp Project Lessons (có điều kiện)
345
345
 
346
- *Accumulated mistakes the AI must not repeat in this project. These are added over time via `/learn`
347
- or accepted during `/review-code`, `/fix-bug`, `/debug`.*
346
+ *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`
347
+ hoặc được chấp nhận trong `/review-code`, `/fix-bug`, `/debug`.*
348
348
 
349
- Resolve the lessons file path:
350
- - Use `paths.lessons_file` if set (may be service-overridden in umbrella mode, Step 1.6)
351
- - Else default `specs/domain-knowledge/lessons-learned.md`
352
- - In umbrella/service mode (when `service_root` is set), if `paths.lessons_file` is unset, default to `{service_root}/.agent/project-lessons.md`
349
+ Phân giải path file lessons:
350
+ - Dùng `paths.lessons_file` nếu được set ( thể bị service override ở chế độ umbrella, Bước 1.6)
351
+ - Else mặc định `specs/domain-knowledge/lessons-learned.md`
352
+ - 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`
353
353
 
354
- If the file exists, read it and store ALL lessons as **ACTIVE GUARDRAILS** for the session:
355
- - Treat each lesson's **Rule** as a hard constraintsame priority as CLAUDE.md coding standards (Step 3).
356
- - 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).
357
- - If a generated output would violate a lesson → correct it **before** presenting, and note which lesson (`L-NNN`) was applied.
354
+ Nếu file tồn tại, đọc lưu TẤT CẢ lesson làm **GUARDRAIL ĐANG HOẠT ĐỘNG** cho phiên:
355
+ - 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).
356
+ - 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).
357
+ - 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.
358
358
 
359
- If the file does not existskip silently (no lessons captured yet).
359
+ Nếu file không tồn tạibỏ qua âm thầm (chưa lesson nào được ghi nhận).
360
360
 
361
361
  ---
362
362
 
363
- ## Step 7 — [RECAP] Working Memory Recap (anti-lost-in-middle)
363
+ ## Bước 7 — [RECAP] Working Memory Recap (chống lost-in-middle)
364
364
 
365
- After loading all context, synthesize and output a compact summary block.
366
- This recap ensures the most critical facts are stated at the END of context loading
367
- (recency effect freshest in working memory when the task begins).
365
+ Sau khi nạp toàn bộ context, tổng hợp xuất một khối tóm tắt gọn.
366
+ 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
367
+ (hiệu ứng recency — tươi mới nhất trong bộ nhớ làm việc khi bắt đầu task).
368
368
 
369
- Output exactly this block:
369
+ Xuất đúng khối này:
370
370
  ```
371
371
  [CTX LOADED]
372
372
  Stack : {language} / {framework} / {database}
373
373
  Platform : {active_module} ({platform_type})
374
- Layers : {layer order from merged CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
375
- CLAUDE.md : {root + {service_root} | {service_root} only | root only | ⚠️ service overlay MISSINGusing root | missing}
374
+ Layers : {thứ tự layer từ CLAUDE.md §2 đã merge, vd: Controller → Facade → Service → Repository}
375
+ CLAUDE.md : {root + {service_root} | chỉ {service_root} | chỉ root | ⚠️ service overlay THIẾUdùng root | missing}
376
376
  Ticket : {ticket_prefix}-
377
377
  Dict : {loaded — N canonical terms, M banned terms | missing}
378
378
  Entities : {loaded — EntityA, EntityB, EntityC | missing}
379
- Lessons : {loaded — N guardrails | none yet}
379
+ Lessons : {loaded — N guardrails | chưa }
380
380
  Service : {active_service} ({active_service_module}) | single-service
381
- Svc Root : {service_root} — conventions + trace_dir loaded from service config | —
382
- Status : {FULL | PARTIAL — missing: CLAUDE.md / business-dict / core-entities | MINIMAL}
381
+ Svc Root : {service_root} — đã nạp conventions + trace_dir từ config service | —
382
+ Status : {FULL | PARTIAL — thiếu: CLAUDE.md / business-dict / core-entities | MINIMAL}
383
383
  ```
384
384
 
385
- If any CRITICAL file is missing (CLAUDE.md), flag it clearly so the user can decide whether to proceed.
385
+ 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.
386
386
 
387
387
  ---
388
388
 
389
- ## Context Load Complete
389
+ ## Hoàn tất nạp Context
390
390
 
391
- After completing all steps, you have loaded:
392
- - Project identity, tech stack, module conventions
393
- - Architecture rules and layer order ← **[CRITICAL — hold in working memory]**
394
- - Coding standards and naming conventions ← **[CRITICAL — hold in working memory]**
395
- - Data protection rules (sensitive file patterns to never access)
396
- - Terminology rules with banned-term list ← **[DOMAIN — apply to every generated word]**
397
- - Entity catalog (field names, types, invariants) ← **[DOMAIN — use for code generation]**
398
- - All configured paths
391
+ Sau khi hoàn thành tất cả các bước, bạn đã nạp:
392
+ - Định danh dự án, tech stack, convention module
393
+ - Quy tắc kiến trúc và thứ tự layer ← **[CRITICAL — giữ trong bộ nhớ làm việc]**
394
+ - Coding standards quy tắc đặt tên ← **[CRITICAL — giữ trong bộ nhớ làm việc]**
395
+ - Quy tắc bảo vệ dữ liệu (pattern file nhạy cảm không bao giờ truy cập)
396
+ - Quy tắc thuật ngữ kèm danh sách banned term ← **[DOMAIN — áp dụng cho mọi từ được sinh ra]**
397
+ - Entity catalog (tên field, kiểu, invariant) ← **[DOMAIN — dùng khi sinh code]**
398
+ - Toàn bộ path đã cấu hình
399
399
 
400
- Proceed to the next step of the calling command.
400
+ Tiếp tục sang bước kế tiếp của lệnh đang gọi.
401
401
 
402
402
 
403
- > **Tester proposals (optional input):** before generating, check `{paths.bdd_proposals_dir}/` (default `{spec_source}/feedback/bdd-proposals/`) for scenarios proposed by testers via `/propose-scenario` that map to this UC's ACs. Incorporate any the PO/Dev has acceptedthen the tester's draft is removed/archived from `feedback/`. Skip if the folder is empty.
403
+ > **Proposal của tester (input tuỳ chọn):** trước khi sinh, kiểm tra `{paths.bdd_proposals_dir}/` (mặc định `{spec_source}/feedback/bdd-proposals/`) tìm các scenario tester đề xuất qua `/propose-scenario` ứng với AC của UC này. Đưa vào những cái PO/Dev đã chấp nhận rồi draft của tester được xoá/lưu trữ khỏi `feedback/`. Bỏ qua nếu folder rỗng.
404
404
 
405
405
  ---
406
406
 
407
- ## Repo Mode Detection
407
+ ## Phát hiện Repo Mode
408
408
 
409
- After loading context, determine which mode to operate in:
409
+ Sau khi nạp context, xác định chế độ hoạt động:
410
410
 
411
- - **Spec repo mode**: `project-context.yaml` has NO `services` section OR `setup.mode: spec`
412
- - **Umbrella mode**: `project-context.yaml` HAS `services` section AND `setup.mode: umbrella`
411
+ - **Spec repo mode**: `project-context.yaml` KHÔNG section `services` HOẶC `setup.mode: spec`
412
+ - **Umbrella mode**: `project-context.yaml` section `services` `setup.mode: umbrella`
413
413
 
414
- → Spec repo mode → proceed to **Platform Selection** below (skip Service Detection)
415
- → Umbrella mode → proceed to **Service Detection** below (skip Platform Selection)
414
+ → Spec repo mode → tới **Platform Selection** bên dưới (bỏ qua Service Detection)
415
+ → Umbrella mode → tới **Service Detection** bên dưới (bỏ qua Platform Selection)
416
416
 
417
417
  ---
418
418
 
419
- ## Platform Selection (Spec Repo Mode Only)
419
+ ## Platform Selection (chỉ Spec Repo Mode)
420
420
 
421
- *Skip this section if running in umbrella mode.*
421
+ *Bỏ qua section này nếu đang chạy umbrella mode.*
422
422
 
423
- Ask the user to select the target platform:
423
+ Hỏi người dùng chọn platform target:
424
424
 
425
425
  ```
426
- Which platform is this BDD for?
426
+ BDD này dành cho platform nào?
427
427
  1. web — FE/Web (React, Next.js, Angular, Vue, Nuxt)
428
428
  2. app — Mobile (Flutter, React Native, iOS, Android)
429
- 3. system — System/BE BDD (synthesized from existing web + app BDDs)
429
+ 3. system — System/BE BDD (tổng hợp từ web + app BDD có sẵn)
430
430
  ```
431
431
 
432
- Wait for user selection. Set `active_platform` = chosen value.
432
+ Chờ người dùng chọn. Set `active_platform` = giá trị đã chọn.
433
433
 
434
434
  **Output path (spec repo mode):**
435
435
  `{paths.specs_dir}/{domain}/{prd-slug}/bdd/{active_platform}/{TICKET-ID}-UC{N}-{slug}.feature`
436
436
 
437
- **Platform vocabulary:**
437
+ **Từ vựng theo platform:**
438
438
 
439
439
  | Platform | "user action" | "type/input" | "observe" | "navigate" |
440
440
  |---|---|---|---|---|
441
441
  | web | "clicks" | "types into" / "enters" | "sees" / "the page shows" | "navigates to" / "goes to" |
442
442
  | app | "taps" | "enters" / "inputs" | "sees" / "the screen shows" | "navigates to" / "opens" |
443
- | system | N/A — use business events | — | "the system returns" / "receives response" | — |
443
+ | system | N/A — dùng business event | — | "the system returns" / "receives response" | — |
444
444
 
445
445
  ---
446
446
 
447
447
  ## System BDD Synthesis (active_platform = system)
448
448
 
449
- *Only applies when platform = system. Skip for web and app.*
449
+ *Chỉ áp dụng khi platform = system. Bỏ qua với web app.*
450
450
 
451
451
  ### Step S0 — Brownfield Check
452
452
 
453
- Check the source PRD Metadata table for `| **API Source** | existing |`.
453
+ Kiểm tra bảng Metadata của PRD nguồn tìm `| **API Source** | existing |`.
454
454
 
455
455
  **Nếu `API Source: existing`:**
456
456
  - API contract đã được PO ghi trong phần "Existing API Contract" của PRD.
@@ -463,47 +463,47 @@ Check the source PRD Metadata table for `| **API Source** | existing |`.
463
463
 
464
464
  ---
465
465
 
466
- ### Step S1 — Scan available FE/App BDDs
466
+ ### Step S1 — Scan các BDD FE/App có sẵn
467
467
 
468
- Search for existing BDDs for this TICKET-ID:
469
- - Web BDDs: `{paths.specs_dir}/{domain}/{prd-slug}/bdd/web/{TICKET-ID}-*.feature`
470
- - App BDDs: `{paths.specs_dir}/{domain}/{prd-slug}/bdd/app/{TICKET-ID}-*.feature`
468
+ Tìm các BDD sẵn cho TICKET-ID này:
469
+ - Web BDD: `{paths.specs_dir}/{domain}/{prd-slug}/bdd/web/{TICKET-ID}-*.feature`
470
+ - App BDD: `{paths.specs_dir}/{domain}/{prd-slug}/bdd/app/{TICKET-ID}-*.feature`
471
471
 
472
- Classify the feature:
472
+ Phân loại feature:
473
473
 
474
- | Condition | Mode |
474
+ | Điều kiện | Mode |
475
475
  |---|---|
476
- | Both web + app BDDs found | **Multi-platform** — synthesize from both |
477
- | Only web BDD found | **Web-only** — synthesize from web |
478
- | Only app BDD found | **App-only** — synthesize from app |
479
- | No FE/App BDDs found | **Backend-only** — gen directly from PRD |
476
+ | Tìm thấy cả web + app BDD | **Multi-platform** — tổng hợp từ cả hai |
477
+ | Chỉ tìm thấy web BDD | **Web-only** — tổng hợp từ web |
478
+ | Chỉ tìm thấy app BDD | **App-only** — tổng hợp từ app |
479
+ | Không tìm thấy FE/App BDD | **Backend-only** — gen trực tiếp từ PRD |
480
480
 
481
481
  ---
482
482
 
483
- ### Step S2 — Extract expected contracts per platform
483
+ ### Step S2 — Trích contract kỳ vọng theo từng platform
484
484
 
485
- For each found BDD file, extract:
486
- - **Triggers**: what user actions call the backend? (map to logical "request" events)
487
- - **Expected response data**: what fields/shape does each `Then` clause need from the system?
488
- - **Error signals**: what error states must the backend signal?
489
- - **Business rules**: what invariants does each platform assume the system enforces?
485
+ Với mỗi file BDD tìm thấy, trích:
486
+ - **Triggers**: hành động người dùng nào gọi backend? (map sang event "request" logic)
487
+ - **Expected response data**: mỗi mệnh đề `Then` cần field/shape từ hệ thống?
488
+ - **Error signals**: backend phải báo hiệu các trạng thái lỗi nào?
489
+ - **Business rules**: mỗi platform giả định hệ thống thực thi các invariant nào?
490
490
 
491
491
  ---
492
492
 
493
- ### Step S3 — Cross-Platform Conflict Check (multi-platform mode only)
493
+ ### Step S3 — Cross-Platform Conflict Check (chỉ multi-platform mode)
494
494
 
495
- *Skip if web-only, app-only, or backend-only.*
495
+ *Bỏ qua nếu web-only, app-only, hoặc backend-only.*
496
496
 
497
- Compare the extracted contracts across platforms. Flag a conflict if any of these differ:
497
+ So sánh các contract đã trích giữa các platform. Gắn cờ conflict nếu bất kỳ cái nào khác nhau:
498
498
 
499
- | Conflict type | Example |
499
+ | Loại conflict | dụ |
500
500
  |---|---|
501
- | **Response shape mismatch** | Web expects `{ token, redirect_url }`, App expects `{ token, user_profile }` |
502
- | **Error semantics mismatch** | Web expects HTTP 423 for lock, App expects custom error code `ACC_LOCKED` |
503
- | **Business rule contradiction** | Web BDD says "lock after 5 attempts", App BDD says "lock after 3 attempts" |
504
- | **Data field conflict** | Web expects `expires_in: seconds`, App expects `expires_at: ISO timestamp` |
501
+ | **Response shape mismatch** | Web mong `{ token, redirect_url }`, App mong `{ token, user_profile }` |
502
+ | **Error semantics mismatch** | Web mong HTTP 423 cho lock, App mong custom error code `ACC_LOCKED` |
503
+ | **Business rule contradiction** | Web BDD nói "lock sau 5 lần", App BDD nói "lock sau 3 lần" |
504
+ | **Data field conflict** | Web mong `expires_in: seconds`, App mong `expires_at: ISO timestamp` |
505
505
 
506
- **If conflicts detected → CHECKPOINT (mandatory, cannot skip):**
506
+ **Nếu phát hiện conflict → CHECKPOINT (bắt buộc, không bỏ qua được):**
507
507
 
508
508
  ```
509
509
  ⚠️ CROSS-PLATFORM CONTRACT CONFLICT
@@ -516,103 +516,103 @@ Conflict 1: Response shape mismatch
516
516
 
517
517
  Resolution options:
518
518
  A — Union response
519
- BE returns all fields: { token, redirect_url, user_profile }
520
- Clients ignore fields they don't use. Simple, slight over-fetch.
521
- B — Platform hint in request
522
- Client sends X-Platform: web|app in header, BE tailors response.
523
- Cleaner responses, more BE logic.
524
- C — Separate endpoints
525
- POST /auth/login/web and POST /auth/login/app
526
- Maximum flexibility, more endpoints to maintain.
527
- D — Custom: describe your approach
519
+ BE trả về tất cả field: { token, redirect_url, user_profile }
520
+ Client bỏ qua field không dùng. Đơn giản, hơi over-fetch.
521
+ B — Platform hint trong request
522
+ Client gửi X-Platform: web|app trong header, BE tuỳ biến response.
523
+ Response gọn hơn, nhiều BE logic hơn.
524
+ C — Endpoint riêng
525
+ POST /auth/login/web POST /auth/login/app
526
+ Linh hoạt tối đa, nhiều endpoint phải bảo trì hơn.
527
+ D — Custom: tả cách của bạn
528
528
  ──────────────────────────────────────────────────────────────────
529
- Choose resolution for each conflict (A/B/C/D):
529
+ Chọn resolution cho mỗi conflict (A/B/C/D):
530
530
  ```
531
531
 
532
- Wait for PO's resolution per conflict. Record each decision as a `# @system.resolution:` annotation in the generated system BDD file.
532
+ Chờ PO giải quyết từng conflict. Ghi mỗi quyết định thành annotation `# @system.resolution:` trong file system BDD được gen.
533
533
 
534
- **If no conflictsproceed to Step S4 directly.**
534
+ **Nếu không conflict tới Step S4 trực tiếp.**
535
535
 
536
536
  ---
537
537
 
538
- ### Step S4 — Generate System BDD scenarios
538
+ ### Step S4 — Sinh các scenario System BDD
539
539
 
540
- Generate scenarios based on mode and resolved conflicts:
540
+ Sinh scenario dựa trên mode các conflict đã giải quyết:
541
541
 
542
- - **Multi-platform**: synthesize from both web + app contracts, applying resolved resolutions
543
- - **Web-only / App-only**: derive from the single platform's contracts
544
- - **Backend-only**: derive directly from PRD AC/BR using business event language (not HTTP)
542
+ - **Multi-platform**: tổng hợp từ cả contract web + app, áp dụng các resolution đã chọn
543
+ - **Web-only / App-only**: suy ra từ contract của một platform
544
+ - **Backend-only**: suy ra trực tiếp từ AC/BR của PRD dùng ngôn ngữ business event (không phải HTTP)
545
545
 
546
- System BDD step vocabulary (always useregardless of FE/App vocabulary):
546
+ Từ vựng step của System BDD (luôn dùngbất kể từ vựng FE/App):
547
547
  - Triggers: "the system receives {event}" / "a {actor} submits {action}"
548
548
  - Assertions: "the system returns {data}" / "the system signals {error}" / "the system stores {state}"
549
- - Do NOT use UI words (click, tap, see, navigate) in system BDD
549
+ - KHÔNG dùng từ UI (click, tap, see, navigate) trong system BDD
550
550
 
551
- **If multi-platform with resolution A (union):**
552
- - System BDD shows the full response contract: all fields from all platforms
553
- - Add comment: `# @system.resolution: union — clients receive all fields`
551
+ **Nếu multi-platform với resolution A (union):**
552
+ - System BDD thể hiện contract response đầy đủ: tất cả field từ mọi platform
553
+ - Thêm comment: `# @system.resolution: union — clients receive all fields`
554
554
 
555
- **If resolution B (platform hint):**
556
- - Write separate `Scenario Outline` using Examples table for `web` vs `app` response variants
557
- - Add comment: `# @system.resolution: platform-hint — X-Platform header determines response shape`
555
+ **Nếu resolution B (platform hint):**
556
+ - Viết `Scenario Outline` riêng dùng Examples table cho biến thể response `web` vs `app`
557
+ - Thêm comment: `# @system.resolution: platform-hint — X-Platform header determines response shape`
558
558
 
559
- **If resolution C (separate endpoints):**
560
- - Write separate Scenarios for each endpoint
561
- - Note the endpoint split explicitly in the SCOPE section
559
+ **Nếu resolution C (endpoint riêng):**
560
+ - Viết Scenario riêng cho mỗi endpoint
561
+ - Ghi việc tách endpoint trong phần SCOPE
562
562
 
563
563
  ---
564
564
 
565
- ## Service Detection (Umbrella Mode Only)
565
+ ## Service Detection (chỉ Umbrella Mode)
566
566
 
567
- *Skip this section if running in spec repo mode.*
567
+ *Bỏ qua section này nếu đang chạy spec repo mode.*
568
568
 
569
- Read the PRD Metadata table for `| **Service** |` and `| **Module** |` rows.
569
+ Đọc bảng Metadata của PRD tìm row `| **Service** |` `| **Module** |`.
570
570
 
571
- | Condition | Action |
571
+ | Điều kiện | Hành động |
572
572
  |---|---|
573
- | PRD has `Service` row AND value is not "default" | Use it as `active_service` + `active_module`. Load catalog for that module. |
574
- | PRD has no `Service` row AND `services` defined in project-context.yaml | Ask: "Which service is this BDD for?" (list services, wait for selection) |
575
- | Single-service project (no `services` array) | `active_service = "default"`, `active_module = tech_stack.module` |
573
+ | PRD row `Service` giá trị không phải "default" | Dùng làm `active_service` + `active_module`. Nạp catalog cho module đó. |
574
+ | PRD không row `Service` `services` được định nghĩa trong project-context.yaml | Hỏi: "BDD này dành cho service nào?" (liệt kê service, chờ chọn) |
575
+ | Dự án single-service (không có mảng `services`) | `active_service = "default"`, `active_module = tech_stack.module` |
576
576
 
577
577
  **Output path (umbrella mode):**
578
578
  - `active_service = "default"` → `{paths.specs_dir}/{domain}/{prd-slug}/bdd/{TICKET-ID}-UC{N}-{slug}.feature`
579
579
  - `active_service ≠ "default"` → `{paths.specs_dir}/{domain}/{prd-slug}/bdd/{active_service}/{TICKET-ID}-UC{N}-{slug}.feature`
580
580
 
581
- **Platform vocabulary** — adapt BDD step wording based on `active_module`:
581
+ **Từ vựng theo platform** — điều chỉnh cách viết step BDD theo `active_module`:
582
582
 
583
583
  | Platform type | Modules | "click" | "type" | "see" | "navigate" |
584
584
  |---|---|---|---|---|---|
585
585
  | Web | react, nextjs, vue, nuxt, angular | "clicks" | "types into" / "enters" | "sees" / "the page shows" | "navigates to" / "goes to" |
586
586
  | Mobile | flutter, react-native, ios-swiftui, android-compose | "taps" | "enters" / "inputs" | "sees" / "the screen shows" | "navigates to" / "opens" |
587
- | Backend / API | java-spring, golang, dotnet, php-laravel | *(no UI stepsuse)* "submits a request" / "calls the API" | — | "receives response" / "the system returns" | — |
587
+ | Backend / API | java-spring, golang, dotnet, php-laravel | *(không UI stepdùng)* "submits a request" / "calls the API" | — | "receives response" / "the system returns" | — |
588
588
 
589
- Apply this vocabulary silently when writing Gherkin steps. Do NOT mix web and mobile terms in the same feature file.
589
+ Áp dụng từ vựng này âm thầm khi viết step Gherkin. KHÔNG trộn từ web mobile trong cùng một file feature.
590
590
 
591
591
  ---
592
592
 
593
593
  ## Orchestration Check
594
594
 
595
- *Skip this section if already in sub-agent mode (Step 0 of Gate was triggered).*
595
+ *Bỏ qua section này nếu đã sub-agent mode (Step 0 của Gate đã kích hoạt).*
596
596
 
597
- After loading context, check if the target PRD is large enough to warrant sub-agents:
597
+ Sau khi nạp context, kiểm tra PRD target đủ lớn để cần sub-agent không:
598
598
 
599
- 1. Count `#### {TICKET-ID}-UC` headings in the PRD → **UC count**.
600
- 2. Count total lines in the PRD → **line count**.
601
- 3. If **UC count > 3** OR **line count > 300**:
602
- - Switch to orchestration mode — follow `steps/spawn-agent.md`.
603
- - The main session becomes the orchestrator: spawn 1 sub-agent per UC.
604
- - Each sub-agent runs `/generate-bdd` with `_agent_mode: true` payload.
605
- - Collect results and show merged report.
606
- - **Do NOT continue with the steps below.**
607
- 4. If UC count ≤ 3 AND line count ≤ 300 → continue with Version Check below (single-session mode).
599
+ 1. Đếm các heading `#### {TICKET-ID}-UC` trong PRD → **UC count**.
600
+ 2. Đếm tổng số dòng trong PRD → **line count**.
601
+ 3. Nếu **UC count > 3** HOẶC **line count > 300**:
602
+ - Chuyển sang orchestration mode — theo `steps/spawn-agent.md`.
603
+ - Session chính trở thành orchestrator: spawn 1 sub-agent cho mỗi UC.
604
+ - Mỗi sub-agent chạy `/generate-bdd` với payload `_agent_mode: true`.
605
+ - Thu thập kết quả hiện report đã merge.
606
+ - **KHÔNG tiếp tục các bước bên dưới.**
607
+ 4. Nếu UC count ≤ 3 line count ≤ 300 → tiếp tục Version Check bên dưới (single-session mode).
608
608
 
609
609
  ---
610
610
 
611
611
  ## Sub-Agent Return Format
612
612
 
613
- *This section applies when running as a sub-agent (Gate Step 0 detected `_agent_mode: true`).*
613
+ *Section này áp dụng khi chạy như sub-agent (Gate Step 0 phát hiện `_agent_mode: true`).*
614
614
 
615
- After generating all `.feature` and `.tsv` files for the assigned UC, return the structured result JSON (as specified in `steps/spawn-agent.md` Step E):
615
+ Sau khi sinh tất cả file `.feature` `.tsv` cho UC được giao, trả về JSON kết quả cấu trúc (theo `steps/spawn-agent.md` Step E):
616
616
 
617
617
  ```json
618
618
  { "uc_id": "{TICKET-ID}-UC{N}", "files_created": ["path/to/file1", "path/to/file2"], "status": "success | error", "errors": [] }
@@ -622,83 +622,83 @@ After generating all `.feature` and `.tsv` files for the assigned UC, return the
622
622
 
623
623
  ## Version Check
624
624
 
625
- Before generating, check for existing `.feature` files for this PRD:
625
+ Trước khi sinh, kiểm tra các file `.feature` sẵn cho PRD này:
626
626
 
627
- 1. Resolve the search path based on mode:
627
+ 1. Phân giải search path theo mode:
628
628
  - **Spec repo mode**: `{paths.specs_dir}/{domain}/{prd-slug}/bdd/{active_platform}/{TICKET-ID}-UC*.feature`
629
- - **Umbrella mode**: `{paths.specs_dir}/{domain}/{prd-slug}/bdd/{TICKET-ID}-UC*.feature` (or with `{active_service}/` if multi-service)
630
- 2. Read current PRD `| **Version** |` from metadata (e.g., `1.2`).
631
-
632
- **If no existing feature files** → fresh generation, proceed normally. Use PRD version as `@trace.prd_version`.
633
-
634
- **If existing feature files found**:
635
- - Read `# @trace.prd_version:` from the existing feature file header.
636
- - Compare with current PRD version.
637
- - If **same** → ask: "BDD already generated from PRD v{version}. Regenerate? (Y/N)"
638
- - If **different** (PRD was updated):
639
- 1. Read `## Changelog` from the PRD — extract all rows newer than the existing BDD's `@trace.prd_version`.
640
- 2. Show CHECKPOINT:
629
+ - **Umbrella mode**: `{paths.specs_dir}/{domain}/{prd-slug}/bdd/{TICKET-ID}-UC*.feature` (hoặc với `{active_service}/` nếu multi-service)
630
+ 2. Đọc `| **Version** |` hiện tại của PRD từ metadata (vd: `1.2`).
631
+
632
+ **Nếu không file feature nào** → gen mới, tiếp tục bình thường. Dùng version PRD làm `@trace.prd_version`.
633
+
634
+ **Nếu tìm thấy file feature sẵn**:
635
+ - Đọc `# @trace.prd_version:` từ header file feature sẵn.
636
+ - So với version PRD hiện tại.
637
+ - Nếu **giống** → hỏi: "BDD đã sinh từ PRD v{version}. Gen lại? (Y/N)"
638
+ - Nếu **khác** (PRD đã cập nhật):
639
+ 1. Đọc `## Changelog` từ PRD — trích tất cả row mới hơn `@trace.prd_version` của BDD hiện có.
640
+ 2. Hiện CHECKPOINT:
641
641
  ```
642
- ⚠️ PRD version drift detected
643
- BDD was generated from PRD v{old}
644
- PRD is now at v{new}
642
+ ⚠️ Phát hiện PRD version drift
643
+ BDD được sinh từ PRD v{old}
644
+ PRD giờ v{new}
645
645
 
646
- Changes since v{old}:
646
+ Thay đổi kể từ v{old}:
647
647
  {changelog rows}
648
648
 
649
649
  Options:
650
- Y — update only affected scenarios
651
- F — full regeneration of all scenarios
652
- N — cancel
650
+ Y — chỉ cập nhật các scenario bị ảnh hưởng
651
+ F — gen lại toàn bộ scenario
652
+ N — huỷ
653
653
  ```
654
- 3. Proceed based on user choice.
654
+ 3. Tiếp tục theo lựa chọn của người dùng.
655
655
 
656
656
  ---
657
657
 
658
- ## BDD Writing Rules (R1-R10 — enforce strictly)
658
+ ## BDD Writing Rules (R1-R10 — enforce nghiêm)
659
659
 
660
- | Rule | Name | Requirement |
660
+ | Rule | Name | Yêu cầu |
661
661
  |------|------|-------------|
662
- | R1 | Given/When/Then Semantics | Given=state, When=action, Then=outcome. Every SC needs full G/W/T. |
663
- | R2 | One Behavior Per Scenario | 1 SC = 1 behavior. Do NOT chain When→Then→When→Then. |
664
- | R3 | Ubiquitous Language | Do NOT use UI selectors / API names / tech terms in steps. |
665
- | R4 | Outside-in Naming | SC name describes business outcome. No "click" / "(Case X)" / component names. |
666
- | R5 | Declarative over Imperative | Describe WHAT (business intent), NOT HOW (UI mechanic). |
667
- | R6 | Observable Outcomes Only | Then asserts observable outcome. Not UI intermediate state / internal state. |
668
- | R7 | Key Examples / Concrete | Use concrete values. Not vague "valid data". |
669
- | R8 | Independence | SC runs independently. Does not depend on state from another SC. |
670
- | R9 | Test Data Completeness | Data table has enough fields to derive expected Then. |
671
- | R10 | Scope Boundary Explicit | Cross-UC reference uses navigation wording + Note comment. |
672
-
673
- ## Project Compliance (fail review if missing — C.1-C.5)
662
+ | R1 | Given/When/Then Semantics | Given=state, When=action, Then=outcome. Mỗi SC cần đủ G/W/T. |
663
+ | R2 | One Behavior Per Scenario | 1 SC = 1 behavior. KHÔNG chain When→Then→When→Then. |
664
+ | R3 | Ubiquitous Language | KHÔNG dùng UI selector / tên API / tech term trong step. |
665
+ | R4 | Outside-in Naming | Tên SC tả business outcome. Không "click" / "(Case X)" / tên component. |
666
+ | R5 | Declarative over Imperative | tả WHAT (ý định nghiệp vụ), KHÔNG phải HOW (cơ chế UI). |
667
+ | R6 | Observable Outcomes Only | Then khẳng định outcome quan sát được. Không phải trạng thái UI trung gian / internal state. |
668
+ | R7 | Key Examples / Concrete | Dùng giá trị cụ thể. Không "valid data" mơ hồ. |
669
+ | R8 | Independence | SC chạy độc lập. Không phụ thuộc state từ SC khác. |
670
+ | R9 | Test Data Completeness | Data table đủ field để suy ra Then kỳ vọng. |
671
+ | R10 | Scope Boundary Explicit | Cross-UC reference dùng cách diễn đạt navigation + comment Note. |
672
+
673
+ ## Project Compliance (fail review nếu thiếu — C.1-C.5)
674
674
 
675
675
  | Check | Rule |
676
676
  |-------|------|
677
- | C.1 Wireframe Coverage | Every component/action in Wireframe has ≥1 SC. |
678
- | C.2 PRD Traceability | Every AC and every BR (including each logic bullet) maps to ≥1 SC. |
679
- | C.3 Business Dictionary | Use correct canonical terms from business-dictionary.md. |
680
- | C.4 Banned Terms | 0 banned terms in file — grep before generating. |
681
- | C.5 NHÓM Grouping | Feature ≥3 SCsMUST have NHÓM grouping by business theme. |
677
+ | C.1 Wireframe Coverage | Mỗi component/action trong Wireframe ≥1 SC. |
678
+ | C.2 PRD Traceability | Mỗi AC mỗi BR (gồm từng bullet logic) map tới ≥1 SC. |
679
+ | C.3 Business Dictionary | Dùng đúng canonical term từ business-dictionary.md. |
680
+ | C.4 Banned Terms | 0 banned term trong file — grep trước khi gen. |
681
+ | C.5 NHÓM Grouping | Feature ≥3 SCPHẢI NHÓM grouping theo business theme. |
682
682
 
683
683
  ---
684
684
 
685
- ## NHÓM Grouping Convention (C.5 — mandatory for ≥3 scenarios)
685
+ ## NHÓM Grouping Convention (C.5 — bắt buộc cho ≥3 scenario)
686
686
 
687
- Group by business theme, NOT by happy/negative/edge.
687
+ Gom theo business theme, KHÔNG theo happy/negative/edge.
688
688
 
689
- Format header (indent 2 spaces, same level as Background):
689
+ Format header (thụt 2 space, cùng cấp với Background):
690
690
  ```
691
691
  # ==========================================================
692
- # NHÓM N: <Business theme> (<BR refs if applicable>)
692
+ # NHÓM N: <Business theme> (<BR refs nếu áp dụng>)
693
693
  # ==========================================================
694
694
  ```
695
695
 
696
696
  Rules:
697
- - Number sequentially NHÓM 1 → N. SC IDs sequential across lifecycle (do not reset per NHÓM).
698
- - Each NHÓM can contain @happy + @edge + @negative of the same theme.
699
- - SCs in NHÓM do not need to be in ID order (NHÓM 2 can contain SC4, SC8, SC11 if same theme).
697
+ - Đánh số tuần tự NHÓM 1 → N. SC ID tuần tự xuyên suốt lifecycle (không reset theo từng NHÓM).
698
+ - Mỗi NHÓM thể chứa @happy + @edge + @negative cùng theme.
699
+ - SC trong NHÓM không cần theo thứ tự ID (NHÓM 2 thể chứa SC4, SC8, SC11 nếu cùng theme).
700
700
 
701
- Suggested patterns (adjust per UC):
701
+ Pattern gợi ý (điều chỉnh theo UC):
702
702
  - `Init / Save success — valid data combinations`
703
703
  - `Validation / Block when invalid`
704
704
  - `Error handling — API fail / system error`
@@ -710,7 +710,7 @@ Suggested patterns (adjust per UC):
710
710
 
711
711
  ## UC Decomposition
712
712
 
713
- For each UC in the PRD, present the SC outline **before generating**:
713
+ Với mỗi UC trong PRD, trình bày outline SC **trước khi sinh**:
714
714
  ```
715
715
  {TICKET-ID}-UC1: {Use Case Name}
716
716
  NHÓM 1: {Theme} (BR1, BR2)
@@ -723,52 +723,52 @@ For each UC in the PRD, present the SC outline **before generating**:
723
723
  BRs covered: {TICKET-ID}-UC1-BR1, BR2, BR3
724
724
  ```
725
725
 
726
- CHECKPOINT: "Does this outline look correct? Do you want to add or remove any SCs?" → **Wait for confirm before generating.**
726
+ CHECKPOINT: "Outline này đúng chưa? Bạn muốn thêm hay bớt SC nào không?" → **Chờ confirm trước khi sinh.**
727
727
 
728
728
  ---
729
729
 
730
730
  ## Generate
731
731
 
732
- **Output path by mode:**
732
+ **Output path theo mode:**
733
733
  - **Spec repo mode**: `{paths.specs_dir}/{domain}/{prd-slug}/bdd/{active_platform}/{TICKET-ID}-UC{N}-{slug}.feature`
734
734
  - **Umbrella mode (single-service)**: `{paths.specs_dir}/{domain}/{prd-slug}/bdd/{TICKET-ID}-UC{N}-{slug}.feature`
735
735
  - **Umbrella mode (multi-service)**: `{paths.specs_dir}/{domain}/{prd-slug}/bdd/{active_service}/{TICKET-ID}-UC{N}-{slug}.feature`
736
736
 
737
- For each UC, write to the resolved path above. Use vocabulary for the active platform (from Platform Selection or Service Detection).
737
+ Với mỗi UC, ghi vào path đã phân giải ở trên. Dùng từ vựng cho active platform (từ Platform Selection hoặc Service Detection).
738
738
 
739
739
  ```gherkin
740
740
  # ============================================================
741
741
  # @trace.id: {TICKET-ID}-UC{N}
742
742
  # @trace.title: <Feature name>
743
- # @trace.revision: 1 ← static field; use @trace.bdd_version for version tracking (incremented by /review-context --fix or --resume)
743
+ # @trace.revision: 1 ← field tĩnh; dùng @trace.bdd_version để theo dõi version (tăng bởi /review-context --fix hoặc --resume)
744
744
  # @trace.domain: <domain>
745
- # @trace.platform: {active_platform — web | app | system | (omit in umbrella mode)}
746
- # @trace.service: {active_service — omit in spec repo mode}
747
- # @trace.module: {active_module in umbrella mode; "unknown" in spec repo mode}
745
+ # @trace.platform: {active_platform — web | app | system | (bỏ trong umbrella mode)}
746
+ # @trace.service: {active_service — bỏ trong spec repo mode}
747
+ # @trace.module: {active_module trong umbrella mode; "unknown" trong spec repo mode}
748
748
  # @trace.status: draft
749
749
  # @trace.author: AI-generated
750
750
  # @trace.created_at: {YYYY-MM-DD}
751
751
  # @trace.prd: {TICKET-ID}
752
- # @trace.prd_version: {read from PRD metadata "| **Version** |"}
753
- # @trace.bdd_version: {1.0 if fresh generation; increment by 0.1 on re-generatione.g. 1.0 → 1.1}
752
+ # @trace.prd_version: {đọc từ metadata PRD "| **Version** |"}
753
+ # @trace.bdd_version: {1.0 nếu gen mới; tăng 0.1 khi gen lại vd 1.0 → 1.1}
754
754
  # @trace.business_rules: {TICKET-ID}-UC{N}-BR1, {TICKET-ID}-UC{N}-BR2
755
755
  # @trace.dataset: {domain}.testdata.yaml
756
756
  # ============================================================
757
757
 
758
758
  # === CONTEXT ===
759
- # Actor: <role performing the action, e.g., Consumer, Staff, System>
760
- # Screens: <related screens, e.g., Cart → Confirm Order → Order Detail>
761
- # Entities: <business entities, e.g., Order, OrderItem, Consumer>
762
- # Pre-state: <shared state before entering scenarios>
759
+ # Actor: <vai trò thực hiện hành động, vd: Consumer, Staff, System>
760
+ # Screens: <các màn liên quan, vd: Cart → Confirm Order → Order Detail>
761
+ # Entities: <business entity, vd: Order, OrderItem, Consumer>
762
+ # Pre-state: <state dùng chung trước khi vào các scenario>
763
763
 
764
764
  # === SCOPE ===
765
- # In: <what this UC covers>
766
- # Out: <what is NOT in this UC — link to other UC/feature (R10)>
765
+ # In: <UC này phủ gì>
766
+ # Out: <cái KHÔNG thuộc UC này — link tới UC/feature khác (R10)>
767
767
 
768
768
  # === BUSINESS DEFINITION ===
769
- # Quick reference for terms used in this feature. SoT details: business-dictionary.md
770
- # <Term 1>: <short definition>
771
- # <Term 2>: <short definition>
769
+ # Tham chiếu nhanh các term dùng trong feature này. Chi tiết SoT: business-dictionary.md
770
+ # <Term 1>: <định nghĩa ngắn>
771
+ # <Term 2>: <định nghĩa ngắn>
772
772
 
773
773
  Feature: <Feature name>
774
774
  As a <role>
@@ -776,29 +776,29 @@ Feature: <Feature name>
776
776
  So that <business value>
777
777
 
778
778
  Background:
779
- Given <shared precondition — use aliases from dataset, not technical IDs>
779
+ Given <precondition dùng chung dùng alias từ dataset, không phải ID kỹ thuật>
780
780
 
781
781
  # ==========================================================
782
782
  # NHÓM 1: <Business theme> (<BR refs>)
783
783
  # ==========================================================
784
784
 
785
- # Side-effects: <list brief Then side-effects to verify>
785
+ # Side-effects: <liệt ngắn các Then side-effect cần verify>
786
786
  # @trace.scenario: {TICKET-ID}-UC{N}-SC1
787
787
  # @trace.sc_version: 1.0
788
788
  # @trace.business_rules: {TICKET-ID}-UC{N}-BR1
789
789
  @happy
790
- Scenario: <describe business outcome — use precise verb: create/receive/assign/block>
791
- Given <input state — alias from dataset>
790
+ Scenario: < tả business outcome — dùng động từ chính xác: create/receive/assign/block>
791
+ Given <input state — alias từ dataset>
792
792
  When <single action>
793
793
  Then <main observable outcome>
794
- And <side-effect 1 declared in header>
794
+ And <side-effect 1 khai báo trong header>
795
795
 
796
796
  # Side-effects: <...>
797
797
  # @trace.scenario: {TICKET-ID}-UC{N}-SC2
798
798
  # @trace.sc_version: 1.0
799
799
  # @trace.business_rules: {TICKET-ID}-UC{N}-BR1
800
800
  @happy @alternative
801
- Scenario: <same NHÓM 1 theme but different path e.g., different enum value>
801
+ Scenario: <cùng theme NHÓM 1 nhưng path khácvd: giá trị enum khác>
802
802
  Given <state>
803
803
  When <action>
804
804
  Then <outcome>
@@ -812,149 +812,149 @@ Feature: <Feature name>
812
812
  # @trace.sc_version: 1.0
813
813
  # @trace.business_rules: {TICKET-ID}-UC{N}-BR2
814
814
  @edge
815
- Scenario: <boundary / error scenario>
815
+ Scenario: <scenario boundary / error>
816
816
  Given <state>
817
817
  When <action>
818
818
  Then <expected error handling>
819
819
  ```
820
820
 
821
- ### Coverage Matrix & Pre-merge Checklist *(appended to end of each file)*
821
+ ### Coverage Matrix & Pre-merge Checklist *(thêm vào cuối mỗi file)*
822
822
 
823
823
  ```gherkin
824
824
  # === PRD COVERAGE (C.1 + C.2) ===
825
825
  # AC mapping:
826
826
  # AC1 (...) → SC1, SC2
827
827
  # AC2 (...) → SC3
828
- # BR mapping (each bullet MUST have ≥1 SC — C.2):
828
+ # BR mapping (mỗi bullet PHẢI ≥1 SC — C.2):
829
829
  # {TICKET-ID}-UC{N}-BR1 (...) → SC1, SC2
830
830
  # {TICKET-ID}-UC{N}-BR2 (...) → SC3
831
- # Wireframe mapping (every component/action ≥1 SC — C.1):
831
+ # Wireframe mapping (mỗi component/action ≥1 SC — C.1):
832
832
  # Screen "<screen name>":
833
833
  # [x] <action 1> → SC1
834
834
  # [x] <action 2> → SC2
835
835
  # [ ] <action 3> → MISSING ← BLOCK MERGE
836
836
 
837
837
  # === PRE-MERGE CHECKLIST ===
838
- # - [ ] Every SC has Side-effects + @trace.scenario + @trace.sc_version + @trace.business_rules
839
- # - [ ] Coverage Matrix: 0 MISSING lines (C.1)
840
- # - [ ] Every AC/BR maps to ≥1 SC (C.2)
841
- # - [ ] 0 banned terms (C.4) — grep file before merging
842
- # - [ ] Feature ≥3 SCs has NHÓM grouping by business theme (C.5)
843
- # - [ ] If popup/modal: Popup/Modal Lifecycle declared in BUSINESS DEFINITION
844
- # - [ ] If display logic ≥2 dimensions: Display Logic Matrix in BUSINESS DEFINITION
838
+ # - [ ] Mỗi SC Side-effects + @trace.scenario + @trace.sc_version + @trace.business_rules
839
+ # - [ ] Coverage Matrix: 0 dòng MISSING (C.1)
840
+ # - [ ] Mỗi AC/BR map tới ≥1 SC (C.2)
841
+ # - [ ] 0 banned term (C.4) — grep file trước khi merge
842
+ # - [ ] Feature ≥3 SC NHÓM grouping theo business theme (C.5)
843
+ # - [ ] Nếu popup/modal: khai báo Popup/Modal Lifecycle trong BUSINESS DEFINITION
844
+ # - [ ] Nếu display logic ≥2 chiều: Display Logic Matrix trong BUSINESS DEFINITION
845
845
  ```
846
846
 
847
847
  ---
848
848
 
849
849
  ## Write Trace State
850
850
 
851
- After generating all `.feature` files, create or update `{paths.trace_dir}/{domain}/{prd-slug}/{UC-ID}.tsv` for each UC.
851
+ Sau khi sinh tất cả file `.feature`, tạo hoặc cập nhật `{paths.trace_dir}/{domain}/{prd-slug}/{UC-ID}.tsv` cho mỗi UC.
852
852
 
853
- > **Umbrella + `spec_source`:** both the `.feature` files **and** the trace `.tsv` write to the **spec repo** (`{spec_source}/specs/{domain}/{prd-slug}/bdd/…` and `{spec_source}/.trace/{domain}/{prd-slug}/…`, resolved by context-loader) — a **single-repo** write, committed/pushed to the spec submodule. (Trace is consolidated in the spec repo so the PM manages all status in one place; code-side commands update it cross-repo later.)
853
+ > **Umbrella + `spec_source`:** cả file `.feature` **và** trace `.tsv` đều ghi vào **spec repo** (`{spec_source}/specs/{domain}/{prd-slug}/bdd/…` `{spec_source}/.trace/{domain}/{prd-slug}/…`, do context-loader phân giải) — một thao tác ghi **single-repo**, commit/push vào spec submodule. (Trace được gộp trong spec repo để PM quản mọi status một chỗ; các lệnh phía code cập nhật liên-repo sau.)
854
854
 
855
- **TSV columns (tab-separated, one header row + one data row per scenario):**
855
+ **Cột TSV (tab-separated, một header row + một data row cho mỗi scenario):**
856
856
  ```
857
857
  sc_id\tsc_title\tspec_ver\tgen_ver\timplemented_by\ttest_count\ttest_classes\tdev_selftest\tdev_selftest_at\tqc_status\tqc_run_at\tqc_owner\tqc_blocked_by\tprd_version\tbdd_version\ttech_doc_revision\tfe_tech_doc_revision\tprd_status\tuc_status\tfe_phase\tstatus\tlast_updated
858
858
  ```
859
859
 
860
860
  **Rules:**
861
- - If file does not existcreate with header row + all scenario rows.
862
- - If file exists (re-generation) → for each SC in the new `.feature`:
863
- - SC already in `.tsv` AND `spec_ver` is unchangedupdate only: `sc_title`, `prd_version`, `bdd_version`, `prd_status`, `uc_status`, `last_updated`. Leave all other columns unchanged.
864
- - SC already in `.tsv` AND `spec_ver` changed (scenario was modified) → update: `sc_title`, `spec_ver`, `prd_version`, `bdd_version`, `prd_status`, `uc_status`, `last_updated` AND set `status = DRIFT` immediately (so the TSV reflects drift without waiting for `/validate-traces`). Leave `gen_ver`, `implemented_by`, `test_count`, `test_classes`, `tech_doc_revision`, `fe_tech_doc_revision` unchanged.
865
- - SC is new (added in this re-gen) → append new row with `gen_ver`, `implemented_by`, `test_count`, `test_classes`, `dev_selftest`, `dev_selftest_at`, `qc_status`, `qc_run_at`, `qc_owner`, `qc_blocked_by`, `tech_doc_revision`, `fe_tech_doc_revision` all set to `—`.
866
- - SC no longer in `.feature` (removed) → delete its row.
861
+ - Nếu file chưa tồn tạitạo với header row + tất cả scenario row.
862
+ - Nếu file tồn tại (gen lại) → với mỗi SC trong `.feature` mới:
863
+ - SC đã trong `.tsv` `spec_ver` không đổichỉ cập nhật: `sc_title`, `prd_version`, `bdd_version`, `prd_status`, `uc_status`, `last_updated`. Giữ nguyên các cột khác.
864
+ - SC đã trong `.tsv` `spec_ver` đổi (scenario bị sửa) → cập nhật: `sc_title`, `spec_ver`, `prd_version`, `bdd_version`, `prd_status`, `uc_status`, `last_updated` set `status = DRIFT` ngay (để TSV phản ánh drift không cần đợi `/validate-traces`). Giữ nguyên `gen_ver`, `implemented_by`, `test_count`, `test_classes`, `tech_doc_revision`, `fe_tech_doc_revision`.
865
+ - SC mới (thêm trong lần gen lại này) → append row mới với `gen_ver`, `implemented_by`, `test_count`, `test_classes`, `dev_selftest`, `dev_selftest_at`, `qc_status`, `qc_run_at`, `qc_owner`, `qc_blocked_by`, `tech_doc_revision`, `fe_tech_doc_revision` đều set `—`.
866
+ - SC không còn trong `.feature` (bị xoá) → xoá row của nó.
867
867
 
868
- **Values to write for each scenario:**
868
+ **Giá trị ghi cho mỗi scenario:**
869
869
 
870
- | Column | Value |
870
+ | Cột | Giá trị |
871
871
  |--------|-------|
872
872
  | `sc_id` | `{UC-ID}-SC{N}` |
873
- | `sc_title` | scenario title text |
874
- | `spec_ver` | `@trace.sc_version` of this scenario |
875
- | `gen_ver` | `—` (not yet generated) |
873
+ | `sc_title` | text title của scenario |
874
+ | `spec_ver` | `@trace.sc_version` của scenario này |
875
+ | `gen_ver` | `—` (chưa gen) |
876
876
  | `implemented_by` | `—` |
877
877
  | `test_count` | `—` |
878
878
  | `test_classes` | `—` |
879
- | `dev_selftest` | `—` (no tests run yet) |
879
+ | `dev_selftest` | `—` (chưa chạy test) |
880
880
  | `dev_selftest_at` | `—` |
881
- | `qc_status` | `—` (official QC automation result — set by `/qc-run-test`) |
881
+ | `qc_status` | `—` (kết quả QC automation chính thức — set bởi `/qc-run-test`) |
882
882
  | `qc_run_at` | `—` |
883
- | `qc_owner` | `—` (who a non-passing SC waits on: `dev` / `po` — set by `/qc-run-test` + `/report-bug`) |
884
- | `qc_blocked_by` | `—` (linked `BUG-{id}` / `GAP-{id}` — set by `/qc-run-test` + `/report-bug`) |
885
- | `prd_version` | `@trace.prd_version` from `.feature` header |
886
- | `bdd_version` | `@trace.bdd_version` from `.feature` header |
887
- | `tech_doc_revision` | `—` (BE API contract revision — set by `/generate-code` + `/review-tech-docs`) |
888
- | `fe_tech_doc_revision` | `—` (FE client tech-design revision `{UC-ID}-tech-design-{platform}.md` — set by `/generate-code --phase=integration` + `/review-tech-docs` on an FE doc) |
889
- | `prd_status` | read `\| **Status** \|` from PRD metadata |
890
- | `uc_status` | `draft` for new UCs; keep existing value for re-gen |
891
- | `fe_phase` | `—` (set by `/generate-code --phase` when FE implements) |
883
+ | `qc_owner` | `—` (SC chưa pass đang chờ ai: `dev` / `po` — set bởi `/qc-run-test` + `/report-bug`) |
884
+ | `qc_blocked_by` | `—` (`BUG-{id}` / `GAP-{id}` liên kết — set bởi `/qc-run-test` + `/report-bug`) |
885
+ | `prd_version` | `@trace.prd_version` từ header `.feature` |
886
+ | `bdd_version` | `@trace.bdd_version` từ header `.feature` |
887
+ | `tech_doc_revision` | `—` (revision API contract BE — set bởi `/generate-code` + `/review-tech-docs`) |
888
+ | `fe_tech_doc_revision` | `—` (revision FE client tech-design `{UC-ID}-tech-design-{platform}.md` — set bởi `/generate-code --phase=integration` + `/review-tech-docs` trên doc FE) |
889
+ | `prd_status` | đọc `\| **Status** \|` từ metadata PRD |
890
+ | `uc_status` | `draft` cho UC mới; giữ giá trị hiện có khi gen lại |
891
+ | `fe_phase` | `—` (set bởi `/generate-code --phase` khi FE implement) |
892
892
  | `status` | `UNTRACKED` |
893
- | `last_updated` | today `YYYY-MM-DD` |
893
+ | `last_updated` | hôm nay `YYYY-MM-DD` |
894
894
 
895
895
  ## Refresh Panel Mirror
896
- # Refresh Living Docs panel mirror *(local, umbrella mode)*
896
+ # Làm mới panel mirror của Living Docs *(local, chế độ umbrella)*
897
897
 
898
- *Skip entirely in single-service mode (no `services` and no `setup.spec_source`) — there
899
- the repo's own `.trace/` IS the panel location, so nothing to mirror.*
898
+ *Bỏ qua hoàn toàn ở chế độ single-service (không `services` không `setup.spec_source`) — ở đó
899
+ `.trace/` của chính repo CHÍNH vị trí panel, nên không gì để mirror.*
900
900
 
901
- After updating the authoritative TSV(s) at `{paths.trace_dir}`:
901
+ Sau khi cập nhật TSV authoritative tại `{paths.trace_dir}`:
902
902
 
903
- **When `setup.spec_source` is set (consolidated trace — the common case):**
904
- `{paths.trace_dir}` resolves to `{spec_source}/.trace` — the single authoritative location.
905
- This command runs from `service_root`, so the write is **cross-repo into the spec submodule**;
906
- commit/push the spec submodule for the trace update (same as `feedback/`).
907
- 1. Resolve `panel_mirror = ./.trace` at the **current workspace root**.
908
- 2. If `panel_mirror` resolves to a different path than `{paths.trace_dir}`, copy each
909
- just-updated `{UC-ID}.tsv` → `{panel_mirror}/{UC-ID}.tsv` (create the dir; overwrite).
910
- No per-service namespacing there is one trace set; the owning service is carried in each
911
- row's `@trace.service`.
903
+ **Khi `setup.spec_source` được đặt (trace gộp trường hợp phổ biến):**
904
+ `{paths.trace_dir}` phân giải về `{spec_source}/.trace` — vị trí authoritative duy nhất.
905
+ Lệnh này chạy từ `service_root`, nên thao tác ghi **liên-repo vào spec submodule**;
906
+ commit/push spec submodule cho lần cập nhật trace (giống như `feedback/`).
907
+ 1. Phân giải `panel_mirror = ./.trace` tại **gốc workspace hiện tại**.
908
+ 2. Nếu `panel_mirror` phân giải ra path khác với `{paths.trace_dir}`, copy mỗi
909
+ `{UC-ID}.tsv` vừa cập nhật → `{panel_mirror}/{UC-ID}.tsv` (tạo thư mục; ghi đè).
910
+ Không namespace theo service — chỉ một bộ trace; service sở hữu được mang trong
911
+ `@trace.service` của từng row.
912
912
 
913
- **Legacy (no `spec_source` — per-service trace):**
914
- Copy each just-updated `{UC-ID}.tsv` → `{panel_mirror}/{service-name}/{UC-ID}.tsv`
915
- (namespaced by `active_service`).
913
+ **Legacy (không `spec_source` — trace theo service):**
914
+ Copy mỗi `{UC-ID}.tsv` vừa cập nhật → `{panel_mirror}/{service-name}/{UC-ID}.tsv`
915
+ (namespace theo `active_service`).
916
916
 
917
- This keeps the open workspace's Living Docs panel current **between syncs** — it is a
918
- **local convenience mirror only**. The merged `trace-report.json` (canonical, in
919
- `{spec_source}/.living-docs/`) is rebuilt by `/sync` or `/validate-traces`. For orchestrated
920
- commands, do this once in the orchestrator after all sub-agents returnnot inside each
921
- sub-agent.
917
+ Cách này giữ panel Living Docs của workspace đang mở luôn mới **giữa các lần sync** — chỉ
918
+ một **mirror tiện lợi cục bộ**. File `trace-report.json` đã merge (canonical, trong
919
+ `{spec_source}/.living-docs/`) được build lại bởi `/sync` hoặc `/validate-traces`. Với các lệnh
920
+ được orchestrate, làm việc này một lần trong orchestrator sau khi tất cả sub-agent trả về không phải
921
+ bên trong từng sub-agent.
922
922
 
923
923
 
924
924
  ## Output
925
925
 
926
- # Report Footer — Standard Command Output Format
926
+ # Report Footer — Định dạng output chuẩn cho mọi lệnh
927
927
 
928
- Every command report must end with this standard footer section.
928
+ Mọi report của lệnh phải kết thúc bằng section footer chuẩn này.
929
929
 
930
930
  ## Status Badge
931
931
 
932
- Choose one based on outcome:
933
- - `✅ Complete` — all steps succeeded, no issues found
934
- - `❌ Failed` — command could not complete due to a blocking error
935
- - `⚠️ Warnings` — completed with non-blocking issues that should be reviewed
932
+ Chọn một theo kết quả:
933
+ - `✅ Complete` — mọi bước thành công, không vấn đề
934
+ - `❌ Failed` — lệnh không hoàn thành được do lỗi chặn
935
+ - `⚠️ Warnings` — hoàn thành nhưng vấn đề không chặn, nên review lại
936
936
 
937
937
  ## Output Artifacts
938
938
 
939
- List every file created or modified by this command:
939
+ Liệt mọi file được tạo hoặc sửa bởi lệnh này:
940
940
  ```
941
941
  Output Artifacts:
942
- {created|updated} {file-path} ({brief description})
943
- {created|updated} {file-path} ({brief description})
942
+ {created|updated} {file-path} ({ tả ngắn})
943
+ {created|updated} {file-path} ({ tả ngắn})
944
944
  ```
945
945
 
946
- If no files were written (e.g., review or analysis commands) → write `Output Artifacts: none (read-only)`.
946
+ Nếu không ghi file nào (vd: lệnh review hoặc phân tích) → ghi `Output Artifacts: none (read-only)`.
947
947
 
948
948
  ## Pipeline Position
949
949
 
950
- Print a one-line map of the pipeline with the CURRENT command's phase marked `◀ bạn ở đây`,
951
- so the user always sees where this command sits in the end-to-end flow:
950
+ 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`,
951
+ để người dùng luôn thấy lệnh này nằm đâu trong luồng end-to-end:
952
952
 
953
953
  ```
954
954
  Discovery → PRD → [Design Spec] → BDD → Tech Design → Code → Dev Self-Check → QC → Trace Audit
955
955
  ```
956
956
 
957
- Find the current command in this phase legend and mark **its** phase in the map above:
957
+ 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:
958
958
 
959
959
  | Phase | Commands |
960
960
  |-------|----------|
@@ -968,65 +968,65 @@ Find the current command in this phase legend and mark **its** phase in the map
968
968
  | QC | `/qc-analyze` · `/qc-plan` · `/qc-design-test` · `/qc-review` · `/qc-run-test` · `/qc-report` |
969
969
  | Trace Audit | `/validate-traces` |
970
970
 
971
- For a **review command**, also append the 3-step review loop with the current step marked, e.g.:
971
+ Với **lệnh review**, thêm vòng review 3 bước đánh dấu bước hiện tại, vd:
972
972
  `Vòng review: [① phân tích ◀] → ② Review Board → ③ --resume`.
973
973
 
974
- **Cross-cutting commands** (`/sync`, `/update-framework`, `/fix-bug`, `/debug`, `/learn`,
975
- `/report-bug`, `/propose-scenario`, `/generate-spec-manifest`) sit outside the linear pipeline
976
- **omit the Pipeline line entirely** for these (do not force-fit them onto the map).
974
+ **Lệnh xuyên suốt** (`/sync`, `/update-framework`, `/fix-bug`, `/debug`, `/learn`,
975
+ `/report-bug`, `/propose-scenario`, `/generate-spec-manifest`) nằm ngoài pipeline tuyến tính
976
+ **bỏ hẳn dòng Pipeline** cho các lệnh này (đừng cố nhét chúng vào đồ).
977
977
 
978
- ## Next Command Suggestion
978
+ ## Gợi ý lệnh tiếp theo
979
979
 
980
- Suggest the logical next command based on workflow phase:
980
+ Gợi ý lệnh kế tiếp hợp theo phase của workflow:
981
981
 
982
- | Current command | Suggest next |
982
+ | Lệnh hiện tại | Gợi ý lệnh tiếp theo |
983
983
  |-------------------------|-----------------------------------------------|
984
- | /setup-ai-first | `/define-product` to start your first feature |
984
+ | /setup-ai-first | `/define-product` để bắt đầu feature đầu tiên |
985
985
  | /define-product | `/generate-prd {product-definition-file}` |
986
- | /generate-prd | `/refine-prd {prd-file}` then `/review-context {prd-file}` |
987
- | /refine-prd | Open Review Board → update PRD → `/review-context {prd-file}` |
988
- | /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 |
989
- | /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
990
- | /generate-bdd | `/review-context {feature-file}` to verify coverage |
991
- | /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
992
- | /qc-analyze | `/qc-plan {UC-ID}` (resolve 🔴 blocker gaps first) |
986
+ | /generate-prd | `/refine-prd {prd-file}` rồi `/review-context {prd-file}` |
987
+ | /refine-prd | Mở Review Board → cập nhật PRD → `/review-context {prd-file}` |
988
+ | /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 |
989
+ | /generate-design-spec | Designer review → xác nhận link Figma → PO + Designer sign-off → `/generate-bdd {prd-file}` |
990
+ | /generate-bdd | `/review-context {feature-file}` để kiểm tra độ phủ |
991
+ | /review-context (BDD) | `/generate-tech-docs {UC-ID}` nếu APPROVED; sinh lại nếu NEEDS_FIX |
992
+ | /qc-analyze | `/qc-plan {UC-ID}` (xử các gap blocker 🔴 trước) |
993
993
  | /qc-plan | `/qc-design-test {UC-ID}` |
994
- | /qc-design-test | `/qc-review {UC-ID}` (test-case review) |
995
- | /qc-review (test-case) | `/qc-run-test {UC-ID}` if APPROVED; fix TCs if NEEDS_FIX |
996
- | /qc-run-test | `/qc-report {UC-ID}` then `/qc-review {UC-ID}` (script review) |
997
- | /qc-review (script) | `/qc-report {UC-ID}` then create PR if APPROVED |
998
- | /qc-report | `/validate-traces {UC-ID}` to refresh Living Docs (qc_status) |
994
+ | /qc-design-test | `/qc-review {UC-ID}` (review test-case) |
995
+ | /qc-review (test-case) | `/qc-run-test {UC-ID}` nếu APPROVED; sửa TC nếu NEEDS_FIX |
996
+ | /qc-run-test | `/qc-report {UC-ID}` rồi `/qc-review {UC-ID}` (review script) |
997
+ | /qc-review (script) | `/qc-report {UC-ID}` rồi tạo PR nếu APPROVED |
998
+ | /qc-report | `/validate-traces {UC-ID}` để làm mới Living Docs (qc_status) |
999
999
  | /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
1000
- | /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
1001
- | /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/dev-gen-test {UC-ID}` |
1000
+ | /review-tech-docs | `/generate-code {feature-file}` nếu APPROVED; sửa doc nếu NEEDS_FIX |
1001
+ | /generate-code | Lần gen đầu → `/review-code {UC-ID}`; gen lại → `/dev-gen-test {UC-ID}` |
1002
1002
  | /dev-gen-test | `/dev-run-test {UC-ID}` |
1003
1003
  | /dev-run-test (passing) | `/review-code {UC-ID}` |
1004
- | /dev-run-test (failing) | `/fix-bug {ticket-id}` or `/debug {error}` |
1005
- | /review-code | `/dev-smoke-test {UC-ID}` or create PR |
1006
- | /dev-smoke-test | Create PR and link to ticket |
1007
- | /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/dev-gen-test {UC-ID}`; all OK → create PR |
1008
- | /fix-bug | Create PR and link to ticket |
1009
- | /debug | `/fix-bug {ticket-id}` if fix needed |
1010
- | /report-bug | Send to dev (`/fix-bug {BUG-ID}`); if coverage gap → `/propose-scenario {UC-ID}` |
1011
- | /propose-scenario | Notify PO/Dev to review the proposal in `feedback/bdd-proposals/` |
1012
- | /learn | Continue working — lesson applies on next command |
1013
- | /sync | `/validate-traces` for full coverage; act on any `📥 tester feedback` surfaced |
1014
- | /update-framework | Review `git diff .agent/`, commit; `/sync` for project content |
1015
-
1016
- Format the footer as:
1004
+ | /dev-run-test (failing) | `/fix-bug {ticket-id}` hoặc `/debug {error}` |
1005
+ | /review-code | `/dev-smoke-test {UC-ID}` hoặc tạo PR |
1006
+ | /dev-smoke-test | Tạo PR link tới ticket |
1007
+ | /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/dev-gen-test {UC-ID}`; tất cả OK → tạo PR |
1008
+ | /fix-bug | Tạo PR link tới ticket |
1009
+ | /debug | `/fix-bug {ticket-id}` nếu cần sửa |
1010
+ | /report-bug | Gửi cho dev (`/fix-bug {BUG-ID}`); nếu thiếu coverage → `/propose-scenario {UC-ID}` |
1011
+ | /propose-scenario | Báo PO/Dev review proposal trong `feedback/bdd-proposals/` |
1012
+ | /learn | Tiếp tục làm việc — lesson áp dụng lệnh kế tiếp |
1013
+ | /sync | `/validate-traces` để xem độ phủ đầy đủ; xử lý mọi `📥 tester feedback` được nêu |
1014
+ | /update-framework | Review `git diff .agent/`, commit; `/sync` để đồng bộ nội dung dự án |
1015
+
1016
+ Định dạng footer như sau:
1017
1017
  ```
1018
1018
  ---
1019
1019
  Status : {badge}
1020
- {Output Artifacts block}
1020
+ {khối Output Artifacts}
1021
1021
  Pipeline : Discovery → PRD → [BDD ◀ bạn ở đây] → Tech Design → Code → Dev Self-Check → QC → Trace Audit
1022
- (review cmd) Vòng review: [① phân tích ◀] → ② Review Board → ③ --resume
1023
- Next : {suggested command with example arguments}
1022
+ (lệnh review) Vòng review: [① phân tích ◀] → ② Review Board → ③ --resume
1023
+ Next : {lệnh gợi ý kèm ví dụ tham số}
1024
1024
  ```
1025
- *(Omit the `Pipeline` line for cross-cutting commands listed above.)*
1025
+ *(Bỏ dòng `Pipeline` cho các lệnh xuyên suốt liệt kê ở trên.)*
1026
1026
 
1027
1027
 
1028
1028
  ```
1029
- /generate-bdd Complete
1029
+ /generate-bdd Hoàn tất
1030
1030
 
1031
1031
  [Spec repo mode — platform: {active_platform}]
1032
1032
  Files:
@@ -1036,9 +1036,9 @@ Trace:
1036
1036
  {paths.trace_dir}/{domain}/{prd-slug}/{TICKET-ID}-UC1.tsv ({N} rows)
1037
1037
  {paths.trace_dir}/{domain}/{prd-slug}/{TICKET-ID}-UC2.tsv ({N} rows)
1038
1038
  Next (spec repo):
1039
- Run /generate-bdd again for other platforms (web → app → system)
1040
- After all platforms generated: commit + push + notify dev team
1041
- Dev team reads BDD from spec submodule — no /generate-bdd on their side
1039
+ Chạy /generate-bdd lại cho các platform khác (web → app → system)
1040
+ Sau khi gen hết platform: commit + push + báo team dev
1041
+ Team dev đọc BDD từ spec submodule — không chạy /generate-bdd phía họ
1042
1042
 
1043
1043
  [Umbrella mode — service: {active_service}]
1044
1044
  Files:
@@ -1046,9 +1046,9 @@ Files:
1046
1046
  Trace:
1047
1047
  {paths.trace_dir}/{domain}/{prd-slug}/{TICKET-ID}-UC1.tsv ({N} rows)
1048
1048
  Next (umbrella):
1049
- → /review-context {feature-file} to verify coverage
1049
+ → /review-context {feature-file} để kiểm tra coverage
1050
1050
  → /generate-tech-docs {feature-file}
1051
1051
  → /generate-code {feature-file}
1052
1052
 
1053
- 📊 Living Docs: run /validate-traces (or /sync) to push this trace to the spec-module dashboard.
1053
+ 📊 Living Docs: chạy /validate-traces (hoặc /sync) để push trace này lên dashboard spec-module.
1054
1054
  ```