From 6b2ec7b591e2f985a97a0256c581d737818d7b69 Mon Sep 17 00:00:00 2001 From: pqhuy1987 Date: Sat, 1 Aug 2026 12:40:53 +0700 Subject: [PATCH] wal: flush 20260801T1240 --- .claude/WAL.md | 19 +++++---- .claude/agent-memory/memory-budget.json | 5 ++- .../sub-test-k7.md | 40 +++++++++++++++++-- 3 files changed, 52 insertions(+), 12 deletions(-) diff --git a/.claude/WAL.md b/.claude/WAL.md index a96f7cd..32cec4a 100644 --- a/.claude/WAL.md +++ b/.claude/WAL.md @@ -43,7 +43,11 @@ chain: dựng nút — sub-implfe-k7.md) ⟂ test-lane spawn @sau-BE (8-case + 2-authz + idempotency + :398 ngoại-lệ — sub-test-k7.md). Cửa chết → ĐỌC 3 SUB-FILE trước, đừng spawn lại. CÒN: gate-K7 → commit → 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) [ ] 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ả @@ -70,11 +74,12 @@ verify: dotnet test SolutionErp.slnx --nologo # 622/0 = 45D + 577I notes: MANDATE PAUSE-3 sống (sổ nhớ kỹ từng đầu việc đã review — rà OG từng dòng trước khi tuyên xong). - S166 chết-vì-limit GIỮA /pause-4: draft MIND-4 7Đ/0T CHƯA chèn (ctx-curator chết) ⇒ /pause kế (ctx-verifier - @S167 11 cờ): PAUSE-4 khai 2-WINDOW (④ _context mù trọn window-4) · NÉN MIND-2 SÂU ≤1,5KB (⑤ số-học thiếu - ≥700B dù nén khuôn cũ) + di-trú nhãn TỪNG Ý 22-ý-D + 4 con-trỏ vào TRƯỚC (PARK-2/PARK-5 cấp nhà ⑨ · - ESCALATE(i) disposition ⑩ · slot(57) _INDEX đo tươi 104,8% TRÀN 988B ⑥ · slot(58) ruột "65,7%" đã lật ⑦) - · chuẩn-hoá nhãn `{UX chờ anh}`→`{treo-chờ-anh}` khi di-trú (⑧ ngoài bộ-4 = trượt-cấu-trúc) · MIND-4 ≤6.331B - · diary ctx-verifier S167 = lead seed on-behalf (vai nhịn Write giữ rào R0 gate-K6). run.md ledger tụt hậu ③ + 4-chốt anh @S167 lượt-2: (54) ratified-hướng · (55) GĐ3 đồng-nhất → chain · (56) ĐÓNG (anh view "hiện + ổn", có yêu-cầu User thì cập nhật sau) · (58) TRẦN `_mind` 32→48KB ĐÃ THI HÀNH (mind-check live 62,2% + ĐẠT — "57" anh gõ = slot 58, lead khai cách hiểu) ⇒ áp-lực "PHẢI nén MIND-2" HẾT, nén = tùy-chọn-khi-tiện. + S166 chết-vì-limit GIỮA /pause-4: draft MIND-4 7Đ/0T CHƯA chèn ⇒ /pause kế (cờ ctx-verifier còn hiệu-lực): + PAUSE-4 khai 2-WINDOW (④ _context mù trọn window-4) · khi nào NÉN MIND-2 thì di-trú nhãn TỪNG Ý trước + (PARK-2/PARK-5 cấp nhà ⑨ · ESCALATE(i) disposition ⑩) · chuẩn-hoá nhãn `{UX chờ anh}`→`{treo-chờ-anh}` + (⑧ ngoài bộ-4 = trượt-cấu-trúc) · diary ctx-verifier S167 = lead seed on-behalf. run.md ledger tụt hậu ③ (row 4 "☐ lần /tiep sau" + 0 row F-1) = sửa cùng closeout. Treo-không-chặn: (I)(II)(III) · OG-5 · - OG-6-soát-4-ô-UI · 2-hở-UX-K1-FE · F-5-PermGuard-khuôn-cũ · O-2-literal-2-nơi · G-1-ratify-OPT-IN. + 2-hở-UX-K1-FE · F-5-PermGuard-khuôn-cũ · O-2-literal-2-nơi. G-1 comment-đóng-dấu = commit riêng sau K7. diff --git a/.claude/agent-memory/memory-budget.json b/.claude/agent-memory/memory-budget.json index f5bc488..1face86 100644 --- a/.claude/agent-memory/memory-budget.json +++ b/.claude/agent-memory/memory-budget.json @@ -6,8 +6,9 @@ "session_ctx_kb": 64, "_session_ctx_kb_owner_set": "🔴 OWNER-SET TUONG-MINH @S146 2026-07-22 — anh chot '1 -> tuong minh' sau khi lead surface DAY DU 2 ly-do phan-bien (K6.2 muon-so-chua-do + H18 ghost-wire). Quyet-dinh cua owner co concern trong tam nhin => THUC THI, khong hoi lai. Don vi = KB; code doc PHAI nhan 1024 (khop manifest hub 101e69d6 'session_ctx_kb: 64'). Nguon so 64 = manifest hub, KHONG phai SE tu do.", "_session_ctx_kb_reader": "🔄 GHOST-WIRE DONG @S153 2026-07-26 (adopt 0df10df4 T7): reader THAT dau tien = scripts/session_ctx.py mind-check phep-phu-8 — doc khoa nay LIVE, nhan 1024, do _context-s-.md, CO khi vuot (verify acceptance-d @S153: output in 'aux tran _context ... session_ctx_kb'). Lam dung 3 dieu caveat cu tu dan {(a) doc khoa khong hardcode (b) x1024 (c) go dong caveat khi co reader}. 🧊 Lineage: caveat H18 class-2 defined-but-unread song S146→S153 (do @S146 0-reader, hit duy nhat = comment nhip-no-probe.ps1:42; doi chung pull_warn_days co reader that :190) — go dung luc co reader, khong som hon.", - "mind_ctx_kb": 32, - "_mind_ctx_kb_set": "🔴 OWNER-DELEGATED → ENGINE-PROPOSED → LEAD-DECIDED @S153 2026-07-26 (adopt thu 0df10df4 khoan (35); lenh pipeline anh 26-07 'fable-real invest → spec → hmw xu ly' = UY QUYEN — KHONG PHAI owner chot so; anh veto 1 edit thi doi — khuon hmw_width._ratified_by). Don vi KB, reader x1024 = scripts/session_ctx.py mind-check phep-7 (fail-loud exit-3 khi khoa vang — CAM default, khuon H24-2). Nguon so 32 = hub O-4 (hub tu khai 'so chu dat, khong rut tu du lieu'); SE cung nac khai: file _mind dien hinh <10KB (p=1-3 pause/phien-logic, quan sat S147-S152) => 32 = >=3x headroom; re-tune sau dogfood T9 khi co so do that.", + "mind_ctx_kb": 48, + "_mind_ctx_kb_raise_S167": "🔴 OWNER-DECIDED 2026-08-01 (anh: 'Đồng ý phương án nâng trần' — slot (58), anh gõ nhầm số 57, lead khai cách hiểu trong turn): 32→48 vì phiên-LOGIC L9 dài bất thường (5 window, chuỗi 8 wave — file phình theo độ dài MẠCH; đo 30.573B = 93,3% trần cũ, số học MIND-4 2-window thiếu ≥700B dù nén). L10 mở thì file mới về 0 nên không phình vĩnh viễn. Áp lực 'PHẢI nén MIND-2 mỗi cửa' HẾT — nén thành tùy-chọn-khi-tiện (luật di-trú nhãn TỪNG Ý trước nén GIỮ NGUYÊN khi nào nén thì làm).", + "_mind_ctx_kb_set": "🧊 lineage (số 32 cũ): OWNER-DELEGATED → ENGINE-PROPOSED → LEAD-DECIDED @S153 2026-07-26 (adopt thu 0df10df4 khoan (35); lenh pipeline anh 26-07 'fable-real invest → spec → hmw xu ly' = UY QUYEN — KHONG PHAI owner chot so; anh veto 1 edit thi doi — khuon hmw_width._ratified_by). Don vi KB, reader x1024 = scripts/session_ctx.py mind-check phep-7 (fail-loud exit-3 khi khoa vang — CAM default, khuon H24-2). Nguon so 32 = hub O-4 (hub tu khai 'so chu dat, khong rut tu du lieu'); SE cung nac khai: file _mind dien hinh <10KB (p=1-3 pause/phien-logic, quan sat S147-S152) => 32 = >=3x headroom; re-tune sau dogfood T9 khi co so do that.", "tiep_reload": { "_note": "🔄 @S153 adopt 0df10df4 khoan (37) RESOLVED (b) — nap-lai NEN RUT-GON mac dinh @/tiep (OWNER-DELEGATED cung vet _mind_ctx_kb_set). Nen-full SE do tuoi @S153 = 596.316B ~ [149.079..198.772] tok (instrument-backfill S153) — nang hon nen hub (439.328B ~ 110K tok) 1.36x, nuot tron rang mem ~150K/cua cua hub-owner neu full => rut gon ~ 40-60K tok (input one-shot cache-duoc). Reader = nghi-thuc /tiep (AI doc danh sach nay qua tiep.md §3-bis TRO KHOA — B1 lenh KHONG chep danh sach); KHAI THANG: chua co script-consumer — KHAC class ghost-wire vi hanh-vi tieu thu moi luot /tiep + dogfood T9 do that. Pham-vi tung muc khoanh ngay trong sources (khuon hub 'do theo pham-vi tung muc da khoanh trong cau-hinh').", "mode": "rut-gon", 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 131df66..626e205 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 @@ -28,11 +28,45 @@ File: `tests/SolutionErp.Infrastructure.Tests/Api/AuthorizePolicyRegressionTests **ĐO:** `--filter AuthorizePolicyRegressionTests` → **Passed! Failed: 0, Passed: 22** (trước: 1 FAIL). File này +0 test mới (sửa test sẵn có, +2 vế assert). -## §2 — 8 case T1-T8 + 2-authz + idempotency +## §2 — [BƯỚC 2 ✅ XONG] File MỚI 11 test bridge — `--filter CreateContractFromSigningPlanTests` → **Passed! Failed: 0, Passed: 11** -CHƯA ĐO. +File: `tests/SolutionErp.Infrastructure.Tests/Application/CreateContractFromSigningPlanTests.cs` (mirror khuôn bridge PE cũ `CreateContractFromEvaluationMultiWinnerTests` — `IdentityFixture` + deps THẬT `ContractCodeGenerator`/`ContractWorkflowService`, KHÔNG stub). -## §3 — Vá-7 B6 neo mới +| # | Test | Đo cái gì (vế mạnh nhất) | +|---|---|---| +| T1 | `T1_MotDong_TaoDungMotHopDong_VaGhiNguocContractId` | trọn field-map + **mã HĐ so RUỘT** `{Project.Code}/HĐTP/SOL&{Supplier.Code}/01` (bằng chứng cầu ĐÃ nạp 2 bảng — vá-6) + SLA≈+7d + `Line.ContractId` + `pe.ContractId` + **2 changelog ĐÚNG 2 BẢNG**. 3 số 900/999/750 cố ý khác nhau ⇒ chỉ `Σ ApprovedAmount` đúng | +| T2 | `T2_HaiDongCungNcc_GopVaoMotHopDong_GiaTriLaTong` | gộp N (vá-5, chỉ tồn tại nhờ Mig 71 bộ-3 unique) — 1 HĐ, CẢ 2 dòng cùng `ContractId` | +| T3 | `T3_DongChuaCoGiaChot_ThiChan_KhongTaoHd_VaKhongDotMa` | message NÊU TÊN hạng mục + atomic (dòng LÀNH cũng không bị ghi) + **`ContractCodeSequences` rỗng** = rào đứng TRƯỚC codegen | +| T4 | `T4_PhieuChuaDuyetXong_ThiChan` | dòng CÓ đủ giá ⇒ chỉ đổi ĐÚNG 1 biến (phase) | +| T5 | `T5_DongDaCoHopDong_ThiChan` | double-bridge PER-DÒNG + HĐ cũ không bị ghi đè | +| T6 | `T6_HaiDongKhacNcc_ThiChan` | + **ĐỐI CHỨNG DƯƠNG cùng lượt**: tách ra bấm từng dòng thì QUA (2 HĐ) | +| T7 | `T7_QuyTrinhPinSai_Chan4Nhanh_VaQuyTrinhDungThiQua` | **ma-trận cùng-ruột đổi ĐÚNG 1 biến**: NotFound · sai-loại · [vá-3] `!IsActive` · [vá-3] `!IsUserSelectable` — **4 message PHÂN BIỆT** + đối-chứng-dương quy-trình-đúng QUA | +| T8 | `T8_HdSinhTuCau_TrinhDuyet_ThiVaoDungHopThuCapDangCho` | **mối nối cầu→đường-ống** (chỗ `ContractV2PipelineTests` KHÔNG đo): trình qua máy THẬT → `levelOrder==1` (quên pin V2 = null) → Cấp-1 thấy hộp thư, Cấp-2 chưa | +| T9 | `T9_DongCuaPhieuKhac_ThiChan` | trộn dòng phiếu hàng xóm + id rác → chặn, dòng hàng xóm không bị đụng | +| T10 | `T10_BacCauLanHai_TaoHdThuHai_NhungPeGiuHdDau` | **CHIỀU của `??=` (vá-4a)**: viết `=` thay `??=` thì mọi assert khác vẫn xanh, chỉ vế này ĐỎ. + cardinality DoD vá-15 + seq mã 01→02 | +| T11 | `T11_BamHaiLanCungTapDong_ThiLanHaiBiChan_KhongTaoHdThua` | **double-click** — khoá HÀNH VI ĐANG CÓ (409 "đã có Hợp đồng", KHÔNG chế "no-op") + `LastSeq==1` (không cháy mã oan) | + +**Ánh xạ bảng invest T1-T8 → 11 test:** T1→T1 · T2→T2 · T3→T3 · T4→T4 · T5→T5 · T6→T6 · T7→T7(nhánh b, +3 nhánh vá-3/NotFound) · T8→T8. **+3 test NGOÀI bảng** (T9 rào tập LineIds · T10 chiều `??=` · T11 double-click) — 2 cái sau là yêu cầu §4/§5 của đề bài. + +🔴 **LỆCH SPEC ĐÃ ĐO, test theo CODE + khai trong header file:** bảng invest T1 (`:75`) ghi `WorkflowDefinitionId null`; **vá-6** (`spec-cum3:16`) ĐẢO lại "pin như 2 tiền lệ" và spec `:4` chốt "16 vá THẮNG". Mã theo vá-6 ⇒ T1 assert **pin ĐÚNG bản active của loại HĐ đó** (seed sẵn 1 bản NHIỄU loại khác ⇒ `!= null` suông sẽ không đủ). + +**2 lần ĐỎ trên đường đi (đều là seed, KHÔNG phải prod):** T9 gọi `SeedAsync` 2 lần ⇒ SQLite 19 UNIQUE `ApprovalWorkflows(Code,Version)` rồi `PurchaseEvaluations.MaPhieu` → vá bằng hậu-tố ngẫu nhiên cho MỌI mã (`Projects.Code`/`Suppliers.Code`/2 bảng workflow/`MaPhieu`); T1+T10 chuyển sang so mã HĐ với `s.Project.Code`/`s.Suppliers[0].Code` đọc từ seed. **0 dòng production bị sửa.** + +## §3a — [✅ XONG] Authz 2 CHIỀU — `--filter KhkkBridgeAuthzTests` → **Passed! Failed: 0, Passed: 5** + +File MỚI: `tests/SolutionErp.Infrastructure.Tests/Api/KhkkBridgeAuthzTests.cs`. Chọn khuôn **RẺ NHẤT MÀ VẪN THẬT**: chạy thẳng `MenuPermissionHandler` + `UserManager`/`RoleManager` thật trên `IdentityFixture` — **KHÔNG WebApplicationFactory**. Khác `AuthorizePolicyRegressionTests` (đọc ATTRIBUTE = "cửa có khoá tên gì"), file này đo **QUYẾT ĐỊNH** = "khoá đó mở cho ai". + +🔴 **Điều kiện làm phép đo có răng: 2 tên policy KHÔNG hardcode** — đọc TỪ CHÍNH controller (class-level + action-level của `CreateContract`) rồi mới đem đi hỏi handler ⇒ ai sửa attribute thì test đo theo cái MỚI mà vẫn hỏi đúng câu "hai vế có phải HỘI không". Kèm vế `actionPolicy != classPolicy` ("hai vế TRÙNG NHAU thì hội-2-khoá chỉ còn 1 khoá — cửa tự nới mà nhìn vẫn như cũ"). + +| # | Test | Vế | +|---|---|---| +| 1 | `CauKhkkSangHd_VaiDuCaHaiVe_ThiQua` | **ĐỐI CHỨNG DƯƠNG** — thiếu nó thì 2 test 403 vẫn xanh trong thế giới "chặn tất cả" | +| 2 | `CauKhkkSangHd_VaiChiCoQuyenKeHoach_ThiBiChan` | cấp RỘNG TAY cả 4 cờ trên `KeHoachKyKet` vẫn 403 — chốt trước vế-1-PHẢI-qua để không xanh vì lý do sai | +| 3 | `CauKhkkSangHd_VaiChiCoQuyenTaoHopDong_ThiBiChan` | chiều ngược lại, cũng chốt trước vế-2-PHẢI-qua | +| 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 CHƯA ĐO.