From 881783c335498f09ea0c198a8517accee65cd4bb Mon Sep 17 00:00:00 2001 From: pqhuy1987 Date: Wed, 1 Jul 2026 13:04:15 +0700 Subject: [PATCH] [CLAUDE] Docs: S96 monthly drift audit + FD memory distill + mega-line re-tier MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Monthly drift audit (2026-07-01, cron ngày 1) — workflow-prepared (wf_2d687d27-175, 4 clusters draft→adversarial-verify), em-main single-writer applied: - ef-core-migration/SKILL.md: latest-mig 56→59 + append table rows 57/58/59 + Mig 14 + Phase-7 Budget annotate DROPPED Mig 50 (S61) - skills/README.md: ef-core row Mig 55→59/S87 + gotcha cite #69→#76 (5 latest, authoritative gotchas.md headings) - docs/CLAUDE.md: Budget module marked REMOVED Mig 50 — §1 item 6 + roadmap Phase 7/8 rows (strike-through, non-destructive) - docs/governance/vocab-alias-map.md (NEW): 3 vocab-forks documented (run-trace / Ngân sách PRO / all-inherit canonical) + governance-detectors.ps1 $ExcludeExact entry (anti self-match) - re-tier STATUS/HANDOFF mega-line 5→3 blurbs (S92/S91 → archive verbatim, conservation delta=0, BOM preserved) + hoist 3 UAT-carry items to blockers FD memory distill (H17 loop strike-1 → CLEARED, GAPS: none): - frontend-designer L1 26129B→21492B: 5 old Activity war-stories → archive/2026-06.md + _INDEX + gist; Lessons value-protect distilled to L1 - budget.json measured.frontend-designer refreshed Detector 27→25 (2 real drift cleared; remaining = documented false-positives module-local/never-built-defer). AS-10 residual reviewer sub-write reverted (git-diff backstop, E-006 recurrence — guard HELD). Co-Authored-By: Claude Opus 4.8 --- .../agent-memory/frontend-designer/MEMORY.md | 13 ++-- .../frontend-designer/archive/2026-06.gist.md | 33 +++++++++ .../frontend-designer/archive/2026-06.md | 11 +++ .../frontend-designer/archive/_INDEX.md | 10 +++ .claude/agent-memory/memory-budget.json | 2 +- .claude/skills/README.md | 4 +- .claude/skills/ef-core-migration/SKILL.md | 11 +-- docs/CLAUDE.md | 6 +- docs/HANDOFF.md | 2 +- docs/STATUS.md | 3 +- .../STATUS-HANDOFF-tier-S94-2026-06-29.md | 4 +- docs/governance/vocab-alias-map.md | 72 +++++++++++++++++++ scripts/governance-detectors.ps1 | 3 +- 13 files changed, 154 insertions(+), 20 deletions(-) create mode 100644 .claude/agent-memory/frontend-designer/archive/2026-06.gist.md create mode 100644 .claude/agent-memory/frontend-designer/archive/2026-06.md create mode 100644 .claude/agent-memory/frontend-designer/archive/_INDEX.md create mode 100644 docs/governance/vocab-alias-map.md diff --git a/.claude/agent-memory/frontend-designer/MEMORY.md b/.claude/agent-memory/frontend-designer/MEMORY.md index e1c2e69..63e151c 100644 --- a/.claude/agent-memory/frontend-designer/MEMORY.md +++ b/.claude/agent-memory/frontend-designer/MEMORY.md @@ -42,12 +42,15 @@ - ⚠️ **fe-admin parity follow-up:** same subtitle likely `text-slate-500` in fe-admin LoginPage — apply same bump next fe-admin touch (did NOT touch fe-admin this run; scope-disciplined). - Minor noted (NOT fixed, out of bounded scope): 2 `blur-3xl` blobs barely visible at 1440 = render cost ~0 payoff; eyebrow `tracking-[0.2em]` heavy. Candidates if login redesign requested. +## Lessons / anti-patterns (value_protect — GIỮ L1 bất-kể tuổi) +- **Anti-truncation #53 (atomic-Write):** file lớn (>1000 LOC) = ONE atomic `Write` cả-file (lands-fully-or-errors, no half-break) + **EMIT change-list + build-verdict TRƯỚC khi vào FD2 screenshot loop** (2× truncate liên-tiếp CÙNG điểm rig-entry — S55/S58, em-main proxy recover). Truncate giữa-run → build ×2 verify. +- **Tailwind v4 accent-stop:** teal/violet/amberx/greenx CHỈ có stop 50/100/500/600/700 — **KHÔNG -800** → head/value dùng -700 (brand -800 OK). Dùng -800 = silent no-class (build PASS, phải soi dist CSS). Rail pseudo cần `before:content-['']` else ::before không render box. +- **Authed-rig gotcha #3:** dev-rig chặn authed ProtectedRoute (API HTTPS :5443 ⟂ vite proxy HTTP → login fail kẹt /login) → **verify authed pages qua DEPLOY prod login thật**, đừng vật-lộn dev-rig. Public /login chụp trực-tiếp OK. +- **Lucide alias-dodge:** icon từ export-aggregation-line (`SendHorizonal`) / mojibake token (`网络Placeholder` autocomplete) → dùng proven-safe export (`Send`), node-check icons trước build. + ## Activity log - **S79 (2026-06-19) PE list fe-user → DECOUPLE chọn/mở-rộng (anh chốt, annotated screenshot):** `pages/pe/PurchaseEvaluationsListPage.tsx`. S78 cũ: bấm dòng = mở overlay full-bleed, 2 panel giữa/phải LÀ placeholder vĩnh viễn. S79 đổi: **bấm dòng = inline 3-panel detail "như cũ" (8e68ed1)** + thêm nút **"Xem mở rộng"** mỗi dòng → overlay. Mechanism = param thứ-2 **`?expand=1`** cạnh `?id`: overlay render CHỈ khi `id && expand`; inline detail (panel giữa `` + panel phải ``) render khi `id && !expand`. Handlers: `selectRow`=set id+clear expand (NHƯNG `` cũ bọc trong `
` + `pr-9` chừa chỗ nút. **ALL logic VERBATIM** (grep ✓): 3 queryKey (`approval-workflows-v2-filter`/`pe-list`/`pe-detail`) · 3 endpoint (`/inbox`+paged+detail) · `del` mutation (onSuccess giờ clear id+expand thay `setParam`) · `yearGroups` 4-tầng tree memo · `PeUrgentChips` pill · search/filter/SLA/localStorage-expand. `PurchaseEvaluationDetailPage` route GIỮ. **slide+a11y S78 giữ NGUYÊN** (mount-rAF×2, role=dialog/aria-modal, focus-trap Tab-vòng, body scroll-lock, motion-reduce). `npm run build` (tsc -b strict + vite v8) **PASS 0 TS err, 570ms** (3 warning pre-existing). **FD2: static layout-shell harness** (backend :5443 down → authed dev-rig blocked gotcha#3) — Playwright 6 shot × 3 state: (a) inline 3-panel desktop1920+laptop1280 = list+PeDetailTabs giữa+PeWorkflowPanel phải, dòng-chọn có nút Maximize2; (b) overlay 1920+1280 = full-bleed phiếu+panel cạnh; (c) mobile390 list (1-col, nút mở-rộng) + mobile390 overlay (stack). Read tất 6 PNG — đúng hết, no overflow, pill+tree intact. Harness/driver/shots ĐÃ XÓA. Rubric PASS. fe-admin NOT mirrored (implementer-frontend SHA-mirror riêng), no BE, no commit. Tag [s79, pe-decouple-select-expand, expand-param, maximize2-row-btn, inline-restore-8e68ed1, lg-straight-overlay, collapse-keeps-id, logic-verbatim, build-pass, harness-fd2]. - **S69 (2026-06-17) OfficeDashboardPage.tsx fe-user — E-Office landing, PURO HomePage, COMPOSES 3 shared widgets:** built `pages/office/OfficeDashboardPage.tsx` (~400 LOC) over EXISTING data hooks of 4 modules. Read-first: 3 ui widgets (exact prop sigs) + 4 source pages (ProposalsListPage/WorkflowAppsListPage/ItTicketsPage/MeetingCalendarPage) to harvest queryKey+endpoint + types + App.tsx routes. **Reused hooks verbatim** → shared TanStack cache, ZERO new API/BE: `GET /proposals` (+inboxOnly query for needs-my-action) · `/leave|ot|travel-requests` (merged, countByStatus client-side) · `/it-tickets` · `/meeting-bookings` (today window). Layout = PageHeader(brand) + `lg:grid-cols-3` [LEFT col-span-2 = 4 WidgetCards w/ KpiCard filter-chip bodies | RIGHT col-span-1 = "Công việc của tôi" hero+MetricRows + "Thao tác nhanh" 3 buttons], 1-col ` + 2 `useMemo` (counts + visibleItems) DERIVED over already-fetched `items`; **KHÔNG touch query/endpoint/queryKey/navigation** (page chỉ fetch `page:1` như cũ, không có filter-state sẵn nên thêm view-layer = thuần presentation; empty-state phân biệt "chưa có data" vs "không có đơn ở trạng thái này"). **DETAIL:** ui/PageHeader teal + 4 section dùng local `Card`(accent-rail pseudo `before:bg-{x}-500` + icon-chip) + `Field`(label uppercase `text-{x}-700`, value `text-brand-800`) — copy idiom HRM EmployeesListPage (KHÔNG import HRM, helper local riêng). Accent gán: Thông tin=teal · Số dư phép=greenx · Quy trình=violet · Ý kiến=brand. Status badge giữ `WORKFLOW_APP_STATUS_BADGE`. Drop raw "⚠️" emoji trong over-budget banner→text thuần (anti-slop FD3). **ALL data logic VERBATIM** (grep-verified): 2 query `[endpoint,id]`+`['approval-workflows-v2',applicableType]` (key/endpoint/`enabled` y nguyên) · 3 mutation pinWorkflow(PUT /workflow)/submit(POST /submit)/action(POST /{k}) body+onSuccess+invalidate identical · 3 state + flags isDraft/isInWorkflow/hasWorkflow + mọi onClick/nav target bất biến. **gotcha Tailwind-v4 stop:** dùng CHỈ -50/-500/-700 cho teal/violet/amberx/greenx (no -800) — `border-l-greenx-500`/`bg-amberx-50`/`text-amberx-700` đều stop tồn tại (index.css verified). **Self-caught:** `SendHorizonal` (KpiCard "Đã gửi duyệt" icon) export-aggregation-line trong lucide d.ts → đổi `Send` (proven-safe export) tránh alias-risk. Self-review: mọi import resolve, 0 unused local (noUnusedLocals strict) — `Info`/`Wallet`/`GitBranch`/`MessageSquareText` đều dùng. **KHÔNG run npm build** (em main builds central, 7-agent parallel interference) + KHÔNG modify ui/index.css (other agents edit). FD2 authed-screenshot SKIP (ProtectedRoute + rig gotcha #3 — verify via deploy). fe-admin NOT mirrored. Tag [s69, eoffice-donutu-reskin, puro-hrm-visual, consume-ui-pageheader-kpicard, client-side-filter-view, logic-verbatim, no-build-parallel-fanout, lucide-alias-dodge]. -- **S66 (2026-06-16) HRM Hồ sơ Nhân sự fe-user REFINE từ eoffice LIVE (3 việc) — layout 3-cột→2-cột + tô màu detail:** anh góp ý sau khi xem prod. **Việc 1 (layout):** 3-cột-ngang `[tree 244 | list 352 | detail 1fr]` → **2-cột** `lg:grid-cols-[22rem_1fr] xl:[24rem_1fr]`: CỘT TRÁI = `
` ôm tree (TRÊN, `lg:max-h-[44%] lg:shrink-0`, overflow-auto) + list+filter (DƯỚI, `flex-1`, overflow-auto) — mỗi panel cuộn độc lập; CỘT PHẢI = detail (flex-1, rộng hơn nhiều, đỡ chật). ` → [Org tree | List | Detail 5-tab]. **Strategy chống truncation #53 = ONE atomic `Write` (cả file)** thay piecemeal Edit (atomic Write either fully-lands or errors, KHÔNG half-break) → emit change-list TRƯỚC build → DID BOTH Part A (avatar header+5 tab+section→tab redistribution) + Part B (org tree panel) trong 1 pass, không phải defer B. Org tree consume `/departments/tree` verified BE-side (DepartmentFeatures.cs DepartmentTreeNodeDto, controller `[HttpGet("tree")]`, class-Authorize only). Foundation màu mới DÙNG: `.app-gradient-brand` header / `.icon-chip` / accent palette teal/violet/amberx/greenx (avatar tones) — brand #1F7DC1 + Be Vietnam Pro KEPT. **5 satellite CRUD + 16 api endpoint + query keys preserved VERBATIM** (grep-verified: 16 api.post/put/delete identical payload shape, 5 form fns intact). `npm run build` (tsc -b strict + vite) **PASS 0 TS err, 6.13s**. 1 self-caught bug: typo garbage token `网络Placeholder` trong lucide import (mojibake autocomplete) → removed, all 21 icons valid (node-checked). FD2 authed-screenshot SKIPPED per explicit task instruction + gotcha #3 (rig blocks authed; anh xem qua deploy) — did static structural verify instead (grep endpoint/key preservation). fe-admin NOT touched (mirror = separate pass), no commit. Tag [s65, hrm-3panel, namgroup-ref, atomic-write-antitrunc, crud-preserved, build-pass]. -- **S58 (2026-06-11) fe-user redesign theo UI/UX guide AI_INFRA canonical — KEEP brand [em main proxy — truncated #53 giữa FD2 screenshot, 2nd consecutive]:** Mirror design-system fe-admin S55 → 14 file fe-user (index.css heading-ladder+.label-eyebrow / 6 ui primitives — Button gần SHA-identical fe-admin chỉ khác comment / 6 shell DataTable+RowActions-additive·Layout-brand-left-rail·TopBar·PageHeader·PhaseBadge-ring·EmptyState / LoginPage polish). Rubric mới = guide 13 mục `D:\Dropbox\CONG_VIEC\AI_INFRA\docs\reference\ui-ux-design-guide.md` (density 14px/h32-34/radius-8/thead-sticky/action-luôn-hiện/no-font-bold). BRAND KEPT: #1F7DC1 + Be Vietnam Pro + slate (guide cho plug hue riêng). Chết NGAY TRƯỚC with_server.py screenshot /login → em main recover: build ×2 PASS 0 TS + diff-review key-stability từng file + ship `e959f72`; authed visual qua deploy prod (rig-gotcha #3 standing). LESSON: 2 lần liên tiếp truncate ở CÙNG điểm (sau khi sửa xong, lúc bắt đầu FD2 rig) → lần sau EMIT file-list verdict TRƯỚC khi vào screenshot loop. Tag [s58, fe-user-redesign, guide-aiinfra, keep-brand, truncated-53-proxy]. -- **S55 (2026-06-09) Phase-1 fe-admin redesign — density-first NAMGROUP-ref, KEEP brand** [em main proxy — truncated #53]: 14 file (index.css density ladder + 6 ui primitive Button h-7/8/10 brand-ring + 6 shell + DashboardPage KPI). Brand #1F7DC1+Be Vietnam Pro KEPT. build 0 TS. Visual loop BLOCKED authed-rig#3 → chỉ /login. → S58 mirror sang fe-user. (detail archive nếu cần). Tag [s55, density-namgroup, keep-brand]. -- **S47 (2026-06-02) FD2 RIG VERIFIED ✅** — first real spawn. Ran full FD2 loop end-to-end on fe-user `/login`: read DS (Tailwind v4 CSS-first, corrected stale config-path assumption) → started Vite via `with_server.py` → Playwright screenshot 375+1440 → Read PNGs → FD4 critique → 1-line contrast fix → re-screenshot confirmed → `npm run build` 0 TS error. Closes adap-report `2026-06-02-Agent-frontend-designer-floor` FD2 runtime proof. 2 Vite gotchas captured above. Loop is REAL, not theoretical. + +> _Older Activity (S66/S65/S58/S55/S47 · 2026-06-02→16) → `archive/2026-06.md` verbatim · map `archive/_INDEX.md` · distill `archive/2026-06.gist.md`. Curated @S96 first-overflow (L1 26129B > autoinject-cap 25600B, H17-loop strike-1)._ diff --git a/.claude/agent-memory/frontend-designer/archive/2026-06.gist.md b/.claude/agent-memory/frontend-designer/archive/2026-06.gist.md new file mode 100644 index 0000000..cd4e167 --- /dev/null +++ b/.claude/agent-memory/frontend-designer/archive/2026-06.gist.md @@ -0,0 +1,33 @@ +# frontend-designer — archive 2026-06.gist (L2 distill · 4-field · distill-gen 1) + +> Coverage-gate: every gotcha#/lesson/file:line/root-cause/surprise in `2026-06.md` verbatim survives here (or N/A). Distilled @S96 (2026-07-01) from `2026-06.md`. FROZEN once written; re-distill bumps distill-gen. + +### S66 hrm-2col-refine (2026-06-16) +- **task:** HRM Hồ sơ Nhân sự fe-user REFINE (anh prod-feedback): layout 3-cột→2-cột + tô màu detail (ACCENT 5-tone brand/teal/violet/amberx/greenx). +- **verdict:** build PASS 0 TS 495ms; 5 satellite CRUD + 15 api endpoint + 3 query keys VERBATIM (grep+tsc). +- **learned:** 2-col `lg:grid-cols-[22rem_1fr] xl:[24rem_1fr]`; left = tree(top, max-h-44%)+list(bottom) độc-lập-cuộn; Card `accent` prop → icon-chip tinted + head text-{x}-700 + rail pseudo. +- **surprise/gotcha:** accent palettes NO -800 (chỉ 50/100/500/600/700) → head -700 else silent no-class; rail pseudo cần `before:content-['']`; atomic-Write cả-file = anti-truncation #53. + +### S65 hrm-3panel (2026-06-16) +- **task:** EmployeesListPage 1201→~1140 LOC → [Org tree | List | Detail 5-tab] master-detail (NamGroup-ref). +- **verdict:** build PASS 0 TS 6.13s; 5 CRUD + 16 api + query keys VERBATIM. +- **learned:** ONE atomic `Write` whole-file = anti-#53 (lands-fully-or-errors, no half-break); emit change-list BEFORE build; org-tree consume `/departments/tree` (DepartmentTreeNodeDto). +- **surprise/gotcha:** mojibake garbage token `网络Placeholder` in lucide import (autocomplete) → removed, node-checked 21 icons. + +### S58 fe-user-redesign (2026-06-11) +- **task:** mirror fe-admin S55 design-system → 14 file fe-user, KEEP brand #1F7DC1. +- **verdict:** build ×2 PASS 0 TS; shipped `e959f72` (em-main PROXY — FD truncated #53 mid-run). +- **learned:** rubric = AI_INFRA `ui-ux-design-guide.md` 13-mục (density 14px/h32/radius-8/thead-sticky/action-luôn-hiện). **LESSON: 2× consecutive truncate at SAME point (start of FD2 screenshot rig) → EMIT file-list+build verdict BEFORE screenshot loop.** +- **surprise/gotcha:** #53 truncate at rig-entry (2nd consecutive); authed visual via deploy (rig gotcha #3 standing). + +### S55 density-namgroup (2026-06-09) +- **task:** Phase-1 fe-admin redesign density-first (NAMGROUP-ref, 14 file), KEEP brand. +- **verdict:** build 0 TS; em-main proxy (truncated #53). → S58 mirrored to fe-user. +- **learned:** density ladder (Button h-7/8/10 brand-ring); brand #1F7DC1 + Be Vietnam Pro kept. +- **surprise/gotcha:** visual loop BLOCKED by authed-rig #3 → chỉ /login screenshot. + +### S47 fd2-rig-verified (2026-06-02) +- **task:** first real spawn — run full FD2 visual-verification loop end-to-end on fe-user /login. +- **verdict:** loop REAL (screenshot 375+1440 → FD4 critique → 1-line contrast fix slate-500→600 → re-shot → build 0 TS); closes adap-report FD2 runtime proof. +- **learned:** Tailwind v4 CSS-first (no config.js; tokens in `index.css` @theme, brand-600=#1f7dc1); with_server.py rig pattern (Python Playwright not npm). +- **surprise/gotcha:** 2 Vite gotchas — (1) `networkidle` NEVER fires (HMR ws) → `domcontentloaded`+`wait_for_selector`; (2) first cold goto dep-optimize >15s → warm-up goto 60s timeout. diff --git a/.claude/agent-memory/frontend-designer/archive/2026-06.md b/.claude/agent-memory/frontend-designer/archive/2026-06.md new file mode 100644 index 0000000..cf0e7bb --- /dev/null +++ b/.claude/agent-memory/frontend-designer/archive/2026-06.md @@ -0,0 +1,11 @@ +# frontend-designer — archive 2026-06 (L2 verbatim · FROZEN additive) + +> Curated from L1 `MEMORY.md` @S96 (2026-07-01) — first-overflow distillation (L1 hit 26129B > autoinject-cap 25600B, H17-loop strike-1). Older Activity-log war-stories moved here VERBATIM (byte-exact, additive-only — NEVER rewrite existing bytes). Recent 3 (S79/S69×2) + all reference sections (design-system · FD2-rig · component-inventory · lessons) stay in L1. Map → `_INDEX.md` · 4-field distill → `2026-06.gist.md`. + +## Activity log (archived — moved-set, newest-of-moved on top) + +- **S66 (2026-06-16) HRM Hồ sơ Nhân sự fe-user REFINE từ eoffice LIVE (3 việc) — layout 3-cột→2-cột + tô màu detail:** anh góp ý sau khi xem prod. **Việc 1 (layout):** 3-cột-ngang `[tree 244 | list 352 | detail 1fr]` → **2-cột** `lg:grid-cols-[22rem_1fr] xl:[24rem_1fr]`: CỘT TRÁI = `
` ôm tree (TRÊN, `lg:max-h-[44%] lg:shrink-0`, overflow-auto) + list+filter (DƯỚI, `flex-1`, overflow-auto) — mỗi panel cuộn độc lập; CỘT PHẢI = detail (flex-1, rộng hơn nhiều, đỡ chật). ` → [Org tree | List | Detail 5-tab]. **Strategy chống truncation #53 = ONE atomic `Write` (cả file)** thay piecemeal Edit (atomic Write either fully-lands or errors, KHÔNG half-break) → emit change-list TRƯỚC build → DID BOTH Part A (avatar header+5 tab+section→tab redistribution) + Part B (org tree panel) trong 1 pass, không phải defer B. Org tree consume `/departments/tree` verified BE-side (DepartmentFeatures.cs DepartmentTreeNodeDto, controller `[HttpGet("tree")]`, class-Authorize only). Foundation màu mới DÙNG: `.app-gradient-brand` header / `.icon-chip` / accent palette teal/violet/amberx/greenx (avatar tones) — brand #1F7DC1 + Be Vietnam Pro KEPT. **5 satellite CRUD + 16 api endpoint + query keys preserved VERBATIM** (grep-verified: 16 api.post/put/delete identical payload shape, 5 form fns intact). `npm run build` (tsc -b strict + vite) **PASS 0 TS err, 6.13s**. 1 self-caught bug: typo garbage token `网络Placeholder` trong lucide import (mojibake autocomplete) → removed, all 21 icons valid (node-checked). FD2 authed-screenshot SKIPPED per explicit task instruction + gotcha #3 (rig blocks authed; anh xem qua deploy) — did static structural verify instead (grep endpoint/key preservation). fe-admin NOT touched (mirror = separate pass), no commit. Tag [s65, hrm-3panel, namgroup-ref, atomic-write-antitrunc, crud-preserved, build-pass]. +- **S58 (2026-06-11) fe-user redesign theo UI/UX guide AI_INFRA canonical — KEEP brand [em main proxy — truncated #53 giữa FD2 screenshot, 2nd consecutive]:** Mirror design-system fe-admin S55 → 14 file fe-user (index.css heading-ladder+.label-eyebrow / 6 ui primitives — Button gần SHA-identical fe-admin chỉ khác comment / 6 shell DataTable+RowActions-additive·Layout-brand-left-rail·TopBar·PageHeader·PhaseBadge-ring·EmptyState / LoginPage polish). Rubric mới = guide 13 mục `D:\Dropbox\CONG_VIEC\AI_INFRA\docs\reference\ui-ux-design-guide.md` (density 14px/h32-34/radius-8/thead-sticky/action-luôn-hiện/no-font-bold). BRAND KEPT: #1F7DC1 + Be Vietnam Pro + slate (guide cho plug hue riêng). Chết NGAY TRƯỚC with_server.py screenshot /login → em main recover: build ×2 PASS 0 TS + diff-review key-stability từng file + ship `e959f72`; authed visual qua deploy prod (rig-gotcha #3 standing). LESSON: 2 lần liên tiếp truncate ở CÙNG điểm (sau khi sửa xong, lúc bắt đầu FD2 rig) → lần sau EMIT file-list verdict TRƯỚC khi vào screenshot loop. Tag [s58, fe-user-redesign, guide-aiinfra, keep-brand, truncated-53-proxy]. +- **S55 (2026-06-09) Phase-1 fe-admin redesign — density-first NAMGROUP-ref, KEEP brand** [em main proxy — truncated #53]: 14 file (index.css density ladder + 6 ui primitive Button h-7/8/10 brand-ring + 6 shell + DashboardPage KPI). Brand #1F7DC1+Be Vietnam Pro KEPT. build 0 TS. Visual loop BLOCKED authed-rig#3 → chỉ /login. → S58 mirror sang fe-user. (detail archive nếu cần). Tag [s55, density-namgroup, keep-brand]. +- **S47 (2026-06-02) FD2 RIG VERIFIED ✅** — first real spawn. Ran full FD2 loop end-to-end on fe-user `/login`: read DS (Tailwind v4 CSS-first, corrected stale config-path assumption) → started Vite via `with_server.py` → Playwright screenshot 375+1440 → Read PNGs → FD4 critique → 1-line contrast fix → re-screenshot confirmed → `npm run build` 0 TS error. Closes adap-report `2026-06-02-Agent-frontend-designer-floor` FD2 runtime proof. 2 Vite gotchas captured above. Loop is REAL, not theoretical. diff --git a/.claude/agent-memory/frontend-designer/archive/_INDEX.md b/.claude/agent-memory/frontend-designer/archive/_INDEX.md new file mode 100644 index 0000000..42c59ab --- /dev/null +++ b/.claude/agent-memory/frontend-designer/archive/_INDEX.md @@ -0,0 +1,10 @@ +# frontend-designer — archive _INDEX (L2 map · inject the map, not the territory) + +> One line per archived entry. Pointer = unique substring (Ctrl-F in `2026-06.md`). NO line-hints (additive appends shift lines). Built @S96 (2026-07-01). Verbatim → `2026-06.md` · 4-field distill → `2026-06.gist.md`. + +## 2026-06 (5 entries · S66→S47) +- **S66 hrm-2col-refine** (2026-06-16) — HRM Hồ sơ 3-cột→2-cột + accent-detail 5-tone; Tailwind-v4 -800-stop self-caught ×2 + rail `before:content-['']`; atomic-Write anti-#53; 5 CRUD+15 api verbatim. → find `S66 (2026-06-16) HRM Hồ sơ` +- **S65 hrm-3panel** (2026-06-16) — EmployeesListPage → 3-panel master-detail NamGroup-ref; ONE atomic Write anti-#53; mojibake `网络Placeholder` lucide self-caught; org-tree `/departments/tree`. → find `S65 (2026-06-16) HRM Hồ sơ` +- **S58 fe-user-redesign** (2026-06-11) — mirror fe-admin DS → 14 file fe-user KEEP brand; truncated-#53 2nd-consecutive (em-main proxy, ship `e959f72`); LESSON emit-file-list-before-FD2-loop. → find `S58 (2026-06-11) fe-user redesign` +- **S55 density-namgroup** (2026-06-09) — Phase-1 fe-admin redesign density-first KEEP brand; em-main proxy #53; authed-rig#3 blocked → /login only; → S58 mirror. → find `S55 (2026-06-09) Phase-1 fe-admin` +- **S47 fd2-rig-verified** (2026-06-02) — first real spawn; FD2 loop end-to-end proven /login; Tailwind-v4 CSS-first; 2 Vite gotchas (networkidle-never-fires + cold-goto-dep-optimize). → find `S47 (2026-06-02) FD2 RIG VERIFIED` diff --git a/.claude/agent-memory/memory-budget.json b/.claude/agent-memory/memory-budget.json index 658b46e..a72b5dd 100644 --- a/.claude/agent-memory/memory-budget.json +++ b/.claude/agent-memory/memory-budget.json @@ -106,7 +106,7 @@ "investigator-codebase": { "l1_hot": 10281, "l2_verbatim": 102446, "l2_index": 12308, "l2_gist": 27297, "rollout": "done (re-curated S80: 15 recon entries -> archive)" }, "reviewer": { "l1_hot": 10242, "l2_verbatim": 92316, "l2_index": 10067, "l2_gist": 19114, "rollout": "done (re-curated S80: 13 war-story entries -> archive)" }, "implementer-backend": { "l1_hot": 19394, "l2_verbatim": 59233, "l2_index": 10105, "l2_gist": 23079, "rollout": "done" }, - "frontend-designer": { "l1_hot": 26129, "l2_verbatim": 0, "l2_index": 0, "l2_gist": 0, "rollout": "n/a (no archive); OVER autoinject-cap 25600 (under soft-cap 30720) -- WATCH strike-1, first-overflow needs _INDEX/gist build" }, + "frontend-designer": { "l1_hot": 21492, "l2_verbatim": 6624, "l2_index": 1531, "l2_gist": 3231, "rollout": "done (S96 first-overflow curate: 5 old Activity war-stories S66/S65/S58/S55/S47 -> L2 verbatim + _INDEX map + gist; Lessons value-protect distilled to L1; back under autoinject-cap 25600)" }, "test-specialist": { "l1_hot": 27723, "l2_verbatim": 5546, "l2_index": 0, "l2_gist": 0, "rollout": "n/a (tiny archive, no _INDEX); OVER autoinject-cap 25600 (under soft-cap) -- WATCH strike-1; value-protect FLAG fired S81 (gotcha#/guard in move-set)" }, "harvest-curator": { "l1_hot": 18952, "l2_verbatim": 0, "l2_index": 0, "l2_gist": 0, "rollout": "n/a (no archive)" }, "tooling-auditor": { "l1_hot": 18431, "l2_verbatim": 0, "l2_index": 0, "l2_gist": 0, "rollout": "n/a (no archive)" }, diff --git a/.claude/skills/README.md b/.claude/skills/README.md index d3b477d..75236dc 100644 --- a/.claude/skills/README.md +++ b/.claude/skills/README.md @@ -17,7 +17,7 @@ Skill này là tài liệu chuyên biệt để Claude (và developer khác) dù | Skill | Mục đích | Trigger ví dụ | Trạng thái | |---|---|---|---| | `dependency-audit-erp` | Scan CVE NuGet + npm 2 FE, respect pin constraint (MediatR 12.4.1, Swashbuckle 6.9.0) | "npm audit", "dotnet vulnerable", "deps scan", "nâng cấp package" | ✅ New Tier 3 | -| `ef-core-migration` | Tạo/revert EF Core 10 migration, 3-file rule, DesignTimeDbContextFactory, migration history (mới nhất Mig 55; số → `docs/STATUS.md`) | "thêm migration", "EF migration", "schema update", "snapshot lỗi" | ✅ Updated S74 (Mig 55 PE CcmNote) | +| `ef-core-migration` | Tạo/revert EF Core 10 migration, 3-file rule, DesignTimeDbContextFactory, migration history (mới nhất Mig 59; số → `docs/STATUS.md`) | "thêm migration", "EF migration", "schema update", "snapshot lỗi" | ✅ Updated S87 (Mig 59 PE CcmBudgetPeriod; số → `docs/STATUS.md`) | | `iis-deploy-runbook` | 3 IIS site + win-acme cert + gitea-runner + LibreOffice + debug 500/502/SignalR prod + **G-084 IPv4/IPv6 hardening** | "prod 500", "IIS fail", "cert hết hạn", "restart app pool", "deploy IIS", "port hijack" | ✅ Updated (G-084) | ## Format chuẩn 1 skill @@ -87,5 +87,5 @@ when-to-use: ## Related - `docs/CLAUDE.md` — quick rules + full stack context -- `docs/gotchas.md` — bẫy đã gặp (số hiện tại → `docs/STATUS.md`; latest #69 FE bundle-hash non-deterministic + deploy rebuild-FE-unconditional, S72; #68 IDE TS diagnostic giữa background-agent/workflow = snapshot dở-dang → chỉ tin build sạch sau-cùng, S69; #67 Tailwind v4 accent palette thiếu-stop vỡ-màu im-lặng; #66 rule `h1-h4{color}` unlayered thắng utility `text-white`, S68) +- `docs/gotchas.md` — bẫy đã gặp (số hiện tại → `docs/STATUS.md`; latest #76 `deploy.yml` render `appsettings.Production.json` từ `.example` mỗi deploy → prod thiếu config gitignored, S91; #75 seed demo UNGATED per-code → RE-ADD data đã wipe mỗi restart (wipe KHÔNG bền), S91; #74 MCP `save_to_disk` KHÔNG tạo file truy-cập được → chụp prod bằng PowerShell `CopyFromScreen`, S90; #73 UPDATE-handler absolute-set → CLEAR field khi FE KHÔNG gửi (bug-class S42), S85; #72 DateTime serialize thiếu 'Z' → FE hiểu local lệch +7h, S85) - `docs/changelog/migration-todos.md` — roadmap 5 phase + Tier 3 diff --git a/.claude/skills/ef-core-migration/SKILL.md b/.claude/skills/ef-core-migration/SKILL.md index d429620..f47a4f2 100644 --- a/.claude/skills/ef-core-migration/SKILL.md +++ b/.claude/skills/ef-core-migration/SKILL.md @@ -1,6 +1,6 @@ --- name: ef-core-migration -description: Tạo/sửa/revert EF Core 10 migration cho SOLUTION_ERP. Dùng khi thêm entity mới, thay đổi schema, rollback migration, debug DesignTimeDbContextFactory fail. Đã có nhiều migration (số hiện tại → docs/STATUS.md canonical; mới nhất Mig 56 AddProBudgetSplitToPeWorkItemBudget, S76). Snapshot + Designer + Migration 3-file rule bắt buộc commit đủ. +description: Tạo/sửa/revert EF Core 10 migration cho SOLUTION_ERP. Dùng khi thêm entity mới, thay đổi schema, rollback migration, debug DesignTimeDbContextFactory fail. Đã có nhiều migration (số hiện tại → docs/STATUS.md canonical; mới nhất Mig 59 AddCcmBudgetPeriodToPurchaseEvaluation, S87). Snapshot + Designer + Migration 3-file rule bắt buộc commit đủ. when-to-use: - "thêm migration" - "EF Core migration" @@ -16,7 +16,7 @@ when-to-use: > **Context:** .NET 10 + EF Core 10 + SQL Server. DbContext: `ApplicationDbContext` ở `Infrastructure/Persistence/`. Startup: `SolutionErp.Api`. -## Migration history (số hiện tại → `docs/STATUS.md` canonical; mới nhất Mig 56) +## Migration history (số hiện tại → `docs/STATUS.md` canonical; mới nhất Mig 59) | # | Name | Tables added / changed | |---|---|---| @@ -33,7 +33,7 @@ when-to-use: | 11 | `AddRoleShortNameAndUserDepartment` | +Role.ShortName + User.DepartmentId/Position (cột thêm, không bảng mới) | | **12** | **`AddPurchaseEvaluations`** | **10 bảng module Duyệt NCC: PurchaseEvaluations + Suppliers + Details + Quotes + Approvals + Changelogs + Attachments + WorkflowDefinitions/Steps/StepApprovers** | | **13** | **`AddPurchaseEvaluationCodeSequences`** | **1 bảng `PurchaseEvaluationCodeSequences` (Prefix PK, LastSeq) — atomic sequence cho MaPhieu format `PE/{YYYY}/{A\|B}/{Seq:D3}`** | -| **14** | **`AddBudgets`** | **4 bảng module Ngân sách: Budgets + BudgetDetails + BudgetApprovals + BudgetChangelogs. + nullable FK index `Contracts.BudgetId` & `PurchaseEvaluations.BudgetId`** | +| **14** | **`AddBudgets`** | **⚠️ DROPPED Mig 50 (S61) — module Ngân sách cũ đã XÓA, thay bằng `PeWorkItemBudgets` per-gói-thầu. Bản gốc: 4 bảng Budgets + BudgetDetails + BudgetApprovals + BudgetChangelogs + nullable FK index `Contracts.BudgetId` & `PurchaseEvaluations.BudgetId` (append-only history, giữ row đánh dấu superseded).** | | **15** | **`AddPurchaseEvaluationDepartmentOpinions`** | **1 bảng `PurchaseEvaluationDepartmentOpinions` (UNIQUE PEId+Kind, max 1 row mỗi PeDepartmentKind per phiếu — Phê duyệt/Ccm/MuaHang/SmPm)** | | **16** | **`AddTwoStageDeptApprovalAndSmartReject`** | **3 bảng `Contract/PurchaseEvaluation/Budget DepartmentApprovals` (UNIQUE TargetId+Phase+Dept+Stage cho 2-stage NV.Review → TPB.Confirm per phòng × phase) + 4 ALTER (`Users.CanBypassReview` bit cho NV bypass + 3 `RejectedFromPhase` int cho smart reject jump-back). Phase 9 — đóng bug "NV duyệt được hết phase" anh Kiệt (FDC) báo. Logic 2-stage trong PurchaseEvaluationWorkflowService chỉ áp PE; HĐ + Budget defer.** | | **17** | **`AddManualBudgetFieldsToPeAndContract`** | **4 ALTER (PE + HĐ × `BudgetManualName` nvarchar(200) + `BudgetManualAmount` decimal(18,2)) — manual budget fallback khi user không link Budget entity approved. KHÔNG XOR với BudgetId, cả 2 cùng null OK. Carry-forward `pe.BudgetManualName/Amount → contract` ở `CreateContractFromEvaluation`. Phase 9 — Session 11 (2026-05-07).** | @@ -76,6 +76,9 @@ when-to-use: | **54** | **`AddPeSuggestedAndApprovedPrice`** | **🎯 S73 — PE +5 cột giá đề xuất (ProSuggestedMin/Max + CcmSuggested + ApprovedPriceAmount + ApprovedPriceSource) additive-nullable — CEO chọn giá chốt + CCM duyệt-done opt-in. anh Kiệt FDC go-live 22/06.** | | **55** | **`AddCcmNoteToPeWorkItemBudget`** | **🎯 S74 — PeWorkItemBudget +`CcmNote nvarchar(1000)?` (ô "Ghi chú từ CCM" mirror ProNote). AddColumn-only, no new table.** | | **56** | **`AddProBudgetSplitToPeWorkItemBudget`** | **🎯 S76 — PeWorkItemBudget +`ProInitialAmount`+`ProAdjustmentAmount` decimal(18,2)? (cột PRO "Ban hành lần đầu"+"V0/hiệu chỉnh", mirror CCM Initial/Adjustment). AddColumn additive + `Sql()` data-migrate `ProInitial=ProEstimate WHERE ProEstimate NOT NULL` (4 rows prod, gotcha #64). no new table. Form ngân sách → MA TRẬN 3 cột Dự án/PRO/CCM (bảng lưới ``).** | +| **57** | **`AddPeSuggestedPriceNotes`** | **🎯 S77 — PurchaseEvaluations +`ProSuggestedPriceNote`+`CcmSuggestedPriceNote` nvarchar(1000)? (ghi chú kèm giá đề xuất PRO/CCM, mirror ProNote/CcmNote). 2 AddColumn additive-nullable, no new table.** | +| **58** | **`AddPeMultiWinnerAndLevelFinalize`** | **🎯 S87 — PE multi-winner + per-Level finalize: PurchaseEvaluationSuppliers +`IsWinner bit` (nhiều NCC trúng thầu, thay winner đơn lẻ `SelectedSupplierId`) + ApprovalWorkflowLevels +`AllowApproverFinalize bit` (per-Cấp kết-thúc-tại-đây, không lên CEO) + `Sql()` backfill `IsWinner=1 WHERE SupplierId = pe.SelectedSupplierId` (phiếu UAT giữ winner cũ, idempotent). 2 AddColumn, no new table.** | +| **59** | **`AddCcmBudgetPeriodToPurchaseEvaluation`** | **🎯 S87 — PurchaseEvaluations +`CcmBudgetPeriodAmount` decimal(18,2)? (ngân sách CCM cột Section-B kỳ này, per-PE, mirror `BudgetPeriodAmount` phía PRO). 1 AddColumn additive-nullable, no new table.** | Total: **88 bảng** dbo + `__EFMigrationsHistory` (re-ground S62 cicd `sys.tables`; last schema-changing Mig 50 net 93→88 — Mig 51-55 đều AddColumn-only, không đổi số bảng). Xem `docs/database/schema-diagram.md` migration table + §11-15 module ERD (§16+ Mig 27-55 chi tiết pending). @@ -115,7 +118,7 @@ Architecture decision đáng ghi cho session sau: - Migration verify pattern thêm: chạy `dotnet test SolutionErp.slnx` local trước mỗi migration commit để chống regression policy/codegen. **Phase 7 update (2026-04-28):** -- Migration 14 `AddBudgets` — 4 bảng (Budgets/Details/Approvals/Changelogs) + 2 cột `BudgetId?` thêm vào Contracts & PurchaseEvaluations. Workflow hardcoded `BudgetPolicy.Default` (chưa versioned). +- Migration 14 `AddBudgets` — ⚠️ **DROPPED Mig 50 (S61)** — module Budget cũ đã XÓA, thay bằng `PeWorkItemBudgets`. (Bản gốc: 4 bảng Budgets/Details/Approvals/Changelogs + 2 cột `BudgetId?` thêm vào Contracts & PurchaseEvaluations. Workflow hardcoded `BudgetPolicy.Default` chưa versioned.) - 14 demo user thật `@solutions.com.vn` qua `SeedDemoUsersAsync` reconcile (PRO 5 + CCM 7 + ISO 1 + CEO 1). **Phase 6 update (2026-04-24):** diff --git a/docs/CLAUDE.md b/docs/CLAUDE.md index 960aa41..9219118 100644 --- a/docs/CLAUDE.md +++ b/docs/CLAUDE.md @@ -10,7 +10,7 @@ 3. Tự gen mã HĐ theo Quy định SOL-CCM-RG-001 4. Dashboard báo cáo HĐ theo NCC, dự án, trạng thái, giá trị 5. **Module Duyệt NCC (Phase 6-8)** — phiếu trình duyệt so sánh giá tiền-HĐ, 2 quy trình A/B versioned admin-config, kế thừa HĐ 1-click khi DaDuyet, Ý kiến 4 phòng ban sign-off -6. **Module Ngân sách (Phase 7-8)** — 4 bảng quản lý ngân sách dự án, workflow simple 3-step, integration link với Contract & PE + cột "So với ngân sách" PE matrix +6. ~~**Module Ngân sách (Phase 7-8)** — 4 bảng quản lý ngân sách dự án, workflow simple 3-step, integration link với Contract & PE + cột "So với ngân sách" PE matrix~~ ⚠️ **REMOVED Mig 50 (S61)** — module Budget cũ (4 bảng Budgets/BudgetDetails/BudgetApprovals/BudgetChangelogs) XÓA, thay bằng **ngân sách per-gói-thầu `PeWorkItemBudgets`** (1 record/cặp Dự án × Hạng mục, nhập theo role PRO/CCM); FE pages/types/menu `Bg_*` gỡ hết. 7. **Test gate (Phase 8)** — xUnit Domain policy + Infra code generator, CI fail-fast no deploy ## 2. Kiến trúc tổng thể @@ -120,8 +120,8 @@ SOLUTION_ERP/ | **5 Production** | CI/CD Gitea Actions + 3 IIS site + Let's Encrypt + Security headers + Users CRUD | ✅ Done | | **Tier 3** | Versioned WF + 3-panel layout + 4-bảng + 4 catalogs + 16 demo users + Brand identity | ✅ Done | | **6 Module Duyệt NCC** | PE iter 1 (skeleton) + iter 2 (UX polish) + Domain rebrand `.solutions.com.vn` | ✅ Done | -| **7 Budget BE + 14 Solutions users** | Migration 14 — 4 bảng Budget + workflow simple + 11 endpoint + 14 user thật | ✅ Done (Session 4) | -| **8 Budget FE + PE feature complete + Tests** | FE Budget 3-panel + PE/HD-Budget integration + PE Workflow Designer + Ý kiến 4 PB (mig 15) + Tests Phase 1-2 (71 test) + CI gate | ✅ Done (Session 5) | +| **7 Budget BE + 14 Solutions users** | Migration 14 — 4 bảng Budget + workflow simple + 11 endpoint + 14 user thật ⚠️ Budget bị **REMOVED Mig 50 (S61)** → `PeWorkItemBudgets` | ✅ Done (Session 4) | +| **8 Budget FE + PE feature complete + Tests** | FE Budget 3-panel + PE/HD-Budget integration + PE Workflow Designer + Ý kiến 4 PB (mig 15) + Tests Phase 1-2 (71 test) + CI gate ⚠️ FE Budget (pages/types/menu `Bg_*`) **REMOVED S61** cùng Mig 50 | ✅ Done (Session 5) | | **9 UAT + Ops + carry over** | UAT thật + SMTP + Rotate creds + SQL backup + Export PDF (pending) + Tests Phase 3-5 | 📝 Active (Session 6) | | **10+ Post-launch** | E-signature, Bravo/SAP, Mobile, AI OCR | 📝 Future | diff --git a/docs/HANDOFF.md b/docs/HANDOFF.md index 96c5584..02474c5 100644 --- a/docs/HANDOFF.md +++ b/docs/HANDOFF.md @@ -2,7 +2,7 @@ > **Tiering rule (S40):** giữ **2-3 session gần nhất**. Cũ hơn → `docs/changelog/sessions/`. Full brief history pre-S40 → `docs/_archive/HANDOFF-preS40-fullhistory.md`. -**Last updated:** 2026-07-01 (S95 — **Harness-17 adopt (Vòng tự-cải-thiện bộ-nhớ Đo→Tinh-chỉnh→Kiểm) — governance-only 0 prod code, em-main-led 3-workflow.** `/check-email AI_INFRA` (0 directed mới; H16 áp trọn S93) → `/adap-apply` H17 (2 broadcast hash-MATCH `reviewer_gate:PASS`). **10/10 mục 🔴:** REUSE-cite A2=§H MFE/C3=D9/CG-2=value_protect/archive=§A + **build mới** `scripts/memory-selfimprove-audit.ps1` (C1 spec-audit NO-API, **runtime-verified bắt frontend-designer over-cap thật**) + `.claude/governance/reinject-ledger.md` (B2 CG-1 N=3) + engine §I + `session-start §2.1.7`/`session-end §L.b(c)` wire + HCV alias no-seed. **3-workflow:** WF1 `wf_f085d7c4-d78` ground-truth + WF2 `wf_8e73c1d6-ee6` 3-lane PASS + WF3 `wf_6f44eddf-680` **fault-injection 13-inject teeth-proof** + integration + cross-doc (0 application-defect). **2 commit:** `18a17f5` (cicd **Run #476 PASS** prod 200×3 bundle `0T6vVJST`/`BGXEVZO6` Mig 59) + `65b434a` (docs-only CI-skip). adap-report + 2 email AI_INFRA (`54789e19`+`8c94fa34`). **Dogfood AS-10 4-fire reverted** (git-diff = net thật; **WF3 explicit-return-only STILL self-wrote → instruction-fix NOT 100%**, E-006 recurrence, guard HELD 4/4; cicd-monitor diary KEPT = legit normal-spawn). **Lessons:** fault-injection-`-RepoRoot`-temp chứng checker-teeth · Lane B #53 empty→em-main self-gate. **State: Mig 59 · 88 bảng · 434 test · gotcha 76 · menu 54 · prod 17 user/7 NCC.** **🔴 NEXT anh:** ⚠️ restart CLI (§2.1.7 + §L.b(c) H17-loop wire runtime — command `.md` no hot-reload). **🔴 NEXT em:** frontend-designer distill (WATCH strike-1 = H17 loop's live finding, chờ strike-2/anh) · monthly **2026-07-01 (hôm nay)** re-tier STATUS/HANDOFF mega-line + ef-core SKILL Mig→59 + docs/CLAUDE Budget-removed + 3 vocab-fork alias-map. **Pending product (carry):** Section B cột Dự-án · Ngưỡng CEO Mig 54 · "C" chuyển phiếu→dự án. → log `2026-07-01-S95-harness17-adopt.md`) · **Prev S94** (S94 — **anh-directive nâng cap lead 220K→380K** (canonical `memory-budget.json` · SE-override lead KHÔNG còn AI_INFRA-parity, subs giữ 60K/50K · mark H-15 v4-delta `RC-pqhuy1987-29-06-2026-23-25-50` · flush 3 echo · MFE live-read 380K) + **re-tier 2 mega-line** (fix Read-25K/call OOM): STATUS 389→89 · HANDOFF 732→12 dòng · 332KB→**34KB −90%** · ≤S90 → `docs/_archive/STATUS-HANDOFF-tier-S94-2026-06-29.md` **0 byte-loss** · detector 27=baseline · `5f61b03` pushed CI-skip. MFE eval-all baseline: LEAD 29-item/380K=0.92% · SUB ≥85% (impl-backend 94%/impl-frontend 85%/reviewer 88%). **Lesson:** trần budget ⟂ harness Read-25K/call = 2 khóa độc-lập (cap-raise KHÔNG unblock mega-line Read → cần re-tier) · mega-LINE=tooling-breaker (ưu-tiên) vs mega-FILE nhiều-dòng=token-cost · re-tier=archive-không-cắt + assert head+tail==orig. em-main solo (0 sub, 0 fan-out). **State GIỮ NGUYÊN: Mig 59 · 88 bảng · 434 test · gotcha 76 · menu 54 · bundle admin `CDn40vpV`/user `CoPmPBg7` · prod 17 user/7 NCC.** **🔴 NEXT anh:** ⚠️ restart CLI (session-start echo 380K + budget v4 runtime; số canonical đã sống ngay) · UAT eoffice node Dự án mã (carry S93). **🔴 NEXT em:** monthly **2026-07-01 (MAI!)** — ef-core SKILL Mig→59 · docs/CLAUDE Budget-removed · 3 vocab-fork alias-map · re-tier `migration-todos.md` (mega-FILE thứ-3, 807 dòng — không gấp, không vỡ tooling) · FD L1 26.1KB WATCH strike-1 (**test-specialist RESOLVED 7.8KB** — bỏ khỏi carry). **Pending product:** Section B cột Dự-án wire · Ngưỡng giá CEO Mig 54 Designer UAT · "C" chuyển phiếu→dự án chờ spec. → log `2026-06-29-S94-cap-380k-retier-megaline.md`) · **Prev S93** (S93 — **(1) PE node Dự án hiện MÃ thay tên dài (anh Kiệt FDC) prod-verified Run #473** `8ee8f3e`: BE thread ProjectCode (DTO+3 projection+search) + FE 2-app SHA-mirror (render code+tooltip+sort) NO-MIG; grep bắt site#3 thoát replace_all; test 434; bundle admin `CDn40vpV`/user `CoPmPBg7`. **(2) adopt Harness-16 MFE (memory-fidelity-EVAL) 2-workflow PASS `9580098` 0-prod-code:** WF1 `wf_4c63e1bd` (ground-truth + bắt BLOCKING vocab-fork memory-fidelity≠H6.7) + WF2 `wf_13e3d35a` 3-lane PASS (denom-29-re-derived + READ-ONLY-proof + honesty + verb-trap-defeated); `scripts/mfe-eval.ps1` deterministic NO-API (LEAD coverage-FIT 29/220K=1.5% + age-band + Goodhart 21/9 · SUB đo-thật impl-backend 94%/reviewer 88% · prose→N/A) + judge-SCAFFOLD + budget:mfe + eval/mfe/ seed + engine §H + wire-opt-in + email AI_INFRA. AS-10 dogfood (WF1 residual caught+reverted; WF2 0-residual). #53 recover-from-disk. user-MEMORY compact 23.7→7.8KB. **State: Mig 59 · 88 bảng · 434 test · gotcha 76 · menu 54 · bundle admin `CDn40vpV`/user `CoPmPBg7` · prod 17 user/7 NCC.** **🔴 NEXT anh:** ⚠️ restart CLI (MFE opt-in + wire) · UAT eoffice node Dự án mã · (anh Kiệt) nếu ô khoanh là Hạng-mục→báo em đổi work-item-code. **🔴 NEXT em:** monthly **2026-07-01 GẤP** re-tier mega-line (detector D1 OOM do bloat — STATUS 61K/HANDOFF 46K-char KHÔNG Read/Edit) + ef-core Mig→59 + Budget-removed docs + 3 vocab-fork + curate test-spec/FD L1. **Pending product:** Section B cột Dự-án · Ngưỡng giá CEO Mig 54 · "C" chuyển phiếu→dự án. → log `2026-06-29-S93-pe-projectcode-harness16-mfe.md`) · **Prev S92** (S92 — **Ẩn 5 nhóm menu (Hợp đồng + Danh mục + Nhân sự + Văn phòng số + Cá nhân) CHỈ Admin thấy trên eoffice — em-main-led, 1 commit prod-verified `1408d4e`, BE-only no-migration, HMW-mode ON**: anh `/session-start` thấy WIP S92 uncommitted (hôm nay) → chốt "verify + hoàn thiện + deploy". `RevokeTemporarilyHiddenModulesAsync` mở rộng predicate +Contracts/Ct_* +Master/Suppliers/Projects/Departments/Catalog* (cộng dồn S58 Hrm*/Off*/Personal) + TẮT 2 re-grant (S65 HRM + S69 Office) → revoke = bước permission CUỐI ungated trong SeedAdminPermissionsAsync (durable mỗi restart, gotcha #75) + InReviewScope→chỉ Pe_*. PE giữ nguyên (Pe_* không match predicate; master-data GET any-auth). +AdminOnlyModulesRevokeTests 3. Test 431→**434** (45D+389I). seed-order + predicate coverage verified · **reviewer PASS** (5 attack A-E, 15/15 trên 3 class). **FYI:** role CatalogManager (0 user hiện tại) cũng bị thu Danh mục — intended-by-spec, re-enable cần carve-out predicate. **State: Mig 59 · 88 bảng · 434 test (45D+389I) · gotcha 76 · menu 54 · bundle admin `xz8FdmLN`/user `CA8Rla2w` (JS rotate #69, CSS frozen) · prod 17 user/7 NCC.** cicd **Run #358 PASS** prod-verified (sqlcmd: non-Admin 0 leak / Admin 5 giữ / Pe_* 120 untouched; ship-proof = dll-mtime + w3wp-recycle 08:04Z). **🔴 NEXT anh:** UAT eoffice login user non-admin → xác nhận KHÔNG còn thấy Hợp đồng/Danh mục/Nhân sự/VP số/Cá nhân (chỉ Duyệt NCC + Dashboard) · ⚠️ restart CLI (carry budget v3 + `/user-mark-*` + cadence). **🔴 NEXT em:** monthly 2026-07-01 (2 ngày) — **GẤP re-tier STATUS/HANDOFF mega-line** (STATUS line-6 giờ >25K-token KHÔNG Read/Edit được, S92 phải prepend qua PowerShell) + ef-core SKILL Mig→59 + docs/CLAUDE Budget-removed + 3 vocab-fork alias-map. **Pending product (carry):** Section B cột Dự-án wire · Ngưỡng giá CEO Mig 54 Designer UAT · "C" chuyển phiếu→dự án chờ spec. → log `2026-06-29-S92-admin-only-modules.md`) · **Prev S91** (S91 — **buổi go-live LỚN em-main-led, 4 commit prod-verified + backup local** — go-live 26/06 anh Kiệt SOL-IT Phase-01 PRO+CCM. #1 `159b69d` guide Word bỏ "Từ chối" 2 chỗ + fix 12 caption Hinh→Hình [unpack→XML→repack giữ 13 ảnh]. #2 `ba42c59` wipe go-live [16 PE+16 budgets+94 notif+19 NCC demo xóa, giữ 7 NCC thật+17 user+master, PeSeq→A/001, backup+2-guard+AskUserQuestion-scope]. #3 `55494ad` gate SeedDemoMasterData chống resurrect 18 NCC demo mỗi restart [gotcha #75 root-cause, verify demo_codes=0 qua 2 restart]. #4 `e81e87f` user tự đổi mật khẩu [BE ChangePasswordCommand + POST /auth/change-password Identity-verify-pass-cũ + FE 2-app ChangePasswordDialog/TopBar + 10 test; CS0104 ValidationException ambiguous fix]. +backup local `backups/SolutionErp_golive_clean_2026-06-26.bak` 21MB + accounts.txt 17 tk. **State: Mig 59 · 88 bảng · 431 test · gotcha 76 · menu 54 · bundle admin `DgQyuG7f`/user `BmbQon23` · prod 17 user/7 NCC/0 PE-HĐ.** **🔴 NEXT anh:** ⚠️ restart CLI · review guide docx Word · đóng 2 tab eoffice em mở · UAT đổi-mật-khẩu [avatar→Đổi mật khẩu, ≥12 ký tự] + xác nhận NCC demo không sống-lại. **🔴 NEXT em:** curate test-specialist L1 OVER [carry nhiều session] · monthly 2026-07-01 [re-tier mega-line STATUS/HANDOFF bloat · ef-core SKILL Mig→59 · docs/CLAUDE Budget-removed · 3 vocab-fork alias-map]. **Pending product:** Section B cột Dự-án wire · Ngưỡng giá CEO Mig 54 Designer UAT · "C" chuyển phiếu→dự án chờ spec. **Ops:** tzutil VPS = N/A [R6 fix tầng-serialize] · 5 real-staff pw · email typo anh Chương. **Lessons S91:** wipe-không-bền-nếu-không-gate-reseed [#75] · deploy config từ .example KHÔNG file-gitignored [#76] · Chrome-MCP screenshot kẹt SPA document_idle [#74 carry]. → log `2026-06-26-S91-golive-wipe-changepw-backup.md`) · *(session ≤S90 đã tách → `docs/_archive/STATUS-HANDOFF-tier-S94-2026-06-29.md` + `docs/changelog/sessions/`; re-tier S94)* +**Last updated:** 2026-07-01 (S95 — **Harness-17 adopt (Vòng tự-cải-thiện bộ-nhớ Đo→Tinh-chỉnh→Kiểm) — governance-only 0 prod code, em-main-led 3-workflow.** `/check-email AI_INFRA` (0 directed mới; H16 áp trọn S93) → `/adap-apply` H17 (2 broadcast hash-MATCH `reviewer_gate:PASS`). **10/10 mục 🔴:** REUSE-cite A2=§H MFE/C3=D9/CG-2=value_protect/archive=§A + **build mới** `scripts/memory-selfimprove-audit.ps1` (C1 spec-audit NO-API, **runtime-verified bắt frontend-designer over-cap thật**) + `.claude/governance/reinject-ledger.md` (B2 CG-1 N=3) + engine §I + `session-start §2.1.7`/`session-end §L.b(c)` wire + HCV alias no-seed. **3-workflow:** WF1 `wf_f085d7c4-d78` ground-truth + WF2 `wf_8e73c1d6-ee6` 3-lane PASS + WF3 `wf_6f44eddf-680` **fault-injection 13-inject teeth-proof** + integration + cross-doc (0 application-defect). **2 commit:** `18a17f5` (cicd **Run #476 PASS** prod 200×3 bundle `0T6vVJST`/`BGXEVZO6` Mig 59) + `65b434a` (docs-only CI-skip). adap-report + 2 email AI_INFRA (`54789e19`+`8c94fa34`). **Dogfood AS-10 4-fire reverted** (git-diff = net thật; **WF3 explicit-return-only STILL self-wrote → instruction-fix NOT 100%**, E-006 recurrence, guard HELD 4/4; cicd-monitor diary KEPT = legit normal-spawn). **Lessons:** fault-injection-`-RepoRoot`-temp chứng checker-teeth · Lane B #53 empty→em-main self-gate. **State: Mig 59 · 88 bảng · 434 test · gotcha 76 · menu 54 · prod 17 user/7 NCC.** **🔴 NEXT anh:** ⚠️ restart CLI (§2.1.7 + §L.b(c) H17-loop wire runtime — command `.md` no hot-reload). **🔴 NEXT em:** frontend-designer distill (WATCH strike-1 = H17 loop's live finding, chờ strike-2/anh) · monthly **2026-07-01 (hôm nay)** re-tier STATUS/HANDOFF mega-line + ef-core SKILL Mig→59 + docs/CLAUDE Budget-removed + 3 vocab-fork alias-map. **Pending product (carry):** Section B cột Dự-án · Ngưỡng CEO Mig 54 · "C" chuyển phiếu→dự án. → log `2026-07-01-S95-harness17-adopt.md`) · **Prev S94** (S94 — **anh-directive nâng cap lead 220K→380K** (canonical `memory-budget.json` · SE-override lead KHÔNG còn AI_INFRA-parity, subs giữ 60K/50K · mark H-15 v4-delta `RC-pqhuy1987-29-06-2026-23-25-50` · flush 3 echo · MFE live-read 380K) + **re-tier 2 mega-line** (fix Read-25K/call OOM): STATUS 389→89 · HANDOFF 732→12 dòng · 332KB→**34KB −90%** · ≤S90 → `docs/_archive/STATUS-HANDOFF-tier-S94-2026-06-29.md` **0 byte-loss** · detector 27=baseline · `5f61b03` pushed CI-skip. MFE eval-all baseline: LEAD 29-item/380K=0.92% · SUB ≥85% (impl-backend 94%/impl-frontend 85%/reviewer 88%). **Lesson:** trần budget ⟂ harness Read-25K/call = 2 khóa độc-lập (cap-raise KHÔNG unblock mega-line Read → cần re-tier) · mega-LINE=tooling-breaker (ưu-tiên) vs mega-FILE nhiều-dòng=token-cost · re-tier=archive-không-cắt + assert head+tail==orig. em-main solo (0 sub, 0 fan-out). **State GIỮ NGUYÊN: Mig 59 · 88 bảng · 434 test · gotcha 76 · menu 54 · bundle admin `CDn40vpV`/user `CoPmPBg7` · prod 17 user/7 NCC.** **🔴 NEXT anh:** ⚠️ restart CLI (session-start echo 380K + budget v4 runtime; số canonical đã sống ngay) · UAT eoffice node Dự án mã (carry S93). **🔴 NEXT em:** monthly **2026-07-01 (MAI!)** — ef-core SKILL Mig→59 · docs/CLAUDE Budget-removed · 3 vocab-fork alias-map · re-tier `migration-todos.md` (mega-FILE thứ-3, 807 dòng — không gấp, không vỡ tooling) · FD L1 26.1KB WATCH strike-1 (**test-specialist RESOLVED 7.8KB** — bỏ khỏi carry). **Pending product:** Section B cột Dự-án wire · Ngưỡng giá CEO Mig 54 Designer UAT · "C" chuyển phiếu→dự án chờ spec. → log `2026-06-29-S94-cap-380k-retier-megaline.md`) · **Prev S93** (S93 — **(1) PE node Dự án hiện MÃ thay tên dài (anh Kiệt FDC) prod-verified Run #473** `8ee8f3e`: BE thread ProjectCode (DTO+3 projection+search) + FE 2-app SHA-mirror (render code+tooltip+sort) NO-MIG; grep bắt site#3 thoát replace_all; test 434; bundle admin `CDn40vpV`/user `CoPmPBg7`. **(2) adopt Harness-16 MFE (memory-fidelity-EVAL) 2-workflow PASS `9580098` 0-prod-code:** WF1 `wf_4c63e1bd` (ground-truth + bắt BLOCKING vocab-fork memory-fidelity≠H6.7) + WF2 `wf_13e3d35a` 3-lane PASS (denom-29-re-derived + READ-ONLY-proof + honesty + verb-trap-defeated); `scripts/mfe-eval.ps1` deterministic NO-API (LEAD coverage-FIT 29/220K=1.5% + age-band + Goodhart 21/9 · SUB đo-thật impl-backend 94%/reviewer 88% · prose→N/A) + judge-SCAFFOLD + budget:mfe + eval/mfe/ seed + engine §H + wire-opt-in + email AI_INFRA. AS-10 dogfood (WF1 residual caught+reverted; WF2 0-residual). #53 recover-from-disk. user-MEMORY compact 23.7→7.8KB. **State: Mig 59 · 88 bảng · 434 test · gotcha 76 · menu 54 · bundle admin `CDn40vpV`/user `CoPmPBg7` · prod 17 user/7 NCC.** **🔴 NEXT anh:** ⚠️ restart CLI (MFE opt-in + wire) · UAT eoffice node Dự án mã · (anh Kiệt) nếu ô khoanh là Hạng-mục→báo em đổi work-item-code. **🔴 NEXT em:** monthly **2026-07-01 GẤP** re-tier mega-line (detector D1 OOM do bloat — STATUS 61K/HANDOFF 46K-char KHÔNG Read/Edit) + ef-core Mig→59 + Budget-removed docs + 3 vocab-fork + curate test-spec/FD L1. **Pending product:** Section B cột Dự-án · Ngưỡng giá CEO Mig 54 · "C" chuyển phiếu→dự án. → log `2026-06-29-S93-pe-projectcode-harness16-mfe.md`) · *(session ≤S90 đã tách → `docs/_archive/STATUS-HANDOFF-tier-S94-2026-06-29.md` + `docs/changelog/sessions/`; re-tier S94)* --- diff --git a/docs/STATUS.md b/docs/STATUS.md index a8261af..7b3dad4 100644 --- a/docs/STATUS.md +++ b/docs/STATUS.md @@ -3,7 +3,7 @@ > **Update rule:** trước khi bắt đầu 1 task → ghi row `🔥 In Progress`. Xong → `✅ Recently Done`. > **Tiering rule (S40):** chỉ giữ **state hiện tại + 3 session gần nhất** ở file này. Session cũ hơn → `docs/changelog/sessions/`. Full history pre-S40 → `docs/_archive/STATUS-preS40-fullhistory.md`. (Tránh over-context — xóa double, không cắt nội dung.) -**Last updated:** 2026-07-01 (S95 — **Harness-17 adopt (Vòng tự-cải-thiện bộ-nhớ Đo→Tinh-chỉnh→Kiểm) — governance-only 0 prod code, em-main-led + 3-workflow fan-out (HMW-mode ON).** `/check-email AI_INFRA` (0 directed mới; H16 đã áp trọn S93) → `/adap-apply` H17 (2 broadcast hash-MATCH · `reviewer_gate:PASS`). **10/10 mục 🔴 sàn ĐẠT:** REUSE-cite A2=§H MFE/C3=D9/CG-2=value_protect/archive=§A; **build mới** `scripts/memory-selfimprove-audit.ps1` (C1 spec-audit NO-API exit-0, **runtime-verified bắt frontend-designer over-cap GAP thật**) + `.claude/governance/reinject-ledger.md` (B2 CG-1 N=3, tách khỏi budget.json) + engine **§I** codify + `session-start §2.1.7`/`session-end §L.b(c)` wire + HCV alias no-seed (coverage 3-nghĩa, detector vẫn 27). **3-workflow (run-id bằng-chứng):** WF1 `wf_f085d7c4-d78` ground-truth + WF2 `wf_8e73c1d6-ee6` 3-lane review PASS 0-blocking + WF3 `wf_6f44eddf-680` deep-reverify (**fault-injection 13-inject chứng-răng-thật** + integration + cross-doc, 0 application-defect). **2 commit:** `18a17f5` (adopt — cicd **Run #476 PASS** prod 200×3, bundle rotate admin `0T6vVJST`/user `BGXEVZO6`, Mig 59 unchanged) + `65b434a` (deep-reverify docs-only CI-skip). **adap-report + 2 email AI_INFRA** (hash `54789e19` adopt + `8c94fa34` deep-reverify-update). **Dogfood C3 4-fire:** AS-10 WF1+WF3 self-write reverted (git-diff net = backstop THẬT; **instruction-fix NOT 100%** — WF3 explicit-return-only STILL self-wrote → E-006 recurrence S95, guard HELD 4/4, 0 escape; cicd-monitor diary KEPT = normal-spawn legit). **Lessons:** fault-injection-via-`-RepoRoot`-temp chứng checker-teeth (không chỉ happy-path PASS) · Lane B #53 empty-return → em-main self-gate recover · workflow-agent persona-write stochastic → git-diff mandatory. **State GIỮ NGUYÊN: Mig 59 · 88 bảng · 434 test · gotcha 76 · menu 54 · prod 17 user/7 NCC.** **NEXT em:** frontend-designer distill (WATCH strike-1 = H17 loop's live finding) · monthly re-tier mega-line + ef-core SKILL Mig→59 + 3 vocab-fork (2026-07-01 due). → log `2026-07-01-S95-harness17-adopt.md`) · **Prev S94** (S94 — **(1) anh-directive nâng cap lead 220K→380K** (`memory-budget.json` canonical · SE-override lead KHÔNG còn AI_INFRA-parity, subs giữ 60K/50K · mark H-15 **v4-delta** `RC-pqhuy1987-29-06-2026-23-25-50` · flush 3 derived echo ACTIVE-MARKS/session-start §2.1.6/engine §G adopt-delta · MFE verified live-read 380K). **(2) re-tier 2 mega-line** (fix Read-25K/call OOM + token-cost ~169K/220K): STATUS 389→89 dòng (mega-line 59.6K→7.1K char) · HANDOFF 732→12 dòng · live 332KB→**34KB (−90%)** · session ≤S90 → `docs/_archive/STATUS-HANDOFF-tier-S94-2026-06-29.md` **0 byte-loss** (new+archive=orig+995B pointer) · backup git+scratchpad · detector 27=baseline 0-broken-pointer · conservation spot-check PASS. **(3) MFE eval-all baseline** (đầu phiên): LEAD coverage-FIT 29-item/**380K=0.92%** · age-band 0-cut · Goodhart strikes-21/RCA-9 flat=no-lie · SUB per-role ≥85% (cicd/test-spec/FD 100% · impl-backend 94% · impl-frontend 85% · 3 prose-role N/A) · judge-scaffold-only honest. **(4) nạp full Phase-1 read-set** (budget 380K cho phép): +PROJECT-MAP +workflow-contract +migration-todos. **commit `5f61b03` pushed** docs-only CI-skip. **Lesson:** trần budget ⟂ harness **Read-25K/call** = 2 khóa ĐỘC-LẬP — cap-raise KHÔNG unblock mega-line Read (cần re-tier); **mega-LINE = tooling-breaker** (ưu-tiên) vs **mega-FILE nhiều-dòng = chỉ token-cost**; re-tier = **archive-không-cắt + assert head+tail==orig 0-loss**. em-main solo (governance single-writer, 0 sub, 0 fan-out). **State GIỮ NGUYÊN: Mig 59 · 88 bảng · 434 test · gotcha 76 · menu 54 · bundle admin `CDn40vpV`/user `CoPmPBg7` · prod 17 user/7 NCC.** → log `2026-06-29-S94-cap-380k-retier-megaline.md`) · **Prev S93** (S93 — **(1) PE cây Duyệt NCC node Dự án hiện MÃ dự án thay tên dài (anh Kiệt FDC) prod-verified Run #473** `8ee8f3e`: BE thread ProjectCode (DTO + 3 projection List/Inbox/ListApproved + search) + FE 2-app SHA-mirror (render `projectCode||projectName`+tooltip+sort) NO-MIG; grep bắt construction-site#3 thoát replace_all (cardinality-grep-all-consumer); build 3× + test 434; bundle admin `xz8FdmLN`→`CDn40vpV`/user `CA8Rla2w`→`CoPmPBg7`. **(2) adopt Harness-16 MFE (memory-fidelity-EVAL) 2-workflow PASS, 0 production code** `9580098`: WF1 `wf_4c63e1bd` (ground-truth + bắt BLOCKING vocab-fork: memory-fidelity = H6.7 memoryDelta-routing ≠ H16 coverage-eval → đặt MFE + alias-map §H KHÔNG seed $aliasSets) + WF2 `wf_13e3d35a` 3-lane PASS (code-gate denom-29-re-derived to-the-digit + READ-ONLY-budget proof 1-write-op + honesty 5-floor + leading-verb-trap adversarial-probed-DEFEATED); `scripts/mfe-eval.ps1` deterministic NO-API ASCII#30 (LEAD coverage-FIT 29-item/220K=1.5% + age-band-flag-not-cut + Goodhart strikes-21/RCA-9 · SUB per-role ĐO-THẬT impl-backend 94%/impl-frontend 85%/reviewer 88% · prose-role→N/A KHÔNG 0%) + judge-SCAFFOLD-only (honest: số chưa-nghĩa tới khi age-mature+independent-judge) + budget:mfe config + eval/mfe/ seed-12-stable-id + engine §H + artifact-row + C3-comment + wire session-start §2.1.6/session-end §L.b(c) opt-in + agents/README S93 + adap-report ×2 + email AI_INFRA hash `da768330`. **AS-10 2nd-fire dogfood:** WF1 3-agent (return-only) residual agent-memory caught+reverted (E-006 recurrence, guard HELD); WF2 explicit-return-only-prompt → 0 residual (instruction-fix). **#53 recover-from-disk** (WF1 sub return-rỗng nhưng ghi diary trước). user-MEMORY compact 23.7→7.8KB (hook). **Lessons:** cardinality-change-grep-all-consumer · vocab-collision-check-on-adopt (2-workflow review bắt, 1-workflow trượt) · AS-10-instruction-fix (prompt override frontmatter + git-diff net) · MFE đóng-vòng detector-D1-OOM-đầu-phiên. **State THẬT: Mig 59 · 88 bảng · 434 test (45D+389I) · gotcha 76 · menu 54 · bundle admin `CDn40vpV`/user `CoPmPBg7` · prod 17 user/7 NCC.** **🔴 NEXT anh:** restart CLI (MFE opt-in + wire session-start/end + agents/README no hot-reload) · UAT eoffice node Dự án hiện mã. **NEXT em:** monthly **2026-07-01 (2 ngày) GẤP** re-tier STATUS/HANDOFF mega-line (detector D1 **OOM do bloat** = tooling vỡ, STATUS line 61K-char/HANDOFF 46K-char KHÔNG Read/Edit) + ef-core SKILL Mig→59 + docs/CLAUDE Budget-removed + 3 vocab-fork alias-map + curate test-specialist/FD L1 WATCH. **Pending product:** Section B cột Dự-án wire · Ngưỡng giá CEO Mig 54 Designer UAT · "C" chuyển phiếu→dự án chờ spec. → log `2026-06-29-S93-pe-projectcode-harness16-mfe.md`) · **Prev S92** (S92 — **Ẩn 5 nhóm menu (Hợp đồng + Danh mục + Nhân sự + Văn phòng số + Cá nhân) CHỈ Admin thấy trên eoffice — em-main-led verify+review+deploy, 1 commit prod-verified `1408d4e`, BE-only no-migration, HMW-mode ON**: anh `/session-start` thấy WIP S92 uncommitted (dated hôm nay) → AskUserQuestion chốt "verify + hoàn thiện + deploy". `RevokeTemporarilyHiddenModulesAsync` mở rộng predicate +Contracts/Ct_* +Master/Suppliers/Projects/Departments/Catalog* (cộng dồn S58 Hrm*/Off*/Personal) + TẮT 2 re-grant public (S65 HRM + S69 Office) → revoke = bước permission CUỐI trong SeedAdminPermissionsAsync (ungated, durable mỗi restart, gotcha #75) + thu hẹp InReviewScope→chỉ Pe_*. **PE giữ nguyên** cho user (Pe_* không match predicate; master-data GET any-auth → form PE vẫn chọn Dự án/NCC/Hạng mục dù menu Danh mục ẩn). +AdminOnlyModulesRevokeTests 3 (non-Admin revoked 4 cờ / Admin untouched / PE preserved). **Verify chain:** test 431→**434** (45D+389I, full-suite 0 fail) · seed-chain-order verified (revoke last + prod-durable) · predicate coverage verified (5 nhóm đủ; Forms/Reports/PurchaseEvaluations sibling top-level giữ-hiện đúng; no over-match) · **reviewer PASS** (5 attack vector A-E independ re-derive, 15/15 trên 3 class, 0 blocking). **FYI intended-by-spec, 0 live impact:** role CatalogManager (hiện **0 user** — S89 xóa hết test user) cũng bị thu Danh mục; re-enable cần carve-out predicate. **State THẬT: Mig 59 · 88 bảng · 434 test (45D+389I) · gotcha 76 · menu 54 · bundle admin `xz8FdmLN`/user `CA8Rla2w` (JS rotate #69, CSS frozen) · prod 17 user/7 NCC.** cicd **Run #358 PASS** prod-verified (sqlcmd: non-Admin 0 leak / Admin 5 giữ / Pe_* 120 untouched; ship-proof = dll-mtime + w3wp-recycle 08:04Z). **🔴 NEXT anh:** UAT eoffice login user non-admin → xác nhận KHÔNG còn thấy Hợp đồng/Danh mục/Nhân sự/VP số/Cá nhân (chỉ Duyệt NCC + Dashboard) · ⚠️ restart CLI (carry budget v3 + `/user-mark-*` + cadence). **NEXT em:** monthly audit 2026-07-01 (2 ngày) re-tier STATUS/HANDOFF mega-line + flush ef-core/Budget docs + vocab alias-map. → log `2026-06-29-S92-admin-only-modules.md`) · **Prev S91** (S91 — **buổi go-live LỚN em-main-led, 4 commit prod-verified + backup local** — go-live chính thức 26/06 anh Kiệt SOL-IT Phase-01 PRO+CCM. **#1 `159b69d`** guide Word bỏ "Từ chối" 2 chỗ + fix 12 caption Hinh→Hình [app gỡ Từ chối S60, guide đã phát công ty stale; unpack→XML→repack giữ 13 ảnh, verify python-docx]. **#2 `ba42c59`** wipe go-live `scripts/s91-wipe-golive.sql`: xóa 16 PE+16 PeWorkItemBudgets+94 notif+19 NCC demo, GIỮ 7 NCC thật+17 user+master, reset PeSeq→**A/001** [backup `SolutionErp_S91_pregolivewipe.bak` + 2 guard PE>16-abort/NCC≠19-rollback + AskUserQuestion scope]. **#3 `55494ad`** gate SeedDemoMasterData sau DemoSeed:Disabled — root-cause: seed ungated per-code resurrect 18 NCC demo mỗi restart → prod skip → verify demo_codes=0 qua 2 restart [gotcha #75]. **#4 `e81e87f`** user tự đổi mật khẩu: BE ChangePasswordCommand + POST /auth/change-password [Identity verify pass-cũ, fail-PasswordMismatch→field CurrentPassword] + FE 2-app ChangePasswordDialog/TopBar + 10 test; fix CS0104 ValidationException ambiguous [FluentValidation vs custom]. + **backup local** `backups/SolutionErp_golive_clean_2026-06-26.bak` 21MB + accounts.txt 17 tk [.gitignore +backups/+*.bak]. **State THẬT: Mig 59 · 88 bảng · 431 test [45D+386I, +10 ChangePassword] · gotcha 76 [+#75 seed-resurrect +#76 deploy-config-từ-.example] · menu 54 · bundle admin `DgQyuG7f`/user `BmbQon23` · prod 17 user/7 NCC/70 dự án/71 hạng mục/0 PE-HĐ.** **Lessons:** wipe-không-bền-nếu-không-gate-reseed [#75 root>symptom] · deploy render Production.json từ .example KHÔNG file-gitignored [#76] · em-main-led security-feature báo-trước + test-specialist + build/test gate thay fan-out [#53 cicd garbled-return→em-main self-verify-prod; test-specialist độc-lập bắt CÙNG CS0104] · Chrome-MCP screenshot kẹt SPA-SignalR document_idle [carry #74, guide-ảnh defer — anh "tự check"]. **🔴 NEXT anh:** ⚠️ restart CLI · review guide docx Word · đóng 2 tab eoffice em mở. **NEXT em:** curate test-specialist L1 OVER [carry] · monthly 2026-07-01 [re-tier mega-line + ef-core Mig→59 + Budget-removed docs/CLAUDE]. → log `2026-06-26-S91-golive-wipe-changepw-backup.md`) · *(session ≤S90 đã tách → `docs/_archive/STATUS-HANDOFF-tier-S94-2026-06-29.md` + `docs/changelog/sessions/`; re-tier S94)* +**Last updated:** 2026-07-01 (S95 — **Harness-17 adopt (Vòng tự-cải-thiện bộ-nhớ Đo→Tinh-chỉnh→Kiểm) — governance-only 0 prod code, em-main-led + 3-workflow fan-out (HMW-mode ON).** `/check-email AI_INFRA` (0 directed mới; H16 đã áp trọn S93) → `/adap-apply` H17 (2 broadcast hash-MATCH · `reviewer_gate:PASS`). **10/10 mục 🔴 sàn ĐẠT:** REUSE-cite A2=§H MFE/C3=D9/CG-2=value_protect/archive=§A; **build mới** `scripts/memory-selfimprove-audit.ps1` (C1 spec-audit NO-API exit-0, **runtime-verified bắt frontend-designer over-cap GAP thật**) + `.claude/governance/reinject-ledger.md` (B2 CG-1 N=3, tách khỏi budget.json) + engine **§I** codify + `session-start §2.1.7`/`session-end §L.b(c)` wire + HCV alias no-seed (coverage 3-nghĩa, detector vẫn 27). **3-workflow (run-id bằng-chứng):** WF1 `wf_f085d7c4-d78` ground-truth + WF2 `wf_8e73c1d6-ee6` 3-lane review PASS 0-blocking + WF3 `wf_6f44eddf-680` deep-reverify (**fault-injection 13-inject chứng-răng-thật** + integration + cross-doc, 0 application-defect). **2 commit:** `18a17f5` (adopt — cicd **Run #476 PASS** prod 200×3, bundle rotate admin `0T6vVJST`/user `BGXEVZO6`, Mig 59 unchanged) + `65b434a` (deep-reverify docs-only CI-skip). **adap-report + 2 email AI_INFRA** (hash `54789e19` adopt + `8c94fa34` deep-reverify-update). **Dogfood C3 4-fire:** AS-10 WF1+WF3 self-write reverted (git-diff net = backstop THẬT; **instruction-fix NOT 100%** — WF3 explicit-return-only STILL self-wrote → E-006 recurrence S95, guard HELD 4/4, 0 escape; cicd-monitor diary KEPT = normal-spawn legit). **Lessons:** fault-injection-via-`-RepoRoot`-temp chứng checker-teeth (không chỉ happy-path PASS) · Lane B #53 empty-return → em-main self-gate recover · workflow-agent persona-write stochastic → git-diff mandatory. **State GIỮ NGUYÊN: Mig 59 · 88 bảng · 434 test · gotcha 76 · menu 54 · prod 17 user/7 NCC.** **NEXT em:** frontend-designer distill (WATCH strike-1 = H17 loop's live finding) · monthly re-tier mega-line + ef-core SKILL Mig→59 + 3 vocab-fork (2026-07-01 due). → log `2026-07-01-S95-harness17-adopt.md`) · **Prev S94** (S94 — **(1) anh-directive nâng cap lead 220K→380K** (`memory-budget.json` canonical · SE-override lead KHÔNG còn AI_INFRA-parity, subs giữ 60K/50K · mark H-15 **v4-delta** `RC-pqhuy1987-29-06-2026-23-25-50` · flush 3 derived echo ACTIVE-MARKS/session-start §2.1.6/engine §G adopt-delta · MFE verified live-read 380K). **(2) re-tier 2 mega-line** (fix Read-25K/call OOM + token-cost ~169K/220K): STATUS 389→89 dòng (mega-line 59.6K→7.1K char) · HANDOFF 732→12 dòng · live 332KB→**34KB (−90%)** · session ≤S90 → `docs/_archive/STATUS-HANDOFF-tier-S94-2026-06-29.md` **0 byte-loss** (new+archive=orig+995B pointer) · backup git+scratchpad · detector 27=baseline 0-broken-pointer · conservation spot-check PASS. **(3) MFE eval-all baseline** (đầu phiên): LEAD coverage-FIT 29-item/**380K=0.92%** · age-band 0-cut · Goodhart strikes-21/RCA-9 flat=no-lie · SUB per-role ≥85% (cicd/test-spec/FD 100% · impl-backend 94% · impl-frontend 85% · 3 prose-role N/A) · judge-scaffold-only honest. **(4) nạp full Phase-1 read-set** (budget 380K cho phép): +PROJECT-MAP +workflow-contract +migration-todos. **commit `5f61b03` pushed** docs-only CI-skip. **Lesson:** trần budget ⟂ harness **Read-25K/call** = 2 khóa ĐỘC-LẬP — cap-raise KHÔNG unblock mega-line Read (cần re-tier); **mega-LINE = tooling-breaker** (ưu-tiên) vs **mega-FILE nhiều-dòng = chỉ token-cost**; re-tier = **archive-không-cắt + assert head+tail==orig 0-loss**. em-main solo (governance single-writer, 0 sub, 0 fan-out). **State GIỮ NGUYÊN: Mig 59 · 88 bảng · 434 test · gotcha 76 · menu 54 · bundle admin `CDn40vpV`/user `CoPmPBg7` · prod 17 user/7 NCC.** → log `2026-06-29-S94-cap-380k-retier-megaline.md`) · **Prev S93** (S93 — **(1) PE cây Duyệt NCC node Dự án hiện MÃ dự án thay tên dài (anh Kiệt FDC) prod-verified Run #473** `8ee8f3e`: BE thread ProjectCode (DTO + 3 projection List/Inbox/ListApproved + search) + FE 2-app SHA-mirror (render `projectCode||projectName`+tooltip+sort) NO-MIG; grep bắt construction-site#3 thoát replace_all (cardinality-grep-all-consumer); build 3× + test 434; bundle admin `xz8FdmLN`→`CDn40vpV`/user `CA8Rla2w`→`CoPmPBg7`. **(2) adopt Harness-16 MFE (memory-fidelity-EVAL) 2-workflow PASS, 0 production code** `9580098`: WF1 `wf_4c63e1bd` (ground-truth + bắt BLOCKING vocab-fork: memory-fidelity = H6.7 memoryDelta-routing ≠ H16 coverage-eval → đặt MFE + alias-map §H KHÔNG seed $aliasSets) + WF2 `wf_13e3d35a` 3-lane PASS (code-gate denom-29-re-derived to-the-digit + READ-ONLY-budget proof 1-write-op + honesty 5-floor + leading-verb-trap adversarial-probed-DEFEATED); `scripts/mfe-eval.ps1` deterministic NO-API ASCII#30 (LEAD coverage-FIT 29-item/220K=1.5% + age-band-flag-not-cut + Goodhart strikes-21/RCA-9 · SUB per-role ĐO-THẬT impl-backend 94%/impl-frontend 85%/reviewer 88% · prose-role→N/A KHÔNG 0%) + judge-SCAFFOLD-only (honest: số chưa-nghĩa tới khi age-mature+independent-judge) + budget:mfe config + eval/mfe/ seed-12-stable-id + engine §H + artifact-row + C3-comment + wire session-start §2.1.6/session-end §L.b(c) opt-in + agents/README S93 + adap-report ×2 + email AI_INFRA hash `da768330`. **AS-10 2nd-fire dogfood:** WF1 3-agent (return-only) residual agent-memory caught+reverted (E-006 recurrence, guard HELD); WF2 explicit-return-only-prompt → 0 residual (instruction-fix). **#53 recover-from-disk** (WF1 sub return-rỗng nhưng ghi diary trước). user-MEMORY compact 23.7→7.8KB (hook). **Lessons:** cardinality-change-grep-all-consumer · vocab-collision-check-on-adopt (2-workflow review bắt, 1-workflow trượt) · AS-10-instruction-fix (prompt override frontmatter + git-diff net) · MFE đóng-vòng detector-D1-OOM-đầu-phiên. **State THẬT: Mig 59 · 88 bảng · 434 test (45D+389I) · gotcha 76 · menu 54 · bundle admin `CDn40vpV`/user `CoPmPBg7` · prod 17 user/7 NCC.** **🔴 NEXT anh:** restart CLI (MFE opt-in + wire session-start/end + agents/README no hot-reload) · UAT eoffice node Dự án hiện mã. **NEXT em:** monthly **2026-07-01 (2 ngày) GẤP** re-tier STATUS/HANDOFF mega-line (detector D1 **OOM do bloat** = tooling vỡ, STATUS line 61K-char/HANDOFF 46K-char KHÔNG Read/Edit) + ef-core SKILL Mig→59 + docs/CLAUDE Budget-removed + 3 vocab-fork alias-map + curate test-specialist/FD L1 WATCH. **Pending product:** Section B cột Dự-án wire · Ngưỡng giá CEO Mig 54 Designer UAT · "C" chuyển phiếu→dự án chờ spec. → log `2026-06-29-S93-pe-projectcode-harness16-mfe.md`) · *(session ≤S90 đã tách → `docs/_archive/STATUS-HANDOFF-tier-S94-2026-06-29.md` + `docs/changelog/sessions/`; re-tier S94)* --- @@ -71,6 +71,7 @@ - ⚠️ **Credentials trong chat** — rotate trước go-live thật - ⚠️ **SQL backup chưa auto** — risk data loss (script ready, chờ register) - ⚠️ **UAT real user chưa chạy** — risk edge-case bug +- ⏳ **UAT-confirm chờ anh sign-off (carry S91/S92, hoist khi re-tier S96):** (1) eoffice non-admin ẩn 5 nhóm menu [S92 · Run #358 sqlcmd 0-leak] · (2) đổi mật khẩu self-service [S91 · +10 test] · (3) NCC demo không sống-lại sau restart [S91 · #75 gate verified 2 restart] — cả 3 code/prod-verified server-side, chỉ chờ anh xác nhận UAT (blurb đầy đủ S91/S92 → `docs/_archive/STATUS-HANDOFF-tier-S94-2026-06-29.md`). - ⚠️ **Cert** `api.solutions.com.vn` expire ~2026-07-23 (auto-renew ~06-23) --- diff --git a/docs/_archive/STATUS-HANDOFF-tier-S94-2026-06-29.md b/docs/_archive/STATUS-HANDOFF-tier-S94-2026-06-29.md index a97eb00..c028be8 100644 --- a/docs/_archive/STATUS-HANDOFF-tier-S94-2026-06-29.md +++ b/docs/_archive/STATUS-HANDOFF-tier-S94-2026-06-29.md @@ -5,14 +5,14 @@ --- ## STATUS — cắt từ `docs\STATUS.md` line 6 (từ **Prev S90** trở đi) - · **Prev S90** (S90 — **Chèn 12 ảnh khoanh-đỏ vào guide Word `docs/Huong-dan-Duyet-NCC.docx` (em tự chụp prod qua Chrome) + chẩn UltraViewer — em-main solo, 0 production code, HMW-mode ON**: anh `/session-start` → "mở chrome vào chụp ảnh dán vào luôn" (12 ô ảnh trống từ S89). Browser-driving = vòng-lặp thị-giác tuần-tự → **em-main solo** (KHÔNG fan-out Workflow, đúng decision-tree). **Pipeline tự-chế (gotcha #74 NEW):** MCP `save_to_disk` (Chrome MCP + computer-use) KHÔNG ra file truy-cập được env này → **PowerShell .NET `CopyFromScreen` + Win32 `EnumWindows`+lọc-process-`chrome.exe`+`SetForegroundWindow`** (lọc process vì app Claude-Code Electron cùng class+title "Solutions ERP" → khớp nhầm) chụp PNG 2560×1600 + **DOM overlay `window.__ccA`** khoanh-đỏ **element-based** (minLeft/maxLeft/exact/up/nth/**case-insensitive** — toạ-độ-cứng vỡ do viewport đổi 812↔833; label CSS-uppercase→case-insensitive) + crop 92/72 (banner CDP "Claude started debugging" s08/s12→146, verify montage dải-trên) + `python-docx add_picture(6.0")` fit-A4 (6.3" tràn vì A4 content=6.27") vào 12 table cell + caption "Hình N". 12 màn: login·menu+tạo·form-fields·NCC+báo-giá·NS+QT·checklist+gửi·inbox·detail+so-sánh·quyết-định·workflow-matrix+cờ-finalize·tạo-HĐ·cây-list. Verify **13 ảnh** (1 logo+12) + montage sạch-banner. **0 prod mutation** (xem-only, KHÔNG bấm Gửi/Duyệt/Trả-lại/Tạo-HĐ; `?mode=new` không tạo draft). anh tự login Admin. **Caveats guide (carry):** ① #9 app chỉ **Duyệt+Trả-lại** (gỡ "Từ chối" S60 → text guide stale, chờ anh OK sửa) · ② #10 workflow chưa bật finalize → chụp **cờ "Duyệt là KẾT THÚC quy trình"** thay badge sơ-đồ · ③ #11 KHÔNG bấm Tạo-HĐ (no created-contract shot) · ④ account=admin (sidebar nhiều menu admin). **UltraViewer (anh hỏi "sao bật"):** chẩn `UltraViewService` StartMode=**Auto**/LocalSystem standby, **0 kết-nối Established**, em KHÔNG mở (chỉ grant Chrome; computer-use screenshot **detect+mask** nó) → hướng-dẫn tắt self-serve (KHÔNG tự đổi system-setting, theo prohibited-rule). **State GIỮ NGUYÊN: Mig 59 · 88 bảng · 422 test · gotcha 74 (+#74) · menu 54 · bundle admin `DalcOhvb`/user `CdS4tX_2`.** docx committed closeout (docs-only CI-skip). **🔴 NEXT anh:** review docx trong Word + ⚠️ restart CLI (carry budget v3 + `/user-mark-*` + cadence) + (tùy) bật finalize 1 cấp → ảnh #10 badge / bấm tạo 1 HĐ thử → ảnh #11. **NEXT em:** sửa text "Từ chối"→"Duyệt/Trả lại" guide nếu anh OK · curate test-specialist L1 34.8KB OVER (carry S88). → log `2026-06-25-S90-guide-screenshots-insert.md`.) · **Prev S89** (S89 — **PE visibility/finalize batch + xóa 38 User test prod + Word guide, ~6 commit prod-verified, HMW-mode ON**: **D1 nháp riêng-tư** (`a71753b` Run #465, test 419→421) — IDOR fix nháp lộ qua cond#2 role (GetEligiblePhases Drafter/DeptManager→DangSoanThao) + **cond#3 V2-approver** (workflow pin lúc-TẠO → CEO approver thấy MỌI nháp = leak màn CEO) → 4 chỗ owner-only (GetEligiblePhases bỏ DangSoanThao · admin-inbox bỏ · list-cond3 guard · detail-authz guard) + PeDraftVisibilityTests · **D2 CCM giá-đề-xuất** (`f7bd97a`) gỡ `!readOnly` over-gate (gate thuần role mirror ô ngân-sách; BE setter fail-closed = chốt) · **D3 finalize-note 3-surface** (`f0bca77` test 421→422) BE +3 computed-field detail+list DTO **no-migration** + EF-subquery first-reachable + PeFinalizeChip 2-app (invest-WF `wf_341f7b29` + impl-WF `wf_3f57edb6`; **impl-FE return-rỗng #53** → em-main mirror fe-admin 4-file SHA + self-gate + PeFinalizeProjectionTests) + **flow badge "⚑ Duyệt thay CEO"** PeWorkflowPanel (`9c920ad`) + **matrix flag thứ-8** WorkflowMatrixViewPage thiếu allowApproverFinalize từ S87 (`fef4c33`) · **xóa User test** (`681b1ed`) recon prod (ssh sqlcmd) 55→giữ 17/xóa 38 (whitelist-keep + backup `SolutionErp_S89_preuserdelete.bak` + count-guard[30,45] + XACT_ABORT; KHÔNG approver-block FK; nv.test 1-PE) + gỡ seed SeedDemoUsers/Lock · **Word guide** `docs/Huong-dan-Duyet-NCC.docx` (skill docx, logo Solution, 8 phần, khoanh-đỏ 1→2→3, ảnh-chờ-chụp). **State THẬT: Mig 59 · 88 bảng · 422 test (45D+377I) · gotcha 73 · menu 54 · bundle admin `DalcOhvb`/user `CdS4tX_2` · prod 17 user thật.** **Lessons:** Designer-save = version-MỚI (phiếu pin version-cũ → finalize chỉ hiện phiếu-MỚI = "check rồi mà không thấy") · doc-drift thêm-flag-Designer-quên-surface-matrix-song-song · whitelist-keep + 3-lớp-guard prod-delete · WF-impl-FE-return-rỗng → em-main mirror + self-gate (≡ S65/S73). 🔴 NEXT em: curate test-specialist L1 34.8KB OVER + cicd 28KB + reviewer 27.7KB. NEXT anh: chèn 12 ảnh guide + restart CLI. → log `2026-06-25-S89-pe-visibility-finalize-userclean-guide.md`.) · **Prev S88** (S88 — **PE stability audit (frozen CEO-approved spec) → fix patchwork D1 + hoàn-thiện multi-winner D2, 2 deploy prod-verified, HMW-mode ON, audit-workflow + ~14 spawn**: anh giao review/invest/test lại Duyệt NCC, "chấp vá thì xử lý, tính năng đã ổn định". **Audit Workflow `wf_c15da996-be5`** (6 area × invest→review pipeline + full-suite test, 13 agent) → CORE SOLID (winnerQuoteTotal 3 site · SelectWinner clear · urgent fail-closed authz · drafter-exclusion notify · 2 finalize mechanism) + tách findings **safe vs behavior-affecting**. AskUserQuestion ×4 chốt max-scope: sửa-hết-safe + hoàn-thiện-joint-winner + bật-CEO-notify + create-contract = **1 HĐ/winner**. **D1 (`73cce1f` Run #347 PASS):** Block B financials re-key `SelectedSupplierId→IsWinner` (số "Giá trị kỳ này"=0 + peer-rollup bỏ-sót cho ≥2 winner) · **CEO-notify-on-urgent +SaveChanges** (notify chạy SAU SaveChanges duy-nhất → rớt âm-thầm, Director KHÔNG nhận; +6 `PeUrgentNotifyDirectorTests` real-notify-fixture) · **HoSoLink null-safe + clear-via-empty** (sửa header wipe link đã-set, bug-class S42/#73; null=preserve/""=clear; HoSoLinkRow gửi `""`) · #70 guard PRO budget row3/row8 · dời `SetPeCcmBudgetPeriod` PeSuggestedPrice→PeWorkItemBudgetFeatures · comment. Test 402→**413** (+11). **D2 (`1aa3bdb` Run success):** **create-contract 1→N** (Command→`List`; **ContractCodeGenerator self-commit seq mỗi call → gen TẤT-CẢ mã TRƯỚC Add → build N local → atomic final SaveChanges** = no partial-create; GiaTri single=details-sum legacy/≥2=per-winner quote-total draft-editable anh-Kiệt-UAT; pe.ContractId=first idempotency; controller `{contractIds}`) · **list-card winner names** (DTO +`WinnerSupplierNames` EF collection-subquery **translate-OK SQLite** verified) · FE dialog contractIds[]+"Đã tạo N HĐ" · PeListPanel join names. Test 413→**419** (+6: multi-contract 5 + EF-translate smoke). **State THẬT: Mig 59 · 88 bảng · 419 test (45D+374I) · gotcha 73 · menu 54 · bundle admin `BQq2eTP6`/user `dHa64I59`.** **Cách chạy:** em-main-led BE core (financial/coupled/design-heavy = create-contract multi + financials) + delegate impl-backend (relocate) ∥ impl-frontend (FE 2-app SHA-mirror) ∥ test-specialist (test-before bug + test-after feature) + reviewer adversarial **PASS** (codegen-sequencing + arg-order + no-partial-create verified) + cicd-monitor. **#53 truncation ×3** (test-specialist/reviewer/cicd-monitor return rớt ở MEMORY-over-budget step → em-main recover-disk + self-gate + **curl-self-verify deploy** thay cicd-verdict). **Lessons:** ContractCodeGenerator self-commit-seq → multi-entity create = gen-all-codes-TRƯỚC-Add → atomic SaveChanges (no partial) [[feedback_multi_entity_create_self_committing_codegen]] · cardinality single→multi grep MỌI consumer (audit bắt 2 BE financial read-site sót S87 FE-only sweep) [[feedback_cardinality_change_grep_consumers]]. **🔴 NEXT (em): curate test-specialist L1 34.8KB OVER-SOFT GẤP** (root #53 ×3; reviewer 27.1KB+FD 26.1KB WATCH). **NEXT UAT (anh Kiệt Ctrl+F5):** ① ≥2-winner Block B "Giá trị kỳ này" đúng số · ② GẤP→Director nhận chuông · ③ Link hồ sơ giữ khi sửa header · ④ ≥2-winner "Tạo HĐ" → N HĐ draft (xác nhận GiaTri per-winner=giá NCC chào). → log `2026-06-25-S88-pe-stability-audit-d1-d2.md`.) · **Prev S87** (S87 — **2 buổi PE feature LỚN prod-verified, HMW-mode ON, ~14 spawn (nhiều #53 truncate → recover-disk + reviewer cross-verify + em-main self-gate)**: **(1) CCM 3-fix Mig 58** (`f1b10e9` **Run #344 PASS** ~5m11s) — anh forward PDF "CCM 4 ý cần sửa PM" (BỎ mục 3 theo anh): **①multi-winner** chọn NHIỀU NTP/NCC/ĐVDV cùng trúng → `winnerQuoteTotal=SUM PurchaseEvaluationSupplier.IsWinner` (cột mới, backfill từ SelectedSupplierId 13/13; SelectWinner→multi-toggle `SupplierIds[]`; FE bảng so sánh tick-nhiều-ô + "Tổng chi phí đã chọn"); **②budget=0 hợp lệ** (submit-guard nới `is null` only KHÔNG `<=0`, +3 validator GTE0; fallback ProInitial chỉ-khi-null bảo-vệ 0-cố-ý); **④cấp KẾT THÚC quy trình** `ApprovalWorkflowLevel.AllowApproverFinalize` — admin bật per-cấp Designer, duyệt tới đó TỰ DaDuyet bỏ CEO (**opt-in→AUTO** theo anh "cho bật trong quy trình hay hơn" → gỡ runtime-flag, nhánh `if (matchingLevel.AllowApproverFinalize)`). **Self-review bắt 8 chỗ FE keyed `selectedSupplierId`** (null khi liên-danh ≥2 → vỡ submit-guard/checklist/computeGiaChaoThau/tạo-HĐ) → đổi `isWinner` (cardinality single→multi = grep MỌI consumer). Test 377→**395** (+20−2 rework auto). Bundle admin `aKuNip19`→**`CXCKlNay`**/user `BUsL0HeQ`→**`Di40ewrF`**. **(2) Section B 3-cột Mig 59** (`9b1ee0c` **Run #345** cicd-verifying) — anh AskUserQuestion chốt "mỗi cột nhập kỳ-này RIÊNG" → `PurchaseEvaluation.CcmBudgetPeriodAmount` + endpoint `PATCH /budget/ccm-period` role-gate Admin|CCM fail-closed; FE Section B (THỰC HIỆN) rewrite `` list → `
` 3 cột (Dự án—|PRO budgetPeriodAmount/proFull|CCM ccmBudgetPeriodAmount/ccmFull, `colCalc()` per-cột) qua **Workflow `wf_aafb18fe-d9d`** (BE→FE→test + 3-lane review: math PASS · authz PASS · mirror+FE return NULL → em-main self-gate mirror byte-identical + 402-test + 2-build verify). Test 395→**402** (+7 authz setter). **State THẬT: Mig 59 · 88 bảng (cicd flag 89 — drift cũ KHÔNG do Mig 58/59 AddColumn-only, re-ground monthly) · 402 test (45D+357I) · gotcha 73 · menu 54 · bundle admin `BABhPh2s`/user `DLulO6uP` (Run #346 — `0d3c0cf` tách khối nổi bật "4. Thông tin chọn thầu" FE-only PASS; #345 Section B = `C8lWxEQK`/`Kz5cSW2u`; #344 CCM-3fix = `CXCKlNay`/`Di40ewrF`).** **Lessons:** cardinality single→multi = grep MỌI read-consumer (impl sửa write-site sót dependent — `feedback_cardinality_change_grep_consumers`) · design-dialog (item4 auto-config qua workflow-config, Section B AskUserQuestion) tránh rework · workflow review-lane value dù 2 lane NULL (lane-return verify disk độc-lập → trust PASS dù impl return NULL). ⚠️ CCM setter command rơi `PeSuggestedPriceFeatures.cs` (lệch chỗ, dọn monthly). → log `2026-06-24-S87-pe-multiwinner-budget-finalize-sectionb.md`.) · **Prev S86** (`ae4f106` Run #343) — PE notify "cần duyệt" loại NGƯỜI TẠO phiếu (drafter không nhận chuông phiếu mình tạo dù là approver 1 cấp; +3 `PeApproverNotifyExcludesDrafterTests`; re-ground STATUS test 356→377/gotcha 71→73 sót-S85-closeout). · **Prev S85** — **buổi UAT anh Kiệt FDC CỰC LỚN: CV PRO 6-fix batch + clear-data + 6 vòng UAT + 2 ROOT-CAUSE + 5 SQL-fix — ~10 deploy prod-verified #334→#341, HMW-mode ON, ~12 spawn** — anh forward Zalo anh Kiệt + Tra Sol + long.chau realtime. **Batch CV PRO (Run #334 `5a61254`):** đọc file `Cần chỉnh sửa CV PRO.xlsx` = **8 ảnh chú-thích nhúng** (không phải bảng công thức) → 6 fix: C1 ẩn "c.Giá chào thầu"+"d.Bảng so sánh" form TẠO · C3 ô8 pre-fill từ row7 (Ngân sách còn lại) · C4a **live-recompute** ô3/8 chưa-Lưu (VndInlineEdit +onLiveChange, draftRow3/8) · C4b So-sánh=0→"Bằng ngân sách"/"—" · C5 hủy/đổi NCC winner (BE `SelectWinnerBody(Guid?)` clear-branch + FE dropdown/toggle) · C7 nút "Toàn màn hình" preview file. **Clear-data (`scripts/s85-wipe-uat-data.sql`, BACKUP-trước):** wipe 43 PE + 28 PeWorkItemBudgets + 1 HĐ + 32 notif + 21 NCC-test (CreatedAt≥06-11, giữ 22 gốc) + reset mã→A/001; AskUserQuestion chốt scope (xóa budgets + NCC-test); SET QUOTED_IDENTIFIER ON (filtered-index). **6 vòng UAT (#335→#338):** R1 D1 ẩn mục 3/4/5 + D5 auto-chọn quy trình (1 option) · R2 D2 drafter tự-gỡ cờ GẤP (nới S77 GỠ=TP→+drafter clear-cả-2, BE restructure SET/UNSET) + D3 ngân-sách-kỳ-này tự-nhảy từ "Ban hành lần đầu" (`proInitialAmount`, FE display + BE/FE submit-guard fallback `budgetPeriodAmount ?? proInitialAmount`) · R3 ràng tạo-phiếu (hint đỏ "thiếu gì") + D4 checklist xanh✓/đỏ✗ trường bắt-buộc · R4 checklist +"Quy trình duyệt". **2 ROOT-CAUSE (whack-a-mole→fix gốc):** **(R5 #339 `1263c0d`)** workflow MẤT khi bấm Sửa = **bug-class S42** — `UpdatePeDraftHandler` absolute-set `ApprovalWorkflowId=null` khi form Sửa KHÔNG gửi field → CLEAR (field SÓT khỏi pattern null-safe mà BudgetPeriodAmount/WorkItemId cạnh đã có) → fix `if (request.X is not null)` (gotcha **#73** NEW, +3 regression test) · **(R6 #341 `49ac086`)** "mới tạo báo 7h trước" = **TZ** — timestamps lưu UTC nhưng EF đọc `DateTimeKind.Unspecified` → System.Text.Json default serialize KHÔNG có 'Z' → FE `new Date(naive)`=local → lệch +7h (VN UTC+7) → **`UtcDateTimeJsonConverter`** global (AddControllers.AddJsonOptions) ép UTC-with-Z (gotcha **#72** NEW) — cicd verify API trả `createdAt:"…3154440Z"`. **5 SQL-fix** (2 đợt 3+2 phiếu workflow-less, gán QT-DN-V2-001 type-1, ssh prod). **Cách chạy:** em-main-led + impl-backend (C5 BE clear) + impl-frontend mirror + test-specialist ×3 (C5 +10 · urgent-authz +5 · workflow-preserve +3) + reviewer ×2 (truncated→em-main self-gate, memory-lesson) + cicd-monitor ×7 (7/7 PASS; ship-proof BE-only = `Application.dll`/`Api.dll` Last-Modified in-window, #69-REFINE). **Test 356→374** (+18). **State THẬT: Mig 57 · 88 bảng · 374 test · gotcha 73 · menu 54 · bundle admin `aKuNip19`/user `BUsL0HeQ` (Run #341, FE frozen #339+#341 BE-only).** **Lesson `feedback_root_cause_over_symptom`:** bug lặp-lại (SQL/tzutil band-aid không dứt) → truy field/case **LỆCH-quy-ước** rồi đưa vào pattern đã-đúng = fix 1 chỗ hết tái-diễn. → log `2026-06-23-S85-pe-uat-cvpro-rootcause-tz.md`.) · **Prev S84** — **bootstrap + flush session-start hot-feed cap-echo v3 + commit S83 cicd harvest-orphan (em-main hygiene, 0 production code)** — anh `/session-start` → 2 monitor INFORM: H1 bắt `session-start.md:114` còn cap CŨ `lead 60K/sub 20K/wf 16K` ≠ canonical budget v3 `220K/60K/50K` (S82 self-shrink chưa flush khi S83 owner-set lại); H2 bắt `cicd-monitor/MEMORY.md` = harvest S83 hợp-lệ (Run #333 + gotcha **#69-REFINE**: hash giữ-nguyên khi 0 `fe-*/src` đổi → ship-proof THẬT = `Last-Modified` in-window, KHÔNG hash-delta) sót khỏi closeout `f71654f`. Anh "Sao ko add luôn?" → em flush `session-start.md:114` echo cap → **220K/60K/50K + canonical-pointer "đọc số sống ở budget.json"** chống tái-drift (detector C2 KHÔNG track cap-number → echo-trần lệch âm-thầm lần đổi cap sau) + commit cicd harvest-orphan. **Lesson (`feedback_derived_flush_execution`):** monitor INFORM-only proposal về **derived→canonical flush** = em-main **EXECUTION** (B3 VERIFY→APPEND = verify-rồi-LÀM), KHÔNG gate user-confirm; chỉ **ĐỔI-con-số** mới = quyền anh (chủ-dự-án). archive-gate A7 GATE PASS 217/217 · 2 WATCH strike-1 (FD/test-spec, no-action). **State GIỮ NGUYÊN: Mig 57 · 88 bảng · 356 test · gotcha 71 · bundle `CsJetgZH`/`BVS0ApIm`.** ⚠️ restart CLI (command `.md` no hot-reload — runtime %-print mới ăn cap đúng). → log `2026-06-22-S84-session-start-cap-flush.md`.) · **Prev S83** — **(1) adopt H-15 v3 memory-budget full-parity (anh owner-directive) + (2) fix PE require-workflow create+submit (đóng lỗ hổng "quy trình cũ") prod-verified Run #333** — anh `/session-start` → directive budget Tầng-1 **220K**/mem-sub **60K**/wf-sub **50K** "nạp đầy cho đủ" → diagnose phiếu A/040 "quy trình cũ" → "(B) vá guard BE + test-before → deploy" → `/session-end`. **Part 1 H-15 v3 (commit `2c7fd63` docs-only CI-skip):** `token_governor` lead 200K→**220K**/mem-sub 20K→**60K**/wf-sub 16K→**50K** full AI_INFRA parity (sửa self-shrink S82 = AI tự-co-nhỏ, mark `RC-…01-58-01` cấm) + NEW `spawn_fill_directive` (nạp sub tới budget bằng prompt GIÀU — byte-cap MEMORY.md = 1 lát, prompt nạp phần còn lại; retire `≤8K-brief`) + engine **§G.5** + ACTIVE-MARKS H-15 **v3-delta** `RC-pqhuy1987-22-06-2026-16-35-37` (anh-directed, report-before-stamp). **Part 2 PE fix (commit `fc1f19d`, cicd Run #333 PASS ~4m59s):** validator `NotEmpty(ApprovalWorkflowId)` + submit-guard (SAU Section-3, TRƯỚC mutate phase) → phiếu null-workflow KHÔNG gửi-duyệt được (trước: kẹt nhánh V1-legacy = banner "quy trình cũ", không Bước/Cấp, "Lịch sử duyệt 0"). **Diagnose:** banner ⟺ `approvalFlow` rỗng ⟺ `ApprovalWorkflowId` null; A/040 **tự-khỏi-khi-reload ⟹ cache** (data-hỏng reload không khỏi — em KHÔNG đụng prod). **test-before RED→GREEN**, full-suite bắt **9 đỏ** → triage: 2 genuine-spec-conflict (V1-submit deprecated, data wipe S59) rewrite + 6 collateral giữ (dời guard sau Section-3) + 1 validator fix. **Test 354→356** (+2 validator). **#69-REFINE (cicd):** bundle KHÔNG rotate vì 0 fe-src change (Vite deterministic) — ship-signal THẬT = Last-Modified in-window KHÔNG hash-delta; bundle GIỮ admin `CsJetgZH`/user `BVS0ApIm` Run #333. State THẬT: **Mig 57 · 88 bảng · 356 test · gotcha 71 · bundle `CsJetgZH`/`BVS0ApIm`**. ⚠️ restart CLI activate budget v3 runtime. → log `2026-06-22-S83-h15v3-pe-require-workflow.md`.) · **Prev S82** — **adopt Harness-15-v2 (Tầng-1 hot-feed-lớn + L2/L3 bỏ-trần + %-print 2-đầu-phiên + ranh-giới vai-trò), 0 production code** — `/check-email AI_INFRA` (1 thư mới H15-v2-notify verify ✓✓ whole-file+body) + `/adap-apply all` (fan-out 29 broadcast vs 22 report → CHỈ H15-v2 MỚI; 7 còn lại verify = đã-phủ S72/S75/S79). em-main IMPLEMENT single-writer D9 (6 edit: `token_governor` L1 12K→per-role **lead 60K/sub 20K/wf 16K** · L2/L3 6K/4K→**NO-CAP** · engine §G.4 · session-start §2.1.6 + session-end §L.b(c) %-print · mark H-15 What-cell refine) + **REVIEW Workflow `wf_04667b25-5fa` 3-lane 3/3 PASS** (bắt 3 MINOR → fixed: volume "~42K" stale · mark pending-confirm flag · _index STAGE-2). **Ranh-giới vai-trò:** con-số = quyền CHỦ-DỰ-ÁN/anh, AI thực-thi + báo-% — sửa framing S81 "lead-authority" gộp nhầm AI-lead↔owner. mark H-15 **v2-delta anh-confirm** `RC-pqhuy1987-21-06-2026-01-58-01` (report-before-stamp). commit `aa3f0fe` push (docs-only CI-skip) + email AI_INFRA `a749bb6bd1be`. **State THẬT GIỮ NGUYÊN: Mig 57 · 88 bảng · 354 test · gotcha 71 · bundle `CsJetgZH`/`BVS0ApIm`.** ⚠️ restart CLI (session-start §2.1.6 + session-end §L.b(c) %-print runtime). → log `2026-06-21-S82-harness-15-v2-adopt.md`.) · **Prev S81** — **adopt Harness-15 memory-budget per-agent (token-governor + value-gate + work-state block)** — em main single-writer + 1 REVIEW Workflow (`wf_b7f3c8ac-b53` 3-lane: Part-A PASS · Part-B PASS · Honesty HONEST), **0 production code**. `/check-email AI_INFRA` STAGE 1 = **0 new directed** (outbox/se 4 file processed S79); fan-out diff → CHỈ **H15** unapplied (H14/v2.0/checklist-9-10/11 đã phủ S72/S75/S79). **8/8 🔴 floor:** A1 đo-SÀN persona-direct `Get-ChildItem` 4.3-13.3KB + harness-injected SE-ước-riêng 21K→**30K cap-riêng-SE** · A2 `token_governor` L1 12K/L2 6K/L3 4K (lead hard-cap) · A3 tách-nhà · B(a) nạp-đầy-no-token-saving · B(b) **value-gate** `value_protect` 10-pattern + gate-script FLAG **runtime-fired** (test-specialist gotcha#/guard) ⟂ keep-floor recency = mark `RC-…11` áp tầng-bộ-nhớ · B(c) **work-state block** `session-start §2.1.5` · B(d) 3-tệp-chốt verified (`hmw.js:124` MEMORY-PACK) · B(e) **2-governor** byte⟂token. **5/6 sàn = convention, chỉ (e)+đo-SÀN = mechanized (honest no-overclaim).** Review bắt **2 CONCERN** (anchoring + tool-attribution) → **fixed** (review→fix loop) + refresh stale `measured` block S71→S81. Artifacts: `memory-budget.json` + engine `§G` + `session-start §2.1.5` + `rules §6.6` + gate-FLAG + adap-report `2026-06-20-Governance-harness-15-memory-budget.md`. A7 217/217 · detector 26-flag baseline (0 new). ⚠️ **restart CLI** (session-start §2.1.5). **✅ mark H-15 stamped Active-High** (`RC-…23-07-37`, anh-confirm S81). **State GIỮ NGUYÊN: Mig 57 · 88 bảng · 354 test · gotcha 71 · bundle `CsJetgZH`/`BVS0ApIm`.** → log `2026-06-20-S81-harness-15-adopt.md`. · **Prev S80** — **curate L1 over-cap reviewer/inv-codebase/cicd → L2 archive** — em-main single-writer, archive-gate keep-floor-hit→manual condense-with-archive: 31 entries byte-exact (`sed`) +N−0 → `archive/2026-06.md` + 31 `_INDEX` substring pointer → **A7 GATE PASS 217/217**; stale foundation counts flushed (130/263→354 · 55→71 · Mig 40/55→57 · 84→88 · bundle→#330). **0 production code, state GIỮ NGUYÊN: Mig 57 · 88 bảng · 354 test · gotcha 71 · bundle `CsJetgZH`/`BVS0ApIm`.** WATCH (A6 strike-1): frontend-designer 26KB + test-specialist 28KB. Lesson: `_INDEX` substring **quote-free** (A7 quote-parser bắt escaped-quote PURO pointer self-grep miss). 9 agent-memory file, docs-only commit (CI skip). → log `2026-06-20-S80-curate-l1-overcap.md`. · **Prev S79** — **adopt User-Mark (H-12/13) canonical §P + Harness-14 (Eval/Budget/Outcome) + chữ-ký RC** — em main + 4 Workflow (invest `wf_82337f7f-95c` → review `wf_a7cbe93e-912` → align-re-review `wf_9d3beebb-a95` → H14-review `wf_4d4eba6f-8a0`), **0 production code**. Anh gõ `/user-mark-active-high` "áp đầy-đủ chính-xác nhất theo AI_INFRA" → áp **canonical §P đầy-đủ** (P1-P10): 4 lệnh `/user-mark-*` + ledger `.claude/governance/ACTIVE-MARKS.md` (Active-High/Active/Medium/Disable) + `harness-11-engine.md §E`+**§F** + `rules.md §6.6` objective-criteria. **3 mark Active-High stamped** anh-confirm (`RC-pqhuy1987-20-06-2026-10-29-09/10/11`). completeness-gate H-6→H-13 **ĐẠT** (H-8 11/11 inherit no-`[1m]`). §F floor 6/6 + maturity HONEST. 3 adap-report + email ai_infra (`7b8615b3`). Bài học: broadcast cô-đọng→canonical-command/§P là spec THẬT (bản đầu MUST/TRACK→align lại) · report-before-stamp dogfood · investigator residual-diary OK. State GIỮ NGUYÊN Mig 57·88 bảng·354 test·gotcha 71·bundle `CsJetgZH`/`BVS0ApIm`. ⚠️ restart CLI. → log `2026-06-20-S79-user-mark-harness-14-adopt.md`). · **Prev S78** — **PE: đính kèm file khi DUYỆT (UAT Tra Sol / 5 tester)** — người duyệt tải file của mình lên ngay lúc Duyệt thay vì Trả lại phiếu (tình huống thay đổi nhỏ). Reuse hệ attachment + enum `ApprovalAttachment=5` **MIGRATION-FREE** (int-stored, 0 schema change); endpoint `POST {id}/attachments` + authz có sẵn (handler không guard drafter-only → approver upload được). FE 2 app SHA-identical: `PeWorkflowPanel` picker multi-file + upload-TRƯỚC-chuyển-phase (file lỗi=không duyệt) + mục "📎 File đính kèm khi duyệt" (download/preview) + 2 filter fix loại purpose=5 khỏi "Bảng so sánh" (gotcha **#71** proxy-predicate pollution). commit `7886fd0` → **Run #330 PASS** ~4m56s (test gate **354**, bundle admin **`CsJetgZH`**/user **`BVS0ApIm`**, NO migration, smoke 4×200 + attachments 401-wired). **3 lỗi em tự bắt review-trước-deploy** (authz-verify handler · filter-pollution #71 · Dialog mirror-truncate fe-admin). em-main-led + self-gate (grep no-leak thay reviewer over-cap) + cicd-monitor verify. → log `2026-06-19-S78-pe-attach-file-on-approve.md`. · **Prev S77** — **buổi sản phẩm RẤT LỚN: 10 deploy prod-verified #320→#329 (anh Kiệt FDC + Tra Sol + Bích Phượng UAT realtime, HMW-mode ON)** — bundle cuối admin **`BqKD3Y23`** / user **`Cn-i349D`** (Run #329). **Mig 56→57** `AddPeSuggestedPriceNotes` · test 344→**354** (+10) · gotcha **70** (tái dùng #70). 10 việc PE: (1) cờ GẤP **pill** 🔴PRO/🟢CCM đồng bộ MỌI danh sách + inbox (#320, NEW `PeUrgentChips` ×2 app); (2) **focus mode** bấm phiếu→overlay (#321) → **revert** list về layout gốc bám-trái lấp-đầy (#322); (3) **Mig 57** ô 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ảng so sánh giá" + **guard #70** stale-echo (#323); (4) số âm → **đỏ + ngoặc** `(…)` hàng 7/8/9 (#324); (5) mục con **thụt dòng + gạch đầu dòng** phân biệt có-số/không-số (#325); (6) cờ gấp authz **BẤT ĐỐI XỨNG** GẮN=NV chức năng / GỠ=chỉ Trưởng phòng (DeptManager) (#326, asymmetric handler + button-by-state); (7) **tách chọn-phiếu (inline 3-panel) khỏi mở-rộng (overlay)** + nút "Xem mở rộng" mỗi dòng (`?expand=1`) (#327); (8) **chuông báo người duyệt** khi phiếu vào cấp họ — submit + mỗi approve-advance (#328, `LogTransitionAsync` notify current-level approvers); (9) banner phiếu **Trả lại** hướng dẫn gửi lại (#329). **3 lỗi em tự bắt khi review TRƯỚC deploy** (guard #70 stale-echo cho ô ghi chú · luật cờ-gấp bất-đối-xứng Tra Sol clarify giữa-chừng · double-mount PeDetailTabs Task H — intent-comment có nhưng code sót). Cách chạy: em-main + frontend-designer ×3 (focus/revert/decouple, FD2 stub-verify do backend-down #3) + implementer-frontend (pill/notes/sep/spelling) + implementer-backend ×2 (Mig 57 · approver-notify) + test-specialist ×3 (notes +7 · urgent symmetric→asymmetric REDO do clarify-after-dispatch) + cicd-monitor ×10 (10/10 PASS). **frontend-designer process-death giữa Task H → recover-disk** (edit hoàn-chỉnh trên disk, em-main build-verify + mirror). **🔴 NEXT (em): curate L1 over-cap GẤP** — reviewer **45KB** + cicd-monitor 37.6KB + inv-codebase 35.6KB (keep-floor-hit → manual SPLIT/condense; archive-gate A7 GATE PASS 186/186 integrity OK) + FD 26KB/test-spec 27.7KB WATCH strike-1. → log `2026-06-19-S77-pe-ux-batch-10-deploy.md`. · **Prev S76** — **PE ngân sách MA TRẬN 3 cột (Dự án|PRO|CCM) + bảng lưới `
` viền-ô + badge quyền-NS theo role** — anh Kiệt FDC + chị Trà Sol, go-live; anh giao `/ultra-on` "step-by-step + workflow-review-per-step, hoàn chỉnh rồi deploy". **3 commit prod-verified:** `e33481e` (feature Run #318 — Mig 56 + ma-trận-3-cột + badge designer/flow, `BhFDF9IJ`/`BAkuRl3C`) → `21d1f4e` (bảng lưới `
` theo phản hồi anh, Run #319 **`jOqxW4-p`**/**`DbsznVvR`**, smoke 3×200). **Part 1:** PRO sửa cột PRO (canEditPro), CCM sửa cột CCM (canEditCcm), Dự án FE hiển-thị-only; Mig 56 +ProInitial/ProAdjust additive + data-migrate ProEstimate→ProInitial (4 rows prod). **Part 2+3:** badge "✎ NS PRO/CCM" cạnh approver (suy từ role, display-only no-authz) ở Workflow Designer + flow Duyệt NCC. Test 339→**344** (+5). **2 workflow review** (Part 1 PASS + Part 2/3 PASS) — reviewer bắt **race mất-dữ-liệu** Part 1 (impl self-review sót) → vá `useIsFetching` 2 app, **gotcha #70 NEW**. Lessons: flex+gap KHÔNG ra "bảng" → phải `
` viền-ô · workflow-review-flaky (2-3 lane empty #53) → em-main self-gate lane rỗng. **NEXT:** 🔴 curate L1 over-cap (reviewer **45KB** + inv-codebase 35KB keep-floor-hit manual-condense; cicd 29KB + test-spec 28KB strike-1). → log `2026-06-19-S76-pe-budget-matrix-table-grid.md`. · **Prev S75 (2026-06-18)** — **Harness-11 adopt: engine bộ-nhớ-và-governance TỰ-BẢO-TRÌ + 2 double-check** — anh giao `/check-email AI_INFRA` + `/adap-apply` (mỗi stage workflow-review) + double-check ×2 + finalize report + push + session-end. em main + **5 Workflow** (audit `wf_7fdc3bd5-930` → implement `wf_c5e5844e-7c1` → review `wf_d7ca1ff8-942` → double-check `wf_a0b68d2f-30e` → checklist-verify `wf_39cd4cbe-f07`). **0 production code.** Built `scripts/governance-detectors.ps1` (C1 broken-pointer + C2/B3 staleness + C3 vocab-fork + C4 self-exclusion + C5 resolve, NO-API DÒ+FLAG, runtime **26 flag** bắt drift thật, C4 0-self-match) + `scripts/memory-archive-gate.ps1` (PHẦN A hysteresis 0.85/keep-floor 5/2-strike/A7 NO-API 186/186) + `docs/governance/harness-11-engine.md` canonical (3-tier D5/D6/D7 EXPLICIT + one-direction-lock D8) + **B1 ×11 count→pointer `docs/STATUS.md`** (drift mig53→55/test306→339/gotcha68→69/table93→88 RESOLVED) + cadence-wire session-start §2.1.3 (D1) + session-end §L.b(c) (D2) + agents/README Upgrade S75. **completeness-gate FORMAL ĐẠT** (B 4/4 + C 5/5 + D 11/11 đủ-trọn, A 🟡 tailored — A6 runtime cần 2×-Apply legit-by-design). **gotcha #30 reinforced** (box-glyph ├└─ KHÔNG vào .ps1 — PS5.1 -File ANSI mojibake, KỂ CẢ qua Edit render-normalize; detector pure-ASCII verified). 3 commit `e70c046`+`ae957c4`+`aa09e99` pushed + adap-report + email ai_infra (`2316773229f2`). **State THẬT GIỮ NGUYÊN: Mig 55 · 88 bảng · 339 test · gotcha 69 · menu 54 · bundle `BYF5vIMJ`/`CB-tiRxd`.** ⚠️ restart CLI (cadence §2.1.3/§L.b + ef-core skill). 🔴 curate-debt: reviewer 38.8KB + inv-codebase 31.5KB + cicd 26.8KB over-cap (archive-gate confirm; reviewer+inv keep-floor hit → manual split). → log `2026-06-18-S75-harness-11-adopt.md`. **Prev S74** — **PE ô "Ghi chú từ CCM" ngân sách gói thầu (Mig 55)** — anh forward 2 luồng Zalo (Trà Sol + Kiệt FDC) "CCM cũng giống PRO cho nhập + ghi chú, hiện 0 hết" → em-main BE+Mig55 ∥ implementer-frontend FE 2 app SHA-mirror ∥ test-specialist (chết rate-limit → recover-disk). 2 fork anh chốt qua AskUserQuestion: **thêm CcmNote (Mig 55)** + **GIỮ phân vai CCM** (CostControl/Admin). Entity `PeWorkItemBudget +CcmNote` mirror ProNote · `UpdatePeBudgetCcmCommand +CcmNote` absolute-set role-gate fail-closed · DTO+controller+mapping · FE dòng "Ghi chú từ CCM" gate `canEditCcm` (sau V0/hiệu chỉnh, absolute-set đủ 3 field). Mig 55 additive-nullable sạch (no #63). Test 334→**339** (+5 CcmNote). **Chẩn đoán "0 hết không nhập":** tài khoản thiếu role CostControl (KHÔNG bug) → UAT bằng CCM/Admin. commit `8655ebf` push main (cicd **Run #315 PASS** ~4m54s — Mig 55 applied prod, bundle admin `BYF5vIMJ`/user `CB-tiRxd`, smoke 4×200). Lessons: controller call-site thiếu arg sau +param record (grep+vá, #65 bắt) · agent-kill-529 recover-disk no-re-spawn · PS here-string commit-msg trong if-block mis-parse → `git commit -F`. → session log `2026-06-18-S74-pe-ccm-note.md`. **Prev S73** — **Mig 54 PE giá đề xuất PRO/CCM + CEO chọn giá chốt + CCM duyệt-done ô-tích (anh Kiệt FDC — go-live so-sánh-giá thứ Hai 22/06)** — em main + 6 sub + 2 review-workflow. **2 commit prod-verified:** `1d86abc` (feature, cicd Run #313 PASS — Mig 54 + bundle admin `OlNyG9OD`/user `DSzSLVtL`) + `6aa4dcb` (FE empty-candidates guard fix). **BE:** Mig 54 `AddPeSuggestedAndApprovedPrice` 5 cột additive-nullable (ProSuggestedMin/Max·CcmSuggested·ApprovedPriceAmount·Source) + 2 setter role-gate PRO/CCM (Forbidden fail-closed mirror budget) + ApproveV2 **③ AUTO→OPT-IN** (`finalizeByCcmDelegation` ô-tích, gỡ auto-threshold S69) + **① bind giá chốt** mọi nhánh DaDuyet (human bắt-buộc-chọn, isSystem-miễn) + DTO +7 field/capability. **FE 2 app SHA-mirror:** PeWorkflowPanel (bộ chọn giá + ô tích CCM + fix empty-candidates) + PeDetailTabs `SuggestedPriceRows` + types +7. **Test 306→334** (+28). **2 workflow review (bài học):** R1 schema-force CHỈ **1/4** lane returned (flaky no-StructuredOutput) → R2 **free-text 2/3 PASS** — rủi ro #1 FE empty-candidates = **UNREACHABLE** (submit-guard `:194` chặn gửi-duyệt khi winnerQuoteTotal≤0). → review fan-out dùng **free-text / hmw RUN-TRACE**, KHÔNG ép-schema inline. **Governance honest:** em lệch mandate auto-Workflow (mode-ON) + chỉ khai khi anh hỏi → **cam kết báo-TRƯỚC-khi-lệch**. Run-trace `runs/2026-06-18-mig54-pe-review/` (custom-inline, bù post-hoc). → session log `2026-06-18-S73-pe-gia-de-xuat-ccm-done.md` pending. · **Prev S72** — **Harness-10 flat-refine + checklist-v2 adopt (re-audit 3-workflow) + sleep NO-OP** — em main + 9 sub qua 3 Workflow (audit `wf_13868efb-ea7` → implement `wf_ac43b5ff-7d1` → review `wf_d482e10d-5dd`, mandate Harness-9 B1+B2). Anh chỉ "sisters làm tốt mỗi SE thiếu" → re-audit đo vs canonical: **SE BEHIND Harness-10 flat** (run-trace còn SUBFOLDER, canonical=FLAT) → migrate `hmw.js` (`:103` sub-md/→flat + `:52` schema + **H4.5→H8 doc-drift**) + `workflows/README` full-rewrite + `runs/README` + session-start/end + `agents/README` Upgrade S72 + `_ledger`; **5 run cũ S71 GIỮ subfolder** (C8 dual-accept). +2 broadcast 06-18 adopt (checklist-v2 + h10-flat-detector-refine). +`/sleep-recovery-memory-l2` port (A8, §J2-tailored SE-only, floor intact, live skill). **detector refine-b TAILORED-OUT** (SE Workflow-tool no-CLI-bypass; containment git-diff+tracked+orphan-scan G-015). **REVIEW (B2 dogfood) bắt 2 lỗi IMPLEMENT-self-assess sót** (hmw.js:52 schema-stale + sleep-cmd auto-check un-wired overclaim) → fixed (auto-check **WIRED thật**: budget.json `+last_sleep_at` + session-start:78 + session-end:48, grep-verified). em-main containment-check tự bắt 1 reviewer residual-write (raw-Workflow KHÔNG hmw.js writeGuard → reverse-finding #4) → revert. **B3 self-correct:** S71 report path tắt `runs/`+"14" → thật `.claude/workflows/runs`=22. **Sleep `all`=NO-OP** (5/9 empty-archive + 4/9 đã-gisted → 0 compressed; `last_sleep_at`=2026-06-18). **0 production code, state THẬT GIỮ NGUYÊN.** adap-report `2026-06-18-Governance-harness-10-flat-refine-checklist-v2` + email ai_infra (`5f511fe5c0f2`). ⚠️ **restart CLI** activate FLAT-runtime hmw.js + wired sleep-check + sleep-recovery skill. 🔴 **NEXT (em):** curate investigator-codebase L1 **28973 OVER** (audit-trail) + watch frontend-designer/test-specialist near-cap. → session log `2026-06-18-S72-harness-10-flat-refine.md`. **Prev S71 — Harness-10 adopt: tracked run-trace folder convention + checklist 9-10 self-verify** — em main + 3 Workflow (invest `wf_9c2cd2cd-2e7` → implement `wf_e4e46725-231` → review `wf_636bc95b-939`) theo mandate Harness-9 PART 2. **0 production code** (governance/workflow only). Migrate `.claude/workflows/wave-*/` gitignored → `runs//` **git-TRACKED** (run.md + sub-md/ + harvest/) + `_ledger.md` 2-nhịp + 3-layer anti-miss (L1 em-main@P1 ledger-check / L2 session-start orphan-scan / L3 session-end close-gate **idempotent-VERIFY-not-re-APPEND**) + **containment model shift** (Harness-2 B6 "mọi tracked-change=vi-phạm" → Harness-10 "tracked-change NGOÀI run-folder + code-disjoint=vi-phạm"; run-folder TRACKED → HIỆN git-diff = audit trực-tiếp). hmw.js wave→run-trace (accept `args.run`, alias `wave`; path `sub-md/`; `node --check` PARSE-OK). **Review độc-lập (R2+R3) bắt C5 L1 over-claim** (doc nói hmw.js prompt-builder emit L1 reminder nhưng grep engine=0 → engine no-fs → fixed path-a: L1 = em-main @P1 convention) — dogfood mandate B2 đúng (1-workflow-tự-chấm sẽ bỏ sót). **checklist 9-10:** Part A (Harness-9 memory) + Part B (adap 2-workflow) ĐÃ done S70; Part C (Harness-10) MỚI 8/8. dogfood: 3 run-trace folder TRACKED đầu + 3 entry ledger. adap-report `2026-06-18-Governance-checklist-harness-9-10` + email ai_infra. **State THẬT GIỮ NGUYÊN: Mig 53 · 88 bảng · 306 test · 68 gotcha · menu 54 · bundle admin `BgNCjwsG`/user `CBvh0vtf`.** + `CLAUDE.md` test-flush 263→306 (pre-existing uncommitted, resolve H1 stale-flag). ⚠️ restart CLI activate hmw.js RUN-TRACE runtime + (carry S66/S70) §2.1.2 budget-audit/reviewer-Cat-6/H8-inherit. ✅ **curate-debt CLOSED S71** (FINALIZE double-check `wf_73de399d-753` + curate `wf_f32987b8-03f`): reviewer 36.7→24.8KB + investigator 29.8→23.2KB (both <25600 cap, archive +N -0 0-byte-loss) + reviewer-gist gen:2 + 3 user-memory G2/G3 + budget.json re-measure. Race root-cause fixed cấu-trúc (hmw.js RUN-TRACE writeGuard). → session log `2026-06-18-S71-harness-10-run-trace.md` (pending). **Prev S70** — **Harness-9 adopt: L2 archive dark-matter recovery + adap 2-workflow mandate** — em main + 3 Workflow (investigate `wf_be952f3c-97f` → implement `wf_a58e0d15-beb` → audit `wf_9520d8cd-4fe`) + 2 monitor bootstrap. **0 production code** (governance/memory only, commit `f36aab8` pushed). 4 over-cap sub-agent (cicd-monitor/investigator-codebase/reviewer/implementer-backend) curate L1→L2 + `archive/_INDEX.md` (mục-lục con-trỏ **substring sha-keyed**, Ctrl-F fallback) + `.gist.md` (nén 4-field distill-gen:1, verbatim FROZEN) → **cả 4 < 25KB auto-inject cap** (P1 curate-debt CLOSED; ~240KB archive hết RAG-dark). PART 2/3 process-mandate codify (adap-apply + agents/README Upgrade S70 + session-start §2.1.2 budget-audit). **0-byte-loss git+sha verified** (Stage C audit + em-main self-gate khi 2 reviewer no-StructuredOutput). +`memory-budget.json` (seed-by-measure) + `scripts/measure-agent-memory.ps1` + `.ragignore` + doc-drift 4-cite flush. adap-report + email-back ai_infra (body-hash `7c07b716e775`). **State THẬT GIỮ NGUYÊN: Mig 53 · 88 bảng · 306 test · 68 gotcha · menu 54 · bundle admin `BgNCjwsG`/user `CBvh0vtf`.** ⚠️ restart CLI để activate session-start §2.1.2 + pending H8 inherit + reviewer Cat-6. → session log `2026-06-17-S70-harness-9-l2-recovery.md`. **Prev S69** — **Văn phòng số (E-Office) port + golive + PE cờ gấp/ngưỡng CCM — 4 deploy prod-verified Run #305→#308, HMW-mode ON, 2 workflow fan-out + ~14 spawn**: foundation PURO (shared PageHeader/KpiCard/WidgetCard + Dashboard 2-cột + sync fe-admin index.css đóng drift S66-S68) #305 → **re-skin TRỌN 10 page** PURO layout + CSS Hồ sơ NS, phẫu-thuật-giữ-100%-logic (reviewer verify api/queryKey byte-identical) #306 → **Office golive public** `SeedAllRolesOfficeModulePermissionsAsync` read+create 16-key allow-list mọi role (mirror S65 pattern, chạy SAU revoke; excluded Off_PhongHop_Manage/Off_AttendanceReport/Off_ChamCong giữ ẩn; cicd DB-verify 16/16×13 role) #307 → **PE cờ gấp PRO/CCM + CCM duyệt-final theo ngưỡng giá trị** Mig 53 (anh Kiệt FDC sau họp sếp) #308. **State THẬT: Mig 53 · 88 bảng · 306 test (45D+261I) · 68 gotcha · menu 54 · bundle admin `BgNCjwsG`/user `CBvh0vtf` Run #308.** 2 gotcha NEW (**#67** Tailwind accent palette thiếu-stop vỡ-màu-im-lặng · **#68** stale-diagnostic-background-agent). 2 truncation #53 (impl-backend positional-record + impl-frontend) → em main recover-disk + self-gate (cả 2 build PASS sau-cùng). C (sau duyệt → chuyển phiếu đến dự án) chờ anh Kiệt spec form. → session log `2026-06-17-S69-vanphong-golive-pe-urgent-threshold.md`. **Prev S68** — **Hồ sơ NS header chi tiết NV: làm nổi bật + fix tên render đen→trắng** — em main solo, 3 commit (2 FE `6983609`+`37752eb` · 1 docs `11bc96d`), 2 deploy prod-verified Run #303-304 (anh UAT realtime): tên `text-xl extrabold`+drop-shadow · dòng meta `text-[13px] font-medium` trắng-đậm · badge pill **màu theo trạng thái** (#303); anh báo "tên đen nền xanh ko nổi bật" → diagnose **rule `h1-h4{color:#0b1220}` viết NGOÀI `@layer` thắng `text-white`** (Tailwind v4 unlayered > all layers, **gotcha #66 NEW**) → ép `text-white!` + thu nhỏ `text-lg` (#304, grep dist confirm `!important`). Bootstrap: 2 monitor RE-REPORT CLEAN + 2 doc-drift fix (dep-audit 64→65 · root CLAUDE 263→286, H1 flag). **State THẬT: Mig 52 · 88 bảng · 286 test · 66 gotcha · menu 53 · bundle admin `CNUv1jxY`/user `CpOskeS1` Run #304.** ⚠️ curate-debt P1: cicd-monitor **44.1KB** (worst). **Prev S67:** **buổi sản phẩm LỚN, 6 deploy prod-verified Run #297→#302** (anh + anh Kiệt FDC UAT realtime, HMW-mode ON): fe-user Hồ sơ NS đồng nhất font + chữ đen→**xanh đậm `brand-800`** (#297 `ab4e681`) · **fe-admin mirror master-detail** + accent tokens index.css [đóng pending lớn nhất HRM go-live, page SHA256 ×2] (#298 `292d64d`) · **+23 test-after HRM** [Dept cycle-guard · PE HoSoLink absolute-set · HRM-perm seed] → 263→**286** (#299 `bcd619d`) · **list flex-row gọn** [bảng 3-cột→flex-row, `overflow-x-hidden` → hết tràn ngang rail] + đồng nhất cỡ chữ [18/14/13/11px] ×2 app (#300 `91aaf05`) · **PE Link hồ sơ auto-detect** `http(s)`→hyperlink/`O:\`→Copy (#301 `6df1b2d`) → **render link `file://` bấm-thử** + Copy (#302 `536dd6b`). **Workflow research 3 investigator-api** (auto-mở `O:\` từ web): default browser CHẶN https→file://; **chỉ Edge GPO `IntranetFileLinksEnabled`** (Edge-only, Intranet Zone, 1 GPO domain zero-per-machine) = one-click thật — Chrome không có; .url-download zero-install nhưng 2-click. **State THẬT: Mig 52 · 88 bảng · 286 test (45D+241I) · 65 gotcha · menu 53 · bundle admin `CcrZqfht`/user `DniDFUB_`** (#302). test-specialist truncated return #53 → em main recover-disk (3 file test đủ + 286 verify); 0 production bug. ⚠️ curate-debt: cicd-monitor 39.8KB + inv-codebase 39.4KB over-cap. **Prev S66** — **session-end closeout em-main-solo, 0 product-sub:** adopt **Harness-8 all-inherit** (7 sub demoted `claude-opus-4-8`→`inherit` → cả 11 = inherit, gỡ two-tier Harness-4) + **cicd-monitor L1 curate 86.8→28.9KB** (byte-exact sed → `archive/2026-06.md`, incl #291 forensic) + **ef-core skill doc-flush Mig 50→52** (H1 drift, +Mig 51/52 rows) + check-email AI_INFRA (**0 thư mới se-directed**). ~17 file docs/gov/config, **0 production code** → state THẬT GIỮ NGUYÊN: **Mig 52 · 88 bảng · 263 test · 65 gotcha · menu 53 · bundle admin `BDwV5d0X`/user `DbVv6rsf`**. ⚠️ **Restart CLI** để H8 runtime (frontmatter no hot-reload) + reviewer Category 6 (S64 pending). adap-report `2026-06-16-Governance-harness-8-all-inherit-workflow-fastest` + email-back ai_infra (hash `fa7f690d` round-trip MATCH). Prev S65 — **HRM go-live: public Hồ sơ Nhân sự + trang master-detail giống NamGroup + Department hierarchy + PE Link hồ sơ**, ~6 deploy prod-verified Run #289→#295, anh + anh Kiệt FDC UAT realtime): (1) **public Hồ sơ Nhân sự mọi role** — `SeedAllRolesHrmProfileReadPermissionsAsync` grant CanRead `Hrm`+`Hrm_HoSo` 13 role chạy SAU revoke S58 (upgrade-only; EmployeesController policy-based `Hrm_HoSo.Read` mở luôn API không hardcode Roles), giữ ẩn Dashboard NS, Run #289; (2) **redesign màu foundation fe-user** — accent palette teal/violet/amberx/greenx + `.app-gradient-brand`/`.card-accent`/`.icon-chip` + heading 700, brand #1F7DC1 + Be Vietnam Pro giữ, Run #290; (3) **Department hierarchy** Mig 51 `AddDepartmentParentId` (ParentId loose-Guid no-FK + `GET /departments/tree` ráp cây in-memory + rollup count theo `User.DepartmentId` + cycle-guard HashSet) + picker "Phòng cha" fe-admin (self-service org chart) + Update cycle-guard, Run #292; (4) **Hồ sơ Nhân sự master-detail giống NamGroup** — `EmployeesListPage` rewrite: 3-panel→**2-cột** (cây tổ chức gốc "SOLUTION COMPANY" + list chồng TRÁI · chi tiết 5 tab PHẢI) + tô màu accent, giữ 100% 5 satellite CRUD (16 endpoint), Run #293/#294/#295; (5) **PE mục "e. Link hồ sơ"** Mig 52 `AddHoSoLinkToPurchaseEvaluation` (`HoSoLink string?` hyperlink NAS + `` target_blank rel-noopener + null-safe) + rename "Dự trù PRO"→"Ngân sách PRO" (row+badge) ×2 app SHA256-mirror, Run #293. **State THẬT: Mig 52 · 88 bảng · 263 test (45D+218I) · 65 gotcha · menu 53 · bundle admin `BDwV5d0X`/user `DbVv6rsf`** (Run #295 `456c7a7` Employee-refine — user rotate `CZfo_PFZ→DbVv6rsf`, cicd PASS). **🔥 Workflow fan-out chạy THẬT lần đầu** (`pe-hoso-link-rename-pro` BE∥FE→review) — parallel disjoint-file OK, NHƯNG FE+reviewer return-RỖNG #53 → em main recover-disk + self-gate (bắt badge "DỰ TRÙ PRO" sót rename); **verdict: fan-out cho parallelism nhưng reviewer-stage không tin được trong harness này → verify-heavy task vẫn tự gác = tương đương spawn lẻ** (`feedback_workflow_fanout_reliability`). gotcha **#65** NEW (build csproj con ≠ `dotnet build slnx` gồm tests → miss test-compile khi đổi chữ ký record command → CI CS7036 Run #291 FAIL-gated). **Prev S64** adopt **Harness-7 writing-quality floor** — em main solo, commit `6afde19` docs/gov-only, 0 sub spawn: `rules.md §1.1` outward-VN-full-grammar + reviewer Category 6 + adap-report + email ai_infra; broadcast body-hash `a4580ea9` verified-MATCH **KHÔNG mis-stamp** [false-mismatch = gotcha #61 PS5.1 UTF-8 decode của em]. Prev S63 docs-closeout bù S60/S61/S62 — **State THẬT: Mig 50 · 88 bảng · 263 test (45D+218I) · 64 gotcha · menu 53 · bundle admin `0xKYGhhf`/user `C81ZdG9G` Run #286**; S60-62 = PE ràng buộc gửi-duyệt + bypass drafter (S60) · gỡ "Từ chối" (S60) · Mig 50 ngân sách per-gói-thầu Excel anh Kiệt + XÓA module Budget cũ (S61) · vượt-NS cảnh-báo-mềm cho lưu (S62); + reconcile stray reviewer cwd-misland; session log `2026-06-12-S60-S62-pe-budget-workitem-softwarning.md`). Prev Session 59 ( **10 đợt ship prod-verified: 8 Run PASS + 2 cancelled-supersede-benign #273→#282** (run_number API — dải đếm khác #38x S58, cùng pipeline; 2 cancel = push-đè khi UAT góp ý realtime, ancestor-verified): (1) **wipe transactional testing data** theo anh Kiệt FDC — 10 PE + 7 HĐ [DEMO] + 64 notif + 1 AwV2 cũ inactive = 0, reset PeSeq/CtSeq → phiếu thật đầu tiên team tạo chiều nay = **PE/2026/A/001** ✓, app-recycle KHÔNG resurrect (DemoSeed gate held), uploads orphan dọn (`56882ac` #273); (2+3) **PE tree Panel 1 chốt 4 tầng "📅 Năm > 📁 Dự án > 🧱 Hạng mục > Phiếu"** (anh chốt follow-up sau bản gộp "Dự án (Năm)"; `yearGroups` useMemo, expand-key v3, FE-only — list DTO đã có workItemName S57bis) (`0eafcd3` #274); (4) **dọn 15 mã hạng mục demo tự chế** theo chị Trà Sol "xóa cái đám phần thô phần hoàn thiện… MÀ ANH TỰ ĐẺ RA" — WorkItems 86→**71**, GỠ HẲN block seed demo khỏi DbInitializer, đối chiếu 71/71 khớp bảng PMH từng dòng (`bbd1554` #275, bundle frozen BE-only); (5) **rename 71 mã đúng format PMH anh Kiệt chốt** "MÃ CV gồm chữ MEP-SUB-1 rồi tên 1 MEP Sub MEP (Full) — đúng kiểu vậy" → `MAT-n`/`SUB-n`/`MEP-SUB-n`/`MEP-EQU-n` + Name "STT nhóm tên"; **DB-trước-code-sau** (gotcha **#62** NEW — seed per-code idempotent, sai thứ tự = 142 rows) + sqlcmd `-f 65001` (gotcha **#61** NEW — verify data qua API JSON, KHÔNG tin console mojibake) + FE sort numeric ×3 ×2 app (`c869d26` #276); (6) **UAT 6 vòng 11 điểm**: NEW **`ui/SearchableSelect`** combobox gõ-lọc BỎ DẤU (fold NFD — Hạng mục/Dự án/NCC) + auto Địa điểm từ Project.Location + điều khoản TT Textarea đa dòng (`faed59f` #277) · anh chốt: **ẩn cả Trả lại+Từ chối khi người duyệt = người soạn** (drafterUserId match) + **quick-add NCC ngay form** (SuppliersController POST hạ → any-auth, PUT/DELETE giữ khóa — cicd authz probe live 4/4: 401 unauth/201 nv.test/403 delete/cleanup) + upload multiple files ×2 chỗ (`9c330d2` #278) · vòng 3-6 realtime (`f21c55d` #279-cancelled / `69997da` #280 / `80b64dd` #281-cancelled / `792c030` **#282 FINAL**): **bảng NCC table-fixed** width từng cột (file dài hết vỡ layout) + **bỏ ô "Tên" ngân sách nhập tay** (chỉ còn Số tiền, hasManual detect theo amount) + **GỠ field "Điều khoản thanh toán" khỏi TẤT CẢ form phiếu** (cột per-NCC + display phiếu cũ GIỮ) + **bỏ nút "+ Thêm hạng mục"** (1 phiếu = 1 hạng mục header). Bundle FINAL admin **`B1DtNT9C`**/user **`D6uF3Mln`** (Run #282). Test 240 ×2 local + 8× CI gate. **0/14 spawn truncated** (lần đầu sau nhiều session). → session log `2026-06-11-S59-wipe-tree-pmh-uat-batch.md`. Prev S58 (2026-06-11 — **4 việc prod-verified Run #382/#383/#384**: lock-demo-user fix + tạm ẩn HRM/Office/Cá nhân + Danh mục cuối sidebar + fe-user redesign theo UI/UX guide AI_INFRA. **Việc 1 — lock fix** (Run #382, `5998163` ~3m31s): Run #381 cicd phát hiện S57bis lock = NO-OP (14 email named-person là population Dev-only). Recon dump prod: demo thật = 20 UAT-matrix `{dept}.{nv,pp,tp}@`+`bod.{1,2}@` tạo TAY 05-13; root cause sâu = `DemoUserPassword` 11 ký tự < prod `RequiredLength=12` → `CreateAsync` silent-fail MỌI startup từ trước tới giờ (= root cause "helpdesk inert phòng IT 0 user" S56). Fix: union 20 email + password 12 ký tự. Prod sau deploy: **55 user / 21 active / 34 locked** — 20 UAT + 14 named-person locked ✓, **nv.cao/nv.truong CREATED+ACTIVE (helpdesk S56 RESOLVED)** ✓, 5 real staff created ✓, guard admin/catalog.manager/nv.test/chuong.phan-typo active ✓ (anh chốt 3 quyết định AskUserQuestion). Bundle FROZEN. gotcha **#60** NEW (seed silent-fail vs prod password policy — dump population thật trước khi lock/seed-by-email). +Closeout S57bis residual: gotcha #59 commit, 4 spawn-record on-behalf (H2 4-MISS), H1 5-patch doc-drift, test 240 re-verified local. Prev S57bis (2026-06-11 sáng) — **PE gắn Hạng mục công việc (Mig 49) + mở quyền Pe all-role + menu "Cá nhân" + khóa demo user** (sếp Zalo deadline 15:00): commit `17b23a4` (Harness-4 two-tier runtime-VERIFIED spawn-test 2 chiều) + `dd117b7` (product) → Run #381 PASS ~4m25s. Mig 49 `AddWorkItemToPurchaseEvaluation`: PE.WorkItemId `Guid?` loose-Guid KHÔNG FK vật lý (convention PE — database-agent design) + IX + validator NotEmpty create + FK-guard handler Conflict + UpdateDraft null-safe. FE ×2 app PeWorkspaceCreateView/PeHeaderForm (SHA256 identical)/PeDetailTabs "Dự án – Hạng mục". Pe_* 11 key CanRead+CanCreate mọi role (130 rows/13 role — Pe_* leaf KHÔNG nằm MenuKeys.All, build qua factory). Menu Personal root@30 + Chấm công re-parent + Master write-lock `Admin,CatalogManager` ×3 controller. Test 228→**240** (+12 PeWorkItemGuardTests). Bundle rotate cả 2: admin `CP4CB1ym` / user `BmZ3VHnm`. 2 builder truncated #53 + reviewer die-0-byte ×2 → em main solo vá cross-stack + self-gate. Excel (3) đối chiếu = NO-CHANGE (S55 data identical). Prev S56 — **Pre-golive verify sweep + golive-harden 4 fix — HMW 2-workflow, prod-verified**: commit `a20cde8` → Run #379 PASS ~4m20s. WF1 `pre-golive-verify` 7-stream song song + adversarial → 6 PASS/1 CONCERN/0 blocker = **GO**; key finds = **ops not code** (prod IT-dept 0 active user → helpdesk inert + S43 LeaveBalance lost-update còn nguyên). WF2 `golive-harden` fix 4: **#3** LeaveBalance lost-update→atomic `ExecuteUpdateAsync`+Serializable tx (NO mig, exactly-once nguyên) · **#5** ItTicket authz Forbidden-trước-NotFound (fail-closed) · **#6** DocxRenderer null-guard (2 warn→0) · **#4** Travel/Vehicle ApproveV2 +4 smoke. Test **216→228**. Bundle FROZEN `4SUwDLD8`/`XdKzt9LL` (BE-only). `sys.tables` re-ground **92→93** (cicd ground-truth, Mig 48 col-only). reviewer stage StructuredOutput-fail→em main đỡ cross-stack review (3 diff clean) + bump Serializable đóng MAJOR. gotcha **#58** NEW (EF read-modify-write lost-update→ExecuteUpdate atomic). **2 ops VPS pending** (gán user phòng IT + `tzutil` UTC+7). FE Phase 2 redesign **deferred** (recon ready). Prev S55 — **Nạp master data thật từ Excel + Project +4 cột (Mig 48), HMW-mode ON**: commit `69cb393` → Run #377 PASS ~4m33s, prod-verified. Anh giao file Excel "HẠNG MỤC CÔNG VIỆC DỰ ÁN" → `/ultra-on "workflow làm xong hết"`. Nạp **62 dự án + 71 hạng mục + 3 NCC** vào Project/WorkItem/Supplier qua `SeedRealMasterDataAsync` (per-code idempotent, **UNGATED** → coexist demo, tự lên prod). **Mig 48 `AddProjectMasterFields`**: Project +4 cột nullable (Year/Investor/Location/Package, NO new table). FE ProjectsPage form +4 input ×2 app SHA256 mirror. Test 216 (compile-fix MasterCatalogFilteredUniqueTests +4 null args, no new test). Bundle admin `DmjI8Cmn`→`B-d6893W`/user `YxL_MljK`→`XdKzt9LL` (cả 2 rotate). Prod verify: Mig 48 applied · Projects spot-6/6 · WorkItems VT/TP/MEP/TB=71 · Suppliers 3 · CAL01.Investor="Công ty TNHH Calofic". **2 agent return truncated** (implementer-backend + reviewer, gotcha #53) → em main disk/runtime-recover (build/test/sqlcmd/git truth); cicd verdict-FIRST → PASS clean no-truncate. Data-quality catch: MEP col gộp 2 nhóm + divider "THIẾT BỊ" → split đúng 71/4-category. Provenance `scripts/master-import-data.generated.md`. Prev S54 — **IT staff tự reassign ticket (cross-stack authz, HMW-mode ON)**: 1 code commit `ca4b602` → Run #376 PASS ~4m18s, prod-verified. Cho tổ IT (dept Code=="IT") + Admin reassign ItTicket trên CẢ 2 app. BE: NEW `GetAssignableItStaffQuery` capability endpoint `{canReassign,staff}` + `AssignItTicketHandler` authz Admin-OR-dept-IT (Forbidden) + assignee-must-IT (Conflict) + controller `/assign` hạ `[Authorize(Roles=Admin)]`→`[Authorize]` (handler fine-grained). FE: fe-admin+fe-user ItTicketsPage **SHA256-identical** (REVERSE S53 divergence) gate nút by `canReassign`, dropdown từ `/assignable-staff` (không `/users`). Test 203→**216** (+13 authz guard test-before-merge). NO migration (DepartmentId reuse). Bundle admin `DfCfHUE9`→`DmjI8Cmn` / user `_3S0BPJ2`→`YxL_MljK` (cả 2 rotate). 6-agent fan-out (BE∥FE→test→reviewer→cicd) + em main reconcile stray-memory residual (3 agent ghi MEMORY nhầm `src/Backend/.claude` → harvest về canonical). reviewer PASS 0 blocker (role-string "Admin" chain-verified). Task 1 Phase 9 Ops KHÔNG làm (anh dừng). flag: cicd `sys.tables=93` vs STATUS 92 → monthly audit re-ground.) Prev S53 (gotcha #57 EXT Master Mig 47 + P11-D reassign-UI fe-admin + P11-E menu + database-agent verified-runtime: `44b9e54` Run #260 + `dbf6648` Run #261, test→203, bundle→`DfCfHUE9`). Prev S52 (Phase 11 P11-D+E+F deployed + database-agent adopt, HMW-mode ON): 3 commit — `e9ee97f` (database-agent DB1–DB11 read-advisory, roster 10→11, executed-file CHỜ restart) + `6a66429` Wave 1 (P11-E AttendanceReport+Excel+OtPolicy multiplier + P11-F MaTicket codegen, migration-free) + `dcf76f8` Wave 2 (P11-D ItTicket round-robin assign dept-IT + SLA timer, Mig 46). Test 186→**200**. Bundle admin `DYfjnpY0`/user `_3S0BPJ2` (cả 2 deploy verified curl độc lập — Wave 1 BE 401 wired + Wave 2 /assign 401 + Mig 46 applied health-200). ⚠️ **Session-limit hit giữa Wave 2** → recovery: BE/test verify-on-disk + em main solo FE redo + curl-self-verify thay cicd-spawn (multi-agent resilience, git/disk/prod = source-of-truth). RAG recovered (chunk 2416 rerank live) nhưng stale 05-29. Prev S51: P11-C Vehicle+Driver.) + · **Prev S92** (S92 — **Ẩn 5 nhóm menu (Hợp đồng + Danh mục + Nhân sự + Văn phòng số + Cá nhân) CHỈ Admin thấy trên eoffice — em-main-led verify+review+deploy, 1 commit prod-verified `1408d4e`, BE-only no-migration, HMW-mode ON**: anh `/session-start` thấy WIP S92 uncommitted (dated hôm nay) → AskUserQuestion chốt "verify + hoàn thiện + deploy". `RevokeTemporarilyHiddenModulesAsync` mở rộng predicate +Contracts/Ct_* +Master/Suppliers/Projects/Departments/Catalog* (cộng dồn S58 Hrm*/Off*/Personal) + TẮT 2 re-grant public (S65 HRM + S69 Office) → revoke = bước permission CUỐI trong SeedAdminPermissionsAsync (ungated, durable mỗi restart, gotcha #75) + thu hẹp InReviewScope→chỉ Pe_*. **PE giữ nguyên** cho user (Pe_* không match predicate; master-data GET any-auth → form PE vẫn chọn Dự án/NCC/Hạng mục dù menu Danh mục ẩn). +AdminOnlyModulesRevokeTests 3 (non-Admin revoked 4 cờ / Admin untouched / PE preserved). **Verify chain:** test 431→**434** (45D+389I, full-suite 0 fail) · seed-chain-order verified (revoke last + prod-durable) · predicate coverage verified (5 nhóm đủ; Forms/Reports/PurchaseEvaluations sibling top-level giữ-hiện đúng; no over-match) · **reviewer PASS** (5 attack vector A-E independ re-derive, 15/15 trên 3 class, 0 blocking). **FYI intended-by-spec, 0 live impact:** role CatalogManager (hiện **0 user** — S89 xóa hết test user) cũng bị thu Danh mục; re-enable cần carve-out predicate. **State THẬT: Mig 59 · 88 bảng · 434 test (45D+389I) · gotcha 76 · menu 54 · bundle admin `xz8FdmLN`/user `CA8Rla2w` (JS rotate #69, CSS frozen) · prod 17 user/7 NCC.** cicd **Run #358 PASS** prod-verified (sqlcmd: non-Admin 0 leak / Admin 5 giữ / Pe_* 120 untouched; ship-proof = dll-mtime + w3wp-recycle 08:04Z). **🔴 NEXT anh:** UAT eoffice login user non-admin → xác nhận KHÔNG còn thấy Hợp đồng/Danh mục/Nhân sự/VP số/Cá nhân (chỉ Duyệt NCC + Dashboard) · ⚠️ restart CLI (carry budget v3 + `/user-mark-*` + cadence). **NEXT em:** monthly audit 2026-07-01 (2 ngày) re-tier STATUS/HANDOFF mega-line + flush ef-core/Budget docs + vocab alias-map. → log `2026-06-29-S92-admin-only-modules.md`) · **Prev S91** (S91 — **buổi go-live LỚN em-main-led, 4 commit prod-verified + backup local** — go-live chính thức 26/06 anh Kiệt SOL-IT Phase-01 PRO+CCM. **#1 `159b69d`** guide Word bỏ "Từ chối" 2 chỗ + fix 12 caption Hinh→Hình [app gỡ Từ chối S60, guide đã phát công ty stale; unpack→XML→repack giữ 13 ảnh, verify python-docx]. **#2 `ba42c59`** wipe go-live `scripts/s91-wipe-golive.sql`: xóa 16 PE+16 PeWorkItemBudgets+94 notif+19 NCC demo, GIỮ 7 NCC thật+17 user+master, reset PeSeq→**A/001** [backup `SolutionErp_S91_pregolivewipe.bak` + 2 guard PE>16-abort/NCC≠19-rollback + AskUserQuestion scope]. **#3 `55494ad`** gate SeedDemoMasterData sau DemoSeed:Disabled — root-cause: seed ungated per-code resurrect 18 NCC demo mỗi restart → prod skip → verify demo_codes=0 qua 2 restart [gotcha #75]. **#4 `e81e87f`** user tự đổi mật khẩu: BE ChangePasswordCommand + POST /auth/change-password [Identity verify pass-cũ, fail-PasswordMismatch→field CurrentPassword] + FE 2-app ChangePasswordDialog/TopBar + 10 test; fix CS0104 ValidationException ambiguous [FluentValidation vs custom]. + **backup local** `backups/SolutionErp_golive_clean_2026-06-26.bak` 21MB + accounts.txt 17 tk [.gitignore +backups/+*.bak]. **State THẬT: Mig 59 · 88 bảng · 431 test [45D+386I, +10 ChangePassword] · gotcha 76 [+#75 seed-resurrect +#76 deploy-config-từ-.example] · menu 54 · bundle admin `DgQyuG7f`/user `BmbQon23` · prod 17 user/7 NCC/70 dự án/71 hạng mục/0 PE-HĐ.** **Lessons:** wipe-không-bền-nếu-không-gate-reseed [#75 root>symptom] · deploy render Production.json từ .example KHÔNG file-gitignored [#76] · em-main-led security-feature báo-trước + test-specialist + build/test gate thay fan-out [#53 cicd garbled-return→em-main self-verify-prod; test-specialist độc-lập bắt CÙNG CS0104] · Chrome-MCP screenshot kẹt SPA-SignalR document_idle [carry #74, guide-ảnh defer — anh "tự check"]. **🔴 NEXT anh:** ⚠️ restart CLI · review guide docx Word · đóng 2 tab eoffice em mở. **NEXT em:** curate test-specialist L1 OVER [carry] · monthly 2026-07-01 [re-tier mega-line + ef-core Mig→59 + Budget-removed docs/CLAUDE]. → log `2026-06-26-S91-golive-wipe-changepw-backup.md`) · **Prev S90** (S90 — **Chèn 12 ảnh khoanh-đỏ vào guide Word `docs/Huong-dan-Duyet-NCC.docx` (em tự chụp prod qua Chrome) + chẩn UltraViewer — em-main solo, 0 production code, HMW-mode ON**: anh `/session-start` → "mở chrome vào chụp ảnh dán vào luôn" (12 ô ảnh trống từ S89). Browser-driving = vòng-lặp thị-giác tuần-tự → **em-main solo** (KHÔNG fan-out Workflow, đúng decision-tree). **Pipeline tự-chế (gotcha #74 NEW):** MCP `save_to_disk` (Chrome MCP + computer-use) KHÔNG ra file truy-cập được env này → **PowerShell .NET `CopyFromScreen` + Win32 `EnumWindows`+lọc-process-`chrome.exe`+`SetForegroundWindow`** (lọc process vì app Claude-Code Electron cùng class+title "Solutions ERP" → khớp nhầm) chụp PNG 2560×1600 + **DOM overlay `window.__ccA`** khoanh-đỏ **element-based** (minLeft/maxLeft/exact/up/nth/**case-insensitive** — toạ-độ-cứng vỡ do viewport đổi 812↔833; label CSS-uppercase→case-insensitive) + crop 92/72 (banner CDP "Claude started debugging" s08/s12→146, verify montage dải-trên) + `python-docx add_picture(6.0")` fit-A4 (6.3" tràn vì A4 content=6.27") vào 12 table cell + caption "Hình N". 12 màn: login·menu+tạo·form-fields·NCC+báo-giá·NS+QT·checklist+gửi·inbox·detail+so-sánh·quyết-định·workflow-matrix+cờ-finalize·tạo-HĐ·cây-list. Verify **13 ảnh** (1 logo+12) + montage sạch-banner. **0 prod mutation** (xem-only, KHÔNG bấm Gửi/Duyệt/Trả-lại/Tạo-HĐ; `?mode=new` không tạo draft). anh tự login Admin. **Caveats guide (carry):** ① #9 app chỉ **Duyệt+Trả-lại** (gỡ "Từ chối" S60 → text guide stale, chờ anh OK sửa) · ② #10 workflow chưa bật finalize → chụp **cờ "Duyệt là KẾT THÚC quy trình"** thay badge sơ-đồ · ③ #11 KHÔNG bấm Tạo-HĐ (no created-contract shot) · ④ account=admin (sidebar nhiều menu admin). **UltraViewer (anh hỏi "sao bật"):** chẩn `UltraViewService` StartMode=**Auto**/LocalSystem standby, **0 kết-nối Established**, em KHÔNG mở (chỉ grant Chrome; computer-use screenshot **detect+mask** nó) → hướng-dẫn tắt self-serve (KHÔNG tự đổi system-setting, theo prohibited-rule). **State GIỮ NGUYÊN: Mig 59 · 88 bảng · 422 test · gotcha 74 (+#74) · menu 54 · bundle admin `DalcOhvb`/user `CdS4tX_2`.** docx committed closeout (docs-only CI-skip). **🔴 NEXT anh:** review docx trong Word + ⚠️ restart CLI (carry budget v3 + `/user-mark-*` + cadence) + (tùy) bật finalize 1 cấp → ảnh #10 badge / bấm tạo 1 HĐ thử → ảnh #11. **NEXT em:** sửa text "Từ chối"→"Duyệt/Trả lại" guide nếu anh OK · curate test-specialist L1 34.8KB OVER (carry S88). → log `2026-06-25-S90-guide-screenshots-insert.md`.) · **Prev S89** (S89 — **PE visibility/finalize batch + xóa 38 User test prod + Word guide, ~6 commit prod-verified, HMW-mode ON**: **D1 nháp riêng-tư** (`a71753b` Run #465, test 419→421) — IDOR fix nháp lộ qua cond#2 role (GetEligiblePhases Drafter/DeptManager→DangSoanThao) + **cond#3 V2-approver** (workflow pin lúc-TẠO → CEO approver thấy MỌI nháp = leak màn CEO) → 4 chỗ owner-only (GetEligiblePhases bỏ DangSoanThao · admin-inbox bỏ · list-cond3 guard · detail-authz guard) + PeDraftVisibilityTests · **D2 CCM giá-đề-xuất** (`f7bd97a`) gỡ `!readOnly` over-gate (gate thuần role mirror ô ngân-sách; BE setter fail-closed = chốt) · **D3 finalize-note 3-surface** (`f0bca77` test 421→422) BE +3 computed-field detail+list DTO **no-migration** + EF-subquery first-reachable + PeFinalizeChip 2-app (invest-WF `wf_341f7b29` + impl-WF `wf_3f57edb6`; **impl-FE return-rỗng #53** → em-main mirror fe-admin 4-file SHA + self-gate + PeFinalizeProjectionTests) + **flow badge "⚑ Duyệt thay CEO"** PeWorkflowPanel (`9c920ad`) + **matrix flag thứ-8** WorkflowMatrixViewPage thiếu allowApproverFinalize từ S87 (`fef4c33`) · **xóa User test** (`681b1ed`) recon prod (ssh sqlcmd) 55→giữ 17/xóa 38 (whitelist-keep + backup `SolutionErp_S89_preuserdelete.bak` + count-guard[30,45] + XACT_ABORT; KHÔNG approver-block FK; nv.test 1-PE) + gỡ seed SeedDemoUsers/Lock · **Word guide** `docs/Huong-dan-Duyet-NCC.docx` (skill docx, logo Solution, 8 phần, khoanh-đỏ 1→2→3, ảnh-chờ-chụp). **State THẬT: Mig 59 · 88 bảng · 422 test (45D+377I) · gotcha 73 · menu 54 · bundle admin `DalcOhvb`/user `CdS4tX_2` · prod 17 user thật.** **Lessons:** Designer-save = version-MỚI (phiếu pin version-cũ → finalize chỉ hiện phiếu-MỚI = "check rồi mà không thấy") · doc-drift thêm-flag-Designer-quên-surface-matrix-song-song · whitelist-keep + 3-lớp-guard prod-delete · WF-impl-FE-return-rỗng → em-main mirror + self-gate (≡ S65/S73). 🔴 NEXT em: curate test-specialist L1 34.8KB OVER + cicd 28KB + reviewer 27.7KB. NEXT anh: chèn 12 ảnh guide + restart CLI. → log `2026-06-25-S89-pe-visibility-finalize-userclean-guide.md`.) · **Prev S88** (S88 — **PE stability audit (frozen CEO-approved spec) → fix patchwork D1 + hoàn-thiện multi-winner D2, 2 deploy prod-verified, HMW-mode ON, audit-workflow + ~14 spawn**: anh giao review/invest/test lại Duyệt NCC, "chấp vá thì xử lý, tính năng đã ổn định". **Audit Workflow `wf_c15da996-be5`** (6 area × invest→review pipeline + full-suite test, 13 agent) → CORE SOLID (winnerQuoteTotal 3 site · SelectWinner clear · urgent fail-closed authz · drafter-exclusion notify · 2 finalize mechanism) + tách findings **safe vs behavior-affecting**. AskUserQuestion ×4 chốt max-scope: sửa-hết-safe + hoàn-thiện-joint-winner + bật-CEO-notify + create-contract = **1 HĐ/winner**. **D1 (`73cce1f` Run #347 PASS):** Block B financials re-key `SelectedSupplierId→IsWinner` (số "Giá trị kỳ này"=0 + peer-rollup bỏ-sót cho ≥2 winner) · **CEO-notify-on-urgent +SaveChanges** (notify chạy SAU SaveChanges duy-nhất → rớt âm-thầm, Director KHÔNG nhận; +6 `PeUrgentNotifyDirectorTests` real-notify-fixture) · **HoSoLink null-safe + clear-via-empty** (sửa header wipe link đã-set, bug-class S42/#73; null=preserve/""=clear; HoSoLinkRow gửi `""`) · #70 guard PRO budget row3/row8 · dời `SetPeCcmBudgetPeriod` PeSuggestedPrice→PeWorkItemBudgetFeatures · comment. Test 402→**413** (+11). **D2 (`1aa3bdb` Run success):** **create-contract 1→N** (Command→`List`; **ContractCodeGenerator self-commit seq mỗi call → gen TẤT-CẢ mã TRƯỚC Add → build N local → atomic final SaveChanges** = no partial-create; GiaTri single=details-sum legacy/≥2=per-winner quote-total draft-editable anh-Kiệt-UAT; pe.ContractId=first idempotency; controller `{contractIds}`) · **list-card winner names** (DTO +`WinnerSupplierNames` EF collection-subquery **translate-OK SQLite** verified) · FE dialog contractIds[]+"Đã tạo N HĐ" · PeListPanel join names. Test 413→**419** (+6: multi-contract 5 + EF-translate smoke). **State THẬT: Mig 59 · 88 bảng · 419 test (45D+374I) · gotcha 73 · menu 54 · bundle admin `BQq2eTP6`/user `dHa64I59`.** **Cách chạy:** em-main-led BE core (financial/coupled/design-heavy = create-contract multi + financials) + delegate impl-backend (relocate) ∥ impl-frontend (FE 2-app SHA-mirror) ∥ test-specialist (test-before bug + test-after feature) + reviewer adversarial **PASS** (codegen-sequencing + arg-order + no-partial-create verified) + cicd-monitor. **#53 truncation ×3** (test-specialist/reviewer/cicd-monitor return rớt ở MEMORY-over-budget step → em-main recover-disk + self-gate + **curl-self-verify deploy** thay cicd-verdict). **Lessons:** ContractCodeGenerator self-commit-seq → multi-entity create = gen-all-codes-TRƯỚC-Add → atomic SaveChanges (no partial) [[feedback_multi_entity_create_self_committing_codegen]] · cardinality single→multi grep MỌI consumer (audit bắt 2 BE financial read-site sót S87 FE-only sweep) [[feedback_cardinality_change_grep_consumers]]. **🔴 NEXT (em): curate test-specialist L1 34.8KB OVER-SOFT GẤP** (root #53 ×3; reviewer 27.1KB+FD 26.1KB WATCH). **NEXT UAT (anh Kiệt Ctrl+F5):** ① ≥2-winner Block B "Giá trị kỳ này" đúng số · ② GẤP→Director nhận chuông · ③ Link hồ sơ giữ khi sửa header · ④ ≥2-winner "Tạo HĐ" → N HĐ draft (xác nhận GiaTri per-winner=giá NCC chào). → log `2026-06-25-S88-pe-stability-audit-d1-d2.md`.) · **Prev S87** (S87 — **2 buổi PE feature LỚN prod-verified, HMW-mode ON, ~14 spawn (nhiều #53 truncate → recover-disk + reviewer cross-verify + em-main self-gate)**: **(1) CCM 3-fix Mig 58** (`f1b10e9` **Run #344 PASS** ~5m11s) — anh forward PDF "CCM 4 ý cần sửa PM" (BỎ mục 3 theo anh): **①multi-winner** chọn NHIỀU NTP/NCC/ĐVDV cùng trúng → `winnerQuoteTotal=SUM PurchaseEvaluationSupplier.IsWinner` (cột mới, backfill từ SelectedSupplierId 13/13; SelectWinner→multi-toggle `SupplierIds[]`; FE bảng so sánh tick-nhiều-ô + "Tổng chi phí đã chọn"); **②budget=0 hợp lệ** (submit-guard nới `is null` only KHÔNG `<=0`, +3 validator GTE0; fallback ProInitial chỉ-khi-null bảo-vệ 0-cố-ý); **④cấp KẾT THÚC quy trình** `ApprovalWorkflowLevel.AllowApproverFinalize` — admin bật per-cấp Designer, duyệt tới đó TỰ DaDuyet bỏ CEO (**opt-in→AUTO** theo anh "cho bật trong quy trình hay hơn" → gỡ runtime-flag, nhánh `if (matchingLevel.AllowApproverFinalize)`). **Self-review bắt 8 chỗ FE keyed `selectedSupplierId`** (null khi liên-danh ≥2 → vỡ submit-guard/checklist/computeGiaChaoThau/tạo-HĐ) → đổi `isWinner` (cardinality single→multi = grep MỌI consumer). Test 377→**395** (+20−2 rework auto). Bundle admin `aKuNip19`→**`CXCKlNay`**/user `BUsL0HeQ`→**`Di40ewrF`**. **(2) Section B 3-cột Mig 59** (`9b1ee0c` **Run #345** cicd-verifying) — anh AskUserQuestion chốt "mỗi cột nhập kỳ-này RIÊNG" → `PurchaseEvaluation.CcmBudgetPeriodAmount` + endpoint `PATCH /budget/ccm-period` role-gate Admin|CCM fail-closed; FE Section B (THỰC HIỆN) rewrite `` list → `
` 3 cột (Dự án—|PRO budgetPeriodAmount/proFull|CCM ccmBudgetPeriodAmount/ccmFull, `colCalc()` per-cột) qua **Workflow `wf_aafb18fe-d9d`** (BE→FE→test + 3-lane review: math PASS · authz PASS · mirror+FE return NULL → em-main self-gate mirror byte-identical + 402-test + 2-build verify). Test 395→**402** (+7 authz setter). **State THẬT: Mig 59 · 88 bảng (cicd flag 89 — drift cũ KHÔNG do Mig 58/59 AddColumn-only, re-ground monthly) · 402 test (45D+357I) · gotcha 73 · menu 54 · bundle admin `BABhPh2s`/user `DLulO6uP` (Run #346 — `0d3c0cf` tách khối nổi bật "4. Thông tin chọn thầu" FE-only PASS; #345 Section B = `C8lWxEQK`/`Kz5cSW2u`; #344 CCM-3fix = `CXCKlNay`/`Di40ewrF`).** **Lessons:** cardinality single→multi = grep MỌI read-consumer (impl sửa write-site sót dependent — `feedback_cardinality_change_grep_consumers`) · design-dialog (item4 auto-config qua workflow-config, Section B AskUserQuestion) tránh rework · workflow review-lane value dù 2 lane NULL (lane-return verify disk độc-lập → trust PASS dù impl return NULL). ⚠️ CCM setter command rơi `PeSuggestedPriceFeatures.cs` (lệch chỗ, dọn monthly). → log `2026-06-24-S87-pe-multiwinner-budget-finalize-sectionb.md`.) · **Prev S86** (`ae4f106` Run #343) — PE notify "cần duyệt" loại NGƯỜI TẠO phiếu (drafter không nhận chuông phiếu mình tạo dù là approver 1 cấp; +3 `PeApproverNotifyExcludesDrafterTests`; re-ground STATUS test 356→377/gotcha 71→73 sót-S85-closeout). · **Prev S85** — **buổi UAT anh Kiệt FDC CỰC LỚN: CV PRO 6-fix batch + clear-data + 6 vòng UAT + 2 ROOT-CAUSE + 5 SQL-fix — ~10 deploy prod-verified #334→#341, HMW-mode ON, ~12 spawn** — anh forward Zalo anh Kiệt + Tra Sol + long.chau realtime. **Batch CV PRO (Run #334 `5a61254`):** đọc file `Cần chỉnh sửa CV PRO.xlsx` = **8 ảnh chú-thích nhúng** (không phải bảng công thức) → 6 fix: C1 ẩn "c.Giá chào thầu"+"d.Bảng so sánh" form TẠO · C3 ô8 pre-fill từ row7 (Ngân sách còn lại) · C4a **live-recompute** ô3/8 chưa-Lưu (VndInlineEdit +onLiveChange, draftRow3/8) · C4b So-sánh=0→"Bằng ngân sách"/"—" · C5 hủy/đổi NCC winner (BE `SelectWinnerBody(Guid?)` clear-branch + FE dropdown/toggle) · C7 nút "Toàn màn hình" preview file. **Clear-data (`scripts/s85-wipe-uat-data.sql`, BACKUP-trước):** wipe 43 PE + 28 PeWorkItemBudgets + 1 HĐ + 32 notif + 21 NCC-test (CreatedAt≥06-11, giữ 22 gốc) + reset mã→A/001; AskUserQuestion chốt scope (xóa budgets + NCC-test); SET QUOTED_IDENTIFIER ON (filtered-index). **6 vòng UAT (#335→#338):** R1 D1 ẩn mục 3/4/5 + D5 auto-chọn quy trình (1 option) · R2 D2 drafter tự-gỡ cờ GẤP (nới S77 GỠ=TP→+drafter clear-cả-2, BE restructure SET/UNSET) + D3 ngân-sách-kỳ-này tự-nhảy từ "Ban hành lần đầu" (`proInitialAmount`, FE display + BE/FE submit-guard fallback `budgetPeriodAmount ?? proInitialAmount`) · R3 ràng tạo-phiếu (hint đỏ "thiếu gì") + D4 checklist xanh✓/đỏ✗ trường bắt-buộc · R4 checklist +"Quy trình duyệt". **2 ROOT-CAUSE (whack-a-mole→fix gốc):** **(R5 #339 `1263c0d`)** workflow MẤT khi bấm Sửa = **bug-class S42** — `UpdatePeDraftHandler` absolute-set `ApprovalWorkflowId=null` khi form Sửa KHÔNG gửi field → CLEAR (field SÓT khỏi pattern null-safe mà BudgetPeriodAmount/WorkItemId cạnh đã có) → fix `if (request.X is not null)` (gotcha **#73** NEW, +3 regression test) · **(R6 #341 `49ac086`)** "mới tạo báo 7h trước" = **TZ** — timestamps lưu UTC nhưng EF đọc `DateTimeKind.Unspecified` → System.Text.Json default serialize KHÔNG có 'Z' → FE `new Date(naive)`=local → lệch +7h (VN UTC+7) → **`UtcDateTimeJsonConverter`** global (AddControllers.AddJsonOptions) ép UTC-with-Z (gotcha **#72** NEW) — cicd verify API trả `createdAt:"…3154440Z"`. **5 SQL-fix** (2 đợt 3+2 phiếu workflow-less, gán QT-DN-V2-001 type-1, ssh prod). **Cách chạy:** em-main-led + impl-backend (C5 BE clear) + impl-frontend mirror + test-specialist ×3 (C5 +10 · urgent-authz +5 · workflow-preserve +3) + reviewer ×2 (truncated→em-main self-gate, memory-lesson) + cicd-monitor ×7 (7/7 PASS; ship-proof BE-only = `Application.dll`/`Api.dll` Last-Modified in-window, #69-REFINE). **Test 356→374** (+18). **State THẬT: Mig 57 · 88 bảng · 374 test · gotcha 73 · menu 54 · bundle admin `aKuNip19`/user `BUsL0HeQ` (Run #341, FE frozen #339+#341 BE-only).** **Lesson `feedback_root_cause_over_symptom`:** bug lặp-lại (SQL/tzutil band-aid không dứt) → truy field/case **LỆCH-quy-ước** rồi đưa vào pattern đã-đúng = fix 1 chỗ hết tái-diễn. → log `2026-06-23-S85-pe-uat-cvpro-rootcause-tz.md`.) · **Prev S84** — **bootstrap + flush session-start hot-feed cap-echo v3 + commit S83 cicd harvest-orphan (em-main hygiene, 0 production code)** — anh `/session-start` → 2 monitor INFORM: H1 bắt `session-start.md:114` còn cap CŨ `lead 60K/sub 20K/wf 16K` ≠ canonical budget v3 `220K/60K/50K` (S82 self-shrink chưa flush khi S83 owner-set lại); H2 bắt `cicd-monitor/MEMORY.md` = harvest S83 hợp-lệ (Run #333 + gotcha **#69-REFINE**: hash giữ-nguyên khi 0 `fe-*/src` đổi → ship-proof THẬT = `Last-Modified` in-window, KHÔNG hash-delta) sót khỏi closeout `f71654f`. Anh "Sao ko add luôn?" → em flush `session-start.md:114` echo cap → **220K/60K/50K + canonical-pointer "đọc số sống ở budget.json"** chống tái-drift (detector C2 KHÔNG track cap-number → echo-trần lệch âm-thầm lần đổi cap sau) + commit cicd harvest-orphan. **Lesson (`feedback_derived_flush_execution`):** monitor INFORM-only proposal về **derived→canonical flush** = em-main **EXECUTION** (B3 VERIFY→APPEND = verify-rồi-LÀM), KHÔNG gate user-confirm; chỉ **ĐỔI-con-số** mới = quyền anh (chủ-dự-án). archive-gate A7 GATE PASS 217/217 · 2 WATCH strike-1 (FD/test-spec, no-action). **State GIỮ NGUYÊN: Mig 57 · 88 bảng · 356 test · gotcha 71 · bundle `CsJetgZH`/`BVS0ApIm`.** ⚠️ restart CLI (command `.md` no hot-reload — runtime %-print mới ăn cap đúng). → log `2026-06-22-S84-session-start-cap-flush.md`.) · **Prev S83** — **(1) adopt H-15 v3 memory-budget full-parity (anh owner-directive) + (2) fix PE require-workflow create+submit (đóng lỗ hổng "quy trình cũ") prod-verified Run #333** — anh `/session-start` → directive budget Tầng-1 **220K**/mem-sub **60K**/wf-sub **50K** "nạp đầy cho đủ" → diagnose phiếu A/040 "quy trình cũ" → "(B) vá guard BE + test-before → deploy" → `/session-end`. **Part 1 H-15 v3 (commit `2c7fd63` docs-only CI-skip):** `token_governor` lead 200K→**220K**/mem-sub 20K→**60K**/wf-sub 16K→**50K** full AI_INFRA parity (sửa self-shrink S82 = AI tự-co-nhỏ, mark `RC-…01-58-01` cấm) + NEW `spawn_fill_directive` (nạp sub tới budget bằng prompt GIÀU — byte-cap MEMORY.md = 1 lát, prompt nạp phần còn lại; retire `≤8K-brief`) + engine **§G.5** + ACTIVE-MARKS H-15 **v3-delta** `RC-pqhuy1987-22-06-2026-16-35-37` (anh-directed, report-before-stamp). **Part 2 PE fix (commit `fc1f19d`, cicd Run #333 PASS ~4m59s):** validator `NotEmpty(ApprovalWorkflowId)` + submit-guard (SAU Section-3, TRƯỚC mutate phase) → phiếu null-workflow KHÔNG gửi-duyệt được (trước: kẹt nhánh V1-legacy = banner "quy trình cũ", không Bước/Cấp, "Lịch sử duyệt 0"). **Diagnose:** banner ⟺ `approvalFlow` rỗng ⟺ `ApprovalWorkflowId` null; A/040 **tự-khỏi-khi-reload ⟹ cache** (data-hỏng reload không khỏi — em KHÔNG đụng prod). **test-before RED→GREEN**, full-suite bắt **9 đỏ** → triage: 2 genuine-spec-conflict (V1-submit deprecated, data wipe S59) rewrite + 6 collateral giữ (dời guard sau Section-3) + 1 validator fix. **Test 354→356** (+2 validator). **#69-REFINE (cicd):** bundle KHÔNG rotate vì 0 fe-src change (Vite deterministic) — ship-signal THẬT = Last-Modified in-window KHÔNG hash-delta; bundle GIỮ admin `CsJetgZH`/user `BVS0ApIm` Run #333. State THẬT: **Mig 57 · 88 bảng · 356 test · gotcha 71 · bundle `CsJetgZH`/`BVS0ApIm`**. ⚠️ restart CLI activate budget v3 runtime. → log `2026-06-22-S83-h15v3-pe-require-workflow.md`.) · **Prev S82** — **adopt Harness-15-v2 (Tầng-1 hot-feed-lớn + L2/L3 bỏ-trần + %-print 2-đầu-phiên + ranh-giới vai-trò), 0 production code** — `/check-email AI_INFRA` (1 thư mới H15-v2-notify verify ✓✓ whole-file+body) + `/adap-apply all` (fan-out 29 broadcast vs 22 report → CHỈ H15-v2 MỚI; 7 còn lại verify = đã-phủ S72/S75/S79). em-main IMPLEMENT single-writer D9 (6 edit: `token_governor` L1 12K→per-role **lead 60K/sub 20K/wf 16K** · L2/L3 6K/4K→**NO-CAP** · engine §G.4 · session-start §2.1.6 + session-end §L.b(c) %-print · mark H-15 What-cell refine) + **REVIEW Workflow `wf_04667b25-5fa` 3-lane 3/3 PASS** (bắt 3 MINOR → fixed: volume "~42K" stale · mark pending-confirm flag · _index STAGE-2). **Ranh-giới vai-trò:** con-số = quyền CHỦ-DỰ-ÁN/anh, AI thực-thi + báo-% — sửa framing S81 "lead-authority" gộp nhầm AI-lead↔owner. mark H-15 **v2-delta anh-confirm** `RC-pqhuy1987-21-06-2026-01-58-01` (report-before-stamp). commit `aa3f0fe` push (docs-only CI-skip) + email AI_INFRA `a749bb6bd1be`. **State THẬT GIỮ NGUYÊN: Mig 57 · 88 bảng · 354 test · gotcha 71 · bundle `CsJetgZH`/`BVS0ApIm`.** ⚠️ restart CLI (session-start §2.1.6 + session-end §L.b(c) %-print runtime). → log `2026-06-21-S82-harness-15-v2-adopt.md`.) · **Prev S81** — **adopt Harness-15 memory-budget per-agent (token-governor + value-gate + work-state block)** — em main single-writer + 1 REVIEW Workflow (`wf_b7f3c8ac-b53` 3-lane: Part-A PASS · Part-B PASS · Honesty HONEST), **0 production code**. `/check-email AI_INFRA` STAGE 1 = **0 new directed** (outbox/se 4 file processed S79); fan-out diff → CHỈ **H15** unapplied (H14/v2.0/checklist-9-10/11 đã phủ S72/S75/S79). **8/8 🔴 floor:** A1 đo-SÀN persona-direct `Get-ChildItem` 4.3-13.3KB + harness-injected SE-ước-riêng 21K→**30K cap-riêng-SE** · A2 `token_governor` L1 12K/L2 6K/L3 4K (lead hard-cap) · A3 tách-nhà · B(a) nạp-đầy-no-token-saving · B(b) **value-gate** `value_protect` 10-pattern + gate-script FLAG **runtime-fired** (test-specialist gotcha#/guard) ⟂ keep-floor recency = mark `RC-…11` áp tầng-bộ-nhớ · B(c) **work-state block** `session-start §2.1.5` · B(d) 3-tệp-chốt verified (`hmw.js:124` MEMORY-PACK) · B(e) **2-governor** byte⟂token. **5/6 sàn = convention, chỉ (e)+đo-SÀN = mechanized (honest no-overclaim).** Review bắt **2 CONCERN** (anchoring + tool-attribution) → **fixed** (review→fix loop) + refresh stale `measured` block S71→S81. Artifacts: `memory-budget.json` + engine `§G` + `session-start §2.1.5` + `rules §6.6` + gate-FLAG + adap-report `2026-06-20-Governance-harness-15-memory-budget.md`. A7 217/217 · detector 26-flag baseline (0 new). ⚠️ **restart CLI** (session-start §2.1.5). **✅ mark H-15 stamped Active-High** (`RC-…23-07-37`, anh-confirm S81). **State GIỮ NGUYÊN: Mig 57 · 88 bảng · 354 test · gotcha 71 · bundle `CsJetgZH`/`BVS0ApIm`.** → log `2026-06-20-S81-harness-15-adopt.md`. · **Prev S80** — **curate L1 over-cap reviewer/inv-codebase/cicd → L2 archive** — em-main single-writer, archive-gate keep-floor-hit→manual condense-with-archive: 31 entries byte-exact (`sed`) +N−0 → `archive/2026-06.md` + 31 `_INDEX` substring pointer → **A7 GATE PASS 217/217**; stale foundation counts flushed (130/263→354 · 55→71 · Mig 40/55→57 · 84→88 · bundle→#330). **0 production code, state GIỮ NGUYÊN: Mig 57 · 88 bảng · 354 test · gotcha 71 · bundle `CsJetgZH`/`BVS0ApIm`.** WATCH (A6 strike-1): frontend-designer 26KB + test-specialist 28KB. Lesson: `_INDEX` substring **quote-free** (A7 quote-parser bắt escaped-quote PURO pointer self-grep miss). 9 agent-memory file, docs-only commit (CI skip). → log `2026-06-20-S80-curate-l1-overcap.md`. · **Prev S79** — **adopt User-Mark (H-12/13) canonical §P + Harness-14 (Eval/Budget/Outcome) + chữ-ký RC** — em main + 4 Workflow (invest `wf_82337f7f-95c` → review `wf_a7cbe93e-912` → align-re-review `wf_9d3beebb-a95` → H14-review `wf_4d4eba6f-8a0`), **0 production code**. Anh gõ `/user-mark-active-high` "áp đầy-đủ chính-xác nhất theo AI_INFRA" → áp **canonical §P đầy-đủ** (P1-P10): 4 lệnh `/user-mark-*` + ledger `.claude/governance/ACTIVE-MARKS.md` (Active-High/Active/Medium/Disable) + `harness-11-engine.md §E`+**§F** + `rules.md §6.6` objective-criteria. **3 mark Active-High stamped** anh-confirm (`RC-pqhuy1987-20-06-2026-10-29-09/10/11`). completeness-gate H-6→H-13 **ĐẠT** (H-8 11/11 inherit no-`[1m]`). §F floor 6/6 + maturity HONEST. 3 adap-report + email ai_infra (`7b8615b3`). Bài học: broadcast cô-đọng→canonical-command/§P là spec THẬT (bản đầu MUST/TRACK→align lại) · report-before-stamp dogfood · investigator residual-diary OK. State GIỮ NGUYÊN Mig 57·88 bảng·354 test·gotcha 71·bundle `CsJetgZH`/`BVS0ApIm`. ⚠️ restart CLI. → log `2026-06-20-S79-user-mark-harness-14-adopt.md`). · **Prev S78** — **PE: đính kèm file khi DUYỆT (UAT Tra Sol / 5 tester)** — người duyệt tải file của mình lên ngay lúc Duyệt thay vì Trả lại phiếu (tình huống thay đổi nhỏ). Reuse hệ attachment + enum `ApprovalAttachment=5` **MIGRATION-FREE** (int-stored, 0 schema change); endpoint `POST {id}/attachments` + authz có sẵn (handler không guard drafter-only → approver upload được). FE 2 app SHA-identical: `PeWorkflowPanel` picker multi-file + upload-TRƯỚC-chuyển-phase (file lỗi=không duyệt) + mục "📎 File đính kèm khi duyệt" (download/preview) + 2 filter fix loại purpose=5 khỏi "Bảng so sánh" (gotcha **#71** proxy-predicate pollution). commit `7886fd0` → **Run #330 PASS** ~4m56s (test gate **354**, bundle admin **`CsJetgZH`**/user **`BVS0ApIm`**, NO migration, smoke 4×200 + attachments 401-wired). **3 lỗi em tự bắt review-trước-deploy** (authz-verify handler · filter-pollution #71 · Dialog mirror-truncate fe-admin). em-main-led + self-gate (grep no-leak thay reviewer over-cap) + cicd-monitor verify. → log `2026-06-19-S78-pe-attach-file-on-approve.md`. · **Prev S77** — **buổi sản phẩm RẤT LỚN: 10 deploy prod-verified #320→#329 (anh Kiệt FDC + Tra Sol + Bích Phượng UAT realtime, HMW-mode ON)** — bundle cuối admin **`BqKD3Y23`** / user **`Cn-i349D`** (Run #329). **Mig 56→57** `AddPeSuggestedPriceNotes` · test 344→**354** (+10) · gotcha **70** (tái dùng #70). 10 việc PE: (1) cờ GẤP **pill** 🔴PRO/🟢CCM đồng bộ MỌI danh sách + inbox (#320, NEW `PeUrgentChips` ×2 app); (2) **focus mode** bấm phiếu→overlay (#321) → **revert** list về layout gốc bám-trái lấp-đầy (#322); (3) **Mig 57** ô 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ảng so sánh giá" + **guard #70** stale-echo (#323); (4) số âm → **đỏ + ngoặc** `(…)` hàng 7/8/9 (#324); (5) mục con **thụt dòng + gạch đầu dòng** phân biệt có-số/không-số (#325); (6) cờ gấp authz **BẤT ĐỐI XỨNG** GẮN=NV chức năng / GỠ=chỉ Trưởng phòng (DeptManager) (#326, asymmetric handler + button-by-state); (7) **tách chọn-phiếu (inline 3-panel) khỏi mở-rộng (overlay)** + nút "Xem mở rộng" mỗi dòng (`?expand=1`) (#327); (8) **chuông báo người duyệt** khi phiếu vào cấp họ — submit + mỗi approve-advance (#328, `LogTransitionAsync` notify current-level approvers); (9) banner phiếu **Trả lại** hướng dẫn gửi lại (#329). **3 lỗi em tự bắt khi review TRƯỚC deploy** (guard #70 stale-echo cho ô ghi chú · luật cờ-gấp bất-đối-xứng Tra Sol clarify giữa-chừng · double-mount PeDetailTabs Task H — intent-comment có nhưng code sót). Cách chạy: em-main + frontend-designer ×3 (focus/revert/decouple, FD2 stub-verify do backend-down #3) + implementer-frontend (pill/notes/sep/spelling) + implementer-backend ×2 (Mig 57 · approver-notify) + test-specialist ×3 (notes +7 · urgent symmetric→asymmetric REDO do clarify-after-dispatch) + cicd-monitor ×10 (10/10 PASS). **frontend-designer process-death giữa Task H → recover-disk** (edit hoàn-chỉnh trên disk, em-main build-verify + mirror). **🔴 NEXT (em): curate L1 over-cap GẤP** — reviewer **45KB** + cicd-monitor 37.6KB + inv-codebase 35.6KB (keep-floor-hit → manual SPLIT/condense; archive-gate A7 GATE PASS 186/186 integrity OK) + FD 26KB/test-spec 27.7KB WATCH strike-1. → log `2026-06-19-S77-pe-ux-batch-10-deploy.md`. · **Prev S76** — **PE ngân sách MA TRẬN 3 cột (Dự án|PRO|CCM) + bảng lưới `
` viền-ô + badge quyền-NS theo role** — anh Kiệt FDC + chị Trà Sol, go-live; anh giao `/ultra-on` "step-by-step + workflow-review-per-step, hoàn chỉnh rồi deploy". **3 commit prod-verified:** `e33481e` (feature Run #318 — Mig 56 + ma-trận-3-cột + badge designer/flow, `BhFDF9IJ`/`BAkuRl3C`) → `21d1f4e` (bảng lưới `
` theo phản hồi anh, Run #319 **`jOqxW4-p`**/**`DbsznVvR`**, smoke 3×200). **Part 1:** PRO sửa cột PRO (canEditPro), CCM sửa cột CCM (canEditCcm), Dự án FE hiển-thị-only; Mig 56 +ProInitial/ProAdjust additive + data-migrate ProEstimate→ProInitial (4 rows prod). **Part 2+3:** badge "✎ NS PRO/CCM" cạnh approver (suy từ role, display-only no-authz) ở Workflow Designer + flow Duyệt NCC. Test 339→**344** (+5). **2 workflow review** (Part 1 PASS + Part 2/3 PASS) — reviewer bắt **race mất-dữ-liệu** Part 1 (impl self-review sót) → vá `useIsFetching` 2 app, **gotcha #70 NEW**. Lessons: flex+gap KHÔNG ra "bảng" → phải `
` viền-ô · workflow-review-flaky (2-3 lane empty #53) → em-main self-gate lane rỗng. **NEXT:** 🔴 curate L1 over-cap (reviewer **45KB** + inv-codebase 35KB keep-floor-hit manual-condense; cicd 29KB + test-spec 28KB strike-1). → log `2026-06-19-S76-pe-budget-matrix-table-grid.md`. · **Prev S75 (2026-06-18)** — **Harness-11 adopt: engine bộ-nhớ-và-governance TỰ-BẢO-TRÌ + 2 double-check** — anh giao `/check-email AI_INFRA` + `/adap-apply` (mỗi stage workflow-review) + double-check ×2 + finalize report + push + session-end. em main + **5 Workflow** (audit `wf_7fdc3bd5-930` → implement `wf_c5e5844e-7c1` → review `wf_d7ca1ff8-942` → double-check `wf_a0b68d2f-30e` → checklist-verify `wf_39cd4cbe-f07`). **0 production code.** Built `scripts/governance-detectors.ps1` (C1 broken-pointer + C2/B3 staleness + C3 vocab-fork + C4 self-exclusion + C5 resolve, NO-API DÒ+FLAG, runtime **26 flag** bắt drift thật, C4 0-self-match) + `scripts/memory-archive-gate.ps1` (PHẦN A hysteresis 0.85/keep-floor 5/2-strike/A7 NO-API 186/186) + `docs/governance/harness-11-engine.md` canonical (3-tier D5/D6/D7 EXPLICIT + one-direction-lock D8) + **B1 ×11 count→pointer `docs/STATUS.md`** (drift mig53→55/test306→339/gotcha68→69/table93→88 RESOLVED) + cadence-wire session-start §2.1.3 (D1) + session-end §L.b(c) (D2) + agents/README Upgrade S75. **completeness-gate FORMAL ĐẠT** (B 4/4 + C 5/5 + D 11/11 đủ-trọn, A 🟡 tailored — A6 runtime cần 2×-Apply legit-by-design). **gotcha #30 reinforced** (box-glyph ├└─ KHÔNG vào .ps1 — PS5.1 -File ANSI mojibake, KỂ CẢ qua Edit render-normalize; detector pure-ASCII verified). 3 commit `e70c046`+`ae957c4`+`aa09e99` pushed + adap-report + email ai_infra (`2316773229f2`). **State THẬT GIỮ NGUYÊN: Mig 55 · 88 bảng · 339 test · gotcha 69 · menu 54 · bundle `BYF5vIMJ`/`CB-tiRxd`.** ⚠️ restart CLI (cadence §2.1.3/§L.b + ef-core skill). 🔴 curate-debt: reviewer 38.8KB + inv-codebase 31.5KB + cicd 26.8KB over-cap (archive-gate confirm; reviewer+inv keep-floor hit → manual split). → log `2026-06-18-S75-harness-11-adopt.md`. **Prev S74** — **PE ô "Ghi chú từ CCM" ngân sách gói thầu (Mig 55)** — anh forward 2 luồng Zalo (Trà Sol + Kiệt FDC) "CCM cũng giống PRO cho nhập + ghi chú, hiện 0 hết" → em-main BE+Mig55 ∥ implementer-frontend FE 2 app SHA-mirror ∥ test-specialist (chết rate-limit → recover-disk). 2 fork anh chốt qua AskUserQuestion: **thêm CcmNote (Mig 55)** + **GIỮ phân vai CCM** (CostControl/Admin). Entity `PeWorkItemBudget +CcmNote` mirror ProNote · `UpdatePeBudgetCcmCommand +CcmNote` absolute-set role-gate fail-closed · DTO+controller+mapping · FE dòng "Ghi chú từ CCM" gate `canEditCcm` (sau V0/hiệu chỉnh, absolute-set đủ 3 field). Mig 55 additive-nullable sạch (no #63). Test 334→**339** (+5 CcmNote). **Chẩn đoán "0 hết không nhập":** tài khoản thiếu role CostControl (KHÔNG bug) → UAT bằng CCM/Admin. commit `8655ebf` push main (cicd **Run #315 PASS** ~4m54s — Mig 55 applied prod, bundle admin `BYF5vIMJ`/user `CB-tiRxd`, smoke 4×200). Lessons: controller call-site thiếu arg sau +param record (grep+vá, #65 bắt) · agent-kill-529 recover-disk no-re-spawn · PS here-string commit-msg trong if-block mis-parse → `git commit -F`. → session log `2026-06-18-S74-pe-ccm-note.md`. **Prev S73** — **Mig 54 PE giá đề xuất PRO/CCM + CEO chọn giá chốt + CCM duyệt-done ô-tích (anh Kiệt FDC — go-live so-sánh-giá thứ Hai 22/06)** — em main + 6 sub + 2 review-workflow. **2 commit prod-verified:** `1d86abc` (feature, cicd Run #313 PASS — Mig 54 + bundle admin `OlNyG9OD`/user `DSzSLVtL`) + `6aa4dcb` (FE empty-candidates guard fix). **BE:** Mig 54 `AddPeSuggestedAndApprovedPrice` 5 cột additive-nullable (ProSuggestedMin/Max·CcmSuggested·ApprovedPriceAmount·Source) + 2 setter role-gate PRO/CCM (Forbidden fail-closed mirror budget) + ApproveV2 **③ AUTO→OPT-IN** (`finalizeByCcmDelegation` ô-tích, gỡ auto-threshold S69) + **① bind giá chốt** mọi nhánh DaDuyet (human bắt-buộc-chọn, isSystem-miễn) + DTO +7 field/capability. **FE 2 app SHA-mirror:** PeWorkflowPanel (bộ chọn giá + ô tích CCM + fix empty-candidates) + PeDetailTabs `SuggestedPriceRows` + types +7. **Test 306→334** (+28). **2 workflow review (bài học):** R1 schema-force CHỈ **1/4** lane returned (flaky no-StructuredOutput) → R2 **free-text 2/3 PASS** — rủi ro #1 FE empty-candidates = **UNREACHABLE** (submit-guard `:194` chặn gửi-duyệt khi winnerQuoteTotal≤0). → review fan-out dùng **free-text / hmw RUN-TRACE**, KHÔNG ép-schema inline. **Governance honest:** em lệch mandate auto-Workflow (mode-ON) + chỉ khai khi anh hỏi → **cam kết báo-TRƯỚC-khi-lệch**. Run-trace `runs/2026-06-18-mig54-pe-review/` (custom-inline, bù post-hoc). → session log `2026-06-18-S73-pe-gia-de-xuat-ccm-done.md` pending. · **Prev S72** — **Harness-10 flat-refine + checklist-v2 adopt (re-audit 3-workflow) + sleep NO-OP** — em main + 9 sub qua 3 Workflow (audit `wf_13868efb-ea7` → implement `wf_ac43b5ff-7d1` → review `wf_d482e10d-5dd`, mandate Harness-9 B1+B2). Anh chỉ "sisters làm tốt mỗi SE thiếu" → re-audit đo vs canonical: **SE BEHIND Harness-10 flat** (run-trace còn SUBFOLDER, canonical=FLAT) → migrate `hmw.js` (`:103` sub-md/→flat + `:52` schema + **H4.5→H8 doc-drift**) + `workflows/README` full-rewrite + `runs/README` + session-start/end + `agents/README` Upgrade S72 + `_ledger`; **5 run cũ S71 GIỮ subfolder** (C8 dual-accept). +2 broadcast 06-18 adopt (checklist-v2 + h10-flat-detector-refine). +`/sleep-recovery-memory-l2` port (A8, §J2-tailored SE-only, floor intact, live skill). **detector refine-b TAILORED-OUT** (SE Workflow-tool no-CLI-bypass; containment git-diff+tracked+orphan-scan G-015). **REVIEW (B2 dogfood) bắt 2 lỗi IMPLEMENT-self-assess sót** (hmw.js:52 schema-stale + sleep-cmd auto-check un-wired overclaim) → fixed (auto-check **WIRED thật**: budget.json `+last_sleep_at` + session-start:78 + session-end:48, grep-verified). em-main containment-check tự bắt 1 reviewer residual-write (raw-Workflow KHÔNG hmw.js writeGuard → reverse-finding #4) → revert. **B3 self-correct:** S71 report path tắt `runs/`+"14" → thật `.claude/workflows/runs`=22. **Sleep `all`=NO-OP** (5/9 empty-archive + 4/9 đã-gisted → 0 compressed; `last_sleep_at`=2026-06-18). **0 production code, state THẬT GIỮ NGUYÊN.** adap-report `2026-06-18-Governance-harness-10-flat-refine-checklist-v2` + email ai_infra (`5f511fe5c0f2`). ⚠️ **restart CLI** activate FLAT-runtime hmw.js + wired sleep-check + sleep-recovery skill. 🔴 **NEXT (em):** curate investigator-codebase L1 **28973 OVER** (audit-trail) + watch frontend-designer/test-specialist near-cap. → session log `2026-06-18-S72-harness-10-flat-refine.md`. **Prev S71 — Harness-10 adopt: tracked run-trace folder convention + checklist 9-10 self-verify** — em main + 3 Workflow (invest `wf_9c2cd2cd-2e7` → implement `wf_e4e46725-231` → review `wf_636bc95b-939`) theo mandate Harness-9 PART 2. **0 production code** (governance/workflow only). Migrate `.claude/workflows/wave-*/` gitignored → `runs//` **git-TRACKED** (run.md + sub-md/ + harvest/) + `_ledger.md` 2-nhịp + 3-layer anti-miss (L1 em-main@P1 ledger-check / L2 session-start orphan-scan / L3 session-end close-gate **idempotent-VERIFY-not-re-APPEND**) + **containment model shift** (Harness-2 B6 "mọi tracked-change=vi-phạm" → Harness-10 "tracked-change NGOÀI run-folder + code-disjoint=vi-phạm"; run-folder TRACKED → HIỆN git-diff = audit trực-tiếp). hmw.js wave→run-trace (accept `args.run`, alias `wave`; path `sub-md/`; `node --check` PARSE-OK). **Review độc-lập (R2+R3) bắt C5 L1 over-claim** (doc nói hmw.js prompt-builder emit L1 reminder nhưng grep engine=0 → engine no-fs → fixed path-a: L1 = em-main @P1 convention) — dogfood mandate B2 đúng (1-workflow-tự-chấm sẽ bỏ sót). **checklist 9-10:** Part A (Harness-9 memory) + Part B (adap 2-workflow) ĐÃ done S70; Part C (Harness-10) MỚI 8/8. dogfood: 3 run-trace folder TRACKED đầu + 3 entry ledger. adap-report `2026-06-18-Governance-checklist-harness-9-10` + email ai_infra. **State THẬT GIỮ NGUYÊN: Mig 53 · 88 bảng · 306 test · 68 gotcha · menu 54 · bundle admin `BgNCjwsG`/user `CBvh0vtf`.** + `CLAUDE.md` test-flush 263→306 (pre-existing uncommitted, resolve H1 stale-flag). ⚠️ restart CLI activate hmw.js RUN-TRACE runtime + (carry S66/S70) §2.1.2 budget-audit/reviewer-Cat-6/H8-inherit. ✅ **curate-debt CLOSED S71** (FINALIZE double-check `wf_73de399d-753` + curate `wf_f32987b8-03f`): reviewer 36.7→24.8KB + investigator 29.8→23.2KB (both <25600 cap, archive +N -0 0-byte-loss) + reviewer-gist gen:2 + 3 user-memory G2/G3 + budget.json re-measure. Race root-cause fixed cấu-trúc (hmw.js RUN-TRACE writeGuard). → session log `2026-06-18-S71-harness-10-run-trace.md` (pending). **Prev S70** — **Harness-9 adopt: L2 archive dark-matter recovery + adap 2-workflow mandate** — em main + 3 Workflow (investigate `wf_be952f3c-97f` → implement `wf_a58e0d15-beb` → audit `wf_9520d8cd-4fe`) + 2 monitor bootstrap. **0 production code** (governance/memory only, commit `f36aab8` pushed). 4 over-cap sub-agent (cicd-monitor/investigator-codebase/reviewer/implementer-backend) curate L1→L2 + `archive/_INDEX.md` (mục-lục con-trỏ **substring sha-keyed**, Ctrl-F fallback) + `.gist.md` (nén 4-field distill-gen:1, verbatim FROZEN) → **cả 4 < 25KB auto-inject cap** (P1 curate-debt CLOSED; ~240KB archive hết RAG-dark). PART 2/3 process-mandate codify (adap-apply + agents/README Upgrade S70 + session-start §2.1.2 budget-audit). **0-byte-loss git+sha verified** (Stage C audit + em-main self-gate khi 2 reviewer no-StructuredOutput). +`memory-budget.json` (seed-by-measure) + `scripts/measure-agent-memory.ps1` + `.ragignore` + doc-drift 4-cite flush. adap-report + email-back ai_infra (body-hash `7c07b716e775`). **State THẬT GIỮ NGUYÊN: Mig 53 · 88 bảng · 306 test · 68 gotcha · menu 54 · bundle admin `BgNCjwsG`/user `CBvh0vtf`.** ⚠️ restart CLI để activate session-start §2.1.2 + pending H8 inherit + reviewer Cat-6. → session log `2026-06-17-S70-harness-9-l2-recovery.md`. **Prev S69** — **Văn phòng số (E-Office) port + golive + PE cờ gấp/ngưỡng CCM — 4 deploy prod-verified Run #305→#308, HMW-mode ON, 2 workflow fan-out + ~14 spawn**: foundation PURO (shared PageHeader/KpiCard/WidgetCard + Dashboard 2-cột + sync fe-admin index.css đóng drift S66-S68) #305 → **re-skin TRỌN 10 page** PURO layout + CSS Hồ sơ NS, phẫu-thuật-giữ-100%-logic (reviewer verify api/queryKey byte-identical) #306 → **Office golive public** `SeedAllRolesOfficeModulePermissionsAsync` read+create 16-key allow-list mọi role (mirror S65 pattern, chạy SAU revoke; excluded Off_PhongHop_Manage/Off_AttendanceReport/Off_ChamCong giữ ẩn; cicd DB-verify 16/16×13 role) #307 → **PE cờ gấp PRO/CCM + CCM duyệt-final theo ngưỡng giá trị** Mig 53 (anh Kiệt FDC sau họp sếp) #308. **State THẬT: Mig 53 · 88 bảng · 306 test (45D+261I) · 68 gotcha · menu 54 · bundle admin `BgNCjwsG`/user `CBvh0vtf` Run #308.** 2 gotcha NEW (**#67** Tailwind accent palette thiếu-stop vỡ-màu-im-lặng · **#68** stale-diagnostic-background-agent). 2 truncation #53 (impl-backend positional-record + impl-frontend) → em main recover-disk + self-gate (cả 2 build PASS sau-cùng). C (sau duyệt → chuyển phiếu đến dự án) chờ anh Kiệt spec form. → session log `2026-06-17-S69-vanphong-golive-pe-urgent-threshold.md`. **Prev S68** — **Hồ sơ NS header chi tiết NV: làm nổi bật + fix tên render đen→trắng** — em main solo, 3 commit (2 FE `6983609`+`37752eb` · 1 docs `11bc96d`), 2 deploy prod-verified Run #303-304 (anh UAT realtime): tên `text-xl extrabold`+drop-shadow · dòng meta `text-[13px] font-medium` trắng-đậm · badge pill **màu theo trạng thái** (#303); anh báo "tên đen nền xanh ko nổi bật" → diagnose **rule `h1-h4{color:#0b1220}` viết NGOÀI `@layer` thắng `text-white`** (Tailwind v4 unlayered > all layers, **gotcha #66 NEW**) → ép `text-white!` + thu nhỏ `text-lg` (#304, grep dist confirm `!important`). Bootstrap: 2 monitor RE-REPORT CLEAN + 2 doc-drift fix (dep-audit 64→65 · root CLAUDE 263→286, H1 flag). **State THẬT: Mig 52 · 88 bảng · 286 test · 66 gotcha · menu 53 · bundle admin `CNUv1jxY`/user `CpOskeS1` Run #304.** ⚠️ curate-debt P1: cicd-monitor **44.1KB** (worst). **Prev S67:** **buổi sản phẩm LỚN, 6 deploy prod-verified Run #297→#302** (anh + anh Kiệt FDC UAT realtime, HMW-mode ON): fe-user Hồ sơ NS đồng nhất font + chữ đen→**xanh đậm `brand-800`** (#297 `ab4e681`) · **fe-admin mirror master-detail** + accent tokens index.css [đóng pending lớn nhất HRM go-live, page SHA256 ×2] (#298 `292d64d`) · **+23 test-after HRM** [Dept cycle-guard · PE HoSoLink absolute-set · HRM-perm seed] → 263→**286** (#299 `bcd619d`) · **list flex-row gọn** [bảng 3-cột→flex-row, `overflow-x-hidden` → hết tràn ngang rail] + đồng nhất cỡ chữ [18/14/13/11px] ×2 app (#300 `91aaf05`) · **PE Link hồ sơ auto-detect** `http(s)`→hyperlink/`O:\`→Copy (#301 `6df1b2d`) → **render link `file://` bấm-thử** + Copy (#302 `536dd6b`). **Workflow research 3 investigator-api** (auto-mở `O:\` từ web): default browser CHẶN https→file://; **chỉ Edge GPO `IntranetFileLinksEnabled`** (Edge-only, Intranet Zone, 1 GPO domain zero-per-machine) = one-click thật — Chrome không có; .url-download zero-install nhưng 2-click. **State THẬT: Mig 52 · 88 bảng · 286 test (45D+241I) · 65 gotcha · menu 53 · bundle admin `CcrZqfht`/user `DniDFUB_`** (#302). test-specialist truncated return #53 → em main recover-disk (3 file test đủ + 286 verify); 0 production bug. ⚠️ curate-debt: cicd-monitor 39.8KB + inv-codebase 39.4KB over-cap. **Prev S66** — **session-end closeout em-main-solo, 0 product-sub:** adopt **Harness-8 all-inherit** (7 sub demoted `claude-opus-4-8`→`inherit` → cả 11 = inherit, gỡ two-tier Harness-4) + **cicd-monitor L1 curate 86.8→28.9KB** (byte-exact sed → `archive/2026-06.md`, incl #291 forensic) + **ef-core skill doc-flush Mig 50→52** (H1 drift, +Mig 51/52 rows) + check-email AI_INFRA (**0 thư mới se-directed**). ~17 file docs/gov/config, **0 production code** → state THẬT GIỮ NGUYÊN: **Mig 52 · 88 bảng · 263 test · 65 gotcha · menu 53 · bundle admin `BDwV5d0X`/user `DbVv6rsf`**. ⚠️ **Restart CLI** để H8 runtime (frontmatter no hot-reload) + reviewer Category 6 (S64 pending). adap-report `2026-06-16-Governance-harness-8-all-inherit-workflow-fastest` + email-back ai_infra (hash `fa7f690d` round-trip MATCH). Prev S65 — **HRM go-live: public Hồ sơ Nhân sự + trang master-detail giống NamGroup + Department hierarchy + PE Link hồ sơ**, ~6 deploy prod-verified Run #289→#295, anh + anh Kiệt FDC UAT realtime): (1) **public Hồ sơ Nhân sự mọi role** — `SeedAllRolesHrmProfileReadPermissionsAsync` grant CanRead `Hrm`+`Hrm_HoSo` 13 role chạy SAU revoke S58 (upgrade-only; EmployeesController policy-based `Hrm_HoSo.Read` mở luôn API không hardcode Roles), giữ ẩn Dashboard NS, Run #289; (2) **redesign màu foundation fe-user** — accent palette teal/violet/amberx/greenx + `.app-gradient-brand`/`.card-accent`/`.icon-chip` + heading 700, brand #1F7DC1 + Be Vietnam Pro giữ, Run #290; (3) **Department hierarchy** Mig 51 `AddDepartmentParentId` (ParentId loose-Guid no-FK + `GET /departments/tree` ráp cây in-memory + rollup count theo `User.DepartmentId` + cycle-guard HashSet) + picker "Phòng cha" fe-admin (self-service org chart) + Update cycle-guard, Run #292; (4) **Hồ sơ Nhân sự master-detail giống NamGroup** — `EmployeesListPage` rewrite: 3-panel→**2-cột** (cây tổ chức gốc "SOLUTION COMPANY" + list chồng TRÁI · chi tiết 5 tab PHẢI) + tô màu accent, giữ 100% 5 satellite CRUD (16 endpoint), Run #293/#294/#295; (5) **PE mục "e. Link hồ sơ"** Mig 52 `AddHoSoLinkToPurchaseEvaluation` (`HoSoLink string?` hyperlink NAS + `` target_blank rel-noopener + null-safe) + rename "Dự trù PRO"→"Ngân sách PRO" (row+badge) ×2 app SHA256-mirror, Run #293. **State THẬT: Mig 52 · 88 bảng · 263 test (45D+218I) · 65 gotcha · menu 53 · bundle admin `BDwV5d0X`/user `DbVv6rsf`** (Run #295 `456c7a7` Employee-refine — user rotate `CZfo_PFZ→DbVv6rsf`, cicd PASS). **🔥 Workflow fan-out chạy THẬT lần đầu** (`pe-hoso-link-rename-pro` BE∥FE→review) — parallel disjoint-file OK, NHƯNG FE+reviewer return-RỖNG #53 → em main recover-disk + self-gate (bắt badge "DỰ TRÙ PRO" sót rename); **verdict: fan-out cho parallelism nhưng reviewer-stage không tin được trong harness này → verify-heavy task vẫn tự gác = tương đương spawn lẻ** (`feedback_workflow_fanout_reliability`). gotcha **#65** NEW (build csproj con ≠ `dotnet build slnx` gồm tests → miss test-compile khi đổi chữ ký record command → CI CS7036 Run #291 FAIL-gated). **Prev S64** adopt **Harness-7 writing-quality floor** — em main solo, commit `6afde19` docs/gov-only, 0 sub spawn: `rules.md §1.1` outward-VN-full-grammar + reviewer Category 6 + adap-report + email ai_infra; broadcast body-hash `a4580ea9` verified-MATCH **KHÔNG mis-stamp** [false-mismatch = gotcha #61 PS5.1 UTF-8 decode của em]. Prev S63 docs-closeout bù S60/S61/S62 — **State THẬT: Mig 50 · 88 bảng · 263 test (45D+218I) · 64 gotcha · menu 53 · bundle admin `0xKYGhhf`/user `C81ZdG9G` Run #286**; S60-62 = PE ràng buộc gửi-duyệt + bypass drafter (S60) · gỡ "Từ chối" (S60) · Mig 50 ngân sách per-gói-thầu Excel anh Kiệt + XÓA module Budget cũ (S61) · vượt-NS cảnh-báo-mềm cho lưu (S62); + reconcile stray reviewer cwd-misland; session log `2026-06-12-S60-S62-pe-budget-workitem-softwarning.md`). Prev Session 59 ( **10 đợt ship prod-verified: 8 Run PASS + 2 cancelled-supersede-benign #273→#282** (run_number API — dải đếm khác #38x S58, cùng pipeline; 2 cancel = push-đè khi UAT góp ý realtime, ancestor-verified): (1) **wipe transactional testing data** theo anh Kiệt FDC — 10 PE + 7 HĐ [DEMO] + 64 notif + 1 AwV2 cũ inactive = 0, reset PeSeq/CtSeq → phiếu thật đầu tiên team tạo chiều nay = **PE/2026/A/001** ✓, app-recycle KHÔNG resurrect (DemoSeed gate held), uploads orphan dọn (`56882ac` #273); (2+3) **PE tree Panel 1 chốt 4 tầng "📅 Năm > 📁 Dự án > 🧱 Hạng mục > Phiếu"** (anh chốt follow-up sau bản gộp "Dự án (Năm)"; `yearGroups` useMemo, expand-key v3, FE-only — list DTO đã có workItemName S57bis) (`0eafcd3` #274); (4) **dọn 15 mã hạng mục demo tự chế** theo chị Trà Sol "xóa cái đám phần thô phần hoàn thiện… MÀ ANH TỰ ĐẺ RA" — WorkItems 86→**71**, GỠ HẲN block seed demo khỏi DbInitializer, đối chiếu 71/71 khớp bảng PMH từng dòng (`bbd1554` #275, bundle frozen BE-only); (5) **rename 71 mã đúng format PMH anh Kiệt chốt** "MÃ CV gồm chữ MEP-SUB-1 rồi tên 1 MEP Sub MEP (Full) — đúng kiểu vậy" → `MAT-n`/`SUB-n`/`MEP-SUB-n`/`MEP-EQU-n` + Name "STT nhóm tên"; **DB-trước-code-sau** (gotcha **#62** NEW — seed per-code idempotent, sai thứ tự = 142 rows) + sqlcmd `-f 65001` (gotcha **#61** NEW — verify data qua API JSON, KHÔNG tin console mojibake) + FE sort numeric ×3 ×2 app (`c869d26` #276); (6) **UAT 6 vòng 11 điểm**: NEW **`ui/SearchableSelect`** combobox gõ-lọc BỎ DẤU (fold NFD — Hạng mục/Dự án/NCC) + auto Địa điểm từ Project.Location + điều khoản TT Textarea đa dòng (`faed59f` #277) · anh chốt: **ẩn cả Trả lại+Từ chối khi người duyệt = người soạn** (drafterUserId match) + **quick-add NCC ngay form** (SuppliersController POST hạ → any-auth, PUT/DELETE giữ khóa — cicd authz probe live 4/4: 401 unauth/201 nv.test/403 delete/cleanup) + upload multiple files ×2 chỗ (`9c330d2` #278) · vòng 3-6 realtime (`f21c55d` #279-cancelled / `69997da` #280 / `80b64dd` #281-cancelled / `792c030` **#282 FINAL**): **bảng NCC table-fixed** width từng cột (file dài hết vỡ layout) + **bỏ ô "Tên" ngân sách nhập tay** (chỉ còn Số tiền, hasManual detect theo amount) + **GỠ field "Điều khoản thanh toán" khỏi TẤT CẢ form phiếu** (cột per-NCC + display phiếu cũ GIỮ) + **bỏ nút "+ Thêm hạng mục"** (1 phiếu = 1 hạng mục header). Bundle FINAL admin **`B1DtNT9C`**/user **`D6uF3Mln`** (Run #282). Test 240 ×2 local + 8× CI gate. **0/14 spawn truncated** (lần đầu sau nhiều session). → session log `2026-06-11-S59-wipe-tree-pmh-uat-batch.md`. Prev S58 (2026-06-11 — **4 việc prod-verified Run #382/#383/#384**: lock-demo-user fix + tạm ẩn HRM/Office/Cá nhân + Danh mục cuối sidebar + fe-user redesign theo UI/UX guide AI_INFRA. **Việc 1 — lock fix** (Run #382, `5998163` ~3m31s): Run #381 cicd phát hiện S57bis lock = NO-OP (14 email named-person là population Dev-only). Recon dump prod: demo thật = 20 UAT-matrix `{dept}.{nv,pp,tp}@`+`bod.{1,2}@` tạo TAY 05-13; root cause sâu = `DemoUserPassword` 11 ký tự < prod `RequiredLength=12` → `CreateAsync` silent-fail MỌI startup từ trước tới giờ (= root cause "helpdesk inert phòng IT 0 user" S56). Fix: union 20 email + password 12 ký tự. Prod sau deploy: **55 user / 21 active / 34 locked** — 20 UAT + 14 named-person locked ✓, **nv.cao/nv.truong CREATED+ACTIVE (helpdesk S56 RESOLVED)** ✓, 5 real staff created ✓, guard admin/catalog.manager/nv.test/chuong.phan-typo active ✓ (anh chốt 3 quyết định AskUserQuestion). Bundle FROZEN. gotcha **#60** NEW (seed silent-fail vs prod password policy — dump population thật trước khi lock/seed-by-email). +Closeout S57bis residual: gotcha #59 commit, 4 spawn-record on-behalf (H2 4-MISS), H1 5-patch doc-drift, test 240 re-verified local. Prev S57bis (2026-06-11 sáng) — **PE gắn Hạng mục công việc (Mig 49) + mở quyền Pe all-role + menu "Cá nhân" + khóa demo user** (sếp Zalo deadline 15:00): commit `17b23a4` (Harness-4 two-tier runtime-VERIFIED spawn-test 2 chiều) + `dd117b7` (product) → Run #381 PASS ~4m25s. Mig 49 `AddWorkItemToPurchaseEvaluation`: PE.WorkItemId `Guid?` loose-Guid KHÔNG FK vật lý (convention PE — database-agent design) + IX + validator NotEmpty create + FK-guard handler Conflict + UpdateDraft null-safe. FE ×2 app PeWorkspaceCreateView/PeHeaderForm (SHA256 identical)/PeDetailTabs "Dự án – Hạng mục". Pe_* 11 key CanRead+CanCreate mọi role (130 rows/13 role — Pe_* leaf KHÔNG nằm MenuKeys.All, build qua factory). Menu Personal root@30 + Chấm công re-parent + Master write-lock `Admin,CatalogManager` ×3 controller. Test 228→**240** (+12 PeWorkItemGuardTests). Bundle rotate cả 2: admin `CP4CB1ym` / user `BmZ3VHnm`. 2 builder truncated #53 + reviewer die-0-byte ×2 → em main solo vá cross-stack + self-gate. Excel (3) đối chiếu = NO-CHANGE (S55 data identical). Prev S56 — **Pre-golive verify sweep + golive-harden 4 fix — HMW 2-workflow, prod-verified**: commit `a20cde8` → Run #379 PASS ~4m20s. WF1 `pre-golive-verify` 7-stream song song + adversarial → 6 PASS/1 CONCERN/0 blocker = **GO**; key finds = **ops not code** (prod IT-dept 0 active user → helpdesk inert + S43 LeaveBalance lost-update còn nguyên). WF2 `golive-harden` fix 4: **#3** LeaveBalance lost-update→atomic `ExecuteUpdateAsync`+Serializable tx (NO mig, exactly-once nguyên) · **#5** ItTicket authz Forbidden-trước-NotFound (fail-closed) · **#6** DocxRenderer null-guard (2 warn→0) · **#4** Travel/Vehicle ApproveV2 +4 smoke. Test **216→228**. Bundle FROZEN `4SUwDLD8`/`XdKzt9LL` (BE-only). `sys.tables` re-ground **92→93** (cicd ground-truth, Mig 48 col-only). reviewer stage StructuredOutput-fail→em main đỡ cross-stack review (3 diff clean) + bump Serializable đóng MAJOR. gotcha **#58** NEW (EF read-modify-write lost-update→ExecuteUpdate atomic). **2 ops VPS pending** (gán user phòng IT + `tzutil` UTC+7). FE Phase 2 redesign **deferred** (recon ready). Prev S55 — **Nạp master data thật từ Excel + Project +4 cột (Mig 48), HMW-mode ON**: commit `69cb393` → Run #377 PASS ~4m33s, prod-verified. Anh giao file Excel "HẠNG MỤC CÔNG VIỆC DỰ ÁN" → `/ultra-on "workflow làm xong hết"`. Nạp **62 dự án + 71 hạng mục + 3 NCC** vào Project/WorkItem/Supplier qua `SeedRealMasterDataAsync` (per-code idempotent, **UNGATED** → coexist demo, tự lên prod). **Mig 48 `AddProjectMasterFields`**: Project +4 cột nullable (Year/Investor/Location/Package, NO new table). FE ProjectsPage form +4 input ×2 app SHA256 mirror. Test 216 (compile-fix MasterCatalogFilteredUniqueTests +4 null args, no new test). Bundle admin `DmjI8Cmn`→`B-d6893W`/user `YxL_MljK`→`XdKzt9LL` (cả 2 rotate). Prod verify: Mig 48 applied · Projects spot-6/6 · WorkItems VT/TP/MEP/TB=71 · Suppliers 3 · CAL01.Investor="Công ty TNHH Calofic". **2 agent return truncated** (implementer-backend + reviewer, gotcha #53) → em main disk/runtime-recover (build/test/sqlcmd/git truth); cicd verdict-FIRST → PASS clean no-truncate. Data-quality catch: MEP col gộp 2 nhóm + divider "THIẾT BỊ" → split đúng 71/4-category. Provenance `scripts/master-import-data.generated.md`. Prev S54 — **IT staff tự reassign ticket (cross-stack authz, HMW-mode ON)**: 1 code commit `ca4b602` → Run #376 PASS ~4m18s, prod-verified. Cho tổ IT (dept Code=="IT") + Admin reassign ItTicket trên CẢ 2 app. BE: NEW `GetAssignableItStaffQuery` capability endpoint `{canReassign,staff}` + `AssignItTicketHandler` authz Admin-OR-dept-IT (Forbidden) + assignee-must-IT (Conflict) + controller `/assign` hạ `[Authorize(Roles=Admin)]`→`[Authorize]` (handler fine-grained). FE: fe-admin+fe-user ItTicketsPage **SHA256-identical** (REVERSE S53 divergence) gate nút by `canReassign`, dropdown từ `/assignable-staff` (không `/users`). Test 203→**216** (+13 authz guard test-before-merge). NO migration (DepartmentId reuse). Bundle admin `DfCfHUE9`→`DmjI8Cmn` / user `_3S0BPJ2`→`YxL_MljK` (cả 2 rotate). 6-agent fan-out (BE∥FE→test→reviewer→cicd) + em main reconcile stray-memory residual (3 agent ghi MEMORY nhầm `src/Backend/.claude` → harvest về canonical). reviewer PASS 0 blocker (role-string "Admin" chain-verified). Task 1 Phase 9 Ops KHÔNG làm (anh dừng). flag: cicd `sys.tables=93` vs STATUS 92 → monthly audit re-ground.) Prev S53 (gotcha #57 EXT Master Mig 47 + P11-D reassign-UI fe-admin + P11-E menu + database-agent verified-runtime: `44b9e54` Run #260 + `dbf6648` Run #261, test→203, bundle→`DfCfHUE9`). Prev S52 (Phase 11 P11-D+E+F deployed + database-agent adopt, HMW-mode ON): 3 commit — `e9ee97f` (database-agent DB1–DB11 read-advisory, roster 10→11, executed-file CHỜ restart) + `6a66429` Wave 1 (P11-E AttendanceReport+Excel+OtPolicy multiplier + P11-F MaTicket codegen, migration-free) + `dcf76f8` Wave 2 (P11-D ItTicket round-robin assign dept-IT + SLA timer, Mig 46). Test 186→**200**. Bundle admin `DYfjnpY0`/user `_3S0BPJ2` (cả 2 deploy verified curl độc lập — Wave 1 BE 401 wired + Wave 2 /assign 401 + Mig 46 applied health-200). ⚠️ **Session-limit hit giữa Wave 2** → recovery: BE/test verify-on-disk + em main solo FE redo + curl-self-verify thay cicd-spawn (multi-agent resilience, git/disk/prod = source-of-truth). RAG recovered (chunk 2416 rerank live) nhưng stale 05-29. Prev S51: P11-C Vehicle+Driver.) --- ## HANDOFF — cắt từ `docs\HANDOFF.md` line 5 (từ **Prev S90** trở đi) - · **Prev S90** (S90 — **Chèn 12 ảnh khoanh-đỏ vào guide Word Duyệt NCC (em tự chụp prod qua Chrome) + chẩn UltraViewer — em-main solo, 0 production code**: anh "mở chrome chụp ảnh dán vào luôn" (12 ô trống từ S89). **Pipeline tự-chế (gotcha #74):** MCP `save_to_disk` KHÔNG ra file env này → **PowerShell `CopyFromScreen` + Win32 lọc-process-`chrome.exe`+`SetForegroundWindow`** (app Claude-Code Electron cùng class+title → khớp nhầm) + **DOM overlay `__ccA` element-based** (case-insensitive, minLeft/maxLeft/exact/up — toạ-độ-cứng vỡ vì viewport đổi) + crop 92/72 (banner CDP s08/s12→146, verify montage) + `python-docx 6.0"`-fit-A4. 12 màn chụp+khoanh+chèn, verify 13 ảnh (1 logo+12) + montage sạch banner. **0 prod mutation** (xem-only). **🔴 NEXT anh:** ① review docx trong Word; ② ⚠️ restart CLI (carry budget v3 + `/user-mark-*` + cadence §2.1.x); ③ (tùy) bật finalize 1 cấp 1 workflow → chụp lại ảnh #10 badge "⚑ Duyệt thay CEO" / bấm tạo 1 HĐ thử → ảnh #11 hợp-đồng-nháp. **🔴 NEXT em:** sửa text guide "Từ chối"→"Duyệt/Trả lại" (app gỡ "Từ chối" từ S60) nếu anh OK · curate test-specialist L1 **34.8KB OVER** (carry S88, archive-gate DRY-RUN) · cicd 28KB + reviewer 27.7KB + FD 26.1KB WATCH. **Caveats guide:** #9 app chỉ Duyệt+Trả-lại · #10 chụp **cờ "Duyệt là KẾT THÚC quy trình"** (workflow chưa bật finalize) thay badge sơ-đồ · #11 chưa bấm Tạo-HĐ · account=admin. **UltraViewer (anh hỏi "sao bật"):** `UltraViewService` StartMode=Auto/LocalSystem standby, **0 kết-nối**, em KHÔNG mở (chỉ grant Chrome; computer-use screenshot detect+mask); tắt self-serve `Stop-Service`/`Set-Service -StartupType Manual` (cân-nhắc nếu IT dùng remote-support). **State GIỮ NGUYÊN: Mig 59·88 bảng·422 test·gotcha 74·menu 54·bundle admin `DalcOhvb`/user `CdS4tX_2`.** **monthly 2026-07-01 (carry):** STATUS line-6/HANDOFF line-5 mega-line >25K-token KHÔNG Read được — GẤP tách session-cũ ≤S87 ra session logs · ef-core SKILL Mig→59 · 3 vocab-fork alias-map. → log `2026-06-25-S90-guide-screenshots-insert.md`.) · **Prev S89** (S89 — **PE visibility/finalize batch + xóa 38 User test prod + Word guide, ~6 commit prod-verified, HMW-mode ON**: **D1 nháp riêng-tư** (`a71753b` Run #465, test 419→421) — IDOR fix nháp lộ qua cond#2 role + **cond#3 V2-approver** (workflow pin lúc-TẠO → CEO approver thấy MỌI nháp = leak màn CEO) → 4 chỗ owner-only (GetEligiblePhases bỏ DangSoanThao · admin-inbox bỏ · list-cond3 guard · detail-authz guard) + PeDraftVisibilityTests (anh chốt "bỏ nháp khỏi inbox hẳn") · **D2 CCM giá-đề-xuất** (`f7bd97a`) gỡ `!readOnly` over-gate (gate thuần role mirror ô ngân-sách; BE setter fail-closed = chốt; anh Trần Xuân Lưu CCM) · **D3 finalize-note 3-surface** (`f0bca77` test 421→422) BE +3 computed-field detail+list DTO **no-migration** + EF-subquery first-reachable + PeFinalizeChip 2-app (invest-WF `wf_341f7b29` + impl-WF `wf_3f57edb6`; **impl-FE return-rỗng #53** → em-main mirror fe-admin 4-file SHA + self-gate + PeFinalizeProjectionTests) + **flow badge "⚑ Duyệt thay CEO"** PeWorkflowPanel (`9c920ad`) + **matrix flag thứ-8** WorkflowMatrixViewPage thiếu allowApproverFinalize từ S87 (`fef4c33`) · **xóa User test** (`681b1ed`) recon prod (ssh sqlcmd) 55→giữ 17/xóa 38 (whitelist-keep + backup `SolutionErp_S89_preuserdelete.bak` + count-guard[30,45] + XACT_ABORT; KHÔNG approver-block FK; nv.test 1-PE) + gỡ seed SeedDemoUsers/Lock (deploy bắt-buộc — binary cũ resurrect) · **Word guide** `docs/Huong-dan-Duyet-NCC.docx` (skill docx, logo Solution, 8 phần, khoanh-đỏ 1→2→3). **State THẬT: Mig 59 · 88 bảng · 422 test (45D+377I) · gotcha 73 · menu 54 · bundle admin `DalcOhvb`/user `CdS4tX_2` · prod 17 user thật.** **🔴 NEXT (anh):** ⚠️ restart CLI (carry budget/cmd). **Chèn ảnh guide:** chụp 12 màn (theo nhãn ô trong .docx) gửi em → em khoanh-đỏ 1→2→3 + chèn → xuất bản; HOẶC bật Chrome + extension Claude-in-Chrome + pass admin → em tự chụp+annotate (em KHÔNG tự chụp prod được từ máy). **🔴 NEXT (em):** curate `test-specialist` L1 **34.8KB OVER-SOFT** + cicd 28KB + reviewer 27.7KB (archive-gate DRY-RUN). **monthly 2026-07-01:** ef-core SKILL Mig→59 · STATUS/HANDOFF re-tier (mega-line bloat — STATUS line-6 đã >25K-token KHÔNG Read được, GẤP tách session-cũ→logs S86↓) · 3 vocab-fork alias-map · docs/CLAUDE Budget-removed. **Pending product (carry):** Section B cột Dự-án wire · Ngưỡng giá CEO Mig 54 Designer UAT · "C" chuyển phiếu→dự án chờ spec. **Lessons:** Designer-save=version-MỚI (phiếu pin cũ→finalize chỉ hiện phiếu-mới = "check rồi mà không thấy") · doc-drift thêm-flag-1-surface-quên-surface-song-song · whitelist-keep+3-guard prod-delete · WF-impl-FE-rỗng→em-main mirror+self-gate. → log `2026-06-25-S89-pe-visibility-finalize-userclean-guide.md`.) · **Prev S88** (S88 — **PE stability audit → fix patchwork D1 + hoàn-thiện multi-winner D2, 2 deploy prod-verified, HMW-mode ON**: anh giao "review/invest/test lại Duyệt NCC, chấp vá thì xử lý, tính năng đã ổn định". **Audit Workflow `wf_c15da996-be5`** (6 area invest→review + full-suite test) → core SOLID, tách findings safe vs behavior-affecting; AskUserQuestion ×4 chốt max-scope (incl create-contract = **1 HĐ/winner**). **D1 (`73cce1f` Run #347 PASS, test 402→413):** Block B financials re-key SelectedSupplierId→IsWinner (số=0 cho ≥2 winner) · CEO-notify-on-urgent +SaveChanges (trước rớt âm-thầm) · HoSoLink null-safe+clear-via-empty (sửa header không xoá link, #73-class) · #70 guard PRO budget · dời SetPeCcmBudgetPeriod→PeWorkItemBudgetFeatures. **D2 (`1aa3bdb` Run success, test 413→419):** create-contract **1→N** per winner (Command→List, gen-codes-first-then-atomic-add vì ContractCodeGenerator self-commit seq; GiaTri single=details-sum/≥2=per-winner-quote; pe.ContractId=first idempotency; {contractIds}) · list-card winner names (DTO +WinnerSupplierNames EF collection-subquery translate-OK SQLite) · FE dialog+PeListPanel. **State THẬT: Mig 59 · 88 bảng · 419 test (45D+374I) · gotcha 73 · menu 54 · bundle admin `BQq2eTP6`/user `dHa64I59`.** em-main-led BE core + delegate impl-backend ∥ impl-frontend ∥ test-specialist + reviewer PASS + cicd. **#53 truncation ×3** (test-specialist/reviewer/cicd return rớt MEMORY-over-budget → em-main recover-disk + self-gate + curl-self-verify deploy). **🔴 NEXT (anh):** ⚠️ restart CLI (carry: budget v3 + `/user-mark-*` + cadence §2.1.x). **NEXT UAT (anh Kiệt Ctrl+F5):** ① ≥2-winner Block B "Giá trị kỳ này" đúng số (không còn 0) · ② đánh dấu GẤP → Director nhận chuông+toast · ③ set Link hồ sơ rồi "Sửa header" → link GIỮ · ④ ≥2-winner phiếu → "Tạo HĐ" tạo N hợp đồng draft (1/winner) — **xác nhận GiaTri per-winner = giá NCC chào (quote total)** có đúng ý không, không thì chỉnh trong HĐ draft. **🔴 NEXT (em): curate test-specialist L1 34.8KB OVER-SOFT GẤP** (root-cause #53 ×3 phiên này; archive-gate DRY-RUN + move oldest→L2; reviewer 27.1KB + FD 26.1KB WATCH strike). **monthly 2026-07-01:** STATUS/HANDOFF re-tier (mega-line bloat — line không Read được, cần tách session-cũ ra session logs) · ef-core SKILL Mig→59 · docs/CLAUDE Budget-removed · 3 vocab-fork alias-map. **Pending product (carry):** Section B cột Dự-án wire (chờ anh) · Ngưỡng giá CEO Mig 54 Designer UAT · "C" chuyển phiếu→dự án chờ spec. **Ops S58/S59:** email typo anh Chương · 5 real-staff pw · gán CNTT (tzutil N/A — R6 fix tầng-serialize). → log `2026-06-25-S88-pe-stability-audit-d1-d2.md`.) · **Prev S87** (S87 — **2 PE feature LỚN prod-verified, HMW-mode ON, ~14 spawn (nhiều #53 truncate → recover-disk + self-gate)**: **(1) CCM 3-fix Mig 58** `f1b10e9` **Run #344 PASS** — đọc PDF "CCM 4 ý" (BỎ mục 3): multi-winner (`IsWinner` SUM, multi-toggle `SupplierIds[]`, FE tick-nhiều-ô + tổng) + budget=0 hợp lệ (guard `is null` only) + cấp KẾT-THÚC quy trình (`AllowApproverFinalize` **AUTO** theo anh "bật trong quy trình hay hơn"). **Self-review bắt 8 chỗ FE `selectedSupplierId`** vỡ multi-winner (null khi ≥2) → `isWinner`. Test 377→395. Bundle admin `CXCKlNay`/user `Di40ewrF`. **(2) Section B 3-cột Mig 59** `9b1ee0c` **Run #345** (cicd-verifying) — anh AskUserQuestion "mỗi cột nhập kỳ-này RIÊNG" → `CcmBudgetPeriodAmount` + `PATCH /budget/ccm-period` role-gate CCM; FE Section B (THỰC HIỆN) `` list → `
` 3 cột (Dự án—|PRO|CCM, `colCalc()` per-cột) qua **Workflow `wf_aafb18fe-d9d`** (BE→FE→test + 3-review: math/authz PASS · mirror+FE NULL → em-main self-gate identical+402+2-build). Test 395→**402**. **State: Mig 59 · 88 bảng · 402 test · gotcha 73 · menu 54 · bundle admin `BABhPh2s`/user `DLulO6uP` (Run #346 — `0d3c0cf` tách khối nổi bật "4. Thông tin chọn thầu" FE-only; #345 Section B=`C8lWxEQK`/`Kz5cSW2u`).** **NEXT UAT (anh Kiệt Ctrl+F5):** khối xanh "4. Thông tin chọn thầu" (1.Tên NCC/TP+giá trị · 2-3.Đề xuất PRO/CCM · 4.Bảng so sánh · 5.Link hồ sơ) trên "5. Ý kiến cấp duyệt" — có chỉnh thêm thì gửi. **🔴 NEXT (anh):** ⚠️ restart CLI (carry: budget v3 + `/user-mark-*` + cadence §2.1.x). **NEXT UAT (anh Kiệt Ctrl+F5):** ① tick NHIỀU NCC trúng + xem "Tổng chi phí đã chọn" · ② phiếu budget=0 gửi-duyệt OK · ④ Designer bật "Duyệt là kết thúc" cấp anh Chương → duyệt tới đó là DONE (không lên CEO) · Section B cột CCM nhập kỳ-này (bằng tài khoản CCM). **🔴 NEXT (em):** curate L1 over-cap (reviewer/cicd/inv/test-spec carry) · monthly **2026-07-01** (dọn CCM-setter `PeSuggestedPriceFeatures.cs` lệch-chỗ · re-ground sys.tables 88→89 · STATUS/HANDOFF re-tier bloat · ef-core SKILL + skills/README Mig→59). **Pending product:** Section B cột Dự-án wire (chờ anh) · Ngưỡng giá CEO Mig 54 Designer UAT · "C" chuyển phiếu→dự án chờ spec. **Ops S58/S59:** email typo anh Chương · 5 real-staff pw · gán CNTT (tzutil = N/A R6). → log `2026-06-24-S87-pe-multiwinner-budget-finalize-sectionb.md`.) · **Prev S86** (`ae4f106` Run #343) — PE notify "cần duyệt" loại NGƯỜI TẠO phiếu (+3 `PeApproverNotifyExcludesDrafterTests`; re-ground test 356→377/gotcha→73). · **Prev S85** — **buổi UAT anh Kiệt FDC CỰC LỚN: CV PRO 6-fix + clear-data + 6 vòng UAT + 2 ROOT-CAUSE + 5 SQL-fix — ~10 deploy prod-verified #334→#341, HMW-mode ON**) — **Batch CV PRO** (Run #334 `5a61254`): file `Cần chỉnh sửa CV PRO.xlsx` = 8-ảnh-chú-thích → C1 ẩn c/d form tạo · C3 prefill ô8 · C4a live-recompute ô3/8 · C4b "Bằng ngân sách" · C5 hủy/đổi winner (BE `Guid?` clear) · C7 fullscreen preview. **Clear-data** (`scripts/s85-wipe-uat-data.sql`, BACKUP-trước): wipe 43 PE + 28 budgets + 21 NCC-test, reset→A/001 (AskUserQuestion chốt scope). **6 vòng UAT #335→#338:** D1 ẩn 3/4/5 · D5 auto-quy-trình · D2 drafter-gỡ-GẤP (nới S77) · D3 ngân-sách-tự-nhảy từ ban-hành · ràng-tạo-phiếu + D4 checklist xanh/đỏ + "Quy trình duyệt". **2 ROOT-CAUSE:** **R5 #339 `1263c0d`** workflow-clear-on-edit = bug-class S42 (`UpdatePeDraftHandler` absolute-set→null-safe `if (X is not null)`, gotcha **#73**, +3 test) · **R6 #341 `49ac086`** TZ +7h (timestamps UTC nhưng serialize thiếu 'Z' → `UtcDateTimeJsonConverter` UTC-with-Z, gotcha **#72**; cicd verify `createdAt:"…Z"`). **5 SQL-fix** phiếu workflow-less (gán QT-DN-V2-001). Test 356→**374**. **State: Mig 57 · 88 bảng · 374 test · gotcha 73 · menu 54 · bundle admin `aKuNip19`/user `BUsL0HeQ` Run #341.** **🔴 NEXT (anh):** ⚠️ restart CLI (carry: budget v3 runtime + lệnh `/user-mark-*` + cadence §2.1.x). **NEXT UAT (anh Kiệt/long.chau Ctrl+F5):** giờ thông-báo đúng ("vừa xong") + Sửa phiếu giữ workflow + submit OK + checklist xanh/đỏ đủ + auto-quy-trình. **🔴 NEXT (em):** curate L1 test-specialist 28.4KB WATCH strike-1 (value-protect gotcha#/guard → KEEP) · monthly **2026-07-01** (doc-cite flush ef-core/skills-README Mig→57 + STATUS/HANDOFF re-tier + **SignalR TZ-check** nếu realtime-push còn lệch + **edit-form workflow-selector** defer = đóng dead-end "mở Sửa chọn quy trình" mà form chưa có ô). **Pending product:** Ngưỡng giá CEO (Mig 54) Designer UAT · "C" chuyển phiếu→dự án chờ spec. **Ops S58/S59:** email typo anh Chương · 5 real-staff pw · gán CNTT (tzutil VPS = KHÔNG-cần-nữa, R6 fix tầng-serialize chuẩn hơn). → log `2026-06-23-S85-pe-uat-cvpro-rootcause-tz.md`. · **Prev S84** — **bootstrap + flush session-start cap-echo v3 + commit S83 cicd harvest-orphan (LIGHT, 0 production code)** — 2 monitor INFORM → flush `session-start.md:114` `60/20/16`→**`220/60/50`** (+canonical-pointer chống tái-drift; detector C2 không track cap-number) + commit `cicd-monitor/MEMORY.md` harvest S83 sót-closeout (Run #333 + gotcha #69-REFINE). Lesson `feedback_derived_flush_execution`: derived→canonical flush = em-main execution KHÔNG gate user-confirm; chỉ ĐỔI-số = quyền anh. ⚠️ restart CLI (command `.md` no hot-reload). State GIỮ NGUYÊN Mig 57·88·356·71·`CsJetgZH`/`BVS0ApIm`. → log `2026-06-22-S84-session-start-cap-flush.md`. · **Prev S83** — **(1) H-15 v3 memory-budget full-parity (lead 220K/sub 60K/wf 50K, anh owner-directive) + (2) fix PE require-workflow create+submit prod-verified Run #333** — 2 commit: `2c7fd63` (gov docs-only CI-skip) + `fc1f19d` (PE fix). **H-15 v3:** full AI_INFRA parity (sửa self-shrink S82) + NEW `spawn_fill_directive` (nạp sub tới budget bằng prompt GIÀU — byte-cap MEMORY.md = 1 lát) + engine §G.5 + mark **v3-delta** `RC-pqhuy1987-22-06-2026-16-35-37` (anh-directed). **PE fix:** validator `NotEmpty(ApprovalWorkflowId)` + submit-guard (sau Section-3) chặn phiếu null-workflow ("quy trình cũ", kẹt V1-legacy). Diagnose A/040 **tự-khỏi-reload = cache** (KHÔNG đụng prod). test-before RED→GREEN, full-suite bắt **9 đỏ** → triage (2 spec-conflict rewrite V1-deprecated + 6 collateral giữ + 1 validator). Test 354→**356**. **#69-REFINE:** bundle KHÔNG rotate vì 0 fe-src (Vite deterministic) — ship-signal = Last-Modified KHÔNG hash-delta. Chi tiết → `## S83` dưới. ⚠️ restart CLI (budget v3 runtime). State: Mig 57·88 bảng·**356 test**·gotcha 71·bundle `CsJetgZH`/`BVS0ApIm` Run #333. · **Prev S82** — **adopt Harness-15-v2 (Tầng-1 hot-feed-lớn + L2/L3 bỏ-trần + %-print 2-đầu-phiên + ranh-giới vai-trò), 0 production code** — anh `/check-email AI_INFRA và /adap-apply all step by step cẩn thận`. 1 thư mới H15-v2-notify (verify ✓✓) + fan-out 29 vs 22 → CHỈ H15-v2 MỚI (7 còn lại verify đã-phủ S72/S75/S79). em-main IMPLEMENT D9 (6 edit: L1 12K→per-role lead 60K/sub 20K/wf 16K · L2/L3→NO-CAP · §G.4 · §2.1.6+§L.b(c) %-print · mark refine) + REVIEW Workflow `wf_04667b25-5fa` **3/3 PASS** (3 MINOR fixed). Ranh-giới vai-trò: con-số = quyền anh, AI thực-thi + báo-% (sửa framing S81 "lead-authority" gộp nhầm AI-lead↔owner). mark H-15 **v2-delta anh-confirm** `RC-pqhuy1987-21-06-2026-01-58-01`. commit `aa3f0fe` push (docs-only CI-skip) + email AI_INFRA `a749bb6bd1be`. Chi tiết → `## S82` dưới. ⚠️ restart CLI (%-print runtime §2.1.6 + §L.b(c)). State GIỮ NGUYÊN Mig 57·88 bảng·354 test·gotcha 71·bundle `CsJetgZH`/`BVS0ApIm`. · **Prev S81** — **adopt Harness-15 memory-budget per-agent (token-governor + value-gate + work-state block), 0 production code** — anh `/check-email AI_INFRA và /adap-apply step by step, review sau lẫn imple, report trung thực`. 0 new directed email; fan-out → CHỈ H15. em-main IMPLEMENT (8/8 🔴 floor) + REVIEW Workflow `wf_b7f3c8ac-b53` (3-lane PASS/PASS/HONEST → bắt 2 CONCERN honesty → fixed). Chi tiết → `## S81` dưới + adap-report. ⚠️ restart CLI (session-start §2.1.5). ✅ mark H-15 stamped Active-High (`RC-…23-07-37`). State GIỮ NGUYÊN Mig 57·88 bảng·354 test·gotcha 71·bundle `CsJetgZH`/`BVS0ApIm`. · **Prev S80** — **curate L1 over-cap memory → L2 archive (em-main single-writer, 0 production code)** — anh `/session-start` (bootstrap clean: 2 monitor CLEAN · detector 26-flag baseline-safe · test 354) → "check làm thử đi". archive-gate DRY-RUN: reviewer 45→**10KB** · investigator-codebase 40→**10KB** · cicd-monitor 39→**12KB** = cả 3 **keep-floor-hit cannot-auto-drain** → manual condense-with-archive: 31 entries byte-exact `sed` → `archive/2026-06.md` (**+N −0**, 0 byte-loss) + 31 `_INDEX` substring pointer → **A7 GATE PASS 217/217**. Stale foundation counts flushed (130/263→354·55→71·Mig40/55→57·84→88·bundle→#330). **State GIỮ NGUYÊN: Mig 57·88 bảng·354 test·gotcha 71.** **Lesson:** `_INDEX` substring **quote-free** (A7 quote-parser cắt escaped-quote `\"PURO\"` → FAIL 1, gate bắt). **🔴 NEXT (em):** frontend-designer 26KB + test-specialist 28KB WATCH (A6 strike-1<2). → log `2026-06-20-S80-curate-l1-overcap.md`. · **Prev S79** — **adopt User-Mark (H-12/13) canonical §P + Harness-14 (Eval/Budget/Outcome) + chữ-ký RC** — anh `/check-email AI_INFRA` + `/adap-apply` step-by-step (workflow double-check mỗi step), rồi gõ `/user-mark-active-high` "áp đầy-đủ chính-xác nhất theo AI_INFRA, không hỏi thêm". em main + **4 Workflow** (`wf_82337f7f-95c` invest → `wf_a7cbe93e-912` review → `wf_9d3beebb-a95` align-re-review → `wf_4d4eba6f-8a0` H14-review). **0 production code.** Bản đầu em phỏng-theo broadcast (cấp MUST/TRACK/ANCHOR/OFF) → anh trỏ canonical → **align FULL §P (P1-P10):** 4 lệnh `/user-mark-{active-high,active,medium,disable}` + ledger `.claude/governance/ACTIVE-MARKS.md` (Active-High/Active/Medium/Disable + display-filter) + `harness-11-engine.md §E`(P1-P10)+**§F**(H-14 3-mức maturity honest) + `rules.md §6.6` (objective-criteria KHÔNG quy-mô-đội/thời-gian-tuổi) + session-start §2.1.4/session-end §L.b(h) mark-display. **3 mark Active-High stamped** anh-confirm (`RC-pqhuy1987-20-06-2026-10-29-09/10/11` = objective-criteria/User-Mark/time-age, mirror AI_INFRA 3-mark, SE timestamp riêng P1 forward-only). completeness-gate H-6→H-13 **ĐẠT** (H-8 11/11 inherit no-`[1m]` · H-7 Cat-6 real). §F floor 6/6 + maturity HONEST + SE-state ACCURATE. **3 adap-report** + email ai_infra (body-hash `7b8615b3`) + check-email STAGE 2 move 2 email + `_index`. **Bài học `feedback_canonical_spec_over_broadcast`:** broadcast cô-đọng→canonical-command/§P là spec THẬT (phải pull, đừng phỏng-theo) · report-before-stamp dogfood (lệnh tự bắt báo-cáo-trước-stamp = đúng lệnh) · residual own-diary OK (D9 áp canonical, không cấm sub ghi diary riêng). detector clean sau align (0 C1/C3 mới). **State THẬT GIỮ NGUYÊN: Mig 57 · 88 bảng · 354 test · gotcha 71 · menu 54 · bundle `CsJetgZH`/`BVS0ApIm`.** **🔴 NEXT (anh):** ⚠️ **restart CLI** (đầu việc) — activate 4 lệnh `/user-mark-*` + session-start §2.1.4/session-end §L.b(h) mark-display + engine §E/§F. Sau restart, session-start tự hiển-thị 3 mark Active-High. **🔴 NEXT (em):** curate L1 over-cap reviewer/cicd/investigator-codebase (carry 7-session + S79 workflow-spawn; inv 39.8KB +diary) — manual SPLIT/condense, archive-gate A7 GATE; + §7-header `rules.md` "77 test" stale → C2/monthly-audit. **Pending product (carry):** "Ngưỡng giá CEO" Mig 54 Designer UAT · "C" chuyển phiếu→dự án chờ spec. **Ops S58/S59:** tzutil VPS · anh Chương email typo · 5 real-staff pw · gán CNTT. Chi tiết → `2026-06-20-S79-user-mark-harness-14-adopt.md`. · **Prev S78** — **PE: đính kèm file khi DUYỆT (UAT Tra Sol / 5 tester)** — người duyệt tải file lên ngay lúc Duyệt thay vì Trả lại phiếu. Reuse hệ attachment + enum `ApprovalAttachment=5` **MIGRATION-FREE** (int-stored, endpoint+authz có sẵn → approver upload được). FE 2 app SHA-identical: `PeWorkflowPanel` picker multi-file + upload-trước-chuyển-phase (file lỗi=không duyệt) + mục "📎 File đính kèm khi duyệt" + 2 filter fix loại purpose=5 khỏi "Bảng so sánh" (gotcha **#71** proxy-predicate pollution). commit `7886fd0` → **Run #330 PASS** (test 354, bundle admin `CsJetgZH`/user `BVS0ApIm`, NO migration, smoke 4×200). 3 lỗi em tự bắt review-trước-deploy (authz-verify · filter-pollution #71 · Dialog mirror-truncate fe-admin). em-main-led + self-gate (grep no-leak) + cicd-monitor verify. **🔴 NEXT (em):** curate L1 over-cap (carry 6 session) reviewer **45.2KB** + cicd 38.8KB + inv 35.7KB keep-floor-hit manual-condense (archive-gate A7 GATE PASS 186/186). **NEXT UAT:** mở phiếu chờ duyệt → Duyệt → "+ Chọn file đính kèm" → Xác nhận → file ở mục "📎 File đính kèm khi duyệt". Chi tiết → `2026-06-19-S78-pe-attach-file-on-approve.md`. · **Prev S77** — **PE UX batch: 10 deploy prod-verified #320→#329 (anh Kiệt FDC + Tra Sol + Bích Phượng UAT realtime, HMW-mode ON)** — cờ GẤP pill mọi danh sách+inbox · focus→revert list bám-trái · **Mig 57** ô ghi chú giá đề xuất PRO/CCM + số phân cách VND + chính tả "Bảng so sánh giá" + guard #70 · số âm đỏ-ngoặc · mục con thụt+gạch-đầu-dòng · cờ gấp **BẤT ĐỐI XỨNG** GẮN=NV/GỠ=Trưởng phòng(DeptManager) · tách chọn-phiếu(inline) khỏi mở-rộng(overlay)+nút "Xem mở rộng" · chuông báo người duyệt vào cấp họ · banner phiếu Trả-lại. Mig 56→**57** · test 344→**354** (+10) · bundle cuối admin `BqKD3Y23`/user `Cn-i349D` (Run #329). **3 lỗi em tự bắt review-TRƯỚC-deploy** (guard#70 stale-echo · luật asymmetric Tra Sol clarify giữa-chừng · double-mount Task H). FD process-death Task H → recover-disk. **🔴 NEXT (em):** curate L1 over-cap reviewer **45KB** + cicd 37.6KB + inv 35.6KB keep-floor-hit manual-condense (archive-gate A7 GATE PASS 186/186 integrity OK). **NEXT UAT:** 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. Chi tiết → `2026-06-19-S77-pe-ux-batch-10-deploy.md`. · **Prev S76** — **PE ngân sách MA TRẬN 3 cột (Dự án|PRO|CCM) + bảng lưới `
` viền-ô + badge quyền-NS theo role** — anh Kiệt FDC + chị Trà Sol go-live. anh giao `/ultra-on` "step-by-step + workflow-review-per-step, hoàn chỉnh rồi deploy". **3 commit prod-verified:** `e33481e` (feature Run #318 — Mig 56 + ma-trận-3-cột + badge designer/flow `BhFDF9IJ`/`BAkuRl3C`) → `21d1f4e` (bảng lưới `
` theo phản hồi anh "chưa chia cột giống Excel", Run #319 **`jOqxW4-p`**/**`DbsznVvR`** smoke 3×200). Mig 56 +ProInitial/ProAdjust cột PRO (additive + data-migrate ProEstimate→ProInitial 4 rows prod). Part 1 mỗi phòng sửa cột mình (PRO canEditPro / CCM canEditCcm / Dự án FE-only). Part 2+3 badge "✎ NS PRO/CCM" cạnh approver (display-only suy-role) ở Designer + flow Duyệt NCC. Test 339→**344**. reviewer bắt **race mất-dữ-liệu** Part 1 → vá `useIsFetching` 2 app (gotcha #70). **🔴 NEXT (em):** curate L1 over-cap reviewer **45KB** + inv-codebase 35KB (keep-floor-hit → manual condense) + cicd 29KB + test-spec 28KB. **NEXT (anh/anh Kiệt):** UAT bảng lưới bằng PRO/CCM (Ctrl+F5). Chi tiết → `2026-06-19-S76-pe-budget-matrix-table-grid.md`. · **Prev S75 (2026-06-18)** — **Harness-11 adopt: engine bộ-nhớ-và-governance tự-bảo-trì + 2 double-check** — anh giao `/check-email AI_INFRA` + `/adap-apply` (mỗi stage workflow-review) + double-check ×2 + finalize report + push + session-end. em main + **5 Workflow** (audit `wf_7fdc3bd5-930` → implement `wf_c5e5844e-7c1` → review `wf_d7ca1ff8-942` → double-check `wf_a0b68d2f-30e` → checklist-verify `wf_39cd4cbe-f07`). **0 production code.** Built 2 NO-API detector-script (`governance-detectors.ps1` C1-C5+B3 runtime **26 flag** bắt drift thật, C4 0-self-match · `memory-archive-gate.ps1` PHẦN A hysteresis/keep-floor/2-strike/A7 186/186) + `docs/governance/harness-11-engine.md` canonical (3-tier D5/D6/D7 + one-direction-lock D8) + **B1 ×11 count→pointer** (drift mig53→55/test306→339/gotcha68→69/table93→88 RESOLVED) + cadence-wire D1/D2 + agents/README. **completeness-gate FORMAL ĐẠT** (B 4/4 + C 5/5 + D 11/11; D5/D6/D7 explicit + D8 codify=YES). gotcha #30 reinforced (box-glyph ├└─ KHÔNG vào .ps1, kể cả qua Edit). 3 commit `e70c046`+`ae957c4`+`aa09e99` pushed + adap-report + email ai_infra (`2316773229f2`). State GIỮ NGUYÊN Mig 55·88 bảng·339 test·gotcha 69·bundle `BYF5vIMJ`/`CB-tiRxd`. **🔴 NEXT (anh):** restart CLI (cadence §2.1.3/§L.b + ef-core skill); curate reviewer 38.8KB+inv 31.5KB+cicd 26.8KB over-cap. Chi tiết → `2026-06-18-S75-harness-11-adopt.md`. · **Prev S74** — **PE ô "Ghi chú từ CCM" ngân sách gói thầu (Mig 55)** — anh forward 2 luồng Zalo (Trà Sol + Kiệt FDC) "CCM giống PRO cho nhập + ghi chú, hiện 0 hết" → em-main BE+Mig55 ∥ implementer-frontend FE 2 app SHA-mirror ∥ test-specialist (chết rate-limit → recover-disk). 2 fork anh chốt: **thêm CcmNote (Mig 55)** + **GIỮ phân vai CCM** (CostControl/Admin). Entity +CcmNote mirror ProNote · UpdatePeBudgetCcmCommand +CcmNote absolute-set role-gate · DTO+controller+mapping · FE dòng "Ghi chú từ CCM" gate canEditCcm. Test 334→**339** (+5). commit `8655ebf` (cicd **Run #315 PASS** — bundle admin `BYF5vIMJ`/user `CB-tiRxd`, Mig 55 applied prod). **"0 hết không nhập" = tài khoản thiếu role CostControl (KHÔNG bug)** → UAT bằng CCM/Admin. **🔴 NEXT (anh/anh Kiệt):** UAT ô CCM bằng tài khoản CCM/Admin + carry "Ngưỡng giá CEO" Mig 54. Chi tiết → session log `2026-06-18-S74-pe-ccm-note.md`. · **Prev S73** — **Mig 54 PE giá đề xuất PRO/CCM + CEO chọn giá chốt + CCM duyệt-done ô-tích (anh Kiệt FDC, go-live thứ Hai 22/06)** — em main + 6 sub + 2 review-workflow, 2 commit prod-verified (`1d86abc` feature Run #313 + `6aa4dcb` FE empty-candidates fix). Mig 54 5-cột additive-nullable + 2 setter role-gate + ApproveV2 ③ AUTO→OPT-IN + ① bind giá chốt; FE 2 app SHA-mirror; test 306→334. **Workflow review:** R1 schema-force 1/4 lane → R2 free-text 2/3 PASS (rủi ro FE empty-candidates UNREACHABLE per submit-guard `:194`). Bài học: review fan-out free-text/hmw KHÔNG ép-schema. **Governance:** em lệch mandate auto-Workflow → cam kết báo-TRƯỚC-khi-lệch. **🔴 NEXT (anh/anh Kiệt):** cấu hình "Ngưỡng giá CEO" Designer + test 3 luồng + xác nhận CCM-trước-CEO. Chi tiết → session log `2026-06-18-S73-pe-gia-de-xuat-ccm-done.md`. · **Prev S72** — **Harness-10 flat-refine + checklist-v2 adopt (re-audit 3-workflow) + sleep NO-OP** — audit `wf_13868efb-ea7` → implement `wf_ac43b5ff-7d1` → review `wf_d482e10d-5dd` (Harness-9 B1+B2). SE BEHIND flat → migrate run-trace SUBFOLDER→FLAT (hmw.js:103 + 5 doc; 5 run cũ giữ subfolder C8) + 2 broadcast 06-18 adopt + `/sleep-recovery-memory-l2` port (A8) + detector TAILORED-OUT + hmw.js H4.5→H8 doc-drift. **REVIEW (B2) bắt 2 lỗi IMPLEMENT-self-assess sót** (hmw.js:52 schema-stale + auto-check overclaim) → fixed (auto-check WIRED thật). em-main containment-check tự bắt reviewer residual-write (raw-Workflow no-writeGuard) → revert. B3 self-correct (runs path/count 14→22). Sleep `all`=NO-OP. **0 prod code, state GIỮ NGUYÊN.** adap-report + email ai_infra (`5f511fe5c0f2`). **🔴 NEXT (anh):** restart CLI (FLAT-runtime hmw.js + wired sleep-check + sleep-recovery skill). **🔴 NEXT (em):** curate investigator-codebase L1 28973 OVER + watch FD/test-spec. Chi tiết → session log `2026-06-18-S72-harness-10-flat-refine.md`. **Prev S71 — Harness-10 adopt: tracked run-trace folder + checklist 9-10** — em main + 3 Workflow (invest `wf_9c2cd2cd-2e7` → implement `wf_e4e46725-231` → review `wf_636bc95b-939`) per mandate Harness-9 PART 2. **0 production code**. Migrate `.claude/workflows/wave-*/` gitignored → `runs//` **git-TRACKED** (run.md+sub-md/+harvest/) + `_ledger.md` 2-nhịp + 3-layer anti-miss (L1 em-main@P1 / L2 session-start orphan-scan / L3 session-end close-gate idempotent) + **containment shift** (Harness-2 B6 "mọi tracked-change=vi-phạm" → "tracked-change NGOÀI run-folder + code-disjoint=vi-phạm"). hmw.js wave→run-trace (accept `args.run` + alias `wave`, path `sub-md/`, `node --check` PARSE-OK). **Review độc-lập (R2+R3) bắt C5 L1 over-claim** (doc nói hmw.js prompt-builder emit L1 reminder, grep engine=0 → engine no-fs → fixed path-a: L1 = em-main @P1 convention) — dogfood mandate B2 đúng. checklist 9-10: Part A (Harness-9 memory) + B (adap 2-workflow) done S70, Part C (Harness-10) 8/8 MỚI. **State GIỮ NGUYÊN: Mig 53·88 bảng·306 test·68 gotcha·menu 54·bundle admin `BgNCjwsG`/user `CBvh0vtf`.** + CLAUDE.md test-flush 263→306 (resolve H1 stale). **🔴 NEXT (anh):** restart CLI (hmw.js RUN-TRACE runtime + carry §2.1.2/Cat-6/H8). Chi tiết → session log `2026-06-18-S71-harness-10-run-trace.md` (pending). **Prev S70 —** **Harness-9 adopt: L2 archive dark-matter recovery + adap 2-workflow mandate** — em main + 3 Workflow (investigate `wf_be952f3c-97f` → implement `wf_a58e0d15-beb` → audit `wf_9520d8cd-4fe`) + 2 monitor bootstrap. **0 production code** (governance/memory only, commit `f36aab8` pushed). 4 over-cap sub-agent curate L1→L2 + `archive/_INDEX.md` (mục-lục substring sha-keyed) + `.gist.md` (4-field distill-gen:1, verbatim FROZEN) → **cả 4 < 25KB auto-inject cap** (P1 curate-debt CLOSED; ~240KB archive hết RAG-dark). PART 2/3 process-mandate codify (adap-apply 2-workflow + agents/README Upgrade S70 + session-start §2.1.2). **0-byte-loss git+sha verified** (Stage C audit + em-main self-gate khi 2 reviewer no-StructuredOutput → recovery-path). +memory-budget.json (seed-by-measure) + measure-agent-memory.ps1 + .ragignore + doc-drift 4-cite flush. adap-report + email-back ai_infra (`7c07b716e775`). **State THẬT GIỮ NGUYÊN: Mig 53 · 88 bảng · 306 test · 68 gotcha · menu 54 · bundle admin `BgNCjwsG`/user `CBvh0vtf`.** **🔴 NEXT (anh):** restart CLI để activate session-start §2.1.2 budget-audit + pending H8 inherit + reviewer Cat-6. Chi tiết → session log `2026-06-17-S70-harness-9-l2-recovery.md`. **Prev S69 —** **Văn phòng số (E-Office) port + golive + PE cờ gấp/ngưỡng CCM — 4 deploy prod-verified Run #305→#308, HMW-mode ON, 2 workflow fan-out**: #305 foundation PURO (shared PageHeader/KpiCard/WidgetCard + Dashboard 2-cột + sync fe-admin index.css đóng drift S66-S68) → #306 **re-skin TRỌN 10 page** (PURO layout + CSS Hồ sơ NS, phẫu-thuật-giữ-100%-logic) → #307 **Office golive public** read+create **16-key allow-list mọi role** (mirror S65, chạy SAU revoke; excluded Off_PhongHop_Manage/Off_AttendanceReport/Off_ChamCong; cicd DB-verify 16/16×13 role) → #308 **PE cờ gấp PRO/CCM + CCM duyệt-final theo ngưỡng giá trị** Mig 53 (anh Kiệt FDC sau họp sếp). **State THẬT: Mig 53 · 88 bảng · 306 test (45D+261I) · 68 gotcha · menu 54 · bundle admin `BgNCjwsG`/user `CBvh0vtf` Run #308.** 2 gotcha NEW (**#67** Tailwind accent palette thiếu-stop vỡ-màu-im-lặng · **#68** stale-diagnostic-background-agent → chỉ tin build sau-cùng). 2 truncation #53 (impl-backend positional-record + impl-frontend) → em main recover-disk + self-gate. **🔴 NEXT (anh/anh Kiệt UAT):** (1) cấu hình "Ngưỡng giá trị gói CEO" trong Workflow Designer (null=luồng cũ) + test phiếu < ngưỡng → CCM duyệt là xong, ≥ ngưỡng → lên CEO; (2) test cờ gấp PRO(đỏ)/CCM(xanh) → badge + notify CEO; (3) **xác nhận:** quy trình đặt CCM(CostControl)-trước-CEO + CEO = role Director (đích notify). **C (sau duyệt → chuyển phiếu đến dự án) chờ anh Kiệt spec form.** **NEXT (em):** 🔴 curate cicd-monitor **65.2KB** (worst, trend tăng) + inv-codebase 47 + reviewer 43.5 over-cap · doc-flush docs/CLAUDE.md full. Chi tiết → session log `2026-06-17-S69-vanphong-golive-pe-urgent-threshold.md`. **Prev S68 —** **Hồ sơ NS header chi tiết NV: làm nổi bật + fix tên render đen→trắng** — em main solo, 3 commit (2 FE + 1 docs), 2 deploy prod-verified Run #303-304 (anh UAT realtime): badge màu theo trạng thái + dòng meta đậm + tên to/drop-shadow (#303 `6983609`) → anh báo "tên đen nền xanh ko nổi bật" → diagnose **rule `h1-h4{color:#0b1220}` viết NGOÀI `@layer` thắng `text-white`** (Tailwind v4 unlayered > all layers, **gotcha #66 NEW**, load-bearing ~30+ heading → fix ĐIỂM `text-white!` không move @layer) + thu nhỏ `text-lg` (#304 `37752eb`). Bootstrap: 2 monitor RE-REPORT CLEAN + 2 doc-drift fix (dep-audit 64→65 · root CLAUDE 263→286, `11bc96d`). **State THẬT: Mig 52 · 88 bảng · 286 test · 66 gotcha · menu 53 · bundle admin `CNUv1jxY`/user `CpOskeS1` Run #304.** ⚠️ curate-debt P1: cicd-monitor **44.1KB**. Chi tiết → session log `2026-06-16-S68-hoso-header-name-color-fix.md`. **Prev S67 —** **buổi sản phẩm LỚN, 6 deploy prod-verified Run #297→#302** (anh + anh Kiệt FDC UAT realtime, HMW-mode ON): fe-user Hồ sơ NS đồng nhất font + chữ đen→**xanh đậm `brand-800`** (#297) · **fe-admin mirror master-detail** + vá accent tokens index.css [đóng pending lớn nhất HRM go-live, page SHA256 ×2] (#298) · **+23 test-after HRM** → 263→**286** (#299) · **list flex-row gọn** [hết tràn ngang rail] + đồng nhất cỡ chữ ×2 (#300) · **PE Link hồ sơ auto-detect** web→hyperlink/`O:\`→Copy (#301) → **link `file://` bấm-thử** (#302). **Research 3-agent:** auto-mở `O:\` từ web = chỉ **Edge GPO `IntranetFileLinksEnabled`** (zero-per-machine) one-click thật; default chặn https→file://. **State THẬT: Mig 52 · 88 bảng · 286 test (45D+241I) · 65 gotcha · menu 53 · bundle admin `CcrZqfht`/user `DniDFUB_` Run #302.** test-specialist trunc #53→recover-disk; 0 prod bug. Chi tiết → session log `2026-06-16-S67-hoso-visual-pe-link-research.md`. **Prev S66 — session-end closeout em-main-solo:** adopt **Harness-8 all-inherit** (7 sub demoted `claude-opus-4-8`→`inherit` → cả 11=inherit, gỡ two-tier H4) + **cicd-monitor L1 curate 86.8→28.9KB** (byte-exact sed → `archive/2026-06.md`) + **ef-core skill doc-flush Mig 50→52** + check-email AI_INFRA (**0 thư mới se-directed**). ~17 file docs/gov/config, **0 production code** → state THẬT GIỮ NGUYÊN (Mig 52 · 88 bảng · 263 test · 65 gotcha · menu 53 · bundle `BDwV5d0X`/`DbVv6rsf`). ⚠️ **Restart CLI** → H8 runtime (frontmatter no hot-reload) + reviewer Cat-6. adap-report + email-back ai_infra (`fa7f690d` MATCH). Chi tiết → session log `2026-06-16-S66-closeout-harness8-cicd-curate.md`. **Prev S65 — HRM go-live: public Hồ sơ Nhân sự + trang master-detail giống NamGroup + Department hierarchy Mig 51 + PE Link hồ sơ Mig 52 + gốc cây SOLUTION COMPANY**, ~6 deploy prod-verified Run #289→#295, anh + anh Kiệt FDC UAT realtime. **State THẬT: Mig 52 · 88 bảng · 263 test (45D+218I) · 65 gotcha · menu 53 · bundle admin `BDwV5d0X`/user `DbVv6rsf` Run #295.** Workflow fan-out chạy THẬT lần đầu [PE] — BE∥FE parallel OK nhưng FE+reviewer return-rỗng #53 → em main recover-disk + self-gate. gotcha #65 [build csproj con ≠ slnx → CS7036]. Chi tiết → session log `2026-06-16-S65-hrm-golive-employee-masterdetail-pe-link.md`. **Prev S64** adopt **Harness-7 writing-quality floor** qua `/adap-apply` + email ai_infra — em main solo, 1 commit `6afde19` docs/gov-only. Outward comms = tiếng Việt câu-hoàn-chỉnh; nội bộ giữ nén (asymmetric). reviewer +Category 6 (verified-pending-restart → cần restart CLI). Broadcast body-hash verified KHÔNG mis-stamp (gotcha #61 UTF-8). Prev S63 docs-closeout bù S60/S61/S62 — 3 session product ship CODE prod-verified nhưng KHÔNG closeout docs (UAT realtime anh Kiệt FDC). **State THẬT: Mig 50 · 88 bảng · 263 test · 64 gotcha · menu 53 · bundle admin `0xKYGhhf`/user `C81ZdG9G` Run #286.** S60-62 = PE ràng buộc gửi-duyệt + gỡ "Từ chối" (S60) · Mig 50 ngân sách per-gói-thầu Excel anh Kiệt + XÓA module Budget cũ (S61) · vượt-NS cảnh-báo-mềm (S62). Reconcile stray reviewer cwd-misland + count-flush 4 file. Chi tiết → session log `2026-06-12-S60-S62-pe-budget-workitem-softwarning.md`. Prev Session 59 ( **6 đợt ship prod-verified Run #273→#278**: wipe transactional testing data (10 PE + 7 HĐ demo + 64 notif = 0, mã reset → phiếu thật đầu tiên team tạo = **PE/2026/A/001** ✓) `56882ac` #273 · PE tree Panel 1 chốt 4 tầng **Năm > Dự án > Hạng mục > Phiếu** `0eafcd3` #274 · dọn 15 mã hạng mục demo "tự đẻ" (chị Trà Sol) + gỡ seed gốc, WorkItems 86→**71** `bbd1554` #275 · **rename 71 mã đúng format PMH anh Kiệt** (`MAT-n`/`SUB-n`/`MEP-SUB-n`/`MEP-EQU-n` + tên "STT nhóm tên"; **DB-trước-code-sau** gotcha #62 + sqlcmd `-f 65001` gotcha #61) `c869d26` #276 · UAT vòng 1: NEW `ui/SearchableSelect` gõ-lọc bỏ dấu (Hạng mục/Dự án) + auto Địa điểm + điều khoản đa dòng `faed59f` #277 · UAT vòng 2 (anh chốt ×2): ẩn Trả lại/Từ chối khi tự duyệt phiếu mình soạn + quick-add NCC ngay form (POST /suppliers any-auth, authz probe 4/4) + NCC gõ-tìm A-Z + upload multi-file `9c330d2` #278 · UAT vòng 3-6 realtime (#279/#281 cancelled-supersede-benign): bảng NCC table-fixed `f21c55d` + bỏ ô Tên ngân sách `69997da` #280 + GỠ field Điều khoản TT mọi form `80b64dd` + bỏ nút Thêm hạng mục `792c030` **#282 FINAL**. Tổng 10 đợt (8 PASS + 2 cancelled-benign). Bundle FINAL admin **`B1DtNT9C`**/user **`D6uF3Mln`**. Test 240. Gotchas 62. 0/14 spawn truncated. → session log `2026-06-11-S59-wipe-tree-pmh-uat-batch.md`. Prev S58 — **5 đợt prod-verified Run #382/#383/#384/#386** (#385 cancelled-supersede-benign): lock-demo-user fix (việc sếp deadline 15:00 ĐÓNG TRỌN — gotcha #60/E-008/AS-12, root cause password 11<12 từng phát hiện S22 nhưng const không fix) + tạm ẩn HRM/Office/Cá nhân + Danh mục cuối (`6c5fd26` #383) + **fe-user redesign theo UI/UX guide AI_INFRA giữ brand** (`e959f72` #384) + **brand polish ×2 app "thấy rõ"** (`ea793a4`: stripe 4px đỉnh + thead brand) + **PE gộp Tên-gói-thầu = chọn Hạng-mục** (anh Kiệt FDC chốt, `3ebaf84` #386 — bundle final admin `DMm9rtNA`/user `BUkOMn_Y`). Email AI_INFRA processed (guide + ACK H4 ACCEPT). Test **240**. → session log `2026-06-11-S58-lock-fix-hide-modules-redesign-pe-merge.md`. Root cause 2 tầng: lock-list = population Dev-only + `DemoUserPassword` 11 ký tự < prod RequiredLength=12 → CreateAsync silent-fail từ trước tới giờ (= "helpdesk inert" S56). Fix union 20 UAT email + password 12 ký tự → prod 55 user/34 locked, nv.cao+nv.truong sống, 5 real staff tạo. gotcha #59+#60. Commit `5998163`. Prev S57bis — **PE gắn Hạng mục (Mig 49) + Pe all-role + menu Cá nhân + Harness-4 runtime-VERIFIED**. Test 228→**240**. Bundle `CP4CB1ym`/`BmZ3VHnm`. Commit `17b23a4`+`dd117b7` → Run #381 PASS+1PARTIAL (lock NO-OP → RESOLVED S58). Prev S56 — **Pre-golive verify sweep + golive-harden 4 fix — Run #379 PASS, code golive-ready**. WF1 `pre-golive-verify` 7-stream + adversarial → 6 PASS/1 CONCERN/0 blocker = GO (key finds = ops not code). WF2 `golive-harden` fix 4: #3 LeaveBalance lost-update→atomic ExecuteUpdate+Serializable tx (NO mig) · #5 ItTicket authz Forbidden-trước-NotFound · #6 DocxRenderer null-guard · #4 Travel/Vehicle ApproveV2 tests. Test 216→**228**. Bundle FROZEN `4SUwDLD8`/`XdKzt9LL`. `sys.tables` re-ground 92→**93**. gotcha **#58** NEW. reviewer StructuredOutput-fail→em main đỡ. **2 ops VPS pending** (gán user IT + tzutil UTC+7). FE Phase 2 redesign **deferred** (recon ready). Commit `a20cde8`. Prev S55 — **Nạp master data thật từ Excel (62 dự án + 71 hạng mục + 3 NCC) + Project +4 cột (Mig 48) — prod-verified**. HMW-mode ON. Commit `69cb393` → Run #377 PASS ~4m33s. Test 216 (compile-fix only). Bundle admin `B-d6893W`/user `XdKzt9LL`. `SeedRealMasterDataAsync` ungated idempotent → coexist demo. 2 agent return truncated (BE+reviewer) → em main disk/runtime-recover. Prev S54 — IT staff tự reassign ticket (cross-stack authz) — prod-verified. 1 code commit `ca4b602` → Run #376 PASS ~4m18s. Test 203→**216**. Bundle admin `DfCfHUE9`→`DmjI8Cmn`/user `_3S0BPJ2`→`YxL_MljK` (cả 2 rotate). NO migration. Task 1 Phase 9 Ops anh dừng. ⚠️ residual: 3 agent ghi MEMORY nhầm `src/Backend/.claude` → em main reconcile. Prev S53: gotcha #57 EXT Master Mig 47 + P11-D/E + database-agent verified-runtime.) + · **Prev S92** (S92 — **Ẩn 5 nhóm menu (Hợp đồng + Danh mục + Nhân sự + Văn phòng số + Cá nhân) CHỈ Admin thấy trên eoffice — em-main-led, 1 commit prod-verified `1408d4e`, BE-only no-migration, HMW-mode ON**: anh `/session-start` thấy WIP S92 uncommitted (hôm nay) → chốt "verify + hoàn thiện + deploy". `RevokeTemporarilyHiddenModulesAsync` mở rộng predicate +Contracts/Ct_* +Master/Suppliers/Projects/Departments/Catalog* (cộng dồn S58 Hrm*/Off*/Personal) + TẮT 2 re-grant (S65 HRM + S69 Office) → revoke = bước permission CUỐI ungated trong SeedAdminPermissionsAsync (durable mỗi restart, gotcha #75) + InReviewScope→chỉ Pe_*. PE giữ nguyên (Pe_* không match predicate; master-data GET any-auth). +AdminOnlyModulesRevokeTests 3. Test 431→**434** (45D+389I). seed-order + predicate coverage verified · **reviewer PASS** (5 attack A-E, 15/15 trên 3 class). **FYI:** role CatalogManager (0 user hiện tại) cũng bị thu Danh mục — intended-by-spec, re-enable cần carve-out predicate. **State: Mig 59 · 88 bảng · 434 test (45D+389I) · gotcha 76 · menu 54 · bundle admin `xz8FdmLN`/user `CA8Rla2w` (JS rotate #69, CSS frozen) · prod 17 user/7 NCC.** cicd **Run #358 PASS** prod-verified (sqlcmd: non-Admin 0 leak / Admin 5 giữ / Pe_* 120 untouched; ship-proof = dll-mtime + w3wp-recycle 08:04Z). **🔴 NEXT anh:** UAT eoffice login user non-admin → xác nhận KHÔNG còn thấy Hợp đồng/Danh mục/Nhân sự/VP số/Cá nhân (chỉ Duyệt NCC + Dashboard) · ⚠️ restart CLI (carry budget v3 + `/user-mark-*` + cadence). **🔴 NEXT em:** monthly 2026-07-01 (2 ngày) — **GẤP re-tier STATUS/HANDOFF mega-line** (STATUS line-6 giờ >25K-token KHÔNG Read/Edit được, S92 phải prepend qua PowerShell) + ef-core SKILL Mig→59 + docs/CLAUDE Budget-removed + 3 vocab-fork alias-map. **Pending product (carry):** Section B cột Dự-án wire · Ngưỡng giá CEO Mig 54 Designer UAT · "C" chuyển phiếu→dự án chờ spec. → log `2026-06-29-S92-admin-only-modules.md`) · **Prev S91** (S91 — **buổi go-live LỚN em-main-led, 4 commit prod-verified + backup local** — go-live 26/06 anh Kiệt SOL-IT Phase-01 PRO+CCM. #1 `159b69d` guide Word bỏ "Từ chối" 2 chỗ + fix 12 caption Hinh→Hình [unpack→XML→repack giữ 13 ảnh]. #2 `ba42c59` wipe go-live [16 PE+16 budgets+94 notif+19 NCC demo xóa, giữ 7 NCC thật+17 user+master, PeSeq→A/001, backup+2-guard+AskUserQuestion-scope]. #3 `55494ad` gate SeedDemoMasterData chống resurrect 18 NCC demo mỗi restart [gotcha #75 root-cause, verify demo_codes=0 qua 2 restart]. #4 `e81e87f` user tự đổi mật khẩu [BE ChangePasswordCommand + POST /auth/change-password Identity-verify-pass-cũ + FE 2-app ChangePasswordDialog/TopBar + 10 test; CS0104 ValidationException ambiguous fix]. +backup local `backups/SolutionErp_golive_clean_2026-06-26.bak` 21MB + accounts.txt 17 tk. **State: Mig 59 · 88 bảng · 431 test · gotcha 76 · menu 54 · bundle admin `DgQyuG7f`/user `BmbQon23` · prod 17 user/7 NCC/0 PE-HĐ.** **🔴 NEXT anh:** ⚠️ restart CLI · review guide docx Word · đóng 2 tab eoffice em mở · UAT đổi-mật-khẩu [avatar→Đổi mật khẩu, ≥12 ký tự] + xác nhận NCC demo không sống-lại. **🔴 NEXT em:** curate test-specialist L1 OVER [carry nhiều session] · monthly 2026-07-01 [re-tier mega-line STATUS/HANDOFF bloat · ef-core SKILL Mig→59 · docs/CLAUDE Budget-removed · 3 vocab-fork alias-map]. **Pending product:** Section B cột Dự-án wire · Ngưỡng giá CEO Mig 54 Designer UAT · "C" chuyển phiếu→dự án chờ spec. **Ops:** tzutil VPS = N/A [R6 fix tầng-serialize] · 5 real-staff pw · email typo anh Chương. **Lessons S91:** wipe-không-bền-nếu-không-gate-reseed [#75] · deploy config từ .example KHÔNG file-gitignored [#76] · Chrome-MCP screenshot kẹt SPA document_idle [#74 carry]. → log `2026-06-26-S91-golive-wipe-changepw-backup.md`) · **Prev S90** (S90 — **Chèn 12 ảnh khoanh-đỏ vào guide Word Duyệt NCC (em tự chụp prod qua Chrome) + chẩn UltraViewer — em-main solo, 0 production code**: anh "mở chrome chụp ảnh dán vào luôn" (12 ô trống từ S89). **Pipeline tự-chế (gotcha #74):** MCP `save_to_disk` KHÔNG ra file env này → **PowerShell `CopyFromScreen` + Win32 lọc-process-`chrome.exe`+`SetForegroundWindow`** (app Claude-Code Electron cùng class+title → khớp nhầm) + **DOM overlay `__ccA` element-based** (case-insensitive, minLeft/maxLeft/exact/up — toạ-độ-cứng vỡ vì viewport đổi) + crop 92/72 (banner CDP s08/s12→146, verify montage) + `python-docx 6.0"`-fit-A4. 12 màn chụp+khoanh+chèn, verify 13 ảnh (1 logo+12) + montage sạch banner. **0 prod mutation** (xem-only). **🔴 NEXT anh:** ① review docx trong Word; ② ⚠️ restart CLI (carry budget v3 + `/user-mark-*` + cadence §2.1.x); ③ (tùy) bật finalize 1 cấp 1 workflow → chụp lại ảnh #10 badge "⚑ Duyệt thay CEO" / bấm tạo 1 HĐ thử → ảnh #11 hợp-đồng-nháp. **🔴 NEXT em:** sửa text guide "Từ chối"→"Duyệt/Trả lại" (app gỡ "Từ chối" từ S60) nếu anh OK · curate test-specialist L1 **34.8KB OVER** (carry S88, archive-gate DRY-RUN) · cicd 28KB + reviewer 27.7KB + FD 26.1KB WATCH. **Caveats guide:** #9 app chỉ Duyệt+Trả-lại · #10 chụp **cờ "Duyệt là KẾT THÚC quy trình"** (workflow chưa bật finalize) thay badge sơ-đồ · #11 chưa bấm Tạo-HĐ · account=admin. **UltraViewer (anh hỏi "sao bật"):** `UltraViewService` StartMode=Auto/LocalSystem standby, **0 kết-nối**, em KHÔNG mở (chỉ grant Chrome; computer-use screenshot detect+mask); tắt self-serve `Stop-Service`/`Set-Service -StartupType Manual` (cân-nhắc nếu IT dùng remote-support). **State GIỮ NGUYÊN: Mig 59·88 bảng·422 test·gotcha 74·menu 54·bundle admin `DalcOhvb`/user `CdS4tX_2`.** **monthly 2026-07-01 (carry):** STATUS line-6/HANDOFF line-5 mega-line >25K-token KHÔNG Read được — GẤP tách session-cũ ≤S87 ra session logs · ef-core SKILL Mig→59 · 3 vocab-fork alias-map. → log `2026-06-25-S90-guide-screenshots-insert.md`.) · **Prev S89** (S89 — **PE visibility/finalize batch + xóa 38 User test prod + Word guide, ~6 commit prod-verified, HMW-mode ON**: **D1 nháp riêng-tư** (`a71753b` Run #465, test 419→421) — IDOR fix nháp lộ qua cond#2 role + **cond#3 V2-approver** (workflow pin lúc-TẠO → CEO approver thấy MỌI nháp = leak màn CEO) → 4 chỗ owner-only (GetEligiblePhases bỏ DangSoanThao · admin-inbox bỏ · list-cond3 guard · detail-authz guard) + PeDraftVisibilityTests (anh chốt "bỏ nháp khỏi inbox hẳn") · **D2 CCM giá-đề-xuất** (`f7bd97a`) gỡ `!readOnly` over-gate (gate thuần role mirror ô ngân-sách; BE setter fail-closed = chốt; anh Trần Xuân Lưu CCM) · **D3 finalize-note 3-surface** (`f0bca77` test 421→422) BE +3 computed-field detail+list DTO **no-migration** + EF-subquery first-reachable + PeFinalizeChip 2-app (invest-WF `wf_341f7b29` + impl-WF `wf_3f57edb6`; **impl-FE return-rỗng #53** → em-main mirror fe-admin 4-file SHA + self-gate + PeFinalizeProjectionTests) + **flow badge "⚑ Duyệt thay CEO"** PeWorkflowPanel (`9c920ad`) + **matrix flag thứ-8** WorkflowMatrixViewPage thiếu allowApproverFinalize từ S87 (`fef4c33`) · **xóa User test** (`681b1ed`) recon prod (ssh sqlcmd) 55→giữ 17/xóa 38 (whitelist-keep + backup `SolutionErp_S89_preuserdelete.bak` + count-guard[30,45] + XACT_ABORT; KHÔNG approver-block FK; nv.test 1-PE) + gỡ seed SeedDemoUsers/Lock (deploy bắt-buộc — binary cũ resurrect) · **Word guide** `docs/Huong-dan-Duyet-NCC.docx` (skill docx, logo Solution, 8 phần, khoanh-đỏ 1→2→3). **State THẬT: Mig 59 · 88 bảng · 422 test (45D+377I) · gotcha 73 · menu 54 · bundle admin `DalcOhvb`/user `CdS4tX_2` · prod 17 user thật.** **🔴 NEXT (anh):** ⚠️ restart CLI (carry budget/cmd). **Chèn ảnh guide:** chụp 12 màn (theo nhãn ô trong .docx) gửi em → em khoanh-đỏ 1→2→3 + chèn → xuất bản; HOẶC bật Chrome + extension Claude-in-Chrome + pass admin → em tự chụp+annotate (em KHÔNG tự chụp prod được từ máy). **🔴 NEXT (em):** curate `test-specialist` L1 **34.8KB OVER-SOFT** + cicd 28KB + reviewer 27.7KB (archive-gate DRY-RUN). **monthly 2026-07-01:** ef-core SKILL Mig→59 · STATUS/HANDOFF re-tier (mega-line bloat — STATUS line-6 đã >25K-token KHÔNG Read được, GẤP tách session-cũ→logs S86↓) · 3 vocab-fork alias-map · docs/CLAUDE Budget-removed. **Pending product (carry):** Section B cột Dự-án wire · Ngưỡng giá CEO Mig 54 Designer UAT · "C" chuyển phiếu→dự án chờ spec. **Lessons:** Designer-save=version-MỚI (phiếu pin cũ→finalize chỉ hiện phiếu-mới = "check rồi mà không thấy") · doc-drift thêm-flag-1-surface-quên-surface-song-song · whitelist-keep+3-guard prod-delete · WF-impl-FE-rỗng→em-main mirror+self-gate. → log `2026-06-25-S89-pe-visibility-finalize-userclean-guide.md`.) · **Prev S88** (S88 — **PE stability audit → fix patchwork D1 + hoàn-thiện multi-winner D2, 2 deploy prod-verified, HMW-mode ON**: anh giao "review/invest/test lại Duyệt NCC, chấp vá thì xử lý, tính năng đã ổn định". **Audit Workflow `wf_c15da996-be5`** (6 area invest→review + full-suite test) → core SOLID, tách findings safe vs behavior-affecting; AskUserQuestion ×4 chốt max-scope (incl create-contract = **1 HĐ/winner**). **D1 (`73cce1f` Run #347 PASS, test 402→413):** Block B financials re-key SelectedSupplierId→IsWinner (số=0 cho ≥2 winner) · CEO-notify-on-urgent +SaveChanges (trước rớt âm-thầm) · HoSoLink null-safe+clear-via-empty (sửa header không xoá link, #73-class) · #70 guard PRO budget · dời SetPeCcmBudgetPeriod→PeWorkItemBudgetFeatures. **D2 (`1aa3bdb` Run success, test 413→419):** create-contract **1→N** per winner (Command→List, gen-codes-first-then-atomic-add vì ContractCodeGenerator self-commit seq; GiaTri single=details-sum/≥2=per-winner-quote; pe.ContractId=first idempotency; {contractIds}) · list-card winner names (DTO +WinnerSupplierNames EF collection-subquery translate-OK SQLite) · FE dialog+PeListPanel. **State THẬT: Mig 59 · 88 bảng · 419 test (45D+374I) · gotcha 73 · menu 54 · bundle admin `BQq2eTP6`/user `dHa64I59`.** em-main-led BE core + delegate impl-backend ∥ impl-frontend ∥ test-specialist + reviewer PASS + cicd. **#53 truncation ×3** (test-specialist/reviewer/cicd return rớt MEMORY-over-budget → em-main recover-disk + self-gate + curl-self-verify deploy). **🔴 NEXT (anh):** ⚠️ restart CLI (carry: budget v3 + `/user-mark-*` + cadence §2.1.x). **NEXT UAT (anh Kiệt Ctrl+F5):** ① ≥2-winner Block B "Giá trị kỳ này" đúng số (không còn 0) · ② đánh dấu GẤP → Director nhận chuông+toast · ③ set Link hồ sơ rồi "Sửa header" → link GIỮ · ④ ≥2-winner phiếu → "Tạo HĐ" tạo N hợp đồng draft (1/winner) — **xác nhận GiaTri per-winner = giá NCC chào (quote total)** có đúng ý không, không thì chỉnh trong HĐ draft. **🔴 NEXT (em): curate test-specialist L1 34.8KB OVER-SOFT GẤP** (root-cause #53 ×3 phiên này; archive-gate DRY-RUN + move oldest→L2; reviewer 27.1KB + FD 26.1KB WATCH strike). **monthly 2026-07-01:** STATUS/HANDOFF re-tier (mega-line bloat — line không Read được, cần tách session-cũ ra session logs) · ef-core SKILL Mig→59 · docs/CLAUDE Budget-removed · 3 vocab-fork alias-map. **Pending product (carry):** Section B cột Dự-án wire (chờ anh) · Ngưỡng giá CEO Mig 54 Designer UAT · "C" chuyển phiếu→dự án chờ spec. **Ops S58/S59:** email typo anh Chương · 5 real-staff pw · gán CNTT (tzutil N/A — R6 fix tầng-serialize). → log `2026-06-25-S88-pe-stability-audit-d1-d2.md`.) · **Prev S87** (S87 — **2 PE feature LỚN prod-verified, HMW-mode ON, ~14 spawn (nhiều #53 truncate → recover-disk + self-gate)**: **(1) CCM 3-fix Mig 58** `f1b10e9` **Run #344 PASS** — đọc PDF "CCM 4 ý" (BỎ mục 3): multi-winner (`IsWinner` SUM, multi-toggle `SupplierIds[]`, FE tick-nhiều-ô + tổng) + budget=0 hợp lệ (guard `is null` only) + cấp KẾT-THÚC quy trình (`AllowApproverFinalize` **AUTO** theo anh "bật trong quy trình hay hơn"). **Self-review bắt 8 chỗ FE `selectedSupplierId`** vỡ multi-winner (null khi ≥2) → `isWinner`. Test 377→395. Bundle admin `CXCKlNay`/user `Di40ewrF`. **(2) Section B 3-cột Mig 59** `9b1ee0c` **Run #345** (cicd-verifying) — anh AskUserQuestion "mỗi cột nhập kỳ-này RIÊNG" → `CcmBudgetPeriodAmount` + `PATCH /budget/ccm-period` role-gate CCM; FE Section B (THỰC HIỆN) `` list → `
` 3 cột (Dự án—|PRO|CCM, `colCalc()` per-cột) qua **Workflow `wf_aafb18fe-d9d`** (BE→FE→test + 3-review: math/authz PASS · mirror+FE NULL → em-main self-gate identical+402+2-build). Test 395→**402**. **State: Mig 59 · 88 bảng · 402 test · gotcha 73 · menu 54 · bundle admin `BABhPh2s`/user `DLulO6uP` (Run #346 — `0d3c0cf` tách khối nổi bật "4. Thông tin chọn thầu" FE-only; #345 Section B=`C8lWxEQK`/`Kz5cSW2u`).** **NEXT UAT (anh Kiệt Ctrl+F5):** khối xanh "4. Thông tin chọn thầu" (1.Tên NCC/TP+giá trị · 2-3.Đề xuất PRO/CCM · 4.Bảng so sánh · 5.Link hồ sơ) trên "5. Ý kiến cấp duyệt" — có chỉnh thêm thì gửi. **🔴 NEXT (anh):** ⚠️ restart CLI (carry: budget v3 + `/user-mark-*` + cadence §2.1.x). **NEXT UAT (anh Kiệt Ctrl+F5):** ① tick NHIỀU NCC trúng + xem "Tổng chi phí đã chọn" · ② phiếu budget=0 gửi-duyệt OK · ④ Designer bật "Duyệt là kết thúc" cấp anh Chương → duyệt tới đó là DONE (không lên CEO) · Section B cột CCM nhập kỳ-này (bằng tài khoản CCM). **🔴 NEXT (em):** curate L1 over-cap (reviewer/cicd/inv/test-spec carry) · monthly **2026-07-01** (dọn CCM-setter `PeSuggestedPriceFeatures.cs` lệch-chỗ · re-ground sys.tables 88→89 · STATUS/HANDOFF re-tier bloat · ef-core SKILL + skills/README Mig→59). **Pending product:** Section B cột Dự-án wire (chờ anh) · Ngưỡng giá CEO Mig 54 Designer UAT · "C" chuyển phiếu→dự án chờ spec. **Ops S58/S59:** email typo anh Chương · 5 real-staff pw · gán CNTT (tzutil = N/A R6). → log `2026-06-24-S87-pe-multiwinner-budget-finalize-sectionb.md`.) · **Prev S86** (`ae4f106` Run #343) — PE notify "cần duyệt" loại NGƯỜI TẠO phiếu (+3 `PeApproverNotifyExcludesDrafterTests`; re-ground test 356→377/gotcha→73). · **Prev S85** — **buổi UAT anh Kiệt FDC CỰC LỚN: CV PRO 6-fix + clear-data + 6 vòng UAT + 2 ROOT-CAUSE + 5 SQL-fix — ~10 deploy prod-verified #334→#341, HMW-mode ON**) — **Batch CV PRO** (Run #334 `5a61254`): file `Cần chỉnh sửa CV PRO.xlsx` = 8-ảnh-chú-thích → C1 ẩn c/d form tạo · C3 prefill ô8 · C4a live-recompute ô3/8 · C4b "Bằng ngân sách" · C5 hủy/đổi winner (BE `Guid?` clear) · C7 fullscreen preview. **Clear-data** (`scripts/s85-wipe-uat-data.sql`, BACKUP-trước): wipe 43 PE + 28 budgets + 21 NCC-test, reset→A/001 (AskUserQuestion chốt scope). **6 vòng UAT #335→#338:** D1 ẩn 3/4/5 · D5 auto-quy-trình · D2 drafter-gỡ-GẤP (nới S77) · D3 ngân-sách-tự-nhảy từ ban-hành · ràng-tạo-phiếu + D4 checklist xanh/đỏ + "Quy trình duyệt". **2 ROOT-CAUSE:** **R5 #339 `1263c0d`** workflow-clear-on-edit = bug-class S42 (`UpdatePeDraftHandler` absolute-set→null-safe `if (X is not null)`, gotcha **#73**, +3 test) · **R6 #341 `49ac086`** TZ +7h (timestamps UTC nhưng serialize thiếu 'Z' → `UtcDateTimeJsonConverter` UTC-with-Z, gotcha **#72**; cicd verify `createdAt:"…Z"`). **5 SQL-fix** phiếu workflow-less (gán QT-DN-V2-001). Test 356→**374**. **State: Mig 57 · 88 bảng · 374 test · gotcha 73 · menu 54 · bundle admin `aKuNip19`/user `BUsL0HeQ` Run #341.** **🔴 NEXT (anh):** ⚠️ restart CLI (carry: budget v3 runtime + lệnh `/user-mark-*` + cadence §2.1.x). **NEXT UAT (anh Kiệt/long.chau Ctrl+F5):** giờ thông-báo đúng ("vừa xong") + Sửa phiếu giữ workflow + submit OK + checklist xanh/đỏ đủ + auto-quy-trình. **🔴 NEXT (em):** curate L1 test-specialist 28.4KB WATCH strike-1 (value-protect gotcha#/guard → KEEP) · monthly **2026-07-01** (doc-cite flush ef-core/skills-README Mig→57 + STATUS/HANDOFF re-tier + **SignalR TZ-check** nếu realtime-push còn lệch + **edit-form workflow-selector** defer = đóng dead-end "mở Sửa chọn quy trình" mà form chưa có ô). **Pending product:** Ngưỡng giá CEO (Mig 54) Designer UAT · "C" chuyển phiếu→dự án chờ spec. **Ops S58/S59:** email typo anh Chương · 5 real-staff pw · gán CNTT (tzutil VPS = KHÔNG-cần-nữa, R6 fix tầng-serialize chuẩn hơn). → log `2026-06-23-S85-pe-uat-cvpro-rootcause-tz.md`. · **Prev S84** — **bootstrap + flush session-start cap-echo v3 + commit S83 cicd harvest-orphan (LIGHT, 0 production code)** — 2 monitor INFORM → flush `session-start.md:114` `60/20/16`→**`220/60/50`** (+canonical-pointer chống tái-drift; detector C2 không track cap-number) + commit `cicd-monitor/MEMORY.md` harvest S83 sót-closeout (Run #333 + gotcha #69-REFINE). Lesson `feedback_derived_flush_execution`: derived→canonical flush = em-main execution KHÔNG gate user-confirm; chỉ ĐỔI-số = quyền anh. ⚠️ restart CLI (command `.md` no hot-reload). State GIỮ NGUYÊN Mig 57·88·356·71·`CsJetgZH`/`BVS0ApIm`. → log `2026-06-22-S84-session-start-cap-flush.md`. · **Prev S83** — **(1) H-15 v3 memory-budget full-parity (lead 220K/sub 60K/wf 50K, anh owner-directive) + (2) fix PE require-workflow create+submit prod-verified Run #333** — 2 commit: `2c7fd63` (gov docs-only CI-skip) + `fc1f19d` (PE fix). **H-15 v3:** full AI_INFRA parity (sửa self-shrink S82) + NEW `spawn_fill_directive` (nạp sub tới budget bằng prompt GIÀU — byte-cap MEMORY.md = 1 lát) + engine §G.5 + mark **v3-delta** `RC-pqhuy1987-22-06-2026-16-35-37` (anh-directed). **PE fix:** validator `NotEmpty(ApprovalWorkflowId)` + submit-guard (sau Section-3) chặn phiếu null-workflow ("quy trình cũ", kẹt V1-legacy). Diagnose A/040 **tự-khỏi-reload = cache** (KHÔNG đụng prod). test-before RED→GREEN, full-suite bắt **9 đỏ** → triage (2 spec-conflict rewrite V1-deprecated + 6 collateral giữ + 1 validator). Test 354→**356**. **#69-REFINE:** bundle KHÔNG rotate vì 0 fe-src (Vite deterministic) — ship-signal = Last-Modified KHÔNG hash-delta. Chi tiết → `## S83` dưới. ⚠️ restart CLI (budget v3 runtime). State: Mig 57·88 bảng·**356 test**·gotcha 71·bundle `CsJetgZH`/`BVS0ApIm` Run #333. · **Prev S82** — **adopt Harness-15-v2 (Tầng-1 hot-feed-lớn + L2/L3 bỏ-trần + %-print 2-đầu-phiên + ranh-giới vai-trò), 0 production code** — anh `/check-email AI_INFRA và /adap-apply all step by step cẩn thận`. 1 thư mới H15-v2-notify (verify ✓✓) + fan-out 29 vs 22 → CHỈ H15-v2 MỚI (7 còn lại verify đã-phủ S72/S75/S79). em-main IMPLEMENT D9 (6 edit: L1 12K→per-role lead 60K/sub 20K/wf 16K · L2/L3→NO-CAP · §G.4 · §2.1.6+§L.b(c) %-print · mark refine) + REVIEW Workflow `wf_04667b25-5fa` **3/3 PASS** (3 MINOR fixed). Ranh-giới vai-trò: con-số = quyền anh, AI thực-thi + báo-% (sửa framing S81 "lead-authority" gộp nhầm AI-lead↔owner). mark H-15 **v2-delta anh-confirm** `RC-pqhuy1987-21-06-2026-01-58-01`. commit `aa3f0fe` push (docs-only CI-skip) + email AI_INFRA `a749bb6bd1be`. Chi tiết → `## S82` dưới. ⚠️ restart CLI (%-print runtime §2.1.6 + §L.b(c)). State GIỮ NGUYÊN Mig 57·88 bảng·354 test·gotcha 71·bundle `CsJetgZH`/`BVS0ApIm`. · **Prev S81** — **adopt Harness-15 memory-budget per-agent (token-governor + value-gate + work-state block), 0 production code** — anh `/check-email AI_INFRA và /adap-apply step by step, review sau lẫn imple, report trung thực`. 0 new directed email; fan-out → CHỈ H15. em-main IMPLEMENT (8/8 🔴 floor) + REVIEW Workflow `wf_b7f3c8ac-b53` (3-lane PASS/PASS/HONEST → bắt 2 CONCERN honesty → fixed). Chi tiết → `## S81` dưới + adap-report. ⚠️ restart CLI (session-start §2.1.5). ✅ mark H-15 stamped Active-High (`RC-…23-07-37`). State GIỮ NGUYÊN Mig 57·88 bảng·354 test·gotcha 71·bundle `CsJetgZH`/`BVS0ApIm`. · **Prev S80** — **curate L1 over-cap memory → L2 archive (em-main single-writer, 0 production code)** — anh `/session-start` (bootstrap clean: 2 monitor CLEAN · detector 26-flag baseline-safe · test 354) → "check làm thử đi". archive-gate DRY-RUN: reviewer 45→**10KB** · investigator-codebase 40→**10KB** · cicd-monitor 39→**12KB** = cả 3 **keep-floor-hit cannot-auto-drain** → manual condense-with-archive: 31 entries byte-exact `sed` → `archive/2026-06.md` (**+N −0**, 0 byte-loss) + 31 `_INDEX` substring pointer → **A7 GATE PASS 217/217**. Stale foundation counts flushed (130/263→354·55→71·Mig40/55→57·84→88·bundle→#330). **State GIỮ NGUYÊN: Mig 57·88 bảng·354 test·gotcha 71.** **Lesson:** `_INDEX` substring **quote-free** (A7 quote-parser cắt escaped-quote `\"PURO\"` → FAIL 1, gate bắt). **🔴 NEXT (em):** frontend-designer 26KB + test-specialist 28KB WATCH (A6 strike-1<2). → log `2026-06-20-S80-curate-l1-overcap.md`. · **Prev S79** — **adopt User-Mark (H-12/13) canonical §P + Harness-14 (Eval/Budget/Outcome) + chữ-ký RC** — anh `/check-email AI_INFRA` + `/adap-apply` step-by-step (workflow double-check mỗi step), rồi gõ `/user-mark-active-high` "áp đầy-đủ chính-xác nhất theo AI_INFRA, không hỏi thêm". em main + **4 Workflow** (`wf_82337f7f-95c` invest → `wf_a7cbe93e-912` review → `wf_9d3beebb-a95` align-re-review → `wf_4d4eba6f-8a0` H14-review). **0 production code.** Bản đầu em phỏng-theo broadcast (cấp MUST/TRACK/ANCHOR/OFF) → anh trỏ canonical → **align FULL §P (P1-P10):** 4 lệnh `/user-mark-{active-high,active,medium,disable}` + ledger `.claude/governance/ACTIVE-MARKS.md` (Active-High/Active/Medium/Disable + display-filter) + `harness-11-engine.md §E`(P1-P10)+**§F**(H-14 3-mức maturity honest) + `rules.md §6.6` (objective-criteria KHÔNG quy-mô-đội/thời-gian-tuổi) + session-start §2.1.4/session-end §L.b(h) mark-display. **3 mark Active-High stamped** anh-confirm (`RC-pqhuy1987-20-06-2026-10-29-09/10/11` = objective-criteria/User-Mark/time-age, mirror AI_INFRA 3-mark, SE timestamp riêng P1 forward-only). completeness-gate H-6→H-13 **ĐẠT** (H-8 11/11 inherit no-`[1m]` · H-7 Cat-6 real). §F floor 6/6 + maturity HONEST + SE-state ACCURATE. **3 adap-report** + email ai_infra (body-hash `7b8615b3`) + check-email STAGE 2 move 2 email + `_index`. **Bài học `feedback_canonical_spec_over_broadcast`:** broadcast cô-đọng→canonical-command/§P là spec THẬT (phải pull, đừng phỏng-theo) · report-before-stamp dogfood (lệnh tự bắt báo-cáo-trước-stamp = đúng lệnh) · residual own-diary OK (D9 áp canonical, không cấm sub ghi diary riêng). detector clean sau align (0 C1/C3 mới). **State THẬT GIỮ NGUYÊN: Mig 57 · 88 bảng · 354 test · gotcha 71 · menu 54 · bundle `CsJetgZH`/`BVS0ApIm`.** **🔴 NEXT (anh):** ⚠️ **restart CLI** (đầu việc) — activate 4 lệnh `/user-mark-*` + session-start §2.1.4/session-end §L.b(h) mark-display + engine §E/§F. Sau restart, session-start tự hiển-thị 3 mark Active-High. **🔴 NEXT (em):** curate L1 over-cap reviewer/cicd/investigator-codebase (carry 7-session + S79 workflow-spawn; inv 39.8KB +diary) — manual SPLIT/condense, archive-gate A7 GATE; + §7-header `rules.md` "77 test" stale → C2/monthly-audit. **Pending product (carry):** "Ngưỡng giá CEO" Mig 54 Designer UAT · "C" chuyển phiếu→dự án chờ spec. **Ops S58/S59:** tzutil VPS · anh Chương email typo · 5 real-staff pw · gán CNTT. Chi tiết → `2026-06-20-S79-user-mark-harness-14-adopt.md`. · **Prev S78** — **PE: đính kèm file khi DUYỆT (UAT Tra Sol / 5 tester)** — người duyệt tải file lên ngay lúc Duyệt thay vì Trả lại phiếu. Reuse hệ attachment + enum `ApprovalAttachment=5` **MIGRATION-FREE** (int-stored, endpoint+authz có sẵn → approver upload được). FE 2 app SHA-identical: `PeWorkflowPanel` picker multi-file + upload-trước-chuyển-phase (file lỗi=không duyệt) + mục "📎 File đính kèm khi duyệt" + 2 filter fix loại purpose=5 khỏi "Bảng so sánh" (gotcha **#71** proxy-predicate pollution). commit `7886fd0` → **Run #330 PASS** (test 354, bundle admin `CsJetgZH`/user `BVS0ApIm`, NO migration, smoke 4×200). 3 lỗi em tự bắt review-trước-deploy (authz-verify · filter-pollution #71 · Dialog mirror-truncate fe-admin). em-main-led + self-gate (grep no-leak) + cicd-monitor verify. **🔴 NEXT (em):** curate L1 over-cap (carry 6 session) reviewer **45.2KB** + cicd 38.8KB + inv 35.7KB keep-floor-hit manual-condense (archive-gate A7 GATE PASS 186/186). **NEXT UAT:** mở phiếu chờ duyệt → Duyệt → "+ Chọn file đính kèm" → Xác nhận → file ở mục "📎 File đính kèm khi duyệt". Chi tiết → `2026-06-19-S78-pe-attach-file-on-approve.md`. · **Prev S77** — **PE UX batch: 10 deploy prod-verified #320→#329 (anh Kiệt FDC + Tra Sol + Bích Phượng UAT realtime, HMW-mode ON)** — cờ GẤP pill mọi danh sách+inbox · focus→revert list bám-trái · **Mig 57** ô ghi chú giá đề xuất PRO/CCM + số phân cách VND + chính tả "Bảng so sánh giá" + guard #70 · số âm đỏ-ngoặc · mục con thụt+gạch-đầu-dòng · cờ gấp **BẤT ĐỐI XỨNG** GẮN=NV/GỠ=Trưởng phòng(DeptManager) · tách chọn-phiếu(inline) khỏi mở-rộng(overlay)+nút "Xem mở rộng" · chuông báo người duyệt vào cấp họ · banner phiếu Trả-lại. Mig 56→**57** · test 344→**354** (+10) · bundle cuối admin `BqKD3Y23`/user `Cn-i349D` (Run #329). **3 lỗi em tự bắt review-TRƯỚC-deploy** (guard#70 stale-echo · luật asymmetric Tra Sol clarify giữa-chừng · double-mount Task H). FD process-death Task H → recover-disk. **🔴 NEXT (em):** curate L1 over-cap reviewer **45KB** + cicd 37.6KB + inv 35.6KB keep-floor-hit manual-condense (archive-gate A7 GATE PASS 186/186 integrity OK). **NEXT UAT:** 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. Chi tiết → `2026-06-19-S77-pe-ux-batch-10-deploy.md`. · **Prev S76** — **PE ngân sách MA TRẬN 3 cột (Dự án|PRO|CCM) + bảng lưới `
` viền-ô + badge quyền-NS theo role** — anh Kiệt FDC + chị Trà Sol go-live. anh giao `/ultra-on` "step-by-step + workflow-review-per-step, hoàn chỉnh rồi deploy". **3 commit prod-verified:** `e33481e` (feature Run #318 — Mig 56 + ma-trận-3-cột + badge designer/flow `BhFDF9IJ`/`BAkuRl3C`) → `21d1f4e` (bảng lưới `
` theo phản hồi anh "chưa chia cột giống Excel", Run #319 **`jOqxW4-p`**/**`DbsznVvR`** smoke 3×200). Mig 56 +ProInitial/ProAdjust cột PRO (additive + data-migrate ProEstimate→ProInitial 4 rows prod). Part 1 mỗi phòng sửa cột mình (PRO canEditPro / CCM canEditCcm / Dự án FE-only). Part 2+3 badge "✎ NS PRO/CCM" cạnh approver (display-only suy-role) ở Designer + flow Duyệt NCC. Test 339→**344**. reviewer bắt **race mất-dữ-liệu** Part 1 → vá `useIsFetching` 2 app (gotcha #70). **🔴 NEXT (em):** curate L1 over-cap reviewer **45KB** + inv-codebase 35KB (keep-floor-hit → manual condense) + cicd 29KB + test-spec 28KB. **NEXT (anh/anh Kiệt):** UAT bảng lưới bằng PRO/CCM (Ctrl+F5). Chi tiết → `2026-06-19-S76-pe-budget-matrix-table-grid.md`. · **Prev S75 (2026-06-18)** — **Harness-11 adopt: engine bộ-nhớ-và-governance tự-bảo-trì + 2 double-check** — anh giao `/check-email AI_INFRA` + `/adap-apply` (mỗi stage workflow-review) + double-check ×2 + finalize report + push + session-end. em main + **5 Workflow** (audit `wf_7fdc3bd5-930` → implement `wf_c5e5844e-7c1` → review `wf_d7ca1ff8-942` → double-check `wf_a0b68d2f-30e` → checklist-verify `wf_39cd4cbe-f07`). **0 production code.** Built 2 NO-API detector-script (`governance-detectors.ps1` C1-C5+B3 runtime **26 flag** bắt drift thật, C4 0-self-match · `memory-archive-gate.ps1` PHẦN A hysteresis/keep-floor/2-strike/A7 186/186) + `docs/governance/harness-11-engine.md` canonical (3-tier D5/D6/D7 + one-direction-lock D8) + **B1 ×11 count→pointer** (drift mig53→55/test306→339/gotcha68→69/table93→88 RESOLVED) + cadence-wire D1/D2 + agents/README. **completeness-gate FORMAL ĐẠT** (B 4/4 + C 5/5 + D 11/11; D5/D6/D7 explicit + D8 codify=YES). gotcha #30 reinforced (box-glyph ├└─ KHÔNG vào .ps1, kể cả qua Edit). 3 commit `e70c046`+`ae957c4`+`aa09e99` pushed + adap-report + email ai_infra (`2316773229f2`). State GIỮ NGUYÊN Mig 55·88 bảng·339 test·gotcha 69·bundle `BYF5vIMJ`/`CB-tiRxd`. **🔴 NEXT (anh):** restart CLI (cadence §2.1.3/§L.b + ef-core skill); curate reviewer 38.8KB+inv 31.5KB+cicd 26.8KB over-cap. Chi tiết → `2026-06-18-S75-harness-11-adopt.md`. · **Prev S74** — **PE ô "Ghi chú từ CCM" ngân sách gói thầu (Mig 55)** — anh forward 2 luồng Zalo (Trà Sol + Kiệt FDC) "CCM giống PRO cho nhập + ghi chú, hiện 0 hết" → em-main BE+Mig55 ∥ implementer-frontend FE 2 app SHA-mirror ∥ test-specialist (chết rate-limit → recover-disk). 2 fork anh chốt: **thêm CcmNote (Mig 55)** + **GIỮ phân vai CCM** (CostControl/Admin). Entity +CcmNote mirror ProNote · UpdatePeBudgetCcmCommand +CcmNote absolute-set role-gate · DTO+controller+mapping · FE dòng "Ghi chú từ CCM" gate canEditCcm. Test 334→**339** (+5). commit `8655ebf` (cicd **Run #315 PASS** — bundle admin `BYF5vIMJ`/user `CB-tiRxd`, Mig 55 applied prod). **"0 hết không nhập" = tài khoản thiếu role CostControl (KHÔNG bug)** → UAT bằng CCM/Admin. **🔴 NEXT (anh/anh Kiệt):** UAT ô CCM bằng tài khoản CCM/Admin + carry "Ngưỡng giá CEO" Mig 54. Chi tiết → session log `2026-06-18-S74-pe-ccm-note.md`. · **Prev S73** — **Mig 54 PE giá đề xuất PRO/CCM + CEO chọn giá chốt + CCM duyệt-done ô-tích (anh Kiệt FDC, go-live thứ Hai 22/06)** — em main + 6 sub + 2 review-workflow, 2 commit prod-verified (`1d86abc` feature Run #313 + `6aa4dcb` FE empty-candidates fix). Mig 54 5-cột additive-nullable + 2 setter role-gate + ApproveV2 ③ AUTO→OPT-IN + ① bind giá chốt; FE 2 app SHA-mirror; test 306→334. **Workflow review:** R1 schema-force 1/4 lane → R2 free-text 2/3 PASS (rủi ro FE empty-candidates UNREACHABLE per submit-guard `:194`). Bài học: review fan-out free-text/hmw KHÔNG ép-schema. **Governance:** em lệch mandate auto-Workflow → cam kết báo-TRƯỚC-khi-lệch. **🔴 NEXT (anh/anh Kiệt):** cấu hình "Ngưỡng giá CEO" Designer + test 3 luồng + xác nhận CCM-trước-CEO. Chi tiết → session log `2026-06-18-S73-pe-gia-de-xuat-ccm-done.md`. · **Prev S72** — **Harness-10 flat-refine + checklist-v2 adopt (re-audit 3-workflow) + sleep NO-OP** — audit `wf_13868efb-ea7` → implement `wf_ac43b5ff-7d1` → review `wf_d482e10d-5dd` (Harness-9 B1+B2). SE BEHIND flat → migrate run-trace SUBFOLDER→FLAT (hmw.js:103 + 5 doc; 5 run cũ giữ subfolder C8) + 2 broadcast 06-18 adopt + `/sleep-recovery-memory-l2` port (A8) + detector TAILORED-OUT + hmw.js H4.5→H8 doc-drift. **REVIEW (B2) bắt 2 lỗi IMPLEMENT-self-assess sót** (hmw.js:52 schema-stale + auto-check overclaim) → fixed (auto-check WIRED thật). em-main containment-check tự bắt reviewer residual-write (raw-Workflow no-writeGuard) → revert. B3 self-correct (runs path/count 14→22). Sleep `all`=NO-OP. **0 prod code, state GIỮ NGUYÊN.** adap-report + email ai_infra (`5f511fe5c0f2`). **🔴 NEXT (anh):** restart CLI (FLAT-runtime hmw.js + wired sleep-check + sleep-recovery skill). **🔴 NEXT (em):** curate investigator-codebase L1 28973 OVER + watch FD/test-spec. Chi tiết → session log `2026-06-18-S72-harness-10-flat-refine.md`. **Prev S71 — Harness-10 adopt: tracked run-trace folder + checklist 9-10** — em main + 3 Workflow (invest `wf_9c2cd2cd-2e7` → implement `wf_e4e46725-231` → review `wf_636bc95b-939`) per mandate Harness-9 PART 2. **0 production code**. Migrate `.claude/workflows/wave-*/` gitignored → `runs//` **git-TRACKED** (run.md+sub-md/+harvest/) + `_ledger.md` 2-nhịp + 3-layer anti-miss (L1 em-main@P1 / L2 session-start orphan-scan / L3 session-end close-gate idempotent) + **containment shift** (Harness-2 B6 "mọi tracked-change=vi-phạm" → "tracked-change NGOÀI run-folder + code-disjoint=vi-phạm"). hmw.js wave→run-trace (accept `args.run` + alias `wave`, path `sub-md/`, `node --check` PARSE-OK). **Review độc-lập (R2+R3) bắt C5 L1 over-claim** (doc nói hmw.js prompt-builder emit L1 reminder, grep engine=0 → engine no-fs → fixed path-a: L1 = em-main @P1 convention) — dogfood mandate B2 đúng. checklist 9-10: Part A (Harness-9 memory) + B (adap 2-workflow) done S70, Part C (Harness-10) 8/8 MỚI. **State GIỮ NGUYÊN: Mig 53·88 bảng·306 test·68 gotcha·menu 54·bundle admin `BgNCjwsG`/user `CBvh0vtf`.** + CLAUDE.md test-flush 263→306 (resolve H1 stale). **🔴 NEXT (anh):** restart CLI (hmw.js RUN-TRACE runtime + carry §2.1.2/Cat-6/H8). Chi tiết → session log `2026-06-18-S71-harness-10-run-trace.md` (pending). **Prev S70 —** **Harness-9 adopt: L2 archive dark-matter recovery + adap 2-workflow mandate** — em main + 3 Workflow (investigate `wf_be952f3c-97f` → implement `wf_a58e0d15-beb` → audit `wf_9520d8cd-4fe`) + 2 monitor bootstrap. **0 production code** (governance/memory only, commit `f36aab8` pushed). 4 over-cap sub-agent curate L1→L2 + `archive/_INDEX.md` (mục-lục substring sha-keyed) + `.gist.md` (4-field distill-gen:1, verbatim FROZEN) → **cả 4 < 25KB auto-inject cap** (P1 curate-debt CLOSED; ~240KB archive hết RAG-dark). PART 2/3 process-mandate codify (adap-apply 2-workflow + agents/README Upgrade S70 + session-start §2.1.2). **0-byte-loss git+sha verified** (Stage C audit + em-main self-gate khi 2 reviewer no-StructuredOutput → recovery-path). +memory-budget.json (seed-by-measure) + measure-agent-memory.ps1 + .ragignore + doc-drift 4-cite flush. adap-report + email-back ai_infra (`7c07b716e775`). **State THẬT GIỮ NGUYÊN: Mig 53 · 88 bảng · 306 test · 68 gotcha · menu 54 · bundle admin `BgNCjwsG`/user `CBvh0vtf`.** **🔴 NEXT (anh):** restart CLI để activate session-start §2.1.2 budget-audit + pending H8 inherit + reviewer Cat-6. Chi tiết → session log `2026-06-17-S70-harness-9-l2-recovery.md`. **Prev S69 —** **Văn phòng số (E-Office) port + golive + PE cờ gấp/ngưỡng CCM — 4 deploy prod-verified Run #305→#308, HMW-mode ON, 2 workflow fan-out**: #305 foundation PURO (shared PageHeader/KpiCard/WidgetCard + Dashboard 2-cột + sync fe-admin index.css đóng drift S66-S68) → #306 **re-skin TRỌN 10 page** (PURO layout + CSS Hồ sơ NS, phẫu-thuật-giữ-100%-logic) → #307 **Office golive public** read+create **16-key allow-list mọi role** (mirror S65, chạy SAU revoke; excluded Off_PhongHop_Manage/Off_AttendanceReport/Off_ChamCong; cicd DB-verify 16/16×13 role) → #308 **PE cờ gấp PRO/CCM + CCM duyệt-final theo ngưỡng giá trị** Mig 53 (anh Kiệt FDC sau họp sếp). **State THẬT: Mig 53 · 88 bảng · 306 test (45D+261I) · 68 gotcha · menu 54 · bundle admin `BgNCjwsG`/user `CBvh0vtf` Run #308.** 2 gotcha NEW (**#67** Tailwind accent palette thiếu-stop vỡ-màu-im-lặng · **#68** stale-diagnostic-background-agent → chỉ tin build sau-cùng). 2 truncation #53 (impl-backend positional-record + impl-frontend) → em main recover-disk + self-gate. **🔴 NEXT (anh/anh Kiệt UAT):** (1) cấu hình "Ngưỡng giá trị gói CEO" trong Workflow Designer (null=luồng cũ) + test phiếu < ngưỡng → CCM duyệt là xong, ≥ ngưỡng → lên CEO; (2) test cờ gấp PRO(đỏ)/CCM(xanh) → badge + notify CEO; (3) **xác nhận:** quy trình đặt CCM(CostControl)-trước-CEO + CEO = role Director (đích notify). **C (sau duyệt → chuyển phiếu đến dự án) chờ anh Kiệt spec form.** **NEXT (em):** 🔴 curate cicd-monitor **65.2KB** (worst, trend tăng) + inv-codebase 47 + reviewer 43.5 over-cap · doc-flush docs/CLAUDE.md full. Chi tiết → session log `2026-06-17-S69-vanphong-golive-pe-urgent-threshold.md`. **Prev S68 —** **Hồ sơ NS header chi tiết NV: làm nổi bật + fix tên render đen→trắng** — em main solo, 3 commit (2 FE + 1 docs), 2 deploy prod-verified Run #303-304 (anh UAT realtime): badge màu theo trạng thái + dòng meta đậm + tên to/drop-shadow (#303 `6983609`) → anh báo "tên đen nền xanh ko nổi bật" → diagnose **rule `h1-h4{color:#0b1220}` viết NGOÀI `@layer` thắng `text-white`** (Tailwind v4 unlayered > all layers, **gotcha #66 NEW**, load-bearing ~30+ heading → fix ĐIỂM `text-white!` không move @layer) + thu nhỏ `text-lg` (#304 `37752eb`). Bootstrap: 2 monitor RE-REPORT CLEAN + 2 doc-drift fix (dep-audit 64→65 · root CLAUDE 263→286, `11bc96d`). **State THẬT: Mig 52 · 88 bảng · 286 test · 66 gotcha · menu 53 · bundle admin `CNUv1jxY`/user `CpOskeS1` Run #304.** ⚠️ curate-debt P1: cicd-monitor **44.1KB**. Chi tiết → session log `2026-06-16-S68-hoso-header-name-color-fix.md`. **Prev S67 —** **buổi sản phẩm LỚN, 6 deploy prod-verified Run #297→#302** (anh + anh Kiệt FDC UAT realtime, HMW-mode ON): fe-user Hồ sơ NS đồng nhất font + chữ đen→**xanh đậm `brand-800`** (#297) · **fe-admin mirror master-detail** + vá accent tokens index.css [đóng pending lớn nhất HRM go-live, page SHA256 ×2] (#298) · **+23 test-after HRM** → 263→**286** (#299) · **list flex-row gọn** [hết tràn ngang rail] + đồng nhất cỡ chữ ×2 (#300) · **PE Link hồ sơ auto-detect** web→hyperlink/`O:\`→Copy (#301) → **link `file://` bấm-thử** (#302). **Research 3-agent:** auto-mở `O:\` từ web = chỉ **Edge GPO `IntranetFileLinksEnabled`** (zero-per-machine) one-click thật; default chặn https→file://. **State THẬT: Mig 52 · 88 bảng · 286 test (45D+241I) · 65 gotcha · menu 53 · bundle admin `CcrZqfht`/user `DniDFUB_` Run #302.** test-specialist trunc #53→recover-disk; 0 prod bug. Chi tiết → session log `2026-06-16-S67-hoso-visual-pe-link-research.md`. **Prev S66 — session-end closeout em-main-solo:** adopt **Harness-8 all-inherit** (7 sub demoted `claude-opus-4-8`→`inherit` → cả 11=inherit, gỡ two-tier H4) + **cicd-monitor L1 curate 86.8→28.9KB** (byte-exact sed → `archive/2026-06.md`) + **ef-core skill doc-flush Mig 50→52** + check-email AI_INFRA (**0 thư mới se-directed**). ~17 file docs/gov/config, **0 production code** → state THẬT GIỮ NGUYÊN (Mig 52 · 88 bảng · 263 test · 65 gotcha · menu 53 · bundle `BDwV5d0X`/`DbVv6rsf`). ⚠️ **Restart CLI** → H8 runtime (frontmatter no hot-reload) + reviewer Cat-6. adap-report + email-back ai_infra (`fa7f690d` MATCH). Chi tiết → session log `2026-06-16-S66-closeout-harness8-cicd-curate.md`. **Prev S65 — HRM go-live: public Hồ sơ Nhân sự + trang master-detail giống NamGroup + Department hierarchy Mig 51 + PE Link hồ sơ Mig 52 + gốc cây SOLUTION COMPANY**, ~6 deploy prod-verified Run #289→#295, anh + anh Kiệt FDC UAT realtime. **State THẬT: Mig 52 · 88 bảng · 263 test (45D+218I) · 65 gotcha · menu 53 · bundle admin `BDwV5d0X`/user `DbVv6rsf` Run #295.** Workflow fan-out chạy THẬT lần đầu [PE] — BE∥FE parallel OK nhưng FE+reviewer return-rỗng #53 → em main recover-disk + self-gate. gotcha #65 [build csproj con ≠ slnx → CS7036]. Chi tiết → session log `2026-06-16-S65-hrm-golive-employee-masterdetail-pe-link.md`. **Prev S64** adopt **Harness-7 writing-quality floor** qua `/adap-apply` + email ai_infra — em main solo, 1 commit `6afde19` docs/gov-only. Outward comms = tiếng Việt câu-hoàn-chỉnh; nội bộ giữ nén (asymmetric). reviewer +Category 6 (verified-pending-restart → cần restart CLI). Broadcast body-hash verified KHÔNG mis-stamp (gotcha #61 UTF-8). Prev S63 docs-closeout bù S60/S61/S62 — 3 session product ship CODE prod-verified nhưng KHÔNG closeout docs (UAT realtime anh Kiệt FDC). **State THẬT: Mig 50 · 88 bảng · 263 test · 64 gotcha · menu 53 · bundle admin `0xKYGhhf`/user `C81ZdG9G` Run #286.** S60-62 = PE ràng buộc gửi-duyệt + gỡ "Từ chối" (S60) · Mig 50 ngân sách per-gói-thầu Excel anh Kiệt + XÓA module Budget cũ (S61) · vượt-NS cảnh-báo-mềm (S62). Reconcile stray reviewer cwd-misland + count-flush 4 file. Chi tiết → session log `2026-06-12-S60-S62-pe-budget-workitem-softwarning.md`. Prev Session 59 ( **6 đợt ship prod-verified Run #273→#278**: wipe transactional testing data (10 PE + 7 HĐ demo + 64 notif = 0, mã reset → phiếu thật đầu tiên team tạo = **PE/2026/A/001** ✓) `56882ac` #273 · PE tree Panel 1 chốt 4 tầng **Năm > Dự án > Hạng mục > Phiếu** `0eafcd3` #274 · dọn 15 mã hạng mục demo "tự đẻ" (chị Trà Sol) + gỡ seed gốc, WorkItems 86→**71** `bbd1554` #275 · **rename 71 mã đúng format PMH anh Kiệt** (`MAT-n`/`SUB-n`/`MEP-SUB-n`/`MEP-EQU-n` + tên "STT nhóm tên"; **DB-trước-code-sau** gotcha #62 + sqlcmd `-f 65001` gotcha #61) `c869d26` #276 · UAT vòng 1: NEW `ui/SearchableSelect` gõ-lọc bỏ dấu (Hạng mục/Dự án) + auto Địa điểm + điều khoản đa dòng `faed59f` #277 · UAT vòng 2 (anh chốt ×2): ẩn Trả lại/Từ chối khi tự duyệt phiếu mình soạn + quick-add NCC ngay form (POST /suppliers any-auth, authz probe 4/4) + NCC gõ-tìm A-Z + upload multi-file `9c330d2` #278 · UAT vòng 3-6 realtime (#279/#281 cancelled-supersede-benign): bảng NCC table-fixed `f21c55d` + bỏ ô Tên ngân sách `69997da` #280 + GỠ field Điều khoản TT mọi form `80b64dd` + bỏ nút Thêm hạng mục `792c030` **#282 FINAL**. Tổng 10 đợt (8 PASS + 2 cancelled-benign). Bundle FINAL admin **`B1DtNT9C`**/user **`D6uF3Mln`**. Test 240. Gotchas 62. 0/14 spawn truncated. → session log `2026-06-11-S59-wipe-tree-pmh-uat-batch.md`. Prev S58 — **5 đợt prod-verified Run #382/#383/#384/#386** (#385 cancelled-supersede-benign): lock-demo-user fix (việc sếp deadline 15:00 ĐÓNG TRỌN — gotcha #60/E-008/AS-12, root cause password 11<12 từng phát hiện S22 nhưng const không fix) + tạm ẩn HRM/Office/Cá nhân + Danh mục cuối (`6c5fd26` #383) + **fe-user redesign theo UI/UX guide AI_INFRA giữ brand** (`e959f72` #384) + **brand polish ×2 app "thấy rõ"** (`ea793a4`: stripe 4px đỉnh + thead brand) + **PE gộp Tên-gói-thầu = chọn Hạng-mục** (anh Kiệt FDC chốt, `3ebaf84` #386 — bundle final admin `DMm9rtNA`/user `BUkOMn_Y`). Email AI_INFRA processed (guide + ACK H4 ACCEPT). Test **240**. → session log `2026-06-11-S58-lock-fix-hide-modules-redesign-pe-merge.md`. Root cause 2 tầng: lock-list = population Dev-only + `DemoUserPassword` 11 ký tự < prod RequiredLength=12 → CreateAsync silent-fail từ trước tới giờ (= "helpdesk inert" S56). Fix union 20 UAT email + password 12 ký tự → prod 55 user/34 locked, nv.cao+nv.truong sống, 5 real staff tạo. gotcha #59+#60. Commit `5998163`. Prev S57bis — **PE gắn Hạng mục (Mig 49) + Pe all-role + menu Cá nhân + Harness-4 runtime-VERIFIED**. Test 228→**240**. Bundle `CP4CB1ym`/`BmZ3VHnm`. Commit `17b23a4`+`dd117b7` → Run #381 PASS+1PARTIAL (lock NO-OP → RESOLVED S58). Prev S56 — **Pre-golive verify sweep + golive-harden 4 fix — Run #379 PASS, code golive-ready**. WF1 `pre-golive-verify` 7-stream + adversarial → 6 PASS/1 CONCERN/0 blocker = GO (key finds = ops not code). WF2 `golive-harden` fix 4: #3 LeaveBalance lost-update→atomic ExecuteUpdate+Serializable tx (NO mig) · #5 ItTicket authz Forbidden-trước-NotFound · #6 DocxRenderer null-guard · #4 Travel/Vehicle ApproveV2 tests. Test 216→**228**. Bundle FROZEN `4SUwDLD8`/`XdKzt9LL`. `sys.tables` re-ground 92→**93**. gotcha **#58** NEW. reviewer StructuredOutput-fail→em main đỡ. **2 ops VPS pending** (gán user IT + tzutil UTC+7). FE Phase 2 redesign **deferred** (recon ready). Commit `a20cde8`. Prev S55 — **Nạp master data thật từ Excel (62 dự án + 71 hạng mục + 3 NCC) + Project +4 cột (Mig 48) — prod-verified**. HMW-mode ON. Commit `69cb393` → Run #377 PASS ~4m33s. Test 216 (compile-fix only). Bundle admin `B-d6893W`/user `XdKzt9LL`. `SeedRealMasterDataAsync` ungated idempotent → coexist demo. 2 agent return truncated (BE+reviewer) → em main disk/runtime-recover. Prev S54 — IT staff tự reassign ticket (cross-stack authz) — prod-verified. 1 code commit `ca4b602` → Run #376 PASS ~4m18s. Test 203→**216**. Bundle admin `DfCfHUE9`→`DmjI8Cmn`/user `_3S0BPJ2`→`YxL_MljK` (cả 2 rotate). NO migration. Task 1 Phase 9 Ops anh dừng. ⚠️ residual: 3 agent ghi MEMORY nhầm `src/Backend/.claude` → em main reconcile. Prev S53: gotcha #57 EXT Master Mig 47 + P11-D/E + database-agent verified-runtime.) --- diff --git a/docs/governance/vocab-alias-map.md b/docs/governance/vocab-alias-map.md new file mode 100644 index 0000000..7c9ad51 --- /dev/null +++ b/docs/governance/vocab-alias-map.md @@ -0,0 +1,72 @@ +# Vocab Alias-Map — Bản đồ Thuật ngữ Tương đương + +> **Mục đích:** Đây là nguồn duy nhất (single source) ghi lại các cặp thuật ngữ ĐỒNG NGHĨA trong SOLUTION_ERP — một khái niệm nhưng đang tồn tại dưới hai cái tên (canonical hiện hành ↔ alias lịch sử đã bị thay thế). Tài liệu phục vụ đợt kiểm tra trôi-nghĩa (drift audit) hằng tháng: khi detector `scripts/governance-detectors.ps1` (kiểm tra C3 — vocab-fork) phát cờ báo "hai biến thể cùng sống side-by-side", người rà soát mở file này để tra ngay đâu là từ chuẩn, đâu là từ cũ, và lý do đổi tên. +> +> **Chủ sở hữu ghi (single-writer):** em-main. Tài liệu **append-only** — chỉ thêm dòng mới khi phát sinh cặp thuật ngữ mới, KHÔNG viết lại các mục cũ. Sub-agent chỉ đọc, không được sửa (tuân thủ nguyên tắc D9 single-writer). +> +> **Phạm vi:** Chỉ ghi các cặp thật sự là MỘT khái niệm hai tên (fork-để-hợp-nhất). KHÔNG ghi các từ trùng-mặt-chữ nhưng khác nghĩa (ví dụ "memory-fidelity", "coverage", "audit") — những từ đó đã được phân biệt bằng ngữ cảnh trong `harness-11-engine.md` PHẦN H/I và cố ý KHÔNG seed vào detector. + +--- + +## ⚠️ Lưu ý nền tảng — vì sao alias vẫn còn xuất hiện đầy trong repo + +Phần lớn số lần alias xuất hiện là **hợp lệ theo lịch sử — KHÔNG phải drift cần sửa**. Các file dưới đây **ĐÓNG BĂNG (frozen), tuyệt đối không viết lại**: + +- `docs/changelog/sessions/**` — nhật ký từng session (ghi lại đúng từ ngữ tại thời điểm đó). +- `docs/_archive/**` — snapshot STATUS/HANDOFF đã archive verbatim. +- `docs/governance/adap-reports/**` — báo cáo adoption đã chốt. +- `.claude/workflows/runs/**` — vết chạy workflow (run-trace), git-tracked bất biến. +- `broadcasts/inbox|outbox/**` — thư liên-team đã gửi. + +Một session-log viết "two-tier" hồi S60 là **đúng sự thật lịch sử** — nó phản ánh mô hình còn hiệu lực khi đó. Không được sửa ngược quá khứ. Do vậy alias sẽ **mãi mãi còn tồn tại** trong các file đóng băng, và detector C3 (quét TOÀN BỘ `docs/**` + `.claude/**` *.md, KHÔNG loại trừ file frozen) sẽ **vẫn tiếp tục báo cờ MED** cho mỗi cặp — đây là trạng thái **documented-known**, không phải lỗi tồn đọng. Việc "làm sạch" chỉ áp dụng cho các file **đang-sống (live-editable)**: `docs/STATUS.md`, `docs/HANDOFF.md`, các `SKILL.md`, `agent-memory/**/MEMORY.md` (bản HOT, không phải archive), và các doc governance đang bảo trì. + +--- + +## Bảng thuật ngữ tương đương + +### 1. `run-trace` (chuẩn) ↔ `wave-folder` (alias cũ) + +| Thuộc tính | Giá trị | +|---|---| +| **Canonical (hiện hành)** | `run-trace` — thư mục cô lập bộ nhớ mỗi lần chạy workflow tại `.claude/workflows/runs//` | +| **Alias (đã thay thế)** | `wave-folder` / `wave-*` — tên cũ của cùng thư mục cô lập đó | +| **Đổi tên bởi** | Harness-10 (Session 72, 2026-06-18) — đổi cấu trúc `wave-*` sang mô hình run-trace phẳng (`sub-*.md` + `*-synthesis.md`) git-tracked | +| **Ghi chú frozen** | Session-log/adap-report/runs cũ giữ nguyên "wave-folder" — đúng lịch sử, không sửa | + +### 2. `Ngân sách PRO` (chuẩn) ↔ `Dự trù PRO` (alias cũ) + +| Thuộc tính | Giá trị | +|---|---| +| **Canonical (hiện hành)** | `Ngân sách PRO` — nhãn cột/badge PRO trong ma trận ngân sách PE (module PurchaseEvaluation) | +| **Alias (đã thay thế)** | `Dự trù PRO` — nhãn cũ trước khi anh Kiệt (FDC) yêu cầu đổi | +| **Đổi tên bởi** | Session 65 (2026-06-16) — anh Kiệt Zalo: "Dự trù PRO → Ngân sách PRO"; áp dụng row + badge trên cả 2 app (fe-admin + fe-user), SHA256-mirror | +| **Ghi chú kỹ thuật** | Field BE gốc `PeWorkItemBudget.ProInitialAmount` ("Ban hành lần đầu") + `ProAdjustmentAmount`; nhánh `ProEstimateAmount` cũ đánh dấu LEGACY (Mig 56 migrate → ProInitialAmount). Còn 1 comment mã nguồn stale ở `PurchaseEvaluationDtos.cs:324` ("badge dự trù PRO") — chỉ là comment, KHÔNG phải nhãn FE đang render; có thể dọn khi tiện, không bắt buộc | +| **Ghi chú frozen** | Session-log S65 và bản archive giữ "Dự trù PRO" — đúng lịch sử | +| **Lưu ý mở rộng** | `PeWorkItemBudget` là tên ENTITY (khái niệm khác — bảng ngân-sách-per-gói-thầu), KHÔNG phải alias của nhãn PRO. "PRO" = Procurement (phòng Mua hàng), không phải viết tắt khác | + +### 3. `all-inherit` (chuẩn) ↔ `two-tier` (alias cũ) + +| Thuộc tính | Giá trị | +|---|---| +| **Canonical (hiện hành)** | `all-inherit` — mọi sub-agent kế thừa model lead (chất-lượng > chi-phí), cấu hình qua frontmatter + `hmw.js` resolveModel | +| **Alias (đã thay thế)** | `two-tier` — mô hình cũ 2 tầng (lead promote-inherit vài agent / demote-pin số còn lại về Opus) | +| **Đổi tên bởi** | Harness-8 (Session 66, 2026-06-16) — thay mô hình two-tier model-promotion bằng all-inherit | +| **Ghi chú frozen** | Các adap-report Harness-4/5 và session-log ≤ S66 giữ "two-tier" — đúng lịch sử tại thời điểm đó | + +--- + +## Quy trình cập nhật (khi thêm cặp mới) + +1. Chỉ append 1 mục `### N.` mới bên dưới, KHÔNG sửa mục cũ. +2. Ghi đủ 4 trường: **canonical · alias · đổi-tên-bởi (Harness/Session) · ghi-chú-frozen**. +3. Nếu muốn detector nhận-biết cặp mới, seed vào `$aliasSets` trong `scripts/governance-detectors.ps1` (C3). Lưu ý: detector CHỈ grep, KHÔNG đọc file này — xem mục dưới. + +--- + +## Về việc detector có "im" sau khi tạo file này không + +**KHÔNG.** Detector C3 (`scripts/governance-detectors.ps1`) là **pure-grep**: `$aliasSets` được hard-code trong script (dòng ~350-354), và C3 báo cờ mỗi khi ≥2 biến thể của một set còn sống trong corpus. Nó **KHÔNG đọc bất kỳ alias-map file nào**. Vì các file frozen (mãi mãi chứa alias) nằm trong phạm vi quét, cờ MED cho cả 3 cặp sẽ **vẫn còn** — nay chuyển trạng thái thành **documented-known** (đã có tài liệu giải thích tại đây), không còn là drift lạ. + +> Câu "resolve: … or record an alias-map in docs/governance" trong output detector là **gợi ý cho con người**, KHÔNG phải hook tự-động. Muốn detector THẬT-SỰ ngừng báo cặp nào, phải sửa `$aliasSets` (bỏ set đó) — nhưng làm vậy sẽ mất khả năng phát hiện fork tương lai, nên **không khuyến nghị**. + +> **Cảnh báo self-match:** File `vocab-alias-map.md` này tự thân chứa cả 6 thuật ngữ ở dạng live → nếu KHÔNG loại trừ, nó sẽ tự-đóng-góp thêm 1 file live cho MỖI biến thể và khiến detector đếm sai. Cần thêm đường dẫn `docs/governance/vocab-alias-map.md` vào `$ExcludeExact` trong `governance-detectors.ps1` (đặt cạnh `harness-11-engine.md` đã được loại trừ sẵn) để tài liệu này không tự-match. Đây là bước bắt buộc khi commit file. diff --git a/scripts/governance-detectors.ps1 b/scripts/governance-detectors.ps1 index 44079d3..3957f00 100644 --- a/scripts/governance-detectors.ps1 +++ b/scripts/governance-detectors.ps1 @@ -88,7 +88,8 @@ $VN_NGANSACH_PRO = U @(0x4E, 0x67, 0xE2, 0x6E, 0x20, 0x73, 0xE1, 0x63, 0x68, 0x2 # --------------------------------------------------------------------------- $ExcludeExact = @( (Join-Path $RepoRoot 'scripts\governance-detectors.ps1'), - (Join-Path $RepoRoot 'docs\governance\harness-11-engine.md') + (Join-Path $RepoRoot 'docs\governance\harness-11-engine.md'), + (Join-Path $RepoRoot 'docs\governance\vocab-alias-map.md') ) | ForEach-Object { $_ -replace '/', '\' } $ExcludeDirFragments = @(