@educa-corp/sdd-framework 0.2.7 → 0.2.9

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.
package/bin/build.js CHANGED
@@ -215,6 +215,23 @@ for (const { src, dest, filter } of coreMappings) {
215
215
  fs.writeFileSync(path.join(CORE_DIR, 'FRAMEWORK_VERSION'), VERSION + '\n', 'utf8');
216
216
  console.log(` ✅ core/FRAMEWORK_VERSION (v${VERSION})`);
217
217
 
218
+ // ── 4. Sync local dogfood .agent/ (dev repo only) ────────────────────────────
219
+ //
220
+ // In THIS framework repo, .agent/ is a pure mirror of core/ used to dogfood the
221
+ // framework on itself. Consumers never run build.js (they get core/ from the npm
222
+ // package and run `--init`), so this block only affects the dev checkout.
223
+ // Guard on existence: only refresh if .agent/ is already present — do NOT create
224
+ // it here (that's --init's job, which also generates .claude/ shortcuts). This is
225
+ // an overlay merge (adds new files like a newly-added module, overwrites changed
226
+ // ones); to prune files removed from core, run `npm run dev` (build + --init).
227
+ const AGENT_DIR = path.join(ROOT, '.agent');
228
+ if (fs.existsSync(AGENT_DIR)) {
229
+ console.log('');
230
+ console.log('Syncing local dogfood .agent/ from core/ ...');
231
+ copyDirToCore(CORE_DIR, AGENT_DIR, null);
232
+ console.log(' ✅ .agent/ (mirrored from core/)');
233
+ }
234
+
218
235
  // ── Summary ───────────────────────────────────────────────────────────────────
219
236
 
220
237
  const total = allSucceeded + allFailed;
package/bin/index.js CHANGED
@@ -46,6 +46,7 @@ const AVAILABLE_MODULES = [
46
46
  'java-spring', 'angular', 'react', 'nextjs',
47
47
  'dotnet', 'golang', 'php-laravel', 'context-engineering',
48
48
  'flutter', 'react-native', 'ios-swiftui', 'android-compose',
49
+ 'phaser-game',
49
50
  ];
50
51
 
51
52
  // Language/framework labels per module (for generated project-context.yaml)
@@ -64,6 +65,7 @@ const MODULE_STACK = {
64
65
  'react-native': { language: 'TypeScript', framework: 'React Native / Expo' },
65
66
  'ios-swiftui': { language: 'Swift', framework: 'SwiftUI' },
66
67
  'android-compose': { language: 'Kotlin', framework: 'Jetpack Compose' },
68
+ 'phaser-game': { language: 'TypeScript', framework: 'Phaser 3' },
67
69
  };
68
70
 
69
71
  if (showHelp) {
@@ -484,6 +484,27 @@ Các từ như `cờ / flag`, `biến / trường / field`, `giá trị / value`
484
484
  **Checklist (dùng ở Quality Checklist của lệnh):** 0 thuật ngữ kỹ thuật/UI (re-render, UI, timeout, spinner, API/endpoint/token…) trong prose nghiệp vụ — đã diễn đạt lại (Nhóm 1) / chuyển Design Spec (Nhóm 2) / bỏ về Tech Docs (Nhóm 3); 0 ẩn dụ dữ liệu cho trạng thái đã có tên nghiệp vụ (cờ/giá trị/đọc-ghi khi là artifact — Nhóm 4) và 0 backtick bọc giá trị nghiệp vụ.
485
485
 
486
486
 
487
+ ---
488
+
489
+ ## Discovery Contract *(đọc trước — quyết định cách xử lý input của PO)*
490
+
491
+ Lệnh này là **khai vấn (discovery)**, KHÔNG phải thu thập dữ liệu. Giá trị nằm ở **quá trình hỏi** — nó ép PO nói ra những gì chưa viết (edge case, out-of-scope, phụ thuộc, rule mâu thuẫn). Vì vậy:
492
+
493
+ > **Input của PO là NGUYÊN LIỆU THÔ, KHÔNG phải câu trả lời thay thế phỏng vấn.**
494
+ > Dù PO dán tài liệu dày cỡ nào — **vẫn đi hết Phase 1→7, mọi CHECKPOINT vẫn phải nổ.** TUYỆT ĐỐI KHÔNG coi input là "đã trả lời" rồi nhảy phase. Đây là điểm khác biệt cốt lõi so với các lệnh thu thập dữ kiện (generate-code/architecture "vét nguồn rồi mới hỏi") — ở discovery, **không có luật skip-if-answered.**
495
+
496
+ **Cơ chế Confirm-vs-Ask** *(áp cho mọi câu hỏi ở Phase 1–6)*:
497
+ - **Item input ĐÃ phủ** → KHÔNG skip. Trình bản nháp đã trích, đánh dấu `🤖 trích từ input` và hỏi PO **xác nhận / sửa / bổ sung**:
498
+ ```
499
+ 🤖 Trích từ input: "{nội dung AI hiểu được}"
500
+ → Đúng chưa? Cần sửa/bổ sung gì không?
501
+ ```
502
+ Chỉ khi PO chốt mới nâng dấu thành `✅ PO xác nhận` và đi tiếp.
503
+ - **Item input CHƯA phủ** → hỏi mới bình thường.
504
+ - **Nghịch lý độ dày:** input càng dày → GAP tiềm ẩn càng nhiều (đó là thứ PO *chưa nghĩ tới*), nên phần soi hở ở **Phase 3 càng phải sâu**, KHÔNG được rút ngắn. Input dày tạo *ảo giác đủ* — đừng mắc bẫy.
505
+
506
+ **Phân biệt dấu (bắt buộc, để chống blitz):** trong file output, mỗi dữ kiện mang một trong hai dấu — `✅ PO xác nhận` (PO đã chốt trực tiếp) hoặc `🤖 AI trích — chờ PO chốt`. Một phase CHỈ được đóng khi mọi item của nó mang dấu `✅`. Không tự nâng `🤖`→`✅` thay PO.
507
+
487
508
  ---
488
509
 
489
510
  ## Phase 0 — Knowledge Sync *(AI tự điền — bối cảnh hệ thống, KHÔNG phải yêu cầu nghiệp vụ; không cần input PO)*
@@ -514,6 +535,8 @@ Lưu bản đồ thuật ngữ này vào file product-definition output dưới
514
535
 
515
536
  Hỏi **lần lượt từng câu một**, đợi PO trả lời rồi mới hỏi câu kế. Giữ giọng nghiệp vụ, thân thiện; nếu PO lúng túng, đưa một ví dụ ngắn để gợi ý. Tránh hỏi về giải pháp kỹ thuật ở phase này.
516
537
 
538
+ > **Áp Confirm-vs-Ask (Discovery Contract):** với câu mà input PO đã phủ, ĐỪNG bỏ qua — trình bản nháp `🤖 trích từ input` rồi hỏi PO xác nhận/sửa/bổ sung; câu chưa phủ thì hỏi mới. Mọi câu 1–8 đều phải có một cú chạm xác nhận của PO trước khi tóm tắt.
539
+
517
540
  1. **Context**: Bối cảnh / lý do vì sao cần feature này?
518
541
  2. **Problem**: Vấn đề cụ thể cần giải quyết?
519
542
  3. **Goal**: Khi feature chạy ổn, kết quả nghiệp vụ bạn muốn thấy là gì? Mô tả *thành quả*, chưa cần cách làm.
@@ -532,6 +555,8 @@ Sau câu 8 → **tóm tắt lại toàn bộ** cho PO → chờ xác nhận →
532
555
 
533
556
  ## Phase 2 — User Flow Definition *(CHECKPOINT 2)*
534
557
 
558
+ > **Áp Confirm-vs-Ask (Discovery Contract):** input phủ bước nào → trình bản nháp `🤖 trích từ input` để PO xác nhận/sửa; bước nào input im lặng (đặc biệt Edge Cases) → hỏi mới, KHÔNG tự bịa cho đủ bảng.
559
+
535
560
  Hỏi:
536
561
  1. **Entry Point**: Người dùng bắt đầu tương tác với feature này ở đâu?
537
562
  2. **Flow Steps**: Mô tả từng bước (dùng bảng):
@@ -553,6 +578,14 @@ Xác nhận → ghi `✅ PO xác nhận: Có` → tiếp tục.
553
578
 
554
579
  Dựa trên Phase 1-2, AI xác định gap và hỏi các câu follow-up. Tiếp tục các vòng cho tới khi không còn Mục chưa giải quyết.
555
580
 
581
+ > **BẮT BUỘC chạy ≥1 vòng — KHÔNG được bỏ qua kể cả khi input rất dày.** Đây là nơi bắt GAP mà PO *chưa nghĩ tới*, nên độ dày input KHÔNG làm giảm nhu cầu hỏi — mà **làm tăng**. AI phải chủ động thách thức các **vùng input im lặng**, tối thiểu soi 4 nhóm:
582
+ > 1. **Edge case / luồng lỗi** chưa được nêu (input thiếu, điều kiện không thoả, thao tác đồng thời).
583
+ > 2. **Out-of-scope mơ hồ** — ranh giới ticket chưa rõ, dễ phình phạm vi.
584
+ > 3. **Phụ thuộc liên service** input ngầm giả định nhưng chưa xác nhận (dữ liệu/năng lực từ team khác).
585
+ > 4. **Rule mâu thuẫn / chồng chéo** giữa các phát biểu trong input.
586
+ >
587
+ > Với mỗi item `🤖 AI trích — chờ PO chốt` còn sót từ Phase 1–2 → gom vào đây để PO chốt dứt điểm. **Không được nâng dấu `🤖`→`✅` thay PO.**
588
+
556
589
  ```
557
590
  ### Vòng {N}
558
591
  | # | Nhóm | Câu hỏi | PO trả lời |
@@ -645,6 +678,7 @@ Ghi `{paths.product_definitions_dir}/{TICKET-ID}-{slug}.md` theo `templates/prod
645
678
 
646
679
  **Cập nhật Metadata theo tiến độ (cho phép resume):**
647
680
  - Sau mỗi CHECKPOINT phase được chốt (`✅ PO xác nhận: Có`, hoặc với Phase 3 là `✅ CHECKPOINT 3: Không còn mục tồn đọng`) → cập nhật `Completed Phase` = số phase vừa xong và giữ `Status: in-progress`.
681
+ - **Chống blitz:** một phase CHỈ được tính là chốt khi mọi item của nó mang dấu `✅ PO xác nhận` — nếu còn bất kỳ item `🤖 AI trích — chờ PO chốt` nào, phase đó CHƯA xong, KHÔNG được tăng `Completed Phase`.
648
682
  - Khi Phase 7 pass mà không còn GAP → đặt `Completed Phase: 7` và `Status: completed`.
649
683
  - Nếu discovery bị ngắt giữa chừng, file vẫn được ghi với `Completed Phase` phản ánh phase cao nhất đã xác nhận — buổi sau resume tiếp từ phase kế tiếp.
650
684
 
@@ -15,6 +15,27 @@
15
15
 
16
16
  ---
17
17
 
18
+ ## Discovery Contract *(đọc trước — quyết định cách xử lý input của PO)*
19
+
20
+ Lệnh này là **khai vấn (discovery)**, KHÔNG phải thu thập dữ liệu. Giá trị nằm ở **quá trình hỏi** — nó ép PO nói ra những gì chưa viết (edge case, out-of-scope, phụ thuộc, rule mâu thuẫn). Vì vậy:
21
+
22
+ > **Input của PO là NGUYÊN LIỆU THÔ, KHÔNG phải câu trả lời thay thế phỏng vấn.**
23
+ > Dù PO dán tài liệu dày cỡ nào — **vẫn đi hết Phase 1→7, mọi CHECKPOINT vẫn phải nổ.** TUYỆT ĐỐI KHÔNG coi input là "đã trả lời" rồi nhảy phase. Đây là điểm khác biệt cốt lõi so với các lệnh thu thập dữ kiện (generate-code/architecture "vét nguồn rồi mới hỏi") — ở discovery, **không có luật skip-if-answered.**
24
+
25
+ **Cơ chế Confirm-vs-Ask** *(áp cho mọi câu hỏi ở Phase 1–6)*:
26
+ - **Item input ĐÃ phủ** → KHÔNG skip. Trình bản nháp đã trích, đánh dấu `🤖 trích từ input` và hỏi PO **xác nhận / sửa / bổ sung**:
27
+ ```
28
+ 🤖 Trích từ input: "{nội dung AI hiểu được}"
29
+ → Đúng chưa? Cần sửa/bổ sung gì không?
30
+ ```
31
+ Chỉ khi PO chốt mới nâng dấu thành `✅ PO xác nhận` và đi tiếp.
32
+ - **Item input CHƯA phủ** → hỏi mới bình thường.
33
+ - **Nghịch lý độ dày:** input càng dày → GAP tiềm ẩn càng nhiều (đó là thứ PO *chưa nghĩ tới*), nên phần soi hở ở **Phase 3 càng phải sâu**, KHÔNG được rút ngắn. Input dày tạo *ảo giác đủ* — đừng mắc bẫy.
34
+
35
+ **Phân biệt dấu (bắt buộc, để chống blitz):** trong file output, mỗi dữ kiện mang một trong hai dấu — `✅ PO xác nhận` (PO đã chốt trực tiếp) hoặc `🤖 AI trích — chờ PO chốt`. Một phase CHỈ được đóng khi mọi item của nó mang dấu `✅`. Không tự nâng `🤖`→`✅` thay PO.
36
+
37
+ ---
38
+
18
39
  ## Phase 0 — Knowledge Sync *(AI tự điền — bối cảnh hệ thống, KHÔNG phải yêu cầu nghiệp vụ; không cần input PO)*
19
40
 
20
41
  AI quét dự án và ghi:
@@ -43,6 +64,8 @@ Lưu bản đồ thuật ngữ này vào file product-definition output dưới
43
64
 
44
65
  Hỏi **lần lượt từng câu một**, đợi PO trả lời rồi mới hỏi câu kế. Giữ giọng nghiệp vụ, thân thiện; nếu PO lúng túng, đưa một ví dụ ngắn để gợi ý. Tránh hỏi về giải pháp kỹ thuật ở phase này.
45
66
 
67
+ > **Áp Confirm-vs-Ask (Discovery Contract):** với câu mà input PO đã phủ, ĐỪNG bỏ qua — trình bản nháp `🤖 trích từ input` rồi hỏi PO xác nhận/sửa/bổ sung; câu chưa phủ thì hỏi mới. Mọi câu 1–8 đều phải có một cú chạm xác nhận của PO trước khi tóm tắt.
68
+
46
69
  1. **Context**: Bối cảnh / lý do vì sao cần feature này?
47
70
  2. **Problem**: Vấn đề cụ thể cần giải quyết?
48
71
  3. **Goal**: Khi feature chạy ổn, kết quả nghiệp vụ bạn muốn thấy là gì? Mô tả *thành quả*, chưa cần cách làm.
@@ -61,6 +84,8 @@ Sau câu 8 → **tóm tắt lại toàn bộ** cho PO → chờ xác nhận →
61
84
 
62
85
  ## Phase 2 — User Flow Definition *(CHECKPOINT 2)*
63
86
 
87
+ > **Áp Confirm-vs-Ask (Discovery Contract):** input phủ bước nào → trình bản nháp `🤖 trích từ input` để PO xác nhận/sửa; bước nào input im lặng (đặc biệt Edge Cases) → hỏi mới, KHÔNG tự bịa cho đủ bảng.
88
+
64
89
  Hỏi:
65
90
  1. **Entry Point**: Người dùng bắt đầu tương tác với feature này ở đâu?
66
91
  2. **Flow Steps**: Mô tả từng bước (dùng bảng):
@@ -82,6 +107,14 @@ Xác nhận → ghi `✅ PO xác nhận: Có` → tiếp tục.
82
107
 
83
108
  Dựa trên Phase 1-2, AI xác định gap và hỏi các câu follow-up. Tiếp tục các vòng cho tới khi không còn Mục chưa giải quyết.
84
109
 
110
+ > **BẮT BUỘC chạy ≥1 vòng — KHÔNG được bỏ qua kể cả khi input rất dày.** Đây là nơi bắt GAP mà PO *chưa nghĩ tới*, nên độ dày input KHÔNG làm giảm nhu cầu hỏi — mà **làm tăng**. AI phải chủ động thách thức các **vùng input im lặng**, tối thiểu soi 4 nhóm:
111
+ > 1. **Edge case / luồng lỗi** chưa được nêu (input thiếu, điều kiện không thoả, thao tác đồng thời).
112
+ > 2. **Out-of-scope mơ hồ** — ranh giới ticket chưa rõ, dễ phình phạm vi.
113
+ > 3. **Phụ thuộc liên service** input ngầm giả định nhưng chưa xác nhận (dữ liệu/năng lực từ team khác).
114
+ > 4. **Rule mâu thuẫn / chồng chéo** giữa các phát biểu trong input.
115
+ >
116
+ > Với mỗi item `🤖 AI trích — chờ PO chốt` còn sót từ Phase 1–2 → gom vào đây để PO chốt dứt điểm. **Không được nâng dấu `🤖`→`✅` thay PO.**
117
+
85
118
  ```
86
119
  ### Vòng {N}
87
120
  | # | Nhóm | Câu hỏi | PO trả lời |
@@ -174,6 +207,7 @@ Ghi `{paths.product_definitions_dir}/{TICKET-ID}-{slug}.md` theo `templates/prod
174
207
 
175
208
  **Cập nhật Metadata theo tiến độ (cho phép resume):**
176
209
  - Sau mỗi CHECKPOINT phase được chốt (`✅ PO xác nhận: Có`, hoặc với Phase 3 là `✅ CHECKPOINT 3: Không còn mục tồn đọng`) → cập nhật `Completed Phase` = số phase vừa xong và giữ `Status: in-progress`.
210
+ - **Chống blitz:** một phase CHỈ được tính là chốt khi mọi item của nó mang dấu `✅ PO xác nhận` — nếu còn bất kỳ item `🤖 AI trích — chờ PO chốt` nào, phase đó CHƯA xong, KHÔNG được tăng `Completed Phase`.
177
211
  - Khi Phase 7 pass mà không còn GAP → đặt `Completed Phase: 7` và `Status: completed`.
178
212
  - Nếu discovery bị ngắt giữa chừng, file vẫn được ghi với `Completed Phase` phản ánh phase cao nhất đã xác nhận — buổi sau resume tiếp từ phase kế tiếp.
179
213
 
@@ -1 +1 @@
1
- 0.2.7
1
+ 0.2.9
@@ -484,6 +484,27 @@ Các từ như `cờ / flag`, `biến / trường / field`, `giá trị / value`
484
484
  **Checklist (dùng ở Quality Checklist của lệnh):** 0 thuật ngữ kỹ thuật/UI (re-render, UI, timeout, spinner, API/endpoint/token…) trong prose nghiệp vụ — đã diễn đạt lại (Nhóm 1) / chuyển Design Spec (Nhóm 2) / bỏ về Tech Docs (Nhóm 3); 0 ẩn dụ dữ liệu cho trạng thái đã có tên nghiệp vụ (cờ/giá trị/đọc-ghi khi là artifact — Nhóm 4) và 0 backtick bọc giá trị nghiệp vụ.
485
485
 
486
486
 
487
+ ---
488
+
489
+ ## Discovery Contract *(đọc trước — quyết định cách xử lý input của PO)*
490
+
491
+ Lệnh này là **khai vấn (discovery)**, KHÔNG phải thu thập dữ liệu. Giá trị nằm ở **quá trình hỏi** — nó ép PO nói ra những gì chưa viết (edge case, out-of-scope, phụ thuộc, rule mâu thuẫn). Vì vậy:
492
+
493
+ > **Input của PO là NGUYÊN LIỆU THÔ, KHÔNG phải câu trả lời thay thế phỏng vấn.**
494
+ > Dù PO dán tài liệu dày cỡ nào — **vẫn đi hết Phase 1→7, mọi CHECKPOINT vẫn phải nổ.** TUYỆT ĐỐI KHÔNG coi input là "đã trả lời" rồi nhảy phase. Đây là điểm khác biệt cốt lõi so với các lệnh thu thập dữ kiện (generate-code/architecture "vét nguồn rồi mới hỏi") — ở discovery, **không có luật skip-if-answered.**
495
+
496
+ **Cơ chế Confirm-vs-Ask** *(áp cho mọi câu hỏi ở Phase 1–6)*:
497
+ - **Item input ĐÃ phủ** → KHÔNG skip. Trình bản nháp đã trích, đánh dấu `🤖 trích từ input` và hỏi PO **xác nhận / sửa / bổ sung**:
498
+ ```
499
+ 🤖 Trích từ input: "{nội dung AI hiểu được}"
500
+ → Đúng chưa? Cần sửa/bổ sung gì không?
501
+ ```
502
+ Chỉ khi PO chốt mới nâng dấu thành `✅ PO xác nhận` và đi tiếp.
503
+ - **Item input CHƯA phủ** → hỏi mới bình thường.
504
+ - **Nghịch lý độ dày:** input càng dày → GAP tiềm ẩn càng nhiều (đó là thứ PO *chưa nghĩ tới*), nên phần soi hở ở **Phase 3 càng phải sâu**, KHÔNG được rút ngắn. Input dày tạo *ảo giác đủ* — đừng mắc bẫy.
505
+
506
+ **Phân biệt dấu (bắt buộc, để chống blitz):** trong file output, mỗi dữ kiện mang một trong hai dấu — `✅ PO xác nhận` (PO đã chốt trực tiếp) hoặc `🤖 AI trích — chờ PO chốt`. Một phase CHỈ được đóng khi mọi item của nó mang dấu `✅`. Không tự nâng `🤖`→`✅` thay PO.
507
+
487
508
  ---
488
509
 
489
510
  ## Phase 0 — Knowledge Sync *(AI tự điền — bối cảnh hệ thống, KHÔNG phải yêu cầu nghiệp vụ; không cần input PO)*
@@ -514,6 +535,8 @@ Lưu bản đồ thuật ngữ này vào file product-definition output dưới
514
535
 
515
536
  Hỏi **lần lượt từng câu một**, đợi PO trả lời rồi mới hỏi câu kế. Giữ giọng nghiệp vụ, thân thiện; nếu PO lúng túng, đưa một ví dụ ngắn để gợi ý. Tránh hỏi về giải pháp kỹ thuật ở phase này.
516
537
 
538
+ > **Áp Confirm-vs-Ask (Discovery Contract):** với câu mà input PO đã phủ, ĐỪNG bỏ qua — trình bản nháp `🤖 trích từ input` rồi hỏi PO xác nhận/sửa/bổ sung; câu chưa phủ thì hỏi mới. Mọi câu 1–8 đều phải có một cú chạm xác nhận của PO trước khi tóm tắt.
539
+
517
540
  1. **Context**: Bối cảnh / lý do vì sao cần feature này?
518
541
  2. **Problem**: Vấn đề cụ thể cần giải quyết?
519
542
  3. **Goal**: Khi feature chạy ổn, kết quả nghiệp vụ bạn muốn thấy là gì? Mô tả *thành quả*, chưa cần cách làm.
@@ -532,6 +555,8 @@ Sau câu 8 → **tóm tắt lại toàn bộ** cho PO → chờ xác nhận →
532
555
 
533
556
  ## Phase 2 — User Flow Definition *(CHECKPOINT 2)*
534
557
 
558
+ > **Áp Confirm-vs-Ask (Discovery Contract):** input phủ bước nào → trình bản nháp `🤖 trích từ input` để PO xác nhận/sửa; bước nào input im lặng (đặc biệt Edge Cases) → hỏi mới, KHÔNG tự bịa cho đủ bảng.
559
+
535
560
  Hỏi:
536
561
  1. **Entry Point**: Người dùng bắt đầu tương tác với feature này ở đâu?
537
562
  2. **Flow Steps**: Mô tả từng bước (dùng bảng):
@@ -553,6 +578,14 @@ Xác nhận → ghi `✅ PO xác nhận: Có` → tiếp tục.
553
578
 
554
579
  Dựa trên Phase 1-2, AI xác định gap và hỏi các câu follow-up. Tiếp tục các vòng cho tới khi không còn Mục chưa giải quyết.
555
580
 
581
+ > **BẮT BUỘC chạy ≥1 vòng — KHÔNG được bỏ qua kể cả khi input rất dày.** Đây là nơi bắt GAP mà PO *chưa nghĩ tới*, nên độ dày input KHÔNG làm giảm nhu cầu hỏi — mà **làm tăng**. AI phải chủ động thách thức các **vùng input im lặng**, tối thiểu soi 4 nhóm:
582
+ > 1. **Edge case / luồng lỗi** chưa được nêu (input thiếu, điều kiện không thoả, thao tác đồng thời).
583
+ > 2. **Out-of-scope mơ hồ** — ranh giới ticket chưa rõ, dễ phình phạm vi.
584
+ > 3. **Phụ thuộc liên service** input ngầm giả định nhưng chưa xác nhận (dữ liệu/năng lực từ team khác).
585
+ > 4. **Rule mâu thuẫn / chồng chéo** giữa các phát biểu trong input.
586
+ >
587
+ > Với mỗi item `🤖 AI trích — chờ PO chốt` còn sót từ Phase 1–2 → gom vào đây để PO chốt dứt điểm. **Không được nâng dấu `🤖`→`✅` thay PO.**
588
+
556
589
  ```
557
590
  ### Vòng {N}
558
591
  | # | Nhóm | Câu hỏi | PO trả lời |
@@ -645,6 +678,7 @@ Ghi `{paths.product_definitions_dir}/{TICKET-ID}-{slug}.md` theo `templates/prod
645
678
 
646
679
  **Cập nhật Metadata theo tiến độ (cho phép resume):**
647
680
  - Sau mỗi CHECKPOINT phase được chốt (`✅ PO xác nhận: Có`, hoặc với Phase 3 là `✅ CHECKPOINT 3: Không còn mục tồn đọng`) → cập nhật `Completed Phase` = số phase vừa xong và giữ `Status: in-progress`.
681
+ - **Chống blitz:** một phase CHỈ được tính là chốt khi mọi item của nó mang dấu `✅ PO xác nhận` — nếu còn bất kỳ item `🤖 AI trích — chờ PO chốt` nào, phase đó CHƯA xong, KHÔNG được tăng `Completed Phase`.
648
682
  - Khi Phase 7 pass mà không còn GAP → đặt `Completed Phase: 7` và `Status: completed`.
649
683
  - Nếu discovery bị ngắt giữa chừng, file vẫn được ghi với `Completed Phase` phản ánh phase cao nhất đã xác nhận — buổi sau resume tiếp từ phase kế tiếp.
650
684