From 8b126b714c1badfa268e92ac341f39c65eaaaca7 Mon Sep 17 00:00:00 2001 From: pqhuy1987 Date: Thu, 13 Aug 2026 02:01:46 +0700 Subject: [PATCH] =?UTF-8?q?[CLAUDE]=20Docs:=20S191=20closeout-2=20?= =?UTF-8?q?=E2=80=94=20v=C3=A1=20F-1(d)=20STATUS:478=20claim=20=C4=91?= =?UTF-8?q?=C3=A3=20b=E1=BB=8B=20b=C3=A1c=20+=20MIND-3=20(closed-check=201?= =?UTF-8?q?1/0)=20+=20=5Fend=20ch=E1=BB=91t=20L15=20[skip=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5 --- .claude/sessions/session-15/_end | 7 ++++ .claude/sessions/session-15/_mind-s-15.md | 33 +++++++++++++++++++ .../sub-ctx-audit-close.md | 16 +++++++++ .../sub-ring2-audit.md | 29 ++++++++++++++++ docs/STATUS.md | 2 +- 5 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 .claude/sessions/session-15/_end create mode 100644 .claude/workflows/runs/2026-08-13-S191-bookend-close/sub-ctx-audit-close.md create mode 100644 .claude/workflows/runs/2026-08-13-S191-bookend-close/sub-ring2-audit.md diff --git a/.claude/sessions/session-15/_end b/.claude/sessions/session-15/_end new file mode 100644 index 00000000..ac820488 --- /dev/null +++ b/.claude/sessions/session-15/_end @@ -0,0 +1,7 @@ +summary-frozen-s15: L15 (3 window) — YC-028 cứu prod 4 tầng · YC-029/030 GĐ3 ship deploy #600 · P0-2 trắng màn ×2 → VÁ GỐC #92 (npm ci + lockfile + GUARD-92, run #488 PASS 6/6 hash CI==local 4/4) · cửa ngoài-giờ (cron Gitea + cứu Vietreport_Master khỏi RECOVERY_PENDING) +pointer: docs/changelog/sessions/2026-08-12-2252-S189-S191-yc028-yc030-l15.md +carry: w5-host-ondeleted · w8-delete-policy · reset-doi-het · sentinel-truoc-bu · mind-dinh-chinh-mot-be-mat · session-end-thieu-buoc-ghi-block · du-cua-rule-khong-phai-phep-kiem (RE-STAMP @S191 = 52 slug ở HANDOFF) +pending-anh: KIỂM PROD GĐ3 (bundle CR538vZx/C10ta-wB) · pin node runner hay khai không-pin · ca-3 của "bị 2-3 lần rồi" · (76)(77)(78)(79) · (89) jump 4 class · (74) rotate vrapp · value_protect · YC-008↔YC-010 · (22)(67)(72) +pointers: .claude/workflows/runs/2026-08-13-S191-bookend-close/ · .claude/workflows/runs/2026-08-12-S190-soltuon-dieu-chinh-hd/ · .claude/workflows/runs/2026-08-10-S189-bookstart-open/ +h24-tick: counter=65 +markers: _pause=2 · _tiep=2 · _snapshot=2 · mind-blocks=4 diff --git a/.claude/sessions/session-15/_mind-s-15.md b/.claude/sessions/session-15/_mind-s-15.md index 0eb7bcd1..94f53fc6 100644 --- a/.claude/sessions/session-15/_mind-s-15.md +++ b/.claude/sessions/session-15/_mind-s-15.md @@ -42,6 +42,39 @@ Máy chỉ quét phần **DƯỚI** marker đóng khối luật. Khối luật (`_MIND_TOP_MARKER` trong scripts/session_ctx.py) -- khac khuon `FLOW-START` cua _context (khong may nao doc). --> +## MIND-3 — 2026-08-13T02:05 @ d6026b14 (window 3, @closeout — refresh bookend) + +### A. Gói-turn + +- Cửa-sổ 3 = `/tiep` nối S190 → **cứu prod 2 lớp** (cửa ngoài-giờ: cron Gitea + `Vietreport_Master` khỏi RECOVERY_PENDING) → **P0-2 eOffice trắng màn** → **vá GỐC #92** (`305b573f`: `npm ci` + lockfile-committed + GUARD-92) → CI **#488 PASS 6/6, hash CI==local 4/4** → runtime-verify 2 app console 0 lỗi → closeout 12 vai. +- Datum bền: **6/8 vai @close garble #53** — recover trọn bằng SendMessage-resume + artifact đĩa, **0 việc mất**. + +### B. Hướng-tiếp + nhánh-đã-loại + +- Đi tiếp: **anh kiểm prod GĐ3** trên bundle mới (`CR538vZx`/`C10ta-wB`); "ổn rồi" ⇒ mở W8. +- Nhánh ĐÃ LOẠI cửa này: **dọn npm-cache/workspace runner** (giả thuyết ② — run #488 bác: ra 4/4 hash trùng local mà không dọn lần nào) · **pin node runner** (chưa làm, chờ anh — không phải loại). + +### C. Kế-hoạch (delta suy-nghĩ) + +- 🔴 **ĐÍNH CHÍNH claim chết trong MIND-2 §C** (block đó BẤT BIẾN, không sửa đè — đây là bản đính chính hợp lệ): câu *"Root-cause P0 = disk KHÔNG phải node_modules ⇒ #92-candidate đóng được"* **ĐÃ BỊ BÁC 2 VÒNG**. Root-cause thật + chuỗi bác đo được ⇒ trỏ `docs/gotchas.md` §92 (không chép lại lập luận). Cùng claim còn nằm ở `_context-s-15.md:87` + `_snapshot-2.md:13` — **để nguyên** (rời đường nạp khi L15 đóng; sửa `_context` = phá luật CẤM-rewrite FLOW). +- **Bài lớn nhất cửa này:** *"vá một bề mặt rồi tưởng đã vá cả lớp"* — lead vá `gotchas.md` mà bỏ `STATUS`, tái diễn **đúng defect** mà `lead-stale` F1 vừa chỉ tên (*sửa một phía trong cùng một hơi viết*). `ctx-audit` F-1 bắt: 4 bề mặt mang claim, chỉ 1 được vá, và bề mặt **sống lâu nhất** (`STATUS`, canonical) thì bị bỏ ⇒ đã vá @closeout. +- **Verify deploy phải có 1 phép đo RUNTIME** — 2 lần trắng màn đều lọt vì mọi cổng đo FILE (byte-match + HTTP 200), không đo CHƯƠNG TRÌNH CHẠY. Byte-match giữa 2 đầu mà **cả hai đầu chưa ai chạy** thì hai file giống hệt nhau vẫn cùng crash. + +### D. Đang-thảo-luận + +- Pin node/npm runner (`.nvmrc`=20 CÓ ở `fe-*/` nhưng CI 0 bước đọc — ghost-wire class-2) — treo-chờ-anh +- Lớp ③ archive **đã bão hoà** (5/5 vật khoá, append/drain 2,5×) ⇒ cần đổi cơ-chế, không cắt sâu hơn — treo-chờ-anh +- Đơn-vị governor byte ⟂ ký-tự: `lead-gap` nay **99,8% theo KÝ-TỰ** ⇒ lần đầu 2 thước sắp đồng ý — đang-cãi +- `session-end` thiếu bước ghi block `_mind` (lần 3, `ctx-audit` F-3) — mới-nêu +- Ca-3 của *"bị 2-3 lần rồi"*: sổ truy được 2 ca có vết, ca-3 không vết — treo-chờ-anh + +### E. Dòng-sống spawn/engine-run (window 3) + +- Vá gốc + verify: `cicd-monitor` → **PASS 6/6** (run #488, hash CI==local 4/4) · artifact `.claude/workflows/runs/2026-08-12-S190-soltuon-dieu-chinh-hd/sub-cicd-va-goc-92.md` +- Bookend @close, artifact trong `.claude/workflows/runs/2026-08-13-S191-bookend-close/`: `tooling-auditor` **PASS_WITH_FLAGS 8** · `harvest-curator` **GATE-HOLD 6** · `lead-stale-auditor` **10 FLAG** · `lead-gap-auditor` **7 FLAG** · `ring1-audit` **33 ĐẠT/2 TRƯỢT** (2 TRƯỢT rơi vào PIN của lead) · `ring2-audit` **15 ĐẠT/0 TRƯỢT** · `harness-eval` **MIXED 37 trục** · `harness-refine` **3 action/16 BÁC/6 ESCALATE** · `harness-audit` (đang chạy) · `ctx-audit` **TRƯỢT 6 FLAG** · `ring5-audit` (đang chạy) · `ctx-verifier` @tiep-2 **13 cờ** +- Engine-đắt: 0 lượt cửa này (không gọi lệnh engine per-invocation nào). + + ## MIND-2 — 2026-08-12T22:52:12+07:00 @ edad406f (window 2, @pause-2) ### A. Gói-turn diff --git a/.claude/workflows/runs/2026-08-13-S191-bookend-close/sub-ctx-audit-close.md b/.claude/workflows/runs/2026-08-13-S191-bookend-close/sub-ctx-audit-close.md new file mode 100644 index 00000000..f4b56e16 --- /dev/null +++ b/.claude/workflows/runs/2026-08-13-S191-bookend-close/sub-ctx-audit-close.md @@ -0,0 +1,16 @@ +# ctx-audit (vai-3 Ctx) — S191 @close · **`TRUOT — 6 FLAG`** (2H · 1MH · 2M · 1LM) + 8 ĐẠT + 1 INFO +> 🔴 INFO: số PIN lead đưa (`dat=10 TRUOT=0 co=1`) **đã hết hạn**; vai tự re-chạy ra `9/0/2`. **Lần thứ 5** — nếu tuân "đừng phán lại" thì **2 FLAG nặng nhất biến mất**. + +- **F-1 HIGH — đính chính bắt 1/4 bề mặt, bỏ đúng bề mặt SỐNG LÂU NHẤT.** Claim chết nằm ở `_mind:62` (a) · `_context:87` (b) · `_snapshot-2:13` (c) · **`STATUS:478` (d)**. `lead-stale` F8 chỉ nhắm (a). (d) là ca nặng nhất: nằm trong `tiep_reload`, **sống vĩnh viễn qua L15**, và đang dạy `npm ci` — **đúng bản vá vừa ship** — là đường nhiễm, mâu thuẫn trực tiếp `gotchas:1466`. ⇒ lead vá `gotchas` mà bỏ `STATUS` = **tái diễn y hệt defect vừa được chỉ tên** (*sửa một phía*). ✅ **VÁ @closeout**; (b)(c) để nguyên (rời đường nạp khi L15 đóng; sửa `_context` = phá luật CẤM-rewrite FLOW). +- **F-2 HIGH — closed-check SẼ TRƯỢT, chứng bằng CHẠY:** `_mind:76` (MIND-2 §E) chứa token trần `/fable-real`·`/fable-clone`, máy đọc thành đường dẫn ⇒ `exit 1`. Thế kẹt 3 mặt (lệnh bắt xử trước commit · MIND-2 bất biến · cấm xoá con-trỏ để làm xanh). **Lối ra DUY NHẤT = append MIND-3** (phép (4) chấm **block-top**; phép (6) đã chừa sẵn ngân sách "tối đa 2 refresh bookend"). ✅ **THI HÀNH** → closed-check nay **`dat=11 TRUOT=0 exit 0`** *(lượt đầu vẫn trượt vì lead ghi con-trỏ thiếu tiền tố `.claude/workflows/` — máy bắt, đã sửa)*. +- **F-3 MED-HIGH — `session-end.md` vẫn 0 bước ghi block `_mind`** (lần 3): lệnh **đòi khai** `mind-blocks=` (`:411`) và **đòi chấm** (`:413`) nhưng **không chỗ nào bảo viết**. Nặng thêm: file này được sửa @S188 (`ef1d4fbb`) **đúng lượt khắc RULE YC-027 phủ-đủ-cửa** mà vẫn không thêm bước thiếu ⇒ bài học nằm trong cùng file, cùng lượt mở, vẫn không tự bật (lần 4 của class). +- **F-4 MED** §E phủ **0 spawn** của window-3 (`_mind` đứng im 167 phút) — MIND-3 đóng luôn khoản này. **F-5 MED** mồi-ngầm S189 *"dựng phép kiểm ĐỦ-CỬA"*: **ĐẠT vế nhà** (4 nhà durable) nhưng **TRƯỢT vế bản chất** — cái land là **văn bản luật** dán 2 cửa, không phải **phép kiểm**; đo: `đủ-cửa` trong `governance-detectors.ps1` (2.448 dòng) = **0**, control dương `YC-027` = 4 tệp ⇒ vá 1 instance, không dựng cơ chế. **F-6 LOW-MED** chặn trước off-by-one `mind-blocks=` (đã cắn session-12/13). + +## 8 ĐẠT — đáng chú ý +- **Kiểm-vết vai-1** (`ctx-curator` SUA-5): đối chứng **5/5 không lấy mẫu** — áp trọn thật. +- 🔴 **Phán quyết BÁC cờ-6 của lead = ĐÚNG**, chứng bằng đo: slug dùng **gạch nối**, vai-2 grep cụm **có dấu cách** → `grep "max server memory" HANDOFF` = 0 hit (control `grep -c "pin"` = 15 ⇒ thước sống) ⇒ **không phải lead tự bào chữa**. +- Carry MIND-1→MIND-2 **5/7**, 2 ý rời đều **có nhà / đã giải** (hơn hẳn S186: 0/6). Bất-biến chuỗi tự đếm đĩa: `_pause`=2 · `_tiep`=2 · `_snapshot`=2 · ORPHAN-L=0. +- **Nhận xét ngược chiều đáng giữ:** ý *"dọn workspace runner"* bị MIND-2 §C khai tử bằng **lập luận SAI** nhưng **kết cục ĐÚNG** (gốc thật là lockfile) — *đúng đích vì lý do sai, đừng ghi vào sổ như một lần phán đoán tốt*. + +## memoryDelta +carry mới `mind-dinh-chinh-mot-be-mat` · `session-end-thieu-buoc-ghi-block` (lần 3) · `du-cua-rule-khong-phai-phep-kiem`; carry `mind-D-khong-back-propagate` **hạ nấc** (có tiến bộ đo được, chưa đóng). diff --git a/.claude/workflows/runs/2026-08-13-S191-bookend-close/sub-ring2-audit.md b/.claude/workflows/runs/2026-08-13-S191-bookend-close/sub-ring2-audit.md new file mode 100644 index 00000000..972559d0 --- /dev/null +++ b/.claude/workflows/runs/2026-08-13-S191-bookend-close/sub-ring2-audit.md @@ -0,0 +1,29 @@ +# ring2-audit — S191 @close · **`15 ĐẠT / 0 TRƯỢT / 2 KHÔNG-CHẤM-ĐƯỢC`** trên 17 FLAG +> enum-gate **12/12 hai chiều, 0 tự chế class** · falsify 6 (3 HELD / 3 BROKE — **2/3 BROKE nhắm vào chính vai**) · thách-CLEAN đảo chiều: **0 dương-giả**, nhưng 17 **CÓ thổi ở tầng ĐƠN-VỊ** (16 vật, không phải 17). + +🔴 **Cửa sổ time-drift load-bearing:** cặp H24 đo 01:13→~01:32; lead vá lúc 01:45-01:46 ⇒ vai chấm bằng `git show 305b573f:` **không** bằng cây bẩn. *Chấm cây tươi sẽ ra 4-5 cáo-buộc-oan ngược.* + +## Số tự tái dựng — đắt nhất +**(a) Migration 2 bộ lọc, bằng máy:** tổng 147 · **LỌC ĐÚNG** (bỏ `*.Designer.cs` + `ApplicationDbContextModelSnapshot`) = **73** · **LỌC BẪY** (bỏ mọi tên chứa `Snapshot`) = **72**, thủ phạm đích danh `20260717032812_AddPeApprovedBudgetSnapshot.cs`. 🔴 **Nặng hơn vai nói:** đây là **lần 2 cùng cái bẫy** (S166 vai tự dính), và lần này bẫy **đã được khắc vào câu phương-pháp của ô canonical** ⇒ ai "đo lại theo đúng cách ô ghi" cũng ra 72 **vĩnh viễn** — *cái thước hỏng nằm trong sổ*. +**(b) `class_repeat` chụp TRƯỚC/SAU:** vai đo `gap-carry-dropped` = **17** trước khi máy chạy, **18** sau ⇒ *"17→18 không phải claim, là sự kiện vai chứng kiến 2 phía"*; 8 FIRE / 2 RESET **10/10 khớp**. Bất-biến: counter đếm **VÒNG-ĐO không đếm FLAG** ⇒ flag-count phồng **không lây sang tally**. +**(c)** 5 site CẤM-push (6 dòng literal, loại 1 dòng session-log = sổ đóng băng) · **(d)** cap 25.600 vs 25.966/28.094/27.458 · **(e)** `.nvmrc` 2 file `=20`, `deploy.yml` 226 dòng **0 consumer** · **(f)** `tiep_reload.sources`=9, `_mind` là nguồn #4. + +## Falsify — 3 BROKE, 2 nhắm vào chính vai +- **F-1 BROKE (nhắm vai-đo):** bác claim *"v24.15.0 không verify được từ đĩa"* — grep ra **7 file** gồm đúng 2 chỗ vai tuyên 0-hit. **Giảm khinh:** artifact land **01:29:30** = trong đúng cửa sổ vai đang đo ⇒ **vai đo trúng bia đang chạy**. Hệ quả: cảnh báo *"đừng khắc số chưa verify"* **hết cơ sở** — lead khắc vào `gotchas:1473` là **hợp lệ**. +- **F-2 BROKE (nhắm CHÍNH VAI):** suýt phán F1-stale TRƯỢT vì đọc `gotchas:1462` **trên cây tươi** thấy nội dung khác hẳn ⇒ trông y như vu oan; kéo `git show c0395540:` mới thấy **đúng dòng, đúng chữ**. Lần thứ 3 lifetime (S162·S166·nay). +- **F-3 BROKE (nhắm CHÍNH VAI lần 2):** nghi F2-stale thổi "5 site" vì grep ra 6 dòng; thử lại theo trục *"đâu là sổ SỐNG"* ⇒ dòng thứ 6 ở session-log = **loại đúng luật**. Nghi vấn của vai sập. +- **F-4/F-5/F-6 HELD** (bác không nổi 73 · cặp gương lệch thật · 17 nằm trên đĩa độc lập với mọi lời khai). + +## thách-CLEAN đảo chiều +Săn dương-giả ở **4 bia dễ vu oan nhất — cả 4 đều đứng** ⇒ **0/15 dương-giả, 0 ca vu oan lead**. Nhưng 17 thổi ở **tầng ĐƠN-VỊ**: `F2-stale ≡ F3-gap` = **một vật đếm hai lần** (2 vị-ngữ khác nhau, hợp lệ ở tầng CLASS nhưng ai đọc "17 khuyết tật" sẽ đếm thừa) · `F4-gap` là **ERRATA lên lead**, không phải khuyết-tật bề-mặt-lead. ⇒ **Vật riêng biệt = 16; tách errata = 15.** + +## Kiểm bản vá của lead — **ĐÚNG 6/7, nửa 1/7, 1 dư lượng** +✅ `STATUS:470` 73 + thước `ModelSnapshot` (khớp số vai dựng độc lập) · ✅ gỡ CẤM-push (còn **1 hit duy nhất** ở session-log = **ĐÚNG là phải giữ**) · ✅ `.nvmrc` 6/6 site · ✅ cặp gương **vá VƯỢT yêu cầu** (cả 2 = `Mig 32-73`) · ✅ signal 8 FIRE/2 RESET 10/10 · ⚠️ `STATUS:484` còn 1 mention (lead verify: nằm trong lineage 🧊 ⇒ hợp lệ) · ⚠️ WAL còn 4 mention hash chết dạng **văn xuôi** (lệnh `curl` chạy-được đã sạch — phần nguy hiểm; WAL reset ở §6.4 nên tự tiêu) · ⚠️ 2 diary H24 **vẫn > cap** sau archive ⇒ `gap-underfill` vừa fire, **đừng đóng**. + +## 3 escalate lead +1. **Khai ĐƠN-VỊ khi in số FLAG** — 3 lần trong lượt này số đúng mà đơn-vị câm (5 site ⟂ 6 dòng · 4 site ⟂ 16 dòng · "4 đời" ⟂ 3 đời vai đếm). **Lần thứ 3 của class** (S159 · S189 · nay). +2. **Tách `ERRATA-lên-lead` khỏi `FLAG`** — nếu không, mỗi lần vai bắt lead sai tiền-đề thì flag-count tự phồng, và **đúng phía làm nó trông tệ hơn thực tế**. +3. `v24.15.0`: **hạ cảnh báo, giữ số** — sửa **lý do**, không sửa **phán quyết**. + +## Câu dặn +**15 ĐẠT là ĐỘ CHÍNH XÁC, không phải ĐỘ PHỦ.** Vai chứng được mọi FLAG chấm được đều trúng vật thật; **KHÔNG** chứng được cặp H24 đã bắt hết — `lead-stale` tự khai *"10 = SÀN, coverage ~5%, 0/29 persona"*, vai **giữ nguyên nấc đó, cấm làm tròn**. 🔴 Và vai tự khai: **diary của chính nó 27.458 B > cap** — *chấm bài trong lúc mình cũng đang vi phạm đúng ngưỡng mình vừa xác nhận* (no-self-exempt). diff --git a/docs/STATUS.md b/docs/STATUS.md index fdf7e4d8..951bf88e 100644 --- a/docs/STATUS.md +++ b/docs/STATUS.md @@ -475,7 +475,7 @@ monthly re-tier mega-line + ef-core SKILL Mig→59 + 3 vocab-fork (2026-07-01 du | Policies | **480** | 🔄 **480 @S187 W3** = All 120 × 4 (DELTA: **+28** = 7 `AwV2_Hd*` × 4 actions — 7 quy trình duyệt HĐ theo LOẠI, YC-023/YC-024). Đo RUNTIME, không suy từ số cũ: nạp `SolutionErp.Domain.dll` vừa build → `MenuKeys.All.Length × MenuKeys.Actions.Length` = 120 × 4 (`Distinct()` = 120 ⇒ 0 key trùng). 🧊 **452 @S166 K4a** = All 113 × 4 (máy khoá: test T2 `KhkkGroupMenuSeedTests` đỏ nếu drift; DELTA vá-2: +4 ContractCatalog K1 · +32 AwV2_KhkkN* K3 · +196 Khkk_G* K4a). Cũ: **220 @S161** (W1 KHKK: `All` +`KeHoachKyKet` ⇒ 55 × 4 — reviewer F-2 bắt cặp-row-đôi đúng luật dòng dưới) · 🆕 **row MỚI S121** (wave adap-6-broadcast W2 — H24 GAP-3: `governance-detectors.ps1` `Get-StatusValue` resolve canonical TỪ bảng này; **KHÔNG có row ⇒ token `policy` UNRESOLVED ⇒ nửa `policy` của GAP-3 không thể fire** ⇒ detector khai FAIL-LOUD + SKIP, KHÔNG im-lặng-giả-vờ-xanh). 🔴 **DERIVED, KHÔNG độc-lập:** `Policies = |MenuKeys.All| × |MenuKeys.Actions| = 55 × 4 = 220 (@S161; trước W1 = 54 × 4 = 216)` — sinh runtime ở `src/Backend/SolutionErp.Api/Program.cs:82-89` (`foreach menu → foreach action → opts.AddPolicy($"{menu}.{action}")`), `Actions = ["Read","Create","Update","Delete"]` (`MenuKeys.cs:167`). ⇒ **row này BUỘC đổi CÙNG row `Menu keys`**: thêm 1 menu key ⇒ 55 × 4 = 220; sửa `Menu keys` mà quên `Policies` ⇒ detector flag derived-doc thay vì flag chính chỗ sai. Ground S121 bằng đếm mã-nguồn (`MenuKeys.All` = 54 entry, `public const string` = 54, khớp) — KHÔNG chép số từ spec. ⚠️ `.claude/skills/permission-matrix/SKILL.md` ghi **~240 = STALE** ⇒ W4 vá (🔴 chuỗi H24 §2(4) BẮT BUỘC: detector fire → cổng chứng-kiến → RỒI MỚI vá; vá trước = giết chứng-nhân sống) | | Menu keys | **120** | 🔄 **120 @S187 W3** (đo RUNTIME `MenuKeys.All` bằng cách nạp DLL vừa build, KHÔNG đếm mắt: `ALL=120 · DISTINCT=120 · HD_KEYS=7`). DELTA **+7** = `AwV2_Hd{TP,GK,NCC,DV,MB,NTNCC,NTDV}` — 7 leaf Designer cho 7 quy trình duyệt HĐ theo LOẠI (YC-023/YC-024), sinh by-construction từ `ContractApprovalWorkflowFamily.Members` qua `MenuKeys.ContractWorkflowMenuKeys` ⇒ CÙNG bộ sinh với vòng seed menu-row trong `SeedMenuTreeAsync` (invariant T6: key vào `All` mà thiếu menu-row = Permission FK nổ lần boot đầu). 🧊 **113 @S166 K4a** (đo RUNTIME `MenuKeys.All` — test T2; +49 `Khkk_G{2-8}`+42-leaf bộ-sinh by-construction K4a · +8 `AwV2_KhkkN1..N8` K3 · +1 `ContractCatalog` K1 trên nền 55). Cũ: **+1 S161 `KeHoachKyKet` vào `All` (W1 KHKK — policy `KeHoachKyKet.*` sinh runtime; menu-row prod KHÔNG đổi, 142 giữ)** · +1 S69 `Off_Dashboard` (landing Văn phòng số). Prev re-ground S61 (`MenuKeys.cs` const — Mig 50 gỡ 4 `Bg_*` Budget menu cũ). Prev 57 (S58) | | Tests | **697 PASS** | **45 Domain + 652 Infra** · 🔄 **697 @S190 — cicd-verify CI run #600 `091073f9`** (deploy YC-029+YC-030 GĐ3; Δ+17 trọn ở Infra = YC-029 +13 [W1 menu-drift + W5 delete-guard 13-ca] + YC-030 +4 [`ContractApproveFinalizeTests` nhánh finalize]; 0 Failed/0 Skipped, đối chứng local `dotnet test SolutionErp.slnx` @gate-cụm). 🧊 **680 @S188 — ĐO ×2 nguồn độc-lập** (`dotnet test SolutionErp.slnx` local @gate-cụm + gate CI **run #482** `b275893c` tách-phần 45/635; đối chứng thứ 3 `sub-reviewer-cum.md`). **+12 vs S185** = 4 test-before W1 (`UpdateAwDefinitionTests` W1a/W1b bom per-type) + T2/T6 menu-key drift W3 + 3 security W6-BE (`ContractWorkflowServiceApproveV2Tests` đúng-trạm) + collateral. 🔴 **Ô này lệch 2 đời trong phiên S188** (668 → 672 đợt-1 → 680 cụm) — `lead-stale-auditor` DEEP FLAG-2 bắt, class `view-stale-count`, cùng ô đã 4 lần tái phát ⇒ **nguồn cập nhật = cicd-verify lượt kế, KHÔNG chép tay**. 🧊 **668 @S185 — ĐO BẰNG CÁCH CHẠY THẬT ×2 nguồn độc-lập** (`dotnet test SolutionErp.slnx` @/tiep-verify + `ring2-audit` tự chạy đối-chứng cùng ngày): Domain 45 · Infra 623 · 0 fail 0 skip. Lineage: +15 KHKK-mirror @S182 (14 spec + T15) + +8 `UploadDuyet_*/UploadCanCu_*` YC-016 @S183. 🧊 **645 @S179** (45D+600I — ô này từng kẹt 645 tới S185 trong khi suite đã 668: stale-F3 canonical-poison, máy lấy ô này làm thước in 6 flag khuyên vá về số SAI — vá @S185). 🔴 Không lấy số từ doc: `lead-stale-auditor` FLAG-4 bắt ô này còn **644**, mà 644 đang là **THƯỚC** cho 6 flag derived-stale của detector ⇒ canonical sai thì máy khuyên vá về số sai (class canonical-poison S148/S166). 🔸 Breakdown cũ ghi "599 Infra" cũng lệch — **600**. 🧊 **644 @S168 #444** (+5 Fact Lines-editor) · 🧊 **639 @S168-sáng** (đo tươi local 45D+594I sau K7 Δ+17; chuỗi K lineage: 597 K1 → 614 K3 → 622 K4c @S167 KHỚP CI #439 tách-phần → **639** K7 — gate `639=45+594` KHỚP cicd-K7 dòng-1) · 🧊 **+28 @S161** (5 wave KHKK: W1 566 → W2 574 → W3 580 → W6 587 → W7 590; đo tươi @S162 `dotnet test` 45+545, gate CI Run #432 khớp). ~~45 Domain + 517 Infra~~ · 0 fail / 0 skip · **S155 +30** (PE xóa-by-approver: `PeDeleteByApproverTests.cs` + T26/T27 — 🔴 **T27 khoá CẢ LỚP lỗi** *entity-có-cờ-mà-DTO-không-có* bằng reflection [mọi cờ `Allow*` trên entity phải có mặt trên DTO], **fault-inject xác nhận có răng**: tiêm bug ⇒ ĐỎ, khôi phục ⇒ xanh — không phải guard tuyên-bố suông; T26 giữ ĐỎ có chủ ý vì bug production thật, lead vá bằng đảo thứ tự chứ KHÔNG nới assert. Số 562 cross-check 2 nguồn độc-lập: log CI run #417 + `dotnet test` local @S156) · **S147 +4** (`ProjectCodeNormalizationTests` — Trim khi lưu + kiểm-trùng bỏ-dấu-cách; 🔴 **ô canonical này STALE 528/483I suốt S147→S148**, header `:6` và session-log S147 đều ghi 532/487I từ đầu — closeout S147 vá header mà quên ô canonical; H24 `lead-view-auditor` bắt @S148, lead verify 3-nguồn rồi vá) · **S134 +8** (`PePendingAccumulationTests` C1-C8 lũy-kế-TẠM-TÍNH: C1 ChoDuyet+winner vào delta-selected + PriorPes · C2 TuChoi/DaDuyet loại sạch · C3 Nháp list-only KHÔNG cộng tiền [D1] + TraLai vào delta-submitted [D2] · C4 peer-window CreatedAt · C5 delta âm signed · **C6 complementary-no-double-count exact-numbers [ComputeAsync bất động khi thêm peer non-terminal]** · C7 frozen→pending 0/null · C8 D4 changelog `[S134 pending-prior]` positive+contrast) · **S133 +11** (`PeBudgetFreezeTests` freeze-NS-at-DaDuyet: **T0 repro test-before RED→GREEN** [phiếu DaDuyet phải giữ số cũ sau `UpdatePeBudgetPro` — RED bắt 999tr @:184 pre-fix, phiếu đưa tới DaDuyet QUA service finalize mirror `PeApproverFinalizeTests` KHÔNG seed thẳng Phase] + **T1-T9** spec-coverage [snapshot các nhánh finalize + display-gate + 2 terminal-guard chặn sửa NS phiếu đã kết thúc (cả Admin) + backfill] + **site-5 AdminOverride** [reviewer catch — override thẳng → DaDuyet cũng chốt snapshot]) · **S118 +8** (PRO-perm scope-isolation **+4** `ProcurementMasterAccessSeedTests` [reflection no-prod-touch: upgrade-path Suppliers R+C+U + Master-Read · **scope-isolation** DeptManager-riêng vẫn revoke=false · insert-path no-Delete · idempotent] · ReportsController authz **+4** `AuthorizePolicyRegressionTests` [dashboard/export require Reports.Read · my-dashboard KHÔNG action-policy · class-level [Authorize] intact]) · **S117 +6** (PE endsBeforeCeo pointer-aware **+1** `PeFinalizeProjectionTests.ListPe_EndsBeforeCeo_ChoDuyet_PointerAware_PastFinalizeIsFalse` [ChoDuyet con-trỏ QUA cấp finalize → endsBeforeCeo=false, test-before RED→GREEN + EF-subquery translate smoke] · duyệt-theo-khoảng ProMinMax **+5** `PeApprovedPriceFinalizeTests` [happy set Min+Max · min==max boundary lock strict-`>` · thiếu-Max→Conflict not-finalized · min>max→Conflict · single-source+Max→Conflict wire-bug + regression Max=null] · harness `InvokeApply` 4→5 args fix TargetParameterCountException) · **S116 +9** (PE nhập giá âm: T1 ngân-sách-bất-biến khi quote-âm · T2 winnerQuoteTotal signed-sum · T3 submit-guard all-zero-blocked/pure-neg+net-zero-submittable · T4 CCM-net-threshold) · **S114 +9** (PE multi-NCC per hạng mục: `PeSelectWinnerClearTests` delete-invariant +4 [DeleteQuote/DeleteDetail re-derive IsWinner **test-before RED→GREEN** + guard-no-over-clear + UpsertQuote-update-branch coverage] + impl-lane +5 [per-hạng-mục-total · giaTri-single-partial · threshold-crossing · derive-invariant]) · **S113 +19** (Supplier import v2: `SupplierImportV2DedupTests` 13 [dedup MST-primary+Code-backstop T1-T7 · draft-on-import IsPublic · all-or-nothing · LayoutValid re-bake real-token · **null-Code→nháp FIXED** flipped-from-characterization] + `SupplierPublishAndListTests` 6 [publish-guard Code-required→409 · unpublish · list-filter published · DTO IsPublic]) · **S112 +18** (Supplier `SupplierExcelImportServiceTests` +10 [case-collation dedup có-RĂNG SQLite-BINARY-collation-nên-chứng-dedup-ở-SERVICE · fill-nulls-safe · all-or-nothing-abort · parser abs-cell-index/#REF!-null/header-fingerprint · Type-lạ→NCC · Status-emoji-strip] · PE `PeSubmitGuardAndBypassTests` 4-update→A1 [minOwn subordinate-only, pointer-stop] + 8-new [A1-happy · non-contiguous · EDGE-5 non-admin-throw/admin-pass/system-pass · opinion-history log/none]) · Prev 440: **S96 +6** (PE `PeApproverFinalizeTests` +2 [#6 finalize-opt-out→advance-CEO · #7 stale-noti-clear ExecuteUpdate] · `PeSuggestedPriceSetterAuthzTests` +4 [price-lock phase-guard after-submit — PRO/CCM ChoDuyet/DaDuyet→Conflict, Admin-override; +sửa SeedPeAsync default ChoDuyet→DangSoanThao spec-change]) · **S92 +3** (`AdminOnlyModulesRevokeTests` ẩn 5 nhóm menu chỉ Admin — non-Admin revoked-4-cờ / Admin untouched / Pe_* preserved) · **S91 +9** (ChangePassword self-service BE+test) · **S89 +3** (`PeDraftVisibilityTests` IDOR nháp riêng-tư) · **S88 +17** (D1 financials/CEO-notify/HoSoLink null-safe +11 · D2 create-contract multi-winner +6) · **S87 +25** (Mig 58 net +18: `PeMultiWinnerTests` sum + `PeSelectWinnerClearTests` multi-update + `PeSubmitGuardAndBypass` budget=0 + `PeApproverFinalizeTests` 5 auto-finalize [từng 7, −2 khi opt-in→auto rework] + `PeCcmThresholdFinalize`/`PeWorkItemBudget` collateral; Mig 59 +7 `PeCcmBudgetPeriodSetterAuthzTests` role-gate Admin|CCM/budget=0/null-clear) · **S86 +3** (`PeApproverNotifyExcludesDrafterTests` — notify "cần duyệt" loại NGƯỜI TẠO phiếu: drafter-excluded · co-approver-vẫn-nhận · drafter-vẫn-nhận-chuông-kết-quả) · **S85 +18** (PE CV PRO C5 hủy/đổi NCC winner +10 · urgent drafter-self-unset +5 · workflow-preserve bug-class S42 +3 `PeUpdateDraftWorkflowPreserveTests`) · **S83 +2** (PE require-workflow: `PeWorkItemGuardTests` ApprovalWorkflowId `NotEmpty` ×2 validator + submit-guard rewrite test 7/13 `PeSubmitGuardAndBypass` V1-submit-deprecated, no-count-change) · **S77 +10** (+7 `PeSuggestedPriceSetterAuthzTests` ghi chú PRO/CCM Mig 57 absolute-set/role-gate/null-clear/max-1000 · +3 `PeUrgentToggleAuthzTests` rewrite cờ-gấp **BẤT ĐỐI XỨNG** SET=function role / UNSET=function+DeptManager, plain-PRO-unset Forbidden) · **S76 +5** (`PeWorkItemBudgetTests` PRO split: set ProInitial+ProAdjust gồm âm · validator ProInitial≥0/ProAdjust-cho-âm · full=proFull khi CCM empty · full=CCM khi CCM present) · **S74 +5** (`PeWorkItemBudgetTests` §4b CcmNote: set CCM/Admin · null-clear absolute-set · non-priv Forbidden+no-mutate · all-3-persist) · **S73 +28** (PE opt-in finalize spec 6→11 + 10 giá-chốt `PeApprovedPriceFinalizeTests` + 13 setter-authz `PeSuggestedPriceSetterAuthzTests`) · **S69 +20** (Office-golive OfficeModulePermissionSeed 6 + PE PeCcmThresholdFinalize 5 + PeUrgentToggleAuthz 9) · **S67 +23 HRM test-after** (DepartmentTreeTests 8 cycle-guard/rollup + PeHoSoLinkTests 9 absolute-set + HrmProfilePermissionSeedTests 6 reflection-seed) → 286 · S61 +22 `PeWorkItemBudgetTests` −14 `BudgetPolicyTests` −1 → 263 · S60 +14 `PeSubmitGuardAndBypassTests` +2 spec → 256 (Domain 58→45 do drop Budget module tests) | -| Gotchas | **92** | 🔄 **92 @S191** — **+S191 #92** (runner build-env NHIỄM: CI exit-0 + **byte-match CI↔prod** + smoke 200 nhưng bundle **CRASH runtime** `useState null` → trắng màn; 2 ca S189+S191 [#600: fe-user CI 1.803.881B vs local 1.700.709B **+103KB** CÙNG commit, local deterministic 2-build-1-hash; fe-admin lệch +39KB nhưng sống — nhiễm KHÔNG đồng đều]; giả thuyết "root-cause=disk, deploy.yml xóa node_modules fresh nên đóng được" BÁC ca-2 — npm-cache SYSTEM [di chứng #89] vẫn là nguồn: `npm ci` kéo từ cache hỏng; fix chuẩn ×2 = build local HEAD → scp đè app chết GIỮ bundle hỏng làm rollback-1s → verify RUNTIME console+read_page; luật: verify deploy FE PHẢI có 1 phép đo runtime — file-integrity+HTTP-200 chưa đủ · bundle CI lệch local cùng-commit = ĐỎ · sau sự cố hạ tầng coi MỌI cache toolchain là nghi phạm · ràng buộc CẤM-push GỠ @run #488 — mốc điều-kiện giữ cho lần sau) · 🧊 **91 @S189** — **+S189 #91** (push land trên ĐĨA nhưng tầng-app Gitea CÂM — 0 run/0 status dù MỌI tín hiệu quen XANH [runner Running · ENABLED · filter đúng · không push-đè]; tố cáo bằng **2 nguồn LỆCH cùng API**: `branches/main→commit.id` [git-đĩa] tiến ⟂ `repo→updated_at` [DB] đứng ⇒ CI **chưa từng được gọi**, không phải đỏ; kèm `gitea.log` 0-byte 11,5h [xoay không mở lại] ⇒ restart mở logger + `workflow_dispatch` API → run #486 ship trọn; cost-của-thuốc: restart kích re-index 25' tranh RAM → latency bimodal = số bẩn, khai chứ không giấu; vá RAM cùng lượt `max server memory` **unbounded→1200MB** [PLE 522→1123, A/059 0,58s]; luật verifier: `updated_at ≥ push-time` TRƯỚC khi tuyên "đang chờ CI") · **+S189 #89** (cache automation phình vô hình ăn sạch ổ C — `gitea repo-archive` 16,49GB + `npm-cache` SYSTEM 12,76GB → free **−20MB** → SQL `Error -2` không mở nổi connection → "ko duyệt được"/GET-500, FE gom mọi lỗi vào "Không tìm thấy phiếu" [#44] ⇒ nghi oan phiếu trong khi phiếu NGUYÊN; fix dọn 30GB + `AUTO_CLOSE OFF` ×3 DB [ON = mỗi connection mở lại ~5s] + FE tách 404⟂500 5-site ×2-app; guard runbook §Disk-free + cicd-monitor 1b; luật: prod chậm/mất/không-lưu ⇒ `fsutil diskfree` TRƯỚC khi nghi data) · **+S189 #90** (`ssh … \| head` cắt pipe → sshd Windows-OpenSSH MỒ CÔI spin full core — 3 orphan bão hòa máy 3-core, SQL `ASYNC_NETWORK_IO` CPU-66ms-elapsed-29s, client đói CPU không nhận data ⇒ A/059 47s/500 "task was canceled"; kill orphan [CHỪA ancestor-chain] → **0,38s** tức thì; luật: cắt output = `Select-Object -First N` phía REMOTE + đợi cold-start ~48s sau recycle mới đo + op đo nặng tự hỏi "ngắt rồi để lại gì") — sự cố YC-028 trọn: `runs/2026-08-10-S189-bookstart-open/run.md` + RCA `YC028-S189` error-ledger. 🧊 **88 @S185** — **+S185 #88** (sự cố prod 2 tầng: disk C: đầy → 2 DB RECOVERY_PENDING → Disk-Cleanup "free space" **NÉN NTFS đúng file .mdf/.ldf đang đóng** → SET ONLINE fail `Msg 5118`, login prod 500 "transient failure UseSqlServer" + Gitea push 502/unpacker CÙNG GỐC; fix OFFLINE-từng-DB → backup copy → restart-service-nhả-handle → `compact /U` 4 file + folder → ONLINE, `Recovery is complete` **0 mất data** [58 PE · 21 user · 97 bảng khớp]; luật: Msg 5118 ⇒ check `compact` TRƯỚC khi nghĩ restore + CẤM nén cây SQL DATA; kèm phát hiện **1433 phơi Internet, `sa` bị brute-force** — chờ anh vá firewall). 🧊 87 @S179 flush — đo đĩa `docs/gotchas.md` max anchor = **87** (`lead-stale-auditor` FLAG-5 + máy HIGH `canonical-itself-stale`; #87 sinh ở S177 vá lệch 2 tầng). 🧊 **+S168 #86** (2-push-sát → Gitea auto-CANCEL run đầu cùng-branch: CANCELLED ≠ fail — verifier đọc run CUỐI của range + bằng-chứng artifact-level; side-effect @startup chỉ 1-startup cho cả cụm push; ca thật `aaed699` ship qua #442) · **+S162 #85** (menu-key OR-gate FE ≠ policy per-action BE: cây 4-folder GĐ gate `['Khkk_List','Khkk_G1','KeHoachKyKet'].some(can)` NHƯNG endpoint gắn `[Authorize(Policy="KeHoachKyKet.Read")]` [`ContractSigningPlansController.cs:36`] + `MenuPermissionHandler.cs:40` so khớp **CHÍNH XÁC 1 key** — KHÔNG kế-thừa cha, KHÔNG OR key con ⇒ role `Khkk_List=1 ∧ KeHoachKyKet=0`: FE mở cổng → API **403** → folder GĐ2 hiện "—" dưới **MỌI** gói thầu, claim "gate trước fetch ⇒ 0 rác 403" **vỡ**. Bẫy: luật "OR nhiều key" **ĐÚNG ở tầng HIỂN-THỊ** [`GetMyMenuTreeQuery.cs:61-96` trả node khi con `CanRead`] nhưng **SAI ở tầng API-authz** — mặt thứ 2 của #82, lần này **menu-hiện RỘNG hơn API-cho** [#82 là chiều ngược]. Fix = gate đúng key policy CỦA endpoint; **mở controller đọc attribute TRƯỚC khi wire gate**, đừng suy từ cây menu. Reviewer bắt **trước ship**; Dev 13/13 role đều `Contracts=1 ∧ KeHoachKyKet=1` nên **chưa lộ** — lớp "chưa vỡ vì dữ-liệu hiện tại may mắn", vá ngay không đợi triệu chứng). **+S159 #84** (revoker-2-chiều: sửa data tay trên prod bị code-path ungated @restart ĐẢO NGƯỢC im lặng — grant menu SQL tay bị revoker [S92] lật 447/494 row; fix = code-first seeder + gỡ nhánh + guard 2-vế + khuôn 3-chân-kiềng; liên-quan #75/#76 chiều seeder). **+S133 #81-EXT** (instance 2 indirect-assignment, KHÔNG số mới: snapshot-NS-at-DaDuyet hook đặt ở finalize choke-point NHƯNG 2 site gán Phase TRỰC TIẾP bypass — admin-override `PurchaseEvaluationWorkflowService.cs:308` `= targetPhase` + seeder `DbInitializer:1323` `= current` → phiếu vào DaDuyet qua 2 đường này KHÔNG snapshot [frozen=0, display rơi về live = đúng bug đang vá]; reviewer adversarial bắt pre-commit, em-main + 3 invocation implement đều sót — cùng bài enumeration-writer #81; meta: field-đích có hook/derive/snapshot ⇒ grep MỌI assignment-site kể cả override/seeder). +1 S126 (**#83** số AGGREGATE session-cumulative tự-lão-hoá — audit COUNTS đổi bởi CHÍNH spawn review sau đó [2/2/0→4/4/0]; outward mời-reproduce = bảng per-lane theo run-id, KHÔNG số tổng; reviewer-gate bắt, em-main-solo sót). +1 S118 (**#82** menu-flag grant ≠ quyền API thật: display-layer [Permission `CanRead`→`GetMyMenuTree` FE-menu] ⟂ API-authz-layer [controller `[Authorize(Policy=)]`] = 2 tầng ĐỘC-LẬP; grant `Suppliers` R+C+U cho PRO nhưng `PUT/DELETE /suppliers` gate `[Authorize(Roles="Admin,CatalogManager")]` → PRO vẫn 403 sửa/xóa NCC [chỉ Publish/Import theo `Suppliers.Update` là ăn]; ngược lại `ReportsController` `[Authorize]` trần → mọi authed-user đọc `dashboard` tài-chính-HĐ ngược S92; fix gate `[Authorize(Policy="Reports.Read")]` per-method + grep controller authz TRƯỚC khi tin hiệu-lực grant; reviewer adversarial bắt, em-main-solo tin menu-flag=quyền thì sót; liên-quan #44). +1 S114 (**#81** derived-invariant re-derive ở write/select NHƯNG SÓT DELETE writer [DeleteQuote/DeleteDetail cascade] → xóa quote-selected cuối của NCC → `Supplier.IsWinner` kẹt stale [Any(IsSelected)=false] → `CreateContract Where(IsWinner)` gom NCC phantom → **HĐ giaTri=0**; fix helper `PeWinnerInvariant.ReSyncAfterQuoteRemovalAsync` gọi sau SaveChanges 2 handler; **enumeration-writer-trong-spec KHÔNG đáng tin** → grep MỌI `.Remove(`/`.Add(`/`=field` chạm entity chứa field-nguồn; chỉ **verify-adversarial-refute** bắt [invest/review/implement đều sót]; cardinality S87/S88 lên tầng mutation-path). +1 S113 (**#80** null-forgiving `!` che NRE trên external-parsed data: `SupplierExcelImportService.NewSupplier` gán `Code = r.Code!.Trim()` → NullReferenceException khi parser trả `null` cho ô cột-4 rỗng [ĐÚNG path R4 "thiếu Mã NCC → nháp"] → confirm nổ 500 CẢ batch dù preview classify New-draft KHÔNG lỗi; sibling `IsPublic=!IsNullOrWhiteSpace(row.Code)` null-safe nhưng NewSupplier thì KHÔNG; empty-string `""` chạy OK nhưng FE round-trip blank→JSON `null` → nổ. Fix `(r.Code ?? "").Trim()`. **Build 0/0 KHÔNG bắt** [`!` tắt nullable-warning]; chỉ test-before-critical bắt. Lesson: `!` null-forgiving trên dữ-liệu-parse-ngoài = mìn, dùng `?? default`). +1 S97 (**#79** backfill soi NHẦM bảng — transition-marker "[Duyệt KẾT THÚC]" nằm ở `PurchaseEvaluationChangelogs.ContextNote` KHÔNG phải `PurchaseEvaluationApprovals` → Mig 60 backfill match 0, phiếu finalize-CCM giữ flag=0 hiện sai "Đã được CEO duyệt"; fix Mig 61 query đúng bảng. PE 2 bảng lịch-sử tách vai [Approvals=ai-duyệt record :745 · Changelogs=chuyển-phase+marker LogTransition :1073]; verify marker-count prod trước khi tin backfill). +1 S97 (**#78** display-flag suy CONFIG thay RUNTIME → nói dối khi instance lệch config: `endsBeforeCeo` từ "workflow CÓ cấp finalize" thay "phiếu NÀY finalize" → phiếu lên CEO báo sai "không qua CEO"; nặng sau S97 default-flip opt-in; fix field runtime `EndedByLevelFinalize` Mig 60. Flag = "instance ĐÃ làm-gì" KHÔNG "config CÓ THỂ"). +1 S96 (**#77** SPA deploy bundle cache-lag: team thấy UI CŨ dù đã deploy + Ctrl+F5 — index.html no-cache ĐÚNG-chuẩn + JS hash-immutable nhưng browser giữ tab-SPA-mở/cache-local → verify bundle prod **BYTE-LEVEL** (curl + grep string-fix trong `/assets/index-.js`) phân-biệt cache-vs-deploy; **incognito = golden-test**; no-service-worker nên clear-site-data đủ). +2 S91 (**#76** deploy render config từ `.example` KHÔNG phải file-gitignored → prod thiếu setting tới khi điền tay · **#75** seed ungated per-code RESURRECT data đã-wipe mỗi restart → gate sau env-flag `DemoSeed:Disabled` + verify-by-restart-thật). +1 S90 (**#74** Chrome-MCP screenshot kẹt SPA-SignalR `document_idle` → PowerShell `CopyFromScreen` + Win32 lọc-process-`chrome.exe`). +2 S85 (**#72** lệch giờ +7h — DateTime lưu UTC nhưng serialize thiếu 'Z' → FE `new Date()`=local → `UtcDateTimeJsonConverter` global ép UTC-with-Z · **#73** UpdateDraft absolute-set CLEAR field SÓT khỏi pattern null-safe = bug-class S42 → guard `if (request.X is not null)`). +1 S78 **#71** (thêm enum value vào entity DÙNG-CHUNG → pollute UI/guard phân-loại theo PROXY-predicate `supplierId===null` thay vì enum tường minh; file-khi-duyệt purpose=5 lẫn "Bảng so sánh" + false-pass submit-guard → grep mọi field-proxy predicate loại value mới + build-verify TỪNG app; em-main grep no-leak bắt trước deploy). +1 S76 **#70** (FE absolute-set echo field anh-em từ server-snapshot + `invalidate()` fire-and-forget → cửa-sổ stale-echo mất-dữ-liệu khi lưu 2 ô liên-tiếp; guard `useIsFetching` gate nút Lưu tới khi refetch land; reviewer workflow bắt, impl self-review sót). +1 S72 **#69** FE bundle-hash non-deterministic + `deploy.yml` rebuild-FE-unconditional → bundle rotate kể cả commit governance (SPA-fallback-200 trap; cicd Run #312). +2 S69: **#67** Tailwind v4 accent palette thiếu stop (teal/violet/amberx/greenx chỉ 50/100/500/600/700; dùng -300 → teal/violet rơi DEFAULT Tailwind sai-hệ, amberx/greenx drop hẳn — build PASS, phải soi dist CSS) · **#68** IDE TS diagnostic giữa background-agent/workflow = snapshot dở-dang (TS server bắn mỗi save), chỉ tin build SẠCH sau-cùng (2× session này: re-skin + PE-FE đều false-alarm). Prev +1 S68 **#66** Tailwind v4 rule element thô `h1-h4{color:#0b1220}` viết NGOÀI `@layer` thắng utility `text-white` → heading render đen; fix ĐIỂM `text-white!` (important, grep dist confirm), KHÔNG move `@layer` (load-bearing ~30+ heading toàn app). Prev +1 S65 **#65** build csproj con (vd `SolutionErp.Api.csproj`) ≠ `dotnet build SolutionErp.slnx` (gồm tests) → miss test-compile khi đổi chữ ký record command (CreateDepartmentCommand +ParentId) → CI CS7036 FAIL-gated Run #291 (deploy chặn, prod nguyên — test-gate làm đúng việc). Fix: build full slnx trước push BE signature-change. Prev +2 S61: **#63** EF scaffold tự sinh `RenameColumn` SAI-semantics khi drop+add cùng type (test xanh không bắt — SQLite EnsureCreated không replay migration) · **#64** `dotnet ef database update` áp Design-DB 0-rows ≠ Dev-DB → data-migrate `Sql()` chạy thật lần đầu trên prod. Prev +2 S59 (#61 sqlcmd `-f 65001` · #62 rename natural-key UPDATE trước deploy) | +| Gotchas | **92** | 🔄 **92 @S191** — **+S191 #92** (runner build-env NHIỄM: CI exit-0 + **byte-match CI↔prod** + smoke 200 nhưng bundle **CRASH runtime** `useState null` → trắng màn; 2 ca S189+S191 [#600: fe-user CI 1.803.881B vs local 1.700.709B **+103KB** CÙNG commit, local deterministic 2-build-1-hash; fe-admin lệch +39KB nhưng sống — nhiễm KHÔNG đồng đều]; 🔴 **ROOT-CAUSE THẬT = `deploy.yml` XOÁ `package-lock.json` rồi `npm install`** ⇒ resolve lại cây theo semver mỗi run ⇒ cùng commit ra bundle khác nhau. **2 giả thuyết ĐỀU BỊ BÁC bằng đo**: ① "root-cause=disk" (bác bởi ca-2) · ② "npm-cache SYSTEM là nguồn" (bác bởi run #488 — ra 4/4 hash trùng local mà **KHÔNG ai dọn cache lần nào**). Thuốc = `npm ci` + lockfile-committed + GUARD-92 (`305b573f`) — `npm ci` là **THUỐC**, không phải đường nhiễm; fix chuẩn ×2 = build local HEAD → scp đè app chết GIỮ bundle hỏng làm rollback-1s → verify RUNTIME console+read_page; luật: verify deploy FE PHẢI có 1 phép đo runtime — file-integrity+HTTP-200 chưa đủ · bundle CI lệch local cùng-commit = ĐỎ · sau sự cố hạ tầng coi MỌI cache toolchain là nghi phạm · ràng buộc CẤM-push GỠ @run #488 — mốc điều-kiện giữ cho lần sau) · 🧊 **91 @S189** — **+S189 #91** (push land trên ĐĨA nhưng tầng-app Gitea CÂM — 0 run/0 status dù MỌI tín hiệu quen XANH [runner Running · ENABLED · filter đúng · không push-đè]; tố cáo bằng **2 nguồn LỆCH cùng API**: `branches/main→commit.id` [git-đĩa] tiến ⟂ `repo→updated_at` [DB] đứng ⇒ CI **chưa từng được gọi**, không phải đỏ; kèm `gitea.log` 0-byte 11,5h [xoay không mở lại] ⇒ restart mở logger + `workflow_dispatch` API → run #486 ship trọn; cost-của-thuốc: restart kích re-index 25' tranh RAM → latency bimodal = số bẩn, khai chứ không giấu; vá RAM cùng lượt `max server memory` **unbounded→1200MB** [PLE 522→1123, A/059 0,58s]; luật verifier: `updated_at ≥ push-time` TRƯỚC khi tuyên "đang chờ CI") · **+S189 #89** (cache automation phình vô hình ăn sạch ổ C — `gitea repo-archive` 16,49GB + `npm-cache` SYSTEM 12,76GB → free **−20MB** → SQL `Error -2` không mở nổi connection → "ko duyệt được"/GET-500, FE gom mọi lỗi vào "Không tìm thấy phiếu" [#44] ⇒ nghi oan phiếu trong khi phiếu NGUYÊN; fix dọn 30GB + `AUTO_CLOSE OFF` ×3 DB [ON = mỗi connection mở lại ~5s] + FE tách 404⟂500 5-site ×2-app; guard runbook §Disk-free + cicd-monitor 1b; luật: prod chậm/mất/không-lưu ⇒ `fsutil diskfree` TRƯỚC khi nghi data) · **+S189 #90** (`ssh … \| head` cắt pipe → sshd Windows-OpenSSH MỒ CÔI spin full core — 3 orphan bão hòa máy 3-core, SQL `ASYNC_NETWORK_IO` CPU-66ms-elapsed-29s, client đói CPU không nhận data ⇒ A/059 47s/500 "task was canceled"; kill orphan [CHỪA ancestor-chain] → **0,38s** tức thì; luật: cắt output = `Select-Object -First N` phía REMOTE + đợi cold-start ~48s sau recycle mới đo + op đo nặng tự hỏi "ngắt rồi để lại gì") — sự cố YC-028 trọn: `runs/2026-08-10-S189-bookstart-open/run.md` + RCA `YC028-S189` error-ledger. 🧊 **88 @S185** — **+S185 #88** (sự cố prod 2 tầng: disk C: đầy → 2 DB RECOVERY_PENDING → Disk-Cleanup "free space" **NÉN NTFS đúng file .mdf/.ldf đang đóng** → SET ONLINE fail `Msg 5118`, login prod 500 "transient failure UseSqlServer" + Gitea push 502/unpacker CÙNG GỐC; fix OFFLINE-từng-DB → backup copy → restart-service-nhả-handle → `compact /U` 4 file + folder → ONLINE, `Recovery is complete` **0 mất data** [58 PE · 21 user · 97 bảng khớp]; luật: Msg 5118 ⇒ check `compact` TRƯỚC khi nghĩ restore + CẤM nén cây SQL DATA; kèm phát hiện **1433 phơi Internet, `sa` bị brute-force** — chờ anh vá firewall). 🧊 87 @S179 flush — đo đĩa `docs/gotchas.md` max anchor = **87** (`lead-stale-auditor` FLAG-5 + máy HIGH `canonical-itself-stale`; #87 sinh ở S177 vá lệch 2 tầng). 🧊 **+S168 #86** (2-push-sát → Gitea auto-CANCEL run đầu cùng-branch: CANCELLED ≠ fail — verifier đọc run CUỐI của range + bằng-chứng artifact-level; side-effect @startup chỉ 1-startup cho cả cụm push; ca thật `aaed699` ship qua #442) · **+S162 #85** (menu-key OR-gate FE ≠ policy per-action BE: cây 4-folder GĐ gate `['Khkk_List','Khkk_G1','KeHoachKyKet'].some(can)` NHƯNG endpoint gắn `[Authorize(Policy="KeHoachKyKet.Read")]` [`ContractSigningPlansController.cs:36`] + `MenuPermissionHandler.cs:40` so khớp **CHÍNH XÁC 1 key** — KHÔNG kế-thừa cha, KHÔNG OR key con ⇒ role `Khkk_List=1 ∧ KeHoachKyKet=0`: FE mở cổng → API **403** → folder GĐ2 hiện "—" dưới **MỌI** gói thầu, claim "gate trước fetch ⇒ 0 rác 403" **vỡ**. Bẫy: luật "OR nhiều key" **ĐÚNG ở tầng HIỂN-THỊ** [`GetMyMenuTreeQuery.cs:61-96` trả node khi con `CanRead`] nhưng **SAI ở tầng API-authz** — mặt thứ 2 của #82, lần này **menu-hiện RỘNG hơn API-cho** [#82 là chiều ngược]. Fix = gate đúng key policy CỦA endpoint; **mở controller đọc attribute TRƯỚC khi wire gate**, đừng suy từ cây menu. Reviewer bắt **trước ship**; Dev 13/13 role đều `Contracts=1 ∧ KeHoachKyKet=1` nên **chưa lộ** — lớp "chưa vỡ vì dữ-liệu hiện tại may mắn", vá ngay không đợi triệu chứng). **+S159 #84** (revoker-2-chiều: sửa data tay trên prod bị code-path ungated @restart ĐẢO NGƯỢC im lặng — grant menu SQL tay bị revoker [S92] lật 447/494 row; fix = code-first seeder + gỡ nhánh + guard 2-vế + khuôn 3-chân-kiềng; liên-quan #75/#76 chiều seeder). **+S133 #81-EXT** (instance 2 indirect-assignment, KHÔNG số mới: snapshot-NS-at-DaDuyet hook đặt ở finalize choke-point NHƯNG 2 site gán Phase TRỰC TIẾP bypass — admin-override `PurchaseEvaluationWorkflowService.cs:308` `= targetPhase` + seeder `DbInitializer:1323` `= current` → phiếu vào DaDuyet qua 2 đường này KHÔNG snapshot [frozen=0, display rơi về live = đúng bug đang vá]; reviewer adversarial bắt pre-commit, em-main + 3 invocation implement đều sót — cùng bài enumeration-writer #81; meta: field-đích có hook/derive/snapshot ⇒ grep MỌI assignment-site kể cả override/seeder). +1 S126 (**#83** số AGGREGATE session-cumulative tự-lão-hoá — audit COUNTS đổi bởi CHÍNH spawn review sau đó [2/2/0→4/4/0]; outward mời-reproduce = bảng per-lane theo run-id, KHÔNG số tổng; reviewer-gate bắt, em-main-solo sót). +1 S118 (**#82** menu-flag grant ≠ quyền API thật: display-layer [Permission `CanRead`→`GetMyMenuTree` FE-menu] ⟂ API-authz-layer [controller `[Authorize(Policy=)]`] = 2 tầng ĐỘC-LẬP; grant `Suppliers` R+C+U cho PRO nhưng `PUT/DELETE /suppliers` gate `[Authorize(Roles="Admin,CatalogManager")]` → PRO vẫn 403 sửa/xóa NCC [chỉ Publish/Import theo `Suppliers.Update` là ăn]; ngược lại `ReportsController` `[Authorize]` trần → mọi authed-user đọc `dashboard` tài-chính-HĐ ngược S92; fix gate `[Authorize(Policy="Reports.Read")]` per-method + grep controller authz TRƯỚC khi tin hiệu-lực grant; reviewer adversarial bắt, em-main-solo tin menu-flag=quyền thì sót; liên-quan #44). +1 S114 (**#81** derived-invariant re-derive ở write/select NHƯNG SÓT DELETE writer [DeleteQuote/DeleteDetail cascade] → xóa quote-selected cuối của NCC → `Supplier.IsWinner` kẹt stale [Any(IsSelected)=false] → `CreateContract Where(IsWinner)` gom NCC phantom → **HĐ giaTri=0**; fix helper `PeWinnerInvariant.ReSyncAfterQuoteRemovalAsync` gọi sau SaveChanges 2 handler; **enumeration-writer-trong-spec KHÔNG đáng tin** → grep MỌI `.Remove(`/`.Add(`/`=field` chạm entity chứa field-nguồn; chỉ **verify-adversarial-refute** bắt [invest/review/implement đều sót]; cardinality S87/S88 lên tầng mutation-path). +1 S113 (**#80** null-forgiving `!` che NRE trên external-parsed data: `SupplierExcelImportService.NewSupplier` gán `Code = r.Code!.Trim()` → NullReferenceException khi parser trả `null` cho ô cột-4 rỗng [ĐÚNG path R4 "thiếu Mã NCC → nháp"] → confirm nổ 500 CẢ batch dù preview classify New-draft KHÔNG lỗi; sibling `IsPublic=!IsNullOrWhiteSpace(row.Code)` null-safe nhưng NewSupplier thì KHÔNG; empty-string `""` chạy OK nhưng FE round-trip blank→JSON `null` → nổ. Fix `(r.Code ?? "").Trim()`. **Build 0/0 KHÔNG bắt** [`!` tắt nullable-warning]; chỉ test-before-critical bắt. Lesson: `!` null-forgiving trên dữ-liệu-parse-ngoài = mìn, dùng `?? default`). +1 S97 (**#79** backfill soi NHẦM bảng — transition-marker "[Duyệt KẾT THÚC]" nằm ở `PurchaseEvaluationChangelogs.ContextNote` KHÔNG phải `PurchaseEvaluationApprovals` → Mig 60 backfill match 0, phiếu finalize-CCM giữ flag=0 hiện sai "Đã được CEO duyệt"; fix Mig 61 query đúng bảng. PE 2 bảng lịch-sử tách vai [Approvals=ai-duyệt record :745 · Changelogs=chuyển-phase+marker LogTransition :1073]; verify marker-count prod trước khi tin backfill). +1 S97 (**#78** display-flag suy CONFIG thay RUNTIME → nói dối khi instance lệch config: `endsBeforeCeo` từ "workflow CÓ cấp finalize" thay "phiếu NÀY finalize" → phiếu lên CEO báo sai "không qua CEO"; nặng sau S97 default-flip opt-in; fix field runtime `EndedByLevelFinalize` Mig 60. Flag = "instance ĐÃ làm-gì" KHÔNG "config CÓ THỂ"). +1 S96 (**#77** SPA deploy bundle cache-lag: team thấy UI CŨ dù đã deploy + Ctrl+F5 — index.html no-cache ĐÚNG-chuẩn + JS hash-immutable nhưng browser giữ tab-SPA-mở/cache-local → verify bundle prod **BYTE-LEVEL** (curl + grep string-fix trong `/assets/index-.js`) phân-biệt cache-vs-deploy; **incognito = golden-test**; no-service-worker nên clear-site-data đủ). +2 S91 (**#76** deploy render config từ `.example` KHÔNG phải file-gitignored → prod thiếu setting tới khi điền tay · **#75** seed ungated per-code RESURRECT data đã-wipe mỗi restart → gate sau env-flag `DemoSeed:Disabled` + verify-by-restart-thật). +1 S90 (**#74** Chrome-MCP screenshot kẹt SPA-SignalR `document_idle` → PowerShell `CopyFromScreen` + Win32 lọc-process-`chrome.exe`). +2 S85 (**#72** lệch giờ +7h — DateTime lưu UTC nhưng serialize thiếu 'Z' → FE `new Date()`=local → `UtcDateTimeJsonConverter` global ép UTC-with-Z · **#73** UpdateDraft absolute-set CLEAR field SÓT khỏi pattern null-safe = bug-class S42 → guard `if (request.X is not null)`). +1 S78 **#71** (thêm enum value vào entity DÙNG-CHUNG → pollute UI/guard phân-loại theo PROXY-predicate `supplierId===null` thay vì enum tường minh; file-khi-duyệt purpose=5 lẫn "Bảng so sánh" + false-pass submit-guard → grep mọi field-proxy predicate loại value mới + build-verify TỪNG app; em-main grep no-leak bắt trước deploy). +1 S76 **#70** (FE absolute-set echo field anh-em từ server-snapshot + `invalidate()` fire-and-forget → cửa-sổ stale-echo mất-dữ-liệu khi lưu 2 ô liên-tiếp; guard `useIsFetching` gate nút Lưu tới khi refetch land; reviewer workflow bắt, impl self-review sót). +1 S72 **#69** FE bundle-hash non-deterministic + `deploy.yml` rebuild-FE-unconditional → bundle rotate kể cả commit governance (SPA-fallback-200 trap; cicd Run #312). +2 S69: **#67** Tailwind v4 accent palette thiếu stop (teal/violet/amberx/greenx chỉ 50/100/500/600/700; dùng -300 → teal/violet rơi DEFAULT Tailwind sai-hệ, amberx/greenx drop hẳn — build PASS, phải soi dist CSS) · **#68** IDE TS diagnostic giữa background-agent/workflow = snapshot dở-dang (TS server bắn mỗi save), chỉ tin build SẠCH sau-cùng (2× session này: re-skin + PE-FE đều false-alarm). Prev +1 S68 **#66** Tailwind v4 rule element thô `h1-h4{color:#0b1220}` viết NGOÀI `@layer` thắng utility `text-white` → heading render đen; fix ĐIỂM `text-white!` (important, grep dist confirm), KHÔNG move `@layer` (load-bearing ~30+ heading toàn app). Prev +1 S65 **#65** build csproj con (vd `SolutionErp.Api.csproj`) ≠ `dotnet build SolutionErp.slnx` (gồm tests) → miss test-compile khi đổi chữ ký record command (CreateDepartmentCommand +ParentId) → CI CS7036 FAIL-gated Run #291 (deploy chặn, prod nguyên — test-gate làm đúng việc). Fix: build full slnx trước push BE signature-change. Prev +2 S61: **#63** EF scaffold tự sinh `RenameColumn` SAI-semantics khi drop+add cùng type (test xanh không bắt — SQLite EnsureCreated không replay migration) · **#64** `dotnet ef database update` áp Design-DB 0-rows ≠ Dev-DB → data-migrate `Sql()` chạy thật lần đầu trên prod. Prev +2 S59 (#61 sqlcmd `-f 65001` · #62 rename natural-key UPDATE trước deploy) | | User memory | **60** | 🔄 **re-ground S179** — đo lại ĐÚNG phương-pháp dòng này tự khai: `ls .claude/auto-memory/*.md | wc -l` = **61**, trừ 1 index `MEMORY.md` = **60** (`lead-stale-auditor` FLAG-9; máy MÙ trục này — không có cross-check). 🔴 Ô này trôi lại chỉ sau **9 nhãn phiên** kể từ lần re-ground trước ⇒ đây là ô **rụng nhanh**, đừng tin số cũ. 🧊 re-ground S170 — đếm đĩa 60 file trừ 1 index = 59 (số "31" stale từ S84; lead-stale FLAG @S169, ring2 verify, vá @S170 SAU khi ring chấm — đúng thứ-tự H24 §2(4) fire→chứng-kiến→vá). +S84 `feedback_derived_flush_execution` (derived→canonical flush = em-main execution KHÔNG gate user-confirm; monitor INFORM-only ≠ cần-anh-duyệt; chỉ ĐỔI-con-số/policy = quyền anh). +S79 `feedback_canonical_spec_over_broadcast` (adap pull canonical-command/§P đừng phỏng-theo broadcast + report-before-stamp dogfood + residual own-diary OK). +S75 `feedback_harness11_engine` (engine governance tự-bảo-trì + gotcha #30-via-Edit + multi-workflow-verify + git-add-specific lesson). re-ground S71 (H1 disk-count: 25 `feedback_*` + 3 `project_*`; STATUS "21" stale từ S64). +S71 `feedback_harness10_run_trace` (run-trace + 3 lesson). Prev +1 S64 `feedback_harness7_outward_writing_quality`; re-grounded S54 base 19 | | Skills | 6 | 3 domain + 3 ops | | Sub-agents | **29** | **+S185 🔬 `ring5-audit`** (vòng-6 nghi-thức cửa phiên — slot (41) ĐÓNG, YC-021/W-2 anh chốt "đồng ý thêm 1 nghi thức"; KIỂM output `tien-kiem-cua` + bảng-nhãn `ritual-labels` 4-nhãn, quyền **đề-nghị-XOÁ-ÁN** khi nhãn nhầm lớp — khác 3 ring kia; wire `session-end §L.b(m)` + `hmw.js` VALID_ROLES 28→**29**; ✅ nấc = **verified-runtime @S185 CÙNG PHIÊN** — registry hot-reload agent-MỚI [data-point lần 2 sau S107, MỚI ⟂ EDIT] + spawn-probe ALIVE fail-closed đúng ngưỡng; KHÔNG cần đợi restart 73) **+S176 🎨 ĐỘI STYLE 3 vai** (`front-end-reviewer-style` · `back-end-reviewer-style` · `database-reviewer-style` — **anh chốt TRỰC TIẾP**, không qua adap). 🔴 **Luật lõi anh giao:** *"quy tắc thì các tính năng đã deploy thành production rồi thì sẽ là chuẩn, trừ khi tao có điều chỉnh lại lần nữa"* — lý-do sinh đội là câu *"mày cứ làm đi làm lại hoài"*. **Ca THẬT làm anh nêu:** S176 vòng-4b lead dựng thùng rác KHKK **thiếu banner + dấu `🗑 xóa ≈`** trong khi màn thùng rác Duyệt NCC **đã chạy prod** có đủ cả hai ⇒ anh phải tự chụp màn gửi sang bảo *"ảnh chỉ là mẫu"*. Trục = **ĐỒNG-NHẤT** (có giống bản đã chạy không) ⟂ `reviewer` = **ĐÚNG-SAI** (có bug không) ⇒ chạy SONG SONG, không giẫm. Địa-phận RỜI theo glob diff: `fe-*/src/**` · `src/Backend/**` trừ `Persistence/**` · `Persistence/**`; **gọi theo diff chạm đâu**, diff không chạm ⇒ KHÔNG gọi (không phải bỏ sót). 🧊 **Anh nêu ban đầu 4 con** (có `clean-code-reviewer-style`) **rồi tự chốt lại 3** (*"3 con tao nhầm"* + *"chốt theo ý mày"*): con clean-code phủ chồng cả 3 con kia nên **không viết nổi câu scope-rời** mà roster này bắt buộc ⇒ trục clean-code (đặt tên · trùng lặp · mật-độ comment · pattern drift) **gộp vào từng con trong địa phận của nó**. 🔸 **Máy trước, vai sau** (đo S176): FE có ESLint chạy trước (`npm run lint`) nhưng **CI KHÔNG gác** (`grep 'npm run lint'` trong workflows = **0 hit**) và đang tồn **89 vấn-đề / 78 lỗi** (fe-admin 42 · fe-user 47); **BE 0 máy style nào** (0 `.editorconfig` · 0 analyzer · 0 `dotnet format`) ⇒ con BE gánh cả lớp cơ-học, khác con FE — 🧊 **đây là SỐ ĐO NGÀY 2026-08-06 (S176), giữ làm LINEAGE có ngày, KHÔNG phải trạng-thái hiện-hành**; nguồn sống = phép-đo per-spawn trong `back-end-reviewer-style.md` §0 (SỬA-6a @S179: claim này từng chép ra **4 site** ⇒ cắm `.editorconfig` là 4 chỗ sai cùng lúc, detector chỉ so SỐ nên không bắt). Cắm được máy vào CI thì **PHẢI cập-nhật lại persona con BE** trả lớp đó về máy. ⚠️ **~~roster 26 > `hmw_width.cap` 20~~ ✅ **ĐÓNG @S181: cap 30, roster 23 ≤ 30 ⇒ 0 lane bị bỏ**** ⇒ full-roster-sweep LOUD-skip nhiều lane hơn trước — số cap = quyền anh (O-7 vẫn treo, nay lệch rộng hơn). 🔸 **Nấc = executed-file / verified-pending-restart** — 3 vai CHƯA spawn-probe; `hmw.js` VALID_ROLES 23→**26**. **+S153 bộ-ba vòng Ctx** (adopt thư `0df10df4` — 🔄 **OWNER-VETO @S153 hub-form 3-vai**: bản đầu (38)(a) 1-vai OWNER-DELEGATED→LEAD-DECIDED, **anh bác cùng ngày** chốt trực tiếp *"Build đủ 3 vai như hub"* qua AskUser = owner chốt THẬT cho quyết này; 🔄 **RENAME cùng phiên theo lệnh anh** *"đặt tên giống hub và sisters để dễ audit"* — tên khai-sinh `ctx-pause-check`/`ctx-reload` → **hub-form `ctx-curator`/`ctx-verifier`** [đo đĩa 3 nhà: hub = curator/verifier/audit · VIPIX = check/reload/chain · hub≠sister ⇒ SE theo HUB-form, tiền lệ rename S149 lead-*]): **`ctx-curator`** vai-1 KIỂM nháp @mỗi-`/pause` (carve-out `pause.md §1` mirror hub O-1(a)) · **`ctx-verifier`** vai-2 ĐỐI-CHIẾU+NẠP-LẠI @mỗi-`/tiep` (dòng `LEAD-PHAI-NHAC-LAI:` = bằng-chứng nội-dung) · **`ctx-audit`** vai-3 SOI-CHUỖI @2-bookend (kiểm-vết vai-1/2, hồi-tố = fallback phiên 1-cửa). Nấc: ctx-audit `file-land + registry-surfaced @S153` cho CẢ 3 vai ctx [🔄 vá @S153 FLAG-6: bản đầu chỉ cấp nấc này cho `ctx-audit` trong khi `hmw.js:42` + writeGuard + README `:27`/`:199`/`:200` chứng 2 vai mới ĐẠT CÙNG nấc — khai THIẾU vẫn là lệch] — spawn-probe ALIVE cả 3 = phiên sau restart T9; hmw VALID_ROLES 20→**23** + writeGuard :228/:235; ⚠️ **roster 23 > `hmw_width.cap` 20** ⇒ full-roster-sweep LOUD-skip 3 lane cuối — số cap = quyền anh, O-7 (câu (40) đang treo). **🔄 RENAME @S149 (anh ratify "OK đồng ý"): 5 vai đổi tên đồng-bộ sister — `tooling-harvest-audit`→`ring1-audit` · `h24-audit`→`ring2-audit` · `sleep-audit`→`ring4-audit` · `lead-view-auditor`→`lead-stale-auditor` · `lead-omission-auditor`→`lead-gap-auditor` (ring* = 2 sister TRÙNG tuyệt đối; lead-* = hub-form, VIPIX-form là prefix). Nấc **NÂNG @cùng-phiên: `registry-listed-in-session`** — harness list 5 tên MỚI + gỡ 5 tên CŨ NGAY TRONG PHIÊN S149 (không restart), **TRÁI phép đo S120/S121 no-hot-reload** (môi trường có thể đã đổi — đây là data-point ĐO ĐƯỢC, không suy). Spawn-probe vẫn CẦN để chứng instantiate (list ≠ spawn được — đúng 0.6b). Tên cũ trong narrative/runs/history = vết lịch-sử, CỐ Ý giữ.** **+S145 🔬 `ring1-audit` (18th sub — round-KIỂM vòng tooling/harvest, C4/C4b adap dot-11 khoản ① `harness-dong-du-vong:51`, owner-decision [2] TÁCH mỗi-vòng-1-con-KHÔNG-gộp). Vai-KIỂM ĐỘC-LẬP đọc OUTPUT H1 `tooling-auditor` (4-mặt freshness) + H2 `harvest-curator` (5-trục integrity), **KHÔNG re-chạy đo**: verdict per-claim ĐẠT/TRƯỢT + falsify ≥2 + **tự tái-dựng ≥1 số CÓ-THỂ-SAI** (đếm `.claude/agents/*.md` vs roster-count H1 · N-harvested/M-spawned) + **thách-CLEAN** (H1 PASS/H2 GATE-0 → mở 1 skill "fresh"+1 sub "harvested" xem thật). 🔴 no-self-exempt ≠ H1/H2 (m-3 S139). **AUTO fire-after-measure @session-end §L.b(g-bis)** — owner-chốt S145 KHÔNG consent-gate (KHÁC trio/H24), fail-safe NO-OP nếu H1/H2 không chạy phiên đó (CẤM ĐẠT-ảo); tuần-tự C4b (invocation SAU con-đo, mtime chứng). Propose-only, backstop = git-diff commit-gate (KHÔNG dựa thiếu-tool `[carry:tools-whitelist-no-teeth]`). `model: opus`+`effort: max`+`memory: project`+`maxTurns: 16`. **Vai #1/3 round-KIỂM** — `ring2-audit` (vòng soi-lead) + `ring4-audit` (vòng nén-ngủ) land dần incremental (§6 broadcast báo-nấc-per-vòng, owner S145). 🔴 **Nấc = executed-file / verified-pending-restart** — registry Agent-tool KHÔNG hot-reload (`agents/README` §Memory discipline — anchor không-số-dòng, vá cite-dòng-trống @S151 per H1 F-3), spawn-probe alive cần **restart CLI**; run-thử-thật @session-end phiên sau. Design-doc: `runs/2026-07-22-S144-adap-dot-11/C4-design-3-vai-kiem.md`.** **+S145 🔬 `ring2-audit` (19th sub — round-KIỂM vòng soi-lead H24, vai #2/3 C4/C4b). Đọc OUTPUT `lead-stale-auditor` + `lead-gap-auditor` (🔴 KIỂM 2 con-đo H24, **KHÔNG soi lead trực-tiếp**) → verdict per-FLAG + tự tái-dựng ≥1 số (flag-count · mở 1 FLAG đối-chứng source · `class_repeat` `.session-counter.json`) + **thách-CLEAN** (H24 báo ít/0 FLAG ⇒ tự soi 1 surface tìm FLAG sót — CLEAN "lead ổn" là ca nguy nhất, khớp H24 §2(1) phép-thử-nhanh). Verify vai H24 KHÔNG tự chế class ngoài enum ĐÓNG `flag_classes`. no-self-exempt ≠ lead-stale/lead-gap (m-3; tên mới @rename S149). AUTO wired `session-end §L.b(j)(ii-bis)` sau cặp H24; fail-safe NO-OP nếu H24 không chạy (nhịp/consent). `maxTurns: 16`.** **+S145 🔬 `ring4-audit` (20th sub — round-KIỂM vòng nén-ngủ, vai #3/3 C4/C4b). Đọc OUTPUT `/sleep-recovery-memory-l2` (`.gist.md` mới + Fidelity verdict + claim giảm-byte) → verdict per-claim + **tự ĐO LẠI byte** archive gốc vs gist (đối-chứng claim) + **thách-CLEAN** (Fidelity 5P/0F ⇒ mở 1 gist đối-chứng `.md` gốc xem có giữ 4-field load-bearing hay nén quá tay) + kiểm bất-biến gist-ADDITIVE (gốc byte-identical). no-self-exempt độc-lập lượt nén (m-3). AUTO wired `sleep-recovery-memory-l2.md Phase 4.5` sau nén; fail-safe NO-OP nếu 0 gist tươi. `maxTurns: 16`.** **+S141/S142 🧪🧭🧮 `harness-eval` + `harness-refine` + `harness-audit` (15th–17th sub — bộ-ba đồng-kiểm HỆ MEMORY, adopt AI_INFRA khuôn 5-câu `58e28bae` khối B, wave adap đợt-9/10; land S141 persona+seed+`hmw.js` VALID_ROLES 14→17, wiring nghi-thức S142 vòng-2 sau khi vòng-1 chết giữa chừng). Read-only INFORM-only propose-only, frontmatter **không khai Write/Edit** — 🔴 nhưng đo S143: **runtime VẪN cấp** (append cuối tool-list, 9/9 vai read-only; nhân-chứng `reviewer` đã Write+Edit thật) ⇒ đây là **tuyên-bố ý-định**, KHÔNG phải chặn-bằng-thiếu-tool; containment thật = single-writer + git-diff commit-gate · `model: opus`+`effort: max`+`memory: project`+`maxTurns: 18`. Trục = **CHÍNH HỆ MEMORY**, chạy **TUẦN TỰ** eval→refine→audit (🔴 CẤM `parallel()` — con KIỂM chạy song song sẽ chấm bản CŨ ⇒ verdict vô-nghĩa): `harness-eval` = con **ĐO** (chỉ trả số nguyên-văn từ instrument, CẤM số-từ-trí-nhớ) ⟂ `harness-refine` = con **ĐỀ-XUẤT** (4 lớp reinject/promote/archive/distill, bắt buộc có mục "đã cân-nhắc→BÁC") ⟂ `harness-audit` = con **KIỂM** (verdict ĐẠT/TRƯỢT per-claim + re-chạy ≥2 số load-bearing; PIN run-folder đích-danh, CẤM tự tìm "run mới nhất"). 🔴 **KHÔNG gộp** với H1 tooling-freshness / H2 harvest-integrity / H24 lead-surface / reviewer diff-code — 4 trục khác nhau. Nghi-thức 2-đầu-phiên **AUTO 1 vòng/phiên GIỮA 2 bookend** (`session-start §2.1.9(a)` canonical + `session-end §L.b(k)(i)` trỏ): owner chốt @S151 — em-main IN 1 dòng trạng-thái rồi CHẠY, KHÔNG chờ gật [🔄 vá @S153 FLAG-4 HIGH: ô này còn khai "consent-gated + anh gật mới chạy" sau khi owner (32) đã lật AUTO, và ngược chính `:466` cùng file; trio đã chạy THẬT 3 vòng S151/S152/S153]; skip → ghi vết WAL `trio: skipped S` (vết-2-lớp, chuỗi skip nhìn thấy được). Budget seed đo TƯƠI `measure-agent-memory.ps1`: eval 1547B · refine 1616B · audit 1513B (l2_*=0 = SEED-STATE đúng, chưa chạy lần nào). 🔸 **Nấc trung-thực = executed-file / verified-pending-restart** — 3 vai CHƯA spawn-probe lần nào (cần restart CLI + anh consent; KHÔNG được đọc thành verified-runtime).** **+S121 👁 `lead-stale-auditor` + `lead-gap-auditor` (13th+14th sub — H24 lead-self-audit, adopt broadcast `2026-07-14-Governance-harness-24`, anh chốt S119 `owner-decisions-15-07-2026`, land S121 wave-W2 `hmw.js` VALID_ROLES 12→14 CÙNG COMMIT roster+STATUS [R3-M2: lệch landing ⇒ C2/B3 flag mọi derived ghi "14" là stale-vs-12 ⇒ detector BÃO trên chính thay đổi của H24]). 2 monitor INFORM-only propose-only, cookie-cutter frontmatter monitor sẵn (`model: inherit` lúc-land [S124 re-pin → `opus`+`effort:max` cùng toàn roster] · `memory: project` · `maxTurns: 18` · 8 tool read-only, **NO Write/Edit**). Trục: `lead-stale-auditor` = **view LỆCH source** (5 class `view-*`) ⟂ `lead-gap-auditor` = **cái BỊ THIẾU** (6 class `gap-*` — +`gap-incident-unrecorded` @S143 owner-duyệt) — 🔴 **KHÔNG gộp** vào tooling-auditor(H1 tooling-freshness)/harvest-curator(H2 harvest-integrity): H24 §2(1) *"gộp là mất tiêu-điểm; cái ta cần là cặp mắt CHỈ dành cho lead"*. Class-flag = **enum ĐÓNG** `lead_self_audit.flag_classes` ở `.claude/agent-memory/memory-budget.json` (11 class = 5+6, vai CẤM tự chế — mở enum là quyền owner). Nhịp = `h24_cadence` cùng file (single-source H24 §2(3) — doc TRỎ key, KHÔNG chép số ⇒ 🔄 **đã GỠ digits `{6/15/3}` @S153** theo `ring2-audit` R-3: chép số ngay cạnh câu cấm-chép-số là **B1-copy** [số vẫn KHỚP canonical nên KHÔNG phải stale — F-6 chống vu-oan]; đọc số sống ở `memory-budget.json → h24_cadence`); 🔄 **HÌNH B @S149**: cặp soi-lead spawn **VÔ-ĐIỀU-KIỆN 2 bookend mỗi phiên** — `light_every` hạ thành **stats-only** (KHÔNG còn cổng bắn), `deep_every` GIỮ cổng nhịp [vá @S153 FLAG-5: ô này còn mô-tả bắn thuần-cadence; đối-chứng hành-vi = cặp chạy @counter 27 với light 1/6 CHƯA tới hạn]; counter `.claude/governance/.session-counter.json` (content-based `last_ticked_head`, KHÔNG blind-increment — hook `wal-flush.ps1` auto-commit `agent-memory/` mỗi turn sẽ làm hỏng đếm mù; đặt ngoài **4 path** hook CÓ CHỦ-ĐÍCH — *hook nới từ 3 lên 4 @S146 khi thêm `.claude/sessions/`; mệnh-đề "governance/ nằm ngoài" đã RE-VERIFY sau khi nới, vẫn đúng*). ✅ **verified-runtime S122** (spawn-probe toàn-roster-KHI-ĐÓ SỐNG post-restart — **N=14 tại thời-điểm S122**, chứng runtime, §Recently-Done S122; 🔸 +3 trio S141 CHƯA nằm trong phép đo này) **+ chạy THẬT S124** (dogfood 2-vai đầu-tiên, owner-triggered @counter 3) **+ S137** (light-audit consent OVERDUE 8/6 → 2 FLAG view-stale-status + 1 FLAG gap-decision-sunk). 🔸 Residual THẬT giữ: đường `hmw.js→agentType` cho 2 vai H24 chưa exercise (Agent-tool path đã chứng; workflow-path chưa) [S137 view-audit lật ⚠️→✅ khớp source, giữ residual]. 🔸 Từ-vựng "view"/"omission" chọn có chủ-đích tránh va-chạm: `governance-detectors.ps1:15` đã sở-hữu `derived-staleness`, và "GAP" quá-tải (`session-end` build-gap · `memory-selfimprove-audit.ps1` CRITERIA+GAP).** **+S107 📄 `office-document` (12th sub — Office document WRITE specialist: docx·xlsx·pptx·pdf + form-engine; floor OD1–OD10; VALID_ROLES hmw.js 9→10; anh giao trực tiếp S107 "Sub chính" Office; ✅ **verified-runtime S107 CÙNG PHIÊN** — registry hot-reload agent MỚI giữa phiên [S27 lesson thu hẹp còn EDIT-agent/command] + spawn-test PASS OD1/OD4/OD5 template thật, model self-report `claude-fable-5` [data-point #5 flip-8]; finding: 2 template `wwwroot/templates` 0-placeholder mẫu-blank).** **worker-tier-pin (owner-decision S124 2026-07-15 — thay all-inherit H8 S66, trước nữa two-tier H4; sub TOÀN-ROSTER pin cứng KHÔNG theo lead; H23-precedence ĐO S126: spawn-param THẮNG hard-pin ⇒ `/fable-real` SỐNG). Lead = **DEFAULT Opus 5 MAX** (thư `9c909007` @S149 (re-stamp 07-25 G-024a; pre `59ce1d0f`); **anh chốt ô canonical hiển-thị DEFAULT-fleet @S151** — *"cần gọi Fable tao chọn đầu mỗi phiên hoặc gọi bằng command fable-real"* ⇒ Fable = anh `/model` đầu phiên HOẶC per-invocation `/fable-real`; runtime thật = BƯỚC 0.6 probe mỗi phiên, KHÔNG ghi sổ mỗi flip — hết class stale-2-flip ring1 bắt @S150). 🧊 Lineage owner-choice/flip-chain FROZEN tới flip-8 (flip-9 S119 Opus-4.8 owner-choice + các lượt /model sau = per-session không enumerate, anti-churn S106):** em main Fable 5 (1M) Max (✅ **Fable RESTORED S98 2026-07-02** — lead self-report `claude-fable-5` + settings `claude-fable-5[1m]`; fallback-Opus H5 S62→S97 kết thúc, H5.6 hoàn tất) ⚠️ **S101 2026-07-03: runtime lead = Opus 4.8** (lead + 2 monitor + WF2 reviewer inherit đều self-report `claude-opus-4-8`; settings vẫn pin `claude-fable-5[1m]` → **Fable unavailable phiên này → H5-fallback tự-kích, revert-free, KHÔNG sửa frontmatter**; "Fable RESTORED S98" = point-in-time KHÔNG phải steady-state — inherit-chain resolve theo availability runtime; ✅ **S102 2026-07-06: Fable VỀ LẠI runtime** — lead + 2 monitor inherit self-report `claude-fable-5` → H5-fallback S101 kết thúc, pattern availability per-session xác nhận [S98 Fable → S101 Opus → S102 Fable → **S103 Opus** → **S104 Opus** (2026-07-06 Fable outage tiếp — S104 lead + 2 monitor spawn self-report `claude-opus-4-8` ×3, H5-fallback revert-free) → ✅ **S105 Fable** (2026-07-07 Fable VỀ lần 3 — lead + 2 monitor self-report `claude-fable-5` ×3, runtime-verified) → ⚠️ **S106 Opus** (2026-07-07 Fable outage lại — lead runtime self-report `claude-opus-4-8`, H5-fallback revert-free; flip-7) → ✅ **S107 Fable** (2026-07-10 Fable VỀ lần 4 — lead + 2 monitor self-report `claude-fable-5` ×3, runtime-verified; flip-8)], BƯỚC 0.6 probe mỗi phiên; per-session KHÔNG steady-state. 🔴 **[§Sub-agents = CANONICAL single-owner flip-chain — S106 gộp per anh-confirm; derived `agents/README §Architecture` · `session-start BƯỚC 0.6` · `session-end §commit-format` trỏ về đây [🔄 vá @S153 FLAG-1: 3 cite số-dòng cũ `:3`/`:37`/`:113` đo lại SAI cả 3 (đúng là `:5`/`:48`/`:315`) — vá bằng BỎ số theo luật đã áp @S151, không ĐỔI số], KHÔNG tự enumerate mỗi flip → chống churn 4-file/flip]**) · **TOÀN roster `model: opus` + `effort: max`** (worker-tier-pin S124; **A2 đo S126:** lane no-tier resolve `claude-opus-4-8` DÙ lead=Fable ⇒ pin ăn runtime, hết inherit-lead; số vai = cột giữa của chính row này — KHÔNG chép lại vào narrative, đó là cách row-14 và narrative-12 lệch nhau từ S121 tới S122; lineage: 7 demoted flip S66 → all-inherit S66–S123 [office-document S107 inherit-born] → pin S124) · effort Max. 10 product/quality + monitor INFORM-only (H1 · H2 · 2×H24 S121 · 3×trio-memory S141 · 3×round-KIỂM `ring1-audit`/`ring2-audit`/`ring4-audit` S145) — **liệt-kê NHÓM, số vai = cột giữa của chính row này**. Nấc H8 = **runtime-verified S98 (2026-07-02)** — spawn-test inherit-chain ×2 monitor self-report `claude-fable-5` (cả đội tự lên Fable khi lead restore, 0 sửa frontmatter — đúng thiết kế all-inherit). Prev two-tier H4 runtime-verified S57bis (spawn-test 2 chiều). |