wal: pause

This commit is contained in:
pqhuy1987
2026-07-31 21:47:23 +07:00
parent 15349e8ee0
commit bd68f71e42
22 changed files with 402 additions and 146 deletions

View File

@ -19,7 +19,9 @@
| 2.c3-r | Review cụm-3 — `WF reviewer c3-{evi,cov,seq} s164` | /fable-clone (opus ×3) | ✅ 3/3 sạch · L1 7/7-ĐÚNG PWF 4M · L2 FAIL 5H (K8 chưa-chạy-được-như-viết) · L3 FAIL 4H (authz hội-2-khóa · Contracts.Create 0-vai) → **spec-cum3-final 16 vá** |
| 3 | Chốt spec cuối — `WF review-fable b3-chot s164` | /fable-real review | ✅ **GO-WITH-SPEC-FIXES**: GO 9/10 (K8 by-design) · 8 mâu-thuẫn (3 nặng A-1/A-4/A-5) · 0 vá-đè-vá/43 · build-order K1→K2→K3→K4a→K4b→K5→K4c→K6→K7→K8 · 8 fix lead ÁP XONG |
| 4.K1 | Build K1 danh mục HĐ (BE+FE+test) | wf_2569b79b p1 · wf_2e08ba77 p2 · implfe · wf_1fb9f309 | ✅ @S165: 3 lane trọn · gate `sub-reviewer-gate-k1.md` **PASS-WITH-FLAGS 9f** · F4/F7 vá + T5b · Mig 70 áp LocalDB |
| 4.K2-K8 | Build K2..K8 theo build-order B3 | hmw (Opus 5 MAX) | ☐ K2 kế tiếp |
| 4.K2 | Build K2 (BE+FE+test) | 4 lane + lead-solo đóng | ✅ @S165: gate PASS-WITH-FLAGS 10f · commit `0779f2d` · cicd PARTIAL-5/6-deploy-khỏe (mục-4 chân-lý-rỗng chờ phiếu thật) |
| 4.K3 | Build K3 (8 wf nhóm + finalize + designer) | chẻ-nhỏ: nhịp-1-lane + nhịp-2/3-lead + FE-lane + test-lane | ✅ @S165: gate PASS-WITH-FLAGS 8f/0-blocker · commit `15349e8` · cicd ĐANG chạy (sub-cicd-verify-k3.md) · 🔴 F-1 checkbox-opt-out = đầu việc #1 lần sau |
| 4.K4a-K8 | Build K4a→K8 theo build-order B3 | hmw | ☐ lần /tiep sau (spec-cụm2/cụm3 đóng băng) |
| 5 | Dry-run E2E toàn trình (K8) | theo spec-cum3 | ☐ chặn bởi B0-form 14 người |
## Stages

View File

@ -0,0 +1,45 @@
CICD-K3: IN-PROGRESS — ?/6
# cicd-monitor — verify deploy K3 SP-002 (`15349e8`)
> Artifact chống #53: ghi TỪNG MỤC ngay khi có bằng chứng. Kết bằng `END ... VERDICT=`.
> Repo `D:\Dropbox\CONG_VIEC\SOLUTION\SOLUTION_ERP` · push `0779f2d..15349e8 main`.
## §0 — Tiền đề (đo LIVE trước khi deploy xong)
Commit HEAD:
```
15349e8ee054406797cc1d76c7bc3384c6768fc2 [CLAUDE] Contract: K3 SP-002 8 workflow nhom KHKK-N1-8 + port level-finalize + designer (0-mig) + 5 test
git log origin/main..HEAD -> (rỗng — đã push)
```
`git diff --name-only 0779f2d 15349e8` = 26 file. Phân loại vs `paths-ignore` 7-glob:
- **CODE (13, trigger CI):** BE 6 (`ContractSigningPlansController.cs`, `ApprovalWorkflowV2AdminFeatures.cs`, `ContractSigningPlanFeatures.cs`, `IContractSigningPlanWorkflowService.cs`, `MenuKeys.cs`, `DbInitializer.cs`, `ContractSigningPlanWorkflowService.cs` = 7 thực) · FE 4 (`fe-admin/Layout.tsx`, `fe-admin/khkk/KhkkWorkflowPanel.tsx`, `fe-admin/system/ApprovalWorkflowsV2Page.tsx`, `fe-user/khkk/KhkkWorkflowPanel.tsx`) · test 2 (`ContractSigningPlanApprovalTests.cs`, `ContractSigningPlanGroupAndCatalogTests.cs`)
- **IGNORED (13):** `docs/**` ×2 + `.claude/WAL.md` + `.claude/agent-memory/**` ×3 + `.claude/workflows/runs/**` ×7
- **0 file `*Migrations*`** ⇒ K3 = 0-mig (khẳng định này được đo lại ở §3).
**Bundle PRE-deploy (đo LIVE 18:22:51 +07, lúc run #436 CÒN `running`):**
```
admin /assets/index-DVQEwGwf.js + /assets/index-D050EVYG.css
eoffice /assets/index-CZAYiWWa.js + /assets/index-DX1FRk5n.css
```
Khớp ĐÚNG mốc post-K2 (#435) ghi ở `sub-cicd-verify-k2.md:139-142` ⇒ mốc PRE hợp lệ, chưa bị K3 ghi đè.
**PROD DB PRE-deploy (sqlcmd `localhost\SQLEXPRESS`, đo 18:23 +07 lúc run CÒN `running`):**
```
MIGTOP=20260731085624_AddKhkkApprovalGroupCatalogAndFinalizeRuntime
MIGCOUNT=71
WF_KHKK_N=0 <- CHƯA có workflow nhóm nào
MENU_AwV2_KhkkN=0 <- CHƯA có menu-row nào
MENU_TOTAL=143
PERM_TOTAL=1576
LEVELS_FINALIZE_ALL=2 <- cờ finalize toàn hệ TRƯỚC K3 (control nền)
```
⚠️ Cột PK của `MenuItems`**`[Key]`** (KHÔNG phải `MenuKey``MenuItemConfiguration.cs:11 b.HasKey(x => x.Key)`;
`MENUCOLS=Key,Label,ParentKey,Order,Icon,DisplayLabel,IsVisible`). Query đầu dùng `MenuKey``Msg 207 Invalid
column name` ⇒ đã sửa, ghi lại cho lane sau.
**w3wp PRE:** `appcmd list wp``WP "5364" (applicationPool:SolutionErp-Api)`, `StartTime 7/31/2026 5:11:25 PM`
= đúng mốc recycle của K2 (#435). ⇒ mốc-so-sánh recycle-proof cho K3.
---

View File

@ -1,22 +1,71 @@
REVIEWER-GATE-K3: IN-PROGRESS — 0 finding (đang chạy)
REVIEWER-GATE-K3: PASS-WITH-FLAGS — 8 finding (3 MAJOR / 5 MINOR, 0 blocker build-test)
# Reviewer gate K3 — 8 workflow nhóm + port finalize + designer
Ghi-đĩa TRONG LÚC LÀM (chống #53). Dòng-1 sẽ được cập nhật khi có verdict.
Ghi-đĩa TRONG LÚC LÀM (chống #53). Đo từ ĐĨA, HEAD `2967c43`, 25 file M / +908 102; 2 untracked chỉ ở `.claude/auto-memory/`.
## 0. Trạng thái khởi động (đo từ đĩa)
## §1 Build / test / npm — số NGUYÊN VĂN
- Branch `main`, HEAD `2967c43` (wal: flush 20260731T1743).
- `git diff --stat`: 25 file M, +908 / -102.
- Untracked: chỉ 2 file `.claude/auto-memory/*` (memory, không phải prod-code).
- 0 file untracked trong `src/` hoặc `tests/`**0 migration mới** (kiểm lại ở §4).
| Phép | Lệnh | Kết quả nguyên văn |
|---|---|---|
| BE build | `dotnet build SolutionErp.slnx` | `Build succeeded.` · `0 Warning(s)` · `0 Error(s)` |
| BE test #1 | `dotnet test SolutionErp.slnx` | 🔴 `Failed! - Failed: 1, Passed: 568, Skipped: 0, Total: 569 - SolutionErp.Infrastructure.Tests.dll` |
| BE test #2 | `dotnet test SolutionErp.slnx` | `Passed! - Failed: 0, Passed: 45, Total: 45 - Domain.Tests` + `Passed! - Failed: 0, Passed: 569, Total: 569 - Infrastructure.Tests`**614/0** |
| BE test #3 | `--filter ~ContractSigningPlan` | `Passed! - Failed: 0, Passed: 34, Total: 34` |
| npm fe-admin | `npm run build` | `✓ 1961 modules transformed` · `✓ built in 19.63s` · 0 TS error |
| npm fe-user | `npm run build` | `✓ built in 7.81s` · 0 TS error |
## 1. Build / test (đang chạy)
⇒ 614/0 = 45D+569I **khớp claim ở lượt #2/#3**; lượt #1 FAIL → F-4.
## 2. Code-vs-spec
## §2 Code-vs-spec K3 (5 điểm)
## 3. Phán 3 điểm lead tự-quyết
1. **Seed 8 wf khớp ROSTER §0**`DbInitializer.cs:526-688`. 3 Steps (`Phòng Cung Ứng` / `P. Kiểm soát Chi phí` / `Ban Giám đốc`), 11 email `Distinct` khớp từng dòng bảng §0 `sub-implbe-k3.md`; Cấp 1 OR-4 / OR-4 / OR-1, Cấp 2 `tra.bui` / `chuong.phan`; `AllowApproverFinalize=true` **chỉ**`(CCM, Cấp 2, chuong.phan)` đặt PER-ROW; idempotent `AnyAsync(w.Code == code)`; UNGATED demo-seed. ✅
2. **Finalize qua choke-point + 2-lệnh-grep LUẬT** — chạy CẢ HAI:
- `Phase = ContractSigningPlanPhase.DaDuyet``:280`, `:322` (+ `:336` là dòng doc)
- `ApplyApprovedValuesOnFinalize``:279`, `:321` (+ doc/def/comment)
**cùng khớp**: 2 site gán DaDuyet ↔ 2 site gọi helper, helper đứng NGAY TRƯỚC gán ở cả hai. ✅
3. **Rào (v)**`ContractSigningPlanFeatures.cs:411-420`, regex `"^KHKK-N([1-8])$"` neo 2 đầu, khớp literal seeder `$"KHKK-N{n}"` n=1..8; so với `approvalGroup` (`:395` = `request.ApprovalGroup ?? Default`); code ngoài họ → cho qua. ✅
4. **8 key VÀO All + DELTA (đếm MÁY)**`MenuKeys.All` = **64** (HEAD `2967c43` = **56**) ⇒ **+8**; policies DERIVED = **256** (HEAD **224**) ⇒ **+32**. 8 menu-row `DbInitializer.cs:1980-1989` order 3..10 dưới `ApprovalWorkflowsV2`. ✅ mã — ❌ khai (F-3).
5. **FE phép-âm `Khkk_` = 0-hit + control dương**`git diff -U0 | grep -E "^\+.*Khkk_[A-Za-z]+: *'"` = **0**; control dương cùng regex trên cả `Layout.tsx` = **6** hit ⇒ mẫu CÓ RĂNG. Nhánh mới `Layout.tsx:181` `/^KhkkN[1-8]$/` nằm TRONG `awV2Match`, đặt SAU whitelist 3 code cũ. ✅
## 4. Ranh giới
## §3 Phán 3 quyết-định lead
## 5. Test lane
- **(i) GIỮ PUT-Conflict (spec vá-3 bảo gỡ) — LEAD ĐÚNG, spec vá-3 LIỆT NHẦM.** `UpdateAwDefinitionCommandHandler` (`:515-649`) **0 lần** tham chiếu `typeEnum`/`ContractSigningPlan`; grep 2 token toàn file cho hit ở `:97/:125/:126/:331/:341/:349/:387`**tất cả** thuộc list/create, KHÔNG hit nào trong thân PUT. Guard `:598-603` (echo cờ) · `:612-617` (dòng mới) · `:627-632` (bỏ người giữ cờ) là **luật versioning CHUNG mọi ApplicableType**; gỡ = nới rào cho PE/Contract/Proposal = regression ngoài scope K3. Thêm: gỡ FE-lock (đúng) đã đủ để cờ seed `true` không đẻ 409 lúc PUT vì payload nay echo giá trị THẬT.
- **(ii) GIỮ ép-false `AllowApproverSkipToFinal` type-10 (O-1) — LEAD ĐÚNG ở BE, nhưng sweep BẤT ĐỐI XỨNG (F-2).** Tự verify: token `AllowApproverSkipToFinal` trong `ContractSigningPlanWorkflowService.cs` = **1 hit duy nhất `:47`, và là COMMENT** ⇒ service **0 lần đọc cờ**; control dương: cùng token trong `PurchaseEvaluationWorkflowService.cs` = **3 hit** (code thật) ⇒ grep có răng. Echo cờ cho type-10 = đẻ config-lie #78 mới ⇒ giữ ép-false ĐÚNG.
- **(iii) Seed cờ cùng-commit ≠ config-lie #78 — ĐÚNG, nhánh THẬT tồn tại.** `ContractSigningPlanWorkflowService.cs:276-289`: `if (actingLevel.AllowApproverFinalize && applyLevelFinalize)``EndedByLevelFinalize=true``ApplyApprovedValuesOnFinalize(plan)``Phase=DaDuyet` → xoá 2 con-trỏ → log → `return`. Cờ seed CÓ máy tiêu thụ trong cùng diff. ✅ *(nhưng đường ĐI NGƯỢC — bỏ tick để trình CEO — chết ở tầng UI: F-1)*
## §4 Ranh giới
- `ReturnOrRejectAsync` (`:354+`), `ApplyApprovedValuesOnFinalize` (`:345-349`), nhánh advance thường (`:293-329`): `git diff -U0` trên service chỉ **5 hunk** = `@@-37,10` (comment) · `@@-89,0` (thêm param) · `@@-124` (truyền param) · `@@-245` (chữ ký private) · `@@-266,0 +270,21` (khối finalize MỚI) ⇒ **0 dòng nội-dung đổi** trong 3 vùng trên. ✅
- Submit-guard K2 / file K1: không có trong `git diff --name-only`. ✅
- **0 migration mới**: `git diff --name-only | grep -i migration` = **0**; `git status --porcelain -- src tests | grep '^??'` = **rỗng**. ✅
- Route/menu-row NGOÀI 8 `AwV2_KhkkN*`: DbInitializer thêm đúng 8 row; Layout thêm đúng 1 nhánh regex họ `AwV2_`. ✅
- Rào (v) chỉ ở CREATE — `UpdateContractSigningPlanCommandHandler` không chạm `ApprovalWorkflowId`/`ApprovalGroup` (0 hit trong thân) ⇒ không có lỗ update-lách. ✅
## §5 Test lane (mở ruột 2 test)
- **T-a `ApproveV2_CapMangCoKetThuc_ChotPhieuNgay_KhongTrinhTiepBuocSau`** (`ContractSigningPlanApprovalTests.cs:944-994`): đo hành-vi THẬT qua service. Sanity 3 vế TRƯỚC (`ShouldBeAt(ChoDuyet,1,2)` · `EndedByLevelFinalize=false` · `StepCountAsync == 3` kèm lý-do *"Cấp mang cờ KHÔNG được là cấp cuối — nếu là cấp cuối thì phiếu kết thúc ở CẢ HAI thế giới và test này xanh mà không chứng minh gì"* = **anti-tautology guard**). Đo SAU 5 trục: phase + 2 con-trỏ · cờ runtime · `ApprovedAmount` 3 dòng gồm ca `??=` giữ 300 · opinion signer. Kèm **chứng-nhân song sinh** `WitnessAtFlagLevel` bất động (cả cờ lẫn giá). ✅
- **T-e `CreateAwDefinition_LoaiKhkk_GiuNguyenCoKetThucTaiCap_KhongConEpFalse`** (`:1079-1104`): 3 vế — (i) tick ⇒ `true`; (ii) không tick ⇒ `false` (chặn "bật bừa"); (iii) **đối-chứng type khác** `DuyetNcc` cũng `true` ⇒ phân biệt "gỡ ép-false" với "đổi thành ép-true". Đi qua `CreateAwDefinitionCommandHandler` THẬT. ✅
- **0 đè test cũ**: `git diff -- tests/ | grep -c '^-[^-]'` = **2**, cả 2 là cùng một sửa cơ-học `TransitionAsync(..., CancellationToken.None)``(..., ct: CancellationToken.None)` (named-arg vì thêm param) — **không** nới assert nào.
## §6 FINDING (8)
**MAJOR**
- **F-1** `fe-{user,admin}/src/pages/khkk/KhkkWorkflowPanel.tsx:136-142`**opt-out `applyLevelFinalize` KHÔNG có tầng UI ⇒ trạm CEO chết ở 8/8 workflow seed.** Body POST là **literal đúng 2 field** `{action, comment}`; `grep applyLevelFinalize fe-*/src` = **0 hit** ở KHKK. Controller `ContractSigningPlansController.cs:213` `?? true` ⇒ mọi lượt Chương bấm "Duyệt" đều finalize. Seeder cắm cờ cho `chuong.phan`**cả 8** workflow ⇒ Step 3 «Ban Giám đốc» (`truong.nguyen`) **không đường nào tới**. **Đối-chứng chứng minh đây KHÔNG phải khuôn PE**: `fe-*/src/components/pe/PeWorkflowPanel.tsx:63` = `useState(false)` + `:259` LUÔN gửi tường minh ⇒ PE mặc-định **KHÔNG** kết-thúc-sớm (opt-in tại UI); KHKK mặc-định **LUÔN** kết-thúc-sớm. Lời owner OG-3/OG-9 (*"a Chương sẽ quyết định là cái đó cần CEO ko"*) **không thực thi được từ UI**. Kèm: comment `KhkkWorkflowPanel.tsx:15-17` khẳng định *"không có gì để panel render thêm"* — tiền-đề SAI, chính wave này vừa đẻ tham số để người duyệt quyết. Acceptance: thêm ô tick opt-out ở panel (mirror `PeWorkflowPanel.tsx:778`), HOẶC khai tường minh lên HANDOFF rằng "trình CEO" hiện chỉ làm được bằng admin bỏ cờ ở Designer.
- **F-2** `ApprovalWorkflowV2AdminFeatures.cs:387``fe-admin/src/pages/system/ApprovalWorkflowsV2Page.tsx:263` + `:1300-1310`**sweep ép-false bất-đối-xứng ⇒ tick bị NUỐT IM LẶNG.** FE gỡ khoá **cả 2** ô (gồm `allowApproverSkipToFinal`), BE **giữ** ép-false `SkipToFinal` cho type-10. Admin tick "Cho phép duyệt thẳng Cấp cuối" trên quy trình KHKK → CREATE lưu `false`, UI không báo gì. Đây đúng class mà comment vừa bị xoá đã cảnh báo (*"màn hình nói một đằng dữ liệu một nẻo"*), chỉ đảo chiều. **0 test phủ** (T-e chỉ đo `Finalize`). Acceptance: giữ `disabled` riêng ô SkipToFinal cho type-10, HOẶC bỏ ép-false BE + port nhánh.
- **F-3** `docs/STATUS.md:6`**DELTA đo được nhưng chưa khai.** Máy: `All` 56→**64** (+8); policies 224→**256** (+32); STATUS vẫn ghi "Policies **224** · Menu keys **56**". Spec cụm-1 vá-1 bắt "mỗi commit kèm lệnh đếm lại + cập nhật 2 row STATUS". **Tái phát y hệt** finding ④ của gate K1 cùng phiên.
**MINOR / khai-thật**
- **F-4** Suite **flake 1/3 lượt**: `dotnet test SolutionErp.slnx` lượt #1 `Failed: 1, Passed: 568``ContractSigningPlanCrudTests.DeleteContractSigningPlan_SoftDeletes_KeepsChangelog_ThenCreateAgainSucceeds` chết ở `KhkkFixture..ctor()` `:62` `EnsureCreated()``CallSiteRuntimeResolver`. Fixture có từ W2 ⇒ **không phải K3 đẻ**, nhưng câu "614/0 tươi" chỉ đúng 2/3 lượt — đừng khai trần.
- **F-5** `DbInitializer.cs:665` — seeder idempotent per-Code **thuần skip, 0 nhánh UPDATE**: roster đổi (người nghỉ / đổi phòng) ⇒ phải UPDATE tay trên prod. Cùng lớp seeder SP-002 ở K1.
- **F-6** `DbInitializer.cs:637-640``Description` khai *"Admin có thể chỉnh người/quyền tại chỗ hoặc tạo version mới"*: nửa sau đúng, nửa đầu **sai với cờ finalize**`ApprovalWorkflowV2AdminFeatures.cs:598-600` chặn đổi cờ, `:627-629` chặn bỏ người giữ cờ khi sửa tại chỗ. Chuỗi này hiển thị ra UI admin.
- **F-7** `ContractSigningPlan.cs:51` + `fe-*/src/types/khkk.ts:260``EndedByLevelFinalize` **được GHI nhưng chưa expose DTO** (chính FE type tự khai). Test T-a lý-giải *"FE/GĐ3 đọc cột này"* — hiện **chưa** ai đọc; ghost-window đã-khai, không phải bug, nhưng câu biện-minh mạnh hơn sự thật.
- **F-8** `ContractSigningPlanWorkflowService.cs:37-42` + `:335-337` — 2 lệnh grep tự-kiểm in ra **gồm cả chính dòng `///` doc** (`:336`, `:337`) ⇒ người chạy sau đếm 3 vs 5 rồi tưởng lệch. Nên nêu rõ "bỏ dòng `///` khi đếm".
## §7 Verdict
**PASS-WITH-FLAGS** — build 0W/0E · suite 614/0 (lượt tươi) · npm ×2 sạch; 5/5 điểm code-vs-spec khớp; 3/3 quyết-định lead ĐÚNG về kỹ-thuật; ranh giới sạch (0 mig, 0 đổi hành-vi vùng cấm, 0 route ngoài họ). **0 blocker kỹ-thuật**, nhưng **F-1 + F-2 là nợ HÀNH-VI**: F-1 làm mất đúng cái quyền quyết mà owner vừa chốt (OG-3/OG-9); F-2 tái tạo class "UI nói một đằng DB một nẻo" ở ô còn lại. F-3 là acceptance chưa đóng. Owner/lead quyết ship-rồi-vá hay vá-trước-ship.
END sub-reviewer-gate-k3 — TOTAL: 8 finding (3 MAJOR / 5 MINOR) · 0 blocker build-test · verdict PASS-WITH-FLAGS