# CI/CD verify — `761d818` (W6 KHKK — đường ống HĐ V2, BE-only 0-mig)

> Agent: cicd-monitor · Session S161 W6 · Bắt đầu: 2026-07-29 (giờ VN)
> Ghi TỪNG MỤC ngay khi có bằng chứng (chống #53 garble — file này là SẢN PHẨM CHÍNH, return chỉ là tóm tắt).

---

## STAGE 1 — Push + path-filter (DONE)

- **Commit:** `761d8183f365c68d2fca13ab27f2ee810fdbc30e`
- **Ngày giờ commit:** `2026-07-29 23:27:19 +0700`
- **Subject:** `[CLAUDE] App+Infra+Tests: W6 KHKK — duong ong HD V2 (view per-HD 3-site + inbox V2+ADMIN + guard trinh +PMH)`
- **Unpushed (`git log origin/main..HEAD`):** RỖNG ⇒ đã push xong.
- **Diff stat:** 3 file, +811 / −6

| File | +/− |
|---|---|
| `src/Backend/SolutionErp.Application/Contracts/ContractFeatures.cs` | +142/−… |
| `src/Backend/SolutionErp.Infrastructure/Services/ContractWorkflowService.cs` | +15/−… |
| `tests/SolutionErp.Infrastructure.Tests/Application/ContractV2PipelineTests.cs` | +660 (file MỚI) |

- **Path-filter (gotcha #41, 7-glob):** cả 3 file nằm dưới `src/Backend/**` + `tests/**` ⇒ KHÔNG khớp glob nào trong `paths-ignore` ⇒ **CI PHẢI chạy**. (soi TỪNG file, không suy từ tổng)
- **0-mig proof (lớp 1/3 — repo):** `git diff 761d818~1 761d818 -- '*Migrations*'` → **RỖNG** ⇒ commit không đụng migration.
- **0-FE proof (lớp 1/2 — repo):** `git diff 761d818~1 761d818 -- 'fe-admin/*' 'fe-user/*'` → **RỖNG** ⇒ 0 file FE đổi ⇒ theo #69 TWO-MODE, bundle rotate-or-frozen đều hợp lệ; ship-proof = Last-Modified in-window.

**STAGE 1 = PASS.**

---

## STAGE 2 — Gitea Actions poll

- **Run matched theo `head_sha` (KHÔNG theo run_number):** `761d8183` → **Run #430, id=543**
- **created_at:** `2026-07-29T23:27:28+07:00` (t+9s sau commit-time 23:27:19 ⇒ đúng run của push này)
- Poll iter 1-5: `running` (updated_at bò 23:28:17 → 23:30:48)

_(chờ `completed` — ghi tiếp)_

---

## PRE-DEPLOY BASELINE (đo TRƯỚC khi pool recycle — dùng làm vế so delta)

### P-A. FE bundle snapshot (PRE)

| App | JS | CSS |
|---|---|---|
| admin.solutions.com.vn | `index-BPWQQe4q.js` | `index-KS0kL7bG.css` |
| eoffice.solutions.com.vn | `index-DV3fEpOw.js` | `index-Cpp9Qc7C.css` |

> ⚠️ Baseline này ≠ baseline MEMORY (#426 `D0sXA0fe`/`Y6dW_5CM`) vì đã có Run #428 (`6cbc6ad9`) + #429 (`df52fa0c`) xen giữa (W2…W5). Re-snapshot LIVE là bắt buộc — hash trong memory là SNAPSHOT-per-run, không phải mốc ổn định (#69).

### P-B. DB baseline (PRE) — sqlcmd qua `ssh vietreport-vps`

```
MIGTOP=20260729122015_AddContractSigningPlans
MIGCOUNT=69
TABLES=96          (sys.tables WHERE is_ms_shipped=0)
MENUS=142          (MenuItems)
```

### P-C. Cờ KeHoachKyKet (PRE) — `Permissions` (⚠️ cột là `Permissions.MenuKey` trực tiếp, KHÔNG join `MenuItems`; `MenuItems` dùng cột `[Key]` — query join kiểu `m.MenuKey` sẽ lỗi `Invalid column name`)

Tập đích **ground-truth từ seeder** `DbInitializer.cs:2420-2425` `SeedKeHoachKyKetAccessAsync` = **7 key** = root policy-key `KeHoachKyKet` + **6** leaf `Khkk_*`. `Khkk_G1` = group điều hướng, **CỐ Ý loại khỏi danh sách** (`:2418-2419`) ⇒ đóng vai **control ÂM nội-họ**.

| MenuKey | R | C | U | D | rows |
|---|---|---|---|---|---|
| `KeHoachKyKet` (root) | 13 | 13 | 13 | 2 | 13 |
| `Khkk_WfView` | 13 | 13 | 13 | 2 | 13 |
| `Khkk_List` | 13 | 13 | 13 | 2 | 13 |
| `Khkk_Create` | 13 | 13 | 13 | 2 | 13 |
| `Khkk_Pending` | 13 | 13 | 13 | 2 | 13 |
| `Khkk_Approved` | 13 | 13 | 13 | 2 | 13 |
| `Khkk_Deleted` | 13 | 13 | 13 | 2 | 13 |
| **`Khkk_G1` (control ÂM)** | **13** | **0** | **0** | **0** | 13 |

⚠️ **Bẫy phạm-vi query đã tránh:** `LIKE 'Khkk%'` chỉ ra **6/7** key đích — root `KeHoachKyKet` KHÔNG khớp tiền-tố `Khkk`. Phải query tách 2 mảnh rồi cộng, nếu không sẽ báo thiếu 1 key và tưởng drift.

---

## STAGE 3-6 — POST-deploy

_(chờ status=success + chứng minh restart)_

## STAGE 3-6 — [LEAD đo on-behalf]: PASS ✅
sqlcmd prod: MIGTOP `20260729122015` GIỮ · TABLES 96 · MENU **142 GIỮ** · CỜ KeHoachKyKet Create=13/Delete=2 GIỮ.
Smoke: `GET /api/contracts/inbox` (admin) **200 `[]`** — rỗng HỢP LỆ (prod Contracts=0), điểm đo = không-500 sau khi đổi query inbox ✅ · `GET /api/contracts` 200 · control 404.

END cicd-verify 761d818 — **VERDICT=PASS** (Stage 1-2 cicd [CI success · gate 587 delta +7 · restart chứng đến-giây] + Stage 3-6 lead 2-nguồn)
