# S77 (2026-06-19) — PE UX batch: 10 deploy prod-verified (anh Kiệt FDC + Tra Sol + Bích Phượng)

> Buổi sản phẩm RẤT LỚN, HMW-mode ON. Anh forward liên-tục chat Zalo từ 3 người dùng (anh Kiệt FDC + chị Trà Sol + Bích Phượng) — loạt tinh-chỉnh module Duyệt NCC (PE) realtime. Em-main điều phối + spawn specialist lẻ + cicd-monitor verify từng deploy. Cuối buổi anh "Xong thì session-end luôn".

## Kết quả tổng

| Chỉ số | Trước | Sau |
|---|---|---|
| Deploy | — | **10** (#320→#329), **10/10 cicd PASS** |
| Migrations | 56 | **57** (`AddPeSuggestedPriceNotes`) |
| Tests | 344 | **354** (+10) |
| Bundle | jOqxW4-p / DbsznVvR | **BqKD3Y23 / Cn-i349D** (Run #329) |
| SQL tables | 88 | 88 (additive cols) |
| Gotchas | 70 | 70 (tái dùng #70) |

## 10 deploy

| # | Commit | Việc | Người yêu cầu |
|---|---|---|---|
| #320 | `8e68ed1` | Cờ GẤP **pill** 🔴 GẤP (PRO) / 🟢 GẤP (CCM) đồng bộ MỌI danh sách + inbox. NEW `PeUrgentChips` ×2 app (single source of truth). Data đã có từ S69 (Mig 53) — chỉ chưa render ở `PeListPanel` + `InboxPage` (chỉ tree-list + detail có). FE-only, 0 BE. | anh Kiệt |
| #321 | `398b01d` | PE **focus mode**: bấm phiếu → overlay full-bleed trượt từ phải, ẩn menu+list, phiếu full-width tự cuộn + panel duyệt. + responsive laptop nhỏ. | anh Kiệt |
| #322 | `3b98845` | **Revert** list về layout gốc (3-panel bám-trái lấp-đầy, KHÔNG canh giữa). Anh: "giữ như cũ" (overlay quá tay). Recover từ FD process-death. | anh |
| #323 | `94e0e12` | **Mig 57** `AddPeSuggestedPriceNotes` (ô ghi chú giá đề xuất PRO/CCM, 2 cột nvarchar(1000)) + **số phân cách VND** (`VndInlineEdit`/`BudgetCell`) + sửa chính tả "Bản"→"Bảng so sánh giá" + **guard #70** stale-echo. | Tra Sol + anh Kiệt |
| #324 | `e42d103` | Số âm → **đỏ + ngoặc** `(5.000.000)` hàng 7/8/9 (đồng bộ hàng "So sánh" đã có `fmtVndSigned`). | Tra Sol |
| #325 | `e29391e` | Mục con **thụt dòng + gạch đầu dòng** (`BudgetRow +indent`) phân biệt mục có-số (1-9, cha) vs không-số (con). | Tra Sol |
| #326 | `b5aa72d` | Cờ gấp authz **BẤT ĐỐI XỨNG**: GẮN = NV chức năng (Procurement/CostControl/Admin) / GỠ = chỉ **Trưởng phòng** (`DeptManager` + role chức năng) hoặc Admin. Handler `SetPurchaseEvaluationUrgent` gate theo `IsUrgent`; FE nút gate theo trạng thái hiện tại. | Tra Sol (clarify giữa-chừng) |
| #327 | `fa6654b` | **Tách chọn-phiếu (inline 3-panel "như cũ") khỏi mở-rộng (overlay)** + nút **"Xem mở rộng"** (`Maximize2`) mỗi dòng. `?expand=1` decouple `?id`: click row=inline (wide) / overlay (narrow); "Xem mở rộng"=id+expand; Thu gọn=bỏ expand giữ id; approve/đóng=về list. | anh (annotate) |
| #328 | `424131d` | **Chuông báo người duyệt** khi phiếu vào cấp họ (submit + mỗi approve-advance). `LogTransitionAsync` +block: `toPhase==ChoDuyet` → resolve current-level approvers (step.Levels Order==CurrentApprovalLevelOrder, exclude actor) → `NotifyManyAsync` Generic "Phiếu cần bạn duyệt". Best-effort, V2-only. BE-only no-mig. | Bích Phượng + Tra Sol |
| #329 | `e823694` | **Banner phiếu Trả lại** ở chế độ Xem (readOnly) hướng dẫn ✏️ Sửa → "Lưu & Gửi Duyệt" (nút submit chỉ hiện khi Sửa). | Bích Phượng |

## Cách chạy (orchestration)

- **em-main** điều phối + tự review diff TRƯỚC mỗi commit + commit/push + chốt scope.
- **frontend-designer ×3** (focus #321 / revert #322 / decouple #327) — FD2 visual loop, nhưng backend `:5443` DOWN cả buổi → stub-verify layout (gotcha #3); live authed verify = post-deploy (anh UAT).
- **implementer-frontend** — pill #320 + notes/separator/spelling #323 (2 app SHA-mirror).
- **implementer-backend ×2** — Mig 57 #323 + approver-notify #328.
- **test-specialist ×3** — suggested-price notes +7 (#323) · urgent authz **symmetric → asymmetric REDO** (#326, do Tra Sol clarify sau khi đã dispatch).
- **cicd-monitor ×10** — verify từng deploy (run + bundle rotate + Mig + smoke); 10/10 PASS.

## Bài học

1. **Review-TRƯỚC-deploy bắt 3 lỗi mà "build PASS" KHÔNG thấy** (đều là runtime, không phải compile):
   - **guard #70 (stale-echo):** ô ghi chú giá đề xuất dùng absolute-set echo từ server-snapshot → lưu giá rồi lưu chú liên-tiếp đè mất. impl-FE bê đúng echo nhưng SÓT `peFetching` guard (đã có ở bảng ngân sách S76). Em-main grep-so-với-budget-pattern → vá.
   - **luật cờ-gấp bất-đối-xứng:** Tra Sol clarify GIỮA-CHỪNG (sau khi em đã dispatch test-specialist cho luật symmetric "TP cho cả gắn+gỡ") → luật cuối = GẮN-NV/GỠ-TP. Em fix BE+FE + REDO test (1 vòng test-specialist thừa). **Lesson: spec đang được người dùng clarify realtime → confirm luật TRƯỚC khi dispatch sub-agent (tránh redo).**
   - **double-mount (Task H):** FD viết comment "render khi chọn && CHƯA mở rộng" nhưng code điều-kiện sót `!isExpand` → inline `PeDetailTabs`/`PeWorkflowPanel` mount SAU overlay khi expand. Intent-comment ≠ implementation → em-main review render-condition + vá.
2. **frontend-designer process-death giữa Task H** (CLI thoát) → in-process state mất, task FAILED. Recovery: tin **disk/git truth** (edit hoàn-chỉnh trên disk + build PASS) — em-main build-verify + mirror fe-admin + commit, KHÔNG re-spawn (agent-kill recovery, `feedback_agent_kill_recovery`).
3. **Batch rapid tweaks:** anh fire tinh-chỉnh liên-tục → em gom build+verify trước, deploy tuần-tự, verify từng cái độc lập (cicd). 10 deploy nhưng mỗi cái isolated → dễ rollback + UAT từng bước. 0 production bug lọt.
4. **Backend-down (gotcha #3):** FD2 visual loop chạy stub layout-shell (backend :5443 down) → layout verify OK nhưng live-data verify defer post-deploy. Build PASS + em-main logic review = đủ tin để deploy; anh UAT confirm.

## §L auto-maintain (light — product session)

- **§L.a error-ledger:** 0 bug-production (3 lỗi bắt PRE-deploy = success của review-gate, không phải bug lọt). Không AS-class hit mới. test-spec REDO = process-inefficiency (clarify-after-dispatch) — ghi lesson, không RCA formal.
- **§L.b:** (a) STATUS Recently Done +S77 ✅ · (c) chore-flag = curate L1 over-cap (archive-gate dry-run: reviewer 45KB/cicd 37.6KB/inv 35.6KB keep-floor-hit manual; FD/test-spec WATCH; **A7 GATE PASS 186/186** integrity OK); sleep-check = last_sleep 2026-06-18 <7d, KHÔNG cần · (d) flush = 5 sub self-flush MEMORY khi return (git-status verified: cicd/FD/impl-BE/impl-FE/test-spec modified) · (e) pending = UAT items + carry logged specifics · (f) harvest = self-flush (KHÔNG dùng run-trace folder session này, toàn Agent-tool spawn lẻ) · (g) tooling-freshness = KHÔNG đổi skill/plugin/roster (toàn product).
- **Infra-adoption:** N/A (no infra/governance adoption — product-only session).

## 🔴 NEXT SESSION

- **Em (carry GẤP):** curate L1 over-cap — reviewer **45KB** + cicd-monitor 37.6KB + inv-codebase 35.6KB (keep-floor-hit → **manual SPLIT/condense** newest large entries, KHÔNG auto-drain; archive integrity A7 PASS — chỉ L1-hot truncate on-inject). FD 26KB / test-spec 27.7KB WATCH strike-1. Làm như op tập-trung (precedent S70/S71).
- **UAT (anh/anh Kiệt/Tra Sol/Bích Phượng):** cờ gấp GỠ chỉ TP · chuông báo người duyệt · banner Trả-lại · "Xem mở rộng" · ô ghi chú PRO/CCM · số phân cách + số-âm-đỏ-ngoặc + indent.
- **Ops giữ S58/S59:** tzutil VPS UTC+7 · anh Chương email typo · 5 real-staff pw · gán CNTT. **Monthly audit 2026-07-01:** re-tier STATUS/HANDOFF (history bloated) · docs/CLAUDE count-flush (Mig 57, test 354) + schema §16+ Mig 32-57.
