@educa-corp/sdd-framework 0.2.5 → 0.2.6

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.
@@ -209,6 +209,8 @@ Trước khi finalize/append doc, **tự phản biện bản nháp** qua 4 cổn
209
209
  **Cổng 2 — GAP-or-FLAG (trung thực, không bịa).**
210
210
  Cần một type/giá trị/policy (auth, config, event, error code) mà **không có nguồn** → **không** chép hình dạng ở boundary, **không** bịa: ghi `[GAP]` hoặc `[ASSUMPTION: {owner} confirm]`. Nếu doc định thiết kế endpoint/flow mà **BDD không định nghĩa nghiệp vụ** (design vượt BDD) → khai GAP + escalate, đừng âm thầm hợp thức hoá.
211
211
 
212
+ **Cổng 2b — Client integration (§4.5.4) cũng phải đủ, không chỉ contract BE.** Với MỖI client method mà một màn hình/UC cần, §4.5.4 phải map đủ: **endpoint thật ở §4.1 · nguồn field request/response · error→UI**. Bất kỳ mảnh nào không suy được từ nguồn → khai `[GAP]` + một dòng §12 (đừng để §4.5.4 khuyết một phần rồi lọt xuống `/generate-code --phase=integration` — đó chính là chỗ FE bị hỏi live). **Severity blocker (🔴)** nếu màn hình không render/hoạt động được khi thiếu mapping đó (→ giữ `@trace.status: in-review`, chặn code-gen tới khi đóng); non-blocker (🟢) nếu chỉ là chi tiết phụ đoán tạm được. Đối xứng với contract BE: front-load ẩn số client về tech-docs, đừng đẩy sang lúc wire adapter.
213
+
212
214
  **Cổng 3 — CATALOG (không hard-code).**
213
215
  Literal & constant rải rác như luật → gom lại: **generic envelope** (đừng typed-per-thing khi PRD-BR đã đưa hợp đồng chung) + bảng catalog (vd `signal_type × source`) + constants **đặt tên**. Fail nếu còn hằng số/enum inline chưa vào catalog.
214
216
 
@@ -1 +1 @@
1
- 0.2.5
1
+ 0.2.6
@@ -556,13 +556,25 @@ Phân giải design điều khiển adapter từ **tech-doc gộp của PRD** `{
556
556
  - **Mapping port→endpoint→DTO→error** (ưu tiên): §4.5.4 (API Integration Layer của platform này) — mỗi client method → endpoint có thật.
557
557
  - **Nguồn endpoint/shape**: §4.1 Endpoints + §4.2 Request-Response + §4.3 Error của cùng doc.
558
558
 
559
- Đọc `@trace.status` của doc. Nếu `draft` hoặc `in-review` cảnh báo:
560
- ```
561
- Tech design {TICKET-ID} (UC {UC-ID} / {platform}) đang {status}.
562
- Contract / mapping adapter cònthể đổi.
563
- Tiếp tục đảm bảo BE endpoint đã deploy hoặc confirm mapping thủ công.
564
- ```
565
- Nếu doc **thiếu §4.5.4** (client integration chưa được vẽ cho platform này)cảnh báo: "Chưa §4.5.4 cho {platform} fallback map trực tiếp từ §4.1 endpoint (mapping adapter được infer). Khuyến nghị: chạy `/generate-tech-docs {web|app .feature}` để bổ sung §4.5 trước."
559
+ **Client contract gate — DS4** *(chỉ `--phase=integration`; KHÔNG áp dụng `--phase=ui` — UI vẫn degrade êm qua mock).* Đối xứng với DS3 của BE: soi §4.5.4 **đủ chưa** cho UC/platform này *trước khi* wire adapter thật.
560
+
561
+ 1. **Xác định phạm vi cần:** các client method mà UC NÀY dùng — lấy từ §10 (định vị scenario của UC) → §4.5.4 rows / interface `{UC-ID}ApiPort` của mock adapter (`--phase=ui`).
562
+ 2. **Kiểm tính đủ của §4.5.4 cho từng method:** endpoint (resolve được ở §4.1) + map request + response→model + error→UI. *(Khác cảnh báo cũ: cái cũ chỉ bắt "thiếu HẲN §4.5.4"; DS4 bắt cả "thiếu MỘT PHẦN".)*
563
+ 3. **Phân loại (giống DS3):**
564
+ - **Đủ + `@trace.status: approved` + 0 🔴 blocker-GAP (§12) chạm §4.5.4/UC này** → dùng làm nguồn, KHÔNG hỏi.
565
+ - **`@trace.status` = `draft`/`in-review`, HOẶC §12 còn 🔴 blocker `open` chạm UC này**WARN (không chặn): "contract/mapping adapter chưa chốt / còn {n} blocker-GAP open đảm bảo BE endpoint đã deploy hoặc confirm mapping thủ công; thể rework khi §4.5.4 đổi."
566
+ - **Thiếu §4.5.4, HOẶC khuyết một phần cho method UC cần** →
567
+ a. Áp **SRC-CHAIN** (xem §Quy tắc nguồn giá trị) lấp phần thiếu từ nguồn khác (§4.1–4.3, PRD, BDD `Then`, core-entities, mock adapter đã sinh).
568
+ b. Phần SRC-CHAIN giải quyết được → tiếp tục.
569
+ c. Phần **thực sự còn trống** → **CHECKPOINT chặn mềm, GỘP mọi gap vào một lần** (mỗi gap ghi rõ "đã tìm ở: {nguồn}"):
570
+ ```
571
+ ⚠️ §4.5.4 chưa đủ cho {UC-ID}/{platform} — {n} mapping còn trống (đã vét SRC-CHAIN):
572
+ - {client method} → {thiếu gì: endpoint/field/error→UI}
573
+ Wire adapter thật với mapping chưa chốt sẽ phải rework.
574
+ Khuyến nghị (front-load): /generate-tech-docs {web|app .feature} → bổ sung §4.5.4 → /review-tech-docs.
575
+ Vẫn wire bây giờ? (Y = best-effort/giữ mock cho phần thiếu · N = dừng, đi hoàn thiện tech-docs)
576
+ ```
577
+ Chỉ tiếp khi Y. *(Đây là "tư thế BE": trỏ ngược tech-docs thay vì hỏi live từng câu.)*
566
578
  Định vị mock adapter có sẵn từ lần chạy `--phase=ui` (tìm `{UC-ID}MockApiAdapter` trong `{paths.src_dir}/{domain}/`).
567
579
  Nếu không tìm thấy → cảnh báo: "Không tìm thấy mock adapter — sinh real API adapter từ đầu dùng contract tech-doc."
568
580
 
@@ -842,7 +854,7 @@ Dựng mock từ `mock_source` đã phân giải ở Phase Detection — **shape
842
854
  *Bỏ qua hoàn toàn section này nếu `--phase` không phải `integration`.*
843
855
 
844
856
  1. **Đọc integration design.** Trong tech-doc gộp `{paths.tech_docs_dir}/{domain}/{prd-slug}/tech-docs/{TICKET-ID}-tech-design.md`: ưu tiên §4.5.4 (mapping port→endpoint→DTO→error của platform), dùng §4.1/§4.2/§4.3 làm nguồn endpoint / request-response / error-code. Nếu doc chưa có §4.5.4 cho platform này, trích endpoint + shape + error code trực tiếp từ §4.1–§4.3.
845
- - **Nếu §4/§4.5.4 thiếu bất kỳ chi tiết integration nào (endpoint, field/DTO, error-code, mapping):** ÁP DỤNG **SRC-CHAIN** (xem §Quy tắc nguồn giá trị) vét cạn PRD (Appendix Existing API Contract), design-spec, mệnh đề `Then` của System/platform BDD, `core-entities.md`, **mock adapter đã sinh ở `--phase=ui`** (shape port/DTO đã chốt — nguồn shape mạnh nhất, đừng bỏ quên), tech-doc anh em cùng domain — TRƯỚC khi coi là GAP. Skip-if-answered. Chỉ hỏi cái không nguồn nào có, **gộp mọi GAP còn lại vào MỘT checkpoint** (ghi rõ đã tìm ở đâu). *(Đây fix cho tình trạng phase=integration hỏi nhiều đáp án đã nằm trong tài liệu khác.)*
857
+ - **Tính đủ của §4.5.4 đã được cửa DS4 (Phase Detection) kiểm + vét SRC-CHAIN + gộp-hỏi TỪ TRƯỚC.** bước này dùng thẳng kết quả đã phân giải của DS4 **KHÔNG mở checkpoint/hỏi lại**. Nếu DS4 kết luận một mapping vẫn trống người đã chọn Y (best-effort) giữ mock cho đúng phần đó, tag `@trace.stub`, ghi sổ seam; đừng bịa giá trị.
846
858
  2. **Đọc mock adapter có sẵn** interface (`{UC-ID}ApiPort`) từ output `--phase=ui`. Real adapter implements **cùng** interface này → shape port/DTO đã cố định từ mock; **không hỏi lại shape** đã có ở đây.
847
859
  3. **Sinh real API adapter** tại `{paths.src_dir}/{domain}/{UC-ID}ApiAdapter.{ext}`:
848
860
  - Implements cùng interface `{UC-ID}ApiPort` như mock adapter