16 KiB
16 KiB
implementer-backend/2026-05-q1 — gist
distill-gen: 1 source-verbatim: .claude/agent-memory/implementer-backend/archive/2026-05-q1.md (12 entry → 5 cụm) pointer-style: substring
TỔNG-HỢP (3-5 ý)
- Tỉ-lệ TỪ-CHỐI gần tuyệt-đối cả quý (S21 t3-t5: 3/3 · S22: 100% · S23 t4→t11: 8 plan liên-tiếp 0 spawn · S24: 4/4) theo 7 tiêu-chí phạm-vi — verbatim tự đối-chiếu khớp cảnh-báo Anthropic "tightly interdependent coding"; ranh-giới đo bằng độ ràng-buộc chéo lớp (tiêu-chí #3/#4), không bằng kích-thước diff, và mỗi lần từ-chối ghi kèm tiêu-chí thì tỉ-lệ mới đọc được về sau.
- Chuỗi K Mig 31 (pre-A → K1 → K3 → K5 → K7): refactor đổi chỗ lưu cờ Users→Levels có chunk dọn-rác riêng (K5) + grep-về-ZERO 5 biến-thể tên + test 3 xoá/3 thêm triệt-tiêu giữ baseline 104; mất dữ-liệu prod CÓ CHỦ-ĐÍCH (Option A không backfill, khai đích danh 4 tài-khoản); nợ kỹ-thuật được ĐẶT LỊCH (test vỡ để lại cho K7), không bỏ quên.
- Mục "Mismatches discovered" tự khai 4 chỗ đoán sai (per-NV mặc-định vs cờ admin bật riêng → Mig 30 ·
PE.changelogsvắng ⇒ TS2339 · Dialogsize="xl"không tồn-tại ·accessToken≠token⇒ 401) — giả-định hình-dạng API/thư-viện phải kiểm bằng đọc, không bằng trí nhớ; bẫyaccessTokencắn 2 vai khác nhau (tái-xuất ở cicd-monitor Run #221). - 3 pattern FE mới 13/14/15 từ Plan AA (read-only mirror Designer · Tailwind JIT full-class-string · rowSpan flat-row builder); shadcn fe-user là subset thiếu hẳn
Card/Badge— 2 app tưởng song sinh nhưng kho UI lệch nhau.
Entries
[cao] F1 — Nhật-ký TỪ-CHỐI: vai này ghi cả việc mình KHÔNG làm
- VIỆC: phân-loại việc được giao theo 7 tiêu-chí phạm-vi, trả lại việc không hợp.
- KẾT-LUẬN: S21 t3-t5 từ-chối 3/3; S22 từ-chối 100%; S23 t4→t11 8 plan liên-tiếp em-main tự làm, 0 lần spawn (N+O 5 site lookup · P Controller ~6 LOC · Q CSS 8 LOC · R+S+T5 xoá dữ-liệu prod ~720 dòng qua 4 file
.sql· T cờ DemoSeed ~25 LOC · U sidebar 25 LOC); S24 4/4 từ-chối đúng, mỗi ca ghi rõ commit + tiêu-chí (da218f1#6 vặt <30 phút ·4d60598#2 luồng UX ·fbbd361#2 ·ee0902a#6). Lý-do chính: tiêu-chí #3 (xuyên >2 lớp) + #4 (chuỗi suy-luận sửa lỗi). - BÀI-HỌC: ranh-giới "được giao" phải quyết theo độ ràng-buộc chéo lớp, không theo kích-thước diff — và mỗi lần từ-chối phải ghi lại kèm tiêu-chí thì tỉ-lệ mới đọc được về sau.
- BẤT-NGỜ: cả một quý mà tỉ-lệ từ-chối gần như tuyệt-đối; verbatim tự đối-chiếu: "REFUSE rate 100% match Anthropic warning 'tightly interdependent coding'" — tức vai tự xác-nhận giới-hạn của chính mô-hình chia việc, chứ không cố nhận cho có. → substring:"tightly interdependent coding"
[cao] F2 — Chuỗi K Mig 31: đổi chỗ lưu cờ F2 từ Users sang ApprovalWorkflowLevels
- VIỆC: 5 chunk nối tiếp trong S23 t1 (pre-A → K1 → K3 → K5 → K7).
- KẾT-LUẬN: pre-A đổi nhãn slot Designer (
ApprovalWorkflowsV2Page.tsx:873, trafullNametừusersListđã có sẵn ~:500, khuôn.findđã dùng ở:535). K1 Mig 31 ADD-DROP không BACKFILL (Option A) — 6 file BE, cắt -37 LOC nhánh Drafter SUBMIT (PurchaseEvaluationWorkflowService.cs:121-157), 4 chỗ vỡ biên-dịch vá bằng sentinelfalse+ marker K2, giữ tham-số thứ 8bool skipToFinalđể K2 dùng lại. K3 checkbox thứ 7 = 7 tiểu-mục nguyên-tử (type → default → propagate?? false→ vị-trí cuối nhóm → viết lại banner~:623→ body mutation). K5 dọn zombie: xoá endpointPATCH /allow-skip-final, xoá field DTO/Command/Handler, viết lại 6 chỗ chú-thích lỗi-thời, xoá cột "Skip cuối" FE — rồi grep 5 từ-khoá ra ZERO toànsrc/Backend+fe-admin/src(+42/-94 LOC / 9 file). K7 xoá 3 test Drafter đã hết nghĩa + thêm 3 test Approver, helper mớiSeedApproverF2WorkflowAsync(2 Bước × 2 Cấp để chứng skip không rơi sang Bước kế) ⇒ 104 PASS, baseline không đổi vì 3 xoá + 3 thêm triệt tiêu nhau. - BÀI-HỌC: refactor đổi chỗ lưu-trữ phải có chunk dọn rác riêng (K5) và kết bằng grep-về-0 trên nhiều biến-thể tên (PascalCase / kebab / camel / nhãn tiếng Việt / tên icon) — không thì cờ chết vẫn còn dấu vết khắp nơi. Test cũng phải xoá thứ đã hết nghĩa, đừng chỉ thêm.
- BẤT-NGỜ: (i) chấp-nhận mất dữ-liệu prod có chủ-đích — Option A không backfill, khai đích danh 4 tài-khoản mất giá-trị (
fin.pp,pm.nv,nv.test,truong.nguyen); (ii)UserConfiguration.cskhông tồn-tại —Userđược cấu-hình inline trongApplicationDbContext.OnModelCreating~:86nên không cóHasDefaultValue, EF vẫn tự nhận đổi prop; (iii) test hỏng do K1 được cố-ý để lại cho K7 (...ReturnModeTests.cs:253), tức nợ kỹ-thuật được đặt lịch chứ không bỏ quên. → substring:"SeedApproverF2WorkflowAsync"
[cao] F3 — Bốn "Mismatch" tự khai ở S22
- VIỆC: ghi lại 4 chỗ hiểu sai giữa ý bro và cách vai định làm.
- KẾT-LUẬN: (1) "người điều chỉnh cũng là người duyệt" — vai định cho mặc-định Approver luôn được phép, bro chỉnh thành cờ admin bật riêng (thành Mig 30); (2)
PE.changelogskhông có trongPeDetailBundle⇒ dựng lịch-sử trongBudgetAdjustSectionfail TS2339, phải bỏ và hoãn sang S23 bằng endpoint fetch riêng; (3)Dialog size="xl"không tồn-tại (chỉsm|md|lg) ⇒ dùnglgcho iframe xem trước; (4) field đăng-nhập làaccessToken, không phảitoken⇒seed-test-users-prod.ps1401 ở lần đầu, sửa thành$authResp.accessToken. - BÀI-HỌC: phải chốt "mặc-định vs admin bật riêng" TRƯỚC khi mở rộng phạm-vi quyền — đây là loại nhầm không lộ ra ở compile mà lộ ở nghiệm-thu. Ba cái còn lại chung một gốc: giả-định về hình-dạng API/thư-viện phải kiểm bằng đọc, không bằng trí nhớ.
- BẤT-NGỜ: vai chủ-động mở mục "Mismatches discovered" để ghi cái mình đoán sai — và mục này về sau là phần giá-trị nhất của entry; nhầm về
accessTokencòn tái-xuất ở cicd-monitor (Run #221) ⇒ cùng một bẫy cắn hai vai khác nhau. → substring:"Mismatches discovered"
[vừa] F4 — Plan AA: trang matrix chỉ-đọc cho fe-user
- VIỆC: dựng bản xem quy-trình V2 đã ghim cho phía user (3 file: types ~55 LOC + page ~215 LOC + route).
- KẾT-LUẬN: PASS — lọc ở BE bằng
?isUserSelectable=truethay vì lọc ở FE; bảng 10 cột (3 meta + 7 cờ Allow*), rowSpan theo Bước, đủ 3 trạng-thái Loading/Error/Empty, route đặt trước/workspace. Đúc 3 pattern mới: 13 (mirror trang Designer ở dạng chỉ-đọc = bỏ mutation + tái-dùng DTO dạng subset), 14 (Tailwind JIT phải viết chuỗi class đầy đủ trong mảng), 15 (helper dựng hàng phẳng cho rowSpan). - BÀI-HỌC: làm bản chỉ-đọc thì đẩy điều-kiện lọc về BE — vừa gọn FE vừa tránh lộ dữ-liệu không được xem. Và phải kiểm kho
components/ui/của đúng app TRƯỚC khi import. - BẤT-NGỜ:
shadcncủa fe-user thiếu hẳnCard/Badge(chỉ có 6 thành-phần) — 2 app tưởng song sinh nhưng kho UI lệch nhau, phải nội-suy bằng<div>/<span>thuần cho khớp mắt với Designer bên admin. → substring:"WorkflowMatrixViewPage"
[vừa] F5 — Plan M: mở-rộng helper + đổi nhãn có kỷ-luật
- VIỆC: M2 thêm 2 test ca-biên "Bước 1 không lùi được"; M3 đổi nhãn hiển-thị Phase 98 "Trả lại" → "Cần chỉnh sửa lại".
- KẾT-LUẬN: M2 mở-rộng
SeedWorkflowAsyncthêm 2 tham-số tuỳ-chọn mặc-địnhfalse(không clone helper, 4 test cũ không vỡ) ⇒ 106/106; khẳng-định assert đúng chỗ:Summarylà chuỗi cố-định"Chuyển phase {from} → {to}"nên câu "không lùi được" phải tìm ởContextNote. M3 đổi đúng 8 dòng / 4 file × 2 app, và liệt-kê rõ 4 nhóm KHÔNG đụng (nút hành-động← Trả lạilà động-từ, nhãn 4 mode, chú-thích lý-do,types/contracts.ts+types/budget.tsngoài phạm-vi). - BÀI-HỌC: phân-biệt "nhãn trạng-thái" ⟂ "động-từ hành-động" khi đổi chữ — cùng một chuỗi "Trả lại" mà một chỗ phải đổi, một chỗ không. Danh-sách KHÔNG-đụng có giá-trị ngang danh-sách đã-đụng.
- BẤT-NGỜ: vai tự đặt ngưỡng chống-nghịch: "anti-fiddle <20% LOC" và tự biện-hộ vì sao 2 chuỗi inline ngoài spec vẫn được sửa (cùng ngữ-nghĩa "tham-chiếu trạng-thái") — tự ràng mình bằng con-số trước khi bị hỏi. → substring:"Cần chỉnh sửa lại"
Phụ-lục token (coverage)
- gotcha#:
#45(bug Trả lại — lý-do REFUSE) ·#44(Authorize policy — Pattern 10, 5 test ~50 LOC) · "45 gotcha" (mốc S21) / "46 gotchas unchanged" (mốc S22) - criteria# (7 tiêu-chí phạm-vi):
#2luồng UX ·#3xuyên >2 lớp ·#4chuỗi suy-luận sửa lỗi ·#6vặt <30 phút - Pattern#:
2EF migration 3-file rule ·3audit-reuse EXTEND không clone helper ·5mirror 2 app strict ·7per-NV admin opt-in ·8tách endpoint narrow scope ·9defense-in-depth FE+BE guard pair ·10Reflection-based Authorize regression ·11test-infra helper cookie-cutter ·12InternalsVisibleTo·13read-only mirror Designer (MỚI) ·14Tailwind JIT full class string (MỚI) ·15rowSpan flat row builder (MỚI) ·16-18(S25 wrap, chỉ nhắc ở header) ·19(S26 Plan AG, chỉ nhắc ở header) - surprise: "Surprise: shadcn fe-user KHÔNG có
Card/Badge" · "UserConfiguration.csfile không tồn tại — User entity configured inlineApplicationDbContext.OnModelCreating~line 86" · "Dialogsize=\"xl\"NOT supported" · "API auth fieldaccessTokenkhông phảitoken... FAIL 401" · "PE.changelogsKHÔNG có trong PeDetailBundle ... build FAIL TS2339" · "accept lose 4 prod user valuefin.pp+pm.nv+nv.test+truong.nguyen" · "3 deleted + 3 added cancel out, baseline preserved" · "REFUSE rate 100% match Anthropic warning 'tightly interdependent coding'" · "Grep ... ZERO results" · "Test compile error ... left for K7 chunk (spec exclude test scope)" · "Anti-fiddle threshold <20% LOC respected" · "Cookie-cutter 0 (lần đầu pattern)" · "2 pre-existing DocxRenderer warn" (lặp 3 lần) - guard:
HasDefaultValue(false)(ApprovalWorkflowConfiguration.cs) · sentinelfalse+ marker comment K2 tại 4 site vỡ biên-dịch · tham-số tuỳ-chọn mặc-địnhfalsegiữ tương-thích 4 test cũ · grep-về-ZERO 5 biến-thể (AllowDrafterSkipToFinal·allow-skip-final·allowDrafterSkipToFinal·Skip cuối·FastForward) ·InternalsVisibleTo(Pattern 12) · guard đôi FE+BE (Pattern 9) ·dotnet build0 err +npm run build0 TS err trước khi khai PASS · ngưỡng anti-fiddle <20% LOC · route đặt trước/workspace - root-cause:
PeDetailBundlekhông phơichangelogs⇒ TS2339 khi dựng lịch-sử tại chỗ · Mig 31 chuyển chỗ lưu ⇒ 4 site Application vỡ biên-dịch + 1 test tham-chiếu prop đã xoá (:253) ·EditLevelEntrykhông cóapproverFullName(chỉLevelDtoBE cóapproverUserName) ⇒ phải tra từusersList· shadcn fe-user là subset tối-thiểu ⇒ thiếu Card/Badge ·Summarylà chuỗi cố-định ⇒ nội-dung động phải nằm ởContextNote(service:96-99→LogTransition) - file:line / định-danh (BE):
ApprovalWorkflow.cs(+AllowApproverSkipToFinal; narrative :78-80; docstring :108) ·User.cs(−1 prop) ·ApprovalWorkflowConfiguration.cs(:22-24 narrative, :87 storage-move comment) ·PurchaseEvaluationWorkflowService.cs:121-157 (−37 LOC), :287-333 (F1 edge), :96-99 (comment → ContextNote) ·UserFeatures.cs·SetUserAllowDrafterSkipToFinalCommand(+Handler)·UsersController.cs+SetAllowDrafterSkipToFinalBody·PurchaseEvaluationFeatures.cs:401 ·ApprovalWorkflowV2AdminFeatures.cs:58 ·IPurchaseEvaluationWorkflowService.cs·PurchaseEvaluationDtos.cs·ApplicationDbContext.OnModelCreating~:86 ·DbInitializer.cs(cờ DemoSeed ~25 LOC) - file:line / định-danh (test + FE):
PurchaseEvaluationWorkflowServiceReturnModeTests.cs:253 (vỡ, để cho K7), :241 (chèn 2[Fact]mới) · helperSeedWorkflowAsync/SeedApproversAsync/SeedApproverF2WorkflowAsync(2 Bước × 2 Cấp) /BuildPeAtLevel2· test xoá:SkipToFinal_DrafterAllowed_SetsPointerToFinalLevel·SkipToFinal_DrafterDenied_NonAdmin_Throws·SkipToFinal_AdminBypass_Succeeds· test thêm:ApproveV2_SkipToFinal_AdminTickFlag_SetsPhaseDaDuyet·ApproveV2_SkipToFinal_FlagOff_NonAdmin_ThrowsConflictException·ApproveV2_SkipToFinal_FlagOff_Admin_BypassesFlagCheck·ApplyReturnMode_OneLevel_AtStep1Level1_ResetsToBuoc1Cap1_KeepsChoDuyet·ApplyReturnMode_OneStep_AtStep1_ResetsToBuoc1Cap1_KeepsChoDuyet·ApprovalWorkflowsV2Page.tsx:873, ~:500, :535, banner ~:623, stale :75 + :504 (hoãn K6) ·UsersPage.tsx+types/users.ts·types/purchaseEvaluation.ts(PurchaseEvaluationPhaseLabel[98],PeDisplayStatusLabel.TraLai) ·PeWorkflowPanel.tsx·fe-user/src/types/approvalWorkflowV2.ts(~55 LOC, 5 record typeAwLevelDto/AwStepDto/AwDefinitionDto/AwTypeSummaryDto/AwAdminOverviewDto) ·fe-user/src/pages/pe/WorkflowMatrixViewPage.tsx(~215 LOC) ·fe-user/src/App.tsxroute/purchase-evaluations/workflow-matrix·seed-test-users-prod.ps1→$authResp.accessToken·scripts/plan-r-*.sql+plan-s-*.sql+plan-t5-*.sql+plan-t-backup.sql - số-đo: test 84 → 104 → 106 · mig 29 → 30 → 31 · endpoint ~146 (+3) · user prod 33 (13 cũ + 20 mới) · diff K5 +42/-94 (9 file) · K7 +175/-92 (1 file) · K3 +26/-7 · M2 +94 · M3 +4/-4 ×2 = 8 LOC · bundle fe-admin 1395 / 1395.74 KB · fe-user 1275 / 1282 KB (1907 module, 2.61s) · commit S24 7 (
a1a910f..ee0902a, 1 spawn + 6 solo) · token/chunk ~5k-14k · MEMORY nguồn 38.8 KB ·~720 rows wiped
Bổ-sung coverage @P3-gate S170 (token literal — nội-dung đã sống dạng dải/range ở trên; dòng dưới chép NGUYÊN-VĂN context verbatim làm lưới grep)
#1— Cleanup zombie F2 endpoint + UsersPage column + DTO field + stale narrative comments (Reviewer Major #1 + Major #2 + Minor #3 + Minor #4). Pattern pos…Mig 25— FE user read-only matrix view workflow V2 ghim (Mig 25 IsUserSelectable). 3 file: (1) CREATEfe-user/src/types/approvalWorkflowV2.ts(~55 LOC) — s…Mig 29— Em main classified ALL S22 work as cross-stack reasoning chain (BE Mig + Service guard + DTO + FE Designer + FE Section + FE types + tests) → REFUSE…PurchaseEvaluationWorkflowServiceReturnModeTests.cs:253— Mig 31 schema swap F2 storage Users → ApprovalWorkflowLevels. Pattern Mig 29 ADD-DROP no-BACKFILL Option A (accept lose 4 prod user valuefin.pp+…