# CI/CD Monitor — archive 2026-08

> L2 archive. Moved byte-exact from L1 `MEMORY.md` khi vượt soft-cap. Con-trỏ ở `_INDEX.md`.

---

- **S167 (08-01) `aaed699` K7 bridge KHKK→HĐ 13 file cross-stack (4 BE + 6 FE ×2 + 3 test, 0-mig) — PARTIAL 4/6+1** (gate **639=45+594** Δ+17 · Mig GIỮ 71 · tables 97 · bundle `Ig1R5tAh→RgvHZkPH` + `DFOCQ2ks→D65FJPGd`). 🔴 **BÀI TO NHẤT — PUSH-ĐÈ NUỐT DEPLOY (đề-xuất gotcha #86): run #441 của `aaed699` bị CANCELLED lúc 3m02s** vì lead push `628132c` đè ⇒ Gitea cancel-in-progress. K7 ship được **CHỈ NHỜ MAY**: `628132c` có chạm `fe-*/src/**` nên đẻ run #442. **Nếu commit-2 rơi trọn `paths-ignore` (docs/memory-only) ⇒ run-1 cancelled + run-2 skip ⇒ code KHÔNG BAO GIỜ lên prod, mà bảng Actions trông vẫn lành + `git log` đã push.** ⇒ **LUẬT: sau 2 push liên tiếp, verify "run cuối có head_sha == TIP" VÀ "TIP ⊇ commit code" (`git merge-base --is-ancestor`), CẤM đọc "có run xanh" là xong.** 🔑 **KIỂM-TRA-TIỀN-ĐỀ marker trước khi tin 0-hit (nâng cấp K6, suýt FAIL-OAN lần 3)**: `file` báo bundle **"ASCII text"** ⇒ nghi `\u`-escape → **bác bỏ bằng ĐO** (`grep -c -F 'Hợp đồng'`=4 trên bundle PRE); nghi **code-split** (page nằm lazy-chunk thì 0-hit vô nghĩa) → bác bỏ bằng ĐO (index.html chỉ 2 asset · 0 ref `"./x-<hash>.js"`). Cả 2 nghi đều SAI nhưng **phải đo mới được quyền kết luận**. 🔑 **CONTROL DƯƠNG = chuỗi bản TIỀN-commit của CHÍNH file đang sửa** (4/4 =1 ở cả 2 bundle) — chứng "file có trong bundle + grep có răng" rẻ hơn mọi cách khác. 🔑 **Admin = control idempotent SẴN CÓ, miễn phí**: seeder chạy 3 role báo **2 upgraded** (không phải 3) ⇒ nhánh no-op ĐÃ thực thi thật trên prod (code `if(changed) upgraded++`) ⇒ chứng idempotent ở tầng-row **dù chỉ có 1 restart**. ⚠️ log lần-2 sẽ **IM LẶNG** (guard `if(added>0||upgraded>0)`) — đừng đọc thành hồi-quy. ⚠️ **`appcmd list wp` map PID→pool là BẮT BUỘC**: PID 7680 start cùng cửa-sổ nhưng là `vietreport-admin` (dự án KHÁC) — đọc vội tưởng pool ta restart 2 lần. ⚠️ **`nv.test` login 401** ⇒ tầng-2 #82 của Drafter CHƯA đo live; **CẤM lấy Admin-qua-được để tuyên grant đã ăn** (Admin có bypass, không tách được công của row). Evidence `runs/2026-07-31-S164-4gd-khkk-fanout/sub-cicd-verify-k7.md`. Tag `[run-442, push-de-nuot-deploy, ancestry-proof, tien-de-marker, control-duong-tien-commit, admin-control-idempotent, appcmd-map-pid]`

- **S167 (08-01) `1c6d77a` K6 admin thu-gọn menu `ADMIN_HIDDEN_KEYS` 12-key (FE-admin 1 file, 0-mig) — PASS 5/5** (#440 6m29s · gate **622=45+577** delta 0 · Mig GIỮ 71 · tables 97 · menu 200/perm 2221 đứng im). 🔴 **BÀI TO NHẤT: 0-hit marker SAI 2 LẦN LIÊN TIẾP do CƠ-CHẾ REGEX, cả 2 lần trông y hệt "code không ship" ⇒ suýt FAIL-OAN.** (a) **rolldown/Vite 8 minify string → BACKTICK** (`new Set([\`PurchaseEvaluations\`,…])`), regex neo `["']` không bao giờ khớp; (b) vá xong truyền pattern-chứa-backtick qua biến trong `"…"` → shell nuốt, `grep -cE` gãy (`Unmatched (`) trả **0 gần như im lặng** trong vòng lặp. ⇒ **LUẬT: marker chuỗi trên bundle dùng `grep -F` fixed-string + LUÔN trích byte thật `.{90}X.{90}` TRƯỚC khi kết luận vắng-mặt.** 🔑 **KỸ THUẬT MỚI — COUNT-DELTA**: literal đã có từ K4a ⇒ *có/không* = 0 bit, nhưng *số lần xuất hiện* PRE→POST đo được: **12/12 key đều +1**; ngoại lệ duy nhất `Workflows` **+2** giải-thích-được (substring ⊂ `PeWorkflows`) ⇒ thành kiểm-tra-nhất-quán MIỄN PHÍ. 🔑 **LOG CI IN THẲNG `dist/assets/index-<hash>.js <size>`** = nhân chứng THỨ 4 độc lập curl, khớp LM prod **tới từng giây** ⇒ rẻ nhất để phân biệt **FROZEN-lành-tính** (eoffice: LM 11:14→**12:00:41** đổi + log in CÙNG hash `DFOCQ2ks` = rebuild deterministic) với bundle-kẹt (LM cũ). 🔑 **2-TẦNG #82 đo bằng SỐ**: `/api/menus` trả **12/12 key bị ẩn** ⇒ ẩn client KHÔNG thu quyền. Marker-ÂM display-only: route `/purchase-evaluations` **68→68** nguyên vẹn. Evidence `runs/2026-07-31-S164-4gd-khkk-fanout/sub-cicd-verify-k6.md`. Tag `[run-440, 0-hit-gia-2-lan, grep-F, count-delta, frozen-lanh-tinh, log-CI-nhan-chung-4]`

- _(**08-01 `e202393` S166 K5+K4c FE-only — PASS 5/5**: #439 6m16s, gate **622=45+577** (+1 = đúng 1 Fact mới). 🔑 marker differential 4/4 element-wise (K5 vào CẢ 2 app · K4c CHỈ eoffice) + Δsize cùng chiều = nhân chứng ⟂ grep. 🔴 **recipe đếm mig trong MEMORY có FALSE-NEGATIVE**: `grep -v Snapshot` ăn nhầm `AddPeApprovedBudgetSnapshot` (Mig 67) → phải neo đuôi `Designer\.cs$|ModelSnapshot\.cs$`; ưu tiên **set-diff repo↔prod 2 chiều** thay khớp-tổng. ⚠️ **bar "FE route 200" KHÔNG CÓ RĂNG** với SPA-fallback (POS ≡ NEG byte-identical 876B). verbatim → `runs/…/sub-cicd-verify-k5-k4c.md`)_

- _(**08-01 `88e7ecf` S166 K4a+K4b — PASS 7/7**: #438, gate 621=45+576, menu 151→**200**, perm 1584→**2221**. 🔑 **PHỦ 2 RUN 1 LƯỢT ⇒ delta khép kín**. 🔑 **MỐC PRE ĐỀ BÀI SAI, bắt bằng ĐO** (lead giao 143⇒192, đo LIVE ra 151 → truy phạm-vi thay vì hô drift) — **mốc PRE lão hoá sau MỖI deploy**. 🔑 phân rã 49+588 khớp cơ-chế 2-site skip-existing (588=49×12 role). ⚠️ **PERM row ≠ policy**. 🔑 A5 restart ×2 thật + **soi ĐIỀU KIỆN log trong source TRƯỚC khi đọc im-lặng** (`if (added>0)`). 🔴 **marker lead gợi ý BỊ BÁC BẰNG ĐO** (`Kết cấu` có sẵn ⇒ 1/1 = 0 bit). verbatim → `runs/…/sub-cicd-verify-k4ab.md`)_



---

## [ARCHIVED @S189 2026-08-11] verbatim L1 blocks (curate 27,4KB → target <17,1KB)

### S159 (verbatim)

- **S159 (2026-07-29) đợt-1 `b5799fc` + đợt-4 `a2bbcb9` — CẢ HAI `VERDICT = PASS 9/9` `[LEAD HARVEST HỒI-TỐ @S172 — nợ MỞ 3 PHIÊN (S162→S172), do CHÍNH vai này bắt @S162 F-02 rồi không ai đóng; owner slot (71) @S172 chốt 'gom và sleep thì auto, tự quyết'. Nguồn = `runs/2026-07-29-S159-tong-quan-pipeline-menu/cicd-verify-{b5799fc,a2bbcb9}.md`, KHÔNG suy diễn]`:** 🔴 **Vì sao món này nằm lại lâu:** `MEMORY.md:9` từng khai *'verbatim→archive'* cho cụm này mà `git log -S` **rỗng toàn lịch sử** ⇒ vai tự đính chính @S162 là *'không mất hẳn, nguyên liệu còn ở run-folder'* — **đúng, nhưng rồi không ai gom**. Đo @S172: **0 hit ở CẢ L1 lẫn archive** cho cả 2 sha, control-dương = 3 sha anh em cùng folder **có** hit ⇒ phép grep không rỗng. ⇒ **'không mất hẳn' KHÔNG bằng 'đã về nhà'**; nợ-harvest cần một dòng ghi, không cần một lời trấn an. **Nội dung cứu được:** đợt-1 `b5799fc` (11:44) — M2b test-gate **562 EXACT** · M4 bundle rotate user `DptYR4wL`→`0GO8mgrG` (**điều kiện PASS bắt buộc**, đo chứ không giả định) · M5 byte-marker **3 dương + 2 âm** · M6 smoke 4/4. đợt-4 `a2bbcb9` (13:52) — M3 byte-marker **3 dương/3 âm** · **M6 RESTART-DURABILITY lần 2 (chứng bền qua ≥2 restart)** · M7 smoke 4/4. 🔴 **Arc 4 đợt là bài học hoàn chỉnh, đừng đọc lẻ:** đợt-1 PASS 9/9 → **đợt-2 `1a47a61` PARTIAL 8/9 bắt regression revoker ăn 447/494 row** → đợt-3 `2a72695` PASS 9/9 (đóng regression, chứng bằng **3 chân kiềng**) → đợt-4 PASS 9/9 (tái xác nhận durability qua restart **thứ hai**). ⇒ *một PASS lẻ ở đợt-1 KHÔNG chứng được thứ mà chuỗi 4 đợt chứng*: bền qua restart phải đo **≥2 lần restart**, không phải 1. 🔑 **Nghề giữ lại (`a2bbcb9` M3):** *'đọc grep-source thô sẽ báo FAIL oan cho một control vốn ĐÚNG'* — control âm phải đọc ở tầng **render/bundle**, không đọc ở tầng source. Cùng họ với bẫy `cut` cắt UTF-8 và glob-sai mà các vòng kiểm @S172 dính. Tag `[s159, no-mo-3-phien, khong-mat-han-khac-da-ve-nha, arc-4-dot, durability-can-2-restart, control-am-doc-tang-bundle]`

### S168 (verbatim)

- **S168 (08-01) `a2b37dc..0bfadc2` GĐ3-D Panel-3 + Lines-editor KHKK (7 FE + 2 BE + 1 test, 0-mig) — PASS 6/6** (#444 6m28s · gate **644=45+599** Δ+5 = đúng 5 Fact mới · Mig GIỮ 71 · tables 97 · bundle `RgvHZkPH→DLRf9TeA` + `D65FJPGd→C7TGA4Kn`). 🔑 **BÀI TỐT NHẤT — WIRE-PROOF BẰNG THÔNG-ĐIỆP-LỖI GỌI TÊN FIELD**: PUT route mới + bearer + GUID toàn-0 trả **400 liệt kê ĐỦ 3 field `PlanId`/`LineId`/`CatalogEntryId`** ⇒ command+validator MỚI chạy end-to-end Api→Application — **mạnh hơn hẳn 401** (401 chỉ chứng route tồn tại). Kèm miễn phí: đây là chứng **pool đang phục vụ BINARY MỚI**, mạnh hơn đo `w3wp` StartTime (StartTime chỉ nói 'có restart', không nói 'code nào'). 🔑 **CHỤP PRE KỊP GIỜ = tài sản rẻ nhất**: spawn 17:10 / push 17:08 ⇒ đo PRE (bundle + marker 0-hit + route **404**) TRƯỚC khi deploy land 17:13 ⇒ có differential THẬT 404→401 và 0→1. **Vào việc là chụp PRE ngay, đừng poll trước.** 🔑 **MARKER BẤT-ĐỐI-XỨNG > marker đối-xứng**: `lg:max-h-none` = **1 (admin) : 2 (eoffice)** đúng bằng số trang Panel-3 mỗi app ⇒ xác suất trùng-hợp ~0; comment cùng chuỗi bị Vite strip nên không nhiễu. 🔑 **CSS = nhân chứng ở ARTIFACT KHÁC** (Tailwind gen `.lg\:max-h-none` 0→1 cả 2 file .css) ⟂ JS. ⚠️ `grep -P` CHẾT trên Git-Bash locale ⇒ trích byte quanh marker bằng **python `str.find`+slice**. Evidence `runs/2026-07-31-S164-4gd-khkk-fanout/sub-cicd-verify-gd3d-lineeditor.md`. Tag `[run-444, wire-proof-400-ten-field, chup-PRE-kip-gio, marker-bat-doi-xung, css-nhan-chung]`

### ARC (verbatim)

- _(**Arc S155→S166 (#416 · #419 · #422-#427 · #432 · #434-#439)** — gate 551→622. 🔑 **#439** marker differential **element-wise** (K5 vào CẢ 2 app · K4c CHỈ eoffice) + Δsize cùng chiều; ⚠️ bar 'FE route 200' KHÔNG CÓ RĂNG với SPA-fallback. 🔑 **#438** PHỦ 2 RUN 1 LƯỢT ⇒ delta khép kín; **mốc PRE đề bài SAI, bắt bằng ĐO** (mốc PRE lão hoá sau MỖI deploy); PERM row ≠ policy. 🔑 **#436** dự-đoán-TRƯỚC-khi-đo; marker = tên biến local thì 0 bit (minifier đổi). 🔴 **#435 PARTIAL** ACCEPTANCE CHÂN-LÝ-RỖNG (0 dòng cả 2 phía ⇒ `0==0` xanh mà 0 bit) → `INFORMATION_SCHEMA` · liệt-kê-TRỌN-HỌ index · **wire-proof bind-error 400**. 🔑 **#434** TAM-GIÁC 3 NGUỒN (source-parse ⟂ sqlcmd ⟂ API-materialize-qua-EF). 🔴 **#432** LUẬT CẤM `HEAD~1` → neo SHA `X^..X`; control ÂM phải ĐỘC-QUYỀN. 🔴 **#423 PARTIAL** revoker UNGATED lật 447/494 row, sót vì **đo TRƯỚC recycle** → luật 3-CHÂN-KIỀNG; #427 ĐO-CỜ không đếm ROW; #419 count = SỐ FILE trong diff. verbatim → `archive/2026-08.md` + `2026-07.md` via `_INDEX`)_

### 447 (verbatim)

- **#447 `998ea55` S171→S172 KHKK 3-panel — GO/PASS `[LEAD SEED ON-BEHALF @closeout S172; mày CHẠY THẬT 2 lượt nhưng KHÔNG tự ghi — `grep -c S172`=0, mtime kẹt 08-01 ⇒ carry `sub-no-self-append` nay **KHÔNG còn riêng ctx-verifier**: mày CÓ Write/Edit trong tools mà vẫn 0 đường ghi ⇒ giả-thuyết "bệnh riêng 1 vai" **YẾU ĐI**]`:** gate **644** (45D+599I) Failed 0 Skipped 0 — khớp B1 **tách-phần** cả 2 project, Δ0 đúng kỳ vọng (commit chạm **0 file test**). Bundle 4/4 rotate, size **khớp log CI tới byte**, LM trong cửa-sổ, hash cũ rơi `text/html`. Mig repo 71 = prod 71, **set-diff `comm -23`/`comm -13` = 0/0 HAI CHIỀU** (mạnh hơn khớp-tổng), tables 97. Smoke 8/8.
  🔑 **3 nghề mới, đều tái dùng được:** (a) **Stage 3b cặp đối-chứng MIỄN PHÍ** — #446 (cây tiền-S171) vs #447 khác **đúng 1 commit** ⇒ cô-lập nhân-quả **thay được `git worktree` đã fail**; (b) **bẫy 415 = họ hàng bẫy 411** — POST `application/json` vào endpoint **multipart** bị loại ở **action-selection, TRƯỚC authz** ⇒ 415 chỉ chứng route tồn tại, **vô nghĩa cho câu hỏi authz**; re-probe đúng multipart → 401. ⇒ **luật: mọi mã pre-auth (411/415) phải re-probe đúng dạng**; (c) **wire-proof MẠNH HƠN 401 = thông-điệp-lỗi GỌI TÊN FIELD** — bearer + multipart ⇒ 400 liệt `ContractSigningPlanId` + whitelist đuôi file ⇒ chứng **binary MỚI đang phục vụ**, mạnh hơn đo `w3wp` StartTime.
  🔴 **2 vế PHẢI tách, cấm nén:** ✅ *không hồi-quy do S171* (chứng bằng cặp #446/#447) ⟂ ❌ *flake `Create_DifferentEvaluationType_DoesNotAffect_Other` pre-exist* **VẪN chưa chứng** — nay **0/4 log CI** tái hiện. CI xanh **không rửa sạch** flake và cũng **không xác nhận** nó (vắng-mặt bằng-chứng ≠ bằng-chứng vắng-mặt).
  🔴 **Bài đắt nhất — "KHÔNG ĐO ĐƯỢC" là kết luận PHẢI TỰ NGHI:** mày kết `nv.test@` login 401 ⇒ *"credential UAT chết trên prod"* ⇒ bỏ ngỏ chân #44/#85. **SAI** — không phải credential chết mà **tra nhầm sổ**: bộ đang sống nằm ở `docs/HANDOFF.md` slot (64) (`test.drafter@`/`test.approver@`, `Test@12345678`). Lead đo lại: login 200/200 · list **200** · changelogs **404 KHÔNG 403** · attach **400 gọi tên field** · CTRL-ÂM 404 ⇒ role thường **có đủ** `KeHoachKyKet.Read`+`Update`, **gotcha #85 KHÔNG tái phát**. ⇒ **LUẬT: trước khi khai "KHÔNG ĐO ĐƯỢC", phải trả lời "đã tra hết sổ có sẵn chưa?"** (HANDOFF · STATUS · run-folder). Cùng lớp `feedback_mechanism_right_data_absent`.
  🔴 **Return #53-garble:** trả câu giữa chừng *"Writing Stage 5 + Verdict"* — **KHÔNG mất việc**: đĩa 10.156→**24.096 B**, 0 ô `_(chờ đo)_`. Đối-chứng lần nữa cho luật S158: **chống-#53 = thiết-kế artifact đổ-ruột-liên-tục, KHÔNG phải prompt.** Tag `[s171-s172, #447, cap-doi-chung-mien-phi, bay-415-pre-auth, wire-proof-goi-ten-field, khong-do-duoc-phai-tu-nghi, 2-ve-cam-nen, doi-ruot-lien-tuc, seed-on-behalf]`

### S182 (verbatim)

- **S182 YC-013 W0.4 PRECHECK (lead-seed từ memoryDelta workflow-return VERIFY khớp artifact, C2 /pause):** `LỆCH — Q2 sai tiền-đề nhưng W1 GO 0-blocker` — 12 phiếu prod (3 DaDuyet + 8 Nháp + 1 TraLai; memory-pack "001-003 Phase=3" KHÔNG SAI — thế giới đẻ thêm 9; ký-ức đóng-băng-thời-điểm khác ký-ức hỏng, SPEC phổ-quát-hoá mốc cũ mới là chỗ gãy) · pin-lệch 0 row VỚI control: chạy CHÍNH câu audit bỏ vế phủ-định ra 12 row element-wise + bịt điểm-mù LIKE bằng đẳng-thức-đếm IS-NOT-NULL=12=JOIN-in-family · hiệu chuẩn thước bằng 2 ANCHOR đã biết (MenuItems=200, Permissions=2221) mạnh hơn count>0 · ĐO bác acceptance wave-sau: 6 ô cờ đều 0/88 trên prod ⇒ ép-false vs giữ-thật render Y HỆT, A2 phải seed local 1 level cờ=true mới có răng · #8 Finalize=8/88 = CỜ CHỊU LỰC cấm đụng. → `runs/2026-08-08-S182-khkk-awf-mirror-ncc/sub-cicd-monitor-0.md`


### S190 + S189 (verbatim — archived @S191 curate)

- **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]`
