TOOLING: PASS_WITH_FLAGS — 7 flag

> H1 tooling-auditor · bookstart @open vòng V1 · phiên S189 (phiên-LOGIC L15) · 2026-08-10
> INFORM-only · propose-only · single-writer = lead (B3 VERIFY → APPEND). Vai KHÔNG tự sửa file nào.
> G-015: `store_memory` đã strip, NHƯNG `Bash` còn = write-channel mở ⇒ KHÔNG tuyên "read-only enforced".
> Nấc bằng-chứng: mọi số dưới đây ĐO TỪ ĐĨA trong phiên này, không chép số cũ trong diary.

---

## 0. TÓM TẮT 4 MẶT

| Mặt | Verdict | Số đo (đĩa, hôm nay) |
|---|---|---|
| ① skill | PASS_WITH_FLAGS (2) | 6 project + 23 standalone + **20** command (19→20: `+day.md`) |
| ② vai-trò / roster | **PASS** (0 flag) | **29** — khớp **6/6** bề mặt |
| ③ plugin | **PASS** (0 flag) | **18 registered / 15 enabled / 3 disabled** — 0-delta **phiên thứ 7** |
| ④ docs | PASS_WITH_FLAGS (5) | 4 vá S188 đều THẬT; drift còn lại = carry-over + 1 mới |

**Phân bố:** 1 HIGH · 2 MED · 3 LOW · 1 INFORM.
**Điểm sáng:** mặt ② lần đầu **SẠCH TUYỆT ĐỐI** kể từ S179 — cả 6 bề mặt roster + frontmatter 29/29 × 3 khoá.

---

## 1. XÁC NHẬN 4 VÁ CỦA BOOKEND @CLOSE S188 (lead dặn: đừng tin dòng khai, mở file đối chứng)

Mở từng file đối chứng. **CẢ 4 ĐỀU VÁ THẬT** — không có vá-trên-giấy.

| # | Vá khai @S188 | Đối chứng đĩa | Verdict |
|---|---|---|---|
| 1 | Tests 668→680 | `docs/STATUS.md:476` = `**680 PASS**` \| `45 Domain + 635 Infra`, khai **ĐO ×2 nguồn độc-lập** (local `dotnet test` @gate-cụm + CI run **#482** `b275893c` tách-phần 45/635, đối chứng thứ 3 `sub-reviewer-cum.md`) | ✅ **THẬT + có phương-pháp** |
| 2 | bundle 2 đời | `docs/STATUS.md:479` = admin **`BZ1PG34E`** (1.813.772 B) · user **`0ObPwWFB`** (1.728.765 B), khai đo **LIVE trên VPS 2026-08-10 19:53-19:55** (`sub-cicd-cum.md:53-54`) + ship-proof tầng đĩa "chỉ còn ĐÚNG 1 `index-*.js` mỗi app". `STATUS:10` mega-line KHÔNG chép hash, chỉ trỏ `:479` (đúng B1) | ✅ **THẬT + B1-sạch** |
| 3 | roster README | `.claude/agents/README.md:27` — số đã **BỎ HẲN** (trỏ `docs/STATUS.md §Sub-agents`), enumeration đã **thêm `ring5-audit`**. Đếm phần-tử: **7 core (diagram) + 22 tên = 29** = đĩa | ✅ **THẬT + ĐỦ** (xem §3) |
| 4 | Modules GĐ3 | `CLAUDE.md:74` row Contract = `+ Duyệt HĐ GĐ3 (YC-023/024/025, S187-S188)` · cột Migration `1-11 · **0-mig @S188**` | ✅ **THẬT** — nhưng **row KHKG kế bên lại hở** → F-1 |

🔑 **Vá #3 đáng ghi nhận về CHẤT, không chỉ về số:** vá bằng **BỎ SỐ** (tuân luật `README:3` cấm chép số) chứ không phải **ĐỔI SỐ** — đúng đơn thuốc mà chính dòng `:28` (bài S143) kê. Đổi số thì roster kế lại stale; bỏ số thì hết class. Đây là lần đầu lớp drift này được đóng ĐÚNG CÁCH sau khi sống qua S185→S186→S188.

---

## 2. MẶT ① — SKILL

**Đo:** `.claude/skills/` = **6** project (contract-workflow · dependency-audit-erp · ef-core-migration · form-engine · iis-deploy-runbook · permission-matrix) · `~/.claude/skills/` = **23** standalone · `.claude/commands/*.md` = **20**.

**DIFF vs S188/S186: command 19 → 20.** File mới = `.claude/commands/day.md`, added `6bf768da` 2026-08-10.

### ✅ SẠCH — `day.md` KHÔNG phải máy mồ-côi (control dương chạy đủ)
Áp phép đo "máy MỚI sinh trong phiên = ứng-viên mồ-côi số 1" (method file `method_orphan_machine_audit.md`). Kết quả **có nhà khai đủ**:
- Máy đi kèm **tồn tại thật**: `scripts/day-probe.ps1` (`scripts/*.ps1` 36→**37**).
- `day-probe` được trỏ ở **≥4 bề mặt sống**: `CLAUDE.md` (khối "Mạch việc dở") · `.claude/commands/day.md` · `.claude/commands/pause.md` · `.claude/commands/tiep.md`.
- ⇒ cặp `day.md` + `day-probe.ps1` **có nhà khai, có cửa gọi**. KHÔNG flag. (Ghi nhận để phiên sau không nghi lại.)

### F-6 (LOW · mặt ①) — `ef-core-migration/SKILL.md` bảng migration dừng ở **Mig 71**, canonical = **72**
- **Bằng chứng:** `.claude/skills/ef-core-migration/SKILL.md:99` = row cuối `| **71** | AddKhkkApprovalGroupCatalogAndFinalizeRuntime |`. Đĩa có **Mig 72** `20260806070242_AddMaHangMucToContractSigningPlanLines.cs`. `grep -c AddMaHangMucToContractSigningPlanLines` = **1**, và hit đó nằm ở **`:25`** — trong **ghi-chú lineage** ("bảng dừng ở Mig 71…"), **KHÔNG phải một row của bảng**.
- **Đây là carry-over S179 F-7, sống qua S179 → S180 → S186 → S188 (≥4 phiên).**
- 🔸 **Tự bác một vế:** `:102` ghi *"last schema-changing **Mig 70**"* — **VẪN ĐÚNG**, không flag. Đo: `grep -c CreateTable` trên Mig 72 = **0** (Mig 71 cũng 0 theo S179). Theo từ-vựng "schema-changing" mà chính file định nghĩa (= tạo bảng), câu này còn hiệu lực. Vá phần bảng, **đừng đụng `:102`**.
- **Đề xuất:** thêm 1 row `| **72** | AddMaHangMucToContractSigningPlanLines | S177/L11 — KHKK Line +MaHangMuc, AddColumn no new table |`.

### F-7 (LOW · mặt ① ranh ④) — `permission-matrix/SKILL.md` cây vẽ thiếu root so với số chính nó khai
- **Bằng chứng:** `:3` (frontmatter description) khai **"12 root"**. Cây ở `:55-79` chỉ dựng **8** nhánh root nhìn thấy được (`Contracts` `:55` · `PurchaseEvaluations` `:58` · `KeHoachKyKet` `:60` · `Workflows` `:73` · `PeWorkflows` `:75` + phần trên), phần còn lại chỉ tồn tại dưới dạng câu văn `:22-28`.
- 🔸 **Chỗ SAI là CÂY, không phải SỐ** — `ring1` @S182 đã chốt **12 là số ĐÚNG**. Đừng "vá" bằng cách hạ `:3` xuống 8 (đó là Goodhart: rời tập-đo, làm số khớp cây thay vì cây khớp thực tế).
- **Carry-over S179 F-2/F-3 → S182 → S186. Chưa vá.**
- **Đề xuất:** bổ sung 4 root vắng vào cây. ⚠️ **Cảnh báo kèm (bài S186):** trong 4 root từng bị liệt, `Puro` là **TÊN MA** — 6/6 hit đều nằm trong COMMENT trỏ NAMGROUP; tên thật là `HopDongCung`. Lấy tên từ `MenuKeys.cs`, **đừng chép lại danh sách cũ**.

---

## 3. MẶT ② — VAI TRÒ / ROSTER — **PASS, 0 FLAG**

**Roster = 29.** Khớp **6/6** bề mặt, đo hôm nay:

| # | Bề mặt | Giá trị | Lệnh/neo |
|---|---|---|---|
| 1 | Đĩa | **29** | `ls .claude/agents/*.md \| grep -v README \| wc -l` (glob thô = 30, **trừ `README.md`** — bẫy đã biết) |
| 2 | `hmw.js` `VALID_ROLES` | **29** | parse khối `const VALID_ROLES = [` → `\n]`, strip comment `//`, 29 chuỗi |
| 3 | `.claude/agent-memory/*/` | **29** dir | |
| 4 | `docs/STATUS.md:480` (**canonical**) | **29** | `\| Sub-agents \| **29** \|` |
| 5 | `.claude/agents/README.md:27` enumeration | **29** | 7 core + 22 tên, đếm PHẦN-TỬ |
| 6 | skill-matrix `agents/README:194-231` | **29 row** | `comm` 2 chiều: **disk∖matrix = ∅** · **matrix∖disk = ∅** · 0 row trùng |

**Set-diff đĩa ↔ VALID_ROLES: rỗng cả 2 chiều.** 0 vai thừa, 0 vai ma, 0 dir mồ-côi.

**Frontmatter:** `model: opus` **29/29** · `effort: max` **29/29** · `memory: project` **29/29**. ⇒ **nợ S181 (2 vai W4b thiếu `effort`) đã đóng và giữ được qua 2 lượt sinh vai.**

### 🔑 Bề mặt thứ 6 (skill-matrix) — nợ dai nhất của mặt ② ĐÃ ĐÓNG
Lịch sử: S182 matrix phủ **26/28** (thiếu `score-counter` + `score-count-auditor`) → S185 vẫn ghi *"còn 26"*. Hôm nay đo lại: **29/29, 0 ghost**. Cả 2 vai W4b + `ring5-audit` đều đã có row. Đây là bề mặt cuối cùng của mặt ② còn hở — nay hết.

### 🔸 Khai PHẠM-VI + tự-hiệu-chỉnh độ mạnh bằng chứng (bài S180, ring1 bác)
KHÔNG khai "6 bề mặt ĐỘC-LẬP". Thật ra:
- Bề mặt 1 và 3 **đồng-biến một phần** (dir memory sinh theo vai, tuy không tự động).
- Bề mặt 4, 5, 6 là **3 nguồn tay-nuôi ĐỘC-LẬP THẬT** (3 vị trí khác nhau, 2 file khác nhau, không có máy nào đồng bộ chúng).
- ⇒ Độ mạnh thật ≈ **đĩa + 4 nguồn tay-nuôi độc lập**, đủ để tuyên PASS chắc, nhưng **không phải "6 nhân chứng rời nhau"**.

**Thừa / idle / scope-drift: 0.** Không vai nào trên đĩa vắng khỏi registry, không vai nào trong registry vắng khỏi đĩa.

---

## 4. MẶT ③ — PLUGIN — **PASS, 0 FLAG**

Nguồn thẩm quyền = **user-global** `~/.claude/settings.json` (KHÔNG conflate với project `.claude/settings.json` — file project chỉ có `hooks.Stop` → `wal-flush.ps1`).

**Báo đúng 4 nấc, KHÔNG conflate:**

| Nấc | Giá trị | Nguồn |
|---|---|---|
| **installed** (marketplace) | **37** | `~/.claude/plugins/marketplaces/claude-plugins-official/plugins` |
| **registered** | **18** | `enabledPlugins` keys |
| **enabled** | **15** | `enabledPlugins` value = `true` |
| **disabled** | **3** | `pr-review-toolkit` · `code-modernization` · `hookify` (đều `@claude-plugins-official`) |
| **assigned** (map → vai) | có bảng | `.claude/agents/README.md:238-244` |
| **used** | 🔴 **KHÔNG ĐO ĐƯỢC từ repo ⇒ KHÔNG KHAI** | — |

- **0-delta phiên thứ 7 liên tiếp** (S169 → S173 → S179 → S180 → S185 → S186 → S189). Không có plugin mới cần phân bổ.
- Lead model ở file đó: `claude-opus-5[1m]` + `effortLevel: xhigh`.
- ✅ **Vá S179 R-1 GIỮ ĐƯỢC:** `agents/README:239` nay ghi `frontend-design (standalone; 🔴 plugin trùng **ĐANG enabled** — cố ý KHÔNG dùng)` — khớp đĩa (`"frontend-design@claude-plugins-official": true`). Vị-từ đã đúng, **không tái phát**.
- ✅ `agents/README:236` khai **"18 plugin registered (15 enabled / 3 disabled)"** — **KHỚP đĩa từng con số**.

**New-allocation:** 0 skill mới, 0 plugin mới ⇒ **không có gì cần phân bổ phiên này**. (`day.md`/`day-probe.ps1` là máy nội bộ, không phải skill/plugin.)

---

## 5. MẶT ④ — DOCS

### F-1 (HIGH) — `CLAUDE.md:77` bảng Module: KHKK khai `69, 71` — **THIẾU Mig 72**
🔴 **XÁC NHẬN phát hiện của lead. Đây LÀ flag mặt-4, và nó nặng hơn một ô lẻ.**
- **Bằng chứng:** `CLAUDE.md:77` cột Migration = `**69, 71**`. Mig 72 = `20260806070242_AddMaHangMucToContractSigningPlanLines.cs` — tên file tự khai `ContractSigningPlanLines` ⇒ **đúng module KHKK của chính row đó**, không phải module khác.
- `docs/STATUS.md:471` canonical = **72** ✅ đúng. ⇒ lệch nằm ở **derived**, không phải canonical (tin tốt: chuỗi B1 không hỏng từ gốc).
- **Vì sao HIGH:** row này là **cột "Migration" của bảng Module** — bề mặt mà người đọc dùng để trả lời *"module này gồm những migration nào"*. Thiếu 1 mã ở đây = câu trả lời SAI, khác với một con số tổng bị lệch.

**Trả lời trực tiếp câu lead hỏi — "còn bề mặt nào khác cùng lớp không?":**
- **Cùng-lớp HẸP (chuỗi `69, 71`): CHỈ 1 site.** `grep "69, 71\|69,71\|Mig 69.*Mig 71"` trên `CLAUDE.md` · `docs/CLAUDE.md` · `docs/STATUS.md` · `docs/PROJECT-MAP.md` · `ef-core-migration/SKILL.md` → **1 hit duy nhất = `CLAUDE.md:77`**. Không phải lớp "claim chép nhiều site". Vá 1 chỗ là đủ **cho vế này**.
- 🔴 **NHƯNG cùng-lớp RỘNG (= "bề mặt kể migration bỏ sót Mig 72") có site THỨ HAI:** `ef-core-migration/SKILL.md:99` (→ **F-6**). ⇒ **Mig 72 đang vắng ở 2 bề mặt derived độc lập.** Nếu chỉ vá `CLAUDE.md:77` rồi tuyên "đóng lớp" thì sót đúng một nửa.
- **Đề xuất:** vá **CẢ HAI trong CÙNG một lượt**: `CLAUDE.md:77` → `**69, 71, 72**` (+ nửa câu mô-tả Mig 72) **và** thêm row 72 vào `SKILL.md`.

### F-2 (MED) — `docs/database/schema-diagram.md:515` khai **91 bảng**, canonical = **97**
- **Bằng chứng:** `:515` = `Tổng: **91 bảng** (Mig 42, + __EFMigrationsHistory hệ thống).` · `docs/STATUS.md:472` canonical = **97 @S164** (prod `sys.tables` = 97).
- Lệch **6 bảng**, và neo `Mig 42` so với Mig hiện hành **72** ⇒ ô này đứng yên từ khoảng **30 migration trước**.
- 🔸 **Phân loại theo tiêu-chí S186** (*"dòng này khai về QUÁ KHỨ hay tự nhận là ẢNH HIỆN-TẠI?"*): dòng mở bằng **"Tổng:"** = **tự nhận ảnh hiện-tại** ⇒ **stale THẬT**, không phải dương-giả.
- **Carry-over S179 F-8. Chưa vá.**
- **Đề xuất:** đổi thành con trỏ B1 (`số bảng → docs/STATUS.md`) thay vì thay số — chính `CLAUDE.md` đã mô tả file này là *"(số bảng → docs/STATUS.md)"*, nên hạ số ở đây là **khôi phục hợp đồng B1 đã tuyên**, không phải quyết định mới.

### F-3 (MED) — `docs/PROJECT-MAP.md` **0 hit** cả 4 module đang sống
- **Bằng chứng (kèm control dương, bắt buộc):**

| Từ khoá | Hit trong `PROJECT-MAP.md` |
|---|---|
| `ContractSigningPlans` | **0** |
| `KeHoachKyKet` | **0** |
| `PeWorkItemBudgets` | **0** |
| `ContractCatalogEntries` | **0** |
| `contract` (**control dương**) | **31** |

- Control dương = 31 ⇒ **thước không hỏng, file không rỗng** — 4 số 0 kia là **vắng mặt THẬT**, không phải lỗi grep. (Đúng bài "0-hit phải kèm control dương".)
- **Vì sao đáng MED:** `PROJECT-MAP.md` là **file #3 trong 5-file-đọc-trước** của `CLAUDE.md`. Một "bản đồ toàn cảnh" không chứa module KHKK (7 bảng, Mig 69/71/72) + module ngân-sách PE đang chạy prod ⇒ người đọc theo đúng quy trình khởi động sẽ dựng sai bản đồ ngay từ đầu.
- **Carry-over S179 F-5. Chưa vá.**

### F-4 (LOW) — `docs/STATUS.md:10` mega-line CURRENT ghi `roster 28`, canonical `:480` = **29**
- **Bằng chứng:** `:10` chứa `· roster 28 ·`; `:480` = `| Sub-agents | **29** |`; đĩa = 29.
- 🔸 **Cố ý hạ xuống LOW, có lý do đo được** — không thổi lên:
  - `:8` **tự khai trước** rằng dòng CURRENT lag: *"Dòng CURRENT ngay dưới đây advance @closeout nên tụt sau — giữa phiên đọc `.claude/WAL.md`"* ⇒ có caveat gắn liền, người đọc được cảnh báo.
  - Dòng có **neo cửa sổ** (`S161→S168`) ⇒ mang tính bản-ghi-đông-lạnh nhiều hơn ảnh hiện-tại.
  - Vế bundle **trong chính dòng đó đã B1-hoá đúng** (`bundle prod → canonical ở :479, KHÔNG chép số ở đây`) — chứng minh khuôn vá đã có sẵn ngay tại chỗ.
- **Đây là lớp tái phát:** S180 bắt cùng bệnh ở mega-line (khi đó `:8`). Cùng dòng, cùng loại, đổi số dòng.
- **Đề xuất:** áp đúng khuôn mà vế bundle đã dùng — thay `roster 28` bằng `roster → :480` (**bỏ số**, không đổi số). Đổi 28→29 thì phiên có vai thứ 30 lại stale.

### F-5 (INFORM · phương-pháp — không phải lỗi nội dung) — công thức đo cạnh `STATUS:471` **tái dựng ra 71, không ra 72**
🔑 **Flag này sinh ra từ chính cú trượt của em trong phiên này — báo lại để nó không bẫy vai sau.**
- `docs/STATUS.md:471` khai `Migrations = **72**` kèm phương-pháp: *"đo đĩa `ls Persistence/Migrations/*.cs` **trừ Designer+Snapshot** = 72"*.
- **Áp đúng chữ thì ra 71.** Vì migration `20260717032812_AddPeApprovedBudgetSnapshot.cs` có chữ **"Snapshot" trong TÊN CỦA CHÍNH NÓ** ⇒ bộ lọc "trừ Snapshot" **ăn nhầm một migration thật**.
- **Đo lại đúng:** `ls *.cs` = 145 · trừ `*.Designer.cs` (72) · trừ **`ApplicationDbContextModelSnapshot`** (1) = **72** ✅. Ordinal file cuối = **72** `AddMaHangMucToContractSigningPlanLines`. `git log --diff-filter=D` trên thư mục = **0 file bị xoá** (loại giả thuyết "mất 1 migration").
- ⇒ **SỐ 72 ĐÚNG. Sai là CÔNG THỨC nằm cạnh nó.** Em đã suýt báo "canonical drift 72 vs 71" — tức là **báo oan chính ô canonical đúng**, chỉ vì tin công thức chép trong doc thay vì tự dựng phép đo.
- **Đề xuất:** sửa chữ trong `:471` thành *"trừ `*.Designer.cs` + `ApplicationDbContextModelSnapshot`"*. Chi phí 1 dòng, chặn một lớp báo-oan lặp lại.
- 🔸 Bài rút: **công thức chép trong doc cũng là một derived-artifact và cũng lão hoá** — nó không được miễn trừ chỉ vì trông giống một lệnh chạy được.

---

## 6. DIFF vs S188

| Mặt | S188 / baseline gần nhất | S189 (hôm nay) | Delta |
|---|---|---|---|
| skill project | 6 | 6 | 0 |
| skill standalone | 23 | 23 | 0 |
| command | 19 | **20** | **+1 `day.md`** (`6bf768da`) |
| scripts `.ps1` | 36 | **37** | **+1 `day-probe.ps1`** |
| roster | 29 (đĩa) — nhưng README:27 khai **28** + liệt thiếu `ring5-audit` | **29**, README:27 **đã vá đúng cách** | **F-1 S188 ĐÓNG ✅** |
| skill-matrix | 26/28 (S182) → "còn 26" (S185) | **29/29, 0 ghost** | **ĐÓNG ✅** |
| frontmatter | 26/28 `effort` (S181) | **29/29 × 3 khoá** | **giữ sạch ✅** |
| plugin | 18/15/3 | 18/15/3 | **0-delta phiên 7** |
| Tests (docs) | 668 | **680** (đo ×2 nguồn) | vá THẬT ✅ |
| bundle (docs) | 2 đời | `BZ1PG34E` / `0ObPwWFB` đo LIVE | vá THẬT ✅ |
| Migrations | 72 | 72 (đĩa xác nhận) | 0 |

**Đóng phiên này (do S188 vá): 2 nợ mặt ② + 2 vá mặt ④.**
**Còn treo: 4 carry-over** — F-6 (S179 F-7) · F-7 (S179 F-2/F-3) · F-2 (S179 F-8) · F-3 (S179 F-5). **Cả 4 đều là nợ từ drift-audit THÁNG S179, sống qua ≥4 phiên.**
**Mới sinh: F-1** (Mig 72 vắng ở `CLAUDE.md:77` — sinh 2026-08-06, chưa từng bị bắt).

---

## 7. ĐÃ SOI MÀ SẠCH (để lead biết mặt nào đã phủ — không chết non)

- ✅ Roster set-diff đĩa ↔ `VALID_ROLES` — rỗng 2 chiều.
- ✅ `agent-memory/*/` 29 dir — 0 dir mồ-côi, 0 vai thiếu dir.
- ✅ Frontmatter 29/29 × `model` / `effort` / `memory`.
- ✅ skill-matrix `comm` 2 chiều — 0 vai sót, 0 row ma, 0 row trùng.
- ✅ Plugin: 4 nấc đo rời, `agents/README:236` khớp đĩa từng số; vá S179 R-1 (`frontend-design`) **không tái phát**.
- ✅ `day.md` + `day-probe.ps1` — có nhà khai ≥4 bề mặt ⇒ **không mồ-côi** (đã chủ động soi vì là máy mới sinh).
- ✅ `STATUS:476` Tests / `:479` bundle / `:471` Migrations / `:472` bảng — **canonical đều TƯƠI**.
- ✅ `STATUS:10` vế bundle đã B1-hoá đúng (chỉ vế roster hở → F-4).
- ✅ `ef-core SKILL:102` *"last schema-changing Mig 70"* — **tự bác, KHÔNG flag** (Mig 71 & 72 đều `CreateTable` = 0).
- ✅ `STATUS:7` khối "S185 ĐÓNG" ghi `Tests 668` — **tự bác, KHÔNG flag**: bản-ghi-đông-lạnh có neo phiên/ngày, khai về quá khứ. Sửa = giả mạo phép đo cũ (bài S181/S186).
- ✅ `permission-matrix:3` "12 root" — **tự bác, KHÔNG flag**: `ring1` @S182 chốt 12 là số ĐÚNG; lỗi ở CÂY (→ F-7).

### Phạm vi CHƯA phủ (khai thẳng, không để lead tưởng đã quét hết)
- ❌ Chưa soi trọn nội dung 20 `.claude/commands/*.md` (chỉ soi tên + máy đi kèm).
- ❌ Chưa soi trọn 23 skill standalone `~/.claude/skills/` (chỉ đếm).
- ❌ Chưa soi `docs/governance/` theo từng file (chỉ chạm qua con trỏ từ CLAUDE.md).
- ❌ Nấc plugin **`used`** — không đo được từ repo, **không khai**.
- ❌ Số dạng LOC/%/ms/byte-cap trong persona — chưa quét lớp này.

---

## 8. ĐỀ XUẤT CHO EM MAIN (propose-only — vai KHÔNG tự sửa)

**Ưu tiên vá trong phiên (rẻ, chặn lớp):**
1. **F-1 + F-6 CÙNG LƯỢT** — `CLAUDE.md:77` → `69, 71, 72` **và** `ef-core-migration/SKILL.md` +row 72. *(Vá 1 trong 2 = sót nửa lớp.)*
2. **F-5** — sửa công thức `STATUS:471` thành *"trừ `*.Designer.cs` + `ApplicationDbContextModelSnapshot`"*. 1 dòng, chặn báo-oan lặp.
3. **F-4** — `STATUS:10` `roster 28` → **bỏ số**, trỏ `:480` (khuôn có sẵn ngay trong dòng đó).

**Vá được thì tốt (nợ tháng S179, đã ≥4 phiên):**
4. **F-2** — `schema-diagram.md:515` → con trỏ B1 thay vì số 91.
5. **F-3** — `PROJECT-MAP.md` bổ sung 4 module sống.
6. **F-7** — `permission-matrix` bổ sung root vào CÂY (⚠️ lấy tên từ `MenuKeys.cs` — `Puro` là tên ma, thật là `HopDongCung`).

🔴 **Chống Goodhart — 3 chỗ CẤM "vá cho tụt flag-count":** đừng hạ `permission-matrix:3` 12→8 · đừng sửa `STATUS:7` "Tests 668" · đừng đụng `ef-core SKILL:102` "Mig 70". Cả 3 đang ĐÚNG; sửa chúng chỉ làm số flag đẹp lên trong khi nội dung xấu đi.

🔴 **Nếu vá F-1/F-4 mà đóng luôn "lớp Mig 72 / lớp roster-số" thì phải grep lại bằng LỆNH KHÁC** sau khi vá — bài `absence_looks_like_clean`.
