13 KiB
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)
- 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.md44.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:1639chỉ 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:298cò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:151khớ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 canonicalscripts/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_daystrố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 (e33481ecùng-commit commentPeWorkItemBudget.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.BudgetTotalsố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) · 🔴DeleteContractguard so SỐPhase >= DangInKychặn xóa cả 9/10/98/99 · mặt tấn công = Reject-trước-guardContractWorkflowService.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-commitgit 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ảngContractSigningPlan*+ApplicableType=10; 🔴 twin-bẫy: Proposal-lite ApproveV2 PHÁ OR-of-N (ProposalFeatures.cs:427-439flatten +ElementAtOrDefault) ⇒ KH service PHẢI copyContractWorkflowService.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 LEGACYContractPhase.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=7chạ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(commentApprovalWorkflow.cs:81-82SAI) ·Department.ManagerUserId0/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_RES1-nguồn);secrets_sweeprglob trọn session-dir;_mindmới-nhất-ở-TRÊN ⟂_contextFLOW-ở-CUỐI; C11(b) filter khiến tênsub-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 groupsp.projectIdGUID (PurchaseEvaluationsListPage.tsx:192-197); CRUD zero-trim (ProjectFeatures.cs:80/:95/:138exactCode==); seeds emit ONLY no-space (SeedRealMasterDataAsync:2776UNGATED); blast 3 bảng ProjectId, chỉPeWorkItemBudgetsUNIQUE 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:15class-trần; gate = rawreadOnlyprop:3555/:3577; List detail HARDCODEreadOnly=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[].quotesKHÔNGsuppliers[].quotes); ApprovedPrice WRITE 1-siteApplyApprovedPriceOnFinalize; 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· DesignSolutionErp_Design(2 LocalDB distinct — memoryfeedback_designtime_runtime_db) · Prod.\SQLEXPRESS/SolutionErpvia SSHvietreport-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/tasksNOT/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 trongarchive/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/.