wal: flush 20260729T2006
This commit is contained in:
@ -1,8 +1,8 @@
|
||||
# Reviewer Agent — Persistent Memory
|
||||
|
||||
- **S159 (07-29) đợt-5 menu 6-leaf HĐ + endpoint `/contracts/deleted` (PWF 10 FLAG 0H/4M/6L):** 🔴 **con-số TRONG CHÚ THÍCH cũng là khẳng-định đo-được** — diff SỬA comment D3 thành "NAY CÓ 2 chỗ `IgnoreQueryFilters`", `grep -rn` ra **3 file/17 site** (ApprovalWorkflowV2AdminFeatures 15 site); tôi suýt duyệt bằng mắt ⇒ **luật: comment mang số ⇒ chạy phép đếm, và số viết dưới dạng LUẬT ("chỗ duy nhất ⇒ CẤM…") sai thì lan sang người sửa sau**. · class **`mirror-nửa-vời khai thừa phạm-vi`**: comment nói "Hộp thư + Tổng quan viết HOA" nhưng "Hộp thư" render bằng `StaticLeaf` KHÁC component ⇒ đọc comment ≠ đọc call-site. · **cookie-cutter phải soi CẢ phần PE đã CHẶN**: bản HĐ copy list-deleted nhưng bỏ `disabled={deletedView}` ⇒ click row → detail 404 → panel **trắng** (page thiếu nhánh `isError`) + mobile navigate ra trang 404. · mirror 2-app: fe-admin ẩn `Ct_*` (⇒ 21 leaf mới KHÔNG cần route) nhưng `Khkk_*` KHÔNG ẩn ⇒ thiếu 2 staticMap = drop silent #50 — **kiểm hide-filter TRƯỚC khi kêu thiếu mirror**. · `tsc -p tsconfig.app.json` EXIT=0 + `noUnusedLocals` = chứng cắt-hero-không-mồ-côi MẠNH HƠN grep (nhắc lại: fe-user KHÔNG bật `strict`). · `Contracts` ∈ `MenuKeys.All` ⇒ policy `Contracts.Read` có thật; `MenuPermissionHandler` khớp ĐÚNG-KHOÁ, KHÔNG kế thừa root (#82). [→ `runs/2026-07-29-S159-tong-quan-pipeline-menu/sub-reviewer-diff-dot5.md`]
|
||||
- **[→ archive/2026-07.md @S161-curate] S159 đợt-5 (07-29) menu 6-leaf HĐ + `/contracts/deleted` (PWF 0H/4M/6L):** chú-thích-mang-SỐ phải chạy phép đếm (comment "2 chỗ IgnoreQueryFilters" — thật 3 file/17 site) · cookie-cutter phải soi CẢ phần bản gốc đã CHẶN (thiếu `disabled={deletedView}` ⇒ panel trắng) · kiểm hide-filter TRƯỚC khi kêu thiếu mirror 2-app · `tsc` + `noUnusedLocals` mạnh hơn grep cho claim "đã cắt".
|
||||
|
||||
- **S159 (07-29) dashboard "toàn trình" đợt-4 FE-only (fe-user 984+/337−, PWF 7 FLAG 0H/2M/5L):** 🔴 **`tsc` XANH đo ÍT hơn vẻ ngoài** — `fe-user/tsconfig*.json` KHÔNG có `strict`/`strictNullChecks` (chỉ `noUnusedLocals`) ⇒ **tra cờ tsconfig TRƯỚC khi trích tsc làm bằng chứng**; ngược lại `noUnusedLocals`+pass = bằng chứng MẠNH HƠN grep cho claim "đã gỡ khối X" (compiler chặn nếu sót import). · class **`nhãn khẳng định chiều-ngược`**: dot-map `none='chưa tới'` — không-suy-diễn "đã xong" là đúng, nhưng "chưa tới" CŨNG là khẳng định ⇒ sai cho GĐ ĐỨNG TRƯỚC + sai khi `contractId != null` **có sẵn trong payload**. · pager tính `data.page±1` (keepPreviousData ⇒ stale) thay vì state ⇒ double-click = no-op. · **verify đích điều hướng phải đọc CẢ breakpoint trang đích** (panel `hidden lg:block` ⇒ ngõ cụt mobile; trang đích tự có nhánh `matchMedia` mà caller mới không copy). · regression đo HEAD⟂work bằng `grep -c` từng token: count 5→2 mà KHÔNG mất nhãn (inline-prop → `STAGES[i].title`) ⇒ **đếm lệch phải truy CẤU TRÚC trước khi kêu hồi quy**. · tự tính lại 4 tỉ-số contrast + tra `@theme` mọi `var(--color-*)` (0 dòng `--color-*: initial` ⇒ nấc mặc định còn) — 3/3 số designer ĐÚNG. · lời khai sub-file "766→1.130 dòng" SAI (đĩa 1.413 = 766−337+984). [→ `runs/2026-07-29-S159-tong-quan-pipeline-menu/sub-reviewer-diff-dot4.md` 28,5KB]
|
||||
- **S161 (07-29) W1 KHKK tiền-commit (Mig 69 + seeder + Designer type-10) — PWF 10 FLAG 1H/3M/4m/2L:** 🔴 **HIGH lại nằm ở `git` chứ không ở mã (S155 tái diễn):** 2/3 file Mig 69 UNTRACKED `??` mà snapshot đã tracked-M ⇒ `commit -a` nạp model 7 bảng nhưng BỎ migration; build+566 test vẫn xanh ⇒ **gate = `git status --porcelain -- src tests | grep '^??'` phải RỖNG ngay trước commit**. · **MAJOR bắt được nhờ đi NGƯỢC lời-khai FE:** comment FE tự khai "nhãn lấy từ BE `applicableTypeLabel`" ⇒ đi kiểm bờ BE: `AwLabels.Type` chỉ 3 entry, `GetValueOrDefault(type, type.ToString())` ⇒ UI hiện **"ContractSigningPlan"** tiếng Anh và `useState(\`Quy trình ${label}\`)` **GHI chuỗi Anh vào cột Name DB** — lớp *hợp-đồng-đứt-2-bờ*, tsc+build+test đều xanh. **Luật rút: câu comment dạng "bên kia lo" = ĐI ĐỌC BÊN KIA.** · seeder 5/5 PASS (call sau revoke `:2109`>`:2096`; revoker chỉ `Hrm|Off|Personal` ⇒ không lật 2-chiều; `TryGetValue` tuple `(RoleId,MenuKey)` — khuôn 1-role sẽ ném dup-key, unique-index `PermissionConfiguration:26` cứu) nhưng **acceptance "đo CỜ" chưa đo được ở đâu**: Dev DB **0 row** `Khkk*` cả MenuItems lẫn Permissions (menus 100 vs prod 142) ⇒ chưa nhánh nào từng chạy. · **`grep`-cùng-lớp bằng TOKEN-SONG-SINH** (`VehicleBookingLevelOpinions` repo-wide) mạnh hơn grep tên-mới: chứng 3/3 site đủ + 0 site thứ 4. · 2 chú thích cùng file nay SAI SỐ ("7 bảng"/"7 khối" → 8) + comment nguồn `MenuKeys.cs:37` "CỐ Ý NGOÀI All" nay sai + anchor `(:614)` trỏ dòng TRƯỚC-commit (đúng = :645) ⇒ **diff sửa mã phải sửa MỌI số/neo trong chú thích cùng file**. · STATUS.md `Menu keys 54`/`Policies 216` không đổi dù |All|=55 ⇒ derived-drift. Tag `[s161, high-o-git-khong-o-ma, hop-dong-dut-2-bo-nhan-BE, token-song-sinh-sweep, seeder-upgrade-if-exists, comment-mang-so-va-neo]`
|
||||
- **[→ archive/2026-07.md @S159-curate] S155-đợt2 (07-27) PE delete-approver DIFF-review #2 (12 FLAG 2H/4M/6L · ĐỪNG-DEPLOY):** class **`hợp-đồng-đứt-giữa-2-bờ`** (FE type khai cờ, BE DTO không có ⇒ nút chết mà tsc+build+561-test đều xanh) · policy-gate đo DB 11/13 vai `CanDelete=0` · mã ĐỔI giữa lượt soi ⇒ re-đo đĩa TRƯỚC verdict · đổi-chiều-assert ≠ nới-assert.
|
||||
- **[→ archive/2026-07.md @S155-curate] S155 ×2 (07-27) PE delete-approver — DIFF-review đợt 1 tiền-deploy (14 FLAG 4H/6M/3L/1I, DEPLOY-CÓ-RỦI-RO) + SPEC-review (PWF 4H/8M/5L):** 🔴 class MỚI **`HIGH nằm ở git chứ không ở mã`** — 2/3 file migration UNTRACKED mà snapshot ĐÃ tracked ⇒ `commit -a` nạp model-có-cột nhưng bỏ migration ⇒ `Invalid column name` cả 7 module, build+test vẫn xanh ⇒ **gate deploy phải chấm `git status ^??` cho `Migrations/`** · `ExecuteDelete` ngoài transaction TRƯỚC `SaveChanges` = mất dữ liệu không hoàn tác · purge xoá CỨNG chữ ký phiếu XOÁ MỀM ⇒ **test đang KHOÁ chiều ngược, vá xong test đỏ ≠ hồi quy, CẤM nới assert** · ~600 dòng BE = mã chết (`grep api.put`=0) · **xanh-giả bắt bằng phép 2-thế-giới** (còn-gate ⟂ bỏ-gate cùng cho 0 ⇒ 0 thông tin) · CLEAN chứng bằng **liệt kê vét cạn** write-site + sweep gián-tiếp (#81-EXT) · 2 lỗi TỰ BẮT: trích line-number **từ diff** (diff không mang số dòng file) · `grep -v Snapshot` ăn nhầm tên migration · **file bị sửa TRONG LÚC soi ⇒ neo bằng NỘI DUNG DÒNG + ghi bản-đồ-trôi**.
|
||||
- **[→ archive/2026-07.md @S155-curate] S146·S147·S152-D2 (digest):** S146 lead sửa 1 phép quét 4 lần/phiên vì mã-hoá ý-định NGỮ-NGHĨA vào regex ⇒ nấc đúng = lưới-soát-cho-người + allowlist CÓ TÊN + use⟂mention · S147 **decouple 1 gate ⇒ truy xem prop dùng chung đã mang carve-out chưa** (`itemsReadOnly` ≠ raw `readOnly`); "same fix" cho surface anh-em có thể trúng gate KHÁC · S152-D2 census thay spot 307/307; **3 THƯỚC-HỎNG** (md5 disk vs `git show` = FAIL giả do CRLF⟂LF · `grep -c` dính citation-trap · `grep -iF` MSYS trả 0-hit IM LẶNG trên UTF-8) + máy-trích mù đuôi `{.yml,.json,.sql}`.
|
||||
@ -14,12 +14,12 @@
|
||||
> Update BEFORE every stop. Tiered Memory v1: L1 HOT cap ~17KB (hook 24.4KB read-limit) · L2 `archive/` on-demand · L3 RAG `search_memory` just-in-time. Keep entry ≤ 1.5K chars (gotcha #53).
|
||||
> Full verbatim history pre-S40 → git `d2f52ba` + `archive/2026-05-q1..q2.md`; S51→S76 detail → `archive/2026-06.md` (S69/S70/S71/**S80** curate). Archive map: `archive/_INDEX.md` + per-period `.gist.md`.
|
||||
|
||||
- **S160 (07-29) reviewer CHỐT-CUỐI /fable-real (verify 13-fix landed) — #53 chết sau Trục-1+Trục-2, đĩa cứu:** khuôn review-của-review: chấm "fix ĐÃ LAND + ĐÚNG codebase, không đẻ lỗi mới" — **12/13 landed-đúng + ~30 anchor re-verify THẬT @HEAD, 1 half-fix**. Bài: (1) **fix áp NỬA spec = dư-lượng thật** — W7 §② sửa badge-nguồn nhưng bảng §① cùng file sót ⇒ soi CẢ FILE khi nhận "đã fix", không chỉ chỗ được trỏ (lớp vá-1-nửa-cùng-lớp S122); (2) **anchor-label ⟂ thân** — gate-5-anchor W3 vẫn liệt `PEWS:1008` sau khi thân phán khuôn đó SAI ⇒ anchor-list là artifact riêng phải sync khi thân đổi; (3) **anchor off-by-N** — "2 checkbox :1267-1268" trúng 1 (SkipToFinal ở :1256) ⇒ dải anchor phải grep CẢ 2 symbol; (4) **verify NGƯỢC premise clone**: re-đo `ContractWorkflowService.cs:191-198` admin-override-gán-qua-biến + `ContractChangelogConfiguration:22-25` FK-Cascade + `ContractAttachmentFeatures:56-152` 0-IDOR — 3/3 premise HIGH clone ĐỨNG ⇒ clone-review có răng thật; (5) **O-A moot-check**: owner để-mở ⇒ F-C3/F-C5/F-S2-grant MOOT-đúng (không siết thì không grant), KHÔNG phải lead né. #53 lần 2/phiên trên reviewer — return "Trục-2: xác vị file…" (mẩu giữa việc) nhưng sub-file 8KB có Trục-1+Trục-2 đủ ⇒ **lead finalize VERDICT+LỖI-MỚI+LEFTOVER on-behalf từ đĩa** (0 mất kết-luận vì ghi-đĩa-trong-lúc-làm). Tag `[s160, chot-cuoi-verify-fix-landed, half-fix-soi-ca-file, anchor-label-vs-than, verify-nguoc-premise-clone, o-a-moot-check, 53-doc-cuu]`
|
||||
- **[→ archive/2026-07.md @S161-curate] S160 (07-29) CHỐT-CUỐI verify 13-fix landed (12 landed + 1 half-fix):** fix áp NỬA spec = dư-lượng (soi CẢ FILE khi nhận "đã fix") · anchor-list là artifact RIÊNG phải sync khi thân đổi · dải anchor phải grep CẢ 2 symbol · verify NGƯỢC premise clone 3/3 đứng · owner để-mở ⇒ finding MOOT-đúng.
|
||||
|
||||
## 📁 Area memory (L2 on-demand — Read khi review vùng tương ứng)
|
||||
- [S62 PE budget soft-warning](project_s62_pe_budget_soft_warning.md) — PASS: hard-block→soft-warning; submit-guard intact + validator giữ `BudgetPeriodAmount>0`, row8 negative-safe (additive-only). Validator class `PurchaseEvaluationFeatures.cs:317`.
|
||||
- [Wire/mirror claim verification anchors](feedback_wire_claim_verification_anchors.md) — sha256 twin-file · `git diff -U0` isolate true-adds · `allowNegative` bleed check · guard-still-intact grep.
|
||||
- **S160 (07-29) review SPEC-BỘ dry-run KHKK→HĐ-cứng [engine `/fable-clone` 6 lane opus + `/fable-real` chốt fable; `runs/2026-07-29-S160-khkk-dryrun-plan/review-synthesis-clone-s160.md`]:** 6 lane (anchor-A rỗng #StructuredOutput-fail nhưng ghi-đĩa-lượt-1-2 cứu · B/C/wave-logic/owner-consist/security). **5/5 verdict SUA-TRUOC-THI-CONG, hội tụ cao** ⇒ lead-verify 5 claim load-bearing 5/5 CONFIRMED đĩa. Bài đắt: (1) **review SPEC ≠ review CODE — bắt lỗ ở acceptance + default-lấn-quyền + hố-chưa-khai, KHÔNG chỉ anchor** (anchor 24-28/28 đúng dòng nhưng spec vẫn hỏng cấu-trúc); (2) **seeder-grant no-op = 403 giết-feature IM LẶNG** — row Permission đã tồn tại CanRead-only ⇒ grant kiểu insert rơi skip-existing `continue` (`DbInitializer.cs:2242-2245`), phải UPGRADE-if-exists (`SeedProcurementMasterAccessAsync:2367-2374`); **acceptance đếm ROW = 0-bit, phải đo CỜ CanCreate/CanUpdate**; (3) **owner-authority finding** — lane owner-consistency bắt lead đặt default lấn đúng chỗ owner phán "để yên" (O-3 "hợp đồng cứ từ từ" + STATUS:13 tái-khẳng-định) ⇒ surface AskUser thay vì tự quyết → anh chọn O-A gỡ hẳn wave; (4) **"204 KHÔNG 409" PASS SẴN** = acceptance 0-bit nửa-vế vì nhánh trình không đọc workflow (`ContractWorkflowService.cs:70-89`) — vế răng = `currentApprovalLevelOrder=1` phải chạy tới lượt DUYỆT; (5) **FK-547 compiler-không-chặn**: gọi `LogWorkflowTransitionAsync(Guid contractId)` với plan.Id = enum/Guid cast được nên build xanh, nổ runtime — dùng bảng changelog RIÊNG của module mới; (6) **choke-point "DUY NHẤT" sai** — admin-override gán Phase QUA BIẾN (`:190-193`) nên literal-grep miss (lớp #81), phải kê 2 write-path. **anchor-B census tên-test: repo 0/460 tên thuần-Việt ⇒ khuôn = English-predicate** (owner chốt đổi). Ensemble ĐÓNG GÓI C2 ăn: 6 lane ≤3-file + khung-rỗng-lượt-1-2 ⇒ 0 lane chết dù 1M+ token. Tag `[s160, review-spec-bo, seeder-grant-no-op-403, acceptance-dem-row-0bit, owner-authority-surface, 204-khong-409-pass-san, fk-547-compiler-mien, choke-point-2-write-path, test-name-census-repo]`
|
||||
- **[→ archive/2026-07.md @S161-curate] S160 (07-29) review SPEC-BỘ dry-run KHKK (6 lane, 5/5 SUA-TRUOC-THI-CONG):** review SPEC ≠ review CODE — lỗ ở acceptance + default-lấn-quyền, không chỉ anchor · seeder-grant kiểu insert = NO-OP 403 im lặng ⇒ acceptance phải đo CỜ không đếm ROW · owner-authority surface AskUser thay tự quyết · acceptance "PASS SẴN" = 0-bit · FK-547 compiler-không-chặn · choke-point "DUY NHẤT" sai vì gán QUA BIẾN (#81).
|
||||
- **S89 trio** ([sectionB](project_s89_pe_sectionb_review.md) · [endsBeforeCeo](project_s89_pe_endsbeforeceo_plan_review.md) · [finalize-note](project_s89_finalize_note_plan_review.md)) — adjustMut share race + authz-lens ≠ concurrency-lens · FE 4 render-sites plan-missed-2 · ground-truth-accurate-nhưng-gaps.
|
||||
- **S101 H18/H19 WF2 + LANE-C — PWC/PASS:** content-hash ≠ commit-SHA (hex strip/no-strip) · exact-token sweep misses paraphrase → widen concept-phrase. → `archive/2026-07.md`.
|
||||
- [S103 H20+crystallized-backfill review](project_s103_h20_crystallized_backfill_review.md) — WF2 PASS; 6/6 hash recompute MATCH + 4 already-met verified. Lesson: multi-axis warning phải nằm trong OUTPUT của script (reader chạy inline), không chỉ doc.
|
||||
@ -72,10 +72,7 @@ Adversarial pre-commit reviewer SOLUTION_ERP. Read-only verify + live curl prod
|
||||
|
||||
## 🧠 SOLUTION_ERP review essentials (S80 verified — re-ground từ docs/STATUS.md canonical)
|
||||
|
||||
- **Tests baseline:** **354 PASS** (45 Domain + 309 Infra · 0 fail/skip). Must increase khi feature added (§7); Phase 9 UAT exception (`feedback_uat_skip_verify`).
|
||||
- **Gotchas:** **71 active** (`docs/gotchas.md`, format `### N.`). Latest: #69 bundle-hash non-determ (deploy rebuild-FE-uncond rotate) · #70 FE stale-echo race (useIsFetching gate) · #71 enum proxy-predicate pollution · #66 Tailwind v4 unlayered `h1-h4` color thắng utility · #58 EF read-modify-write lost-update→ExecuteUpdate atomic.
|
||||
- **Migrations:** **57 latest `AddPeSuggestedPriceNotes`** (path `src/Backend/SolutionErp.Infrastructure/Persistence/Migrations/`). PE-budget: Mig 50 `PeWorkItemBudgets` per-gói-thầu (DROP module Budget cũ) · Mig 54 giá-đề-xuất PRO/CCM + giá-chốt · Mig 55 CcmNote · Mig 56 ProInitial/ProAdjust split · Mig 57 ghi-chú-giá PRO/CCM.
|
||||
- **Endpoints:** ~253 · **88 SQL tables**.
|
||||
- **Tests · gotchas · migration · endpoint · bảng = SỐ CANONICAL ở `docs/STATUS.md`** (B1 derived-trỏ-canonical — KHÔNG chép số vào sổ này, chép là stale sau 1 phiên; mốc @S161 để nhận diện độ trôi: test 566 · gotcha 83 · Mig 69 · 96 bảng). Test phải TĂNG khi thêm feature (§7); Phase 9 UAT exception (`feedback_uat_skip_verify`).
|
||||
- **Identity password ≥12 chars** (reject 11-char). Test creds: admin `admin@solutions.com.vn/Admin@123456` (full) · UAT `nv.test@solutions.com.vn/TestUser@123456` (Drafter CCM).
|
||||
- **Prod:** api/admin/eoffice.solutions.com.vn. Bundle live admin `CsJetgZH` / user `BVS0ApIm` (Run #330). **Pin:** MediatR `12.4.1` (flag `Version="14`) · Swashbuckle `6.9.0` · Node CI `20.x`.
|
||||
- **Conventions:** `docs/rules.md` (§1.1 outward writing, §3.9 mirror 2 FE, §5.2 commit, §6.5 docs narrative, §7 test timing, §2.8 pin).
|
||||
|
||||
@ -168,3 +168,14 @@
|
||||
## S149 (2026-07-24) — gate hội-tụ-bookend [LEAD GHI ON-BEHALF @S150 — M9/B3 theo H2-F4 (1 invocation thật → 0 entry); nguồn: `runs/2026-07-24-S149-hoi-tu-bookend/sub-reviewer-hoi-tu.md` 15.733B]
|
||||
|
||||
- `/fable-real reviewer` gate spec hội-tụ-bookend: **GO-WITH-FIXES 1C/6M/4m** (CLEAN 218K, 0 garble) — spec v1→v2 trước wave implement 5-lane Opus (5/5 done 946K 0-garble). Lưu ý sổ: lượt gate adap-backlog `wf_f4e4c006` KHÔNG tính invocation vai này (reviewer-lane **skeleton-ruột-rỗng** — khung 274B, 0 append, return+resume đều fail → em-main-solo re-do; xem sổ garble sub-class @S150).
|
||||
|
||||
|
||||
## @S161-curate (2026-07-29) — moved from L1 HOT (hook-cap 24.5KB > 17.1KB)
|
||||
|
||||
- **S159 (07-29) dashboard "toàn trình" đợt-4 FE-only (fe-user 984+/337−, PWF 7 FLAG 0H/2M/5L):** 🔴 **`tsc` XANH đo ÍT hơn vẻ ngoài** — `fe-user/tsconfig*.json` KHÔNG có `strict`/`strictNullChecks` (chỉ `noUnusedLocals`) ⇒ **tra cờ tsconfig TRƯỚC khi trích tsc làm bằng chứng**; ngược lại `noUnusedLocals`+pass = bằng chứng MẠNH HƠN grep cho claim "đã gỡ khối X" (compiler chặn nếu sót import). · class **`nhãn khẳng định chiều-ngược`**: dot-map `none='chưa tới'` — không-suy-diễn "đã xong" là đúng, nhưng "chưa tới" CŨNG là khẳng định ⇒ sai cho GĐ ĐỨNG TRƯỚC + sai khi `contractId != null` **có sẵn trong payload**. · pager tính `data.page±1` (keepPreviousData ⇒ stale) thay vì state ⇒ double-click = no-op. · **verify đích điều hướng phải đọc CẢ breakpoint trang đích** (panel `hidden lg:block` ⇒ ngõ cụt mobile; trang đích tự có nhánh `matchMedia` mà caller mới không copy). · regression đo HEAD⟂work bằng `grep -c` từng token: count 5→2 mà KHÔNG mất nhãn (inline-prop → `STAGES[i].title`) ⇒ **đếm lệch phải truy CẤU TRÚC trước khi kêu hồi quy**. · tự tính lại 4 tỉ-số contrast + tra `@theme` mọi `var(--color-*)` (0 dòng `--color-*: initial` ⇒ nấc mặc định còn) — 3/3 số designer ĐÚNG. · lời khai sub-file "766→1.130 dòng" SAI (đĩa 1.413 = 766−337+984). [→ `runs/2026-07-29-S159-tong-quan-pipeline-menu/sub-reviewer-diff-dot4.md` 28,5KB]
|
||||
|
||||
- **S159 (07-29) đợt-5 menu 6-leaf HĐ + endpoint `/contracts/deleted` (PWF 10 FLAG 0H/4M/6L):** 🔴 **con-số TRONG CHÚ THÍCH cũng là khẳng-định đo-được** — diff SỬA comment D3 thành "NAY CÓ 2 chỗ `IgnoreQueryFilters`", `grep -rn` ra **3 file/17 site** (ApprovalWorkflowV2AdminFeatures 15 site); tôi suýt duyệt bằng mắt ⇒ **luật: comment mang số ⇒ chạy phép đếm, và số viết dưới dạng LUẬT ("chỗ duy nhất ⇒ CẤM…") sai thì lan sang người sửa sau**. · class **`mirror-nửa-vời khai thừa phạm-vi`**: comment nói "Hộp thư + Tổng quan viết HOA" nhưng "Hộp thư" render bằng `StaticLeaf` KHÁC component ⇒ đọc comment ≠ đọc call-site. · **cookie-cutter phải soi CẢ phần PE đã CHẶN**: bản HĐ copy list-deleted nhưng bỏ `disabled={deletedView}` ⇒ click row → detail 404 → panel **trắng** (page thiếu nhánh `isError`) + mobile navigate ra trang 404. · mirror 2-app: fe-admin ẩn `Ct_*` (⇒ 21 leaf mới KHÔNG cần route) nhưng `Khkk_*` KHÔNG ẩn ⇒ thiếu 2 staticMap = drop silent #50 — **kiểm hide-filter TRƯỚC khi kêu thiếu mirror**. · `tsc -p tsconfig.app.json` EXIT=0 + `noUnusedLocals` = chứng cắt-hero-không-mồ-côi MẠNH HƠN grep (nhắc lại: fe-user KHÔNG bật `strict`). · `Contracts` ∈ `MenuKeys.All` ⇒ policy `Contracts.Read` có thật; `MenuPermissionHandler` khớp ĐÚNG-KHOÁ, KHÔNG kế thừa root (#82). [→ `runs/2026-07-29-S159-tong-quan-pipeline-menu/sub-reviewer-diff-dot5.md`]
|
||||
|
||||
- **S160 (07-29) reviewer CHỐT-CUỐI /fable-real (verify 13-fix landed) — #53 chết sau Trục-1+Trục-2, đĩa cứu:** khuôn review-của-review: chấm "fix ĐÃ LAND + ĐÚNG codebase, không đẻ lỗi mới" — **12/13 landed-đúng + ~30 anchor re-verify THẬT @HEAD, 1 half-fix**. Bài: (1) **fix áp NỬA spec = dư-lượng thật** — W7 §② sửa badge-nguồn nhưng bảng §① cùng file sót ⇒ soi CẢ FILE khi nhận "đã fix", không chỉ chỗ được trỏ (lớp vá-1-nửa-cùng-lớp S122); (2) **anchor-label ⟂ thân** — gate-5-anchor W3 vẫn liệt `PEWS:1008` sau khi thân phán khuôn đó SAI ⇒ anchor-list là artifact riêng phải sync khi thân đổi; (3) **anchor off-by-N** — "2 checkbox :1267-1268" trúng 1 (SkipToFinal ở :1256) ⇒ dải anchor phải grep CẢ 2 symbol; (4) **verify NGƯỢC premise clone**: re-đo `ContractWorkflowService.cs:191-198` admin-override-gán-qua-biến + `ContractChangelogConfiguration:22-25` FK-Cascade + `ContractAttachmentFeatures:56-152` 0-IDOR — 3/3 premise HIGH clone ĐỨNG ⇒ clone-review có răng thật; (5) **O-A moot-check**: owner để-mở ⇒ F-C3/F-C5/F-S2-grant MOOT-đúng (không siết thì không grant), KHÔNG phải lead né. #53 lần 2/phiên trên reviewer — return "Trục-2: xác vị file…" (mẩu giữa việc) nhưng sub-file 8KB có Trục-1+Trục-2 đủ ⇒ **lead finalize VERDICT+LỖI-MỚI+LEFTOVER on-behalf từ đĩa** (0 mất kết-luận vì ghi-đĩa-trong-lúc-làm). Tag `[s160, chot-cuoi-verify-fix-landed, half-fix-soi-ca-file, anchor-label-vs-than, verify-nguoc-premise-clone, o-a-moot-check, 53-doc-cuu]`
|
||||
|
||||
- **S160 (07-29) review SPEC-BỘ dry-run KHKK→HĐ-cứng [engine `/fable-clone` 6 lane opus + `/fable-real` chốt fable; `runs/2026-07-29-S160-khkk-dryrun-plan/review-synthesis-clone-s160.md`]:** 6 lane (anchor-A rỗng #StructuredOutput-fail nhưng ghi-đĩa-lượt-1-2 cứu · B/C/wave-logic/owner-consist/security). **5/5 verdict SUA-TRUOC-THI-CONG, hội tụ cao** ⇒ lead-verify 5 claim load-bearing 5/5 CONFIRMED đĩa. Bài đắt: (1) **review SPEC ≠ review CODE — bắt lỗ ở acceptance + default-lấn-quyền + hố-chưa-khai, KHÔNG chỉ anchor** (anchor 24-28/28 đúng dòng nhưng spec vẫn hỏng cấu-trúc); (2) **seeder-grant no-op = 403 giết-feature IM LẶNG** — row Permission đã tồn tại CanRead-only ⇒ grant kiểu insert rơi skip-existing `continue` (`DbInitializer.cs:2242-2245`), phải UPGRADE-if-exists (`SeedProcurementMasterAccessAsync:2367-2374`); **acceptance đếm ROW = 0-bit, phải đo CỜ CanCreate/CanUpdate**; (3) **owner-authority finding** — lane owner-consistency bắt lead đặt default lấn đúng chỗ owner phán "để yên" (O-3 "hợp đồng cứ từ từ" + STATUS:13 tái-khẳng-định) ⇒ surface AskUser thay vì tự quyết → anh chọn O-A gỡ hẳn wave; (4) **"204 KHÔNG 409" PASS SẴN** = acceptance 0-bit nửa-vế vì nhánh trình không đọc workflow (`ContractWorkflowService.cs:70-89`) — vế răng = `currentApprovalLevelOrder=1` phải chạy tới lượt DUYỆT; (5) **FK-547 compiler-không-chặn**: gọi `LogWorkflowTransitionAsync(Guid contractId)` với plan.Id = enum/Guid cast được nên build xanh, nổ runtime — dùng bảng changelog RIÊNG của module mới; (6) **choke-point "DUY NHẤT" sai** — admin-override gán Phase QUA BIẾN (`:190-193`) nên literal-grep miss (lớp #81), phải kê 2 write-path. **anchor-B census tên-test: repo 0/460 tên thuần-Việt ⇒ khuôn = English-predicate** (owner chốt đổi). Ensemble ĐÓNG GÓI C2 ăn: 6 lane ≤3-file + khung-rỗng-lượt-1-2 ⇒ 0 lane chết dù 1M+ token. Tag `[s160, review-spec-bo, seeder-grant-no-op-403, acceptance-dem-row-0bit, owner-authority-surface, 204-khong-409-pass-san, fk-547-compiler-mien, choke-point-2-write-path, test-name-census-repo]`
|
||||
|
||||
Reference in New Issue
Block a user