diff --git a/.claude/agent-memory/ring1-audit/MEMORY.md b/.claude/agent-memory/ring1-audit/MEMORY.md index 4675495..9ccc5df 100644 --- a/.claude/agent-memory/ring1-audit/MEMORY.md +++ b/.claude/agent-memory/ring1-audit/MEMORY.md @@ -1,5 +1,6 @@ # MEMORY — ring1-audit (KIỂM vòng-1: tooling/harvest) +- **S181 (2026-08-07) @close — `RING1: 26 ĐẠT / 5 TRƯỢT (+3 KC)` `[LEAD SEED ON-BEHALF]`:** 🔴 **R-1 là finding đắt nhất: bản vá của LEAD đẻ corruption.** Lead sweep `roster 23→28` bằng replace **toàn cục** ⇒ ăn vào **2 ảnh chụp ĐÓNG BĂNG** (`STATUS:15` kỳ S159→S160 · `:478` lineage S153). Bằng chứng nội-tại, không cần trí nhớ: ở `:15` mọi số láng giềng **cùng dòng** vẫn giá trị cũ (`562 test`), **chỉ `roster` nhảy** — ảnh chụp bị sơn đúng một pixel. Ở `:478`: *"VALID_ROLES 20→23"* + *"roster 28 > cap 20 ⇒ LOUD-skip 3 lane"* — `28−20=8≠3`, câu tự huỷ. ⇒ **LUẬT: literal nằm trong segment `✅ S…` / đoạn lineage = ẢNH CHỤP, CẤM sweep theo pattern.** Chỉ sweep dòng `🔥 CURRENT` + row canonical. 🔴 **thách-CLEAN THỦNG mặt ① của H1:** skill `ef-core-migration` heading tự mâu thuẫn — vừa trỏ `STATUS` canonical vừa ghi *"mới nhất = row cuối bảng"*, mà row cuối = Mig 71, đĩa = 72. **Bảng tụt sau là hợp lệ; cái sai là câu TỰ NHẬN LÀ NGUỒN.** 🔴 **2/5 falsify BROKE vào CHÍNH TAO:** `grep -c ||` đời-4 (suýt tố oan H1 thiếu tệp) · glob thiếu tầng `Persistence/` (suýt tuyên 2 engine cãi nhau). Luật tự rút: **2 engine cãi nhau thì đi tìm engine HỎNG, đừng chọn con SỐ.** 🔸 Từ chối gật bừa 3 claim (F-6 · plugin · corruption) ⇒ ghi `KHÔNG-CHẤM-ĐƯỢC`, không ĐẠT-ảo. 🧊 R-2 tao nêu (*"pause.md chưa soát cột-A"*) **SAI** — `/pause §2.5` đã có sẵn phần hợp *"cộng mọi sub spawn lẻ"* từ S172; lead vá theo rồi phải gỡ khối trùng. **Bài: vai đúng nhiều không làm nó đúng hết.** Tag `[s181, R-1-ban-va-de-corruption, cam-sweep-anh-chup, thach-CLEAN-thung-skill, 2-engine-cai-nhau-tim-engine-hong, R-2-sai]` - **S173 (2026-08-05) @open KIEM vong tooling/harvest — `RING1: 78Đ/4T` + 1 KHONG-CHAM-DUOC + 2 INFORM `[LEAD SEED ON-BEHALF — propose-only, single-writer = lead (B3)]; nguon `runs/2026-08-05-S173-bookend-open/sub-ring1-audit-open-S173.md` 38.365 B`:** H1 `PASS_WITH_FLAGS-10` → **8/10 DAT nguyen**; H2 `GATE-FAIL-6` → **4/6 DAT nguyen** (so hoc khep kin 0 dong lech), 1 TRUOT (F-04), 1 TRUOT LOW. 🔴 **PHAN XU MAU THUAN 2 con-do (lead giao dich danh) — H1 DUNG, H2 SAI:** monthly drift-audit **chua chay that** (**5 nguon doc lap**). H2 F-04 vo 2/3 ve: *"mat dau khoi MOI so ben"* → that ra **6 be-mat con giu**; *"ky sau tra ra SAI"* → **DUNG**. 🔴 **Nhung H1 CUNG TRUOT o SO:** "20 commit" **khong quy duoc ve nguon** (that: 89 total / 21 non-wal) vi `git log --since=` **PRUNE IM LANG 22 commit**, trong do **3 cai la `[CLAUDE]` that** (`7a903cf`·`88e7ecf`·`ce35f90`). Ket-luan H1 van song **chi vi tao quet lai tren tap day du**. 🔴 **TU-FALSIFY THUOC CUA CHINH MINH TRUOC KHI PHAN AI** (doi-5 lineage hong-thuoc): 2 engine dem commit **cai nhau** ⇒ dung, truy engine hong — thu pham lan nay la `--since`. **Luat: 2 engine cai nhau thi `comm` so TAP, dung cai SO.** 🔴 **F-3 under-count — be-mat LIVE thu 6 H1 sot:** `.claude/agent-memory/ring2-audit/MEMORY.md:25` day "5 class `view-*`" (enum = **6**), nam duoi `## 🎯 Role baseline` = **nap moi spawn**. **Dang can THAT ngay luc do:** `ring2-audit` chay chinh phien nay voi thuoc thieu vach, dung luc `lead-stale` ban FLAG tren enum 6. ⇒ F-3 = **3 file / 5 site**. Tai phat lan 2 cua A40@S172 (va 1 dong, sot o cung lop). 🔴 **Backstop residual-write THUNG:** H1+H2 SACH that (mtime so rieng truoc luot chay), nhung Stop-hook `wal: flush` **auto-commit xoa dau khoi `git status`** (`ac6e38f` nuot `.mfe-state.json`+`WAL.md`; `f1e1ff9` nuot `harness-eval/MEMORY.md`) ⇒ **soat bang `git show --stat` cac commit `wal:`, KHONG bang `git status`**. 🔴 **Stray dir = 5 (khong phai 4):** cai thu 5 (`ring1-audit`) sinh **11:09 = dung giay lead spawn tao**, RONG. Co-che **monotone 1 dir/1 spawn** ⇒ **so KHONG BAO GIO hoi tu**; H2 bao 1 @10:45 **khong sai**. ⇒ **ghi CO-CHE vao so, dung ghi CON SO**; don o `session-end` sau sub cuoi. 🔴 **Tu-to:** so `ring1-audit` cua chinh tao **mo coi khoi S169** (ENTRY=0) — NEU, khong tu va. Tag `[s173, 78d-4t, phan-xu-h1-dung-h2-sai, since-prune-im-lang, tu-falsify-thuoc-truoc, comm-so-TAP-dung-cai-SO, be-mat-live-thu-6, backstop-git-status-thung, stray-dir-monotone-ghi-co-che]` - **S172 (2026-08-05) @close — `KIEM-PASS-WITH-2-TRUOT — 69 claim (67 ĐẠT / 2 TRƯỢT) + 4 KHÔNG-CHẤM`; H1 39/40 · H2 28/29; falsify 7 (4 HELD / 3 BROKE) `[LEAD SEED ON-BEHALF @closeout M9 — vai INFORM-only, single-writer = lead (B3 VERIFY→APPEND)]; nguồn `runs/2026-08-05-S172-bookend-close/sub-ring1-audit-close-S172.md` 39.644 B + return`:** 🔴 **Nghề chốt lại: 2 thách-CLEAN đều CHỊU, nhưng chịu bằng LENS KHÁC chứ không bằng đọc verdict.** (A) H1 đối chiếu `SKILL.md ⟷ STATUS.md` = **hai file cùng lớp doc**; mình đổi nguồn sang **ĐĨA CODE** (`find src -path '*Migrations*'` = **71**, khớp row cuối) ⇒ số đứng ở **3 nguồn**, H1 chỉ có 2. (B) H2 chứng `S159 dương-giả` bằng **2 heading**; mình mở **4 vai H2 KHÔNG check** và đối chiếu **byte artifact mà entry tự trích** — **4/4 byte-exact**. 🔴 *Bịa được tên, không bịa được byte.* ⇒ **CẤM retro-harvest folder đó** (đẻ entry trùng trên 10 sổ). **2 TRƯỢT đều là under-count làm flag NẶNG hơn:** A40 H1 skill DRIFT ×1→**×2** (lỗi **PHẠM VI**: vá 1 dòng không quét cả file) · B19 H2 `≥10 vai` chữ đúng (13≥10) nhưng **bảng liệt 11, thật 13** ⇒ ai dùng bảng để hành động sót **53.084 B**. **4 finding riêng:** R-1 lead viết `Updated S172` mà `git log` chứng commit cuối là `ff7f655` @S168 ⇒ **khẳng định một lần cập nhật CHƯA TỪNG XẢY RA** (không phải "sẽ thối" — **sai ngay lúc land**) · R-2 ổ số cứng thứ 2 cùng file · R-3 bản vá R-2 **giữ literal số cũ ⇒ trồng citation-trap vĩnh viễn** · R-4 dùng bảng 13-vai. 🔴 **Tự khai: 3/3 nghi-vấn ĐẦU TIÊN đều là dương-giả của CHÍNH THƯỚC MÌNH** — parser mảng ra 50 phần tử rác (**đời 4** lineage mốc-kết-thúc-sai: S153 → S162 → S168 → nay) · `cut` đọc neo thành vắng mặt · tokenizer đếm 13 thay 23. Cả 3 bắt trước khi nộp; không tự-falsify thì **H1 bị tố oan 3 lần**. Tag `[s172, chiu-bang-lens-khac, bia-ten-khong-bia-byte, under-count-nang-hon, doi-4-moc-ket-thuc-sai]` diff --git a/.claude/agent-memory/ring2-audit/MEMORY.md b/.claude/agent-memory/ring2-audit/MEMORY.md index f02890f..a6176b5 100644 --- a/.claude/agent-memory/ring2-audit/MEMORY.md +++ b/.claude/agent-memory/ring2-audit/MEMORY.md @@ -1,5 +1,6 @@ # ring2-audit Agent — Persistent Memory +- **S181 (2026-08-07) @close — `RING2: 14 ĐẠT / 0 TRƯỢT (+1 KC)` `[LEAD SEED ON-BEHALF]`:** **15/15 FLAG của cặp H24 trúng vật thật, 0 gán oan** — tao mở 4 FLAG đi TÌM oan (F6 · G6 · G4 · F4), cả 4 đứng. 🔴 **F1 chấm byte-exact:** kéo bản đúng-thời-điểm `git show 35fce430:` — sổ quyết-định dòng 17 ghi thẳng `CHƯA phán` + `VẪN TREO`, trong khi `harness-11-engine:474` viết *"Chủ dự án phán @S181"*. Hai vật, một cái **tự trỏ về** cái kia. 🔴 **thách-CLEAN chiều NGƯỢC lại bắt được defect do CHÍNH BẢN VÁ đẻ ra:** `STATUS:15` — 1 số nhảy sang live, **5 số anh em cùng dòng ở lại quá khứ**, trên dòng tự dán nhãn `frozen-hợp-lệ` ⇒ `view-residual-asym` MỚI, do vòng chống-stale sinh ra. (Trùng R-1 của `ring1` — 2 vai độc lập cùng kết luận; lead đã hoàn.) 🔴 **F-3 BROKE vào chính gợi ý lead giao:** lead bảo đọc `class_repeat.counts` ở `memory-budget.json` — **SAI**, sổ tally thật ở `.claude/governance/.session-counter.json`; grep chữ ra dương-giả vì `jump_on_class_repeat` nằm trong `memory-budget`. Bẫy substring. 🔴 **F-5 BROKE vào nghi-vấn của chính tao:** tao nghi G4 là ép-vừa-enum (`OVERDUE:deep` là nghĩa-vụ nhịp, đâu phải quyết-định-treo). Đo lại: lúc vai gap đo, món này sống **duy nhất ở `WAL:31`** — file `§6.4` xoá trắng ⇒ vị-ngữ *"không surface lại ⇒ chìm luôn"* THOẢ. Nghi-vấn sập, class giữ. 🔸 **Khai nấc:** F5/F8 chấm trên bằng chứng **gián tiếp**, site nguyên văn chưa cô lập được ⇒ **14 ĐẠT là độ CHÍNH XÁC, không phải độ PHỦ** — tao không chứng được cặp H24 đã bắt hết. Tag `[s181, 15-tren-15-trung-that, byte-exact-git-show-dung-thoi-diem, ban-va-de-residual-asym, bay-substring-class-repeat, chinh-xac-khac-do-phu]` - **S173 (2026-08-05) @open KIEM vong soi-lead H24 — `RING2: 15Đ/3T` (+2 KHONG-CHAM-DUOC, 3 ERRATA) `[LEAD SEED ON-BEHALF — propose-only, single-writer = lead (B3)]; nguon `runs/2026-08-05-S173-bookend-open/sub-ring2-audit-open-S173.md` 37.678 B, 12 section`:** **15 DAT = TOAN BO 15 FLAG** (`lead-stale` 11/11 · `lead-gap` 4/4); **0/15 tu che class**; enum ≡ counts **12/12 hai chieu**. **3 TRUOT = 3 claim NGOAI tap FLAG**, deu cua `lead-gap`, cum stray-dir. 🔴 **Slot (70) PHAI MO LAI** — tai dung doc-lap bang python port dung regex `.ps1:892`: **7/7 so khop**, 2 so byte-exact/tung phan-tu. Goc that = **anchor `^\*\*`**, KHONG phai chi-so `[0]` ⇒ ban va phai neo **CA `**`/`##`/`###`**, neu khong truot lan 2. `lead-gap` **under-claim**: **3** khoi heading mu (`:27`·`:68`·`:102`). 🔴 **BROKE gia-thuyet cua LEAD ma HELD ket-luan cua lead:** bo loc that la **`*/.claude/*`** (bien the E ra dung 5/5 dau van tay), KHONG phai dot-blind — `lead-gap` **CO liet** `.vs/sd` + 2 `.vite-temp`. *"Chi sua LY DO, khong sua PHAN QUYET."* Va ly do that **nghiem trong hon**: tap-do bi cat dung **be-mat quan-tri vai do duoc lap ra de soi**. 🔴 **VERDICT CHUOI HELD 4/4** — suyt phan BROKE vi **diary cua chinh tao** ghi hinh dang TIME-DRIFT (nguoc dau); mo artifact goc tung ky moi thay S162 trung gan verbatim. ⇒ **LUAT MOI: claim chuoi ≥3 ky CAM cham bang diary.** 🔴 **Thach-CLEAN bat +1 FLAG SOT:** `STATUS:678-679` = `gap-decision-sunk` that; thuoc song sinh cach dung 1 dong (`:680` du 3 dau gac-chu-dich, `:678/:679` **0/3**). `lead-gap` **ap dung thuoc do o FLAG-2 roi BO o INFORM-8** — lech ve phia lam FLAG-count nho di. 🔴 **Coverage `lead-stale`: so trung thuc 4/4 NHUNG 1 nac ✅ SAI** — khai `STATUS` = CHAM, that **3,5% (30/853 dong)**, va dung vung bi ✅ che giau FLAG that `STATUS:672` nhan **L8** khi dang **L11**. 🔴 **SO CUA CHINH TAO bi 3 vai doc lap chi vao:** `:25` day "5 class view-*" (enum 6) duoi `## 🎯 Role baseline` = **nap moi spawn** ⇒ **tao bi nap thuoc thieu vach TRUOC khi lam viec**; tao tu do lai con so cua `harness-refine` (**11.106 B = 47,3%** tren heading `##` dau) — **khop tuyet doi**. 🔸 **`harness-audit` THU HEP co-che cua tao:** `:25` **KHONG** o vung planner mu, no o vung **`value_protect`** (planner THAY nhung CAM dung) ⇒ **2 lop song-dai KHAC NHAU, can 2 duong va**. **Addendum @dong so:** stray-dir **4→7**, mtime moi dir = **gio spawn cua mot vai** (cua tao 11:15:33, sinh TRUOC khi tao cham gi) ⇒ **harness tao san dir theo cwd luc spawn**, khong vai nao lam bay; cam neo so cung. **falsify:** 4 HELD / 3 BROKE — **2/3 BROKE nham vao phia quyen luc hon tao** (gia-thuyet cua LEAD · tu-bac cua con-do), 1 phep bac **chinh diary cua tao**. Tag `[s173, 15d-3t, slot70-mo-lai-anchor-khong-chi-so, broke-ly-do-held-phan-quyet, chuoi-3-ky-cam-cham-bang-diary, thach-clean-bat-flag-sot, so-cua-chinh-minh-day-sai, value-protect-khac-planner-mu]` - **S168 (2026-08-01) @close — `IN-PROGRESS (verdict appended per-FLAG below)` — cùng lớp artifact-dừng-giữa-chừng với `ctx-audit` cùng phiên `[LEAD HARVEST HOI-TO @S172 — no mo tu closeout truoc; owner slot (71) chot 'gom va sleep thi auto, tu quyet'. Nguon = artifact tren dia, KHONG suy dien]; nguồn `runs/2026-08-01-S168-bookend-close/sub-ring2-audit-close-S168.md` 9.740 B`:** PIN đích danh 2 file H24 (`sub-lead-stale-close-S168.md` 23.264 B mtime 19:38 + `sub-lead-gap-close-S168.md` 29.820 B mtime 19:55); **mtime file này > 19:55 ⇒ chứng C4b tuần-tự** (chạy SAU cặp H24, không song song) — nghề neo-thứ-tự-bằng-mtime này giữ dùng tiếp, @S172 dùng lại và `harness-audit` cũng dùng để chứng tuần-tự trio. Tag `[s168, in-progress-dung-giua, mtime-chung-tuan-tu-C4b]` diff --git a/.claude/agents/README.md b/.claude/agents/README.md index 1610c7d..52196a1 100644 --- a/.claude/agents/README.md +++ b/.claude/agents/README.md @@ -24,7 +24,7 @@ ## 🎯 Architecture -> ⓘ **Diagram dưới = 7 core lane (pre-S47 snapshot) — KHÔNG phải roster hiện-hành.** Roster THẬT = 7 core (diagram) + 🩷 frontend-designer (S47) + 🔵 database-agent (S52) + 📄 office-document (S107) + 🟫 tooling-auditor H1 + ⬜ harvest-curator H2 (2026-06-07 Harness 1) + 🔷 lead-stale-auditor + 🔶 lead-gap-auditor (**H24, S121 W2**) + 🧪 harness-eval + 🧪 harness-refine + 🧪 harness-audit (**trio-memory, S141**) + 🔬 ring1-audit + 🔬 ring2-audit + 🔬 ring4-audit (**round-KIỂM ×3, S145 — C4/C4b TÁCH mỗi-vòng-1-con: vòng tooling/harvest · soi-lead H24 · nén-ngủ**) + 🔎 ctx-curator + 🔎 ctx-verifier + 🔎 ctx-audit (**bộ-ba vòng Ctx lớp trí-nhớ MỀM `_mind`, S153 — adopt `0df10df4`, OWNER-VETO hub-form 3-vai: vai-1 nháp@mỗi-pause [carve-out §1] · vai-2 đối-chiếu+nạp@mỗi-tiep · vai-3 chuỗi@2-bookend**) + 🎨 front-end-reviewer-style + ⚙️ back-end-reviewer-style + 🗄️ database-reviewer-style (**ĐỘI STYLE ×3, S176 — anh chốt trực-tiếp, lý-do đo được "mày cứ làm đi làm lại hoài"; địa-phận RỜI theo glob diff, trục ĐỒNG-NHẤT ⟂ `reviewer` ĐÚNG-SAI**) — xem skill matrix + decision tree + tool grant dưới. Số vai canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents. (Cosmetic ASCII chưa vẽ lại — H1 tooling-auditor flag drift này @session-start.) +> ⓘ **Diagram dưới = 7 core lane (pre-S47 snapshot) — KHÔNG phải roster hiện-hành.** Roster THẬT (28 vai — đếm phần-tử, KHÔNG grep số) = 7 core (diagram) + `score-counter` · `score-count-auditor` + 🩷 frontend-designer (S47) + 🔵 database-agent (S52) + 📄 office-document (S107) + 🟫 tooling-auditor H1 + ⬜ harvest-curator H2 (2026-06-07 Harness 1) + 🔷 lead-stale-auditor + 🔶 lead-gap-auditor (**H24, S121 W2**) + 🧪 harness-eval + 🧪 harness-refine + 🧪 harness-audit (**trio-memory, S141**) + 🔬 ring1-audit + 🔬 ring2-audit + 🔬 ring4-audit (**round-KIỂM ×3, S145 — C4/C4b TÁCH mỗi-vòng-1-con: vòng tooling/harvest · soi-lead H24 · nén-ngủ**) + 🔎 ctx-curator + 🔎 ctx-verifier + 🔎 ctx-audit (**bộ-ba vòng Ctx lớp trí-nhớ MỀM `_mind`, S153 — adopt `0df10df4`, OWNER-VETO hub-form 3-vai: vai-1 nháp@mỗi-pause [carve-out §1] · vai-2 đối-chiếu+nạp@mỗi-tiep · vai-3 chuỗi@2-bookend**) + 🎨 front-end-reviewer-style + ⚙️ back-end-reviewer-style + 🗄️ database-reviewer-style (**ĐỘI STYLE ×3, S176 — anh chốt trực-tiếp, lý-do đo được "mày cứ làm đi làm lại hoài"; địa-phận RỜI theo glob diff, trục ĐỒNG-NHẤT ⟂ `reviewer` ĐÚNG-SAI**) — xem skill matrix + decision tree + tool grant dưới. Số vai canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents. (Cosmetic ASCII chưa vẽ lại — H1 tooling-auditor flag drift này @session-start.) > 🔴 **Bài S143 — enumeration TÊN cũng lão-hoá, và grep-theo-SỐ không bắt được:** sweep roster wave S141–S142 đặt acceptance là `grep "roster 14|14/14|14 folder|14 vai"` → 0 hit ⇒ tuyên bố sạch. Nhưng đúng 2 dòng tự xưng là bản gốc về roster — dòng NÀY ("Roster THẬT") và `:225` ("VALID_ROLES … ĐỦ roster") — **liệt kê TÊN, không chứa con số nào** ⇒ lọt lưới, giữ 14 vai qua cả wave. **Acceptance cho lần sau: ĐẾM PHẦN TỬ trong mọi enumeration rồi so canonical, đừng so hình-dạng chuỗi.** ``` @@ -64,7 +64,7 @@ - Test → **`test-specialist`** dedicated (KHÔNG để implementer kiêm) - Deploy claim → `cicd-monitor` sau push (skip docs-only gotcha #41) - Heavy diff / security / wire BE claim → `reviewer` pre-commit -- 🔴 **ĐỘI STYLE (S176, anh chốt) — MỖI LƯỢT REVIEW gọi THÊM 1 lần, song song `reviewer`** *(🔴 **hiệu-lực sau restart CLI** — SỬA-5c @S179: registry là ảnh-chụp lúc khởi phiên, KHÔNG hot-reload; trước khi restart thì lệnh này **chưa thi-hành được**, và `ls` + grep `VALID_ROLES` chỉ là điều-kiện CẦN. Kẽ này sinh ra vì `README` ra lệnh mà `STATUS` khai `verified-pending-restart` — 2 doc nói 2 giọng)*: `front-end-reviewer-style` · `back-end-reviewer-style` · `database-reviewer-style`. +- 🔴 **ĐỘI STYLE (S176, anh chốt) — MỖI LƯỢT REVIEW gọi THÊM 1 lần, song song `reviewer`** *(🔴 **hiệu-lực sau restart CLI** — SỬA-5c @S179: registry là ảnh-chụp lúc khởi phiên, KHÔNG hot-reload; trước khi restart thì lệnh này **chưa thi-hành được**, và `ls` + grep `VALID_ROLES` chỉ là điều-kiện CẦN. Kẽ này sinh ra vì `README` ra lệnh mà `STATUS` khai `verified-pending-restart` — 2 doc nói 2 giọng)*: `score-counter` · `score-count-auditor` · `front-end-reviewer-style` · `back-end-reviewer-style` · `database-reviewer-style`. - **Gọi con nào = theo DIFF chạm đâu.** 🔴 **Thước ĐÚNG (SỬA-1, vá @S179) — CẤM `git diff` trần, CẤM ba-chấm:** ```bash { git diff --name-only origin/main...HEAD # ĐÃ COMMIT — BA-chấm, neo merge-base diff --git a/.claude/agents/score-count-auditor.md b/.claude/agents/score-count-auditor.md index e9afe13..c30d9a7 100644 --- a/.claude/agents/score-count-auditor.md +++ b/.claude/agents/score-count-auditor.md @@ -3,6 +3,8 @@ name: score-count-auditor description: Read-only INFORM-only vai TẦNG-3 của luật chấm điểm đáp-ứng-yêu-cầu (GĐ-4 / C4-10, land W4b @S181; chủ dự án phán P4). Việc DUY NHẤT - kiểm PHÉP ĐẾM của tầng-1 (lead) và tầng-2 (`score-counter`) có đúng luật không. 🔴 RANH CỨNG BẤT KHẢ NHƯỢNG - CẤM đề xuất một điểm KHÁC. Mày chỉ được nói phép đếm ĐÚNG hay SAI và sai ở đâu; đề xuất điểm khác là tự biến mình thành tầng-2 thứ hai, và khi đó không còn ai kiểm phép đếm nữa. Soi 4 lỗi đếm điển hình - trừ theo LẦN thay vì theo MỤC · đổi nguồn đếm khỏi sổ đã ký · tính cả mục nhắc đúng 1 lần · in điểm khi sổ còn thưa (phải là KHÔNG ĐO ĐƯỢC). Chấm sai ⇒ ghi `error-ledger.md` kèm TẦNG NÀO SAI; 🔴 CẤM nhét nhãn *chấm sai* vào `lead_self_audit.flag_classes` (tập ĐÃ NIÊM PHONG P3=B `_sealed_P3B_S181`, máy từ chối exit 2). Luật canonical `harness-11-engine.md PHẦN P` - trỏ, KHÔNG chép. PIN đích-danh fail-closed - thiếu output tầng-1 hoặc tầng-2 ⇒ SKIP-CO-KHAI, CẤM tự đi tìm. KHÔNG Write/Edit, KHÔNG store_memory, propose-only, lead single-writer. KHÔNG tự đếm thay tầng-2 (`score-counter`) · KHÔNG soi lead (H24) · KHÔNG chấm diff-code (reviewer). tools: Read, Grep, Glob, Bash model: opus +effort: max +memory: project --- Mày là **tầng 3**. Mày kiểm **PHÉP ĐẾM**, không kiểm **KẾT QUẢ**. diff --git a/.claude/agents/score-counter.md b/.claude/agents/score-counter.md index 71b7afc..7b2bcdc 100644 --- a/.claude/agents/score-counter.md +++ b/.claude/agents/score-counter.md @@ -3,6 +3,8 @@ name: score-counter description: Read-only INFORM-only vai TẦNG-2 của luật chấm điểm đáp-ứng-yêu-cầu (GĐ-4 / C4-10, land W4b @S181; chủ dự án phán P4). Việc DUY NHẤT - đọc `docs/governance/so-yeu-cau-chu-du-an.md` rồi TỰ ĐẾM LẠI số MỤC bị nhắc ≥2 lần, không nhìn kết quả của ai. 🔴 RANH CỨNG BẤT KHẢ NHƯỢNG - CẤM xem điểm tầng-1 trước khi đếm xong; pin nào kèm sẵn điểm tầng-1 thì TỪ CHỐI đọc và khai rõ, vì đọc rồi thì phép đếm độc lập đã hỏng và không phục hồi được. Đơn vị trừ là MỤC không phải LẦN (1 mục nhắc 5 lần trừ đúng 1). CẤM tự phán điểm cuối (tầng-4 = chủ dự án). Luật canonical `harness-11-engine.md PHẦN P` - trỏ, KHÔNG chép. Nguồn đếm ĐÃ KÝ = sổ nói trên, CẤM đổi nguồn. Sổ thưa ⇒ trả `KHÔNG ĐO ĐƯỢC`, CẤM nặn ra số. KHÔNG Write/Edit, KHÔNG store_memory, propose-only, lead single-writer. KHÔNG kiểm phép đếm của người khác (đó là `score-count-auditor` tầng-3) · KHÔNG soi lead (H24) · KHÔNG chấm diff-code (reviewer). tools: Read, Grep, Glob, Bash model: opus +effort: max +memory: project --- Mày là **tầng 2** của luật chấm điểm. Toàn bộ giá trị của mày nằm ở chỗ mày đếm **ĐỘC LẬP**. diff --git a/.claude/auto-memory/MEMORY.md b/.claude/auto-memory/MEMORY.md index caedeb2..f881c7b 100644 --- a/.claude/auto-memory/MEMORY.md +++ b/.claude/auto-memory/MEMORY.md @@ -47,6 +47,7 @@ - [Máy rộng, UI hẹp](feedback_may_rong_ui_hep.md) — nguyên tắc owner S164 ×2 quyết định: schema/BE theo ca TỔNG QUÁT (N/gộp), UI default ca HẸP (1-1), user cần thì bung — 0 đổi máy; rào cứng 409 → rào hiển thị - [Pause phải nhớ kỹ plan-progress](feedback_pause_track_plan_progress.md) — owner S165: /pause giữa chuỗi wave = WAL/run.md 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 thật: gap checkbox OG-3 → gate F-1 MAJOR) +- [Guard dựng mà không ai gọi](feedback_guard_built_but_never_called.md) — máy đúng + fault-inject có răng nhưng 0 cửa gọi = chết câm; thang 2 nấc xếp vào "CÓ"; và nghi THƯỚC của mình trước khi trách máy - [Dry-run bắt lời-hứa-chưa-land](feedback_dryrun_finds_promised_but_unlanded.md) — S168: command CHỈ SỐNG TRONG COMMENT sống sót 8 wave + 8 gate + 8 cicd + 644 test; guard-chặn-không-đường-ghi = chết câm; comment nêu tên ⇒ grep tên ngay ## Project — ongoing decisions / context diff --git a/.claude/auto-memory/feedback_absence_looks_like_clean.md b/.claude/auto-memory/feedback_absence_looks_like_clean.md index 4ef549a..57064d4 100644 --- a/.claude/auto-memory/feedback_absence_looks_like_clean.md +++ b/.claude/auto-memory/feedback_absence_looks_like_clean.md @@ -28,3 +28,11 @@ metadata: **How to apply:** trong repo có hook auto-commit, **CẤM `HEAD~n`** cho mọi phép so trước/sau — dùng **SHA đích danh** (`git log --oneline` lấy đúng commit sản-phẩm, bỏ qua `wal:`). Cùng gốc với luật đã có ở [[project_h22_wal_session_continuity]] (hook 4-path) và điểm-mù Sàn-3: hook làm *"cây sạch"* và *"HEAD~1"* đều mất nghĩa. Bonus S177: bundle prod CŨ cũng không dùng làm đối-chứng được (deploy dọn `dist` ⇒ URL cũ trả ~900B SPA-fallback, grep ra 0 mọi chuỗi = lại một *rỗng đọc thành sạch*) — xem [[feedback_prod_db_verify_integrated_auth]]. 🔸 **Neo chung cả 4:** thứ *có mặt sai* thì grep ra; thứ *vắng mặt* thì **không**. Nên với xoá/đè/rỗng/so-nhầm-mốc, **bằng-chứng phải đến từ NGUỒN KHÁC** (git history theo SHA · lệnh khác · người khác), không từ chính bề-mặt đang soi. + +🔴 **@S181 — hai ca CÙNG LỚP, cùng phiên, cả hai suýt chỉ sống ở WAL (tệp bị `§6.4` xoá trắng cuối closeout):** + +**(a) Phép trích RỖNG trên một sổ ĐẦY.** Acceptance W4 ô-1 là `grep -c '^ST-' ` ≥ 2. Sổ có **đúng 2** mục `ST-`, nhưng ở dạng **BẢNG** (`| \`ST-001\` |`) ⇒ regex neo `^ST-` trả **0**. Thước đọc rỗng trên vật đầy. 🔴 **Cám dỗ là bẻ BẢNG cho vừa regex** — làm thế là *rời tập-đo*, và bảng mất luôn cột. Đúng: giữ vật, **khai thước không khớp layout**, đếm bằng phép đúng dạng (=2). + +**(b) Một regex sửa-1-bảng ăn sang bảng thứ hai.** Script cập nhật bảng nấc §1 dùng `| N |`; tệp có **hai** bảng đánh số ⇒ 5 dòng của §6 (*"SE làm KHÁC/mạnh hơn"*) **bị ghi đè** bằng nội dung GĐ. Báo cáo của chính lead **không thể** thấy; chỉ **cổng đồng-bộ 4 tầng** (phép đo độc lập, đếm dòng từng bảng) thấy. ⇒ **Sửa hàng loạt trong tệp nhiều bảng: neo theo PHẠM VI SECTION, không neo theo hình dạng dòng** — và sau khi sửa, đếm lại **từng bảng** chứ không đếm tổng. + +**How to apply (bổ sung):** thước trả **0** trên vật mình biết là đầy ⇒ nghi **thước**, đừng nghi vật, và **tuyệt đối đừng đổi vật cho vừa thước**. Sửa hàng loạt ⇒ đếm lại từng đơn vị con, vì tổng đúng vẫn che được hai lỗi bù nhau. \ No newline at end of file diff --git a/.claude/auto-memory/feedback_guard_built_but_never_called.md b/.claude/auto-memory/feedback_guard_built_but_never_called.md new file mode 100644 index 0000000..2a2004d --- /dev/null +++ b/.claude/auto-memory/feedback_guard_built_but_never_called.md @@ -0,0 +1,17 @@ +--- +name: feedback-guard-built-but-never-called +description: "Máy/guard dựng xong, chạy đúng, fault-inject có răng — mà KHÔNG cửa nào gọi ⇒ chết câm; thang 2 nấc xếp nó vào \"CÓ\" và ta yên tâm nhầm" +metadata: + node_type: memory + type: feedback + originSessionId: 1ba002a9-95df-4fc1-ab97-e36eeb531eeb + modified: 2026-08-07T16:02:37.345Z +--- + +Một guard có thể **đúng hoàn toàn** mà vẫn vô dụng: nếu **không cửa nghi-thức nào gọi nó**, nó chỉ chạy khi có người gõ tay ⇒ hết phiên là hết chạy. Đo thật @S181: `naming-scan.ps1` + `artifact-integrity.ps1` (dựng ở W1/W2, chạy tốt, fault-inject 2 chiều có răng) có **0 cửa gọi** — phát hiện **chỉ vì** bảng máy⟂tay bắt phải có **BA nấc**. + +**Why:** thang 2 nấc (*"có máy / không có máy"*) xếp máy mồ côi vào **CÓ**, và ta đọc thành "đã tự động hoá". Nấc thứ ba (*fire tự động?*) mới tách được **tồn tại** khỏi **được gọi**. Cùng họ với `feedback_dryrun_finds_promised_but_unlanded` (lệnh chỉ sống trong comment) và `feedback_absence_looks_like_clean` — đều là **vắng mặt trông giống ổn**. + +**Đối ngẫu bắt được cùng phiên — thước của mình sai trước khi trách máy:** mutation-test lần đầu ra *"chỉ 1 bài đỏ ⇒ máy soi một chiều"*, và tôi đã viết cả đoạn giải thích nghe rất hợp lý. Nhưng máy **có** chiều ngược; **regex đo của tôi** thiếu pattern. Khi phép đo tố cáo công cụ, **nghi phép đo trước** — công cụ đã qua fault-inject, thước thì vừa gõ ra. + +**How to apply:** dựng guard xong ⇒ **grep xem cửa nào gọi nó** (`grep -rl "" .claude/commands/ .claude/hooks/`), 0 hit = chưa xong việc, phải wire. Khi kiểm độ phủ tự-động hoá, **đếm cửa gọi**, đừng đếm sự tồn tại của máy. Và trước khi kết luận "máy thiếu X", chạy control dương cho **chính thước đo** của mình. Liên [[feedback_dryrun_finds_promised_but_unlanded]] · [[feedback_absence_looks_like_clean]] · [[feedback_faultinjection_proves_teeth]]. diff --git a/.claude/auto-memory/feedback_meta_count_selfcoverage_blindspot.md b/.claude/auto-memory/feedback_meta_count_selfcoverage_blindspot.md index c1c5da9..b6c241a 100644 --- a/.claude/auto-memory/feedback_meta_count_selfcoverage_blindspot.md +++ b/.claude/auto-memory/feedback_meta_count_selfcoverage_blindspot.md @@ -20,3 +20,9 @@ metadata: - Trục **honesty PHẢI có lane độc-lập** — S119 lane R4 chết ⇒ 2 lỗi honesty cấp-C lọt tới cổng-cuối mới bị bắt. Liên quan: [[feedback-resume-premise-reverify]] (3 bề-mặt lỗi NGOÀI body: metadata-count · số-tự-tính · N/A-fact-claim) · [[feedback-review-presentation-and-stale-config]] · [[feedback-agent-return-garble-recover]] + +🔴 **@S181 — datum MẠNH NHẤT tới nay, vì lần này có VAI ĐỘC LẬP đối chứng:** lead (tầng-1) đếm **3 mục** lặp≥2; vai `score-counter` (tầng-2, CẤM xem điểm tầng-1) đếm **1**. Lập luận của tầng-2 không cãi được: luật lấy ví dụ *"mục nhắc 5 lần trừ đúng 1, KHÔNG phải 4"* — mã hoá ca đó thành 5 dòng thì **đếm-theo-DÒNG ra 4**, đúng bằng con số luật gọi là SAI; số 3 của lead là `4−1`, **cùng dấu vân tay**. ⇒ Lead sập đúng cái bẫy mình vừa viết luật để chặn, **trong chính phiên viết nó**, và ở **con số ĐẦU TIÊN** hệ đó sinh ra. + +🔬 **Vì sao ca này đắt hơn mọi datum trước:** các datum cũ chỉ chứng *lead đếm sai về mình*. Ca này chứng thêm **cách chữa có tác dụng thật** — không phải "lead cẩn thận hơn", mà là **một vai khác đếm ĐỘC LẬP và bị CẤM nhìn số của lead**. Nếu tầng-2 được xem số tầng-1 trước, nó gần như chắc chắn đã hội tụ về 3. **Tính độc lập là cơ chế, không phải thái độ.** + +**How to apply (bổ sung):** con số nào lead **tự sinh về công việc của chính mình** (đếm mục, đếm phủ, đếm đã-xong) ⇒ nếu có vai đối chứng thì **đừng đưa số của mình vào prompt của nó**; nếu không có vai thì tự hỏi *"đơn vị đếm của tôi có trùng đơn vị luật nói không?"* — sai đơn vị là cách sai phổ biến hơn sai số học. diff --git a/.claude/commands/session-end.md b/.claude/commands/session-end.md index ac5b6d1..61e8c05 100644 --- a/.claude/commands/session-end.md +++ b/.claude/commands/session-end.md @@ -125,7 +125,7 @@ Em main PHẢI echo **TOÀN BỘ nội dung command body này** (đầy đủ Ph 1. **M5 sentinel:** sau commit closeout → `powershell.exe -ExecutionPolicy Bypass -File scripts/closeout-sentinel.ps1 -Commit -AuditRan` — FLAG "audit đo rồi như chưa đo" nếu closeout thiếu delta role-dir/counter (positive-control 5/5 lịch sử @S149). 2. **M7 eval-USE-side (đóng DEFER C14-2.4):** `powershell.exe -ExecutionPolicy Bypass -File scripts/applied-eval-nokey.ps1 -Selftest` → selftest 3/3 rồi đọc output nhãn `{APPLIED · DORMANT(≠MISS) · chờ-judge}`; **caveat "% = FLOOR không ceiling" nằm TRONG payload** — chép nguyên, cấm rút gọn. Ghost-wire 18-ngày (0 call-site) chết tại dòng này. 3. **M9 diary-seed on-behalf (GAP-3 ×4):** vai INFORM-only nào CHẠY trong phiên (có sub-MD/return VERIFY được) ⇒ lead **APPEND diary vai đó TRONG CÙNG closeout** (B3; tiền lệ retro-harvest S132 + seed ring2-audit S149). Detector C11(b) soi sót. - 3-bis. **C2 checklist artifact-vs-entry (wire @S164 — quyết-định lead @S163 PAUSE-1; nguồn = H2 P5 + chuỗi seed-rớt ~1 vai/lượt S153·S158·S162):** M9 tồn tại từ S149 mà vẫn rớt 3 lần vì chạy bằng TRÍ-NHỚ — thay bằng PHÉP ĐẾM 2 cột TRƯỚC commit chốt: **cột-A** = tập VAI có artifact phiên này (`ls runs//sub-*.md` → rút tên vai) · **cột-B** = tập vai có entry mới trong `agent-memory//MEMORY.md` (grep nhãn `## S` phiên này). 🔴 **A∖B ≠ ∅ ⇒ seed on-behalf NGAY (quay lại M9), CẤM commit closeout khi hiệu còn phần-tử.** H2 3-phân-loại-lại: 11/23 vai bị luật CẤM tự-ghi ⇒ lead-seed là ĐÚNG thiết kế, bệnh ở bước seed thiếu phép đếm ép — KHÔNG sửa bằng "bắt vai tự ghi". 🔸 *Vế "luật END-line" của H2-P5 CỐ Ý KHÔNG wire ở đây — đó là slot **(44)** chờ anh (chưa từng được hỏi, xem HANDOFF).* + 3-bis. **C2 checklist artifact-vs-entry (wire @S164 — quyết-định lead @S163 PAUSE-1; nguồn = H2 P5 + chuỗi seed-rớt ~1 vai/lượt S153·S158·S162):** M9 tồn tại từ S149 mà vẫn rớt 3 lần vì chạy bằng TRÍ-NHỚ — thay bằng PHÉP ĐẾM 2 cột TRƯỚC commit chốt: **cột-A** = **HỢP của 2 nguồn** (vá @S181 — H2 F-03): {`ls runs//sub-*.md` → rút tên vai} **∪** {vai có return/verdict ghi trong `WAL` chain phiên này}. 🔴 **Nguồn-2 BẮT BUỘC:** phiên KHÔNG mở run-folder mới thì nguồn-1 = **∅** ⇒ `A∖B = ∅` ⇒ checklist **báo PASS trong khi mọi vai đều thủng**. Đo thật @S181: 4/4 vai chạy, 0/4 có entry, mà công thức cũ vẫn cho PASS — **ĐẠT-ảo do CẤU TRÚC, máy hỏi sai câu** · **cột-B** = tập vai có entry mới trong `agent-memory//MEMORY.md` (grep nhãn `## S` phiên này). 🔴 **A∖B ≠ ∅ ⇒ seed on-behalf NGAY (quay lại M9), CẤM commit closeout khi hiệu còn phần-tử.** H2 3-phân-loại-lại: 11/23 vai bị luật CẤM tự-ghi ⇒ lead-seed là ĐÚNG thiết kế, bệnh ở bước seed thiếu phép đếm ép — KHÔNG sửa bằng "bắt vai tự ghi". 🔸 *Vế "luật END-line" của H2-P5 CỐ Ý KHÔNG wire ở đây — đó là slot **(44)** chờ anh (chưa từng được hỏi, xem HANDOFF).* - **(ii-bis) 🔬 ring2-audit AUTO sau cặp H24 (vai-KIỂM vòng soi-lead, C4/C4b vai #2/3, land S145):** cặp H24 (`lead-stale-auditor` + `lead-gap-auditor`) CHẠY xong ⇒ spawn `ring2-audit` NGAY — **AUTO, KHÔNG consent** (owner S145; 🧊 *vế tương-phản cũ "KHÁC (ii) consent-gate của chính H24" ĐÃ SỤP @S146 — (ii) nay cũng AUTO, xem `:106`*). Đọc FLAG-list + class 2 vai → verdict per-FLAG + tự tái-dựng ≥1 số (flag-count / `class_repeat`) + **thách-CLEAN** (H24 báo ít/0 FLAG ⇒ tự soi 1 surface tìm FLAG sót). 🔴 no-self-exempt ≠ lead-stale/lead-gap (m-3). 🔴 Fail-safe: H24 KHÔNG chạy phiên này (**chỉ còn: chưa tới nhịp** — nhánh "không consent" chết @S146) ⇒ ring2-audit **NO-OP im-lặng**. Tuần-tự C4b (SAU cặp H24, mtime chứng). Propose-only → em main VERIFY→APPEND (git-diff backstop). Contract canonical `.claude/agents/ring2-audit.md` (B1). - **(iii) Flag → class:** mỗi FLAG của 2 vai **PHẢI** thuộc **enum ĐÓNG** `lead_self_audit.flag_classes`. Vai **KHÔNG tự chế class** — finding không phân-loại được ⇒ báo **verbatim** + **escalate anh** để mở rộng enum. Cập-nhật `class_repeat.counts`; class nào lặp **≥ `jump_on_class_repeat`** ⇒ **kéo audit tới sớm**. - **(iv) 🔴 Nghi-thức RE-STAMP carry (GAP THẬT, vá @S122):** khi ghi segment `HANDOFF` mới, **ĐÓNG DẤU LẠI `[carry:]` cho MỌI carry còn mở** — không chỉ lần đầu. diff --git a/.claude/governance/ACTIVE-MARKS.md b/.claude/governance/ACTIVE-MARKS.md index 9fa8376..dc233e1 100644 --- a/.claude/governance/ACTIVE-MARKS.md +++ b/.claude/governance/ACTIVE-MARKS.md @@ -24,6 +24,7 @@ | `RC-pqhuy1987-15-07-2026-17-23-10` | `.claude/commands/tiep.md §0` + `.claude/workflows/README.md` + `session-end §L.b(f)` + `scripts/governance-detectors.ps1` (`Test-Quoted` · H24-1 · **H24-3 mới**) + `session-start §0.7` (≙ AI_INFRA **H-24 / H-22 wal-defect-fix** — nâng-cấp NGƯỢC, SE-originated) | **DUAL-ACCEPT + luật-retire-legacy + guard bẫy-tự-quy-chiếu + detector H24-3.** **Sàn:** (1) **orphan = DUAL-ACCEPT** (dạng-1 phẳng · dạng-2 C8) — **dạng-3 RETIRED** · (2) 🔴 **LUẬT RETIRE LEGACY (mới, tổng-quát):** *gỡ nhánh legacy khi **tập di-sản RỖNG**; giữ khi **CÒN người thụ-hưởng**. Miễn-trừ C8 hết hiệu-lực đúng lúc hết di-sản để tha, không sớm hơn* · (3) **bẫy tự-quy-chiếu = CLASS, không phải ca lẻ** — doc định-nghĩa anti-pattern **tất-yếu** chứa mẫu anti-pattern ⇒ mọi matcher khớp-mẫu bắt chính nó; discriminator = **enclosure (use ⟂ mention)**, KHÔNG phải hình-dạng (H24-2 dùng charset `<` được vì key thật không bao giờ có; H24-1/H24-3 **không thể** vì ví-dụ **byte-identical** với claim) ⇒ helper **DUY-NHẤT** `Test-Quoted`, mọi matcher prose PHẢI gọi · (4) **H24-3 session-label lag** (MED): trong CÙNG file, `(S` ở `**Last updated**` không được lùi sau MAX `(S` ở heading — vá **âm-giả CHỨNG-MINH-ĐƯỢC** của H24-1 (nó so NGÀY, mà ngày `2026-07-15` = mới nhất ⇒ 0 flag trong khi nhãn lùi **3 phiên**) · (5) 🔴 **CẤM "resolve" flag title-stale bằng đổi HÌNH-DẠNG anchor** — đó là **rời tập-đo**, không phải sửa | **pain:** ① **dạng-3 = cửa mở cạnh biển cấm** — doc CẤM viết mới mà máy VẪN NHẬN ⇒ cấm-bằng-**trí-nhớ**; đo: tập di-sản = **0** (6/6 folder từng dựa nay đều có flat sau `22ea8c5`) · ② **bẫy tự-quy-chiếu LÂY QUA TRÍCH-DẪN, 3 đời THẬT trong 1 wave**: `permission-matrix:16` (defect thật) → `lead-view-auditor:45` (trích làm ví-dụ) → `adap-report…h24…:78` (trích **khi đang GIẢI-THÍCH chính FP đó**) · ③ **âm-giả `STATUS:6` tái-phát LẦN 4** (S116/S117/S118/S123) — 3 lần trước vá bằng **bump số** ⇒ quay lại · ④ 🔴 **Goodhart đo được (ngoài diff):** W4/S122 "vá" `permission-matrix:16` bằng **đổi FORMAT anchor** ⇒ khớp **0 pattern** ⇒ **H24-1 mất chính positive-control nó được dựng quanh**, mà flag-count **GIẢM** ⇒ trông y hệt thành công ⇒ *"5 FLAG→0"* của W4 có phần đạt nhờ **một file thoát khỏi thước** | **volume:** MỌI phiên (`§0.7` + close-gate) × **26 run-folder** × mọi matcher prose trong `governance-detectors.ps1` (3 detector cùng lớp, **chỉ 1 có guard** trước S123) | **quality:** **fault-inject 4 bộ, 24/24** — backtick-guard **5/5** (2 anti-Goodhart: quoted-rồi-bare **cùng dòng**→FLAG anchor thật · backtick **CHẴN**→FLAG) · H24-3 **6/6** (anti-Goodhart: **MAX không đứng đầu/cuối**→lấy đúng MAX; 2 bản cài sai "lấy đầu"/"lấy cuối" đều PASS trên repo thật vì ở đó MAX tình cờ đứng đầu) · DUAL-ACCEPT **7/7** (ca chốt `## Synthesis`-no-flat: **S122 IM → S123 FLAG** = hiệu-lực retire) · **2 trục reviewer chỉ ra CHƯA HỀ THỬ, thử lại 6/6** (quoted-label→IM · 2-số-cùng-dòng→MAX cả 2 chiều · heading trích `` `(S999)` ``→bỏ qua) · **`comm` before/after: 46→45 = −2 dương-giả +1 dương-THẬT**, 0 flag ngoài dự-kiến · repo thật **0 orphan/26** sau retire · **reviewer bác 3 lập-luận của lead và bác ĐÚNG** (xem caveat) | `RC-pqhuy1987-15-07-2026-15-32-20` (**partial** — điều-khoản (2) TRI-ACCEPT→DUAL-ACCEPT; **4 điều-khoản còn lại GIỮ NGUYÊN SỐNG**: Sàn-3 canonical @`tiep.md §0` · nhận≠cho-phép · push-guard 1-LƯỢT · EOL-inform) | 🔖 **Active-High** (anh-confirm **S123** · **P4 report-before-stamp**: reviewer `PASS_WITH_FIXES` → lead vá 6 finding → present → anh chốt *"đồng ý"* → stamp) · 🔴 **CAVEAT — 3 lập-luận của lead ĐÃ BỊ BÁC, ghi để không tái-sinh:** (a) *"retire HOÀN-THÀNH mark cũ"* = **NGUỴ-BIỆN** (điều-khoản (2) **cố ý tách** lưới-rộng ⟂ luật-hẹp; retire **thu lưới bằng luật** = biến nhận **=** cho-phép = **NGƯỢC** điều-khoản) — retire vẫn đúng, **nhưng vì hết di-sản**, không phải vì "hoàn-thành" · (b) *"H24-3 MED vì 0 proxy"* = **SAI** (`$labelN` = hit-regex-ĐẦU = **proxy** cho "label của CHÍNH file", vỡ đúng lúc file trích; MED đứng nhờ `Test-Quoted` **loại** failure-mode đó, KHÔNG phải nhờ proxy chưa từng có) · (c) *"5/5 separation"* = **4/4** (lead **chép số của sub** không kiểm ca-5 trên đĩa) | | `RC-pqhuy1987-07-08-2026-20-57-48` | **`ACTIVE-MARKS.md §LT3`** (nhà NGUỒN, cuối tệp này) + `ritual-labels.md §6` khoản (vi) + `ST-002` của sổ W4 — **2 nơi sau TRỎ, cấm chép** | **Luật tự-trị 3 bậc** (P5 gói adap 7-GĐ): **rõ → tự vá** · **mơ hồ → chọn nhánh an toàn + khai** · **mơ hồ + phá huỷ → DỪNG, hỏi anh**. Ranh bậc-2 ⟂ bậc-3 = **tính PHÁ HUỶ** (đảo ngược được hay không), **KHÔNG** phải độ khó | **pain:** `ST-002` của W4 định TRỎ về `ACTIVE-MARKS` cho luật 3 bậc, nhưng lane C đo **0 hit** — trỏ vào chỗ rỗng; và AI không có ranh thành văn giữa *tự vá* ⟂ *phải hỏi* ⇒ hoặc hỏi thừa, hoặc tự quyết thứ phá huỷ · **volume:** mọi lượt AI ra quyết-định trong kho × các wave còn lại của gói 7-GĐ + `ST-002` sổ W4 · **quality:** tiêu-chí khách-quan soi được (đảo-ngược-được?) thay cho cảm-tính "việc này khó hay dễ" | null (additive) | 🔖 **Active-High** (anh-confirm **S181** *"P5 → nguyên văn"* · P4 report-before-stamp: lead trình đủ 6 câu kèm nguồn → anh chốt từng số → stamp) | +| `RC-pqhuy1987-07-08-2026-21-42-10` | `docs/governance/adap-reports/upgrade-pack-phased-bang-goc.md` (bảng gốc 12 TC) + `…-bao-cao-cuoi.md` | **Niêm phong W6 gói adap 7-GĐ** — anh nguyên văn: ***"đồng ý stamp - ký tên"***. 🔴 **PHẠM VI KÝ = phần ĐÃ THI CÔNG tính đến S181.** 🔴 **NGOÀI phạm vi, khai rõ: (1) `W3b` cắm mã thoát (chờ soak) · (2) `W5b` vế (ii) — cả hai KHÔNG được đọc là đã niêm phong.** 🔴 Dấu này **KHÔNG** phong nấc *đã được kiểm chứng* (chỉ hub cấp) | **pain:** bảng gốc 12 TC + báo cáo cuối là vật gửi ra ngoài; không có dấu thì không phân biệt được *bản nháp* với *bản chủ dự án đã đọc và chấp thuận* · **volume:** 12 TC × 20 khoản danh mục kiểm × 10 wave, gửi hub · **quality:** 4 ô GIỮ CHỮ hub không bị điền số · 0 tự phong nấc trong bảng · mutation-test E-9 ĐẠT (0 → 2 đỏ mới → 0) · cổng đồng-bộ 4/4 tầng khớp, 1 lệch ĐÃ KHAI | null (additive) | 🔖 **Active-High** (anh-confirm **S181** · P4 report-before-stamp: lead trình cổng đồng-bộ + bảng gốc → anh chốt *"đồng ý stamp - ký tên"* → stamp) | > 🔄 **CHÚ-THÍCH S149 (2026-07-24) cho mark `RC-pqhuy1987-15-07-2026-15-32-23` — BẢN KÝ GIỮ NGUYÊN, KHÔNG SỬA MỘT CHỮ (P4/P8).** > §-target của mark ghi `.claude/agents/lead-{view,omission}-auditor.md`. **@S149 anh ratify rename 5 vai đồng-bộ sister** ("OK đồng ý"): `lead-view-auditor`→`lead-stale-auditor` · `lead-omission-auditor`→`lead-gap-auditor` · `h24-audit`→`ring2-audit` · `tooling-harvest-audit`→`ring1-audit` · `sleep-audit`→`ring4-audit`. **Cùng vai, cùng contract, chỉ đổi TÊN** — mọi điều-khoản mark áp nguyên sang tên mới (đúng khuôn chú-thích S122 "∈ roster hiện-hành": mark trỏ VAI, không trỏ chuỗi tên). Enum class `view-*`/`gap-*` GIỮ NGUYÊN lượt này (không map 1:1 với hub 12-class; tally đang arm JUMP dải 3-4 — đổi key giữa chuỗi = gãy tally; số phận theo spec hội-tụ bookend). diff --git a/.claude/sessions/session-12/_end b/.claude/sessions/session-12/_end new file mode 100644 index 0000000..c75ee33 --- /dev/null +++ b/.claude/sessions/session-12/_end @@ -0,0 +1,7 @@ +summary-frozen-s12: goi adap 7-GD dong tron 10/10 wave; W6 niem phong co RC; con 1 cong W3b cho soak + bao cao cho anh duyet +pointer: docs/changelog/sessions/2026-08-07-2210-S181-adap-7gd-khep-tron.md +carry: w3b-cam-ma-thoat · bao-cao-cuoi-cho-duyet · h24-deep-overdue +pending-anh: (1) duyet bao-cao-cuoi -> gui hub · (2) ghep dieu-kien-3 vao bac-2 · (3) P3 forward-only hay hoi-to · (4) VK-5 +pointers: .claude/workflows/runs/2026-08-07-S180-adap-upgrade-pack-phased/ · .../2026-08-07-S180-bookend-open/ +h24-tick: counter=55 +markers: _pause=1 · _tiep=1 · _snapshot=0 · mind-blocks=1 diff --git a/.claude/sessions/session-12/_mind-s-12.md b/.claude/sessions/session-12/_mind-s-12.md index e740283..f9f1ccb 100644 --- a/.claude/sessions/session-12/_mind-s-12.md +++ b/.claude/sessions/session-12/_mind-s-12.md @@ -66,6 +66,37 @@ Máy chỉ quét phần **DƯỚI** marker đóng khối luật (dòng comment c (`_MIND_TOP_MARKER` trong scripts/session_ctx.py) -- khac khuon `FLOW-START` cua _context (khong may nao doc). --> +## MIND-1 — 2026-08-07T23:40:00+07:00 @ 5ae60e41 (window 2) + +### A. Gói-turn +Window-2 vào bằng `/tiep`. Anh chốt 8 câu P1-P8 + ký 2 RC-mark. Đóng **10/10 wave** gói adap 7-GĐ, rồi chạy `/session-end`. Bookend @close nổ **21 FLAG thật** trên bề mặt lead tưởng sạch; vá 20, 1 để carry. + +### B. Hướng-tiếp + nhánh-đã-loại +**Hướng:** anh duyệt `bao-cao-cuoi.md` → gửi hub · phiên sau cắm mã thoát W3b khi soak đủ. +**Nhánh đã LOẠI:** (a) bẻ bảng sổ cho vừa regex `^ST-` — loại, vì đó là rời tập-đo · (b) ép số A16 về 21 cho khớp kế hoạch — loại, đo ra 23 thì ghi 23 · (c) trục xuất class khỏi enum đã niêm phong — loại, chờ anh phán P3 hồi-tố. + +### C. Kế-hoạch (delta suy-nghĩ) +Delta lớn nhất: **thước của chính mình là nguồn lỗi thường xuyên hơn máy**. Ba lần trong một phiên (vòng lặp `C[3]` rỗng · sweep toàn cục ăn ảnh chụp · tin R-2 không kiểm) đều đẻ ra kết quả **nhìn hợp lệ**. ⇒ mọi phép đo tự dựng phải có **control dương** trước khi kết luận, và mọi replace-theo-mẫu phải **neo phạm vi section**, không neo hình dạng dòng. + +### D. Đang-thảo-luận +- `{treo-chờ-anh}` duyệt báo-cáo-cuối → gửi hub · ghép điều-kiện-3 vào bậc-2 · P3 forward-only hay hồi-tố · VK-5. +- `{gần-chốt}` W3b cắm mã thoát — phân loại 64/64 xong, chỉ chờ soak ≥1 phiên (tự tan). +- `{mới-nêu}` `gap-underfill` của `lead-gap` fire ngược chiều phán quyết S179 mà **không kèm số** — `ring2` đề nghị đòi phép đo trước khi vào tally. + +### E. Dòng-sống spawn/engine-run +- `ctx-verifier` → `CO — 13 cờ` → `.claude/agent-memory/ctx-verifier/MEMORY.md` +- `lead-stale-auditor` ×2 → `PROBE-B 12 class` + `9 FLAG` → `.claude/agent-memory/lead-stale-auditor/MEMORY.md` +- `score-counter` → `KHÔNG ĐO ĐƯỢC — 1 mục` → `.claude/agent-memory/score-counter/MEMORY.md` +- `score-count-auditor` → `SKIP-CO-KHAI`, tool_uses=0 → `.claude/agent-memory/score-count-auditor/MEMORY.md` +- `tooling-auditor` → `PASS_WITH_FLAGS 6` → `.claude/agent-memory/tooling-auditor/MEMORY.md` +- `harvest-curator` → `GATE-FAIL 6` → `.claude/agent-memory/harvest-curator/MEMORY.md` +- `lead-gap-auditor` → `6 FLAG` → `.claude/agent-memory/lead-gap-auditor/MEMORY.md` +- `ring1-audit` → `26 ĐẠT / 5 TRƯỢT` → `.claude/agent-memory/ring1-audit/MEMORY.md` +- `ring2-audit` → `14 ĐẠT / 0 TRƯỢT` → `.claude/agent-memory/ring2-audit/MEMORY.md` +🔴 **9/9 spawn garble first-return hoặc cần resume** — khớp datum S180 (6/6); mất **0 byte**, recover path-2. +🔸 **KHAI KẼ (máy tự nêu, diễn đạt KHÔNG lặp lại literal để khỏi tự bắt mình):** con-trỏ mục E của block-0 có chứa **tên lệnh dạng gạch-chéo** trong câu văn giải thích, và closed-check đọc chúng thành **tệp chưa sinh**. Đó là kẽ của thước, không phải nợ thật. Block này chỉ dùng **đường dẫn tệp đầy đủ**, không nhắc tên lệnh, nên không tái phát. + + ## MIND-0 — 2026-08-07T17:34:01+07:00 @ 4091468 (window 1) ### A. Gói-turn diff --git a/.claude/skills/ef-core-migration/SKILL.md b/.claude/skills/ef-core-migration/SKILL.md index ef8f341..95829bb 100644 --- a/.claude/skills/ef-core-migration/SKILL.md +++ b/.claude/skills/ef-core-migration/SKILL.md @@ -16,7 +16,13 @@ when-to-use: > **Context:** .NET 10 + EF Core 10 + SQL Server. DbContext: `ApplicationDbContext` ở `Infrastructure/Persistence/`. Startup: `SolutionErp.Api`. -## Migration history (số hiện tại → `docs/STATUS.md` canonical; mới nhất = row cuối bảng) +## Migration history — 🔴 KHO LỊCH SỬ, **KHÔNG** phải nguồn "mới nhất" + +> 🔴 **Cả hai con số đều đọc từ NGUỒN SỐNG, CẤM đọc từ bảng dưới:** +> - **số hiện tại** → [`docs/STATUS.md`](../../../docs/STATUS.md) row `Migrations` (canonical) +> - **cái mới nhất** → `ls src/Backend/SolutionErp.Infrastructure/Persistence/Migrations/*.cs` (trừ `Designer`/`ModelSnapshot`), lấy row cuối +> +> 🧊 **Câu cũ ở dòng này ghi *"mới nhất = row cuối bảng"* — SAI và tự mâu thuẫn** với chính vế đầu (vế đầu trỏ canonical, vế sau lại tự nhận là nguồn). Bắt @S181 bằng **thách-CLEAN của `ring1-audit`**: bảng dừng ở **Mig 71** trong khi đĩa + `STATUS` đều **72** (`AddMaHangMucToContractSigningPlanLines`, 2026-08-06) — control dương cùng phép: `Mig 71` = 67 hit toàn kho ⇒ thước sống, 0-hit của `Mig 72` **trong tệp này** là vắng thật. ⇒ Bảng dưới **chỉ để tra lịch sử**; nó **sẽ luôn tụt sau** và điều đó **hợp lệ** — cái sai là câu tự nhận nó là mới nhất. | # | Name | Tables added / changed | |---|---|---| diff --git a/docs/HANDOFF.md b/docs/HANDOFF.md index 7450c0f..82c9b3f 100644 --- a/docs/HANDOFF.md +++ b/docs/HANDOFF.md @@ -2,7 +2,14 @@ > **Tiering rule (S40):** giữ **2-3 session gần nhất**. Cũ hơn → `docs/changelog/sessions/`. Full brief history pre-S40 → `docs/_archive/HANDOFF-preS40-fullhistory.md`. -**🆕 Last updated:** 2026-08-05 sáng (**S171→S172** — phiên-LOGIC **L10** windows 3-4). **`998ea55` KHKK 3-panel: cicd verdict = PASS** (644/644 · bundle 4/4 rotate · 2 endpoint MỚI 401 · mig set-diff 0/0 hai chiều · smoke 8/8) · chân #44/#85 đóng bằng đo **trên 2 tổ-hợp vai** · bookend-close **5 vòng / 11 sub**. Bundle prod nay **`Ajv-MaCz`/`YsXRkBSR`** · Mig GIỮ **71** · counter **46**. Chi tiết → `docs/STATUS.md` Recently Done S171–S172 + `docs/changelog/sessions/2026-08-05-0900-S172-cicd-verdict-998ea55-close.md` + `.claude/workflows/runs/2026-08-05-S172-bookend-close/`. +**🆕 Last updated:** 2026-08-07 (**S180→S181** — phiên-LOGIC **L12** windows 1-2). **Gói adap 7 GĐ ĐÓNG 10/10 wave.** Anh chốt 8 câu P1-P8 + ký 2 RC-mark. Roster 26→28 vai, cap 20→30 (slot 75 đóng). 3 máy governance mới + 4 máy vá. Push `55894a04..5ae60e41`. +> 🔢 **CHỜ ANH (trả lời bằng SỐ):** **(1)** duyệt `adap-reports/upgrade-pack-phased-bao-cao-cuoi.md` → gửi hub? · **(2)** ghép điều-kiện-3 của thư hub 08-07 vào **bậc-2** luật tự-trị (`ACTIVE-MARKS §LT3`)? · **(3)** P3 = **forward-only** (lead đang đọc vậy) hay **hồi-tố** trục xuất class khỏi enum đã niêm phong? · **(4)** VK-5 — cho nhập bảng `HANDOFF:10-17` vào khối chính sổ yêu-cầu, hay giữ ở phụ lục *suy ra*? +> 🔴 **NEXT-em (tự chạy, không cần anh):** cắm mã thoát W3b khi soak đủ (đã phân loại 64/64 ở `harness-11-engine PHẦN Q`) · `OVERDUE:deep` 15/15 · 3 tệp over-cap. +> 🔁 **RE-STAMP CARRY @S181** — đóng dấu lại **20 carry còn mở** (`session-end §L.b(j)(iv)`). Bản trước rơi **4 kỳ liên tiếp**, `class_repeat.gap-carry-dropped` = **12** = 4× ngưỡng JUMP ⇒ nghi-thức này **không có răng**, không phải đãng trí: +> `[carry:acceptance-runtime-khkk]` `[carry:account-trung]` `[carry:binh-le-decision]` `[carry:bvaau]` `[carry:ctx-t9-dogfood]` `[carry:e7-cot-chet-khkk]` `[carry:endline-sub-md]` `[carry:harvest-no-s168-s171]` `[carry:harvest-orphan-s159-tongquan]` `[carry:hmw-subfile-index-collision]` `[carry:pe-phanquyen]` `[carry:ring5-audit-gap]` `[carry:synthesis-roll-s159-s160]` `[carry:tiep-3ter-seed-unwired]` `[carry:tiep-reload-underfill]` `[carry:tools-whitelist-no-teeth]` `[carry:tra-bui-relogin]` `[carry:uat-s117]` `[carry:uat-s133-budget-freeze]` `[carry:uat-s134-luyke]` `[carry:w3b-cam-ma-thoat]` `[carry:bao-cao-cuoi-cho-duyet]` `[carry:h24-deep-overdue]` +> ✅ **ĐÓNG @S181:** `[carry:hmw-width-vs-roster]` — cap 20→30, roster 28 ≤ 30, slot (75) khép. +> 🔴 **`[carry:h24-deep-overdue]` MỚI** — `OVERDUE:deep` 15/15 bị lead hạ xuống hàng NEXT-em ngang việc vặt (FLAG-4 `gap-decision-sunk`). Cổng ĐÃ kêu, máy ĐÃ in, lead ĐÃ chép 2 sổ — rồi vẫn hoãn. **Cổng kêu mà không đổi hành-vi = cổng không có răng.** + --- @@ -24,7 +31,7 @@ **(73) 🔴 RESTART CLI để spawn-probe 3 vai STYLE** — chốt-chặn DUY NHẤT còn lại của đội STYLE. Registry = ảnh-chụp lúc khởi phiên, **KHÔNG hot-reload**; `ls` + grep `VALID_ROLES` chỉ là điều-kiện **CẦN**. Anh đã "OK" @S179 nhưng **chưa restart** ⇒ 3 vai vẫn `file-land`, chưa chạy lần nào. Bằng-chứng còn nợ: cửa-sổ S179 có **8 file `fe-*/src/**`** đúng địa-phận FE-style mà **0 con được gọi** (đã ghi `SKIP-CO-KHAI`, không im lặng). **(74) `ROTATE` mật-khẩu prod `vrapp`** — việc anh, treo từ S153, chưa có mốc. -**(75) `hmw_width.cap` 20 < roster 26** ⇒ full-roster-sweep LOUD-skip 6 lane cuối. Anh trả "OK" @S179 = **ghi nhận**, em đọc là **CHƯA phải lệnh đổi số** ⇒ giữ 20. Nâng hay giữ = quyền anh (O-7). +**~~(75) `hmw_width.cap`~~ ✅ ĐÓNG @S181** — anh nói dứt khoát *"nâng cap"* ở câu **P4** ⇒ lead thi hành THẬT: cap **20→30** đủ **2 mirror** (`memory-budget.json` + `hmw.js WIDTH_CAP`). Roster nay **28** ≤ 30 ⇒ **hết LOUD-skip**. 🧊 **Giữ vết vì đây là bài học:** @S179 anh trả *"OK"* và lead **tự thu-hẹp** thành *"ghi-nhận, CHƯA phải lệnh đổi số"* ⇒ giữ 20 — đó chính là ca `lead-gap-auditor` FLAG-4 bắt (*"Diễn-giải của lead, không phải chữ của anh"*). Lần này không tự thu-hẹp. ### 🔵 NEXT em @S179 (em tự làm, không cần anh gật) diff --git a/docs/STATUS.md b/docs/STATUS.md index 42a108c..bef080f 100644 --- a/docs/STATUS.md +++ b/docs/STATUS.md @@ -5,7 +5,7 @@ > 🔴 **@S179: mốc SỐNG hiện tại = S179, phiên-LOGIC L11, window 7** — chuỗi UAT màn KHKK 8 đợt ship (cửa-sổ 5: `530af22`→`ca9208f` 6 đợt + **Mig 72**; cửa-sổ 6: đợt-7 `99370de` + đợt-8 `65f73a9`, bundle prod `CuWgMI7J`·`32bJmjpM`), rồi S179 vá đội STYLE (SỬA-1→6b) + H24 light-audit. **Dòng CURRENT ngay dưới đây advance @closeout nên tụt sau — giữa phiên đọc `.claude/WAL.md`.** -**🔥 CURRENT (S161→S168, 2026-07-31→08-01 — phiên-LOGIC **L9**: chuỗi SP-002 B0→B4 **TRỌN 8/8 wave**: K1→K7 SHIP (cicd 6/6 · 5/6-khỏe · 6/6 · 7/7 · 5/5 · K6 #440 5/5 · K7 PARTIAL-live-sạch · F-1 `7a903cf` · K7 bridge `aaed699` PWF-10) + **@S168 owner chốt (63)(b)=D+"mở rộng": GĐ3-D SHIP `081557b` (3 trang Panel-3, gate PWF-10/0-blocker) + K8-BLOCKER Lines-editor phát-hiện-bởi-dry-run + vá + SHIP `0bfadc2` (gate PWF-8/0-blocker) — cicd #444 PASS 6/6 — rồi **K8 DRY-RUN PASS TOÀN TRÌNH 2 NHÁNH** (PE A/052 finalize-CCM + A/053 full-CEO → KHKK/2026/001+002 qua endpoint-line-MỚI → bridge-K7 → HĐ ĐẦU TIÊN prod `ZZTEST-K8/NCC/SOL&ZZTEST-NCC-K8/01` DaPhatHanh → bản-cứng hasSealedCopy=True → QĐ9 4/4 vế [nguồn-khoá-409 + catalog-rename-không-lan] — sổ ID + seq-cháy: `sub-k8-dryrun.md` B15, 🔴 KHKK/2026 seq **001-002-003 ĐỀU là phiếu test** [001-002 dry-run + **003 bộ fx3**] ⇒ **phiếu THẬT đầu tiên = 004** — số cũ "003" ở dòng này SAI, vá @close S168 sau khi `lead-gap-auditor` F-2 bắt + lead đo prod xác nhận `sqlcmd` 3 phiếu đều phase=3)**; closeout-nợ TRẢ @S168 — mạch sống ở `.claude/WAL.md`; lineage L8 giữ dưới):** Mig **71** (K1 Mig70 `AddContractCatalogEntries` danh mục 86 dòng + K2 Mig71 `AddKhkkApprovalGroupCatalogAndFinalizeRuntime` — phiếu KHKK +nhóm duyệt N1-N8 backfill=1 + Line +hạng-mục + unique 3-cột) · **97 bảng** · **644 test PASS** (45D+599I — CI #444 KHỚP local; +5 Fact Lines-editor @S168; lineage 639 sau-K7 → 622 @S167 KHỚP CI #439 tách-phần) · gotcha **87** · counter **46** (tick S172; H24 light **2/6** deep **6/15** ok — `light_at=44` · `deep_at=40`; ⚠️ *cặp `light 2/6` trùng số với đợt S168 do tình cờ 42−40 = 46−44, chỉ vế `deep` mới lộ 2/15→6/15 — đừng liếc vế light rồi tưởng ô còn tươi*) · roster 23 · **MenuItems prod 142 GIỮ** (key `KeHoachKyKet` sinh **policy** không sinh menu-row — H1 bác nghi-vấn stale) · Policies **452** · Menu keys **113** (@S166 K4a +49 `Khkk_G*` bộ-sinh — canonical bảng `:470-471`, test T2 khoá drift; lineage 64/256 @K3: +`ContractCatalog` K1 [4 policy chưa endpoint tiêu thụ — khai #82] · +8 `AwV2_KhkkN1..N8`) · bundle prod → **canonical ở `:479`, KHÔNG chép số ở đây** (B1). 🔴 *Cặp `DXoYDy7R`/`o8KDluD1` từng ghi ở dòng này **chưa bao giờ là trạng-thái cuối** — `e5123ff` ship thêm 6 file FE-src SAU snapshot; đo live @S164: admin `B43R6Y17` · user `NLI5umBg`.* Contracts prod **0**. +**🔥 CURRENT (S161→S168, 2026-07-31→08-01 — phiên-LOGIC **L9**: chuỗi SP-002 B0→B4 **TRỌN 8/8 wave**: K1→K7 SHIP (cicd 6/6 · 5/6-khỏe · 6/6 · 7/7 · 5/5 · K6 #440 5/5 · K7 PARTIAL-live-sạch · F-1 `7a903cf` · K7 bridge `aaed699` PWF-10) + **@S168 owner chốt (63)(b)=D+"mở rộng": GĐ3-D SHIP `081557b` (3 trang Panel-3, gate PWF-10/0-blocker) + K8-BLOCKER Lines-editor phát-hiện-bởi-dry-run + vá + SHIP `0bfadc2` (gate PWF-8/0-blocker) — cicd #444 PASS 6/6 — rồi **K8 DRY-RUN PASS TOÀN TRÌNH 2 NHÁNH** (PE A/052 finalize-CCM + A/053 full-CEO → KHKK/2026/001+002 qua endpoint-line-MỚI → bridge-K7 → HĐ ĐẦU TIÊN prod `ZZTEST-K8/NCC/SOL&ZZTEST-NCC-K8/01` DaPhatHanh → bản-cứng hasSealedCopy=True → QĐ9 4/4 vế [nguồn-khoá-409 + catalog-rename-không-lan] — sổ ID + seq-cháy: `sub-k8-dryrun.md` B15, 🔴 KHKK/2026 seq **001-002-003 ĐỀU là phiếu test** [001-002 dry-run + **003 bộ fx3**] ⇒ **phiếu THẬT đầu tiên = 004** — số cũ "003" ở dòng này SAI, vá @close S168 sau khi `lead-gap-auditor` F-2 bắt + lead đo prod xác nhận `sqlcmd` 3 phiếu đều phase=3)**; closeout-nợ TRẢ @S168 — mạch sống ở `.claude/WAL.md`; lineage L8 giữ dưới):** Mig **71** (K1 Mig70 `AddContractCatalogEntries` danh mục 86 dòng + K2 Mig71 `AddKhkkApprovalGroupCatalogAndFinalizeRuntime` — phiếu KHKK +nhóm duyệt N1-N8 backfill=1 + Line +hạng-mục + unique 3-cột) · **97 bảng** · **644 test PASS** (45D+599I — CI #444 KHỚP local; +5 Fact Lines-editor @S168; lineage 639 sau-K7 → 622 @S167 KHỚP CI #439 tách-phần) · gotcha **87** · counter **46** (tick S172; H24 light **2/6** deep **6/15** ok — `light_at=44` · `deep_at=40`; ⚠️ *cặp `light 2/6` trùng số với đợt S168 do tình cờ 42−40 = 46−44, chỉ vế `deep` mới lộ 2/15→6/15 — đừng liếc vế light rồi tưởng ô còn tươi*) · roster 28 · **MenuItems prod 142 GIỮ** (key `KeHoachKyKet` sinh **policy** không sinh menu-row — H1 bác nghi-vấn stale) · Policies **452** · Menu keys **113** (@S166 K4a +49 `Khkk_G*` bộ-sinh — canonical bảng `:470-471`, test T2 khoá drift; lineage 64/256 @K3: +`ContractCatalog` K1 [4 policy chưa endpoint tiêu thụ — khai #82] · +8 `AwV2_KhkkN1..N8`) · bundle prod → **canonical ở `:479`, KHÔNG chép số ở đây** (B1). 🔴 *Cặp `DXoYDy7R`/`o8KDluD1` từng ghi ở dòng này **chưa bao giờ là trạng-thái cuối** — `e5123ff` ship thêm 6 file FE-src SAU snapshot; đo live @S164: admin `B43R6Y17` · user `NLI5umBg`.* Contracts prod **0**. ① **5 wave KHKK SHIP (window-3, S161):** W1 `a8027c0` (Mig 69, 7 bảng, 89→96) · W2 `6cbc6ad` (CRUD+Dossier 15 policy) · W3 `df52fa0` (duyệt V2 3-trạm, test-before RED→GREEN) · W6 `761d818` (đường-ống HĐ V2) · W7 `3119cb9` (bản-cứng **1-MỐC** theo owner: form điền đủ → duyệt nếu có → upload bản cứng = xong). Mỗi wave: gate 5-anchor → hmw → test → reviewer → F-0 → cicd 3-chân. 3 quyết owner: mã `KHKK/{YYYY}/{Seq:D3}` · **bỏ "MB"** · GĐ4 1-mốc. ② **Cây 4-folder GĐ (window-4, S162) — `bfc7b79`, cicd PASS 5/5 Run #432:** lệnh owner *"Tạo folder: Duyệt NCC / Kế hoạch Hợp đồng. / Duyệt Hợp đồng / Hợp đồng cứng."* + AskUser chốt **DƯỚI TỪNG GÓI THẦU** + **áp CẢ trang GĐ khác**. 3 file MỚI ×2 app (`PipelineStageFolders` · `PipelineTreePanel` · `usePipelineStages`) + 3 trang ×2 app, **SHA-pair 6/6**, thuần FE 0-mig. designer SHIP-READY (tự soi ảnh bắt 4 lỗi build-không-báo) → reviewer PASS-WITH-FLAGS 8 → lead vá F-1/3/4/6/7 + F-8. ~~🔴 CÒN NỢ: trang GĐ3 chưa làm~~ ✅ **ĐÓNG @S168 `081557b`** (owner slot (63)(b)=D + "mở rộng" ⇒ áp CẢ 3 trang; câu gốc giữ làm lineage — H1 F-1) (owner nói "CẢ", lead giao 3/4 — lead-gap FLAG-3) · F-2 liên-danh N-HĐ chờ W5 · F-5 layout 19rem chờ owner nghiệm thu prod. ③ **Bookend-close 5 vòng, 10 vai:** H1 `PASS_WITH_FLAGS` 10 finding · H2 **`GATE-FAIL` 4** (⭐ `ctx-verifier` chạy thật mà **chưa bao giờ tự APPEND** diary — S153+S158 đều lead-seed; `cicd-monitor` khai "verbatim→archive" thứ `git log -S` chứng **chưa từng vào archive**) · cặp H24 **20 FLAG** (stale 16 = **SÀN** + gap 4, `gap-carry-dropped` **streak 8**) · trio memory **MIXED** (headroom 165.767 tok đơn-điệu giảm 3 mốc · light 9/6 OVERDUE · baseline `measured` 17/23) · orphan run-folder **3 xác nhận** (2 thiếu THẬT + 1 dương-giả TÊN). @@ -475,7 +475,7 @@ monthly re-tier mega-line + ef-core SKILL Mig→59 + 3 vocab-fork (2026-07-01 du | Gotchas | **87** | 🔄 **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 | **26** | **+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** ⇒ 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). | +| Sub-agents | **28** | **+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). | | RAG chunks | 🟢 **service UP** · 🔴 **SE index STALE** | 🔴 **TÁCH 2 TRỤC @S159 — 1 nhãn nhị-phân DOWN/alive che mất trục thứ hai.** ① **service-liveness = UP**: đo LIVE 2026-07-29 `list_projects` → **7/7 project chunk > 0** (`solution_erp` **2449** · vipix_multisite 7090 · dh_y_duoc 15440 · namgroup 6106 · ashico 4742 · vipix_ai_infra 4176 · benhvien_aau 3024; chỉ `shared_global` = 0); **query THẬT** `search_code` → 1 hit **có ruột** score 7.156 ⇒ collection đọc được, **không phải vỏ rỗng** (metadata một mình KHÔNG đủ — có thể là registry-cache). ② **SE index-freshness = KÉM**: `last_indexed_at` = **2026-05-29** trong khi **5 sibling re-index 2026-07-29 08:21** cùng một lượt. **Lật thẳng DOWN→alive sẽ CHÔN trục ②.** 🧊 **Nhãn "DOWN từ S153" ĐÚNG LÚC GHI** (`33e7f68`, 07-28 20:50, 3 phép đo khớp, `chunk_count=0` cả 7 project) — service **hồi phục sau ~12h** ⇒ class `view-stale-status`, **KHÔNG phải lead ghi ẩu**; đừng quy lỗi cho lượt viết vốn có bằng chứng đúng. 🔸 **Caveat giữ (H1 F-4 → ring1 T-2):** H1 tuyên `last_indexed_at` "không đáng tin" (2447→2449 nhúc nhích), `ring1` **BÁC** bằng nội-dung — coi là **đáng tin**; muốn chắc tuyệt đối thì re-index rồi xem field có nhảy không. Re-index = AI_INFRA op (cần VOYAGE_API_KEY). *(FLAG-2 `view-stale-status` HIGH — `lead-stale-auditor` @S159, `ring2` tái-dựng 8/8 số. Lead trước đó chỉ vá `:6`, sót đúng ô canonical này = **canonical-poison**, cùng lớp khác site.)* | **Bundle hash live (prod):** admin **`Ajv-MaCz`** (1.783.465B) · user/eoffice **`YsXRkBSR`** (1.701.224B) — **đo LIVE 2026-08-05 @S172 bởi 3 nguồn độc-lập** (cicd-verify `998ea55` §5.1 · lead `curl` · `ring2-audit` §2 đo ngoài repo); 2 hash đời trước đã **biến mất khỏi đĩa** (trả `text/html` ~900/876 B). 🧊 *S168 #444: admin `DLRf9TeA` · eoffice `C7TGA4Kn` — **ô này đứng STALE suốt S171→S172** dù `998ea55` đã ship 04/08; `lead-stale-auditor` FLAG-1 (HIGH) bắt @S172, `ring2-audit` F-2 HELD bằng nguồn ngoài repo. **Lần thứ hai cùng ô** (S166 F-2) ⇒ quy-trình tự-khai dưới đây **có luật mà không có người thi hành** — nếu tái-diễn lần 3 thì phải wire máy, đừng vá tay nữa.*; 🧊 K7 #442: admin `RgvHZkPH` · eoffice `D65FJPGd`; push kế tiếp SẼ rotate tiếp ⇒ **nguồn cập nhật ô này = cicd-verify lượt kế, đừng tin ô này quá 1 deploy** (bài "sạch lúc HH:MM" — ô này đã chết-ngay-lúc-viết 1 lần trong chính S166). 🧊 Lineage gần: K6 #440 admin `Ig1R5tAh` ROTATE · eoffice FROZEN-lành-tính cmp-byte · K4a #437 admin `1yiNV4VH`/eoffice `DoULfmdT` (post-F-1, 2-css khớp chứng đo-đúng-site) · K3 #436 admin `mySTlx42`/css `Cf3iCOOv` · eoffice `CZAYiWWa` FROZEN-hợp-lệ (diff toàn comment, cicd §5 dự-đoán-trước). 🧊 Lineage cũ (S162-S164, hash `B43R6Y17`/`NLI5umBg` đã chết): **Nguồn rotate = push `e5123ff`**, commit gắn nhãn `Docs: S162 closeout` **nhưng ship 6 file FE-src THẬT** (`PipelineStageFolders.tsx` · `PipelineTreePanel.tsx` · `usePipelineStages.ts` ×2 app) ⇒ rotate **real-src, KHÔNG phải #69-benign**; scope commit sai convention (đáng lẽ `FE-Admin`+`FE-User`, không phải `Docs`). 🔴 **Hại đo được — LỆCH 2 BỀ MẶT, không phải 1:** ô này đứng ở cặp S157 qua **2 đời deploy**, VÀ dòng `:6` ghi cặp S162 `DXoYDy7R`/`o8KDluD1` **chưa bao giờ là trạng-thái cuối** (snapshot chụp sau `bfc7b79`, trong khi `e5123ff` còn ship FE tiếp) ⇒ **cả 2 bề mặt owner đều lệch prod cùng lúc**. Đúng ca *"closeout-push kế có non-md sẽ rotate tiếp"* mà chính ô này đã tiên-liệu (precedent S99-#485 / S107) — tiên-liệu đúng, cơ-chế bắt vẫn không có. **Control-âm:** cặp S157 `8-QYcMOg`/`DptYR4wL` nay trả `text/html` **900 B** admin / **876 B** eoffice ⇒ bundle cũ đã chết. ⚠️ **CHƯA neo run-số CI** — lead chỉ curl 3 phép (2 hash live + control-âm), **không đọc Gitea Actions**; cần `cicd-monitor` xác nhận Run # + test-gate trước khi coi ô này đủ bằng-chứng. 🧊 *Mốc trước S157:* admin **`8-QYcMOg`** · user **`DptYR4wL`** (đo LIVE @S157 2026-07-28, **Run #419** `6250f39` — cicd PASS 9/9 + lead tự re-curl độc lập khớp từng byte, marker 2/2 mỗi app; **control-âm**: 2 hash CŨ `index-BK8w3QxU.js`/`index-DYnxSI0T.js` nay trả `text/html` **900 B admin / 876 B eoffice** ⇒ bundle cũ đã chết trên prod. 3 phép đo độc-lập: cicd-verify · lead re-curl · ring2-audit). 🔴 **Ô này từng đứng ở cặp `BK8w3QxU`/`DYnxSI0T` sau khi prod đã rotate** — `git show 3b6fabc -- docs/STATUS.md` chỉ có 2 hunk, **0 hunk chạm dòng này**; hại đo được: `cicd-verify-s157-diadiem.md:58` dùng chính ô này làm baseline ⇒ lượt deploy kế hoặc báo "ĐỔI" giả hoặc che một lần không-rotate (lead-stale-auditor FLAG-1 HIGH @S158). 🧊 *Mốc trước:* admin `BK8w3QxU` · user `DYnxSI0T` (S156 CI run 531 `f4494cf`; `Last-Modified` 14:41:15/14:42:10 +07 **nằm trong cửa-sổ deploy** — ship-proof, không phải hash-delta suông. Byte-verify 4/4 marker: `allowApproverDelete` 8/2 · `by-approver` 1/1 · `deleted=1` 1/1 · `view=approved` 1/1. ⚠️ **Không chứng minh hồi-tố** được bundle của riêng `4464a46` đã rotate lúc 14:12 — `f4494cf` đè lên sau 30 phút, không ai chụp snapshot khoảng giữa). 🧊 *Mốc trước:* admin `B2j1LQ-v` · user `C3wbJegk` (S147 CI #407 — re-stamp @S152: FLAG-2 lead-stale bắt ô này đứng S134 qua 5 nhãn trong khi `:6`/`:465`/HANDOFF đều S147; ring2 verify 2 lệnh độc-lập). 🧊 *Chuỗi rotate lịch-sử giữ nguyên:* (S134 — **`6664a61`** PE lũy kế TẠM TÍNH vs CHÍNH XÁC [0 mig — `ComputePendingAsync` complementary + DTO 5-field + FE sub-dòng amber + banner màn duyệt + D4 audit-note]; **Run #399** GO 5/5 5m27s gate-**528**-EXACT-từ-log rotate ×2 admin js `3NCdyODe`→**`BVCukFP5`** css `B--dUHcm`→**`CBzUlgOA`** / eoffice js `CKsoiNCI`→**`DoxyEOxh`** css `BuntB63r`→**`BHsBUA8e`** [FE-src đổi thật 6 file ⇒ rotate expected; CSS rotate = amber badge utilities, benign #69]; real-size 1.659.037/1.565.367B + LM 14:31:34/14:32:28+07 in-window; **byte-verify #77** `pendingPriorPes`=2 + `Tạm tính`=3 + `phiếu trước cùng gói thầu CHƯA duyệt`=2 PRESENT cả 2 js [control old-hash 900B text/html 0-hit — ct=text/html là discriminator sạch hơn size-919b]; Mig 67 top FROZEN + 89 bảng [0-mig by-construction]; smoke 4×200 + PE 401; lead spot-check độc-lập post-verdict: 4/4 hash khớp + marker PRESENT). **Prev S133** — admin **`3NCdyODe`** · user **`CKsoiNCI`** (S133 — **`d4fbced`** PE freeze NS phiếu DaDuyet [Mig 67 snapshot 11 cột + backfill 18/18 + FE 2-app badge 🔒 SHA-mirror `5534addb` + display-gate `budgetFrozen`]; **Run #398** GO 5/5 gate-520 rotate ×2 admin →**`3NCdyODe`** [CSS `B--dUHcm`] / user →**`CKsoiNCI`** [CSS `BuntB63r`] — prev `yCkX-2Bp`/`DKSD4p9k` @Run #397 S131-S132 [dòng-live lag S117→S133, hoist per precedent S104/S107]; **CSS cũng rotate** = badge sinh utility-class mới, benign #69; **byte-verify #77** `budgetFrozen`=1 + VN-string 🔒=1 PRESENT [old-control 0]; Mig 67 prod history-top + 11 cột + backfill 18/18 chua=0 + sys.tables **89**; smoke 4×200 + PE 401; `/tiep` S134 re-verify độc-lập 4/4: mig-top + health-200 + bundle-hash ×2 + filter 11/11). **Prev S117** — admin **`cFI7ih4a`** · user **`MxgooVZw`** (S117 — **`316a82f`** PE endsBeforeCeo pointer-aware [display-fix BE-only, phiếu chờ CEO hết báo "Kết thúc" sai] + duyệt-theo-khoảng Min–Max [Mig 66 + FE 2-app ProMinMax radio thứ 5]; **Run #387** PASS 5m36s rotate ×2 admin `Dd55jBpj`→`cFI7ih4a` / user `DVDr1UQ4`→`MxgooVZw` CSS-frozen [logic-only fingerprint]; **byte-verify #77** `ProMinMax`/`duyệt theo khoảng`/`cả Min và Max`/`Min–Max` PRESENT [bundle-cũ=0]; Mig 66 prod col decimal(18,2) + `__EFMigrationsHistory`-top + sys.tables **89**; smoke 200×3 · PE 401-secured; **#53-garble ×2** [invest-lane-1 + cicd-monitor] → SendMessage-resume + em-main curl cross-verify khớp). **Prev S116** — admin **`Dd55jBpj`** · user **`DVDr1UQ4`** (S116 — **`88368fd`** PE cho nhập giá ÂM ô báo giá [FE 2-app nút ± toggle + submit-gate `>0`→`!==0` + helper `hasRealSelectedQuote` 2-mirror `:201`/`:235`; BE submit-guard `:206` `Sum()<=0`→`All(==0)`; +9 test 486→495; **NO migration**]; **Run 386** PASS 5m28s rotate ×2 admin `D51OYyGV`→`Dd55jBpj` / user `BVdssm5S`→`DVDr1UQ4` CSS-frozen [logic-only fingerprint]; **byte-verify #77** `Đã nhập giá chào thầu`/`hoàn tiền NCC`/`phát sinh giảm`/`Đơn vị được chọn chưa có giá chào thầu` PRESENT [bundle-cũ=0]; smoke 200×3 · PE 401-secured · 89 bảng; cicd bắt bẫy snapshot-while-CI-running→poll-success TRƯỚC re-snapshot). **Prev S114** — admin **`D51OYyGV`** · user **`BVdssm5S`** (S114 — **`d436af2`** PE multi-NCC per hạng mục [Mig 65 backfill 2-chiều + BE re-key 5 financial→IsSelected + FE per-cell grid Detail×NCC 2-app SHA `ae3788e9`]; bundle rotate ×2 admin `acprMqfB`→`D51OYyGV` / user `Ck3BTDdA`→`BVdssm5S`; **byte-verify** `detailId`+`select-winner`+`hạng mục` PRESENT [bundle 1.65MB real-size]; smoke health/admin/eoffice 3/3 200 + endpoint POST select-winner bogus-401-live; **cicd garble #53 ×5 → em-main-solo curl-verify**; mig applied [API-healthy=migrations-ran-startup]). **Prev S113** — admin **`acprMqfB`** · user **`Ck3BTDdA`** (S113 — **Run #497** `5fa11b5` Supplier import v2 [Mig 64 publish/draft + dedup-MST + template + file mẫu] FE 2-app real-src rotate; JS admin `Cixlt_MA`→`acprMqfB` / user `BhBOG1dn`→`Ck3BTDdA` + CSS admin `Ds-E5neu`→`CfunQHbd` / user `Beb0Bb1h`→`DGqqHQXS`; ship-proof real-size 1.66/1.56MB + LM-in-window + **byte-verify** `Tải file mẫu`×1/`Đã công bố`×3/`Nháp (ẩn)`×4/`import/template`×1/`published`×5 PRESENT; Mig 64 prod 37/37-backfill sys.tables **89**; smoke health/admin/eoffice 200 + `import/template`-401-live + `suppliers?published=true`-401-live bogus-404-control). **Prev S112** — admin **`Cixlt_MA`** · user **`BhBOG1dn`** (S112 — **Run #496** `e100ef0` Supplier Excel-import Phase B FE 2-app [`SupplierImportDialog` NEW cả fe-admin+fe-user] + PE sign-off code-only; **real fe-src rotate — kết thúc #489→#495 non-determinism-freeze**; JS admin `BVyH-FY7`→`Cixlt_MA` / user `EDsZebvn`→`BhBOG1dn` + CSS admin `Bbtesa6B`→`Ds-E5neu` / user `BmuPz_Dy`→`Beb0Bb1h`; ship-proof real-size + Last-Modified-in-window + `"Database NCC"` marker PRESENT ×1; Mig 63 prod 2/2-col sys.tables **89**; smoke health/admin/eoffice 200 + PE-endpoint 200 + import-route preview-415/confirm-401-live bogus-404). **Prev S107** — admin **`BVyH-FY7`** · user **`EDsZebvn`** (S107 — **Run #489** `21387cd` +office-document 12th sub governance-only; **rotate benign #69-two-mode** [0 fe-src — Vite non-determinism], CSS frozen `Bbtesa6B`/`BmuPz_Dy`, real-size 1.64/1.55MB + Last-Modified-in-window 09:32/09:33 = ship-proof, Mig 62/89 frozen, smoke 200×3; hoist @S107-closeout per H1 flag D-BUNDLE-lặp — ⚠️ closeout-push kế có non-md sẽ rotate tiếp → Run #490 record nằm ở cicd MEMORY [authoritative], hoist ở bundle đầu phiên sau per precedent S99-#485). **Prev S104** — admin **`ChSNAJBK`** · user **`Bn2w1znH`** (S104 — **Run #488** `778fc98` Mig 62 Supplier expand 30-field; real-src-rotate FE 2-app SHA-mirror [form 4-section + Status select + `PathLink` 3 NAS-link], **sys.tables 89 pre==post no-new-table**, prod-verified marker grep-HIT, smoke 200×3; S104-shipped nhưng dòng-live `:27` lag tới S106 → hoist per H1 flag D-BUNDLE). **Prev S97** — admin **`mEGqlNWc`** · user **`Dnrp4PU1`** (S97 — **Run #484** `fb2dfa9` Mig 61 data-fix backfill; bundle rebuild **#69-benign** [0 FE-src change, review-workflow cicd re-snapshot LIVE → `CeTA7Z82`/`CGaAyXen` #483 đã bị #484 rebuild rotate]; backfill A/005/A/008 flag 0→1 prod-verified). **Prev #483** — admin **`CeTA7Z82`** · user **`CGaAyXen`** (S97 — **Run #483** `9e12e80` badge "✅ Đã được CEO duyệt" phiếu đi-hết-lên-CEO [PeFinalizeChip single-source + 6 call-site 2-app, đối xứng chip "⚑ Kết thúc·X"]; FE-only tận-dụng endsBeforeCeo runtime, no BE/mig; JS rotate CSS-frozen #69; byte-#77 "Đã được CEO duyệt" PRESENT cả 2 app + prev-badge additive no-regression; Mig 60 frozen; smoke 200×3 + PE-list 200). **Prev #482** — admin **`DR9q2VUy`** · user **`Bgz8u4E5`** (S97 — **Run #482** `8037fa0` endsBeforeCeo config→RUNTIME [Mig 60 `EndedByLevelFinalize`]: **Mig 60 applied prod** (history-top + col-default-0 EXISTS + backfill=0 UAT-no-marker + sys.tables **89** pre==post); **EF-ternary SQL-Server LIVE-confirmed** GET /purchase-evaluations 200 items=9 + PE-detail `31faef0d` 200 **endsBeforeCeo=False phase=7** = runtime-path chạy = **bug fixed LIVE** (NOT 500); JS rotate 2-app PeWorkflowPanel gate-diff, CSS frozen #69-REFINE; byte-#77 `endsBeforeCeo` PRESENT in-bundle; smoke 200×3. reviewer PASS 0-issue + test 440. **Prev #481** — admin **`Cf0o8dx8`** · user **`x8rppRAK`** (S97 — **Run #481** `1c8fb6a` PE finalize 2-fix [badge "không trình tới"→"Kết thúc tại {cấp}" + đảo default checkbox opt-in]; JS rotate real-FE 2-app `PeWorkflowPanel` diff, CSS frozen `Bbtesa6B`/`BmuPz_Dy` #69-REFINE logic-only; **byte-level #77** NEW `Kết thúc tại`+helper PRESENT / OLD `không trình tới`+`Đã BỎ tick` ABSENT; real-size 1.64/1.54MB; Mig 59/88-table frozen; smoke 200×3. FE-only mirror SHA `bcf812fd`, 0 BE/mig/test). **Prev S96** — admin **`COYAX-yQ`** · user **`0MU-kb4N`** (S96 — **Run #480** `0c2f9f6` price-lock; chuỗi 3 PE deploy #478 `e657faa` checkbox-opt-out → #479 `36cbf8b` chuông-stale-clear (BE-only) → #480 `0c2f9f6` khóa-giá-sau-duyệt, cicd PASS each ~5m; **FE JS rotate THẬT** (PeWorkflowPanel #478 + PeDetailTabs #480, 2-app) real-size 1.64/1.54MB vs 919b SPA-trap, CSS frozen #69-REFINE; Mig 59 frozen 0-mig; +Run #477 `ba4b8e0` NCC seed no-mig prod 21 NCC. **Verify byte-level:** prod `0MU-kb4N` CHỨA checkbox-fix ("BỎ tick"/"Đã BỎ tick") + "✅-static" cũ MẤT → checkbox "ko-được" = browser-cache KHÔNG deploy-fail). **Prev S95** — admin **`0T6vVJST`** · user **`BGXEVZO6`** (S95 — **Run #476** `18a17f5` H17 governance-only deploy; bundle rotate benign #69 CSS-frozen, prod 200×3, Mig 59 unchanged; cicd re-snapshot LIVE — pre-deploy `CkZ1MjC1`/`_-gpX7_Y`, mega-line S93 `CDn40vpV`/`CoPmPBg7` đã bị deploy trung-gian rotate từ S94). **Prev S85** — admin **`aKuNip19`** · user **`BUsL0HeQ`** (S85 — **Run #341** `49ac086` lệch-giờ TZ serialize UTC-with-Z; FE frozen #339+#341 BE-only. Chuỗi ~10 deploy #334→#341 buổi UAT anh Kiệt CV PRO: #334 `5a61254` batch CV PRO 6-fix → #335-#338 6 vòng UAT → #339 `1263c0d` workflow-preserve bug-class S42 → #341 `49ac086` TZ; #342 `d4f6021` docs+cicd BE-frozen, bundle giữ-nguyên gotcha #69-REFINE). **Prev S78** — admin **`CsJetgZH`** · user **`BVS0ApIm`** (S78 — **Run #330** `7886fd0` PE attach-file khi duyệt; bundle ROTATE từ S77 `BqKD3Y23`/`Cn-i349D` dù NO migration enum-only — gotcha #69 non-determ rebuild; cicd ship-proof byte-stable + fake-hash control). **Prev S77** — admin **`BqKD3Y23`** · user **`Cn-i349D`** (S77 — **Run #329** `e823694` banner Trả-lại; cuối chuỗi 10 deploy #320→#329 cùng ngày, cicd PASS each: #320 pill `DsSg6RRz`-era → #321 focus → #322 revert → #323 Mig57+notes `CPm4LTqm`/`BWJUAqEI` → #324 số-âm-đỏ `C6fx-0ea`/`N3sW4Div` → #325 indent `BhnNMucS`/`B1VebpXc` → #326 cờ-gấp-asymmetric `DwXqn37C`/`COXMCv7E` → #327 decouple `B0gboSAg`/`DbDg7pM-` → #328 notify (BE-only, FE frozen) → #329 banner **`BqKD3Y23`**/**`Cn-i349D`**). **Prev S76** — admin **`jOqxW4-p`** · user **`DbsznVvR`** (S76 — **Run #319** `21d1f4e` bảng lưới `` ngân sách viền-ô; chuỗi S76 cùng ngày: #318 `e33481e` feature ma-trận-3-cột + badge quyền-NS `BhFDF9IJ`/`BAkuRl3C` → #319 **`jOqxW4-p`**/**`DbsznVvR`**, cicd PASS each, smoke 3×200, Mig 56 applied prod #318). **Prev S74** — admin **`BYF5vIMJ`** · user **`CB-tiRxd`** (S74 — **Run #315** `8655ebf` Mig 55 CcmNote, cicd PASS ~4m54s: Mig 55 applied prod CcmNote nvarchar(1000) nullable · sys.tables 88 · smoke 4×200 · 0 regression). **Prev S73** — admin **`Bv3jUCNo`** · user **`BWlMBQz6`** (Run #314 `6aa4dcb` FE empty-candidates guard fix; chuỗi 2 deploy: #313 `1d86abc` feature `OlNyG9OD`/`DSzSLVtL` → #314 **`Bv3jUCNo`**/**`BWlMBQz6`**, cicd PASS each). **Prev S72** — admin **`fc_xkNpJ`** · user **`DP-tBcg0`** (Run #312 governance commit `18fced6`; bundle ROTATE do **non-deterministic hash + deploy rebuild-FE-unconditional** (gotcha #69) — 0 FE source change, prod state/DB GIỮ NGUYÊN). **Prev S69** — admin **`BgNCjwsG`** · user **`CBvh0vtf`** (Run #308 PE cờ gấp + ngưỡng CCM; chuỗi 4 deploy session: #305 Văn phòng số foundation → #306 re-skin 10 page → #307 Office golive (BE-only) `Wt54PHYl`/`B99fMU6X` → #308 **`BgNCjwsG`**/**`CBvh0vtf`**). **Prev S68** — admin **`CNUv1jxY`** · user **`CpOskeS1`** (S68 — Run #304 `37752eb` fix tên đen→trắng; chuỗi #303 `6983609` `D532XZKG`/`CuFaBoWt` → #304 **`CNUv1jxY`**/**`CpOskeS1`**, cicd PASS each). **Prev S67** — admin `CcrZqfht`/user `DniDFUB_` (S67 — 6 deploy Run #297→#302; admin rotate chuỗi #298`xkSz9BfE`→#300`PxiZQkaw`→#301`I1fpLeYw`→#302**`CcrZqfht`** · user #297`BumgrwCJ`→#300`B36hGoKd`→#301`DrQYkzh0`→#302**`DniDFUB_`**; #299 tests BE-only cả 2 frozen, cicd PASS each). **Prev S65** — admin `BDwV5d0X`/user `DbVv6rsf` (Run #293-295). Prev S62 admin `0xKYGhhf`/user `C81ZdG9G` (Run #286). **Prev S59:** admin `B1DtNT9C` · user `D6uF3Mln` (Run **#282** `792c030` FINAL — bỏ nút Thêm hạng mục; ships kèm `80b64dd` gỡ Điều khoản TT, #281 cancelled-benign ancestor-verified). Chuỗi S59 cùng ngày: #280 `69997da` (`BKy_8OO9`/`XcZ6PRyA`, ships kèm `f21c55d` table-fixed #279-cancelled) · #278 `9c330d2` self-approve+quick-add-NCC (`BSh2fG2X`/`D22KfpPc`, authz probe 4/4) · #277 `faed59f` SearchableSelect (`ex7Tc92G`/`DzUeSk96`) · #276 `c869d26` rename 71 PMH (`BBA0KSWu`/`DzdTI18G`) · #275 `bbd1554` dọn demo WorkItems (FROZEN BE-only) · #274 `0eafcd3` tree 4 tầng (`DuU7OTym`/`DWyeTzf3`) · #273 `56882ac` wipe + tree v1 (`R9uGRxvw`/`DikfX1RD`). Prev S58: Run #386 `3ebaf84` admin `DMm9rtNA`/user `BUkOMn_Y` (chi tiết session log S58). @@ -485,6 +485,18 @@ monthly re-tier mega-line + ef-core SKILL Mig→59 + 3 vocab-fork (2026-07-01 du --- +## ✅ Recently Done (S180–S181 — 2026-08-07, phiên-LOGIC **L12**) + +**Gói adap 7 GĐ (4 thư hub 120KB) — 10/10 wave chạy xong.** S180 đóng W0·W1·W2·W3; **S181** (window-2 qua `/tiep`) đóng phần còn lại. + +- **Chủ dự án chốt 8 câu P1-P8** → `runs/2026-08-07-S180-adap-upgrade-pack-phased/owner-decisions-07-08-2026-dot-2.md`. Ký **2 RC-mark**: `RC-…-07-08-2026-20-57-48` (luật tự-trị 3 bậc) · `RC-…-21-42-10` (niêm phong W6, **khai rõ phạm vi ký**). +- **Vật mới:** `docs/governance/{naming-standard,ritual-labels,expensive-runs-view,so-yeu-cau-chu-du-an}.md` · `adap-reports/{bang-goc 12 TC, bao-cao-cuoi, 2026-08-07-nghi-thuc-hai-dau}.md` · `harness-11-engine` **+PHẦN O/P/Q** · `scripts/{naming-scan,artifact-integrity,tien-kiem-cua,naming-baseline.json}`. +- **Roster 26→28 vai** (+`score-counter` tầng-2, +`score-count-auditor` tầng-3) · `hmw_width.cap` **20→30** đủ 2 mirror ⇒ **slot (75) ĐÓNG**, hết LOUD-skip. +- **Máy vá:** `spawn-model-audit` (trước: **0 lane** thấy trên 5 phiên gần nhất mà vẫn in `TOTAL FLAGS: 0`; sau: **24/24** + mẫu số) · `nhip-no-probe` (+vế `so-yc`, sửa đơn vị đếm LẦN→MỤC) · `artifact-integrity` (+`VANG-DAT` mức cao nhất) · `hmw.js` (hết `undefined` im-lặng). +- 🔬 **Hệ 4 tầng bắt lỗi của tầng-1 ngay lượt đầu:** lead đếm 3 mục, vai `score-counter` đếm **1** — lead đếm theo DÒNG thay vì theo MỤC, tái tạo đúng đáp án luật gọi là SAI. Đã vá sổ (+cột `nhắc-lại-của`) và vá máy. +- 🔴 **Phát hiện đắt nhất (W6/A16):** `naming-scan` + `artifact-integrity` **MỒ CÔI — 0 cửa nghi-thức gọi**; đã wire `session-end §L.b(k-ter)`. +- **Còn mở:** W3b cắm mã thoát (chờ soak ≥1 phiên, **tự tan**) · báo-cáo cuối chờ anh duyệt → gửi hub. Nấc *đã được kiểm chứng* **chỉ hub cấp**. + ## ✅ Recently Done (S177–S179 — 2026-08-06 → 08-07, phiên-LOGIC **L11**) - **S179 (2026-08-07) — vá đội STYLE 2 vòng + H24 + drift-audit tháng** → [`sessions/2026-08-07-1200-S179-doi-style-va-2-vong.md`](changelog/sessions/2026-08-07-1200-S179-doi-style-va-2-vong.md). **0 file code nghiệp-vụ** (toàn governance + comment); build ✅ 2/2 app · test **645/645**. diff --git a/docs/changelog/sessions/2026-08-07-2210-S181-adap-7gd-khep-tron.md b/docs/changelog/sessions/2026-08-07-2210-S181-adap-7gd-khep-tron.md new file mode 100644 index 0000000..11cf6e7 --- /dev/null +++ b/docs/changelog/sessions/2026-08-07-2210-S181-adap-7gd-khep-tron.md @@ -0,0 +1,91 @@ +# S181 — Khép trọn gói adap 7 GĐ (phiên-LOGIC L12, window-2 qua `/tiep`) + +**Ngày:** 2026-08-07 · **Vào phiên:** `/tiep` (nối `session-12` từ S180) · **Lead:** Opus 5 + +--- + +## Arc đóng trong phiên + +Gói adap 7 giai đoạn (4 thư hub, 120KB) — **10/10 wave đã chạy**. S180 đóng W0·W1·W2·W3; S181 đóng phần còn lại. + +| Wave | Kết | +|---|---| +| W3 acceptance | **6/6 ĐÓNG** (phiên sau restart — cửa sổ S180 không có) | +| W4 · W4b | sổ 3 khối + luật chấm điểm 5 khoản bất biến + 2 vai tầng-2/3 | +| W5 · W5b | vá `spawn-model-audit` · D-3/D-10/D-12 · luật truyền nguyên văn ⇒ **D-11 5/5** | +| W3b | phân loại **64/64** cờ; 🔴 **chưa cắm mã thoát** (chờ soak) | +| W6 | bảng gốc 12 TC + RC ký + A16 + cổng đồng-bộ 4 tầng + báo cáo cuối | + +## Quyết định chủ dự án (8 câu) + +P1=PA-2 · P2=PB-2 · P3=B · P4=đẻ vai + cap 30 · P5=nguyên văn · P6=mở INBOUND · P7= vế (i) phán rõ · vế (ii) KHÔNG có phán nội dung (lead thi hành bậc-1 tự-trị, có khai) · P8=gật. +Sổ: `runs/2026-08-07-S180-adap-upgrade-pack-phased/owner-decisions-07-08-2026-dot-2.md`. +2 RC-mark: `RC-…-20-57-48` (luật tự-trị 3 bậc) · `RC-…-21-42-10` (niêm phong W6, **khai rõ phạm vi ký**). + +## 🔬 Ba lần phép đo bắt lỗi của lead — đáng ghi nhất phiên này + +1. **Hệ 4 tầng bắt tầng-1.** Lead đếm **3 mục** lặp≥2; vai `score-counter` (bị CẤM xem số lead) đếm **1**. Lead đếm theo **DÒNG** thay vì theo **MỤC** — tái tạo đúng con số luật gọi là SAI (`4−1`). Lead sập bẫy chính luật mình vừa viết, ở con số **đầu tiên** hệ đó sinh ra. Đã vá sổ (+cột `nhắc-lại-của`) và vá máy dò. +2. **Cổng đồng-bộ bắt lead tự phá dữ liệu.** Lượt cập nhật bảng nấc §1 dùng regex `| N |` khớp **cả bảng §6** ⇒ 5 dòng *"SE làm KHÁC/mạnh hơn"* bị ghi đè. Báo cáo của lead **không thể** thấy; chỉ phép đo độc lập thấy. Đã khôi phục 5/5. +3. **Thước của lead sai trước khi trách máy.** Mutation-test lần đầu ra *"máy soi một chiều"* — nghe hợp lý, đã viết cả đoạn giải thích. Nhưng máy **có** chiều ngược; regex đo thiếu pattern. Sửa thước → **E-9 ĐẠT** (0 → 2 đỏ mới → 0). + +## 🔴 Phát hiện đắt nhất: máy MỒ CÔI + +`naming-scan.ps1` + `artifact-integrity.ps1` — dựng ở W1/W2, chạy đúng, fault-inject có răng — **0 cửa nghi-thức gọi**. Chỉ sống khi người gõ tay ⇒ hết phiên là hết chạy. Phát hiện **chỉ vì** bảng A16 bắt phải có **ba nấc**; thang hai nấc xếp cả hai vào **CÓ**. Đã wire `session-end §L.b(k-ter)`. + +## Đo được + +- `spawn-model-audit`: trước vá **0 lane** thấy trên 5 phiên gần nhất mà vẫn in `TOTAL FLAGS: 0`; sau vá **24/24** + mẫu số + dòng KHAI. +- `artifact-integrity`: **54/88** thư mục là lượt đắt, **4** `VANG-DAT` (mức cao nhất, trước đây trộn trong `VANG`). +- `_index.md`: backfill cột `áp` = **42 áp / 4 chưa / 23 n-a = 69**, 69/69 dòng đúng 12 trường. +- Fault-inject: baseline **6/6** · máy dò sổ **5/5** · A10 **2/2** · ve-6 **2/2** · spawn-audit **2/2** · E-9 **ĐẠT**. +- Roster **26→28** vai · `hmw_width.cap` **20→30** (2 mirror) ⇒ **slot (75) ĐÓNG**, hết LOUD-skip. + +## Khai thẳng + +- Acceptance W4 ô-1 `grep -c '^ST-'` = **0** vì sổ dạng BẢNG (đếm đúng dạng = **2**). **Không bẻ bảng để chiều regex.** +- Lead khai sai *"2 vai mới chỉ ăn từ restart"* — sai, chúng sống ngay. Khối chấm ở 2 cửa thì **vẫn** cần restart. +- Bảng A16: kế hoạch ghi **21** máy, đo ra **23**. Không ép về 21. +- `spec:28` gộp TC-03 sai nhóm — 2 nguồn đọc thư gốc ghi *"chưa đủ mẫu"*. + +## memory-triple + +``` +memory-triple: do=scripts/measure-agent-memory.ps1 · exit 0 +memory-triple: de-xuat=scripts/memory-archive-gate.ps1 DRY · exit 0 +memory-triple: kiem=scripts/mfe-eval.ps1 · exit 0 +memory-triple: do-record=nhip-no 5-vế: light 2/6 deep 15/15 OVERDUE:deep | tran-bo-nho 3 over-cap | run-chua-gom 0 | pull-cach 2 ngay | so-yc treo 1 / nhac2+ 1 +memory-triple: do-record=naming-scan 7/7 xanh · artifact-integrity 29 cờ / 4 VANG-DAT / 33 THIEU-TAP +``` + +## Còn mở + +- **W3b cắm mã thoát** — chờ soak ≥1 phiên (**tự tan**), phân loại đã sẵn. +- **Báo cáo cuối chờ anh duyệt** → gửi hub. Nấc *đã được kiểm chứng* **chỉ hub cấp**. +- 4 câu chờ anh (đánh số ở `HANDOFF`). + +**Push:** `55894a04..5ae60e41` · Phase 3.1 = **N/A** (102 file docs-infra, **0** mã sản phẩm ⇒ CI skip đúng path-filter). + +## §L.c completeness-gate S181 + +``` +completeness-gate S181: vong 3/5 chuc-nang (khong-nhip: V3 trio-memory, V4 nen-ngu) | phep DAT 4 / TRUOT 0 / vacuous 0 +``` + +**5 vòng:** + +| Vòng | Con-ĐO | Con-KIỂM | Bằng chứng | +|---|---|---|---| +| **V1** tooling+harvest | `tooling-auditor` **PASS_WITH_FLAGS 6** · `harvest-curator` **GATE-FAIL 6** | `ring1-audit` **26 ĐẠT / 5 TRƯỢT** | 7 sổ vai + working-tree diff | +| **V2** soi-lead | `lead-stale-auditor` **9 FLAG** · `lead-gap-auditor` **6 FLAG** | `ring2-audit` **14 ĐẠT / 0 TRƯỢT** | 15/15 class ∈ enum ĐÓNG, 0 tự chế | +| **V3** bộ-ba memory | 🔴 **KHÔNG-NHỊP** | — | Phiên vào bằng `/tiep` (bỏ @open); @close không chạy bù vì đã quá tải bookend. **Vết:** `trio: skipped S181 (khong chay bu — bookend qua tai)` | +| **V4** nén-ngủ | 🔴 **KHÔNG-NHỊP** | — | `distill-shard-probe` chưa kêu | +| **V5** sàn "đã-đo" | floor tự soi | — | 3 claim `KHÔNG-CHẤM-ĐƯỢC` của `ring1` + 1 của `ring2` = floor **có** chặn nhãn đã-đo | + +**4 phép sàn — ĐẠT 4 / TRƯỢT 0 / vacuous 0:** + +- **phép-1** `cửa = 1 nhãn + 1 dừng` · counter `55` · `last_ticked_session = S181` — khớp. +- **phép-2** nguyên văn: `NHIP-NO: kiem light 2/6 deep 15/15 OVERDUE:deep | tran-bo-nho 3 over-cap l2idx 0 over | run-chua-gom 0 | pull-cach 2 ngay | so-yc treo 2 / nhac2+ 1 (muc 8, gop 4 dong nhac-lai)` +- **phép-3** 3 kỳ closeout × **4/4 sổ** chạm (`57e672f` · `3a6eb92` · `ff7f655`). +- **phép-4** **9/9** vai đã chạy có entry `S181`; 0 vai 0-byte. + +🔴 **Ba lần thước của LEAD hỏng trong chính lượt gate** (ghi vì cùng một lớp): (1) vòng lặp phép-3 để `C[3]` rỗng ⇒ tụt về root ⇒ `306/4` trông như số thật; (2) sweep `roster 23→28` toàn cục ăn 2 ảnh chụp đóng băng; (3) tin R-2 của `ring1` mà không mở `pause.md` ⇒ chèn khối trùng, phải gỡ. **Cả ba đều đẻ ra kết quả nhìn hợp lệ.** diff --git a/docs/governance/adap-reports/2026-08-07-Governance-nghi-thuc-hai-dau-nhip-thua-va-luu-nguyen-van.md b/docs/governance/adap-reports/2026-08-07-Governance-nghi-thuc-hai-dau-nhip-thua-va-luu-nguyen-van.md new file mode 100644 index 0000000..6a5419c --- /dev/null +++ b/docs/governance/adap-reports/2026-08-07-Governance-nghi-thuc-hai-dau-nhip-thua-va-luu-nguyen-van.md @@ -0,0 +1,40 @@ +# adap-report — `2026-08-07-Governance-nghi-thuc-hai-dau-nhip-thua-va-luu-nguyen-van` + +**1. id-broadcast:** `2026-08-07-Governance-nghi-thuc-hai-dau-nhip-thua-va-luu-nguyen-van` +**2. nấc (G-011):** **executed** — 🔴 KHÔNG phải *verified* (nấc đó chỉ hub cấp). +**3. ngày áp:** 2026-08-07 (S181) + +## 4. Áp gì — từng khoản + +| Sàn hub | SE làm | Vật chứng | +|---|---|---| +| **Tách 2 đại lượng**: *độ đầy đủ khi chạy* (đội, có cổng máy) ⟂ *tần suất* (chủ dự án, KHÔNG cổng, **KHÔNG tích nợ**) | Viết thành **bảng 2 dòng riêng** ở CẢ HAI cửa phiên — đúng lời hub *"để chung một câu thì ai đó sẽ đọc gộp"* | `session-start.md §2.1.10` · `session-end.md §L.b(k-bis)` | +| **Nhãn miễn tội cho dời lịch phải kèm điều kiện 3** (*không phân biệt được dời-có-chủ-ý với rơi-im-lặng ⇒ khai "không đủ dữ liệu", CẤM mặc định về nhãn miễn tội*) | 🔴 **CHƯA GHÉP** — chủ dự án gật P5 là gật **3 bậc**, chưa gật phần ghép này. Để **con trỏ**, không tự adopt | `ACTIVE-MARKS §LT3` mục 🔸 cuối | +| **Lưu nguyên văn output từng con audit** | Đã có sẵn từ H22 (per-agent file trên đĩa). Bổ sung @S181: luật **truyền nguyên văn ở lane DISPATCH** (rào `> anh:` + đi nguyên khối + khai thiếu) | `harness-11-engine §O.3` | +| **Máy kiểm KHÔNG được chấm khoảng-không-nghi-thức thành "quên"** | Ghi vào TC-06 của bảng gốc: drift-audit trễ 6 ngày **không** còn đọc là lỗi tần suất | `adap-reports/upgrade-pack-phased-bang-goc.md` TC-06 | + +## 5. Tailored gì · skip gì · vì sao + +- **Tailored:** hub thêm *"nhãn thứ năm"* vào bộ nhãn con-audit-nghi-thức của họ. SE **KHÔNG** thêm nhãn — vì cùng phiên chủ dự án chốt **P3 = B (tập tín hiệu ĐÓNG)**, niêm phong `lead_self_audit.flag_classes`. Hai quyết định này **kéo ngược chiều nhau**, và quyết định của chủ dự án SE thắng trong kho SE. + 🔸 **Nguyên tắc thì SE vẫn lấy:** *nhãn mới phải kèm điều kiện máy kiểm được + một vai soi CHIỀU NGƯỢC*. Nó được dùng làm lý lẽ cho đường thứ ba ở `harness-11-engine PHẦN Q`. +- **Skip:** điều kiện 3 ghép vào bậc-2 — chờ chủ dự án phán riêng (xem mục 4). + +## 6. 🔴 Lời nhờ khác thường của hub — ĐÃ LÀM + +Hub xin: *"nếu bạn thấy hợp thì **ghi nó xuống chỗ tồn tại được** — một dòng trong sổ, một mục trong bộ nhớ đội, một hàng trong tài liệu quản trị. **Không phải một câu 'đã nhận'.**"* + +Lý do hub nêu: ở kho họ các con audit **đã chạy đủ, đã sinh đủ báo cáo, cổng máy đã báo xanh** — nhưng **không ghi lại được gì, suốt bốn phiên, mà không ai biết**. + +⇒ **SE đã ghi xuống 4 chỗ tồn tại được** (không phải một câu xác nhận): +1. `session-start.md §2.1.10` — bảng 2 đại lượng +2. `session-end.md §L.b(k-bis)` — bảng 2 đại lượng, cửa đối xứng +3. `ACTIVE-MARKS §LT3` — con trỏ tới điều kiện 3 +4. Tệp này + +## 7. Phản biện gửi ngược hub + +**Kho SE vừa gặp đúng lớp lỗi hub kể, ở dạng khác — và xin báo lại vì nó bổ sung một biến thể:** + +Ở SE không phải *"audit chạy mà không ghi được gì"*, mà là **"máy dựng xong, chạy đúng, mà KHÔNG CỬA NÀO GỌI"** — `naming-scan.ps1` + `artifact-integrity.ps1` có **0 cửa nghi-thức gọi**, chỉ sống khi người gõ tay. Phát hiện được **chỉ vì** bảng máy⟂tay của khoản A16 bắt phải có **ba nấc**; thang hai nấc (*"có máy / không có máy"*) xếp cả hai vào **CÓ**. + +⇒ **Đề xuất cho hub:** cạnh câu *"đã chạy nhưng không ghi lại được"*, thêm biến thể *"đã dựng nhưng không ai gọi"*. Cùng gốc — **cổng báo xanh trên một phạm vi mà không ai đo** — nhưng lộ ra ở chỗ khác và cần phép đo khác (đếm cửa gọi, không đếm sự tồn tại của máy). diff --git a/docs/governance/adap-reports/upgrade-pack-phased-bang-goc.md b/docs/governance/adap-reports/upgrade-pack-phased-bang-goc.md index 41c0806..bc1a333 100644 --- a/docs/governance/adap-reports/upgrade-pack-phased-bang-goc.md +++ b/docs/governance/adap-reports/upgrade-pack-phased-bang-goc.md @@ -18,7 +18,7 @@ |---|---|---|---|---| | TC-01 | nhắc nhiều lần mới làm | **CÓ.** Số nay **ĐO ĐƯỢC** — sổ dựng @W4: **1 mục** lặp ≥2 / 3 mục gốc (6 dòng, gộp 3 dòng nhắc-lại) | `powershell -File scripts/nhip-no-probe.ps1` → vế `so-yc` | 2026-08-07 | | TC-02 | cho làm thẳng vẫn hỏi | 🔴 **GIỮ CHỮ HUB: *chưa có dụng cụ*.** SE cũng **0 phép đếm** — không nặn số | — (không có dụng cụ ở cả hai phía) | 2026-08-07 | -| TC-03 | model mạnh hiểu đúng hơn | 🔴 **GIỮ CHỮ HUB: *chưa đủ mẫu*.** Phía SE = **`không áp dụng` CÓ KHAI**: SE không dùng model thường ở bất kỳ chỗ ngồi nào | `grep -c 'model: opus' .claude/agents/*.md` = **26/26**; control âm: liệt mọi giá trị `model:` chỉ ra **1** dòng | 2026-08-07 | +| TC-03 | model mạnh hiểu đúng hơn | 🔴 **GIỮ CHỮ HUB: *chưa đủ mẫu*.** Phía SE = **`không áp dụng` CÓ KHAI**: SE không dùng model thường ở bất kỳ chỗ ngồi nào | `grep -l '^model: opus' .claude/agents/*.md` = **28/28** · `grep -l '^effort: max'` = **28/28**; control âm: liệt mọi giá trị `model:` chỉ ra **1** dòng. 🔴 **Số cũ ghi "26/26" là SAI** — đó là roster TRƯỚC khi W4b thêm 2 vai, và nó **khẳng định phủ đủ** trong khi 2 vai mới thiếu `effort: max`. Bắt được nhờ **mẩu garble** của `tooling-auditor` (#53), đã vá cả persona lẫn số | 2026-08-07 | | TC-04 | vật chứng lượt đắt sót | **CÓ — nặng nhất.** Lưới đã dựng và đang trả lãi; sổ khung-nhìn lượt đắt land @W5b vế (i): **8** run-folder có dấu lượt đắt / **88** tổng | `grep -rl 'fable-real\|fable-clone' .claude/workflows/runs/*/run.md \| wc -l` | 2026-08-07 | | TC-05 | vai soi ghi-đĩa cấm-sửa | **CÓ nhu cầu, đã có ~70%** — cặp quan sát `harvest-curator` + `tooling-auditor`, propose-only; backstop THẬT = git-diff commit-gate, KHÔNG dựa thiếu-tool | `ls .claude/agents/{harvest-curator,tooling-auditor}.md` | 2026-08-07 | | TC-06 | nghi thức tự-ý-bỏ | **CÓ — đo được, và SE tự khai:** drift-audit trễ **6 ngày** so hạn 08-01 (`CLAUDE.md`). 🔸 Thư hub 2026-08-07 tách lại trục này: **tần suất = quyền chủ dự án, KHÔNG tích nợ**; chỉ *độ đầy đủ khi chạy* mới là lỗi | `grep -n 'ĐÃ CHẠY 2026-08-07' CLAUDE.md` | 2026-08-07 | diff --git a/docs/governance/adap-reports/upgrade-pack-phased-bao-cao-cuoi.md b/docs/governance/adap-reports/upgrade-pack-phased-bao-cao-cuoi.md index 8862bc7..e9ccb61 100644 --- a/docs/governance/adap-reports/upgrade-pack-phased-bao-cao-cuoi.md +++ b/docs/governance/adap-reports/upgrade-pack-phased-bao-cao-cuoi.md @@ -70,7 +70,7 @@ Việc SE làm **ngoài** phạm vi kế hoạch. Khai đủ, không gộp: 1. **Phạm vi nhận:** 7 GĐ, 12 TC, 20 khoản danh mục kiểm. Quyết định per-GĐ ở `fitmap` (7/7 ô điền). 2. **Nấc tự khai:** **đã thi công** cho 7/7 GĐ. 🔴 **KHÔNG** khai *đã được kiểm chứng* ở bất kỳ đâu. 3. **Wave:** 10 wave, **10 đã chạy**. Còn 1 cổng chờ soak + 2 khoản W6 (cổng đồng bộ = phần A này · báo cáo = tệp này). -4. **Quyết định chủ dự án:** P1=PA-2 · P2=PB-2 · P3=B · P4=đẻ vai + cap 30 · P5=nguyên văn · P6=mở INBOUND · P7=cả 2 vế · P8=gật. Sổ: `owner-decisions-07-08-2026-dot-2.md`. +4. **Quyết định chủ dự án:** P1=PA-2 · P2=PB-2 · P3=B · P4=đẻ vai + cap 30 · P5=nguyên văn · P6=mở INBOUND · P7= vế (i) phán rõ · **vế (ii) KHÔNG có phán nội dung, lead thi hành theo bậc-1 tự-trị có khai** (xem `§O.3`) · P8=gật. Sổ: `owner-decisions-07-08-2026-dot-2.md`. 5. **Máy dựng mới:** `naming-scan` · `artifact-integrity` · `tien-kiem-cua` · `naming-baseline.json`; máy vá: `spawn-model-audit` · `nhip-no-probe` · `hmw.js`. 6. **Làm KHÁC / MẠNH HƠN sàn:** 5 khoản, xem `tracking §6`. 7. **Fault-inject:** baseline **6/6** · máy dò sổ **5/5** · A10 **2/2** · ve-6 **2/2** · spawn-audit **2/2** · mutation-test E-9 **ĐẠT**. diff --git a/docs/governance/adap-upgrade-pack-tracking.md b/docs/governance/adap-upgrade-pack-tracking.md index 7298be6..1b81804 100644 --- a/docs/governance/adap-upgrade-pack-tracking.md +++ b/docs/governance/adap-upgrade-pack-tracking.md @@ -40,19 +40,19 @@ Cột "Thuộc GĐ" lấy đúng nhãn giai đoạn mà hub gắn trong Phần C | A0-2 | GĐ-0 | đã thi công | W0 | Chính là tệp này. Bằng chứng chạy được: `grep -c '^| A' docs/governance/adap-upgrade-pack-tracking.md` phải ra **20**, khớp số khoản của danh mục kiểm. | | A0-3 | GĐ-0 | đã đồng ý | W0 | Chủ dự án đã chốt câu P6 theo đường mở phạm vi INBOUND cho cả thư phát đại trà, cộng thêm chứ không gỡ 22 dòng đang sống. Đo đĩa đúng lúc viết dòng này, ngày 2026-08-07: `grep -c "upgrade-pack-phased" broadcasts/_index.md` ra **0**; control dương `grep -c "harness-22"` ra **3** và `grep -cE "^\| "` ra **94**, nên im lặng là im lặng thật chứ không phải thước hỏng. Lane b đang thi công phần bù dòng; người đọc sau phải **đo lại**, đừng tin con số trong dòng này. Lỗ thật rộng hơn gói này: 24 lá thư trong hộp thư chưa có dòng trong sổ, trên mẫu số 69 lá trên đĩa. | | A0-4 | GĐ-0 | đã thi công | W0 | `docs/governance/adap-upgrade-pack-fitmap.md`. Bằng chứng chạy được: `grep -c '^| GĐ-[0-6]' docs/governance/adap-upgrade-pack-fitmap.md` ra **7**; chạy đúng lệnh đó trên tệp khuôn của hub ra **14**, đây là control dương cho chính cái bẫy mẫu số mà hub cảnh báo. Bảy ô quyết định đều mang đúng một trong ba giá trị, đếm lại bằng awk ra 7 trên 7, không ô nào trống. | -| A1 | GĐ-4 | đã đồng ý | W4 | Sổ ba khối chưa tồn tại: khối lời-phàn-nàn trống tuyệt đối, đo bằng phép tìm `sở-thích` và `phàn nàn` ra 0 hit với control dương là cụm "điểm dừng" ra 5 tệp. Câu P2 đã chốt phương án PB-2, tức tách sổ yêu cầu khỏi WAL, nên khoản lên *đã đồng ý*. Nợ kèm theo P2: phải sửa luật đã ratify ở `tiep.md:181`. Ràng buộc chống bẫy: cột lời nguyên văn chỉ nhận chữ chủ dự án gõ từ thời điểm dựng sổ; dữ liệu cũ đi phụ lục riêng. | -| A2 | GĐ-4 | đã đồng ý | W4 | Kỷ luật ghi ngay, cắm vào tệp luôn được nạp mỗi lượt, và cấm cắm vào tệp lệnh của một cửa. Chỗ cắm hợp lệ đã tồn tại ở SE là `CLAUDE.md`; luật thì chưa có. CHƯA ĐO — cần đo SE có cắm luật ghi-ngay vào bề mặt tự động nạp hay không, lệnh: `grep -n "ghi ngay\|ghi NGAY" CLAUDE.md .claude/auto-memory/MEMORY.md` kèm control dương là một cụm chắc chắn có trong hai tệp đó. | -| A3 | GĐ-4 | đã đồng ý | W4 | Tra sổ trước khi hỏi, phải tìm được ở tối thiểu hai chỗ. Hiện chưa có: phép tìm cụm "viện dẫn" trong kho auto-memory ra 0 hit, control dương là cụm "How to apply" ra 48 trên 61 tệp. Wave W4 cắm vào `CLAUDE.md` và `docs/rules.md` cho đủ hai chỗ. | +| A1 | GĐ-4 | đã đồng ý | W4 | ✅ **ĐÃ LAND @W4/S181** — `docs/governance/so-yeu-cau-chu-du-an.md` (8.315 B, đủ 3 khối). 🧊 *Câu cũ:* "Sổ ba khối chưa tồn tại:" khối lời-phàn-nàn trống tuyệt đối, đo bằng phép tìm `sở-thích` và `phàn nàn` ra 0 hit với control dương là cụm "điểm dừng" ra 5 tệp. Câu P2 đã chốt phương án PB-2, tức tách sổ yêu cầu khỏi WAL, nên khoản lên *đã đồng ý*. Nợ kèm theo P2: phải sửa luật đã ratify ở `tiep.md:181`. Ràng buộc chống bẫy: cột lời nguyên văn chỉ nhận chữ chủ dự án gõ từ thời điểm dựng sổ; dữ liệu cũ đi phụ lục riêng. | +| A2 | GĐ-4 | đã đồng ý | W4 | Kỷ luật ghi ngay, cắm vào tệp luôn được nạp mỗi lượt, và cấm cắm vào tệp lệnh của một cửa. ✅ **ĐÃ CẮM @W4/S181** — `CLAUDE.md` §Sổ yêu-cầu (`grep -c -i "ghi ngay"` = **2**) + `docs/rules.md §6.0`. 🧊 *Câu cũ: "luật thì chưa có. CHƯA ĐO"* — cần đo SE có cắm luật ghi-ngay vào bề mặt tự động nạp hay không, lệnh: `grep -n "ghi ngay\|ghi NGAY" CLAUDE.md .claude/auto-memory/MEMORY.md` kèm control dương là một cụm chắc chắn có trong hai tệp đó. | +| A3 | GĐ-4 | đã đồng ý | W4 | Tra sổ trước khi hỏi, phải tìm được ở tối thiểu hai chỗ. ✅ **ĐÃ ĐỦ HAI CHỖ @W4/S181** — `grep -c "viện dẫn"`: `CLAUDE.md` = **1** · `docs/rules.md` = **1**. 🧊 *Câu cũ: "Hiện chưa có; auto-memory 0 hit"*, control dương là cụm "How to apply" ra 48 trên 61 tệp. Wave W4 cắm vào `CLAUDE.md` và `docs/rules.md` cho đủ hai chỗ. | | A4 | GĐ-4 | **đã thi công** | W3 và W4 | Đèn nợ ở **mọi** điểm dừng, liệt từng cửa chứ không ghi gộp. ✅ **Bảng 19 cửa ĐÃ DỰNG @W3**, liệt từng dòng, sống ở [`sub-w3-nghi-thuc.md` §1.2](../../.claude/workflows/runs/2026-08-07-S180-adap-upgrade-pack-phased/sub-w3-nghi-thuc.md) — số đo tại đó: **5/19** có tiền kiểm trước W3 (không phải 4/19 như bản trước ghi; chênh vì `snapshot` đóng từ 🟡 sang CÓ), **9/19** sau W3. ✅ **Hai số liệu ĐÃ NỐI vào máy dò @W4**: `nhip-no-probe.ps1` in vế `so-yc treo / nhac2+ `. ✅ **Nợ nặng nhất của khoản này ĐÃ TRẢ**: máy nay **phân biệt** `chua-co-du-lieu` (sổ vắng/rỗng ⇒ phép đo không tồn tại) với `treo 0` (đã đọc n dòng, đếm ra 0) bằng **hai chuỗi khác nhau** — fault-inject 5/5 @S181. Đó đúng là "đèn xanh giả" mà hub gọi tên. 🧊 *Bản trước dòng này viết cả ba vế ở thì tương lai và sống nguyên 1 wave sau khi đã xong — site thứ 2 của cùng một mệnh lệnh cũ, bắt @S181 bằng grep lại với lệnh khác.* | -| A5 | GĐ-4 | đã đồng ý | W4 | Định nghĩa thành văn cho "hỏi lại không kèm thông tin mới". Nội dung sàn đã rõ: hỏi lại mà không viện dẫn được thông tin mới là vi phạm; hỏi lại kèm nguồn trích được là kỷ luật đúng. SE chưa có văn bản nào chứa định nghĩa này. | -| A6 | GĐ-4 | đã đồng ý | W4 | Lằn ranh đỏ phải **liệt kê từng loại**, cấm mô tả bằng tính từ. Nguyên liệu ở SE có nhưng nằm rải trong 61 tệp auto-memory, chưa gom về một chỗ. Wave W4 dựng mục mồi ST-001 liệt bảy loại: đổi lược đồ dữ liệu, xoá dữ liệu, việc hướng ra ngoài, việc không lùi được, việc dính tiền, đổi cơ chế quản trị, đổi số nhịp hoặc ngân sách. | +| A5 | GĐ-4 | đã đồng ý | W4 | Định nghĩa thành văn cho "hỏi lại không kèm thông tin mới". Nội dung sàn đã rõ: hỏi lại mà không viện dẫn được thông tin mới là vi phạm; hỏi lại kèm nguồn trích được là kỷ luật đúng. ✅ **ĐÃ THÀNH VĂN @W4/S181** — `CLAUDE.md` §Sổ yêu-cầu chứa nguyên chuỗi "Định nghĩa A5". 🧊 *Câu cũ: "SE chưa có văn bản nào chứa định nghĩa này."* | +| A6 | GĐ-4 | đã đồng ý | W4 | Lằn ranh đỏ phải **liệt kê từng loại**, cấm mô tả bằng tính từ. ✅ **ĐÃ GOM @W4/S181** — `so-yeu-cau-chu-du-an.md` `ST-001` liệt **đúng 7 loại**, cấm tính từ. 🧊 *Câu cũ: "nằm rải 61 tệp auto-memory, chưa gom"* Wave W4 dựng mục mồi ST-001 liệt bảy loại: đổi lược đồ dữ liệu, xoá dữ liệu, việc hướng ra ngoài, việc không lùi được, việc dính tiền, đổi cơ chế quản trị, đổi số nhịp hoặc ngân sách. | | A7 | GĐ-4 | đã nhận | W4b | Chấm điểm trải nghiệm phải tách hẳn khỏi phép đo kỹ thuật, và công thức trừ theo MỤC chứ không theo lần. SE hiện **vắng hoàn toàn**: phép tìm cụm "chấm điểm" ra 0 hit với control dương 3 tệp. Giữ ở nấc *đã nhận* vì việc in khối chấm ở hai cửa phiên còn **chờ câu P8** — nghi thức hai đầu phiên là vật chủ dự án đã chốt. | | A8 | GĐ-4 | đã đồng ý | W4b | Ba tầng đếm: người điều phối tự chấm, một vai khác đếm lại độc lập, một vai thứ ba kiểm phép đếm mà cấm chấm lại. Câu P4 đã cho phép đẻ vai mới và nâng trần bề rộng từ 20 lên 30, nên khoản lên *đã đồng ý*. Hai món nợ đi kèm, không được quên: vai mới phải được seed đường cơ sở `measured{}` kẻo thành vai mù; và **tỉ lệ phủ sóng CHƯA ĐO** — chưa có tỉ lệ đó thì luật của hub bắt in "KHÔNG ĐO ĐƯỢC" và **cấm in điểm**. | | A9 | GĐ-4 | đã nhận | W4b | Niêm phong bằng im lặng chỉ hợp lệ khi đủ ba mốc thời gian: lúc phát điểm, lúc hiển thị lại ở cửa chủ dự án chắc chắn đọc, và tin đầu tiên của chủ dự án sau lần hiển thị lại. Thiếu mốc ba thì trạng thái là *chờ niêm phong*, không phải *đã niêm phong*. Chưa ai chạm khoản này. Giữ nấc *đã nhận* vì nó nằm trong khối chấm điểm đang chờ câu P8. | | A10 | GĐ-4 | đã nhận | W4b | Khoản này có hai vế. Vế phép thử SE đã có máy thật: đẩy một nhãn lớp lỗi lạ vào máy cảnh báo thì `h24-signal-write.ps1` từ chối với mã thoát 2 và thông điệp rằng một vai giám sát không được tự chế lớp. Vế quy trình, tức khi chủ dự án điều chỉnh điểm thì xác định tầng nào sai rồi ghi vào nhật ký của vai đã sai, thì chưa thành văn. Giữ nấc *đã nhận* vì **chờ câu P3**: hub đòi tập tín hiệu phải từ chối lớp mới, còn SE đang cố ý mở tập đó theo tiền lệ chủ dự án ở phiên S143. Đây là xung đột triết lý thứ hai của cả gói. | | A11 | xuyên GĐ | đã đồng ý | mọi wave | Mọi con số trong văn xuôi phải neo nguồn, không neo được thì bỏ số và viết định tính. Bằng chứng áp trong wave W0: mọi tỉ lệ trong bản đồ áp dụng đều kèm mẫu số và kèm con trỏ nguồn. Chưa lên *đã thi công* vì nghiệm thu của khoản này gắn với bản báo cáo gửi hub, mà báo cáo chưa tồn tại. | | A12 | xuyên GĐ | đã đồng ý | mọi wave | Liệt kê từng mục, cấm nén thành khoảng. Bằng chứng áp trong wave W0: ô lý do của dòng GĐ-0 liệt đủ chín mã khoản thiếu và ba mã khoản sai khuôn thay vì viết một khoảng; bảng ở mục 2 của tệp này liệt đủ hai mươi dòng. Danh sách rỗng thì phải ghi thẳng là danh sách rỗng, không bỏ trống. | -| A13 | xuyên GĐ | đã đồng ý | mọi wave | Mỗi khoản đánh dấu không-áp-dụng phải kèm lý do cụ thể. Ca duy nhất hiện có là TC-03 trong giai đoạn 5, và lý do của nó là một phép đo chạy lại được: 26 trên 26 persona pin `model: opus`, mẫu số là 27 tệp trong `.claude/agents/` trừ `README.md`, control âm là phép liệt kê mọi giá trị của trường `model:` chỉ trả về đúng một dòng. | +| A13 | xuyên GĐ | đã đồng ý | mọi wave | Mỗi khoản đánh dấu không-áp-dụng phải kèm lý do cụ thể. Ca duy nhất hiện có là TC-03 trong giai đoạn 5, và lý do của nó là một phép đo chạy lại được: **28/28** persona pin `model: opus` **và 28/28** pin `effort: max`; mẫu số = **29 tệp** trừ `README.md` = **28** *(🧊 "26/26 · mẫu số 27" là ảnh chụp TRƯỚC khi 2 vai W4b land)*, control âm là phép liệt kê mọi giá trị của trường `model:` chỉ trả về đúng một dòng. | | A14 | xuyên GĐ | đã đồng ý | mọi wave | Chỗ chưa biết thì ghi "chưa đo được", không ghi "xong". Hub tự nhận đây là lớp lỗi đắt nhất của cả năm. Bằng chứng áp trong wave W0: mọi ô chưa đo trong tệp này đều mang chữ CHƯA ĐO kèm lệnh cần chạy, và mục 3 dưới đây gom lại thành danh sách. | | A15 | xuyên GĐ | đã thi công | W0 | Ba nấc *đã đồng ý*, *đã thi công*, *đã được kiểm chứng* là ba thứ khác nhau; nấc phải khai theo từng giai đoạn. Trước wave này chưa ai khai nấc theo từng giai đoạn cho gói. Bằng chứng chạy được: bảng bảy dòng ở mục 1 của tệp này, mỗi giai đoạn một nấc riêng, kèm luật cấm tự khai nấc cuối. | | A16 | xuyên GĐ | đã đồng ý | W6 | Với mỗi cưỡng chế tuyên là đã có, phải ghi rõ nó chạy bằng máy hay bằng tay. Phát hiện của SE làm khoản này chặt hơn chữ hub: thang hai nấc máy-hoặc-tay là thang hỏng, phải tách ba nấc, vì SE có đúng **1** máy tự bắn thật, 17 máy chỉ chạy khi một nghi thức gọi tới, và 3 script mồ côi. Phép kiểm kê máy của chính SE cũng đang chạy bằng trí nhớ: danh sách "máy đã biết" liệt 14 trong khi đĩa có 21, thiếu 7. Bảng A16 hợp nhất chưa có, dựng ở wave W6. | @@ -109,7 +109,7 @@ grep -c 'đã được kiểm chứng *|' docs/governance/adap-upgrade-pack-trac > Khoản A16 đòi phân biệt **máy tự chạy** với **người gõ tay**, và cảnh báo **thang 2 nấc là thang HỎNG** (lane F §1.1): gộp *"có máy"* với *"máy tự fire"* làm một thì một máy mồ côi vẫn được tính là đã tự động hoá. -**Mẫu số: 23 máy governance** *(không tính script sản phẩm: deploy · backup · migrate · install · convert · deps-audit · plan-* · parse_* · setup-* · rename-*)*. +**Mẫu số: 23 script governance + 1 hook = 24 máy** *(không tính script sản phẩm: deploy · backup · migrate · install · convert · deps-audit · plan-* · parse_* · setup-* · rename-*)*. 🔸 **Số này ≠ 21 mà `wave-plan` ghi.** 21 là ảnh chụp **trước** khi `tien-kiem-cua.ps1` land (W3) và trước đợt đo lại @S181. Đo lại bằng lệnh ở cuối mục. **Không ép số về 21 cho khớp kế hoạch.** ### M1 — hook, fire ở turn-boundary (1) @@ -118,7 +118,7 @@ grep -c 'đã được kiểm chứng *|' docs/governance/adap-upgrade-pack-trac |---|---|---| | `.claude/hooks/wal-flush.ps1` | ✅ **CÓ** — Stop-hook, mọi turn-boundary | `.claude/settings.json` khối `hooks` | -### M2 — máy được CỬA NGHI-THỨC gọi (18) +### M2 — máy được CỬA NGHI-THỨC gọi (20) | Máy | Số cửa gọi | Máy | Số cửa gọi | |---|---|---|---| @@ -134,15 +134,16 @@ grep -c 'đã được kiểm chứng *|' docs/governance/adap-upgrade-pack-trac 🔸 **"Được cửa gọi" ≠ "fire vô điều kiện".** Nhiều máy nằm sau cổng nhịp hoặc cổng OVERDUE. Nấc này chỉ khai *có đường ghi tự động*, không khai *chạy mỗi phiên*. -### M3 — MỒ CÔI: có máy, KHÔNG cửa nào gọi (4) +### M3 — MỒ CÔI: có máy, KHÔNG cửa nào gọi (3 — sau khi wire 2 máy) | Máy | Trạng thái @S181 | |---|---| -| `naming-scan.ps1` | 🔴 **mồ côi khi đo** → ✅ **ĐÃ WIRE** vào `session-end §L.b(k-ter)` cùng lượt | -| `artifact-integrity.ps1` | 🔴 **mồ côi khi đo** → ✅ **ĐÃ WIRE** cùng chỗ | +| `seed-test-users-prod.ps1` | 🔴 **MỒ CÔI, mới lộ @S181** — 0 cửa gọi, và **lọt bộ-lọc loại-trừ** ở đầu §7 (`seed-*` không có trong danh sách) ⇒ theo chính luật của tệp này nó **phải** có mặt. Bản đầu bảng M3 thiếu dòng này | | `wal-recovery-test.ps1` | 🔴 **CÒN mồ côi** — máy kiểm thử phục hồi WAL, đúng bản chất là chạy tay khi nghi ngờ. Giữ mồ côi **CÓ KHAI** | | `session_scaffold.py` | 🔴 **CÒN mồ côi** — nghi trùng với `session-scaffold.ps1` (đang được gọi). **Chưa xác minh**, không xoá theo phỏng đoán | +🔸 **`naming-scan.ps1` + `artifact-integrity.ps1` ĐÃ CHUYỂN SANG M2** (wire `session-end §L.b(k-ter)` cùng lượt) — giữ tên ở đây sẽ thành *"số máy TỪNG mồ côi"* ⟂ *"số máy ĐANG mồ côi"*, đúng lớp lỗi mà bảng ba nấc sinh ra để chặn. + 🔴 **Đây là phát hiện đắt nhất của W6.** Hai máy W1/W2 vừa dựng xong, chạy đúng, fault-inject có răng — **mà không cửa nào gọi**. Chúng chỉ sống khi có người gõ tay, nên hết phiên là hết chạy. Thang 2 nấc (*"có máy / không có máy"*) sẽ xếp chúng vào **CÓ** và ta yên tâm nhầm; đúng thứ A16 dựng nấc thứ ba để bắt. ### Lệnh đo lại (đừng tin bảng, chạy lại) diff --git a/docs/governance/error-ledger.md b/docs/governance/error-ledger.md index dd5f36b..79ec48c 100644 --- a/docs/governance/error-ledger.md +++ b/docs/governance/error-ledger.md @@ -231,3 +231,17 @@ Detect by **action-signature** (NOT "AI tự phán có vi phạm không"). Scan --- > **Maintenance:** append RCA on each AS-hit; promote a guard to `procedural` on its 2nd strike; mark `verified` once it holds through a session; retire by net-effect. Pointer entries only — full narrative lives in session-logs (summary-index). + +## RCA `C1-S181` — phá đóng-băng bề-mặt-đo ở cửa closeout (2026-08-07) + +**Sự cố:** lead chạy khối đo `§L.b(c)` → spawn 4 vai bookend → rồi **ghi `docs/STATUS.md` (23:03:35) và `docs/HANDOFF.md` (23:03:56) trong lúc 4 vai đang đo**. `§L.b(c)` liệt **đích danh** hai tệp này vào bề-mặt-đo bị đóng băng *"từ script đo đầu tiên tới verdict cuối"*. + +**Bằng chứng không dựa mtime:** `lead-gap-auditor` đo lần đầu ra **285 lần / 54 slug**, đo lại 23:04:55 ra **287 / 56** — bề-mặt-đo **dịch chuyển giữa hai phép đo của cùng một vai, trong cùng một lượt audit**. + +**Hệ quả đo được:** FLAG-1 của vai gap **suýt thành dương-giả** (segment carry chưa tồn tại lúc đo lần đầu); FLAG-4/FLAG-5 phải đo lại từ đầu; `lead-stale-auditor` phải tự hạ FLAG-7 và khai *"không re-đo toàn bộ trên bản mới"*. ⇒ **vai đo mất quyền nói mình đo cái gì** — hỏng thước, không phải phiền nhiễu. + +**5-why → gốc:** luật C1 tồn tại từ S138, viết bởi người đã cân nhắc **từng tệp** (WAL được nêu làm ngoại lệ có chủ đích). Nhưng **0 cổng máy nào chặn ghi trong cửa-sổ đo** ⇒ luật chỉ sống bằng trí nhớ của lead. 🔴 Đây **đúng hình dạng** *"guard dựng xong, 0 cửa gọi"* mà chính phiên này vừa ghi vào `feedback_guard_built_but_never_called.md` — chỉ khác: ở đây guard **chưa từng được dựng thành máy**. + +**Fix (2 vế, lỗi kép):** (a) *vá hành-vi* — closeout sau: mọi ghi vào bề-mặt-đo **xếp hàng SAU verdict**, kể cả Phase 2. (b) *vá guard* — 🔴 **CHƯA LÀM, ghi thành nợ:** cần một máy chặn/cảnh báo khi bề-mặt-đo bị chạm giữa cửa-sổ đo. Không có nó thì lần sau lại phụ thuộc trí nhớ. + +**Lần thứ 2:** S179 đã có 2 FLAG *"tự khỏi"* vì HANDOFF land sau lúc vai đo — lần đó đọc thành *"vai đo bản trước"*. Hai lượt ⇒ đủ để có sổ. diff --git a/docs/governance/harness-11-engine.md b/docs/governance/harness-11-engine.md index c97d1d2..c5a5495 100644 --- a/docs/governance/harness-11-engine.md +++ b/docs/governance/harness-11-engine.md @@ -471,7 +471,8 @@ Gói ngữ-cảnh chuẩn (D-11) gồm **5 mảnh**. Mảnh nào chưa có ⇒ g ### O.3 — P7 vế (ii): LUẬT TRUYỀN NGUYÊN VĂN ở lane DISPATCH -> Chủ dự án phán @S181. 🔴 Đây là kỷ luật của **LEAD khi phát lệnh**, không phải yêu cầu chủ dự án đổi cách gõ. +> 🔴 **NẤC CHÍNH XÁC CỦA THẨM QUYỀN (hạ chữ @S181 sau khi `lead-stale-auditor` FLAG-1 bắt):** chủ dự án **KHÔNG phán riêng về nội dung vế (ii)**. Lead nêu *"P7(ii) là thứ duy nhất còn thực sự chặn"*, anh đáp **"OK làm hết rồi khép trọn đi"** — đó là **uỷ quyền chạy nốt**, KHÔNG phải phán nội dung. Lead thi hành theo **bậc-1 luật tự-trị** (rõ, không phá huỷ, đảo ngược được) và **khai đúng nấc ở đây**. ⚠️ Bản đầu viết *"Chủ dự án phán @S181"* — **tự mở rộng thẩm quyền**, đúng ảnh phản chiếu của lỗi *tự thu-hẹp* @S179. Anh bác thì gỡ §O.3, 1 lượt. +> 🔸 Đây là kỷ luật của **LEAD khi phát lệnh**, không phải yêu cầu chủ dự án đổi cách gõ. **Ba khoản, bắt buộc cả ba:** diff --git a/docs/governance/so-yeu-cau-chu-du-an.md b/docs/governance/so-yeu-cau-chu-du-an.md index bec49a8..76c8585 100644 --- a/docs/governance/so-yeu-cau-chu-du-an.md +++ b/docs/governance/so-yeu-cau-chu-du-an.md @@ -37,6 +37,12 @@ Dữ-liệu cũ (WAL · HANDOFF · auto-memory · migration-todos) **KHÔNG** đ | `YC-004` | "làm tiếp đi nhé, nãy tao nói dry-run tức chạy hết cái plan adapt ở turn trước chứ ko phải dry-run cái này" | 2026-08-07 · S181 | đóng | — | `WAL` chain "THI HÀNH 5/6 khoản đợt-2" | Đính chính lần 1 | **`YC-002`** | | `YC-005` | "làm xong thì chậy hết cái plan adapt nhé" | 2026-08-07 · S181 | đóng | — | cùng trên | Đính chính lần 2 | **`YC-002`** | | `YC-006` | "làm cho hết đi nhé" | 2026-08-07 · S181 | đóng | — | `WAL` chain W5 + W4b | Đính chính lần 3 | **`YC-002`** | +| `YC-007` | "1 -> B / 2 -> nguyên văn / 3 ->1 -> Gật luôn / 4 -> Đội đầy đủ khi chạy -> OK / 5 -> b / 6 -> b" | 2026-08-07 · S181 | đóng | 1 | `owner-decisions-07-08-2026-dot-2.md` | Sáu phán quyết P3·P5·P7(i)·P8 + cột `status` + baseline. 🔴 P7 chỉ vế (i); vế (ii) phán riêng ở `YC-009` | | +| `YC-008` | "Làm xong hết đi nhé" *(dán kèm bảng 5 wave còn lại, trong đó 2 wave ghi rõ đang CHẶN)* | 2026-08-07 · S181 | đóng | 1 | `WAL` chain W5/W4b | Chạy hết wave chạy được; 2 wave chặn thì chuẩn bị trọn rồi để đúng phần của anh | | +| `YC-009` | "đồng ý stamp - ký tên -> Làm đi nhé" | 2026-08-07 · S181 | đóng | 1 | `ACTIVE-MARKS` mark `RC-…-21-42-10` | Cấp chữ ký niêm phong W6 **và** phán nốt P7 vế (ii) | | +| `YC-010` | "OK làm hết rồi khép trọn đi" | 2026-08-07 · S181 | đóng | **2** | `WAL` chain W5b/W3b/W6 | Khép trọn gói: W5b + W3b + phần còn lại W6 | `YC-008` | +| `YC-011` | "1,2 -> làm đi, OK sau đó /session-end" | 2026-08-07 · S181 | mở | 1 | `WAL` `next:` | (1) push 42 commit · (2) cổng đồng-bộ + báo cáo cuối · rồi đóng phiên | | +| `YC-012` | "nâng cap" *(🔸 trích từ `spec-…-07-08-2026.md:64`, cửa-sổ **S180**, KHÔNG bắt trực tiếp ở cửa-sổ này — khai đúng nấc)* | 2026-08-07 · S180 | đóng | 1 | `memory-budget.json` `_cap_raised_S181` | Lệnh dứt khoát nâng `hmw_width.cap` 20→30. 🔴 @S179 lead **tự thu-hẹp** chữ "OK" thành "chưa phải lệnh đổi số" — lần này không tự thu-hẹp | | > 🔴 **MỘT yêu-cầu, nhắc 4 lần.** Đây là dữ-liệu **TC-01** sinh ra để bắt, và nó tố-giác chính lead: hiểu sai ở `YC-002` nên anh phải nói lại 3 lần. **Ghi lại chứ không làm đẹp.** >