diff --git a/.claude/WAL.md b/.claude/WAL.md index 32cec4a..2068fa8 100644 --- a/.claude/WAL.md +++ b/.claude/WAL.md @@ -45,9 +45,11 @@ chain: → cicd [ ] GĐ3 cây-4-folder ĐỒNG-NHẤT — anh chốt (55) @S167 "Nên đồng nhất": áp cây 4-folder lên cụm trang Duyệt-hợp-đồng (7 loại HĐ) ×2 app — làm SAU K7 ship (tái dùng tập ContractIds/usePipelineStages mới) -[ ] K8-prep form-14-người fail-closed + gói SOLUTION-PE-{n} + QĐ9 đo-2-nhánh + ZZTEST + rollback-theo-ID - + dựng 2 workflow KHKK type-3/type-10 qua Designer đọc roster từ PE-live — anh (54) @S167 "quy trình - duyệt tử tế rồi ko sao" = ratified-hướng, dựng khi vào K8-prep (báo cáo khi làm, KHÔNG SQL tay #84) +[ ] K8-prep form-14-người fail-closed + gói SOLUTION-PE-{n} + QĐ9 đo-2-nhánh + ZZTEST + rollback-theo-ID. + 🔴 (54) FINAL @S167 (anh, 2 lượt): "quy trình duyệt tử tế rồi ko sao" + "hiện cứ như vậy — Nếu điều + chỉnh, tao sẽ tự tay điều chỉnh" ⇒ GIỮ HIỆN TRẠNG workflow/người-duyệt KHKK (8 WF N1-N8 đã seed @K3, + roster verified-live); em KHÔNG dựng/chỉnh gì thêm — chỉnh người duyệt = VIỆC TAY CỦA ANH qua Designer. + K8-prep pre-flight chỉ CHECK-đọc (workflow LIVE 2-cờ + roster đủ người) rồi báo, KHÔNG sửa [ ] closeout-nợ: ✅ slot(57) ĐÓNG @S167 (anh "auto"): SPLIT _INDEX 21.468→8.756B (42,7% cap) + _INDEX-2026-H1.md 13.906B tầng-lạnh · vá kèm 3-bệnh-sẵn (mega-line #423 · 29-entry lạc-section · needle-quote test-specialist) · 3 script cùng-class → `_INDEX*.md` (gate-2-chỗ chống-haystack-dương-giả diff --git a/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-test-k7.md b/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-test-k7.md index 626e205..9f62dce 100644 --- a/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-test-k7.md +++ b/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-test-k7.md @@ -66,12 +66,42 @@ File MỚI: `tests/SolutionErp.Infrastructure.Tests/Api/KhkkBridgeAuthzTests.cs` | 4 | `CauKhkkSangHd_Admin_KhongCanDongQuyenNao_VanQua` | khoá nhánh bypass (0 dòng `Permissions`) — chống "siết cho nhất quán" rồi khoá luôn Admin | | 5 | `CauKhkkSangHd_UserBiVoHieuHoa_ThiChan_DuCoDuQuyen` | **cùng bộ quyền, đổi ĐÚNG 1 biến `IsActive`** ⇒ kết quả ngược (nghỉ việc mà token còn hạn) | -## §3b — Vá-7 B6 neo mới +## §3b — [✅ XONG] Vá-7 B6 neo mới = **T12 end-to-end** — `--filter CreateContractFromSigningPlanTests` → **12/12** (11 + T12) -CHƯA ĐO. +`T12_DiTronDuongFinalizeRoiBacCau_GiaTriLaSoDaCHOT_VaKhongDoiVeSau` (cùng file §2). -## §4 — Suite FULL +**KHÔNG chỉ "thêm 1 assert vào test K3"** — lý do khai rõ: test K3 dừng ở "finalize GHI `ApprovedAmount`"; cầu K7 thì ĐỌC cột đó; **mối nối giữa 2 vế chưa ai đo**, mà chính nó là điều kiện sống của happy-path (invest `:154`: "không có K3 thì `ApprovedAmount` NULL 100%" ⇒ cầu chặn mọi phiếu). T12 cho phiếu đi TRỌN đường qua `ContractSigningPlanWorkflowService` THẬT (trình → duyệt → terminal chốt giá) rồi mới bắc cầu — **KHÔNG seed thẳng Phase/giá** (seed thẳng = tự đưa đáp án rồi chấm). -CHƯA ĐO. +- neo (a) `Phase == DaDuyet` do MÁY tự đi tới. +- neo (b) **tương phản chống-rỗng:** dòng A `Approved=111` chốt sẵn (`Proposed=999`) · dòng B `Approved=null` (`Proposed=250`) ⇒ sau finalize phải là {111, 250} — chứng `??=` GIỮ số người có thẩm quyền chốt tay, không bị 999 đè. +- neo (c) `GiaTri == 361` = 111+250. Σ `Proposed` = 1249; lấy nhầm nguồn ra 1249/1109/500 — **mọi cách sai đều KHÁC 361**. +- vế cuối theo đúng chữ vá-7: sau bắc cầu, bấm `approve` lần nữa → `ConflictException` (phiếu terminal) và đọc lại **`Line.ContractId` KHÔNG đổi** + `ApprovedAmount` KHÔNG đổi. -END test-k7 — VERDICT=IN-PROGRESS +## §4 — [✅ XONG] Suite FULL `dotnet test SolutionErp.slnx --nologo` + +``` +Passed! - Failed: 0, Passed: 45, Total: 45 — SolutionErp.Domain.Tests +Passed! - Failed: 0, Passed: 594, Total: 594 — SolutionErp.Infrastructure.Tests +``` + +| | Domain | Infra | Tổng | FAIL | +|---|---|---|---|---| +| Baseline (đo tươi @§0) | 45 | 577 | **622** | **1** (bàn giao BE) | +| Sau K7-test | 45 | **594** | **639** | **0** | +| Δ | 0 | **+17** | **+17** | −1 | + +**+17 = 12** (`CreateContractFromSigningPlanTests`, T1-T12) **+ 5** (`KhkkBridgeAuthzTests`). File `AuthorizePolicyRegressionTests` +0 test (sửa test sẵn có: 1 FAIL → PASS, +2 vế assert). + +- Flaky đã khai `DeleteContractSigningPlan_SoftDeletes`: **KHÔNG nổ** lượt này (0 Failed, chạy 1 lần duy nhất — không phải chạy lại). +- **Dấu chân trên đĩa (`git status`):** đúng **3 file `tests/**`** (1 M + 2 ??). `src/Backend/**` + `fe-*/**` dirty là của lane BE/FE, **tôi không chạm 1 dòng nào**. KHÔNG commit. + +## §5 — FLAG cho lead + +**0 FLAG bug production.** 12 test bridge + 5 authz đều xanh trên mã BE hiện tại; không có test nào phải giữ ĐỎ. + +2 việc KHAI để lead phân xử (không phải bug, là chỗ lệch giấy tờ / vùng chưa phủ): + +1. 🟡 **Lệch spec đã đo (giấy tờ, không phải mã):** bảng invest T1 `:75` ghi `WorkflowDefinitionId null` — **vá-6 thắng** và mã đang pin V1. Tôi test theo CODE + vá-6, ghi mismatch trong header file test. Nếu lead muốn giữ chữ của bảng invest thì phải sửa MÃ (không phải sửa test). +2. 🟡 **Vùng KHÔNG phủ được bằng unit test, thuộc acceptance sau restart:** `SeedContractCreateAccessAsync` (`DbInitializer.cs:2757-2822`) — grant `Contracts.Create` chỉ ăn **@restart API prod**. `KhkkBridgeAuthzTests` chứng "vai có 2 vế thì qua / thiếu 1 vế thì 403" nhưng KHÔNG chứng seeder THẬT cấp đúng vai (Drafter/Procurement/Admin) và cấp SAU revoker (#84). Nghiệm thu vẫn phải là đếm row `Permissions WHERE MenuKey='Contracts' AND CanCreate=1` sau restart thật — đúng như implbe-k7 §1 đã khai. + +END test-k7 — VERDICT=DONE (suite FULL 639/0 = 45 Domain + 594 Infra · Δ+17 · 1 FAIL bàn-giao đã đóng · 0 file production chạm · chưa commit)