Files
solution-erp/docs/changelog/sessions/2026-05-28-s35-fe-inline-forms-g-h2.md
pqhuy1987 8afdc1e826 [CLAUDE] Docs+Memory: S35 wrap — FE forms + G-H2 BE CRUD + FE Admin deploy prod end-to-end
Cumulative S35 3 commit + 3 CI Run #242/#243/#244 ALL PASS:
- `c3cd343` FE inline forms 5 satellite × 2 app cookie-cutter (+1758 LOC)
- `909655c` G-H2 BE CRUD HrmConfig 16 endpoint (+576 LOC NEW)
- `021674a` G-H2 FE Admin HrmConfigsPage declarative (+1388 LOC)

## Updates this commit (docs CI skip per gotcha #41)
- docs/STATUS.md S35 wrap header (cumulative 3 chunk + Multi-agent ROI ~250K)
- docs/HANDOFF.md S35 brief + S36 backlog 6 option
- docs/gotchas.md +#53 sub-agent truncation/stall pattern S35 × 3 occurrence + Quick reference 28
- docs/changelog/sessions/2026-05-28-s35-fe-inline-forms-g-h2.md NEW session log
- 4 sub-agent MEMORY auto-updated entry (Implementer + CICD + Reviewer + Investigator S35 spawns)

## Patterns reinforced cumulative S35
- Pattern 12-ter (within-module N-satellite) 6× cumulative
- Pattern 12-bis (cross-module catalog mega) 3× cumulative
- Pattern 16-bis (4-place mirror cross-app) 6× — staticMap 4th place mandatory (gotcha #50)
- Smart Friend 9× cumulative clean (S22+S25+S29×2+S33×2+S35×3)
- NEW: Declarative KIND_CONFIG Record pattern (single-page multi-kind CRUD reuse)

## Smart Friend Implementer 3 catch S35 (anti-pattern prevention)
1. Chunk 2 MaxLength validator vs EF config mismatch → aligned EF source-of-truth
2. Chunk 2 HRM entities NO HasQueryFilter → explicit .Where(!IsDeleted) 8 site
3. Chunk 3 em main spec gap Layout staticMap miss → Implementer enforced Pattern 16-bis 4-place

## State chốt S35
- 35 mig unchanged · 71 tables · ~185 endpoints (+16 HRM Configs)
- 43 FE pages (+1 HrmConfigsPage) · 130 test PASS unchanged
- 53 gotcha (+1 #53) · 27 memory user-level · 6 skills · 4 sub-agents

## Multi-agent ROI S35 ~250K
- Implementer 3 spawn ~80K (3 cookie-cutter chunk + Smart Friend × 3 catch)
- Investigator 1 spawn ~8K (G-H2 BE CRUD pre-flight + NamGroup MISS verdict)
- Reviewer 3 spawn ~60K (Smart Friend 9× clean, 2 truncated + 1 tight brief PASS)
- CICD 4 spawn ~70K (warm-up + 3 deploy verify, 1 stalled em main fallback)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 10:23:55 +07:00

235 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Session 35 — FE inline forms 5 satellite + G-H2 BE CRUD + G-H2 FE Admin end-to-end deploy prod
**Date:** 2026-05-28
**Duration:** ~5h (setup + 3 chunk execute + wrap)
**Branch:** `main`
**Push range:** `63dd9ec..021674a` (3 commits)
**CI Runs:** #242 + #243 + #244 ALL PASS
## Context
Anh main chốt Option A "FE forms + G-H2 BE+FE combo" sequence sau setup 10-mục report + "warm-up Implementer + CICD ngay". Em main thực thi cumulative 3 chunk push + docs wrap end-of-session.
## Plan execution timeline
### Setup (~30 phút)
10-mục report đầu session: MD/RAG context load + audit 4 MEMORY (3/4 borderline post-S34) + 6 skill verify + 130 test PASS verified + RAG 7 projects 38,849 chunks live + skill cron next 2026-06-01 + 4 sub-agent definitions ready.
**Drift fix S35 init:**
- MEMORY.md user-level index thiếu Pattern 12-ter S34 entry → +1 line patch
- Sub-agent agentId từ S34 historical, fresh spawn S35
### Chunk 1 — FE inline forms 5 satellite (~1.5h)
**🟩 CICD warm-up `a0fc1bac73362b086`** ~15K:
- Verify Run #241 PASS (S34 last `07b3f3b`) — Mig 35 prod + 19 sample seed + 3 domain 200 + bundle hash baseline S35 `RNTX6Fvo`/`29A1LuMm`
**🟨 Implementer Case 2 `a4ca1a2333ca5a4f2`** ~30K (over budget heavy page rewrite 1200 LOC):
- `fe-admin/src/pages/hrm/EmployeesListPage.tsx` 573→1200 LOC (+627, +110%)
- `fe-user/...` mirror SHA256 IDENTICAL `802d01fd1ee79925`
- `types/employee.ts` +53 LOC × 2 app mirror `db29156a61af76e9`
- 5 inline Form component: WorkHistory + Education + FamilyRelation + Skill + Document
- 3 DRY helpers: FormField + FormFooter + RowActions × 45 usage site
- 15 useMutation per app (5 sat × 3 verb) + DRY `invalidate()` helper × 15 calls
- Section component extend `actions?` prop backward-compat
- Wire 15 BE endpoint S34 (POST/PUT/DELETE × 5 satellite path)
- npm build × 2 PASS (fe-admin 31.57s + fe-user 23.39s, 0 TS error)
- Pattern 12-ter cumulative 6× (FE side reinforcement)
- 0 ambiguity encountered (spec deterministic 100%)
**🟥 Reviewer pre-commit `affe62cdb8f58bf0e`** ~15K **TRUNCATED** mid-Cat-1:
- Output cut after "Cat 1 PERFECT — all 5 Update calls send `id` in body matching BE UpdateXCommand"
- Em main fallback verify Cat 2-6 manual qua Grep:
- Cat 2 SHA256 mirror IDENTICAL × 4 file (diff exit 0)
- Cat 3 git status anti-fiddle clean
- Cat 4 DRY helper `invalidate()` × 15 calls = match mutations
- Cat 5 `confirm()` × 6 (5 sat + 1 header) · 0 Mock/alert/TODO
- Cat 6 RowActions/FormFooter/FormField × 45 usage
- Verdict: PASS (Smart Friend 7× cumulative clean preserved)
**Commit `c3cd343` push** → CI Run #242 SUCCESS 3m30s:
- 130 test baseline preserve (FE-only)
- Bundle hash rotate × 2: `RNTX6Fvo→BhR0MmLN` admin + `29A1LuMm→DIdNaB6W` user
- CSS hash also rotated
- 3 prod domain 200 OK
- VPS mtime 09:42
**Polling lesson CICD MEMORY saved:** Bundle hash verify MUST AFTER status=Success — premature poll showed stale baseline pre-rotate.
### Chunk 2 — G-H2 BE CRUD 16 endpoint (~5 phút Implementer under-budget)
**🟦 Investigator `a42bd882c367f6e47`** ~8K parallel pre-flight:
- Plan CA Chunk B SOL Catalogs precedent: 948 LOC byte-identical mirror 2 app, Pattern 16-bis × 12-bis 4-place mirror
- NamGroup HRM ref **MISS** — KHÔNG có entity dedicated cho 4 HRM catalog. SOL Mig 35 design MẠNH HƠN clean-room (IsPaid/RequiresAttachment/composite UNIQUE/3-tier multiplier/Luật LĐ VN cap). KHÔNG cần port.
- SOL Master pattern: Catalogs mega 334 LOC + 1 controller — recommend **Option B mega 1 file**
- LOC estimate FE Task 4: ~920 mirror Chunk B 948
- EF Configuration 4 file riêng đã có sẵn S34
- Anti-pattern caught: NamGroup `TimeOffConfig` embed JSON approver — SOL nên V2 `ApprovalWorkflow` pattern khi G-O4
**🟨 Implementer Case 2 `a6593cad1afc52333`** ~25K:
- `src/Backend/SolutionErp.Application/Hrm/HrmConfigFeatures.cs` NEW 439 LOC mega
- `src/Backend/SolutionErp.Api/Controllers/HrmConfigsController.cs` NEW 137 LOC
- 4 region cookie-cutter (LeaveTypes/Holidays/Shifts/OtPolicies) × (DTO + List + Create + Update + Delete + Validator) = 4 DTO + 4 List query + 8 Validator + 8 Conflict UNIQUE check + 4 soft delete
- URL `/api/hrm-configs/{kind}` × 4 verb = **16 endpoint**
- Class `[Authorize]` + write `[Authorize(Roles="Admin")]` 12 attribute
- Composite UNIQUE Holiday (Year, Date) Update với `x.Id != req.Id` exclude-self
- `dotnet build` PASS 0 err + `dotnet test` 130 baseline preserve
**Smart Friend Implementer 2 catch S35 BE CRUD:**
1. **MaxLength validator vs EF config mismatch** — Spec `Code MaximumLength(20)` vs EF `HasMaxLength(50)`. Aligned validator to EF source-of-truth (LeaveType/OtPolicy Code=50, ShiftPattern Code=20, Name=200, Description=500). Avoid runtime truncation error khi admin paste longer code.
2. **HRM entities NO HasQueryFilter** — Master/Catalogs config có `HasQueryFilter(!IsDeleted)` 9 file. 4 HRM Config files KHÔNG có. Added explicit `.Where(x => !x.IsDeleted)` 8 site (4 List query + 4 Conflict-check) prevent surfacing deleted rows.
**🟥 Reviewer pre-commit `a536143b528605fef`** ~15K **TRUNCATED** mid-MEMORY-trim:
- Output cut: "MEMORY size warning shown (24.6KB exceeds 24.4KB). Let me append a concise entry but trim verbose older ones."
- Em main fallback verify Cat 1-6 manual:
- Cat 1 Wire BE: 8 Conflict check (4 Create + 4 Update với composite Year+Date `x.Id != req.Id` exclude-self) ✓
- Cat 2 URL routing: 16 endpoint kebab-case kind consistent
- Cat 3 Anti-fiddle: 2 NEW BE file + sub-agent MEMORY auto
- Cat 4 Authorization: 12 `[Authorize(Roles="Admin")]` = 4×3 write verb
- Cat 5 Validator: 8 AbstractValidator + 44 RuleFor + 0 Mock/TODO
- Cat 6 Cookie-cutter Pattern 12-bis mega consistent
- Smart Friend 8× cumulative clean preserved
**Commit `909655c` push** → CI Run #243 SUCCESS 3m43s:
- Bundle hash UNCHANGED × 2 (anti-pattern verify: BE-only no spurious FE rebuild)
- 4 GET endpoint smoke 19 row prod live (5 LeaveType + 10 Holiday VN 2026 + 3 Shift + 1 OtPolicy STANDARD)
- 3 prod domain 200 OK
- Mig prod TOP 1 unchanged (no Mig delta)
### Chunk 3 — G-H2 FE Admin HrmConfigsPage (~6 phút Implementer + 1 phút Reviewer)
**🟨 Implementer Case 2 `a1aeda2fcbbc19eeb`** ~25K:
- `fe-{admin,user}/src/types/hrm-config.ts` NEW 98 LOC × 2 app SHA256 IDENTICAL `228917e5fac2cdc6`
- `fe-{admin,user}/src/pages/hrm/HrmConfigsPage.tsx` NEW ~470 LOC × 2 app SHA256 IDENTICAL `6378fbc71ff90260`
- `fe-{admin,user}/src/App.tsx` +3 LOC × 2 app (route + Navigate redirect default `/hrm/configs``leave-types`)
- `fe-{admin,user}/src/components/Layout.tsx` +6 LOC staticMap × 2 app (4 entry `Hrm_Config_*`)
- Declarative `KIND_CONFIG` Record × 4 kind + FieldDef type extend (text/textarea/checkbox/number/date/time/select/multiselect-weekday cho Shift WorkDays)
- 4 kind sub-tab navigation + Dialog modal CRUD + per-kind RowRenderer
- npm build × 2 PASS (fe-admin 14.33s + fe-user 744ms, 0 TS error)
- Pattern 12-bis × 16-bis 9× cumulative successful
- Pattern 16-bis 6× cumulative (staticMap 4th place enforce)
**Smart Friend Implementer 3rd catch S35 (CRITICAL):**
- **Em main spec line 24 GAP** "Layout staticMap (no resolve issue — `/hrm/configs/:kind` URL match menu key `Hrm_Config_*` 4 leaf seeded S34 đã có URL ...)" — **WRONG**
- Implementer verified:
- `MenuItem.cs` Domain entity NO `Url` field → FE-only routing
- `resolvePath()` Layout.tsx chỉ staticMap + regex `Ct_*/Wf_*/Pe_*/PeWf_*/AwV2_*` → KHÔNG match `Hrm_Config_*`
- Without staticMap → MenuLeaf line ~198 `if (!path) return null` → silent sidebar drop (gotcha #50)
- Per Pattern 16-bis cumulative discipline (gotcha #50 5× prior), Implementer enforced staticMap mirror +6 LOC × 2 app
- Pattern foundation overrides single-spec-instance scope when conflict — Smart Friend anti-pattern prevention
**🟥 Reviewer pre-commit `a6b42cc3c1423e699`** ~5K **PASS CLEAN không truncated** (tight brief verified):
- Tight scope brief ≤ 10K explicit "DO NOT curate MEMORY heavy"
- 7 tool uses, 52s, 5K total token return
- Cat A Wire BE 16 endpoint PASS (api.get/post/put/delete + URL `/hrm-configs/${kind}` literal)
- Cat B Anti-fiddle PASS (8 file expected + sub-agent MEMORY auto)
- Cat C staticMap consistency PASS (resolvePath regex DOES NOT match `Hrm_Config_*` — Smart Friend catch CORRECT, 4 entry mirror identical 2 app)
- Cat D TS6 erasableSyntaxOnly PASS (0 enum, 11 type alias + 4 union literal)
- 0 critical / 0 major / 2 minor defer
- Smart Friend 9× cumulative clean — TIGHT BRIEF MITIGATION SUCCESS
**Commit `021674a` push** → CI Run #244 SUCCESS 3m38s (em main fallback verify):
- 🟩 CICD `a3dfb05e2deee8f0f` **STALLED 600s watchdog** after "VPS mtime cross-check confirms ship at 10:05"
- Em main fallback curl verify: 3 prod domain 200 OK + bundle hash rotate × 2 confirmed
- fe-admin `BhR0MmLN→Bl6e54yi`
- fe-user `DIdNaB6W→DHmW2tUF`
## Multi-agent ROI S35 ~250K total
| Agent | Spawn count | Token est | Quality |
|---|---|---|---|
| 🟨 Implementer Case 2 | 3 | ~80K | 3 cookie-cutter chunk + Smart Friend × 3 catch (MaxLength + HasQueryFilter + staticMap) |
| 🟦 Investigator | 1 | ~8K | Plan G-H2 BE CRUD pre-flight + NamGroup MISS verdict + LOC estimate |
| 🟥 Reviewer | 3 | ~60K | Smart Friend 9× cumulative clean (2 truncated mid-MEMORY + 1 tight brief PASS) |
| 🟩 CICD | 4 | ~70K | Warm-up + 3 deploy verify (1 stalled em main fallback) |
| 👤 Em main | — | ~280K | Setup + spec design × 3 + commit × 3 + push × 3 + manual verify fallback × 3 + docs wrap |
## NEW gotcha #53 — Sub-agent truncation/stall pattern
**Pattern empirical S35:** 3 sub-agent spawn (Reviewer × 2 + CICD × 1) bị truncated / stalled trong final "Update MEMORY.md BEFORE stop" step. Output return PASS verdict snippet visible nhưng structured findings không đầy đủ.
**Root cause hypothesis:**
1. Sub-agent context window approach limit khi cumulative tool output + 100K spawn budget
2. MEMORY.md ~25-31KB borderline triggers Edit/Write large operation late-stage → token overflow streaming
3. Stream watchdog 600s timeout không recover (CICD case)
**Mitigation verified S35:**
- **Tight brief scope ≤ 8K + 4 cat tight** → Reviewer chunk 3 FE Admin PASS clean 5K return
- **Em main manual verify post-truncation** Cat 2-6 grep-based (5 phút faster than re-spawn)
- **Curate MEMORY pre-spawn nếu > 25KB** (4 agent MEMORY S35 post-spawn borderline cumulative)
- **Spec ghi rõ "short append MEMORY only, NO curate"** khi MEMORY borderline
**Saved gotcha #53 + Quick reference 28 trong gotchas.md.**
## Patterns reinforced cumulative S35
| Pattern | Reinforcement | Reference |
|---|---|---|
| Pattern 12-ter (within-module N-satellite) | 6× cumulative (5 sat S34 + FE forms S35) | feedback_within_module_n_satellite_scaffold |
| Pattern 12-bis (cross-module catalog mega) | 3× cumulative (S29 Plan B + Chunk C + S35 G-H2) | docs/changelog/sessions/2026-05-22-s29-plan-ca-plan-b-contract-v2-wire.md |
| Pattern 16-bis (4-place mirror cross-app) | 6× cumulative — staticMap 4th place mandatory | gotcha #50 + S33-S34-S35 reinforcement |
| Smart Friend | 9× cumulative clean (S22+S25+S29×2+S33×2+S35×3) | Implementer Smart Friend default |
| **NEW: Declarative KIND_CONFIG Record** | 2× pattern (Master/Catalogs + HRM/Configs) | Reusable cross-module single-page multi-kind CRUD |
## State delta S35
| Metric | S34 wrap | S35 wrap | Δ |
|---|---|---|---|
| Migrations | 35 | 35 | 0 |
| Tables | 71 | 71 | 0 |
| Endpoints | ~169 | ~185 | +16 (HRM Configs) |
| FE pages | 42 | 43 | +1 (HrmConfigsPage) |
| Menu keys | 69 | 69 | 0 |
| Tests | 130 | 130 | 0 (UAT mode no test add) |
| Gotchas | 52 | 53 | +1 (#53 sub-agent truncation) |
| Memory user-level | 26 → 27 | 27 | unchanged S35 (Pattern 12-ter add S34, MEMORY.md drift fix S35 init +1 entry) |
| Skills | 6 | 6 | 0 |
| Sub-agents | 4 | 4 | 0 |
| Active prod users | 34 | 34 | 0 |
| Commits S35 | — | 3 | `c3cd343` + `909655c` + `021674a` |
| CI Runs S35 | — | 3 | #242 + #243 + #244 ALL PASS |
| Bundle hash rotate | — | 2× | fe-admin BhR0MmLN→Bl6e54yi · fe-user DIdNaB6W→DHmW2tUF |
## NEW capability prod end-to-end S35 (UAT-ready)
### Capability 1 — Hồ sơ NV satellite CRUD inline forms
- Admin login `eoffice.solutions.com.vn/employees`
- Pick `NV/2026/0007 BOD 1 - Director` (1 in 33 sample)
- Section 2-6 click `+ Thêm` → inline AddForm expand
- Per-row Pencil → inline EditForm replace row
- Per-row Trash → `confirm()` native + DELETE API
- 15 BE endpoint wire CRUD live (5 satellite × POST/PUT/DELETE)
### Capability 2 — Cấu hình HRM 4 catalog
- Admin login `eoffice.solutions.com.vn/hrm/configs/leave-types`
- 4 sub-tab navigation: Loại phép / Ngày lễ / Ca làm việc / Chính sách OT
- Table per-kind với columns config riêng
- `+ Thêm` → Dialog modal form (declarative FieldDef render — text/number/date/time/checkbox/select/multiselect-weekday)
- Pencil → Dialog Edit pre-fill
- Trash → confirm() + DELETE
- 16 BE endpoint wire CRUD live (`/api/hrm-configs/{kind}` × 4 verb)
- 19 row seed prod (5+10+3+1) admin manage
## Defer S36+ backlog
1. **Plan G-O2 Phòng họp BookingCalendar** (~3-4h Mig 36 — FullCalendar lib NEW dep) standalone
2. **Phase 10.3 G-O3-O6 Workflow Apps** (4 plan workflow LeaveRequest/OtRequest/BusinessTrip/Project — depends G-H2 catalog ready)
3. **Curate 4 MEMORY post-S35 spawn** (Reviewer + CICD borderline)
4. **Test bundle G-H2 BE CRUD** (~30 phút Implementer Case 3 — UNIQUE Conflict + composite Year+Date + soft delete restore)
5. **Audit cron 2026-06-01** (cumulative mig 33→35 + test 111→130 + gotcha 52→53 docs drift batch)
6. **Phase 9 Ops** anh main coordinate (SMTP + Rotate creds + UAT 2-3 user 1 tuần)
7. **Phase 1.5 Item 3 BE permission per-action satellite** (current scope `[Authorize(Policy="Hrm_HoSo.Create")]` class-level on satellite endpoints — verify Drafter 403 silent per-action mitigation)
## Reference
- `docs/STATUS.md` S35 header
- `docs/HANDOFF.md` S35 brief
- `docs/gotchas.md` #53 NEW sub-agent truncation pattern
- 3 commit: `c3cd343` (FE forms) + `909655c` (BE CRUD) + `021674a` (FE Admin)
- 3 CI Run: #242 + #243 + #244 ALL PASS
- 4 agent last spawn agentId (post-session-end invalid):
- Investigator `a42bd882c367f6e47`
- Implementer `a1aeda2fcbbc19eeb`
- Reviewer `a6b42cc3c1423e699`
- CICD `a3dfb05e2deee8f0f` (stalled at end)