wal: flush 20260801T0904

This commit is contained in:
pqhuy1987
2026-08-01 09:04:39 +07:00
parent 2a4a1e1b18
commit 2cc22fde0f
4 changed files with 212 additions and 7 deletions

View File

@ -1,14 +1,14 @@
# Reviewer Agent — Persistent Memory
- **S166 (08-01) vá F-1 ô-tích opt-out `applyLevelFinalize` KHKK — PWF 7 finding (3 MAJOR):** vá ĐÚNG kỹ thuật (mirror 2 app chứng bằng **blob-SHA in ngay trong `git diff` index-line** — rẻ hơn sha256 tay; body không rò field; cấp thường bất-biến từng bit). **Bài thu:** ① 🔴 **khuôn-nguồn có 2 tầng, chú-thích nói dối tầng dưới** — implementer trích ĐÚNG dòng JSX PE `:772-791` + nhãn "khuôn PE S96 default tick", nhưng `useState` PE `:61` = `false` (S97 owner **ĐẢO** sang opt-IN) và chính chú-thích PE `:769-771` cũng stale ⇒ **đo khuôn phải đo GIÁ-TRỊ KHỞI-TẠO, không đọc chú-thích**; tái phát S165 F-1 (đo sai tầng). ② **cây làm việc PHÌNH GIỮA LƯỢT REVIEW** — đo `git status` 2 lần cách ~40 tool-call: 5 file→7 file (+121 dòng K4a, `All` 64→113) ⇒ **verdict phải neo mốc đo + re-đo `--stat` TRƯỚC khi phát verdict**, nếu không lead commit ké code chưa qua cổng. ③ vắng-mặt-đọc-thành-sạch: sơ đồ `isApproved ⇒ mọi Bước 'Done'` ⇒ CEO chưa đụng vẫn "đã duyệt", dấu-vết duy nhất = THIẾU dòng "✓ ký". ④ sợi-dây-1-argument (`l.AllowApproverFinalize` projection) 0 test ⇒ xoá là control biến mất mà 614 test + tsc vẫn xanh. ⑤ STATUS: prose vá, 2 row canonical detector đọc thì không (fix-NỬA). Tag `[s166, khuon-2-tang-chu-thich-noi-doi, cay-phinh-giua-review, sợi-day-1-argument]` **Evidence:** `runs/2026-07-31-S164-4gd-khkk-fanout/sub-reviewer-f1-checkbox.md`
- **S166 (08-01) vá F-1 ô-tích opt-out `applyLevelFinalize` KHKK — PWF 7 finding (3 MAJOR):** vá ĐÚNG kỹ thuật (mirror 2 app chứng bằng **blob-SHA in ngay trong `git diff` index-line** — rẻ hơn sha256 tay; body không rò field; cấp thường bất-biến từng bit). **Bài thu:** ① 🔴 **khuôn-nguồn có 2 tầng, chú-thích nói dối tầng dưới** — implementer trích ĐÚNG dòng JSX PE `:772-791` + nhãn "khuôn PE S96 default tick", nhưng `useState` PE `:61` = `false` (S97 owner **ĐẢO** sang opt-IN) và chính chú-thích PE `:769-771` cũng stale ⇒ **đo khuôn phải đo GIÁ-TRỊ KHỞI-TẠO, không đọc chú-thích**; tái phát S165 F-1 (đo sai tầng). ② **cây làm việc PHÌNH GIỮA LƯỢT REVIEW** — đo `git status` 2 lần cách ~40 tool-call: 5 file→7 file (+121 dòng K4a, `All` 64→113) ⇒ **verdict phải neo mốc đo + re-đo `--stat` TRƯỚC khi phát verdict**, nếu không lead commit ké code chưa qua cổng. ③ vắng-mặt-đọc-thành-sạch: `isApproved ⇒ mọi Bước 'Done'` ⇒ CEO chưa đụng vẫn "đã duyệt", dấu-vết duy nhất = THIẾU dòng "✓ ký". ④ **sợi-dây-1-argument** (projection `l.AllowApproverFinalize`) 0 test ⇒ xoá là control biến mất mà 614 test + tsc vẫn xanh. Tag `[s166, khuon-2-tang-chu-thich-noi-doi, cay-phinh-giua-review, sợi-day-1-argument]` **Evidence:** `runs/2026-07-31-S164-4gd-khkk-fanout/sub-reviewer-f1-checkbox.md`
- **S164/S165 (07-31) gate K3 KHKK (8 wf nhóm + port level-finalize + gỡ khoá Designer) — PWF 8 finding/0 blocker:** build 0W/0E · 614/0 (45D+569I) · npm ×2 sạch; 3/3 quyết-định lead ĐÚNG kỹ-thuật. **Bài thu:** ① 🔴 **tham-số-chết-vì-thiếu-tầng-UI** BE port opt-out `applyLevelFinalize` đủ 3 tầng + seed cờ finalize cho TP.CCM ở CẢ 8 wf, nhưng panel KHKK POST **body literal đúng 2 field** `{action,comment}` ⇒ luôn finalize ⇒ **trạm CEO chết 8/8**, mất đúng quyền owner vừa chốt. Bắt bằng **đối-chứng khuôn-nguồn**: PE panel `useState(false)` + luôn gửi tường minh ⇒ PE opt-IN, KHKK opt-OUT ⇒ *"mirror khuôn PE"* SAI ở chiều mặc-định. **Luật: claim 'port khuôn X' phải đo TẦNG-CUỐI (ai GỬI tham số), đừng đếm tầng-BE.** **sweep 2-cờ bất-đối-xứng** FE gỡ khoá CẢ 2 ô, BE chỉ gỡ 1 ⇒ tick bị NUỐT IM LẶNG (chính class comment vừa xoá đã cảnh báo, đảo chiều); **vá 1 cờ ⇒ grep cờ ANH-EM ở CẢ 2 bờ**. ③ spec liệt SAI site (bảo gỡ PUT-Conflict) — bác bằng `grep typeEnum` trong thân handler = 0 hit ⇒ luật CHUNG mọi type; **lead cãi spec ĐÚNG khi có phép đo**. ④ suite **flake 1/3 lượt**'N/0 tươi' phải khai SỐ LƯỢT. ⑤ DELTA STATUS chưa khai — tái phát y hệt K1 cùng phiên. Tag `[s165, tham-so-chet-thieu-tang-ui, doi-chung-khuon-nguon, sweep-2-co-bat-doi-xung, spec-liet-sai-site]` **Evidence:** `runs/2026-07-31-S164-4gd-khkk-fanout/sub-reviewer-gate-k3.md`
- **[→ archive/2026-07.md @S166-curate] S164/S165 (07-31) gate K3 KHKK — PWF 8 finding/0 blocker:** **tham-số-chết-vì-thiếu-tầng-UI** (BE port đủ 3 tầng + seed cờ, panel gửi body literal 2 field ⇒ trạm CEO chết 8/8) — *claim "port khuôn X" phải đo TẦNG-CUỐI, ai GỬI tham số* · **sweep 2-cờ bất-đối-xứng** (FE gỡ 2 ô, BE gỡ 1 ⇒ tick bị nuốt im lặng) · lead cãi spec ĐÚNG khi có phép đo (`grep typeEnum` = 0 hit trong thân handler) · flake 1/3 lượt ⇒ "N/0 tươi" phải khai SỐ LƯỢT · DELTA STATUS chưa khai.
- **[→ archive/2026-07.md @S165-curate] S164 (07-31) gate K1 danh mục SP-002 (Mig 70) — PWF 9 finding/0 blocker:** giá-trị lớn nhất ở **GATE QUY-TRÌNH** không ở mã (commit gộp = vượt quyền owner; seeder 0 nhánh update) · 2 quyết-định hợp-lệ ghép nhau đẻ **ghost-policy** (4 policy, 0 endpoint tiêu thụ — đo `grep policy`, đừng suy từ "key đã vào All") · **default-lấn-ngữ-nghĩa** `IncludeInactive?``IsActive?` · DELTA đo được mà STATUS chưa khai.
- **[→ archive/2026-07.md @S165-curate] S162 (07-30) cây 4-folder GĐ (FE-only) — PWF 8 flag:** im-lặng-về-độ-chính-xác-của-con-số ×3 cùng diff · **#82 ngược chiều** (FE OR nhiều menu-key LỎNG HƠN policy khớp-CHÍNH-XÁC-1-key ⇒ tự chuốc 403) · nhãn ✓ không có phép đo.
- **[→ archive/2026-07.md @S162-curate] S161-W2 (07-29) KHKK CRUD — 2 lane viết SONG SONG:** hợp-đồng FE↔BE VỠ 6 điểm mà tsc+build+574-test đều XANH (route lệch tên · field lệch · 2 lỗi CHE NHAU); lời-khai-lane = GIẢ ĐỊNH ⇒ so ROUTE+FIELD trên ĐĨA; list-bịt-detail-mở ⇒ rào chỉ còn UX; INNER-join global-filter = picker vanish.
- **[→ archive/2026-07.md @S162-curate] S161-W2 (07-29) KHKK CRUD 2-lane song song:** hợp-đồng FE↔BE VỠ 6 điểm mà tsc+build+574-test XANH (2 lỗi CHE NHAU) ⇒ so ROUTE+FIELD trên ĐĨA (lời-khai-lane = GIẢ ĐỊNH); list-bịt-detail-mở; INNER-join global-filter = picker vanish.
- **[→ archive/2026-07.md @S159/@S161/@S162-curate] S159-đợt5 · S161-W1 · S155-đợt2 (digest):** chú-thích-mang-SỐ phải chạy phép đếm · cookie-cutter phải soi CẢ phần bản gốc đã CHẶN · `tsc`+`noUnusedLocals` > grep cho claim 'đã cắt' · **HIGH nằm ở `git`** (mig UNTRACKED mà snapshot tracked ⇒ gate `git status --porcelain -- src tests | grep '^??'` RỖNG trước commit) · comment 'bên kia lo' = ĐI ĐỌC BÊN KIA · grep bằng TOKEN-SONG-SINH · `hợp-đồng-đứt-2-bờ` (FE khai cờ, BE DTO không có ⇒ nút chết mà build+test xanh) · re-đo đĩa TRƯỚC verdict · đổi-chiều-assert ≠ nới-assert.
- **[→ archive/2026-07.md @S145/@S145b/@S155-curate · @S140] S145 4-lane · S143 · S139 · S134b · S133 · S146/S147/S152-D2 (digest):** bất-biến chia-đôi giữa 2 axis chỉ cross-cut sweep bắt · sweep CẢ numeric LẪN name-enum · `bằng-chứng-tự-huỷ-sau-squash` · re-measure acceptance từ git HEAD + no-self-exempt · insertion-only `grep '^-'`=0 · 'mọi nhánh set X' phải grep assignment-qua-BIẾN (#81) · `ExecuteDelete` ngoài transaction = mất dữ liệu · test đang KHOÁ chiều ngược CẤM nới assert · xanh-giả bắt bằng phép 2-thế-giới · 3 THƯỚC-HỎNG (md5 CRLF · `grep -c` citation-trap · `grep -iF` MSYS 0-hit im lặng).
@ -102,4 +102,4 @@ Adversarial pre-commit reviewer SOLUTION_ERP. Read-only verify + live curl prod
## S152 (07-25) — R1 ranh NEVER (on-behalf lead)
- **NEVER Edit/Write code-tree · NEVER commit · NEVER push** vai = verdict-only; sửa việc em-main/implementer. Khai thật 2 nấc: ranh commit/push/code-tree **chưa từng vỡ**; Write/Edit runtime cấp dùng hợp lệ cho sub-file run-folder + diary-self (AS-10). "NEVER" áp cho ĐÍCH (code/commit/push), không phải cho tool-tồn-tại; containment thật = git-diff lead. Tag `[s152, r1-retention, never-target-scoped]`
- **[→ archive/2026-07.md @S165-curate] S159 đợt-1 (07-29) diff tổng-quan pipeline 7 FLAG:** rút TOÀN BỘ chuỗi hiển-thị MỚI từ diff rồi soi từng chuỗi = phép đo 100%-tiếng-Việt tái-dùng · 2 queryKey cho CÙNG resource = 2 ảnh-chụp khác thời-điểm · a11y nút TRÙNG tên đọc-được (phân-biệt chỉ THỊ-GIÁC) · bác-claim cũng phải chứng.
- **[→ archive/2026-07.md @S165-curate] S159 đợt-1 (07-29) diff pipeline 7 FLAG:** rút TOÀN BỘ chuỗi hiển-thị MỚI từ diff rồi soi từng chuỗi = phép đo 100%-tiếng-Việt · 2 queryKey cùng resource = 2 ảnh-chụp khác thời-điểm · a11y nút TRÙNG tên đọc-được · bác-claim cũng phải chứng.

View File

@ -7,9 +7,23 @@ Mục nào chưa chạy = ghi tiêu-đề + "CHƯA ĐO", KHÔNG điền số d
## §0 — Trạng thái khởi động
- [ ] §0.1 Đọc khuôn `ProcurementMasterAccessSeedTests.cs` / `OfficeModulePermissionSeedTests.cs` / `AdminOnlyModulesRevokeTests.cs` — CHƯA ĐO
- [ ] §0.2 Đọc BE code đã land (`MenuKeys.cs` bộ sinh + `DbInitializer.cs` seed 49 row) — CHƯA ĐO
- [ ] §0.3 Baseline suite Infra đo TƯƠI — CHƯA ĐO
- [x] §0.1 ĐÃ đọc khuôn. Chốt harness: seeder là `private static` → REFLECTION.
- `SeedMenuTreeAsync(ApplicationDbContext, ILogger)` — 2 tham số.
- `SeedAllRolesReviewReadPermissionsAsync(ApplicationDbContext, RoleManager<Role>, ILogger)` — 3 tham số (site-2).
- Khuôn invoke đã có sẵn ở `ContractCatalogTests.cs:459` (`InvokePrivateSeedAsync`, rm nullable) →
dùng lại HÌNH, không chế fixture mới. Fixture = `IdentityFixture` (cần RoleManager cho site-2).
- [x] §0.2 ĐÃ đọc BE đã land (git diff, chưa commit):
- `MenuKeys.cs:72-84``KhkkGroupNumbers=[2..8]` · `KhkkLeafActions=[WfView,List,Create,Pending,Approved,Deleted]`
· `KhkkGroupMenuKeys` = SelectMany(group → 6 leaf) · spread `.. KhkkGroupMenuKeys` vào `All:244`.
- `DbInitializer.cs:2115-2157` — vòng seed 49 row menu (parent `KeHoachKyKet`, Order nhóm = n,
leaf Order 1..6) + `:2235` labelBackfill `Khkk_G1` + `:2442-2446` site-2 `KhkkKeys().Concat(KhkkGroupMenuKeys)`.
- Đếm BY-SOURCE `All` = 113 (tự cộng tay từng dòng initializer). **Chưa phải số ĐO** — sẽ đo runtime ở T1.
- [x] §0.3 CHỒNG LẤN ĐÃ CÓ (không viết lại): `ContractCatalogTests.cs:445` T6 K1 assert
`MenuKeys.All.Except(menuKeysInDb).Should().BeEmpty()` sau `SeedMenuTreeAsync` ⇒ invariant
"49 key mới ĐỀU có menu-row" ĐÃ được test cũ phủ tự động (nó là phép thử của claim by-construction).
Lane K4a KHÔNG nhân bản; thay vào đó đo cái test cũ KHÔNG đo: hình bộ sinh · đếm 56 row họ Khkk ·
idempotent ×2 · labelBackfill · grant site-2.
- [ ] §0.4 Baseline suite Infra đo TƯƠI — ĐANG CHẠY (nền), chưa có số
## §1 — Test bộ sinh đúng hình — CHƯA VIẾT
## §2 — Test seed idempotent x2 — CHƯA VIẾT

View File

@ -93,3 +93,129 @@ tệ hơn — khoảng trống số (60)(61) sẽ bị slot MỚI tái-dụng, v
**resolve:** hết-flag khi (60) và (61) hiện diện trong khối 🔴 CHỜ ANH của `docs/HANDOFF.md` với nội-dung mồi
(enum · defect liên-danh N-HĐ) — hoặc lead khai tường-minh "mồi đã chấm, kết-quả X, đóng slot" ở một sổ bền.
---
## FLAG-3 — `gap-carry-dropped` — HIGH
🔴 **KHAI ĐƠN-VỊ TRƯỚC (bài ring2 D-4 @S159):** ô tally `gap-carry-dropped` đếm theo **consecutive-audit**,
đang = **8** (chốt @S162). Lượt deep này nếu lead ratify thì thành **9****KHÔNG** phải "1" (số trong-phiên).
Đừng chép số trong-phiên đè lên ô tally: làm thế là XOÁ LỊCH-SỬ.
**hứa ở:** `docs/HANDOFF.md:37` tự khai nghi-thức của chính nó —
`**Carry @S162 (RE-STAMP — nghi-thức §L.b(j)(iv), bỏ 2 kỳ liên tiếp S159+S160 nên gap-carry-dropped lên streak 8):**`
`docs/HANDOFF.md:33` NEXT-em mục 3 tự nhận: *"**Nghi-thức re-stamp carry** — `gap-carry-dropped` **streak 8**,
bỏ lần 2 ngay sau khi bị FLAG HIGH @S159 ⇒ đây là **nghi-thức hỏng**, không phải sự cố lẻ."*
**hiện: khối carry mới nhất VẪN mang nhãn `@S162`** — không có `Carry @S163` / `@S164` / `@S165` / `@S166`.
```
grep -o 'Carry @S[0-9]*' docs/HANDOFF.md -> chỉ 'Carry @S162'
git log --format='%h %cI' -3 -- docs/HANDOFF.md
bd68f71 2026-07-31T21:47 (S165 wal: pause) 1 dòng đổi
15349e8 2026-07-31T18:21 (S164 K3) 1 dòng đổi
50e6d8c 2026-07-31T15:45 (S164 K1) 7+/5-
git diff e5123ff..HEAD -- docs/HANDOFF.md | grep -c '^[+-]' -> 16
```
🔴 **Đây KHÔNG phải "quên cả file vì gấp":** HANDOFF bị sửa **3 lần / 16 dòng** sau closeout S162, và **chính dòng
carry `:37` đã bị EDIT** (nó chứa ghi-chú *"2 slug này = TÁCH từ `[carry:orphan-retro-harvest-s159]` **@S164**"*)
— tức lead có mở đúng dòng đó ra sửa mà **vẫn không re-stamp kỳ mới**. Sửa-tại-chỗ ≠ re-stamp:
sửa-tại-chỗ làm **tuổi carry tàng hình** với máy (streak không tăng vì không có đoạn LOGIC mới).
**im:** **3 nhãn phiên (S163 · S164 · S165) + phiên này S166** kể từ lần re-stamp cuối (2026-07-30 e5123ff) = **2 ngày**.
Đây là **lần bỏ thứ 3 liên tiếp** (S159+S160 → FLAG HIGH; S163→S165 → nay).
**đo phụ — cái máy KHÔNG thấy** (đọc detector, KHÔNG tính lại):
`detectors-output.txt:79-84``HANDOFF logic-segments = 25 ; carry-lines = 18`, in đúng **5** carry:
`ctx-t9-dogfood` 2 · `ring5-audit-gap` 1 · `hmw-width-vs-roster` 1 · `hmw-subfile-index-collision` 1 · `adap-apply-2-thu` 3 — **tất cả [ok] < M=6**.
Đối chiếu đĩa: khối re-stamp `:37` mang **12 slug**, cả file mang **50 slug / 234 occurrence**
(`grep -o '\[carry:[a-z0-9-]*\]' docs/HANDOFF.md | sort -u | wc -l` = 50; `grep -o '\[carry:' … | wc -l` = 234).
⇒ máy chấm **5/50**; `gap-carry-aged` **không thể fire** không phải vì carry trẻ, mà vì **chứng-nhân không ở trong tập-đo**.
🔸 KHAI THẬT: hình dạng này **đã báo @S159** (Goodhart rời-tập-đo) — ghi lại đây làm **chứng streak còn sống**, KHÔNG tính là phát-hiện mới.
**hệ-quả nếu không vá:** nghi-thức duy nhất giữ tuổi-nợ đã hỏng 3 kỳ liên tiếp ⇒ 50 slug trên đĩa trở thành
nợ **không có đồng hồ**; và vì detector chỉ thấy 5, mọi bản báo cáo "carry sạch" sẽ **đúng về câu chữ, sai về việc**.
**resolve:** hết-flag khi có 1 dòng `**Carry @S166 (RE-STAMP …)**` mới trong segment Last-updated mới nhất,
liệt slug còn MỞ (đóng slug đã xong, ghi rõ lý do đóng) — và streak `gap-carry-dropped` được reset về 0 **bằng hành-vi**, không bằng chữ.
---
## FLAG-4 — `gap-carry-dropped` — HIGH
*(scope-1: việc rớt khỏi work-state so với backlog — món **owner tự tay gác sang giai-đoạn sau** mà không sổ backlog nào nhận)*
**hứa ở:** `.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/spec-4gd-khkk-tong-quat-31-07-2026.md:54`, nguyên văn:
> **BACKLOG giai-đoạn-sau (owner @S164, không làm đợt này):** (1) authz-per-nhóm KHKK (OG-8) · (2) **phiếu điều chỉnh/thay thế**
> cho chứng từ đã duyệt — khuôn amendment ERP, áp PE/KHKK/HĐ (*"Nếu xóa thì có thể làm 1 tính năng điều chỉnh phiếu để cập nhật
> điều chỉnh/thay thế - ko xóa phiếu đã duyệt. Cái này để giai đoạn sau."*) · (3) bung-gộp UI (OG-1/OG-7 nửa sau — máy đã sẵn).
Mục (2) là **lời anh VERBATIM**, phạm-vi **toàn ERP** (PE + KHKK + HĐ), không riêng KHKK.
**hiện: VẮNG — 0 hit / 6 bề mặt, gồm cả sổ backlog chính thức.**
```
grep -c 'OG-8|authz-per-nhóm' -> HANDOFF 0 · STATUS 0 · WAL 0 · migration-todos 0 · _context 0 · _mind 0
grep -c 'phiếu điều chỉnh|điều chỉnh/thay thế' -> 0 0 0 0 0 0
grep -c 'BACKLOG giai-đoạn-sau' -> 0 0 0 0 0 0
CONTROL-DƯƠNG (cùng regex, trên chính file nguồn):
grep -o 'OG-8' spec-4gd…tong-quat…md | wc -l -> 2
grep -o 'authz-per-nhóm' … | wc -l -> 3
grep -o 'BACKLOG giai-đoạn-sau' … | wc -l -> 1
```
⇒ regex có răng; **0 là 0 THẬT**, không phải lỗi phép đo.
🔴 `docs/changelog/migration-todos.md`**nhà được chỉ định** cho loại này (`CLAUDE.md` §5-file: *"Atomic tasks theo phase"*) — và nó **rỗng** ở cả 3 mục.
🔴 **Phân-định với luật "vắng ≠ bỏ rơi":** anh **CÓ** chủ-động gác ("để giai đoạn sau") ⇒ **việc gác là ĐÚNG, không flag**.
Cái bị flag là: gác **sang đâu**? "Giai đoạn sau" = phải nằm trong **sổ phase**, mà sổ phase 0 hit.
Đây không phải "owner đang giữ trong tay" — anh đã **giao lại cho hệ-thống** và hệ-thống đánh rơi.
**im:** từ `2026-07-31` (S164) → nay = **2 nhãn phiên / 1 ngày**, nhưng đã **đi qua trọn 1 lượt `/pause` (PAUSE-3) + 1 lượt `/tiep` (S166)**
— tức đã qua đúng 2 nghi-thức được thiết-kế để bắt loại này mà cả 2 đều không bắt.
**hệ-quả nếu không vá:** yêu-cầu tính-năng của anh (amendment/điều-chỉnh phiếu — chạm 3 module) tồn tại duy nhất trong
1 file spec 14,7 KB ở run-folder; sang phiên-logic L10, không nghi-thức nào đọc file đó ⇒ **mất hẳn**, và lần sau anh hỏi
"cái điều chỉnh phiếu đâu rồi" thì không sổ nào trả lời được.
**resolve:** hết-flag khi 3 mục backlog này có mặt trong `docs/changelog/migration-todos.md` (hoặc khối backlog của `docs/HANDOFF.md`)
kèm nguồn `spec-4gd…:54` — và mục (2) giữ **nguyên văn câu của anh**, không tóm tắt.
---
## FLAG-5 — `gap-owner-specifics` — MED
**hứa ở:** mandate PAUSE-3 (3 tin anh, verbatim `_context-s-9.md:117`) — ② *"Chứ ý kỹ các đầu việc trong plan đã đc review kỹ
trong rurn này nhé."* ③ *"uhm ý tao là plan các thứ đang chạy tới đâu nhớ kỹ, bắt đc lỗi thì tốt."*
Lead diễn-đạt lại ở `.claude/WAL.md:39-40`: *"sổ nhớ kỹ **từng đầu việc** đã review"*.
Bài đã rút @S165 (auto-memory `feedback_pause_track_plan_progress`): *"liệt TỪNG đầu việc đã-review (wave + vá-số + finding treo),
**rà từng dòng OG** trước khi tuyên xong"* — ca sinh ra nó chính là **gap checkbox OG-3 → gate F-1 MAJOR**.
**hiện: SPECIFICS bị nén thành SỐ ĐẾM và thành BIỆT-DANH; khoá tra-cứu (OG-n / F-n) rơi mất.**
*(a) Trục OG — đĩa có 10 ID, sổ bền giữ 4:*
```
grep -oh 'OG-[0-9]\+' runs/2026-07-31-S164-…/*.md | sort | uniq -c
OG-1:40 OG-2:27 OG-3:25 OG-4:3 OG-5:7 OG-6:36 OG-7:22 OG-8:5 OG-9:18 OG-10:1
bề mặt bền: HANDOFF{OG-3, OG-9} · STATUS{} · WAL{OG-5, OG-6} · _context{OG-5, OG-6} · _mind{OG-3, OG-5, OG-6}
hợp: {OG-3, OG-5, OG-6, OG-9} = 4/10 ⇒ VẮNG: OG-1, OG-2, OG-4, OG-7, OG-8, OG-10 = 6/10
```
Nặng nhất: **OG-1 (40 hit)****OG-2 (27 hit)** — hai khoản được bàn NHIỀU NHẤT trong cả run — **0 hit** trên mọi sổ bền.
`b1b-review-synthesis.md:31` ràng OG vào DoD: *"PRE-gate K1←OG-6, **K2←OG-1+OG-7**, K3←OG-2"* ⇒ đây là **điều-kiện nghiệm-thu**, không phải ghi chú.
*(b) Hệ-quả đo được — claim không kiểm được:* `_context-s-9.md:108` (PAUSE-2) tuyên **"9 OG trọn"** rồi liệt bằng **biệt-danh**
(*gộp+UI-1-1 · đội-hình-cũ · NĐUQ-human-gate · N-phiếu+UI-1 · hiển-thị-không-authz · đảo-PHÁ-VỠ-S155 · freeze-tái-dùng-máy ·
phiếu-bất-tử-ERP · OG-6→soát-SAU*) — **chỉ 1/9 có ID**. Đĩa có **10** ID.
⇒ Không cách nào đối-chiếu "9 tuyên" với "10 trên đĩa": **1 khoản chênh mà không ai chỉ ra được là khoản nào.**
Chính đây là điều mandate ③ *"rà từng dòng OG"* sinh ra để chặn.
*(c) Trục F-n — khoá KHÔNG duy-nhất:* 3 cổng gate dùng **cùng dải ID**
(`grep -o 'F-[0-9]\+' sub-reviewer-gate-k{1,2,3}.md | sort -u` → k1: F-1..F-5,F-7 · k2: F-1..F-10 · k3: F-1..F-8 = **27 finding**).
Sổ bền viết `WAL:41` *"**F-5**-PermGuard-khuôn-cũ"* và `_context:127` *"**F-5** PermGuard nợ khuôn cũ"* — **không tiền-tố cổng nào**,
trong khi F-5 tồn tại ở **cả 3** cổng. Tra ngược = phải mở 3 file. (Đối-chứng: `_context:124` CÓ viết đúng *"gate-K3 F-1"* ⇒ lead
biết cách ghi đủ, chỉ là không nhất-quán ⇒ không phải "không thể", mà là **rơi**.)
**im:** từ PAUSE-3 `2026-07-31T18:35` → nay = **1 ngày / 2 nhãn phiên**, đã qua 1 `/tiep`.
**hệ-quả nếu không vá:** K4a→K8 còn 5 wave chưa build; DoD của chúng neo vào OG-n. Vào wave sau, lead sẽ **không có OG-1/OG-2/OG-7
trong tầm đọc** ⇒ hoặc bỏ điều-kiện nghiệm-thu, hoặc phải mở lại 26 file run-folder — đúng thứ mandate ③ ra đời để ngăn.
**resolve:** hết-flag khi (i) mỗi OG còn hiệu-lực có **1 dòng ID + 1 dòng nội-dung** trong sổ bền (WAL notes hoặc HANDOFF),
và (ii) mọi tham-chiếu `F-n` trong sổ bền mang tiền-tố cổng (`gate-K2 F-5`), và (iii) claim "N OG trọn" liệt **đủ N ID**.

View File

@ -166,3 +166,68 @@ Lệch: view nói **71.492 B / ~20-24K tok / "vẫn dưới hạn"**; source nó
**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ả.
---