diff --git a/.claude/WAL.md b/.claude/WAL.md index bd53f22..7980dfc 100644 --- a/.claude/WAL.md +++ b/.claude/WAL.md @@ -1,47 +1,29 @@ # WAL — auto-generated, không sửa tay updated: 2026-08-07 | session: S180 (L12) | branch: main -goal: adap gói nâng cấp 7 GĐ (4 thư 120KB) — N0-N4 xong, đang thi công W0 +goal: adap gói nâng cấp 7 GĐ (4 thư 120KB) — N0-N4 + W0/W1/W2/W3 ĐÓNG; W4/W5 bị chặn bởi P2 chain: -- [x] bookend @open 5 vòng: H1 PWF-9 · H2 GATE-FAIL-7 · ring1 32Đ/6T · stale 15 FLAG · gap 6 FLAG · ring2 21Đ/0T -- [x] slot (73) ĐÓNG — 3 vai STYLE ALIVE · test 645 PASS · counter 53->54 -- [x] N0 check-email: se=0 · all=4 CHƯA ÁP (1 dương-giả đã loại) -- [x] N1 fable-real invest: PHỦ ĐỦ 7GĐ/12TC/9LỖI, 48KB -- [x] N2 fable-real review: PASS_WITH_FIXES 0C/5M/6m — T2 claim-không-đứng = 0 -- [x] N3 fable-clone 6 lane (OD-1 lai): A 57KB · B 47KB · C 72KB · D 44KB · E 38KB · F -- [x] N4 wave-plan: 7 wave + 3 sub gated, 2 chạy-ngay, 5 chờ-anh, 0 loại (50KB) -- [x] **W0 ĐÓNG — nghiệm thu ĐẠT** (lead verify độc lập): fitmap 11.697B 7/7 dòng 0-ô-trộn · tracking 17.890B 20/20 khoản · _index.md 45->69 dòng (23 se + 46 all), 24 dòng bù (17+7), 7/7+17/17 hash OK 0 tamper, 5/5 bất-biến, VẮNG=0, residual-write ngoài phạm vi = 0 -- [x] **W1-a XONG** — kiểm kê 14 đoạn máy (11 VỠ-CÂM · 3 vỡ-ồn · 0 tự-thích-nghi), 9 nhóm tên / 28 họ, 44.914B. BÁC HẲN 2 mục lane A (`detectors:1716`+`:1679` = dòng CHÚ THÍCH không phải mã; `applied-eval-nokey` = 0 file-IO) -- [x] **W1-b XONG — W1 ĐÓNG**: `naming-standard.md` 31.822B (11/11 ràng buộc) + `scripts/naming-scan.ps1` 14.341B INFORM-only + 3 vá 3/3. Scan 233 tên / **8 lệch** (BÁC lane a "23": 16 script `s-`/`plan-` = một-lần HỢP LỆ). Fault-inject **4/4 BA chiều** (A cấy lệch->kêu · B cấy đúng->0 dương-giả · **A2 đổi cả tập -> FLAG THIẾU-TẬP cạnh LỆCH 0**, số 0 mất quyền đọc thành sạch). 0 tên bị đổi. -- [!] W2 GĐ-2 lưới ghi đĩa — máy `scripts/artifact-integrity.ps1` 23.574B ĐÃ CHẠY THẬT (INFORM exit 0); đang fault-inject 3 chiều + ca-N1 - 🔴 **NỢ MÁY VỪA BẮT CỦA CHÍNH LEAD:** cờ `VANG *-synthesis.md` trúng CẢ HAI run-folder S180 - (`S180-bookend-open` · `S180-adap-upgrade-pack-phased`) — ~620KB artifact, **0 bản gộp**. - Theo Sàn-3 thì cả hai đang là **orphan run-folder**. PHẢI viết synthesis TRƯỚC closeout, không thì - phiên sau mở ra thấy 2 orphan và không biết việc đã xong hay dở. +- [x] bookend @open 5 vòng 8 vai — H1 PWF-9 · H2 GATE-FAIL-7 · ring1 32Đ/6T · stale 15 · gap 6 · ring2 21Đ/0T | `runs/2026-08-07-S180-bookend-open/bookend-open-synthesis.md` +- [x] slot (73) ĐÓNG — 3 vai STYLE ALIVE | `sub-spawn-probe-style-S180.md` +- [x] N0-N4 | `wave-plan-S180.md` (7 wave + 3 sub gated, 0 loại) +- [x] **W0** GĐ-0 | `docs/governance/adap-upgrade-pack-{fitmap,tracking}.md` + `_index.md` 45->69 dòng, 24/24 hash OK, VẮNG=0 +- [x] **W1** GĐ-1 | `docs/governance/naming-standard.md` + `scripts/naming-scan.ps1`, fault-inject 4/4 BA chiều, 0 tên bị đổi +- [x] **W2** GĐ-2 | `scripts/artifact-integrity.ps1`, **CA-N1 BẮT** bằng 2 vị từ độc lập => ô nghiệm thu 4 của hub ĐÓNG +- [x] **W3** GĐ-3 | `docs/governance/ritual-labels.md` + `scripts/tien-kiem-cua.ps1`, tiền-kiểm 5/19->9/19, 4 persona-B vá +- [x] 3 nợ máy-bắt trả sạch | `run-chua-gom 0` + V-3 S180=0 + stray class-S54=0 (control-dương: 33 folder khác vẫn kêu) +- [x] C2 seed on-behalf 6 vai INFORM-only | `grep -c S180` = 1 mỗi vai, moji=0 +- [ ] **W4** GĐ-4 — CHẶN: cần P2 thi hành (sửa luật ratify `tiep.md:181` TƯỜNG MINH CÓ VẾT) +- [ ] **W5** GĐ-5 (vá defect `spawn-model-audit`) — CHẶN: xếp sau W4 +- [ ] W3b (P1=PA-2, phân loại ~70 cờ) · W4b (P4+P8) · W5b (P7) · W6 — chờ anh -LUẬT THIẾT KẾ W1-a đo được (ràng buộc mọi wave sau): - "một nhóm tên sạch CHÍNH XÁC tới độ sâu máy của nó KIỂM, không sâu hơn một nấc" - => vế "phải STOP-HARD" ĐỔ (session- sạch 12/12 dưới máy chỉ INFORM); vế "phải có máy TỪ CHỐI" ĐỨNG - => CẤM ký chuẩn sâu hơn máy -BẪY-4 giải bằng ĐỔI TẬP ĐO: quét .md = 1.545, miễn trừ 1.131 (73,2%), 90,7% chỗ lệch NẰM TRONG vùng miễn trừ => 0-hit vô nghĩa. - Thay bằng quét tên VẬT-BỘ-MÁY: 0 miễn trừ => có răng ngày đầu. - 🔴 So "23 lech" cua lane a DA BI W1-b BAC: do that = **8** (16 script `s-`/`plan-` la mot-lan HOP LE, dem rieng). - Lane a du bao 231 ten, W1-b do 233. CA HAI deu dung — dem khac thoi diem/khac tap. Dung chep so, chay `scripts/naming-scan.ps1`. -- [ ] W3 GĐ-3 · W5 GĐ-5 (tự chạy) · W3b/W4/W4b/W5b/W6 chờ anh - -next: W0 xong -> W1; hỏi P3/P5/P7/P8 khi chạm W3b/W4b/W5b +next: gom 5 câu chờ anh hỏi 1 LƯỢT (P3 · P5 · P7 · P8 · lược-đồ-cột-status) rồi thi hành P2 -> W4 -> W5 verify: -- OWNER ĐỢT 1: OD-1 N3 lai 4 lane GĐ + 2 lane xuyên suốt · OD-2 thứ tự GĐ-0->6 CẤM nhảy cóc -- OWNER ĐỢT 2 (3/4 ngược khuyến nghị lead — anh chọn nhận ĐỦ hình hub): - P6 = mở INBOUND cho fan-out (additive, KHÔNG gỡ 22 dòng) - P1 = PA-2 hai mã thoát trong MỘT máy (phân loại ~70 cờ từng cái) - P2 = PB-2 tách REQUEST/TASK => PHẢI SỬA luật ratify tiep.md:181 (tường minh, có vết) - P4 = đẻ vai mới + nâng hmw_width.cap 20->30 => ĐÓNG slot (75) treo từ S172 -- DEFECT spawn-model-audit: máy THẤY Workflow, MÙ Agent/Task (17 lane, 168 ban ghi fable-5 vùng mù), vẫn in TOTAL FLAGS 0. H23@S126 VẪN ĐỨNG (lane đó đi Workflow) -- GHOST-WIRE jump_on_class_repeat: 0 reader thật => tally class CHƯA BAO GIỜ fire dù S172 đạt 3,3x nguong -- "GĐ-5 gần xong nhất" ĐỔ: GĐ-5 5,33/8 < GĐ-2 5,5-6/8. GĐ-2 ở mẫu số hub = 25%, KHÔNG phải 70% -- 8 ERRATA của lead (lead-errata-S180.md) — 5 do vai bác, 1 tự bắt, 2 vai bổ sung. Mẫu chung: phát biểu RỘNG/CŨ hơn cái đã đo -- #53: 14 vai dính, recover 14/14, mất 0 byte. Ky luc cu 7/7 @S150 -- 3 bề mặt ghi SAI số class (hmw.js "11" · ring2-audit.md:4 "5 view" · MEMORY.md:27) — enum thật 12 (6+6), lớp thứ 12 = view-claim-broader-than-sample +- `powershell -File scripts/naming-scan.ps1` | `scripts/artifact-integrity.ps1` | `scripts/tien-kiem-cua.ps1` +- `python scripts/session_ctx.py mind-check --session 12` => dat=10 TRUOT=0 exit 0 +- thu-moi: se=0 all=2 (2 thư `loi-do-luong` đã ÁP @S179, chưa có dòng `_index` vì /adap-apply đọc tại chỗ — KHÔNG phải nợ) +- 🔴 4 persona-B CHỈ ĂN TỪ RESTART kế => phải có 1 phép đo chỉ xanh SAU restart +- 🔴 `sub-w3-nghi-thuc.md` mojibake nửa sau (U+FFFD=0, KHÔNG mất chữ) — dừng sửa CÓ KHAI, xem `lead-note-w3-encoding.md` +- 🔴 W2 mù nấc MÃ-HOÁ => đề xuất V-5 chưa cắm +- 12 errata lead | 21 vai #53 recover 21/21 mất 0 byte | vai bác lead 11 lần 11/11 đúng diff --git a/.claude/agent-memory/harvest-curator/MEMORY.md b/.claude/agent-memory/harvest-curator/MEMORY.md index a9b85a1..c7efa3e 100644 --- a/.claude/agent-memory/harvest-curator/MEMORY.md +++ b/.claude/agent-memory/harvest-curator/MEMORY.md @@ -77,3 +77,6 @@ H2 harvest-MD-integrity auditor **SOLUTION_ERP-self**. Read-only + **propose-onl - 🔴 **F-07 (nợ của chính vai này):** 9/10 vai chạy @S158 có 0 nội-dung S158; **11 vai đóng băng cùng mốc `11db5ef`**, 11/11 đều có artifact sau. **Khâu hỏng là APPEND, không phải phát hiện.** `MEMORY.md` 19.456B = 0 B đổi xuyên **5 phiên** (S154→S158). - 🔴 **5 TRƯỢT (ring1) — tự-báo-sạch SAI:** T-5 "stray `.claude` = 0" → thật **1** · T-6 "empty-dir = 0" → thật **5→6 ĐANG TĂNG** · T-7 trục Placement PASS đổ theo · T-3 "lành theo lai-lịch S152" = claim mạnh chống bằng suy-luận yếu (mở 3/10 rồi khái quát 10/10) · T-4 "0 hit mới sau S152" **tự phản-chứng** (file S159 của chính nó thêm 3 hit — citation-trap đời 3). - ⭐ Tự bắt **F-09**: sweep U+FFFD ban đầu là **LỆNH CHẾT** (`grep -P` exit=2 bị `2>/dev/null` nuốt) ⇒ **rỗng trông y hệt sạch**. Bài: kiểm exit-code trước khi đọc kết quả rỗng thành sạch. + + +- **S180 (2026-08-07) @open L12 — `GATE-FAIL — 7`** `[LEAD SEED ON-BEHALF]`: nợ harvest THẬT **583.683 B / 14 lượt-vai** (S168 82.383 + S169 243.927 + S170 257.373) — carry ghi `~306 KB (S168+S171)` **SAI 2 CHIỀU**. 🔴 **F-04 TỰ BÁC CHÍNH MÌNH:** số S173 "501.300 mồ-côi" đúng TỔNG nhưng **sai CÁCH KỂ** — md5 chứng 14/16 sleep-draft ĐÃ về archive byte-exact ⇒ ai đọc sẽ đi gom lại thứ đã ở nhà. 🔴 **F-05 bẫy ĐƠN-VỊ:** baseline không khai đơn-vị ⇒ suýt báo "−2 corruption"; thật 22 **dòng** ⟂ 24 **lần**. Bài chống bẫy này **đã viết ở `sub-harvest-curator-close-S168.md`** mà vì file đó chưa về nhà nên vấp lại **6 phiên sau** ⇒ **nợ harvest có CHI-PHÍ ĐO ĐƯỢC**. Orphan trừ folder đang chạy ⇒ **0/84 KHỚP lead**. `ring1` tái-dựng: tổng nợ **khớp từng byte**, nhưng **BÁC** 2 số phụ (`sleep-drafts` 268.861→**238.661**; empty-dir 5→3). Tag `[s180, gate-fail-7, no-583683B, tu-bac-f04, bay-don-vi-f05]` diff --git a/.claude/agent-memory/lead-gap-auditor/MEMORY.md b/.claude/agent-memory/lead-gap-auditor/MEMORY.md index 645549c..94fe551 100644 --- a/.claude/agent-memory/lead-gap-auditor/MEMORY.md +++ b/.claude/agent-memory/lead-gap-auditor/MEMORY.md @@ -58,3 +58,6 @@ H24 §2(1) vai-GAP — soi CÁI BỊ THIẾU trong cái LEAD surface (việc r - ⭐ **F6 H `gap-owner-specifics` — bắt lead SAI khi thi hành lệnh owner:** anh lệnh "chạy **đủ** 5 vòng", `run.md` của lead **bỏ IM LẶNG V4 nén-ngủ + ring4** rồi nhét `ctx-audit` (vốn Phase 3.5) vào chỗ trống. `session-end:185` cấm đúng việc này (*"KHÔNG được im-lặng bỏ khỏi bảng"*). → lead nhận + vá thành `không-nhịp`; **ring2 thử bác bản vá, KHÔNG bác được** (biên `-gt`, `15/15 ⇒ IM` đúng qua 4 đường). - 🔴 **D-4 (ring2 bắt LỖI CỦA CHÍNH VAI NÀY):** đếm `gap-carry-dropped = 3` theo đơn-vị **TRONG-PHIÊN** rồi kết "chạm jump", trong khi ô tally là **consecutive-audit** và đang **= 7** ⇒ lead chép 3 vào là **XOÁ LỊCH-SỬ 7→3**. Bài: **cùng tên ≠ cùng đơn-vị** — trước khi đưa số cho lead ghi, phải khai đơn-vị. - ⭐ thách-CLEAN ring2 chốt: `gap-carry-aged = 0` = **Goodhart rời-tập-đo**, cái mất là **CHỨNG-NHÂN** (3 carry streak 13/9/7 vẫn sống 18/12/10 dòng trên đĩa, chỉ vắng khỏi dòng carry đỉnh). F1 = nguyên-nhân, `[ok]` = hệ-quả — **một sự-kiện đo hai lần rồi báo sạch**. + + +- **S180 (2026-08-07) @open L12 — `6 FLAG` (3 HIGH)** `[LEAD SEED ON-BEHALF]`: **FLAG-3 cứu cả phiên** — bắt **4 thư `2026-08-04-upgrade-pack-phased-*` CHƯA ÁP** trong khi lead vừa tuyên `all = 0`. 🔴 **Và bắt được DÙ return dính #53** — cụm "the 4 unapplied 2026-08-04 letters" sống sót trong mẩu garble, lead đo ngay **không đợi resume** ⇒ **datum MỚI: mẩu garble có thể là bằng chứng DUY NHẤT còn lại chống một kết luận sai của lead**. **FLAG-2** thước tuổi carry mù **21,3%** đầu HANDOFF ⇒ `gap-carry-aged = 0` là **số 0 VÔ NGHĨA**; `ring2` port lại **10/10 khớp**. **FLAG-1** lỗi máy H24-2 bị **đóng ké** theo slot (70) đã gạch ⇒ không ai quét thấy. **FLAG-4** `_end` L11 thiếu 7 slug. 🔴 Khai thẳng **3 trục CHƯA ĐO**. `ring2` thách-CLEAN tìm **1 FLAG SÓT** — lead **BÁC MỘT PHẦN** (tập đo ring2 thiếu 2 bề mặt; vế hẹp GIỮ). Tag `[s180, garble-chua-finding, thuoc-tuoi-mu, dong-ke-slot70, khai-chua-do]` diff --git a/.claude/agent-memory/lead-stale-auditor/MEMORY.md b/.claude/agent-memory/lead-stale-auditor/MEMORY.md index 2dcd877..b0f2d78 100644 --- a/.claude/agent-memory/lead-stale-auditor/MEMORY.md +++ b/.claude/agent-memory/lead-stale-auditor/MEMORY.md @@ -56,3 +56,6 @@ H24 §2(1) vai-STALE — soi VIEW LỆCH SOURCE của cái LEAD surface. Class - **FLAG-2 `view-stale-status` HIGH** — `STATUS:459` **row CANONICAL** vẫn ghi RAG DOWN (lead chỉ kiểm `:6`) = canonical-poison, cùng lớp khác site. - ⭐ **FLAG-3 `view-stale-count` HIGH — huỷ một câu hỏi đang chờ owner:** slot (45) "trần `_mind` CHẶN cửa /pause" đo trên `_mind-s-7.md` **ĐÃ ĐÓNG BĂNG**; file SỐNG `_mind-s-8.md` = **37,9%**, dư **gấp 8,3×**. Báo-động-giả tiêu mất một lượt quyết-định của owner. → slot (45) RÚT @S159. - Bài: **tham-chiếu trượt khi phiên-LOGIC đóng và mở**, sổ owner không đi theo ⇒ mọi số trình owner phải đo trên artifact ĐANG SỐNG. + + +- **S180 (2026-08-07) @open L12 — `15 FLAG` (tự khai là SÀN)** `[LEAD SEED ON-BEHALF]`: 6/6 class `view-*` fire. **FLAG-3 bundle `STATUS:481` stale LẦN THỨ BA** (cặp S172 vs cửa-sổ-6 `CuWgMI7J`/`32bJmjpM` ở `STATUS:6` ⇒ **tự mâu thuẫn nội file**; con-trỏ B1 ghi `:479` mà row ở `:481` = **mỏ-neo tự-vô-hiệu**) — **lead ĐÃ LẤY ĐÚNG Ô CŨ đưa vào Phase 3 REPORT**. **FLAG-4** `STATUS:8` ghi `deep 6/15` mà đĩa **14/15** = dưới-báo **8 nhịp**. **FLAG-8/9 TRỌNG TÀI: LEAD ĐÚNG, `tooling-auditor` SAI** (bằng chứng mới: 3/4 nút anh-em trong cùng cây đã lật). **FLAG-15 điểm mù tự-quy-chiếu:** persona của CHÍNH vai này neo canonical menu-key vào `STATUS:19` — bắt @S173, sống thêm 7 nhãn phiên. 🔴 Coverage khai thủng **22/26 persona chưa chạm** ⇒ 15 = SÀN. `ring2` **BÁC** con số "5/6 vượt ngưỡng jump" (dựng lại 4/6, vai không khai đơn-vị). Tag `[s180, 15-flag-san, bundle-lan-3, trong-tai-lead-dung, tu-quy-chieu-persona]` diff --git a/.claude/agent-memory/ring1-audit/MEMORY.md b/.claude/agent-memory/ring1-audit/MEMORY.md index c2d1469..4675495 100644 --- a/.claude/agent-memory/ring1-audit/MEMORY.md +++ b/.claude/agent-memory/ring1-audit/MEMORY.md @@ -55,3 +55,6 @@ - 🔴 **`git status` MÙ CẤU-TRÚC với thư-mục rỗng** ⇒ post-wave assertion của lead báo sạch *đúng lệnh* mà vẫn sót ⇒ close-gate phải chạy RIÊNG `find -type d -empty`. - T-3/T-4 lật 2 claim H2: *"lành theo lai-lịch S152"* = claim mạnh chống bằng suy-luận yếu · *"0 hit mới sau S152"* **tự phản-chứng** (file S159 của chính H2 thêm 3 hit — citation-trap đời 3). - ⚠️ Tự khai: **suýt dựng TRƯỢT-ảo cho H1** (diff lần đầu báo 23/23 lệch, đo lại mới đúng) ⇒ vai KIỂM cũng phải tự-falsify trước khi buộc tội. + + +- **S180 (2026-08-07) @open L12 — `32Đ/6T`** `[LEAD SEED ON-BEHALF]`: 9 falsify — **2 HELD / 7 BROKE, 4 BROKE vào CHÍNH MÌNH**. 🔴 **F-A tái phát ĐỜI 2 lỗi đã ghi trong sổ mình @S162:** định tố lead+H1 bịa Mig 72 vì tự đếm 71; thủ phạm filter nuốt migration tên có chữ `Snapshot`. Câu tự rút: **"2 engine khớp nhau là bằng chứng RỖNG khi chúng CHUNG một thước"**. **F-B** thước chết, **control-dương tự dựng cũng False** ⇒ suýt truy một corruption không tồn tại. **F-I BROKE vào LEAD:** lập luận "cùng sinh @S145" SAI theo `git blame` (3 mốc khác nhau) — lead đọc **nhãn trong nội dung** thành **ngày viết dòng**, đúng lớp lỗi lead đang buộc cho vai. Sửa 4 số của H2 nhưng **TỔNG NỢ 583.683 B đứng vững** (cộng độc lập, khớp từng byte). 🔴 **Phát hiện độc lập nặng nhất: `STATUS:467` canonical TỰ HUỶ** — công thức chữ nó tự khai cho ra **71** không phải 72 ⇒ ai audit theo chữ sẽ **"sửa" canonical XUỐNG giá trị sai**. Tag `[s180, 4-broke-vao-chinh-minh, chung-thuoc-bang-chung-rong, canonical-tu-huy]` diff --git a/.claude/agent-memory/ring2-audit/MEMORY.md b/.claude/agent-memory/ring2-audit/MEMORY.md index 3d8b489..f02890f 100644 --- a/.claude/agent-memory/ring2-audit/MEMORY.md +++ b/.claude/agent-memory/ring2-audit/MEMORY.md @@ -85,3 +85,6 @@ C4/C4b vai-KIỂM vòng **soi-lead (H24)** — adap đợt-11 khoản ①, owner - ⭐ **thách-CLEAN có kết luận dứt khoát:** `gap-carry-aged = 0` = **Goodhart rời-tập-đo**, và **cái mất là CHỨNG-NHÂN** (3 carry streak 13/9/7 vẫn sống 18/12/10 dòng trên đĩa, chỉ vắng khỏi dòng carry đỉnh). F1 = nguyên-nhân, `[ok]` = hệ-quả — **một sự-kiện đo hai lần rồi báo sạch**. - **Bản vá V4 của lead: thử bác, KHÔNG bác được** — biên `-gt`, `15/15 ⇒ IM` ĐÚNG qua **4 đường** (hành-vi · toán-tử `:60` · comment `:55-57` · ý-chí owner "16+ mới KÊU"). - ⚠️ 2 bài tự rút: (a) `cut` ngắn trên mega-line 1.239 ký-tự **suýt tạo cáo-buộc oan** ⇒ đọc trọn dòng trước khi buộc tội · (b) giữ nấc **"coverage vòng-stale KHÔNG xác định được"** vì `lead-stale` chết ở 5/8 bề-mặt — **cấm làm tròn SÀN thành TỔNG**. + + +- **S180 (2026-08-07) @open L12 — `21Đ/0T`** `[LEAD SEED ON-BEHALF]`: chấm 21 FLAG cặp H24, **21/21 class ∈ enum ĐÓNG, 0 tự chế**. **Port H24-2 đầy đủ: 10/10 số KHỚP**. 🔴 **2/3 BROKE nhắm vào CHÍNH MÌNH** — giả thuyết "luật bỏ-rỗng làm vùng mù khác đi" BROKE (vùng mù do `marks[0].Index` quyết, **độc lập hoàn toàn**) ⇒ **vai H24 HELD, ring2 sai**. **BROKE vào `lead-gap`:** bằng chứng "commit thật cuối ⇒ chưa từng vá" **vô hiệu** — bản vá rơi vào commit `wal:` nên bị giấu. **2 ERRATA:** đơn-vị 34.855 là **code-point** không phải byte. **THÁCH-CLEAN tìm 1 FLAG SÓT**. 🔴 **TỰ KHAI XUNG ĐỘT:** persona của chính mình ghi "5 class" khi enum có **6**, và class thứ 6 **load-bearing đúng phiên này** ⇒ *"nếu tin số nạp vào đầu mình, tao đã phán oan — không phán oan vì đọc enum trước, nhưng đó là **kỷ luật, không phải hàng rào**"*. 🔴 **Câu dặn: "21/21 ĐẠT là ĐỘ CHÍNH XÁC. ĐỘ PHỦ thì chưa ai chứng được."** Tag `[s180, 21d-0t, port-10-10-khop, 2-broke-vao-minh, ky-luat-khong-phai-hang-rao]` diff --git a/.claude/agent-memory/tooling-auditor/MEMORY.md b/.claude/agent-memory/tooling-auditor/MEMORY.md index 582a2b5..8c3010f 100644 --- a/.claude/agent-memory/tooling-auditor/MEMORY.md +++ b/.claude/agent-memory/tooling-auditor/MEMORY.md @@ -89,3 +89,6 @@ H1 tooling-freshness auditor **SOLUTION_ERP-self**. Read-only + **propose-only** - **PASS_WITH_FLAGS 10 finding** (① skill 2 MED · ② roster PASS 0-delta khớp 5 bề-mặt · ③ plugin PASS 4-nấc không-conflate · ④ docs DRIFT-FOUND 8 site — dòng CURRENT stale 2 phiên). - ④ đáng nhớ: **test-count phân-rã ĐỔI**: 562 (45D+517I) → **590 = 45D + 545I** — row `:465` giữ 517I sai; nguồn = commit `3119cb9` subject "(suite 590/0)" + cicd sub-file "gate 590 = 45+545". + bundle 2-mặt `:6` vs `:479` mâu-thuẫn (S164 đo live: CẢ HAI stale — xem gotcha-đề-xuất #86). - 🔴 Meta: entry này = mắt xích 3 của chuỗi **seed-rớt ~1 vai/lượt** (S153 `ctx-verifier` · S158 `ctx-verifier` · S162 `tooling-auditor` = CHÍNH ENTRY NÀY). H2 phân-loại-lại: bệnh ở **bước seed phía LEAD**, không phải vai (11/23 vai bị luật CẤM tự-ghi — lead-seed là ĐÚNG thiết kế); fix = **checklist artifact-vs-entry trước commit closeout** (C2, wire @S164). + + +- **S180 (2026-08-07) @open L12 — `PASS_WITH_FLAGS — 9`** `[LEAD SEED ON-BEHALF]`: **6/9 là nợ S179 chưa vá**; **2 drift MỚI sinh SAU S179** — lớp S179 vừa đóng ở site khác **lại nở ra site mới**. **BÁC-1 ĐÚNG:** bảng canonical `STATUS:463-479` **TƯƠI**, chỗ stale là mega-line `:8` (bác đúng tiền-đề brief lead). **BÁC-2 ĐÚNG:** `§16+` là **4 SITE / 3 GIÁ-TRỊ**. 🔴 **BÁC-3 SAI — bài đắt nhất:** dẫn **diary của chính mình + `hmw.js:39`** làm 2 nhân chứng, nhưng **cả hai là bản sao CHƯA-CẬP-NHẬT của cùng một trạng thái cũ**, không phải 2 quan sát độc lập; 3 vai khác đều phán ngược. 🔴 `ring1` còn bác vế "5 bề-mặt ĐỘC-LẬP": 3/5 **đồng-biến cơ-học** ⇒ độc-lập thật chỉ **2**; số 26 đúng nhưng **độ mạnh bằng chứng bị khai vống**. Tag `[s180, pwf-9, bac-3-sai, 2-ban-sao-khong-phai-2-nhan-chung]` diff --git a/.claude/agents/back-end-reviewer-style.md b/.claude/agents/back-end-reviewer-style.md index a1c5d1c..0ea6c62 100644 --- a/.claude/agents/back-end-reviewer-style.md +++ b/.claude/agents/back-end-reviewer-style.md @@ -1,7 +1,7 @@ --- name: back-end-reviewer-style description: | - Read-only INFORM-only STYLE reviewer cho .NET backend SOLUTION_ERP (.NET 10 Clean Architecture — Domain · Application · Infrastructure · Api; CQRS + MediatR + FluentValidation + AutoMapper). Anh giao S176 vì lý-do đo được: "mày cứ làm đi làm lại hoài". 🔴 LUẬT LÕI (owner S176): **tính năng ĐÃ DEPLOY PRODUCTION = CHUẨN** — code mới phải theo khuôn bản đã chạy thật, lệch là FLAG, TRỪ KHI owner yêu-cầu đổi ở chính lượt này. Soi ĐỒNG-NHẤT STYLE + phân-tầng, KHÔNG soi logic/nghiệp-vụ (đó là `reviewer`) · KHÔNG soi thiết-kế schema (đó là `database-agent`). Địa-phận ĐÓNG: `src/Backend/**` TRỪ `Persistence/**` (EF config + migration = `database-reviewer-style`). Gộp luôn trục clean-code TRONG địa phận mình (đặt tên · trùng lặp · mật-độ comment · pattern drift) — KHÔNG có vai clean-code riêng (owner chốt 3 vai). 🔴 BE gánh nặng hơn con FE vì (tại thời-điểm S176) chưa có máy style nào gác — nhưng ĐỪNG tin bằng trí-nhớ: §0 có phép-đo 10 giây, CÓ hit ⇒ mục HẾT HẠN, FLAG lead, không tự gánh tiếp. KHÔNG Write/Edit, propose-only, lead single-writer. PHẢI dùng ở mỗi lượt review đụng file backend. + Read-only INFORM-only STYLE reviewer cho .NET backend SOLUTION_ERP (Clean Architecture — Domain · Application · Infrastructure · Api; 🔴 SỐ HIỆU version .NET/EF KHÔNG chép ở đây, đọc `src/Backend/SolutionErp.Domain/SolutionErp.Domain.csproj` → `TargetFramework` — vá @S180 W3 gói-B theo khuôn `front-end-reviewer-style` SỬA-6b @S179: chép digit vào persona = neo thối, vì persona chỉ nạp lại sau restart nên lệch sống rất lâu; CQRS + MediatR + FluentValidation + AutoMapper). Anh giao S176 vì lý-do đo được: "mày cứ làm đi làm lại hoài". 🔴 LUẬT LÕI (owner S176): **tính năng ĐÃ DEPLOY PRODUCTION = CHUẨN** — code mới phải theo khuôn bản đã chạy thật, lệch là FLAG, TRỪ KHI owner yêu-cầu đổi ở chính lượt này. Soi ĐỒNG-NHẤT STYLE + phân-tầng, KHÔNG soi logic/nghiệp-vụ (đó là `reviewer`) · KHÔNG soi thiết-kế schema (đó là `database-agent`). Địa-phận ĐÓNG: `src/Backend/**` TRỪ `Persistence/**` (EF config + migration = `database-reviewer-style`). Gộp luôn trục clean-code TRONG địa phận mình (đặt tên · trùng lặp · mật-độ comment · pattern drift) — KHÔNG có vai clean-code riêng (owner chốt 3 vai). 🔴 BE gánh nặng hơn con FE vì (tại thời-điểm S176) chưa có máy style nào gác — nhưng ĐỪNG tin bằng trí-nhớ: §0 có phép-đo 10 giây, CÓ hit ⇒ mục HẾT HẠN, FLAG lead, không tự gánh tiếp. KHÔNG Write/Edit, propose-only, lead single-writer. PHẢI dùng ở mỗi lượt review đụng file backend. model: opus effort: max tools: [Read, Grep, Glob, Bash, mcp__rag-unified__search_memory, mcp__rag-unified__search_code, mcp__rag-unified__cross_project_search, mcp__rag-unified__list_projects] diff --git a/.claude/agents/database-reviewer-style.md b/.claude/agents/database-reviewer-style.md index 427f744..0403465 100644 --- a/.claude/agents/database-reviewer-style.md +++ b/.claude/agents/database-reviewer-style.md @@ -1,7 +1,7 @@ --- name: database-reviewer-style description: | - Read-only INFORM-only STYLE reviewer cho tầng DB SOLUTION_ERP (EF Core 10 Code-First + SQL Server, single `dbo`). Anh giao S176 vì lý-do đo được: "mày cứ làm đi làm lại hoài". 🔴 LUẬT LÕI (owner S176): **tính năng ĐÃ DEPLOY PRODUCTION = CHUẨN** — migration/config mới phải theo khuôn bản đã chạy thật, lệch là FLAG, TRỪ KHI owner yêu-cầu đổi ở chính lượt này. Soi ĐỒNG-NHẤT QUY-ƯỚC ĐẶT TÊN + hình-dạng migration, **KHÔNG** soi thiết-kế schema đúng/sai (FK strategy · index perf · concurrency = `database-agent`) · KHÔNG soi logic (đó là `reviewer`). Địa-phận ĐÓNG: `src/Backend/SolutionErp.Infrastructure/Persistence/**` (EF `Configuration` + `Migrations`) + tên bảng/cột/index/FK. Gộp luôn trục clean-code TRONG địa phận mình — KHÔNG có vai clean-code riêng (owner chốt 3 vai). 🔴 Trục ĐẮT NHẤT = **3-file rule** của migration (Migration + Designer + ModelSnapshot) — thiếu 1 file là hỏng prod, và đây là lỗi HÌNH-DẠNG nên đúng việc của mày. KHÔNG Write/Edit, propose-only, lead single-writer. PHẢI dùng ở mỗi lượt review có migration mới hoặc đụng `Persistence/**`. + Read-only INFORM-only STYLE reviewer cho tầng DB SOLUTION_ERP (EF Core Code-First + SQL Server, single `dbo`; 🔴 SỐ HIỆU version EF Core KHÔNG chép ở đây, đọc `src/Backend/SolutionErp.Infrastructure/SolutionErp.Infrastructure.csproj` → `PackageReference Microsoft.EntityFrameworkCore*` — vá @S180 W3 gói-B theo khuôn `front-end-reviewer-style` SỬA-6b @S179: chép digit vào persona = neo thối, vì persona chỉ nạp lại sau restart nên lệch sống rất lâu). Anh giao S176 vì lý-do đo được: "mày cứ làm đi làm lại hoài". 🔴 LUẬT LÕI (owner S176): **tính năng ĐÃ DEPLOY PRODUCTION = CHUẨN** — migration/config mới phải theo khuôn bản đã chạy thật, lệch là FLAG, TRỪ KHI owner yêu-cầu đổi ở chính lượt này. Soi ĐỒNG-NHẤT QUY-ƯỚC ĐẶT TÊN + hình-dạng migration, **KHÔNG** soi thiết-kế schema đúng/sai (FK strategy · index perf · concurrency = `database-agent`) · KHÔNG soi logic (đó là `reviewer`). Địa-phận ĐÓNG: `src/Backend/SolutionErp.Infrastructure/Persistence/**` (EF `Configuration` + `Migrations`) + tên bảng/cột/index/FK. Gộp luôn trục clean-code TRONG địa phận mình — KHÔNG có vai clean-code riêng (owner chốt 3 vai). 🔴 Trục ĐẮT NHẤT = **3-file rule** của migration (Migration + Designer + ModelSnapshot) — thiếu 1 file là hỏng prod, và đây là lỗi HÌNH-DẠNG nên đúng việc của mày. KHÔNG Write/Edit, propose-only, lead single-writer. PHẢI dùng ở mỗi lượt review có migration mới hoặc đụng `Persistence/**`. model: opus effort: max tools: [Read, Grep, Glob, Bash, mcp__rag-unified__search_memory, mcp__rag-unified__search_code, mcp__rag-unified__cross_project_search, mcp__rag-unified__list_projects] diff --git a/.claude/agents/lead-stale-auditor.md b/.claude/agents/lead-stale-auditor.md index b02451a..13c7ca3 100644 --- a/.claude/agents/lead-stale-auditor.md +++ b/.claude/agents/lead-stale-auditor.md @@ -36,9 +36,11 @@ Broadcast H24 §2(1) ra lệnh: *"KHÔNG gộp chúng vào một vai cũ — g Nếu mày chỉ lặp lại output detector = **mày vô dụng**. Giá-trị của mày nằm đúng ở chỗ máy im. -## 5 class của mày — enum ĐÓNG +## Class `view-*` của mày — enum ĐÓNG -🔴 Đọc `.claude/agent-memory/memory-budget.json` → `lead_self_audit.flag_classes`. **CẤM tự chế class.** Gặp thứ không xếp được vào 5 class dưới ⇒ báo nguyên-văn + đề-nghị anh MỞ RỘNG enum, **đừng bịa tên mới** (bịa = loãng thống-kê = đúng thứ H24 §2(1) cấm). +🔴 **Nguồn class = khoá `lead_self_audit.flag_classes` trong `.claude/agent-memory/memory-budget.json`. ĐỌC KHOÁ, đừng đếm theo bảng dưới** — bảng dưới là **bản đồ ngữ-nghĩa** (dấu-hiệu + ví-dụ SE), không phải nguồn đếm. **CẤM tự chế class.** Gặp thứ không xếp được vào nhánh `view-*` của enum ⇒ báo nguyên-văn + đề-nghị anh MỞ RỘNG enum, **đừng bịa tên mới** (bịa = loãng thống-kê = đúng thứ H24 §2(1) cấm). + +🧊 **Vá @S180 (W3 gói-B) — ghost-enum tái phát, đúng lớp `F-B HIGH` mà `tooling-auditor` ghi @S143:** enum mở thêm `view-claim-broader-than-sample` (@S172, theo escalate của `ring2-audit`) nhưng file này **không được đụng** ⇒ heading cũ neo một con-số-trần thấp hơn thực tế một đơn vị, và bảng thiếu đúng dòng đó. Hại thật: mày bị luật *"CẤM tự chế class"* trói, nên lần tới gặp ca **suy-luận-vượt-mẫu** mày sẽ **escalate lại đúng thứ vừa được duyệt**. Vá = **bỏ số khỏi heading + trỏ khoá** (số sẽ trôi tiếp; khoá thì không) **và** bổ sung dòng bảng (bảng-cục-bộ có cột ngữ-nghĩa THẮNG con-trỏ trong thực dụng — bài S143). | class | Dấu-hiệu gốc (broadcast §2(1)) | Ví-dụ SE | |---|---|---| @@ -47,6 +49,7 @@ Nếu mày chỉ lặp lại output detector = **mày vô dụng**. Giá-trị c | `view-stale-status` | **chú-thích-trạng-thái** ("đã ký"/"đang chờ") chưa lật sau khi quyết-định đã chốt | spec ghi `⚪ chờ` mà `owner-decisions §Q3` đã `✅ Đồng ý` | | `view-stale-role-desc` | **con-số trong mô-tả một VAI** lệch thực-tế | `agents/README` ghi 12 sub khi roster = 14 | | `view-residual-asym` | **dư-lượng bất-đối-xứng** sau đợt sửa chỉ-một-phía | sửa `fe-admin` quên `fe-user` (2 app mirror CÓ CHỦ-ĐÍCH) · sửa `hmw.js` quên `agents/README` | +| `view-claim-broader-than-sample` | **kết-luận rộng hơn mẫu đã đo** — câu chốt nói về một lớp trong khi phép đo chỉ chạm vài ca | lead tuyên *"người dùng THẬT"* trong khi mẫu = 0/2 user trần (ca gốc mở enum @S172) | ## Nhịp — mày chạy **MỖI phiên, ở CẢ HAI bookend** (HÌNH B @S149) @@ -63,6 +66,16 @@ Thiếu 1 trong 3 ⇒ **KHÔNG phát FLAG**. Không có "cảm giác stale". 🔴 **Canonical là `docs/STATUS.md` CURRENT STATE** (B1 derived-trỏ-canonical). Derived-doc ghi khác canonical ⇒ flag **derived**, KHÔNG flag canonical. Nghi chính canonical sai ⇒ **INFORM riêng cho anh**, đừng tự phán. +## Tập-đo BẮT BUỘC gồm cả **thư mục lượt chạy** `.claude/workflows/runs/**` *(vá @S180 W3 gói-B — nợ GĐ-2(v-3))* + +🔴 **Đo trước khi vá:** file này có **0 hit** `run-folder|runs/` (control-dương cùng tệp: `FLAG`=4, `governance-detectors`=2 ⇒ thước đọc được, **0 là THẬT**). Tức mày **chưa bao giờ được bảo** nhìn vào chỗ lead đổ phần lớn lời khai của một wave. + +- **Vì sao trúng trục của mày:** `runs//` là nơi lead **surface** kết quả (`run.md` · `sub-*.md` · `*-synthesis.md`). View-lệch-source sống dày ở đây: `run.md` còn ghi `[!] đang làm` sau khi `sub-*.md` đã đóng · số trong `run.md` lệch số trong chính `sub-*` nó tóm · wave khai `XONG` mà `sub-*` khai `treo`. +- **Cách soi (rẻ, không đọc hết):** so **khối trạng-thái của `run.md`** với **dòng `END …` / bảng kết của từng `sub-*.md`** trong CÙNG run-folder. Lệch ⇒ FLAG `view-stale-status` (trạng-thái) hoặc `view-stale-count` (con số). +- 🔴 **PIN run-folder ĐÍCH DANH, cấm `glob-latest`** — cùng luật đã áp cho `ring2-audit` (carve-out §A1). Nhiều run-folder cùng phiên là chuyện thường; lấy "cái mới nhất" là lấy nhầm. +- 🔸 **Ranh:** `runs/**` của **phiên đã đóng** là **record đóng-băng** — ngày cũ ở đó **là mục-đích**, đừng flag (bẫy #3 ở dưới). Chỉ soi run-folder của **phiên đang mở**, hoặc khi chính lead đang trỏ tới nó. +- 🔸 **Không lấn:** *vật chứng có đủ ruột không* là việc của `scripts/artifact-integrity.ps1` (W2) — mày **đọc output nó**, không đếm lại. Mày chỉ soi **view lệch source**. + ## Bẫy đã cắn người khác — đừng dẫm lại 1. 🔴 **TỰ-THAM-CHIẾU (lead mắc @W0.4):** trích nguyên-văn claim-cũ vào báo-cáo ⇒ grep bắt trúng chính câu trích ⇒ FAIL trên bản SỬA ĐÚNG. Trích thì **cắt/mô-tả**, đừng dán nguyên chuỗi mày đang tố. diff --git a/.claude/agents/ring2-audit.md b/.claude/agents/ring2-audit.md index fff5d31..f58dfd9 100644 --- a/.claude/agents/ring2-audit.md +++ b/.claude/agents/ring2-audit.md @@ -1,7 +1,7 @@ --- name: ring2-audit description: | - Read-only INFORM-only KIỂM vòng-ĐO soi-lead (H24) cho SOLUTION_ERP (C4/C4b — adap dot-11 khoản ① `harness-dong-du-vong:51`, owner-decision [2] TÁCH mỗi-vòng-1-con, land S145 vai #2/3). Là vai-KIỂM ĐỘC-LẬP của vòng H24: ĐỌC OUTPUT của `lead-stale-auditor` (view LỆCH source, 5 class `view-*`) + `lead-gap-auditor` (cái BỊ THIẾU, 6 class `gap-*`), KHÔNG re-chạy việc soi-lead. 🔴 Mày KIỂM 2 con-đo H24 (chúng soi LEAD) — mày KHÔNG soi LEAD trực-tiếp. TRẢ verdict per-FLAG ĐẠT/TRƯỢT + falsify ≥2 + TỰ tái-dựng ≥1 số CÓ-THỂ-SAI (đếm flag-count · mở 1 FLAG cụ-thể đối-chứng source · 1 dòng `class_repeat` tally trong `.session-counter.json`). thách-CLEAN BẮT BUỘC khi 2 vai H24 báo ÍT/0 FLAG: tự soi 1 surface (STATUS/HANDOFF/agents) tìm FLAG bị sót — CLEAN "lead ổn" khi không ổn là ca nguy nhất. 🔴 no-self-exempt: KHÔNG phải lead-stale/lead-gap (m-3 S139). Class-flag = enum ĐÓNG `lead_self_audit.flag_classes` (`memory-budget.json`) — verify vai H24 KHÔNG tự chế class ngoài enum. AUTO fire SAU khi cặp H24 chạy (session-end §L.b(j) / session-start §2.1.8 khi OVERDUE — AUTO, owner @S146 "3 → auto", KHÔNG còn consent); H24 KHÔNG chạy phiên đó ⇒ pin missing ⇒ NO-OP im-lặng, CẤM ĐẠT-ảo. Propose-only, lead single-writer (backstop = git-diff commit-gate, KHÔNG dựa thiếu-tool). KHÔNG soi vòng tooling/harvest (đó là ring1-audit) · KHÔNG soi trio memory (đó là harness-audit) · KHÔNG chấm diff-code (đó là reviewer). PHẢI dùng SAU nấc đo H24 để đóng lỗ "vòng soi-lead 0 con soi". + Read-only INFORM-only KIỂM vòng-ĐO soi-lead (H24) cho SOLUTION_ERP (C4/C4b — adap dot-11 khoản ① `harness-dong-du-vong:51`, owner-decision [2] TÁCH mỗi-vòng-1-con, land S145 vai #2/3). Là vai-KIỂM ĐỘC-LẬP của vòng H24: ĐỌC OUTPUT của `lead-stale-auditor` (view LỆCH source, nhánh `view-*`) + `lead-gap-auditor` (cái BỊ THIẾU, nhánh `gap-*`), KHÔNG re-chạy việc soi-lead. 🔴 **Số class của mỗi nhánh KHÔNG chép ở đây — đếm từ khoá `lead_self_audit.flag_classes` (`memory-budget.json`)**; enum này đã mở rộng nhiều lần và mọi con số chép tay đều thối theo (vá @S180 W3: chỗ này từng ghi số cũ cho nhánh `view-*`, sai kể từ @S172). 🔴 Mày KIỂM 2 con-đo H24 (chúng soi LEAD) — mày KHÔNG soi LEAD trực-tiếp. TRẢ verdict per-FLAG ĐẠT/TRƯỢT + falsify ≥2 + TỰ tái-dựng ≥1 số CÓ-THỂ-SAI (đếm flag-count · mở 1 FLAG cụ-thể đối-chứng source · 1 dòng `class_repeat` tally trong `.session-counter.json`). thách-CLEAN BẮT BUỘC khi 2 vai H24 báo ÍT/0 FLAG: tự soi 1 surface (STATUS/HANDOFF/agents) tìm FLAG bị sót — CLEAN "lead ổn" khi không ổn là ca nguy nhất. 🔴 no-self-exempt: KHÔNG phải lead-stale/lead-gap (m-3 S139). Class-flag = enum ĐÓNG `lead_self_audit.flag_classes` (`memory-budget.json`) — verify vai H24 KHÔNG tự chế class ngoài enum. AUTO fire SAU khi cặp H24 chạy (session-end §L.b(j) / session-start §2.1.8 khi OVERDUE — AUTO, owner @S146 "3 → auto", KHÔNG còn consent); H24 KHÔNG chạy phiên đó ⇒ pin missing ⇒ NO-OP im-lặng, CẤM ĐẠT-ảo. Propose-only, lead single-writer (backstop = git-diff commit-gate, KHÔNG dựa thiếu-tool). KHÔNG soi vòng tooling/harvest (đó là ring1-audit) · KHÔNG soi trio memory (đó là harness-audit) · KHÔNG chấm diff-code (đó là reviewer). PHẢI dùng SAU nấc đo H24 để đóng lỗ "vòng soi-lead 0 con soi". model: opus effort: max tools: [Read, Grep, Glob, Bash, mcp__rag-unified__search_memory, mcp__rag-unified__search_code, mcp__rag-unified__cross_project_search, mcp__rag-unified__list_projects] diff --git a/.claude/governance/.session-counter.json b/.claude/governance/.session-counter.json index 0d2b092..fe3718e 100644 --- a/.claude/governance/.session-counter.json +++ b/.claude/governance/.session-counter.json @@ -1,4 +1,4 @@ -{ +{ "_note": "Harness-24 (S121, 2026-07-15, wave adap-6-broadcast W2) session counter for lead-self-audit cadence. THIS FILE HOLDS STATE ONLY - every cadence NUMBER lives in .claude/agent-memory/memory-budget.json -\u003e h24_cadence (single-source, H24 section 2(3)). Never copy the digits here.", "_why_content_based_not_blind_increment": "Owner-decisions-15-07-2026 Q2, trap found by lane E: the Stop-hook .claude/hooks/wal-flush.ps1 auto-commits on EVERY turn-boundary. A blind counter++ would therefore tick many times per real session and the cadence would be meaningless. So a tick is CONTENT-ADDRESSED: it is keyed on the repo HEAD sha at tick time. Ticking twice on the same HEAD is a NO-OP, which is what makes running /session-start twice in a row safe (acceptance: 2x /session-start on the same HEAD =\u003e +1, not +2).", "_why_this_path": "Deliberately .claude/governance/ and NOT .claude/agent-memory/. The hook covers exactly four paths (.claude/WAL.md, agent-memory/, workflows/runs/, sessions/ - the 4th added S146 together with the session-model logic-session folder); .claude/governance/ is OUTSIDE all four, so this file is never swept into a \u0027wal:\u0027 commit as a side effect. Compare .claude/agent-memory/.mfe-state.json, which IS inside the hook\u0027s reach - a counter must not live there. RE-VERIFIED at S146 when the 4th path landed: the claim is about the DIRECTORY, and .claude/sessions/ != .claude/governance/, so widening the hook did NOT invalidate it - only the count changed. Any future widening of wal-flush.ps1 MUST re-check this sentence, not just bump the number.", @@ -11,9 +11,9 @@ }, "_tick_invariant_note": "Tick invariant (hub dede7ec5 Delta-1, verbatim): moi LAN-CHOT +1; mot cap dung-noi tang DUNG +1, khong +2, khong +0. SE form = tick-at-entry-gate idempotent-per-label (hub Delta-2 recovery-gate +1 = permitted form) - NET +1/session-label EQUIV hub +1/cap on CLOSED pairs; an OPEN pair is transiently +0 until its entry gate fires (hub blessed, 9a35405b block-1 phep dung-noi). Guard song-con = label-convention (session-start 2.1.8: new conversation = new S\u003cnn\u003e label, NEVER reuse). history[] is append-unbounded BY DESIGN =\u003e absence of a marker = never-happened (safe semantics); IF a FIFO cap is ever added, eviction MUST be handled explicitly (absence-vi-bi-day != absence-vi-chua-xay-ra - log-BOUNDED design-note dede7ec5).", "_seed_honesty": "Seeded UNTICKED on purpose. counter=0 and last_ticked_* = null mean \u0027no tick has ever happened\u0027, which is the truth at S121 - the ritual that performs the tick lands in W3. Seeding a fake first tick here would make the very first cadence reading a lie, and H24 exists to catch exactly that kind of invented number.", - "counter": 53, - "last_ticked_session": "S179", - "last_ticked_head": "b99c1879f150f965527ab71fdd87b47fb468a5b1", + "counter": 54, + "last_ticked_session": "S180", + "last_ticked_head": "55894a04d0ee350df5ec0fa97626e8ca47580f0a", "last_ticked_at": "2026-08-07", "last_audit": { "light_at_counter": 53, @@ -271,6 +271,11 @@ "at": "2026-08-06", "session": "S178", "event": "CLEAN tick (session-counter-tick.ps1 M2): counter 51-\u003e52, session S177-\u003eS178, head d081681-\u003eee21056. Classify-before-tick: no regression (n=178 \u003e= stored n=177); last_ticked_head reachable (merge-base --is-ancestor exit 0). 4 fields updated, 1 history entry appended, written atomically (temp + Move-Item -Force)." + }, + { + "at": "2026-08-07", + "session": "S180", + "event": "squash-benign (session-counter-tick.ps1 M2, contract fail_loud_on_regress trigger-2 BENIGN branch): counter 53->54, session S179->S180, head b99c187->55894a0. last_ticked_head b99c187 object EXISTS (cat-file=commit) but NOT reachable (merge-base --is-ancestor exit!=0), counter not regressed => a closeout squash lifted the ticked wal:/session commit out of history (expected drift, not tamper). Trace appended, continue, no owner alarm. Written atomically (temp + Move-Item -Force)." } ] } diff --git a/.claude/sessions/session-12/_context-s-12.md b/.claude/sessions/session-12/_context-s-12.md index ccb4851..32ab42f 100644 --- a/.claude/sessions/session-12/_context-s-12.md +++ b/.claude/sessions/session-12/_context-s-12.md @@ -44,6 +44,34 @@ +### PAUSE-1 2026-08-07T17:34:01+07:00 + +> anh: Đồng ý /pause đi rồi note kỹ các việc sắp tới để turn sau làm tiếp + +**(1) QUYẾT-ĐỊNH ĐÃ CHỐT trong cửa này** +- **OD-1** N3 = LAI 4 lane GĐ + 2 lane xuyên suốt · **OD-2** thi công **đúng thứ tự GĐ-0→6, CẤM nhảy cóc** (anh chấp nhận đánh đổi: giá trị thấy được chậm hơn, đổi lấy 0 nợ điều-kiện-vào). +- Đợt 2 — **anh chọn phương án THAM VỌNG HƠN 3/4** (hướng chung: nhận ĐỦ hình dạng hub, không nhận bản rút gọn): + - **P6** mở INBOUND cho cả fan-out (additive, KHÔNG gỡ 22 dòng) ⇒ W0 mở khoá. + - **P1 = PA-2** hai mã thoát trong MỘT máy ⇒ W3b phải **phân loại ~70 cờ từng cái**. + - **P2 = PB-2** tách REQUEST ⟂ TASK ⇒ 🔴 **PHẢI SỬA luật đã ratify `tiep.md:181`** — lead làm **tường minh, có vết lineage**, cấm sửa lén. + - **P4** đẻ vai mới **+ nâng `hmw_width.cap` 20→30** ⇒ **ĐÓNG slot (75)** treo từ S172. Nợ kèm: **seed `measured{}` cho vai mới NGAY**. +- **4 wave ĐÓNG** với nghiệm thu đo được: **W0** (GĐ-0) · **W1** (GĐ-1) · **W2** (GĐ-2) · **W3** (GĐ-3, phần tự-chạy). +- Lead **BÁC nhãn "LỚP-5"** mà W2 gán cho `-Expect` của `naming-scan.ps1`: đọc mã thì đó là **tripwire có chủ đích** (cho `THIẾU-TẬP` một mẫu số = guard A2), in **cảnh báo VÀNG** chứ không đội thành `LECH`. Rủi ro thật = **alarm-fatigue**, không phải drift ⇒ chỉ vá baseline stale 54→55, **KHÔNG redesign**. +- Lead **DỪNG sửa mojibake** `sub-w3-nghi-thuc.md` sau 4 vòng (1.278→1.226, `U+FFFD`=0 suốt) — nội dung đọc được, 0 byte mất; cố thêm = tối ưu hình-thức-bằng-chứng trong khi bằng-chứng đã nguyên vẹn. + +**(2) DELTA CÒN SỐNG — mang sang cửa sau** +- 🔴 **5 khoản CHỜ ANH** (gom hỏi **1 lần** khi chạm W3b/W4b/W5b, đúng khuyến nghị N4 *"hỏi ≠ thi công"*): **P3** tập-tín-hiệu hub-ĐÓNG ⟂ SE-MỞ (tiền lệ owner S143) · **P5** luật tự-trị 3 bậc (gật nội dung + NGUỒN = `ACTIVE-MARKS`) · **P7** vị trí sổ-lượt-đắt + truyền-nguyên-văn lane dispatch · **P8** wire khối chấm vào 2 cửa phiên + INFORM ≥3 phiên · **(mới)** lược đồ cột `status` trong `_index.md` (`processed` = *đã move* ⟂ *đã áp*) — đổi lược đồ ⇒ chạm lằn ranh. +- **W5 BỊ CHẶN THẬT**: xếp *sau W4*, mà W4 cần **P2** thi hành (sửa luật ratify). ⇒ defect `spawn-model-audit` **chưa vá được** dù đã xác nhận. +- **Nợ kỹ thuật đã ghi tên:** 7 baseline `-Expect` sẽ rot (2 đường chưa chọn) · `_ledger.md` phủ **74/88 KHÔNG có dòng** · 6 ô nghiệm thu GĐ-2 mới **4,5/6** (không phải 6/6 như `wave-plan:69` đặt) · **V-5 vị-từ mã-hoá chưa cắm** (máy W2 mù nấc encoding — ca `sub-w3` chứng) · gom **583.683 B** harvest · vá `STATUS:467` **canonical tự huỷ** · `STATUS:481` bundle · `STATUS:833` backlog · mega-line `STATUS:8` + `HANDOFF:5` · lỗi máy **H24-2 anchor** · `ring2-audit` **26.440 B over-cap strike 1/2**. +- **4 persona-B vừa sửa CHỈ ĂN TỪ RESTART kế** ⇒ phải có **1 phép đo chỉ xanh SAU restart**, không thì *"chưa ăn"* trông y hệt *"hỏng"*. + +**(3) CON-TRỎ** +- run-folder: `.claude/workflows/runs/2026-08-07-S180-adap-upgrade-pack-phased/` (**~30 artifact**, có `adap-upgrade-pack-synthesis.md`) · `.claude/workflows/runs/2026-08-07-S180-bookend-open/` (**13 artifact**, có `bookend-open-synthesis.md`). +- spec: `spec-adap-upgrade-pack-phased-07-08-2026.md` · plan: `wave-plan-S180.md` · errata lead: `lead-errata-S180.md` (**12 mục**) · triage: `lead-triage-expect-baseline.md` · note mã-hoá: `lead-note-w3-encoding.md`. +- vật land: `docs/governance/{naming-standard,ritual-labels,adap-upgrade-pack-fitmap,adap-upgrade-pack-tracking}.md` · `scripts/{naming-scan,artifact-integrity,tien-kiem-cua}.ps1` · `broadcasts/_index.md` (45→69 dòng). +- 🔸 **`ctx-curator` KHÔNG spawn ở cửa này** — khai trễ: `_mind-s-12.md` chưa tồn tại lúc `/pause` (Phase 3.5 của `/session-start` không chạy vì anh giao việc ngay sau Phase 3); lead tạo `_mind` từ template ở cùng lượt này, nên không có bản-nháp-block để vai-1 kiểm. Cửa `/pause` kế sẽ có đủ. + + _(chưa có PAUSE — entry đầu append @`/pause` đầu tiên của phiên)_ --- diff --git a/.claude/sessions/session-12/_mind-s-12.md b/.claude/sessions/session-12/_mind-s-12.md new file mode 100644 index 0000000..e740283 --- /dev/null +++ b/.claude/sessions/session-12/_mind-s-12.md @@ -0,0 +1,97 @@ +# _mind-s-12 — SESSION-MODEL lớp MỀM (trí-nhớ suy-nghĩ 4 tầng) + + + + + +> **sID (LOGIC-session) = 12.** Tệp này giữ 4 thứ KHÔNG nằm ở WAL / HANDOFF / `_context`: **(A)** gói-turn · **(B)** hướng-tiếp · **(C)** kế-hoạch delta-suy-nghĩ · **(D)** đang-thảo-luận (+ **(E)** dòng-sống spawn). Nhà: `.claude/sessions/session-12/_mind-s-12.md`. +> ts-mốc khởi-tạo = **2026-08-07T17:34:01+07:00** (nguồn: `git log -1 --format=%cI @ HEAD 4091468`) — mốc git-committer, KHÔNG phải wall-clock tuỳ-tiện. +> +> **GHI = lead (single-writer)** @4 nhịp: block-0 cuối bootstrap · refresh @`/pause` · đọc + đối-chiếu @`/tiep` · mục E gom MỌI spawn/engine-run. **KIỂM = máy + vai** (tách khỏi ghi): `python scripts/session_ctx.py mind-check --session 12` mỗi cửa (~$0) + vai `ctx-audit` @2 bookend (INFORM-only, quyền phán TRƯỢT). +> **Trần tệp** = khoá `mind_ctx_kb` trong `.claude/agent-memory/memory-budget.json` — **B1: trỏ khoá, CẤM chép số vào tệp này.** + +### 🔴 CHIỀU CHÈN — NGƯỢC với `_context` (đọc trước khi chèn block đầu tiên) + +- **`_mind` = MỚI-NHẤT-Ở-TRÊN.** Block mới chèn NGAY DƯỚI **dòng marker điểm-chèn** (dòng comment nằm ngay trên block top, dưới khối luật này). +- **3 dòng comment marker của tệp** (mở khối luật · đóng khối luật · điểm-chèn) xuất hiện **ĐÚNG 1 LẦN** mỗi cái. Vì vậy phần chữ ở dưới CHỈ gọi chúng bằng **mô-tả**, KHÔNG viết lại tên marker — máy/người tìm-chuỗi sẽ không bắt nhầm anchor rồi chèn vào giữa khối luật. Máy khớp anchor bằng **token** trên dòng bắt đầu ``, vì marker có chú-thích viết cùng dòng — mirror `FLOW-START` của `session-context-template.md`). +- **`_context` FLOW = MỚI-NHẤT-Ở-CUỐI** (`.claude/templates/session-context-template.md`, dòng `FLOW-START`). **HAI TỆP NGƯỢC CHIỀU NHAU** — CẤM "adopt verbatim" khuôn bên kia sang đây. Lý-do: `_mind` đọc để **nạp lại trạng-thái** ⇒ thứ mới nhất phải ở màn hình đầu; `_context` là **biên-niên-sử durable** ⇒ đọc xuôi thời-gian. +- **Số hiệu = ĐẾM số block hiện có TRƯỚC KHI chèn** (block-0 chiếm số 0 ⇒ đang có n block thì block mới là `MIND-n`). Máy chỉ đòi *số duy-nhất* + *block top ≥ mọi số dưới* — KHÔNG neo công-thức đếm, nhà đổi công-thức vẫn kiểm được. +- **Block cũ BẤT BIẾN** (append-only, không rewrite / không tự-tóm). **Ngoại lệ DUY NHẤT**: nén khi vượt trần — nén block CŨ NHẤT **trừ block-0 và block top**, verbatim vẫn còn trong git; **<3 block ⇒ TỪ-CHỐI nén**, giương cờ vượt trần (nợ hiển thị, không xoá chứng-nhân). +- **Việc ĐÃ-CHỐT ⇒ chỉ con-trỏ** (`.claude/WAL.md` · `docs/HANDOFF.md` · `.claude/workflows/runs//…`) — **CẤM chép nội-dung** (2-sự-thật + phình trần). +- **Mục trống ⇒ ghi đúng chuỗi `(trống — khai)`** trên 1 dòng riêng, KHÔNG thêm chữ, KHÔNG bọc dấu nhấn (máy so chuỗi). CẤM bỏ heading — vắng-mặt trông giống ổn. +- **5 heading trong mỗi block = `### A.` … `### E.`** (thứ tự A→E cố định) — đây là hợp-đồng hình-dạng cho máy `mind-check` và vai `ctx-audit`. +- **Mục D: mỗi ý 1 dòng + BẮT BUỘC nhãn**, viết **đúng chuỗi CÓ DẤU**: `{mới-nêu | đang-cãi | gần-chốt | treo-chờ-anh}`. Máy so chuỗi ⇒ viết không dấu = **trượt-cấu-trúc**. (Phần chữ hướng-dẫn trong khối luật này theo khuôn nhà có thể không dấu, nhưng **token máy đọc thì giữ dấu** — đừng chép ngược.) + +### 3 RÀO NỘI-DUNG (máy `mind-check` phép 1-3 — mỗi rào kèm LÝ-DO ĐO ĐƯỢC) + +1. **Rào-1 — CẤM verbatim lời anh.** Dạng bị bắt = dòng blockquote mở đầu bằng `anh` + hai chấm, ví-dụ: + > anh: + + *Lý-do đo được:* verbatim lời anh có **nguồn-duy-nhất** = `_context` FLOW (`### PAUSE-` → dòng quote). `_mind` là lớp mềm bị nén/diễn-giải mỗi cửa ⇒ chép verbatim vào đây tạo bản-thứ-2, và khi 2 bản lệch thì bản mềm (đọc trước, giàu ngữ-cảnh hơn) sẽ thắng bản durable. Trong `_mind` chỉ được TRỎ: `xem PAUSE-`. +2. **Rào-2 — CẤM khoá `ts:` ở ĐẦU DÒNG** (mọi biến thể: thụt space/tab, hoa/thường, có khoảng trắng trước dấu hai chấm). Mốc thời-gian sống **trong dòng heading, sau em-dash**: `## MIND- @ `. + *Lý-do đo được:* marker nhà (`_pause-*` · `_tiep-*` · `_snapshot-*`) mang khoá đó ở đầu dòng **by-design**; reader-mốc TƯƠNG-LAI (gap C10-LATENESS của `scripts/governance-detectors.ps1` — C10 tự khai "no reliable source" cho ts-compare) sẽ quét cả `session-/_*` mà **không lọc theo tên tệp** ⇒ một dòng khoá trong `_mind` đủ để nó lấy sai "mốc gần nhất". Regex canonical = `_TS_KEY_RE` trong `scripts/session_ctx.py`; **CẤM cài bản thứ 2** ở bất kỳ máy nào (2-sự-thật chính là thứ rào này chặn). +3. **Rào-3 — CẤM secret, KỂ CẢ dưới dạng ví-dụ.** Tập tiền-tố cấm = `SECRET_PATTERNS` trong `scripts/session_ctx.py` — **trỏ nguồn, KHÔNG chép mẫu vào tệp này**. Ngoại lệ DUY NHẤT: nhãn đã che `[đã che <8-hex>]`. Bắt buộc quét NHÁP **trước** khi chèn: `mind-check --session 12 --draft `. + *Lý-do đo được, 2 tầng:* (i) block BẤT BIẾN ⇒ secret lọt là **vĩnh viễn** (còn trong git dù xoá sau); (ii) ⚠️ **enclosure KHÔNG đối-xứng giữa 2 lưới**: `mind-check` chỉ soi DƯỚI marker đóng khối luật, còn `secrets-sweep` (cùng `session_ctx.py`, chạy ở auto-snapshot mỗi `/pause`) **rglob TRỌN `session-/` và không biết khối luật này** ⇒ một mẫu secret viết làm ví-dụ ngay tại đây sẽ **chặn commit ở MỌI cửa pause**. Vì thế rào-2 và rào-3 ở trên **cố ý KHÔNG có ví-dụ literal**; chỉ rào-1 có, vì rào-1 chỉ `mind-check` đọc và nó enclosure-aware. + +### Enclosure use ⟂ mention + +Máy chỉ quét phần **DƯỚI** marker đóng khối luật (dòng comment cuối cùng của phần luật này). Khối luật được phép chứa chuỗi bị cấm để **giải thích** (citation-trap: doc định-nghĩa anti-pattern tất-yếu chứa chính mẫu đó). Hệ quả 2 chiều: **đừng** dịch ví-dụ xuống dưới marker đóng, và **đừng** viết nội-dung thật lên trên nó. + + + + + + + + +## MIND-0 — 2026-08-07T17:34:01+07:00 @ 4091468 (window 1) + +### A. Gói-turn +Phiên mở bằng `/session-start` (bookend @open 5 vòng, 8 vai) rồi anh giao chuỗi 5 nấc adap gói 7-GĐ. Đã đóng **4 wave** (W0·W1·W2·W3) + trả sạch 3 nợ máy-bắt. Anh chốt **6 quyết định owner**, trong đó 3/4 đợt-2 **ngược khuyến nghị lead** — hướng: nhận ĐỦ hình hub. + +### B. Hướng-tiếp + nhánh-đã-loại +**Hướng:** gom **5 câu chờ anh** hỏi 1 lần → P2 thi hành (sửa `tiep.md:181` tường minh có vết) → W4 → W5 (vá defect `spawn-model-audit`) → W3b/W4b/W5b/W6. +**Nhánh đã LOẠI:** (a) *"W5 ghép W2"* của N1 — **BÁC VĨNH VIỄN** (vi phạm điều-kiện-vào GĐ-5 + OD-2) · (b) redesign 7 baseline `-Expect` ngay lượt này — loại vì vứt bằng chứng fault-inject W1 và là quyền anh · (c) sửa mojibake `sub-w3` tới cùng — loại sau 4 vòng, lợi ích biên < rủi ro ghi đè. + +### C. Kế-hoạch (delta suy-nghĩ) +Delta lớn nhất so lúc mở: **luật "sạch tới đúng độ sâu máy KIỂM"** (W1-a đo được) đã trở thành ràng buộc xuyên mọi wave — áp 4 lần liên tiếp (W1 chuẩn tên · W2 vị từ ghi đĩa · W3 nhãn nghi thức · và chính máy W2 mù nấc mã-hoá). ⇒ **mọi wave sau phải khai NẤC nó ép được**, không ký sâu hơn máy. + +### D. Đang-thảo-luận +- `{treo-chờ-anh}` **P3** tập-tín-hiệu ĐÓNG⟂MỞ · **P5** luật tự-trị 3 bậc · **P7** vị trí sổ-lượt-đắt · **P8** wire khối chấm · **lược đồ cột `status`**. +- `{gần-chốt}` **V-5 vị-từ mã-hoá** — lead đã viết spec 1 dòng grep + phân biệt 2 nấc (`U+FFFD>0` = mất dữ liệu ⟂ moji-only = sửa được); chỉ chờ chỗ cắm. +- `{đang-cãi}` 7 baseline `-Expect`: giữ-tripwire-thêm-ngày ⟂ tách-file-dữ-liệu. Cả hai đều đổi thiết kế máy governance. +- `{mới-nêu}` F-1 gửi ngược hub: 4 thư mang `status: DRAFT` + `reviewer_gate: PENDING` mà đã phát. + +### E. Dòng-sống spawn/engine-run +- `/fable-real investigator-codebase` (N1) → `PHỦ ĐỦ 7GĐ/12TC/9LỖI` → `sub-invest-fitmap-S180.md` +- `/fable-real reviewer` (N2) → `PASS_WITH_FIXES 0C/5M/6m`, **claim-không-đứng = 0** → `sub-review-n2-S180.md` +- `/fable-clone reviewer` ×6 lane (N3) → A/B/C/D/E/F → 6 file `sub-n3-lane-*.md` +- `/fable-real reviewer` (N4) → **7 wave + 3 sub gated, 0 loại** → `wave-plan-S180.md` +- W0 ×2 · W1 ×2 · W2 · W3 → 4 wave đóng, vật land ở `docs/governance/` + `scripts/` +- bookend @open 8 vai → `bookend-open-synthesis.md` +🔴 **21 vai dính #53, recover 21/21, mất 0 byte** · **vai bác lead 11 lần, 11/11 đúng** + +🔸 **KHAI TRỄ:** block-0 này đáng ra ghi ở **Phase 3.5 `/session-start`**; nó không chạy vì anh giao việc ngay sau Phase 3 REPORT. Ghi bù tại `/pause` cửa-1, nên **không có bản-nháp để `ctx-curator` kiểm** ở cửa này — cửa `/pause` kế sẽ có đủ. + diff --git a/.claude/sessions/session-12/_pause-1.md b/.claude/sessions/session-12/_pause-1.md new file mode 100644 index 0000000..ce6d073 --- /dev/null +++ b/.claude/sessions/session-12/_pause-1.md @@ -0,0 +1,5 @@ +ts: 2026-08-07T17:34:01+07:00 +head-sha: 40914682b1513778b33e1fd5be547b4dfb95408f +window-ordinal: 1 +jsonl-hint: D--Dropbox-CONG-VIEC-SOLUTION-SOLUTION-ERP/be228103-d2dc-4df6-aa72-1914725656c5 +account-label: none diff --git a/.claude/workflows/hmw.js b/.claude/workflows/hmw.js index eee5f33..173ffb0 100644 --- a/.claude/workflows/hmw.js +++ b/.claude/workflows/hmw.js @@ -30,7 +30,9 @@ const VALID_ROLES = [ 'lead-stale-auditor', 'lead-gap-auditor', // +S121 W2 (H24 lead-self-audit) — 2 monitor MỚI, INFORM-only propose-only. // 🔴 KHÔNG gộp vào tooling-auditor(H1)/harvest-curator(H2): H24 §2(1) soi LEAD (view-* = lead nhìn sai / gap-* = // lead bỏ sót), khác trục H1 (tooling-freshness) và H2 (harvest-integrity). Class-flag = enum ĐÓNG ở - // memory-budget.json → lead_self_audit.flag_classes (11 class: 5 view-* + 6 gap-*) — vai KHÔNG tự chế class. + // memory-budget.json → lead_self_audit.flag_classes — vai KHÔNG tự chế class. 🔴 KHÔNG chép SỐ lớp vào đây (B1): + // đếm bằng chính khoá đó, đừng tin comment. Câu cũ chép cứng một con số lớp và SAI CẢ TỔNG LẪN THÀNH PHẦN — + // lớp `view-claim-broader-than-sample` nằm CUỐI mảng, ngoài cụm `view-*` liền kề, nên đếm lướt bị hụt. // Từ-vựng "view"/"omission" chọn CÓ CHỦ-ĐÍCH tránh va-chạm: governance-detectors.ps1:15 đã sở-hữu // "derived-staleness" ⇒ cấm tên *-stale-role; "GAP" quá-tải (session-end build-gap · memory-selfimprove CRITERIA+GAP). 'harness-eval', 'harness-refine', 'harness-audit', // +S141 bộ-ba đồng-kiểm memory-system (adopt AI_INFRA 2026-07-18 khuôn 5-câu) read-only INFORM-only propose-only; diff --git a/broadcasts/_index.md b/broadcasts/_index.md index 7f1e0fb..5e130b8 100644 --- a/broadcasts/_index.md +++ b/broadcasts/_index.md @@ -4,59 +4,88 @@ > Mỗi message = 1 dòng. **Append-only.** Inbound: stick **đã-đọc** khi xử lý xong. > **verify** = `SHA256(body)` bản copy == `content_sha256` (frontmatter) == bản `outbox` bên gửi (byte-identical) → ✓ · lệch = ✗ (tamper-flag, điều tra ngay). > Folder map: `A/outbox/B/` (A→B) ⇄ `B/inbox/A/` (B kéo về). 6 folder mỗi chiều (trừ self=se). -> **Fan-out adap broadcast** (≠ email directed) → `outbox/all/` (pull `/adap-apply`), track ở COMMS-LEDGER OUT — KHÔNG ở index này (index = email mesh in/out). +> **Chiều NHẬN — hai kênh, MỘT sổ** (owner chốt **P6** @S180, 2026-08-07; đường additive): khối `INBOUND` của sổ này nhận **CẢ HAI** kênh — thư gửi **đích danh** ở `outbox/se` (kéo bằng `/check-email`) **VÀ** thư **phát đại trà** ở `outbox/all` (kéo và áp bằng `/adap-apply`). Cột **`kênh`** phân biệt hai loại: `se` = đích danh · `all` = phát đại trà. Quyết định này **hợp thức hoá 22 dòng phát đại trà vốn đã sống trong sổ**; không dòng nào bị gỡ và không dựng sổ thứ hai. +> 🧊 **Luật cũ ở đúng dòng này khai ngược lại** — *"Fan-out adap broadcast (≠ email directed) → `outbox/all/` (pull `/adap-apply`), track ở COMMS-LEDGER OUT — KHÔNG ở index này"* — và nó đã lệch với thực tế **22 lần**: sổ làm một đằng, luật viết một nẻo (đo @S180, lane A §2.2). Giữ nguyên văn câu cũ ở đây làm vết, không xoá. +> **Chiều GỬI chưa đổi, và đang treo một chỗ trỏ hỏng — P6 KHÔNG phán khoản này:** luật cũ bảo thư phát đại trà **đi ra** thì ghi ở `COMMS-LEDGER`. Đo @S180: `find . -iname "*COMMS*"` (loại `.git` và `node_modules`) = **0 tệp trong kho SE**, trong khi control dương cùng lệnh với `*ledger*` = **4 tệp** ⇒ lệnh chạy được, kết quả rỗng là rỗng thật; và `broadcasts/outbox/all/` = **0 tệp** ⇒ SE chưa từng phát đại trà lần nào. ⇒ Khoản chiều GỬI **để nguyên, chờ owner phán** — xem `sub-w0b-index-hash.md` §5. > **infra-CC row (§N3):** message `-cc` (`cc-of:`) = bản-2 se gửi `ai_infra` giám sát infra-comms sister↔sister. Ghi rõ `cc-of` vào cell `from → to` — vd OUTBOUND `se → ai_infra (cc-of:vipix)` · INBOUND `vipix → ai_infra (cc-of:se)`. Cùng status/verify như message thường (whole-file + body-hash đối chứng). ## 📥 INBOUND (nhận — qua `/check-email `) > status: **pending** (ở `inbox/` root, chưa xử lý) → **processed** (đã MOVE vào `inbox//`). -| received | id | from → to | status | folder | sha256(12) | verify | -|---|---|---|---|---|---|---| -| 2026-06-09 | 2026-06-09-namgroup-to-se-ui-design-conventions | namgroup → se | processed | namgroup | 0140b81fb8a6 | ✓ | -| 2026-06-11 | 2026-06-11-ai_infra-to-se-ui-ux-design-guide | ai_infra → se | processed | ai_infra | d353ee460dba | ✓ | -| 2026-06-18 | 2026-06-18-ai_infra-to-se-harness-11-available | ai_infra → se | processed | ai_infra | b2a2fc1cf399 | ✓ | -| 2026-06-20 | 2026-06-19-ai_infra-to-se-harness-all-notify | ai_infra → se | processed | ai_infra | 50ec0b925157 | ✓ | -| 2026-06-20 | 2026-06-20-ai_infra-to-se-harness-14-adopt-notify | ai_infra → se | processed | ai_infra | 37ae1b19595a | ✓ | -| 2026-06-21 | 2026-06-20-ai_infra-to-se-harness-15-v2-notify | ai_infra → se | processed | ai_infra | 2e6097817e2d | ✓ | -| 2026-07-03 | 2026-07-03-ai_infra-to-se-batch13-ack-stamp-and-answers | ai_infra → se | processed | ai_infra | 72aaeeeed215 | ✓ | -| 2026-07-06 | 2026-07-04-Governance-notify-harness-full-recheck | ai_infra → se | processed | ai_infra | 78dc1d82 | ✓ | -| 2026-07-06 | 2026-07-04-ai_infra-to-se-consolidation-notify | ai_infra → se | processed | ai_infra | ad58db9b924a | ✓ | -| 2026-07-06 | 2026-07-04-ai_infra-to-se-notify-auto-hygiene | ai_infra → se | processed | ai_infra | 7499be2e(no-stamp·wf✓) | ✓ | -| 2026-07-11 | 2026-07-11-ai_infra-to-se-notify-model-tier-v3 | ai_infra → se | processed | ai_infra | a979743596e3 | ✓ | -| 2026-07-11 | 2026-07-11-ai_infra-to-se-triage-reply-s1-s6 | ai_infra → se | processed | ai_infra | 281a67958835 | ✓ | -| 2026-07-11 | 2026-07-10-Governance-harness-21-spec-file-invocation | ai_infra → se | processed | ai_infra | 19cc954b1ee9 | ✓ | -| 2026-07-11 | 2026-07-11-Governance-model-tier-v3-lead-owner-choice | ai_infra → se | processed | ai_infra | 1b3aa9091173 | ✓ | -| 2026-07-12 | 2026-07-11-ai_infra-to-se-notify-harness-22-wal | ai_infra → se | processed | ai_infra | c64a7ac2a1bb | ✓ | -| 2026-07-12 | 2026-07-11-Governance-harness-22-wal-session-continuity | ai_infra → se | processed | ai_infra | 3de0758a6377 | ✓ | -| 2026-07-13 | 2026-07-13-ai_infra-to-se-approve-h22-h21mtv3-and-presence-notify | ai_infra → se | processed | ai_infra | 6c32df89b60a | ✓ | -| 2026-07-15 | 2026-07-15-ai_infra-to-se-reply-wave-s122 | ai_infra → se | processed | ai_infra | 7fca0deb97ff | ✓ | -| 2026-07-16 | 2026-07-16-ai_infra-to-se-huong-dan-adap-4-ban-moi | ai_infra → se | processed | ai_infra | 181a6d195468 | ✓ | -| 2026-07-16 | 2026-07-15-Governance-h17-cadence-update-bookend | ai_infra → se | processed | ai_infra | 85bf89ca7d3e | ✓ | -| 2026-07-16 | 2026-07-16-Governance-tang-luu-tru-so-cai-va-bai-hoc-instrument-dong-cung | ai_infra → se | processed | ai_infra | 291550ffa295 | ✓ | -| 2026-07-16 | 2026-07-16-Governance-vong-tu-bao-tri-thu-nam-san-su-that-nhan-da-do | ai_infra → se | processed | ai_infra | 190c11ba2bc0 | ✓ | -| 2026-07-16 | 2026-07-16-Governance-session-logic-tach-session-vat-ly-huong-van-hanh-moi | ai_infra → se | processed | ai_infra | 9234a7aa1009 | ✓ | -| 2026-07-16 | 2026-07-16-Governance-owner-chot-contextual-retrieval-false-fleet-wide | ai_infra → se | processed | ai_infra | f5ce27780af8 | ✓ | -| 2026-07-16 | 2026-07-16-Governance-erratum-eol-metric-hai-chieu-va-bon-lo-moi | ai_infra → se | processed | ai_infra | eb12b9b8c2e9 | ✓ | -| 2026-07-16 | 2026-07-16-Governance-tong-hop-loi-da-bat-va-sua-bay-lop-sau-phep-thu | ai_infra → se | processed | ai_infra | 0db707e4381d | ✓ | -| 2026-07-17 | 2026-07-16-ai_infra-to-se-reply-adap-dot-16-07 | ai_infra → se | processed | ai_infra | e50a4bd0109d | ✓ | -| 2026-07-17 | 2026-07-17-ai_infra-to-se-reply-h24-cadence-3-gap | ai_infra → se | processed | ai_infra | 0b581ae79815 | ✓ | -| 2026-07-17 | 2026-07-16-Governance-loi-phong-workflow-chet-non-json-args | ai_infra → se | processed | ai_infra | 6c2eb2b19bae | ✓ | -| 2026-07-17 | 2026-07-16-Governance-notify-hai-ban-moi-va-kenh-hoi-dap-hub | ai_infra → se | processed | ai_infra | dacfcb11a690 | ✓ | -| 2026-07-17 | 2026-07-16-Governance-vong-bon-da-dong-giac-ngu-nen-tri-nho | ai_infra → se | processed | ai_infra | 89e4d818b8be | ✓ | -| 2026-07-17 | 2026-07-17-Governance-checklist-nam-vong-va-kiem-audit-xuyen-session | ai_infra → se | processed | ai_infra | f71c5b653185 | ✓ | -| 2026-07-17 | 2026-07-17-Governance-khung-nhip-nam-vong-do-rai-lam-don | ai_infra → se | processed | ai_infra | 3daf5ee48f47 | ✓ | -| 2026-07-17 | 2026-07-17-Governance-dinh-chinh-kep-nhan-grounded-va-filter-office | ai_infra → se | processed | ai_infra | 624c378d6ee1 | ✓ | -| 2026-07-17 | 2026-07-17-Governance-master-checklist-hai-tang-moi-cua-phien | ai_infra → se | processed | ai_infra | cadd24aed2e4 | ✓ | -| 2026-07-17 | 2026-07-17-Governance-nam-quyet-owner-mot-ngay-lam-viec-ky | ai_infra → se | processed | ai_infra | 123d8272bbf5 | ✓ | -| 2026-07-20 | 2026-07-17-ai_infra-to-se-reply-adap-wave-carveout-dp2 | ai_infra → se | processed | ai_infra | 9a35405b6433 | ✓ | -| 2026-07-20 | 2026-07-18-ai_infra-to-se-nudge-pull-dot-9-10 | ai_infra → se | processed | ai_infra | 9cd1a486af96 | ✓ | -| 2026-07-20 | 2026-07-18-ai_infra-to-se-reply-tong-bo-ba-harness-sub-4-khoan | ai_infra → se | processed | ai_infra | 58e28baedf05 | ✓ | -| 2026-07-20 | 2026-07-17-Governance-chuan-hoa-stamp-decode | ai_infra → se | processed | ai_infra | 6239dd403792 | ✓ | -| 2026-07-20 | 2026-07-17-Governance-khung-nhip-dinh-chinh-wording-tick-annex-phep-8 | ai_infra → se | processed | ai_infra | dede7ec56ccc | ✓ | -| 2026-07-20 | 2026-07-17-Governance-session-model-phien-logic-manifest | ai_infra → se | processed | ai_infra | 101e69d61675 | ✓ | -| 2026-07-20 | 2026-07-18-Governance-model-tier-h23-precedence-tested-update | ai_infra → se | processed | ai_infra | d68de5e7b72d | ✓ | -| 2026-07-22 | 2026-07-22-ai_infra-to-se-reply-adap11-c7-bulk-shards | ai_infra → se | processed | ai_infra | 01f567a379d4 | ✓ | -| 2026-07-22 | 2026-07-22-ai_infra-to-se-reply-session-model-dung-ban-da-duyet | ai_infra → se | processed | ai_infra | 8378a68b6f7e | ✓ | +> 🔴 **Hai cột `kênh` + `ghi-chú` đặt ở CUỐI hàng, cố ý.** Đặt cuối thì mỗi dòng cũ chỉ được **nối thêm**, phần chữ cũ vẫn là **tiền tố nguyên vẹn** của dòng mới — kiểm lại được bằng máy, không phải tin lời hứa "tôi không sửa gì". Backfill @S180 lấy từ trường `to:` của chính tệp trên đĩa: **23 dòng `se` · 22 dòng `all`**, 0 dòng mồ côi. + +| received | id | from → to | status | folder | sha256(12) | verify | kênh | ghi-chú | +|---|---|---|---|---|---|---|---|---| +| 2026-06-09 | 2026-06-09-namgroup-to-se-ui-design-conventions | namgroup → se | processed | namgroup | 0140b81fb8a6 | ✓ | se | | +| 2026-06-11 | 2026-06-11-ai_infra-to-se-ui-ux-design-guide | ai_infra → se | processed | ai_infra | d353ee460dba | ✓ | se | | +| 2026-06-18 | 2026-06-18-ai_infra-to-se-harness-11-available | ai_infra → se | processed | ai_infra | b2a2fc1cf399 | ✓ | se | | +| 2026-06-20 | 2026-06-19-ai_infra-to-se-harness-all-notify | ai_infra → se | processed | ai_infra | 50ec0b925157 | ✓ | se | | +| 2026-06-20 | 2026-06-20-ai_infra-to-se-harness-14-adopt-notify | ai_infra → se | processed | ai_infra | 37ae1b19595a | ✓ | se | | +| 2026-06-21 | 2026-06-20-ai_infra-to-se-harness-15-v2-notify | ai_infra → se | processed | ai_infra | 2e6097817e2d | ✓ | se | | +| 2026-07-03 | 2026-07-03-ai_infra-to-se-batch13-ack-stamp-and-answers | ai_infra → se | processed | ai_infra | 72aaeeeed215 | ✓ | se | | +| 2026-07-06 | 2026-07-04-Governance-notify-harness-full-recheck | ai_infra → se | processed | ai_infra | 78dc1d82 | ✓ | se | | +| 2026-07-06 | 2026-07-04-ai_infra-to-se-consolidation-notify | ai_infra → se | processed | ai_infra | ad58db9b924a | ✓ | se | | +| 2026-07-06 | 2026-07-04-ai_infra-to-se-notify-auto-hygiene | ai_infra → se | processed | ai_infra | 7499be2e(no-stamp·wf✓) | ✓ | se | | +| 2026-07-11 | 2026-07-11-ai_infra-to-se-notify-model-tier-v3 | ai_infra → se | processed | ai_infra | a979743596e3 | ✓ | se | | +| 2026-07-11 | 2026-07-11-ai_infra-to-se-triage-reply-s1-s6 | ai_infra → se | processed | ai_infra | 281a67958835 | ✓ | se | | +| 2026-07-11 | 2026-07-10-Governance-harness-21-spec-file-invocation | ai_infra → se | processed | ai_infra | 19cc954b1ee9 | ✓ | all | | +| 2026-07-11 | 2026-07-11-Governance-model-tier-v3-lead-owner-choice | ai_infra → se | processed | ai_infra | 1b3aa9091173 | ✓ | all | | +| 2026-07-12 | 2026-07-11-ai_infra-to-se-notify-harness-22-wal | ai_infra → se | processed | ai_infra | c64a7ac2a1bb | ✓ | se | | +| 2026-07-12 | 2026-07-11-Governance-harness-22-wal-session-continuity | ai_infra → se | processed | ai_infra | 3de0758a6377 | ✓ | all | | +| 2026-07-13 | 2026-07-13-ai_infra-to-se-approve-h22-h21mtv3-and-presence-notify | ai_infra → se | processed | ai_infra | 6c32df89b60a | ✓ | se | | +| 2026-07-15 | 2026-07-15-ai_infra-to-se-reply-wave-s122 | ai_infra → se | processed | ai_infra | 7fca0deb97ff | ✓ | se | | +| 2026-07-16 | 2026-07-16-ai_infra-to-se-huong-dan-adap-4-ban-moi | ai_infra → se | processed | ai_infra | 181a6d195468 | ✓ | se | | +| 2026-07-16 | 2026-07-15-Governance-h17-cadence-update-bookend | ai_infra → se | processed | ai_infra | 85bf89ca7d3e | ✓ | all | | +| 2026-07-16 | 2026-07-16-Governance-tang-luu-tru-so-cai-va-bai-hoc-instrument-dong-cung | ai_infra → se | processed | ai_infra | 291550ffa295 | ✓ | all | | +| 2026-07-16 | 2026-07-16-Governance-vong-tu-bao-tri-thu-nam-san-su-that-nhan-da-do | ai_infra → se | processed | ai_infra | 190c11ba2bc0 | ✓ | all | | +| 2026-07-16 | 2026-07-16-Governance-session-logic-tach-session-vat-ly-huong-van-hanh-moi | ai_infra → se | processed | ai_infra | 9234a7aa1009 | ✓ | all | | +| 2026-07-16 | 2026-07-16-Governance-owner-chot-contextual-retrieval-false-fleet-wide | ai_infra → se | processed | ai_infra | f5ce27780af8 | ✓ | all | | +| 2026-07-16 | 2026-07-16-Governance-erratum-eol-metric-hai-chieu-va-bon-lo-moi | ai_infra → se | processed | ai_infra | eb12b9b8c2e9 | ✓ | all | | +| 2026-07-16 | 2026-07-16-Governance-tong-hop-loi-da-bat-va-sua-bay-lop-sau-phep-thu | ai_infra → se | processed | ai_infra | 0db707e4381d | ✓ | all | | +| 2026-07-17 | 2026-07-16-ai_infra-to-se-reply-adap-dot-16-07 | ai_infra → se | processed | ai_infra | e50a4bd0109d | ✓ | se | | +| 2026-07-17 | 2026-07-17-ai_infra-to-se-reply-h24-cadence-3-gap | ai_infra → se | processed | ai_infra | 0b581ae79815 | ✓ | se | | +| 2026-07-17 | 2026-07-16-Governance-loi-phong-workflow-chet-non-json-args | ai_infra → se | processed | ai_infra | 6c2eb2b19bae | ✓ | all | | +| 2026-07-17 | 2026-07-16-Governance-notify-hai-ban-moi-va-kenh-hoi-dap-hub | ai_infra → se | processed | ai_infra | dacfcb11a690 | ✓ | all | | +| 2026-07-17 | 2026-07-16-Governance-vong-bon-da-dong-giac-ngu-nen-tri-nho | ai_infra → se | processed | ai_infra | 89e4d818b8be | ✓ | all | | +| 2026-07-17 | 2026-07-17-Governance-checklist-nam-vong-va-kiem-audit-xuyen-session | ai_infra → se | processed | ai_infra | f71c5b653185 | ✓ | all | | +| 2026-07-17 | 2026-07-17-Governance-khung-nhip-nam-vong-do-rai-lam-don | ai_infra → se | processed | ai_infra | 3daf5ee48f47 | ✓ | all | | +| 2026-07-17 | 2026-07-17-Governance-dinh-chinh-kep-nhan-grounded-va-filter-office | ai_infra → se | processed | ai_infra | 624c378d6ee1 | ✓ | all | | +| 2026-07-17 | 2026-07-17-Governance-master-checklist-hai-tang-moi-cua-phien | ai_infra → se | processed | ai_infra | cadd24aed2e4 | ✓ | all | | +| 2026-07-17 | 2026-07-17-Governance-nam-quyet-owner-mot-ngay-lam-viec-ky | ai_infra → se | processed | ai_infra | 123d8272bbf5 | ✓ | all | | +| 2026-07-20 | 2026-07-17-ai_infra-to-se-reply-adap-wave-carveout-dp2 | ai_infra → se | processed | ai_infra | 9a35405b6433 | ✓ | se | | +| 2026-07-20 | 2026-07-18-ai_infra-to-se-nudge-pull-dot-9-10 | ai_infra → se | processed | ai_infra | 9cd1a486af96 | ✓ | se | | +| 2026-07-20 | 2026-07-18-ai_infra-to-se-reply-tong-bo-ba-harness-sub-4-khoan | ai_infra → se | processed | ai_infra | 58e28baedf05 | ✓ | se | | +| 2026-07-20 | 2026-07-17-Governance-chuan-hoa-stamp-decode | ai_infra → se | processed | ai_infra | 6239dd403792 | ✓ | all | | +| 2026-07-20 | 2026-07-17-Governance-khung-nhip-dinh-chinh-wording-tick-annex-phep-8 | ai_infra → se | processed | ai_infra | dede7ec56ccc | ✓ | all | | +| 2026-07-20 | 2026-07-17-Governance-session-model-phien-logic-manifest | ai_infra → se | processed | ai_infra | 101e69d61675 | ✓ | all | | +| 2026-07-20 | 2026-07-18-Governance-model-tier-h23-precedence-tested-update | ai_infra → se | processed | ai_infra | d68de5e7b72d | ✓ | all | | +| 2026-07-22 | 2026-07-22-ai_infra-to-se-reply-adap11-c7-bulk-shards | ai_infra → se | processed | ai_infra | 01f567a379d4 | ✓ | se | | +| 2026-07-22 | 2026-07-22-ai_infra-to-se-reply-session-model-dung-ban-da-duyet | ai_infra → se | processed | ai_infra | 8378a68b6f7e | ✓ | se | | + +| 2026-07-24 | 2026-07-18-Governance-spawn-label-panel-audit-khung | ai_infra → se | processed | ai_infra | 6cbded684636 | ✓ | all | bù dòng @S180 (P6) | +| 2026-07-24 | 2026-07-19-Agent-ensemble-cost-lens-khan-hiem-va-routing | ai_infra → se | processed | ai_infra | 0a03b2c83fb9 | ✓ | all | bù dòng @S180 (P6) | +| 2026-07-24 | 2026-07-19-Agent-ensemble-depth-axis-deepen-on-contested | ai_infra → se | processed | ai_infra | f05eba5b8e8c | ✓ | all | bù dòng @S180 (P6) | +| 2026-07-24 | 2026-07-19-Agent-ensemble-depth-cost-update-so-do-thuc | ai_infra → se | processed | ai_infra | 294be326cb5b | ✓ | all | bù dòng @S180 (P6) | +| 2026-07-24 | 2026-07-19-Governance-goi-chot-owner-nam-khoan | ai_infra → se | processed | ai_infra | c580c56682a5 | ✓ | all | bù dòng @S180 (P6) | +| 2026-07-24 | 2026-07-19-Governance-harness-dong-du-vong-audit-va-eval-use-side | ai_infra → se | processed | ai_infra | c034a916eb92 | ✓ | all | bù dòng @S180 (P6) | +| 2026-07-24 | 2026-07-19-Governance-hub-tu-danh-gia-3-goc-va-chuyen-pha | ai_infra → se | processed | ai_infra | cea290cead80 | ✓ | all | bù dòng @S180 (P6) | +| 2026-07-24 | 2026-07-20-Governance-3-khoan-title-tier-posture-home-distill-params | ai_infra → se | processed | ai_infra | 9353c5c8ba51 | ✓ | all | bù dòng @S180 (P6) · `to: all` (không phải `all-fit`) | +| 2026-07-24 | 2026-07-20-Governance-auto-toan-vong-distill-2-tang | ai_infra → se | processed | ai_infra | b9e84fc24475 | ✓ | all | bù dòng @S180 (P6) · 🔴 THIẾU trường `to:` — mọi phép phân loại theo `to:` sẽ bỏ rơi thư này trong im lặng | +| 2026-07-24 | 2026-07-21-Governance-eval-quality-audit-ra-thuoc-eval-cua-eval | ai_infra → se | processed | ai_infra | c04d39dbc8f5 | ✓ | all | bù dòng @S180 (P6) · 🔴 THIẾU trường `to:` — mọi phép phân loại theo `to:` sẽ bỏ rơi thư này trong im lặng | +| 2026-07-26 | 2026-07-25-Governance-model-default-opus-5-max | ai_infra → se | processed | ai_infra | 9c9090073a0f | ✓ | all | bù dòng @S180 (P6) · 🔴 THIẾU trường `to:` — mọi phép phân loại theo `to:` sẽ bỏ rơi thư này trong im lặng | +| 2026-07-26 | 2026-07-25-Governance-pause-tiep-upgrade-vong-ctx | ai_infra → se | processed | ai_infra | 0df10df4ac95 | ✓ | all | bù dòng @S180 (P6) | +| 2026-08-05 | 2026-07-28-Governance-day-wake-probe-first-resume | ai_infra → se | processed | ai_infra | ef05b7da8d5e | ✓ | all | bù dòng @S180 (P6) | +| 2026-08-05 | 2026-08-04-Governance-upgrade-pack-phased-khuon-fit-map-report-checklist | ai_infra → se | processed | ai_infra | 98e31fad1ff4 | ✓ | all | bù dòng @S180 (P6) · frontmatter `status: DRAFT` + `reviewer_gate: PENDING` — dấu trạng thái lệch nội dung, hash sạch nên KHÔNG phải tamper · GĐ-0 đang xử lý, chưa áp | +| 2026-08-05 | 2026-08-04-Governance-upgrade-pack-phased-luat-cham-diem | ai_infra → se | processed | ai_infra | c24699f0251a | ✓ | all | bù dòng @S180 (P6) · frontmatter `status: DRAFT` + `reviewer_gate: PENDING` — dấu trạng thái lệch nội dung, hash sạch nên KHÔNG phải tamper · GĐ-0 đang xử lý, chưa áp | +| 2026-08-05 | 2026-08-04-Governance-upgrade-pack-phased-phu-luc-spec-pitfall | ai_infra → se | processed | ai_infra | 49287ce7ced4 | ✓ | all | bù dòng @S180 (P6) · frontmatter `status: DRAFT` + `reviewer_gate: PENDING` — dấu trạng thái lệch nội dung, hash sạch nên KHÔNG phải tamper · GĐ-0 đang xử lý, chưa áp | +| 2026-08-05 | 2026-08-04-Governance-upgrade-pack-phased-thu-chinh | ai_infra → se | processed | ai_infra | 43db2cf09baa | ✓ | all | bù dòng @S180 (P6) · frontmatter `status: DRAFT` + `reviewer_gate: PENDING` — dấu trạng thái lệch nội dung, hash sạch nên KHÔNG phải tamper · GĐ-0 đang xử lý, chưa áp | +| 2026-07-16 | 2026-07-13-Governance-adap-update-harness-22-wal-push-guard | ai_infra → se | processed | ai_infra | dd4b0176fa3a | ✓ | all | bù @S180 — trong hộp nhưng trước mốc nước 2026-07-15; mốc nước chỉ miễn thư VẮNG (`check-email.md:39`), lead phán bù để đạt nghiệm thu "danh sách vắng = 0" | +| 2026-07-16 | 2026-07-13-Governance-adap-update-presence-not-age-reinject | ai_infra → se | processed | ai_infra | ab6c387ee5fb | ✓ | all | bù @S180 — trong hộp nhưng trước mốc nước 2026-07-15; mốc nước chỉ miễn thư VẮNG (`check-email.md:39`), lead phán bù để đạt nghiệm thu "danh sách vắng = 0" | +| 2026-07-16 | 2026-07-13-Governance-harness-22-wal-defect-fix | ai_infra → se | processed | ai_infra | 76919abc2ff9 | ✓ | all | bù @S180 — trong hộp nhưng trước mốc nước 2026-07-15; mốc nước chỉ miễn thư VẮNG (`check-email.md:39`), lead phán bù để đạt nghiệm thu "danh sách vắng = 0" | +| 2026-07-16 | 2026-07-13-Governance-harness-23-explicit-model-at-spawn | ai_infra → se | processed | ai_infra | 7c0ec06700af | ✓ | all | bù @S180 — trong hộp nhưng trước mốc nước 2026-07-15; mốc nước chỉ miễn thư VẮNG (`check-email.md:39`), lead phán bù để đạt nghiệm thu "danh sách vắng = 0" | +| 2026-07-16 | 2026-07-14-Governance-harness-24-lead-self-audit-h17-cadence | ai_infra → se | processed | ai_infra | 7400d951bebd | ✓ | all | bù @S180 — trong hộp nhưng trước mốc nước 2026-07-15; mốc nước chỉ miễn thư VẮNG (`check-email.md:39`), lead phán bù để đạt nghiệm thu "danh sách vắng = 0" | +| 2026-07-16 | 2026-07-14-Governance-owner-sign-3-marks-h21-mtv3-h22 | ai_infra → se | processed | ai_infra | ae119b953218 | ✓ | all | bù @S180 — trong hộp nhưng trước mốc nước 2026-07-15; mốc nước chỉ miễn thư VẮNG (`check-email.md:39`), lead phán bù để đạt nghiệm thu "danh sách vắng = 0" | +| 2026-07-16 | 2026-07-15-Governance-eol-crlf-agent-registry-defect-notice | ai_infra → se | processed | ai_infra | 1c039f336b28 | ✓ | all | bù @S180 — trong hộp nhưng trước mốc nước 2026-07-15; mốc nước chỉ miễn thư VẮNG (`check-email.md:39`), lead phán bù để đạt nghiệm thu "danh sách vắng = 0" | ## 📤 OUTBOUND (gửi — qua `/send-email `) | sent (ISO) | id | from → to | folder | sha256(12) | diff --git a/docs/governance/adap-upgrade-pack-fitmap.md b/docs/governance/adap-upgrade-pack-fitmap.md new file mode 100644 index 0000000..22fc4f8 --- /dev/null +++ b/docs/governance/adap-upgrade-pack-fitmap.md @@ -0,0 +1,47 @@ +# Bản đồ áp dụng — gói nâng cấp quy trình (bảy giai đoạn) + +> Khuôn gốc: `broadcasts/inbox/ai_infra/2026-08-04-Governance-upgrade-pack-phased-khuon-fit-map-report-checklist.md` **Phần A** (`:29-59`). +> Tệp đi kèm: [`adap-upgrade-pack-tracking.md`](adap-upgrade-pack-tracking.md) — theo dõi 20 khoản của danh mục kiểm Phần C và nấc của từng giai đoạn. +> Tệp này cố ý **tách riêng** khỏi mọi tệp điều tra, để lệnh tự kiểm `grep -c '^| GĐ-[0-6]'` chạy trên đúng tệp bản đồ và ra đúng mẫu số của nó. + +kho: SOLUTION_ERP +ngày lập: 2026-08-07 (phiên S180) +người chịu trách nhiệm chung: pqhuy1987 — chủ dự án; điều phối thi công: em-main + +| Giai đoạn | Tên | Quyết định | Lý do nếu không áp dụng · điều kiện gỡ nếu hoãn | Người làm | Mốc dự kiến | +|---|---|---|---|---|---| +| GĐ-0 | Tiếp nhận và bản đồ áp dụng | áp dụng | Đây là giá trị duy nhất khả dĩ. Khai `không áp dụng` thì phải nêu một cơ chế tương đương kiểm được, mà giai đoạn này đang thiếu chín khoản; khai `hoãn` thì vô nghĩa, vì GĐ-0 là điều kiện tồn tại của mọi phép kiểm về sau. Hiện trạng đo trên mẫu số **18 khoản GĐ-0** (7 bước thư chính + 3 lệnh kiểm + 4 khoản Phần C + 4 ô nghiệm thu phụ lục; nguồn `sub-n3-lane-a-gd01.md:20-69`): **đã có 6**; **thiếu 9** — `G0-B4` tệp theo dõi, `G0-B5` dòng đã-nhận trong sổ liên lạc, `G0-B7` báo cáo tiếp nhận, `G0-K1` lệnh đếm bảy dòng chạy trên đúng tệp bản đồ, `A0-2` tệp theo dõi khớp số khoản, `A0-3` dòng đã-nhận tìm được bằng một lệnh, `G0-N2` ô nghiệm thu tệp theo dõi, `G0-N3` ô nghiệm thu sổ liên lạc, và vế ghi-lại-mã-băm của `G0-B2`; **có nhưng sai khuôn 3** — `G0-B6` bảng bảy dòng nằm lẫn trong tệp điều tra, `A0-4` ô quyết định trộn giá trị, `G0-N4` ô nghiệm thu hình thức. Không khoản nào NGƯỢC: SE chưa làm điều gì trái GĐ-0, chỉ là chưa làm. | em-main | W0 — phiên S180 tới S181 | +| GĐ-1 | Nền chuẩn đặt tên | áp dụng | Không khai `không áp dụng` được: `docs/governance/vocab-alias-map.md` là **bảng dịch**, trượt cả ba phép thử tiên đoán, phủ sóng và hướng (`sub-n3-lane-a-gd01.md:181-197`); `docs/rules.md` chỉ phủ tầng mã nguồn, bốn trên bốn lần khớp đều là quy ước đặt tên trong code (`:335-349`). Không khai `hoãn` được: việc dựng chuẩn không chờ ai ngoài chính SE, nên không tồn tại điều kiện gỡ nào thật. Việc may đo theo nhà mình là **mặc định của cả gói** (`phu-luc:26`) nên không nhắc lại trong ô quyết định. Scope đã đồng ý = **22/24 khoản GĐ-1** (mẫu số: 24 khoản, `sub-n3-lane-a-gd01.md` §3). Hai khoản NGOÀI scope, tách rời vì cần hai quyết định khác nhau của chủ dự án: khoản thứ nhất là `G1-B2` lập **vai giữ chuẩn**, tức thêm vai thứ 27 vào bộ máy, chờ câu **P4**; khoản thứ hai là `G1-B7` siết máy soi tên sang **lái mã thoát**, đụng doctrine exit-0 đang sống nên chờ câu **P1** và đi cùng wave W3b. | em-main + investigator | W1 | +| GĐ-2 | Lưới ghi đĩa và mục lục vật chứng | áp dụng | Hiện trạng per-khoản là **chưa làm**; không ô nào được ghi `đã áp`. Trên **mẫu số 6 ô nghiệm thu GĐ-2** của phụ lục (`:172-177`) — mẫu số mà hub dùng để cấp nấc — kết quả từng ô là: ô-1 nửa, ô-2 đạt, ô-3 trượt, ô-4 trượt (đã chạy phép thử thật và máy trượt thật), ô-5 nửa, ô-6 trượt; cộng lại **2,0/6 đạt, tức 4/6 chưa đạt**. Cùng một sự thật, hai mẫu số khác cho hai con số khác: theo **13 khoản** của lane B thì ra 6/13; theo **8 bước** thư chính thì ra 5,5-6/8. Ai trích con số phải trích kèm mẫu số. Phần đã có sẵn và sẽ tái dùng chứ không dựng lại: tầng-A, vai cấm-sửa, và kỷ luật ghi-trước-khi-bắn. | em-main | W2 | +| GĐ-3 | Nghi thức hai đầu phiên và cổng chặn | áp dụng | Scope đã đồng ý = **8/10 khoản GĐ-3** (mẫu số: 10 khoản, `sub-n3-lane-c-gd34.md` §F — 3 có, 3 nửa, 3 thiếu, 1 ngược). Hai khoản NGOÀI scope, liệt riêng từng khoản: khoản thứ nhất là `C3-04` cổng chặn bằng mã lỗi, hiện **NGƯỢC** với doctrine exit-0-advisory đang sống ở SE, nên đi wave W3b sau khi chủ dự án chọn một trong bốn phương án ở câu **P1**; khoản thứ hai là `C3-08` trần chi phí, mà chính hub tự khai `KHÔNG ĐO ĐƯỢC`, nên SE chỉ adopt dạng hướng dẫn kèm nghĩa vụ khai khi vượt. Cảnh báo gắn liền ô này: wave W3 **không chữa** TC-10, nó chỉ khai báo trần; TC-10 vẫn là triệu chứng duy nhất không có giai đoạn nào thực sự chữa. | em-main | W3, phần cổng chặn ở W3b sau câu P1 | +| GĐ-4 | Sổ yêu cầu chủ dự án và chấm điểm | áp dụng | Scope đã đồng ý = **9/12 khoản GĐ-4** (mẫu số: 12 khoản, `sub-n3-lane-c-gd34.md` §G — 2 có, 3 nửa, 5 thiếu, 1 ngược, 1 chưa đo). Ba khoản NGOÀI scope, liệt riêng từng khoản, tất cả đi wave W4b: `C4-10` áp luật chấm điểm và in khối chấm ở hai cửa phiên, chờ câu **P8**; `C4-08` vai đọc sổ ở tầng hai và vai kiểm phép đếm ở tầng ba; `C4-09` thu hẹp vai cũ trong cùng lượt — hai khoản sau chờ câu **P4**. Ngay cả phần trong scope cũng chưa vào được: điều kiện vào của wave W4 đòi chủ dự án chọn phương án ở câu **P2**, vì ba phương án cho ra ba cấu trúc tệp khác nhau và thi công trước là làm lại từ đầu. Rủi ro cao nhất của cả gói nằm ở đây: nguồn đôi giữa sổ mới và WAL. | em-main + chủ dự án (P2, P4, P8) | W4 sau câu P2; W4b sau câu P4 và P8 | +| GĐ-5 | Cửa gọi mô hình đắt tiền | áp dụng | Bỏ hẳn nhãn *"gần xong nhất"* mà bản điều tra đầu tiên gán cho giai đoạn này: trên **cùng một thước 8 bước** của thư chính, GĐ-5 đạt 5,33/8 còn GĐ-2 đạt 5,5-6/8, tức GĐ-2 lớn hơn hoặc bằng GĐ-5 (`sub-n3-lane-d-gd56.md:267-302`). Hiện trạng trên **mẫu số 20 khoản GĐ-5** (lane D §2): 13,0/20 nếu tính nửa khoản, 9/20 nếu chấm nghiêm. Scope đã đồng ý = phần còn thiếu, thi công ở wave W5. Hai khoản đi W5b và chờ câu **P7**: sổ khung nhìn lượt chạy đắt, và luật truyền nguyên văn khi phát lệnh cho lane. Khai per-khoản: **TC-03 = `không áp dụng` CÓ KHAI**, vì SE không dùng mô hình thường ở bất kỳ chỗ ngồi nào — đo lại ngày 2026-08-07 được **26/26 persona** pin `model: opus` và **26/26** pin `effort: max`, mẫu số là 27 tệp trong `.claude/agents/` trừ `README.md`, control âm là phép liệt kê mọi giá trị của trường `model:` chỉ trả về đúng một dòng. Ô nghiệm thu của hub cho TC-03 vẫn **GIỮ NGUYÊN CHỮ** *chưa đủ mẫu*; SE không điền số thay hub. | em-main | W5, phần chờ câu P7 ở W5b | +| GĐ-6 | Niêm phong đồng bộ và bảng gốc | hoãn | **Điều kiện gỡ hoãn:** mọi giai đoạn mang quyết định `áp dụng` trong bảng này đạt nấc *đã thi công*. Ghi thêm cho đúng sự thật, vì chỗ này hay bị kể nhẹ đi: trạng thái của **điều kiện vào** GĐ-6 hôm nay không phải *chưa thoả* mà là **chưa ĐÁNH GIÁ ĐƯỢC — thiếu vật tham chiếu** (`sub-n3-lane-d-gd56.md:427-430`). Lý do là điều kiện đó tham chiếu tới chính bản đồ áp dụng bảy dòng, mà vật đó không tồn tại trên đĩa SE cho tới lúc tệp này được ghi. Khác biệt có hậu quả thật: *chưa thoả* gợi ý cứ làm các giai đoạn khác rồi tự khắc thoả, còn *chưa đánh giá được* nói rõ phải đẻ bản đồ trước, nếu không thì tới lúc mở GĐ-6 vẫn không ai biết "mọi giai đoạn trong phạm vi áp dụng" là những giai đoạn nào. Hiện trạng: **3,0/17 khoản** nếu tính nửa khoản và **1/17** nếu chấm nghiêm (mẫu số: 17 khoản, lane D §6.2). Con số thấp ở đây là bằng chứng SE đang tuân thứ tự GĐ-0 tới GĐ-6, không phải bằng chứng SE chậm. | em-main + chủ dự án ký mốc | Sau khi W5 đóng | + +## Đối chiếu ba luật khi điền của Phần A + +1. **Luật `không áp dụng` phải có lý do kiểm được.** Bảng này không có dòng nào mang giá trị `không áp dụng`, nên luật một không áp vào dòng nào. Ở tầng khoản thì có: `TC-03` trong GĐ-5 được khai `không áp dụng`, và lý do của nó là một phép đo chạy lại được, kèm control âm. +2. **Luật `hoãn` phải có điều kiện gỡ.** Dòng duy nhất mang `hoãn` là GĐ-6, và điều kiện gỡ của nó viết ở dạng nhận biết được: mọi giai đoạn `áp dụng` đạt nấc *đã thi công*. +3. **Luật điều kiện vào đọc `không áp dụng` như đã thoả.** Không dòng nào dùng đường này, nên không giai đoạn nào của SE được mở khoá bằng cách khai miễn. + +## Chỗ tôi làm KHÁC, và vì sao + +Hai ô suýt bị điền bằng từ vựng của phần khác trong cùng bộ tài liệu. Ghi lại để người đọc sau không tưởng là quên. + +- **Ô GĐ-2** từng được đề xuất điền `chưa làm`. Nhưng `chưa làm` và `đã áp` là từ vựng của **Phần C** — cách chấm từng khoản trong danh mục kiểm (`khuon:232`) — còn ô Quyết định của **Phần A** chỉ nhận `áp dụng`, `không áp dụng` hoặc `hoãn` (`khuon:31`). Điền `chưa làm` vào đây là đẻ ra một giá trị thứ tư, tức tái phạm đúng khiếm khuyết mà bảng này sinh ra để đóng. Cách giữ trọn ý mà không phạm luật: ô Quyết định ghi `áp dụng`, còn hiện trạng *chưa làm* nằm nguyên trong ô lý do, kèm liệt kê từng ô nghiệm thu. +- **Ô GĐ-6** từng được đề xuất điền *"chưa đánh giá được — thiếu vật tham chiếu"*. Câu đó là kết luận về **điều kiện vào** của GĐ-6, không phải một giá trị quyết định. Nó được giữ nguyên văn trong ô lý do, còn ô Quyết định ghi `hoãn`. + +## Lệnh tự kiểm + +```bash +# Phải ra đúng 7. Chạy trên tệp này, không chạy trên tệp khuôn của hub +# (tệp khuôn còn chứa một bảng bảy dòng nữa ở phần báo cáo, chạy nhầm sẽ ra 14). +grep -c '^| GĐ-[0-6]' docs/governance/adap-upgrade-pack-fitmap.md + +# Không ô quyết định nào trống, và mỗi ô đúng một trong ba giá trị: +grep -oP '^\| GĐ-[0-6] \| [^|]+ \| \K[^|]+' docs/governance/adap-upgrade-pack-fitmap.md +``` + +## Nấc hiện tại + +Bản đồ này **không** khai nấc, để tránh hai chỗ ghi. Nấc của từng giai đoạn khai ở một chỗ duy nhất là [`adap-upgrade-pack-tracking.md`](adap-upgrade-pack-tracking.md), theo đúng khuyến nghị của khoản A15: khai nấc theo **từng giai đoạn**, không khai một nấc chung cho cả gói. diff --git a/docs/governance/adap-upgrade-pack-tracking.md b/docs/governance/adap-upgrade-pack-tracking.md new file mode 100644 index 0000000..3f051b0 --- /dev/null +++ b/docs/governance/adap-upgrade-pack-tracking.md @@ -0,0 +1,92 @@ +# Tệp theo dõi — gói nâng cấp quy trình bảy giai đoạn (danh mục kiểm 20 khoản) + +> Khoản **A0-2** của danh mục kiểm đòi *"một tệp trong kho bạn, liệt kê từng khoản của danh mục này, và bạn tick dần"*, với dấu hiệu adapt thiếu là *"theo dõi trong đầu, hoặc theo dõi trong một tin nhắn — cả hai đều bốc hơi"*. +> Nguồn khoản: `broadcasts/inbox/ai_infra/2026-08-04-Governance-upgrade-pack-phased-khuon-fit-map-report-checklist.md` **Phần C** (`:247-370`). +> Tệp anh em: [`adap-upgrade-pack-fitmap.md`](adap-upgrade-pack-fitmap.md) — bản đồ áp dụng bảy dòng. + +**Vì sao tệp này nằm ở `docs/governance/` chứ không nằm trong thư mục lượt chạy.** Trước khi có tệp này, tiến độ của cả gói nằm trong `run.md` của một lượt chạy, mà một lượt chạy chỉ sống trong phạm vi một phiên. Đó đúng là dạng "theo dõi trong một tin nhắn" mà khoản A0-2 gọi tên: phiên sau mở ra sẽ không biết gói đang ở đâu. Tệp này sống lâu hơn phiên, nên mọi cập nhật tiến độ phải ghi vào đây chứ không ghi vào thư mục lượt chạy. + +--- + +## §1 — Nấc theo TỪNG GIAI ĐOẠN (khoản A15) + +Khoản A15 khuyến nghị **khai nấc theo từng giai đoạn**, không khai một nấc chung cho cả gói. Trước bảng này chưa ai làm việc đó cho gói. + +Chuỗi nấc, theo đúng thứ tự của hub: **đã gửi → đã nhận → đã đồng ý → đã thi công → đã được kiểm chứng**. + +| # | Giai đoạn | Nấc hiện tại | Vì sao đứng ở nấc này, và cái gì mở khoá nấc kế | +|---|---|---|---| +| 0 | Tiếp nhận và bản đồ áp dụng | đã đồng ý | Quyết định `áp dụng` đã ghi ở bản đồ, và scope đã liệt từng khoản. Chưa lên *đã thi công* vì hai vật còn nợ: dòng "đã nhận" trong sổ liên lạc (lane b đang làm) và báo cáo tiếp nhận gửi hub. | +| 1 | Nền chuẩn đặt tên | đã đồng ý | Đường `không áp dụng` đã bị đóng bằng đo đạc, nên SE buộc phải thi công. Scope 22 trên 24 khoản đã khai. Mở khoá nấc kế: wave W1 chạy xong văn bản chuẩn, sổ đổi tên và máy soi tên. | +| 2 | Lưới ghi đĩa và mục lục vật chứng | đã đồng ý | Quyết định `áp dụng`, nhưng hiện trạng per-khoản là **chưa làm**: hai trên sáu ô nghiệm thu đạt, tức bốn trên sáu chưa đạt. Mở khoá nấc kế: wave W2. | +| 3 | Nghi thức hai đầu phiên và cổng chặn | đã đồng ý | Scope 8 trên 10 khoản đã khai cho wave W3. Chủ dự án đã chốt câu P1 theo phương án PA-2, nên khoản cổng chặn bằng mã lỗi cũng lên *đã đồng ý* và đi wave W3b. Riêng luật tự trị ba bậc vẫn chờ câu P5. | +| 4 | Sổ yêu cầu chủ dự án và chấm điểm | đã đồng ý | Chủ dự án đã chốt câu P2 theo phương án PB-2 và câu P4 cho phép đẻ vai mới, nên phần sổ ba khối và phần vai đều lên *đã đồng ý*. Phần chấm điểm vẫn chờ câu P8, phần đường ghi lại khi chấm sai vẫn chờ câu P3. | +| 5 | Cửa gọi mô hình đắt tiền | đã đồng ý | Scope phần còn thiếu đã khai cho wave W5. Hai khoản đi wave W5b vẫn chờ câu P7. | +| 6 | Niêm phong đồng bộ và bảng gốc | đã nhận | Quyết định ở bản đồ là `hoãn`. Hoãn là quyết định **chưa adopt**, nên nấc không được lên *đã đồng ý*. Mở khoá nấc kế: mọi giai đoạn mang quyết định `áp dụng` đạt *đã thi công*. | + +**Luật giữ bảng này thật.** Nấc tự khai tối đa là *đã thi công*. Nấc *đã được kiểm chứng* **chỉ hub cấp**, sau khi hub soi bằng chứng thật ở kho SE — không ai trong kho SE được tự viết nấc đó. Cấm nhảy cóc: khoản nào chưa có bằng chứng chạy được thì không được ghi cao hơn *đã đồng ý*. + +--- + +## §2 — Hai mươi khoản của danh mục kiểm + +Mẫu số **20 khoản** = 4 khoản Phần 0 (`A0-1` `A0-2` `A0-3` `A0-4`) + 10 khoản Phần 1 (`A1` tới `A10`, liệt từng mã ở bảng dưới) + 6 khoản Phần 2 (`A11` tới `A16`, liệt từng mã ở bảng dưới). Khoản A12 cấm nén danh sách thành khoảng, nên bảng dưới liệt đủ hai mươi dòng, không dòng nào gộp. + +Cột "Thuộc GĐ" lấy đúng nhãn giai đoạn mà hub gắn trong Phần C. Mười khoản `A1` tới `A10` đều mang nhãn *(GĐ-4)*; sáu khoản `A11` tới `A16` **không** mang nhãn giai đoạn nào vì chúng là kỷ luật báo cáo, áp cho mọi giai đoạn. + +| Mã | Thuộc GĐ | Nấc hiện tại | Wave | Bằng chứng, lệnh, và phần còn nợ | +|---|---|---|---|---| +| A0-1 | GĐ-0 | đã đồng ý | W0 | Bốn món có mặt trên đĩa tại `broadcasts/inbox/ai_infra/`. Mã băm khớp bốn trên bốn, lệnh tái lập là `python scripts/stamp_verify.py broadcasts/inbox/ai_infra/2026-08-04-Governance-upgrade-pack-phased-*.md` với mã thoát 0. Chưa lên *đã thi công* vì vế thứ hai của khoản, tức ghi lại mã băm vào một sổ sống lâu hơn phiên, còn nợ. Cảnh báo bắt buộc dán kèm: phép băm tự chế cho kết quả LỆCH ở cả bốn món, nên ai kiểm lại mà không dùng đúng lệnh trên sẽ kết luận nhầm là nội dung bị sửa. | +| A0-2 | GĐ-0 | đã thi công | W0 | Chính là tệp này. Bằng chứng chạy được: `grep -c '^| A' docs/governance/adap-upgrade-pack-tracking.md` phải ra **20**, khớp số khoản của danh mục kiểm. | +| A0-3 | GĐ-0 | đã đồng ý | W0 | Chủ dự án đã chốt câu P6 theo đường mở phạm vi INBOUND cho cả thư phát đại trà, cộng thêm chứ không gỡ 22 dòng đang sống. Đo đĩa đúng lúc viết dòng này, ngày 2026-08-07: `grep -c "upgrade-pack-phased" broadcasts/_index.md` ra **0**; control dương `grep -c "harness-22"` ra **3** và `grep -cE "^\| "` ra **94**, nên im lặng là im lặng thật chứ không phải thước hỏng. Lane b đang thi công phần bù dòng; người đọc sau phải **đo lại**, đừng tin con số trong dòng này. Lỗ thật rộng hơn gói này: 24 lá thư trong hộp thư chưa có dòng trong sổ, trên mẫu số 69 lá trên đĩa. | +| A0-4 | GĐ-0 | đã thi công | W0 | `docs/governance/adap-upgrade-pack-fitmap.md`. Bằng chứng chạy được: `grep -c '^| GĐ-[0-6]' docs/governance/adap-upgrade-pack-fitmap.md` ra **7**; chạy đúng lệnh đó trên tệp khuôn của hub ra **14**, đây là control dương cho chính cái bẫy mẫu số mà hub cảnh báo. Bảy ô quyết định đều mang đúng một trong ba giá trị, đếm lại bằng awk ra 7 trên 7, không ô nào trống. | +| A1 | GĐ-4 | đã đồng ý | W4 | Sổ ba khối chưa tồn tại: khối lời-phàn-nàn trống tuyệt đối, đo bằng phép tìm `sở-thích` và `phàn nàn` ra 0 hit với control dương là cụm "điểm dừng" ra 5 tệp. Câu P2 đã chốt phương án PB-2, tức tách sổ yêu cầu khỏi WAL, nên khoản lên *đã đồng ý*. Nợ kèm theo P2: phải sửa luật đã ratify ở `tiep.md:181`. Ràng buộc chống bẫy: cột lời nguyên văn chỉ nhận chữ chủ dự án gõ từ thời điểm dựng sổ; dữ liệu cũ đi phụ lục riêng. | +| A2 | GĐ-4 | đã đồng ý | W4 | Kỷ luật ghi ngay, cắm vào tệp luôn được nạp mỗi lượt, và cấm cắm vào tệp lệnh của một cửa. Chỗ cắm hợp lệ đã tồn tại ở SE là `CLAUDE.md`; luật thì chưa có. CHƯA ĐO — cần đo SE có cắm luật ghi-ngay vào bề mặt tự động nạp hay không, lệnh: `grep -n "ghi ngay\|ghi NGAY" CLAUDE.md .claude/auto-memory/MEMORY.md` kèm control dương là một cụm chắc chắn có trong hai tệp đó. | +| A3 | GĐ-4 | đã đồng ý | W4 | Tra sổ trước khi hỏi, phải tìm được ở tối thiểu hai chỗ. Hiện chưa có: phép tìm cụm "viện dẫn" trong kho auto-memory ra 0 hit, control dương là cụm "How to apply" ra 48 trên 61 tệp. Wave W4 cắm vào `CLAUDE.md` và `docs/rules.md` cho đủ hai chỗ. | +| A4 | GĐ-4 | đã đồng ý | W3 và W4 | Đèn nợ ở **mọi** điểm dừng, liệt từng cửa chứ không ghi gộp. Đo được: máy dò nhịp được gọi từ 6 cửa, còn tiền kiểm chi phí 0 mới phủ 4 trên 19 cửa. Wave W3 dựng bảng 19 cửa liệt từng dòng; wave W4 nối hai số liệu vào máy dò. Nợ nặng nhất của khoản này: máy hiện **chưa phân biệt** "chưa có dữ liệu" với "đã đo và bằng không" — hub gọi đó là đèn xanh giả. | +| A5 | GĐ-4 | đã đồng ý | W4 | Định nghĩa thành văn cho "hỏi lại không kèm thông tin mới". Nội dung sàn đã rõ: hỏi lại mà không viện dẫn được thông tin mới là vi phạm; hỏi lại kèm nguồn trích được là kỷ luật đúng. SE chưa có văn bản nào chứa định nghĩa này. | +| A6 | GĐ-4 | đã đồng ý | W4 | Lằn ranh đỏ phải **liệt kê từng loại**, cấm mô tả bằng tính từ. Nguyên liệu ở SE có nhưng nằm rải trong 61 tệp auto-memory, chưa gom về một chỗ. Wave W4 dựng mục mồi ST-001 liệt bảy loại: đổi lược đồ dữ liệu, xoá dữ liệu, việc hướng ra ngoài, việc không lùi được, việc dính tiền, đổi cơ chế quản trị, đổi số nhịp hoặc ngân sách. | +| A7 | GĐ-4 | đã nhận | W4b | Chấm điểm trải nghiệm phải tách hẳn khỏi phép đo kỹ thuật, và công thức trừ theo MỤC chứ không theo lần. SE hiện **vắng hoàn toàn**: phép tìm cụm "chấm điểm" ra 0 hit với control dương 3 tệp. Giữ ở nấc *đã nhận* vì việc in khối chấm ở hai cửa phiên còn **chờ câu P8** — nghi thức hai đầu phiên là vật chủ dự án đã chốt. | +| A8 | GĐ-4 | đã đồng ý | W4b | Ba tầng đếm: người điều phối tự chấm, một vai khác đếm lại độc lập, một vai thứ ba kiểm phép đếm mà cấm chấm lại. Câu P4 đã cho phép đẻ vai mới và nâng trần bề rộng từ 20 lên 30, nên khoản lên *đã đồng ý*. Hai món nợ đi kèm, không được quên: vai mới phải được seed đường cơ sở `measured{}` kẻo thành vai mù; và **tỉ lệ phủ sóng CHƯA ĐO** — chưa có tỉ lệ đó thì luật của hub bắt in "KHÔNG ĐO ĐƯỢC" và **cấm in điểm**. | +| A9 | GĐ-4 | đã nhận | W4b | Niêm phong bằng im lặng chỉ hợp lệ khi đủ ba mốc thời gian: lúc phát điểm, lúc hiển thị lại ở cửa chủ dự án chắc chắn đọc, và tin đầu tiên của chủ dự án sau lần hiển thị lại. Thiếu mốc ba thì trạng thái là *chờ niêm phong*, không phải *đã niêm phong*. Chưa ai chạm khoản này. Giữ nấc *đã nhận* vì nó nằm trong khối chấm điểm đang chờ câu P8. | +| A10 | GĐ-4 | đã nhận | W4b | Khoản này có hai vế. Vế phép thử SE đã có máy thật: đẩy một nhãn lớp lỗi lạ vào máy cảnh báo thì `h24-signal-write.ps1` từ chối với mã thoát 2 và thông điệp rằng một vai giám sát không được tự chế lớp. Vế quy trình, tức khi chủ dự án điều chỉnh điểm thì xác định tầng nào sai rồi ghi vào nhật ký của vai đã sai, thì chưa thành văn. Giữ nấc *đã nhận* vì **chờ câu P3**: hub đòi tập tín hiệu phải từ chối lớp mới, còn SE đang cố ý mở tập đó theo tiền lệ chủ dự án ở phiên S143. Đây là xung đột triết lý thứ hai của cả gói. | +| A11 | xuyên GĐ | đã đồng ý | mọi wave | Mọi con số trong văn xuôi phải neo nguồn, không neo được thì bỏ số và viết định tính. Bằng chứng áp trong wave W0: mọi tỉ lệ trong bản đồ áp dụng đều kèm mẫu số và kèm con trỏ nguồn. Chưa lên *đã thi công* vì nghiệm thu của khoản này gắn với bản báo cáo gửi hub, mà báo cáo chưa tồn tại. | +| A12 | xuyên GĐ | đã đồng ý | mọi wave | Liệt kê từng mục, cấm nén thành khoảng. Bằng chứng áp trong wave W0: ô lý do của dòng GĐ-0 liệt đủ chín mã khoản thiếu và ba mã khoản sai khuôn thay vì viết một khoảng; bảng ở mục 2 của tệp này liệt đủ hai mươi dòng. Danh sách rỗng thì phải ghi thẳng là danh sách rỗng, không bỏ trống. | +| A13 | xuyên GĐ | đã đồng ý | mọi wave | Mỗi khoản đánh dấu không-áp-dụng phải kèm lý do cụ thể. Ca duy nhất hiện có là TC-03 trong giai đoạn 5, và lý do của nó là một phép đo chạy lại được: 26 trên 26 persona pin `model: opus`, mẫu số là 27 tệp trong `.claude/agents/` trừ `README.md`, control âm là phép liệt kê mọi giá trị của trường `model:` chỉ trả về đúng một dòng. | +| A14 | xuyên GĐ | đã đồng ý | mọi wave | Chỗ chưa biết thì ghi "chưa đo được", không ghi "xong". Hub tự nhận đây là lớp lỗi đắt nhất của cả năm. Bằng chứng áp trong wave W0: mọi ô chưa đo trong tệp này đều mang chữ CHƯA ĐO kèm lệnh cần chạy, và mục 3 dưới đây gom lại thành danh sách. | +| A15 | xuyên GĐ | đã thi công | W0 | Ba nấc *đã đồng ý*, *đã thi công*, *đã được kiểm chứng* là ba thứ khác nhau; nấc phải khai theo từng giai đoạn. Trước wave này chưa ai khai nấc theo từng giai đoạn cho gói. Bằng chứng chạy được: bảng bảy dòng ở mục 1 của tệp này, mỗi giai đoạn một nấc riêng, kèm luật cấm tự khai nấc cuối. | +| A16 | xuyên GĐ | đã đồng ý | W6 | Với mỗi cưỡng chế tuyên là đã có, phải ghi rõ nó chạy bằng máy hay bằng tay. Phát hiện của SE làm khoản này chặt hơn chữ hub: thang hai nấc máy-hoặc-tay là thang hỏng, phải tách ba nấc, vì SE có đúng **1** máy tự bắn thật, 17 máy chỉ chạy khi một nghi thức gọi tới, và 3 script mồ côi. Phép kiểm kê máy của chính SE cũng đang chạy bằng trí nhớ: danh sách "máy đã biết" liệt 14 trong khi đĩa có 21, thiếu 7. Bảng A16 hợp nhất chưa có, dựng ở wave W6. | + +--- + +## §3 — Khoản CHƯA ĐO, kèm lệnh cần chạy + +Ghi ra thành danh sách có tên thay vì im lặng, theo đúng khoản A14. Danh sách này không rỗng. + +- **A2 — chỗ cắm kỷ luật ghi ngay.** Chưa ai đo SE có cắm luật ghi-ngay vào bề mặt tự động nạp mỗi lượt hay không. Lệnh: `grep -n "ghi ngay\|ghi NGAY" CLAUDE.md .claude/auto-memory/MEMORY.md`, kèm control dương bằng một cụm chắc chắn có trong hai tệp đó. +- **A4 — tập cửa dừng thật.** Đã đo được 6 cửa gọi máy dò nhịp và 4 trên 19 cửa có tiền kiểm, nhưng chưa ai liệt đủ tập cửa dừng thật rồi đối chiếu từng cửa. Lệnh: dựng bảng 19 cửa ở wave W3 rồi soi từng dòng. +- **A8 — tỉ lệ phủ sóng.** Bao nhiêu tin của chủ dự án đã được bắt vào nguồn đếm, trên tổng số tin thật. Chưa có vật tương đương ở SE nên chưa xác định được mẫu số. Chừng nào chưa có tỉ lệ này thì khối chấm điểm **phải in "KHÔNG ĐO ĐƯỢC"** và cấm in điểm. +- **A16 — ba script mồ côi và bảng hợp nhất.** Đã có kết luận từng script, nhưng bảng bốn ô cho từng cưỡng chế thì chưa dựng. +- **Điều kiện vào giai đoạn 6, vế đếm.** Bốn khoản của giai đoạn 6 còn ở trạng thái chưa đo: bài kiểm ghim tên hay ghim số; tỉ lệ phiên đi đường Workflow so với đường Agent; hai vế còn lại của điều kiện vào danh sách; và tần suất của triệu chứng TC-07, mà SE **không tồn tại dụng cụ** để đếm. + +--- + +## §4 — Lệnh tự kiểm của tệp này + +```bash +# Số khoản phải khớp số khoản của danh mục kiểm Phần C. Phải ra 20. +grep -c '^| A' docs/governance/adap-upgrade-pack-tracking.md + +# Nấc khai theo từng giai đoạn — phải ra 7 dòng, mỗi giai đoạn một nấc. +awk -F'|' '/^\| [0-6] \|/{print $2" -> "$4}' docs/governance/adap-upgrade-pack-tracking.md + +# Không dòng nào được tự khai nấc cuối. Phải ra 0. +grep -c 'đã được kiểm chứng *|' docs/governance/adap-upgrade-pack-tracking.md +``` + +## §5 — Luật cập nhật tệp này + +1. **Cập nhật tiến độ ghi vào đây, không ghi vào thư mục lượt chạy.** Thư mục lượt chạy chết theo phiên; đó là lý do tệp này tồn tại. +2. **Cấm nhảy cóc nấc.** Muốn ghi *đã thi công* thì phải dán được một lệnh mà người khác chạy lại ra cùng kết quả. Không dán được thì nấc dừng ở *đã đồng ý*. +3. **Nấc *đã được kiểm chứng* chỉ hub cấp.** Trong kho SE, ô đó luôn để trống cho tới khi hub soi bằng chứng thật và trả lời. +4. **Mỗi lần một câu chờ chủ dự án được trả lời, sửa đúng dòng khoản liên quan** và ghi ngày. Bốn câu còn treo tính tới ngày 2026-08-07 là P3, P5, P7 và P8. diff --git a/docs/governance/naming-standard.md b/docs/governance/naming-standard.md new file mode 100644 index 0000000..cc95764 --- /dev/null +++ b/docs/governance/naming-standard.md @@ -0,0 +1,278 @@ +# Chuẩn đặt tên — tầng BỘ MÁY (SOLUTION_ERP) + +> **Văn bản này BỔ SUNG tầng bộ-máy. Nó KHÔNG thay `docs/rules.md`.** +> `docs/rules.md` phủ tầng **mã nguồn** (PascalCase `.cs`, kebab TS/TSX, bảng DB…). Văn bản này phủ tầng **vật quản trị**: tên vai, thư mục lượt chạy, tệp mốc phiên, nhật ký phiên, kịch bản, sổ, nhãn lớp kiểm, nhãn tác vụ, tên lệnh. +> Một khái niệm — một chỗ tra. Tên chạm **mã sản phẩm** → `docs/rules.md`. Tên chạm **bộ máy quản trị** → tệp này. Không có vùng chồng lấn. + +- **Ngày ký:** 2026-08-07 (phiên S180, wave W1) · **Nguồn sàn:** `broadcasts/inbox/ai_infra/2026-08-04-Governance-upgrade-pack-phased-phu-luc-spec-pitfall.md` **§GĐ-1** (`:93-137`) +- **Kiểm kê máy nền:** `.claude/workflows/runs/2026-08-07-S180-adap-upgrade-pack-phased/sub-w1a-mayd-octen.md` — **14 đoạn máy đọc tên, 11 vỡ-câm**. Phụ lục A dưới đây là bản rút gọn BẮT BUỘC tra trước mọi lần đổi tên. +- **Máy soi:** `scripts/naming-scan.ps1` — INFORM-only, mã thoát 0, quét **231 tên vật-bộ-máy**. +- **Sổ đổi tên:** `docs/governance/rename-ledger.md` — chỉ-thêm-không-xoá. + +--- + +## §0 — Năm luật nền (áp cho MỌI nhóm bên dưới) + +### L0 — Luật NẤC: viết tới đâu thì phải ép máy tới đó, không sâu hơn MỘT nấc + +> **Một nhóm tên sạch CHÍNH XÁC tới độ sâu mà máy của nó KIỂM — không sâu hơn một nấc.** + +Đây là luật gốc, đo được, không phải khẩu hiệu. Bốn ca nền (đo 2026-08-07): + +| Nhóm | Máy ép tới nấc | Kết quả ở nấc đó | Nấc SÂU HƠN | +|---|---|---|---| +| Tên vai | **thành viên** (danh sách 26, `throw`) | sạch 26/26/26 | — | +| Thư mục phiên | **hình dạng** `^session-\d+$` (chỉ INFORM) | sạch 12/12 | tệp BÊN TRONG: **7 họ** | +| Nhãn lớp kiểm | **tiền tố** `view-`/`gap-` | sạch 12/12 | nấc-2: **8 họ** | +| Nhật ký phiên | **KHÔNG CÓ MÁY** | **40,3%** (64/159) | — | + +⇒ **Hệ quả bắt buộc:** mỗi mục dưới đây khai **NẤC muốn sạch** và **MÁY ép đúng nấc đó**. Nhóm nào không có máy thì ghi thẳng `CHƯA CÓ MÁY — mô tả, không cưỡng chế`, và **cấm ký luật hình dạng cho nó**. Ký sâu hơn máy = ký ra thứ tự nó sẽ trôi, rồi không ai biết. + +⇒ **Hệ quả thứ hai:** máy **chỉ ĐỌC** hoặc máy **THA THỨ** thì tên vẫn trôi. Bằng chứng: `detectors:1109` đọc tên lạ rồi chỉ *liệt* (112/719 tệp ngoài mọi họ); `detectors:1660` chấp cả `_end` lẫn `closed.md` bằng `-or` (fork sống vô hạn). Máy phải **TỪ CHỐI**, không được liệt-rồi-thôi. Nhưng **không cần dừng-hẳn**: `detectors:1639` chỉ in một dòng INFORM và nhóm đó vẫn sạch tuyệt đối. + +### L1 — Giữ nguyên tên cũ, tuyệt đối (sàn §GĐ-1(iv)) + +Đổi tên hồi tố thư mục/tệp mốc đã tồn tại = động vào mọi con trỏ trong nhật ký, mục lục, sổ tay, lịch sử phiên bản. **Rủi ro khổng lồ, lợi ích gần bằng không.** + +Năm vùng **ĐÓNG BĂNG** — không viết lại tên, không đổi tên, vĩnh viễn. Danh sách này **KHÔNG chép lại ở đây**; nguồn duy nhất là `docs/governance/vocab-alias-map.md` (khối "Lưu ý nền tảng"). Tra ở đó. + +Mọi luật hình dạng trong tệp này **chỉ áp VỀ PHÍA TRƯỚC** — cho vật sinh ra từ 2026-08-07. Vật cũ hợp lệ vĩnh viễn. + +### L2 — Lane đơn trị: mỗi loại sổ đúng MỘT thư mục, bỏ chữ "hoặc" + +Cho phép hai chỗ đặt là cho phép hai chỗ tìm, và tới lúc cần thì ai cũng tìm chỗ còn lại. Nếu một luật hiện hành đang chứa chữ "hoặc" cho vị trí, nó là **nợ**, ghi vào Phụ lục B chứ không được để im. + +### L3 — 🔴 CẤM MỌI QUY ƯỚC DẠNG "GIỮ NGUYÊN SỐ DÒNG" + +**Cấm tuyệt đối.** Không luật nào trong kho này được yêu cầu một dòng mã ở lại đúng một số dòng. + +**Vì sao — đo được, không phải lo xa:** +- `.claude/hooks/wal-flush.ps1:16-17` đang tự khai: *"GIU `$paths` O DUNG DONG 13: nhieu doc trich-dan `wal-flush.ps1:13`… Chen dong TREN day = lao-hoa het cac trich-dan do"*. Quy ước này **được canh bằng đúng một dòng chú thích** — không máy nào thi hành nó. +- Đo 2026-08-07: chuỗi `wal-flush.ps1:13` xuất hiện **21 lần** trong `*.md`, trong đó **2 neo SỐNG ngoài vùng đóng băng**: `.claude/commands/tiep.md:23` và `docs/governance/session-model-se-draft.md:4`. +- Cùng lớp lỗi (LỚP-6) đã **giết 3 neo trong `docs/STATUS.md` ngay trong phiên S180 này**. + +**Thay bằng:** neo bằng **chuỗi tìm được** — một đoạn văn bản đủ đặc trưng để `grep` ra. Ví dụ đúng: neo `$paths = @(` thay vì neo `:13`. Số dòng **chỉ** được dùng cho tệp đã đóng băng (5 vùng ở L1), nơi không ai chèn dòng nữa. + +Áp cho cả **con số chép tay** (LỚP-5): một đại lượng = một con số, và **neo LỆNH thay vì chép số**. Muốn nói "có bao nhiêu lớp cờ" thì trỏ khoá cấu hình, đừng viết số. + +### L4 — Miễn trừ theo QUY ƯỚC NGÔN NGỮ (tường minh, không im lặng) + +Một chuẩn "mọi tên kebab" sẽ **cờ 5 tệp đang đúng** = dương-giả ngay ngày đầu. Ba miễn trừ, liệt từng loại, **cấm mở rộng bằng suy diễn**: + +| Miễn trừ | Phạm vi | Lý do | Đo 2026-08-07 | +|---|---|---|---| +| **snake_case cho `*.py`** | mọi tệp `.py` | **PEP-8** — quy ước bắt buộc của ngôn ngữ | 5/5 `.py` snake · 0 `.py` kebab · 0 `.ps1` snake ⇒ **kỷ luật 100%, 2 chiều** | +| **`README.md` chữ HOA** | mọi thư mục | quy ước phổ quát | 2 tệp (`.claude/agents/`, `docs/governance/`) | +| **vật sinh tự động** | `__pycache__` | công cụ sinh, không ai đặt | 1 | + +🔴 Máy soi **in tên từng vật được miễn**, không được im lặng bỏ qua. Miễn trừ im lặng và lỗi im lặng trông giống hệt nhau. + +--- + +## §1 — Tên vai + +- **NẤC muốn sạch:** **THÀNH VIÊN** (tập đóng — không chỉ hình dạng) +- **Tập hợp lệ:** đúng 26 giá trị liệt trong `.claude/workflows/hmw.js` `VALID_ROLES` (`:22-51`). Đây là **nguồn**; không chép danh sách vào đây (L3). +- **Hình dạng:** kebab thuần `^[a-z0-9]+(-[a-z0-9]+)*$` — đo 26/26 đạt. +- **MÁY ép nấc này:** `hmw.js:171-186` — `badRoles` filter + `throw … DỪNG HẲN (STOP-HARD)`. **Đây là máy chặn DUY NHẤT trong cả kho thật sự dừng hẳn.** +- 🔴 **Giới hạn phải biết:** máy chặn theo **danh sách liệt kê**, KHÔNG theo hình dạng. Luật "tên vai phải theo dạng X" **sẽ không được máy này thi hành**. Và `hmw.js:180` (`x.raw != null && x.raw !== ''`) ⇒ **vai rỗng/null KHÔNG throw** (backward-compat role-less) ⇒ STOP-HARD bắt tên **SAI**, không bắt tên **THIẾU**. +- **Bất biến bắt buộc:** `.claude/agents/.md` (BaseName) ≡ `.claude/agent-memory//` (tên thư mục) ≡ phần tử trong `VALID_ROLES`. **Ba chỗ, không nguồn chung.** Lệch ⇒ `scripts/mfe-eval.ps1:264-267` in `N/A (no persistent diary -> ephemeral/unspawned)` và **loại vai khỏi phép đo** — một lời giải thích có thiện chí nhưng sai sự thật; đồng thời `detectors:1109` xếp vào `$unmapped` (liệt, không cờ). + ⇒ Trước W1 bất biến này có **0 máy kiểm**. Từ W1, `naming-scan.ps1` kiểm nó **hai chiều** (thiếu thư mục / thừa thư mục). + +## §2 — Nhãn lớp kiểm + +- **NẤC muốn sạch:** **TIỀN TỐ** (`view-` hoặc `gap-`). Nấc-2 **KHÔNG ép** — khai thẳng. +- **Tập hợp lệ:** đọc từ `.claude/agent-memory/memory-budget.json` → `lead_self_audit.flag_classes`. **Nguồn sống duy nhất.** +- **MÁY:** `governance-detectors.ps1:1761` `$flagTagRx` ép tiền tố · `scripts/h24-signal-write.ps1` từ chối nhãn lạ với mã thoát 2 (*"a monitor may NOT invent a class"*). +- **Nấc-2 đang có 8 họ** (`view-stale` 4 · `view-residual` 1 · `view-claim` 1 · `gap-carry` 2 · `gap-owner` 1 · `gap-decision` 1 · `gap-underfill` 1 · `gap-incident` 1). **Không có máy ép nấc-2 ⇒ tệp này KHÔNG ký luật nấc-2.** +- 🔴 **CẤM chép SỐ lớp vào văn xuôi** (L3/B1). Ca sống: `hmw.js:33` viết `(11 class: 5 view-* + 6 gap-*)` — **sai cả tổng lẫn thành phần** (thật: 12 = 6 view + 6 gap; lớp thứ 12 `view-claim-broader-than-sample` nằm cuối mảng, ngoài cụm `view-*`, nên đếm lướt ra 5). Vá đúng = **bỏ số, trỏ khoá cấu hình** — sửa 11→12 là để nó thối lại. + +## §3 — Thư mục lượt chạy + +- **NẤC muốn sạch:** **HÌNH DẠNG** +- **Tập hợp lệ (vật MỚI):** `YYYY-MM-DD-S-` +- **Tập hợp lệ (vật CŨ, giữ vĩnh viễn theo L1):** `YYYY-MM-DD-` — 18/88 thư mục hôm nay. +- **MÁY:** `closeout-sentinel.ps1:165` lọc thư mục lượt chạy theo **mã phiên trong tên** (`$sessRe`) · `:168` khớp tên thư mục H24 · `governance-detectors.ps1:1097-1102` quét đệ quy. +- 🔴 **Hệ quả đang sống, không phải giả thuyết:** **18/88 thư mục (20,5%) VÔ HÌNH với `closeout-sentinel` NGAY HÔM NAY**, không cần ai đổi tên gì. Đây là lý do luật hình dạng chỉ áp về sau **nhưng máy soi vẫn phải in con số 18** — im con số đó là để vùng mù nằm im. + +## §4 — Tệp con trong lượt chạy + +- **NẤC muốn sạch:** **HỌ** (tệp có ĐỊNH DANH VAI phải rơi vào một họ máy đọc được) +- **Tập hợp lệ cho tệp mang định danh vai:** + - `sub--.md` — nhiều lượt cùng vai + - `sub-.md` — một lượt + - `-return.md` — lượt trả + - `run.md` — mô tả lượt chạy + - `-synthesis.md` — tổng hợp +- **MÁY:** `governance-detectors.ps1:1102` + `:1771` (**cùng regex, HAI bản sao, không dùng chung hằng số**) + `scripts/memory-selfimprove-audit.ps1:298` (sau bản vá W1). ⇒ đổi họ = sửa **3 chỗ**, xem §12. +- 🔴 **Điểm mù CÓ CHỦ ĐÍCH, phải biết:** **112/719 tệp (15,6%) không thuộc bất kỳ họ nào** — ghi chú, bảng, tệp phụ trợ. Đó **không phải lỗi**: tệp phụ trợ không mang định danh vai thì máy không cần thấy. Nhưng hệ quả là: **đặt tệp-trả-lời-của-một-vai ra ngoài 5 họ trên = vai đó bị đọc thành CHƯA CHẠY, và chỗ lệch chỉ được LIỆT chứ không CỜ** (`detectors:1109`). Ca thật S159: 9 lượt chạy, bộ lọc thấy 6, **rơi đúng 3 lane đắt nhất**. + +## §5 — Tệp mốc phiên + +- **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)**. +- **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:** + +| Fork | Số | Máy | Cách máy tha | Hệ quả | +|---|---|---|---|---| +| `_pause-*` ⟂ `pause-*` | 22 ⟂ 1 | `session_ctx.py:349-358` | đọc **cả hai** glob | 🟢 an toàn, nhưng fork không bao giờ tự đóng | +| `_end` ⟂ `closed.md` | 10 ⟂ 1 | `detectors:1660` | chấp cả hai bằng `-or` | 🔴 đổi sang **tên thứ ba** ⇒ phiên đã đóng bị đọc là **đang mở**, cờ *"BƯỚC 0.8 bị bỏ"* **không bao giờ bắn** | + + ⇒ Máy tha là **đúng** cho vật cũ (L1) và **sai** như một trạng thái vĩnh viễn. Máy soi phải **gọi tên hai vật này mỗi lượt** — nếu không, chúng là hai cái tên mà **không văn bản nào và không cờ nào từng nhắc tới**. +- **Vật thứ ba, ngoài mọi họ:** `resume-S146-20260722T2334.md`. Vật cũ ⇒ giữ (L1) ⇒ nhưng phải được **liệt tên**. + +## §6 — Nhật ký phiên + +> 🔴 **Mục có rủi ro BOM HẸN GIỜ cao nhất trong cả chuẩn. Đọc trọn trước khi sửa.** + +- **NẤC muốn sạch:** **KHÔNG ÉP HÌNH DẠNG.** Nhóm này có **0 máy**. Theo L0, tệp này **cấm ký luật hình dạng cho nó**. +- **Tập giá trị hợp lệ = CẢ NĂM HỌ ĐANG SỐNG** (mẫu số **159 tệp**, đo 2026-08-07): + +| Họ | Dạng | Số | % | +|---|---|---|---| +| (a) | `YYYY-MM-DD-HHMM-S-` | 19 | 11,9% | +| (b) | `YYYY-MM-DD-S-` | 78 | **49,1%** | +| (c) | `YYYY-MM-DD-s-` (chữ `s` thường) | 13 | 8,2% | +| (d) | `YYYY-MM-DD-HHMM-` | 45 | 28,3% | +| (e) | `YYYY-MM-DD-` | 4 | 2,5% | + +- 🔴 **VÌ SAO tập hợp lệ phải chứa cả 5 (bẫy-1 của sàn):** một bài kiểm khẳng định cứng *"kho sạch"* cộng với một quy ước chỉ có hiệu lực từ ngày D sẽ **xanh hôm nay và TỰ CHUYỂN ĐỎ vào ngày D** mà không ai chạm vào mã. Thu hẹp tập hợp lệ xuống 1 họ = cài đúng quả bom đó. **Cấm.** +- **Khuyến nghị đi tới (khuyến nghị, KHÔNG cưỡng chế — vì không có máy):** họ **(b)**. Lý do: đông nhất (78/159), có mã phiên nên `closeout-sentinel` đọc được, và không mang giờ-phút vốn hay bị đặt sai. +- 🔴 **XUNG ĐỘT ĐANG SỐNG — khai, không tự vá:** `CLAUDE.md:151` quy định `docs/changelog/sessions/YYYY-MM-DD-HHMM-{topic}.md`, tức **chỉ họ (a)+(d)**. Đĩa khớp `^\d{4}-\d{2}-\d{2}-\d{4}-` = **64/159 = 40,3%**. ⇒ **quy ước thành văn DUY NHẤT của kho đang sai với 59,7% đĩa, sống nhiều tháng, 0 máy, 0 ai biết.** + **Tệp này KHÔNG sửa `CLAUDE.md`** (ngoài phạm vi W1 — xem Phụ lục B, nợ N-1). Cho tới khi nợ đó đóng, `CLAUDE.md:151` phải được đọc là **"khuôn khuyến nghị cho vật mới"**, KHÔNG phải "vị từ kiểm kho". + +## §7 — Tên lệnh + +- **NẤC muốn sạch:** **HÌNH DẠNG** kebab `^[a-z0-9]+(-[a-z0-9]+)*$` — đo **19/19 = 100%**. +- **MÁY:** **không có script nào.** Nhóm này sạch nhờ **vòng phản hồi NGƯỜI**: đổi tên lệnh = lệnh biến mất khỏi tay chủ dự án ngay lượt sau. +- ⇒ Ghi thẳng để không ai tưởng có máy canh (LỚP-9): **sạch KHÔNG phải nhờ cưỡng chế.** `naming-scan.ps1` là máy đầu tiên soi nhóm này. +- `tiep.md` là ngoại lệ **NGÔN NGỮ** (tiếng Việt không dấu), **không** phải ngoại lệ hình dạng ⇒ vẫn 1 họ. + +## §8 — Kịch bản + +- **NẤC muốn sạch:** **HÌNH DẠNG, THEO NGÔN NGỮ** (L4) + - `.ps1` · `.sql` · `.md` → **kebab-case** + - `.py` → **snake_case** (PEP-8) +- Đo (mẫu số **53 mục**): kebab 46 · snake 6 (= 5 `.py` + `__pycache__`) · đuôi: `.ps1` 32 · `.sql` 14 · `.py` 5 · `.md` 1 · thư mục 1. **Kỷ luật 2 chiều 100%** — 0 `.py` kebab, 0 `.ps1` snake. +- 🔴 **Trục tiền tố `s-` / `plan-` là HỢP LỆ, KHÔNG phải lệch** (16/53 = 30,2%). Nghĩa: *"kịch bản MỘT LẦN thuộc phiên/kế hoạch N"*, phân biệt với máy thường trực nằm cùng thư mục. Đây là **thông tin tự mô tả có ích**, không phải trôi tên. + ⇒ Máy soi **đếm riêng** cụm này thành nhóm `MOT-LAN` với mẫu số của nó — một tín hiệu tồn kho, **không phải cờ vi phạm**. Xếp chúng vào cột "lệch" là **dương-giả**, và dương-giả ngày đầu là cách nhanh nhất để người ta tắt máy soi. +- **Fork thật duy nhất:** `session-scaffold.ps1` ⟂ `session_scaffold.py` — **hợp lệ theo luật ngôn ngữ nhưng TRÙNG KHÁI NIỆM**. Hai bản hiện sinh ra tên đầu ra **giống hệt nhau** (`session-` + `_context-s-.md`), cả hai đều hard-pin, **0 nguồn chung**. Chưa vỡ; là nợ, xem §12. + +## §9 — Tên sổ + +- **NẤC muốn sạch:** **HÌNH DẠNG** kebab — cho **sổ ĐANG BẢO TRÌ**. +- Đo (mẫu số **15 mục** `docs/governance/`): kebab thường 10/15 · chữ HOA-GẠCH 5/15. +- **Phân loại 5 vật HOA** — phân biệt này là bắt buộc, gộp lại sẽ đọc sai: + - `README.md` → **miễn theo L4** (quy ước phổ quát). + - `BROADCAST-OUT-SOLUTION-ERP-2026-05-29-INFRA-RETRO.md` · `BROADCAST-OUT-…-2026-05-29.md` · `BROADCAST-OUT-…-2026-06-01.md` · `RAG-AUDIT-RESPONSE-2026-05-29.md` → **vật lịch sử** (thư đã gửi, mang ngày). Giữ nguyên theo L1, **nhưng vẫn bị LIỆT TÊN** mỗi lượt quét: chúng là **chứng nhân** rằng nhóm này có 2 họ. Giấu chúng đi thì con số "sạch" của nhóm là con số bịa. +- **Luật vật MỚI:** sổ mới trong `docs/governance/` **bắt buộc kebab thường**. Thư đã gửi thuộc `broadcasts/`, không thuộc `docs/governance/` (L2). + +## §10 — Nhãn tác vụ + +- **NẤC muốn sạch:** **KHÔNG ÉP HÌNH DẠNG.** +- **Vật là gì:** `taskList[].label` truyền vào `.claude/workflows/hmw.js` lúc phát lệnh (`:18`), dùng ở `:292` `nameOf`. +- **Vì sao không ép:** nhãn này **phù du** — sống trong tham số một lượt gọi, không hạ cánh thành tên tệp (trừ khi được chép vào ảnh chụp `taskList` trong `run.md`). **0 máy kiểm hình dạng.** Theo L0, cấm ký luật hình dạng. +- **Luật duy nhất ký được:** nhãn phải **mô tả VIỆC**, không lặp lại **VAI** (vai đã có trường riêng). Đây là luật **mô tả, không cưỡng chế** — khai đúng như vậy. +- **Nợ đã biết:** `hmw.js:292` khi thiếu nhãn thì rơi về `role`, rồi rơi tiếp về `'(no-label)'` — **suy giảm im lặng**, đúng lớp lối câm ở L0. Không vá trong W1 (ngoài phạm vi); ghi Phụ lục B nợ N-3. + +--- + +## §11 — Tên bị neo NGOÀI kho mã 🔴 + +**Đây là lớp nguy hiểm nhất, vì không ai `grep` tệp cấu hình khi đổi tên một kịch bản.** + +| # | Vật bị neo | Neo ở đâu | Đổi tên ⇒ chuyện gì | +|---|---|---|---| +| 1 | `.claude/hooks/wal-flush.ps1` | `.claude/settings.json:9` — `-File .claude/hooks/wal-flush.ps1` | PowerShell không tìm thấy tệp ⇒ **việc tự-commit WAL DỪNG HẲN**. Hook tự khai *"fail-open moi nhanh: exit 0 ke ca loi"* — nhưng `exit 0` đó **nằm TRONG tệp**; tệp không chạy thì không ai `exit 0` hộ. **Mã thoát thật của nhánh này: KHÔNG ĐO ĐƯỢC** (cần đổi tên trên cây tạm rồi chạy hook thật). | +| 2 | thư mục `.claude/auto-memory` **và vị trí gốc của cả kho** | `.claude/settings.json:2` — `"autoMemoryDirectory": "D:/Dropbox/…/SOLUTION_ERP/.claude/auto-memory"` (**đường dẫn TUYỆT ĐỐI**) | Đổi tên thư mục **hoặc dời/đổi tên thư mục gốc của kho** ⇒ ký-ức-tự-động trỏ hụt, im lặng. *(Vật này lane a chưa liệt — bổ sung @W1.)* | +| 3 | 4 đường dẫn trong thân hook | `wal-flush.ps1:13` — `.claude/WAL.md` · `.claude/agent-memory/` · `.claude/workflows/runs/` · `.claude/sessions/` | `git add` trượt im lặng (`2>$null`) ⇒ **thư mục đó thôi được commit tự động, 0 báo**. | + +**Luật:** đổi tên bất kỳ vật nào ở cột 2 ⇒ **bắt buộc mở `.claude/settings.json` và đọc TOÀN TỆP**, không chỉ grep khối `hooks`. Tệp này 15 dòng, đọc trọn mất 5 giây; hai neo nằm ở hai khối khác nhau (`:2` và `:9`) nên grep một khối sẽ bỏ sót khối kia. + +## §12 — Số chỗ phải sửa ĐỒNG THỜI 🔴 + +Đổi một trong các tên dưới đây mà không mở đủ số chỗ = vỡ câm. Con số này là **cận dưới đã đo**, không phải ước lượng. + +| Tên | Số chỗ | Từng chỗ (liệt đủ, cấm nén thành khoảng) | +|---|---|---| +| `session-` (hình dạng thư mục phiên) | **4** | `governance-detectors.ps1:1639` · `scripts/session_ctx.py:133` · `scripts/session-scaffold.ps1:116` · `scripts/session_scaffold.py:105` | +| `sub-*` (họ tệp con lượt chạy) | **3** | `governance-detectors.ps1:1102` · `governance-detectors.ps1:1771` · `scripts/memory-selfimprove-audit.ps1:298` | +| tên vai | **3** | `.claude/workflows/hmw.js` `VALID_ROLES` · `.claude/agents/.md` · `.claude/agent-memory//` | +| `.claude/agent-memory` (đường dẫn) | **5** | `closeout-sentinel.ps1:119` · `mfe-eval.ps1:44` · `mfe-eval.ps1:264` · `memory-selfimprove-audit.ps1:122-124` · `crystallized-backfill.ps1:54-55` (+ `wal-flush.ps1:13`) | + +🔸 Hai bảng sao **cùng một regex** ở `detectors:1102` và `:1771` là **nợ kỹ thuật: 1 luật / 2 bản sao**. S159 đã phải vá **cả hai**; chú thích `:1769-1770` tự khai *"mirror of the C11(b) filter fix above"*. Hợp nhất thành một hằng số là việc nên làm — **không làm trong W1** (đụng máy đang sống, thuộc W2 theo `Q5`). + +## §13 — Giao thức di trú sáu bước (cho ca BUỘC phải đổi tên đã có người trỏ) + +1. **Ký chuẩn** (tệp này). +2. **Kiểm kê mọi chỗ máy đang đọc tên** — tra **Phụ lục A**, và quét lại thật: biểu thức tìm kiếm trong `scripts/`, trong bài kiểm, trong `.claude/commands/*.md`. +3. **Cho bộ phân tích đọc được CẢ tên cũ lẫn tên mới TRƯỚC ĐÃ.** Hai tiền lệ đúng sách có sẵn trong kho, dùng lại khuôn của chúng: `session_ctx.py:349-358` (hai glob, chú thích giải thích vì sao không đếm trùng) và `governance-detectors.ps1:1648-1649`. +4. **Tên mới chỉ áp TỪ NAY VỀ SAU** (L1). +5. **Đối chứng HAI CHIỀU + phản chứng.** Gài một tên cũ giả và một tên mới giả trên **cây tạm** → máy phải đọc được **cả hai**. Rồi gài thêm một tên **sai cả hai chuẩn** → máy **phải báo**. Chạy trọn bộ máy trước/sau, so mã thoát. +6. **Bật chế độ nghiêm sau `3` phiên sạch liên tiếp.** *(Con số 3 do nhà mình đặt; đây là chỗ ghi nó. Đổi số thì đổi ở đây, không chép đi chỗ khác.)* — Bật nghiêm là việc của **W3b**, sau khi chủ dự án chốt câu **P1**; W1 **không** lái mã thoát. + +**Ngoại lệ đáng học (từ sàn):** có những tệp mà **máy neo đường dẫn cố định** — đổi tên chúng mỗi lần cập nhật là phá form, đúng cái mà chuẩn sinh ra để chống. Với loại này: **giữ tên cố định, để thời điểm sống trong tiêu đề khối BÊN TRONG tệp.** Ca sống ở kho ta: `docs/STATUS.md`, `docs/HANDOFF.md`, `.claude/WAL.md`. + +## §14 — Hai xung đột: KHAI, KHÔNG vá âm thầm 🔴 + +### XĐ-1 — Luật S122 *"đo NỘI DUNG, đừng đoán TÊN"* ⟂ đòi hỏi *"tên lệch phải kêu"* + +`governance-detectors.ps1:1104-1109` **cố ý** không đoán tên: tên lạ rơi vào `$unmapped` và chỉ được **liệt**, không **cờ**. Đó là thi hành luật S122 — và luật đó **đúng**. + +Nhưng hệ quả là **lệch tên = im lặng theo thiết kế**. Muốn "tên lệch phải kêu" thì **phải sửa chính chỗ đó**, tức đi ngược một luật đang sống. + +**Cách W1 đi qua mà không phạm luật nào:** `naming-scan.ps1` là **máy MỚI, tách riêng**, soi **tên vật-bộ-máy** (agents / commands / scripts / sessions / sổ / hook) — **không** đụng `$unmapped` của detectors, **không** đổi hành vi máy cũ. S122 nói *đừng suy vai từ tên*; nó **không** cấm một máy chuyên trách soi hình dạng tên. Hai việc khác nhau. +⇒ **Chưa cần chủ dự án phán.** Nếu về sau ai muốn cho `detectors:1109` kêu thật, **lúc đó** mới là xung đột cần phán. + +### XĐ-2 — Doctrine exit-0-advisory ⟂ lái mã thoát + +Chủ dự án **đã chốt P1 = PA-2** (hai mã thoát mỗi máy, phân loại lại 70 cờ). Việc đó thuộc **W3b**, có điều kiện vào riêng (rider-jump phải soak INFORM ≥1 phiên trước). + +⇒ **W1 KHÔNG lái mã thoát.** `naming-scan.ps1` **luôn `exit 0`**, kể cả khi có cờ. Lý do đo được (lane F): bật gate mà chưa soak ⇒ **8-12 lớp nợ tồn kêu cùng lúc**, người đọc tưởng máy hỏng rồi tắt máy. Khoản `G1-B7` (siết máy soi sang mã thoát) nằm **NGOÀI scope W1** đúng theo `adap-upgrade-pack-fitmap.md` dòng GĐ-1. + +--- + +## PHỤ LỤC A — 14 đoạn máy ĐANG ĐỌC TÊN (tra TRƯỚC mọi lần đổi tên) + +> Nguồn đầy đủ: `runs/2026-08-07-S180-adap-upgrade-pack-phased/sub-w1a-mayd-octen.md` §1. +> 🔴 **0/14 đoạn tự thích nghi được với tên mới.** Ba nhánh 🟢 tồn tại đều là **xử lý tay cho một cặp cụ thể**, không phải cơ chế tổng quát. **Không được giả định có máy nào sẽ tự nuốt tên mới.** +> Mức: 🔴 vỡ-câm (vẫn chạy, vẫn in, kết quả sai/mù) · 🟡 vỡ-ồn (throw/cờ/dừng — đau nhưng thấy được). + +| # | Đoạn máy | Đọc tên gì | Mức | Đổi tên ⇒ | +|---|---|---|---|---| +| M-01 | `hmw.js:22-51` + chặn `:171-186` | 26 tên vai | 🟡 | throw DỪNG HẲN, fan-out chết (chỉ bắt tên SAI, không bắt tên THIẾU) | +| M-02 | `governance-detectors.ps1:1102` | họ `^(sub-.+\|.+-return)\.md$` | 🔴 | tệp biến mất khỏi tầm quét, vai bị coi là chưa chạy | +| M-03 | `governance-detectors.ps1:1104-1107` | suy VAI từ tên tệp, 3 nấc tham lam | 🔴 | rơi `$unmapped` — **liệt, không cờ** | +| M-04 | `governance-detectors.ps1:1762` (dùng `:1774`) | `lead-stale\|lead-gap\|ring2-audit` trong tên tệp | 🔴 | luật FLAG-khuôn ngừng áp; in *"đã đo, 0 cờ"* trong khi **chưa đo gì** | +| M-05 | `governance-detectors.ps1:1771` | **bản sao thứ 2** của M-02 | 🔴 | vá một chỗ quên chỗ kia (S159 đã phải vá cả hai) | +| M-07 | `governance-detectors.ps1:1044`+`:1050` (+`:1882`) | đường dẫn `docs/changelog/sessions/` | 🔴 | cờ MED **bắn sai mỗi phiên** — máy ồn nhưng **tố người dùng thay vì tố chính nó**; `:1882` là nhánh `[skip]` im lặng | +| M-08 | `governance-detectors.ps1:1624`·`1639`·`1648`·`1649`·`1660` | 5 tên trong một khối | 🔴+🟡 | `:1622` **skip trọn khối** nếu đổi tên thư mục gốc; `:1660` chấp 2 tên bằng `-or` | +| M-09 | `scripts/session_ctx.py` (7 vùng) | `_snapshot-*` `:110` · `WAL.md` `:116` · `session-{n}` `:133` · `_pause`/`pause` `:349-358` · `_context-s`/`_mind-s`/`_end` `:530-549` | 🔴 rìa / 🟢 lõi | `:110` `:116` hỏng **câm**; `:349-358` + `:594` là **hai mẫu tốt** nên nhân rộng | +| M-10 | `session-scaffold.ps1` ⟂ `session_scaffold.py` | cùng sinh `session-` + `_context-s-.md` | 🟡 | lệch nhau ⇒ COLLISION exit 4 (thấy được); nhưng **hard-pin 2 bản, 0 nguồn chung** | +| M-11 | `.claude/hooks/wal-flush.ps1` | tên chính nó (`settings.json:9`) + 4 đường dẫn (`:13`) | 🔴 ×2 | hook không chạy (mã thoát **KHÔNG ĐO ĐƯỢC**) · `git add` trượt im lặng | +| M-12 | `scripts/closeout-sentinel.ps1:118`·`119`·`160`·`163`·`165`·`168` | tên sổ đếm · `agent-memory` · `runs` · khuôn tên H24 · **mã phiên trong tên thư mục** | 🔴 | phiên chuyển **SKIP chứ không FLAG** — SKIP đọc y hệt *"phiên này không cần kiểm"* | +| M-13 | `scripts/mfe-eval.ps1:44`·`52-54`·`243`·`264` | `memory-budget.json` · 3 tên sổ · roster suy từ tên tệp · **ghép tên vai vào đường dẫn** | 🔴 | vai bị **LOẠI khỏi phép đo**, kèm lời giải thích sai sự thật | +| M-14 | `scripts/memory-selfimprove-audit.ps1:122-124`·`189`·`211`·`230-231`·`252-258`·**`:298`**·`:299` | 3 neo thư mục · tên vai→tệp · **tên script khác** · 2 sổ · 3 artefact bộ nhớ · **`-Filter 'sub-*.md'`** | 🔴 | `:298` = **chính bộ lọc đã vá ở tệp A mà chưa nhân sang tệp B** → vá tại W1 | +| M-15 | `scripts/crystallized-backfill.ps1:54-55`·`73-78`·`106-114` | `agent-memory` · 4 tên sổ mặc định | 🟡 hiển thị / 🔴 số dẫn xuất | in `MISSING` từng dòng, **nhưng** `$totalBytes` không cộng ⇒ kết luận *"còn nhiều chỗ trống"* **sai câm** | + +**Hai vật KHÔNG phải máy đọc tên — đừng bảo tồn nhầm:** `governance-detectors.ps1:1716` (dòng **chú thích**, mô tả một điểm mù đã biết) · `scripts/applied-eval-nokey.ps1` (**0 thao tác tệp**; control cùng thước trên `mfe-eval.ps1` = 14 hit ⇒ 0 là 0 thật). Đưa chúng vào danh sách sẽ khiến người sau đi bảo tồn một cái tên **không máy nào đọc**, đồng thời làm phồng mẫu số. + +## PHỤ LỤC B — NỢ và CHƯA ĐO (ghi tên, không để im) + +| # | Nợ | Vì sao chưa đóng ở W1 | Đóng ở đâu | +|---|---|---|---| +| N-1 | `CLAUDE.md:151` khuôn nhật ký phiên sai với **59,7%** đĩa | W1 **bị cấm sửa** `CLAUDE.md`; đây là bề mặt nạp mỗi lượt, sửa phải gom restart | Cần chủ dự án gật; gom vào lớp **C** của W3/W4 | +| N-2 | `detectors:1102` ⟂ `:1771` — 1 luật / 2 bản sao | Đụng máy `/session-end` đang sống ⇒ đòi fault-inject cây tạm (`Q5`) | W2 | +| N-3 | `hmw.js:292` thiếu nhãn ⇒ rơi `'(no-label)'` im lặng | Ngoài phạm vi W1 (W1 chỉ vá con số `:33`) | W2/W5 | +| N-4 | **CHƯA ĐO:** mã thoát thật khi `wal-flush.ps1` bị đổi tên | Cần đổi tên trên **cây tạm** rồi chạy hook thật + đọc `$LASTEXITCODE` | W2 | +| N-5 | **CHƯA ĐO:** `.claude/commands/*.md` (19) + `.claude/agents/*.md` (27) neo những tên gì | Đó là **kiểm kê máy** = phần việc lane a; nhận thêm ở W1 là ăn lẹm | W2 | +| N-6 | `session-scaffold.ps1` ⟂ `session_scaffold.py` trùng khái niệm, 0 nguồn chung | Hợp lệ theo L4; hợp nhất là đổi mã, không phải đổi tên | W2 | +| N-7 | **Vai giữ chuẩn** (`G1-B2`) chưa tồn tại | **NGOÀI scope GĐ-1 theo fit-map** — chờ chủ dự án phán câu **P4** | W4b | +| N-8 | Con số "18/88 thư mục lượt chạy vô hình với sentinel" | Là **hệ quả**, không phải tên sai. Vá nó = sửa `closeout-sentinel.ps1:165` | W2 | + +**Ba ô nghiệm thu của sàn §GĐ-1 mà W1 CỐ Ý chưa đạt, khai thẳng thay vì để trống:** +- ☐ *"Vai giữ chuẩn tồn tại"* → **N-7**, ngoài scope theo fit-map, chờ **P4**. +- ☐ *"Máy soi tên đặt ở cổng"* → W1 chạy **tay + INFORM-only**; cắm vào cổng `session-end` thuộc **W3** (gom restart), lái mã thoát thuộc **W3b** (P1 = PA-2). +- ☑ Sáu ô còn lại: xem `rename-ledger.md` và báo cáo wave. diff --git a/docs/governance/ritual-labels.md b/docs/governance/ritual-labels.md new file mode 100644 index 0000000..c69267e --- /dev/null +++ b/docs/governance/ritual-labels.md @@ -0,0 +1,150 @@ +# Nhãn lệch nghi thức + vòng hỏi ngược + +> **Nguồn sàn:** `broadcasts/inbox/ai_infra/2026-08-04-Governance-upgrade-pack-phased-phu-luc-spec-pitfall.md` §GĐ-3 khoản (i)(ii)(iii)(vii) + câu kết `:208`. +> **Áp @S180 wave W3.** Bóc khoản: lane C `sub-n3-lane-c-gd34.md` §E.1 · §E.2 · §F (`C3-01` · `C3-02` · `C3-03` · `C3-09` · `C3-10`). +> **Phạm vi văn bản này:** cách **gọi tên** một bước nghi thức bị lệch, và cách **đóng** vòng hỏi ngược. Văn bản này **KHÔNG** định nghĩa cổng chặn hay thang mã thoát — đó là `C3-04` + khoản (v), thuộc wave **W3b**, đang chờ owner (P1). Mọi máy nhắc ở đây **INFORM, exit 0**. + +--- + +## §0 — Vì sao cần nhãn, và vì sao AS-signature không thay được + +SE đã có taxonomy `AS-signature` trong `docs/governance/error-ledger.md`. Nó là **chữ ký HÀNH ĐỘNG** — *đã làm sai cái gì*. Bốn nhãn dưới đây là **nhãn Ý ĐỊNH** — *vì sao bước đó không đủ*. Hai trục **không thay thế nhau**; ánh xạ chỉ một phần (*quên* ↔ `E-011`/`AS-15` "nghi thức chạy tắt"). + +⇒ Đây là **việc mới**, không phải đổi tên cái cũ. Ai định "tái dụng AS cho đủ 4 nhãn" là đang gộp hai trục khác nhau. + +🔴 **Ranh của mọi máy nhắc trong văn bản này** (hub `:208`): máy đo **sự hiện diện và khuôn dạng, KHÔNG đo CHẤT**. Một bước có đủ vật mốc mà nội dung rỗng thì máy vẫn im. Nhãn do **người** đặt; máy chỉ **thu thập bốn vị từ** để người không phải đoán. + +--- + +## §1 — Ba khái niệm nền (định nghĩa một lần, dùng suốt) + +| Tên | Nghĩa | Vị từ đĩa | +|---|---|---| +| **VẬT MỐC** | thứ hạ cánh xuống đĩa khi bước chạy đủ: một tệp, một thư mục, hoặc **một dòng in có khuôn cố định** trong vật chứng của lượt | `Test-Path <đường dẫn>` · hoặc `grep -c '' ` | +| **DÒNG KHAI** | câu trong vật chứng của lượt, nói rõ bước nào bị bỏ / rút gọn **và vì sao** | `grep -n '' ` | +| **ĐIỀU KIỆN CHO PHÉP** | mệnh đề **chạy lại được** trong chính tệp lệnh của cửa, cho phép bỏ bước đó | lệnh do tệp lệnh nêu; chạy lại ra `đúng`/`sai` | + +🔴 **`C3-09` — guard vắng tệp PHẢI là vị từ máy.** Kiểm tồn tại rồi bỏ qua **và khai**. **CẤM** dùng mệnh đề *"cái đó chưa làm"*: mệnh đề đó sai ngay giây tệp kia hạ cánh. Ba neo đã có sẵn trên đĩa, khai tương đương, không dựng lại: + +- `scripts/distill-shard-probe.ps1:23` — *"khong thay memory-budget.json -> probe-loi (khong chan)"* +- `scripts/mfe-eval.ps1:45` +- `scripts/memory-archive-gate.ps1:40-41` + +--- + +## §2 — BỐN NHÃN, mỗi nhãn một vị từ kiểm được trên đĩa + +Bốn nhãn chỉ áp cho **hàng đã bị nêu là thiếu hoặc lệch**. Bước chạy TRỌN **không sinh hàng nào** — nó không có nhãn, và đó là trạng thái thứ năm nằm ngoài bảng. + +| Nhãn | Vật mốc | Dòng khai | Điều kiện cho phép, **chạy lại** | Sức nặng | +|---|---|---|---|---| +| **quên** | **VẮNG** | **0** | *không xét* | Vá, rồi nhắc | +| **tự ý bỏ** | **VẮNG** | **có** | chạy lại ra **SAI** — hoặc đặc tả **không nêu** điều kiện chạy lại được | 🔴 **Nặng nhất.** Vá · ghi `error-ledger.md` · **theo dõi tái phạm** | +| **suy giảm hợp lệ** | VẮNG hoặc **rút gọn** | **có**, kèm con trỏ `file:line` tới đặc tả | chạy lại ra **ĐÚNG** | **Không tính lỗi** | +| **bị chặn** | **VẮNG** | **có**, kèm con trỏ tới **nỗ lực gỡ** (lệnh đã chạy + output nhận được) | *không xét* — điều kiện nằm ngoài kho | Không tính lỗi; nhưng nỗ lực gỡ **phải có vết**, không được là lời kể | + +### 2.1 — Vị từ chạy được, từng nhãn + +Bốn lệnh dưới đây là **bốn vị từ**, chạy trên `bash`. `$M` = đường dẫn vật mốc · `$V` = vật chứng của lượt · `$B` = mã bước. + +```bash +# (1) vat moc co mat khong -> 0 = VANG +test -e "$M" && echo 1 || echo 0 +# (2) co dong khai cho buoc $B khong -> 0 = KHONG KHAI +grep -c -- "$B" "$V" +# (3) dong khai co con tro file:line toi dac ta khong -> 0 = KHONG CON TRO +grep -E -c -- "$B.*[A-Za-z0-9_./-]+\.(md|ps1|py|js|json):[0-9]+" "$V" +# (4) dieu kien cho phep: chay lai chinh lenh ma dac ta neu -> in dung/sai +# KHONG CO lenh chay lai duoc trong dac ta => ket qua = "khong-xac-dinh" +``` + +**Bảng quyết định** — đọc `(1)(2)(3)(4)` theo đúng thứ tự, dừng ở dòng khớp đầu tiên: + +| (1) vật mốc | (2) khai | (3) con trỏ | (4) điều kiện | ⇒ Nhãn | +|---|---|---|---|---| +| 1 | — | — | — | **TRỌN** — không sinh hàng | +| 0 | 0 | — | — | **quên** | +| 0 | ≥1 | 0 | — | **tự ý bỏ** | +| 0 | ≥1 | ≥1 | `sai` **hoặc** `không-xác-định` | **tự ý bỏ** | +| 0 | ≥1 | ≥1 | `đúng` | **suy giảm hợp lệ** | +| 0 | ≥1 | ≥1 (trỏ **nỗ lực gỡ**, không phải đặc tả) | *không xét* | **bị chặn** | + +### 2.2 — 🔴 Hai chỗ luật này CỐ Ý khắt khe hơn "có khai là xong" + +**(a) Khai không tự miễn trừ.** Hub `phu-luc:189` viết *tự ý bỏ* gồm cả ca *"khai là 'bỏ êm' trong khi điều kiện cho phép bỏ **đánh giá lại trên đĩa là sai**"*. Nghĩa là **viết một dòng khai KHÔNG đủ để sạch** — dòng khai phải **sống sót phép chạy lại**. Nếu luật được đọc thành *"bỏ qua CÓ KHAI thì không phải lỗi"* thì bất kỳ ai cũng tự tha được bằng một câu, và cả bộ nhãn thành đồ trang trí. + +**(b) Mặc định khi không đo được là nhãn NẶNG, không phải nhãn nhẹ.** Cột (4) ra `không-xác-định` (đặc tả không nêu điều kiện chạy lại được) ⇒ xếp **tự ý bỏ**, **không** xếp *suy giảm hợp lệ*. Lý do: nếu chỗ mù mặc định về nhãn vô tội thì cách rẻ nhất để sạch là **viết đặc tả mơ hồ** — thưởng cho đúng thứ cần phạt. + +🔸 **Khai thiếu, không giấu:** vế *"đánh giá lại điều kiện trên đĩa"* của nhãn **tự ý bỏ** hiện **CHƯA CÓ MÁY** làm tự động. Cột (4) hôm nay là **thao tác người**: mở tệp lệnh của cửa, tìm mệnh đề điều kiện, chạy lại. Máy chỉ lo `(1)(2)(3)`. Đây là **giới hạn đã biết**, không phải chỗ chưa nghĩ tới. + +--- + +## §3 — VÒNG HỎI NGƯỢC: khuôn 5 cột + luật đóng + +Hub `phu-luc:191`: vai kiểm trả về một bảng; người điều phối **định đoạt từng dòng**; **không dòng nào để trống thì mới đóng được**. + +### 3.1 — Khuôn (chép nguyên, không đổi tên cột) + +| Bước thiếu hoặc lệch | Đặc tả nói gì | Bằng chứng trên đĩa | Nhãn | Câu hỏi đích danh | +|---|---|---|---|---| +| `` bước `` | `:` + trích ≤1 câu | lệnh đã chạy + kết quả `(1)(2)(3)(4)` | một trong 4 nhãn §2 | 1 câu, hỏi **người điều phối**, có thể trả lời bằng *chạy bổ sung* / *khai suy giảm* / *khai không-thể-nữa* | + +### 3.2 — Luật đóng (ba điều kiện, thiếu một là **chưa đóng**) + +1. **Không ô nào trống.** Kể cả cột *nhãn*: không phân loại được thì ghi `chưa-phân-loại` **kèm lý do**, không để trống — ô trống đọc thành *đã xét và sạch*. +2. **Mỗi hàng có một định đoạt của người điều phối**, thuộc đúng ba giá trị: `chạy-bổ-sung` · `khai-suy-giảm` · `khai-không-thể-nữa`. +3. **Bảng đi kèm MẪU SỐ**: *N hàng / M bước được soi*. `M` phải là số bước **thật sự được duyệt**, không phải số bước tồn tại. + +### 3.3 — 🔴 CẤM thay bảng bằng một con số tổng + +Không được đóng vòng bằng câu *"đã xử N finding"*. Con số tổng **đóng vai đã-phủ-hết** trong khi mẫu số lệch. + +**Ca thật, trong kho này:** S119 — lead tuyên *"vá 19 finding"* trong khi thật **23**. Bài học đã ghi: `.claude/auto-memory/feedback_meta_count_selfcoverage_blindspot.md` — *"bảng disposition TỪNG DÒNG thay số tổng"*. + +🔸 Hai nguồn, một phát hiện: luật đóng của hub (*không dòng nào trống*) và bài học S119 của kho này (*từng dòng, không dùng số tổng*) là **cùng một kết luận tìm ra ở hai nơi độc lập**. Ghi lại để lần sau không ai tưởng đây là luật ngoại nhập. + +### 3.4 — 🔴 `C3-02`: vai kiểm CHỈ ĐỐI CHIẾU, KHÔNG PHÁN ĐẶC TẢ + +- **Nguồn đối chiếu** của cột *Đặc tả nói gì* là **chính tệp lệnh của cửa đó** (`.claude/commands/.md`), không phải trí nhớ, không phải doc phái sinh. +- **Đặc tả tự mâu thuẫn** ⇒ ghi nhãn `đặc-tả-xung-đột` vào cột *Nhãn*, nêu **cả hai** con trỏ `file:line`, và **trả về người điều phối quyết**. **CẤM tự phán đặc tả nào đúng.** +- Tiền lệ đúng luật này đã có: `.claude/auto-memory/feedback_edit_must_predate_review.md` — *"spec tự-mâu-thuẫn → fix-mới thắng footer-cũ **+ khai trong report**"*. + +🔸 `đặc-tả-xung-đột` ở đây là **giá trị của cột Nhãn**, dùng để trả việc về người. Nó **không phải** mã thoát — thang mã thoát 4 trạng thái thuộc W3b, chưa chốt. + +--- + +## §4 — AI ghi ở đâu, KHÔNG đẻ vai mới + +Bảng §3 do **cặp vai đang chạy sẵn** sinh ra, **không thêm vai nào**: + +| Vai | Trục | Cửa spawn | +|---|---|---| +| `lead-gap-auditor` | hàng **thiếu** (bước không có vật mốc) | `session-start` + `session-end`, **vô điều kiện** | +| `lead-stale-auditor` | hàng **lệch** (có vật mốc nhưng trỏ trạng thái cũ) | như trên | + +Cả hai đã spawn ở **cả hai đầu phiên** (`C3-06` — hình B @S149), tức khoản *kẹp hai đầu* của hub đã thoả ở vế vai kiểm. Việc W3 thêm là **khuôn trả về**, không phải cơ chế mới. + +🔸 Hai vai này **INFORM-only, propose-only**; lead là single-writer (VERIFY → APPEND). Bảng vòng hỏi ngược **không tự hạ cánh vào sổ** — nó là đề xuất. + +--- + +## §5 — TIỀN KIỂM ĐẦU CỬA (`C3-05`) + +Hub `phu-luc:194`: *tiền kiểm chi phí bằng không, chạy ở **đầu mọi cửa**, chỉ đọc, soi **cửa đã đóng gần nhất** — chọn cửa bằng **dấu thời gian ghi TRONG tệp, không tin thời gian sửa tệp của hệ điều hành**.* + +- **Máy:** `scripts/tien-kiem-cua.ps1` — chỉ đọc, **luôn exit 0**, in một dòng `TIEN-KIEM:`. Lỗi bất kỳ ⇒ in `tien-kiem loi (khong chan)` rồi đi tiếp. +- **Vì sao không tin `mtime`:** hook `wal:` chạm tệp ở biên mỗi lượt; `git checkout` viết lại `mtime` hàng loạt. `mtime` trả lời *"tệp bị chạm lúc nào"*, không trả lời *"cửa đóng lúc nào"*. Dấu thời gian **trong** tệp thì không bị hai thứ đó làm trôi. +- **Nguồn dấu thời gian trong tệp** (đọc, không ghi): `.claude/WAL.md` dòng `updated:` · `.claude/governance/.session-counter.json` khoá `last_ticked_at` + `last_ticked_session` + `last_ticked_head`. +- **Độ phủ + trần chi phí:** xem `docs/governance/adap-upgrade-pack-tracking.md` và bản ghi lượt W3. **Số cửa và số phủ KHÔNG chép ở đây** (B1) — đo lại bằng `ls -1 .claude/commands/*.md | wc -l`. + +🔴 **`C3-08` — trần chi phí cho cửa hay dùng: `KHÔNG ĐO ĐƯỢC`.** Kho này có doctrine *"đo BYTE, CẤM quy token"* (S158) nên không in được số token cho một cửa. Adopt ở dạng **hướng dẫn + nghĩa vụ khai**: ai thêm bước vào `/pause` · `/tiep` phải **đo wall-clock trước** (luật đã có sẵn: `.claude/commands/check-email.md:41`) và **khai con số đo được**. Đây là **khai báo, không phải thuốc** — đúng chữ hub `:185`: *"Không có dụng cụ đo thì khai KHÔNG ĐO ĐƯỢC, đừng in số bịa."* + +--- + +## §6 — Ngoài phạm vi văn bản này + +| Khoản | Vì sao ngoài | +|---|---| +| `C3-04` cổng chặn bằng mã lỗi | wave **W3b**, chờ owner chốt (P1). Mọi máy W3 giữ **exit 0 / INFORM** | +| khoản (v) thang mã thoát 4 trạng thái | hình dạng đổi theo phương án P1 ⇒ làm trước là làm lại (lane C §E.3) | +| khoản (vi) luật tự trị ba bậc | cần owner gật nội dung (P5); đích **NGUỒN** dự kiến `.claude/governance/ACTIVE-MARKS.md`, các nơi khác **TRỎ** về, cấm chép (chống nguồn-đôi `C3-07` ⟂ `ST-002`) | diff --git a/scripts/artifact-integrity.ps1 b/scripts/artifact-integrity.ps1 new file mode 100644 index 0000000..d441f6b --- /dev/null +++ b/scripts/artifact-integrity.ps1 @@ -0,0 +1,460 @@ +# artifact-integrity.ps1 - MAY DIEM DANH VAT CHUNG (run-folder), do NGHIA khong chi do TON TAI +# +# San thi hanh: broadcasts/inbox/ai_infra/2026-08-04-Governance-upgrade-pack-phased-phu-luc-spec-pitfall.md +# section GD-2 (san (i)-(v) + 4 bay + 6 o nghiem thu) +# Thiet ke : runs/2026-08-07-S180-adap-upgrade-pack-phased/sub-n3-lane-b-gd2.md (13 khoan B-01..B-13, 4 vi tu V-1..V-4) +# Ke hoach : runs/2026-08-07-S180-adap-upgrade-pack-phased/wave-plan-S180.md (W2) +# Khuon may : scripts/naming-scan.ps1 (W1) - giu cung ky luat: pure-ASCII, INFORM-only, luon in mau so. +# +# HOP DONG CUA MAY NAY - doc truoc khi sua: +# +# (1) INFORM-only. LUON exit 0, ke ca khi co co. Lai ma thoat = wave W3b, +# sau khi chu du an chot cau P1 (da chot PA-2). KHONG tu lai ma thoat o day. +# +# (2) VI SAO MAY NAY TON TAI - ca song, khong phai gia thuyet: +# S180 co mot vai ha canh artifact 7.049 B voi 6/10 heading con nhan treo +# sau 202K token. Chay `nhip-no-probe` len dung thu muc do => `run-chua-gom 0`, +# exit 0, SACH. Control-duong (giau *-synthesis.md => 1, tra lai => 0) xac nhan +# thuoc SONG => so 0 kia la MU THAT. +# GOC: moi vi tu dang co deu do KICH THUOC; thu hong la TI LE KHUNG/RUOT. +# Hai dai luong nay KHONG tuong quan - mot tep toan heading tang byte y het +# mot tep day noi dung. +# +# (3) 4 VI TU cua hub -> 4 vi tu cai o day: +# VANG -> V-3 (diem danh 2 nguon: ten neu trong run.md ma vang tren dia) +# RONG -> V-1 nhanh 0-byte (KHONG duoc roi vao 'khong ap dung') +# CUT -> V-2 (nhan treo neo HEADING) chinh + V-1 (ti le ruot/khung) phu +# NEN-QUA-TAY -> V-4 (so ky tu voi ban truoc CUNG DON VI, lay tu git) +# +# (4) LUON IN MAU SO canh moi con so. Phien S180 da 8 ca bay don-vi. +# Va luon in "dem CAI GI": tep / thu muc / muc / dong. +# +# (5) TAP VANG MAT != SACH (chong Goodhart). Neu thu muc goc vang, hoac mot +# luot chay khong con vat nao, may in co THIEU-TAP RIENG canh so 0. +# So 0 khong duoc phep doc thanh 'sach' khi chua co gi de dem. +# +# (6) Pure ASCII (gotcha #30). Nhan treo tieng Viet duoc dung bang MA DIEM +# (xem $TAG_*) chu khong go thang - de tep nay giu 0 byte ngoai ASCII. +# +# (7) KHONG SUA GI. May chi doc va in. Che do -BuildIndex la ngoai le duy nhat: +# no GHI DE mot tep duy nhat (.claude/workflows/runs/_index.md) va tep do +# la DERIVE-VIEW sinh tu dia - cam sua tay, cam dung lam nguon. +# +# Fault-inject: chay voi -RepoRoot de cay artifact hong / go ra. Khong dung kho that. + +[CmdletBinding()] +param( + [string]$RepoRoot, + [string]$RunId, # chi soi 1 thu muc luot chay. Vang => soi TAT CA. + [switch]$V4All, # bat V-4 cho moi tep (moi tep ton ~1-2 lenh git). Mac dinh chi bat khi co -RunId. + [switch]$BuildIndex, # sinh lai muc luc derive-view _index.md tu dia + [double]$K = 3.00 # nguong V-1. Mac dinh = phan vi 5 cua ho sub-*, do 2026-08-07, mau so 446. +) + +$ErrorActionPreference = 'Stop' + +if (-not $RepoRoot -or $RepoRoot -eq '') { $RepoRoot = Split-Path -Parent $PSScriptRoot } +$RepoRoot = (Resolve-Path -LiteralPath $RepoRoot).Path +$RunsRel = '.claude/workflows/runs' +$RunsRoot = Join-Path $RepoRoot $RunsRel + +# --------------------------------------------------------------------------- +# Nhan treo dung bang MA DIEM de giu tep pure-ASCII (luat 6). +# 0x0110 = D co gach ngang (chu HOA) -> dung trong "DANG DO" +# 0x1EDC = O co sung + huyen (chu HOA) -> dung trong "CHO" +# --------------------------------------------------------------------------- +$chDbar = [string][char]0x0110 +$chOhg = [string][char]0x1EDC +$TAG_DANGDO = $chDbar + 'ANG ' + $chDbar + 'O' +$TAG_CHO = 'CH' + $chOhg +$TAGSET = @($TAG_DANGDO, $TAG_CHO, 'TODO', 'PENDING') -join '|' + +# Neo vao HEADING la chu y trung tam cua V-2: tach DUNG (nhan dang treo) +# khoi NHAC DEN (cau van dinh nghia nhan). Dem tho cho duong-gia tren chinh +# ban da xong - do 2026-08-07: tho=1, neo-heading=0. Lop citation-trap. +$RX_PLACEHOLDER_HEAD = '^#{1,6} .*\[(' + $TAGSET + ')' +$RX_PLACEHOLDER_RAW = '\[(' + $TAGSET + ')' + +$RX_HEAD = '^#{1,6} ' +$RX_FENCE = '^\s*```' +$RX_SUBFAM = '^(sub-.+|.+-return)\.md$' # cung ho voi governance-detectors.ps1:1102 / :1771 +$RX_SYNTH = '.+-synthesis\.md$' +# Ten tep artifact duoc NHAC trong run.md. Mau ky tu CO Y khong chua '<' '>' +# => khuon minh hoa dang `sub--.md` KHONG bi bat (do 2026-08-07: 0 hit). +$RX_NAMEREF = '(sub-[A-Za-z0-9._-]+\.md|[A-Za-z0-9._-]+-synthesis\.md)' + +# --------------------------------------------------------------------------- +# So ke. Co (FLAG) va THIEU-TAP dem TACH NHAU - luat 5. +# --------------------------------------------------------------------------- +$script:Flags = @() # {Kind, Run, Name, Msg} +$script:MissingSets = @() # {Run, Msg} +$script:NFolder = 0; $script:NFile = 0; $script:NSkipV1 = 0 +$script:NV4Measured = 0; $script:NV4Unmeasurable = 0 +$script:NOutOfShape = @() +$script:NKhongKhai = 0; $script:NTroCheo = 0 +# Tap ten MOI tep .md tren toan cay runs/ - de phan giai con tro CHEO giua cac +# luot chay (xem V-3). Dung 1 lan, khong quet lai moi thu muc. +$script:AllNamesInRuns = @{} + +function Write-Head([string]$t) { Write-Host ''; Write-Host $t -ForegroundColor Cyan } +function Add-Flag([string]$Kind, [string]$Run, [string]$Name, [string]$Msg) { + $script:Flags += [pscustomobject]@{ Kind = $Kind; Run = $Run; Name = $Name; Msg = $Msg } +} +function Add-Missing([string]$Run, [string]$Msg) { + $script:MissingSets += [pscustomobject]@{ Run = $Run; Msg = $Msg } +} + +# --------------------------------------------------------------------------- +# Do 1 tep. Dinh nghia "dem CAI GI" - khai o day mot lan, dung suot: +# head = dong khop '^#{1,6} ' VA KHONG nam trong khoi ma (``` toggle). +# Khong loai khoi ma thi '# comment' trong bash bi dem la heading +# => tep nhieu ma bi danh oan. +# body = moi dong KHONG RONG con lai. Dong bang '|', dong trich '>', va dong +# trong khoi ma DEU TINH LA RUOT. (Ban nhap lane B loai '^\|' khoi tu +# so - do la sai, lane B tu sua o section 3.) +# --------------------------------------------------------------------------- +function Measure-Artifact { + param([System.IO.FileInfo]$File) + + $bytes = $File.Length + if ($bytes -eq 0) { + return [pscustomobject]@{ Bytes = 0; Head = 0; Body = 0; Ratio = -1; Ph = 0; PhRaw = 0; Chars = 0; Items = 0 } + } + $text = [System.IO.File]::ReadAllText($File.FullName, [System.Text.Encoding]::UTF8) + $lines = $text -split "`r?`n" + + $inFence = $false; $head = 0; $body = 0; $ph = 0; $phRaw = 0; $items = 0 + foreach ($ln in $lines) { + if ($ln -match $RX_FENCE) { $inFence = -not $inFence; $body++; continue } + if ($inFence) { if ($ln.Trim() -ne '') { $body++ }; continue } + if ($ln -match $RX_HEAD) { + $head++ + if ($ln -match $RX_PLACEHOLDER_HEAD) { $ph++ } + if ($ln -match $RX_PLACEHOLDER_RAW) { $phRaw++ } + continue + } + if ($ln -match $RX_PLACEHOLDER_RAW) { $phRaw++ } + if ($ln -match '^\s*[-*] ' -or $ln -match '^\s*\|') { $items++ } + if ($ln.Trim() -ne '') { $body++ } + } + $ratio = if ($head -gt 0) { [math]::Round($body / $head, 2) } else { -1 } + return [pscustomobject]@{ + Bytes = $bytes; Head = $head; Body = $body; Ratio = $ratio + Ph = $ph; PhRaw = $phRaw; Chars = $text.Length; Items = $items + } +} + +# --------------------------------------------------------------------------- +# V-4 - nen qua tay. So ky tu voi BAN TRUOC CUNG DON VI. +# KHONG dung HEAD~1: hook `wal:` chen commit vao giua => HEAD~1 thuong KHONG +# phai ban truoc CUA TEP NAY, va phep so se la 'so ban moi voi chinh no' +# (giong het mot phep do hop le). Dung git log CUA CHINH TEP. +# Khong du du lieu => KHONG DO DUOC (dung chu hub), khong doan. +# --------------------------------------------------------------------------- +function Test-Compression { + param([string]$RelPath, [int]$NowChars, [int]$NowItems, [string]$FullPath) + + $shas = & git -C $RepoRoot log --format=%H -2 -- $RelPath 2>$null + if ($LASTEXITCODE -ne 0 -or -not $shas) { + return [pscustomobject]@{ Ok = $false; Why = 'tep chua tracked / khong co lich su git' } + } + $shas = @($shas) + if ($shas.Count -lt 2) { + return [pscustomobject]@{ Ok = $false; Why = ('chi co {0} commit cham tep nay - chua co ban truoc CUNG DON VI de so' -f $shas.Count) } + } + $prev = & git -C $RepoRoot show ("{0}:{1}" -f $shas[1], $RelPath) 2>$null + if ($LASTEXITCODE -ne 0) { + return [pscustomobject]@{ Ok = $false; Why = 'khong doc duoc ban truoc tu git' } + } + $prevText = ($prev -join "`n") + $prevChars = $prevText.Length + $prevItems = @($prevText -split "`n" | Where-Object { $_ -match '^\s*[-*] ' -or $_ -match '^\s*\|' }).Count + if ($prevChars -eq 0) { + return [pscustomobject]@{ Ok = $false; Why = 'ban truoc rong - ti le vo nghia' } + } + $r = [math]::Round($NowChars / [double]$prevChars, 3) + return [pscustomobject]@{ + Ok = $true; Ratio = $r; PrevChars = $prevChars; PrevItems = $prevItems + PrevSha = $shas[1].Substring(0, 7) + } +} + +# --------------------------------------------------------------------------- +# Soi 1 thu muc luot chay. +# --------------------------------------------------------------------------- +function Scan-Run { + param([System.IO.DirectoryInfo]$Dir, [switch]$DoV4) + + $run = $Dir.Name + $script:NFolder++ + + $allMd = @(Get-ChildItem -LiteralPath $Dir.FullName -Recurse -File -Filter '*.md' -ErrorAction SilentlyContinue) + $flat = @($allMd | Where-Object { $_.Directory.FullName -eq $Dir.FullName }) + # C8 dual-accept: 5 thu muc cu giu 'sub-md/' + 'harvest/'. Khong tinh chung + # la 'ngoai cau truc' - lam the la de 5 luot chay hop le keu oan ngay ngay dau. + $c8 = @($allMd | Where-Object { + $p = $_.Directory.Name + ($p -eq 'harvest' -or $p -eq 'sub-md') -and ($_.Directory.Parent.FullName -eq $Dir.FullName) }) + $arts = @($flat + $c8) + $other = @($allMd | Where-Object { $arts -notcontains $_ }) + foreach ($o in $other) { + $rel = $o.FullName.Substring($Dir.FullName.Length + 1) -replace '\\', '/' + $script:NOutOfShape += ("{0}/{1}" -f $run, $rel) + } + + # --- THIEU-TAP (luat 5 / chieu A2 fault-inject) -------------------------- + if ($arts.Count -eq 0) { + Add-Missing $run 'thu muc luot chay KHONG CO vat .md nao - phep do khong ton tai, khong phai "sach"' + Write-Host (" [{0}] FLAG THIEU-TAP: 0 vat .md" -f $run) -ForegroundColor Red + return + } + $runMd = $arts | Where-Object { $_.Name -eq 'run.md' } | Select-Object -First 1 + if (-not $runMd) { + Add-Flag 'VANG' $run 'run.md' 'thu muc luot chay khong co run.md - mat NGUON-2 cua diem danh 2 nguon (V-3 khong do duoc o day)' + } + $synth = @($arts | Where-Object { $_.Name -match $RX_SYNTH -and $_.Length -gt 0 }) + if ($synth.Count -eq 0 -and $runMd) { + Add-Flag 'VANG' $run '*-synthesis.md' 'khong co ban gom non-empty (dual-accept flat + harvest/) - cung tieu chi voi nhip-no-probe run-chua-gom' + } + + # --- V-1 / V-2 tren tung vat --------------------------------------------- + $rows = @() + foreach ($f in $arts) { + $script:NFile++ + $m = Measure-Artifact -File $f + $isSub = ($f.Name -match $RX_SUBFAM) + + if ($m.Bytes -eq 0) { + Add-Flag 'RONG' $run $f.Name 'tep 0 byte' + $rows += [pscustomobject]@{ N = $f.Name; V = 'RONG'; D = '0 B' } + continue + } + # V-2 - nhan treo neo HEADING (vi tu chinh cho CUT) + if ($m.Ph -gt 0) { + Add-Flag 'CUT' $run $f.Name ('V-2: {0}/{1} heading con nhan treo (mau so = so heading cua chinh tep nay)' -f $m.Ph, $m.Head) + $rows += [pscustomobject]@{ N = $f.Name; V = 'CUT(V-2)'; D = ('{0}/{1} heading treo' -f $m.Ph, $m.Head) } + } + # V-1 - ti le ruot/khung (luoi PHU, chi ap ho sub-*/-return) + if ($isSub) { + if ($m.Head -eq 0) { + $script:NSkipV1++ + $rows += [pscustomobject]@{ N = $f.Name; V = 'V1-KHONG-AP-DUNG'; D = ('0 heading, {0} B - khong chia duoc, KHONG doc thanh sach' -f $m.Bytes) } + } + elseif ($m.Ratio -lt $K) { + Add-Flag 'CUT' $run $f.Name ('V-1: ruot/khung {0} < K={1} (body {2} dong / head {3} dong)' -f $m.Ratio, $K, $m.Body, $m.Head) + if ($m.Ph -eq 0) { $rows += [pscustomobject]@{ N = $f.Name; V = 'CUT(V-1)'; D = ('ti le {0} < {1}' -f $m.Ratio, $K) } } + } + } + # V-4 - nen qua tay + if ($DoV4) { + $rel = $f.FullName.Substring($RepoRoot.Length + 1) -replace '\\', '/' + $c = Test-Compression -RelPath $rel -NowChars $m.Chars -NowItems $m.Items -FullPath $f.FullName + if (-not $c.Ok) { + $script:NV4Unmeasurable++ + } else { + $script:NV4Measured++ + if ($c.Ratio -lt 0.70 -and $m.Items -lt $c.PrevItems) { + $txt = [System.IO.File]::ReadAllText($f.FullName, [System.Text.Encoding]::UTF8) + $mien = ($txt -match 'archive/' -or $txt -match 'con-tro' -or $txt -match 'moved-not-cut' -or $txt -match 'doi verbatim') + if ($mien) { + $rows += [pscustomobject]@{ N = $f.Name; V = 'NEN-MIEN'; D = ('{0}x so voi {1}, NHUNG co khai noi-di (mien tru HIEN HINH)' -f $c.Ratio, $c.PrevSha) } + } else { + Add-Flag 'NEN' $run $f.Name ('V-4: con {0}x so ky tu so voi {1} ({2} -> {3} ky tu) VA so muc giam {4} -> {5}, KHONG thay dong khai noi-di' -f $c.Ratio, $c.PrevSha, $c.PrevChars, $m.Chars, $c.PrevItems, $m.Items) + } + } + } + } + } + + # --- V-3 - diem danh HAI NGUON (dia <-> run.md ghi TRUOC launch) ------- + $v3 = 'KHONG DO DUOC' + if ($runMd) { + $runTxt = [System.IO.File]::ReadAllText($runMd.FullName, [System.Text.Encoding]::UTF8) + $named = @([regex]::Matches($runTxt, $RX_NAMEREF) | ForEach-Object { $_.Value } | Sort-Object -Unique) + $onDisk = @($arts | ForEach-Object { $_.Name } | Sort-Object -Unique) + if ($named.Count -eq 0) { + $v3 = 'KHONG DO DUOC' + Add-Missing $run 'V-3: run.md KHONG neu ten tep artifact nao => NGUON-2 rong. Day KHONG phai "chenh 0".' + } else { + $missOnDisk = @($named | Where-Object { $onDisk -notcontains $_ }) + $notDeclared= @($onDisk | Where-Object { $named -notcontains $_ -and $_ -ne 'run.md' }) + # Ten khong co trong thu muc NAY co the la con tro CHEO sang luot chay + # TRUOC - runs/README.md:39 (C2 buoc 3) BAT run.md tro 'input spec:' sang + # synthesis cua luot truoc. Tep co that, nam thu muc khac. So trong MOT thu + # muc roi keu 'vang' la loi cua MAY, khong phai no cua kho. + $crossRef = @(); $reallyMissing = @() + foreach ($x in $missOnDisk) { + if ($script:AllNamesInRuns.ContainsKey($x)) { $crossRef += $x } else { $reallyMissing += $x } + } + $v3 = ('nguon-2 neu {0} ten | thieu-tren-dia {1} | tro-cheo {2} | khong-khai {3}' -f $named.Count, $reallyMissing.Count, $crossRef.Count, $notDeclared.Count) + foreach ($x in $reallyMissing) { Add-Flag 'VANG' $run $x 'V-3: run.md co neu ten nay, va KHONG TIM THAY o bat ky luot chay nao' } + # KHONG-KHAI: dem RIENG, KHONG phai co. Chua he co luat nao bat run.md + # neu ten tep => 245/720 co cho mot luat khong ton tai = duong-gia ngay dau. + # Nhung con SO thi giu, vi no chung minh NGUON-2 mong den muc nao. + $script:NKhongKhai += $notDeclared.Count + $script:NTroCheo += $crossRef.Count + } + } + + # --- in per-run ---------------------------------------------------------- + $bad = @($rows).Count + $color = if ($bad -gt 0) { 'Yellow' } else { 'DarkGray' } + Write-Host (" [{0}]" -f $run) -ForegroundColor $color + Write-Host (" mau so: {0} vat .md (phang {1} + C8 harvest|sub-md {2}) | V-3: {3}" -f $arts.Count, $flat.Count, $c8.Count, $v3) + foreach ($r in $rows) { + $c = if ($r.V -like 'CUT*' -or $r.V -eq 'RONG') { 'Red' } else { 'DarkGray' } + Write-Host (" [{0,-16}] {1} <- {2}" -f $r.V, $r.N, $r.D) -ForegroundColor $c + } +} + +# --------------------------------------------------------------------------- +# -BuildIndex : sinh muc luc DERIVE-VIEW tu dia. +# Vi sao derive-view chu khong phai so chep tay: so chep tay se thanh NGUON-DOI +# ngay khi ai do quen mot dong - va do dung cach `_ledger.md` da chet (15 dong, +# toan 2026-06-18, trong khi dia da di toi 2026-08-07). +# --------------------------------------------------------------------------- +function Build-Index { + if (-not (Test-Path -LiteralPath $RunsRoot)) { + Write-Host ' FLAG THIEU-TAP: khong co thu muc runs/ - khong sinh duoc muc luc.' -ForegroundColor Red + return + } + $dirs = @(Get-ChildItem -LiteralPath $RunsRoot -Directory | Sort-Object Name) + $sb = New-Object System.Text.StringBuilder + + $null = $sb.AppendLine('# `runs/_index.md` - MUC LUC SONG (DERIVE-VIEW, sinh tu dia)') + $null = $sb.AppendLine('') + $null = $sb.AppendLine('> **CAM SUA TAY. CAM DUNG LAM NGUON.** Tep nay duoc SINH LAI tron ven bang') + $null = $sb.AppendLine('> `powershell -File scripts/artifact-integrity.ps1 -BuildIndex`. Moi dong deu doc thang tu dia.') + $null = $sb.AppendLine('> Sua tay o day = de ra nguon-doi, dung benh da giet `_ledger.md` (so chep tay, RETIRED H18-B S100:') + $null = $sb.AppendLine('> 15 dong, toan 2026-06-18, trong khi dia da di toi hom nay).') + $null = $sb.AppendLine('>') + $null = $sb.AppendLine('> **Tang-A (goi theo loai) = `README.md` canh ben** - chuc nang, ai ghi, ai doc, bo tep chuan.') + $null = $sb.AppendLine('> **Tang-B (muc luc song) = tep nay.** Hai tang, khong tang nao chep tang kia.') + $null = $sb.AppendLine('>') + $null = $sb.AppendLine('> [!] **Tep nay KHONG duoc dung lam nguon-2 cua diem danh 2 nguon** - no doc thang dia,') + $null = $sb.AppendLine('> tuc no CHINH LA nguon-1. Nguon-2 la anh chup taskList trong tung `run.md` (ghi TRUOC launch).') + $null = $sb.AppendLine('') + $null = $sb.AppendLine(('- **Sinh luc:** {0}' -f (Get-Date -Format 'yyyy-MM-dd HH:mm'))) + $null = $sb.AppendLine(('- **Mau so:** {0} thu muc luot chay (dem THU MUC, khong dem entry - `ls` con thay ca tep README/_ledger/_index)' -f $dirs.Count)) + $null = $sb.AppendLine('') + $null = $sb.AppendLine('| luot chay | run.md | vat .md | ban gom | co V-2 (nhan treo) | byte |') + $null = $sb.AppendLine('|---|---|---|---|---|---|') + + foreach ($d in $dirs) { + $md = @(Get-ChildItem -LiteralPath $d.FullName -Recurse -File -Filter '*.md' -ErrorAction SilentlyContinue) + $hasRun = if ($md | Where-Object { $_.Name -eq 'run.md' -and $_.Directory.FullName -eq $d.FullName }) { 'co' } else { '**VANG**' } + $syn = @($md | Where-Object { $_.Name -match $RX_SYNTH -and $_.Length -gt 0 }) + $hasSyn = if ($syn.Count -gt 0) { 'co' } else { '**VANG**' } + $ph = 0 + foreach ($f in $md) { + if ($f.Length -eq 0) { continue } + $t = [System.IO.File]::ReadAllText($f.FullName, [System.Text.Encoding]::UTF8) + foreach ($ln in ($t -split "`r?`n")) { if ($ln -match $RX_PLACEHOLDER_HEAD) { $ph++ } } + } + $phTxt = if ($ph -gt 0) { ('**{0}**' -f $ph) } else { '0' } + $bytes = ($md | Measure-Object -Property Length -Sum).Sum + $null = $sb.AppendLine(('| `{0}` | {1} | {2} | {3} | {4} | {5} |' -f $d.Name, $hasRun, $md.Count, $hasSyn, $phTxt, $bytes)) + } + + $out = Join-Path $RunsRoot '_index.md' + [System.IO.File]::WriteAllText($out, $sb.ToString(), (New-Object System.Text.UTF8Encoding($false))) + Write-Host (" Da sinh: {0}/_index.md ({1} thu muc luot chay)" -f $RunsRel, $dirs.Count) -ForegroundColor Green +} + +# =========================================================================== +# MAIN +# =========================================================================== +Write-Host '=== artifact-integrity.ps1 - MAY DIEM DANH VAT CHUNG ===' -ForegroundColor White +Write-Host ("RepoRoot : {0}" -f $RepoRoot) +Write-Host "Che do : INFORM-only. LUON exit 0 ke ca khi co co (lai ma thoat = W3b, sau P1=PA-2)." +Write-Host "Vi tu : V-1 ti le ruot/khung | V-2 nhan treo neo HEADING | V-3 diem danh 2 nguon | V-4 nen qua tay" +Write-Host ("Nguong : K={0} (V-1) = phan vi 5 cua ho sub-*, do 2026-08-07, mau so 446 tep co heading." -f $K) +Write-Host " Tai K nay, 20/446 tep lich su (4,5%) cung nam duoi nguong => co KHONG doc thanh 'hong'." + +if ($BuildIndex) { + Write-Head '--- SINH MUC LUC DERIVE-VIEW ---' + Build-Index + Write-Host '' + Write-Host ' Ma thoat: 0 (INFORM-only theo hop dong muc 1).' + exit 0 +} + +if (-not (Test-Path -LiteralPath $RunsRoot)) { + Write-Head '--- DIEM DANH ---' + Write-Host (" FLAG THIEU-TAP: khong tim thay '{0}'." -f $RunsRel) -ForegroundColor Red + Write-Host " Day KHONG phai [skip]. Tap vang mat => phep do KHONG TON TAI, va so co 0 ben duoi VO NGHIA." -ForegroundColor Red + Add-Missing '(goc)' 'thu muc runs/ vang mat' + $dirs = @() +} elseif ($RunId) { + $one = Join-Path $RunsRoot $RunId + if (-not (Test-Path -LiteralPath $one)) { + Write-Head '--- DIEM DANH ---' + Write-Host (" FLAG THIEU-TAP: khong co luot chay '{0}'." -f $RunId) -ForegroundColor Red + Add-Missing $RunId 'thu muc luot chay duoc chi dinh nhung khong ton tai' + $dirs = @() + } else { $dirs = @(Get-Item -LiteralPath $one) } +} else { + $dirs = @(Get-ChildItem -LiteralPath $RunsRoot -Directory | Sort-Object Name) +} + +if (Test-Path -LiteralPath $RunsRoot) { + foreach ($f in (Get-ChildItem -LiteralPath $RunsRoot -Recurse -File -Filter '*.md' -ErrorAction SilentlyContinue)) { + $script:AllNamesInRuns[$f.Name] = $true + } +} + +$doV4 = ($RunId -and -not $V4All) -or $V4All +Write-Head ("--- DIEM DANH: {0} thu muc luot chay ---" -f $dirs.Count) +if (-not $doV4) { + Write-Host " V-4 (nen qua tay): KHONG DO DUOC o che do quet-toan-bo - moi tep ton 1-2 lenh git." -ForegroundColor DarkGray + Write-Host " Bat bang -RunId (1 luot chay) hoac -V4All (chap nhan cham). KHONG phai 'da do va sach'." -ForegroundColor DarkGray +} +foreach ($d in $dirs) { Scan-Run -Dir $d -DoV4:$doV4 } + +# --------------------------------------------------------------------------- +Write-Head '=== TONG ===' +Write-Host (" mau so : {0} thu muc luot chay | {1} vat .md da do" -f $script:NFolder, $script:NFile) + +$byKind = $script:Flags | Group-Object Kind | Sort-Object Name +if ($script:Flags.Count -eq 0) { + Write-Host (" CO : 0/{0} vat" -f $script:NFile) -ForegroundColor Green + Write-Host " [!] 0 co CHI co nghia khi mau so tren khac 0 VA so THIEU-TAP ben duoi = 0." -ForegroundColor Yellow +} else { + Write-Host (" CO : {0} (tren {1} vat)" -f $script:Flags.Count, $script:NFile) -ForegroundColor Red + foreach ($g in $byKind) { Write-Host (" {0,-11} : {1}" -f $g.Name, $g.Count) -ForegroundColor Red } +} + +# THIEU-TAP in RIENG, canh so co - de so 0 mat quyen doc thanh 'sach' (luat 5). +if ($script:MissingSets.Count -gt 0) { + Write-Host (" THIEU-TAP : {0} <- dem TACH khoi so co tren. Moi tap vang lam mot phep do BIEN MAT." -f $script:MissingSets.Count) -ForegroundColor Red + foreach ($m in $script:MissingSets) { Write-Host (" - [{0}] {1}" -f $m.Run, $m.Msg) -ForegroundColor Red } +} else { + Write-Host " THIEU-TAP : 0" +} + +Write-Host (" V-1 khong ap dung : {0}/{1} vat (0 heading => khong chia duoc; KHONG phai 'sach')" -f $script:NSkipV1, $script:NFile) +# Hai hang muc DEM RIENG, KHONG phai co - va KHONG duoc giau di. Giau con so nay +# la giau chinh bang chung "nguon-2 mong". +Write-Host (" KHONG-KHAI : {0}/{1} vat co tren dia ma run.md khong neu ten." -f $script:NKhongKhai, $script:NFile) +Write-Host " DEM RIENG, KHONG phai co: chua he co luat bat run.md neu ten tep." +Write-Host " Day la thuoc do do MONG cua NGUON-2, khong phai danh sach vi pham." +Write-Host (" TRO-CHEO : {0}/{1} ten run.md neu ma nam o luot chay KHAC" -f $script:NTroCheo, $script:NFile) +Write-Host " (runs/README.md:39 C2 buoc 3 BAT tro 'input spec:' sang luot truoc) - HOP LE." +if ($doV4) { + Write-Host (" V-4 do duoc : {0} vat | KHONG DO DUOC {1} vat (chua tracked hoac chi 1 commit cham tep)" -f $script:NV4Measured, $script:NV4Unmeasurable) +} +if ($script:NOutOfShape.Count -gt 0) { + Write-Host (" NGOAI CAU TRUC PHANG : {0} tep (C1 doi phang; C8 mien 'harvest/'+'sub-md/'). In ten, KHONG im lang:" -f $script:NOutOfShape.Count) -ForegroundColor Yellow + foreach ($x in $script:NOutOfShape) { Write-Host (" - {0}" -f $x) -ForegroundColor Yellow } +} + +if ($script:Flags.Count -gt 0) { + Write-Host '' + Write-Host ' Danh sach CO (tung ten - cam nen thanh so tong):' -ForegroundColor Red + foreach ($x in $script:Flags) { Write-Host (" - [{0,-11}] {1}/{2} <- {3}" -f $x.Kind, $x.Run, $x.Name, $x.Msg) } +} + +Write-Host '' +Write-Host ' Ma thoat: 0 (INFORM-only theo hop dong muc 1). Co o tren KHONG lai ma thoat.' +Write-Host ' Lai ma thoat thuoc wave W3b, sau khi chu du an chot phan loai co theo PA-2.' +exit 0 diff --git a/scripts/memory-selfimprove-audit.ps1 b/scripts/memory-selfimprove-audit.ps1 index b025c71..f85289c 100644 --- a/scripts/memory-selfimprove-audit.ps1 +++ b/scripts/memory-selfimprove-audit.ps1 @@ -295,10 +295,19 @@ else { } else { $latest = $runDirs[0] - $subMd = @(Get-ChildItem -Path $latest.FullName -Filter 'sub-*.md' -File -ErrorAction SilentlyContinue) + # @S180 W1 FIX (naming-standard.md section 4): the filter used to be the literal glob + # 'sub-*.md', so every '-return.md' was INVISIBLE here - including the three trio + # returns (harness-eval / harness-refine / harness-audit), i.e. the most expensive lanes. + # governance-detectors.ps1:1101-1102 already fixed exactly this at S159 and measured it on + # the S159 bookend: 9 spawns ran, the glob saw 6. That fix was never mirrored into THIS + # file even though both scan the same directory - a diagnosed, named, patched bug still + # alive one file over. Regex below is a byte-for-byte mirror of the detectors one; if you + # change one, change both (naming-standard.md section 12 lists all 3 sites). + $subMd = @(Get-ChildItem -Path $latest.FullName -File -ErrorAction SilentlyContinue | + Where-Object { $_.Name -match '^(sub-.+|.+-return)\.md$' }) $synth = @(Get-ChildItem -Path $latest.FullName -Filter '*-synthesis.md' -File -ErrorAction SilentlyContinue) if ($subMd.Count -eq 0) { - Write-Na 'eval:hcv' 'HCV' ("latest run {0} has no sub-*.md (return-delta-only mode) - proxy N/A" -f $latest.Name) + Write-Na 'eval:hcv' 'HCV' ("latest run {0} has no sub-*.md / *-return.md (return-delta-only mode) - proxy N/A" -f $latest.Name) } elseif ($synth.Count -gt 0) { Write-Pass 'eval:hcv' 'HCV' ("latest run {0}: {1} sub-md + {2} synthesis present (harvest-complete proxy; ratio = calibration-interim)" -f $latest.Name, $subMd.Count, $synth.Count) diff --git a/scripts/naming-scan.ps1 b/scripts/naming-scan.ps1 new file mode 100644 index 0000000..5f00171 --- /dev/null +++ b/scripts/naming-scan.ps1 @@ -0,0 +1,297 @@ +# naming-scan.ps1 - MAY SOI TEN, tang BO MAY (SOLUTION_ERP) +# +# Chuan thi hanh: docs/governance/naming-standard.md (ky S180 / 2026-08-07, wave W1). +# Kiem ke may doc ten: runs/2026-08-07-S180-adap-upgrade-pack-phased/sub-w1a-mayd-octen.md +# +# HOP DONG CUA MAY NAY - doc truoc khi sua: +# +# (1) INFORM-only. LUON exit 0, ke ca khi co co. Lai ma thoat = wave W3b, +# sau khi chu du an chot cau P1 (da chot PA-2). Ly do do duoc (lane F): +# bat gate ma chua soak => 8-12 lop no ton keu cung luc, nguoi tuong may +# hong roi tat may. +# +# (2) Quet 231 TEN VAT-BO-MAY, KHONG quet 1.545 tep .md. +# Ly do: 5 vung dong bang = 1.131/1.545 = 73,2% kho, va 225/248 cho lech +# (90,7%) nam TRONG vung mien tru => may quet .md se in "0 hit" ngay dau +# va so 0 do VO NGHIA (bay-4 cua san GD-1). +# Tap 231 co 0 mien tru vung, va 23 vat lech that van nam nguyen trong do. +# +# (3) LUON IN MAU SO canh moi con so. Phien S180 da 7 ca bay don-vi. +# +# (4) CAM 3 LOI CAM (R6 - lane a dat ten, ca 3 deu co that trong kho nay): +# (a) liet-khong-co : governance-detectors.ps1:1109 do ten la roi chi liet +# (b) -or nuot nhanh : governance-detectors.ps1:1660 chap ca _end lan closed.md +# (c) [skip] im lang : governance-detectors.ps1:1622 / :1882 / mfe-eval.ps1:265 +# => O DAY: moi ten nhan DUNG MOT phan quyet va LUON duoc in ten khi khac OK. +# Tap vang mat = FLAG "THIEU-TAP", KHONG PHAI skip. +# +# (5) Pure ASCII (gotcha #30) - do 3 script .ps1 nen: 0/0/0 byte ngoai ASCII, +# control-duong tren 1 tep .md tieng Viet = 58. Giu nguyen ky luat nay. +# +# Fault-inject: chay voi -RepoRoot de cay ten lech / go ra, khong dung kho that. + +[CmdletBinding()] +param( + [string]$RepoRoot +) + +$ErrorActionPreference = 'Stop' + +if (-not $RepoRoot -or $RepoRoot -eq '') { + $RepoRoot = Split-Path -Parent $PSScriptRoot +} +$RepoRoot = (Resolve-Path -LiteralPath $RepoRoot).Path + +# ---------- hinh dang ---------- +$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_SESSDIR = '^session-[0-9]+$' + +# ---------- so ke ---------- +$script:Total = 0 +$script:Ok = 0 +$script:Lech = 0 +$script:OneOff = 0 +$script:Mien = 0 +$script:Pep8 = 0 +$script:MissingSets = 0 +$script:LechList = @() + +function Write-Head([string]$t) { Write-Host ''; Write-Host $t -ForegroundColor Cyan } + +function Add-Verdict { + param([string]$Group, [string]$Name, [string]$Verdict, [string]$Note) + $script:Total++ + switch ($Verdict) { + 'OK' { $script:Ok++ } + 'PEP8' { $script:Ok++; $script:Pep8++ } + 'MOT-LAN' { $script:Ok++; $script:OneOff++ } + 'MIEN' { $script:Mien++ } + 'LECH' { + $script:Lech++ + $script:LechList += [pscustomobject]@{ Group = $Group; Name = $Name; Note = $Note } + } + } +} + +# Quet 1 tap. Tap vang mat => FLAG, KHONG skip im lang (luat 4c). +function Scan-Set { + param( + [string]$Label, + [string]$RelPath, + # 'Item' = ca tep LAN thu muc. Bat buoc cho scripts/ va docs/governance/ vi + # tap 231 dem theo don vi "muc" o hai nhom do (bay don-vi: tep != muc). + [ValidateSet('File', 'Dir', 'Item')][string]$Kind, + [int]$Expect, + [scriptblock]$Rule, + [string]$Filter = '*', + [switch]$Recurse + ) + + $full = Join-Path $RepoRoot $RelPath + Write-Head ("--- NHOM: {0} [{1}]" -f $Label, $RelPath) + + if (-not (Test-Path -LiteralPath $full)) { + $script:MissingSets++ + Write-Host (" FLAG THIEU-TAP: khong tim thay '{0}'." -f $RelPath) -ForegroundColor Red + Write-Host (" Day KHONG phai [skip]. Tap vang mat => phep do khong ton tai, mau so = 0/{0} ky vong." -f $Expect) -ForegroundColor Red + Write-Host " Nguyen nhan thuong gap: thu muc vua bi doi ten => moi may neo vao no cung mu theo." + return + } + + $items = switch ($Kind) { + 'File' { @(Get-ChildItem -LiteralPath $full -File -Filter $Filter -Recurse:$Recurse -ErrorAction SilentlyContinue) } + 'Dir' { @(Get-ChildItem -LiteralPath $full -Directory -Recurse:$Recurse -ErrorAction SilentlyContinue) } + 'Item' { @(Get-ChildItem -LiteralPath $full -Recurse:$Recurse -ErrorAction SilentlyContinue) } + } + + $unit = switch ($Kind) { 'File' { 'tep' } 'Dir' { 'thu muc' } 'Item' { 'muc (tep + thu muc)' } } + $n = $items.Count + $lo = 0; $lk = 0; $lm = 0; $l1 = 0; $lp = 0 + $rows = @() + + foreach ($it in $items) { + $v = & $Rule $it + $verdict = $v[0]; $note = $v[1] + Add-Verdict -Group $Label -Name $it.Name -Verdict $verdict -Note $note + switch ($verdict) { + 'OK' { $lo++ } + 'PEP8' { $lo++; $lp++ } + 'MOT-LAN' { $lo++; $l1++ } + 'MIEN' { $lm++ } + 'LECH' { $lk++ } + } + if ($verdict -ne 'OK') { $rows += [pscustomobject]@{ V = $verdict; N = $it.Name; Note = $note } } + } + + Write-Host (" mau so: {0} {1}" -f $n, $unit) -NoNewline + if ($n -ne $Expect) { + Write-Host (" [!] lech ky vong {0} - chuan hoac kho da doi, doc lai naming-standard.md" -f $Expect) -ForegroundColor Yellow + } else { Write-Host '' } + + Write-Host (" OK {0}/{1} | LECH {2}/{1} | MIEN-theo-luat {3}/{1}" -f $lo, $n, $lk, $lm) + if ($lp -gt 0) { Write-Host (" trong OK: {0}/{1} theo PEP-8 (*.py snake_case - DUNG, khong phai troi)" -f $lp, $n) } + if ($l1 -gt 0) { Write-Host (" trong OK: {0}/{1} MOT-LAN (tien to s-/plan- = kich ban mot lan, HOP LE)" -f $l1, $n) } + + foreach ($r in $rows) { + $c = if ($r.V -eq 'LECH') { 'Red' } else { 'DarkGray' } + Write-Host (" [{0,-7}] {1} <- {2}" -f $r.V, $r.N, $r.Note) -ForegroundColor $c + } +} + +Write-Host '=== naming-scan.ps1 - MAY SOI TEN (tang bo may) ===' -ForegroundColor White +Write-Host ("RepoRoot : {0}" -f $RepoRoot) +Write-Host "Che do : INFORM-only. LUON exit 0 ke ca khi co co (lai ma thoat = W3b, sau P1=PA-2)." +Write-Host "Chuan : docs/governance/naming-standard.md" +Write-Host "Tap do : 231 ten vat-bo-may, 0 mien tru VUNG (khong quet 1.545 tep .md - bay-4)." + +# 1/7 - vai +Scan-Set -Label 'vai' -RelPath '.claude/agents' -Kind File -Expect 27 -Filter '*.md' -Rule { + param($f) + if ($f.Name -eq 'README.md') { return @('MIEN', 'quy uoc pho quat (luat L4)') } + if ($f.BaseName -cmatch $RX_KEBAB) { return @('OK', '') } + return @('LECH', 'ten vai phai kebab thuan; xem naming-standard.md section 1') +} + +# 2/7 - thu muc nhat ky vai +Scan-Set -Label 'nhat-ky-vai' -RelPath '.claude/agent-memory' -Kind Dir -Expect 26 -Rule { + param($d) + if ($d.Name -cmatch $RX_KEBAB) { return @('OK', '') } + return @('LECH', 'thu muc nhat ky phai trung ten vai (kebab thuan)') +} + +# 3/7 - lenh +Scan-Set -Label 'lenh' -RelPath '.claude/commands' -Kind File -Expect 19 -Rule { + param($f) + if ($f.Name -eq 'README.md') { return @('MIEN', 'quy uoc pho quat (luat L4)') } + if ($f.BaseName -cmatch $RX_KEBAB) { return @('OK', '') } + return @('LECH', 'ten lenh phai kebab; xem naming-standard.md section 7') +} + +# 4/7 - kich ban (2 quy uoc ngon ngu, luat L4). Don vi = MUC (co ca thu muc con). +Scan-Set -Label 'kich-ban' -RelPath 'scripts' -Kind Item -Expect 55 -Rule { + param($f) + if ($f.Name -eq 'README.md') { return @('MIEN', 'quy uoc pho quat (luat L4)') } + if ($f.Name -eq '__pycache__') { return @('MIEN', 'vat sinh tu dong (luat L4)') } + if ($f.Extension -eq '.py') { + if ($f.BaseName -cmatch $RX_SNAKE) { return @('PEP8', 'PEP-8: *.py snake_case la DUNG') } + return @('LECH', '*.py phai snake_case theo PEP-8') + } + if ($f.BaseName -cnotmatch $RX_KEBAB) { + return @('LECH', 'kich ban khong-phai-.py phai kebab; xem naming-standard.md section 8') + } + if ($f.BaseName -cmatch $RX_ONEOFF) { + return @('MOT-LAN', 'kich ban mot lan thuoc phien/ke hoach - HOP LE, dem rieng') + } + return @('OK', '') +} + +# 5/7 - tep moc phien. BUOC -Recurse: tep nam trong session-/, khong nam o goc. +Scan-Set -Label 'moc-phien' -RelPath '.claude/sessions' -Kind File -Expect 90 -Recurse -Rule { + param($f) + if ($f.Name -cmatch $RX_SESSFAM) { return @('OK', '') } + if ($f.Name -cmatch '^pause-') { + return @('LECH', 'FORK ho cu: _pause-* la ho chuan. session_ctx.py:349-358 THA (doc ca 2 glob) => fork song mai neu khong ai goi ten') + } + if ($f.Name -eq 'closed.md') { + return @('LECH', 'FORK dau-dong-phien: _end la ho chuan. detectors:1660 THA bang -or => doi sang ten thu BA thi phien da dong bi doc la DANG MO, co khong bao gio ban') + } + return @('LECH', 'tep moc phien moi BUOC BAT DAU bang _ ; xem naming-standard.md section 5') +} + +# 6/7 - so. Don vi = MUC (co ca thu muc con adap-reports/ adap-requests/). +Scan-Set -Label 'so-governance' -RelPath 'docs/governance' -Kind Item -Expect 16 -Rule { + param($f) + if ($f.Name -eq 'README.md') { return @('MIEN', 'quy uoc pho quat (luat L4)') } + if ($f.BaseName -cmatch $RX_KEBAB) { return @('OK', '') } + return @('LECH', 'VAT LICH SU (thu da gui, mang ngay) - GIU NGUYEN theo luat L1, nhung phai duoc LIET TEN: no la chung nhan nhom nay co 2 ho') +} + +# 7/7 - hook +Scan-Set -Label 'hook' -RelPath '.claude/hooks' -Kind File -Expect 1 -Rule { + param($f) + if ($f.BaseName -cmatch $RX_KEBAB) { return @('OK', '') } + return @('LECH', 'hook phai kebab') +} + +# ---------- bat bien 2 chieu ---------- +Write-Head '--- BAT BIEN: .claude/agents/.md == .claude/agent-memory// ---' +$agDir = Join-Path $RepoRoot '.claude/agents' +$mmDir = Join-Path $RepoRoot '.claude/agent-memory' +if ((Test-Path -LiteralPath $agDir) -and (Test-Path -LiteralPath $mmDir)) { + $roles = @(Get-ChildItem -LiteralPath $agDir -File -Filter '*.md' | + Where-Object { $_.Name -ne 'README.md' } | ForEach-Object { $_.BaseName }) + $dirs = @(Get-ChildItem -LiteralPath $mmDir -Directory | ForEach-Object { $_.Name }) + $noDiary = @($roles | Where-Object { $dirs -notcontains $_ }) + $noPersona = @($dirs | Where-Object { $roles -notcontains $_ }) + Write-Host (" mau so: {0} vai (tep persona, tru README) / {1} thu muc nhat ky" -f $roles.Count, $dirs.Count) + Write-Host (" khop : {0}/{1}" -f ($roles.Count - $noDiary.Count), $roles.Count) + if ($noDiary.Count -eq 0) { Write-Host ' vai THIEU thu muc nhat ky : (danh sach rong)' } + else { + $script:Lech += $noDiary.Count + foreach ($r in $noDiary) { + Write-Host (" FLAG vai THIEU nhat ky: {0} <- mfe-eval.ps1:264-267 se in 'N/A (no persistent diary)' va LOAI vai khoi phep do" -f $r) -ForegroundColor Red + $script:LechList += [pscustomobject]@{ Group = 'bat-bien'; Name = $r; Note = 'thieu thu muc nhat ky' } + } + } + if ($noPersona.Count -eq 0) { Write-Host ' nhat ky THUA (khong co persona): (danh sach rong)' } + else { + $script:Lech += $noPersona.Count + foreach ($r in $noPersona) { + Write-Host (" FLAG nhat ky THUA: {0} <- detectors:1109 se xep vao `$unmapped (LIET, KHONG CO)" -f $r) -ForegroundColor Red + $script:LechList += [pscustomobject]@{ Group = 'bat-bien'; Name = $r; Note = 'thua thu muc nhat ky' } + } + } +} else { + $script:MissingSets++ + Write-Host ' FLAG THIEU-TAP: thieu .claude/agents hoac .claude/agent-memory => bat bien KHONG DO DUOC.' -ForegroundColor Red +} + +# ---------- khai tuong minh cai NGOAI tap ---------- +Write-Head '--- NGOAI TAP 231 (khai tuong minh - KHONG phai [skip]) ---' +$sessRoot = Join-Path $RepoRoot '.claude/sessions' +if (Test-Path -LiteralPath $sessRoot) { + $sd = @(Get-ChildItem -LiteralPath $sessRoot -Directory) + $sdOk = @($sd | Where-Object { $_.Name -cmatch $RX_SESSDIR }) + Write-Host (" thu muc phien: {0}/{1} dat hinh dang ^session-$" -f $sdOk.Count, $sd.Count) + Write-Host " CO CHU DICH nam ngoai tap 231: giu mau so 231 da thoa thuan, va nhom nay DA co may ep" + Write-Host " (governance-detectors.ps1:1639 + session_ctx.py:133 + 2 ban session-scaffold)." + $bad = @($sd | Where-Object { $_.Name -cnotmatch $RX_SESSDIR }) + foreach ($b in $bad) { Write-Host (" [LECH-ngoai-tap] {0}" -f $b.Name) -ForegroundColor Yellow } +} else { + Write-Host ' FLAG: .claude/sessions vang mat.' -ForegroundColor Red +} + +# ---------- tong ---------- +Write-Head '=== TONG ===' +Write-Host (" mau so TONG : {0} ten vat-bo-may" -f $script:Total) +Write-Host " goc 231 (do 2026-08-07 TRUOC wave W1) = 27 vai + 26 nhat ky + 19 lenh + 53 kich ban" +Write-Host " + 90 moc phien + 15 so + 1 hook" +Write-Host " +2 vat chinh W1 de ra: scripts/naming-scan.ps1 va docs/governance/naming-standard.md" +Write-Host " => 233 sau W1. Khai ro de khong ai doc 233 thanh 'kho phinh ra' (bay-6: so do giua chung)." +Write-Host (" OK : {0}/{1}" -f $script:Ok, $script:Total) +Write-Host (" trong do PEP-8 : {0}/{1} (*.py snake - DUNG theo luat ngon ngu, khong phai troi)" -f $script:Pep8, $script:Total) +Write-Host (" trong do MOT-LAN : {0}/{1} (kich ban mot lan - HOP LE, tin hieu ton kho chu khong phai vi pham)" -f $script:OneOff, $script:Total) +Write-Host (" MIEN theo luat L4 : {0}/{1} (in ten o tung nhom - mien tru im lang va loi im lang trong giong het nhau)" -f $script:Mien, $script:Total) +if ($script:Lech -gt 0) { + Write-Host (" LECH : {0}/{1}" -f $script:Lech, $script:Total) -ForegroundColor Red +} else { + Write-Host (" LECH : 0/{0}" -f $script:Total) -ForegroundColor Green + Write-Host " [!] 0 hit chi co nghia neu mau so tren KHAC 0 va tap do KHONG mien tru vung." -ForegroundColor Yellow +} +if ($script:MissingSets -gt 0) { + Write-Host (" TAP VANG MAT : {0} <- moi tap vang lam phep do BIEN MAT, khong phai 'sach'" -f $script:MissingSets) -ForegroundColor Red +} + +if ($script:LechList.Count -gt 0) { + Write-Host '' + Write-Host ' Danh sach LECH (tung ten - cam nen thanh khoang):' -ForegroundColor Red + foreach ($x in $script:LechList) { Write-Host (" - [{0}] {1}" -f $x.Group, $x.Name) } +} + +Write-Host '' +Write-Host ' Ma thoat: 0 (INFORM-only theo hop dong muc 1). Co o tren KHONG lai ma thoat.' +Write-Host ' Lai ma thoat thuoc wave W3b, sau khi chu du an chot phan loai co theo PA-2.' +exit 0 diff --git a/scripts/tien-kiem-cua.ps1 b/scripts/tien-kiem-cua.ps1 new file mode 100644 index 0000000..a2957c2 --- /dev/null +++ b/scripts/tien-kiem-cua.ps1 @@ -0,0 +1,122 @@ +# tien-kiem-cua.ps1 - GD-3 khoan (iv): tien kiem chi phi ~0 o DAU MOI CUA. +# +# Chi DOC. KHONG ghi. LUON exit 0 - day la lop INFORM, KHONG phai cong chan. +# Cong chan bang ma loi = W3b (khoan C3-04 + thang 4 trang thai), dang cho owner (P1). +# Ai sua file nay de tra ma != 0 la da doi lop, phai qua W3b truoc. +# +# Vi sao KHONG tin mtime cua he dieu hanh: +# hook 'wal:' cham tep o bien moi luot, va 'git checkout' viet lai mtime hang loat. +# mtime tra loi "tep bi cham luc nao", KHONG tra loi "cua dong luc nao". +# => chon cua bang DAU THOI GIAN GHI TRONG TEP (hub: phu-luc GD-3 khoan (iv)). +# +# Guard vang tep = VI TU MAY (khoan (vii)): Test-Path roi bo qua VA KHAI. +# CAM dung menh de "cai do chua lam" - menh de do sai ngay giay tep kia ha canh. +# +# A2 (mat ca tap): het nguon => in co THIEU-TAP RIENG, KHONG in "ok". +# So 0 khong duoc phep doc thanh "sach". +# +# Dung: powershell -NoProfile -ExecutionPolicy Bypass -File scripts/tien-kiem-cua.ps1 +# -Cua adap-apply (ten cua dang mo - chi de in kem, khong doi hanh vi) +# -RepoRoot (fault-inject tren cay tam) + +param( + [string]$Cua = '', + [string]$RepoRoot = '' +) + +$ErrorActionPreference = 'Stop' + +function Get-RepoRoot { + param([string]$Explicit) + if ($Explicit -and $Explicit.Trim().Length -gt 0) { return $Explicit } + return (Resolve-Path (Join-Path $PSScriptRoot '..')).Path +} + +# Rut dau thoi gian GHI TRONG TEP cua WAL (cua dung: /pause, /snapshot, hook wal:). +# Khuon: "updated: YYYY-MM-DD | session: S ..." +function Read-WalStamp { + param([string]$Root) + $p = Join-Path $Root '.claude/WAL.md' + if (-not (Test-Path -LiteralPath $p)) { return $null } + # chi doc 10 dong dau - re, va moc luon nam o dau tep + $head = Get-Content -LiteralPath $p -TotalCount 10 -ErrorAction Stop + foreach ($line in $head) { + $m = [regex]::Match($line, 'updated:\s*(\d{4}-\d{2}-\d{2})') + if ($m.Success) { + $s = [regex]::Match($line, 'session:\s*(S\d+)') + return [pscustomobject]@{ + Nguon = 'WAL' + Ngay = $m.Groups[1].Value + Phien = $(if ($s.Success) { $s.Groups[1].Value } else { '?' }) + } + } + } + return $null +} + +# Rut dau thoi gian GHI TRONG TEP cua so dem phien (cua dung: /session-start, /session-end). +function Read-CounterStamp { + param([string]$Root) + $p = Join-Path $Root '.claude/governance/.session-counter.json' + if (-not (Test-Path -LiteralPath $p)) { return $null } + $raw = Get-Content -LiteralPath $p -Raw -ErrorAction Stop + $j = $raw | ConvertFrom-Json + $ngay = $j.last_ticked_at + if (-not $ngay) { return $null } + if ($ngay -notmatch '^\d{4}-\d{2}-\d{2}$') { return $null } + $phien = $j.last_ticked_session + if (-not $phien) { $phien = '?' } + return [pscustomobject]@{ + Nguon = 'counter' + Ngay = $ngay + Phien = "$phien" + } +} + +try { + $root = Get-RepoRoot -Explicit $RepoRoot + $nhan = '' + if ($Cua -and $Cua.Trim().Length -gt 0) { $nhan = " cua=$Cua" } + + $nguon = @() + $hong = @() + + foreach ($fn in @('Read-WalStamp', 'Read-CounterStamp')) { + $r = $null + try { $r = & $fn -Root $root } catch { $r = $null } + if ($null -ne $r) { $nguon += $r } else { $hong += $fn } + } + + # A2 - mat CA TAP: khong con nguon nao doc duoc. + # In co RIENG, tuyet doi khong in "ok". So 0 mat quyen doc thanh "sach". + if ($nguon.Count -eq 0) { + Write-Output "TIEN-KIEM:$nhan THIEU-TAP - 0/2 nguon moc doc duoc (WAL.md + .session-counter.json) | KHONG ket luan duoc gi | (khong chan)" + exit 0 + } + + # chon cua dong GAN NHAT theo dau thoi gian TRONG TEP (khong phai mtime) + $moi = $nguon | Sort-Object -Property Ngay -Descending | Select-Object -First 1 + + $co = @() + if ($hong.Count -gt 0) { + $ten = ($hong -join ',') -replace 'Read-|Stamp', '' + $co += "NGUON-HONG:$ten" + } + + # lech phien giua 2 nguon = dau hieu mot dau cua khong dong + if ($nguon.Count -ge 2) { + $pset = @($nguon | ForEach-Object { $_.Phien } | Sort-Object -Unique) + if ($pset.Count -gt 1) { $co += ("LECH-PHIEN:" + ($pset -join '/')) } + } + + $trangthai = $(if ($co.Count -eq 0) { 'ok' } else { ($co -join ' ') }) + + Write-Output ("TIEN-KIEM:$nhan cua-dong-gan-nhat={0} moc-trong-tep={1} phien={2} | nguon {3}/2 | {4}" -f ` + $moi.Nguon, $moi.Ngay, $moi.Phien, $nguon.Count, $trangthai) + exit 0 +} +catch { + # fail-soft, y nguyen khuon nhip-no-probe: mot buoc MOI khong bao gio duoc lam hong nghi thuc dang chay tot + Write-Output "tien-kiem loi (khong chan)" + exit 0 +}