Files
solution-erp/.claude/workflows/runs/2026-08-01-S166-h24-deep-midsession/sub-lead-stale-deep-S166.md
2026-08-01 09:14:40 +07:00

280 lines
29 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.

LEAD-STALE-DEEP: 11 FLAG (4 HIGH/5 MED/2 LOW) — coverage 8/8 chạm, 2/8 PARTIAL (nhóm 7 persona 2/23 · nhóm 8 chỉ cặp FE) ⇒ 11 = SÀN
# H24 DEEP-audit @S166 (2026-08-01) — vai `lead-stale-auditor`
- Nhịp: OVERDUE(deep) tra-nợ, counter 40, deep_at cũ 25 (15/15 quá hạn)
- Chế-độ: read-only, INFORM-only, propose-only
- Nền máy: `detectors-output.txt` cùng folder (TOTAL 51 + 10 INFORM) — ĐỌC làm nền, KHÔNG chạy lại
- Enum class: `lead_self_audit.flag_classes` họ `view-*` (5 class ĐÓNG)
## Coverage (khai TRƯỚC, cập nhật dần)
| # | Nhóm bề-mặt | Trạng thái |
|---|---|---|
| 1 | `docs/STATUS.md` CURRENT + bảng CURRENT STATE | DONE |
| 2 | `docs/HANDOFF.md` segment mới nhất | DONE |
| 3 | `CLAUDE.md` root (bảng module/mig) | DONE |
| 4 | `.claude/agents/README.md` roster | DONE — SẠCH |
| 5 | `docs/changelog/migration-todos.md` | DONE |
| 6 | Governance surfaces `docs/governance/*.md` | DONE |
| 7 | Mô-tả VAI `.claude/agents/*.md` | 🔴 **PARTIAL** (chỉ soi có-mục-tiêu `cicd-monitor` + `test-specialist`; **KHÔNG** quét 23/23 persona) |
| 8 | Dư-lượng bất-đối-xứng (mirror pairs) | 🔴 **PARTIAL** (chỉ cặp `fe-admin``fe-user` trên 3 commit K; **KHÔNG** soi cặp spec-cụm⟂WAL) |
---
## FLAG-1 — `view-residual-asym` — HIGH
**view:** `docs/STATUS.md:465-472` (bảng CURRENT STATE — ô CANONICAL theo B1)
**source:** `docs/STATUS.md:6` (dòng CURRENT, cùng file) + đĩa
Wave K1→K3 (`50e6d8c`/`0779f2d`/`15349e8`, S164-S165) cập-nhật **dòng :6** đủ 5 số mới nhưng **KHÔNG chạm 1 ô nào của bảng canonical**. Một file, hai bề mặt, sửa đúng một phía.
| Row bảng canonical | View nói (chuỗi THẬT trên đĩa) | Source đúng | Lệch | Máy có bắt? |
|---|---|---|---|---|
| `:465` Migrations | `\| Migrations \| **69** \|` | **71** (đếm đĩa `Persistence/Migrations/*.cs` trừ Designer/Snapshot = 71; mới nhất `20260731085624_AddKhkkApprovalGroupCatalogAndFinalizeRuntime.cs`) | 2 | ✅ CÓ (`canonical-itself-stale`) |
| `:466` SQL tables | `\| SQL tables \| **96** \|` | **97** (Mig 70 `AddContractCatalogEntries` = **1** `CreateTable`; Mig 71 = **0** `CreateTable`/`DropTable` ⇒ 96+1) | 1 | ❌ MÙ |
| `:470` Policies | `\| Policies \| **220** \|` | **256** (= 64 key × 4 action; `.claude/WAL.md:13` "policy=256") | 36 | ❌ MÙ |
| `:471` Menu keys | `\| Menu keys \| **55** \|` | **64** (ĐẾM PHẦN-TỬ mảng `MenuKeys.All`, `MenuKeys.cs`**KHÔNG** dùng `grep -c "public const string"` ra **65**, bài S143/S150) | 9 | ❌ MÙ |
| `:472` Tests | `\| Tests \| **590 PASS** \| 45 Domain + 545 Infra` | **614** (45D+569I — `.claude/WAL.md:13` `suite 614/0 (45D+569I)` + `:37`) | 24 | ❌ MÙ |
🔴 **Vì sao nguy (hơn hẳn "5 con số cũ"):** `governance-detectors.ps1` `Get-StatusValue` **resolve canonical TỪ chính bảng này** (chính row `:470` tự khai điều đó). Cross-check đĩa của máy CHỈ phủ `mig` + `gotcha` (`detectors-output.txt:4` = `disk cross-check: mig=71 gotcha=85`) ⇒ 4 trục còn lại đo bằng **thước sai** mà máy vẫn in `[ok]`. Hệ-quả đo được ngay trong lượt này: `detectors-output.txt:14` bảo `.claude/skills/ef-core-migration/SKILL.md:93` "writes **97** table but canonical=**96** → resolve: update to 96". Doc đó đang ĐÚNG (97) và máy đang đề-nghị sửa nó thành SAI. **Canonical-poison không chỉ giấu lỗi — nó chủ-động sinh lệnh sửa-ngược.**
**resolve:** re-ground 5 ô `:465/:466/:470/:471/:472` về 71 / 97 / 256 / 64 / 614 (bao gồm sub-số `45D+569I`), rồi chạy lại detector — kỳ vọng FLAG `SKILL.md:93` biến mất và TOTAL đổi.
---
## FLAG-2 — `view-stale-count` — HIGH
**view:** `docs/STATUS.md:479` — chuỗi THẬT: `**Bundle hash live (prod):** admin **\`B43R6Y17\`** · user **\`NLI5umBg\`** … **Đo LIVE bằng curl 2026-07-31 @S164**`
**source:** `.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-cicd-verify-k3.md:86,88` — POST-deploy đo LIVE 31/07 18:26-18:27 +07: admin `index-mySTlx42.js` **ROTATE** · eoffice `index-CZAYiWWa.js` **FROZEN**
Lệch: view nói `B43R6Y17`/`NLI5umBg`, source nói `mySTlx42`/`CZAYiWWa`. **0/2 khớp.**
🔴 Nặng gấp đôi vì hai lẽ:
1. `docs/STATUS.md:6` cố ý **KHÔNG chép** số bundle mà trỏ *"canonical ở `:479`"* (đúng B1) ⇒ ai tuân B1 sẽ đáp thẳng vào ô sai. Đây là **con trỏ tốt tới nội-dung hỏng** — nguy hơn số rời rạc vì nó được cả hệ tin.
2. Chính vai cicd **đã nói ra** rồi mà chưa ai lật sổ: `sub-cicd-verify-k3.md:93-94` viết nguyên văn *"Đính chính mốc PRE trong đề bài: spec giao việc ghi baseline `admin B43R6Y17 · user NLI5umBg (@S164)` — KHÔNG khớp gì đo được"*. Phát-hiện đã tồn tại **trên đĩa**; khoảng cách nằm ở chỗ nó chưa đi từ run-folder về sổ owner-facing (đúng lớp bài S162: *nơi lead làm việc ≠ nơi anh đọc*).
Ghi chú danh-pháp (đừng lẫn khi vá): `:479` gọi app thứ hai là **user**, cicd gọi **eoffice** — cùng site, khác tên. Nếu vá thì thống nhất một tên, kẻo sinh vocab-fork mới.
**resolve:** `:479` = admin `mySTlx42` · user/eoffice `CZAYiWWa` (FROZEN, không phải ship-fail — cicd §5 dự-đoán TRƯỚC khi đo), kèm mốc 2026-07-31 18:26 +07 sau run #436. Hết flag khi hash ở `:479` khớp lần curl mới nhất.
---
## FLAG-3 — `view-stale-count` — LOW
**view:** `docs/STATUS.md:6` — chuỗi THẬT: `counter **39**`
**source:** `.claude/governance/.session-counter.json` → `counter = 40` (`last_ticked_head` = `24ea71e2…` = HEAD hiện tại, session S166; detector `H24-5` xác nhận `[OK] OK-reachable`)
Lệch 39 vs 40 (1). SEV LOW **có điều kiện**: đây là stale **biết-trước** giữa phiên (S166 vừa tick, STATUS được re-stamp ở closeout). Ghi FLAG để tally by-class không mất mẫu, KHÔNG phải để đòi vá ngay.
🔴 Nhưng đừng đọc thành vô hại: `counter` là **đầu vào của chính nhịp H24** (`h24_cadence.deep_every`). Một sổ owner-facing trình sai counter làm owner không thấy được món nợ `deep` 15/15 mà chính lượt này đang trả. Nếu closeout quên bump, LOW này lặng lẽ sống tiếp.
**resolve:** re-stamp `counter 40` ở closeout S166; hoặc bỏ hẳn con số khỏi `:6` và trỏ khoá `.session-counter.json` (kiểu B1 mà `:6` đã dùng đúng cho bundle).
---
## Nhóm 4 — `.claude/agents/README.md` roster: SẠCH (đã chạm, có control)
NEXT-em #5 (`HANDOFF.md:33`) tố `README:242` tự xưng *"ĐỦ roster"* liệt **20 tên** / thật **23**, kèm *"10 monitor"* / thật **13** — **ĐÃ VÁ**, xác nhận bằng ĐẾM PHẦN-TỬ (không grep-theo-số, bài S143):
- Control đĩa: `ls .claude/agents/*.md` = **24 file**, trừ `README.md` ⇒ **23 vai**.
- `README.md:242` (dài 1.788 B) liệt đúng **23** tên `investigator-codebase … ctx-audit`, và tự khai `Cả **13** monitor … 13 + 10 worker = roster 23` — 13+10 = 23 ✅, khớp đĩa.
- `README.md:27` ("Roster THẬT") liệt 7 core + **16** tên rời = **23** ✅.
- Đối-chứng nguồn thứ hai: `hmw.js:22` `VALID_ROLES` liệt cùng bộ tên (đã strip comment) ⇒ 2 bề-mặt README ⟂ hmw.js không lệch.
- Không phát FLAG con-số-vắng-mặt: `README:3` + `:5` + `:242` cố ý **BỎ số**, chỉ trỏ `STATUS §Sub-agents` (B1) — đúng luật, không phải thiếu sót.
---
## FLAG-4 — `view-stale-count` — MED
**view:** `CLAUDE.md:70` — chuỗi THẬT: `| **ContractSigningPlans (Kế hoạch Ký kết HĐ — KHKK)** | \`Domain/ContractSigningPlans/\` | **69** | … **Mig 69 \`AddContractSigningPlans\` (S161, 7 bảng, 89→96)**`
**source:** đĩa `src/Backend/SolutionErp.Infrastructure/Persistence/Migrations/` — `20260731085624_AddKhkkApprovalGroupCatalogAndFinalizeRuntime.cs` (**Mig 71**, chính là KHKK: nhóm duyệt N1-N8 + Line hạng-mục + unique 3-cột)
Lệch: ô Migration của module KHKK nói **69**, thật là **69, 71**. Và `CLAUDE.md:62` ("Lịch sử mig gần đây") dừng ở `+S161 Mig 69` — `grep "Mig 70\|Mig 71\|AddContractCatalog\|AddKhkkApproval" CLAUDE.md` = **0 hit** trên cả file.
🔴 Vì sao nguy: `CLAUDE.md` root là 1 trong 5 file *"đọc trước tiên"* của mỗi phiên và là thứ **auto-inject**. Nó đang dạy mỗi phiên mới rằng KHKK = 1 migration, trong khi K2 vừa thêm bảng nhóm-duyệt vào chính module đó ⇒ phiên sau đụng KHKK sẽ suy-luận schema trên bản-đồ thiếu. Đây cũng là **đợt-2 của cùng một vết**: NEXT-em #6 (`HANDOFF.md:34`) từng tố ":62/:69 thiếu mig 68+69"; 68/69 đã được nhét vào, rồi 70/71 lại rơi ra ⇒ vá-theo-số-cụ-thể chứ không vá-cơ-chế, nên vết tái sinh mỗi wave.
Ghi chú ranh-giới: module `ContractCatalog` (Mig 70) **không có row** trong bảng Modules — cái VẮNG là turf `lead-gap-auditor`, tôi chỉ nêu làm ngữ-cảnh, KHÔNG tính vào FLAG này.
**resolve:** ô `:70` ghi `69, 71`; `:62` bổ-sung Mig 70/71 (hoặc — bền hơn — cắt hẳn khối "lịch sử mig" khỏi `CLAUDE.md` và trỏ `docs/STATUS.md`, đúng câu B1 mà chính `:62` đang tự tuyên).
---
## FLAG-5 — `view-stale-header` — MED
**view:** `docs/HANDOFF.md:5` — chuỗi THẬT: `**🆕 Last updated:** 2026-07-30 trưa (**S161→S162** — phiên-LOGIC **L8** window-3 … window-4 …)`
**source:** `docs/STATUS.md:6` — `**🔥 CURRENT (S161→S162 + S164/S165 2026-07-31 — phiên-LOGIC **L9** …)`; đĩa: run-folder `2026-07-30-S163-bookend-open/` + `2026-07-31-S164-4gd-khkk-fanout/`; hôm nay **2026-08-01**
Lệch: HANDOFF neo **S162 / L8 / 2026-07-30**, source đã sang **S166 / L9 / 2026-08-01** — trễ **4 nhãn phiên, 1 phiên-LOGIC, 2 ngày**. Kèm `:27` `## 🔴 NEXT em @S163` (nhãn S163 sống trên thân S166).
🔴 Vì sao nguy: `HANDOFF.md` là file thứ **2** trong "5 file đọc trước tiên" và là **segment-mới-nhất** mà `tiep_reload.sources` nạp mỗi `/tiep`. Cả 3 việc lớn của L9 (K1/K2 ship prod, K3 code+gate, Mig 70/71) **không có mặt** ở đây ⇒ phiên sau `/tiep` đọc brief 5-phút và tưởng mạch đang ở cây-4-folder S162.
⚠️ Ghi nhận đối-chứng để KHÔNG thổi phồng: đây là audit **giữa phiên**, HANDOFF thường re-stamp ở closeout. Nhưng S163→S165 đã ĐÓNG mà `:5` vẫn không bump ⇒ không giải thích được bằng "chưa tới closeout" — đã bỏ lỡ **ít nhất 2 closeout**.
**resolve:** bump `:5` sang segment L9 (S163→S166) + đổi `:27` thành `@S166`; hết flag khi nhãn ở `:5` ≥ nhãn ở `STATUS.md:6`.
---
## FLAG-6 — `view-stale-status` — MED
**view:** `docs/HANDOFF.md:33` (mục NEXT-em #5) — chuỗi THẬT: `5. \`agents/README.md:242\` tự xưng "ĐỦ roster" liệt **20 tên** / thật **23** (thiếu đúng bộ-ba \`ctx-*\`, sống 9 nhãn phiên) + "10 monitor" / thật **13**. *(lead-stale FLAG-11/12)*`
**source:** `.claude/agents/README.md:242` **hiện tại** liệt đủ **23** tên (có cả `ctx-curator`/`ctx-verifier`/`ctx-audit`) và ghi `Cả **13** monitor … 13 + 10 worker = roster 23`
Lệch: view treo việc như **CHƯA LÀM**, source chứng **ĐÃ LÀM XONG**. Cùng lớp cho `#6` (`:34`): vế `CLAUDE.md:62/:69 thiếu mig 68+69` cũng đã đóng (nay thiếu 70/71 — xem FLAG-4), tức mục này đúng **một nửa** mà không tách được nửa nào.
🔴 Vì sao nguy: khối `NEXT em (không cần anh gật)` là danh sách **tự-hành** — em-main phiên sau đọc và thi hành mà không hỏi ai. Một mục đã-xong nằm lại đó ⇒ tiêu một lượt làm việc để "vá" thứ đang đúng, hoặc tệ hơn là **vá ngược** (đây đúng cơ-chế đã thấy ở FLAG-1: máy bảo sửa `SKILL.md` 97→96). Đây là lặp lại nguyên class S140 (`view-stale-status` trên forward-pointer NEXT-em).
**resolve:** tick/gỡ #5, tách #6 thành phần-đã-đóng (68/69) và phần-mới (70/71); hết flag khi mọi mục còn lại trong khối NEXT-em đều chưa-thi-hành trên đĩa.
---
## FLAG-7 — `view-stale-count` — HIGH
**view:** `docs/HANDOFF.md:15` slot **(57)/(51-bis)** — chuỗi THẬT: `\`cicd-monitor/archive/_INDEX.md\` đo lại @S162 = **99,18% / headroom 167 B** … Vế (c) "chấp nhận vỡ cap ~1-2 phiên nữa" thực chất **còn đúng 1 dòng append**. Chọn: **(a)** split file · **(b)** nâng cap · **(c)** để vỡ.`
**source:** đĩa đo @S166 2026-08-01 — `.claude/agent-memory/cicd-monitor/archive/_INDEX.md` = **20.731 B** / cap `memory-budget.json` → `tiers.l2_index.cap_bytes` = **20.480** ⇒ **101,23 % · headroom 251 B**
Lệch: view nói *"còn đúng 1 dòng append"*, source nói **ĐÃ VỠ RỒI** (âm 251 B).
🔴 Vì sao nguy — và vì sao HIGH chứ không MED: đây là **slot đang CHỜ OWNER**, và cả ba lựa-chọn (a)/(b)/(c) được trình dưới giả-định *"sắp vỡ"*. Khi thực-tế đã là *"vỡ rồi"*, phương-án (c) "để vỡ" không còn là một **lựa chọn** mà là **mô-tả hiện-trạng** ⇒ owner đang được mời quyết một việc mà thời-điểm quyết đã trôi qua. Tệ hơn: chính dòng đó tự dán nhãn *"🔴 lead-stale FLAG-7 HIGH: anh đang chọn trên thước cũ"* — tức lỗi này **đã được chẩn đoán đúng tên ở S162** rồi **vá bằng cách thay số một lần**, chứ không phải bằng cách bỏ số neo. **Vá-bằng-thay-số thì 4 nhãn phiên sau lại stale y hệt** — đây là bằng chứng tái-phạm trong cùng một dòng chữ.
**resolve:** hoặc (i) bỏ literal `%`/`headroom` khỏi `:15` và ghi lệnh đo (kiểu slot (58) đã làm đúng), hoặc (ii) re-stamp `101,23 % / 251 B` + đổi khung câu hỏi từ "sắp vỡ, chọn gì" sang "đã vỡ, xử thế nào". Hết flag khi `:15` không còn số neo cứng, HOẶC số khớp lần đo mới nhất.
---
## FLAG-8 — `view-stale-count` — HIGH
**view:** `docs/HANDOFF.md:19` slot **(59)** — chuỗi THẬT: `Khoá hẹn nạp nền **40-60K tok**, nhưng đo tươi ĐÚNG 5 nguồn đã khoanh = 71.492 B ⇒ **~20-24K tok ≈ ½ sàn**; đọc rộng nhất có thể vẫn chỉ ~35-41K. Tức **tuân 100% danh sách vẫn dưới hạn** … Sửa mục tiêu xuống, hay mở rộng danh-sách nguồn?`
**source:** đo lại @S166 **đúng 5 phạm-vi đã khoanh** trong `memory-budget.json` → `tiep_reload.sources` (STATUS = dòng CURRENT + bảng CURRENT STATE; HANDOFF = segment mới nhất `:1-117`; WAL trọn; `_mind-s-9` trọn; `_context-s-9` trọn):
| Nguồn (đúng phạm-vi khoanh) | Byte |
|---|---|
| `docs/STATUS.md` `:6` + bảng `:461-483` | 63.402 |
| `docs/HANDOFF.md` `:1-117` | 69.504 |
| `.claude/WAL.md` | 3.389 |
| `.claude/sessions/session-9/_mind-s-9.md` | 30.573 |
| `.claude/sessions/session-9/_context-s-9.md` | 13.781 |
| **TỔNG** | **180.649** |
Dải token theo đúng công-thức `honest_caveats.token_estimate` (`[bytes/4 .. bytes/3.0]`) = **~45-60K tok**.
Lệch: view nói **71.492 B / ~20-24K tok / "vẫn dưới hạn"**; source nói **180.649 B / ~45-60K tok** = **NẰM TRỌN trong dải mục-tiêu 40-60K**. Số lệch **2,5×** và **kết-luận đã đảo dấu**.
🔴 Vì sao nguy: câu hỏi trình owner là *"Sửa mục tiêu xuống, hay **mở rộng danh-sách nguồn**?"*. Nếu owner chọn "mở rộng" theo tiền-đề cũ, `/tiep` sẽ bị đẩy **vượt trần trên** 60K — tức quyết-định đúng-theo-tờ-trình lại **gây hại thật**. Đây không phải "số cũ đọc cho vui": nó là **một owner-decision đang treo với dấu ngược**. Nguyên nhân cơ-học rất rõ và sẽ còn tái diễn: 3/5 nguồn (`STATUS`, `HANDOFF`, `_mind`) **phình mỗi phiên**, nên MỌI con số neo cứng ở slot này lão-hoá theo nhịp phiên.
⚠️ Tự-kiểm (suýt tự bắn): lượt đầu tôi đo **trọn file** ra 424.634 B — sai, vì `tiep_reload.sources` khoanh phạm-vi *"KHÔNG cả file"* cho STATUS và HANDOFF. Số dùng ở trên là bản đo **theo đúng phạm-vi đã khoanh**. Ghi lại để người vá không lặp lỗi so-sánh nhầm đơn-vị.
**resolve:** re-đo và re-stamp `:19` (hoặc bỏ literal, ghi lệnh đo); và trước khi hỏi owner, nói rõ hiện đã **ĐẠT** dải mục-tiêu ⇒ câu hỏi có thể tự tiêu. Hết flag khi số ở `:19` khớp lần đo theo-phạm-vi mới nhất.
---
## FLAG-9 — `view-stale-role-desc` — MED
**view:** `.claude/agents/cicd-monitor.md:4` (trường `description` — **auto-inject mỗi lượt spawn**) — chuỗi THẬT: `verifies test gate pass (**Domain 58 + Infra 23** tests baseline)`
Cùng vết trong thân persona: `:170` `| test_domain | PASS/FAIL (**58** baseline) |` · `:171` `| test_infra | PASS/FAIL (**23** baseline) |` · `:233` `- **Tests baseline:** **111/111** PASS (**58** Domain + **53** Infra)`
**source:** đĩa/WAL @S166 — `.claude/WAL.md:13` `suite **614**/0 (**45D+569I**)`, xác nhận lại `:37` `dotnet test SolutionErp.slnx --nologo # 614/0 = 45D + 569I`
Lệch: view nói Domain **58** / Infra **23** (và một chỗ khác nói Infra **53**), source nói **45 / 569**.
🔴 Vì sao nguy — không phải "số cũ" mà là **thước gãy trên đúng vai cầm gate**:
1. `cicd-monitor` là vai chấm PASS/FAIL sau mỗi push. Baseline Domain **58** > thực-tế **45**: nếu vai tin baseline, trạng-thái ĐÚNG hôm nay bị đọc thành **regression 13**. Domain rơi 58→45 là **hợp lệ** (S61 gỡ `BudgetPolicyTests` cùng lúc XÓA module Budget) — nhưng persona không mang vết đó.
2. Infra **23** vs **569** lệch **×24**. Một mốc sai cỡ đó không thể "gần đúng"; nó chứng minh trường này **đã chết từ lâu và chưa ai đọc lại** — tức mọi lượt cicd bấy nay chạy bằng `<count actual>` chứ không bằng baseline, và cái baseline chỉ còn là nhiễu.
3. **Tự mâu-thuẫn NỘI-BỘ, bác được không cần rời file:** `:4`/`:171` nói Infra 23 nhưng `:233` nói Infra 53 (58+53=111). Hai mốc khác nhau cùng sống trong một persona ⇒ dù chưa đo đĩa cũng biết ít nhất một cái sai.
**resolve:** bỏ literal khỏi cả 4 site, thay bằng con-trỏ `docs/STATUS.md` row `Tests` (đúng B1 — và **bỏ số**, không **đổi số**, theo luật `agents/README.md:3` đã tự đặt cho chính họ agents). Hết flag khi `grep -n "baseline" .claude/agents/cicd-monitor.md` không còn con số test nào.
---
## FLAG-10 — `view-stale-status` — MED
**view (3 site, mâu-thuẫn lẫn nhau):**
- `CLAUDE.md:17` — chuỗi THẬT: `4. docs/changelog/migration-todos.md ← Atomic tasks theo phase (**Phase 7** PE refinement mới)`
- `docs/changelog/migration-todos.md:4` — `Active work: **Phase 9** (UAT + Ops + carry over PE PDF export + Tests Phase 3-5).`
- `docs/changelog/migration-todos.md:798` — `## 🎯 **Phase 12** — Dry-run TOÀN TRÌNH đến Hợp đồng cứng **(S160-S162)** — 6/8 wave DONE`
**source:** `docs/STATUS.md:480` — `**Phase:** ✅ Phase 10 COMPLETE · ✅ **Phase 11 product backlog ĐÓNG TRỌN**`; và mạch SỐNG hiện tại = SP-002 B4 K1→K8 @S164-S166 (`.claude/WAL.md`, `git log` `50e6d8c`/`0779f2d`/`15349e8`)
Lệch: **ba** con trỏ "việc đang ở đâu" chỉ ba nơi khác nhau (Phase 7 · Phase 9 · Phase 12) và **không cái nào** khớp source (Phase 10/11 đã đóng, việc sống là chuỗi K của SP-002). Riêng nhãn phạm-vi `(S160-S162)` ở `:798` cũng đã trễ 4 nhãn phiên.
🔴 Vì sao nguy: `CLAUDE.md:17` nằm trong danh sách **"5 file đọc trước tiên"** — nó là câu đầu tiên một phiên mới nghe về roadmap, và nó đang nói *Phase 7*. Ba nguồn lệch nhau còn tệ hơn một nguồn sai: người đọc không có cách chọn, nên sẽ tin cái gặp trước.
Ghi chú ranh-giới: chuỗi K1-K3 **hoàn toàn vắng** trong `migration-todos.md` (`grep "K1\|K2\|K3\|SP-002\|Mig 70\|Mig 71"` = **0 hit**/822 dòng) — cái VẮNG đó là turf `lead-gap-auditor`; ở đây tôi chỉ tính phần **có-nhưng-lệch** (3 nhãn phase).
**resolve:** `CLAUDE.md:17` bỏ ngoặc-phase (trỏ file, không trỏ số phase) · `migration-todos.md:4` cập-nhật "Active work" · `:798` nới nhãn phạm-vi. Hết flag khi 3 site không còn khẳng-định phase nào khác nhau.
---
## FLAG-11 — `view-stale-status` — LOW
**view:** `docs/governance/README.md:5` — chuỗi THẬT: `> **Status:** ✅ Active trial week 1-4 (2026-05-26 → 2026-06-23)`
**source:** hôm nay **2026-08-01** — cửa-sổ trial đã đóng **39 ngày**; và RAG delegation đã đi xa hơn hẳn nấc "trial" (`docs/STATUS.md:477` row `RAG chunks` đang theo dõi 2 trục service-liveness / index-freshness với số đo LIVE `solution_erp` 2449)
Lệch: view treo trạng-thái **"đang thử nghiệm, tuần 1-4"**, source cho thấy giai-đoạn ấy kết-thúc từ lâu và chưa ai lật nhãn. `git log -1` file này = `72bbfa5` **2026-06-02** — không ai chạm suốt 2 tháng.
🔴 Vì sao nguy (và vì sao vẫn chỉ LOW): tự-thân nó không lái quyết-định nào hôm nay ⇒ LOW. Nhưng nó là **ca mẫu cho một điểm mù của máy** mà tôi phải nói rõ, vì đây đúng chỗ máy im: detector `H24-1 title-freshness` chỉ parse được **2 doc** trong toàn repo (`detectors-output.txt:68` — `anchors parsed: 2 doc(s)`) và lấy mốc-phải = **2026-05-12**. Với mốc đó, một header ghi *"đến 2026-06-23"* trông **mới hơn mốc** ⇒ máy **không thể** kêu. Nói cách khác: "0 flag ở trục H24-1" ở đây KHÔNG đọc thành sạch — đúng bài S150, và lần này tôi có ca cụ-thể chứng minh.
⚠️ Đã loại trừ bẫy #3 (đóng-băng-có-chủ-đích): file này KHÔNG nằm trong `docs/_archive/**`, nó là README **index đang phục vụ** của thư mục governance và tự khai nấc vòng đời ("Adopted / Status") ⇒ nhãn trạng-thái ở đây có nghĩa vụ lật, khác hẳn snapshot lịch-sử.
**resolve:** lật `:5` sang nấc hiện-hành (vd `✅ Adopted — trial 2026-05-26→06-23 ĐÃ ĐÓNG`) hoặc ghi rõ "frozen-historical". Hết flag khi `:5` không còn mô-tả một cửa-sổ đã qua bằng thì hiện-tại.
---
## Nhóm 8 — dư-lượng bất-đối-xứng mirror `fe-admin` ⟂ `fe-user`: SẠCH (đã chạm, có control)
Control: `git show --name-only --format="" <sha> | grep -c "^fe-admin/\|^fe-user/"` trên đúng 3 commit của chuỗi K (`50e6d8c` K1 · `0779f2d` K2 · `15349e8` K3).
| Commit | fe-admin | fe-user | Phán |
|---|---|---|---|
| `50e6d8c` K1 | 3 | 3 | cân |
| `0779f2d` K2 | 4 | 4 | cân — từng cặp khớp tên (`KhkkCreatePage`/`KhkkDetailPage`/`KhkkListPage`/`types/khkk.ts`) |
| `15349e8` K3 | 3 | 1 | **lệch có lý do, KHÔNG flag** |
Lý do K3 lệch là **chủ-đích**: cặp mirror thật `pages/khkk/KhkkWorkflowPanel.tsx` **có mặt CẢ HAI** bên; 2 file admin dôi ra là `system/ApprovalWorkflowsV2Page.tsx` (Designer — bề mặt admin-only) và `components/Layout.tsx` (menu Designer). Đúng ghi-chú `CLAUDE.md`: duplicate giữa 2 app là CÓ CHỦ ĐÍCH, và admin có màn quản-trị mà user không có. **Đếm file thô ra "3 vs 1" trông y hệt sửa-một-phía — phải mở tên file mới phân biệt được**; ghi lại để lần sau không tạo dương-giả.
---
# 🔴 COVERAGE — đọc TRƯỚC khi dùng con số 11
**11 FLAG = SÀN, KHÔNG PHẢI TỔNG.** 8/8 nhóm đã **chạm**, nhưng **2/8 nhóm mới soi một phần** (nhóm 7 và nhóm 8) ⇒ không ai được đọc phần chưa quét thành sạch.
| # | Nhóm | Đã chạm | Kết quả | Control dùng |
|---|---|---|---|---|
| 1 | `STATUS.md` CURRENT + bảng CURRENT STATE | ✅ ĐỦ | FLAG-1, 2, 3 | đếm đĩa `Migrations/*.cs`; `CreateTable` Mig 70/71; đếm PHẦN-TỬ `MenuKeys.All`; `WAL.md:13/:37`; `.session-counter.json` |
| 2 | `HANDOFF.md` segment mới nhất (`:1-117`) | ✅ ĐỦ | FLAG-5, 6, 7, 8 | đo byte `_INDEX.md` vs `tiers.l2_index.cap_bytes`; đo 5 nguồn `tiep_reload` **theo đúng phạm-vi đã khoanh** |
| 3 | `CLAUDE.md` root (bảng module/mig) | ✅ ĐỦ | FLAG-4 (+FLAG-10 site 1) | `grep "Mig 70\|Mig 71\|AddContractCatalog\|AddKhkkApproval" CLAUDE.md` = **0 hit** |
| 4 | `.claude/agents/README.md` roster | ✅ ĐỦ | **SẠCH** | `ls .claude/agents/*.md` = 24 README = **23**; đếm PHẦN-TỬ `:242` = 23 (13 monitor + 10 worker); `:27` = 23; đối-chứng `hmw.js:22 VALID_ROLES` |
| 5 | `migration-todos.md` phase/KHKK | ✅ ĐỦ | FLAG-10 (site 2, 3) | `grep -n "KHKK\|SP-002"` (có §Phase 12 :798-812) · `grep "K1\|K2\|K3\|Mig 70\|Mig 71"` = **0 hit**/822 dòng |
| 6 | `docs/governance/*.md` header/status | ✅ ĐỦ (11 file) | FLAG-11 | quét 8 dòng đầu ×11 file lọc `Status\|updated\|version\|ngày`; `git log -1` xác nhận `README.md` đứng im từ `72bbfa5` 2026-06-02 |
| 7 | Mô-tả VAI `.claude/agents/*.md` | 🔴 **PARTIAL** | FLAG-9 | `grep "Domain 58\|Infra 23\|baseline"` **chỉ trên 2 file** (`cicd-monitor`, `test-specialist`). **CHƯA CHẠM: 21/23 persona còn lại** |
| 8 | Dư-lượng bất-đối-xứng mirror | 🔴 **PARTIAL** | **SẠCH trong phạm-vi đã soi** | `git show --name-only` ×3 commit K, đối-chiếu TÊN FILE (không chỉ đếm). **CHƯA CHẠM: cặp spec-cụm⟂WAL, cặp doc⟂skill khác** |
**Hệ-quả phải nói thẳng:** nếu quét nốt 21 persona còn lại (nhóm 7) thì gần như chắc có thêm FLAG cùng class `view-stale-role-desc` — vì ca đã tìm được (`cicd-monitor`) không phải ca hiếm mà là **trường `description` auto-inject không ai đọc lại suốt ~100 phiên**. Đề-nghị lượt sau nhắm THẲNG nhóm 7 với `grep` số-học trên cả 23 file.
**Điểm mù tự-quy-chiếu (bài M-1 @S153):** lượt này tập-đo CÓ gồm `.claude/agents/*.md`, nhưng phần persona mới soi 2/23 ⇒ **chưa loại trừ được** khả-năng chính `lead-stale-auditor.md` / `lead-gap-auditor.md` đang mang số/nhịp lệch. Không tuyên sạch.
---
# TỔNG KẾT
**11 FLAG — 4 HIGH · 5 MED · 2 LOW.** (SÀN, xem COVERAGE.)
Phân-rã theo class (cho `jump_on_class_repeat`, ngưỡng = 3):
| class (enum ĐÓNG `lead_self_audit.flag_classes`) | Số | FLAG |
|---|---|---|
| `view-stale-count` | **5** | 2 (HIGH), 3 (LOW), 4 (MED), 7 (HIGH), 8 (HIGH) |
| `view-stale-status` | **3** | 6 (MED), 10 (MED), 11 (LOW) |
| `view-residual-asym` | **1** | 1 (HIGH) |
| `view-stale-header` | **1** | 5 (MED) |
| `view-stale-role-desc` | **1** | 9 (MED) |
| **Tổng** | **11** | — |
🔴 **Một sợi chỉ xuyên 4 FLAG HIGH — đọc cái này nếu chỉ đọc một dòng:** cả 1, 2, 7, 8 đều KHÔNG phải "quên cập nhật". Cả bốn đều là **số ĐÃ ĐO ĐÚNG ở nơi lead làm việc** (`WAL.md:13`, `sub-cicd-verify-k3.md:86-94`, `STATUS.md:6`) mà **không đi tới nơi anh đọc** (bảng canonical `STATUS:465-472`, `HANDOFF:15/:19`, `STATUS:479`). Đây đúng câu chốt S162 lặp lại nguyên si sau 4 nhãn phiên. Nặng hơn lần trước ở hai chỗ: (a) **FLAG-2 có nhân-chứng tự khai** — vai cicd đã viết thẳng *"KHÔNG khớp gì đo được"* vào run-folder rồi câu đó nằm im; (b) **FLAG-7/8 là hai owner-decision đang treo, và FLAG-8 đã ĐẢO DẤU kết-luận** — trả lời theo tờ trình hiện tại sẽ gây hại thật.
🔴 **Cái máy KHÔNG thể nói, và lượt này chứng minh bằng ca cụ-thể:** `governance-detectors.ps1` resolve canonical TỪ bảng `STATUS:465-472` nhưng chỉ cross-check đĩa **2/6 trục** (`mig`, `gotcha`). Vì bảng ấy stale, máy đang **đề-nghị sửa một doc ĐÚNG thành SAI** (`detectors-output.txt:14`: `SKILL.md:93` 97 → "update to 96", trong khi đĩa = 97). ⇒ Trong TOTAL 51 của máy, các flag nhánh `derived-stale` về `table`/`test`/`menu`/`policy` phải coi là **CHƯA PHÁN ĐƯỢC** cho tới khi FLAG-1 được vá và detector chạy lại.
⚠️ **Chống META-COUNT (luật của chính vai này):** không dán nhãn `PASS`/`sạch` ở bất kỳ đâu trong file. Hai mục ghi "SẠCH" (nhóm 4, nhóm 8) đều kèm **lệnh control** và nhóm 8 khai rõ "sạch **trong phạm-vi đã soi**".
**Propose-only.** Vai không Write/Edit vào bất kỳ file nào ngoài chính artifact này; không `store_memory`. Mọi FLAG chờ em-main VERIFY → APPEND (B3, no-overwrite-unverified).
END sub-lead-stale-deep-S166 — VERDICT=11 FLAG (4 HIGH/5 MED/2 LOW) · coverage 8/8 chạm, 2/8 PARTIAL ⇒ 11 = SÀN, KHÔNG phải TỔNG