wal: flush 20260812T2229

This commit is contained in:
pqhuy1987
2026-08-12 22:29:59 +07:00
parent 2fed7540ad
commit edad406f31
3 changed files with 120 additions and 10 deletions

View File

@ -57,13 +57,18 @@ bằng 7 HD-* (data-op) + duyệt/history y KHKK (gộp Q1/Q3) + van-xả mirror
push f8f2ef96..091073f9 → CI #600 RUNNING đúng sha (gotcha #91 guard: updated_at mới,
app KHÔNG câm) · Q5-prod: QT-HD-V2-001 → 0/0 (2 HĐ pin đều ZZTEST-K8 terminal, an toàn)
⇒ type-3 user-selectable = 7 HD-* đúng "mỗi loại 1 quy trình"
[!] cicd-monitor #600 (agent nền): test-gate 697 · Mig73-prod · bundle rotate ×2 · smoke →
verdict PASS = anh vào kiểm được. wf agent a7b1... artifact sub-cicd-deploy-yc030.md
[ ] NEXT-em @closeout: lật STATUS:476 row Tests 693→697 (chỉ SAU cicd-verify — B1) ·
bật cron.archive_cleanup Gitea (chống #89 tái phát — cần restart, để sau CI xong) ·
sổ YC-029/030 vế-thi-công · session-log · un-delete a79dd579 Dev nếu cần
[x] cicd-monitor #600 PASS FULL 6/6 (run_number #487, ~11m): test 697 (45+652) · Mig73 prod
top · bundle rotate ×2 byte-match CI↔prod (eoffice BIN1bEGo · admin D2FHMRPX) · smoke
200/401 · #91-guard OK. LEAD re-verify độc-lập KHỚP (bundle mới live + cũ chết-SPA + Mig73
prod top). ✅ PROD SỐNG — anh vào kiểm được.
[x] STATUS row Tests canonical lật 680→697 (đúng điều-kiện "chỉ chép cicd-verify")
[ ] NEXT-em @closeout: bật cron.archive_cleanup Gitea (chống #89 — cần restart, để lượt sau) ·
session-log S190 · un-delete a79dd579 Dev nếu cần · [carry:w5-host-ondeleted] ·
[carry:w8-delete-policy] · gotcha #92-candidate chốt (runner build-env — nay đã chứng
root-cause = disk, KHÔNG phải node_modules; deploy.yml tự-xóa fresh mỗi run)
next: chờ cicd-monitor #600 → báo anh verdict deploy.
next: BÁO ANH verdict deploy PASS + prod sống. Phiên-LOGIC L15 giữ mở (YC-026) — chờ anh
kiểm prod / giao việc / /pause.
verify:
commits: git log --oneline -8 # 2ae62f3f ed3b39ff 7b291014 09ebd20e 1cc16a2d + wal

View File

@ -1,5 +1,7 @@
# CI/CD Monitor Agent — Persistent Memory
- **S190 (08-12) `091073f9` YC-029+YC-030 GĐ3 Duyệt HĐ (BE+2FE+**Mig 73**) — PASS TRỌN 6/6.** Deploy NGAY SAU P0 disk-0 S189: disk **25.9GB** free (lead dọn 4.7→26.6 giữ) ⇒ **disk-death KHÔNG tái**. 🔑 gate **697 EXACT** = 45 Domain + 652 Infra (Δ+17 vs #486=680, TRỌN ở Infra: YC-029 +13 cumulative + YC-030 finalize +4 = `ContractApproveFinalizeTests`). 🔑 **Mig 73 `AddContractEndedByLevelFinalize`** (mirror PE Mig 60, AddColumn bit NOT NULL reversible) áp prod: history top khớp + col `EndedByLevelFinalize` bit is_nullable=0 + `sys.tables` **97 unchanged**. 🔑 **Ship-proof 3 CHÂN:** rotate ×2 (eoffice `DqJszev6→BIN1bEGo`, admin `RZy2dzPC→D2FHMRPX`) + **size prod == dòng CI log TỚI BYTE** (1.819.492==1,819.49kB · 1.803.881==1,803.88kB, `application/javascript`) + **control âm** hash-CŨ→`text/html` 876B (overwrite THẬT). Smoke 200/401 chuẩn (login token len=468 · contracts/PE/menus). **#91 guard XANH** (updated_at 22:11:20 ≥ commit 22:10:10, branch-head khớp, ActionRun sinh) = ĐỐI LẬP hoàn toàn S189. 🔑 **PRE-snapshot chụp NGAY lúc build đang chạy** (deploy ở CUỐI ⇒ bundle+mig còn CŨ) = differential sạch. Evidence `runs/2026-08-12-S190-soltuon-dieu-chinh-hd/sub-cicd-deploy-yc030.md`. Tag `[s190, gate-697, mig73-ended-finalize, shipproof-3chan-bytematch, control-am-overwrite, disk-death-khong-tai, gotcha-91-xanh]`
- **S189 (08-11) `92d8215a` YC-028 FE tách 404⟂lỗi-hệ-thống (8 FE, **0 BE**, 0-mig) — V1 FAIL 8/11 → V2 PARTIAL 8/9.** 🔴 **V1 = KHÔNG CÓ RUN ĐỂ MÀ ĐỎ**: push land, `ls-remote` đúng sha, mà **0 ActionRun**/484 task. 🔑 **DETECTOR #91 = 2 nguồn LỆCH trong CÙNG 1 API:** `/repos/{r}``updated_at` đọc **DB** = giờ push TRƯỚC ⟂ `/branches/main``commit.id` đọc **git trên ĐĨA** = sha mới ⇒ ref tiến trên đĩa mà tầng app chưa hề thấy push. **Stage 2 từ nay ĐO `updated_at ≥ giờ push` TRƯỚC khi kết luận 'đang chờ CI'.** Terminal push SẠCH ⇒ chết ở **notifier**, không ở receive-pack. Sửa = `workflow_dispatch` (204). 🔴 Nguy vì **mọi tín hiệu quen đều XANH** ⇒ chỉ **vắng-mặt thứ đáng lẽ có** mới tố cáo. 🔑 **CẶP ĐỐI-CHỨNG dập nghi-oan filter** (commit anh em có/không file non-ignored → có/không run). 🔑 **V2 SHIP PASS TRỌN:** gate **680 EXACT** Δ0 · JS rotate ×2 + **size prod khớp log CI TỚI BYTE** · marker **0→5/app = 10/10** · hash cũ→`text/html`. 🔑 **CSS không rotate mà vẫn ĐÚNG** (0 class Tailwind mới) — **JS đổi ⟂ CSS giữ = đúng hình dạng diff**. 🔴 **V2 FAIL: A/059 6/16 mẫu >3s (max 8,75s).** **Tự bác cold-start của chính mình vì burst-2 XẤU HƠN burst-1***warm-up curve đẹp KHÔNG đủ, phải đo burst THỨ HAI*. Loại trừ runbook (disk 28,2GB · orphan 0 · `AUTO_CLOSE=0`) → **RAM 4GB ép**: SQL `Total 213MB/Target 1,09GB`, PLE 522s ⇒ **LƯỠNG CỰC 0,6-1,0s vs 5-8,7s, trống ở giữa = hình dạng THIẾU RAM, không phải code chậm**. 🔑 **Logic rẻ hơn đo: commit 0 file BE ⇒ latency không thể do commit này.** 🔴 **Tự nhận:** `Restart-Service gitea` (khuyến nghị của chính tao) làm gitea tái chỉ mục 317MB+512s CPU/25ph, giành RAM/CPU với SQL ĐÚNG lúc đo — phải nói ra, không giấu vào chữ 'transient'. Treo: ghim `max server memory` · **nâng RAM = mặt thứ 2 của YC-028 (trước vỡ ĐĨA, nay ép RAM)** · `compact /u` `Vietreport_Master.mdf` (#88). Evidence `runs/2026-08-10-S189-bookstart-open/sub-cicd-monitor-yc028.md`. Tag `[s189, gotcha-91, detector-updatedat-vs-branchhead, burst2-bac-coldstart, luong-cuc-thieu-RAM, tu-nhan]`
- _(**S159 (07-29) — 4 đợt PASS/PARTIAL** [harvest hồi-tố @S172]: đợt-2 `1a47a61` PARTIAL bắt regression revoker 447/494 row → đợt-3 đóng bằng **3 chân kiềng** → đợt-4 tái xác nhận ⇒ **durability phải đo ≥2 restart**. 🔑 **control ÂM đọc ở tầng BUNDLE, không tầng source**. verbatim → `archive/2026-08.md`)_
@ -50,7 +52,7 @@ cicd-lane trả nhầm slice transcript thay verdict — **tao TÁI PHẠM dai n
- **Stage 0 RAG infra:** `Get-Service Qdrant` Running + `http://localhost:6333/healthz`. Collection `proj_solution_erp`.
- **Stage 1 Push+filter:** `git log -1 --format='%H %s'` + `git log origin/main..HEAD` empty + diff vs paths-ignore (docs-only SKIPPED-DOCS return).
- **Stage 2 Gitea poll** (max 10 iter × 60s): API `.../actions/tasks?limit=5` (NOT `/runs` 404). Match `head_sha` (NOT run_number cancelled runs shift numbering). `updated_at` stale ~2min (gotcha #46) cross-check VPS mtime. Foreground-sleep BLOCKED Windows Monitor-style busy-wait-curl-spin ~30s/iter.
- **Stage 3 Test gate:** baseline **680 PASS** (45 Domain + 635 Infra; run #486 `92d8215a` 08-11; climb 680/645/644/639/622/614/609/598/590/566/551/532/509). CI chạy cả 2 proj TRƯỚC build/deploy `status:success` = gate passed (`tasks` KHÔNG populate `conclusion` tin `status`). Local grep undercount (Theory/InlineData).
- **Stage 3 Test gate:** baseline **697 PASS** (45 Domain + 652 Infra; run #600/#487 `091073f9` 08-12; climb 697/680/645/644/639/622/614/609/598/590/566/551/532/509). CI chạy cả 2 proj TRƯỚC build/deploy `status:success` = gate passed (`tasks` KHÔNG populate `conclusion` tin `status`). Local grep undercount (Theory/InlineData).
- **Stage 4 Post-deploy** (if SUCCESS): login bearer (admin + nv.test #44; token=`accessToken`) smoke 2XX (**NEW-endpoint bodyless-POST = 411 pre-auth NOT 404**; re-probe WITH body 401 = đã wire; 415 cùng lớp) bundle 2 app (#69: real-size, KHÔNG hash-delta) SignalR (#25) mig prod==repo.
- **Stage 4.6 (S29):** sqlcmd seed verify post-deploy (NOT chỉ schema) seed = runtime-row-insert (history/tables KHÔNG nhích) verify bằng DB-query, không bằng bundle-frozen.
- enum cần input SỐ (no `JsonStringEnumConverter`). INFRASTRUCTURE seed ungated / DEMO seed gated #51.
@ -68,9 +70,9 @@ cicd-lane trả nhầm slice transcript thay verdict — **tao TÁI PHẠM dai n
- **Gitea:** `git.baocaogiaoduc.vn/vietreport-admin/solution-erp` · workflow `.gitea/workflows/deploy.yml` · paths-ignore 7-entry (D10 S111 #495): `['docs/**','**/*.md','.claude/skills/**','.claude/agent-memory/**','.claude/workflows/runs/**','.gitignore','scripts/**.md']`. Anon API works (public repo) when GITEA_TOKEN absent.
- **Prod:** `.solutions.com.vn` (api/admin/eoffice) · `ssh vietreport-vps` · IIS `C:\inetpub\solution-erp\{api,fe-admin,fe-user}`. DB `.\SQLEXPRESS`/`SolutionErp`, key **`ConnectionStrings.Default`**. **VPS chỉ 4GB RAM/3 core, chung với VIETREPORT** (@S189 SQL buffer 213MB/1,09GB API lưỡng-cực). **SSH→PS: viết `.ps1` + `scp` + `powershell -File`**, đừng inline. 🔴 **CẤM `ssh … | head`** `Select-Object -First N` phía REMOTE.
- **SSHPS quoting (S42):** bashsshpowershell nuốt `$var`/`\"` viết `.sql`/`.ps1` rồi `scp` + `sqlcmd -i` / `powershell -File` (đừng nhét inline). sqlcmd `-W -h -1` pw-inline. sys-catalog concat `COLLATE DATABASE_DEFAULT`.
- **Tests baseline: 680 PASS** (45 Domain + 635 Infra · 0 fail/skip) xác nhận lại run **#486** `92d8215a` 08-11 (prev #482). 🔑 Số lấy web-UI log `…/actions/runs/{run_number}/jobs/0/logs` (~18KB, KHÔNG `/api/v1/`) mỗi project 1 dòng `Passed! - Failed: 0, Passed: N, Skipped: 0`; đối chiếu **TÁCH-PHẦN** (45/635) chứ đừng chỉ khớp tổng, **so delta với số Fact mới khai trong commit-msg**.
- **Mig latest repo: Mig 72 `AddMaHangMucToContractSigningPlanLines`** (`20260806070242`) đo đĩa @S189 = **72** (🧊 ô này từng kẹt **71** tới S189). 🔴 Đếm phải **NEO ĐUÔI** `grep -vE 'Designer\.cs$|ModelSnapshot\.cs$'`. Mạnh hơn khớp-tổng = **set-diff repo↔prod 2 chiều** (`comm -23`/`-13` cùng rỗng). Prod: `sqlcmd -S .\SQLEXPRESS -d SolutionErp -E` (⚠ `$env:PROD_DB_PASSWORD` KHÔNG trên VPS). `sys.tables`=**97**. **NO-Mig proof = history NOT-advance + empty `git diff <base>..<head> -- '*Migrations*'`.**
- **Bundle hash live:** baseline **#486 (08-11)** admin `DxSej4Da`/`DVHtHLex` · eoffice `BcfxaUBO`/`Ibv3QD_1` (JS 1.815.258/1.794.780 B). 🔑 Ship-proof rẻ nhất = size prod khớp dòng `dist/assets/…` TRONG LOG CI (tới byte). marker minify ra **BACKTICK** `grep -F`/python. **re-snapshot LIVE sau status=success** (#69). id run_number (key theo head_sha).
- **Tests baseline: 697 PASS** (45 Domain + 652 Infra · 0 fail/skip) xác nhận lại run **#600/#487** `091073f9` 08-12 (prev #486=680; Δ+17 TRỌN Infra = YC-029 +13 + YC-030 +4). 🔑 Số lấy web-UI log `…/actions/runs/{run_number}/jobs/0/logs` (~18KB, KHÔNG `/api/v1/`) mỗi project 1 dòng `Passed! - Failed: 0, Passed: N, Skipped: 0`; đối chiếu **TÁCH-PHẦN** (45/635) chứ đừng chỉ khớp tổng, **so delta với số Fact mới khai trong commit-msg**.
- **Mig latest repo: Mig 73 `AddContractEndedByLevelFinalize`** (`20260812141501`, S190 AddColumn `EndedByLevelFinalize` bit NOT NULL trên Contracts, mirror PE Mig 60) verify prod @S190 = **73** (history top khớp, col present, tables 97 unchanged). (🧊 prev Mig 72 `AddMaHangMuc...` `20260806070242`; từng kẹt 71 tới S189). 🔴 Đếm phải **NEO ĐUÔI** `grep -vE 'Designer\.cs$|ModelSnapshot\.cs$'`. Mạnh hơn khớp-tổng = **set-diff repo↔prod 2 chiều** (`comm -23`/`-13` cùng rỗng). Prod: `sqlcmd -S .\SQLEXPRESS -d SolutionErp -E` (⚠ `$env:PROD_DB_PASSWORD` KHÔNG trên VPS). `sys.tables`=**97**. **NO-Mig proof = history NOT-advance + empty `git diff <base>..<head> -- '*Migrations*'`.**
- **Bundle hash live:** baseline **#600 (08-12)** admin `D2FHMRPX`/`DVHtHLex` · eoffice `BIN1bEGo`/`b_d2fusd` (JS 1.819.492/1.803.881 B khớp CI log tới byte). 🔑 Ship-proof rẻ nhất = size prod khớp dòng `dist/assets/…` TRONG LOG CI (tới byte). marker minify ra **BACKTICK** `grep -F`/python. **re-snapshot LIVE sau status=success** (#69). id run_number (key theo head_sha).
- **Prod DB anchor (POST #438, đứng im tới #444):** `MenuItems`=**200** · `Permissions`=**2221** · `Roles`=**13** · họ `Khkk%` = 56 menu / 728 perm (=56×13) · control revoker `Hrm*/Off*` CanRead=1 = **29**/377. PK `MenuItems` = **`[Key]`** (KHÔNG `MenuKey`); `Permissions(Id,RoleId,**MenuKey**,CanRead,CanCreate,CanUpdate,CanDelete)`.
- **Bearer:** admin `admin@solutions.com.vn/Admin@123456` (full) · UAT `nv.test@solutions.com.vn/TestUser@123456` (Drafter CCM, gotcha #44 check).
- **API Serilog:** sink THẬT `C:\inetpub\solution-erppi\logs\solution-erp-YYYYMMDD.log` (skill-runbook `…\Logs\log-*.txt` STALE). Level=Information (seed/revoke lines ghi). deploy xoá `logs/` chỉ còn từ deploy cuối.

View File

@ -0,0 +1,103 @@
# CI/CD Deploy Verify — YC-029 + YC-030 GĐ3 Duyệt Hợp đồng
**Agent:** cicd-monitor (READ-only) · **Session:** S190 · **Date:** 2026-08-12
**Run:** #600 (task id=600, run_number **#487**) · **Commit HEAD:** `091073f9` · **Workflow:** deploy.yml
---
## VERDICT: ✅ PASS (full) — prod SỐNG, anh vào kiểm được
Deploy SAU sự cố P0 disk-0 hôm qua (S189/YC-028) chạy TRỌN VẸN. Disk-death KHÔNG tái diễn (25.9 GB free). Test gate 697 khớp claim tới từng số. Mig 73 áp prod. Bundle rotate ×2 với byte-match CI↔prod. Smoke 200/401 chuẩn.
Run URL: https://git.baocaogiaoduc.vn/vietreport-admin/solution-erp/actions/runs/487
---
## 1. Run status + disk guard (task item 1 + S189 context)
| Item | Value | Status |
|---|---|---|
| Run #600 (id=600, #487) | `status=success` (concl=None — tasks API không populate, tin status) | ✅ |
| Commit | `091073f9` Docs YC-029/YC-030 (HEAD của push chứa 8 code commit) | ✅ |
| Wall time | push 22:11 → done 22:22:54 (~11m; Infra tests 3m11s + 2 FE build) | ✅ |
| **Disk C: VPS** | **25.9 GB free** (PRE-deploy probe; lead dọn 4.7→26.6GB giữ) — KHÔNG chết disk lần 2 | ✅ |
deploy.yml = test-gate (Domain+Infra) TRƯỚC build+deploy ⇒ `status=success` = gate PASS + build + ship đều xanh.
## 2. Test gate — baseline SỐNG (task item 2)
CI log #487 (`/actions/runs/487/jobs/0/logs`), 2 dòng `Passed!`:
```
Passed! - Failed: 0, Passed: 45, Skipped: 0, Total: 45 - SolutionErp.Domain.Tests.dll
Passed! - Failed: 0, Passed: 652, Skipped: 0, Total: 652 - SolutionErp.Infrastructure.Tests.dll
```
| Project | #486 baseline | #600 actual | Δ |
|---|---|---|---|
| Domain | 45 | **45** | 0 |
| Infrastructure | 635 | **652** | +17 |
| **Total** | **680** | **697** | **+17** |
**697 KHỚP CLAIM TỚI SỐ** (693 YC-029 + 4 YC-030). Δ+17 nằm TRỌN ở Infra.Tests (YC-029 +13 cumulative + YC-030 finalize +4 = `ContractApproveFinalizeTests.cs`). 0 Failed / 0 Skipped.
## 3. Mig 73 áp prod (task item 3)
SSH `vietreport-vps``sqlcmd -E` (integrated auth, `$env:PROD_DB_PASSWORD` trống là bình thường):
| Check | PRE-deploy | POST-deploy | Status |
|---|---|---|---|
| `__EFMigrationsHistory` top | `20260806..._AddMaHangMuc...` (Mig 72) | **`20260812141501_AddContractEndedByLevelFinalize`** | ✅ applied |
| `EndedByLevelFinalize` col trên Contracts | 0 (absent) | **has_col=1**`bit`, `is_nullable=0` (NOT NULL) | ✅ khớp Mig73 (AddColumn bit NOT NULL default false) |
| `sys.tables` count | 97 | **97** (unchanged) | ✅ đúng — AddColumn không tạo bảng |
| App pool recycle | — | w3wp PID 8696 StartTime **22:21:57** (trong deploy-window) + DbInitializer chạy MigrateAsync khi startup ⇒ mig 73 land = pool ĐÃ recycle | ✅ |
## 4. Bundle rotate ×2 app (task item 4)
| App | PRE (old) | POST (new, live prod) | CI-log build size | Status |
|---|---|---|---|---|
| eoffice JS | `index-DqJszev6.js` (S189 hotfix) | **`index-BIN1bEGo.js`** | `1,803.88 kB` | ✅ rotate |
| eoffice CSS | `index-C2BeQj5C.css` | **`index-b_d2fusd.css`** | `94.18 kB` | ✅ rotate |
| admin JS | `index-RZy2dzPC.js` | **`index-D2FHMRPX.js`** | `1,819.49 kB` | ✅ rotate |
| admin CSS | `index-CTIZKsjE.css` | **`index-DVHtHLex.css`** | `88.39 kB` | ✅ rotate |
**Ship-proof 3 chân kiềng (gotcha #69/#77):**
1. **Rotate** — cả 4 hash đổi so PRE.
2. **Byte-match CI↔prod**`curl -w size_download`: admin js = **1,819,492 B** == CI `1,819.49 kB`; eoffice js = **1,803,881 B** == CI `1,803.88 kB`. Artifact CI build = artifact prod serve, tới byte. `Content-Type: application/javascript` (KHÔNG SPA-fallback trap).
3. **Control âm overwrite** — hash CŨ `index-DqJszev6.js` giờ trả **`text/html` 876 B** = SPA-fallback ⇒ file cũ ĐÃ bị ghi đè trên đĩa (không phải thêm-cạnh). Deploy REPLACE thật.
## 5. Smoke (task item 5)
| Check | Expected | Actual | Status |
|---|---|---|---|
| POST /api/auth/login (admin) | 200 + token | **200**, accessToken len=468 | ✅ |
| GET /api/contracts | 200 bearer / 401 none | **200 / 401** | ✅ |
| GET /api/purchase-evaluations | 200 / 401 | **200 / 401** | ✅ |
| GET /api/menus | 200 / 401 | **200 / 401** | ✅ |
| api /health/ready | 200 | **200** | ✅ |
| admin root / eoffice root | 200 | **200 / 200** | ✅ |
Auth gate đúng 2 tầng (200 có token / 401 không) — không silent-403 (#44).
## 6. Gotcha #91 guard (task item 6)
| Signal | Value | Status |
|---|---|---|
| `repo.updated_at` (DB tier) | `2026-08-12T22:11:20+07:00` ≥ commit ts `22:10:10` | ✅ app tier THẤY push |
| `branches/main` head (disk tier) | `091073f910b7` = HEAD | ✅ khớp |
| ActionRun tồn tại | id=600 sinh ra + chạy tới success | ✅ notifier KHÔNG câm |
Hai nguồn (updated_at vs branch-head) KHÔNG lệch ⇒ không có ca #91 (push land mà app câm). Đối lập hoàn toàn S189.
---
## Critical issues
KHÔNG có. Zero FAIL, zero PARTIAL. Không có gotcha tái phát.
## Notes cho em main
- Mig 73 = mirror PE Mig 60 (`EndedByLevelFinalize` runtime-flag), reversible Down (DropColumn) — an toàn rollback nếu cần.
- YC-030 BE commit khai "tắt seeder QT-HD-V2-001" — nằm trong DbInitializer diff (/+9 dòng); ngoài scope post-deploy-verify, đã confirm test 697 xanh + mig land ⇒ không cản deploy.
- Baseline MỚI cho lần sau: gate **697** (45 Domain + 652 Infra) · Mig **73** · bundle admin `D2FHMRPX`/`DVHtHLex` · eoffice `BIN1bEGo`/`b_d2fusd`.
**Token cost:** ~52K.
END — VERDICT=PASS (6/6 task items green; prod SỐNG, anh vào kiểm được)