3 commits Plan M `c2042ef + 508b17a + 4dd6f9c` cumulative:
- M1 (`c2042ef`) BE Service refactor F1.OneLevel/OneStep edge case Bước 1 → reset (0, 1) giữ ChoDuyet (KHÔNG fallback Drafter)
- M3 (`508b17a`) FE × 2 app rename phase=TraLai display label "Trả lại" → "Cần chỉnh sửa lại"
- M2 (`4dd6f9c`) Tests add 2 edge case test 106/106 PASS (+2 từ 104)
Docs update:
- docs/STATUS.md — Last updated S23 t3 + stats 106 test (+2) · 20 memory (2 entry reinforced)
- docs/HANDOFF.md — TL;DR S23 t3 với multi-agent ROI evidence Investigator avoid em main spam refactor
- docs/changelog/sessions/2026-05-15-s23-turn3-plan-m-f1-edge-case.md — Session log đầy đủ
Memory user-level update (2 entry reinforced):
- feedback_per_nv_permission_scope.md — S23 t3 reinforcement "edge case không lùi được KHÔNG fallback role khác"
- feedback_uat_skip_verify.md — Plan L S23 t2 lesson "Service refactor semantic BẮT BUỘC test cùng commit"
Agent MEMORY drift (auto-flush per multi-agent rule §):
- Investigator (.claude/agent-memory/investigator/MEMORY.md) — S23 t2 spawn L2 entry + S23 t3 spawn M0 audit findings
- Reviewer (.claude/agent-memory/reviewer/MEMORY.md) — S23 t3 Plan M cumulative PASS-WITH-NOTES verdict + 2 Minor defer
Reviewer verdict: PASS-WITH-NOTES (26 checks PASS, 0 Major, 2 Minor defer).
- Minor #1: 5-8 inline literal "Trả lại" PE module FE còn (filter / hint / button verb mix) — verb button giữ, filter/hint defer
- Minor #2: Contract + Budget module Phase=98 vẫn 'Trả lại' — Plan M scope PE-only, defer
Stats Plan M chốt:
- 31 mig (no change) · 59 tables · ~145 endpoints · 34 FE pages
- **106 test PASS (+2: F1 OneLevel/OneStep edge case)**
- 47 gotcha · 20 memory (2 entry reinforced) · 6 skills
- 4 sub-agents (1 Investigator pre-flight + 2 Implementer Case 2+3 + 1 Reviewer pre-commit)
- 4 commits Plan M `c2042ef..HEAD` ready push
Pending: CICD Monitor post-deploy verify Plan M
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
20 KiB
Investigator Agent — Persistent Memory
Persistent diary cross-session. Auto-injected first 200 lines / 25KB at spawn. Update BEFORE every stop. Curate when > 25KB.
🎯 Role baseline
Read-only research + audit for SOLUTION_ERP codebase. Tools: Read, Grep, Glob, Bash, WebFetch, WebSearch. Output: concise structured findings under 500 words.
📋 Patterns proven (cross-session)
Pattern: Smoke verify catalog SOLUTION_ERP
- Bearer auth từ
https://api.solutions.com.vn/api/auth/login(POST email + password) - Status code matrix expected vs actual + JSON output + MD audit
- Test credentials:
admin@solutions.com.vn / Admin@123456(full) ORnv.test@solutions.com.vn / TestUser@123456(Drafter UAT scope)
Pattern: Schema scan via sqlcmd
# LocalDB Dev (runtime — primary)
sqlcmd -S "(localdb)\MSSQLLocalDB" -d SolutionErp_Dev -Q "..."
# LocalDB Design (ef tooling)
sqlcmd -S "(localdb)\MSSQLLocalDB" -d SolutionErp_Design -Q "..."
# Production (qua SSH vietreport-vps)
ssh vietreport-vps "sqlcmd -S .\SQLEXPRESS -d SolutionErp -U vrapp -P '...' -Q '...'"
Common queries: sys.columns, sys.triggers, __EFMigrationsHistory, COUNT(*), sys.indexes.
Gotcha: 2 LocalDB distinct (memory feedback_designtime_runtime_db):
_Dev— runtime API (appsettings.Development.json ConnectionStrings:Default)_Design—dotnet ef migrations add/updatedefault target- Use
--connection "Server=(localdb)\MSSQLLocalDB;Database=SolutionErp_Dev;..."override khi cần Dev specifically.
Pattern: Controller audit
- Grep
\[Route\("api/[a-z]+"\)\]enumerate ~30+ controllers - Grep
\[Authorize(Policy = "..."audit per-action policy (gotcha #44 silent 403 class-level quá strict) - Grep
IActionResultvsActionResult<T>— typed return preferred - Grep
// Mock/alert(/setEditing(null) // close UI— wire claim bugs
Pattern: Memory cross-reference
19 memory entries tại C:\Users\pqhuy\.claude\projects\D--Dropbox-CONG-VIEC-SOLUTION\memory\ (S20 +2 turn 11/12, S21 +2 turn 5):
MEMORY.md— indexproject_solution_erp.md— cumulative narrative S1-S17feedback_per_chunk_commit.md— 5-chunk A-E disciplinefeedback_uat_skip_verify.md— Phase 9 skip test rulefeedback_drastic_refactor_scope.md— defer dedicated sessionfeedback_audit_reuse_before_clone.md— audit-first pattern (Investigator natural fit)feedback_service_hook_vs_endpoint.md— derived state hook patternfeedback_n_stage_workflow_pattern.md— DEPRECATED (Mig 21 flat workflow replaced)feedback_designtime_runtime_db.md— 2 LocalDB distinctfeedback_md_compact_narrative.md— §6.5 KEEP narrative rulefeedback_unittest_timing.md— §7 test timingfeedback_cron_monthly_limitation.md— Cron SDK 7-day expirefeedback_user_manual_style.md— non-tech docs stylefeedback_node_cicd.md— Node 20.x pinfeedback_responsive_laptop_breakpoint.md— 4-tầng responsive pattern (S20 t11)feedback_multi_agent_setup.md— 4 sub-agents setup discipline (S20 t12 init 3 + S21 t1 +cicd-monitor)feedback_rag_hybrid_pattern.md— RAG Hybrid Cách A planning (S21 t2, 5 dự án future)feedback_ef_migration_backfill_reorder.md— ADD→BACKFILL SQL→DROP manual reorder (S21 t5 Mig 29)feedback_per_nv_permission_scope.md— Multi-role flag split scope per role (Approver Level vs Drafter User), S21 t4→t5 refactorreference_session_prompts.md— canonical session start template
Pattern: External research priority sources
anthropic.com/engineering/(official patterns)cognition.ai/blog/(Devin lessons)philschmid.de+eugeneyan.com+hamel.dev(senior engineers)learn.microsoft.com/en-us/aspnet/core/(.NET 10 official)tanstack.com/query/latest(TanStack Query)
⚠️ Anti-patterns observed
- ❌ Skip MEMORY.md update before stop — lose knowledge tài sản
- ❌ Vague conclusion "seems like" / "probably" — em main rejects
- ❌ Missing file:line refs — non-verifiable evidence
- ❌ Exceed 500 words — em main reads too slow
- ❌ Scope drift to architectural recommendations — em main decides, not me
🧠 SOLUTION_ERP context essentials (auto-load)
- DB Dev:
SolutionErp_DevLocalDB (59 tables / 30 migrations / Mig 30 latestAddAllowApproverEditBudgetToLevels) - DB Design:
SolutionErp_Design(ef tooling distinct) - DB Prod:
.\SQLEXPRESS/SolutionErp/vrappuser via SSHvietreport-vps(fallbackC:\inetpub\solution-erp\api\appsettings.Production.jsonkhi$env:PROD_DB_PASSWORDempty — CICD Monitor discovery S21 t5) - Tech stack: .NET 10 Clean Arch (Api → Application ← Domain + Infra) + CQRS MediatR + EF Core 10 + 2 React 19 Vite 8 TS 6 (fe-admin :8082 + fe-user :8080) + SQL Server + Gitea Actions CI + IIS prod
- Live deploys (Prod UAT): https://api.solutions.com.vn · https://admin.solutions.com.vn · https://eoffice.solutions.com.vn
- Gitea remote: https://git.baocaogiaoduc.vn/vietreport-admin/solution-erp
- Gitea Actions API: path
/api/v1/repos/.../actions/tasks(NOT/actions/runs— 404). Cache stale ~2 min (gotcha #46) — cross-check VPS file mtime - SSH VPS:
ssh vietreport-vps(config~/.ssh/configuser=Administrator key=id_ed25519) - Gotchas active: 46 (reference
docs/gotchas.md) - Tests baseline: 104 PASS (+20 S22: 5 reg #44 Authorize policy + 7 ReturnMode + 7 Guard + 1 V2 actor scope reject) — Phase 9 UAT skip per chunk (memory
feedback_uat_skip_verify) - Endpoints: ~146 (+3 S22: PATCH /users/{id}/allow-skip-final + PATCH /pe/{id}/budget-adjust + GET /pe/{id}/attachments/{attId}/view)
- Users: 30 demo + 33 active prod (13 cũ + 20 mới S22+2 role-based: act/bod/equ/fin/hra/pm/qs prefix
.nv/.pp/.tp+ bod.1/2). Password policy ≥12 chars (S22+2 discovery,TestUser@2026) - API auth response:
accessToken+refreshToken+user(S22+2, NOTtoken) - Master HEAD reference: check via
git log -1 --format='%H' - 6 skills:
contract-workflow·permission-matrix·form-engine·ef-core-migration·dependency-audit-erp·iis-deploy-runbook
🔄 Active workflow schemas (V1 + V2 coexist post-Session 17)
- V1 Mig 21 flat workflow —
WorkflowDefinitionpin với PE/Contract cũ. Match Dept+PositionLevel. - V2 Mig 22-30 —
ApprovalWorkflowpin với PE mới + matchApproverUserId1-1 OR-of-N cùng Cấp. Steps (Phòng) > Levels (Cấp). PE đã wire V2. Contract V2 PENDING (Plan F drop V1 ABORTED S22+4 — Contract entity HOÀN TOÀN V1 chưa wire V2 + 4 PE V1-only + 19 PE V1+V2 mix).- Mig 25 IsUserSelectable (admin pin/unpin per workflow cho user pick)
- Mig 26 PE Level Opinions UPSERT (service hook khi Duyệt)
- Mig 28 (S21 t4) 6 Allow* workflow-level — REPLACED by Mig 29
- Mig 29 (S21 t5) Allow* refactor per-NV: 5 flag on
ApprovalWorkflowLevels(F1+F3 per Approver slot) + 1 flag onUsers.AllowDrafterSkipToFinal(F2 per Drafter) - Mig 30 (S22+5) F4
AllowApproverEditBudgetper-Level slot onApprovalWorkflowLevels— admin Designer tick per slot cho Approver được edit Budget khi review. Pattern reinforced 2× với Mig 29 F1+F3: default = admin opt-in per slot, KHÔNG = mở rộng default. Cross-ref memoryfeedback_per_nv_permission_scope.mdproven cumulative Mig 29 + Mig 30.
State machine 5 trạng thái phiếu PE: Nháp / Đã gửi duyệt / Trả lại (TraLai=98) / Từ chối / Đã duyệt.
Mode Trả lại 4 option per-Level (S21 t4-t5 Mig 28→29):
- OneLevel = lùi 1 Cấp cùng Step (peer review)
- OneStep = lùi sang Bước trước Cấp cuối
- Assignee = pick NV đã ký runtime (PeLevelOpinions)
- Drafter = Phase=TraLai clear pointer (S17 backward compat default TRUE)
3 mode đầu giữ Phase=ChoDuyet lùi pointer. Mode Drafter giữ Phase=TraLai. Admin bypass level.Allow* flag.
📅 Recent activity (last 10 FIFO)
- 2026-05-15 (S23 t2 spawn M0 — Plan M F1+F2+F3+F4 ChoDuyet semantic audit): Bro UAT post-Plan L deploy 2026-05-15 ~02:00: "Hiện logic cũ là khi trả lại 1 cấp hoặc chỉ định hoặc edit là trạng thái draft -> cái này thay đổi lại nhé, các tính năng duyệt thẳng, trả lại 1 cấp hoặc người chỉ định hoặc cho edit thì cho xử lý đc ở trạng thái đang gửi duyệt luôn." Audit 4 BE file + 4 FE file × 2 app cho F1+F2+F3+F4 phase semantic ChoDuyet preservation. Verdict: CODE ĐÃ ĐÚNG semantic mới — đây là DISCONNECT bro mental model vs code reality post-Mig 28/29/30/31. Evidence per feature: F1.OneLevel
PurchaseEvaluationWorkflowService.cs:285-312SWITCH branch lùi 1 Cấp cùng Step (curLevel-1) ELSE lùi Step trước Cấp cuối; Phase KHÔNG đổi (giữ ChoDuyet, line 364 reset SLA only); fallback Drafter:303-310CHỈ KHI đang Bước 1 Cấp 1 no further back (clear pointer + Phase=TraLai). F1.Assignee:335-360foreach Steps find ApproverUserId match → set pointer; Phase giữ ChoDuyet; ConflictException nếu không tìm thấy NV trong workflow. F1.OneStep:314-333lùi prev Step Cấp max; Phase giữ ChoDuyet; fallback Drafter nếu đang Bước 1. F1.Drafter:268-275SETPhase=TraLai=98+ clear cả 2 pointer + SLA null — đây là CASE DUY NHẤT về "draft". F2 skipToFinal:483-524Plan K L1 ĐÃ FIX advance pointer tới Bước cuối Cấp cuối (max), Phase giữ ChoDuyet (NV cuối duyệt thật để DaDuyet); guard line 485 ConflictException non-admin + flag off; opinion UPSERT trước line 441-468 ensure actor's signature lưu trước. F3 EnsureEditableForDetailsAsyncPurchaseEvaluationDetailFeatures.cs:42-992 trường hợp accepted: Drafter scope (DangSoanThao/TraLai return pe sớm line 49-51) OR Approver scope ChoDuyet line 54-94 (V2 schema + actor match level.ApproverUserId + level.AllowApproverEditDetails flag). F4 AdjustPurchaseEvaluationBudgetCommandHandlerPurchaseEvaluationFeatures.cs:272-329Drafter scope:283-290(DangSoanThao/TraLai + isDrafter) ELSE Approver scope ChoDuyet:291-323(V2 + pointer init + actor match + level.AllowApproverEditBudget flag) — Phase ChoDuyet đã handle full. Validation Allow flag location*PurchaseEvaluationWorkflowService.cs:252-265ApplyReturnModeAsync gate per slot per mode: throw ConflictException nếu disabled (Admin bypass line 252). FE PeWorkflowPanel.tsx: TraLai dialog:331-4224 radio button (OneLevel/OneStep/Assignee/Drafter) gated bằnglevelOptions?.allowReturnXxxflag per current Approver Cấp (line 343-396); useEffect:60-68S23 t2 fix default first available mode KHÔNG Drafter khi admin tick F1 modes. Skip Final checkbox:425-442chỉ visible khilevelOptions?.allowApproverSkipToFinal+ Approve forward direction (line 425). FE PeDetailTabs.tsx F3+F4 wire:itemsReadOnly = readOnly && !approverEditModeline 118 bypass readOnly khi F3 enabled (Mig 28 pattern);canAdjust = isAdmin || (!readOnly && isDrafter && isDrafterPhase) || isApproverChoDuyetline 977 bypass readOnly khi F4 enabled (L2 fix). Mirror fe-admin/fe-user line 109-115 + 967-979 ĐỒNG BỘ rule §3.9. Surprise: "Trả lại" trong UI memory docs đôi khi gọi "draft" colloquial — bro confuse 2 khái niệmPhase=TraLai=98(Drafter sửa rồi gửi LẠI từ Step 0) vsPhase=DangSoanThao=1(chưa từng gửi duyệt). KHÔNG code path nào trong F1 OneLevel/OneStep/Assignee/F2/F3/F4 set targetPhase=DangSoanThao mà không nên. Recommendation: LOW effort (0-20 LOC): chỉ cần communication clarification em main confirm với bro 4 mode F1 + F2 + F3 + F4 đã giữ Phase=ChoDuyet trừ F1.Drafter; mở DB SELECT phiếu UAT confirmPhasecolumn number sau click test; OPTIONAL touch up FE label nếu user thấy "Đã gửi duyệt" nhầm "Bản nháp". KHÔNG cần Service refactor hay handler change. Nếu bro thấy phiếu cụ thể về Phase=1 SAU click F1.OneLevel hoặc F2 → spawn lại Investigator audit DB state + log Changelog cho phiếu đó cụ thể (data debug, not code bug). - 2026-05-15 (S23 t2 spawn L2 — F3+F4 edit menu Duyệt audit): Bug UAT prod
409a967: admin tick F3+F4 cho slot Approver, login actor user, vào menu "Duyệt" (?pendingMe=1cùngPurchaseEvaluationsListPage3-panel), click PE Phase=ChoDuyet → Section 2 Hạng mục/NCC/Báo giá + Section 5 Điều chỉnh ngân sách vẫn read-only. Root cause F3 = OK / F4 = BROKEN at readOnly short-circuit: F3 wire ĐÚNG (PeDetailTabs.tsx:118 itemsReadOnly = readOnly && !approverEditModeoverride readOnly per Mig 28 S21 t4 → ItemsTab read prop OK). F4 wire SAI (PeDetailTabs.tsx:245passesreadOnly={readOnly}(=true từ menu Duyệt) xuống BudgetAdjustSection, line 973 computecanAdjust = !readOnly && (isAdmin || (isDrafter && isDrafterPhase) || isApproverChoDuyet)—!readOnlyshort-circuits to false BEFORE F4 isApproverChoDuyet evaluate. Edit pencil button hidden line 1030{canAdjust && <Button>Điều chỉnh</Button>}. Asymmetric vs F3 pattern Section 2 (PeDetailTabs.tsx:113-118). Evidence: FE F3 OKfe-user/src/components/pe/PeDetailTabs.tsx:113-118+:224 ItemsTab ev={evaluation} readOnly={itemsReadOnly}; FE F4 BUG:957-973 BudgetAdjustSection !readOnly gate+:245 readOnly={readOnly}; menu Duyệt routefe-user/src/pages/pe/PurchaseEvaluationsListPage.tsx:256-261 PeDetailTabs readOnly={true}(cùng route Danh sách); BE GetPePurchaseEvaluationFeatures.cs:735-770 currentLevelOptions populate 7 fieldsOK; BE budget-adjust handler:281-329Phase ChoDuyet F4 branch + actor match + flag check ĐẦY ĐỦ + return ConflictException nếu Allow=false; BE PurchaseEvaluationDraftGuard.EnsureEditableForDetailsAsync ởPurchaseEvaluationDetailFeatures.cs:42(8 callsites Detail+Supplier handlers). Recommendation: FixBudgetAdjustSectionline 973 mirror approverEditMode pattern Section 2: thaycanAdjust = !readOnly && (isAdmin || ...)thànhcanAdjust = isAdmin || (!readOnly && isDrafter && isDrafterPhase) || isApproverChoDuyet— Approver bypass readOnly khi F4 conditions met. LOC ~3-5 LOC 1 file. Surprise: Inbox/inboxroute (InboxPage.tsx) navigate sang/purchase-evaluations/:id(mobile DetailPage route, default readOnly=false) — chỉ Danh sách?pendingMe=1desktop 3-panel mới hard readOnly=true. - 2026-05-14 (S23 t1 spawn K0 — Plan K F2 refactor pre-flight): Audit F2 state cho Plan K Mig 31 (move
Users.AllowDrafterSkipToFinal→ApprovalWorkflowLevels.AllowApproverSkipToFinal+ change semantic Drafter Nháp → Approver ChoDuyet skip thẳng Cấp cuối). Confirmed state Mig 30: Migrations path =Persistence/Migrations/(not directMigrations); 30 mig latest =20260513160703_AddAllowApproverEditBudgetToLevels;User.cs:38AllowDrafterSkipToFinal prop;ApprovalWorkflow.cs:86-1056 Allow* props (4 ReturnMode + EditDetails + EditBudget) per Level slot; F2 Drafter branch ởPurchaseEvaluationWorkflowService.cs:119-161trong SUBMIT branch (line 125if (skipToFinal && evaluation.ApprovalWorkflowId is Guid skipAwId)check user.AllowDrafterSkipToFinal); APPROVE STEP branch ở~line 393-525(advance pointer). TransitionAsync signature:skipToFinallà param thứ 8 (position 47:47), default=false.TransitionPurchaseEvaluationCommandởPurchaseEvaluationFeatures.cs:393-402với paramSkipToFinal=falsedefault.ApprovalWorkflowOptionsDtoởPurchaseEvaluationDtos.cs:86-92(6 field).PurchaseEvaluationDetailBundleDto.DrafterAllowSkipToFinalở line 217 +CurrentLevelOptionsở line 214. UsersControllerPATCH /users/{id}/allow-skip-finalở line 91-98 +SetAllowDrafterSkipToFinalBodyở line 105.SetUserAllowDrafterSkipToFinalCommandởUserFeatures.cs:332. FE state: fe-admin Designersystem/ApprovalWorkflowsV2Page.tsxslot label "NV #{ei + 1}" ở line 873 (KHÔNG phải "#NV {order}" theo prompt) — inline checkbox panel 5+1=6 checkbox ở line 853-933 (4 ReturnMode + EditDetails + EditBudget). fe-adminsystem/UsersPage.tsx"Skip cuối" column line 306-318 + FastForward button toggle line 365-372 + allowSkipMut hook line 181-186. fe-admin/fe-user PeDetailTabs Drafter Workspace checkbox "Gửi thẳng Cấp cuối (skip trung gian)" ở line 287-297 (admin) / 294-304 (user). GAP fe-user: KHÔNG có UsersPage + ApprovalWorkflowsV2Page (admin-only mgmt) → Plan K UI changes localized fe-admin chỉ; fe-user side chỉ touch PeDetailTabs (remove old Drafter checkbox + thêm Approver toggle near Duyệt button). Drift Dev DB: Total=2 user (admin + test.drafter), Flagged=0 — NOT match 33-user prod seed. Prod actual: Total=33 / Flagged=4 (NOT 2 per S22+2 spec). 4 user flagged sẽ lose value when DROP column — acceptable per new semantic (Drafter pre-submit moot). - 2026-05-13 (S22, no spawn — em main solo throughout): S22 18:00→~21:00 em main solo. Cumulative state: 30 mig (+1 Mig 30
AddAllowApproverEditBudgetToLevelsF4 per-Level slot), 104 test PASS (+20: 5 reg #44 Authorize policy + 7 ReturnMode + 7 Guard + 1 V2 actor scope reject), ~146 endpoints (+3: PATCH /users/{id}/allow-skip-final + PATCH /pe/{id}/budget-adjust + GET /pe/{id}/attachments/{attId}/view), 46 gotcha unchanged, 19 memory unchanged (recommend +1 entry — see below). Prod active users 13→33 (+20 role-based: act.nv/pp/tp, bod.1/2, equ/fin/hra/pm/qs.nv/pp/tp). Discoveries S22: (1) Per-NV admin opt-in flag pattern reinforced 2× — Mig 30 F4 cùng pattern Mig 29 F1+F3 (S21 t5). Bro corrected em main lần đầu: "phải tick checkbox như Section 2", default = admin opt-in per slot, KHÔNG = mở rộng default. Cross-ref memoryfeedback_per_nv_permission_scope.mdproven 2×. (2) Plan F drop V1 ABORTED — pre-flight sqlcmd reveal Contract entity HOÀN TOÀN V1 chưa wire V2 (chưa có ApprovalWorkflowId column) + 4 PE V1-only + 19 PE V1+V2 mix. Lesson: drop migration cần verify entity scope toàn bộ (Contract liên đới — không chỉ PE). (3) Identity password policy ≥12 chars — seed 20 user FAIL 400 với "User@123456" (11 chars),TestUser@2026(13 chars) pass. (4) Identity rename atomic 4 fields confirm gotcha #38: Email + NormalizedEmail + UserName + NormalizedUserName + FullName; sqlcmd cầnSET QUOTED_IDENTIFIER ONcho filtered unique index. (5) API login response field nameaccessToken+refreshToken+user— KHÔNG có fieldtoken(correct prior Bash example trong spec dùng.tokensẽ fail). (6) PS 5.1 ASCII-only script discipline reinforced gotcha #30:seed-test-users-prod.ps1viết Vietnamese names without diacritics tránh parser error. Recommend bro add 1 memory entry "Admin opt-in flag pattern proven 2×" cumulative Mig 29 + Mig 30. - 2026-05-13 (S21 t3-t5, no spawn): Em main solo 3 turns (bug fix gotcha #45 + F1+F2+F3 workflow-level Mig 28 + refactor per-NV Mig 29). Implementer REFUSE per cross-stack reasoning chain rule. Investigator KHÔNG spawn — em main đã có context cumulative S20 t12 setup + active dev throughout. No findings to flush. Cumulative state update: 84 test, 29 mig, 45 gotcha, 19 memory entries (+2 S21 t5 pending), 6 skills unchanged. Pattern reusable saved cho future spawn: per-NV permission scope split + EF migration ADD→BACKFILL→DROP reorder.
- 2026-05-11 (setup): Investigator agent initialized. Baseline knowledge load complete (44 gotchas + 14 memory entries + 6 skills + 27 mig + 81 test pass cumulative). No investigations performed yet. Awaiting first SendMessage from em main.
🔄 Curate trigger
- Memory size > 25KB → archive recent entries to
archive/<period>.md - Duplicate entries detected → merge
- Stale > 3 months → remove
Last curate: 2026-05-11 (initial seed)