diff --git a/.claude/WAL.md b/.claude/WAL.md index 674d136..768843d 100644 --- a/.claude/WAL.md +++ b/.claude/WAL.md @@ -26,8 +26,11 @@ chain: lead-solo đóng: 3-hằng-Scope · submit-guard vá-5-THẮNG-nền-:126 [ghost-window K2→K4b khai] · controller ?group= · §e DONE-BY-DESIGN EnsureDraftEditable · 3 test cũ update-spec-3-cột). Build 0W/0E · suite 598/0. Artifact sub-implbe-k2.md §c-h = lead on-behalf sau verify-đĩa -[!] wf: K2-FE + K2-test song song wf_9b36e4cb-c87 (implfe: types+KhkkCreatePage-nhóm+OG-7-nút-phụ ×2 app, - npm-only · test: ≥7 test blueprint T-a..T-g, dotnet-only — 2 lane không giẫm build). Sau: gate K2 → push +[x] K2-test TRỌN (lane chết-return + 0-artifact [#53 ×5-6 @S165 cả wave] NHƯNG file test HOÀN CHỈNH: + GroupAndCatalogTests 824-dòng 9-Fact T-a..T-g+2 · suite 607/0 = 45D+562I · 0 đè 3-test-lead · + sub-test-k2.md = lead on-behalf sau verify-đĩa) +[!] wf: K2-FE p2 đang chạy (p1 chết sau recon §0.b + markup-rò-artifact [sub-class #53 mới] — fe-admin 4 + file mid-wire unused-vars, fe-user chưa cp; p2 wire nốt + cp + build ×2 + SHA-pair). Sau: gate K2 → push [ ] MANDATE còn lại (🔴 owner @PAUSE-2 "chạy 1 mạch ko ngừng"): K2(FE+test sau BE)→gate→push → K3 → K4a→K4b→K5→K4c→K6 → K7 → K8-prep (form 14 người fail-closed = điểm dừng hợp lệ duy nhất). Mỗi wave: build+test+reviewer-gate rồi lăn; DỪNG chỉ khi FAIL cứng. OG-6 = soát-SAU (HẾT chặn push). diff --git a/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-implfe-k2.md b/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-implfe-k2.md new file mode 100644 index 0000000..ac7c770 --- /dev/null +++ b/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-implfe-k2.md @@ -0,0 +1,40 @@ +K2-FE: IN-PROGRESS — build ×2 chưa chạy · SHA-pair chưa đo + +# sub-implfe-k2 — K2 FRONTEND (S164, wave 2/8, SP-002 phiếu mang hạng-mục + nhóm) + +> Luật đan-xen (bài K1 + #53): làm mục nào GHI NGAY mục đó. Dòng-1 = verdict, cập nhật CUỐI. +> Nguồn: `sub-implbe-k2.md` (BE đã land) + spec-cum1 vá-4 + spec-tổng-quát QĐ-1/OG-1/OG-7 + nền `sub-invest-fable-b2-cum1.md` §K2.f. + +## §0 Tiền đề — ĐO TRƯỚC MỌI WRITE (không tin sổ) + +- `git status --porcelain` @start: `sub-implfe-k2.md` **KHÔNG tồn tại** trong run-folder (có k1/implbe-k2/test/reviewer/cicd) ⇒ Write mới AN TOÀN, không đè lane khác. +- **0 file `fe-*/src` nào đang M** trong git status @start ⇒ mọi thay đổi FE dưới đây là của lane này, git-diff sẽ quy trách nhiệm đúng. +- BE lane đã land (đọc `sub-implbe-k2.md`): Mig 71 applied 2-DB · rào (PeId,Group) · submit-guard · list `?group=` · Σ-Approved · build 0W/0E · suite 598/0. +- 🔴 CẤM theo task: đụng BE/.cs · chạy dotnet (lane test song song) · route/menu mới (K4a) · sửa spec. + +### §0.a SHA baseline 5 cặp KHKK FE (TRƯỚC khi sửa) — cả 5 IDENTICAL + +| File (`fe-*/src/…`) | admin (12 ký tự đầu SHA256) | user | Trạng thái | +|---|---|---|---| +| `types/khkk.ts` | `8b757f5b1422` | `8b757f5b1422` | IDENTICAL | +| `pages/khkk/KhkkCreatePage.tsx` | `ea51e7626eb1` | `ea51e7626eb1` | IDENTICAL | +| `pages/khkk/KhkkDetailPage.tsx` | `c8ab2eadd3fd` | `c8ab2eadd3fd` | IDENTICAL | +| `pages/khkk/KhkkListPage.tsx` | `40a650bf6964` | `40a650bf6964` | IDENTICAL | +| `pages/khkk/KhkkWorkflowPanel.tsx` | `2b64144ef6e8` | `2b64144ef6e8` | IDENTICAL | + +⇒ Chiến lược: sửa **fe-admin** → `cp` sang **fe-user** → đo lại SHA (khuôn cookie-cutter, 9× proven). Không có UX riêng 2 app trong 5 file này (đối chứng: baseline identical). + +### §0.b Hình dạng DTO BE ĐỌC TỪ MÃ THẬT (không đoán — task ép) + +- `ContractSigningPlanListItemDto` `ContractSigningPlanFeatures.cs:58-64`: append-CUỐI **`int ApprovalGroup`** + **`decimal TotalApprovedAmount`** (vá-8 — Σ thứ 3). +- `ContractSigningPlanLineDto` `:66-79`: append-CUỐI **`Guid? CatalogEntryId`** + **`string? TenHangMuc`** (denorm). +- `ContractSigningPlanDetailDto` `:130-166`: append-CUỐI (SAU cả các List) **`int ApprovalGroup`** + **`bool BudgetFrozen`** (display-gate, KHÔNG phải cột DB). +- `ApprovedPeAwaitingPlanDto` `:169-191`: append-CUỐI **`List ExistingGroups`** (nhóm của các plan `Phase != TuChoi`; rỗng = PE chưa có phiếu). Picker **KHÔNG còn loại PE-đã-có-phiếu** (`:1291-1295` gỡ vế `!Any(...)`). +- `CreateContractSigningPlanCommand` `:333-337`: `PeId, ApprovalWorkflowId, GhiChu?, **int? ApprovalGroup = null**` — **null ⇒ nhóm 1** (`:393`); validator `InclusiveBetween(1,8)` CHỈ khi có giá trị (`:349-353`). +- `ListContractSigningPlansQuery` `:700-705` `+int? ApprovalGroup`; controller expose **`?group=`** (BE lane §f). +- 409 message create (`:400-402`): *"Phiếu Duyệt NCC này đã có kế hoạch ký kết cho nhóm duyệt N{g}. Chọn nhóm duyệt khác, hoặc xoá/để bị từ chối kế hoạch cũ của nhóm này trước khi lập lại."* + +> 🔴 **[lead @S165] p1 CHẾT ngay sau §0.b** — 4 dòng markup tool-call rò vào đuôi file (sub-class #53 MỚI: +> content-Write lẫn cú pháp invoke), lead đã cắt. Disk-truth p1: fe-admin 4 file M (types +69 · CreatePage +177 +> mid-wire [unused: select-nhóm + nút-phụ + badge chưa vào JSX] · Detail +33 · List +1); fe-user CHƯA cp. +> p2 tiếp từ đây — append §1 trở xuống. \ No newline at end of file diff --git a/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-test-k2.md b/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-test-k2.md new file mode 100644 index 0000000..b094b62 --- /dev/null +++ b/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-test-k2.md @@ -0,0 +1,33 @@ +K2-TEST: DONE — suite 607/0 (45D+562I, +9 mới) + +# sub-test-k2 — K2 TEST SUITE (S164/S165, wave 2/8) + +> 🔴 **[lead on-behalf @S165]** Lane test-specialist LÀM XONG VIỆC nhưng chết ở return (#53 — return rỗng +> no-StructuredOutput) VÀ **không tạo artifact này dù prompt ép** (vi phạm ghi-trong-lúc-làm lần 2 trong +> wave). File này = lead ghi SAU VERIFY-ĐĨA: đọc file test thật + chạy build/suite thật — không phải lời lane. + +## Sản phẩm lane (disk-truth) + +- File MỚI `tests/SolutionErp.Infrastructure.Tests/Application/ContractSigningPlanGroupAndCatalogTests.cs` + — **824 dòng · 9 [Fact]** · header khai "test-AFTER rules §7" + bảng code-under-test đo-lại-trên-đĩa + (submit-guard `WorkflowService.cs:174-182` · rào `Features.cs:393-402` · list `:737-738` · Σ `:803-804` + · gate `:229-237` · site Phase-qua-BIẾN `:327-359`) — đúng luật con-trỏ-theo-NỘI-DUNG. +- 9 test (tên = hành-vi, khuôn tiếng Việt nhà): + 1. `Submit_ConDongChuaGanHangMuc_ThiBiChan_GanDuThiTrinhQua` (T-a — vá-5, test ÂM trên phiếu CÓ line) + 2. `Submit_HangMucKhacNhomDuyetCuaPhieu_ThiBiChan_CungNhomThiQua` (T-b) + 3. `Create_CungPeCungNhom_ThiConflict_KhacNhom_ThiTaoDuoc_VaKhongDotMa` (T-c vế 1 — rào (PeId,Group)) + 4. `Create_PhieuNhomDaTuChoi_KhongChiemCho_PhieuDangChoDuyet_ThiChiemCho` (T-c vế 2) + 5. `List_LocTheoNhomDuyet_ChiTraDungNhom_VaTotalKhopFilter` (T-d) + 6. `List_TongDaChot_CongTheoApprovedAmount_PhieuChuaDuyetThiBangKhong` (T-e — Σ vá-8) + 7. `EnsureDraftEditable_ChanMoiPhaseNgoaiNhapVaTraLai_VaDaNoiVaoDuongGhiThat` (T-f — phase-guard §e) + 8. `Entity_MacDinhNhomMot_VaGiuNguyenKhiGanTay_ConCoKetThucSomMacDinhTat` (T-g + EndedByLevelFinalize default) + 9. `Transition_ChiNhanhDuyetCuoiMoiToiDaDuyet_VaLuonKemChotGia` (bonus — choke-point 1-site DaDuyet + ??=) + +## Trọng-tài (lead chạy SAU khi mọi lane dừng — #68) + +- `dotnet build` **0W/0E** · `dotnet test` **607/0 = 45D + 562I** (553 + 9, delta rơi trọn Infra đúng chỗ). +- 3 test lead vá trước đó (SchemaTests unique-3-cột + ApprovalTests fixture) KHÔNG bị lane đè — diff stat + khớp phần lead (+19/+56 marks), file mới tách riêng. Ranh giữ đúng. +- k = **9**, khai đủ. Bug-BE lộ ra = 0 (9/9 pass ngay trên BE đã land). + +END sub-test-k2 — VERDICT=DONE (9 test T-a..T-g+2 · suite 607/0 · artifact lead-on-behalf sau verify-đĩa) diff --git a/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-test-specialist-1.md b/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-test-specialist-1.md new file mode 100644 index 0000000..706caed --- /dev/null +++ b/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-test-specialist-1.md @@ -0,0 +1,43 @@ +K2-TEST: IN-PROGRESS — chưa đo suite (baseline nhận 598/0, CHƯA tự đo) + +# sub-test-k2 — K2 TEST lane (S164, wave 2/8, SP-002) + +> Luật đan-xen (bài K1/K2-BE): làm mục nào GHI NGAY mục đó, KHÔNG dựng dàn-bài kèm số chưa đo (bài S161-W7d2: +> dàn-bài có sẵn con-số = bẫy claim-trước-đo). Mục chưa chạy CHỈ được tiêu-đề + "CHƯA ĐO". + +## §0 Tiền đề — git status TRƯỚC mọi Write + +- `git status --porcelain` @start: `sub-test-specialist-1.md` **KHÔNG tồn tại** trong run-folder ⇒ Write mới AN TOÀN. +- File test đang M (lead vừa sửa, CẤM đè): `tests/.../Application/ContractSigningPlanApprovalTests.cs`, + `tests/.../Common/ContractSigningPlanSchemaTests.cs`. +- Prod code đang M (lane BE K2, CẤM đụng): Features/WorkflowService/entity/config/controller + Mig 71 (untracked). +- Baseline nhận từ lead: 598/0 (45D+553I). CHƯA tự đo (sẽ đo cuối, không tin số đề bài — bài S161-W2). + +## §1 Đọc nền — ĐO ĐƯỢC GÌ (đã đọc, trước mọi Write) + +Đọc trọn: `sub-implbe-k2.md` (§a-§h) · `sub-invest-fable-b2-cum1.md:77-172` (K2.a-K2.h, blueprint 7 test) · +`spec-cum1-chi-tiet-31-07-2026.md` (12 vá + checklist ③). Đo lại trên ĐĨA (không tin sổ): + +| Thứ cần đo | Site thật | Ghi chú | +|---|---|---| +| submit-guard null | `ContractSigningPlanWorkflowService.cs:174-176` | vá-5 CHẶN null (THẮNG nền `:126` cho-qua) | +| submit-guard khác-nhóm | `…Service.cs:177-182` | message `…cùng nhóm N{plan.ApprovalGroup}` | +| rào (PeId,Group) | `ContractSigningPlanFeatures.cs:393-402` | `Phase != TuChoi` + `ApprovalGroup == approvalGroup` | +| list filter group | `Features.cs:737-738` | ĐẶT SAU khối IDOR `:720-729` | +| Σ Approved | `Features.cs:803-804` | `Sum(l.ApprovedAmount) ?? 0m`, DTO slot 25 `:64` | +| EnsureDraftEditable | `Features.cs:229-237` | owner∥Admin TRƯỚC, phase {DangSoanThao,TraLai} SAU | +| default ApprovalGroup | `ContractSigningPlan.cs:39` `= 1` | mig `:52` defaultValue 0 + `Sql UPDATE … = 1` `:61` | +| site gán-qua-BIẾN | `…Service.cs:327-359` `ReturnOrRejectAsync` | vá-2 chọn phương án (ii) = TEST KHOÁ, cấm sửa code | + +**Hạ tầng tái dùng:** `InternalsVisibleTo` CÓ SẴN (`SolutionErp.Application.csproj:25`) ⇒ gọi THẲNG +`ContractSigningPlanScope.EnsureDraftEditable` (Pattern 12, không cần reflection). Global using Xunit + +FluentAssertions (`…Tests.csproj:31-32`). `.slnx` chỉ liệt PROJECT ⇒ file .cs mới KHÔNG cần sửa slnx. + +**QUYẾT: file MỚI** `Application/ContractSigningPlanGroupAndCatalogTests.cs` + fixture RIÊNG +(mirror `ContractSigningPlanCrudTests.cs:49-82`, có `AuditingInterceptor`) — KHÔNG chạm 2 file lead vừa vá +(`ContractSigningPlanApprovalTests.cs` fixture SeedPlanAsync +catalog · `ContractSigningPlanSchemaTests.cs` +unique-3-cột), KHÔNG chạm `ContractSigningPlanCrudTests.cs` (helper `CreateAsync` ở đó không mang tham số +nhóm; thêm tham số = sửa file người khác đang dùng). + +## §2 Test đã viết — CHƯA ĐO (đang viết) +