All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 3m30s
Plan K Mig 31 F2 refactor sang per-Approver-slot DONE — 8 commits cumulative S23 t1 (`56868bf..<this>`). K8 wrap docs + dirty MEMORY.md commit: Docs updates: - docs/STATUS.md: Last updated S23 t1 entry với Plan K summary 8 chunk - docs/HANDOFF.md: TL;DR S23 t1 đầy đủ (top) — multi-agent ROI evidence - docs/database/schema-diagram.md §14: title Mig 22-31 (was 22-29) + add Mig 30 F4 + Mig 31 F2 blocks per slot Approver + DROP Users column note - NEW docs/changelog/sessions/2026-05-14-s23-turn1-plan-k-mig31-f2-refactor.md session log đầy đủ 8 chunk timeline + multi-agent spawn cost table + pattern reinforced 3× FE Admin Designer comment cleanup (Reviewer K2 follow-up): - ApprovalWorkflowsV2Page.tsx lines 73-75 + 502-504: 2 stale narratives "F2 AllowDrafterSkipToFinal xuống per User (User Management)" rewrite Mig 29+30+31 cumulative narrative "7 Allow* ALL xuống per Level slot, pattern proven 3×" 3 agent MEMORY.md drift commit (dirty từ session start S23 + S22 chốt): - Investigator: K0 pre-flight findings + 5 surprises catch - Reviewer: K2 PASS report + new pattern "transient sentinel zombie" anti-pattern - CICD Monitor: S22 chốt verify cumulative (Run #193 + S23 t1 pending K9 spawn) User-level memory updates (cross-project diary persisted ngoài repo): - feedback_per_nv_permission_scope.md: reinforcement S23 t1 — Pattern 3× cumulative (Mig 29 + Mig 30 + Mig 31). Pattern ALSO applies cho refactor existing scope, KHÔNG chỉ greenfield. Cross-ref discoveries Plan K (compile-break workaround, stale narrative drift, transient sentinel zombie anti-pattern caught Reviewer). - MEMORY.md index: cumulative reinforcement note 3× Mig 31 Verify: - dotnet build production projects clean - npm run build fe-admin pass 17.76s, 0 TS err - Test 104/104 PASS (S23 t1 K7 chunk maintained baseline) Plan K state final: 31 mig · 59 tables · ~145 endpoints · 104 test · 47 gotcha · 20 memory · 6 skills · 4 sub-agents active. CHƯA push remote — chờ bro confirm K9 spawn CICD Monitor. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
14 KiB
14 KiB
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.Orderarithmetic — 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.cshoặcApplicationDbContextModelSnapshot.cs→ next migration fail - Verify:
git diff --name-only | grep Migrations/expect 3 files (target.cs + target.Designer.cs + Snapshot.cs)
Gotcha #47 — .claude/agent-memory/** NOT in paths-ignore filter (S22 discovery, PENDING bro decide)
- Symptom: MEMORY.md drift patch commit (end-of-session flush) triggers full CI deploy ~3.5min waste
- Verify: check
.gitea/workflows/deploy.ymlpaths-ignore— currently['docs/**', '**/*.md', '.claude/skills/**']MISSING.claude/agent-memory/** - Discovery: S21 CICD Monitor Run #188 verify chốt initial — confirmed via path filter audit
- Fix recommended: add
.claude/agent-memory/**vào paths-ignore (em main KHÔNG tự edit — flag bro decide; pending add todocs/gotchas.md47th entry) - Severity: minor (CI waste only, no functional impact)
📋 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+ skilldependency-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.tsmirror BEMenuKeys.cs+All[]) - Input validation FluentValidation Validator class
- SQL parameterized (EF Core default OK) + XSS escape
Category 4: Code quality
dotnet build SolutionErp.slnxclean 0 errnpm run build× fe-admin + fe-user clean (TS6 strict)- Tests baseline 81 PASS (Phase 9 UAT exception OK)
- No
--no-verifybypass (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)
- ❌ Recommend code edits — only describe issue + acceptance criteria
- ❌ Skip live curl verify if deploy claim — recurring risk
- ❌ Accept "wire" claim without grep proof
- ❌ Defer to em main authority — escalate disagreement explicitly
- ❌ Skip MEMORY.md update với anti-patterns observed
- ❌ 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: 104/104 PASS (58 Domain + 46 Infra — +20 từ 84 S21: 5 regression gotcha #44 Authorize class-level + 7 ReturnMode + 7 Guard EnsureCanRejectV2Async + 1 V2 actor scope reject). Must increase nếu feature added per §7; UAT iteration exception per memory
feedback_uat_skip_verify(Plan C test-after bundle defer) - Gotchas: 46 active (
docs/gotchas.mdreference) — +#45 PE button TraLai payload mismatch + +#46 Gitea API path/cache stale (S21 t3-t4). +#47 paths-ignore agent-memory gap (S22 PENDING bro confirm add to docs) - Migrations: 30 latest
AddAllowApproverEditBudgetToLevels(S22+5 — per-slot F4 flag admin opt-in cho Approver scope edit budget ChoDuyet branch). Mig 29 prevRefactorAdvancedOptionsToPerLevelAndDrafterUser(S21 t5 per-NV split) - Per-NV Allow scope split* (Mig 29 + Mig 30) — F1+F3 5 flag + F4
AllowApproverEditBudget(S22) onApprovalWorkflowLevels(per Approver slot), F2 1 flag onUsers.AllowDrafterSkipToFinal(per Drafter). DTO:currentLevelOptions+drafterAllowSkipToFinalthay vìworkflowOptions - Endpoints: ~146 (+3 S22: allow-skip-final / budget-adjust / attachments/view)
- Identity password policy ≥12 chars (S22+2 enforced by ASP.NET Identity stack — reject
User@12345611 chars). Existing HANDOFF mention "User@123456" pattern S4 outdated, current test creds Admin@123456 + TestUser@123456 OK - 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)
- Admin:
- Users active: 33 (rename role-based pattern act.nv / act.pp / act.tp etc.)
- 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+ CI20.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-14 (S23 t1 Plan K1+K2 cumulative review, spawn): Pre-K3 adversarial verify Mig 31 schema swap + Service Approver F2 branch. Diff scope: 11 BE files +4093/-83 LOC (Mig Designer 3938 lines dominate). 3 commits chuỗi
eb106f2..56868bf..db66253..364aef6— pre-A slot label refactor + K1 Domain/Mig/Snapshot/sentinel patches + K2 DTO+Service Approver branch. Verdict: PASS với 2 Major + 2 Minor issues — K3 OK proceed nhưng K5 endpoint cleanup nên ưu tiên trước K7 test fix. Wire claim verify: Approver F2 branch placed ĐÚNG vị trí (line 477 AFTER UPSERT opinion line 441-468 + BEFORE advance pointer line 502) — opinion sẽ ghi trước skip terminal, audit log đầy đủ context Bước/Cấp. ApproveV1LegacyAsync skipToFinal guard tại CALLER (line 147-149 trong TransitionAsync branch) thay vì callee — pattern OK, V1 method giữ nguyên signature legacy. Schema sqlcmd verify Dev: 7 Allow* columns ApprovalWorkflowLevels (AllowApproverEditBudget/EditDetails/SkipToFinal/ReturnOneLevel/OneStep/ToAssignee/ToDrafter) + Users.AllowDrafterSkipToFinal dropped (count=0). Snapshot regen clean. EF config HasDefaultValue(false) wire. Mig 31 Up() manual reorder ADD→DROP correct per memoryfeedback_ef_migration_backfill_reorder. Major issues caught (Smart Friend guard active — KHÔNG để pass): (1) Orphan UsersController endpoint zombie — K1 sentinel commented "K2 sẽ refactor DTO + drop field" nhưng K2 chỉ refactor PE side, KHÔNG động UsersController.SetAllowDrafterSkipToFinal + UserFeatures.SetUserAllowDrafterSkipToFinalCommand + UserDto field. Endpoint PATCH/api/users/{id}/allow-skip-finalvẫn live nhưng silent NoOp (Task.CompletedTask), admin UI tick → BE swallow → confusion UX. Cần K5 endpoint cleanup chunk (per spec). (2) Stale Mig 28 comment ApprovalWorkflow.cs:78 — comment cũ "F2 (Drafter skip) đã move sang Users.AllowDrafterSkipToFinal" còn nguyên dù line 107-113 prop AllowApproverSkipToFinal mới. Confuse future dev. Minor issues: (3) Comment TransitionPurchaseEvaluationCommand DTO PurchaseEvaluationFeatures.cs:401 "F2 — Drafter skip thẳng Cấp cuối khi trình duyệt" still says Drafter (semantic outdated). (4) ApprovalWorkflowConfiguration.cs:22 stale Mig 28/29 narrative comment chưa note Mig 31. Anti-fiddle audit PASS: K1 18 LOC UserFeatures.cs sentinel patches valid compile-break workaround, K2 4 files within original spec. Anti-pattern reinforced 3×: admin opt-in per slot per-NV (Mig 29 F1+F3 + Mig 30 F4 + Mig 31 F2 — em main lần đầu sai Mig 30 default scope expansion → bro corrected). Production build PASS 0 err 2 warn (DocxRenderer unrelated). Test references K7-pending line 253. No--no-verifybypass. Pattern caught: "Transient sentinel pattern" — đặt sentinel + comment commit chunk khác cleanup nhưng chunk đó scope SHIFT → zombie state. Recommend explicit K5 cleanup chunk trước K7 test fix. Cumulative state: 31 mig (+1 Mig 31), 47 gotcha unchanged. Smart Friend guard active. - 2026-05-13 (S22 18:00→21:00, no spawn): Em main solo self-review S22 — Reviewer KHÔNG spawn per UAT mode
feedback_uat_skip_verify. Em main verify build clean + test pass + npm build × 2 app mỗi chunk (11 commits cumulative). Key validations: (1) Plan E phân quyền strict V2 — actor.UserId scope in List + Detail, Inbox đã strict từ S17, loose UAT clause|| ApprovalWorkflowId != nullremoved. (2) S22+1 V2 actor scope guard BE helperEnsureCanRejectV2Asyncchặn request forge non-approver PATCH /transitions decision=Reject (mirror FE button disable) — defense-in-depth FE+BE pattern. (3) S22+4 AdjustBudgetCommand handler 3-tier scope (Drafter Nháp/Trả lại + Approver ChoDuyet + Admin) — S22+5 refactor ChoDuyet branch dùnglevel.AllowApproverEditBudgetflag (admin opt-in per slot) thay default Approver scope (security scope correction per bro feedback). (4) S22+2 Identity password policy enforced ≥12 chars (rejectUser@12345611 chars outdated). Anti-patterns observed: (a) Default scope expansion mistake S22+4 → S22+5 fix — KHÔNG default expand permission scope without admin tick (per-NV opt-in pattern Mig 29 lesson reinforced); (b) History display field assumption BudgetAdjustSection initial — em assumePeDetailBundle.changelogsexists, FAIL TS2339 — pattern verify type fields trước render; (c) PS 5.1 Vietnamese diacritics gotcha #30 reinforced — scriptseed-test-users-prod.ps1first attempt FAIL parser error, ASCII-only discipline. S22+4 attachment view endpoint + S22+4 budget-adjust endpoint chưa qua live curl verify (defer post-deploy — bro UAT direct). S22+5 Mig 30 applied LocalDB Dev + Design viadotnet ef database update. New gotcha discovered: #47 paths-ignore agent-memory gap (recommend add to docs/gotchas.md — pending bro decide). Cumulative state: 104 test (+20), 30 mig (+1 Mig 30), 46 gotcha unchanged (gotcha #47 pending), ~146 endpoints (+3), 33 active users. Smart Friend guard still active for future spawn. - 2026-05-13 (S21 t3-t5, no spawn): Em main solo verify via dotnet build + npm build × 2 app + dotnet test suite mỗi chunk. Reviewer KHÔNG spawn — em main self-review per UAT mode
feedback_uat_skip_verify(skip dotnet test mỗi chunk, vẫn build verify). Gotcha #45 fix self-test 3 regression test (test-before §7). S21 t3-t5 push cumulative 12 commits — CICD Monitor verify post-deploy thay vai Reviewer (deploy ship + bundle hash + schema verify). Cumulative state: 84 test, 29 mig, 45 gotcha, 19 memory entries. Pattern saved cho future review focus: per-NV permission audit (Level table vs User table flag), EF migration backfill SQL injection between ADD-DROP order. Smart Friend guard still active for future spawn. - 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)