wal: flush 20260731T1559
This commit is contained in:
@ -19,7 +19,9 @@ chain:
|
||||
[x] gate K1 PASS-WITH-FLAGS 9f (sub-reviewer-gate-k1.md; reviewer #53 ×1 → resume-sạch, artifact cứu B4-d).
|
||||
Xử @S165: F4 IncludeInactive-mặc-định-loại + T5b · F7 5-kind · F2 STATUS-delta · F9 Mig70-áp-LocalDB.
|
||||
Khai: F1 OG-6-soát-SAU · F3 authz-mirror-#82 · F5 PermGuard-nợ-khuôn-cũ · F6 IX_-NIT. Suite 598/0
|
||||
[x] commit 50e6d8c 20-file PUSH e5123ff..50e6d8c — cicd-monitor verify chạy nền (sub-cicd-verify-k1.md)
|
||||
[x] commit 50e6d8c PUSH → cicd PASS 6/6 (run #434 6m31s · gate-CI 598 · Mig70 prod-top + recycle-proof ·
|
||||
seed 86 TAM-GIÁC 3-nguồn · bundle 4/4 rotate + 4-cũ-chết · smoke 8/8). cicd #53 ×2 @S165 return=memory-
|
||||
talk, artifact cứu trọn. Bài: hash local ≠ hash CI — mốc prod luôn re-snapshot LIVE
|
||||
[!] wf: K2-BE wf_583be7ad-1a2 — implbe solo (Mig71 AddKhkkApprovalGroupCatalogAndFinalizeRuntime:
|
||||
+ApprovalGroup-backfill-1 +EndedByLevelFinalize +Line.CatalogEntryId/TenHangMuc + unique-3-cột +
|
||||
rào-2-site (PeId,ApprovalGroup) + submit/phase-guard + Σ×3 + 18-consumer). Gate 5-anchor 5/5 ✓.
|
||||
|
||||
@ -1,5 +1,9 @@
|
||||
# CI/CD Monitor Agent — Persistent Memory
|
||||
|
||||
- **07-31 verify `50e6d8c` S164 K1 SP-002 danh-mục-loại-HĐ (20 file: 11 BE + 6 FE + 1 test + 2 docs, +Mig 70):** ✅ **PASS 6/6** — Run **#434** (id=547) success **6m31s** (dài nhất 4-run gần đây: #431/#432/#433 ~5m50; hợp lý vì +Mig+seed-86+8-test — chưa tới ngưỡng escalate). Gate **598 = 45D + 553I** (0 fail/skip) — Domain **GIỮ 45**, Infra **545→553 = +8** ⇒ delta rơi TRỌN vào Infra đúng nơi file test mới nằm (đối-chiếu TÁCH-PHẦN bắt được điều tổng-số giấu). Mig 70 `20260731072441_AddContractCatalogEntries` **TOP prod**, `sys.tables` 96→**97** khớp `grep -c CreateTable`=**1**. 🔑 **TAM-GIÁC 3 NGUỒN ĐỘC-LẬP** cho seed: source-parse `DbInitializer` == sqlcmd prod == **API materialize qua EF** — cả 3 ra `86` + `1:5·2:10·3:5·4:23·5:14·6:15·7:13·8:1` y hệt; nguồn 3 mạnh nhất vì đi trọn Domain→Infra→Api (200, 25.374 B, distinct-code 86). Serilog `Seeded 86 contract catalog entries (S164 SP-002)` @15:52:27 + control-ÂM findstr chuỗi-bịa 0 hit. Bundle **4/4 ROTATE** (admin `B43R6Y17`→`CKgq0YlH`, user `NLI5umBg`→`CHMCU35C`) + **4/4 hash CŨ rơi `text/html` 876/900 B** = ghi-đè thật; LM 15:51:06/15:52:07 in-window. Smoke 8/8: `/health` bare **404** (control) · `/health/{ready,live}` 200 · endpoint mới không-token **401** kèm **2 route BỊA 404** ⇒ 401 CÓ NGHĨA. w3wp PID 2644 StartTime 15:52:13 in-window + log dòng-đầu `Applying migrations...` ⇒ đo SAU recycle (né #423). ⚠️ **BÀI MỚI — 0-hit là DƯƠNG-GIẢ tới khi soi format**: grep `Passed!` lần đầu **0 hit** chỉ vì log dùng 2-khoảng-trắng (`Passed! - Failed: 0`); suýt báo "không thấy dòng test". Cùng class: parse seeder lần 1 ra **78** (regex line-anchored, tuple xuống dòng) — vứt số, parse lại ra 86 + cross-check `raw code-literal`=86. ⚠️ **hash CI ≠ hash local build** (local dự-báo `BE7zE81C`/`DSXJJbJq`, CI ra khác) ⇒ CẤM lấy hash local làm mốc kỳ-vọng prod, luôn re-snapshot LIVE. Evidence: `runs/2026-07-31-S164-4gd-khkk-fanout/sub-cicd-verify-k1.md`. Tag `[run-434, pass-6-6, tam-giac-3-nguon, 0-hit-la-duong-gia, gate-598, mig-70, hash-CI-khac-local]`
|
||||
|
||||
- _(**07-30 `bfc7b79` S162 cây-4-folder-GĐ FE-ONLY — PASS 5/5**: run #432 5m35s, gate 590. 🔴 **LUẬT CẤM `HEAD~1`** — Stop-hook WAL auto-commit giữa lúc verify làm `HEAD~1` đổi nghĩa ⇒ tao kết SAI "marker vô giá trị"; đo lại bằng SHA tuyệt đối `X^..X` thì 0 hit ⇒ marker hợp lệ. 🔑 **ĐẾM TRỌN HỌ bằng 1 REGEX** `pipeline-[a-z-]{0,24}index` ra đúng 3 phần tử khớp source element-wise (vừa vế DƯƠNG vừa tự chứng regex không quét bừa). ⚠️ suýt FAIL-OAN: nhãn cũ 8/app sống hợp lệ — control ÂM phải ĐỘC-QUYỀN. verbatim → `runs/2026-07-30-S162-cay-4-folder-gd/sub-cicd-monitor-2.md`)_
|
||||
|
||||
- **07-30 verify `bfc7b79` S162 cây-4-folder-GĐ (FE-ONLY, 17 file, 12 FE = 6+6 đối xứng ×2 app):** ✅ **PASS 5/5** — Run **#432** (id=545) success **5m35s**; gate **590 = 45D+545I** (0 fail/skip). 0 mig/0 BE ⇒ không chân EF. Bundle **4/4 ROTATE** (admin js `BBQKvUMa`→`DXoYDy7R` · user js `BV5--mPf`→`o8KDluD1`, css cả 2 đổi); `index.html` LM 10:09:07 in-window + `Cache-Control:no-cache`. 🔴 **BẪY MỚI — MOVING-TARGET `HEAD~1`:** phiên có Stop-hook WAL **tự commit giữa lúc verify** ⇒ `HEAD~1` đổi nghĩa từ 'cha commit đích' thành 'chính commit đích' trong ~6 phút. Tao đã kết SAI '2 marker có sẵn ở parent ⇒ vô giá trị'; đo lại bằng SHA tuyệt đối `8eba137` thì **cả 2 = 0 hit** ⇒ marker hợp lệ. **LUẬT: verify commit X luôn neo `X^..X` bằng SHA, CẤM dùng `HEAD~1`** (mọi repo có hook auto-commit). 🔑 **Khuôn MỚI 'ĐẾM TRỌN HỌ bằng 1 REGEX'**: `pipeline-[a-z-]{0,24}index` quét bundle ra **đúng 3 phần tử** `{contract×2, khkk×1, pe×1}` khớp source element-wise ⇒ vừa là vế DƯƠNG, vừa tự chứng regex không quét bừa (mạnh hơn đếm chuỗi rời). Dự-đoán-trước-khi-đo khớp từng đồng: `contract-index`=2 (= số FILE trong diff) · VN `Kế hoạch Hợp đồng`=**1** (source 3 − **2 comment**) · raw-UTF8 không escape. ⚠️ **suýt FAIL OAN lần nữa:** `Kế hoạch ký kết HĐ` (nhãn strip cũ) = **8/app** — KHÔNG dùng làm control ÂM được vì synthesis ghi rõ nhãn folder GĐ2 **cố ý khác** nhãn strip; 1-mới + 8-cũ cùng sống = chứng phân-biệt-phiên-bản. Control ÂM: chuỗi-BỊA `pipeline-hardcopy-index`=0 (source cũng 0) + hash BỊA & **hash CŨ cả 2 app** đều `ct=text/html` **876B/900B trùng khít size index.html** ⇒ bundle cũ biến mất = ghi đè thật. Smoke 4×200 + bare `/health` **404** (control). WAL-commit `a07b942` (3 file `.md`) bị `paths-ignore` nuốt ⇒ không đẻ run rác. Evidence: `runs/2026-07-30-S162-cay-4-folder-gd/sub-cicd-monitor-2.md`. Tag `[run-432, pass-5-5, CAM-HEAD~1-neo-SHA, dem-tron-ho-1-regex, control-am-DOC-QUYEN-lan-2, gate-590, fe-only]`
|
||||
|
||||
- _(**#427 S161 W1 KHKK `a8027c0` +Mig 69 `AddContractSigningPlans` — PASS 6/6**: gate 566, 5m40s; `sys.tables` **89→96** (+7 khớp 7 CreateTable), MenuItems 142 GIỮ. 🔑 **khuôn ĐO-CỜ không đếm ROW** (row tồn tại sẵn ⇒ đếm row = 0-bit; đo PRE/POST **cờ** 7 key 13/0/0/0→13/13/13/2) + 🔑 **control ÂM NỘI-HỌ: `Khkk_G1` bị seeder CỐ Ý bỏ khỏi tập** ⇒ phải đứng yên, và nó đứng yên ⇒ chứng 'đúng NGƯỜI, đúng TẬP'. Đọc seeder **dự đoán `0 added + 91 upgraded` TRƯỚC khi đo → log prod khớp từng đồng**. verbatim → `archive/2026-07.md` substring:"a8027c0` W1 KHKK")_
|
||||
|
||||
@ -1,33 +1,28 @@
|
||||
CICD-K1: IN-PROGRESS — 0/6 mục (đang đo)
|
||||
CICD-K1: PASS — 6/6 mục
|
||||
|
||||
# cicd-monitor — verify deploy K1 SP-002 (`50e6d8c`)
|
||||
|
||||
> Artifact chống #53: ghi TỪNG mục NGAY khi đo xong. Kết bằng dòng `END … VERDICT=`.
|
||||
> Spawn: 2026-07-31 · commit `50e6d8c38283a9dd45da2001bd2fc6596595558f`
|
||||
> Spawn 2026-07-31 · commit `50e6d8c38283a9dd45da2001bd2fc6596595558f` · READ-only (0 ghi prod)
|
||||
|
||||
## Stage 1 — Push + path-filter (PRE-điều-kiện)
|
||||
|
||||
- `git log -1` → `50e6d8c38283a9dd45da2001bd2fc6596595558f|[CLAUDE] Contract: K1 SP-002 danh muc loai HD - ContractCatalogEntries (Mig 70) + seed 86 + CQRS + FE kind-5 x2 app + 8 test|2026-07-31 15:45:50 +0700`
|
||||
- `git log origin/main..HEAD` → **RỖNG** (đã push hết)
|
||||
- `git diff --name-only 50e6d8c^ 50e6d8c` → **20 file**; breakdown:
|
||||
- BE 11 (Api 1 · Application 2 · Domain 2 · Infrastructure 6 gồm 2 file Mig + snapshot)
|
||||
- FE 6 (fe-admin 3 · fe-user 3)
|
||||
- Test 1 (`tests/…/Application/ContractCatalogTests.cs`)
|
||||
- Docs 2 (`docs/HANDOFF.md`, `docs/STATUS.md`)
|
||||
- vs `paths-ignore` 7-glob: **18/20 file KHÔNG bị ignore** ⇒ CI **PHẢI chạy** (không phải docs-only). ✅
|
||||
- `git diff --name-only 50e6d8c^ 50e6d8c` → **20 file** (neo bằng `X^..X` theo LUẬT S162 CẤM-`HEAD~1`, vì phiên có Stop-hook WAL auto-commit):
|
||||
BE 11 · FE 6 · Test 1 · Docs 2
|
||||
- vs `paths-ignore` 7-glob: **18/20 file KHÔNG bị ignore** ⇒ CI **PHẢI chạy**. ✅
|
||||
|
||||
## Stage 1b — DỰ ĐOÁN TRƯỚC KHI ĐO (chống xác-nhận-ngược)
|
||||
|
||||
Đọc `DbInitializer.SeedContractCatalogAsync` (dòng 3163-3325) **trước** khi chạm prod, parse mảng `entries`:
|
||||
Đọc `DbInitializer.SeedContractCatalogAsync` (dòng 3163-3325) **trước** khi chạm prod:
|
||||
|
||||
- Lần parse 1 (regex line-anchored) → **78** ⇒ SAI (tuple xuống dòng). KHÔNG dùng số này.
|
||||
- Lần parse 2 (regex multiline) → **86**; cross-check độc-lập `raw code-literal` = **86**, distinct = **86**, dup = **[]**.
|
||||
- Dự đoán `GROUP BY ApprovalGroup`: **1:5 · 2:10 · 3:5 · 4:23 · 5:14 · 6:15 · 7:13 · 8:1** (tổng 86)
|
||||
- Dự đoán `GROUP BY GroupCode`: A1:5 A2:1 A3:9 A4:5 B1:23 B2:14 B3:15 C1:6 C2:3 C3:4 CEO:1
|
||||
- Seeder **idempotent** (`existingCodes.Contains(code) continue` + `IgnoreQueryFilters` né #75/#76) ⇒ lần deploy đầu `added=86`, restart sau `added=0`.
|
||||
- Serilog line dự kiến: `Seeded {Count} contract catalog entries (S164 SP-002)` (chỉ ghi khi `added > 0`).
|
||||
|
||||
⇒ Dự đoán KHỚP kỳ vọng đề bài. Giờ mới đo prod.
|
||||
- Parse lần 1 (regex line-anchored) → **78** ⇒ SAI (tuple xuống dòng). Vứt, KHÔNG báo cáo số này.
|
||||
- Parse lần 2 (multiline) → **86**; cross-check độc-lập `raw code-literal` = **86**, distinct = **86**, dup = **[]**.
|
||||
- Dự đoán `GROUP BY ApprovalGroup`: **1:5 · 2:10 · 3:5 · 4:23 · 5:14 · 6:15 · 7:13 · 8:1**
|
||||
- Dự đoán `GROUP BY GroupCode`: 11 nhóm — A1:5 A2:1 A3:9 A4:5 B1:23 B2:14 B3:15 C1:6 C2:3 C3:4 CEO:1
|
||||
- Seeder idempotent (`existingCodes.Contains(code) continue` + `IgnoreQueryFilters` né #75/#76) ⇒ deploy đầu `added=86`.
|
||||
- Serilog dự kiến: `Seeded 86 contract catalog entries (S164 SP-002)` (chỉ ghi khi `added>0`).
|
||||
|
||||
## Bundle PRE-deploy (đo LIVE lúc run đang chạy, 15:47)
|
||||
|
||||
@ -36,12 +31,132 @@ CICD-K1: IN-PROGRESS — 0/6 mục (đang đo)
|
||||
| admin | `index-B43R6Y17.js` | `index-BZ5F-g1w.css` |
|
||||
| eoffice | `index-NLI5umBg.js` | `index-yNZDmVNz.css` |
|
||||
|
||||
Khớp nguyên văn hash STATUS/đề-bài (`B43R6Y17` / `NLI5umBg`) ⇒ mốc "TRƯỚC" hợp lệ.
|
||||
Khớp nguyên văn hash đề-bài (`B43R6Y17` / `NLI5umBg`) ⇒ mốc "TRƯỚC" hợp lệ.
|
||||
|
||||
## Mục 1 — Gitea run
|
||||
---
|
||||
|
||||
- Run **id=547 · run_number=#434** · head_sha `50e6d8c3` · name `build-deploy`
|
||||
- created `2026-07-31T15:46:06+07:00` (push 15:45:50 → runner pick sau 16s)
|
||||
- (đang poll…)
|
||||
## ✅ Mục 1 — Gitea Actions run
|
||||
|
||||
(các mục 2-6 đổ dần bên dưới)
|
||||
- Run **id=547 · run_number=#434** · head_sha `50e6d8c3` · job `build-deploy` · runner `vps-vietreport-runner v0.2.13`
|
||||
- created `2026-07-31T15:46:06+07:00` (push 15:45:50 → pick sau **16s**)
|
||||
- Poll 7 iter × ~40s → iter7 `status=success`, updated `2026-07-31T15:52:37+07:00`
|
||||
- **Duration ≈ 6m31s** · `conclusion=None` (tasks API không populate — tin `status`, đúng khuôn đã biết)
|
||||
- URL: https://git.baocaogiaoduc.vn/vietreport-admin/solution-erp/actions/runs/434
|
||||
- **PASS**
|
||||
|
||||
## ✅ Mục 2 — Test gate 598
|
||||
|
||||
Nguyên văn từ web-UI log (`/actions/runs/434/jobs/0/logs`, 18.698 B):
|
||||
|
||||
```
|
||||
2026-07-31T08:46:34.2961110Z Passed! - Failed: 0, Passed: 45, Skipped: 0, Total: 45, Duration: 196 ms - SolutionErp.Domain.Tes…
|
||||
2026-07-31T08:49:26.8226799Z Passed! - Failed: 0, Passed: 553, Skipped: 0, Total: 553, Duration: 1 m 44 s - SolutionErp.Infrastr…
|
||||
```
|
||||
|
||||
- Domain **45** + Infra **553** = **598** — khớp baseline MỚI đề bài (590+8). Đối chiếu TÁCH-PHẦN: Domain **45 GIỮ NGUYÊN**, Infra **545→553 = +8** ⇒ đúng "7 lane K1 + T5b gate-fix" (delta rơi trọn vào Infra, đúng nơi file test mới nằm).
|
||||
- 0 fail / 0 skip cả 2 project. `Failed!`/`error CSxxxx` = **0 hit**.
|
||||
- ⚠️ Ghi chú phương-pháp: grep đầu tiên **0 hit** do format nhiều-khoảng-trắng (`Passed! - Failed: 0`); đã soi lại format thật rồi mới trích — KHÔNG báo "không thấy dòng test".
|
||||
- **PASS**
|
||||
|
||||
## ✅ Mục 3 — EF migration prod
|
||||
|
||||
```
|
||||
20260731072441_AddContractCatalogEntries ← TOP
|
||||
20260729122015_AddContractSigningPlans
|
||||
20260727033522_AddPeAllowApproverDelete
|
||||
20260717032812_AddPeApprovedBudgetSnapshot
|
||||
```
|
||||
|
||||
- `__EFMigrationsHistory` TOP == repo HEAD mig ⇒ **Mig 70 applied prod**.
|
||||
- Chân-kiềng (i) chứng-minh-restart-thật: `w3wp` PID **2644 StartTime 7/31/2026 3:52:13 PM** (trong cửa-sổ deploy 15:46:06→15:52:37) + dòng ĐẦU Serilog `2026-07-31 15:52:19.770 +07:00 [INF] Applying migrations...` ⇒ mọi số DB dưới đây đo **SAU** recycle (né đúng lỗi #423).
|
||||
- **PASS**
|
||||
|
||||
## ✅ Mục 4 — Seed prod 86 + phân bố 8 nhóm
|
||||
|
||||
`sqlcmd` (SQL-auth `vrapp`, sau recycle):
|
||||
|
||||
| Đo | Kết quả |
|
||||
|---|---|
|
||||
| `COUNT(*) FROM ContractCatalogEntries` | **86** |
|
||||
| `GROUP BY ApprovalGroup` | **1:5 · 2:10 · 3:5 · 4:23 · 5:14 · 6:15 · 7:13 · 8:1** |
|
||||
| `COUNT(DISTINCT Code)` | **86** (0 trùng) |
|
||||
| `IsActive=1` | **86** · `IsDeleted=1` = **0** |
|
||||
| `COUNT(DISTINCT GroupCode)` | **11** |
|
||||
|
||||
Serilog (`solution-erp-20260731.log`) nguyên văn:
|
||||
```
|
||||
2026-07-31 15:52:27.074 +07:00 [INF] Seeded 86 contract catalog entries (S164 SP-002)
|
||||
2026-07-31 15:52:25.867 +07:00 [INF] Seeded 1 menu items
|
||||
2026-07-31 15:52:26.030 +07:00 [INF] Seeded 1 admin permissions
|
||||
```
|
||||
- Control ÂM: `findstr "contract catalog KHONGTONTAI"` → **0 hit** ⇒ findstr có răng, không phải khớp bừa.
|
||||
- Đối chứng: 2 dòng `Seeded 1 menu items` / `Seeded 1 admin permissions` = menu-row `ContractCatalog` + permission cũng vào (leaf `Catalogs` thứ 5).
|
||||
- 🔑 **TAM-GIÁC 3 NGUỒN ĐỘC-LẬP khớp từng đồng**: source-parse (86 / 8 nhóm) == sqlcmd prod (86 / 8 nhóm) == **API materialize qua EF** (86 / 8 nhóm, xem Mục 6). Không nguồn nào suy ra nguồn kia.
|
||||
- **PASS**
|
||||
|
||||
## ✅ Mục 5 — Bundle đổi ×2 app (#77 byte-level)
|
||||
|
||||
**Vế DƯƠNG — hash MỚI là asset THẬT:**
|
||||
|
||||
| URL | code | content-type | size |
|
||||
|---|---|---|---|
|
||||
| admin `/assets/index-CKgq0YlH.js` | 200 | `application/javascript` | **1.751.576** |
|
||||
| admin `/assets/index-DD3xQhNt.css` | 200 | `text/css` | 86.298 |
|
||||
| eoffice `/assets/index-CHMCU35C.js` | 200 | `application/javascript` | **1.667.782** |
|
||||
| eoffice `/assets/index-CdXRNT7E.css` | 200 | `text/css` | 92.092 |
|
||||
|
||||
**Vế ÂM — hash CŨ phải BIẾN MẤT khỏi đĩa** (né SPA-fallback-200-trap S72, discriminator = `Content-Type` không phải status):
|
||||
|
||||
| URL cũ | code | content-type | size |
|
||||
|---|---|---|---|
|
||||
| admin `index-B43R6Y17.js` | 200 | **`text/html`** | 900 |
|
||||
| admin `index-BZ5F-g1w.css` | 200 | **`text/html`** | 900 |
|
||||
| eoffice `index-NLI5umBg.js` | 200 | **`text/html`** | 876 |
|
||||
| eoffice `index-yNZDmVNz.css` | 200 | **`text/html`** | 876 |
|
||||
|
||||
⇒ cả 4 rơi về SPA-shell 876/900 B (trùng khít size index.html) = file cũ đã bị ghi đè thật, KHÔNG phải cache.
|
||||
|
||||
**Ship-proof `Last-Modified` in-window** (#69 TWO-MODE — hash-delta một mình không đủ):
|
||||
- admin `/` → `Last-Modified: Fri, 31 Jul 2026 08:51:06 GMT` = **15:51:06 +07** ✔ in-window · `Cache-Control: no-cache`
|
||||
- eoffice `/` → `Last-Modified: Fri, 31 Jul 2026 08:52:07 GMT` = **15:52:07 +07** ✔ in-window · `Cache-Control: no-cache`
|
||||
|
||||
**4/4 hash ROTATE + 4/4 hash cũ chết + LM in-window. PASS**
|
||||
|
||||
## ✅ Mục 6 — Smoke
|
||||
|
||||
| Check | Kỳ vọng | Đo được | KL |
|
||||
|---|---|---|---|
|
||||
| `GET /health` | (bare) | **404** | control — route bare không tồn tại |
|
||||
| `GET /health/ready` | 200 | **200** | ✅ |
|
||||
| `GET /health/live` | 200 | **200** | ✅ |
|
||||
| `GET /api/catalogs/contract-catalog` **KHÔNG token** | 401 | **401** | ✅ authz sống |
|
||||
| CONTROL `…/contract-catalog-KHONGTONTAI` | 404 | **404** | ✅ 401 CÓ NGHĨA |
|
||||
| CONTROL `…/bia-dat-hoan-toan` | 404 | **404** | ✅ (route bịa ⇒ 401 ở trên không phải blanket) |
|
||||
| `https://admin.solutions.com.vn/` | 200 | **200** | ✅ |
|
||||
| `https://eoffice.solutions.com.vn/` | 200 | **200** | ✅ |
|
||||
| **CÓ token admin** `GET …/contract-catalog` | 200 + 86 row | **200, 25.374 B, 86 row** | ✅ |
|
||||
|
||||
Cross-check EF-materialize (mạnh hơn sqlcmd vì đi qua Domain→Infra→Api thật):
|
||||
```
|
||||
rows materialized via EF = 86
|
||||
by approvalGroup: 1:5 . 2:10 . 3:5 . 4:23 . 5:14 . 6:15 . 7:13 . 8:1
|
||||
distinct codes = 86
|
||||
sample row: code=A1-01 group=1 signer=TP.CCM
|
||||
```
|
||||
Class-level `[Authorize]` + ghi `[Authorize(Roles="Admin")]` (đọc `ContractCatalogController.cs:21-22,39-56`) ⇒ 401-không-token đúng thiết-kế, không phải #44 silent-403.
|
||||
- **PASS**
|
||||
|
||||
---
|
||||
|
||||
## Ghi chú lệch / quan sát (KHÔNG phải FAIL)
|
||||
|
||||
1. **Hash CI ≠ hash local build.** Đề bài dự-báo local ra admin `BE7zE81C`/user `DSXJJbJq`; CI ra `CKgq0YlH`/`CHMCU35C`. Tiêu chí đề bài (ĐỔI so với trước + curl 200) **thoả**. Nghĩa: artifact CI khác byte với artifact local (thường do Node minor / cây npm resolve khác) — bình thường, nhưng ⇒ **đừng bao giờ dùng hash local làm mốc kỳ vọng cho prod**, luôn re-snapshot LIVE.
|
||||
2. **Duration 6m31s** — dài nhất 4 run gần đây (#432 5m50s · #433 5m55s · #431 5m50s). Chưa tới ngưỡng escalate; hợp lý vì run này có thêm Mig 70 + seed 86 row + 8 test mới. Theo dõi tiếp, chưa cần hành động.
|
||||
3. **`Passed!` grep 2-khoảng-trắng** — lần grep đầu 0-hit là DƯƠNG-GIẢ do format; đã soi format rồi mới kết luận (bài học: 0-hit phải kèm control-dương trước khi báo).
|
||||
4. `[WRN]` global-query-filter (ContractSigningPlan/Contract ↔ Approval/Changelog/LevelOpinion) là warning EF **có sẵn từ trước** (Mig 69 S161), không do commit này sinh ra.
|
||||
|
||||
## Kết luận
|
||||
|
||||
Không có critical issue. Không đề xuất rollback. 0 thao tác ghi lên prod.
|
||||
|
||||
END sub-cicd-verify-k1 — VERDICT=PASS 6/6 (run #434 id=547 success 6m31s · gate 598=45D+553I · Mig 70 top prod · seed 86/8-nhóm khớp 3 nguồn · bundle 4/4 rotate + 4/4 hash cũ chết · smoke 8/8 + 401 có-nghĩa)
|
||||
|
||||
Reference in New Issue
Block a user