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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +19 -16
  14. package/commands/generate-prd.tmpl +10 -7
  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 +19 -16
  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 +8 -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 +4 -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 +8 -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 +4 -4
  115. package/templates/project-context.yaml +2 -2
@@ -62,13 +62,13 @@ Hiển thị và chờ phản hồi:
62
62
  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.
63
63
  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/`):
64
64
  - **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 đó.
65
- - **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`.
65
+ - **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.)*
66
66
  - **Lệnh tech-docs**: `{specs_dir}/{domain}/*/tech-docs/{UC-ID}*-tech-design*.md`.
67
67
  - **Lệnh design-spec**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
68
68
 
69
69
  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.
70
70
  3. Nếu `$ARGUMENTS` rỗng hoặc không tìm thấy file khớp:
71
- - 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).
71
+ - 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).
72
72
  - 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)"
73
73
  - Chờ người dùng chọn rồi mới tiếp tục.
74
74
 
@@ -136,7 +136,7 @@ Thực hiện các bước theo đúng thứ tự. Lưu mọi thứ vào bộ nh
136
136
  - `domains` → danh sách các business domain đang hoạt động
137
137
 
138
138
  **Paths (nếu có):**
139
- - `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/}`
139
+ - `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)
140
140
  - `paths.refinement_dir` → thư mục output cho findings/review
141
141
  - `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}/`)
142
142
  - `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 đè)
@@ -162,7 +162,7 @@ Nếu không có section `paths`, dùng các giá trị mặc định:
162
162
  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.
163
163
 
164
164
  **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ụ:
165
- - `specs/payment/create-invoice/prd.md` → `prd_slug = create-invoice`
165
+ - `specs/payment/create-invoice/PAY01-create-invoice.md` → `prd_slug = create-invoice`
166
166
  - `specs/payment/create-invoice/bdd/system/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `system`)*
167
167
  - `specs/payment/create-invoice/bdd/web/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `web`)*
168
168
  - `specs/payment/create-invoice/tech-docs/PAY-UC1-tech-design.md` → `prd_slug = create-invoice` *(KHÔNG phải `tech-docs`)*
@@ -183,7 +183,7 @@ Nếu có section `services`:
183
183
  **1. Phát hiện active domain** (theo thứ tự ưu tiên):
184
184
  - Đọc `@trace.domain` từ frontmatter của target file (nếu Gate đã nạp một target file)
185
185
  - 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.
186
- *(vd: `specs/user/create-account/prd.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
186
+ *(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`)*
187
187
  - Nếu `$ARGUMENTS` chứa một path, trích xuất segment domain sau `specs_dir`
188
188
 
189
189
  **2. Route tới service** — nếu active domain khớp với một key trong `services`:
@@ -62,13 +62,13 @@ Hiển thị và chờ phản hồi:
62
62
  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.
63
63
  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/`):
64
64
  - **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 đó.
65
- - **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`.
65
+ - **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.)*
66
66
  - **Lệnh tech-docs**: `{specs_dir}/{domain}/*/tech-docs/{UC-ID}*-tech-design*.md`.
67
67
  - **Lệnh design-spec**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
68
68
 
69
69
  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.
70
70
  3. Nếu `$ARGUMENTS` rỗng hoặc không tìm thấy file khớp:
71
- - 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).
71
+ - 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).
72
72
  - 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)"
73
73
  - Chờ người dùng chọn rồi mới tiếp tục.
74
74
 
@@ -136,7 +136,7 @@ Thực hiện các bước theo đúng thứ tự. Lưu mọi thứ vào bộ nh
136
136
  - `domains` → danh sách các business domain đang hoạt động
137
137
 
138
138
  **Paths (nếu có):**
139
- - `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/}`
139
+ - `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)
140
140
  - `paths.refinement_dir` → thư mục output cho findings/review
141
141
  - `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}/`)
142
142
  - `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 đè)
@@ -162,7 +162,7 @@ Nếu không có section `paths`, dùng các giá trị mặc định:
162
162
  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.
163
163
 
164
164
  **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ụ:
165
- - `specs/payment/create-invoice/prd.md` → `prd_slug = create-invoice`
165
+ - `specs/payment/create-invoice/PAY01-create-invoice.md` → `prd_slug = create-invoice`
166
166
  - `specs/payment/create-invoice/bdd/system/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `system`)*
167
167
  - `specs/payment/create-invoice/bdd/web/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `web`)*
168
168
  - `specs/payment/create-invoice/tech-docs/PAY-UC1-tech-design.md` → `prd_slug = create-invoice` *(KHÔNG phải `tech-docs`)*
@@ -183,7 +183,7 @@ Nếu có section `services`:
183
183
  **1. Phát hiện active domain** (theo thứ tự ưu tiên):
184
184
  - Đọc `@trace.domain` từ frontmatter của target file (nếu Gate đã nạp một target file)
185
185
  - 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.
186
- *(vd: `specs/user/create-account/prd.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
186
+ *(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`)*
187
187
  - Nếu `$ARGUMENTS` chứa một path, trích xuất segment domain sau `specs_dir`
188
188
 
189
189
  **2. Route tới service** — nếu active domain khớp với một key trong `services`:
@@ -62,13 +62,13 @@ Hiển thị và chờ phản hồi:
62
62
  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.
63
63
  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/`):
64
64
  - **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 đó.
65
- - **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`.
65
+ - **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.)*
66
66
  - **Lệnh tech-docs**: `{specs_dir}/{domain}/*/tech-docs/{UC-ID}*-tech-design*.md`.
67
67
  - **Lệnh design-spec**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
68
68
 
69
69
  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.
70
70
  3. Nếu `$ARGUMENTS` rỗng hoặc không tìm thấy file khớp:
71
- - 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).
71
+ - 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).
72
72
  - 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)"
73
73
  - Chờ người dùng chọn rồi mới tiếp tục.
74
74
 
@@ -136,7 +136,7 @@ Thực hiện các bước theo đúng thứ tự. Lưu mọi thứ vào bộ nh
136
136
  - `domains` → danh sách các business domain đang hoạt động
137
137
 
138
138
  **Paths (nếu có):**
139
- - `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/}`
139
+ - `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)
140
140
  - `paths.refinement_dir` → thư mục output cho findings/review
141
141
  - `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}/`)
142
142
  - `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 đè)
@@ -162,7 +162,7 @@ Nếu không có section `paths`, dùng các giá trị mặc định:
162
162
  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.
163
163
 
164
164
  **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ụ:
165
- - `specs/payment/create-invoice/prd.md` → `prd_slug = create-invoice`
165
+ - `specs/payment/create-invoice/PAY01-create-invoice.md` → `prd_slug = create-invoice`
166
166
  - `specs/payment/create-invoice/bdd/system/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `system`)*
167
167
  - `specs/payment/create-invoice/bdd/web/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `web`)*
168
168
  - `specs/payment/create-invoice/tech-docs/PAY-UC1-tech-design.md` → `prd_slug = create-invoice` *(KHÔNG phải `tech-docs`)*
@@ -183,7 +183,7 @@ Nếu có section `services`:
183
183
  **1. Phát hiện active domain** (theo thứ tự ưu tiên):
184
184
  - Đọc `@trace.domain` từ frontmatter của target file (nếu Gate đã nạp một target file)
185
185
  - 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.
186
- *(vd: `specs/user/create-account/prd.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
186
+ *(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`)*
187
187
  - Nếu `$ARGUMENTS` chứa một path, trích xuất segment domain sau `specs_dir`
188
188
 
189
189
  **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
 
@@ -90,7 +90,7 @@ Chờ người dùng trả lời rõ ràng "Y" hoặc "N" rồi mới tiếp t
90
90
  - "N" → dừng lại và hỏi người dùng muốn thay đổi gì.
91
91
 
92
92
 
93
- *Lưu ý: Với lệnh này, target file ở Bước 1 là một file PRD (`prd.md`) dưới `{paths.specs_dir}/{domain}/{prd-slug}/`. Đọc toàn bộ PRD sau khi phân giải file.*
93
+ *Lưu ý: Với lệnh này, target file ở Bước 1 là một file PRD (`{TICKET-ID}-{prd-slug}.md` — file `.md` duy nhất ở gốc feature folder) dưới `{paths.specs_dir}/{domain}/{prd-slug}/`. Đọc toàn bộ PRD sau khi phân giải file.*
94
94
 
95
95
  ## Context
96
96
  # Context Loader — Nạp toàn bộ context dự án
@@ -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`:
@@ -564,13 +564,13 @@ của schema dưới đây.
564
564
  ## File Output
565
565
 
566
566
  Suy ra tên file output từ PRD slug:
567
- - File PRD: `{paths.specs_dir}/payment/create-invoice/prd.md` → output: `{paths.refinement_dir}/create-invoice-findings.yaml`
567
+ - File PRD: `{paths.specs_dir}/payment/create-invoice/PAY01-create-invoice.md` → output: `{paths.refinement_dir}/create-invoice-findings.yaml`
568
568
  - Quy tắc: lấy tên folder cha của PRD (prd-slug), thêm hậu tố `-findings.yaml`
569
569
 
570
570
  Ghi `{paths.refinement_dir}/{prd-slug}-findings.yaml`:
571
571
 
572
572
  ```yaml
573
- prd_source: "{paths.specs_dir}/{domain}/{prd-slug}/prd.md"
573
+ prd_source: "{paths.specs_dir}/{domain}/{prd-slug}/{TICKET-ID}-{prd-slug}.md"
574
574
  generated_at: "{ISO datetime}"
575
575
  status: "pending_review"
576
576
 
@@ -65,13 +65,13 @@ Hiển thị và chờ phản hồi:
65
65
  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.
66
66
  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/`):
67
67
  - **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 đó.
68
- - **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`.
68
+ - **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.)*
69
69
  - **Lệnh tech-docs**: `{specs_dir}/{domain}/*/tech-docs/{UC-ID}*-tech-design*.md`.
70
70
  - **Lệnh design-spec**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
71
71
 
72
72
  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.
73
73
  3. Nếu `$ARGUMENTS` rỗng hoặc không tìm thấy file khớp:
74
- - 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).
74
+ - 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).
75
75
  - 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)"
76
76
  - Chờ người dùng chọn rồi mới tiếp tục.
77
77
 
@@ -139,7 +139,7 @@ Thực hiện các bước theo đúng thứ tự. Lưu mọi thứ vào bộ nh
139
139
  - `domains` → danh sách các business domain đang hoạt động
140
140
 
141
141
  **Paths (nếu có):**
142
- - `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/}`
142
+ - `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)
143
143
  - `paths.refinement_dir` → thư mục output cho findings/review
144
144
  - `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}/`)
145
145
  - `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 đè)
@@ -165,7 +165,7 @@ Nếu không có section `paths`, dùng các giá trị mặc định:
165
165
  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.
166
166
 
167
167
  **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ụ:
168
- - `specs/payment/create-invoice/prd.md` → `prd_slug = create-invoice`
168
+ - `specs/payment/create-invoice/PAY01-create-invoice.md` → `prd_slug = create-invoice`
169
169
  - `specs/payment/create-invoice/bdd/system/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `system`)*
170
170
  - `specs/payment/create-invoice/bdd/web/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `web`)*
171
171
  - `specs/payment/create-invoice/tech-docs/PAY-UC1-tech-design.md` → `prd_slug = create-invoice` *(KHÔNG phải `tech-docs`)*
@@ -186,7 +186,7 @@ Nếu có section `services`:
186
186
  **1. Phát hiện active domain** (theo thứ tự ưu tiên):
187
187
  - Đọc `@trace.domain` từ frontmatter của target file (nếu Gate đã nạp một target file)
188
188
  - 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.
189
- *(vd: `specs/user/create-account/prd.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
189
+ *(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`)*
190
190
  - Nếu `$ARGUMENTS` chứa một path, trích xuất segment domain sau `specs_dir`
191
191
 
192
192
  **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`:
@@ -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
 
@@ -94,7 +94,7 @@ Chờ người dùng trả lời rõ ràng "Y" hoặc "N" rồi mới tiếp t
94
94
 
95
95
 
96
96
  *Lưu ý: Với lệnh này, target ở Bước 1 là một file PRD `.md` hoặc file BDD `.feature`.
97
- Nếu path là `prd.md` dưới `{paths.specs_dir}/{domain}/{prd-slug}/` → PRD Review Mode.
97
+ Nếu path là file PRD (`{TICKET-ID}-{prd-slug}.md` file `.md` ở gốc feature folder `{paths.specs_dir}/{domain}/{prd-slug}/`) → PRD Review Mode.
98
98
  Nếu path kết thúc bằng `.feature` → BDD Review Mode.
99
99
  Nếu `$ARGUMENTS` chứa `--resume` → bỏ qua sang Resume Mode bên dưới.
100
100
  Nếu `$ARGUMENTS` chứa `--fix` → bỏ qua sang Fix Mode bên dưới (áp dụng ngay mọi finding auto-fixable).*
@@ -135,7 +135,7 @@ Thực hiện các bước theo đúng thứ tự. Lưu mọi thứ vào bộ nh
135
135
  - `domains` → danh sách các business domain đang hoạt động
136
136
 
137
137
  **Paths (nếu có):**
138
- - `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/}`
138
+ - `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)
139
139
  - `paths.refinement_dir` → thư mục output cho findings/review
140
140
  - `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}/`)
141
141
  - `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 đè)
@@ -161,7 +161,7 @@ Nếu không có section `paths`, dùng các giá trị mặc định:
161
161
  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.
162
162
 
163
163
  **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ụ:
164
- - `specs/payment/create-invoice/prd.md` → `prd_slug = create-invoice`
164
+ - `specs/payment/create-invoice/PAY01-create-invoice.md` → `prd_slug = create-invoice`
165
165
  - `specs/payment/create-invoice/bdd/system/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `system`)*
166
166
  - `specs/payment/create-invoice/bdd/web/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `web`)*
167
167
  - `specs/payment/create-invoice/tech-docs/PAY-UC1-tech-design.md` → `prd_slug = create-invoice` *(KHÔNG phải `tech-docs`)*
@@ -182,7 +182,7 @@ Nếu có section `services`:
182
182
  **1. Phát hiện active domain** (theo thứ tự ưu tiên):
183
183
  - Đọc `@trace.domain` từ frontmatter của target file (nếu Gate đã nạp một target file)
184
184
  - 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.
185
- *(vd: `specs/user/create-account/prd.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
185
+ *(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`)*
186
186
  - Nếu `$ARGUMENTS` chứa một path, trích xuất segment domain sau `specs_dir`
187
187
 
188
188
  **2. Route tới service** — nếu active domain khớp với một key trong `services`:
@@ -415,7 +415,7 @@ Tiếp tục sang bước kế tiếp của lệnh đang gọi.
415
415
 
416
416
  Sau khi phân giải target file:
417
417
  - File `.feature` → **BDD Review Mode** (nhảy tới section BDD)
418
- - `prd.md` dưới `{paths.specs_dir}/*/*/` → **PRD Review Mode** (tiếp tục bên dưới)
418
+ - File `.md` gốc feature folder `{paths.specs_dir}/*/*/` (không phải dưới `bdd/`·`tech-docs/`·`design-spec/`) → **PRD Review Mode** (tiếp tục bên dưới)
419
419
  - Không xác định → hỏi: "Đây là file PRD hay file BDD feature? (prd/bdd)"
420
420
 
421
421
  Đồng thời kiểm tra flag:
@@ -644,7 +644,7 @@ Quét mỗi AC và BR tìm:
644
644
 
645
645
  ### P3 — Domain Conflict Check
646
646
 
647
- Liệt kê tất cả PRD khác trong `{paths.specs_dir}/{domain}/*/prd.md`.
647
+ Liệt kê tất cả PRD khác trong `{paths.specs_dir}/{domain}/*/*.md` (file `.md` ở gốc mỗi feature folder = PRD).
648
648
  Với mỗi PRD, kiểm tra xem PRD này có mâu thuẫn với một BR đã định nghĩa không (cùng trigger, khác outcome)
649
649
  hoặc định nghĩa lại field/status transition của một entity khác đi.
650
650
 
@@ -987,7 +987,7 @@ Mở file findings trong Review Board → rồi chạy: /review-context --resume
987
987
  ## Resume Mode — Áp dụng các Finding được chấp nhận
988
988
 
989
989
  *Kích hoạt khi `$ARGUMENTS` chứa `--resume`.*
990
- *Ví dụ: `/review-context --resume specs/payment/process-payment/prd.md`*
990
+ *Ví dụ: `/review-context --resume specs/payment/process-payment/PAY01-process-payment.md`*
991
991
 
992
992
  ### Phase 1 — Đọc các finding được chấp nhận
993
993
 
@@ -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
 
@@ -132,7 +132,7 @@ Thực hiện các bước theo đúng thứ tự. Lưu mọi thứ vào bộ nh
132
132
  - `domains` → danh sách các business domain đang hoạt động
133
133
 
134
134
  **Paths (nếu có):**
135
- - `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/}`
135
+ - `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)
136
136
  - `paths.refinement_dir` → thư mục output cho findings/review
137
137
  - `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}/`)
138
138
  - `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 đè)
@@ -158,7 +158,7 @@ Nếu không có section `paths`, dùng các giá trị mặc định:
158
158
  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.
159
159
 
160
160
  **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ụ:
161
- - `specs/payment/create-invoice/prd.md` → `prd_slug = create-invoice`
161
+ - `specs/payment/create-invoice/PAY01-create-invoice.md` → `prd_slug = create-invoice`
162
162
  - `specs/payment/create-invoice/bdd/system/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `system`)*
163
163
  - `specs/payment/create-invoice/bdd/web/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `web`)*
164
164
  - `specs/payment/create-invoice/tech-docs/PAY-UC1-tech-design.md` → `prd_slug = create-invoice` *(KHÔNG phải `tech-docs`)*
@@ -179,7 +179,7 @@ Nếu có section `services`:
179
179
  **1. Phát hiện active domain** (theo thứ tự ưu tiên):
180
180
  - Đọc `@trace.domain` từ frontmatter của target file (nếu Gate đã nạp một target file)
181
181
  - 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.
182
- *(vd: `specs/user/create-account/prd.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
182
+ *(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`)*
183
183
  - Nếu `$ARGUMENTS` chứa một path, trích xuất segment domain sau `specs_dir`
184
184
 
185
185
  **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
 
@@ -136,7 +136,7 @@ Rồi:
136
136
 
137
137
  **project_type = 3 (PO Spec repo):**
138
138
  - Tạo base dir: `specs/product-definition/`, `specs/domain-knowledge/`, `feedback/`, `.agent/review/`
139
- - Artifact theo từng feature (`specs/{domain}/{prd-slug}/{prd.md, bdd/, tech-docs/, design-spec/}`) được tạo on demand bởi các lệnh generate — ĐỪNG tạo trước
139
+ - Artifact theo từng feature (`specs/{domain}/{prd-slug}/{ {TICKET-ID}-{prd-slug}.md, bdd/, tech-docs/, design-spec/}`) được tạo on demand bởi các lệnh generate — ĐỪNG tạo trước
140
140
  - Skip: `.trace/` (theo service, sống cạnh code trong mỗi service submodule)
141
141
  - Sinh `CLAUDE.md` tối thiểu chỉ với §1 (project overview) và §7 (git conventions)
142
142
  - Hỏi người dùng: **"Liệt kê các business domain của bạn (vd auth, payment, loyalty):"** — lưu thành domain list cho `project-context.yaml` và nhắc PO các tên này phải được dùng nhất quán làm `@trace.domain` trong mọi PRD
@@ -169,7 +169,7 @@ tự tạo folder của nó on demand dưới `specs/{domain}/{prd-slug}/`:
169
169
 
170
170
  ```
171
171
  specs/{domain}/{prd-slug}/
172
- ├── prd.md ← /generate-prd
172
+ ├── {TICKET-ID}-{prd-slug}.md ← /generate-prd (vd SEG01-segment-scoring-service.md)
173
173
  ├── bdd/ ← /generate-bdd (file .feature)
174
174
  ├── tech-docs/ ← /generate-tech-docs
175
175
  └── design-spec/ ← /generate-design-spec (chỉ platform FE/App)
@@ -521,7 +521,7 @@ Next:
521
521
  → Refresh spec-manifest.yaml
522
522
 
523
523
  3. Bắt đầu sinh:
524
- /generate-bdd {spec_source}/specs/{domain}/{prd-slug}/prd.md
524
+ /generate-bdd {spec_source}/specs/{domain}/{prd-slug}/{TICKET-ID}-{prd-slug}.md
525
525
  ```
526
526
 
527
527
  **PO Spec repo:**
@@ -294,7 +294,7 @@ Nếu không tìm thấy dir `.trace/` → `Living Docs: no trace data yet — r
294
294
  *Skip nếu `setup.spec_source` vắng.*
295
295
 
296
296
  Nếu `spec-manifest.yaml` tồn tại HOẶC `setup.spec_source` được cấu hình:
297
- - Re-scan các file `{spec_source}/specs/**/prd.md`
297
+ - Re-scan các file PRD `{spec_source}/specs/*/*/*.md` (file `.md` ở gốc mỗi feature folder = PRD; tech-docs/design-spec `.md` nằm sâu hơn nên không bị quét nhầm)
298
298
  - Rebuild `spec-manifest.yaml` map TICKET-ID → path PRD/BDD/tech-doc
299
299
  - In: `spec-manifest.yaml refreshed — {N} features indexed`
300
300
 
@@ -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`:
@@ -465,7 +465,7 @@ Cũng phát hiện SC có trong `.feature` nhưng thiếu trong `.tsv` → thêm
465
465
  ### Step 4 — PRD version drift check
466
466
 
467
467
  Với mỗi UC, so:
468
- - PRD `| **Version** |` hiện tại từ `{paths.specs_dir}/{domain}/{prd-slug}/prd.md`
468
+ - PRD `| **Version** |` hiện tại từ `{paths.specs_dir}/{domain}/{prd-slug}/{TICKET-ID}-{prd-slug}.md`
469
469
  - `prd_version` lưu trong `.tsv` (version tại thời điểm sinh BDD)
470
470
  - `@trace.prd_version` trong các file code implement UC đó
471
471
 
@@ -492,7 +492,7 @@ Với mỗi file `.tsv` đã xử lý: ghi `spec_ver`, `status`, `last_updated`
492
492
  ### Step 7 — Tính aggregate cho dashboard
493
493
 
494
494
  ```
495
- total_prds = count distinct PRD files in {paths.specs_dir}/{domain}/*/prd.md
495
+ total_prds = count distinct PRD files in {paths.specs_dir}/{domain}/*/*.md (file .md ở gốc mỗi feature folder = PRD)
496
496
  approved_prds = PRDs with | Status | approved
497
497
  total_ucs = count distinct UC-IDs across all .tsv files
498
498
  approved_ucs = UCs with uc_status == approved