# investigator-codebase/2026-05-q4 — gist
distill-gen: 1
source-verbatim: .claude/agent-memory/investigator-codebase/archive/2026-05-q4.md (3 entry + 1 header-sự-kiện integrity → 4 cụm)
pointer-style: substring

## TỔNG-HỢP (3-5 ý)
- Trỏ-tới ≠ tồn-tại: MEMORY.md từng trỏ file archive này khi nó VẮNG trên đĩa — nội-dung chỉ còn trong git `d2f52ba`, dựng lại S69; lô S29-S37 vẫn khai là chỉ nằm trong git chưa kéo về đĩa. Chỉ mục trí-nhớ phải kiểm bằng phép CHẠM ĐĨA.
- Mỗi chỉ-số phải khai kèm CÁCH ĐẾM: DbSet=77 nhưng bảng SQL=84 (đếm `.ToTable()` trong ModelSnapshot, KHÔNG đếm DbSet — sót 7 Identity); docs sai CẢ HAI CHIỀU trong cùng lượt đo (FE pages 53<65 under-count, menu key 85>53 over-count); 3 số tin được nhất = mig / gotcha / git.
- Khuôn tốt nhất khi có module anh em đã chạy thật = đọc thẳng handler của nó (`ProposalFeatures.cs:403-486`) rồi liệt phần thiếu; nhưng spec tự mâu-thuẫn phải gắn cờ ngay: `ApprovalWorkflow.cs:72` khai Level KHÔNG OR-of-N (ngược trí-nhớ cũ), enum `ApplicableType` THIẾU Travel + mig `ExtendApplicableTypeForWorkflowApps` Up/Down RỖNG.
- Port khuôn phải soi hình-thái repo đích: BVAAU 7-agent là bản vẽ Phase 0 codebase RỖNG chưa thực-chiến — SOLUTION_ERP chọn split backend/frontend (thay domain/infra) cho hợp 2 FE.

## Entries

**[cao] B4-A — META: con-trỏ chết đã phục-hồi (file archive vắng đĩa, nội-dung git-only)**
- VIỆC: S69 phát-hiện `MEMORY.md` dẫn `archive/2026-05-q4.md` (kèm stub curate S40 + footer) mà đĩa không có file.
- KẾT-LUẬN: nội-dung thực nằm git-only ở `d2f52ba`; file được dựng lại, chứa 3 entry FIFO tháng 5 tràn ra; lô S29-S37 VẪN nằm nguyên trong git `d2f52ba` chứ chưa kéo về đĩa.
- BÀI-HỌC: trỏ-tới ≠ tồn-tại. Chỉ mục trí-nhớ phải được kiểm bằng phép chạm đĩa — đọc chỉ mục thấy "có mục" là cảm-giác đủ giả.
- BẤT-NGỜ: hai phần của cùng một lô archive kết-thúc ở HAI NƠI khác nhau (đĩa + git) mà chỉ mục chỉ khai một — còn một nửa dữ-liệu chỉ tra được nếu biết đúng commit (đầu mối cho lead — xem `_lienfile-notes-batchB.md` #6).
→ substring:"d2f52ba"

**[cao] B4-B — S40 STATE GROUNDING: đo lại 7 con số, docs sai 4**
- VIỆC: đối-chiếu 7 chỉ-số trạng-thái giữa docs và mã nguồn.
- KẾT-LUẬN: khớp: Migrations=40 (`.../Persistence/Migrations/*.cs`, cuối = `AddAttendances`) · Gotchas=55 (đếm `### N.`) · git clean. Lệch: DbSet=77 nhưng bảng SQL=84 (77 + 7 Identity — docs 84 ĐÚNG, phép đếm DbSet sai −7) · Endpoints=211 (docs ~223) · FE pages 36+29=65 (docs 53, đếm thiếu) · Menu key=53 hằng (docs 85, đếm thừa). 3 số tin được nhất = mig / gotcha / git.
- BÀI-HỌC: đếm bảng phải đếm `.ToTable()` trong ModelSnapshot, KHÔNG đếm DbSet — DbSet bỏ sót bảng Identity. Rộng hơn: mỗi chỉ-số cần khai kèm cách đếm, vì cùng một tên ("số bảng") có nhiều phép đếm cho nhiều số.
- BẤT-NGỜ: docs SAI theo cả hai chiều trong cùng một lượt đo (under-count FE pages 53<65, over-count menu key 85>53) ⇒ không thể suy "docs luôn lạc-hậu theo hướng thiếu".
→ substring:"AddAttendances"

**[cao] B4-C — P11-A WorkflowApps pre-flight: khuôn có sẵn, spec tự mâu-thuẫn 2 chỗ**
- VIỆC: pre-flight nối 4 module Leave/OT/Travel/Vehicle vào bộ máy duyệt.
- KẾT-LUẬN: schema pin sẵn từ Mig 39 (`Office/{Module}.cs` đều có `ApprovalWorkflowId?` + `CurrentApprovalLevelOrder?` + `WorkflowAppStatus` 5-state khớp ProposalStatus); code mới là SKELETON `Application/Office/WorkflowAppsFeatures.cs:11-15` (chỉ Create+List). Mẫu soi gương HOÀN HẢO = `ProposalFeatures.cs:403-486` (flatten `Steps.OrderBy(Order).SelectMany(Levels.OrderBy(Order))` → chỉ số cấp toàn-cục → `allLevels[CurrentApprovalLevelOrder-1]` → khớp actor → UPSERT opinion → tăng con-trỏ/DaDuyet). Thiếu: 4 bảng `{Module}LevelOpinion` (Mig 41+), 3 route/controller, 4 seed WF, FE Detail+Opinion.
- BÀI-HỌC: khi có module anh em đã chạy thật, khuôn tốt nhất là đọc thẳng handler của nó rồi liệt phần thiếu — rẻ hơn thiết-kế lại từ spec.
- BẤT-NGỜ: 2 mâu-thuẫn gắn cờ ngay: (a) `ApprovalWorkflow.cs:72` khai Level KHÔNG OR-of-N (1 ApproverUserId/Level) — NGƯỢC trí-nhớ cũ "OR-of-N", đòi verify lại; (b) enum `ApplicableType` THIẾU Travel (có Leave=5/OT=6/Vehicle=7/ItTicket=8) và mig `ExtendApplicableTypeForWorkflowApps` có Up/Down RỖNG (enum-only, không đụng DB).
→ substring:"ExtendApplicableTypeForWorkflowApps"

**[vừa] B4-D — S39: rút khuôn 7-agent từ BVAAU**
- VIỆC: đọc 8 file `.claude/agents/` của BVAAU (~22K) để tách trục vai.
- KẾT-LUẬN: 4→7 trục research(2)/implement(2)/quality(3); ranh giới: repo interface = domain, EF config = infra, test = test-specialist; cả 7 vai đều có 5 RAG MCP (+`search_code` BM25 +`store_memory` +`list_projects`). SOLUTION_ERP giữ 6 skill và chọn split backend/frontend (thay domain/infra) cho hợp 2 FE.
- BÀI-HỌC: port khuôn phải soi hình-thái repo đích — trục chia của dự-án nguồn không tự đúng ở đích.
- BẤT-NGỜ: BVAAU Phase 0 codebase RỖNG ⇒ toàn bộ khuôn 7-agent là bản vẽ chưa qua thực-chiến; "VIPIX guide" được dẫn nhưng không verify được vì file miss.
→ substring:"BVAAU"

## Phụ-lục token (coverage)
*(chép TRỌN token-list section investigator-codebase/2026-05-q4 của proposal curator — lưới coverage-diff)*

- **gotcha#:** **0 token dạng `#N`** — chỉ có phép đếm "Gotchas=**55** (`### N.`)"
- **surprise (nhãn ⚠️/đối-lập nguyên-văn):** "⚠️ `ApprovalWorkflow.cs:72` nói Level **KHÔNG OR-of-N** (1 ApproverUserId/Level) — KHÁC memory cũ 'OR-of-N', verify lại" · "⚠️ enum `ApplicableType` THIẾU Travel (có Leave=5/OT=6/Vehicle=7/ItTicket=8); `ExtendApplicableTypeForWorkflowApps` mig empty Up/Down (enum-only)" · "DbSet=77 nhưng **SQL tables=84** … DbSet count sai −7" · "Endpoints=**211** (docs ~223)" · "FE pages … =**65** (docs 53 under-count)" · "Menu keys=**53** const (docs 85 over-count)" · "BVAAU Phase 0 codebase RỖNG → aspirational template chưa battle-test" · "VIPIX guide claim KHÔNG verify được (file miss)" · header: "the file was absent on disk (content was git-only `d2f52ba`)"
- **guard:** "Boundary: repo interface=domain, EF config=infra, test=test-specialist" · "Verbatim — byte-exact, no reflow" (rào chép archive) · "3 số tin cậy nhất = mig/gotcha/git" (rào tin-cậy chỉ-số)
- **root-cause:** "tables phải count ToTable KHÔNG DbSet" (phép đếm sai nguồn ⇒ lệch −7 bảng Identity)
- **file:line:** `Application/Office/WorkflowAppsFeatures.cs:11-15` · `ProposalFeatures.cs:403-486` · `ApprovalWorkflow.cs:72` · `Office/{Module}.cs` (không số dòng) · `.../Persistence/Migrations/*.cs` · `.claude/agents/` (8 file ~22K)
- **định-danh khác:** commit `d2f52ba` (nguồn git-only) · Mig 39 · Mig 41+ (dự-kiến) · mig `AddAttendances` (mới nhất) · mig `ExtendApplicableTypeForWorkflowApps` (Up/Down rỗng) · `WorkflowAppStatus` 5-state ↔ `ProposalStatus` · tag `[cross-project, bvaau, port]` · `[state-grounding, docs-drift, s40]` · `[pre-flight, p11-a, workflowapps]`

### Bổ-sung coverage @P3-gate S170 — ⚠️ LƯỚI GREP THUẦN, KHÔNG PHẢI DỮ KIỆN (đoạn trích sau mỗi token là phần ĐẦU DÒNG verbatim chứa token — dòng archive là mega-line nên đoạn trích thường KHÔNG liên-quan token; CHỈ dùng để coverage-diff grep trúng, đọc nội-dung thì tra verbatim theo token — reviewer P3 @S170)

- `Mig 38` — - **2026-05-30 (P11-A WorkflowApps wire pre-flight):** 4 module Leave/OT/Travel/Vehicle. Schema pin ĐÃ CÓ SẴN (Mig 39): `Office/{Module}.cs` đều có `A…
