[CLAUDE] Docs: S96 session-end closeout — UAT PE fixes + monthly audit + memory flush

- STATUS/HANDOFF: prepend S96 mega-line (5 commit: monthly-audit 881783c + NCC ba4b8e0 + 3 PE fix e657faa/36cbf8b/0c2f9f6) · Tests 434->440 · gotcha 76->77 · bundle COYAX-yQ/0MU-kb4N · prod 21 NCC · In-Progress S95->S96
- gotchas: +#77 SPA deploy bundle cache-lag (verify byte-level cache!=deploy; incognito golden)
- session log 2026-07-01-S96-uat-pe-fixes-monthly-audit.md
- user-memory (ngoài repo): +2 feedback (verify-deployed-artifact-byte-level · agent-return-garble-recover)
- agent-memory: cicd-monitor S-tag drift S97/S98->S96 reconcile (11x; facts correct) · investigator-codebase Supplier-audit diary

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
pqhuy1987
2026-07-01 16:49:16 +07:00
parent 0c2f9f630f
commit 791ec5544d
7 changed files with 98 additions and 30 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,52 @@
# 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.

View File

@ -1298,6 +1298,18 @@ for h in resp.points: # ← .points không phải iterable trực tiếp
**Fix/Quy tắc:** đổi prod config = sửa `.example` (tracked) HOẶC `appsettings.json`, KHÔNG file local gitignored. `.example` KHÔNG `DemoSeed` prod fallback `appsettings.json DemoSeed:Disabled=true` (đúng fallback đã giữ Contracts/PE gated nhiều tháng gate #75 hiệu-lực prod).
### 77. SPA deploy bundle cache-lag — user thấy UI CŨ dù đã deploy (index.html cache / tab-SPA-mở) (Session 96)
**Triệu chứng:** Deploy FE xong (bundle rotate verified prod), nhưng user (anh Chương UAT) VẪN thấy UI Ctrl+F5 + logout/login checkbox opt-out mới không hiện, vẫn "✅ Cấp này KẾT THÚC" static . Team " tay rồi".
**Cơ chế:** Vite đặt hash trong TÊN file (`index-<hash>.js`, `Cache-Control: immutable max-age=1năm` = ĐÚNG). `index.html` = `Cache-Control: no-cache` (ĐÚNG chuẩn revalidate ETag mỗi load). Nhưng: (a) tab SPA đang-mở chạy JS trong RAM (cần reload thật, không chỉ F5-nửa-vời); (b) browser đôi khi giữ `index.html` cached bất-chấp no-cache trỏ file JS (tên hash ). KHÔNG service-worker (fe-user grep `serviceWorker|workbox|VitePWA` = 0) không phải SW-cache.
**Chẩn-đoán (phân-biệt cache-vs-deploy — QUAN TRỌNG, đừng đoán):** **verify bundle prod BYTE-LEVEL**: `JS=$(curl -s $BASE/ | grep -oE '/assets/index-[A-Za-z0-9_-]+\.js')` `curl -s "$BASE$JS" | grep -ao "<string-fix-mới>"` + `grep "<string-cũ>"`. Fix-string PRESENT + old-string GONE = deploy OK **100% client-cache** (KHÔNG phải deploy-fail). S96: prod `0MU-kb4N` chứa "BỎ tick"/"Đã BỎ tick", "bạn duyệt xong" MẤT xác nhận cache.
**Fix (client):** **incognito window (Ctrl+Shift+N) = golden-test** (không dùng cache, chắc-chắn bundle mới nếu incognito OK = 100% cache). Hoặc F12ApplicationClear site datareload. **Đừng chỉ Ctrl+F5** (đôi khi không xóa index.html cached). **Server ĐÃ đúng chuẩn** (index.html no-cache + JS hash-immutable) KHÔNG cần fix infra.
**Quy tắc:** UAT báo "fix chưa ăn" sau deploy verify bundle prod byte-level TRƯỚC khi nghi deploy-fail; **incognito = phép-thử vàng** tách cache khỏi bug. Liên-quan #69 (bundle non-determ) · `feedback_verify_deployed_artifact_byte_level`.
**An toàn prod:** chỉ XEM/scroll/screenshot KHÔNG bấm nút mutate (Gửi duyệt/Duyệt/Trả lại/Tạo ). Mở `+ Thêm mới` (form `?mode=new`) KHÔNG tạo draft cho tới khi sửa field (auto-save on-edit).
**References:** `$env:TEMP\guideshots\capture.ps1` (session-scratch) · `docs/Huong-dan-Duyet-NCC.docx`. Pattern reusable user-memory `pattern_prod_screenshot_to_docx`.