diff --git a/.claude/agent-memory/.mfe-state.json b/.claude/agent-memory/.mfe-state.json index 3f1481c..62f1c7a 100644 --- a/.claude/agent-memory/.mfe-state.json +++ b/.claude/agent-memory/.mfe-state.json @@ -1,7 +1,7 @@ { "strikes_total": 25, "rca_entries": 16, - "at": "2026-08-07", + "at": "2026-08-09", "warn_baseline": 25, "history": [ { @@ -118,6 +118,11 @@ "strikes_total": 25, "rca_entries": 16, "at": "2026-08-07 23:00" + }, + { + "strikes_total": 25, + "rca_entries": 16, + "at": "2026-08-09 22:17" } ] } diff --git a/.claude/agent-memory/ctx-curator/MEMORY.md b/.claude/agent-memory/ctx-curator/MEMORY.md index 07ff0eb..edc90c5 100644 --- a/.claude/agent-memory/ctx-curator/MEMORY.md +++ b/.claude/agent-memory/ctx-curator/MEMORY.md @@ -22,3 +22,5 @@ > **Persistent diary cross-session.** Auto-injected first ~200 lines at spawn (L1 HOT). > Update BEFORE every stop. Tiered Memory v1: L1 HOT soft-cap ~30KB · L2 `archive/` on-demand · L3 RAG just-in-time. Keep entry ≤ 1.5K chars (gotcha #53). > **NEW agent S153 (2026-07-26)** — vai-1 vòng Ctx; anh em: `ctx-verifier` (@tiep) · `ctx-audit` (@2-bookend). + +- **S185 (08-09) lane3 doc-codify run YC-017 `[LEAD PLACEMENT (a) @S185 — nguồn `.claude/workflows/runs/2026-08-09-S185-email-adap-pipeline/sub-opus-lane3-doc-codify.md` 26.047 B]`:** C-3/C-4 codify DONE; **C-17 SKIP-có-khai vì TIỀN-ĐỀ REVIEW SAI 2 lớp** — `vocab-alias-map.md` Đà TỒN TẠI từ 2026-07-01 (8.020 B, 3 entry) và va-chạm token "sàn-5" đã xử bằng nhánh RENAME (anh quyết + hub ACK @S139) ⇒ finding F-4 của reviewer là dương-giả do grep thiếu. Bài: trước khi nhận việc "tạo file X" phải `find` file X đã tồn tại chưa + tra sổ quyết-định cũ. Khai phạm-vi phép quét: 21 tệp, KHÔNG phủ `.claude/commands/*` (19) + `.claude/agents/*` (27) — "1 dương/21 là số của LƯỢT NÀY, không phải tỉ lệ nền". Tag `[s185, tien-de-review-sai, find-truoc-khi-tao, khai-pham-vi]` diff --git a/.claude/agent-memory/harvest-curator/MEMORY.md b/.claude/agent-memory/harvest-curator/MEMORY.md index fadcbc9..c52bd2c 100644 --- a/.claude/agent-memory/harvest-curator/MEMORY.md +++ b/.claude/agent-memory/harvest-curator/MEMORY.md @@ -83,3 +83,7 @@ H2 harvest-MD-integrity auditor **SOLUTION_ERP-self**. Read-only + **propose-onl - **S180 (2026-08-07) @open L12 — `GATE-FAIL — 7`** `[LEAD SEED ON-BEHALF]`: nợ harvest THẬT **583.683 B / 14 lượt-vai** (S168 82.383 + S169 243.927 + S170 257.373) — carry ghi `~306 KB (S168+S171)` **SAI 2 CHIỀU**. 🔴 **F-04 TỰ BÁC CHÍNH MÌNH:** số S173 "501.300 mồ-côi" đúng TỔNG nhưng **sai CÁCH KỂ** — md5 chứng 14/16 sleep-draft Đà về archive byte-exact ⇒ ai đọc sẽ đi gom lại thứ đã ở nhà. 🔴 **F-05 bẫy ĐƠN-VỊ:** baseline không khai đơn-vị ⇒ suýt báo "−2 corruption"; thật 22 **dòng** ⟂ 24 **lần**. Bài chống bẫy này **đã viết ở `sub-harvest-curator-close-S168.md`** mà vì file đó chưa về nhà nên vấp lại **6 phiên sau** ⇒ **nợ harvest có CHI-PHÍ ĐO ĐƯỢC**. Orphan trừ folder đang chạy ⇒ **0/84 KHỚP lead**. `ring1` tái-dựng: tổng nợ **khớp từng byte**, nhưng **BÁC** 2 số phụ (`sleep-drafts` 268.861→**238.661**; empty-dir 5→3). Tag `[s180, gate-fail-7, no-583683B, tu-bac-f04, bay-don-vi-f05]` - **S182 @open (lead-seed, C2 /pause):** `GATE-FAIL — 7` — nợ harvest TƯƠI 576.255 B / 18 lượt-vai (số mình cộng 576.657 bị ring1 bắt lỗi CỘNG +402 B khối S169 — 9/9 thành-phần khớp byte: đo giỏi, cộng sai) · claim "slot 71 nợ-MA S171" bị ring1 BÁC (slot đã gạch ĐÓNG @S179, số nằm trong nguyên-văn-slot-cũ) · sleep-batch 237.251 B = nháp không phải nợ · "17 đích gist" KHÔNG tái-lập (ring1 cùng lệnh ra 19) · 8-dir-rỗng đã chết (đo 0). Bài: đo TÊN tưởng 3/5 về nhà; đo RUỘT ra 0/5. → `runs/2026-08-07-S182-bookend-open/sub-harvest-curator.md` + +- **S169 (08-01) @open L10-w1 — `GATE-FAIL — 8 finding` `[LEAD SEED ON-BEHALF — nguồn `runs/2026-08-01-S169-bookend-open/sub-harvest-curator-open-S169.md` 26.137 B]`:** 🔴 **Quan sát containment đắt nhất, và nó KHÔNG phải finding — nó là CẢNH BÁO HÌNH-DẠNG:** harness lượt đó tạo sẵn **4 thư mục memory sandbox RỖNG LỒNG TRONG run-folder** (`runs/2026-08-01-S169-bookend-open/.claude/agent-memory/{harvest-curator,lead-gap-auditor,lead-stale-auditor,tooling-auditor}/`, `find -type f` = **0**). Vai nào tuân "persistent memory" của khung mà ghi vào đó thì delta **land ngoài `agent-memory` canonical và im lặng biến mất khỏi auto-inject** = đúng ca **S54 cwd-relative mis-land**. 🔴 **Tầng im lặng thứ hai: `git` MÙ thư mục rỗng (bài S122)** ⇒ `git status` KHÔNG bao giờ cho thấy 4 thư mục này; **chỉ `find` mới thấy**. 🟢 Chính tao **0 file ghi vào đó** — và "0 file" là bằng chứng, không phải lời khai. Tag `[s169, gate-fail-8, sandbox-long-trong-run-folder, git-mu-thu-muc-rong, 0-file-la-bang-chung]` + +- **S185 (08-09) lane6 memory-gate run YC-017 `[LEAD PLACEMENT (a) @S185 — nguồn `.claude/workflows/runs/2026-08-09-S185-email-adap-pipeline/sub-opus-lane6-memory-gate.md` 24.268 B]`:** C-10 DONE (2 mồ côi A16 wire-or-khai) · **C-6 PARTIAL đúng nhánh dự phòng**: máy `memory-archive-gate.ps1` chạy tới PROPOSE thật nhưng value-scan CỦA CHÍNH MÁY bác đề-xuất (fault-inject 1 dòng lật PROPOSE→WARN) ⇒ vào nhánh "trình đề-xuất-nén cho lead, CẤM nén tay" — ring2-audit giữ 30.781 B chờ 1 quyết-định. Bài: bảng ranh-giới TỪ-CHỐI viết TRƯỚC khi chạy máy (biết mình không được làm gì) làm PARTIAL thành verdict sạch thay vì việc dở. Tag `[s185, may-propose-value-scan-bac, nhanh-du-phong, ranh-tu-choi-viet-truoc]` diff --git a/.claude/agent-memory/implementer-backend/MEMORY.md b/.claude/agent-memory/implementer-backend/MEMORY.md index 0b042c3..abc84a5 100644 --- a/.claude/agent-memory/implementer-backend/MEMORY.md +++ b/.claude/agent-memory/implementer-backend/MEMORY.md @@ -104,3 +104,5 @@ UI `disabled={!canX}` + BE helper `EnsureCanXAsync(id, userId)` throw 403 (NOT i - **Integration testing multiple components = việc `test-specialist`, KHÔNG phải mình** — mình scaffold + compile-check; assertion/integration test cross-component (SQLite fixture, authz regression) do test-specialist own (tiền lệ S67 HRM test-after +23, S69 +20 đều test-specialist). Nhận viết integration test = double-touch tests/ sai split. Tag `[s152, r1-retention, refuse-integration-testing-components]` - **S182 YC-013 (lead-seed, C2 /pause — lane đứt limit giữa W1, lane 1bis nối TỪ ĐĨA):** W0 trọn — phát hiện local có BA DB (lượt đầu trỏ nhầm base, TỰ KHAI "nhìn lượt đầu mà tuyên xong = PASS giả" rồi chạy lại đúng _Dev+_Design lên Mig 72) + baseline 645 đo độc lập + seed 8 row local ĐỦ roster. W1 5-fix land: `ContractSigningPlanWorkflowGuards.cs` public-static (Submit ở Infrastructure không thấy internal — 3 lối đã cân nhắc ghi doc-comment) · per-Code deactivate + normalize Trim().ToUpperInvariant() @`:348` (MAJOR-2 collation SQLite khác SQL-Server) · pin-check D6 2 message tách · changelog type-10 · DELETE-guard 8-module + IgnoreQueryFilters + D5+ApplicableType. Suite 660/0. → `runs/2026-08-08-S182-khkk-awf-mirror-ncc/sub-implementer-backend-0.md` + +- **S185 (08-09) 3 lane Opus MAX run YC-017 (lane1-detector · lane2-tienkiem · lane7-machine) `[LEAD PLACEMENT (a) @S185 — nguồn `.claude/workflows/runs/2026-08-09-S185-email-adap-pipeline/sub-opus-lane{1,2,7}*.md` 27.465+19.289+17.662 B]`:** lane1 cắm 4 detector (+438 dòng ASCII-sạch, TOTAL 49=baseline, fault-inject 14/14 CÂY TẠM `-RepoRoot` + positive-control) — tự bắt thước hỏng: mảng pattern PS thiếu ngoặc ⇒ `+` chạy xuyên dấu phẩy ⇒ 0-hit vĩnh viễn = SẠCH-GIẢ. lane2 **DỪNG ĐÚNG LỆNH** C-1: soak PHẦN Q vế-2 đòi rider-jump đã soak ≥1 phiên mà rider-jump CHƯA TỒN TẠI (5 phép + control `OVERDUE` 6-hit ⟂ `OVERDUE:jump` 0-hit) ⇒ soak thật = 0, không cắm mã thoát, chỉ flip 2 dòng stale; tự bắt thước: `git show | Select-String` PS 5.1 mojibake ⇒ 0-hit giả, đo lại bằng bash grep UTF-8. lane7 dựng `scripts/loi-hua-may-scan.ps1` (759ms, self-test 11/11, mẫu-số chấm tay 30 dòng KHÔNG phải 19 — đo lại trước khi tin số cũ). Tag `[s185, fault-inject-cay-tam, dung-dung-lenh-soak, thuoc-hong-tu-bat-x2]` diff --git a/.claude/agent-memory/implementer-frontend/MEMORY.md b/.claude/agent-memory/implementer-frontend/MEMORY.md index 60e2ef9..38b5a44 100644 --- a/.claude/agent-memory/implementer-frontend/MEMORY.md +++ b/.claude/agent-memory/implementer-frontend/MEMORY.md @@ -78,3 +78,5 @@ WRITE specialist FE 2 app (fe-admin + fe-user). Cookie-cutter mirror SHA256 IDEN ### 🔄 Curate trigger L1 > ~30KB **hoặc chạm trần đọc** → archive verbatim sang `archive/.md`, L1 giữ móc 1 dòng. Commit scope (em main commits): `FE-Admin` · `FE-User`. + +- **S167 (08-01) lane FE-K7 bridge KHKK→HĐ (vá-1 FE · vá-16 · vá-4b) — `DONE` `[LEAD SEED ON-BEHALF — nguồn `runs/2026-07-31-S164-4gd-khkk-fanout/sub-implfe-k7.md` 5.846 B; **2 lượt #53-garble**, resume-1 + lead-close-on-behalf từ đĩa]`:** 🔴 **Chứng máy phải đo SAU KHI VAI DỪNG TAY** (trọng tài build TƯƠI, gotcha #68): SHA-pair **3/3 identical** (`usePipelineStages.ts` `76e1823345d4` · `KhkkDetailPage.tsx` `cf0a2272061f` · `types/khkk.ts` `60ec8fa3a5ae`) · `npx tsc -b` fe-user + fe-admin **EXIT 0** · `npm run build` 921ms/765ms (warning chunk-size + INEFFECTIVE_DYNAMIC_IMPORT = **PRE-EXISTING**, đối chứng trước khi đổ lỗi) · `git status` đúng **6 file M (3 cặp mirror), 0 file lạ**. Tag `[s167, implfe-k7, build-tuoi-sau-khi-dung-tay, warning-pre-existing, 3-cap-mirror]` diff --git a/.claude/agent-memory/investigator-codebase/MEMORY.md b/.claude/agent-memory/investigator-codebase/MEMORY.md index b4ad599..4ead82b 100644 --- a/.claude/agent-memory/investigator-codebase/MEMORY.md +++ b/.claude/agent-memory/investigator-codebase/MEMORY.md @@ -59,3 +59,7 @@ Prod: `ssh vietreport-vps` powershell-wrapper — ⚠️ **SSH session DIES khi ## 🔄 Curate log - **S180 (08-07):** hook hard-cap 24.9→~13KB — S171/S160/S157/S156/S155×2/S149/S152/S158/S175 entry-dài + context-blocks verbatim → `archive/2026-08-curate-s180.md`; mọi entry → 1-line. - **S155 (07-27):** 20.7→~17.1KB gộp S122-S141. · **S148 (07-23):** 28.2→~14KB. · **Prev:** S125/S71/S70/S40. Verbatim byte-exact ở `archive/`. + +- **S182 (08-08) ×Fable KHKK AWF mirror NCC — **lens DB + lens FE** `[LEAD SEED ON-BEHALF — nguồn `runs/2026-08-08-S182-khkk-awf-mirror-ncc/sub-invest-db-fable.md` 18.097 B + `sub-invest-fe-fable.md` 13.916 B; entry S182 sẵn có chỉ phủ lens **BE**]`:** 🔴 **2 quả bom cùng một gốc `per-TYPE`:** panel `ContractSigningPlan` **GIẤU 7/8 workflow nhóm** vì BE `Active = FirstOrDefault(IsActive)` per-type (`ApprovalWorkflowV2AdminFeatures.cs:210`, tie-break Version DESC **không xác định** giữa 8 bản v1) · và bấm "Tạo quy trình mới"/"Lưu + kích hoạt" cho BẤT KỲ mã type-10 ⇒ `IsActive=false` **CẢ 8 nhóm** (`:339-343`; seeder idempotent per-Code `:610` **skip**, không re-set). 🔴 **committed-but-unapplied-local:** Mig 72 trên đĩa từ 08-06 mà **cả Dev lẫn Design local dừng ở Mig 71**. **Vắng dữ liệu ≠ bug:** seeder KHKK resolve người duyệt **theo EMAIL cứng** (11 email prod `DbInitializer.cs:556-584`) ⇒ DB thiếu user thì workflow RỖNG 0 bước vẫn tạo + log warning — designer local thấy 8 workflow trống người là **ĐÚNG**. Memory cũ S155 *"WF-V2 KHÔNG có lệnh Update"* đã **STALE** (`UpdateAwDefinitionCommand` đã land). 2 bộ luật song song cùng file (`HaveSequentialOrders` chỉ chạy path Create ⟂ Update dùng guard riêng) = drift-risk. Route `/system/approval-workflows-v2` **KHÔNG PermissionGuard** (`App.tsx:79-80`) — gotcha #82 2 tầng. Tag `[s182, lens-db-fe, bom-per-type, giau-7-tren-8, committed-but-unapplied-local, vang-du-lieu-khong-phai-bug]` + +- **S185 (08-09) lane5 measure run YC-017 `[LEAD PLACEMENT (a) @S185 — nguồn `.claude/workflows/runs/2026-08-09-S185-email-adap-pipeline/sub-opus-lane5-measure.md` 27.979 B]`:** 4/4 đo có số kèm lệnh tái-lập (Lớp 2·4·9 thư 08-05 · tier-qua-resume 4.2 · master-checklist ô1/ô2 + sàn-2 · completeness-pass ~10 report). 🔴 Bắt **tiền-đề C-17 STALE ngay trong lúc đo** (`vocab-alias-map.md` tồn tại 8.020 B mtime 07-22 ⟂ checklist ghi "chưa tồn tại") — độc-lập với lane3, 2 lane cùng bắt 1 lỗi = corroborate. Luật mới: khi **2 tệp đang bị sửa song song lúc đo** (lane khác cùng wave) ⇒ mọi số-dòng PHẢI kèm mốc giờ đo, không thì số chết ngay khi lane kia land. Tag `[s185, do-kem-lenh, corroborate-2-lane, so-dong-kem-moc-gio]` diff --git a/.claude/agent-memory/lead-gap-auditor/MEMORY.md b/.claude/agent-memory/lead-gap-auditor/MEMORY.md index 53f5310..dce1395 100644 --- a/.claude/agent-memory/lead-gap-auditor/MEMORY.md +++ b/.claude/agent-memory/lead-gap-auditor/MEMORY.md @@ -64,3 +64,5 @@ H24 §2(1) vai-GAP — soi CÁI BỊ THIẾU trong cái LEAD surface (việc r - **S180 (2026-08-07) @open L12 — `6 FLAG` (3 HIGH)** `[LEAD SEED ON-BEHALF]`: **FLAG-3 cứu cả phiên** — bắt **4 thư `2026-08-04-upgrade-pack-phased-*` CHƯA ÁP** trong khi lead vừa tuyên `all = 0`. 🔴 **Và bắt được DÙ return dính #53** — cụm "the 4 unapplied 2026-08-04 letters" sống sót trong mẩu garble, lead đo ngay **không đợi resume** ⇒ **datum MỚI: mẩu garble có thể là bằng chứng DUY NHẤT còn lại chống một kết luận sai của lead**. **FLAG-2** thước tuổi carry mù **21,3%** đầu HANDOFF ⇒ `gap-carry-aged = 0` là **số 0 VÔ NGHĨA**; `ring2` port lại **10/10 khớp**. **FLAG-1** lỗi máy H24-2 bị **đóng ké** theo slot (70) đã gạch ⇒ không ai quét thấy. **FLAG-4** `_end` L11 thiếu 7 slug. 🔴 Khai thẳng **3 trục CHƯA ĐO**. `ring2` thách-CLEAN tìm **1 FLAG SÓT** — lead **BÁC MỘT PHẦN** (tập đo ring2 thiếu 2 bề mặt; vế hẹp GIỮ). Tag `[s180, garble-chua-finding, thuoc-tuoi-mu, dong-ke-slot70, khai-chua-do]` - **S182 @open (lead-seed, C2 /pause):** `6 FLAG` (ring2 6/6 ĐẠT per-claim) — FLAG-2 nặng nhất: `gap-carry-aged=0` là SỐ 0 CHẾ TẠO — regex `governance-detectors.ps1:892` neo dấu-sao-đầu-dòng để vùng câm L1-178 = 22,82% HANDOFF nuốt trọn khối re-stamp 23 slug (ring2 tái dựng 7/7 byte-exact). NHƯNG FLAG-6(a) "7 baseline -Expect đã rơi" bị `ctx-audit` BÁC: quyết định Đà CHỐT + Đà SHIP dưới tên KHÁC (`naming-baseline.json`, YC-007 đóng) — grep TÊN CŨ 0-hit đọc thành rơi. Bài đau: 0-hit-theo-TÊN khác đã-rơi; lần theo control-dương của CHÍNH MÌNH trước khi kết. FLAG-6 còn SÓT món V-5 (rơi thật ≥3 không phải 2). → `runs/2026-08-07-S182-bookend-open/sub-lead-gap-auditor.md` + +- **S169 (08-01) @open L10-w1 — `5 FLAG` (trục GAP = soi CÁI KHÔNG CÓ) `[LEAD SEED ON-BEHALF — nguồn `runs/2026-08-01-S169-bookend-open/sub-lead-gap-open-S169.md` 18.318 B]`:** class fire: `gap-carry-dropped` 1 (HIGH) · `gap-decision-sunk` 2 (1 HIGH + 1 MED) · `gap-owner-specifics` 1 (MED) · `gap-underfill` 1 (MED) · `gap-carry-aged` 0 · `gap-incident-unrecorded` 0. 🔴 **Bài ăn tiền = ĐƠN-VỊ CỦA TALLY:** `class_repeat` đếm theo **audit LIÊN-TIẾP**, KHÔNG phải lần-trong-phiên — đếm sai đơn-vị thì ngưỡng leo thang bắn sai. Sau lượt này `gap-owner-specifics` 2→**3 = CHẠM `jump_on_class_repeat`=3**. Tag `[s169, gap-5, don-vi-tally-audit-lien-tiep, cham-nguong-leo-thang]` diff --git a/.claude/agent-memory/lead-stale-auditor/MEMORY.md b/.claude/agent-memory/lead-stale-auditor/MEMORY.md index 8473bc3..3689321 100644 --- a/.claude/agent-memory/lead-stale-auditor/MEMORY.md +++ b/.claude/agent-memory/lead-stale-auditor/MEMORY.md @@ -62,3 +62,9 @@ H24 §2(1) vai-STALE — soi VIEW LỆCH SOURCE của cái LEAD surface. Class - **S180 (2026-08-07) @open L12 — `15 FLAG` (tự khai là SÀN)** `[LEAD SEED ON-BEHALF]`: 6/6 class `view-*` fire. **FLAG-3 bundle `STATUS:481` stale LẦN THỨ BA** (cặp S172 vs cửa-sổ-6 `CuWgMI7J`/`32bJmjpM` ở `STATUS:6` ⇒ **tự mâu thuẫn nội file**; con-trỏ B1 ghi `:479` mà row ở `:481` = **mỏ-neo tự-vô-hiệu**) — **lead Đà LẤY ĐÚNG Ô CŨ đưa vào Phase 3 REPORT**. **FLAG-4** `STATUS:8` ghi `deep 6/15` mà đĩa **14/15** = dưới-báo **8 nhịp**. **FLAG-8/9 TRỌNG TÀI: LEAD ĐÚNG, `tooling-auditor` SAI** (bằng chứng mới: 3/4 nút anh-em trong cùng cây đã lật). **FLAG-15 điểm mù tự-quy-chiếu:** persona của CHÍNH vai này neo canonical menu-key vào `STATUS:19` — bắt @S173, sống thêm 7 nhãn phiên. 🔴 Coverage khai thủng **22/26 persona chưa chạm** ⇒ 15 = SÀN. `ring2` **BÁC** con số "5/6 vượt ngưỡng jump" (dựng lại 4/6, vai không khai đơn-vị). Tag `[s180, 15-flag-san, bundle-lan-3, trong-tai-lead-dung, tu-quy-chieu-persona]` - **S182 @open (lead-seed, C2 /pause):** `11 FLAG` (ring2 verify 11/11 ĐẠT) — nặng nhất: `STATUS:8` khai `deep 6/15 ok` khi đĩa 16/15 OVERDUE (chữ `ok` là lie, không phải số) · ghost-enum `session-start.md:161/:162` liệt 5 class khi enum 12 — Đà MIS-BRIEF chính lượt spawn này (vá @S180 sót bề-mặt LỆNH) · `HANDOFF:40` tập over-cap sai 2/3 · con-trỏ bundle `:479` trật 2 dòng (lần 2). Coverage tự khai ~7% STATUS + 6/29 persona ⇒ 11 = SÀN. → `runs/2026-08-07-S182-bookend-open/sub-lead-stale-auditor.md` + +- **S168 (08-01) @close bookend — `8 FLAG (4H/3M/1L)` · coverage 8/8 chạm nhưng **6 PARTIAL** `[LEAD SEED ON-BEHALF — nguồn `runs/2026-08-01-S168-bookend-close/sub-lead-stale-close-S168.md` 23.264 B]`:** 🔴 Tự khai đúng nấc: 8/8 chạm mà 6 ô là PARTIAL ⇒ con số **là SÀN, không phải TỔNG** — khai nấc phủ TRƯỚC khi khai số. **Sợi chỉ 5/8 FLAG cùng MỘT gốc:** 2 quyết-định owner @S168 (slot (63)(b)=D · slot (59) "cứ mở rộng") **đã land ở nơi lead làm việc** (`081557b`, `memory-budget.json` sources 5→8) **nhưng không lật ở nơi người đọc tra** ⇒ stale không sinh từ quên-làm mà từ **làm-một-phía**. Class fire: `view-stale-count` 2 · `view-residual-asym` 1 · `view-stale-header` 1 · `view-stale-role-desc` 0. Tag `[s168, san-khong-phai-tong, land-mot-phia, 5-flag-mot-goc]` + +- **S169 (08-01) @open L10-w1 — `8 FLAG` · coverage **8/8 = TỔNG** `[LEAD SEED ON-BEHALF — nguồn `runs/2026-08-01-S169-bookend-open/sub-lead-stale-open-S169.md` 22.503 B]`:** 🔴 **Đảo nấc so với S168:** lần này artifact đổ ruột sau MỖI FLAG ⇒ dám tuyên **TỔNG chứ không SÀN**, và tự dán đối-chứng S159 (lần đó chết ở nhóm 5/8 nên "5 FLAG" chỉ là sàn). **Cách khai phủ = đổ-ruột-liên-tục, không phải trí nhớ.** Điểm mù tự-quy-chiếu được gọi tên: N3 soi 23 persona *gồm 2 file `lead-*-auditor` của chính mình*. 🔸 Cận-dưới tự khai: N3 chỉ soi **số-học + mệnh-đề-nhịp**, KHÔNG đọc trọn 23 file (~13-20KB/file) ⇒ sai-ngữ-nghĩa thuần không mang số có thể còn sót. Tag `[s169, tong-vs-san, do-ruot-tung-flag, diem-mu-tu-quy-chieu, can-duoi-khai-that]` + +- **S185 (08-09) lane4 report-hygiene run YC-017 `[LEAD PLACEMENT @S185 — chỉnh khỏi phương-án (a): flip-stale = nghề vai này, KHÔNG phải ctx-curator; nguồn `.claude/workflows/runs/2026-08-09-S185-email-adap-pipeline/sub-opus-lane4-report-hygiene.md` 23.715 B]`:** 4 DONE + 1 PARTIAL-đúng-acceptance. **Phát hiện chủ đạo: 3/5 item hoá ra "Đà LÀM RỒI SỔ KHÔNG LẬT"** (chuỗi stale-BI-QUAN lần 3 trong cùng run — sau "~24 id không report" và "điều-kiện-3 chờ anh") — flip HANDOFF:6 TỪNG CÂU kèm evidence phán-quyết, KHÔNG lật cả cụm (4 câu không đồng-trạng-thái); addendum = block MỚI giữ dòng cũ làm vết (bài-5 thư 08-08); C-15 carry đa-vế THU HẸP thay gỡ trắng khi evidence hụt vế. Tag `[s185, stale-bi-quan-x3, flip-tung-cau, addendum-giu-vet, carry-thu-hep]` diff --git a/.claude/agent-memory/reviewer/MEMORY.md b/.claude/agent-memory/reviewer/MEMORY.md index bf5e69f..407b026 100644 --- a/.claude/agent-memory/reviewer/MEMORY.md +++ b/.claude/agent-memory/reviewer/MEMORY.md @@ -1,5 +1,17 @@ # Reviewer Agent — Persistent Memory +- **S180 (08-07) N2 phản-biện bản-đồ N1 — `PASS_WITH_FIXES — 0C/5M/6m` `[LEAD SEED ON-BEHALF — nguồn `runs/2026-08-07-S180-adap-upgrade-pack-phased/sub-review-n2-S180.md` 22.418 B]`:** ~60 phép đo trên ~45 claim — **KHÔNG claim nào đổ**; 3 phép 0-hit tái-lập đứng cả khi tách vế ⇒ **bản đồ N1 ĐỨNG VỮNG về DỮ KIỆN, 5 MAJOR đều nằm ở SUY LUẬN/PHỦ, không ở ĐO** (tách 2 lớp này trước khi phán). Nặng nhất **F-10: "chỉ có 1 xung đột" là SAI — có xung đột THỨ HAI**, và nó nằm ngay trong §4.4(c) của chính N1 rồi bị câu §4.3 phủ nhận ⇒ hệ quả: N4 sẽ xếp W4-sổ thành "việc máy" và **bỏ mất bước anh-duyệt-ranh**. 4/4 khoản VƯỢT-KHUNG đều đúng cấp; **không khoản nào bị thổi lên để né, không khoản nào bị hạ để tự làm**. Tag `[s180, n2, du-kien-vs-suy-luan, xung-dot-thu-hai, vuot-khung-dung-cap]` + +- **S180 (08-07) N3 LANE-C GĐ-3+GĐ-4 (lane NÓNG NHẤT — chứa CẢ HAI xung đột) `[LEAD SEED ON-BEHALF — nguồn `sub-n3-lane-c-gd34.md` 72.156 B]`:** GĐ-3 **10 khoản** (có 3 · nửa 3 · thiếu 3 · **ngược 1**) · GĐ-4 **12 khoản** (có 2 · nửa 3 · thiếu 5 · **ngược 1** · chưa đo 1) · **5 khoản VƯỢT-KHUNG**. 🔴 **Dựng phương án, KHÔNG CHỌN:** xung đột 1 có **4 phương án**, xung đột 2 có **3 phương án**, lane **không chọn khoản nào** — đúng ranh vai đối-kháng khi việc chạm quyền owner. 🟢 **Ô CHƯA ĐO ghi KÈM LỆNH, không để trống** (4 ô, mỗi ô 1 lệnh chạy được) — và khai thẳng có ô mà kết luận đúng là **"KHÔNG ĐO ĐƯỢC"** chứ không phải "thiếu sót". Không đo lại phần lead đã verify (`status: DRAFT` 4/4 thư) — chỉ nhắc để mục phản biện không rớt. Tag `[s180, lane-c, dung-phuong-an-khong-chon, o-chua-do-kem-lenh, khong-do-duoc-la-ket-luan]` + +- **S180 (08-07) N3 LANE-D GĐ-5+GĐ-6 — `GĐ-5 13,0/20 · GĐ-6 3,0/17` `[LEAD SEED ON-BEHALF — nguồn `sub-n3-lane-d-gd56.md` 43.795 B]`:** 🔴 **BÁC claim xếp-hạng "GĐ-5 gần xong nhất" — vì claim xếp hạng KHÔNG CÓ MẪU SỐ**: trên cùng một thước, GĐ-2 (5,5-6/8) **≥** GĐ-5 (5,33/8). 🔴 **1 MAJOR máy-mù:** `spawn-model-audit` **mù 17/17 lane của chính phiên đang chạy** mà vẫn in `0 mismatch` + `TOTAL FLAGS: 0` ⇒ máy in "sạch" trên vùng nó chưa từng đọc. Chấm 2 thang **nới ⟂ nghiêm** cho cùng một GĐ (GĐ-6: 18% nới / 6% nghiêm) thay vì 1 số. Đính chính **4 phía, gồm chính mình**: N1 ×2 · N2 ×0 (F-07b/F-09 xác nhận ĐÚNG) · lệnh lead ×1 (chiều mù viết ngược) · **tự đính chính ×1** (`:250-253`→`:251-254`). 4 khoản `CHƯA ĐO` **có tên + có lệnh**. Tag `[s180, lane-d, claim-xep-hang-khong-mau-so, may-mu-in-sach, thang-noi-va-nghiem, dinh-chinh-4-phia]` + +- **S180 (08-07) N3 LANE-E trục BỆNH (9 lớp lỗi × 12 TC) `[LEAD SEED ON-BEHALF — nguồn `sub-n3-lane-e-benh.md` 38.531 B + `lane-memory-proposals/`]`:** 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, không có THUỐC). Lead sót 3 ca. 🔴 **Đó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":** slot (70) dán ĐÓNG @S179 trong khi rider lỗi máy ở `:51` còn sống — **lỗ thủng TO GẤP ĐÔI SAU KHI ĐÓNG** (12 → 25 slug). 🔴 **Khai trạng-thái-quá-khứ bằng thì hiện-tại:** `session_ctx_kb` bị liệt ghost-wire 0-reader, đo ra **đã đóng từ S153** (`scripts/session_ctx.py:528/:563` là reader fail-loud) — trùng đúng kiểu `pull_warn_days` đã bị bác trước đó, **hai lần cùng lỗi trong cùng một ô bảng**. **Va chạm tệp tạm giữa lane song song:** tên chung bị lane khác ghi đè giữa 2 lượt, chỉ lộ nhờ `grep` chuỗi đặc trưng trước khi nối — **nối mù = mất dữ liệu IM LẶNG**. Tag `[s180, lane-e, may-quet-dau-vs-khoan-ap-dau, qua-khu-ke-bang-hien-tai, va-cham-tep-tam-lane-song-song]` + +- **S180 (08-07) N3 LANE-F máy⟂tay · vượt-khung · rủi-ro `[LEAD SEED ON-BEHALF — nguồn `sub-n3-lane-f-maytay.md` 52.923 B — §10 của file này TỰ KHAI "nội dung lẽ ra vào diary"]`:** 🔴 **`fed-but-unread` — sub-class ghost-wire THỨ 3, MỚI:** sổ được nuôi bằng công thật (~40 tệp run tính tally) nhưng **vế so-sánh ngưỡng không tồn tại** ⇒ **nguy hơn `defined-but-unread`** vì khối lượng công đổ vào tạo cảm giác cơ chế đang sống. **Thang máy/tay 2 nấc là thang HỎNG:** SE có **1 máy fire thật · 17 máy-qua-nghi-thức · 3 mồ côi** — điền "máy" cho cả 17 là đúng chữ sai nghĩa; câu hỏi chuẩn: *"kết quả không-hit có phụ thuộc người nhớ chạy không?"*. **Vá doc bình thường làm điểm mù của máy TO RA, im lặng** (`**NEXT em`→`### NEXT em` ⇒ `marks[0]` trôi :90→:172 ⇒ 12→25 slug bị nuốt) ⇒ neo detector vào **cấu trúc ổn định** + phản-chứng chạy lại mỗi lần bề mặt bị vá. **Đóng khoản bằng bằng-chứng ĐÚNG nhưng ở TẦNG THẤP HƠN mục tiêu** (slot 68). **Whitelist frontmatter = tự lừa:** 20/26 vai khai không Write/Edit, runtime vẫn cấp — lượt này tự chứng bằng chính `Write` của mình; backstop thật là lead soát `git status`, **và đó là TAY**. **`ngược-#53` là lỗi LỆNH không phải lỗi trí nhớ** ⇒ chặn bằng **thứ tự tool-call** (`Write` khung = tool-call #1), không chặn được bằng lời nhắc. 🟢 **CỐ Ý không tạo `/.claude/agent-memory/reviewer/MEMORY.md`** dù harness trỏ vào đó — vì sẽ đẻ đúng stray-mis-land class-S54. Tag `[s180, lane-f, fed-but-unread, thang-2-nac-la-thang-hong, va-doc-lam-diem-mu-to-ra, whitelist-tu-lua, thu-tu-tool-call]` + +- **S182 (08-08) lens HOÀN-CHỈNH-VẬN-HÀNH + tổng hợp WAVE-PLAN FINAL `[LEAD SEED ON-BEHALF — nguồn `runs/2026-08-08-S182-khkk-awf-mirror-ncc/sub-review-2-fable.md` 32.326 B; entry S182 sẵn có chỉ khai đĩa `sub-review-1-fable` + `sub-reviewer-precommit`]`:** review **không dừng ở diff** mà dựng trọn đường ship: W4 test-gate (số canonical đổi ⇒ update **DUY NHẤT** `docs/STATUS.md` row test, B1) · W5 **commit MỘT phát** BE+FE+tests · **cicd 4-chân** với **control-âm bắt buộc** (bundle cũ 0-hit; *"eoffice: hash GIỮ nếu bỏ W2e / ĐỔI nếu làm — **đo, không suy**"*) · acceptance PROD **đọc-only** (CẤM bấm "Tạo phiên bản mới" trên prod). 🔴 **Rollback không đối xứng — phải khai:** 0-mig nên revert sạch phần MÁY, nhưng **revert W1a = bom per-type TÁI VŨ TRANG** ⇒ sau revert CẤM "Tạo phiên bản mới" mọi panel type-10. Data ở lại là **hợp lệ + khai rõ** (changelog W1c = audit-history · v02+ = ratchet vô hại, pin by-Id). Accepted-risk ghi thẳng: race 2-admin-cùng-Code → 500 thô (UNIQUE đỡ data, **không silent-dup**). Tag `[s182, review-2, review-den-duong-ship, control-am-bat-buoc, rollback-khong-doi-xung, accepted-risk-khai-thang]` + - **S185 (08-09) review CHECKLIST 21-item (YC-017 email-adap, artifact `runs/2026-08-09-S185-email-adap-pipeline/sub-review-checklist-fable.md`) — `PASS_WITH_FIXES` 9MAJ/4m:** review CHECKLIST ≠ review code — đòn đắt nhất = **đối-chiếu TỪNG DÒNG bảng-nợ §2.1 → checklist §3**: ≥5 dòng BIẾN MẤT không disposition (1 dòng "CHỜ-ANH" rơi im lặng). **File-đích tự khai guard thắng sổ-lead**: `tien-kiem-cua.ps1:4-5` "phải qua W3b trước, đang chờ owner (P1)" ⟂ HANDOFF:7 NEXT-em "tự chạy" — xung đột 2 nguồn uỷ-quyền phải hoá giải TRONG spec, không được để Opus tự chọn. **Invest chép số cũ từ report thay vì đo tươi** → ring2 thật 30.781B Đà VỠ cap (không phải 96,8%) — stale chiều NGƯỢC làm item KHẨN trông như thường. **Harvest nợ bằng grep debt-marker hụt nợ không-marker** ("PENDING"·"không máy nào canh") — 2/2 report mở thêm đều dính. **LT3 bậc-2 (đảo-ngược-được?) = thước routing rẻ** → demote 1 W khỏi CHỜ-ANH. **Carry đa-vế gỡ phải đóng TỪNG VẾ** (evidence lẫn trio khác trio). Thước-hỏng của TÔI: `cd` AI_INFRA rồi chạy `git ls-files` → đo nhầm repo (cwd-trap, warning path lộ) — compound-cd rồi git = tự kiểm repo-root trước khi tin 0-hit. - **[→ `archive/2026-08.md` §@S182 — verbatim 2 lượt, probe 7/7 + control-âm 0] S182 (08-08) YC-013 KHKK 8-panel — lượt SPEC `2C/5M`, lượt DIFF pre-commit `0C/3M`+6m:** 🟢 **3/3 finding 🔴 lượt-1 được đóng ĐÚNG BẢN CHẤT** (assembly-ranh → file `public static class` riêng · `IgnoreQueryFilters` **2 CHIỀU NGƯỢC NHAU trong cùng 1 diff**: DELETE bỏ filter vì FK còn thật ⟂ changelog GIỮ filter vì ghi vết phiếu-đã-xoá là rác · 8 module pin verified bằng grep Domain, loại +1 hit FK nội bộ) — dữ liệu hiếm, ghi để đừng phá. 🔴 **tooltip đặt trên `` ⇒ Chromium KHÔNG hiện** (label bao ngoài không mang `title`) — quyết-định-owner nằm trong tooltip mà tooltip không có cửa hiện = **máy dựng không ai gọi**; ô "hành-vi-LUÔN-BẬT" câm ⇒ đọc thành NGƯỢC NGHĨA. 🔴 **3 thành phần bất đồng HOA/thường** (regex CultureInvariant **case-SENSITIVE** ⟂ `Code ==` theo collation SQL Server **CI** ⟂ FE `.toUpperCase()`) và **test MÙ THEO CẤU TRÚC vì SQLite = BINARY case-sensitive ⇒ tầng DB trong test có ngữ nghĩa NGƯỢC prod** — không assertion nào bịt được. 🔴 **guard mới ở write-path CHÍNH (Create) 0 test** — lỗ của SPEC, implementer đúng spec, **KHÔNG hạ thước theo spec**. **m:** assert `Contain("N5")∧Contain("N3")` **mù THỨ TỰ toán hạng** (3 call-site 2 tham số kề — phải đối chiếu TAY) · **BOM `ef bb bf`+CRLF lẫn vào commit code** ⇒ `git add` từng file. **FLAG-A đo được:** `npx tsc --noEmit` trần biên dịch **0 file** (`files: []`+references) = xanh THEO CẤU TRÚC; `--listFiles|wc -l` 0 ⟂ 225/214 ⇒ **acceptance "lệnh X xanh" phải kèm phép chứng thước KHÔNG RỖNG**. @@ -96,3 +108,13 @@ Adversarial pre-commit reviewer SOLUTION_ERP. Read-only verify + live curl prod - **[→ `archive/2026-08.md` §@S180-ba-khối — verbatim, probe 6/6 + control-âm 0] S180 (08-07) N4 wave-plan · W0 lane-a/b (digest gộp):** **ô-đòi-Mà không nhận CÂU-VĂN** · tách trục **CHỮA ⟂ NGHIỆM-THU** · 2 hệ đánh số trong 1 artifact phải khác TIỀN-TỐ · 🔴 **acceptance ĐO HÌNH-DẠNG-DÒNG chứ không ĐO GIÁ-TRỊ-Ô** (`grep -c '^| GĐ-…'` vẫn xanh dù ô điền sai từ-vựng) · **2 tệp anh em cùng hình-dạng = dương-giả thật** ⇒ chạy chéo 2 chiều + control-dương · **`grep -c` exit 1 khi 0-hit CẮT ĐỨT chuỗi `&&`** · **lệnh lead có thể sai theo chiều PHÁ chính mục-đích lệnh** (2 số cùng trị khác nghĩa va nhau trong CÙNG bản giao việc) ⇒ dẫn giá-trị **từng dòng từ đĩa** · **`grep -c ` có TRẦN CỨNG** ⇒ khai mẫu-số NGAY CẠNH con số · **glob `*/` bỏ trọn thư-mục GỐC** · 🟢 thêm cột thì đặt **CUỐI hàng** ⇒ "không sửa dòng cũ" thành phép kiểm chạy được (tiền-tố nghiêm ngặt) · `status` **định-nghĩa-bằng-thư-mục** đo đúng NỬA số dòng · **2 số bằng nhau từ 2 nguồn KHÔNG phải phép đo thứ hai** nếu số sau là hệ-quả số trước · thước hỏng: **heredoc `<<'EOF'` gãy** với tiếng Việt+backtick ⇒ dùng Write/Edit · **probe `grep -F` sai HOA/thường ⇒ 0-hit GIẢ**. + +## Memory-files trong folder (7 tệp — hạ cánh @S185 từ `lane-memory-proposals/` S180, copy-nguyên KHÔNG viết lại) + +- [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 +- [Doctrine tự khai ≠ phép đếm phạm vi](feedback_doctrine_line_undercounts.md) — "Exit 0 always" phải liệt từng máy + soi từng đường thoát +- [Từ chối verdict coordinator gợi sẵn](feedback_refuse_coordinator_suggested_verdict.md) — vẫn đo rồi trả lời ngược nếu đo ra ngược; ca ngược thường lộ khoản làm-MẠNH-HƠN +- [Vị-từ hình-dạng-đường-dẫn mù câm](proxy_predicate_blind_measure.md) — hạ tầng đổi đường ghi thì máy vẫn in "0 lệch"; hỏi PHỦ BAO NHIÊU, không chỉ CLAIM ĐÚNG KHÔNG +- [Claim xếp hạng cần 2 mẫu số](ranking_claim_needs_two_denominators.md) — ≥2 đại lượng CÙNG ĐƠN VỊ; thành phần đúng hết vẫn không đẻ ra thứ hạng diff --git a/.claude/agent-memory/reviewer/feedback_doctrine_line_undercounts.md b/.claude/agent-memory/reviewer/feedback_doctrine_line_undercounts.md new file mode 100644 index 0000000..29b78de --- /dev/null +++ b/.claude/agent-memory/reviewer/feedback_doctrine_line_undercounts.md @@ -0,0 +1,19 @@ +--- +name: doctrine-line-undercounts +description: Câu doctrine tự khai trong mã ("Exit 0 always") KHÔNG phải phép đếm phạm vi — phải liệt từng máy + soi từng đường thoát, và ranh giới thật thường đã có sẵn trong comment +metadata: + type: feedback +--- + +Khi được giao đo *"phạm vi thật của doctrine X"*, **đừng đếm bằng câu doctrine**. Liệt **từng máy** rồi soi **từng đường thoát** của nó, và tách bạch 3 loại: exit≠0 **khi phát hiện lỗi** ⟂ exit≠0 **khi thiếu hạ tầng** ⟂ exit-0-luôn. + +**Why:** S180 lane C. Đề bài (kế thừa N1 + lead) khẳng định *"SE chỉ có 2 máy fail-loud"*, dựa trên câu `governance-detectors.ps1:1962` *"Exit 0 always (never fails build)"*. Đo lại 17 máy cắm vào cửa lệnh thì ra **5 máy** trả exit≠0 khi phát hiện lỗi (`session-counter-tick` · `h24-signal-write` · `memory-archive-gate:325` · `session-scaffold` · `stamp_verify.py:51`), và `hmw.js` có **4 chỗ throw** chứ không phải 1. Con số 2 làm bài toán trông như *"du nhập cơ chế lạ"*; con số 5 làm nó thành *"mở rộng ranh có sẵn"* — **đổi hẳn tập phương án trình cho owner**. + +**How to apply:** ba bước, theo thứ tự. +1. Đếm mẫu số trước (`grep -ohE "scripts/[^ ]+\.(ps1|py)" .claude/commands/*.md | sort | uniq -c`), kèm control-dương để chứng thước có bắt. +2. Soi từng đường thoát; **phân biệt exit≠0-vì-thiếu-config với exit≠0-vì-tìm-thấy-lỗi** — trộn hai loại này là nguồn sai số chính. +3. 🔴 **Tìm ranh giới trong comment trước khi tự vẽ ranh.** Ca S180: `memory-archive-gate.ps1:323-325` đã viết sẵn *"Exit non-zero only on A7 integrity failure... Over-cap is a FLAG (not an error) - the gate reports, a human curates"* — tức **một máy, hai chế độ, ranh đã vẽ**. Ranh đó khớp 5/5 máy fail-loud: *sắp-GHI hoặc vị-từ-nhị-phân ⇒ chặn; phán-xét ⇒ cờ*. Đề xuất dựa trên ranh có sẵn rẻ hơn và khó bị bác hơn nhiều so với ranh tự nghĩ. + +Kèm: chạy máy để lấy **số sống** làm đánh đổi định lượng (`governance-detectors.ps1` → `TOTAL FLAGS: 49` + `INFORM-ONLY: 21`, vẫn exit 0) — *"lật sang chế độ chặn hôm nay = 49 cờ chặn tức thì"* là con số quyết định, không phải lý luận. + +Liên quan: [[refuse-coordinator-suggested-verdict]] diff --git a/.claude/agent-memory/reviewer/feedback_measure_with_detectors_own_regex.md b/.claude/agent-memory/reviewer/feedback_measure_with_detectors_own_regex.md new file mode 100644 index 0000000..357cc2e --- /dev/null +++ b/.claude/agent-memory/reviewer/feedback_measure_with_detectors_own_regex.md @@ -0,0 +1,14 @@ +--- +name: measure-with-the-detectors-own-regex +description: Đo vùng mù của một máy phải dùng CHÍNH regex/vị-từ của máy đó, không dùng grep thô — sai thước cho ra lỗ nhỏ hơn 6 lần +metadata: + type: feedback +--- + +Khi kiểm "máy X có bỏ sót gì không", **trích đúng biểu thức mà X dùng** rồi chạy lại trên dữ liệu thật. Đừng đo bằng một `grep` gần đúng. + +**Why:** @S180 lane E kiểm detector **H24-2** (`scripts/governance-detectors.ps1:892-897`) — nó dựng segment từ `$marks[0].Index` nên **mọi thứ nằm trên marker đầu tiên không bao giờ được đọc**. Đo bằng `grep -n "NEXT em" docs/HANDOFF.md` ra marker đầu ở `:29` ⇒ kết luận "lỗ 28 dòng". Nhưng regex thật của detector đòi `^\*\*` (đậm, đầu dòng), nên `### 🔵 NEXT em` **không khớp**; marker đầu tiên khớp thật ở **`:172`** ⇒ lỗ là **L1-171 / 25 trong 54 carry key / 46%** — sai thước làm lỗ nhỏ đi **6 lần**. Control-dương bắt buộc kèm: `[carry:` xuất hiện 289 lần trong tệp, chứng minh thước sống. + +Hệ quả kèm theo đáng nhớ: lỗ đó **to gấp đôi sau khi khoản liên quan bị dán nhãn ĐÓNG** (rider @S179 khai 12 slug, đo lại @S180 = 25), và trong 25 key bị nuốt có `tools-whitelist-no-teeth` — máy đo tuổi carry không nhìn thấy chính cái carry ghi rằng "có cưỡng chế được tuyên mà không có răng". + +**How to apply:** (1) Mở mã của máy, copy nguyên vị-từ (regex/filter/slice) sang phép đo của mình. (2) Luôn kèm control-dương để 0-hit không bị đọc thành sạch. (3) Khi một khoản được dán "đã đóng", hỏi **"máy này quét những đâu"** rồi so với **"khoản này áp ở những đâu"** — hai phạm vi lệch nhau là đường thoát. Liên quan: [[stale-anchor-born-dead]] diff --git a/.claude/agent-memory/reviewer/feedback_refuse_coordinator_suggested_verdict.md b/.claude/agent-memory/reviewer/feedback_refuse_coordinator_suggested_verdict.md new file mode 100644 index 0000000..e5ca062 --- /dev/null +++ b/.claude/agent-memory/reviewer/feedback_refuse_coordinator_suggested_verdict.md @@ -0,0 +1,16 @@ +--- +name: refuse-coordinator-suggested-verdict +description: Coordinator gợi sẵn kết luận ("đó có phải đúng bẫy này không?") vẫn phải đo rồi trả lời ngược nếu đo ra ngược — và ca ngược thường lộ ra khoản làm-MẠNH-HƠN +metadata: + type: feedback +--- + +Khi coordinator đưa **ca sống kèm kết luận gợi ý** (dạng *"đó có phải đúng bẫy X không?"*), đo tận nơi rồi trả lời theo số đo, **kể cả khi số đo bác lại gợi ý**. Gật theo là đúng anti-pattern Smart-Friend. + +**Why:** S180 lane C. Coordinator trỏ `docs/HANDOFF.md:17` (anh nói `"5 -> OK"`, lead tự thu hẹp thành *"ghi-nhận, CHƯA phải lệnh đổi số"*) và hỏi có phải bẫy A1 của hub — *"đổ nhãn-của-đội vào cột lời-nguyên-văn"*. Mở tệp ra thì bảng có **đúng hai cột** `Nguyên văn | Lead thi-hành`; ô nguyên văn chứa đúng bốn ký tự anh gõ; phần diễn giải nằm ở cột kề bên **và đã tự khai bằng chữ đỏ** *"Diễn-giải của lead, không phải chữ của anh"*. ⇒ điều kiện của bẫy (ô nhiễm cột nguyên văn) **không thoả** — chấm theo thang 4 nhãn của hub thì đây là *suy-giảm-hợp-lệ*, không phải lỗi. + +Giá trị thật nằm ở **chỗ đo ra ngược**: khuôn sổ của hub chỉ có 6 trường (mã · nguyên văn · thời điểm · trạng thái · số lần nhắc · con trỏ), **không có trường "đội hiểu thành gì"** ⇒ dựng sổ y khuôn hub thì đúng cái sai thật (lead tự thu hẹp phạm vi lệnh) **bốc hơi khỏi sổ**. Tức repo đang làm **mạnh hơn** spec — thành một khoản gửi ngược hub, thay vì một lỗi phải vá. + +**How to apply:** ca gợi-ý-ngược ⇒ (1) trích **chữ định nghĩa** của bẫy và tách ra **cơ chế** của nó, (2) kiểm từng điều kiện của cơ chế trên ca thật, (3) nếu không thoả thì nói KHÔNG **và** hỏi tiếp *"vậy spec có bắt được ca này không?"* — câu hỏi thứ hai mới là chỗ ra phát hiện. Và vẫn phải chỉ ra **chỗ repo SẼ mắc** nếu thi công theo bản đồ hiện có (ở đây: đổ 61 tệp auto-memory — toàn nhãn do đội đúc — vào cột nguyên văn = mắc bẫy chính xác từng chi tiết). + +Liên quan: [[doctrine-line-undercounts]] diff --git a/.claude/agent-memory/reviewer/feedback_stale_anchor_born_dead.md b/.claude/agent-memory/reviewer/feedback_stale_anchor_born_dead.md new file mode 100644 index 0000000..20fc569 --- /dev/null +++ b/.claude/agent-memory/reviewer/feedback_stale_anchor_born_dead.md @@ -0,0 +1,14 @@ +--- +name: stale-anchor-born-dead +description: Neo trích dẫn bằng số dòng phải kiểm TẠI CHỖ lúc viết — ở SE có neo sai ngay tại commit sinh ra nó, và luật B1 (trỏ-canonical) đang tự cài bằng chính cơ chế hỏng này +metadata: + type: feedback +--- + +Khi review bất kỳ diff nào có **neo dạng `file:`**, phải mở đúng dòng đó ở **chính commit đang review** rồi so nội dung — không được tin neo vì nó "trông có vẻ đúng". + +**Why:** @S180 lane E đo `docs/STATUS.md` và tìm **3 neo tự-trỏ, cả 3 lệch đúng +2**. Hai neo (`:479` bundle, `:470-471` Policies/Menu keys) **đúng lúc sinh rồi trôi**. Neo thứ ba (`:474` S170 / `:476` S176 ở `STATUS.md:463`) **sai ngay tại commit `57e672f` sinh ra nó** — `git show 57e672f:docs/STATUS.md` cho thấy hai mốc đó ở `:476`/`:478`. Đây là hai **chế độ chết khác nhau** cần hai thuốc khác nhau: *drift-sau-sinh* cần neo-bằng-chuỗi; *born-dead* cần **vị-từ kiểm tại chỗ lúc viết**. + +Nặng hơn: cả ba neo đó **chính là luật B1 đang thi hành** (*"KHÔNG chép số, trỏ canonical"* — thuốc chống số-chép-tay-trôi). Tức thuốc chữa bệnh A được xây bằng bệnh B. Vá 3 con số là vá triệu chứng; phải đổi **hình thức neo**. + +**How to apply:** (1) diff chạm doc governance ⇒ `git show :` rồi đối chiếu từng neo, đừng đọc bản working-tree. (2) Neo mới trong review đề xuất phải là **chuỗi tìm được** (tên row, tiêu đề) chứ không phải số dòng, trừ tệp đã đóng băng. (3) Cảnh giác đặc biệt với neo nằm trong **ghi chú của chính vai bắt-stale** — đó là chỗ born-dead hay xuất hiện nhất. Liên quan: [[measure-with-the-detectors-own-regex]] · [[unit-mismatch-keep-both-numbers]] diff --git a/.claude/agent-memory/reviewer/feedback_unit_mismatch_keep_both.md b/.claude/agent-memory/reviewer/feedback_unit_mismatch_keep_both.md new file mode 100644 index 0000000..38dd5c5 --- /dev/null +++ b/.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/agent-memory/reviewer/proxy_predicate_blind_measure.md b/.claude/agent-memory/reviewer/proxy_predicate_blind_measure.md new file mode 100644 index 0000000..1821387 --- /dev/null +++ b/.claude/agent-memory/reviewer/proxy_predicate_blind_measure.md @@ -0,0 +1,28 @@ +--- +name: proxy-predicate-blind-measure +description: Máy đo chọn mẫu bằng vị-từ HÌNH-DẠNG-ĐƯỜNG-DẪN sẽ mù câm khi hạ tầng đổi đường ghi, mà vẫn in "0 lệch" — phải hỏi PHỦ ĐƯỢC BAO NHIÊU, không chỉ hỏi CLAIM CÓ ĐÚNG +metadata: + type: feedback +--- + +Khi soi một máy đo (audit/detector/gate), đừng dừng ở "hằng-số của nó có đồng bộ không". Phải hỏi +thêm: **nó chọn mẫu bằng vị từ gì, và vị từ đó có còn đúng không?** + +**Why:** S180 `scripts/spawn-model-audit.ps1:251-254` chọn phiên bằng +`Test-Path (subagents\workflows)` — một **đại-diện (proxy)** cho "phiên này có spawn". Khi lane đi qua +Agent/Task tool thay vì Workflow tool, bản ghi rơi **phẳng** vào `subagents/agent-*.jsonl`, vị từ trả +false, máy **im lặng tụt về phiên cũ hơn 26,5 giờ** rồi vẫn in `scope = CURRENT session only` +(`:262`), `0 mismatch`, `TOTAL FLAGS: 0`. Đo thật: **0/17 lane** của phiên hiện tại được nhìn, trong +đó có **168 bản ghi `claude-fable-5`** — đúng cái mô-hình-đắt mà máy sinh ra để canh. + +Điểm đắt: các claim "0-mismatch" dựa trên nó **không bị chứng minh là SAI**, chúng **mất chỗ dựa**. +Đó là khác biệt giữa *"đã đo và bằng không"* với *"chưa đo gì"* — hai thứ in ra trông y hệt nhau. + +**How to apply:** +- Với mỗi máy đo, đòi **mẫu số**: `n đơn vị đã đo / m đơn vị tồn tại`. Không in mẫu số = đèn xanh giả. +- Đòi **control cho vế DÂN SỐ**, không chỉ control cho vế so-sánh. Máy này có control chống grep ngây + thơ (khối A) nhưng **không có** control "mẫu có rỗng không". +- Nhãn tự-mô-tả (`CURRENT session only`) phải **kiểm được**, không được in vô điều kiện. +- Phản chứng bắt buộc khi vá: chạy trên phiên chỉ có lane phẳng ⇒ máy **phải** thấy, không được rơi + về phiên cũ. +- Liên hệ: [[ranking-claim-needs-two-denominators]] — cùng gốc bệnh "đếm-về-tổng". diff --git a/.claude/agent-memory/reviewer/ranking_claim_needs_two_denominators.md b/.claude/agent-memory/reviewer/ranking_claim_needs_two_denominators.md new file mode 100644 index 0000000..12c02a8 --- /dev/null +++ b/.claude/agent-memory/reviewer/ranking_claim_needs_two_denominators.md @@ -0,0 +1,27 @@ +--- +name: ranking-claim-needs-two-denominators +description: Claim xếp hạng ("X gần xong nhất", "Y hổng nhất") chỉ đứng khi có ≥2 đại lượng CÙNG ĐƠN VỊ đem so — từng claim thành phần đúng hết vẫn không đẻ ra được thứ hạng +metadata: + type: feedback +--- + +Phân biệt hai loại claim khi review: **claim thành phần** ("máy X tồn tại, đo được 0-mismatch") và +**claim xếp hạng** ("GĐ-5 gần xong nhất"). Loại thứ hai cần bằng chứng **khác hẳn** loại thứ nhất. + +**Why:** S180 — N1 tuyên *"GĐ-5 gần xong nhất"* dựa trên 5 gạch đầu dòng. Lane N2 verify **~60 phép +đo trên ~45 claim, không claim nào đổ**. Nhưng thứ hạng vẫn sai: đếm cùng thước (8 bước làm của thư +chính) ra **GĐ-5 = 5,33/8 (67 %)** so với **GĐ-2 = 5,5–6/8 (69–75 %)** — GĐ-2 ≥ GĐ-5. Từng viên gạch +đúng, **phép cộng thành thứ hạng** thì sai. Đây là biến thể của *meta-count self-coverage blind-spot*: +đo tốt, đếm-về-tổng thì hỏng. + +Hậu quả không dừng ở chữ nghĩa: nhãn "gần xong nhất" chảy vào `run.md` rồi đẻ ra đề xuất "W5 ghép W2", +vi phạm điều-kiện-vào của chính giai đoạn đó. **Nhãn lạc quan → xếp lịch sai.** + +**How to apply:** +- Thấy chữ *nhất* / *hơn* / *~N %* ⇒ hỏi ngay **"trên mẫu số nào, và cái nó vượt có mẫu số không?"** +- Tách mẫu số **trước** khi tính tử số; dán bảng để người khác đếm lại được. +- Dùng **≥2 mẫu số độc lập** rồi kiểm hội tụ. S180: 3 mẫu số ra 60–67 % ⇒ phép tách không bơm số. + Nếu hai mẫu số lệch nhau, hỏi **"đếm CÁI GÌ"** trước khi hỏi **"ai sai"**. +- Chia vai đúng: một lane kiểm *claim có đứng không*, một lane kiểm *phủ có đủ không*. Lane thứ hai + bắt được thứ lane thứ nhất **không thể** bắt. +- Liên hệ: [[proxy-predicate-blind-measure]]. diff --git a/.claude/agent-memory/ring1-audit/MEMORY.md b/.claude/agent-memory/ring1-audit/MEMORY.md index 7026274..dee91ef 100644 --- a/.claude/agent-memory/ring1-audit/MEMORY.md +++ b/.claude/agent-memory/ring1-audit/MEMORY.md @@ -61,3 +61,5 @@ - **S180 (2026-08-07) @open L12 — `32Đ/6T`** `[LEAD SEED ON-BEHALF]`: 9 falsify — **2 HELD / 7 BROKE, 4 BROKE vào CHÍNH MÌNH**. 🔴 **F-A tái phát ĐỜI 2 lỗi đã ghi trong sổ mình @S162:** định tố lead+H1 bịa Mig 72 vì tự đếm 71; thủ phạm filter nuốt migration tên có chữ `Snapshot`. Câu tự rút: **"2 engine khớp nhau là bằng chứng RỖNG khi chúng CHUNG một thước"**. **F-B** thước chết, **control-dương tự dựng cũng False** ⇒ suýt truy một corruption không tồn tại. **F-I BROKE vào LEAD:** lập luận "cùng sinh @S145" SAI theo `git blame` (3 mốc khác nhau) — lead đọc **nhãn trong nội dung** thành **ngày viết dòng**, đúng lớp lỗi lead đang buộc cho vai. Sửa 4 số của H2 nhưng **TỔNG NỢ 583.683 B đứng vững** (cộng độc lập, khớp từng byte). 🔴 **Phát hiện độc lập nặng nhất: `STATUS:467` canonical TỰ HUỶ** — công thức chữ nó tự khai cho ra **71** không phải 72 ⇒ ai audit theo chữ sẽ **"sửa" canonical XUỐNG giá trị sai**. Tag `[s180, 4-broke-vao-chinh-minh, chung-thuoc-bang-chung-rong, canonical-tu-huy]` - **S182 @open (lead-seed, C2 /pause):** `41 ĐẠT / 7 TRƯỢT / 8 KC` — chốt số treo cả phiên: root menu = 12 (parser depth-aware 72 tuple, cross-check MenuKeys 4/4) ⇒ `permission-matrix:3` ĐÚNG SỐ, cây vẽ 8 mới sai — H1 gộp 2 thứ vào 1 mệnh-đề suýt làm người vá THAY ĐÚNG BẰNG SAI · bắt lỗi CỘNG +402 B của H2 · bác nợ-MA slot-71 · R-1 `STATUS:478` BẪY NEO (1 dòng 15.804 ký-tự chứa 2 chuỗi roster-23: 1 SAI 1 ĐÚNG-ảnh-chụp — sweep theo DÒNG giết cả hai) · thách-CLEAN thủng `contract-workflow/SKILL.md` trễ Mig 71/72 (control `phase`=25) · R-3 tự khai persona mình "KIỂM end-only" thối 5 phiên vận hành — NÊU không tự sửa · F-A BROKE vào chính mình đời 3: 2 engine đếm mig cãi (72 vs 71) ⇒ gọi tên nghi-phạm (`AddPeApprovedBudgetSnapshot.cs` bị lọc Snapshot nuốt) TRƯỚC khi tố ai. → `runs/2026-08-07-S182-bookend-open/sub-ring1-audit.md` + +- **S169 (08-01) @open L10-w1 KIỂM vòng tooling/harvest — `18Đ/9T` `[LEAD SEED ON-BEHALF — nguồn `runs/2026-08-01-S169-bookend-open/sub-ring1-audit-open-S169.md` 34.806 B]`:** 6 đề-xuất chốt, đắt nhất là **quy-nguyên FLAG phải chỉ ĐÍCH DANH commit sinh ra nó** (F-5 "sinh tại `ff7f655` S168") + luật chặn tái-phát **lần 5**: grep `skills/README.md` MỖI KHI chạm `SKILL.md`. 🔴 **Đóng slot phải đóng CẢ mention lạc:** slot (48) đóng là dương-giả **trừ khi** gỡ/đóng-dấu 🧊 2 mention `self-target 17.1K` ở `memory-budget.json:191/:198` — không thì **cãi lại lần 4**. Phân biệt bệnh-thật ⟂ artifact-đo: C11 "vá regex `:1794`" CÓ bệnh · "over-count" thì **ĐỪNG vá**. 4 dir rỗng trong run-folder ⇒ soi bằng `find`, **không bằng `git status`**. 🔸 Tự khai: đứt-mạch #53 giữa §2→§3, artifact cứu nguyên 14.162 B, **mất 0 B**. Tag `[s169, 18d-9t, quy-nguyen-chi-dich-danh-commit, dong-slot-phai-dong-mention, benh-that-vs-artifact-do]` diff --git a/.claude/agent-memory/ring2-audit/MEMORY.md b/.claude/agent-memory/ring2-audit/MEMORY.md index 3d5440f..7cee1a6 100644 --- a/.claude/agent-memory/ring2-audit/MEMORY.md +++ b/.claude/agent-memory/ring2-audit/MEMORY.md @@ -91,3 +91,5 @@ C4/C4b vai-KIỂM vòng **soi-lead (H24)** — adap đợt-11 khoản ①, owner - **S180 (2026-08-07) @open L12 — `21Đ/0T`** `[LEAD SEED ON-BEHALF]`: chấm 21 FLAG cặp H24, **21/21 class ∈ enum ĐÓNG, 0 tự chế**. **Port H24-2 đầy đủ: 10/10 số KHỚP**. 🔴 **2/3 BROKE nhắm vào CHÍNH MÌNH** — giả thuyết "luật bỏ-rỗng làm vùng mù khác đi" BROKE (vùng mù do `marks[0].Index` quyết, **độc lập hoàn toàn**) ⇒ **vai H24 HELD, ring2 sai**. **BROKE vào `lead-gap`:** bằng chứng "commit thật cuối ⇒ chưa từng vá" **vô hiệu** — bản vá rơi vào commit `wal:` nên bị giấu. **2 ERRATA:** đơn-vị 34.855 là **code-point** không phải byte. **THÁCH-CLEAN tìm 1 FLAG SÓT**. 🔴 **TỰ KHAI XUNG ĐỘT:** persona của chính mình ghi "5 class" khi enum có **6**, và class thứ 6 **load-bearing đúng phiên này** ⇒ *"nếu tin số nạp vào đầu mình, tao đã phán oan — không phán oan vì đọc enum trước, nhưng đó là **kỷ luật, không phải hàng rào**"*. 🔴 **Câu dặn: "21/21 ĐẠT là ĐỘ CHÍNH XÁC. ĐỘ PHỦ thì chưa ai chứng được."** Tag `[s180, 21d-0t, port-10-10-khop, 2-broke-vao-minh, ky-luat-khong-phai-hang-rao]` - **S182 @open (lead-seed, C2 /pause):** `17 ĐẠT / 0 TRƯỢT` + 2 errata + 1 FLAG-SÓT — falsify BROKE vào chính TIỀN-ĐỀ lead giao (brief chép số S172 từ `HANDOFF:58` như thể S173 — defect lead-gap FLAG-2 nêu Đà LÂY vào brief vai KIỂM, ca tự-quy-chiếu thứ 2 trong phiên) + ERRATA-2 counter blob=55/cây=56 (nhãn HEAD dán lên phép đo đọc cây bẩn) · verify FLAG-2 vùng-câm 7/7 byte-exact, chuỗi 4 mốc 90→130→172→179 đơn-điệu (tự bắt mình trộn đơn-vị %: byte 21,96→22,82) · thách-CLEAN bắt FLAG-SÓT trong CHÍNH MEMORY.md của mình ("5 class view-*" khi enum 6 — Role-baseline auto-inject đầu mỗi spawn = nạp thước thiếu vạch TRƯỚC khi chấm; tự bắt @S173, dòng trôi mà số sai nguyên 9 phiên — NAY lead sửa cùng lượt) · tự khai over-cap 29.582 B tệ nhất roster + diary bị CẮT lúc nạp ⇒ chấm với trí-nhớ thủng thật, khai để trừ hao. → `runs/2026-08-07-S182-bookend-open/sub-ring2-audit.md` + +- **S169 (08-01) @open L10-w1 KIỂM 2 con-đo H24 — `13Đ/2T` `[LEAD SEED ON-BEHALF — nguồn `runs/2026-08-01-S169-bookend-open/sub-ring2-audit-open-S169.md` 32.197 B]`:** 13 FLAG per-FLAG ĐẠT toàn bộ; **2 TRƯỢT ở MẶT-BẰNG** (coverage-đủ vỡ + sai khuôn máy-đọc) ⇒ **chấm từng-FLAG sạch KHÔNG suy ra chấm mặt-bằng sạch**. 🔴 **Kể bằng THÀNH-PHẦN, bỏ số tổng:** `lead-gap` F-5 → *giữ FLAG, bỏ con số "~17%"*. Đề vá **CLASS thay vì vá 4 ca** (F-3 của `lead-stale` là site 8-11 của class đã đếm tới site 7 từ S164). 🔴 **Tự khai đắt nhất:** lượt-1 là **skeleton-ruột-rỗng — 130K token đổi lấy 1.020 B**; bản dùng được viết ở lượt-2 sau khi lead ép *ghi-trước-nghĩ-sau*. Nội dung không mất (mọi số đo lại + có lệnh kèm) nhưng **quy-trình đã hỏng**. Tag `[s169, 13d-2t, tung-flag-khong-suy-ra-mat-bang, ke-bang-thanh-phan, skeleton-130k-doi-1020B]` diff --git a/.claude/agent-memory/ring4-audit/MEMORY.md b/.claude/agent-memory/ring4-audit/MEMORY.md index 7cb32f5..e8242b1 100644 --- a/.claude/agent-memory/ring4-audit/MEMORY.md +++ b/.claude/agent-memory/ring4-audit/MEMORY.md @@ -11,3 +11,5 @@ - {nấc: executed (verdict áp trọn — 4 fix vào gist cùng phiên) · evidence: runs/2026-07-25-S152-h24-open-bookend/sub-ring4-close-S152.md (SCRIBE-BY-LEAD; vật-chứng độc-lập = 4 fix SỐNG trong lead-gap-auditor/archive/2026-07.gist.md:9,:11,:25,:38 + additive HELD: gốc 9.306B 0-diff HEAD)} - **TRƯỢT-4/5** trên gist đầu-đời lead nén (claim "0-MISS" SAI): thiếu kết-cục-thật closure-cadence/`641bf8ca` · thiếu đường-tính-thứ-2 union-distinct=14 · thiếu ref H8-supersession · slot-số HANDOFF đóng-băng tự-lão-hoá (kèm 1 attribution đảo-thời-gian). ĐẠT-1: bất-biến ADDITIVE. Lượt đầu-đời có RĂNG — thách-CLEAN trên chính sản-phẩm nén của lead. - 🔴 Lỗ vận-hành tự lộ: return-only ⇒ verdict BỐC HƠI nếu lead không scribe (gap-close G-F1 + harvest-close cùng bắt; ring2 caveat "chạy THẬT chỉ suy được từ mtime") — cân nhắc cho vai ghi-đĩa như các ring khác = quyền anh/hub. + +- **S170 (08-03) KIỂM vòng nén-ngủ `/sleep-recovery-memory-l2` `[LEAD SEED ON-BEHALF — nguồn `runs/2026-08-01-S169-bookend-open/sub-ring4-audit-sleep-S170.md` 20.122 B]`:** mặt trong-trục SẠCH — gist nén ra **0 hit plaintext**, chỉ mang nhãn đã che (F-3). 🔴 **Bắt được thước hỏng của chính phép kiểm:** `git show HEAD:` bị `core.autocrlf=true` **bóp méo** ⇒ đã loại ở C-1, mọi số trong bảng là **byte THẬT trên đĩa**. ⚠️ `agent-memory/reviewer/MEMORY.md` hiện ` M` trong `git status` mà `git diff` + `--cached` đều RỖNG = **đổi CRLF/mode thuần**, không đổi nội dung — báo để lead soát commit-gate. 🔸 Tự khai cận-dưới: thách-CLEAN sâu chỉ **2/16 cặp**; 12 cặp còn lại chỉ kiểm **cơ-học** (byte·hash·utf8·frontmatter·coverage-token) ⇒ T-1…T-5 là **cận-dưới, không phải bản kiểm đầy đủ**. Tag `[s170, sleep-l2-gate, autocrlf-bop-meo-git-show, m-nhung-diff-rong, can-duoi-2-tren-16]` diff --git a/.claude/agent-memory/test-specialist/MEMORY.md b/.claude/agent-memory/test-specialist/MEMORY.md index fcc54b1..8d6e1fc 100644 --- a/.claude/agent-memory/test-specialist/MEMORY.md +++ b/.claude/agent-memory/test-specialist/MEMORY.md @@ -61,3 +61,5 @@ Index > ~17KB → archive sang L2 (`archive/baseline-history.md` + con-trỏ tro - 🔴 **Surprise tu-thu**: ban dau viet tron §5-§8 kem so chua-do (587→590 + 3 dong fault-inject BIA) — "ghi-tung-muc" bi hieu thanh "ghi dan bai roi dien". Cat ve 98 dong, de vet. So cuoi TRUNG du-doan ⇒ neu khong cat thi khong ai phat hien. **Bai: dan-bai co san con-so ky-vong = bay claim-truoc-do tinh-vi nhat (trong y het "ghi dia chong #53"); muc chua chay CHI duoc tieu-de + "CHUA DO".** - **S182 YC-013 (lead-seed, C2 /pause — lane-1 đứt sớm, lane-2 viết đủ rồi chết session-limit SAU khi suite xanh):** 14 ca T1-T14 (600→614) + T15 Create_PinQuyTrinhDaNgungHoacChuaGhim_ThiBiChan_VaKhongDotMa (MAJOR-3, 615) ⇒ suite 660/0. Reviewer chấm KHÔNG ca nào nới để xanh; T3 2-chân giết cả bản-vá-regex lẫn bản-vá-đừng-tắt-gì; T5 seed pin-lệch thẳng DbContext + loại trước 2 cửa 409 nhiễu; T11 tiền-đề 2 chiều (filter-on=0/off=1) đo đúng bẫy IgnoreQueryFilters — prod THẬT có ca (KHKK-N1 6 pin/5 xoá-mềm); T12 dangling THẬT trong DB (office loose-0FK). 1 assertion GroupAndCatalog đổi theo câu 409 mới W1b = spec-change có khai; lead siết pin-nguyên-câu-thứ-tự 1 ca (MINOR-1). → `runs/2026-08-08-S182-khkk-awf-mirror-ncc/sub-test-specialist-2.md` + +- **S167 (08-01) lane TEST-K7 bridge KHKK→HĐ — `DONE, suite 639/0` (45D+594I, Δ+17) · **0 FLAG bug production** `[LEAD SEED ON-BEHALF — nguồn `runs/2026-07-31-S164-4gd-khkk-fanout/sub-test-k7.md` 13.365 B; vai chết đúng lúc closing, END-line + §0-§5 vai tự ghi trọn]`:** 12 test bridge + 5 authz đều xanh trên mã BE hiện tại, **không test nào phải giữ ĐỎ**. 🔴 **Lệch GIẤY TỜ ⟂ lệch Mà là 2 việc khác nhau:** bảng invest T1 `:75` ghi `WorkflowDefinitionId null` nhưng **vá-6 thắng** và mã đang pin V1 ⇒ test theo **CODE + vá-6**, ghi mismatch ngay trong header file test (không im lặng chọn bên). 🔸 Vùng KHÔNG phủ được bằng unit test: `SeedContractCreateAccessAsync` (`DbInitializer.cs:2757-2822`) chỉ ăn **@restart API prod** ⇒ thuộc acceptance, khai chứ không giả vờ phủ. Tag `[s167, test-k7, 639-0, lech-giay-to-vs-lech-ma, vung-chi-an-sau-restart]` diff --git a/.claude/agent-memory/tooling-auditor/MEMORY.md b/.claude/agent-memory/tooling-auditor/MEMORY.md index 8c79235..f36c804 100644 --- a/.claude/agent-memory/tooling-auditor/MEMORY.md +++ b/.claude/agent-memory/tooling-auditor/MEMORY.md @@ -95,3 +95,5 @@ H1 tooling-freshness auditor **SOLUTION_ERP-self**. Read-only + **propose-only** - **S180 (2026-08-07) @open L12 — `PASS_WITH_FLAGS — 9`** `[LEAD SEED ON-BEHALF]`: **6/9 là nợ S179 chưa vá**; **2 drift MỚI sinh SAU S179** — lớp S179 vừa đóng ở site khác **lại nở ra site mới**. **BÁC-1 ĐÚNG:** bảng canonical `STATUS:463-479` **TƯƠI**, chỗ stale là mega-line `:8` (bác đúng tiền-đề brief lead). **BÁC-2 ĐÚNG:** `§16+` là **4 SITE / 3 GIÁ-TRỊ**. 🔴 **BÁC-3 SAI — bài đắt nhất:** dẫn **diary của chính mình + `hmw.js:39`** làm 2 nhân chứng, nhưng **cả hai là bản sao CHƯA-CẬP-NHẬT của cùng một trạng thái cũ**, không phải 2 quan sát độc lập; 3 vai khác đều phán ngược. 🔴 `ring1` còn bác vế "5 bề-mặt ĐỘC-LẬP": 3/5 **đồng-biến cơ-học** ⇒ độc-lập thật chỉ **2**; số 26 đúng nhưng **độ mạnh bằng chứng bị khai vống**. Tag `[s180, pwf-9, bac-3-sai, 2-ban-sao-khong-phai-2-nhan-chung]` - **S182 @open (lead-seed on-behalf, C2 /pause):** `PASS_WITH_FLAGS — 4` — matrix `agents/README:190-219` phủ 26/28 (thiếu 2 vai score W4b, control-dương 0-row-ma) · `STATUS:478` "roster 23" sai-SỐ-đúng-KẾT-LUẬN · `skills/README:20` residue câu đã xoá @S181 (lớp claim-chép-nhiều-site lần 4) · `permission-matrix:3` "12 root" hoá ra ĐÚNG SỐ (ring1 chốt 12) — chỗ sai là CÂY `:44-77` vẽ 8. #53 garble, resume cứu trọn. → `runs/2026-08-07-S182-bookend-open/sub-tooling-auditor.md` + +- **S169 (08-01) @open L10-w1 — `PASS_WITH_FLAGS — 10 finding` `[LEAD SEED ON-BEHALF — nguồn `runs/2026-08-01-S169-bookend-open/sub-tooling-auditor-open-S169.md` 23.236 B]`:** 4 mặt CÓ và nhất-quán ở lớp canonical (roster 23 khớp **5 bề-mặt** · plugin 0-delta · 6/6 skill + 2 skill bị nghi đều SẠCH · `CLAUDE.md` mig đủ 70+71) — **nhưng 10 finding stale tích-tụ + monthly-audit quá hạn ĐÚNG HÔM ĐÓ**. 🔴 **Nấc plugin phải khai đủ 4 bậc** — installed 18 (mkt 37) → enabled 15 → assigned (`agents/README:216-228`) → **`used` KHÔNG đo được từ repo ⇒ KHÔNG khai**. Khai phạm-vi tập-đo: persona sweep = 2 mẫu grep count-class trên 23/23 file; **CHƯA soi** số dạng LOC/%/ms/byte-cap và trọn `.claude/commands/*.md` (19 file). G-015: `store_memory` strip nhưng **`Bash` còn = write-channel mở ⇒ KHÔNG tuyên "read-only enforced"**. Tag `[s169, pass-with-flags-10, plugin-4-bac, used-khong-do-duoc, khai-pham-vi-tap-do]` diff --git a/.claude/workflows/runs/2026-08-09-S185-bookend-close/script-arm-output.md b/.claude/workflows/runs/2026-08-09-S185-bookend-close/script-arm-output.md new file mode 100644 index 0000000..2bf9c19 --- /dev/null +++ b/.claude/workflows/runs/2026-08-09-S185-bookend-close/script-arm-output.md @@ -0,0 +1,422 @@ +# script-arm @bookend-close S185 — SAU-harvest (f-bis re-measure) + +## 1. measure-agent-memory (f-bis — số SAU-append) +{ + "measured_at_note": "run date stamped by caller (Date.now unavailable in workflow scripts)", + "soft_cap_l1_bytes": 30720, + "autoinject_cap_bytes": 25600, + "agents": [ + { + "agent": "back-end-reviewer-style", + "l1_hot_bytes": 3908, + "l2_verbatim_bytes": 0, + "l2_index_bytes": 0, + "l2_gist_bytes": 0, + "l1_over_30kb": false + }, + { + "agent": "cicd-monitor", + "l1_hot_bytes": 23798, + "l2_verbatim_bytes": 264257, + "l2_index_bytes": 23588, + "l2_gist_bytes": 122471, + "l1_over_30kb": false + }, + { + "agent": "ctx-audit", + "l1_hot_bytes": 24924, + "l2_verbatim_bytes": 0, + "l2_index_bytes": 0, + "l2_gist_bytes": 0, + "l1_over_30kb": false + }, + { + "agent": "ctx-curator", + "l1_hot_bytes": 13340, + "l2_verbatim_bytes": 0, + "l2_index_bytes": 0, + "l2_gist_bytes": 0, + "l1_over_30kb": false + }, + { + "agent": "ctx-verifier", + "l1_hot_bytes": 19205, + "l2_verbatim_bytes": 0, + "l2_index_bytes": 0, + "l2_gist_bytes": 0, + "l1_over_30kb": false + }, + { + "agent": "database-agent", + "l1_hot_bytes": 9038, + "l2_verbatim_bytes": 0, + "l2_index_bytes": 0, + "l2_gist_bytes": 0, + "l1_over_30kb": false + }, + { + "agent": "database-reviewer-style", + "l1_hot_bytes": 4376, + "l2_verbatim_bytes": 0, + "l2_index_bytes": 0, + "l2_gist_bytes": 0, + "l1_over_30kb": false + }, + { + "agent": "frontend-designer", + "l1_hot_bytes": 19869, + "l2_verbatim_bytes": 19050, + "l2_index_bytes": 2435, + "l2_gist_bytes": 3231, + "l1_over_30kb": false + }, + { + "agent": "front-end-reviewer-style", + "l1_hot_bytes": 3857, + "l2_verbatim_bytes": 0, + "l2_index_bytes": 0, + "l2_gist_bytes": 0, + "l1_over_30kb": false + }, + { + "agent": "harness-audit", + "l1_hot_bytes": 16622, + "l2_verbatim_bytes": 0, + "l2_index_bytes": 0, + "l2_gist_bytes": 0, + "l1_over_30kb": false + }, + { + "agent": "harness-eval", + "l1_hot_bytes": 15469, + "l2_verbatim_bytes": 0, + "l2_index_bytes": 0, + "l2_gist_bytes": 0, + "l1_over_30kb": false + }, + { + "agent": "harness-refine", + "l1_hot_bytes": 15126, + "l2_verbatim_bytes": 0, + "l2_index_bytes": 0, + "l2_gist_bytes": 0, + "l1_over_30kb": false + }, + { + "agent": "harvest-curator", + "l1_hot_bytes": 28071, + "l2_verbatim_bytes": 78576, + "l2_index_bytes": 8325, + "l2_gist_bytes": 20317, + "l1_over_30kb": false + }, + { + "agent": "implementer-backend", + "l1_hot_bytes": 25515, + "l2_verbatim_bytes": 86134, + "l2_index_bytes": 10487, + "l2_gist_bytes": 84345, + "l1_over_30kb": false + }, + { + "agent": "implementer-frontend", + "l1_hot_bytes": 16441, + "l2_verbatim_bytes": 47796, + "l2_index_bytes": 5844, + "l2_gist_bytes": 44764, + "l1_over_30kb": false + }, + { + "agent": "investigator-api", + "l1_hot_bytes": 9021, + "l2_verbatim_bytes": 0, + "l2_index_bytes": 0, + "l2_gist_bytes": 0, + "l1_over_30kb": false + }, + { + "agent": "investigator-codebase", + "l1_hot_bytes": 18199, + "l2_verbatim_bytes": 171476, + "l2_index_bytes": 12448, + "l2_gist_bytes": 107741, + "l1_over_30kb": false + }, + { + "agent": "lead-gap-auditor", + "l1_hot_bytes": 24241, + "l2_verbatim_bytes": 22645, + "l2_index_bytes": 1234, + "l2_gist_bytes": 7112, + "l1_over_30kb": false + }, + { + "agent": "lead-stale-auditor", + "l1_hot_bytes": 30852, + "l2_verbatim_bytes": 0, + "l2_index_bytes": 0, + "l2_gist_bytes": 0, + "l1_over_30kb": true + }, + { + "agent": "office-document", + "l1_hot_bytes": 3323, + "l2_verbatim_bytes": 0, + "l2_index_bytes": 0, + "l2_gist_bytes": 0, + "l1_over_30kb": false + }, + { + "agent": "reviewer", + "l1_hot_bytes": 31341, + "l2_verbatim_bytes": 243035, + "l2_index_bytes": 13941, + "l2_gist_bytes": 69925, + "l1_over_30kb": true + }, + { + "agent": "ring1-audit", + "l1_hot_bytes": 23874, + "l2_verbatim_bytes": 0, + "l2_index_bytes": 0, + "l2_gist_bytes": 0, + "l1_over_30kb": false + }, + { + "agent": "ring2-audit", + "l1_hot_bytes": 31781, + "l2_verbatim_bytes": 0, + "l2_index_bytes": 0, + "l2_gist_bytes": 0, + "l1_over_30kb": true + }, + { + "agent": "ring4-audit", + "l1_hot_bytes": 3349, + "l2_verbatim_bytes": 0, + "l2_index_bytes": 0, + "l2_gist_bytes": 0, + "l1_over_30kb": false + }, + { + "agent": "score-count-auditor", + "l1_hot_bytes": 2330, + "l2_verbatim_bytes": 0, + "l2_index_bytes": 0, + "l2_gist_bytes": 0, + "l1_over_30kb": false + }, + { + "agent": "score-counter", + "l1_hot_bytes": 2366, + "l2_verbatim_bytes": 0, + "l2_index_bytes": 0, + "l2_gist_bytes": 0, + "l1_over_30kb": false + }, + { + "agent": "test-specialist", + "l1_hot_bytes": 18914, + "l2_verbatim_bytes": 37615, + "l2_index_bytes": 6170, + "l2_gist_bytes": 33811, + "l1_over_30kb": false + }, + { + "agent": "tooling-auditor", + "l1_hot_bytes": 30981, + "l2_verbatim_bytes": 72498, + "l2_index_bytes": 3672, + "l2_gist_bytes": 18760, + "l1_over_30kb": true + } + ] +} + +## 2. mfe-eval + +=== MFE (Memory-Fidelity-EVAL) - Harness-16 - 2026-08-09 === + (coverage/retention eval; NOT memoryDelta-routing-fidelity H6.7) + lead hot-feed cap (live) = 380000 tok | mem-sub cap = 60000 tok + +[LEAD] must-remember denominator (deduped, merge_guard_to_as=True): + marks(Active+High)=11 AS-classes=15 net-extra-guards=5 net-extra-recurring-gotchas=7 + => DENOMINATOR = 38 items (raw before dedup: marks 11 + AS 15 + guards 16 + recurring 8) + +[LEAD] Coverage-FIT (does the set FIT the hot-feed cap?): + span bytes=30945 => ~7736 - 10315 tok (RANGE, see caveat) / cap 380000 tok = 2.71% worst-case + FIT = PASS (worst-case fits; headroom huge - must-remember set is tiny vs cap) + CAVEAT: char/4 is NOT real tokens; VN-diacritic ~3.0-3.5 byte/tok => byte/4 = upper-bound headroom. + Reported as a RANGE [bytes/4 .. bytes/3.0]; FIT uses bytes/3.0 (worst). Real count inside the band. + +[LEAD] age-band (FLAG only - age=false-proxy, mark RC-...10-29-11): + marks with parseable date=11; >30d old but still Active=4 -> KEPT (status-driven, age-blind) + (guards/gotchas carry session-refs not dates -> age = status-driven only; drop on status-change, never by age) + +[LEAD] Goodhart anchor (NO self-grading - real recurring-error signal): + error-ledger: strikes_total=25 RCA_entries=16 AS-classes=15 + (rule: if strikes rise across runs while coverage stays high -> the score lies. warn-baseline=25 last_run_strikes=25) + +[SUB] per-role memory coverage (denominator = role-file anti-patterns/baseline; numerator = carried in diary): + match = exact-id OR >=2 distinct content-words after stop-list (leading-verb-only = false-max, defeated) + + back-end-reviewer-style N/A (no numbered anti-pattern / NEVER block in role-file to extract) + cicd-monitor 10/10 = 100% (MEASURED, not target-then-force) + ctx-audit 10/10 = 100% (MEASURED, not target-then-force) + ctx-curator 6/6 = 100% (MEASURED, not target-then-force) + ctx-verifier 7/7 = 100% (MEASURED, not target-then-force) + database-agent 7/7 = 100% (MEASURED, not target-then-force) + database-reviewer-style N/A (no numbered anti-pattern / NEVER block in role-file to extract) + front-end-reviewer-style N/A (no numbered anti-pattern / NEVER block in role-file to extract) + frontend-designer 2/2 = 100% (MEASURED, not target-then-force) + harness-audit 5/5 = 100% (MEASURED, not target-then-force) + harness-eval 5/5 = 100% (MEASURED, not target-then-force) + harness-refine 5/5 = 100% (MEASURED, not target-then-force) + harvest-curator 7/7 = 100% (MEASURED, not target-then-force) + implementer-backend 18/18 = 100% (MEASURED, not target-then-force) + implementer-frontend 12/13 = 92% (MEASURED, not target-then-force) + investigator-api 7/7 = 100% (MEASURED, not target-then-force) + investigator-codebase 8/8 = 100% (MEASURED, not target-then-force) + lead-gap-auditor 6/6 = 100% (MEASURED, not target-then-force) + lead-stale-auditor 6/6 = 100% (MEASURED, not target-then-force) + office-document 6/6 = 100% (MEASURED, not target-then-force) + reviewer 8/8 = 100% (MEASURED, not target-then-force) + ring1-audit 5/5 = 100% (MEASURED, not target-then-force) + ring2-audit 5/5 = 100% (MEASURED, not target-then-force) + ring4-audit 5/5 = 100% (MEASURED, not target-then-force) + score-count-auditor N/A (no numbered anti-pattern / NEVER block in role-file to extract) + score-counter N/A (no numbered anti-pattern / NEVER block in role-file to extract) + test-specialist 6/6 = 100% (MEASURED, not target-then-force) + tooling-auditor 8/8 = 100% (MEASURED, not target-then-force) + +[SUB-WORKFLOW] N/A by design: fan-out workflow agents (hmw.js sub--) are EPHEMERAL + (no persistent diary; their only memory channel is the lead-injected memory-pack -> source-vs-cap is meaningless). + +=== MFE done (deterministic block; READ-ONLY on budget; exit 0) === + +## 3. memory-archive-gate DRY +============================================================ + memory-archive-gate.ps1 - Harness-11 PART-A + mode : DRY-RUN (no writes at all) + cap : 25600 bytes (autoinject_cap) + low-water : 21760 bytes (A4 hysteresis drain target = ratio 0.85) + keep-floor : 5 newest entries (A5) + strike-need : 2 consecutive over-cap runs to PROPOSE (A6) +============================================================ + +### PASS 1 - hot-tier over-cap planner (FLAG ONLY, no moves) + +sub bytes over? entries strike after-est resolve +------------------------ --------- ----- ---------- ------- ------------ ------- +back-end-reviewer-style 3908 no 0 0 - ok +cicd-monitor 23798 no 19 0 - ok +ctx-audit 24924 no 3 0 - ok +ctx-curator 13340 no 0 0 - ok +ctx-verifier 19205 no 2 0 - ok +database-agent 9038 no 6 0 - ok +database-reviewer-style 4376 no 0 0 - ok +frontend-designer 19869 no 7 0 - ok +front-end-reviewer-style 3857 no 0 0 - ok +harness-audit 16622 no 7 0 - ok +harness-eval 15469 no 7 0 - ok +harness-refine 15126 no 7 0 - ok +harvest-curator 28071 YES 9 1 ~27224 WARN value-floor hit: over-cap but every drainable entry is value-protected/keep-floor - condense high-value BY HAND (do NOT age-archive) + [D3 value-gate] 5 value-protected logical entr(y/ies) HARD-SKIPPED from the drain set (kept regardless of position/age); move-set = lowest-value only. NOTE: 9-token grep = lower-bound; em-main must value-scan the WHOLE proposed set (paraphrase/spine leak remains). +implementer-backend 25515 no 24 0 - ok +implementer-frontend 16441 no 11 0 - ok +investigator-api 9021 no 10 0 - ok +investigator-codebase 18199 no 10 0 - ok +lead-gap-auditor 24241 no 7 0 - ok +lead-stale-auditor 30852 YES 6 1 ~30214 WARN keep-floor hit (5); cannot auto-drain - SPLIT/condense entries by hand + [D3 value-gate] 1 value-protected logical entr(y/ies) HARD-SKIPPED from the drain set (kept regardless of position/age); move-set = lowest-value only. NOTE: 9-token grep = lower-bound; em-main must value-scan the WHOLE proposed set (paraphrase/spine leak remains). +office-document 3323 no 3 0 - ok +reviewer 31341 YES 8 1 ~30982 WARN value-floor hit: over-cap but every drainable entry is value-protected/keep-floor - condense high-value BY HAND (do NOT age-archive) + [D3 value-gate] 5 value-protected logical entr(y/ies) HARD-SKIPPED from the drain set (kept regardless of position/age); move-set = lowest-value only. NOTE: 9-token grep = lower-bound; em-main must value-scan the WHOLE proposed set (paraphrase/spine leak remains). +ring1-audit 23874 no 6 0 - ok +ring2-audit 31781 YES 7 2 ~23102 PROPOSE archive (strike 2>=2): move 2 lowest-value (position tiebreak) -> curate L1->L2 by hand + [D3 value-gate] 1 value-protected logical entr(y/ies) HARD-SKIPPED from the drain set (kept regardless of position/age); move-set = lowest-value only. NOTE: 9-token grep = lower-bound; em-main must value-scan the WHOLE proposed set (paraphrase/spine leak remains). +ring4-audit 3349 no 2 0 - ok +score-count-auditor 2330 no 0 0 - ok +score-counter 2366 no 0 0 - ok +test-specialist 18914 no 7 0 - ok +tooling-auditor 30981 YES 11 1 ~30134 WARN value-floor hit: over-cap but every drainable entry is value-protected/keep-floor - condense high-value BY HAND (do NOT age-archive) + [D3 value-gate] 4 value-protected logical entr(y/ies) HARD-SKIPPED from the drain set (kept regardless of position/age); move-set = lowest-value only. NOTE: 9-token grep = lower-bound; em-main must value-scan the WHOLE proposed set (paraphrase/spine leak remains). + + [A6] DRY-RUN: strike counters NOT persisted (run with -Apply to advance strikes) + +### PASS 2 - A7 archive-integrity gate (NO-API: grep + measure only) + + [cicd-monitor] _INDEX.md + 14 archive file(s) + -> PASS pointers 112 resolved 112 failed 0 + [frontend-designer] _INDEX.md + 2 archive file(s) + -> PASS pointers 9 resolved 9 failed 0 + [harvest-curator] _INDEX.md + 4 archive file(s) + -> PASS pointers 48 resolved 48 failed 0 + [implementer-backend] _INDEX.md + 13 archive file(s) + -> PASS pointers 43 resolved 43 failed 0 + [implementer-frontend] _INDEX.md + 4 archive file(s) + -> PASS pointers 44 resolved 44 failed 0 + [investigator-codebase] _INDEX.md + 14 archive file(s) + -> PASS pointers 56 resolved 56 failed 0 + [lead-gap-auditor] _INDEX.md + 2 archive file(s) + -> PASS pointers 7 resolved 7 failed 0 + [reviewer] _INDEX.md + 10 archive file(s) + -> PASS pointers 57 resolved 57 failed 0 + [test-specialist] _INDEX.md + 4 archive file(s) + -> PASS pointers 33 resolved 33 failed 0 + [tooling-auditor] _INDEX.md + 4 archive file(s) + -> PASS pointers 20 resolved 20 failed 0 + +------------------------------------------------------------ + A7 GATE PASS - total pointers 429, resolved 429, failed 0 +------------------------------------------------------------ + +## 4. crystallized-backfill +============================================================ + crystallized-backfill.ps1 - measure-then-fill (DRY planner) + tier : lead + budget.json : D:\Dropbox\CONG_VIEC\SOLUTION\SOLUTION_ERP\.claude\agent-memory\memory-budget.json + cb config : present (target + hotload_sources read LIVE) +============================================================ + +### hot-load sources (LIVE byte-measure, UTF8) + +source bytes state +-------------------------------------------- ---------- -------- +docs/STATUS.md 234644 ok +docs/HANDOFF.md 196350 ok +.claude/governance/ACTIVE-MARKS.md 36153 ok +docs/changelog/migration-todos.md 88151 ok +docs/gotchas.md 120260 ok +.claude/agents/README.md 60723 ok +TOTAL 736281 + +### budget numbers (Upgrade-1) - ALL live-read, 0 hardcoded + +Tran tong (live cap) : 380000 tok +hotload measured : 736281 bytes +tok RANGE [low..high] : [184070 .. 245427] tok (bytes/4 .. bytes/3.0) +measured_headroom : 134573 tok (cap - tok_high, worst-case) +target (owner) : 210000 tok +expected_backfill : 134573 tok (min(target,headroom)=headroom => headroom binds (target exceeds room)) + +### value-gated backfill source-order (planner / DRY - no pour) + + precondition MET (target>0 AND headroom>0): would pull up to 134573 tok in order: + 1. gist → archive/*.gist.md (4-field distilled) + 2. value-marked → archive lines carrying gotcha# / anti-pattern / root-cause + 3. curated RAG → search_memory high-value hits + (each stage DEDUP vs the hot-load sources above; stop at expected_backfill) + +------------------------------------------------------------ + HONEST CAVEAT + char/4 is NOT a real token count; VN-diacritic hot-memory ~3.0-3.5 byte/tok. + Headroom is a RANGE [bytes/4 .. bytes/3.0]; this planner uses bytes/3.0 (worst). + backfill defaults to 0 = TAT until the OWNER sets target>0 AND measured headroom>0. + Every budget number is the OWNER's authority; this script is READ-ONLY (never tunes/writes). + HEADROOM is measured over a STABLE FILE-FLOOR (the configured hotload_sources) = an UPPER BOUND. + The PEAK hot-feed also loads session-variable task-context NOT in this list; real headroom is SMALLER. +------------------------------------------------------------ + +## 5. nhip-no-probe +NHIP-NO: kiem light 3/6 deep 19/15 OVERDUE:deep | tran-bo-nho 5 over-cap l2idx 0 over | run-chua-gom 1 | pull-cach 4 ngay | so-yc treo 5 / nhac2+ 2 (muc 13, gop 5 dong nhac-lai) diff --git a/.claude/workflows/runs/2026-08-09-S185-bookend-close/sub-harvest-curator.md b/.claude/workflows/runs/2026-08-09-S185-bookend-close/sub-harvest-curator.md index ae49177..f0d88db 100644 --- a/.claude/workflows/runs/2026-08-09-S185-bookend-close/sub-harvest-curator.md +++ b/.claude/workflows/runs/2026-08-09-S185-bookend-close/sub-harvest-curator.md @@ -1,28 +1,320 @@ # sub-harvest-curator — S185 @bookend-close (H2 harvest-integrity, GOM NỢ) +> **TRẠNG THÁI: §0-§2 XONG · §3-§4 ĐANG ĐỔ** (lật thành XONG ở cuối file) > Run: `.claude/workflows/runs/2026-08-09-S185-bookend-close/` > Vai: `harvest-curator` (H2) — **read-only + propose-only**. Single-writer = lead (B3 VERIFY→APPEND). > Uỷ-quyền: slot 71 owner @S172 "gom và sleep thì auto nhé, tự quyết" (wire `session-end.md` §L.b(f)). -> ARTIFACT-FIRST chống #53: file này đổ ruột LIÊN TỤC trong lúc làm; return chỉ là con trỏ. +> ARTIFACT-FIRST chống #53: file này đổ ruột LIÊN TỤC; return chỉ là con trỏ. --- ## 0. Phạm vi + thước đo (khai TRƯỚC khi đo — chống anti-pattern #1/#2) -- **Universe A (nguồn harvest):** mọi `runs//sub-*.md` có mtime ≥ 2026-08-01. -- **Universe B (đích):** `.claude/agent-memory//MEMORY.md` (28 vai có file, đếm bằng `find -maxdepth 2 -name MEMORY.md`). -- **Thước:** KHÔNG đo bằng TÊN file/vai. Đo 2 nấc: - - nấc-1 (rẻ, sàng): diary vai đích có chuỗi `S` của phiên sinh ra sub-file đó không? - - nấc-2 (đắt, chốt): mở entry đó ra ĐỌC RUỘT — có nói về ĐÚNG việc trong sub-file không (không phải trùng số phiên do trích dẫn chéo)? - - Mọi phán "0 / sạch" phải dán LỆNH + output. -- **Đơn vị:** byte (`%s` của `find -printf`), KHÔNG phải dòng. (Bẫy F-05 @S180: baseline không khai đơn-vị ⇒ suýt báo "−2 corruption".) +- **Universe A (nguồn):** mọi `runs//sub-*.md` mtime ≥ 2026-08-01. +- **Universe B (đích):** `.claude/agent-memory//**` — **28 vai có `MEMORY.md`**, quét CẢ `archive/` (bỏ archive = đẻ dương-giả, vì reviewer/impl-be curate verbatim xuống archive). +- **Thước 3 nấc — KHÔNG đo bằng TÊN vai (anti-pattern #1, bài S152/S172/S181):** + - **N1 sàng:** basename sub-file có được TRÍCH ở bất kỳ đâu dưới `agent-memory/` không? (rẻ, nhiều dương-giả) + - **N2 placement:** trích ở ĐÚNG `agent-memory//` chứ không phải nhà hàng xóm (Placement B2). + - **N3 chốt:** `grep -rn "^[-#].*S" agent-memory//` = **dòng MỞ ĐẦU entry**, rồi **ĐỌC RUỘT** entry đó xem có nói ĐÚNG việc trong sub-file. Token `S169` nằm GIỮA một entry S173 = **mention, KHÔNG phải harvest**. +- **Vai-đích lấy từ RUỘT sub-file** (dòng `Vai:` / header), KHÔNG suy từ tên file — tên file nói dối 2 ca đã bắt (§2.4). +- **Đơn vị: BYTE** (`stat -c %s`). Bẫy F-05 @S180 (22 dòng ⟂ 24 lần) không tái diễn. --- -## 1. Census thô — sub-*.md mtime ≥ 2026-08-01 +## 1. Census thô + +### 1.1 Universe A -Lệnh: ``` -find .claude/workflows/runs -name "sub-*.md" -newermt "2026-08-01" -printf "%TY-%Tm-%Td %TH:%TM\t%10s\t%p\n" +find .claude/workflows/runs -name "sub-*.md" -newermt "2026-08-01" -printf "%h\t%s\n" \ + | awk -F'\t' '{c[$1]++; s[$1]+=$2; tot+=$2; n++} END{...}' ``` -(đang đổ chi tiết bên dưới) +| run-folder | files | byte | +|---|---:|---:| +| `2026-07-31-S164-4gd-khkk-fanout` | 27 | 411.081 | +| `2026-08-01-S166-h24-deep-midsession` | 3 | 89.205 | +| `2026-08-01-S168-bookend-close` | 7 | 143.218 | +| `2026-08-01-S169-bookend-open` | 11 | 487.530 | +| `2026-08-04-S171-khkk-ui-mirror-pe` | 6 | 143.682 | +| `2026-08-05-S172-bookend-close` | 8 | 254.814 | +| `2026-08-05-S173-bookend-open` | 7 | 229.178 | +| `2026-08-05-S174-khkk-style-audit` | 5 | 172.588 | +| `2026-08-06-S176-doi-style-3-vai` | 1 | 15.798 | +| `2026-08-07-S180-adap-upgrade-pack-phased` | 14 | 548.414 | +| `2026-08-07-S180-bookend-open` | 7 | 55.469 | +| `2026-08-07-S182-bookend-open` | 7 | 77.003 | +| `2026-08-08-S182-khkk-awf-mirror-ncc` | 10 | 194.926 | +| `2026-08-09-S185-email-adap-pipeline` | 9 | 221.069 | +| `2026-08-09-S185-bookend-close` (đang chạy) | 1 | — | +| **TỔNG** | **123** | **3.045.550** | + +🔴 **Tự bắt thước lần 1:** lượt đầu tao in danh sách bằng `... | sort -k3 | head -120` — **cắt mất 3 dòng**, đúng 2 dòng nặng nhất (`sub-harvest-curator-sleep-batchA/B-S170`, 113.797 + 123.454 B). Đọc bản in đó thì **237.251 B biến khỏi tầm mắt**. Bài: `head -N` trên census = thước tự cắt; cộng bằng `awk` trên TOÀN tập rồi mới in. + +### 1.2 Mốc mới quan trọng — đã có một lượt GOM ngoài dự kiến + +``` +git log -1 --format='%H %ad %s' --date=iso 7cc52421 +→ 7cc5242… 2026-08-08 12:30:07 "wal: flush 20260808T1230" +git show --stat 7cc52421 → 17 MEMORY.md + 1 feedback_*.md, 73 insertions +``` +Commit này **APPEND 1 entry S182 THẬT (có ruột + con-trỏ run-folder) vào 15 vai**. ⇒ mọi con số nợ đo **trước 08-08 12:30** (gồm `576.255 B / 18-lượt` trong brief) đã **được trả một phần** ⇒ **PHẢI RE-ĐO** (đúng như brief yêu cầu). + +--- + +## 2. Bảng đối-chiếu {run · sub-file · byte · vai-đích DECLARED · đã-có-entry?} + +Sàng N1 ra **45 MISS**. Sau N2+N3: **19 là DƯƠNG-GIẢ** (có harvest, chỉ không trích tên file) và **26 là NỢ THẬT**. + +### 2.1 NỢ THẬT — cần APPEND (N) + +| # | run | sub-file | byte | vai-đích (declared) | entry? | lệnh chứng | +|---|---|---|---:|---|---|---| +| 1 | S168-bookend-close | `sub-lead-stale-close-S168.md` | 23.264 | lead-stale-auditor | **N** | `grep -rn "^[-#].*S168" …/lead-stale-auditor/` → 1 hit, **là entry S179** (mention) | +| 2 | S169-bookend-open | `sub-lead-gap-open-S169.md` | 18.318 | lead-gap-auditor | **N** | `grep -rc S169 …/lead-gap-auditor/` = **0** | +| 3 | S169-bookend-open | `sub-lead-stale-open-S169.md` | 22.503 | lead-stale-auditor | **N** | `grep -rc S169 …/lead-stale-auditor/` = **0** | +| 4 | S169-bookend-open | `sub-tooling-auditor-open-S169.md` | 23.236 | tooling-auditor | **N** | `grep -rc S169 …/tooling-auditor/` = **0** | +| 5 | S169-bookend-open | `sub-ring1-audit-open-S169.md` | 34.806 | ring1-audit | **N** | 2 hit S169 **đều nằm trong entry S173 + S168** = mention | +| 6 | S169-bookend-open | `sub-ring2-audit-open-S169.md` | 32.197 | ring2-audit | **N** | `grep -rc S169 …/ring2-audit/` = **0** | +| 7 | S169-bookend-open | `sub-harvest-curator-open-S169.md` | 26.137 | harvest-curator (**TAO**) | **N** | 3 hit S169 = mention trong entry S173/S180/S182 — **tao nợ chính mình** | +| 8 | S169-bookend-open | `sub-ring4-audit-sleep-S170.md` | 20.122 | ring4-audit | **N** | `grep -oE 'S1[6-8][0-9]' ring4-audit/MEMORY.md` = **RỖNG toàn sổ** | +| 9 | S164-fanout | `sub-test-k7.md` | 13.365 | test-specialist (S**167**) | **N** | `grep -rn "^[-#].*S167" …/test-specialist/` = **0** | +| 10 | S164-fanout | `sub-implfe-k7.md` | 5.846 | implementer-frontend (S**167**) | **N** | có 1 entry S167 nhưng ruột = *"GĐ3 cây 4-folder BLOCKED @§0, 0 file chạm"* ≠ việc K7 bridge | +| 11 | S180-adap | `sub-review-n2-S180.md` | 22.418 | reviewer | **N** | archive §@S180 có N4 + W0a + W0b + lane-A + lane-B, **không có N2** | +| 12 | S180-adap | `sub-n3-lane-c-gd34.md` | 72.156 | reviewer | **N** | 0 hit — lane **NÓNG NHẤT** (chứa CẢ HAI xung đột, theo `run.md`) | +| 13 | S180-adap | `sub-n3-lane-d-gd56.md` | 43.795 | reviewer | **N** | 0 hit | +| 14 | S180-adap | `sub-n3-lane-e-benh.md` | 38.531 | reviewer | **N** | chỉ được **trích 1 câu** trong entry N4 (`lane E §4.4`) ⇒ mention | +| 15 | S180-adap | `sub-n3-lane-f-maytay.md` | 52.923 | reviewer | **N** | 0 hit | +| 16 | S180-adap | `lane-memory-proposals/` **7 tệp** | 17.728 | reviewer | **N** 🔴 | §2.3 — **mồ côi CỨNG, 0 file / 0 citation** | +| 17 | S182-khkk | `sub-invest-db-fable.md` | 18.097 | investigator-codebase | **N** | entry S182 có, nhưng ruột chỉ nói **BE** (`sub-invest-be-fable.md`) | +| 18 | S182-khkk | `sub-invest-fe-fable.md` | 13.916 | investigator-codebase | **N** | như trên | +| 19 | S182-khkk | `sub-review-2-fable.md` | 32.326 | reviewer | **N** | `archive:101` khai đĩa = `sub-review-1-fable` + `sub-reviewer-precommit`; **review-2 vắng** | +| 20-26 | S185-email-adap | `sub-opus-lane1..7` | **166.425** | ⚠️ **KHÔNG CÓ VAI** (tự khai *"Opus 5 MAX"*) | **N** | §2.5 — lỗ **PLACEMENT**, không phải lười harvest | + +**Cộng:** S168 23.264 · S169/S170 177.319 · S164-fanout 19.211 · S180-adap 247.551 · S182-khkk 64.339 · S185 166.425 +⇒ **TỔNG 698.109 B / 26 lượt-vai / 11 vai có tên + 1 khối 7 lane vô-danh.** + +### 2.2 DƯƠNG-GIẢ đã loại (19) — sàng-tên kêu MISS nhưng RUỘT đã về nhà + +| sub-file(s) | byte | vai | chứng đóng | +|---|---:|---|---| +| `sub-reviewer-lens-{feasibility,fidelity,regression}-s171` ×3 | 74.070 | reviewer | `archive/2026-08.md:36` — *"3 lane lens ĐỐI-KHÁNG… ĐĨA CỨU **74.070 B**"* — cộng lại **khớp TỪNG BYTE** (26.461+23.177+24.432) | +| `sub-frontend-designer-L2..L5` ×4 | 138.230 | frontend-designer | `MEMORY.md:48` — *"AUDIT style KHKK… **ensemble 5 lane** CÙNG 1 VAI, 5/5 xong 0 chết"* ⇒ entry phủ cả 5, chỉ trích tên L1 | +| `sub-w1b-chuan-ten` · `sub-w2-luoi-ghi-dia` · `sub-w3-nghi-thuc` ×3 | 86.219 | implementer-backend | `MEMORY.md:7/5/3` — 3 entry riêng "lane W1-b" / "lane W2" / "lane W3" | +| `sub-w0a-fitmap-tracking` | 10.466 | reviewer | `archive/2026-08.md` §"W0 lane a/2: dựng `adap-upgrade-pack-{fitmap,tracking}.md`" | +| `sub-{harvest-curator,lead-gap-auditor,lead-stale-auditor,ring1-audit,ring2-audit,tooling-auditor}-open-S180` ×6 | 53.907 | 6 vai bookend | 6 entry `S180 @open L12` `[LEAD SEED ON-BEHALF]`, verdict khớp (`6 FLAG` · `15 FLAG` · `PASS_WITH_FLAGS 9` · `32Đ/6T` · `21Đ/0T` · `GATE-FAIL 7`) | +| `sub-reviewer-sleep-fidelity-S170` | 38.167 | reviewer | `archive/2026-08.md:40` §@S170 GATE Fidelity `/sleep-recovery-memory-l2` | +| `sub-test-k4a` | 14.247 | test-specialist | `MEMORY.md:3` entry `S166-K4a … 7 test` | + +🔴 **Bài của khối này:** dừng ở nấc-1 thì **19/45 = 42% báo động giả** — cùng hạng với 32% đã đo @S122. Sàng tên để **thu hẹp**, không bao giờ để **kết luận**. + +### 2.3 🔴 MỒ CÔI CỨNG — 7 tệp memory-proposal chưa từng hạ cánh + +`runs/2026-08-07-S180-adap-upgrade-pack-phased/lane-memory-proposals/` (lane N3-E soạn, mtime 08-07 14:40-14:44): + +``` +for p in feedback_doctrine_line_undercounts feedback_measure_with_detectors_own_regex \ + feedback_refuse_coordinator_suggested_verdict feedback_stale_anchor_born_dead \ + feedback_unit_mismatch_keep_both proxy_predicate_blind_measure \ + ranking_claim_needs_two_denominators; do + find .claude/agent-memory -name "$p.md" | wc -l ; grep -rl "$p" .claude/agent-memory/ | wc -l +done +→ 7/7 đều: file=0 cited-in=0 +``` +⇒ **7/7 KHÔNG tồn tại và KHÔNG được trích ở bất cứ đâu** dưới `agent-memory/`. Loại nợ **rẻ nhất để trả, đắt nhất để mất**: chúng đã ở **dạng memory hoàn chỉnh** (frontmatter `name`/`description`/`metadata.type`, thân có `**Why:**` + `**How to apply:**`), kèm sẵn `MEMORY.md` index 3 dòng. Lead chỉ cần **copy 7 tệp + nối 3 dòng index** vào `agent-memory/reviewer/` — **không cần distill**. + +### 2.4 Tên file NÓI DỐI — 2 ca, cả 2 đều đổi kết luận + +1. **`sub-k8-dryrun.md` (16.274 B, folder S164-fanout)** — sàng kêu MISS. Ruột dòng 3: *"🔴 **TÁC GIẢ = LEAD (em-main), KHÔNG phải sub-agent** — tiền tố `sub-` là **sai quy-ước tên**… 0 spawn ⇒ **không có spawn-record cho lượt này là ĐÚNG, không phải silent-miss**"*. ⇒ **KHÔNG phải nợ** (ca này chính tao đã khai FID-1 @S168). +2. **Folder ≠ phiên.** `2026-07-31-S164-4gd-khkk-fanout` chứa sub-file của **S164 · S165 · S166 · S167 · S168** (đọc nhãn phiên trong ruột từng tệp). Quy nạp "folder S164 ⇒ soi diary S164" sẽ chấm `sub-test-k7`/`sub-implfe-k7` (S167) **ĐẠT nhầm**, vì 2 vai đó *có* entry S164. **Đúng lớp bệnh F-03 @S181 — máy hỏi sai câu.** + +### 2.5 ⚠️ 7 lane S185 — lỗ PLACEMENT, không phải lười harvest + +`sub-opus-lane1..lane7` (166.425 B) tự khai vai *"Agent: Opus 5 MAX"* / *"Opus 5 (1M)"* — **không phải một vai trong `agent-memory/`**; không có `agent-memory/opus-lane*/`. ⇒ delta này **không có nhà**. 3 đường, tao **KHÔNG tự quyết** (quyền lead/owner): +- **(a) theo chức năng:** lane1 detector + lane7 máy-quét + lane2 tiền-kiểm → `implementer-backend` · lane3 doc-codify + lane4 report-hygiene → `ctx-curator` · lane5 measure → `investigator-codebase` · lane6 memory-gate → `harvest-curator`. +- (b) 1 entry gộp ở `ctx-curator` + con-trỏ 7 tệp. +- (c) để nguyên run-folder, 1 dòng con-trỏ vào `harvest-curator` (rẻ nhất, mất mát cao nhất). +🔸 **Khuyến nghị: (a)** — bài học lane là bài học NGHỀ của từng vai; gộp 1 nhà = tái diễn đúng lỗi "delta sai nhà" (Placement B2). + +### 2.6 Vai KHÔNG cần harvest — kê đủ để Coverage không có silent-miss + +| vai | vì sao KHÔNG có nợ | +|---|---| +| `ctx-audit` | S169 Đà harvest (`MEMORY.md:9`, cite `sub-ctx-audit-open-S169.md 34.793B == HẾT ==`) · S172/S173/S182 đủ | +| `cicd-monitor` | 13 entry-line S164-S168 + entry S182 (commit `7cc5242`) — 6 tệp `sub-cicd-verify-*` đều có nhà | +| `harness-audit` · `harness-eval` · `harness-refine` | 0 sub-file trong mọi run ≥08-01 ngoài S172/S173 (đã harvest) | +| `database-agent` · `investigator-api` · `office-document` | 0 lượt spawn trong cửa sổ — **vắng folder ≠ orphan** (mode-A by-design) | +| `score-counter` · `score-count-auditor` · 3 vai `*-reviewer-style` | mới sinh; đã có entry S181/S182 từ commit `7cc5242` | +| `implementer-backend` (S164/S165) | 0 entry S164/S165 **nhưng** `sub-implbe-k2`(S164)/`k3`(S165) nằm NGOÀI cửa sổ mtime ≥08-01 ⇒ ngoài phạm vi lượt này. **KHÔNG tuyên sạch** — ghi nợ-tiềm-tàng cho lượt sau | +| `sub-spawn-probe-style-S180` (1.562 B) | probe 1-dòng cố định, 0 nội-dung nghề ⇒ dưới ngưỡng đáng-harvest (khai để không im lặng bỏ) | +| `sub-harvest-curator-sleep-batchA/B-S170` (237.251 B) | **đã định-đoạt @S182 = "nháp, không phải nợ"** — DEDUP, không đề xuất lại | + +--- + +## 3. ĐỀ-XUẤT APPEND per-vai (propose-only — lead VERIFY→APPEND, B3) + +> **Luật của khối này:** mọi câu dưới đây **rút từ RUỘT sub-file trên đĩa** (verdict-line-1 · bảng tally · §END). Tao **KHÔNG diễn giải thêm**, KHÔNG thêm số không có trên đĩa. Lead re-Read `` rồi mới APPEND. Mỗi khối gắn `[LEAD SEED ON-BEHALF]` đúng tiền lệ S162/S172/S180. +> **DEDUP đã chạy:** từng khối đã đối chiếu `grep -rn "^[-#].*S" agent-memory//` = 0 entry ⇒ APPEND **không** đẻ double-record. + +### 3.1 `lead-stale-auditor` — 2 entry (S168 + S169) + +``` +- **S168 (08-01) @close bookend — `8 FLAG (4H/3M/1L)` · coverage 8/8 chạm nhưng **6 PARTIAL** `[LEAD SEED ON-BEHALF — nguồn `runs/2026-08-01-S168-bookend-close/sub-lead-stale-close-S168.md` 23.264 B]`:** 🔴 Tự khai đúng nấc: 8/8 chạm mà 6 ô là PARTIAL ⇒ con số **là SÀN, không phải TỔNG** — khai nấc phủ TRƯỚC khi khai số. **Sợi chỉ 5/8 FLAG cùng MỘT gốc:** 2 quyết-định owner @S168 (slot (63)(b)=D · slot (59) "cứ mở rộng") **đã land ở nơi lead làm việc** (`081557b`, `memory-budget.json` sources 5→8) **nhưng không lật ở nơi người đọc tra** ⇒ stale không sinh từ quên-làm mà từ **làm-một-phía**. Class fire: `view-stale-count` 2 · `view-residual-asym` 1 · `view-stale-header` 1 · `view-stale-role-desc` 0. Tag `[s168, san-khong-phai-tong, land-mot-phia, 5-flag-mot-goc]` + +- **S169 (08-01) @open L10-w1 — `8 FLAG` · coverage **8/8 = TỔNG** `[LEAD SEED ON-BEHALF — nguồn `runs/2026-08-01-S169-bookend-open/sub-lead-stale-open-S169.md` 22.503 B]`:** 🔴 **Đảo nấc so với S168:** lần này artifact đổ ruột sau MỖI FLAG ⇒ dám tuyên **TỔNG chứ không SÀN**, và tự dán đối-chứng S159 (lần đó chết ở nhóm 5/8 nên "5 FLAG" chỉ là sàn). **Cách khai phủ = đổ-ruột-liên-tục, không phải trí nhớ.** Điểm mù tự-quy-chiếu được gọi tên: N3 soi 23 persona *gồm 2 file `lead-*-auditor` của chính mình*. 🔸 Cận-dưới tự khai: N3 chỉ soi **số-học + mệnh-đề-nhịp**, KHÔNG đọc trọn 23 file (~13-20KB/file) ⇒ sai-ngữ-nghĩa thuần không mang số có thể còn sót. Tag `[s169, tong-vs-san, do-ruot-tung-flag, diem-mu-tu-quy-chieu, can-duoi-khai-that]` +``` + +### 3.2 `lead-gap-auditor` — 1 entry (S169) + +``` +- **S169 (08-01) @open L10-w1 — `5 FLAG` (trục GAP = soi CÁI KHÔNG CÓ) `[LEAD SEED ON-BEHALF — nguồn `runs/2026-08-01-S169-bookend-open/sub-lead-gap-open-S169.md` 18.318 B]`:** class fire: `gap-carry-dropped` 1 (HIGH) · `gap-decision-sunk` 2 (1 HIGH + 1 MED) · `gap-owner-specifics` 1 (MED) · `gap-underfill` 1 (MED) · `gap-carry-aged` 0 · `gap-incident-unrecorded` 0. 🔴 **Bài ăn tiền = ĐƠN-VỊ CỦA TALLY:** `class_repeat` đếm theo **audit LIÊN-TIẾP**, KHÔNG phải lần-trong-phiên — đếm sai đơn-vị thì ngưỡng leo thang bắn sai. Sau lượt này `gap-owner-specifics` 2→**3 = CHẠM `jump_on_class_repeat`=3**. Tag `[s169, gap-5, don-vi-tally-audit-lien-tiep, cham-nguong-leo-thang]` +``` + +### 3.3 `tooling-auditor` — 1 entry (S169) + +``` +- **S169 (08-01) @open L10-w1 — `PASS_WITH_FLAGS — 10 finding` `[LEAD SEED ON-BEHALF — nguồn `runs/2026-08-01-S169-bookend-open/sub-tooling-auditor-open-S169.md` 23.236 B]`:** 4 mặt CÓ và nhất-quán ở lớp canonical (roster 23 khớp **5 bề-mặt** · plugin 0-delta · 6/6 skill + 2 skill bị nghi đều SẠCH · `CLAUDE.md` mig đủ 70+71) — **nhưng 10 finding stale tích-tụ + monthly-audit quá hạn ĐÚNG HÔM ĐÓ**. 🔴 **Nấc plugin phải khai đủ 4 bậc** — installed 18 (mkt 37) → enabled 15 → assigned (`agents/README:216-228`) → **`used` KHÔNG đo được từ repo ⇒ KHÔNG khai**. Khai phạm-vi tập-đo: persona sweep = 2 mẫu grep count-class trên 23/23 file; **CHƯA soi** số dạng LOC/%/ms/byte-cap và trọn `.claude/commands/*.md` (19 file). G-015: `store_memory` strip nhưng **`Bash` còn = write-channel mở ⇒ KHÔNG tuyên "read-only enforced"**. Tag `[s169, pass-with-flags-10, plugin-4-bac, used-khong-do-duoc, khai-pham-vi-tap-do]` +``` + +### 3.4 `ring1-audit` — 1 entry (S169) + +``` +- **S169 (08-01) @open L10-w1 KIỂM vòng tooling/harvest — `18Đ/9T` `[LEAD SEED ON-BEHALF — nguồn `runs/2026-08-01-S169-bookend-open/sub-ring1-audit-open-S169.md` 34.806 B]`:** 6 đề-xuất chốt, đắt nhất là **quy-nguyên FLAG phải chỉ ĐÍCH DANH commit sinh ra nó** (F-5 "sinh tại `ff7f655` S168") + luật chặn tái-phát **lần 5**: grep `skills/README.md` MỖI KHI chạm `SKILL.md`. 🔴 **Đóng slot phải đóng CẢ mention lạc:** slot (48) đóng là dương-giả **trừ khi** gỡ/đóng-dấu 🧊 2 mention `self-target 17.1K` ở `memory-budget.json:191/:198` — không thì **cãi lại lần 4**. Phân biệt bệnh-thật ⟂ artifact-đo: C11 "vá regex `:1794`" CÓ bệnh · "over-count" thì **ĐỪNG vá**. 4 dir rỗng trong run-folder ⇒ soi bằng `find`, **không bằng `git status`**. 🔸 Tự khai: đứt-mạch #53 giữa §2→§3, artifact cứu nguyên 14.162 B, **mất 0 B**. Tag `[s169, 18d-9t, quy-nguyen-chi-dich-danh-commit, dong-slot-phai-dong-mention, benh-that-vs-artifact-do]` +``` + +### 3.5 `ring2-audit` — 1 entry (S169) + +``` +- **S169 (08-01) @open L10-w1 KIỂM 2 con-đo H24 — `13Đ/2T` `[LEAD SEED ON-BEHALF — nguồn `runs/2026-08-01-S169-bookend-open/sub-ring2-audit-open-S169.md` 32.197 B]`:** 13 FLAG per-FLAG ĐẠT toàn bộ; **2 TRƯỢT ở MẶT-BẰNG** (coverage-đủ vỡ + sai khuôn máy-đọc) ⇒ **chấm từng-FLAG sạch KHÔNG suy ra chấm mặt-bằng sạch**. 🔴 **Kể bằng THÀNH-PHẦN, bỏ số tổng:** `lead-gap` F-5 → *giữ FLAG, bỏ con số "~17%"*. Đề vá **CLASS thay vì vá 4 ca** (F-3 của `lead-stale` là site 8-11 của class đã đếm tới site 7 từ S164). 🔴 **Tự khai đắt nhất:** lượt-1 là **skeleton-ruột-rỗng — 130K token đổi lấy 1.020 B**; bản dùng được viết ở lượt-2 sau khi lead ép *ghi-trước-nghĩ-sau*. Nội dung không mất (mọi số đo lại + có lệnh kèm) nhưng **quy-trình đã hỏng**. Tag `[s169, 13d-2t, tung-flag-khong-suy-ra-mat-bang, ke-bang-thanh-phan, skeleton-130k-doi-1020B]` +``` + +### 3.6 `ring4-audit` — 1 entry (S170) 🔴 **vai này sổ TRỐNG TRƠN — 0 token S1xx toàn sổ** + +``` +- **S170 (08-03) KIỂM vòng nén-ngủ `/sleep-recovery-memory-l2` `[LEAD SEED ON-BEHALF — nguồn `runs/2026-08-01-S169-bookend-open/sub-ring4-audit-sleep-S170.md` 20.122 B]`:** mặt trong-trục SẠCH — gist nén ra **0 hit plaintext**, chỉ mang nhãn đã che (F-3). 🔴 **Bắt được thước hỏng của chính phép kiểm:** `git show HEAD:` bị `core.autocrlf=true` **bóp méo** ⇒ đã loại ở C-1, mọi số trong bảng là **byte THẬT trên đĩa**. ⚠️ `agent-memory/reviewer/MEMORY.md` hiện ` M` trong `git status` mà `git diff` + `--cached` đều RỖNG = **đổi CRLF/mode thuần**, không đổi nội dung — báo để lead soát commit-gate. 🔸 Tự khai cận-dưới: thách-CLEAN sâu chỉ **2/16 cặp**; 12 cặp còn lại chỉ kiểm **cơ-học** (byte·hash·utf8·frontmatter·coverage-token) ⇒ T-1…T-5 là **cận-dưới, không phải bản kiểm đầy đủ**. Tag `[s170, sleep-l2-gate, autocrlf-bop-meo-git-show, m-nhung-diff-rong, can-duoi-2-tren-16]` +``` + +### 3.7 `test-specialist` — 1 entry (S167) + +``` +- **S167 (08-01) lane TEST-K7 bridge KHKK→HĐ — `DONE, suite 639/0` (45D+594I, Δ+17) · **0 FLAG bug production** `[LEAD SEED ON-BEHALF — nguồn `runs/2026-07-31-S164-4gd-khkk-fanout/sub-test-k7.md` 13.365 B; vai chết đúng lúc closing, END-line + §0-§5 vai tự ghi trọn]`:** 12 test bridge + 5 authz đều xanh trên mã BE hiện tại, **không test nào phải giữ ĐỎ**. 🔴 **Lệch GIẤY TỜ ⟂ lệch Mà là 2 việc khác nhau:** bảng invest T1 `:75` ghi `WorkflowDefinitionId null` nhưng **vá-6 thắng** và mã đang pin V1 ⇒ test theo **CODE + vá-6**, ghi mismatch ngay trong header file test (không im lặng chọn bên). 🔸 Vùng KHÔNG phủ được bằng unit test: `SeedContractCreateAccessAsync` (`DbInitializer.cs:2757-2822`) chỉ ăn **@restart API prod** ⇒ thuộc acceptance, khai chứ không giả vờ phủ. Tag `[s167, test-k7, 639-0, lech-giay-to-vs-lech-ma, vung-chi-an-sau-restart]` +``` + +### 3.8 `implementer-frontend` — 1 entry (S167) + +``` +- **S167 (08-01) lane FE-K7 bridge KHKK→HĐ (vá-1 FE · vá-16 · vá-4b) — `DONE` `[LEAD SEED ON-BEHALF — nguồn `runs/2026-07-31-S164-4gd-khkk-fanout/sub-implfe-k7.md` 5.846 B; **2 lượt #53-garble**, resume-1 + lead-close-on-behalf từ đĩa]`:** 🔴 **Chứng máy phải đo SAU KHI VAI DỪNG TAY** (trọng tài build TƯƠI, gotcha #68): SHA-pair **3/3 identical** (`usePipelineStages.ts` `76e1823345d4` · `KhkkDetailPage.tsx` `cf0a2272061f` · `types/khkk.ts` `60ec8fa3a5ae`) · `npx tsc -b` fe-user + fe-admin **EXIT 0** · `npm run build` 921ms/765ms (warning chunk-size + INEFFECTIVE_DYNAMIC_IMPORT = **PRE-EXISTING**, đối chứng trước khi đổ lỗi) · `git status` đúng **6 file M (3 cặp mirror), 0 file lạ**. Tag `[s167, implfe-k7, build-tuoi-sau-khi-dung-tay, warning-pre-existing, 3-cap-mirror]` +``` + +### 3.9 `investigator-codebase` — 1 entry gộp (S182, 2 lens DB+FE) + +``` +- **S182 (08-08) ×Fable KHKK AWF mirror NCC — **lens DB + lens FE** `[LEAD SEED ON-BEHALF — nguồn `runs/2026-08-08-S182-khkk-awf-mirror-ncc/sub-invest-db-fable.md` 18.097 B + `sub-invest-fe-fable.md` 13.916 B; entry S182 sẵn có chỉ phủ lens **BE**]`:** 🔴 **2 quả bom cùng một gốc `per-TYPE`:** panel `ContractSigningPlan` **GIẤU 7/8 workflow nhóm** vì BE `Active = FirstOrDefault(IsActive)` per-type (`ApprovalWorkflowV2AdminFeatures.cs:210`, tie-break Version DESC **không xác định** giữa 8 bản v1) · và bấm "Tạo quy trình mới"/"Lưu + kích hoạt" cho BẤT KỲ mã type-10 ⇒ `IsActive=false` **CẢ 8 nhóm** (`:339-343`; seeder idempotent per-Code `:610` **skip**, không re-set). 🔴 **committed-but-unapplied-local:** Mig 72 trên đĩa từ 08-06 mà **cả Dev lẫn Design local dừng ở Mig 71**. **Vắng dữ liệu ≠ bug:** seeder KHKK resolve người duyệt **theo EMAIL cứng** (11 email prod `DbInitializer.cs:556-584`) ⇒ DB thiếu user thì workflow RỖNG 0 bước vẫn tạo + log warning — designer local thấy 8 workflow trống người là **ĐÚNG**. Memory cũ S155 *"WF-V2 KHÔNG có lệnh Update"* đã **STALE** (`UpdateAwDefinitionCommand` đã land). 2 bộ luật song song cùng file (`HaveSequentialOrders` chỉ chạy path Create ⟂ Update dùng guard riêng) = drift-risk. Route `/system/approval-workflows-v2` **KHÔNG PermissionGuard** (`App.tsx:79-80`) — gotcha #82 2 tầng. Tag `[s182, lens-db-fe, bom-per-type, giau-7-tren-8, committed-but-unapplied-local, vang-du-lieu-khong-phai-bug]` +``` + +### 3.10 `reviewer` — 6 entry + 1 khối copy-nguyên (nặng nhất, 247.551 B) + +> Vai này nợ **6 lượt làm-việc-dài của S180** + **1 lượt S182** + **7 tệp memory soạn sẵn**. Đề nghị lead APPEND digest ở L1 và đẩy verbatim xuống `archive/2026-08.md` theo đúng lối vai này đang dùng. + +``` +- **S180 (08-07) N2 phản-biện bản-đồ N1 — `PASS_WITH_FIXES — 0C/5M/6m` `[LEAD SEED ON-BEHALF — nguồn `runs/2026-08-07-S180-adap-upgrade-pack-phased/sub-review-n2-S180.md` 22.418 B]`:** ~60 phép đo trên ~45 claim — **KHÔNG claim nào đổ**; 3 phép 0-hit tái-lập đứng cả khi tách vế ⇒ **bản đồ N1 ĐỨNG VỮNG về DỮ KIỆN, 5 MAJOR đều nằm ở SUY LUẬN/PHỦ, không ở ĐO** (tách 2 lớp này trước khi phán). Nặng nhất **F-10: "chỉ có 1 xung đột" là SAI — có xung đột THỨ HAI**, và nó nằm ngay trong §4.4(c) của chính N1 rồi bị câu §4.3 phủ nhận ⇒ hệ quả: N4 sẽ xếp W4-sổ thành "việc máy" và **bỏ mất bước anh-duyệt-ranh**. 4/4 khoản VƯỢT-KHUNG đều đúng cấp; **không khoản nào bị thổi lên để né, không khoản nào bị hạ để tự làm**. Tag `[s180, n2, du-kien-vs-suy-luan, xung-dot-thu-hai, vuot-khung-dung-cap]` + +- **S180 (08-07) N3 LANE-C GĐ-3+GĐ-4 (lane NÓNG NHẤT — chứa CẢ HAI xung đột) `[LEAD SEED ON-BEHALF — nguồn `sub-n3-lane-c-gd34.md` 72.156 B]`:** GĐ-3 **10 khoản** (có 3 · nửa 3 · thiếu 3 · **ngược 1**) · GĐ-4 **12 khoản** (có 2 · nửa 3 · thiếu 5 · **ngược 1** · chưa đo 1) · **5 khoản VƯỢT-KHUNG**. 🔴 **Dựng phương án, KHÔNG CHỌN:** xung đột 1 có **4 phương án**, xung đột 2 có **3 phương án**, lane **không chọn khoản nào** — đúng ranh vai đối-kháng khi việc chạm quyền owner. 🟢 **Ô CHƯA ĐO ghi KÈM LỆNH, không để trống** (4 ô, mỗi ô 1 lệnh chạy được) — và khai thẳng có ô mà kết luận đúng là **"KHÔNG ĐO ĐƯỢC"** chứ không phải "thiếu sót". Không đo lại phần lead đã verify (`status: DRAFT` 4/4 thư) — chỉ nhắc để mục phản biện không rớt. Tag `[s180, lane-c, dung-phuong-an-khong-chon, o-chua-do-kem-lenh, khong-do-duoc-la-ket-luan]` + +- **S180 (08-07) N3 LANE-D GĐ-5+GĐ-6 — `GĐ-5 13,0/20 · GĐ-6 3,0/17` `[LEAD SEED ON-BEHALF — nguồn `sub-n3-lane-d-gd56.md` 43.795 B]`:** 🔴 **BÁC claim xếp-hạng "GĐ-5 gần xong nhất" — vì claim xếp hạng KHÔNG CÓ MẪU SỐ**: trên cùng một thước, GĐ-2 (5,5-6/8) **≥** GĐ-5 (5,33/8). 🔴 **1 MAJOR máy-mù:** `spawn-model-audit` **mù 17/17 lane của chính phiên đang chạy** mà vẫn in `0 mismatch` + `TOTAL FLAGS: 0` ⇒ máy in "sạch" trên vùng nó chưa từng đọc. Chấm 2 thang **nới ⟂ nghiêm** cho cùng một GĐ (GĐ-6: 18% nới / 6% nghiêm) thay vì 1 số. Đính chính **4 phía, gồm chính mình**: N1 ×2 · N2 ×0 (F-07b/F-09 xác nhận ĐÚNG) · lệnh lead ×1 (chiều mù viết ngược) · **tự đính chính ×1** (`:250-253`→`:251-254`). 4 khoản `CHƯA ĐO` **có tên + có lệnh**. Tag `[s180, lane-d, claim-xep-hang-khong-mau-so, may-mu-in-sach, thang-noi-va-nghiem, dinh-chinh-4-phia]` + +- **S180 (08-07) N3 LANE-E trục BỆNH (9 lớp lỗi × 12 TC) `[LEAD SEED ON-BEHALF — nguồn `sub-n3-lane-e-benh.md` 38.531 B + `lane-memory-proposals/`]`:** 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, không có THUỐC). Lead sót 3 ca. 🔴 **Đó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":** slot (70) dán ĐÓNG @S179 trong khi rider lỗi máy ở `:51` còn sống — **lỗ thủng TO GẤP ĐÔI SAU KHI ĐÓNG** (12 → 25 slug). 🔴 **Khai trạng-thái-quá-khứ bằng thì hiện-tại:** `session_ctx_kb` bị liệt ghost-wire 0-reader, đo ra **đã đóng từ S153** (`scripts/session_ctx.py:528/:563` là reader fail-loud) — trùng đúng kiểu `pull_warn_days` đã bị bác trước đó, **hai lần cùng lỗi trong cùng một ô bảng**. **Va chạm tệp tạm giữa lane song song:** tên chung bị lane khác ghi đè giữa 2 lượt, chỉ lộ nhờ `grep` chuỗi đặc trưng trước khi nối — **nối mù = mất dữ liệu IM LẶNG**. Tag `[s180, lane-e, may-quet-dau-vs-khoan-ap-dau, qua-khu-ke-bang-hien-tai, va-cham-tep-tam-lane-song-song]` + +- **S180 (08-07) N3 LANE-F máy⟂tay · vượt-khung · rủi-ro `[LEAD SEED ON-BEHALF — nguồn `sub-n3-lane-f-maytay.md` 52.923 B — §10 của file này TỰ KHAI "nội dung lẽ ra vào diary"]`:** 🔴 **`fed-but-unread` — sub-class ghost-wire THỨ 3, MỚI:** sổ được nuôi bằng công thật (~40 tệp run tính tally) nhưng **vế so-sánh ngưỡng không tồn tại** ⇒ **nguy hơn `defined-but-unread`** vì khối lượng công đổ vào tạo cảm giác cơ chế đang sống. **Thang máy/tay 2 nấc là thang HỎNG:** SE có **1 máy fire thật · 17 máy-qua-nghi-thức · 3 mồ côi** — điền "máy" cho cả 17 là đúng chữ sai nghĩa; câu hỏi chuẩn: *"kết quả không-hit có phụ thuộc người nhớ chạy không?"*. **Vá doc bình thường làm điểm mù của máy TO RA, im lặng** (`**NEXT em`→`### NEXT em` ⇒ `marks[0]` trôi :90→:172 ⇒ 12→25 slug bị nuốt) ⇒ neo detector vào **cấu trúc ổn định** + phản-chứng chạy lại mỗi lần bề mặt bị vá. **Đóng khoản bằng bằng-chứng ĐÚNG nhưng ở TẦNG THẤP HƠN mục tiêu** (slot 68). **Whitelist frontmatter = tự lừa:** 20/26 vai khai không Write/Edit, runtime vẫn cấp — lượt này tự chứng bằng chính `Write` của mình; backstop thật là lead soát `git status`, **và đó là TAY**. **`ngược-#53` là lỗi LỆNH không phải lỗi trí nhớ** ⇒ chặn bằng **thứ tự tool-call** (`Write` khung = tool-call #1), không chặn được bằng lời nhắc. 🟢 **CỐ Ý không tạo `/.claude/agent-memory/reviewer/MEMORY.md`** dù harness trỏ vào đó — vì sẽ đẻ đúng stray-mis-land class-S54. Tag `[s180, lane-f, fed-but-unread, thang-2-nac-la-thang-hong, va-doc-lam-diem-mu-to-ra, whitelist-tu-lua, thu-tu-tool-call]` + +- **S182 (08-08) lens HOÀN-CHỈNH-VẬN-HÀNH + tổng hợp WAVE-PLAN FINAL `[LEAD SEED ON-BEHALF — nguồn `runs/2026-08-08-S182-khkk-awf-mirror-ncc/sub-review-2-fable.md` 32.326 B; entry S182 sẵn có chỉ khai đĩa `sub-review-1-fable` + `sub-reviewer-precommit`]`:** review **không dừng ở diff** mà dựng trọn đường ship: W4 test-gate (số canonical đổi ⇒ update **DUY NHẤT** `docs/STATUS.md` row test, B1) · W5 **commit MỘT phát** BE+FE+tests · **cicd 4-chân** với **control-âm bắt buộc** (bundle cũ 0-hit; *"eoffice: hash GIỮ nếu bỏ W2e / ĐỔI nếu làm — **đo, không suy**"*) · acceptance PROD **đọc-only** (CẤM bấm "Tạo phiên bản mới" trên prod). 🔴 **Rollback không đối xứng — phải khai:** 0-mig nên revert sạch phần MÁY, nhưng **revert W1a = bom per-type TÁI VŨ TRANG** ⇒ sau revert CẤM "Tạo phiên bản mới" mọi panel type-10. Data ở lại là **hợp lệ + khai rõ** (changelog W1c = audit-history · v02+ = ratchet vô hại, pin by-Id). Accepted-risk ghi thẳng: race 2-admin-cùng-Code → 500 thô (UNIQUE đỡ data, **không silent-dup**). Tag `[s182, review-2, review-den-duong-ship, control-am-bat-buoc, rollback-khong-doi-xung, accepted-risk-khai-thang]` +``` + +**+ khối COPY-NGUYÊN (không cần distill) — 7 tệp `lane-memory-proposals/` → `agent-memory/reviewer/`:** +`feedback_doctrine_line_undercounts.md` · `feedback_measure_with_detectors_own_regex.md` · `feedback_refuse_coordinator_suggested_verdict.md` · `feedback_stale_anchor_born_dead.md` · `feedback_unit_mismatch_keep_both.md` · `proxy_predicate_blind_measure.md` · `ranking_claim_needs_two_denominators.md` (+ nối 3 dòng index từ `lane-memory-proposals/MEMORY.md` vào `reviewer/MEMORY.md`). +🔸 Chúng **đã đúng khuôn memory** (frontmatter `name`/`description`/`metadata.type` + thân `**Why:**`/`**How to apply:**`) ⇒ lead chỉ VERIFY rồi copy; **KHÔNG viết lại** (viết lại = mất nguyên văn của lane). + +### 3.11 `harvest-curator` (TAO) — 1 entry (S169) · tao nợ CHÍNH MÌNH + +``` +- **S169 (08-01) @open L10-w1 — `GATE-FAIL — 8 finding` `[LEAD SEED ON-BEHALF — nguồn `runs/2026-08-01-S169-bookend-open/sub-harvest-curator-open-S169.md` 26.137 B]`:** 🔴 **Quan sát containment đắt nhất, và nó KHÔNG phải finding — nó là CẢNH BÁO HÌNH-DẠNG:** harness lượt đó tạo sẵn **4 thư mục memory sandbox RỖNG LỒNG TRONG run-folder** (`runs/2026-08-01-S169-bookend-open/.claude/agent-memory/{harvest-curator,lead-gap-auditor,lead-stale-auditor,tooling-auditor}/`, `find -type f` = **0**). Vai nào tuân "persistent memory" của khung mà ghi vào đó thì delta **land ngoài `agent-memory` canonical và im lặng biến mất khỏi auto-inject** = đúng ca **S54 cwd-relative mis-land**. 🔴 **Tầng im lặng thứ hai: `git` MÙ thư mục rỗng (bài S122)** ⇒ `git status` KHÔNG bao giờ cho thấy 4 thư mục này; **chỉ `find` mới thấy**. 🟢 Chính tao **0 file ghi vào đó** — và "0 file" là bằng chứng, không phải lời khai. Tag `[s169, gate-fail-8, sandbox-long-trong-run-folder, git-mu-thu-muc-rong, 0-file-la-bang-chung]` +``` + +### 3.12 ⚠️ 7 lane S185 — **CHƯA soạn entry, chờ lead chốt PLACEMENT** (§2.5) + +Tao **KHÔNG** soạn sẵn 7 khối rồi để lead "chọn nhà sau" — làm thế là ép quyết-định bằng cách đã-viết-rồi. Vật liệu có sẵn để soạn ngay khi lead chốt (đã đọc verdict-line từng lane): +| lane | byte | verdict/trạng-thái tự khai | nhà đề-xuất (phương án a) | +|---|---:|---|---| +| lane1-detector | 27.465 | `CONTROL both-ok=True · FAULT-a1/a2/b=True` **(4/4)**; fault-inject **chỉ trên cây tạm `%TEMP%` qua `-RepoRoot`**, 0 inject vào repo thật | implementer-backend | +| lane2-tienkiem | 19.289 | `END` — C-1 siết spec F-3 | implementer-backend | +| lane3-doc-codify | 26.047 | **XONG** — 2 DONE (C-3,C-4) · 1 SKIP-có-khai (C-17); tự khai phép thử quét 21 tệp, **KHÔNG phủ** `.claude/commands/*` (19) + `.claude/agents/*` (27); *"1 dương/21 là số của LƯỢT NÀY, không phải tỉ lệ nền của kho"* | ctx-curator | +| lane4-report-hygiene | 23.715 | **XONG** — 4 DONE / 1 PARTIAL (C-15 thu-hẹp đúng acceptance) + đề-xuất C-23 mới | ctx-curator | +| lane5-measure | 27.979 | **XONG 4/4**; 🔴 bắt **tiền-đề C-17 STALE** (`vocab-alias-map.md` Đà TỒN TẠI 8.020 B mtime 07-22, trong khi checklist ghi "chưa tồn tại"); cảnh báo **2 tệp đang bị sửa song song lúc đo** ⇒ mọi số-dòng kèm mốc giờ | investigator-codebase | +| lane6-memory-gate | 24.268 | C-6 + C-10; bảng **ranh-giới TỪ CHỐI** rõ (CẤM nén tay `ring2`/`tooling` theo lệnh lead + `HANDOFF:40`; erratum gửi hub ⇒ lead) | harvest-curator | +| lane7-machine | 17.662 | C-12; *"7 khai-thiếu ở §2 là phần KHÔNG được cắt khi trích dẫn kết quả này"* | implementer-backend | + +--- + +## 4. GATE 5-trục + số cuối + +### 4.1 Năm trục + +| trục | verdict | căn cứ (lệnh/ref) | +|---|---|---| +| **Coverage** | ❌ **FAIL** | 26 lượt-vai có nội-dung đáng-harvest mà diary đích **0 entry** (§2.1). Đã kê **cả vai KHÔNG cần harvest + lý do** (§2.6) nên FAIL này là **có mẫu số**, không phải cảm giác. | +| **Completeness** | 🔶 **PARTIAL** | Nguồn đủ 4-field {task·verdict·learned·surprise} — 26/26 sub-file đều có **verdict tự khai** (đọc từ dòng-1 hoặc END-line). Nhưng **1 lượt thiếu field `learned` ở dạng dùng được**: `sub-opus-lane2-tienkiem` chỉ có `**END**` trần, không verdict-header (so với 6 lane anh em đều có) ⇒ lead soạn entry lane-2 phải đọc RUỘT, không lấy được từ header. | +| **Placement** | ❌ **FAIL** | (a) **7 lane S185 = 166.425 B KHÔNG CÓ NHÀ** (§2.5) — vai tự khai *"Opus 5 MAX"*, không tồn tại `agent-memory/opus-*`; (b) **7 tệp memory-proposal S180 mồ côi cứng** (§2.3, `file=0 cited-in=0` ×7); (c) 🟢 điểm sáng: `sub-n3-lane-f` **CỐ Ý từ chối** ghi vào `/.claude/agent-memory/reviewer/` để không đẻ stray-S54 — Placement được BẢO VỆ chủ động ít nhất 1 ca. | +| **Corruption** | ✅ **PASS** | `perl` byte-mode `\xEF\xBF\xBD` per-file trên **toàn `.claude/**/*.md`** → **24 hit / 11 file**, `rc=0`, **control-dương = 1** (thước sống). **KHỚP TUYỆT ĐỐI baseline S172 (24 hit/11 file)** ⇒ **0 corruption MỚI** suốt S173→S185. `iconv -f UTF-8 -t UTF-8` trên 3 run mới (S180-adap · S182-khkk · S185-email) = **0 file non-UTF8**. | +| **Fidelity** | ✅ **PASS (FLAG 0)** | Đối chiếu 3 số dẫn được: `74.070 B` trong entry reviewer S171 = 26.461+23.177+24.432 **khớp TỪNG BYTE** · `34.793 B` trong entry ctx-audit S169 = kích thước thật của `sub-ctx-audit-open-S169.md` · verdict 6 entry S180-bookend khớp verdict-line-1 của 6 sub-file. **0 dấu bịa ⇒ KHÔNG escalate `reviewer`.** | + +### 4.2 🔴 INFORM — "rank-2 mojibake 361-hit ở `runs/`" (brief nhắc detector C15) + +Tao **không phán detector sai**; tao **đo lại và tách thành phần**: +``` +perl … /\xC3\x83|\xC3\x86\xC2\xB0|\xC3\xA2\xE2\x82\xAC/ trên find runs -name "*.md" +→ rank2-FILES=503 HITS=1823 +tách: A("Ã")=1732 Uhorn("ư")=53 aeuro("â€")=38 +mẫu ngữ cảnh 4 hit đầu của "Ã": "**ĐÃ** tracked" · "NHÃN-HOÁ EXPLI" · "**ĐÃ** COMMIT" · "(`â€\"`, `×`, `â†`)" +``` +⇒ **95% (1732/1823) khối này là chữ Việt HỢP LỆ** (`ĐÃ`, `NHÃN`) — **đúng method #6 đã đúc @S126**: grep `Ã|ư|â€` = **FALSE-POSITIVE trên VN-UTF8**; tín hiệu THẬT = **U+FFFD + iconv**. Và hit thứ 4 là file **TRÍCH DẪN mojibake làm bằng chứng** = lớp **use⟂mention** (citation-trap) đã 4 đời. +🔸 Con số của tao (1823) ≠ con số C15 (361) vì **hai bên đếm hai thứ** (khác regex/mẫu-số/đơn-vị) — **không ai sai cho tới khi khai rõ đếm CÁI GÌ**. Đề nghị lead bắt C15 **in ra phạm-vi + đơn-vị thật vừa quét** trước khi ai dùng số này (đúng bài lane-F: *"máy in `[ok]` trên vùng nó chưa từng đọc"*). **KHÔNG dùng số rank-2 để phán corruption** — thước đã chốt là U+FFFD + iconv, và thước đó nói **SẠCH**. + +### 4.3 Số cuối + đối chiếu `576.255 B / 18-lượt` + +| đại lượng | số | +|---|---:| +| Vai có tên cần APPEND | **11** | +| Entry đề-xuất soạn SẴN | **16** (§3.1-§3.11) | +| + khối copy-nguyên | **7 tệp** memory-proposal (không distill) | +| + chờ chốt placement | **7 lane** S185 (đã có vật liệu, chưa soạn) | +| **Tổng lượt-vai phủ** | **26** | +| **Tổng BYTE nguồn** | **698.109 B** | + +**Chênh so với `576.255 B / 18-lượt` (đo @S182-open 08-07 23:54) — 4 nguyên nhân, cộng lại khớp:** +1. **−(một phần S182):** commit `7cc52421` @08-08 12:30 **đã APPEND entry S182 thật vào 15 vai** ⇒ phần lớn nợ S182 trong số cũ **đã trả**. +2. **+194.926 B mới:** run `2026-08-08-S182-khkk-awf-mirror-ncc` sinh SAU phép đo cũ (10 sub-file) — trong đó 64.339 còn nợ. +3. **+221.069 B mới:** run `2026-08-09-S185-email-adap-pipeline` (9 sub-file) — 166.425 còn nợ, và là **món nặng nhất** vì chưa có nhà. +4. **+247.551 B chưa từng vào bảng cũ:** trọn khối `S180-adap-upgrade-pack-phased` (6 lượt reviewer + 7 tệp proposal). Số cũ đếm S168/S169/S170/S171 mà **KHÔNG đếm khối này** ⇒ số cũ **under-count đúng cái lớp mà chính tao đã bị bắt @S173** (*gom từ BẢNG, không từ FOLDER*). 🔴 Lần này danh-sách lấy từ **`find runs/ -name "sub-*.md"` (GỐC)**, không từ bảng kỳ trước. +5. **−237.251 B:** 2 tệp `sleep-batchA/B-S170` **KHÔNG tính** (đã định-đoạt "nháp" @S182) — nếu tính vào thì con số sẽ phồng lên 935.360 và **sai bản chất**. + +### 4.4 Nợ-tiềm-tàng ngoài phạm vi lượt này (khai để lượt sau không tưởng là sạch) + +- `implementer-backend` **0 entry S164/S165** trong khi `sub-implbe-k2`(S164, 11.815 B) + `sub-implbe-k3`(S165, 7.949 B) tồn tại — **nằm ngoài cửa sổ mtime ≥ 08-01** nên tao không kê vào bảng nợ, nhưng **KHÔNG tuyên sạch**. +- Toàn bộ `runs/` trước 08-01 (**92 folder tổng**) chưa soi ở lượt này. +- `reviewer/MEMORY.md` 22.430 B > trần mềm 17,1 KB (vai tự khai nợ curate ở `MEMORY.md:86`) — APPEND 6 entry sẽ đẩy cao hơn ⇒ **đề nghị lead APPEND digest ở L1 + verbatim xuống `archive/2026-08.md`** trong CÙNG lượt. +- `harvest-curator/MEMORY.md` (tao) 26.139 B > trần đọc 24,4 KB ⇒ **self-compact DUE**. + +### 4.5 Tự-kiểm 2 lần (không tin số của chính mình) + +1. **Cộng lại BẰNG MÁY, đọc từ ĐĨA** (bài S182: *đo giỏi mà cộng sai +402 B*): +``` +stat -c '%s %n' <33 đường dẫn> | awk '{s+=$1;n++} END{print "N-FILE="n" TONG-BYTE="s}' +→ N-FILE=33 TONG-BYTE=698109 +``` +⇒ khớp số cộng tay. **33 tệp** (26 lượt-vai, trong đó khối `lane-memory-proposals/` = 8 tệp đếm-thành-1-lượt). +2. **Containment Harness-10 — `git status --porcelain` có 18 M + 2 ??, KHÔNG phải do tao.** Chứng bằng **mtime-chain, không bằng lời khai**: tệp không-phải-của-tao có mtime mới nhất = `.claude/commands/fable-clone.md` @**21:52:08**, trong khi run-folder của tao sinh @**21:54** và tệp duy nhất mang mtime sau mốc đó là chính artifact này. ⇒ **0 tracked-change ngoài `runs/2026-08-09-S185-bookend-close/`** do tao gây ra. Các thay đổi kia là công CHƯA COMMIT của 7 lane S185 + lead (7/7 lane tự khai *"KHÔNG commit — lead gom cuối"*) ⇒ **không phải vi-phạm containment**, nhưng **là lý do nữa để đóng nợ harvest 7 lane trước khi commit nuốt dấu vết**. +3. **G-015 — khai đúng giới hạn:** tao có `Bash` = **kênh ghi vẫn mở** ⇒ **KHÔNG tuyên "read-only enforced"**. Containment THẬT = lead single-writer + `git diff` + mtime-chain ở trên. + +--- + +**TRẠNG THÁI: XONG.** +END sub-harvest-curator S185 @close — `HARVEST-GOM: 11 vai / 16 entry + 7 tệp copy-nguyên + 7 lane chờ-placement / 698.109 B — GATE FAIL 2 trục (Coverage · Placement), Completeness PARTIAL, Corruption + Fidelity PASS` · propose-only · 0 Write/Edit ngoài file này · 0 `store_memory` · chờ lead VERIFY→APPEND (B3).