Files
solution-erp/.claude/agent-memory/reviewer/MEMORY.md
pqhuy1987 ae1814cdba [CLAUDE] Skill: Setup multi-agent infrastructure (Investigator + Implementer + Reviewer)
Session 20 turn 12: User paste self-contained template setup multi-agent từ
NAMGROUP s41-s43 trial (empirical-grounded Anthropic Building Effective
Agents + Cognition "writes single-threaded"). Pre-flight decision gate 6/6
pass → proceed setup.

### Phase 0 — Pre-flight  6/6

- Codebase > 10K LOC  (59 tables · 27 mig · ~142 endpoints · 34 FE pages)
- Project > 6 months  (roadmap T1-T13)
- Heavy multi-file features regular  (per-chunk 5-6 commit/session)
- User extend ngáo threshold  (S20 đã 12+ turn, deep context)
- 25+ gotchas/patterns  (44 gotchas · 14 memory · 6 skills)
- Critical changes adversarial review  (UAT live 3 prod domain)

### Phase 1-4 setup

.claude/
├── agents/
│   ├── README.md          (master coordination guide ~9.7KB)
│   ├── investigator.md    (READ — research + audit + WebFetch ~7.3KB)
│   ├── implementer.md     (WRITE conditional Case 1+2+3+5 ~8.4KB)
│   └── reviewer.md        (READ adversarial pre-commit + live curl ~9.6KB)
└── agent-memory/
    ├── investigator/MEMORY.md  (seed ~5.9KB)
    ├── implementer/MEMORY.md   (seed ~6.9KB)
    └── reviewer/MEMORY.md      (seed ~6.5KB)

### Customizations per SOLUTION_ERP

- Stack: .NET 10 Clean Arch + 2 React 19 FE + SQL Server + Gitea + IIS
- Skills preload mỗi agent (reuse 6 skills hiện có):
  - Investigator: contract-workflow + permission-matrix + ef-core-migration
  - Implementer: ef-core-migration + permission-matrix + form-engine
  - Reviewer: dependency-audit-erp + iis-deploy-runbook + contract-workflow
- DB: SolutionErp_Dev (LocalDB runtime) + _Design (ef tooling distinct)
- Test bearer: admin@solutions.com.vn / Admin@123456 (full) +
  nv.test@solutions.com.vn / TestUser@123456 (Drafter UAT scope)
- Prod UAT: api/admin/eoffice.solutions.com.vn

### Windows MAX_PATH pitfall handled

Project path D:\Dropbox\CONG_VIEC\SOLUTION\SOLUTION_ERP\ = 51 chars + nested
Dropbox-managed → `isolation: worktree` DROPPED khỏi implementer.md frontmatter
per template Pitfall 1. Em main reviews diff before commit (compensate).

### Memory baseline seeded

3 MEMORY.md có:
- Patterns proven cross-session (5-chunk discipline, 3-file Mig rule, audit-reuse,
  service hook derived, FE mirror 2 app, VND format helpers)
- 44 gotcha cross-ref
- Phase 9 UAT iteration mode (skip test per chunk theo memory feedback_uat_skip_verify)
- 5-category Reviewer checklist tinh chỉnh theo SOLUTION_ERP gotcha cluster
  (#44 silent 403 + #43 Step.Order + #42 V1/V2 dual schema + Wire BE claim)
- Tests baseline 81/81 PASS preserve

### Trial workflow

Week 1 candidate: Contract V2 wire (Mig 28+29) mirror PE pattern S17-S19 —
audit-reuse pattern proven 1×. ~600+ LOC, 2 mig + Service + Controller + FE
× 2 app. Investigator pre-flight + Implementer A→E chunks + Reviewer
pre-commit verify gotcha #42 dual schema.

Em main spawn first time qua /agents command. Pattern tracking ROI 4 tuần
trial (week 4 evaluate keep / tune / archive).

### Acceptance criteria 7/7 

- 4 agent .md với valid YAML frontmatter (name/description/model/effort/tools/
  skills/memory/color/maxTurns)
- 3 MEMORY.md seeds populated SOLUTION_ERP context
- All template placeholders {XXX} replaced
- Skills 3 đầu agent point tồn tại .claude/skills/ (6 skills sẵn)
- File structure đúng template
- Implementer isolation worktree dropped (Windows MAX_PATH)
- Trial 1 ready (em main /agents spawn dispatch)

References: Anthropic Building Effective Agents + Cognition "writes
single-threaded" + NAMGROUP s41-s43 empirical curve (+83% → +27% → ~0%
overhead). Setup time ~3-5h estimate (đã làm trong S20 turn 12 ~30min do
template self-contained + project context đã accumulate).

Path filter CI sẽ skip (.claude/skills/** trong paths-ignore, mirror cho
.claude/agents/** + .claude/agent-memory/** thực tế cũng docs-class).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 21:09:46 +07:00

6.4 KiB
Raw Blame History

Reviewer Agent — Persistent Memory

Persistent diary cross-session. Auto-injected first 200 lines / 25KB at spawn. Update BEFORE every stop. Curate when > 25KB.


🎯 Role baseline

Adversarial pre-commit reviewer for SOLUTION_ERP. Read-only verification + live curl on prod UAT environment (*.solutions.com.vn). Tools: Read, Grep, Glob, Bash (curl + git diff + sqlcmd read). Output: PASS/FAIL verdict + concrete issues file:line.


🚨 Recurring SOLUTION_ERP bug patterns (catch with priority)

Gotcha #44 — Silent 403 class-level Authorize quá strict (S18 lesson)

  • Symptom: Drafter dropdown V2 workflow empty silent (no error toast)
  • Root: [Authorize(Policy = "Workflows.Read")] class-level → non-admin 403, TanStack Query catch silent → UI empty
  • Verify: grep \[Authorize\(Policy = .*\)\] class-level vs action-level + curl với non-admin token expect 200
  • Fix pattern: class-level [Authorize] only (any authenticated). POST/PUT/DELETE giữ [Authorize(Policy = "X.Create")] admin-only

Gotcha #43 — Step.Order ≠ index 0-based

  • Symptom: EF query Where(s => s.Order == i) returns wrong row
  • Verify: grep step.Order arithmetic — array index 0-based vs Order field 1-based
  • Fix pattern: precompute candidates EF query → in-memory OrderBy(s => s.Order).ToList() → array index access

Gotcha #42 — Dual schema workflow V1 vs V2 — Service phải branch

  • Symptom: PE submit failed do Service không biết V1 hay V2 schema
  • Verify: grep evaluation.ApprovalWorkflowId is Guid awId — phải branch theo pin field
  • Fix pattern: if (evaluation.ApprovalWorkflowId is Guid awId) ApproveV2Async(...) else ApproveV1LegacyAsync(...)

Wire BE claim recurring bug pattern

  • Symptom: claim wire CRUD nhưng grep diff finds // Mock / alert(...) / no POST/PUT/DELETE call
  • Verify: grep diff mock markers + live curl POST/PUT/DELETE expect 2XX
  • Severity: CRITICAL — block commit

Gotcha #17 — EF migration 3-file rule

  • Symptom: commit migration nhưng thiếu .Designer.cs hoặc ApplicationDbContextModelSnapshot.cs → next migration fail
  • Verify: git diff --name-only | grep Migrations/ expect 3 files (target.cs + target.Designer.cs + Snapshot.cs)

📋 5-category checklist (apply EVERY review)

Category 1: Wire BE / feature claim verify

  • Grep mock markers in diff (// Mock, alert(, setEditing(null) // close UI, TODO.*wire)
  • Grep actual API call: await api\.(post|put|delete|patch)\( trong FE diff
  • Live curl POST/PUT/DELETE/PATCH if deploy claim (https://api.solutions.com.vn/...)
  • Status code matrix expected vs actual

Category 2: Schema integrity (44 active gotchas)

  • Reference docs/gotchas.md + skill dependency-audit-erp
  • Check 3-file rule Mig
  • Check column types vs entity definition (Mig 27 lesson: IsVisible bit NOT NULL DEFAULT 1 + DisplayLabel nvarchar(200) NULL)

Category 3: Security

  • [Authorize] class-level on ALL new controllers
  • Per-action [Authorize(Policy = "...")] cho admin-scoped (gotcha #44 lesson)
  • Permission guard wrap new admin pages (FE)
  • Route permission map populate (menuKeys.ts mirror BE MenuKeys.cs + All[])
  • Input validation FluentValidation Validator class
  • SQL parameterized (EF Core default OK) + XSS escape

Category 4: Code quality

  • dotnet build SolutionErp.slnx clean 0 err
  • npm run build × fe-admin + fe-user clean (TS6 strict)
  • Tests baseline 81 PASS (Phase 9 UAT exception OK)
  • No --no-verify bypass (forbidden absolute)
  • Anti-fiddle audit (scope drift > 20% LOC outside spec = FAIL)
  • Mirror 2 FE app khi feature FE (rule §3.9)

Category 5: Test coverage

  • New helper static → unit test (xUnit)
  • New Repository method → repo test
  • New endpoint API → integration test (WebApplicationFactory)
  • Bug recurring → regression test TDD-style (test BEFORE fix)
  • Phase 9 UAT exception: test-after default OK theo memory feedback_uat_skip_verify
  • Test count baseline 81 → tăng khi feature added theo §7

⚠️ Anti-patterns observed (DO NOT)

  1. Recommend code edits — only describe issue + acceptance criteria
  2. Skip live curl verify if deploy claim — recurring risk
  3. Accept "wire" claim without grep proof
  4. Defer to em main authority — escalate disagreement explicitly
  5. Skip MEMORY.md update với anti-patterns observed
  6. Lower bar to match em main quality — Smart Friend anti-pattern Cognition

🛡️ Smart Friend anti-pattern guard

Per Cognition documented research:

  • NEVER lower bar to match em main's apparent quality
  • If em main code fine → say PASS
  • If em main code has issues → FAIL with specifics regardless social pressure
  • "Quality ceiling was set by the primary, not the escalation." — Your value = raise quality through catch

🧠 SOLUTION_ERP review essentials

  • Tests baseline: 81/81 PASS (must increase nếu feature added per §7; UAT iteration exception per memory)
  • Gotchas: 44 active (docs/gotchas.md reference)
  • Live deploys (Prod UAT): https://api.solutions.com.vn · https://admin.solutions.com.vn · https://eoffice.solutions.com.vn
  • Bearer token test:
    • Admin: admin@solutions.com.vn / Admin@123456 (full quyền)
    • UAT user: nv.test@solutions.com.vn / TestUser@123456 (Drafter Phòng CCM — verify non-admin access patterns)
  • Conventions: docs/rules.md (§3.9 mirror 2 FE, §5.2 commit format, §6.5 docs KEEP narrative, §7 test timing, §2.8 package pinning)
  • 6 skills: contract-workflow · permission-matrix · form-engine · ef-core-migration · dependency-audit-erp · iis-deploy-runbook

🔑 Critical pin verify (gotcha #1-4)

  • MediatR 12.4.1 (14 fail DI)
  • Swashbuckle 6.9.0 (10 conflict OpenApi 2)
  • Microsoft.OpenApi 1.x (2 breaking)
  • Node engines >= 20 + CI 20.x (Node latest fail Windows IIS)

Flag commit nếu thấy <PackageReference Include="MediatR" Version="14... hoặc tương tự.


📅 Recent activity (last 10 FIFO)

  • 2026-05-11 (setup): Reviewer agent initialized. Baseline knowledge load complete (44 gotchas + 5-category checklist + 6 skills cumulative). No reviews performed yet. Awaiting first SendMessage from em main. Smart Friend guard active.

🔄 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)