diff --git a/.claude/WAL.md b/.claude/WAL.md
index 9ba9098..95aa6b4 100644
--- a/.claude/WAL.md
+++ b/.claude/WAL.md
@@ -1,20 +1,20 @@
# WAL — auto-generated, không sửa tay
-updated: 2026-07-29T14:40+07:00 | session: S159 (phiên-LOGIC L8, window 1 — /pause) | branch: main
+updated: 2026-07-29T15:35+07:00 | session: S160 (phiên-LOGIC L8, window 2 — /tiep) | branch: main
-goal: L8 window-1 ĐÓNG CHỦ ĐỘNG (lệnh anh @PAUSE-1). Arc-2 UI toàn-trình ĐÓNG TRỌN 5/5 đợt; còn closeout sổ bền + PARK chờ anh.
+goal: L8 window-2 = CLOSEOUT sổ bền XONG TRỌN → PARK chờ anh trả lời checklist đánh-số (báo cáo /tiep S160).
chain:
-- [x] bootstrap L8 + Sàn-3 retro-harvest 2 synthesis L7 — run `2026-07-29-S159-bookend-open/` + detector 0-orphan
-- [x] bookend @open 5 vòng đủ (anh chốt) + thi hành (49)-(53) — 11 artifact ~231KB cùng folder; mind-check phép (10) MỚI fault-inject 4/4
-- [x] arc-2 5 đợt / 5 commit `b5799fc`→`1a47a61`→`2a72695`→`a2bbcb9`→`ea962b1` — run `2026-07-29-S159-tong-quan-pipeline-menu/` (disposition TỪNG FLAG trong run.md)
-- [x] cicd 5/5 verdict: PASS 9/9 · PARTIAL 8/9 (mục-9 lộ REVOKER [S92] — xử regrant=447 + gỡ nhánh code + REGRESSION-GUARD test) · PASS restart-proof · PASS durability-2 · **PASS 9/9 đợt-5 VỀ KỊP trước chốt** (`cicd-verify-ea962b1.md`: menu-delta 119→142=+23 khớp toán · endpoint 401-với-control-404 · durability-3 · luật control-âm-ĐỘC-QUYỀN cứu 1 false-fail)
-- [x] /pause nghi-thức: `_pause-1` + `_context` PAUSE-1 (verbatim anh) + MIND-2 (ctx-curator SUA-7-điểm áp trọn; mind-check đạt=11/0) + `_snapshot-1` + sweep 0-hit
-- [ ] CLOSEOUT sổ bền (việc /tiep): HANDOFF (❹-risk verbatim + revoker + 5 đợt + bộ tên 4-GĐ chốt: Duyệt NCC · Kế hoạch ký kết HĐ · Duyệt hợp đồng · Hợp đồng cứng · "Tổng quan quy trình") · STATUS CURRENT arc-2 + bundle baseline mới (user `Y6dW_5CM`/`6YIAufJR` admin `D0sXA0fe`/css-frozen) · gotchas +#84 revoker-2-chiều · spec KHKK note W1 tái dùng root/`Khkk_*` · session-log S159 · diary designer/cicd đối chiếu M9
+- [x] /tiep trọn nghi-thức: Sàn-3 5-tín-hiệu kêu ĐÚNG (khớp WAL) · tick 33→34 CLEAN · thư se=0/all=0 · mind-check 11/0 · _tiep-1 ghi + verdict ctx-verifier CO-CO-9-cờ
+- [x] đọc cicd-verify-ea962b1: PASS 9/9 — menu 119→142=+23 khớp toán · endpoint 401-với-control-404 · durability-3 · baseline admin `D0sXA0fe`/`DWDbm5As`-frozen · user `Y6dW_5CM`/`6YIAufJR`
+- [x] CLOSEOUT 7 mục (UNION K1): STATUS CURRENT arc-2 ⑦⑧ + bỏ "0 prod-code" + Gotchas-row 84 · HANDOFF khối ARC-2 + ❹-risk verbatim + vá stale 37,9%→69,2% · gotcha #84 revoker-2-chiều · spec KHKK note W1 (tái dùng Khkk_* + tiền-đề dark-launch ĐẢO) · session-log 2026-07-29-1440-S159 · diary designer S159 on-behalf + cicd baseline #426 · [MIND @close = nhịp cửa-đóng, treo]
+- [x] curate 2 diary (hook 24,4KB): designer 23.570→19.388B · cicd 23.678→21.852B (moved-not-cut ×3 True; 17,1K KHÔNG ép = thước MA slot 46) — nợ mới: pointer _INDEX #424 treo chờ (51-bis)
+- [x] governance-detectors ×2: C11 9→5 (diary-delta CLEAR sau commit) · TOTAL 48→43 (vá Gotchas-row canonical) · INFORM 14→5
-next: /tiep → đọc `cicd-verify-ea962b1.md` + `_context-s-8.md` PAUSE-1 → làm mục CLOSEOUT `[ ]` trên → rồi PARK chờ anh (xem checklist báo-cáo /pause)
+next: PARK — chờ anh trả lời checklist đánh-số trong báo cáo /tiep S160: (1) FLAG-4 "Đã duyệt" HĐ · (2)=(51-bis) _INDEX cicd 99,2%/167B chọn a/b/c · (3) Bảng↔Bản cứng · (4) Hộp thư hoa · (5) 6 FLAG-L park · (6)=(46) thước 17,1K (dữ kiện mới: hook kêu ×3 trong closeout) · slot cũ (42)(43)(44)(47)(48) giữ. Việc em khi anh cho đóng L8: bookend @close + MIND @close + đổi nhãn D-ý5 gần-chốt @block-kế.
verify:
-- [ ] closeout: `git log --oneline -6` thấy 5 commit arc-2 + `wal: pause` · `Test-Path .claude/workflows/runs/2026-07-29-S159-tong-quan-pipeline-menu/cicd-verify-ea962b1.md` = True
-- prod state chốt: menu 4-GĐ 6-leaf ×(1 Khkk + 7 Ct) + Hdc 7 "- Bảng cứng" + root 12 + 38-key 13/13 (bền ×3 restart) + 21-key mới 13/13 · test 562 · Mig 68/89 bảng
-- 🔴 KHÔNG SQL tay cho menu nữa — code-first seeder (bài revoker); comment nêu LUẬT+grep, CẤM số-đếm (bài FLAG-10 ×2 trong ngày)
-- 🔴 `git status` mù thư-mục rỗng ⇒ close-gate chạy RIÊNG `find -type d -empty`; dư-lượng spawn tái phát theo cwd vai — dọn cuối MỖI wave
+- [x] closeout: `git log --oneline -7` thấy 5 commit arc-2 + wal:pause · session-log tồn tại `docs/changelog/sessions/2026-07-29-1440-S159-tong-quan-quy-trinh-arc2-bookend.md` · `grep -c '### 84\.' docs/gotchas.md` = 1
+- [x] detector: `governance-detectors.ps1` TOTAL=43 INFORM=5 (baseline khớp S159; 1 MED pre-existing #91@S151-log → drift-audit 08-01)
+- prod state chốt: menu 142 · 4-GĐ 6-leaf ×(1 Khkk + 7 Ct) + Hdc 7 "- Bảng cứng" + root 12 + 38-key 13/13 + 21-key mới 13/13 · test 562 · Mig 68/89 bảng · bundle admin `D0sXA0fe`/user `Y6dW_5CM`
+- 🔴 KHÔNG SQL tay cho menu — code-first seeder (gotcha #84); comment nêu LUẬT+grep, CẤM số-đếm
+- 🔴 drift-audit tháng tới 2026-08-01 (2 ngày) — 6 vai (3 ctx + 3 ring) chưa baseline; ef-core/contract-workflow SKILL derived-stale LOW chờ đợt đó
diff --git a/.claude/agent-memory/cicd-monitor/MEMORY.md b/.claude/agent-memory/cicd-monitor/MEMORY.md
index 66b81c9..247c2b9 100644
--- a/.claude/agent-memory/cicd-monitor/MEMORY.md
+++ b/.claude/agent-memory/cicd-monitor/MEMORY.md
@@ -4,7 +4,7 @@
- _(**#425 S159 đợt-4 `a2bbcb9` 7-FLAG fix + nhãn 'Bảng cứng' — PASS 9/9**: gate 562, user js `DeAg7MWm`→`CLfAftby`. 🔑 **admin FROZEN vẫn chứng được lành tính**: LM 13:55:31 **in-window** + size trùng ⇒ re-ship byte-identical (#69 mode-B). 🔑 **comment-strip DỰ ĐOÁN TRƯỚC rồi mới đo**: `chưa tới` source=2 (cả 2 trong comment) → dự đoán bundle=0 → đúng 0. ⚠️ `Không tìm thấy` bundle 10 > source 3 ⇒ marker phổ-thông chỉ dùng '≥1'. **Durability lần 2**: 38-key 494/494 giữ + control âm 0)_
-- **07-29 verify `2a72695` ĐỢT-3 (gỡ nhánh S92 khỏi revoker + skeleton menu GĐ2/GĐ4 + ComingSoonPage×2) [S159, 9 file code, 0 mig]:** ✅ **PASS 9/9 — ĐÓNG regression tao bắt ở đợt-2.** Run **#424** (id=537) success **5m56s**; gate **562** giữ nguyên (3 test SỬA theo spec-change, không thêm ⇒ tổng không đổi). Bundle rotate **4/4** (admin `D6Pz7nfV`→`CC1pGE1F`/`B1ErASuI`→`DWDbm5As` · user `Bpb8WEuY`→`DeAg7MWm`/`7oAYFlzM`→`BQIZ-rUe`); marker `Phân hệ đang được triển khai`=1 cả 2 bundle + `Quay lại`=4; hash CŨ→`text/html` = chứng ghi-đè. Menu-tree: Khkk=5 · Hdc=7 · root=12 · DUPKEYS=0 · 3 root vis=0. 🔑 **PHÉP DURABILITY LÀM ĐÚNG (sửa lỗi đo-sớm đợt-2) — khuôn 3 CHÂN KIỀNG, tái dùng cho mọi ca 'fix có bền không':** (i) **CHỨNG MINH có restart THẬT trước khi đo** — `w3wp` PID StartTime 12:39:56 trong cửa-sổ deploy + **dòng ĐẦU log = 12:40:03 `Applying migrations...`** (dùng được vì deploy xoá `logs/` ⇒ log mở lại = boot mới) + DLL mtime; (ii) đo CÁI CẦN: 38-key **min=13 max=13 keys=38, tổng 494/494** SAU restart (đợt-2 chính phép này ra 47/494); (iii) **control ÂM chống Goodhart**: `Hrm/Off/Personal` non-Admin vẫn **=0** ⇒ revoker CÒN SỐNG, nên (ii) xanh KHÔNG phải do vô hiệu hoá cả hàm. **Thiếu (iii) thì 'fix' bằng cách xoá luôn checker cũng xanh y hệt.** Bổ sung: `Revoked` **0 dòng** trong log = ĐÚNG (hàm chỉ log khi `rows.Count>0`; nay 0 row cần lật, so 447 ở đợt-2) — **vắng-mặt phải giải-trình bằng cơ-chế, đừng đọc thành thiếu dữ liệu**. Guard mới có RĂNG 2 vế: `StillHiddenKeys` phải false + `ReopenedKeys` phải TRUE ⇒ re-add nhánh S92 là CI đỏ. ⚠️ Bẫy số: nhãn `01.-07.` đếm ra **14** (kỳ vọng 7) — tách prefix ra `Ct_`=7 + `Hdc_`=7 + other=0, đúng thiết kế 'GĐ4 tái dùng nhãn đã đánh số', KHÔNG phải nhân đôi. ⚠️ seeder grant là **skip-existing** ⇒ không tự nâng row `false` sẵn có trên prod; prod phải re-grant SQL + revoker thôi lật. Evidence: `runs/2026-07-29-S159-tong-quan-pipeline-menu/cicd-verify-2a72695.md`. Tag `[run-424, pass-9-9, durability-3-chan-kieng, restart-proof-w3wp-log-head, control-am-chong-goodhart, gate-562]`
+- _(**#424 S159 đợt-3 `2a72695` gỡ nhánh S92 khỏi revoker + skeleton GĐ2/GĐ4 — PASS 9/9, ĐÓNG regression #423**: durability khuôn 3-CHÂN-KIỀNG (xem 'Recurring bug patterns' dưới — restart-proof + đo-sau-mốc + control-ÂM) · bundle rotate 4/4 · guard 2-vế StillHiddenKeys/ReopenedKeys · ⚠️ seeder grant skip-existing không nâng row false sẵn có. verbatim → `archive/2026-07.md` substring:"07-29 verify `2a72695` ĐỢT-3" — 🔴 pointer `_INDEX` TREO chờ slot (51-bis): index 20.313/20.480=99,2%, 167B headroom. Evidence: `runs/2026-07-29-S159-tong-quan-pipeline-menu/cicd-verify-2a72695.md`)_
- _(**#423 S159 đợt-2 `1a47a61` tab-strip 4GĐ + menu 4-GĐ — PARTIAL 8/9**: 8 mục ship đúng, **FAIL mục-9 = phát hiện lớn nhất arc**: `RevokeTemporarilyHiddenModulesAsync` UNGATED lật 447/494 row grant SQL tay (còn 47: Admin 38 + Procurement 9). ⚠️ **bẫy ĐO-TRƯỚC-RECYCLE** (đo lúc `running` = trạng thái CŨ) — đã nâng thành luật ở mục 'Recurring bug patterns'. 🔑 marker-count = SỐ MODULE chứa chuỗi. verbatim → `archive/2026-07.md`)_
@@ -71,7 +71,7 @@ cicd-lane đôi khi trả nhầm slice transcript (memory-curation) thay verdict
- **SSH→PS quoting (S42):** nested bash→ssh→powershell mangles `$var`/`\"` → use `iconv UTF-16LE | base64` → `powershell -EncodedCommand $B64`; OR write ps1-file + `powershell -File $(cygpath -w)`. sqlcmd over SSH direct `-W -h -1` pw-inline. sys-catalog string-concat → `COLLATE DATABASE_DEFAULT` (collation conflict).
- **Tests baseline:** **562 PASS** (45 Domain + 517 Infra · 0 fail/skip; run #422 `b5799fc` 07-29; khớp canonical `docs/STATUS.md`). 🔑 **Số cụ thể lấy ở web-UI log `https://git.baocaogiaoduc.vn/vietreport-admin/solution-erp/actions/runs/{run_number}/jobs/0/logs` (~18KB, KHÔNG có `/api/v1/` — api/v1 runs+tasks logs đều 404)** → mỗi project 1 dòng `Passed! - Failed: 0, Passed: N, Skipped: 0`; đối chiếu TÁCH-PHẦN (45/517) chứ đừng chỉ khớp tổng. Delta test mới = so run trước.
- **Mig latest repo: Mig 68 `AddPeAllowApproverDelete`** (`20260727033522`, S155 — AddColumn bit trên `ApprovalWorkflowLevels`, no-new-table; VERIFIED-APPLIED-PROD). Path `src/Backend/SolutionErp.Infrastructure/Persistence/Migrations/` (68 `.cs` excl Designer/Snapshot). Prod check `sqlcmd __EFMigrationsHistory ORDER BY MigrationId DESC`. ⚠️ **`sys.tables`(is_ms_shipped=0)=89** — AddColumn/data-only/enum-additive KHÔNG đổi số; no-new-table commit ⟹ 89 đúng, đừng FAIL. **NO-Mig proof = history NOT-advance + empty `git diff