# sub-cicd-dot1 — Verify deploy đợt-1 YC-023 (range `bc309c55..0149f106`)

> Vai: cicd-monitor (READ-only). Ghi TRONG LÚC LÀM (chống #53). Kết bằng `== HẾT ==`.
> Spawn: 2026-08-10 ~18:21. Push: 18:20:41.

---

## CHÂN 1 — Push + path-filter (Stage 1)

```
$ git log -1 --format='%H %ci %s'
0149f106f98dcea51669c49028201d410b0a32ed 2026-08-10 18:20:41 +0700 [CLAUDE] Docs: YC-024 — 9 đáp án (80)-(88)…
$ git log origin/main..HEAD --oneline     → (RỖNG) ⇒ đã push hết
```

Range 5 commit (khớp đề bài):

| sha | subject |
|---|---|
| `5a77f4f1` | wal: flush 20260810 S188 dot-1 run-trace + governance state |
| `7bad4ae1` | Workflow: W1 gỡ 2 bom per-type type-3 — deactivate per-Code + overview family; test-before RED→GREEN **+4 test (672/672)** |
| `01a7c0b8` | Contract: W2 BE-DTO nền GĐ3 — `ContractSourceDto` reverse-join KHKK + CurrentWorkflowStepIndex + WorkflowSteps |
| `502f4d2e` | Contract: W7 server-filter per-type — ContractsListPage (+3 fix badge/pagination) + MyContractsPage |
| `0149f106` | Docs: YC-024 — 9 đáp án vào sổ + HANDOFF + spec đợt-1 |

**Path-filter (gotcha #41, 7-glob):** 74 file đổi. File **non-ignored** có mặt ⇒ CI PHẢI chạy:
- `src/Backend/SolutionErp.Application/{ApprovalWorkflowsV2/ApprovalWorkflowV2AdminFeatures.cs, Contracts/ContractFeatures.cs, Contracts/Dtos/ContractDtos.cs}`
- `fe-admin/src/pages/contracts/ContractsListPage.tsx` · `fe-admin/src/types/contracts.ts`
- `fe-user/src/pages/{InboxPage.tsx, contracts/MyContractsPage.tsx}` · `fe-user/src/types/contracts.ts`
- `tests/SolutionErp.Infrastructure.Tests/Application/UpdateAwDefinitionTests.cs`

⇒ **KHÔNG docs-only.** ✅ CHÂN 1 PASS.

---

## PRE-SNAPSHOT (chụp kịp giờ — bài học S168)

Spawn 18:21 / push 18:20:41 / run `status=running` lúc 18:22 ⇒ bước `deploy` (cuối pipeline, ~5-6 phút) **CHƯA chạm đĩa**. Đo LIVE lúc **18:22:29**:

```
$ curl -s https://admin.solutions.com.vn/    | grep -oE '/assets/index-[A-Za-z0-9_-]+\.(js|css)'
/assets/index-BNiYPCoJ.js
/assets/index-Desb-yZr.css
$ curl -s https://eoffice.solutions.com.vn/  | grep -oE '/assets/index-[A-Za-z0-9_-]+\.(js|css)'
/assets/index-BYLXK11b.js
/assets/index-BGUiinrQ.css
```

🔴 **Mốc PRE của đề bài đã LÃO HOÁ** — đề bài + `STATUS.md:9` ghi mốc **@S164**: admin `B43R6Y17` · user `NLI5umBg`. Đo live: admin **`BNiYPCoJ`** · user **`BYLXK11b`** ⇒ đã có ≥1 deploy giữa S164 và giờ mà STATUS chưa lật. **Dùng mốc ĐO (`BNiYPCoJ`/`BYLXK11b`) làm PRE, KHÔNG dùng mốc đề bài** (bài học #438: mốc PRE lão hoá sau MỖI deploy).
*(Ghi chú: `STATUS.md:479` mà đề bài trỏ hiện là row `Sub-agents`, không phải row bundle — con-trỏ-số-dòng đã trôi.)*

---

## CHÂN 2 — Gitea run (Stage 2/3)

```
$ curl -s ".../api/v1/repos/vietreport-admin/solution-erp/actions/tasks?limit=6"
id=594  run_number=481  head_sha=0149f106f98dcea…  status=running  workflow=deploy.yml
```
Khớp `head_sha` = HEAD (không khớp theo run_number — gotcha cancelled-shift). Run cuối của range ⇒ đúng nếp gotcha #86.

_(đang poll — ghi tiếp bên dưới)_

---

## CHỌN MARKER + HIỆU CHUẨN THƯỚC (làm TRƯỚC khi deploy land)

### FE — 3 ứng viên, chỉ 1 sống

Diff FE **không có literal chuỗi mới nào** (toàn comment + logic). Comment bị Vite strip, tên biến local (`parsedType`/`typeFilter`) bị minify ⇒ **0 bit** (bài học #436). Phải soi kỹ:

| ứng viên | đo trên bundle PRE | phán |
|---|---|---|
| `approvedAmountTotal` (đề bài gợi ý) | — | ❌ **LOẠI trước khi đo**: chỉ nằm trong `types/contracts.ts` dạng `export type` ⇒ **type-only, TS xoá sạch lúc compile**, không phải tree-shake |
| `Number.NaN` | admin **0** · user **0** | ❌ **DEAD MARKER** — minifier viết lại `Number.NaN` → `NaN` trần. *Nếu không hiệu chuẩn mà cứ đo, POST cũng 0 ⇒ báo FAIL OAN.* |
| `Number.isFinite` | admin **4** · user **4** | ✅ **SỐNG** — truy cập property built-in, minifier không đổi được |

**Chứng ContractsListPage nằm TRONG chunk `index-*.js`** (không bị code-split ra chunk khác — nếu bị thì count sẽ đứng im và ta kết luận sai):
```
$ grep -o -F 'Tìm mã / tên / NCC' pre-admin.js | wc -l      → 1   (literal của CHÍNH ContractsListPage)
$ grep -o -F 'Tìm theo mã / tên / NCC' pre-user.js | wc -l  → 3
$ grep -rn "React.lazy\|lazy(" fe-admin/src/App.tsx fe-admin/src/main.tsx → 0 hit
```

**Vị trí marker trong source (neo SHA, không dùng `HEAD~n`):**
```
base bc309c55 → fe-admin: KhkkDetailContent.tsx:666 + HardCopiesPage.tsx:68            = 2
head 0149f106 → fe-admin: + ContractsListPage.tsx:50                                   = 3   (Δ+1)
base bc309c55 → fe-user : KhkkDetailContent.tsx:666 + HardCopiesPage.tsx:68            = 2
head 0149f106 → fe-user : + MyContractsPage.tsx:36                                     = 3   (Δ+1)
```

🎯 **DỰ ĐOÁN KHAI TRƯỚC KHI ĐO (#436):** bundle POST phải là **admin 5 · user 5** (4+1 mỗi app). Sai số nào khác = phải điều tra, không được vuốt.

### BE — probe DLL 2 khung UTF-8 ⟂ UTF-16 (nếp S177)

Script `dllprobe.ps1` scp lên VPS rồi `powershell -File` (KHÔNG nhét inline — SSH→PS nuốt `$`/`"`). Đọc `SolutionErp.Application.dll` ra byte → decode Latin1 giữ nguyên byte → đếm 2 khung.

**ĐO PRE lúc 18:25:18** (`LWT=2026-08-10 12:55:16`, `LEN=2454528` — bản deploy TRƯỚC đó):

```
MARK ActiveOthers              utf8=0  utf16=0   ← control-ÂM độc quyền (W1)
MARK PerCodeDeactivationTypes  utf8=0  utf16=0   ← control-ÂM độc quyền (W1)
MARK ContractSourceDto         utf8=0  utf16=0   ← control-ÂM độc quyền (W2)
MARK ApprovedAmountTotal       utf8=0  utf16=0   ← control-ÂM độc quyền (W2)
MARK ContractWorkflowStepDto   utf8=0  utf16=0   ← control-ÂM độc quyền (W2)
MARK TenHangMucs               utf8=0  utf16=0   ← control-ÂM độc quyền (W2)
MARK AwDefinitionDto           utf8=1  utf16=1   ← ✅ CONTROL-DƯƠNG (có từ trước)
MARK AllowApproverFinalize     utf8=3  utf16=1   ← ✅ CONTROL-DƯƠNG (có từ trước)
MARK CurrentWorkflowStepIndex  utf8=5  utf16=3   ← ✅ CONTROL-DƯƠNG (tên trùng phía KHKK)
```

⇒ **Thước SỐNG** (control-dương ≥1 cả 2 khung) **và** 6 marker mới **vắng thật** trước deploy. Đây là differential ĐÚNG NGHĨA: 0 → ≥1, đo trên cùng một thước, không phải "0-hit rồi đoán".

🎯 **DỰ ĐOÁN:** POST cả 6 marker phải **≥1 ở khung utf8**; `LWT` phải rơi trong cửa-sổ deploy hôm nay ~18:2x; `LEN` phải đổi.

