# TOOLING-AUDITOR — S192 bookend @open (phiên-LOGIC L16) — 2026-08-13

> **VERDICT (dòng-1, artifact-first chống #53):** `TOOLING-AUDITOR: PASS_WITH_FLAGS — 7 finding` (① 2 · ② 0 · ③ 1 · ④ 4 | 2 HIGH · 3 MED · 2 LOW) + 7 BÁC dương-giả + 1 INFORM. Chi tiết §VERDICT cuối file.
> Vai: H1 tooling-freshness 4-mặt · read-only · **propose-only** (lead = single-writer mọi bề mặt khác).
> Nền số-sống lead giao: Mig **73** · tables **97** · test **697** (45D+652I) · gotcha **92** · menu-keys **120** · policies **480** · Sub-agents canonical **29** · RAG `solution_erp` 2450 chunk / indexed 2026-05-29 · counter H24 **66** · detectors TOTAL **58** + INFORM **29**.
> Phiên trước = S191 (2026-08-12→13). HEAD @open = `05ddefbd`.

---

## MẶT ② — VAI-TRÒ SUB-AGENT (đo TRƯỚC vì rẻ + là neo cho ①/④)

### Phép đo đĩa (canonical)
```
ls -1 .claude/agents/*.md | grep -v README | wc -l   → 29
ls -1 .claude/agents/*.md | wc -l                    → 30   (bẫy glob: +README.md)
```
**Roster ĐĨA = 29.** (Bẫy glob thô ra 30 — `agents/README.md:6` đã khắc đúng cảnh báo này.)

### Đối chiếu 6 bề-mặt — KHỚP 6/6

| # | Bề mặt | Giá trị | Ref | Khớp |
|---|---|---|---|---|
| 1 | Đĩa `.claude/agents/*.md` −README | **29** | disk | ✅ |
| 2 | `VALID_ROLES` (`.claude/workflows/hmw.js:22-60`) | **32** phần tử = **29 vai** + 3 lens `view`/`omission`/`derived-staleness` | `hmw.js:22-60` | ✅ (set-diff: 0 vai đĩa vắng mặt) |
| 3 | `.claude/agent-memory/*/` | **29** dir, `comm -3` vs đĩa = **RỖNG 2 chiều** | disk | ✅ |
| 4 | `docs/STATUS.md` §Sub-agents (ô canonical) | **29** | `docs/STATUS.md:481` | ✅ |
| 5 | `agents/README.md` enumeration "Roster THẬT" | 7 core + **22** tên = **29**, đã BỎ SỐ @S188 | `.claude/agents/README.md:27` | ✅ |
| 6 | Skill-matrix table | **29 row**, `comm` 2 chiều **RỖNG** | `.claude/agents/README.md:194-222` | ✅ |

🔸 **KHÔNG khai "6 bề-mặt độc-lập"** — (1)&(3) đồng-biến một phần (tạo vai thường kèm tạo dir memory). Độc-lập thật = đĩa + **4 nguồn tay-nuôi** (bài S180 ring1 bác).

### Frontmatter — 29/29 SẠCH cả 3 khoá
```
grep -l "^model: opus"    → 29
grep -l "^effort: max"    → 29
grep -l "^memory: project"→ 29
```
Vòng lặp per-file: **0 vai MISS** bất kỳ khoá nào. (Nợ `effort` sinh @S181 + nợ matrix 26/28 sinh @S182 **vẫn đóng**.)

### Diff vs S191
- **THÊM/XÓA vai: 0.** Roster 29 giữ nguyên qua L15→L16.
- **Mặt ② SẠCH 6/6 — phiên thứ 3 liên tiếp** (S189 · S191 · S192).
- 0 vai idle-flag mới; 0 scope-drift phát hiện ở lượt này.

**MẶT ② = PASS (0 finding).**

---

## MẶT ① — SKILL

### Inventory (đo đĩa)
- **Project `.claude/skills/`: 6** — `contract-workflow` (27.860B, sửa 2026-08-11) · `dependency-audit-erp` (5.598B, **sửa 2026-08-13 = S191 closeout**) · `ef-core-migration` (37.449B, 2026-08-07) · `form-engine` (5.450B, **2026-04-30 — cũ nhất, 105 ngày**) · `iis-deploy-runbook` (16.683B, 2026-08-11) · `permission-matrix` (9.409B, 2026-07-31). Khớp `docs/STATUS.md` row `Skills | 6`.
- **Standalone `~/.claude/skills/`: 23** — 0 delta vs S189/S191.
- **Command `.claude/commands/`: 20** — 0 delta vs S189 (`day.md` đã đếm từ S189).
- **THÊM/ĐỔI/XÓA skill phiên này: 0 THÊM · 1 ĐỔI (`dependency-audit-erp`) · 0 XÓA.**

### F-A (MEDIUM) — `skills/README.md:20` vẫn chép mệnh-đề ĐÃ BỊ BÁC @S181 (site sống qua S182 → S186 → nay)
```
:20 | `ef-core-migration` | … migration history (mới nhất → row cuối bảng skill; số → `docs/STATUS.md`)
     … ✅ Updated S168 (`ff7f655`) · nội-dung tới row Mig cuối hiện hành — soát @S172 …
```
- Canonical `.claude/skills/ef-core-migration/SKILL.md:25` đã khắc NGƯỢC LẠI: *"Câu cũ ở dòng này ghi **'mới nhất = row cuối bảng'** — SAI và tự mâu thuẫn… Bảng dưới **chỉ để tra lịch sử**; nó **sẽ luôn tụt sau** và điều đó **hợp lệ**."*
- Đo đĩa: bảng trong SKILL dừng ở **Mig 71** (`:99`), đĩa = **73**. ⇒ 2 mệnh-đề của `:20` đều sai: (a) "mới nhất → row cuối bảng" đã bị chính skill bác; (b) "nội-dung tới row Mig cuối **hiện hành**" = **tự nhận là ảnh HIỆN-TẠI** (không có neo phiên) ⇒ stale THẬT, khác lớp bản-ghi-đông-lạnh.
- Git: dòng này chạm lần cuối `3a6eb92c` (S172) — **chưa từng được vá** dù đã flag @S182 và @S186. Đây là site **thứ 3 cùng-lớp** "claim chép nhiều site" trong cụm skill.
- **Đề-xuất (lead quyết):** đổi `:20` thành *"bảng lịch-sử migration trong SKILL **cố ý tụt sau** — số + mig mới nhất → `docs/STATUS.md`"*, và **BỎ** cụm "nội-dung tới row Mig cuối hiện hành".

### F-B (MEDIUM) — `permission-matrix/SKILL.md` KHÔNG hề nhắc 2 root group đang sống: `Hrm` · `Off`
- `:3` khai **"12 root"** — 🔸 **đo lại: ĐÚNG SỐ, giữ nguyên** (ring1 S182 đã chốt; em xác nhận lần 2).
- Cây `:44-77` vẽ **10/12**: top-level `Dashboard`·`Master`·`Contracts`·`Forms`·`PurchaseEvaluations`·`KeHoachKyKet`·`Reports`·`System` + **`Workflows` và `PeWorkflows` lồng DƯỚI `System`** (đọc thô `^[A-Z]` chỉ ra 8 ⇒ **bẫy thụt-lề**, đừng đếm bằng anchor đầu dòng).
- Vắng THẬT = **2**: `grep -c "\bHrm\b"` = **0** · `grep -c "\bOff\b"` = **0** trên toàn file SKILL. Nguồn sống: `src/Backend/SolutionErp.Domain/Identity/MenuKeys.cs:170` `public const string Hrm = "Hrm";  // root group` · `:188` `public const string Off = "Off";  // root group văn phòng số`.
- 🔴 **Sửa số của carry-over cũ:** S179-F2 ghi *"cây thiếu **5 root** đang sống"* và S186 ghi *"cây **8 root** vs `:3` khai 12"* — **cả hai đều thổi phồng**. Con số đúng là **thiếu 2** (`Hrm`·`Off`), 10 root còn lại có mặt. Ghi lại cho khỏi truyền số sai sang phiên sau.
- **Đề-xuất:** thêm 2 nhánh `Hrm` + `Off` vào cây (kèm sub-group `Hrm_*` / `Off_*` dạng pattern như `Ct_*`), KHÔNG đụng số `12` ở `:3`.

### 🔸 Đã cân nhắc rồi **BÁC** (chống Goodhart — không vá cho tụt flag-count)
1. **`ef-core-migration/SKILL.md:99` bảng dừng Mig 71** (carry S179-F7) → **BÁC, đề-nghị ĐÓNG FLAG.** `:25` đã tuyên chủ-đích *"sẽ luôn tụt sau và điều đó hợp lệ"* + trỏ canonical. Vá = ép doc chạy theo mig mỗi phiên (đúng thứ B1 cấm). *(S191 cũng đã đề-nghị đóng — nay đo lại lần 2, giữ nguyên đề-nghị.)*
2. **`ef-core-migration/SKILL.md:25` "đĩa + STATUS đều 72"** → **BÁC.** Có neo *"Bắt @S181"* ⇒ **bản-ghi đông-lạnh của một phép đo cũ**; sửa số = giả mạo phép đo. (Lớp đã phân định @S186: *khai về QUÁ KHỨ* ⟂ *tự nhận là ẢNH HIỆN-TẠI*.)
3. **`ef-core-migration/SKILL.md:102` "last schema-changing Mig 70"** → **BÁC, VẪN ĐÚNG.** Đo lại `grep -c CreateTable`: Mig 71 = **0** · Mig 72 = **0** · Mig 73 = **0** ⇒ Mig 70 vẫn là mig cuối đổi số bảng. "Total 97 bảng" ở cùng dòng khớp canonical `STATUS:471`.
4. **`dependency-audit-erp/SKILL.md:84` (đổi hôm nay)** → **BÁC, patch ĐÚNG.** `git show d6026b14`: `- CI pin 20.x qua .nvmrc` → `+ CI **KHÔNG** pin (.nvmrc không ai đọc — gotcha #92) qua .nvmrc`. Vế phủ-định khớp cơ-chế thật (S191 F-2). Cụm "gotcha #5 NamGroup" giữ là lineage hợp-lệ.

### Skill → vai (map)
- Skill-matrix `agents/README.md:194-222` = **29 row**, phủ 29/29 vai (`comm` 2 chiều rỗng). 6 skill project đều có ≥1 vai nhận.
- 🔸 **`webapp-testing` ĐÃ có map** — `agents/README.md:204` (frontend-designer, "FD2 loop") + `frontend-designer.md:41/:49/:82`. **Đề-xuất new-alloc S191** (thêm `cicd-monitor` + `test-specialist` để bịt nửa lỗ #92 *đo FILE chứ không đo CHẠY*) **CHƯA land** — `grep webapp-testing` toàn repo: 0 hit ở 2 vai đó. Carry sang @close.
- 🔸 `form-engine` **105 ngày không chạm** (2026-04-30) — chưa có bằng-chứng stale nội-dung, chỉ nêu làm ứng-viên soi kỳ audit tháng. KHÔNG flag.

**MẶT ① = 2 finding (F-A MEDIUM · F-B MEDIUM) + 4 BÁC.**

---

## MẶT ③ — PLUGIN (báo ĐÚNG NẤC, không conflate)

**Nguồn quyền:** `~/.claude/settings.json` (**user-global, NGOÀI git** — áp mọi project, không riêng SE). Project `.claude/settings.json` chỉ có 2 key `autoMemoryDirectory` + `hooks`, **KHÔNG có `enabledPlugins`** ⇒ SE không override gì. *(🔸 tự đính chính: `autoMemoryDirectory` không mới — land từ S124 `23bbe97f`.)*

| Nấc | Số | Bằng chứng |
|---|---|---|
| **available** (marketplace) | **37** | `~/.claude/plugins/marketplaces/claude-plugins-official/plugins` |
| **installed/registered** | **18** | `enabledPlugins` có 18 key |
| **enabled** | **15** | 15 key `=true` |
| **disabled** | **3** | `pr-review-toolkit` · `code-modernization` · `hookify` |
| **assigned** (có ô phân-bổ vai THẬT) | **4/15** | `agents/README.md:242` `skill-creator`→mọi sub · `:243` `claude-md-management`→em main · `:245` `session-report`→em main/cicd-monitor · `:241` `frontend-design`→frontend-designer **nhưng ghi rõ "plugin trùng ĐANG enabled — cố ý KHÔNG dùng"** (chọn standalone) |
| **khai KHÔNG DÙNG có chủ đích** | **4/15** | khối `:246-252`: `feature-dev` (`:250`) · `code-review` (`:250`) · `commit-commands` (`:252`) · `csharp-lsp` (`:251`) |
| **nêu-nhưng-không-phân-bổ** | **1/15** | `typescript-lsp` — chỉ xuất hiện ở §Tool grant `:236` |
| **used** (thật sự chạy) | 🔴 **KHÔNG ĐO ĐƯỢC ⇒ KHÔNG KHAI** | không có telemetry invocation trong repo; `session-report` là `.mjs` chạy ngoài, 0 log trong git |

### F-C (LOW/INFORM) — 6/15 plugin enabled KHÔNG có ô nào trong sổ H3
`claude-code-setup` · `playground` · `mcp-server-dev` · `learning-output-style` · `plugin-dev` · `explanatory-output-style` — **0 hit** trên TOÀN `agents/README.md` (không ở bảng map `:238-245`, không ở khối KHÔNG-DÙNG `:246-252`).
🔸 Không kết luận "phải gán vai": 2 con `*-output-style` + `playground` bản chất không gán-vai được. **Cái thiếu là DÒNG PHÁN, không phải cái gán.** Đề-xuất: thêm 1 dòng gộp *"6 plugin enabled = nền CLI/authoring, không thuộc lane vai nào"* để sổ H3 đóng kín 15/15.

### Freshness ô khai + delta
- `agents/README.md:229` khai **"18 plugin registered (15 enabled / 3 disabled)"** — **KHỚP đĩa 3/3 con số** ✅ (hiếm: ô đếm tay còn tươi).
- **Delta vs S191 = 0** (18/15/3 y nguyên, cùng danh sách 3 disabled).

**MẶT ③ = 1 finding (F-C LOW/INFORM).**

---

## MẶT ④ — DOCS

### 🔴 F-D (HIGH) — "Audit định kỳ": ô ĐÚNG-GIÁ-TRỊ và ô CANONICAL-THEO-LUẬT là **hai ô khác nhau**

**Chuỗi quyền (đo từng mắt):**
1. `docs/rules.md:559` §9.4 *Cadence* — **"next-date → `docs/STATUS.md` canonical"** ⇒ **theo LUẬT, STATUS là ô canonical.**
2. `docs/STATUS.md:848` (§Maintenance backlog — **section SỐNG**, không phải blurb đóng băng): *"… ✅ **2026-07-01 DONE (S96 `881783c`)** … next **2026-08-01**"* ⇒ **Ô CANONICAL ĐANG THỐI**: chưa ghi lượt chạy 2026-08-07.
3. `CLAUDE.md:128`: *"**ĐÃ CHẠY 2026-08-07 (S179)** — trễ 6 ngày so hạn 08-01; verdict `PASS_WITH_FLAGS — 8`. **Lần kế: 2026-09-01.**"* ⇒ **GIÁ-TRỊ ĐÚNG**, nhưng ô này là **derived** và **tự xưng canonical**.
4. `docs/HANDOFF.md:216` + `:254` — site thứ 3, **khớp 09-01** ✅.

**PHÁN — 3 câu tách bạch:**
- **Kỳ audit tháng 08 ĐÃ CHẠY** — 2026-08-07 (S179), verdict `PASS_WITH_FLAGS — 8`, trễ 6 ngày so hạn 08-01. Bằng chứng **2 nguồn độc-lập** (`CLAUDE.md:128` + `HANDOFF:216/:254`). ⇒ **KHÔNG quá hạn 12 ngày.**
- **Ô THỐI = `docs/STATUS.md:848`** — và nó chính là ô mà LUẬT trỏ tới. Ai làm đúng luật (`rules.md §9.4` → STATUS) hôm nay sẽ đọc ra *"audit 08-01 quá hạn 12 ngày, chưa chạy"* ⇒ **báo-động-giả, có thể khiến chạy lại một kỳ đã xong**.
- **Ô ĐÚNG = `CLAUDE.md:128`** — nhưng **2 mệnh-đề phụ của nó SAI**:
  - (a) cite `rules.md:546` = **broken pointer**: `:546` rơi vào khối template frontmatter skill (`name:`/`description:`/`when-to-use:`), không dính gì audit. Dòng thật = **`:559`**.
  - (b) *"STATUS KHÔNG có row canonical"* — **SAI**. `STATUS:848` tồn tại và đang mang số. (Nó là **bullet** chứ không phải **row bảng** — nhiều khả năng lượt trước chỉ grep bảng §CURRENT STATE rồi đọc "vắng" thành "không có": đúng bẫy *phép trích RỖNG đọc thành sạch*.)
- ⇒ **Vi phạm B1 one-direction-lock**: giá-trị sống đang chảy **derived → canonical** (ngược chiều).

**Đề-xuất (lead chọn 1 hướng, em KHÔNG tự sửa):**
- **H1 (giữ luật):** vá `STATUS:848` → *"✅ 2026-08-07 DONE (S179, `PASS_WITH_FLAGS — 8`; trễ 6 ngày so hạn 08-01); next 2026-09-01"*; đổi `CLAUDE.md:128` từ *"giá-trị SỐNG duy nhất"* → *"derived — canonical: `STATUS` §Maintenance backlog per `rules.md §9.4`"*; sửa cite `:546`→`:559`.
- **H2 (đổi luật):** muốn `CLAUDE.md:128` làm canonical thật thì phải sửa `rules.md:559` trỏ ngược lại + bỏ số khỏi `STATUS:848`. **Đổi luật = quyền anh (D7).**
- 🔴 Dù hướng nào: `CLAUDE.md:128` tự dặn *"đóng audit thì phải lật ô này trong CÙNG lượt"* — luật đó **đúng nhưng thiếu một nửa**: phải lật **CẢ 2 ô** cùng lượt, vì hiện có 2 ô.

### 🔴 F-E (HIGH) — `agents/README.md:264` VALID_ROLES mirror thiếu **3 vai**, đúng như cảnh báo "sửa 1/2 bề mặt"
- `:264` tự xưng **"whitelist `hmw.js` — ĐỦ roster"**; đếm phần-tử: **26 tên** roster (29 backtick token, 3 trùng lặp), **0 tên lạ**.
- **Thiếu:** `ring5-audit` (S185) · `score-counter` · `score-count-auditor` (S181 W4b).
- Nguồn thật `hmw.js:22-60` **ĐÚNG ĐỦ 29** ⇒ **doc-mirror lệch**, không phải lỗi máy (workflow spawn vẫn chạy được cả 29).
- 🔴 `docs/HANDOFF.md:78` (khối SỐNG *"NEXT em @S186"*) đã ghi đúng **cả 2 site**: *"`agents/README:27` … · **`:264` VALID_ROLES cũng thiếu** ⇒ sửa 1/2 bề mặt độc lập…"*. Đo hôm nay: `:27` **ĐÃ VÁ @S188** (bỏ số + đủ 29) · `:264` **CHƯA** ⇒ **lời cảnh báo tự nó ứng nghiệm**.
- ⚠️ **ĐÍNH CHÍNH MẶT ②:** verdict "PASS 6/6" ở §② đúng cho **6 bề mặt đã đo**; `README:264` là **bề mặt thứ 7**, đo sau và **TRƯỢT** ⇒ phủ roster-doc thật = **6/7**. (Không để "6/6" đóng vai "đã phủ hết" — bài *meta-count self-coverage*.)

### F-F (MEDIUM) — `HANDOFF` khối SỐNG *"NEXT em @S186"* mang việc ĐÃ ĐÓNG
Mục **#7** (roster `README:27`) đóng @S188 nhưng vẫn nằm nguyên trong list *"tự chạy, không cần anh gật"* — 6 phiên + 2 bookend-close sau. Mục **#6** (2 stale skill) vẫn ĐÚNG-mở (= F-A/F-B) nhưng chép sai số *"cây 8 root"* (thật: thiếu 2). **Đề-xuất:** gạch #7, sửa số ở #6, bump nhãn khối `@S186` → phiên hiện hành.

### F-G (LOW) — dải `§16+` ERD-debt: 2 giá-trị, **cả hai đều sai**
- `CLAUDE.md:148` + `docs/CLAUDE.md:70` → **"§16+ Mig 32-73 pending"**
- `.claude/skills/ef-core-migration/SKILL.md:319` + `docs/database/schema-diagram.md` → **"§16+ Mig 27-66"**
- Nguồn tự khai của chính schema-diagram (`:517`): *"ERD chi tiết §11-15 cover **Mig 12-26**"* ⇒ dải pending đúng = **27-73**. Bản A sai ĐẦU (32), bản B sai ĐUÔI (66). *(Tiến bộ so S179-F4: từ 4 giá-trị/4 bề mặt còn 2/4.)*

### 🔸 BÁC (dương-giả — KHÔNG vá)
- **`docs/database/schema-diagram.md:515` "Tổng: 91 bảng (Mig 42, …)"** → **BÁC, đề-nghị ĐÓNG carry S179.** Có **neo phiên-bản "(Mig 42"** ngay trong ngoặc, và bảng migration của file dừng đúng ở Mig 42 ⇒ đây là **tổng-dòng-cuối của một bảng tự-ghi-ngày**, không phải claim "97 hiện tại". Sửa 91→97 = **giả mạo một phép đo lịch sử**. Nợ THẬT là dải ERD `§16+` (F-G), đã có mục riêng.
- **`STATUS:406` "monthly pointer→2026-08-01"** → **BÁC.** Nằm trong blurb `**Prev S98**` = bản-ghi phiên đóng băng, không phải con trỏ sống.
- **`STATUS:497` "Roster 26→28 vai"** → **BÁC.** Trong `## ✅ Recently Done (S180–S181)` = ghi-chép lịch sử đúng tại thời điểm đó.

### 🔸 INFORM (chưa đủ chắc để thành finding)
`docs/PROJECT-MAP.md` (241 dòng, §Module map): `grep -ci` = **0 hit** cho `PurchaseEvaluation` · `purchase` · `Duyệt NCC` · `ContractSigningPlan` · `KeHoachKyKet` · `KHKK`; **control dương** `contract` = **31 hit** ⇒ thước sống, vắng là vắng thật. Nghĩa là bản-đồ toàn-cảnh **không nhắc 2 module lớn** (PE feature-complete + KHKK Mig 69-72). 🔸 Em **chưa** đọc hết 241 dòng để loại khả năng 2 module nằm dưới tên khác ⇒ để INFORM, lead xác nhận phạm vi trước khi coi là drift.

**MẶT ④ = 4 finding (F-D HIGH · F-E HIGH · F-F MEDIUM · F-G LOW) + 3 BÁC + 1 INFORM.**

---

## §VERDICT

**`TOOLING-AUDITOR: PASS_WITH_FLAGS — 7 finding`** (2 HIGH · 3 MEDIUM · 2 LOW) + **7 BÁC dương-giả** + 1 INFORM chờ xác nhận.

| Mặt | Verdict | Finding |
|---|---|---|
| ① skill | PASS_WITH_FLAGS | **2** — F-A `skills/README:20` chép mệnh-đề đã bị bác @S181 (MED) · F-B `permission-matrix` vắng 2 root `Hrm`/`Off` (MED) |
| ② vai sub-agent | **PASS** (6/7 bề mặt) | **0** trên 6 bề mặt đo ở §②; bề mặt thứ 7 `README:264` trượt → tính vào F-E |
| ③ plugin | PASS_WITH_FLAGS | **1** — F-C 6/15 plugin enabled không có dòng phán trong sổ H3 (LOW) |
| ④ docs | **DRIFT** | **4** — F-D audit-date: ô canonical ⟂ ô đúng (HIGH) · F-E `README:264` thiếu 3 vai (HIGH) · F-F HANDOFF mang việc đã đóng (MED) · F-G dải §16+ 2 giá-trị đều sai (LOW) |

**Diff vs S191 (THÊM/ĐỔI/XÓA/stale):**
- **THÊM:** 0 skill · 0 vai · 0 plugin · 0 command.
- **ĐỔI:** `dependency-audit-erp/SKILL.md:84` (S191 vá #92 — **đúng**, đã BÁC).
- **XÓA:** 0.
- **Stale MỚI phát hiện phiên này: F-D · F-E · F-F** — cả 3 là **hệ quả của closeout S188/S191 vá nửa vời**, không phải drift tự nhiên.
- **Carry còn mở:** F-A · F-B (từ S186) · F-G (từ S179-F4, đã thu 4→2 giá-trị).
- **Carry đề-nghị ĐÓNG** (đo lại = dương-giả): S179-F7 bảng mig SKILL · S179-F8 schema-diagram 91 bảng · S179-F2 *"thiếu 5 root"* (số đúng: **2**).

**New-alloc carry sang @close:** `webapp-testing` → `cicd-monitor` + `test-specialist` (đề-xuất S191, **chưa land**, 0 hit).

🔴 **Chủ-đề xuyên suốt 3 finding mới:** vá **1 trong N bề mặt** rồi coi như xong — `README:27` vá mà `:264` không · `CLAUDE.md:128` lật mà `STATUS:848` không · HANDOFF ghi việc xong mà không gạch. **Đề-xuất quy-tắc:** mỗi lần lật một con số/nhãn, `grep` chính chuỗi đó toàn repo **TRƯỚC KHI** đóng lượt, và ghi số site đã lật (`n/n`) vào commit.
