# B1b SYNTHESIS — /fable-clone review 3-lens (lead refute + hợp nhất @S164)

> Input: `sub-reviewer-clone-l1-b1b.md` (20.715B, 15 finding 5H/9M/1L, FAIL) · `l2` (8.591B, 6/6 claim chịu-lực ĐÚNG + 6 finding 1H/4M/1L) · `l3` (19.557B, 20 finding 6H/8M/2L + 6 nghi-đã-bác, FAIL). 3/3 lane 0-empty (kỷ luật C2 khung-rỗng-trước ăn).

## VERDICT HỢP NHẤT: spec v1 FAIL — nền kỹ thuật VỮNG (lens2 6/6 chịu-lực ĐÚNG), vỏ spec THỦNG (coverage + acceptance). Vá được trọn bằng spec v2, không phải làm lại invest.

## Hội tụ cross-lane (tin cậy cao nhất)

1. **ADMIN-HIDE SAI HƯỚNG** (l1-F2 ⨯ l3-F1/F2 — 2 lane độc lập cùng bắt): "chừa System subtree" GIỮ nhầm `Workflows` (:1795) + `PeWorkflows` (:1798) = 2 mục owner ra lệnh ẨN (đều con System; AwV2 :1801 cũng con System ⇒ vế "+AwV2" tố cáo tác giả tưởng nó ngoài). + l3 điểm khuôn: đảo whitelist = đổi default-behavior menu-mới (fail-closed) — VƯỢT yêu cầu "ẩn mục cũ". **Fix v2: ẨN TẬP KEY TƯỜNG MINH (blacklist mở rộng), giữ default cũ; acceptance = liệt kê đúng N mục lá còn thấy.**
2. **Trục `ApprovalGroup` mồ côi 3 mặt** (l3-F3/F5/F6 ⨯ l1-F7): không chủ wave cho query-param · không backfill phiếu cũ (NULL = biến mất mọi folder — mirror bài `EvaluationType` không rỗng từ lúc tạo) · chủ cột chẻ đôi K2/K3. **Fix v2: K2 = CHỦ DUY NHẤT (cột + backfill=1 + query-param + FE param); K3 chỉ đọc; K4 tách a/b/c.**
3. **"8 designer" bốc hơi** (l1-F3 ⨯ l3-F10 ⨯ l2-F2): draft đòi 8, spec còn chữ "entry" không số; route designer chỉ nhận 3 code hardcode (`Layout.tsx:166-172`), leaf lạ RỚT IM LẶNG (#50). **Fix v2: K3 += 8 menu-con AwV2 + mở resolvePath + acceptance đếm 8.**

## Finding lens2 nặng nhất (mới, không lane nào khác thấy)

**l2-F1 HIGH — rào 1-PE-1-phiếu đang sống** (`ContractSigningPlanFeatures.cs:342-347` + picker `:1201-1202`): 1 PE có hạng mục thuộc >1 nhóm ⇒ phiếu nhóm 2 bị 409. "Phiếu per NHÓM" đòi đổi rào thành (PeId, ApprovalGroup). Đổi rào = đổi nghiệp vụ đã ship ⇒ **[OG-7 MỚI]** hỏi anh. FE tree ĐÃ chịu N-phiếu/PE (`usePipelineStages.ts:110-121` bucket mảng) — chỉ BE chặn.

## Lead refute (finding bị bác / resolve)

- **l1-F1 (nguồn K1 0-hit) — RESOLVED bằng đo đĩa của lead:** file `QUY_TRINH/QT TRINH KY HOP DONG TP-NCC.docx` CHÍNH LÀ SOL-CCM-SP-002.v01 (mã trong `word/header1.xml` — lane grep `document.xml` nên miss). NHƯNG bản đĩa = **6 trang, KHÔNG chứa bảng danh mục** (0 hit mọi marker; ảnh anh ghi "…/15") ⇒ nguồn K1 thật = **7 ảnh anh gửi (trang 5-9, trọn bảng 5.1+5.2)**; transcribe + **[OG-6 MỚI]** anh soát bảng seed trước land. Bài: lane đúng hiện tượng (đường dẫn draft không dùng được as-is), sai chẩn đoán (file có tồn tại).
- **l1 tự-bác 1 HIGH dự định** ("GĐ4 không có sidebar mirror" — `Hdc_*` 7 leaf có thật :1868) — giữ làm mẫu bác-có-chứng.
- **l3 bác 6 nghi** (48-leaf = nhân khuôn hợp lệ · ApprovalGroup = mirror EvaluationType · sub-folder = owner đòi · Menu eOffice trong vùng chừa · Distinct() có sẵn · ApprovedAmount có thật) — spec KHÔNG vi phạm luật khuôn ở chỗ dễ nghi nhất.
- **l2-F4**: `KhkkListItemDto` = FE type; BE thật = `ContractSigningPlanListItemDto` — sửa citation.
- **l2-F5 ⨯ l1-F8**: số đúng = **42 leaf MỚI + 7 group-key mới = 49 row menu mới; 48 leaf TỔNG** — sửa mọi chỗ.

## Bảng vá spec v2 (đủ 14 mục — traceability)

| # | Nguồn | Vá |
|---|---|---|
| 1 | l1-F2/l3-F1/F2 | QĐ7 → ẩn tập-key tường minh; acceptance liệt kê N mục lá |
| 2 | l1-F3/l3-F10/l2-F2 | K3 += 8 designer menu + resolvePath + đếm 8 |
| 3 | l1-F4/l3-F7 | OG nối vào DoD: PRE-gate K1←OG-6, K2←OG-1+OG-7, K3←OG-2(+LIVE verify) |
| 4 | l1-F5/l3-F18 | K2 += bất-biến tiền (Σ PeReferenceAmount trước==sau mig) + acceptance rà 16 consumer |
| 5 | l2-F1 | K2 += đổi rào (PeId)→(PeId,ApprovalGroup) + DoD "phiếu nhóm 2 cùng PE → 201" [OG-7] |
| 6 | l3-F3/F5/F6 | ApprovalGroup: K2 chủ duy nhất (cột+backfill=1+param); K4 tách a/b/c |
| 7 | l3-F4 | Khai thẳng: 8 nhóm = HIỂN THỊ, authz vẫn 1 bộ `KeHoachKyKet.*` per-action; authz-per-nhóm = wave riêng nếu anh muốn |
| 8 | l3-F11 | K7 RE-ĐO 3 nấc: cột/index ✓ (đã đo: có) · write-site (grep gán ContractId = 0 hiện tại) · test E2E |
| 9 | l3-F12 | "diff bundle fe-user=0" → `git diff --stat <base>..<head> -- fe-user/src` = 0 file (#69) |
| 10 | l3-F13 | K4 acceptance 2 chiều + bảng kỳ-vọng 13 role (seeder hiện phủ 7 vai — 6 vai còn lại phải khai kỳ vọng) |
| 11 | l3-F14/F15/F20 | K1 đối chứng ~85±5 giải trình · test có số ≥590+k · 3-file rule K1/K2 |
| 12 | l3-F16 | K8 += 3 dòng ZZTEST/HỐ-1/notification vào acceptance |
| 13 | l3-F17 | Byte-verify #77 CHỈ wave có FE-ship; BE-only = cicd + smoke API |
| 14 | l2-F3/F6 | K4 += leaf WfView/Create mang `?group=` (WfView lọc theo workflow Code nhóm) + site-3 `KhkkKeys()` (:2185) vào danh sách sửa |

END b1b-synthesis — 3 lane · 41 finding thô → 14 vá + 2 OG mới (OG-6 soát bảng, OG-7 rào 1-PE-N-phiếu) + 1 resolve (nguồn K1 = ảnh) + 1 sửa citation.
