# sub-tooling-auditor — S152 @open (H1 tooling-freshness 4-mat)

> INFORM-only, propose-only. Ghi APPEND TRONG LUC LAM (anti-#53). Moi so kem LENH.
> Diff-base: S151 (H1 ra PASS_WITH_FLAGS 8-finding). PIN doc: machine-baseline.md cung folder.

## 0. Ground-truth phien
- LENH `git log --oneline -5` => HEAD `3058470 wal: flush 20260725T2014` (hook), truoc do `1b85713` closeout S151.
- LENH `git status --porcelain` => 3 muc: M `.claude/governance/.session-counter.json` · ?? `.claude/sessions/session-5/` · ?? runs/2026-07-25-S152-... (= scaffold may @open, KHONG phai drift).
- Model self-report: Opus 5 (1M) — worker-tier-pin giu.

## 1. MẶT ① SKILL

### 1a. State
- LENH `ls -1 .claude/skills/` => **6 skill project** (contract-workflow · dependency-audit-erp · ef-core-migration · form-engine · iis-deploy-runbook · permission-matrix) + README.md. **0 THÊM / 0 XÓA** vs S151.
- LENH `git log --oneline -8 -- .claude/skills/` (xem mục 1d) => last-touch.

### 1b. Nợ S151 — row Mig 67 trong ef-core-migration: **ĐÓNG THẬT (verified)**
- LENH `grep -n "Mig 67\|AddPeApprovedBudgetSnapshot\|67" .claude/skills/ef-core-migration/SKILL.md`
- => HIT `.claude/skills/ef-core-migration/SKILL.md:89` — row bảng `| **67** | **AddPeApprovedBudgetSnapshot** | ... snapshot 11 cột ... no new table (89 giữ) ... commit d4fbced |` + đuôi `*(row bổ sung @S151 — ring1 TRƯỢT-1 bắt bảng dừng ở 66)*`.
- mtime SKILL.md = `Jul 25 19:11` (LENH `ls -la .claude/skills/ef-core-migration/`), 33.773B — khớp cửa-sổ vá S151. **Nợ S151 CLOSED, không tái-mở.**

### 1c. C2 15 LOW derived-stale — PHÁN: **15/15 DƯƠNG-GIẢ** (module-local, không phải stale-total)
Tao KHÔNG tin số tổng của máy suông — tao **tái-lập luật C2 nguyên văn** (đọc `scripts/governance-detectors.ps1:267-334`, dựng lại 6 count-pattern + 2 token VN từ code-point `:103-104` + 3 skip-rule `^\s*\|` / `baseline|\bS\d{2}\b|\(current` / pre-token version-guard + ratio-band sev) chạy trên ĐÚNG tập `$derivedDocs` (all SKILL.md + all commands/*.md + CLAUDE.md + skills/README.md).
- LENH: `powershell -NoProfile -ExecutionPolicy Bypass -File <scratchpad>/c2b.ps1` => **TOTAL_C2 = 15** — TRÙNG KHÍT con số máy (15). Tái-lập được ⇒ số máy đáng tin, và tao có line-ref để phán từng dòng.
- Phân rã (máy chỉ cho tổng; đây là line-level):
  - `contract-workflow/SKILL.md` **×6** — `:24` "3 bảng" (schema-pattern) · `:35` "6 test PE 2-stage" · `:332` "6 test PE N-stage" + "6 test Contract N-stage" (2 match CÙNG dòng) · `:367` n=77 · `:371` "3 bảng" (ApprovalWorkflowsV2).
  - `ef-core-migration/SKILL.md` **×7** — `:100` "2 migration tách" · `:101` "1 migration GỘP" · `:109` "4 bảng" Budget-defer · `:117` "3 bảng" · `:120` "1 bảng riêng" · `:168` "Revert **1 migration**" (heading) · `:185` "Script từ **1 migration** → latest" (comment lệnh).
  - `CLAUDE.md:93` "6 test" · `commands/session-end.md:251` "vd 130 → 132".
- **Lý do phán dương-giả:** không dòng nào khai TỔNG-trạng-thái. Chúng là (i) đếm module-local của 1 test-class/1 nhóm bảng, (ii) **danh-từ đếm trong CÂU LỆNH/heading** (`Revert 1 migration`, `Script từ 1 migration`) — đây là *đơn-vị*, không phải count, (iii) ví-dụ minh-hoạ (`vd 130 → 132`). Cả 15 đã bị chính máy hạ LOW đúng theo ratio-band H18-A (xa canonical ⇒ LOW = advisory).
- 🔴 **KHÔNG đề-xuất vá 15 dòng này.** Vá = viết lại văn-xuôi cho vừa detector = **rời tập-đo** (Goodhart): flag-count tụt trông như thành-công nhưng cái mất đi là ngữ-nghĩa module-local, còn năng-lực bắt stale-total thì y nguyên. Giữ nguyên, coi là nền LOW đã-hiểu.

### 1d. Last-touch + 2 mục còn lại của mặt ①
- LENH `git log --oneline -6 -- .claude/skills/` => `1b85713` (closeout S151) là commit gần nhất chạm skills/ ⇒ **0 commit chạm skills sau S151**. Trước đó `a09dcae` (W4 positive-control) · `e88e75d` (S118).
- LENH `ls -la .claude/skills/*/SKILL.md` => contract-workflow 24.452B (May 8) · dependency-audit-erp 5.551B (Jun 18) · ef-core-migration 33.773B (**Jul 25** = vá S151) · form-engine 5.450B (Apr 30) · iis-deploy-runbook 14.688B (Jun 25) · permission-matrix 7.864B (Jul 15).
- **permission-matrix — nợ S119 ĐÃ ĐÓNG:** LENH `sed -n '1,20p'` + `grep -n "menu|polic"` => `:3` frontmatter + `:17` đều đã chuyển **B1-pointer** ("số menu-key · policy canonical → docs/STATUS.md, **KHÔNG chép số ở đây**") + `:18` dạy đếm-thật từ `MenuKeys.cs:147` + `:26` bia-mộ `Bg_*` XOÁ-S61 (vá @S122 W4). ⇒ stale-S119 (liệt `Bg_*` như menu SỐNG) **CLOSED**, không tái-mở.
- form-engine `2026-04-30` = LOW title-stale máy (H24-1) — tao **xác nhận** bằng mtime `Apr 30 01:12` + 5.450B. Không phải phát hiện mới, không nâng cấp.

## FLAG-1 — `view-stale-count` — LOW
`.claude/skills/permission-matrix/SKILL.md:42` — heading `## Menu tree (seed — ~60 key sau Phase 8)`.
- LENH `grep -n "menu|polic|[0-9]{2,3}" .claude/skills/permission-matrix/SKILL.md` (hit :42) · canonical `docs/STATUS.md` row `Menu keys` = **54** (baseline canonical-resolve `menu=54`).
- Vấn đề KHÔNG phải "lệch 6". Vấn đề là **cùng file, `:17` tự ra luật "KHÔNG chép số vào file này" (B1) mà `:42` vẫn giữ một con số** — dạng hedge `~60` nên detector C2 mù (regex đòi `(\d+)\s*menu`, đây là "60 key"). Tự-mâu-thuẫn nội-bộ, không phải drift ngoài.
- Đề-xuất (owner/lead quyết): bỏ `~60 key` → `## Menu tree (seed sau Phase 8)`. Rẻ, giữ trọn ngữ-nghĩa "hình-dạng", và làm `:17` đúng với chính nó.

## 2. MẶT ② SUB-ROLE — **PASS** (4 nguồn khớp, 0 dead-name sống)

### 2a. Roster count — đếm PHẦN TỬ, không grep số
- LENH `ls -1 .claude/agents/*.md | grep -v README | wc -l` => **20**.
- LENH `node -e` (regex bắt khối `const VALID_ROLES = [...]` rồi `matchAll` literal `'...'` → `.length`) => **VALID_ROLES element-count = 20** (KHÔNG đọc con số nào trong comment — đếm phần tử thật).
- **Set-diff 2 chiều = RỖNG:** `in VALID_ROLES not on disk: []` · `on disk not in VALID_ROLES: []`. Đây là kiểm mạnh hơn so-số: 20=20 mà lệch tên vẫn lọt, set-diff thì không.
- `docs/STATUS.md:452` row `| Sub-agents | **20** |` · `docs/STATUS.md:465` state-line "Sub-agents 20". ⇒ **4 nguồn: đĩa 20 = VALID_ROLES 20 = STATUS:452 20 = STATUS:465 20.**
- LENH `git log` — 0 commit chạm `.claude/agents/` sau `1b85713`. Diff vs S151: **0 THÊM / 0 ĐỔI / 0 XÓA**.

### 2b. Skill-matrix có theo kịp roster không (S143 từng vá 15→17, roster sau đó lên 20)
- LENH `sed -n '176,197p' .claude/agents/README.md` => matrix `| Agent | Skills |` có **đủ 20 row**, GỒM 3 vai S145 mới nhất: `ring1-audit` `:195` · `ring2-audit` `:196` · `ring4-audit` `:197` (đều `ref-only` + ghi `no-self-exempt`). Header `:174` = "Skill assignment (6 skill, re-distributed S39)" — **không hardcode số vai** ⇒ không tự-lão-hoá. **Nợ S143 CLOSED và không tái-sinh khi roster 17→20.**

### 2c. Residual TÊN CHẾT ngoài vùng FROZEN — soi thật, kết luận: **0 ca dùng-sống**
- LENH `grep -rn "tooling-harvest-audit|h24-audit|sleep-audit|lead-view-auditor|lead-omission-auditor"` trên 8 bề-mặt SỐNG (`.claude/agents/` · `.claude/commands/` · `hmw.js` · `scripts/` · `memory-budget.json` · `.claude/skills/` · `CLAUDE.md` · `docs/HANDOFF.md`) => **10 hit**. Tao mở TỪNG hit (không kết luận từ số):
  - `scripts/closeout-sentinel.ps1:67-68` — LENH `awk 'NR<=72 && /<#|#>/'` => `1: <#` ⇒ 2 hit này **nằm trong block-comment mở từ dòng 1**, nội dung là *bằng-chứng thiết-kế* ("S148 `932d607` touched lead-view-auditor/ + lead-omission-auditor/ — the OLD names"). **mention, không phải use.**
  - `scripts/governance-detectors.ps1:1708` — comment granularity-note nhắc file `sub-h24-audit-*.md` từng tồn tại trong folder frozen. Tao soi tiếp phần CODE ngay dưới (`:1722-1730`): danh-sách vai đọc **LIVE từ frontmatter** (`$informRoles` ← `Get-ChildItem .claude\agents -Filter *.md` trừ README) ⇒ **derive-from-source, không hardcode tên** ⇒ đổi tên vai KHÔNG làm hỏng detector.
  - `docs/HANDOFF.md:16/:18/:25` (+4 hit vùng Prev/carry) — đều là **ghi-chép việc đã xảy ra** ("`lead-omission-auditor` FLAG-1 `gap-decision-sunk`" @S148, "bắt @S146").
- 🔴 **Phán theo luật S143 (prescriptive ⟂ frozen):** 10/10 là **frozen-record hoặc mention**, 0 hit ở vị-trí prescriptive (0 trong `hmw.js` code · 0 trong 20 persona · 0 trong `memory-budget.json` · 0 trong commands). **Sửa chúng = giả-mạo lịch-sử ⇒ ĐỀ-XUẤT: KHÔNG SỬA.** Nợ M-1 S150 (ô canonical giữ tên chết) đã đóng: `STATUS:452` nay dùng tên MỚI ở vị-trí mô-tả-trục, tên cũ chỉ còn trong **bảng-mapping rename** (`lead-view-auditor`→`lead-stale-auditor`) — đó là chỗ tên cũ BẮT BUỘC phải có.

## 3. MẶT ③ PLUGIN — **PASS** (registry 0-delta) + 1 nấc-đo phải khai riêng
LENH `sed -n '1,45p' ~/.claude/settings.json` (user-global — **authority ③**; project `.claude/settings.json` chỉ có hooks, KHÔNG override plugin/model).
- **installed/registered = 18** entry `enabledPlugins` · **enabled = 15** (`true`) · **disabled = 3** (`false`): `pr-review-toolkit` · `code-modernization` · `hookify`. **IDENTICAL sổ S140/S143** ⇒ 0 THÊM / 0 ĐỔI / 0 XÓA.
- **assigned:** `.claude/agents/README.md:213-220` bảng H3 map 6 nguồn → vai (sql-database-assistant → inv-cb+impl-be · frontend-design → frontend-designer · skill-creator → mọi sub · claude-md-management → em main · pr-review-toolkit → reviewer dạng CHECKLIST · session-report → em main/cicd) + khối "KHÔNG enable" 4 mục có lý-do. **used** = per-session auto-trigger, KHÔNG suy từ enabled. 4 nấc **installed → enabled → assigned → used** khai tách, không conflate.
- **Standalone skill: 23** — LENH `ls -1 ~/.claude/skills | wc -l` => 23. Khớp sổ, 0 delta.
- **🔴 Marketplace = LỚP ĐO RIÊNG (bài tự-soi S143, tao từng bỏ sót lớp này ≥5 ngày ở S140):** LENH `ls -1 ~/.claude/plugins/marketplaces/claude-plugins-official/plugins | wc -l` => **37**. S143 đo 37 ⇒ **0 net delta**. ⚠️ Khai trung-thực: **count trùng KHÔNG chứng được set trùng** (tao không giữ list S143 để so tên); tao dán nguyên list 37 tên vào đây làm mốc cho phiên sau so-tên được: agent-sdk-dev clangd-lsp claude-code-setup claude-md-management code-modernization code-review code-simplifier commit-commands csharp-lsp cwc-makers example-plugin explanatory-output-style feature-dev frontend-design gopls-lsp hookify jdtls-lsp kotlin-lsp learning-output-style lua-lsp math-olympiad mcp-server-dev mcp-tunnels php-lsp playground plugin-dev pr-review-toolkit project-artifact pyright-lsp ralph-loop ruby-lsp rust-analyzer-lsp security-guidance session-report skill-creator swift-lsp typescript-lsp.
- **NEW-ALLOC:** 0 skill/plugin MỚI ⇒ **0 action**. Carry duy nhất: `security-guidance` (có mặt marketplace, KHÔNG enable) — vẫn đáng cân-nhắc gán `reviewer`, **nhưng nó mang hook Stop + edit-time warning ⇒ đụng `settings.json` hooks ⇒ quyền owner, tao KHÔNG tự bật** (giữ nguyên phán S143).
- **📌 2 nợ S143 mặt-③ ĐÓNG (đo được, không suy):** `settings.json:11` nay = `"model": "claude-opus-5[1m]"` (S143 đo `claude-opus-4-8[1m]`) ⇒ (a) **F-C model-pin-flip-unlogged CLOSED** — `STATUS:452` đã ghi "Lead = **DEFAULT Opus 5 MAX** (thư `59ce1d0f` @S149)" + `commands/session-start.md:40` VALUE-update cùng broadcast ⇒ sổ khớp pin. (b) **recipe-no-op CLOSED** — `session-start.md:43` outage-path nay bảo "GIỮ `/model claude-opus-4-8[1m]`" trong khi pin = `opus-5` ⇒ fallback trỏ model KHÁC pin ⇒ recipe **có tác-dụng thật**, hết no-op.
- Không xung đột với baseline: `machine-baseline.md:43` "Lead phiên S152 = Fable 5 (anh launch)" = **owner-choice per-session**, khác `settings.json` = **default-fleet**. 2 nấc khác nhau, cả 2 đều đúng.

## 4. MẶT ④ DOCS FRESHNESS — **PASS_WITH_FLAGS**

### 4a. `docs/STATUS.md` bảng CURRENT STATE, phần H1-turf
- LENH `grep -n "^| Skills|^| RAG" docs/STATUS.md` => `:451` `| Skills | 6 | 3 domain + 3 ops |` — **ĐÚNG** (đĩa 6 skill, phân 3 domain [contract-workflow · form-engine · permission-matrix] + 3 ops [dependency-audit-erp · ef-core-migration · iis-deploy-runbook]). 0 drift.
- `:452` Sub-agents **20** — khớp (mục 2a).
- `:453` `| RAG chunks | **2447** | re-verify S151 ...` vs `machine-baseline.md:41` đo TƯƠI **2448** ⇒ lệch **+1**. Xem FLAG-2 (nhẹ, và có lý-do).

### 4b. `agents/README.md:27` — ⓘ diagram 7-lane: **khai VẪN ĐÚNG**
Tao kiểm chính câu khai, không tin nó vì nó tự khai. LENH `sed -n '28,60p' .claude/agents/README.md`:
- Diagram legend cuối khối => **7 màu** `cyan blue yellow orange purple red green` = **7 lane** ⇒ "7 core lane (pre-S47 snapshot)" **đúng**.
- Câu ⓘ liệt **NHÓM + TÊN** 13 vai post-S47 (fd · db · office · H1 · H2 · 2×H24 · 3×trio · 3×ring) + "7 core (diagram)" = 20, và chốt "Số vai canonical → `docs/STATUS.md` §Sub-agents" ⇒ **B1-sạch, 0 số cứng** ⇒ không tự-lão-hoá kiểu "17/17" (bài S143/S151).
- Header hộp lead trong diagram = "lead default **Opus 5 MAX** (owner /model·/fable-real)" ⇒ đã theo broadcast S149. ⇒ phần "cosmetic ASCII chưa vẽ lại" chỉ còn đúng nghĩa **lane-box chưa thêm 13 vai**, và nó tự khai đúng vậy. **KHÔNG phải drift** — là nợ-cosmetic đã-khai; tao báo theo đúng chỉ-thị `:27` ("H1 flag drift này @session-start") chứ không nâng thành FLAG mới.

## FLAG-2 — `view-stale-count` — LOW
`docs/STATUS.md:453` RAG chunks **2447**, đo tươi @S152 = **2448** (LENH: `machine-baseline.md:41`, nguồn `list_projects`).
- Không phải lỗi ai: row có **stamp** "re-verify S151" ⇒ đọc đúng là *"2447 tại S151"*, và nó đúng tại S151. Đây là con số **tự nhích** mỗi lượt `store_memory` của lead.
- Đề-xuất: refresh 2447→2448 ở closeout S152 (việc thường-lệ, KHÔNG cần gate). **KHÔNG đề-xuất bỏ stamp** — stamp chính là thứ giữ row này khỏi thành lời-nói-dối.

## FLAG-3 — `view-stale-count` — LOW (máy flag SAI LÝ-DO; chỗ đúng nằm ngay cạnh)
`CLAUDE.md:93` — `Application/                  (6 test - PeWorkflowDefinition versioning)`.
- Máy (C2) flag vì "6 test ≠ canonical 532". **Phán của tao: dương-giả ở lý-do đó** — dòng này không khai tổng, và khối ngay trên đã B1-pointer ("Unit test pass — số hiện tại → docs/STATUS.md (canonical)").
- **NHƯNG mở thư-mục ra thì có stale THẬT mà detector không thể thấy:** LENH `ls -1 tests/SolutionErp.Infrastructure.Tests/Application/` => **38 file** (`AttendanceReportTests` · `ItTicket*` ×3 · `Hrm*` ×3 · `Pe*` ×13 · `Supplier*` · `WorkflowAppApproveV2Tests` …). Mô-tả `(6 test - PeWorkflowDefinition versioning)` là hình-dạng **thời S9**; nay folder trải HRM/Office/IT-ticket/PE/Supplier. Cái lệch là **NGỮ-NGHĨA mô-tả**, không phải con số.
- 🔴 **Nhưng biết chỗ KHÔNG sửa:** heading khối là `## 🧪 Tests (Phase 9 — Session 9 +6)` ⇒ khối **có stamp S9** ⇒ đọc như *ảnh chụp lịch-sử* thì hợp-lệ. Hai cách đọc đều đứng được ⇒ tao **không tự quyết**, trình owner/lead 2 phương-án: (i) giữ nguyên vì đã stamp; (ii) rẻ hơn và hết nhập-nhằng: bỏ 2 chú-thích đếm trong cây (`(6 test - …)` · `(17 codegen + 6 PE 2-stage approval S9)`), giữ tên folder — cây vẫn làm đúng việc định-hướng.
- Tao KHÔNG dùng số `[Fact]/[Theory]` để khai số test (Theory expand runtime — luật của chính tao); "38 file" là đếm FILE, và đó là bằng-chứng đủ cho claim "mô-tả không còn khớp".

## FLAG-4 — `view-stale-count` — LOW (delta lớp command)
`.claude/commands/` = **19 file** (LENH `ls -1 .claude/commands/*.md | wc -l`) — sổ MEMORY của tao ghi **18** (mốc S111).
- LENH `git log --diff-filter=A --name-only -- .claude/commands/` => 3 file thêm gần nhất: `snapshot.md` · `pause.md` · `fable-clone.md`. ⇒ delta 18→19 là **`snapshot.md`** không nằm trong mốc S111 của tao.
- Đây là **sổ TAO stale**, không phải repo drift (không doc nào hardcode "18 command"). Ghi ra để đúng luật "diff vs last-session" và để phiên sau có mốc **19**. 0 đề-xuất sửa file repo.

## ⓘ INFORM (không phải FLAG)
1. **FLAG-khuôn C11 áp lên vai H1 = vốn-từ chưa vừa.** `run.md:11` buộc class ∈ enum ĐÓNG `lead_self_audit.flag_classes` (5 `view-*` + 6 `gap-*`) — enum đó thiết-kế cho **bề-mặt LEAD** (H24), còn tao báo **tooling/docs**. Tao chọn `view-stale-count` cho cả 4 FLAG vì nó gần nhất, và **KHÔNG tự chế class** (luật CLOSED-enum; S143 vai lead-gap từ-chối tự chế + escalate là đúng). Khai ra để owner biết đây là **vốn-từ bị kéo giãn**, không phải 4 finding cùng bản-chất. Mở enum / cho H1 vốn-từ riêng = quyền owner.
2. **Nợ S151 F-6 (#111 dương-giả C1 nhánh no-#) — không tái-phát ở lớp skill/docs của tao phiên này.** Ca C1 MED duy nhất trong baseline (`sessions/2026-07-25-1930-S151-...:25` cite #91 vs max 83) nằm ở **session-log** = frozen-record, và là **turf H24/lead**, không phải turf tao ⇒ tao KHÔNG lấn, chỉ ghi nhận đã đọc.
3. Skills/agents đều **0 commit chạm sau `1b85713`** ⇒ mặt ①② tĩnh hoàn toàn từ S151; mọi thay đổi phiên này (nếu có) sẽ là do S152 tạo ra.

## Verdict

**PASS_WITH_FLAGS** — 4 FLAG (4 LOW · 0 MED · 0 HIGH · 0 CRITICAL) + 3 INFORM. 0 FAIL. 0 việc tự sửa (propose-only, đúng luật).

| Mặt | Verdict | Finding |
|---|---|---|
| ① Skill | **PASS** | 1 LOW (FLAG-1 `permission-matrix:42` "~60 key" tự-mâu-thuẫn B1). Nợ S151 (row Mig 67) **CLOSED verified** `ef-core-migration/SKILL.md:89`; C2 15 LOW **tái-lập TOTAL=15 khớp máy → 15/15 DƯƠNG-GIẢ** có line-ref; nợ S119 permission-matrix **CLOSED** @S122 |
| ② Sub-role | **PASS** | **0 finding.** 4 nguồn 20=20=20=20 + **set-diff 2 chiều RỖNG**; skill-matrix 20/20 row (nợ S143 không tái-sinh); 10 hit tên-chết = **10/10 frozen/mention, 0 dùng-sống** ⇒ đề-xuất KHÔNG SỬA |
| ③ Plugin | **PASS** | **0 finding.** 18/15/3 IDENTICAL · standalone 23 · **marketplace 37 (lớp đo riêng, đo có chủ-đích)** · new-alloc 0 action. **2 nợ S143 CLOSED** (pin `claude-opus-5[1m]` đã ghi sổ @S149 · outage-recipe hết no-op) |
| ④ Docs | **PASS_WITH_FLAGS** | 3 LOW: FLAG-2 RAG 2447→2448 (row có stamp, refresh @closeout) · FLAG-3 `CLAUDE.md:93` máy-flag-sai-lý-do nhưng **mô-tả cây tests lệch thật** (Application/ = 38 file, mô-tả còn "PeWorkflowDefinition") · FLAG-4 sổ-tao 18→**19** command. `STATUS:451` Skills-6 ĐÚNG · `README:27` ⓘ 7-lane **khai vẫn đúng** (legend 7 màu, B1 0-số-cứng) |

**DIFF vs S151 (8 finding → nay 4 LOW):** đóng `ef-core Mig 67` (chính TRƯỢT-1 của tao @S151) · F-6 dương-giả không tái-phát · +2 nợ S143 mặt-③ đóng · 0 finding mới ≥MED. Hướng: **freshness đang lên**, phần còn lại là nền LOW đã-hiểu (C2 soft-net) + 1 con số tự-nhích (RAG).

**Tự-soi (bài S151 TRƯỢT-1 = tao PASS mặt ① khi ef-core còn thiếu row):** phiên này tao **không** kết PASS mặt nào từ suy-luận — mặt ① mở đúng file + grep chuỗi đích, mặt ② đếm phần-tử + set-diff, mặt ③ đọc `settings.json` + `ls` marketplace, mặt ④ mở `tests/Application/` đếm file thay vì tin nhãn. Mỗi số trên có LỆNH kèm ngay cạnh.
