GATE-GD3D: PASS-WITH-FLAGS-10 — Đúng phương án D, khuôn nguyên vẹn (SHA-pair identical), import sạch; 0 blocker, nhưng `max-h` của khuôn vượt chiều cao Panel-3 trên InboxPage (~26px) đẻ 2 thanh cuộn lồng nhau + 2 class khuôn chết âm thầm. # Sub-reviewer gate GĐ3-D (S168, 2026-08-01) Scope: 3 file FE uncommitted, phương án D "cây thay chỗ Panel-3 khi chưa chọn HĐ". Spec nguồn: `.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-implfe-gd3.md` §1 bảng 4 phương án (D). Vai: reviewer đối-kháng, **propose-only** — không sửa code, không commit. --- ## Đo trước (baseline) - `git status --porcelain` toàn repo: 5 `M` — `.claude/WAL.md`, `.claude/agent-memory/memory-budget.json`, + 3 file FE. - `git status --porcelain --untracked-files=all -- fe-admin/src fe-user/src`: **ĐÚNG 3 file**, 0 untracked. - `git diff --stat`: mỗi file FE 13 dòng đổi (+6/−7), tổng 3 file. ## R1 — Đúng-D (điều kiện render) → **PASS** Cả 3 file giữ NGUYÊN cặp điều kiện: ``` {!selectedId && } {selectedId && detail.data && } ``` - Cây CHỈ render khi `!selectedId` — đúng D. - Chọn HĐ → `WorkflowHistoryPanel` như cũ; vế điều kiện **không đổi một ký tự**. - Trạng thái "đã chọn HĐ nhưng `detail` đang tải" render **RỖNG ở CẢ bản cũ lẫn bản mới** (bản cũ: `!selectedId` sai nên ô dashed tắt, `detail.data` chưa có nên panel trống) ⇒ hành vi loading giữa chừng KHÔNG đổi. - `currentStage={3}` đúng GĐ Hợp đồng cho cả 3 trang (xem F-10 cho lưu ý riêng về InboxPage). ## R2 — 0-đụng-khuôn → **PASS** `sha256sum` (16 ký tự đầu), fe-admin ⟂ fe-user: | File | admin | user | Kết quả | |---|---|---|---| | `components/pipeline/PipelineTreePanel.tsx` | `d70ac315bae485e6` | `d70ac315bae485e6` | IDENTICAL | | `components/pipeline/PipelineStageFolders.tsx` | `bed52f39d595c86a` | `bed52f39d595c86a` | IDENTICAL | | `hooks/usePipelineStages.ts` | `76e1823345d4e78b` | `76e1823345d4e78b` | IDENTICAL | `git status --porcelain` trên 4 đường dẫn khuôn = **RỖNG** ⇒ khuôn chưa bị sửa. SHA-pair identical vừa chứng mirror 2 app còn khớp, vừa chứng không ai chạm vào khuôn trong đợt này. ## R3 — Unused-import `X` → **PASS** - Cây làm việc: 0 hit mã ở cả 3 file. Hit duy nhất là chuỗi `type=X` trong comment `ContractsListPage.tsx:6` (không phải icon). - **Control-âm:** cùng regex chạy trên `git show HEAD:` cho **2 hit/file** (dòng `import … X …` + ``) ⇒ phép đo CÓ răng, không phải 0-hit vì regex hỏng. - Không gỡ nhầm icon khác: `FileText` / `Search` / `Plus` / `Inbox` / `AlertTriangle` / `Clock` / `ClipboardList` đều còn nguyên trong dòng import mới. --- ## FINDINGS ### F-1 (MAJOR) — R4: `max-h` của khuôn hiệu-chỉnh cho host page-flow, vượt chiều cao Panel-3 trên InboxPage ⇒ 2 thanh cuộn lồng nhau Chiều cao TỐI ĐA của khuôn khi đặt ở lg: | Thành phần | File:dòng | Lớp CSS | px | |---|---|---|---| | Đầu panel | `PipelineTreePanel.tsx:181` | `px-3 py-2.5` (20) + `icon-chip h-7!` (28) + `border-b` (1) | 49 | | Ô lọc | `PipelineTreePanel.tsx:204` | `p-2` (16) + `input h-8` (32) + `border-b` (1) | 49 | | Thân cây | `PipelineTreePanel.tsx:215` | `lg:max-h-[calc(100vh-16rem)]` | 100vh − 256 | | **Tổng** | | | **100vh − 158** | Chiều cao KHẢ DỤNG của Panel-3 = `100vh − 4rem` (vỏ trang) − đầu trang − dải phụ − `p-4` (32): | Trang | Vỏ / đầu trang | Đầu trang | Dải phụ | Khả dụng | So với 100vh−158 | |---|---|---|---|---|---| | `fe-user/src/pages/contracts/MyContractsPage.tsx` | `:105` / `:107` `py-3` + `Button size=md h-8` + border | 57px | 0 | 100vh − 153 | **thừa 5px** (khít) | | `fe-admin/src/pages/contracts/ContractsListPage.tsx` | `:106` / `:107` `py-3` + h1 24px + border | 49px | 0 | 100vh − 145 | **thừa 13px** | | `fe-user/src/pages/InboxPage.tsx` | `:166` / `:168` `py-3` + `StatPill` 34px (`:50` `px-3 py-1.5` + `h-5`) + border | 59px | **29px** — dải "Vai trò bạn đang xử lý" `:183-187` (`py-1.5` + `text-[11px]` + border) | 100vh − 184 | **THIẾU ~26px** | Hệ quả trên `/inbox`: `