Files
solution-erp/.claude/agent-memory/investigator-codebase/MEMORY.md
pqhuy1987 11db5efdf8
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 5m39s
[CLAUDE] Docs: S153 closeout — adopt TRỌN Ctx soft-memory + OWNER-VETO 3-vai + RENAME hub-form (squash 22 wal:)
Pipeline anh lệnh: /check-email + /adap-apply -> /fable-real invest (spec 9-task/24-checklist)
-> hmw Opus-5-MAX 2 đợt + lead-solo T6-T8 -> checklist verify.

Thư ① 9c909007 (model-default Opus 5 MAX): TRỌN — filing 2-tuyến + probe-sau-restart
2-nguồn claude-opus-5[1m] + thư hub d432f5eab5cd + caveat (e) đóng.

Thư ② 0df10df4 (pause-tiep Ctx soft-memory, sàn 7-khoản): EXECUTED
- máy mind-check: scripts/session_ctx.py +542 dòng (7 phép + 2 phụ, 4 mức, draft/closed/--root/--session PIN, exit 0/1/3)
- template .claude/templates/session-mind-template.md + wire 4 lệnh (pause C-bis+2bis+§1-carve-out, tiep §2.6+§3-ter, session-start Phase 3.5, session-end §L.b(l)+6.3-bis)
- memory-budget: mind_ctx_kb=32 + tiep_reload + ĐÓNG ghost-wire session_ctx_kb (H18 class-2 sống S146->S153)
- fault-inject 18/18 + 2 fix hậu-T4 (FI 6/6): GAP-#9 closed-mode E-0-con-trỏ CỜ->TRƯỢT (chặn gradient
  thưởng xoá-con-trỏ-trung-thực, họ bẫy F-1 của chính thư hub) · secrets-sweep +--root parity
- số ĐO THẬT pause +117ms thay ước lệch 2.2-5.4x

OWNER 2 quyết trong-phiên:
- (38) VETO: 1-vai -> hub-form 3-vai (ctx-curator @pause + carve-out pause §1 · ctx-verifier @tiep · ctx-audit @2-bookend)
- RENAME theo chuẩn hub/sisters để audit chéo: ctx-pause-check->ctx-curator, ctx-reload->ctx-verifier
  (đo đĩa 3 nhà; hub≠sister => SE theo HUB-form, tiền lệ S149). Roster 20->23, VALID_ROLES 23.
  Gap còn lại: ring5-audit (V5 truth-floor) hub CÓ, SE+VIPIX chưa -> slot (41).

Bookend 2 đầu (12 spawn) + trio auto 1 vòng:
- @open: H1 7f · H2 4f · H24 5+3 FLAG · ring1 28Đ/4T · ring2 8/8Đ + M-1 MISS thật · trio eval-MIXED-14/refine-3A-7B-4N/audit-25Đ-3T (re-chạy 7 instrument, 24 số byte-exact)
- @close: H1 6f · H2 8f (baseline S154 = 16/10, tự sửa bản ~23/11) · H24 4+2 FLAG · ring1 47Đ/5T/1KC/53 · ring2 6/6Đ + 21 phép phụ
- lead xử 11 mục: 9 FLAG H24 + 3 RESIDUAL ring2 + F-r2 (plugin 3 hard-site) + M-1 cả 2 persona + M9 14 sổ diary + F-3/F-5/F-6 + nit Sàn-5 + BÁC F-4 (fan-out không vào _index)

#53 x14-cận-dưới, 0 mất dữ liệu (WRITE-lane derive-from-body · Agent-resume · SendMessage-resume x6).
Datum: trio return-only hết miễn nhiễm (3/3 CLEAN -> 1/3). 4-A suýt xảy ra thật (bản committed của 2 file H24 là bản cắt 24%/48%).
completeness-gate: 5 vòng đủ · phép ĐẠT 4 / TRƯỢT 0 / vacuous 0.
State: Mig 67 · 89 bảng · 532 test · gotcha 83 · Sub-agents 23 · counter 27 · bundle FROZEN · governance-only 0 prod-code.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-26 16:10:54 +07:00

12 KiB
Raw Blame History

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 — index hit 28KB @S148, hard-cap 24.4KB). Detail → archive/2026-07.md + archive/_INDEX.md (sha-keyed substring, Ctrl-F) + git d2f52ba + archive/2026-0{5,6}.md + 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; full detail → archive/runs/git)

  • S153 (07-26) ctx soft-memory spec [fable-real]: thư 0df10df4 sàn-7 → spec 9-task/24-check (runs/2026-07-26-S153-ctx-adopt/sub-fable-invest-S153.md). Findings đắt: SE 0 content-ts-reader sống (session_ctx.py = git-ts+mtime; C10 tự khai thiếu nguồn LATENESS) ⇒ 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) KHÔNG .ps1 mới (2-sự-thật); secrets_sweep rglob TRỌN session-dir ⇒ _mind tự vào lưới @snapshot §3; _mind mới-nhất-ở-TRÊN ⟂ _context FLOW ở-CUỐI (bẫy chép-khuôn); (36)(b) máy-$0/pause + vai @2-bookend ⇒ O-1 carve-out KHỎI CẦN (pause §1 NGỪNG-spawn giữ nguyên); C11(b) filter sub-*.md+^sub-<role>[-.] ⇒ đặt tên sub-ctx-audit-* lọt lưới ngay (kẽ trio harness-*-return đã queue #8 fix); roster 21 > hmw_width 20 = owner-note; (35)-(38) vết OWNER-DELEGATED khuôn hmw_width._ratified_by. Tag [s153, ctx-mind-spec, ts-reader-absent, one-source-regex]
  • S148 (07-23) PE tree DUP project by-space: FLOCK 01/FLOCK01 = path-A TWO real Project rows diff-by-space. Tree groups on p.projectId GUID (PurchaseEvaluationsListPage.tsx:192-197, display projectCode); PE→Project FK ProjectId (PurchaseEvaluation.cs:15) JOIN-resolved (PeFeatures.cs:579/:647) — NO denorm string. CRUD zero-trim (ProjectFeatures.cs:80 validator, :95/:138 exact Code== dupe-check). Both seeds exact-Code key emit ONLY no-space: SeedRealMasterDataAsync:2776 (UNGATED :128) + SeedDemoMasterDataAsync:2681 (gated :117 OFF-prod). Space=legacy/manual. Blast=3 tables ProjectId (Contracts/PeWorkItemBudgets/PurchaseEvaluations); only PeWorkItemBudgets UNIQUE(ProjectId,WorkItemId) filtered [IsDeleted]=0 (PeWorkItemBudgetConfiguration.cs:27). Direction: KEEP no-space (in seed→idempotent), RETIRE space (not-in-seed); soft-del survivor→seed RE-CREATES (#75/#76). Dev only FLOCK 01 pair (FLOCK03/CAL01 space-twins prod-only); prod UNVERIFIED (SSH dies on SQL-client, S134). Tag [s148, pe-tree-dup-project-by-space, path-A-two-rows, no-normalize-crud]
  • S147 (07-23) PE attach TraLai edit-block: FE-ONLY block, BE zero phase-guard (PurchaseEvaluationsController.cs:15 class [Authorize] only; handlers check exists only PurchaseEvaluationAttachmentFeatures.cs:66/:160). Gate = raw readOnly PROP not phase (GeneralAttachmentsSection :3555/:3577 hide-when-readOnly); List detail HARDCODE readOnly=true (:574/:669) ⇒ TraLai loại khỏi SCREEN không khỏi editable-SET (workspace PeListPanel.tsx:88 isEditablePhase GỒM TraLai). fe-admin MIRROR. BE no-guard CỐ Ý (S78). Fix FE: attachEditable=isDrafter&&isEditablePhase. Tag [s147, pe-attach-tralai, fe-only-screen-gate]
  • S141 (07-20) adap đợt-9/10 5-lane [fable-clone-ensemble, 5/5 clean]: (ii)-nới-có-vết đủ đóng dangling-head (3/3 squash-benign, .session-counter.json); tick-head=wal-commit. byte-safe⟂tolerant-EXTRACTION 2-lỗ tách → pin regex \"?([0-9a-fA-F]{8,64})\"?. Roster-count 3-tầng (prose/glob/pointer). refine⟂lead-omission = discriminator WHOSE-memory. Detail → runs/…S141….
  • S138 (07-17) adap 3-bản 17-07 [fable-real]: 3/3 FIT; delta hẹp hub PHẢI grep landing-site trong luật SỐNG (SE chép 4-nhãn lỗi vào reviewer.md:46 = adopt-verbatim kế-thừa lỗi nguồn). Detail → runs/…S138….
  • S135/S134/S133 (07-17) PE budget invest [fable-real, #53→sub-file cứu trọn]: S134 lũy-kế lệch-tiền-đề row1 (PeBudgetAccumulator.cs:42-48 PrevSubmitted ĐÃ gồm ChoDuyet; DaDuyet-only chỉ row2 :50-60) predicate 1-bản helper Features:962+WorkflowService:1018. S133 freeze-at-DaDuyet 4-assignment (PurchaseEvaluationWorkflowService.cs:861/:899/:931/:1053, Mig67). S135 tick H24 single-entry session-start:181-206. Detail → archive + runs.
  • S128 (07-16) adap-16-07 [fable-real, garble→on-behalf]: RAG config in-repo (AI_INFRA\claude-rag\lib\projects.py:39 owner-final, rag.json:26 override); nhãn-đo "calibrated" chỉ C1; ghi-đĩa-trong-lúc-làm cứu draft khi garble. Detail → runs.
  • S126 (07-16) worker-pin + all-inherit sweep [opus×2]: 14/14 opus+max (no-tier lane resolve opus DÙ lead=Fable); B1 284→15 floor-sống; mega-line blow Read-cap → perl-window. [s126, h23-precedence]
  • S125 (07-16) adap-review [fable-real]: auto-memory 50 tracked/0 porcelain; 14/14 opus+effort:max; residue all-inherit floor-sống 2 (fable-real.md:37+fable-clone.md:43) vá; verifier-suspect-first.
  • S122 (07-15) retro-harvest [6/6 clean]: 🔴 0/7 mất 7/7 XONG synthesis-sai-chỗ (orphan đo TÊN không NỘI-DUNG); lane-RỖNG≠mất; lane tự truy git đừng tin brief.
  • S116/S117 (07-13) PE negative-quote + giá-chốt RANGE [fable]: neg-quote FE-ONLY (BE/DB nhận âm; quote sống details[].quotes KHÔNG suppliers[].quotes). S117 ApprovedPrice WRITE 1-site ApplyApprovedPriceOnFinalize; HĐ-gen KHÔNG đọc ApprovedPrice (GiaTri=SUM IsSelected). endsBeforeCeo=config-lie #78 (detail :1152 / list :647).
  • [archived → archive/2026-07.md + git] S87-S114 PE recon (multi-winner IsSelected per-hạng-mục Mig65 · WinnerQuoteTotal DERIVED · budget gate PURE-ROLE · V2 routing=ApproverUserId LINEAR) · Supplier-import-v2 (ClosedXML, Mã NCC=Code, IsPublic fail-closed, import authz-mismatch) · S105 BVAAU auth RCA (relative-/api prod-404) · S104 30-field · S98-S101 harness · Office/HRM/Governance 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 sqlcmd -S '.\SQLEXPRESS' -d SolutionErp -E …⚠️ SSH session DIES whenever SQL-client loads (S134/S148 re-confirm); prod-DB effectively UNVERIFIABLE this path, flag + give query for implementer. 2 LocalDB distinct: _Dev=runtime · _Design=dotnet ef default. Queries: sys.columns/indexes/tables, __EFMigrationsHistory, dup-detector REPLACE(Code,' ','').

Controller / wire-claim audit

  • Grep \[Route\("api/[a-z]+"\)\] controllers · \[Authorize(Policy="…" per-action (gotcha #44 silent-403; class-level [Authorize] trần = no phase-guard, S147)
  • Grep // Mock / alert( / setEditing(null) // close UI — wire bugs

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 · Scope drift to architecture rec (em main decides) · Multi-line MEMORY entries (index truncates >24.4KB)

🧠 SOLUTION_ERP context (numbers canonical → docs/STATUS.md; re-ground don't trust)

  • DB: Dev SolutionErp_Dev · Design SolutionErp_Design (distinct) · Prod .\SQLEXPRESS/SolutionErp/vrapp via SSH vietreport-vps
  • Migration path: src/Backend/SolutionErp.Infrastructure/Persistence/Migrations/*.cs (NOT root). Last-schema Mig 67 AddPeApprovedBudgetSnapshot (S133); ~67 mig.
  • Counts (docs/STATUS.md canonical): ~88 SQL tables (count .ToTable() snapshot NOT DbSet) · ~253 endpoints · 68 FE pages · 54 menu keys (MenuKeys.cs) · ~354 test · ~71+ gotchas · 14 sub-agents (worker-tier-pin S124)
  • Tech: .NET 10 Clean Arch (Api→Application←Domain + Infra) + CQRS MediatR + EF Core 10 + 2 React Vite TS (fe-admin :8082 + fe-user :8080) + SQL Server + Gitea CI + IIS
  • Prod: api/admin/eoffice.solutions.com.vn · Gitea git.baocaogiaoduc.vn/…/solution-erp (Actions API /actions/tasks NOT /runs, cache stale ~2min #46)
  • Auth: admin@solutions.com.vn/Admin@123456 (full) / nv.test@solutions.com.vn/TestUser@123456 (Drafter). Password ≥12.

🔄 Active workflow schemas (V1 + V2 coexist post-S17)

  • V1 Mig 21 flatWorkflowDefinition pin cũ, match Dept+PositionLevel.
  • V2 Mig 22-31ApprovalWorkflow pin PE/Contract, match ApproverUserId 1-1 OR-of-N cùng Cấp. Steps(Phòng)>Levels(Cấp). Proposal V2 Mig38, WorkflowApps Mig39. (Mig25 IsUserSelectable · 26 LevelOpinions UPSERT · 30 AllowApproverEditBudget · 31 SkipToFinal→ApproverLevel · 53 cờ-gấp+CeoThreshold · 54 giá-đề-xuất · 58 IsWinner multi + AllowApproverFinalize · 65 Quote.IsSelected per-hạng-mục · 66 ApprovedPrice Min-Max · 67 budget-freeze snapshot).
  • State PE 5: Nháp / Đã gửi duyệt / Trả lại (TraLai=98) / Từ chối (TuChoi, REMOVED-path S60) / Đã duyệt
  • Mode Trả lại 4: OneLevel / OneStep / Assignee / Drafter (Phase=TraLai). 3 đầu giữ ChoDuyet lùi pointer. Admin bypass level.Allow*.
  • Seeds gating: SeedDemoMasterDataAsync gated DemoSeed:Disabled (OFF prod) · SeedRealMasterDataAsync UNGATED (62 dự án + 71 hạng mục Excel, per-code idempotent, exact-Code key #75/#76 resurrect risk).

🔄 Curate log

  • S148 (07-23): hard-cap rewrite 28.2→~14KB — collapsed multi-line S133-S148 → 1-liner, dropped stale pointer-list (S87-S114 → grouped 1-line, verbatim in archive/git). Single-writer inv-cb (hook @28KB).
  • Prev: S125 (23.9→~15KB, 14 lines→archive/2026-07.md) · S71/S70/S40. Verbatim byte-exact in archive/.

S149 (2026-07-24→25) — 10 invocation gộp 1 entry [LEAD GHI ON-BEHALF @S150 — M9/B3 theo H2-F3 Coverage-miss (10 lượt → 0 delta sổ, ngoài lưới C11(b) by-design); nguồn: sub-file trong runs/2026-07-24-S149-{dong-du-5-vong,hoi-tu-bookend,owner-gated-3-khoan}/ + runs/2026-07-25-S149-adap-backlog/sub-invest-backlog.md]

  • 10 lượt invest @S149: chẩn-đoán "SE = rules-đủ, máy-thiếu" (0 script GHI .session-counter.json → chuỗi "đo rồi như chưa đo": backfill S146 · tally-rơi S148 · ×27≠33) — ĐỨNG qua gate reviewer-Fable, thành spec hội-tụ-bookend M1-M9. Backlog adap phân-loại A-12/B-6/C-1/D-3 ("nợ REPORT không phải nợ ADOPT") → wave 6-lane land 23/23. O-2 nguồn thật = depth-axis → posture-A.
  • #53 trong 10 lượt (ghi sổ garble @S150): L1 ngược-#53 (return OK, ĐĨA không — vớt journal) · L5 kinh-điển (đĩa cứu) · L7 mất-cả-hai (bù deep-pass). Sub-class mới: ghi-đĩa-trong-lúc-làm = CẦN, KHÔNG ĐỦ.

S152 (2026-07-25) — R1 retention-note không-fabricate [M9 on-behalf lead]

  • KHÔNG fabricate — uncertain thì nói "uncertain" + reason: finding không chứng được từ đĩa/DB phải khai uncertain kèm lý-do thiếu-chứng, KHÔNG lấp bằng suy-đoán (tiền lệ tốt: A/018 S117 — verify prod-DB Phase=ChoDuyet trước khi phán "lũy kế đúng", thay vì đoán theo lời UAT). Claim ≠ chứng: mọi số kèm lệnh. Tag [s152, r1-retention, no-fabricate-uncertain-reason]