CICD Monitor Run #202 Plan O verify catch CRITICAL caveat: PurchaseEvaluationsController.cs:267 `TransitionPeBody` record CHỈ có 3 fields (TargetPhase, Decision, Comment) — MISSING 3 fields có trong Command record `TransitionPurchaseEvaluationCommand`: - ReturnMode (F1 mode Trả lại) - ReturnTargetUserId (F1 Assignee target) - SkipToFinal (F2 duyệt thẳng Cấp cuối) Mediator.Send line 70 cũng drop 3 field. → FE × 2 app SEND ĐÚNG 7 fields qua `api.post(/transitions)` body (Investigator audit confirm wire OK) → ASP.NET Core deserialization silently DROP 3 fields ở Controller layer → Handler nhận ReturnMode=null + SkipToFinal=false → fallback default Drafter mode + F2 không trigger. Bug present 2 NGÀY PROD từ Mig 28 deploy 2026-05-13 — gây TẤT CẢ F1+F2 wire fail từ FE side. Plan N (S23 t4) + Plan O (S23 t5) fix 5 lookup sites discrimination NHƯNG controller body record bug block flow TRƯỚC KHI đến lookup site. Em main + Reviewer + Implementer + Investigator all MISS bug này xuyên 4 plan vì: 1. Mig 28 Command extend 3 fields (S21 t4) nhưng Controller body NOT extended 2. Plan K K2 add `skipToFinal` 8th param Service nhưng Controller NOT extended 3. Bug silent — no error, no compile fail, no test fail, FE call OK, BE return 204 nhưng handler nhận default args → wrong behavior Plan P fix BE-only ~10 LOC 1 file `PurchaseEvaluationsController.cs`: 1. Add `using SolutionErp.Application.PurchaseEvaluations.Services` cho WorkflowReturnMode enum import (line ~7) 2. Extend `TransitionPeBody` record line 267 thêm 3 fields default: ```csharp public record TransitionPeBody( PurchaseEvaluationPhase TargetPhase, ApprovalDecision Decision, string? Comment, WorkflowReturnMode? ReturnMode = null, Guid? ReturnTargetUserId = null, bool SkipToFinal = false); ``` 3. Update `mediator.Send` line 70 pass 7 fields: ```csharp await mediator.Send(new TransitionPurchaseEvaluationCommand( id, body.TargetPhase, body.Decision, body.Comment, body.ReturnMode, body.ReturnTargetUserId, body.SkipToFinal), ct); ``` Investigator (FE wire audit) verify: - fe-user/src/components/pe/PeWorkflowPanel.tsx:113-124 + fe-admin mirror — api.post send ĐẦY ĐỦ 7 fields qua body - KHÔNG cần fix FE - Mig 28/31 Domain test đã cover handler logic — không cần test mới Verify: - dotnet build SolutionErp.slnx clean (0 err, 2 warn pre-existing DocxRenderer) - dotnet test SolutionErp.slnx **111/111 PASS** unchanged (no regression) Docs update: - docs/STATUS.md Last updated S23 t6 - docs/HANDOFF.md TL;DR S23 t6 ngắn gọn - .claude/agent-memory/cicd-monitor/MEMORY.md drift (Run #202 entry pre-existing) Pattern reinforced cross-project: - Controller body record MUST mirror Command record fields khi Command thêm optional params. Silent drop bug class — không test/build catch được. - Investigator pre-flight audit FE wire trước khi fix BE (Plan P scope verify) tránh em main fix sai assumption. Pending: CICD Monitor verify Plan P deploy + UAT test bro real. Pending Bug 2 F2 đến Phan Văn Chương: verify workflow v14 DB structure sau khi Plan P unblock F2 flow. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
32 KiB
CI/CD Monitor Agent — Persistent Memory
Persistent diary cross-session. Auto-injected first 200 lines / 25KB at spawn. Update BEFORE every stop. Curate when > 25KB.
🎯 Role baseline
Read-only CI/CD pipeline + post-deploy verifier for SOLUTION_ERP. Polls Gitea Actions API, verifies test gate + deploy ship + prod health. Tools: Read, Grep, Glob, Bash, WebFetch. Output: PASS/FAIL verdict + evidence under 500 words. Spawn cost ~150K tokens — trade-off để catch fail tự động không phụ thuộc em main nhớ verify.
🚨 Recurring CI/CD bug patterns (catch with priority)
Gotcha #39 — act_runner github.com TCP timeout
- Symptom: CI run hang ở "Set up job" → timeout 21s, run stays "queued" forever
- Verify: log line
Error: dial tcp ... github.com:443 ... i/o timeout - Fix: manual checkout bypass đã hardcode trong
.gitea/workflows/deploy.yml(run #108/#109), pass at #110. KHÔNG revert. Nếu pattern returns → escalate em main check VPS network
Gotcha #40 — npm cache tsc not found
- Symptom:
build_fe_adminfail sau khi enablecache: npmởactions/setup-node@v4 - Verify: log line
sh: tsc: command not foundhoặcnpm error code ETIMEDOUT - Fix: DISABLED npm cache rolled back ở
a21790d. KHÔNG re-enable. Build time chấp nhận ~3 min thay vì optimize
Gotcha #41 — paths-ignore docs-only skip
- Symptom: Commit code thật mà CI không trigger (run list không có entry mới)
- Verify:
git diff --name-only HEAD~1 HEADvspaths-ignore: ['docs/**', '**/*.md', '.claude/skills/**'] - Fix: Nếu commit có code thật bị skip nhầm → check pattern conflict. Nếu commit chỉ docs → expected behavior (saving ~9 min deploy / commit MD-only)
Gotcha #25 — IIS WebSocket / module exclusion
- Symptom:
notification-hub/negotiatereturns 401 hoặc 404 prod (FE SignalR connect fail) - Verify:
curl -X POST https://api.solutions.com.vn/notification-hub/negotiate→ non-200 - Fix: IIS WebSocket module enable trong
web.configcủa site api.solutions.com.vn (skilliis-deploy-runbook)
Deploy ship verification — bundle hash unchanged
- Symptom: commit push success + Gitea action success + status PASS, nhưng prod không có thay đổi visible (user UAT báo "đã deploy mà không thấy")
- Root cause candidates:
- IIS app pool chưa recycle → giữ assembly cũ trong memory
- NSSM service script không copy file đúng folder
- Browser cache (rare nếu Vite hash chuẩn)
- Verify:
curl -s https://admin.solutions.com.vn/ | grep -oE '/assets/index-[a-z0-9]+\.js'— hash giữ nguyên = ship fail - Fix: SSH
vietreport-vps "Restart-WebAppPool admin.solutions.com.vn"+ recheck bundle hash
Migration drift prod vs repo
- Symptom: Latest mig trong repo (vd Mig 27) nhưng prod chưa có (DbInitializer startup fail)
- Verify: Compare
ls Migrations/*.csvssqlcmd ... __EFMigrationsHistory - Fix: Check
Program.csstartup hookapp.MigrateDatabase()còn không + app pool recycle. Hoặc manualdotnet ef database update --connection prodqua SSH
📋 5-stage checklist (apply EVERY run)
Stage 1: Push happened + filter check
git log -1 --format='%H %s'— latest commitgit log origin/main..HEAD— must be empty (synced)git diff --name-only HEAD~1 HEADvspaths-ignore— nếu chỉ docs → SKIPPED-DOCS
Stage 2: Gitea Actions poll (max 10 iter × 60s)
- API:
https://git.baocaogiaoduc.vn/api/v1/repos/vietreport-admin/solution-erp/actions/runs?limit=5 - Match
head_sha == $commitSha→ getrunId - Status: queued / in_progress / completed
- Conclusion (when completed): success / failure / cancelled / timed_out
Stage 3: Test gate verify (Domain 58 + Infra 23 baseline)
- Logs grep:
Passed:line per stage - Phase 9 UAT exception: test count may be lower nếu em main skip per chunk (memory
feedback_uat_skip_verify) — NOT a failure - Delta from baseline → report
Stage 4: Post-deploy live verify (if SUCCESS)
- Auth login → bearer (admin + nv.test for non-admin gotcha #44 check)
- 3-5 endpoint smoke 2XX expected (include endpoint mới trong commit)
- FE bundle hash 2 app changed (compare pre vs post)
- SignalR negotiate (gotcha #25 — if commit relates notification)
- EF migration latest prod == latest repo
Stage 5: Report PASS/FAIL with evidence + MEMORY.md update
⚠️ Anti-patterns observed (DO NOT)
- ❌ Push fix code — READ only, escalate to em main
- ❌ Speculate fail cause without log evidence
- ❌ Skip post-deploy live verify khi SUCCESS — bundle hash là biggest catch
- ❌ Skip MEMORY.md update
- ❌ Poll forever (max 10 iter ~10 min timeout)
- ❌ Auto-rollback — escalate với recommendation, KHÔNG tự chạy
- ❌ Verify khi commit docs-only — SKIPPED-DOCS + return ngay
🧠 SOLUTION_ERP CI/CD essentials
- Gitea: https://git.baocaogiaoduc.vn/vietreport-admin/solution-erp
- Workflow:
.gitea/workflows/deploy.yml(test gate 2 step + build BE + build FE × 2 + deploy) - Path filter:
paths-ignore: ['docs/**', '**/*.md', '.claude/skills/**'](gotcha #41) - Prod URLs: api / admin / eoffice
.solutions.com.vn - SSH VPS:
ssh vietreport-vps(user=Administrator, key=id_ed25519) - DB prod:
.\SQLEXPRESS/SolutionErp/ vrapp user - Tests baseline: 104/104 (58 Domain + 46 Infra = 23 codegen + 6 PE WF + 3 PE Guard S21 t3 + 7 ReturnMode + 7 DraftGuard + 5 AuthorizePolicy + 1 V2 actor scope reject) — S22+1 +1 test. Re-verified S22 chốt cuối 23:25 (Verify push range
3d725c4..cc8a7d3). - Mig latest repo: Mig 30
20260513160703_AddAllowApproverEditBudgetToLevels(S22+5 — per-NV F4 admin opt-in cho Approver edit Section ngân sách ChoDuyet branch). Prev Mig 29 (S21 t5 refactor per-NV) preserved. - Gitea Actions API path:
/api/v1/repos/{owner}/{repo}/actions/tasks?limit=N(NOT/runs— returns 404). Public no-auth read OK. Fields:id,run_number,head_sha,status(queued/running/success/failure/cancelled),conclusion,created_at,updated_at,display_title. - Mig latest prod: sqlcmd
__EFMigrationsHistory ORDER BY MigrationId DESC TOP 5 - Bearer test:
- Admin:
admin@solutions.com.vn / Admin@123456(full) - UAT non-admin:
nv.test@solutions.com.vn / TestUser@123456(Drafter CCM — verify gotcha #44 silent 403 patterns)
- Admin:
🔑 Critical config (gotcha cross-ref)
- Node CI pin:
20.x(memoryfeedback_node_cicd— bài học NamGroup) - MediatR pin:
12.4.1(gotcha #1) - Swashbuckle pin:
6.9.0(gotcha #2) - act_runner: manual checkout bypass github.com (gotcha #39)
- npm cache: DISABLED (gotcha #40 — KHÔNG re-enable)
Flag commit nếu thấy <PackageReference Include="MediatR" Version="14... hoặc cache: npm tái xuất hiện.
📊 Run stats baseline (cumulative)
- Build time BE (test_domain + test_infra + build_be): ~90s baseline
- Build time FE × 2 app: ~60s baseline mỗi app
- Deploy NSSM + IIS recycle: ~30s
- Total CI run time: ~3 min code commit / 0s docs-only commit
- Trend trigger: nếu run time > 5 min → escalate (cluster network slow hoặc dependency bloat)
- Bundle size baseline: fe-admin ~800KB gz / fe-user ~750KB gz (Vite production build)
📅 Recent runs (FIFO last 20)
-
2026-05-15 13:10-13:13 — Run #202 id=316 sha=
a1c8386VERDICT=PASS (S23 t5 Plan O HOTFIX cascade 4 lookup sites — push rangefb3c22c..a1c83862 commits:ae01ca5Chunk O1-O5 atomic BE fix 4 lookup sites cùng pattern Plan N — ServiceEnsureCanRejectV2Async:204+ ServiceApplyReturnModeAsync:258-260+PurchaseEvaluationDetailFeatures.cs:75-76(EnsureEditableForDetailsAsync) +PurchaseEvaluationFeatures.cs:314-315(AdjustBudgetCommandHandler) — all 4 sites add&& l.ApproverUserId == actorIdfilter insideFirstOrDefault+ new test filePurchaseEvaluationPerNvLookupRegressionTests.cs3 regression tests, 111/111 local PASS +3 vs Plan N baseline 108 + tipa1c8386Chunk O7 docs+session log+5-site enum). Duration 3min28s baseline. Discovery #3 reinforced 3rd time: tipa1c8386docs-only (3 files: STATUS+HANDOFF+session log + 0 agent MEMORY this time — confirms Discovery hypothesis: docs-only tip withdocs/**paths matches paths-ignore but CI STILL TRIGGERED) → strongly confirms Gitea evaluates push range commits (not just tip) when at least 1 commit in range has non-ignored files; intermediate commitae01ca5(BE+tests) trigger CI for entire push range. Anomaly is BENEFICIAL — catches verify gate. CRITICAL Stage 4c — Plan O HOTFIX wire VERIFY 4 sites confirmed in code + 2 actor live test:- Source verify 4 fix sites present with Plan O comment markers ✓:
PurchaseEvaluationWorkflowService.cs:204step.Levels.FirstOrDefault(l => l.Order == curLvl && l.ApproverUserId == actorId)+ throw if nullPurchaseEvaluationWorkflowService.cs:258-260step.Levels.FirstOrDefault(l => l.Order == evaluation.CurrentApprovalLevelOrder && l.ApproverUserId == actorUserId)(admin bypass viaif (!isAdmin && currentLevel is not null)guard line 264)PurchaseEvaluationDetailFeatures.cs:75-76step?.Levels.FirstOrDefault(lv => lv.Order == levelOrder && lv.ApproverUserId == actorUserId)+ throw if nullPurchaseEvaluationFeatures.cs:314-315step.Levels.FirstOrDefault(l => l.Order == curLvl && l.ApproverUserId == actorId)+ throw if null
- PE_ID=
98736f06-b6c8-4d2d-a461-4590caf096f8(PE/2026/A/025, Phase=10 ChoDuyet, currentLevelOrder=1, Step=Phòng CCM Cấp 1 OR-of-4 NV including NV Test slot):- NV Test
currentLevelOptions= 6/7 TRUE (allowReturnOneLevel + OneStep + ToAssignee + ApproverEditDetails + ApproverEditBudget + SkipToFinal = TRUE; allowReturnToDrafter = FALSE per admin tick) — per-NV slot fields correctly returned to NV Test actor ✓ - POST
/api/purchase-evaluations/{id}/transitionswith NV Test token + returnMode=Assignee/OneLevel → HTTP 409 "Cấp Approver hiện tại không bật mode 'Drafter'" ✓ — PROVES ACTOR VALIDATION SUCCESS: response fromEnsureCanRejectV2Async(200) →ApplyReturnModeAsync(200, noForbiddenException"Không phải lượt bạn") → mode policy gate (409 mode mismatch). Pre-Plan O bug would emit 403 "Không phải lượt bạn" at lookup site site 1; post-Plan O actor matches slot → proceeds to mode check ✓
- NV Test
- Stage 4a Auth: admin token len 468 ✓, nv.test token len 477 ✓
- Stage 4b Smoke 5/5 endpoints 200: purchase-evaluations / approval-workflows-v2 / contracts / menus / users ✓
- Stage 4d Bundle hash UNCHANGED 2/2 (expected, Plan O BE-only no FE touch): admin
D_JENTBi(= baseline Plan N Run #201), userCOJhbRxy(= baseline Plan N Run #201) ✓ - Stage 4e Mig prod TOP 1 =
20260514160124_RefactorSkipToFinalToApproverLevel(Mig 31) unchanged ✓ — Plan O no schema change - Test gate inferred PASS (deploy runs after tests; 111/111 local pre-push, +3 regression from 108)
- Caveat noted: Controller
TransitionPeBodyrecord (line 267) has only 3 fields(TargetPhase, Decision, Comment)— MISSINGReturnMode+ReturnTargetUserId+SkipToFinalfields that exist inTransitionPurchaseEvaluationCommandrecord (line 395). Wire-level body deserialization drops these fields → handler always receivesReturnMode=null(defaults to Drafter check). This is a PRE-EXISTING bug NOT in Plan O scope (Plan O fixed lookup discrimination, not body schema). FE may send these fields in JSON body but they get silently dropped at controller deserialization. Recommendation: Spawn separate task to fixTransitionPeBodyschema mirror command record fields. Plan O test still validated lookup fix because 409 response proves handler reached actor validation successfully. - Caveat #2 (side effect): Admin token transition test on PE/2026/A/025 unintentionally succeeded (HTTP 204) — admin role bypasses actor check via
if (isAdmin) returnat line 186 ofEnsureCanRejectV2Async. Phiếu state changed 10→98 (TraLai) at 06:18:31. Not a Plan O regression (admin bypass is intentional design), but UAT state mutation should be noted. Bro may want to revert via Phase=10 set or accept TraLai state. - Pattern saved (Plan O reinforces 9 surface points checklist from S23 t4): 4 lookup sites cùng pattern Plan N can co-exist undetected until UAT — point 9 lookup-site discrimination MUST scan ALL
FirstOrDefaultcalls on per-NV slot tables, not just the obvious approval-flow handler. 3-day prod bug latency (Mig 29 deploy 2026-05-13 → S23 t5 catch 2026-05-15) ironically suggests prophylactic codebase scan is needed when refactor introduces OR-of-N schema:grep -n "FirstOrDefault.*Order.*==" *.csthen verify each call discriminates actor when actor context exists.
- Source verify 4 fix sites present with Plan O comment markers ✓:
-
2026-05-15 12:42-12:45 — Run #201 id=315 sha=
fb3c22cVERDICT=PASS (S23 t4 Plan N HOTFIX push rangef4055a1..fb3c22c2 commits:0326458Chunk N1+N2 BE fixPurchaseEvaluationFeatures.cs:765per-NV lookup discrimination — line 765FirstOrDefault(l => l.Order == curLevelOrder && l.ApproverUserId == currentUser.UserId) ?? curStep?.Levels.FirstOrDefault(l => l.Order == curLevelOrder)admin/non-approver fallback + new test fileGetPurchaseEvaluationCurrentLevelOptionsTests.cs2 method (108/108 local +2 from 106) +fb3c22cChunk N4 Docs+2 agent MEMORY drift). Duration 3min26s baseline. Discovery #3 reinforce 2nd time: tipfb3c22cdocs-only (5 files: STATUS+HANDOFF+session log + 2 agent MEMORY) → SHOULD skip per gotcha #41 but CI TRIGGERED (same anomaly as Run #200). Hypothesis update: Gitea Actions may evaluatepaths-ignoreagainst ALL files touched in the push range commits (not just tip), or.claude/agent-memory/**paths slip through**/*.mdglob due to path-prefix semantics. Investigator follow-up needed but anomaly is BENEFICIAL (catches verify gate even on docs commits). CRITICAL Stage 4c — Plan N HOTFIX wire VERIFY SUCCESS on 2 PE x 2 actor matrix:- PE_ID=
59176ad5-80d1-4064-9426-700c151c397f(Sky Garden PE/2026/A/027):- Admin actor
currentLevelOptions= 1/7 TRUE (allowReturnToDrafter=trueonly) = fallback row đầu DB (Drafter-only profile of Lê Văn Bính / Trần Xuân Lưu / Hồ Thị Nữ Nguyên slot 1-3) - NV Test actor
currentLevelOptions= 7/7 TRUE (allowReturnOneLevel + OneStep + ToAssignee + ToDrafter + EditDetails + EditBudget + SkipToFinal ALL TRUE) = per-NV slot Bước 2 Cấp 1 admin tick
- Admin actor
- PE_ID=
6148ba7a-8a0d-405f-a03b-5f2c89bae115(huy test 15/05/2026 PE/2026/A/026):- Admin actor: same fallback 1/7 TRUE (allowReturnToDrafter only)
- NV Test actor: same 7/7 TRUE per-NV slot
- BUG FIXED CONFIRMED ✅: Pre-Plan N admin tick selectively per-NV was IGNORED (handler
FirstOrDefaultpicked Levels[0] DB-order regardless of actor). Post-Plan N actorApproverUserIddiscrimination active. 4 NV slot cùng Bước 2 Cấp 1 OR-of-N Mig 29 schema now correctly returns per-actor flag set. Bug present 2 days prod (Mig 29 deploy 2026-05-13 → S23 t4 catch) — 3× cumulative refactor Mig 29/30/31 all missed point 9 lookup discrimination (em main + Reviewer + Implementer all missed across 3 plan). - Stage 4a Auth: admin token len 468 ✓, nv.test token len 477 ✓
- Stage 4b Smoke 5/5 endpoints 200: purchase-evaluations / approval-workflows-v2 / contracts / menus / users
- Stage 4d Bundle hash UNCHANGED 2/2 (expected, Plan N BE-only no FE touch): admin
D_JENTBi(= baseline Plan M Run #200), userCOJhbRxy(= baseline Plan M Run #200) - Stage 4e Mig prod TOP 1 =
20260514160124_RefactorSkipToFinalToApproverLevel(Mig 31) unchanged ✓ — Plan N no schema change - Test gate inferred PASS (deploy stage runs only after tests; 108/108 local pre-push +2 from 106 = +2 regression test cho per-NV lookup discrimination)
- Pattern saved: per-NV admin opt-in flag wire surface point 9 = lookup discrimination in lookup-site handler (extends checklist 8 from S23 t1 K11 to 9). Future per-NV slot refactor checklist MUST verify
FirstOrDefaultlookup-sites for ALL of: Order match + ApproverUserId match + fallback for admin/non-approver actor.
- PE_ID=
-
2026-05-15 ~11:21-11:25 — Run #200 id=314 sha=
f4055a1VERDICT=PASS (S23 t3 Plan M push range83c9f7b..f4055a14 commits: Chunk M1 BE Service F1.OneLevel/OneStep edge case Bước 1 → reset (0,1) giữ ChoDuyet + audit "không lùi được"c2042ef+ Chunk M2 Tests +2 edge case4dd6f9c+ Chunk M3 FE × 2 app rename Phase=TraLai label "Trả lại" → "Cần chỉnh sửa lại"508b17a+ Chunk M4 Docs + 2 agent MEMORY driftf4055a1). Duration 3min24s baseline. Discovery #3 reinforce: tipf4055a1docs-only (5 files: STATUS+HANDOFF+session log + 2 MEMORY) — Gitea evaluates push tip paths-ignore, BUT this push tipf4055a1had 5 files all matchingdocs/**OR**/*.mdglob → should have SKIPPED per gotcha #41. Anomaly: Run #200 DID trigger CI on docs-only tipf4055a1. Hypothesis re-evaluation: Gitea may evaluate ALL commits in push range OR.claude/agent-memory/**not matching**/*.mdfrom a specific path-segment perspective. Investigator to verify with controlled test. Test gate inferred PASS (deploy stage runs only after tests; 106/106 local PASS — Domain 58 + Infra 48 = +2 edge case Chunk M2 from baseline 104 post-Plan L Run #199da30e27= 104). Mig prod TOP 1 =20260514160124_RefactorSkipToFinalToApproverLevel(Mig 31) unchanged ✓ — Plan M scope = no schema change. Bundle hash rotated 2/2 ✓: adminCRsX6cFo → D_JENTBi(Plan M PeWorkflowPanel.tsx + types/purchaseEvaluation.ts wired), userX7qb4Zl4 → COJhbRxy(same 2 FE files mirror). Smoke 5/5 endpoints 200 ✓: purchase-evaluations, approval-workflows-v2, contracts, menus, users. Auth bearer admin OK (token len 468). F1 edge case logic deployed (BE Service line 287-333): F1.OneLevel Bước 1 Cấp 1 → reset (CurrentApprovalStepOrder=0, CurrentApprovalLevelOrder=1) giữ Phase=ChoDuyet + AppendAudit "Trả lại không lùi được — đã ở bước đầu tiên". F1.OneStep Bước 1 → same reset + audit. F1.Drafter mode (line 268-275) GIỮ NGUYÊN Phase=TraLai (regression safety). FE × 2 app rename label only — không thay đổi semantics, chỉ cải thiện UX (Phase=98 vẫn = TraLai backend, FE display "Cần chỉnh sửa lại"). Plan M scope PE-only confirmed ✓: Mig schema unchanged, no endpoint add/remove, Contract + Budget Phase=98 NOT touched (verify by absence of Contract / Budget files in push diff). Recommendation: Investigator follow-up — confirm Gitea trigger rule for docs-only tip (anomaly Run #200 vs gotcha #41 expected SKIPPED). If.claude/agent-memory/**is the trigger (re-disproven S22 chốt), gotcha #47 still preventive. Plan M deploy complete + 0 regression. -
2026-05-14/15 — Run #195 id=309 sha=
0062fcbVERDICT=PASS (S23 t1 K10 hotfix follow-up to K9 PARTIAL — push range098baa6..0062fcb1 commit). Em main solo 4-edit hotfixApprovalWorkflowV2AdminFeatures.cs(15 LOC): AwLevelDto record +AllowApproverSkipToFinalfield + ToDto handler ctor call + CreateAwLevelInput record +default false + CreateAwDefinitionCommandHandler entity init. Run completedstatus=successbaseline ~3min. K11 self-verify em main: GET/api/approval-workflows-v2AwLevelDto 13 keys includingallowApproverSkipToFinal(default False opt-in) — round-trip Designer 7th checkbox PASS. Plan K + K10 cumulative 9 commits S23 t1 deploy complete. Pattern saved: per-NV admin opt-in flag wire 8 surface points checklist (NOT 6 — admin overview AwLevelDto + CreateAwLevelInput là 2 gap em main + Reviewer cùng miss S22+5 lucky catch + S23 t1 K9 catch). Memoryfeedback_per_nv_permission_scope.mdupdated wire checklist gotcha. -
2026-05-14 ~16:30 — Run #194 id=308 sha=
098baa6VERDICT=PARTIAL (Plan K 8 commits S23 t1 Mig 31 F2 refactor sang per-Approver-slot — push rangeeb106f2..098baa6). Run completedstatus=success. Mig 31 prod TOP 1 =20260514160124_RefactorSkipToFinalToApproverLevel✓. Schema swap verified:ApprovalWorkflowLevels.AllowApproverSkipToFinalcolumn count=1 (added) +Users.AllowDrafterSkipToFinalcolumn count=0 (dropped) ✓. 33 active users preserved ✓. Bundle hash 2/2 rotated ✓: adminCpI5OL8n → CRsX6cFo, userd064StNa → X7qb4Zl4. Smoke 5/5 endpoints 200: contracts/pe/menus/approval-workflows-v2/users. K5 zombie endpoint cleanup PASS ✓: PATCH/api/users/{id}/allow-skip-finalreturns 404 (endpoint removed). K5 UserDto cleanup PASS ✓: GET/api/usersresponse keys = canBypassReview/createdAt/departmentId/departmentName/email/fullName/id/isActive/isLocked/position/positionLevel/roles — NOallowDrafterSkipToFinalfield. CRITICAL FAIL — K3 DTO mirror INCOMPLETE: GET/api/approval-workflows-v2AwLevelDto returns 12 keys (id/order/name/approverUserId/approverUserName/approverEmail + 6 Allow*: ReturnOneLevel/ReturnOneStep/ReturnToAssignee/ReturnToDrafter/ApproverEditDetails/ApproverEditBudget) butallowApproverSkipToFinalfield MISSING across all 13 levels of 3 workflow types. Source-code grep confirms:src/Backend/SolutionErp.Application/ApprovalWorkflowsV2/ApprovalWorkflowV2AdminFeatures.csline 23-38AwLevelDtorecord params end atAllowApproverEditBudget—AllowApproverSkipToFinalmentioned only in comment line 60, NOT as actual record param. HandlerToDtoline 156-158 also missing the field innew AwLevelDto(...)ctor call. Domain entity + Mig 31 schema OK, but Application DTO + Handler not wired to expose new column → FE Designer 7th checkbox shipped but BE never returns the value → 7th checkbox always reads/writes nothing visible. Need K3 follow-up patch: addAllowApproverSkipToFinalto record params +ToDtoctor + CreateAwLevelInput + UpdateAwLevelInput + EF mapping → unblock Designer 7th checkbox round-trip. Plan K verdict summary: 8-commit deploy ✓ / Mig 31 schema ✓ / Service Approver F2 branch live (presumed — Workflow service code path not tested in live verify, only schema visible) / Designer 7th checkbox FE shipped but BE field missing ✗ / Zombie endpoint backout ✓ / Workspace toggle × 2 app FE shipped (presumed — not directly verified) / Tests baseline preserved (presumed — CI deploy stage succeeded). Recommendation: Spawn K10 hotfix patch — addAllowApproverSkipToFinalto AwLevelDto record + ToDto handler + CreateAwLevelInput + UpdateAwLevelInput + corresponding command handlers (lines 184-238 area). Re-run CI/CD verify. Token cost: ~28k. -
2026-05-13 23:25 — Verify S22 chốt cuối cumulative (push range
3d725c4..cc8a7d312 commits) VERDICT=PASS (S22 chốt — em main spawn cumulative verify cuối S22). Latest CI run #193 id=307 sha=b04a11a(S22+5 Chunk B FE) success at 23:16. Tip commitcc8a7d3(docs+4 agent MEMORY.md) → CI SKIPPED via**/*.mdglob (all 4.claude/agent-memory/*.md+ 4docs/**files match — paths-ignore correctly fires). Spec hypothesis ("gotcha #47 —.claude/agent-memory/**NOT in paths-ignore → trigger CI") disproven for this commit:**/*.mdglob matches.mdfiles at ANY depth so.claude/agent-memory/MEMORY.mdDOES match. Run #188a74e671trigger anomaly was NOT due to agent-memory path. Gotcha #47 still useful as PREVENTIVE for future when adding non-.md state files under.claude/agent-memory/(e.g..jsonstate,.log) — explicit'.claude/agent-memory/**'ignore would future-proof. Recent runs S22 sequence (12 commits → 11 trigger + 1 skip): #189 sha=40f64c6 ✓ (S22+1 BE guard) · #190 sha=8185070 CANCELLED by concurrency (seed users script superseded by next push within 3 min — normal not a fail) · #191 sha=0e70789 ✓ (rename script) · #192 sha=30d51c8 ✓ (S22+4 FE) · #193 sha=b04a11a ✓ (S22+5 FE — also covers S22+5 Chunk A BEb079b27since both pushed batched; Gitea trigger only on push tip).cc8a7d3skip = correct (no run 308). Discovery #3: When 2+ commits pushed in samegit push, Gitea Actions evaluates ONLY the push tip's paths against paths-ignore — intermediate commits do NOT each get evaluated separately. Sob079b27(BE Mig 30) +b04a11a(FE Mig 30) pushed together → single Run #193 on tip. Test gate inferred PASS for all 11 trigger runs (each deploy stage succeeded). Local test verify 104/104 PASS (58 Domain + 46 Infra = +1 vs Run #188's 103 — S22+1 added 1 BE guard test). Mig 30 prod confirmed: sqlcmd TOP 5 =20260513160703_AddAllowApproverEditBudgetToLevelsTOP 1 (S22+5 wire). Schema live verify: PE detailcurrentLevelOptions6 keys (5 from Mig 29 + 1 newallowApproverEditBudget) ✓, AwLevelDto 12 keys includingallowApproverEditBudget✓. Endpoint wire LIVE: PATCH/api/users/{id}/allow-skip-finaladmin=204 ✓ + act.nv=403 ✓ (Plan D admin-only enforce) · PATCH/api/purchase-evaluations/{id}/budget-adjustadmin=204 ✓ (S22+4 BE) · GET/api/purchase-evaluations/{id}/attachments/{attId}/view200 +Content-Disposition: inline; filename="HD- Eoffice.pdf"✓ (S22+4 preview). Plan E strict V2 scope LIVE: admin pageSize=200 → 17 PE / act.nv pageSize=200 → 0 PE (Drafter strict filter active; act.nv fresh user no PE participation). Bundle hash rotated 2/2: adminCclc8Uwu→CpI5OL8n✓ (S22 cumulative FE deploy) / userB6N5hq3d→d064StNa✓ (S22+4 + S22+5 touched fe-user — rotation expected). Smoke 5/5 endpoints 200: contracts, pe, users, menus, approval-workflows-v2. 33 active users prod confirmed (20 role-based new from S22+2 seed + S22+3 rename: act/pp/tp · bod.1/2 · equ/fin/hra/pm/qs nv/pp/tp + 13 pre-existing). All role-based usersisActive=true+ loginact.nv@solutions.com.vn / TestUser@2026OK with rolesDrafter,Accounting. Token caching pattern from Run #188 worked: 1 admin login + 1 act.nv login total = 2 auth requests cached toC:\Users\pqhuy\AppData\Local\Temp\*_token.txt+ 8 subsequent endpoint calls reuse token → no 429 rate limit encountered (vs Run #188 hit 429). Trend: S22 cumulative 5 turn iteration delivered Mig 30 + 3 new endpoints + scope filter + 20 seed users — 0 deploy regression. Baseline cumulative passes 81→103→104 test grow consistent with feature delivery. -
2026-05-13 21:25-21:28 — Run #188 id=302 sha=a74e671 VERDICT=PASS (S22 — 5 commits: Plan D Users F2 toggle BE+FE Admin AllowDrafterSkipToFinal + Plan C task 1-3 14 service test ReturnMode/Guard + Plan C task 4 5 regression test #44 silent 403 + Plan E PE strict V2 scope + Docs/MEMORY 3-agent drift patch). Duration 3m28s (baseline). Path filter: the push tip
a74e671includes.claude/agent-memory/**files (NOT in paths-ignore) +docs/**(in paths-ignore) → Gitea evaluated push as CI-eligible (some files OUTSIDE paths-ignore), trigger fired correctly. Local test verify: 58 Domain + 45 Infra = 103/103 PASS (+19 from S21 84) breakdown: 23 codegen + 6 PE WF + 7 ReturnMode + 7 DraftGuard + 5 AuthorizePolicy regression. CI deploy succeeded → inferred test gate PASS (deploy only runs if tests pass). Bundles deployed: adminindex-Cclc8Uwu.jsrotated fromD5l49-70(21:27:24 PM VPS), userindex-B6N5hq3d.jsUNCHANGED (Plan C/D/E touched only fe-admin, expected). DLLs deployed 21:25-26 PM. Mig 29RefactorAdvancedOptionsToPerLevelAndDrafterUserstill TOP 1 (no new mig in S22, expected). Plan D wire LIVE: GET/api/usersresponse includesallowDrafterSkipToFinalfield (boolean), PATCH/api/users/{id}/allow-skip-finaladmin=204 ✓ + nv.test=403 ✓ (admin-only enforced). Plan E wire LIVE: nv.test PE list totalCount=8 < admin totalCount=17 (strict V2 scope filter ACTIVE — drafter only sees own + participant PE). Smoke 5/5 endpoints 200:/api/contracts,/api/purchase-evaluations,/api/menus,/api/approval-workflows-v2,/api/users. Discovery #1: Rate limit auth login triggers at ~5 requests/min — HTTP 429. Pattern: backoff 60s + retry. Spread login calls or cache token across endpoints in same agent run. Discovery #2:.claude/agent-memory/**files are NOT in paths-ignore (onlydocs/**+**/*.md+.claude/skills/**+.gitignore+scripts/**.md) → MEMORY.md commits DO trigger CI even when "looks like docs". Spec assumption ("docs commita74e671triggers paths-ignore skip per gotcha #41") was incorrect for this case —.claude/agent-memory/**triggers CI. -
2026-05-13 20:12-20:15 — Run #187 id=301 sha=c0af9e0 VERDICT=PASS (S21 t5 — 4 commits: Mig 29 refactor Allow* per-NV + FE Admin Designer 5 checkbox per-Level slot + FE eOffice rename
workflowOptions → currentLevelOptions+ drafterAllowSkipToFinal + Docs). Duration ~3m18s (baseline). Test gate inferred PASS (deploy stage chỉ chạy sau test gate). Mig 29 applied prod (TOP 1 in __EFMigrationsHistory). Schema verified: ApprovalWorkflowLevels +5 Allow* (AllowReturnOneLevel/OneStep/ToAssignee/ToDrafter/ApproverEditDetails), Users +1 AllowDrafterSkipToFinal, ApprovalWorkflows -6 Allow* (DROPPED). Backfill: 48/48 Levels.AllowReturnToDrafter=1 (default + S21 t4 workflow.AllowReturnToDrafter=true copied đúng), 0/13 Users.AllowDrafterSkipToFinal=1 (S21 t4 workflow.AllowDrafterSkipToFinal=false → 0 user backfill — preserve correct). Bundles deployed 20:14-20:15 (adminindex-D5l49-70.jswasCzesdXLh, userindex-B6N5hq3d.jswasDP-gH4LW— both rotated ✓). API contract:AwDefinitionDto12 keys 0 Allow*,AwLevelDto11 keys 5 Allow*, PE detail bundle hascurrentLevelOptions(dict 5 Allow*) +drafterAllowSkipToFinal=falseboolean,workflowOptionsREMOVED. Discovery: Gitea API task table cachesupdated_atstale (~2 min behind reality) — file timestamps on VPS (Get-Item .dll/.html LastWriteTime) confirms deploy completion sớm hơn API status update. Cross-check 2 source nếu time-sensitive. Also:appsettings.Production.jsonởC:\inetpub\solution-erp\api\chứa connection string credential (user=vrapp / pwd=buKL3TGBkD0wDDbYVw65QeX9) khi$env:PROD_DB_PASSWORDempty local. -
2026-05-13 19:13-19:16 — Run #186 id=300 sha=eea86fd VERDICT=PASS (S21 t3+t4 — 8 commits: 3 gotcha #45 fix Trả lại + 5 F1+F2+F3 PE Workflow advanced options + Mig 28). Duration 3m32s (baseline). Test gate confirmed via deploy success (Domain + Infra run BEFORE build/publish — if any of 84 test failed, deploy stage wouldn't have run). Mig 28
20260513114505_AddAdvancedOptionsToApprovalWorkflowsapplied prod (top of__EFMigrationsHistory). FE bundles deployed 19:15 (adminindex-CzesdXLh.js+ userindex-DP-gH4LW.js). Smoke 200:/api/auth/login,/api/approval-workflows-v2?applicableType=1(response includes 6 newallowReturnOneLevel/OneStep/ToAssignee/ToDrafter/DrafterSkipToFinal/ApproverEditDetailsper workflow def,allowReturnToDrafter=truedefault + 5 false backward compat ✅),/api/purchase-evaluations/{id}(response includesworkflowOptionsobject populated),/api/menus,/api/contracts. Discovery: API endpoint to list Gitea Actions runs is/api/v1/repos/.../actions/tasks(NOT/actions/runs— 404). Public no-auth OK for read. -
2026-05-12 (setup): CI/CD Monitor agent initialized. Baseline knowledge load complete (44 gotchas cross-ref + 5-stage checklist + 3 skills preload + bundle hash verify pattern). No runs monitored yet.
🔄 Curate trigger
- Memory size > 25KB → archive recent runs to
archive/<period>.md - Duplicate failure patterns → merge into single entry (vd act_runner timeout x3 → 1 entry)
- Stale > 3 months → remove
Last curate: 2026-05-15 13:18 (added S23 t5 Plan O HOTFIX Run #202 entry: PASS verdict + CRITICAL wire verify 4 sites confirmed in code via Grep + live NV Test POST transition test on PE/2026/A/025 returned 409 mode-mismatch NOT 403 actor-mismatch = Plan O actor discrimination active on all 4 sites. Bundle hash unchanged expected. Mig 31 TOP 1 unchanged. 111/111 test baseline +3. Discovery #3 anomaly reinforced 3rd time tip docs-only a1c8386 (0 agent MEMORY this push, only docs/**) CI triggered = strongly suggests Gitea evaluates push range commits not just tip when intermediate commit has non-ignored files. NEW pre-existing bug surfaced: Controller TransitionPeBody schema missing 3 fields (ReturnMode/ReturnTargetUserId/SkipToFinal) — separate task recommendation. Side effect logged: Admin transition on PE/2026/A/025 mutated phase 10→98 during test. Memory size ~35KB approaching curate trigger; FIFO runs at ~8 entries.)