# S96 — 2026-07-01 — Buổi UAT LỚN anh Kiệt/team live + Monthly-audit (5 commit prod-verified) > em-main-led. HMW-mode ON (1 prep-workflow monthly-audit + spawn-lẻ, chủ-yếu solo/reliable). Session dài: `/session-start` → monthly audit → NCC import → 3 PE bug-fix theo UAT anh Kiệt/chị Trà/anh Chương → `/session-end`. ## 5 commit (đều pushed + deployed + cicd-verified) | # | SHA | Scope | Run | |---|---|---|---| | 1 | `881783c` | Docs: monthly drift audit + FD distill + mega-line re-tier | docs-only CI-skip | | 2 | `ba4b8e0` | Infra: import NCC DONGDUONG + Supplier-field backlog | #477 | | 3 | `e657faa` | PE: ô "KẾT THÚC quy trình" → opt-out bỏ-tick-được | #478 | | 4 | `36cbf8b` | PE: mark-read noti "cần duyệt" cũ (fix chuông stale) | #479 | | 5 | `0c2f9f6` | PE: khóa sửa giá đề xuất PRO/CCM sau gửi-duyệt | #480 | ## (1) Monthly drift audit `881783c` (đúng hạn cron ngày 1) - **ef-core-migration/SKILL.md:** latest-mig 56→**59** + append bảng rows 57/58/59 + Mig 14/Phase-7 Budget annotate `DROPPED Mig 50`. - **skills/README.md:** ef-core Mig 55→59 + gotcha cite #69→**76** (heading gốc gotchas.md). - **docs/CLAUDE.md:** Budget module `REMOVED Mig 50 (S61)` strike-through (§1 item 6 + roadmap Phase 7/8). - **`docs/governance/vocab-alias-map.md` MỚI:** 3 vocab-fork (run-trace/Ngân-sách-PRO/all-inherit canonical) + thêm vào `$ExcludeExact` governance-detectors (anti self-match; detector pure-grep nên flag stay "documented-known"). - **Re-tier STATUS/HANDOFF mega-line** 5→3 blurb (S92/S91 → archive tier-S94, byte-exact conservation **delta=0**, BOM-preserved) + **hoist 3 UAT-carry** (S92 non-admin-menu · S91 change-pw · S91 NCC-demo) vào blockers (reviewer flag conservation). - **FD memory distill** (H17 loop strike-1 → **CLEARED**): frontend-designer L1 **26129→21492B**, 5 war-story (S66/S65/S58/S55/S47) → `archive/2026-06.md` + `_INDEX` + gist; Lessons value-protect (anti-#53/Tailwind-v4-stop/rig-#3/lucide) lên L1. budget.json measured refreshed. - **Workflow `wf_2d687d27`** 4-cluster draft→adversarial-verify: reviewer bắt **#74 paraphrase-drift** (em sửa từ heading gốc) + **AS-10 residual reviewer self-write reverted** (git-diff backstop). detector **27→25** (2 real drift clear; còn lại module-local false-pos). ## (2) Import NCC DONGDUONG `ba4b8e0` - Excel anh Kiệt "Database NCC & Nhà thầu phụ" — 4 NCC, ~30 field. **Phát hiện:** 3 NCC (TRUONGGIANG/TANPHU/TGN) **đã seed sẵn** S55/S59 (data khớp) → chỉ **DONGDUONG** mới. - Scope anh chốt = **option-3** (9 field entity + gói extras Loại/NĐD/TK/GUQ/Trạng-thái vào `Note`). **KHÔNG migration** (data-only seed). `SeedRealMasterDataAsync` ungated idempotent → prod 20→**21 NCC** (cicd #477: sqlcmd 21 rows, DONGDUONG type=2, Note "Thang máy"). - **Backlog "15-18 field note-lại-từ-từ-tính"** (bank tách/link GUQ-GPKD-HSNL/địa-chỉ-VP/PMH... + enum SupplierType thêm "Cả hai") → `docs/STATUS` Maintenance backlog. ## (3-5) 3 PE bug-fix theo UAT anh Kiệt/chị Trà/anh Chương - **`e657faa` — ô "Cấp này KẾT THÚC quy trình" opt-out bỏ-tick-được** (anh Kiệt "cái này option thôi"): AllowApproverFinalize (Mig 58, S89 auto-finalize im-lặng) NAY = **2-tier** — Designer tick = **cấp quyền** (level được phép finalize), phiếu = **thực-thi** (mặc-định tick=kết-thúc, bỏ-tick=trình-CEO). +param `applyLevelFinalize` (default-true backward-compat) xuyên interface→service (guard `&& applyLevelFinalize`)→command→handler→controller + FE checkbox 2-app. +test #6 (opt-out→advance-CEO). Run #478. - **`36cbf8b` — chuông tự-sạch noti "cần duyệt"** (chị Trà/anh Kiệt "chuông không bỏ ra được"): noti "Phiếu cần bạn duyệt" cũ KHÔNG tự xóa khi phiếu được duyệt-thay/hoàn-tất bởi người khác. Fix: `LogTransitionAsync` (chạy MỌI transition) mark-read `ReadAt` mọi noti Generic+RefId=phiếu unread TRƯỚC block notify-cấp-mới. `ExecuteUpdateAsync` best-effort BE-only. +test #7 (finalize→noti CEO cũ mark-read). Run #479. - **`0c2f9f6` — khóa sửa giá đề xuất PRO/CCM sau gửi-duyệt** (anh Kiệt/chị Trà "duyệt là fix"): screenshot drafter=PRO điền Min/Max SAU khi chị Trà duyệt. Root: 2 handler cố-ý "KHÔNG ràng Phase" (Mig 54). Fix ĐẢO: non-admin chỉ sửa Nháp/TraLai, đã-gửi-duyệt/đã-duyệt/từ-chối → ConflictException; Admin override. BE (PeSuggestedPriceFeatures) + FE (PeDetailTabs `SuggestedPriceRows` gate `&& isEditablePhase` 2-app) + **4 test** (spec-change: sửa `SeedPeAsync` default ChoDuyet→DangSoanThao). Run #480. - **Delete-sau-duyệt = ĐÃ chặn sẵn** — không cần fix: FE nút Xóa chỉ hiện `DangSoanThao` + BE delete-guard block non-draft. chị Trà chắc test phiếu Nháp. - **Checkbox "ko được"** (anh Chương) = **browser cache** (gotcha #77): verify prod bundle `0MU-kb4N` BYTE-LEVEL chứa fix ("BỎ tick"), "✅ static" cũ MẤT; index.html no-cache đúng + no-service-worker → **incognito = golden-test**. ## Lessons 1. **verify-deployed-artifact-byte-level** (gotcha #77 + `feedback_verify_deployed_artifact_byte_level`): cache≠deploy — curl-grep bundle prod tìm marker fix; incognito golden. Tiết-kiệm giờ debug sai hướng. 2. **#53 return-garble ×3** (`feedback_agent_return_garble_recover`): investigator + cicd×2 trả text-memory-curation thay verdict; WORK + diary ĐÚNG → recover từ agent-memory KHÔNG re-spawn; instruction-fix "return verdict" ăn lần-3 (không 100%). 3. **2-tier-permission** (grant-vs-exercise): config = cấp quyền, runtime = thực-thi — tách rõ (Designer AllowApproverFinalize vs phiếu applyLevelFinalize). 4. **spec-change→update-test-cũ** (rules §7): đảo "KHÔNG ràng Phase" → sửa SeedPeAsync seed-phase để 15 test cũ sống + 4 test mới. ## State (verified) Mig **59** · **88** bảng · **440** test (45D+395I, +6 S96) · gotcha **77** · menu 54 · bundle admin `COYAX-yQ`/user `0MU-kb4N` (Run #480) · prod **21 NCC** / 17 user. ## Carry / NEXT - **🔴 anh:** restart CLI · UAT **incognito** checkbox anh Chương · cho **số-phiếu + user** vụ "lỗi phân quyền vào phiếu" (nhiều khả năng config: user chưa gán approver Cấp phiếu đang chờ). - **🔴 em:** cicd-monitor S-tag-drift S97/S98→S96 reconcile (closeout này) · monthly re-tier mega-line (giờ 4-blurb S96/S95/S94/S93) · Supplier-schema-mở-rộng backlog (khi anh chốt). - **Pending product (carry):** Section B cột Dự-án · Ngưỡng giá CEO Mig 54 · "C" chuyển phiếu→dự án.