9.7 KiB
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→ ignoredfe-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êmPermissions(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
4169e14success — S158; #42033e7f68cancelled ⇒ 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=nulllà BÌNH THƯỜNG với endpointtasks(tái xác nhận từ S126/S128/S132) ⇒ tinstatus, không tinconclusion. - 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).