# implementer-backend/2026-05-q3 — gist distill-gen: 1 source-verbatim: .claude/agent-memory/implementer-backend/archive/2026-05-q3.md (5 entry `##` trên đĩa → 4 cụm; bản draft đầu ghi "6" — không tái-dựng được, ring4 T-3 vá @S170) pointer-style: substring ## TỔNG-HỢP (3-5 ý) 1. **Nhận/từ-chối việc là bài học 2 chiều đối-xứng:** H1 ca nhận-rồi-vỡ (E3 tự dừng giữa chừng đúng chỗ judgment call; phải `stash` WIP em-main vì song-song cùng lớp BE) ⟂ H2 ca lẽ-ra-nhận-mà-không-được (2/8 task hợp-lệ nhưng registry rỗng ⇒ em-main forced solo, thiệt ~30 phút) — ngưỡng giao việc = **độ mơ-hồ spec >20%**, không phải số file. 2. **Song-song trên cùng một lớp code đẻ chi-phí ẩn** ⇒ luật: chunk **tuần-tự A→B→C** khi cùng chạm BE, KHÔNG parallel. 3. **Governance S28:** cấm tự-cho-phép đặt luật xuyên dự-án (bro bắt tại trận); luật cũ phải **khai tử công-khai (ABANDONED)** thay vì để trôi — luật zombie hại hơn không có luật; pattern proven ≥2× mới đề-cử Layer B. 4. ⚠️ **FIDELITY-FLAG (reviewer ĐÃ chấm @S170): 4 tên cờ trong claim Pattern 7 đều 0-hit src/Backend, VÀ con số "4×" cũng CHƯA KIỂM** — "4×" suy từ đếm đúng 4 tên vừa bị bác (3 tên đổ về ~3 migration), KHÔNG có chứng độc-lập; đừng cite cả tên lẫn số như fact. Ý giữ được ở dạng không mang số: "Pattern 7 (per-NV admin opt-in) lặp qua chuỗi Mig 28→31 (số lần chưa kiểm)". ## Entries > ⚠️ **FIDELITY-FLAG — reviewer CHẤM XONG @S170 (sub-reviewer-sleep-fidelity-S170.md §P1), bắt buộc mang theo mọi trích-dẫn Pattern 7 từ file này:** verbatim (S29 wrap) khai *"Pattern 7 per-NV admin opt-in flag (Mig 29 AllowDrafterEdit + Mig 30 AllowApproverEditSection1 + Mig 31 AllowEarlyApprove + AllowDelegate) đã proven 4×"*. **Phán từng tên (2 dụng-cụ độc-lập: grep src + git pickaxe toàn lịch-sử):** > - `AllowDrafterEdit` = **tên viết sai, lai-ghép 2 cờ thật**: `AllowDrafterSkipToFinal` (Mig 29 → bảng `Users`) + `AllowApproverEditDetails` (Levels — và là *approver*, không phải drafter); > - `AllowApproverEditSection1` = **trôi từ-vựng UI** của `AllowApproverEditBudget` (Mig 30 — đúng 1 cột duy nhất); > - `AllowEarlyApprove` = tên sai nhưng **CÓ đối-ứng ngữ-nghĩa 1-1** = `AllowApproverSkipToFinal` (Mig 31); > - `AllowDelegate` = **MA HOÀN TOÀN — 0 đối-ứng, pickaxe 0 commit toàn lịch-sử** (chưa từng được viết ra dòng code nào; `src/Backend` không có khái-niệm uỷ-quyền duyệt). > **Con số "4×" của claim CŨNG CHƯA KIỂM** (suy từ đếm 4 tên trên). Số đo control dương `AllowApproverSkipToFinal` = **54 file với bộ lọc trừ `/obj/`+`/bin/`** (raw = 86; còn 12 khi trừ thêm `*.Designer.cs`+ModelSnapshot — 0-hit của 4 tên vững dưới cả 3 bộ lọc); control âm tên bịa = 0 — thước còn răng. Tên Mig thật: `20260513114505_AddAdvancedOptionsToApprovalWorkflows` (28) · `20260513130144_RefactorAdvancedOptionsToPerLevelAndDrafterUser` (29) · `20260513160703_AddAllowApproverEditBudgetToLevels` (30) · `20260514160124_RefactorSkipToFinalToApproverLevel` (31). **[cao] H1 — S29 wrap: 5 lần được gọi, và bài học về chạy song-song** - **VIỆC:** phiên bận nhất — Plan CA Chunk B (~10K) + Plan B 4 chunk (A2 Mig 32 ~25K · C Mig 33 ~25K · D FE ~12K · **E3 dừng giữa chừng**). - **KẾT-LUẬN:** A2 phải **`stash` phần đang làm dở của em-main** (`ContractWorkflowService.cs`) mới build sạch được — vì em-main và vai **cùng sửa BE song song**. E3 (FE Section 5 V2) **tự dừng** đúng chỗ phải phán-đoán ("check `ContractDetail` type") và trả lại cho em-main. Đúc 3 luật: (1) khi cùng chạm BE thì chunk phải **tuần-tự A→B→C, không song-song**; (2) tính-năng FE phức-tạp cần mở rộng type + thêm component thì **em-main tự làm đáng tin hơn** khi độ mơ-hồ của spec **>20%**; (3) Pattern 16-bis được củng-cố lần 2. - **BÀI-HỌC:** song-song trên cùng một lớp code **đẻ ra chi-phí ẩn** (mẹo `stash`) — nhanh trên giấy, chậm khi chạy. Và ngưỡng giao việc nên tính bằng **độ mơ-hồ của spec**, không bằng số file. - **BẤT-NGỜ:** vai **tự dừng giữa nhiệm-vụ** thay vì đoán bừa — biến "không đủ dữ-kiện" thành hành-động hợp-lệ, và ghi lại đúng chỗ dừng để người sau nối tiếp. → substring:"stash em main WIP" **[cao] H2 — S27 hồi-cứu: tự chấm điểm việc mình KHÔNG được gọi** - **VIỆC:** dựng bảng 8 task của S27, đối chiếu từng dòng với tiêu-chí nhận/từ-chối. - **KẾT-LUẬN:** 6/8 xác-nhận "em-main tự làm là ĐÚNG" (curate MEMORY = phán-đoán §6.5 giữ-hay-cắt → #1 · dashboard = #7 chưa có tiền-lệ + #2 · viết docs 421 dòng = #2 · sửa lỗi Qdrant = #4). **2/8 lẽ ra giao được**: A3.1 viết 5 script PS (Case 2) và F2 sửa `model:inherit` ở 4 file agent (Case 1) — nhưng **registry không nạp được** nên em-main buộc phải tự làm; thiệt-hại ước ~30 phút + mất kỷ-luật mirror. Đúc **Pattern 20** (bộ 5 script PS start/stop/status/dashboard/boot: cùng kỷ-luật ASCII, cùng cấu-trúc `Write-Host`, cùng khuôn `try-catch`). - **BÀI-HỌC:** hồi-cứu phải chấm **từng dòng**, không chấm tổng — nhờ vậy mới tách được "quyết đúng" khỏi "quyết đúng nhưng vì lý do sai" (2 ca này em-main đúng kết-quả nhưng nguyên-nhân là **hạ-tầng hỏng**, không phải phán-đoán). - **BẤT-NGỜ:** cơ-hội bị mất **không do ai quyết sai** mà do **registry rỗng** — tức lỗi hạ-tầng lặng-lẽ biến thành lỗi phân-công, và chỉ lộ ra khi có bảng hồi-cứu. → substring:"Net loss" **[vừa] H3 — S28: 5 điều tự áp sau khi bị bắt lỗi** - **VIỆC:** ghi lại governance Layer A dưới góc nhìn của vai. - **KẾT-LUẬN:** (1) pattern đã chứng **≥2 lần** thì đủ tư-cách đề-cử lên Layer B; (2) tag bắt buộc `[pattern, phase-, ]`; (3) quy-ước `source_path` = `solution_erp/pattern/-`; (4) **cấm tự cho phép mình đặt luật xuyên dự-án** — đúc từ ca t4 bro bắt tại trận; (5) luật cũ "mọi tương-tác đều phải lưu" **BỊ BỎ**. - **BÀI-HỌC:** phạm-vi quyền của một vai phải **thu về chính dự-án của nó**; và luật cũ nên **khai tử công-khai** ("ABANDONED") thay vì để trôi — luật zombie còn hại hơn không có luật. - **BẤT-NGỜ:** chính vai này ghi nhận mình **quên mất luật cũ** rồi mới phát-hiện luật đó đã bị bỏ — quên đúng thứ đáng quên, nhưng chỉ biết là "đúng" sau khi tra lại. → substring:"ABANDONED" **[thấp] H4 — Log curate + baseline** - **VIỆC:** ghi mốc: dồn 12 entry S21→S24 sang `archive/2026-05-q1.md`; và mốc khởi-tạo 2026-05-11. - **KẾT-LUẬN:** MEMORY **38.8 KB → mục-tiêu ~22-24 KB**, giữ nguyên khối Pattern 1-19; lúc khởi-tạo vai đã nạp sẵn 5 (thực tế liệt-kê 6) pattern nền tích-luỹ S1-S20, chưa làm gì, **đã bật sẵn cơ-chế tự từ-chối theo phạm-vi**. - **BÀI-HỌC:** mỗi lần dồn kho phải ghi **nguồn → đích + kích-thước trước/sau + thứ giữ lại** thì lần sau mới truy được. - **BẤT-NGỜ:** vai **bật quy-tắc từ-chối ngay từ lúc chưa làm việc nào** — ranh-giới được cài trước, không phải rút ra sau khi vỡ. → substring:"2026-05-q1" ## Phụ-lục token (coverage) - **Pattern#:** `7` per-NV admin opt-in (**tên cờ SAI — xem FIDELITY-FLAG**) · `12-bis` cross-module cookie-cutter · `16-bis` 4-place mirror (**reinforced 2×**) · **`20` MỚI** (bộ 5 script PS mirror) · nền "5 patterns S1-S20" (liệt-kê **6** mục) - **criteria#:** `#1` phán-đoán giữ-hay-cắt (§6.5) · `#2` thiết-kế UX / viết docs · `#4` chuỗi suy-luận sửa lỗi · `#7` lần đầu, chưa tiền-lệ · Case 1 (n file sửa cơ-học giống nhau) · Case 2 (cookie-cutter mirror) - **surprise:** "**E3 stopped mid-task** ... STOPPED at 'check ContractDetail type' judgment call" · "**stash em main WIP `ContractWorkflowService.cs`** để build verify clean (em main + Implementer **parallel touch BE → race condition trick**)" · "Forward **SEQUENTIAL** chunks A→B→C khi cùng touch BE, **NOT parallel**" · "em main solo **more reliable** than Implementer khi **spec ambiguity > 20%**" · "**2/8 task lẽ ra delegate được** ... nhưng **registry empty → em main forced solo**" · "Net loss **~30 phút**" · "registry KHÔNG load (per pitfall **VIPIX #1+#2**)" · "bro **caught self-authorize cross-project rule mistake**" · "Quên rule cũ 'mọi tương tác mandatory store' — **ABANDONED**" · "Implementer = **busiest agent S29** với 5 spawn" - **guard:** `git stash` phần WIP trước khi build verify · chunk **tuần-tự** khi cùng chạm BE · ngưỡng **spec ambiguity 20%** để chuyển về em-main · tự-dừng khi gặp judgment call · tag schema bắt buộc `[pattern, phase-, ]` · **cấm tự-cho-phép luật liên-dự-án** · pattern phải proven **≥2×** mới đề-cử Layer B · **verify `Layout staticMap` khi page move/route enhance** (vế lệnh-làm của Pattern 16-bis — ring4 T-1 vá @S170: rơi khỏi draft đầu) - **root-cause:** em-main + vai **cùng sửa BE song song** ⇒ cây làm việc bẩn ⇒ build verify không sạch ⇒ phải `stash` · **registry không nạp** ⇒ không spawn được ⇒ 2 việc hợp-lệ bị dồn cho em-main · từ-vựng **UI-section** dùng thay tên cờ trong code ⇒ 3/4 tên = drift của cờ thật, 1/4 (`AllowDelegate`) = ma 0-đối-ứng (xem FIDELITY-FLAG) - **file:line / định-danh:** `ContractWorkflowService.cs` (WIP bị stash) · Mig 32 (+column FK **Restrict** + IX + Configuration + `DbInitializer` `SeedSampleContractWorkflowV2`) · Mig 33 `ContractLevelOpinions` (entity + Mig + Config + DbSet + `Contract.cs` +`LevelOpinions` nav) · `ContractCreatePage.tsx` ×2 (88 LOC) · 4 master page + `App.tsx` (+5 route) + `menuKeys.ts` (+5 key `Catalogs*`) · `pattern_master_page_mirror.md` · `archive/2026-05-q1.md` · script PS `start/stop/status/dashboard/boot` - **số-đo:** 5 spawn S29 · ~10K + ~25K + ~25K + ~12K token · **948 LOC** mirror / 6 file *(phương-pháp-chứng của nguồn — ring4 T-2 vá @S170: 4 master pages mirror fe-admin→fe-user **byte-identical SHA256** + build **PASS 0 TS err**)* · MEMORY **38.8 KB → ~22-24 KB** · 12 entry dồn kho · setup **2026-05-11** · token rơi vét lại (T-4): **Plan AG** · **Pattern 19** - **🔬 disk-check hôm nay (S170, có 2 control):** `AllowApproverSkipToFinal` = **54 file (bộ lọc: trừ `/obj/`+`/bin/` — raw 86; 12 khi trừ thêm Designer/Snapshot)** (control dương; pickaxe 5 commit) · `AllowXyzKhongTonTai` = **0** (control âm) · `AllowDrafterEdit` / `AllowApproverEditSection1` / `AllowEarlyApprove` / `AllowDelegate` = **0 / 0 / 0 / 0** (grep) + **0 commit pickaxe toàn lịch-sử** · cột thật: `AllowApproverEditDetails` · `AllowDrafterSkipToFinal`→`Users` · `AllowApproverEditBudget` · `AllowApproverSkipToFinal` · Mig thật: `20260513114505_AddAdvancedOptionsToApprovalWorkflows` · `20260513130144_RefactorAdvancedOptionsToPerLevelAndDrafterUser` · `20260513160703_AddAllowApproverEditBudgetToLevels` · `20260514160124_RefactorSkipToFinalToApproverLevel`