[CLAUDE] Docs: S168 K8 dry-run PASS toan trinh 2 nhanh — STATUS 644/8-8-wave/bundle-444 + WAL chot + artifact K8/B15
- K8 dry-run: GD0 bo-test ZZTEST · GD1 PE A/052 finalize-CCM + A/053 full-CEO · GD2 KHKK/2026/001+002 (endpoint line MOI song prod) · bridge K7 -> HD DAU TIEN prod ZZTEST DaPhatHanh · GD4 ban-cung · QD9 4/4 ve (nguon-khoa-409 + catalog-rename-khong-lan) · B15 so-ID + seq-chay (KHKK 001-002 = test, phieu that dau = 003) - STATUS: :6 8/8 wave + 644 test (45D+599I #444) + bundle DLRf9TeA/C7TGA4Kn · WAL chot mandate xong — cho anh plan moi Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@ -0,0 +1,150 @@
|
||||
CICD-GD3D-LE: PASS 6/6 — run #444 success 6m28s, gate 644 = 45D + 599I (đúng +5 Fact), bundle rotate ×2 app với marker element-wise 1/2 khớp số trang mỗi app, route PUT lines/{lineId} 404→401 (bearer→400 gọi tên đủ 3 field của command MỚI), Mig prod GIỮ 71 set-diff 2 chiều rỗng.
|
||||
|
||||
# CI/CD verify — S168 GĐ3-D + Lines-editor KHKK (`a2b37dc..0bfadc2`)
|
||||
|
||||
Agent: cicd-monitor (READ-only) · 2026-08-01 · đo 17:10 → 17:22 (+07)
|
||||
Đề bài: 2 commit code (`081557b` GĐ3-D FE-only · `0bfadc2` Lines-editor BE+FE+test), 0 migration mới, gate kỳ vọng 644 = 45D + 599I.
|
||||
|
||||
---
|
||||
|
||||
## M0 — Push + range + path-filter + ancestry (#86 guard) — **PASS**
|
||||
|
||||
| Mục | Đo | Kết quả |
|
||||
|---|---|---|
|
||||
| TIP repo | `git log -1 origin/main` | `0bfadc2011defe60cb1b7a9b17dbf18fbdd35abd` |
|
||||
| Unpushed | `git log origin/main..HEAD` | **rỗng** |
|
||||
| Ancestry | `git merge-base --is-ancestor 081557b 0bfadc2` | **TRUE** ⇒ 1 run trên TIP phủ CẢ 2 commit |
|
||||
| Range files | `git diff --name-only a2b37dc..0bfadc2` | 18 file: 7 FE (`fe-admin/src` ×3 · `fe-user/src` ×4) + 2 BE + 1 test + `scripts/backup-sql.ps1` + 7 file `.claude/**` (paths-ignore) |
|
||||
| Path-filter (#41) | vs 7-glob | **CI PHẢI CHẠY** — `fe-*/src/**`, `src/Backend/**`, `tests/**` đều non-ignored |
|
||||
| Mig mới | `git diff … -- '*Migrations*'` | **RỖNG**; repo có **71** file mig (đếm neo đuôi `Designer\.cs$|ModelSnapshot\.cs$`) |
|
||||
|
||||
Commit kẹp giữa `2305c39`/`5c94612`/`7d08670` = `wal:` flush (chỉ `.claude/**`) ⇒ noise, không đẻ run.
|
||||
⚠️ **#86 KHÔNG tái diễn**: bảng run KHÔNG có run nào head_sha=`081557b` (bị nuốt hay không thì cũng không quan trọng) — **bằng chứng quyết định là marker M-B của `081557b` NẰM TRONG bundle prod** (mục M2), tức code GĐ3-D thật sự ship qua run của TIP.
|
||||
|
||||
---
|
||||
|
||||
## M1 — Gitea Actions run — **PASS**
|
||||
|
||||
| Mục | Giá trị |
|
||||
|---|---|
|
||||
| Run | **#444** (id 557), `head_sha=0bfadc20…` = TIP ✅ |
|
||||
| Status | **success** |
|
||||
| Cửa sổ | created `17:08:56` → updated `17:15:24` = **6m28s** (baseline 5m3x–6m3x, không vượt 8min) |
|
||||
| URL | https://git.baocaogiaoduc.vn/vietreport-admin/solution-erp/actions/runs/444 |
|
||||
| Run trước | #443 `a2b37dc` success 16:12→16:18 (mốc PRE) · #441 `aaed699` **cancelled** = di chứng #86 hôm nay, KHÔNG dính lần này |
|
||||
|
||||
**Test-gate** (web-UI log `runs/444/jobs/0/logs`, 18.699 B):
|
||||
```
|
||||
Passed! - Failed: 0, Passed: 45, Skipped: 0 <- Domain
|
||||
Passed! - Failed: 0, Passed: 599, Skipped: 0 <- Infrastructure
|
||||
```
|
||||
⇒ **644 = 45 + 599**, khớp kỳ vọng **tách-phần** (không chỉ khớp tổng). Delta vs #443/K7 (639 = 45 + 594) = **+5 Infra**, đúng bằng "+5 Fact" khai trong commit-msg `0bfadc2`. 0 fail / 0 skip.
|
||||
|
||||
---
|
||||
|
||||
## M2 — Bundle ×2 app: rotate + marker + LM + control-âm — **PASS**
|
||||
|
||||
### Rotate (4 nhân chứng độc lập: index.html live ⟂ file thật ⟂ log CI ⟂ Last-Modified)
|
||||
|
||||
| App | PRE (sổ) | POST | size prod | size in LOG CI | LM (UTC) → +07 |
|
||||
|---|---|---|---|---|---|
|
||||
| admin JS | `RgvHZkPH` | **`DLRf9TeA`** | 1.767.413 B | `1,767.41 kB` ✅ | 10:13:56 → **17:13:56** in-window |
|
||||
| admin CSS | `DqXm5Hpn` | **`IuRRquXK`** | 86.602 B | `86.60 kB` ✅ | — |
|
||||
| eoffice JS | `D65FJPGd` | **`C7TGA4Kn`** | 1.685.160 B | `1,685.16 kB` ✅ | 10:14:57 → **17:14:57** in-window |
|
||||
| eoffice CSS | `DlN3yZ5L` | **`DesmJ6-_`** | 92.340 B | `92.34 kB` ✅ | — |
|
||||
|
||||
`Content-Type: application/javascript` (KHÔNG phải SPA-fallback text/html) ⇒ file thật.
|
||||
|
||||
### Control-âm tầng-2 (hash CŨ phải biến mất khỏi đĩa)
|
||||
`GET /assets/index-RgvHZkPH.js` → **200 `text/html` 900 B** · `index-D65FJPGd.js` → **200 `text/html` 876 B** ⇒ SPA-fallback = bundle cũ ĐÃ bị ghi đè, không phải "copy thêm file mới".
|
||||
|
||||
### Marker-set — `grep -o -F` fixed-string (chống bẫy backtick-minify K6), PRE đo lúc 17:10 trước khi deploy land
|
||||
|
||||
| Marker | PRE admin | PRE eoff | POST admin | POST eoff | Kỳ vọng từ source |
|
||||
|---|---|---|---|---|---|
|
||||
| **M-A** `— Chọn hạng mục —` (select line-editor, `0bfadc2`) | 0 | 0 | **1** | **1** | 1 chỗ/app ✅ |
|
||||
| **M-B** `lg:max-h-none` (GĐ3-D, `081557b`) | 0 | 0 | **1** | **2** | admin 1 trang (ContractsListPage) · eoffice 2 trang (MyContractsPage + InboxPage) ✅ **element-wise, KHÔNG đối xứng** |
|
||||
| **M-C** `bodyMaxHClass` (prop) | 0 | 0 | **2** | **3** | = 1 destructure + N call-site ✅ |
|
||||
| CTRL+ `Dòng này đã được đưa vào hợp đồng` (K7, cùng FILE) | 1 | 1 | 1 | 1 | grep CÓ RĂNG + file có trong bundle |
|
||||
| CTRL+ `max-h-[28rem]` (default cũ) | 1 | 1 | **2** | **3** | count-delta +1/+2 khớp đúng số call-site mới |
|
||||
| CTRL+ `Chọn hạng mục công việc` (PE, KHÔNG phải marker) | 2 | 2 | 2 | 2 | chứng M-A độc-quyền, đứng im |
|
||||
| **CSS** `max-h-none` | 0 | 0 | **1** | **1** | Tailwind gen class mới — **nhân chứng ở ARTIFACT KHÁC (CSS ≠ JS)** |
|
||||
|
||||
**Byte thật (trích, chống 0-hit-giả và kết-luận-suông):**
|
||||
```
|
||||
option`,{value:``,children:`— Chọn hạng mục —`} (post-admin.js)
|
||||
entStage:3,bodyMaxHClass:`max-h-[28rem] lg:max-h-none`} (×1 admin, ×2 eoffice)
|
||||
.lg\:max-h-none{max-height:none} (post-admin.css)
|
||||
```
|
||||
⇒ M-B phân bố **1 : 2** đúng bằng số trang Panel-3 mỗi app (tổng 3 trang như đề bài). Comment `lg:max-h-none` trong `PipelineTreePanel.tsx:94` bị Vite strip ⇒ 0 đóng góp — nhất quán.
|
||||
|
||||
---
|
||||
|
||||
## M3 — BE endpoint mới `PUT /api/contract-signing-plans/{id}/lines/{lineId}` — **PASS**
|
||||
|
||||
| Probe | PRE-deploy (17:11) | POST-deploy (17:16) | Đọc |
|
||||
|---|---|---|---|
|
||||
| PUT route mới, **KHÔNG token** | **404** | **401** | route CHƯA có → ĐÃ có + authz sống ✅ |
|
||||
| PUT route **BỊA** (`/zzz-khong-ton-tai/`), không token | 404 | **404** | control-âm: 401 KHÔNG phải phản-xạ chung, đúng route mới ✅ |
|
||||
| PUT route mới, **bearer admin**, GUID toàn-0 | — | **400** | vượt policy `KeHoachKyKet.Update`, tới FluentValidation |
|
||||
|
||||
**Wire-proof mạnh nhất** — body 400 gọi tên **đủ 3 field của command MỚI**:
|
||||
```json
|
||||
"errors":{"PlanId":["'Plan Id' must not be empty."],
|
||||
"LineId":["'Line Id' must not be empty."],
|
||||
"CatalogEntryId":["'Catalog Entry Id' must not be empty."]}
|
||||
```
|
||||
⇒ `UpdateContractSigningPlanLineCommand(PlanId, LineId, CatalogEntryId)` + validator của nó đã land và chạy end-to-end Api→Application (không chỉ "route tồn tại"). Đây cũng là **chứng app-pool ĐÃ recycle bằng code mới** (không cần đo `w3wp` StartTime riêng).
|
||||
|
||||
---
|
||||
|
||||
## M4 — Smoke prod — **PASS**
|
||||
|
||||
| Check | Kết quả |
|
||||
|---|---|
|
||||
| `GET https://api.solutions.com.vn/health/ready` · `/health/live` | **200** · **200** |
|
||||
| `GET https://admin.solutions.com.vn/` · `https://eoffice.solutions.com.vn/` | **200** · **200** |
|
||||
| `http://` (redirect rule) admin · eoffice | **301** · **301** |
|
||||
| `POST /api/auth/login` admin@solutions.com.vn | **200** (accessToken 468 ký tự) |
|
||||
| Bearer: `/api/contract-signing-plans` · `/api/menus` · `/api/contracts` · `/api/purchase-evaluations` | **200 / 200 / 200 / 200** |
|
||||
|
||||
*(nv.test không probe lượt này — commit 0 đụng grant/seeder; tầng-2 #82 không phải phạm vi K8-blocker.)*
|
||||
|
||||
---
|
||||
|
||||
## M5 — Migration prod — **PASS (GIỮ 71)**
|
||||
|
||||
`ssh vietreport-vps` + `sqlcmd -E` (⚠️ `$env:PROD_DB_PASSWORD` không tồn tại trên VPS — dùng Windows-auth, đúng như đề bài dặn):
|
||||
|
||||
| Mục | Giá trị |
|
||||
|---|---|
|
||||
| `COUNT(*) __EFMigrationsHistory` | **71** |
|
||||
| Top 3 prod | `20260731085624_AddKhkkApprovalGroupCatalogAndFinalizeRuntime` · `20260731072441_AddContractCatalogEntries` · `20260729122015_AddContractSigningPlans` |
|
||||
| Repo (neo đuôi) | **71**, top y hệt |
|
||||
| **Set-diff 2 chiều** | REPO∖PROD = **rỗng** · PROD∖REPO = **rỗng** ⇒ bằng nhau theo TẬP, không chỉ theo tổng |
|
||||
| `sys.tables (is_ms_shipped=0)` | **97** (giữ nguyên — 0 CreateTable trong range) ✅ |
|
||||
|
||||
---
|
||||
|
||||
## M6 — Restart-side-effect
|
||||
|
||||
0 seeder đổi trong range ⇒ không có row-delta cần đo. Chứng "pool đã chạy code mới" lấy **miễn phí** từ M3 (404→401 + 400 gọi tên 3 field command mới) — mạnh hơn đo `w3wp` StartTime vì nó chứng **đúng binary mới đang phục vụ**, không chỉ "process có restart".
|
||||
|
||||
---
|
||||
|
||||
## Tổng kết — **PASS 6/6**
|
||||
|
||||
| Mục | Verdict | Số chốt |
|
||||
|---|---|---|
|
||||
| M0 push/filter/ancestry | ✅ | 18 file, 0 mig, ancestor=TRUE |
|
||||
| M1 run + gate | ✅ | #444 success 6m28s · **644 = 45 + 599** (Δ+5 = đúng 5 Fact mới) |
|
||||
| M2 bundle ×2 | ✅ | 4/4 hash rotate · marker **1:2 element-wise** · CSS +1 · LM in-window · hash cũ → text/html |
|
||||
| M3 endpoint mới | ✅ | 404→**401**, control-âm 404, bearer→**400 tên đủ 3 field** |
|
||||
| M4 smoke | ✅ | 6/6 site+health, login 200, 4/4 bearer 200 |
|
||||
| M5 mig | ✅ | prod **71** ≡ repo 71 (set-diff 2 chiều rỗng), tables 97 |
|
||||
|
||||
**0 critical issue. Không cần rollback. Không đề xuất gotcha mới.**
|
||||
|
||||
Ghi chú cho lượt sau: mốc PRE mới = admin `DLRf9TeA`/`IuRRquXK` · eoffice `C7TGA4Kn`/`DesmJ6-_` · gate **644 = 45 + 599** · Mig 71 · tables 97.
|
||||
|
||||
END sub-cicd-verify-gd3d-lineeditor VERDICT=PASS 6/6
|
||||
@ -67,3 +67,29 @@ Truy vết trước khi bấm B1 (đúng tinh thần "K8 lộ wave thiếu"):
|
||||
- Sự-cố script tự bắt + sửa dọc đường (đều là THUỐC THỬ tốt cho form B0 buổi người-thật): ① PE detail đòi `GroupCode/GroupName` required · ② `QuoteBody.BgVat/ChuaVat` = decimal non-null · ③ submit-guard đòi đính kèm **Bảng so sánh** (purpose=4) · ④ cấp cuối đòi **chọn giá chốt** (Ncc/ProMin/ProMax/Ccm/ProMinMax — Mig 66) · ⑤ auth rate-limit **429** khi login mỗi-stage ⇒ cache token (JWT 1h) vào state · ⑥ 1 phiếu nháp orphan (script fail giữa) ⇒ **DELETE 204 dọn liền** — allow-list Nháp xoá được, đúng thiết kế.
|
||||
|
||||
### GĐ2+ (KHKK → bridge → HĐ → bản-cứng → QĐ9) — CHỜ deploy line-editor (commit + push + cicd) rồi chạy stages `khkk1…qd9-2`
|
||||
|
||||
### GĐ2→GĐ4 + QĐ9 — ✅ TRỌN CẢ 2 NHÁNH (sau deploy #444 line-editor live)
|
||||
|
||||
| Bước | Nhánh A | Nhánh B |
|
||||
|---|---|---|
|
||||
| KHKK tạo + **gán hạng mục qua endpoint MỚI** | `KHKK/2026/001` (`9cc64a5e`), line `776faa92` ← B1-05 ✓ | `KHKK/2026/002` (`3b11f7d3`), line `0a9e67a0` ✓ |
|
||||
| Duyệt | **4 lượt — finalize tại Chương (KHÔNG qua BGĐ)** ✓ OG-9 | **5 lượt — QUA ĐỦ BGĐ/CEO** (`applyLevelFinalize=false` mọi lượt — checkbox opt-out F-1 sống) ✓ |
|
||||
| DaDuyet | phase=3, approvedTổng **110.000.000** chốt tại choke-point | phase=3, approvedTổng 110.000.000 |
|
||||
| Bridge K7 → HĐ | HĐ `47b453d3` — mã RG-001 tự sinh **`ZZTEST-K8/NCC/SOL&ZZTEST-NCC-K8/01`**, `giaTri == ApprovedAmount` = 110tr ✓ | (không bridge — spec chỉ cần 1 nhánh) |
|
||||
| Duyệt HĐ | submit → 1 lượt (binh.le trạm duy nhất) → **DaPhatHanh (9)** — HĐ ĐẦU TIÊN trên prod, là ZZTEST đúng chủ đích | — |
|
||||
| GĐ4 bản cứng | upload SealedCopy purpose=3 `78be7327` → **LIST `hasSealedCopy=True`** ✓ (field là EXISTS tầng LIST — detail đọc `attachments[]`) | — |
|
||||
| B13 mối nối cây | `khkk.line.contractId → 47b453d3` ✓ · `pe.contractId → 47b453d3` (forward-provision K5) ✓ · `hasSealedCopy` ✓ — đúng 3 nguồn `usePipelineStages:293-299` đọc | line.contractId = null (đúng — chưa bridge) |
|
||||
| **QĐ9 freeze (đo 2 vế/nhánh)** | (a) sửa quote nguồn PE DaDuyet → **409 "không thể chỉnh sửa Section 2"** = nguồn khoá từ tầng dưới · (b) catalog-rename `Xi măng→Xi măng (ZZTEST QD9)` 204 → **line GIỮ 'Xi măng'** (denorm thắng join-ngược — bit TRƯỢT-ĐƯỢC thật) → restore 204 nguyên trạng | (a) 409 y hệt · (b) rename→GIỮ→restore ✓ |
|
||||
|
||||
🔸 Khai đo: **B13 đo ở tầng API-mối-nối** (3 con trỏ cây đọc), KHÔNG chụp UI — dry-run kỹ thuật admin-duyệt-thay; buổi người-thật theo form B0 sẽ chụp `ss-k8-*` + bấm trên UI thật. QĐ9 nguyên bản ("đổi nguồn → số không đổi") nâng thành bằng chứng MẠNH HƠN ở vế (a): cửa đổi nguồn bị khoá hẳn 409.
|
||||
|
||||
### B15 — SỔ BẢN-GHI-VĨNH-VIỄN + seq cháy (rollback theo ID, vá-11/13)
|
||||
|
||||
- **BẤT TỬ by-design (sống chung, nhận diện ZZTEST/SOLUTION-PE):** PE `PE/2026/A/052` + `PE/2026/A/053` (DaDuyet) · KHKK `KHKK/2026/001` + `/002` (DaDuyet — HỐ-1-KHKK: chiếm slot (PE,N4); PE là test nên vô hại) · HĐ `ZZTEST-K8/NCC/SOL&ZZTEST-NCC-K8/01` DaPhatHanh (HỐ-1 numeric-guard chặn xóa; muốn dọn = sqlcmd soft-delete CHỜ ANH GẬT — lệnh: `UPDATE Contracts SET IsDeleted=1 WHERE Id='47b453d3-…'` + NULL lại `Line.ContractId`/`pe.ContractId` nếu gỡ).
|
||||
- 🔴 **Seq cháy KHÔNG thu hồi:** `KHKK/2026` seq ăn **001+002** (global-per-year — phiếu THẬT đầu tiên sẽ là 003, anh biết trước kẻo thắc mắc) · PE `2026/A` seq ăn 052+053 · mã HĐ seq 01 thuộc CẶP PREFIX TEST (vô hại prefix thật).
|
||||
- Master test GIỮ làm bộ tái dùng (đúng tinh thần SOLUTION-PE-{n} owner ratify): Project `ZZTEST-K8` · Supplier `ZZTEST-NCC-K8` · WorkItem `ZZTEST-WI-K8`.
|
||||
- Đã dọn trong-phiên: phiếu nháp orphan `0430d99f` DELETE 204 · catalog B1-05 restore nguyên trạng ×2 lần đo.
|
||||
- Notification đã bắn tới roster thật trong lúc duyệt-thay — mọi tên mang ZZTEST; **anh nhắn team "phiếu ZZTEST hôm nay bỏ qua"** (B0.iv khai: em không có kênh Zalo/email).
|
||||
- B16 rollback: KHÔNG kích hoạt (0 lần hỏng-phải-dừng).
|
||||
|
||||
END sub-k8-dryrun — VERDICT=**K8 DRY-RUN PASS TOÀN TRÌNH 2 NHÁNH** (GĐ1 PE 2 phiếu · GĐ2 KHKK 2 phiếu qua endpoint line MỚI · K7-bridge → GĐ3 HĐ DaPhatHanh · GĐ4 bản-cứng · QĐ9 4/4 vế · B15 sổ-ID đủ) — 1 blocker THẬT phát hiện + vá + ship trong phiên (Lines-editor) · 8 thuốc-thử guard ghi lại cho buổi người-thật
|
||||
|
||||
Reference in New Issue
Block a user