# Implementer Agent — Persistent Memory > **Persistent diary cross-session.** Auto-injected first 200 lines / 25KB at spawn. > Update BEFORE every stop. Curate when > 25KB. --- ## 🎯 Role baseline Code execution specialist for SOLUTION_ERP. Conditional WRITE (Case 1+2+3+5 ONLY). Tools: Read, Edit, Write, Bash, Skill, Grep, Glob. Output: commits + verification report. ## 🚨 STRICT scope auto-refuse criteria REFUSE if ANY: 1. Schema design decisions needed (FK strategy / nullable / discriminator) 2. UX flow decisions needed (drawer vs tab vs modal) 3. Cross-stack > 2 layers tight coupling 4. Bug fix involving reasoning chain 5. Integration testing involving multiple components 6. < 30 min trivial task 7. First time pattern (no prior precedent) 8. Spec ambiguity > 20% --- ## 📋 Patterns proven (cross-session) — apply confidently ### Pattern 1: Per-chunk discipline 5-chunk A-E (Anthropic Case 2 orchestrator-workers) Memory `feedback_per_chunk_commit` chốt: - **Chunk A:** Domain entities + Migration (3-file rule) - **Chunk B:** Application handlers (CQRS Commands + Queries + Validators) - **Chunk C:** Service layer (workflow logic, business rules) - **Chunk D:** API controllers + endpoints - **Chunk E:** FE update (cả 2 app mirror) + Tests + Docs + commit final Build + test pass mỗi chunk. Commit message format: ``` [CLAUDE] : Chunk Verify: - Build pass (X warning, 0 error) - N test pass (...) Pending Chunk : Co-Authored-By: Claude Opus 4.7 (1M context) ``` ### Pattern 2: 3-file rule EF migration (BẮT BUỘC commit đủ) Memory + gotcha #17: - `Migrations/{TS}_{Name}.cs` (Up + Down) - `Migrations/{TS}_{Name}.Designer.cs` (snapshot at migration time) - `Migrations/ApplicationDbContextModelSnapshot.cs` (current snapshot) ```bash dotnet ef migrations add \ --project src/Backend/SolutionErp.Infrastructure \ --startup-project src/Backend/SolutionErp.Api # Apply lên DB Dev: dotnet ef database update --project src/Backend/SolutionErp.Infrastructure \ --startup-project src/Backend/SolutionErp.Api \ --connection "Server=(localdb)\MSSQLLocalDB;Database=SolutionErp_Dev;Trusted_Connection=True;TrustServerCertificate=true" # Apply lên DB Design (catchup nếu thiếu): dotnet ef database update --project src/Backend/SolutionErp.Infrastructure \ --startup-project src/Backend/SolutionErp.Api ``` ### Pattern 3: Audit reuse trước khi clone (memory `feedback_audit_reuse_before_clone`) Khi user nói "clone X sang Y": 1. **Grep discriminator field** (`ApplicableType`, `Type`, `Kind` enum) 2. **Check Service / Handler / Controller** có hardcode type cụ thể không 3. **Check FE pages** có route dynamic typeCode hay hardcode 4. **Check menu key** (BE const + FE menuKeys.ts) — thường thiếu chính ở đây 5. Default reuse 80%, chỉ thêm menu key + sample seed (3 file ~60 LOC) Bài học S17+ Clone B: 1 commit `937eb24`, deploy 1 phát chạy. ### Pattern 4: Service hook vs CRUD endpoint cho derived state (memory `feedback_service_hook_vs_endpoint`) State X = derived của action Y → UPSERT trong handler Y, KHÔNG endpoint /X riêng. Bài học S19 Mig 26 PE LevelOpinions: Service `ApproveV2Async` UPSERT row qua match `ApproverUserId == actorUserId` (fallback first khi Admin override). 0 endpoint mới. ### Pattern 5: FE mirror 2 app rule §3.9 Duplicate `fe-admin/` + `fe-user/` CÓ CHỦ ĐÍCH: - Sửa fe-admin xong → mirror fe-user (tay) - Khi breaking change rename prop → BẮT BUỘC `npm run build` × 2 app (memory `feedback_uat_skip_verify` exception) ### Pattern 6: VND format helpers + Phone/Email validate (S20 turn 4) Inline mỗi file FE PE: ```ts const parseVnd = (s: string): number => Number(s.replace(/[^\d]/g, '')) || 0 const formatVndInput = (n: number): string => (n > 0 ? n.toLocaleString('vi-VN') : '') const PHONE_RE = /^0\d{9,10}$/ const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/ const isValidPhone = (s: string) => !s || PHONE_RE.test(s.replace(/[\s\-.]/g, '')) const isValidEmail = (s: string) => !s || EMAIL_RE.test(s) ``` --- ## ⚠️ Anti-patterns observed (DO NOT) 1. ❌ Skip MEMORY.md update — knowledge tài sản 2. ❌ Bypass pre-commit hooks `--no-verify` (forbidden absolute) 3. ❌ `git add -A` hoặc `git add .` — specific files only 4. ❌ Touch files outside spec scope — anti-fiddle rule 5. ❌ Push remote autonomously cho heavy change — em main pushes (UAT iteration: confirm với em trước push) 6. ❌ Modify `SolutionErp.slnx` autonomously — em main updates khi thêm `.cs/.csproj` 7. ❌ Lower bar to match em main quality — Smart Friend Cognition anti-pattern 8. ❌ Proceed when spec ambiguous > 20% — return REFUSE với reason --- ## 🧠 SOLUTION_ERP conventions (auto-load via skills) - **BE .NET 10:** PascalCase tiếng Anh entities + DTO records + command names. CQRS + MediatR + FluentValidation + AutoMapper. Repository qua `IApplicationDbContext`. `GlobalExceptionMiddleware` map exception → ProblemDetails (NO try-catch trong controllers). - **FE React 19 + Vite 8 + TS 6:** Named export only (trừ App). TanStack Query. shadcn/ui copy-paste. TS6 `erasableSyntaxOnly` cấm `enum` → const-object pattern. UI 100% tiếng Việt. Mirror 2 app rule §3.9. - **Test:** baseline 84/84 PASS (58 Domain + 26 Infra: 23 baseline + 3 PE WF guard regression S21 t3 gotcha #45). Phase 9 UAT skip per chunk theo memory `feedback_uat_skip_verify`. Stack xUnit + FluentAssertions 7.2 + EF SQLite 10 `TestApplicationDbContext` override `nvarchar(max) → TEXT`. - **Build:** `dotnet build SolutionErp.slnx` clean 0 err + `npm run build` × 2 app pass. - **Commit:** `[CLAUDE] : ` + Co-Authored-By Claude Opus 4.7 (1M context). ## Scopes (pick 1) `Contract` · `PurchaseEvaluation` · `Budget` · `Form` · `Workflow` · `Supplier` · `Auth` · `Admin` · `Api` · `App` · `Domain` · `Infra` · `FE-Admin` · `FE-User` · `Tests` · `Docs` · `CICD` · `Scripts` · `Skill` --- ## 🔑 Pin versions (package pinning §2.8) KHÔNG `*` / `latest`. Critical pins: - MediatR `12.4.1` (14 fail DI) - Swashbuckle `6.9.0` (10 conflict OpenApi 2) - Node engines `>= 20` + CI pin `20.x` (bài học NamGroup, memory `feedback_node_cicd`) - LibreOffice `25.8.6` - @microsoft/signalr `8.0.7` --- ## 📅 Recent activity (last 10 FIFO) - **2026-05-13 (S21 t3-t5, REFUSED 3×):** Em main classified all 3 turns as cross-stack reasoning chain (BE+FE+test tightly coupled) → REFUSE per criteria #3+#4 (cross-stack > 2 layers, bug fix reasoning chain). Bug fix gotcha #45 = bug + reasoning, F1+F2+F3 = schema design decision, Refactor per-NV = drastic refactor schema + Service + FE × 2 app. All correct REFUSE — em main solo executed. Strict scope criteria validated S21 t3-t5 — REFUSE rate 100% match Anthropic warning "tightly interdependent coding". Cumulative: 84 test, 29 mig, 45 gotcha. Pattern saved future invocation: per-NV permission scope split natural theo role + EF migration BACKFILL reorder pattern. - **2026-05-11 (setup):** Implementer agent initialized. Baseline knowledge load complete (5 patterns proven cumulative S1-S20: per-chunk 5 chunk, 3-file rule Mig, audit-reuse clone, service hook derived state, FE mirror 2 app, VND format helpers). No implementations performed yet. Awaiting first SendMessage from em main. Strict scope auto-refuse criteria active. --- ## 🔄 Curate trigger - Memory size > 25KB → archive recent entries to `archive/.md` - Duplicate entries detected → merge - Stale > 3 months → remove Last curate: 2026-05-11 (initial seed)