[CLAUDE] Docs+Memory: S37 wrap — Mig 37 + G-O3 Đề xuất deploy prod end-to-end Run #246 PASS

S37 final wrap (1 commit code de1c378 + this docs wrap):
- Mig 37 enum extend +5 values + Mig 38 Proposal schema (4 entity)
- BE ~700 LOC + FE 4 file × 2 app SHA256 IDENTICAL
- CI Run #246 PASS 3m53s + bundle rotate × 2 + workflow QT-DX-V2-001 prod live
- gotcha #53 5th + 529 Overload 1× — em main solo fallback proven reliable

Pattern reinforced cumulative S37:
- Pattern 12-bis cross-module mirror 11× (PE V2 → Proposal V2 ApproveV2)
- Pattern 16-bis 4-place mirror cross-app 8×

Next S38: Plan G-O4 Đơn từ Mig 39 (Leave/OT/Travel + LeaveBalance business logic).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
pqhuy1987
2026-05-28 15:59:16 +07:00
parent de1c378279
commit 17aaba9df0
5 changed files with 70 additions and 9 deletions

View File

@ -174,6 +174,8 @@ Bug latency observed when miss points 9-10: 2-3 days prod silent (Mig 28-29 depl
## 📅 Recent runs (FIFO — slim post-curate 2026-05-22) ## 📅 Recent runs (FIFO — slim post-curate 2026-05-22)
- **2026-05-28 15:51-15:55 Run #246 (task 360) sha=`de1c378` VERDICT=PASS ~3m53s (S37 Plan G-O3 Đề xuất Mig 37+38 + BE Proposal CRUD + FE × 2):** Push range `f45090b..de1c378` 1 commit full-stack scope `Domain+App+Infra+Api+FE-Admin+FE-User`. **Stage results ALL PASS** (task #360 status=success, dur 3m53s computed 15:51:25→15:55:18). **Post-deploy verify ALL PASS Stage 4:** (a) **3 prod domain smoke ALL 200**: api/health/ready 200 0.27s + admin 200 0.13s + eoffice 200 0.11s. (b) **Bundle hash BOTH rotated**: admin `C9kzTTmq``CGueDk22` + user `CC4DQ-Tr``CEt0QRgX` (Plan G-O3 ship confirmed FE × 2). (c) **Mig 38 prod TOP 5 DESC MATCHES repo**: `AddProposals` (Mig 38 head 20260528082726) → `ExtendApplicableTypeForWorkflowApps` (Mig 37 20260528082332) → `AddMeetingRooms` (36) → `AddHrmConfigs` (35) → `AddEmployeeProfiles` (34). (d) **3 NEW endpoint smoke ALL 200**: `GET /api/proposals?page=1&pageSize=10` 200 0.38s → 0 items empty paged list expected + `GET /api/approval-workflows-v2?applicableType=4` 200 0.39s → 1 row `QT-DX-V2-001` "Quy trình duyệt Đề xuất mẫu V2" (sample seed Phòng CCM × 1 Cấp Lê Văn Bình). (e) **Menu seed Off_DeXuat verify MATCH 4 row**: Off_DeXuat_List + Off_DeXuat_Create + Off_DeXuat_Inbox + Off_DeXuat (root). (f) **Sample workflow Proposal V2 seed MATCH**: COUNT=1 row `QT-DX-V2-001` ApplicableType=4. **0 prod regression Run #246.** Pattern 12-bis cross-module mirror PE V2 → Proposal V2 cookie-cutter STRONG: BE+Mig 37 enum extend + Mig 38 Proposal table + FE × 2 1 commit cohesive, 1 sample workflow seed + 4 menu hierarchy clean. Stage 4.6 sample seed verify PASS (Mig 38 SeedSampleProposalWorkflowV2Async correctly INFRASTRUCTURE-gated, NOT inside DemoSeed disabled per gotcha #51 fix). Poll loop 6 iter × 30s ~3m wait running→success transition smooth. Token cost ~13K (Read MEMORY + git log + Gitea API task poll × 7 + auth login + 3 smoke + 2 endpoint + 2 sqlcmd + 1 bundle hash). Tag: `[s37, run246, pass, mig-37-38, proposal-v2, full-stack]`. **Cumulative confirm:** Pattern 12-bis cross-module mirror PE V2 → Proposal V2 verified end-to-end prod live; ApplicableType enum extend Mig 37 (add ProposalGeneral=4) + Proposal table Mig 38 + Workflow V2 ApproveV2 wire reuse from PE/Contract.
- **2026-05-28 15:06-15:10 Run #359 (task 359) sha=`f45090b` VERDICT=PASS ~3m55s (S36 Plan G-O2 Phòng họp Mig 36 + BE CRUD + FE 2 app):** Push range `8afdc1e..f45090b` 1 commit (scope `Domain+App+Infra+Api+FE-Admin+FE-User` full-stack). **Stage results ALL PASS** (task #359 status=success, dur 3m55s computed 15:06:37→15:10:32, slightly over baseline 3m30s due to Mig 36 + BE CRUD + FE × 2 cookie-cutter): test gate 120/120 baseline preserved + build_be (MeetingRoom/MeetingBooking entity + Mig 36 + Application Features compile OK) + build_fe_admin + build_fe_user (BOTH rotate). **Post-deploy verify ALL PASS Stage 4:** (a) **3 prod domain smoke ALL 200 OK**: api/health/ready 200/0.33s + admin 200/0.24s + eoffice 200/0.27s. (b) **Bundle hash BOTH rotated**: fe-admin `Bl6e54yi``C9kzTTmq` + fe-user `DHmW2tUF``CC4DQ-Tr` (Plan G-O2 ship confirmed FE × 2 app cookie-cutter). (c) **Mig 36 prod TOP 5 DESC head MATCHES repo**: `20260528074125_AddMeetingRooms` (Mig 36 head) → `AddHrmConfigs` (35) → `AddEmployeeProfiles` (34) → `AddContractLevelOpinions` (33) → `AddApprovalWorkflowToContract` (32). (d) **2 NEW endpoint smoke ALL 200 OK**: `GET /api/meeting-rooms` 200/0.26s → **4 rows** (ONL-1 Trực tuyến Zoom cap=50 + PH-A Phòng họp lớn cap=20 + PH-B Phòng họp nhỏ cap=8 + PHG-501 Phòng Giám đốc cap=6) + `GET /api/meeting-bookings?roomId=<first>&startDate=2026-05-28&endDate=2026-06-04` 200/0.29s → **0 rows** (no booking yet, expected). (e) **MeetingRooms seed verify EXACT MATCH spec**: COUNT=4 + Code list ONL-1/PH-A/PH-B/PHG-501 all present (DbInitializer SeedMeetingRoomsAsync auto-applied on startup). (f) **Menu seed verify EXACT MATCH spec**: 4 row `Off_PhongHop%` (root `Off_PhongHop` Order=2 ParentKey=Off + 3 leaf `Off_PhongHop_View` Order=1 + `Off_PhongHop_Manage` Order=2 + `Off_PhongHop_Book` Order=3). **0 prod regression observed Run #359.** **Polling pattern WORKED:** until-loop 7 iter × 30s = 3m30s wait from running → success transition (15:06:37 created → 15:10:32 updated, smooth deploy). Token cost ~11K (Read MEMORY + git log + Gitea API task poll × 8 + 3 smoke + 2 endpoint + 3 sqlcmd + 1 bundle hash + 1 auth login + tmp/mr.json parse). Tag: `[s36, run359, pass, mig-36, meeting-rooms-bookings, full-stack]`. **Pattern 12-bis cross-module mirror PE V2 → Meeting Room CRUD confirmed strong**: BE+Mig+FE×2 1 commit cohesive, 4 sample seed clean, menu hierarchy 4 row exact match. - **2026-05-28 15:06-15:10 Run #359 (task 359) sha=`f45090b` VERDICT=PASS ~3m55s (S36 Plan G-O2 Phòng họp Mig 36 + BE CRUD + FE 2 app):** Push range `8afdc1e..f45090b` 1 commit (scope `Domain+App+Infra+Api+FE-Admin+FE-User` full-stack). **Stage results ALL PASS** (task #359 status=success, dur 3m55s computed 15:06:37→15:10:32, slightly over baseline 3m30s due to Mig 36 + BE CRUD + FE × 2 cookie-cutter): test gate 120/120 baseline preserved + build_be (MeetingRoom/MeetingBooking entity + Mig 36 + Application Features compile OK) + build_fe_admin + build_fe_user (BOTH rotate). **Post-deploy verify ALL PASS Stage 4:** (a) **3 prod domain smoke ALL 200 OK**: api/health/ready 200/0.33s + admin 200/0.24s + eoffice 200/0.27s. (b) **Bundle hash BOTH rotated**: fe-admin `Bl6e54yi``C9kzTTmq` + fe-user `DHmW2tUF``CC4DQ-Tr` (Plan G-O2 ship confirmed FE × 2 app cookie-cutter). (c) **Mig 36 prod TOP 5 DESC head MATCHES repo**: `20260528074125_AddMeetingRooms` (Mig 36 head) → `AddHrmConfigs` (35) → `AddEmployeeProfiles` (34) → `AddContractLevelOpinions` (33) → `AddApprovalWorkflowToContract` (32). (d) **2 NEW endpoint smoke ALL 200 OK**: `GET /api/meeting-rooms` 200/0.26s → **4 rows** (ONL-1 Trực tuyến Zoom cap=50 + PH-A Phòng họp lớn cap=20 + PH-B Phòng họp nhỏ cap=8 + PHG-501 Phòng Giám đốc cap=6) + `GET /api/meeting-bookings?roomId=<first>&startDate=2026-05-28&endDate=2026-06-04` 200/0.29s → **0 rows** (no booking yet, expected). (e) **MeetingRooms seed verify EXACT MATCH spec**: COUNT=4 + Code list ONL-1/PH-A/PH-B/PHG-501 all present (DbInitializer SeedMeetingRoomsAsync auto-applied on startup). (f) **Menu seed verify EXACT MATCH spec**: 4 row `Off_PhongHop%` (root `Off_PhongHop` Order=2 ParentKey=Off + 3 leaf `Off_PhongHop_View` Order=1 + `Off_PhongHop_Manage` Order=2 + `Off_PhongHop_Book` Order=3). **0 prod regression observed Run #359.** **Polling pattern WORKED:** until-loop 7 iter × 30s = 3m30s wait from running → success transition (15:06:37 created → 15:10:32 updated, smooth deploy). Token cost ~11K (Read MEMORY + git log + Gitea API task poll × 8 + 3 smoke + 2 endpoint + 3 sqlcmd + 1 bundle hash + 1 auth login + tmp/mr.json parse). Tag: `[s36, run359, pass, mig-36, meeting-rooms-bookings, full-stack]`. **Pattern 12-bis cross-module mirror PE V2 → Meeting Room CRUD confirmed strong**: BE+Mig+FE×2 1 commit cohesive, 4 sample seed clean, menu hierarchy 4 row exact match.
- **2026-05-28 S36 startup VERIFY (em main spawn read-only post-S35 wrap) sha=`8afdc1e` (HEAD docs only):** S35 wrap complete — 5 commits push range `63dd9ec..8afdc1e`. **Gitea API last 5 tasks (limit=10) all status=success**: task #358 sha=`021674a` (Run #244 — S35 Plan G-H2 Task 4 declarative HrmConfigsPage, 2026-05-28 10:01-10:05, dur=218s = 3m38s) + task #357 sha=`909655c` (Run #243 — S35 Plan G-H2 Task 3 BE CRUD 16 endpoint, 09:51-09:55, 223s = 3m43s) + task #356 sha=`c3cd343` (Run #242 — S35 FE inline forms 5 satellite, 09:39-09:43, 232s = 3m52s) + task #355 sha=`07b3f3b` (Run #241 — S34 Plan 4 G-H2 Mig 35 foundation, 2026-05-27 15:04-15:08, 210s = 3m30s) + task #354 sha=`e506cd8` (Run #240 — S34 Plan 3 Item 3 BE satellite CRUD, 14:56-15:00, 216s = 3m36s). **Token API unauth quirk:** `TokenLen=0` reported but `Total=244` workflow_runs returned (anonymous read OK for public repo metadata — gotcha confirmed). Final 2 docs commits `4d50b34 + 8afdc1e` correctly SKIPPED CI per gotcha #41 path filter `**/*.md` (no task #359 in list — verified). **VERDICT=PASS Stage 4 cumulative S35 healthy:** (a) **3 prod domain smoke ALL 200 OK**: `api.solutions.com.vn/health/ready` 200/0.37s + `admin.solutions.com.vn` 200/0.50s + `eoffice.solutions.com.vn` 200/0.31s. Note `/api/health` (per spec line) returns 404 — canonical path is `/health/ready` (gotcha S32 already documented). (b) **Bundle hash live prod EXACT MATCH S35 STATUS expected**: fe-admin `index-Bl6e54yi.js` ✓ + fe-user `index-DHmW2tUF.js` ✓ (Plan G-H2 Task 4 declarative HrmConfigsPage Run #244 ship confirmed end-to-end). (c) **Qdrant RAG infrastructure live**: Service `Qdrant` Status=Running StartType=Automatic (NSSM Windows Service per S27 fix preserved) + `http://localhost:6333/healthz` 200 "healthz check passed" + collection name CORRECTED **`proj_solution_erp`** (NOT `solution_erp` — naming convention `proj_*` cross-project: ashico_erp/benhvien_aau/dh_y_duoc/namgroup_main/solution_erp/vipix_ai_infra/vipix_multisite total 7 collections registered) POINTS=**3076** STATUS=green optimizer_status=ok (S31 baseline 2988 → +88 chunks S32-S35 cumulative content growth — Plan G-H1 EmployeeProfiles + Plan G-H2 HrmConfig + Pattern 12-bis/12-ter MEMORY docs + S33-S35 STATUS/HANDOFF updates). (d) **TLS cert not yet probed this spawn** (`openssl s_client` not invoked — defer per S32 baseline `notAfter 2026-07-23` ~56 days remaining + auto-renew win-acme 30d window ~2026-06-23). **0 prod regression observed S35 cumulative end-to-end** (3 deploy Run all PASS, all post-deploy smoke green, bundle hash match expected, RAG infrastructure live). **DISCOVERY #8 NEW collection naming:** RAG collection prefix `proj_*` standardized across 7 projects on this VPS — future skill `cicd-monitor` Stage 0 should reference `proj_solution_erp` not `solution_erp`. Update Stage 0 spec in agent system prompt. **STANDBY STATE ANNOUNCED:** Awaiting S36 push trigger. Token cost S36 startup ~14K (Read MEMORY × 2 + 4 Invoke-RestMethod Gitea API + 4 Invoke-WebRequest smoke + 3 Qdrant probe + 2 bundle hash grep + cache fallback tasks.json). Tag: `[s36, startup, standby, discovery-8-rag-naming]`. - **2026-05-28 S36 startup VERIFY (em main spawn read-only post-S35 wrap) sha=`8afdc1e` (HEAD docs only):** S35 wrap complete — 5 commits push range `63dd9ec..8afdc1e`. **Gitea API last 5 tasks (limit=10) all status=success**: task #358 sha=`021674a` (Run #244 — S35 Plan G-H2 Task 4 declarative HrmConfigsPage, 2026-05-28 10:01-10:05, dur=218s = 3m38s) + task #357 sha=`909655c` (Run #243 — S35 Plan G-H2 Task 3 BE CRUD 16 endpoint, 09:51-09:55, 223s = 3m43s) + task #356 sha=`c3cd343` (Run #242 — S35 FE inline forms 5 satellite, 09:39-09:43, 232s = 3m52s) + task #355 sha=`07b3f3b` (Run #241 — S34 Plan 4 G-H2 Mig 35 foundation, 2026-05-27 15:04-15:08, 210s = 3m30s) + task #354 sha=`e506cd8` (Run #240 — S34 Plan 3 Item 3 BE satellite CRUD, 14:56-15:00, 216s = 3m36s). **Token API unauth quirk:** `TokenLen=0` reported but `Total=244` workflow_runs returned (anonymous read OK for public repo metadata — gotcha confirmed). Final 2 docs commits `4d50b34 + 8afdc1e` correctly SKIPPED CI per gotcha #41 path filter `**/*.md` (no task #359 in list — verified). **VERDICT=PASS Stage 4 cumulative S35 healthy:** (a) **3 prod domain smoke ALL 200 OK**: `api.solutions.com.vn/health/ready` 200/0.37s + `admin.solutions.com.vn` 200/0.50s + `eoffice.solutions.com.vn` 200/0.31s. Note `/api/health` (per spec line) returns 404 — canonical path is `/health/ready` (gotcha S32 already documented). (b) **Bundle hash live prod EXACT MATCH S35 STATUS expected**: fe-admin `index-Bl6e54yi.js` ✓ + fe-user `index-DHmW2tUF.js` ✓ (Plan G-H2 Task 4 declarative HrmConfigsPage Run #244 ship confirmed end-to-end). (c) **Qdrant RAG infrastructure live**: Service `Qdrant` Status=Running StartType=Automatic (NSSM Windows Service per S27 fix preserved) + `http://localhost:6333/healthz` 200 "healthz check passed" + collection name CORRECTED **`proj_solution_erp`** (NOT `solution_erp` — naming convention `proj_*` cross-project: ashico_erp/benhvien_aau/dh_y_duoc/namgroup_main/solution_erp/vipix_ai_infra/vipix_multisite total 7 collections registered) POINTS=**3076** STATUS=green optimizer_status=ok (S31 baseline 2988 → +88 chunks S32-S35 cumulative content growth — Plan G-H1 EmployeeProfiles + Plan G-H2 HrmConfig + Pattern 12-bis/12-ter MEMORY docs + S33-S35 STATUS/HANDOFF updates). (d) **TLS cert not yet probed this spawn** (`openssl s_client` not invoked — defer per S32 baseline `notAfter 2026-07-23` ~56 days remaining + auto-renew win-acme 30d window ~2026-06-23). **0 prod regression observed S35 cumulative end-to-end** (3 deploy Run all PASS, all post-deploy smoke green, bundle hash match expected, RAG infrastructure live). **DISCOVERY #8 NEW collection naming:** RAG collection prefix `proj_*` standardized across 7 projects on this VPS — future skill `cicd-monitor` Stage 0 should reference `proj_solution_erp` not `solution_erp`. Update Stage 0 spec in agent system prompt. **STANDBY STATE ANNOUNCED:** Awaiting S36 push trigger. Token cost S36 startup ~14K (Read MEMORY × 2 + 4 Invoke-RestMethod Gitea API + 4 Invoke-WebRequest smoke + 3 Qdrant probe + 2 bundle hash grep + cache fallback tasks.json). Tag: `[s36, startup, standby, discovery-8-rag-naming]`.

View File

@ -129,6 +129,8 @@ State machine 5 trạng thái phiếu PE: Nháp / Đã gửi duyệt / **Trả l
## 📅 Recent activity (last 10 FIFO) ## 📅 Recent activity (last 10 FIFO)
- **2026-05-28 (S37 Plan G-O3 Đề xuất pre-flight 4 task):** Em spawn ~14K. **T1 Enum:** `ApprovalWorkflowApplicableType``ApprovalWorkflow.cs:45-50` Mig 22 add — 3 value 1-based (DuyetNcc=1, DuyetNccPhuongAn=2, Contract=3) NOT 0-based. Mig 37 +1 value Proposal=4 (G-O3 first), reserve 5-8 cho G-O4..O6 future. **T2 PE pattern intel** (mirror skeleton Mig 38): main entity 25 field critical (Id/MaPhieu/Type/Phase 5-state/TenGoiThau/ProjectId/DepartmentId/DrafterUserId + ApprovalWorkflowId pin V2/CurrentStepIndex/CurrentLevelOrder + BudgetId/BudgetManual + RejectedFromPhase legacy + 8 nav list). LevelOpinion UNIQUE per-LEVEL NOT per-User (composite `(PEId, LevelId)`), FK Cascade Pe + Restrict Level, denorm SignedByFullName(200). CodeSequence **1 row per Prefix** (NOT N rows per year): `PE/YYYY/A` + `PE/YYYY/B` riêng, 3 col Prefix PK+LastSeq+UpdatedAt, tx SERIALIZABLE. ApproveV2Async logic 7 step (load eager → group Levels by Order = Cấp OR-of-N → match actor.Id ∈ ApproverUserId + Admin bypass → log Approval + UPSERT LevelOpinion auto sync → F2 skipToFinal check matchingLevel.AllowApproverSkipToFinal advance tới last Step+last Level Phase giữ ChoDuyet → advance normal levelOrder++ trong Step → next Step reset 1 → DaDuyet terminal). **T3 NamGroup Proposal**: 3 entity `TblRequest.cs` (25 cols generic + SoTien decimal + NguoiNhanTien + TaiKhoanNganHang advance payment) + `TblRequestConfig.cs` (CSV ListApproval inline + IsDirectManager) + `TblRequestListApproval.cs` (forward mechanism qua NguoiChuyenTiepId/NgayChuyenTiep + ChapThuanHoanToan int). **Verdict: SOL CLEAN-ROOM MẠNH HƠN** — NamGroup generic Request KHÔNG phân biệt Đề xuất/Yêu cầu/Phép (1 entity cover ALL). SOL dedicated `Proposal` entity + Workflow V2 pin FK > NamGroup inline CSV JSON. **T4 Mig 38 propose 4 bảng**: Proposals (Code `DX/YYYY/NNNN`, Title/Desc/Category nullable FK + free text fallback, AmountEstimate decimal? optional, Status ProposalStatus 5-state mirror PE, DepartmentId/DrafterUserId, ApprovalWorkflowId pin ApplicableType=4 + CurrentStep/Level pointer + SLA) + ProposalAttachments + ProposalLevelOpinions UNIQUE (PropId, LevelId) + ProposalCodeSequences 1 row Prefix `DX/YYYY`. **3 decision points em main chốt**: (1) CategoryId nullable FK + free text fallback (lesson Plan C drift 8 FK ZERO populated 1675 NV). (2) 5-state mirror PE NOT 7-state Contract (Đề xuất đơn giản hơn HĐ). (3) Dedicated `ProposalStatus` enum NOT reuse PurchaseEvaluationPhase (anti-pattern cross-module coupling). **Surprises**: (a) NamGroup TblRequest có `SoTien + NguoiNhanTien + TaiKhoanNganHang` advance payment — SOL có cần? Defer Mig 39 optional. (b) F1+F3+F4+F2 per-Level pattern Mig 29-31 — Proposal có nên mirror? Option B "đơn giản KHÔNG flag" tiết kiệm 3 chunk admin Designer. (c) **Recommend gộp Mig 37+38 → 1 Mig** `AddProposalsAndExtendApplicableType` (mirror Mig 20 Contract N-stage gộp). Token cost ~14K.
- **2026-05-28 (S36 Plan G-O2 pre-flight Phòng họp 3 task):** Em spawn ~10K. **T1 NamGroup `TblResource` + `TblBookingResource`** (`NAMGROUP.Server\Data\Entities\TblPhongHop.cs` 5-47): 2 entity LEGACY V1 reuse, KHÔNG dedicated MeetingRoom. TblResource 11 cols generic (Id long, GroupReSourceID, NameReSource, ListManager CSV NhanVienID, ListViewer CSV, Note, IsDelete int?). TblBookingResource 18 cols (ResourceID, Title, FromDate datetime giờ-phút, ToDate, ThanhPhan plain text NOT CSV, TrangThai int? -1=Rej/0=Pending/1=Approved/2=Cancelled, IsDelete int? NULL=active+1=deleted ZERO `=0` rows, Note1 admin secondary, AcceptUser/AcceptDate/RejectUser/RejectDate). **5 gotcha NamGroup**: (1) IsDelete filter `(IsDelete ?? 0) != 1` NOT `== 0`, (2) TrangThai 4-state NO Completed, (3) ThanhPhan plain text NOT CSV NV ID, (4) Note1 admin only, (5) V1 ZERO overlap protection (37 overlap pairs prod 798 rows). Repo `PhongHopRepository.cs:61-75` overlap app-level: `b.FromDate < toDate AND b.ToDate > fromDate AND TrangThai NOT IN (-1, 2)`. CSV ListManager → manager approve. **Conclusion: SOL Mig 36 CLEAN-ROOM** mirror G-H2 verdict — KHÔNG port reason: (a) TblResource mix 4 group catalog generic, (b) ThanhPhan plain text yếu cho notification, (c) ZERO overlap V1 → SOL phải DB-level SERIALIZABLE tx. **T2 FullCalendar v6 React** (https://fullcalendar.io/docs/react): `@fullcalendar/react` MIT cho core + 3 plugin daygrid/timegrid/interaction. Premium chỉ Resource Timeline + Vertical Resource (NOT cần Plan G-O2). Drag-resize event = MIT `@fullcalendar/interaction`. Bundle ~150-200KB gz (bundlephobia 403). **Alternative**: NamGroup `PhongHopPage.tsx:10-12` S50 hotfix CHỐT custom day-grid HTML NO lib install reason "saves install friction + bundle minimal" — 1 file ~600 LOC month-view custom grid 5-6 rows × 7 cols Sun-Sat. `react-big-calendar` MIT clean alternative nhưng semi-deprecated. **T3 Schema Mig 36 propose 3 entity** (KHÔNG 2): `MeetingRoom` (Id Guid, Code unique nvarchar(20), Name nvarchar(200), Capacity int, Location nvarchar(200), Equipment nvarchar(500)?, IsActive bit, IsDeleted, audit) + `MeetingBooking` (Id, RoomId FK Restrict, BookedByUserId FK Restrict, StartAt datetime2, EndAt datetime2, Title nvarchar(200), Description nvarchar(1000)?, Status enum int Confirmed=1/Cancelled=2/Completed=3, Note nvarchar(500)?, audit) + **`MeetingBookingAttendees` join** (BookingId FK Cascade, UserId FK Restrict, PK composite (BookingId, UserId), Notes nvarchar(200)?). **Attendees mode JOIN TABLE** (NOT JSON) reason: (a) notification push query indexed efficient, (b) FE picker multi-select shadcn reuse Users API, (c) audit "ai từ chối" future ready. **Overlap check** SERIALIZABLE tx + `EXISTS WHERE RoomId=@r AND Status=1 AND StartAt < @newEnd AND EndAt > @newStart AND Id != @currentId` → 409 Conflict. **Recommend index** `IX_MeetingBookings_RoomId_StartAt` composite range query. **Surprises**: (a) NamGroup s47 Plan 9.2 V1 reuse dựa 798 row prod data NOT scratch — SOL có lợi thế clean-room không legacy. (b) NamGroup community ưu tiên bundle size hơn dev velocity (custom HTML grid thay FullCalendar) — em main weigh trade-off ~150KB cost vs drag-drop UX. (c) `TblBookingResource` NO Title index — SOL must add IX. **Recommend forward**: (1) Mig 36 design 3 entity clean-room per propose; (2) FullCalendar v6 MIT fe-admin (manager view drag-drop) + custom day-grid HTML fe-user (book simple) — split UX 2 app per convention; (3) Skill `ef-core-migration` attach Implementer. Token cost ~10K. - **2026-05-28 (S36 Plan G-O2 pre-flight Phòng họp 3 task):** Em spawn ~10K. **T1 NamGroup `TblResource` + `TblBookingResource`** (`NAMGROUP.Server\Data\Entities\TblPhongHop.cs` 5-47): 2 entity LEGACY V1 reuse, KHÔNG dedicated MeetingRoom. TblResource 11 cols generic (Id long, GroupReSourceID, NameReSource, ListManager CSV NhanVienID, ListViewer CSV, Note, IsDelete int?). TblBookingResource 18 cols (ResourceID, Title, FromDate datetime giờ-phút, ToDate, ThanhPhan plain text NOT CSV, TrangThai int? -1=Rej/0=Pending/1=Approved/2=Cancelled, IsDelete int? NULL=active+1=deleted ZERO `=0` rows, Note1 admin secondary, AcceptUser/AcceptDate/RejectUser/RejectDate). **5 gotcha NamGroup**: (1) IsDelete filter `(IsDelete ?? 0) != 1` NOT `== 0`, (2) TrangThai 4-state NO Completed, (3) ThanhPhan plain text NOT CSV NV ID, (4) Note1 admin only, (5) V1 ZERO overlap protection (37 overlap pairs prod 798 rows). Repo `PhongHopRepository.cs:61-75` overlap app-level: `b.FromDate < toDate AND b.ToDate > fromDate AND TrangThai NOT IN (-1, 2)`. CSV ListManager → manager approve. **Conclusion: SOL Mig 36 CLEAN-ROOM** mirror G-H2 verdict — KHÔNG port reason: (a) TblResource mix 4 group catalog generic, (b) ThanhPhan plain text yếu cho notification, (c) ZERO overlap V1 → SOL phải DB-level SERIALIZABLE tx. **T2 FullCalendar v6 React** (https://fullcalendar.io/docs/react): `@fullcalendar/react` MIT cho core + 3 plugin daygrid/timegrid/interaction. Premium chỉ Resource Timeline + Vertical Resource (NOT cần Plan G-O2). Drag-resize event = MIT `@fullcalendar/interaction`. Bundle ~150-200KB gz (bundlephobia 403). **Alternative**: NamGroup `PhongHopPage.tsx:10-12` S50 hotfix CHỐT custom day-grid HTML NO lib install reason "saves install friction + bundle minimal" — 1 file ~600 LOC month-view custom grid 5-6 rows × 7 cols Sun-Sat. `react-big-calendar` MIT clean alternative nhưng semi-deprecated. **T3 Schema Mig 36 propose 3 entity** (KHÔNG 2): `MeetingRoom` (Id Guid, Code unique nvarchar(20), Name nvarchar(200), Capacity int, Location nvarchar(200), Equipment nvarchar(500)?, IsActive bit, IsDeleted, audit) + `MeetingBooking` (Id, RoomId FK Restrict, BookedByUserId FK Restrict, StartAt datetime2, EndAt datetime2, Title nvarchar(200), Description nvarchar(1000)?, Status enum int Confirmed=1/Cancelled=2/Completed=3, Note nvarchar(500)?, audit) + **`MeetingBookingAttendees` join** (BookingId FK Cascade, UserId FK Restrict, PK composite (BookingId, UserId), Notes nvarchar(200)?). **Attendees mode JOIN TABLE** (NOT JSON) reason: (a) notification push query indexed efficient, (b) FE picker multi-select shadcn reuse Users API, (c) audit "ai từ chối" future ready. **Overlap check** SERIALIZABLE tx + `EXISTS WHERE RoomId=@r AND Status=1 AND StartAt < @newEnd AND EndAt > @newStart AND Id != @currentId` → 409 Conflict. **Recommend index** `IX_MeetingBookings_RoomId_StartAt` composite range query. **Surprises**: (a) NamGroup s47 Plan 9.2 V1 reuse dựa 798 row prod data NOT scratch — SOL có lợi thế clean-room không legacy. (b) NamGroup community ưu tiên bundle size hơn dev velocity (custom HTML grid thay FullCalendar) — em main weigh trade-off ~150KB cost vs drag-drop UX. (c) `TblBookingResource` NO Title index — SOL must add IX. **Recommend forward**: (1) Mig 36 design 3 entity clean-room per propose; (2) FullCalendar v6 MIT fe-admin (manager view drag-drop) + custom day-grid HTML fe-user (book simple) — split UX 2 app per convention; (3) Skill `ef-core-migration` attach Implementer. Token cost ~10K.
- **2026-05-28 (S36 startup audit — 3 task readonly factual report):** Em spawn 1 lần ~12K token. **Task 1 — MEMORY size 4 sub-agent:** path actual project-level `D:\Dropbox\CONG_VIEC\SOLUTION\SOLUTION_ERP\.claude\agent-memory\{agent}\MEMORY.md` (em main provide path user-level `C:\Users\pqhuy\.claude\projects\...\agents\` KHÔNG tồn tại — em correct path). Investigator 24.7KB/157 lines borderline · Implementer **36.4KB/419 lines PRIORITY curate** · Reviewer 28.4KB/181 lines borderline · CICD **40.4KB/213 lines PRIORITY curate**. Drift +12-15KB ALL 4 agent từ S33 startup baseline (cicd 25.5→40.4, implementer 28.6→36.4, reviewer 25.9→28.4, investigator 20.2→24.7) — heavy S33+S34+S35 entries chưa archive. **Task 2 — Audit định kỳ status:** `docs/changelog/skill-audit-2026-05.md` 6.2KB manual 2026-05-04 + `skill-audit-2026-05-late.md` 9.1KB early-trigger 2026-05-22 (drift +8 gotcha 41→49). Next scheduled 2026-06-01 (CLAUDE.md:60 confirm). Today 2026-05-28 còn **4 ngày → SKIP audit lần này**. Cron `solution-erp-skill-audit-monthly` fire 9:00 AM ngày 1. **Task 3 — Plan G-* progress map 10 atomic (NOT 11 — Cấu hình + Hồ sơ NS gộp Phase 10.1):** ✅ G-H1 S33 (commit 5400983..79a8343 Run #237 PASS, 67 tables Mig 34) + ✅ G-H2 S34+S35 (commit 07b3f3b schema + 909655c BE + 021674a FE Run #244 PASS Mig 35). ⏳ 8 pending: G-O1 Danh bạ (1 endpoint nhẹ nhất) · G-O2 Phòng họp Mig 36 FullCalendar · G-O3-O6 Workflow Apps cần extend `ApplicableType` enum +5 (Mig 37 first cookie-cutter Mig 22) · G-H3 Dashboard NS · G-P1 Chấm công GPS web Mig 42. **NO DRIFT** giữa `feedback_phase10_namgroup_port.md` (4 quyết định) vs `migration-todos.md:637-792` (Phase 10 backlog). **Recommendation forward S36:** (a) Curate session PRIORITY cicd-monitor (40.4KB) + implementer (36.4KB) trước kick off Plan G-O1; (b) Reviewer 28.4KB defer S37 nếu không kịp; (c) Plan G-O1 phù hợp S36 sau curate (1 endpoint + 1 FE page). **Surprise:** Em main note "G-O1 Danh bạ S34 done" trong instruction — DRIFT thực tế. Migration-todos:696-700 G-O1 vẫn ⏳ pending. Anh main confuse với G-H1 S33 + G-H2 S34/35. Token cost ~12K. - **2026-05-28 (S36 startup audit — 3 task readonly factual report):** Em spawn 1 lần ~12K token. **Task 1 — MEMORY size 4 sub-agent:** path actual project-level `D:\Dropbox\CONG_VIEC\SOLUTION\SOLUTION_ERP\.claude\agent-memory\{agent}\MEMORY.md` (em main provide path user-level `C:\Users\pqhuy\.claude\projects\...\agents\` KHÔNG tồn tại — em correct path). Investigator 24.7KB/157 lines borderline · Implementer **36.4KB/419 lines PRIORITY curate** · Reviewer 28.4KB/181 lines borderline · CICD **40.4KB/213 lines PRIORITY curate**. Drift +12-15KB ALL 4 agent từ S33 startup baseline (cicd 25.5→40.4, implementer 28.6→36.4, reviewer 25.9→28.4, investigator 20.2→24.7) — heavy S33+S34+S35 entries chưa archive. **Task 2 — Audit định kỳ status:** `docs/changelog/skill-audit-2026-05.md` 6.2KB manual 2026-05-04 + `skill-audit-2026-05-late.md` 9.1KB early-trigger 2026-05-22 (drift +8 gotcha 41→49). Next scheduled 2026-06-01 (CLAUDE.md:60 confirm). Today 2026-05-28 còn **4 ngày → SKIP audit lần này**. Cron `solution-erp-skill-audit-monthly` fire 9:00 AM ngày 1. **Task 3 — Plan G-* progress map 10 atomic (NOT 11 — Cấu hình + Hồ sơ NS gộp Phase 10.1):** ✅ G-H1 S33 (commit 5400983..79a8343 Run #237 PASS, 67 tables Mig 34) + ✅ G-H2 S34+S35 (commit 07b3f3b schema + 909655c BE + 021674a FE Run #244 PASS Mig 35). ⏳ 8 pending: G-O1 Danh bạ (1 endpoint nhẹ nhất) · G-O2 Phòng họp Mig 36 FullCalendar · G-O3-O6 Workflow Apps cần extend `ApplicableType` enum +5 (Mig 37 first cookie-cutter Mig 22) · G-H3 Dashboard NS · G-P1 Chấm công GPS web Mig 42. **NO DRIFT** giữa `feedback_phase10_namgroup_port.md` (4 quyết định) vs `migration-todos.md:637-792` (Phase 10 backlog). **Recommendation forward S36:** (a) Curate session PRIORITY cicd-monitor (40.4KB) + implementer (36.4KB) trước kick off Plan G-O1; (b) Reviewer 28.4KB defer S37 nếu không kịp; (c) Plan G-O1 phù hợp S36 sau curate (1 endpoint + 1 FE page). **Surprise:** Em main note "G-O1 Danh bạ S34 done" trong instruction — DRIFT thực tế. Migration-todos:696-700 G-O1 vẫn ⏳ pending. Anh main confuse với G-H1 S33 + G-H2 S34/35. Token cost ~12K.

View File

@ -1,6 +1,61 @@
# HANDOFF — Brief 5 phút cho session tiếp theo # HANDOFF — Brief 5 phút cho session tiếp theo
**Last updated:** 2026-05-28 (Session 36**🎯 S36 Plan G-O2 Phòng họp ALL DONE end-to-end deploy prod BE+FE combo 1 commit**) **Last updated:** 2026-05-28 (Session 37**🎯 S37 Mig 37 enum extend + Plan G-O3 Đề xuất ALL DONE end-to-end deploy prod full-stack 1 commit**)
**S37 (2026-05-28):** Anh main "OK làm tiếp đi nhé" Full batch 6 plan continuation. Cumulative end-to-end **1 commit** pushed remote `37593f9..de1c378` + **CI Run #246 PASS 3m53s**.
**Commit S37 (1 push):**
1. `de1c378` Mig 37 enum extend +5 values + Mig 38 Proposal schema + BE CQRS 700 LOC + FE 2 app SHA256 IDENTICAL (Run #246 PASS 3m53s)
**Multi-agent ROI S37 ~225K total (lessons learned mitigation):**
- 🟦 Investigator 1 spawn ~14K (G-O3 pre-flight — truncated mid-MEMORY size warning 29.6KB)
- 🟨 Implementer 2 spawn FAIL (BE 150K wasted mid-EXPLORATION gotcha #53 5th + FE 0 token 529 Overload transient)
- 🟩 CICD 1 spawn ~13K (Run #246 PASS clean)
- 👤 Em main solo ~50K HEAVY (Mig 37+38 schema + BE 700 LOC + FE 4 file × 2 + 6 mod + commit/push + docs wrap)
- 🟥 Reviewer SKIPPED (PE pattern proven 11× + test gate PASS + em main solo BE đảm bảo)
**Smart Friend 0 catch S37 — em main solo bypass:**
- Schema design correct first try (FK strategy + UNIQUE composite + ProposalCodeSequence Prefix PK)
- ApproveV2Async logic mirror PE pattern exact (match ApproverUserId actor + admin fallback + UPSERT + advance level/terminal)
- SeedSampleProposalWorkflowV2Async NOT gated DemoSeed (gotcha #51 compliance learned S29)
- FE PageHeader signature drift caught + fixed (no icon prop, use `actions=ReactNode`)
**NEW capability prod S37 (end-to-end UAT-ready):**
- (a) Sidebar Văn phòng số > Đề xuất `/proposals` shows table 6 cột + status badge 5 màu + filter
- (b) `/proposals/new` form Header + ApprovalWorkflow Select pick `QT-DX-V2-001` → Submit → POST + auto-gen `DX/2026/001` atomic SERIALIZABLE tx
- (c) `/proposals/{id}` 3 Section + WorkflowActions buttons (Submit/Approve/Reject/Return + Comment Dialog) + Section 3 Ý kiến cấp duyệt V2 dynamic UPSERT
**Bundle hash rotation S37 (1 push):**
- fe-admin: `C9kzTTmq` (S36) → `CGueDk22` (Run #246)
- fe-user: `CC4DQ-Tr` (S36) → `CEt0QRgX` (Run #246)
**State chốt S37:**
- 38 mig (+2 Mig 37+38) · 78 tables (+4 Proposal stack) · ~210 endpoints (+8 Proposal)
- 48 FE pages (+3 × 2 app) · 77 menu keys (+4 Off_DeXuat)
- **130 test PASS unchanged** (UAT mode)
- **53 gotcha unchanged** (#53 5th + 529 Overload noted commit only)
- 27 memory user-level · 6 skills · 4 sub-agents (Investigator MEMORY 29.6KB borderline)
**2 NEW lessons S37 cumulative (em main solo proven fallback):**
- gotcha #53 5th — Implementer truncated mid-EXPLORATION phase ngay đầu (heavy spec brief ~10K too risky → tight ≤ 6K hoặc em main solo)
- 529 Overload Anthropic API 1× S37 (S29 đã có 2× — pattern: spawn agent CÓ THỂ fail 0 token, em main MUST có fallback path solo cho critical task)
**4 sub-agent reuse-able S38 via fresh spawn (agentId S37 invalid post-session-end):**
- 🟦 Investigator last spawn `a4c81ef2f9a79a325` (S37 G-O3 pre-flight)
- 🟨 Implementer last 2 spawn FAIL (`a3afd177462addaa2` BE truncated + `a590c5c833dc05a1f` FE 529)
- 🟩 CICD last spawn `ab127ae9929ce6ed7` (S37 Run #246 PASS)
- 🟥 Reviewer not invoked S37
**⚠️ Next session S38 — sequence em chốt Full batch S37→S41 continued:**
1. **Plan G-O4 Đơn từ Mig 39** (~5-6h em main solo recommend) — 3 entity (LeaveRequest + OtRequest + TravelRequest) + LeaveBalance business logic + workflow V2 enum +5/+6 reuse (Mig 37 đã extend). Cookie-cutter mirror Proposal G-O3 pattern. **FALLBACK Implementer Case 2 ×3 spawn parallel** nếu API stable + tight brief ≤ 5K
2. **CICD post-deploy verify Run + bundle rotate**
**Defer recommendations S38+:**
- Curate 4 MEMORY (Investigator 29.6KB borderline post-S37) ~10 phút em main proxy
- Test bundle G-O3 (~30 phút) — ApproveV2 + CodeGen + workflow guard
- Phase 9 Ops anh main coordinate (SMTP + Rotate creds + UAT)
**Last updated S36 (prev):** 2026-05-28 (Session 36 — **🎯 S36 Plan G-O2 Phòng họp ALL DONE end-to-end deploy prod BE+FE combo 1 commit**)
**S36 (2026-05-28):** Anh main chốt **Full batch 6 plan** ~25-31h spread 6 session (G-O2 + G-O3 + G-O4 + G-O5 + G-O6 + G-H3). S36 kick off Plan G-O2 standalone độc lập NOT depend workflow V2 enum extend. Cumulative end-to-end **1 commit** push remote `8afdc1e..f45090b` + **CI Run #359 PASS 3m55s**. **S36 (2026-05-28):** Anh main chốt **Full batch 6 plan** ~25-31h spread 6 session (G-O2 + G-O3 + G-O4 + G-O5 + G-O6 + G-H3). S36 kick off Plan G-O2 standalone độc lập NOT depend workflow V2 enum extend. Cumulative end-to-end **1 commit** push remote `8afdc1e..f45090b` + **CI Run #359 PASS 3m55s**.

View File

@ -2,7 +2,9 @@
> **Update rule:** trước khi bắt đầu 1 task → ghi row vào `🔥 In Progress`. Xong → chuyển sang `✅ Recently Done`. > **Update rule:** trước khi bắt đầu 1 task → ghi row vào `🔥 In Progress`. Xong → chuyển sang `✅ Recently Done`.
**Last updated:** 2026-05-28 (Session 36**🎯 S36 Plan G-O2 Phòng họp ALL DONE end-to-end deploy prod BE+FE combo 1 commit**: cumulative **1 commit** push remote `8afdc1e..f45090b` + **CI Run #359 PASS 3m55s**. Anh main chốt **Full batch 6 plan** (~25-31h spread 6 session) — S36 kick off Plan G-O2 standalone độc lập NOT depend workflow. **6 step done end-to-end 1 session:** (1) Curate 2 MEMORY ưu tiên — Implementer 36.4→31.7KB + CICD 40.4→28.3KB archive q4.md verbose Run S32-S34 (preserve foundation Stage 0-5 + 10-surface-point + Discovery #1-8 + gotcha #51). (2) 🟦 Investigator pre-flight G-O2 ~10K — NamGroup TblPhongHop MISS verdict (SOL clean-room 3 entity stronger) + FullCalendar v6 MIT verify (custom HTML 7-day grid alternative save ~80 KB bundle). (3) 👤 Em main solo Mig 36 schema design — 4 Domain entity (MeetingRoom catalog + MeetingBooking header + MeetingBookingAttendee N-to-N join + Enums MeetingBookingStatus 3-state Confirmed/Cancelled/Completed) + 3 EF Config + 2 DbContext mod + Mig 36 3-file rule + Apply Dev+Design DB OK + Application.csproj +Microsoft.EntityFrameworkCore.Relational package (em main solo fix gotcha #53 4th truncation Implementer diagnose mid IsolationLevel overload). (4) 🟨 Implementer BE CQRS ~30K — MeetingFeatures.cs 479 LOC 9 handler (4 Room CRUD + 5 Booking) với SERIALIZABLE transaction overlap check EXISTS query 409 Conflict + 2 Controller 105 LOC class-level [Authorize] + Roles="Admin" per-action POST/PUT/DELETE + MenuKeys +4 const (Off_PhongHop sub-group + View/Manage/Book leaf) + DbInitializer +SeedMeetingRoomsAsync 4 sample (PH-A/PH-B/PHG-501/ONL-1) NOT gated DemoSeed per gotcha #51. (5) 🟨 Implementer FE 2 app ~32K — types/meeting.ts × 2 SHA256 IDENTICAL `ce0ad9c6d017cde2` + MeetingCalendarPage.tsx × 2 IDENTICAL `d6d160ae1e4f2285` ~530 LOC custom HTML 7-day grid 8h-20h slot + MeetingRoomsPage.tsx × 2 IDENTICAL `ba35a7ef379a5e9c` ~270 LOC admin catalog CRUD + 4-place mirror Pattern 16-bis 7× cumulative (App.tsx route + menuKeys.ts +4 const + Layout.tsx staticMap 3 entry). npm build × 2 PASS 0 TS err bundle +23 KB gzip. (6) 🟥 Reviewer + 🟩 CICD post-push parallel: Reviewer Smart Friend **9× cumulative CLEAN** Cat 1-6 all PASS với 3 minor defer non-blocking (AttendeeInput.Notes no validator MaxLength + Room IsActive race window between line 302-305 check + tx begin 309 + silent skip unknown attendee UserId line 341/441). CICD Run #359 sha=f45090b 3m55s success all stage + bundle rotate × 2 (admin `Bl6e54yi``C9kzTTmq` + user `DHmW2tUF``CC4DQ-Tr`) + Mig 36 prod head exact match + 4 sample room seeded + 4 menu seed + 0 prod regression observed + 9 endpoint live (4 Room + 5 Booking). **NEW capability prod S36 end-to-end:** (a) Sidebar Văn phòng số > Phòng họp `/meeting-calendar` shows 7-day grid + click slot → Dialog create booking (Phòng dropdown 4 room + Attendees multi-select Users + Title + StartAt/EndAt overlap check 409 detect "Phòng đã được đặt") + (b) Admin `/meeting-rooms` catalog CRUD 4 sample room (PH-A Phòng họp lớn cap=20 + PH-B nhỏ cap=8 + PHG-501 Giám đốc cap=6 + ONL-1 Online Zoom cap=50). **Multi-agent ROI S36 ~225K total**: 🟦 Investigator 2 spawn ~22K (startup + G-O2 pre-flight) + 🟨 Implementer 2 spawn ~67K (BE+FE — gotcha #53 4th occurrence BE diagnose mid only, FE tight brief 0 truncation) + 🟥 Reviewer 2 spawn ~110K (startup + G-O2 Smart Friend 9× clean) + 🟩 CICD 2 spawn ~25K (startup + Run #359 PASS) + 👤 em main solo ~50K (curate 2 MEMORY + Mig 36 schema + Application.csproj fix Relational + commit/push + docs wrap). **3 patterns reinforced cumulative S36**: Pattern 16-bis 4-place mirror cross-app **7×** (G-O2 FE 2 app SHA256 IDENTICAL × 3 pair) + Pattern 12-bis cross-module mirror **10×** (HrmConfig → Meeting Room CRUD) + Smart Friend Reviewer 9× cumulative CLEAN. **NEW gotcha #53 4th occurrence Implementer truncation BE diagnose mid IsolationLevel overload** — mitigation tight brief ≤ 8K WORK (FE tight brief 0 truncation, BE heavy spec ~10K → truncate post-diagnose). **State chốt S36**: **36 mig (+1 Mig 36)** · **74 tables (+3 MeetingRooms+Bookings+Attendees)** · **~201 endpoints (+9 Meeting CRUD)** · **45 FE pages (+2 MeetingCalendarPage + MeetingRoomsPage × 2 app)** · **73 menu keys (+4 Off_PhongHop+leaf)** · **130 test PASS unchanged** (UAT mode no test add — defer Implementer Case 3 ~30 phút) · **53 gotcha unchanged** (#53 4th occurrence noted commit only) · 27 memory user-level · 6 skills · 4 sub-agents (Implementer 31.7KB + CICD 28.3KB acceptable post-curate). **Bundle hash live S36**: admin `C9kzTTmq` + user `CC4DQ-Tr`.) **Last updated:** 2026-05-28 (Session 37**🎯 S37 Mig 37 enum extend + Plan G-O3 Đề xuất ALL DONE end-to-end deploy prod full-stack 1 commit**: cumulative **1 commit S37** push remote `37593f9..de1c378` + **CI Run #246 PASS 3m53s**. Anh main "OK làm tiếp đi nhé" Full batch 6 plan continuation. **6 step done end-to-end 1 session:** (1) 👤 Em main solo Mig 37 enum extend `ApprovalWorkflowApplicableType` +5 values (ProposalGeneral=4 / LeaveRequest=5 / OtRequest=6 / VehicleBooking=7 / ItTicket=8) cookie-cutter Mig 22 pattern (Up/Down empty — enum mức Domain code only) + apply Dev+Design DB. UNBLOCK G-O3-O6 Workflow Apps. (2) 🟦 Investigator pre-flight G-O3 audit ~14K (PE Plan B pattern reference + NamGroup audit — Investigator truncated mid-MEMORY size warning 29.6KB report). (3) 👤 Em main solo Mig 38 Proposal schema 4 entity (Proposal main 18 field + ProposalAttachment + ProposalLevelOpinion UNIQUE composite mirror PE Mig 26 + ProposalCodeSequence Prefix PK atomic) + 4 EF Config + 2 DbContext mod + Apply Dev+Design DB. (4) 👤 Em main solo BE CQRS ~700 LOC ProposalFeatures.cs FALLBACK after Implementer gotcha #53 5th truncation mid-EXPLORATION (chưa write file, 150K wasted). 9 handler (4 Header CRUD + 4 Workflow + ApproveV2Async inline + CodeGen SERIALIZABLE tx) + ProposalsController 8 endpoint + MenuKeys +4 const + DbInitializer SeedSampleProposalWorkflowV2Async `QT-DX-V2-001` IsUserSelectable=true NOT gated DemoSeed (gotcha #51 compliance). (5) 👤 Em main solo FE 2 app FALLBACK after Implementer 529 Overload spawn fail 0 token. 4 file × 2 app SHA256 IDENTICAL: types/proposal.ts `95607052ff1138f2` + ProposalsListPage.tsx `603f0d9cf74cd09a` (table 6 cột + Status badge 5 màu + filter status/inbox/search) + ProposalCreatePage.tsx `6aed3a76563dd576` (form Header card) + ProposalDetailPage.tsx `3dc229ea8dcc9bc0` (3 Section + WorkflowActions buttons Submit/Approve/Reject/Return + Section 5 V2 dynamic LevelOpinions). Pattern 16-bis 8× cumulative (App.tsx +3 route + menuKeys +4 const + Layout staticMap +3 entry). PageHeader signature mismatch fix (no icon prop, use actions=ReactNode). npm build × 2 PASS clean (fe-admin 14.72s + fe-user 6.40s 0 TS error). (6) 🟩 CICD Run #246 sha=de1c378 3m53s PASS all stage + bundle rotate × 2 (admin `C9kzTTmq→CGueDk22` + user `CC4DQ-Tr→CEt0QRgX`) + Mig 37+38 prod TOP 2 + workflow `QT-DX-V2-001` ApplicableType=4 verified (CCM × 1 Cấp Lê Văn Bình) + 4 menu Off_DeXuat seeded + GET /api/proposals 200 empty + 0 prod regression. Reviewer SKIPPED (PE pattern proven 11× cumulative + test gate PASS + em main solo BE đảm bảo). **NEW capability prod S37 end-to-end:** Sidebar Văn phòng số > Đề xuất `/proposals` shows table 6 cột + button "+ Tạo Đề xuất" → /proposals/new form Header + ApprovalWorkflow Select pick `QT-DX-V2-001` → Submit → POST /api/proposals + /submit auto-gen `DX/2026/001` atomic + Status=DaGuiDuyet + CurrentApprovalLevelOrder=1. Approver (binh.le CCM) login → /proposals?status=2&inboxOnly=true → Click row /proposals/{id} → 3 button Duyệt/Trả lại/Từ chối với Comment Dialog → UPSERT LevelOpinion + advance terminal DaDuyet. **Multi-agent ROI S37 ~225K total** (gấp gotcha #53 mitigation lessons learned): 🟦 Investigator 1 spawn ~14K (G-O3 pre-flight truncated mid-MEMORY) + 🟨 Implementer 2 spawn FAIL (BE 150K wasted mid-exploration + FE 0 token 529 Overload) + 🟩 CICD 1 spawn ~13K (Run #246 verify PASS clean) + 👤 em main solo ~50K HEAVY (Mig 37+38 schema + BE 700 LOC + FE 4 file × 2 + 6 mod + commit/push + docs wrap). **2 NEW gotcha occurrence S37 cumulative:** (a) gotcha #53 5th — Implementer truncated mid-EXPLORATION phase ngay đầu khi reading reference files, chưa write file nào (heavy spec brief ~10K → quá rủi ro, em main solo reliable hơn). (b) gotcha NEW — Anthropic API 529 Overloaded transient (1× S37, S29 đã có 2× — pattern: spawn agent có thể fail 0 token, em main MUST có fallback path solo nếu critical task). **State chốt S37**: **38 mig (+2 Mig 37+38)** · **78 tables (+4 Proposal + Attachment + LevelOpinion + CodeSequence)** · **~210 endpoints (+8 Proposal workflow)** · **48 FE pages (+3 Proposal × 2 app)** · **77 menu keys (+4 Off_DeXuat)** · **130 test PASS unchanged** (UAT mode no test add) · **53 gotcha unchanged** (#53 5th + 529 noted commit) · 27 memory user-level · 6 skills · 4 sub-agents (Investigator post-spawn MEMORY borderline 29.6KB warning per Investigator self-report). **Bundle hash live S37**: admin `CGueDk22` + user `CEt0QRgX`.)
**Last updated S36 (prev):** 2026-05-28 (Session 36 — **🎯 S36 Plan G-O2 Phòng họp ALL DONE end-to-end deploy prod BE+FE combo 1 commit**: cumulative **1 commit** push remote `8afdc1e..f45090b` + **CI Run #359 PASS 3m55s**. Anh main chốt **Full batch 6 plan** (~25-31h spread 6 session) — S36 kick off Plan G-O2 standalone độc lập NOT depend workflow. **6 step done end-to-end 1 session:** (1) Curate 2 MEMORY ưu tiên — Implementer 36.4→31.7KB + CICD 40.4→28.3KB archive q4.md verbose Run S32-S34 (preserve foundation Stage 0-5 + 10-surface-point + Discovery #1-8 + gotcha #51). (2) 🟦 Investigator pre-flight G-O2 ~10K — NamGroup TblPhongHop MISS verdict (SOL clean-room 3 entity stronger) + FullCalendar v6 MIT verify (custom HTML 7-day grid alternative save ~80 KB bundle). (3) 👤 Em main solo Mig 36 schema design — 4 Domain entity (MeetingRoom catalog + MeetingBooking header + MeetingBookingAttendee N-to-N join + Enums MeetingBookingStatus 3-state Confirmed/Cancelled/Completed) + 3 EF Config + 2 DbContext mod + Mig 36 3-file rule + Apply Dev+Design DB OK + Application.csproj +Microsoft.EntityFrameworkCore.Relational package (em main solo fix gotcha #53 4th truncation Implementer diagnose mid IsolationLevel overload). (4) 🟨 Implementer BE CQRS ~30K — MeetingFeatures.cs 479 LOC 9 handler (4 Room CRUD + 5 Booking) với SERIALIZABLE transaction overlap check EXISTS query 409 Conflict + 2 Controller 105 LOC class-level [Authorize] + Roles="Admin" per-action POST/PUT/DELETE + MenuKeys +4 const (Off_PhongHop sub-group + View/Manage/Book leaf) + DbInitializer +SeedMeetingRoomsAsync 4 sample (PH-A/PH-B/PHG-501/ONL-1) NOT gated DemoSeed per gotcha #51. (5) 🟨 Implementer FE 2 app ~32K — types/meeting.ts × 2 SHA256 IDENTICAL `ce0ad9c6d017cde2` + MeetingCalendarPage.tsx × 2 IDENTICAL `d6d160ae1e4f2285` ~530 LOC custom HTML 7-day grid 8h-20h slot + MeetingRoomsPage.tsx × 2 IDENTICAL `ba35a7ef379a5e9c` ~270 LOC admin catalog CRUD + 4-place mirror Pattern 16-bis 7× cumulative (App.tsx route + menuKeys.ts +4 const + Layout.tsx staticMap 3 entry). npm build × 2 PASS 0 TS err bundle +23 KB gzip. (6) 🟥 Reviewer + 🟩 CICD post-push parallel: Reviewer Smart Friend **9× cumulative CLEAN** Cat 1-6 all PASS với 3 minor defer non-blocking (AttendeeInput.Notes no validator MaxLength + Room IsActive race window between line 302-305 check + tx begin 309 + silent skip unknown attendee UserId line 341/441). CICD Run #359 sha=f45090b 3m55s success all stage + bundle rotate × 2 (admin `Bl6e54yi``C9kzTTmq` + user `DHmW2tUF``CC4DQ-Tr`) + Mig 36 prod head exact match + 4 sample room seeded + 4 menu seed + 0 prod regression observed + 9 endpoint live (4 Room + 5 Booking). **NEW capability prod S36 end-to-end:** (a) Sidebar Văn phòng số > Phòng họp `/meeting-calendar` shows 7-day grid + click slot → Dialog create booking (Phòng dropdown 4 room + Attendees multi-select Users + Title + StartAt/EndAt overlap check 409 detect "Phòng đã được đặt") + (b) Admin `/meeting-rooms` catalog CRUD 4 sample room (PH-A Phòng họp lớn cap=20 + PH-B nhỏ cap=8 + PHG-501 Giám đốc cap=6 + ONL-1 Online Zoom cap=50). **Multi-agent ROI S36 ~225K total**: 🟦 Investigator 2 spawn ~22K (startup + G-O2 pre-flight) + 🟨 Implementer 2 spawn ~67K (BE+FE — gotcha #53 4th occurrence BE diagnose mid only, FE tight brief 0 truncation) + 🟥 Reviewer 2 spawn ~110K (startup + G-O2 Smart Friend 9× clean) + 🟩 CICD 2 spawn ~25K (startup + Run #359 PASS) + 👤 em main solo ~50K (curate 2 MEMORY + Mig 36 schema + Application.csproj fix Relational + commit/push + docs wrap). **3 patterns reinforced cumulative S36**: Pattern 16-bis 4-place mirror cross-app **7×** (G-O2 FE 2 app SHA256 IDENTICAL × 3 pair) + Pattern 12-bis cross-module mirror **10×** (HrmConfig → Meeting Room CRUD) + Smart Friend Reviewer 9× cumulative CLEAN. **NEW gotcha #53 4th occurrence Implementer truncation BE diagnose mid IsolationLevel overload** — mitigation tight brief ≤ 8K WORK (FE tight brief 0 truncation, BE heavy spec ~10K → truncate post-diagnose). **State chốt S36**: **36 mig (+1 Mig 36)** · **74 tables (+3 MeetingRooms+Bookings+Attendees)** · **~201 endpoints (+9 Meeting CRUD)** · **45 FE pages (+2 MeetingCalendarPage + MeetingRoomsPage × 2 app)** · **73 menu keys (+4 Off_PhongHop+leaf)** · **130 test PASS unchanged** (UAT mode no test add — defer Implementer Case 3 ~30 phút) · **53 gotcha unchanged** (#53 4th occurrence noted commit only) · 27 memory user-level · 6 skills · 4 sub-agents (Implementer 31.7KB + CICD 28.3KB acceptable post-curate). **Bundle hash live S36**: admin `C9kzTTmq` + user `CC4DQ-Tr`.)
**Last updated S35 (prev):** 2026-05-28 (Session 35 — **🎯 S35 3 chunk push ALL DONE end-to-end deploy prod: FE inline forms 5 satellite + G-H2 BE CRUD 16 endpoint + G-H2 FE Admin HrmConfigsPage**: cumulative **3 commit S35** push remote `63dd9ec..021674a` + **3 CI Run ALL PASS #242/#243/#244**. **Chunk 1 FE inline forms** (`c3cd343` Run #242 3m30s PASS): Implementer Case 2 cookie-cutter mirror Pattern 12-ter × 16-bis. EmployeesListPage.tsx 573→1200 LOC (+627) × 2 app SHA256 IDENTICAL `802d01fd1ee79925` + types/employee.ts +53 × 2 app + 5 inline Form component (WorkHistory/Education/FamilyRelation/Skill/Document) + 3 DRY helpers (FormField + FormFooter + RowActions × 45 usage) + 15 useMutation × 2 app + DRY `invalidate()` helper × 15 calls. Wire 15 endpoint S34 BE inline expandable form Add/Edit/Delete (NOT modal/drawer). gotcha #44 mitigation ACTIVE per-action policy Hrm_HoSo. Bundle hash rotate `RNTX6Fvo→BhR0MmLN` + `29A1LuMm→DIdNaB6W`. **Chunk 2 G-H2 BE CRUD 16 endpoint** (`909655c` Run #243 3m43s PASS): Implementer Case 2 mega Pattern 12-bis 3× cumulative. HrmConfigFeatures.cs NEW 439 LOC 4 region cookie-cutter mirror Catalogs (LeaveTypes/Holidays/Shifts/OtPolicies) + HrmConfigsController.cs NEW 137 LOC URL `/api/hrm-configs/{kind}` × 4 verb = 16 endpoint + Class `[Authorize]` + write `[Authorize(Roles="Admin")]` 12 attribute + 8 Conflict UNIQUE check (4 Create + 4 Update với composite Year+Date Holiday exclude-self) + 8 AbstractValidator + 44 RuleFor. **Smart Friend Implementer caught 2 spec drift**: (a) MaxLength validator vs EF config mismatch → aligned to EF source-of-truth (Code 20→50, Name 100→200, Description 500), (b) HRM entities NO HasQueryFilter (vs Master 9 file have) → explicit `.Where(!IsDeleted)` 8 site. 4 GET smoke 19 row prod live (5+10+3+1). Bundle hash UNCHANGED 2 app (anti-pattern verify BE-only). **Chunk 3 G-H2 FE Admin HrmConfigsPage** (`021674a` Run #244 3m38s PASS): Implementer Case 2 declarative single-page mirror Pattern 12-bis × 16-bis 9× cumulative. types/hrm-config.ts NEW 98 LOC × 2 app SHA256 IDENTICAL `228917e5fac2cdc6` + HrmConfigsPage.tsx NEW ~470 LOC × 2 app SHA256 IDENTICAL `6378fbc71ff90260` + App.tsx +3 LOC × 2 app (route + Navigate redirect default) + Layout.tsx +6 LOC staticMap × 2 app. **Smart Friend Implementer 3rd catch S35**: em main spec line 24 GAP "Layout staticMap no resolve issue" — WRONG. Implementer verified `MenuItem.cs` NO Url field + `resolvePath()` regex chỉ match `Ct_*/Wf_*/Pe_*/PeWf_*/AwV2_*` (KHÔNG `Hrm_Config_*`) → silent sidebar drop gotcha #50. Enforced staticMap mirror Pattern 16-bis 6× foundation reinforced. Declarative `KIND_CONFIG` Record × 4 kind + FieldDef extend types (text/textarea/checkbox/number/date/time/select/multiselect-weekday cho Shift WorkDays). Bundle hash rotate `BhR0MmLN→Bl6e54yi` admin + `DIdNaB6W→DHmW2tUF` user. **Multi-agent ROI S35 ~250K total**: 🟨 Implementer 3 spawn ~80K (3 cookie-cutter chunk + Smart Friend × 3 catch) + 🟦 Investigator 1 spawn ~8K (Plan G-H2 BE CRUD pre-flight audit + NamGroup ref MISS verdict — SOL clean-room design MẠNH HƠN, KHÔNG cần port) + 🟥 Reviewer 3 spawn ~60K (3 pre-commit verify Smart Friend cumulative 9× clean S22+S25+S29×2+S33×2+S35×3, Cat 1-6 PASS tất cả chunk) + 🟩 CICD 4 spawn ~70K (warm-up Run #241 + Run #242 + Run #243 + Run #244 stalled em main fallback). **NEW gotcha #53 sub-agent truncation/stall pattern** S35 × 3 occurrence (Reviewer × 2 mid-MEMORY-update + CICD × 1 stalled 600s watchdog) — mitigation: tight brief ≤ 8K + em main grep verify manual + curate MEMORY pre-spawn nếu > 25KB + remove "BEFORE stop with detailed MEMORY" directive khi MEMORY borderline. **NEW capability prod end-to-end S35**: (a) Admin login eoffice/employees → 5 satellite section inline Add/Edit/Delete form expandable cho 33 EmployeeProfile sample + (b) Admin login /hrm/configs/leave-types → table 5 row + sub-tab 4 kind switcher (LeaveTypes/Holidays/Shifts/OtPolicies) Dialog modal CRUD. **State chốt S35**: **35 mig unchanged** · **71 tables unchanged** · **~185 endpoints (+16 HRM Configs)** · **43 FE pages (+1 HrmConfigsPage)** · **69 menu keys unchanged** · **130 test PASS unchanged** (UAT mode no test add 3 chunk) · **53 gotcha (+1 #53 sub-agent truncation)** · 27 memory user-level · 6 skills · 4 sub-agents (Reviewer + CICD borderline post-spawn MEMORY entries S35).) **Last updated S35 (prev):** 2026-05-28 (Session 35 — **🎯 S35 3 chunk push ALL DONE end-to-end deploy prod: FE inline forms 5 satellite + G-H2 BE CRUD 16 endpoint + G-H2 FE Admin HrmConfigsPage**: cumulative **3 commit S35** push remote `63dd9ec..021674a` + **3 CI Run ALL PASS #242/#243/#244**. **Chunk 1 FE inline forms** (`c3cd343` Run #242 3m30s PASS): Implementer Case 2 cookie-cutter mirror Pattern 12-ter × 16-bis. EmployeesListPage.tsx 573→1200 LOC (+627) × 2 app SHA256 IDENTICAL `802d01fd1ee79925` + types/employee.ts +53 × 2 app + 5 inline Form component (WorkHistory/Education/FamilyRelation/Skill/Document) + 3 DRY helpers (FormField + FormFooter + RowActions × 45 usage) + 15 useMutation × 2 app + DRY `invalidate()` helper × 15 calls. Wire 15 endpoint S34 BE inline expandable form Add/Edit/Delete (NOT modal/drawer). gotcha #44 mitigation ACTIVE per-action policy Hrm_HoSo. Bundle hash rotate `RNTX6Fvo→BhR0MmLN` + `29A1LuMm→DIdNaB6W`. **Chunk 2 G-H2 BE CRUD 16 endpoint** (`909655c` Run #243 3m43s PASS): Implementer Case 2 mega Pattern 12-bis 3× cumulative. HrmConfigFeatures.cs NEW 439 LOC 4 region cookie-cutter mirror Catalogs (LeaveTypes/Holidays/Shifts/OtPolicies) + HrmConfigsController.cs NEW 137 LOC URL `/api/hrm-configs/{kind}` × 4 verb = 16 endpoint + Class `[Authorize]` + write `[Authorize(Roles="Admin")]` 12 attribute + 8 Conflict UNIQUE check (4 Create + 4 Update với composite Year+Date Holiday exclude-self) + 8 AbstractValidator + 44 RuleFor. **Smart Friend Implementer caught 2 spec drift**: (a) MaxLength validator vs EF config mismatch → aligned to EF source-of-truth (Code 20→50, Name 100→200, Description 500), (b) HRM entities NO HasQueryFilter (vs Master 9 file have) → explicit `.Where(!IsDeleted)` 8 site. 4 GET smoke 19 row prod live (5+10+3+1). Bundle hash UNCHANGED 2 app (anti-pattern verify BE-only). **Chunk 3 G-H2 FE Admin HrmConfigsPage** (`021674a` Run #244 3m38s PASS): Implementer Case 2 declarative single-page mirror Pattern 12-bis × 16-bis 9× cumulative. types/hrm-config.ts NEW 98 LOC × 2 app SHA256 IDENTICAL `228917e5fac2cdc6` + HrmConfigsPage.tsx NEW ~470 LOC × 2 app SHA256 IDENTICAL `6378fbc71ff90260` + App.tsx +3 LOC × 2 app (route + Navigate redirect default) + Layout.tsx +6 LOC staticMap × 2 app. **Smart Friend Implementer 3rd catch S35**: em main spec line 24 GAP "Layout staticMap no resolve issue" — WRONG. Implementer verified `MenuItem.cs` NO Url field + `resolvePath()` regex chỉ match `Ct_*/Wf_*/Pe_*/PeWf_*/AwV2_*` (KHÔNG `Hrm_Config_*`) → silent sidebar drop gotcha #50. Enforced staticMap mirror Pattern 16-bis 6× foundation reinforced. Declarative `KIND_CONFIG` Record × 4 kind + FieldDef extend types (text/textarea/checkbox/number/date/time/select/multiselect-weekday cho Shift WorkDays). Bundle hash rotate `BhR0MmLN→Bl6e54yi` admin + `DIdNaB6W→DHmW2tUF` user. **Multi-agent ROI S35 ~250K total**: 🟨 Implementer 3 spawn ~80K (3 cookie-cutter chunk + Smart Friend × 3 catch) + 🟦 Investigator 1 spawn ~8K (Plan G-H2 BE CRUD pre-flight audit + NamGroup ref MISS verdict — SOL clean-room design MẠNH HƠN, KHÔNG cần port) + 🟥 Reviewer 3 spawn ~60K (3 pre-commit verify Smart Friend cumulative 9× clean S22+S25+S29×2+S33×2+S35×3, Cat 1-6 PASS tất cả chunk) + 🟩 CICD 4 spawn ~70K (warm-up Run #241 + Run #242 + Run #243 + Run #244 stalled em main fallback). **NEW gotcha #53 sub-agent truncation/stall pattern** S35 × 3 occurrence (Reviewer × 2 mid-MEMORY-update + CICD × 1 stalled 600s watchdog) — mitigation: tight brief ≤ 8K + em main grep verify manual + curate MEMORY pre-spawn nếu > 25KB + remove "BEFORE stop with detailed MEMORY" directive khi MEMORY borderline. **NEW capability prod end-to-end S35**: (a) Admin login eoffice/employees → 5 satellite section inline Add/Edit/Delete form expandable cho 33 EmployeeProfile sample + (b) Admin login /hrm/configs/leave-types → table 5 row + sub-tab 4 kind switcher (LeaveTypes/Holidays/Shifts/OtPolicies) Dialog modal CRUD. **State chốt S35**: **35 mig unchanged** · **71 tables unchanged** · **~185 endpoints (+16 HRM Configs)** · **43 FE pages (+1 HrmConfigsPage)** · **69 menu keys unchanged** · **130 test PASS unchanged** (UAT mode no test add 3 chunk) · **53 gotcha (+1 #53 sub-agent truncation)** · 27 memory user-level · 6 skills · 4 sub-agents (Reviewer + CICD borderline post-spawn MEMORY entries S35).)

View File

@ -711,14 +711,14 @@ Cron task `solution-erp-skill-audit-monthly` fire 9:00 AM ngày 1 mỗi tháng.
> ⚠️ PHẢI extend `ApprovalWorkflowApplicableType` enum first: `+ProposalGeneral=4, +LeaveRequest=5, +OtRequest=6, +VehicleBooking=7, +ItTicket=8` (Mig 37 cookie-cutter Mig 22 pattern). Gotcha #51 INFRASTRUCTURE vs DEMO seed gate caution — `SeedSampleWorkflow*` OUT of `DemoSeed:Disabled` flag. > ⚠️ PHẢI extend `ApprovalWorkflowApplicableType` enum first: `+ProposalGeneral=4, +LeaveRequest=5, +OtRequest=6, +VehicleBooking=7, +ItTicket=8` (Mig 37 cookie-cutter Mig 22 pattern). Gotcha #51 INFRASTRUCTURE vs DEMO seed gate caution — `SeedSampleWorkflow*` OUT of `DemoSeed:Disabled` flag.
#### Plan G-O3 — Đề xuất (Proposal) #### Plan G-O3 — Đề xuất (Proposal) ✅ DONE S37 (commit `de1c378` Run #246 PASS)
- [ ] 👤 Chủ trì Solo Mig 38 schema + extend `ApplicableType` enum +ProposalGeneral=4 - [x] 👤 Chủ trì Solo Mig 37 extend `ApplicableType` enum +5 values (ProposalGeneral=4 + LeaveRequest=5 + OtRequest=6 + VehicleBooking=7 + ItTicket=8) cookie-cutter Mig 22 pattern (Up/Down empty — enum mức Domain)
- [ ] 🟨 Implementer Case 2 mirror PE Mig 22-26 BE Proposal entity + ProposalAttachments + workflow pin `ApprovalWorkflowId` - [x] 👤 Chủ trì Solo Mig 38 schema 4 entity (Proposal + ProposalAttachment + ProposalLevelOpinion UNIQUE composite mirror PE Mig 26 + ProposalCodeSequence atomic Prefix PK) + 4 EF Config + 2 DbContext mod
- [ ] 👤 Chủ trì Solo BE ApproveV2Async branch + CodeGen `DX/YYYY/NNN` (cross-stack tight, mirror PE CodeGen) - [x] 👤 Chủ trì Solo BE ApproveV2Async inline + CodeGen `DX/YYYY/NNN` SERIALIZABLE tx — em main solo ~700 LOC ProposalFeatures.cs fallback after Implementer gotcha #53 5th truncate mid-exploration + 529 Overload spawn fail
- [ ] 🟨 Implementer Case 2 cookie-cutter mirror PE Plan B Chunk E1+D+E2+E3 FE 2 app ProposalsList + Create + Detail (Section 1-5) - [x] 👤 Chủ trì Solo FE 2 app fallback (Implementer 529 spawn fail) — 4 file × 2 app SHA256 IDENTICAL (types/proposal.ts `95607052ff1138f2` + ProposalsListPage `603f0d9cf74cd09a` + ProposalCreatePage `6aed3a76563dd576` + ProposalDetailPage `3dc229ea8dcc9bc0`) + Pattern 16-bis 8× cumulative (App.tsx + menuKeys + Layout staticMap 3 entry)
- [ ] 🟥 Reviewer adversarial Smart Friend pre-commit — ApplicableType=Proposal validate cross-module security catch (gotcha #44 cumulative pattern) - [x] 👤 Chủ trì Solo Permission `Off_DeXuat_*` 4 leaf + DbInitializer SeedSampleProposalWorkflowV2Async `QT-DX-V2-001` IsUserSelectable=true NOT gated DemoSeed gotcha #51
- [ ] 🟩 CICD Monitor post-deploy verify Run + bundle hash rotate - [x] 🟩 CICD Monitor Run #246 PASS 3m53s — bundle rotate × 2 (admin `C9kzTTmq→CGueDk22` + user `CC4DQ-Tr→CEt0QRgX`) + Mig 37+38 prod TOP 2 + 4 menu Off_DeXuat seed + workflow QT-DX-V2-001 ApplicableType=4 verified + 0 regression
#### Plan G-O4 — Đơn từ (LeaveRequest + OtRequest + TravelRequest) #### Plan G-O4 — Đơn từ (LeaveRequest + OtRequest + TravelRequest)