Files
solution-erp/.claude/workflows/runs/2026-07-29-S159-tong-quan-pipeline-menu/cicd-verify-b5799fc.md
2026-07-29 12:07:47 +07:00

9.7 KiB
Raw Blame History

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 4m405m40, 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 DptYR4wL0GO8mgrG
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).