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

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 (115) hide show
  1. package/bin/index.js +12 -1
  2. package/commands/debug.md +5 -5
  3. package/commands/define-product.md +38 -36
  4. package/commands/define-product.tmpl +33 -31
  5. package/commands/dev-gen-test.md +5 -5
  6. package/commands/dev-run-test.md +5 -5
  7. package/commands/dev-smoke-test.md +5 -5
  8. package/commands/fix-bug.md +5 -5
  9. package/commands/generate-bdd.md +5 -5
  10. package/commands/generate-code.md +5 -5
  11. package/commands/generate-design-spec.md +7 -7
  12. package/commands/generate-design-spec.tmpl +2 -2
  13. package/commands/generate-prd.md +23 -17
  14. package/commands/generate-prd.tmpl +13 -8
  15. package/commands/generate-spec-manifest.md +7 -7
  16. package/commands/generate-spec-manifest.tmpl +2 -2
  17. package/commands/generate-tech-docs.md +5 -5
  18. package/commands/learn.md +5 -5
  19. package/commands/map-testids.md +5 -5
  20. package/commands/propose-scenario.md +5 -5
  21. package/commands/qc-analyze.md +6 -6
  22. package/commands/qc-analyze.tmpl +1 -1
  23. package/commands/qc-design-test.md +5 -5
  24. package/commands/qc-plan.md +5 -5
  25. package/commands/qc-report.md +5 -5
  26. package/commands/qc-review.md +5 -5
  27. package/commands/qc-run-test.md +5 -5
  28. package/commands/refine-prd.md +8 -8
  29. package/commands/refine-prd.tmpl +3 -3
  30. package/commands/report-bug.md +5 -5
  31. package/commands/review-code.md +5 -5
  32. package/commands/review-context.md +9 -9
  33. package/commands/review-context.tmpl +4 -4
  34. package/commands/review-tech-docs.md +5 -5
  35. package/commands/setup-ai-first.md +5 -5
  36. package/commands/setup-ai-first.tmpl +3 -3
  37. package/commands/sync.md +1 -1
  38. package/commands/sync.tmpl +1 -1
  39. package/commands/validate-traces.md +7 -7
  40. package/commands/validate-traces.tmpl +2 -2
  41. package/core/FRAMEWORK_VERSION +1 -1
  42. package/core/commands/debug.md +5 -5
  43. package/core/commands/define-product.md +38 -36
  44. package/core/commands/dev-gen-test.md +5 -5
  45. package/core/commands/dev-run-test.md +5 -5
  46. package/core/commands/dev-smoke-test.md +5 -5
  47. package/core/commands/fix-bug.md +5 -5
  48. package/core/commands/generate-bdd.md +5 -5
  49. package/core/commands/generate-code.md +5 -5
  50. package/core/commands/generate-design-spec.md +7 -7
  51. package/core/commands/generate-prd.md +23 -17
  52. package/core/commands/generate-spec-manifest.md +7 -7
  53. package/core/commands/generate-tech-docs.md +5 -5
  54. package/core/commands/learn.md +5 -5
  55. package/core/commands/map-testids.md +5 -5
  56. package/core/commands/propose-scenario.md +5 -5
  57. package/core/commands/qc-analyze.md +6 -6
  58. package/core/commands/qc-design-test.md +5 -5
  59. package/core/commands/qc-plan.md +5 -5
  60. package/core/commands/qc-report.md +5 -5
  61. package/core/commands/qc-review.md +5 -5
  62. package/core/commands/qc-run-test.md +5 -5
  63. package/core/commands/refine-prd.md +8 -8
  64. package/core/commands/report-bug.md +5 -5
  65. package/core/commands/review-code.md +5 -5
  66. package/core/commands/review-context.md +9 -9
  67. package/core/commands/review-tech-docs.md +5 -5
  68. package/core/commands/setup-ai-first.md +5 -5
  69. package/core/commands/sync.md +1 -1
  70. package/core/commands/validate-traces.md +7 -7
  71. package/core/skills/code/SKILL.md +5 -5
  72. package/core/skills/debug/SKILL.md +3 -3
  73. package/core/skills/design-spec/SKILL.md +6 -6
  74. package/core/skills/prd/SKILL.md +9 -8
  75. package/core/skills/setup-ai-first/SKILL.md +1 -1
  76. package/core/skills/spec/SKILL.md +4 -4
  77. package/core/skills/test/SKILL.md +8 -8
  78. package/core/steps/context-loader.md +3 -3
  79. package/core/steps/gate.md +2 -2
  80. package/core/templates/prd.template.md +5 -4
  81. package/core/templates/project-context.yaml +2 -2
  82. package/docs/01-getting-started/core-concepts.md +1 -1
  83. package/docs/01-getting-started/quickstart.md +7 -7
  84. package/docs/02-guides/developer/bdd-and-trace.md +1 -1
  85. package/docs/02-guides/developer/scenarios.md +5 -5
  86. package/docs/02-guides/product-owner/handoff-checklist.md +1 -1
  87. package/docs/02-guides/product-owner/scenarios.md +23 -23
  88. package/docs/02-guides/tester/bug-reporting.md +2 -2
  89. package/docs/02-guides/tester/reading-specs.md +2 -2
  90. package/docs/02-guides/tester/scenarios.md +1 -1
  91. package/docs/02-guides/tester/spec-manifest.md +3 -3
  92. package/docs/02-guides/tester/workflow.md +1 -1
  93. package/docs/03-concepts/architecture.md +3 -3
  94. package/docs/03-concepts/pipeline.md +3 -3
  95. package/docs/04-operations/sync-and-update.md +5 -5
  96. package/docs/05-reference/command-cheatsheet.md +2 -2
  97. package/docs/05-reference/commands.md +8 -8
  98. package/package.json +1 -1
  99. package/scripts/migrate-specs.js +5 -3
  100. package/scripts/rename-prd-files.js +174 -0
  101. package/skills/code/SKILL.md +5 -5
  102. package/skills/debug/SKILL.md +3 -3
  103. package/skills/design-spec/SKILL.md +6 -6
  104. package/skills/design-spec/SKILL.tmpl +1 -1
  105. package/skills/prd/SKILL.md +9 -8
  106. package/skills/prd/SKILL.tmpl +2 -2
  107. package/skills/setup-ai-first/SKILL.md +1 -1
  108. package/skills/setup-ai-first/SKILL.tmpl +1 -1
  109. package/skills/spec/SKILL.md +4 -4
  110. package/skills/spec/SKILL.tmpl +2 -2
  111. package/skills/test/SKILL.md +8 -8
  112. package/steps/context-loader.md +3 -3
  113. package/steps/gate.md +2 -2
  114. package/templates/prd.template.md +5 -4
  115. package/templates/project-context.yaml +2 -2
package/bin/index.js CHANGED
@@ -11,6 +11,7 @@ const VERSION = pkg.version;
11
11
 
12
12
  const args = process.argv.slice(2);
13
13
  const isMigrateSpecs = args.includes('--migrate-specs');
14
+ const isRenamePrd = args.includes('--rename-prd-files');
14
15
  const isInit = args.includes('--init');
15
16
  const isProject = args.includes('--project');
16
17
  const installHooks = args.includes('--hooks');
@@ -73,8 +74,12 @@ if (showHelp) {
73
74
  console.log('Maintenance:');
74
75
  console.log(' --migrate-specs Migrate an existing project from the legacy artifact-type-first');
75
76
  console.log(' spec layout (specs/prd, specs/bdd, ...) to the feature-package');
76
- console.log(' layout (specs/{domain}/{prd-slug}/{prd.md,bdd/,tech-docs/,...}).');
77
+ console.log(' layout (specs/{domain}/{prd-slug}/{ {TICKET-ID}-{prd-slug}.md,bdd/,...}).');
77
78
  console.log(' DRY-RUN by default; add --apply to execute. Uses git mv when possible.');
79
+ console.log(' --rename-prd-files Rename feature-package PRD files from the old fixed name prd.md to the');
80
+ console.log(' {TICKET-ID}-{prd-slug}.md convention (e.g. SEG01-segment-scoring-service.md).');
81
+ console.log(' For projects already on the feature-package layout. DRY-RUN by default;');
82
+ console.log(' add --apply to execute. Uses git mv when possible.');
78
83
  console.log('');
79
84
  console.log('Options:');
80
85
  console.log(' --module <name> Copy stack module to .agent/modules/<name>/');
@@ -108,6 +113,12 @@ if (isMigrateSpecs) {
108
113
  return; // migrate-specs.js calls process.exit itself
109
114
  }
110
115
 
116
+ // ── --rename-prd-files: rename feature-package prd.md → {TICKET-ID}-{slug}.md ──
117
+ if (isRenamePrd) {
118
+ require(path.join(__dirname, '..', 'scripts', 'rename-prd-files.js'));
119
+ return; // rename-prd-files.js calls process.exit itself
120
+ }
121
+
111
122
  // ── Step 1: Build .tmpl → .md ─────────────────────────────────────────────
112
123
  const buildScript = path.join(__dirname, 'build.js');
113
124
  if (fs.existsSync(buildScript)) {
package/commands/debug.md CHANGED
@@ -57,13 +57,13 @@ Hiển thị và chờ phản hồi:
57
57
  1. Nếu `$ARGUMENTS` được cung cấp và trỏ tới một file tồn tại → dùng trực tiếp làm target.
58
58
  2. Nếu `$ARGUMENTS` là một **UC-ID / ticket ID / tên rút gọn** (không có 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 đó, và `**` đệ quy dưới `bdd/` để phủ hết các thư mục con theo platform (`bdd/web/`, `bdd/app/`, `bdd/system/`):
59
59
  - **Lệnh BDD** (target là `.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 đó.
60
- - **Lệnh PRD** (target là `prd.md`): `{specs_dir}/{domain}/*/prd.md` (khớp feature folder có id tương ứng), nếu không thì `{specs_dir}/*/*/prd.md`.
60
+ - **Lệnh PRD** (target là file PRD `{TICKET-ID}-{prd-slug}.md` — file `.md` duy nhất ở gốc feature folder, cạnh `bdd/`): `{specs_dir}/{domain}/*/{TICKET-ID}*.md` nếu biết TICKET-ID; nếu không, `{specs_dir}/{domain}/*/*.md` (khớp feature folder có id tương ứng), hoặc `{specs_dir}/*/*/*.md` nếu domain cũng chưa biết. *(Glob `*/*.md` ở cấp gốc folder chỉ khớp PRD — tech-docs/design-spec `.md` nằm sâu hơn trong thư mục con.)*
61
61
  - **Lệnh tech-docs**: `{specs_dir}/{domain}/*/tech-docs/{UC-ID}*-tech-design*.md`.
62
62
  - **Lệnh design-spec**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
63
63
 
64
64
  Khi một file khớp: đặt nó 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 mà 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.
65
65
  3. Nếu `$ARGUMENTS` rỗng hoặc không tìm thấy file khớp:
66
- - Liệt kê 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).
66
+ - Liệt kê các file trong thư mục liên quan của lệnh này (vd: `specs/*/*/*.md` — file PRD ở gốc mỗi feature folder — cho lệnh PRD, `specs/*/*/bdd/**/*.feature` cho lệnh BDD).
67
67
  - 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)"
68
68
  - Chờ người dùng chọn rồi mới tiếp tục.
69
69
 
@@ -131,7 +131,7 @@ Thực hiện các bước theo đúng thứ tự. Lưu mọi thứ vào bộ nh
131
131
  - `domains` → danh sách các business domain đang hoạt động
132
132
 
133
133
  **Paths (nếu có):**
134
- - `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/}`
134
+ - `paths.specs_dir` → gốc của spec artifact — PRD, BDD, tech-docs, design-spec. Cấu trúc: `{specs_dir}/{domain}/{prd-slug}/{ {TICKET-ID}-{prd-slug}.md | bdd/ | tech-docs/ | design-spec/}` (file PRD đặt tên `{TICKET-ID}-{prd-slug}.md`, là file `.md` duy nhất ở gốc feature folder)
135
135
  - `paths.refinement_dir` → thư mục output cho findings/review
136
136
  - `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}/`)
137
137
  - `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 đè)
@@ -157,7 +157,7 @@ Nếu không có section `paths`, dùng các giá trị mặc định:
157
157
  Lưu ý: Trong bố cục feature-package, `specs_dir` là 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` là tên folder feature-package, không phải một biến config riêng.
158
158
 
159
159
  **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, vì 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ụ:
160
- - `specs/payment/create-invoice/prd.md` → `prd_slug = create-invoice`
160
+ - `specs/payment/create-invoice/PAY01-create-invoice.md` → `prd_slug = create-invoice`
161
161
  - `specs/payment/create-invoice/bdd/system/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `system`)*
162
162
  - `specs/payment/create-invoice/bdd/web/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `web`)*
163
163
  - `specs/payment/create-invoice/tech-docs/PAY-UC1-tech-design.md` → `prd_slug = create-invoice` *(KHÔNG phải `tech-docs`)*
@@ -178,7 +178,7 @@ Nếu có section `services`:
178
178
  **1. Phát hiện active domain** (theo thứ tự ưu tiên):
179
179
  - Đọc `@trace.domain` từ frontmatter của target file (nếu Gate đã nạp một target file)
180
180
  - 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.
181
- *(vd: `specs/user/create-account/prd.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
181
+ *(vd: `specs/user/create-account/USR01-create-account.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
182
182
  - Nếu `$ARGUMENTS` chứa một path, trích xuất segment domain sau `specs_dir`
183
183
 
184
184
  **2. Route tới service** — nếu active domain khớp với một key trong `services`:
@@ -1,4 +1,4 @@
1
- # /define-product — Feature Discovery (Q&A 8 Phase)
1
+ # /define-product — Khám phá tính năng (Q&A 8 Phase)
2
2
 
3
3
  ## Gate
4
4
  # Gate — Quy trình vào chuẩn cho mọi lệnh
@@ -54,13 +54,13 @@ Hiển thị và chờ phản hồi:
54
54
  1. Nếu `$ARGUMENTS` được cung cấp và trỏ tới một file tồn tại → dùng trực tiếp làm target.
55
55
  2. Nếu `$ARGUMENTS` là một **UC-ID / ticket ID / tên rút gọn** (không có 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 đó, và `**` đệ quy dưới `bdd/` để phủ hết các thư mục con theo platform (`bdd/web/`, `bdd/app/`, `bdd/system/`):
56
56
  - **Lệnh BDD** (target là `.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 là `prd.md`): `{specs_dir}/{domain}/*/prd.md` (khớp feature folder có id tương ứng), nếu không thì `{specs_dir}/*/*/prd.md`.
57
+ - **Lệnh PRD** (target là file PRD `{TICKET-ID}-{prd-slug}.md` — file `.md` duy nhất ở gốc feature folder, cạnh `bdd/`): `{specs_dir}/{domain}/*/{TICKET-ID}*.md` nếu biết TICKET-ID; nếu không, `{specs_dir}/{domain}/*/*.md` (khớp feature folder có id tương ứng), hoặc `{specs_dir}/*/*/*.md` nếu domain cũng chưa biết. *(Glob `*/*.md` ở cấp gốc folder chỉ khớp PRD — tech-docs/design-spec `.md` nằm sâu hơn trong thư mục con.)*
58
58
  - **Lệnh tech-docs**: `{specs_dir}/{domain}/*/tech-docs/{UC-ID}*-tech-design*.md`.
59
59
  - **Lệnh design-spec**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
60
60
 
61
61
  Khi một file khớp: đặt nó 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 mà 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
62
  3. Nếu `$ARGUMENTS` rỗng hoặc không tìm thấy file khớp:
63
- - Liệt kê 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).
63
+ - Liệt kê các file trong thư mục liên quan của lệnh này (vd: `specs/*/*/*.md` — file PRD ở gốc mỗi feature folder — cho lệnh PRD, `specs/*/*/bdd/**/*.feature` cho lệnh BDD).
64
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
65
  - Chờ người dùng chọn rồi mới tiếp tục.
66
66
 
@@ -128,7 +128,7 @@ Thực hiện các bước theo đúng thứ tự. Lưu mọi thứ vào bộ nh
128
128
  - `domains` → danh sách các business domain đang hoạt động
129
129
 
130
130
  **Paths (nếu có):**
131
- - `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/}`
131
+ - `paths.specs_dir` → gốc của spec artifact — PRD, BDD, tech-docs, design-spec. Cấu trúc: `{specs_dir}/{domain}/{prd-slug}/{ {TICKET-ID}-{prd-slug}.md | bdd/ | tech-docs/ | design-spec/}` (file PRD đặt tên `{TICKET-ID}-{prd-slug}.md`, là file `.md` duy nhất ở gốc feature folder)
132
132
  - `paths.refinement_dir` → thư mục output cho findings/review
133
133
  - `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}/`)
134
134
  - `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 đè)
@@ -154,7 +154,7 @@ Nếu không có section `paths`, dùng các giá trị mặc định:
154
154
  Lưu ý: Trong bố cục feature-package, `specs_dir` là 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` là tên folder feature-package, không phải một biến config riêng.
155
155
 
156
156
  **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, vì 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ụ:
157
- - `specs/payment/create-invoice/prd.md` → `prd_slug = create-invoice`
157
+ - `specs/payment/create-invoice/PAY01-create-invoice.md` → `prd_slug = create-invoice`
158
158
  - `specs/payment/create-invoice/bdd/system/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `system`)*
159
159
  - `specs/payment/create-invoice/bdd/web/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `web`)*
160
160
  - `specs/payment/create-invoice/tech-docs/PAY-UC1-tech-design.md` → `prd_slug = create-invoice` *(KHÔNG phải `tech-docs`)*
@@ -175,7 +175,7 @@ Nếu có section `services`:
175
175
  **1. Phát hiện active domain** (theo thứ tự ưu tiên):
176
176
  - Đọc `@trace.domain` từ frontmatter của target file (nếu Gate đã nạp một target file)
177
177
  - 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.
178
- *(vd: `specs/user/create-account/prd.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
178
+ *(vd: `specs/user/create-account/USR01-create-account.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
179
179
  - Nếu `$ARGUMENTS` chứa một path, trích xuất segment domain sau `specs_dir`
180
180
 
181
181
  **2. Route tới service** — nếu active domain khớp với một key trong `services`:
@@ -414,12 +414,12 @@ AI quét dự án và ghi:
414
414
  - **Chuẩn hoá thuật ngữ** — map mọi thuật ngữ trong input PO về thuật ngữ chuẩn từ business-dictionary.md.
415
415
 
416
416
  ```
417
- | Term in PO input | Canonical term (business-dictionary) |
418
- |------------------|--------------------------------------|
419
- | {original} | {canonical} |
417
+ | Thuật ngữ trong input PO | Thuật ngữ chuẩn (business-dictionary) |
418
+ |--------------------------|---------------------------------------|
419
+ | {thuật ngữ gốc} | {thuật ngữ chuẩn} |
420
420
  ```
421
421
 
422
- Lưu bản đồ thuật ngữ này vào file product-definition output dưới section `## Terminology Map` — `/generate-prd` sẽ tham chiếu nó trong bước Terminology Rules để đảm bảo nhất quán.
422
+ Lưu bản đồ thuật ngữ này vào file product-definition output dưới section `### Chuẩn hoá thuật ngữ` (trong Phase 0) — `/generate-prd` sẽ tham chiếu nó trong bước **Quy tắc thuật ngữ** để đảm bảo nhất quán.
423
423
 
424
424
  ---
425
425
 
@@ -433,12 +433,10 @@ Hỏi **lần lượt từng câu một**, đợi PO trả lời rồi mới h
433
433
  4. **Actors**: Những ai sẽ dùng feature này? Liệt kê từng vai trò, và đánh dấu ai là người dùng chính (Primary), ai phụ (Secondary).
434
434
  5. **In Scope**: Feature này làm gì? (mỗi dòng một chức năng — chỉ những gì thuộc ticket này)
435
435
  6. **Out of Scope**: Cái gì KHÔNG làm trong ticket này? Ghi rõ kèm lý do hoặc để dành pha/ticket sau — để tránh phình phạm vi.
436
- 7. **User Story**: Xác nhận theo format:
437
- ```
438
- một (As a) {vai trò}
439
- Tôi muốn (I want to) {mục tiêu}
440
- Để (So that) {giá trị nghiệp vụ}
441
- ```
436
+ 7. **User Story**: Xác nhận theo format (mỗi ý một bullet):
437
+ - **Là một (As a)** {vai trò}
438
+ - **Tôi muốn (I want to)** {mục tiêu}
439
+ - **Để (So that)** {giá trị nghiệp vụ}
442
440
  8. **Phụ thuộc liên service**: Để chạy được, feature có cần **dữ liệu hay năng lực** gì từ feature/team khác không? Mô tả ở mức nghiệp vụ (cần gì, từ ai, vì sao) — chưa cần nói API hay kỹ thuật. Nếu không có → trả lời "Không có".
443
441
 
444
442
  Sau câu 8 → **tóm tắt lại toàn bộ** cho PO → chờ xác nhận → ghi `✅ PO xác nhận: Có` → sang Phase 2.
@@ -451,7 +449,7 @@ Hỏi:
451
449
  1. **Entry Point**: Người dùng bắt đầu tương tác với feature này ở đâu?
452
450
  2. **Flow Steps**: Mô tả từng bước (dùng bảng):
453
451
  ```
454
- | Step | Action (user) | Business State / Result | Notes |
452
+ | Bước | Hành động | Trạng thái/Kết quả nghiệp vụ | Ghi chú |
455
453
  ```
456
454
  3. **Exit Point**: Kết quả cuối khi flow hoàn thành là gì?
457
455
  4. **Edge Cases**: Các kịch bản thất bại nghiệp vụ ngoài happy path? (input thiếu, điều kiện không thoả, thao tác đồng thời, phụ thuộc không sẵn sàng → kết quả nghiệp vụ kỳ vọng)
@@ -462,21 +460,21 @@ Xác nhận → ghi `✅ PO xác nhận: Có` → tiếp tục.
462
460
 
463
461
  ## Phase 3 — Clarification Log *(CHECKPOINT 3)*
464
462
 
465
- Dựa trên Phase 1-2, AI xác định gap và hỏi các câu follow-up. Tiếp tục các vòng cho tới khi không còn Unresolved Items.
463
+ Dựa trên Phase 1-2, AI xác định gap và hỏi các câu follow-up. Tiếp tục các vòng cho tới khi không còn Mục chưa giải quyết.
466
464
 
467
465
  ```
468
- ### Round {N}
469
- | # | Category | Question | PO Answer |
466
+ ### Vòng {N}
467
+ | # | Nhóm | Câu hỏi | PO trả lời |
470
468
  |---|----------------|------------|------------|
471
- | 1 | Context/Flow/Logic | {question} | {answer} |
469
+ | 1 | Context/Flow/Logic | {câu hỏi} | {trả lời} |
472
470
  ```
473
471
 
474
- **BLOCK**: Nếu còn Unresolved Items → KHÔNG được sang Phase 4.
472
+ **BLOCK**: Nếu còn Mục chưa giải quyết → KHÔNG được sang Phase 4.
475
473
 
476
- ### Unresolved Items
477
- - {item — hoặc "None"}
474
+ ### Mục chưa giải quyết
475
+ - {mục — hoặc "None"}
478
476
 
479
- Khi mọi Unresolved Items đã giải quyết → ghi `✅ CHECKPOINT 3: No Unresolved Items` → sang Phase 4.
477
+ Khi mọi Mục chưa giải quyết đã xử lý → ghi `✅ CHECKPOINT 3: Không còn mục tồn đọng` → sang Phase 4.
480
478
 
481
479
  ---
482
480
 
@@ -485,9 +483,9 @@ Khi mọi Unresolved Items đã giải quyết → ghi `✅ CHECKPOINT 3: No Unr
485
483
  Suy ra từ Phase 1-3. Mỗi BR = một quy tắc (hệ thống PHẢI / KHÔNG được làm gì — WHAT):
486
484
 
487
485
  ```
488
- | Rule ID | Action / Trigger | Rule | Condition |
486
+ | Rule ID | Hành động/Trigger | Quy tắc | Điều kiện |
489
487
  |---------|---------------------|-------------------------------|---------------------|
490
- | BR-1 | {action from flow} | System MUST/MUST NOT... | {applicable condition} |
488
+ | BR-1 | {hành động từ flow} | System MUST/MUST NOT... | {điều kiện áp dụng} |
491
489
  ```
492
490
 
493
491
  Xác nhận → ghi `✅ PO xác nhận: Có` → tiếp tục.
@@ -513,9 +511,9 @@ Xác nhận → ghi `✅ PO xác nhận: Có` → tiếp tục.
513
511
  Suy ra từ BR + User Story. Mỗi AC phải testable (pass/fail rõ ràng):
514
512
 
515
513
  ```
516
- | AC ID | Description | Expected Behavior | Derived from |
517
- |-------|-------------------------|---------------------------|--------------|
518
- | AC-1 | {criterion description} | {what system should do} | BR-{N} |
514
+ | AC ID | Mô tả | Hành vi kỳ vọng | Bắt nguồn từ |
515
+ |-------|-------------------------|----------------------------|--------------|
516
+ | AC-1 | { tả tiêu chí} | {hành vi hệ thống cần làm} | BR-{N} |
519
517
  ```
520
518
 
521
519
  Xác nhận → ghi `✅ PO xác nhận: Có` → tiếp tục.
@@ -527,13 +525,13 @@ Xác nhận → ghi `✅ PO xác nhận: Có` → tiếp tục.
527
525
  Tự sinh ma trận độ phủ:
528
526
 
529
527
  ```
530
- | Flow Action | Has Rule? | Has Logic? | Has AC? | Status |
531
- |-------------|-----------|------------|---------|---------|
532
- | {Action 1} | ✅/❌ | ✅/❌ | ✅/❌ | OK/GAP |
528
+ | Hành động Flow | Rule? | Logic? | AC? | Status |
529
+ |----------------|----------|-----------|--------|--------|
530
+ | {Hành động 1} | ✅/❌ | ✅/❌ | ✅/❌ | OK/GAP |
533
531
  ```
534
532
 
535
- - **Conflicts Detected**: liệt kê các rule xung đột, hoặc "None".
536
- - **Missing Items**: liệt kê gap, hoặc "None".
533
+ - **Xung đột phát hiện**: liệt kê các rule xung đột, hoặc "None".
534
+ - **Mục còn thiếu**: liệt kê gap, hoặc "None".
537
535
 
538
536
  Nếu phát hiện GAP → cảnh báo PO và giải quyết trước khi đánh dấu completed.
539
537
 
@@ -544,7 +542,11 @@ Nếu phát hiện GAP → cảnh báo PO và giải quyết trước khi đánh
544
542
  Ghi `{paths.product_definitions_dir}/{TICKET-ID}-{slug}.md` theo `templates/product-definition.template.md`.
545
543
 
546
544
  Điền tất cả section bằng dữ liệu thu thập qua các phase.
547
- Đặt `Status: completed` khi Phase 7 pass mà không còn GAP.
545
+
546
+ **Cập nhật Metadata theo tiến độ (cho phép resume):**
547
+ - Sau mỗi CHECKPOINT phase được chốt (`✅ PO xác nhận: Có`, hoặc với Phase 3 là `✅ CHECKPOINT 3: Không còn mục tồn đọng`) → cập nhật `Completed Phase` = số phase vừa xong và giữ `Status: in-progress`.
548
+ - Khi Phase 7 pass mà không còn GAP → đặt `Completed Phase: 7` và `Status: completed`.
549
+ - Nếu discovery bị ngắt giữa chừng, file vẫn được ghi với `Completed Phase` phản ánh phase cao nhất đã xác nhận — buổi sau resume tiếp từ phase kế tiếp.
548
550
 
549
551
  # Report Footer — Định dạng output chuẩn cho mọi lệnh
550
552
 
@@ -1,4 +1,4 @@
1
- # /define-product — Feature Discovery (Q&A 8 Phase)
1
+ # /define-product — Khám phá tính năng (Q&A 8 Phase)
2
2
 
3
3
  ## Gate
4
4
  {{include:steps/gate.md}}
@@ -20,12 +20,12 @@ AI quét dự án và ghi:
20
20
  - **Chuẩn hoá thuật ngữ** — map mọi thuật ngữ trong input PO về thuật ngữ chuẩn từ business-dictionary.md.
21
21
 
22
22
  ```
23
- | Term in PO input | Canonical term (business-dictionary) |
24
- |------------------|--------------------------------------|
25
- | {original} | {canonical} |
23
+ | Thuật ngữ trong input PO | Thuật ngữ chuẩn (business-dictionary) |
24
+ |--------------------------|---------------------------------------|
25
+ | {thuật ngữ gốc} | {thuật ngữ chuẩn} |
26
26
  ```
27
27
 
28
- Lưu bản đồ thuật ngữ này vào file product-definition output dưới section `## Terminology Map` — `/generate-prd` sẽ tham chiếu nó trong bước Terminology Rules để đảm bảo nhất quán.
28
+ Lưu bản đồ thuật ngữ này vào file product-definition output dưới section `### Chuẩn hoá thuật ngữ` (trong Phase 0) — `/generate-prd` sẽ tham chiếu nó trong bước **Quy tắc thuật ngữ** để đảm bảo nhất quán.
29
29
 
30
30
  ---
31
31
 
@@ -39,12 +39,10 @@ Hỏi **lần lượt từng câu một**, đợi PO trả lời rồi mới h
39
39
  4. **Actors**: Những ai sẽ dùng feature này? Liệt kê từng vai trò, và đánh dấu ai là người dùng chính (Primary), ai phụ (Secondary).
40
40
  5. **In Scope**: Feature này làm gì? (mỗi dòng một chức năng — chỉ những gì thuộc ticket này)
41
41
  6. **Out of Scope**: Cái gì KHÔNG làm trong ticket này? Ghi rõ kèm lý do hoặc để dành pha/ticket sau — để tránh phình phạm vi.
42
- 7. **User Story**: Xác nhận theo format:
43
- ```
44
- một (As a) {vai trò}
45
- Tôi muốn (I want to) {mục tiêu}
46
- Để (So that) {giá trị nghiệp vụ}
47
- ```
42
+ 7. **User Story**: Xác nhận theo format (mỗi ý một bullet):
43
+ - **Là một (As a)** {vai trò}
44
+ - **Tôi muốn (I want to)** {mục tiêu}
45
+ - **Để (So that)** {giá trị nghiệp vụ}
48
46
  8. **Phụ thuộc liên service**: Để chạy được, feature có cần **dữ liệu hay năng lực** gì từ feature/team khác không? Mô tả ở mức nghiệp vụ (cần gì, từ ai, vì sao) — chưa cần nói API hay kỹ thuật. Nếu không có → trả lời "Không có".
49
47
 
50
48
  Sau câu 8 → **tóm tắt lại toàn bộ** cho PO → chờ xác nhận → ghi `✅ PO xác nhận: Có` → sang Phase 2.
@@ -57,7 +55,7 @@ Hỏi:
57
55
  1. **Entry Point**: Người dùng bắt đầu tương tác với feature này ở đâu?
58
56
  2. **Flow Steps**: Mô tả từng bước (dùng bảng):
59
57
  ```
60
- | Step | Action (user) | Business State / Result | Notes |
58
+ | Bước | Hành động | Trạng thái/Kết quả nghiệp vụ | Ghi chú |
61
59
  ```
62
60
  3. **Exit Point**: Kết quả cuối khi flow hoàn thành là gì?
63
61
  4. **Edge Cases**: Các kịch bản thất bại nghiệp vụ ngoài happy path? (input thiếu, điều kiện không thoả, thao tác đồng thời, phụ thuộc không sẵn sàng → kết quả nghiệp vụ kỳ vọng)
@@ -68,21 +66,21 @@ Xác nhận → ghi `✅ PO xác nhận: Có` → tiếp tục.
68
66
 
69
67
  ## Phase 3 — Clarification Log *(CHECKPOINT 3)*
70
68
 
71
- Dựa trên Phase 1-2, AI xác định gap và hỏi các câu follow-up. Tiếp tục các vòng cho tới khi không còn Unresolved Items.
69
+ Dựa trên Phase 1-2, AI xác định gap và hỏi các câu follow-up. Tiếp tục các vòng cho tới khi không còn Mục chưa giải quyết.
72
70
 
73
71
  ```
74
- ### Round {N}
75
- | # | Category | Question | PO Answer |
72
+ ### Vòng {N}
73
+ | # | Nhóm | Câu hỏi | PO trả lời |
76
74
  |---|----------------|------------|------------|
77
- | 1 | Context/Flow/Logic | {question} | {answer} |
75
+ | 1 | Context/Flow/Logic | {câu hỏi} | {trả lời} |
78
76
  ```
79
77
 
80
- **BLOCK**: Nếu còn Unresolved Items → KHÔNG được sang Phase 4.
78
+ **BLOCK**: Nếu còn Mục chưa giải quyết → KHÔNG được sang Phase 4.
81
79
 
82
- ### Unresolved Items
83
- - {item — hoặc "None"}
80
+ ### Mục chưa giải quyết
81
+ - {mục — hoặc "None"}
84
82
 
85
- Khi mọi Unresolved Items đã giải quyết → ghi `✅ CHECKPOINT 3: No Unresolved Items` → sang Phase 4.
83
+ Khi mọi Mục chưa giải quyết đã xử lý → ghi `✅ CHECKPOINT 3: Không còn mục tồn đọng` → sang Phase 4.
86
84
 
87
85
  ---
88
86
 
@@ -91,9 +89,9 @@ Khi mọi Unresolved Items đã giải quyết → ghi `✅ CHECKPOINT 3: No Unr
91
89
  Suy ra từ Phase 1-3. Mỗi BR = một quy tắc (hệ thống PHẢI / KHÔNG được làm gì — WHAT):
92
90
 
93
91
  ```
94
- | Rule ID | Action / Trigger | Rule | Condition |
92
+ | Rule ID | Hành động/Trigger | Quy tắc | Điều kiện |
95
93
  |---------|---------------------|-------------------------------|---------------------|
96
- | BR-1 | {action from flow} | System MUST/MUST NOT... | {applicable condition} |
94
+ | BR-1 | {hành động từ flow} | System MUST/MUST NOT... | {điều kiện áp dụng} |
97
95
  ```
98
96
 
99
97
  Xác nhận → ghi `✅ PO xác nhận: Có` → tiếp tục.
@@ -119,9 +117,9 @@ Xác nhận → ghi `✅ PO xác nhận: Có` → tiếp tục.
119
117
  Suy ra từ BR + User Story. Mỗi AC phải testable (pass/fail rõ ràng):
120
118
 
121
119
  ```
122
- | AC ID | Description | Expected Behavior | Derived from |
123
- |-------|-------------------------|---------------------------|--------------|
124
- | AC-1 | {criterion description} | {what system should do} | BR-{N} |
120
+ | AC ID | Mô tả | Hành vi kỳ vọng | Bắt nguồn từ |
121
+ |-------|-------------------------|----------------------------|--------------|
122
+ | AC-1 | { tả tiêu chí} | {hành vi hệ thống cần làm} | BR-{N} |
125
123
  ```
126
124
 
127
125
  Xác nhận → ghi `✅ PO xác nhận: Có` → tiếp tục.
@@ -133,13 +131,13 @@ Xác nhận → ghi `✅ PO xác nhận: Có` → tiếp tục.
133
131
  Tự sinh ma trận độ phủ:
134
132
 
135
133
  ```
136
- | Flow Action | Has Rule? | Has Logic? | Has AC? | Status |
137
- |-------------|-----------|------------|---------|---------|
138
- | {Action 1} | ✅/❌ | ✅/❌ | ✅/❌ | OK/GAP |
134
+ | Hành động Flow | Rule? | Logic? | AC? | Status |
135
+ |----------------|----------|-----------|--------|--------|
136
+ | {Hành động 1} | ✅/❌ | ✅/❌ | ✅/❌ | OK/GAP |
139
137
  ```
140
138
 
141
- - **Conflicts Detected**: liệt kê các rule xung đột, hoặc "None".
142
- - **Missing Items**: liệt kê gap, hoặc "None".
139
+ - **Xung đột phát hiện**: liệt kê các rule xung đột, hoặc "None".
140
+ - **Mục còn thiếu**: liệt kê gap, hoặc "None".
143
141
 
144
142
  Nếu phát hiện GAP → cảnh báo PO và giải quyết trước khi đánh dấu completed.
145
143
 
@@ -150,7 +148,11 @@ Nếu phát hiện GAP → cảnh báo PO và giải quyết trước khi đánh
150
148
  Ghi `{paths.product_definitions_dir}/{TICKET-ID}-{slug}.md` theo `templates/product-definition.template.md`.
151
149
 
152
150
  Điền tất cả section bằng dữ liệu thu thập qua các phase.
153
- Đặt `Status: completed` khi Phase 7 pass mà không còn GAP.
151
+
152
+ **Cập nhật Metadata theo tiến độ (cho phép resume):**
153
+ - Sau mỗi CHECKPOINT phase được chốt (`✅ PO xác nhận: Có`, hoặc với Phase 3 là `✅ CHECKPOINT 3: Không còn mục tồn đọng`) → cập nhật `Completed Phase` = số phase vừa xong và giữ `Status: in-progress`.
154
+ - Khi Phase 7 pass mà không còn GAP → đặt `Completed Phase: 7` và `Status: completed`.
155
+ - Nếu discovery bị ngắt giữa chừng, file vẫn được ghi với `Completed Phase` phản ánh phase cao nhất đã xác nhận — buổi sau resume tiếp từ phase kế tiếp.
154
156
 
155
157
  {{include:steps/report-footer.md}}
156
158
 
@@ -60,13 +60,13 @@ Hiển thị và chờ phản hồi:
60
60
  1. Nếu `$ARGUMENTS` được cung cấp và trỏ tới một file tồn tại → dùng trực tiếp làm target.
61
61
  2. Nếu `$ARGUMENTS` là một **UC-ID / ticket ID / tên rút gọn** (không có 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 đó, và `**` đệ quy dưới `bdd/` để phủ hết các thư mục con theo platform (`bdd/web/`, `bdd/app/`, `bdd/system/`):
62
62
  - **Lệnh BDD** (target là `.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 đó.
63
- - **Lệnh PRD** (target là `prd.md`): `{specs_dir}/{domain}/*/prd.md` (khớp feature folder có id tương ứng), nếu không thì `{specs_dir}/*/*/prd.md`.
63
+ - **Lệnh PRD** (target là file PRD `{TICKET-ID}-{prd-slug}.md` — file `.md` duy nhất ở gốc feature folder, cạnh `bdd/`): `{specs_dir}/{domain}/*/{TICKET-ID}*.md` nếu biết TICKET-ID; nếu không, `{specs_dir}/{domain}/*/*.md` (khớp feature folder có id tương ứng), hoặc `{specs_dir}/*/*/*.md` nếu domain cũng chưa biết. *(Glob `*/*.md` ở cấp gốc folder chỉ khớp PRD — tech-docs/design-spec `.md` nằm sâu hơn trong thư mục con.)*
64
64
  - **Lệnh tech-docs**: `{specs_dir}/{domain}/*/tech-docs/{UC-ID}*-tech-design*.md`.
65
65
  - **Lệnh design-spec**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
66
66
 
67
67
  Khi một file khớp: đặt nó 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 mà 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.
68
68
  3. Nếu `$ARGUMENTS` rỗng hoặc không tìm thấy file khớp:
69
- - Liệt kê 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).
69
+ - Liệt kê các file trong thư mục liên quan của lệnh này (vd: `specs/*/*/*.md` — file PRD ở gốc mỗi feature folder — cho lệnh PRD, `specs/*/*/bdd/**/*.feature` cho lệnh BDD).
70
70
  - 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)"
71
71
  - Chờ người dùng chọn rồi mới tiếp tục.
72
72
 
@@ -134,7 +134,7 @@ Thực hiện các bước theo đúng thứ tự. Lưu mọi thứ vào bộ nh
134
134
  - `domains` → danh sách các business domain đang hoạt động
135
135
 
136
136
  **Paths (nếu có):**
137
- - `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/}`
137
+ - `paths.specs_dir` → gốc của spec artifact — PRD, BDD, tech-docs, design-spec. Cấu trúc: `{specs_dir}/{domain}/{prd-slug}/{ {TICKET-ID}-{prd-slug}.md | bdd/ | tech-docs/ | design-spec/}` (file PRD đặt tên `{TICKET-ID}-{prd-slug}.md`, là file `.md` duy nhất ở gốc feature folder)
138
138
  - `paths.refinement_dir` → thư mục output cho findings/review
139
139
  - `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}/`)
140
140
  - `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 đè)
@@ -160,7 +160,7 @@ Nếu không có section `paths`, dùng các giá trị mặc định:
160
160
  Lưu ý: Trong bố cục feature-package, `specs_dir` là 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` là tên folder feature-package, không phải một biến config riêng.
161
161
 
162
162
  **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, vì 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ụ:
163
- - `specs/payment/create-invoice/prd.md` → `prd_slug = create-invoice`
163
+ - `specs/payment/create-invoice/PAY01-create-invoice.md` → `prd_slug = create-invoice`
164
164
  - `specs/payment/create-invoice/bdd/system/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `system`)*
165
165
  - `specs/payment/create-invoice/bdd/web/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `web`)*
166
166
  - `specs/payment/create-invoice/tech-docs/PAY-UC1-tech-design.md` → `prd_slug = create-invoice` *(KHÔNG phải `tech-docs`)*
@@ -181,7 +181,7 @@ Nếu có section `services`:
181
181
  **1. Phát hiện active domain** (theo thứ tự ưu tiên):
182
182
  - Đọc `@trace.domain` từ frontmatter của target file (nếu Gate đã nạp một target file)
183
183
  - 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.
184
- *(vd: `specs/user/create-account/prd.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
184
+ *(vd: `specs/user/create-account/USR01-create-account.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
185
185
  - Nếu `$ARGUMENTS` chứa một path, trích xuất segment domain sau `specs_dir`
186
186
 
187
187
  **2. Route tới service** — nếu active domain khớp với một key trong `services`:
@@ -60,13 +60,13 @@ Hiển thị và chờ phản hồi:
60
60
  1. Nếu `$ARGUMENTS` được cung cấp và trỏ tới một file tồn tại → dùng trực tiếp làm target.
61
61
  2. Nếu `$ARGUMENTS` là một **UC-ID / ticket ID / tên rút gọn** (không có 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 đó, và `**` đệ quy dưới `bdd/` để phủ hết các thư mục con theo platform (`bdd/web/`, `bdd/app/`, `bdd/system/`):
62
62
  - **Lệnh BDD** (target là `.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 đó.
63
- - **Lệnh PRD** (target là `prd.md`): `{specs_dir}/{domain}/*/prd.md` (khớp feature folder có id tương ứng), nếu không thì `{specs_dir}/*/*/prd.md`.
63
+ - **Lệnh PRD** (target là file PRD `{TICKET-ID}-{prd-slug}.md` — file `.md` duy nhất ở gốc feature folder, cạnh `bdd/`): `{specs_dir}/{domain}/*/{TICKET-ID}*.md` nếu biết TICKET-ID; nếu không, `{specs_dir}/{domain}/*/*.md` (khớp feature folder có id tương ứng), hoặc `{specs_dir}/*/*/*.md` nếu domain cũng chưa biết. *(Glob `*/*.md` ở cấp gốc folder chỉ khớp PRD — tech-docs/design-spec `.md` nằm sâu hơn trong thư mục con.)*
64
64
  - **Lệnh tech-docs**: `{specs_dir}/{domain}/*/tech-docs/{UC-ID}*-tech-design*.md`.
65
65
  - **Lệnh design-spec**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
66
66
 
67
67
  Khi một file khớp: đặt nó 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 mà 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.
68
68
  3. Nếu `$ARGUMENTS` rỗng hoặc không tìm thấy file khớp:
69
- - Liệt kê 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).
69
+ - Liệt kê các file trong thư mục liên quan của lệnh này (vd: `specs/*/*/*.md` — file PRD ở gốc mỗi feature folder — cho lệnh PRD, `specs/*/*/bdd/**/*.feature` cho lệnh BDD).
70
70
  - 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)"
71
71
  - Chờ người dùng chọn rồi mới tiếp tục.
72
72
 
@@ -134,7 +134,7 @@ Thực hiện các bước theo đúng thứ tự. Lưu mọi thứ vào bộ nh
134
134
  - `domains` → danh sách các business domain đang hoạt động
135
135
 
136
136
  **Paths (nếu có):**
137
- - `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/}`
137
+ - `paths.specs_dir` → gốc của spec artifact — PRD, BDD, tech-docs, design-spec. Cấu trúc: `{specs_dir}/{domain}/{prd-slug}/{ {TICKET-ID}-{prd-slug}.md | bdd/ | tech-docs/ | design-spec/}` (file PRD đặt tên `{TICKET-ID}-{prd-slug}.md`, là file `.md` duy nhất ở gốc feature folder)
138
138
  - `paths.refinement_dir` → thư mục output cho findings/review
139
139
  - `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}/`)
140
140
  - `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 đè)
@@ -160,7 +160,7 @@ Nếu không có section `paths`, dùng các giá trị mặc định:
160
160
  Lưu ý: Trong bố cục feature-package, `specs_dir` là 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` là tên folder feature-package, không phải một biến config riêng.
161
161
 
162
162
  **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, vì 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ụ:
163
- - `specs/payment/create-invoice/prd.md` → `prd_slug = create-invoice`
163
+ - `specs/payment/create-invoice/PAY01-create-invoice.md` → `prd_slug = create-invoice`
164
164
  - `specs/payment/create-invoice/bdd/system/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `system`)*
165
165
  - `specs/payment/create-invoice/bdd/web/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `web`)*
166
166
  - `specs/payment/create-invoice/tech-docs/PAY-UC1-tech-design.md` → `prd_slug = create-invoice` *(KHÔNG phải `tech-docs`)*
@@ -181,7 +181,7 @@ Nếu có section `services`:
181
181
  **1. Phát hiện active domain** (theo thứ tự ưu tiên):
182
182
  - Đọc `@trace.domain` từ frontmatter của target file (nếu Gate đã nạp một target file)
183
183
  - 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.
184
- *(vd: `specs/user/create-account/prd.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
184
+ *(vd: `specs/user/create-account/USR01-create-account.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
185
185
  - Nếu `$ARGUMENTS` chứa một path, trích xuất segment domain sau `specs_dir`
186
186
 
187
187
  **2. Route tới service** — nếu active domain khớp với một key trong `services`:
@@ -56,13 +56,13 @@ Hiển thị và chờ phản hồi:
56
56
  1. Nếu `$ARGUMENTS` được cung cấp và trỏ tới một file tồn tại → dùng trực tiếp làm target.
57
57
  2. Nếu `$ARGUMENTS` là một **UC-ID / ticket ID / tên rút gọn** (không có 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 đó, và `**` đệ quy dưới `bdd/` để phủ hết các thư mục con theo platform (`bdd/web/`, `bdd/app/`, `bdd/system/`):
58
58
  - **Lệnh BDD** (target là `.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 đó.
59
- - **Lệnh PRD** (target là `prd.md`): `{specs_dir}/{domain}/*/prd.md` (khớp feature folder có id tương ứng), nếu không thì `{specs_dir}/*/*/prd.md`.
59
+ - **Lệnh PRD** (target là file PRD `{TICKET-ID}-{prd-slug}.md` — file `.md` duy nhất ở gốc feature folder, cạnh `bdd/`): `{specs_dir}/{domain}/*/{TICKET-ID}*.md` nếu biết TICKET-ID; nếu không, `{specs_dir}/{domain}/*/*.md` (khớp feature folder có id tương ứng), hoặc `{specs_dir}/*/*/*.md` nếu domain cũng chưa biết. *(Glob `*/*.md` ở cấp gốc folder chỉ khớp PRD — tech-docs/design-spec `.md` nằm sâu hơn trong thư mục con.)*
60
60
  - **Lệnh tech-docs**: `{specs_dir}/{domain}/*/tech-docs/{UC-ID}*-tech-design*.md`.
61
61
  - **Lệnh design-spec**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
62
62
 
63
63
  Khi một file khớp: đặt nó 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 mà 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.
64
64
  3. Nếu `$ARGUMENTS` rỗng hoặc không tìm thấy file khớp:
65
- - Liệt kê 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).
65
+ - Liệt kê các file trong thư mục liên quan của lệnh này (vd: `specs/*/*/*.md` — file PRD ở gốc mỗi feature folder — cho lệnh PRD, `specs/*/*/bdd/**/*.feature` cho lệnh BDD).
66
66
  - 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)"
67
67
  - Chờ người dùng chọn rồi mới tiếp tục.
68
68
 
@@ -130,7 +130,7 @@ Thực hiện các bước theo đúng thứ tự. Lưu mọi thứ vào bộ nh
130
130
  - `domains` → danh sách các business domain đang hoạt động
131
131
 
132
132
  **Paths (nếu có):**
133
- - `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/}`
133
+ - `paths.specs_dir` → gốc của spec artifact — PRD, BDD, tech-docs, design-spec. Cấu trúc: `{specs_dir}/{domain}/{prd-slug}/{ {TICKET-ID}-{prd-slug}.md | bdd/ | tech-docs/ | design-spec/}` (file PRD đặt tên `{TICKET-ID}-{prd-slug}.md`, là file `.md` duy nhất ở gốc feature folder)
134
134
  - `paths.refinement_dir` → thư mục output cho findings/review
135
135
  - `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}/`)
136
136
  - `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 đè)
@@ -156,7 +156,7 @@ Nếu không có section `paths`, dùng các giá trị mặc định:
156
156
  Lưu ý: Trong bố cục feature-package, `specs_dir` là 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` là tên folder feature-package, không phải một biến config riêng.
157
157
 
158
158
  **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, vì 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ụ:
159
- - `specs/payment/create-invoice/prd.md` → `prd_slug = create-invoice`
159
+ - `specs/payment/create-invoice/PAY01-create-invoice.md` → `prd_slug = create-invoice`
160
160
  - `specs/payment/create-invoice/bdd/system/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `system`)*
161
161
  - `specs/payment/create-invoice/bdd/web/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `web`)*
162
162
  - `specs/payment/create-invoice/tech-docs/PAY-UC1-tech-design.md` → `prd_slug = create-invoice` *(KHÔNG phải `tech-docs`)*
@@ -177,7 +177,7 @@ Nếu có section `services`:
177
177
  **1. Phát hiện active domain** (theo thứ tự ưu tiên):
178
178
  - Đọc `@trace.domain` từ frontmatter của target file (nếu Gate đã nạp một target file)
179
179
  - 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.
180
- *(vd: `specs/user/create-account/prd.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
180
+ *(vd: `specs/user/create-account/USR01-create-account.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
181
181
  - Nếu `$ARGUMENTS` chứa một path, trích xuất segment domain sau `specs_dir`
182
182
 
183
183
  **2. Route tới service** — nếu active domain khớp với một key trong `services`:
@@ -54,13 +54,13 @@ Hiển thị và chờ phản hồi:
54
54
  1. Nếu `$ARGUMENTS` được cung cấp và trỏ tới một file tồn tại → dùng trực tiếp làm target.
55
55
  2. Nếu `$ARGUMENTS` là một **UC-ID / ticket ID / tên rút gọn** (không có 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 đó, và `**` đệ quy dưới `bdd/` để phủ hết các thư mục con theo platform (`bdd/web/`, `bdd/app/`, `bdd/system/`):
56
56
  - **Lệnh BDD** (target là `.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 là `prd.md`): `{specs_dir}/{domain}/*/prd.md` (khớp feature folder có id tương ứng), nếu không thì `{specs_dir}/*/*/prd.md`.
57
+ - **Lệnh PRD** (target là file PRD `{TICKET-ID}-{prd-slug}.md` — file `.md` duy nhất ở gốc feature folder, cạnh `bdd/`): `{specs_dir}/{domain}/*/{TICKET-ID}*.md` nếu biết TICKET-ID; nếu không, `{specs_dir}/{domain}/*/*.md` (khớp feature folder có id tương ứng), hoặc `{specs_dir}/*/*/*.md` nếu domain cũng chưa biết. *(Glob `*/*.md` ở cấp gốc folder chỉ khớp PRD — tech-docs/design-spec `.md` nằm sâu hơn trong thư mục con.)*
58
58
  - **Lệnh tech-docs**: `{specs_dir}/{domain}/*/tech-docs/{UC-ID}*-tech-design*.md`.
59
59
  - **Lệnh design-spec**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
60
60
 
61
61
  Khi một file khớp: đặt nó 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 mà 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
62
  3. Nếu `$ARGUMENTS` rỗng hoặc không tìm thấy file khớp:
63
- - Liệt kê 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).
63
+ - Liệt kê các file trong thư mục liên quan của lệnh này (vd: `specs/*/*/*.md` — file PRD ở gốc mỗi feature folder — cho lệnh PRD, `specs/*/*/bdd/**/*.feature` cho lệnh BDD).
64
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
65
  - Chờ người dùng chọn rồi mới tiếp tục.
66
66
 
@@ -128,7 +128,7 @@ Thực hiện các bước theo đúng thứ tự. Lưu mọi thứ vào bộ nh
128
128
  - `domains` → danh sách các business domain đang hoạt động
129
129
 
130
130
  **Paths (nếu có):**
131
- - `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/}`
131
+ - `paths.specs_dir` → gốc của spec artifact — PRD, BDD, tech-docs, design-spec. Cấu trúc: `{specs_dir}/{domain}/{prd-slug}/{ {TICKET-ID}-{prd-slug}.md | bdd/ | tech-docs/ | design-spec/}` (file PRD đặt tên `{TICKET-ID}-{prd-slug}.md`, là file `.md` duy nhất ở gốc feature folder)
132
132
  - `paths.refinement_dir` → thư mục output cho findings/review
133
133
  - `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}/`)
134
134
  - `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 đè)
@@ -154,7 +154,7 @@ Nếu không có section `paths`, dùng các giá trị mặc định:
154
154
  Lưu ý: Trong bố cục feature-package, `specs_dir` là 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` là tên folder feature-package, không phải một biến config riêng.
155
155
 
156
156
  **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, vì 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ụ:
157
- - `specs/payment/create-invoice/prd.md` → `prd_slug = create-invoice`
157
+ - `specs/payment/create-invoice/PAY01-create-invoice.md` → `prd_slug = create-invoice`
158
158
  - `specs/payment/create-invoice/bdd/system/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `system`)*
159
159
  - `specs/payment/create-invoice/bdd/web/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `web`)*
160
160
  - `specs/payment/create-invoice/tech-docs/PAY-UC1-tech-design.md` → `prd_slug = create-invoice` *(KHÔNG phải `tech-docs`)*
@@ -175,7 +175,7 @@ Nếu có section `services`:
175
175
  **1. Phát hiện active domain** (theo thứ tự ưu tiên):
176
176
  - Đọc `@trace.domain` từ frontmatter của target file (nếu Gate đã nạp một target file)
177
177
  - 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.
178
- *(vd: `specs/user/create-account/prd.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
178
+ *(vd: `specs/user/create-account/USR01-create-account.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
179
179
  - Nếu `$ARGUMENTS` chứa một path, trích xuất segment domain sau `specs_dir`
180
180
 
181
181
  **2. Route tới service** — nếu active domain khớp với một key trong `services`: