# S123 (2026-07-15) — Citation-trap guard + H24-3 + DUAL-ACCEPT + luật retire-legacy **Lead:** Opus 4.8 (owner-choice, KHÔNG outage — flip-9 tiếp) · **HMW-mode:** ON · **Scope:** governance-only (0 prod-code · 0 mig · 0 FE · test 509 giữ) **Mark MỚI:** `RC-pqhuy1987-15-07-2026-17-23-10` (Active-High · supersede-**partial** `RC-pqhuy1987-15-07-2026-15-32-20` điều-khoản (2)) **Spawn:** 🟫 tooling-auditor · ⬜ harvest-curator · 🟥 reviewer (3 vai, **0 workflow** — đúng §0.5 *governance-authoring single-writer → solo*) --- ## 1. Bootstrap — ALL-GREEN | | | |---|---| | WAL | ✅ SẠCH — Sàn-3 **4/4 tín-hiệu MẠNH im** (0 orphan · 0 non-`wal:` chưa đẩy · 0 `closing:` treo · 0 `wal:` đụng `runs/`) | | Tests | **509 PASS** (45 Domain + 464 Infra), 0 fail/skip — chạy thật | | Detector | **46** (15 derived-stale + 24 wikilink + 3 vocab-fork + 4 title-stale + 0 carry-age) | | H17 spec-audit | **GAP = none** (A1·A2·A3·B1·B2·HCV) — A1 xác nhận **14 sub-agent** ở tầng tool-scope | | RAG | `proj_solution_erp` **2440 chunks**, `last_indexed 05-29` (stale đã biết) | | H24 counter | TICK **1→2** (content-addressed, HEAD `cefb183`; reachability PASS) · `light 2/6 · deep 2/15 · OVERDUE none` | | Registry-probe §0.6b | **SKIP đúng** — roster không đổi từ S122 | **Sleep-check:** `last_sleep 2026-07-10` = 5 ngày < 7 ⇒ skip. **Monthly:** kế 2026-08-01 ⇒ n/a. ## 2. Bootstrap tự bắt 3 dương-giả cùng MỘT lớp cấu-trúc `lead-view-auditor:45` · `adap-report…h24…:78` · `reinject-ledger.md:11,28` — **cả 3 bị bắt vì chúng ĐỊNH-NGHĨA chính cái mẫu đang bị dò.** 🔴 **Ca `reinject-ledger` suýt thành việc-ma:** `§2.1.7` bảo grep `status=escalated` → grep trả **2** → nhưng cả 2 hit nằm ở **phần định-nghĩa schema** (`:11` luật · `:28` ví-dụ); bảng ledger thật (`:34`) = **RỖNG**. Tin số 2 ⇒ bịa 2 quyết-định không tồn-tại để hỏi anh. 🔴 **Guard chống bẫy này CHỈ CÓ Ở MỘT CHỖ:** `governance-detectors.ps1:670-673` — H24-2 **cố ý** loại `<` khỏi charset, comment ghi rõ *"a detector that flags the sentence DEFINING its own pattern is the self-reference trap"*. Nhưng **H24-1 trong CÙNG file script không có**, và cổng `reinject-ledger` ở session-start cũng không. ## 3. Monitor RE-REPORT — cả 2 bắt lỗi THẬT của lead **🟫 H1 (ALL-4 PASS · 1 MED · 2 LOW):** - 🔴 **MED — G-015 overclaim ở đúng 2 vai soi-LEAD:** `lead-view-auditor.md:77` + `lead-omission-auditor.md:68` khai *"KHÔNG Write/Edit/commit (mày không có tool đó)"* nhưng `:6` có **`Bash`** ⇒ `git commit` làm được ⇒ **sai với `commit`**. 5 vai anh em CÓ caveat G-015 (`tooling-auditor:55` viết thẳng nguyên-tắc), 2 vai mới **thiếu**. *(Lead verify: `:48` khớp "residual" chỉ vì tên class `view-residual-asym` — grep của lead mới là cái ẩu.)* - **15/15 derived-stale = FALSE-POSITIVE** (ratio-band làm đúng) ⇒ **đừng vá**. - **+1 delta 45→46 giải-thích xong:** 45 đo tại **W4 `a09dcae`**, không phải lúc đóng phiên; adap-report H24 land ở `6dcd457` (W6) bị bắt vì **trích lại ví-dụ về dương-giả**. **⬜ H2 (MOSTLY-CLEAN · 0 data-loss/0 orphan/0 corruption · 1 coverage-gap + 2 placement):** - 🔴 **Bắt lỗi lead: mẫu-số "25" ≠ 26.** *"**Mẫu-số có NGÀY-ĐO** — hỏi 'đếm LÚC NÀO' trước khi so. **Verdict khớp ≠ mẫu-số khớp**"*. Gốc: 25 đóng băng @`48e0d26`@11:48; `22ea8c5`@14:28 — **chính việc đo** — đẻ thêm folder ⇒ mẫu-số tự lỗi-thời. Lead đo lại: **28 folder, 26 có `run.md`**. - 🔴 **dạng-3 = DEAD CODE** — bỏ nó ⇒ **0 folder** thành orphan (6 folder embedded đều đã có flat). - 🔴 **`tiep.md:66` STALE-AT-BIRTH** — khai `pe-negative-quote` *"chưa xử"* mà `22ea8c5`@14:28 đã xử, còn câu đó viết @`dfa3dae`@**14:48 = SAU 20 phút**. - **MED-3:** reviewer chạy **5 spawn** ở wave S119/S122 mà ghi **0 dòng** diary. *(→ trả giá THẬT vài giờ sau, xem §6.)* - **3 dir RỖNG git mù:** 2 vai H24 **chưa seed diary** + **1 stray mis-land** `runs/…S119…/.claude/agent-memory/reviewer` (lớp S54). ## 4. Bốn việc anh chốt — thực-thi + đo ### (1) Backtick-guard cho H24-1 **Discriminator = ENCLOSURE, không phải hình-dạng.** Anchor trong `` `…` `` = đang **được NHẮC TỚI** (mention), không phải **được TUYÊN BỐ** (use). Đếm backtick trái match; **LẺ ⇒ skip**. 🔴 **KHÔNG port được cơ-chế H24-2:** guard `[carry:]` ăn nhờ ký-tự `<` mà key thật không bao giờ có. Ở anchor thì **ví-dụ byte-identical với claim** — *giống hệt CHÍNH LÀ điểm của ví-dụ tốt* ⇒ phải đổi TRỤC. **Từ chối chồng head-N-lines** (dù cũng 5/5): vị-trí = **proxy**; backtick đã tách đúng cùng tập ⇒ chồng proxy = 0 lợi + đẻ điểm mù mới. Viện mark `RC-…10-29-11`. **Fault-inject 5/5** — 2 anti-Goodhart: quoted-rồi-bare **cùng dòng** → FLAG anchor thật `2026-02-02` (chứng `Matches` ≠ `Match`) · backtick **CHẴN** → FLAG (chứng odd/even ≠ "có backtick thì bỏ"). ### (2) Detector MỚI H24-3 session-label lag (MED) So `(S` ở `**Last updated**` với **MAX** `(S` ở heading, **cùng file**. Bắt `STATUS:6` = **âm-giả CHỨNG-MINH-ĐƯỢC** của H24-1 (nó so NGÀY, mà `2026-07-15` = mới nhất ⇒ 0 flag; đo: S119 ×3 hit, S120/S121/S122 = **0 hit**). **Tái-phát lần 4** (S116/S117/S118) — 3 lần trước vá bằng **bump số** ⇒ quay lại. **Fault-inject 6/6** — anti-Goodhart: **MAX không đứng đầu/cuối** (S110·S122·S117) → lấy đúng S122; 2 bản cài sai *"lấy đầu"*/*"lấy cuối"* **đều PASS trên repo thật** vì ở đó MAX tình cờ đứng đầu. ### (3) Retire dạng-3 → DUAL-ACCEPT **Đo trước khi gỡ (2 phép độc-lập, khớp):** 0 folder thành orphan; 6 folder từng dựa đều có flat sau `22ea8c5`. **Fault-inject 7/7** gồm ca chốt `## Synthesis`-no-flat: **S122 IM → S123 FLAG** = hiệu-lực retire. Repo thật **0 orphan/26**. ### (4) `tiep.md:66` + chú-thích mark Giữ lập-luận (dạng-4 = kẽ CÒN LẠI **vẫn đúng**), gỡ literal đã chết. Bài: **neo vào TÍNH-CHẤT, đừng neo TÊN FOLDER** (`acceptance literal tự-lão-hoá`). Thân mark **0 chữ bị sửa** (P4/P8). **🔴 Sweep `view-residual-asym` (lead suýt tự đẻ đúng lỗi đang vá):** đổi thân `tiep.md` sang DUAL-ACCEPT xong thì **frontmatter vẫn ghi TRI-ACCEPT**, và `workflows/README.md:21` còn nói *"nhận **BA dạng, KHÔNG phải hai**"* — sau thay đổi thì thành **hai**, mà doc đang nhấn mạnh *không phải hai*. Sửa **6 bề-mặt LUẬT** (`tiep.md` frontmatter+`:31`+§0 · `workflows/README` · `session-end` ×5 · `session-start:79`); **đóng băng CÓ CHỦ-ĐÍCH** (lịch-sử, đúng tại thời-điểm ghi): `runs/**` · session-log S122 · adap-report · broadcast đã gửi · narrative STATUS/HANDOFF. ## 5. 🟥 Reviewer PASS_WITH_FIXES — tìm ra 6 lỗi thật, lead verify 4/4 độc-lập | # | Finding | Lead verify | |---|---|---| | **1** | 🔴 **H24-3 lặp ĐÚNG bẫy mà cùng diff vừa vá (gen-2)** — trigger canonical = **chính adap-report S123 mô-tả H24-3** | ✅ | | **2** | 🔴 **greedy `.*` lấy `(S` CUỐI ≠ MAX** — `## Tong hop (S122…) va lich su (S110…)` → **S110** | ✅ đo thật | | **3** | 🔴 **MAJOR — lý-do retire áp cho dạng-2 thì GIẾT C8** (5 folder S71 thành orphan ⇒ ép rewrite history mà C8 cấm) | ✅ | | **4** | 🔴 **"retire HOÀN-THÀNH mark" = NGUỴ-BIỆN** — điều-khoản (2) **cố ý tách** lưới-rộng ⟂ luật-hẹp; retire **thu lưới bằng luật** = biến nhận **=** cho-phép = **NGƯỢC** | ✅ rút lại | | **5** | 🔴 **"5/5" = 4/4** — `permission-matrix:16` **không còn fire** (anchor đổi format, khớp 0 pattern) | ✅ `pattern1=False pattern2=False` | | **6** | `node_modules/*.md` (30 file) nằm trong `$GovMd` — cùng lớp hiểm-hoạ lead tự ghi ở `:495-503` | ✅ vá | **✅ Chống được soi:** 46→45 tái-hiện · fenced **"0 ca" ĐÚNG** (383 file, 6 anchor, 0 in-fence) · `Matches`-not-`Match` **cần thật** · retire 0-orphan/26/5-dạng-2 **khớp từng số** · **7/7 fault-inject TỰ tái-hiện** · **Q8 ENDORSE không-bump**. **🔴 LUẬT retire (phát-biểu ĐÚNG, thay bản sai):** *gỡ nhánh legacy khi **tập di-sản RỖNG**; giữ khi **CÒN người thụ-hưởng**. Miễn-trừ C8 hết hiệu-lực đúng lúc hết di-sản để tha.* **Fault-inject 2 trục reviewer chỉ ra CHƯA HỀ THỬ: 6/6** — quoted-label→IM (gen-2 fix) · 2-số-cùng-dòng→MAX cả 2 chiều · heading trích `` `(S999)` ``→bỏ qua (guard phải ở **CẢ HAI phía**, không chỉ label). ## 6. #53 garble ×4 / 3 agent — và bài học nó dạy | Agent | tool_uses | Đĩa cứu? | |---|---|---| | 🟫 tooling-auditor | 31 / 112K | ❌ → **resume** ✅ | | ⬜ harvest-curator | 29 / 120K | ✅ **diary có 2 bài học S123** → đọc thẳng đĩa | | 🟥 reviewer ×2 | 29/140K → 54/208K | ❌ lần 1 → **resume** → ✅ lần 2 **vớt được từ đĩa** | 🔴 **Vòng khép trong 1 phiên:** reviewer **tự rút luật *"ghi diary TRƯỚC return"*** từ lần garble đầu, tự áp, và **nhờ đúng luật đó mà lần garble thứ 2 vớt được**. Nó tự ghi: *"#53 garble ×1 ở CHÍNH TAO; đĩa KHÔNG cứu được vì chưa ghi diary ⇒ **H2 MED-3 trả giá THẬT**"* — đúng cái finding H2 bắt sáng cùng ngày. 🔴 **Prompt-đúng KHÔNG chặn được #53:** lead cấm bẫy *"return trước, làm sau"* ngay từ prompt đầu cho **cả 3**, **cả 3 vẫn garble**. Chặn được là nhờ **ghi-đĩa-trong-lúc-làm** + **resume in-session** — không nhờ nhắc-nhở. 🔸 `git status` **không có file lạ nào** từ 3 sub ⇒ containment G-015 giữ (chúng đề-xuất, lead single-writer). ## 7. 🔴 Lead sai 4 ca — TRỌN ở trục đếm-về-mình 1. **"0 orphan / 25 run"** — thật **26**; chép từ narrative STATUS, không đo. Verdict đúng (vòng lặp quét đĩa) nhưng **mẫu-số bịa**. H2 bắt. 2. **"5/5 separation"** viết vào code-comment — đĩa đỡ **4/4**; **chép số của sub**, không kiểm ca-5. Reviewer bắt. 3. **"7/7 PASS"** viết vào doc **TRƯỚC khi chạy** fault-inject. Chạy sau thì đúng — nhưng *"thiết-kế để pass" ≠ "đã verify pass"*. Lead tự bắt trước commit. 4. **"MED vì 0 proxy"** — sai; `$labelN` = hit-regex-ĐẦU = **chính là proxy**. Reviewer bắt. ⇒ Khớp `feedback_meta_count_selfcoverage_blindspot`: **lead ĐO tốt, ĐẾM-VỀ-MÌNH thì sai**. File đó **tự nạp vào context đầu phiên** mà lead **vẫn mắc ngay ở báo cáo đầu tiên** ⇒ củng cố: **bài-học nằm-trong-context KHÔNG tự bật; chặn được = LUẬT soi-được**. ## 8. Outward — đính chính hub - **Addendum R5** (thân §1–§5 giữ **0 chữ**, audit-trail): 🔴 *"ĐỪNG adopt TRI-ACCEPT"* — SE đã retire dạng-3; **TRI-ACCEPT là trạng-thái QUÁ-ĐỘ, không phải đích** (SE chạy ~1 ngày rồi gỡ). Thay bằng **LUẬT RETIRE LEGACY**. + 2 cảnh-báo fleet (citation-trap 3 đời · **Goodhart rời-tập-đo**) + 2 bài phương-pháp (*"trục nào KHÔNG có ca nào?"* · *"áp luật cho nhánh anh em — vỡ thì LUẬT sai"*) + **dự-báo falsifiable** để hub kiểm chéo. - **Email `ed3786a10f12`** (`type: fix` · `category: Governance`) — **selftest-stamp MATCH ×2** (re-stamp sau khi sửa frontmatter: body-hash không đổi, đúng thiết-kế canonical). `to = ai_infra` ⇒ **không cần infra-CC** (bước 6b chỉ khi `to ≠ ai_infra`). - 🔴 **`_index` reconcile — gap thật:** `outbox/ai_infra/` có **3 file 07-15** mà `_index` **0 row** ⇒ **2 email S122 đã gửi mà chưa log** (S122 chạy tới 6c rồi bỏ bước 7). Hash lấy **từ frontmatter trên đĩa**, không tính lại. **Bài: `_index` là sổ hub/audit đọc — gửi mà không log = hub không biết có nó; bước 7 phải cùng lượt với 6c.** ## 9. Còn nợ (khai thẳng) - 🔴 **`STATUS:6` CỐ Ý chưa bump — H24-3 đang FLAG, GIỮ cho hiện ra.** Bump = **nói dối kiểu khác** (mega-line **0 hit S122**). Fix đúng = **bỏ nhãn phiên (B1 collapse)** — dính carry **re-tier mega-line rơi sổ từ S95** (28 phiên, **không có tag** nên carry-age vĩnh-viễn không thấy). Nó cũng là thứ làm **lead không đọc nổi HANDOFF** (`:5` = 55.447 ch > cap Read 25K/call) ⇒ lead phải grep mò suốt phiên. - 2 vai H24 **chưa chạy lần nào** (nhịp ~S128) · **H23 precedence CHỜ lead=Fable** (lead=Opus không phân-biệt được) · **dạng-4 orphan = kẽ CÒN LẠI** · 3 dir rỗng git-mù (2 vai H24 chưa seed + 1 stray S54).