# sub-ring2-audit — S151 KIỂM vòng soi-lead H24 (bookend @open, hình B)

- **Vai:** `ring2-audit` — vai-KIỂM ĐỘC-LẬP trên OUTPUT của cặp H24 (`lead-stale-auditor` + `lead-gap-auditor`). Tao KIỂM 2 con-đo; tao KHÔNG soi lead trực-tiếp.
- **PIN đích-danh:** `.claude/workflows/runs/2026-07-25-S151-h24-open-bookend/` (folder tươi, mtime 2026-07-25 17:38 — sub-lead-stale 14.636B · sub-lead-gap 18.740B). Pin CÓ THẬT ⇒ không NO-OP.
- **Nhịp:** AUTO sau cặp (owner @S146 "3 → auto", không consent-gate). Tuần-tự: mtime file này > 17:38.
- **Contract:** propose-only, INFORM-only, chỉ ghi ĐÚNG file này.
- **Trạng thái: DONE** (2026-07-25) — ghi-đĩa-trong-lúc-làm, anti-#53.

---

## §0 — PIN + fail-safe (nghĩa-vụ i)

| Kiểm | Kết quả |
|---|---|
| Folder pin tồn tại | ✅ 4 file: `run.md` 1.861B · `machine-baseline.md` 3.725B · `sub-lead-stale-S151.md` 14.636B · `sub-lead-gap-S151.md` 18.740B |
| Output H24 TƯƠI phiên này | ✅ mtime cả 2 sub = 2026-07-25 17:38; `date` lúc tao chạy = 17:41 ⇒ đúng thứ-tự C4b (tao SAU cặp) |
| Ruột có thật (không skeleton-#53) | ✅ cả 2 file có thân đầy đủ, có FLAG-header + evidence, KHÔNG rỗng |
| ⇒ | **CHẤM ĐƯỢC** — không NO-OP |

## §1 — Enum-check + khuôn FLAG-header (verify 2 con KHÔNG tự chế class)

Enum ĐÓNG `memory-budget.json → lead_self_audit.flag_classes` = **11 class** (5 `view-*` + 6 `gap-*`), tao đọc trực tiếp bằng `json.load`.

| # | file | class gán | ∈ enum? | khuôn `## FLAG-N — \`class\` — SEV` |
|---|---|---|---|---|
| S-1 | stale:11 | `view-stale-role-desc` | ✅ | ✅ |
| S-2 | stale:31 | `view-stale-count` | ✅ | ✅ |
| S-3 | stale:48 | `view-residual-asym` | ✅ | ✅ |
| S-4 | stale:69 | `view-stale-count` | ✅ | ✅ |
| S-5 | stale:84 | `view-residual-asym` | ✅ | ✅ |
| G-1 | gap:17 | `gap-carry-aged` | ✅ | ✅ |
| G-2 | gap:74 | `gap-decision-sunk` | ✅ | ✅ |
| G-3 | gap:104 | `gap-carry-dropped` | ✅ | ✅ |

⇒ **8/8 trong enum, 0 tự chế, 8/8 đúng khuôn header** (gốc-lỗi S148 "không gán class" KHÔNG tái-phát — phiên thứ 2 liên tiếp sạch).
Tự tái-dựng meta-count: `grep -c '^## FLAG-'` = **5** (stale) + **3** (gap) = **8**, khớp đề-bài. INFORM: 3 + 4 = 7.

🔸 Khai ranh của S-3: sub-stale tự khai (`:63`) rằng ca này "nằm ở rìa enum", chọn `view-residual-asym` và **đề-nghị mở rộng enum thay vì tự chế class**. Tao xác-nhận cách xử-lý này ĐÚNG contract (không tự chế); nhãn dùng vẫn ∈ enum ⇒ hợp-lệ.

---

## §2 — Verdict per-FLAG (nghĩa-vụ ii) — 5 FLAG `lead-stale-auditor`

### S-1 `view-stale-role-desc` MED — **ĐẠT**
- View `.claude/agents/README.md:249` tao đọc nguyên văn: *"⇒ **committed-state = 17 folder-có-MEMORY.md**, khớp"* + *"`ring1-audit/` đã có dir RỖNG từ spawn-probe S145"*. CÓ THẬT.
- Source tao tự đo **3 tuyến**: `ls -1 .claude/agent-memory/*/MEMORY.md | wc -l` = **20** · `git ls-files … | grep -c 'MEMORY.md$'` = **20** · `ls -la ring{1,2,4}-audit/` = cả 3 **CÓ** `MEMORY.md` (4.481B / 9.840B / 1.047B, **không** rỗng) và `git ls-files` liệt đủ 3 ⇒ đã COMMIT.
- `git log -1 -- ring{1,2,4}/MEMORY.md` = **`398d343`** — đúng sha sub-stale nêu.
- ⇒ lệch THẬT (17 vs 20) + mệnh-đề "dir RỖNG" SAI THẬT. **ĐẠT.**

### S-2 `view-stale-count` MED — **ĐẠT**
- View `.claude/commands/session-start.md:294` nguyên văn: *"verify collection `proj_solution_erp` còn sống (baseline ~3076 chunks)"*. CÓ THẬT, đúng số dòng.
- Đối-chứng khuôn-đúng cùng file: `:311` = *"Baseline hiện tại → `docs/STATUS.md` Tests row (canonical — B1, KHÔNG hard-count ở đây)"* — CÓ THẬT, và cách **đúng 17 dòng** như sub-stale nói (294→311). Lập-luận bất-đối-xứng-nội-bộ đứng vững.
- Canonical `docs/STATUS.md` row RAG chunks = **2441** — tao tự đọc, khớp.
- ⇒ **ĐẠT.** (số live 2447 tao verify riêng ở §4-b)

### S-3 `view-residual-asym` MED — **ĐẠT** (tự tái-dựng bằng git, không tin chữ)
- `git cat-file -t 977ba18` → `commit` ✅ (object còn sống local — đúng như sub-stale cảnh-báo)
- `git merge-base --is-ancestor 977ba18 HEAD` → **exit 1 = NOT-ancestor** ✅
- `git log -1 --format='%h %s' 977ba18` → *"[CLAUDE] Docs: S148 — session-model port form hub + /check-email 4 cửa + Sàn-3 dual-accept"* ✅
- `2448393`: `cat-file`=commit, `is-ancestor`→**exit 0 = YES**, cùng tiêu-đề, ngày `Fri Jul 24 18:03:16 2026` ✅
- ⇒ Cặp sha đúng y hệt mô-tả: STATUS neo vào sha **không reachable từ HEAD** trong khi bản thay-thế reachable tồn tại. **ĐẠT.**

### S-4 `view-stale-count` LOW — **ĐẠT**
- View `docs/HANDOFF.md:25` (trích an-toàn mega-line bằng `grep -oE '.{80}H24 deep.{200}'`): *"**H24 deep CHƯA tới hạn** (counter 24 − deep_at 17 = **7 < 15**, mốc ~32…)"*. CÓ THẬT.
- Source: `.session-counter.json` đọc bằng `utf-8-sig` → `counter = 25`. ⇒ 25−17 = **8**, không phải 7.
- SEV LOW hợp-lý (kết-luận "chưa tới hạn" không đổi) — sub-stale tự hạ SEV thay vì thổi. **ĐẠT.**
- 🔸 Ghi thêm (tao gặp lúc đo): file này **CÓ BOM** ⇒ `json.load(encoding='utf-8')` **ném JSONDecodeError**. Đây chính là vật-chứng độc-lập cho §tick-incident (format-fork BOM) mà G-2 dựa vào — tao chạm phải nó bằng tai-nạn, không phải chép lời ai.

### S-5 `view-residual-asym` LOW — **ĐẠT**
- View `.claude/agents/README.md:302` nguyên văn: *"**State (S38 — 2026-05-28):** 40 mig · 84 tables · ~223 endpoints · 53 FE pages · 130 test PASS · 53 gotchas · 27 memory · 6 skills · **7 sub-agents**"*. CÓ THẬT.
- Heading trên nó: tao `awk` quét mọi `^#` trong 270→302 ⇒ heading gần nhất = `:298 ## 🎯 Project tunings (SOLUTION_ERP)` — **xác-nhận** lập-luận "không phải mục lịch-sử".
- Luật tự-đặt `:285-287` CÓ THẬT nguyên văn: *"khi roster đổi **hoặc** số đo lệch >30% … cập nhật NGAY trong phiên đó"*, và ngay trên nó là câu *"Bảng này **đóng băng** từ thời roster 7 vai"* (§Cost-reality đã re-ground) ⇒ chân-dung sửa-một-phía đúng.
- Tao tự đối 9 trục vs `docs/STATUS.md`: mig 67 · tables 89 · endpoints ~253 · FE pages 68 · tests 532 · gotchas 83 · user-memory 31 · skills 6 · sub-agents 20 ⇒ **8/9 lệch, chỉ `skills 6` khớp** — đúng y con số "8/9" sub-stale khai. **ĐẠT.**

---

## §3 — Verdict per-FLAG — 3 FLAG `lead-gap-auditor`

### G-1 `gap-carry-aged` HIGH — **ĐẠT** (tái-dựng MẠNH NHẤT: tao viết lại detector, không đọc lời khai)
Thay vì tin bảng `sed/awk` của sub-gap, tao **re-implement độc-lập bằng Python** đúng 4 bước của `governance-detectors.ps1` (regex splitter → segment → `carryRx` → streak-break):

```
segs = 67 | carryLines = 20
carryLines[0] (6) = hook-vs-budget-cap · pull-warn-threshold · session-model-adopt ·
                    tools-whitelist-no-teeth · uat-s133-budget-freeze · uat-s134-luyke
carryLines[1] (6) = eval-thamquyen · g011-token-fork · jump-dai-frozen ·
                    tham-sau-6-ca · underfill-mau-so · veto-window-s149
INTERSECTION = []          STREAKS = tất cả 1        M=6 => flags = 0
```
⇒ Trùng **KHỚP TỪNG PHẦN TỬ** với 2 cột bảng sub-gap `:55-56`, và trùng `machine-baseline.md:18` ("20 carry-line, tất cả streak=1"). Cơ-chế `break` tại `:899-903` tao đọc tận mắt. Splitter khớp **67 lần** trên HANDOFF (`grep -oE 'NEXT (anh|em)' | wc -l` = 67), riêng **dòng 24 có 2 lần** ⇒ đúng vật-chứng cắt.

🔴 **Datum MỚI tao tìm được mà sub-gap KHÔNG báo** (mạnh hơn cả bảng của nó): so với artifact đĩa S150 (`sub-lead-gap-S150.md:175` — *"**67 logic-segment / 19 carry-line**"*) thì S151 = **67 segment / 20 carry-line**. **Số segment KHÔNG đổi, chỉ carry-line 19→20.** Đó chính xác là chữ-ký của "một segment trước đây 0-khoá nay có khoá" — tức cơ-chế sub-gap mô-tả (`:60`) được xác-nhận bằng **delta đo được**, không phải bằng suy-luận. **ĐẠT.**

### G-2 `gap-decision-sunk` MED-HIGH — **ĐẠT**
- Nguồn: tao tự parse `.session-counter.json` (`utf-8-sig`) → `history[]` **16 entry**, entry cuối `S151` chứa **nguyên văn**: *"DE-XUAT FIX (cho anh gat @S151): h24-signal-write.ps1 doi sang surgical-write cung khuon tick script HOAC tick script chap nhan ca 2 shape; khong fix thi MOI tick sau MOI bookend deu fail-loud."* ⇒ khoản chờ-owner CÓ THẬT, tự khai "cho anh gật" THẬT.
- Vắng-mặt: tao tự chạy 3 token × 6 bề-mặt bền ⇒ **18/18 ô = 0**; `grep -rilE` trên `docs/changelog/sessions/` + `.claude/sessions/` ⇒ **0 file**. Tái-dựng khớp 100% bảng `:82-91`.
- **ĐẠT.** (phép phủ-định xem F-2)

### G-3 `gap-carry-dropped` MED — **ĐẠT**
- Hứa: `docs/HANDOFF.md:25` tao trích được nguyên văn — *"**sub-class #53 mới (`ngược-#53` · `skeleton-ruột-rỗng`) theo dõi thêm 1 phiên → xét error-ledger row (2-strike)**"* ⇒ CÓ THẬT, đúng dòng, đúng chữ.
- Vắng: `run.md` = 0/0/0 · `machine-baseline.md` = 0/0/0 (3 token) · `error-ledger.md` = **0**. Khớp bảng `:113-118`.
- Leg-2 (H1/H2 skip): `session-start.md:174` = *"Đầu session: 2 monitor sub BÁO LẠI trạng-thái + **diff vs session trước** (floor Harness 1 H1.2 + H2.2)"* ✅ và `:178` = *"**Light session / hỏi-đáp → có thể skip; bug/feature/multi-agent/wave session → nên chạy.**"* ✅ — **hai dòng đúng y nguyên văn, đúng số dòng**. Phiên này là wave 4-task/3-sub ⇒ rơi vào vế "nên chạy", đúng như sub-gap lập-luận.
- **ĐẠT.**

---

## §4 — Falsify-log (nghĩa-vụ iii) — **5 phép**

**F-1 · BREAK thử G-1 ở chỗ yếu nhất: bảng lịch-sử 7/9/13 lấy từ DIARY của chính nó (self-report).**
Phép thử: đòi bằng-chứng ĐĨA độc-lập với diary. `grep -rn "uat-s134-luyke.*(7|streak)" .claude/workflows/runs/` ⇒ tìm thấy **3 artifact riêng biệt**: `S143/sub-lead-omission-2.md:69` (66 seg/19 carry-line, FIRE 7·9·13) · `S146/sub-lead-omission-S146.md:105` (7·9·13) · `S150/sub-lead-gap-S150.md:175` (67 seg/19 carry-line, 7·9·13). ⇒ **HELD** — bảng lịch-sử có nguồn đĩa, không phải trí-nhớ.

**F-2 · BREAK thử G-2: "0 hit" có thể chỉ vì CHỌN SAI TỪ KHOÁ.**
Phép thử: đổi tập token sang `signal-write|counter-tick|tick TAY|tick-tay` + cửa-sổ `.{60}…{80}` trên HANDOFF/STATUS/WAL/error-ledger. Hit tìm được: STATUS/HANDOFF liệt *"4 máy PS1 … `h24-signal-write` …"* (danh-sách máy land @S150) và *"tick CLEAN ×2 → counter **24**"* (thành-tích S150). ⇒ **không dòng nào** nói tới thất-bại/đề-xuất-fix S151. **HELD** — vắng-mặt là thật, không phải artefact của từ-khoá.

**F-3 · BREAK thử S-1: biết đâu 3 dir ring RỖNG thật như view nói (view đúng, FLAG oan).**
Phép thử: `ls -la` từng dir + `git ls-files`. Kết quả: `ring1-audit/MEMORY.md` **4.481B** · `ring2-audit/` **9.840B** · `ring4-audit/` **1.047B**, cả 3 **git-tracked**. ⇒ mệnh-đề "dir RỖNG" **BROKE**; FLAG **HELD**.

**F-4 · BREAK thử S-3: sha `977ba18` có thể vẫn reachable qua ref khác (FLAG oan).**
Phép thử: `cat-file -t` = `commit` (còn sống) **nhưng** `merge-base --is-ancestor 977ba18 HEAD` **exit 1**; đối-chứng dương-tính `2448393` **exit 0**. Hai chiều đều đúng ⇒ **HELD**. (Đây đúng cái bẫy sub-stale cảnh-báo: phép kiểm "có tồn tại" xanh trong khi phép kiểm "reachable" đỏ.)

**F-5 · thách-CLEAN — xem §6, kết-quả BROKE.**

---

## §5 — Tự tái-dựng số CÓ-THỂ-SAI (nghĩa-vụ iv, phần a) — **3 số**

**(a) meta-count FLAG.** `grep -c '^## FLAG-'` = 5 + 3 = **8** — khớp TOTAL 2 con khai (5+3) và khớp đề-bài. INFORM 3+4 = 7, khớp.

**(b) toàn-bộ output H24-2 (số load-bearing nhất phiên này).** Re-implement độc-lập ⇒ 67 seg / 20 carry-line / streak≡1 / 0 flag — khớp máy **và** khớp sub-gap. Kèm delta 19→20 carry-line vs 67→67 segment (§3 G-1) = corroboration tao tự sinh.

**(c) `class_repeat.counts` vs fired-list.** Tao parse tươi:
`view-stale-role-desc 2` ✅(1→2) · `view-stale-count 3` ✅(2→3) · `view-residual-asym 3` ✅(2→3) · `gap-carry-aged 2` ✅(1→2) · `gap-decision-sunk 5` ✅(4→5) · `gap-carry-dropped 5` ✅(4→5) · held: `view-stale-status 3` · `view-stale-header 1` · `gap-owner-specifics 5` · `gap-incident-unrecorded 1`.
⇒ **6 fire + 4 frozen-held khớp tuyệt-đối** đề-bài. `_frozen_until_owner` vẫn nằm ở tầng `class_repeat` (ngoài `counts`), `counts` chỉ chứa số ⇒ invariant S150 còn nguyên.
🔴 **Nhưng `counts` chỉ có 10 key trong khi enum 11 class** — thiếu **`gap-underfill`** (xem D-2).

---

## §6 — thách-CLEAN (nghĩa-vụ iv, phần b) — **BROKE 1 dòng VERIFIED-CLEAN**

Sub-stale `INFORM-3` khai 8 trục CLEAN. Tao chọn trục **rủi-ro nhất** = *"Dư-lượng rename 5 vai trên bề-mặt HIỆN-HÀNH … hit còn lại **CHỈ** ở: `ACTIVE-MARKS:23,:44`, `.session-counter.json:24,35,37`, `_context-s-3.md:44` ⇒ **0 residue mới**"* — vì đó là **danh-sách ĐÓNG** (dạng dễ sai nhất) và là trục con-đo tự tuyên sạch.

Tao chạy lại bằng **lệnh KHÁC** (ripgrep, `glob=!**/runs/**`) cùng 5 token:

| file | dòng có hit | trong danh-sách khai? |
|---|---|---|
| `docs/HANDOFF.md` | **11, 13, 17, 20, 23, 24, 84** | ❌ KHÔNG nêu |
| `docs/STATUS.md` | **448, 452, 480, 591** | ❌ KHÔNG nêu |
| `.claude/governance/ACTIVE-MARKS.md` | 23, **25**, 28, 44 | một phần (thiếu :25) |
| `.claude/governance/.session-counter.json` | **36, 49, 51, 107, 117, 122** | ❌ số dòng khai (:24,35,37) **không khớp đĩa** |
| `docs/governance/error-ledger.md` | **59, 87, 98, 99, 100** | ❌ KHÔNG nêu |
| `docs/governance/adap-requests/…r5….md` | **117** | ❌ KHÔNG nêu |
| `.claude/auto-memory/feedback_citation_trap_selfreference.md` | **12** | ❌ KHÔNG nêu |
| `.claude/auto-memory/feedback_agent_return_garble_recover.md` | **13, 15** | ❌ KHÔNG nêu |

⇒ **≥8 file** có hit, trong khi danh-sách khai chỉ nêu **3 file**; và số dòng cho `.session-counter.json` **không tái-dựng được**.

🔸 **Phán công-bằng, KHÔNG vu-oan:** phần lớn hit thừa **đúng là** attribution/lịch-sử hợp-lệ (vd `HANDOFF:20` = *"H24 `lead-omission-auditor` bắt @S146"* — kể chuyện quá-khứ; `error-ledger` = biên-bản sự-cố). Nên **KẾT-LUẬN "0 residue mới" nhiều khả năng vẫn đúng**. Cái **BROKE** là **bằng-chứng**, không nhất-thiết là kết-luận: dòng CLEAN được trình bày như **liệt-kê vét-cạn có neo dòng**, mà liệt-kê đó **không vét cạn** và **neo dòng sai** ⇒ người sau tin nó rồi bỏ qua **6 dòng nằm ngay trong segment HIỆN-HÀNH `HANDOFF:1-25`** — đúng bề-mặt vai này chịu trách-nhiệm soi.
⇒ Ghi **M-1 (S151)**: dòng VERIFIED-CLEAN *"dư-lượng rename"* = **KHÔNG TÁI-DỰNG ĐƯỢC NHƯ KHAI**, phải hạ xuống "đã soi, chưa vét cạn" hoặc dán kèm lệnh sinh.

*(Tao cũng đã kiểm chéo 1 trục CLEAN khác và nó ĐỨNG: `STATUS:452` Sub-agents=20 — tao đọc row = **20** và roster đĩa `ring{1,2,4}` đủ 3 diary ⇒ khớp. Không tạo báo-động giả.)*

---

## §7 — 2 khuyết-tật NGOÀI FLAG (8/8 ĐẠT ≠ 2 con hoàn-hảo)

**D-1 · sub-gap trỏ SAI số dòng source ở 4/6 chỗ (mechanism vẫn ĐÚNG).**
| sub-gap khai | đĩa THẬT |
|---|---|
| `:800-801` contract M-consecutive | **:801** ✅ |
| `:877` `$marks = [regex]::Matches(...)` | **:875** ❌ |
| `:878-882` dựng segment | **:877-881** ❌ |
| `:887` `if ($ks.Count -gt 0)` | **:890** ❌ |
| `:899-903` vòng streak/break | **:899-903** ✅ |
| `:914` `[ok] carry … streak=` | **:913** ❌ |
Lệch **không đồng đều** (−2, −1, +3, −1) ⇒ không phải offset toàn-file, mà là trỏ ước-chừng. Hậu-quả: người vá đi theo số dòng sẽ sửa **nhầm dòng** trên đúng file `.ps1` đang gánh thước tuổi-carry. (Nội-dung trích **đúng nguyên văn** ⇒ tao KHÔNG phán "bịa"; phán "neo không dùng trực-tiếp được".)

**D-2 · `gap-underfill` KHÔNG CÓ row trong `class_repeat.counts` — cả 2 con-đo đều không nêu.**
Enum 11 class, `counts` **10 key**. Class vắng đúng là class mà sub-gap `INFORM-2` vừa chứng-minh **bất-khả-đo theo cấu-trúc tại bookend @open** (§2.1.6 %-print ở Phase 3, cặp spawn ở §2.1.8 Phase 2). Ghép 2 sự-thật: class này vừa **không đo được ở mọi lượt @open**, vừa **không có ô để hiện số 0** ⇒ nó **vô-hình hai lần**. Sub-gap có nêu vế đầu (tốt), nhưng khi liệt tally `:172` nó điểm danh `gap-owner-specifics`/`gap-incident-unrecorded` mà **bỏ qua** việc `gap-underfill` thậm chí không tồn tại trong sổ. Đây là khe **giữa** 2 vai + máy, không thuộc riêng ai ⇒ escalate lead.

---

## TOTAL

**VERDICT: 8 ĐẠT · 0 TRƯỢT · 0 KHÔNG-CHẠM-ĐƯỢC** trên 8 FLAG (5 stale + 3 gap).
- Enum-check **8/8 hợp-lệ**, khuôn header **8/8 đúng** ⇒ gốc-lỗi S148 (không gán class) **không tái-phát**, phiên thứ 2 liên tiếp.
- Falsify **5 phép**: HELD ×4 (F-1 lịch-sử-7/9/13 · F-2 vắng-mặt-thật · F-3 dir-RỖNG BROKE⇒FLAG HELD · F-4 sha-not-ancestor), BROKE ×1 (F-5 thách-CLEAN).
- Tái-dựng **3 số**: meta-count 8 · toàn-bộ output H24-2 (67/20/streak≡1/0-flag, re-implement độc-lập) · `class_repeat` 6-fire+4-held khớp tuyệt-đối.
- **1 CLEAN bị BROKE (M-1)** + **2 khuyết-tật ngoài FLAG (D-1 neo-dòng sai ×4, D-2 `gap-underfill` không có row)**.
- Chất-lượng chứng-cứ 2 con: sub-gap **dán được lệnh/khối trích ⇒ tao tái-dựng 100%**; sub-stale mọi FLAG đều neo file:dòng kiểm được ⇒ 5/5 ĐẠT — **nhưng** phần INFORM CLEAN của nó là chỗ duy-nhất không kèm lệnh, và đúng chỗ đó vỡ. Lặp lại bài S150: **số/danh-sách không kèm lệnh = không kiểm được**.

**Trạng thái: DONE** (2026-07-25).


