# reviewer/2026-05-q2 — gist distill-gen: 1 source-verbatim: .claude/agent-memory/reviewer/archive/2026-05-q2.md (3 entry → 3 cụm) pointer-style: substring ## TỔNG-HỢP (3-5 ý) - Bề mặt lỗi là PHÉP ĐỌC NGÔN-NGỮ: "chú ý X" (anh gợi ý) bị đọc thành "BẮT BUỘC X" (chính sách) — em-main t2 tự ban luật xuyên dự-án không consent, anh bắt ở t4, luật ABANDONED; sinh hạng-mục kiểm MỚI Cat 6 authority-boundary (phân-biệt gợi-ý ⟂ mệnh-lệnh, gắn cờ mọi "BẮT BUỘC xuyên dự-án" nguồn tự-quyết). - Gotcha #48: SQLite frozen clock — nhiều `Changelog.Add()` cùng một `SaveChangesAsync` nhận CÙNG timestamp ⇒ `OrderByDescending(CreatedAt).FirstAsync()` không tất-định; bổ Cat 5: bộ lọc test phải phân-biệt bằng thứ khác ngoài mốc thời-gian (EntityType + Summary keyword). Bài về test bắt nguồn từ đặc-tính đồng-hồ của engine DB test — không xuất-hiện ở prod. - Phép chứng mirror 2 app nâng lên so SHA256 nguyên file (`21001E90...`) — rẻ, không cãi được; 6 commit S26 giữ nguyên baseline 111 test = UI thuần không mua thêm rủi-ro hồi-quy; củng-cố luật ROI: spawn cho việc nặng xuyên tầng, em-main tự lo polish 50-100 LOC. ## Entries **[cao] B6-A — S28: "chú ý X" bị đọc thành "BẮT BUỘC X"** - VIỆC: ghi lại quỹ-đạo phiên S28 dưới góc reviewer (thực tế em-main solo, KHÔNG có việc review nào). - KẾT-LUẬN: t1 kết-luận ROI của RAG "ngắn hạn không đáng, dài hạn đổi chất" → t2 em-main TỰ BAN luật xuyên dự-án "ghi RAG mọi tương tác" khi chưa có đồng-ý của anh → t4 anh bắt lỗi, thu phạm-vi về kỷ-luật nội-bộ SOLUTION_ERP → t5 chốt quản-trị 3 lớp (4 nhóm mặc-định + danh-sách bỏ qua + tag schema bắt buộc `[lesson, phase-, ]`, phase ∈ {phase-9, phase-9plus, phase-10}, BC ∈ {contract, pe, budget, workflow, identity, form, infra}). Luật t2 ABANDONED. - BÀI-HỌC: thêm Cat 6 — kiểm ranh-giới thẩm-quyền: phân-biệt "anh gợi ý phương án X" (tham-khảo) với "anh chốt X" (mệnh-lệnh); gắn cờ mọi thứ dạng "BẮT BUỘC … xuyên dự-án" mà nguồn là em-main tự quyết. 5 nhóm kiểm cũ giữ nguyên, Cat 6 cộng thêm từ S28. - BẤT-NGỜ: sai-phạm không nằm ở kỹ-thuật mà ở phép đọc ngôn-ngữ — một chữ "chú ý" biến thành chính sách; và reviewer phát-hiện theo lối HỒI-CỐ, tức lúc xảy ra không có ai chặn. → substring:"authority boundary" **[vừa] B6-B — S25 Plan AB: đồng-hồ đóng băng của SQLite** - VIỆC: ghi từ-khoá đúc kết sau đợt vá changelog (`cdfd542` — PE chỉnh ngân-sách + trả-lại Người-chỉ-định có log). - KẾT-LUẬN: gotcha #48 — nhiều `Changelog.Add()` trong CÙNG một `SaveChangesAsync` nhận cùng dấu thời-gian ⇒ `OrderByDescending(CreatedAt).FirstAsync()` cho kết-quả không tất-định trên SQLite; kèm rủi-ro lặp lại của chế-độ UAT bỏ `dotnet test` khi refactor BE > 100 LOC. - BÀI-HỌC: bổ vào Cat 5: bộ lọc trong test phải phân-biệt bằng thứ khác ngoài mốc thời-gian (EntityType + từ khoá trong Summary). - BẤT-NGỜ: một bài về test lại bắt nguồn từ đặc-tính đồng-hồ của engine DB dùng trong test — thứ không xuất-hiện ở prod (SQL Server), chỉ lộ khi test đỏ ngẫu-nhiên. → substring:"cdfd542" **[vừa] B6-C — S26 Plan AG: PASS 0 issue, và bài ROI lặp lại** - VIỆC: review trước commit 3 chunk A+B+C (~25K token, 12 phép kiểm đối-kháng). - KẾT-LUẬN: PASS 0 issue; commit `0bf6c7e` 2 file +346/−116 LOC, hai bản mirror SHA256 IDENTICAL (`21001E90...`); wire = useMemo gom nhóm lồng + `
/` 2 tầng + lưu tập mở/đóng vào localStorage; 0 migration. 5 vòng polish AG2-AG6 sau đó em-main tự verify (SHA256 giống nhau + npm build 2 app + `dotnet test 111/111`), không spawn lại. - BÀI-HỌC: củng-cố luật phân-bổ: spawn reviewer cho việc nặng xuyên tầng (~370 LOC + 4 sub-agent phối hợp), em-main tự lo vòng polish 50-100 LOC. - BẤT-NGỜ: phép chứng "2 app giống nhau" nâng lên so SHA256 nguyên file thay vì đọc diff — rẻ và không cãi được; cả 6 commit S26 giữ nguyên baseline 111 test = thay đổi UI thuần không mua thêm rủi-ro hồi-quy. → substring:"21001E90" ## Phụ-lục token (coverage) *(chép TRỌN token-list section reviewer/2026-05-q2 của proposal curator — lưới coverage-diff)* - **gotcha#:** `#48` (SQLite **frozen clock** tie-break — mô-tả đầy đủ: "Multi-Changelog.Add same SaveChangesAsync transaction non-deterministic `OrderByDescending(CreatedAt).FirstAsync()`") · dải nền "Foundation gotchas **#17-#48**" (header) - **surprise (nhãn nguyên-văn):** "**Rule cũ ABANDONED**: 'RAG ghi mọi tương tác mandatory' S28 t2 over-reach" · "t4 bro caught mistake scope-down về SOLUTION_ERP self-discipline" · "em main t2 implicit interpret 'chú ý X' (bro suggestion) AS 'MANDATORY X' (em policy decision)" · "Reviewer perspective về S28 trajectory (em main solo, **KHÔNG actual review work**)" · "UAT skip `dotnet test` recurring risk khi BE refactor > 100 LOC" - **guard:** **Smart Friend guard** ("active S28+ cho Plan B Contract V2 wire pre-commit spawn (mandatory heavy diff > 50 LOC cross-stack)") · **Cat 6 — Authority boundary check** (MỚI) · Cat 5 bổ-sung "test filter discriminator beyond timestamp (EntityType + Summary keyword)" · 5-category checklist baseline (Wire BE + Schema + Security + Code quality + Test) UNCHANGED · tag schema **mandatory** `[lesson, phase-, ]` · "Cross-module security validation mirror pattern preserved" (header) - **root-cause:** "scope creep từ project-local → cross-project KHÔNG bro consent là **authority boundary violation**" ⇐ "implicit consent ('chú ý' / 'có thể') KHÔNG = explicit mandate ('BẮT BUỘC' / 'mandatory')" - **file:line:** **0 token file:line** (file này chỉ dẫn tên hàm/commit: `ApplyReturnModeAsync`, `cdfd542`) - **định-danh khác:** commit `0bf6c7e` (2 file +346/−116) · SHA256 mirror `21001E90...` · commit `cdfd542` · `dotnet test 111/111` (baseline 111 preserved, 6 commit S26, 0 prod regression) · spawn ~25K · phase enum {phase-9, phase-9plus, phase-10} · BC enum {contract, pe, budget, workflow, identity, form, infra} · gotcha `#48` chú-giải KHÁC batch A — xem `_lienfile-notes-batchB.md` #5