- STATUS/HANDOFF: thêm S57bis + S58 (2-session gap S57bis đóng vội), counts re-ground (Mig 49 · test 240 · gotcha 60 · menu 57 · bundle CP4CB1ym/BmZ3VHnm curl-verified · RAG 2420). Ops S56 "gán user IT" RESOLVED (nv.cao/nv.truong sống lại nhờ password fix). - gotchas: #59 (PS5.1 git commit -F, residual S57bis) + #60 NEW (Identity seed CreateAsync silent-fail vs prod RequiredLength=12 — population Dev ≠ prod, dump data thật trước lock/seed-by-email) + checklist 31/32. - agent-memory: cicd Run #381 (residual) + #382 · 4 spawn-record on-behalf (database-agent/impl-backend/impl-frontend/reviewer — H2 Coverage 4-MISS đóng) · investigator-codebase recon · 2 monitor RE-REPORT entries. - skills: ef-core +row Mig 49 (49 mig ×5 chỗ) · README + dep-audit count sync. - CLAUDE.md root: Mig 49 + test 240 + gotcha 60 + schema-ref 32-49. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
5.8 KiB
5.8 KiB
database-agent — MEMORY (L1 HOT)
READ-advisory DB specialist SOLUTION_ERP (.NET 10 EF Core 10 + SQL Server, single
ApplicationDbContextdbo). Adopt AI_INFRA broadcast2026-06-08-Agent-database-codebase-agents(floor DB1–DB11), S52 2026-06-08. Seed = em main. Nấc hiện: executed-file — verified-runtime CHỜ anh restart CLI + spawn-test.
Vai trò (FORM tailored SE)
- READ-advisory tier — DESIGN/REVIEW/PERF/CONCURRENCY-advise, KHÔNG author file.
implementer-backendauthor entity+config+migration; em main solo quyết schema-design cuối. database-agent = deep-DB lens hỗ trợ + review. - Floor DB1–DB11 (canonical, KHÔNG hạ) — chi tiết
.claude/agents/database-agent.md. - Skill:
sql-database-assistant(SQL Server raw, KHÔNG cover EF-Core) +ef-core-migration(EF Core 10 pin + 3-file rule). Verify present TRƯỚC wire. store_memorySTRIPPED → ghi finding vào FILE này; em main + re-index → RAG.
SE facts cốt lõi (DB10 evidence-based — re-ground khi cần)
- 45 migration → 92 tables (S51).
sys.tables= ground-truth (narrative count drift "incremented-per-session" → re-ground). - 2 DB instance: LocalDB
SolutionErp_Dev(runtime) /SolutionErp_Design(design-time) — gotcha designtime-vs-runtime DB (apply migration cả 2 qua--connectionoverride). Prod =.\SQLEXPRESS\SolutionErp. - Soft-delete UNIQUE index PHẢI
.HasFilter("[IsDeleted]=0")(gotcha #57 — 13× pattern; S45 Holiday + S51 LeaveType/Shift/OtPolicy/Vehicle/Driver). EXT backlog: Department/Supplier/Project (Mig 46 worktree). - Codegen atomic =
WorkflowAppCodeGen.GenerateMaDonTuAsyncdùngIsolationLevel.Serializabletx (Prefix-keyed sequence) — pattern ĐÚNG tham chiếu cho concurrency.
🎯 DB11 gap đã biết (concurrency — vai trò chính)
- S43/S56 LeaveBalance lost-update — FIX DESIGNED S56 (approach A, NO migration).
ApproveLeaveRequestHandlerterminal DaDuyet branch (LeaveOtApprovalFeatures.cs:355-386) đọcbal.UsedDaysin-memory ++= p.NumDays+ bare SaveChanges → 2 concurrent terminal-approve cùng (User,Type,Year) lost-update. Fix: wrap terminal-branch trong explicitBeginTransactionAsync→ (1) SaveChanges persist opinion-upsert + status=DaDuyet + ensure balance-row exists (insert UsedDays=0 nếu absent), (2)ExecuteUpdateAsync(SET UsedDays = UsedDays + n)atomic DB-side race-free, (3) Commit. Atomic-with-approval preserved (1 tx all-or-nothing). Exactly-once untouched (earlyStatus != DaGuiDuyetguard :296). NO ambient TransactionBehavior (chỉ ValidationBehavior) → handler own tx boundary. Cast(DbContext)dbđể reach Database (IApplicationDbContext chỉ expose DbSet+SaveChangesAsync). Existing terminal test (Case 4 :226) assert Status/Level/opinion-count only — KHÔNG assert UsedDays-on-tracked → ExecuteUpdate (bypass tracker) WON'T break suite. Spec authoritative → implementer-backend author. - OtRequest terminal KHÔNG trừ phép (chỉ status) → no lost-update bên OT.
- P11-D SLA flags (
SlaWarnedSent/SlaBreached) + P11-F codegen = concurrency-sensitive → DB11 lens áp được.
Boundary (⟂)
- vs implementer-backend: DESIGN/REVIEW vs AUTHOR (KHÔNG double-touch migration file).
- vs investigator-codebase: deep DB-layer (introspection/query-plan/concurrency) vs broad grep/audit.
- vs reviewer: DB-layer design-review (DB6/DB11/DB5) TRƯỚC author vs adversarial pre-commit cross-stack.
- KHÔNG: FE · business-logic · deploy · session-lifecycle audit.
Accuracy (G-015)
- DB7 scope-DB-only = PHÂN-VAI, KHÔNG "read-only enforced" (giữ
Bash→ write-channel shell mở; containment = em main single-writer + git-diff post-session). - Schema/perf-claim từ introspection THẬT (
sqlcmd/dotnet ef), KHÔNG narrative.
Log
- S52 (2026-06-08): Seeded (em main, adap-apply database-agent). Roster 10→11. Nấc executed-file. CHỜ restart + spawn-test → verified-runtime.
- S56 (2026-06-09) — pre-golive verify (2nd real spawn, verified-runtime ✓): Schema/Mig integrity P11 + S55 master-data = SOLID. Mig 42-48 applied IDENTICALLY Dev+Design+prod
.\SQLEXPRESS(48 mig / 92 tables, NO S53-style unapplied-local drift); 0 pending model-snapshot diff; 9 gotcha-#57 filtered-unique confirmed BOTH EF config (HasFilter×13) AND DB (filter_definition=([IsDeleted]=(0))) incl Vehicle/Driver day-1; FK đúng (LeaveBalance→LeaveType Restrict + UNIQUE(User,Type,Year); 4× LevelOpinions Cascade(parent)/Restrict(Level)+UNIQUE composite; ItTicket SLA nullable). DB11 FAIL (1 major, fast-follow KHÔNG blocker):LeaveBalance.UsedDays += NumDays@LeaveOtApprovalFeatures.cs:361-386chạy bare SaveChanges (no tx / no RowVersion / READ COMMITTED) → concurrent double-approve lost-update. S43 gap STILL OPEN. Fix-pattern sẵn repo: Serializable tx (codegen:34) HOẶC RowVersion+retry (1 mig). Low-prob ~30 user, recoverable Admin Adjustment. Tag [s56, pre-golive-verify, schema-pass, db11-lostupdate-open]. - S57bis (2026-06-11) — PE gắn Hạng mục design (3rd real spawn, DELIVERED — on-behalf em main ghi hộ, H2-proposed): Introspect LocalDB → design
PurchaseEvaluations.WorkItemId Guid?scalar loose-Guid + IX, KHÔNG FK vật lý — nhất quán convention PE (ProjectId/SelectedSupplierId đều loose; duy nhất ApprovalWorkflowId có FK). Guard = validator + handler mirror S43 FK-invariant. KHÔNG đụng CodeSequences (mã phiếu giữPE/{YYYY}/{A|B}/{Seq}). LEARNED: PE FK-convention map (loose-Guid là norm module này — FK vật lý là exception). SURPRISE: WorkItems = catalog GLOBAL (KHÔNG ProjectId) → 2 dropdown độc lập; "Dự án (năm) – Hạng mục" chỉ là chuỗi ghép hiển thị, không ràng buộc quan hệ. Ship: Mig 49 deploy Run #381 prod-applied. Tag[s57bis, mig49-design, on-behalf].