Files
solution-erp/.claude/workflows/runs/2026-07-25-S151-h24-open-bookend/sub-ring2-S151.md
pqhuy1987 1b85713bb6
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 5m38s
[CLAUDE] Docs: S151 closeout — bootstrap + trio-AUTO đầu tiên + gói 3-máy vá sống + bookend DEEP trả nợ JUMP (tally #53=53, AS-17 promote)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 20:13:25 +07:00

194 lines
18 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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`. ⇒ 2517 = **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).