wal: flush 20260729T1425
This commit is contained in:
@ -0,0 +1,190 @@
|
||||
# cicd-verify `a2bbcb9` — S159 ĐỢT-4 "danh sách toàn trình: 7 FLAG reviewer fix + nhãn 'Bảng cứng'"
|
||||
|
||||
> Ghi-TỪNG-MỤC-trong-lúc-làm (chống #53). File = SẢN PHẨM CHÍNH; return chỉ tóm tắt.
|
||||
> Đợt-1 `b5799fc` PASS 9/9 · đợt-2 `1a47a61` PARTIAL 8/9 · đợt-3 `2a72695` PASS 9/9 — 3 file cũ KHÔNG chạm.
|
||||
> Bắt đầu: 2026-07-29 ~13:52+07 · cicd-monitor (READ-only)
|
||||
|
||||
---
|
||||
|
||||
## M1 — Push + phạm vi · ✅ PASS
|
||||
|
||||
```
|
||||
git log -1 → a2bbcb91c37de3d79a61809fd903d918e7d9f105
|
||||
[CLAUDE] FE-User: dot-4 danh sach toan trinh - 7 FLAG reviewer fix
|
||||
+ nhan 'Bang cung' (owner ve) · 2026-07-29 13:51:07 +0700
|
||||
git log origin/main..HEAD → EMPTY (đã push)
|
||||
```
|
||||
|
||||
Range `2a72695..a2bbcb9` = 9 file; **2 file CODE** (7 file còn lại `.claude/**`, ignored):
|
||||
|
||||
| File code | +/− | ghi chú |
|
||||
|---|---|---|
|
||||
| `fe-user/src/pages/UserDashboardPage.tsx` | **+1043 / −337** | redesign list toàn trình + 7 FLAG fix |
|
||||
| `src/Backend/…/Persistence/DbInitializer.cs` | **+9 / −1** | **label-only** |
|
||||
|
||||
⚠️ Tự-đính-chính nhẹ so với brief: brief ghi "1050+/338−", số thật `--numstat` = **1043/337**.
|
||||
Không đổi bản chất (FE-user 1 file + BE label-only).
|
||||
|
||||
**`fe-admin` KHÔNG có file nào trong diff** ⇒ admin bundle có thể rotate HOẶC frozen — cả hai
|
||||
đều lành tính (#69 TWO-MODE). Sẽ **ĐO rồi mới nói**, không phán trước.
|
||||
|
||||
**DbInitializer đúng là label-only** (đọc diff):
|
||||
```csharp
|
||||
- tree.Add(("Hdc_" + code, label, MenuKeys.HopDongCung, hdcOrder++, "FileText"));
|
||||
+ tree.Add(("Hdc_" + code, label + " - Bảng cứng", MenuKeys.HopDongCung, hdcOrder++, "FileText"));
|
||||
+ ["Hdc_ThauPhu"] = "01. HĐ Thầu phụ - Bảng cứng", … ×7 (labelBackfill)
|
||||
```
|
||||
Không đụng revoker / reviewKeys / grant ⇒ **không có rủi ro mới cho durability**, nhưng vẫn sẽ đo lại (M6).
|
||||
|
||||
## M2 — Migration VẮNG là ĐÚNG · ✅ PASS
|
||||
```
|
||||
git diff --name-only 2a72695..a2bbcb9 -- '*Migrations*' → 0
|
||||
```
|
||||
Mig giữ **68** / 89 bảng.
|
||||
|
||||
## 📌 BASELINE TRƯỚC RESTART (đo 13:52+07, run #425 đang `running`, pool CHƯA recycle)
|
||||
|
||||
| Phép đo | TRƯỚC restart |
|
||||
|---|---|
|
||||
| 38-key set | **min=13 max=13 keys=38** |
|
||||
| Skeleton `Khkk_`+`Hdc_` permission rows | **156** |
|
||||
| `Hdc_*` MenuItems có hậu tố (`Label LIKE '%-%'`) | **7** (prod đã SQL cùng ngày) |
|
||||
|
||||
Bundle trước deploy: admin js `CC1pGE1F` css `DWDbm5As` · user js `DeAg7MWm` css `BQIZ-rUe`
|
||||
— khớp CHÍNH XÁC baseline hậu-đợt-3 ⇒ baseline hợp lệ.
|
||||
|
||||
## 🔎 M3-pre — Marker kỳ vọng, đếm trên SOURCE (chốt trước khi soi bundle)
|
||||
|
||||
`UserDashboardPage.tsx` (63.124 B):
|
||||
|
||||
| Chuỗi | source | vai trò | dự đoán bundle |
|
||||
|---|---|---|---|
|
||||
| `chưa có thông tin ở giai đoạn này` | 1 | dương | 1 |
|
||||
| `đã sinh hợp đồng` | 1 | dương | 1 |
|
||||
| `Không tìm thấy` | 3 | dương | ≥1 |
|
||||
| `HĐ ĐANG SOẠN` | **0** | ÂM (KPI cũ bỏ) | 0 |
|
||||
| `Tổng giá trị nháp` | **0** | ÂM (KPI cũ bỏ) | 0 |
|
||||
| `chưa tới` | **2** ⚠️ | ÂM (DOT_TEXT cũ đã thay) | **0** |
|
||||
|
||||
⚠️ **BẪY ĐÃ GỠ TRƯỚC (nếu không soi sẽ báo FAIL oan):** `chưa tới` grep ra **2** trên source,
|
||||
nhưng cả 2 đều nằm trong **COMMENT** giải thích lý do FLAG-2:
|
||||
```
|
||||
L343: // [FLAG-2 reviewer đợt-4] 'chưa tới' là lời KHẲNG ĐỊNH sai với chấm PHÍA TRƯỚC
|
||||
L344: // giai đoạn hiện tại (HĐ ở GĐ3 thì GĐ1/GĐ2 là quá khứ, không phải "chưa tới").
|
||||
L345: none: 'chưa có thông tin ở giai đoạn này', ← chuỗi THAY THẾ (code thật)
|
||||
```
|
||||
⇒ occurrence-**CODE** = **0**; minifier strip comment ⇒ bundle phải = **0**.
|
||||
(Đúng mẫu comment-strip đã học ở đợt-1 — so bundle với occurrence-CODE, không với grep-source thô.)
|
||||
|
||||
## M4 — Poll terminal · ✅ PASS
|
||||
- **id=538 · run_number=425 · head_sha `a2bbcb91`** · created 13:51:15 → **`status=success` 13:56:55**
|
||||
- **Duration 5m40s** (đợt-1 5m59s · đợt-2 5m44s · đợt-3 5m56s) — ổn định, dưới ngưỡng.
|
||||
|
||||
### M4b — Test gate · ✅ 562 EXACT
|
||||
```
|
||||
Passed! - Failed: 0, Passed: 45, Skipped: 0, Total: 45, 159 ms - SolutionErp.Domain.Tests.dll
|
||||
Passed! - Failed: 0, Passed: 517, Skipped: 0, Total: 517, 1m27s - SolutionErp.Infrastructure.Tests.dll
|
||||
```
|
||||
`Failed!` ×0 ⇒ **562**. Giữ nguyên — đúng kỳ vọng (FE + label BE, không đụng test).
|
||||
Regression-guard đợt-3 (`StillHiddenKeys` / `ReopenedKeys`) nằm trong 517 này và **vẫn xanh**.
|
||||
|
||||
## M5 — Bundle · ✅ PASS (đo 13:57:23, sau status=success)
|
||||
|
||||
| App | asset | TRƯỚC | SAU | KQ |
|
||||
|---|---|---|---|---|
|
||||
| **user** | js | `DeAg7MWm` | **`CLfAftby`** | ✅ **ROTATE** (điều kiện bắt buộc) |
|
||||
| **user** | css | `BQIZ-rUe` | **`B6bUSFBt`** | ✅ ROTATE |
|
||||
| admin | js | `CC1pGE1F` | `CC1pGE1F` | **FROZEN** — lành tính, xem dưới |
|
||||
| admin | css | `DWDbm5As` | `DWDbm5As` | **FROZEN** — lành tính |
|
||||
|
||||
🔑 **Admin FROZEN = #69 mode-B, KHÔNG phải deploy hỏng — và tao chứng minh được, không đoán:**
|
||||
```
|
||||
ADMIN index-CC1pGE1F.js ct=application/javascript size=1.678.733 LM=13:55:31+07
|
||||
```
|
||||
`Last-Modified` **13:55:31 nằm TRONG cửa sổ deploy** (13:51:15→13:56:55) ⇒ file **ĐÃ được ghi lại**
|
||||
trong lần deploy này (deploy copy `dist\*` vô điều kiện), chỉ là Vite dựng ra **byte y hệt** vì
|
||||
`fe-admin` 0-file-thay-đổi ⇒ content-hash không đổi. Size trùng khít đợt-3 (1.678.733).
|
||||
⇒ Đây là "re-ship nội dung giống hệt", **không phải** "bundle cũ kẹt lại". Brief dặn "ghi nhận,
|
||||
không phán sai" — kết luận: **lành tính, nhất quán với diff**.
|
||||
|
||||
```
|
||||
USER index-CLfAftby.js ct=application/javascript size=1.601.698 LM=13:56:28+07 (in-window)
|
||||
```
|
||||
Control âm 2 tầng: hash CŨ `DeAg7MWm` **và** hash bịa đều trả 200 nhưng `ct=text/html` 876 B
|
||||
⇒ bundle đợt-3 đã biến mất khỏi đĩa = chứng ghi-đè thật.
|
||||
|
||||
## M3 — Byte-marker bundle USER · ✅ PASS (3 dương / 3 âm)
|
||||
|
||||
| Chuỗi | bundle | kỳ vọng | KQ |
|
||||
|---|---|---|---|
|
||||
| `chưa có thông tin ở giai đoạn này` | **1** | dương | ✅ |
|
||||
| `đã sinh hợp đồng` | **1** | dương | ✅ |
|
||||
| `Không tìm thấy` | **10** | dương | ✅ |
|
||||
| `chưa tới` | **0** | **ÂM** | ✅ |
|
||||
| `HĐ ĐANG SOẠN` | **0** | **ÂM** | ✅ |
|
||||
| `Tổng giá trị nháp` | **0** | **ÂM** | ✅ |
|
||||
|
||||
🔑 **Dự đoán comment-strip ĐÚNG:** source có `chưa tới` ×2 (đều trong comment L343-344), bundle ra
|
||||
**0** — xác nhận lại quy tắc "so bundle với occurrence-CODE, không với grep-source thô".
|
||||
Nếu đọc grep-source thô sẽ báo FAIL oan cho một control vốn ĐÚNG.
|
||||
⚠️ `Không tìm thấy` bundle=10 > source=3: chuỗi phổ thông, xuất hiện ở module khác nữa
|
||||
(empty-state dùng chung). Là marker DƯƠNG nên "≥1" đủ kết luận; không dùng nó làm phép đếm-chính-xác.
|
||||
|
||||
## M6 — RESTART-DURABILITY lần 2 · ✅ PASS (chứng bền qua ≥2 restart)
|
||||
|
||||
**Bước 0 — chứng minh có restart THẬT (giữ khuôn đợt-3):**
|
||||
|
||||
| Bằng chứng | Giá trị |
|
||||
|---|---|
|
||||
| Dòng ĐẦU log `solution-erp-20260729.log` | **`13:56:39.193 +07:00 [INF] Applying migrations...`** |
|
||||
| `w3wp` StartTime (mới nhất trong cửa sổ) | **13:56:33** |
|
||||
|
||||
Deploy xoá `logs/` ⇒ log mở lại lúc 13:56:39 = **boot mới**, DbInitializer (seeder + revoker) đã chạy.
|
||||
Mọi số dưới đo SAU mốc này.
|
||||
|
||||
| Phép đo | TRƯỚC restart (13:52) | **SAU restart (13:57)** | KQ |
|
||||
|---|---|---|---|
|
||||
| **38-key set** | 13/13/38 | **min=13 max=13 keys=38 · totcr=494/494** | ✅ **GIỮ** |
|
||||
| Skeleton `Khkk_`+`Hdc_` perms | 156 | **156** | ✅ |
|
||||
| `Hdc_*` nhãn có hậu tố `%-%` | 7 | **7** | ✅ |
|
||||
| Root menu | — | **12** | ✅ |
|
||||
| 3 root ẩn `Hrm`/`Off`/`Personal` `IsVisible` | — | **0 / 0 / 0** | ✅ |
|
||||
| **Control ÂM** `Hrm%`/`Off%`/`Personal` non-Admin canread | 0 | **0** | ✅ revoker CÒN SỐNG |
|
||||
| Control `Pe%` | — | **197 / 185** | ✅ |
|
||||
|
||||
🎯 **Đây là restart thứ 2 liên tiếp sau khi gỡ nhánh S92** (#424 rồi #425). Grant 38-key giữ
|
||||
**494/494** cả hai lần ⇒ không phải "may một lần". Control âm vẫn 0 ⇒ fix không phải do
|
||||
vô hiệu hoá cả revoker (chống Goodhart, giữ đủ 3 chân kiềng của đợt-3).
|
||||
|
||||
## M7 — Smoke · ✅ PASS 4/4
|
||||
```
|
||||
/health/live 200 Healthy · /health/ready 200 Healthy · admin 200 · eoffice 200
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## VERDICT: **PASS — 9/9**
|
||||
|
||||
| # | Mục | KQ |
|
||||
|---|---|---|
|
||||
| 1 | Push + range 2 file code (1043/337 + 9/1 label-only) | ✅ |
|
||||
| 2 | Migration VẮNG là ĐÚNG | ✅ |
|
||||
| 3 | Run #425 success 5m40s | ✅ |
|
||||
| 4 | Test gate **562** (45+517, 0 fail) | ✅ |
|
||||
| 5 | Bundle **user rotate** `DeAg7MWm`→`CLfAftby` (+css) | ✅ |
|
||||
| 6 | Admin FROZEN — chứng minh lành tính bằng **LM in-window + size trùng** (#69 mode-B) | ✅ |
|
||||
| 7 | 3 marker DƯƠNG trong bundle user | ✅ |
|
||||
| 8 | 3 control ÂM VẮNG (`chưa tới` / `HĐ ĐANG SOẠN` / `Tổng giá trị nháp`) + hash-cũ `text/html` | ✅ |
|
||||
| 9 | **Durability lần 2: 38-key 494/494 · skeleton 156 · Hdc nhãn 7 · root 12 · control âm 0 · Pe 197/185** | ✅ |
|
||||
|
||||
**Không có cờ đỏ. Không khuyến nghị rollback.**
|
||||
|
||||
Baseline mới: **user js `CLfAftby` / css `B6bUSFBt`** · admin **giữ** js `CC1pGE1F` / css `DWDbm5As`
|
||||
(frozen hợp lệ) · gate 562 · Mig 68 / 89 bảng · menu root 12 · 38-key 13/13 · skeleton 156.
|
||||
|
||||
### Ghi cho arc S159 (4 đợt)
|
||||
đợt-1 PASS 9/9 → đợt-2 PARTIAL 8/9 (bắt regression revoker ăn 447/494 row) → đợt-3 PASS 9/9
|
||||
(đóng regression, chứng bằng 3 chân kiềng) → **đợt-4 PASS 9/9 (tái xác nhận durability qua restart thứ 2)**.
|
||||
|
||||
<!-- END cicd-verify-a2bbcb9 · VERDICT=PASS 9/9 -->
|
||||
|
||||
@ -0,0 +1,28 @@
|
||||
# sub-reviewer — soi đối kháng diff đợt-5 (S159 L8)
|
||||
|
||||
**Vật soi:** `git diff` working-tree vs HEAD (`bbc39be`), 9 file trong scope (BE 4 + FE 5).
|
||||
**Chế độ:** tĩnh (không live-verify, theo lệnh lead).
|
||||
**Ghi từng FLAG NGAY khi chốt (chống #53).**
|
||||
|
||||
---
|
||||
|
||||
## Bản đồ file trong scope (đo từ `git diff --stat`)
|
||||
|
||||
| File | +/- |
|
||||
|---|---|
|
||||
| `src/Backend/SolutionErp.Api/Controllers/ContractsController.cs` | +12 |
|
||||
| `src/Backend/SolutionErp.Application/Contracts/ContractFeatures.cs` | +55 |
|
||||
| `src/Backend/SolutionErp.Application/PurchaseEvaluations/PeSoftDeleteFeatures.cs` | +1/-1 (comment) |
|
||||
| `src/Backend/SolutionErp.Infrastructure/Persistence/DbInitializer.cs` | +33/-3 |
|
||||
| `fe-user/src/App.tsx` | +2 |
|
||||
| `fe-user/src/components/Layout.tsx` | +15/-3 |
|
||||
| `fe-user/src/pages/UserDashboardPage.tsx` | +18/-339 |
|
||||
| `fe-user/src/pages/contracts/MyContractsPage.tsx` | +32/-7 |
|
||||
| `fe-user/src/pages/pe/WorkflowMatrixViewPage.tsx` | +4/-1 |
|
||||
|
||||
Ngoài scope lead khai (KHÔNG soi, chỉ ghi nhận có mặt trong working-tree): `.claude/agent-memory/cicd-monitor/MEMORY.md`, `.claude/commands/session-{start,end}.md`, `.claude/governance/.session-counter.json`, `docs/HANDOFF.md`, `docs/STATUS.md`, `scripts/governance-detectors.ps1`, `scripts/session_ctx.py`.
|
||||
|
||||
---
|
||||
|
||||
## FLAG (ghi dần)
|
||||
|
||||
Reference in New Issue
Block a user