diff --git a/.claude/agent-memory/reviewer/MEMORY.md b/.claude/agent-memory/reviewer/MEMORY.md index 1ed1fbe..01aa22d 100644 --- a/.claude/agent-memory/reviewer/MEMORY.md +++ b/.claude/agent-memory/reviewer/MEMORY.md @@ -1,23 +1,16 @@ # Reviewer Agent — Persistent Memory -- **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-LEDGER` — `find -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.ps1` ⟂ `session_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]` +- **[→ `archive/2026-08.md` §@S180 — verbatim, probe 10/10 + control-âm 0] S180 (08-07) LANE A/6 GĐ-0+GĐ-1 (đĩa `runs/…-S180-adap-upgrade-pack-phased/sub-n3-lane-a-gd01.md` 57 KB):** 🔴 **"0 hit" ĐÚNG THEO LUẬT vẫn là LỖ THẬT** — `_index` thiếu **24/69** thư (lead giao "4"); `to=se` **23/23 sạch** ⟂ `to=all-fit` 22 có/20 thiếu; luật `:7` trỏ `COMMS-LEDGER` mà `find "*COMMS*"`=**0 trong SE** (control `*ledger*`=4) ⇒ **sổ mà luật trỏ tới KHÔNG TỒN TẠI**; S153 phán dương-giả = đúng cho câu-hỏi CŨ. ⇒ gặp 0-hit phải hỏi thêm **"sổ đó có tồn tại không"** · **phân-họ regex 160/159, lệch 1 vì `S57bis`** ⇒ luôn cộng lại đối-chiếu tổng · **`CLAUDE.md` quy-ước nhật-ký khớp ≤64/159 đĩa** · **"single source" tự-xưng ≠ chuẩn** (bảng-dịch; 3 phép thử tiên-đoán/phủ-sóng/hướng) · **số-trong-chú-thích trôi** (`hmw.js` "11 class" ⟂ đĩa **12**). -- **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]` +- **[→ `archive/2026-08.md` §@S179 — verbatim] S179 (08-07) C7 re-review sau vá — `PASS-WITH-8`, 3 MAJOR:** **2/3 MAJOR là lỗi TRONG CHÍNH BẢN VÁ vừa pass 12/12 acceptance** — vì acceptance đo **HÌNH-DẠNG chuỗi, không đo HÀNH-VI**. `cut -c4-` đẻ path RÁC (rename 1 dòng `R old -> new`) · ba-chấm→hai-chấm = **regression có điều-kiện** (thủ phạm thật = `git diff` mù untracked, lead gán sai tội) · mỏ-neo `:112` **tự-vô-hiệu ngay lúc viết** ⇒ neo TÊN SELECTOR không neo số dòng · census "8/9" thiếu 3 ý đóng im lặng. -- **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 HELD** ⇒ *cite 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à `
` trần) — 🔴 **chính bẫy này sau đó lead tự dẫm** (grep `'
'cùng tập' · tiền-lệ đo ở BASE không ở cây đã sửa · 'N/N OK' chết theo phiên khi FE 0 hạ-tầng-test · **flake chỉ lộ ở LƯỢT ĐẦU và `-v q` NUỐT assert** · probe RED bằng đổi TEST-INPUT chỉ khi tham số xuất hiện ĐÚNG 1 chỗ · `Total` là vân-tay lọc-SERVER chỉ khi `CountAsync` sau `Where` trước `Skip/Take`. +- **[→ archive/2026-07.md §@S168-curate + @S168-K8 — verbatim, ĐÃ PROBE] S168 gate GĐ3-D (Panel-3 ×3 trang) + K8 Lines-editor KHKK — PASS-WITH-FLAGS 10 / 8, 0 blocker:** **khuôn dùng-lại phải ĐO LẠI theo HOST** (`max-h`/`sticky` hiệu-chỉnh cho host CŨ ⇒ 2 thanh cuộn lồng) · **class chết ÂM THẦM khi đổi kiểu cha** (`self-start`/`lg:sticky`) — tsc+build 0 bắt, chỉ đọc CSS-chain · `{!selectedId && }` = unmount ⇒ **mất state thuần** trong khi `localStorage` sống · **1 con số đóng 2 câu hỏi** (642 = 639 + 3 Fact) · **quy-ước-của-chính-file là thước rẻ nhất** (mọi changelog điền `EntityId`, chỗ mới là chỗ DUY NHẤT trống ⇒ MAJOR bằng 1 grep) · **`` controlled NUỐT giá-trị đã lưu** khi option vắng (đang tải · query lỗi không toast · entry `IsActive=false` sau gán) ⇒ regression hiển thị do ĐỔI KIỂU Ô, tsc+build+test 0 bắt · **bình-luận tự-hẹn mắt-xích tương lai** chưa trả ⇒ nhưng ĐO khả-chạm trước khi hô (UNIQUE tầng trên khoá ⇒ hạ MINOR) · khe RỖNG khai rỗng ×2 · test phủ NỬA vế `if` (`!IsActive` chưa chạy lần nào) · thước hỏng `$?` sau `| tail` ⇒ đo lại `tsc -b --force`. - -- **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]` +- **[→ `archive/2026-08.md` §@S170 — verbatim] S170 GATE Fidelity `/sleep-recovery-memory-l2` — PASS-WITH-FIXES:** **tên-cờ-bịa sống 4 hiện-vật** (0-hit cần dụng-cụ THỨ HAI `git log --all -S` mới nâng nghi→chốt) · **nhãn phủ TÊN mà không phủ CON-SỐ** ⇒ 'giữ 4 lần, bỏ tên cờ' = giữ khẳng-định + vứt CHỨNG-NHÂN (Goodhart) · **census tự-xưng đủ** ('4 LỖ') thiếu 4 lỗ · `pointer-style: substring` phải CHẠY THỬ (1/10 chết vì hoa-thường) · **lưới token in ĐẦU-DÒNG không in lân-cận** ⇒ mega-line gán FAIL cho Run PASS. - **[→ archive/2026-07.md §@S167-K7-curate-2 — verbatim] S167 gate K6 admin thu-gọn — PASS-WITH-FLAGS 5 (digest):** **cây menu PROD SỐNG là thước, seed chỉ là bản vẽ** (`curl /api/menus/me` + control-âm bỏ 1 key). **`filterForAdmin` mới là bước MỘT** — còn `resolvePath→null` drop im lặng (#50) + group rỗng-hoá render như LEAF. **typo-noop**: key ẩn sai chính tả = `Set.has` false, module vẫn hiện, tsc vẫn xanh ⇒ assert TỪNG key TỒN TẠI trong cây prod. MAJOR: CẤM số-đếm trong comment. @@ -106,26 +99,17 @@ Adversarial pre-commit reviewer SOLUTION_ERP. Read-only verify + live curl prod --- ## 🔄 Curate trigger -- ⚠️ **@S168-K8 đo lại: 18.3KB — VƯỢT cap 17.1KB ⇒ spawn sau curate NGAY** (đã append verbatim K8 vào `archive/2026-07.md`, L1 chỉ giữ digest). -- ✅ **@S168 curate: 22.2KB → <17.1KB (ĐO, không đoán).** Trình tự S102 giữ nguyên: append archive TRƯỚC → probe moved-not-cut + control-âm → mới cắt. 🔴 **Bài mới:** (a) tôi ghi '~20.6KB' bằng ƯỚC LƯỢNG trong khi `wc -c` cho 22.2KB — **số trong sổ phải là số ĐO**, và baseline '19.0KB' thừa kế từ pass trước cũng đã stale; (b) probe moved-not-cut bằng token lấy từ DIGEST cho **0-hit GIẢ** (digest là paraphrase, bản gốc dùng chữ khác) ⇒ 0-hit phải **thử token thứ 2 từ thân bài** trước khi kết luận cut-not-moved — suýt giữ lại 938B vô ích; (c) **script sinh chữ lại đẻ chữ hỏng câm** (token `join` trong chuỗi làm entry vỡ đôi dòng) — đúng bài S166-K5, byte-count KHÔNG bắt, chỉ ĐỌC LẠI mới thấy. -- Hook-cap **>17.1KB** (24.4KB read-limit, S109) → archive recent → L2 `archive/.md` (append additive) + `_INDEX.md` pointer. Stale >3mo → remove. -- **Prev curates:** S166-K5 (probe 3/3) · S162 (2/2) · S145 · S140 · S134 · S128 · **S102 recovery: cut-not-moved ×5 `f229b07` ⇒ mọi L1-shrink kèm '→archive' BẮT BUỘC grep moved-not-cut TRƯỚC khi trust** · S116·S113·S109·S80·S71·S70·S40. +- Hook-cap **>17.1KB** (24.4KB read-limit) → move recent → L2 `archive/.md` (additive) + `_INDEX.md` pointer. Stale >3mo → remove. +- **Trình tự BẮT BUỘC (S102 recovery, cut-not-moved ×5 `f229b07`):** append archive TRƯỚC → probe moved-not-cut **bằng token lấy từ THÂN BÀI, không lấy từ digest** (digest là paraphrase ⇒ 0-hit GIẢ; @S168 suýt giữ 938 B vô ích) + control-âm → mới cắt. +- **3 bài đo:** số trong sổ phải là số **ĐO** không ước (`wc -c`, baseline thừa-kế cũng stale) · script sinh chữ **đẻ chữ hỏng câm** (byte-count không bắt, chỉ ĐỌC LẠI mới thấy) · hook đếm **KÝ TỰ** còn `wc -c` đếm **BYTE** — tiếng Việt đa-byte ⇒ 2 số lệch nhau là bình thường, đừng truy "ai sai". +- **Prev:** S180 (probe 10/10 + control-âm) · S168 (22.2→17.1) · S166-K5 (3/3) · S162 (2/2) · S145 · S140 · S134 · S128 · S102 · S116 · S113 · S109 · S80 · S71 · S70 · S40. ## S152 (07-25) — R1 ranh NEVER (on-behalf lead) - **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]` - **[→ archive/2026-07.md @S165-curate] S159 đợt-1 (07-29) diff pipeline — 7 FLAG:** rút TOÀN BỘ chuỗi hiển-thị MỚI từ diff rồi soi từng chuỗi = phép đo 100%-tiếng-Việt · 2 queryKey cùng resource = 2 ảnh-chụp khác thời-điểm · a11y nút TRÙNG tên đọc-được · bác-claim cũng phải có chứng. -## S176 (08-06) — 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//`** ⇒ `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. -- **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]` +- **[→ `archive/2026-08.md` §@S176 — verbatim] S176 (08-06) SETUP-REVIEW đội STYLE 3 vai — `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). 🔴 **thước dispatch MÙ WORKING-TREE** (`git diff origin/main...HEAD` ba-chấm trả RỖNG ⇒ đội gate pre-commit **chết câm** đúng use-case chính) · **đo TREE ≠ đo HISTORY** (thước tree tự lành ca revert ⇒ lo-nghi "revert phá thước" = lo hão) · **miễn-trừ chỉ-con-trỏ = dấu cao-su** ⇒ đòi TRÍCH NGUYÊN VĂN ≤1 dòng, khép vòng bằng owner-visibility · **thách-CLEAN bẻ được nếu không bắt neo `file:line` cả 2 bờ** · **3/5 lo wiring của lead là LO HÃO** (script enumerate ĐỘNG — đừng giả-định hardcode, mở ra đo) · **chép-luật-vào-persona vi phạm chính B1 viết trong CÙNG file** ⇒ viết luật cấm-chép xong phải grep chính file mình. *(🔄 @S180: khoản "3 vai thiếu dir agent-memory" ĐÃ ĐÓNG — 26⟂26 khớp.)* ## 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" (`runs/2026-08-07-S180-adap-upgrade-pack-phased/sub-n3-lane-b-gd2.md`) diff --git a/.claude/workflows/runs/2026-08-07-S180-adap-upgrade-pack-phased/.claude/agent-memory/reviewer/MEMORY.md b/.claude/workflows/runs/2026-08-07-S180-adap-upgrade-pack-phased/.claude/agent-memory/reviewer/MEMORY.md index 3d03bae..d1156fc 100644 --- a/.claude/workflows/runs/2026-08-07-S180-adap-upgrade-pack-phased/.claude/agent-memory/reviewer/MEMORY.md +++ b/.claude/workflows/runs/2026-08-07-S180-adap-upgrade-pack-phased/.claude/agent-memory/reviewer/MEMORY.md @@ -1,8 +1,22 @@ -# Reviewer memory — run S180 lane D (GĐ-5 / GĐ-6) +# Memory Index — reviewer (run S180 · lane E trục bệnh) -> Ghi ở thư mục ký-ức CỦA RUN (đã scaffold sẵn), KHÔNG ghi đè -> `.claude/agent-memory/reviewer/MEMORY.md` canonical — 6 lane reviewer chạy song song phiên này, -> canonical vừa bị sửa 14:34 ⇒ ghi thẳng vào đó là ca AS-10 fragment/clash. em-main gộp khi closeout. +> Một dòng mỗi memory. Chi tiết nằm trong tệp chủ đề; index này chỉ là móc gợi nhớ. -- [Proxy-vị-từ làm thước mù](proxy_predicate_blind_measure.md) — máy chọn mẫu bằng HÌNH DẠNG đường dẫn, đổi đường spawn là mù câm mà vẫn in "0 lệch" -- [Claim xếp hạng cần hai mẫu số](ranking_claim_needs_two_denominators.md) — "gần xong nhất" chỉ đứng khi có ≥2 đại lượng CÙNG ĐƠN VỊ; N1 đưa 0 +## Feedback — cách làm việc khi review +- [Neo số dòng chết ngay khi sinh](feedback_stale_anchor_born_dead.md) — mở neo tại CHÍNH commit đang review; luật B1 trỏ-canonical đang tự cài bằng cơ chế hỏng +- [Đo bằng chính regex của máy](feedback_measure_with_detectors_own_regex.md) — grep gần đúng làm lỗ nhỏ đi 6 lần; luôn kèm control-dương +- [Hai số lệch = hỏi đếm CÁI GÌ](feedback_unit_mismatch_keep_both.md) — tuyên một bên thắng là xoá mất hiệu số, mà hiệu số mới là phát hiện + +## Recent activity — S180 lane E (2026-08-07) + +**Anti-pattern quan sát được** +- *Nhãn đóng hẹp hơn phạm vi thi hành:* slot (70) `HANDOFF:50` dán ĐÓNG @S179 trong khi rider lỗi máy ở `:51` còn sống — và lỗ thủng **to gấp đôi sau khi đóng** (12 → 25 slug). Đóng khoản phải hỏi "máy này quét những đâu" so với "khoản này áp ở những đâu". +- *Khai trạng-thái-quá-khứ bằng thì hiện-tại:* lead liệt `session_ctx_kb` là ghost-wire 0-reader; đo ra ghost-wire **đã đóng @S153** (`scripts/session_ctx.py:528/:563` là reader fail-loud). Trùng đúng kiểu món `pull_warn_days` đã bị bác trước đó — hai lần cùng lỗi trong cùng một ô bảng. +- *Lách luật bằng cách viết chữ vào ô đòi mã:* ô "TC chữa" của wave W0 điền *"điều kiện tồn tại của mọi TC"* — không phải một TC. +- *Va chạm tệp tạm giữa các lane song song:* tệp staging dùng tên chung bị lane khác ghi đè giữa hai lượt; chỉ phát hiện nhờ `grep` chuỗi đặc trưng trước khi nối. Nối mù = mất dữ liệu im lặng. + +**Claim chống được phản biện (validation dương)** +- 3/3 ca LỚP-2 lead nêu đều đứng sau khi đo độc lập (`harvest-curator` F-05 · `lead-stale-auditor` · `ring2-audit` "5 class" vs enum 6). +- Worker-tier-pin: `26 model: opus` + `26 effort: max`, control-âm sạch (không persona nào khai model khác) ⇒ đủ mạnh để khai `không áp dụng` cho TC-03/TC-09. + +**Kết quả lane** — 9 lớp giẫm 9/9 (bác 1 CA trong LỚP-9) · 12 TC: 10 mắc / 2 không mắc · 1 GĐ-đồ-chơi (GĐ-0 không trỏ về TC nào) · 1 TC-không-ai-chữa (TC-10, chỉ có nhãn GĐ-3 chứ không có thuốc). Lead sót 3 ca. Artefact: `sub-n3-lane-e-benh.md` (38.531 B · 176 dòng ruột / 24 heading · 0 mục lục rỗng). diff --git a/.claude/workflows/runs/2026-08-07-S180-adap-upgrade-pack-phased/.claude/agent-memory/reviewer/feedback_unit_mismatch_keep_both.md b/.claude/workflows/runs/2026-08-07-S180-adap-upgrade-pack-phased/.claude/agent-memory/reviewer/feedback_unit_mismatch_keep_both.md new file mode 100644 index 0000000..38dd5c5 --- /dev/null +++ b/.claude/workflows/runs/2026-08-07-S180-adap-upgrade-pack-phased/.claude/agent-memory/reviewer/feedback_unit_mismatch_keep_both.md @@ -0,0 +1,18 @@ +--- +name: unit-mismatch-keep-both-numbers +description: Hai số lệch thì hỏi "đếm CÁI GÌ" trước khi hỏi "ai sai" — tuyên một bên thắng là xoá mất chính thông tin đắt nhất +metadata: + type: feedback +--- + +Gặp hai (hay ba) con số lệch nhau cho "cùng một đại lượng": **giữ cả hai, gắn đơn vị cho từng số**, rồi đọc **hiệu số** như một phát hiện. Cấm phán "bên nào đúng" trước khi biết mỗi bên đếm cái gì. + +**Why:** @S180, N2 xử vụ số-lệch bằng cách tuyên một bên thắng, trong khi đo lại cho thấy đó là **lệch ĐƠN VỊ chứ không phải lỗi**: +- `runs/`: `ls -d */` = **88 thư mục** · `ls */run.md` = **85** ⇒ hiệu số 3 chính là **3 thư mục lượt chạy không có tệp mô tả** (`S117-pe-approve-minmax-range`, `S117-pe-luyke-finalize`, `S144-bootstrap`) — đúng bệnh TC-04 đang chảy máu, và nó **biến mất** ngay khi chọn một con số. +- `auto-memory/`: **61 tệp** = **60 memory + 1 `MEMORY.md` index**. Không bên nào sai. + +Cùng lớp với ca `harvest-curator` F-05 cùng phiên: baseline "24 hit/11 file" không khai đơn vị — `grep -rc` đếm **DÒNG** (22), `grep -ro | wc -l` đếm **LẦN** (24). Bài học chống bẫy này đã được viết ra từ S168 nhưng nằm trong tệp **chính vai đó chưa harvest**, nên vai giẫm lại đúng bẫy 6 phiên sau. + +Biến thể tinh vi hơn: "đã harvest chưa" đo bằng `grep -c "S168" MEMORY.md` = 2 ⇒ trông như đã harvest; thật ra 2 hit đó là **mention nằm trong entry S179**, không phải **entry S168**. Đơn vị ở đây là *mention ⟂ entry*. + +**How to apply:** (1) Mọi con số bàn giao **phải kèm đơn vị và lệnh sinh ra nó**. (2) Khi review thấy ai đó "chốt" một trong hai số, đòi họ nêu hai thước trước. (3) Đọc hiệu số như dữ liệu, không như nhiễu. Liên quan: [[stale-anchor-born-dead]] · [[measure-with-the-detectors-own-regex]] diff --git a/.claude/workflows/runs/2026-08-07-S180-adap-upgrade-pack-phased/lead-errata-S180.md b/.claude/workflows/runs/2026-08-07-S180-adap-upgrade-pack-phased/lead-errata-S180.md new file mode 100644 index 0000000..1766e34 --- /dev/null +++ b/.claude/workflows/runs/2026-08-07-S180-adap-upgrade-pack-phased/lead-errata-S180.md @@ -0,0 +1,61 @@ +# ERRATA của LEAD — phiên S180, arc adap upgrade-pack + +> Gom mọi chỗ **lead nói sai và bị vai bác**, để không thành neo thối cho phiên sau. Mỗi mục ghi: lead nói gì · ai bác · bằng chứng · class. + +## E-1 — BƯỚC 0.9 "kênh `all` = 0 thư cần áp" +**Lead nói:** thư mới nhất (08-05) đã có adap-report ⇒ mọi thư cũ hơn đã xong ⇒ `all = 0`. +**Ai bác:** `lead-gap-auditor` (FLAG-3), qua mẩu garble #53. +**Sự thật:** **4 thư `2026-08-04-upgrade-pack-phased-*` CHƯA ÁP** — `ls adap-reports/ | grep -c 2026-08-04` = 0; 4 token = 0/0/0/0. Control-dương `loi-do-luong` = 1. +**Class:** suy từ thư-mới-nhất ra cả-tập. Phép đúng = **A∖B trên TỪNG THƯ**. + +## E-2 — Bundle hash trong Phase 3 REPORT +**Lead nói:** `Ajv-MaCz` / `YsXRkBSR`. +**Ai bác:** `lead-stale-auditor` FLAG-3. +**Sự thật:** đó là cặp **S172**; cửa-sổ 6 (@S179) đã deploy **`CuWgMI7J` · `32bJmjpM`** (`STATUS:6` có, row canonical `:481` chưa lật ⇒ STATUS **tự mâu thuẫn nội file**). +**Class:** B1 trỏ-không-chép **dẫn thẳng vào ô đã ô nhiễm**; và con trỏ ghi `:479` trong khi row ở `:481`. + +## E-3 — Lập luận BÁC-3 "cùng sinh @S145" +**Lead nói:** *"`hmw.js:39` và diary vai đều sinh @S145 ⇒ đồng biến, không phải 2 nhân chứng"*. +**Ai bác:** `ring1-audit` (F-I BROKE → vào LEAD). +**Sự thật (`git blame`):** `README:152` = `2757e41` **07-22** · `hmw.js:39` = `398d343` **07-25** · diary = **08-05/08-07**. **Ba mốc khác nhau.** Lead đọc nhãn `+S145` **trong nội dung comment** thành **ngày viết dòng**. +🔴 **Kết luận vẫn đúng, đường đi phải đổi** — dạng đúng: *"hai bản sao **CHƯA-CẬP-NHẬT** của cùng một trạng thái cũ"*. +**Class:** đúng lớp lỗi lead đang buộc cho vai (đọc nhãn thay vì đo). + +## E-4 — "đã in `[OK] worker-tier-pin holds` ở bookend @open" +**Lead nói:** defect `spawn-model-audit` đã cắn ngay hôm nay ở bookend. +**Ai bác:** **lead tự bắt** cùng lượt. +**Sự thật:** bookend @open chạy **8 script**, **KHÔNG có `spawn-model-audit.ps1`**. Lượt chạy duy nhất trong S180 = chính lượt verify defect. +**Class:** `claim-stronger-than-work` — thêm chi tiết **không đo được** vào lập luận **đã đứng vững**, vì nó kịch tính hơn. + +## E-5 — Chiều mù của `spawn-model-audit` (viết ngược TRONG LỆNH) +**Lead nói (file verify):** máy THẤY Workflow, MÙ Task ✅ đúng. +**Lead nói (prompt gửi lane D):** *"sai câm với đường **Workflow**… control-dương: đường **Agent-tool** thì nó bắt được?"* ❌ **ngược**. +**Ai bác:** lane D — *"Lệnh của lead ĐẢO NGƯỢC chiều mù — tôi không gật. Vá theo chiều lead viết = vá nhầm phía."* +**Class:** cùng nội dung, hai lần diễn đạt, một lần lật chiều. **Nếu vai gật thì bản vá đi sửa đúng phía đang chạy tốt.** + +## E-6 — Ô "LỚP-9 ghost-wire": **3 món, SAI 2** +**Lead nói:** `tools-whitelist-no-teeth` · `session_ctx_kb` 0-reader · `pull_warn_days` khoá trống. +| món | phán | ai bác | bằng chứng | +|---|---|---|---| +| `pull_warn_days` | ❌ **SAI** | N1 | `check-email.md:48` — *"🔒 CỐ Ý để TRỐNG — anh không đặt số @S148, script cấm tự chế mặc-định"* ⇒ **cố-ý-chưa-đặt-CÓ-KHAI**, khác *defined-but-unread* | +| `session_ctx_kb` | ❌ **SAI, stale ~27 phiên** | lane E | ghost-wire **ĐÓNG @S153**: `session_ctx.py:528` *"the FIRST REAL READER of session_ctx_kb (closes the H18 ghost-wire)"* + `:563` `_require_budget_kb` fail-loud + `:588` dùng thật | +| `tools-whitelist-no-teeth` | 🟡 **giữ là ca, hạ nấc** | lane E | SE **đã tự khai ở ≥7 persona** ⇒ đúng vế 2 của vá hub ⇒ **không phải vết thương hở, N4 đừng mở wave** | +**Class:** cả 3 lấy **từ trí nhớ, không đo lại**. Lane E gọi đúng tên: *"lần thứ hai cùng một lỗi trong cùng một ô"*. + +## E-7 — LỚP-6 lead khai THIẾU +**Lead nói:** 1 neo lệch (`STATUS:8` trỏ `:479`, row ở `:481`). +**Ai bổ sung:** lane E — **3 neo, đều lệch đúng +2**: Policies/Menu keys `:470-471`→thật **`:472`/`:473`** · `:474`/`:476`→thật `:476`/`:478`. +🔴 Neo thứ ba **CHẾT NGAY TẠI COMMIT SINH RA NÓ** (`git show 57e672f`) — và nó nằm **bên trong chính câu mà `lead-stale-auditor` FLAG-6 tự khen là bắt được stale**. +🔴 **Vòng ngoài:** cả 3 neo **chính là luật B1 đang thi hành** ⇒ **thuốc chữa LỚP-5 đang được xây bằng bệnh LỚP-6**. + +## E-8 — LỚP-8 lead khai NHẸ HƠN sự thật +**Lead nói:** slot (70) đóng-hụt, rider lỗi máy còn sống. +**Ai siết:** lane F + lane E, đo bằng **chính regex của detector** (không grep thô). +**Sự thật:** `marks[0]` nay ở **`:172`** (S179 closeout viết `### NEXT em` trong khi regex chỉ khớp `^\*\*`) ⇒ vùng mù **~21-46% tuỳ đơn vị**, **25/54 carry key** không bao giờ được đọc — **gồm cả `tools-whitelist-no-teeth`**. Máy vẫn in `[ok]`. + +--- + +## 🔴 Tổng: **8 errata / 1 phiên**, trong đó **5 do vai bác, 1 lead tự bắt, 2 vai bổ sung** +**Mẫu chung của 8/8:** lead **phát biểu rộng hơn / cũ hơn cái đã đo**. Không có ca nào lead đo sai; **mọi ca đều là đo đúng rồi kể quá, hoặc không đo mà lấy từ trí nhớ.** +🔸 Đây là **cùng một class** mà `lead-stale-auditor` FLAG-13 vừa đặt tên hôm nay (`view-claim-broader-than-sample`) và là **cùng nội dung 2 lá thư `loi-do-luong`** SE đã áp @S179. +🔸 **Giá trị của vòng kiểm đo được:** 6 lane N3 bác lead **5 lần**, trong đó **2 lần từ chối gợi ý có định hướng lead cố tình bơm vào prompt** (lane C bẫy-nhãn-đội · lane D chiều-mù).