# Investigator-Codebase Agent — Persistent Memory

> **Persistent diary cross-session.** Auto-injected first ~200 lines at spawn (L1 HOT). Update BEFORE every stop; keep entries to 1 line (gotcha #53 truncation — hook hard-cap 24.4KB, curate S180: 24.9→~13KB). Verbatim entry dài → `archive/2026-08-curate-s180.md` + `archive/2026-0{5,6,7}.md` + `archive/_INDEX.md` (substring, Ctrl-F) + `runs/*/sub-*.md`. Renamed S39: investigator → investigator-codebase (internal; external → investigator-api).

## 🎯 Role baseline
Read-only INTERNAL audit SOLUTION_ERP. Tools: Read/Grep/Glob/Bash + 5 RAG MCP. Output: concise <500w + file:line. Skills: contract-workflow + permission-matrix + ef-core-migration.
- ✅ MINE: sqlcmd schema scan, EF/grep, controller/authz audit, migration diff, count grounding
- ❌ NOT: external docs/CVE/lib → investigator-api · write → implementer · test → test-specialist · architecture decision → em main

## 📌 Recent invest (1-line digest; verbatim → archive + runs)
- **S190 (08-12) YC-029/YC-030 GĐ3-điều-chỉnh 3-chặng #53×2 artifact-cứu-100% [`runs/2026-08-12-S190-soltuon-dieu-chinh-hd/sub-invest-b1-fable.md`]:** bug menu HĐ root-cause **A** (`Ct_*_WfView` cả 7 loại `?type=3`=ApplicableType ⟂ accordion `Layout.tsx:470-485` đọc `type` như ContractType → mutex đóng/mở nhầm nhóm) + **B** (`?phase=9` transient làm 2 leaf sáng — PE chữa `view=approved`); **máy ĐÃ per-loại từ S188** (7 mã `HD-*` `ContractApprovalWorkflowFamily.cs:33-42` + 4 guard + PA-A) ⇒ "lẫn" = 3 lỗ UI THUẦN không phải data; Thứ-5 admin **ĐÃ có ~95%** (7 menu-row seed + Designer slice + route) thiếu ĐÚNG 1 nhánh `resolvePath` fe-admin `Layout.tsx:175-189` ⇒ 7 leaf drop im lặng #50 (comment ngay đó tự cảnh báo #50 — vá-tệp-A-quên-tệp-B). Bài: **spec viện "khuôn X sẵn" PHẢI mở X đọc** — "trang tự suy type theo path" SAI (chỉ đọc `?type`, bỏ = trang trắng Duyệt-NCC), "BE param pendingMe sẵn" SAI (0-hit Contract, ASP.NET nuốt im lặng). Tag `[s190, khuon-vien-dan-phai-mo-doc, may-per-loai-lech-UI, resolvepath-drop-50]`
- **S185 (08-09) ×Fable audit per-id 39 thư AI_INFRA post-watermark [`runs/2026-08-09-S185-email-adap-pipeline/sub-invest-email-adap-fable.md`]:** 0/39 NỢ-THẬT — brief/run.md stale-BI-QUAN 2 tiền-đề (BÁC: "~15 exact-report" thật 33/39 cùng-tên commit đương-thời, batch-10 `398d3434`; "điều-kiện-3 chờ anh" thật GHÉP @S181 `ACTIVE-MARKS §LT3` bậc-2) ⇒ luật: đo lại tiền-đề carry TRƯỚC audit (HANDOFF:74 tự đúc mà pipeline vẫn giẫm); adap-reports = 107 file không phải 12; report-tồn-tại ≠ report-có-ruột → phân biệt copy/backfill/thật bằng `cmp` (4/4 DIFFER) + mtime + `git log --diff-filter=A`; 21 nợ-MỤC (16 C + 5 CHỜ-ANH), nợ-thư lớn nhất = day-wake 07-28 agreed-only (`/day.md` MISSING, 3 chạm canonical chờ anh); return-1 dính #53 giữa chừng — artifact đổ-ruột cứu trọn, resume 0 mất. Tag `[s185, stale-bi-quan-tien-de, cmp-copy-vs-report, carry-do-lai-truoc-leo-thang]`
- **S182 (08-08) ×Fable KHKK 8-nhóm AWF mirror DuyetNcc [`runs/2026-08-08-S182-khkk-awf-mirror-ncc/sub-invest-be-fable.md`]:** BE generic ~85% — 8 workflow seed `KHKK-N{n}` CÙNG ApplicableType=10, phân biệt bằng CODE (`DbInitializer.cs:549-687`, idempotent per-Code CỐ Ý né khuôn per-type) ⇒ bất biến only-1-active-per-type VỠ TỪ SEED + POST version mới deactivate CẢ 8 (`ApprovalWorkflowV2AdminFeatures.cs:339-343`); 9-checkbox = 9 cột per-Level dùng chung mọi type nhưng KHKK runtime CHỈ đọc F5 (`ContractSigningPlanWorkflowService.cs:276`) ⇒ 6/9 tick cho type-10 = #78-class cờ-nằm-im; bypass rào-(v) 2-bước (UpdateDraft re-pin `ContractSigningPlanFeatures.cs:603-607` chỉ check type, không re-check group-match); DELETE version 0 usage-check + `DbUpdateException` KHÔNG được middleware map ⇒ FK Restrict nổ 500 không phải 409 (`GlobalExceptionMiddleware.cs:39`); 32 policy `AwV2_KhkkN*` 0 consumer BE (0-hit Api + control-dương `KeHoachKyKet` 29-hit cùng path) — mirror y 2 key `AwV2_DuyetNcc*` cũ; FE 8 route KhkkN đổ landing chung (`TYPE_CODE_TO_INT` thiếu key). #53 cắt return giữa phiên — artifact đổ-ruột-liên-tục cứu trọn, 0 mất. Tag `[s182, seed-code-family-cung-type, khkk-runtime-chi-F5, policy-menu-only, dbupdate-500]`
- **S180-W1a (08-07) kiểm-kê MÁY-ĐỌC-TÊN [`runs/2026-08-07-S180-adap-upgrade-pack-phased/sub-w1a-mayd-octen.md` 44.9KB]:** 14 đoạn máy (11 vỡ-CÂM · 3 ồn · **0 tự-thích-nghi**) · BÁC 2 (`detectors:1716`+`:1679` = CHÚ THÍCH không phải mã; `applied-eval-nokey.ps1` = 0 file-IO, control-dương mfe-eval=14). **Luật rút ra: nhóm tên sạch CHÍNH XÁC tới độ sâu máy KIỂM, không sâu hơn 1 nấc** — STOP-HARD KHÔNG cần (`detectors:1639` chỉ INFORM mà `session-<N>` sạch 12/12); cần **máy TỪ CHỐI**, vì *đọc-rồi-liệt* (`$unmapped:1109`) + *chấp-2-tên* (`-or :1660`) + *[skip] not found* đều để tên trôi. 🔴 `memory-selfimprove-audit.ps1:298` còn dùng `-Filter 'sub-*.md'` = ĐÚNG bug C11(b) đã vá @S159 ở `detectors:1102` — **vá tệp A quên tệp B**. Bất biến ngầm 0-máy-kiểm: `agents/<role>.md`.BaseName ≡ `agent-memory/<role>/`. Miễn-trừ 5 vùng đóng băng nuốt **73,2% kho .md (1131/1545) + 90,7% lệch đã biết (225/248)** ⇒ máy soi quét .md trả 0-hit vô nghĩa; đường thoát = quét **231 tên vật-bộ-máy, 0 miễn trừ**. `CLAUDE.md:151` khớp 64/159=40,3% đĩa, 0 máy chặn, sống nhiều tháng. Tag `[s180, sach-toi-do-sau-may-kiem, va-tep-A-quen-tep-B, mau-so-sau-mien-tru]`
- **S180 (08-07) ×Fable fit-map 4-thư upgrade-pack 7GĐ [`runs/2026-08-07-S180-adap-upgrade-pack-phased/sub-invest-fitmap-S180.md`]:** PHỦ-ĐỦ 7GĐ/12TC/9LỖI. Nghề: hash mesh CHỈ tin máy canonical `scripts/stamp_verify.py` (tự chế MISMATCH cả 4 = suýt phán tamper sai) · TÔI = vai 7/7 dính #53 + bị bắt LỚP-7 tự-giẫm (202K đọc/7KB đĩa) → "đổ ruột TRƯỚC đo SAU" cứu; tỉ-lệ byte-đĩa/token-đọc = tín hiệu giám sát · xung đột duy nhất gói: SE exit-0-advisory (`governance-detectors.ps1:1963`) ⟂ hub cổng-chặn-mã-lỗi → VƯỢT-KHUNG · GĐ-5 gần xong nhất / GĐ-4 hổng nhất (0 sổ-yêu-cầu-anh, 0 chấm-điểm) · bác-một-phần lead: `pull_warn_days` trống = CỐ Ý owner có khai (`check-email.md:48`) ≠ ghost-wire. Tag `[s180, stamp-verify-canonical-only, lop7-tu-giam, exit0-vs-gate]`
- **S175 (08-05) ×Fable cột DỰ ÁN ma-trận NS [seed on-behalf; `runs/2026-08-05-S175-duan-budget-column/`]:** BÁC 2 tiền-đề lead — cột = CHỖ-CHỪA-SẴN (`e33481e` cùng-commit comment `PeWorkItemBudget.cs:19`, KHÔNG phải di-chứng Mig50) · `—` = 11 ô/app không phải 3; phả-hệ đo bằng commit-sinh-ra + comment cùng commit, đừng suy từ khoảng-thời-gian-gần. `Project.BudgetTotal` sống từ Mig-2 nhưng Dev 61/69 NULL = "cơ-chế đúng dữ-liệu không có" lần 7. Spawn TASK-RỖNG cứu bằng run.md trên đĩa. Tag `[s175, pha-he-commit, artifact-dia-cuu]`
- **S171 (08-04) ×Fable KHKK-UI-mirror-PE [`runs/2026-08-04-S171-khkk-ui-mirror-pe/` 44.8KB]:** VERDICT 27-giống/6-buộc-khác/8-gap; §0 đính-chính ground-truth lead TRƯỚC §1 (nghề đúng); bị 3 lane reviewer lật: miễn-trừ 6→3, 6 acceptance gãy khi chạy thật ⇒ **đầy-đủ ≠ đúng, invest 44KB không thay được reviewer đối-kháng**. Tag `[s171, day-du-khong-bang-dung]`
- **S160 (07-29) dry-run toàn-trình HĐ-cứng 2-lane [`runs/2026-07-29-S160-khkk-dryrun-plan/`]:** `Hdc_*` = 7-leaf-per-ContractType (`DbInitializer.cs:1862-1867`, lead sai 2 grounding) · KHÔNG có phase KyCung (GĐ4 = DERIVE sau terminal 9, 0 mig) · 🔴 `DeleteContract` guard so SỐ `Phase >= DangInKy` chặn xóa cả 9/10/98/99 · mặt tấn công = Reject-trước-guard `ContractWorkflowService.cs:49-66` · "MB" codegen không gốc RG-001 · prod Contracts = 0 active/0 deleted (sổ "7 HĐ V1" stale). Tag `[s160, delete-guard-numeric, reject-truoc-guard]`
- **S158 (07-28) ×Fable day-wake-probe-first [seed on-behalf; `runs/2026-07-28-S158-day-wake-probe-first/`]:** return CLEAN giữa closeout 7/8 lane #53 — khác biệt = ghi-đĩa-từng-phần + verify-RUỘT trước return. BÁC 2 tiền-đề lead bằng **cửa-cho-verdict-ngược** (mạnh hơn lập luận nguyên tắc); anchor = **carrier-commit** `git log --diff-filter=A -1 -- <marker>` sống-sau-squash; **đo BYTE cấm quy token** (`tiep_reload` = 122.115 B / 5 nguồn). Tag `[s158, carrier-commit-anchor, byte-khong-token]`
- **S157 (07-28) KH-ký-kết b.7→12 [`runs/2026-07-28-S157-ke-hoach-ky-ket-hd/`]:** O-1 tái dùng khung V2 + 7 bảng `ContractSigningPlan*` + `ApplicableType=10`; 🔴 twin-bẫy: **Proposal-lite ApproveV2 PHÁ OR-of-N** (`ProposalFeatures.cs:427-439` flatten + `ElementAtOrDefault`) ⇒ KH service PHẢI copy `ContractWorkflowService.ApproveV2Async:217-394`; ISO 9-bước ↔ ContractPhase 1:1; #53 skeleton-chặn @202K → Edit-liền-tay từng mục. Tag `[s157, proposal-lite-breaks-or-of-n]`
- **S156 (07-27) BCH post-CEO b.7→21 [`runs/2026-07-27-S156-bch-post-ceo-flow/`]:** verdict LAI — 13→21 tái dùng Contract (7 dòng LEGACY `ContractPhase.cs:11-13` = trạm gỡ cố ý) · 7-12 dựng mới; chuỗi "cơ-chế đúng thứ-đi-qua-không-có": cầu PE→HĐ pin V1 (`CreateContractFromEvaluationFeatures.cs:68-71`) · `GetEligiblePhases`+inbox 100% LEGACY ⇒ approver V2 mù HĐ ChoDuyet · SLA V2 hardcode AddDays(7)×3 · notify chỉ Drafter. Bắt lead sai 12-enum/7-LEGACY. Tag `[s156, eligible-phases-legacy-only]`
- **S155 (07-27) PE xóa-phiếu 4 lượt [`runs/2026-07-27-S155-pe-delete-approver/` + archive/2026-07.md]:** menu = SEED-DB 6-chỗ-mirror, đổi KEY = mồ côi 13-row/key ⇒ giữ key đổi label · `?type=1&phase=7` chạy được hôm nay 0-route-mới · 🔴 WF-V2 **0 lệnh Update** — sửa cờ = POST version mới = **Id mới mà phiếu pin Id cũ (F17)** ⇒ ChoDuyet kẹt vĩnh viễn, 0 backfill re-pin; con trỏ LAI Bước=INDEX ⟂ Cấp=ORDER ⇒ ranh an-toàn = không đổi tập Order; OR-of-N xác nhận `:689` (comment `ApprovalWorkflow.cs:81-82` SAI) · `Department.ManagerUserId` 0/10 Dev + 2 FE hardcode null tự-xoá. Tag `[s155, wf-v2-no-update-cmd, f17-new-id-unreachable, menu-seed-db]`
- **S153 (07-26) ctx soft-memory spec [fable-real, `runs/2026-07-26-S153-ctx-adopt/`]:** SE 0 content-ts-reader sống ⇒ rào-2 canonical `_TS_KEY_RE` đặt session_ctx.py, máy-7-phép = EXTEND python (tái dụng `_SECRET_RES` 1-nguồn); `secrets_sweep` rglob trọn session-dir; `_mind` mới-nhất-ở-TRÊN ⟂ `_context` FLOW-ở-CUỐI; C11(b) filter khiến tên `sub-ctx-audit-*` lọt lưới. Tag `[s153, ts-reader-absent, one-source-regex]`
- **S149→S152 (07-24→25) 10-invocation + R1 [lead on-behalf; `runs/2026-07-24-S149-*/` + `runs/2026-07-25-S149-adap-backlog/`]:** chẩn-đoán "SE = rules-đủ MÁY-THIẾU" (0 script GHI counter → "đo rồi như chưa đo" ×3) đứng qua gate → spec bookend M1-M9; #53 3 sub-class (ngược-#53 · kinh-điển · mất-cả-hai); ghi-đĩa-trong-lúc-làm = CẦN KHÔNG ĐỦ. R1: **KHÔNG fabricate — uncertain + reason; mọi số kèm lệnh**. Tag `[s149, rules-du-may-thieu, s152-no-fabricate]`
- **S148 (07-23) PE tree DUP project by-space:** `FLOCK 01`/`FLOCK01` = path-A TWO real Project rows diff-by-space; tree groups `p.projectId` GUID (`PurchaseEvaluationsListPage.tsx:192-197`); CRUD zero-trim (`ProjectFeatures.cs:80/:95/:138` exact `Code==`); seeds emit ONLY no-space (`SeedRealMasterDataAsync:2776` UNGATED); blast 3 bảng ProjectId, chỉ `PeWorkItemBudgets` UNIQUE filtered; direction KEEP no-space RETIRE space; soft-del survivor → seed RE-CREATES (#75/#76); prod UNVERIFIED (SSH chết khi SQL-client load — S134/S148). Tag `[s148, dup-by-space, no-normalize-crud]`
- **S147 (07-23) PE attach TraLai edit-block:** FE-ONLY (BE zero phase-guard, `PurchaseEvaluationsController.cs:15` class-trần; gate = raw `readOnly` prop `:3555/:3577`; List detail HARDCODE `readOnly=true` `:574/:669`); BE no-guard CỐ Ý (S78); fix = `attachEditable=isDrafter&&isEditablePhase`. Tag `[s147, fe-only-screen-gate]`
- **S133-S141 (07-16→20) gộp [archive/2026-07.md + runs]:** S141 adap 5-lane pin regex sha-extraction + roster-count 3-tầng · S138 delta-hẹp PHẢI grep landing-site luật SỐNG · S134 lũy-kế row1 PrevSubmitted ĐÃ gồm ChoDuyet (`PeBudgetAccumulator.cs:42-48`) · S133 freeze-at-DaDuyet 4-assignment Mig67 · S128 RAG config in-repo · S126 worker-pin 14/14 no-tier→opus DÙ lead=Fable · S125 verifier-suspect-first · S122 orphan đo TÊN không NỘI-DUNG.
- **S116/S117 (07-13) PE neg-quote + giá-chốt RANGE [fable]:** neg-quote FE-ONLY (quote sống `details[].quotes` KHÔNG `suppliers[].quotes`); ApprovedPrice WRITE 1-site `ApplyApprovedPriceOnFinalize`; HĐ-gen KHÔNG đọc ApprovedPrice (GiaTri=SUM IsSelected); endsBeforeCeo=config-lie #78.
- **[archived → archive/2026-07.md + git]** S87-S114: PE recon (multi-winner Mig65 · WinnerQuoteTotal DERIVED · V2 routing LINEAR) · Supplier-import-v2 · S105 BVAAU auth RCA · S104 30-field · S98-S101 harness · Office/HRM recon. Ctrl-F `_INDEX.md`.

## 📋 Patterns proven
### Schema scan sqlcmd
```
sqlcmd -S "(localdb)\MSSQLLocalDB" -d SolutionErp_Dev  -Q "..."   # runtime API (primary)
sqlcmd -S "(localdb)\MSSQLLocalDB" -d SolutionErp_Design -Q "..." # ef tooling
```
Prod: `ssh vietreport-vps` powershell-wrapper — ⚠️ **SSH session DIES khi SQL-client load** (S134/S148); prod-DB unverifiable đường này → flag + đưa query cho implementer. **2 LocalDB distinct.** Queries: `sys.columns/indexes/tables`, `__EFMigrationsHistory`, dup-detector `REPLACE(Code,' ','')`.

### Controller / wire-claim audit
- Grep `\[Route\("api/[a-z]+"\)\]` · `\[Authorize(Policy="…"` per-action (gotcha #44 silent-403; class-trần = no phase-guard S147) · `// Mock` / `alert(` / `setEditing(null)` wire bugs.

### Mesh / governance đo
- Hash thư mesh: `python scripts/stamp_verify.py <file.md>` — CẤM tự chế phép băm (S180).
- 0-hit PHẢI kèm control-dương cùng thước; đếm phải xem format file trước khi viết regex (S180 gotcha-count 2 thước hỏng).
- Máy đo sẵn: governance-detectors (exit-0 advisory, TOTAL ⟂ INFORM 2 dòng) · nhip-no-probe (đèn nợ 4 cửa) · session-counter-tick + h24-signal-write (fail-loud thật) · closeout-sentinel (verdict-line) · spawn-model-audit · memory-archive-gate A7.

### Memory cross-reference
30+ user-memory `C:\Users\pqhuy\.claude\projects\D--…\memory\MEMORY.md`. Key: designtime_runtime_db · workflow_fanout_reliability · canonical_spec_over_broadcast · root_cause_over_symptom · cardinality_change_grep_consumers.

## ⚠️ Anti-patterns
❌ Skip MEMORY update · ❌ Vague "seems/probably" · ❌ Missing file:line · ❌ >500 words report · ❌ Scope drift sang architecture rec · ❌ Multi-line MEMORY entries (hook hard-cap 24.4KB) · ❌ Đọc nhiều đổ đĩa ít (LỚP-7 S180 — đổ ruột TRƯỚC đo SAU).

## 🧠 SOLUTION_ERP context (numbers canonical → docs/STATUS.md; re-ground don't trust)
- **DB:** Dev `SolutionErp_Dev` · Design `SolutionErp_Design` (2 LocalDB distinct — memory `feedback_designtime_runtime_db`) · Prod `.\SQLEXPRESS`/`SolutionErp` via SSH `vietreport-vps`.
- **Mig path:** `src/Backend/SolutionErp.Infrastructure/Persistence/Migrations/*.cs` (NOT root). MỌI count (mig/bảng/endpoint/test/gotcha/menu/policy) → `docs/STATUS.md`, KHÔNG neo ở đây (bản cũ neo stale = LỚP-5; "Mig 67 last" từng ghi ở đây đã sai — nay ≥71).
- **Tech:** .NET 10 Clean Arch + CQRS MediatR + EF Core 10 + 2 React Vite TS (fe-admin :8082 / fe-user :8080) + SQL Server + Gitea CI (`/actions/tasks` NOT `/runs`, cache ~2min #46) + IIS. Prod: api/admin/eoffice.solutions.com.vn.
- **Auth test:** `admin@solutions.com.vn/Admin@123456` (full) · `nv.test@solutions.com.vn/TestUser@123456` (Drafter).
- **Workflow V1/V2 chi tiết + state PE 5 + TraLai 4-mode + seeds gating:** → skill `contract-workflow` + verbatim block trong `archive/2026-08-curate-s180.md`.

## 🔄 Curate log
- **S180 (08-07):** hook hard-cap 24.9→~13KB — S171/S160/S157/S156/S155×2/S149/S152/S158/S175 entry-dài + context-blocks verbatim → `archive/2026-08-curate-s180.md`; mọi entry → 1-line.
- **S155 (07-27):** 20.7→~17.1KB gộp S122-S141. · **S148 (07-23):** 28.2→~14KB. · **Prev:** S125/S71/S70/S40. Verbatim byte-exact ở `archive/`.

- **S182 (08-08) ×Fable KHKK AWF mirror NCC — **lens DB + lens FE** `[LEAD SEED ON-BEHALF — nguồn `runs/2026-08-08-S182-khkk-awf-mirror-ncc/sub-invest-db-fable.md` 18.097 B + `sub-invest-fe-fable.md` 13.916 B; entry S182 sẵn có chỉ phủ lens **BE**]`:** 🔴 **2 quả bom cùng một gốc `per-TYPE`:** panel `ContractSigningPlan` **GIẤU 7/8 workflow nhóm** vì BE `Active = FirstOrDefault(IsActive)` per-type (`ApprovalWorkflowV2AdminFeatures.cs:210`, tie-break Version DESC **không xác định** giữa 8 bản v1) · và bấm "Tạo quy trình mới"/"Lưu + kích hoạt" cho BẤT KỲ mã type-10 ⇒ `IsActive=false` **CẢ 8 nhóm** (`:339-343`; seeder idempotent per-Code `:610` **skip**, không re-set). 🔴 **committed-but-unapplied-local:** Mig 72 trên đĩa từ 08-06 mà **cả Dev lẫn Design local dừng ở Mig 71**. **Vắng dữ liệu ≠ bug:** seeder KHKK resolve người duyệt **theo EMAIL cứng** (11 email prod `DbInitializer.cs:556-584`) ⇒ DB thiếu user thì workflow RỖNG 0 bước vẫn tạo + log warning — designer local thấy 8 workflow trống người là **ĐÚNG**. Memory cũ S155 *"WF-V2 KHÔNG có lệnh Update"* đã **STALE** (`UpdateAwDefinitionCommand` đã land). 2 bộ luật song song cùng file (`HaveSequentialOrders` chỉ chạy path Create ⟂ Update dùng guard riêng) = drift-risk. Route `/system/approval-workflows-v2` **KHÔNG PermissionGuard** (`App.tsx:79-80`) — gotcha #82 2 tầng. Tag `[s182, lens-db-fe, bom-per-type, giau-7-tren-8, committed-but-unapplied-local, vang-du-lieu-khong-phai-bug]`

- **S185 (08-09) lane5 measure run YC-017 `[LEAD PLACEMENT (a) @S185 — nguồn `.claude/workflows/runs/2026-08-09-S185-email-adap-pipeline/sub-opus-lane5-measure.md` 27.979 B]`:** 4/4 đo có số kèm lệnh tái-lập (Lớp 2·4·9 thư 08-05 · tier-qua-resume 4.2 · master-checklist ô1/ô2 + sàn-2 · completeness-pass ~10 report). 🔴 Bắt **tiền-đề C-17 STALE ngay trong lúc đo** (`vocab-alias-map.md` tồn tại 8.020 B mtime 07-22 ⟂ checklist ghi "chưa tồn tại") — độc-lập với lane3, 2 lane cùng bắt 1 lỗi = corroborate. Luật mới: khi **2 tệp đang bị sửa song song lúc đo** (lane khác cùng wave) ⇒ mọi số-dòng PHẢI kèm mốc giờ đo, không thì số chết ngay khi lane kia land. Tag `[s185, do-kem-lenh, corroborate-2-lane, so-dong-kem-moc-gio]`
- **S187 (08-10) ×Fable YC-023 invest BE "Duyệt HĐ" GĐ3 `[LEAD SEED ON-BEHALF — return garble #53 (mẩu ý-định "append §4-§7"), đĩa TRỌN 26.119 B == HẾT ==; nguồn `runs/2026-08-10-S187-duyet-hd-tu-khkk/sub-invest-be-fable.md`]`:** Contract V2 tái dùng 100% approve-side (`ContractWorkflowService:111-116`→ApproveV2 mirror PE, LevelOpinions Mig 33, 5-state); thiếu ĐÚNG TÂM = `ApplicableType=3` "any ContractType" không phân loại (`ApprovalWorkflow.cs:57`, bridge tự khai `:23-25`) — per-type là khái niệm V1 (`WorkflowDefinition.ContractType`) V2 làm rơi; Dev đo SQL: type-3 đúng 1 workflow `QT-HD-V2-001`. 🔴 2 bom nếu mirror họ-Code KHKK: deactivate per-TYPE hard-wire `==ContractSigningPlan` (`ApprovalWorkflowV2AdminFeatures:370-376` — version mới 1 loại tắt cả 7) + overview Active-đơn `:205-215` giấu 6/7. Phiếu GĐ3 = CHÍNH `Contract` (đủ ruột Approvals/LevelOpinions/Changelogs — "GIỐNG NHAU ĐỪNG CHẾ THÊM"); pipeline nối 0 phase mới. Kế thừa bridge K7 chảy đủ tiền/NCC/SLA/changelog 2 phía; gap: ContractType chọn TAY (catalog SP-002 không map 7 type) · ApprovalGroup N1-N8 không chảy · line-level không vào ruột. Đường mặc định **0-MIG** (PA-A họ-Code + guard mirror `EnsureWorkflowGroupMatchAsync` 3+1 cửa: Create thiếu 2 vế IsActive∧Selectable vs bridge đã bịt = drift 1-luật-2-site; UpdateDraft KHÔNG có re-pin — pin nhầm là kẹt). ĐÍNH CHÍNH S156 STALE: inbox/list/detail V2-aware từ W6 S161 (`ResolveV2InboxIdsAsync ContractFeatures:559-593`). Authz Đ1-trọn/Đ2-mặt-tấn-công/Đ3-2-tầng = CHỜ-ANH (menu public 13/13 chủ-đích). Wave W0-chốt-trục→W1-gỡ-bom→W2-seed-họ→W3-wire-4-cửa→W4-dry-run-K8→W5-authz. Mốc thật Mig 72 (brief lead ghi 71 — đề bài nên trỏ canonical, đừng chép số). Tag `[s187, fable-real, applicable-type-khong-phan-loai, 2-bom-per-type, phieu-gd3-la-contract, 0-mig-mac-dinh, s156-stale-da-va]`
- **S187 (08-10) ×Fable YC-023 invest FE "Duyệt HĐ" GĐ3 [`runs/2026-08-10-S187-duyet-hd-tu-khkk/sub-invest-fe-fable.md`]:** 🔴 fe-admin ẨN TRỌN 4 root pipeline (`ADMIN_HIDDEN_KEYS` Layout.tsx:227-240) ⇒ mirror-sang-admin = trang sống-không-menu (tiền lệ KHKK admin); 42 leaf `Ct_*` ×7 loại ĐÃ route vào trang CŨ qua `?type=N` (fe-user Layout:143-154, admin regex :117 thiếu WfView/Approved/Deleted); màn duyệt HĐ hiện = `ContractDetailContent` 2-nút model 9-PHASE CŨ chọn-targetPhase, V2 opinions READ-ONLY (:185-224), FE type THIẾU `currentApproval`+`approvalFlow` (PE có 2 DTO) ⇒ wave màn-duyệt chặn bởi BE DTO chứ không phải endpoint (ApproveV2 HĐ wire từ S29); chiều ngược HĐ→KHKK = 0 data (`Line.ContractId` một chiều, `Contract.cs` 0 con trỏ — BE reverse-join mới hiển thị nguồn được); khuôn màn duyệt MỚI NHẤT = `KhkkWorkflowPanel` sau owner-trim S174/S175 (GỠ nút Từ chối + chỉ Duyệt/Trả-lại — đừng mirror PeWorkflowPanel nguyên bản); per-type = query-param DANH-TÍNH (bài `view=approved`/`group` TRANSIENT_QUERY_KEYS), KHÔNG `:kind`. #53 cắt return giữa phiên lần nữa — file đổ-ruột-từng-mục cứu trọn, coordinator resume 0 mất. Tag `[s187, admin-hidden-roots, duyet-hd-9phase-cu, dto-chan-wave, khuon-khkk-sau-trim]`

## S188 (2026-08-10) — [LEAD SEED ON-BEHALF]

- W10 dry-run GD3 tren Dev qua 4 doi agent chet non (B0 pre-flight -> B1 shortcut KHKK -> lead tu chay B2-B5). Bai: sqlcmd -i mac dinh QUOTED_IDENTIFIER OFF => chet Msg 1934 tren bang co filtered index; sqlcmd < file chay IM LANG 0 dong; rate-limit login 5/phut/IP phai cache token; ledger tien tung doi = don vi tien-do, khong phai return.
