wal: flush 20260729T1207
This commit is contained in:
@ -0,0 +1,189 @@
|
||||
# cicd-verify `b5799fc` — S159 L8 "Tổng quan tất cả luồng duyệt"
|
||||
|
||||
> 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.
|
||||
> Bắt đầu: 2026-07-29 ~11:44+07 · agent cicd-monitor (READ-only)
|
||||
|
||||
---
|
||||
|
||||
## M1 — Push + path-filter · ✅ PASS
|
||||
|
||||
```
|
||||
git log -1 → b5799fc5d373feaf94604cc4b4d9207cfb277826
|
||||
[CLAUDE] FE-User: Tong quan tat ca luong duyet - pipeline 4 giai doan
|
||||
2026-07-29 11:43:25 +0700
|
||||
git log origin/main..HEAD → EMPTY (đã push thật)
|
||||
```
|
||||
|
||||
**Range `bbc39be..b5799fc` = 8 commit** (b5799fc + 7 `wal:` flush xen giữa), **37 file**.
|
||||
⚠️ Tự-đính-chính vs spec: spec nói "1 file" — đúng ở nghĩa **1 file CODE**, nhưng range thật 37 file
|
||||
(36 file còn lại đều `.claude/**` governance/memory/run-trace + `*.md`).
|
||||
|
||||
**Soi TỪNG file vs 7-glob `paths-ignore` (AS-6, gotcha #41):**
|
||||
- `.claude/agent-memory/**` (12 file) → ignored
|
||||
- `.claude/workflows/runs/**` (21 file, gồm 2 `.txt`) → ignored
|
||||
- `.claude/WAL.md` + `.claude/sessions/session-8/*.md` (3 file) → khớp `**/*.md` → ignored
|
||||
- **`fe-user/src/pages/UserDashboardPage.tsx` → KHÔNG khớp glob nào ⇒ CI PHẢI fire.**
|
||||
|
||||
`git diff --stat` file code: **`fe-user/src/pages/UserDashboardPage.tsx` | 743 +++/---**
|
||||
|
||||
## M3 — Migration VẮNG là ĐÚNG · ✅ PASS (kỳ vọng, không phải cờ đỏ)
|
||||
|
||||
```
|
||||
git diff --name-only bbc39be..b5799fc -- 'src/Backend/*' '*Migrations*' → 0 dòng
|
||||
```
|
||||
⇒ 0 BE, 0 migration. **KHÔNG query `__EFMigrationsHistory`** (không có gì để đối chiếu).
|
||||
Mig prod vẫn kỳ vọng 68 `AddPeAllowApproverDelete` / 89 `sys.tables` — không đụng.
|
||||
|
||||
## Pre-deploy bundle snapshot (chốt TRƯỚC khi deploy land — bài học S117)
|
||||
|
||||
Đo lúc **2026-07-29 11:44:56+07** (run #422 đang `running`, chưa tới step deploy):
|
||||
|
||||
| App | js | css | HTTP |
|
||||
|---|---|---|---|
|
||||
| admin | `index-8-QYcMOg.js` | `index-DiNJjaoo.css` | 200 |
|
||||
| user | `index-DptYR4wL.js` | `index-BRCvEHvC.css` | 200 |
|
||||
|
||||
⇒ **Khớp CHÍNH XÁC baseline S158** (admin `8-QYcMOg` · user `DptYR4wL`) ⇒ baseline hợp-lệ, deploy chưa land.
|
||||
|
||||
## M5-pre — Marker có trong SOURCE local (chốt kỳ vọng trước khi soi bundle prod)
|
||||
|
||||
`fe-user/src/pages/UserDashboardPage.tsx` (31.768 B), đếm BYTES utf-8:
|
||||
|
||||
| Chuỗi | count source | vai trò |
|
||||
|---|---|---|
|
||||
| `Tổng quan tất cả luồng duyệt` | **2** | header trang |
|
||||
| `Toàn trình 4 giai đoạn` | **1** | h2 — CHỈ có ở bản SAU review-fix |
|
||||
| `Đề xuất ký kết hợp đồng` | **2** | nhãn GĐ2 |
|
||||
| `Pipeline 4 giai đoạn` | **0** | ✅ bản designer gốc đã bị thay |
|
||||
| `sẵn sàng nối tiếp` | **0** | ✅ control ÂM — FLAG-3 đã gỡ |
|
||||
|
||||
⇒ Local ĐÚNG là bản-đã-fix. Bundle prod phải phản chiếu y hệt (dương 3 / âm 0).
|
||||
|
||||
## M7 — Menu-data prod áp TRƯỚC push (data-change, KHÔNG qua CI) · ✅ PASS 3/3
|
||||
|
||||
Đo **2026-07-29 ~11:46+07** (sau khi run #422 đã start, tức đã qua ít nhất 1 nhịp) — `sqlcmd -S .\SQLEXPRESS -E -d SolutionErp`:
|
||||
|
||||
**(a) 3 root ẩn — kỳ vọng 0×3:**
|
||||
```
|
||||
Hrm:0 · Off:0 · Personal:0 ✅ NGUYÊN (backup pre-apply ghi 1/1/1 → apply hạ về 0)
|
||||
```
|
||||
|
||||
**(b) grant-set 38 key — kỳ vọng min=max=13:**
|
||||
```
|
||||
GRANT min=13 max=13 keys=38 minrows=13 ✅ khớp verify-post-apply
|
||||
```
|
||||
(grant-set = 9 key Master-subtree + `Contracts` + 28 `Ct_*`; khớp toán 9×11=99 UPDATE · 28×13+12=376 INSERT)
|
||||
|
||||
**(c) control ÂM `Pe_*` — kỳ vọng 197/185:**
|
||||
```
|
||||
WHERE MenuKey LIKE 'Pe%' → rows=197 canread=185 ✅ EXACT
|
||||
```
|
||||
🔎 **Tự-bắt lỗi hình-dạng-truy-vấn (đừng đọc nhầm thành cờ đỏ):** lần đo đầu tao dùng
|
||||
`LEFT(MenuKey,3)='Pe_'` → ra **182/182**, LỆCH so với 197/185. Không vội FAIL — enumerate ra
|
||||
nguyên nhân là **phạm-vi truy vấn**, không phải dữ liệu đổi:
|
||||
- 14 key `Pe_*` × 13 = **182 rows / 182 canread**
|
||||
- `LIKE 'Pe%'` gom thêm `Permissions` (1/1) + `Personal` (13/1) + `PeWorkflows` (1/1) = **+15 rows / +3 canread**
|
||||
- 182+15 = **197** · 182+3 = **185** ⇒ khớp từng đồng, control âm NGUYÊN VẸN.
|
||||
|
||||
⇒ App pool recycle (nếu có) **không hề đụng** menu-data. M7 PASS.
|
||||
|
||||
## M2 — Poll terminal · ⏳ đang chờ
|
||||
|
||||
Run tìm được qua `actions/tasks?limit=5` khớp `head_sha`:
|
||||
- **id=535 · run_number=422 · head_sha `b5799fc5` · created 2026-07-29T11:43:34+07 · status=`running`**
|
||||
- (kề trên: #421 id=534 `4169e14` success — S158; #420 `33e7f68` cancelled ⇒ run_number lệch, phải key theo head_sha)
|
||||
- poll 11:46:26 · 11:47:37 · 11:48:09 · 11:48:42 · 11:49:13 → `running`
|
||||
- **11:49:45 → `status=success`** (upd 11:49:33). `conclusion=null` là BÌNH THƯỜNG với endpoint `tasks`
|
||||
(tái xác nhận từ S126/S128/S132) ⇒ tin `status`, không tin `conclusion`.
|
||||
- **Duration: 11:43:34 → 11:49:33 = 5m59s** (nhỉnh hơn dải gần đây 4m40–5m40, vẫn dưới ngưỡng escalate 10m)
|
||||
|
||||
### M2b — Test gate trong log · ✅ 562 EXACT
|
||||
|
||||
`…/actions/runs/422/jobs/0/logs` (17.910 B):
|
||||
```
|
||||
Passed! - Failed: 0, Passed: 45, Skipped: 0, Total: 45, Duration: 149 ms - SolutionErp.Domain.Tests.dll
|
||||
Passed! - Failed: 0, Passed: 517, Skipped: 0, Total: 517, Duration: 1m37s - SolutionErp.Infrastructure.Tests.dll
|
||||
```
|
||||
`Failed!` xuất hiện **0 lần** trong toàn log.
|
||||
⇒ **45 + 517 = 562**, khớp baseline S158 **cả TỔNG lẫn TÁCH-PHẦN** (khớp thành-phần > khớp tổng).
|
||||
Delta = 0 — đúng kỳ vọng cho commit FE-only không kèm test mới.
|
||||
|
||||
## M4 — Bundle rotate · ✅ PASS (đo, không giả định)
|
||||
|
||||
Đo **11:49:58+07**, ~25s sau khi run terminal:
|
||||
|
||||
| App | asset | TRƯỚC | SAU | KQ |
|
||||
|---|---|---|---|---|
|
||||
| **user** | js | `DptYR4wL` | **`0GO8mgrG`** | ✅ **ROTATE** (điều kiện PASS bắt buộc) |
|
||||
| user | css | `BRCvEHvC` | **`BARVqkP-`** | ROTATE (utility-class mới: lưới pipeline/amber) |
|
||||
| admin | js | `8-QYcMOg` | **`BHodkPNV`** | ROTATE — #69 mode-A, lành tính (CI build cả 2 app dù 0 admin-src) |
|
||||
| admin | css | `DiNJjaoo` | `DiNJjaoo` | FROZEN byte-identical — #69-REFINE, 0 admin-src ⇒ CSS y hệt |
|
||||
|
||||
Cặp admin (js rotate + css frozen) = dấu-vân-tay "không có thay đổi nguồn admin", nhất quán với diff.
|
||||
|
||||
## M5 — Byte-marker trong bundle USER prod · ✅ PASS 3 dương + 2 âm
|
||||
|
||||
Tải THẲNG `https://eoffice.solutions.com.vn/assets/index-0GO8mgrG.js`, đếm trên **BYTES** (`b.count(s.encode('utf-8'))`, tránh bẫy decode cp1252):
|
||||
|
||||
```
|
||||
200 · ct=application/javascript · size=1.584.514 B · LM=Wed, 29 Jul 2026 04:49:05 GMT (= 11:49:05+07)
|
||||
```
|
||||
LM **nằm trong cửa-sổ deploy** (run kết thúc 11:49:33) + real-size 1,58 MB ⇒ artifact thật, mới ghi.
|
||||
|
||||
| Chuỗi | bundle | code-occurrence trong source | KQ |
|
||||
|---|---|---|---|
|
||||
| `Tổng quan tất cả luồng duyệt` | **1** | 1 (L398 `title=`) | ✅ EXACT |
|
||||
| `Toàn trình 4 giai đoạn` | **1** | 1 (L414 `<h2>`) | ✅ EXACT |
|
||||
| `Đề xuất ký kết hợp đồng` | **1** | 1 (L476 `StageCard index={2}`) | ✅ EXACT |
|
||||
| `Pipeline 4 giai đoạn` | **0** | 0 | ✅ bản designer CŨ VẮNG |
|
||||
| `sẵn sàng nối tiếp` | **0** | 0 | ✅ **control ÂM VẮNG** (FLAG-3 đã gỡ) |
|
||||
|
||||
🔎 **Giải-trình lệch 2-vs-1 (đo được, không phẩy tay):** `grep -c` trên source ra **2** cho marker 1 và 3,
|
||||
nhưng bundle chỉ **1**. Truy ra: occurrence dư nằm ở **COMMENT đầu file** (L1 `// "Tổng quan…"`,
|
||||
L5 `// GĐ2 Đề xuất ký kết hợp đồng …`) — minifier strip comment. Literal JSX THẬT đúng **1 lần/marker**.
|
||||
⇒ Bundle **khớp CHÍNH XÁC số occurrence-code**, mạnh hơn "tìm thấy ≥1".
|
||||
|
||||
🔒 **Kết luận then-chốt:** thấy `Toàn trình 4 giai đoạn` + KHÔNG thấy `Pipeline 4 giai đoạn`
|
||||
⇒ prod đang chạy **bản SAU review-fix**, KHÔNG phải bản designer gốc. Đây là phép quyết định của lượt này.
|
||||
|
||||
### Control ÂM 2 TẦNG (SPA-fallback trap + chứng ghi-đè)
|
||||
|
||||
| Probe | HTTP | Content-Type | size | Đọc thế nào |
|
||||
|---|---|---|---|---|
|
||||
| `index-0GO8mgrG.js` (thật) | 200 | `application/javascript` | 1.584.514 | artifact thật |
|
||||
| `index-ZZdoesnotexist0.js` (bịa) | **200** | **`text/html`** | **876** | SPA rewrite → 200 VÔ NGHĨA; `ct` là bộ phân-biệt sạch |
|
||||
| `index-DptYR4wL.js` (**hash CŨ**) | **200** | **`text/html`** | **876** | 🔑 **bundle cũ ĐÃ BIẾN MẤT khỏi đĩa** ⇒ chứng GHI-ĐÈ thật, mạnh hơn hash-delta đơn thuần |
|
||||
|
||||
## M6 — Smoke · ✅ PASS 4/4
|
||||
|
||||
```
|
||||
GET https://api.solutions.com.vn/health/live → 200 "Healthy"
|
||||
GET https://api.solutions.com.vn/health/ready → 200 "Healthy"
|
||||
GET https://admin.solutions.com.vn/ → 200 <!doctype html> lang="vi"
|
||||
GET https://eoffice.solutions.com.vn/ → 200 <!doctype html> lang="vi"
|
||||
```
|
||||
(BE 0-change nên health = kiểm tra app pool sống sau recycle, không phải kiểm feature.)
|
||||
|
||||
---
|
||||
|
||||
## VERDICT: **PASS 9/9**
|
||||
|
||||
| # | Mục | KQ |
|
||||
|---|---|---|
|
||||
| 1 | Push + path-filter (CI fire đúng, không skip #41) | ✅ |
|
||||
| 2 | Run #422 terminal `success` 5m59s | ✅ |
|
||||
| 3 | Test gate **562** = 45 D + 517 I, 0 fail/skip | ✅ |
|
||||
| 4 | Migration VẮNG là ĐÚNG (0 file BE/Mig) | ✅ |
|
||||
| 5 | Bundle **user** rotate `DptYR4wL`→`0GO8mgrG` | ✅ |
|
||||
| 6 | 3 marker DƯƠNG, count-exact vs code | ✅ |
|
||||
| 7 | 2 marker ÂM vắng (`sẵn sàng nối tiếp` + `Pipeline 4 giai đoạn`) | ✅ |
|
||||
| 8 | Smoke API health ×2 + FE origin ×2 | ✅ |
|
||||
| 9 | Menu-data prod nguyên (0×3 · 38 key 13/13 · Pe 197/185) | ✅ |
|
||||
|
||||
**Không có cờ đỏ. Không khuyến nghị rollback.**
|
||||
|
||||
Ghi-chú cho lượt sau: baseline ship mới = **user js `0GO8mgrG` / css `BARVqkP-` · admin js `BHodkPNV` / css `DiNJjaoo`**;
|
||||
gate giữ **562**; Mig vẫn **68** / 89 bảng (không đụng).
|
||||
|
||||
<!-- END cicd-verify-b5799fc · VERDICT=PASS 9/9 -->
|
||||
|
||||
@ -28,3 +28,13 @@ Key IsVisible
|
||||
Hrm 1
|
||||
Off 1
|
||||
Personal 1
|
||||
## label-backup TRUOC danh so (2026-07-29T11:50:52+07:00)
|
||||
Key Order Label
|
||||
--- ----- -----
|
||||
Ct_ThauPhu 31 HD Th?u ph?
|
||||
Ct_GiaoKhoan 35 HD Giao kho<68>n
|
||||
Ct_NhaCungCap 39 HD Nh<4E> cung c?p
|
||||
Ct_DichVu 43 HD D?ch v?
|
||||
Ct_MuaBan 47 HD Mua b<>n
|
||||
Ct_NguyenTacNcc 51 HD Nguy<75>n t?c NCC
|
||||
Ct_NguyenTacDv 55 HD Nguy<75>n t?c D?ch v?
|
||||
|
||||
@ -37,6 +37,21 @@
|
||||
· FLAG-6 [L] 2 nút Thử-lại trùng → **PARK** (reviewer tự đính chính giữa chừng; cosmetic, chấp nhận)
|
||||
· FLAG-7 [L] nhãn GĐ4 → **NO_CHANGE** (đúng spec owner ❷/❹ — GĐ4 cố ý ngoài hệ thống)
|
||||
- [x] **T4b — build độc lập SAU mọi edit** ✅ PASS 454ms (`tsc -b && vite build`) · 6/6 `group` land · diagnostics IDE giữa chừng = snapshot dở (#68), bác bằng compiler thật
|
||||
- [x] **T4c — commit đợt-1 `b5799fc` push → cicd `PASS 9/9`** (bundle user `DptYR4wL`→`0GO8mgrG`, 3 marker dương + 2 control âm, smoke 4/4; return garble #53 lần 10 — đĩa `cicd-verify-b5799fc.md` 9.930B trọn)
|
||||
|
||||
## ĐỢT-2 (3 lệnh mid-turn của anh, 11:24-11:5x)
|
||||
|
||||
**Owner verbatim:** ① *"sửa giao diện nhanh"* ② ảnh tab strip 4 giai đoạn trên phiếu + *"cho hiển thị các tab phía trên như này nhé"* ③ *"Phần menu cũng hiển thị đúng như vậy luôn. (Trình ký Hợp đồng đổi thành Duyệt hợp đồng, ký cứng -> Hợp đồng cứng)"* · UAT anh Kiệt (chat FDC): *"cho đánh số thứ tự phía trước giúp anh — 01 . HĐ thầu phụ"*.
|
||||
🔴 **Bộ tên 4-GĐ CHỐT MỚI NHẤT (supersede nhãn ❶ sáng nay):** Duyệt NCC · **Kế hoạch ký kết HĐ** · **Duyệt hợp đồng** · **Hợp đồng cứng** — tin-mới-nhất-thắng; nhãn "Đề xuất ký kết hợp đồng" (❶) chỉ sống 1 buổi, spec sẽ ghi cả 2 đời.
|
||||
|
||||
- [x] **Đ2-a — đánh số 01.-07. nhóm HĐ** ✅ prod LIVE tức thì (`renamed=7`, prepend-only **0 ký tự VN qua wire** — né E-010) + seeder `typeLabels` + labelBackfill 7 entry
|
||||
- [x] **Đ2-b — menu 4-GĐ prod** ✅ SQL qua **file UTF-16 + scp** (3 nhãn VN mới an toàn): `ren_pe=1 ren_ct=1 perm=26` (=13×2, khớp toán) · root order: Duyệt NCC(25) → Kế hoạch ký kết HĐ(26) → Duyệt hợp đồng(31) → Hợp đồng cứng(32) · bẫy shell VPS = PowerShell 5.1 không nhận `&&`
|
||||
- [x] **Đ2-c — `PePipelineStrip` mirror ×2 app** ✅ byte-identical (`ef7b78…`) + chèn `PeDetailTabs` ×2 giữ **md5 parity** (`5be2ca…`, edit qua python assert count==1) — GĐ1 active, GĐ2/GĐ4 badge "Sắp", stage không-active KHÔNG click (không giả link)
|
||||
- [x] **Đ2-d — staticMap +2 route** (`KeHoachKyKet`/`HopDongCung` → `/dashboard`; thiếu là sidebar **drop SILENT** — gotcha #50) + đồng bộ 3 nhãn + 3 aria-group dashboard
|
||||
- [x] **Đ2-e — build FE ×2 PASS + test 562 PASS** (seeder đụng ⇒ chạy đủ) → **commit `1a47a61` push** (8 file, 190+/18−)
|
||||
- [!] **Đ2-f — cicd verify `1a47a61`** đang chạy (kèm check seeder-re-run không double-insert: 12 root, 7 nhãn `01.` nguyên)
|
||||
|
||||
🔸 fe-admin sidebar: 2 root placeholder sẽ **drop silent** (không thêm staticMap admin — cố ý, admin không cần placeholder; ghi để khỏi đọc thành bug)
|
||||
- [x] **T2 — Prod menu data** ✅ **LIVE + VERIFY TRỌN** (`prod-backup-pre-apply.txt` → apply `hide=3 upd=99 ins=376` → `prod-verify-post-apply.txt`):
|
||||
· Inspect lộ thực-trạng ≠ giả định: Master subtree có matrix 13-row/key (canread 2/13) nhưng **`Ct_*` 28 key = 0 ROW** (chưa từng seed), `Contracts` root 1 row ⇒ INSERT 376 + UPDATE 99, số khớp toán từng đồng (9×11=99 · 28×13+12=376)
|
||||
· Verify: **38/38 key min=max=13 canread** · 3 root `IsVisible=0` · control âm **Pe_* 197/185 NGUYÊN** (❹ "để như cũ") · `Hrm_Config*` canread=7 nguyên (vùng đang-làm loại khỏi grant, đúng ý ❸)
|
||||
|
||||
Reference in New Issue
Block a user