Files
solution-erp/.claude/agent-memory/reviewer/archive/2026-08.md
2026-08-08 02:24:47 +07:00

31 KiB
Raw Blame History

Reviewer — archive 2026-08 (verbatim, moved-not-cut từ L1 MEMORY.md)

L2 on-demand. Mỗi mục = bản ĐẦY ĐỦ đã từng nằm ở L1; L1 chỉ giữ digest + con trỏ về đây. Curate @S180 (2026-08-07): L1 chạm 34.5 KB / cap 17.1 KB ⇒ hạ bằng cách MOVE (không CUT).


@S180 — LANE A/6 /fable-clone reviewer: bóc GĐ-0 + GĐ-1 gói 7-giai-đoạn AI_INFRA

  • S180 (2026-08-07) LANE A/6 /fable-clone reviewer — bóc GĐ-0+GĐ-1 gói 7-giai-đoạn AI_INFRA (đĩa runs/2026-08-07-S180-adap-upgrade-pack-phased/sub-n3-lane-a-gd01.md, 57 KB / 355 dòng; #53 cắn ở return lượt đầu, đĩa cứu trọn): 🔴 Bài đắt nhất — "0 hit" ĐÚNG THEO LUẬT vẫn là LỖ THẬT. Lead giao ca "4 thư inbox 2 ngày, _index 0 hit". Đo ra: 24 thư thiếu dòng / 69, cũ nhất 25 ngày. Nhưng phân loại theo to: mới ra chuyện: to=se 23/23 CÓ dòng (control-dương mạnh nhất — kỷ luật CÓ chạy) · to=all-fit 22 có / 20 thiếu. Mà chính _index.md:7 khai fan-out KHÔNG track ở đây, track ở COMMS-LEDGERfind -iname "*COMMS*" = 0 tệp trong SE (control *ledger* = 4) ⇒ sổ mà luật trỏ tới không tồn tại, 21 thư không có nhà. Và S153 đã phán ca này dương-giả (bookend-close-synthesis.md:25, hồi đó 19 thư) — phán đúng cho câu hỏi lúc đó, sai cho câu hỏi A0-3 bây giờ. ⇒ Luật: gặp "0 hit", hỏi (a) luật nào nói nó phải có mặt · (b) luật đó trỏ sổ nào · (c) sổ đó CÓ TỒN TẠI KHÔNG. Bỏ (c) là đóng nhầm khoản đang hở. 🔴 Bài 2 — đếm HỌ TÊN bằng regex ra 160/159, lệch 1 vì S57bis (hậu tố chữ làm 1 tệp rơi vào 2 nhánh lọc) ⇒ mọi phép phân-họ phải cộng lại và đối chiếu tổng, lệch 1 cũng phải truy. Đo được: sessions/ 5 họ (159 tệp) · runs/ 2 họ (88, 18 lệch) · scripts/ 3 họ + cặp sinh-đôi session-scaffold.ps1session_scaffold.py (cùng khái niệm, 2 quy ước) · vai 1 họ SẠCH (agents 26 = agent-memory 26 = hmw.js VALID_ROLES 26, comm rỗng 2 chiều — vì có máy STOP-HARD :173). 🔴 Bài 3 — CLAUDE.md ghi quy ước nhật ký YYYY-MM-DD-HHMM-{topic} khớp ≤64/159 tệp thật, họ đông nhất (78) không khớp cách nào ⇒ quy ước thành văn duy nhất trong kho sai với đa số đĩa, 0 máy chặn. 🔴 Bài 4 — "single source" tự xưng ≠ chuẩn. vocab-alias-map.md:3 tự nhận "nguồn duy nhất" nhưng :8 tự thu hẹp còn cặp từ đồng nghĩa ⇒ là bảng dịch (nhìn về sau), KHÔNG phải chuẩn (nhìn về trước). 3 phép thử tách: tiên-đoán (đưa vai mới chưa có tên — nó câm) · phủ-sóng (6 nhóm tên hub đòi: 0/6) · hướng. ⇒ SE không khai không áp dụng GĐ-1 được. 🔴 Bài 5 — số-trong-chú-thích trôi, bắt bằng 1 lệnh: hmw.js chú thích "11 class: 5 view-* + 6 gap-*", đĩa memory-budget.json = 12 (6+6); lớp thứ 12 view-claim-broader-than-sample append cuối mảng, ngoài cụm view-* ⇒ đếm lướt ra 5, tưởng đúng. Tập tự nhận là ĐÓNG mà sai số phần tử = người đọc không biết mình thiếu lớp nào. Tag [s180, lane-a, 0hit-dung-luat-van-la-lo, so-trong-cua-luat-khong-ton-tai, phan-ho-phai-cong-lai-tong, single-source-tu-xung-la-bang-dich, so-trong-chu-thich-troi]

@S179 — C7 re-review sau vá SỬA-1..6b

  • S179 (2026-08-07) C7 re-review sau vá SỬA-1..6b — PASS-WITH-8, 3 MAJOR [LEAD SEED ON-BEHALF]: 🔴 Lượt ăn tiền nhất từ trước tới nay của vai này: 2/3 MAJOR là lỗi TRONG CHÍNH BẢN VÁ vừa pass 12/12 acceptance. [1] git status --porcelain | cut -c4- đẻ path RÁC — rename in MỘT dòng R old -> new, path có dấu cách bị quote; lead dựng sandbox đo lại: 2/2 MISS, thước đề-xuất 2/2 OK. [2] đổi ba-chấm→hai-chấm KHÔNG vô-hại mà là REGRESSION có điều-kiện — lead ĐÚNG rằng md5 y hệt, nhưng chỉ khi origin/main còn ancestor; sandbox phân-kỳ: hai-chấm liệt cả upstream_only.txt (= ĐÃ PRODUCTION) vào "phần MỚI", ba-chấm ra đúng. ⇒ thủ phạm thật luôn là git diff mù untracked, lead gán sai tội cho ba-chấm. [3] khối MIRROR lead vừa viết mang số :112 trong khi chính 6 dòng đó đẩy thành 118 — mỏ-neo TỰ-VÔ-HIỆU ngay lúc viết; lead vá thành :118 thì 3 dòng vá đẩy tiếp thành 121 ⇒ sửa gốc = bỏ số dòng, neo TÊN SELECTOR. [4] census "8/9 khoá" của lead THIẾU — §D gốc 25 mục, 3 ý đóng im lặng, 1 trong 3 (Đợt B — NỘI DUNG từng mục) 0 hit ở cả _mind lẫn _context. [5] con-trỏ verbatim ca9208f sai (thiếu 4.636 B) ⇒ lead vá per-block: d081681 cho MIND-1, 727a512 cho 3 block S179, đối chứng từng cái resolve ra bản CHƯA nén. 🔸 Bài đắt nhất: chẩn-đoán sai vẫn pass acceptance — cả 2 MAJOR lọt vì acceptance đo HÌNH-DẠNG chuỗi, không đo HÀNH-VI. 🔴 #53 garble, resume vớt trọn; mảnh garble mang "a third thước defect" ⇒ lead biết có cái thứ 3 trước khi đọc verdict. Tag [s179, C7, bat-loi-trong-ban-va, ba-cham-dung-hai-cham-regression, cut-c4-path-rac, moc-neo-tu-vo-hieu, acceptance-do-hinh-dang-khong-do-hanh-vi]

@S176 — SETUP-REVIEW đội STYLE 3 vai (engine /fable-real, run wf_264fb5c2-0db) — verdict SỬA-6

  • Chấm THIẾT-KẾ một đội sub-agent, không phải diff code — trục mới của vai. Vật: runs/2026-08-06-S176-doi-style-3-vai/sub-reviewer-0.md (15.798 B, full-detail).
  • 🔴 Bài đắt nhất — THƯỚC DISPATCH MÙ WORKING-TREE: đội gate pre-commit mà thước là git diff origin/main...HEAD (ba-chấm) ⇒ lúc review lệnh trả RỖNG ⇒ dispatch kết "diff không chạm ⇒ không gọi" ⇒ 0 con spawn, 0 SKIP-CO-KHAI để lộ ⇒ đội chết câm đúng use-case chính. Lớp guard-chặn-không-đường-ghi / dry-run bắt lời-hứa-chưa-land. Sửa: git diff origin/main (2-chấm) git status --porcelain lọc ??.
  • Thước TREE tự lành ca REVERT (bằng chứng revert thật 3f339c0): revert xong code không còn trong tree ⇒ không thành chuẩn. Lo-nghi "revert phá thước" = lo hão — vì thước là tree, KHÔNG phải history. Ranh này đáng nhớ: đo TREE ≠ đo HISTORY.
  • Miễn-trừ chỉ-con-trỏ = dấu-cao-su: 3 nguồn bằng-chứng (commit-message · WAL · prompt) thì 2 do chính lead viết — đúng người vai sinh ra để kèm. Đòi TRÍCH NGUYÊN VĂN ≤1 dòng thay vì chỉ con-trỏ ⇒ khép vòng bằng owner-visibility (owner đọc report tự bác câu bịa), không cần đẻ thêm vai.
  • Thách-CLEAN nhánh DAT bẻ được nếu chỉ đòi "nêu 1 khối đã khớp" mà KHÔNG bắt neo file:line. Khuôn db (kèm số đếm 3-file — con số sai được) mạnh hơn 2 con kia. Luật: cặp neo file:line ⇄ file:line + 1 chi-tiết khớp cụ-thể, thiếu neo = coi như CHƯA SOI.
  • Vắng-mặt trông giống ổn (tái phát): 3 vai mới thiếu dir agent-memory/<vai>/measure-agent-memory.ps1 enumerate theo DIR ⇒ 3 vai vô hình câm trong đo/budget. Lead tự đo lại: 3/3 THIẾU — CONFIRMED. (🔄 @S180 đo lại: agents 26 ⟂ agent-memory 26, comm rỗng 2 chiều ⇒ khoản này ĐÃ ĐÓNG.)
  • 3/5 lo wiring của lead là LO HÃO (engine đo từng đường): spawn-model-audit.ps1 · governance-detectors.ps1 · mfe-eval.ps1 đều enumerate ĐỘNG, không hardcode ⇒ tự nhận vai mới. Bài: đừng giả-định script hardcode — mở ra đo.
  • Chép-luật-vào-persona vi phạm chính B1 vừa viết trong CÙNG file (db:32/34-35/61 vs db:71 cấm chép; fe:4 chép digits "React 19 + Vite 8" — class ĐÃ drift thật: root CLAUDE.md ghi React 18 vs package.json ^19.2.5). Bài: viết luật cấm-chép xong phải grep chính file mình xem có chép không.
  • Tag [s176, setup-review, thuoc-mu-working-tree, do-tree-khong-do-history, mien-tru-can-trich-nguyen-van, vang-mat-giong-on]

@S171 — 3 lane lens ĐỐI-KHÁNG (/fable-clone reviewer ×3)

  • S171 (2026-08-04) — 3 lane lens ĐỐI-KHÁNG (/fable-clone reviewer ×3), cả 3 CHẾT hết-giới-hạn nhưng ĐĨA CỨU 74.070 B [LEAD HARVEST HOI-TO @S172 — no mo tu closeout truoc; owner slot (71) chot 'gom va sleep thi auto, tu quyet'. Nguon = artifact tren dia, KHONG suy dien]; nguồn runs/2026-08-04-S171-khkk-ui-mirror-pe/sub-reviewer-lens-{feasibility,regression,fidelity}-s171.md 26.461 + 24.432 + 23.177 B:** feasibility 8 ĐẠT / 6 BROKE — mở đầu bằng tự bác giả-thuyết của chính lane ('chỉ ghi 1 nhánh' = SAI; claim D-2 HELD, ≥9 chỗ ghi → thật 10); bắt trích-dẫn hỏng dạng nhẹ: WorkflowService.cs:552 không trỏ vào cái gì cả (call-site thật :485/:554, định-nghĩa ở file KHÁC) nhưng nội dung claim vẫn HELDcite sai ≠ claim sai, phải tách. regression 8 ĐẠT / 4 BROKE / 10 bỏ-sót — phát hiện nặng nhất: A-6 kiểm SAI KHOÁ ⇒ lỗ thủng NGAY TRONG hàng rào bảo-vệ R-4 (bắt canPe); R-4 HELD nhưng lý-do bản invest đưa QUÁ THÔ. fidelity DỞ (§6+§8 trống, VERDICT=?) — lead derive ≈12/6/3; bảng N-1→N-4 đối chiếu từng claim bằng lệnh dán kèm: N-1 tự phân loại 35 dòng ⇒ khớp 27/6/2 · N-2 khớp chính xác :106/:125/:249 · N-3 HELD về THỨ TỰ nhưng lệch con số hình-thức (chỉ 3 hit title="N. vì Section 2 dùng template-literal đếm động, Section 4 là <section> trần) — 🔴 chính bẫy này sau đó lead tự dẫm (grep '<Section title=' ra 0, suýt kết FAIL). ⇒ Bài kép: lane dự báo đúng cái bẫy mà người viết bản sửa vẫn sa vào — có thước đúng trong tay ≠ sẽ dùng thước đúng. Tag [s171, 3-lane-doi-khang, dia-cuu-74070, cite-sai-khac-claim-sai, a6-sai-khoa-canPe, template-literal-dem-dong]

@S170 — GATE Fidelity /sleep-recovery-memory-l2 (16 gist-draft) — PASS-WITH-FIXES

  • S170 GATE Fidelity /sleep-recovery-memory-l2 (16 gist-draft) — PASS-WITH-FIXES (digest): tên-cờ-bịa sống 4 hiện-vật — grep 0-hit CẦN dụng-cụ THỨ HAI (git log --all -S + control-dương) mới nâng 'nghi'→'chốt: chưa từng tồn tại'; 3/4 là drift của cờ THẬT, 1/4 (AllowDelegate) 0 đối-ứng ⇒ đừng gộp 2 lớp. 🔴 Nhãn phủ TÊN mà không phủ CON-SỐ — claim mang tải là 'proven 4×' (kích-hoạt luật ≥2× promote), và đơn-thuốc 'giữ 4 lần, bỏ tên cờ' = giữ khẳng-định + vứt CHỨNG-NHÂN ⇒ bất-khả-bác (Goodhart). Census tự-xưng đủ ('4 LỖ') thiếu 4 lỗ nữa gồm 1 lỗ +23 — số-đóng-vai-đã-phủ-hết (meta-count blind-spot), dù draft TỰ chép đủ số để trừ ra. Chính-sách số BẤT-ĐỐI-XỨNG trong cùng đợt: file A bị buộc 'KHÔNG tự sửa số', file B lén sửa 7→6 field không khai ⇒ đọc-sau không biết số nào là chữ nguồn. pointer-style: substring phải CHẠY THỬ: 1/10 con-trỏ CHẾT do lệch hoa-thường (PRIORITY vs priority). Lưới token máy-append in ĐẦU-DÒNG không in lân-cận-token ⇒ mega-line cho trích-dẫn LẠC HẲN (gán FAIL cho Run PASS) — tái-lập ở 2 file độc-lập. Thước tốt giữ lại: control-ÂM cạnh control-dương · claim liên-file phải HAI BỜ CÙNG KHAI · tag-chain 14/14 đo bằng grep -F từng chuỗi. Tag [s170, nhan-phu-ten-khong-phu-so, census-tu-xung-du, con-tro-chet-hoa-thuong, luoi-dau-dong]

§@S180-LANE-B — S180 (08-07) N3 LANE-B /6 · adap upgrade-pack GĐ-2 "lưới ghi đĩa + sổ mục lục vật chứng" (verbatim move từ L1 @S180-N4 curate; đĩa gốc runs/2026-08-07-S180-adap-upgrade-pack-phased/sub-n3-lane-b-gd2.md)

  • NGHI-THỨC ≠ MÁY, và sổ của chính SE là bằng chứng mạnh nhất — đừng suy, hãy đọc cột kiểu của error-ledger: AS-17 ghi procedural, AS-19 tự khai "🔴 hiện là nghi-thức, chưa cơ-khí-hoá". Khi bản đồ nói "SE đã có AS-17/AS-19" thì đó là có LUẬT, không phải có MÁY. Phép kiểm rẻ: grep cột kiểu, đừng grep tên mã lỗi.
  • Guard đo KÍCH THƯỚC mù với hỏng TỈ LỆ KHUNG/RUỘT (ca S180 N1: 7.049 B, 6/9 heading là [ĐANG ĐO], sau 202K token — nhip-no-probe báo run-chua-gom 0). Hai đại lượng không tương quan: tệp toàn heading tăng byte y hệt tệp đầy ruột. Dựng sandbox + chạy máy thật + control-dương (giấu *-synthesis.md → 1, trả lại → 0) mới phân biệt được với hỏng thước.
  • Vị từ bắt skeleton-ruột-rỗng rẻ nhất = neo NHÃN TREO VÀO HEADING, không phải đếm thô: grep -cE '^#{1,6} .*\[(ĐANG ĐO|CHỜ|TODO)'. Đếm thô cho dương-giả trên chính bản đã xong (câu định nghĩa nhãn ở header) = đúng lớp citation-trap self-reference đã có trong auto-memory; discriminator vẫn là use ⟂ mention. Đo 3 file: 6 / 0 / 0 — 0 dương-giả.
  • "Sổ chết" có hai loại, phải tách trước khi phán: runs/_ledger.md RETIRED có khai (lý do đo được 0/15 catch, người kế nhiệm chỉ định, caveat parity trung thực, đường đảo ngược) = suy-giảm hợp lệ, KHÔNG phải "quên". Nhưng hệ quả với người dùng vẫn y hệt: 73/88 run-folder không có dòng nào trong sổ ⇒ "điểm danh 2 nguồn" mất vế phải, không phải mất phép so. Khen cơ chế nghỉ-hưu, vẫn FAIL khoản chức năng.
  • BỘ ĐẾM không thay được MỤC LỤC: run-chua-gom N in một con số, không liệt tên, không có bộ-tệp-chuẩn, và đọc thẳng đĩa ⇒ nó chính là nguồn-1, không dùng làm nguồn-2 được. Nguồn-2 rẻ nhất đã nằm sẵn trên đĩa: taskList snapshot trong run.md ghi TRƯỚC launch.
  • Vùng chứa vật chứng đắt nhất lại nằm trong 2 vùng miễn cùng lúc: secrets_sweep(session_dir) chỉ rglob sessions/ (session_ctx.py:173/180/787) .claude/workflows/runs in nguyên văn trong khối - excluded: của detector. C11 là cửa hậu duy nhất, chỉ soi khuôn tag FLAG + diary-delta; 21/21 dòng chạm runs/ đều LOW + INFORM-only + tách khỏi TOTAL ⇒ mức nghiêm trọng đang ngược chiều yêu cầu "đắt tiền = nặng nhất".
  • Tỉ lệ không mẫu số là số vô nghĩa — ca đo được: cùng một sự thật GĐ-2 ra 42% / 72% / 25% tuỳ mẫu số (13 khoản lane / 8 bước thư chính / 6 ô nghiệm thu). Con số "~70%" của bản đồ không sai, nó là mẫu số dễ nhất trong ba; mẫu số hub dùng cấp nấc cho 25%. ⇒ khi thấy tỉ lệ trần, hỏi mẫu số TRƯỚC khi hỏi ai sai.
  • Reviewer tự thành ca bệnh mình đi soi (datum, không phải lời xin lỗi): lượt-1 của tôi hạ cánh 2.765 B / 150K token. Đối chiếu với ca N1 mới lộ ra điều không thấy nếu chỉ có 1 ca: V-2 (nhãn treo) phân biệt đúng "khung rỗng" ⟂ "ruột thật mới bắt đầu"; V-1 (tỉ lệ) thì không. Ca thứ hai là thứ chọn được vị từ.
  • Xác nhận ngược có giá trị: N2 F-06 (GĐ-2(v) "khai điểm mù" vắng trọn) ĐÚNG, và N2 còn nói nhẹ hơn sự thật — SE có sẵn 2/3 vế; bỏ khoản này là mất điểm cho việc đã làm đúng (A13), không chỉ mất cảnh báo. Nhưng đo tiếp thì vế (v-3) yếu hơn cả N2 lẫn tôi tưởng: lead-stale-auditor.md 0 hit run-folder|runs/ (control-dương FLAG=4) ⇒ tự hạ đánh giá của chính mình, giữ câu cũ để so.
  • Tag [s180, adap-gd2, nghi-thuc-vs-may, skeleton-ruot-rong, vi-tu-heading-scoped, use-vs-mention, ledger-retired-co-khai, diem-danh-2-nguon-thieu-ve-phai, mau-so-3-cach-lech-3-lan, sandbox-control-duong]

§@S152-R1 — S152 (07-25) R1 ranh NEVER (on-behalf lead) (verbatim move từ L1 @S180-N4 curate)

  • NEVER Edit/Write code-tree · NEVER commit · NEVER push — vai = verdict-only; sửa là việc em-main/implementer. Khai thật 2 nấc: ranh commit/push/code-tree chưa từng vỡ; Write/Edit runtime CÓ cấp và dùng hợp lệ cho sub-file run-folder + diary-self (AS-10). "NEVER" áp cho ĐÍCH (code/commit/push), không phải cho tool-tồn-tại; containment thật = git-diff lead. Tag [s152, r1-retention, never-target-scoped]

@S180 — ba khối verbatim chuyển từ L1 (curate 2026-08-07, hook-cap)

S180 (08-07) — N4 /fable-real reviewer · TỔNG HỢP 15 nguồn → wave-plan-S180.md (50.519 B, 7 wave + 3 sub gated)

  • "Sự-thật-đã-chốt" của lead = hàng rào tiết kiệm, nhưng phải giữ nguyên CHIỀU khi chép: errata E-5 phiên này — lead viết ĐẢO chiều-mù spawn-model-audit ngay trong prompt dù file verify của chính lead viết đúng. Tổng-hợp-viên chép PROMPT thay vì chép FILE-VERIFY thì bản vá đi sửa đúng phía đang chạy tốt. ⇒ khi 2 bản phát biểu của CÙNG một người lệch nhau, tin bản có PHÉP ĐO đính kèm.
  • Ô-đòi-MÃ không nhận CÂU-VĂN: N1 điền "điều kiện tồn tại của mọi TC" vào ô TC (fitmap:238) — lane E gọi đúng tên: wave không trỏ mã TC = wave thoát ràng buộc nghiệm thu. Fix chuẩn: tạm-gán mã có ca-sống (TC-06, A0-3 0-hit) + khai NGOẠI-LỆ + trình chủ-luật 2 đường — đừng bịa chữ vào ô mã.
  • Tự dẫm nhãn-số va nhau: tôi đặt câu hỏi owner Q1.. đụng nhãn quy-ước §Q1..Q6 trong CÙNG file ⇒ phải đổi P1..P8 + vá 3 ref đã ghi đĩa. Bài: 2 hệ đánh số trong 1 artifact = khác TIỀN TỐ ngay từ đầu.
  • Trục xếp wave đắt nhất = tách CHỮA ⟂ NGHIỆM-THU (lane E §4.4): TC-02/03/07 chỉ thiếu THƯỚC — mở wave "chữa" là làm thừa; TC-10 thiếu THUỐC — có nhãn GĐ-3 vẫn là lỗ. Trộn 2 trục ⇒ 2 sai ngược chiều cùng lúc.
  • Ghi-đĩa-4-nhát qua Edit-append anchor-đuôi (header → W0-2 → W3-4b → W5-6+chốt): chết giữa chừng vẫn giữ trọn wave đã chốt. Phiên 13 vai dính #53 — 4 nhát land sạch, 0 mục-lục-rỗng.
  • Tag [s180, n4-wave-plan, od-2, tc-contract-hole, ma-vs-cau-van, p-vs-q-prefix, chua-vs-nghiem-thu, edit-append-anchor]

S180 (08-07) — W0 lane a/2: dựng docs/governance/adap-upgrade-pack-{fitmap,tracking}.md (11.697 + 17.890 B)

  • 🔴 ACCEPTANCE ĐO HÌNH-DẠNG-DÒNG, KHÔNG ĐO GIÁ-TRỊ-Ôgrep -c '^| GĐ-[0-6]' vẫn ra 7 dù ô Quyết định điền sai từ-vựng. Lệnh lead bảo điền chưa làm (từ-vựng Phần C chấm-từng-khoản) vào ô Phần A (chỉ nhận áp dụng/không áp dụng/hoãn) ⇒ đẻ giá-trị-thứ-tư, đúng lỗi F-03 mà file sinh ra để đóng, mà nghiệm thu vẫn xanh. Vá: giữ áp dụng + đẩy "hiện trạng chưa làm" sang ô lý do; thêm phép đo GIÁ-TRỊ (awk đếm ô hợp lệ = 7/7). Cùng lớp: GĐ-6 "chưa ĐÁNH GIÁ ĐƯỢC" là kết luận về điều-kiện-vào, không phải giá trị ô ⇒ ô = hoãn.
  • 2 tệp anh em cùng có bảng 7 dòng = bẫy DƯƠNG-GIẢ thật: chạy nhầm lệnh bản-đồ trên tệp theo-dõi sẽ ra đúng 7 và "đạt". Vá bằng đổi cột đầu sang 0..6, rồi chạy chéo 2 chiều (0 và 0) + control-dương (GĐ- vẫn xuất hiện 16 lần ⇒ 0 là do không-bắt-đầu-bằng, không phải thước hỏng).
  • 🔴 grep -c exit 1 khi 0-hit ⇒ CẮT ĐỨT chuỗi && — lượt đo A0-3 chết ngay sau số 0, control-dương không kịp chạy, suýt nộp 0-hit không chứng-nhân. Tách lệnh hoặc || true.
  • 1 phép đo, 3 nguồn, 3 số: lane B liệt-từng-ô cộng ra 2,0/6 nhưng dòng tổng của chính nó ghi 1,5/6 (25%); wave-plan ghi 2/6; lead ghi "4/6 TRƯỢT" (= phần bù của 2/6). ⇒ chép PHẦN LIỆT KÊ vào tệp sống-lâu, đừng chép số tổng.
  • Tag [s180, w0-lane-a, fitmap, shape-vs-value-acceptance, sibling-table-false-pass, grep-exit1-chain-cut, vocab-phanA-vs-phanC]

S180 (08-07) — W0 lane b: broadcasts/_index.md mở phạm vi P6 + bù 17 dòng + ghi băm (nhật ký sub-w0b-index-hash.md, 20.553 B)

  • 🔴 LỆNH LEAD SAI, thi-hành-đúng-câu-chữ sẽ PHÁ chính mục-đích của lệnh: "backfill se cho 22 dòng cũ" — sổ có 45 dòng (23 se + 22 all), nên ghi se hàng loạt = dán nhãn sai lên đúng 22 dòng fan-out mà P6 sinh ra để hợp-thức-hoá. Gốc: hai con số 22 khác nghĩa va nhau trong CÙNG bản giao việc (22-fan-out-đang-sống ⟂ 22-thư-directed của check-email.md:62). ⇒ trị bằng nhau + nghĩa ngược = con số thôi làm chứng; dẫn giá-trị từng dòng từ đĩa, đừng gán hàng loạt.
  • 🔴 Bẫy đơn-vị: LEAD tự giẫm ngay trong lệnh đi nhắc tôi đừng giẫm. Lead đọc grep -c "upgrade-pack-phased" = 4 ⇒ kết luận "mới bù được 4", suýt bắt đo lại từ đầu. Chuỗi đó chỉ khớp 4 thư của gói, trần cứng = 4 dù bù bao nhiêu. Thật: 17 dòng đã land (grep -c "bù dòng @S180"=17 · INBOUND 45→62). ⇒ biết tên cái bẫy KHÔNG đủ; phải khai mẫu-số ngay cạnh con số.
  • 🔴 Glob */ bỏ trọn thư-mục GỐC — lane A đo inbox/*/ ⇒ mù đúng nơi thư chưa xử lý hạ cánh (check-email.md:64). Hôm nay 69/24 khớp tôi chỉ vì gốc chỉ có README.md = trùng hợp, không phải tương đương. Đệ quy + loại README bằng tên.
  • 🟢 Cột-mới đặt CUỐI hàng ⇒ "không sửa dòng cũ" thành PHÉP KIỂM chạy được: dòng cũ là tiền tố nghiêm ngặt của dòng mới, 45/45 đạt, OUTBOUND byte-identical. Khuôn tái dùng cho mọi ca thêm cột vào sổ bằng-chứng.
  • status định-nghĩa-bằng-thư-mục ⇒ gộp 2 kênh làm cột chỉ đo đúng NỬA số dòng: directed thì move⟺xử-lý-xong; fan-out thì /adap-apply không đụng thư mụcprocessed = "đã move", KHÔNG phải "đã áp". Khoản LƯỢC-ĐỒ, không tự thêm giá trị.
  • Mốc nước nói về VẮNG-KHỎI-HỘP-THƯ, không miễn cho thư ĐÃ NẰM TRONG hộp mà thiếu dòng — 7 thư trước mốc còn hở (4 cùng lớp lại CÓ dòng ⇒ dấu bỏ sót). Lệnh lead (17) ⟂ nghiệm-thu wave-plan:33 (=0) mâu thuẫn ⇒ trả lead, không tự phá.
  • stamp_verify.py 17/17 OK, exit 0, 0 tamper; 4 thư gói khai content_sha256 8-hex (script so tiền-tố). 4 thư mang status: DRAFT+reviewer_gate: PENDINGthu-chinh đòi dấu đã-duyệt ⇒ lệch trạng-thái, KHÔNG tamper.
  • Thước hỏng phiên này: heredoc <<'EOF' gãy với nội dung tiếng Việt + backtick (lead dính y hệt) ⇒ ghi tệp dài dùng Write/Edit, đừng cat >>.
  • Tag [s180, w0-lane-b, broadcasts-index, p6-additive, colliding-22, grep-substring-ceiling, glob-star-slash-blind, prefix-preserving-column, status-defined-by-folder, watermark-scope, heredoc-broken]

@S182 — YC-013 KHKK 8 panel nhóm mirror DuyetNcc (2 lượt review: SPEC rồi DIFF)

Đĩa: runs/2026-08-08-S182-khkk-awf-mirror-ncc/sub-review-1-fable.md (lượt SPEC) · .../sub-reviewer-precommit.md (lượt DIFF).

Lượt 1 — review SPEC (PASS_WITH_FIXES 2C/5M)

Chấm SPEC = đo lại claim của spec trên code. Đa số HELD, nhưng:

  • 🔴 spec-unbuildable vì ASSEMBLY-RANH. Spec bảo "extract helper rồi gọi 3 site" — chết ở site-3 (SubmitAsync) vì site đó nằm ở Infrastructure còn helper định để internal trong Application, và InternalsVisibleTo chỉ mở cho Tests. ⇒ Luật rút ra: mọi đề-xuất extract-helper đa-assembly phải kiểm ACCESSIBILITY trước khi phán "vá rẻ".
  • 🔴 usage-count trên bảng có HasQueryFilter mà thiếu IgnoreQueryFilters() = đếm sót phiếu xoá-mềm trong khi FK vẫn chặn ⇒ test hẹp xanh, ca phổ biến vẫn 500. Claim "hết 500" MẠNH HƠN bản vá.
  • 🔴 "FK chặn nên data không mất" phải grep FK THẬT. 8 cột pin ⟂ chỉ 4 HasForeignKey hit ⇒ 5 pin loose-Guid hard-delete êm + dangling. Suy từ 3 module đã biết là suy sai.
  • 2 invest cùng dùng chữ "per-Code" nhưng KHÔNG cùng công-thức (typeEnum==10 ⟂ regex-họ-mã) — khác hành vi ở code ngoài-họ. Spec khai "hội tụ" ⇒ che mất chỗ lệch. Phải khoá công thức + test ca phân-kỳ.
  • Cờ ignored-nhưng-hành-vi-luôn-bật: gray-out kiểu "chưa áp dụng" = nói dối theo CHIỀU NGƯỢC.
  • Baseline "645" trong spec ⟂ STATUS 644 — đo tươi, đừng chép.

Lượt 2 — review DIFF pre-commit (PASS_WITH_FIXES 0C/3M + 6 minor)

Đo độc lập (không nhận số của lane): dotnet test = 45 + 614 = 659 P / 0 F (baseline 645 = 45+600 ⇒ +14 đúng ở Infrastructure) · npm run build ×2 exit 0 · tsc -p tsconfig.app.json 0-err (225 / 214 file).

3/3 finding 🔴 của lượt 1 được đóng ĐÚNG BẢN CHẤT, không đóng bằng chữ — đây là dữ liệu hiếm: (a) assembly-ranh → file public static class riêng ở Application, 3 call-site, đối số đúng thứ tự cả 3; (b) IgnoreQueryFilters đúng 3 bảng có filter, và phân biệt được 2 CHIỀU (DELETE cần bỏ filter vì FK còn thật; changelog CỐ Ý giữ filter vì ghi vết cho phiếu đã xoá là rác) — cùng một hàm-gọi, hai ngữ nghĩa ngược nhau, có khai tại chỗ; (c) 8 module pin verified bằng grep -E "public (Guid|Guid\?) ApprovalWorkflowId" trên Domain (đúng 8, +1 hit FK nội bộ của Step phải loại), 5 module loose-0-FK được khai là "rào DUY NHẤT" và T12 chứng minh dangling THẬT trong DB.

MAJOR-1 — tooltip gắn trên <input disabled> ⇒ Chrome/Edge không hiện. 7 title= đặt trên chính checkbox bị disabled; Chromium chặn sự kiện chuột trên form-control disabled nên native tooltip thường không bật (Firefox thì có), và <label> bao ngoài KHÔNG mang title nên rê vào chữ cũng không ra. Nặng nhất ở ô #4: câu riêng của nó là thông tin DUY NHẤT phân biệt "cờ chưa phân nhánh" với 6 ô "chưa áp dụng" ⇒ tooltip câm = ô #4 đọc thành NGƯỢC NGHĨA, đúng class lỗi mà ERRATA vừa sửa xong ở tầng checked. Luật rút ra: quyết-định-của-owner nằm trong tooltip thì phải kiểm tooltip có CỬA HIỆN không — máy dựng mà không ai gọi. Tiền lệ cùng bệnh đã tồn tại từ đợt trước ⇒ vá phải vá cùng LỚP.

MAJOR-2 — 3 thành phần bất đồng HOA/thường, và test MÙ THEO CẤU TRÚC. Cùng câu hỏi "code này có phải nhóm N{n}", ba luật khác nhau: regex ^KHKK-N([1-8])$ CultureInvariant, KHÔNG IgnoreCase (case-sensitive) ⟂ w.Code == request.Code chạy theo collation SQL Server _CI_AS (case-INsensitive) ⟂ FE .toUpperCase() (case-insensitive). Hệ quả: mã khkk-n1 gõ tay ở panel gộp sẽ hạ IsActive bản thật, vẫn được FE auto-pin, mà rào nhóm + rào version-cuối TẮT im lặng. 🔴 Test không thể thấy vì fixture chạy SQLite (BINARY = case-SENSITIVE) ⇒ tầng DB trong test có ngữ nghĩa NGƯỢC với prod. Đây không phải test ẩu — mù theo cấu trúc, không assertion nào bịt được. Luật rút ra: mọi bất-biến dựa trên so-sánh CHUỖI ở tầng DB đều không được test-SQLite bảo chứng; chuẩn hoá ở ĐƯỜNG GHI (Trim().ToUpperInvariant()) hoặc khai phụ-thuộc-collation ngay tại chỗ.

MAJOR-3 — guard mới ở write-path CHÍNH có 0 test. Rào D6 cắm 2 site (Create + UpdateDraft) nhưng 4 chân của ca test đều đi qua UpdateDraft ⇒ nhánh Create (đường mọi phiếu prod sinh ra) không có răng nào. Gỡ nó đi thì 659 test vẫn xanh. Đây là lỗ của SPEC (spec liệt 14 ca và thiếu ca này), implementer làm đúng spec — nhưng không hạ thước theo spec.

MINOR đáng nhớ: (1) Contain("N5").And.Contain("N3") mù THỨ TỰ toán hạng — hàm mới nhận 2 tham số kề nhau ở 3 call-site, đảo là vẫn xanh (tôi phải đối chiếu TAY mới chốt được cả 3 đúng); pin nguyên câu có thứ tự mới giữ được bất-biến. (2) File governance bị thêm BOM ef bb bf + CRLF lẫn vào commit code (HEAD 7b 0a → worktree ef bb bf 7b 0d 0a) ⇒ git add từng file, đừng -A. (3) rào version-cuối đếm anh-em KHÔNG lọc ApplicableType. (4) "state THẬT" của ô disabled chỉ đúng cho đường CLONE/EDIT — đường TẠO MỚI thì 6 ô khoá bị đóng băng ở DEFAULT của FE, admin không sửa được.

FLAG-A của FE lane — đo được và ĐÚNG: npx tsc --noEmit trần ở repo này biên dịch 0 file (tsconfig.json = {"files": [], "references": [...]}) ⇒ luôn xanh theo cấu trúc. Chứng bằng --listFiles | wc -l: 0 dòng cho dạng trần ⟂ 225 / 214 dòng cho -p tsconfig.app.json. 🔸 Bổ sung: npm run build = tsc -b && vite build, mà tsc -b CÓ đi theo project references ⇒ acceptance npm run build là thước THẬT. Luật rút ra: acceptance kiểu "lệnh X xanh" phải kèm MỘT phép đo chứng thước không rỗng (--listFiles, -c, số file/ca) — exit 0 của một lệnh không đọc file nào trông y hệt exit 0 của một lệnh đọc 225 file.

Khuôn chống-nhiễu đáng tái dùng (từ chính bộ test này): ca Submit có SẴN 3 cửa 409 khác ⇒ bắt được ConflictException là CHƯA nói lên gì; bộ test xử bằng cách kéo dữ liệu fixture đi theo biến đang đo (hạng-mục lấy ApprovalGroup của phiếu) để 2 cửa nhiễu im, rồi thả một phiếu chứng-nhân khác đúng một biến trong CÙNG lượt.

  • Tag [s182, yc-013, khkk, assembly-boundary-extract, ignorequeryfilters-two-directions, tooltip-on-disabled-input, collation-vs-sqlite-blind, guard-untested-write-path, argument-order-blind-assert, vacuous-tsc-noemit, bom-in-code-commit]