LEAD-STALE-DEEP: IN-PROGRESS # 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 | PENDING | | 3 | `CLAUDE.md` root (bảng module/mig) | PENDING | | 4 | `.claude/agents/README.md` roster | DONE — SẠCH | | 5 | `docs/changelog/migration-todos.md` | PENDING | | 6 | Governance surfaces `docs/governance/*.md` | PENDING | | 7 | Mô-tả VAI `.claude/agents/*.md` | PENDING | | 8 | Dư-lượng bất-đối-xứng (mirror pairs) | PENDING | --- ## 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 `` 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="" | 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ả. ---