diff --git a/.claude/WAL.md b/.claude/WAL.md index e1c37f5..7db7c45 100644 --- a/.claude/WAL.md +++ b/.claude/WAL.md @@ -10,7 +10,7 @@ chain: [x] pause-2 nghi thức: PAUSE-2 land trước chèn (curator #1) + MIND-2 (curator SUA-6 → sửa cả 6) + marker + snapshot [x] acceptance MẮT-ANH: "Tạm OK" @YC-019(1) — YC-013/016 lật đóng [x] acceptance ĐỘNG local @S185: A2-răng 2-tầng PASS (ô mờ hiện STATE THẬT DB=1, control-âm NV cùng cấp) + T8-động PASS (PUT-đổi-thật → 1 row changelog đúng shape; 3 echo-PUT = control-âm 0-row) + bonus guard-409 cờ-KẾT-THÚC sống runtime + revert sạch — verify: addendum `runs/2026-08-08-S182-khkk-awf-mirror-ncc/implement-synthesis.md` -[ ] 🆕 YC-021 còn thi công (W-3 ĐÃ ghi 500ms + goi-chot 4.3 PASS @S185): **W-2** build `ring5-audit` persona + wire 2-bookend · **W-4** kê NHÁP bảng thẩm-quyền owner-SỐ/owner-LUẬT + soạn 2 đề-xuất-ngược hub (trình anh duyệt bản kê) · **W-1** day-wake: 3 chạm canonical (tiep.md §0⑤(b) r-set · CLAUDE.md câu DUY-NHẤT · check-email 4→5 cửa) + thi công `/day` + dogfood + report hub — kèm workflow REVIEW riêng (Harness-9) +[x] YC-021 TRỌN @S185 (4W + REVIEW): **W-2** ring5-audit land + wire-4-chỗ + **spawn-probe ALIVE fail-closed = verified-runtime CÙNG PHIÊN** (data-point hot-reload-file-MỚI ×2) · **W-1** day-wake 4/4 floor (`day-probe.ps1` fault-inject 4/4 · `/day` listed-in-session · 3-chạm + 2-guard F2) · **W-3** 500ms → goi-chot 4.3 PASS · **W-4** bảng-DRAFT (3 dòng owner-SỐ vá theo reviewer) + thư hub `0cbaccaafa73` re-stamp-OK + _index · REVIEW gói `PASS_WITH_FIXES 8MAJ/6m` → 8/8 MAJOR vá trước commit — verify: python scripts/stamp_verify.py broadcasts/outbox/ai_infra/2026-08-10-*.md (=OK) · CHỜ-ANH: gật bảng-DRAFT (3 dòng đã sửa: 380K/48/soft-cap-nhà-thật) [x] bookend @close ONE-SHOT @S185 (YC-018 lượt đầu): 9 vai + 5 máy MỘT MẠCH — harvest 698KB→17-khối/11-sổ+7-tệp+7-lane · trio 40Đ/4T-183-số · H24-deep 16-FLAG trả-nợ-19/15 (tally máy @59) · ring2 16Đ/0T · ring1 30Đ/3T · tooling PWF-6 · ctx-audit 8-FLAG + MIND-3 (mind-check 11/11) · vá-sau-verdict: STATUS-668 + HANDOFF-12-slug-khôi-phục + sổ-YC-lật + A1/A2/A3 + (k-ter)-máy-3 · probe-sau: deep 0/15 ok, over-cap 5→3 — verify: test -s .claude/workflows/runs/2026-08-09-S185-bookend-close/bookend-close-synthesis.md [ ] governance-vá + đóng sổ: CÒN gom nợ harvest 576.255B/18-lượt (uỷ-quyền slot 71) + STATUS/HANDOFF closeout + YC-013 lật đóng sau mắt-anh — ✅ @S185: orphan S182 ĐÓNG (`implement-synthesis.md` + 7/7 ô + 2-thước-im) · 3 site tự-quy-chiếu VÁ+verify (session-start:161-162 trỏ-enum thay chép-class · detectors.ps1 pre-marker-segment → 29 slug vào lưới EXIT=0 · HANDOFF:58 dòng-bổ-sung giữ ảnh-chụp) [x] YC-017 ĐÓNG @S185: P1-P4 trọn — wf_5d16a842-28e 7/7 lane (16D+3P-đúng-luật+1S-khai; +C-7 lead tự vá rơi ⇒ 21/21 disposition) + verify-lead 3/3 + synthesis land — verify: test -s .claude/workflows/runs/2026-08-09-S185-email-adap-pipeline/implement-synthesis.md · tồn: C-1-đợi-rider-jump(nợ-chưa-có-chủ F-L2-2) · C-6-quyết-nén-ring2 · 4W+5-SKIP-owner (trình anh cuối lượt) diff --git a/.claude/agents/README.md b/.claude/agents/README.md index e77549d..958bcb1 100644 --- a/.claude/agents/README.md +++ b/.claude/agents/README.md @@ -214,6 +214,7 @@ | ring1-audit (monitor round-KIỂM, S145) | ref-only — ĐỌC output H1 `tooling-auditor` + H2 `harvest-curator` (KHÔNG chạy lại đo) + tự đếm `.claude/agents/*.md`/run-folder đối-chứng; no-self-exempt ≠ H1/H2; KHÔNG dùng domain skill | | ring2-audit (monitor round-KIỂM, S145) | ref-only — ĐỌC output `lead-stale-auditor` + `lead-gap-auditor` FLAG (KHÔNG re-soi-lead) + `flag_classes` enum ĐÓNG + `class_repeat`; no-self-exempt ≠ 2 vai H24; KHÔNG dùng domain skill | | ring4-audit (monitor round-KIỂM, S145) | ref-only — ĐỌC output `/sleep-recovery-memory-l2` `.gist.md` + Fidelity verdict; tự đo byte gốc vs gist; no-self-exempt độc-lập lượt nén; KHÔNG dùng domain skill | +| ring5-audit (monitor round-KIỂM vòng-6, S185 slot-41) | ref-only — ĐỌC output `tien-kiem-cua.ps1` + bảng-nhãn `ritual-labels.md` (4 nhãn + vòng hỏi ngược 5 cột); chạy lại VỊ-TỪ từng nhãn bằng lệnh KHÁC; quyền ĐỀ-NGHỊ-XOÁ-ÁN (nhãn nhầm lớp — kèm vị-từ, lead quyết); thách-CLEAN khi 0-nhãn; PIN fail-closed; KHÔNG dùng domain skill *(verified-pending-restart @S185)* | | ctx-audit (vai-3 vòng Ctx, S153) | ref-only — SOI-CHUỖI `_mind` @2-bookend: bất-biến |block|∈{p,p+1} đếm-ĐĨA + mồi-ngầm + kiểm-vết vai-1/2 (hồi-tố = fallback); ĐỌC output `mind-check` KHÔNG re-implement; PIN fail-closed, `_mind` vắng ⇒ NO-OP-có-khai; KHÔNG soi lead-surface (turf H24), KHÔNG kiểm vòng-đo khác (turf ring); KHÔNG dùng domain skill | | ctx-curator (vai-1 vòng Ctx, S153 OWNER-VETO) | ref-only — KIỂM bản NHÁP block @mỗi-`/pause` (5 khoản ngữ-nghĩa, SAU `mind-check --draft`); trả CHỈ văn bản `DAT\|SUA\|SKIP-CO-KHAI` ≤12 dòng; carve-out duy nhất `pause.md §1`; KHÔNG lấn @tiep/2-đầu; KHÔNG dùng domain skill | | score-counter (tầng-2 luật chấm điểm, W4b S181) | ref-only — đọc `docs/governance/so-yeu-cau-chu-du-an.md` TỰ ĐẾM mục nhắc ≥2 (đơn-vị MỤC không LẦN); CẤM xem điểm tầng-1 trước khi đếm xong; sổ thưa ⇒ `KHÔNG ĐO ĐƯỢC`; luật canonical `harness-11-engine PHẦN P` — trỏ; KHÔNG dùng domain skill *(+2 row @S185 — tooling F-1: matrix 26/28 hở từ S182)* | diff --git a/.claude/agents/ring5-audit.md b/.claude/agents/ring5-audit.md new file mode 100644 index 0000000..e0e6f9b --- /dev/null +++ b/.claude/agents/ring5-audit.md @@ -0,0 +1,24 @@ +--- +name: ring5-audit +description: Read-only INFORM-only KIỂM vòng-ĐO nghi-thức cửa phiên (vòng-6) cho SOLUTION_ERP — slot (41), owner chốt @S185 YC-021/W-2 ("đồng ý thêm 1 nghi thức ko vấn đề"), khuôn thư hub 08-08 Phần-1 vòng-6 ("một vai kiểm — có quyền đề nghị XOÁ ÁN khi nhãn bị gán nhầm lớp"). Là vai-KIỂM ĐỘC-LẬP của vòng nghi-thức: ĐỌC OUTPUT của máy điểm-danh `scripts/tien-kiem-cua.ps1` (1 dòng TIEN-KIEM per-cửa) + BẢNG NHÃN nghi-thức mà lead/vai đã gán theo `docs/governance/ritual-labels.md` (4 nhãn Ý-ĐỊNH: quên · tự ý bỏ · suy giảm hợp lệ · bị chặn — mỗi nhãn 1 vị-từ đĩa §2.1) + vòng-hỏi-ngược 5-cột (§3), KHÔNG re-chạy việc đo. TRẢ verdict per-nhãn ĐẠT/TRƯỢT/XOÁ-ÁN-ĐỀ-NGHỊ + falsify ≥2 (tự chạy lại VỊ-TỪ của nhãn nặng nhất — vật-mốc/dòng-khai/điều-kiện-chạy-lại — bằng lệnh KHÁC) + TỰ tái-dựng ≥1 số (đếm hàng bảng-nhãn vs đĩa · hoặc đếm dòng TIEN-KIEM trong vật chứng lượt). 🔴 QUYỀN ĐẶC THÙ (khác 3 ring kia): ĐỀ NGHỊ XOÁ ÁN khi nhãn gán NHẦM LỚP — ví-dụ `tự ý bỏ` mà điều-kiện-cho-phép chạy lại ra ĐÚNG (thật ra là `suy giảm hợp lệ`), hoặc `quên` mà dòng-khai tồn tại (grep sót) — đề nghị kèm vị-từ chạy-lại, lead quyết. 🔴 Máy đo SỰ-HIỆN-DIỆN không đo CHẤT (ritual-labels :208) — phần CHẤT chính là việc của mày. 🔴 no-self-exempt (m-3): mày KHÔNG phải máy tien-kiem, KHÔNG phải người gán nhãn. thách-CLEAN bắt buộc khi bảng-nhãn RỖNG ("phiên chạy trọn 0 nhãn"): tự soi 1 cửa của phiên (đối chiếu file lệnh cửa đó vs vật chứng) tìm bước lệch bị sót — 0-nhãn khi có bước lệch là ca nguy nhất. AUTO fire @bookend-close SAU khi lead chốt bảng-nhãn phiên (session-end §L.b(m)); phiên KHÔNG có bảng-nhãn/0 cửa lệch ⇒ pin missing ⇒ NO-OP-có-khai 1 dòng, CẤM ĐẠT-ảo. PIN đích-danh fail-closed — nhận path bảng-nhãn + vật chứng cửa + run-folder; pin missing ⇒ SKIP-CO-KHAI, CẤM tự glob. Propose-only, lead single-writer (backstop = git-diff commit-gate). KHÔNG soi vòng tooling/harvest (ring1) · KHÔNG soi H24 (ring2) · KHÔNG soi nén-ngủ (ring4) · KHÔNG soi trio-memory (harness-audit) · KHÔNG soi lớp-mềm _mind (bộ-ba Ctx) · KHÔNG chấm diff-code (reviewer). ✅ verified-runtime @S185 CÙNG PHIÊN LAND: registry hot-reload agent-MỚI (data-point lần 2 sau S107 — MỚI ⟂ EDIT khác nhau) + spawn-probe ALIVE fail-closed đúng ngưỡng (SKIP-CO-KHAI 3-pin + 2 nhà canonical / 2 tool-call). +tools: Read, Grep, Glob, Bash +model: opus +effort: max +memory: project +maxTurns: 16 +--- + +# ring5-audit — KIỂM vòng-6 nghi-thức cửa phiên (slot 41, land @S185) + +Mày là vai-KIỂM của vòng nghi-thức cửa phiên. Con-đo của vòng này gồm: máy `scripts/tien-kiem-cua.ps1` (điểm danh 2-nguồn đầu mỗi cửa, LUÔN exit 0 — INFORM) + người-gán-nhãn theo `docs/governance/ritual-labels.md` (4 nhãn + vòng hỏi ngược 5 cột). Mày ĐỌC output của họ, chấm ĐẠT/TRƯỢT per-nhãn, và là vai DUY NHẤT có quyền **đề nghị xoá án**. + +## CONTRACT — 4 nghĩa-vụ (thứ-tự bắt buộc) + +1. **PIN-gate (fail-closed):** nhận {path bảng-nhãn phiên · path vật chứng các cửa (run.md/session-log/marker) · run-folder bookend}. Thiếu ⇒ in `RING5: SKIP-CO-KHAI — pin missing: ` + DỪNG. Phiên 0-nhãn có khai ⇒ `RING5: NO-OP — 0 nhãn` + thách-CLEAN (nghĩa vụ 3). +2. **Per-nhãn verdict:** với MỖI hàng bảng-nhãn — chạy lại 3 vị-từ của nhãn đó (vật-mốc `Test-Path`/grep-khuôn · dòng-khai grep-mã-bước · điều-kiện-cho-phép chạy-lại) bằng lệnh KHÁC lệnh người gán dùng. Nhãn đúng lớp ⇒ ĐẠT. Nhãn NHẦM LỚP ⇒ **XOÁ-ÁN-ĐỀ-NGHỊ** kèm vị-từ + lớp đúng. Vị-từ không chạy được ⇒ KHÔNG-CHẤM-ĐƯỢC (cấm ĐẠT-ảo). +3. **thách-CLEAN:** bảng-nhãn rỗng/mỏng ⇒ tự đối chiếu 1 cửa (file lệnh cửa vs vật chứng lượt) tìm bước lệch sót. Tìm được ⇒ FLAG SÓT kèm nhãn đề nghị. +4. **Return schema-NHỎ chống #53:** artifact-first ghi `sub-ring5-audit.md` vào run-folder TRONG LÚC LÀM; return dòng-1 `RING5: Đ/T/-xoá-án-đề-nghị · falsify H/B · <1 câu>` + con-trỏ. + +## Ranh + +Đề-nghị-xoá-án ≠ xoá: lead verify vị-từ rồi mới lật sổ (single-writer). Nhãn `tự ý bỏ` được xoá-án thành `suy giảm hợp lệ` phải có điều-kiện-cho-phép chạy-lại ra ĐÚNG in kèm — không có phép chạy = không có đề nghị. KHÔNG store_memory. Mọi số kèm lệnh tái-lập. diff --git a/.claude/commands/check-email.md b/.claude/commands/check-email.md index 8e4363f..9a3e041 100644 --- a/.claude/commands/check-email.md +++ b/.claude/commands/check-email.md @@ -32,7 +32,7 @@ Chỉ cắm 2 cửa `session-start`/`session-end` thì **đúng ca anh đang lo | chế-độ | cửa | làm gì | chi-phí | |---|---|---|---| -| **DÒ** (detect-only) | `/tiep` · `/pause` | list + so id → in `thu-moi: se=X all=Y`. 🔴 **KHÔNG copy · KHÔNG hash · KHÔNG python.** X hoặc Y > 0 ⇒ nêu **1 dòng** rồi đi tiếp, để bookend kéo | ~5ms | +| **DÒ** (detect-only) | `/tiep` · `/pause` · `/day` *(+S185 W-1 — cửa VÀO nhẹ, nhịp thành 5 cửa)* | list + so id → in `thu-moi: se=X all=Y`. 🔴 **KHÔNG copy · KHÔNG hash · KHÔNG python.** X hoặc Y > 0 ⇒ nêu **1 dòng** rồi đi tiếp, để bookend kéo | ~5ms | | **KÉO** (đầy-đủ) | `/session-start` · `/session-end` | `se>0` → **`/check-email`** STAGE 1 (copy + verify 2 tuyến + log `_index`) · `all>0` → **`/adap-apply`** | theo số thư | 🔴 **DÒ PHẢI QUÉT CẢ HAI KÊNH — đây là kẽ thật, và nó nằm ở NHỊP chứ không ở tool:** `outbox/se` (directed, → `/check-email`) **VÀ** `outbox/all` (fan-out, → `/adap-apply`). Không có nhánh `all` thì **10 broadcast đợt adap-11 nằm im 5 ngày** (07-18→07-23) — ca đã xảy ra thật, không phải giả-định. **DÒ chỉ ĐẾM và ĐỊNH TUYẾN, không kéo** ⇒ vẫn rẻ. diff --git a/.claude/commands/day.md b/.claude/commands/day.md new file mode 100644 index 0000000..645ec4e --- /dev/null +++ b/.claude/commands/day.md @@ -0,0 +1,39 @@ +# /day — dậy-nhẹ probe-first (W-1 YC-021 anh chốt @S185 · adopt hub `2026-07-28-Governance-day-wake-probe-first-resume`, floor F1-F4) + +> **Nguyên tắc: probe-rồi-mới-trả-giá.** Đo delta TRƯỚC (chỉ-đọc, <500ms — ngưỡng owner `stop_point_cheap_ms`), trả đúng giá SAU: **sạch thì dậy nhẹ, bẩn thì tự nâng chạy trọn `/tiep`**. Nghiêng an-toàn: probe lỗi / nghi ngờ = DELTA. +> 🔴 **KHÔNG thay `/tiep`** — `/tiep` vẫn là đường nối-đầy-đủ (H22); `/day` chỉ mở lối rẻ cho ca **đầu-ngày-sau-điểm-dừng-SẠCH**. Gõ `/day full` = ép chạy trọn `/tiep` bỏ qua probe (cửa thoát cưỡng chế F2). + +## Thực hiện tuần-tự + +### 1. BƯỚC 0 — tiền kiểm (không chặn) +`powershell.exe -ExecutionPolicy Bypass -File scripts/tien-kiem-cua.ps1 -Cua day` → in 1 dòng. Lỗi ⇒ `tien-kiem loi (khong chan)` → đi tiếp. + +### 2. Probe (F1+F3 — máy, chỉ-đọc) +`powershell.exe -ExecutionPolicy Bypass -File scripts/day-probe.ps1` → đọc verdict dòng `DAY-PROBE:`. +- Máy chọn marker cuối bằng **ts TRONG file** (không mtime — Dropbox chạm mtime), anchor = **commit-chốt-dừng** (commit ADD marker; fallback head-sha trong marker — bẫy-một F3), kiểm anchor **sống + tổ-tiên HEAD** (bẫy-hai F3 — SE có squash closeout nên bẫy này THẬT). +- 4 tín hiệu: commit-sau-anchor · dirty (mọi porcelain — không allowlist, nghiêng DELTA) · (run-folder mới đã phủ bởi 2 tín hiệu trên) · sentinel `closing:` (Sàn-2). + +### 3. Route theo verdict +| Verdict | Đường | +|---|---| +| **CLEAN** (0-hit toàn bộ) | **DẬY NHẸ** — bước 4 | +| **DELTA** | in nguyên dòng signals của probe → **TỰ NÂNG**: chạy TRỌN [`/tiep`](tiep.md) §0→§3-ter. KHÔNG dậy nhẹ trên nền có delta | +| **ANCHOR-LOST** | khai verdict CÔNG KHAI trong report (hỏng-an-toàn phải CÓ TIẾNG — F3) → TỰ NÂNG `/tiep` trọn | +| *(user gõ `/day full`)* | bỏ probe → `/tiep` trọn | + +### 4. DẬY NHẸ (chỉ khi CLEAN) +1. **Nạp LÕI:** đọc `.claude/WAL.md` (trọn, ≤40 dòng) + block TRÊN CÙNG của `_mind-s-.md` (mới-nhất-ở-trên). 🔴 **BỎ** nạp-nền 9-nguồn `tiep_reload` + **BỎ** spawn `ctx-verifier` (tầng kiểm-lúc-đọc) — hợp lệ vì block lớp-mềm đã qua `ctx-curator` kiểm-lúc-ghi tại `/pause`, và 0-delta nghĩa là nó còn nguyên giá trị (**không trả tiền kiểm hai lần** — F1). +2. **Report dậy ≤10 dòng:** verdict + tóm `next:` WAL + 1 ý sống nhất từ §D `_mind` + **khai rõ 2 khoản SKIP** (nạp-nền + ctx-verifier). +3. **Marker mỏng (F4):** ghi `_day-.md` vào `.claude/sessions/session-/` (`` = max(_day-*)+1) — ĐÚNG 5 trường như `_tiep-*`: `ts` · `head-sha` · `verdict: CLEAN` · `route: day-nhe` · `jsonl-hint`. KHÔNG khối lớp-mềm, KHÔNG commit tay — **Stop-hook `wal-flush.ps1` tự commit nó cuối turn** (`sessions/` thuộc 4-path hook) ⇒ lượt `/day`/`/pause` KẾ probe thấy cây SẠCH, marker không tự-đầu-độc phép đếm dirty (reviewer F-3 @S185 — mâu thuẫn "không commit riêng ⟂ probe đếm dirty" hoà giải bằng sự thật hook, không phải bằng allowlist). +4. DỪNG — chờ việc anh giao. Việc tới mà cần nền đầy đủ ⇒ nâng `/tiep` lúc đó. + +### 5. Falsifier 2 chiều (F4 — cho tầng audit / ring5) +- **CLEAN-giả:** marker `_day-*` ghi `verdict: CLEAN` mà tồn tại commit thật giữa anchor và ts của nó ⇒ probe sai → FLAG (`git rev-list --count ..` > 0). +- **Luôn-DELTA:** report dậy BẮT BUỘC khai signals/`anchor-lost` mỗi lần tự nâng ⇒ chuỗi tự-nâng dài bất thường soi được từ dãy `_day-*` marker (route toàn `full`), không chết im. + +## Guard F2 (chống-trùng — mirror ở 2 lệnh cũ) +- [`pause.md`](pause.md) bước-0: marker cuối đã là `_pause-*` + probe CLEAN ⇒ **no-op** "đã dừng rồi, 0 delta — giữ nguyên" (không sinh thêm marker/lớp-mềm/commit). +- [`tiep.md`](tiep.md) ghi chú đầu §0: probe CLEAN ⇒ được phép route `/day`-nhẹ thay vì đốt nghi-thức full lần hai (trừ khi user muốn full). + +## Nấc trung thực @S185 +`executed + dogfood-TAY` (probe chạy thật DELTA-379ms trên repo + fault-inject cây tạm 4/4: CLEAN · DELTA-sentinel · DELTA-thật · ANCHOR-LOST-loud) + **listed-in-session** — lệnh MỚI hiện skill-list NGAY không cần restart (data-point ×2 cùng ngày: `/day` + agent `ring5-audit`; **file .md MỚI hot-reload ⟂ EDIT file cũ thì không** — phép đo no-hot-reload S120/S121 đo trên EDIT, 2 lớp KHÁC nhau). `/day` gõ-thật + self-check ca-3/4/5 thư hub = lượt dậy thật kế tiếp. diff --git a/.claude/commands/pause.md b/.claude/commands/pause.md index d8fb7d5..8f06e7e 100644 --- a/.claude/commands/pause.md +++ b/.claude/commands/pause.md @@ -6,7 +6,11 @@ argument-hint: (không tham số) # /pause — chốt điểm dừng chủ-động (Harness-22 WAL session-continuity) > **Mục-đích:** chốt trạng-thái làm-việc hiện-tại xuống đĩa một cách an-toàn, để có thể thoát / đổi tài-khoản / tắt máy mà KHÔNG mất trí-nhớ đã có và KHÔNG phải đốt lại token cho phần đã xong. -> Cặp với **`/tiep`** (đường recovery duy-nhất). 🔴 restart Claude Code sau khi tạo/sửa command `.md` (no hot-reload). +> Cặp với **`/tiep`** (đường recovery duy-nhất). 🔴 restart Claude Code sau khi **SỬA** command `.md` (EDIT không hot-reload — đo S120/S121); file `.md` **MỚI** thì hot-reload được (data-point S107 + ×2 @S185: `/day` + `ring5-audit` đều hiện ngay trong phiên land). + +## 0. Guard chống-trùng (F2 day-wake, +S185 YC-021/W-1) + +Chạy `powershell.exe -ExecutionPolicy Bypass -File scripts/day-probe.ps1` (chỉ-đọc, <500ms). Nếu **marker cuối đã là `_pause-*`** VÀ verdict = **CLEAN** ⇒ **NO-OP**: in *"đã dừng rồi, 0 delta — giữ nguyên"* + DỪNG (không sinh thêm marker/lớp-mềm/commit — người gõ trùng lệnh không bị phạt token). Mọi ca khác (DELTA/ANCHOR-LOST/marker-cuối-không-phải-pause/probe-lỗi) ⇒ chạy tiếp bình thường từ bước 1. Thực-hiện **tuần-tự 5 bước** sau; trong lúc chạy **KHÔNG nhận việc mới**: diff --git a/.claude/commands/session-end.md b/.claude/commands/session-end.md index e68f8fc..f74ac55 100644 --- a/.claude/commands/session-end.md +++ b/.claude/commands/session-end.md @@ -187,6 +187,7 @@ Em main PHẢI echo **TOÀN BỘ nội dung command body này** (đầy đủ Ph - **(vi) Post-wave assertion:** xong 3 con → `git status --short` → **kỳ vọng 0 tracked-change ngoài run-folder**; có thay-đổi lạ ⇒ residual-write ⇒ **báo anh + revert** (G-015: propose-only KHÔNG code-enforced ở kênh Bash — git-diff = backstop THẬT). - **(vii) [M4] Vết 2 lớp (giữ NGUYÊN sau khi bỏ consent @S151):** dòng trạng-thái ở (i) **IN CẢ khi Light/hỏi-đáp** (Light ⇒ skip CHẠY hợp-lệ, **CẤM skip IM-LẶNG**); khi skip (Light **HOẶC** vòng không chạy được — 🧊 vế "khong-gat" retired @S151 cùng consent-gate) ⇒ ghi **1 dòng vết** vào `.claude/WAL.md`: `trio: skipped S ()`. - **(viii) Đơn-vị nhịp:** "phiên-LOGIC" hub map **TẠM** = nhãn-phiên `S` (SE chưa adopt session-logic). 🔴 **KHÔNG cadence-key** trong `memory-budget.json`, **KHÔNG tick** counter cho bộ-ba (nhịp bộ-ba ≠ nhịp H24 — trộn 2 đồng-hồ = hỏng cả hai). +- **(m) 🔬 ring5-audit @close — KIỂM vòng-6 nghi-thức cửa phiên** *(+S185 slot (41) — YC-021/W-2 anh chốt "đồng ý thêm 1 nghi thức ko vấn đề"; khuôn thư hub 08-08 vòng-6):* SAU khi lead chốt **bảng-nhãn nghi-thức** của phiên (các bước cửa bị lệch gán 1 trong 4 nhãn `ritual-labels.md`) ⇒ spawn `ring5-audit` PIN {bảng-nhãn · vật chứng cửa · run-folder} → verdict per-nhãn + falsify vị-từ + **đề-nghị-XOÁ-ÁN** khi nhãn nhầm lớp (lead verify vị-từ rồi mới lật). Phiên 0-bước-lệch ⇒ lead ghi 1 dòng `ring5: 0-nhãn @S` (vết M4) ⇒ vai NO-OP-có-khai. Contract = canonical [`.claude/agents/ring5-audit.md`](../agents/ring5-audit.md) (B1). 🔴 verified-pending-restart @S185 — trước restart CLI, mục này ghi vết skip thay vì spawn. - **(l) 🔎 ctx-audit @close — vai-3 vòng Ctx (SOI-CHUỖI)** *(adopt thư `0df10df4` @S153; 🔄 **OWNER-VETO @S153**: (38)(a) 1-vai → **hub-form 3-vai** anh chốt trực tiếp — vai-1 `ctx-curator` @mỗi-pause · vai-2 `ctx-verifier` @mỗi-tiep · vai-3 đây; 🔴 ăn từ phiên sau restart CLI):* AUTO **SAU các vòng đo (a)-(k), TRƯỚC §L.c** — spawn vô-điều-kiện (hình-B), **máy TRƯỚC vai** (`mind-check` full + closed-check §6.3-bis). **PIN đích-danh fail-closed**: path `_mind-s-.md` + run-folder bookend-close; `_mind` vắng ⇒ **NO-OP 1 dòng có khai**. Vai: **bất-biến chuỗi** (tự đếm ĐĨA) + **chấm mồi-ngầm** + **KIỂM-VẾT vai-1/vai-2** (phiên có pause/tiep: đọc verdict chúng + đối-chứng chọn mẫu; phiên 0-pause/0-tiep: tự chạy hồi-tố 5-khoản + 4-khoản = fallback) — contract = canonical [`.claude/agents/ctx-audit.md`](../agents/ctx-audit.md) (B1, KHÔNG chép). Lead scribe `sub-ctx-audit-close.md` **NGAY khi trả** + seed diary `agent-memory/ctx-audit/` **CÙNG lượt** (kẻo C11(b) FLAG diary-0-delta — datum T3 @S153). ### §L.c — completeness-gate 5-vòng (D1, land S146 — 🔴 CÓ RĂNG: CẤM bare-PASS) diff --git a/.claude/commands/tiep.md b/.claude/commands/tiep.md index c767f00..44eb2c3 100644 --- a/.claude/commands/tiep.md +++ b/.claude/commands/tiep.md @@ -10,6 +10,8 @@ argument-hint: (không tham số) Thực-hiện **tuần-tự**: §0 (sàn) → §1 → §2 → §3 → §4. +> 🔸 **Guard F2 day-wake (+S185 YC-021/W-1):** TRƯỚC §0 được phép chạy `scripts/day-probe.ps1` (chỉ-đọc <500ms); verdict **CLEAN** + ca đầu-ngày ⇒ hợp lệ route sang [`/day`](day.md) dậy-nhẹ thay vì đốt nghi-thức full lần hai (trừ khi user muốn full / việc tới cần nền đầy-đủ). DELTA/ANCHOR-LOST ⇒ chạy trọn file này như thường — nghiêng an-toàn. + --- ## 0. 🔴 Sàn-3 canonical — **"sổ trống ≠ sạch"** (ĐỊNH-NGHĨA MỘT CHỖ DUY-NHẤT) @@ -101,7 +103,9 @@ for d in .claude/sessions/session-*/; do { [ -f "$d/_end" ] || [ -f "$d/closed.md" ]; } && continue p=$(( $(ls "$d"_pause-*.md 2>/dev/null | wc -l) + $(ls "$d"pause-*.md 2>/dev/null | wc -l) )) [ "$p" -eq 0 ] && continue - r=$(( $(ls "$d"_tiep-*.md 2>/dev/null | wc -l) + $(ls "$d"resume-*.md 2>/dev/null | wc -l) )) + r=$(( $(ls "$d"_tiep-*.md 2>/dev/null | wc -l) + $(ls "$d"resume-*.md 2>/dev/null | wc -l) + $(ls "$d"_day-*.md 2>/dev/null | wc -l) )) + # ^ `_day-*` cộng vào r từ @S185 (W-1 day-wake): dậy-nhẹ CLEAN = một lần NỐI hợp lệ (marker mỏng F4). + # Thiếu vế này thì chuỗi pause→day→pause đọc thành p>r ⇒ ORPHAN-L kêu oan mỗi lần dùng /day. [ "$p" -gt "$r" ] && echo "ORPHAN-L: $d (pause=$p tiep=$r, chua chot-ket)" done ``` diff --git a/.claude/workflows/hmw.js b/.claude/workflows/hmw.js index 3f48817..50fdf42 100644 --- a/.claude/workflows/hmw.js +++ b/.claude/workflows/hmw.js @@ -40,6 +40,7 @@ const VALID_ROLES = [ // TUẦN TỰ eval→refine→audit (CẤM song song — audit đọc bản cũ = verdict vô-nghĩa), lead scribe return từng con vào run-folder. 'ring1-audit', // +S145 C4/C4b (adap dot-11, owner-decision [2] TÁCH) — vai-KIỂM ĐỘC-LẬP vòng tooling/harvest: đọc OUTPUT H1(tooling-auditor)+H2(harvest-curator), no-self-exempt ≠ H1/H2. AUTO fire-after-measure @session-end §L.b(g-bis) (KHÁC trio/H24 consent-gated). Vai #1/3 round-KIỂM (ring2-audit + ring4-audit land dần incremental). 'ring2-audit', 'ring4-audit', // +S145 C4/C4b vai #2/3 + #3/3 round-KIỂM (owner-decision [2] TÁCH mỗi-vòng-1-con). ring2-audit = KIỂM vòng soi-lead (đọc OUTPUT lead-stale+lead-gap, no-self-exempt ≠ chúng, KHÔNG soi lead trực-tiếp) · ring4-audit = KIỂM vòng nén-ngủ (đọc /sleep-recovery gist+Fidelity, tự đo byte). AUTO fire-after-measure, propose-only, NO-OP nếu vòng không đo. + 'ring5-audit', // +S185 slot(41) YC-021/W-2 anh chốt — KIỂM vòng-6 nghi-thức cửa phiên (đọc OUTPUT tien-kiem-cua + bảng-nhãn ritual-labels 4-nhãn, quyền ĐỀ-NGHỊ-XOÁ-ÁN khi nhãn nhầm lớp). AUTO @bookend-close sau bảng-nhãn, NO-OP nếu 0-nhãn-có-khai. 'ctx-audit', // +S153 ctx soft-memory 0df10df4 — vai-3 vòng Ctx: SOI-CHUỖI 2 đầu phiên, INFORM-only (🔄 OWNER-VETO @S153: (38)(a) 1-vai → hub-form 3-vai, anh chốt trực tiếp) 'ctx-curator', 'ctx-verifier', // +S153 OWNER-VETO hub-form 3-vai — vai-1 KIỂM nháp @mỗi-pause (carve-out pause §1) · vai-2 ĐỐI-CHIẾU+NẠP @mỗi-tiep; cả 2 INFORM-only trả-văn-bản 'score-counter', 'score-count-auditor', // +S181 W4b (chủ dự án phán P4) — tầng-2 + tầng-3 của luật chấm điểm diff --git a/.claude/workflows/runs/2026-08-09-S185-bookend-close/sub-reviewer-yc021.md b/.claude/workflows/runs/2026-08-09-S185-bookend-close/sub-reviewer-yc021.md new file mode 100644 index 0000000..3f59e19 --- /dev/null +++ b/.claude/workflows/runs/2026-08-09-S185-bookend-close/sub-reviewer-yc021.md @@ -0,0 +1,280 @@ +# sub-reviewer-yc021 — REVIEW độc lập gói YC-021 @S185 (W-1 day-wake · W-2 ring5 · W-4 bảng+thư) + +> Vai: `reviewer` (adversarial, READ-only). Artifact-first. Mọi số dưới đây **đo tại phiên này**, kèm lệnh tái-lập. +> Diff scope: working-tree dirty (chưa commit) — `git diff --stat` = 9 file tracked (+16/−4) + 5 file untracked. + +## 0. Bản đồ diff (đo, không chép) + +``` +git status --porcelain -> 14 dòng (9 M + 5 ??) [khớp probe: dirty=14] +git diff --stat -> 9 files, 16 insertions(+), 4 deletions(-) +``` + +| Khối | File | Loại | +|---|---|---| +| W-2 | `.claude/agents/ring5-audit.md` | MỚI | +| W-2 wire | `session-end.md`(m) · `hmw.js` VALID_ROLES · `agents/README.md` · `docs/STATUS.md` | sửa | +| W-1 | `scripts/day-probe.ps1` · `.claude/commands/day.md` | MỚI | +| W-1 chạm | `tiep.md` ⑤(b) + ghi-chú route · `CLAUDE.md` · `check-email.md` · `pause.md §0` | sửa | +| W-4 | `docs/governance/bang-tham-quyen-owner-DRAFT.md` · thư outbox + `broadcasts/_index.md` | MỚI/sửa | + +--- + +## R1 — ring5 persona đúng khuôn ring-family? → **PASS_WITH_FIXES** + +### Đo khuôn frontmatter (lệnh tái-lập ở dưới) + +```bash +for f in .claude/agents/*.md; do ... grep -c "^effort:" / "^memory:" / "^maxTurns:" / "^tools: \[" ; done +``` + +| Vai | effort | memory | maxTurns | tools dạng list | +|---|---|---|---|---| +| ring1/ring2/ring4-audit | 1 | 1 | 1 | 1 | +| **ring5-audit** | **0** | **0** | **0** | **0** | +| 26/29 vai còn lại (trừ `score-*`) | 1 | 1 | 1 | 1 | + +⇒ **F-1 (MAJOR):** `ring5-audit.md:4-5` chỉ có `tools:`+`model: opus`; **THIẾU `effort: max` + `memory: project` + `maxTurns`**. `ring5` là vai DUY NHẤT trong 29 vai thiếu cả `effort` lẫn `memory` (`score-counter`/`score-count-auditor` thiếu maxTurns nhưng VẪN có effort+memory). Hệ quả đo được: worker-tier-pin S124 ("14/14 sub = opus + effort:max") **không áp cho vai này** ⇒ vai KIỂM nặng nhất về suy-luận lại chạy effort mặc định; và không có `memory: project` ⇒ nhật-ký vai (`.claude/agent-memory/ring5-audit/MEMORY.md`) không được nạp như 3 ring kia. Đây là lệch **khuôn**, không phải lệch thẩm mỹ. + +### 5 thuộc tính ranh (soi từng cái, so `ring2`/`ring4`) + +| Thuộc tính | ring2 | ring4 | ring5 | verdict | +|---|---|---|---|---| +| PIN fail-closed | có (§i) | có (§i) | có (§CONTRACT-1, `SKIP-CO-KHAI` + DỪNG) | ✅ | +| no-self-exempt | có (m-3) | có (m-3) | có (m-3, "KHÔNG phải máy tien-kiem, KHÔNG phải người gán nhãn") | ✅ | +| NO-OP-có-khai, cấm ĐẠT-ảo | có | có | có (`RING5: NO-OP — 0 nhãn` + CẤM ĐẠT-ảo) | ✅ | +| propose-only + lead single-writer | có | có | có + khai backstop git-diff | ✅ | +| thách-CLEAN bắt buộc khi 0-flag | có | có | có (soi 1 cửa tìm bước lệch sót) | ✅ | +| falsify ≥2 + tái-dựng ≥1 số | có (§iii/§iv) | có (§iii/§iv) | có (gộp vào §2/§4) | ✅ | + +### "Có chỗ nào cho vai tự lật sổ không?" → **KHÔNG** (soi 3 lớp, đều khoá) + +1. `:21` — "Đề-nghị-xoá-án ≠ xoá: lead verify vị-từ rồi mới lật sổ (single-writer)". +2. `:21` — điều-kiện đề nghị **có vị-từ bắt buộc**: "không có phép chạy = không có đề nghị" ⇒ không thể xoá án bằng lời. +3. `:3` — "Propose-only, lead single-writer (backstop = git-diff commit-gate)" + return schema chỉ chứa `xoá-án-ĐỀ-NGHỊ`, không có động từ ghi. +⇒ quyền đặc thù **có ranh đúng**, không đẻ cửa tự-lật-sổ. + +### Ghi nhận đứng vững (không hạ thước, cũng không bịa lỗi) + +- `ring5` khai ranh-trục **loại trừ đủ 6 turf** (ring1/ring2/ring4/harness-audit/bộ-ba-Ctx/reviewer) — đầy đủ hơn cả ring2 (loại 3) và ring4 (loại 4). Đây là điểm **tốt hơn** khuôn cũ, giữ nguyên. +- 2 con-đo mà nó KIỂM **tồn tại thật trên đĩa**: `docs/governance/ritual-labels.md` (13.620 B) + `scripts/tien-kiem-cua.ps1` (5.813 B). Không phải pin ma. + +- **F-2 (minor):** `ring5` là ring DUY NHẤT không khai `tools:` gồm 4 MCP `rag-unified` như ring1/2/4 — nếu là CỐ Ý (vai không cần RAG) thì nên khai 1 câu; hiện đọc thành sót. + +--- + +## R2 — Wire ring5 đủ + nhất quán? → **PASS** + +### Đếm lại (không tin lời khai) + +```bash +python: parse block VALID_ROLES (strip //-comment TRƯỚC khi regex) -> 29 +ls .claude/agents/*.md | grep -v README | wc -l -> 29 +``` + +🔴 **Bẫy thước đã dẫm và tự sửa:** lần đếm đầu `s.index(']', i)` cắt block ở dấu `]` **trong comment** `owner-decision [2]` ⇒ ra **18** (hụt 11). Chỉ khi cắt theo dòng `^\]` mới ra 29. Ghi lại vì "0/N hit" kiểu này im lặng. + +| Chỗ wire | Bằng chứng | verdict | +|---|---|---| +| `hmw.js:43` VALID_ROLES | `'ring5-audit',` có comment lý-do | ✅ | +| `session-end.md:190` mục (m) | AUTO @close sau bảng-nhãn + NO-OP 0-nhãn + trỏ canonical (B1) | ✅ | +| `agents/README.md:217` | row matrix đặt ĐÚNG cụm ring1/2/4 | ✅ | +| `docs/STATUS.md:478` | 28→**29**, khớp 2 phép đếm độc lập ở trên | ✅ | + +**Không sót chỗ thứ 5** — 2 ứng viên đã soi và loại: +- `hmw.js:251-254` writeGuard comment liệt "SE read-only sub": **ring1/ring2/ring4 cũng KHÔNG có tên ở đó** ⇒ ring5 vắng là **nhất quán với tiền lệ**, không phải gap mới (không nhồi cosmetic). +- skill-matrix: cả 4 ring đều khai "KHÔNG dùng domain skill" trong cùng bảng README ⇒ đã phủ. + +--- + +## R3 — `day-probe.ps1` → **PASS_WITH_FIXES** + +### Đo cứng + +```bash +python: bytes=5486 · non-ascii=0 · BOM=none · EOL=LF # gotcha #30 SẠCH +powershell -File scripts/day-probe.ps1 + -> DAY-PROBE: DELTA | anchor=32f50f35(seal-commit) alive+ancestor + | commits-sau=27 | dirty=14 | closing=0 | marker=_tiep-3.md | 350ms +``` +- `dirty=14` **khớp byte-exact** `git status --porcelain | wc -l` = 14 ⇒ tín hiệu (b) đo đúng thứ nó khai. +- 350ms < `stop_point_cheap_ms` = 500 (đo lại từ `memory-budget.json`). + +### Nghiêng-DELTA: liệt **đủ 8 nhánh thoát**, không nhánh nào exit ≠ 0 + +| # | Nhánh | verdict in ra | exit | +|---|---|---|---| +| 1 | `:40` no sessions dir | DELTA | 0 | +| 2 | `:46` no logic-session | DELTA | 0 | +| 3 | `:58` 0 marker có ts | DELTA | 0 | +| 4 | `:68` anchor không resolve | DELTA | 0 | +| 5 | `:72` anchor mất khỏi object store | **ANCHOR-LOST** (loud) | 0 | +| 6 | `:76` anchor không phải tổ tiên HEAD | **ANCHOR-LOST** (loud) | 0 | +| 7 | `:88/:89` CLEAN / DELTA | — | 0 | +| 8 | `:94` catch mọi exception | DELTA (`probe-loi:`) | 0 | + +⇒ `Out-Line` là **cửa thoát DUY NHẤT** và luôn `exit 0`; `finally { Pop-Location }` vẫn chạy trước exit. **KHÔNG có nhánh exit ≠ 0** ✅. Anchor logic đúng thư hub F3: seal-commit trước (`git log --diff-filter=A`), fallback in-file `head-sha`, rồi `cat-file -e` + `merge-base --is-ancestor` ✅. + +### 🔴 F-3 (MAJOR) — marker `_day-*` **TỰ ĐẦU ĐỘC** probe kế tiếp + +`day.md:27` chốt: marker `_day-.md` "**KHÔNG commit riêng** (đi theo chuyến commit kế / hook)". +`day-probe.ps1:81` đếm dirty = `git status --porcelain` **không allowlist** (header `:12` tự khai "no allowlist - lean DELTA"). +⇒ Ngay sau một lượt `/day` dậy-nhẹ, `_day-1.md` là file **untracked** ⇒ `dirty ≥ 1` ⇒ **mọi probe sau đó trả DELTA cho tới khi có commit**. +Hệ quả đo được, 2 cái: +- (a) `/day` lần thứ hai trong cùng chu kỳ commit **luôn** tự nâng `/tiep` trọn — đường rẻ chỉ dùng được **1 lần/commit**, trong khi `day.md:4` bán nó là lối rẻ cho "ca đầu-ngày". +- (b) Guard `pause.md §0` (điều kiện `marker cuối = _pause-*` **VÀ** CLEAN) **không bao giờ NO-OP** nếu lượt trước là `/day`. +Bằng chứng cơ chế: probe hiện tại in `dirty=14`, đúng bằng 9 M + **5 untracked** ⇒ untracked CÓ được tính. +Chưa vỡ an-toàn (nghiêng DELTA = đúng chiều), nhưng **claim giá trị của F2/F4 rộng hơn hành vi thật** ⇒ phải khai trong `day.md`, hoặc cho `_day-*` đi theo commit ngay, hoặc trừ chính marker vừa ghi khỏi phép đếm dirty. + +### F-4 (minor) — `Substring(0,8)` cứng ở 2 chỗ + +`:76` và `:87` dùng `$anchor.Substring(0,8)` **không** `[Math]::Min` (khác `:72` đã phòng). Nhánh fallback `in-file-sha` chấp regex `[0-9a-f]{7,40}` ⇒ sha 7 ký tự làm ném `ArgumentOutOfRange` → rơi catch → DELTA `probe-loi:`. Chiều hỏng an toàn, nhưng thông điệp sai lớp (báo "probe lỗi" thay vì sự thật). + +### F-5 (minor) — `Get-Content -TotalCount 8` + họ marker hẹp + +`:50-52` chỉ đọc 8 dòng đầu tìm `ts:`; và regex marker `^_(pause|tiep|snapshot|day)-\d+\.md$` **không phủ họ legacy `resume-*.md`** — vốn vẫn được `tiep.md:106` đếm là đối-ứng hợp lệ. Nếu marker mới nhất là `resume-*`, probe lấy marker CŨ hơn ⇒ anchor cũ ⇒ DELTA (an toàn, nhưng lý do in ra sai). + +--- + +## R4 — 3 chạm + 2 guard → **PASS_WITH_FIXES** + +### (a) r-set ⑤(b) — chạy nhẩm ca `pause=2 / tiep=2 / day=1` + +`tiep.md:104-109` sau sửa: `p = |_pause-*| + |pause-*|` = 2 · `r = |_tiep-*| + |resume-*| + |_day-*|` = 2+0+1 = **3** ⇒ `p > r` **false** ⇒ **không kêu oan** ✅. Ca đối chứng bỏ `_day-*` khỏi r: r=2, p=2 ⇒ vẫn không kêu; ca `pause=2/tiep=1/day=1`: có `_day` r=2 (im) ⟂ không `_day` r=1 (**kêu oan**) ⇒ vế thêm vào là **cần thật**, đúng như comment `:108` mô tả. Cân-sổ cũ **không vỡ**: `_end` vẫn `continue` trọn thư mục (`:103`), `p=0` vẫn `continue` (`:105`), dual-accept legacy vẫn cộng thẳng. +Chiều lỏng ra (r lớn hơn ⇒ ít kêu hơn) là **có thật nhưng đúng ngữ nghĩa**: `_day-*` chỉ sinh ở nhánh CLEAN, tức một lần NỐI hợp lệ. Không tính là lỗi. + +Kiểm chéo bất-biến lớp mềm: `day.md:27` khai "KHÔNG khối lớp-mềm" ⇒ `|block| ∈ {p, p+1}` mà `session_ctx.py:349-358` canh **không bị `/day` chạm** ✅ (đây là chỗ dễ vỡ nhất, và nó không vỡ). + +### 🔴 F-6 (MAJOR) — họ marker `_day-*` **chưa đăng ký**, máy naming-scan sẽ kêu mỗi lần dùng `/day` + +```bash +grep -n RX_SESSFAM scripts/naming-scan.ps1 + -> :49 $RX_SESSFAM = '^_(tiep|pause|snapshot|context-s|mind-s|end)' +powershell: '_day-1.md' -cmatch $RX_SESSFAM -> False + '_tiep-1.md' -cmatch $RX_SESSFAM -> True (control dương) +``` +`naming-scan.ps1:242-250` (bộ 5/7 `moc-phien`) rơi xuống `return @('LECH', 'tep moc phien moi BUOC BAT DAU bang _ ...')` ⇒ **mỗi `_day-.md` = 1 FLAG LECH vĩnh viễn**, mà thông điệp lại SAI (file có bắt đầu bằng `_`). +Doc song sinh cũng chưa vá: `docs/governance/naming-standard.md:115` khai **"7 họ tiền tố hợp lệ"** và liệt đủ 7, **không có `_day-*`**. +⇒ đây là **chỗ chạm thứ 5** mà spec W-1 (3 chạm + 2 guard) không đếm tới. Cùng lớp bài học "vá 1 CLASS phải grep MỌI matcher cùng-lớp": `_day-*` đẻ họ thứ 8 nhưng chỉ đăng ký ở 2/4 nơi biết mặt họ (`day-probe.ps1` biết · `tiep.md` biết · `naming-scan.ps1` KHÔNG · `naming-standard.md` KHÔNG). + +### F-7 (minor) — "ĐÚNG 5 trường như `_tiep-*`" là **sai về tập trường** + +`day.md:27` viết marker `_day-*` gồm `ts · head-sha · verdict · route · jsonl-hint` và gọi đó là "**ĐÚNG 5 trường như `_tiep-*`**". Đo `_tiep-3.md` thật: `ts · head-sha · **window-ordinal** · jsonl-hint · **account-label**`. Đúng số 5, **sai tập** — mất `window-ordinal` (thứ `tiep.md:171` khai là lý do người ta ĐỌC marker) và `account-label`. Chỉ là chữ, nhưng nó là chữ mô tả hợp-đồng file. + +### (b) `CLAUDE.md` câu nới ⟂ YC-018 ONE-SHOT → **KHÔNG mâu thuẫn** + +- Câu mới giữ nguyên "`/tiep` (đường đầy-đủ DUY-NHẤT)" + gắn ngoại lệ **có điều kiện máy** (CLEAN = 0 commit · 0 dirty · 0 sentinel) + "DELTA/ANCHOR-LOST tự nâng về `/tiep` trọn". +- YC-018 ONE-SHOT (bảng W-4 dòng 4) trú ở `session-start.md` + `session-end.md` — **hai cửa BOOKEND**, còn `/day` là cửa **VÀO nhẹ giữa ngày**, không phải bookend ⇒ không giẫm địa phận. Kiểm chéo `check-email.md`: `/day` được xếp vào hàng **DÒ** (rẻ), KÉO vẫn chỉ `/session-start`·`/session-end` ⇒ nhất quán. + +### (c) `pause.md §0` guard — không vòng lặp, không chặn nhầm ca thật + +- Không đệ quy: §0 gọi `day-probe.ps1` (script thuần đọc), **không** gọi lại `/pause`. +- Điều kiện NO-OP là **hội** 2 vế và cả 2 vế đều đọc được từ **một dòng** output (`marker=` + verdict) ⇒ không cần đo thêm. +- Mọi ca còn lại (DELTA / ANCHOR-LOST / marker-cuối-không-phải-pause / probe-lỗi) → chạy tiếp bình thường ⇒ **fail-open đúng chiều**, ca thật không bị nuốt. +- Bất-biến `check-email.md:41` ("thêm bước vào `/pause`·`/tiep` phải đo wall-clock TRƯỚC"): **ĐÃ tuân** — 350ms (tôi đo) / 379ms (họ khai) < 500. **Không** dựng lỗi cộng-dồn: `_stop_point_cheap_owner_S185` ghi rõ owner chấm PASS theo **từng số một** ("machine-block ~140ms, secrets-sweep ~64ms, tien-kiem ~194ms, probe ~281ms"), không theo tổng ⇒ tôi bác giả thuyết "vượt trần" của chính mình. + +--- + +## R5 — Thư hub → **PASS_WITH_FIXES** + +### Stamp + số (đo bằng máy canonical, không tự chế hash) + +```bash +python scripts/stamp_verify.py -> verdict: OK (canonical match) + 9988aa0be... == declared +broadcasts/_index.md:153 hash 9988aa0bee16 == 12 ký tự đầu content_sha256 ✅ +``` + +| Claim trong thư | Đo lại | verdict | +|---|---|---| +| `commits-sau=27` | probe tôi chạy: **27** | ✅ khớp | +| `dirty=6` | nay 14; **tái dựng thời điểm họ đo** = 5 file W-2 + `.session-counter.json` = **6** (W-1 chưa sinh) | ✅ hợp lý, không phải bịa | +| `379ms` | tôi đo 350ms — cùng bậc, số biến thiên theo lượt | ✅ | +| `stop_point_cheap_ms=500` | `memory-budget.json` = **500** | ✅ | +| `_day-*` cộng vào r-set ORPHAN-L | `tiep.md:106` có thật | ✅ | +| §3 detector C15 đã cắm | `governance-detectors.ps1:2307/:2342/:2420` — có, đã fold TOTAL | ✅ | +| fault-inject 4/4 có răng | **KHÔNG tái lập được** (cây tạm đã xoá; `-RepoRoot` có tồn tại nên khả thi về nguyên tắc) | ⚠️ chưa-đo | + +### 🔴 F-8 (MAJOR) — claim "không cần restart" của thư **ngược với 2 artifact nội bộ của chính SE** + +- Thư `:22`: *"command .md **MỚI** hiện trong skill-list **NGAY không cần restart**"*. +- `day.md:39`: *"`/day` gõ-thật = verified-pending-restart (**command .md mới không hot-reload** — cùng chuyến restart slot 73)"*. +- `pause.md:9`: *"🔴 restart Claude Code sau khi **tạo/sửa** command `.md` (no hot-reload)"* — chữ "**tạo**" phủ đúng ca MỚI. +⇒ Ba câu, hai chiều ngược nhau, về **cùng một cơ chế**; và **bản hướng RA NGOÀI là bản mang claim mạnh hơn**. Hub chỉ đọc thư ⇒ nhận đúng vế chưa được chốt. Không phải overclaim G-015 về *việc đã làm* (thư có hedge "gõ-thật = chờ lượt kế"), nhưng là **claim cơ-chế** chưa hoà giải nội bộ. Phải: hoặc hạ về "hiện trong danh sách, hành vi gõ-thật chờ restart", hoặc sửa `day.md:39` + `pause.md:9` cho khớp — **không được để 2 chiều cùng sống**. + +### 🔴 F-9 (MAJOR) — mỏ-neo `error-ledger.md:118` **trỏ hụt** + +Thư `:27` viết: *"Họ hàng `first-run-role-has-diary` đã gửi hub tại `error-ledger.md:118`"*. +```bash +grep -n "first-run-role-has-diary" docs/governance/error-ledger.md -> 143 (đếm: 1 hit duy nhất) +sed -n '116,120p' -> nội dung E-012 slot-reuse, KHÔNG liên quan +``` +Lệch **25 dòng**, và nội dung ở `:118` nói chuyện khác hẳn ⇒ người hub mở đúng dòng sẽ đọc nhầm ca. Đúng lớp "mỏ-neo số dòng trôi" đã ăn đòn nhiều lần — thư ra ngoài nên neo **TÊN mục** (`E-0xx` / chuỗi `first-run-role-has-diary`), không neo số dòng. + +### Cat-6 (văn hướng ra ngoài) — **PASS**, 1 minor +Câu hoàn chỉnh, dấu câu đủ, ngữ pháp đúng; token kỹ thuật giữ nguyên là hợp lệ. **F-10 (minor):** vài nhãn nội bộ chưa giải nghĩa cho người ngoài — "nấc EXECUTED / listed-in-session", "Fact-0 phía SE", "goi-chot 4.3", "dạng-5 tự-ăn-nhân-chứng" đứng một mình. `bẫy-một/bẫy-hai` thì hợp lệ vì lấy từ chính thư hub. + +--- + +## R6 — Bảng DRAFT thẩm quyền → **FAIL** + +Đo trực tiếp `.claude/agent-memory/memory-budget.json` (python, `utf-8-sig`), từng key một: + +| Dòng | Bảng ghi | ĐO THẬT | verdict | +|---|---|---|---| +| 1 | `h24_cadence` 6 · 1 · 3 | 6 · 1 · 3 | ✅ | +| 2 | `h24_title_freshness_sessions` 14 | 14 | ✅ | +| 3 | `stop_point_cheap_ms` 500 | 500 | ✅ | +| 4 | `archive_gate.{autoinject_cap_bytes, **soft_cap_bytes**}` = 25.600 · 30.720 | `autoinject_cap_bytes`=25600 ✅ · **`soft_cap_bytes` KHÔNG TỒN TẠI** (keys thật: `_note, autoinject_cap_bytes, low_watermark_ratio, keep_floor_entries, strike_threshold, value_protect`) | 🔴 **F-11** | +| 5 | `keep_floor_entries` 5 · `strike_threshold` 2 | 5 · 2 | ✅ | +| 6 | `hmw_width.cap` 30 | 30 (mirror `hmw.js:176 WIDTH_CAP=30`) | ✅ | +| 7 | `token_governor` **target 210.000** (thiếu 75.427) | `"210000"` xuất hiện **0 lần** trong `token_governor`; số owner-set thật = `tier1_hotfeed_tokens.lead_tokens` = **380000**. `"75427"` = **0 hit** toàn file | 🔴 **F-12** | +| 8 | `mind_ctx_kb` **32** · `session_ctx_kb` 64 · verbatim 600 | **48** · 64 · 600 | 🔴 **F-13** | +| 9 | `pull_warn_days` "TRỐNG CỐ Ý" | key **vắng** khỏi `memory-budget.json`; nơi khai thật = `check-email.md:48` 🔒 | ⚠️ **F-14** | +| 10 | "mọi key số còn lại" | — | ✅ | + +### 🔴 F-11 (MAJOR) — dòng 4 **bịa provenance**: key `archive_gate.soft_cap_bytes` không tồn tại +`grep "soft_cap"` trong file = 2 hit, **cả 2 nằm trong `_note` văn xuôi**, không phải key. Số 30.720 có thật nhưng là **byte-cap MEMORY.md của sub** (`token_governor` note), **khác nhà, khác nghĩa**. Bảng này sinh ra để làm nơi tra thẩm-quyền ⇒ trỏ key ma là hỏng đúng chức năng. + +### 🔴 F-12 (MAJOR) — dòng 7 sai **cả số lẫn hướng** +Bảng khai owner-SỐ = 210.000 và "đang thiếu 75.427". Đo: không có key nào tên `target`; số owner-set trong `token_governor` là **380.000** (`lead_note`: "ANH-SET 380K (S94 owner-directive), raised 220K→380K"). 210K là con số **headroom** từng dùng trong diary `harness-eval`, **không phải** giá trị của khoá này. Lệch 45% trên một dòng có nhãn "chỉ anh được đổi". + +### 🔴 F-13 (MAJOR) — dòng 8 `mind_ctx_kb` **stale 2 phiên rưỡi** +Đo = **48**, bảng ghi **32**. Chính file có khoá chứng: `_mind_ctx_kb_raise_S167` = *"🔴 OWNER-DECIDED 2026-08-01 (anh: 'Đồng ý phương án nâng trần' — slot (58)): **32→48**"*. Nghĩa là bảng NHÁP trình anh duyệt đang **trả lại cho anh con số anh đã bỏ**, và bỏ đúng bằng một quyết định owner có vết. Đây là ca nặng nhất của R6: bảng thẩm-quyền owner mà chép sai owner-SỐ thì gật cả bảng = **hồi sinh giá trị cũ**. + +### F-14 (minor) — dòng 9 sai **nhà**, đúng **nghĩa** +"TRỐNG CỐ Ý" là đúng (có vết owner @S148, khai tại `check-email.md:48`), nhưng header cột 1 tuyên "nhà = `memory-budget.json` trừ khi ghi khác" mà dòng 9 **không ghi khác** ⇒ người tra mở JSON sẽ thấy **vắng key** và không phân biệt được "cố ý bỏ trống" ⟂ "chưa ai đặt". + +### Cột 2 (owner-LUẬT) — soi provenance, 10/12 có vết thật +Đối chiếu được ngay trong phiên: dòng 1 (`_sealed_P3B_S181` có trong JSON) · dòng 9 (ring5 @S185 — chính diff này) · dòng 11 (`check-email.md:41` bất-biến **vẫn nguyên văn sau sửa của W-1**, hunk chỉ chạm `:35`) · dòng 7 (C15 fold TOTAL — verified ở R5). Dòng 6 để trống ô "lệnh anh gần nhất" (`—`) là **khai thật, không bịa** ✅. Không dựng lỗi ở cột này. + +--- + +## Tổng kết verdict + +| Trục | Verdict | Finding | +|---|---|---| +| R1 ring5 persona | PASS_WITH_FIXES | F-1 (MAJ), F-2 (m) | +| R2 wire ring5 | **PASS** | — (29 = 29, 4/4 chỗ, không sót chỗ 5) | +| R3 day-probe.ps1 | PASS_WITH_FIXES | F-3 (MAJ), F-4 (m), F-5 (m) | +| R4 3 chạm + 2 guard | PASS_WITH_FIXES | F-6 (MAJ), F-7 (m) — cân-sổ + ONE-SHOT + guard đều SẠCH | +| R5 thư hub | PASS_WITH_FIXES | F-8 (MAJ), F-9 (MAJ), F-10 (m) | +| R6 bảng DRAFT | **FAIL** | F-11, F-12, F-13 (đều MAJ), F-14 (m) | + +**Tổng: 8 MAJOR + 6 minor = 14 finding.** Không có CRITICAL (không có gì mất dữ liệu / vỡ an-toàn; mọi nhánh máy đều nghiêng DELTA đúng chiều). + +**Chặn commit hay không:** R6 là thứ **duy nhất** tôi đề FAIL — vì đó là bản NHÁP **sắp trình anh gật một lượt**, mà 3 dòng sai đều là owner-SỐ (F-11 key ma · F-12 lệch 45% · F-13 stale sau quyết định owner có vết). Gật nhầm = ghi đè quyết định cũ của chính anh. 5 trục kia commit được sau khi khai F-3/F-6/F-8/F-9. + +## Phản-chứng đã chạy (bác giả thuyết của CHÍNH TÔI — giữ để đừng lặp) + +1. **"Tổng thời gian `/pause` vượt 500ms"** → **BÁC**. `_stop_point_cheap_owner_S185` liệt từng số một và owner chấm PASS **per-step**, không per-sum ⇒ day-probe 350-379ms là hợp lệ. Không dựng lỗi giả. +2. **"ring5 sót ở writeGuard `hmw.js:251`"** → **BÁC**. ring1/2/4 cũng vắng ở đó ⇒ tiền lệ, không phải gap của W-2. +3. **"`_day-*` làm lỏng cân-sổ ORPHAN-L"** → **BÁC (một nửa)**. Có lỏng, nhưng đúng ngữ nghĩa vì `_day-*` chỉ sinh ở nhánh CLEAN. Ca `pause=2/tiep=1/day=1` chứng minh vế thêm là **cần**, không phải nới bừa. +4. **"thư khai `dirty=6` mà nay 14 ⇒ số bịa"** → **BÁC**. Tái dựng thời điểm: 5 file W-2 + counter = đúng 6. + +## Thước hỏng của TÔI trong lượt này (ghi để không tái phạm) + +- `python s.index(']')` cắt mảng JS **trúng `]` trong comment** ⇒ đếm VALID_ROLES ra 18 thay vì 29 (hụt 38%). Phải cắt theo **dòng** `^\]`, và luôn in cả danh sách để mắt soi. +- `grep -rn` không giới hạn glob trên repo này **treo quá 120s** ⇒ dùng Grep tool / khoanh `--include`. + +END diff --git a/CLAUDE.md b/CLAUDE.md index 48624de..7f9209f 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -18,7 +18,7 @@ Kiến trúc: **.NET 10 Clean Architecture + 2 React FE (admin + user) + SQL Ser 5. docs/workflow-contract.md ← ⭐ State machine 9 phase HĐ — base pattern cho PE workflow ``` -> ⛓️ **Mạch việc dở (H22):** nằm ở `.claude/WAL.md`; nối lại DUY-NHẤT bằng `/tiep` — kể cả khi anh gõ "làm tiếp" bằng text thường. Không tự recovery cách khác. (Chốt dừng chủ-động = `/pause`; cơ-chế → `docs/governance/harness-11-engine.md` PHẦN N.) +> ⛓️ **Mạch việc dở (H22):** nằm ở `.claude/WAL.md`; nối lại bằng `/tiep` (đường đầy-đủ DUY-NHẤT) — kể cả khi anh gõ "làm tiếp" bằng text thường. Không tự recovery cách khác. **Ngoại lệ hẹp @S185 (YC-021/W-1):** ca **đầu-ngày-sau-điểm-dừng-SẠCH** được `/day` dậy-nhẹ — CHỈ khi máy `day-probe` chứng **CLEAN** (0 commit sau chốt-dừng · 0 dirty · 0 sentinel); DELTA/ANCHOR-LOST tự nâng về `/tiep` trọn. (Chốt dừng chủ-động = `/pause`; cơ-chế → `docs/governance/harness-11-engine.md` PHẦN N.) > 🔴 **Nghi-thức 2 đầu phiên = ONE-SHOT (YC-018 anh chốt @S185, nguồn thư hub 08-08 Phần 1b):** bookstart + bookend chạy **trọn MỘT LƯỢT**, CẤM lấy `/pause`·`/tiep` làm nhịp chia-chặng nghi-thức, CẤM hẹn-vòng-cửa-sau; đứt bất-khả-kháng ⇒ lượt-nối đầu tiên chạy HẾT phần thiếu. Luật sống ở đầu [`session-start.md`](.claude/commands/session-start.md) + [`session-end.md`](.claude/commands/session-end.md) — dòng này CHỈ TRỎ (B1). > 🎛️ **Chế-độ đang hiệu-lực (operating-posture) — TRA Ở ĐÂU** *(adap đợt-11, `3-khoan:31-41` discoverability-home ⟂ implement-home)*: diff --git a/broadcasts/_index.md b/broadcasts/_index.md index d9ea736..2e0aed2 100644 --- a/broadcasts/_index.md +++ b/broadcasts/_index.md @@ -150,3 +150,4 @@ | 2026-07-25 | 2026-07-25-se-to-ai_infra-bao-nac-adap-backlog-va-probe-opus5 | se → ai_infra | outbox/ai_infra | 3a05a6cc8509 | | 2026-07-26 | 2026-07-26-se-to-ai_infra-model-default-probe-opus5 | se → ai_infra | outbox/ai_infra | d432f5eab5cd | | 2026-07-26 | 2026-07-26-se-to-ai_infra-ctx-adopt-executed-va-datum | se → ai_infra | outbox/ai_infra | aedd7fb67405 | +| 2026-08-10 | 2026-08-10-se-to-ai_infra-report-day-wake-2-de-xuat-dinh-chinh-v5 | se → ai_infra | outbox/ai_infra | 0cbaccaafa73 (re-stamp F-9) | diff --git a/broadcasts/outbox/ai_infra/2026-08-10-se-to-ai_infra-report-day-wake-2-de-xuat-dinh-chinh-v5.md b/broadcasts/outbox/ai_infra/2026-08-10-se-to-ai_infra-report-day-wake-2-de-xuat-dinh-chinh-v5.md new file mode 100644 index 0000000..7d13893 --- /dev/null +++ b/broadcasts/outbox/ai_infra/2026-08-10-se-to-ai_infra-report-day-wake-2-de-xuat-dinh-chinh-v5.md @@ -0,0 +1,33 @@ +--- +id: 2026-08-10-se-to-ai_infra-report-day-wake-2-de-xuat-dinh-chinh-v5 +from: se +to: ai_infra +category: Governance +type: report +date: 2026-08-10 +content_sha256: "0cbaccaafa732ef090d881ce8aa404e7fb60a89da5c3d5385a44b36733c2f04b" +nac: sent +--- + +# Report 3 món: day-wake executed · 2 đề-xuất-ngược eval-quality · đính-chính V5 + +Chào hub. Thư gộp 3 món, mỗi món có số đo SE tự đo trên SE (2026-08-10, owner-gate = YC-021 chủ dự án chốt trực tiếp). + +## 1. Day-wake (`2026-07-28-...-probe-first-resume`) — nấc EXECUTED, 4/4 floor + +- **F1+F3 = máy `scripts/day-probe.ps1`** (chỉ-đọc, luôn exit 0): marker cuối theo **ts-trong-file** (không mtime) · anchor = **commit-chốt-dừng** (commit ADD marker; fallback head-sha — bẫy-một của thư tránh được, đo thật: anchor resolve đúng seal-commit) · kiểm sống + tổ-tiên HEAD (bẫy-hai: SE có squash closeout nên bẫy này THẬT với SE) · 4 tín hiệu {commit-sau · dirty toàn-bộ-không-allowlist · (run-folder phủ bởi 2 cái trên) · sentinel `closing:`} · nghiêng an-toàn: mọi lỗi probe = DELTA. +- **F2 = guard bước-0 cả 2 lệnh cũ** (`pause.md §0` no-op-khi-trùng-dừng-sạch · `tiep.md` ghi chú route-dậy-nhẹ) + cửa thoát `/day full`. +- **F4 = marker `_day-.md`** 5-trường mỏng, cộng vào phép cân-sổ ORPHAN-L (`tiep.md §0 ⑤(b)` r-set — thiếu vế này thì chuỗi pause→day→pause kêu oan p>r) + falsifier 2 chiều ghi trong lệnh (CLEAN-giả soi được bằng rev-list; luôn-DELTA soi được từ dãy marker). +- **Số đo:** dogfood-TAY probe trên repo thật = `DELTA | commits-sau=27 | dirty=6 | 379ms`; fault-inject cây tạm **4/4 có răng** {CLEAN · DELTA-sentinel · DELTA-thật · ANCHOR-LOST in LOUD kèm route}; mọi lượt 194-379ms < ngưỡng owner `stop_point_cheap_ms=500` (owner đặt cùng ngày — goi-chot 4.3 của SE nhờ đó lật PASS sau 22 ngày treo). +- **Nấc trung thực:** lệnh `/day` = **listed-in-session** (data-point: command .md MỚI hiện trong skill-list NGAY không cần restart — cùng lớp tiền lệ S107 agent-mới-hot-reload; trái phép đo no-hot-reload S120/S121 vốn đo trên EDIT-command. Môi trường phân biệt MỚI ⟂ SỬA). Gõ-thật `/day` + self-check ca-3/4/5 của thư = chờ lượt dậy thật kế. Hub sẽ nhận update khi có số CLEAN-đúng/DELTA-giả thật. + +## 2. Hai đề-xuất-ngược (từ adap eval-quality `2026-07-21`, mục 9 report SE — owner duyệt gửi @YC-021/W-4) + +- **(a)** Đưa **dạng-5 "tự-ăn-nhân-chứng"** vào câu-3 của khung eval-của-eval (4 dạng → 5): ca đo được phía SE — một phép "vá" làm biến mất đúng cái ô đang làm chứng cho phép đo (flag-count giảm trông y hệt thành công), 4 dạng hiện tại không chứa nó. +- **(b)** Thước **"bề-mặt-đo có được cập-nhật không"**: Fact-0 phía SE — việc chạy xong 3 ngày mà 2 chỗ văn-bản vẫn ghi "pending", **0 thước nào phát hiện**. Họ hàng `first-run-role-has-diary` đã gửi hub tại `error-ledger.md:143` (reviewer-gate SE bắt neo `:118` sai ở bản nháp — re-stamp trước khi bạn pull) và đang chờ hub canonical — SE không tự chế detector riêng để tránh 2-nguồn. + +## 3. Đính-chính V5 trong `2026-08-07-se-to-ai_infra-upgrade-pack-phased-bao-cao-cuoi` + +Dòng `:79` bản đã gửi ghi *"V5 vị-từ mã-hoá: dòng người điền, chưa cắm máy"* — **hết đúng từ 2026-08-09**: máy đã cắm (`governance-detectors.ps1` detector C15, rank-1 U+FFFD-mất-dữ-liệu ⟂ rank-2 mojibake; đo thật 13 file/26 hit rank-1, đã fold vào TOTAL theo owner YC-020). SE **không sửa file đã gửi** (đúng bài-5 thư 08-08 của chính hub — artifact đóng băng giữ nguyên); đính chính tại đây là bản có hiệu lực. + +— se, 2026-08-10. Mọi số kèm nguồn trong repo SE; artifact đầy đủ: `runs/2026-08-09-S185-*` + `scripts/day-probe.ps1` + `.claude/commands/day.md`. diff --git a/docs/STATUS.md b/docs/STATUS.md index db17ca2..1533b6a 100644 --- a/docs/STATUS.md +++ b/docs/STATUS.md @@ -475,7 +475,7 @@ monthly re-tier mega-line + ef-core SKILL Mig→59 + 3 vocab-fork (2026-07-01 du | 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 | **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). | +| Sub-agents | **29** | **+S185 🔬 `ring5-audit`** (vòng-6 nghi-thức cửa phiên — slot (41) ĐÓNG, YC-021/W-2 anh chốt "đồng ý thêm 1 nghi thức"; KIỂM output `tien-kiem-cua` + bảng-nhãn `ritual-labels` 4-nhãn, quyền **đề-nghị-XOÁ-ÁN** khi nhãn nhầm lớp — khác 3 ring kia; wire `session-end §L.b(m)` + `hmw.js` VALID_ROLES 28→**29**; ✅ nấc = **verified-runtime @S185 CÙNG PHIÊN** — registry hot-reload agent-MỚI [data-point lần 2 sau S107, MỚI ⟂ EDIT] + spawn-probe ALIVE fail-closed đúng ngưỡng; KHÔNG cần đợi restart 73) **+S176 🎨 ĐỘI STYLE 3 vai** (`front-end-reviewer-style` · `back-end-reviewer-style` · `database-reviewer-style` — **anh chốt TRỰC TIẾP**, không qua adap). 🔴 **Luật lõi anh giao:** *"quy tắc thì các tính năng đã deploy thành production rồi thì sẽ là chuẩn, trừ khi tao có điều chỉnh lại lần nữa"* — lý-do sinh đội là câu *"mày cứ làm đi làm lại hoài"*. **Ca THẬT làm anh nêu:** S176 vòng-4b lead dựng thùng rác KHKK **thiếu banner + dấu `🗑 xóa ≈`** trong khi màn thùng rác Duyệt NCC **đã chạy prod** có đủ cả hai ⇒ anh phải tự chụp màn gửi sang bảo *"ảnh chỉ là mẫu"*. Trục = **ĐỒNG-NHẤT** (có giống bản đã chạy không) ⟂ `reviewer` = **ĐÚNG-SAI** (có bug không) ⇒ chạy SONG SONG, không giẫm. Địa-phận RỜI theo glob diff: `fe-*/src/**` · `src/Backend/**` trừ `Persistence/**` · `Persistence/**`; **gọi theo diff chạm đâu**, diff không chạm ⇒ KHÔNG gọi (không phải bỏ sót). 🧊 **Anh nêu ban đầu 4 con** (có `clean-code-reviewer-style`) **rồi tự chốt lại 3** (*"3 con tao nhầm"* + *"chốt theo ý mày"*): con clean-code phủ chồng cả 3 con kia nên **không viết nổi câu scope-rời** mà roster này bắt buộc ⇒ trục clean-code (đặt tên · trùng lặp · mật-độ comment · pattern drift) **gộp vào từng con trong địa phận của nó**. 🔸 **Máy trước, vai sau** (đo S176): FE có ESLint chạy trước (`npm run lint`) nhưng **CI KHÔNG gác** (`grep 'npm run lint'` trong workflows = **0 hit**) và đang tồn **89 vấn-đề / 78 lỗi** (fe-admin 42 · fe-user 47); **BE 0 máy style nào** (0 `.editorconfig` · 0 analyzer · 0 `dotnet format`) ⇒ con BE gánh cả lớp cơ-học, khác con FE — 🧊 **đây là SỐ ĐO NGÀY 2026-08-06 (S176), giữ làm LINEAGE có ngày, KHÔNG phải trạng-thái hiện-hành**; nguồn sống = phép-đo per-spawn trong `back-end-reviewer-style.md` §0 (SỬA-6a @S179: claim này từng chép ra **4 site** ⇒ cắm `.editorconfig` là 4 chỗ sai cùng lúc, detector chỉ so SỐ nên không bắt). Cắm được máy vào CI thì **PHẢI cập-nhật lại persona con BE** trả lớp đó về máy. ⚠️ **~~roster 26 > `hmw_width.cap` 20~~ ✅ **ĐÓNG @S181: cap 30, roster 23 ≤ 30 ⇒ 0 lane bị bỏ**** ⇒ full-roster-sweep LOUD-skip nhiều lane hơn trước — số cap = quyền anh (O-7 vẫn treo, nay lệch rộng hơn). 🔸 **Nấc = executed-file / verified-pending-restart** — 3 vai CHƯA spawn-probe; `hmw.js` VALID_ROLES 23→**26**. **+S153 bộ-ba vòng Ctx** (adopt thư `0df10df4` — 🔄 **OWNER-VETO @S153 hub-form 3-vai**: bản đầu (38)(a) 1-vai OWNER-DELEGATED→LEAD-DECIDED, **anh bác cùng ngày** chốt trực tiếp *"Build đủ 3 vai như hub"* qua AskUser = owner chốt THẬT cho quyết này; 🔄 **RENAME cùng phiên theo lệnh anh** *"đặt tên giống hub và sisters để dễ audit"* — tên khai-sinh `ctx-pause-check`/`ctx-reload` → **hub-form `ctx-curator`/`ctx-verifier`** [đo đĩa 3 nhà: hub = curator/verifier/audit · VIPIX = check/reload/chain · hub≠sister ⇒ SE theo HUB-form, tiền lệ rename S149 lead-*]): **`ctx-curator`** vai-1 KIỂM nháp @mỗi-`/pause` (carve-out `pause.md §1` mirror hub O-1(a)) · **`ctx-verifier`** vai-2 ĐỐI-CHIẾU+NẠP-LẠI @mỗi-`/tiep` (dòng `LEAD-PHAI-NHAC-LAI:` = bằng-chứng nội-dung) · **`ctx-audit`** vai-3 SOI-CHUỖI @2-bookend (kiểm-vết vai-1/2, hồi-tố = fallback phiên 1-cửa). Nấc: ctx-audit `file-land + registry-surfaced @S153` cho CẢ 3 vai ctx [🔄 vá @S153 FLAG-6: bản đầu chỉ cấp nấc này cho `ctx-audit` trong khi `hmw.js:42` + writeGuard + README `:27`/`:199`/`:200` chứng 2 vai mới ĐẠT CÙNG nấc — khai THIẾU vẫn là lệch] — spawn-probe ALIVE cả 3 = phiên sau restart T9; hmw VALID_ROLES 20→**23** + writeGuard :228/:235; ⚠️ **roster 23 > `hmw_width.cap` 20** ⇒ full-roster-sweep LOUD-skip 3 lane cuối — số cap = quyền anh, O-7 (câu (40) đang treo). **🔄 RENAME @S149 (anh ratify "OK đồng ý"): 5 vai đổi tên đồng-bộ sister — `tooling-harvest-audit`→`ring1-audit` · `h24-audit`→`ring2-audit` · `sleep-audit`→`ring4-audit` · `lead-view-auditor`→`lead-stale-auditor` · `lead-omission-auditor`→`lead-gap-auditor` (ring* = 2 sister TRÙNG tuyệt đối; lead-* = hub-form, VIPIX-form là prefix). Nấc **NÂNG @cùng-phiên: `registry-listed-in-session`** — harness list 5 tên MỚI + gỡ 5 tên CŨ NGAY TRONG PHIÊN S149 (không restart), **TRÁI phép đo S120/S121 no-hot-reload** (môi trường có thể đã đổi — đây là data-point ĐO ĐƯỢC, không suy). Spawn-probe vẫn CẦN để chứng instantiate (list ≠ spawn được — đúng 0.6b). Tên cũ trong narrative/runs/history = vết lịch-sử, CỐ Ý giữ.** **+S145 🔬 `ring1-audit` (18th sub — round-KIỂM vòng tooling/harvest, C4/C4b adap dot-11 khoản ① `harness-dong-du-vong:51`, owner-decision [2] TÁCH mỗi-vòng-1-con-KHÔNG-gộp). Vai-KIỂM ĐỘC-LẬP đọc OUTPUT H1 `tooling-auditor` (4-mặt freshness) + H2 `harvest-curator` (5-trục integrity), **KHÔNG re-chạy đo**: verdict per-claim ĐẠT/TRƯỢT + falsify ≥2 + **tự tái-dựng ≥1 số CÓ-THỂ-SAI** (đếm `.claude/agents/*.md` vs roster-count H1 · N-harvested/M-spawned) + **thách-CLEAN** (H1 PASS/H2 GATE-0 → mở 1 skill "fresh"+1 sub "harvested" xem thật). 🔴 no-self-exempt ≠ H1/H2 (m-3 S139). **AUTO fire-after-measure @session-end §L.b(g-bis)** — owner-chốt S145 KHÔNG consent-gate (KHÁC trio/H24), fail-safe NO-OP nếu H1/H2 không chạy phiên đó (CẤM ĐẠT-ảo); tuần-tự C4b (invocation SAU con-đo, mtime chứng). Propose-only, backstop = git-diff commit-gate (KHÔNG dựa thiếu-tool `[carry:tools-whitelist-no-teeth]`). `model: opus`+`effort: max`+`memory: project`+`maxTurns: 16`. **Vai #1/3 round-KIỂM** — `ring2-audit` (vòng soi-lead) + `ring4-audit` (vòng nén-ngủ) land dần incremental (§6 broadcast báo-nấc-per-vòng, owner S145). 🔴 **Nấc = executed-file / verified-pending-restart** — registry Agent-tool KHÔNG hot-reload (`agents/README` §Memory discipline — anchor không-số-dòng, vá cite-dòng-trống @S151 per H1 F-3), spawn-probe alive cần **restart CLI**; run-thử-thật @session-end phiên sau. Design-doc: `runs/2026-07-22-S144-adap-dot-11/C4-design-3-vai-kiem.md`.** **+S145 🔬 `ring2-audit` (19th sub — round-KIỂM vòng soi-lead H24, vai #2/3 C4/C4b). Đọc OUTPUT `lead-stale-auditor` + `lead-gap-auditor` (🔴 KIỂM 2 con-đo H24, **KHÔNG soi lead trực-tiếp**) → verdict per-FLAG + tự tái-dựng ≥1 số (flag-count · mở 1 FLAG đối-chứng source · `class_repeat` `.session-counter.json`) + **thách-CLEAN** (H24 báo ít/0 FLAG ⇒ tự soi 1 surface tìm FLAG sót — CLEAN "lead ổn" là ca nguy nhất, khớp H24 §2(1) phép-thử-nhanh). Verify vai H24 KHÔNG tự chế class ngoài enum ĐÓNG `flag_classes`. no-self-exempt ≠ lead-stale/lead-gap (m-3; tên mới @rename S149). AUTO wired `session-end §L.b(j)(ii-bis)` sau cặp H24; fail-safe NO-OP nếu H24 không chạy (nhịp/consent). `maxTurns: 16`.** **+S145 🔬 `ring4-audit` (20th sub — round-KIỂM vòng nén-ngủ, vai #3/3 C4/C4b). Đọc OUTPUT `/sleep-recovery-memory-l2` (`.gist.md` mới + Fidelity verdict + claim giảm-byte) → verdict per-claim + **tự ĐO LẠI byte** archive gốc vs gist (đối-chứng claim) + **thách-CLEAN** (Fidelity 5P/0F ⇒ mở 1 gist đối-chứng `.md` gốc xem có giữ 4-field load-bearing hay nén quá tay) + kiểm bất-biến gist-ADDITIVE (gốc byte-identical). no-self-exempt độc-lập lượt nén (m-3). AUTO wired `sleep-recovery-memory-l2.md Phase 4.5` sau nén; fail-safe NO-OP nếu 0 gist tươi. `maxTurns: 16`.** **+S141/S142 🧪🧭🧮 `harness-eval` + `harness-refine` + `harness-audit` (15th–17th sub — bộ-ba đồng-kiểm HỆ MEMORY, adopt AI_INFRA khuôn 5-câu `58e28bae` khối B, wave adap đợt-9/10; land S141 persona+seed+`hmw.js` VALID_ROLES 14→17, wiring nghi-thức S142 vòng-2 sau khi vòng-1 chết giữa chừng). Read-only INFORM-only propose-only, frontmatter **không khai Write/Edit** — 🔴 nhưng đo S143: **runtime VẪN cấp** (append cuối tool-list, 9/9 vai read-only; nhân-chứng `reviewer` đã Write+Edit thật) ⇒ đây là **tuyên-bố ý-định**, KHÔNG phải chặn-bằng-thiếu-tool; containment thật = single-writer + git-diff commit-gate · `model: opus`+`effort: max`+`memory: project`+`maxTurns: 18`. Trục = **CHÍNH HỆ MEMORY**, chạy **TUẦN TỰ** eval→refine→audit (🔴 CẤM `parallel()` — con KIỂM chạy song song sẽ chấm bản CŨ ⇒ verdict vô-nghĩa): `harness-eval` = con **ĐO** (chỉ trả số nguyên-văn từ instrument, CẤM số-từ-trí-nhớ) ⟂ `harness-refine` = con **ĐỀ-XUẤT** (4 lớp reinject/promote/archive/distill, bắt buộc có mục "đã cân-nhắc→BÁC") ⟂ `harness-audit` = con **KIỂM** (verdict ĐẠT/TRƯỢT per-claim + re-chạy ≥2 số load-bearing; PIN run-folder đích-danh, CẤM tự tìm "run mới nhất"). 🔴 **KHÔNG gộp** với H1 tooling-freshness / H2 harvest-integrity / H24 lead-surface / reviewer diff-code — 4 trục khác nhau. Nghi-thức 2-đầu-phiên **AUTO 1 vòng/phiên GIỮA 2 bookend** (`session-start §2.1.9(a)` canonical + `session-end §L.b(k)(i)` trỏ): owner chốt @S151 — em-main IN 1 dòng trạng-thái rồi CHẠY, KHÔNG chờ gật [🔄 vá @S153 FLAG-4 HIGH: ô này còn khai "consent-gated + anh gật mới chạy" sau khi owner (32) đã lật AUTO, và ngược chính `:466` cùng file; trio đã chạy THẬT 3 vòng S151/S152/S153]; skip → ghi vết WAL `trio: skipped S` (vết-2-lớp, chuỗi skip nhìn thấy được). Budget seed đo TƯƠI `measure-agent-memory.ps1`: eval 1547B · refine 1616B · audit 1513B (l2_*=0 = SEED-STATE đúng, chưa chạy lần nào). 🔸 **Nấc trung-thực = executed-file / verified-pending-restart** — 3 vai CHƯA spawn-probe lần nào (cần restart CLI + anh consent; KHÔNG được đọc thành verified-runtime).** **+S121 👁 `lead-stale-auditor` + `lead-gap-auditor` (13th+14th sub — H24 lead-self-audit, adopt broadcast `2026-07-14-Governance-harness-24`, anh chốt S119 `owner-decisions-15-07-2026`, land S121 wave-W2 `hmw.js` VALID_ROLES 12→14 CÙNG COMMIT roster+STATUS [R3-M2: lệch landing ⇒ C2/B3 flag mọi derived ghi "14" là stale-vs-12 ⇒ detector BÃO trên chính thay đổi của H24]). 2 monitor INFORM-only propose-only, cookie-cutter frontmatter monitor sẵn (`model: inherit` lúc-land [S124 re-pin → `opus`+`effort:max` cùng toàn roster] · `memory: project` · `maxTurns: 18` · 8 tool read-only, **NO Write/Edit**). Trục: `lead-stale-auditor` = **view LỆCH source** (5 class `view-*`) ⟂ `lead-gap-auditor` = **cái BỊ THIẾU** (6 class `gap-*` — +`gap-incident-unrecorded` @S143 owner-duyệt) — 🔴 **KHÔNG gộp** vào tooling-auditor(H1 tooling-freshness)/harvest-curator(H2 harvest-integrity): H24 §2(1) *"gộp là mất tiêu-điểm; cái ta cần là cặp mắt CHỈ dành cho lead"*. Class-flag = **enum ĐÓNG** `lead_self_audit.flag_classes` ở `.claude/agent-memory/memory-budget.json` (11 class = 5+6, vai CẤM tự chế — mở enum là quyền owner). Nhịp = `h24_cadence` cùng file (single-source H24 §2(3) — doc TRỎ key, KHÔNG chép số ⇒ 🔄 **đã GỠ digits `{6/15/3}` @S153** theo `ring2-audit` R-3: chép số ngay cạnh câu cấm-chép-số là **B1-copy** [số vẫn KHỚP canonical nên KHÔNG phải stale — F-6 chống vu-oan]; đọc số sống ở `memory-budget.json → h24_cadence`); 🔄 **HÌNH B @S149**: cặp soi-lead spawn **VÔ-ĐIỀU-KIỆN 2 bookend mỗi phiên** — `light_every` hạ thành **stats-only** (KHÔNG còn cổng bắn), `deep_every` GIỮ cổng nhịp [vá @S153 FLAG-5: ô này còn mô-tả bắn thuần-cadence; đối-chứng hành-vi = cặp chạy @counter 27 với light 1/6 CHƯA tới hạn]; counter `.claude/governance/.session-counter.json` (content-based `last_ticked_head`, KHÔNG blind-increment — hook `wal-flush.ps1` auto-commit `agent-memory/` mỗi turn sẽ làm hỏng đếm mù; đặt ngoài **4 path** hook CÓ CHỦ-ĐÍCH — *hook nới từ 3 lên 4 @S146 khi thêm `.claude/sessions/`; mệnh-đề "governance/ nằm ngoài" đã RE-VERIFY sau khi nới, vẫn đúng*). ✅ **verified-runtime S122** (spawn-probe toàn-roster-KHI-ĐÓ SỐNG post-restart — **N=14 tại thời-điểm S122**, chứng runtime, §Recently-Done S122; 🔸 +3 trio S141 CHƯA nằm trong phép đo này) **+ chạy THẬT S124** (dogfood 2-vai đầu-tiên, owner-triggered @counter 3) **+ S137** (light-audit consent OVERDUE 8/6 → 2 FLAG view-stale-status + 1 FLAG gap-decision-sunk). 🔸 Residual THẬT giữ: đường `hmw.js→agentType` cho 2 vai H24 chưa exercise (Agent-tool path đã chứng; workflow-path chưa) [S137 view-audit lật ⚠️→✅ khớp source, giữ residual]. 🔸 Từ-vựng "view"/"omission" chọn có chủ-đích tránh va-chạm: `governance-detectors.ps1:15` đã sở-hữu `derived-staleness`, và "GAP" quá-tải (`session-end` build-gap · `memory-selfimprove-audit.ps1` CRITERIA+GAP).** **+S107 📄 `office-document` (12th sub — Office document WRITE specialist: docx·xlsx·pptx·pdf + form-engine; floor OD1–OD10; VALID_ROLES hmw.js 9→10; anh giao trực tiếp S107 "Sub chính" Office; ✅ **verified-runtime S107 CÙNG PHIÊN** — registry hot-reload agent MỚI giữa phiên [S27 lesson thu hẹp còn EDIT-agent/command] + spawn-test PASS OD1/OD4/OD5 template thật, model self-report `claude-fable-5` [data-point #5 flip-8]; finding: 2 template `wwwroot/templates` 0-placeholder mẫu-blank).** **worker-tier-pin (owner-decision S124 2026-07-15 — thay all-inherit H8 S66, trước nữa two-tier H4; sub TOÀN-ROSTER pin cứng KHÔNG theo lead; H23-precedence ĐO S126: spawn-param THẮNG hard-pin ⇒ `/fable-real` SỐNG). Lead = **DEFAULT Opus 5 MAX** (thư `9c909007` @S149 (re-stamp 07-25 G-024a; pre `59ce1d0f`); **anh chốt ô canonical hiển-thị DEFAULT-fleet @S151** — *"cần gọi Fable tao chọn đầu mỗi phiên hoặc gọi bằng command fable-real"* ⇒ Fable = anh `/model` đầu phiên HOẶC per-invocation `/fable-real`; runtime thật = BƯỚC 0.6 probe mỗi phiên, KHÔNG ghi sổ mỗi flip — hết class stale-2-flip ring1 bắt @S150). 🧊 Lineage owner-choice/flip-chain FROZEN tới flip-8 (flip-9 S119 Opus-4.8 owner-choice + các lượt /model sau = per-session không enumerate, anti-churn S106):** em main Fable 5 (1M) Max (✅ **Fable RESTORED S98 2026-07-02** — lead self-report `claude-fable-5` + settings `claude-fable-5[1m]`; fallback-Opus H5 S62→S97 kết thúc, H5.6 hoàn tất) ⚠️ **S101 2026-07-03: runtime lead = Opus 4.8** (lead + 2 monitor + WF2 reviewer inherit đều self-report `claude-opus-4-8`; settings vẫn pin `claude-fable-5[1m]` → **Fable unavailable phiên này → H5-fallback tự-kích, revert-free, KHÔNG sửa frontmatter**; "Fable RESTORED S98" = point-in-time KHÔNG phải steady-state — inherit-chain resolve theo availability runtime; ✅ **S102 2026-07-06: Fable VỀ LẠI runtime** — lead + 2 monitor inherit self-report `claude-fable-5` → H5-fallback S101 kết thúc, pattern availability per-session xác nhận [S98 Fable → S101 Opus → S102 Fable → **S103 Opus** → **S104 Opus** (2026-07-06 Fable outage tiếp — S104 lead + 2 monitor spawn self-report `claude-opus-4-8` ×3, H5-fallback revert-free) → ✅ **S105 Fable** (2026-07-07 Fable VỀ lần 3 — lead + 2 monitor self-report `claude-fable-5` ×3, runtime-verified) → ⚠️ **S106 Opus** (2026-07-07 Fable outage lại — lead runtime self-report `claude-opus-4-8`, H5-fallback revert-free; flip-7) → ✅ **S107 Fable** (2026-07-10 Fable VỀ lần 4 — lead + 2 monitor self-report `claude-fable-5` ×3, runtime-verified; flip-8)], BƯỚC 0.6 probe mỗi phiên; per-session KHÔNG steady-state. 🔴 **[§Sub-agents = CANONICAL single-owner flip-chain — S106 gộp per anh-confirm; derived `agents/README §Architecture` · `session-start BƯỚC 0.6` · `session-end §commit-format` trỏ về đây [🔄 vá @S153 FLAG-1: 3 cite số-dòng cũ `:3`/`:37`/`:113` đo lại SAI cả 3 (đúng là `:5`/`:48`/`:315`) — vá bằng BỎ số theo luật đã áp @S151, không ĐỔI số], KHÔNG tự enumerate mỗi flip → chống churn 4-file/flip]**) · **TOÀN roster `model: opus` + `effort: max`** (worker-tier-pin S124; **A2 đo S126:** lane no-tier resolve `claude-opus-4-8` DÙ lead=Fable ⇒ pin ăn runtime, hết inherit-lead; số vai = cột giữa của chính row này — KHÔNG chép lại vào narrative, đó là cách row-14 và narrative-12 lệch nhau từ S121 tới S122; lineage: 7 demoted flip S66 → all-inherit S66–S123 [office-document S107 inherit-born] → pin S124) · effort Max. 10 product/quality + monitor INFORM-only (H1 · H2 · 2×H24 S121 · 3×trio-memory S141 · 3×round-KIỂM `ring1-audit`/`ring2-audit`/`ring4-audit` S145) — **liệt-kê NHÓM, số vai = cột giữa của chính row này**. Nấc H8 = **runtime-verified S98 (2026-07-02)** — spawn-test inherit-chain ×2 monitor self-report `claude-fable-5` (cả đội tự lên Fable khi lead restore, 0 sửa frontmatter — đúng thiết kế all-inherit). Prev two-tier H4 runtime-verified S57bis (spawn-test 2 chiều). | | 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). diff --git a/docs/governance/bang-tham-quyen-owner-DRAFT.md b/docs/governance/bang-tham-quyen-owner-DRAFT.md new file mode 100644 index 0000000..8442d31 --- /dev/null +++ b/docs/governance/bang-tham-quyen-owner-DRAFT.md @@ -0,0 +1,38 @@ +# Bảng thẩm-quyền owner — BẢN KÊ NHÁP (W-4 YC-021, kê @S185 chờ anh gật/sửa 1 lượt) + +> **Nguồn gốc:** thư hub `2026-07-21-Governance-eval-quality-audit` đề bảng 2 cột {owner-SỐ · owner-LUẬT}; bảng dựng @S149 (`runs/2026-07-25-S149-adap-backlog/sub-apply-L5-evalcuaeval.md:37,41,59,115` — C-16 locate @S185) nhưng 2 cột TRỐNG chờ anh. Anh chốt W-4 = "em kê NHÁP từ thực tế, anh gật/sửa" (YC-021). +> **Cách đọc:** mỗi dòng = một thứ CHỈ ANH được đổi. Em đề-xuất/đo/trình — không tự đổi. Dòng nào anh thấy sai thì gạch; thấy thiếu thì thêm; gật cả bảng thì em lật DRAFT→chính-thức + trỏ từ engine. + +## Cột 1 — owner-SỐ (con số chỉ anh đặt; nhà = `.claude/agent-memory/memory-budget.json` trừ khi ghi khác) + +| # | Số | Key/nhà | Giá trị hiện tại · lệnh anh gần nhất | +|---|---|---|---| +| 1 | Nhịp audit light/deep + jump | `h24_cadence.{light_every, deep_every, jump_on_class_repeat}` | 6 · **1** (YC-019(5) "cứ end/start là cứ chạy") · 3 | +| 2 | Ngưỡng tiêu-đề-cũ | `h24_title_freshness_sessions` | **14 PHIÊN** (YC-020(2) — "theo phiên luôn vì có ngày làm ngày ko") | +| 3 | Ngưỡng điểm-dừng-RẺ | `stop_point_cheap_ms` | **500ms** (YC-021/W-3) | +| 4 | Trần nạp-trọn L1 + soft-cap | `archive_gate.autoinject_cap_bytes` = 25.600 · soft-cap 30.720 = ngưỡng `l1_over_30kb` sống trong output `measure-agent-memory.ps1` (`soft_cap_l1_bytes`) — **KHÔNG phải key trong archive_gate** *(reviewer F-11 @S185 bắt key-ma ở bản kê đầu)* | 25.600 · 30.720 | +| 5 | Giữ-sàn + strike archive | `archive_gate.{keep_floor_entries, strike_threshold}` | 5 · 2 | +| 6 | Bề rộng fan-out | `hmw_width.cap` (mirror `hmw.js WIDTH_CAP`) | 30 (YC-012 "nâng cap") | +| 7 | Cap hot-feed lead + 2 sub | `token_governor.{lead_tokens, memory_sub_tokens, workflow_sub_tokens}` | **380.000** (S94 `RC-…-23-25-50`, cấm auto-reduce) · 60.000 · 50.000. *(Số "target 210.000 / thiếu 75.427" ở eval-T28 là số máy `crystallized-backfill.ps1` in — nguồn key CHƯA đối-soát với budget [reviewer F-12: 0 hit "210000" trong budget]; đối-soát xong mới trình, đừng gật dòng này vội)* | +| 8 | Trần lớp mềm + context + verbatim-sổ | `mind_ctx_kb` · `session_ctx_kb` · `owner_request_verbatim_char_cap` | **48** (anh nâng 32→48 @S167 `_mind_ctx_kb_raise_S167` — bản kê đầu ghi 32 = hồi sinh số anh đã bỏ, reviewer F-13 bắt) · 64 · 600 | +| 9 | Ngưỡng kéo-thư | `pull_warn_days` | **TRỐNG CỐ Ý** — anh chưa đặt @S148, máy cấm tự chế default | +| 10 | Ngân sách/nhịp memory khác | mọi key số còn lại trong `memory-budget.json` | đọc sống tại file | + +## Cột 2 — owner-LUẬT (luật chỉ anh đổi; đổi = 1 câu của anh + em thi hành có vết) + +| # | Luật | Nhà | Lệnh anh gần nhất | +|---|---|---|---| +| 1 | Enum class H24 **NIÊM PHONG** | `lead_self_audit.flag_classes` + `_sealed_P3B_S181` (máy exit-2 khi nhét thêm) | P3=B @S181; forward-only @S181 `owner-decisions…dot-2:48` | +| 2 | Luật tự-trị 3 bậc | `ACTIVE-MARKS §LT3` (mark `RC-…-20-57-48`) | @S181 + điều-kiện-3 ghép @S181 | +| 3 | REQUEST ⟂ TASK (sổ ≠ WAL) | `tiep.md §3-bis` (mark `RC-…-15-32-20` + P2=PB-2) | @S180-S181 | +| 4 | ONE-SHOT bookend/bookstart | `session-start.md` + `session-end.md` khối đỏ | YC-018 @S185 | +| 5 | 4-path Stop-hook (nới = đẻ tín-hiệu Sàn-3 cùng lượt) | `wal-flush.ps1` + `tiep.md §0` | S146 (path-4) | +| 6 | Hình-dạng diary vai (đổi quy-ước = owner) | tiền lệ S173 + E3 @S185 | — | +| 7 | Hợp-đồng TOTAL detector (fold/severity) | `governance-detectors.ps1` sink-INFORM ↔ TOTAL | YC-020(1) fold C13-15 @S185 | +| 8 | 2-mã-thoát trong 1 máy (W3b) | P1=PA-2 `_context-s-12:55` + `harness-11-engine PHẦN Q` | @S181; rider-jump đang là nợ-chưa-có-chủ | +| 9 | Roster/vai mới + persona đổi scope | `.claude/agents/` + STATUS §Sub-agents | ring5 @S185 (YC-021/W-2) · STYLE @S176 | +| 10 | Model-tier + worker-pin | worker-tier-pin S124 · lead qua `/model`·`/fable-real` | S124 · S151 | +| 11 | Nghi-thức cửa (thêm/bớt bước NẶNG vào pause/tiep — phải đo wall-clock trước) | `check-email.md :41` bất-biến + goi-chot §3 hub BINDING | ngưỡng đo = owner-SỐ #3 | +| 12 | Gửi/công-bố outward (thư hub, báo cáo ngoài) | nghi-thức send-email + duyệt từng bản | YC-021/W-4 (bản này) | + +*Đề mở: anh có thể thêm cột 3 "được-tự-làm-thẳng" (bậc-1 LT3 đã phủ) nếu muốn bảng 1 chỗ đủ 3 tầng.* diff --git a/docs/governance/naming-standard.md b/docs/governance/naming-standard.md index 2eb3ad5..e488816 100644 --- a/docs/governance/naming-standard.md +++ b/docs/governance/naming-standard.md @@ -112,7 +112,7 @@ Một chuẩn "mọi tên kebab" sẽ **cờ 5 tệp đang đúng** = dương-gi - **NẤC muốn sạch:** **TIỀN TỐ `_`** (tệp mốc) — thư mục chứa ép ở nấc **HÌNH DẠNG** - **Thư mục:** `session-` — `^session-\d+$`, đo **12/12 = 100%**. Máy: `governance-detectors.ps1:1639` (INFORM) + `session_ctx.py:133` + `session-scaffold.ps1:116` + `session_scaffold.py:105`. -- **Tệp bên trong — 7 họ tiền tố hợp lệ:** `_tiep-*` · `_pause-*` · `_snapshot-*` · `_context-s-.md` · `_mind-s-.md` · `_end` · và **`pause-*` (chỉ vật cũ, xem dưới)**. +- **Tệp bên trong — 8 họ tiền tố hợp lệ (+`_day-*` @S185 W-1 day-wake):** `_tiep-*` · `_pause-*` · `_snapshot-*` · `_day-*` · `_context-s-.md` · `_mind-s-.md` · `_end` · và **`pause-*` (chỉ vật cũ, xem dưới)**. - **Luật vật MỚI:** tệp mốc phiên **bắt buộc mở đầu bằng `_`**. Lý do cơ học: `session_ctx.py:351-353` tự khai *"glob `pause-*` does NOT match `_pause-1.md` (leading underscore)"* — dấu `_` là thứ phân tách hai họ mà không đếm trùng. - 🔴 **HAI cặp fork đang sống, cả hai đều sống VÌ MÁY THA:** diff --git a/scripts/day-probe.ps1 b/scripts/day-probe.ps1 new file mode 100644 index 0000000..09d5ee2 --- /dev/null +++ b/scripts/day-probe.ps1 @@ -0,0 +1,95 @@ +#Requires -Version 5.1 +<# +.SYNOPSIS + day-probe (W-1 day-wake, adopt hub 2026-07-28 "probe-first-resume"; owner YC-021 @S185). + READ-ONLY probe deciding CHEAP-WAKE vs FULL-RESUME. Prints EXACTLY one DAY-PROBE line. + ALWAYS exit 0 (INFORM layer - the /day command reads the verdict word, nothing blocks). + +.DESCRIPTION + Floor F1: pick the LAST session marker by the ts WRITTEN INSIDE the file (never mtime - + Dropbox resync touches mtime). Then check 4 delta signals: + (a) commits after the anchor (git rev-list count) + (b) tracked/untracked dirty files (git status --porcelain, no allowlist - lean DELTA) + (c) is covered by (a)+(b): run-folders/artifacts land as commits or dirty files + (d) closing: sentinel in .claude/WAL.md (San-2) + Floor F3: anchor = the commit that ADDED the marker file (the stop-seal commit), NOT the + head-sha inside the marker (trap-one: head-sha predates the seal commit => false DELTA + 100% of the time). Fallback = head-sha field. Anchor must EXIST (cat-file -e) AND be an + ANCESTOR of HEAD (merge-base --is-ancestor); orphaned (post-squash) => verdict ANCHOR-LOST + printed LOUDLY (trap-two: fail-safe must have a voice, not die silent). + Verdict precedence: ANCHOR-LOST > DELTA > CLEAN. Leaning rule: any probe error => DELTA. + Floor F4 lives in /day (the _day-.md marker); this script only measures. + +.PARAMETER RepoRoot + Repo root; a temp tree here isolates fault-injection (mirror governance-detectors.ps1). +#> +[CmdletBinding()] +param([string]$RepoRoot = (Get-Location).Path) + +$sw = [System.Diagnostics.Stopwatch]::StartNew() +$ErrorActionPreference = 'SilentlyContinue' + +function Out-Line([string]$verdict, [string]$detail) { + $script:sw.Stop() + Write-Host ("DAY-PROBE: {0} | {1} | {2}ms" -f $verdict, $detail, $script:sw.ElapsedMilliseconds) + exit 0 +} + +try { + $sessRoot = Join-Path $RepoRoot '.claude\sessions' + if (-not (Test-Path $sessRoot)) { Out-Line 'DELTA' 'probe-loi: no sessions dir (lean DELTA)' } + + # newest logic-session = highest N with a _context file + $sess = Get-ChildItem -Path $sessRoot -Directory -Filter 'session-*' | + Where-Object { Test-Path (Join-Path $_.FullName ("_context-s-" + ($_.Name -replace '^session-','') + ".md")) } | + Sort-Object { [int]($_.Name -replace '^session-','') } -Descending | Select-Object -First 1 + if ($null -eq $sess) { Out-Line 'DELTA' 'probe-loi: no logic-session found (lean DELTA)' } + + # last marker by ts INSIDE file (F1). _day markers count too (repeat wakes). + $markers = @() + foreach ($f in (Get-ChildItem -Path $sess.FullName -File | Where-Object { $_.Name -match '^_(pause|tiep|snapshot|day)-\d+\.md$' })) { + $ts = $null; $sha = $null + foreach ($ln in (Get-Content -Path $f.FullName -TotalCount 8 -Encoding UTF8)) { + if ($ln -match '^ts:\s*(\S+)') { $ts = $Matches[1] } + if ($ln -match '^head-sha:\s*([0-9a-f]{7,40})') { $sha = $Matches[1] } + } + if ($null -ne $ts) { $markers += [pscustomobject]@{ File = $f.FullName; Name = $f.Name; Ts = $ts; Sha = $sha } } + } + if ($markers.Count -eq 0) { Out-Line 'DELTA' ('no marker with in-file ts under ' + $sess.Name + ' (lean DELTA)') } + $last = $markers | Sort-Object Ts -Descending | Select-Object -First 1 + + # F3 anchor: the commit that ADDED the marker (stop-seal), fallback in-file head-sha + Push-Location $RepoRoot + try { + $rel = (Resolve-Path -Relative $last.File) -replace '^\.\\', '' -replace '\\', '/' + $anchor = (& git log --diff-filter=A --format=%H -1 -- $rel 2>$null | Select-Object -First 1) + $src = 'seal-commit' + if ([string]::IsNullOrWhiteSpace($anchor)) { $anchor = $last.Sha; $src = 'in-file-sha' } + if ([string]::IsNullOrWhiteSpace($anchor)) { Out-Line 'DELTA' ('marker ' + $last.Name + ' has no resolvable anchor (lean DELTA)') } + + & git cat-file -e ($anchor + '^{commit}') 2>$null + if ($LASTEXITCODE -ne 0) { + Out-Line 'ANCHOR-LOST' ('anchor=' + $anchor.Substring(0,[Math]::Min(8,$anchor.Length)) + ' (' + $src + ') MISSING from object store - marker=' + $last.Name + ' - route: FULL /tiep (loud fail-safe, F3 trap-two)') + } + & git merge-base --is-ancestor $anchor HEAD 2>$null + if ($LASTEXITCODE -ne 0) { + Out-Line 'ANCHOR-LOST' ('anchor=' + $anchor.Substring(0,8) + ' (' + $src + ') exists but NOT ancestor of HEAD (post-squash orphan) - marker=' + $last.Name + ' - route: FULL /tiep') + } + + # signals + $nCommits = [int](& git rev-list --count ($anchor + '..HEAD') 2>$null) + $dirty = @(& git status --porcelain 2>$null | Where-Object { $_ -and $_.Trim().Length -gt 0 }) + $nDirty = $dirty.Count + $walP = Join-Path $RepoRoot '.claude\WAL.md' + $nClosing = 0 + if (Test-Path $walP) { $nClosing = @(Select-String -Path $walP -Pattern '^closing:' -Encoding UTF8).Count } + + $detail = ('anchor=' + $anchor.Substring(0,8) + '(' + $src + ') alive+ancestor | commits-sau=' + $nCommits + ' | dirty=' + $nDirty + ' | closing=' + $nClosing + ' | marker=' + $last.Name + ' ts=' + $last.Ts) + if ($nCommits -eq 0 -and $nDirty -eq 0 -and $nClosing -eq 0) { Out-Line 'CLEAN' $detail } + Out-Line 'DELTA' $detail + } + finally { Pop-Location } +} +catch { + Out-Line 'DELTA' ('probe-loi: ' + $_.Exception.Message.Substring(0, [Math]::Min(80, $_.Exception.Message.Length)) + ' (lean DELTA)') +} diff --git a/scripts/naming-scan.ps1 b/scripts/naming-scan.ps1 index cbda242..66be4b1 100644 --- a/scripts/naming-scan.ps1 +++ b/scripts/naming-scan.ps1 @@ -46,7 +46,8 @@ $RepoRoot = (Resolve-Path -LiteralPath $RepoRoot).Path $RX_KEBAB = '^[a-z0-9]+(-[a-z0-9]+)*$' $RX_SNAKE = '^[a-z0-9]+(_[a-z0-9]+)*$' $RX_ONEOFF = '^(s[0-9]+-|plan-)' -$RX_SESSFAM = '^_(tiep|pause|snapshot|context-s|mind-s|end)' +$RX_SESSFAM = '^_(tiep|pause|snapshot|day|context-s|mind-s|end)' +# ^ +day @S185 (W-1 day-wake marker _day-.md — reviewer F-6: thieu thi moi marker day = 1 FLAG LECH oan) $RX_SESSDIR = '^session-[0-9]+$' # ---------- so ke ----------