diff --git a/.claude/WAL.md b/.claude/WAL.md index 8dc30eb..fff0b82 100644 --- a/.claude/WAL.md +++ b/.claude/WAL.md @@ -33,7 +33,17 @@ chain: SAI-MỘT-PHẦN: 8 khai báo ĐÃ có call-site — diagnostics = snapshot giữa-Write #68; chỗ dở thật = ListPage → vá badge + cột Tổng-duyệt vá-8 + colSpan 8; cp 4-file fe-user; build ×2 PASS DORfkFnc/ qYI2yszp; SHA-pair 5/5 + panel control-dương giữ baseline). Artifact sub-implfe-k2.md ĐẦY tự lane ghi -[!] reviewer-gate K2 đang chạy (sub-reviewer-gate-k2.md) → PASS thì commit-push K2 → K3 +[x] gate K2 PASS-WITH-FLAGS 10f (sub-reviewer-gate-k2.md; #53 ×1 → resume; phán vá-5-thắng-nền ĐÚNG + + bác 3 nghi-vấn lead-solo). Xử: F-1 guard đếm-so-khớp (bịt hạng-mục-xoá-mềm/Guid-rác) + 2 test bịt + (xoá-mềm-chặn + reflection ?group=) · F-2/F-5/F-7/F-8/F-9 comment-honest (lý-do-thật filtered-index + khả-thi, thì-tương-lai K4b, Down-data-dependent, default-0-SQL-thô) · F-3 STATUS 607→609 · F-4 SKILL 97. + Suite 609/0 (45D+564I) · npm ×2 (comment-only ⇒ bundle hash giữ) · SHA-pair ✓ +[x] commit K2 0779f2d 23-file PUSH 89b5bbe..0779f2d (lần 1 FAIL PS5.1-quote-trap → -F file; wal-push + xen giữa vô hại) — cicd-monitor K2 chạy nền (sub-cicd-verify-k2.md) +[!] wf: K3-BE wf_a04124a7-0fe ĐANG CHẠY (bước-0 fail-closed verify đội-hình QT-DN-V2-001 LIVE prod → + seed 8 workflow KHKK-N1..N8 resolve-EMAIL + port finalize [tiêu thụ EndedByLevelFinalize K2 đẻ] + + sweep ép-false 3-site-BE + validator pin-đúng-nhóm + 8 MenuKeys AwV2_KhkkN* + seed cờ CCM-Chương + cùng-commit #78). Song song: cicd-K2 verify nền. Sau BE: K3-FE + K3-test → gate K3 → 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-cicd-verify-k2.md b/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-cicd-verify-k2.md new file mode 100644 index 0000000..e8d2fc9 --- /dev/null +++ b/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-cicd-verify-k2.md @@ -0,0 +1,83 @@ +CICD-K2: IN-PROGRESS — 0/6 mục (đang đo) + +# CI/CD verify K2 SP-002 — commit `0779f2d` + +> Artifact chống #53 — ghi TỪNG MỤC NGAY KHI ĐO. Kết bằng `END … VERDICT=`. +> Vai: cicd-monitor (READ-only). Ngày: 2026-07-31. + +--- + +## Mục 0 — Push + path-filter (tiền đề) + +``` +$ git log -1 --format='%H|%s|%ci' +0779f2d45a932ec7c279c191d9ae3fe3505442af|[CLAUDE] Contract: K2 SP-002 phieu KHKK mang hang-muc + nhom duyet N1-8 (Mig 71) + FE x2 app + 11 test|2026-07-31 17:05:27 +0700 + +$ git log origin/main..HEAD --oneline +(RỖNG — đã push trọn) +``` + +`git diff --name-only 0779f2d^..0779f2d` = **23 file**: +- BE 9: Controller `ContractSigningPlansController.cs` · `ContractSigningPlanFeatures.cs` · Domain `ContractSigningPlan.cs` + `ContractSigningPlanLine.cs` · 2 Configuration · Service `ContractSigningPlanWorkflowService.cs` (+2 mig file dưới) +- Mig 71: `20260731085624_AddKhkkApprovalGroupCatalogAndFinalizeRuntime.cs` + `.Designer.cs` + `ApplicationDbContextModelSnapshot.cs` +- FE 8: fe-admin ×4 (Khkk{Create,Detail,List}Page.tsx + types/khkk.ts) · fe-user ×4 (đối xứng) +- Test 3: `ContractSigningPlanApprovalTests.cs` · `ContractSigningPlanGroupAndCatalogTests.cs` · `ContractSigningPlanSchemaTests.cs` +- paths-ignore 2 (KHÔNG chặn vì ≥1 file code): `docs/STATUS.md` · `.claude/skills/ef-core-migration/SKILL.md` + +⇒ CI **PHẢI** chạy (không rơi SKIPPED-DOCS). Neo commit bằng SHA tuyệt đối `0779f2d^..0779f2d` (LUẬT S162: cấm `HEAD~1` vì Stop-hook WAL auto-commit). + +--- + +## Mục 0b — SNAPSHOT PRE-MIGRATE (đo lúc run #435 còn `running`, 17:07) + +``` +$ ssh vietreport-vps "sqlcmd ... -Q 'SELECT MAX(MigrationId)...; COUNT(*)...; SUM(...)'" +MIGTOP=20260731072441_AddContractCatalogEntries <- Mig 70 (K1), Mig 71 CHƯA áp +PLANS=0 +LINES=0 +SUMPE=NULL|SUMPROP=NULL +SYSTABLES=97 +``` + +Bundle PRE (khớp mốc K1 run #434 do em main đưa): +``` +admin /assets/index-CKgq0YlH.js + /assets/index-DD3xQhNt.css +eoffice /assets/index-CHMCU35C.js + /assets/index-CdXRNT7E.css +``` + +🔴 **KHAI TRƯỚC — MỤC 4 SẼ RỖNG, KHÔNG PHẢI SẠCH.** `ContractSigningPlans` prod có **0 dòng** +TRƯỚC migrate. ⇒ 3 acceptance của mục 4 rơi vào **chân-lý-rỗng (vacuous)**: +`COUNT(group=1) == COUNT(*)` thành `0 == 0`; `COUNT(NOT BETWEEN 1 AND 8)` thành `0`; Σ tiền +`NULL == NULL`. Cả ba đều "xanh" mà **không mang thông tin nào** về việc backfill có chạy đúng. +Chính tác giả Mig 71 đã khai bẫy này ở comment ("đo local Σ = tập RỖNG hai phía … phép đo prod +mới có răng") — nay prod cũng rỗng nốt, nên **phép đo prod cũng KHÔNG có răng**. +Đối-sách: thay bằng bằng-chứng KHÔNG-rỗng ở mục 4 (xem dưới): cột tồn tại đúng kiểu/nullability +(`INFORMATION_SCHEMA`), **hoán-đổi index có/mất** (`sys.indexes` — đây là phép đo CÓ RĂNG THẬT +vì không phụ thuộc số dòng), default-constraint, và **EF materialize qua API** (nếu cột thiếu +thì `SELECT` của EF ném 500 chứ không trả 200 ⇒ 200 = chứng cột tồn tại end-to-end). + +--- + +## Mục 1 — Gitea Actions run + +(đang đo — run #435 id=548 `0779f2d4` status=running, created 17:05:33) + +## Mục 2 — Test gate 609 (45D + 564I) + +(chưa đo) + +## Mục 3 — EF migration prod + chứng-restart + +(chưa đo) + +## Mục 4 — Data prod sau migrate + +(chưa đo) + +## Mục 5 — Bundle ×2 app + +(chưa đo) + +## Mục 6 — Smoke + +(chưa đo) diff --git a/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-implementer-backend-0.md b/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-implementer-backend-0.md new file mode 100644 index 0000000..0a789e6 --- /dev/null +++ b/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-implementer-backend-0.md @@ -0,0 +1,39 @@ +# K3-BE: IN-PROGRESS — build · test · roster-live ? + +> Sub: implementer-backend-0 (wave K3). Bat dau 2026-07-31. +> ARTIFACT chong #53 — ghi LIEN TUC tung muc, KHONG doi den cuoi. + +## Trang thai khoi dong +- git branch: main, HEAD `0779f2d` ([CLAUDE] Contract: K2 SP-002 ... Mig 71) +- git status truoc khi minh Write: 12 M + 2 ?? (khong co file BE code nao dirty) — snapshot ghi o duoi. + +``` + M .claude/WAL.md + M .claude/agents/README.md + M .claude/auto-memory/MEMORY.md + M .claude/auto-memory/feedback_agent_return_garble_recover.md + M .claude/commands/session-end.md + M .claude/commands/session-start.md + M .claude/governance/.session-counter.json + M .claude/skills/README.md + M .claude/skills/permission-matrix/SKILL.md + M .claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-reviewer-gate-k2.md + M CLAUDE.md + M docs/governance/ctx-soft-memory-se-draft.md +?? .claude/auto-memory/feedback_may_rong_ui_hep.md +?? .claude/auto-memory/project_sol_ccm_sp002_signing_matrix.md +?? .claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-cicd-verify-k2.md +``` + +## Tick 0-8 (cap nhat dan) +- [ ] 0. FAIL-CLOSED verify doi-hinh LIVE prod (OG-2) +- [ ] 1. Seed 8 workflow KHKK-N1..N8 type-10 +- [ ] 2. Port nhanh LEVEL-FINALIZE vao ContractSigningPlanWorkflowService +- [ ] 3. Sweep ep-false va-3 (>=3 site BE) +- [ ] 4. Validator phieu-pin-dung-nhom (QD-3) +- [ ] 5. Seed AllowApproverFinalize=true cap CCM +- [ ] 6. MenuKeys +8 AwV2_KhkkN1..N8 + menu-row +- [ ] 7. Va-12 comment supersede-S155 +- [ ] 8. build 0W/0E + test FULL (baseline 609) + +--- diff --git a/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-reviewer-gate-k2.md b/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-reviewer-gate-k2.md index d0257e2..3f21b67 100644 --- a/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-reviewer-gate-k2.md +++ b/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-reviewer-gate-k2.md @@ -29,3 +29,81 @@ REVIEWER-GATE-K2: IN-PROGRESS — chưa chốt (`MenuKeys.cs` BE cũng không trong diff của wave K2 — chỉ `.claude/skills/permission-matrix/SKILL.md` là doc.) - (d) 3 test lead vá: `ContractSigningPlanSchemaTests.cs` (+56/-…) + `ContractSigningPlanApprovalTests.cs` (+19) vẫn còn trong diff, file mới `ContractSigningPlanGroupAndCatalogTests.cs` tách riêng ⇒ không bị lane đè. +## §3 `npm run build` ×2 — reviewer tự chạy tươi + +| App | Kết quả | Bundle (nguyên văn) | So claim lane | +|---|---|---|---| +| fe-admin | ✅ PASS, `✓ 1961 modules transformed` / `✓ built in 647ms` | `dist/assets/index-DORfkFnc.js 1,722.60 kB │ gzip: 428.08 kB` | KHỚP TỪNG KÝ TỰ | +| fe-user | ✅ PASS, `✓ built in 575ms` | `dist/assets/index-qYI2yszp.js 1,638.80 kB │ gzip: 413.92 kB` | KHỚP TỪNG KÝ TỰ | + +Warning cả 2 app = pre-existing (chunk > 500 kB · `INEFFECTIVE_DYNAMIC_IMPORT` `realtime.ts`), 0 TS error. +`noUnusedLocals: true` ⇒ build XANH = phép thử TS6133 có răng (import `KHKK_APPROVAL_GROUP_LABELS` ở ListPage đã có người dùng thật). + +## §4 Code-vs-spec K2 + +**Mig 71 — 6 item ĐỦ, 3-file ĐỦ.** `20260731085624_…FinalizeRuntime.cs` + `.Designer.cs` (2 file `??` mới) + `ApplicationDbContextModelSnapshot.cs` (M) — snapshot có đủ `ApprovalGroup` · `EndedByLevelFinalize` · `CatalogEntryId` · `TenHangMuc(500)` · `HasIndex("ApprovalGroup","Phase")` · `HasIndex("CatalogEntryId")`. Backfill `:61` `UPDATE [ContractSigningPlans] SET [ApprovalGroup] = 1;` **vô điều kiện** đúng chữ vá. Unique `:93-98` 3 cột + `filter: "[IsDeleted] = 0"` đúng #57. +**Đo DB (sqlcmd, `SolutionErp_Dev`) — reviewer tự chạy:** `tables=97` · top mig `20260731085624_AddKhkkApprovalGroupCatalogAndFinalizeRuntime` · 2 cột header + 2 cột line **có mặt** · `sys.indexes is_unique=1` chỉ còn `PK_…` và `IX_…_ContractSigningPlanId_SupplierId_CatalogEntryId` filter `([IsDeleted]=(0))` ⇒ **unique cũ 2-cột ĐÃ CHẾT THẬT** (index swap, không phải thêm chồng). `plans=0 · lines_cnt=0` ⇒ Σ tiền local là **control RỖNG** — lane khai đúng độ mạnh, KHÔNG đòi thêm phép đo (xem §6). + +**Submit-guard 2 vế — PHÁN vụ "vá-5 THẮNG nền `:126`": lead ĐỌC ĐÚNG ưu tiên.** Chứng bằng chữ: +- `spec-cum1-chi-tiet:4` nguyên văn: *"**12 VÁ dưới đây THẮNG khi xung đột**"* ⇒ luật ưu tiên do CHÍNH spec đặt, không phải lead tự phong. +- `spec-cum1-chi-tiet:12` (vá-5): *"auto-gen line lúc tạo phiếu được mồi null NHƯNG **submit-guard CHẶN null**"*. +- Nền `sub-invest-fable-b2-cum1.md:126`: *"Line `CatalogEntryId == null` (legacy nhóm-1 backfill) → CHO QUA"*. +⇒ Xung đột THẬT, vá thắng, code chọn CHẶN (`WorkflowService.cs:174-176`). Đúng. Kèm điểm cộng: cái GIÁ của lựa chọn (phiếu cũ bị Trả-lại sẽ **kẹt trình** tới khi K4b land) được khai THẲNG trong comment tại chỗ, không giấu. +Vế (ii) khác-nhóm 409 `:178-182` theo đúng code mẫu nền K2.d. + +**List `?group=` end-to-end — 5/5 mắt xích có thật:** controller `ContractSigningPlansController.cs:42` `[FromQuery(Name="group")] int? group` → truyền vị trí thứ 5 `:49` → record `ListContractSigningPlansQuery:705 int? ApprovalGroup` → filter `:735-736` (đặt SAU vế IDOR, chỉ thu hẹp) → DTO `ListItemDto:63 ApprovalGroup` → FE `types/khkk.ts:158 approvalGroup: number`. FE **cố ý chưa đẻ ô lọc** (K4b/K5) — khai rõ ở `sub-implfe-k2.md §2` + comment `types/khkk.ts:28-32`. *(bẫy tên tham số → F-6.)* + +**Σ×3 + display-gate:** `Features.cs:793-804` — PeReference · Proposed · **+Approved** (`.Sum(l => l.ApprovedAmount) ?? 0m`). Detail `:689` `BudgetFrozen = plan.Phase == DaDuyet`. FE: `KhkkListPage` +cột "Tổng duyệt" (8 `