@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
@@ -66,13 +66,13 @@ Hiển thị và chờ phản hồi:
66
66
  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.
67
67
  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/`):
68
68
  - **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 đó.
69
- - **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`.
69
+ - **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.)*
70
70
  - **Lệnh tech-docs**: `{specs_dir}/{domain}/*/tech-docs/{UC-ID}*-tech-design*.md`.
71
71
  - **Lệnh design-spec**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
72
72
 
73
73
  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.
74
74
  3. Nếu `$ARGUMENTS` rỗng hoặc không tìm thấy file khớp:
75
- - 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).
75
+ - 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).
76
76
  - Hiển thị danh sách cho người dùng và hỏi: "Bạn muốn làm việc với file nào? (Nhập số thứ tự hoặc tên file)"
77
77
  - Chờ người dùng chọn rồi mới tiếp tục.
78
78
 
@@ -155,7 +155,7 @@ Thực hiện các bước theo đúng thứ tự. Lưu mọi thứ vào bộ nh
155
155
  - `domains` → danh sách các business domain đang hoạt động
156
156
 
157
157
  **Paths (nếu có):**
158
- - `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/}`
158
+ - `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)
159
159
  - `paths.refinement_dir` → thư mục output cho findings/review
160
160
  - `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}/`)
161
161
  - `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 đè)
@@ -181,7 +181,7 @@ Nếu không có section `paths`, dùng các giá trị mặc định:
181
181
  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.
182
182
 
183
183
  **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ụ:
184
- - `specs/payment/create-invoice/prd.md` → `prd_slug = create-invoice`
184
+ - `specs/payment/create-invoice/PAY01-create-invoice.md` → `prd_slug = create-invoice`
185
185
  - `specs/payment/create-invoice/bdd/system/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `system`)*
186
186
  - `specs/payment/create-invoice/bdd/web/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `web`)*
187
187
  - `specs/payment/create-invoice/tech-docs/PAY-UC1-tech-design.md` → `prd_slug = create-invoice` *(KHÔNG phải `tech-docs`)*
@@ -202,7 +202,7 @@ Nếu có section `services`:
202
202
  **1. Phát hiện active domain** (theo thứ tự ưu tiên):
203
203
  - Đọc `@trace.domain` từ frontmatter của target file (nếu Gate đã nạp một target file)
204
204
  - 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.
205
- *(vd: `specs/user/create-account/prd.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
205
+ *(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`)*
206
206
  - Nếu `$ARGUMENTS` chứa một path, trích xuất segment domain sau `specs_dir`
207
207
 
208
208
  **2. Route tới service** — nếu active domain khớp với một key trong `services`:
@@ -64,7 +64,7 @@ Thực hiện các bước theo đúng thứ tự. Lưu mọi thứ vào bộ nh
64
64
  - `domains` → danh sách các business domain đang hoạt động
65
65
 
66
66
  **Paths (nếu có):**
67
- - `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/}`
67
+ - `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)
68
68
  - `paths.refinement_dir` → thư mục output cho findings/review
69
69
  - `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}/`)
70
70
  - `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 đè)
@@ -90,7 +90,7 @@ Nếu không có section `paths`, dùng các giá trị mặc định:
90
90
  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.
91
91
 
92
92
  **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ụ:
93
- - `specs/payment/create-invoice/prd.md` → `prd_slug = create-invoice`
93
+ - `specs/payment/create-invoice/PAY01-create-invoice.md` → `prd_slug = create-invoice`
94
94
  - `specs/payment/create-invoice/bdd/system/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `system`)*
95
95
  - `specs/payment/create-invoice/bdd/web/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `web`)*
96
96
  - `specs/payment/create-invoice/tech-docs/PAY-UC1-tech-design.md` → `prd_slug = create-invoice` *(KHÔNG phải `tech-docs`)*
@@ -111,7 +111,7 @@ Nếu có section `services`:
111
111
  **1. Phát hiện active domain** (theo thứ tự ưu tiên):
112
112
  - Đọc `@trace.domain` từ frontmatter của target file (nếu Gate đã nạp một target file)
113
113
  - 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.
114
- *(vd: `specs/user/create-account/prd.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
114
+ *(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`)*
115
115
  - Nếu `$ARGUMENTS` chứa một path, trích xuất segment domain sau `specs_dir`
116
116
 
117
117
  **2. Route tới service** — nếu active domain khớp với một key trong `services`:
@@ -15,7 +15,7 @@ và AC-UI mức design để PO + Designer sign off — tách khỏi PRD mức n
15
15
 
16
16
  ## Gate
17
17
 
18
- <!-- Directory: specs/*/*/prd.md -->
18
+ <!-- Directory: specs/*/*/*.md (file PRD ở gốc feature folder) -->
19
19
  # Gate — Quy trình vào chuẩn cho mọi lệnh
20
20
 
21
21
  Mọi lệnh PHẢI chạy gate này trước khi thực thi phần logic riêng của nó.
@@ -69,13 +69,13 @@ Hiển thị và chờ phản hồi:
69
69
  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.
70
70
  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/`):
71
71
  - **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 đó.
72
- - **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`.
72
+ - **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.)*
73
73
  - **Lệnh tech-docs**: `{specs_dir}/{domain}/*/tech-docs/{UC-ID}*-tech-design*.md`.
74
74
  - **Lệnh design-spec**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
75
75
 
76
76
  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.
77
77
  3. Nếu `$ARGUMENTS` rỗng hoặc không tìm thấy file khớp:
78
- - 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).
78
+ - 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).
79
79
  - 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)"
80
80
  - Chờ người dùng chọn rồi mới tiếp tục.
81
81
 
@@ -144,7 +144,7 @@ Thực hiện các bước theo đúng thứ tự. Lưu mọi thứ vào bộ nh
144
144
  - `domains` → danh sách các business domain đang hoạt động
145
145
 
146
146
  **Paths (nếu có):**
147
- - `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/}`
147
+ - `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)
148
148
  - `paths.refinement_dir` → thư mục output cho findings/review
149
149
  - `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}/`)
150
150
  - `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 đè)
@@ -170,7 +170,7 @@ Nếu không có section `paths`, dùng các giá trị mặc định:
170
170
  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.
171
171
 
172
172
  **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ụ:
173
- - `specs/payment/create-invoice/prd.md` → `prd_slug = create-invoice`
173
+ - `specs/payment/create-invoice/PAY01-create-invoice.md` → `prd_slug = create-invoice`
174
174
  - `specs/payment/create-invoice/bdd/system/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `system`)*
175
175
  - `specs/payment/create-invoice/bdd/web/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `web`)*
176
176
  - `specs/payment/create-invoice/tech-docs/PAY-UC1-tech-design.md` → `prd_slug = create-invoice` *(KHÔNG phải `tech-docs`)*
@@ -191,7 +191,7 @@ Nếu có section `services`:
191
191
  **1. Phát hiện active domain** (theo thứ tự ưu tiên):
192
192
  - Đọc `@trace.domain` từ frontmatter của target file (nếu Gate đã nạp một target file)
193
193
  - 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.
194
- *(vd: `specs/user/create-account/prd.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
194
+ *(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`)*
195
195
  - Nếu `$ARGUMENTS` chứa một path, trích xuất segment domain sau `specs_dir`
196
196
 
197
197
  **2. Route tới service** — nếu active domain khớp với một key trong `services`:
@@ -15,7 +15,7 @@ và AC-UI mức design để PO + Designer sign off — tách khỏi PRD mức n
15
15
 
16
16
  ## Gate
17
17
 
18
- <!-- Directory: specs/*/*/prd.md -->
18
+ <!-- Directory: specs/*/*/*.md (file PRD ở gốc feature folder) -->
19
19
  {{include:steps/gate.md}}
20
20
 
21
21
  ---
@@ -66,13 +66,13 @@ Hiển thị và chờ phản hồi:
66
66
  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.
67
67
  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/`):
68
68
  - **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 đó.
69
- - **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`.
69
+ - **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.)*
70
70
  - **Lệnh tech-docs**: `{specs_dir}/{domain}/*/tech-docs/{UC-ID}*-tech-design*.md`.
71
71
  - **Lệnh design-spec**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
72
72
 
73
73
  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.
74
74
  3. Nếu `$ARGUMENTS` rỗng hoặc không tìm thấy file khớp:
75
- - 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).
75
+ - 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).
76
76
  - Hiển thị danh sách cho người dùng và hỏi: "Bạn muốn làm việc với file nào? (Nhập số thứ tự hoặc tên file)"
77
77
  - Chờ người dùng chọn rồi mới tiếp tục.
78
78
 
@@ -129,7 +129,7 @@ Sinh PRD theo đúng cấu trúc chuẩn dưới đây (template canonical: `tem
129
129
 
130
130
  - **Ngôn ngữ:** heading + nội dung viết tiếng Việt (giữ thuật ngữ kỹ thuật/Enum nguyên gốc).
131
131
  - **Tiêu đề file:** `# {TICKET}-{N} {Feature Name}` — KHÔNG thêm tiền tố "PRD —".
132
- - **Tên file ghi ra:** `specs/{domain}/{prd-slug}/prd.md` (bố cục feature-package — mọi artifact của feature nằm chung folder này).
132
+ - **Tên file ghi ra:** `specs/{domain}/{prd-slug}/{TICKET}-{prd-slug}.md` (vd `SEG01-segment-scoring-service.md` — KHÔNG đặt tên `prd.md`; bố cục feature-package — mọi artifact của feature nằm chung folder này, PRD là file `.md` duy nhất ở gốc folder).
133
133
  - **Business Rule:** đặt BÊN TRONG từng Use Case (không gom thành mục phẳng), bảng 3 cột `ID | Business Rule | Business Logic`; ID theo dạng `{TICKET}-{N}-UC{n}-BR{m}` (đánh số BR liên tục xuyên suốt các UC, không reset mỗi UC).
134
134
  - **Acceptance Criteria:** danh sách phẳng `**AC{n}:**`, văn xuôi — KHÔNG ép Given/When/Then.
135
135
  - **Liên kết:** trỏ tới PRD/tài liệu liên quan bằng link tương đối; trỏ `core-entities` / `business-dictionary` ở mục Tài liệu tham khảo.
@@ -156,8 +156,8 @@ Template (cấu trúc đầu ra — single-source từ `templates/prd.template.m
156
156
 
157
157
  CROSS-REFERENCE (BẮT BUỘC): Bất kỳ chỗ nào nhắc đến một tính năng/ticket khác
158
158
  (pre-condition, business rule, giả định, AC, hay bất kỳ section nào) → PHẢI gắn inline link:
159
- [TICKET-ID](./TICKET-ID-slug.md)
160
- Không để TICKET-ID dạng plain text nếu tồn tại file PRD tương ứng.
159
+ [TICKET-ID khác](../{prd-slug-khác}/{TICKET-ID-khác}-{prd-slug-khác}.md)
160
+ Không để TICKET-ID dạng plain text nếu tồn tại file PRD tương ứng. (Mỗi PRD nằm trong feature-package riêng nên link trỏ sang folder anh em `../{prd-slug-khác}/`.)
161
161
  Ngoài ra, ghi rõ quan hệ phụ thuộc trong "Tài liệu tham khảo" ở Appendix.
162
162
 
163
163
  NEW TERM DETECTION: Nếu input PO xuất hiện thuật ngữ CHƯA CÓ trong business-dictionary.md
@@ -182,6 +182,7 @@ Template (cấu trúc đầu ra — single-source từ `templates/prd.template.m
182
182
  | **Version** | 1.0 |
183
183
  | **Status** | draft |
184
184
  | **Author** | AI-assisted |
185
+ | **PO** | {tên PO} |
185
186
  | **Domain** | {domain} |
186
187
  | **Created** | {date} |
187
188
  | **Updated** | {date} |
@@ -290,7 +291,7 @@ flowchart TD
290
291
 
291
292
  ## Tài liệu tham khảo
292
293
 
293
- - [{TICKET liên quan}](./{file}.md) — {quan hệ: pre-condition / overlapping / related…}
294
+ - [{TICKET liên quan}](../{prd-slug-khác}/{TICKET-ID-khác}-{prd-slug-khác}.md) — {quan hệ: pre-condition / overlapping / related…}
294
295
  - Từ điển nghiệp vụ: `{path}/business-dictionary.md`
295
296
  - Domain knowledge: `{path}/{domain}.md`
296
297
 
@@ -337,7 +338,7 @@ _(Nếu không có độ vênh: ghi "Không có — toàn bộ nội dung đã
337
338
  <!--
338
339
  NEXT STEPS:
339
340
  Khi PRD được approve (status: approved), chạy:
340
- /generate-bdd "specs/{domain}/{prd-slug}/prd.md"
341
+ /generate-bdd "specs/{domain}/{prd-slug}/{TICKET-ID}-{prd-slug}.md"
341
342
  để sinh BDD feature specs từ PRD này.
342
343
  -->
343
344
 
@@ -346,7 +347,7 @@ _(Nếu không có độ vênh: ghi "Không có — toàn bộ nội dung đã
346
347
  ### Output
347
348
 
348
349
  ```
349
- ✅ Đã tạo PRD: specs/{domain}/{prd-slug}/prd.md
350
+ ✅ Đã tạo PRD: specs/{domain}/{prd-slug}/{TICKET}-{prd-slug}.md
350
351
  Status: draft
351
352
  ```
352
353
 
@@ -42,7 +42,7 @@ Sinh PRD theo đúng cấu trúc chuẩn dưới đây (template canonical: `tem
42
42
 
43
43
  - **Ngôn ngữ:** heading + nội dung viết tiếng Việt (giữ thuật ngữ kỹ thuật/Enum nguyên gốc).
44
44
  - **Tiêu đề file:** `# {TICKET}-{N} {Feature Name}` — KHÔNG thêm tiền tố "PRD —".
45
- - **Tên file ghi ra:** `specs/{domain}/{prd-slug}/prd.md` (bố cục feature-package — mọi artifact của feature nằm chung folder này).
45
+ - **Tên file ghi ra:** `specs/{domain}/{prd-slug}/{TICKET}-{prd-slug}.md` (vd `SEG01-segment-scoring-service.md` — KHÔNG đặt tên `prd.md`; bố cục feature-package — mọi artifact của feature nằm chung folder này, PRD là file `.md` duy nhất ở gốc folder).
46
46
  - **Business Rule:** đặt BÊN TRONG từng Use Case (không gom thành mục phẳng), bảng 3 cột `ID | Business Rule | Business Logic`; ID theo dạng `{TICKET}-{N}-UC{n}-BR{m}` (đánh số BR liên tục xuyên suốt các UC, không reset mỗi UC).
47
47
  - **Acceptance Criteria:** danh sách phẳng `**AC{n}:**`, văn xuôi — KHÔNG ép Given/When/Then.
48
48
  - **Liên kết:** trỏ tới PRD/tài liệu liên quan bằng link tương đối; trỏ `core-entities` / `business-dictionary` ở mục Tài liệu tham khảo.
@@ -57,7 +57,7 @@ Template (cấu trúc đầu ra — single-source từ `templates/prd.template.m
57
57
  ### Output
58
58
 
59
59
  ```
60
- ✅ Đã tạo PRD: specs/{domain}/{prd-slug}/prd.md
60
+ ✅ Đã tạo PRD: specs/{domain}/{prd-slug}/{TICKET}-{prd-slug}.md
61
61
  Status: draft
62
62
  ```
63
63
 
@@ -33,7 +33,7 @@ tự tạo folder của nó on demand dưới `specs/{domain}/{prd-slug}/`:
33
33
 
34
34
  ```
35
35
  specs/{domain}/{prd-slug}/
36
- ├── prd.md # /generate-prd
36
+ ├── {TICKET-ID}-{prd-slug}.md # /generate-prd (vd SEG01-segment-scoring-service.md)
37
37
  ├── bdd/ # /generate-bdd (file .feature)
38
38
  ├── tech-docs/ # /generate-tech-docs
39
39
  └── design-spec/ # /generate-design-spec (chỉ FE/App)
@@ -33,7 +33,7 @@ tự tạo folder của nó on demand dưới `specs/{domain}/{prd-slug}/`:
33
33
 
34
34
  ```
35
35
  specs/{domain}/{prd-slug}/
36
- ├── prd.md # /generate-prd
36
+ ├── {TICKET-ID}-{prd-slug}.md # /generate-prd (vd SEG01-segment-scoring-service.md)
37
37
  ├── bdd/ # /generate-bdd (file .feature)
38
38
  ├── tech-docs/ # /generate-tech-docs
39
39
  └── design-spec/ # /generate-design-spec (chỉ FE/App)
@@ -12,7 +12,7 @@ Skill này xử lý hai lệnh: `/generate-bdd` để tạo file BDD feature, v
12
12
 
13
13
  ### Gate
14
14
 
15
- <!-- Directory: specs/*/*/prd.md -->
15
+ <!-- Directory: specs/*/*/*.md (file PRD ở gốc feature folder) -->
16
16
  # Gate — Quy trình vào chuẩn cho mọi lệnh
17
17
 
18
18
  Mọi lệnh PHẢI chạy gate này trước khi thực thi phần logic riêng của nó.
@@ -66,13 +66,13 @@ Hiển thị và chờ phản hồi:
66
66
  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.
67
67
  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/`):
68
68
  - **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 đó.
69
- - **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`.
69
+ - **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.)*
70
70
  - **Lệnh tech-docs**: `{specs_dir}/{domain}/*/tech-docs/{UC-ID}*-tech-design*.md`.
71
71
  - **Lệnh design-spec**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
72
72
 
73
73
  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.
74
74
  3. Nếu `$ARGUMENTS` rỗng hoặc không tìm thấy file khớp:
75
- - 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).
75
+ - 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).
76
76
  - Hiển thị danh sách cho người dùng và hỏi: "Bạn muốn làm việc với file nào? (Nhập số thứ tự hoặc tên file)"
77
77
  - Chờ người dùng chọn rồi mới tiếp tục.
78
78
 
@@ -129,7 +129,7 @@ Chờ xác nhận trước khi sinh file.
129
129
  Với mỗi UC, ghi `specs/{domain}/{prd-slug}/bdd/{UC-ID}-{slug}.feature`:
130
130
 
131
131
  ```gherkin
132
- # @trace.source=specs/{domain}/{prd-slug}/prd.md
132
+ # @trace.source=specs/{domain}/{prd-slug}/{TICKET-ID}-{prd-slug}.md
133
133
  # @trace.uc={UC-ID}
134
134
  Feature: {UC Name}
135
135
 
@@ -12,7 +12,7 @@ Skill này xử lý hai lệnh: `/generate-bdd` để tạo file BDD feature, v
12
12
 
13
13
  ### Gate
14
14
 
15
- <!-- Directory: specs/*/*/prd.md -->
15
+ <!-- Directory: specs/*/*/*.md (file PRD ở gốc feature folder) -->
16
16
  {{include:steps/gate.md}}
17
17
 
18
18
  Cũng verify: Kiểm tra PRD `Status` là `approved` (không phải `draft`).
@@ -42,7 +42,7 @@ Chờ xác nhận trước khi sinh file.
42
42
  Với mỗi UC, ghi `specs/{domain}/{prd-slug}/bdd/{UC-ID}-{slug}.feature`:
43
43
 
44
44
  ```gherkin
45
- # @trace.source=specs/{domain}/{prd-slug}/prd.md
45
+ # @trace.source=specs/{domain}/{prd-slug}/{TICKET-ID}-{prd-slug}.md
46
46
  # @trace.uc={UC-ID}
47
47
  Feature: {UC Name}
48
48
 
@@ -66,13 +66,13 @@ Hiển thị và chờ phản hồi:
66
66
  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.
67
67
  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/`):
68
68
  - **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 đó.
69
- - **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`.
69
+ - **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.)*
70
70
  - **Lệnh tech-docs**: `{specs_dir}/{domain}/*/tech-docs/{UC-ID}*-tech-design*.md`.
71
71
  - **Lệnh design-spec**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
72
72
 
73
73
  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.
74
74
  3. Nếu `$ARGUMENTS` rỗng hoặc không tìm thấy file khớp:
75
- - 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).
75
+ - 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).
76
76
  - Hiển thị danh sách cho người dùng và hỏi: "Bạn muốn làm việc với file nào? (Nhập số thứ tự hoặc tên file)"
77
77
  - Chờ người dùng chọn rồi mới tiếp tục.
78
78
 
@@ -367,7 +367,7 @@ Thực hiện các bước theo đúng thứ tự. Lưu mọi thứ vào bộ nh
367
367
  - `domains` → danh sách các business domain đang hoạt động
368
368
 
369
369
  **Paths (nếu có):**
370
- - `paths.specs_dir` → gốc của spec artifact — PRD, BDD, tech-docs, design-spec. Cấu trúc: `{specs_dir}/{domain}/{prd-slug}/{prd.md | bdd/ | tech-docs/ | design-spec/}`
370
+ - `paths.specs_dir` → gốc của spec artifact — PRD, BDD, tech-docs, design-spec. Cấu trúc: `{specs_dir}/{domain}/{prd-slug}/{ {TICKET-ID}-{prd-slug}.md | bdd/ | tech-docs/ | design-spec/}` (file PRD đặt tên `{TICKET-ID}-{prd-slug}.md`, là file `.md` duy nhất ở gốc feature folder)
371
371
  - `paths.refinement_dir` → thư mục output cho findings/review
372
372
  - `paths.qc_dir` → gốc artifact QC automation (hiện ở top-level, mỗi UC một thư mục con: `{qc_dir}/{UC-ID}/`)
373
373
  - `paths.qc_skills_dir` → nơi các lệnh qc-* nạp QC skill (mặc định bundled `.agent/skills/qc`; override sang repo/submodule riêng của team QC để bản nâng cấp framework không ghi đè)
@@ -393,7 +393,7 @@ Nếu không có section `paths`, dùng các giá trị mặc định:
393
393
  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.
394
394
 
395
395
  **Cách trích xuất `prd_slug` (đúng cho MỌI target file, bất kể độ sâu lồng nhau):** với một path target dạng `{specs_dir}/{domain}/{prd-slug}/...`, lấy **segment path đầu tiên sau `{specs_dir}/{domain}/`** — tức vị trí `{prd-slug}`. KHÔNG dùng folder cha trực tiếp của file, 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ụ:
396
- - `specs/payment/create-invoice/prd.md` → `prd_slug = create-invoice`
396
+ - `specs/payment/create-invoice/PAY01-create-invoice.md` → `prd_slug = create-invoice`
397
397
  - `specs/payment/create-invoice/bdd/system/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `system`)*
398
398
  - `specs/payment/create-invoice/bdd/web/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `web`)*
399
399
  - `specs/payment/create-invoice/tech-docs/PAY-UC1-tech-design.md` → `prd_slug = create-invoice` *(KHÔNG phải `tech-docs`)*
@@ -414,7 +414,7 @@ Nếu có section `services`:
414
414
  **1. Phát hiện active domain** (theo thứ tự ưu tiên):
415
415
  - Đọc `@trace.domain` từ frontmatter của target file (nếu Gate đã nạp một target file)
416
416
  - Trích xuất từ path target file: `domain` = segment đầu tiên sau base path `specs_dir`; `prd_slug` = segment kế tiếp (folder feature-package). Điều này đúng ở mọi độ sâu target — xem quy tắc trích xuất `prd_slug` ở Bước 1.
417
- *(vd: `specs/user/create-account/prd.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
417
+ *(vd: `specs/user/create-account/USR01-create-account.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
418
418
  - Nếu `$ARGUMENTS` chứa một path, trích xuất segment domain sau `specs_dir`
419
419
 
420
420
  **2. Route tới service** — nếu active domain khớp với một key trong `services`:
@@ -846,7 +846,7 @@ Thực hiện các bước theo đúng thứ tự. Lưu mọi thứ vào bộ nh
846
846
  - `domains` → danh sách các business domain đang hoạt động
847
847
 
848
848
  **Paths (nếu có):**
849
- - `paths.specs_dir` → gốc của spec artifact — PRD, BDD, tech-docs, design-spec. Cấu trúc: `{specs_dir}/{domain}/{prd-slug}/{prd.md | bdd/ | tech-docs/ | design-spec/}`
849
+ - `paths.specs_dir` → gốc của spec artifact — PRD, BDD, tech-docs, design-spec. Cấu trúc: `{specs_dir}/{domain}/{prd-slug}/{ {TICKET-ID}-{prd-slug}.md | bdd/ | tech-docs/ | design-spec/}` (file PRD đặt tên `{TICKET-ID}-{prd-slug}.md`, là file `.md` duy nhất ở gốc feature folder)
850
850
  - `paths.refinement_dir` → thư mục output cho findings/review
851
851
  - `paths.qc_dir` → gốc artifact QC automation (hiện ở top-level, mỗi UC một thư mục con: `{qc_dir}/{UC-ID}/`)
852
852
  - `paths.qc_skills_dir` → nơi các lệnh qc-* nạp QC skill (mặc định bundled `.agent/skills/qc`; override sang repo/submodule riêng của team QC để bản nâng cấp framework không ghi đè)
@@ -872,7 +872,7 @@ Nếu không có section `paths`, dùng các giá trị mặc định:
872
872
  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.
873
873
 
874
874
  **Cách trích xuất `prd_slug` (đúng cho MỌI target file, bất kể độ sâu lồng nhau):** với một path target dạng `{specs_dir}/{domain}/{prd-slug}/...`, lấy **segment path đầu tiên sau `{specs_dir}/{domain}/`** — tức vị trí `{prd-slug}`. KHÔNG dùng folder cha trực tiếp của file, 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ụ:
875
- - `specs/payment/create-invoice/prd.md` → `prd_slug = create-invoice`
875
+ - `specs/payment/create-invoice/PAY01-create-invoice.md` → `prd_slug = create-invoice`
876
876
  - `specs/payment/create-invoice/bdd/system/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `system`)*
877
877
  - `specs/payment/create-invoice/bdd/web/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `web`)*
878
878
  - `specs/payment/create-invoice/tech-docs/PAY-UC1-tech-design.md` → `prd_slug = create-invoice` *(KHÔNG phải `tech-docs`)*
@@ -893,7 +893,7 @@ Nếu có section `services`:
893
893
  **1. Phát hiện active domain** (theo thứ tự ưu tiên):
894
894
  - Đọc `@trace.domain` từ frontmatter của target file (nếu Gate đã nạp một target file)
895
895
  - Trích xuất từ path target file: `domain` = segment đầu tiên sau base path `specs_dir`; `prd_slug` = segment kế tiếp (folder feature-package). Điều này đúng ở mọi độ sâu target — xem quy tắc trích xuất `prd_slug` ở Bước 1.
896
- *(vd: `specs/user/create-account/prd.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
896
+ *(vd: `specs/user/create-account/USR01-create-account.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
897
897
  - Nếu `$ARGUMENTS` chứa một path, trích xuất segment domain sau `specs_dir`
898
898
 
899
899
  **2. Route tới service** — nếu active domain khớp với một key trong `services`:
@@ -33,7 +33,7 @@ Thực hiện các bước theo đúng thứ tự. Lưu mọi thứ vào bộ nh
33
33
  - `domains` → danh sách các business domain đang hoạt động
34
34
 
35
35
  **Paths (nếu có):**
36
- - `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/}`
36
+ - `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)
37
37
  - `paths.refinement_dir` → thư mục output cho findings/review
38
38
  - `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}/`)
39
39
  - `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 đè)
@@ -59,7 +59,7 @@ Nếu không có section `paths`, dùng các giá trị mặc định:
59
59
  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.
60
60
 
61
61
  **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ụ:
62
- - `specs/payment/create-invoice/prd.md` → `prd_slug = create-invoice`
62
+ - `specs/payment/create-invoice/PAY01-create-invoice.md` → `prd_slug = create-invoice`
63
63
  - `specs/payment/create-invoice/bdd/system/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `system`)*
64
64
  - `specs/payment/create-invoice/bdd/web/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `web`)*
65
65
  - `specs/payment/create-invoice/tech-docs/PAY-UC1-tech-design.md` → `prd_slug = create-invoice` *(KHÔNG phải `tech-docs`)*
@@ -80,7 +80,7 @@ Nếu có section `services`:
80
80
  **1. Phát hiện active domain** (theo thứ tự ưu tiên):
81
81
  - Đọc `@trace.domain` từ frontmatter của target file (nếu Gate đã nạp một target file)
82
82
  - 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.
83
- *(vd: `specs/user/create-account/prd.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
83
+ *(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`)*
84
84
  - Nếu `$ARGUMENTS` chứa một path, trích xuất segment domain sau `specs_dir`
85
85
 
86
86
  **2. Route tới service** — nếu active domain khớp với một key trong `services`:
package/steps/gate.md CHANGED
@@ -51,13 +51,13 @@ Hiển thị và chờ phản hồi:
51
51
  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.
52
52
  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/`):
53
53
  - **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 đó.
54
- - **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`.
54
+ - **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.)*
55
55
  - **Lệnh tech-docs**: `{specs_dir}/{domain}/*/tech-docs/{UC-ID}*-tech-design*.md`.
56
56
  - **Lệnh design-spec**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
57
57
 
58
58
  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.
59
59
  3. Nếu `$ARGUMENTS` rỗng hoặc không tìm thấy file khớp:
60
- - 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).
60
+ - 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).
61
61
  - 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)"
62
62
  - Chờ người dùng chọn rồi mới tiếp tục.
63
63
 
@@ -16,8 +16,8 @@
16
16
 
17
17
  CROSS-REFERENCE (BẮT BUỘC): Bất kỳ chỗ nào nhắc đến một tính năng/ticket khác
18
18
  (pre-condition, business rule, giả định, AC, hay bất kỳ section nào) → PHẢI gắn inline link:
19
- [TICKET-ID](./TICKET-ID-slug.md)
20
- Không để TICKET-ID dạng plain text nếu tồn tại file PRD tương ứng.
19
+ [TICKET-ID khác](../{prd-slug-khác}/{TICKET-ID-khác}-{prd-slug-khác}.md)
20
+ Không để TICKET-ID dạng plain text nếu tồn tại file PRD tương ứng. (Mỗi PRD nằm trong feature-package riêng nên link trỏ sang folder anh em `../{prd-slug-khác}/`.)
21
21
  Ngoài ra, ghi rõ quan hệ phụ thuộc trong "Tài liệu tham khảo" ở Appendix.
22
22
 
23
23
  NEW TERM DETECTION: Nếu input PO xuất hiện thuật ngữ CHƯA CÓ trong business-dictionary.md
@@ -42,6 +42,7 @@
42
42
  | **Version** | 1.0 |
43
43
  | **Status** | draft |
44
44
  | **Author** | AI-assisted |
45
+ | **PO** | {tên PO} |
45
46
  | **Domain** | {domain} |
46
47
  | **Created** | {date} |
47
48
  | **Updated** | {date} |
@@ -150,7 +151,7 @@ flowchart TD
150
151
 
151
152
  ## Tài liệu tham khảo
152
153
 
153
- - [{TICKET liên quan}](./{file}.md) — {quan hệ: pre-condition / overlapping / related…}
154
+ - [{TICKET liên quan}](../{prd-slug-khác}/{TICKET-ID-khác}-{prd-slug-khác}.md) — {quan hệ: pre-condition / overlapping / related…}
154
155
  - Từ điển nghiệp vụ: `{path}/business-dictionary.md`
155
156
  - Domain knowledge: `{path}/{domain}.md`
156
157
 
@@ -197,6 +198,6 @@ _(Nếu không có độ vênh: ghi "Không có — toàn bộ nội dung đã
197
198
  <!--
198
199
  NEXT STEPS:
199
200
  Khi PRD được approve (status: approved), chạy:
200
- /generate-bdd "specs/{domain}/{prd-slug}/prd.md"
201
+ /generate-bdd "specs/{domain}/{prd-slug}/{TICKET-ID}-{prd-slug}.md"
201
202
  để sinh BDD feature specs từ PRD này.
202
203
  -->
@@ -25,7 +25,7 @@ project:
25
25
  # All paths are relative to workspace root.
26
26
  paths:
27
27
  # Feature-Package Layout:
28
- # specs/{domain}/{prd-slug}/prd.md — PRD document
28
+ # specs/{domain}/{prd-slug}/{TICKET-ID}-{prd-slug}.md — PRD document
29
29
  # specs/{domain}/{prd-slug}/bdd/ — BDD .feature files
30
30
  # specs/{domain}/{prd-slug}/tech-docs/ — Technical design docs
31
31
  # specs/{domain}/{prd-slug}/design-spec/ — Design specs (FE/App only)
@@ -39,7 +39,7 @@ paths:
39
39
  bdd_writing_guide: "specs/templates/bdd-writing-guide.md"
40
40
  trace_report: "specs/.trace/trace-report.md"
41
41
 
42
- # PRD template (PRDs are now at specs/{domain}/{prd-slug}/prd.md)
42
+ # PRD template (PRDs are at specs/{domain}/{prd-slug}/{TICKET-ID}-{prd-slug}.md)
43
43
  prd_template: "specs/templates/prd.template.md"
44
44
  refinement_dir: ".agent/review"
45
45