280 lines
29 KiB
Markdown
280 lines
29 KiB
Markdown
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
|