Files
solution-erp/docs/changelog/sessions/2026-05-30-S42-S43-phase11-p11a-p11b.md
pqhuy1987 197c72f352 [CLAUDE] Docs: S42-S43 close-out — Phase 11 P11-A+P11-B session log + HANDOFF tier + gotcha #56
- Session log S42-S43 (P11-A WorkflowApps ApproveV2 + P11-B LeaveBalance, 8 commit chain)
- HANDOFF tiering: +S43 +S42, trim S40-S38 → session logs
- gotcha #56 CWD-drift stray memory (cd trước spawn → agent ghi nhầm fe-user/.claude, 3× S42-S43)
- STATUS gotchas 55→56
- cicd-monitor MEMORY (Run #367 P11-B verdict)

User memory: +feedback_high_to_max_multiagent_quality (High lọt 2 bug, Max 0 bug; WIRE FE
đọc reference proven + FK-invariant-at-write-doors + Max re-review cross-stack).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-01 12:04:34 +07:00

5.1 KiB
Raw Blame History

Session S42-S43 — 2026-05-30 — Phase 11 P11-A + P11-B (WorkflowApps ApproveV2 + LeaveBalance)

7-agent end-to-end. S42 P11-A wire + Max re-review fix. S43 P11-B LeaveBalance. Agents upgrade High→Max giữa S42-S43 → chất lượng cải thiện rõ rệt.

Commit chain (8)

SHA Scope Gitea
e7b66cd P11-A wire ApproveV2 + LevelOpinions 4 module + Mig 41 #364 PASS
75df04e P11-A fix 2 bug picker (Max re-review) + SetWorkflow endpoint #365 PASS
e47ef1d ProposalCreatePage workflow dropdown shape (latent S37 bug, chip task) (range)
ffb2062+0db5e1f Docs STATUS reconcile P11-A CI-skip
82d7fcf P11-B LeaveBalance + Mig 42 #367 PASS
efc5f5f Docs STATUS P11-B CI-skip

S42 — P11-A: wire ApproveV2 + LevelOpinions 4 WorkflowApps module

Reference: Proposal (Mig 38) = mirror 1:1 (cùng namespace Office, cùng WorkflowAppStatus 5-state) — tốt hơn PE/Contract.

Schema (Mig 41 WireWorkflowAppsApprovalV2): +4 {Leave,Ot,Travel,Vehicle}LevelOpinions (UNIQUE composite + Cascade parent + Restrict Level) + WorkflowAppCodeSequences (shared atomic MaDonTu — gộp P11-F cho 4 module) + 4 cột RejectedFromStatus + enum TravelRequest=9. 84→89 tables.

BE: 30 handler (GetById/Update/Submit/Approve-UPSERT-advance/Reject/Return) × 4 module + 8 controller route + seed 4 WF mẫu (QT-NP/OT/CT/XE-V2-001, AppType 5/6/7/9). ItTicket KHÔNG đụng (kanban).

FE: WorkflowAppDetailPage.tsx declarative 4-kind (admin+user SHA256 identical) — status + opinion timeline + Submit/Approve/Reject/Return.

⚠️ Max re-review phát hiện 2 BUG FE picker (agents chạy High để lọt):

  1. pinWorkflow PUT /{id} chỉ gửi {approvalWorkflowId} → UpdateDraft validator (Reason/NumDays) fail → 400.
  2. fetch workflow expect flat array nhưng endpoint trả AwAdminOverviewDto {types:[...]} → picker rỗng/crash. Agent copy nhầm pattern hỏng ProposalCreatePage thay vì proven PE/Contract. Fix: dedicated endpoint PUT /{id}/workflow (set workflow only, verify ApplicableType) + fetch mirror data.types.find(t=>applicableType===X)?.history.filter(isUserSelectable). Bonus: ProposalCreatePage có bug #2 có sẵn từ S37 (latent) → chip task e47ef1d.

Test: +11 ApproveV2 + +3 SetWorkflow. Auth-verified prod dropdown shape thật.

S43 — P11-B: LeaveBalance business logic

Decision (anh main chốt): (1) số dư không đủ → cho phép + cảnh báo (âm OK) · (2) FE tích hợp trang đơn nghỉ (không trang riêng).

Schema (Mig 42 AddLeaveBalances): LeaveBalances (User×LeaveType×Year + Entitled/Used/Adjustment, UNIQUE composite + FK LeaveTypes Restrict, decimal 5,2). Remaining = Entitled+AdjustmentUsed (computed). 90→91 tables.

Trừ phép: hook ApproveLeaveRequestHandler nhánh terminal DaDuyet — exactly-once (guard Status!=DaGuiDuyet chặn re-approve), upsert auto-create từ DaysPerYear, UsedDays+=NumDays, Year=StartDate.Year.

FK invariant guard (em Max-review thêm sau test reveal): Create + UpdateDraft validate LeaveTypeId tồn tại → ConflictException. Đóng cửa hẳn (grep xác nhận 2 write site duy nhất) → bogus type không thể tới deduction FK insert (tránh 500 kẹt đơn).

CQRS: GetMy (self lazy-merge active LeaveType) + GetUser (admin) + Adjust (admin upsert). Embed balance NGƯỜI TẠO vào leave detail DTO (approver xem đúng — KHÔNG dùng /my = viewer).

FE: block "Số dư phép" + cảnh báo vượt (kind=leave, SHA256 identical).

Test: +11 (deduction single/multi-level/accumulate/negative/reject-return-no-deduct + lazy-merge + adjust + Create guard) + repair 2 template terminal FK-fail. 130→154 PASS.

Lessons (→ gotcha/memory)

  • High→Max upgrade tác động lớn: P11-A High → truncate 3× + lọt 2 FE bug + 1 sai run-id. P11-B Max → 0 truncate, test-specialist tự tìm FK risk, reviewer thorough no-truncate, 0 bug lọt. → memory feedback_high_to_max_multiagent_quality.
  • WIRE FE phải đọc reference proven (không đoán): 2 bug P11-A do agent đoán endpoint/shape. Brief FE agent BẮT BUỘC chỉ file reference proven cụ thể.
  • FK-invariant-at-write-doors pattern: thêm deduction/insert có FK → enforce FK validity tại MỌI write door (Create+Update), không assume. Test reveal gap.
  • Gotcha #56 CWD-drift stray memory: cd trước spawn → agent ghi MEMORY nhầm fe-user/.claude. 3× recover.

State cuối

42 mig · 91 tables · ~241 endpoint · 67 FE page · 154 test · 56 gotcha · bundle Krjvg_3j/6sNStgxa. Phase 11: P11-A + P11-B DONE. Next: P11-C..F.

Carry-over (chưa đụng)

  • M docs/governance/BROADCAST-OUT-...-2026-05-29.md + ?? .mcp.json (untracked) — anh main quyết (từ S40).
  • RAG solution_erp last_indexed S41 (2407 chunks) — S42-S43 content chưa index, stopgap store_memory. Flag AI_INFRA re-index.
  • cicd flag: skill iis-deploy-runbook IIS path stale · .claude/agent-memory/**/*.md không trong paths-ignore (memory commit trigger CI).