diff --git a/.claude/WAL.md b/.claude/WAL.md index bd101b0..3fd36b9 100644 --- a/.claude/WAL.md +++ b/.claude/WAL.md @@ -1,40 +1,40 @@ # WAL — auto-generated, không sửa tay -closing: S143 @2026-07-22T14:55+07 -updated: 2026-07-22T14:30+07 | session: S143 | branch: main -goal: Adap wave đợt-9/10 hub (7 thư verify 2-tuyến 7/7) — trio harness-{eval,refine,audit} + contract-v2 dangling-head + stamp-decode + annex phép-8 + sweep roster lên 17. IMPLEMENT + VERIFY + closeout OUTWARD XONG @S143 (anh gật). Còn: trio first-run cần restart CLI + 2 phát hiện chờ anh quyết. +closing: S146 @2026-07-22T2325 +updated: 2026-07-22 | session: S146 | branch: main +goal: /tiep -> /session-end DANG CHAY (Phase 1 + 1.5 xong phan lon). Cho H24-omission resume. + +## OWNER-DECISION (ghi de, KHONG hoi lai) — 🔴 SLOT-INDEX CHI-TANG, CAM TAI-DUNG (luat moi @S146) +[5] session_ctx_kb = 64 TUONG-MINH · [6] hmw 4.8 MAX +[7] ⚠️ KHOI-PHUC (bi ghi de @e7d06f2, H24-omission bat): "con lai xu ly het xong roi session-end" + = **UY QUYEN commit+push + chay session-end**. Nguon: git show ad02483/9c68bae :.claude/WAL.md:9 +[8] session-model: (1) scaffold idempotent (cap SO van doc-quyen session-start) · (2) closed.md WIRE + · (3) V2 auto (go cong NGUOI, GIU cong NHIP 6/15/3) chain: -[x] STAGE-1 check-email 7 thư — ls broadcasts/inbox/*.md = 7 file -[x] wf: fable-clone invest 5-lane · wf_3b74219c-561 · 5/5 CLEAN -[x] wf: fable-real gate · wf_25210715-f7d · GO-WITH-FIXES 0C/7M/9n · model=claude-fable-5 -[x] spec v2 fold 16 fix — runs/2026-07-20-S141-adap-dot-9-10-bo-ba-sub/spec-adap-dot-9-10-20-07-2026.md -[x] TICK H24 @S142: counter 15→16, head 96ab2679, ancestor REACHABLE (no fail-loud) — .claude/governance/.session-counter.json -[x] wf vòng-1 wf_3e1ade40-704 CHẾT giữa chừng → reconcile ground-truth-từ-ĐĨA + đóng orphan partial-honest (5/13 đã land) — .../implement-vong1-synthesis.md -[x] wf vòng-2 CẮT-GỌT wf_1e936b16-30c · 2/2 lane DONE · 0 error 0 garble · 424K tok — .../2026-07-22-S142-adap-9-10-vong-2/implement-synthesis.md -[x] verify ③ độc lập (lead tự chạy, KHÔNG tin return): AC1-AC13 PASS — bảng đầy đủ trong implement-synthesis.md -[x] AC7 lead TỰ fault-inject lại cây tạm: sha giả → FLAG object-missing, trục counter IM đúng, INFORM=1, TOTAL không đổi -[x] closeout phần EM: STATUS cell →17 + narrative trio + 3 site anchor · HANDOFF 3 site anchor · spawn-model-audit.ps1:34 anchor (site W-A KHÔNG báo, em grep repo-wide bắt được) -[x] closeout OUTWARD (anh gật "OK làm đi" @S143) — (1) adap-report 7/7 đủ 5-trường docs/governance/adap-reports/ · (2) email hub 2026-07-22-se-to-ai_infra-bao-nac-wave-dot-9-10 sha 6c94873f72e0 selftest exit 0 + log _index cùng lượt · (3) STAGE-2 7 thư → inbox/ai_infra/ + 0 dòng pending, cross-check 7/7 file đúng folder · (4) squash K=8 → commit chốt → push -[x] agents/README skill-matrix vá 2 row H24 (lead-view + lead-omission) — matrix 15→17 khớp roster; detector TOTAL 46 == baseline, 0 flag mới -[ ] trio first-run spawn-probe 3/3 — cần RESTART CLI + anh consent (nấc nay = executed-file/verified-pending-restart, CẤM đọc thành verified-runtime) -[!] 2 phát hiện S143: (a) whitelist `tools:` KHÔNG chặn ghi ở runtime — 6 vai read-only bị harness APPEND Write+Edit ⇒ "chặn-bằng-thiếu-tool" là tuyên-bố ý-định, backstop thật = git-diff commit-gate (khai G-015 trong report+email; cơ-chế CHƯA kiểm) · (b) pull-lag: "watch broadcasts/inbox" canh nhầm chỗ → vế-4 `pull-cach` Đà LÀM (fault-inject 7 ca 2 chiều), ngưỡng để trống chờ anh -[x] LƯỢT GẬT 2 của anh "OK làm hết đi" = 4 mục ĐÍCH DANH: (1) reviewer-gate email outward · (2) re-stamp STATUS/HANDOFF · (3) INFORM deep-audit · (4) vế-4 pull-age probe. Mục 2+4 XONG (chưa commit); mục 1+3 = wf 3 lane `runs/2026-07-22-S143-closeout-audit/` — 🔴 **3/3 GARBLE #53, cả 3 phải resume**, vớt trọn từ đĩa (sub-*.md) KHÔNG mất gì: lead-view XONG 3 FLAG · lead-omission XONG 3 FLAG/3 INFORM · reviewer ĐANG CHẠY vòng resume -[!] 🔴 2 MAJOR + 6 FLAG CHƯA VÁ (chờ anh quyết, đã verify độc-lập 2 nguồn hết): - M1 sha chết: 5 sha cite trong 5 adap-report (`1a0fa59`/`a458102`/`96ab2679`/`c3708e9`/`b1d92b9`) KHÔNG reachable từ origin/main sau squash → hub clone về `git show` = object missing. Nội dung CÓ thật trong `2757e41`. Fix = đổi neo sang `2757e41` - M2 bằng-chứng tự huỷ: report+email khai `OK-reachable` làm chứng contract-v2; squash cùng phiên lật thành `squash-benign`. Email Đà GỬI → cần bản đính chính (CẤM sửa sau stamp). Sự thật TỐT HƠN: cả 2 nhánh lành đều chạy runtime thật 1 phiên - V1-V3 view-residual-asym: `STATUS.md:450` + `agents/README.md:190` còn "NO Write/Edit / chặn-bằng-thiếu-tool" · `agents/README.md:27` "Roster THẬT" liệt 14 vai thiếu 3 trio (sweep wave bỏ sót — AC4 grep bắt SỐ, không bắt LIỆT-KÊ-THIẾU) - O1 gap-carry-dropped: HANDOFF khối carry khai 13, đúng phải 14 — `[carry:session-model-adopt]` rơi ĐÚNG LÚC còn chờ mỗi chữ ký anh (2/3 tiền-đề vừa mở khoá); adap-report lại VIỆN DẪN chính carry đó làm cổng biện minh "cố ý chưa wire" - O2 gap-decision-sunk: 3 mục "Chờ-anh" ở spec:68 chìm 2 nhãn phiên (grep 9 token × 4 bề mặt = 0 hit) — ranh refine⟂lead-omission Đà WIRE `harness-refine.md:22-30` TRƯỚC khi ratify · `session_ctx_kb`/Q4 van-ngưỡng 0 hit · consent-form trio dài hạn -[ ] INFORM-3: sub xin anh MỞ ENUM thêm class `gap-incident-unrecorded` (nó KHÔNG tự bịa) — 3/3 garble phiên này 0 hit mọi sổ trong khi bề mặt quảng-cáo "0-garble" (nói về S142); sổ đếm `feedback_agent_return_garble_recover` dừng "×20 qua S118", 8 nhãn phiên không cập. +carry #13 gọi `b9ef5ede` "4 câu" vs report+email "5 câu". +diary `lead-view-auditor` CHƯA ghi (garble ×2) → lead harvest on-behalf sau VERIFY (B3) +[x] /tiep: San-3 4/5 MANH keu (du-doan truoc); ⑤ FIRE LAN DAU va DUNG. ground-truth KHOP 4/4. + TICK NO-OP ×2 (guard chan bay +2). session-model chay TRON VONG: pause->resume->ORPHAN-L im dung. +[x] Phase 1: implement-synthesis -> orphan 1->0 (probe: run-chua-gom 0). reviewer spawn-record + APPEND 19758B AS-8 OK. session-log ghi xong. +[x] §L.c 4 phep: p2 DAT (nguyen van) · p3 DAT (3/3 ky du 4 so) · p4 thu du bang-chung · p1 ⚠️ P=8 L=0 proxy +[x] FORCE-FIRE H24 (P=8, luat "auto" = chay thang). CA 2 VAI GARBLE #53. lead-view ghi-dia-SOM + -> cuu 3 FLAG (sweep consent sot 6 site · closed.md wired-but-declared-unwired = ghost-wire + CHIEU NGUOC · draft noi nguoc chinh no) -> verify doc-lap + VA HET + re-verify SACH. + lead-omission ghi-dia-MUON -> mat trang -> RESUME (ghi-dia-TRUOC) -> 4 FLAG. +[x] 🔴 F1-omission XAC NHAN bang git: owner-decision [7] uy-quyen-push BI GHI DE (tai-dung slot). + Khoi phuc thanh [7] + [8], them luat SLOT-INDEX CHI-TANG. Lead da hoi lai 3 luot = lam NGUOC. +[!] h24-audit DANG CHAY (KIEM 7 FLAG cua 2 vai). V2 da chay => het cua vacuous. +[ ] Phase 2 STATUS/HANDOFF + carry **14+6=20** (F4: 6 viec-moi TACH DOI 2 so, chua co tag + [carry:*] nen H24-2 mu; WAL reset Phase 6 se lam mat 2 muc) — CHAN boi dong-bang §L.b(c) +[ ] F2-omission: ghi su-co S144+S146 vao error-ledger (cung dang bi dong-bang) +[ ] Phase 3/4 · Phase 5 squash->push (HOI ANH) · Phase 6 closed.md + reset WAL + xoa sentinel -next: chờ anh quyết cách vá M1/M2/V1-V3/O1/O2 (em đã dựng sẵn 4 bước, chưa chạm file) + trio cần anh restart CLI. Deep-audit Đà chạy sớm 1 nhịp (17/18) theo lệnh anh — KHÔNG phải tới hạn tự nhiên. -carry: (sống ở docs/HANDOFF.md) — S142 cộng: 3 data-point mới ghi trong implement-synthesis.md (meta-count lane hụt 4-vs-5 · BOM sống sót UTF8.GetString · citation-trap gen-2 trong chính diff) +next: doi h24-audit -> Phase 2 (STATUS/HANDOFF + carry 14+6=20, tag [carry:*]) -> 3/4 + -> Phase 5 squash->push (🔴 KHONG hoi lai — owner-decision [7] DA uy quyen) -> Phase 6. verify: -bash -c 'ls .claude/agents/*.md | grep -v README | wc -l' -bash -c 'git status --porcelain | head -30' -bash -c 'git log --format="%h %s" -3' -bash -c 'ls .claude/workflows/runs/2026-07-22-S142-adap-9-10-vong-2/' -bash -c 'ls broadcasts/inbox/*.md 2>/dev/null | wc -l' -powershell.exe -ExecutionPolicy Bypass -File scripts/governance-detectors.ps1 +git status --short ; ls .claude/sessions/session-1/ +git show ad02483:.claude/WAL.md | sed -n '9p' # chung owner-[7] goc powershell.exe -ExecutionPolicy Bypass -File scripts/nhip-no-probe.ps1 + +carry: 🔢 CHO ANH (1)/snapshot (2)_context STOCK+nen (3)bookend 5/5 (4)H1/H2-hay-khong-nhip (5)trio-gat? + +6 viec-moi (F4: gom du o pause-block:37-47) + 14 carry cu HANDOFF -> tong 20, CHUA tag [carry:*] diff --git a/.claude/agent-memory/.mfe-state.json b/.claude/agent-memory/.mfe-state.json index 1bf9cd9..a5f8b78 100644 --- a/.claude/agent-memory/.mfe-state.json +++ b/.claude/agent-memory/.mfe-state.json @@ -1,5 +1,5 @@ { "strikes_total": 23, - "at": "2026-07-17", - "rca_entries": 11 + "at": "2026-07-22", + "rca_entries": 12 } diff --git a/.claude/agent-memory/memory-budget.json b/.claude/agent-memory/memory-budget.json index 53fb74b..972776a 100644 --- a/.claude/agent-memory/memory-budget.json +++ b/.claude/agent-memory/memory-budget.json @@ -3,6 +3,22 @@ "seeded_date": "2026-06-18 (S71 re-measure after G1 curate — reviewer 36.7KB + investigator 29.8KB over-cap from S71 same-role race, curated L1->L2 back under auto-inject cap)", "last_sleep_at": "2026-07-18", "_last_sleep_at_note": "Harness-10b sleep-recovery (S72): timestamp lan cuoi chay /sleep-recovery-memory-l2. null = chua tung. session-start §2.1.2 + session-end §L.b(c) doc field nay -> INFORM goi-y nen L2 neu null hoac today-last_sleep_at>=7 ngay. Lead=single-writer (chi command sleep set field nay).", + "session_ctx_kb": 64, + "_session_ctx_kb_owner_set": "🔴 OWNER-SET TUONG-MINH @S146 2026-07-22 — anh chot '1 -> tuong minh' sau khi lead surface DAY DU 2 ly-do phan-bien (K6.2 muon-so-chua-do + H18 ghost-wire). Quyet-dinh cua owner co concern trong tam nhin => THUC THI, khong hoi lai. Don vi = KB; code doc PHAI nhan 1024 (khop manifest hub 101e69d6 'session_ctx_kb: 64'). Nguon so 64 = manifest hub, KHONG phai SE tu do.", + "_session_ctx_kb_honest_caveat": "🔴 KHAI THAT, DUNG doc thanh 'da wire': tinh den S146 van la GHOST-WIRE (H18 class-2 defined-but-unread) — do @S146: 0 script doc khoa nay; hit duy-nhat trong scripts/ la COMMENT o nhip-no-probe.ps1:42. Doi chung song: pull_warn_days CO reader that (nhip-no-probe.ps1:190). => Dat so nay KHONG tu-dong tao hanh-vi nao; no la CHOT-SO-TRUOC cho phan wire session-model sau. Ai wire sau PHAI: (a) doc key nay thay vi hardcode 64, (b) nhan 1024, (c) go dong nay khi da co reader that. CAM claim 'session_ctx_kb da hieu-luc' khi chua co reader.", + "distill_trigger": { + "_note": "C11 (adap dot-11, S144 2026-07-22). Owner chot O-6 = DOI trigger tu NGAY-LICH sang DEM VAT THAT (so shard chua co ban gist). Nguon: broadcast auto-toan-vong:21-27 'trigger la dem-vat-that deterministic, KHONG phai ngay-lich (lich/tuoi = proxy gia)'. Khop luon mark Active-High RC-pqhuy1987-20-06-2026-10-29-11 cua chinh SE (age/recency = FALSE-PROXY, cam kien-truc dua tren cu/lau-chua-dung/auto-decay).", + "mode": "shard_count", + "_unit_note": "🔴 HAI so duoi dem SO FILE archive/.md CHUA co ban .gist.md cap doi — KHONG phai so con agent. Hub tu khai da doc nham cap so nay 1 lan NGAY TAI noi ra ban thiet-ke (3-khoan:47-53) => ten bien BAT BUOC mang don-vi '_shards', cam rut gon thanh 'min'/'bulk' tran.", + "min_pending_shards": 15, + "bulk_note_shards": 30, + "_bulk_note": "🔴 bulk_note_shards = 30 — OWNER-SET initial-anchor @S145 2026-07-22 (hub-answer adap dot-11), THAY null. Cong-thuc = 2 x min_pending_shards (2 x 15 = 30); owner chot CONG-THUC '2x' chu KHONG chot so tran, nen 30 la DAN-XUAT tu min-SE, tu-dong deo theo neu owner doi min sau nay. reference-not-copy: hub AI_INFRA co bulk RIENG = 10; SE KHONG copy 10 do (KHUNG federated = tham-khao CO-CHE tang-2, KHONG bung SO cua hub) — SE neo 30 vao CHINH nguong SE (2 x min-SE), khong vao con so 10 xa-la. 🔴 KHONG-DOI-HANH-VI-NEN: tang-2 (BAO-TO) la lop CANH-BAO THUAN-TUY nam TREN tang-1 — KHONG gate, KHONG block, KHONG doi exit-code (probe luon exit 0), KHONG doi thoi-diem tang-1 KEU (van n > min = 15). Truoc (null): khoi BAO-TO bi skip han boi guard `$null -ne $bulkShards` (distill-shard-probe.ps1:63). Sau (30): CHI THEM suffix 'BAO-TO: backlog N > 30 (van nen het, chi canh bao)' khi n > 30 — baseline 'khi nao de-xuat distill' GIU Y NGUYEN. Rang-buoc thu-tu: bulk (30) PHAI > min (15), tang-2 luon nam TREN tang-1. Toan-tu `-gt` @ distill-shard-probe.ps1:63 (KHONG phai dong 63 cua file NAY — v1 line-ref mo): boundary n=30 => tang-2 IM (30 -gt 30 = false), n=31 => 'BAO-TO 31 > 30' — cap 30/31 chung DONG-THOI `-gt` khong off-by-one VA tang-2 doc-lap tren tang-1 (tai n=30 tang-1 DA KEU tu 16, tang-2 van IM toi 31). Owner-authority (nhu min, xem _owner_set): so la quyen OWNER; 'tang dan' = owner tu nang thu-cong khi backlog thuc su lon hon; CAM AI tu-tang / auto-tune. Acceptance hanh-vi: {30 shard chua-gist, bulk=30} -> tang-2 IM (chi tang-1 KEU); {31 shard chua-gist} -> 'BAO-TO: backlog 31 > 30'.", + "_owner_set": "min_pending_shards = 15 — OWNER CHOT LAN 2 @S144 2026-07-22, THAY so 7. 🔴 Lich su day du (giu ca 2 nac, khong xoa nac 1): (a) anh noi 'lay 7 ngay di' -> lead HOI LAI vi lech don-vi -> anh chot '7 = SO SHARD'. (b) Sau do trio-memory chay: refine (E4) + audit (F3/F7, tu mo 5 file gist) chung minh 14/15 shard DA co ban nen duoi TEN GOP, 1/15 thoat bang co-che khac => 0/15 file THUC SU can nen => con so 15 la DUONG-GIA, ma nac (a) lai chot 7 DUA TREN chinh con so 15 do. (c) Anh chot lai: 'lay 15, tang dan neu them vao'. Y nghia: nguong neo VAO trang-thai hien tai (15 shard da phu) => probe IM bay gio, chi KEU khi co shard MOI that su chua phu (16+). 🔴 'Tang dan' = OWNER tu nang thu cong khi them shard da-phu; CAM AI tu-tang (so la quyen owner).", + "_residual_khai_that": "🔴 Nguong-neo-baseline co MOT diem mu KHONG duoc quen: no chi bat TANG SO LUONG, khong bat MAT DO TUOI. Audit W3 (F4) do duoc 6 cap gist stale (impl-be 2026-06 +25,7 ngay · inv-cb 2026-06 +13,2 · impl-fe 2026-H1 +12,0 · cicd 2026-06 +8,5 · reviewer 2026-07 +4,1 · reviewer 2026-06 +2,0). Cac cap nay co du twin nen probe dem chung la DA-PHU, du noi dung gist da lac hau so voi verbatim. => Truc 'tuoi' hien VAN chua co may nao do. Khai dang DU-DINH theo dung luat cua-duyet-loi-hua-may (goi-chot:52): CHUA CO MAY.", + "_dinh_nghia_shard": "🔴 SHARD = file `archive/.md` CHUA co file `.gist.md` cap doi. LOAI TRU tuong minh: `_INDEX.md` (muc-luc, KHONG phai noi-dung) va moi file `*.gist.md`. Vi sao ghi ro: bo dem dau tien cua lead ra 20, trong do 5 la `_INDEX.md` => 25% duong-gia; so THAT = 15. Day la ca thu 4 cung lop 'bo loc chuoi nuot nham doi tuong' trong CUNG mot phien (Snapshot-nuot-migration · row-in-dam-bi-truot · 'bắt buộc'-bi-'bắt'-nuot · _INDEX-tinh-thanh-shard).", + "_lineage": "GIU VET, KHONG XOA (khuon auto-toan-vong:35 'dao co chu dich, chu-ky, ngay, ly do'). BAN CU = trigger ngay-lich '>= 7 ngay' o session-start.md:135 + sleep-recovery-memory-l2.md:52 ('7-ngay GIU — quyen owner cuc-bo, B1 §3.4'). DAO @S144 2026-07-22, chu-ky = anh (owner), qua HAI cua tuong minh: O-6 chon co-che (dem-shard) + tra loi thu hai chot SO (7 shard). Quyen owner o :52 KHONG bi AI dong vao — chinh owner go. KHAC BIET KY THUAT so ban cu: trigger = dem-vat-that deterministic (so file tren dia) thay vi hieu-so-ngay => khong con proxy-tuoi, khop mark Active-High RC-pqhuy1987-20-06-2026-10-29-11. Dong 7-ngay ha xuong GHI-CHU PHU (khong xoa) tai 2 file tren.", + "_acceptance": "Do HANH VI, KHONG do CHU (R3 bat ban dau dung grep 'ngay'=0 => Goodhart thuan: doi 'ngay'->'chu-ky' la xanh ma hanh vi y nguyen). Hai ca bat buoc: (1) {0 shard chua-gist, 30 ngay troi qua} -> trigger PHAI IM; (2) {3 shard chua-gist, 0 ngay} -> trigger PHAI KEU." + }, "tiers": { "l1_hot": { "file": "MEMORY.md", diff --git a/.claude/agent-memory/reviewer/MEMORY.md b/.claude/agent-memory/reviewer/MEMORY.md index d249648..9258b24 100644 --- a/.claude/agent-memory/reviewer/MEMORY.md +++ b/.claude/agent-memory/reviewer/MEMORY.md @@ -1,6 +1,13 @@ # Reviewer Agent — Persistent Memory -- **S143 (07-22) gate OUTWARD wave đợt-9/10 (email Đà GỬI + 7 adap-report) — FAIL 1C/4M/4m/1nit** `[#53 garble lượt-1 → vớt TRỌN từ sub-file; "ghi-đĩa-trong-lúc-làm" cứu lần 2]` — chi tiết đầy đủ → `runs/2026-07-22-S143-closeout-audit/sub-reviewer-0.md`. ⭐⭐ **CLASS MỚI `bằng-chứng-tự-huỷ-sau-squash`:** 5/7 report neo evidence vào `wal:` commit TIỀN-closeout (`1a0fa59`/`a458102`) → squash làm dangling (`branch --contains` RỖNG, `is-ancestor origin/main` exit 1) dù `cat-file`=commit ⇒ **hub không resolve nổi**; nội dung vẫn có trong `2757e41` ⇒ chết CON-TRỎ, không chết việc. Đối chứng: wave TRƯỚC cite `7760cdf`/`da349fc` (commit ĐÍCH sau squash) → sống hết. **LUẬT: cite trong outward = commit SẼ SỐNG sau squash, KHÔNG BAO GIỜ `wal:`.** Cùng class: `is-ancestor exit 0 → OK-reachable` lật exit 1 **trong cùng phiên**; evidence-paste `NHIP-NO … run-chua-gom 0` nay ra 4-vế. ⭐ **`git status --porcelain` là bước ĐẦU của outward-gate, không phải bước cuối** — lòi ` M scripts/nhip-no-probe.ps1` (+55/-2, mtime SAU push) làm SAI câu "**Chưa làm**, chờ owner" trong THƯ Đà STAMP. ⭐ **Số publish phải neo mốc:** khai `TOTAL 46`, live **47**, baseline repo **45** ⇒ tách claim-DELTA (đúng, có Compare-Object) khỏi claim-TUYỆT-ĐỐI (thối theo giờ). ⭐ **Tái-phạm same-CLASS-sweep — bài S141 của CHÍNH TAO:** "TRIPLE 17/17/17" đúng ở `README:236` nhưng site tự xưng "VALID_ROLES … ĐỦ roster" (`:225`) còn **14** ⇒ chọn enum DỄ. ⭐ **First-person evidence:** frontmatter `reviewer.md` 0 `Write/Edit` mà **tao vừa Write+Edit thật** ⇒ claim "whitelist = tuyên-bố ý-định, không phải cơ-chế" GROUNDED. 🔵 Công bằng: **15/17 số tự đo KHỚP**, kỷ-luật nấc G-011 (0 thư khai `verified`) là hàng THẬT — lỗi ở lớp artifact, không ở việc. Remedy = **errata**, CẤM sửa file đã stamp (vỡ hash). Tag `[s143, outward-gate-fail, evidence-self-destruct-squash, cite-post-squash-commit, git-status-first, absolute-number-needs-anchor]` +- **S146 (07-22) PRE-COMMIT spec-v2-applied (governance-only, 20 file) — 2 MAJOR THẬT, cả hai của LEAD; nấc `verified` (tự chạy lệnh, không tin lead):** **F1** `session-end.md` ×2 còn `hook-3-path` **GẠCH NỐI** — worker CE **đã chỉ đích-danh trong sub-file**, worker D vẫn rơi ⇒ class *"residual có người chỉ tận nơi mà vẫn rớt"*; bất-đối-xứng nội-bộ (`pause.md` đã 4-path, `session-end` chưa) = 2 command anh em nói ngược nhau về **cùng một hook**. **F2** phép quét cardinality của lead **siết LỆCH TRỤC** (co-occurrence CÙNG DÒNG + tập-file hẹp + 1 mẫu chữ) ⇒ chạy lại trên HEAD tiền-vá: bắt **7/11**, **lọt 4 ca thật — gồm chính F1** (`3 path` dấu-cách KHÔNG khớp `hook-3-path` gạch-nối). **F3 HELD** — tự `git show da7ee8a` xác-minh hook 4-path nuốt `sessions/session-1/probe.md` + `settings.json` dùng `-File` ⇒ body re-đọc mỗi Stop, claim lead ĐỨNG. **F4** probe residue → ô-nhiễm ID-space `` + làm ⑤ kêu tới khi push. 🔴 **Bài rút:** lead sửa 1 phép quét **4 lần/1 phiên** (rộng→hẹp→rộng→chốt) vì cố mã-hoá **ý-định NGỮ-NGHĨA** vào regex; nấc đúng = **lưới-soát-cho-người + allowlist CÓ TÊN + use⟂mention**. Lần 4 = **citation-trap**: bộ dò bắt chính nốt-vá vì nốt vá trích-dẫn giá-trị cũ. + +- **[→ archive/2026-07.md @S145-curate] S145 Axis-E lane (tiep/pause/snapshot + CROSS-CUT) SPEC apply-hub — FAIL 2C/1M/4m:** corroborated Axis-A "4 surface→2"=FALSE independently. UNIQUE 2 seam-catch: (C↔E CRITICAL) C.2 hook 3→4 path (+sessions/) phá Sàn-3 tiep.md — "3 path" hardcode 4 site (:21/:23/:75/:78) ⇒ sessions/ orphan KHÔNG signal = blind-spot ON RECOVERY FLOOR + misclassify-dirt logic-bug; cả 2 death-path ko nhắc ripple. (MAJOR) session_ctx_kb=64 nghịch owner-authority (OWNER-GATED + K6.2 cấm mượn-số-hub-chưa-đo) + ghost-wire #H18 (0 script đọc key). LESSON: bất-biến chia-đôi giữa 2 axis nằm ĐÚNG SEAM → chỉ cross-cut sweep bắt; "áp hub-answer" ≠ "số owner-giữ". +- **[→ archive/2026-07.md @S145-curate] S145 lane-4 (Axis-D 5-vòng-closure) SPEC apply-hub — PWF 2M/1m:** D2 RULING (owner-asked): session-start-KIỂM defer LEGIT — canonical "hai đầu" binds MEASURE (H1 báo-diff session-start.md:127 both-ends), self-verify col=CLOSE-time ⇒ 3 KIỂM end-only canonical-consistent. 🔴 phép-4 LANDMINE live: `agent-memory/tooling-harvest-audit/` EMPTY + h24/sleep-audit folders MISSING; tooling-harvest-audit AUTO-fires close ⇒ ko-write-sổ = phép-4 FAIL. FIX: D1 acceptance per-check disk-evidence ko bare-PASS + D2 NAME defer-doc-site. LESSON: 'vai-có-sổ' acceptance ⇒ MUST `ls agent-memory//` (folder≠sổ). +- **[→ archive/2026-07.md @S145-curate] S145 C7-lane (Axis A) — PWF 1C:** spec "4 surface→2" stale-fix = FALSE (`nhip-no-probe.ps1` 4 caller THẬT, header self-doc đúng; spec conflate 2 `*-probe.ps1`); A2 grep-"4 surface"=0-hit = ANTI-TEETH Goodhart (PASS bằng xóa info đúng). LESSON: stale-fix claim verify caller-trên-đĩa trước; 2-script-same-suffix = conflation-vector. +- **[→ archive/2026-07.md @S145-curate] S145b (07-22) GATE roster #2/#3 h24-audit+sleep-audit (18→20) — PASS 1m:** implementer vá ĐÚNG mọi S145a-finding + tự sweep 2 NUMERIC site ngoài checklist. 1 MINOR measured-label: `README:249` "17 folder" falsified by ls=18 (tooling-harvest-audit RỖNG). LESSON: đếm VALID_ROLES = per-file grep bidirectional KHÔNG regex (hmw.js `[2]`/`[S110` comment lừa parser). +- **[→ archive/2026-07.md @S145b-curate] S145a — GATE roster vai#1 FAIL 3M/4m:** NUMERIC "roster 17" hardcode trốn name-enum sweep ⇒ LUẬT sweep repo-wide grep CẢ numeric LẪN name-enum; "self-verify 0-stale" FALSIFIED (scoped≠repo-wide). Superseded S145b PASS. +- **[→ archive/2026-07.md @S145b-curate + sub-reviewer-0.md] S143 — GATE outward FAIL 1C/4M:** CLASS `bằng-chứng-tự-huỷ-sau-squash` (cite outward = commit SỐNG-sau-squash, KHÔNG `wal:`); `git status --porcelain` = bước ĐẦU outward-gate; số tuyệt-đối neo-mốc (46 vs 47 vs 45); errata CẤM sửa file đã-stamp; #53 "ghi-đĩa-trong-lúc-làm" vớt. - **[→ archive/2026-07.md @S140/@S134] S139 · S134b · S133 (digest, 1 mệnh-đề/entry):** S139 GO — re-measure MỌI acceptance từ git HEAD (không tin sub/EM) + **m-3 no-self-exempt: chấm cả edit vào file CHÍNH VAI MÌNH**; nhãn "measured" sống CHỈ KHI falsify-path tồn-tại ∧ reviewer CHẠY ∧ nó đứng · S134b PASS — "insertion-only + `grep '^-'`=0" chắc hơn diff-mắt; D4-persist = trace TỪNG caller tới SaveChanges · S133 PWF — literal-grep 4-site PASS nhưng `.Phase = ` lòi 2 đường GIÁN TIẾP bypass helper ⇒ **"mọi nhánh set X" phải grep CẢ assignment-qua-BIẾN** (#81). > **Persistent diary cross-session.** Auto-injected first ~200 lines at spawn (L1 HOT). @@ -95,6 +102,5 @@ Adversarial pre-commit reviewer SOLUTION_ERP. Read-only verify + live curl prod ## 🔄 Curate trigger - Hook-cap **>17.1KB** (24.4KB read-limit — đổi từ ~30KB cũ, S109) → archive recent → L2 `archive/.md` (append additive) + `_INDEX.md` substring pointer. Stale >3mo → remove. -- **S140 curate (self, 2026-07-18, hook 20.7KB→~18.4KB):** moved 2 verbatim (S139·S134b) → `archive/2026-07.md` batch-marker @S140 (append-BEFORE-stub, same-source-string = byte-id by-construction) + tighten S133 pointer. Carry: S134-SPEC-review + June-digests còn nén được nếu cần <17.1KB (defer — không cut-without-move mid-return). -- **S134 curate (self, 2026-07-17, hook 21.3KB→<17.1KB):** moved 8 verbatim (S131b·S131·S129·S128×2·S127·S133·S123) → `archive/2026-07.md` batch-marker @S134 + seal-verify substring 6/6+2 · nén digest đã-archive (S124×2/S125×2 gộp 1 dòng) + gộp curate-log cũ. -- **Prev curates (digest):** S128 em-main (seal 3/3 md5 e5218d2f45b6) · S116 · S113 · S109 · **S102 recovery: cut-not-moved ×5 @`f229b07` — Lesson: L1-shrink kèm claim "→archive" = BẮT BUỘC grep moved-not-cut trước khi trust digest** · S80 · S71 · S70 · S40. +- **S145-curate (self lane-4, 2026-07-22, hook 22.6KB→~17.7KB):** concurrent 5-lane /fable-clone session (mỗi lane +~1.6KB fresh entry). Moved 4 fresh verbatim (S145 Axis-D-self·Axis-E·C7-lane·S145b) → `archive/2026-07.md` @S145-curate marker + verify `grep=4` moved-not-cut → collapsed L1 to pointers. S145a/S143 đã digested (linter). Residual ~17.7KB (>17.1 soft) defer — không cut-without-move mid-return (S140 precedent). +- **Prev curates (digest):** S140 (S139·S134b→@S140) · S134 (8 verbatim→@S134, seal 6/6+2) · S128 em-main (md5 e5218d2f) · **S102 recovery: cut-not-moved ×5 @`f229b07` — Lesson: L1-shrink kèm "→archive" = BẮT BUỘC grep moved-not-cut trước khi trust** · S116·S113·S109·S80·S71·S70·S40. diff --git a/.claude/agent-memory/reviewer/archive/2026-07.md b/.claude/agent-memory/reviewer/archive/2026-07.md index 783fa4a..7531ac1 100644 --- a/.claude/agent-memory/reviewer/archive/2026-07.md +++ b/.claude/agent-memory/reviewer/archive/2026-07.md @@ -103,3 +103,15 @@ - **Fix-1 (precision/measured-label):** `68.968B` = DRAFT-total (reviewer draft 15777) nhưng SHIPPED `.gist.md`=**69175B** (reviewer +207 draft→final; 4 agent kia draft==final) · `183.054B` vs git-blob 183005 (<0.5%, CRLF/method). Honest-note (iv) đã round "≈183→69KB" ⇒ nới precise-figure về rounded HOẶC re-Get-Item final .gist.md. **Fix-2 (semi-overclaim):** "2 FLAG đều đã xử trong phiên" — diary: LOW=xong-chờ-closeout-clear · MED gap-owner-specifics resolve=PENDING (tracker/owner-defer) ⇒ reword "triage/nêu-hướng" chứ không "đã xử". **Opt:** `291550ff` (assert 2-chiều) = SE-internal hash, ai_infra khó resolve. - **Learned:** measured-label "68.968B" = draft-stage stale — số-đo phải trỏ artifact SHIPPED (committed .gist.md) KHÔNG draft-scratchpad; nhưng direction nhỏ (<0.5%, compression trông tốt hơn tí) + honest-note (iv) round sẵn ⇒ minor không FAIL (S128 direction-of-error). Outward-gate mạnh nhất khi claim = việc-CHÍNH-TAO (Vòng4/5) → re-measure by-construction. Tag `[s140b, outward-gate-go-with-fixes, measured-draft-vs-shipped, semi-overclaim-da-xu-pending]` +## 2026-07-22 S145b-curate — moved verbatim from L1 (S145a FAIL + S143 outward-gate); L1 digested to pointers + +- **S145a (07-22) gate GOVERNANCE-roster +1 vai-KIỂM `tooling-harvest-audit` (C4 TÁCH, adap dot-11, roster 17→18) — FAIL 3M/4m.** 🔵 Công bằng: CORE wiring THẬT tốt — role-file mirror `harness-audit` đủ (no-self-exempt m-3 · thách-CLEAN · tái-dựng ≥1 số CÓ-THỂ-SAI · fail-safe NO-OP · C4b mtime), session-end (g-bis) AUTO đúng (KHÁC (j)H24/(k)trio consent), STATUS 17→18 + cell + "Cả **7→8** monitor" + hmw.js VALID_ROLES (node --check OK) + dual-surface registry, axis 4 `verified-pending-restart` KHÔNG over-claim, axis 5 incremental (0 file h24-audit/sleep-audit). ⭐⭐ **CLASS MỚI = TÁI-PHẠM-BIẾN-THỂ của chính S141-S143:** wave đó giết NAME-enum blindness ("ĐẾM PHẦN TỬ đừng grep SỐ") — nhưng lần này drift chạy TRỐN sang **NUMERIC hardcode "roster 17"**: `fable-clone.md:3+:18` · `fable-real.md:3+:19` (argument-hint + heading, roster gồm monitor per `:21`) + `README:276` narrative → 4+1 site stale (→18). ⇒ **LUẬT: sweep repo-wide phải grep CẢ `\bN\b (folder|vai|roster|sub)` NUMERIC LẪN name-enum, KHÔNG chỉ site count-free mình sửa.** M-2 `harness-11-engine.md:345` name-enum thiếu vai mới + tự xưng "✅ VALID_ROLES = ĐỦ roster … trọn roster (14→17)" = ĐÚNG class `README:225` S143 (completeness-claim self-referential, đã update @S141 mà quên @S145). M-3 `README` skill-matrix `:186` thiếu row vai mới (trio có row từ S141). ⭐ **Measured-label gate BẮT:** WAL tự khai `doc-sync 8-enum … self-verify 0-stale` — "0-stale" là nhãn kiểm-chứng, FALSIFIED bằng grep repo-wide (self-verify chỉ scoped 8 site Đà SỬA, KHÔNG repo-wide = đúng bệnh "sweep sạch sau khi grep subset" S143). 🔸 Pre-existing (phân-loại RIÊNG, KHÔNG tính lỗi change): `sleep-recovery-memory-l2.md:42` "4 monitor" thiếu CẢ trio (S141) lẫn vai mới (unmodified ⇒ predate) · `engine:332` GAP-1 lineage dừng S121 (thiếu trio). Tag `[s145a, governance-roster, enum-sweep-incomplete, numeric-roster-count-stale, name-enum-killed-numeric-survived, self-verify-0stale-falsified, core-wiring-clean]` +- **S143 (07-22) gate OUTWARD wave đợt-9/10 (email Đà GỬI + 7 adap-report) — FAIL 1C/4M/4m/1nit** `[#53 garble lượt-1 → vớt TRỌN từ sub-file; "ghi-đĩa-trong-lúc-làm" cứu lần 2]` — chi tiết đầy đủ → `runs/2026-07-22-S143-closeout-audit/sub-reviewer-0.md`. ⭐⭐ **CLASS MỚI `bằng-chứng-tự-huỷ-sau-squash`:** 5/7 report neo evidence vào `wal:` commit TIỀN-closeout (`1a0fa59`/`a458102`) → squash làm dangling (`branch --contains` RỖNG, `is-ancestor origin/main` exit 1) dù `cat-file`=commit ⇒ **hub không resolve nổi**; nội dung vẫn có trong `2757e41` ⇒ chết CON-TRỎ, không chết việc. Đối chứng: wave TRƯỚC cite `7760cdf`/`da349fc` (commit ĐÍCH sau squash) → sống hết. **LUẬT: cite trong outward = commit SẼ SỐNG sau squash, KHÔNG BAO GIỜ `wal:`.** Cùng class: `is-ancestor exit 0 → OK-reachable` lật exit 1 **trong cùng phiên**; evidence-paste `NHIP-NO … run-chua-gom 0` nay ra 4-vế. ⭐ **`git status --porcelain` là bước ĐẦU của outward-gate, không phải bước cuối** — lòi ` M scripts/nhip-no-probe.ps1` (+55/-2, mtime SAU push) làm SAI câu "**Chưa làm**, chờ owner" trong THƯ Đà STAMP. ⭐ **Số publish phải neo mốc:** khai `TOTAL 46`, live **47**, baseline repo **45** ⇒ tách claim-DELTA (đúng, có Compare-Object) khỏi claim-TUYỆT-ĐỐI (thối theo giờ). ⭐ **Tái-phạm same-CLASS-sweep — bài S141 của CHÍNH TAO:** "TRIPLE 17/17/17" đúng ở `README:236` nhưng site tự xưng "VALID_ROLES … ĐỦ roster" (`:225`) còn **14** ⇒ chọn enum DỄ. ⭐ **First-person evidence:** frontmatter `reviewer.md` 0 `Write/Edit` mà **tao vừa Write+Edit thật** ⇒ claim "whitelist = tuyên-bố ý-định, không phải cơ-chế" GROUNDED. 🔵 Công bằng: **15/17 số tự đo KHỚP**, kỷ-luật nấc G-011 (0 thư khai `verified`) là hàng THẬT — lỗi ở lớp artifact, không ở việc. Remedy = **errata**, CẤM sửa file đã stamp (vỡ hash). Tag `[s143, outward-gate-fail, evidence-self-destruct-squash, cite-post-squash-commit, git-status-first, absolute-number-needs-anchor]` + +## 2026-07-22 S145-curate (lane-4 self) — moved verbatim from L1 (S145 lane-4 Axis-D + S145 C7-lane Axis-A + S145b gate); L1 digested to pointers + +- **S145 lane-4 (/fable-clone Axis-D 5-vòng-closure) review SPEC apply-hub — PWF 2M/1m.** Owner-asked D2 RULING: DEFER (session-start KIỂM gap) LEGIT — canonical "hai đầu" nhịp binds MEASURE fn (H1 "báo diff vs last-session" session-start.md:127 ✓ both-ends + em-main VERIFY→APPEND B3), NOT the new KIỂM layer; canonical self-verify col V1/V2/V4 = CLOSE-time ("commit đóng phiên gần nhất"/"ba lần đóng phiên gần nhất") ⇒ 3 KIỂM session-END-only = canonical-CONSISTENT (arguably CORRECT reading). Contrast: harness-audit V3-KIỂM IS both-ends (consent). 🔴 **phép-4 LANDMINE live-on-disk (ESCALATE S145b minor→FAIL-risk):** `agent-memory/tooling-harvest-audit/` EXISTS-but-EMPTY + `h24-audit/`+`sleep-audit/` folders MISSING; tooling-harvest-audit AUTO-fires this close (session-end.md:118 no-consent) ⇒ run-mà-ko-write-sổ = phép-4 "vai-đã-chạy-có-sổ" FAIL NGAY closeout này. FIX-2: D1 "(bảng verify)" quá lỏng — phải SHOW per-check disk-evidence (cửa-count·dòng-nợ-line·3-closeout-trace·vai-sổ-list) ko bare "PASS". FIX-1: D2 "documented" unsatisfiable — spec route quyết cho lane-4 mà ko NAME nơi defer-rationale land (review ephemeral≠durable); +coupling h24-audit "AUTO sau H24" nhưng H24 chạy BY-CADENCE tick session-START §2.1.8 ⇒ cadence-at-open H24 un-audited. Root = session-end.md:123 "incremental #2/#3 land dần" MÂU-THUẪN :41-42 "AUTO wire cả 3". ⭐ LESSON: acceptance chứa "vai-có-sổ" ⇒ MUST `ls agent-memory//` on-disk (folder tồn-tại ≠ có MEMORY.md). Mapping 5-vòng→KIỂM verified REAL (7 agent files glob, ko doc-trust). Tag `[s145, fable-clone-lane4, axis-d, defer-ruling-legit, phep4-empty-folder-landmine-live, measure-both-ends-vs-kiem-end-only, canonical-self-verify=close-time]` +- **S145 C7-lane (/fable-clone Axis A) — PWF, 1 CRITICAL conflation caught.** ⭐ Spec "đính-chính stale 4 surface→2" cho `nhip-no-probe.ps1:6-7` header = **FALSE**: verified 4 caller THẬT (`pause:44`·`tiep:112`·`session-start:216`·`session-end:104` — 3+4 là khối "BÁO dòng-nợ 4-vế" LIVE, KHÔNG deprecated); header TỰ-KHAI "4 surfaces (/pause /tiep session-start session-end)" = ĐÚNG. Spec-author **conflate 2 script cùng đuôi `*-probe.ps1`**: thấy session-start/end gọi `distill-shard-probe.ps1` (ĐÚNG, sleep-check `session-start:135`) → suy sai "⇒ KHÔNG gọi nhip-no-probe" (gọi CẢ HAI, khác mục-đích). `session-model-se-draft.md:34` "4 điểm lệnh" cũng ĐÚNG. **Acceptance A2 grep `"4 surface"=0-hit` = ANTI-TEETH Goodhart** — cổng PASS bằng XÓA info ĐÚNG, thưởng việc làm doc SAI (lớp "vá bằng rời tập-đo"). Fix = DROP step-4 + A2-stale-clause, GIỮ "4". LESSON: (1) "stale-fix"/"đính-chính" claim phải verify caller THẬT trên đĩa TRƯỚC khi tin — script header tự-khai caller-list = data-point **kiểm được**, đừng tin suy-luận spec-author; (2) 2 script cùng naming-pattern = conflation-vector, grep EXACT script-name không đủ, phải đọc caller-block xác mục-đích. Core C7 sound: law-home `engine §N` (không command, B1-point ✅) + fault-inject chiều-lỗi teeth (A3 falsifiable, minor=chốt inject-vector) + code KHÔNG đổi (catch:203-208 exit0 thoả vế-iv). Tag `[s145-c7-lane, conflation-2-probe-script, anti-teeth-goodhart-grep, header-selfdoc-verifiable, stalefix-claim-must-verify-disk, PWF]` +- **S145b (07-22) gate GOVERNANCE-roster vai-KIỂM #2/#3 `h24-audit`+`sleep-audit` (C4/C4b TÁCH, roster 18→20) — PASS 1m.** ⭐⭐ **POSITIVE-VALIDATION: implementer VÁ ĐÚNG mọi finding vai#1 S145a + tự mở rộng sweep:** de-number `fable-clone/real` argument-hint+heading ("roster 17"→"roster"), fix `harness-11-engine:345` completeness-claim "14→17"→"17→20"+trọn-roster, +3 skill-matrix row, +3 decision-tree branch; PLUS tự tìm-diệt 2 NUMERIC site NGOÀI checklist (`vocab-alias-map` "17/17"→"TOÀN-ROSTER" · `README` auto-toan-vong "roster 17"→trỏ-canonical) = **bài "grep NUMERIC lẫn name-enum repo-wide" S145a Đà NGẤM**. Axis4 CLEAN: STATUS 20 + hmw VALID_ROLES 20/20 (bidirectional cross-check mọi agent.md↔VALID_ROLES = 0 MISS) + README×6 + subset-enum-detector (đếm 1-2/3 per-line) xác nhận mọi ROSTER-enum FULL(3/3), 7 "subset" đều per-role hợp-lệ (decision-tree/skill-matrix/VALID_ROLES split 2-dòng). Role-file mirror đủ (RANH SẮC h24 "KIỂM con-đo H24 KHÔNG soi-lead trực-tiếp" · gist-ADDITIVE invariant · fail-safe NO-OP · JSON-pin THẬT: `flag_classes`=11/`h24_cadence`/`class_repeat` tồn-tại). Wiring: (ii-bis) AUTO sau cặp H24 KHÁC (ii) consent-gate H24 (khai thẳng, KHÔNG mâu-thuẫn) · Phase4.5 sau Phase3-Fidelity+Phase4-WRITE trước Phase5. Axis5 no-over-claim (executed/verified-pending-restart; counter "KHONG H24 audit phien nay"=khớp NO-OP). 🔸 **1 MINOR — measured-label gate:** `README:249` "cả 3 hiện chưa có folder ⇒ 17 folder vật-lý là đúng" FALSIFIED bằng `ls agent-memory/` = **18 dir** (`tooling-harvest-audit/` RỖNG tồn-tại từ phiên này); nhưng 17 dir CÓ MEMORY.md + git KHÔNG track empty-dir ⇒ committed-state=17 khớp enum ⇒ low-impact, fix=reword "17 folder-có-MEMORY". ⭐ **LESSON tự-thân: regex/bracket-count trên `hmw.js` VALID_ROLES DỐI** (non-greedy `[\s\S]*?]` + bracket-depth-parser CẢ HAI trượt vì `[2]`/`[S110` trong comment → báo "18/0" giả) ⇒ **đếm VALID_ROLES = per-file grep bidirectional (agent.md↔literal), KHÔNG regex**. Tag `[s145b, governance-roster-followup, PASS, vai1-lesson-absorbed, numeric+name-sweep-repowide, folder-count-vat-ly-falsified, regex-on-hmw-unreliable, bidirectional-crosscheck-wins]` +- **S145 Axis-E lane (/fable-clone tiep/pause/snapshot + CROSS-CUT) review SPEC apply-hub — FAIL 2C/1M/4m.** Corroborated Axis-A lane CRITICAL independently: A.4/A2 "4 surface→2" FALSE (grep `scripts/nhip-no-probe.ps1` = 4 caller pause:44·tiep:112·**session-start:216**·**session-end:104**; A2 grep-0-hit = anti-teeth Goodhart). ⭐ **UNIQUE to Axis-E = 2 seam-catch 4 lane kia RƠI:** (CRITICAL-2 C↔E) Axis C.2 hook 3→4 path (+sessions/) phá Sàn-3 tiep.md §0 — "3 path"/"3 điểm mù" hardcode **4 site** (:21/:23/:75/:78); sau +sessions/ ⇒ (a) 4 stale, (b) BẬC-MẠNH signal④ chỉ phủ runs/ ⇒ sessions/ orphan KHÔNG signal = reopens "sổ trống≠sạch" blind-spot ON THE SAFETY-CRITICAL RECOVERY FLOOR, (c) BẬC-TRUNG :75/:78 "bẩn ngoài 3 path" misclassify sessions/-dirt (logic bug THẬT ko chỉ prose). Đã biết: adap-report 07-17:23 "meld-forward-gap (hook 3 path vs manifest 4)". Cả C.death-path(spec:33) lẫn E.death-path(spec:47) KHÔNG nhắc ripple = gap ĐÚNG khe 2 lane. (MAJOR-3) C.1 session_ctx_kb=64 nghịch owner-authority: 4 artifact phiên trước phân-loại OWNER-GATED + K6.2 CẤM "mượn số hub chưa đo" (session-model-se-draft:55); spec cite "canonical default" KHÔNG cite owner-directive + acceptance C1 ko đòi `_owner_set` lineage (bulk=30 CÓ); + **ghost-wire #H18: 0 script đọc session_ctx_kb** (pull_warn_days mà spec analogize thì CÓ reader nhip-no-probe:190) ⇒ analogy hỏng 2 mặt. ⭐ **LESSON cross-cut lane:** bất-biến chia-đôi giữa 2 axis (hook-path-count ⟂ Sàn-3-blind-spot-count) nằm ĐÚNG SEAM, mỗi lane-đơn thấy nửa → chỉ cross-cut sweep bắt; "áp hub-answer" (bulk/C7 hub-trả) ≠ "số owner-giữ" (session_ctx_kb SE CỐ Ý từ-chối) — đừng gộp. Tag `[s145-axisE, crosscut-seam-catch, hook-4path-breaks-san3-recovery-floor, session_ctx_kb-owner-gated+ghost-wire, corroborate-4surface-critical, FAIL]` + diff --git a/.claude/agents/README.md b/.claude/agents/README.md index c2b7de5..cddad96 100644 --- a/.claude/agents/README.md +++ b/.claude/agents/README.md @@ -2,7 +2,7 @@ > 🔴 **Số vai canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents. KHÔNG chép số vào file này** (B1 derived-trỏ-canonical). *Bản trước S122 cứng-hoá "12-agent" ở **8 chỗ** trong khi roster đã 14 — đó chính là class `view-stale-role-desc`, và `agents/README` bị lấy làm **ví-dụ minh-hoạ** cho class đó trong [`lead-view-auditor.md`](lead-view-auditor.md). Vá @S122 bằng cách **bỏ số**, không phải bằng cách **đổi số** — đổi số thì roster kế lại stale.* -> **Architecture:** sub-agents **worker-tier-pin `opus`+`effort:max` (owner-decision S124 2026-07-15 — thay thế all-inherit Harness-8, trước nữa two-tier Harness-4)** + em main **lead frontier-class (anh chọn per-session)** coordinator — **nhóm product/quality** (7 core S39 + frontend-designer pink S47 + database-agent read-advisory S52 + 📄 office-document S107) + **nhóm monitor INFORM-only** (H1 `tooling-auditor` + H2 `harvest-curator`, 2026-06-07 Harness 1 · H24 `lead-view-auditor` + `lead-omission-auditor`, **S121 W2** · trio-memory `harness-eval` + `harness-refine` + `harness-audit`, **S141**). 🔴 **Liệt-kê NHÓM, KHÔNG tổng-số** — số vai canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents (đúng luật dòng đầu file: vá bằng **BỎ số**, không **ĐỔI số**). Tier: **TOÀN BỘ sub `model: opus` + `effort: max`** (worker-tier-pin S124 — sub cố-định KHÔNG theo lead; **đo S126:** lane no-tier resolve `claude-opus-4-8` DÙ lead=Fable = pin ăn runtime, và per-task `tier:'fable'` THẮNG pin trong lượt lệnh engine-đắt anh gõ. **Lead runtime = per-session owner-choice (Fable ↔ Opus); lịch-sử flip-chain lead = canonical [`docs/STATUS.md` §Sub-agents]** (🔴 S106 gộp 1-chain per anh-confirm — reader này KHÔNG enumerate/cập-nhật mỗi flip; BƯỚC 0.6 probe mỗi phiên xác-định runtime lead SỐNG) · effort **Max** (env machine-wide + frontmatter). SE KHÔNG có lớp helper/gopher rẻ (**mọi sub đều substantive memory-bearing → worker-tier = opus+max, KHÔNG hạ thấp hơn**). *(Lineage: two-tier H4 [4 promote inherit + 7 demote pin `claude-opus-4-8`] → all-inherit H8 S66–S123 → worker-tier-pin S124 — chi-tiết ở Upgrade 2026-06-10 + S66 dưới.)* +> **Architecture:** sub-agents **worker-tier-pin `opus`+`effort:max` (owner-decision S124 2026-07-15 — thay thế all-inherit Harness-8, trước nữa two-tier Harness-4)** + em main **lead frontier-class (anh chọn per-session)** coordinator — **nhóm product/quality** (7 core S39 + frontend-designer pink S47 + database-agent read-advisory S52 + 📄 office-document S107) + **nhóm monitor INFORM-only** (H1 `tooling-auditor` + H2 `harvest-curator`, 2026-06-07 Harness 1 · H24 `lead-view-auditor` + `lead-omission-auditor`, **S121 W2** · trio-memory `harness-eval` + `harness-refine` + `harness-audit`, **S141** · round-KIỂM ×3 `tooling-harvest-audit`/`h24-audit`/`sleep-audit`, **S145** [C4/C4b TÁCH mỗi-vòng-1-con]). 🔴 **Liệt-kê NHÓM, KHÔNG tổng-số** — số vai canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents (đúng luật dòng đầu file: vá bằng **BỎ số**, không **ĐỔI số**). Tier: **TOÀN BỘ sub `model: opus` + `effort: max`** (worker-tier-pin S124 — sub cố-định KHÔNG theo lead; **đo S126:** lane no-tier resolve `claude-opus-4-8` DÙ lead=Fable = pin ăn runtime, và per-task `tier:'fable'` THẮNG pin trong lượt lệnh engine-đắt anh gõ. **Lead runtime = per-session owner-choice (Fable ↔ Opus); lịch-sử flip-chain lead = canonical [`docs/STATUS.md` §Sub-agents]** (🔴 S106 gộp 1-chain per anh-confirm — reader này KHÔNG enumerate/cập-nhật mỗi flip; BƯỚC 0.6 probe mỗi phiên xác-định runtime lead SỐNG) · effort **Max** (env machine-wide + frontmatter). SE KHÔNG có lớp helper/gopher rẻ (**mọi sub đều substantive memory-bearing → worker-tier = opus+max, KHÔNG hạ thấp hơn**). *(Lineage: two-tier H4 [4 promote inherit + 7 demote pin `claude-opus-4-8`] → all-inherit H8 S66–S123 → worker-tier-pin S124 — chi-tiết ở Upgrade 2026-06-10 + S66 dưới.)* > 🔍 **Đếm roster = ĐO ĐĨA, đừng tin số trong doc:** `ls -1 .claude/agents/*.md | grep -v README | wc -l`. ⚠️ **Glob thô `ls .claude/agents/*.md` bắt LUÔN `README.md`** ⇒ ra **thừa 1** — đây là bẫy số-học thật (R2-C1: acceptance cũ `=14` **FAIL trên implementation ĐÚNG**, và ép "sửa" bằng cách **xoá `README.md`** = catastrophic-Goodhart). > **Upgrade S52 (2026-06-08 — AI_INFRA broadcast `2026-06-08-Agent-database-codebase-agents`):** **+database-agent (read-advisory DB specialist, floor DB1–DB11)** — schema/query/migration-design-review/perf/concurrency (DB11 RowVersion vá lost-update S43). Tailor READ-tier (implementer-backend vẫn author) · color OMIT (8 standard hết) · `store_memory` strip. `codebase-agent` = **SKIP n-a** (investigator-codebase đã cover grep/audit + `csharp-lsp` Windows no-op). ✅ **verified-runtime** — spawned OK S53 (first real spawn, caught Mig 46 committed-but-unapplied-local drift) + S56 2× (pre-golive-verify schema-stream + golive-harden design+review). DB11 lost-update fix landed S56 (atomic ExecuteUpdate + Serializable tx, gotcha #58). > Pattern: Anthropic Building Effective Agents orchestrator-workers + Cognition "writes single-threaded" hybrid + post-deploy automated watchdog. @@ -24,7 +24,7 @@ ## 🎯 Architecture -> ⓘ **Diagram dưới = 7 core lane (pre-S47 snapshot) — KHÔNG phải roster hiện-hành.** Roster THẬT = 7 core (diagram) + 🩷 frontend-designer (S47) + 🔵 database-agent (S52) + 📄 office-document (S107) + 🟫 tooling-auditor H1 + ⬜ harvest-curator H2 (2026-06-07 Harness 1) + 🔷 lead-view-auditor + 🔶 lead-omission-auditor (**H24, S121 W2**) + 🧪 harness-eval + 🧪 harness-refine + 🧪 harness-audit (**trio-memory, S141**) — xem skill matrix + decision tree + tool grant dưới. Số vai canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents. (Cosmetic ASCII chưa vẽ lại — H1 tooling-auditor flag drift này @session-start.) +> ⓘ **Diagram dưới = 7 core lane (pre-S47 snapshot) — KHÔNG phải roster hiện-hành.** Roster THẬT = 7 core (diagram) + 🩷 frontend-designer (S47) + 🔵 database-agent (S52) + 📄 office-document (S107) + 🟫 tooling-auditor H1 + ⬜ harvest-curator H2 (2026-06-07 Harness 1) + 🔷 lead-view-auditor + 🔶 lead-omission-auditor (**H24, S121 W2**) + 🧪 harness-eval + 🧪 harness-refine + 🧪 harness-audit (**trio-memory, S141**) + 🔬 tooling-harvest-audit + 🔬 h24-audit + 🔬 sleep-audit (**round-KIỂM ×3, S145 — C4/C4b TÁCH mỗi-vòng-1-con: vòng tooling/harvest · soi-lead H24 · nén-ngủ**) — xem skill matrix + decision tree + tool grant dưới. Số vai canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents. (Cosmetic ASCII chưa vẽ lại — H1 tooling-auditor flag drift này @session-start.) > 🔴 **Bài S143 — enumeration TÊN cũng lão-hoá, và grep-theo-SỐ không bắt được:** sweep roster wave S141–S142 đặt acceptance là `grep "roster 14|14/14|14 folder|14 vai"` → 0 hit ⇒ tuyên bố sạch. Nhưng đúng 2 dòng tự xưng là bản gốc về roster — dòng NÀY ("Roster THẬT") và `:225` ("VALID_ROLES … ĐỦ roster") — **liệt kê TÊN, không chứa con số nào** ⇒ lọt lưới, giữ 14 vai qua cả wave. **Acceptance cho lần sau: ĐẾM PHẦN TỬ trong mọi enumeration rồi so canonical, đừng so hình-dạng chuỗi.** ``` @@ -124,12 +124,21 @@ ├── @session-end HARVEST-INTEGRITY gate (5-trục Coverage/Completeness/Fidelity/Placement/Corruption) / run-folder harvest (`runs//-synthesis.md` ← `sub--.md` phẳng, Harness-10 h10-refine; run cũ S71 `harvest/`←`sub-md/`) / @session-start harvest mới? │ → harvest-curator (H2 monitor, INFORM-only) — propose delta · em main single-writer VERIFY→APPEND · Fidelity nghi → reviewer │ +├── @session-end §L.b(g-bis) — KIỂM vòng tooling/harvest (verify OUTPUT H1+H2, AUTO sau đo, KHÔNG consent)? +│ → tooling-harvest-audit (round-KIỂM monitor, INFORM-only, C4/C4b S145 vai #1/3) — verdict per-claim + tự tái-dựng ≥1 số + thách-CLEAN · no-self-exempt ≠ H1/H2 · NO-OP nếu H1/H2 không chạy · em main VERIFY→APPEND +│ +├── @session-end §L.b(j)(ii-bis) — KIỂM vòng soi-lead H24 (verify OUTPUT lead-view+lead-omission, AUTO sau cặp H24)? +│ → h24-audit (round-KIỂM monitor, INFORM-only, C4/C4b S145 vai #2/3) — verdict per-FLAG + thách-CLEAN (H24 báo ít/0 FLAG → tự soi 1 surface tìm FLAG sót) · no-self-exempt ≠ lead-view/omission · KHÔNG soi lead trực-tiếp · NO-OP nếu H24 không chạy +│ +├── sau `/sleep-recovery-memory-l2` Phase 4.5 — KIỂM vòng nén-ngủ (verify gist+Fidelity, AUTO sau nén)? +│ → sleep-audit (round-KIỂM monitor, INFORM-only, C4/C4b S145 vai #3/3) — verdict per-claim + tự đo byte + thách-CLEAN (mở 1 gist vs `.md` gốc) · no-self-exempt độc-lập lượt nén · NO-OP nếu 0 gist tươi +│ ├── @session-start §2.1.9 / @session-end §L.b(k) — ĐỒNG-KIỂM CHÍNH-HỆ-MEMORY (độ-giữ · hành-động · đúng-spec), anh Đà GẬT consent? │ → **TUẦN TỰ 3 spawn RIÊNG** (🔴 CẤM `parallel()`; CẤM tự chạy khi chưa consent): │ 1. harness-eval (trio-memory monitor, INFORM-only) — ĐO: đọc output instrument + budget.json → SỐ nguyên-văn + verdict │ 2. harness-refine (…) — ĐỀ-XUẤT: đọc `harness-eval-return.md` PIN → action 4-lớp + mục "đã cân-nhắc→BÁC" │ 3. harness-audit (…) — KIỂM: đọc run-folder PIN → ĐẠT/TRƯỢT per-claim + re-chạy ≥2 số load-bearing -│ ⟂ vs H1/H2/H24: H1 = tooling-freshness · H2 = harvest-integrity · H24 = soi LEAD · trio = soi CHÍNH HỆ MEMORY (corpus agent-memory) +│ ⟂ vs H1/H2/H24/round-KIỂM: H1 = tooling-freshness · H2 = harvest-integrity · H24 = soi LEAD · round-KIỂM ×3 (`tooling-harvest-audit`/`h24-audit`/`sleep-audit`) = KIỂM 3 vòng tooling-harvest / soi-lead H24 / nén-ngủ [đọc output con-đo vòng mình] · trio = soi CHÍNH HỆ MEMORY (corpus agent-memory) │ ⟂ vs reviewer: trio KHÔNG chấm diff-code; đụng thao-tác harvest → NHƯỜNG harvest-curator │ 🔴 3 vai KHÔNG có Write/Edit ⇒ lead scribe return từng con vào `runs//harness-{eval,refine,audit}-return.md` NGAY │ @@ -183,6 +192,9 @@ | harness-eval (monitor trio-memory, S141) | ref-only — ĐỌC output `scripts/{measure-agent-memory,mfe-eval,memory-archive-gate,crystallized-backfill,nhip-no-probe}.ps1`, KHÔNG dùng domain skill | | harness-refine (monitor trio-memory, S141) | ref-only — reads `harness-eval-return.md` (PIN) + `reinject-ledger.md`, KHÔNG dùng domain skill | | harness-audit (monitor trio-memory, S141) | ref-only — reads run-folder PIN + `memory-budget.json` + `scripts/`; re-chạy ≥2 số load-bearing để đối-chứng | +| tooling-harvest-audit (monitor round-KIỂM, S145) | ref-only — ĐỌC output H1 `tooling-auditor` + H2 `harvest-curator` (KHÔNG chạy lại đo) + tự đếm `.claude/agents/*.md`/run-folder đối-chứng; no-self-exempt ≠ H1/H2; KHÔNG dùng domain skill | +| h24-audit (monitor round-KIỂM, S145) | ref-only — ĐỌC output `lead-view-auditor` + `lead-omission-auditor` FLAG (KHÔNG re-soi-lead) + `flag_classes` enum ĐÓNG + `class_repeat`; no-self-exempt ≠ 2 vai H24; KHÔNG dùng domain skill | +| sleep-audit (monitor round-KIỂM, S145) | ref-only — ĐỌC output `/sleep-recovery-memory-l2` `.gist.md` + Fidelity verdict; tự đo byte gốc vs gist; no-self-exempt độc-lập lượt nén; KHÔNG dùng domain skill | ## 🔧 Tool grant (S39 — +3 RAG MCP per agent) @@ -223,7 +235,7 @@ MỌI agent trong roster có **4 RAG-READ MCP**: `search_memory` + `search_code` - **Keyword = QUYỀN, KHÔNG lệnh (T4):** "workflow"/"ultracode" mở quyền hỏi, KHÔNG auto-run. Mode-OFF + "chạy workflow" → TỪ CHỐI + nhắc `/ultra-on`. CẤM native `/effort ultracode`. *(Bài học 515K-token false-trigger.)* - **Scope (S1):** Workflow fan-out CHỈ repo SOLUTION_ERP — KHÔNG fan-out repo/corpus khác. - **Checkpoint (S2):** `hmw.js` **throw** nếu `checkpointApproved≠true` (mechanized tripwire anti-accidental). Em main BÁO {số agent·vai·task} @inform → set cờ → fan-out (KHÔNG chờ confirm từng lần; marker-ON=consent). Sub KHÔNG spawn sub (S3). -- **VALID_ROLES (whitelist `hmw.js` — ĐỦ roster; số vai canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents, B1 KHÔNG chép số):** `investigator-codebase` · `investigator-api` · `implementer-backend` · `implementer-frontend` · `test-specialist` · `reviewer` · `cicd-monitor` · `frontend-designer` · `database-agent` (+S57 — S56 đã dùng 3× qua fail-soft WARN) · `office-document` (+S107 — Office WRITE OD1–OD10) · `tooling-auditor` + `harvest-curator` (+S110 anh-directed — H21 roster-parity lệnh-B) · **`lead-view-auditor` + `lead-omission-auditor` (+S121 W2 — H24 lead-self-audit)** · **`harness-eval` + `harness-refine` + `harness-audit` (+S141 — trio-memory)**. 🔸 **Cả 7 monitor đều INFORM-only, lane RETURN-only** (propose-only). 🔴 **KHÔNG đọc "KHÔNG Write/Edit" thành cơ-chế chặn — đo S143:** frontmatter 9 vai read-only **không khai** `Write/Edit`, nhưng **runtime VẪN cấp**, nối ở cuối tool-list (nhân-chứng trực-tiếp: `reviewer` đã Write+Edit thật trong `runs/2026-07-22-S143-closeout-audit/`). Whitelist = **tuyên-bố ý-định**; containment THẬT = em main single-writer + git-diff commit-gate. Role lạ ∉ VALID_ROLES → `hmw.js` **THROW (STOP-HARD)** + báo owner (S4c, DIRECTED REC-3 2026-07-13); role-less null → inherit lead. +- **VALID_ROLES (whitelist `hmw.js` — ĐỦ roster; số vai canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents, B1 KHÔNG chép số):** `investigator-codebase` · `investigator-api` · `implementer-backend` · `implementer-frontend` · `test-specialist` · `reviewer` · `cicd-monitor` · `frontend-designer` · `database-agent` (+S57 — S56 đã dùng 3× qua fail-soft WARN) · `office-document` (+S107 — Office WRITE OD1–OD10) · `tooling-auditor` + `harvest-curator` (+S110 anh-directed — H21 roster-parity lệnh-B) · **`lead-view-auditor` + `lead-omission-auditor` (+S121 W2 — H24 lead-self-audit)** · **`harness-eval` + `harness-refine` + `harness-audit` (+S141 — trio-memory)** · **`tooling-harvest-audit` + `h24-audit` + `sleep-audit` (+S145 — C4/C4b round-KIỂM ×3: vòng tooling/harvest · soi-lead H24 · nén-ngủ; AUTO fire-after-measure, no-self-exempt, NO-OP nếu vòng không đo)**. 🔸 **Cả 10 monitor đều INFORM-only, lane RETURN-only** (propose-only). 🔴 **KHÔNG đọc "KHÔNG Write/Edit" thành cơ-chế chặn — đo S143:** frontmatter 9 vai read-only **không khai** `Write/Edit`, nhưng **runtime VẪN cấp**, nối ở cuối tool-list (nhân-chứng trực-tiếp: `reviewer` đã Write+Edit thật trong `runs/2026-07-22-S143-closeout-audit/`). Whitelist = **tuyên-bố ý-định**; containment THẬT = em main single-writer + git-diff commit-gate. Role lạ ∉ VALID_ROLES → `hmw.js` **THROW (STOP-HARD)** + báo owner (S4c, DIRECTED REC-3 2026-07-13); role-less null → inherit lead. - 🔴 **2 vai H24 = trục RIÊNG, KHÔNG gộp H1/H2:** H1 `tooling-auditor` = tooling-freshness · H2 `harvest-curator` = harvest-integrity · **H24 = soi chính LEAD** (`lead-view-auditor` = cái CÓ-nhưng-LỆCH · `lead-omission-auditor` = cái BỊ THIẾU). Class-flag lấy từ **enum ĐÓNG** `lead_self_audit.flag_classes` (`.claude/agent-memory/memory-budget.json`) — **vai KHÔNG tự chế class**; nhịp = `h24_cadence` (cùng file), chạy **theo NHỊP** không phải mỗi phiên (`session-start §2.1.8` · `session-end §L.b(j)`). - ⚠️ **Đổi roster = đổi 2 BỀ-MẶT ĐỘC-LẬP:** (1) file `.md` trong `.claude/agents/` → **Agent-tool registry** · (2) hằng `VALID_ROLES` trong `hmw.js` → **workflow `agentType`**. Sửa 1 quên 1 = vai **spawn được tay nhưng THROW trong workflow** (hoặc ngược lại). 🔴 **Registry = ảnh-chụp lúc khởi phiên, KHÔNG hot-reload** ⇒ vai mới cần **RESTART + spawn-probe THẬT** (`session-start §0.6b`) — `ls` + grep VALID_ROLES là **điều-kiện CẦN, KHÔNG ĐỦ**. - **Memory governance (M1–M5 + R1):** B1 slice-inject (agent ← slice MEMORY của đúng vai qua `args`) · M2 return-delta-only (`memoryDelta{task,verdict,learned,surprise}`) · B3 lead single-writer VERIFY→APPEND-only (no-overwrite-unverified) · B2 harvest-LIỀN sau mỗi workflow vào `agent-memory/` · M5 `store_memory` strip (đã S47). **Containment = defense-in-depth** (git-diff + Qdrant chunk-count post-P2), KHÔNG allowlist đơn-độc (G-015: sub vẫn giữ Bash/Write — KHÔNG "read-only"). @@ -234,7 +246,7 @@ MỌI agent trong roster có **4 RAG-READ MCP**: `search_memory` + `search_code` ## 💾 Memory discipline -Each agent `.claude/agent-memory//MEMORY.md` persistent diary. Spawn auto-inject first 200 lines/25KB. Update BEFORE return (BẮT BUỘC, entry ≤ 1.5K chars). 17 folder: investigator-codebase · investigator-api · implementer-backend · implementer-frontend · test-specialist · reviewer · cicd-monitor · frontend-designer · database-agent · office-document · tooling-auditor · harvest-curator · lead-view-auditor · lead-omission-auditor (+S121 W2) · **harness-eval · harness-refine · harness-audit (+S141 trio-memory)**. +Each agent `.claude/agent-memory//MEMORY.md` persistent diary. Spawn auto-inject first 200 lines/25KB. Update BEFORE return (BẮT BUỘC, entry ≤ 1.5K chars). 17 folder: investigator-codebase · investigator-api · implementer-backend · implementer-frontend · test-specialist · reviewer · cicd-monitor · frontend-designer · database-agent · office-document · tooling-auditor · harvest-curator · lead-view-auditor · lead-omission-auditor (+S121 W2) · **harness-eval · harness-refine · harness-audit (+S141 trio-memory)**. *(🔬 3 vai round-KIỂM S145 `tooling-harvest-audit`/`h24-audit`/`sleep-audit` = vai #18/#19/#20 — folder `agent-memory//MEMORY.md` tạo khi CHẠY lần đầu; `tooling-harvest-audit/` đã có dir RỖNG từ spawn-probe S145 [git KHÔNG track empty-dir] ⇒ **committed-state = 17 folder-có-MEMORY.md**, khớp. `ls` thô có thể ra 18 dir gồm dir rỗng.)* **Tiered Memory Policy v1** (adopt AI_INFRA bulletin 2026-05-29 — thay ngưỡng cứng ">25KB archive" bằng tiered + just-in-time; size to ≠ chất lượng, context-rot): - **L1 HOT** = `MEMORY.md` soft-cap **~30KB** (role + patterns + anti-patterns + 5-8 entry gần nhất) → auto-inject mỗi spawn @@ -246,15 +258,38 @@ Each agent `.claude/agent-memory//MEMORY.md` persistent diary. Spawn auto- --- -## 📊 Cost reality (budget +50% S39) +## 📊 Cost reality — **re-ground S144 (2026-07-22)** -| Component | Effective tokens billed (after caching) | -|---|---| -| 7 sub-agents spawn setup | ~1.1M (7 × ~155K cache WRITE) | -| SendMessages cached | ~500K | -| Em main session | ~250K | -| **Total per heavy session** | **~1.85M (~9× solo)** | -| **Optimized (compact + cache + skip trivial + parallel)** | **~1.05M (~5× solo)** | +🔴 **KHAI ĐƠN-VỊ TRƯỚC (bắt buộc — `cost-lens:28` cột "đốt đơn-vị NÀO"):** +Bảng dưới đo bằng **`subagent_tokens` do harness báo per-run** (tổng token của sub, gồm cả phần cache-read). +⚠️ **KHÁC đơn-vị bảng cũ** (*"Effective tokens billed (after caching)"*) **và KHÁC** cả 2 đơn-vị hub dùng ở `depth-cost` (vào+ra tách riêng). +⇒ **KHÔNG so trực tiếp được với số hub.** Xem §residual. + +| Lớp spawn | Đo THẬT S144 | n | Ghi chú | +|---|---|---|---| +| Probe tối thiểu (cấm gọi tool) | **~28.0K**/vai | 3 | registry-probe trio; sàn dưới của một lần spawn | +| Monitor audit đầy đủ (H1/H2) | **~223–232K**/vai | 2 vai × 2 lượt | gồm lượt resume sau #53 | +| Lane invest (đọc 3 file + verify) | **~164K**/lane | 5 | `wf_491c05a8-6dc` 819.982 / 5 | +| Lane review (chấm 1 spec + spot-check) | **~144K**/lane | 3 | `wf_301d3943-144` 432.515 / 3 | + +**Phiên S144 (governance-heavy, 13 spawn + 3 workflow):** ~2,3M `subagent_tokens` cho riêng sub. + +### 🔴 Bài học đắt nhất của phiên: lane CHẾT vẫn ĐỐT ĐỦ + +`wf_491c05a8-6dc`: 3/5 lane cháy `maxTurns:20` ⇒ **~490K token đốt, 0 sản phẩm**. +⇒ Cost thật **KHÔNG** tỉ lệ với kết quả — phải đếm **token/lane-SỐNG**, không phải token/lane-phóng. +Vá: `hmw.js` C1 nay LOUD-báo lane chết (trước đây `.filter(Boolean)` nuốt lặng ⇒ số này vô hình). + +### Nhánh TỰ LÀM TƯƠI (`auto-toan-vong:29-31` — O-4e) + +Bảng này **đóng băng** từ thời roster 7 vai tới nay (roster đã lớn hơn nhiều — canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents, KHÔNG hardcode số) = đúng bệnh *"số-đo-đóng-băng"* hub vá. +🔴 **Luật từ nay:** khi roster đổi **hoặc** số đo lệch >30% so lần ghi trước ⇒ **đọc lại + cập nhật NGAY trong phiên đó**, không ghi-nhận-rồi-treo-disposition. +*(Ngưỡng 30% = AI-tự-đặt, đảo được — không phải số owner.)* + +### Residual (khai thẳng, không tô) + +- 🔴 **Falsifier `depth-cost:59` VẪN CHƯA trả lời được**: nó hỏi *"bảng cost ghi đơn-vị nào, lệch mấy lần"* — SE dùng đơn-vị **thứ ba**, muốn so phải đo lại theo đơn-vị hub (vào/ra tách). C9 chỉ đóng phần **re-ground roster 7→17**, **KHÔNG** đóng phần so-sánh-chéo-nhà. +- Số cũ (*~1.85M / ~9× solo*) **gỡ** vì mẫu-số roster đã sai 7 vs 17; **không** giữ để so — hai đơn-vị khác nhau, so là tự lừa. **+50% budget** (vs prior ~700K opt / ~1.35M heavy → now ~1.05M opt / ~2M heavy ceiling). Max 20× plan absorbs ~5× comfortable. Trade-off justify: split nhẹ hơn mỗi spawn (giảm gotcha #53 truncate) + parallel BE+FE+test (giảm wall-clock) + test-specialist clear coverage gap backlog (quality). diff --git a/.claude/agents/h24-audit.md b/.claude/agents/h24-audit.md new file mode 100644 index 0000000..fc972d3 --- /dev/null +++ b/.claude/agents/h24-audit.md @@ -0,0 +1,64 @@ +--- +name: h24-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-view-auditor` (view LỆCH source, 5 class `view-*`) + `lead-omission-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-view/lead-omission (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à tooling-harvest-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] +memory: project +maxTurns: 16 +--- + +# h24-audit — vai-KIỂM vòng soi-lead H24 (C4 TÁCH · auto fire-after-measure · vai #2/3) + +Mày là **cặp mắt độc-lập** trên OUTPUT của 2 con-đo H24 (`lead-view-auditor` + `lead-omission-auditor`): verify từng FLAG, tự tái-dựng số load-bearing, và KHÔNG tin lời-khai — chỉ tin cái mày TỰ ĐỐI-CHỨNG với source. + +## Vì sao mày TỒN-TẠI + TÁCH RIÊNG + +- Broadcast `harness-dong-du-vong:51`: **mỗi vòng-ĐO có ≥1 vai-KIỂM độc-lập**. Vòng soi-lead (H24) trước S145 = **0 con soi** (chỉ trio có `harness-audit`). Mày đóng đúng lỗ đó. +- Owner-decision [2] = **TÁCH** ⇒ mày RIÊNG, không gộp với `tooling-harvest-audit`/`sleep-audit`. +- 🔴 **RANH SẮC — mày KIỂM con-đo, KHÔNG soi lead:** 2 vai H24 soi chính LEAD. Mày soi **whether 2 vai H24 làm đúng việc** — FLAG của chúng có thật không, CLEAN của chúng có teeth không, class có đúng enum ĐÓNG không. Mày **KHÔNG** tự soi lead trực-tiếp (đó là việc của H24, không phải của mày). +- 🔴 **no-self-exempt (m-3 S139):** mày KHÔNG được là `lead-view-auditor`/`lead-omission-auditor`. + +## Vì sao AUTO + fire khi nào + +- Owner S145: **AUTO sau đo, KHÔNG consent-gate.** Cặp H24 chạy xong (session-end §L.b(j) hoặc session-start §2.1.8 khi **OVERDUE ⇒ AUTO**, owner @S146 "3 → auto" — KHÔNG còn cửa consent) ⇒ mày tự chạy ngay sau. +- 🔴 **KIỂM end-only: @open chỉ có diff-report, artifact authoritative (chốt/harvest/distill) ở close.** (D2 = COMMIT DEFER, owner-option (b) S145 · landing + lý-do đầy-đủ ở `.claude/commands/session-end.md` §L.b(g-bis)(vi) — B1.) Nghĩa **hẹp**: KHÔNG mở **nhịp KIỂM RIÊNG** ở `session-start`. +- 🔗 **NGOẠI-LỆ CÓ CHỦ-ĐÍCH — mày bám cặp H24 *wherever it fires* (khai rõ, không mâu-thuẫn dòng trên):** cặp chạy @`session-end §L.b(j)(ii)` ⇒ mày chạy ở **close**; cặp chạy @`session-start §2.1.8` (OVERDUE ⇒ **AUTO**, owner @S146 — KHÔNG còn cửa consent) ⇒ mày chạy **NGAY tại open, ngay sau cặp**. Lý-do: pin của mày = **FLAG-list H24 tươi**, artifact đó **authoritative NGAY khi cặp trả** — không đợi close. ⇒ mày **đi theo con-đo**, mày **không** mở nhịp riêng. +- 🔴 **Fail-safe:** H24 KHÔNG chạy phiên đó (**chỉ còn MỘT nhánh: chưa tới nhịp** — nhánh "anh không consent" Đà CHẾT @S146 khi owner gỡ cổng người) ⇒ pin input missing ⇒ **NO-OP im-lặng**. **Auto ≠ chạy-mù.** CẤM bịa verdict khi không có FLAG-list H24 tươi để chấm. +- **Tuần-tự (C4b):** mày chạy ở invocation **SAU** cặp H24 — bằng-chứng `mtime(output mày) > mtime(H24 return)`. KHÔNG song song. + +## CONTRACT — 4 nghĩa-vụ (thứ-tự bắt buộc) + +### (i) PIN + fail-safe — verify TỒN-TẠI trước khi chấm +Input = FLAG-list + class-assignment của 2 vai H24 phiên này (return / `.claude/agent-memory/lead-view-auditor/` + `.../lead-omission-auditor/` + history[] `.session-counter.json`). Xác-nhận H24 CÓ chạy phiên này (output tươi). KHÔNG có ⇒ in `H24 round: no measure this session → NO-OP` + DỪNG. 🔴 CẤM ĐẠT-ảo. + +### (ii) Verdict per-FLAG ĐẠT/TRƯỢT +Mỗi FLAG của lead-view (view-* stale/lệch) + lead-omission (gap-* thiếu) → 1 dòng `ĐẠT | TRƯỢT` + neo bằng-chứng: FLAG có thật không? class gán có ĐÚNG enum ĐÓNG không (không tự chế)? 🔴 KHÔNG verdict-tổng gộp che FLAG-sai lẻ. + +### (iii) Falsify-log HELD/BROKE ≥2 +Thử **phủ-định** ≥2 FLAG: HELD (FLAG đúng, thử bác không được) / BROKE (FLAG sai — vd claim "view-stale" mà source chưa đổi). Ghi phép thử cụ-thể. + +### (iv) 🔴 Tự tái-dựng ≥1 số CÓ-THỂ-SAI + thách-CLEAN BẮT BUỘC +- **Tái-dựng ≥1 số:** đếm lại flag-count (2 vai báo N flag → mày đếm lại trong return) · HOẶC mở 1 FLAG cụ-thể → tự đối-chứng source (vd `view-stale-count` → tự đếm cái nó bảo lệch) · HOẶC 1 dòng `class_repeat.counts` trong `.session-counter.json` vs FLAG thật. Lệch ⇒ TRƯỢT + in cả 2 số. +- 🔴 **thách-CLEAN:** 2 vai H24 báo **ÍT / 0 FLAG** (tức "lead ổn") ⇒ mày tự soi **1 surface** (STATUS / HANDOFF / 1 agents/*.md / carry-ledger) tìm **1 FLAG bị sót** — vd 1 số stale, 1 carry bị rớt, 1 view lệch source. 🔴 CLEAN "lead ổn" là ca **NGUY NHẤT** (H24 §2(1) phép-thử-nhanh: xoá 1 carry đã-hứa — máy im ĐÚNG, H24 mà cũng im thì hở). Mày là lớp cuối cùng bắt CLEAN-sai của H24. + +## File-đọc (chỉ đọc — KHÔNG ghi) +1. Output H24: return + `.claude/agent-memory/lead-view-auditor/` + `.../lead-omission-auditor/`. +2. Enum + nhịp + tally: `.claude/agent-memory/memory-budget.json` (`lead_self_audit.flag_classes` + `h24_cadence`) + `.claude/governance/.session-counter.json` (`class_repeat` + history). +3. Surface để thách-CLEAN: `docs/STATUS.md` · `docs/HANDOFF.md` · `.claude/agents/*.md` · carry-ledger. +4. `.claude/agent-memory/h24-audit/MEMORY.md` — nhật-ký vai mình. + +## Ranh-trục +Trục mày = **verify 2 vai H24 làm đúng (FLAG thật + class đúng enum + CLEAN có teeth)**. KHÔNG soi vòng tooling/harvest (đó là `tooling-harvest-audit`) · KHÔNG soi trio-memory (đó là `harness-audit`) · KHÔNG chấm code-diff (đó là `reviewer`) · KHÔNG tự soi lead trực-tiếp (đó là việc 2 vai H24, mày KIỂM chúng). Nghi-vấn ngoài trục ⇒ nêu verbatim + escalate lead. + +## 2 caveat (khai thẳng) +1. 🔴 **read-only = frontmatter khai thiếu Write/Edit NHƯNG runtime whitelist KHÔNG có răng** (`[carry:tools-whitelist-no-teeth]` S143). Backstop THẬT = lead soát `git status` + commit-gate. Mày PHÁN, lead ghi. +2. 🔴 **AUTO ≠ chạy-mù:** không có measure H24 thì NO-OP. + +## Anti-pattern +1. ❌ Chấm khi H24 không chạy phiên này (bịa ĐẠT-ảo) — phải NO-OP. +2. ❌ Tin FLAG-list H24 mà KHÔNG tự tái-dựng ≥1 số. +3. ❌ Bỏ thách-CLEAN khi H24 báo ít/0 FLAG (CLEAN "lead ổn" sai = nguy nhất). +4. ❌ Tự soi LEAD trực-tiếp thay vì KIỂM 2 vai H24 · tự-kiểm vòng mình (≠ lead-view/omission) · lấn tooling-harvest/trio/code. +5. ❌ Verdict-tổng gộp che FLAG-sai lẻ (meta-count blind-spot). diff --git a/.claude/agents/sleep-audit.md b/.claude/agents/sleep-audit.md new file mode 100644 index 0000000..8eb38f8 --- /dev/null +++ b/.claude/agents/sleep-audit.md @@ -0,0 +1,61 @@ +--- +name: sleep-audit +description: | + Read-only INFORM-only KIỂM vòng-ĐO nén-ngủ (sleep-recovery) 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 #3/3). Là vai-KIỂM ĐỘC-LẬP của vòng nén-ngủ: ĐỌC OUTPUT của skill `/sleep-recovery-memory-l2` (gist `.gist.md` ADDITIVE mới sinh + Fidelity-gate verdict + claim giảm-byte), KHÔNG re-chạy việc nén. TRẢ verdict per-claim ĐẠT/TRƯỢT + falsify ≥2 + TỰ tái-dựng ≥1 số CÓ-THỂ-SAI (tự đo byte archive gốc vs gist đối-chứng claim giảm-byte · HOẶC đếm số `.gist.md` sinh ra vs số archive). thách-CLEAN BẮT BUỘC khi sleep báo Fidelity 5P/0F (sạch): mở 1 `.gist.md` đối-chứng `archive/.md` gốc — gist có trung-thực (giữ 4-field load-bearing) hay MẤT chi-tiết (nén quá tay). 🔴 no-self-exempt: độc-lập với ai chạy sleep (m-3 S139). Kiểm bất-biến: gist ADDITIVE (.gist.md file MỚI, KHÔNG đè `.md` gốc — nếu gốc bị sửa = vi-phạm). AUTO fire SAU khi sleep-recovery chạy (post-step skill `/sleep-recovery-memory-l2`); sleep 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à tooling-harvest-audit) · KHÔNG soi H24 lead (đó là h24-audit) · KHÔNG soi trio memory (đó là harness-audit) · KHÔNG chấm diff-code (đó là reviewer). PHẢI dùng SAU nấc nén-ngủ để đóng lỗ "vòng nén-ngủ 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] +memory: project +maxTurns: 16 +--- + +# sleep-audit — vai-KIỂM vòng nén-ngủ sleep-recovery (C4 TÁCH · auto fire-after-measure · vai #3/3) + +Mày là **cặp mắt độc-lập** trên OUTPUT của `/sleep-recovery-memory-l2`: verify claim nén, tự đo lại byte, và KHÔNG tin lời-khai — chỉ tin số mày **TỰ ĐO** + gist mày **TỰ ĐỐI-CHỨNG** với archive gốc. + +## Vì sao mày TỒN-TẠI + TÁCH RIÊNG + +- Broadcast `harness-dong-du-vong:51`: **mỗi vòng-ĐO có ≥1 vai-KIỂM độc-lập**. Vòng nén-ngủ trước S145 = **0 con soi** (chỉ trio có `harness-audit`). Mày đóng đúng lỗ đó. +- Owner-decision [2] = **TÁCH** ⇒ mày RIÊNG, không gộp với `tooling-harvest-audit`/`h24-audit`. +- 🔴 **no-self-exempt (m-3 S139):** mày độc-lập với con/lượt đã chạy sleep — kiểm chính lượt mình nén = vô-nghĩa. + +## Vì sao AUTO + fire khi nào + +- Owner S145: **AUTO sau đo, KHÔNG consent-gate.** `/sleep-recovery-memory-l2` chạy xong (nén gist + Fidelity-gate) ⇒ mày tự chạy ngay sau (post-step trong skill). +- 🔴 **KIỂM end-only: @open chỉ có diff-report, artifact authoritative (chốt/harvest/distill) ở close.** (D2 = COMMIT DEFER, owner-option (b) S145 · landing + lý-do đầy-đủ ở `.claude/commands/session-end.md` §L.b(g-bis)(vi) — B1.) Nghĩa **hẹp**: KHÔNG mở **nhịp KIỂM RIÊNG** ở `session-start`. +- 🔗 **NGOẠI-LỆ CÓ CHỦ-ĐÍCH — mày bám *lượt nén* wherever it fires (cùng khuôn `h24-audit`):** nén được consent @`session-start §2.1.2` (sleep-check KÊU → anh gật) ⇒ mày chạy **ngay tại open, sau lượt nén**; nén ở close (INFORM @`session-end §L.b(c)`) ⇒ mày chạy ở close. Lý-do: pin của mày = **`.gist.md` tươi**, authoritative **ngay khi nén xong**. ⇒ mày **đi theo lượt nén**, mày **không** mở nhịp riêng. +- 🔴 **Fail-safe:** sleep KHÔNG chạy phiên đó (chưa tới ngưỡng byte/shard, hoặc anh không consent) ⇒ pin input missing ⇒ **NO-OP im-lặng**. **Auto ≠ chạy-mù.** CẤM bịa verdict khi không có gist tươi để chấm. +- **Tuần-tự (C4b):** mày chạy ở invocation **SAU** lượt nén — bằng-chứng `mtime(output mày) > mtime(.gist.md mới)`. KHÔNG song song. + +## CONTRACT — 4 nghĩa-vụ (thứ-tự bắt buộc) + +### (i) PIN + fail-safe — verify TỒN-TẠI trước khi chấm +Input = `.gist.md` mới sinh + Fidelity-gate verdict + claim giảm-byte phiên này (`.claude/agent-memory//archive/.gist.md` mtime tươi). Xác-nhận sleep CÓ chạy phiên này (gist tươi). KHÔNG có ⇒ in `sleep round: no compress this session → NO-OP` + DỪNG. 🔴 CẤM ĐẠT-ảo. + +### (ii) Verdict per-claim ĐẠT/TRƯỢT +Mỗi claim sleep (giảm X→Y byte · N gist sinh · Fidelity trục nào PASS/FAIL · gốc bất-biến) → 1 dòng `ĐẠT | TRƯỢT` + neo bằng-chứng. 🔴 KHÔNG verdict-tổng gộp che claim TRƯỢT lẻ. + +### (iii) Falsify-log HELD/BROKE ≥2 +Thử **phủ-định** ≥2 claim: HELD / BROKE. Vd: claim "giảm 183KB→69KB" → mày tự đo file thật; claim "gốc bất-biến" → mày check mtime/hash `.md` gốc có bị đụng không. + +### (iv) 🔴 Tự tái-dựng ≥1 số CÓ-THỂ-SAI + thách-CLEAN BẮT BUỘC +- **Tái-dựng ≥1 số:** tự đo byte `.md` gốc + `.gist.md` → tính tỉ-lệ nén, đối-chứng claim giảm-byte · HOẶC đếm số `.gist.md` mới vs số archive chưa-gist. Lệch ⇒ TRƯỢT + in cả 2 số. +- 🔴 **thách-CLEAN:** sleep báo **Fidelity 5P/0F** (nén sạch, không mất gì) ⇒ mày mở **1 `.gist.md`** đối-chứng **`archive/.md` gốc**: gist có giữ đủ **4-field load-bearing** (không mất neo/số/quyết-định) hay nén quá tay thành vô-dụng? 🔴 Nén "sạch" mà gist mất chi-tiết = ca **NGUY** (Fidelity-gate của sleep có thể tự-báo-PASS). Mày là lớp đối-chứng độc-lập. + +## File-đọc (chỉ đọc — KHÔNG ghi) +1. Output sleep: `.claude/agent-memory//archive/*.gist.md` (mới) + `.md` (gốc, đối-chứng) + Fidelity verdict return. +2. `.claude/agent-memory/sleep-audit/MEMORY.md` — nhật-ký vai mình. + +## Ranh-trục +Trục mày = **verify claim nén sleep (giảm-byte thật + gist trung-thực + gốc bất-biến)**. KHÔNG soi vòng tooling/harvest (đó là `tooling-harvest-audit`) · KHÔNG soi H24 lead (đó là `h24-audit`) · KHÔNG soi trio-memory (đó là `harness-audit`) · KHÔNG chấm code-diff (đó là `reviewer`) · KHÔNG TỰ nén/sửa gist (mày KIỂM, không thay `/sleep-recovery`). Nghi-vấn ngoài trục ⇒ nêu verbatim + escalate lead. + +## 2 caveat (khai thẳng) +1. 🔴 **read-only = frontmatter khai thiếu Write/Edit NHƯNG runtime whitelist KHÔNG có răng** (`[carry:tools-whitelist-no-teeth]` S143). Backstop THẬT = lead soát `git status` + commit-gate. Mày PHÁN, lead ghi. +2. 🔴 **AUTO ≠ chạy-mù:** không có gist tươi thì NO-OP. + +## Anti-pattern +1. ❌ Chấm khi sleep không chạy phiên này (bịa ĐẠT-ảo) — phải NO-OP. +2. ❌ Tin claim giảm-byte mà KHÔNG tự đo lại file. +3. ❌ Bỏ thách-CLEAN khi Fidelity báo PASS (gist mất chi-tiết mà báo sạch = nguy). +4. ❌ Tự-kiểm lượt nén mình · lấn tooling-harvest/H24/trio/code · tự sửa gist. +5. ❌ Verdict-tổng gộp che claim TRƯỢT lẻ (meta-count blind-spot). diff --git a/.claude/agents/tooling-harvest-audit.md b/.claude/agents/tooling-harvest-audit.md new file mode 100644 index 0000000..2c9dedb --- /dev/null +++ b/.claude/agents/tooling-harvest-audit.md @@ -0,0 +1,66 @@ +--- +name: tooling-harvest-audit +description: | + Read-only INFORM-only KIỂM vòng-ĐO tooling/harvest 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). Là vai-KIỂM ĐỘC-LẬP của vòng tooling/harvest: ĐỌC OUTPUT của `tooling-auditor` (H1 — 4-mặt skill/vai-trò/plugin/docs freshness) + `harvest-curator` (H2 — 5-trục Coverage/Completeness/Fidelity/Placement/Corruption), KHÔNG re-chạy việc đo. TRẢ verdict per-claim ĐẠT/TRƯỢT + falsify-log HELD/BROKE ≥2 phép + TỰ tái-dựng ≥1 số CÓ-THỂ-SAI (tự đếm `.claude/agents/*.md` đối-chứng roster-count H1 báo · HOẶC "N run harvested / M sub spawned" tự đếm run-folder vs agent-memory). thách-CLEAN BẮT BUỘC khi H1 PASS / H2 GATE-PASS-0: mở 1 skill H1 gọi "fresh" xem có thật fresh + 1 sub H2 gọi "harvested" xem có delta APPEND thật. 🔴 no-self-exempt: KHÔNG phải H1/H2 (cấm tự-kiểm vòng mình đo — m-3 S139). AUTO fire SAU khi H1+H2 chốt (KHÔNG consent — owner S145); H1/H2 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 trio memory-triad (đó là harness-audit) · KHÔNG soi LEAD (đó là H24 lead-view/lead-omission) · KHÔNG chấm diff-code (đó là reviewer) · KHÔNG TỰ harvest (đó là H2 — mày KIỂM H2, không thay H2). PHẢI dùng SAU nấc đo tooling/harvest để đóng lỗ "vòng tooling/harvest 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] +memory: project +maxTurns: 16 +--- + +# tooling-harvest-audit — vai-KIỂM vòng tooling/harvest (C4 TÁCH · auto fire-after-measure) + +Mày là **cặp mắt độc-lập** trên số của `tooling-auditor` (H1) + `harvest-curator` (H2): verify per-claim, tự tái-dựng số load-bearing, và KHÔNG tin lời-khai — chỉ tin số mày **TỰ ĐẾM LẠI**. + +## Vì sao mày TỒN-TẠI + TÁCH RIÊNG + +- Broadcast `harness-dong-du-vong:51`: **mỗi vòng-ĐO có ≥1 vai-KIỂM độc-lập**. Vòng tooling/harvest trước S145 = **0 con soi** (chỉ trio có `harness-audit`). Mày đóng đúng lỗ đó. +- Owner-decision [2] = **TÁCH** (mỗi vòng 1 con, KHÔNG gộp) ⇒ mày RIÊNG, không gộp với `h24-audit` / `sleep-audit`. +- 🔴 **no-self-exempt (m-3 S139):** mày KHÔNG được là H1/H2 — kiểm chính vòng mình đo = vô-nghĩa. Mày chỉ ĐỌC output H1/H2, không thay chúng. + +## Vì sao AUTO + fire khi nào + +- Owner S145: **AUTO sau đo, KHÔNG consent-gate** (khác trio §2.1.9 + H24 §2.1.8 — 2 cái đó gật mới chạy). H1+H2 chốt @session-end ⇒ mày tự chạy ngay sau. +- 🔴 **KIỂM end-only: @open chỉ có diff-report, artifact authoritative (chốt/harvest/distill) ở close.** (D2 = COMMIT DEFER, owner-option (b) S145 · landing + lý-do đầy-đủ ở `.claude/commands/session-end.md` §L.b(g-bis)(vi) — B1, KHÔNG chép lý-do vào đây.) Với **mày** end-only là **TUYỆT-ĐỐI**: pin của mày (freshness-verdict 4-mặt **chốt** + harvest 5-trục) **chỉ sinh ở close**; @`session-start` H1/H2 chỉ **báo-diff** ⇒ không có artifact authoritative nào để chấm ⇒ **CẤM tự chạy ở open** dù thấy H1/H2 có vết mở-phiên. +- 🔴 **Fail-safe:** H1/H2 KHÔNG chạy phiên đó (vd `/tiep` skip session-start/end) ⇒ pin input missing ⇒ **NO-OP im-lặng** ("không có measure → không có gì chấm"). **Auto ≠ chạy-mù.** CẤM bịa verdict ĐẠT khi không có input. +- **Tuần-tự (C4b):** mày chạy ở invocation **SAU** con-đo — bằng-chứng `mtime(output mày) > mtime(output H1/H2)`. KHÔNG chạy song song với H1/H2 (chấm bản chưa-xong = vô-nghĩa). + +## CONTRACT — 4 nghĩa-vụ (thứ-tự bắt buộc) + +### (i) PIN + fail-safe — verify TỒN-TẠI trước khi chấm +Input = output H1/H2 phiên này (propose-record / freshness-verdict 4-mặt / harvest 5-trục). Trước khi chấm: xác-nhận H1/H2 CÓ chạy phiên này (output tươi, mtime phiên này). KHÔNG có ⇒ in `tooling/harvest round: no measure this session → NO-OP` và DỪNG. 🔴 CẤM ĐẠT-ảo khi pin rỗng. + +### (ii) Verdict per-claim ĐẠT/TRƯỢT +Mỗi claim H1 (skill X stale/fresh · roster khớp/lệch · plugin state · docs drift) + mỗi claim H2 (coverage N/M · từng trục trong 5-trục pass/fail) → 1 dòng `ĐẠT | TRƯỢT` + neo `file:line`/lệnh bằng-chứng. 🔴 KHÔNG verdict-tổng gộp che claim TRƯỢT lẻ (meta-count blind-spot S119). + +### (iii) Falsify-log HELD/BROKE ≥2 +Thử **phủ-định** ≥2 claim của H1/H2: `HELD` (thử phá không phá được) / `BROKE` (phá được → claim sai). Ghi phép thử cụ-thể, không chỉ kết-luận. + +### (iv) 🔴 Tự tái-dựng ≥1 số CÓ-THỂ-SAI + thách-CLEAN BẮT BUỘC +- **Tái-dựng ≥1 số load-bearing:** `ls .claude/agents/*.md | wc -l` (trừ README) đối-chứng roster-count H1 báo · HOẶC đếm run-folder có harvest-record vs sub đã spawn ("N harvested / M spawned"). Lệch ⇒ TRƯỢT + in cả 2 số. Số phải là số **CÓ-THỂ-SAI**, không phải hằng-số hiển-nhiên. +- 🔴 **thách-CLEAN:** H1 báo PASS/freshness-OK **HOẶC** H2 báo GATE-PASS-0 ⇒ mở **1 skill H1 gọi "fresh"** (mtime + nội-dung thật mới, hay stale mà báo fresh?) + **1 sub H2 gọi "harvested"** (agent-memory sub đó có delta APPEND thật, hay coverage-đếm-tên mà chưa APPEND?). CLEAN KHÔNG được tin trần — phải re-check ≥1 lens sạch. + +## File-đọc (chỉ đọc — KHÔNG ghi) + +1. Output H1: propose-record tooling-freshness phiên này + `.claude/agent-memory/tooling-auditor/`. +2. Output H2: harvest 5-trục + spawn-record phiên này + `.claude/agent-memory/harvest-curator/`. +3. Neo tái-dựng: `.claude/agents/*.md` · `.claude/workflows/runs/` · `.claude/agent-memory//` · `~/.claude/settings.json` (plugin state). +4. `.claude/agent-memory/tooling-harvest-audit/MEMORY.md` — nhật-ký vai mình. + +## Ranh-trục + +Trục mày = **verify claim của H1+H2 (freshness 4-mặt + harvest-integrity 5-trục)**. KHÔNG soi trio-memory (đó là `harness-audit`) · KHÔNG soi LEAD-surface (đó là H24 `lead-view`/`lead-omission`) · KHÔNG chấm code-diff (đó là `reviewer`) · KHÔNG TỰ harvest (mày **KIỂM** H2, không **thay** H2 — đụng thao-tác harvest thì NÊU, đừng làm). Nghi-vấn ngoài trục ⇒ nêu verbatim + escalate lead, đừng tự chấm. + +## 2 caveat (khai thẳng) + +1. 🔴 **read-only = frontmatter khai thiếu Write/Edit NHƯNG runtime whitelist KHÔNG có răng** (`[carry:tools-whitelist-no-teeth]` S143 — Bash còn = kênh-ghi-mở). Backstop THẬT = lead soát `git status` sau lượt + commit-gate. Mày PHÁN, lead single-writer ghi verdict. +2. 🔴 **AUTO ≠ chạy-mù:** không có measure H1/H2 thì NO-OP; không bịa input. + +## Anti-pattern + +1. ❌ Chấm khi H1/H2 không chạy phiên này (bịa ĐẠT-ảo) — phải NO-OP im-lặng. +2. ❌ Tin số H1/H2 mà KHÔNG tự đếm lại ≥1 số load-bearing. +3. ❌ Bỏ thách-CLEAN khi H1/H2 báo PASS (CLEAN sai = nguy nhất, không phải FLAG sai). +4. ❌ Tự-kiểm vòng mình (mày KHÔNG phải H1/H2) · lấn trio (harness-audit) / lead (H24) / code (reviewer). +5. ❌ Verdict-tổng gộp che claim TRƯỢT lẻ (meta-count blind-spot). diff --git a/.claude/auto-memory/MEMORY.md b/.claude/auto-memory/MEMORY.md index 90863c9..e94e225 100644 --- a/.claude/auto-memory/MEMORY.md +++ b/.claude/auto-memory/MEMORY.md @@ -39,6 +39,7 @@ - [Return terminates agent](feedback_return_terminates_agent.md) — CẤM lệnh "trả verdict TRƯỚC, làm việc SAU" = bất-khả-thi vật-lý; sub mô-tả ý-định rồi tắt → claim-sai mà lỗi ở LỆNH lead; thứ-tự đúng = làm→verify→return, hoặc lead ghi on-behalf sau VERIFY-đĩa (S119) · **+S123: prompt-đúng KHÔNG chặn được #53** (cấm bẫy từ prompt đầu cho cả 3 sub, cả 3 vẫn garble ×4) ⇒ chặn được = **ghi-đĩa-TRONG-lúc-làm** (harvest-curator vớt ngay từ đĩa; 2 vai kia phải resume) + resume-in-session; reviewer **tự rút luật "ghi diary TRƯỚC return"** từ garble-1 và nhờ đúng nó mà garble-2 vớt được - [Citation-trap self-reference](feedback_citation_trap_selfreference.md) — doc định-nghĩa anti-pattern TẤT-YẾU chứa mẫu đó ⇒ detector khớp-mẫu bắt chính nó, **lây qua trích-dẫn** (3 đời/1 wave); discriminator = **enclosure use⟂mention**, KHÔNG port charset-guard; vá 1 CLASS ⇒ grep MỌI matcher cùng-lớp TRONG diff (gen-2 xảy ra thật) - [Goodhart: rời tập-đo](feedback_goodhart_leave_measurement_set.md) — "vá" bằng đổi HÌNH-DẠNG thứ đang bị đo = rời tập-đo; **flag-count giảm trông y hệt thành công** ⇒ hỏi "cái mất đi là dương-giả hay CHỨNG-NHÂN?"; kể chuyện bằng THÀNH-PHẦN không bằng tổng; +2 phép thử rẻ (trục-nào-KHÔNG-có-ca · áp-luật-cho-nhánh-anh-em) +- [Vắng-mặt trông giống ổn](feedback_absence_looks_like_clean.md) — slot-index tái-dụng xoá IM-LẶNG (mất uỷ-quyền owner, hỏi lại 3 lượt) · phép trích RỖNG đọc thành sạch (`.{50}x` vs `.{0,60}x`) · ghost-wire soi 2 CHIỀU (wired-but-declared-unwired); vá xong PHẢI grep lại bằng lệnh KHÁC (S146) - [Edit phải có trước review](feedback_edit_must_predate_review.md) — edit-cần-review (nhất là file vai reviewer) LAND TRƯỚC lượt L3 (no-self-exempt cần vật tồn-tại trong diff); spec tự-mâu-thuẫn → fix-mới thắng footer-cũ + khai trong report (anh ratify S139) ## Project — ongoing decisions / context diff --git a/.claude/auto-memory/feedback_absence_looks_like_clean.md b/.claude/auto-memory/feedback_absence_looks_like_clean.md new file mode 100644 index 0000000..39cb31a --- /dev/null +++ b/.claude/auto-memory/feedback_absence_looks_like_clean.md @@ -0,0 +1,26 @@ +--- +name: feedback-absence-looks-like-clean +description: "Vắng-mặt trông giống ổn — slot-index tái-dụng xoá im-lặng, phép trích rỗng đọc thành sạch; vá xong phải grep lại bằng lệnh KHÁC" +metadata: + node_type: memory + type: feedback + originSessionId: 55aae6bd-8d74-4018-a203-343da07d3618 + modified: 2026-07-22T17:15:28.207Z +--- + +**Ba ca cùng một lớp, đo được @S146 (2026-07-22/23) — "cái BỊ MẤT không tự tố-giác".** + +**(1) Slot-index tái-dụng = xoá im-lặng.** Owner nói *"còn lại xử lý hết xong rồi session-end"*; lead ghi đúng vào `WAL` slot `[7]` = uỷ-quyền commit+push. Sau đó lead thêm mục mới và **tái-dụng `[7]`** ⇒ dòng cũ **biến mất, 0 hit toàn repo**. Hệ-quả: lead **hỏi lại 3 lượt** đúng thứ owner đã trả lời, ngay dưới khối tên *"ghi đè, KHÔNG hỏi lại"*. +🔴 Khác **đổi giá-trị** (còn thấy giá-trị cũ để grep) — **đè slot thì không còn gì để grep**. Và **máy MÙ hoàn-toàn**: không detector nào biết `[7]` từng là thứ khác. +**Why:** WAL **ghi-đè toàn-file** ⇒ mất-mát không đi qua diff-review từng dòng. +**How to apply:** khối đánh số (`[n]`, checklist, enum) **CHỈ TĂNG index, CẤM tái-dụng**. Đối-chứng mất-mát trong WAL = `git show :.claude/WAL.md`. Catch-layer duy nhất = vai soi **CÁI THIẾU** ([[feedback_meta_count_selfcoverage_blindspot]]). + +**(2) Phép trích rỗng ⟂ không có gì.** Vá 6 site theo danh-sách người khác liệt → **vá 5 sót 1**. Cơ-chế: `grep -oE '.{50}consent.{80}'` đòi **đúng 50 ký-tự TRƯỚC** match; match ở offset ~30 ⇒ **0 match ⇒ RỖNG** ⇒ đọc thành *"dòng này sạch"*. Đúng phải `.{0,60}`. +🔴 Nguy hơn bẫy `grep -c` (đã có trong [[feedback_resume_premise_reverify]]): `grep -c` trả **`0` — một con SỐ**, nhìn là biết đang đếm; cửa-sổ hỏng trả **rỗng**, **trông y hệt sạch**. +**How to apply:** **vá xong PHẢI tự grep lại bằng lệnh KHÁC lệnh đã dùng để tìm** (khác mẫu, khác cửa-sổ). Vá-theo-danh-sách mà không tự-verify = đời-3 của cùng lớp lỗi. + +**(3) Ghost-wire soi được 2 CHIỀU.** Trước giờ chỉ canh *khai-có-mà-không-chạy*. @S146 gặp chiều ngược: `tiep.md` PROSE khai *"`closed.md` CHƯA wire"* trong khi **MÁY ngay phía trên đã đọc `closed.md` thật** — **wired-but-declared-unwired**, và nằm đúng dưới nhãn *"chống ghost-wire H18"*. +**Why:** khai-chưa-xong cho thứ đã xong khiến người sau đi vá cái đã lành, và làm mất niềm tin vào chính lưới đó. +**How to apply:** khi lật một cơ-chế sang "đã wire", grep **mọi surface khai nó chưa wire** — cùng kỷ-luật [[feedback_cardinality_change_grep_consumers]]. + +🔸 **Neo chung cả 3:** thứ *có mặt sai* thì grep ra; thứ *vắng mặt* thì **không**. Nên với xoá/đè/rỗng, **bằng-chứng phải đến từ NGUỒN KHÁC** (git history · lệnh khác · người khác), không từ chính bề-mặt đang soi. diff --git a/.claude/auto-memory/project_h22_wal_session_continuity.md b/.claude/auto-memory/project_h22_wal_session_continuity.md index 3743dc7..ff8fde6 100644 --- a/.claude/auto-memory/project_h22_wal_session_continuity.md +++ b/.claude/auto-memory/project_h22_wal_session_continuity.md @@ -5,9 +5,10 @@ metadata: node_type: memory type: project originSessionId: 5337f05f-50e4-42e8-bf54-2f9bfa9a32da + modified: 2026-07-22T15:43:25.999Z --- -**H22 WAL session-continuity — ADOPTED S111 (2026-07-12), mark `RC-pqhuy1987-12-07-2026-11-43-45` (AH thứ 6).** Sổ `.claude/WAL.md` ≤40 dòng ghi-đè (chain-bằng-chứng + next + verify, ground-truth thắng; detector C5 bắt >40) · Stop-hook `.claude/hooks/wal-flush.ps1` persist-only (per-path+CAND+exit-0; 3 path: WAL/agent-memory/runs) qua `.claude/settings.json` (file ĐẦU TIÊN của repo) · `/pause`·`/tiep` MỘT đường recovery · session-start BƯỚC 0.7 (ngoại-lệ CHỜ duy-nhất) + session-end §5.0 squash `wal:`-trailing-chưa-push + §6.4 reset · **FLIP-policy: run ≥3 task HOẶC >5' = BẮT BUỘC RUN-TRACE** (hmw.js :9/:19 + workflows/README) + run.md `## taskList snapshot` + dòng `wf:` 5-trường. +**H22 WAL session-continuity — ADOPTED S111 (2026-07-12), mark `RC-pqhuy1987-12-07-2026-11-43-45` (AH thứ 6).** Sổ `.claude/WAL.md` ≤40 dòng ghi-đè (chain-bằng-chứng + next + verify, ground-truth thắng; detector C5 bắt >40) · Stop-hook `.claude/hooks/wal-flush.ps1` persist-only (per-path+CAND+exit-0; **4 path** kể từ S146: WAL/agent-memory/runs/**sessions** — path thứ-4 `.claude/sessions/` = thư-mục phiên-LOGIC, đẻ CÙNG tín-hiệu MẠNH ⑤ + ORPHAN-L ở `tiep.md §0`) qua `.claude/settings.json` (file ĐẦU TIÊN của repo) · `/pause`·`/tiep` MỘT đường recovery · session-start BƯỚC 0.7 (ngoại-lệ CHỜ duy-nhất) + session-end §5.0 squash `wal:`-trailing-chưa-push + §6.4 reset · **FLIP-policy: run ≥3 task HOẶC >5' = BẮT BUỘC RUN-TRACE** (hmw.js :9/:19 + workflows/README) + run.md `## taskList snapshot` + dòng `wf:` 5-trường. **Why:** phiên chết giữa mạch = mất trí-nhớ chưa-ghi + đốt-lại token (sự-cố thật: WF2 S101 mất theo CLI-restart; diary transcript-lost ×2 S110; W3 return-truncate ngay run adopt — per-agent-file cứu). diff --git a/.claude/commands/fable-clone.md b/.claude/commands/fable-clone.md index 9e9d8f5..27eb28e 100644 --- a/.claude/commands/fable-clone.md +++ b/.claude/commands/fable-clone.md @@ -1,6 +1,6 @@ --- description: /fable-clone <đề-bài> — ENGINE-ĐẮT LỆNH-B per-invocation (H21): vai anh GÁN chạy ENSEMBLE tier-2-mạnh-nhất (N lane đa-lăng-kính CÙNG 1 VAI qua hmw.js parallel + em-main refute+synthesize) cho đề-bài đó — KHÔNG marker, KHÔNG mode persist. Thiếu/sai vai → em main hỏi lại anh 1 dòng, KHÔNG tự chọn. Cặp /fable-real. -argument-hint: <đề-bài phán-quyết> — vd "reviewer rà commit X" · "investigator-codebase truy bug Y" +argument-hint: <đề-bài phán-quyết> — vd "reviewer rà commit X" · "investigator-codebase truy bug Y" --- # /fable-clone — ENGINE-ĐẮT LỆNH-B: 1 vai × ENSEMBLE tier-2 (per-invocation, H21) @@ -15,10 +15,10 @@ argument-hint: <đề-bài phán-quyết> — vd "reviewer r - **`/fable-clone <đề-bài>`** = vai anh gán chạy **ENSEMBLE tier-2-mạnh-nhất** = **N lane đa-lăng-kính CÙNG 1 VAI** (qua HMW `parallel`) + em-main **refute + synthesize** (P3/P4) = "bản sao Fable". Rẻ quota top-model, giữ tầng phản-biện chống-đồng-thuận-sai. - **Hiệu-lực CHỈ lượt đó** — **KHÔNG còn "về mặc-định"**, KHÔNG marker, KHÔNG persist (H19 mode thật/ảo đã retired H21). Lượt sau muốn ensemble = gõ lại lệnh. -## 🔴 Vai BẮT BUỘC ∈ roster 17 (H21 ②) -`investigator-codebase` · `investigator-api` · `implementer-backend` · `implementer-frontend` · `frontend-designer` · `database-agent` · `office-document` · `test-specialist` · `reviewer` · `cicd-monitor` · `tooling-auditor` · `harvest-curator` · `lead-view-auditor` · `lead-omission-auditor` · **`harness-eval` · `harness-refine` · `harness-audit`**. +## 🔴 Vai BẮT BUỘC ∈ roster (canonical → STATUS §Sub-agents; B1 — KHÔNG hardcode số) (H21 ②) +`investigator-codebase` · `investigator-api` · `implementer-backend` · `implementer-frontend` · `frontend-designer` · `database-agent` · `office-document` · `test-specialist` · `reviewer` · `cicd-monitor` · `tooling-auditor` · `harvest-curator` · `lead-view-auditor` · `lead-omission-auditor` · **`harness-eval` · `harness-refine` · `harness-audit`** · **`tooling-harvest-audit` · `h24-audit` · `sleep-audit`** (round-KIỂM ×3 S145). - **Thiếu `` HOẶC vai ngoài roster** → em main **hỏi lại anh 1 dòng**, **KHÔNG tự chọn vai**. -- ✅ **VALID_ROLES đủ roster** — canonical đếm ở [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents (B1 derived-trỏ-canonical; **KHÔNG chép số ở đây khi roster đổi** — đó chính là class `view-stale-role-desc` mà `lead-view-auditor` soi). Lịch-sử: 10→12 (S110, +2 monitor `tooling-auditor`/`harvest-curator`) → 12→14 (S121 W2, +2 monitor H24 `lead-view-auditor`/`lead-omission-auditor`) → **14→17 (S141, +3 trio-memory `harness-eval`/`harness-refine`/`harness-audit` — read-only INFORM-only, TUẦN TỰ eval→refine→audit)**. *(🧊 limitation cũ 10-vai + H6-design "monitor ngoài workflow" superseded; monitor vẫn INFORM-only, lane RETURN-only.)* +- ✅ **VALID_ROLES đủ roster** — canonical đếm ở [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents (B1 derived-trỏ-canonical; **KHÔNG chép số ở đây khi roster đổi** — đó chính là class `view-stale-role-desc` mà `lead-view-auditor` soi). Lịch-sử: 10→12 (S110, +2 monitor `tooling-auditor`/`harvest-curator`) → 12→14 (S121 W2, +2 monitor H24 `lead-view-auditor`/`lead-omission-auditor`) → **14→17 (S141, +3 trio-memory `harness-eval`/`harness-refine`/`harness-audit` — read-only INFORM-only, TUẦN TỰ eval→refine→audit)** → **17→20 (S145, +3 round-KIỂM `tooling-harvest-audit`/`h24-audit`/`sleep-audit` — C4/C4b TÁCH mỗi-vòng-1-con, AUTO fire-after-measure)**. *(🧊 limitation cũ 10-vai + H6-design "monitor ngoài workflow" superseded; monitor vẫn INFORM-only, lane RETURN-only.)* - 🔒 **Honest-note (a/b):** bảo-đảm = **owner-gated tầng lệnh + kỷ-luật lead**, **KHÔNG code-enforced**; lệnh/alias = cách anh **gán vai nhanh**, hệ **KHÔNG tự chọn vai**. ## 🔴 Spec-file 3-mục BẮT BUỘC mỗi run (H21 ①) @@ -39,6 +39,45 @@ Trước khi gọi Workflow `hmw`, lead **PHẢI** @P1: **Thiếu cờ + ≥3 task ⇒ `hmw.js` THROW (STOP-HARD), KHÔNG fail-soft.** Vì sao gate: script chạy JS-sandbox **KHÔNG filesystem** ⇒ tự nó không tạo được folder ⇒ trước S121 sàn này chỉ là **kỷ-luật người** (đo thật @S119: `git grep args.run .claude/commands/` = **0 hit** ⇒ 4/4 wrapper KHÔNG cờ ⇒ sàn danh-nghĩa). Hậu-quả thật khi thiếu: chết giữa run ⇒ **per-turn returns mất theo phiên, chỉ file trên đĩa sống sót** ⇒ `/tiep` §4 không có vật-liệu cắt-gọt ⇒ chạy lại TỪ ĐẦU (S118 raw-Agent 7-spawn ⇒ 0 run-folder). 🔸 **Khai thật:** gate chỉ phủ đường `hmw.js`. Ngưỡng *"hoặc ước >5 phút"* **KHÔNG cơ-khí-hoá được** (script không đo trước thời-lượng) ⇒ phần đó vẫn là kỷ-luật lead. **raw `Workflow`/`Agent` tool = kẽ CÒN-LẠI**, đi thẳng không qua file này ⇒ mất writeGuard + run-trace. +## 🔴 ĐÓNG GÓI LANE THEO TRẦN LƯỢT (C2 — adap đợt-11 S144, có repro) + +**Sự cố gốc `wf_491c05a8-6dc` (2026-07-22):** 5 lane `investigator-codebase` (`maxTurns: 20`) — **3 CHẾT, ~490K token đốt, 0 sản phẩm**. +Đo từ transcript: lane **sống** dùng 21/23 tool-use · lane **chết** dùng 28/34/35 ⇒ cháy lượt **khi vẫn đang đọc**, chưa tới bước ghi. +🔴 **Cơ chế phạt NGƯỢC ĐỜI:** lane càng cẩn thận càng chắc chết. Lỗi ở **LỆNH của lead**, không ở lane — lead giao lane-5 **mười file** với trần 20 lượt. + +**3 luật đóng gói (áp mọi `/fable-clone` từ nay):** + +1. **≤3 file/lane.** Lane phải đọc nhiều hơn ⇒ **tách lane**, đừng nới việc. + 🔸 Số 3 = **AI tự đặt, đảo được** (không phải số owner). +2. 🔴 **ÉP GHI KHUNG RỖNG Ở LƯỢT 1-2** — trước khi đọc bất cứ gì. Rồi append dần. + *Vì sao "dặn ghi sớm" KHÔNG đủ:* prompt run-hỏng **đã** ghi *"ghi NGAY khi tìm ra từng cái"*, lane vẫn tự xếp việc ghi **sau** việc đọc ⇒ "ngay" của lead rơi **sau** vạch chết. + **Bằng chứng đối chứng:** run review `wf_301d3943-144` đổi đúng chỗ này (ép khung rỗng lượt 1-2, `maxTurns: 25`) ⇒ **3/3 lane sạch, 0 chết**. Cùng harness, cùng model, khác **thứ tự ghi**. +3. **Nêu trần lượt NGAY ĐẦU prompt** + phân bổ gợi ý (đọc → verify → chốt), để lane tự lượng sức. + +**Acceptance (đã siết theo R3 — bỏ đếm-chữ):** +- ❌ **KHÔNG** dùng `grep -c 'trần lượt'` làm tiêu chí (gõ đúng cụm chữ là đạt = Goodhart thuần). +- ✅ Đo ở **run KẾ**: 0 lane chết. +- 🔸 **Khai hạn chế thật:** `hmw.js` C1 chỉ biết lane trả `null`, **KHÔNG phân biệt được NGUYÊN NHÂN** ⇒ mệnh đề *"chết vì cháy lượt"* hiện **chưa đo được bằng máy**, phải mở transcript đếm tool-use. + +## 🔴 KHUÔN LABEL 4 THÀNH-PHẦN (C3 — `spawn-label:22-27`, BINDING) + +Mọi spawn (Agent-tool `description` · `hmw` `label` · monitor · cổng review) mang đủ **4 thành-phần**: + +``` +{nhóm|Vòng-N|Core|Gate|WF} {vai} {pha/wave} s{N} +``` + +Ví dụ đang chạy: `Gate reviewer anchor s144` (24 ký tự) · `Vòng-3 harness-eval w1 @start s144`. + +- **Vừa panel** ~≤40 ký tự; xung đột thì **đủ-thành-phần thắng ngắn-gọn** (`:25`). +- **Một khuôn duy nhất** toàn repo (`:26`). +- **Áp từ phiên kế** (`:51`) — spawn trước đó **giữ nguyên làm vết, KHÔNG sửa lùi** (khuôn hub `:43`). + +**Acceptance (siết theo R3 — thêm control + neo artifact):** +- ✅ **Negative-control**: cắm 1 label thiếu {pha·phiên} → phép đọc-lại **PHẢI TRƯỢT**. Không trượt = thước mù. +- ✅ **Neo artifact**: label phải xuất hiện trong `runs//run.md` — panel là **ephemeral**, `grep` không truy được ⇒ không neo thì không tái lập, không audit được. +- ❌ Bỏ tiêu chí "chọn 3 task nói được {ai·gì·nhịp·phiên}" **đứng một mình** — đó là **tự chấm chính label mình vừa viết**, n=3, không artifact. + ## 🔴 Guard ensemble (§K engine — 3 floor-fidelity) - **ảo-ensemble = N lane CÙNG 1 vai phán-quyết** (multi-lens trên 1 vai), **KHÔNG** mixed-roster fan-out (`hmw.js` VALID_ROLES = **roster đầy-đủ**, canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents; KHÔNG gate vai — worker-tier-pin S124 **che** leak qua frontmatter `opus` (xem :57), hết thời all-inherit ăn-theo-lead). - **N lane RETURN-only**; em-main **single-writer** (B3) ghi **1 MEMORY entry** đúng vai đó + **gắn nhãn engine đã dùng** (hmw SCHEMA `memoryDelta` KHÔNG field engine → em-main stamp @P3 harvest). diff --git a/.claude/commands/fable-real.md b/.claude/commands/fable-real.md index 629a893..7993e83 100644 --- a/.claude/commands/fable-real.md +++ b/.claude/commands/fable-real.md @@ -1,6 +1,6 @@ --- description: /fable-real <đề-bài> — ENGINE-ĐẮT LỆNH-A per-invocation (H21): vai anh GÁN chạy 1 LẦN SINGLE top-model THẬT (Fable 5; outage → single-Opus-1M/run) deep-pass cho ĐÚNG đề-bài đó, hiệu-lực CHỈ lượt đó — KHÔNG marker, KHÔNG mode persist. Thiếu/sai vai → em main hỏi lại anh 1 dòng, KHÔNG tự chọn. Cặp /fable-clone. -argument-hint: <đề-bài phán-quyết> — vd "reviewer rà-soát commit X" · "investigator-codebase truy nguồn bug Y" +argument-hint: <đề-bài phán-quyết> — vd "reviewer rà-soát commit X" · "investigator-codebase truy nguồn bug Y" --- # /fable-real — ENGINE-ĐẮT LỆNH-A: 1 vai × SINGLE top-model deep-pass (per-invocation, H21) @@ -16,9 +16,9 @@ argument-hint: <đề-bài phán-quyết> — vd "reviewer r - **`/fable-real <đề-bài>`** = vai anh gán chạy **1 LẦN top-model THẬT** (sâu nhất, đắt nhất) cho ĐÚNG đề-bài đó. Fable up = single-Fable; Fable **outage** (H5, lỗi `"Model isn't available"`) = single-**Opus-1M** fallback **theo từng lần chạy** (KHÔNG mode toàn-cục). - **Hiệu-lực CHỈ lượt đó** — hết lượt là hết. KHÔNG marker, KHÔNG persist. Lượt sau muốn engine-đắt = gõ lại lệnh. -## 🔴 Vai BẮT BUỘC ∈ roster 17 (H21 ②) -`investigator-codebase` · `investigator-api` · `implementer-backend` · `implementer-frontend` · `frontend-designer` · `database-agent` · `office-document` · `test-specialist` · `reviewer` · `cicd-monitor` · `tooling-auditor` · `harvest-curator` · `lead-view-auditor` · `lead-omission-auditor` · **`harness-eval` · `harness-refine` · `harness-audit`**. -> Số vai canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents (B1 derived-trỏ-canonical). +2 @S121 W2 = 2 monitor H24 lead-self-audit · **+3 @S141 = bộ-ba đồng-kiểm memory (trio-memory, read-only INFORM-only; TUẦN TỰ eval→refine→audit)**. +## 🔴 Vai BẮT BUỘC ∈ roster (canonical → STATUS §Sub-agents; B1 — KHÔNG hardcode số) (H21 ②) +`investigator-codebase` · `investigator-api` · `implementer-backend` · `implementer-frontend` · `frontend-designer` · `database-agent` · `office-document` · `test-specialist` · `reviewer` · `cicd-monitor` · `tooling-auditor` · `harvest-curator` · `lead-view-auditor` · `lead-omission-auditor` · **`harness-eval` · `harness-refine` · `harness-audit`** · **`tooling-harvest-audit` · `h24-audit` · `sleep-audit`** (round-KIỂM ×3 S145). +> Số vai canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents (B1 derived-trỏ-canonical). +2 @S121 W2 = 2 monitor H24 lead-self-audit · **+3 @S141 = bộ-ba đồng-kiểm memory (trio-memory, read-only INFORM-only; TUẦN TỰ eval→refine→audit)** · **+3 @S145 = `tooling-harvest-audit`/`h24-audit`/`sleep-audit` (round-KIỂM ×3, C4/C4b TÁCH mỗi-vòng-1-con)**. - **Thiếu `` HOẶC vai ngoài roster** → em main **hỏi lại anh 1 dòng** ("engine-đắt cần vai đích-danh — vai nào?"), **KHÔNG tự chọn vai**. - 🔒 **Honest-note (a):** "không tự chọn vai" = tầng **KỶ-LUẬT owner-gated** (anh phải gõ vai) — **KHÔNG claim code-enforced**. - 🔒 **Honest-note (b):** lệnh/alias = cách anh **GÁN VAI NHANH**, vẫn phải anh gõ — hệ **KHÔNG tự chọn vai**. diff --git a/.claude/commands/pause.md b/.claude/commands/pause.md index e2387ce..4c7f697 100644 --- a/.claude/commands/pause.md +++ b/.claude/commands/pause.md @@ -20,6 +20,17 @@ Thực-hiện **tuần-tự 5 bước** sau; trong lúc chạy **KHÔNG nhận v - Đẩy mọi trí-nhớ đang dirty (chưa ghi) xuống đĩa (agent-memory / run-folder). - Ghi-chú-dở **DÀI** (context, phân-tích giữa chừng) để ở **run-folder / work-state**, **KHÔNG** nhét chi-tiết dài vào WAL — WAL phải giữ tính "liếc một cái là biết". +## 2.6 Ghi context-block vào thư-mục phiên-LOGIC (S146 — lane CỘNG-DỒN, cặp với `/tiep §2.6`) + +- **Append MỘT khối mới** vào `.claude/sessions/session-/pause-S-.md` (`` = phiên-LOGIC **đang mở** — xem [`session-start.md`](session-start.md) BƯỚC 0.8). + - 🔴 **Scaffold idempotent (owner chốt @S146 "giống hub"):** thư-mục chưa có ⇒ **TẠO**; đã có ⇒ **DÙNG LẠI, CẤM đè**. Chạy lại nhiều lần vô hại. + - 🔴 **NHƯNG `/pause` KHÔNG BAO GIỜ tự tăng ``** — cấp-số là **độc-quyền `/session-start`** (BƯỚC 0.8, canonical; B1 — mục này chỉ TRỎ). `/pause` chỉ tạo thư-mục cho số **đang mở**. Không có số nào đang mở (vào thẳng bằng `/tiep` rồi `/pause`, chưa từng `/session-start`) ⇒ dùng `max+1` **và ghi 1 dòng khai** trong khối: `N-cap-ngoai-session-start: (ly-do: <...>)` — để `` không bao giờ xuất-hiện mà không ai biết nó ở đâu ra. +- 🔴 **ACCUMULATE — CẤM ghi đè, CẤM sửa khối cũ.** Mỗi `/pause` = **một file mới**. (Ghi đè = mất chính thứ mà lane này sinh ra để giữ.) +- **3 trường** (đúng khuôn VC-3 draft): **(1) quyết-định đã CHỐT trong cửa này** · **(2) delta còn SỐNG** (việc/nghi-vấn mang sang cửa sau) · **(3) con-trỏ** run-folder / commit / file. +- 🔴 **Ranh với WAL — KHÔNG nhập một:** WAL = **mạch-sống, ghi-đè, cứng ≤40 dòng** (liếc-một-cái-là-biết, bước 3 dưới). Context-map = **bối-cảnh tích-luỹ, không cap 40 dòng**. Ghi-chú-dở DÀI thuộc **về đây**, KHÔNG nhồi vào WAL. +- **CẤM secret** (thư-mục này sẽ được commit — cùng kỷ-luật WAL bước 3). +- 🔸 Hook `wal-flush.ps1` đã phủ `.claude/sessions/` (path thứ-4, S146) ⇒ khối này **tự vào `wal:` commit** ở turn-boundary. Vẫn **PHẢI add đích-danh** ở bước 4 (đừng dựa vào hook để chốt điểm dừng — hook là lưới, không phải nghi-thức). + ## 3. Cập-nhật `.claude/WAL.md` đúng schema - **`chain:`** — đầy-đủ mọi mục trạng-thái (`[x]` đã-xong · `[!]` đang-dở · `[ ]` chưa-làm), **KÈM BẰNG-CHỨNG** là một lệnh / đường-dẫn / hash chứng-minh trạng-thái đó (KHÔNG mô-tả suông). - **`next:`** — đúng **một mệnh-lệnh cụ-thể**: làm gì tiếp theo. @@ -28,10 +39,10 @@ Thực-hiện **tuần-tự 5 bước** sau; trong lúc chạy **KHÔNG nhận v ## 3.5 TICK counter (H24 — TRƯỚC commit bước 4; Item 1(c) S135) - Tick `.claude/governance/.session-counter.json` **theo contract** (idempotent — NO-OP nếu cùng nhãn-phiên/cùng HEAD) — 🔴 **CON-TRỎ `session-start.md §2.1.8`, CẤM chép logic tick** (B1 canonical). -- 🔴 **TRƯỚC commit bước 4** ⇒ delta counter được gộp vào commit `wal: pause` (file NGOÀI hook-3-path nên PHẢI add đích-danh ở bước 4). +- 🔴 **TRƯỚC commit bước 4** ⇒ delta counter được gộp vào commit `wal: pause` (file NGOÀI hook-4-path nên PHẢI add đích-danh ở bước 4). ## 4. Commit ĐÍCH-DANH — message `wal: pause` -- `git add` **đích-danh** đúng các path: **WAL + path persist** (agent-memory / run-folder) **+ `.claude/governance/.session-counter.json`** (🔴 M-7: tick bước 3.5 nằm TRONG commit `wal: pause` — file ngoài hook-3-path nên PHẢI add đích-danh; thiếu dòng này thì claim "tick nằm trong wal: pause" SAI) **+ file dở**, rồi `git commit -m "wal: pause"`. +- `git add` **đích-danh** đúng các path: **WAL + path persist** (agent-memory / run-folder / **`.claude/sessions/session-/` — context-block bước 2.6, S146**) **+ `.claude/governance/.session-counter.json`** (🔴 M-7: tick bước 3.5 nằm TRONG commit `wal: pause` — file ngoài hook-4-path nên PHẢI add đích-danh; thiếu dòng này thì claim "tick nằm trong wal: pause" SAI) **+ file dở**, rồi `git commit -m "wal: pause"`. - 🔴 **TUYỆT ĐỐI KHÔNG `git add -A`** — chỉ add đúng path cần chốt, tránh nuốt file rác / secret ngoài ý-muốn. - **KHÔNG push.** (Repo trong Dropbox → thư-mục `.git` được cloud-sync, nên commit local vẫn **durable** qua tắt-máy / đổi-acc.) @@ -42,6 +53,7 @@ Báo đúng sáu ý: 3. **workflow bỏ lại** (nếu có) — dòng `wf:` đã ghi. 4. "**an-toàn để thoát, đổi acc, hoặc tắt máy**". 5. **dòng-nợ (Item 2 S135):** gọi `powershell.exe -ExecutionPolicy Bypass -File scripts/nhip-no-probe.ps1` in dòng-nợ 4-vế (nhịp-kiểm đọc post-tick bước 3.5). 🔴 **probe KHÔNG chặn điểm dừng**: lỗi → in `probe-loi (khong chan)` → đi tiếp, VẪN tuyên-bố "an-toàn để thoát". + > 🔗 **Predicate C7 đầy-đủ (probe nào được phép chạy ở điểm dừng) = canonical [`harness-11-engine.md`](../../docs/governance/harness-11-engine.md) §N.8.** 🔴 **B1 — dòng này CHỈ TRỎ, CẤM chép predicate sang đây.** 6. **🧾 MASTER-CHECKLIST rút-gọn (S138):** derive từ WAL vừa ghi (bước 3) + HANDOFF — in **Tầng-1** mỗi arc 1 dòng `{đóng · đang · chưa}` + **đếm 4-nhóm** (`xong` / `đang-dở` / `chờ-anh` / `chưa-làm`) + **liệt nhóm chờ-anh — 🔢 BẮT BUỘC ĐÁNH SỐ** (anh trả lời bằng số). 🔴 **Checklist = VIEW derive tươi — CẤM tạo file checklist nguồn-đôi (sàn-3).** Rồi **DỪNG HẲN**, KHÔNG nhận việc mới. diff --git a/.claude/commands/session-end.md b/.claude/commands/session-end.md index 829460a..c67714f 100644 --- a/.claude/commands/session-end.md +++ b/.claude/commands/session-end.md @@ -37,6 +37,10 @@ Em main PHẢI echo **TOÀN BỘ nội dung command body này** (đầy đủ Ph - ⬜ **harvest-curator** (monitor H2) — GATE harvest-integrity 5-trục + close-gate run-trace `runs//` (**DUAL-ACCEPT** — xem §L.b(f)) (chạy ở §L.b(d)(f)) - 🔷 **lead-view-auditor** (monitor **H24**) — view LỆCH source của cái LEAD surface (chạy theo NHỊP §L.b(j), KHÔNG mỗi phiên) - 🔶 **lead-omission-auditor** (monitor **H24**) — cái BỊ THIẾU trong cái LEAD surface (chạy theo NHỊP §L.b(j), KHÔNG mỗi phiên) + - 🔬 **tooling-harvest-audit** (monitor **KIỂM-vòng**, C4 S145) — verify OUTPUT H1+H2 vòng tooling/harvest (AUTO sau đo §L.b(g-bis)) · vai #1/3 round-KIỂM + - 🔬 **h24-audit** (monitor **KIỂM-vòng**, C4 S145) — verify OUTPUT lead-view+lead-omission vòng soi-lead (AUTO sau cặp H24 — @§L.b(j)(ii-bis) nếu cặp nổ ở close, @[`session-start`](session-start.md) §2.1.8 nếu cặp nổ ở open; *wherever it fires*) · vai #2/3 + - 🔬 **sleep-audit** (monitor **KIỂM-vòng**, C4 S145) — verify OUTPUT /sleep-recovery gist+Fidelity vòng nén-ngủ (AUTO sau **mỗi lượt nén** `/sleep-recovery-memory-l2` — post-step của skill, *wherever it fires*: consent @[`session-start`](session-start.md) §2.1.2 HOẶC @§L.b(c) dưới) · vai #3/3 + > 🧊 **Vá con-trỏ chết @S146:** bản trước trỏ *"Phase 4.5"* — heading đó **KHÔNG tồn-tại** trong file này (chỉ có Phase 1 · 1.5 · 2 · 3 · 4 · 5 · 6). Trigger THẬT = lượt nén, không phải một phase cố-định. 2. Synthesize cross-agent learnings → integrate vào: - User auto-memory `MEMORY.md` (index — append entry mới, KHÔNG rewrite) @@ -99,21 +103,41 @@ Em main PHẢI echo **TOÀN BỘ nội dung command body này** (đầy đủ Ph - **(j) 🔷🔶 H24 lead-self-audit — counter + spawn theo NHỊP (adopt S122; đối-xứng `session-start §2.1.8`):** - **(i) BÁO dòng-nợ 4-vế (nâng dòng H24 cũ — Item 2 S135):** gọi `powershell.exe -ExecutionPolicy Bypass -File scripts/nhip-no-probe.ps1` → in **1 dòng** `NHIP-NO: kiem light a/e deep b/f | tran-bo-nho x over-cap | run-chua-gom y` (vế-1 nhịp-kiểm THAY dòng `counter=… light … deep … OVERDUE` cũ, đọc `.session-counter.json` + `h24_cadence`). 🔴 **probe KHÔNG chặn**: lỗi → in `probe-loi (khong chan)` → đi tiếp. 🔴 **Nhịp ĐỌC từ config, CẤM hardcode ở đây** (detector `governance-detectors.ps1` H24-2 **fail-loud** nếu key thiếu — **không** giả-định default). - - **(ii) OVERDUE** → **INFORM anh** + đề-xuất spawn vai H24 tương-ứng. 🔴 **KHÔNG auto-run** (anh consent mới chạy, giống sleep-check (c)). Chạy xong → cập-nhật `last_audit.{light,deep}_at_counter` = counter hiện-tại. **Lead = single-writer.** + - **(ii) OVERDUE → 🔴 SPAWN AUTO, KHÔNG consent (owner chốt @S146: "3 → auto"; THAY luật consent-gate era-S122):** tới nhịp ⇒ spawn cặp H24 (`lead-view-auditor` + `lead-omission-auditor`) **NGAY**, KHÔNG in dòng xin phép, KHÔNG chờ gật. Chạy xong → cập-nhật `last_audit.{light,deep}_at_counter` = counter hiện-tại. **Lead = single-writer.** + - 🔴 **PHẠM-VI CHÍNH-XÁC của "auto" (đọc kỹ — đừng nới):** gỡ **CỔNG NGƯỜI** (consent), **GIỮ NGUYÊN CỔNG NHỊP** (`h24_cadence` 6/15/3 vẫn đọc từ `memory-budget.json`). ⇒ H24 **KHÔNG** chạy mỗi phiên; nó chạy **tự-động KHI TỚI NHỊP**. Đây **KHÁC** bookend-của-hub (hub **gỡ hẳn counter**, rà đủ 2 đầu **mỗi** phiên) — SE **chưa** theo nhánh đó (lý-do giữ counter: `adap-reports/2026-07-15-…-bookend.md` §(2) — phiên ngắn-nhiều, cả 2 điều-kiện §4 của hub đều KHÔNG áp SE). + - 🔸 **Nếu anh muốn ĐÚNG bookend hub** (bỏ counter, 2 đầu mỗi phiên) thì đó là **quyết-định KHÁC** với "auto" — nói 1 chữ, em gỡ `h24_cadence` khỏi đường quyết-định (KHÔNG xoá key, chuyển sang INFORM). + - ⚖️ **Đánh-đổi khai thẳng:** auto-fire làm phiên tới-nhịp **nặng thêm** (2 sub) mà anh **không được hỏi trước** — đó chính là cái anh vừa đổi lấy tính **không-bỏ-sót**. Nợ nhịp từ nay **không thể trôi vì quên gật**. + - **(ii-bis) 🔬 h24-audit AUTO sau cặp H24 (vai-KIỂM vòng soi-lead, C4/C4b vai #2/3, land S145):** cặp H24 (`lead-view-auditor` + `lead-omission-auditor`) CHẠY xong ⇒ spawn `h24-audit` NGAY — **AUTO, KHÔNG consent** (owner S145; 🧊 *vế tương-phản cũ "KHÁC (ii) consent-gate của chính H24" Đà SỤP @S146 — (ii) nay cũng AUTO, xem `:106`*). Đọc FLAG-list + class 2 vai → verdict per-FLAG + tự tái-dựng ≥1 số (flag-count / `class_repeat`) + **thách-CLEAN** (H24 báo ít/0 FLAG ⇒ tự soi 1 surface tìm FLAG sót). 🔴 no-self-exempt ≠ lead-view/omission (m-3). 🔴 Fail-safe: H24 KHÔNG chạy phiên này (**chỉ còn: chưa tới nhịp** — nhánh "không consent" chết @S146) ⇒ h24-audit **NO-OP im-lặng**. Tuần-tự C4b (SAU cặp H24, mtime chứng). Propose-only → em main VERIFY→APPEND (git-diff backstop). Contract canonical `.claude/agents/h24-audit.md` (B1). - **(iii) Flag → class:** mỗi FLAG của 2 vai **PHẢI** thuộc **enum ĐÓNG** `lead_self_audit.flag_classes`. Vai **KHÔNG tự chế class** — finding không phân-loại được ⇒ báo **verbatim** + **escalate anh** để mở rộng enum. Cập-nhật `class_repeat.counts`; class nào lặp **≥ `jump_on_class_repeat`** ⇒ **kéo audit tới sớm**. - **(iv) 🔴 Nghi-thức RE-STAMP carry (GAP THẬT, vá @S122):** khi ghi segment `HANDOFF` mới, **ĐÓNG DẤU LẠI `[carry:]` cho MỌI carry còn mở** — không chỉ lần đầu. **Vì sao bắt buộc:** carry-age detector đo **streak** = số segment LIÊN-TỤC mang cùng slug. Đo thật @S121: **45 logic-segment nhưng `carry-lines=1`** ⇒ streak **luôn ≡ 1** ⇒ **0 fire VĨNH VIỄN, kể cả sau W2**. Bằng-chứng: `tra-bui-relogin` chỉ đóng dấu **seg#0 (S119)**, trong khi **seg#2 (S118)** nhắc **đúng việc đó** mà **không có dấu** ⇒ **tuổi thật ≥2, máy đọc 1**. ⇒ detector **vacuous về CẤU-TRÚC**, không phải sai ngưỡng. 🔴 **Không retrofit dấu vào segment CŨ** (§Q3 no-retrofit) ⇒ **đường DUY NHẤT còn lại** = re-stamp từ nay về sau; tuổi sẽ đo đúng **từ S122 trở đi**, và **khai thẳng** rằng carry mở trước S122 có tuổi **đo-thiếu**. **Định-nghĩa "dòng-carry" (owner O3):** = **đoạn LOGIC** `NEXT anh` / `NEXT em` trong mega-line — KHÔNG phải dòng vật-lý. ⚠️ Bẫy đếm: `grep -c` đếm **DÒNG** (=1 trên mega-line), `grep -o | wc -l` đếm **occurrence** (=n). Dùng đúng cái thứ hai. 🔢 **Luật đánh-số chờ-anh (điểm sàn #5 master-checklist `cadd24ae`, S138 — rename S139 tránh trùng token "Sàn-5" H22 ở trên, quyết anh + L3 nit-1):** khối **chờ-anh** trong `HANDOFF` LUÔN **đánh số** (anh trả lời bằng số) — khớp nhóm-3 MASTER-CHECKLIST + nghi-thức re-stamp carry ở trên; số cố-định giúp anh trả lời gọn. - - **(v) 🔷 TICK-at-close (Item 1(d) S135 — idempotent):** tick `.claude/governance/.session-counter.json` **theo contract** — 🔴 **CON-TRỎ `session-start §2.1.8`, CẤM chép logic tick** (B1). Idempotent: cùng nhãn-phiên phiên này ⇒ **NO-OP** (nếu `/session-start` hoặc `/tiep` đã tick nhãn này). Có delta → **§5.1 add đích-danh counter-file** (file ngoài hook-3-path; bằng-chứng sống: tick S133 nằm uncommitted qua 2 closeout liên tiếp — M-7). - - **(vi) 🔥 Force-fire bù khi closeout gộp sổ (Item 3 S135 — floor B1 §3.2):** đếm `P` = số `wal: pause` gộp vào closeout này: `P=$(git log --format=%s "..HEAD" | grep -c '^wal: pause' || true)` — `` = commit gần nhất match **regex closeout DÙNG CHUNG Item 4** `^\[CLAUDE\] Docs: S\d+.*(closeout|session-end)` (1 regex, đừng chép 2 bản). 🔴 **so-sánh SỐ, KHÔNG dùng exit-code** (`grep -c` trả exit 1 khi đếm 0 — §5.0 (a)): `[ "$P" -ge 1 ]`. Nếu **`P >= 1` HOẶC** nhãn đóng dạng `S-S` (closeout gộp nhiều phiên) ⇒ coi như **`OVERDUE(light)` bất-kể counter** → in dòng-nợ (qua (i)) + **INFORM-BẮT-BUỘC** anh + **đề-xuất spawn cặp H24 (`lead-view-auditor` + `lead-omission-auditor`) NGAY closeout này**. 🔴 **DP-3 consent-gate GIỮ** (luật owner-era §L.b(j)(ii) + `session-start §2.1.8(e)` "KHÔNG auto-run — anh consent" + hẹn hub "light-run owner-triggered"): force-fire = INFORM-bắt-buộc + đề-xuất-chạy mặc-định, **anh gật mới chạy trong closeout**. Báo hub SELF-CHECK ô3 = **"PASS-với-carve-out (consent)"**, KHÔNG PASS trần. + - **(v) 🔷 TICK-at-close (Item 1(d) S135 — idempotent):** tick `.claude/governance/.session-counter.json` **theo contract** — 🔴 **CON-TRỎ `session-start §2.1.8`, CẤM chép logic tick** (B1). Idempotent: cùng nhãn-phiên phiên này ⇒ **NO-OP** (nếu `/session-start` hoặc `/tiep` đã tick nhãn này). Có delta → **§5.1 add đích-danh counter-file** (file ngoài hook-4-path; bằng-chứng sống: tick S133 nằm uncommitted qua 2 closeout liên tiếp — M-7). + - **(vi) 🔥 Force-fire bù khi closeout gộp sổ (Item 3 S135 — floor B1 §3.2):** đếm `P` = số `wal: pause` gộp vào closeout này: `P=$(git log --format=%s "..HEAD" | grep -c '^wal: pause' || true)` — `` = commit gần nhất match **regex closeout DÙNG CHUNG Item 4** `^\[CLAUDE\] Docs: S\d+.*(closeout|session-end)` (1 regex, đừng chép 2 bản). 🔴 **so-sánh SỐ, KHÔNG dùng exit-code** (`grep -c` trả exit 1 khi đếm 0 — §5.0 (a)): `[ "$P" -ge 1 ]`. Nếu **`P >= 1` HOẶC** nhãn đóng dạng `S-S` (closeout gộp nhiều phiên) ⇒ coi như **`OVERDUE(light)` bất-kể counter** → in dòng-nợ (qua (i)) + **INFORM-BẮT-BUỘC** anh + **đề-xuất spawn cặp H24 (`lead-view-auditor` + `lead-omission-auditor`) NGAY closeout này**. 🔴 **DP-3 consent-gate Đà GỠ @S146 (owner "3 → auto")** — force-fire nay **CHẠY THẲNG**: in dòng-nợ (qua (i)) + **spawn cặp H24 NGAY trong closeout**, KHÔNG chờ gật. Đồng-bộ (ii) ở trên (B1 — luật sống ở (ii), mục này chỉ áp). + 🧊 *(Luật cũ era-S122: "INFORM-bắt-buộc + đề-xuất, anh gật mới chạy" — **RETIRED**. Hệ-quả kèm theo: báo hub SELF-CHECK ô3 nay là **PASS trần**, KHÔNG còn carve-out "(consent)" — carve-out đó sinh ra CHỈ vì cổng người, gỡ cổng thì gỡ luôn carve-out.)* *baseline-ghi-bù (phép-8 annex `dede7ec5`, khai-1-lần): cơ-chế force-fire bù closeout-gộp tồn tại từ 2026-07-17 (`da349fc`, S135 — re-đo 19:12:41+07). Phép-8 CHỈ tính FAIL cho closeout SINH SAU mốc; closeout trước = baseline hợp-lệ ghi n/a, KHÔNG đếm FAIL. Không lặp mỗi lần chạy.* - **(g) 🔌 tooling-freshness CHỐT (🟫 tooling-auditor H1 — Harness 1):** spawn → chốt 4-mặt (skill·sub-role·plugin·docs) đổi gì session này + **new-alloc audit** (skill/plugin MỚI chưa phân-bổ → đề-xuất gán em main + sub phù-hợp vai) + flag doc-drift/roster-lệch/count-stale. Propose → em main APPEND/sửa doc (single-writer). 🔴 G-015: 2 monitor = propose-only, em main VERIFY trước APPEND (Bash residual → KHÔNG "read-only enforced"). +- **(g-bis) 🔬 tooling-harvest-audit — vai-KIỂM vòng tooling/harvest (C4/C4b adap dot-11 `harness-dong-du-vong:51`, owner-decision [2] TÁCH, land S145; đối-xứng (k) trio nhưng AUTO):** đóng lỗ "vòng tooling/harvest **0 con soi**" — vai-KIỂM độc-lập đọc OUTPUT H1 (g) + H2 (d)(f), KHÔNG re-chạy đo. Contract = canonical `.claude/agents/tooling-harvest-audit.md` (B1 — KHÔNG chép vào đây). + - **(i) 🔴 AUTO sau đo — KHÔNG consent-gate (owner-chốt S145, KHÁC (j) H24 + (k) trio):** H1 (g) + H2 (d)(f) chốt xong ⇒ spawn NGAY, KHÔNG in dòng đề-xuất, KHÔNG chờ gật. + - **(ii) 🔴 Fail-safe NO-OP:** H1/H2 KHÔNG chạy phiên này ⇒ pin input missing ⇒ vai in `tooling/harvest round: no measure → NO-OP` + DỪNG. **Auto ≠ chạy-mù**, CẤM ĐẠT-ảo. + - **(iii) 🔴 Tuần-tự (C4b):** spawn ở invocation **SAU** (g)/(f); bằng-chứng `mtime(return) > mtime(output H1/H2)`. KHÔNG song song. + - **(iv) Propose-only, lead single-writer:** return verdict per-claim ĐẠT/TRƯỢT + falsify ≥2 + tự tái-dựng ≥1 số CÓ-THỂ-SAI + **thách-CLEAN** → em main VERIFY → APPEND (B3). Backstop = git-diff (G-015 — Bash residual → KHÔNG "read-only enforced"). + - **(v) no-self-exempt (m-3 S139):** vai ≠ H1/H2. + - **(vi) 🔴 D2 — KIỂM end-only (COMMIT DEFER, owner-option (b) S145 · landing @S146): CHỦ-ĐÍCH, KHÔNG phải bỏ sót.** + **Luật 1 dòng (chép ĐÚNG câu này vào cả 3 contract vai-KIỂM):** *"KIỂM end-only: @open chỉ có diff-report, artifact authoritative (chốt/harvest/distill) ở close."* + **Vì sao DEFER — 3 vế đo được (không phải "chưa kịp làm"):** + 1. Nhịp **"hai đầu"** của khung 5-vòng buộc **tầng ĐO** có mặt 2 đầu (H1/H2 **báo-diff** @`session-start` — wired 2-đầu THẬT); nó **KHÔNG** buộc **tầng KIỂM** cũng 2 đầu. + 2. Cột self-verify của V1/V2/V4 trong checklist 5-vòng canonical = **CLOSE-time**: thứ bị chấm (spawn-record 4-field · freshness-verdict 4-mặt · harvest 5-trục · gist+Fidelity) **chỉ SINH ra ở close**. + 3. @open output là **diff-report nhẹ**, đã em-main verify tại chỗ ⇒ **KHÔNG có artifact authoritative nào để audit**. Ép KIỂM chạy @open = chấm một bản **chưa tồn-tại** ⇒ đúng cái **ĐẠT-ảo** mà fail-safe NO-OP của cả 3 contract đang cấm. + **Đánh-đổi khai thẳng:** sai-sót phát sinh @open chỉ bị soi ở close **cùng phiên** (trễ, KHÔNG mất). 🔁 **Điều-kiện huỷ-defer:** ngày nào @open sinh ra artifact **authoritative** (không còn chỉ diff-report) thì DEFER này **PHẢI** xét lại — defer **có điều-kiện huỷ**, không phải đóng vĩnh-viễn. + 🔗 **H24-coupling — ngoại-lệ CÓ CHỦ-ĐÍCH, khai rõ (KHÔNG mâu-thuẫn "end-only"):** `h24-audit` **bám cặp H24 *wherever it fires*** — cặp chạy @§L.b(j)(ii) ⇒ nó chạy ở **close**; cặp chạy @[`session-start`](session-start.md) §2.1.8 (OVERDUE ⇒ **AUTO**, KHÔNG còn cửa consent @S146) ⇒ nó chạy **NGAY tại open, ngay sau cặp**. Lý-do: pin của nó = **FLAG-list H24 tươi**, artifact đó **authoritative NGAY khi cặp trả**, không đợi close. `sleep-audit` cùng khuôn (bám **lượt nén** wherever it fires: consent @§2.1.2 hoặc @§L.b(c)). **Chỉ `tooling-harvest-audit` end-only TUYỆT-ĐỐI** (pin = H1-chốt + H2-5-trục, chỉ sinh ở close). ⇒ "end-only" nghĩa là **KHÔNG mở nhịp KIỂM RIÊNG @open**; vai vẫn **đi theo con-đo của nó** bất kể con-đo nổ ở đâu. + - 🔸 **Trạng-thái adopt (owner S145 — đo lại đĩa @S146):** **cả 3 vai-KIỂM đã BUILT + WIRED S145** — `tooling-harvest-audit` (g-bis) · `h24-audit` (j)(ii-bis) · `sleep-audit` (post-step lượt nén). Mỗi vai **chạy audit-round khi vòng tương-ứng chạy**, độc-lập, KHÔNG chờ nhau. 🧊 Bản trước xếp `h24-audit` + `sleep-audit` vào diện **chờ-land về sau** (đợi vai #1 chạy-thử-1-phiên) = **STALE @S146**: mâu-thuẫn chính danh-sách roster Phase 1 (3 dòng 🔬 đã wire AUTO) **và** mâu-thuẫn đĩa (`.claude/agents/{tooling-harvest-audit,h24-audit,sleep-audit}.md` tồn-tại CẢ 3). Số vai roster canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents (B1 — KHÔNG chép số). - **(h) 🔏 User-Mark CHỐT cuối phiên (H-12/13 canonical §P/P7, S79 — `harness-11-engine.md §E`):** đọc [`.claude/governance/ACTIVE-MARKS.md`](../governance/ACTIVE-MARKS.md) → (i) **hiển-thị** status-filtered (Active-High/Active hiện · Medium tóm-tắt · Disable ẩn) cho anh đọc lại (đối-xứng `session-start §2.1.4`); (ii) nếu session này có **quyết-định cấp-governance MỚI** (scope-check P6: đổi CANONICAL §-rule/authority) → chạy `/user-mark-` DACI: adjust-gov → double-check → **report-trước-đóng-dấu 3-7 tiêu-chí khách-quan (P4)** → anh confirm → stamp `RC-pqhuy1987-dd-mm-yyyy-hh-mm-ss`; (iii) supersede/disable mark cũ (P5) → con-trỏ-xuôi + Active-High cần anh-confirm RIÊNG. 🔴 **KHÔNG tự đóng dấu / đổi cấp trước khi báo (P4/P8).** 0 quyết-định-mới → "n-a, chỉ hiển-thị". - **(i) 🎯 H18-D(a) outcome spot-check (S100 — [`harness-11-engine.md §J`](../../docs/governance/harness-11-engine.md)):** session governance/review-heavy → chọn **3–5 artifact đã tự-động-qua-cổng** trước đó (cicd GO verdict · detector verdict · monitor verdict · adap-report claim) → **kiểm-lại TƯƠI bằng ground-truth** (tính lại giá-trị đối-chứng · mở định-nghĩa gốc xem claim có thật-cover · đối-chiếu nguyên-văn nguồn). Gấp vào review sẵn có (chi-phí ~0). Sàn-vai trượt-THẬT khỏi nhật-ký → reinject-on-real-miss qua [`reinject-ledger.md`](../governance/reinject-ledger.md) CG-1 (≤1 lần/N=3 phiên, vẫn trượt → escalate anh — REUSE H17 §I B2, KHÔNG sổ mới). Light/hỏi-đáp → skip. (Nấc honest: dogfood n=1 S100 = mẫu hiệu-chỉnh, CHƯA "proven" — caveat 1 broadcast H18.) - **(k) 🧪🧭🧮 Bộ-ba đồng-kiểm memory @ĐÓNG-PHIÊN (adopt S141 — đối-xứng `session-start §2.1.9`; khuôn hub 5-câu `58e28bae` khối B):** đầu-thứ-2 của nhịp 2-đầu-phiên. Trục = **CHÍNH-HỆ-MEMORY**, KHÁC (g) H1 tooling / (d)(f) H2 harvest / (j) H24 lead / reviewer chấm-diff. Contract từng vai = canonical ở `.claude/agents/harness-{eval,refine,audit}.md` (B1 — KHÔNG chép contract vai vào đây). - - **(i) 🔴 CONSENT-GATED, KHÔNG auto-run** (cùng khuôn sleep-check (c) + H24 (j)(ii)): in **đề-xuất 1 dòng** `trio-memory: de-xuat chay eval->refine->audit @S (consent?)` → **anh gật mới chạy**. + - **(i) 🔴 CONSENT-GATED, KHÔNG auto-run** (cùng khuôn **sleep-check (c)** — 🧊 **@S146 GỠ vế "+ H24 (j)(ii)"**: H24 nay **AUTO**, viện nó làm khuôn consent là **SAI**): in **đề-xuất 1 dòng** `trio-memory: de-xuat chay eval->refine->audit @S (consent?)` → **anh gật mới chạy**. - **(ii) 🔴 TUẦN TỰ, CẤM song song:** **3 spawn RIÊNG** eval → refine → audit. **KHÔNG dùng `parallel()` của `hmw.js`** — refine đọc output eval, audit chấm cả 2; song song ⇒ chấm **bản cũ** ⇒ verdict vô-nghĩa. - **(iii) Lead scribe NGAY (single-writer):** return từng con → ghi `.claude/workflows/runs//harness-{eval,refine,audit}-return.md` **ngay khi con đó trả**, KHÔNG đợi đủ 3 (3 vai **không có Write/Edit** ⇒ tự-ghi-đĩa bất-khả; phiên chết ⇒ mất return — bài-học vòng-1 S141). - **(iv) PIN đích-danh (fail-closed):** refine nhận **path** `…/harness-eval-return.md`; audit nhận **path run-folder** đang chấm. 🔴 Pin missing/rỗng ⇒ **TỪ-CHỐI / TRƯỢT**; CẤM tự tìm "run mới nhất" (⇒ **ĐẠT-ảo**). @@ -122,6 +146,71 @@ Em main PHẢI echo **TOÀN BỘ nội dung command body này** (đầy đủ Ph - **(vii) [M4] Vết 2 lớp:** proposal-line ở (i) **IN CẢ khi Light/hỏi-đáp** (Light ⇒ skip CHẠY hợp-lệ, **CẤM skip IM-LẶNG**); khi skip ⇒ ghi **1 dòng vết** vào `.claude/WAL.md`: `trio: skipped S ()`. - **(viii) Đơn-vị nhịp:** "phiên-LOGIC" hub map **TẠM** = nhãn-phiên `S` (SE chưa adopt session-logic). 🔴 **KHÔNG cadence-key** trong `memory-budget.json`, **KHÔNG tick** counter cho bộ-ba (nhịp bộ-ba ≠ nhịp H24 — trộn 2 đồng-hồ = hỏng cả hai). +### §L.c — completeness-gate 5-vòng (D1, land S146 — 🔴 CÓ RĂNG: CẤM bare-PASS) + +> Chạy **SAU** khi §L.b (a)→(k) xong, **TRƯỚC** Phase 2. Toàn-bộ gate **read-only** ⇒ không phá đóng-băng bề-mặt-đo (c). +> Khung canonical = checklist 5-vòng/8-phép của hub (`f71c5b65`); gate ở đây = **5 vòng chức-năng + 4 phép sàn** (phép 1–4). +> +> 🔴 **LUẬT ĐỌC KẾT-QUẢ = RĂNG của gate.** Mỗi phép chỉ được mang **1 trong 3 nhãn**: +> **`ĐẠT`** — *bắt buộc kèm bằng-chứng đĩa DÁN VÀO* · **`TRƯỢT`** — *kèm số/path LỆCH* · **`vacuous`** — *không có input, kèm folder-state*. +> **Ghi `ĐẠT` mà không dán được bằng-chứng ⇒ phép đó TỰ ĐỘNG TRƯỢT.** Bằng-chứng = **output của lệnh vừa chạy**; "đã verify" / "khớp rồi" / trí-nhớ ⇒ **KHÔNG tính** (luật soi-được thay trí-nhớ — S122 §5.0 ghi-chú, S119). +> 🔴 **Chống meta-count blind-spot (S119):** báo dạng **`phép: ĐẠT a / TRƯỢT b / vacuous c`** với **a+b+c = 4**. **CẤM** gộp thành "4/4 PASS" khi còn `vacuous` — `vacuous` **KHÔNG** cộng vào tử-số ĐẠT. +> 🔸 **Nấc của gate = evidence-mandate, KHÔNG phải cổng chặn** (không chặn đóng phiên). Chính vì informational nên nó **an-toàn để sai** — và vì thế **cấm tô hồng**: một `ĐẠT` rỗng bằng-chứng rẻ hơn nhiều so với một `TRƯỢT` có số, nên chỉ luật-soi-được mới giữ được nó thật. + +**(1) 5 vòng — mức CHỨC-NĂNG** (mỗi vòng = 1 con-ĐO + ≥1 con-KIỂM độc-lập; ô dưới là **con-trỏ**, KHÔNG chép logic — B1): + +| Vòng | Con-ĐO (chạy ở) | Con-KIỂM độc-lập | Bằng-chứng tối-thiểu phải dán | +|---|---|---|---| +| V1 tooling + harvest | H1 `tooling-auditor` (g) · H2 `harvest-curator` (d)(f) | `tooling-harvest-audit` (g-bis) | path sổ/return H1+H2 phiên này | +| V2 soi-lead | cặp H24 (j)(ii) *hoặc* [`session-start`](session-start.md) §2.1.8 | `h24-audit` (j)(ii-bis) | FLAG-list + class (enum ĐÓNG) | +| V3 bộ-ba memory | `harness-eval` → `harness-refine` (k) | `harness-audit` (k) | 3 path `runs//harness-*-return.md` | +| V4 nén-ngủ | `/sleep-recovery-memory-l2` (INFORM @(c) hoặc @§2.1.2) | `sleep-audit` (post-step lượt nén) | path `.gist.md` mới + Fidelity verdict | +| V5 sàn-sự-thật "đã-đo" | measured-label-gate (**floor** — không vai riêng) | — (floor tự-soi ở MỌI verdict) | 1 nhãn `đã-đo` bị chặn / được cho qua trong phiên | + +🔴 Vòng **không chạy** phiên này ⇒ ghi **`không-nhịp`** + lý-do (chưa tới cadence · anh không consent · không có input). **KHÔNG** ghi ✓, **KHÔNG** tính TRƯỢT — nhưng cũng **KHÔNG** được im-lặng bỏ khỏi bảng. + +**(2) 4 phép sàn — mỗi phép PHẢI SHOW bằng-chứng đĩa:** + +**🔎 phép-1 — tick vs cửa** · bằng-chứng = **3 SỐ thật** (không phải chữ "khớp"): +```bash +# cửa-sổ = (closeout-liền-trước .. HEAD]. 🔴 regex closeout DÙNG CHUNG §L.b(j)(vi) — KHÔNG chép bản thứ 2 (B1). +LAST=$(git log --format='%H %s' | grep -m1 -E '' | cut -d' ' -f1) +P=$(git log --format=%s "$LAST..HEAD" | grep -c '^wal: pause' || true) # điểm dừng +L=$(git log --format=%s "$LAST..HEAD" | grep -oE 'S[0-9]+' | sort -u | wc -l) # nhãn-phiên (proxy) +grep -oE '"counter": *[0-9]+|"last_ticked_session": *"[^"]*"' .claude/governance/.session-counter.json +``` +Dán vào gate: **`cửa = L nhãn + P dừng`** · **`counter-delta = `**. Lệch ⇒ **TRƯỢT + IN DANH-SÁCH cửa CÂM** (cửa nào không có tick). 🔴 Viết "tick đủ" mà thiếu 3 số ⇒ **TRƯỢT**. 🔸 `L` là **proxy** (S-label trên commit-subject); đối-chứng nguồn-2 = `docs/changelog/sessions/` khi nghi ngờ. + +**🔎 phép-2 — dòng-nợ tại cửa** · bằng-chứng = **DÁN NGUYÊN VĂN dòng máy in**: +Copy **y nguyên** dòng `NHIP-NO: …` mà §L.b(j)(i) vừa in (kể cả khi nó là `probe-loi (khong chan)`) vào gate. 🔴 **Tóm-tắt / diễn-giải / "đã in rồi" ⇒ TRƯỢT** — phải là chuỗi do máy in. +🔸 **Vế-set canonical = `scripts/nhip-no-probe.ps1`** (B1 — KHÔNG chốt số vế ở đây): checklist hub gốc gọi *"dòng-nợ 3-vế"*, script SE hiện in **4 đoạn** (`kiem | tran-bo-nho | run-chua-gom | pull-cach`) và 4 command đều gọi "4-vế". Gate đo **nguyên-văn dòng in** ⇒ script đổi vế thì gate **không stale**. + +**🔎 phép-3 — closeout đủ nghi-thức** · bằng-chứng = **PATH THẬT** (không phải ✓): +**3 closeout gần nhất**, mỗi kỳ phải chạm đủ **4 sổ**: `docs/STATUS.md` · `docs/HANDOFF.md` · `docs/changelog/sessions/**` · `.claude/agent-memory/**` — đo **UNION-per-label**. +🔴 **KHÔNG per-commit-naive:** `agent-memory/` thường vào qua `wal:` commit **cùng kỳ** ⇒ đếm theo từng commit sẽ **FAIL oan** (đo thật S135: S133 `e53a693` chỉ đủ sổ khi tính union với `9f404d3`). +```bash +# C1 C2 C3 = 3 closeout gần nhất (regex DÙNG CHUNG (j)(vi)) → union file-set từng kỳ: +git log --name-only --format='' "C2..C1" | sort -u \ + | grep -E 'docs/STATUS\.md|docs/HANDOFF\.md|docs/changelog/sessions/|\.claude/agent-memory/' +``` +Dán vào gate: **bảng 3 dòng × 4 cột, mỗi ô = path thật** matched. Ô rỗng ⇒ **TRƯỢT + tên sổ thiếu + kỳ nào**. 🔸 Proxy này không phân-biệt *"không chạy"* vs *"chạy mà không ghi sổ"* — **cả hai đều lỗi** nên vẫn bắt đúng (khai thẳng, S135 ghi-chú (v)). + +**🔎 phép-4 — vai ĐÃ-CHẠY phải có sổ** · bằng-chứng = **roles-ran list + path sổ**: +1. Liệt **danh-sách vai Đà CHẠY phiên này** (nguồn = spawn-record (d); 0 spawn ⇒ ghi `n-a`, **không** để trống). +2. Với **TỪNG** vai trong list: dán path `.claude/agent-memory//MEMORY.md` + **byte > 0** + mtime phiên này (`ls -la`). Vai chạy mà **thiếu sổ** hoặc **sổ 0-byte** ⇒ **TRƯỢT** (AS-8 — 0-byte memory là ca đã xảy ra thật, S45). +3. 🔴 **Vai WIRED nhưng KHÔNG chạy phiên này ⇒ `not-yet-run (vacuous)` + DÁN folder-state**, **KHÔNG TRƯỢT** và **KHÔNG ĐẠT**: +```bash +ls -la .claude/agent-memory/tooling-harvest-audit/ .claude/agent-memory/h24-audit/ .claude/agent-memory/sleep-audit/ 2>&1 +``` + 📌 **Baseline đo tại lúc land gate (@S146 — mốc 1 lần, KHÔNG lặp mỗi phiên):** `tooling-harvest-audit/` **tồn-tại nhưng RỖNG** (0 `MEMORY.md`) · `h24-audit/` + `sleep-audit/` **MISSING** ⇒ cả 3 = **WIRED nhưng CHƯA chạy audit-round THẬT** ⇒ đúng ca `vacuous` (`tooling-harvest-audit` @S145 chỉ spawn-PROBE, cố-ý 0-ghi). + 🔴 **Vacuous KHÔNG phải giấy phép vĩnh-viễn:** một khi vòng tương-ứng CHẠY (H1/H2 chốt · cặp H24 chạy · lượt nén chạy) mà vai-KIỂM vẫn **không có sổ** ⇒ **TRƯỢT thật**, hết cửa vacuous. Đây là chỗ dễ **ĐẠT-ảo** nhất của cả gate: *"folder trống"* đọc giống *"chưa tới lượt"* y hệt *"chạy rồi mà nuốt sổ"* ⇒ **phải kèm bằng-chứng vòng đó có/không chạy**, không chỉ kèm `ls`. + +**(3) Dòng báo gate** (1 dòng, ghi cạnh khối `memory-triple` trong session-log): +``` +completeness-gate S: vong /5 chuc-nang (khong-nhip: ) | phep DAT a / TRUOT b / vacuous c +``` +🔴 Có `TRƯỢT` ⇒ **NÊU ở report Phase 4** + **đổ vào sổ đích** (carry-slug `HANDOFF` / `WAL`-line / `STATUS`-row) — không mục nào rơi khỏi sổ. + ## Phase 2 — WRITE (update MD/RAG) ### 2.1 UPDATE/Re-rank MD/RAG đã thay đổi @@ -149,7 +238,7 @@ Em main PHẢI echo **TOÀN BỘ nội dung command body này** (đầy đủ Ph - Phase 9 UAT mode: feature test-after (có thể skip per chunk), vẫn `npm run build` × 2 app. Nếu chỉ docs/infra → ghi "N/A". ### 3.2 Sub-agent state -- Kiểm tra trạng thái spawn sub-agent (**10 product/quality + monitor INFORM-only (H1 · H2 · 2×H24 · 3×trio-memory)**; số vai canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents, B1 KHÔNG chép số ở đây) +- Kiểm tra trạng thái spawn sub-agent (**10 product/quality + monitor INFORM-only (H1 · H2 · 2×H24 · 3×trio-memory · 3×round-KIỂM `tooling-harvest-audit`/`h24-audit`/`sleep-audit` S145)**; số vai canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents, B1 KHÔNG chép số ở đây) - Task bất kỳ phải phân việc đầy đủ đúng vai trò split boundary (BE→backend, FE→frontend, test→test-specialist) ### 3.3 RAG + MCP state @@ -208,7 +297,7 @@ K=0; while read -r s; do case "$s" in wal:*) K=$((K+1));; *) break;; esac ### 5.1 Release + commit - Kiểm tra release, commit task vừa hoàn thành. ⚠️ Update `SolutionErp.slnx` nếu có `.cs/.csproj` mới. -- 🔴 **M-7 — add đích-danh `.claude/governance/.session-counter.json` khi tick-at-close (§L.b(j)(v)) tạo delta:** file NGOÀI hook-3-path ⇒ KHÔNG tự vào `wal:` commit ⇒ PHẢI `git add` đích-danh ở commit closeout, nếu không counter-delta nằm uncommitted (bằng-chứng sống: tick S133 uncommitted qua 2 closeout liên tiếp). +- 🔴 **M-7 — add đích-danh `.claude/governance/.session-counter.json` khi tick-at-close (§L.b(j)(v)) tạo delta:** file NGOÀI hook-4-path ⇒ KHÔNG tự vào `wal:` commit ⇒ PHẢI `git add` đích-danh ở commit closeout, nếu không counter-delta nằm uncommitted (bằng-chứng sống: tick S133 uncommitted qua 2 closeout liên tiếp). - Format: `[CLAUDE] : ` + `Co-Authored-By: ` (model = lead runtime phiên hiện-tại per BƯỚC 0.6 probe — KHÔNG hardcode; flip-chain canonical → `docs/STATUS.md` §Sub-agents) - Scope: `Contract · PurchaseEvaluation · Budget · Form · Workflow · Supplier · Auth · Admin · Api · App · Domain · Infra · FE-Admin · FE-User · Tests · Docs · CICD · Scripts · Skill` @@ -269,6 +358,18 @@ git push origin main # → git.baocaogiaoduc.vn/vietrep - Surface report cho anh main relay AI_INFRA (1 lần báo = ACK+executed+evidence). Em main `/session-start` kế watch + double-check → cơ chế 2 chiều tự duy trì. - Session KHÔNG adopt infra gì → ghi "N/A (no infra adoption this session)". +### 6.3-bis 🔒 Chốt-kết `_end` — đóng băng phiên-LOGIC (owner chốt @S146 "giống hub") + +> Floor manifest `101e69d6` §1: dấu-mốc thứ-4 = **"Chốt-kết (`_end`) — dấu đóng băng khi phiên-LOGIC thực sự khép lại"**. SE form = `closed.md`. Chân này **trước S146 CHƯA wire** ⇒ cân-sổ ORPHAN-L chỉ có nửa vào, không có nửa khoá (kêu oan ca *"pause rồi đóng thẳng không qua `/tiep`"*). Nay đóng. + +- **Ghi `.claude/sessions/session-/closed.md`** cho `` đang mở — **FROZEN, ghi MỘT lần, CẤM sửa về sau**. Nội dung tối-thiểu **4 trường**: + `phien-logic: L` · `cua-so: S..S` (các nhãn vật-lý thuộc phiên-logic này) · `closeout-commit: ` · `ket-qua: <1-3 dòng arc đã đóng>`. +- **Cân-sổ (khoá vòng ORPHAN-L):** sau khi ghi, **mọi `pause-*.md` trong thư-mục coi như Đà ĐỐI-ỨNG** — `closed.md` đóng vai đối-ứng cho khối `pause` cuối chưa có `resume-*`. ⇒ [`tiep.md §0`](tiep.md) block **⑤ ORPHAN-L** hết kêu oan. +- 🔴 **Idempotent:** `closed.md` đã tồn-tại ⇒ **NO-OP, CẤM ghi đè** (phiên-logic đã khép; closeout chạy lại không được "mở lại rồi khép lại"). +- 🔴 **Thư-mục `session-/` KHÔNG tồn-tại ⇒ NO-OP im-lặng** — phiên này không mở phiên-logic nào (vd vào thẳng bằng `/tiep`, chưa từng `/session-start`). **CẤM tự tạo thư-mục chỉ để ghi `closed.md`** — tạo-rồi-đóng-ngay là **sổ rỗng giả**, đúng loại ĐẠT-ảo mà fail-safe NO-OP khắp harness đang cấm. +- **Add đích-danh** ở §5.1 (thư-mục phiên nằm trong hook-4-path nên hook cũng nuốt, nhưng **đừng dựa hook để chốt** — cùng lý-lẽ `pause.md §2.6`). + 🔸 **Meld-forward (floor hub, miếng nền thứ-3) — CHƯA kiểm tại SE:** hub ràng *"commit mang thư-mục phiên được **nhập-tiến về trước** khi squash, KHÔNG bị bỏ rơi"*. §5.0/§5.2 của SE squash `wal:`-trailing bằng `reset --soft` ⇒ nội-dung **ở lại INDEX** nên **về lý là không mất**; nhưng **chưa có phép đo riêng** cho `.claude/sessions/`. ⇒ khai **CHƯA-ĐO**, không claim kín. + ### 6.4 Reset WAL (H22 — bước CUỐI) + **XOÁ sentinel Sàn-2** - 🔴 **XOÁ dòng `closing:`** (Sàn-2 — đặt ở BƯỚC 0). Bước này **vốn LUÔN chạy** ⇒ thêm việc xoá = **net-zero**. Xoá-dấu-không-tồn-tại = no-op vô-hại. - Ghi-đè `.claude/WAL.md` về **template rỗng** (mạch dở phiên này đã đóng): `updated`/`session`/`branch` = `—` · `goal` = `(trống — không có mạch dở)` · `chain` = `(rỗng)` · `next`/`verify` = `(trống)`. diff --git a/.claude/commands/session-start.md b/.claude/commands/session-start.md index 7183a2f..93552d8 100644 --- a/.claude/commands/session-start.md +++ b/.claude/commands/session-start.md @@ -72,10 +72,36 @@ Em main đọc `.claude/WAL.md` (sổ mạch-việc-dở H22 — ghi-đè ≤40 🔴 **Sàn-3 = định-nghĩa CANONICAL ở [`tiep.md`](tiep.md) §0** — bước này **CHỈ TRỎ**, CẤM chép logic (B1). ⚠️ **Bản trước S122 tự suy *"sổ trống ⇒ sạch"* — ĐÓ LÀ BUG**, và Sàn-3 sinh ra để vá đúng nó (cùng cặp với `tiep.md:15` cũ; lead mắc thật, không phải giả-định). -- **(a) SẠCH** = WAL không còn mục dở **VÀ** cả **4 tín-hiệu BẬC MẠNH** Sàn-3 đều im → báo **1 dòng** "WAL sạch — Sàn-3 4/4 im" rồi tiếp **Phase 1** (no-wait). +- **(a) SẠCH** = WAL không còn mục dở **VÀ** **TOÀN BỘ tín-hiệu BẬC MẠNH** Sàn-3 đều im → báo **1 dòng** "WAL sạch — Sàn-3 im toàn-bộ bậc MẠNH (`k/k`)" rồi tiếp **Phase 1** (no-wait). + > 🔴 **`k` = số tín-hiệu MẠNH, ĐỌC SỐNG từ [`tiep.md`](tiep.md) §0 — B1, CẤM chép số vào đây.** Bản trước chép cứng "4" và **đã stale ngay** khi Sàn-3 lên **5** @S146 (tín-hiệu ⑤ `.claude/sessions/` đẻ cùng hook path thứ-4). Chép số = tự đẻ drift đúng lần nới kế tiếp. - **(b) CÓ mạch dở** = WAL có `[!]`/`[ ]` **HOẶC** 🔴 **Sàn-3 bắt ≥1 tín-hiệu MẠNH — KỂ CẢ KHI SỔ TRỐNG** → BÁO **goal** + **mục `[!]` đầu-tiên** (hoặc **tín-hiệu Sàn-3 nào kêu** + đường-dẫn) + câu "có mạch dở — gõ `/tiep` để nối, hoặc bảo em bootstrap tiếp bỏ mạch" rồi **CHỜ anh chọn**. 🔴 **NGOẠI-LỆ CHỜ DUY-NHẤT** của quy-trình no-wait (BƯỚC 0 GIỮ no-wait — echo body rồi chạy thẳng). -> 🧭 Toàn-bộ Sàn-3 (3 bậc + **DUAL-ACCEPT** orphan [dạng-3 retired S123] + 2 kẽ khai thật) **và** quy-trình recovery (verify-trước-next · ground-truth-thắng · relaunch-cắt-gọt cho `wf:`) viết Ở **MỘT CHỖ** = [`tiep.md`](tiep.md) §0–§4. Chặn **TRƯỚC Phase 1 READ** = tiết-kiệm read-set ~368K khi anh chọn `/tiep` (khỏi nạp full context rồi mới nối). +> 🧭 Toàn-bộ Sàn-3 (3 bậc + **DUAL-ACCEPT** orphan [dạng-3 retired S123] + **ORPHAN-L ⑤** [S146] + 2 kẽ khai thật) **và** quy-trình recovery (verify-trước-next · ground-truth-thắng · relaunch-cắt-gọt cho `wf:`) viết Ở **MỘT CHỖ** = [`tiep.md`](tiep.md) §0–§4. Chặn **TRƯỚC Phase 1 READ** = tiết-kiệm read-set ~368K khi anh chọn `/tiep` (khỏi nạp full context rồi mới nối). + +## 📋 BƯỚC 0.8 — Thư-mục phiên-LOGIC `.claude/sessions/session-/` (S146 — session-model, **FORM chốt / NGHI-THỨC còn gated**) + +> Nền: [`session-model-se-draft.md`](../../docs/governance/session-model-se-draft.md). Một **phiên-LOGIC** = khởi-động nặng 1 lần → N **cửa-sổ vật-lý** nối bằng `/pause`→`/tiep` → chốt nặng 1 lần. + +**(a) FORM — đã chốt (theo hub-form, K4 form-conflict giải @S146):** +- Thư-mục: `.claude/sessions/session-/` · **regex `^session-\d+$`** (KHÔNG `L`, KHÔNG hậu-tố mô-tả — máy phải quét được). +- `` = **ID phiên-LOGIC, nguyên tăng** (`max( hiện có) + 1`). 🔴 **Nhãn 2 tầng (VC-1):** `S` = **cửa-sổ vật-lý** (mọi cơ-chế tick/counter/H24 GIỮ NGUYÊN đơn-vị này) · `L` = **phiên-logic**, dùng **CÙNG con số** với `session-` — hai cách viết của **một ID**, **KHÔNG phải hai bộ đếm**. +- **Ai tạo thư-mục — 🔴 SCAFFOLD IDEMPOTENT (owner chốt @S146 "giống hub"; floor manifest `101e69d6` §1 "Cộng ba miếng nền"):** *"thư-mục phiên **tự tạo ở đầu phiên**; **chạy lại nhiều lần vô hại** (không đè cái đã có)"*. ⇒ **BẤT-KỲ điểm-vào nào** (`/session-start` · `/pause` · `/tiep`) gặp `session-/` chưa tồn-tại thì **TẠO**; đã có thì **DÙNG LẠI, CẤM đè**. + - 🔴 **Ai cấp `` (khác "ai tạo thư-mục" — đừng lẫn):** **CHỈ `/session-start`** mới **MỞ SỐ MỚI** (`max( hiện có) + 1`). `/pause` · `/tiep` **KHÔNG BAO GIỜ tự tăng ``** — chúng chỉ **tạo thư-mục cho `` ĐANG MỞ** nếu nó chưa có trên đĩa (ca "cửa đầu chưa kịp scaffold"). Không có `` nào đang mở ⇒ dùng ` = max+1` **và ghi 1 dòng khai** trong khối đó là số được cấp ngoài `/session-start`. + - 🧊 **Vá mâu-thuẫn @S146:** bản trước ghi *"Ai mở `` mới: **CHỈ** `/session-start`"* trong khi [`pause.md §2.6`](pause.md) ghi *"chưa có thì đây là cửa đầu ⇒ **tạo** `session-/`"* ⇒ **hai file nói ngược nhau về quyền tạo**. Gốc lỗi = **gộp hai khái niệm khác nhau** (*cấp SỐ* ⟂ *tạo THƯ-MỤC*) vào một câu. Nay tách đôi: **cấp số = độc-quyền `/session-start`** · **tạo thư-mục = idempotent, ai gặp trước thì tạo**. Hub chỉ ràng vế thứ hai. + +**(b) Đo TRƯỚC khi tin — `.gitignore` (đo @S146, KHÔNG suy):** +```bash +git check-ignore -q .claude/sessions/session-1 ; echo "exit=$?" # → exit=1 +``` +`exit=1` = **KHÔNG bị ignore** ⇒ thư-mục phiên **được commit** (negation `.gitignore:82-83` `!.claude/` + `!.claude/**` thắng; không pattern nào sau đó loại `sessions/`). ⇒ hợp-lệ để `/pause` ghi context-map vào đây và hook nuốt. + +**(c) Hook đã phủ:** `.claude/sessions/` là **path thứ-4** của `wal-flush.ps1` (S146) ⇒ context-map tự vào `wal:` commit; **và** Sàn-3 có tín-hiệu **⑤ + ORPHAN-L** canh đúng vùng đó ([`tiep.md`](tiep.md) §0). Hai thứ này **đẻ cùng lúc** — path không có tín-hiệu = điểm mù không người canh. + +**(d) 🔴 KHAI RANH — cái gì Đà bật, cái gì CHƯA (chống đọc thành "đã adopt session-model"):** +- ✅ **Đã wire @S146:** form thư-mục · hook path thứ-4 · `/pause` ghi context-block (`pause.md §2.6`) · `/tiep` đọc + ghi biên-nhận (`tiep.md §2.6`) · tín-hiệu ⑤/ORPHAN-L. +- ⏳ **CHƯA — chờ anh duyệt bảng VC (draft §3 + §4(c)):** **KHÔNG** nghi-thức nào được chuyển sang per-L trong lượt này. Phase 1 READ · monitor re-report · H24 tick · governance-detectors · closeout **VẪN chạy per-cửa `S`** y như cũ. Bước 0.8 = **hạ-tầng + đo**, KHÔNG phải công-tắc. +- ✅ **`session_ctx_kb` (trần ngân-sách context-phiên) = 64 — OWNER CHỐT TƯỜNG-MINH @S146.** Canonical = [`memory-budget.json`](../agent-memory/memory-budget.json) → `session_ctx_kb` (+ `_session_ctx_kb_owner_set`); **B1 — KHÔNG chép số ra đây**, dòng này chỉ TRỎ. Đơn-vị **KB**, code đọc **nhân 1024**. + 🔴 **Vẫn là GHOST-WIRE, đừng đọc thành "đã wire":** đo @S146 **0 script đọc khoá** (hit duy-nhất trong `scripts/` là **comment** `nhip-no-probe.ps1:42`; đối-chứng `pull_warn_days` **có** reader thật `:190`). Có số ≠ có hành-vi. Ai wire sau phải **đọc khoá**, không hardcode. ## Phase 1 — READ (load context) @@ -94,7 +120,7 @@ Em main đọc `.claude/WAL.md` (sổ mạch-việc-dở H22 — ghi-đè ≤40 ## Phase 2 — AUDIT (state check) -### 2.1 Sub-agent state (topology — **10 product/quality + monitor INFORM-only (H1 · H2 · 2×H24 · 3×trio-memory)**; số vai canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents, B1 KHÔNG chép số ở đây) +### 2.1 Sub-agent state (topology — **10 product/quality + monitor INFORM-only (H1 · H2 · 2×H24 · 3×trio-memory · 3×round-KIỂM `tooling-harvest-audit`/`h24-audit`/`sleep-audit` S145)**; số vai canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents, B1 KHÔNG chép số ở đây) - Check TOÀN roster đã spawn chưa: - 🟦 **investigator-codebase** — internal SQL/EF/grep/reference mirror audit - 🟦 **investigator-api** — external docs/CVE/lib/cross-project reference @@ -132,7 +158,10 @@ Em main đọc `.claude/WAL.md` (sổ mạch-việc-dở H22 — ghi-đè ≤40 > Read-side "vật-chất-tối": archive `agent-memory//archive/*.md` KHÔNG vào RAG. Inject **mục-lục** (`archive/_INDEX.md`), nội dung verbatim + `.gist.md` đọc-theo-nhu-cầu. "Inject tấm bản-đồ, KHÔNG inject lãnh-thổ." -- **🌙 Sleep-check (Harness-10b, S72):** trong lúc đọc `memory-budget.json` (cùng file budget-audit), lấy `last_sleep_at` → nếu `null` HOẶC `today − last_sleep_at ≥ 7 ngày` → **INFORM gợi-ý** chạy `/sleep-recovery-memory-l2 ` (nén L2 verbatim→gist additive). 🔴 **KHÔNG auto-run** — anh consent mới chạy. **+ Byte-display (Item 8/M-10 S135):** khi INFORM fire → in kèm **tổng byte `agent-memory/*/archive/.md` CHƯA có `.gist.md`** (match PREFIX kỳ; đo TƯƠI `(Get-Item).Length` — 🔴 CẤM `Get-Content`-đếm, bẫy encoding E-010; baseline 17-07 kỳ `2026-07` ≈183KB/5 file [ví-dụ-lịch-sử — kỳ 2026-07 đã gist @S140→chưa-gist ~0]) → anh nhìn số rồi **tự ĐẶT ngưỡng byte** nếu muốn chuyển hẳn sang trigger-theo-byte; 🔴 **KHÔNG bịa số** (giữ INFORM 7-ngày — DP-5 quyền owner cục-bộ B1 §3.4). +- **🌙 Sleep-check — 🔄 ĐỔI TRIGGER @S144 (adap đợt-11, owner chốt O-6 + số):** chạy `powershell.exe -ExecutionPolicy Bypass -File scripts/distill-shard-probe.ps1` → in `SHARD-PROBE: pending= | nguong= => KEU|IM`. **KÊU → INFORM gợi-ý** chạy `/sleep-recovery-memory-l2 `. 🔴 **KHÔNG auto-run** — anh consent mới chạy. + - 🔴 **Trigger = ĐẾM VẬT THẬT** (số shard `archive/.md` chưa có `.gist.md` cặp đôi), **KHÔNG còn ngày-lịch**. Ngưỡng đọc LIVE từ `memory-budget.json → distill_trigger.min_pending_shards` (**B1 — CẤM chép số vào đây**). + - 🔴 **SHARD loại trừ `_INDEX.md` + `*.gist.md`** — bộ đếm đầu tiên của lead ra 20, trong đó **5 là `_INDEX.md`** ⇒ 25% dương-giả; số thật 15. Fault-inject 6/6 2-chiều (0/6/7-biên/8 + 2 ca anti-dương-giả). + - 🧊 **Dòng cũ `today − last_sleep_at ≥ 7 ngày` = GHI-CHÚ PHỤ, KHÔNG còn là trigger.** Đảo có chủ đích @S144 2026-07-22, chữ-ký = anh (owner), qua 2 cửa tường minh: O-6 chọn cơ-chế + trả lời sau chốt SỐ. Lý do: ngày-lịch = proxy-giả (`auto-toan-vong:21-27`), và trái chính mark Active-High `RC-pqhuy1987-20-06-2026-10-29-11` (age = false-proxy). `last_sleep_at` **giữ lại** làm dấu-thời-gian tham chiếu, không dùng để quyết. **+ Byte-display (Item 8/M-10 S135):** khi INFORM fire → in kèm **tổng byte `agent-memory/*/archive/.md` CHƯA có `.gist.md`** (match PREFIX kỳ; đo TƯƠI `(Get-Item).Length` — 🔴 CẤM `Get-Content`-đếm, bẫy encoding E-010; baseline 17-07 kỳ `2026-07` ≈183KB/5 file [ví-dụ-lịch-sử — kỳ 2026-07 đã gist @S140→chưa-gist ~0]) → anh nhìn số rồi **tự ĐẶT ngưỡng byte** nếu muốn chuyển hẳn sang trigger-theo-byte; 🔴 **KHÔNG bịa số** (giữ INFORM 7-ngày — DP-5 quyền owner cục-bộ B1 §3.4). - Đọc `.claude/agent-memory/memory-budget.json` → so kích-thước THẬT `_INDEX.md` mỗi sub vs cap. Nếu cắt-cho-vừa-ngân-sách đang rớt dấu-mốc quan trọng → **bump budget** (chốt-chặn chống "quên chỉnh ngân sách"). Đo lại bằng `scripts/measure-agent-memory.ps1` (seed-by-measure — KHÔNG đặt cap bằng số tưởng tượng). - L1 over-cap → curate L1→L2 (byte-exact additive) + build/refresh `_INDEX.md` (con-trỏ **substring** sha-keyed, fallback Ctrl-F) + `.gist.md` (nén 4-field, `distill-gen` counter, verbatim FROZEN). Rollout đầu: 4 over-cap sub (S70). @@ -210,7 +239,9 @@ ngược lại → counter += 1 ; last_ticked_session = S ; last_ticked_head **(d) JUMP:** một class trong `lead_self_audit.flag_classes` lặp **≥ `jump_on_class_repeat`** lần → **kéo audit tới sớm**, bất-kể counter. -**(e) BÁO dòng-nợ 4-vế (nâng dòng H24 cũ — Item 2 S135):** gọi `powershell.exe -ExecutionPolicy Bypass -File scripts/nhip-no-probe.ps1` → in **1 dòng** `NHIP-NO: kiem light a/e deep b/f | tran-bo-nho x over-cap | run-chua-gom y` (vế-1 nhịp-kiểm = `counter/light/deep/OVERDUE` thay dòng H24 cũ). 🔴 **probe KHÔNG chặn**: lỗi → in `probe-loi (khong chan)` → đi tiếp. OVERDUE(light|deep) → **INFORM anh** + đề-xuất spawn vai H24 tương-ứng. 🔴 **KHÔNG auto-run** — anh consent mới chạy (giống sleep-check §2.1.2). +**(e) BÁO dòng-nợ 4-vế (nâng dòng H24 cũ — Item 2 S135):** gọi `powershell.exe -ExecutionPolicy Bypass -File scripts/nhip-no-probe.ps1` → in **1 dòng** `NHIP-NO: kiem light a/e deep b/f | tran-bo-nho x over-cap | run-chua-gom y` (vế-1 nhịp-kiểm = `counter/light/deep/OVERDUE` thay dòng H24 cũ). 🔴 **probe KHÔNG chặn**: lỗi → in `probe-loi (khong chan)` → đi tiếp. OVERDUE(light|deep) → 🔴 **SPAWN AUTO cặp H24 NGAY, KHÔNG consent (owner chốt @S146 "3 → auto"; THAY luật era-S122 "anh gật mới chạy")**. Luật sống canonical ở [`session-end`](session-end.md) §L.b(j)(ii) — **B1, mục này chỉ ÁP, không chép phạm-vi**. + 🔸 **Phạm-vi 1 dòng (chống đọc nới):** gỡ **cổng NGƯỜI**, **giữ cổng NHỊP** (`h24_cadence`) ⇒ auto **khi tới nhịp**, KHÔNG phải mỗi phiên. Khác bookend-hub (hub bỏ counter) — SE chưa theo nhánh đó. + ⚠️ **KHÁC sleep-check §2.1.2** (vẫn CONSENT) và **KHÁC trio §2.1.9** (vẫn CONSENT) — 3 cổng nay **không còn cùng khuôn**, đừng suy một ra ba. 🔴 **Số nhịp = quyền anh.** Bước này **ĐỌC** `h24_cadence`, **KHÔNG** ghi. **CẤM hardcode nhịp ở đây** — copy số vào doc dẫn-xuất chính là drift mà single-source sinh ra để chặn (detector `governance-detectors.ps1` H24-2 **fail-loud** nếu key thiếu, **không** giả-định default). > 🟡 **Honest-caveat mang theo khi báo hub:** hub nói rõ *"số của các em = config của các em; ĐỪNG chép 3 số này"*. SE chọn **cùng 6/15/3** là **điểm khởi-đầu anh CỐ Ý chọn**, KHÔNG phải chép vô-thức. **Chỉnh lại sau chu-kỳ-2 CỦA SE** (deep-audit lần 2, xem .session-counter.json last_audit). Hub đã GỠ counter (bookend 07-15, sha 85bf89ca) → ví-dụ 6/15/3 "ở nguồn" = lịch-sử, KHÔNG còn mốc hub để so; delta hub hứa từ run-2 KHÔNG BAO GIỜ có (hub gỡ trước run-2) — **chưa ai được bán câu "đã chứng minh hiệu-quả"**. ✅ **Ratified 2026-07-17:** anh mark cổng reply `e50a4bd0` (2026-07-16-ai_infra-to-se-reply-adap); canonical = `memory-budget.json → h24_cadence._owner_ratified` (B1 — wording sống ở đó, đừng chép lại đây). @@ -219,7 +250,7 @@ ngược lại → counter += 1 ; last_ticked_session = S ; last_ticked_head > Trục = **CHÍNH HỆ MEMORY** (độ-giữ · hành-động · đúng-spec) — **KHÁC** H1 tooling-freshness · H2 harvest-integrity · H24 soi-LEAD · reviewer chấm-diff. 3 vai read-only INFORM-only propose-only, chạy **TUẦN TỰ**: `harness-eval` (con ĐO) → `harness-refine` (con ĐỀ-XUẤT) → `harness-audit` (con KIỂM). Contract từng vai = canonical ở [`.claude/agents/harness-{eval,refine,audit}.md`](../agents/harness-eval.md) (B1 — **KHÔNG chép contract vai vào đây**). -- **(a) 🔴 CONSENT-GATED — KHÔNG auto-run** (cùng khuôn sleep-check §2.1.2 + H24 §2.1.8(e)): em-main **IN đề-xuất 1 dòng** dạng `trio-memory: de-xuat chay eval->refine->audit @S (consent?)` → **anh gật mới chạy**. Không gật ⇒ KHÔNG chạy (KHÔNG hỏi vòng 2, KHÔNG "chạy thử cho nhanh"). +- **(a) 🔴 CONSENT-GATED — KHÔNG auto-run** (cùng khuôn **sleep-check §2.1.2** — 🧊 **@S146 GỠ vế "+ H24 §2.1.8(e)"**: H24 nay **AUTO khi tới nhịp**, viện nó làm khuôn consent là **SAI**): em-main **IN đề-xuất 1 dòng** dạng `trio-memory: de-xuat chay eval->refine->audit @S (consent?)` → **anh gật mới chạy**. Không gật ⇒ KHÔNG chạy (KHÔNG hỏi vòng 2, KHÔNG "chạy thử cho nhanh"). - **(b) 🔴 TUẦN TỰ, CẤM song song:** **3 spawn RIÊNG** đúng thứ-tự eval → refine → audit. **KHÔNG dùng `parallel()` của `hmw.js` cho bộ-ba** — refine đọc output eval, audit chấm output của cả 2; chạy song song ⇒ chấm **bản cũ** ⇒ verdict vô-nghĩa. - **(c) Lead scribe NGAY (single-writer):** return từng con → lead ghi `.claude/workflows/runs//harness-{eval,refine,audit}-return.md` **ngay khi con đó trả**, **KHÔNG đợi đủ 3**. Lý-do: 3 vai **không có Write/Edit** (chặn-bằng-thiếu-tool) nên tự-ghi-đĩa bất-khả; phiên chết giữa chừng ⇒ mất return (bài-học vòng-1 S141). - **(d) PIN đích-danh (fail-closed):** `harness-refine` nhận **path** `…/harness-eval-return.md`; `harness-audit` nhận **path run-folder** đang chấm. 🔴 Pin **missing/rỗng ⇒ vai TỪ-CHỐI / TRƯỢT** — **CẤM** để vai tự đi tìm "run mới nhất" (vớ bản cũ ⇒ **ĐẠT-ảo**). diff --git a/.claude/commands/sleep-recovery-memory-l2.md b/.claude/commands/sleep-recovery-memory-l2.md index cbf4837..1719f03 100644 --- a/.claude/commands/sleep-recovery-memory-l2.md +++ b/.claude/commands/sleep-recovery-memory-l2.md @@ -49,7 +49,7 @@ Hiện-hành = `investigator-codebase · investigator-api · implementer-backend | Đường | Cơ chế | |---|---| | **Tay** | Anh gõ `/sleep-recovery-memory-l2 ` bất kỳ lúc nào | -| **Auto-check (INFORM-only)** | `/session-start` + `/session-end` đọc `last_sleep_at` trong `.claude/agent-memory/memory-budget.json` → nếu `today − last_sleep_at ≥ 7` (ngày) → **gợi-ý** chạy command (INFORM anh, **KHÔNG tự-chạy autonomous**). Anh consent → chạy. 🔸 **Kèm hiển-thị byte (M-10 / DP-5):** khi INFORM fire, 2 site runtime (`/session-start §2.1.2` + `/session-end §L.b(c)`) in kèm **tổng byte `archive/.md` chưa có `.gist.md`** (match PREFIX kỳ; baseline 17-07: kỳ `2026-07` ≈ 183KB/5 file [ví-dụ-lịch-sử — đã gist @S140→~0]) để anh nhìn số **rồi tự đặt ngưỡng byte** nếu muốn chuyển hẳn (không bịa số) — **INFORM 7-ngày GIỮ** (quyền owner cục-bộ, B1 §3.4; cấm-là-cấm-hub-phát-chuẩn). ⚠️ Việc **WIRE** byte nằm ở 2 site đó (**LANE-A**), **KHÔNG** ở command này — dòng này chỉ là **MÔ-TẢ** (tránh ghost-wire "defined-but-unread", H18). | +| **Auto-check (INFORM-only)** | 🔄 **ĐỔI @S144** — `/session-start §2.1.2` + `/session-end §L.b(c)` chạy `scripts/distill-shard-probe.ps1` → đếm **shard chưa-gist** (loại trừ `_INDEX.md` + `*.gist.md`), so ngưỡng đọc-live `memory-budget.json → distill_trigger.min_pending_shards`. KÊU → **gợi-ý** chạy command (INFORM anh, **KHÔNG tự-chạy autonomous**). Anh consent → chạy. 🧊 **Dòng cũ `today − last_sleep_at ≥ 7 (ngày)` nay là GHI-CHÚ PHỤ, KHÔNG còn quyết-định** — owner đảo có chủ đích @S144 2026-07-22 (O-6 cơ-chế + chốt số 7 shard); trước đó `:52` giữ 7-ngày là **quyền owner cục-bộ DP-5**, và chính owner gỡ, không phải AI. 🔸 **Kèm hiển-thị byte (M-10 / DP-5):** khi INFORM fire, 2 site runtime (`/session-start §2.1.2` + `/session-end §L.b(c)`) in kèm **tổng byte `archive/.md` chưa có `.gist.md`** (match PREFIX kỳ; baseline 17-07: kỳ `2026-07` ≈ 183KB/5 file [ví-dụ-lịch-sử — đã gist @S140→~0]) để anh nhìn số **rồi tự đặt ngưỡng byte** nếu muốn chuyển hẳn (không bịa số) — **INFORM 7-ngày GIỮ** (quyền owner cục-bộ, B1 §3.4; cấm-là-cấm-hub-phát-chuẩn). ⚠️ Việc **WIRE** byte nằm ở 2 site đó (**LANE-A**), **KHÔNG** ở command này — dòng này chỉ là **MÔ-TẢ** (tránh ghost-wire "defined-but-unread", H18). | > 🔴 **State-file `last_sleep_at` có 1 home DUY NHẤT:** `.claude/agent-memory/memory-budget.json` (root-key `last_sleep_at`, cạnh `tiers`/`measured`). KHÔNG ghi ở `_INDEX.md` / nơi khác. *(SE đặt budget-file trong `agent-memory/`, KHÁC AI_INFRA gốc đặt `.claude/memory-budget.json` — đây là tailor path SE.)* Field `last_sleep_at` **đã thêm** (null baseline, S72) vào budget-file SE — auto-check **đã wired** ở `/session-start §2.1.2` + `/session-end §L.b(c)` (đọc field → INFORM gợi-ý nếu null/≥7d). Lần sleep đầu lead set `= today` (Phase 4.4). Lead = single-writer field này (B3). @@ -103,6 +103,10 @@ Lead distill proposal thành gist theo 4 bước: 3. **G-009 post-scan (BẮT BUỘC sau ghi):** Grep mojibake (`§` · `â†` · `ðŸ` · `KHÃ` — seq cụ-thể, né bare-`Ã`) + dollar-expansion (`/usr/bin/bash`) trên file vừa ghi → **phải sạch**. Bẩn → de-corrupt qua Write tool. 4. Cập-nhật `.claude/agent-memory/memory-budget.json` field `last_sleep_at = ` (root-key; **thêm mới nếu chưa có**). B3 single-writer, Write/Edit. 🔴 KHÔNG hand-edit `measured_bytes` (chỉ script `scripts/measure-agent-memory.ps1` được sửa số đo) — chỉ chạm `last_sleep_at`. +## Phase 4.5 — 🔬 sleep-audit AUTO (KIỂM vòng nén-ngủ, C4/C4b vai #3/3, land S145) + +Gist + Fidelity-gate xong (Phase 3+4) ⇒ spawn `sleep-audit` NGAY — **AUTO, KHÔNG consent** (owner S145). Đọc `.gist.md` mới + Fidelity verdict + claim giảm-byte → verdict per-claim + **tự đo lại byte** archive gốc vs gist (đối-chứng claim) + **thách-CLEAN** (Fidelity 5P/0F ⇒ mở 1 gist đối-chứng `.md` gốc xem trung-thực, không mất 4-field load-bearing). 🔴 no-self-exempt độc-lập lượt nén (m-3). 🔴 Fail-safe: 0 `.gist.md` tươi phiên này ⇒ **NO-OP im-lặng**. Verdict gộp vào Phase 5 report. Propose-only → em main VERIFY→APPEND (git-diff backstop). Contract canonical `.claude/agents/sleep-audit.md` (B1). + ## Phase 5 — REPORT + COMMIT 1. **Report:** mỗi agent xử-lý → `{verbatim-file · gist-file MỚI · #entry trước→sau · ratio (báo-cáo) · importance-drop thấp=N · coverage-diff PASS/FAIL · Fidelity PASS/self-gate}`. diff --git a/.claude/commands/tiep.md b/.claude/commands/tiep.md index b3ba1a7..365ecba 100644 --- a/.claude/commands/tiep.md +++ b/.claude/commands/tiep.md @@ -18,13 +18,15 @@ Thực-hiện **tuần-tự**: §0 (sàn) → §1 → §2 → §3 → §4. > > **Vì sao sàn này tồn-tại:** WAL trống **KHÔNG** hàm ý sạch. Suy thẳng *"chain rỗng ⇒ không có mạch dở ⇒ dừng"* là **BUG**, và nó **đã từng sống ngay trong chính file này** (`tiep.md:15` cũ) + `session-start.md:51` — lead mắc thật, không phải giả-định. -### Vì sao WAL trống không đủ: hook có **3 điểm mù** +### Vì sao WAL trống không đủ: hook có **4 điểm mù** -`.claude/hooks/wal-flush.ps1:7` tự-commit **3 path** ở turn-boundary: `.claude/WAL.md` · `.claude/agent-memory/` · `.claude/workflows/runs/`. -⇒ Hai tín-hiệu trực-giác nhất — **"cây bẩn"** và **"có commit chưa đẩy"** — đều **MÙ đúng 3 vùng đó**: hook vừa dọn sạch cây, vừa biến việc-dở thành `wal:` commit trông như nhiễu. +`.claude/hooks/wal-flush.ps1:13` tự-commit **4 path** ở turn-boundary: `.claude/WAL.md` · `.claude/agent-memory/` · `.claude/workflows/runs/` · `.claude/sessions/`. +⇒ Hai tín-hiệu trực-giác nhất — **"cây bẩn"** và **"có commit chưa đẩy"** — đều **MÙ đúng 4 vùng đó**: hook vừa dọn sạch cây, vừa biến việc-dở thành `wal:` commit trông như nhiễu. ⇒ Nên phải soi bằng **tín-hiệu hook KHÔNG chạm tới được**. -### 🔴 BẬC MẠNH — thấy **1 trong 4** ⇒ **HỎI LẠI ANH**, KHÔNG tự kết-luận sạch +> 🔴 **Path thứ-4 `.claude/sessions/` thêm @S146** (cùng gói session-model, hook 4-path). **Nới hook = ĐẺ THÊM một điểm mù** ⇒ bắt buộc đẻ kèm tín-hiệu **⑤** dưới đây trong **CÙNG một lần sửa** — nới path mà quên sàn = tái mở đúng bug "sổ trống ≠ sạch" mà Sàn-3 sinh ra để chặn. Luật gốc hook (danh-sách path) = canonical [`harness-11-engine.md`](../../docs/governance/harness-11-engine.md) **PHẦN N (N.2)**, mục này KHÔNG chép luật, chỉ khai **hệ-quả lên khả-năng phát-hiện**. + +### 🔴 BẬC MẠNH — thấy **1 trong 5** ⇒ **HỎI LẠI ANH**, KHÔNG tự kết-luận sạch | # | Tín-hiệu | Vì sao đáng tin | Lệnh | |---|---|---|---| @@ -32,6 +34,7 @@ Thực-hiện **tuần-tự**: §0 (sàn) → §1 → §2 → §3 → §4. | **②** | `origin/main..HEAD` có commit **KHÔNG** phải `wal:` | hook **không bao giờ sinh** loại commit này ⇒ có = người làm thật ⇒ không mù | `git log --format='%s' origin/main..HEAD \| grep -qv '^wal:'` | | **③** | `closing:` treo trong WAL | = Sàn-2 sentinel (xem §0.b) | `grep -q '^closing:' .claude/WAL.md` | | **④** | `wal:`-commit **chưa đẩy** có đụng `.claude/workflows/runs/` | 🔴 **thu-hồi một phần điểm mù**: dù `WAL.md` bị **xoá trắng**, **commit của chính hook vẫn tố-giác** rằng một run đã được dựng | `git log --name-only --format='%s' origin/main..HEAD \| grep -q 'workflows/runs/'` | +| **⑤** | `wal:`-commit **chưa đẩy** có đụng `.claude/sessions/` | 🔴 **MIRROR ④ cho path thứ-4 (S146)**: `/pause` ghi **context-map cộng-dồn** vào `sessions/session-/` ⇒ hook nuốt nó thành `wal:` commit trông như nhiễu. Không có ⑤ thì phiên chết **còn nguyên context-map** mà sàn vẫn báo "sạch" = **tái mở đúng bug** Sàn-3 sinh ra để chặn. Đây cũng là **cửa vào orphan-L** (xem block ⑤ dưới) | `git log --name-only --format='%s' origin/main..HEAD \| grep -q '.claude/sessions/'` | #### ① DUAL-ACCEPT — 2 dạng bản-ghi-kết-quả TÍNH LÀ ĐÓNG *(dạng-3 RETIRED @S123 — xem dưới)* @@ -72,10 +75,37 @@ done > 2. **Dual-accept = lưới PHÁT-HIỆN cho bản CŨ, KHÔNG phải giấy phép VIẾT bản MỚI.** Đúng khuôn C8 đã dùng sẵn (*tha di-sản, cấm viết mới kiểu cũ*). 🔴 **Run MỚI BẮT BUỘC ghi dạng-1** (`-synthesis.md` phẳng) — `workflows/README.md:17` thiết-kế **tên file mang nghĩa** (RAW `sub-` ⟂ VERIFIED `-synthesis.md`); dạng-3 phá đúng thiết-kế đó. Đo @S122: cùng ngày 07-12, `h22-wal-adopt` ghi dạng-1 còn `S112-*` ghi dạng-3 ⇒ **thói-quen không nhất-quán, KHÔNG phải migration**. > ✅ **@S123 khoảng-cách doc-vs-máy này Đà ĐÓNG:** trước đây doc *cấm* dạng-3 mà detector *nhận* ⇒ cấm bằng trí-nhớ. Nay **gỡ nhánh dạng-3** ⇒ luật và máy nói **cùng một câu**. Di-sản không kêu oan (6 folder cũ đều đã có flat), mà tái-sinh thì **máy bắt được ngay**. -### 🟡 BẬC TRUNG-BÌNH — nhiều file bẩn **NGOÀI** 3 path hook persist +#### ⑤ ORPHAN-L — phiên-LOGIC mồ-côi *(S146 — đẻ CÙNG hook 4-path, KHÔNG tách)* + +> **Là gì:** một **phiên-LOGIC** (`.claude/sessions/session-/` — form hub, xem [`session-model-se-draft.md`](../../docs/governance/session-model-se-draft.md)) đã **mở + đã tích context-map** nhưng **chưa được nối lại và chưa đóng** ⇒ cửa-sổ vật-lý chết giữa phiên-logic. Cùng **class** với orphan run-folder ①: *vật trên đĩa tố-giác việc dở*, khác vật. + +**DUAL — 2 cửa ĐỘC-LẬP, kêu 1 cửa là đủ để NÊU:** + +```bash +# (a) cửa GIT = đúng tín-hiệu ⑤ bảng trên — bắt được CẢ KHI thư-mục đã bị dọn khỏi cây làm việc +git log --name-only --format='%s' origin/main..HEAD | grep -q '.claude/sessions/' + +# (b) cửa ĐĨA — git-independent, miễn-nhiễm hook (mirror ①: đọc đĩa, KHÔNG đọc git) +# Cân-bằng-sổ: mỗi `pause-*` phải có ĐÚNG một đối-ứng (`resume-*` do /tiep ghi, hoặc closed.md do đóng-L). +for d in .claude/sessions/session-*/; do + [ -d "$d" ] || continue + p=$(ls "$d"pause-*.md 2>/dev/null | wc -l); [ "$p" -eq 0 ] && continue + r=$(ls "$d"resume-*.md 2>/dev/null | wc -l) + c=0; [ -f "$d/closed.md" ] && c=1 + [ "$p" -gt $((r + c)) ] && echo "ORPHAN-L: $d (pause=$p resume=$r closed=$c)" +done +``` + +- ✅ **Đối-ứng `resume-*` CÓ người ghi thật** — `/tiep` §2.6 dưới (cùng file này) ⇒ vòng `pause ↔ tiep` **tự đóng**, không phải cơ-chế treo. +- ✅ **`closed.md` Đà WIRE @S146** (owner chốt *"giống hub"* — `_end` chốt-kết của manifest `101e69d6`): nghi-thức ghi nằm ở [`session-end.md`](session-end.md) **§6.3-bis** (FROZEN · 4 trường · idempotent NO-OP · NO-OP im-lặng nếu 0 thư-mục). ⇒ **cân-sổ nay ĐỦ CẢ HAI vế**: `pause` đối-ứng bằng `resume-*` (`/tiep §2.6`) **hoặc** `closed.md` (đóng-L) ⇒ ca *"pause rồi đóng thẳng không qua `/tiep`"* **hết kêu oan**. + 🧊 *Nấc cũ (tới S145): "`closed.md` CHƯA wire — VC-2 còn chờ anh duyệt", kèm hệ-quả "chỉ ca pause-rồi-đóng-thẳng mới thiếu đối-ứng". **Cả hai nay SAI** — giữ 1 dòng làm vết.* + 🔴 **Bài học lấy từ chính chỗ này (H24 `lead-view-auditor` bắt @S146):** MÁY ở ngay trên (`:89` `:94` `:95`) **đã đọc `closed.md` thật** từ lúc block này ra đời, mà **PROSE vẫn khai "chưa wire"** ⇒ đây là **lật-ngược của ghost-wire**: **wired-but-declared-unwired** — và nó nằm đúng dưới nhãn *"chống ghost-wire H18"*. ⇒ **Ghost-wire soi được 2 CHIỀU**: khai-có-mà-không-chạy **và** chạy-thật-mà-khai-chưa. +- 🟢 **Hướng hỏng = AN-TOÀN:** quên ghi `resume-*` ⇒ sổ lệch ⇒ **KÊU ⇒ HỎI LẠI ANH**. Sai về phía *hỏi thừa*, không về phía *im lặng bỏ việc* — đúng thiên-hướng của Sàn-3. + +### 🟡 BẬC TRUNG-BÌNH — nhiều file bẩn **NGOÀI** 4 path hook persist 🔴 **PHẢI loại nhiễu EOL TRƯỚC khi đếm** — repo có ~188 file dính EOL-only diff; không loại thì bậc này **LUÔN KÊU** ⇒ tự vô-hiệu-hoá. -Bẩn ngoài 3 path + không phải EOL-only ⇒ **NÊU**, hỏi lại nếu nhiều. +Bẩn ngoài 4 path + không phải EOL-only ⇒ **NÊU**, hỏi lại nếu nhiều. ### ⚪ BẬC YẾU — bẩn thô (`git status --porcelain` khác rỗng) @@ -84,13 +114,14 @@ Tín-hiệu **YẾU NHẤT**, dùng cuối. 🔴 **`porcelain` rỗng KHÔNG ph ### Kết-luận sàn - Bậc MẠNH thấy **≥1** ⇒ **HỎI LẠI ANH** (nêu rõ tín-hiệu nào, đường-dẫn nào). **CẤM tự kết-luận "sạch".** -- **Cả 4 tín-hiệu MẠNH đều im** + WAL chain rỗng/toàn `[x]` ⇒ *mới* được báo "**không có mạch dở**" và **DỪNG SẠCH**. +- **Cả 5 tín-hiệu MẠNH đều im** + WAL chain rỗng/toàn `[x]` ⇒ *mới* được báo "**không có mạch dở**" và **DỪNG SẠCH**. + > 🔴 **Số tín-hiệu = 5 kể từ S146** (⑤ đẻ cùng hook path thứ-4). **Luật bất-biến khi nới hook về sau: mỗi path mới thêm vào `wal-flush.ps1` ⇒ mỗi tín-hiệu MẠNH mới ở đây, CÙNG một lần sửa.** Nới path mà không đẻ tín-hiệu = **đẻ điểm mù không người canh**; đó là toàn bộ lý do Sàn-3 tồn-tại. ## 0.b Sàn-2 — đọc sentinel `closing:` (self-heal) - `session-end` ghi `closing: S @` vào WAL ở **BƯỚC 0** (trước mọi flush); xoá ở **`§6.4`**. - ⇒ **Thấy `closing:` treo = phiên trước bị cắt GIỮA lúc đóng sổ** (không phải đóng xong). -- **Self-heal:** `closing:` treo **NHƯNG** cả 4 tín-hiệu MẠNH khác đều im + ground-truth sạch ⇒ **dọn dấu 1 lần, đi tiếp** (không bắt anh xử tay). +- **Self-heal:** `closing:` treo **NHƯNG** **cả 4 tín-hiệu MẠNH CÒN LẠI** đều im (= 5 trừ chính ③ `closing:`; số cập-nhật @S146 cùng tín-hiệu ⑤) + ground-truth sạch ⇒ **dọn dấu 1 lần, đi tiếp** (không bắt anh xử tay). - `closing:` treo **VÀ** có tín-hiệu MẠNH khác ⇒ **HỎI LẠI**. --- @@ -99,7 +130,7 @@ Tín-hiệu **YẾU NHẤT**, dùng cuối. 🔴 **`porcelain` rỗng KHÔNG ph - Đọc file `.claude/WAL.md`. - **Chain rỗng / toàn `[x]` / file không tồn-tại ⇒ 🔴 CHƯA ĐƯỢC KẾT-LUẬN GÌ.** Bắt buộc chạy **§0 bậc MẠNH** trước: - Có tín-hiệu MẠNH ⇒ **HỎI LẠI ANH** (sổ trống nhưng đĩa nói còn việc — đúng ca sàn này sinh ra để bắt). - - 4/4 tín-hiệu MẠNH im ⇒ báo "**không có mạch dở**" và **DỪNG SẠCH**. KHÔNG bịa việc. + - **5/5** tín-hiệu MẠNH im ⇒ báo "**không có mạch dở**" và **DỪNG SẠCH**. KHÔNG bịa việc. - *(🧊 Bản trước S122 suy thẳng "chain rỗng ⇒ dừng sạch" — **đó là bug**, chính là thứ Sàn-3 vá.)* ## 2. Đối-chứng ground-truth @@ -110,6 +141,14 @@ Tín-hiệu **YẾU NHẤT**, dùng cuối. 🔴 **`porcelain` rỗng KHÔNG ph ## 2.5 TICK counter + dòng-nợ (H24 — TICK TRƯỚC, dòng-nợ SAU; Item 1(b)+2 S135) - **TICK** `.claude/governance/.session-counter.json` **theo contract** (idempotent — NO-OP nếu cùng nhãn-phiên/cùng HEAD) — 🔴 **CON-TRỎ `session-start.md §2.1.8`, CẤM chép logic tick** (B1 canonical). Nhãn `/tiep` = **nhãn-phiên MỚI** (label-convention §2.1.8) ⇒ tick fire NGAY cửa vào, OVERDUE @9 hiện tại đây thay vì đợi cuối phiên. - **Dòng-nợ (SAU tick — n-3):** gọi `powershell.exe -ExecutionPolicy Bypass -File scripts/nhip-no-probe.ps1` in dòng-nợ 4-vế (vế-1 nhịp-kiểm đọc post-tick). 🔴 **probe KHÔNG chặn điểm dừng**: lỗi → in `probe-loi (khong chan)` → đi tiếp. + > 🔗 **Predicate C7 đầy-đủ (probe được phép chạy ở điểm dừng) = canonical [`harness-11-engine.md`](../../docs/governance/harness-11-engine.md) §N.8.** 🔴 **B1 — dòng này CHỈ TRỎ, CẤM chép predicate sang đây** (chép 2 nơi = 2 nguồn sự-thật, đúng thứ B1 sinh ra để chặn). + +## 2.6 Đọc context-map phiên-LOGIC + ghi biên-nhận `resume-*` (S146 — cặp với `/pause` bước 2.6) + +- **Đọc:** nếu có `.claude/sessions/session-/` → đọc **TẤT CẢ** `pause-*.md` theo thứ-tự thời-gian = **bối-cảnh cộng-dồn** của phiên-logic (quyết-định đã chốt · delta còn sống · con-trỏ run/commit). 🔴 **Đây là lane CỘNG-DỒN, khác WAL** — WAL là sổ **mạch-sống ghi-đè ≤40 dòng** (liếc-một-cái-là-biết); context-map là **tích-luỹ, không ghi đè**. Đọc context-map **KHÔNG** thay việc chạy `verify:` — ground-truth vẫn thắng (§3). +- **Ghi biên-nhận — 🔴 THỰC-HIỆN SAU §3** (đọc ở đây, ghi sau khi reconcile xong; **bắt buộc**): tạo `.claude/sessions/session-/resume-S-.md` — **1 khối ngắn**: nối từ `pause-*` nào · lệch gì so `chain:` (nếu có) · `next:` đang thực-thi. +- 🔴 **Vì sao bắt buộc:** biên-nhận này là **đối-ứng cân-sổ** của tín-hiệu **ORPHAN-L ⑤** (§0). Thiếu nó ⇒ sổ lệch ⇒ lần sau **KÊU** ⇒ hỏi lại anh. Hỏng về phía *hỏi thừa* = an-toàn; nhưng ghi đủ thì sàn mới **im đúng**. +- 🔸 `session-` **KHÔNG mở mới ở `/tiep`** — `/tiep` **nối** phiên-logic đang mở. Mở `` mới = việc của `/session-start` (xem `session-start.md` BƯỚC 0.8). ## 3. Ground-truth thắng WAL - **LỆCH** (kết-quả `verify:` / `git status` mâu-thuẫn `chain:`) → **TIN GROUND-TRUTH**: sửa WAL cho khớp thực-tế, **báo chỗ lệch** cho user, RỒI MỚI chạy tiếp. KHÔNG mù-quáng chạy theo chain sai. diff --git a/.claude/governance/.session-counter.json b/.claude/governance/.session-counter.json index 7a5b752..94088db 100644 --- a/.claude/governance/.session-counter.json +++ b/.claude/governance/.session-counter.json @@ -1,7 +1,7 @@ { "_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 -> 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 => +1, not +2).", - "_why_this_path": "Deliberately .claude/governance/ and NOT .claude/agent-memory/. The hook covers exactly 3 paths (.claude/WAL.md, agent-memory/, workflows/runs/); .claude/governance/ is OUTSIDE all three, so this file is never swept into a 'wal:' commit as a side effect. Compare .claude/agent-memory/.mfe-state.json, which IS inside the hook's reach - a counter must not live there.", + "_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 'wal:' commit as a side effect. Compare .claude/agent-memory/.mfe-state.json, which IS inside the hook's 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.", "_contract": { "tick": "tick(session, head): if head == last_ticked_head OR session == last_ticked_session -> NO-OP (idempotent per HEAD AND per session-label). The Stop-hook wal-flush.ps1 moves HEAD mid-session (auto-commit every turn-boundary), so the head-clause alone would let a single real session tick more than once; the session-label clause pins ONE session-label to exactly +1, not +2. This closes the +2/cycle trap: a /pause commit changes HEAD, but the same session-label still NO-OPs. Else counter = counter + 1, last_ticked_session = session, last_ticked_head = head, last_ticked_at = date.", "fail_loud_on_regress": "Two triggers, two verdicts (contract v2 - hub template 58e28bae C-1, adopted S141). (1) counter REGRESSION: an incoming counter LOWER than the stored counter => FAIL-LOUD, report to owner, DO NOT silently reset (a backwards counter means the file was rolled back or hand-edited; a silent reset would hide the cadence gap). (2) last_ticked_head NOT reachable from HEAD => classify BEFORE alarming: if the object still EXISTS in the repo (git cat-file -t = commit) AND the counter did not regress, this is SQUASH-BENIGN - the tick pointed at a wal:/session commit that the closeout squash lifted out of history; append ONE trace entry to history[] with event-class squash-benign and CONTINUE (no owner alarm; the intact prior session-label corroborates - a benign squash keeps it, tamper does not). Only if the object is MISSING (cat-file fails) OR the counter regressed => FAIL-LOUD as before (anti-tamper layer unchanged). Rationale: every closeout squashes the session wal: commits, so the head captured at the previous tick routinely becomes unreachable-but-present - expected drift, not tampering (3 historical false-FAIL-LOUD cases S127/S133/S139 all reclassify to squash-benign under this contract).", @@ -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 label, NEVER reuse). history[] is append-unbounded BY DESIGN => 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 'no tick has ever happened', 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": 17, - "last_ticked_session": "S143", - "last_ticked_head": "1a0fa59de2e876d4b4f354070d290782fe95053f", + "counter": 20, + "last_ticked_session": "S146", + "last_ticked_head": "474199b32fb0371d76aa2f1c43daa849f973f9fd", "last_ticked_at": "2026-07-22", "last_audit": { "light_at_counter": 17, @@ -63,6 +63,16 @@ "at": "2026-07-22", "session": "S143", "event": "DEEP-audit RAN at counter=17 - FORCE-FIRE SOM 1 NHIP (nguong deep = deep_at_counter 3 + deep_every 15 = 18; chay som theo direction owner 'OK lam het di', KHONG phai toi-han tu-nhien - ghi ro de lan sau doc so khong tuong nham cadence tu keu). Consent = owner gat truc-tiep. Ca 2 vai H24 chay 1 luot; deep bao ham light nen set CA HAI light_at/deep_at = 17 (tranh no ao o phien sau). lead-view 3 FLAG deu view-residual-asym MED (STATUS:450 + agents/README:190 con khai 'NO Write/Edit' nhu co-che chan; agents/README:27 'Roster THAT' liet 14 vai thieu 3 trio) - reviewer bat them site-4 cung lop (:225 VALID_ROLES tu xung 'DU roster' con 14 + '4 monitor'); CA 4 VA @36cefcc. Nguyen nhan lot ca wave: acceptance AC4 grep theo CON SO ('roster 14|14/14|...') trong khi 2 site liet-ke TEN, khong chua so nao => 0 hit doc thanh 'sweep sach'. lead-omission 3 FLAG (gap-carry-dropped: khai 13 carry, union dung = 14, TONG KHONG DOI nen trong nhu dung - session-model-adopt roi dung luc chi con cho chu ky owner; gap-decision-sunk: 3 muc 'Cho-anh' spec:68 chim 2 nhan phien, grep 9 token x 4 be-mat = 0 hit, dung don-bay ca-song-sinh pull_warn_days de chung la BO SOT chu khong phai owner-giu; gap-owner-specifics: WAL khong chep luot gat 2 - DA VA trong phien) + 3 INFORM. INFORM-3 = su-co khong xep duoc vao enum DONG: vai TU CHOI tu che class va escalate dung luat => owner mo them 'gap-incident-unrecorded' (10->11). Ca 3 vai + 2 monitor closeout deu GARBLE #53 (5/5 trong 1 phien) - vot tron tu sub-*.md nho ghi-dia-trong-luc-lam, 0 mat du-lieu. class_repeat: view-residual-asym 0->1, gap-carry-dropped 0->1, gap-decision-sunk 0->1, gap-owner-specifics 1->2, view-stale-status 2->0 (khong tai-hien, consecutive semantics), gap-carry-aged giu 1 (INFORM khong tinh). jump_on_class_repeat=3 - KHONG class nao cham jump." + }, + { + "at": "2026-07-22", + "session": "S144", + "event": "squash-benign (contract v2 nhanh-2, LAN THU HAI chay runtime - lan dau la S143 closeout). Tick S143->S144: counter 17->18, head 1a0fa59d -> d5656ab6. Phan-loai TRUOC khi bao: (a) git cat-file -t 1a0fa59d = commit => object CON TON TAI; (b) git merge-base --is-ancestor 1a0fa59d HEAD = exit!=0 => KHONG reachable; (c) counter doc 17 == counter luu 17 => KHONG lui. => SQUASH-BENIGN => ghi vet + DI TIEP, KHONG alarm owner. Nguyen-nhan: closeout S143 squash cac wal:-commit (squash->count->push) nen head luc tick S143 roi khoi lich su - drift KY-VONG, khong phai tamper; nhan-phien cu 'S143' con nguyen = corroborate 2 nguon. Lead do DOC LAP bang 3 lenh git (khong chi tin detector H24-5, no INFORM-only va khong co rang). OVERDUE sau tick: light 18-17=1 < 6, deep 18-17=1 < 15 => ca hai CHUA toi han (moc ke tiep: light ~23, deep ~32)." + }, + { + "at": "2026-07-22", + "session": "S145", + "event": "CLEAN tick (KHONG squash-benign) qua /tiep resume mach S144. Nhan-phien MOI S145 theo label-convention S135 (conversation moi = nhan moi ke ca vao bang /tiep; reuse S144 se keo OR-guard NO-OP => phep-7 +0, cam). Tick S144->S145: counter 18->19, head d5656ab -> 95ef595. Phan-loai TRUOC khi tick tren last_ticked_head cu d5656ab: (a) counter doc 18 == luu 18 => KHONG lui; (b) git merge-base --is-ancestor d5656ab HEAD = exit 0 => CON REACHABLE (khac S144/S143 not-reachable-but-exists) => day la tick SACH binh-thuong, KHONG phai squash-benign, KHONG fail-loud. OVERDUE sau tick: light 19-17=2 < 6, deep 19-17=2 < 15 => ca hai CHUA toi han (moc ke tiep: light ~23, deep ~32). JUMP: class_repeat cao nhat gap-owner-specifics=2 < 3 => khong jump. => KHONG co H24 audit phien nay." } ] } \ No newline at end of file diff --git a/.claude/governance/ACTIVE-MARKS.md b/.claude/governance/ACTIVE-MARKS.md index 2422988..9bf13cb 100644 --- a/.claude/governance/ACTIVE-MARKS.md +++ b/.claude/governance/ACTIVE-MARKS.md @@ -17,7 +17,7 @@ | `RC-pqhuy1987-20-06-2026-10-29-11` | `rules.md §6.6 DM-time/age` (≙ §F4.2-ext / H-14) | **Mở-rộng mark-1** — time/age/recency-decay = **false-proxy** (cùng-họ team-size); kiến-trúc KHÔNG dựa cũ / lâu-chưa-dùng / auto-decay; trần budget=(dung-lượng÷tốc-độ-thay-mới) KHÔNG núm-decay-tuổi, drift=đường-nền-cuộn KHÔNG cửa-sổ-tuổi; **additive** (mark-1 GIỮ) | **pain:** cap∝chunk_count = Goodhart-vanity + age-window drift = alarm-spam (sự-cố thật H-14); SE memory-budget từng dễ mắc "giảm-theo-độ-cũ" · **volume:** 6 dự-án áp budget/drift/eval + SE L1/L2/L3 + archive-gate · **quality:** age-decay cắt memory-tốt = false-economy (DM-004 Goodhart §6.6) | null (additive) | 🔖 **Active-High** (anh-confirm S79 via `/user-mark-active-high` · P4 DACI · supersedes:null) | | `RC-pqhuy1987-20-06-2026-23-07-37` | `harness-11-engine.md §G` + `memory-budget.json` + `rules.md §6.6` (≙ AI_INFRA H-15) | **H-15 memory-budget per-agent (token-based):** token-governor (**v3 §G.5 S83:** Tầng-1 hot-feed per-role **lead 380K (v4 §G.5 S94 owner-override, SE-specific để chứa full read-set ~368K — lead KHÔNG còn AI_INFRA-parity)/mem-sub 60K/wf-sub 50K** (subs giữ parity) + **spawn-fill-to-budget** (sub Tầng-1 = MEMORY.md byte-cap + spawn-prompt giàu, `spawn_fill_directive`); **v2 §G.4 S82:** L2/L3 **bỏ-trần** on-demand + báo-% 2-đầu-phiên; con-số = **quyền CHỦ-DỰ-ÁN/anh** + AI thực-thi-đúng-số + báo-%) + **value-gated archival** (giữ recurring-bug/anti-pattern/gotcha bất-kể tuổi) + fill-L1-full (budget = sàn-tận-dụng KHÔNG trần-tiết-kiệm) + work-state-block @session-start + %-print 2-đầu-phiên + 2-governor (byte⟂token) | **pain:** tiết-kiệm-token → quên-việc/rơi-trạng-thái giữa phiên (sự-cố thật — Tầng-1 mỏng = lead quên việc nhiều phiên, bằng-chứng v2); SE keep-floor age-based có thể archive gotcha cũ ra khỏi L1 — value-gate FLAG đã bắt thật (test-specialist gotcha#/guard) · **volume:** 11-agent × (SÀN 30K + Tầng-1 hot-feed per-role lead 220K/mem-sub 60K/wf-sub 50K, v3 §G.5 full-parity) always-load/spawn + L2 archive ~240KB (cicd 194KB) cần value-protect · **quality:** quên-việc → làm-lại → tốn-hơn (Goodhart); giữ hard-won lessons | null (additive — mark `…11` GIỮ; H-15 mở-rộng value-axis xuống tầng-bộ-nhớ) | 🔖 **Active-High** (anh-confirm S81 · **v2-delta anh-confirm S82** `RC-pqhuy1987-21-06-2026-01-58-01` — hot-feed-lớn/bỏ-trần/anh-authority · **v3-delta anh-directed S83** `RC-pqhuy1987-22-06-2026-16-35-37` — full-parity 220/60/50 + spawn-fill-to-budget · **v4-delta anh-directed S94** `RC-pqhuy1987-29-06-2026-23-25-50` — lead 220K→**380K** SE-override để chứa full read-set ~368K (⚠️ ~97% fill = context-rot trade-off owner-accepted; trần budget ⟂ harness Read-25K/call → mega-line STATUS/HANDOFF VẪN cần re-tier mới Read-trọn), P4 DACI report-before-stamp ✓) | | `RC-pqhuy1987-11-07-2026-20-42-01` | `harness-11-engine.md §K.E` + `.claude/commands/fable-{real,clone}.md` + `session-start BƯỚC 0.5b/0.6` (≙ AI_INFRA H-21 + model-tier-v3) | **H-21 engine-đắt PER-INVOCATION + spec-file kết-tinh + MTv3 lead owner-choice** (supersede-partial H19). **Sàn:** (1) engine-đắt CHỈ chạy trong lượt anh gõ `/fable-real\|/fable-clone <đề-bài>` — vai anh gán đích-danh ∈ roster 12, thiếu/sai → hỏi anh, lead KHÔNG tự ý (kể cả HMW-ON) · (2) mỗi run sinh **spec-file 3-mục** (engine propose → lead verify → LEAD ghi → worker hạng-hai thực thi theo spec, kể cả run chấm/verify) · (3) lead = **frontier-class do anh chọn per-session** {Fable 5 \| Opus 4.8 — 1M MAX}, CẤM Sonnet/Haiku-class ghế lead; owner-chọn-hạng-hai ≠ outage (0 caveat/0 revert-nghĩa-vụ), outage đóng → hỏi anh ĐÚNG 1 dòng · (4) 4 ghi-chú trung-thực a-d giữ nguyên nấc (owner-gated + kỷ-luật, KHÔNG code-enforced). K.C 3 GAP-guard + định-nghĩa 2 engine GIỮ từ H19 | **pain:** "quyết-theo-từng-tác-vụ dễ quên hạ-tầng" (kế thừa H19) + cách-làm bay hơi trong prompt → spec-file kết tinh git-tracked (sự-cố thật hub) + flip-chain dán nhãn outage khi thật ra owner-choice · **volume:** mọi lượt engine-đắt × 12 vai × 2 lệnh + BƯỚC 0.6 mỗi phiên + worker-pipeline theo spec · **quality:** audit-trail spec qua git + owner-gated chống auto-elevate + reviewer-Fable dogfood run-1 bắt 5 Major thật (M1 worker-đổi-fact · M2 boundary-gap → VALID_ROLES 12) | `RC-pqhuy1987-03-07-2026-17-46-35` (partial — floor-point 1/2 + marker-toggle; K.C + 2-engine GIỮ) | 🔖 **Active-High** (anh-confirm S110 via AskUserQuestion "Stamp mark MỚI thay mark cũ" · P4 report-before-stamp: `/check-email`→invest-Fable→spec→WF `wf_0c3b307f-a64`→reviewer-Fable PASS_WITH_FIXES→fix→present→confirm→stamp) | -| `RC-pqhuy1987-12-07-2026-11-43-45` | `engine PHẦN N` + `.claude/hooks/wal-flush.ps1` + `.claude/settings.json hooks` + `session-start BƯỚC 0.7` / `session-end §5.0+§6.4` + `commands/pause·tiep` + `workflows/README FLIP-policy` (≙ AI_INFRA H-22 CANONICAL §I4 + §H1) | **H-22 WAL session-continuity.** **Sàn:** (1) sổ `.claude/WAL.md` ≤40 dòng ghi-đè-không-append (chain-bằng-chứng + next + verify-trước-next, ground-truth thắng, cấm secret; detector C5 bắt >40) · (2) hai tầng ghi: lead single-writer nội-dung ⟂ Stop-hook `wal-flush.ps1` persist-only (per-path+CAND+exit-0; ĐƯỢC add+commit 3-path `wal:` / KHÔNG content·push·block·path-ngoài) · (3) MỘT đường recovery `/tiep` (+`/pause` chốt dừng; CẤM transcript; wf: = relaunch-cắt-gọt + pack-re-derive; resume-run-id = same-session-only) · (4) delta mở/đóng: BƯỚC 0.7 WAL-check (ngoại-lệ CHỜ duy-nhất) + §5.0 squash `wal:`-trailing chưa-push (KHÔNG rewrite đã-push) + §6.4 reset cuối · (5) run ≥3-task HOẶC >5' = BẮT BUỘC RUN-TRACE per-agent-file + taskList-snapshot + dòng `wf:` 5-trường. Commit `wal:` = ngoại-lệ DUY-NHẤT format `[CLAUDE]` (rules §5.2) | **pain:** phiên chết giữa mạch = mất trí-nhớ chưa-ghi + đốt-lại token (sự-cố thật SE: WF2 S101 MẤT theo CLI-restart phải re-run · diary transcript-lost ×2 S110 · W3 return-truncate NGAY run adopt này — per-agent-file cứu) · **volume:** MỌI phiên (BƯỚC 0.7 + §5.0/§6.4) × mọi workflow ≥3-task × 3-path memory/run trên đĩa · **quality:** hook-FIRE VERIFIED-RUNTIME ×2 (`12071c5`/`67be443` — reviewer refute 3-hướng forensics NTFS×git đều GÃY) + fault-inject 2-ca PASS + persist deterministic thay kỷ-luật-nhớ-tay (vá đúng root-cause sổ-tay-chết); ENV-DEPENDENT hot-reload khai đúng nấc, STAGED-until-verified giữ làm nguyên-tắc hook tương-lai | null (additive) | 🔖 **Active-High** (anh-confirm S111 via AskUserQuestion "Stamp Active-High" · P4 report-before-stamp: `/check-email`→invest-Fable READY_WITH_NUANCES 14N→spec lead-3-chỉnh→WF `wf_5ba3daf6-fe0` 3-Opus RUN-TRACE→reviewer-Fable PASS_WITH_FIXES 0C·1M·7m→fix 8/8→present→confirm→stamp; D10 paths-ignore anh-directed cùng lượt) | +| `RC-pqhuy1987-12-07-2026-11-43-45` | `engine PHẦN N` + `.claude/hooks/wal-flush.ps1` + `.claude/settings.json hooks` + `session-start BƯỚC 0.7` / `session-end §5.0+§6.4` + `commands/pause·tiep` + `workflows/README FLIP-policy` (≙ AI_INFRA H-22 CANONICAL §I4 + §H1) | **H-22 WAL session-continuity.** **Sàn:** (1) sổ `.claude/WAL.md` ≤40 dòng ghi-đè-không-append (chain-bằng-chứng + next + verify-trước-next, ground-truth thắng, cấm secret; detector C5 bắt >40) · (2) hai tầng ghi: lead single-writer nội-dung ⟂ Stop-hook `wal-flush.ps1` persist-only (per-path+CAND+exit-0; ĐƯỢC add+commit **4-path** `wal:` [🧊 *stamp S111 ghi 3-path; nới +`.claude/sessions/` @S146 — floor N.2 + Sàn-3 ⑤ cập-nhật CÙNG lần*] / KHÔNG content·push·block·path-ngoài) · (3) MỘT đường recovery `/tiep` (+`/pause` chốt dừng; CẤM transcript; wf: = relaunch-cắt-gọt + pack-re-derive; resume-run-id = same-session-only) · (4) delta mở/đóng: BƯỚC 0.7 WAL-check (ngoại-lệ CHỜ duy-nhất) + §5.0 squash `wal:`-trailing chưa-push (KHÔNG rewrite đã-push) + §6.4 reset cuối · (5) run ≥3-task HOẶC >5' = BẮT BUỘC RUN-TRACE per-agent-file + taskList-snapshot + dòng `wf:` 5-trường. Commit `wal:` = ngoại-lệ DUY-NHẤT format `[CLAUDE]` (rules §5.2) | **pain:** phiên chết giữa mạch = mất trí-nhớ chưa-ghi + đốt-lại token (sự-cố thật SE: WF2 S101 MẤT theo CLI-restart phải re-run · diary transcript-lost ×2 S110 · W3 return-truncate NGAY run adopt này — per-agent-file cứu) · **volume:** MỌI phiên (BƯỚC 0.7 + §5.0/§6.4) × mọi workflow ≥3-task × **4-path** memory/run/sessions trên đĩa · **quality:** hook-FIRE VERIFIED-RUNTIME ×2 (`12071c5`/`67be443` — reviewer refute 3-hướng forensics NTFS×git đều GÃY) + fault-inject 2-ca PASS + persist deterministic thay kỷ-luật-nhớ-tay (vá đúng root-cause sổ-tay-chết); ENV-DEPENDENT hot-reload khai đúng nấc, STAGED-until-verified giữ làm nguyên-tắc hook tương-lai | null (additive) | 🔖 **Active-High** (anh-confirm S111 via AskUserQuestion "Stamp Active-High" · P4 report-before-stamp: `/check-email`→invest-Fable READY_WITH_NUANCES 14N→spec lead-3-chỉnh→WF `wf_5ba3daf6-fe0` 3-Opus RUN-TRACE→reviewer-Fable PASS_WITH_FIXES 0C·1M·7m→fix 8/8→present→confirm→stamp; D10 paths-ignore anh-directed cùng lượt) | | `RC-pqhuy1987-15-07-2026-15-32-20` | `.claude/commands/tiep.md §0` + `session-start §0.6b/§0.7` + `session-end §5.0/§5.2/§L.b(f)` + `.claude/workflows/README.md:19-20` + `hmw.js` Sàn-1 (≙ AI_INFRA **H-22 wal-defect-fix** + **EOL/CRLF notice**) | **Sàn-3 canonical + TRI-ACCEPT orphan + push-guard-1-LƯỢT.** **Sàn:** (1) Sàn-3 = **định-nghĩa DUY-NHẤT** @`tiep.md §0`, `session-start §0.7` **chỉ TRỎ** (B1) — 🔴 *"sổ trống ⇒ sạch"* = **BUG**, 4 tín-hiệu bậc-MẠNH dựng từ thứ hook **KHÔNG chạm tới** · (2) **orphan = TRI-ACCEPT** (dạng-1 phẳng · dạng-2 C8 `harvest/` · dạng-3 `## synthesis` trong `run.md`), 🔴 **NHẬN ≠ CHO PHÉP** — run **MỚI BẮT BUỘC dạng-1** (khuôn C8: tha di-sản, cấm viết mới kiểu cũ); **dạng-4 = kẽ CÒN LẠI, khai thẳng chưa xử** · (3) `§5.2` **squash→count→push CHỈ 1 LƯỢT** (cấm turn-boundary chen giữa), đếm **TRAILING** trong `origin/main..HEAD`, **CẤM exit-code** (`grep -c` 0→exit 1), **CẤM đếm toàn-lịch-sử** (=57 ⇒ chặn vĩnh-viễn); `n>0` sau 1 re-squash ⇒ **STOP báo owner, CẤM lặp** · (4) `wal:` kẹp dưới commit-thường = **noise CHẤP-NHẬN** (đổi lấy không-rewrite-lịch-sử-đã-đẩy) · (5) EOL-check = **INFORM, `exit 0` always, CẤM chặn push** (W0.6 đã BÁC CRLF-fatal) | **pain:** ① *"orphan"* đo **TÊN FILE** không đo **NỘI DUNG** ⇒ **8 dương-giả / 25 run = 32%**, folder **ghi-chép-đầy-đủ-nhất** (cicd PASS + bundle-hash + smoke 200 + *"PIPELINE COMPLETE"*) **vẫn** bị xếp orphan — sự-cố THẬT, 0/7 là việc mất · ② push-guard **tự-deadlock**: hook fire mọi turn-boundary ⇒ tách squash = tự sinh lại thứ vừa dọn ⇒ **cổng tự xoá chính nó** · ③ *"sổ trống ⇒ sạch"* = **bug lead MẮC THẬT** (`tiep.md:15` + `session-start.md:51` cũ) | **volume:** **MỌI phiên** (`§0.7` + `§5.0/§5.2`) × **mọi workflow ≥3-task** × **25 run-folder** × toàn roster | **quality:** **4 bộ fault-inject CÓ RĂNG** — Sàn-1 **2 chiều** (thiếu cờ→THROW 14ms agent=0 · dưới ngưỡng→IM) · Sàn-3 **9/9** (2 ca anti-Goodhart: 0-byte→FLAG · "synthesis" giữa-câu-văn→FLAG) · push-guard **10/10 cây git THẬT** (ca(2) `base+wal+[CLAUDE]`→K=0→**push được, KHÔNG deadlock**) · wal-recovery **4/4 ca 30 assert** + counterfactual tái-hiện deadlock · **2 bẫy TÁI-HIỆN ĐƯỢC** (`grep -c` exit-1 · đếm-tổng chặn-push) · **push THẬT ×2** (`4727d16..c39ba9d`, `c39ba9d..6dcd457`, K=0, `wal:`/20 **11→7 không tăng**) | null (additive) | 🔖 **Active-High** (anh-confirm **S122** via AskUserQuestion *"tách 2 mark"* · **P4 report-before-stamp**: 3 tiêu-chí khách-quan present → anh chọn tách vì **2 trục có NẤC BẰNG-CHỨNG KHÁC NHAU**, gộp = làm-phẳng mức-độ-chắc) | | `RC-pqhuy1987-15-07-2026-15-32-23` | `.claude/agents/lead-{view,omission}-auditor.md` + `hmw.js` VALID_ROLES + `memory-budget.json` (`h24_cadence`/`lead_self_audit`) + `.claude/governance/.session-counter.json` + `session-start §2.1.8` + `session-end §L.b(j)` + `docs/STATUS.md` (≙ AI_INFRA **H-24 lead-self-audit + H17 cadence**) | **H24 roster→14 + cadence + enum-ĐÓNG + counter + RE-STAMP.** **Sàn:** (1) **2 vai monitor MỚI** soi chính LEAD — `lead-view-auditor` (cái CÓ-nhưng-LỆCH) · `lead-omission-auditor` (cái BỊ THIẾU); **trục RIÊNG, CẤM gộp** H1 tooling-freshness / H2 harvest-integrity · (2) class-flag ∈ **enum ĐÓNG** `lead_self_audit.flag_classes` — vai **KHÔNG tự chế class**; không phân-loại được ⇒ báo **verbatim + escalate anh** · (3) nhịp ĐỌC từ `h24_cadence`, **CẤM hardcode** ở doc dẫn-xuất (detector **fail-loud** nếu key thiếu — **KHÔNG** giả-định default) · (4) counter **content-addressed neo HEAD-sha**, **CẤM blind-increment** (hook auto-commit mọi turn-boundary ⇒ `++` mù = nhịp vô-nghĩa); counter **LÙI** ⇒ **báo anh, CẤM silent-reset** · (5) 🔴 **roster đổi = 2 BỀ-MẶT ĐỘC-LẬP** (`agents/*.md`→registry ⟂ `VALID_ROLES`→`agentType`); vai MỚI cần **RESTART + spawn-probe THẬT** — `ls`+grep = **CẦN, KHÔNG ĐỦ** · (6) **nghi-thức RE-STAMP carry mỗi phiên** (không re-stamp ⇒ streak≡1 ⇒ **0 fire vĩnh-viễn**) · (7) số roster/nhịp = **canonical-only** (`docs/STATUS.md`), doc dẫn-xuất **CẤM chép số** | **pain:** ① lead **ĐO tốt nhưng ĐẾM-VỀ-MÌNH thì sai** — wave này lead sai **6 lần**, 4 lần đúng trục đó (SHA bịa ghi TRƯỚC commit = **tái phạm bài-học 1 ngày trước**; "8 hit" thật 14; "tái-hiện chính xác dự-báo" trong khi đo **sai hướng**) · ② `gap-workstate-drop` bị bản-spec-trung-gian **BỎ** để làm tròn enum về 10 rồi tuyên *"khớp 5+5"* — mất đúng class bắt ca THẬT của SE (S118: 7-spawn → **0 run-folder**), enum ĐÓNG ⇒ mất vĩnh-viễn · ③ carry-age **vacuous CẤU-TRÚC**: 45 segment nhưng `carry-lines=1` ⇒ **0 fire** | **volume:** mọi phiên (counter-tick §2.1.8 + §L.b(j)) × toàn roster × mọi carry trong HANDOFF | **quality:** **spawn-probe 14/14 RUNTIME** (0 error 0 garble; 2 vai mới lean nhất 26K < cap 60K) · **positive-control W4 khép, số cộng KHỚP** (5 FLAG→0, TOTAL **50→45** tụt đúng 5, **0 flag mới**, đo bằng `comm`) · **TOTAL 50 khớp CHÍNH XÁC dự-báo W2** · acceptance `ls=14` **BỊ BÁC vì sai số-học** (glob bắt `README.md` ⇒ ép xoá README = catastrophic-Goodhart) → đổi sang bất-biến-trên-roster **14/14/14** · counter seed **UNTICKED trung-thực** | null (additive) | 🔖 **Active-High** (anh-confirm **S122** cùng lượt · **P4 report-before-stamp**) · 🔴 **CAVEAT BINDING — nấc bằng-chứng THẤP HƠN mark `…15-32-20`:** **2 vai CHƯA CHẠY lần nào** (spawn-probe chứng **spawn được**, KHÔNG chứng **soi được**) · **counter=0 CHƯA tick** · **nhịp 6/15/3 = điểm khởi-đầu owner cố-ý chọn, KHÔNG phải "đã chứng-minh hiệu-quả"** (hub: n=1 = mocc-0; **chỉnh lại sau chu-kỳ-2**) · probe phủ **Agent-tool registry** THÔI, đường `hmw.js→agentType` **CHƯA phủ** ⇒ **mark này = LỆNH về CÁCH LÀM, chưa phải bằng-chứng về HIỆU-QUẢ** | diff --git a/.claude/hooks/wal-flush.ps1 b/.claude/hooks/wal-flush.ps1 index f2e1c1d..f5ad460 100644 --- a/.claude/hooks/wal-flush.ps1 +++ b/.claude/hooks/wal-flush.ps1 @@ -10,7 +10,11 @@ try { # (anh ky S119 fix#8b = TRONG KHUNG, khong can adap-request). # !! Dat SAU Set-Location: dat truoc thi Test-Path soi nham CWD (hook chay tu thu-muc bat-ky). if ((Test-Path ".git/rebase-merge") -or (Test-Path ".git/rebase-apply")) { exit 0 } - $paths = @(".claude/WAL.md", ".claude/agent-memory/", ".claude/workflows/runs/") + $paths = @(".claude/WAL.md", ".claude/agent-memory/", ".claude/workflows/runs/", ".claude/sessions/") + # 4 path (S146): +.claude/sessions/ = thu-muc phien-LOGIC (session-model, hub-form session-). + # Floor canonical = engine PHAN N (N.2) - B1 con-tro, KHONG dien-giai lai luat o day. + # !! GIU $paths O DUNG DONG 13: nhieu doc trich-dan "wal-flush.ps1:13" (tiep.md :23, spec, memory). + # Chen dong TREN day = lao-hoa het cac trich-dan do (class acceptance-literal-tu-lao-hoa S121). $cand = @() foreach ($p in $paths) { git add -- $p 2>$null diff --git a/.claude/sessions/session-1/pause-S146-20260722T2328.md b/.claude/sessions/session-1/pause-S146-20260722T2328.md new file mode 100644 index 0000000..87cd6da --- /dev/null +++ b/.claude/sessions/session-1/pause-S146-20260722T2328.md @@ -0,0 +1,62 @@ +# pause-block — S146 @ 2026-07-22T2328 (cửa-sổ vật-lý #1 của phiên-LOGIC L1) + +> Lane **CỘNG-DỒN** (`pause.md §2.6`). CẤM ghi đè / sửa khối cũ. Mỗi `/pause` = một file mới. +> 🥇 **Đây là khối context-block THẬT ĐẦU TIÊN của SE** — cơ-chế vừa wire @S146, dùng ngay trong chính phiên wire nó. + +`N-cap-ngoai-session-start: 1 (ly-do: phiên này vào bằng /tiep nối S145, CHƯA từng chạy /session-start ⇒ không có nào đang mở. Đĩa 0 folder ⇒ max=0 ⇒ N=1. Khai theo đúng luật pause.md §2.6 vừa land.)` +🔸 *Lưu-ý ID-space: git history có `session-1/probe.md` (vật thử live-verify hook, đã `git rm` @S146). Đĩa lúc cấp số = RỖNG nên N=1 hợp-lệ; probe không còn chiếm chỗ. Reviewer F4 đã cảnh-báo đúng lớp rủi-ro này.* + +--- + +## (1) QUYẾT-ĐỊNH Đà CHỐT trong cửa này + +**A. Owner chốt 3 câu session-model** (`"1 và 2 → giống hub. 3 → auto."`): +1. **Ai tạo `session-/`** = **scaffold IDEMPOTENT** theo hub floor. 🔴 Gỡ mâu-thuẫn thật bằng cách **tách 2 khái-niệm bị gộp**: **cấp SỐ** = độc-quyền `/session-start` ⟂ **tạo THƯ-MỤC** = ai gặp trước thì tạo, cấm đè. Hub chỉ ràng vế thứ hai. +2. **`closed.md`** (= `_end` chốt-kết hub) = **WIRE** → `session-end §6.3-bis`: FROZEN · 4 trường · idempotent NO-OP nếu đã có · **NO-OP im-lặng nếu 0 thư-mục** (cấm tạo-rồi-đóng = sổ rỗng giả). Khoá nốt vòng ORPHAN-L. +3. **V2 = "auto"** → gỡ **cổng NGƯỜI** (consent) ở `session-end §L.b(j)(ii)` + `(vi)` + `session-start §2.1.8(e)`; **GIỮ cổng NHỊP** `h24_cadence 6/15/3`. + 🔴 **Ranh đã khai vào doc để owner sửa bằng 1 chữ:** *"auto" = bỏ HỎI, KHÔNG phải bỏ ĐẾM* ⇒ **chưa** phải bookend-hub (hub gỡ hẳn counter). Muốn đúng bookend-hub = quyết-định KHÁC, **chưa chốt**. + +**B. `session_ctx_kb = 64` — owner lật từ "để trống" sang TƯỜNG-MINH.** Kèm `_owner_set` + **GIỮ nguyên caveat ghost-wire** (đo lại: 0 script đọc khoá; hit duy-nhất trong `scripts/` là comment). Có số ≠ có hành-vi. + +**C. Kỷ-luật "đổi quyết-định ⇒ quét MỌI surface khẳng-định cái cũ"** — áp 2 lần trong cửa này: +- `session_ctx_kb`: lật 3 surface đang ghi *"CỐ Ý ĐỂ TRỐNG"* (`draft:69` · `session-start:101` · `nhip-no-probe.ps1:42` pure-ASCII). +- H24 auto: gỡ 2 **con-trỏ chết** viện *"trio consent **cùng khuôn** sleep-check **+ H24**"* — H24 đổi thì câu đó thành SAI. **sleep + trio VẪN consent**; 3 cổng nay **không còn cùng khuôn**, cấm suy một ra ba. + +**D. Phép quét cardinality "3 path" — chốt nấc = LƯỚI SOÁT CHO NGƯỜI, KHÔNG phải zero-gate.** +Sửa **4 lần trong cùng phiên**: v1 quá rộng (nuốt câu đúng) → v2 quá hẹp (**lọt 4 ca thật**, reviewer F2 bắt) → v3 rộng lại (kéo về 3 miền khác) → v4 chốt. +Kiến-trúc cuối: **loại theo ĐƯỜNG-DẪN** (lịch-sử ⟂ live) + **khớp RỘNG** + **allowlist CÓ TÊN kèm lý-do** + **`use ⟂ mention` bằng 🧊**. +🔴 Lý-do không cơ-khí-hoá được: tiêu-chí là **NGỮ-NGHĨA** ("đang nói về path-list của hook"), mà "3 path" sống hợp-lệ ở ≥3 miền khác (IIS · RAG `corpus_paths` · chuỗi `v1.3 path-b`). Cùng khuôn `/tiep §0` đã dùng cho **dạng-4**. + +--- + +## (2) DELTA CÒN SỐNG (mang sang cửa sau) + +**🔴 Việc dở lớn nhất: `/session-end` mới chạy tới BƯỚC 0.** Sentinel `closing: S146` **ĐANG TREO trong WAL** — CÓ CHỦ-ĐÍCH, đúng ca Sàn-2 sinh ra để bắt. Phase 1→6 **chưa chạy**: flush · §L.b(a)-(k) · §L.c completeness-gate · STATUS/HANDOFF · verify · report · squash→push · `closed.md` · reset WAL. +🔸 *Ca này trùng đúng dogfood hub từng kể: "owner chủ-động tạm-dừng NGAY GIỮA nghi-thức đóng phiên để thử" — cửa sau nối lại đúng chỗ đứt rồi chạy nốt phần đóng.* + +**🆕 GAP hub-floor mới lộ — CHƯA CHỐT, cần owner quyết:** +Lead trước đó trả lời owner *"không có `/snapshot` — bẫy tên gọi"* ⇒ **SAI, đã đính-chính**. Manifest `101e69d6` §1 liệt **3 lệnh**, lệnh thứ-3 = **"chụp-nhanh không-dừng"** (chốt giữa mạch, không bookend, không stop). Lead kết-luận từ đĩa SE mà **không mở manifest**. +| Floor hub | SE @S146 | +|---|---| +| `_snapshot-k` + lệnh chụp-nhanh không-dừng | ❌ **thiếu hẳn** | +| `_context` = **stock** (map nén) + flow | ⚠️ chỉ có **flow**; thiếu stock + nén-thành-con-trỏ | +| `/pause` tự chạy 1 chụp-nhanh + NÉN context rồi mới dừng | ❌ chưa | +| `/tiep` đọc **snapshot mới nhất** + phòng **cửa-sổ-sập** | ❌ chưa (chỉ đọc `pause-*`) | +| **Meld-forward khi squash** | ❓ **CHƯA ĐO** (`reset --soft` giữ ở INDEX ⇒ *về lý* không mất, chưa có phép đo riêng cho `.claude/sessions/`) | + +**Nghi-vấn còn treo:** V2 mới là "auto-khi-tới-nhịp", **chưa** bookend-hub thật. Trong 5 vòng, đo được: **V1 + V3 = 2 đầu thật** · V2 = cadence · V4 = on-signal · V5 = liên-tục. ⇒ **chưa vòng nào đủ 5/5 bookend**. + +**Reviewer F4 (chưa xử):** commit `da7ee8a` (chưa push) đụng `.claude/sessions/` ⇒ tín-hiệu **⑤ SẼ KÊU** ở `/tiep` kế. **Đúng thiết-kế, không phải bug** — và nay có context-block THẬT trong đó nên ⑤ kêu là **chính xác**. Tự tắt sau khi push. + +--- + +## (3) CON-TRỎ + +- **Run-folder:** `.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/` + - spec + ADDENDUM: `spec-apply-hub-s145-v2.md` (§[4] = bảng C2b-EXT + lịch-sử 4 lần sửa phép quét + citation-trap) + - worker: `sub-implement-{A-c7,CE-sessionmodel,D-5vong}.md` + - reviewer: `sub-reviewer-precommit-s146.md` (**F1/F2 MAJOR đã vá · F3 HELD · F4 ghi nhận**) +- **Retro-harvest S144:** `runs/2026-07-22-S144-trio-first-run/trio-synthesis.md` · `runs/2026-07-22-S144-adap-dot-11/adap-synthesis.md` +- **Commit mốc:** `da7ee8a` = live-verify hook 4-path PASS (nuốt `sessions/session-1/probe.md`) +- **Counter:** `.claude/governance/.session-counter.json` → counter **20**, `last_ticked_session S146` (tick @cửa `/tiep`; `/pause` bước 3.5 = **NO-OP đúng OR-guard**) +- **Điểm nối:** `docs/governance/session-model-se-draft.md` §4-bis = bảng 3 owner-decision + bảng gap hub-floor diff --git a/.claude/sessions/session-1/resume-S146-20260722T2334.md b/.claude/sessions/session-1/resume-S146-20260722T2334.md new file mode 100644 index 0000000..e4a076c --- /dev/null +++ b/.claude/sessions/session-1/resume-S146-20260722T2334.md @@ -0,0 +1,32 @@ +# resume-block — S146 @ 2026-07-22T2334 (nối cửa-sổ #1 → #2 của phiên-LOGIC L1) + +> Biên-nhận `/tiep §2.6`. **Đối-ứng cân-sổ** cho `pause-S146-20260722T2328.md` ⇒ ORPHAN-L ⑤ hết kêu. +> 🥇 Khối `resume-*` **THẬT ĐẦU TIÊN** của SE — cặp `pause ↔ tiep` nay tự đóng vòng, không còn là cơ-chế treo. + +## Nối từ đâu +`pause-S146-20260722T2328.md` (khối pause duy-nhất trong `session-1/`). Đọc TOÀN BỘ theo thứ-tự thời-gian = bối-cảnh cộng-dồn. + +## Sàn-3 §0 — 4/5 tín-hiệu MẠNH KÊU, **đều đã lường trước**, KHÔNG cái nào bất-ngờ +| # | kết | đọc đúng là gì | +|---|---|---| +| ① | `ORPHAN: runs/2026-07-22-S145-apply-hub-answers/` | **THẬT, còn nợ** — chưa ghi `*-synthesis.md` phẳng (định viết sau khi có verdict reviewer; verdict đã có, việc chưa làm) ⇒ để Phase 1.5 §L.b(f) xử | +| ② | 0 | đúng — mọi commit chưa đẩy đều là `wal:` | +| ③ | 1 (`closing: S146`) | **CÓ CHỦ-ĐÍCH** — `/session-end` dừng ở BƯỚC 0; sentinel đang làm đúng việc của nó | +| ④ | 49 | wal-commit có đụng `runs/` — nhiễu kỳ-vọng | +| ⑤ | git=3 · **đĩa: `session-1/ (pause=1 resume=0 closed=0)`** | 🥇 **⑤ FIRE LẦN ĐẦU TRONG THỰC-TẾ, và fire ĐÚNG** — vừa wire @S146, không vacuous. Khối này chính là đối-ứng làm nó im lại. | + +🔴 **Sàn phán "HỎI LẠI ANH"** (≥1 MẠNH). Câu trả lời đến **từ chính anh**: lệnh `/tiep /session-end` = chỉ-thị chạy tiếp phần đóng còn dở. Không tự suy. + +## Lệch so `chain:` +**KHÔNG LỆCH.** `verify:` 4/4 khớp: `c2d1a05 wal: pause` · `session-1/pause-S146-*.md` tồn-tại · sentinel=1 · dòng-nợ `light 3/6 deep 3/15 ok`. + +## TICK +**NO-OP đúng OR-guard** — vẫn cùng conversation ⇒ cùng nhãn `S146` ⇒ `session == last_ticked_session`. counter giữ **20**. +🔸 Đây là lần **thứ hai liên-tiếp** guard chặn trong cùng phiên (lần 1 @`/pause`). Nếu thiếu session-clause thì cặp `pause`+`tiep` đã thành **+2** cho một phiên thật — đúng bẫy nó sinh ra để vá. + +## `next:` đang thực-thi +Chạy tiếp `/session-end` **từ Phase 1** — 🔴 **KHÔNG làm lại BƯỚC 0** (sentinel đã đặt @2325, không đặt chồng). +Thứ-tự: Phase 1 flush → 1.5 §L.b(a)-(k) + §L.c completeness-gate → 2 STATUS/HANDOFF → 3 verify → 4 report → **5 squash→push (HỎI ANH trước khi bấm)** → 6 eval + `closed.md` + reset WAL + xoá sentinel. + +## Nợ mang sang (chưa đổi so pause-block) +3 câu chờ anh: `/snapshot` · `_context` tầng STOCK+nén · bookend đủ 5/5. Chi-tiết ở `pause-S146-20260722T2328.md` mục (2). diff --git a/.claude/workflows/hmw.js b/.claude/workflows/hmw.js index 8db5b7c..d24a286 100644 --- a/.claude/workflows/hmw.js +++ b/.claude/workflows/hmw.js @@ -36,6 +36,8 @@ const VALID_ROLES = [ '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; // trục = CHÍNH HỆ MEMORY (độ-giữ·hành-động·đúng-spec) — KHÁC H1 tooling / H2 harvest / H24 lead / reviewer diff; // TUẦN TỰ eval→refine→audit (CẤM song song — audit đọc bản cũ = verdict vô-nghĩa), lead scribe return từng con vào run-folder. + 'tooling-harvest-audit', // +S145 C4/C4b (adap dot-11, owner-decision [2] TÁCH) — vai-KIỂM ĐỘC-LẬP vòng tooling/harvest: đọc OUTPUT H1(tooling-auditor)+H2(harvest-curator), no-self-exempt ≠ H1/H2. AUTO fire-after-measure @session-end §L.b(g-bis) (KHÁC trio/H24 consent-gated). Vai #1/3 round-KIỂM (h24-audit + sleep-audit land dần incremental). + 'h24-audit', 'sleep-audit', // +S145 C4/C4b vai #2/3 + #3/3 round-KIỂM (owner-decision [2] TÁCH mỗi-vòng-1-con). h24-audit = KIỂM vòng soi-lead (đọc OUTPUT lead-view+lead-omission, no-self-exempt ≠ chúng, KHÔNG soi lead trực-tiếp) · sleep-audit = KIỂM vòng nén-ngủ (đọc /sleep-recovery gist+Fidelity, tự đo byte). AUTO fire-after-measure, propose-only, NO-OP nếu vòng không đo. ] // ─── PA-2a — hằng-số kỳ-vọng model tier-2 (H23 model-at-spawn, owner-chốt O1 @S121 W2) ── @@ -111,9 +113,24 @@ if (!A || !Array.isArray(A.taskList) || A.taskList.length === 0) { if (A.checkpointApproved !== true) { throw new Error('hmw: checkpointApproved chưa set — em-main BÁO {số agent·vai·task} @inform rồi set args.checkpointApproved=true (guard = anti-accidental-fire).') } -// S4 — số task THOẢI MÁI: harness chạy theo slot, dư tự queue, KHÔNG cap cứng (soft notice only). -if (A.taskList.length > 16) { - log(`hmw: taskList=${A.taskList.length} (>16) → harness queue theo slot (thoải mái, không cap cứng).`) +// ─── C8b LOUD-skip trần WIDTH (S144, adap đợt-11 · owner chốt O-7 2026-07-22) ────────────── +// LINEAGE (giữ vết, KHÔNG xoá — khuôn `auto-toan-vong:35` "đảo có chủ đích, chủ-ký, ngày, lý do"): +// BẢN CŨ: `if (len > 16) log(...)` + comment "số task THOẢI MÁI … KHÔNG cap cứng (soft notice only)". +// VÌ SAO ĐẢO: broadcast `depth-axis:40` đòi "clamp trần cứng + assert tổng-lượt ≤ trần"; +// soft-notice = chạm trần vẫn chạy hết ⇒ không phải clamp. Owner chốt O-7 = **LOUD-skip**. +// VÌ SAO KHÔNG THROW: `depth-axis:43` nguyên văn "BỎ đào + báo RÕ (KHÔNG văng lỗi, không +// lặng-thầm bỏ)"; và :124-125 dưới đã tự khai throw per-lane có thể bị nuốt thành null = +// STOP-SILENT, tệ hơn. Reviewer R2 bắt bản spec v1 đòi THROW = tự mâu thuẫn → đã sửa. +// 🔸 Trần 16 = GIÁ TRỊ CŨ Đà CÓ, không phải số mới AI đặt. Đổi số = quyền owner (O-7). +const WIDTH_CAP = 16 +if (A.taskList.length > WIDTH_CAP) { + const dropped = A.taskList.slice(WIDTH_CAP) + const keptN = WIDTH_CAP + log(`hmw: 🔴 VƯỢT TRẦN WIDTH — taskList=${A.taskList.length} > trần=${WIDTH_CAP}.`) + log(`hmw: 🔴 CHẠY ${keptN} lane ĐẦU, BỎ ${dropped.length} lane CUỐI (LOUD-skip, KHÔNG throw — depth-axis:43).`) + log(`hmw: 🔴 LANE BỊ BỎ: ${dropped.map((t, k) => `[${WIDTH_CAP + k}]${(t && t.label) || (t && t.role) || '(no-label)'}`).join(' · ')}`) + log(`hmw: 🔴 Đây KHÔNG phải "đã chạy hết" — em-main PHẢI khai số bỏ trong report @P4.`) + A.taskList = A.taskList.slice(0, WIDTH_CAP) } // ─── STOP-HARD role-whitelist (DIRECTED 6c32df89 REC-3, 2026-07-13 · S115) ──── @@ -220,6 +237,25 @@ const results = await parallel(A.taskList.map((t, i) => () => { }) })) -// trả mảng kết quả (lọc null nếu agent lỗi/null — invalid-role đã STOP-HARD up-front; .filter(Boolean) chỉ lọc null-lane do agent lỗi runtime) -// về em main → P3 VERIFY + harvest + P4 checklist +// ─── C1 LANE-CHẾT-PHẢI-KÊU (S144, adap đợt-11 · repro NGAY trong run sinh ra nó) ─────────── +// LINEAGE (giữ vết): BẢN CŨ = `return results.filter(Boolean)` + comment "lọc null nếu agent +// lỗi/null … .filter(Boolean) chỉ lọc null-lane do agent lỗi runtime" — tức code TỰ KHAI nó +// nuốt lane chết, mà KHÔNG phát tín hiệu nào ra ngoài. +// VÌ SAO SỬA — bằng chứng ngôi-thứ-nhất `wf_491c05a8-6dc` (2026-07-22): 3/5 lane chết vì cháy +// maxTurns; em-main nhận mảng 2 phần tử KHÔNG tín hiệu "chết", chỉ biết nhờ khối của +// HARNESS chứ không nhờ file này. Đúng `depth-cost:53` "Thử-rồi-chết ≠ chạy-rồi-sạch … tầng +// tổng-hợp sẽ viết 'tầng-2 không thêm gì' = củng-cố verdict bằng một tầng-2 không tồn tại". +// Falsifier hub `depth-cost:59` hỏi "tầng chết thì tầng sau thấy 'chết' hay 'sạch'?" — trước +// bản vá này SE trả lời: thấy SẠCH. +// 🔴 CỐ Ý KHÔNG throw: :124-125 đã khai per-lane throw bị nuốt thành null = STOP-SILENT. +// Fix = THÊM TÍN HIỆU, KHÔNG đổi shape trả về (P3 downstream giữ nguyên hợp đồng). +const deadIdx = results.map((r, i) => (r ? -1 : i)).filter(i => i >= 0) +if (deadIdx.length > 0) { + const nameOf = i => (A.taskList[i] && (A.taskList[i].label || A.taskList[i].role)) || '(no-label)' + log(`hmw: 🔴 ${deadIdx.length}/${results.length} lane CHẾT (null) — KHÔNG phải "sạch".`) + log(`hmw: 🔴 LANE CHẾT: ${deadIdx.map(i => `[${i}]${nameOf(i)}`).join(' · ')}`) + log(`hmw: 🔴 Lane chết = 0 findings, KHÔNG phải "không tìm thấy gì". Em-main @P3 PHẢI khai số chết trong report, và CẤM đọc mảng ngắn thành "đã phủ đủ".`) + log(`hmw: 🔴 Recovery: đọc ĐĨA trước (runs//sub-*.md) — lane có thể đã ghi xong mà return hỏng.`) +} +// về em main → P3 VERIFY + harvest + P4 checklist (shape GIỮ NGUYÊN: chỉ lane sống) return results.filter(Boolean) diff --git a/.claude/workflows/runs/2026-07-22-S144-adap-dot-11/C14-disposition-per-khoan.md b/.claude/workflows/runs/2026-07-22-S144-adap-dot-11/C14-disposition-per-khoan.md new file mode 100644 index 0000000..ca0e5ed --- /dev/null +++ b/.claude/workflows/runs/2026-07-22-S144-adap-dot-11/C14-disposition-per-khoan.md @@ -0,0 +1,82 @@ +# C14 — Disposition TỪNG KHOẢN của 4 thư BINDING + +> Vá O-3 (R2): v1 tuyên *"BINDING-floor 4 khoản"* rồi triển khai 2, **im 2** — đúng bệnh `meta-count` mà chính v1 dặn tránh ở `:169`. +> 🔴 **Đính chính ngay tiêu đề C14 trong spec v2:** spec ghi *"4 thư × 4 khoản = **16 dòng**"*. Sai — `goi-chot` có **5** khoản ⇒ đúng là **17 dòng**. Ép cho tròn số là đúng thứ mục này sinh ra để chặn. + +**Trạng thái:** `ADOPT` (đã làm phiên này) · `ĐÃ-CÓ` (có sẵn + neo) · `BLOCKED` (chờ owner) · `DEFER` (có ngày/điều kiện) · `N-A` (+ lý do) + +--- + +## Thư 1 — `spawn-label` (4 khoản) + +| # | Khoản | Disposition | Neo / lý do | +|---|---|---|---| +| 1.1 | Đủ 4 thành-phần `{nhóm}{vai}{pha}{mã-phiên}` | **ADOPT** | Dogfood ngay phiên này: 3 lane review mang `Gate reviewer anchor s144` / `…scope…` / `…teeth…` | +| 1.2 | Vừa khung panel (~≤40 ký tự) | **ADOPT** | 3 label trên = 24–25 ký tự, 0 bị cắt | +| 1.3 | Một khuôn nhất quán toàn repo | **DEFER — có điều kiện** | Áp *"từ phiên kế"* (`:51`); spawn TRƯỚC lúc chốt giữ nguyên làm vết, **không sửa lùi** (khuôn hub `:43`). 5 lane invest + 3 probe phiên này mang label cũ = **cố ý giữ** | +| 1.4 | Phủ MỌI loại spawn | **DEFER — cùng điều kiện 1.3** | Phiên này mới phủ 1/4 loại (cổng review). Còn: nhịp 2-đầu-phiên · việc-thường · workflow-task | + +## Thư 2 — `harness-dong-du-vong` (4 khoản) + +| # | Khoản | Disposition | Neo / lý do | +|---|---|---|---| +| 2.1 | Mỗi vòng-ĐO có ≥1 vai-KIỂM độc lập + **thách-CLEAN** | **BLOCKED-by-O-3** | Hiện chỉ vòng-3 (trio) có con KIỂM. Vòng tooling/harvest · soi-lead · nén-ngủ = **0 con soi**. `:51` cho phép **1 con kiểm nhiều vòng** ⇒ không phải đẻ vai mới, nhưng gộp-hay-tách = quyền anh | +| 2.2 | Audit = **propose-only**, lead single-writer | **ĐÃ-CÓ** | `hmw.js:185` `writeGuard` + G-015 + luật single-writer B3. 🔸 Caveat thật: whitelist `tools:` **KHÔNG** chặn ghi ở runtime (đo S143, nhân-chứng `reviewer` đã Write thật) ⇒ backstop THẬT = git-diff commit-gate, không phải thiếu-tool | +| 2.3 | **Tuần-tự trong-vòng**, song-song giữa-vòng | **ADOPT (luật) + BLOCKED (thực thi)** | 🔴 v1 **bỏ sót hoàn toàn** (R2 O-1). Luật nay ghi ở spec v2 P1-6/C4b: audit vòng X ở **invocation hmw SAU** con-đo vòng X, vì `hmw.js:175` `parallel()` không tuần-tự-hoá trong 1 invocation. Thực thi chờ 2.1 | +| 2.4 | Eval 2 phía (presence + **use**), DORMANT≠MISS, negative-control | **DEFER — cần máy mới** | SE hiện chỉ đo presence (MFE). Phía *use* cần script cross-session evidence-based. Theo **chính khoản 4 `goi-chot:52`**: mục này viết dạng **DỰ-ĐỊNH**, CHƯA có máy | + +## Thư 3 — `depth-axis` (4 khoản F1–F4) + +| # | Khoản | Disposition | Neo / lý do | +|---|---|---|---| +| 3.1 | F1 owner-gated + posture + **clamp trần cứng** + assert tổng-lượt ≤ trần | **ADOPT phần WIDTH · BLOCKED phần SÂU** | Width: `hmw.js` C8b LOUD-skip + clamp thật, fault-inject 7/7. Trục SÂU (`assert tổng-lượt`) = **BLOCKED-by-O-2** (chưa có trục sâu để assert) | +| 3.2 | F2 đào điểm-nóng KHÔNG đào-tất; worker tầng-2 KHÔNG tổng-hợp | **N-A hiện tại** | SE **chưa có trục sâu** (grep `tầng-2\|deepen\|đào-vào-điểm` = 0 hit). Khoản này áp khi dựng trục sâu — BLOCKED-by-O-2 | +| 3.3 | F3 con **TƯƠI** + prompt-floor chống mỏ-neo | **N-A hiện tại + 🔴 NỢ Đà LỘ** | Cùng lý do 3.2. 🔴 Nhưng bệnh mỏ-neo **đã fire thật** ở trục khác: refute của SE do **em-main** làm (đã đọc tầng-1) ⇒ không phải con tươi. Xem O-4a §⓪ spec v2 | +| 3.4 | F4 **cận-ngân-sách LOUD** | **ADOPT** | C8b: LOUD-skip, **không throw** (`:43` *"không văng lỗi"*), nêu đích danh lane bị bỏ | + +## Thư 4 — `goi-chot-nam-khoan` (**5** khoản — không phải 4) + +| # | Khoản | Hạng | Disposition | Neo / lý do | +|---|---|---|---|---| +| 4.1 | Lead default Opus; Fable qua **2 cửa owner-chủ-động** | quyết-định nội-bộ hub + *floor chuyển được* | **ĐÃ-CÓ (thực-tế) · BLOCKED (nhãn)** | `~/.claude/settings.json:11` đã pin `claude-opus-4-8[1m]` từ 07-20 ⇒ SE **đã ở trạng thái này**. Nhưng ô canonical `STATUS §Sub-agents` còn ghi "Fable 5" ⇒ **BLOCKED-by-O-5** (nhãn = quyền anh) | +| 4.2 | RETIRE resume cho mục-đích **giữ-model/giữ-context** | *floor chuyển được* | **ADOPT có phạm vi + KHẢO SÁT xong** | Đọc đúng: retire **chỉ** cho mục-đích đó; path-2 cứu #53 (in-session) **KHÔNG** bị retire (`:37`). Nghĩa vụ kèm (`:38/:66/:73`) → **C15 đã khảo sát**: Agent-tool resume an toàn; **lane workflow có `tier:` override thì PHƠI NHIỄM, chưa đo** | +| 4.3 | Điểm-dừng phải **RẺ** (ràng-buộc thiết-kế CỨNG) | **BINDING** | **ADOPT (luật) · DEFER (đo)** | Luật vào spec v2 P1-5 + luật-chung #5. 🔴 Đã lộ 1 vi phạm tiềm tàng: `pause.md:44` gọi `powershell.exe nhip-no-probe.ps1` **trong đường dừng**. Ngưỡng "rẻ" = **owner-SỐ**, chưa đặt ⇒ chưa chấm được | +| 4.4 | **Cửa-duyệt lời-hứa-máy** (hub chấm *"áp cho MỌI dự-án"*) | **BINDING** | **ADOPT** | C6: cổng-người đã cài + acceptance mới (positive-control bắt buộc, use⟂mention, đo-gate-không-đo-quét). Phần **máy quét tự động** = **DỰ-ĐỊNH, CHƯA có** — khai đúng theo chính khoản này | +| 4.5 | available-in-pool ≠ mandate | *floor chuyển được* | **ĐÃ-CÓ** | Khớp sẵn worker-tier-pin S124 + mark Active-High `RC-…20-42-01` (engine-đắt owner-gated). *"Agent ghi-nhận và báo, không tự adopt"* = đúng luật SE đang chạy | + +--- + +## Tổng kết TỪNG DÒNG (17 khoản — **không** báo số tổng thay bảng) + +🔴 **BẢN ĐẦU CỦA MỤC NÀY SAI, GIỮ VẾT — lead tự bắt trong vòng 1 phút sau khi ghi.** +Bản đầu liệt: ADOPT 6 · ĐÃ-CÓ 3 · ADOPT-luật/DEFER 2 · BLOCKED 3 · N-A 2 · DEFER 3 = **cộng ra 19**, rồi viết ngay dưới *"**17/17** có dòng"*. +**Nguyên nhân:** `3.1` bị đếm 2 lần (width ADOPT + sâu BLOCKED), `4.1` bị đếm 2 lần (thực-tế ĐÃ-CÓ + nhãn BLOCKED). 17 khoản → 19 lượt đếm. +**Vì sao đáng giữ vết:** đây là **`meta-count` fire ngay bên trong artifact dựng ra để chặn `meta-count`** — ca thứ 3 cùng lớp trong một phiên. Xoá đi là mất chứng nhân. + +### Bảng đúng — đếm theo **KHOẢN**, khoản tách đôi ghi **trạng-thái kép** trên MỘT dòng + +| # | Khoản | Disposition | +|---|---|---| +| 1.1 | label 4 thành-phần | ADOPT | +| 1.2 | vừa khung panel | ADOPT | +| 1.3 | khuôn nhất quán | DEFER (từ phiên kế) | +| 1.4 | phủ mọi loại spawn | DEFER (từ phiên kế) | +| 2.1 | vai-KIỂM mỗi vòng | BLOCKED (O-3) | +| 2.2 | propose-only | ĐÃ-CÓ | +| 2.3 | tuần-tự trong-vòng | **KÉP**: ADOPT-luật + BLOCKED-thực-thi (chờ 2.1) | +| 2.4 | eval 2 phía | DEFER (chưa có máy — khai dạng dự-định) | +| 3.1 | clamp trần | **KÉP**: ADOPT-width + BLOCKED-sâu (O-2) | +| 3.2 | đào điểm-nóng | N-A (chưa có trục sâu) | +| 3.3 | con TƯƠI chống mỏ-neo | N-A + 🔴 nợ đã lộ (O-4a) | +| 3.4 | cận-ngân-sách LOUD | ADOPT | +| 4.1 | lead default Opus | **KÉP**: ĐÃ-CÓ-thực-tế + BLOCKED-nhãn (O-5) | +| 4.2 | retire resume có phạm vi | ADOPT + khảo sát C15 xong | +| 4.3 | điểm-dừng rẻ | **KÉP**: ADOPT-luật + DEFER-đo (thiếu ngưỡng owner) | +| 4.4 | cửa lời-hứa-máy | ADOPT (cổng-người) + máy = dự-định | +| 4.5 | pool ≠ mandate | ĐÃ-CÓ | + +**Đếm lại cho khớp:** 17 khoản = **4 KÉP** (2.3 · 3.1 · 4.1 · 4.3) + **13 đơn**. +Trong 13 đơn: ADOPT **4** (1.1 · 1.2 · 3.4 · 4.4) · ĐÃ-CÓ **2** (2.2 · 4.5) · ADOPT-có-khảo-sát **1** (4.2) · DEFER **3** (1.3 · 1.4 · 2.4) · BLOCKED **1** (2.1) · N-A **2** (3.2 · 3.3). +4 + 2 + 1 + 3 + 1 + 2 = **13** ✓ · 13 + 4 KÉP = **17** ✓ + +**17/17 có dòng, 0 khoản bị im.** Con số nay **reconcile được** — và bài học là: **khoản tách đôi thì đếm theo khoản, đừng đếm theo trạng-thái**, nếu không tổng luôn phồng đúng bằng số khoản bị tách. diff --git a/.claude/workflows/runs/2026-07-22-S144-adap-dot-11/C15-resume-model-override.md b/.claude/workflows/runs/2026-07-22-S144-adap-dot-11/C15-resume-model-override.md new file mode 100644 index 0000000..2864808 --- /dev/null +++ b/.claude/workflows/runs/2026-07-22-S144-adap-dot-11/C15-resume-model-override.md @@ -0,0 +1,48 @@ +# C15 — SE có dựa vào model-override sống qua resume không? + +> Nghĩa vụ `goi-chot:73` SELF-CHECK (khoản 2 **nửa sau**) — v1 bỏ sót, R2 bắt (O-2). +> Đo trên đĩa 2026-07-22 (S144). **Đây là KHẢO SÁT, chưa phải phép đo runtime.** + +## Hai đường model, khác nhau về mức phơi nhiễm + +| Đường | Model đến từ | Có override tại spawn? | Phơi nhiễm khi resume | +|---|---|---|---| +| **Agent-tool spawn** | `frontmatter` (17/17 vai pin `model: opus`) | **KHÔNG** | 🟢 **KHÔNG** — không có override nào để mất | +| **hmw lane spawn** | `hmw.js:234` `model: resolveModel(role, raw, t && t.tier, i)` | **CÓ** | 🔴 **CÓ** | + +## 🟢 Ca em dùng HÔM NAY = an toàn + +Path-2 `SendMessage-resume` em chạy 2 lần (H1 `tooling-auditor`, H2 `harvest-curator`) đều là **Agent-tool spawn**. Model của chúng đến từ frontmatter, **không có spawn-param override** ⇒ resume không thể làm rớt thứ vốn không tồn tại. **Không cần lo cho 2 ca này.** + +## 🔴 Ca THẬT SỰ phơi nhiễm — và nó nằm ngay trong runbook + +`docs/governance/fable-real-runbook.md:120` ghi resume là đường recovery cho **lane workflow**: + +> *"**Resume lane garble/truncate** | **SendMessage-resume in-session** | gửi lại agent đã spawn (KHÔNG re-spawn mới) | Lane trả wrong-slice (#53)"* + +Mà lane workflow **có** override tại spawn. Và chỗ duy nhất SE dùng override **KHÁC** frontmatter là `/fable-real` (`tier:'fable'` vs frontmatter `opus`). + +**Chuỗi hỏng giả định:** +1. `/fable-real ` phóng lane với `tier:'fable'` → H23 đo S126: spawn-param **THẮNG** frontmatter ⇒ lane chạy Fable ✓ +2. Lane garble (#53) → runbook bảo `SendMessage-resume` +3. **Nếu override không sống qua resume** → lane hồi sinh chạy **Opus** (frontmatter), không phải Fable +4. Nó vẫn trả verdict bình thường ⇒ **không ai biết** + +⇒ Anh gõ `/fable-real` để mua một lượt hạng-nhất, nhận về kết quả hạng-hai, **và không có tín hiệu nào**. + +## Nấc trung thực + +- **H23 @S126 đo spawn-param THẮNG frontmatter** — nhưng đo **tại lúc SPAWN**. Không ai đo **sau RESUME**. +- Hub tự khai `goi-chot:36` bằng chứng resume-rớt-override là **n=1, env-dependent**, từ MỘT sister ⇒ chưa chắc đúng ở env SE. +- ⇒ **Chưa kết luận SE có hỏng.** Kết luận đúng nấc: **SE có bề mặt phơi nhiễm, và chưa bao giờ đo.** + +## Đề xuất (owner-gated — em không tự chạy) + +`goi-chot:38` *"Muốn giữ resume → **tự verify trên env mình trước**"*. +Phép đo rẻ: phóng 1 lane `/fable-real` với `tier:'fable'` → ép garble hoặc chủ động resume → đọc model resolved bằng `scripts/spawn-model-audit.ps1` (PA-2b đã có sẵn, so resolved-vs-expected). + +**Trong lúc chưa đo** — 2 lựa chọn, cần anh chọn: +- **(a)** Runbook `:120` thêm cảnh báo: resume lane **có `tier:` override** thì phải re-check model sau resume, hoặc **re-spawn thay vì resume**. +- **(b)** Đo 1 lần rồi mới quyết. + +🔸 Ranh: khoản 2 gói-chốt **KHÔNG retire** path-2 cho ca in-session (`goi-chot:37` giữ *"hội-thoại tiếp-diễn trong cùng lượt làm việc"*) ⇒ lưới #53 **giữ nguyên**. Đây chỉ là nghĩa vụ kèm theo mà v1 làm rơi. diff --git a/.claude/workflows/runs/2026-07-22-S144-adap-dot-11/C4-design-3-vai-kiem.md b/.claude/workflows/runs/2026-07-22-S144-adap-dot-11/C4-design-3-vai-kiem.md new file mode 100644 index 0000000..d540d96 --- /dev/null +++ b/.claude/workflows/runs/2026-07-22-S144-adap-dot-11/C4-design-3-vai-kiem.md @@ -0,0 +1,65 @@ +# C4/C4b — Design-doc 3 vai-KIỂM (TÁCH · owner-decision [2] · chờ anh duyệt trước khi tạo file) + +> Trạng thái: **PROPOSAL** — chưa tạo file nào. Anh duyệt / sửa 3 mục "Open" cuối rồi mới implement. +> Phiên: S145 (/tiep resume S144). + +## 0. Neo (không chép — trỏ nguồn) + +- **Broadcast** `harness-dong-du-vong` khoản ① (`:51`): *mỗi vòng-ĐO có ≥1 vai-KIỂM độc-lập* — đọc OUTPUT con-đo (KHÔNG re-chạy đo), spot-check tay + chủ động falsify ≥2 claim; vòng báo CLEAN phải có phép **thách-CLEAN** (re-check 1 lens sạch). +- **§4** broadcast: *hình-thức (số vai/tên/gộp-tách) — mỗi dự-án tự quyết*. → **owner-decision [2] = TÁCH** (mỗi vòng 1 con riêng, KHÔNG gộp). +- **C4:** propose-only · **no-self-exempt** (cấm tự-kiểm vòng mình đo — m-3 S139) · re-check ≥1 số **CÓ-THỂ-SAI**. +- **C4b:** tuần-tự trong-vòng — audit vòng X ở invocation **SAU** con-đo vòng X (bằng-chứng: 2 run-id khác + mtime(audit) > mtime(đo)). + +## 1. Hiện trạng (C14:23) — chỉ vòng-3 (trio) có KIỂM + +| Vòng-ĐO | Con-ĐO đang có | Vai-KIỂM hiện tại | +|---|---|---| +| trio (memory-triad) | `harness-eval` + `harness-refine` | ✅ `harness-audit` | +| **tooling / harvest** | `tooling-auditor` (H1) + `harvest-curator` (H2) | ❌ 0 | +| **soi-lead (H24)** | `lead-view-auditor` + `lead-omission-auditor` | ❌ 0 | +| **nén-ngủ (sleep)** | skill `/sleep-recovery-memory-l2` | ❌ 0 | + +⇒ **3 vai-KIỂM mới** (TÁCH), roster **17 → 20**. (Chỉ đóng 3 vòng C14 nêu; KHÔNG tự suy "khung 5-vòng" đủ hay chưa — ngoài scope [2].) + +## 2. Thiết-kế 3 vai + +Mỗi con = **cặp mắt độc-lập** đọc OUTPUT con-đo, KHÔNG re-chạy đo. Mirror `harness-audit.md` (frontmatter `model: opus · effort: max · tools` read-only+rag · `memory: project · maxTurns ~18`). + +| # | Tên (đề-xuất) | Vòng | Đọc OUTPUT của | Số **CÓ-THỂ-SAI** tự re-check (≥1) | thách-CLEAN | no-self-exempt | +|---|---|---|---|---|---|---| +| A | `tooling-harvest-audit` | tooling/harvest | H1 (4-mặt freshness) + H2 (5-trục harvest) return/propose | tự đếm `.claude/agents/*.md` đối-chứng roster-count H1 báo · HOẶC "N run harvested / M sub spawned" tự đếm run-folder vs agent-memory | H1 PASS / H2 GATE-PASS-0 → mở 1 skill "fresh" xem thật fresh · 1 sub "harvested" xem có delta APPEND thật | ≠ H1, ≠ H2 | +| B | `h24-audit` | soi-lead (H24) | `lead-view-auditor` + `lead-omission-auditor` FLAG-list + class-assign | tự đếm flag-count · HOẶC mở 1 FLAG cụ-thể (vd `view-stale`) đối-chứng source · HOẶC 1 dòng `class_repeat` tally trong `.session-counter.json` | 2 vai báo ÍT/0 FLAG → tự soi 1 surface tìm FLAG bị sót (CLEAN nguy nhất = "lead ổn" khi không ổn) | ≠ lead-view, ≠ lead-omission | +| C | `sleep-audit` | nén-ngủ | output `/sleep-recovery-memory-l2` (gist mới + Fidelity-gate verdict) | tự đo byte trước/sau đối-chứng claim giảm-byte · HOẶC đếm gist-file sinh ra | Fidelity 5P/0F → mở 1 `.gist.md` đối-chứng archive gốc (gist trung-thực hay mất chi-tiết load-bearing) | độc-lập với ai chạy sleep | + +**Kỷ-luật chung mọi con:** +- **Propose-only** (trả TEXT, lead single-writer B3). 🔴 Backstop THẬT = **git-diff commit-gate**, KHÔNG phải thiếu-tool (`tools:` whitelist KHÔNG chặn write runtime — đo S143 `[carry:tools-whitelist-no-teeth]`). +- **PIN đích-danh** input (mirror harness-audit (i)): pin missing/rỗng ⇒ TỪ-CHỐI chấm, CẤM ĐẠT-ảo. +- Verdict per-claim ĐẠT/TRƯỢT + falsify-log HELD/BROKE + tự tái-dựng ≥1 số, KHÔNG tin lời-khai. + +## 3. Cadence + consent (KHÔNG thêm đồng-hồ mới) — ✅ OWNER-CHỐT S145 + +- **Fire-after-measure, coupled:** mỗi KIỂM fire ở invocation **SAU** con-đo vòng mình vừa chạy phiên này (thoả C4b). 🔴 **KHÔNG thêm cadence-key** vào `memory-budget.json` — giống trio §2.1.9(h) ("trộn 2 đồng-hồ = hỏng cả hai"). Trigger = "vòng X vừa đo xong phiên này", không phải counter riêng. +- **AUTO sau đo (owner-chốt S145 — KHÔNG consent-gate):** vòng X đo xong ⇒ KIỂM tự chạy ngay, KHÔNG in dòng đề-xuất, KHÔNG chờ gật. Khác trio/H24 (2 cái đó consent-gated). 🔴 **Fail-safe bắt buộc:** nếu con-đo KHÔNG chạy phiên này (vd `/tiep` skip session-start) ⇒ pin input missing ⇒ KIỂM **NO-OP im-lặng** (không có gì để chấm), CẤM ĐẠT-ảo. Auto ≠ chạy-mù: không có measure thì không có audit. + +## 4. Files khi implement (sau khi anh duyệt) + +- 🆕 `.claude/agents/tooling-harvest-audit.md` · `h24-audit.md` · `sleep-audit.md` (mirror `harness-audit.md`) +- ✏️ `.claude/agents/README.md` — roster matrix + audit-map (17→20) +- ✏️ `docs/STATUS.md §Sub-agents` — count canonical (KHÔNG chép số ra chỗ khác, B1) +- ✏️ `.claude/commands/session-start.md` + `session-end.md` — thêm proposal-line + consent + WAL skip-trace (mirror §2.1.9 trio) +- ✅ fault-inject 2-chiều (no-self-exempt guard FLAG khi pin trùng vòng mình · thách-CLEAN có răng) + reviewer-gate trước commit +- 🔸 governance-detectors: cân-nhắc 1 detector INFORM "vòng-ĐO nào chưa có KIỂM chạy phiên gần nhất" (optional, defer) + +## 5. ✅ OWNER-CHỐT S145 (3 quyết-định, AskUserQuestion) + +1. **Tên 3 vai** → GIỮ đề-xuất: `tooling-harvest-audit` · `h24-audit` · `sleep-audit`. +2. **Consent-model** → **AUTO sau đo** (KHÔNG consent-gate) — xem §3 (kèm fail-safe NO-OP khi thiếu measure). +3. **Nhịp adopt** → **INCREMENTAL từng vòng** (§6 broadcast) — làm 1 vai → chạy thử 1 phiên → báo nấc → vai kế. + +### Thứ-tự incremental (em chọn, anh veto được) +- **Vai #1 = `tooling-harvest-audit`** (làm TRƯỚC): vòng tooling/harvest chạy **mỗi phiên** (session-start + session-end) ⇒ auto-fire test được **nhanh nhất**. +- Vai #2 = `h24-audit` (vòng H24 chạy theo nhịp ~6 phiên) · Vai #3 = `sleep-audit` (sleep hiếm chạy). + +### Wiring vai #1 (auto) +- Fire tại **session-end** SAU khi H1 (tooling-auditor) + H2 (harvest-curator) chốt (đó là chỗ GATE thật: H2 5-trục + H1 freshness). Đọc output 2 con → verdict + tự tái-dựng ≥1 số + thách-CLEAN. (session-start report nhẹ hơn — cân-nhắc phủ sau, defer.) +- Fail-safe: H1/H2 không chạy phiên đó ⇒ NO-OP im-lặng. diff --git a/.claude/workflows/runs/2026-07-22-S144-adap-dot-11/C6-cua-loi-hua-may.md b/.claude/workflows/runs/2026-07-22-S144-adap-dot-11/C6-cua-loi-hua-may.md new file mode 100644 index 0000000..3b8d585 --- /dev/null +++ b/.claude/workflows/runs/2026-07-22-S144-adap-dot-11/C6-cua-loi-hua-may.md @@ -0,0 +1,63 @@ +# C6 — Cửa-duyệt lời-hứa-máy (`goi-chot:52`) + +> Vá theo R3 (v1 chấm **RỖNG HOÀN TOÀN**) + owner-decision "em solo". +> 🔴 **Đo lại độc lập, KHÔNG chép số reviewer** — và phép đo lại lật luôn con số reviewer đưa. + +## 1. Ba con số, và vì sao cả hai con đầu đều SAI + +| Phép đo | Kết quả | Verdict | +|---|---|---| +| **v1 (lead)** — literal `"máy sẽ"` trong `docs/governance/` | **0** | ❌ **Quá HẸP.** Tập-đo rỗng ⇒ acceptance đạt mà không cần sửa gì. R3 fault-inject: cắm câu-hứa-giả → **vẫn XANH**. | +| **R3 (reviewer)** — dòng chứa `(detector\|guard\|hook)` **và** `(chặn\|quét\|bắt\|đảm)` | **19** | ❌ **Quá LỎNG.** Lead tái lập được đúng 19, rồi soi ra **4/19 = 21% dương-giả substring**. | +| **Lead sau khi lọc** | **15 thô → phần lớn là ghi-chép lịch-sử** | ⚠️ Vẫn không phải mẫu-số dùng được | + +### 🔴 4 dương-giả: `bắt buộc` (mandatory) bị pattern `bắt` (catch) nuốt + +Ca điển hình `fable-real-runbook.md:440`: +> *"3 GAP-guard §K.C (**bắt buộc** CẢ 2 mode — pin để stamp CÓ NGHĨA)"* + +`bắt buộc` = *mandatory*, **không phải** *catch*. Regex không phân biệt được. + +🔴 **Đây là ca THỨ BA cùng lớp trong CÙNG một phiên:** +1. Lead: `grep -vE 'Designer|Snapshot'` nuốt migration `AddPeApprovedBudgetSnapshot` → đếm 66 thay vì 67 +2. Lead: `^\|[[:space:]]*[0-9]+` trượt row in-đậm `| **64** |` → đọc "row cuối = Mig 11" thay vì Mig 66 +3. **Reviewer**: `bắt` nuốt `bắt buộc` → mẫu-số phồng 21% + +⇒ **Bộ lọc chuỗi thất bại trong im lặng, và nó không chừa ai** — kể cả vai được giao đi soi người khác. + +### Vì sao 15 còn lại vẫn không dùng làm mẫu-số được + +Đọc từng dòng: phần lớn là **bản ghi lịch sử** (`error-ledger:117` prevention · `:144` recurrence), **honest-caveat** (`harness-11-engine:289` *"FP-guard … blind-spot có-chủ-đích"*), hoặc **câu đã CÓ sẵn existence-proof** (`:267` *"C1 spec-compliance checker deterministic LIVE: `scripts/memory-selfimprove-audit.ps1`"* — nêu đích danh script ⇒ đã đạt `goi-chot:52`). + +Số câu **thật sự vi phạm** (hứa năng lực mà không có máy) ⇒ **không xác định được bằng regex**, phải đọc bằng mắt. + +## 2. Kết luận thiết kế — bỏ đo-số, chuyển sang đo-CỔNG + +R3 nói đúng chỗ then chốt: `goi-chot:53` — *"cửa này chặn **từ lúc VIẾT**, không đợi tới lúc trả nợ"*. +⇒ Deliverable thật **KHÔNG PHẢI** một lần quét, mà là **một câu hỏi thường-trực ở cửa review**. + +**Cổng C6 (đây là thứ được cài):** + +> 🔴 **Trước khi bất kỳ doc governance nào được ghi/sửa:** mọi câu khẳng định năng-lực-máy (*"X chặn/quét/bắt/đảm-nhiệm Y"*) phải mang **existence-proof TẠI CHỖ**: +> `{đường-dẫn máy}` + `{lệnh chạy được}` + `{test hoặc positive-control}`. +> Thiếu bất kỳ mảnh nào ⇒ **BẮT BUỘC viết dạng dự-định** (*"sẽ build — CHƯA có máy"*). **CẤM viết dạng đang-có.** +> Reviewer hỏi đúng một câu: **"mã nào làm việc đó?"** + +**Ranh use ⟂ mention:** câu *định nghĩa* luật (như chính đoạn trên) hoặc *trích dẫn* anti-pattern **KHÔNG** tính vi phạm. Đây là cùng lớp `citation-trap` SE đã trả giá 3 đời/1 wave @S123 — discriminator là **enclosure**, không phải hình dạng. + +## 3. Acceptance MỚI (thay bản literal đã chết) + +| # | Tiêu chí | Cách chứng | +|---|---|---| +| a | **Positive-control BẮT BUỘC** | Cắm 1 câu-hứa-giả vào cây tạm → cổng **phải** nhặt ra. Không nhặt được = cổng mù, TRƯỢT | +| b | **Không dùng regex làm mẫu-số** | Đã chứng: literal → 0 (mù), loose-regex → 21% dương-giả. Mẫu-số = **danh sách liệt kê tường minh** | +| c | **use ⟂ mention tách bạch** | Câu định-nghĩa/trích-dẫn không tính vi phạm | +| d | **Đo GATE đã cài, không đo QUÉT xong** | `goi-chot:53` forward-looking | +| e | **Hồi-tố time-box** (P-2) | Floor `goi-chot:55` chỉ nói *"tài-liệu governance **mới**"*; hồi-tố toàn corpus vượt floor **và** đụng `goi-chot:44` (điểm-dừng phải rẻ) | + +## 4. Khai thật (residual) + +- **Cổng này là KỶ LUẬT NGƯỜI, không phải máy.** Hub tự khai cùng điều: `goi-chot:54` *"máy quét TỰ-ĐỘNG cho chính class lời-hứa-máy = **chưa có** (khai residual)"*. + ⇒ Theo đúng luật của chính khoản 4: **mục này viết dạng DỰ-ĐỊNH cho phần máy**, chỉ phần cổng-người là đang-có. +- **Chưa chạy sweep hồi-tố.** Lý do: floor chỉ đòi forward-looking; hồi-tố = P-2 time-box, chưa tới hạn. +- **Số câu vi phạm thật: CHƯA ĐẾM.** Không bịa một con số mà chính phép đo vừa chứng minh là không đáng tin. diff --git a/.claude/workflows/runs/2026-07-22-S144-adap-dot-11/adap-synthesis.md b/.claude/workflows/runs/2026-07-22-S144-adap-dot-11/adap-synthesis.md new file mode 100644 index 0000000..539f77d --- /dev/null +++ b/.claude/workflows/runs/2026-07-22-S144-adap-dot-11/adap-synthesis.md @@ -0,0 +1,35 @@ +# adap-đợt-11 — SYNTHESIS (🔴 RETRO-HARVEST @S146, không viết lúc chạy) + +> **Khai ngay đầu:** viết **hồi-tố @S146 2026-07-22** trong lượt `/tiep`, khi sàn-3 `/tiep §0` bắt folder này là **orphan** (có `run.md`, thiếu `*-synthesis.md` phẳng). +> Mọi dòng dưới **truy từ đĩa trong chính folder này + `.claude/agents/`**. Chỗ nào **suy ra** ghi rõ. **KHÔNG bịa.** + +## Kết luận 1 dòng +Đợt adap thứ 11 (**10 broadcast** hub, 07-18 → 07-21) đã chạy trọn: verify 2 tuyến → invest ensemble 5 lane → spec → review ensemble → spec-v2 → triển khai. **Sản-phẩm lớn nhất = 3 vai-KIỂM mới**, đưa roster **17 → 20**. + +## Bằng chứng trên đĩa (đo lại @S146) +| vật | trạng thái | +|---|---| +| `spec-adap-dot-11-22-07-2026.md` + `-v2.md` | cả 2 tồn tại ⇒ S3 + S5 đã xong | +| `sub-investigator-codebase-{0,3}.md` | tồn tại ⇒ S2 invest ensemble đã chạy (RUN-TRACE mode) | +| `sub-reviewer-{0,1,2}.md` | tồn tại ⇒ S4 review ensemble đã chạy | +| `C4-design-3-vai-kiem.md` · `C6-cửa-lời-hứa-máy.md` · `C14-disposition-per-khoản.md` · `C15-resume-model-override.md` | 4 design-doc theo khoản | +| `.claude/agents/{tooling-harvest-audit,h24-audit,sleep-audit}.md` | **cả 3 tồn tại** ⇒ S6 triển khai đã land | +| roster | **20** (`ls .claude/agents/*.md \| grep -v README \| wc -l`) | + +## Cổng vào đáng giữ (verify 2 tuyến, S0) +- 10 thư kéo từ **`outbox/all`**, verify **2 tuyến độc lập**: (a) whole-file hash **10/10 byte-identical** · (b) `stamp_verify.py` **10/10 exit 0** — 0 tamper. +- 🔴 **Kẽ đã bịt (giá trị thật của đợt này):** `/check-email` bước 2 chỉ đọc `outbox/se`, **không nhắc `outbox/all`** — mà `outbox/all` (90 file) chính là **nguồn thật của cả 10 thư**. Không bịt thì cả đợt này vô hình. +- Dương-giả đã loại đúng: 51 file cũ (06-02 → 07-15) = lớp *đã-adopt-chưa-copy-body* (process-gap S101/S119), **không phải thư mới**. + +## Kết quả cấu-trúc (owner-decision, đã land) +- **[2] TÁCH mỗi-vòng-1-con** (không gộp) ⇒ 3 vai-KIỂM độc lập: `tooling-harvest-audit` (vòng tooling/harvest) · `h24-audit` (vòng soi-lead) · `sleep-audit` (vòng nén-ngủ). +- Cả 3 mang cùng bất-biến: **no-self-exempt** (không tự kiểm vòng mình đo) · **propose-only, lead single-writer** · **fail-safe NO-OP khi pin missing** (cấm ĐẠT-ảo). +- **[1] `min_pending_shards` = 15** đã áp (toán-tử `-gt`). + +## Guard fire THẬT (đáng giữ) +Lượt phóng đầu `wf_977c2690-5ce` **THROW đúng guard** `checkpointApproved chưa set` — **0 agent, 0 token**. Lead @inform quy mô {5 agent · `investigator-codebase` · 10 broadcast / 5 lăng-kính} rồi mới set cờ, phóng lại `wf_491c05a8-6dc`. ⇒ anti-accidental-fire **có răng thật**, không phải chữ. + +## Residual thật (KHÔNG đóng) +- `## Stages` trong `run.md` còn `[!] S2 · [ ] S3..S6` — **stale**: S2–S6 đều đã xong (bằng chứng bảng trên). + 🔸 **Giữ nguyên, KHÔNG sửa ngược** — cùng lý do với `trio-first-run`: checkbox stale là **vết thật** của closeout bị cắt giữa chừng. Xoá vết = xoá đúng thứ retro-harvest sinh ra để ghi. +- Chỉ-thị anh lúc phóng — *"Nhớ chú ý đọc thật kỹ bọn mày rất hay sót"* — đã được thiết-kế đáp lại bằng **mỗi file ≥2 người đọc, lăng-kính KHÁC nhau**. Hiệu lực của phép đó **chưa có phép đo hậu-kiểm**; đừng đọc thành "đã chứng minh không sót". diff --git a/.claude/workflows/runs/2026-07-22-S144-adap-dot-11/run.md b/.claude/workflows/runs/2026-07-22-S144-adap-dot-11/run.md new file mode 100644 index 0000000..8d5862a --- /dev/null +++ b/.claude/workflows/runs/2026-07-22-S144-adap-dot-11/run.md @@ -0,0 +1,62 @@ +# run: 2026-07-22-S144-adap-dot-11 + +- **Phiên:** S144 (2026-07-22) · **HEAD lúc phóng:** `d5656ab` +- **Lệnh anh gõ:** `/fable-clone invest & review` → spec-cách-làm-chi-tiết-checklist → `hmw` Opus 4.8 MAX triển khai +- **Engine:** LỆNH-B ensemble tier-2 (H21 per-invocation) · vai lượt-1 = `investigator-codebase` · lane pin `tier:'opus'` +- **Lead:** Opus 4.8 (owner-choice) · **HMW-mode ON** +- **Chỉ-thị anh, nguyên văn:** *"Nhớ chú ý đọc thật kỹ bọn mày rất hay sót."* → lane thiết-kế phủ **mỗi file ≥2 người đọc, lăng-kính KHÁC nhau**. +- **Anh chốt:** các câu hỏi treo *"đã bảo trả lời với Hub và đã adap broadcast rồi"* ⇒ đáp-án nằm TRONG 10 thư này, KHÔNG hỏi lại anh. + +## Tiền-đề đã verify (đo tươi phiên này, không chép) + +| Việc | Kết quả | +|---|---| +| `/check-email` STAGE-1 | 10 thư MỚI kéo từ `outbox/all` (07-18 → 07-21) | +| Tuyến (a) whole-file hash | **10/10 byte-identical** vs nguồn hub | +| Tuyến (b) `stamp_verify.py` | **10/10 exit 0** — 0 tamper, 0 WRONG-METHOD | +| Dương-giả đã loại | 51 file cũ (06-02 → 07-15) = lớp *đã-adopt-chưa-copy-body* (process-gap S101/S119), **KHÔNG phải thư mới** | +| Kẽ đã bịt | `/check-email` bước 2 chỉ ghi `outbox/se`; **`outbox/all` (90 file) không được nhắc** → nguồn thật của cả 10 thư này | + +## 10 broadcast đợt-11 (input) + +| # | id | B | +|---|---|---| +| 1 | `2026-07-18-Governance-spawn-label-panel-audit-khung` | 5.189 | +| 2 | `2026-07-19-Agent-ensemble-cost-lens-khan-hiem-va-routing` | 6.782 | +| 3 | `2026-07-19-Agent-ensemble-depth-axis-deepen-on-contested` | 7.755 | +| 4 | `2026-07-19-Agent-ensemble-depth-cost-update-so-do-thuc` | 7.835 | +| 5 | `2026-07-19-Governance-goi-chot-owner-nam-khoan` | 12.320 | +| 6 | `2026-07-19-Governance-harness-dong-du-vong-audit-va-eval-use-side` | 7.249 | +| 7 | `2026-07-19-Governance-hub-tu-danh-gia-3-goc-va-chuyen-pha` | 9.194 | +| 8 | `2026-07-20-Governance-3-khoan-title-tier-posture-home-distill-params` | 6.521 | +| 9 | `2026-07-20-Governance-auto-toan-vong-distill-2-tang` | 6.274 | +| 10 | `2026-07-21-Governance-eval-quality-audit-ra-thuoc-eval-cua-eval` | 9.540 | + +**Tổng ~79 KB.** Thư mục: `broadcasts/inbox/.md` (root = pending, chưa STAGE-2). + +## taskList snapshot (lượt-1 — invest ensemble 5 lane, cùng vai `investigator-codebase`) + +| lane | label | lăng-kính | file phụ-trách ĐỌC TRỌN | +|---|---|---|---| +| 1 | `lens-ensemble` | trục ENSEMBLE/routing/cost | #2 #3 #4 | +| 2 | `lens-eval-audit` | trục ĐO / audit-của-audit | #6 #7 #10 | +| 3 | `lens-distill-tier` | trục DISTILL / tier / spawn-label | #1 #8 #9 | +| 4 | `lens-owner-binding` | trục RÀNG-BUỘC: cái nào là LỆNH vs bàn | #5 + lướt cả 10 | +| 5 | `lens-anti-sot` | **cross-cut CHỐNG SÓT** — đọc CẢ 10, săn cái 4 lane kia dễ rơi | cả 10 | + +⇒ mỗi file có **≥2 người đọc** (1 lane chuyên sâu + lane 4/5 cross-cut). + +## Stages + +- [x] S0 — `/check-email` kéo + verify 2 tuyến 10/10 +- [x] S1 — scaffold run-folder + taskList snapshot (file này) +- [!] S2 — invest ensemble 5 lane (`/fable-clone investigator-codebase`) — **RUNNING** `wf_491c05a8-6dc` +- [ ] S3 — lead refute + synthesize → `spec-adap-dot-11-22-07-2026.md` (3 heading cố-định) +- [ ] S4 — review ensemble (`/fable-clone reviewer`) chấm spec +- [ ] S5 — lead áp fix → spec v2 +- [ ] S6 — `hmw` Opus 4.8 MAX triển khai theo spec (bơm qua args) + +## wf run-id + +- S2: `wf_491c05a8-6dc` — 5 lane `investigator-codebase` tier:opus, RUN-TRACE mode. + - Lượt phóng đầu `wf_977c2690-5ce` **THROW đúng guard** `checkpointApproved chưa set` (anti-accidental-fire) — 0 agent, 0 token. Lead @inform quy mô {5 agent · investigator-codebase · 10 broadcast/5 lăng-kính} rồi set cờ, phóng lại. diff --git a/.claude/workflows/runs/2026-07-22-S144-adap-dot-11/spec-adap-dot-11-22-07-2026-v2.md b/.claude/workflows/runs/2026-07-22-S144-adap-dot-11/spec-adap-dot-11-22-07-2026-v2.md new file mode 100644 index 0000000..02e975a --- /dev/null +++ b/.claude/workflows/runs/2026-07-22-S144-adap-dot-11/spec-adap-dot-11-22-07-2026-v2.md @@ -0,0 +1,136 @@ +# spec v2 — adap đợt-11 (10 broadcast AI_INFRA 2026-07-18 → 07-21) + +> **Supersedes** `spec-adap-dot-11-22-07-2026.md` (v1). v1 **GIỮ NGUYÊN** làm vết audit — CẤM sửa. +> **Gate:** `/fable-clone reviewer` 3-lane `wf_301d3943-144` — **3/3 lane sạch, 0 rỗng**. +> R1 anchor `PASS_WITH_FIXES` (60 neo · 55 khớp · 4 MAJOR) · R2 scope `PASS_WITH_FIXES` (5 mục để lên PASS) · R3 teeth `PASS_WITH_FIXES` (bảng: **2 răng-thật · 4 nửa-răng · 3 nửa-rỗng · 4 rỗng**). +> 🔴 **Đính chính reviewer:** R3 §0 headline ghi "4 răng-thật · 4 nửa-răng · 5 rỗng" — **không khớp bảng của chính nó**. v2 dùng **số từ bảng** (2+4+3+4=13 ✓). + +--- + +## ⓿ DISPOSITION — 20 finding, TỪNG DÒNG (luật-chung #3, cấm báo số tổng) + +| # | Finding | Nguồn | Xử | +|---|---|---|---| +| M1 | `settings.json:11` **trỏ nhầm lãnh-thổ** — repo `.claude/settings.json` 330 B, dòng 11 = `]`, 0 hit `model\|opus\|fable`; sự thật ở `~/.claude/settings.json:11` (global, NGOÀI git) | R1 | ✅ **SỬA** — mọi neo ngoài-git mang đường-dẫn đầy đủ (§P4-1). Lead **tự re-verify**: repo 0 hit ✓, global dòng 11 = `"model": "claude-opus-4-8[1m]"` ✓ | +| M2 | `cost-lens:50` **cắt nửa dòng** — rơi *"Khoản ③ áp được cho MỌI nhà"* | R1+R2(O-4c) | ✅ **SỬA** — thêm P3-5 | +| M3 | C11 giẫm knob owner (`session-start.md:135` khai **DP-5 quyền owner cục-bộ**) | R1 | ✅ **SỬA** — thành **O-6**, gỡ khỏi tay em-main | +| M4 | Nhãn *"đo được"* (tool-use 21/23 vs 28/34/35) **0 phản-chứng trên đĩa** | R1 | ✅ **SỬA** — khai nguồn = khối `` in-session **KHÔNG lưu đĩa** ⇒ hạ nhãn xuống *"quan sát in-session, không tái-lập được"* | +| P-1 | C8 **sai trục + tự mâu thuẫn**: `depth-axis:40` trần áp **tổng-lượt trục SÂU**, spec ép lên `taskList.length` (**width**); và `depth-axis:43` nói *"**không văng lỗi**"* trong khi C8 đòi THROW — trái cả `spec-v1:53` cấm-throw | R2 | ✅ **SỬA** — tách C8a/C8b, **bỏ THROW** | +| P-2 | C6 sweep **hồi-tố toàn corpus** > floor `goi-chot:55` (*"tài-liệu governance **mới**"*) | R2 | ✅ **SỬA** — forward-looking bắt buộc; hồi-tố **time-box** | +| O-1 | `harness-dong-du-vong:46` **khoản ③ tuần-tự trong-vòng** — **0 dòng** trong v1 | R2 | ✅ **SỬA** — thành **P1-6** + C4b | +| O-2 | `goi-chot:38/:66/:73` **nửa sau khoản 2** — SE dùng resume **VÀ** dựa model-pin (`hmw.js:219`) ⇒ phải tự verify override sống qua resume | R2 | ✅ **SỬA** — thành **P4-6** | +| O-3 | khoản ② propose-only **không có dòng disposition** (dù `hmw.js:185` writeGuard nhiều khả năng đã đạt) | R2 | ✅ **SỬA** — bảng 4-dòng/thư-binding | +| O-4a | `hub-tu-danh-gia:27` *"điểm tự-chấm của lead phải để **NGOÀI mọi kênh sub với tới được**"* — 🔴 **FIRE ĐỎ NGAY RUN NÀY** | R2 | ✅ **NHẬN LỖI + SỬA** — xem ⓪ dưới | +| O-4b | `hub-tu-danh-gia:62` cite nửa dòng (nửa kia = *"dùng được ngay ở mọi nhà"*) | R2 | ✅ **SỬA** — P3-6 | +| O-4d | `depth-cost:52` bài-học-1 *"lệnh ép-full-power của owner phải khoá cả chiều MÁY"* | R2 | ✅ **SỬA** — neo vào C8b | +| O-4e | `auto:29-31`+`:46` instrument **tự làm tươi** số-đo-đóng-băng | R2 | ✅ **SỬA** — P2-2 thêm nhánh làm-tươi | +| G-1 | C8 chứa **SỐ** + **đổi CƠ CHẾ** = 2 cột owner (`eval:24`), chưa có trong O-1…O-5 | R2 | ✅ **SỬA** — **O-7** | +| G-2 | C12 ghi **posture TOGGLE** vào `CLAUDE.md` = stale-by-construction (`ultra-off.md:9` xoá marker) + đẻ **ghost-wire mới** | R2+R3 | ✅ **SỬA** — đổi sang **trỏ nơi tra**, không chép giá-trị | +| G-3 | `≤3 file/lane` là số **AI tự đặt** | R2 | ✅ **KHAI** — "AI-tự-đặt, đảo được", không gate | +| T-C6 | C6 **RỖNG HOÀN TOÀN** — literal `"máy sẽ"` trong `docs/governance/` = **0 hit**; họ-diễn-đạt cùng nghĩa = **19 hit NGOÀI tập-đo**; sweep rộng hơn **đã chạy** @wave-3 (3/3 sạch). Fault-inject: cắm câu-hứa-giả → **VẪN XANH** | R3 | ✅ **VIẾT LẠI** | +| T-C11 | C11 **BẤT-KHẢ-THI** — `grep=0` buộc xoá luật owner đang GIỮ (`sleep-…l2.md:52`); fault-inject: đổi `ngày`→`chu-kỳ` → grep=0 → xanh, hành vi y nguyên | R3 | ✅ **VIẾT LẠI** — đo **hành vi**, không đo chữ | +| T-C7 | *"đo wall-clock, ghi số"* **PASS ở MỌI giá trị**; `pause.md:44` đã gọi `powershell.exe` **lọt khe** danh-mục-cấm | R3 | ✅ **VIẾT LẠI** | +| T-mix | C2/C3/C5/C9/C10/C13 nửa-răng/nửa-rỗng | R3 | ✅ **SIẾT** từng mục (§③) | + +### ⓪ 🔴 LEAD NHẬN LỖI — anchor ngầm (O-4a), bằng chứng ngôi-thứ-nhất + +`hub-tu-danh-gia:27`: *"điểm tự-chấm của lead phải để **NGOÀI mọi kênh sub với tới được** — 'không đưa vào pack' chưa đủ khi sub đọc sổ chung."* + +v1 mang sẵn phán quyết của lead (*"SE hiện **FAIL rõ**"* `:67` · *"⇒ **FAIL**"* `:95` · *"→ **SE QUALIFY**"* `:18`) **rồi đưa chính file đó cho reviewer chấm**. Đó là anchor ngầm, và hub vừa phát đúng bài này 3 ngày trước. + +**Sửa từ v2:** phán quyết của lead tách khỏi mệnh đề đo được. v2 viết *"đo được: `hmw.js:114-117` = soft-notice, không có clamp cứng"* thay vì *"SE FAIL rõ"*. Kết luận để reviewer tự rút. +🔸 **Khai thật:** vòng review v1 **đã bị anchor**, không sửa ngược được. 3 lane vẫn tìm ra 20 finding kể cả khi bị mồi — nhưng con số đó **không được đọc thành "anchor vô hại"**. + +--- + +## ① TÍNH-NĂNG / ĐỀ-BÀI + +Giữ nguyên v1 §① (R2 xác nhận **phân hạng 10/10 đúng ở mức THƯ, 0 ca phóng-đại tầng thư**), **cộng 3 đính chính**: + +1. **M2/O-4b/O-4c** — 3 thư nhóm GHI-NHẬN vẫn chứa khoản *"dùng được ngay ở mọi nhà"*: `cost-lens:50` khoản ③ · `hub-tu-danh-gia:62` pattern eval-3-góc + 3 câu kiểm · `depth-cost:52` bài-học-1. **Xếp GHI-NHẬN không có nghĩa bỏ trắng** ⇒ P3-5, P3-6. +2. **O-3** — thư BINDING phải có bảng **4 dòng disposition/thư**, không tuyên "4 khoản" rồi làm 2. +3. **M4** — con số tool-use lane (21/23 vs 28/34/35) đến từ khối `` + phân tích transcript **in-session**, **KHÔNG lưu đĩa** ⇒ đọc là *quan sát không tái-lập*, không phải *phép đo*. + +Ba phát hiện lật tiền-đề của v1 (0/12 mục treo · `hmw.js:225` · SE đi trước hub ở positive-control) — R1/R2/R3 **đều xác nhận**, giữ nguyên. + +--- + +## ② CÁCH IMPLEMENT (delta so v1) + +### P0 — giữ nguyên +**P0-1** `hmw.js` lane-chết-phải-kêu · **P0-2** luật đóng-gói-lane. R3 chấm **C1 = RĂNG THẬT**, giữ. +🔸 G-3: `≤3 file/lane` = **AI tự đặt, đảo được** (không phải số owner). + +### P1 — thêm **P1-6** (vá O-1) +**P1-6. Tuần-tự trong-vòng** (`harness-dong-du-vong:46`, khoản ③ BINDING v1 bỏ sót) +- *"audit **chờ đúng con đo vòng mình xong** (chống chấm bản stale); các vòng khác nhau chạy song song thoải mái"*. +- 🔴 Vì sao KHÔNG vô hại: `hmw.js:175` `parallel()` **không tuần-tự-hoá trong 1 invocation**. Nếu C4 bơm `harness-audit` chung `taskList` với con-ĐO ⇒ audit chấm **bản rỗng** = đúng lỗ thư vá. v1 đã biết tính chất này (`:100`) mà không áp cùng kết luận. +- Cách: audit vòng X chạy ở **invocation hmw SAU** con-đo vòng X. + +### P2 — sửa P2-1, mở rộng P2-2 +**P2-1 (sửa P-1 + G-1 + O-4d).** Tách 2 trục, **BỎ THROW**: +- **(a) trục SÂU** — `assert tổng-lượt ≤ trần`; trần = **O-2 (owner)**. +- **(b) trục RỘNG** — `depth-axis:43` *"BỎ đào + báo RÕ (**không văng lỗi**, không lặng-thầm bỏ)"* ⇒ **LOUD-skip**, KHÔNG throw. Neo `depth-cost:52` *"cổng-ngân-sách tự hạ được = máy đè lệnh owner"* — SE có `/fable-real` = lệnh owner đích danh, cổng cứng ở fan-out là đúng lớp bệnh thư cảnh báo. +- Trần width hiện `hmw.js:115` = `16` ⇒ **O-7**. + +**P2-2 (thêm O-4e).** Bảng cost re-ground **+ nhánh tự-làm-tươi** (`auto:29-31`): khi chính bộ đo báo trôi quá ngưỡng % → đọc lại + cập nhật **ngay trong phiên**, hết vòng "ghi nhận → treo → bàn lại". + +### P3 — thêm P3-5, P3-6; sửa P3-2, P3-3 +**P3-5 (M2).** `cost-lens:50` khoản ③ — *"suggest **đúng 1 dòng** non-blocking rồi chạy luôn"*, hub khai *"áp được cho MỌI nhà"*. +**P3-6 (O-4b).** `hub-tu-danh-gia:62` pattern **eval-3-góc** (§1) + **3 câu kiểm** (§6) *"dùng được ngay ở mọi nhà"* — gồm cả câu tự soi anchor (§6 câu 2), thứ vừa fire đỏ ở ⓪. +**P3-2 (sửa M3/T-C11).** Distill trigger đếm-thật ⇒ chuyển thành **O-6** (owner) vì `sleep-…l2.md:52` khai *"INFORM 7-ngày **GIỮ** (quyền owner cục-bộ, B1 §3.4)"*. Em-main **KHÔNG** tự gỡ. +**P3-3 (sửa G-2).** discoverability-home: `CLAUDE.md` **trỏ NƠI tra** posture (marker + `/session-start`), **CẤM chép giá-trị ON/OFF** — `ultra-off.md:9` xoá marker ⇒ chép giá-trị = sai ngay lượt sau. + +### P4 — thêm P4-6 +**P4-6 (O-2).** `goi-chot:73` SELF-CHECK: **grep call-site resume/continue** → SE có dựa vào model-override sống qua resume không? SE thoả tiền-đề (`hmw.js:219` bơm model tại spawn; path-2 `SendMessage-resume` dùng **2 lần hôm nay**). Nếu CÓ dựa ⇒ **đo 1 lần trên env SE** trước khi tiếp tục tin path-2. +🔴 Nếu override không sống qua resume, lane được cứu chạy **model khác mà không ai biết** — đúng `depth-cost:53` *"thử-rồi-chết ≠ chạy-rồi-sạch"*. + +### 🔒 OWNER-GATED — **O-1…O-7** (thêm 2) + +| # | Khoản | +|---|---| +| O-1 | Số `min_pending_shards` / `bulk_note_shards` | +| O-2 | Posture trục-sâu + **trần tổng-lượt** | +| O-3 | Gộp hay tách vai-KIỂM 3 vòng còn thiếu | +| O-4 | Ratify ranh `refine ⟂ lead-omission` | +| O-5 | Nhãn model-flip | +| **O-6** 🆕 | **Sleep-trigger 7-ngày → đếm-shard?** — `sleep-…l2.md:52` khai owner **đang GIỮ** có chủ đích. `eval:24` xếp *"đổi cơ chế"* = **owner-quyết-LUẬT**. Em-main CẤM tự gỡ | +| **O-7** 🆕 | **Trần width + cơ chế** (`hmw.js:115` hiện `16`, soft) — số = owner-SỐ; throw-hay-LOUD-skip = owner-LUẬT | + +--- + +## ③ CHECKLIST v2 — đã siết theo R3 + +**Ký hiệu:** 🦷 răng-thật · ⚙️ đã siết · 🔒 owner-gated + +| # | Vai | Deliverable | Acceptance **có răng** | +|---|---|---|---| +| **C1** 🦷 | em-main | `hmw.js` lane-chết-kêu | **Fault-inject 2 CHIỀU**: null→**phải** chứa `lane CHẾT`; sạch→**không được** chứa. R3 chứng: bản giả `log()` vô-điều-kiện **trượt vế âm** ⇒ răng thật. `node --check` exit 0 | +| **C2** ⚙️ | em-main | Luật đóng-gói-lane | ❌ Bỏ `grep -c 'trần lượt'` (đếm chữ). ✅ Đo ở **run KẾ**: 0 lane chết. 🔸 **Khai hạn chế**: C1 chỉ biết `null`, **không phân biệt được NGUYÊN NHÂN** ⇒ "chết vì cháy lượt" hiện **chưa đo được** | +| **C3** ⚙️ | em-main | Khuôn label 4 thành-phần | ✅ **negative-control**: cắm 1 label thiếu {pha·phiên} → phép đọc **phải TRƯỢT**. ✅ **Neo artifact**: label xuất hiện trong `runs//run.md` (panel ephemeral, không grep được) | +| **C4** ⚙️ | `harness-audit` | Vai-KIỂM 3 vòng | ✅ **Cấm tự-kiểm vòng mình đo** (`m-3 no-self-exempt` S139). ✅ Con số re-check phải là số **CÓ THỂ SAI**, không phải hằng số hiển nhiên | +| **C4b** 🆕 | em-main | Tuần-tự trong-vòng (P1-6) | Audit vòng X ở **invocation hmw SAU** con-đo vòng X. Bằng chứng: 2 run-id khác nhau, mtime audit > mtime đo | +| **C5** ⚙️ | `test-specialist` | Eval phía DÙNG | ✅ **Thêm POSITIVE-control**: id THẬT đã biết → **phải** ra `APPLIED`. 🔴 Thiếu vế này thì matcher **chết** (luôn 0-hit) đạt neg-control **hoàn hảo** | +| **C6** ⚙️🔴 | `reviewer` | Cửa lời-hứa-máy | ❌ **BỎ** neo literal `"máy sẽ"` (tập-đo = **0/19**, fault-inject cắm câu giả **vẫn xanh**). ✅ Tập-đo = **danh sách liệt kê tường minh**, mẫu-số công bố (**19** đo được), mỗi câu 1 dòng disposition. ✅ **positive-control BẮT BUỘC**: cắm 1 câu-hứa-giả vào cây tạm → sweep **phải** nhặt ra. ✅ Tách **use ⟂ mention** (7 hit hiện có đều là *mention*). ✅ Đo **gate đã cài**, không đo *đã quét xong* — `goi-chot:53` *"chặn từ lúc VIẾT"*. ✅ Hồi-tố **time-box** (P-2) | +| **C7** ⚙️ | em-main | Điểm-dừng rẻ | ❌ Bỏ *"ghi số"* (PASS ở mọi giá trị). ✅ **Ngưỡng = O-gated**. ✅ Tập cấm đổi từ liệt-kê sang **bất kỳ tiến-trình ngoài nào** trong đường dừng — 🔴 `pause.md:44` **đã** gọi `powershell.exe nhip-no-probe.ps1`, danh-mục cũ để nó lọt | +| **C8a** 🦷🔒 | em-main | Clamp **trục SÂU** | `assert tổng-lượt ≤ trần`. **BLOCKED-by-O-2** | +| **C8b** ⚙️🔒 | em-main | Ngân-sách **trục RỘNG** | **LOUD-skip**, ❌ **KHÔNG throw** (`depth-axis:43` *"không văng lỗi"*). Fault-inject 2 chiều. **BLOCKED-by-O-7** | +| **C9** ⚙️ | `investigator-codebase` | Bảng cost re-ground + nhánh làm-tươi | ✅ Gỡ mâu thuẫn: **khai thẳng** falsifier `depth-cost:59` **vẫn CHƯA đo được** (đơn-vị thứ ba); C9 chỉ đóng phần **re-ground roster 7→17** + wire nhánh tự-làm-tươi | +| **C10** ⚙️ | trio | Eval-của-eval 4 câu | ✅ Cỡ mẫu **≥3**, **ưu tiên thước CHƯA từng fault-inject** (loại S138/S143 đã xanh). ❌ Bỏ *"mỗi thước có verdict"* khỏi headline (100% do cấu trúc, `eval:32`) | +| **C11** ⚙️🔒 | — | Distill trigger | ❌ **BỎ** `grep 'ngày'=0` (rời-tập-đo: đổi `ngày`→`chu-kỳ` là xanh, hành vi y nguyên; và buộc xoá luật owner đang GIỮ). ✅ Đo **HÀNH VI**: {0 shard chưa-gist, 30 ngày} → trigger **phải IM**; {3 shard, 0 ngày} → **phải KÊU**. **BLOCKED-by-O-6** | +| **C12** ⚙️ | em-main | discoverability-home | ❌ **BỎ** *"CLAUDE.md có dòng nêu posture đang hiệu lực"* (stale-by-construction). ✅ `CLAUDE.md` **trỏ NƠI tra**. ✅ Phép thử **use**: 1 ca dương + 1 ca âm — phiên mới đọc file luật có nói **đúng** posture hiện hành không | +| **C13** ⚙️ | em-main | P4-1…P4-6 | ✅ *"Lý-do-không-làm"* phải kèm **phân loại** {owner-gated · defer-có-ngày · bác-bỏ-có-bằng-chứng} — nếu không = cửa thoát vô hạn | +| **C14** 🆕 | em-main | Bảng disposition per-thư-binding (O-3) | 4 thư BINDING × 4 khoản = **16 dòng**, mỗi dòng {ADOPT · ĐÃ-CÓ+neo · N-A+lý do}. **CẤM** tuyên "4 khoản" rồi làm 2 | +| **C15** 🆕 | em-main | Grep resume call-site (P4-6) | Liệt kê call-site `SendMessage`/resume + verdict 1 dòng *"SE có/không dựa vào model-override sống qua resume"*. Nếu CÓ → đo 1 lần env SE | + +### 🔴 Luật chung (v1 giữ 6, thêm 3) + +1. Existence-proof tại chỗ · 2. Đo trước khi tuyên · 3. Bảng disposition TỪNG DÒNG · 4. Ghi đĩa TRONG lúc làm · 5. Điểm-dừng phải rẻ · 6. Số của owner — O-1…**O-7** CẤM tự đặt. +7. 🆕 **Neo ngoài-git mang đường-dẫn đầy đủ** (M1 `neo-trỏ-nhầm-lãnh-thổ`). +8. 🆕 **Cite nguyên DÒNG, không cắt nửa** (M2/O-4b/O-4c — 3 ca cùng lớp trong 1 spec). +9. 🆕 **Phán quyết của lead KHÔNG đi vào file sub đọc được** (O-4a `hub-tu-danh-gia:27`). + +### Trạng thái khoá + +- **Chạy được ngay (không chờ owner):** C1 · C2 · C3 · C4 · C4b · C5 · C6 · C9 · C12 · C13 · C14 · C15 +- **BLOCKED chờ owner:** C8a (O-2) · C8b (O-7) · C11 (O-6) · C7-ngưỡng · C10 (nếu đụng số) diff --git a/.claude/workflows/runs/2026-07-22-S144-adap-dot-11/spec-adap-dot-11-22-07-2026.md b/.claude/workflows/runs/2026-07-22-S144-adap-dot-11/spec-adap-dot-11-22-07-2026.md new file mode 100644 index 0000000..92535fc --- /dev/null +++ b/.claude/workflows/runs/2026-07-22-S144-adap-dot-11/spec-adap-dot-11-22-07-2026.md @@ -0,0 +1,177 @@ +# spec — adap đợt-11 (10 broadcast AI_INFRA 2026-07-18 → 07-21) + +> **Run:** `2026-07-22-S144-adap-dot-11` · **Phiên:** S144 · **Lead:** Opus 4.8 · **HMW-mode ON** +> **Nguồn:** 10 thư `broadcasts/inbox/` — verify 2 tuyến **10/10 whole-file** + **10/10 `stamp_verify.py` exit 0** +> **Engine:** `/fable-clone investigator-codebase` 5-lane (`wf_491c05a8-6dc`) — **2/5 lane sống**, 3 lane chết vì `maxTurns:20`; lead đọc bù 6 thư trực tiếp ⇒ **phủ 10/10** +> **Pipeline H21:** engine propose → **lead verify + ghi (file này)** → reviewer chấm → worker thực-thi theo spec (bơm qua args) + +--- + +## ① TÍNH-NĂNG / ĐỀ-BÀI + +Áp 10 broadcast đợt-11 vào SOLUTION_ERP. Nội dung chia **4 hạng ràng buộc** (phân loại lấy từ chính dấu hiệu văn bản, không suy diễn): + +| Hạng | Thư | Neo dấu hiệu | +|---|---|---| +| **BINDING-floor** | `spawn-label` (4 khoản) | `:22` *"Khung sàn (function-floor — 4 khoản bắt buộc)"* | +| **BINDING-floor** | `harness-dong-du-vong` (4 khoản) | `:42` *"Khung sàn (function-floor — 4 khoản)"* | +| **BINDING-floor** | `depth-axis` (4 khoản) | `:38`; điều-kiện `:20` *"Áp cho dự-án nào có ensemble đa-agent/đa-lăng-kính"* → **SE QUALIFY** | +| **BINDING-mixed** | `goi-chot-nam-khoan` — **khoản 3 + 4** binding; khoản 1/2/5 = quyết-định nội-bộ hub + *"floor chuyển được"* | `:44-45`, `:52` vs `:29`, `:37`, `:59` | +| **KHUYẾN NGHỊ** | `eval-quality` · `auto-toan-vong` · `3-khoan` | `:13` *"Khung = sàn chức năng"* · `:43-47` · `:15` *"FYI + khung tự-áp"* | +| **GHI NHẬN** | `cost-lens` · `depth-cost` · `hub-tu-danh-gia` | `:50` · `:63` *"KHÔNG floor mới"* · `:62` *"điểm số và findings là của hub, không áp"* | + +### 🔴 Phát hiện lật tiền-đề (phải đọc trước khi làm) + +**(1) 0/12 mục treo của SE có đáp án TRỰC TIẾP trong 10 thư — nhưng phần lớn KHÔNG PHẢI NỢ.** +Đây là lỗi **phân loại** của SE, không phải hub im lặng: + +| Nhóm | Số mục | Thực chất | +|---|---|---| +| Product-scope | 5 (UAT S133 · UAT S134 · D1 · VC-1/2/3 · close-sweep) | `grep UAT\|lũy kế\|phiếu\|migration` trên 10 thư = **0 hit**. Hub **KHÔNG BAO GIỜ** trả lời. Chờ **owner**. | +| Owner-quyết-SỐ | 3 (`pull_warn_days` · `session_ctx_kb` · hook-vs-budget-cap) | Hub nói **≥3 lần**: `eval:55` *"đừng chép số hub làm chuẩn"* · `auto:19` *"núm-số ngân sách vẫn thuộc chủ dự án"* · `eval:24` *"AI không tự quyết hai cột sau"*. ⇒ SE để trống = **TUÂN THỦ**. | +| Đã có đáp án `[ngoài-10]` | 3 | `58e28bae` (thư đã kéo đợt trước) | +| Còn nợ thật | 1 | ratify ranh `refine ⟂ lead-omission` | + +🔴 **Hệ quả vận hành:** bảng "chờ" của SE phải **tách 2 cột chủ-thể** (chờ-owner ⟂ chờ-hub). Gộp chung tạo kỳ vọng sai — 5 mục sẽ nằm đó vĩnh viễn. + +**(2) `hmw.js:225` = lỗ ĐANG CHẢY MÁU, và nó vừa cắn CHÍNH RUN NÀY.** +`return results.filter(Boolean)` — lane chết runtime → `null` → **nuốt lặng**. Đối chiếu `depth-cost:53` *"Thử-rồi-chết ≠ chạy-rồi-sạch… tầng tổng-hợp sẽ viết 'tầng-2 không thêm gì' = củng-cố verdict bằng một tầng-2 không tồn tại"*. +**Bằng chứng sống hôm nay:** 3/5 lane chết, lead nhận mảng 2 phần tử **không tín hiệu chết**. Lead chỉ biết nhờ khối `` của **harness**, KHÔNG nhờ `hmw.js`. Falsifier `depth-cost:59` hỏi *"tầng chết thì tầng sau thấy 'chết' hay 'sạch'?"* → **SE trả lời: thấy SẠCH.** + +**(3) SE đang ĐI TRƯỚC hub đúng một khoản** — `eval:31` *"Bộ kiểm-tra-đặc-tả của hub có 17/18 check không có positive-control"*; SE đã fault-inject 2 chiều nhiều đợt (13/13 @S138 · 7 ca @S143). Đây là chất liệu báo nấc **bằng SỐ**. + +**(4) Bẫy over-apply khoản 2 gói-chốt.** `goi-chot:37` retire resume **chỉ cho mục-đích giữ-model/giữ-context**; *"hội-thoại tiếp-diễn trong cùng lượt làm việc"* **vẫn hợp lệ** ⇒ path-2 `SendMessage-resume` cứu #53 **KHÔNG bị retire**. Áp sai = mất lưới #53 (đã dùng 2 lần thành công hôm nay). + +--- + +## ② CÁCH IMPLEMENT + +### P0 — lỗ SỐNG (làm trước, có repro hôm nay) + +**P0-1. `hmw.js` — lane chết phải KÊU, không được nuốt.** +- Thay `return results.filter(Boolean)` bằng: giữ nguyên mảng có `null`, **đếm** `died = results.filter(r => !r).length`; `died > 0` → `log()` **LOUD** dạng `hmw: 🔴 / lane CHẾT (null) — KHÔNG phải "sạch"` + trả kèm marker để P3 thấy. +- 🔴 **CẤM** sửa thành `throw` — `hmw.js:124-125` đã tự khai đúng: *"per-lane throw có thể bị nuốt thành null = STOP-SILENT, tệ hơn"*. +- **Neo lineage:** ghi lý do tại chỗ wire (khuôn `auto:35` — giữ vết, thêm chú thích có ngày + chủ-ký). + +**P0-2. `maxTurns` vs khối lượng lane — chống tái diễn.** +- Nguyên nhân đo được: `investigator-codebase` `maxTurns: 20`; lane sống dùng 21/23 tool-use, lane chết dùng 28/34/35 ⇒ **cháy lượt khi đang đọc, chưa tới bước ghi**. +- 🔴 Fix **KHÔNG** phải nâng `maxTurns` (sửa frontmatter cần restart). Fix = **kỷ luật đóng gói lane**: ≤3 file/lane + **ép ghi khung rỗng ở lượt đầu** rồi append, thay vì dặn "ghi sớm". +- Ghi thành luật trong `.claude/commands/fable-clone.md` (mục mới: *"đóng gói lane theo trần lượt"*). + +### P1 — BINDING floor (bắt buộc adopt) + +**P1-1. Spawn-label 4 khoản** (`spawn-label:22-27`) +- Khuôn SE (form tự quyết, function là sàn): `{Vòng-N|Core|Gate|WF} {vai} {pha/wave} s` — vd `Vòng-3 harness-eval w1 @start s144`. +- Áp **MỌI** kênh spawn: `Agent` tool `description`, `hmw` `label`, monitor 2-đầu-phiên, cổng review. +- Áp **từ phiên kế** (`:51`); spawn trước đó giữ nguyên làm vết, **KHÔNG sửa lùi** (`:43` khuôn hub). +- 🔴 SE hiện **FAIL rõ**: label phiên này (`"Probe harness-eval alive"`, `"H1 tooling-freshness re-report"`) thiếu pha + mã phiên. + +**P1-2. Đóng đủ vòng — mỗi vòng-ĐO có vai-KIỂM** (`harness-dong-du-vong:42-47`) +- Trạng thái SE: **chỉ vòng-3 (trio) có con KIỂM**. Vòng tooling/harvest (H1+H2), vòng soi-lead (2 vai H24), vòng nén-ngủ = **0 con soi**. +- 🔴 **Hình thức tự quyết** (`:51` *"gộp hay tách audit (1 con kiểm nhiều vòng hay mỗi vòng 1 con)"*) ⇒ SE **KHÔNG cần đẻ 3 vai mới**. Đề xuất: **1 vai `harness-audit` mở rộng phạm vi** sang cả 3 vòng còn lại (rẻ hơn, khớp `:51`). +- Bắt buộc kèm **thách-CLEAN** (`:44`): vòng nào báo sạch phải re-check mẫu ≥1 lens. +- Khoản ① *"có thể adopt dần từng vòng — báo nấc theo vòng"* (`:59`) ⇒ **làm dần được, không phải all-or-nothing**. + +**P1-3. Eval 2 phía — thêm phía DÙNG** (`harness-dong-du-vong:47`) +- SE hiện chỉ đo **presence** (MFE coverage/FIT). Thiếu **use**: cross-session, evidence-based. +- Nhãn bắt buộc 3 loại: `APPLIED` · `DORMANT` (**≠ MISS**) · chờ judge. +- `%` phải mang caveat **NẰM TRONG payload**: *"% = FLOOR theo evidence, không phải ceiling"*. +- **negative-control BẮT BUỘC** trong test (bơm id giả → phải 0-hit; trả APPLIED = matcher rác = test đỏ). + +**P1-4. Gói-chốt khoản 4 — cửa-duyệt lời-hứa-máy** (`goi-chot:52`, hub chấm *"áp cho MỌI dự-án"*) +- LUẬT: câu dạng *"máy sẽ chặn/quét/bắt X"* / *"detector đảm-nhiệm Y"* ⇒ **BẮT BUỘC existence-proof tại chỗ** {đường-dẫn máy + lệnh chạy được + test/positive-control}. Thiếu mảnh nào → **phải viết dạng dự-định**. **Cấm viết dạng đang-có.** +- Việc: sweep doc governance SE tìm câu hứa-máy chưa có proof → viết lại 1 trong 2 dạng. +- Reviewer hỏi đúng 1 câu: *"mã nào làm việc đó?"* + +**P1-5. Gói-chốt khoản 3 — điểm dừng phải RẺ** (`goi-chot:44-46`, ràng buộc **thiết-kế CỨNG**) +- *"bất kỳ van/gate/phép-đo nào về sau cũng KHÔNG ĐƯỢC chặn hoặc làm chậm các cửa dừng–nối–checkpoint"*. +- Việc: **audit `/pause` + `/tiep` + `/session-end`** — bước nặng (spawn agent · đo lớn · quét rộng) nằm trong đường pause = **vi phạm ranh** → dời về closeout. +- `goi-chot:74` *"Đo wall-clock một lần"*. +- 🔴 **Đè lên carry #7 và NEXT#3**: mọi hardening SE định thêm vào `/pause`–`/tiep` (kể cả hook chặn sub-write) phải qua câu hỏi *"có làm điểm dừng đắt lên không"* **TRƯỚC** khi bàn giá trị. + +### P2 — BINDING-conditional (SE có ensemble ⇒ áp) + +**P2-1. depth-axis 4 khoản** (`depth-axis:38-43`) — điểm sàn adopt `:55` = **có trục sâu bật-được + escape width-only**. +- F1 owner-gated + **clamp trần cứng** + assert tổng-lượt ≤ trần. 🔴 SE hiện `hmw.js:114-117` *"KHÔNG cap cứng (soft notice only)"* ⇒ **FAIL**. +- F2 đào điểm-nóng KHÔNG đào-tất; worker tầng-2 **KHÔNG** tổng-hợp. +- F3 con **TƯƠI** + prompt-floor *"tầng-1 là VẬT-LIỆU không phải đáp-án; đồng-ý-lại = 0 điểm"*. 🔴 SE hiện refute do **em-main** làm (đã đọc tầng-1) = **dính mỏ-neo**. +- F4 **cận-ngân-sách LOUD** (bỏ đào + báo RÕ, không lặng-thầm). +- Tiên quyết: `depth-cost:54` *"Phát-hiện chưa-qua-kiểm không được quyền đè"* · `:55` *"con thử-phá tầng-2 phải THẤY vòng-1"*. +- 🔴 Ép cơ học: `hmw.js` `parallel()` **không tuần-tự-hoá** ⇒ tầng-2 = **invocation hmw THỨ HAI** (cùng bài trio S141). + +**P2-2. Bảng cost re-ground** (`agents/README.md:249-257`) +- Đóng băng thời **7 sub-agent**, roster nay **17**; đơn-vị *"Effective tokens billed (after caching)"* = **đơn-vị THỨ BA**, không so được hub ⇒ falsifier `depth-cost:59` **CHƯA ĐO ĐƯỢC**. +- Việc: đo lại theo roster hiện hành + khai rõ đơn-vị + thêm cột *"đốt đơn-vị NÀO"* (`cost-lens:28`). + +### P3 — khuyến nghị giá trị cao + +**P3-1. Eval-của-eval, khung 4 câu** (`eval:15-24`) — áp cho **TỪNG thước** của SE (~10 script/detector): +(1) đã bắt lỗi THẬT chưa (trích dòng sổ)? · (2) đo **KẾT QUẢ** hay đếm **HOẠT ĐỘNG**? · (3) có **tự nói chuyện với mình** không (4 dạng: token-hoá-thạch · đếm-chính-dòng-định-nghĩa · nhãn-hứa-không-ép · chú-thích-tự-mâu-thuẫn)? · (4) bỏ thì **lỗi nào lọt**? +- Verdict `{GIỮ/SỬA/BỎ/THÊM}` + thẩm quyền `{AI-tự-sửa · owner-quyết-SỐ · owner-quyết-LUẬT}`. +- Gậy phân loại quý cho close-sweep: `eval:22` **dormant-đúng-thiết-kế** (máy báo khói) ⟂ **thừa-thật** (cấu trúc không thể kêu). + +**P3-2. Distill trigger = ĐẾM VẬT THẬT, bỏ ngày-lịch** (`auto:21-27`) +- 🔴 SE hiện dùng **sleep-check 7 NGÀY** = đúng proxy giả hub vừa bác, **và trái chính mark Active-High `RC-…10-29-11`** của SE (age = false-proxy). +- Đổi sang đếm shard chưa-gist. Tham số hub (đính chính `3-khoan:47-51`): `min_pending_shards: 1` = **kích hoạt** · `bulk_note_shards: 10` = **báo-to** — **đếm SỐ FILE chưa-nén, KHÔNG phải số agent** (hub tự khai đã đọc nhầm 1 lần). +- 🔴 **Số là của owner** — SE đặt số riêng, không chép. + +**P3-3. discoverability-home** (`3-khoan:31-41`) +- Phân biệt **implement-home** (máy chạy ở đâu) ⟂ **discoverability-home** (phiên mới NHÌN THẤY ở đâu). +- Chỉ-thị đổi hành vi mặc-định mọi phiên ⇒ **1 dòng vào file luật luôn-được-load + bump masthead**. +- Ứng dụng SE: `HMW-mode ON` là operating-posture — `CLAUDE.md` (file đọc đầu tiên) **có nói không?** + +**P3-4. Masthead sweep** (`3-khoan:19-27`) — sửa body doc nào ⇒ **đọc lại dòng-1 + masthead của CHÍNH doc đó** trước khi tuyên sweep xong. + +### P4 — đóng sổ / dọn (rẻ, làm kèm) + +| # | Việc | Neo | +|---|---|---| +| P4-1 | **Nhãn model-flip** — `settings.json:11` pin Opus từ 07-20, canonical `STATUS §Sub-agents` còn ghi "Fable 5" ⇒ outage-recipe `session-start.md:43` thành **no-op**. `goi-chot:28` nay cho luật đóng: boot-default = Opus, Fable qua **2 cửa owner-chủ-động** | `goi-chot:23-30` | +| P4-2 | **`/check-email` bước 2 thiếu `outbox/all`** — chỉ ghi `outbox/se`; `outbox/all` = **90 file**, nguồn thật của cả 10 thư đợt này | đo hôm nay | +| P4-3 | **Sổ garble** đĩa `×25` vs STATUS/HANDOFF `×23` + phiên này **+2** ⇒ `×27`. Chốt **CUỐI phiên** | `auto-memory:13` | +| P4-4 | H1 `F-1` `/sleep-recovery-memory-l2` 4 site lệch roster · `F-2` `ef-core-migration/SKILL.md` sót Mig 67 · `F-6` `.gitignore` thiếu `scheduled_tasks.lock` | S144 H1 | +| P4-5 | **Tách 2 cột chủ-thể** trong bảng chờ (chờ-owner ⟂ chờ-hub) | ① (1) | + +### 🔒 OWNER-GATED — em KHÔNG tự quyết + +| # | Khoản | Vì sao cần anh | +|---|---|---| +| O-1 | Số `min_pending_shards` / `bulk_note_shards` cho SE | `auto:19` núm-số thuộc chủ dự án | +| O-2 | Posture trục-sâu: trần+dial-down **hay** opt-in-off; giá trị clamp | `depth-axis:55` *"KHÔNG bắt buộc default nào"* | +| O-3 | Gộp hay tách vai-KIỂM cho 3 vòng còn thiếu | `harness-dong-du-vong:51` | +| O-4 | ratify ranh `refine ⟂ lead-omission` (đã wire TRƯỚC ratify) | mục treo #10, hub không trả | +| O-5 | Nhãn model-flip (P4-1) | quyền owner | + +--- + +## ③ CHECKLIST (vai · deliverable · acceptance ĐO ĐƯỢC) + +| # | Vai | Deliverable | Acceptance **ĐO ĐƯỢC** | +|---|---|---|---| +| C1 | em-main | `hmw.js` lane-chết-kêu (P0-1) | Fault-inject: ép 1 lane trả null → output **PHẢI** chứa chuỗi `lane CHẾT`; lane sạch → **KHÔNG** chứa. 2 chiều PASS. `node --check` exit 0 | +| C2 | em-main | Luật đóng-gói-lane vào `fable-clone.md` (P0-2) | `grep -c 'trần lượt'` ≥1; run kế ≤3 file/lane; **0 lane chết vì cháy lượt** | +| C3 | em-main | Khuôn label 4 thành-phần (P1-1) | Chọn ngẫu nhiên **3** task trên panel, **chỉ đọc label** nói được {ai·gì·nhịp·phiên} → 3/3. 0 label bị cắt chữ | +| C4 | em-main + `harness-audit` | Mở rộng vai-KIỂM sang 3 vòng (P1-2) | Mỗi vòng: chỉ ra **ai ngoài con đo** đã re-check **con số nào** bằng tay. Vòng báo CLEAN có ≥1 lens re-check mẫu | +| C5 | `test-specialist` | Eval phía DÙNG + negative-control (P1-3) | Bơm id giả → **0-hit** (trả APPLIED = test ĐỎ). Payload chứa literal `FLOOR theo evidence` | +| C6 | `reviewer` | Sweep lời-hứa-máy (P1-4) | Mọi câu *"máy sẽ…"* còn lại **đều** có {đường-dẫn + lệnh + positive-control}, hoặc đã đổi sang dạng dự-định. Đếm trước/sau | +| C7 | em-main | Audit điểm-dừng rẻ (P1-5) | **Đo wall-clock** `/pause` 1 lần, ghi số. 0 bước spawn-agent/quét-rộng trong đường pause | +| C8 | em-main | Clamp cứng + budget-gate `hmw.js` (P2-1) | `taskList.length > ` → **THROW**, không phải `log`. Fault-inject 2 chiều | +| C9 | `investigator-codebase` | Bảng cost re-ground (P2-2) | Số đo theo roster **hiện hành** (không phải 7); cột đơn-vị hiện diện; trả lời được falsifier `depth-cost:59` | +| C10 | `harness-eval` + `harness-refine` + `harness-audit` | Eval-của-eval 4 câu (P3-1) | Mỗi thước có verdict + cột thẩm-quyền. **Phép thử 2**: bịa input sai cho 1 detector bất kỳ → nó **ĐỎ**. Không đỏ = xanh-vì-mù | +| C11 | em-main | Distill trigger đếm-thật (P3-2) | `grep 'ngày\|7 day'` trong trigger = **0**; trigger đọc số shard. Lineage retire cũ **giữ vết** + chú thích có ngày | +| C12 | em-main | discoverability-home + masthead (P3-3/4) | `CLAUDE.md` có dòng nêu posture đang hiệu lực. Doc governance sửa body → dòng-1 khớp | +| C13 | em-main | P4-1…P4-5 | Từng mục có diff hoặc lý-do-không-làm. **CẤM** báo số tổng thay bảng từng dòng (bài `meta-count` S119) | + +### 🔴 Luật chung áp cho MỌI mục + +1. **Existence-proof tại chỗ** (P1-4) áp cho chính spec này: mục nào nói "máy sẽ bắt" mà chưa có máy → viết **dự-định**. +2. **Đo trước khi tuyên** — mọi số trong report phải re-đo, cấm chép từ spec. +3. **Bảng disposition TỪNG DÒNG**, không báo số tổng (`meta-count blind-spot`). +4. **Ghi đĩa TRONG lúc làm**; return chỉ là bản sao. +5. **Điểm-dừng phải rẻ** (`goi-chot:44`) — đè lên mọi đề xuất thêm việc. +6. **Số của owner** — O-1…O-5 **CẤM** tự đặt. + +### Nấc báo hub (sau khi xong) + +6/10 thư đòi `/adap-apply` + báo nấc per-khoản `sent→ACK→agreed→executed→verified`. +🔴 **Bất-đối-xứng đáng ghi:** `goi-chot-nam-khoan` — **thư binding nhất** — **KHÔNG** có mục "Nấc adopt", **0** câu `/adap-apply`. Báo nấc cho nó = tốt nhưng **không có mandate văn bản**; đừng để bảng nấc lệch vì chuyện này. diff --git a/.claude/workflows/runs/2026-07-22-S144-adap-dot-11/sub-investigator-codebase-0.md b/.claude/workflows/runs/2026-07-22-S144-adap-dot-11/sub-investigator-codebase-0.md new file mode 100644 index 0000000..535cd58 --- /dev/null +++ b/.claude/workflows/runs/2026-07-22-S144-adap-dot-11/sub-investigator-codebase-0.md @@ -0,0 +1,175 @@ +# sub-investigator-codebase-0 — LANE 1 "lens-ensemble" (S144 adap đợt-11) + +> Lăng-kính: **TRỤC ENSEMBLE** — chi phí · khan hiếm · routing · trục-độ-sâu · deepen-on-contested · sơ-đồ-thực. +> 3 file đọc TRỌN (không lướt). Mọi claim neo `file:line`. Ghi đĩa TRONG lúc làm (chống #53). + +**Ký hiệu 3 thư:** +- **[A] depth-axis** = `broadcasts/inbox/2026-07-19-Agent-ensemble-depth-axis-deepen-on-contested.md` · sha `f05eba5b…` +- **[B] depth-cost-update** = `broadcasts/inbox/2026-07-19-Agent-ensemble-depth-cost-update-so-do-thuc.md` · sha `294be326…` +- **[C] cost-lens** = `broadcasts/inbox/2026-07-19-Agent-ensemble-cost-lens-khan-hiem-va-routing.md` · sha `0a03b2c8…` + +**Trạng-thái adopt hiện tại:** `grep -rn "0a03b2c8|f05eba5b|294be326"` toàn repo (trừ chính 3 file inbox) = **0 hit** ⇒ **CẢ 3 CHƯA ADOPT/CHƯA STAMP**. `broadcasts/_index.md` (tail) — outbox mới nhất = `2026-07-22-…errata-bao-nac-wave-dot-9-10`, **0 row** cho cụm ensemble. + +--- + +## CÂU 1 — Mỗi thư ĐÒI SE LÀM GÌ (phân (a) floor · (b) khuyến nghị · (c) thông tin) + +### [A] depth-axis — **THƯ DUY NHẤT MANG FLOOR** + +**Điều-kiện kích-hoạt (A:20):** *"Áp cho dự-án nào có **ensemble đa-agent / đa-lăng-kính** (nhiều model/nhiều góc nhìn chạy song song rồi tổng-hợp). Không có ensemble → FYI, chưa cần áp."* +→ **SE QUALIFY** — `.claude/commands/fable-clone.md:15` ("ENSEMBLE tier-2-mạnh-nhất = N lane đa-lăng-kính CÙNG 1 VAI (qua HMW `parallel`) + em-main refute + synthesize") + `.claude/workflows/hmw.js:175` (`await parallel(A.taskList.map(...))`). ⇒ **floor A ÁP CHO SE, không né được bằng "không có ensemble"**. + +**(a) LỆNH / floor bắt buộc** — `A:38` heading *"## 3. Khung sàn (function-floor — 4 khoản)"*: +| # | Neo | Nội dung sàn | +|---|---|---| +| F1 | `A:40` | Trục sâu = **owner-gated, posture tự-chọn**; **"tắt-trục-sâu = escape về chiều-rộng LUÔN còn" (không khoá cứng)**; **"clamp trần cứng (vd ≤3) + assert tổng-lượt ≤ trần"** | +| F2 | `A:41` | **"Đào-vào-điểm-tranh-cãi, KHÔNG đào-tất"** — worker tầng-2 nhắm điểm nóng (bị-phá/bỏ-sót/mâu-thuẫn) + nhận lời-thử-phá làm bản-đồ, **KHÔNG tổng-hợp** | +| F3 | `A:42` | **Chống-mỏ-neo tường-minh** — worker tầng-2 = con **TƯƠI**, prompt-floor **"đồng-ý-lại=0-điểm"**; tầng-2 REFUTE-có-evidence **đè** tầng-1; tầng-2-paraphrase = **0-tín-hiệu** | +| F4 | `A:43` | **Cận-ngân-sách LOUD** — vượt ngân-sách trước bước đào → **BỎ đào + báo RÕ** (không văng lỗi, không lặng-thầm bỏ), trả kết-quả chiều-rộng | + +- **Điểm sàn adopt (A:55):** *"điểm sàn adopt = có trục sâu **bật-được** + có **escape width-only** (không khoá cứng), **KHÔNG bắt buộc default nào**"*. +- **Quy-trình (A:55):** *"Pull bằng quy trình thường (`/adap-apply`), tự báo nấc trong report-back định kỳ."* + +**(b) khuyến nghị (form, KHÔNG floor):** +- `A:28-31` — 2 bước THÊM **SAU** lượt propose + thử-phá, **"KHÔNG đụng lượt cũ"**: **Đào (Deepen)** k worker TƯƠI + **Thử-phá-2** + **Tổng-hợp depth-aware**. +- `A:29` — 3 lăng-kính đào gợi ý: **truy-bằng-chứng · mô-hình-đối · săn-ca-biên**. +- `A:34` — posture của chính hub: *"AI_INFRA chọn mặc-định TRẦN (sâu+rộng nhất) + dial-down theo chủ-đề + lệnh MAX khoá trần"*; *"Dự-án e-ngại cost → chọn opt-in-off"*. +- `A:35` — **"Tuyến-tính, KHÔNG nhiều-vòng"** (vòng 2-3 bão-hoà + trôi-đề + phá mất tính độc-lập). +- `A:47` — *"Số worker đào, tên 3 lăng-kính, cách nhắm điểm-nóng, có cấp quyền đọc-file cho worker đào hay chỉ-pack — mỗi dự-án tự quyết theo engine mình."* + +**(c) chỉ thông tin:** +- `A:22-24` — vấn-đề ensemble đơn-trục. +- `A:59` honest-status: engine hub **"đã SHIPPED + máy-verify"** + qua rà-soát độc-lập; **chứng-minh runtime + bảng-cost thực-đo "đang tiến-hành"** ⇒ *"PATTERN + code đã chín để bạn đọc/áp; số-cost-thực-đo sẽ ra ở bản `update` sau."* + +### [B] depth-cost-update — **KHÔNG floor** +- `B:20` — *"Không floor mới; FYI-số + bài học."* · `B:63` — *"FYI-số + bài-học — KHÔNG floor mới, không bắt làm gì."* +- **(b) khuyến nghị:** `B:63` *"Dự-án có ensemble: đối-chiếu bảng cost của mình theo kiểm-nhanh §4; 4 bài học §3 đáng soi lại pipeline nhiều-tầng của bạn."* + 3 bài học số `B:36-38` + 4 bài vá `B:52-55`. +- **(a) quy-trình:** `B:63` *"Pull `/adap-apply`, báo nấc thường-lệ."* +- **(c) thông tin:** bảng số `B:26-31`, provenance `B:33`, đấu tay-đôi n=1 `B:42-46`. + +### [C] cost-lens — **KHÔNG floor** +- `C:20` — *"Cả 3 khoản = chia-sẻ cách-làm, **KHÔNG floor mới**."* · `C:50` — *"FYI owner-side — KHÔNG floor, không bắt làm gì."* +- **(b) khuyến nghị:** + - ① `C:28` *"bảng cost của bạn nên có thêm cột **"đốt đơn-vị NÀO"** bên cạnh "bao nhiêu""*. + - ② `C:32-35` heuristic routing: *"**việc mới để chế-độ thật · fix cái cũ để model ảo**"* — `C:37` khai rõ *"Là heuristic khởi-điểm, **không phải luật**"*. + - ③ `C:44` pattern chốt-giữa: *"lệnh gõ đích-danh của owner = kênh cứng…; còn khi owner giao việc không chỉ-định chế-độ → lead đánh giá + **suggest đúng 1 dòng non-blocking** ("việc này ảo/thật làm tốt hơn — vì …") **rồi chạy luôn**"*. + - `C:50` — *"**Khoản ③ áp được cho MỌI nhà** (kể cả 1-chế-độ)"* ⇒ khoản dễ-áp nhất. +- **(c) thông tin:** `C:24-26` trục khan-hiếm; `C:42-43` 2 cực owner hub đã thử rồi RÚT. +- **(a) quy-trình:** `C:50` *"Pull `/adap-apply`, báo nấc thường-lệ."* + +--- + +## CÂU 2 — SỐ / NGƯỠNG / TÊN-KEY / TÊN-FILE phải wire (NGUYÊN VĂN) + +### Tên-key (chép nguyên văn) +| Token | Neo | Ghi chú | +|---|---|---| +| `DEEPEN-ON-CONTESTED` | `A:26` heading *"trục sâu "đào-vào-điểm-tranh-cãi" (DEEPEN-ON-CONTESTED)"* | tên cơ-chế | +| `Đào (Deepen)` · `Thử-phá-2` · `Tổng-hợp depth-aware` | `A:29`,`A:30`,`A:31` | 3 tên bước | +| `truy-bằng-chứng` · `mô-hình-đối` · `săn-ca-biên` | `A:29` | 3 lăng-kính đào — **tên tự quyết** (`A:47`) | +| prompt-floor: **"tầng-1 là VẬT-LIỆU không phải đáp-án; đồng-ý-lại = 0 điểm"** + **"lời thử-phá cũng là vật-liệu, kiểm cả nó"** | `A:36` (lặp rút gọn `A:42` *"đồng-ý-lại=0-điểm"*) | **chuỗi PHẢI bơm vào prompt worker tầng-2** | +| `attempted-failed` | `B:53` *"Mọi pipeline nhiều-tầng cần trạng-thái **attempted-failed** tường-minh"* | tên trạng-thái | +| `flip-cosmetic` | `B:54` *"**flip không đổi hành-động** (chỉ relabel, không đổi fix/verdict) = flip-cosmetic, không cho đè"* | tên anti-pattern | +| cột **"đốt đơn-vị NÀO"** | `C:28` | tên cột bảng cost | + +### Số / ngưỡng (nguyên văn) +| Số | Neo | Nguyên văn | +|---|---|---| +| **≤3** | `A:40` | *"clamp trần cứng (vd ≤3) + assert tổng-lượt ≤ trần"* — **"vd" = ví dụ, KHÔNG mandate** | +| **10 lượt** | `B:24` | *"Cấu-hình trần: 5-góc + thử-phá + 3-đào-tầng-2 + thử-phá-2 = **10 lượt**"* | +| **~1.14 triệu token** | `B:28` | *"Tổng (vào+ra) — con số burn thật … (+ lượt tổng-hợp ~129 nghìn — tính cả nó: ~11× một phát thật)"* | +| **467.5 nghìn** | `B:29` | *"Phía-ra … {đề-xuất 207.9 · thử-phá 65.7 · đào 145.1 · thử-phá-2 48.8 — cộng KHỚP CHÍNH XÁC}"* | +| **~114 nghìn/lượt** | `B:30` | *"(dải thật 76–143 nghìn — lượt-đào đắt hơn lượt-đề-xuất ~25%) — trung-bình đúng bằng 1 phát "chế-độ thật" cùng đề (114.1 nghìn)"* | +| **194 nghìn = 41.5%** | `B:31` | *"Lớp-đào chiếm … phía-ra = 41.5% run"* | +| **2.9× / 2.4×** | `B:36` + `B:10` | *"Ước-lượng cũ "~395 nghìn" gần đúng ở lens phía-ra (467.5) nhưng thấp **2.9×** so tổng vào+ra (1.14M)"* · frontmatter `B:10` *"hai số lệch nhau **2.4×**"* | +| **~50% + ×2** | `C:24` | *"model-hạng-nhất bị trần quota (~50%) và giá token gấp đôi (tiêu-thụ thực-tế đôi khi cũng gấp đôi)"* | +| **10×** | `C:26` | *"đốt 10× token hạng-hai cho việc-fix để DÀNH suất hạng-nhất cho việc xứng nó = đánh-đổi ĐÚNG"* | +| **1 dòng** | `C:44` | *"suggest đúng 1 dòng non-blocking"* | + +### TÊN-FILE phải wire +**KHÔNG CÓ.** 3 thư không chỉ-định file/đường-dẫn nào phải tạo/sửa trong repo sister. Chỉ token định-danh = 3 broadcast-id + 3 `content_sha256` (`A:12` `f05eba5b…` · `B:12` `294be326…` · `C:12` `0a03b2c8…`) dùng cho stamp/verify. **KHÔNG NEO ĐƯỢC** bất kỳ tên script/config nào hub yêu cầu. + +--- + +## CÂU 3 — MÂU THUẪN / SUPERSEDE floor SE đang chạy + +**Kết luận đầu:** **KHÔNG có khoản nào GIẾT floor SE.** A tự khai additive — `A:28` *"Thêm 2 bước **SAU** lượt propose + thử-phá (**KHÔNG đụng lượt cũ**)"*. 4 va-chạm dưới đây là **THIẾU (gap) + phải-THÊM**, không phải supersede. + +| # | Floor SE | Neo SE | Khoản hub | Phán | +|---|---|---|---|---| +| 1 | **H21 `/fable-clone` ensemble tier-2** = N lane đa-lăng-kính CÙNG 1 vai + em-main refute+synthesize | `fable-clone.md:15` · `harness-11-engine.md:343` | A `:28` | **SỐNG NGUYÊN** — hub chỉ nối thêm tầng-2. SE = **đúng ca "ensemble đơn-trục"** hub mô tả (`A:24`) | +| 2 | **worker-tier-pin S124** opus+`effort:max` 17/17 | `hmw.js:57-58` · `:76` | C `:32-35` routing thật/ảo | **SỐNG** — routing nói về **chế-độ lead** (thật=1 con hạng-nhất / ảo=ensemble), KHÔNG đụng pin worker. 0 mâu thuẫn | +| 3 | **GAP#6 lane ensemble mang `tier:'opus'`** | `fable-clone.md:47-57` · `hmw.js:70` | A `:29` (k worker đào) | **SỐNG + MỞ RỘNG** — nếu thêm lane tầng-2 thì lane đó cũng phải mang `tier:'opus'` (cùng luật, không luật mới) | +| 4 | **`hmw.js` parallel 1 sóng** | `hmw.js:175` | A `:35` *"thêm k+1 lượt tuyến-tính, KHÔNG ping-pong nhiều-vòng"* | **TƯƠNG-THÍCH nhưng ép cơ-học:** `parallel()` KHÔNG tuần-tự-hoá ⇒ tầng-2 = **hmw invocation THỨ HAI** (giống bài trio S141), không nhét chung 1 taskList | + +**3 GAP THẬT (SE thiếu, phải thêm nếu adopt):** + +- **G-a — 0 trục sâu.** `grep -rn "tầng-2|deepen|DEEPEN|đào-vào-điểm|chống-mỏ-neo|thử-phá-2" .claude/commands/ .claude/workflows/*.js docs/governance/` = **0 hit**. ⇒ falsifier `A:51` *"có bước nào cho con TƯƠI đào tiếp CHÍNH điểm đó không, hay kết-luận dừng ở tầng-1?"* → **SE = dừng ở tầng-1**. Escape width-only (`A:40`) thì SE **thoả sẵn vì trivially không có gì để tắt**. + - ⚠️ Nuance: SE **có** bước thử-phá nhưng do **em-main** làm (`fable-clone.md:15` "em-main refute + synthesize"), **không phải con TƯƠI** ⇒ đúng bệnh mỏ-neo `A:36` (người refute đã đọc trọn tầng-1). +- **G-b — 0 clamp trần cứng.** `hmw.js:114-117`: *"S4 — số task THOẢI MÁI: harness chạy theo slot, dư tự queue, **KHÔNG cap cứng (soft notice only)**"* — >16 chỉ `log()`. Floor `A:40` đòi **clamp cứng + assert tổng-lượt ≤ trần** ⇒ **FAIL nếu bật trục sâu**. (Cap cứng SE hiện có = `checkpointApproved` `hmw.js:111-113` — anti-accidental-fire, **KHÔNG phải** trần lượt.) +- **G-c — 0 cổng ngân-sách.** Không có budget-gate nào trong `hmw.js` (grep ngân-sách/budget = 0 trong file). Floor `A:43` "cận-ngân-sách LOUD" ⇒ **chưa có chỗ đáp**. + +**🔴 PHÁT HIỆN NẶNG NHẤT — SE ĐANG DÍNH ĐÚNG BÀI-HỌC-2 CỦA [B]:** +`hmw.js:223-225` +```js +// trả mảng kết quả (lọc null nếu agent lỗi/null — invalid-role đã STOP-HARD up-front; .filter(Boolean) chỉ lọc null-lane do agent lỗi runtime) +return results.filter(Boolean) +``` +Đối chiếu `B:53`: *"**"Thử-rồi-chết" ≠ "chạy-rồi-sạch"**. Tầng-2 spawn mà 0 worker sống, nếu không có trạng-thái riêng, tầng tổng-hợp sẽ viết "tầng-2 không thêm gì" = củng-cố verdict bằng một tầng-2 **không tồn tại**."* +Và falsifier `B:59`: *"nếu tầng nào đó của pipeline chết sạch giữa chừng, tầng sau nhìn thấy "chết" hay thấy "sạch"?"* +→ **SE trả lời: THẤY "SẠCH".** Lane chết runtime → `null` → bị `.filter(Boolean)` nuốt → em-main @P3 nhận mảng **ngắn hơn, KHÔNG có tín-hiệu "lane chết"**. Comment ngay tại `:223` tự khai đúng hành-vi đó. **Lỗ này TỒN TẠI HÔM NAY ở chiều-rộng, chưa cần trục sâu.** (Cùng lớp với luật đã có `hmw.js:124-125`: *"per-lane throw có thể bị nuốt thành null = STOP-SILENT, tệ hơn"* — SE đã vá cho **role sai** [validate up-front] nhưng **KHÔNG vá cho lane chết runtime**.) + +**GAP bảng cost (khoản ① của [C] + falsifier §4 của [B]):** +- Bảng cost DUY NHẤT của SE = `.claude/agents/README.md:249-257` (heading `:249`), **cột đơn-vị `:251`** ghi **"Effective tokens billed (after caching)"** — **KHÔNG phải** "tổng vào+ra" cũng **KHÔNG phải** "phía-ra" ⇒ là **đơn-vị THỨ BA**, không so trực tiếp được với số hub. +- Toàn bộ giá trị mang tiền-tố `~` (ước, không đo) + đóng băng ở thời **7 sub-agent** (`README.md:253` *"| 7 sub-agents spawn setup | ~1.1M (7 × ~155K cache WRITE) |"*; tổng `:256` *"~1.85M (~9× solo)"*) trong khi roster nay = **17** ⇒ **stale ~2.4× về số-vai**. +- ⇒ Falsifier `B:59` *"Hai số đó lệch bao nhiêu lần trên hệ bạn?"* → **SE: CHƯA ĐO ĐƯỢC** (đúng chẩn của hub: *"Không trả lời được = chưa đo, đang ước"*). +- `harness-11-engine.md:355` đã cite bản gốc *"ensemble không rẻ hơn nhiều về token thô"* ⇒ [B] `:37` **làm SẮC** câu đó thành *"Ensemble trả tiền theo **SỐ LƯỢT**, không rẻ per-lượt"* — **bổ-sung, không lật**. + +--- + +## CÂU 4 — Hub ĐÁ CÂU HỎI VỀ CHO SE TỰ QUYẾT (nguyên văn) + +**Đá quyết-định (SE phải chốt):** +1. `A:55` — *"**Posture default (trần+dial-down HAY opt-in-off) mỗi dự-án tự chọn** — điểm sàn adopt = có trục sâu **bật-được** + có **escape width-only** (không khoá cứng), KHÔNG bắt buộc default nào."* +2. `A:47` — *"Số worker đào, tên 3 lăng-kính, cách nhắm điểm-nóng, có cấp quyền đọc-file cho worker đào hay chỉ-pack — mỗi dự-án tự quyết theo engine mình."* +3. `A:34` — *"Dự-án e-ngại cost → chọn opt-in-off. Điểm sàn: phải CÓ escape về chiều-rộng, không khoá cứng."* +4. `C:28` — *"**Trần/giá cụ-thể mỗi nhà tự điền theo subscription của mình.**"* +5. `C:50` — *"**Owner mỗi nhà tự chốt form.**"* + +**Đá câu-hỏi-kiểm (falsifier — SE phải TRẢ LỜI BẰNG SỐ/ĐO):** +6. `A:51` — *"Ensemble của bạn: "khi 2 đề-xuất mâu-thuẫn hoặc con thử-phá phá được 1 điểm — có bước nào cho con TƯƠI đào tiếp CHÍNH điểm đó không, hay kết-luận dừng ở tầng-1?" Không có = còn hở trục sâu. Và: "nếu có bước đào — con đào bị chặn a-dua tầng-1 thế nào?" Không trả lời được = trục sâu thiếu chống-mỏ-neo (dễ thành lặp-lại tốn token)."* +7. `B:59` — *""bảng cost của bạn ghi đơn-vị nào — tổng vào+ra hay phía-ra? Hai số đó lệch bao nhiêu lần trên hệ bạn?" Không trả lời được = chưa đo, đang ước. Và: "nếu tầng nào đó của pipeline chết sạch giữa chừng, tầng sau nhìn thấy "chết" hay thấy "sạch"?" — thấy "sạch" = đang có lỗ bài-học-2."* + +**Đáp án ĐO ĐƯỢC của SE cho 4 câu hỏi trên (đã verify):** ① dừng ở tầng-1 (0 hit grep) · ② N/A + refute do em-main (đã đọc tầng-1) = không có chống-mỏ-neo · ③ đơn-vị thứ-ba "effective billed after caching", lệch = **chưa đo** · ④ **thấy "sạch"** (`hmw.js:225`). + +--- + +## CÂU 5 — Thư sau có sửa/đính-chính thư trước trong CÙNG cụm không? + +**Frontmatter:** cả 3 đều `supersedes: null` (`A:9` · `B:9` · `C:9`) ⇒ **KHÔNG có supersede hình-thức nào**. + +**Chuỗi quan-hệ THẬT (đọc từ chính body):** +1. **[A] → [B] = TRẢ NỢ, không sửa.** `A:59` hứa *"số-cost-thực-đo sẽ ra ở bản `update` sau"* → `B:20` *"Bản này là `type:update` **trả nợ số** cho bản trục-chiều-sâu phát sáng nay (đã khai "số-cost thực-đo sẽ ra ở bản update sau") — giữ đúng lời: đây là số đo, không phải ước."* ⇒ [B] **lấp chỗ trống [A] tự khai**, KHÔNG đụng cơ-chế/floor của [A]. +2. **[B] → [C] = REFINE CÁCH ĐỌC, số GIỮ NGUYÊN.** `C:20` (nguyên văn): *"Bản này là `type:update` NHỎ chồng **bản số-đo cùng ngày** (`2026-07-19-Agent-ensemble-depth-cost-update-so-do-thuc` · sha `294be326` — per-lượt ~114 nghìn, 10 lượt ≈ 10-11×) — **số KHÔNG đổi**; đổi là **lens đọc số** … Đây là **refine (không thay)** câu kết của bản số *"thật = mặc-định cho phán-quyết hệ-trọng"*: qua lens khan-hiếm, "thật" thành **suất-để-dành** → default thực-dụng đẩy việc-fix về ảo, suất thật dành cho việc xứng nó."* + - Câu bị refine nằm ở `B:46`: *"Gợi-ý dùng: thật = mặc-định cho phán-quyết hệ-trọng (mạnh nhất/token); ảo-trần = khi cần đào chéo…"*. + - ⇒ **[C] KHÔNG lật số, nhưng ĐỔI HƯỚNG khuyến-nghị thực-dụng**: [B] đọc "thật thắng hiệu-quả/token" (`B:44`) → [C] `C:24-26` đọc lại: token-thô không phải trục quyết-định, **đơn-vị khan-hiếm** mới là ⇒ **fix → ảo** (`C:32`). + +**AI THẮNG (per trục):** +| Trục | Thắng | Vì sao | +|---|---|---| +| **Cơ-chế / floor** | **[A]** | thư DUY NHẤT có function-floor (`A:38`); [B]`:20` + [C]`:20` tự khai KHÔNG floor | +| **Con số** | **[B]** | thư DUY NHẤT có số đo; [C]`:20` tự khai *"số KHÔNG đổi"* | +| **Cách ĐỌC số + routing thật/ảo** | **[C]** | mới nhất + tự khai *"delta-đọc chồng bản số-đo"* (`C:11`) + *"refine (không thay)"* (`C:20`) | + +**Đính-chính DUY NHẤT trong cụm** = nội-bộ [B]: `B:36` *"**Khai 2 đơn-vị hoặc sai 3×.** Ước-lượng cũ "~395 nghìn" gần đúng ở lens phía-ra (467.5) nhưng thấp **2.9×** so tổng vào+ra (1.14M)"* — nhưng con "~395 nghìn" đó **KHÔNG NẰM trong 3 file này** (ước cũ nội-bộ hub) ⇒ **KHÔNG NEO ĐƯỢC trong cụm-3**. + +**Bẫy tên-file:** `depth-cost-update-so-do-thuc` **nghe như** bản cập-nhật của `depth-axis` **nhưng KHÔNG PHẢI thay nó** — nó cập-nhật **phần số bị hoãn**, còn cơ-chế/floor của `depth-axis` **vẫn nguyên hiệu-lực**. Thư thật-sự "chồng lên" bản số là **[C]**, không phải [B]. + +--- + +## PHỤ — vật-chứng grep đã chạy (tái-lập được) +- `grep -rn "0a03b2c8\|f05eba5b\|294be326" --include="*.md" --include="*.json" .` (trừ 3 file inbox) → **0** +- `grep -rn "tầng-2\|deepen\|DEEPEN\|đào-vào-điểm\|chống-mỏ-neo\|thử-phá-2" .claude/commands/ .claude/workflows/*.js docs/governance/` → **0** +- `.claude/workflows/hmw.js` = 225 dòng · `resolveModel` `:69-77` · `parallel` `:175` · `filter(Boolean)` `:225` · soft-cap `:114-117` · checkpoint `:111-113` +- Bảng cost SE duy nhất: `.claude/agents/README.md:249-258` +- SE ensemble def: `.claude/commands/fable-clone.md:15` · `docs/governance/harness-11-engine.md:343` · honest-cost-note `:355` diff --git a/.claude/workflows/runs/2026-07-22-S144-adap-dot-11/sub-investigator-codebase-3.md b/.claude/workflows/runs/2026-07-22-S144-adap-dot-11/sub-investigator-codebase-3.md new file mode 100644 index 0000000..3f655f4 --- /dev/null +++ b/.claude/workflows/runs/2026-07-22-S144-adap-dot-11/sub-investigator-codebase-3.md @@ -0,0 +1,191 @@ +# sub-investigator-codebase-3 — LANE 4 "lens-owner-binding" + +> Run: `2026-07-22-S144-adap-dot-11` · vai: investigator-codebase · lăng-kính: **TRỤC RÀNG-BUỘC** (lệnh đã chốt / còn bàn / đá về SE) +> Nguồn: 10 file `broadcasts/inbox/2026-07-1[89]-*.md` + `2026-07-2[01]-*.md` (đọc TRỌN file chính 12.320 B + lướt 9 file) +> Ghi-đĩa-TRONG-lúc-làm (chống #53). Mọi claim neo `file:line`. **Phần CHÉP NGUYÊN VĂN tách khỏi phần DIỄN GIẢI.** + +--- + +## CÂU 1 🔴 — "Năm khoản" là NĂM KHOẢN NÀO + +File: `broadcasts/inbox/2026-07-19-Governance-goi-chot-owner-nam-khoan.md` · `content_sha256: c580c566…` (`:12`) · `type: update` `:7` · `to/targets: all-fit` `:4-5` · status `🟢 PUBLISHED s105` `:11` +Tự khai bản chất: *"mỗi khoản chồng lên một bản đã phát trước, khung cũ giữ nguyên — chỉ đọc phần delta"* (`:21`) · *"Mọi khoản đã land phía hub … trước khi phát; không khoản nào là lời hứa"* (`:21`). + +### Khoản 1 — `:23-30` +**Tiêu đề nguyên văn (`:23`):** `## 1. Mặc-định lead = Opus 4.8 (1M) MAX; model đắt nhất đi qua đúng HAI cửa owner-chủ-động` +Chồng bản `1b3aa909` (`:25`). +**Owner verbatim (`:27`):** *"nói chung fable tao muốn dùng là sẽ dùng theo command /fable-real ngoài ra thì Opus 4.8 MAX hết"* — làm rõ cùng đợt: owner tự chọn Fable ở ghế lead lúc mở phiên vẫn hợp-lệ, **0 caveat**. +**Quyết cuối (`:28`):** boot-default máy (settings) đổi về **Opus 4.8 (1M) MAX** cho ghế lead (trước là Fable). Fable đi qua đúng **hai cửa, cả hai owner-chủ-động**: ① owner CHỌN lead Fable lúc mở phiên · ② owner gõ lệnh gọi đích-danh một con Fable cho một vai cụ-thể. **"Lead và sub không bao giờ tự nâng lên Fable."** Owner đổi model giữa phiên = quyền owner. +**Giới hạn phạm vi (`:29`):** sister-floor KHÔNG ĐỔI (lead = frontier-class owner-choice, cấm lớp Sonnet/Haiku ở ghế lead); *"Hub thu default về Opus là **lựa-chọn của owner hub — không ép dự-án nào đổi default theo**."* +**Floor chuyển được (`:30`):** *"tier đắt nhất không nên là đường mặc-định — nó nên là cửa owner-gated đích-danh."* + +### Khoản 2 — `:32-38` +**Tiêu đề (`:32`):** `## 2. RETIRE resume-agent cho mục-đích "giữ context / chắc model" — đường chính là spawn mới + pack` +Chồng `7c0ec067` + `d68de5e7` (`:34`). +**Bệnh (`:36`):** resume/continue một agent đã spawn làm **rớt model-override** đặt lúc spawn — máy-chứng từ MỘT sister, **khai thật n=1, env-dependent**. +**Quyết cuối (`:37`) — ĐẢO một mặc-định cũ của hub:** mục-đích *"giữ context / chắc chắn đúng model"* → **dùng spawn MỚI với memory-pack đầy-đủ**; *"resume/continue chỉ còn hợp-lệ cho **hội-thoại tiếp-diễn trong cùng lượt làm việc**, không phải cơ-chế bảo-toàn model."* +**Floor (`:38`):** spawn mới + model-param tường-minh tại call-site; muốn giữ resume → **tự verify trên env mình trước**. + +### Khoản 3 — `:40-46` +**Tiêu đề (`:40`):** `## 3. Ràng-buộc thiết-kế NỀN: không cơ-chế nào được chặn hoặc làm đắt cửa dừng–nối–checkpoint` +Chồng khung-nhịp `3daf5ee4` (`:42`). +**Quyết cuối (`:44`):** van giữa-phiên **GIỮ TREO** (dữ-liệu hai phía {sister + hub} chưa đủ đặt ngưỡng) + owner verbatim *"cái này phải nhanh"* ⇒ *"**bất kỳ van/gate/phép-đo nào về sau cũng KHÔNG ĐƯỢC chặn hoặc làm chậm các cửa dừng–nối–checkpoint** (lệnh pause / lệnh nối-mạch / lệnh chốt-nhanh-không-dừng của bạn)."* +**Vị-thế (`:45`):** nâng heuristic *"điểm-dừng-phải-rẻ"* thành **ràng-buộc thiết-kế CỨNG**: *"mọi đề-xuất thêm việc vào đường điểm-dừng phải qua câu hỏi 'có làm điểm dừng đắt lên không' TRƯỚC khi bàn giá-trị của việc đó."* +**Floor (`:46`):** audit lệnh điểm-dừng; bước nặng (**spawn agent, đo đạc lớn, quét rộng**) nằm trong đường pause-tương-đương = **vi-phạm ranh** → dời về closeout/bookend. + +### Khoản 4 — `:48-55` +**Tiêu đề (`:48`):** `## 4. Cửa-duyệt lời-hứa-máy — thành luật sổ chuẩn (credit khuôn-câu: SE)` +`:50` — *"nâng khoản-3 của bản năm-quyết `123d8272` từ 'xử một ca' thành 'cửa chặn mọi ca mới'; khuôn-câu gốc từ thư SE `58e28bae`, hub CONFIRM"*. +**LUẬT nguyên văn (`:52`):** *"câu dạng **'máy sẽ chặn/quét/bắt X'** · **'detector đảm-nhiệm Y'** trong doc/rule/broadcast ⇒ BẮT BUỘC **existence-proof tại chỗ**: {máy tồn-tại (đường-dẫn) + lệnh chạy được + test/positive-control}. Thiếu bất kỳ mảnh nào → PHẢI viết dạng **dự-định** ('sẽ build — CHƯA có máy'). **Cấm viết dạng đang-có.**"* +**Honest (`:54`):** *"máy quét TỰ-ĐỘNG cho chính class lời-hứa-máy = **chưa có** (khai residual)"* — lưới hiện-hành = gate người + khuôn-câu bắt-buộc hai-dạng. +**Floor (`:55`):** khuôn-câu hai-dạng {đang-có (kèm proof tại chỗ) | dự-định (nói rõ chưa-có)}; reviewer hỏi một câu: *"mã nào làm việc đó?"* + +### Khoản 5 — `:57-61` +**Tiêu đề (`:57`):** `## 5. Ghi-chú pool: model đắt xuất hiện available trong env ≠ đổi pin` +**Quyết cuối (`:59`):** sau đợt spend-limit mở lại, Fable xuất hiện available trong pool sub phía hub → *"**available-in-pool ≠ mandate** — pin sub (Opus) giữ nguyên; nâng tier per-case vẫn owner-gated như cũ."* `:60`: *"env thay đổi không phải mệnh lệnh."* +**Floor (`:61`):** mọi thay-đổi pin/tier — kể cả khi env "mời" — đi qua owner; *"Agent ghi-nhận và báo, không tự adopt."* + +**PROJECT-FIT hub tự chấm (`:65-68`):** khoản 1/5 → n/a phần cấu-hình nếu 1-model; khoản 2 → chỉ áp nếu dùng resume kèm model-override; khoản 3 → áp cho mọi dự-án có lệnh điểm-dừng; **khoản 4 → áp cho MỌI dự-án** ("không cần hạ-tầng gì"). +**Phần KHÔNG-BIẾT hub tự khai (`:86-88`):** khoản 2 n=1 env sister · khoản 3 **chưa có máy** đo "điểm-dừng đắt lên" (kiểm tay) · khoản 4 mới codify, sẽ đính-chính nếu lộ kẽ lách. + +--- + +## CÂU 2 🔴 — BẢNG 12 MỤC TREO CỦA SE × 10 THƯ (không bỏ dòng nào) + +**Ký hiệu:** `[10]` = trong tập 10 thư lane này · `[ngoài-10]` = thư đã kéo trước, nằm `broadcasts/inbox/ai_infra/`. +**Kết quả tổng: 0/12 mục có đáp án TRỰC TIẾP trong 10 thư.** 3 mục có **nguyên-tắc phủ** (hợp-thức-hoá việc để trống), 3 mục có đáp án ở `58e28bae` `[ngoài-10]`, 5 mục = product/owner-scope hub không đụng, 1 mục ratify vẫn nợ. + +| # | Mục treo SE | Có đáp án trong 10 thư? | Đáp án / neo | +|---|---|---|---| +| 1 | trio first-run | ❌ CHƯA (0 hit `[10]`) | CÁCH chạy đã có: `harness-dong-du-vong:46` *"Tuần-tự trong-vòng, song-song giữa-vòng: audit chờ đúng con đo vòng mình xong (chống chấm bản stale)"*. Nhịp gốc `[ngoài-10]` `58e28bae:33` *"chạy **ĐỦ CẢ HAI ĐẦU mỗi phiên-LOGIC** … **TUẦN TỰ** ĐO → ĐỀ-XUẤT → KIỂM, KHÔNG bắn song song"*. Việc CHẠY lần đầu = blocker owner (restart CLI + gật) — `HANDOFF:8` NEXT#1. | +| 2 | ngưỡng `pull_warn_days` (cố ý trống) | ❌ số CHƯA — nhưng ✅ **NGUYÊN-TẮC phủ** | grep `pull_warn_days` = **0 hit / 10 thư**. Phủ bởi `2026-07-20-auto:19` *"**núm-số ngân sách vẫn thuộc chủ dự án** (nâng trần, đặt target — máy chỉ BÁO khi chạm, không tự nâng)"* + `2026-07-21-eval:24` *"chủ-dự-án-quyết-SỐ (ngưỡng, target)… **AI không tự quyết hai cột sau**"*. ⇒ SE để trống = **ĐÚNG luật hub**, không phải nợ. | +| 3 | tools-whitelist KHÔNG chặn ghi runtime (§3(b) chờ hub) | ❌ CHƯA `[10]` (0 hit) · ✅ có stance `[ngoài-10]` | `58e28bae:42` nguyên văn: *"(i) 'read-only' ở đây = **chặn-bằng-thiếu-tool** cho kênh ghi-file/RAG; **Bash vẫn là kênh ghi mở về lý thuyết** — lưới thật là **lead soát `git status` sau mỗi lượt** (hub vừa bắt sống một ca sub tự ghi nhật-ký qua Bash ngay hôm nay — **content đúng nhưng vẫn xử lý là vi phạm biên**…)"*. ⚠️ Xác nhận cho §3(b) **KHÔNG THỂ** nằm trong 10 thư: mọi thư ≤ 2026-07-21, SE báo 07-22. | +| 4 | UAT lũy-kế S134 | ❌ n/a — ngoài scope hub | grep `UAT\|lũy kế\|phiếu\|migration` trên 10 file = **0 hit**. Product-scope → chờ **owner**, không phải chờ hub. | +| 5 | UAT freeze-NS S133 | ❌ n/a — ngoài scope hub | như trên, 0 hit. | +| 6 | D1 nháp-không-cộng-tiền | ❌ n/a — ngoài scope hub | như trên, 0 hit. | +| 7 | hook-vs-budget-cap | ❌ số CHƯA — ✅ **hình-dạng có** | `2026-07-20-auto:17` *"Khi phép đo vượt ngưỡng đã khai trong config, bước xử lý chạy NGAY trong lần đóng phiên đó — **không ghi sổ nợ để dồn**"* + `:19` ranh: *"Automation xử **nợ-vệ-sinh** (mảnh lưu trữ chưa nén, số đo instrument cũ, **sổ vượt trần dung lượng**), **không xử núm-quyết-định**"*. ⇒ máy ĐƯỢC tự nén/archive khi vượt; TRẦN vẫn của owner. | +| 8 | session-model duyệt bảng VC-1/2/3 | ❌ CHƯA (0 hit "VC" `[10]`) | 10 thư không nhắc session-model ngoài 1 datapoint `hub-tu-danh-gia:46-48` (owner hub 1 phiên-logic xuyên 3 cửa-sổ 1M; **khai rõ "testimonial, chưa phải phép đo máy"**, 2 phiên dogfood 10/10). Bảng VC = artifact SE, chờ owner. | +| 9 | close-sweep 7-carry | ❌ CHƯA (0 hit) | không thư nào chạm. | +| 10 | ratify ranh `refine ⟂ lead-omission` (Đà WIRE trước ratify) | ❌ CHƯA ratify | 0 hit `[10]`. Ranh TRỤC bộ-ba `[ngoài-10]` `58e28bae:35`: *"hub `lead-stale`/`lead-gap` ≡ SE `lead-view`/`lead-omission` — **chức năng trùng, tên = form tự quyết, KHÔNG cần rename**"*. **Verify đĩa SE:** `.claude/agents/harness-refine.md:22` heading `## 🔴 RANH SẮC — refine ⟂ lead-omission-auditor (đọc kỹ, dễ lẫn)` → bảng 3 trục `:24-28` → `:30` *"LEAD session hot-feed/carry/work-state underfill = **việc của `lead-omission-auditor`** → **NHƯỜNG**"*. ⇒ claim "đã wire :22-30" **CHÍNH XÁC**; ratify vẫn nợ owner. | +| 11 | 5 câu session-model | ❌ CHƯA `[10]` · 1/5 có đáp án `[ngoài-10]` | `session_ctx_kb`: `2026-07-17-…-manifest:69` *"function-floor là: **có một trần, hoặc chấp nhận mặc-định**"* + `:73-74` *"`session_ctx_kb: 64` # đơn vị KB (đọc code nhân 1024) … **Vắng khoá → code lấy default 64KB.** Đừng đọc đơn-vị thứ ba"*. ⇒ 64 = **default của code, KHÔNG phải số hub ép**; để trống = hợp lệ. 4 câu còn lại (map N↔L + folder-form · VC từng dòng · hook 3→4-path · prereq unblock) = **0 hit** mọi thư. | +| 12 | consent-form trio dài hạn | ❌ hub **Đà ĐÁ VỀ SE**, 10 thư không nhắc lại | `58e28bae:33` nguyên văn: *"**Consent:** chạy trong nghi-thức mở/đóng phiên = đã nằm trong consent chuẩn của nghi-thức; **nhóm có luật cứng no-auto-run riêng thì giữ nguyên hình thức consent của nhóm** — floor chỉ đòi '2 đầu mỗi phiên chạy đủ'."* ⇒ câu hỏi còn nguyên cho owner SE; **hub sẽ không trả thêm**. | + +--- + +## CÂU 3 — BINDING vs KHUYẾN NGHỊ vs GHI NHẬN (dấu hiệu văn bản) + +### Dấu hiệu BINDING (floor) +- `"Khung sàn (function-floor — 4 khoản **bắt buộc**)"` — `2026-07-18-spawn-label:22` +- `"## 3. Khung sàn (function-floor — 4 khoản)"` — `depth-axis:38` · `harness-dong-du-vong:42` +- `"**Luật:**"` + `"BẮT BUỘC existence-proof"` + `"**Cấm viết dạng đang-có.**"` — `goi-chot:52` +- `"nâng từ heuristic thành **ràng-buộc thiết-kế cứng**"` — `goi-chot:45` +- `"**Floor chuyển được:**"` (×4: `goi-chot:38,:46,:55,:61`) / `"**Nguyên-tắc chuyển được:**"` (`:30`) +- frontmatter `to: all-fit` + `targets: all-fit` + `status: PUBLISHED` + +### Dấu hiệu KHUYẾN NGHỊ (function giữ, form tự quyết) +- `"## 2. Hình-thức tự quyết (mỗi dự-án)"` — `spawn-label:29` · `depth-axis:45` · `harness-dong-du-vong:49` +- `"**FYI + khung tự-áp** — không bắt adopt; function giữ, form mỗi project tự quyết"` — `2026-07-20-3-khoan:15`; `"Không bắt buộc gì. Ba việc tùy chọn"` `:59` +- `"**Posture default … mỗi dự-án tự chọn** … **KHÔNG bắt buộc default nào**"` — `depth-axis:55` +- `"Khung = sàn chức năng; hình thức tổ chức = mỗi nhà tự quyết"` — `2026-07-21-eval:13` + +### Dấu hiệu CHỈ GHI NHẬN (FYI, no-floor) +- `"Cả 3 = owner-side chia-sẻ, **KHÔNG floor**"` — `cost-lens:10` (frontmatter `re:`), lặp `:20`, `:50` +- `"**FYI-số + bài-học — KHÔNG floor mới, không bắt làm gì**"` — `depth-cost:63` +- `"FYI, **KHÔNG floor**"` — `hub-tu-danh-gia:10`, `:20`; `"điểm số và findings là của hub, **không áp**"` `:62` +- `type: update` + `supersedes_scope: "DELTA … các khoản cũ giữ nguyên, sister **re-verify PHẦN ĐỔI**"` — `2026-07-20-auto:5` ⇒ thu hẹp phạm vi phải làm + +### Phân loại 10 thư (10/10, không bỏ) +| Hạng | Thư | Neo | +|---|---|---| +| **BINDING-floor** | `2026-07-18-spawn-label` (4 khoản bắt buộc) | `:22-27` | +| **BINDING-floor** | `2026-07-19-depth-axis` (4 khoản sàn) | `:38-43` | +| **BINDING-floor** | `2026-07-19-harness-dong-du-vong` (4 khoản sàn) | `:42-47` | +| **BINDING-mixed** | `2026-07-19-goi-chot-nam-khoan` — khoản 3 (ràng-buộc cứng) + khoản 4 (Luật/Cấm) = **binding**; khoản 1/2/5 = **quyết-định NỘI-BỘ hub** + "floor chuyển được" (khuyến nghị mạnh) | `:44-45`, `:52` vs `:29`, `:37`, `:59` | +| **KHUYẾN NGHỊ** | `2026-07-20-3-khoan` | `:15`, `:59-63` | +| **KHUYẾN NGHỊ** | `2026-07-20-auto-toan-vong` ("Sister cần làm gì" 3 gạch) | `:43-47` | +| **KHUYẾN NGHỊ** | `2026-07-21-eval-quality` (khung 4 câu = sàn chức năng; 3 phép thử) | `:13`, `:49-53` | +| **GHI NHẬN** | `2026-07-19-cost-lens` | `:50` | +| **GHI NHẬN** | `2026-07-19-depth-cost` | `:63` | +| **GHI NHẬN** | `2026-07-19-hub-tu-danh-gia` | `:62` | + +**Diễn giải (tách khỏi trích):** phần THỰC SỰ ràng buộc SE trong đợt này = **4 khoản label-spawn + 4 khoản audit-mọi-vòng/eval-2-phía + khoản 3 & 4 của gói-chốt** (+ 4 khoản depth-axis nếu SE nhận mình có ensemble). Phần còn lại = tự chọn/tham khảo. + +--- + +## CÂU 4 — Hub có nói "đây là config của các em, đừng chép số của hub" không? + +**CÓ — 6 chỗ, chép nguyên văn:** +1. `2026-07-21-eval-quality:55` — *"các con số trong bản này là số hub tự đo trên chính mình (một dự án, một giai đoạn); chị em áp KHUNG và tự đo số của mình, **đừng chép số hub làm chuẩn**."* ← khớp gần nhất câu SE từng bị dặn. +2. `goi-chot:29` — *"Hub thu default về Opus là **lựa-chọn của owner hub — không ép dự-án nào đổi default theo**."* +3. `cost-lens:28` — *"**Trần/giá cụ-thể mỗi nhà tự điền theo subscription của mình.**"* +4. `2026-07-20-auto:27` — *"Ngưỡng sống trong file config một-nguồn, **tài liệu chỉ trỏ key, không chép số**."* (= B1 derived-trỏ-canonical, cùng họ) +5. `hub-tu-danh-gia:62` — *"**điểm số và findings là của hub, không áp**."* +6. `depth-cost:38` — *"**Cost scale theo kích-thước đề** — số trên là 1 class-task (code-audit có nguồn); đề to hơn = đắt hơn tuyến-tính theo pack."* + +**Bổ trợ (cùng trục, quyền-SỐ thuộc owner):** `2026-07-20-auto:19` *"núm-số ngân sách vẫn thuộc chủ dự án"* · `2026-07-21:24` *"{AI-tự-sửa · **chủ-dự-án-quyết-SỐ** (ngưỡng, target) · **chủ-dự-án-quyết-LUẬT**} — AI không tự quyết hai cột sau"* · `depth-axis:55` *"KHÔNG bắt buộc default nào"*. + +**Diễn giải:** mục treo #2 (`pull_warn_days`) và #11-phần (`session_ctx_kb`) **không phải nợ SE** — hub nói ≥3 lần rằng số là của owner. Việc SE từ chối tự đặt số = **tuân thủ**, nên báo nấc dạng "n/a-owner-gated", không phải "pending". + +--- + +## CÂU 5 — Deadline / thứ tự bắt buộc / điều kiện tiên quyết + +**DEADLINE lịch: 0.** grep `deadline|hạn chót|trước ngày|hạn nộp` trên 10 file = **0 hit**. +**Mốc áp duy nhất:** `spawn-label:51` *"áp từ **phiên kế**"*; `:43` khai thật hub *"áp khuôn từ giữa phiên phát hành … loại việc-thường và workflow-task áp từ **spawn kế tiếp**"*. + +**THỨ TỰ BẮT BUỘC (5):** +- (a) `harness-dong-du-vong:46` — *"**Tuần-tự trong-vòng, song-song giữa-vòng**: audit chờ đúng con đo vòng mình xong (chống chấm bản stale)"* [≡ `58e28bae:33`]. +- (b) `goi-chot:45` — câu hỏi *"có làm điểm dừng đắt lên không"* phải hỏi **TRƯỚC** khi bàn giá-trị của việc. +- (c) `goi-chot:52` — existence-proof **tại chỗ** trước khi được phép viết dạng đang-có. +- (d) `2026-07-20-3-khoan:25` — *"sau khi sửa body doc NÀO trong một lượt sweep → **đọc lại dòng-1 + masthead của chính doc đó trước khi tuyên sweep xong**"*. +- (e) `depth-axis:28-31` — đào tầng-2 chỉ SAU {propose + thử-phá}; thử-phá-2 sau đào; tổng-hợp depth-aware cuối. + +**ĐIỀU KIỆN TIÊN QUYẾT (4):** +- (f) `depth-axis:43` — *"**Cận-ngân-sách LOUD**: vượt ngân-sách trước bước đào → BỎ đào + báo RÕ (không văng lỗi, không lặng-thầm bỏ), trả kết-quả chiều-rộng."* +- (g) `depth-cost:54` — *"**Phát-hiện chưa-qua-kiểm không được quyền đè.** Lớp thử-phá-2 chết → mọi 'lật vòng-1' của tầng-2 phải **TREO chờ người**, không auto-override."* +- (h) `depth-cost:55` — *"Con thử-phá tầng-2 phải **THẤY** vòng-1"* (nếu không = mandate bất-khả-thi về cấu-trúc). +- (i) `depth-axis:40` — escape bắt buộc tồn tại: *"**tắt-trục-sâu = escape về chiều-rộng LUÔN còn** (không khoá cứng); clamp trần cứng (vd ≤3)"*. + +**ZERO-DEBT (ràng buộc nhịp):** `2026-07-20-auto:17` — xử lý chạy **NGAY trong lần đóng phiên**, *"không ghi sổ nợ để dồn"*. +**Ràng buộc CHÉO đè mọi khoản khác:** `goi-chot:44-46` (khoản 3) — mọi cơ-chế mới không được làm đắt đường dừng–nối–checkpoint. **SE-relevant:** trio đặt ở bookend (`58e28bae:33`) = ĐÚNG chỗ; nếu ai đề xuất chạy trio/đo-nặng trong `/pause` ⇒ **vi phạm khoản 3**. Self-check hub kèm: `goi-chot:74` *"Lệnh điểm-dừng của bạn có bước nặng nào không? **Đo wall-clock một lần** — điểm dừng phải rẻ."* + +--- + +## CÂU 6 — Hub yêu cầu SE BÁO LẠI gì? + +**6/10 thư có mục "Nấc adopt" đòi pull + báo nấc — chép nguyên văn:** +| Thư | Yêu cầu | +|---|---| +| `spawn-label:51` | *"Pull bản này bằng quy trình thường (`/adap-apply`), áp từ phiên kế, **tự báo nấc per-khoản (sent→ACK→agreed→executed→verified)** trong report-back định kỳ."* | +| `depth-axis:55` | *"Pull bằng quy trình thường (`/adap-apply`), tự báo nấc trong report-back định kỳ."* | +| `cost-lens:50` | *"Pull `/adap-apply`, báo nấc thường-lệ."* | +| `depth-cost:63` | *"Pull `/adap-apply`, báo nấc thường-lệ."* | +| `harness-dong-du-vong:59` | *"Pull … tự báo nấc per-khoản … **Khoản ① có thể adopt dần từng vòng — báo nấc theo vòng.**"* | +| `hub-tu-danh-gia:62` | *"Pull `/adap-apply`, báo nấc thường-lệ."* | + +**4/10 thư KHÔNG đòi báo nấc:** +- 🔴 `goi-chot-nam-khoan` (**thư binding nhất**) — **KHÔNG có mục "Nấc adopt", 0 câu `/adap-apply`**. Chỉ có §7 SELF-CHECK 4 ô tự kiểm (`:72-75`) + §8 DELTA re-verify (`:79-82`) + footer *"kênh-hỏi = email về AI_INFRA"* (`:91`). +- `2026-07-20-3-khoan:59-64` — *"Không bắt buộc gì. Ba việc tùy chọn… **Câu hỏi gửi về hub qua kênh email broadcasts như thường lệ.**"* +- `2026-07-20-auto:43-47` — "Sister cần làm gì" = 3 **việc**, không phải báo cáo. +- `2026-07-21-eval:49-53` — chỉ "Ba phép thử nhanh (tự kiểm sau khi áp)". + +**ERRATA:** không thư nào đòi SE gửi errata. Chiều ngược lại hub tự hứa: `goi-chot:88` *"hub sẽ đính-chính nếu khuôn-câu hai-dạng lộ kẽ lách"*. +**RE-VERIFY phạm vi hẹp (bắt buộc đọc lại, không phải báo):** `goi-chot:79-82` — chỉ re-read delta của 4 bản nền `1b3aa909` · `7c0ec067`+`d68de5e7` · `3daf5ee4` · `123d8272`; `2026-07-20-auto:5` *"sister **re-verify PHẦN ĐỔI**"*. + +--- + +## SURPRISES (ngoài câu hỏi chính) + +1. 🔴 **Thư binding nhất lại KHÔNG đòi báo nấc** (`goi-chot` 0 câu `/adap-apply`) trong khi 6 thư FYI/khuyến-nghị đều đòi. Nếu SE báo nấc cho nó = tốt nhưng **không có mandate văn bản**; nếu bỏ cũng không sai văn bản. Bất-đối-xứng này dễ khiến bảng nấc của SE lệch. +2. ⚠️ **Cite-lệch nhẹ về `58e28bae`:** `goi-chot:50` gọi nó là *"thư SE `58e28bae`"*, nhưng file trên đĩa SE mang đúng sha đó là `broadcasts/inbox/ai_infra/2026-07-18-ai_infra-to-se-reply-tong-bo-ba-harness-sub-4-khoan.md` (`:9` `content_sha256: 58e28bae…`) — frontmatter `from: ai_infra` `to: se`. Tức sha trỏ **thư HUB TRẢ SE** (nội dung khuôn-câu gốc do SE đề xuất, hub CONFIRM ở `§(C)④a:49`). SE tra sha sẽ ra thư hub, dễ tưởng hub nhầm. +3. **Khoản 2 (RETIRE resume) đụng recipe #53 của SE nhưng KHÔNG cấm nó:** `goi-chot:37` retire resume **chỉ cho mục-đích giữ-model/giữ-context**; *"hội-thoại tiếp-diễn trong cùng lượt làm việc"* vẫn hợp-lệ ⇒ path-2 `SendMessage-resume in-session` để vớt verdict garble **KHÔNG bị retire**. Chỉ bị nếu SE resume để "giữ model Fable". Cần khai rõ khi báo nấc, tránh over-apply rồi bỏ mất lưới #53. +4. **5/12 mục treo (4,5,6 + phần 8,9) sẽ KHÔNG BAO GIỜ có đáp án từ hub** — 0 hit product trên cả 10 thư. Gộp chúng chung một bảng "đang treo chờ" tạo kỳ vọng sai (chờ owner ≠ chờ hub); nên tách 2 cột chủ-thể. +5. **SE đang ĐI TRƯỚC hub ở đúng một khoản:** `2026-07-21-eval:31` — *"Bộ kiểm-tra-đặc-tả của hub có **17/18 check không có positive-control**"*; SE đã có fault-inject 2-chiều nhiều đợt (13/13 S138, 7 ca S143 theo `HANDOFF:5`). Đây là chất liệu báo nấc bằng SỐ thay vì "đã đọc". +6. **Khoản 3 gói-chốt là ràng buộc CỨNG đè carry #7 (hook-vs-budget-cap) + #1 (trio):** bất kỳ hardening nào SE định thêm vào đường `/pause`–`/tiep` (kể cả hook chặn sub-write, `HANDOFF:8` NEXT#3) phải qua câu hỏi "có làm điểm dừng đắt lên không" **trước** khi bàn giá trị. +7. **`2026-07-21-eval:22` cho SE một cây gậy phân loại rất hợp lúc:** *"**dormant-đúng-thiết-kế** (rẻ, chưa có ca nhưng CÓ ca lịch sử nó SẼ bắt — như máy báo khói) khác **thừa-thật** (cấu trúc không thể kêu)"* — dùng được ngay cho close-sweep 7-carry (#9) và cho detector INFORM-only của SE. + +--- + +## GHI CHÚ BIÊN (transparency cho lead git-diff audit) + +File này ghi bằng **Write tool** (KHÔNG Bash-write, KHÔNG mojibake), đúng và chỉ đúng path được PIN trong ISOLATION. 0 file khác bị đụng. Đây đồng thời là **datapoint sống cho mục treo #3**: vai `investigator-codebase` khai read-only nhưng runtime **CÓ** Write/Edit — khớp `58e28bae:42` *"chặn bằng thiếu-tool, không chỉ bằng lời dặn"*. diff --git a/.claude/workflows/runs/2026-07-22-S144-adap-dot-11/sub-reviewer-0.md b/.claude/workflows/runs/2026-07-22-S144-adap-dot-11/sub-reviewer-0.md new file mode 100644 index 0000000..b1d23f6 --- /dev/null +++ b/.claude/workflows/runs/2026-07-22-S144-adap-dot-11/sub-reviewer-0.md @@ -0,0 +1,139 @@ +# sub-reviewer-0 — R1 `anchor-verify` (S144 adap đợt-11) + +> **Run:** `2026-07-22-S144-adap-dot-11` · **Vai:** reviewer (adversarial) · **Câu hỏi:** nền SỰ KIỆN của spec có đứng vững không? +> **Target:** `.claude/workflows/runs/2026-07-22-S144-adap-dot-11/spec-adap-dot-11-22-07-2026.md` (17.559 B) +> **Phạm vi:** 60 neo tự mở file kiểm (16 neo mã/repo SE + 44 neo trích-dẫn 10 broadcast). Không neo nào được chấm mà chưa mở file. + +## VERDICT — `PASS_WITH_FIXES` + +**Nền sự-kiện ĐỨNG VỮNG.** 55/60 neo KHỚP nguyên văn · 3 neo KHỚP-nội-dung nhưng **lệch số dòng** · 2 neo **LỆCH thật** (1 neo trỏ nhầm file, 1 neo cắt nửa dòng làm rơi một khoản "áp cho MỌI nhà"). **0 neo KHÔNG TÌM THẤY.** + +Không có trích dẫn nào sai chữ tới mức đổi nghĩa. Các suy-luận nặng của spec (P2-1 FAIL clamp · P2-2 đơn-vị-thứ-ba · P3-3 gap CLAUDE.md · P4-2 outbox/all · P4-3 lệch sổ garble) đều **tự đứng được bằng bằng chứng độc lập tao đo lại**. + +| Trục | Số | +|---|---| +| Neo chấm | **60** | +| KHỚP | **55** | +| KHỚP nhưng lệch số dòng | **3** (B10 · B14 · B40) | +| LỆCH | **2** (A11 · B43) | +| KHÔNG TÌM THẤY | **0** | +| MAJOR | **4** · MINOR **5** · nit **2** | + +--- + +## MAJOR (phải xử trước khi worker thực-thi) + +### M1 — `settings.json:11` trỏ NHẦM FILE (P4-1) +- Spec `:129`: *"`settings.json:11` pin Opus từ 07-20"*. +- Trong repo: `.claude/settings.json` **330 B, 15 dòng, 0 hit** `opus|model|fable`; `git log -1` = **`23bbe97` 2026-07-15**. Dòng 11 = `]`. +- Sự thật nằm ở file **NGOÀI repo**: `/c/Users/pqhuy/.claude/settings.json:11: "model": "claude-opus-4-8[1m]"` — mtime **2026-07-20 13:38** ⇒ **nội dung + số dòng + ngày đều đúng, chỉ SAI ĐƯỜNG DẪN**. +- Vì sao MAJOR: worker/reviewer nào grep trong repo sẽ ra 0 hit và kết luận claim bịa; file global **không nằm trong git** ⇒ claim không tái-lập được bằng CI. Sửa: ghi rõ `~/.claude/settings.json:11` (global, untracked) mỗi lần nhắc. +- Phần còn lại của P4-1 **KHỚP**: `docs/STATUS.md:450` (ô canonical §Sub-agents, CURRENT STATE) vẫn ghi *"em main **Fable 5** (1M) Max"*; `session-start.md:43` outage-recipe bảo fallback sang `claude-opus-4-8[1m]` = đúng thứ đang pin ⇒ **no-op có thật**. Đã có tiền-lệ ghi ở `STATUS.md:462` ("Còn CHỜ ANH") ⇒ xếp O-5 là đúng thẩm quyền. + +### M2 — `cost-lens:50` bị cắt nửa dòng, rơi khoản ③ "áp cho MỌI nhà" +- Spec `:21` xếp `cost-lens` = **GHI NHẬN**, neo `:50`. +- `:50` nửa đầu đúng: *"FYI owner-side — KHÔNG floor, không bắt làm gì."* **Nửa sau cùng dòng đó**: *"**Khoản ③ áp được cho MỌI nhà** (kể cả 1-chế-độ): pattern suggest-1-dòng-non-blocking dùng cho bất-kỳ lựa-chọn vận-hành nào lead làm thay owner được nhưng owner muốn giữ mắt nhìn."* +- Spec chỉ mang `cost-lens:28` (cột "đốt đơn-vị NÀO") vào P2-2; **khoản ③ không vào bất kỳ mục P nào**. Hướng lệch = **under-claim** ⇒ rủi ro bỏ sót thứ hub nói rõ là dùng được cho mọi nhà. + +### M3 — C11 giẫm lên knob đã đánh dấu OWNER (P3-2) +- Chẩn đoán của spec **ĐÚNG**: `session-start.md:135` dùng `today − last_sleep_at ≥ 7 ngày`; và mark `RC-pqhuy1987-20-06-2026-10-29-11` (`.claude/governance/ACTIVE-MARKS.md:17`, **🔖 Active-High, anh-confirm S79**) đúng là tuyên *"time/age/recency-decay = false-proxy"* ⇒ SE tự mâu thuẫn với chính mark mình. +- **Nhưng** chính dòng `:135` khai: *"🔴 **KHÔNG bịa số** (giữ INFORM 7-ngày — **DP-5 quyền owner cục-bộ** B1 §3.4)"*. +- C13-checklist `C11` giao **em-main**, acceptance `grep 'ngày|7 day' trong trigger = 0` ⇒ AI **gỡ knob owner đã chốt**. Theo `eval:24`, "bỏ check / đổi cơ chế / thêm gate" = **chủ-dự-án-quyết-LUẬT**; O-1 của spec chỉ phủ **CON SỐ**, không phủ **đổi cơ chế**. +- Sửa: tách C11 thành (a) đo + đề-xuất (AI) và (b) flip cơ-chế → thêm **O-6 owner-quyết-LUẬT**. + +### M4 — Nhãn "đo được" không có đường phản-chứng (P0-2) +- Spec `:57`: *"**Nguyên nhân đo được**: … lane sống dùng 21/23 tool-use, lane chết dùng 28/34/35"*. +- `grep "21/23\|28/34/35\|tool-use" run.md sub-investigator-codebase-*.md` trong run-folder = **0 hit**. Không có artifact trên đĩa để ai đó làm con số này TRƯỢT nếu nó sai. +- Load-bearing thật: chính con số này dùng để **bác** phương án thay thế ("Fix KHÔNG phải nâng `maxTurns`"). `maxTurns: 20` thì tao xác nhận (`investigator-codebase.md:14`); phần tool-use thì không. +- Sửa (rẻ, 1 dòng): khai nguồn = khối `` của harness trong phiên, **không lưu đĩa** — hoặc bỏ nhãn "đo được", giữ nhãn quan-sát. + +--- + +## MINOR + +- **m1 — B10:** prompt-floor *"tầng-1 là VẬT-LIỆU không phải đáp-án; đồng-ý-lại = 0 điểm"* nằm ở `depth-axis:36`; spec cite `:38-43` (trong khoảng đó `:42` chỉ có bản nén *"đồng-ý-lại=0-điểm"*). Chữ đúng, dòng lệch. +- **m2 — B14:** *"áp cho MỌI dự-án"* nằm ở `goi-chot:68` (§6 PROJECT-FIT), spec đặt cạnh `goi-chot:52`. +- **m3 — B40:** `depth-cost:59` được để trong ngoặc kép nhưng là **paraphrase rút gọn**. Nguyên văn: *"nếu tầng nào đó của pipeline chết sạch giữa chừng, tầng sau nhìn thấy 'chết' hay thấy 'sạch'?"* — spec: *"tầng chết thì tầng sau thấy 'chết' hay 'sạch'?"*. Nghĩa giữ, chữ không khớp 100%. +- **m4 — P1-3 neo hụt:** 3 nhãn `APPLIED`/`DORMANT`/chờ-judge (`:37`), literal *"% = FLOOR theo evidence, không phải ceiling"* (`:38`) và negative-control (`:39`) đều là **nguyên văn hub** ở `harness-dong-du-vong:37-39`; spec chỉ cite `:47`. Nên cite `:37-39` — vì C5 acceptance đòi đúng literal đó, cite hụt làm nó trông như chữ SE tự đặt. +- **m5 — P4-3 phân loại trước khi cộng:** "phiên này +2 ⇒ ×27". 3 lane chết lượt-1 là **cháy maxTurns**, KHÁC class #53 (wrong-slice-of-transcript). Sổ đĩa (`feedback_agent_return_garble_recover.md:13`) tự có bài học (c) *"cập-nhật tally ở CUỐI phiên"* — spec đã theo; chỉ cần thêm bước phân-class. + +## nit + +- **n1 —** `auto:45` (nằm trong chính khoảng `:43-47` spec cite) ghi *"form tự quyết, **chức năng là sàn**"* ⇒ xếp `auto-toan-vong` thuần KHUYẾN NGHỊ hơi nhẹ hơn chữ "sàn". Hướng lệch = under-claim. +- **n2 —** Header spec khai *"10/10 `stamp_verify.py` exit 0"*. Script **có thật** (`scripts/stamp_verify.py`, 2.378 B, 20-07) nhưng tao **KHÔNG chạy lại** ⇒ chưa xác nhận độc lập, không tính là lỗi. + +--- + +## Neo ĐỨNG VỮNG đáng ghi (chống hạ-bar — mấy claim này chịu được soi) + +| Claim spec | Bằng chứng độc lập tao đo | +|---|---| +| P2-1 "SE FAIL clamp trần cứng" | `hmw.js:114` *"KHÔNG cap cứng (soft notice only)"* + `:115-117` chỉ `log()` — đúng, và floor `depth-axis:40` đòi *"clamp trần cứng (vd ≤3) + assert tổng-lượt ≤ trần"* | +| P0-1 "lane chết → null → nuốt lặng" | `hmw.js:225` `return results.filter(Boolean)`; comment `:223` **tự khai** *".filter(Boolean) chỉ lọc null-lane do agent lỗi runtime"* ⇒ code tự tố chính nó | +| P0-1 "CẤM sửa thành throw" | `hmw.js:124-125` *"(per-lane throw có thể bị nuốt thành null = STOP-SILENT, tệ hơn)"* — và vì nó nói **per-lane**, C8 (throw up-front) KHÔNG mâu thuẫn | +| P2-2 "đơn-vị THỨ BA" | `agents/README.md:251` = *"Effective tokens billed (after caching)"* — không phải "tổng vào+ra" cũng không phải "phía-ra" của `depth-cost:59` ⇒ falsifier đúng là CHƯA ĐO ĐƯỢC | +| P2-2 "đóng băng thời 7 sub-agent, roster nay 17" | `README:249-257` (`:253` "7 sub-agents spawn setup"); roster đo 2 cách độc lập: `ls .claude/agents/*.md`=18 (gồm README) và `grep maxTurns`=**17** | +| P3-3 "CLAUDE.md có nói posture không?" | `grep -i hmw CLAUDE.md docs/CLAUDE.md` = **0 hit** ⇒ gap discoverability-home CÓ THẬT | +| P4-2 "`/check-email` bước 2 chỉ ghi outbox/se" | `check-email.md:15` là **dòng DUY NHẤT** chứa `outbox` trong cả file | +| P4-2 "outbox/all = 90 file" | `ls ../../AI_INFRA/broadcasts/outbox/all/*.md \| wc -l` = **90** (khớp chằn chặn) | +| P4-3 "đĩa ×25 vs STATUS/HANDOFF ×23" | đĩa: `feedback_agent_return_garble_recover.md:13` *"+ S143 ×5 = ×25 tổng"*; canonical: `STATUS.md:462` **và** `HANDOFF.md:5` đều *"×20/S118 → ×23/S143"* ⇒ **lệch 2 phía đều verify** | +| P4-4 F-6 ".gitignore thiếu lock" | `grep scheduled_tasks .gitignore` = NOT FOUND | +| ① "goi-chot khoản 3+4 binding" | `goi-chot:67-68` PROJECT-FIT: khoản 3 *"áp cho mọi dự-án … có lệnh điểm-dừng riêng"*, khoản 4 *"áp cho MỌI dự-án viết doc/rule"* | +| ①(4) "bẫy over-apply khoản 2" | `goi-chot:37` giữ nguyên *"resume/continue chỉ còn hợp-lệ cho hội-thoại tiếp-diễn trong cùng lượt làm việc"* ⇒ path-2 cứu #53 KHÔNG bị retire — spec chặn đúng | +| P1-2 "1 vai harness-audit mở rộng là hợp khung" | `harness-dong-du-vong:51` *"gộp hay tách audit (1 con kiểm nhiều vòng hay mỗi vòng 1 con) … mỗi dự-án tự quyết"* | +| "2/5 lane sống" | run-folder có đúng 2 sub-file investigator (`-0`, `-3`) | + +--- + +## Bảng neo đầy đủ + +### A. Neo vào mã/repo SE (16) + +| # | Neo spec | Verdict | Bằng chứng | +|---|---|---|---| +| A1 | `hmw.js:225` = `return results.filter(Boolean)` | **KHỚP** | đúng nguyên văn; comment `:223` củng cố claim nuốt-lặng | +| A2 | `hmw.js:114-117` *"KHÔNG cap cứng (soft notice only)"* | **KHỚP** | `:114` nguyên văn; `:115-117` = `if (>16) log(...)` | +| A3 | `hmw.js:124-125` *"per-lane throw … STOP-SILENT, tệ hơn"* | **KHỚP** | câu vắt 2 dòng, nguyên văn | +| A4 | `agents/README.md:249-257` bảng cost "7 sub-agents" + "Effective tokens billed" | **KHỚP** | `:249` header · `:251` cột · `:253` hàng | +| A5 | roster 17 | **KHỚP** | 2 cách đo độc lập đều ra 17 | +| A6 | `investigator-codebase` maxTurns=20 | **KHỚP** | `investigator-codebase.md:14` | +| A7 | `reviewer` maxTurns=25 | **KHỚP** | `reviewer.md:14` | +| A8 | SE dùng sleep-check 7 NGÀY | **KHỚP (+cảnh báo M3)** | `session-start.md:135`, kèm nhãn DP-5 quyền owner | +| A9 | `/check-email` bước 2 chỉ `outbox/se` | **KHỚP** | `check-email.md:15` là hit duy nhất | +| A10 | sổ garble đĩa ×25 | **KHỚP** | `feedback_agent_return_garble_recover.md:13` | +| A11 | `settings.json:11` pin Opus từ 07-20 | 🔴 **LỆCH (nhầm file)** | repo `.claude/settings.json` 0-hit, mtime 07-15; global `~/.claude/settings.json:11` mới đúng, mtime 07-20 13:38 | +| A12 | `session-start.md:43` outage-recipe | **KHỚP** | `:43` đúng nội dung; hệ quả "no-op" đứng được nhờ file global (M1) | +| A13 | CLAUDE.md có nói HMW-mode? | **KHỚP (gap thật)** | 0 hit | +| A14 | `.gitignore` thiếu `scheduled_tasks.lock` | **KHỚP** | NOT FOUND | +| A15 | 2/5 lane sống | **KHỚP** | 2 sub-file trong run-folder | +| A16 | 10 thư inbox 07-18→07-21 | **KHỚP** | `ls` = 10 file | + +### B. Neo trích 10 broadcast (44) — tóm tắt + +- **`spawn-label`** `:22` `:22-27` `:43` `:51` + falsifier `:47` (khuôn C3) — **5/5 KHỚP** nguyên văn. +- **`depth-axis`** `:20` `:38` `:40` `:43` `:55` — **KHỚP**; riêng **B10** verbatim F3 ở `:36` (lệch dòng). +- **`goi-chot`** `:28` `:29` `:37` `:44` `:45` `:52` `:59` `:74` + header §1/§3/§4 + PROJECT-FIT `:67-68` — **KHỚP**; riêng **B14** *"áp cho MỌI dự-án"* ở `:68` (lệch dòng). +- **`harness-dong-du-vong`** `:42` `:44` `:47` `:51` `:59` — **KHỚP**; +neo hụt m4 (`:37-39`). +- **`eval-quality`** `:13` `:15-24` `:19-22` `:24` `:22` `:31` `:55` — **7/7 KHỚP** nguyên văn. +- **`auto-toan-vong`** `:19` `:21` `:27` `:35` `:43-47` — **KHỚP**; nit n1 ở `:45`. +- **`3-khoan`** `:15` `:19-27` (`:25`) `:31-41` (`:36-37`,`:39`) `:47-51` `:53` — **KHỚP**, kể cả claim *"hub tự khai đã đọc nhầm 1 lần"* (`:53`). +- **`depth-cost`** `:53` `:54` `:55` `:63` — **KHỚP**; **B40** `:59` là paraphrase-trong-ngoặc-kép. +- **`cost-lens`** `:28` **KHỚP**; **B43** `:50` 🔴 **LỆCH — cắt nửa dòng** (M2). +- **`hub-tu-danh-gia`** `:62` — **KHỚP**. + +--- + +## Khuyến nghị (mô tả vấn đề + tiêu chí nghiệm thu, KHÔNG viết code hộ) + +1. **M1** — mọi chỗ nhắc pin model phải ghi đủ đường dẫn `~/.claude/settings.json:11` (global, ngoài git). Nghiệm thu: grep spec, 0 lần xuất hiện chuỗi `settings.json:11` mà không có tiền tố `~/.claude/`. +2. **M2** — thêm 1 dòng vào P-list cho `cost-lens` khoản ③, hoặc khai rõ "đã cân-nhắc → BÁC vì lý do X". Nghiệm thu: bảng disposition có dòng riêng cho khoản ③. +3. **M3** — chuyển flip cơ-chế sleep-trigger sang mục OWNER-GATED (O-6); C11 giữ lại phần đo + đề xuất. Nghiệm thu: C11 không còn acceptance dạng `grep 'ngày' = 0` khi chưa có chữ owner. +4. **M4** — khai nguồn con số tool-use hoặc bỏ nhãn "đo được". Nghiệm thu: mỗi số mang nhãn đo-lường trong spec trả lời được câu *"phép kiểm nào làm nó TRƯỢT nếu sai?"*. +5. **m1-m4** — sửa số dòng cite (1 phút/cái). Nghiệm thu: mở đúng dòng, thấy đúng chữ. +6. **m5** — phân class trước khi cộng sổ garble ở closeout. + +## Ghi chú phương pháp + +- Mỗi neo chấm 1 trong 3: **KHỚP** / **LỆCH** / **KHÔNG TÌM THẤY**; không neo nào chấm mà chưa mở file. +- Lệnh dùng: `awk NR>=a&&NR<=b` in kèm `FILENAME:NR` (đọc đúng dòng, không tin grep-context), `git log -1 --` cho mtime/commit, `ls | wc -l` cho phép đếm. +- Không sửa file nào ngoài chính sub-MD này (isolation B6). diff --git a/.claude/workflows/runs/2026-07-22-S144-adap-dot-11/sub-reviewer-1.md b/.claude/workflows/runs/2026-07-22-S144-adap-dot-11/sub-reviewer-1.md new file mode 100644 index 0000000..8c5f5d5 --- /dev/null +++ b/.claude/workflows/runs/2026-07-22-S144-adap-dot-11/sub-reviewer-1.md @@ -0,0 +1,186 @@ +# sub-reviewer-1 — R2 scope-calibration (S144 adap dot-11) + +**Vai:** reviewer adversarial · trục = "spec đòi ĐÚNG mức không?" +**Target:** `.claude/workflows/runs/2026-07-22-S144-adap-dot-11/spec-adap-dot-11-22-07-2026.md` (177 dòng) +**Nguồn:** 10/10 thư `broadcasts/inbox/` đã MỞ THẬT (không suy diễn từ bảng của spec) +**Trạng thái:** DONE + +--- + +## 0. VERDICT — `PASS_WITH_FIXES` + +Phân hạng 4 mức của spec (BINDING / BINDING-mixed / KHUYẾN NGHỊ / GHI NHẬN) **đúng 10/10 ở mức THƯ** — mọi neo `file:line` trong bảng ① +đều khớp verbatim khi mở thư gốc. **0 ca phóng-đại ở tầng phân-hạng thư.** + +Lỗi nằm ở **tầng khoản** (bên trong thư binding) và **tầng checklist**: + +| Loại | Số | Mức nặng nhất | +|---|---|---| +| Phóng-đại (đòi hơn thư) | 2 | 1 MAJOR (C8 sai-trục + tự mâu-thuẫn) | +| Bỏ sót ràng buộc | 4 (+5 khuyến-nghị-cấp) | 2 MAJOR (`harness:46` khoản③ · `goi-chot:38+66+73`) | +| Owner-gate thiếu | 2 | 1 MAJOR (số trần C8) + 1 MAJOR (C12 ghi posture-toggle vào CLAUDE.md) | +| Trục 3 (depth-axis qualify) | — | **ĐÚNG**, có bằng chứng cơ học | +| Trục 4 (retire-resume) | — | **ĐÚNG**, đọc khớp `goi-chot:37` — nhưng bỏ nửa sau của khoản 2 | + +--- + +## 1. TRỤC 1 — PHÓNG ĐẠI (spec đòi HƠN thư) + +### 🔴 MAJOR P-1 — C8 "THROW" vừa SAI TRỤC vừa MÂU THUẪN với chính khoản mà nó viện + +- Thư `depth-axis:40` (khoản ①): *"clamp trần cứng (vd ≤3) + **assert tổng-lượt ≤ trần**"* — trần này áp lên **SỐ LƯỢT của trục SÂU** + (cấu-hình đối chiếu `depth-cost:24`: *"5-góc + thử-phá + 3-đào-tầng-2 + thử-phá-2 = **10 lượt**"*). +- Spec `:158` (C8) lại ép trần lên **`taskList.length`** = **CHIỀU RỘNG** (số lane fan-out), neo vào `hmw.js:114-117` (`taskList.length > 16` soft notice). + Hai đại lượng khác nhau: `hmw.js:175` `parallel(A.taskList...)` = width; depth = *invocation hmw thứ hai* (chính spec `:100` nói vậy). + ⇒ **fix đúng-chữ-nhưng-sai-trục**: làm xong C8 vẫn **KHÔNG** có `assert tổng-lượt ≤ trần` cho trục sâu. +- Nặng hơn: `depth-axis:43` (khoản ④) ghi rõ vượt ngân-sách ⇒ *"BỎ đào + báo RÕ (**không văng lỗi**, không lặng-thầm bỏ), trả kết-quả chiều-rộng"*. + Spec `:98` chép đúng câu này (F4 "cận-ngân-sách LOUD") rồi `:158` yêu cầu **THROW** ⇒ **spec tự mâu thuẫn trong cùng 1 tài liệu**. + Cùng họ với chính lệnh CẤM của spec ở `:53` (P0-1 cấm `throw` vì STOP-SILENT). +- Bối cảnh làm nó nặng thêm: `depth-cost:52` bài-học-1 *"cổng-ngân-sách tự hạ được = **máy đè lệnh owner**"* — SE có `/fable-real` = lệnh owner đích-danh; + thêm 1 cổng ngân-sách cứng ở đúng đường fan-out là đúng lớp bệnh thư cảnh báo. (Thư này spec xếp GHI-NHẬN nên không soi bài-học-1 — xem O-4 dưới.) +- **Acceptance đề nghị:** C8 tách 2 dòng — (a) *trục SÂU*: assert `tổng-lượt ≤ trần` (trần = O-2, owner); (b) *trục RỘNG*: giữ soft-notice **hoặc** LOUD-skip + theo `depth-axis:43`, **không** THROW. Nếu vẫn muốn THROW ở width → phải khai là **quyết-định SE vượt floor**, không được viết như "adopt khoản ①". + +### 🟡 MINOR P-2 — C6 sweep hồi-tố rộng hơn floor văn bản + +- `goi-chot:55` (Floor chuyển được): *"adopt khuôn-câu hai-dạng … cho mọi tài-liệu governance **mới**"*; `:53` *"cửa này chặn từ lúc **VIẾT**, không đợi tới lúc trả nợ"*; + `:54` hub tự khai *"máy quét TỰ-ĐỘNG cho chính class lời-hứa-máy = **chưa có**"*. +- Spec `:83` + C6 `:156` đòi **sweep toàn bộ doc governance SE + "đếm trước/sau"** = hồi-tố toàn corpus. + Luật `:52` viết không giới-hạn thời-gian nên cách đọc này *không sai*, nhưng nó là **cạnh nặng nhất** của một luật mà chính hub chưa có máy, + và đụng thẳng `goi-chot:44-45` (điểm-dừng phải rẻ) + `hub-tu-danh-gia:36` (attention owner = tài nguyên khan hiếm nhất). +- **Acceptance đề nghị:** giữ luật forward-looking là BẮT BUỘC; phần hồi-tố → time-box/mẫu (vd: doc governance sửa trong 30 ngày) + khai rõ residual, thay vì "mọi câu còn lại". + +*(Đã soi và KHÔNG tính là phóng-đại: P1-1 "áp MỌI kênh spawn" khớp `spawn-label:27` khoản④ 4-loại; P1-5 audit `/pause` khớp `goi-chot:46` + `:74`.)* + +--- + +## 2. TRỤC 2 — BỎ SÓT RÀNG BUỘC (trục nguy hiểm nhất) + +### 🔴 MAJOR O-1 — `harness-dong-du-vong` khoản ③ (tuần-tự trong-vòng) KHÔNG có 1 dòng nào trong spec + +- Thư `:46`: *"**Tuần-tự trong-vòng**, song-song giữa-vòng: audit **chờ đúng con đo vòng mình xong** (chống chấm bản stale); các vòng khác nhau chạy song song thoải mái."* +- Spec xếp thư này **BINDING-floor 4 khoản** (`:17`) nhưng chỉ triển khai khoản ① (P1-2) + khoản ④ (P1-3). Khoản ③ **vắng mặt** ở cả ② CÁCH IMPLEMENT lẫn checklist. +- Đây **không** phải khoản vô hại: `hmw.js:175` `const results = await parallel(A.taskList.map(...))` — **không có cơ chế tuần-tự trong 1 invocation**. + Nếu C4 mở rộng `harness-audit` (file có thật: `.claude/agents/harness-audit.md`) sang 3 vòng và bơm chung 1 `taskList` với các con ĐO ⇒ audit chấm **bản stale/rỗng** = đúng lỗ thư vá. + Spec đã biết tính chất này (`:100` *"`hmw.js` `parallel()` **không tuần-tự-hoá** ⇒ tầng-2 = invocation hmw THỨ HAI"*) nhưng **không** áp cùng kết luận cho vòng audit. +- **Acceptance đề nghị:** C4 thêm 1 dòng — audit của vòng X chạy ở **invocation hmw sau** con-đo vòng X (hoặc bằng chứng cơ chế tương đương), + nêu rõ vòng khác vẫn song song. + +### 🔴 MAJOR O-2 — `goi-chot` khoản 2 **nửa sau** bị bỏ: SE dùng resume + đang DỰA vào model-pin + +- Spec `:43` đọc **ĐÚNG** phần retire (xem trục 4). Nhưng thư còn 2 câu spec im: + - `:38` *"Floor chuyển được: nếu bạn đang resume agent VÀ dựa vào model-override sống qua resume — **coi chừng nó không sống** … Muốn giữ resume → **tự verify trên env mình trước**"*. + - `:66` (PROJECT-FIT) *"Khoản 2: **chỉ áp nếu bạn dùng resume/continue agent kèm model-override**"* → SE **đúng là ca ĐƯỢC ÁP**. + - `:73` (SELF-CHECK) *"**Grep chỗ dùng resume/continue agent** — có chỗ nào đang DỰA vào model-override sống qua resume không?"* = việc rẻ, chạy được ngay. +- SE thoả đúng tiền-đề: worker-tier-pin bơm model tại spawn (`hmw.js:219` `model: resolveModel(role, raw, t && t.tier, i)`), và path-2 `SendMessage-resume` là lưới #53 + (spec `:43` khai *"đã dùng 2 lần thành công hôm nay"*). ⇒ Nếu override **không** sống qua resume thì lane được cứu chạy **model khác** mà không ai biết — + im lặng đúng kiểu `depth-cost:53` *"thử-rồi-chết ≠ chạy-rồi-sạch"*. +- Spec kết luận "path-2 KHÔNG bị retire" rồi **dừng**, nên mất luôn nghĩa vụ kèm theo. Đây là bỏ-sót **có hậu quả**, không phải thiếu chữ. +- **Acceptance đề nghị:** thêm 1 mục P4 (rẻ): grep call-site resume + ghi 1 dòng verdict *"SE có/không dựa vào override sống qua resume"*; nếu CÓ → đo 1 lần trên env SE trước khi tiếp tục tin path-2. + +### 🟠 MAJOR-nhẹ O-3 — `harness-dong-du-vong` khoản ② (propose-only) không có dòng disposition + +- Thư `:45`: *"**Audit = propose-only**: trả TEXT, lead là người duy nhất ghi; kèm rào tường minh chống sub tự ghi sổ."* +- SE **nhiều khả năng đã đạt** (`hmw.js:185` `const writeGuard = …` + G-015), nên đây là lỗi **sổ sách**, không phải lỗ năng lực. +- Nhưng chính spec ra luật `:169` *"Bảng disposition **TỪNG DÒNG**, không báo số tổng"* — tuyên "4 khoản" rồi làm 2, im 2 = đúng bệnh `meta-count` S119 mà spec tự dặn tránh. +- **Acceptance đề nghị:** bảng 4 dòng/thư-binding với disposition {ADOPT / ĐÃ-CÓ + neo / N-A + lý do}. + +### 🟡 MINOR O-4 — 5 khoản "dùng được ngay" trong nhóm GHI-NHẬN/KHUYẾN-NGHỊ bị rơi (cite nửa dòng) + +| # | Khoản bị rơi | Neo | Ghi chú | +|---|---|---|---| +| a | `hub-tu-danh-gia:27` *"điểm tự-chấm của lead phải để **NGOÀI mọi kênh sub với tới được** — 'không đưa vào pack' chưa đủ khi sub đọc sổ chung"* + falsifier `:57` | thư | **Fire ĐỎ ngay tại run này**: spec (do lead viết) mang sẵn phán quyết `:67` "SE hiện **FAIL rõ**", `:95` "⇒ **FAIL**", `:18` "→ **SE QUALIFY**" rồi đưa cho chính reviewer chấm ⇒ anchor ngầm. Bằng chứng ngôi-thứ-nhất. | +| b | `hub-tu-danh-gia:62` *"pattern eval-3-góc (§1) + 3 câu kiểm (§6) **dùng được ngay ở mọi nhà**"* | spec chỉ trích nửa sau cùng dòng (*"điểm số và findings là của hub, không áp"*) | cite **nửa dòng** — nửa còn lại là lời mời áp | +| c | `cost-lens:50` *"**Khoản ③ áp được cho MỌI nhà** (kể cả 1-chế-độ): pattern suggest-1-dòng-non-blocking"* (+ `:44`) | spec cite đúng dòng `:50` nhưng chỉ lấy vế "KHÔNG floor" | cùng lỗi cite-nửa-dòng | +| d | `depth-cost:52` bài-học-1 *"lệnh ép-full-power của owner phải khoá cả chiều MÁY"* | thư | trực tiếp liên quan C8 (P-1) | +| e | `auto:29-31` + `:46` instrument **tự làm tươi** số-đo-đóng-băng | thư | SE có đúng vật đó: bảng cost `agents/README.md:249-257` "đóng băng" (spec `:103` tự khai) — P2-2 chỉ re-ground **1 lần**, không wire nhánh làm-tươi | + +*(Nhóm này là khuyến-nghị-cấp ⇒ bỏ được, nhưng phải là bỏ **có chữ**, không phải im.)* + +### ✅ Không sót (đã kiểm từng khoản) +- `spawn-label` 4/4 khoản có chỗ đứng (①→P1-1 · ②③→C3 *"0 label bị cắt chữ"* + khuôn 1 kiểu · ④→P1-1 "MỌI kênh spawn" phủ đủ 4 loại `:27`). +- `depth-axis` 4/4 khoản có mặt (F1-F4 `:94-98`), khớp `:40-43`. +- `3-khoan` 3/3 khoản có mặt (P3-2 `:47-51` · P3-3 `:31-41` · P3-4 `:19-27`). +- `goi-chot` khoản 3 (`:44-46`)→P1-5 · khoản 4 (`:52`)→P1-4 · khoản 1/5 → P4-1 + O-5. + +--- + +## 3. TRỤC 3 — ĐIỀU KIỆN KÍCH HOẠT `depth-axis:20` → SE QUALIFY = **ĐÚNG** + +Thư `:20`: *"Áp cho dự-án nào có **ensemble đa-agent / đa-lăng-kính** (nhiều model/nhiều góc nhìn chạy song song rồi **tổng-hợp**). Không có ensemble → FYI, chưa cần áp."* + +Bằng chứng cơ học (không phải suy luận): +1. `hmw.js:175` — `const results = await parallel(A.taskList.map((t, i) => () => {` ⇒ chạy **song song**. +2. `hmw.js:215-219` — mỗi lane `agent(prompt, { agentType: role, …, model: resolveModel(...) })` ⇒ **đa-agent, đa-vai**, model per-lane. +3. `hmw.js:9` — *"fan-out roster ĐẦY-ĐỦ … return findings + checklistEvidence + memoryDelta"*; bước `@P3` em-main **VERIFY + harvest** ⇒ có **tổng-hợp**. +4. Run đang chạy: `/fable-clone investigator-codebase` 5 lane (spec `:5`) + trio 3-lăng-kính `.claude/agents/harness-{eval,refine,audit}.md` tồn tại trên đĩa. + +⇒ 4/4 mảnh của định nghĩa `:20` có mặt. **Không phóng đại.** Kèm theo: `:20` chỉ mở cửa áp — `:55` mới là điểm sàn (*"có trục sâu bật-được + escape width-only, **KHÔNG bắt buộc default nào**"*), và spec trích đúng câu này ở `:94`. + +--- + +## 4. TRỤC 4 — OVER-APPLY KHOẢN 2 GÓI-CHỐT → cách đọc của spec **ĐÚNG** + +- Thư `goi-chot:37`: *"…resume/continue **chỉ còn hợp-lệ cho hội-thoại tiếp-diễn trong cùng lượt làm việc**, không phải cơ-chế bảo-toàn model."* +- Thư `:32` (tiêu đề khoản) giới hạn retire vào đúng *mục-đích* *"giữ context / chắc model"*. +- SE `SendMessage-resume` cứu #53 = resume **in-session, cùng lượt làm việc**, mục đích = vớt output của con đang sống, **không** phải giữ model/context. + ⇒ spec `:43` kết *"path-2 KHÔNG bị retire"* = **đọc đúng**, không over-apply. Giữ nguyên lưới #53. +- ⚠️ Nhưng xem **O-2**: đúng ở vế retire không miễn cho SE nghĩa vụ `:38`/`:66`/`:73`. + +--- + +## 5. TRỤC 5 — OWNER-GATED ĐỦ CHƯA (neo `eval:24` {AI-tự-sửa · owner-quyết-SỐ · owner-quyết-LUẬT}) + +**O-1…O-5 hiện có: đúng và cần.** Thiếu 2 ca, cả 2 đều rơi vào 2 cột owner: + +### 🔴 MAJOR G-1 — C8 chứa **con SỐ** + **đổi CƠ CHẾ**, cả hai đều thuộc owner + +- `eval:24` xếp *"đổi cơ chế, thêm gate"* = **chủ-dự-án-quyết-LUẬT**; *"ngưỡng, target"* = **chủ-dự-án-quyết-SỐ**; *"AI không tự quyết hai cột sau"*. +- C8 `:158` giao em-main biến soft-notice (`hmw.js:114-117`) thành **THROW** (= thêm gate cứng, đổi cơ chế) tại ngưỡng `` (= số). +- O-2 chỉ phủ *"giá trị clamp"* của **trục sâu**; trần **width** hiện là `16` ở `hmw.js:115` — **không** nằm trong O-1…O-5. +- Spec tự ra luật `:172` *"**Số của owner** — O-1…O-5 **CẤM** tự đặt"* ⇒ worker cầm C8 sẽ hoặc bịa số, hoặc kẹt. **Mâu thuẫn vận hành.** +- **Acceptance đề nghị:** C8 gắn nhãn `BLOCKED-by-O-2`, và bổ sung `O-6 = trần width + cơ chế (throw hay LOUD-skip)`. + +### 🔴 MAJOR G-2 — C12 ghi **posture đang bật** vào `CLAUDE.md` = ghi trạng-thái TOGGLE vào file luật + +- Đo tại đĩa: `grep "HMW-mode" CLAUDE.md docs/CLAUDE.md` ⇒ **0 hit** (lỗ spec nêu ở `:121` là **CÓ THẬT**). +- Nhưng HMW-mode là **toggle owner-consent**, không phải mặc-định thường-trực: + - `.claude/commands/ultra-on.md:2` — *"BẬT HMW-mode … **Gõ = anh CONSENT chạy Workflow (deliberate on-ramp)**"*; + - `.claude/commands/ultra-off.md:9` — *"**xóa marker** `.claude/hmw-mode.on` … `/session-start` kế báo **OFF**"*. +- `3-khoan:39` chỉ áp cho *"chỉ-thị nào **đổi hành vi mặc định của mọi phiên về sau** (operating-posture)"*. Trạng thái bật/tắt **theo phiên** không thuộc lớp đó. +- Viết thẳng "HMW-mode ON" vào file-đọc-đầu-tiên ⇒ (i) **sai ngay khi owner gõ `/ultra-off`** (drift by construction), (ii) biến một **cửa consent của owner** thành **default có văn bản** = owner-quyết-LUẬT, (iii) trái B1 (derived trỏ canonical, không chép giá-trị). +- **Acceptance đề nghị:** C12 đổi thành *"CLAUDE.md có **1 dòng trỏ NƠI xem posture hiện hành** (marker `.claude/hmw-mode.on` + `/session-start`), KHÔNG chép giá-trị ON/OFF"*; nếu owner muốn HMW-mode thành mặc-định thường-trực → đó là O-mới, hỏi anh. + +### 🟡 MINOR G-3 — vài số nhỏ khác tự đặt +`:58` *"≤3 file/lane"* (P0-2/C2) là **ngưỡng** do AI đặt. Rủi ro thấp (kỷ luật nội bộ, đảo được), nhưng spec đã gate `min_pending_shards` (O-1) nên bỏ trống ca này là **bất-nhất**. +Nêu 1 dòng "AI-tự-đặt, đảo được" là đủ. + +--- + +## 6. Ghi chú công bằng (những chỗ spec làm ĐÚNG, chống Smart-Friend ngược) + +- **10/10 neo trong bảng ① khớp verbatim** khi mở thư gốc — tao kiểm từng dòng: `spawn-label:22` · `harness:42` · `depth-axis:38`+`:20` · `goi-chot:44-45/:52/:29/:37/:59` · `eval:13` · `auto:43-47` · `3-khoan:15` · `cost-lens:50` · `depth-cost:63` · `hub-tu-danh-gia:62`. Không có neo bịa. +- 3 thư tự khai *"KHÔNG floor"* (`cost-lens:50` · `depth-cost:63` · `hub-tu-danh-gia:20/62`) được xếp GHI-NHẬN ⇒ **không** ép SE làm việc hub không đòi. +- `eval-quality` xếp KHUYẾN NGHỊ dù `:13` nói *"Khung = sàn chức năng"*: lệch **hướng nới**, nhưng thư **không** có mục "Nấc adopt" và **0** câu `/adap-apply` ⇒ chấp nhận được; và spec vẫn giao C10 với acceptance có răng (*"bịa input sai → nó ĐỎ"*). +- Phát hiện `:177` (goi-chot **không** có "Nấc adopt", 0 `/adap-apply` dù binding nhất) — tao **xác nhận đúng**: mở thư, không có mục nào tên "Nấc adopt", không có chuỗi `/adap-apply`. Đây là quan sát tinh, đúng loại chống-lệch-bảng-nấc. +- `hmw.js:225` `return results.filter(Boolean)` — **đúng nguyên văn**; P0-1 chẩn đúng, và lệnh CẤM-throw của nó khớp comment `hmw.js:124-125`. + +--- + +## 7. Danh sách chốt + +**{phóng-đại}** +1. `P-1` MAJOR — C8 (`spec:158`) ép trần lên **width** `taskList.length` trong khi `depth-axis:40` nói **tổng-lượt trục sâu**; và **THROW** trái `depth-axis:43` *"không văng lỗi"* + trái chính `spec:98`. +2. `P-2` MINOR — C6 (`spec:156`) sweep **hồi-tố toàn corpus** trong khi floor `goi-chot:55` viết *"mọi tài-liệu governance **mới**"* và `:54` khai hub **chưa có máy**. + +**{bỏ-sót}** +1. `O-1` MAJOR — `harness-dong-du-vong:46` khoản ③ **tuần-tự trong-vòng** (chống chấm bản stale) — 0 dòng trong spec; `hmw.js:175` không tuần-tự-hoá ⇒ rủi ro thật cho C4. +2. `O-2` MAJOR — `goi-chot:38` + `:66` + `:73` — SE dùng resume + dựa model-pin (`hmw.js:219`) ⇒ phải **tự verify override sống qua resume**; spec dừng ở "không bị retire". +3. `O-3` MAJOR-nhẹ — `harness-dong-du-vong:45` khoản ② propose-only: không có dòng disposition (dù `hmw.js:185` writeGuard nhiều khả năng đã đạt) — vi phạm chính `spec:169`. +4. `O-4` MINOR ×5 — `hub-tu-danh-gia:27`+`:57` (anchor điểm-tự-chấm, **fire đỏ ngay run này**) · `hub-tu-danh-gia:62` · `cost-lens:50` khoản③ · `depth-cost:52` bài-học-1 · `auto:29-31`+`:46` (instrument tự-làm-tươi). + +**{owner-gate thiếu}** +1. `G-1` MAJOR — C8: trần width + cơ chế THROW = owner-SỐ + owner-LUẬT (`eval:24`), chưa có trong O-1…O-5. +2. `G-2` MAJOR — C12: ghi giá-trị posture TOGGLE (`ultra-on.md:2` / `ultra-off.md:9`) vào `CLAUDE.md` = owner-LUẬT + drift-by-construction. +3. `G-3` MINOR — `spec:58` "≤3 file/lane" là số AI tự đặt (chấp nhận được nếu khai). + +**Điều kiện để lên PASS:** đóng `P-1`, `O-1`, `O-2`, `G-1`, `G-2` (5 mục) — mỗi mục 1 dòng sửa trong spec, không mục nào đòi code. diff --git a/.claude/workflows/runs/2026-07-22-S144-adap-dot-11/sub-reviewer-2.md b/.claude/workflows/runs/2026-07-22-S144-adap-dot-11/sub-reviewer-2.md new file mode 100644 index 0000000..4957906 --- /dev/null +++ b/.claude/workflows/runs/2026-07-22-S144-adap-dot-11/sub-reviewer-2.md @@ -0,0 +1,102 @@ +# sub-reviewer-2 — R3 "acceptance-teeth" (S144 adap dot-11) + +> Vai: reviewer adversarial. Câu hỏi duy nhất: **qua được C1→C13 thì có NGHĨA LÝ gì, hay chỉ xanh-vì-mù?** +> Khung áp: `broadcasts/inbox/2026-07-21-Governance-eval-quality-audit-ra-thuoc-eval-cua-eval.md` (gọi tắt `eval:`). +> Đối tượng chấm: `.claude/workflows/runs/2026-07-22-S144-adap-dot-11/spec-adap-dot-11-22-07-2026.md` §③ C1→C13 (`:149-172`). + +## 0. VERDICT — `PASS_WITH_FIXES` + +**4 răng-thật · 4 nửa-răng · 5 nghi-thức-rỗng.** Spec đáng làm, nhưng **thước đo của nó yếu hơn việc nó mô tả**. +Hai mục phải sửa trước khi worker chạy: +- **C6 rỗng-hoàn-toàn** — tập-đo có **0 phần tử**; đạt mà không cần sửa gì; sweep này **đã chạy rồi** ở wave-3 với pattern RỘNG HƠN. +- **C11 bất-khả-thi** — muốn `grep=0` phải **xoá một luật owner đang GIỮ**, trái chính luật-chung #6 của spec. +Một mục **độc-hại**: **C12** đẩy em-main viết vào `CLAUDE.md` một claim **stale-by-construction**. + +## 1. Ground-truth đã đo (lượt 3-5, re-đo từ đĩa — không chép spec) + +| Neo | Lệnh | Kết quả | +|---|---|---| +| `hmw.js:225` | `grep -n "filter(Boolean)"` | `return results.filter(Boolean)` — XÁC NHẬN spec ①(2) đúng | +| `hmw.js:114-116` | `grep "cap c"` | `S4 — số task THOẢI MÁI … KHÔNG cap cứng (soft notice only)`; ngưỡng `>16` chỉ `log()` ⇒ C8 chưa có clamp: ĐÚNG | +| `hmw.js:124-125` | idem | `throw có thể bị nuốt thành null = STOP-SILENT, tệ hơn` + `(trước parallel) — halt KHÔNG phụ-thuộc semantics parallel()` | +| `fable-clone.md` (70 dòng) | `grep "lượt"` | **KHÔNG có** chuỗi `trần lượt` (hiện = 0) | +| `.claude/agents/` | `ls` | 18 mục − `README.md` = **17 vai** ⇒ spec P2-2 "roster nay 17" **ĐÚNG**; `harness-audit.md` **đã tồn tại** ⇒ C4 không phải đẻ vai mới | +| **C6 tập-đo** | `grep -rn "máy sẽ" docs/governance/ .claude/` (trừ `runs/`) | **0 hit** | +| C6 toàn repo | `grep -rn "máy sẽ" --include="*.md"` (trừ `runs/`) | **7 hit — 100% nằm trong `broadcasts/`, 100% là use⟂mention** (câu *định nghĩa* luật, không phải lời hứa) | +| C6 rủi-ro thật | `grep "detector\|guard\|hook"` ∩ `chặn\|quét\|bắt\|đảm` trong `docs/governance/*.md` | **19 hit** — **ngoài** tập-đo của C6 | +| **C6 trùng-việc** | `broadcasts/outbox/ai_infra/2026-07-18-se-to-ai_infra-adap-wave-3-ban-17-07-bao-nac.md:26` | *"Grep lớp câu 'máy sẽ quét / detector phủ / đã fault-inject' trên governance SE ra **3 câu** … cả 3 trace được vào mã đang chạy … **Không câu nào phải hạ chữ**"* | +| **C12 tiền-đề** | `grep -n "HMW\|posture\|ensemble" CLAUDE.md docs/CLAUDE.md` | **0 hit** (CLAUDE.md 147 dòng) ⇒ phát hiện P3-3 của spec **ĐÚNG** | +| **C12 bẫy** | `fable-clone.md:16` | *"Hiệu-lực CHỈ lượt đó — KHÔNG còn 'về mặc-định', KHÔNG marker, KHÔNG persist"* | +| **C11 xung-đột** | `.claude/commands/sleep-recovery-memory-l2.md:52` | *"**INFORM 7-ngày GIỮ** (quyền owner cục-bộ, B1 §3.4; cấm-là-cấm-hub-phát-chuẩn)"* | +| C11 over-broad | `grep -c "ngày"` file trên | **6** — phần lớn văn xuôi (`:68/:76/:80`), KHÔNG phải trigger | +| **C7 đường pause** | `pause.md:44` (53 dòng) | đã gọi `powershell.exe … scripts/nhip-no-probe.ps1` **ngay trong** đường dừng | +| C10 mẫu-số | `ls scripts/` | ~10 thước: `governance-detectors` · `memory-archive-gate` · `memory-selfimprove-audit` · `mfe-eval` · `applied-eval-nokey` · `agent-frontmatter-eol-check` · `crystallized-backfill` · `nhip-no-probe` · `measure-agent-memory` · `deps-audit` | +| C5 máy nền | idem | `scripts/mfe-eval.ps1` + `scripts/applied-eval-nokey.ps1` **có thật** | + +## 2. Bảng C1→C13 — 4 câu hub (`eval:15-24`) + +| # | Lớp đo (`eval:20`) | Goodhart-able? — đường lách cụ thể | Pos/Neg-control (`eval:31`) | Bỏ thì lọt gì (`eval:22`) | **Verdict** | +|---|---|---|---|---|---| +| **C1** | integrity→**efficacy** | Khó. Hardcode `log('lane CHẾT')` qua được vế dương nhưng **trượt vế âm** | **CÓ CẢ 2** (null→phải có · sạch→phải không) + `node --check` | Đúng ca đã cắn hôm nay: 3/5 lane chết, lead thấy "sạch". **Active, không dormant** | **RĂNG THẬT** | +| **C2** | **activity** (2/3 vế không đo được) | **CAO** — `grep -c 'trần lượt' ≥1` hiện = 0, gõ đúng cụm chữ là xong | KHÔNG | Lane chết vì cháy lượt — ca thật, nhưng **thước không quy được NHÂN**: marker C1 chỉ biết `null`, không biết *vì sao* | **NỬA-RỖNG** | +| **C3** | **activity**, tự-chấm | **CAO** — chấm chính label mình vừa viết, n=3, **không có artifact** (label panel ephemeral, `grep` không truy được; chỉ `hmw.js:9` là chuỗi tĩnh) | KHÔNG (thiếu ca label-hỏng-phải-trượt) | Ca thật có (`spec:67` `"Probe harness-eval alive"` thiếu pha+phiên) ⇒ **dormant-đúng-thiết-kế, thước hỏng** | **RỖNG** | +| **C4** | integrity→outcome | TRUNG BÌNH — re-check con số **dễ nhất**; **không cấm em-main tự kiểm vòng chính mình đo** (trái `m-3 no-self-exempt` S139) | Một nửa (thách-CLEAN ≥1 lens) | Vòng báo CLEAN sai — ca thật S143 (lead ĐO tốt nhưng ĐẾM-VỀ-MÌNH ~13%) | **NỬA-RĂNG** | +| **C5** | **efficacy** (nửa) | Vế `payload chứa literal 'FLOOR theo evidence'` = dán chuỗi | **CHỈ NEG, THIẾU POS** 🔴 — matcher **luôn** trả 0-hit qua neg-control **hoàn hảo** | Matcher rác báo APPLIED bừa | **NỬA-RĂNG** | +| **C6** | **activity, tập rỗng** | **TUYỆT ĐỐI** — tập-đo literal = **0/19**; và **rời-tập-đo** miễn phí: viết "hệ thống chặn X" là thoát | KHÔNG (không có câu-hứa-giả cắm vào) | **KHÔNG LỌT GÌ MỚI** — sweep rộng hơn đã chạy 3/3-sạch @wave-3 | **RỖNG HOÀN TOÀN** 🔴 | +| **C7** | **activity** | **CAO** — "đo wall-clock 1 lần, **ghi số**" **PASS ở MỌI giá trị** (`eval:21c` nhãn-hứa-không-ép). Tập cấm chỉ liệt "spawn-agent/quét-rộng" ⇒ `pause.md:44` gọi `powershell.exe` **lọt qua khe** | KHÔNG | Điểm dừng đắt lên — ràng buộc CỨNG `goi-chot:44` | **NỬA-RỖNG** | +| **C8** | integrity→efficacy | Khó — đòi **THROW**, `log` không giả được | **CÓ CẢ 2** (fault-inject 2 chiều) | `depth-axis` F1 trần cứng; hiện `hmw.js:114-116` = FAIL đo được | **RĂNG THẬT** | +| **C9** | activity + **mâu-thuẫn** | "cột đơn-vị hiện diện" = có cột là xong | KHÔNG | Bảng cost đóng băng ở 7 vai (roster thật 17) | **NỬA-RỖNG** — acceptance đòi *"trả lời được falsifier `depth-cost:59`"* mà **chính spec `:103` khai falsifier "CHƯA ĐO ĐƯỢC"**, không nêu lối thoát | +| **C10** | activity + phép-thử thật | **CAO ở chỗ chọn mẫu** — "1 detector **bất kỳ**" trên **~10**; lựa chọn hợp lý = cái **đã** fault-inject (S138 13/13 · S143 7 ca) ⇒ **xanh chắc chắn, 0 thông tin về 9 cái kia**. Bảng "mỗi thước có verdict" = 100%-do-cấu-trúc (`eval:32`) | Có, nhưng **cỡ mẫu 1/10 tự chọn** | Thước xanh-vì-mù — chính bệnh hub tự bắt 17/18 | **NỬA-RĂNG** | +| **C11** | **activity, grep-vắng-mặt** | **TUYỆT ĐỐI** — grep-cho-VẮNG là dạng dễ lách nhất: đổi tên `ngày`→`chu-kỳ`/`d` là = 0, **hành vi y nguyên**. Thêm: phạm vi "trigger" **không nêu file** ⇒ người chấm tự chọn | KHÔNG | Proxy-giả theo tuổi | **RỖNG + BẤT-KHẢ-THI** 🔴 — đạt `=0` buộc **xoá luật owner đang GIỮ** (`sleep-…l2.md:52`), trái **luật-chung #6** và **O-1** của chính spec; lại **over-broad**: 6 chữ "ngày" phần lớn là văn xuôi ⇒ đỏ-giả vĩnh viễn | +| **C12** | **activity** (đo presence, mục tiêu là **use**) | **CAO** — thêm 1 dòng là xong (hiện 0 hit) | KHÔNG (không có phép thử "phiên mới có THẤY không") | Posture vô hình với phiên mới | **RỖNG + ĐỘC-HẠI** 🔴 — `fable-clone.md:16` nói posture **KHÔNG persist, chỉ sống trong lượt**; ghi dòng thường-trực vào `CLAUDE.md` (load MỌI phiên) = **đẻ ghost-wire mới**, đúng lớp SE đang trả nợ | +| **C13** | integrity (per-dòng) | TRUNG BÌNH — *"lý-do-không-làm"* là **cửa thoát vô hạn**: mọi dòng đều đạt được bằng một lý do ⇒ **không bao giờ đỏ** | KHÔNG | Báo số tổng che dòng sót (bài `meta-count` S119) | **NỬA-RĂNG** — cấu trúc đúng, **ngưỡng vắng** | + +## 3. Câu chốt A — răng THẬT ⟂ nghi thức rỗng + +- **RĂNG THẬT (2):** **C1**, **C8**. Cả hai: fault-inject **2 chiều** + đòi **hình dạng mã** (`THROW` ≠ `log`) mà lời-nói không giả được. Đây là chỗ SE **đi trước hub** (`eval:31` hub 17/18 thiếu positive-control) — giữ nguyên. +- **NỬA-RĂNG (4):** **C4**, **C5**, **C10**, **C13** — có lõi thật, hỏng ở **cỡ mẫu / thiếu nửa control / thiếu ngưỡng**. +- **NGHI THỨC RỖNG (5):** **C2**, **C3**, **C6**, **C11**, **C12**. + 🔴 Nguy nhất **không phải mục thiếu, mà là C6** — nó **trông nghiêm nhất** (binding floor, giao cho vai `reviewer`, có "đếm trước/sau") nhưng **tập-đo rỗng + việc đã làm rồi**. Qua C6 sẽ tạo cảm giác "đã phủ lời-hứa-máy" trong khi **19 câu** họ-diễn-đạt chưa ai sờ tới. + +## 4. Câu chốt B — phép thử 2 (`eval:52`): bịa input chắc-chắn-sai + +### Ca 1 — bịa cho **C6** ⇒ **KHÔNG ĐỎ** (xanh-vì-mù, đã chứng minh bằng số) +Bịa: chèn vào `docs/governance/harness-11-engine.md` câu *"Cổng nén-kết-tinh **tự-động quét** mọi shard mới và **chặn** shard thiếu guard."* — **không có mã nào làm việc đó**. +Chạy acceptance C6 (`grep "máy sẽ"` trên governance SE) → **0 hit → BÁO XANH**. Câu bịa **lọt trọn**. +Bằng chứng hậu thuẫn: literal `"máy sẽ"` trong `docs/governance/` = **0**, trong khi họ-diễn-đạt cùng nghĩa = **19**. ⇒ **C6 không có cách nào đỏ** trên đúng loại lỗi nó sinh ra để bắt. + +### Ca 2 — bịa cho **C1** ⇒ **ĐỎ ĐÚNG** (răng thật) +Bịa: sửa `hmw.js` thành in **vô điều kiện** `log('hmw: 0/0 lane CHẾT (null) — KHÔNG phải "sạch"')`. +- Vế dương (ép 1 lane null → output phải chứa `lane CHẾT`) → **XANH** (lách được nếu chỉ có 1 chiều). +- Vế âm (lane sạch → **KHÔNG** được chứa) → **ĐỎ**. ⇒ C1 **bịt được** ca giả này nhờ **2 chiều**. + +### Ca 3 (bonus) — **C11** ⇒ **KHÔNG ĐỎ** +Đổi `≥ 7 (ngày)` thành `≥ 7 (chu-kỳ)` → `grep 'ngày\|7 day'` = **0 → XANH**, trigger **vẫn đếm tuổi y hệt**. Rời-tập-đo thuần tuý. + +## 5. Đề xuất SIẾT (acceptance mới — mô tả tiêu chí, KHÔNG viết mã hộ) + +| # | Siết thành | +|---|---| +| **C6** | Bỏ neo literal. Tập-đo = **danh sách liệt kê tường minh** các câu-hứa-năng-lực trong `docs/governance/*.md` (mẫu số công bố, hiện đo được **19**), mỗi câu một dòng disposition {mã + lệnh + positive-control ⟂ đã hạ thành dự-định}. **Bắt buộc positive-control**: cắm **1 câu-hứa-giả** vào cây tạm → sweep **phải** nhặt ra. Và tách bạch **use⟂mention** (7 hit hiện có đều là *mention*, không được tính là vi phạm). Deliverable thật của `goi-chot:52` là **câu hỏi thường-trực ở cửa review**, không phải một lần quét ⇒ acceptance nên đo *gate đã cài*, không đo *đã quét xong*. | +| **C11** | **Gỡ khỏi phạm vi em-main** hoặc viết lại: `grep=0` **mâu thuẫn** với `sleep-…l2.md:52` (owner GIỮ 7-ngày) + luật-chung #6 + O-1. Nếu giữ: đo **hành vi** (bơm trạng thái *0 shard chưa-gist nhưng đã 30 ngày* → trigger **phải im**; *3 shard chưa-gist, 0 ngày* → **phải kêu**) thay vì grep chữ. | +| **C12** | Bỏ vế "CLAUDE.md có dòng nêu posture **đang hiệu lực**" (stale-by-construction vs `fable-clone.md:16`). Thay bằng: `CLAUDE.md` trỏ **nơi tra posture**, và phép thử **use**: phiên mới chỉ đọc file luật có **nói đúng posture hiện hành** không (1 ca dương + 1 ca âm). | +| **C7** | Thêm **ngưỡng** (số của **owner** — O-gated, em không tự đặt) để "rẻ" có thể ĐỎ; đổi tập cấm từ liệt-kê-danh-mục sang **bất kỳ tiến-trình ngoài nào** trong đường dừng (nếu không, `pause.md:44` lọt khe). | +| **C10** | Cỡ mẫu **≥3, và ưu tiên thước CHƯA từng fault-inject** (loại trừ các ca S138/S143 đã xanh) — nếu không, phép-thử-2 xanh-do-chọn-mẫu. Bỏ vế "mỗi thước có verdict" khỏi headline (100% do cấu trúc, `eval:32`). | +| **C5** | Thêm **positive-control**: id THẬT đã biết → **phải** ra APPLIED. Không có vế này, matcher chết (luôn 0-hit) đạt C5 tuyệt đối. | +| **C2** | Bỏ `grep -c 'trần lượt'` khỏi acceptance (đếm chữ). Giữ vế "≤3 file/lane" nhưng **khai rõ nó chỉ đo được ở run KẾ** — không phải cổng của run này. Muốn "0 lane chết **vì cháy lượt**" đo được thì cần tín hiệu **phân biệt nguyên nhân**, C1 hiện chỉ biết `null`. | +| **C3** | Thêm **negative-control**: cắm 1 label thiếu {pha·phiên} → phép đọc-lại **phải trượt**. Và neo **artifact** (label phải xuất hiện trong `runs//run.md`) — nếu không thì không tái-lập/không audit được. | +| **C4** | Cấm **tự-kiểm vòng chính mình đo** (`m-3 no-self-exempt` S139); nêu đích danh **con số** bị re-check phải là con số **có thể sai** (không phải hằng số hiển nhiên). | +| **C13** | "Lý-do-không-làm" phải kèm **phân loại** {owner-gated · defer-có-ngày · bác-bỏ-có-bằng-chứng} — nếu không, cửa thoát vô hạn. | +| **C9** | Gỡ mâu thuẫn: hoặc khai *"falsifier `depth-cost:59` vẫn CHƯA đo được, C9 chỉ đóng phần re-ground roster"*, hoặc nêu đơn-vị chung làm cho nó đo được. Không để acceptance đòi thứ chính spec khai bất-khả-đo. | + +## 6. Công bằng (Smart-Friend guard — nói cả chỗ đúng) + +- Spec **re-đo đúng** roster **17** (`ls .claude/agents/` = 18 − README) — không chép số cũ. +- ①(2) `hmw.js:225`, `:114-116`, `:124-125` **khớp đĩa 3/3**. +- P3-3 phát hiện `CLAUDE.md` thiếu posture: **ĐÚNG** (0 hit) — vấn đề nằm ở *cách vá*, không ở *chẩn đoán*. +- Luật-chung #3 (bảng disposition từng dòng) + #4 (ghi đĩa trong lúc làm) là **tự-nhận-thức thật**, và chính #4 cứu lượt này. +- **C1 + C8 là hàng thật** — 2 chiều, đúng chuẩn `eval:31` mà hub tự thú còn thiếu. + +## 7. Cảnh báo phối-hợp (ngoài 4 câu) + +**C1 CẤM `throw` ⟂ C8 ĐÒI `throw`** trong cùng một tài liệu (`spec:53` vs `spec:158`). Hoà giải **có tồn tại nhưng nằm trong mã, không nằm trong spec**: `hmw.js:124` — *"(trước parallel) — halt KHÔNG phụ-thuộc semantics parallel()"* ⇒ C8 chặn **up-front trước `parallel()`** (throw sống), C1 nói về **per-lane trong `parallel()`** (throw bị nuốt thành null). Worker đọc spec đơn thuần sẽ thấy mâu thuẫn ⇒ **nên ghi 1 dòng phân định vào spec** trước khi giao. diff --git a/.claude/workflows/runs/2026-07-22-S144-bootstrap/sub-harvest-curator-1.md b/.claude/workflows/runs/2026-07-22-S144-bootstrap/sub-harvest-curator-1.md new file mode 100644 index 0000000..5aa9d23 --- /dev/null +++ b/.claude/workflows/runs/2026-07-22-S144-bootstrap/sub-harvest-curator-1.md @@ -0,0 +1,193 @@ +# sub-harvest-curator-1 — H2 session-start RE-REPORT S144 (2026-07-22) + +> Vai: harvest-integrity 5-trục · INFORM-only · propose-only (lead = single-writer). +> Giao-thức #53: ghi ĐĨA ngay khi tìm ra, KHÔNG dồn cuối. Return = tóm-tắt trỏ file này. +> HEAD lúc đo: `d5656ab` (2026-07-22 14:08:13 +0700). Giờ đo: 14:15 → (cập nhật dần). + +--- + +## A. Ground-truth đo tươi (đĩa, không chép của lead) + +### A1. Run-folder inventory +- Tổng thư-mục dưới `.claude/workflows/runs/` = **43** (`find -mindepth 1 -maxdepth 1 -type d`). +- Có `run.md` = **40**. Không có `run.md` = **3**: + - `2026-07-14-S117-pe-approve-minmax-range` — spec-only, **by-design** (đã xác lập @S132). + - `2026-07-14-S117-pe-luyke-finalize` — spec-only, **by-design** (đã xác lập @S132). + - `2026-07-22-S144-bootstrap` — **folder phiên NÀY, đang sinh live** (xem A4). + +### A2. Orphan scan C5 — DUAL-ACCEPT (dạng-3 RETIRED, không nhận) +Thuật toán chạy độc-lập: với mọi `d` có `d/run.md` → PASS nếu tồn tại `d/*-synthesis.md` size>0 (dạng-1 phẳng) **hoặc** `d/harvest/*-synthesis.md` size>0 (dạng-2 legacy). + +``` +TOTAL run.md folders = 40 +ORPHAN = 0 +``` + +**VERDICT: XÁC NHẬN ĐỘC-LẬP số của lead — orphan 0/40.** (Mẫu-số của tao = 40, tăng từ 37 @S140 do +3 folder S141/S142/S143. m#12: mẫu-số có NGÀY-ĐO — 40 là số lúc 14:15 ngày 2026-07-22, chưa tính S144-bootstrap vì folder này chưa có `run.md`.) + +### A3. Placement + Corruption sơ-bộ (2 trục quét-máy) +- Role-dir dưới `.claude/agent-memory/` = **17** (đếm bằng `find -mindepth 1 -maxdepth 1 -type d`, **guard m#11** — không dùng `cut -d/ -f3` vì nuốt file root-level `memory-budget.json`/`.mfe-state.json`). +- **0 file 0-byte** dưới toàn `.claude/agent-memory/` (`find -type f -size 0` → rỗng). ⇒ Không tái bug #53-zero-byte kiểu S45. +- **0 empty-dir** dưới toàn `.claude/` (`find .claude -type d -empty` → rỗng). ⇒ m#13 (git MÙ dir rỗng) sạch; không có stray cwd-relative kiểu S54/S119. +- `git status --porcelain -- .claude/agent-memory` = **rỗng tuyệt đối** ⇒ 0 delta mồ-côi dạng uncommitted trong agent-memory. +- Porcelain repo-wide chỉ 3 mục: ` M .claude/governance/.session-counter.json` · `?? .claude/scheduled_tasks.lock` · `?? runs/2026-07-22-S144-bootstrap/` — cả 3 đều là **live-state phiên đang chạy**, không phải residue. + +### A4. 🔴 LIVE mid-flight observation (bắt được nhờ đo 2 lần cách nhau ~1 phút) +- 14:14:02 — `runs/2026-07-22-S144-bootstrap/` tồn-tại nhưng **RỖNG** (`ls -la` chỉ có `.`/`..`; `find -type d -empty` cùng lượt KHÔNG báo → đã có tranh-chấp thời-điểm). +- 14:14:32 — xuất-hiện `sub-tooling-auditor-1.md` **1778 B**. +- 14:15:08 — vẫn **chưa có `run.md`**. +⇒ Đây là **folder bootstrap dạng sub-md-first** (sub ghi trước, `run.md`/synthesis do lead đóng sau). KHÔNG xếp orphan (chưa có `run.md` ⇒ ngoài mẫu-số C5 theo đúng định-nghĩa folder-scan). **Chỉ thành orphan nếu cuối phiên có `run.md` mà thiếu `*-synthesis.md`** → đề-nghị lead kiểm lại ở close-gate. + +--- + +## B. Trio-memory 3 vai mới (harness-eval / harness-refine / harness-audit) + +**Trạng-thái: CÓ diary, và là trạng-thái ĐÚNG — KHÔNG phải gap.** + +| Vai | Path | Byte | mtime | Commit sinh | +|---|---|---|---|---| +| harness-eval | `.claude/agent-memory/harness-eval/MEMORY.md` | **1547** | 2026-07-20 18:31 | `2757e41` (A = added) | +| harness-refine | `.claude/agent-memory/harness-refine/MEMORY.md` | **1616** | 2026-07-20 18:31 | `2757e41` (A) | +| harness-audit | `.claude/agent-memory/harness-audit/MEMORY.md` | **1513** | 2026-07-20 18:31 | `2757e41` (A) | + +- Cả 3 = **seed-tại-adopt** (không phải diary rỗng): có đủ `Role baseline` + `Split boundary` + `Luật cứng` + `Nhật-ký`. +- Dòng nhật-ký duy nhất, giống nhau cả 3: `S141 (2026-07-20) seed khi adopt khuôn hub 58e28bae — CHƯA chạy lần nào; first-run chờ restart-CLI + spawn-probe + anh consent.` +- ⇒ **Tự-khai "CHƯA chạy lần nào" KHỚP thực-tế đĩa**: 0 run-folder nào có `sub-harness-{eval,refine,audit}*.md`. Spawn-probe ALIVE phiên này = probe, không phải task thật ⇒ **không sinh nghĩa-vụ harvest**. +- 🟢 **Điểm tốt đáng ghi:** 3 vai này khai boundary `NOT (nhường): harvest-op → harvest-curator H2` — ranh-giới với tao rõ, **0 double-touch**. (`harness-refine` còn cắm cảnh-báo "RANH SẮC — dễ lẫn" với `lead-omission-auditor`.) + +--- + +## C. Trục COVERAGE — 0 silent-miss (mọi sub/run đã-chạy đều có vết harvest) + +### C1. Ai NỢ diary, ai KHÔNG — luật phân-định lấy từ ĐĨA +`hmw.js:181` (đọc tươi): ``const subMd = wave ? `${wave.dir}/sub-${role || 'task'}-${i}.md` : null`` +⇒ **Tên file = bằng-chứng vai:** `sub--.md` = role-agent (CÓ diary, NỢ spawn-record) · `sub-task-.md` = **role-less** (inherit lead, **KHÔNG nợ diary** — by-design). + +### C2. Bảng coverage 3 run gần nhất (S141 · S142 · S143) + +| Run | Artifact trên đĩa | Vai | Nợ diary? | Vết harvest | Verdict | +|---|---|---|---|---|---| +| S141 | `sub-task-0.md` 2427B · `sub-task-1.md` 2858B | **role-less** (tên `task`) | ❌ KHÔNG | — (`implement-vong1-synthesis.md` 3263B partial-honest) | ✅ | +| S141 | `sub-reviewer-fable-spec.md` 18297B | reviewer | ✅ CÓ | entry `S141 (07-20) fable-real gate SPEC…` — nay ở `reviewer/archive/2026-07.md` (moved @S143-curate) | ✅ | +| S141 | 5-lane `/fable-clone invest` (lens-1→5, không có sub-md riêng) | investigator-codebase | ✅ CÓ | `investigator-codebase/MEMORY.md` M @`2757e41`, mtime 07-20 17:55 | ✅ | +| S142 | `sub-task-0.md` 16978B · `sub-task-1.md` 22901B | **role-less** (run.md tự khai *"2 lane, role-less → inherit lead"*) | ❌ KHÔNG | `implement-synthesis.md` 4150B | ✅ | +| S143 | `sub-reviewer-0.md` 18205B | reviewer | ✅ | `reviewer/MEMORY.md:3` tag `[s143, outward-gate-fail, …]` | ✅ | +| S143 | `sub-lead-view-1.md` 5744B | lead-view-auditor | ✅ | diary tag `[s143, deep-force-fire-som, …]` (**on-behalf**, `c4903dd`) | ✅ | +| S143 | `sub-lead-omission-2.md` 10027B | lead-omission-auditor | ✅ | `:25` tag `[s143, deep-1, …]` | ✅ | +| S143 | `sub-harvest-3.md` 13200B | harvest-curator | ✅ | `harvest-curator/MEMORY.md` entry S143 | ✅ | +| S143 | `sub-tooling-4.md` 13896B | tooling-auditor | ✅ | diary tag `[s143, drift-found-4, …]` | ✅ | +| — | trio `harness-{eval,refine,audit}` | 3 vai mới | ❌ (0 task thật) | seed-diary tự khai "CHƯA chạy" **khớp đĩa** | ✅ | + +**COVERAGE = ✅ PASS — 0 silent-miss.** 5/5 sub S143 (đúng 5 vai garble) đều có vết diary; 0 vai role-agent nào chạy mà im. + +### C3. 🔴 BẪY coverage suýt sinh dương-giả (m#16 MỚI — đề-xuất ghi Methods) +`S141/sub-task-0.md:3` tự khai **"Vai: implementer-backend"** — nhưng **tên file là `sub-task-0`** ⇒ lane role-LESS. +Đối-chứng: `implementer-backend/MEMORY.md` mtime **2026-07-18 00:47** (không đổi từ S140-era) — nếu tin dòng self-label, tao sẽ kết "implementer-backend nợ entry S141" = **dương-giả**. +⇒ **m#16: nhãn-vai TRONG thân sub-md = mô-tả CHỨC-NĂNG, KHÔNG phải bằng-chứng spawn. Thẩm-quyền vai = TÊN FILE (`hmw.js:181`).** Cùng họ m#4 ("commit-stat có-append ≠ có-fanout-record"). + +--- + +## D. Trục PLACEMENT + DELTA MỒ-CÔI — 0 mồ-côi, 3/3 FLAG S143 Đà ĐÓNG + +### D1. Mồ-côi dạng "chưa commit" +`git status --porcelain -- .claude/agent-memory` = **RỖNG** ⇒ 0 delta chờ. Mọi APPEND S143 đã vào 4 commit: `2757e41` · `36cefcc` · `c4903dd` · `a1e2416`. + +### D2. Mồ-côi dạng "nằm lại trong sub-*.md, không lên diary" — soi từng FLAG S143 của chính tao +| FLAG @S143 | Trạng-thái ĐO LẠI HÔM NAY | Verdict | +|---|---|---| +| **F1 MED** counter-claim-vs-đĩa (2 diary H24 khai `class_repeat` mà `.session-counter.json` chưa) | `.session-counter.json` nay có **6/6 khớp EXACT**: `view-residual-asym:1` · `view-stale-status:0` · `gap-carry-dropped:1` · `gap-owner-specifics:2` · `gap-decision-sunk:1` · `gap-incident-unrecorded:0` — đúng từng con-số 2 diary khai | 🟢 **CLOSED** | +| **F2 LOW** stray git-MÙ `broadcasts/.claude/…` rỗng (lớp S54, `porcelain --ignored` IM) | **quét REPO-WIDE** (không chỉ `.claude/`): `find . -type d -name .claude` → **CHỈ `./.claude`**; empty-dir toàn repo = 3, đều tool-cache (`.vs/sd` · `fe-admin|fe-user/node_modules/.vite-temp`) — 0 dính memory | 🟢 **CLOSED** | +| **F3 MED** sửa-một-phía (index ×23 vs topic-file ×20) | `auto-memory/MEMORY.md:34` = **×25** · `feedback_agent_return_garble_recover.md` = **"+ S143 ×5 = ×25 tổng"** ⇒ **2 phía khớp** | 🟢 **CLOSED** | + +### D3. Finding của 4 vai kia có lên diary/hành-động không (mẫu 4 điểm) +- reviewer → đề-xuất **errata** (CẤM sửa file đã stamp): `docs/changelog/sessions/2026-07-22-1455-S143-tiep-closeout-audit-errata.md` sinh @`a1e2416` + gửi @`39cc060`. ✅ LANDED. +- lead-view 4 site "roster/NO-Write" → `36cefcc` chạm `.claude/agents/README.md` (+7/−…) + `docs/STATUS.md`. ✅ LANDED. +- lead-omission `gap-incident-unrecorded` (xin owner mở enum) → **enum canonical `memory-budget.json.lead_self_audit.flag_classes` nay = 11 phần-tử** (đo bằng `json.load` → `['view-stale-count','view-stale-status','view-stale-header','view-stale-role-desc','view-residual-asym','gap-carry-dropped','gap-carry-aged','gap-owner-specifics','gap-decision-sunk','gap-underfill','gap-incident-unrecorded']`). ✅ LANDED. +- tooling F-B enum 10→11 → 3/3 site khớp canonical: `STATUS:450` *"11 class = 5+6"* · `hmw.js:33` *"11 class: 5 view-* + 6 gap-*"* · budget=11. ✅ LANDED. +- tooling **F-A LOW carry** (`skills/ef-core-migration/SKILL.md` còn *"Mig 27-66"* — **grep = 2 occurrence, VẪN CÒN**) → chính tooling xếp *carry monthly-lane*, **có chủ-đích hoãn**, không phải rơi. 🔶 **OPEN by-design — lãnh-địa H1 `tooling-auditor`, tao KHÔNG chấm.** + +**PLACEMENT = ✅ PASS · DELTA MỒ-CÔI = 0.** 17/17 role-dir có `MEMORY.md`, 0 delta lạc nhà, 0 stray, 0 empty-dir memory. + +--- + +## E. Trục FIDELITY — PASS (0 bịa) + 2 nit nhãn-thời-điểm (INFORM, KHÔNG escalate) + +Tao **tự re-chạy** 3 claim load-bearing, không tin lời khai: + +**Probe-1 — reviewer, class `bằng-chứng-tự-huỷ-sau-squash`** (claim: `1a0fa59`/`a458102` là commit-object nhưng dangling sau squash; `2757e41` sống): +``` +1a0fa59 type=commit is-ancestor-of-HEAD=NO branch--contains=(EMPTY) +a458102 type=commit is-ancestor-of-HEAD=NO branch--contains=(EMPTY) +2757e41 type=commit is-ancestor-of-HEAD=YES branch--contains=* main +``` +⇒ **KHỚP 3/3, GROUNDED.** Claim mạnh nhất phiên S143 đứng vững khi tao đo độc-lập. +🔎 Hệ-quả sống: `.session-counter.json` (bản committed) từng ghi `last_ticked_head = 1a0fa59de2e…` = **đúng commit đã chết** ⇒ cùng CLASS reviewer vừa đặt tên. Nay tick S144 đã thay bằng `d5656ab` (reachable). Ghi nhận, không tính lỗi mới. + +**Probe-2 — 2 diary H24 vs `.session-counter.json`:** 6/6 giá-trị khớp exact (bảng D2/F1). + +**Probe-3 — sổ đếm garble:** index ×25 == topic-file ×25 ⇒ 0 lệch 2 phía. + +### 🔴 2 nit nhãn-THỜI-ĐIỂM (không phải bịa — số đúng LÚC ghi, thiếu mốc as-of) +- **N1 (LOW, trong memory):** `lead-omission-auditor/MEMORY.md:25` khai *"3/3 sub garble #53 phiên này"*. Đúng lúc 13:10 (mới 3 sub chạy), nhưng chốt phiên = **5/5**. Diary **không có mốc as-of** ⇒ người đọc sau dễ trích sai. **Đề-xuất lead APPEND-sửa nhãn** (không xoá): thêm `(số lúc 13:10; chốt cuối phiên = 5/5)`. Trớ trêu: chính `feedback_agent_return_garble_recover.md` data-point **(c)** đã đặt tên cho bẫy này — *"cập-nhật tally ở CUỐI phiên, đừng giữa phiên"*. +- **N2 (LOW, NGOÀI memory — báo để không lan sang bề-mặt S144):** **brief giao việc phiên này ghi "Sổ đếm garble ×23"**. Đĩa = **×25** (đã sửa @`a1e2416`). ×23 chính là con-số mid-session mà đĩa đã tự khai là sai. Memory ĐÚNG, brief STALE ⇒ đừng để ×23 chảy vào STATUS/HANDOFF/email S144. + +**FIDELITY = ✅ PASS — 0 fabrication, 0 claim không truy được về đĩa ⇒ KHÔNG escalate `reviewer`.** (Tiêu-chí S143 giữ nguyên: beyond-source ≠ bịa, miễn truy được về đĩa + có khai nguồn.) + +--- + +## F. Trục CORRUPTION — PASS 4/4 phép đo + +1. **U+FFFD** (m#6: đo bằng literal U+FFFD, **CẤM** heuristic `Ã|ư|â€` = máy-đẻ-dương-giả trên UTF-8 tiếng Việt): **6 hit / 4 file**, TẤT CẢ là quoted-evidence trong entry lịch-sử (m#9) — `cicd/archive/2026-06.md:26` · `harvest/archive/2026-06.md:3,12,13` (dòng 3 **tự khai** *"NOTE: chứa U+FFFD quote"*) · `harvest/archive/2026-07.md:24` · `harvest/MEMORY.md:48` (entry S132 trích `"�24.1KB"` làm chứng-cứ m#6). + **Chứng minh KHÔNG phải hư mới:** `git show a1e2416^:…/harvest-curator/MEMORY.md | grep -c` = **1** ; HEAD = **1** ⇒ delta 0. +2. **iconv round-trip UTF-8**: **VALID 8/8** (5 diary chạm hôm nay + 3 seed trio). +3. **0-byte**: 0 file / toàn `.claude/agent-memory` ⇒ không tái #53-zero-byte (S45). +4. **moved-not-cut** — curate DUY NHẤT hôm nay = `reviewer` @`36cefcc` (L1 26.5KB→17784B): + - 20 dòng bị gỡ khỏi L1 = **4 stub-pointer** (m#15: `[→ archive/… @Sxxx]`, nội-dung đã ở archive từ trước → nén 4 stub thành 2 digest-stub, **KHÔNG tính cut**) + **16 dòng nội-dung**. + - **16/16 dòng nội-dung tìm thấy BYTE-IDENTICAL** (`grep -Fqx`) trong `reviewer/archive/2026-07.md` dưới marker `## [BATCH S143-curate … moved-not-cut]`. **CUT-NOT-MOVED = 0.** + - **dead-pointer check** 2 digest-stub: `S139 (07-18)`=1 hit · `S134b (07-17)`=1 · `S133 (07-17)`=1 · `S124`=3 · `S125`=5 trong archive ⇒ **0 con-trỏ chết** (lớp tao bắt @S102). + +### 🔴 Bug tự-bắt trong CHÍNH phép đo của tao (m#14-EXT — đề-xuất ghi Methods) +Lượt 1 chạy `grep -Fqx "$line"` với `$line` bắt đầu bằng `-` ⇒ shell/grep nuốt làm **option** (`grep: unknown option --`) ⇒ báo **13/16 "CUT-NOT-MOVED"** = **dương-giả 100%**. Chạy lại `grep -Fqx -e "$line"` ⇒ **0**. +⇒ **m#14-EXT: dòng-diff mở đầu bằng `-` đã phá grep ở 3 hình-dạng khác nhau (m#5 filter · m#14 diff-extract · nay m#15 moved-not-cut). Mọi so-khớp dòng-diff PHẢI dùng `-e`/`--`.** Nếu tin lượt-1, tao đã báo lead một cáo-buộc "reviewer cut-not-moved 13 dòng" HOÀN TOÀN SAI. + +--- + +## G. Chore-memory (byte đo tươi, cap canonical từ `memory-budget.json`) + +Cap canonical: `tiers.l1_hot.autoinject_cap_bytes = 25600` · `soft_cap_bytes = 30720` · `archive_gate.low_watermark_ratio = 0.85` (→ 21760). + +| Role | L1 bytes | vs cap 25600 | +|---|---|---| +| **investigator-codebase** | **26624** | 🔴 **VƯỢT auto-inject cap +1024B** → phần đuôi L1 KHÔNG inject; archive-gate due | +| cicd-monitor | 22607 | 🟠 >85% watermark (WATCH) | +| test-specialist | 22140 | 🟠 >85% (WATCH) | +| frontend-designer | 21492 | 🟢 sát watermark | +| implementer-backend | 19449 | 🟢 | +| tooling-auditor | 18534 | 🟢 (>self-target 17.1K của vai đó) | +| reviewer | 17784 | 🟢 (vừa curate; nhỉnh 274B trên self-target 17.1K vai đó) | +| **harvest-curator (tao)** | **17175** | 🟢 **DƯỚI self-target 17510** | + +Còn lại (database-agent 7388 · investigator-api 8510 · office-document 3323 · lead-omission 9680 · lead-view 6610 · implementer-frontend 15951 · trio 1513/1547/1616) đều thoáng. + +--- + +## H. VERDICT TỔNG 5 TRỤC — @session-start S144 + +| Trục | Verdict | Neo bằng-chứng | +|---|---|---| +| **Coverage** | ✅ **PASS** | 5/5 sub S143 có vết diary · role-less lane 4/4 không nợ (hmw.js:181) · trio 0-task-0-nợ · orphan **0/40** | +| **Completeness** | ✅ **PASS** | 5 entry S143 đủ 4-field-tương-đương {task-scope · verdict · learned · surprise/tag}; mỗi entry trỏ `runs/…/sub-*.md` chi-tiết | +| **Placement** | ✅ **PASS** | 17/17 role-dir có MEMORY.md · porcelain agent-memory RỖNG · 0 stray `.claude` repo-wide · 0 empty-dir memory | +| **Corruption** | ✅ **PASS** | FFFD 6 = quoted-evidence (delta 0) · iconv 8/8 VALID · 0-byte 0 · moved-not-cut **16/16 byte-identical, cut=0** · 0 dead-pointer | +| **Fidelity** | ✅ **PASS (STRONG)** | 3/3 probe re-chạy độc-lập KHỚP (dangling-commit 3/3 · class_repeat 6/6 · tally 2/2) · 0 bịa ⇒ **không escalate reviewer** | + +**TỔNG: 🟢 ALL-CLEAN 5/5 — 0 delta mồ-côi, 0 orphan/40.** + +### Propose cho lead (INFORM-only, lead VERIFY→APPEND) +1. **P1 (LOW)** APPEND nhãn as-of vào `lead-omission-auditor/MEMORY.md:25` — *"3/3 sub garble"* → thêm `(số lúc 13:10; chốt cuối phiên 5/5)`. **KHÔNG xoá** câu gốc. +2. **P2 (LOW, ngoài memory)** Brief S144 ghi *"garble ×23"* — đĩa = **×25**. Chặn trước khi lan sang STATUS/HANDOFF/email S144. +3. **P3 (MED, chore)** `investigator-codebase/MEMORY.md` **26624B > 25600** cap ⇒ đề-xuất chạy archive-gate/curate L1→L2 (moved-not-cut + seal-verify). +4. **P4** Ghi 2 method mới vào diary tao: **m#16** (nhãn-vai trong thân sub-md ≠ bằng-chứng spawn; thẩm-quyền = tên file `hmw.js:181`) · **m#14-EXT** (dòng-diff mở đầu `-` phá grep ở 3 hình-dạng ⇒ luôn `-e`/`--`). +5. **P5 (nhắc close-gate)** `runs/2026-07-22-S144-bootstrap/` hiện **chưa có `run.md`** ⇒ đang NGOÀI mẫu-số orphan. Khi lead đóng `run.md`, folder vào mẫu-số ⇒ **phải kèm `*-synthesis.md` size>0** kẻo tự sinh orphan đầu tiên sau 40 run sạch. +6. **P6 (bàn giao H1)** `skills/ef-core-migration/SKILL.md` còn *"Mig 27-66"* ×2 — tooling-auditor đã xếp carry monthly-lane; **lãnh-địa H1**, tao chỉ chuyển tiếp. + diff --git a/.claude/workflows/runs/2026-07-22-S144-bootstrap/sub-tooling-auditor-1.md b/.claude/workflows/runs/2026-07-22-S144-bootstrap/sub-tooling-auditor-1.md new file mode 100644 index 0000000..aeb13a9 --- /dev/null +++ b/.claude/workflows/runs/2026-07-22-S144-bootstrap/sub-tooling-auditor-1.md @@ -0,0 +1,201 @@ +# H1 tooling-auditor — S144 session-start RE-REPORT + +- **Phiên:** S144 (2026-07-22) · **HEAD:** `d5656ab` (wal flush) · baseline so sánh = S143 +- **Vai:** tooling-freshness 4 mặt · INFORM-only · propose-only (lead = single-writer) +- **Giao-thức #53:** ghi đĩa NGAY khi tìm ra từng phát-hiện. File này = nguồn thật; return chỉ là tóm-tắt. +- **Model self-report:** Opus 4.8 (`claude-opus-4-8`) + +--- + +## Đo thô (ground-truth từ đĩa) + +| Lớp | Số | Nguồn | +|---|---|---| +| skill project | 6 | `ls .claude/skills/` (trừ README.md) | +| skill standalone | 23 | `ls ~/.claude/skills/` | +| command-file | 18 | `ls .claude/commands/*.md` | +| agent persona | **17** | `ls .claude/agents/*.md` = 18 file − README.md | +| plugin registered | 18 | `~/.claude/settings.json` enabledPlugins | +| plugin enabled | 15 | 18 − 3 false | +| plugin disabled | 3 | pr-review-toolkit · code-modernization · hookify | +| marketplace | 37 | `~/.claude/plugins/marketplaces/claude-plugins-official/plugins` | + +Git working tree: chỉ `M .claude/governance/.session-counter.json` + `?? .claude/scheduled_tasks.lock` (untracked lock). + +--- + +## ③ PLUGIN — PASS (0 delta) + +- 18 registered / 15 enabled / 3 disabled — **IDENTICAL S143**, 0 install/enable/disable mới. +- Marketplace **37** — bằng số S143 đã đo (S143 bắt delta 35→37; nay đứng yên) ⇒ 0 skill/plugin MỚI cần phân-bổ. +- `settings.json:11` `"model": "claude-opus-4-8[1m]"` — lead pin GIỮ NGUYÊN so S143. +- `effortLevel: xhigh` (:39) không đổi. +- Nấc báo: installed 18 → enabled 15 → assigned (theo skill-matrix agents/README) → used. KHÔNG conflate. + +**⇒ new-alloc: 0 action.** Không có plugin/skill mới rơi vào giỏ chưa-phân-bổ. + +--- + +## 🔴 F-1 (MED) — `/sleep-recovery-memory-l2` bỏ sót trio: cùng lớp "ghost-enum" S143 + +**File:** `.claude/commands/sleep-recovery-memory-l2.md` — 3 site sai, 1 site đúng-đừng-đụng. + +Roster 14→17 (+trio `harness-eval`/`harness-refine`/`harness-audit`, land S142) nhưng command này chưa theo. + +| Site | Text hiện tại | Thực tế đĩa | +|---|---|---| +| `:37` | regex loại-trừ `^(tooling-auditor\|harvest-curator\|lead-view-auditor\|lead-omission-auditor)$` | chạy THẬT hôm nay → **13 tên**, gồm cả 3 trio | +| `:40` | "Hiện-hành = …" liệt-kê đúng **10 tên** | mâu-thuẫn `:37` (13) — 2 dòng cạnh nhau đá nhau | +| `:42` | "**4 monitor** INFORM-only KHÔNG vào `all`" | 7 vai INFORM-only (4 + trio) | +| `:58` | "`all` → **9 sub** có-ký-ức SE" | sai từ TRƯỚC trio: `:43` (vá S122) tự khai con số 9 là stale, sửa `:40`→10 nhưng **quên `:58`** ⇒ nay lệch kép | + +**Bằng chứng trio cùng lớp monitor** — `.claude/agents/harness-eval.md:4`: *"Read-only INFORM-only … Propose-only, single-writer = lead. KHÔNG store_memory, KHÔNG Write/Edit"* → đúng tiêu-chí loại-trừ như 4 vai kia. + +**Vì sao MED không HIGH (hiệu-ứng hiện chỉ tiềm-ẩn):** trio CHƯA có `archive/` — chỉ `MEMORY.md` ~1.5KB mỗi vai (`ls` xác nhận; `memory-budget.json:159-161` `l2_verbatim: 0`, rollout "no archive"). Phase 0.2 guard-rỗng sẽ skip ⇒ chạy `all` hôm nay **chưa hỏng**. Nhưng khi trio có archive đầu tiên, `all` sẽ nuốt chúng **không ai quyết**. + +**Site KHÔNG được sửa (đừng vá nhầm):** `:45` "Ghi-chú S122 … đếm 16 thay vì 14" = ghi-chú CÓ NGÀY, record lịch-sử → **frozen-in-time, sửa = giả-mạo** (luật prescriptive⟂frozen S143). `:44` "đo S71: 4" cũng vậy. + +**Đề-xuất (lead quyết):** thêm 3 tên vào regex `:37` + sửa `:40` (giữ 10) + `:42` "4 → 7 monitor" + `:58` bỏ số cứng, trỏ "quét đĩa". 🔴 Nhưng **"trio có thuộc diện loại-trừ không" = quyết-định owner**, không phải tao suy ra — tao chỉ chứng minh 4 site đang tự mâu-thuẫn. + +### F-1 đắt ở chỗ này: đúng bản vá S143, sót đúng 1 file + +`runs/2026-07-22-S143-closeout-audit/sub-reviewer-0.md:250` ra lệnh: *"Vá `agents/README.md:225` (thêm 3 trio + **'4 monitor'→7**)"*. Bản vá Đà LÀM — `README.md:225` nay đọc *"Cả **7 monitor** đều INFORM-only"* ✅. Nhưng **cụm chữ y hệt** ở `sleep-recovery-memory-l2.md:42` không ai sờ tới. + +⇒ Không phải drift mới sinh, mà là **same-class-miss của chính bản vá vừa rồi** — trùng khuôn S126 (sweep liệt-kê consumer thiếu một lớp) và khuôn S143 F-B (ghost-enum). Lớp `.claude/commands/` lại là chỗ sót, **lần thứ 3** (S57 · S99 · S126 đều bắt ở đây). + +**Luật rút cho lần sau:** vá một CỤM CHỮ ⇒ grep chính cụm chữ đó toàn repo, đừng vá theo danh-sách-site do phiên trước liệt-kê. + +--- + +## ① SKILL — PASS_WITH_FLAGS (1 drift thật, 1 dương-giả) + +6 project + 23 standalone + 18 command = **0 thêm/bớt/đổi tên** vs S143. `git diff` thư-mục `.claude/skills/` từ S142 tới HEAD = **rỗng**. Map vai: skill-matrix `agents/README` đã vá 15→17 @S143 ✅. + +### 🔴 F-2 (MED) — `ef-core-migration` tự nhận là nguồn "mới nhất" rồi để lỡ Mig 67 + +- `.claude/skills/ef-core-migration/SKILL.md:19` tự khai: *"Migration history (số hiện tại → `docs/STATUS.md` canonical; **mới nhất = row cuối bảng**)"* — tức file này **tự nhận quyền** trả lời "mig mới nhất là gì". +- Row cuối bảng = `:88` **Mig 66** `AddPeApprovedPriceRange`. +- Đĩa: **67** migration (`ls Persistence/Migrations/*.cs` trừ Designer/Snapshot), mới nhất `20260717032812_AddPeApprovedBudgetSnapshot` = **Mig 67**, land S133 (2026-07-17, 5 ngày trước). +- `grep "67\|ApprovedBudgetSnapshot"` trong SKILL.md → **0 hit**. Mig 67 vắng mặt hoàn toàn. +- Site khác đã ĐÚNG: `CLAUDE.md:62` có "12,13,15,49,50,52-61,**65-67**" + tả Mig 67 đầy đủ ⇒ **chỉ mình skill tụt lại**. +- Lây sang `.claude/skills/README.md:20`: nhãn *"✅ Updated S117 … Mig 66 … row added"* nay cũng cũ. + +🔴 **Bài học đáng giữ:** B1 (derived-trỏ-canonical) áp ĐÚNG cho *con số* — nhưng file vẫn ôm nhiệm-vụ thứ hai ("mới nhất") mà không bảo-trì. **Trỏ-được-một-nửa nguy hơn không trỏ**: người đọc thấy có anti-drift banner rồi tin cả dòng. + +**Đề-xuất:** thêm row Mig 67 vào bảng + cập nhãn `skills/README:20`. + +### F-3 (LOW — tao xếp DƯƠNG-GIẢ, đừng vá số) + +Detector flag `form-engine/SKILL.md:15` anchor `2026-04-30` (83 ngày). **Tao kiểm nội-dung, không kiểm tuổi** — và 2 claim của nó vẫn ĐÚNG hôm nay: + +| Claim SKILL.md | Kiểm chứng | +|---|---| +| "Missing: loop `{{#loop}}` cho table lặp" | `src/Backend/SolutionErp.Infrastructure/Forms/DocxRenderer.cs:10` — *"Không support `{{#loop}}...{{/loop}}` (table lặp)"* ⇒ vẫn chưa làm ✅ | +| "Export PE phiếu PDF (Phase 9 carry over)" | `CLAUDE.md:62` cuối dòng — *"Export PDF pending"* ⇒ vẫn pending ✅ | + +⇒ **Tuổi ≠ ôi**. Skill này cũ vì mảng nó tả **thật sự không đổi**, không phải vì bị bỏ quên. Vá ngày tháng cho detector im = đúng nghĩa Goodhart (rời tập-đo mà không sửa gì thật). Đề-xuất: **giữ nguyên**, hoặc chỉnh detector đo nội-dung thay vì đo tuổi. + +`contract-workflow/SKILL.md` (last-touch 2026-05-08): các số trong đó là **Mig 16/18-20 lịch-sử phase 9** — record quá-khứ, không phải claim hiện-hành ⇒ frozen, **không vá**. + +--- + +## ② ROSTER — PASS (17 = 17 = 17 = 17 = 17, khớp 5 nguồn) + +| Nguồn | Số | Bằng chứng | +|---|---|---| +| đĩa `.claude/agents/*.md` | **17** | 18 file − `README.md` | +| `docs/STATUS.md:450` | **17** | row `\| Sub-agents \| **17** \|` | +| `hmw.js:22-39` VALID_ROLES | **17** | đếm phần tử: 10 product + 4 monitor + 3 trio | +| `agents/README.md:225` | **17** | liệt-kê TÊN, đếm ra 17 + "Cả 7 monitor" | +| `.claude/agent-memory/*/` | **17** | 1 dir/vai, đủ cả trio | + +**Đợt vá S143 giữ được:** `README:27` "Roster THẬT" nay có đủ 🧪×3 trio ✅ · `README:225` VALID_ROLES đủ 17 + "7 monitor" ✅ · `README:3` + `:5` dùng con-trỏ B1 **không chép số** ✅ · `hmw.js:33` "11 class = 5 view-* + 6 gap-*" ✅ · `hmw.js:44` "17/17 frontmatter" ✅ · `session-start.md:97` + `session-end.md:152` liệt-kê NHÓM "10 product/quality + (H1 · H2 · 2×H24 · **3×trio-memory**)" ✅. + +**Grep 2 chiều (theo yêu-cầu, chống bẫy S143):** theo SỐ (`roster 14|14/14|14 vai|4 monitor|10 product`) **và** theo TÊN (`lead-view-auditor` có mà `harness-eval` vắng ⇒ nghi-can). Phép theo-TÊN chính là cái lôi F-1 ra — phép theo-SỐ **không bắt được `:37`** vì regex đó thuần tên. Xác nhận lại bài S143: **grep-theo-SỐ một mình là không đủ.** + +Còn lại toàn bộ hit "14" đều nằm ở **record lịch-sử** (session-log · adap-report outbox · run-folder S143 · `auto-memory/project_*` mô-tả mốc S124) ⇒ **frozen-in-time, KHÔNG vá**. + +--- + +## ④ DOCS — PASS_WITH_FLAGS + +### Số canonical vs đĩa — tao đo lại, KHÔNG chép mồi lead + +| Hạng mục | STATUS ghi | Tao đo tươi | Kết | +|---|---|---|---| +| Migration | Mig 67 | `ls Persistence/Migrations/*.cs` trừ Designer/Snapshot = **67**, mới nhất `20260717032812_AddPeApprovedBudgetSnapshot` | ✅ | +| gotcha | 83 | `grep -c "^### [0-9]" docs/gotchas.md` = **83** | ✅ | +| Test | `:446` 528 PASS (45 Domain + 483 Infra, 0 fail/0 skip) | 45+483 = **528** cộng khớp; commit code cuối `6664a61` (2026-07-17) ghi 520→528, S141–S143 governance-only 0 code ⇒ nhất-quán | ✅ | +| Bảng | 89 | Mig 67 = snapshot-AddColumn **no new table** ⇒ 89 giữ, count-invariant | ✅ | +| Roster | 17 | khớp 5 nguồn (mặt ②) | ✅ | +| menu | 54 | 🔸 **tao KHÔNG kiểm được** — cần DB/seed runtime, ngoài tầm read-only của tao. Khai thẳng là **chưa verify**, không tick bừa | + +`docs/HANDOFF.md:5` stamp **2026-07-22 (S141–S143)**, phản-ánh đúng roster 14→17 · test 528 · 0 mig · bundle FROZEN + 14 carry + NEXT-anh đánh số ⇒ **kịp-thời** ✅. + +### 🔴 F-4 (MED · CARRY-OPEN từ S143 F-C, KHÔNG phải phát-hiện mới) — nhãn lead-model + +Sự thật đĩa: `~/.claude/settings.json:11` = `"model": "claude-opus-4-8[1m]"`. +Ô canonical `docs/STATUS.md:450` §Sub-agents vẫn viết: *"em main **Fable 5 (1M) Max**"*. + +**Kết quả sweep prescriptive (4 site, tao đọc từng dòng — chỉ 1 site sai):** + +| Site | Nội dung | Phán | +|---|---|---| +| `docs/STATUS.md:450` | "em main Fable 5 (1M) Max" = khẳng-định trạng-thái HIỆN-HÀNH | 🔴 **STALE** | +| `.claude/commands/session-start.md:43` | outage-recipe: lỗi `claude-fable-5[1m]` → fallback `/model claude-opus-4-8[1m]` | 🔴 **NO-OP** — bảo đổi sang đúng cái đang pin | +| `.claude/commands/session-start.md:41` | "Lead = frontier-class ANH CHỌN per-session **{Fable 5 \| Opus 4.8}**" | ✅ ĐÚNG — đây là **thực-đơn lựa-chọn**, không phải khẳng-định hiện-trạng | +| `.claude/agents/README.md:5` | "Lead runtime = per-session owner-choice (Fable ↔ Opus); flip-chain canonical → STATUS §Sub-agents" | ✅ ĐÚNG — con-trỏ B1, không chép nhãn | +| `docs/governance/fable-real-runbook.md:499` | `LEAD_MODEL` = `claude-fable-5[1m]` **HOẶC** `claude-opus-4-8[1m]` (probe per-session) | ✅ ĐÚNG — spec biến, liệt kê cả 2 trị | + +🔴 **Đảo chiều đáng ghi:** thường drift chảy canonical → derived. Ở đây **NGƯỢC**: 3 site derived viết theo lối "owner-choice / con-trỏ" nên **sống sót cú flip mà không cần sửa gì** — đúng như B1 thiết kế. Chính **ô canonical** là chỗ tụt lại. Hệ quả: mọi con-trỏ trỏ về `STATUS §Sub-agents` giờ **resolve ra câu trả lời sai**, dù bản thân con-trỏ viết đúng. + +⇒ Bài: B1 chống được drift-lan-toả, **không** chống được canonical-tự-ôi. Ô canonical cần chính nó có nguồn đối-chứng (ở đây = `settings.json`). + +**Tao KHÔNG tự quyết** — nhãn flip {owner-choice | outage} là quyền anh (chính `session-start.md:43` quy định vậy). Tao chỉ nộp: 1 site sai + 1 hệ-quả no-op + 3 site đã miễn-nhiễm. + +### F-5 (LOW — đo-sống ghi thành số-chết, KHÔNG nên đuổi theo) + +`docs/STATUS.md:451` ghi RAG chunks **2441** (mốc S126). Tao gọi `list_projects` đo tươi: `solution_erp.chunk_count` = **2446** (+5). + +Nhưng cùng dòng đó tự khai `last_indexed 05-29` (stale) + "store_memory stopgap" — và `last_indexed_at` trả về đúng `2026-05-29T23:26:13` ⇒ **không hề có re-index nào**. +5 chunk = 5 lần lead ghi memory từ S126 tới nay. Tức con số này **tăng đều theo hoạt động bình thường**: 2429 (S80) → 2441 (S126) → 2446 (nay). + +⇒ **Lành, không phải drift.** Đây là **bộ-đếm SỐNG bị chép thành row TĨNH** — stale ngay khoảnh-khắc sau khi ghi, và sẽ stale lại sau mỗi lần vá. Cùng lớp với ca S140 tao từng bắt ("183KB un-gisted" ghi cứng trong 3 command-file). Đề-xuất đúng: **dán nhãn mẫu-có-ngày** ("2446 @2026-07-22") thay vì đuổi số. 🚧 Re-index = lãnh-địa AI_INFRA/cicd — **ngoài ranh tao**, không đề-xuất. + +### F-6 (LOW · vệ-sinh) — `.claude/scheduled_tasks.lock` lọt lưới `.gitignore` + +- `git status` untracked; `git log -- ` rỗng ⇒ **chưa từng tracked**. +- Nội dung = state runtime thuần: `{"sessionId":"365dd935-…","pid":66104,"procStart":…,"acquiredAt":…}` — vô nghĩa với repo, đổi mỗi lần chạy. +- `.gitignore` có `!.claude/**` (re-include) + các dòng loại-trừ đặt SAU cho `hmw-mode.on` `:87` / `fable-real-mode.on` `:92` / `wave-*` `:105` — **nhưng không có dòng nào cho `scheduled_tasks.lock`**; `:17-18` chỉ có `project.lock.json`. +- ⇒ Nó sẽ **bám `git status` vĩnh viễn** và có ngày lọt vào `git add -A`. Đúng khuôn đã được xử 3 lần trước (marker-file), chỉ thiếu dòng thứ 4. + +**Đề-xuất:** thêm `.claude/scheduled_tasks.lock` sau `!.claude/**` (last-match-wins, y hệt 3 dòng kia). + +--- + +## CHỐT + +| Mặt | Verdict | Finding | +|---|---|---| +| ① skill | PASS_WITH_FLAGS | F-2 MED (ef-core lỡ Mig 67) · F-3 LOW **dương-giả, đề-xuất KHÔNG vá** | +| ② roster | **PASS** | 17=17=17=17=17, đợt vá S143 giữ vững | +| ③ plugin | **PASS** | 18/15/3 + marketplace 37, 0 delta · new-alloc 0 action | +| ④ docs | PASS_WITH_FLAGS | F-1 MED · F-4 MED (carry S143) · F-5 LOW lành · F-6 LOW | + +**Cần lead quyết:** F-1 (4 site `sleep-recovery-memory-l2.md`) · F-2 (row Mig 67) · F-6 (1 dòng gitignore) = vá được ngay. +**Cần ANH quyết:** F-4 nhãn model-flip. +**Đề-xuất KHÔNG động:** F-3 (tuổi≠ôi) · F-5 (bộ-đếm sống). + +--- + +## Phụ-lục — residual sweep (đối-chứng 2 công-cụ, chống mù `.gitignore`) + +Sweep chính chạy bằng ripgrep (**tôn trọng `.gitignore`**). Tao chạy thêm `grep -r` thô (**không tôn trọng**) rồi lấy hiệu 2 tập "có `lead-view-auditor` mà vắng `harness-eval`" để soi chỗ ripgrep có thể mù. Kết quả: **0 file bị bỏ sót**, nhưng lòi ra 2 file tao chưa đọc — đã đọc nốt: + +| File | Phán | Lý do | +|---|---|---| +| `.claude/governance/ACTIVE-MARKS.md:41` | ✅ **KHÔNG phải drift** | Ledger có luật riêng: *"BẢN KÝ GIỮ NGUYÊN, KHÔNG SỬA MỘT CHỮ (P4/P8)"*, delta ghi ở **chú-thích** dưới. "roster 12" trong thân mark = **frozen đúng thiết-kế**. Chú-thích `:41` đã tự khai *"12 là ảnh-chụp lúc ký, KHÔNG phải giới-hạn"* — luận-điểm gánh-lực này **phủ luôn trio** dù ngoặc đơn chỉ kể tới S121. Nit, không nêu thành finding (nhất-quán với lập-trường F-3/F-5: không thổi tuổi thành ôi). | +| `.claude/agents/lead-omission-auditor.md` | ✅ **S143 F-B Đà VÁ** | `gap-incident-unrecorded` xuất-hiện **2×**; `:29` + `:42` nay đọc **"6 class"** (trước là 5). Ghost-enum S143 **đóng thật**, không phải đóng trên giấy. | + +⇒ Chốt lại F-1: `sleep-recovery-memory-l2.md` là **file DUY NHẤT** còn ôm nhãn roster cũ ở dạng chỉ-dẫn-hiện-hành. + +*Đo bởi tooling-auditor (Opus 4.8) · S144 · read-only, 0 file repo bị sửa — file này là run-trace, không phải file dự-án.* diff --git a/.claude/workflows/runs/2026-07-22-S144-trio-first-run/harness-audit-return.md b/.claude/workflows/runs/2026-07-22-S144-trio-first-run/harness-audit-return.md new file mode 100644 index 0000000..7fb1bec --- /dev/null +++ b/.claude/workflows/runs/2026-07-22-S144-trio-first-run/harness-audit-return.md @@ -0,0 +1,83 @@ +# harness-audit — RETURN S144 (2026-07-22) — con KIỂM, FIRST-RUN THẬT + +> Lead scribe @W3. ⚠️ Lượt-1 **#53 garble** (trả mẩu giữa chừng) → **SendMessage-resume** → return đầy đủ. Vai này **không ghi đĩa**, resume là đường cứu **duy nhất**. +> PIN hợp lệ: eval-return 10.907 B · refine-return 14.321 B · run.md 2.288 B ⇒ **CHẤM ĐƯỢC**, không từ-chối. + +## A — 6/6 INSTRUMENT TỰ RE-CHẠY (không phải 2) + +| # | instrument | kết | +|---|---|---| +| R1 | `measure-agent-memory` | **17 row TRÙNG TỪNG Ô** — 0 LỆCH | +| R2 | `distill-shard-probe` | `pending=15 \| nguong=7 => KEU` — 0 LỆCH | +| R3 | `mfe-eval` | 13 row + DENOM 36 + span 28057 + strikes 23 — 0 LỆCH | +| R4 | `memory-archive-gate` | 99/0/41/55/56 → 251/251 failed 0 — 0 LỆCH | +| R5 | `crystallized-backfill` | TOTAL 540724 · [135181..180241] · headroom 199759 — 0 LỆCH | +| R6 | `nhip-no-probe` | trùng **ký-tự-đối-ký-tự** | + +Tự cộng lại (không tin tổng con ĐO): l1_hot 221.943 ✓ · verbatim 776.522 ✓ · gist 201.141 ✓ · 93/99 = 93,939% ✓ · 22108/20480 = 107,9% dư 1628 ✓ · 26624−21760 = 4864 ✓ · 180241+210000 = 390241 vượt trần 10241 ✓. + +### 🔴 1 LỆCH DUY NHẤT CẢ LƯỢT — KHÔNG ở con ĐO, mà ở **`run.md` CỦA LEAD** + +| | lead ghi | đĩa | +|---|---|---| +| hotload | 538.529 B | **540.724 B** | +| headroom | 200.490 | **199.759** | + +Lệch **+2.195 B / −731 tok**. 6 file nguồn mtime ≤ **15:38:39**, tức **đứng yên TRƯỚC khi run mở (15:50)** ⇒ số 538.529 **đã stale ngay lúc được viết là "đo tươi"**. +🔴 **Con ĐO ĐÚNG, run.md SAI.** Và header scribe *"Đối chứng 4 mốc lead: 0 LỆCH"* đếm **4** trong khi run.md liệt **5** mốc — **mốc thứ 5 (crystallized) chính là mốc lệch, và việc loại nó KHÔNG được khai**. ⇒ lead-surface, escalate H24. + +## B — VERDICT PER-CLAIM + +**Con ĐO — 11/11 tín-hiệu ĐẠT.** Neo tiêu biểu: S2 byte-exact (`budget:156` S141-ADDENDUM inv-cb 26624→26624 = 0; reviewer 24024→17784 = **−6240 đúng từng byte**) · S5 `ls` → *No such file* + R4 in `strike counters NOT persisted` · S7 67374+66747+25581+18065 = **177.767** ✓ /776.522 = **22,89%** ✓ · S3b `budget:86` có đúng chuỗi *"~253.7K tok"*. + +**Con ĐO — 8 trục: 7 ĐẠT, 1 TRƯỢT-MỘT-PHẦN.** +- **T7 TRƯỢT-MỘT-PHẦN:** verdict REGRESSION dựng trên `pending=15` mà E4 chứng minh là **dương-giả**. Caveat T7 (*"vỡ-ngưỡng ≠ xấu đi"*) là phanh **đúng hướng nhưng chưa đủ sâu** — vấn đề không phải thiếu chuỗi-thời-gian mà là **tử số không đo thứ nó tưởng**. 🔴 **Con ĐO CÓ CƠ HỘI BẮT MÀ TRƯỢT:** probe **CÓ in 8 đường dẫn** (audit re-chạy thấy tận mắt), con ĐO chỉ chép dòng verdict. Nó tự khai *"Tập-đo SẠCH"* dựa trên đọc code `:40-43` — **code sạch thật, nhưng giả-định-quy-ước-đặt-tên thì không**. +- **T4 nit:** frontend-designer vào rổ "5 vai PASS" nhưng in `pointers 0 resolved 0` ⇒ byte thực-sự-verified = **76,3%**, không phải 77,1%. + +**Con ĐỀ-XUẤT — A1–A4 ĐẠT 4/4** · **E1–E8 ĐẠT 8/8** · **B1–B12 BÁC ĐÚNG 12/12, 0 mục BÁC SAI**. +- A1 Goodhart-trap **chính xác**: `measure-agent-memory.ps1:20` = `if ($_.Name -eq '_INDEX.md')`; `_INDEX-2026-05.md` rơi nhánh `else → $verbatim` ✓ +- A3 **targeting tinh hơn audit tưởng**: inv-cb `2026-07.gist` (07-18) **mới hơn** verbatim (07-17) ⇒ chưa stale; refine viết *"(sau A2)"* = **điều-kiện-hoá ĐÚNG** +- A4 citation byte-exact: `budget:14` có đủ 4 ca; **E4 là ca thứ 5 — hợp lệ** + +## C — FALSIFY-LOG (9 phép) + +| # | phép PHỦ ĐỊNH | kết | +|---|---|---| +| **F1** | 🔴 thách vùng CLEAN: *"0 instrument gác l2_index"* — grep **28 script** | **HELD.** `l2_index` xuất hiện **đúng 1 lần toàn repo scripts**: `measure-agent-memory.ps1:30` — thuần **báo cáo**, 0 so-sánh cap. Cố phá, **không phá được** | +| **F2** | 🔴 thách CLEAN #2: *"A7 PASS 251/251"* | **HELD byte-exact** — nhưng đào ra nit con ĐO không nói: frontend-designer PASS với **0 pointer** | +| **F3** | phá E4: nghi frontmatter tự-khai mà thân bài không đụng | **HELD.** Đếm back-resolve trong THÂN: cicd→runs 19/q4 5/q3 3/q2 2 · impl-be 4/4/3/3 · inv-cb 14/7/8/6 · reviewer 10/8. **Mọi file nguồn có pointer thật.** E4 đứng vững dưới phép **NẶNG HƠN** refine tự áp | +| **F4** | phá E5: quét TOÀN BỘ cặp twin | **HELD — và BROKE NGƯỢC vào refine.** **6 cặp stale**, refine báo **2**: impl-be 2026-06 **+25,7d** · inv-cb 2026-06 +13,2d · impl-fe 2026-H1 +12,0d · cicd 2026-06 +8,5d · reviewer 2026-07 +4,1d · reviewer 2026-06 +2,0d. **Điểm mù refine phát hiện LỚN GẤP 3 lần nó báo**; 4 cặp lớn nhất **ngoài tập target A3** | +| **F5** | phá *"0 dư-lượng ghi"* bằng mtime 17 MEMORY.md + 7 file dirty | **HELD.** 17/17 mtime ≤ 14:03:54; 7 file dirty 14:13→15:48 — **tất cả TRƯỚC 15:50** | +| **F6** | phá *"mfe ghi 1 file"* — nghi ghi lén | **HELD.** `.mfe-state.json` mtime 15:51:50 (trong W1) ⇒ ghi THẬT; nhưng md5 `21a5a12d…` **không đổi** ⇒ **delta 0 byte** | +| **F7** | phá E4: tìm 1 shard KHÔNG gist nào phủ | 🔴 **BROKE — 1/15.** `test-specialist/baseline-history.md` **không có gist gộp nào phủ**; nó thoát nhờ `budget:162` *"reference-file [skip sleep: đã distilled-form]"* = **cơ chế KHÁC hẳn** | +| **F8** | phá A1 bằng hệ quả **bậc 2** | 🔴 **BROKE-BỔ-SUNG.** Tách `_INDEX.md` không chỉ đẩy byte sang `l2_verbatim` — file tách **cũng thành shard MỚI** của probe (không tên `_INDEX`, không `.gist`, không twin) ⇒ **pending 15→16**. Refine bắt nhánh 1, **sót nhánh 2**. Ghép cặp instrument này **không con nào nêu** | +| **F9** | phá *"trio 5/5 là tautology"* | **HELD (tautology xác nhận).** `harness-audit.md:54-58` = **đúng 5** anti-pattern đánh số = mẫu-số 5. Diary mtime 07-20 18:31, chưa ghi lại lần nào | + +## D — 5 CÂU LEAD GIAO + +**① E4 ĐÚNG — 14/15 chuẩn, 1/15 over-generalize.** Audit **tự mở cả 5 file**. `test-spec/baseline-history.md` thoát bằng **cơ chế khác** (skip-note), nên **tiêu đề** của refine vơ cả 15 vào một rọ là quá rộng. 🔴 **Kết luận vận-hành KHÔNG ĐỔI: 0/15 file thực sự cần nén.** +🔴 **Hệ quả nặng nhất, xác nhận bằng chính config:** `budget:12 _owner_set` viết nguyên văn *"đây là số anh tự đặt **sau khi thấy phép đo 15-shard-tồn**"* ⇒ anh chốt **7 SAU KHI nhìn 15**, mà 15 là dương-giả ⇒ **tiền đề chọn số đã lệch, có bằng chứng trong chính file config**. Chỉ owner sửa được. +🔴 **Về fault-inject 6/6 của C11:** probe **chạy đúng spec**; fault-inject chứng minh **logic đếm** có răng — nhưng **không thể** chứng minh **giả-định quy-ước-đặt-tên**, vì **cây tạm được dựng theo đúng giả định đó**. **Pass thật mà vẫn sai.** Ca thứ **5** của lớp "bộ lọc nuốt nhầm" — lần này *"nó nuốt nhầm cả một quy ước đặt tên"*. + +**② E5 ĐÚNG — refine tự đếm thiếu.** `reviewer/2026-07.md` mtime 07-22 13:13, commit `36cefcc 13:40:49`; `.gist.md` dừng 07-18 11:56 (`aa88d01`) — xác nhận bằng **git**, mạnh hơn mtime. Nhưng đủ thì **6 cặp, không phải 2**. Nghịch lý refine nêu **đúng, biên độ gấp 3**. + +**③ Con ĐO tự hạ giá 100% — TỰ-PHÊ ĐÚNG MỨC.** Mẫu-số 5 = đúng 5 anti-pattern đánh số ở `harness-audit.md:54-58`; diary seed chưa ghi lại. Điểm 5/5 **theo cấu tạo mà có**. Đây là tự-phê **chính xác về mặt cơ khí**, không phải khiêm tốn tu từ. Ngược lại — con ĐO **chưa đủ mạnh tay ở T7**. + +**④ B2 BÁC ĐÚNG.** 3 chứng: (a) 4 vai đều có `source-verbatim:` + `pointer-style: substring back-resolve` ⇒ gist **đang làm đúng việc bản đồ**; (b) `budget:165` **đã tự xếp** impl-fe *"no _INDEX yet [P2 event, not sleep-scope]"* ⇒ BÁC-hạ-P2 **trùng phân loại có sẵn của spec**; (c) tạo `_INDEX` lúc này chủ yếu để **A7 đếm được** = sửa phép đo. +🔸 **Dư-lượng refine chưa đóng:** 4 vai đó **0 cơ chế kiểm pointer-integrity**, mà 2 trong đó (harvest-curator, tooling-auditor) **tự khai frontmatter** rằng nội dung đã move vào verbatim SAU khi gist chụp = **drift đã biết**. Refine đặt thuốc vào **câu chữ**, không giảm điểm mù. Đường rẻ hơn refine **không cân nhắc**: cho A7 resolve thẳng pointer trong `source-verbatim` của gist, **không cần `_INDEX.md`**. + +**⑤ `git status` SẠCH.** Duy nhất `?? scheduled_tasks.lock` (lock runtime). 7 file tracked-dirty mtime 14:13→15:48 **TRƯỚC run-start 15:50** ⇒ **dơ có sẵn, KHÔNG phải dư-lượng wave**. Khai *"read-only = thiếu tool, KHÔNG sandbox"* của **cả hai con: ĐÚNG SỰ THẬT** — kiểm bằng mtime, không bằng lời khai. +🔴 **1 khuyết tật SPEC bắt được:** `run.md(f)` viết kỳ vọng *"post-wave git status → 0 tracked-change ngoài run-folder"*. Đọc theo mặt chữ thì **TRƯỢT** (7 file dirty), nhưng cả 7 có từ trước. **Phép kiểm như đang viết KHÔNG phân biệt được dơ-có-sẵn với dư-lượng-wave** ⇒ hoặc kêu oan, hoặc (nguy hơn) **bị bỏ qua như dương-giả rồi nuốt luôn dư-lượng thật**. Muốn có răng phải **chụp baseline `git status` TRƯỚC wave rồi so hiệu**. + +## E — VERDICT TỔNG + +**Con ĐO:** 11/11 tín-hiệu ĐẠT · 7/8 trục ĐẠT, **T7 TRƯỢT-MỘT-PHẦN**. Số **byte-exact 6/6**; audit cố phá 2 vùng CLEAN **không phá được**. Điểm trừ duy nhất: bỏ khối 8 đường dẫn probe ⇒ **tự bịt mắt trước E4**. +**Con ĐỀ-XUẤT:** 4/4 action ĐẠT · 8/8 E ĐẠT (E4 kèm nhãn over-generalize 1/15) · **12/12 BÁC ĐÚNG**. Điểm trừ: **E5 tự đếm thiếu 4/6 cặp** · **A1 sót hệ quả bậc 2** (F8). +**Toàn-vẹn:** cả hai con khai **THẬT** — kiểm bằng mtime + md5 + git, không bằng lời. + +**3 việc đẩy owner/lead (ngoài trục audit, KHÔNG tự chấm):** +1. `min_pending_shards=7` **tiền đề lệch**, `budget:12` tự làm chứng — **số của owner**. +2. `run.md` crystallized **stale 2.195 B** + header *"0 LỆCH trên 4 mốc"* **im lặng loại đúng mốc lệch** — lead-surface, H24. +3. `run.md(f)` cần **baseline-diff**, `git status` trần không dùng được. + +**KHAI BÁO CỦA AUDIT:** 6 script chạy — 5 read-only; `mfe-eval.ps1` ghi `.mfe-state.json`, md5 **trước = sau = `21a5a12d0354543cfea35e7d79527a45`**, **delta 0 byte**. **Không** Write/Edit file nào. *"Read-only" của audit cũng = thiếu tool, KHÔNG phải sandbox* — Bash vẫn là kênh ghi mở; đã tự soát `git status`: sạch. diff --git a/.claude/workflows/runs/2026-07-22-S144-trio-first-run/harness-eval-return.md b/.claude/workflows/runs/2026-07-22-S144-trio-first-run/harness-eval-return.md new file mode 100644 index 0000000..38a88e5 --- /dev/null +++ b/.claude/workflows/runs/2026-07-22-S144-trio-first-run/harness-eval-return.md @@ -0,0 +1,144 @@ +# harness-eval — RETURN S144 (2026-07-22) — con ĐO, FIRST-RUN THẬT + +> Lead scribe nguyên văn return @W1, ngay khi con ĐO trả (§2.1.9(c) — vai không có Write). +> 6/6 instrument chạy tươi, 0 lỗi, 0 `probe-loi`. **Đối chứng 4 mốc lead: 0 LỆCH.** + +## PHẦN 1 — SỐ NGUYÊN VĂN + +### 1.1 `measure-agent-memory.ps1` — 17 agent (`soft_cap 30720` · `autoinject_cap 25600`) + +| agent | l1_hot | l2_verbatim | l2_index | l2_gist | +|---|---|---|---|---| +| cicd-monitor | 22607 | 226307 | **22108** | 40303 | +| database-agent | 7388 | 0 | 0 | 0 | +| frontend-designer | 21492 | 6624 | 1531 | 3231 | +| harness-audit | 1513 | 0 | 0 | 0 | +| harness-eval | 1547 | 0 | 0 | 0 | +| harness-refine | 1616 | 0 | 0 | 0 | +| harvest-curator | 17175 | 67374 | 0 | 20317 | +| implementer-backend | 19449 | 75787 | 10105 | 23079 | +| implementer-frontend | 15951 | 25581 | 0 | 11125 | +| investigator-api | 8510 | 0 | 0 | 0 | +| investigator-codebase | **26624** | 147348 | 12384 | 43854 | +| lead-omission-auditor | 9680 | 0 | 0 | 0 | +| lead-view-auditor | 6610 | 0 | 0 | 0 | +| office-document | 3323 | 0 | 0 | 0 | +| reviewer | 17784 | 142689 | 13780 | 35098 | +| test-specialist | 22140 | 18065 | 0 | 5374 | +| tooling-auditor | 18534 | 66747 | 0 | 18760 | + +Tổng (số-học của con ĐO trên số máy in): l1_hot **221.943** · l2_verbatim **776.522** · l2_gist **201.141** B. + +🔴 **BẪY GOODHART Đà CHẶN:** cột `l1_over_30kb` in `false` cho investigator-codebase. `false` đúng theo **soft_cap 30720**, KHÔNG theo **autoinject_cap 25600**. 26624 > 25600 ⇒ file **KHÔNG lọt trọn auto-inject**. **CẤM đọc `false` này thành HEALTHY.** + +### 1.2 `mfe-eval.ps1` +``` +lead cap 380000 tok | mem-sub cap 60000 tok +[LEAD] marks(Active+High)=9 AS-classes=15 net-extra-guards=5 net-extra-recurring-gotchas=7 + => DENOMINATOR = 36 items +[LEAD] Coverage-FIT: span 28057 B => ~7014-9352 tok / 380000 = 2,46% worst-case FIT = PASS +[LEAD] age-band: marks parseable=9; >30d nhưng vẫn Active=4 -> KEPT +[LEAD] Goodhart anchor: strikes_total=23 RCA=12 AS-classes=15 last_run_strikes=23 +``` +Per-role: **100% (8 vai)** cicd 10/10 · frontend-designer 2/2 · harness-audit 5/5 · harness-eval 5/5 · harness-refine 5/5 · lead-omission 6/6 · lead-view 6/6 · test-spec 6/6. +**<100% (5 vai)** impl-be 17/18=94% · inv-cb 7/8=88% · reviewer 7/8=88% · inv-api 6/7=86% · impl-fe 11/13=85%. +**N/A — không rút được mẫu-số (4 vai)** database-agent · harvest-curator · office-document · tooling-auditor. +Cộng dồn **93/99 = 93,9% — chỉ trên 13/17 vai**. + +### 1.3 `memory-archive-gate.ps1` (DRY-RUN) +``` +cap 25600 | low-water 21760 (0.85) | keep-floor 5 | strike-need 2 +PASS 1: investigator-codebase 26624 YES entries 15 strike 1 after-est ~24830 + WATCH (strike 1<2) ; 6 value-protected entries HARD-SKIPPED +16/17 còn lại: over?=no strike 0 +[A6] DRY-RUN: strike counters NOT persisted +PASS 2 (A7): cicd 99/99 · frontend-designer 0/0 · impl-be 41/41 · inv-cb 55/55 · reviewer 56/56 + A7 GATE PASS — 251 pointers, 251 resolved, 0 failed +``` + +### 1.4 `crystallized-backfill.ps1` +``` +STATUS 170744 | HANDOFF 96043 | ACTIVE-MARKS 30145 | migration-todos 84679 +gotchas 111616 | agents/README 47497 TOTAL 540724 B +cap 380000 | tok RANGE [135181 .. 180241] | measured_headroom 199759 +target (owner) 210000 | expected_backfill 199759 => headroom binds (target exceeds room) +``` + +### 1.5 `nhip-no-probe.ps1` +``` +NHIP-NO: kiem light 1/6 deep 1/15 ok | tran-bo-nho 1 over-cap | run-chua-gom 2 | pull-cach 2 ngay +``` + +### 1.6 `distill-shard-probe.ps1` (MỚI phiên này — C11) +``` +SHARD-PROBE: pending=15 | nguong=7 => KEU +``` +Kiểm tập-đo: đọc `distill-shard-probe.ps1:40-43` — loại trừ tường minh `_INDEX.md` + `*.gist.md`; ngưỡng đọc LIVE (`:29`). **Tập-đo SẠCH**, 15 khớp `_dinh_nghia_shard` trong budget. Con ĐO **không** tự viết lệnh đếm song song. + +## PHẦN 2 — SO BASELINE (trích các trục có delta đáng kể) + +🔸 **Cảnh báo đọc delta (bắt buộc cho con ĐỀ-XUẤT):** khối `measured` trong budget TỰ KHAI nhiều row là ảnh-chụp S107/S138 đã trôi, chờ full re-sync **2026-08-01**. Nên `delta vs row` = **trôi-so-với-sổ**, TRỘN tăng-trưởng thật với tụt-hậu-của-sổ. + +**2.a l1_hot** — vượt autoinject: **1/17** (inv-cb 26624 = **104,0%**, +1024). Vượt soft-cap: **0/17**. Roster 17 row vs 17 đo ⇒ **0 drift danh-sách**. +Đối xứng đáng chú ý: reviewer **−6240** L1 (đã curate L1→L2) ⟂ inv-cb **delta vs S141 = 0** ⇒ **kẹt trên cap, chưa được xử qua ít nhất 1 nhãn-phiên**. + +**2.b l2_index vs cap 20.480** — 🔴 **cicd-monitor 22108 = 107,9% VƯỢT (+1628)**. Budget tự ghi WATCH *"cicd l2_index 18774/20480 (~92% cap)"* ⇒ **mốc WATCH Đà VỠ**. Và **không instrument nào gác trục này**: archive-gate PASS 1 chỉ soi L1 vs autoinject-cap; A7 soi pointer-resolve không soi kích-thước; `tran-bo-nho` chỉ đếm `MEMORY.md`. + +**2.c l2_verbatim/gist (no-cap)** — verbatim 580.737 → **776.522** (+195.785) · gist 118.957 → **201.141** (+82.184). 2 vai mới có gist. + +**2.d archive_gate params** — 4/4 khớp budget, **0 drift config**. Hai quan sát: +1. `after-est ~24830` **> low-water 21760** ⇒ drain nếu nổ **không chạm** mục tiêu hysteresis A4; đệm dưới cap chỉ ~770 B (do 6 entry value-protected HARD-SKIP). +2. `strike 1` + `NOT persisted` + **`.claude/agent-memory/.archive-strikes.json` KHÔNG TỒN TẠI** ⇒ ở chế-độ DRY-only strike **không bao giờ tiến tới 2** ⇒ nhánh PROPOSE của A6 **bất-khả-đạt** trừ khi `-Apply`. + +**2.e crystallized** — headroom **199.759 < target 210.000** ⇒ **ĐẢO CHIỀU lần đầu** (S115: target 210K < headroom ~253,7K). Δ **−53,9K**. Số-học: floor worst-case 180.241 + target 210.000 = **390.241 > cap 380.000** (âm 10.241); đầu lạc-quan 135.181+210.000 = 345.181. Dải **vắt ngang trần**. + +**2.f MFE** — cap khớp live; strikes **23 = 23 (không leo)**; RCA 12=12. per-role coverage **KHÔNG CÓ BASELINE LƯU** ⇒ **N/A, không so được**. + +**2.g cadence** — `light_every 6`/`deep_every 15` khớp probe; nợ 1/6 và 1/15 ⇒ **ok**. `pull-cach 2 ngay` không hậu-tố OVERDUE. + +## PHẦN 3 — VERDICT PER-TRỤC + +| # | trục | verdict | +|---|---|---| +| T1 | l1_hot vs autoinject-cap | **MIXED** — 16/17 lành, inv-cb kẹt 104% và **delta S141 = 0** | +| T2 | **l2_index vs cap** | **REGRESSION** — cicd 107,9%, WATCH-92% đã vỡ, **0 cửa gác** | +| T3 | l2_verbatim/gist (no-cap) | **HEALTHY** | +| T4 | archive-gate strike + A7 | **MIXED** — A7 251/251 PASS nhưng chỉ phủ **5/9 vai có archive = 77,1% bytes**; strike bất-khả-tiến | +| T5 | **crystallized headroom** | **REGRESSION** — headroom < target lần đầu; floor+target vượt trần | +| T6 | MFE FIT + coverage | **HEALTHY (3 caveat)** | +| T7 | **distill shard (C11 mới)** | **REGRESSION** — 15 vs 7 = 214%. *Caveat: ngưỡng vừa đặt hôm nay, **không có chuỗi-thời-gian** ⇒ là VỠ-NGƯỠNG, chưa chứng-minh "xấu đi"* | +| T8 | nhịp/cadence + pull | **HEALTHY** | + +🔴 **3 caveat gắn T6 — CẤM bỏ khi trích lại:** +1. Trio 5/5 = 100% mỗi vai — nhưng diary là **SEED 1,5KB chưa chạy**. Mẫu-số rút từ chính khối anti-pattern của role-file mà seed được viết để soi gương ⇒ **đo "seed khớp spec của chính nó"**, KHÔNG đo giữ-trí-nhớ-xuyên-phiên. **Đừng đọc thành bằng chứng hệ nhớ khoẻ.** +2. 4 vai **N/A** = vùng **không đo được**, không phải vùng đạt. +3. `judge_layer` vẫn là **SCAFFOLD rỗng** — nhánh recall/apply chưa có điểm thật. + +🔴 **Caveat T4:** "A7 PASS 251/251" đúng nguyên văn nhưng phạm vi **5/9 vai**. 4 vai (harvest-curator 67374 · tooling-auditor 66747 · impl-fe 25581 · test-spec 18065 = **177.767 B**) có archive mà **không có `_INDEX.md`** ⇒ ngoài tầm soi pointer. **PASS thật, KHÔNG toàn phần.** + +## VERDICT TỔNG: **MIXED** +3 REGRESSION (T2·T5·T7) · 2 MIXED (T1·T4) · 3 HEALTHY (T3·T6·T8). +Trục vỡ đều là **trần/ngưỡng bị vượt**, KHÔNG phải hỏng toàn-vẹn — mọi phép integrity chạy được đều PASS (A7 251/251, cadence ok, strikes không leo). + +## PHẦN 4 — TÍN-HIỆU cho con ĐỀ-XUẤT (chỉ tín-hiệu + số, KHÔNG action) + +| # | tín-hiệu | số neo | +|---|---|---| +| S1 | l2_index cicd vượt cap | 22108/20480 = 107,9%, dư 1628 — **không cửa gác nào bắt** | +| S2 | L1 inv-cb kẹt trên cap | 26624/25600; **delta vs S141 = 0**; reviewer cùng kỳ tụt −6240 ⇒ cơ-chế rút CÓ hoạt động nơi khác | +| S3 | headroom tụt dưới target owner | 199.759 < 210.000; −53,9K vs S115; 180.241+210.000 = 390.241 > 380.000 | +| S4 | shard vỡ ngưỡng mới | 15 vs 7 = 214%; cicd ×4 + impl-be ×4 + 7 nữa | +| S5 | strike A6 **bất-khả-tiến** | strike 1, need 2, NOT persisted, `.archive-strikes.json` **không tồn tại** ⇒ nhánh PROPOSE chưa từng có cơ hội nổ | +| S6 | A4 hysteresis không đạt nếu drain nổ | after-est 24830 > low-water 21760; đệm ~770 B; value-gate kéo ngược mục-tiêu drain | +| S7 | 4 vai archive **không có `_INDEX`** | 177.767 B = **22,9% bytes archive** ngoài tầm A7 đang in PASS | +| S8 | coverage cao hơn mức nó chứng minh | 93/99 chỉ trên 13/17; trio 100% là seed-tự-soi | +| S9 | 5 vai coverage <100% | mỗi vai thiếu 1-2 mục; **MFE không lưu baseline** ⇒ không nói được tốt lên hay xấu đi | +| S10 | **KHÔNG PHẢI VIỆC CON ĐO — chuyển H2** | `run-chua-gom 2` ⇒ nhường `harvest-curator` | +| S11 | **thiếu chuỗi-thời-gian** | budget `measured` tự khai stale S107/S138, re-sync 2026-08-01; MFE không lưu coverage lịch sử ⇒ mọi delta là "tươi vs sổ", KHÔNG phải tốc-độ theo phiên | + +## KHAI BÁO TOÀN-VẸN (con ĐO tự khai — không cắt) + +1. **Dư-lượng ghi từ chính lượt W1 — 1 file:** `mfe-eval.ps1` GHI `.claude/agent-memory/.mfe-state.json` **theo thiết-kế** (budget `mfe.honest_caveats.read_only_scope` khai sẵn *"MFE WRITES exactly one file"*). 5 script còn lại read-only (archive-gate `DRY-RUN no writes`, backfill `READ-ONLY never tunes/writes`, 3 script chỉ stdout). +2. **"read-only" của con ĐO = thiếu tool Write/Edit, KHÔNG phải sandbox** — vẫn giữ Bash = kênh-ghi-mở. Containment THẬT = lead soát `git status`. +3. **Không tự tính lại phép đo** — mọi số hoặc máy in, hoặc số-học đơn giản trên số máy in (đã ghi rõ chỗ nào). +4. **Ranh-trục giữ:** 0 action đề xuất · 0 chấm-spec · 0 soi lead-surface · `run-chua-gom 2` đẩy sang H2. diff --git a/.claude/workflows/runs/2026-07-22-S144-trio-first-run/harness-refine-return.md b/.claude/workflows/runs/2026-07-22-S144-trio-first-run/harness-refine-return.md new file mode 100644 index 0000000..c7206b8 --- /dev/null +++ b/.claude/workflows/runs/2026-07-22-S144-trio-first-run/harness-refine-return.md @@ -0,0 +1,113 @@ +# harness-refine — RETURN S144 (2026-07-22) — con ĐỀ-XUẤT, FIRST-RUN THẬT + +> Lead scribe nguyên văn @W2. INPUT PIN hợp lệ (`harness-eval-return.md`, 10.907 B, 11 tín-hiệu) ⇒ **fail-closed KHÔNG nổ**. +> Phụ trợ đã đọc: `reinject-ledger.md` (**TRỐNG** — chỉ placeholder S95) · diary vai (seed S141). + +## PHẦN 0 — Đã VERIFY gì trước khi đề xuất + +**KHÔNG đo lại: 0 script chạy.** Mọi số hoặc là số nguyên văn con ĐO, hoặc số-học đơn giản trên số đó. +**Có làm — targeting** (`ls`/`head`/`stat`/đọc config), vì action trỏ vào file không tồn tại hoặc **đã nén rồi** là action vô giá trị: + +| Kiểm | Kết quả | +|---|---| +| `.archive-strikes.json` | **KHÔNG TỒN TẠI** — xác nhận S5 bằng existence-check | +| `measure-agent-memory.ps1:20` | `l2_index` = **duy nhất** file tên `_INDEX.md` ⇒ S1 quy về đúng 1 file | +| 9 vai có archive | 5 có `_INDEX.md` / 4 không — khớp S7 | +| `mfe-eval.ps1:270` | chỉ in `hit/den = pct`, **KHÔNG in TÊN mục trượt** ⇒ lớp ① mất địa chỉ | +| `distill-shard-probe.ps1:56` | `$fire = ($n -ge $minShards)` ⇒ muốn IM phải xuống ≤6, tức cần **9** gist | +| Liệt kê 15 shard | cicd 4 · inv-cb 4 · impl-be 4 · reviewer 2 · test-spec 1 = **15** ⇒ nền số con ĐO đứng vững | +| Frontmatter 4 file `2026-05.gist.md` | 🔴 **LẬT NGƯỢC cách đọc S4** — xem E4 | + +## PHẦN 1 — BẢNG ACTION (propose-only) + +| # | action | lớp | đối-tượng | trigger | chốt-dừng | owner-gate | +|---|---|---|---|---|---|---| +| **A1** | Nén tại chỗ `_INDEX.md` cicd xuống dưới cap, **giữ nguyên số pointer** | ③ | `cicd-monitor/archive/_INDEX.md` | **S1** 22108/20480 = 107,9%, dư 1628 | lần **1** (ledger trống). Lượt kế vẫn ≥20480 ⇒ **KHÔNG lần 2**, leo thang lead+owner | **Hỗn hợp** — sửa nội dung = AI/lead; **cap 20480 = số owner, CẤM AI nâng**. Cần thêm low-water cho `l2_index` — chỉ NÊU | +| **A2** | Curate L1→L2 inv-cb: cắt **≥4864 B** (xuống dưới low-water 21760, **không** dừng ở "vừa đủ dưới 25600") | ③ | `investigator-codebase/MEMORY.md` → `archive/2026-07.md` + `_INDEX.md` | **S2** 104,0%, delta S141 = 0 · **S6** after-est 24830 > low-water 21760, đệm ~770 B. Tiền lệ: reviewer −6240 | lần **1**. Cắt hết low-value mà vẫn >21760 ⇒ **value-floor thật** ⇒ leo thang owner, **không cắt tiếp** | **Hỗn hợp** — thao tác AI/lead (moved-not-cut + md5). **6 entry value-protected + keep-floor 5 = CẤM đụng.** cap/low-water = số owner | +| **A3** | 🔴 **Làm TƯƠI gist đã cũ** (KHÔNG tạo gist mới) | ④ | `reviewer/archive/2026-07.gist.md` (chính) · `investigator-codebase/2026-07.gist.md` (sau A2) · *(yếu)* `implementer-frontend/2026-H1.gist.md` | **S2** reviewer −6240 = đã append verbatim SAU khi gist sinh ⇒ **gist thiếu phần mới**. Đây là **nợ mà S4 KHÔNG nhìn thấy** | lần **1**/file | AI/lead. Ràng buộc: coverage-diff gate + tăng `distill-gen` 1→2 + tôn trọng double-distill guard | +| **A4** | Thăng hạng bài học *"bộ lọc chuỗi nuốt nhầm đối tượng — kiểm tập-đo TRƯỚC khi tin số"* | ② | `harness-eval/MEMORY.md` (chính) · *(tuỳ chọn)* `tooling-auditor/MEMORY.md` | Lặp **≥2** sẵn: `memory-budget.json:14` liệt **4 ca cùng phiên**; **E4 là ca thứ 5**. Chỗ đặt còn trống: L1 harness-eval 1547/25600 | lần **1**. Lượt sau không hiện diện ⇒ chuyển ① reinject theo CG-1 | **Lead quyết** (chạm diary vai khác). Không chạm số/luật owner | + +**Lớp ① nạp-lại = 0 action** — không phải thiếu tín hiệu mà **mất địa chỉ**: S8 nói thiếu đúng 6 mục nhưng `mfe-eval.ps1:270` không in tên; ledger CG-1 bắt buộc `item-id`. Đề xuất reinject không có id = **bịa**. + +**Thứ tự:** A2 → A3 (A2 làm gist inv-cb cũ đi). A1, A4 độc lập. + +## PHẦN 2 — Bẫy Goodhart gắn từng action + +- **A1 — CẤM "tách file" để hạ số.** `measure-agent-memory.ps1:20` chỉ cộng file tên đúng `_INDEX.md`. Tách thành `_INDEX-2026-05.md` làm `l2_index` tụt ngay mà **0 byte thông tin mất** — bytes chỉ chuyển sang `l2_verbatim` **vốn không cap**. Nghiệm thu đúng = **A7 vẫn resolve ≥99 pointer, 0 failed**. +- **A2 — CẤM cắt entry value-protected để đạt chỉ tiêu byte.** Chỉ còn cách đó ⇒ kết luận đúng là "value-floor", leo thang owner. +- **A3 — CẤM viết gist rỗng cho đủ số.** Hạ `pending` 15→≤6 **rất dễ làm giả** (9 file `.gist.md` rỗng là probe im ngay). Nghiệm thu lớp ④ phải là **coverage-diff gate, KHÔNG BAO GIỜ là con số pending**. +- **A4 —** bài học thăng hạng phải kèm **ca cụ thể**, không thì thành khẩu hiệu mà MFE vẫn tính là "có mặt". + +## PHẦN 3 — NGOÀI 4 LỚP → NÊU + LEO THANG + +**E1 — lớp ① bị chặn ở tầng công cụ.** `mfe-eval.ps1:270` không in mục trượt. `reinject-ledger.md:50` **tự khai** đúng khuyết tật (*"per-item-L1-presence detection is still PARTIAL"*). ⇒ 6 mục thiếu **không thể** vào ledger. Đề nghị con ĐO lượt sau in kèm danh sách mục trượt per-role. + +**E2 — S5 ghost-wire + mâu thuẫn thiết kế nội tại.** `memory-budget.json:45` khai *"persists strikes in `.archive-strikes.json`"* — file **không tồn tại**. Nhưng cùng file, `value_protect._note` chốt *"Archive-gate stays DRY-RUN"*. Hai câu **kéo ngược nhau**: strike chỉ tiến khi ghi state, mà ghi state chỉ xảy ra khi rời DRY-RUN. Owner phán 1 trong 2: **tách quyền** (persist-strike ≠ apply-drain — ghi bộ đếm không phải xoá dữ liệu) hoặc **gỡ lời khai** để cơ chế không tự nhận có răng. + +**E3 — S1 không cửa gác, cũng không low-water.** Budget tự ghi index này *"grows with each run"* ⇒ A1 cắt đúng 1628 B thì tái vượt sau ~1 phiên. Cần low-water cho `l2_index` — **số của owner**. + +### 🔴 E4 — PHÁT HIỆN NẶNG NHẤT: 15 shard "pending" đều Đà CÓ bản nén, dưới TÊN GỘP + +| file gist | frontmatter khai phủ | số file | +|---|---|---| +| `cicd-monitor/2026-05.gist.md` | `source-verbatim: 2026-05-q2 (1) · q3 (3) · q4 (7) · 2026-05-runs (20 run-records)` | **4/4** | +| `investigator-codebase/2026-05.gist.md` | *"q1+q2+q3+q4 distilled"*, `distill-gen: 1 (already-distilled — do NOT re-compress)` | **4/4** | +| `implementer-backend/2026-05.gist.md` | *"Covers verbatim files: q1 (S21-24), q2 (S25-29), q3, q4"*, `do NOT re-compress` | **4/4** | +| `reviewer/2026-05.gist.md` | *"Verbatim: q1 + q2"*, *"KHÔNG nén lại bản này"* | **2/2** | +| `test-specialist/baseline-history.md` | không phải `.md`; `memory-budget.json:162` đã ghi *"reference-file [skip sleep: đã distilled-form]"* | **1/1** | + +**4+4+4+2+1 = 15/15.** + +🔴 **Nguyên nhân KHÔNG phải bug code** — probe chạy đúng spec của nó. Sai ở **GIẢ ĐỊNH của spec**: `_dinh_nghia_shard` giả định gist ghép **1:1 theo tên**, trong khi corpus thực tế dùng **gist gộp nhiều-về-một**. ⇒ `pending=15` đang đo **TÊN FILE**, không đo **ĐỘ PHỦ DISTILL**. + +**Ba hệ quả đưa tới owner:** +1. Đề xuất máy móc "tạo 9 gist twin" sẽ **vi phạm `do NOT re-compress` ghi thẳng trong 3 file gist** + nhân bản nội dung đã có ⇒ **BÁC** (A3 đổi hướng). +2. `min_pending_shards = 7` là số **owner chốt hôm nay SAU KHI NHÌN con số 15**. Nếu mẫu-số đó phần lớn dương-giả thì **tiền đề chọn số đã lệch** — **chỉ owner được sửa số của mình**. +3. Quy trình: `distill-shard-probe.ps1:63-65` **CÓ in 8 đường dẫn pending** khi kêu; phần đó **không có trong eval-return**, chỉ còn dòng verdict. Nếu khối đường dẫn được chép nguyên, lớp ④ đã chẩn đúng **ngay từ nấc 1**. + +### E5 — điểm mù THỨ HAI của probe: đếm twin TỒN TẠI, không đếm twin TƯƠI + +- `reviewer/archive/2026-07.md` sửa **hôm nay** trong khi `2026-07.gist.md` dừng **07-18** — **được số con ĐO chứng thực** (S2: reviewer curate L1 −6240 vào L2). Độ tin **CAO**. +- `implementer-frontend/2026-H1.md` (07-14) mới hơn `.gist.md` (07-02) — **chỉ mtime**, độ tin **THẤP**, cần soi nội dung. + +🔴 **Nghịch lý phải nói thẳng:** *tín hiệu LÀNH MẠNH S2 (reviewer chịu curate) chính là thứ sinh ra nợ gist mà probe không thấy.* **Càng làm đúng ở lớp ③ thì nợ ẩn ở lớp ④ càng tăng, mà đồng hồ vẫn im.** + +**E6 — S3 ngoài tầm với, khai thẳng.** headroom đứng trên sàn file của **lead hot-feed**, KHÔNG phải agent-memory corpus ⇒ **không action nào của A1–A4 làm S3 dịch 1 byte**. `crystallized._target_note` cấm AI auto-tune. **Ai nói action memory-corpus "giải quyết" S3 là nói sai.** + +**E7 — chốt-dừng của chính con ĐỀ-XUẤT hiện là NGHI THỨC, chưa phải cơ chế.** Ghi "lần 1" cho A1–A4 nhưng **không có sổ nào** để lượt sau biết đó là lần 1; ledger schema chỉ nhận floor-rot; và vai bị **cấm tự tìm run mới nhất**. Đề nghị rẻ: lượt sau lead **PIN thêm input thứ 2 = bản refine-return này**. Không có nó thì luật "một lần rồi leo thang" là **chữ, không phải răng**. + +**E8 — S9/S11 không có đường lùi.** MFE không lưu coverage lịch sử ⇒ mọi câu "tốt lên/xấu đi" **không kiểm chứng được**. Đã không đề xuất gì dựa trên xu hướng. + +## PHẦN 4 — Đà CÂN NHẮC RỒI BÁC (12 mục) + +| # | đã soi | quyết | lý do | +|---|---|---|---| +| B1 | Tạo 9 `.gist.md` để probe im (đọc thẳng S4) | **BÁC** | E4: cả 15 đã có bản nén; 3 gist ghi `do NOT re-compress`. Nén-2-lần + nhân bản, hạ số mà **không** cải thiện trí nhớ = rời tập-đo | +| B2 | Tạo `_INDEX.md` cho 4 vai thiếu (S7) | **BÁC, hạ P2** | 4 vai đều có `source-verbatim:` + `pointer-style: substring back-resolve` ⇒ **gist đang làm đúng việc bản đồ**; mỗi vai chỉ 2 file verbatim. Tạo index lúc này chủ yếu để **A7 đếm được** = sửa phép đo chứ không sửa trí nhớ, **cùng loại lỗi B1 đổi chiều**. Khuyết tật thật là **câu chữ "A7 PASS 251/251" nghe như toàn phần** | +| B3 | ① reinject 6 mục thiếu | **BÁC** | Không có item-id (E1); đề xuất "mục nào đó" = bịa | +| B4 | Tự dò tay 6 mục nào thiếu | **BÁC** | = chạy lại phép đo con ĐO bằng tay ⇒ lấn nấc 1 + tạo 2 nguồn số cạnh tranh | +| B5 | Đề nghị owner hạ `target` 210.000 cho khớp headroom | **BÁC** | Số owner; `_target_note` cấm auto-tune; hạ số cho vừa phép đo = **bịt đèn báo** | +| B6 | Nâng `l2_index.cap` >22108 cho cicd hết đỏ | **BÁC** | Cùng lớp B5: đổi thước khi vật vượt thước. A1 đi hướng ngược (giảm vật) | +| B7 | Chạy `-Apply` để strike ghi được | **BÁC** | Read-only + chạm dữ liệu thật; budget chốt gate **cố ý** DRY-RUN ⇒ đẩy E2 | +| B8 | Nhịp curate theo "tốc độ phình L1" | **BÁC** | S11 khai không có chuỗi thời gian ⇒ đề xuất theo xu hướng = đề xuất trên dữ liệu **không tồn tại** | +| B9 | Ghi nhật ký first-run cho diary của chính mình | **BÁC** | Lặp=1 chưa chạm ngưỡng ②; và **tự phục vụ** | +| B10 | Thăng hạng "công thức curate L1→L2" vào L1 inv-cb | **BÁC** | Ngưỡng ② đạt nhưng **chỗ đặt sai**: nhét vào đúng file đang vượt cap = tự làm nặng thứ A2 đang gỡ | +| B11 | `run-chua-gom 2` | **BÁC — nhường** | H2 `harvest-curator` | +| B12 | Mọi thứ thuộc hot-feed/carry/work-state LEAD | **BÁC — nhường** | Trục `lead-omission-auditor`; cố ý không đề xuất gì cho S3 ngoài nêu | + +## PHẦN 5 — Phản hồi RANH SẮC (lead hỏi) + +Ranh `refine ⟂ lead-omission` **theo đối tượng thì sạch, chạy được**. Ba chỗ nên chỉnh khi owner ratify: +1. 🔴 **Có đường nối mà bảng 2 cột không thấy:** `crystallized.source_order` = gist → dòng archive có value-marker → RAG ⇒ **corpus của refine là NGUỒN NẠP cho hot-feed của lead**. S3 rơi đúng chỗ nối. Đề nghị ghi thành chữ: *refine được đề xuất thay đổi **nguồn** (corpus); KHÔNG được đề xuất thay đổi **số/nội dung lead nạp**.* +2. **5/11 tín hiệu là khuyết tật INSTRUMENT** (S1·S5·S6·S9·S11) mà 4 lớp của refine đều là corpus-mutation ⇒ tất cả rơi vào sọt "escalate", **dễ thành nơi việc đi vào rồi nằm im**. Đề nghị định tuyến lớp instrument sang `tooling-auditor`. +3. **Chốt-dừng cần vật mang, không chỉ cần luật** (E7). + +## PHẦN 6 — KHAI BÁO TOÀN VẸN + +1. **Dư lượng ghi: KHÔNG.** 0 script chạy, 0 file tạo/sửa/xoá. Chỉ `Read` + `Bash` với `ls`/`head`/`stat`/`grep`/`sed`. +2. **"read-only" = thiếu tool Write/Edit, KHÔNG phải sandbox** — Bash vẫn là kênh ghi mở. +3. **Đề xuất ≠ đã làm.** A1–A4 propose-only, chờ lead VERIFY (single-writer B3). +4. **Ranh trục giữ:** 0 phép đo mới · 0 chấm điểm · 0 đụng lead-surface. +5. **Chỗ vượt ra ngoài "chỉ đọc số":** mở frontmatter 6 file gist + mtime 7 cặp — vì lớp ④ **bắt buộc** phải biết đối tượng đã nén hay chưa. Kết quả E4/E5 **không mâu thuẫn** số nào của con ĐO; nó chỉ nói con số 15 đang đếm **tên file** chứ không đếm **độ phủ**. +6. **Độ tin không đồng đều:** E4 = frontmatter tự khai (**CAO**) · E5-reviewer = có số con ĐO chứng thực (**CAO**) · E5-impl-fe = chỉ mtime (**THẤP**). +7. **Ledger CG-1 trống** ⇒ A1–A4 đều **attempt = 1** hợp lệ, 0 ca phải leo thang lượt này. diff --git a/.claude/workflows/runs/2026-07-22-S144-trio-first-run/run.md b/.claude/workflows/runs/2026-07-22-S144-trio-first-run/run.md new file mode 100644 index 0000000..3d1e301 --- /dev/null +++ b/.claude/workflows/runs/2026-07-22-S144-trio-first-run/run.md @@ -0,0 +1,32 @@ +# run: 2026-07-22-S144-trio-first-run + +- **Phiên:** S144 · **Lead:** Opus 4.8 · **Consent:** anh gõ *"3 cái này chạy đi nhé"* @S144 +- 🎯 **FIRST-RUN THẬT của bộ-ba trio-memory** — land S142, spawn-probe ALIVE 3/3 sáng nay, **chưa chạy task thật lần nào**. Đây là thứ duy nhất chặn nấc `executed-file/verified-pending-restart` → **`verified-runtime`**. + +## Nghi thức (§2.1.9) + +- (b) **3 spawn RIÊNG, TUẦN TỰ** eval → refine → audit. 🔴 **CẤM `parallel()`** — audit chạy song song sẽ chấm bản CŨ ⇒ verdict vô nghĩa. +- (c) **Lead scribe NGAY** khi mỗi con trả → `harness-{eval,refine,audit}-return.md`, **không đợi đủ 3**. Lý do: 3 vai khai không có Write/Edit; phiên chết giữa chừng = mất return (bài học vòng-1 S141). +- (d) **PIN đích danh**: refine nhận path `harness-eval-return.md`; audit nhận path run-folder này. Pin missing/rỗng ⇒ vai **TỪ CHỐI**, cấm tự tìm "run mới nhất". +- (e) 🔒 **Mirror C1 — đóng băng bề-mặt-đo** từ đây tới verdict cuối: KHÔNG ghi `agent-memory/` · `.session-counter.json` · `ACTIVE-MARKS` · `STATUS` · `HANDOFF` · `gotchas` · `error-ledger` · `migration-todos` · `agents/*.md`. Ngoại lệ: `WAL.md`. +- (f) Post-wave `git status --short` → kỳ vọng **0 tracked-change ngoài run-folder**. +- Label theo C3 (dogfood khuôn 4 thành-phần vừa adopt): `Vòng-3 harness-eval w1 @start s144` … + +## Bối cảnh đo (để 3 con có nền, KHÔNG phải để chép) + +Đo tươi phiên này, **trước khi đóng băng**: +- roster 17 · L1 lớn nhất `investigator-codebase` **26.624 B** > autoinject cap 25.600 ⇒ 1 over-cap +- 3 diary trio: eval 1.547 B · refine 1.616 B · audit 1.513 B (seed-state, `l2_*`=0 — đúng vì chưa chạy) +- shard chưa-gist **15** / ngưỡng mới **7** ⇒ KÊU (C11 vừa wire phiên này) +- detector TOTAL **47** · H17 spec-audit GAPS **none** · nhịp-nợ light 1/6 deep 1/15 +- ~~crystallized: hotload 538.529 B → tok RANGE [134.632..179.510], headroom 200.490~~ 🔴 **SỐ NÀY SAI — audit W3 bắt, lead tự đo lại xác nhận.** + **ĐÚNG: hotload 540.724 B → RANGE [135.181..180.241], headroom 199.759**, target 210.000. + **Nguyên nhân (lead tự truy):** lead chạy `crystallized-backfill` **sớm trong phiên**, sau đó **tự tay sửa `agents/README.md`** cho C9 (bảng cost 7→17 vai, **+2.195 B**, mtime **15:38:39**), rồi chép **con số TRƯỚC khi sửa** vào đây và gắn nhãn *"đo tươi"*. ⇒ **lead đổi chính vật mình vừa đo, rồi trích số cũ.** + 🔴 **Lỗi thứ hai, nặng hơn:** header `harness-eval-return.md` scribe *"Đối chứng 4 mốc lead: 0 LỆCH"* — mà khối này liệt **5 mốc**. Mốc thứ 5 (crystallized) **chính là mốc lệch**, và việc loại nó khỏi phép đối chứng **không được khai**. Con ĐO không sai; **lead thu hẹp tập đối chứng mà im lặng**. + Giữ dòng gạch để làm vết — xoá là mất chứng nhân. + +## Stages + +- [!] W1 — `harness-eval` (con ĐO) +- [ ] W2 — `harness-refine` (con ĐỀ-XUẤT, PIN eval-return) +- [ ] W3 — `harness-audit` (con KIỂM, PIN run-folder) diff --git a/.claude/workflows/runs/2026-07-22-S144-trio-first-run/trio-synthesis.md b/.claude/workflows/runs/2026-07-22-S144-trio-first-run/trio-synthesis.md new file mode 100644 index 0000000..52c0b4c --- /dev/null +++ b/.claude/workflows/runs/2026-07-22-S144-trio-first-run/trio-synthesis.md @@ -0,0 +1,35 @@ +# trio-first-run — SYNTHESIS (🔴 RETRO-HARVEST @S146, không viết lúc chạy) + +> **Khai ngay đầu:** file này viết **hồi-tố @S146 2026-07-22** bởi lead, trong lượt `/tiep`, khi sàn-3 `/tiep §0` bắt folder này là **orphan** (có `run.md`, không có `*-synthesis.md` phẳng). +> ⇒ Đây **KHÔNG** phải bản ghi lúc chạy. Mọi dòng dưới đều **truy được từ đĩa** (3 file `harness-*-return.md` + `run.md` trong chính folder này); chỗ nào **suy ra** thì ghi rõ là suy ra. **KHÔNG bịa kết quả.** + +## Kết luận 1 dòng +**FIRST-RUN THẬT của bộ-ba trio-memory Đà CHẠY ĐỦ 3/3 TUẦN TỰ và ĐẠT** — nấc `executed-file` → **`verified-runtime`** cho `harness-eval` · `harness-refine` · `harness-audit`. Lệch duy nhất cả lượt **không nằm ở 3 con**, mà ở **`run.md` của chính lead**. + +## Bằng chứng trên đĩa (đo lại @S146) +| vật | trạng thái | +|---|---| +| `harness-eval-return.md` | tồn tại (con ĐO, lead scribe @W1) | +| `harness-refine-return.md` | tồn tại (con ĐỀ-XUẤT, PIN eval-return) | +| `harness-audit-return.md` | tồn tại (con KIỂM, PIN run-folder) | +| nghi-thức §2.1.9(b) TUẦN TỰ | giữ — 3 spawn riêng, KHÔNG `parallel()` | +| nghi-thức §2.1.9(c) scribe-ngay | giữ — và **đã cứu được một lượt** (xem dưới) | + +## 2 phát hiện đáng giữ (nguyên văn từ return, không tô hồng) + +**(1) `#53` garble fire THẬT — resume là đường cứu duy nhất.** +`harness-audit` lượt-1 trả mẩu giữa chừng → **SendMessage-resume** → mới có return đầy đủ. Vai này **không ghi đĩa**, nên nếu phiên chết lúc đó thì **mất trắng**. ⇒ củng-cố đúng luật §2.1.9(c) *lead scribe NGAY, không đợi đủ 3*. + +**(2) 🔴 Lệch duy nhất nằm ở LEAD, không ở con ĐO.** Con KIỂM tự re-chạy **6/6 instrument** (không phải 2 như sàn tối-thiểu) → **0 LỆCH** trên cả 6, và tự cộng lại 7 tổng phái-sinh đều khớp. Nhưng bắt được `run.md` của lead ghi: +| | lead ghi | đĩa thật | +|---|---|---| +| hotload | 538.529 B | **540.724 B** | +| headroom | 200.490 | **199.759** | + +**Nguyên nhân lead tự truy (giữ nguyên trong `run.md`, có gạch ngang làm vết):** lead chạy `crystallized-backfill` sớm trong phiên → **rồi tự tay sửa `agents/README.md`** (+2.195 B) → **chép lại con số TRƯỚC khi sửa** và gắn nhãn *"đo tươi"*. ⇒ **lead đổi chính vật mình vừa đo, rồi trích số cũ.** +🔴 **Lỗi thứ hai, nặng hơn:** header scribe ghi *"đối chứng 4 mốc lead: 0 LỆCH"* trong khi khối đó liệt **5 mốc** — mốc thứ 5 (crystallized) **chính là mốc lệch**, và việc loại nó khỏi phép đối chứng **không được khai**. Con ĐO không sai; **lead thu hẹp tập đối chứng mà im lặng**. Đây đúng class `meta-count self-coverage blind-spot`. + +## Residual thật (KHÔNG đóng) +- `## Stages` trong `run.md` tới giờ vẫn `[!] W1 · [ ] W2 · [ ] W3` — **stale**: cả 3 đã chạy xong. Checkbox không được đóng lúc kết thúc. + 🔸 **Giữ nguyên, KHÔNG sửa ngược:** đó là **vết thật** của việc closeout bị cắt; sửa ở đây thành `[x]` sẽ xoá đúng bằng-chứng mà retro-harvest này sinh ra để ghi lại. Bài học đi vào `_residual` chứ không đi vào việc làm đẹp checkbox. +- Vì sao thành orphan: phiên S144→S145 chạy tiếp việc khác rồi `/pause`, harvest-gate chưa kịp gom. diff --git a/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/implement-synthesis.md b/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/implement-synthesis.md new file mode 100644 index 0000000..eb68288 --- /dev/null +++ b/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/implement-synthesis.md @@ -0,0 +1,43 @@ +# implement-synthesis — spec-v2 áp xong (S145 phóng → S146 relaunch-cắt-gọt → reviewer PASS-with-fixes) + +> Bản-ghi-kết-quả **dạng-1 phẳng** (đóng orphan ① của Sàn-3). Viết @S146 sau khi reviewer trả và lead đã vá. + +## Kết luận 1 dòng +**5 axis của `spec-apply-hub-s145-v2.md` đã land, verify TRÊN ĐĨA, 0 file prod-code.** Reviewer bắt **2 MAJOR thật — cả hai là lỗi của lead** — đã vá xong trong phiên. + +## Đường đi (2 phiên, 1 lần chết giữa chừng) +| stage | kết | +|---|---| +| S0–S3 @S145 | ground → spec-v1 → `/fable-clone` reviewer ensemble 5 lane (**FAIL 2C + nhiều MAJOR**) → synthesize **spec-v2** | +| S4 lần 1 @S145 | `wf_f9f24694-12b` — **CHẾT giữa chừng** ở `/pause`; chỉ axis **B** landed (~1/4) | +| S4 lần 2 @S146 | `/tiep §4` **relaunch-CẮT-GỌT** `wf_3d803740-41d` — 3 worker DISJOINT-file (A · C+E · D), **3/3 DONE**, 511k tok / ~20′ | +| S5 @S146 | `reviewer` pre-commit + fault-inject → **F1/F2 MAJOR** → lead vá → quét cuối sạch | + +🔴 **Cross-session resume KHÔNG hợp-lệ** (`tiep.md §4.5` SAME-SESSION-ONLY) ⇒ bỏ hẳn run cũ, relaunch với memory-pack **dẫn-xuất-lại TƯƠI**. Harvest-hồi-tố axis B bằng cách **đo đĩa**, không tin return đã mất. + +## Kết quả per-axis (bằng-chứng đo đĩa @S146) +| axis | kết | +|---|---| +| **A** C7 | `harness-11-engine.md` **§N.8** — predicate 4-vế, tách FLOOR/FORM; `N.2` 3→**4 path cố định** | +| **B** bulk | `bulk_note_shards: 30` (landed @S145, verify lại) | +| **C** session-model | hook `wal-flush.ps1:13` = **4 path** (+`.claude/sessions/`) · Sàn-3 **⑤ + ORPHAN-L** · VC-1 nhãn 2 tầng · scaffold + orphan-L rule · `session_ctx_kb`=64 owner-set | +| **D** 5-vòng | `session-end` gỡ "land dần sau" · **D2 KIỂM end-only** + H24-coupling · completeness-gate **§L.c** có RĂNG (cấm bare-PASS) | +| **E** tiep/pause | line-ref `:7`→`:13` · wf: 5-trường · memory-pack-rule | + +**🎯 LIVE-VERIFY hook 4-path PASS trong repo THẬT:** commit `da7ee8a` nuốt `.claude/sessions/session-1/probe.md`. Worker CE chỉ verify được **cây tạm** và **khai thật** là không quan-sát được repo-thật từ trong subagent (hook ở event `Stop`, không phải `SubagentStop`) ⇒ lead tự làm nốt. **Khai đúng phạm-vi = lý do mảnh này không thành claim rỗng.** + +## 🔴 2 MAJOR reviewer bắt — cả hai của LEAD +- **F1** `session-end.md` ×2 vẫn dạy **`hook-3-path`** (GẠCH NỐI). Worker CE **đã chỉ tận nơi** trong sub-file của mình, worker D không vá ⇒ **residual có người chỉ mà vẫn rơi**. +- **F2** phép quét cardinality của lead **siết LỆCH TRỤC** (lọc co-occurrence cùng dòng + tập-file hẹp) ⇒ bắt 7/11, **lọt 4 ca thật — gồm chính F1**. +- **F3 HELD** — reviewer tự `git show da7ee8a` xác minh live-verify, không tin lead. +- **F4** probe residue ô-nhiễm ID-space + làm ⑤ kêu tới khi push ⇒ lead `git rm`, bằng-chứng còn trong history. + +## Bài học đắt nhất (giữ nguyên, đừng nén) +Phép quét ấy lead sửa **4 LẦN trong 1 phiên**: **quá rộng** (nuốt câu đúng) → **quá hẹp** (lọt lỗi thật) → **rộng lại** (kéo về 3 miền khác) → chốt. +🔴 Cả 4 đều vì **cố mã-hoá "ý-định" vào một regex khôn**. Ý-định ở đây là **NGỮ-NGHĨA** ("đang nói về path-list của hook") — thứ khớp-mẫu **không biểu-diễn được**. Nấc đúng = **lưới soát cho người + allowlist CÓ TÊN + `use ⟂ mention` (🧊)**, cùng khuôn `/tiep §0` đã dùng cho **dạng-4**. +🪤 Lần 4 đặc-biệt: **bộ dò bắt chính nốt-vá của mình**, vì nốt vá trích-dẫn giá-trị cũ (citation-trap). Và giới-hạn kèm theo: 🧊 lọc theo **DÒNG** ⇒ với **mega-line** (`STATUS.md`) thì cấm dùng 🧊, phải diễn-đạt lineage không lặp cụm. + +## Residual thật (KHÔNG đóng) +- **Meld-forward** (`.claude/sessions/` qua squash) — floor hub, **CHƯA ĐO**. +- Hub-floor còn thiếu: `_snapshot-k` + lệnh chụp-nhanh · `_context` tầng **stock**+nén · `/pause` tự-chụp · `/tiep` đọc snapshot + phòng cửa-sổ-sập. **Chưa chốt** (đã carry). +- V2 mới "auto-khi-tới-nhịp", **chưa** bookend-hub. Trong 5 vòng: **V1+V3 = 2 đầu thật** · V2 cadence · V4 on-signal · V5 liên-tục. diff --git a/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/run.md b/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/run.md new file mode 100644 index 0000000..98b82f1 --- /dev/null +++ b/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/run.md @@ -0,0 +1,56 @@ +# run: 2026-07-22-S145-apply-hub-answers + +- **Phiên:** S145 (/tiep resume S144) · **Lead:** Opus 4.8 · **HMW-mode ON** +- **Lệnh owner:** *"áp ngay bây giờ và /fable-clone review lại cụ thể — chú ý đi thật kỹ theo spec list của Hub => Sau đó hmw 4.8 MAX xử lý"* + *"kiểm tra kỹ nghi-thức session-start/end đóng đủ 5 vòng"* + *"kiểm tra kỹ lại command tiep/pause/snapshot"*. +- **Engine:** LỆNH-B ensemble (/fable-clone reviewer) review spec → em-main synthesize → hmw 4.8 MAX implement. +- **Governance/config-only** — 0 prod-code (src/·fe-*·tests/), 0 mig; test count giữ, bundle FROZEN. + +## Tiền-đề đã verify (investigator-codebase ground, đo tươi) +- C7: script `nhip-no-probe.ps1` Đà thỏa predicate 4-vế (catch :203-206 → `probe-loi (khong chan)` → exit 0); CHƯA có luật thành-văn. 🧊 **ĐÍNH-CHÍNH @S146 (câu gốc SAI, spec-v2:13 đã bác):** ~~header "4 surface" SAI (chỉ 2: pause:44 + tiep:112)~~ → **header "4 surface" ĐÚNG** — đo lại `grep -rn nhip-no-probe.ps1 .claude/commands/` = **4 file caller THẬT** (pause · tiep · session-start · session-end). Spec-author v1 nhầm vì session-start/end gọi CẢ `nhip-no-probe` LẪN `distill-shard-probe`. 🔴 **CẤM "sửa" header 4→2.** +- bulk: `memory-budget.json:11` = null; BÃO-TO logic :63 OK; single-source clean (0 derived copy). +- session-model: draft VC-3 STALE → owner S144 override hub-form `sessions/session-/`; `session_ctx_kb` thiếu (default 64KB); `wal-flush.ps1:13` = 3-path. + +## 5 vòng canonical (spawn-label:32 + checklist f71c5b65) +V1 tooling/harvest → `tooling-harvest-audit` · V2 soi-lead → `h24-audit` · V3 trio → `harness-audit`(built-in) · V4 nén-ngủ → `sleep-audit` · V5 truth-floor → measured-label-gate (floor). Completeness-gate = 5-vòng chức-năng + 4 phép sàn. + +## Stages +- [x] S0 — investigator-codebase ground 3 area + em-main ground 5-vòng +- [x] S1 — em-main draft spec-v1 (5 axes: C7 · bulk · session-model · 5-vòng closure · tiep/pause/snapshot) — file này + spec-apply-hub-s145.md +- [x] S2 — /fable-clone reviewer ENSEMBLE review spec vs hub-spec-list + 5-vòng + tiep/pause/snapshot (5 lane → FAIL 2C + MAJOR; `sub-reviewer-*.md`) +- [x] S3 — em-main refute + synthesize → `spec-apply-hub-s145-v2.md` +- [!] S4 — hmw 4.8 MAX implement theo spec-v2 — **CHẾT GIỮA CHỪNG @/pause S145**; done = **B only**. RELAUNCH-CẮT-GỌT @S146 (dưới). +- [ ] S5 — reviewer pre-commit + fault-inject 2-chiều + cicd (nếu push) + +## taskList snapshot (S4-relaunch — /tiep §4 cắt-gọt @S146, run cũ `wf_f9f24694-12b` done≈1/4) + +🔴 **Vì sao relaunch chứ không resume:** resume-theo-run-id = **SAME-SESSION-ONLY**; S145 đã chết ⇒ cross-session resume KHÔNG hợp-lệ (`tiep.md §4.5`). Memory-pack **DẪN-XUẤT-LẠI TƯƠI** từ đĩa @S146, CẤM dùng snapshot cũ. + +**Harvest-hồi-tố (partial-honest) — đo tươi trên đĩa @S146, KHÔNG tin return đã mất:** +| axis | trạng-thái đĩa | bằng-chứng | +|---|---|---| +| **B** bulk=30 | ✅ **LANDED** | `memory-budget.json` → `"bulk_note_shards": 30` (>15 ✓, đúng target owner) | +| **C1** session_ctx_kb | ✅ **thoả bằng KHÔNG-ĐỘNG** | `grep session_ctx_kb memory-budget.json` = **0** ⇒ để-trống đúng K6.2 | +| **A** C7 §N | ❌ chưa | `grep predicate-4-vế harness-11-engine.md` = 0 | +| **C2/C2b** hook+Sàn-3 | ❌ chưa | `wal-flush.ps1:13` = 3 path · `tiep.md` "3 path/3 điểm mù" ×4 (:21 :23 :75 :78) | +| **C3–C7** session-model | ❌ chưa | `.claude/sessions/` KHÔNG tồn-tại · draft:54 còn VC-3 conflict | +| **D** 5-vòng | ❌ chưa | `session-end.md:123` còn "land dần sau" (3 vai THỰC-TẾ đã BUILT, roster 20) | +| **E2** line-ref | ❌ chưa | `tiep.md:23` còn `wal-flush.ps1:7` (đúng phải `:13`) | + +**3 worker DISJOINT-FILE (B đã xong ⇒ gỡ khỏi fan-out):** +| # | worker | file sở-hữu (KHÔNG chồng lấn) | axis | +|---|---|---|---| +| 1 | `impl-A-c7` | `docs/governance/harness-11-engine.md` + trỏ-§N ở `pause.md`/`tiep.md` (chỉ 2 dòng TRỎ) | A1 A2 A3 A5 | +| 2 | `impl-CE-sessionmodel` | `.claude/hooks/wal-flush.ps1` · `.claude/commands/tiep.md` · `pause.md` · `session-start.md` · `docs/governance/session-model-se-draft.md` | C2 C2b C3–C7 E1 E2 | +| 3 | `impl-D-5vong` | `.claude/commands/session-end.md` + 3 contract `.claude/agents/{tooling-harvest-audit,h24-audit,sleep-audit}.md` | D1 D2 D3 D4 | + +⚠️ **Seam A↔CE:** worker-1 viết §N; worker-2 sở-hữu `tiep.md`/`pause.md`. Để tránh 2 tay cùng file → **worker-2 chèn dòng TRỎ §N** (worker-1 CHỈ viết luật trong `harness-11-engine.md` + trả về số §N thật). + +## taskList snapshot (S2 — /fable-clone reviewer ensemble, cùng vai `reviewer`) +5 lane đa-lăng-kính review `spec-apply-hub-s145.md`: +| lane | lăng-kính | +|---|---| +| 1 | C7 predicate 4-vế — khớp hub spec-list? luật-home đúng? fault-inject đủ răng? stale-fix đúng? | +| 2 | bulk_note_shards=30 — reference-not-copy? >tầng-1? fault-inject im/bão? | +| 3 | session-model — bám WAL S144 (KHÔNG draft VC-3 stale)? VC-1 2-tầng (né OR-guard)? hook-4-path an-toàn? Q4-defer đúng? | +| 4 | 5-vòng closure — completeness-gate (5 vòng + 4 phép sàn)? session-start KIỂM gap đóng/defer đúng? | +| 5 | tiep/pause/snapshot — C7-compliant? recovery-integrity (Sàn-3 · wf-relaunch · snapshot)? cross-cut CHỐNG SÓT cả 5 axis | diff --git a/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/spec-apply-hub-s145-v2.md b/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/spec-apply-hub-s145-v2.md new file mode 100644 index 0000000..50769c9 --- /dev/null +++ b/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/spec-apply-hub-s145-v2.md @@ -0,0 +1,174 @@ +# SPEC v2 — Áp hub-answer + 5-vòng closure + tiep/pause/snapshot (synthesize từ /fable-clone ensemble) + +> S145 · governance/config-only. v1 verdict ensemble = **FAIL 2C + nhiều MAJOR** (đã verify TỪNG cái trên đĩa). v2 vá hết. Đây là bản **hmw 4.8 MAX** implement. 🔴 3 thay-đổi lớn nhất so v1: **(A) GỠ "4 surface→2" — nó SAI · (C) session_ctx_kb ĐỂ TRỐNG — KHÔNG hardcode 64 · (C↔E) hook 4-path PHẢI cập-nhật Sàn-3 tiep §0 atomic.** + +## [1] ĐỀ-BÀI +Áp 3 câu hub (C7 predicate 4-vế · bulk=30 · session-model 101e69d6) + đóng đủ 5 vòng + re-check tiep/pause/snapshot. Governance-only (0 src/·fe-*·tests/, 0 mig). + +## [2] CÁCH IMPLEMENT (v2 — per axis) + +### Axis A — C7 predicate 4-vế +1. **Viết luật §N** `harness-11-engine.md` (mục mới cạnh WAL H22, implementer chốt số N.x): predicate (i) read-only · (ii) KHÔNG spawn con · (iii) KHÔNG write · (iv) lỗi→`probe-lỗi (không chặn)`→đi-tiếp **[LOAD-BEARING]**. FLOOR = read-only + non-blocking + **gỡ-được-không-hậu-quả**. FORM = wording + interpreter. +2. Reword tập-cấm (KHÔNG cấm-tất): "cấm ĐẮT/side-effect; CHO PHÉP probe read-only non-blocking theo §N". pause.md:44 + tiep.md:112 **TRỎ** §N (B1, không chép predicate). +3. 🔴🔴 **GỠ HẲN v1-A.4 + v1-A2 "4 surface→2" — LÀ TIỀN-ĐỀ SAI.** Verify đĩa: `nhip-no-probe.ps1` có **4 caller THẬT** (pause:44 · tiep:112 · session-start:216 · session-end:104). Header "4 surface" + `session-model-se-draft.md:34` "4 điểm lệnh" = **ĐÚNG**. Spec-author v1 nhầm (session-start/end gọi CẢ nhip-no-probe @216/104 LẪN distill-shard-probe @135). **KHÔNG đụng header/draft.** (run.md:9 mang cùng lỗi → bỏ.) +4. **Fault-inject 2-chiều** (chứng vế-iv, script KHÔNG đổi code — `nhip-no-probe.ps1:203-208` catch→exit 0 đã thỏa): inject-vector = ép `-RepoRoot` bậy HOẶC kill mid-run (S135 precedent `-RepoRoot`); observe **no-hang** (timeout wrapper). (lành) probe OK → dòng-nợ in xong · (lỗi) → `probe-lỗi (không chặn)` + hoàn-tất KHÔNG hang. +5. 🔸 verify `distill-shard-probe.ps1` (probe THỨ-2 @session-start:135) cũng read-only/non-blocking (thỏa §N general) — nếu chưa, thêm. +- **Đường-chết:** đừng đổi python; đừng cấm-tất; đừng chép predicate 2 nơi; **đừng "sửa" header 4→2 (nó ĐÚNG — nhầm distill-shard-probe).** + +### Axis B — bulk_note_shards = 30 +1. `memory-budget.json:11` null→**30** + `_bulk_note` note (owner-set initial-anchor 2×min-SE, reference-not-copy, cờ LOUD không-đổi-hành-vi). 🔴 BÃO-TO target = **`distill-shard-probe.ps1:63`** (KHÔNG phải memory-budget.json:63 — v1 line-ref mờ). +2. **B-fault-inject boundary CÓ RĂNG** (cây-tạm `-RepoRoot`, bulk=30): **n=30 → tầng-2 IM** (tầng-1 KÊU, chứng "chỉ tầng-1 xử") · **n=31 → `BÃO-TO: backlog 31 > 30`**. Cặp 30/31 chứng ĐỒNG-THỜI `-gt` không off-by-one + tầng-2 độc-lập TRÊN tầng-1. (n≤15 = vô-giá-trị.) +- **Đường-chết:** số ≤15 vô-nghĩa; đừng copy 10 hub. + +### Axis C — session-model (BÁM WAL S144) +1. 🔴🔴 **session_ctx_kb = ĐỂ TRỐNG (KHÔNG hardcode 64).** Verify đĩa: **0 script đọc `session_ctx_kb`** (ghost-wire, khác `pull_warn_days` có reader `nhip-no-probe.ps1:190`); K6.2 cấm mượn số chưa-đo; SE artifact (`draft:55`·`spec-adap-dot-11:31`) khai để-trống = TUÂN-THỦ. "vắng→64KB" = default-AT-READ ⇒ để-trống ĐÚNG biểu-diễn "owner chưa chọn". **Chỉ set khi owner directive tường-minh** (kèm `_owner_set`); mặc-định = **KHÔNG đụng key** (hoặc mark `owner-gated-inert-pending-wire`). +2. **hook 4-path** `wal-flush.ps1:13`: 3-path → +**`.claude/sessions/`** (full path). 🔴 KHÔNG "pending-restart" — `settings.json:9` `-File` re-đọc body MỖI Stop ⇒ ăn NGAY. **Live-verify**: stage 1 file `sessions/session-/x` → trigger hook → confirm commit `wal: flush` nuốt nó. + fault-inject. +3. 🔴🔴 **CRITICAL-2 ATOMIC (seam C↔E) — hook 4-path BẮT BUỘC đi kèm cập-nhật Sàn-3 tiep.md §0:** + - (a) 4 site "3 path"/"3 điểm mù" → **"4 path"/"4 điểm mù"**: `tiep.md:21` · `:23` · `:75` · `:78`. + - (b) **THÊM strong-signal ⑤** cho `sessions/`: `wal:`-commit chưa-đẩy đụng `.claude/sessions/` (mirror signal ④ cho runs/) — vì per-pause context-map (C.5) hook auto-commit thành `wal:`, phiên chết còn context-map mà signal cũ MÙ = tái mở đúng bug "sổ trống≠sạch". + - (c) BẬC-TRUNG (:75/:78) "ngoài 3 path"→"ngoài 4 path". + - Acceptance: `grep "3 path\|3 điểm mù" tiep.md = 0` sau vá. +4. **VC-1 nhãn 2-tầng** `S` + `logic:L`. Align `session-model-se-draft.md` (gỡ VC-3 stale `logic-sessions/L` → hub-form `sessions/session-/`). +5. **Folder scaffold** `session-start.md`: `.claude/sessions/session-/` (N=phiên-LOGIC ID nguyên tăng, regex `^session-\d+$`); .gitignore verify `check-ignore -q` exit=1. +6. **per-pause context-map** `pause.md` append context-block vào `sessions/session-/` (accumulate); `tiep.md` đọc. +7. **orphan-L rule**: phiên chết giữa phiên-logic → `L`/`session-/` mồ-côi. Thêm rule `tiep` phát-hiện (gộp signal ⑤). KHÔNG để drift-vector hở. +8. **Q4-audit = DEFER** (chỉ display dòng-nợ; KHÔNG audit-rerun giữa phiên = phá C7). Optional: đo khoảng-giãn gửi hub. +- **Đường-chết:** VC-1 1-tầng giết tick; đừng bám VC-3 stale; đừng hardcode session_ctx_kb; hook-4-path mà quên Sàn-3 §0 = vỡ recovery-floor. + +### Axis D — 5-vòng closure +1. **Map verified** (lane-4 đĩa): V1→tooling-harvest-audit · V2→h24-audit · V3→harness-audit(built-in, wired 2-đầu) · V4→sleep-audit · V5→measured-label-gate(floor). ✓ REAL. +2. 🔴 **D2 = COMMIT DEFER (option b)** — lane-4 phán DEFER là đọc canonical ĐÚNG: "hai đầu" nhịp buộc tầng **ĐO** (H1/H2 báo-diff @open, wired 2-đầu); cột self-verify V1/V2/V4 canonical = **CLOSE-time**; @open output là diff-report nhẹ (đã em-main-verify), artifact authoritative (chốt/harvest/distill) ở close ⇒ KHÔNG có gì authoritative để audit @open. **Landing site defer-rationale** = ghi vào `session-end.md` cạnh (g-bis) + contract 3 vai (1 dòng "KIỂM end-only: @open chỉ diff-report, authoritative-artifact ở close"). **+ H24-coupling**: khai rõ h24-audit theo cặp H24 **wherever it fires** (nếu H24 OVERDUE chạy @session-start §2.1.8 thì h24-audit theo — HOẶC khai end-only intentional + lý-do). +3. **D1 completeness-gate CÓ RĂNG**: mỗi phép sàn SHOW disk-evidence (KHÔNG bare-PASS): phép-1 cửa-count vs counter-delta (số) · phép-2 literal dòng-nợ 3-vế · phép-3 3 closeout ritual-sổ trace · phép-4 roles-ran list + sổ paths. +4. 🔴 **phép-4 landmine + incremental resolve**: đĩa NOW = `tooling-harvest-audit/` RỖNG (no MEMORY.md), `h24-audit/`+`sleep-audit/` MISSING. 3 KIỂM **WIRED AUTO** nhưng **CHƯA chạy audit THẬT** phiên này (không có measure H1/H2/H24/sleep để chấm; tooling-harvest-audit chỉ spawn-PROBE cố-ý-0-ghi). ⇒ completeness-gate ghi 3 vai = **"not-yet-run (vacuous)" + folder-state evidence**, KHÔNG phép-4 FAIL. Sửa session-end.md:123 "land dần sau" → "cả 3 BUILT+WIRED S145; chạy audit-round khi measure vòng tương-ứng chạy" (gỡ ambiguity với :40-42 AUTO). + +### Axis E — tiep/pause/snapshot +1. **E1 concrete teeth** (thay "review PASS" vòng-tròn): `pause.md:17` wf: đủ 5-trường (grep run=/runId=/args=/done=/harvested=) · `tiep.md §0` đủ 4 (→ post-C.2 là 5) signal MẠNH · `tiep.md:127` rule "memory-pack DẪN-XUẤT-LẠI TƯƠI (CẤM reuse cũ)" present · run.md có `## taskList snapshot`. +2. **Fix line-ref** `tiep.md:23` `wal-flush.ps1:7`→`:13` (paths thật ở :13; :7=comment). Gộp khi vá §0 (C.3). +3. Seam C↔E = đã xử ở Axis C.3 (atomic). + +## [3] CHECKLIST ACCEPTANCE v2 (đo được, siết teeth) +| # | Axis | Acceptance có-răng | +|---|---|---| +| A1 | C7 luật | §N có predicate 4-vế; **wording khớp FLOOR 3 tính-chất** (read-only·non-blocking·gỡ-được-không-hậu-quả) + tách FLOOR/FORM; pause/tiep TRỎ §N (grep chép-predicate-2-nơi=0) | +| A2 | C7 no-op | 🔴 **KHÔNG đụng "4 surface"/"4 điểm lệnh"** (chúng ĐÚNG); grep header vẫn "4 surface" = pass | +| A3 | C7 fault-inject | inject-vector (`-RepoRoot` bậy/kill) → `probe-lỗi (không chặn)` + no-hang (timeout-observed) | +| B1 | bulk số | `memory-budget.json:11`=30 (>15); grep `bulk_note_shards\|30` trong {commands·agents·engine}=0 (value duy-nhất memory-budget.json) | +| B2 | bulk boundary | n=30→IM · n=31→`BÃO-TO 31>30` trên cây-tạm (chứng -gt + tầng-2>tầng-1); target=`distill-shard-probe.ps1:63` | +| C1 | session_ctx_kb | 🔴 **key ĐỂ TRỐNG** (hoặc `owner-gated-inert-pending-wire`); grep consumer-script (nếu 0 → khai ghost-wire, KHÔNG set số) | +| C2 | hook 4-path | `wal-flush.ps1` = 4 path (+`.claude/sessions/`); **live-verify** (stage→hook→commit nuốt), KHÔNG "restart" | +| C2b | 🔴 Sàn-3 sync | `grep "3 path\|3 điểm mù" tiep.md = 0`; signal ⑤ cho sessions/ tồn-tại; BẬC-TRUNG "4 path" | +| C3 | VC-1 tick-behavior | grep counter/OR-guard/H24 đọc `S` KHÔNG `L`; fault-inject ép L → tick +0 (chứng guard, KHÔNG chỉ label-shape) | +| C4 | scaffold + orphan-L | sessions/session-`` regex + gitignore-verify + per-pause context-map + orphan-L rule + Q4-defer documented | +| D1 | completeness-gate | 5 vòng chức-năng + 4 phép sàn, MỖI phép SHOW disk-evidence (không bare-PASS) | +| D2 | defer-landing | DEFER (b) ghi vào session-end.md/contract 3 vai + H24-coupling khai; phép-4 = 3 KIỂM "not-yet-run vacuous" + folder-state | +| E1 | tiep/pause/snapshot | 4 check cụ-thể (wf:5-trường · Sàn-3 5-signal · memory-pack-rule · taskList-snapshot); line-ref :23→:13 fixed | +| Z | governance-only | 0 file src/·fe-*·tests/ (git-diff); test count giữ; bundle FROZEN | + +--- + +## [4] 🔴 ADDENDUM @S146 (em-main, lúc /tiep relaunch) — C2b THIẾU CONSUMER + +> **Bối-cảnh:** v2 mục C.3 chỉ liệt `tiep.md` 4 site. Grep lại toàn-repo lúc relaunch ⇒ **claim "3 path" còn sống ở 3 nơi NỮA mà v2 KHÔNG nhắc**. Đây đúng class `cardinality-change → grep MỌI consumer` (S87/S88: *sửa write-site sót read-site → vỡ feature*). Nếu chỉ theo v2 thì hook thành 4-path còn 3 surface vẫn dạy "3" ⇒ tái-tạo đúng cái drift mà Sàn-3 sinh ra để chặn. + +### C2b-EXT — bảng consumer ĐẦY-ĐỦ (phân LIVE ⟂ LỊCH-SỬ) + +**🔴 LIVE PRESCRIPTIVE — BẮT BUỘC flip cùng commit với hook:** +| # | file | site | nội-dung phải đổi | +|---|---|---|---| +| 1 | `.claude/hooks/wal-flush.ps1` | `:13` | **SOURCE** — `$paths = @(…)` 3→4 (+`.claude/sessions/`) | +| 2 | `.claude/commands/tiep.md` | `:21` `:23` `:75` `:78` | "3 điểm mù"→4 · "3 path"→4 (v2 §C.3 đã liệt) | +| 3 | 🔴 `docs/governance/harness-11-engine.md` | **N.2** | **CANONICAL FLOOR** — *"`git add` per-path **3 path cố định** {WAL · agent-memory · workflows/runs}"*. **v2 SÓT.** Đây là **luật gốc** mà hook thi-hành ⇒ sót = hook vi-phạm chính floor của nó | +| 4 | 🔴 `.claude/governance/.session-counter.json` | `_why_this_path` | *"The hook covers **exactly 3 paths** … `.claude/governance/` is **OUTSIDE all three**"*. **v2 SÓT.** Ngoài đổi số, PHẢI **tái-verify** mệnh-đề: `.claude/governance/` có còn ngoài **cả 4**? (còn — `sessions/` ≠ `governance/`) ⇒ sửa thành "outside all four" + giữ nguyên lý-do | +| 5 | 🔴 `.claude/auto-memory/project_h22_wal_session_continuity.md` | `:10` | *"persist-only (per-path+CAND+exit-0; **3 path**: WAL/agent-memory/runs)"*. **v2 SÓT — NGUY NHẤT:** file này **auto-inject MỖI PHIÊN** ⇒ để stale = mọi phiên sau bị dạy sai ngay từ context đầu-vào | + +**🧊 LỊCH-SỬ — KHÔNG rewrite (nguyên-tắc C8 "đừng rewrite history"):** +`docs/governance/adap-reports/2026-07-14-…:56` (báo-cáo có ngày) · `.claude/agent-memory/reviewer/{MEMORY.md,archive/2026-07.md}` (nhật-ký vai) · `.claude/WAL.md` (bị ghi-đè theo nhịp). +⇒ Chúng mô-tả *trạng-thái LÚC ĐÓ*, đúng tại thời-điểm viết. Đụng vào = phá vết. + +### Acceptance C2b-EXT (thay acceptance C2b cũ — siết hơn) + +> 🔴 **HIỆU-CHỈNH @S146 sau khi CHẠY THẬT — bản đầu của chính mục này SAI (quá rộng).** Mẫu trần `'3 path'` **khớp nhầm** `session-end.md:162` → *"3 path `runs//harness-*-return.md`"*, tức **3 đường-dẫn file return của bộ-ba memory** — KHÔNG dính gì tới danh-sách path của hook. Câu đó **ĐÚNG**, phải để yên. +> ⇒ Nếu giữ mẫu trần: acceptance **KÊU vĩnh-viễn** (nợ ảo), hoặc tệ hơn — ai đó "vá" cho hết kêu bằng cách **sửa một câu đang đúng**. Đây đúng class `matcher quá rộng` (họ hàng citation-trap): **discriminator phải là NGỮ-NGHĨA** (*"3 path" nói về HOOK*) chứ không phải literal. +> 🔸 Neo vào **TÍNH-CHẤT**, đừng neo vào literal: cụm chỉ sai khi nó **liệt-kê danh-sách path của `wal-flush.ps1`**. + +> 🔴🔴 **HIỆU-CHỈNH LẦN 2 @S146 — reviewer bác bản siết ở trên (F2). Bản siết SAI TRỤC, và nó đã để lọt lỗi thật.** +> Bản siết lọc bằng **co-occurrence CÙNG DÒNG** (`3 path` phải đứng cạnh chữ `hook`/`WAL.md`/…) + **tập-file hẹp**. Đo lại trên `HEAD` tiền-vá: bắt **7/11** site — **trượt 4 ca THẬT**: +> | ca trượt | vì sao | +> |---|---| +> | `session-end.md` ×2 `hook-3-path` | regex chỉ có `3 path` **dấu cách**; đây là **gạch nối** ⇒ 0 match. **Chính ca này sống sót tới lúc reviewer bắt.** | +> | `tiep.md:78` *"Bẩn ngoài 3 path…"* | dòng không chứa từ-khoá hook ⇒ bị vế-2 vứt | +> | `session-model-se-draft.md` ×2 | file **ngoài tập quét** | +> 🔴 **Bài học (lần 2 trong CÙNG một phiên, ngược chiều nhau):** lần 1 bộ lọc **quá rộng** (nuốt câu đúng), lần 2 **quá hẹp** (lọt lỗi thật). Cả hai đều vì **cố mã-hoá "ý-định" vào một regex khôn**. Cách đúng: **loại theo ĐƯỜNG-DẪN** (lịch-sử ⟂ live — thuộc-tính có thật của file), **khớp RỘNG** (mọi biến thể chữ), và miễn-trừ dương-giả bằng **allowlist CÓ TÊN + lý-do**, không bằng mẹo regex. + +```bash +# 1) 0 surface LIVE nào còn dạy cardinality CŨ của hook +# Trục lọc = ĐƯỜNG-DẪN (không phải từ-khoá cùng dòng). Khớp RỘNG mọi biến thể chữ. +grep -rnE '3[ -]path|3 điểm mù|exactly 3 paths|three paths|ba path' \ + --include='*.md' --include='*.json' --include='*.ps1' . 2>/dev/null \ +| grep -v '/node_modules/' \ +| grep -vE '^\./(broadcasts|docs/governance/adap-reports|docs/changelog|docs/_archive)/' \ +| grep -vE '^\./\.claude/(agent-memory|workflows/runs)/' \ +| grep -vE '^\./\.claude/WAL\.md:' \ +| grep -vE 'harness-\*-return\.md' # ← ALLOWLIST CÓ TÊN (xem dưới) +| grep -v '🧊' # ← USE ⟂ MENTION (xem "citation-trap" dưới) +# 🔴 KỲ-VỌNG **KHÔNG PHẢI 0** — xem ALLOWLIST dưới. Đây là **LƯỚI SOÁT cho người**, KHÔNG phải cổng-chặn. +# +# 🔸 ALLOWLIST — 4 mục, mỗi mục khai lý-do (KHÔNG dùng mẹo regex để giấu chúng): +# (1) session-end.md ô V3 bảng 5-vòng: "3 path `runs//harness-*-return.md`" +# = 3 ĐƯỜNG-DẪN FILE return của bộ-ba memory. Không dính hook. CÂU ĐÚNG. +# (2) docs/guides/deployment-iis.md:45 "3 site hoặc 1 site với 3 path" = path của IIS. Khác miền. +# (3) docs/guides/rag-onboarding-guide.md:128 "Default 3 path cover docs…" = corpus_paths của RAG. Khác miền. +# (4) docs/governance/README.md:93 "rag-v1.3 path-b" = trúng vì SỐ PHIÊN-BẢN `v1.3` + chữ `path`. Rác thuần. +# + session-model-se-draft.md: "hook 3→4 path" / "body-3-path (control)" = đang KỂ chuyện nới path. ĐÚNG. +# +# 🔸 Vì sao loại 4 nhóm đường-dẫn trên: chúng là LỊCH-SỬ (broadcast hub · adap-report có ngày · +# session-log · archive · nhật-ký vai · run-folder · WAL ghi-đè) — đúng tại thời-điểm viết. +# Sửa = rewrite history, đúng cái C8 cấm. Đây là thuộc-tính CỦA ĐƯỜNG-DẪN, ổn-định hơn từ-khoá. +# +# 🔸 Đối-chứng ANTI-GOODHART (chạy kèm, BẮT BUỘC): bỏ 4 vế `grep -v` đường-dẫn phải ra >0 dòng +# (đo @S146: **119**). Ra 0 => phép quét đã chết (vacuous), KHÔNG phải repo sạch. +``` + +### 🔴 KẾT-LUẬN THẲNG về phép này (đừng nâng cấp nó thành cổng) + +**Không cơ-khí-hoá được thành zero-gate.** Cụm "3 path" sống hợp-lệ ở **≥3 miền khác** trong repo (IIS site-path · RAG `corpus_paths` · chuỗi phiên-bản `v1.3 path-b`). Mọi regex đủ hẹp để loại chúng đều đủ hẹp để **lọt biến-thể chữ của ca thật** — đã chứng: `hook-3-path` (gạch nối) sống sót qua bản siết và **chỉ reviewer bắt được**. + +⇒ Nấc đúng = **lưới soát cho người** + **allowlist có tên**. Cùng khuôn `/tiep §0` đã dùng cho **dạng-4** (*"để nguyên cho người phán, KHÔNG cơ-khí-hoá"*). Ai thêm hit mới thì **phân-loại tay** rồi hoặc vá, hoặc thêm vào allowlist **kèm lý-do**. + +### 🪤 CITATION-TRAP — bộ dò bắt chính nốt-vá của mình (xảy ra THẬT @S146, lần thứ 4) + +Vá xong `ACTIVE-MARKS.md:20` + `STATUS.md:450`, chạy lại ⇒ **cả hai VẪN kêu**. Lý do: ghi-chú lineage em viết để **giữ vết** có dạng *"🧊 stamp S111 ghi **3-path**; nới +`.claude/sessions/` @S146"* — tức **nốt vá trích-dẫn đúng giá-trị cũ**, và bộ dò khớp-mẫu **không phân-biệt được**: + +| | dạng | ví-dụ | +|---|---|---| +| **USE** — phải vá | doc đang **KHẲNG-ĐỊNH** hook có 3 path | *"file ngoài `hook-3-path`"* | +| **MENTION** — phải tha | doc đang **KỂ LẠI** rằng xưa là 3, nay là 4 | *"🧊 stamp S111 ghi 3-path; nới @S146"* | + +**Discriminator = `🧊`** — quy-ước SẴN CÓ của repo cho *"phát-biểu đã nghỉ hưu, giữ làm vết"*. Không đẻ ký-hiệu mới; chỉ **dùng đúng cái đã có**. +⚠️ **Giới-hạn thứ-2 (đo được, đừng quên):** `🧊` lọc theo **DÒNG**. `docs/STATUS.md` có **mega-line** dài hàng nghìn ký-tự ⇒ đặt 1 chữ 🧊 ở đó là **miễn-trừ nguyên cả row** khỏi lưới. ⇒ Với mega-line, **đừng dùng 🧊** — hãy **diễn-đạt lineage KHÔNG lặp lại cụm bị dò** (vd *"hook nới từ 3 lên 4 @S146"* thay vì *"3-path tới S145"*). Ca thật @S146: STATUS.md:450 xử đúng theo cách này. +🔴 **Rủi-ro khai thẳng:** ai đó có thể **núp sau 🧊** để giữ một khẳng-định stale thật. Chấp-nhận, vì (a) 🧊 là dấu **người viết cố-ý đặt**, không tự mọc; (b) lưới này vốn **cho người soát**, không phải cổng — người đọc thấy 🧊 vẫn liếc được. Đổi lại: **không có 🧊 thì mọi nốt-vá-có-lineage đều thành dương-giả vĩnh-viễn**, và hậu-quả thực-tế là **người ta sẽ xoá lineage cho hết kêu** — mất đúng thứ quý nhất. + +📌 **Lịch-sử 4 lần sửa phép này TRONG CÙNG MỘT PHIÊN — giữ làm vết, đừng xoá:** +| lần | lỗi | ai bắt | +|---|---|---| +| v1 | **quá rộng** — nuốt `session-end.md:162` (câu ĐÚNG về 3 file return) | lead tự bắt lúc chạy | +| v2 | **quá hẹp** — lọc co-occurrence cùng dòng + tập-file hẹp ⇒ **lọt 4 ca thật**, gồm `hook-3-path` | **reviewer** (F2) | +| v3 | **rộng lại** — kéo về 3 miền không liên-quan | lead, khi chạy thật | +🔴 **Bài học nén 1 câu:** ba lần đều vì **cố mã-hoá "ý-định" vào một regex khôn**. Ý-định ở đây là **ngữ-nghĩa** (*"đang nói về danh-sách path của hook"*) — thứ mà **khớp-mẫu không biểu-diễn được**. Chỗ nào ngữ-nghĩa là tiêu-chí thì **để người phán + allowlist có tên**, đừng đẻ thêm regex. + +# 2) hook thật = 4 path +grep -n '$paths = @' .claude/hooks/wal-flush.ps1 # phải thấy .claude/sessions/ + +# 3) mệnh-đề counter còn ĐÚNG sau khi +1 path +grep -o 'OUTSIDE all four' .claude/governance/.session-counter.json # phải có +``` +🔴 **Ranh:** phép (1) **CỐ Ý** loại `adap-reports/` + `agent-memory/` + `WAL.md` khỏi tập quét — chúng là lịch-sử. Quét cả vào sẽ ép rewrite-history, đúng cái sai mà `/tiep §0` dạng-2 C8 đã cảnh-báo. + +### §N pin số (seam A↔CE — em-main chốt, KHÔNG để worker tự chọn) +`harness-11-engine.md` PHẦN N hiện có **N.1…N.7** ⇒ luật C7 predicate = **§N.8**. Worker-1 viết §N.8; worker-2 chèn dòng TRỎ `§N.8` ở `pause.md`/`tiep.md`. **Cả hai dùng đúng số này** (chạy song song, không hỏi nhau được). +🔸 Worker-1 **kiêm luôn N.2** (cùng file `harness-11-engine.md` — tránh 2 tay 1 file): sửa "3 path cố định"→"4 path cố định" +`.claude/sessions/`. + +## Ghi-chú synthesis (em-main, cho hmw) +- **v1→v2 GỠ:** "4 surface→2" (SAI) · session_ctx_kb=64 (K6.2 vi-phạm + ghost-wire). +- **v1→v2 THÊM:** Sàn-3 §0 atomic (C2b) · phép-4 vacuous-resolve (D2) · B2 boundary 30/31 · C3 tick-behavior · orphan-L rule · fault-inject vectors. +- **Owner-question NỔI:** session_ctx_kb — SE giữ kỷ-luật ĐỂ-TRỐNG (K6.2); owner muốn set 64 tường-minh thì báo, em thêm `_owner_set`. diff --git a/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/spec-apply-hub-s145.md b/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/spec-apply-hub-s145.md new file mode 100644 index 0000000..5e82564 --- /dev/null +++ b/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/spec-apply-hub-s145.md @@ -0,0 +1,64 @@ +# SPEC v1 — Áp hub-answer (C7 + bulk + session-model) + 5-vòng closure + tiep/pause/snapshot re-check + +> S145 · governance/config-only (0 prod-code · 0 mig · test giữ · bundle FROZEN). Pipeline: spec → `/fable-clone reviewer` ensemble → em-main synthesize → `hmw` 4.8 MAX. **Số/luật cuối = SE tự đặt SAU verify 2-tuyến (đã) + fault-inject 2-chiều (G-015, hub dặn).** + +## [1] ĐỀ-BÀI (3 câu) +Áp 3 câu trả lời canonical của hub (đã verify 2-tuyến `01f567`/`8378a6`): **C7** predicate 4-vế · **bulk_note_shards=30** · **session-model** trên manifest 101e69d6. ĐỒNG THỜI (owner S145): (D) verify + đóng đủ **5 vòng** tự-bảo-trì trong session-start/end · (E) re-check kỹ **tiep/pause/snapshot**. Neo tất cả về canonical (B1 con-trỏ, KHÔNG chép số/luật rải rác). + +## [2] CÁCH IMPLEMENT (per axis + đường-chết) + +### Axis A — C7 "điểm-dừng-rẻ" (predicate 4-vế) +Hiện: `nhip-no-probe.ps1:65-206` try/catch → `:203-206` catch in `probe-loi (khong chan)` → `:208` `exit 0`; read-only. ✅ Script THỎA 4-vế rồi. CHƯA có luật thành-văn (engine §N = 0 hit). +1. **Viết luật C7 thành-văn** — NHÀ = `harness-11-engine.md §N` (thêm mục N.x "C7 điểm-dừng-rẻ", cạnh WAL H22). Predicate: (i) read-only · (ii) KHÔNG spawn process con · (iii) KHÔNG write file · (iv) lỗi → in `probe-lỗi (không chặn)` → đi tiếp **[LOAD-BEARING]**. FLOOR = read-only + non-blocking + **gỡ-được-không-hậu-quả**. FORM = wording + interpreter (powershell OK, KHÔNG đổi python). +2. **Reword tập-cấm** (KHÔNG "liệt-kê", KHÔNG "cấm-tất"): *"cấm tiến-trình ĐẮT/side-effect (write·network·spawn-con·blocking); CHO PHÉP probe read-only non-blocking theo predicate §N"*. +3. **pause.md:44 + tiep.md:112**: inline-guard TRỎ về §N C7 (B1 — KHÔNG chép predicate 2 nơi). +4. 🔴 **Đính-chính stale-claim:** `nhip-no-probe.ps1:6-7` header "gọi bởi 4 surface (/pause /tiep session-start session-end)" → **SAI**, thực chỉ **2** (pause:44 + tiep:112; session-start/end gọi `distill-shard-probe` script KHÁC). Sửa header → 2. + `session-model-se-draft.md:34` "4 điểm lệnh" → 2. +5. **Fault-inject 2-chiều** (chứng vế-iv, script KHÔNG đổi code): (lành) probe OK → pause in dòng-nợ xong · (lỗi) ép `nhip-no-probe.ps1` lỗi/kill giữa chừng → pause in `probe-lỗi (không chặn)` **VẪN xong, KHÔNG hang**. +- **Đường-chết:** đừng đổi interpreter sang python (FORM, hub KHÔNG đòi); đừng cấm-tất (cấm nhầm probe lành); đừng chép predicate vào pause/tiep (drift 2-nơi). + +### Axis B — bulk_note_shards = 30 +Hiện: `memory-budget.json:11` = null; BÃO-TO `:63` `if bulkShards!=null AND n -gt bulkShards`. Single-source clean. +1. Set `:11` `null → 30` (2×min-SE=15, **reference-not-copy** — KHÔNG copy 10 của hub; **>tầng-1 15** ✓). +`_bulk_note` semantics (owner-set, cờ LOUD observability, KHÔNG đổi hành-vi nén). +2. **Fault-inject 2-chiều:** (im) pending ≤30 → tầng-2 IM (chỉ tầng-1 xử) · (bão) pending >30 → `BÃO-TO: backlog N > 30`. +- **Đường-chết:** số ≤15 = tầng-2 dưới tầng-1 = vô-nghĩa; đừng copy 10 (min hub=1 khác scale). + +### Axis C — session-model (build trên manifest 101e69d6 · BÁM WAL S144 KHÔNG draft VC-3) +Hiện: manifest 4 khoản (①.gitignore PASS ②pause/tiep+WAL CÓ ③session_ctx_kb THIẾU ④folder chưa tạo). 🔴 Draft VC-3 (`logic-sessions/L`) **STALE** — owner S144 override → hub-form `sessions/session-/`. +1. **session_ctx_kb**: set `memory-budget.json` = **64** (canonical default "vắng→64KB"; owner override được — note owner-gated như `pull_warn_days`). +2. **hook 4-path**: `wal-flush.ps1:13` 3-path → **+`sessions/`** (path-4). 🔴 CHẠM CƠ-CHẾ (owner S144 chốt "hook nối 4-path") — ENV-dep, **restart để ăn**; verify hook fire sau. +3. **Folder scaffold**: `session-start.md` scaffold `.claude/sessions/session-/` (N = phiên-LOGIC ID **nguyên tăng**, regex `^session-\d+$`); `.gitignore` verify không nuốt (`check-ignore -q` exit=1). +4. **VC-1 nhãn 2-tầng**: `S` (vật-lý) + `logic:L` (phiên-logic). 🔴 **BẮT BUỘC 2-tầng** — `S`=phiên-logic thì OR-guard tick **chết** (phép-7 +0, bẫy label-convention S135). Align `session-model-se-draft.md` VC-3 → WAL-S144 hub-form + bump nấc. +5. **per-pause context-map**: `pause.md` append context-block vào `sessions/session-/` (accumulate, KHÁC WAL overwrite ≤40); `tiep.md` đọc context. +6. **Q4 van-audit-giữa-phiên = DEFER** (hub chốt): chỉ build DISPLAY (dòng-nợ đã có); **KHÔNG build audit-rerun giữa phiên** (phá C7 non-blocking). Optional: đo khoảng-giãn 2-đầu gửi hub (§5 mời). +- **Đường-chết:** VC-1 1-tầng = giết tick; đừng theo draft VC-3 stale; hook-change chưa restart = chưa ăn (khai pending-restart); L mồ-côi khi phiên chết = drift-vector (cần rule). + +### Axis D — 5-vòng closure (verify + đóng) +Canonical: V1 tooling/harvest→`tooling-harvest-audit` · V2 soi-lead→`h24-audit` · V3 trio→`harness-audit` · V4 nén-ngủ→`sleep-audit` · V5 truth-floor→measured-label-gate(floor). Checklist f71c5b65: completeness-gate = **5 vòng chức-năng + 4 phép sàn** (1 tick-vs-cửa · 2 dòng-nợ-3-vế · 3 closeout-đủ-nghi-thức · 4 vai-đã-chạy-có-sổ). +1. **Verify từng vòng** ĐO+KIỂM đúng nhịp trong session-start/end (bảng 5 hàng × {vòng·ĐO-ở-đâu·KIỂM-ở-đâu·đủ/thiếu}). +2. 🔴 **Đóng GAP session-START KIỂM**: checklist V1 nhịp="HAI ĐẦU". 3 KIỂM mới wire session-END only. Quyết: (a) mở-rộng KIỂM phủ session-start HOẶC (b) **defer có-lý-do** (session-start measure = "báo diff" nhẹ, KIỂM đợi session-end authoritative — document defer + acceptance). /fable-clone lane-4 phán. +3. **Chạy completeness-gate** → PASS (5 vòng + 4 phép sàn). +- **Đường-chết:** "5 vai = 5 vòng đóng" SAI — phải đúng nhịp + qua 4 phép sàn; đừng nhét audit nặng vào điểm-dừng (phá C7). + +### Axis E — tiep/pause/snapshot re-check +1. **pause.md**: WAL-write ≤40 · `wf:` snapshot 5-trường · C7 stop-path (nhip-no-probe non-blocking) · commit đích-danh `wal: pause`. Verify đúng + C7-compliant. +2. **tiep.md**: Sàn-3 "sổ trống≠sạch" (4 tín-hiệu MẠNH + DUAL-ACCEPT orphan dạng-3-retired) · ground-truth-thắng-WAL · §4 wf-relaunch cắt-gọt (taskList snapshot + memory-pack DẪN-XUẤT-LẠI TƯƠI). Verify đúng. +3. **snapshot**: `## taskList snapshot` run.md đầy-đủ? `wf: args=`? memory-pack-tươi rule? Integrity. +4. Fix defect nếu tìm thấy. +- **Đường-chết:** đừng reuse memory-pack snapshot cũ (lỗi-thời sau harvest); Sàn-3 KHÔNG suy "chain rỗng ⇒ sạch". + +## [3] CHECKLIST ACCEPTANCE (đo được — có răng) +| # | Axis | Acceptance | +|---|---|---| +| A1 | C7 luật | §N có mục C7 predicate 4-vế; pause/tiep TRỎ về §N (grep 0 chép-predicate-2-nơi) | +| A2 | C7 stale-fix | `nhip-no-probe.ps1:6-7` header = "2 surface"; `session-model-se-draft:34` = 2 (grep "4 surface\|4 điểm lệnh" = 0 hit stale) | +| A3 | C7 fault-inject | chiều-lỗi: ép probe lỗi → pause in `probe-lỗi (không chặn)` + hoàn-tất (KHÔNG hang) — chạy thật, KHÔNG happy-path | +| B1 | bulk số | `memory-budget.json:11` = 30 (số > 15); grep derived-copy = 0 | +| B2 | bulk fault-inject | im (≤30) / bão (>30 → `BÃO-TO`) 2-chiều PASS trên cây tạm | +| C1 | session_ctx_kb | key = 64 trong memory-budget.json | +| C2 | hook 4-path | `wal-flush.ps1` = 4 path (+sessions/); khai pending-restart để ăn | +| C3 | VC-1 2-tầng | nhãn = `S` + `logic:L` (KHÔNG 1-tầng); draft aligned S144 (VC-3 stale gỡ) | +| C4 | session-model scaffold | sessions/session-`` regex + .gitignore-verify + per-pause context-map + Q4-defer documented | +| D1 | 5-vòng completeness-gate | ĐẠT: 5 vòng chức-năng + 4 phép sàn (bảng verify) | +| D2 | session-start KIỂM gap | đóng HOẶC defer-có-lý-do documented (không im-lặng bỏ) | +| E1 | tiep/pause/snapshot | review PASS; defect (nếu có) fixed; C7-compliant | +| Z | governance-only | 0 file src/·fe-*·tests/ đụng (verify git-diff); test count giữ; bundle FROZEN | diff --git a/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/sub-h24-audit-S146.md b/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/sub-h24-audit-S146.md new file mode 100644 index 0000000..37f9bff --- /dev/null +++ b/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/sub-h24-audit-S146.md @@ -0,0 +1,77 @@ +# sub-h24-audit-S146 — KIỂM vòng soi-lead H24 (vai #3/3, C4b tuần-tự) + +> Vai: `h24-audit` — KIỂM **2 con-đo H24**, KHÔNG soi lead trực-tiếp. Propose-only. +> no-self-exempt: tao ≠ `lead-view-auditor` ≠ `lead-omission-auditor`. ✅ +> **Ghi đĩa TRONG lúc làm** (anti-#53 — cả 2 vai H24 phiên này ĐỀU garble). Trạng-thái: ĐANG CHẠY. + +## (i) PIN + fail-safe — VERIFY TỒN-TẠI ✅ PASS + +| pin | tồn-tại | byte | mtime | tươi? | +|---|---|---|---|---| +| `sub-lead-view-S146.md` | ✅ | 10.404 | 2026-07-22 23:52 | ✅ phiên này | +| `sub-lead-omission-S146.md` | ✅ | 20.043 | 2026-07-23 00:02 | ✅ phiên này | + +⇒ H24 CÓ chạy phiên này. **KHÔNG NO-OP.** Tuần-tự C4b: file này ghi SAU 00:02 ⇒ mtime tao > mtime cặp. ✅ + +FLAG-list nhận: **3 view + 4 omission = 7 FLAG**. Khớp lệnh spawn. + +--- + +## 🔴 PHƯƠNG-PHÁP — bẫy "đo-xong-lead-đã-vá" (phải khai TRƯỚC mọi verdict) + +Cả 2 vai H24 đo lúc **23:52** (view) / **00:02** (omission). Lead **đã vá nhiều FLAG NGAY SAU ĐÓ** +(WAL mtime `00:05:53` · `tiep.md` `23:55:18` · `h24-audit.md` `23:54:39`). +⇒ Nếu tao chấm theo **đĩa HIỆN TẠI**, tao sẽ báo TRƯỢT hàng loạt FLAG **đúng** chỉ vì chúng đã được sửa. +🔴 **Luật tao tự đặt:** mỗi FLAG chấm theo **state TẠI THỜI-ĐIỂM ĐO**, dựng lại bằng `git show :` ++ đối-chiếu mtime. Neo: `ea3eb30` (23:59:07) = commit cuối; `.claude/agents/` + `.claude/commands/` +**NGOÀI 4-path hook** ⇒ sửa ở đó KHÔNG auto-commit ⇒ phải dùng **mtime**, không dùng git, để định thời. + +Timeline neo (git log `--date=format`): +`ad02483` 23:05 → `9c68bae` 23:10 → `e7d06f2` 23:26 → `c2d1a05` 23:30 → `c03f359` 23:49 → +**[view đo 23:52]** → `a6863a1` 23:56 → `ea3eb30` 23:59 → **[omission đo 00:02]** → [lead vá WAL 00:05] + +--- + +## (ii) Verdict per-FLAG — 7/7 + +### view FLAG-1 · `view-stale-status` · `tiep.md:100` wired-but-declared-unwired → **ĐẠT** +- Dựng lại `git show ea3eb30:.claude/commands/tiep.md` (= bản `c2d1a05` 23:30, file ngoài hook-path, + mtime 23:55:18 **sau** lượt đo 23:52 ⇒ lúc đo đĩa đúng bản này): + `:100` 🔴 *"`closed.md` … **CHƯA wire** (bảng **VC-2** còn chờ anh duyệt)"* — **có thật, nguyên-văn**. +- Nghịch-lý nội-tại **verify độc-lập**: cùng bản đó, `:89` ghi *"hoặc closed.md do đóng-L"*, + `:94` `c=0; [ -f "$d/closed.md" ] && c=1`, `:95` `[ "$p" -gt $((r + c)) ]` + ⇒ **MÁY ĐỌC `closed.md` THẬT** trong khi PROSE khai "chưa wire". Chẩn-đoán **wired-but-declared-unwired** CHÍNH XÁC. +- Class `view-stale-status` ∈ enum ✅. Ranh-giới `:23` (không flag run-trace S145 frozen-by-design) = **đúng luật**. +- 🔸 Đã được vá lúc 23:55: `:100` lật ✅ Đà WIRE, `:101` hạ 🧊 lineage **đúng nguyên-văn câu cũ**, `:102` ghi công + *"H24 `lead-view-auditor` bắt @S146"*. ⇒ resolve của FLAG được thi-hành **y hệt** đề-xuất. + +### view FLAG-3 · `view-residual-asym` · sweep-consent sót 6 site → **ĐẠT** (+ 🔴 residual CÒN SỐNG) +- Dựng lại `git show ea3eb30:.claude/agents/h24-audit.md` (bản `c2d1a05`; mtime đĩa 23:54:39 **sau** 23:52): + `:4` "OVERDUE+consent" ✅ · `:25` "OVERDUE + anh consent" ✅ · `:27` "OVERDUE + anh consent" ✅ · + `:28` "chưa tới nhịp / anh không consent" ✅ ⇒ **4/4 site tao kiểm được đều CÓ THẬT**. +- Source đối-chứng: `session-end.md:106` + `session-start.md §2.1.8(e)` + `WAL:9 [7](3)` = auto ⇒ lệch **thật**. +- 🔴 **TAO TỰ ĐO ĐƯỢC — RESIDUAL CHƯA ĐÓNG:** đĩa **NGAY BÂY GIỜ** `.claude/agents/h24-audit.md:25` vẫn là: + `- Owner S145: **AUTO sau đo, KHÔNG consent-gate.** Cặp H24 chạy xong (… §2.1.8 khi OVERDUE + anh consent) ⇒ …` + ⇒ lead đã vá `:4`, `:27`, `:28` nhưng **BỎ SÓT `:25`** — câu **tự mâu-thuẫn trong CÙNG một dòng** + ("KHÔNG consent-gate" … "khi OVERDUE + anh consent"). **5/6 đóng, 1/6 sống.** + Bằng-chứng mạnh nhất: dòng đó **đang nằm trong persona nạp vào chính tao lượt này** — tao đọc được nó ở + context của mình VÀ trên đĩa, 2 nguồn khớp. + 🔴 Đây là **đời-3 của cùng lớp lỗi** lead-view đã cảnh-báo (S143 grep-theo-SỐ → S146 sweep-consent → + nay **vá-sót ngay trong lượt vá**). Vá theo *danh-sách site do người khác liệt* mà không **tự grep lại + sau khi vá** = đúng cái bẫy FLAG-3 mô-tả. + +### omission FLAG-1 · `gap-owner-specifics` · owner-decision `[7]` bị ghi đè → **ĐẠT** +- `git show ad02483:.claude/WAL.md:9` **và** `9c68bae` — cả hai có nguyên-văn: + `[7] "con lai xu ly het xong roi session-end" = uy quyen commit+push + chay session-end` ✅ +- `git show e7d06f2:` → slot `[7]` bị **thay** bằng session-model ✅ (đúng cơ-chế overwrite-in-place). +- 🔴 Đo tại **đúng bản omission đối-mặt** (`ea3eb30`, HEAD lúc 00:02): `grep -ci "con lai xu ly"` = **0** ⇒ MẤT thật. +- **KHÔNG phải "đổi chỗ sang sổ khác"** (tao tự grep 4 bề-mặt bền, không chép của omission): + `docs/` · `.claude/WAL.md` · `.claude/sessions/` · `.claude/governance/` ⇒ **0 hit** cho cụm uỷ-quyền; + chỉ ra nhiễu vô-can (`database-guide.md:155` "người được ủy quyền ký NĐUQ", `forms-spec.md:39`, …) = **domain HĐ**, không liên-quan. +- 🔸 Vá lúc 00:05:53 (uncommitted): `WAL:8-9` `[7] ⚠️ KHOI-PHUC (bi ghi de @e7d06f2, **H24-omission bat**)` + + header đổi thành `🔴 SLOT-INDEX CHI-TANG, CAM TAI-DUNG (luat moi @S146)` ⇒ lead nhận **cả FLAG-1 lẫn INFORM-3**. +- ⚠️ **1 sai-số nhỏ của omission (không đổi verdict):** nó ghi *"@ HEAD `c2d1a05`"* — nhưng lúc 00:02 HEAD thật + là `ea3eb30` (23:59), `c2d1a05` là 23:30 (cũ 3 commit). Nội-dung khối OWNER-DECISION **giống nhau ở cả hai** + nên kết-luận không đổi; nhưng nhãn-HEAD **sai** ⇒ ghi nhận, không trừ verdict. + +(đang chạy tiếp…) diff --git a/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/sub-implement-A-c7.md b/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/sub-implement-A-c7.md new file mode 100644 index 0000000..cdccb68 --- /dev/null +++ b/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/sub-implement-A-c7.md @@ -0,0 +1,175 @@ +# sub-implement-A-c7 — Axis A (C7 predicate 4-vế) + N.2 cardinality 3→4 + +> Worker-1 (`impl-A-c7`) · S146 relaunch-cắt-gọt · file sở-hữu = `docs/governance/harness-11-engine.md` DUY-NHẤT. +> Ghi-đĩa-TRONG-lúc-làm (anti-#53, bài học S123). **VERDICT: DONE** (VIỆC 3 = báo-cáo PARTIAL-về-script, không phải PARTIAL-về-task). + +## Trạng-thái +- [x] B0 — đọc spec-v2 toàn-file (gồm §[4] ADDENDUM @S146) + run.md +- [x] B1 — VIỆC 1: viết **§N.8** (predicate 4-vế + tách FLOOR/FORM + reword tập-cấm) → `harness-11-engine.md:413-421` +- [x] B2 — VIỆC 2: N.2 `3 path cố định` → **`4 path cố định`** (+`.claude/sessions/`) → `:406` (+N.3 `:407` gỡ literal stale, giữ sự-thật lịch-sử) +- [x] B3 — VIỆC 3: verify `scripts/distill-shard-probe.ps1` vs N.8 → **(i)(ii)(iii) PASS · (iv) NỬA** (chi-tiết dưới) — KHÔNG sửa script +- [x] B4 — VIỆC 4: fault-inject 2-chiều `scripts/nhip-no-probe.ps1` (KHÔNG đổi code) → **2/2 chiều PASS** +- [x] B5 — acceptance greps chạy thật, output dán dưới +- [x] B6 — guard LUẬT-CỨNG: 0 file `src/` `fe-*` `tests/` trong diff + +--- + +## B0 — baseline đo TƯƠI trên đĩa (TRƯỚC khi sửa) + +``` +$ grep -n '3 path cố định' docs/governance/harness-11-engine.md +406:- **N.2 Hai tầng ghi (🔴):** … `git add` per-path 3 path cố định {`.claude/WAL.md` · `.claude/agent-memory/` · `.claude/workflows/runs/`} … +407:- **N.3 …** commit `12071c5 "wal: flush 20260712T1105"` chứa ĐÚNG 4 file thuộc 3 path cố định (…) + ⇒ 🔴 v2 §C2b-EXT chỉ liệt N.2. Đĩa có **2 site** trong cùng file (N.2 luật-sống + N.3 bằng-chứng-lịch-sử). + +$ grep -c '4 surface' docs/governance/harness-11-engine.md +0 <-- baseline = 0. Header "4 surface" nằm ở `scripts/nhip-no-probe.ps1:6-7`, KHÔNG ở file này. + ⇒ acceptance "không giảm" = giữ 0 (no-op). ĐƯỜNG-CHẾT tôn-trọng: KHÔNG đụng header/`4 điểm lệnh`. + +$ grep -n 'N\.8' docs/governance/harness-11-engine.md +(0 dòng) <-- N.8 chưa tồn-tại; PHẦN N = N.1…N.7 (dòng 405–411). Số N.8 do lead CHỐT, worker KHÔNG tự chọn. + +$ grep -rn 'nhip-no-probe.ps1' .claude/commands/ +pause.md:44 · session-end.md:104 · session-end.md:131(tham-chiếu) · session-start.md:216 · tiep.md:112 +⇒ **4 FILE caller THẬT** → header "4 surface" ĐÚNG. Tiền-đề v1 "→2" đã bị bác, KHÔNG đụng. +``` + +--- + +## B1 — VIỆC 1: §N.8 (`docs/governance/harness-11-engine.md:413-421`) + +Chèn NGAY SAU N.7, TRƯỚC đoạn "Honest nấc §N". Cấu-trúc: + +| thành-phần | nội-dung neo | +|---|---| +| 4 vế | (i) read-only · (ii) KHÔNG spawn con · (iii) KHÔNG write · (iv) lỗi → `probe-loi (khong chan)` → ĐI TIẾP 🔴 **[LOAD-BEARING]** | +| **FLOOR** 🔴 | **read-only** · **non-blocking** (fail-open + no-hang + `exit 0` mọi nhánh) · **gỡ-được-không-hậu-quả** — kèm **phép thử probe ⟂ gate**: gỡ lời-gọi mà hành-vi ĐỔI ⇒ nó là gate (§E.3), không phải probe | +| **FORM** 🟡 | wording token (ASCII-only gotcha #30) · số vế/format dòng-nợ · vị-trí gọi · **interpreter = em-main đọc dòng in**, KHÔNG OS-gate (nhất-quán CAVEAT No-OS-hook) | +| tập-cấm reword | "cấm ĐẮT / cấm side-effect (spawn vai · audit-rerun · đo lại instrument · ghi memory/luật · push) — **CHO PHÉP probe read-only non-blocking theo N.8**"; command chỉ **TRỎ** §N.8, **CẤM chép predicate 2 nơi** (B1) | +| trạng-thái đo S146 | `nhip-no-probe.ps1` ✅ 4/4 vế · `distill-shard-probe.ps1` FLOOR-đủ / FORM-thiếu (vế-iv nửa) | + +``` +$ grep -n 'N\.8' docs/governance/harness-11-engine.md +413:- **N.8 Probe-tại-điểm-dừng — predicate 4-vế (🔴 FLOOR + 🟡 form) — LUẬT-HOME của C7 (hub-answer, adopt S146):** … +418: - **FLOOR (🔴 bất-biến — port-nguyên khi tailor, 3 tính-chất):** **read-only** · **non-blocking** … +420: - **Reword tập-cấm (🔴 KHÔNG phải cấm-tất):** … + +$ grep -no 'FLOOR (🔴 bất-biến[^)]*)\|read-only\*\* · \*\*non-blocking\*\*[^·]*· \*\*gỡ-được-không-hậu-quả\*\*\|FORM (🟡 tailor được)' docs/governance/harness-11-engine.md +418:FLOOR (🔴 bất-biến — port-nguyên khi tailor, 3 tính-chất) +418:read-only** · **non-blocking** (fail-open + no-hang + `exit 0` mọi nhánh) · **gỡ-được-không-hậu-quả** +419:FORM (🟡 tailor được) + +$ grep -no 'CHO PHÉP probe read-only non-blocking theo N.8' docs/governance/harness-11-engine.md +420:CHO PHÉP probe read-only non-blocking theo N.8 +``` + +🔸 **Seam A↔CE:** worker-2 chèn dòng TRỎ `§N.8` ở `pause.md:44` / `tiep.md:112`. Worker-1 **KHÔNG đụng 2 file đó** (DISJOINT-FILE) — số §N.8 = lead chốt, khớp. + +--- + +## B2 — VIỆC 2: N.2 cardinality 3→4 (`:406`) + N.3 de-stale (`:407`) + +**Sửa 1 — N.2 (LUẬT GỐC hook thi-hành):** +``` +$ grep -no '4 path cố định\*\* {[^}]*}' docs/governance/harness-11-engine.md +406:4 path cố định** {`.claude/WAL.md` · `.claude/agent-memory/` · `.claude/workflows/runs/` · `.claude/sessions/`} +``` ++ thêm clause lineage cuối N.2: *"🔄 Cardinality 3→4 @S146 … mọi đổi cardinality phải **grep MỌI consumer cùng-commit** (hook `wal-flush.ps1` · Sàn-3 `/tiep §0` "điểm mù" · `.session-counter.json _why_this_path` · auto-memory H22) — sửa write-site mà sót read-site = vỡ chính floor recovery (lớp S87/S88). Bản-ghi LỊCH-SỬ (adap-report có ngày · diary vai · `WAL.md`) KHÔNG rewrite."* + +**Sửa 2 — N.3 (bằng-chứng LỊCH-SỬ, xử KHÔNG falsify):** câu cũ *"chứa ĐÚNG 4 file thuộc **3 path cố định**"* mô-tả commit `12071c5` @S111. +→ đổi thành *"chứa ĐÚNG 4 file thuộc tập path cố định **lúc S111** (… — khi đó `.claude/sessions/` chưa tồn-tại; tập hiện-hành = N.2 bản 4-path @S146)"*. +**Lý-do KHÔNG đơn-giản đổi 3→4:** đổi số = **bịa lịch-sử** (commit đó KHÔNG hề phủ `sessions/`). **Lý-do KHÔNG để nguyên:** file này là **LIVE PRESCRIPTIVE** (C2b-EXT hàng 3) — không nằm trong tập 🧊 LỊCH-SỬ được miễn (adap-reports · diary vai · `WAL.md`); để literal "3 path cố định" sống trong luật-home = dạy sai + fail acceptance. Cách vá giữ **cả** sự-thật lịch-sử **và** con-trỏ tới tập hiện-hành ⇒ KHÔNG phải "rời tập-đo" (nội-dung được LÀM ĐÚNG, không phải đổi hình-dạng để né grep). + +``` +$ grep -n '3 path cố định' docs/governance/harness-11-engine.md +(rc=1 ; 0 dòng = PASS) + +$ grep -n '3 path\|3 điểm mù\|exactly 3 paths' docs/governance/harness-11-engine.md # pattern C2b-EXT đầy-đủ +(rc=1 ; 0 dòng = PASS) + +$ grep -c '4 surface' docs/governance/harness-11-engine.md +0 # = baseline, KHÔNG giảm (PASS; "4 surface" vốn không ở file này) +``` + +--- + +## B4 — VIỆC 4: fault-inject 2-chiều `scripts/nhip-no-probe.ps1` (KHÔNG đổi code) + +Script không sửa (catch tổng `:203-208` → `Write-Host 'probe-loi (khong chan)'`; `exit 0` `:208` unconditional). Chứng bằng **CHẠY THẬT**, bọc `timeout 60` để quan-sát **no-hang**. + +**(A) chiều LÀNH — chạy bình thường:** +``` +$ timeout 60 powershell.exe -ExecutionPolicy Bypass -File "D:\...\scripts\nhip-no-probe.ps1"; echo "EXIT=$?" +NHIP-NO: kiem light 3/6 deep 3/15 ok | tran-bo-nho 1 over-cap | run-chua-gom 3 | pull-cach 0 ngay +EXIT=0 +``` +⇒ dòng NHIP-NO **đầy-đủ 4 vế**, exit 0, trả ngay (không chạm trần timeout). + +**(B) chiều LỖI — ép `-RepoRoot` bậy (đường dẫn không tồn-tại):** +``` +$ timeout 60 powershell.exe … -File "…\nhip-no-probe.ps1" -RepoRoot "D:\__khong-ton-tai-S146__"; echo "EXIT=$?" +probe-loi (khong chan) +EXIT=0 +``` +**(B2) biến-thể LỖI — RepoRoot TỒN-TẠI nhưng RỖNG (thiếu `.session-counter.json`):** +``` +$ timeout 60 powershell.exe … -File "…\nhip-no-probe.ps1" -RepoRoot "\s146-empty-root"; echo "EXIT=$?" +probe-loi (khong chan) +EXIT=0 +``` +⇒ **vế-(iv) GIỮ ĐƯỢC**: in đúng token `probe-loi (khong chan)`, `exit 0`, **KHÔNG treo** (2 vector lỗi khác nhau: path-không-tồn-tại ⟂ path-tồn-tại-nhưng-thiếu-file ⇒ không phải may một nhánh). **Boundary teeth:** chiều LÀNH in nội-dung THẬT (không phải cùng token) ⇒ token lỗi không phải dương-giả. + +--- + +## B3 — VIỆC 3: `scripts/distill-shard-probe.ps1` vs N.8 (CHỈ BÁO-CÁO, KHÔNG SỬA) + +| vế N.8 | phán | bằng-chứng đọc-mã / chạy-thật | +|---|---|---| +| (i) read-only | ✅ PASS | chỉ `Test-Path` · `[IO.File]::ReadAllText` `:24` · `ConvertFrom-Json` `:25` · `Get-ChildItem` `:35,38` · `Write-Output`. 0 mutation. | +| (ii) KHÔNG spawn con | ✅ PASS | `grep -nE 'Start-Process\|Invoke-Expression\|Start-Job\|git '` = 0 hit mã-lệnh (chỉ hit comment/`Write-Output` chuỗi). | +| (iii) KHÔNG write | ✅ PASS | `grep -nE 'Set-Content\|Add-Content\|Out-File\|New-Item\|Remove-Item\|>>'` = 0 hit mã-lệnh. | +| (iv) lỗi→token→đi-tiếp | ⚠️ **NỬA** | nhánh **có-xử** OK · nhánh **exception** KHÔNG bắt ⇒ stderr + **exit 1**, KHÔNG in token. | + +**Chạy thật 3 ca:** +``` +$ timeout 60 powershell … -File "…\distill-shard-probe.ps1" # LÀNH +SHARD-PROBE: pending=15 | nguong=15 => IM +EXIT=0 ✅ + +$ timeout 60 powershell … -File "…\distill-shard-probe.ps1" -RepoRoot "D:\__khong-ton-tai-S146__" +Resolve-Path : Cannot find path 'D:\__khong-ton-tai-S146__' because it does not exist. +At …\distill-shard-probe.ps1:18 char:15 ++ $root = (Resolve-Path $RepoRoot).Path +EXIT=1 ⚠️ KHÔNG in `probe-loi (khong chan)` + +$ timeout 60 powershell … -File "…\distill-shard-probe.ps1" -RepoRoot "\s146-empty-root" +SHARD-PROBE: khong thay memory-budget.json -> probe-loi (khong chan) +EXIT=0 ✅ (nhánh CÓ-XỬ `:23`) +``` + +**Chẩn gốc:** `$ErrorActionPreference = 'Stop'` `:17` + **KHÔNG có try/catch tổng** ⇒ mọi terminating-error thoát nguyên (2 vector rõ: `Resolve-Path` `:18` với `-RepoRoot` bậy · `ConvertFrom-Json` `:25` khi JSON hỏng). +**Phán theo FLOOR/FORM:** **FLOOR ĐỦ** (read-only ✅ · non-blocking thực-tế ✅ — thoát ngay, no-hang, và caller `session-start.md:135` là em-main-đọc-dòng chứ không phải OS-gate nên exit≠0 không chặn phiên · gỡ-được-không-hậu-quả ✅ — gỡ lời-gọi chỉ mất INFORM sleep-check). **FORM THIẾU** (token vế-iv vắng ở nhánh exception; exit-code lệch contract "exit 0 mọi nhánh"). +**Đề-xuất vá (KHÔNG tự làm — ngoài file sở-hữu):** bọc thân `:18-71` trong `try{…}catch{ Write-Output 'probe-loi (khong chan)' }` + `exit 0` cuối, y hệt `nhip-no-probe.ps1:203-208`. 1 sửa, ~4 dòng, 0 đổi hành-vi nhánh lành. + +🔸 **Side-observation (ngoài scope, KHÔNG sửa):** `.claude/commands/sleep-recovery-memory-l2.md:52` khai `distill-shard-probe.ps1` chạy ở **cả** `/session-start §2.1.2` **và** `/session-end §L.b(c)`; nhưng `grep -n 'distill-shard-probe\|SHARD-PROBE' .claude/commands/session-end.md` = **0 hit** ⇒ vế "session-end" có mùi **ghost-wire class-2 (defined-but-unread)** H18. Chỉ báo, lead quyết. + +--- + +## B5/B6 — Acceptance + guard (chạy thật) + +``` +$ grep -n 'N.8' docs/governance/harness-11-engine.md → 413 / 418 / 420 ✅ +$ grep -n '3 path cố định' docs/governance/harness-11-engine.md → 0 dòng ✅ +$ grep -c '4 surface' docs/governance/harness-11-engine.md → 0 (= baseline) ✅ không giảm +$ git diff --stat -- docs/governance/harness-11-engine.md + docs/governance/harness-11-engine.md | 14 ++++++++++++-- + 1 file changed, 12 insertions(+), 2 deletions(-) +$ git diff --name-only | grep -E '^(src/|fe-admin/|fe-user/|tests/)' → rc=1, 0 hit ✅ governance-only +``` +`git status --short` lúc kết: `M docs/governance/harness-11-engine.md` (của tôi) + `M .claude/commands/session-end.md`, `M .claude/governance/.session-counter.json` (**worker khác**, không đụng) + 2 file `sub-*.md` untracked. **0 commit / 0 git add / 0 push** (lead lo). + +## ĐƯỜNG-CHẾT đã tôn-trọng +- KHÔNG sửa header "4 surface" / "4 điểm lệnh" (tiền-đề v1 đã bị bác; đo lại 4 caller THẬT). +- KHÔNG sửa `scripts/*.ps1` (VIỆC 3 + 4 đều report-only / run-only). +- KHÔNG đụng `pause.md` / `tiep.md` (worker-2 sở-hữu) — chỉ nêu trong N.8 rằng command TRỎ §N.8. +- KHÔNG chép predicate sang file thứ 2 (B1). diff --git a/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/sub-implement-CE-sessionmodel.md b/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/sub-implement-CE-sessionmodel.md new file mode 100644 index 0000000..78867a6 --- /dev/null +++ b/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/sub-implement-CE-sessionmodel.md @@ -0,0 +1,275 @@ +# sub-implement-CE-sessionmodel — Axis C (session-model + hook 4-path + Sàn-3 atomic) + Axis E (tiep/pause/snapshot) + +> Worker-2 @S146 · spec canonical = `spec-apply-hub-s145-v2.md` (gồm `[4] ADDENDUM @S146`). +> 🔴 Ghi-đĩa TRONG lúc làm (anti-#53 S123) — mỗi bước xong ghi ngay, KHÔNG đợi cuối. + +## FILE SỞ-HỮU (disjoint, KHÔNG đụng file worker khác) +`.claude/hooks/wal-flush.ps1` · `.claude/commands/tiep.md` · `.claude/commands/pause.md` · `.claude/commands/session-start.md` · `.claude/governance/.session-counter.json` (chỉ `_why_this_path`) · `.claude/auto-memory/project_h22_wal_session_continuity.md` (chỉ cụm "3 path") · `docs/governance/session-model-se-draft.md` + +--- + +## BƯỚC 0 — GROUND-TRUTH đo tươi trên đĩa @S146 (TRƯỚC khi sửa) + +### (0.1) grep consumer "3 path" toàn tập LIVE +``` +$ grep -rn '3 path|3 điểm mù|exactly 3 paths|3 path cố định|hook-3-path' \ + .claude/commands/ .claude/hooks/ .claude/auto-memory/ \ + .claude/governance/.session-counter.json docs/governance/harness-11-engine.md \ + docs/governance/session-model-se-draft.md +``` +Output THẬT (11 hit / 6 file): + +| file:line | nội-dung | chủ-sở-hữu | +|---|---|---| +| `.claude/commands/pause.md:31` | "file NGOÀI hook-3-path" | **TÔI** | +| `.claude/commands/pause.md:34` | "file ngoài hook-3-path" | **TÔI** | +| `.claude/commands/tiep.md:21` | "hook có **3 điểm mù**" | **TÔI** | +| `.claude/commands/tiep.md:23` | "`wal-flush.ps1:7` tự-commit **3 path**" | **TÔI** | +| `.claude/commands/tiep.md:75` | "NGOÀI 3 path hook persist" | **TÔI** | +| `.claude/commands/tiep.md:78` | "Bẩn ngoài 3 path" | **TÔI** | +| `.claude/auto-memory/project_h22_wal_session_continuity.md:10` | "3 path: WAL/agent-memory/runs" | **TÔI** | +| `.claude/governance/.session-counter.json:4` | "exactly 3 paths … OUTSIDE all three" | **TÔI** | +| `docs/governance/session-model-se-draft.md:13` | "persist 3-path" | **TÔI** | +| `docs/governance/session-model-se-draft.md:56` | "quét **đúng 3 path**" (meld-forward-gap) | **TÔI** | +| `.claude/commands/session-end.md:113` `:222` | "hook-3-path" ×2 | 🔴 **WORKER-3** — TÔI KHÔNG ĐỤNG | +| `docs/governance/harness-11-engine.md:406` (N.2) `:407` (N.3) | "3 path cố định" ×2 | 🔴 **WORKER-1** — TÔI KHÔNG ĐỤNG | + +🔴 **Phát-hiện MỚI ngoài bảng C2b-EXT của spec** (spec liệt 5 dòng LIVE; đo tươi ra **thêm 4 site**): +- `pause.md:31` + `:34` "hook-**3**-path" (spec chỉ liệt `tiep.md`) — **TÔI vá**. +- `session-end.md:113` + `:222` "hook-**3**-path" — **worker-3 sở-hữu**, tôi KHÔNG đụng ⇒ **residual báo lead**. +- `harness-11-engine.md:407` (N.3) "3 path cố định" — spec chỉ giao worker-1 **N.2**; **N.3 là site thứ-2 cùng file** ⇒ residual báo lead (N.3 là câu LỊCH-SỬ mô-tả commit S111 `12071c5` "chứa ĐÚNG 4 file thuộc 3 path cố định" — có thể giữ nguyên như vết lịch-sử, nhưng phải là **quyết-định có ý-thức**, không phải bỏ sót). +- Lý do class: `cardinality-change → grep MỌI consumer` (S87/S88) — sửa write-site sót read-site = vỡ feature. + +### (0.2) `.gitignore` — `.claude/sessions/` có bị ignore không? +``` +$ git check-ignore -q .claude/sessions/session-1 ; echo exit=$? +exit=1 +``` +⇒ **exit=1 = KHÔNG bị ignore** — đúng kỳ-vọng spec C.5. (`.gitignore:82-83` `!.claude/` + `!.claude/**` re-include; không pattern nào sau đó loại `sessions/`.) +``` +$ ls -d .claude/sessions +ls: cannot access '.claude/sessions': No such file or directory +``` +⇒ thư-mục CHƯA tồn-tại lúc bắt đầu. + +### (0.3) `session_ctx_kb` — đếm CONSUMER thật (C1: để TRỐNG, CẤM hardcode 64) +grep toàn repo (ripgrep): +- **0 script đọc key** — hit duy-nhất trong `scripts/` là `scripts/nhip-no-probe.ps1:42` và nó là **COMMENT** (`"same discipline as declining to pick session_ctx_kb"`), KHÔNG phải đọc config. +- `.claude/agent-memory/memory-budget.json` → **0 hit** ⇒ key VẮNG. +- Còn lại toàn doc/spec/run-trace/broadcast (mô-tả, không đọc). +⇒ **ghost-wire class (H18 defined-but-unread)** ⇒ **KHÔNG ĐỘNG GÌ** vào `memory-budget.json` (đúng C1 + K6.2). Đây là hành-động "không làm" **có chủ-đích**, đã đo. + +--- + +## BƯỚC 1 — VIỆC 1: hook 4-path (spec C.2) ✅ DONE + +`.claude/hooks/wal-flush.ps1:13-14` — `$paths` 3 → **4** (+`.claude/sessions/`), kèm 1 dòng comment pure-ASCII (gotcha #30: .ps1 pure-ASCII). + +``` +$ sed -n '12,15p' .claude/hooks/wal-flush.ps1 + if ((Test-Path ".git/rebase-merge") -or (Test-Path ".git/rebase-apply")) { exit 0 } + # 4 path (S146): +.claude/sessions/ = thu-muc phien-LOGIC (session-model, hub-form session-). + # Floor canonical = engine N.2 (KHONG chep list o day - B1 con-tro). + $paths = @(".claude/WAL.md", ".claude/agent-memory/", ".claude/workflows/runs/", ".claude/sessions/") +``` + +🔴 **KHÔNG viết "pending-restart"**: `.claude/settings.json` gọi hook bằng `-File ` ⇒ body được đọc LẠI mỗi lần Stop fire ⇒ ăn NGAY, không cần restart. (Xác nhận đọc `.claude/settings.json` — xem BƯỚC 1b.) + +### 1b — LIVE-VERIFY (khai THẬT phạm-vi) +Xem mục "LIVE-VERIFY" cuối file — có **2 phần**: (i) hook chạy THẬT trên **cây tạm** (chứng path thứ-4 được nuốt, có `git log --name-only` thật) · (ii) fire trong repo THẬT = **KHÔNG quan-sát được từ trong subagent** → để lead live-verify. + +--- + +## LIVE-VERIFY hook 4-path — 2 CHIỀU, chạy THẬT (không phải happy-path suông) + +### (i) settings.json = `-File` ⇒ ăn NGAY, KHÔNG cần restart +``` +$ cat .claude/settings.json +"command": "powershell.exe -ExecutionPolicy Bypass -File .claude/hooks/wal-flush.ps1" +``` +⇒ body đọc LẠI mỗi lần Stop fire ⇒ **KHÔNG viết "pending-restart"** (đúng spec C.2). +🔸 Event wired = **`Stop`** (KHÔNG có `SubagentStop`) — đây chính là lý do subagent không quan-sát được fire (mục (iii)). + +### (ii) 🧪 CHẠY THẬT hook trên CÂY TẠM (precedent S135 `-RepoRoot`; ở đây inject qua `CLAUDE_PROJECT_DIR`) +Cây tạm `…/scratchpad/hook4path/` — git repo riêng, KHÔNG đụng repo thật. + +**Chiều A — BODY MỚI (4 path) ⇒ NUỐT `sessions/`:** +``` +$ CLAUDE_PROJECT_DIR= powershell.exe -ExecutionPolicy Bypass -File .claude/hooks/wal-flush.ps1 +hook exit=0 +$ git log --name-only --format='%s' -1 +wal: flush 20260722T2238 + +.claude/WAL.md +.claude/sessions/session-1/probe.md <-- 🔴 PATH THỨ-4 Đà VÀO COMMIT +$ git status --porcelain +?? .claude/hooks/ +?? docs/ <-- decoy NGOÀI 4 path: KHÔNG bị nuốt (anti-Goodhart control) +``` + +**Chiều B — NEGATIVE CONTROL, BODY CŨ (3 path) ⇒ KHÔNG nuốt:** +``` +$ grep -n 'paths = @' .claude/hooks/wal-flush.ps1 +15: $paths = @(".claude/WAL.md", ".claude/agent-memory/", ".claude/workflows/runs/") +$ ... run hook ... +$ git log --name-only --format='%s' -1 +wal: flush 20260722T2238 + +.claude/WAL.md <-- CHỈ WAL +$ git status --porcelain | grep sessions +?? .claude/sessions/ <-- 🔴 VẪN MỒ-CÔI (đúng bug mà 4-path vá) +``` +⇒ **2 chiều khớp**: file `sessions/` được nuốt **KHI VÀ CHỈ KHI** `$paths` có path thứ-4. Chứng đây là **nguyên-nhân**, không phải trùng-hợp. Decoy `docs/` im ở cả 2 chiều ⇒ hook KHÔNG nới quá list. + +### (iii) 🔴 KHAI THẬT — fire trong REPO THẬT: **KHÔNG quan-sát được từ trong subagent** +- Hook wired ở event **`Stop`** (turn-boundary của **phiên chính**), KHÔNG phải `SubagentStop` ⇒ lượt của worker này **không sinh** boundary đó. +- Tôi cũng **KHÔNG tự chạy hook trong repo thật** vì nó `git add` + `git commit` — vi-phạm LUẬT CỨNG #6 (không commit / không git add; lead lo). +- ⇒ **CẤM tự dán chữ "verified" cho fire-in-repo-thật.** Trạng-thái đúng = **VERIFIED-ON-TEMP-TREE (2 chiều) + PENDING lead live-verify trong repo thật.** +- **Vật-liệu để lead verify đã đặt sẵn:** `.claude/sessions/session-1/probe.md` (xem BƯỚC 4). Lead chỉ cần để một turn-boundary trôi qua rồi: + `git log --name-only -1` → phải thấy commit `wal: flush …` **nuốt** `.claude/sessions/session-1/probe.md`. + +--- + +## BƯỚC 2 — VIỆC 2: SÀN-3 ATOMIC trong `tiep.md` (spec C.3) ✅ DONE + +| mục | site | làm gì | +|---|---|---| +| (a) | `:21` | "hook có **3 điểm mù**" → **4 điểm mù** | +| (a)+(d) | `:23` | "`wal-flush.ps1:7` … **3 path**" → "**`wal-flush.ps1:13`** … **4 path**" + liệt đủ 4 path | +| (a) | `:24` | "MÙ đúng **3** vùng" → **4** vùng | +| (a) | `:29` | BẬC MẠNH "thấy **1 trong 4**" → **1 trong 5** | +| (b) | `:37` | **THÊM hàng ⑤** vào bảng BẬC MẠNH (lệnh `git log --name-only --format='%s' origin/main..HEAD \| grep -q '.claude/sessions/'`) | +| (b)+orphan-L | `:78-101` | **THÊM block `#### ⑤ ORPHAN-L`** — DUAL 2 cửa (git ⟂ đĩa cân-sổ) | +| (c) | `:103` `:106` | BẬC TRUNG "ngoài **3** path" → **4** path (×2) | +| (e) | `:115-116` | "Cả **4** tín-hiệu MẠNH đều im" → **5** + **luật bất-biến** "mỗi path mới ⇒ mỗi tín-hiệu mới, CÙNG lần sửa" | +| (e) | `:122` | §0.b self-heal: "cả 4 tín-hiệu MẠNH khác" → "cả **4 tín-hiệu MẠNH CÒN LẠI** (= 5 trừ chính ③)" — 🔸 số này **đúng là 4**, không phải 5: ③ `closing:` là chính nó | +| (e) | `:131` | §1 "**4/4** tín-hiệu MẠNH im" → **5/5** | +| §N.8 | `:142` | dòng **TRỎ** `harness-11-engine.md §N.8` (B1 — CHỈ trỏ, KHÔNG chép predicate) | +| C.6 | `:144-149` | **THÊM §2.6** đọc context-map + ghi biên-nhận `resume-*` | + +### 🔴 Quyết-định phụ (khai để lead soi): GIỮ `$paths` ĐÚNG DÒNG 13 +Bản sửa đầu tôi chèn 2 dòng comment **TRÊN** `$paths` ⇒ đẩy nó xuống **:15** ⇒ acceptance literal `wal-flush.ps1:13` **hỏng**, và mọi trích-dẫn `:13` (spec · run.md · memory) **lão-hoá cùng lúc**. ⇒ **đảo comment xuống DƯỚI**, `$paths` ở lại `:13`. Ghi luôn cảnh-báo trong chính file `.ps1`: +``` +16: # !! GIU $paths O DUNG DONG 13: nhieu doc trich-dan "wal-flush.ps1:13" (tiep.md :23, spec, memory). +17: # Chen dong TREN day = lao-hoa het cac trich-dan do (class acceptance-literal-tu-lao-hoa S121). +``` +Đã **RE-RUN** live-verify trên body CUỐI sau khi đảo (không tin verify của bản nháp): commit `wal: flush 20260722T2240` vẫn nuốt `.claude/sessions/session-1/probe.md`, decoy `docs/` vẫn im. + +### 🧪 Fault-inject ORPHAN-L — 5 ca, 2 CHIỀU (chạy THẬT block trong `tiep.md`, cây tạm) +``` +ca 1 pause=1 resume=0 -> ORPHAN-L: .claude/sessions/session-1/ (pause=1 resume=0 closed=0) ✅ FLAG dung +ca 2 pause=1 resume=1 -> (im) ✅ IM dung +ca 3 pause=2 resume=1 (lech 1) -> ORPHAN-L: .claude/sessions/session-3/ (pause=2 resume=1 closed=0) ✅ FLAG dung +ca 4 pause=1 + closed.md -> (im) ✅ IM dung +ca 5 thu-muc RONG (0 pause) -> (im, skip) ✅ IM dung +``` +⇒ **5/5**. Có ca **lệch-1 trên nền không-rỗng** (ca 3) = ca anti-Goodhart: thiếu nó thì detector chỉ bắt được "chưa từng resume", bỏ lọt "resume thiếu 1 lần". + +--- + +## BƯỚC 3 — VIỆC 3: 2 CONSUMER v2 SÓT ✅ DONE + +### (3.1) `.claude/governance/.session-counter.json` → `_why_this_path` +**TÁI-VERIFY mệnh-đề TRƯỚC khi sửa** (không chỉ bump số): `.claude/governance/` có còn ngoài **cả 4** path không? +→ path thứ-4 là `.claude/sessions/`, **≠** `.claude/governance/` ⇒ **mệnh-đề VẪN ĐÚNG**, chỉ con số đổi. Đã ghi câu **RE-VERIFIED at S146** vào chính field đó + luật "lần nới sau phải **kiểm lại câu**, không chỉ bump số". + +Verify sau sửa: +``` +$ grep -o 'OUTSIDE all four' .claude/governance/.session-counter.json +OUTSIDE all four +$ head -c 3 .claude/governance/.session-counter.json | xxd +00000000: efbb bf ... <-- BOM CON NGUYEN +$ python -c "import json,io; d=json.load(io.open(...,encoding='utf-8-sig')); ..." +PARSE OK; counter = 20 ; session = S146 +last_ticked_head = 474199b32fb0371d76aa2f1c43daa849f973f9fd · last_ticked_at = 2026-07-22 +last_audit = 17 17 · class_repeat keys = 8 · history entries = 8 +``` +🔸 **`git diff --numstat` ra `4 4` — KHÔNG phải tôi sửa 4 dòng.** Soi diff: 3 dòng kia (`counter` 19→20 · `S145`→`S146` · `last_ticked_head`) **đã có sẵn trong cây** = **tick của lead phiên này**, uncommitted từ trước lúc tôi vào. Sửa của tôi = **đúng 1 dòng** `_why_this_path`. (Ghi rõ kẻo đọc numstat thành "worker đụng counter".) + +### (3.2) `.claude/auto-memory/project_h22_wal_session_continuity.md:10` +"(per-path+CAND+exit-0; **3 path**: WAL/agent-memory/runs)" → "**4 path** kể từ S146: WAL/agent-memory/runs/**sessions** — path thứ-4 `.claude/sessions/` = thư-mục phiên-LOGIC, đẻ CÙNG tín-hiệu MẠNH ⑤ + ORPHAN-L ở `tiep.md §0`". +🔴 File này **auto-inject MỖI PHIÊN** ⇒ để stale = mọi phiên sau bị dạy sai ngay từ context đầu-vào (đúng đánh-giá "NGUY NHẤT" của spec). + +--- + +## BƯỚC 4 — VIỆC 4: session-model (spec C.4–C.7) ✅ DONE + +### (4.1) VC-1 nhãn 2 tầng + siết "MỘT con số" — `session-model-se-draft.md §3 VC-1` +`S` (cửa-sổ vật-lý, **mọi** tick/counter/H24 giữ nguyên đơn-vị) + `logic: L`. 🔴 **Siết thêm:** `L` và `session-` dùng **CÙNG con số** (`mm ≡ N`) — 2 cách viết của 1 ID, **KHÔNG phải 2 bộ đếm** (2 counter cho 1 khái-niệm = drift bảo-đảm). + khai vì sao tick an-toàn: OR-guard khớp trên `S` **không đổi ngữ-nghĩa** ⇒ label-convention S135 còn nguyên, phép-7 không về `+0`; `L` **CẤM** dùng ở guard/counter. + +### (4.2) Gỡ VC-3 stale → hub-form (K4 chốt) +`.claude/logic-sessions/L.md` (**một-tệp-per-phiên**) → **`.claude/sessions/session-/`** (**thư-mục-per-phiên**, hub-form). §4 khoản 1 (K4) đổi từ "chờ anh" → **CHỐT @S146** (căn-cứ: owner override S144 + spec-v2 §C.4; lý-lẽ: thư-mục chịu N khối `/pause` không phải sửa file cũ + trùng path thứ-4 của hook). + +### (4.3) Scaffold — `session-start.md` **BƯỚC 0.8** (mới) +- form `.claude/sessions/session-/`, **regex `^session-\d+$`**, `` = `max+1`, **chỉ `/session-start` mở `` mới** (`/tiep` nối, không mở). +- **Đo `.gitignore` THẬT, không suy:** +``` +$ git check-ignore -q .claude/sessions/session-1 ; echo "exit=$?" +exit=1 <-- KHONG bi ignore (dung ky-vong spec C.5) +``` +- **(d) KHAI RANH** — đã wire gì / chưa wire gì (chống đọc thành "đã adopt session-model"): 0 nghi-thức chuyển per-L trong lượt này. +- **+ vá B1 tại chỗ:** BƯỚC 0.7 cũ chép cứng "**4** tín-hiệu BẬC MẠNH" + "Sàn-3 **4/4** im" ⇒ **stale ngay** khi sàn lên 5. Đổi thành **`k/k` đọc sống từ `tiep.md §0`** + ghi rõ vì sao cấm chép số. (Đây là consumer **thứ 6** của cardinality-change mà không bảng nào trong spec liệt — bắt được nhờ grep-mọi-consumer.) + +### (4.4) per-pause context-map — `pause.md` **§2.6** (mới) +File **MỚI mỗi lần pause**: `pause-S-.md`, **3 trường** (quyết-định-đã-chốt · delta-còn-sống · con-trỏ run/commit). **CẤM ghi đè**. Khai ranh với WAL (WAL = mạch-sống ghi-đè ≤40 dòng; context-map = tích-luỹ không cap). CẤM secret. + `pause.md §4` add đích-danh `.claude/sessions/session-/` vào commit `wal: pause` (không dựa hook để chốt điểm dừng — *hook là lưới, không phải nghi-thức*). + +### (4.5) `tiep.md §2.6` đọc lại — xem BƯỚC 2. + +### (4.6) orphan-L rule — gộp chung signal ⑤, xem BƯỚC 2 (block `#### ⑤ ORPHAN-L` + fault-inject 5/5). + +### (4.7) Q4-audit = DEFER ✅ +`session-model-se-draft.md §5` câu 4 + `harness-11-engine.md §N.8`-pointer: chỉ **hiển-thị dòng-nợ**, **KHÔNG audit-rerun giữa phiên-logic** — **1 dòng lý-do**: audit-rerun = ĐẮT + side-effect ⇒ **phá predicate C7**. + +### (4.8) `session_ctx_kb` = ĐỂ TRỐNG ✅ (hành-động = **KHÔNG ĐỘNG GÌ**, có đo) +`memory-budget.json` **0 hit** ⇒ giữ nguyên, **CẤM hardcode 64**. Đo: **0 script đọc key**; hit `scripts/` duy-nhất = **comment** `nhip-no-probe.ps1:42`. Đối-chứng ca song-sinh: `pull_warn_days` **CÓ** reader sống (`nhip-no-probe.ps1:190`) ⇒ analogy "như pull_warn_days" hỏng. Đã ghi phát-hiện vào `draft §4 khoản 2` + `session-start BƯỚC 0.8(d)`. + +### (4.9) TRỎ §N.8 ✅ — `pause.md:5.` + `tiep.md §2.5`, **CHỈ TRỎ**, 0 chép predicate (B1). + +--- + +## ACCEPTANCE — 6/6 PASS (lệnh + output THẬT) + +``` +1) grep -rn '3 path' .claude/commands/tiep.md -> hits=0 ✅ +2) grep -n 'sessions' .claude/hooks/wal-flush.ps1 + 13: $paths = @(".claude/WAL.md", ".claude/agent-memory/", ".claude/workflows/runs/", ".claude/sessions/") ✅ +3) grep -o 'all four' .claude/governance/.session-counter.json -> all four ✅ +4) python json.load(utf-8-sig) -> PARSE OK; counter = 20 ; session = S146 + head -c 3 | xxd -> efbb bf (BOM con) ✅ +5) grep -n 'wal-flush.ps1:13' tiep.md -> :23 co ; grep 'wal-flush.ps1:7' -> (none) ✅ +6) grep '^| \*\*⑤\*\*' tiep.md -> :37 hang ⑤ ton tai trong bang BAC MANH ✅ +``` + +**SCOPE GATE (luật cứng #1):** +``` +$ git status --porcelain | grep -E '(src/Backend|fe-admin/|fe-user/|tests/)' +0 file prod-code — PASS +``` +0 migration · 0 commit · 0 push · 0 `git add` (luật #6 giữ). + +--- + +## 🔴 RESIDUAL — việc CÙNG CLASS còn sống ở file TÔI KHÔNG SỞ-HỮU (báo lead, KHÔNG tự sửa) + +Sweep C2b-EXT sau khi tôi xong (`grep -rn '3 path|3 điểm mù|exactly 3 paths|3 path cố định|hook-3-path'`): + +| file:line | nội-dung | phán | +|---|---|---| +| `.claude/commands/session-end.md:114` | "file ngoài **hook-3-path**" | 🔴 **THẬT — cùng class, cần → 4.** Worker-3 sở-hữu. | +| `.claude/commands/session-end.md:296` | "M-7 … file NGOÀI **hook-3-path**" | 🔴 **THẬT — cùng class, cần → 4.** Worker-3 sở-hữu. | +| `.claude/commands/session-end.md:162` | "\| `harness-audit` (k) \| **3 path** `runs//harness-*-return.md` \|" | 🟢 **DƯƠNG-GIẢ — CẤM sửa.** "3 path" ở đây = **3 file return của bộ-ba**, KHÔNG liên-quan hook. Sweep máy-móc sẽ **làm hỏng** dòng này. | +| `docs/governance/harness-11-engine.md` N.2/N.3 | — | ✅ **worker-1 Đà XỬ**: N.2 = "**4 path cố định** {WAL · agent-memory · runs · **sessions**}"; N.3 reword "path cố định **lúc S111**" (giữ đúng vai câu lịch-sử). Floor ↔ hook nay **khớp**. | + +🔸 **Bài rút:** `3 path` là chuỗi **đa-nghĩa** — grep-sweep theo literal phải **phân loại từng hit** trước khi đổi (đúng lớp "citation-trap / use ⟂ mention"). 2 hit sửa được, 1 hit **phải tha**. + +🔸 **Ngoài phạm-vi quét CỐ Ý (C8 — đừng rewrite history):** `adap-reports/*` (báo-cáo có ngày) · `agent-memory/*` (nhật-ký vai) · `.claude/WAL.md`. Không đụng. + +--- + +## 🔴 KHAI HỞ CÒN LẠI (không bán quá nấc) + +1. **Fire hook trong repo THẬT chưa quan-sát được** → `VERIFIED-ON-TEMP-TREE (2 chiều)` + **PENDING lead**. Vật-liệu: `.claude/sessions/session-1/probe.md` (file này **xoá được** sau khi lead verify). +2. **`closed.md` chưa có người ghi** — chân đóng phiên-logic thuộc `/session-end` (VC-2 chờ anh). Ca "pause → đóng thẳng không qua `/tiep`" sẽ **kêu oan**. Hướng hỏng = về phía **hỏi-lại**, không phải im-lặng-bỏ-việc. **KHÔNG được đọc thành "đã kín".** +3. **Nghi-thức KHÔNG chuyển per-L** trong lượt này — chỉ hạ-tầng. Bảng VC-2 vẫn **chờ anh duyệt từng dòng**. +4. **`resume-*` là nghi-thức, không phải code-enforced** — quên ghi ⇒ ORPHAN-L kêu (fail-safe), nhưng vẫn là kỷ-luật người/agent, KHÔNG phải guard có răng. + diff --git a/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/sub-implement-D-5vong.md b/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/sub-implement-D-5vong.md new file mode 100644 index 0000000..3241be7 --- /dev/null +++ b/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/sub-implement-D-5vong.md @@ -0,0 +1,154 @@ +# sub-implement-D-5vong — Axis D (5-vòng closure + completeness-gate CÓ RĂNG) + +> Worker-3 `impl-D-5vong` @S146 · relaunch-cắt-gọt qua `/tiep` (S145 chết giữa chừng). +> **File sở-hữu (disjoint):** `.claude/commands/session-end.md` + `.claude/agents/{tooling-harvest-audit,h24-audit,sleep-audit}.md`. +> **VERDICT: DONE** (4/4 việc + 4/4 acceptance PASS, output thật dán bên dưới). + +--- + +## 0 — GROUND-TRUTH đo tươi @S146 (TRƯỚC khi sửa gì) + +### 0.1 Folder-state 3 vai-KIỂM (landmine phép-4) — lệnh + output THẬT +``` +$ ls -la .claude/agent-memory/tooling-harvest-audit/ .claude/agent-memory/h24-audit/ .claude/agent-memory/sleep-audit/ 2>&1 +ls: cannot access '…/.claude/agent-memory/h24-audit/': No such file or directory +ls: cannot access '…/.claude/agent-memory/sleep-audit/': No such file or directory +…/.claude/agent-memory/tooling-harvest-audit/: +total 4 +drwxr-xr-x 1 pqhuy 197609 0 Jul 22 18:27 . +drwxr-xr-x 1 pqhuy 197609 0 Jul 22 19:49 .. +``` +⇒ `tooling-harvest-audit/` **TỒN-TẠI nhưng RỖNG** (0 `MEMORY.md`) · `h24-audit/` + `sleep-audit/` **MISSING**. +⇒ 3 vai **WIRED nhưng CHƯA chạy audit-round THẬT** ⇒ phép-4 = **`not-yet-run (vacuous)`**, KHÔNG FAIL, KHÔNG ĐẠT-ảo. + +### 0.2 Ambiguity STALE (VIỆC 1) — xác-nhận trước khi vá +`session-end.md:123` (bản cũ) xếp `h24-audit`/`sleep-audit` vào diện chờ-land về sau ⇒ mâu-thuẫn chính roster Phase 1 (:40-42 đã wire AUTO) + mâu-thuẫn đĩa (3 contract tồn-tại thật). + +### 0.3 Phát-hiện thêm TRONG file mình sở-hữu — con-trỏ CHẾT +`session-end.md:42` trỏ **`Phase 4.5`** cho `sleep-audit`. Grep heading file: chỉ có `Phase 1 · 1.5 · 2 · 3 · 4 · 5 · 6` ⇒ **KHÔNG có Phase 4.5** ⇒ broken-pointer (detector C1 sẽ bắt). Vá trong axis D (V4 = vòng nén-ngủ). + +### 0.4 vế-count dòng-nợ — spec ghi "3-vế", ĐĨA in 4 đoạn (đo tươi) +- `scripts/nhip-no-probe.ps1:201` = `Write-Host ("NHIP-NO: kiem {0} | {1} | {2} | {3}" …)` ⇒ **4 đoạn** +- `:22` usage-doc = `NHIP-NO: kiem … | tran-bo-nho … | run-chua-gom … | pull-cach N ngay` ⇒ 4 +- 4 command (`pause:44` · `tiep:112` · `session-start:216` · `session-end:104`) đều gọi **"4-vế"** +- 🔸 **`scripts/nhip-no-probe.ps1:3` header VẪN ghi "3-part debt line" = STALE** — file NGOÀI quyền mình ⇒ **báo lead, KHÔNG tự sửa** +⇒ Gate viết **"dẫn NGUYÊN VĂN dòng script in"** + **trỏ script làm canonical vế-set** (B1), KHÔNG chốt số vế trong doc ⇒ script đổi vế thì gate không stale. + +--- + +## 1 — VIỆC 1: gỡ ambiguity stale (spec D.4) ✅ + +**File:** `.claude/commands/session-end.md:132` (bullet 🔸 cuối khối (g-bis)). +- Cũ: "vai #2 `h24-audit` + #3 `sleep-audit` land dần sau khi vai này chạy-thử-1-phiên + báo nấc" +- Mới: **"cả 3 vai-KIỂM đã BUILT + WIRED S145 … Mỗi vai chạy audit-round khi vòng tương-ứng chạy, độc-lập, KHÔNG chờ nhau"** + errata 🧊 nêu rõ bản cũ STALE (mâu-thuẫn roster Phase 1 + mâu-thuẫn đĩa) + trỏ `docs/STATUS.md` §Sub-agents cho số roster (B1 — KHÔNG chép số). + +🔴 **Citation-trap gặp THẬT (lớp `feedback_citation_trap_selfreference`):** bản vá đầu **dẫn nguyên văn** cụm stale trong ghi-chú errata ⇒ `grep 'land dần sau'` vẫn = **1** (chính dòng vá). Acceptance là grep-trần, KHÔNG có discriminator use⟂mention ⇒ **diễn-đạt lại không tái-tạo literal** ("xếp vào diện **chờ-land về sau**") thay vì bịa discriminator. Sau vá: **0** (cả bản có dấu lẫn không dấu). + +**Kiểm chéo :40-42 (yêu-cầu "2 chỗ không nói ngược"):** +- `:40` `tooling-harvest-audit` — "AUTO sau đo §L.b(g-bis)" ✔ khớp end-only tuyệt-đối +- `:41` `h24-audit` — **sửa thêm** cho khớp coupling: "@§L.b(j)(ii-bis) nếu cặp nổ ở close, @`session-start` §2.1.8 nếu cặp nổ ở open; *wherever it fires*" +- `:42` `sleep-audit` — **sửa** con-trỏ chết `Phase 4.5` → "AUTO sau **mỗi lượt nén** `/sleep-recovery-memory-l2` — post-step của skill, *wherever it fires*: consent @§2.1.2 HOẶC @§L.b(c)" + note 🧊 khai lý-do vá + +--- + +## 2 — VIỆC 2: D2 COMMIT DEFER (option b) + landing site + H24-coupling ✅ + +**Landing chính:** `session-end.md:124-131` — mục **(vi)** MỚI trong khối (g-bis). +- **Luật 1 dòng** (câu canonical chép sang 3 contract): *"KIỂM end-only: @open chỉ có diff-report, artifact authoritative (chốt/harvest/distill) ở close."* +- **3 vế lý-do (viết rõ, không "chưa kịp làm"):** (1) nhịp "hai đầu" buộc tầng **ĐO** 2 đầu (H1/H2 báo-diff @open, wired thật) — KHÔNG buộc tầng **KIỂM**; (2) cột self-verify V1/V2/V4 canonical = **CLOSE-time**, thứ bị chấm chỉ SINH ở close; (3) @open chỉ diff-report đã em-main verify ⇒ **0 artifact authoritative** ⇒ ép KIỂM @open = chấm bản chưa tồn-tại = đúng **ĐẠT-ảo** mà fail-safe NO-OP của cả 3 contract đang cấm. +- **Đánh-đổi + điều-kiện huỷ-defer** khai thẳng: sai @open chỉ soi ở close cùng phiên (trễ, không mất); @open mà sinh artifact authoritative ⇒ **PHẢI xét lại** (defer có điều-kiện huỷ, không đóng vĩnh-viễn). + +**H24-coupling — CHỌN option "wherever it fires"** (viết rõ, kèm lý-do + phân ranh 3 vai): +- `h24-audit` bám **cặp H24 wherever it fires**: cặp @§L.b(j)(ii) ⇒ chạy close; cặp @`session-start §2.1.8` (OVERDUE + consent) ⇒ chạy **NGAY tại open, ngay sau cặp**. Lý-do: pin = FLAG-list H24 tươi, **authoritative NGAY khi cặp trả**. +- `sleep-audit` **cùng khuôn** (bám lượt nén — consent @§2.1.2 hoặc @§L.b(c)); pin = `.gist.md` tươi. +- **Chỉ `tooling-harvest-audit` end-only TUYỆT-ĐỐI** (pin H1-chốt + H2-5-trục chỉ sinh ở close). +- Hoà-giải mâu-thuẫn biểu-kiến: **"end-only" = KHÔNG mở nhịp KIỂM RIÊNG @open**; vai vẫn **đi theo con-đo** bất kể con-đo nổ ở đâu. + +**3 contract — mỗi file +1 dòng luật (+ coupling riêng):** +| file | dòng | nội-dung | +|---|---|---| +| `.claude/agents/tooling-harvest-audit.md` | `:25` | luật + "end-only **TUYỆT-ĐỐI**", CẤM tự chạy @open | +| `.claude/agents/h24-audit.md` | `:26` (+`:27`) | luật + ngoại-lệ bám cặp H24 *wherever it fires* | +| `.claude/agents/sleep-audit.md` | `:25` (+`:26`) | luật + ngoại-lệ bám lượt nén *wherever it fires* | + +Cả 3 **TRỎ** `session-end.md §L.b(g-bis)(vi)` cho lý-do đầy-đủ (B1 — không chép lý-do 3 nơi). + +--- + +## 3 — VIỆC 3: D1 completeness-gate CÓ RĂNG ✅ + +**Landing:** `session-end.md:145-205` — **§L.c MỚI** (sau §L.b(k), trước Phase 2). Trước đó **repo KHÔNG có** completeness-gate trong `session-end.md` (grep `completeness-gate|phép sàn` trên 2 command = 0 hit — nó chỉ sống trong checklist hub `f71c5b65` + run-folder S135). ⇒ đây là **build mới**, không phải sửa chữ. + +**RĂNG = luật đọc kết-quả (dòng :150-153):** mỗi phép chỉ mang 1 trong 3 nhãn — +`ĐẠT` (**bắt buộc dán bằng-chứng đĩa**) · `TRƯỢT` (kèm số/path lệch) · `vacuous` (kèm folder-state). +🔴 **"Ghi `ĐẠT` mà không dán được bằng-chứng ⇒ phép đó TỰ ĐỘNG TRƯỢT"** + **"đã verify"/"khớp rồi"/trí-nhớ KHÔNG tính**. +🔴 **Chống meta-count (S119):** báo `phép: ĐẠT a / TRƯỢT b / vacuous c` (a+b+c=4); **CẤM** gộp "4/4 PASS" khi còn vacuous; vacuous **không** cộng tử-số. +🔸 Nấc khai thẳng: gate = **evidence-mandate, KHÔNG chặn** đóng phiên (cùng triết-lý Sàn-5 trong chính file: cổng báo-động-giả ⇒ bị bypass ⇒ tự xoá chính nó). + +**Bảng 5 vòng chức-năng** (V1..V5, mỗi vòng con-ĐO + con-KIỂM + bằng-chứng tối-thiểu; ô = con-trỏ, KHÔNG chép logic — B1) + luật `không-nhịp` (không ✓, không TRƯỢT, **không được im-lặng bỏ khỏi bảng**). + +**4 phép sàn — mỗi phép có disk-evidence requirement + lệnh chạy được:** +| phép | bằng-chứng BẮT BUỘC | chống-bare-PASS | +|---|---|---| +| **1 — tick vs cửa** | **3 SỐ thật**: `cửa = L nhãn + P dừng` + `counter-delta trước→sau` (snippet `git log … \|\| true` + grep `.session-counter.json`) | lệch ⇒ TRƯỢT + **in danh-sách cửa CÂM**; thiếu 3 số ⇒ TRƯỢT | +| **2 — dòng-nợ tại cửa** | **DÁN NGUYÊN VĂN** dòng `NHIP-NO: …` máy in (kể cả `probe-loi (khong chan)`) | tóm-tắt/diễn-giải/"đã in rồi" ⇒ TRƯỢT | +| **3 — closeout đủ nghi-thức** | **PATH THẬT** — bảng 3 closeout × 4 sổ, UNION-per-label (snippet `git log --name-only \| grep -E`) | ô rỗng ⇒ TRƯỢT + tên sổ thiếu + kỳ nào | +| **4 — vai đã-chạy có sổ** | **roles-ran list** + path `.claude/agent-memory//MEMORY.md` + **byte>0** + mtime | thiếu sổ/0-byte ⇒ TRƯỢT (AS-8) | + +Chi-tiết đáng nêu (đều là bẫy đã trả giá thật, ghi vào gate để khỏi tái): +- phép-1 + phép-3 **DÙNG CHUNG regex closeout §L.b(j)(vi)** — placeholder ``, **KHÔNG chép bản thứ 2** (B1). +- phép-1 dùng `|| true` (KHÔNG `|| echo 0`) — đúng bẫy `grep -c` mà chính file đã ghi 3 lần. +- phép-2 **trỏ script làm canonical vế-set**, khai luôn lệch tên gọi hub "3-vế" vs script in 4 đoạn. +- phép-3 **CẤM per-commit-naive** (agent-memory vào qua `wal:` cùng kỳ ⇒ FAIL oan; dẫn ca thật S133 `e53a693` + `9f404d3`) + khai proxy không phân-biệt "không chạy" vs "chạy không ghi sổ" (**cả hai đều lỗi** ⇒ vẫn bắt đúng). + +**Dòng báo gate** (ASCII, ghi cạnh khối `memory-triple` trong session-log): +`completeness-gate S: vong /5 chuc-nang (khong-nhip: ) | phep DAT a / TRUOT b / vacuous c` ++ luật: có TRƯỢT ⇒ NÊU ở Phase 4 **+ đổ vào sổ đích** (carry-slug HANDOFF / WAL-line / STATUS-row). + +--- + +## 4 — VIỆC 4: phép-4 landmine "not-yet-run (vacuous)" ✅ + +`session-end.md:197-200` — mục 3 của phép-4: +- 🔴 Vai **WIRED nhưng KHÔNG chạy phiên này ⇒ `not-yet-run (vacuous)` + DÁN folder-state**, **KHÔNG TRƯỢT** và **KHÔNG ĐẠT** — kèm lệnh `ls -la` 3 folder chạy được. +- 📌 **Baseline @S146 dán vào doc** (mốc 1 lần, KHÔNG lặp mỗi phiên): `tooling-harvest-audit/` tồn-tại **RỖNG** · `h24-audit/`+`sleep-audit/` **MISSING** ⇒ cả 3 = WIRED nhưng CHƯA chạy audit-round THẬT (vai #1 @S145 chỉ spawn-PROBE, cố-ý 0-ghi). +- 🔴 **Chặn ĐẠT-ảo tương-lai (vacuous không phải giấy phép vĩnh-viễn):** khi vòng tương-ứng CHẠY (H1/H2 chốt · cặp H24 chạy · lượt nén chạy) mà vai-KIỂM vẫn không có sổ ⇒ **TRƯỢT thật**, hết cửa vacuous. +- 🔴 Nêu thẳng đây là chỗ dễ ĐẠT-ảo nhất: *"folder trống"* đọc **giống hệt** giữa "chưa tới lượt" và "chạy rồi mà nuốt sổ" ⇒ **phải kèm bằng-chứng vòng đó có/không chạy**, không chỉ kèm `ls`. + +--- + +## 5 — ACCEPTANCE (tự chạy, output THẬT) + +``` +$ grep -nE 'land d(ầ|a)n sau' .claude/commands/session-end.md ; count=… +count=0 ← bản CÓ DẤU + không dấu (regex phủ cả 2) +$ grep -c 'land dan sau' .claude/commands/session-end.md +count_ascii=0 ← bản ASCII thuần + +$ grep -rnE 'KI(Ể|E)M end-only' .claude/agents/ +.claude/agents/h24-audit.md:26: … +.claude/agents/sleep-audit.md:25: … +.claude/agents/tooling-harvest-audit.md:25: … +files=3 ← ĐÚNG 3 file + +$ grep -n 'phép-1 —|phép-2 —|phép-3 —|phép-4 —|CẤM bare-PASS|TỰ ĐỘNG TRƯỢT' .claude/commands/session-end.md +145: ### §L.c — completeness-gate 5-vòng (D1, land S146 — 🔴 CÓ RĂNG: CẤM bare-PASS) +152: > Ghi `ĐẠT` mà không dán được bằng-chứng ⇒ phép đó TỰ ĐỘNG TRƯỢT … +170: 🔎 phép-1 — tick vs cửa · bằng-chứng = 3 SỐ thật +180: 🔎 phép-2 — dòng-nợ tại cửa · bằng-chứng = DÁN NGUYÊN VĂN dòng máy in +184: 🔎 phép-3 — closeout đủ nghi-thức · bằng-chứng = PATH THẬT +194: 🔎 phép-4 — vai ĐÃ-CHẠY phải có sổ · bằng-chứng = roles-ran list + path sổ + +$ grep -n 'not-yet-run (vacuous)' .claude/commands/session-end.md +197: 🔴 Vai WIRED nhưng KHÔNG chạy phiên này ⇒ `not-yet-run (vacuous)` + DÁN folder-state … +``` + +**Z — governance-only (git status):** 0 file `src/` · `fe-admin/` · `fe-user/` · `tests/` (`prod_files=0`), 0 migration. +File mình chạm ĐÚNG 4 + sub-file này. (`tiep.md` · `wal-flush.ps1` · `harness-11-engine.md` · `.session-counter.json` modified = **worker-1/worker-2**, KHÔNG phải mình.) + +--- + +## 6 — NGOÀI PHẠM-VI (báo lead, KHÔNG tự sửa) + +1. 🔸 **`scripts/nhip-no-probe.ps1:3` header STALE** — ghi *"3-part debt line"* trong khi `:22` + `:201` in **4 đoạn**. File ngoài quyền worker-3. Gate §L.c đã **miễn-nhiễm** (đo nguyên-văn, trỏ script), nhưng header nên vá cho khỏi dạy sai. +2. 🔸 Spec-v2:41 ghi *"phép-2 literal dòng-nợ **3-vế**"* — số này **stale so đĩa** (script in 4). Gate cố-ý KHÔNG chép số vế ⇒ không kế-thừa drift. diff --git a/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/sub-lead-omission-S146.md b/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/sub-lead-omission-S146.md new file mode 100644 index 0000000..d5e3053 --- /dev/null +++ b/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/sub-lead-omission-S146.md @@ -0,0 +1,139 @@ +# sub-lead-omission-S146 — H24 light-audit #4 (FORCE-FIRE, P=8 pause) + +> Vai: `lead-omission-auditor` — soi **CÁI KHÔNG CÓ**. Propose-only, KHÔNG Write/Edit ngoài file này. +> Counter=20 · last_audit.light=17 · P=8 `wal: pause` ⇒ OVERDUE(light). Consent-gate GỠ @S146 ("3 → auto"). +> **Ghi đĩa TRONG lúc làm** (anti-#53). Trạng thái: ĐANG CHẠY. + +## Tập KỲ-VỌNG (dựng TRƯỚC khi so — H24 §2(1) method) + +Nguồn cam-kết đã đọc: +- `docs/HANDOFF.md:6` khối `Carry MỞ re-stamp (14)` — segment mới nhất = **S141–S143**, CHƯA có segment S146 (đúng: `/session-end` mới tới BƯỚC 0). +- `docs/HANDOFF.md:7` `NEXT anh` 12 mục · `:8` `NEXT em`. +- `.claude/WAL.md` — 40 dòng, `closing: S146` sentinel treo, chain `[x]×6 + [!]×1`, khối `OWNER-DECISION`, dòng `carry:` (:38-40). +- `.claude/governance/.session-counter.json` — counter/last_audit/class_repeat/history. +- `.claude/agent-memory/memory-budget.json` — enum ĐÓNG 11 class · `h24_cadence` · `token_governor`. +- run-folder `runs/2026-07-22-S145-apply-hub-answers/` (13 file) — `implement-synthesis.md` + `sub-reviewer-precommit-s146.md`. + +Đo cơ-học (chống bẫy mega-line): `grep -o '\[carry:[a-z0-9-]*\]' docs/HANDOFF.md | wc -l` = **142 occurrence / 22 distinct tag** (grep -c ra 34 dòng — KHÔNG dùng). + +## FLAG (ghi ngay khi tìm ra) + +--- + +### FLAG-1 · MED-HIGH · `gap-owner-specifics` +**Owner-decision `[7]` bị GHI ĐÈ mất hẳn vì slot-index bị tái-dụng.** + +- **hứa ở:** `.claude/WAL.md` @ commit `ad02483` (`wal: flush 20260722T2305`) **và** `9c68bae` (`…T2310`), khối `## OWNER-DECISION (ghi de, KHONG hoi lai)`, nguyên-văn: + `[7] "con lai xu ly het xong roi session-end" = uy quyen commit+push + chay session-end` +- **hiện:** **VẮNG.** @ `e7d06f2` (`…T2326`) slot `[7]` bị **thay** bằng `[7] session-model: (1)…(2)…(3)…`; @ HEAD `c2d1a05` chỉ còn `[5][6][7]`. Grep 4 bề-mặt bền: + `grep -rn "con lai xu ly|còn lại xử lý|uy quyen|ủy quyền" docs/ .claude/WAL.md .claude/sessions/ .claude/governance/` ⇒ **0 hit**. + Session-log `2026-07-22-2350-S146-…md` (4457 B) ⇒ **0 hit**. pause-block + resume-block ⇒ **0 hit**. +- **im:** ~20 phút sống rồi mất; tính đến giờ **0 sổ bền nào** giữ nó. +- **vì sao là THIẾU, không phải "xong rồi":** phần "chạy session-end" đang chạy thật, nhưng phần **"uỷ quyền commit+push"** thì lead đang làm **NGƯỢC**: `WAL:29-30` `next:` ghi *"toi Phase 5 HOI ANH truoc khi push"* và `resume-S146-…md:29` ghi *"5 squash→push (**HỎI ANH trước khi bấm**)"*. Tức lead sắp hỏi lại đúng thứ owner đã trả lời — mà khối này tự đặt tên là **"ghi đè, KHÔNG hỏi lại"**. Nếu lead cố-ý siết chặt hơn owner thì đó là quyết-định riêng và **phải khai**, hiện **không khai ở đâu**. +- **resolve:** chép nguyên-văn uỷ-quyền `"còn lại xử lý hết xong rồi session-end"` vào segment HANDOFF S146 (mục owner-decision) HOẶC vào session-log §"Owner chốt"; nếu lead vẫn muốn hỏi lại trước push thì ghi 1 dòng lý-do. Hết flag khi 1 trong 2 tồn tại trên đĩa. +- 🔸 **Cơ-chế đứng sau (INFORM-3 bên dưới):** khối `OWNER-DECISION` trong WAL là **index-keyed + overwrite-in-place**, không có vết eviction — nên quyết-định `[N]` cũ bị quyết-định `[N]` mới **âm-thầm** thế chỗ. Đối-chứng: `.session-counter.json` `history[]` cố-ý **append-unbounded** với ghi-chú *"absence of a marker = never-happened (safe semantics)"*. Hai sổ cùng nhà, hai ngữ-nghĩa ngược nhau, chưa ai đối-chiếu. + +--- + +### FLAG-2 · MED-HIGH · `gap-incident-unrecorded` +**Sự-cố vận-hành S144 chỉ có vết trong run-folder, 0 hit trên MỌI sổ bền — trong khi sổ đếm vẫn quảng-cáo con số của kỳ TRƯỚC.** + +Hai sự-cố, cùng một lượt chạy `runs/2026-07-22-S144-trio-first-run/`, cùng một lỗ ghi-sổ: + +**(a) `#53` garble fire THẬT trên `harness-audit` (S144, ~16:35).** +- **vết:** `trio-synthesis.md:20-21` — *"`harness-audit` lượt-1 trả mẩu giữa chừng → SendMessage-resume → mới có return đầy đủ. Vai này **không ghi đĩa**, nên nếu phiên chết lúc đó thì **mất trắng**."* +- **0 hit trên 5 sổ bền:** `.claude/WAL.md` (grep `garble|#53` = 0) · `docs/HANDOFF.md` (grep `S144` = 0, `harness-audit` = 0) · `docs/STATUS.md` (`S144`×`garble` co-occurrence = **0**) · `docs/governance/error-ledger.md` (grep `S144|S145|S146` = **0**, `harness-audit` = 0) · sổ đếm `.claude/auto-memory/feedback_agent_return_garble_recover.md`. +- **quảng-cáo kỳ TRƯỚC (dấu-hiệu gốc của class):** sổ đếm dừng ở **`+ S143 ×5 = ×25 tổng`**; `mtime = 2026-07-22 14:02`, commit cuối `a1e2416` — **TRƯỚC** lượt trio 16:05–16:35. `docs/STATUS.md` in `×20 qua S118 → ×23 qua S143` (còn lệch nội-bộ với ×25, nhưng **đó là view-turf**, không phải của tao). +- 🔴 **Chính sổ đó tự tiên-đoán ca này:** dòng cuối `feedback_agent_return_garble_recover.md` ghi *"sổ này **từng đứng yên 8 nhãn phiên** (×20 từ S118) trong khi class vẫn fire — chính là ca đẻ ra class `gap-incident-unrecorded` (@S143 owner mở enum)"*. Nay lặp lại sau **2 nhãn phiên** (S144→S146). + +**(b) Lead tự-sai khi đo + **thu hẹp tập đối-chứng mà im lặng** (S144).** +- **vết:** `trio-synthesis.md:23-30` — lead ghi `run.md` hotload **538.529 B** / headroom **200.490** trong khi đĩa thật **540.724** / **199.759**; nguyên-nhân: lead **sửa chính vật vừa đo** (`agents/README.md` +2.195 B) rồi **chép lại số TRƯỚC khi sửa** và dán nhãn *"đo tươi"*. Nặng hơn: header scribe ghi *"đối chứng **4 mốc** lead: 0 LỆCH"* trong khi khối liệt **5 mốc**, mốc thứ-5 **chính là mốc lệch** — loại khỏi phép đối-chứng mà **không khai**. Con KIỂM tự kết luận: *"Đây đúng class `meta-count self-coverage blind-spot`."* +- **0 hit:** `docs/governance/error-ledger.md` (không có E-row/AS-row nào cho S144) · `.claude/auto-memory/feedback_meta_count_selfcoverage_blindspot.md` **mtime `2026-07-15 11:15`, commit cuối `23bbe97` (2026-07-15)** ⇒ **tái-phát của một class Đà CÓ TÊN mà sổ của chính class đó không nhích một byte**. + +**(c) 3 lỗi lead @S146** (phép quét sửa 4 lần · trả lời SAI về `/snapshot` · residual F1 có người chỉ vẫn rơi) — 🔸 **KHÔNG tính vào FLAG này**, vì chúng **CÓ** vết bền: `docs/changelog/sessions/2026-07-22-2350-…md:21-28` mục *"🔴 3 lỗi của LEAD trong phiên (ghi để không tái)"* + `pause-S146-…md` mục (1)D và (2). Khai thật: **đã ghi**, chỉ **chưa** vào `error-ledger` — mà `§L.a` RCA thuộc Phase 1.5 **chưa chạy**, nên chưa đủ điều-kiện fire. Xem INFORM-1. + 🔴 Riêng **"sweep consent sót 6 site"** (do `lead-view-auditor` bắt cùng phiên): tao **KHÔNG** đo được nó từ đĩa trong lượt này (chưa đọc output vai kia) ⇒ **không đưa vào FLAG**, tránh nhận-vơ phát-hiện của vai khác. Nếu em-main xác nhận nó là sự-cố thật thì nó **cùng lớp (b)/(c)** và đi chung resolve. + +- **resolve:** (i) §L.a RCA ghi **≥1 E-row** cho lượt S144 (garble + meta-count-narrowing), gắn AS-class có sẵn hoặc mở AS mới; (ii) bump sổ đếm garble `×25 → ×26` **ở CUỐI phiên** (đúng luật (c) mà chính sổ đó đã tự viết); (iii) chạm `feedback_meta_count_selfcoverage_blindspot.md` với data-point S144. Hết flag khi cả 3 có byte trên đĩa. + +--- + +### FLAG-3 · MED · `gap-decision-sunk` +**2/3 mục khối "Chờ-anh" `spec-adap-dot-9-10:68` KHÔNG được đưa lên bàn @S146 — đúng lúc owner đang ngồi trả lời câu ANH EM SONG SINH của chúng.** + +- **hứa ở:** `runs/2026-07-20-S141-…/spec-adap-dot-9-10-20-07-2026.md:68` khối *"Chờ-anh (không block implement)"* → đã được kéo lên `docs/HANDOFF.md:7` **NEXT anh (10)(11)(12)** @closeout S143 (chính tao bắt @S143, `gap-decision-sunk`). +- **hiện:** grep 3 bề-mặt S146 (`.claude/WAL.md` · `.claude/sessions/session-1/*.md` · session-log `2026-07-22-2350-…md`): + - `refine` ⇒ **0 hit** ⇒ mục (10) *ratify ranh `refine ⟂ lead-omission`* **không được nhắc một lần**. + - `consent` ⇒ **5 hit**, nhưng **TẤT CẢ** là khẳng-định trạng-thái, **không có câu hỏi nào**: `WAL:17-18` *"go consent H24 3 cho … sleep/trio VAN consent"* · `pause-block:16` *"gỡ cổng NGƯỜI (consent) ở 3 chỗ"* · `pause-block:23` *"**sleep + trio VẪN consent**; 3 cổng nay không còn cùng khuôn, cấm suy một ra ba"*. Mục (12) *consent-form trio **dài hạn** — mỗi phiên gật hay thành luật đứng* ⇒ **0 lần được hỏi**. +- **im:** sunk từ `spec:68` (S141) → tao bắt @S143 → lên NEXT anh @S143 → **S144, S145, S146 = 3 nhãn phiên nữa, 0 lần tiến thêm.** +- 🔴 **Đòn bẩy phân-biệt "bỏ sót" ⟂ "owner chủ-động gác"** (cùng khuôn `pull_warn_days` @S143): + 1. **Bất-đối-xứng trong CÙNG một dòng WAL.** `WAL:17-18` viết liền: *gỡ consent **H24*** … *sleep/trio **VẪN** consent*. Owner được hỏi và trả lời về cổng H24; cổng trio — **cùng cơ-chế, cùng câu, cách nhau 6 chữ** — không được hỏi. Chính lead viết *"3 cổng nay **không còn cùng khuôn**"* — đó đúng là khoảnh-khắc phải hỏi *"vậy khuôn của 2 cổng kia là gì?"*, và câu hỏi đó **đã nằm sẵn** ở NEXT anh (12). + 2. **Mục (12) đã bị hub ĐÁ VỀ SE** (`58e28bae` Câu-3) ⇒ không còn ai khác trả lời hộ; SE im = chìm luôn. + 3. **Mục (10) nay NẶNG hơn lúc phát-hiện:** `harness-refine` **đã chạy runtime lần đầu @S144** (`runs/2026-07-22-S144-trio-first-run/harness-refine-return.md`, 14.321 B) ⇒ cái ranh **wire-trước-khi-ratify** (`harness-refine.md:22-30`) nay **đã được thi-hành thật**, chưa ai duyệt. Đây là ranh chia việc với **chính vai này** — tao khai xung-đột lợi-ích và vẫn báo, vì im mới là sai. + 4. **Đối-chứng "vắng vì XONG":** mục (11) *5 câu session-model* **KHÔNG** flag — vì @S146 nó **tiến thật** (`session_ctx_kb`=64 owner-set · hook 3→4 path landed · folder-form chốt scaffold). Cùng khối, cùng tuổi, một mục tiến / hai mục 0 ⇒ khác biệt nằm ở **agenda do lead dựng**, không ở ý-chí owner. +- **resolve:** đưa (10) + (12) vào **NEXT anh** của segment S146 với 1 dòng nêu rõ "đã treo N phiên + nay đã chạy runtime", HOẶC owner nói rõ "giữ treo" ⇒ hạ xuống INFORM-only. Hết flag khi 1 trong 2 có byte trên đĩa. + +--- + +### FLAG-4 · MED · `gap-carry-dropped` +**Tập việc-mới sinh @S146 bị TÁCH ĐÔI giữa 2 sổ, KHÔNG sổ nào giữ đủ — và sổ sắp bị RESET lại là sổ giữ nhiều hơn.** + +Đây **không** phải dự-đoán: hai sổ đang **lệch nhau ngay lúc này**, đo được. + +| việc mới (hub-floor + bookend) | `.claude/WAL.md:38-40` (`carry:`) | session-log `…2350-…md:36-41` ("Còn treo") | +|---|---|---| +| `_snapshot-k` + lệnh chụp-nhanh không-dừng | ✅ | ✅ (1) | +| `_context` tầng **STOCK** + nén | ✅ | ✅ (2) | +| `/pause` **tự chụp** trước khi dừng | ✅ | ❌ **VẮNG** | +| `/tiep` đọc snapshot mới nhất + **phòng cửa-sổ-sập** | ✅ | ❌ **VẮNG** | +| **meld-forward** qua squash — chưa đo | ✅ | ✅ (4) | +| **bookend đủ 5/5 vòng** | ❌ **VẮNG** | ✅ (3) | +| **hợp (union) = 6** | **5/6** | **4/6** | + +- **hứa ở:** `.claude/sessions/session-1/pause-S146-20260722T2328.md:37-47` (bảng "GAP hub-floor mới lộ" 5 dòng + đoạn "Nghi-vấn còn treo" = bookend 5/5) — đây là **nguồn đầy đủ nhất**, đủ cả 6. +- **hiện:** WAL 5/6 · session-log 4/6 (bảng trên, `grep` từng cụm). +- **vì sao NGUY:** `next:` của chính WAL (`:29-30`) ghi Phase 6 = **reset WAL**. Sau reset, hai vật còn sống ở tầng work-state là **session-log + HANDOFF**. ⇒ hai mục `/pause tự-chụp` và `/tiep đọc snapshot + phòng cửa-sổ-sập` **chỉ còn sống trong `pause-block`** — mà `pause-block` là artifact **theo-cửa-sổ**, `/tiep` chỉ đọc **cái mới nhất**, không phải sổ backlog. Đây đúng hình "tổng nhìn vẫn ổn nên không ai kêu" của `gap-carry-dropped` @S143. +- **máy mù chỗ này (đúng thiết-kế):** cả 6 mục **chưa có tag `[carry:*]`** ⇒ `H24-2` không nhìn thấy. Đo tươi phiên này: detector chỉ soi **6/14** carry có tag (`[ok] pull-warn-threshold` · `[ok] tools-whitelist-no-teeth` · `[ok] session-model-adopt` + 3 dòng FIRE). Không token nào để grep ⇒ **không detector nào bắt được**. +- **im:** sinh @S146 (~23:26 WAL / ~23:50 log), lệch ngay từ lúc sinh. +- **resolve:** segment HANDOFF S146 ghi **đủ 6** mục, gắn tag `[carry:*]` (đề-xuất: `[carry:hub-floor-snapshot]` · `[carry:context-stock]` · `[carry:pause-tu-chup]` · `[carry:tiep-doc-snapshot]` · `[carry:meld-forward]` · `[carry:bookend-5-5]` — tên do lead chốt), và **con số khối carry phải là `14 + 6 = 20`**, không phải `14`. Hết flag khi khối carry mới chứa đủ 6. + 🔸 Nếu lead cố-ý gộp 6 → ít mục hơn thì **được**, miễn khai rõ gộp gì vào đâu (gộp-có-khai ≠ rơi-âm-thầm). + +--- + +## KHÔNG fire — và lý-do (khai thật, không phải "chưa soi") + +**`gap-carry-aged` — ĐỌC detector, KHÔNG tự tính.** `governance-detectors.ps1` H24-2 phiên này in `M = 6 (read from config)`, 66 logic-segment / 19 carry-line, FIRE **3**: +`uat-s134-luyke` streak **7** · `uat-s133-budget-freeze` streak **9** · `hook-vs-budget-cap` streak **13** (≥ M=6). +⇒ **KHÔNG fire** vì cả 3 đều đang nằm trên `HANDOFF:7` **NEXT anh** (4)(5)(7) = owner **chủ-động giữ**, đúng anti-pattern #3 ⇒ **INFORM-only**. Y hệt S143, **không báo lại như mới**. + +**`gap-underfill` — 0, có lý-do, KHÔNG phải bỏ soi.** Không tồn tại phép đo để so: phiên vào bằng `/tiep` ⇒ **không có** `session-start §2.1.6` %-print; `session-end §L.b(c)` %-print nằm ở **Phase 1.5 CHƯA CHẠY**. `token_governor.lead_tokens = 380000` và `crystallized_backfill.target = 210000` đều không có dòng thực-nạp nào trên đĩa phiên này ⇒ **bất-khả-đo**, không phải "đủ". Đã cân-nhắc-rồi-BÁC ứng-viên *"spawn-prompt cho 3 worker mỏng so với 50K wf-sub"*: `sub-implement-*.md` 12.9–20.8 KB là **return**, không phải input ⇒ không suy ra được input-fill. Trùng INFORM-2 @S143, **repeat, không báo mới**. + +**`gap-owner-specifics` cho 2 câu còn lại — 0, vì lead ghi ĐỦ.** Kiểm từng chữ: +- *"1 → tường minh"* ⇒ `memory-budget.json:7` `_session_ctx_kb_owner_set` chép **nguyên-văn** `"anh chot '1 -> tuong minh'"` + giữ nguyên caveat ghost-wire (`:8`) ⇒ ĐỦ, thậm chí giữ cả phần bất-lợi. +- *"1 và 2 → giống hub. 3 → auto."* ⇒ session-log `:12` chép **nguyên-văn cả câu**, + `:13-15` bung 3 specifics (tách cấp-SỐ ⟂ tạo-THƯ-MỤC · `closed.md` FROZEN 4 trường NO-OP-im-lặng · *"auto = bỏ HỎI, không phải bỏ ĐẾM"*); `pause-block:13-17` trùng khớp. ⇒ ĐỦ. **Chỉ mỗi vế "còn lại xử lý hết xong rồi session-end" là mất** → FLAG-1. + +**`gap-incident-unrecorded` cho 3 lỗi lead @S146 — 0.** Có vết bền thật (session-log `:21-28` + pause-block (1)D/(2)) ⇒ **không** thoả "0 hit mọi sổ". Chỉ chưa vào `error-ledger`, mà `§L.a` chưa chạy → INFORM-1. + +--- + +## INFORM (không phải FLAG) + +1. **`error-ledger` = 0 hit cho S144/S145/S146.** `§L.a` RCA thuộc Phase 1.5 chưa chạy nên **chưa fire**. Khi chạy, đây là 5 ứng-viên: 3 lỗi lead S146 + 2 sự-cố S144 (FLAG-2). 🔸 Quan-sát class: *"kết-luận VẮNG-MẶT từ một tập-đo HẸP"* nay đủ **3 ca**: `AC4 grep-theo-SỐ` (S143, 2 site liệt-kê-TÊN lọt) · `phép quét siết LỆCH TRỤC` (S146-F2, lọt 4/11) · `"không có /snapshot"` (S146, kết-luận từ đĩa SE mà không mở manifest hub `101e69d6`). Bảng `AS-1…AS-16` **chưa có row nào** cho class này. Đề-xuất mở AS-17 — **quyền lead/owner, tao chỉ nêu**. +2. **Cam-kết `NEXT em` "MFE GOODHART-WARN strikes 21→23 theo dõi" (`HANDOFF:8`) = 0 hit** trên `WAL` · `pause-block` · `resume-block` · session-log. Đĩa: `.claude/agent-memory/.mfe-state.json` `strikes_total: 23`, mtime `16:26` = do lượt **trio S144** chạm, **không phải quan-sát của lead**. Chưa fire vì memory-triple ở Phase 1.5 chưa chạy; **nếu closeout đóng mà 0 dòng MFE thì đó là `gap-carry-dropped` thật.** +3. **Cơ-chế: khối `OWNER-DECISION` trong WAL là index-keyed, overwrite-in-place, KHÔNG vết eviction** (nguyên-nhân gốc FLAG-1 — `[7]` cũ bị `[7]` mới thế chỗ, không dòng nào ghi lại). Đối-chứng cùng nhà: `.session-counter.json` `history[]` cố-ý **append-unbounded**, tự khai *"absence of a marker = never-happened (safe semantics)"*. Hai sổ, hai ngữ-nghĩa ngược nhau, chưa ai đối-chiếu. Đề-xuất rẻ: cấm tái-dụng số slot trong cùng phiên (chỉ nối `[8]`). +4. **Coverage-gap S140/S143 còn nguyên** — H24-2 chỉ soi carry **có tag trong NEXT-segment** (6/14 phiên này); cụm 7-carry đồng-tuổi S117/S118 và 6 việc-mới đều **vô hình** với phép đo tuổi. **Repeat, không báo mới**; nêu để INFORM-2 của FLAG-4 không bị đọc thành phát-hiện mới. +5. **`adap-synthesis.md:35`** giữ một nợ đo chưa ai gánh: chỉ-thị anh *"Nhớ chú ý đọc thật kỹ bọn mày rất hay sót"* được đáp bằng thiết-kế *"mỗi file ≥2 người đọc, lăng-kính KHÁC nhau"*, nhưng *"hiệu-lực của phép đó **chưa có phép đo hậu-kiểm**; đừng đọc thành 'đã chứng minh không sót'"*. Không xếp vào enum (không phải quyết-định-treo, không phải carry) ⇒ nêu **verbatim**, **KHÔNG bịa class**. + +--- + +## TỔNG + +**TOTAL: 4 FLAG** — phân-rã theo class (cho `jump_on_class_repeat` = 3): +- `gap-owner-specifics` ×1 (FLAG-1) → tally **2 → 3** 🔴 **CHẠM JUMP** (S140 ×1 → S143 ×2 → S146 ×3) +- `gap-incident-unrecorded` ×1 (FLAG-2) → tally **0 → 1** (lần đầu fire kể từ khi owner mở enum @S143) +- `gap-decision-sunk` ×1 (FLAG-3) → tally **1 → 2** +- `gap-carry-dropped` ×1 (FLAG-4) → tally **1 → 2** +- `gap-carry-aged` **0 fire** (3 detector-hit đều owner-held ⇒ INFORM) · `gap-underfill` **0** (bất-khả-đo, có lý-do) + +🔴 **META-COUNT self-check:** con số 4 ở trên là **đếm từ 4 mục `### FLAG-n` có thật trong file này**, không phải ước-lượng. `gap-owner-specifics` chạm ngưỡng jump=3 ⇒ **đây là số đo, không phải đề-nghị** — quyết kéo nhịp là của em-main/owner. + +**Phạm-vi tao KHÔNG soi (tránh lấn):** mọi thứ "CÓ nhưng LỆCH" — `HANDOFF:5` còn khai *"trio CHƯA spawn lần nào"* trong khi trio đã chạy @S144 · `HANDOFF:7` NEXT anh (1) còn đòi restart+gật · `HANDOFF:8` khai *"H24 deep tới hạn"* trong khi `deep_at_counter=17` ⇒ mốc kế 32 · `STATUS` in `×23 qua S143` vs sổ đếm `×25` · `migration-todos.md` (mtime 2026-05-28) còn `[ ] Audit 2026-07-01` dù đã chạy S96 — **tất cả là `lead-view-auditor` turf**, tao nêu con-trỏ chứ không tính vào TOTAL. diff --git a/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/sub-lead-view-S146.md b/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/sub-lead-view-S146.md new file mode 100644 index 0000000..9edb36b --- /dev/null +++ b/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/sub-lead-view-S146.md @@ -0,0 +1,66 @@ +# sub-lead-view-S146 — H24 vai-STALE (force-fire @S146 closeout) + +> Vai: `lead-view-auditor` (H24 §2(1) — soi VIEW LỆCH SOURCE). Propose-only, KHÔNG sửa file. +> Force-fire: `session-end §L.b(j)(vi)` P=8 `wal: pause` ⇒ OVERDUE(light) bất kể counter. Consent-gate Đà GỠ (owner @S146 "3 → auto"). +> counter=20 · `last_audit.light_at_counter`=17 · nhịp tự-nhiên chưa tới (17+6=23). +> Nền máy: `governance-detectors.ps1` TOTAL 47 (KHÔNG chạy lại — chỉ lăng-kính ngữ-nghĩa). +> Ghi ĐĨA TRONG LÚC LÀM — mỗi FLAG append ngay khi tìm ra. + +--- + +## FLAG-1 — `view-stale-status` — MED + +- **view:** `.claude/commands/tiep.md:100` — Sàn-3 §0 block ⑤ ORPHAN-L, gạch đầu dòng 🔴 "Khai hở (chống ghost-wire H18)": khai `closed.md` thuộc nghi-thức `/session-end` nhưng còn ở trạng-thái chưa-được-wire, lý-do nêu là "bảng VC-2 còn chờ anh duyệt". +- **source:** + - `.claude/commands/session-end.md:363` — "§6.3-bis … Chân này **trước S146 CHƯA wire** … **Nay đóng.**" + - `.claude/commands/session-end.md:365-369` — nghi-thức Đà CÓ NGƯỜI GHI: ghi `.claude/sessions/session-/closed.md`, FROZEN, 4 trường tối-thiểu, idempotent NO-OP nếu đã tồn-tại, NO-OP im-lặng nếu 0 thư-mục. + - `.claude/commands/session-end.md:367` — nói THẲNG vào chính block đang stale: "⇒ `tiep.md §0` block **⑤ ORPHAN-L** hết kêu oan." + - `.claude/WAL.md:9` owner-decision `[7]` — "(2) closed.md = **WIRE**"; `.claude/WAL.md:17` — "**§6.3-bis** closed.md FROZEN 4-truong idempotent NO-OP". +- **lệch cụ-thể:** view nói cơ-chế **chưa có người ghi + còn chờ owner duyệt**; source nói owner **đã chốt WIRE** và nghi-thức **đã land trong CÙNG phiên S146**. Hai câu ở hai file cùng lớp `.claude/commands/` nói ngược nhau về CÙNG một cơ-chế. +- **KHÔNG phải nhiễu — đây là dư-lượng thật, không phải lineage:** câu ở :100 viết ở thì HIỆN-TẠI, không có dấu 🧊 (repo dùng 🧊 rất nhất-quán cho lineage — xem chính `tiep.md:69`, `:76`, `session-end.md:119`, `:140`). Nó còn kéo theo một hệ-quả SAI: "chỉ ca *pause rồi đóng thẳng không tiep* mới thiếu đối-ứng" — ca đó nay **đã có** đối-ứng. +- **Nghịch-lý nội-tại (bằng-chứng mạnh nhất, cùng file):** MÁY ở ngay trên đã wire rồi — `tiep.md:89` ghi đối-ứng gồm "hoặc closed.md do đóng-L", `tiep.md:94` `c=0; [ -f "$d/closed.md" ] && c=1`, `:95` `[ "$p" -gt $((r + c)) ]`. ⇒ **code đọc `closed.md` thật, chỉ PROSE còn nói "chưa wire"**. Đây là lật-ngược của ghost-wire (H18 class-2 defined-but-unread): ở đây là **wired-but-declared-unwired** — và trớ trêu là nó nằm đúng dưới nhãn "chống ghost-wire H18". +- **resolve:** `tiep.md:100` lật sang trạng-thái đã-wire + trỏ `session-end.md §6.3-bis`, HOẶC hạ nguyên câu cũ xuống 🧊 lineage (giữ vết theo khuôn repo). Kèm sửa hệ-quả "chỉ ca … mới thiếu đối-ứng". Hết flag khi 0 surface `.claude/commands/**` còn khai `closed.md` chưa-wire ở thì hiện-tại. +- **Ghi-chú ranh-giới:** KHÔNG flag `.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/sub-implement-CE-sessionmodel.md:272` (câu tương-tự) — run-trace S145 = **snapshot đóng-băng đúng thời-điểm ghi**, sửa nó mới là sai (bẫy #3 frozen-by-design). + +--- + +## FLAG-2 — `view-residual-asym` — MED + +**Cùng gốc FLAG-1 (`closed.md` đã wire) nhưng surface KHÁC, và ở đây bất-đối-xứng nằm NGAY TRONG MỘT FILE.** + +- **view:** `docs/governance/session-model-se-draft.md` — 3 site còn khai `closed.md` chưa-wire: + - `:5` — khối "⏳ CHƯA — vẫn chờ anh duyệt bảng VC", câu cuối khẳng-định `/session-end` chưa ghi `closed.md`. + - `:54` — 🔴 "Chân này CHƯA wire (nghi-thức closeout thuộc VC-2 còn chờ anh) — khai rõ, không claim kín." + - `:113` — 🔴 "Hở CÒN LẠI, khai thẳng: … chưa wire (VC-2 chờ anh) ⇒ ca *pause rồi đóng thẳng không qua /tiep* sẽ kêu oan." +- **source:** `docs/governance/session-model-se-draft.md:81` — **CÙNG FILE**, bảng §4-bis "OWNER-DECISION @S146", cột **"Đã land @S146"**, dòng 2 `Wire closed.md | giống hub | session-end §6.3-bis — … Khoá nốt vòng ORPHAN-L ⇒ hết kêu oan ca "pause rồi đóng thẳng"`. Đối-chứng ngoài file: `.claude/commands/session-end.md:363-369`. +- **lệch cụ-thể:** :81 nói **đã land + đã khoá ORPHAN-L**; :113 nói **chưa wire + vẫn kêu oan** — hai câu **phủ-định nhau từng chữ** về cùng một ca. :5 và :54 cùng phía với :113. +- **Vì sao là residual-asym chứ không phải "doc cũ chưa ai đụng":** file này **Đà được sửa @S146** — header `:3` tự khai *"CẬP-NHẬT TRẠNG-THÁI @S146 … sửa cho khớp đĩa"*, `:72` đã lật meld-forward-gap sang ✅ Đà ĐÓNG, `:81` mới thêm. ⇒ đợt sửa **có chạy**, chỉ **không phủ hết**. Đúng chân-dung "sửa nguồn quên gương", lần này gương nằm cùng file. +- **Nguy-hiểm riêng của site :5:** nó là **khối trạng-thái ĐẦU FILE** — người đọc (kể cả hub khi review) dừng ở đó. Một khối tự nhận "cập-nhật @S146" mà nội-dung sai thì **đáng tin hơn nên hại hơn** một dòng cũ không ai cập-nhật. +- **resolve:** lật :5 / :54 / :113 sang trạng-thái đã-wire (hoặc hạ 🧊 lineage), giữ nguyên :81. Hết flag khi trong `session-model-se-draft.md` **0 câu ở thì hiện-tại** nói `closed.md` chưa wire. + +--- + +## FLAG-3 — `view-residual-asym` — MED + +**Suspect #1 của lệnh — VERIFY ĐỘC-LẬP: sweep "gỡ consent H24" @S146 CHƯA phủ hết. Còn 6 occurrence / 2 file.** + +- **source (sự-thật mới, 3 nguồn khớp):** + - `.claude/commands/session-end.md:106` §L.b(j)(ii) — "OVERDUE → 🔴 **SPAWN AUTO, KHÔNG consent** (owner chốt @S146: "3 → auto"; THAY luật consent-gate era-S122)". + - `.claude/commands/session-start.md` §2.1.8(e) — "OVERDUE(light|deep) → 🔴 **SPAWN AUTO cặp H24 NGAY, KHÔNG consent** (owner chốt @S146 "3 → auto")" + "⚠️ **KHÁC** sleep-check §2.1.2 (vẫn CONSENT) và **KHÁC** trio §2.1.9 (vẫn CONSENT) — 3 cổng nay **không còn cùng khuôn**". + - `.claude/WAL.md:9` owner-decision `[7](3)` — "V2 = **auto** (go cong NGUOI, GIU cong NHIP 6/15/3)". +- **view — 6 site còn khai H24 = consent-gated, tất cả ở thì hiện-tại, KHÔNG có dấu 🧊:** + +| # | site | nguyên-văn (rút gọn) | vì sao SAI | +|---|---|---|---| +| 1 | `.claude/commands/session-end.md:110` | h24-audit AUTO "(owner S145, **KHÁC (ii) consent-gate của chính H24**)" | (ii) ở `:106` nay **cũng** auto ⇒ vế tương-phản **sụp**; câu tự-mâu-thuẫn với dòng cách nó 4 dòng | +| 2 | `.claude/commands/session-end.md:110` | Fail-safe: "H24 KHÔNG chạy phiên này (chưa nhịp / **không consent**)" | nhánh `không consent` nay **không thể xảy ra** = nhánh chết | +| 3 | `.claude/commands/session-end.md:135` | "cặp chạy @`session-start` §2.1.8 (**OVERDUE + anh consent**)" | §2.1.8 nay là OVERDUE ⇒ auto, **không có** vế consent | +| 4 | `.claude/agents/h24-audit.md:4` (frontmatter `description`) | "AUTO fire SAU khi cặp H24 chạy (… session-start §2.1.8 khi **OVERDUE+consent**)" | 🔴 nặng nhất — `description` **được nạp vào mô-tả vai**, sai ở đây lan sang mọi lượt spawn | +| 5 | `.claude/agents/h24-audit.md:25` + `:27` | "(session-end §L.b(j) hoặc session-start §2.1.8 khi **OVERDUE + anh consent**)" ×2 | như #3 | +| 6 | `.claude/agents/h24-audit.md:28` | Fail-safe: "H24 KHÔNG chạy phiên đó (chưa tới nhịp / **anh không consent**)" | như #2 — nhánh chết | + +- **Bằng-chứng đây là sweep-sót, KHÔNG phải "chưa tới lượt sửa":** lead **đã truy đúng class này và tuyên-bố đóng** — `session-model-se-draft.md:85` ghi *"Kết-nhiễm đã chặn: **2 chỗ** (`session-end §L.b(k)(i)` · `session-start §2.1.9(a)`) viện 'trio consent cùng khuôn sleep-check + H24' … **đã gỡ vế H24**"*. Kiểm 2 chỗ đó: `session-end.md:140` ✅ đã gỡ · `session-start.md:253` ✅ đã gỡ. ⇒ sweep **chạy đúng, đếm sai phạm-vi**: nó tìm nơi H24 bị **viện làm khuôn cho vai khác**, mà bỏ nơi H24 bị **viện làm mốc tương-phản** ("KHÁC (ii) consent-gate") và nơi nó nằm trong **điều-kiện fire của vai khác** ("§2.1.8 khi OVERDUE + anh consent"). +- 🔴 **Đây là TÁI-DIỄN nguyên si bài S143** (`agents/README.md:28` tự ghi): sweep đặt acceptance theo **hình-dạng chuỗi** ⇒ "0 hit" ⇒ tuyên-bố sạch, trong khi site sống dùng **cách diễn-đạt khác**. S143 là enum-tên-vs-grep-số; lần này là consent-như-chủ-ngữ vs consent-như-tham-chiếu-chéo. **Cùng một lớp lỗi, cách nhau 3 nhãn phiên.** +- **Hệ-quả vận-hành thật (không chỉ prose):** `h24-audit` là vai **AUTO bám cặp H24 wherever it fires**. Contract của nó (`h24-audit.md:25/:27/:28`) dạy rằng cặp H24 chỉ fire *khi anh consent*. Một lượt chạy `h24-audit` đọc đúng contract của mình có thể **NO-OP nhầm** ở đầu `session-start` (thấy "không consent" ⇒ tưởng cặp không chạy) — đúng ca **ĐẠT-ảo im-lặng** mà chính `:124` cấm ("Auto ≠ chạy-mù"). +- **resolve:** gỡ vế consent ở 6 site (`session-end.md:110` ×2, `:135`; `h24-audit.md:4`, `:25`, `:27`, `:28`); fail-safe rút về **một** điều-kiện `chưa tới nhịp`. Hết flag khi grep `consent` trong `.claude/agents/h24-audit.md` + `.claude/commands/session-end.md` **không còn occurrence nào gán cho H24** (sleep-check §2.1.2 + trio (k)(i)/§2.1.9 **GIỮ** — 3 cổng nay khác khuôn). +- ⚠️ **CẨN-TRỌNG khi vá (bẫy tự-tham-chiếu W0.4):** `session-model-se-draft.md:85` và `session-end.md:119` **cố-ý** chứa chữ "consent" để kể luật CŨ (🧊 RETIRED). Đừng quét mù theo chữ `consent` rồi xoá luôn 2 chỗ đó — mất vết lineage. Phân-biệt **use ⟂ mention**. diff --git a/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/sub-reviewer-5vong-closure.md b/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/sub-reviewer-5vong-closure.md new file mode 100644 index 0000000..bdb3d89 --- /dev/null +++ b/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/sub-reviewer-5vong-closure.md @@ -0,0 +1,54 @@ +# VERDICT: PASS_WITH_FIXES + +Lens = Axis D (5-vòng closure). Verified against SPEC [2]§Axis-D + [3] A/D1,D2 · canonical checklist f71c5b65 · session-start.md · session-end.md · disk (agent-memory folders + agent files). + +## Findings + +### F1 — Mapping 5 vòng → KIỂM: CORRECT (verified on disk, not doc-trust) +| Vòng canonical | SE KIỂM role | Wire site verified | +|---|---|---| +| V1 Cặp tooling+harvest | tooling-harvest-audit | session-end.md:40 "verify OUTPUT H1+H2" ✓ agent file exists | +| V2 Cặp soi-lead | h24-audit | session-end.md:41 "verify OUTPUT lead-view+lead-omission" ✓ agent file exists | +| V3 Bộ ba đo→đề-xuất→kiểm | harness-audit | session-start.md:115 "con KIỂM run-folder PIN" ✓ agent file + sổ exist | +| V4 Vòng nén (distill) | sleep-audit | session-end.md:42 "verify OUTPUT /sleep-recovery gist+Fidelity" ✓ agent file exists | +| V5 Sàn-sự-thật nhãn đã-đo | measured-label-gate (reviewer floor) | floor, no spawned role ✓ | +All 5 agent contracts EXIST (glob `.claude/agents/*audit*.md` = 7 files incl all 3 new). Mapping is REAL, not aspirational. + +### F2 — D2 premise CONFIRMED TRUE (3 KIỂM = session-END only) +- session-end.md:40-42 wire tooling-harvest-audit / h24-audit / sleep-audit AUTO at close. +- session-start.md:97 lists them ONLY in topology roster (describing what exists), NOT as spawn points. No session-start spawn of these 3. +- CONTRAST: harness-audit (V3 KIỂM) IS wired both ends (session-start §2.1.9 consent-gated + session-end §L.b(k)). So V3 KIỂM ≠ end-only; only V1/V2/V4 KIỂM are end-only. Spec's blanket "3 KIỂM" summary is accurate for the 3 it names. + +### F3 — MEASURE layer IS at both ends (key context for the ruling) +- H1 tooling-auditor: session-start.md:127 "spawn → báo tooling-state 4-mặt + DIFF vs last-session" = the "báo diff" open-end. H2 harvest-curator line 110. So canonical "hai đầu" nhịp is SATISFIED at the MEASURE layer. +- em-main VERIFY→APPEND (session-start.md:125, B3) = a human-in-loop checkpoint already exists at open. The gap is ONLY at the new independent KIỂM/audit layer, which sits ON TOP of an already-verified measure. + +### F4 — LANE-4 RULING on D2: DEFER (option b) is LEGITIMATE — arguably the CORRECT reading of canonical +Reasons: +- (a) Canonical "hai đầu" nhịp binds the MEASURE function (H1/H2 báo diff at open) — which IS wired both ends (F3). +- (b) Canonical SELF-VERIFY column for V1/V2/V4 is explicitly CLOSE-time: V1 "commit đóng phiên gần nhất CÓ vết sổ", V2 "ba lần đóng phiên gần nhất đều có vết chạy". The KIỂM roles mechanize this self-verify → session-end wiring is canonical-CONSISTENT, not a violation. +- (c) Structural: KIỂM verifies OUTPUT of measure; at open the output is a light diff-report (already em-main-verified), authoritative artifact (chốt+gom/harvest/distill) is at close. Nothing authoritative to audit at open. +RULING CONDITIONS → see FIX-1. + +## Acceptance-teeth-check +- **D1** ("5 vòng chức-năng + 4 phép sàn (bảng verify)"): teeth PRESENT (4 floor checks are $0 re-runnable disk-truth, no Goodhart/word-count) BUT WEAK — "(bảng verify)" does not mandate per-check disk-evidence, so "PASS" risks a bare self-tick. See FIX-2. +- **D2** ("đóng HOẶC defer-có-lý-do documented (không im-lặng bỏ)"): falsifiable-in-principle (grep the doc for defer rationale) BUT spec routes decision to lane-4 without NAMING the durable landing site → "documented" unsatisfiable by spec alone until fixed. See FIX-1. +- No Goodhart / đếm-chữ detected in D acceptance. Death-paths (§Axis-D "5 vai=5 vòng SAI · đừng nhét audit nặng vào điểm-dừng phá C7") are ADEQUATE and consistent with F4 ruling (auditing at every open would risk C7). + +## Risk/gap + +### FIX-1 (MAJOR) — D2 defer must NAME durable landing site + address H24-cadence coupling +Spec Axis-D pt2 says "(a) HOẶC (b) defer... document defer + acceptance / lane-4 phán" but does NOT name WHERE the defer rationale lands. My review is ephemeral; acceptance D2 requires a persistent artifact. Fix: spec must COMMIT to (b) + require implementer WRITE the defer rationale into a NAMED durable doc (recommend: `.claude/agents/tooling-harvest-audit.md` contract or session-end.md near (g-bis), or harness-11-engine §). The rationale must explicitly cover the coupling edge: h24-audit fires "AUTO sau cặp H24" (session-end.md:41) but H24 runs BY CADENCE and the H24 tick/overdue check is at session-START (§2.1.8) — state whether h24-audit follows H24 wherever it fires or is intentionally end-only (else a cadence-at-open H24 goes un-audited). + +### FIX-2 (MAJOR) — D1 teeth weak + phép-4 LANDMINE live on disk NOW +Disk truth (verified this review): +- `.claude/agent-memory/tooling-harvest-audit/` EXISTS but EMPTY (no MEMORY.md, created Jul 22 18:27 this session) +- `.claude/agent-memory/h24-audit/` MISSING · `.claude/agent-memory/sleep-audit/` MISSING +- `.claude/agent-memory/harness-audit/` has MEMORY.md ✓ +Canonical phép-4 = "vai đã chạy thì phải có sổ". tooling-harvest-audit spawns AUTO this session (session-end.md:118 "spawn NGAY, KHÔNG consent-gate"). If it fires and does NOT write MEMORY.md → phép-4 FAILS this very close. Fix: (i) D1 acceptance must require each of the 4 floor checks to SHOW actual disk-read evidence (phép-1 cửa-count vs counter-delta numbers · phép-2 the literal dòng-nợ 3-vế line · phép-3 the 3 closeout ritual-sổ traces · phép-4 the roles-ran list + sổ paths), not a bare "PASS"; (ii) spec must ensure any KIỂM role firing this session produces a sổ, OR the completeness-gate explicitly records it as not-yet-run (vacuous pass) with the folder-state evidence. + +### FIX-3 (MINOR) — incremental-adopt ambiguity is the ROOT of the phép-4 risk +session-end.md:123 "Incremental adopt: đây là vai #1/3 (tooling/harvest). Vai #2 h24-audit + #3 sleep-audit land dần sau" — but lines 41-42 ALREADY wire #2/#3 AUTO. Ambiguous whether #2/#3 FIRE this session. Resolves the phép-4 scope: if #2/#3 don't fire, their MISSING folders are OK (vacuous); if they fire, MISSING folder → phép-4 FAIL. Spec D1 must pin which roster-state the completeness-gate runs against. + +## Note (out of lane, forward to synthesis) +Z-acceptance "governance-only": git status shows `.claude/agents/tooling-harvest-audit.md` untracked (??) + h24-audit.md/sleep-audit.md tracked. Confirms 0 src/fe/tests touched by Axis-D scope — Z holds for my lane. diff --git a/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/sub-reviewer-axisE.md b/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/sub-reviewer-axisE.md new file mode 100644 index 0000000..37e1940 --- /dev/null +++ b/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/sub-reviewer-axisE.md @@ -0,0 +1,68 @@ +# VERDICT: FAIL + +Lens = Axis E (tiep/pause/snapshot re-check) + CROSS-CUT chống sót. 2 CRITICAL (cả hai ship regression nếu implement đúng spec), 1 MAJOR, 4 MINOR. + +## Findings + +### 🔴 CRITICAL-1 — Axis A.4 + acceptance A2: tiền-đề "thực chỉ 2 surface" là SAI (đo được 4). Thực-thi = HỎNG doc đang ĐÚNG. +- **spec:15 (A.4) + spec:53 (A2)** yêu cầu đổi `nhip-no-probe.ps1:6-7` header "4 surface" → **"2 surface"** + `session-model-se-draft.md:34` "4 điểm lệnh" → 2, với acceptance A2 = `grep "4 surface|4 điểm lệnh" = 0 hit`. +- **Đo ground-truth** `grep -n "scripts/nhip-no-probe.ps1" .claude/commands/*.md`: + - `pause.md:44` ✓ · `tiep.md:112` ✓ · **`session-start.md:216`** ✓ (block (e) "BÁO dòng-nợ 4-vé" — gọi thẳng `scripts/nhip-no-probe.ps1`) · **`session-end.md:104`** ✓ (block (j)(i) "BÁO dòng-nợ 4-vé" — gọi thẳng `scripts/nhip-no-probe.ps1`). + - ⇒ **4 surface XÁC-NHẬN THẬT.** Header "4 surface" + draft "4 điểm lệnh" = **ĐÚNG**. +- Nhầm của spec-author: thấy `session-start.md:135` gọi `distill-shard-probe.ps1` (probe KHÁC) rồi kết-luận session-start/end KHÔNG gọi nhip-no-probe. Thực-tế session-start/end gọi **CẢ HAI** script (shard-probe @135 + nhip-no-probe @216/104). +- **Hệ-quả:** implement A.4/A2 sẽ biến câu ĐÚNG ("4 surface") thành câu SAI ("2 surface") = tự-tạo stale-claim, NGƯỢC hẳn ý-đồ (vá stale). A2 acceptance có RĂNG NGƯỢC-CHIỀU: đuổi "grep=0 hit" ⇒ xoá text đúng ⇒ **cổng PASS bản-hỏng, FAIL bản-đúng**. +- **measured-label gate:** claim spec "thực chỉ 2" là con-số đo-lường; phép kiểm 1-dòng grep khiến nó TRƯỢT ⇒ phải BỎ/ĐẢO claim. +- **Sửa:** GỠ A.4 + A2 (hoặc đảo thành "xác-nhận 4 surface ĐÚNG, no-op"). Không có stale-claim nào để vá ở đây. Nếu muốn giữ mục "đính-chính", đối-tượng đúng = sửa premise của chính spec-author, KHÔNG sửa header/draft. + +### 🔴 CRITICAL-2 — Seam C↔E: Axis C.2 hook 3→4 path (thêm `sessions/`) phá bất-biến Sàn-3 tiep.md §0; KHÔNG axis nào hoà-giải. +- **spec:28 (C.2)** đổi `wal-flush.ps1:13` 3-path → +`sessions/` (owner S144). **spec:44 (E.2)** bảo "verify tiep.md Sàn-3 ĐÚNG". Nhưng Sàn-3 tiep.md §0 hardcode **"3 path"/"3 điểm mù" tại 4 site**: `tiep.md:21` ("hook có **3 điểm mù**") · `:23` ("wal-flush.ps1 tự-commit **3 path**: WAL·agent-memory·runs") · `:75` ("BẬC TRUNG-BÌNH — bẩn NGOÀI **3 path**") · `:78` ("bẩn ngoài **3 path** ⇒ NÊU"). +- Sau C.2 (hook = 4 path) mà KHÔNG cập-nhật §0: + 1. Tường-thuật "3 điểm mù" → **SAI** (thành 4). 4 site stale. + 2. **BẬC MẠNH signal ④** chỉ phủ `runs/` ⇒ `sessions/session-/` (per-pause context-map @C.5, hook auto-commit thành `wal:`) là **điểm-mù thứ-4 KHÔNG có signal đối-ứng** ⇒ phiên chết còn context-map nhưng bị phán "sạch" = **đúng bug-class "sổ trống ≠ sạch"** mà Sàn-3 sinh ra để chặn. Reopens the blind spot. + 3. **BẬC TRUNG-BÌNH (:75/:78) misclassify**: dirt trong `sessions/` giờ NẰM TRONG persist-set nhưng luật vẫn đếm nó "bẩn ngoài 3 path" ⇒ dương-giả logic THẬT (không chỉ prose stale). +- Đây là **safety-critical recovery floor** (Sàn-3 = lưới chống mất mạch-việc). Gap đã được chính adap-report ghi: `docs/governance/adap-reports/2026-07-17-...manifest.md:23` = **"meld-forward-gap (Stop-hook SE phủ 3 path, manifest giả-định 4)"** — biết trước, chưa đóng. +- **Sửa:** thêm sub-task tường-minh vào C.2 HOẶC E.2: khi hook→4-path ⇒ (a) cập-nhật CẢ 4 site "3 path"→"4 path" ở tiep.md §0 + (b) QUYẾT sessions/ có cần strong-signal ⑤ không (hoặc lý-do miễn) + (c) sửa BẬC-TRUNG "ngoài 3 path"→"ngoài 4 path". Thêm acceptance đo: `grep "3 path\|3 điểm mù" tiep.md = 0` sau C.2. + +### 🟠 MAJOR-3 — Axis C.1 session_ctx_kb=64: nghịch owner-authority + K6.2, + ghost-wire (0 consumer). +- **spec:27 (C.1) + spec:57 (C1)** set `memory-budget.json` session_ctx_kb=**64**, khung "canonical default 'vắng→64KB'; owner override được — note owner-gated như `pull_warn_days`". +- Nhiều artifact phiên trước phân-loại session_ctx_kb = **OWNER-GATED, số là của owner, SE 'không tự đặt số' = TUÂN-THỦ**: `session-model-se-draft.md:55` ("SE chưa đo 64 có hợp không — **mượn số hub mà chưa đo là đúng thứ K6.2 CẤM**") · `sub-task-1:253` (K6.2 cấm) · `spec-adap-dot-11:31` ("SE để trống = TUÂN-THỦ") · `audit-synthesis:56` (session_ctx_kb 0/0 = **bỏ-sót/owner-giữ**, tương-phản pull_warn_days được cấp carry). +- 2 prong hỏng: + 1. **Framing "default" ≠ "owner-directed".** WAL.md:62 gợi "session_ctx_kb=64 owner-ap-ngay" — NẾU owner chốt 64 phiên này thì OK, nhưng spec cite "canonical default" chứ KHÔNG cite owner-directive; và acceptance C1 ("key=64") KHÔNG đòi note owner-lineage như bulk_note_shards mang (`_owner_set` lịch-sử 2-nấc @S144). "vắng→64KB" = default-AT-READ ⇒ để-TRỐNG mới đúng biểu-diễn "owner chưa chọn" (mirror bulk=null + pull_warn_days absent). Ghi 64 = xoá tín-hiệu "unset". + 2. **Ghost-wire (#H18):** grep toàn-repo — **0 script đọc session_ctx_kb** (chỉ doc/spec/draft + `nhip-no-probe.ps1:42` NÊU tên trong comment "declining to pick"). Trái với `pull_warn_days` mà spec analogize — cái đó CÓ reader sống `nhip-no-probe.ps1:190` `$warn=$cad.pull_warn_days`. ⇒ analogy "như pull_warn_days" hỏng cả 2 mặt (owner-lineage + consumer). Set 64 = wire số không-ai-đọc. +- **Sửa:** (a) nếu owner chốt 64 @S145 ⇒ cite owner-directive + thêm `_owner_set` note (như bulk); bỏ khung "default". (b) nếu chưa ⇒ ĐỂ TRỐNG (default-at-read 64), KHÔNG hardcode — mirror kỷ-luật SE đã giữ. (c) xác-định consumer hoặc mark owner-gated-inert-pending-wire để tránh ghost-wire. + +### 🟡 MINOR-4 — Axis B: "BÃO-TO :63" là line-ref MỜ (sai file gợi-ý). +- **spec:20** viết "Hiện: `memory-budget.json:11` = null; BÃO-TO `:63`". `:63` liền sau citation memory-budget.json ⇒ dễ đọc thành memory-budget.json:63 (thực = `_merge_note` của mfe — SAI file). BÃO-TO thật ở **`distill-shard-probe.ps1:63`** (`if ($null -ne $bulkShards -and $n -gt $bulkShards)`). Spec Axis B **KHÔNG hề nêu tên `distill-shard-probe.ps1`** dù B2 (spec:56) đòi fault-inject BÃO-TO — implementer phải tự mò script. Sửa: ghi rõ `distill-shard-probe.ps1:63` + nêu script này là target cho B2. + +### 🟡 MINOR-5 — tiep.md:23 line-ref ":7" stale (paths thật ở :13). +- `tiep.md:23` cite "`wal-flush.ps1:7` tự-commit 3 path" nhưng `$paths=@(...)` ở **`wal-flush.ps1:13`** (dòng 7 = comment INTERLOCK). Spec Axis C.2 tự cite đúng ":13". E.2 "re-check tiep.md" nên gộp fix line-ref này (sẽ chạm §0 khi vá CRITICAL-2 anyway). + +### 🟡 MINOR-6 — Acceptance E1 yếu/vòng-tròn (thiếu răng). +- **spec:63 (E1)** = "review PASS; defect (nếu có) fixed; C7-compliant" — không falsifiable độc-lập ("review PASS" = tin reviewer). Thêm check dương cụ-thể: `pause.md:17` wf: đủ 5-trường (grep run=/runId=/args=/done=/harvested=) · `tiep.md §0` đủ 4 signal MẠNH · `tiep.md:127` rule "memory-pack DẪN-XUẤT-LẠI TƯƠI (CẤM reuse cũ)" present · run.md có `## taskList snapshot`. + +### 🟡 MINOR-7 — Precision + death-path sót. +- spec:28 "+`sessions/`" nên là **"+`.claude/sessions/`"** (path đầy-đủ; hook paths repo-relative). +- Axis A death-path (spec:17) không phủ **C7-compliance của `distill-shard-probe.ps1`** — probe THỨ-2 cũng chạy ở command-surface (session-start:135). Nếu §N là luật general cho probe-tại-điểm-dừng, nên xác-nhận shard-probe cũng read-only/non-blocking (hiện có tự exit? cần verify — ngoài scope 3-file lens nhưng nêu để lane-A/D bắt). + +## Acceptance-teeth-check +| # | Teeth | Note | +|---|---|---| +| A1 | OK | grep predicate-2-nơi=0 falsifiable | +| **A2** | **RĂNG NGƯỢC** | enforces câu SAI "2 surface"; PASS bản-hỏng FAIL bản-đúng → CRITICAL-1 | +| A3 | OK | fault-inject chiều-lỗi chạy thật; nên thêm cách quan-sát "no-hang" (timeout) | +| B1 | OK | =30 >15, grep derived-copy=0 | +| B2 | OK-thiếu-tên | đúng 2-chiều nhưng KHÔNG nêu distill-shard-probe.ps1 (MINOR-4) | +| C1 | thiếu | chỉ "key=64", KHÔNG đòi owner-lineage/consumer → MAJOR-3 | +| C2 | thiếu | grep 4-path OK nhưng KHÔNG đòi cập-nhật tiep.md §0 "3 path" → CRITICAL-2 | +| C3/C4 | OK | 2-tầng nhãn + regex + gitignore-verify falsifiable | +| D1/D2 | OK | routed lane-4 (đúng thiết-kế) | +| **E1** | **yếu** | vòng-tròn → MINOR-6 | +| Z | OK | git-diff scope + test-count + bundle falsifiable | + +## Risk/gap (cross-cut sweep — cái 4 lane kia dễ RƠI) +- **Seam A↔truth (CRITICAL-1):** lane-A đọc "Axis A" bị prime tin spec-framing "đây là stale-fix" ⇒ dễ nhận A.4 face-value. Chỉ cross-cut grep 4 file command mới lòi 4-surface. Lane-A KHÓ tự bắt. +- **Seam C↔E (CRITICAL-2):** lane-C lo build session-model, lane-E lo re-check tiep — bất-biến "hook path count = §0 blind-spot count" nằm ĐÚNG khe giữa 2 lane; cả 2 death-path (spec:33 + spec:47) đều KHÔNG nhắc ripple. Đây là gap CHỈ cross-cut thấy. +- **Owner-authority (MAJOR-3):** lane-C dễ coi 64 là "áp số hub-answer" mà bỏ qua rằng session_ctx_kb là cột owner-giữ (khác bulk=30 có owner-lineage rõ). Cần phân-biệt "áp hub-answer" (C7/bulk — hub trả) vs "số owner-giữ" (session_ctx_kb — SE đã CỐ Ý từ-chối). +- **Death-path đủ chưa:** mỗi axis CÓ death-path riêng, nhưng CROSS-axis death-path (C sửa hook ⇒ E phải sync Sàn-3; A.4 premise chưa verify ⇒ đừng thực-thi mù) VẮNG ở cả C lẫn E lẫn A. Đó là điểm sót hệ-thống. +- **Snapshot integrity (Axis E.3):** pause.md:17 wf: 5-trường (run/runId/args/done/harvested) + tiep.md:124-128 relaunch-cắt-gọt + :127 memory-pack-tươi-rule = MÔ-TẢ ĐÚNG, không defect nội-tại. Defect của E nằm ở SEAM (CRITICAL-2), không ở mô-tả E. +- **Spec [1] tự-mâu-thuẫn:** khai "verify 2-tuyến (đã)" nhưng premise A.4 ("thực chỉ 2") sụp dưới grep 1-dòng ⇒ verify 2-tuyến KHÔNG phủ điểm này. Giảm tin-cậy claim "đã verify". diff --git a/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/sub-reviewer-bulk.md b/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/sub-reviewer-bulk.md new file mode 100644 index 0000000..3ca48c2 --- /dev/null +++ b/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/sub-reviewer-bulk.md @@ -0,0 +1,37 @@ +# VERDICT: PASS_WITH_FIXES + +Lăng-kính BULK (Axis B) — spec-apply-hub-s145.md. Design SOUND + canonical-aligned; fixes nằm ở ACCEPTANCE TEETH (B2 boundary, B1 grep-scope), không ở thiết-kế. + +## Findings + +### Canonical-match (task a) — PASS +- Hub Câu 2 (inbox `...c7-bulk-shards.md:65-91`) canonical: ĐẶT số (≠null) · số của SE reference-not-copy (đừng copy `10`) · số > tầng-1 · owner-set · cờ LOUD KHÔNG đổi hành-vi nén. Spec Axis B (`:19-23`) khớp TỪNG vế. +- 🔎 Hub CHÍNH NÓ đề-xuất "anchor ~30 (≈2×min-SE=15)" tại `:79`. ⇒ 30 KHÔNG phải copy `10`; nó là **derive từ tầng-1 CỦA SE (15)**, trùng anchor hub vì hub làm CÙNG phép derive. reference-not-copy = THỎA (số đến từ 15 của SE, không từ 10 của hub). Item(1) 30>15 ✓ · 30≠10 ✓. +- Item(4) script `distill-shard-probe.ps1:63` = `if ($null -ne $bulkShards -and $n -gt $bulkShards)` — khớp EXACT "bulkShards!=null AND n -gt bulkShards". Spec KHÔNG đổi :63 (chỉ set JSON value). PASS. `-gt` (strict) ⇒ n≤30 IM, n≥31 BÃO-TO — khớp spec "≤30 im / >30 bão". +- Item(2) reference-not-copy CLEAN tại spec-time: grep `.claude/commands` = 0 · `docs/governance` = 0 · `.claude/agents` = 0 (repo-wide grep chỉ thấy 30 ở WAL[transient]/spec/run + hub-broadcast[value=10 của hub]). KHÔNG derived-doc nào hardcode bulk-value. +- Spec line-cite `memory-budget.json:11` = ĐÚNG (line 11 thật là `bulk_note_shards`). `_bulk_note` semantics đặt TRONG json = single-source-compliant (khớp hub mandate "derived docs trỏ key, KHÔNG chép số"). + +### Đường-chết (task d) — ĐỦ, tốt +- `:23` "số ≤15 = tầng-2 dưới tầng-1 = vô-nghĩa" + "đừng copy 10 (min hub=1 khác scale)" — bắt trúng 2 bẫy THẬT. Khớp hub `:78` (copy 10 → 10<15 = tầng-2 DƯỚI tầng-1 vô nghĩa). + +## Acceptance-teeth-check (task b) + +### 🔴 MAJOR — B2 under-specified, THIẾU RĂNG BOUNDARY +- B2 = "im (≤30) / bão (>30→BÃO-TO) 2-chiều PASS trên cây tạm". `-RepoRoot` support (script:13) ⇒ cây-tạm khả-thi ✓. NHƯNG "≤30/>30" KHÔNG chốt ranh CHÍNH-XÁC. +- Script:55-59 tự agonize `-gt` vs `-ge` cho tầng-1 — **CÙNG off-by-one risk ở tầng-2 :63**. Fault-inject happy-path (n=5 im, n=100 bão) sẽ PASS DÙ operator sai (`-ge`). Per feedback_faultinjection_proves_teeth (S95): **boundary + anti-Goodhart-flip BẮT BUỘC**. +- FIX: B2 phải chốt cặp ranh trên cây-tạm với bulk=30 (giá-trị production): **n=30 → tầng-2 IM (tầng-1 KEU, chứng "chỉ tầng-1 xử")** · **n=31 → `BÃO-TO: backlog 31 > 30`**. Cặp này chứng ĐỒNG THỜI (i) `-gt` không off-by-one (ii) tầng-2 gate ĐỘC-LẬP TRÊN tầng-1. Dùng n≤15 cho "im" = vô-giá-trị (cả 2 tầng im, không chứng tầng-2). + +### 🔸 MINOR — B1 grep-scope mơ-hồ +- B1 "grep derived-copy = 0" KHÔNG nêu pattern/scope. Verified clean HIỆN-TẠI, nhưng acceptance nên chốt: grep `bulk_note_shards` HOẶC literal `30`(bulk-threshold) trong {session-start/end · pause · tiep · harness-11-engine · agents/*} = 0; value sống DUY-NHẤT ở memory-budget.json (+ script đọc key). Không chốt scope = acceptance tự-lão-hoá (S109/S121). + +## Risk/gap (task c) + +- 🔸 MINOR (owner-authority): bulk_note_shards = **owner-authority** number (config role_boundary_note; hub `:84` "owner-set"; O-1 spec-adap-11 "núm-số thuộc chủ dự án"). Spec `:21` LABEL "owner-set" ✓ nhưng B1 chỉ verify SỐ, không verify owner-ratify. Risk=0 (hub `:67/:91`: cờ LOUD-only, đặt sai chỉ kêu sớm/muộn KHÔNG mất data) + hub tự đề-xuất ~30 ⇒ em-main initial-anchor CHẤP-NHẬN-ĐƯỢC, nhưng spec nên khai rõ "30 = owner-set/initial-anchor, KHÔNG em-main auto-tune; owner veto bất-kỳ-lúc-nào" (mirror :58-59 operator-vs-number). +- 🔸 MINOR (cross-cutting, PRE-EXISTING, ngoài lens chính): `memory-budget.json:16` _acceptance tầng-1 case(2) "{3 shard,0 ngày}→PHẢI KÊU" MÂU-THUẪN production min=15 (3<15 ⇒ `-gt` = IM). Chỉ hợp-lệ nếu đọc là "cây-tạm ngưỡng<3" — nhưng KHÔNG khai ngưỡng-tạm ⇒ mơ-hồ. KHÔNG do S145 sinh (S144), nhưng Axis B claim "single-source clean" mà KHÔNG flag. Đề-nghị lane tầng-1/Axis-D xác-nhận. (Cảnh-báo lây: nếu B2 bắt-chước pattern "cây-tạm ngưỡng bịa" thì chứng cơ-chế KHÔNG chứng production-30 — xem MAJOR trên.) +- 🔸 MINOR/OPTIONAL (robustness): script KHÔNG guard `bulkShards > minShards`. Mis-set tương-lai (bulk15). + +## Positive-validation (resisted scrutiny) +- script:63 logic EXACT ✓ · 30 derive-from-SE-15 not copy-hub-10 ✓ · derived-copy 0-hit commands+governance+agents ✓ · -RepoRoot teeth-capable ✓ · dead-ends bắt trúng 2 bẫy thật ✓ · line-cite :11 accurate ✓. + +## Verdict rationale +PASS_WITH_FIXES: thiết-kế Axis B đúng + khớp canonical hoàn-toàn (hub tự đề-xuất 30). Fix DUY-NHẤT bắt buộc = **B2 boundary teeth (n=30 IM / n=31 BÃO-TO trên cây-tạm bulk=30)**. B1 grep-scope + owner-ratify-label = minor tighten. Không block nếu B2 được siết ranh. diff --git a/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/sub-reviewer-c7.md b/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/sub-reviewer-c7.md new file mode 100644 index 0000000..c1926b1 --- /dev/null +++ b/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/sub-reviewer-c7.md @@ -0,0 +1,75 @@ +# VERDICT: PASS_WITH_FIXES (lăng-kính C7 / Axis A) + +Core C7 (viết luật + reword + B1-point + fault-inject) KHỚP canonical hub-reply Câu 1. +NHƯNG 1 must-fix BLOCKING: "đính-chính 4 surface→2" (spec step-4 / A2) FACTUALLY SAI — +spec nhầm `nhip-no-probe.ps1` với `distill-shard-probe.ps1`. + +## Findings + +### [CRITICAL / must-fix BLOCKING] spec:15 + A2 (:53) — "4 surface → 2" là SAI, phải DROP +Spec:15 khẳng-định: header `nhip-no-probe.ps1:6-7` "4 surface" SAI, "thực chỉ **2** (pause:44 + tiep:112; +session-start/end gọi `distill-shard-probe` script KHÁC)". → **False premise = conflation 2 script.** + +Bằng-chứng đĩa (verified live): +- `scripts/nhip-no-probe.ps1:6-8` (header): *"Called (never inlined) by the session command surfaces + (/pause, /tiep, session-start, session-end)"* → header tự khai **4**, và **4 đó ĐÚNG**. +- 4 caller THẬT của `nhip-no-probe.ps1` (grep + Read xác nhận từng dòng): + 1. `pause.md:44` → `powershell.exe ... -File scripts/nhip-no-probe.ps1` + 2. `tiep.md:112` → `powershell.exe ... -File scripts/nhip-no-probe.ps1` + 3. `session-start.md:216` → khối "(e) BÁO dòng-nợ 4-vế" gọi `... -File scripts/nhip-no-probe.ps1` (LIVE) + 4. `session-end.md:104` → khối "(i) BÁO dòng-nợ 4-vế" gọi `... -File scripts/nhip-no-probe.ps1` (LIVE) + (`session-end.md:131` chỉ là REFERENCE "khối (c) đã chạy ... nhip-no-probe" — KHÔNG phải caller thứ-5.) +- `distill-shard-probe.ps1` là script KHÁC HẲN, mục-đích KHÁC (Sleep-check, đếm shard pending), + gọi ở `session-start.md:135`. Spec-author thấy "session-start/end gọi distill-shard-probe" (ĐÚNG, cho + sleep-check) rồi suy sai "⇒ session-start/end KHÔNG gọi nhip-no-probe" (SAI — gọi CẢ HAI, khác mục-đích). +- `session-model-se-draft.md:34` (path THẬT = `docs/governance/`, KHÔNG `.claude/governance/`): + `| NHIP-NO probe 4-vế | 4 điểm lệnh | GIỮ per-điểm-dừng |` → "4 điểm lệnh" cũng **ĐÚNG**, KHÔNG stale. + +Hệ-quả nếu implement A2: +- Ghi 1 FALSEHOOD vào 2 file (header script + draft) — đổi con-số ĐÚNG "4" thành SAI "2". +- Acceptance A2 grep `"4 surface\|4 điểm lệnh" = 0 hit` = **anti-teeth / Goodhart**: cổng PASS bằng cách + XÓA thông-tin ĐÚNG, không verify tính-đúng. Đúng lớp "vá bằng rời tập-đo" mà governance chặn. +- run.md:9 (scratch) mang cùng lỗi ("header '4 surface' SAI (chỉ 2)") — nếu implementer re-derive từ run.md + sẽ nhân lỗi. Cảnh-báo implementer BỎ luôn. + +**SỬA:** DROP hẳn spec step-4 + xoá vế stale-fix trong A2. GIỮ NGUYÊN "4" ở cả header lẫn draft:34 +(chúng đang đúng). Nếu muốn rõ hơn, header CÓ THỂ ghi "4 surfaces (2 stop-point pause/tiep + 2 bookend +session-start/end)" — nhưng CON-SỐ vẫn là **4**, không phải 2. A2 rút gọn còn: "0 chỉnh — 4 đã đúng". + +### [PASS] spec:12 — nhà-luật §N chọn ĐÚNG (verify-point 1) +Law-home = `harness-11-engine.md §N` (thêm N.x "C7 điểm-dừng-rẻ", cạnh WAL H22). CLAUDE.md xác nhận +WAL H22 sống ở "PHẦN N" của engine ⇒ đặt C7 kề đó hợp-lý. pause.md/tiep.md chỉ TRỎ về §N (spec:14, B1 — +KHÔNG chép predicate 2 nơi). ĐÚNG chỗ: engine (governance floor) chứ KHÔNG nhét vào command. Khớp canonical. +🔸 minor: "§N" còn placeholder — implementer phải chốt số §; nhưng hướng đúng. + +### [PASS] spec:11 + :16 — code script KHÔNG đổi (verify-point 4, phần code) +`nhip-no-probe.ps1:203-208`: `catch { Write-Host 'probe-loi (khong chan)' }` → `exit 0`. Thoả vế-iv +non-blocking rồi. Spec:11 "Script THỎA 4-vế rồi" + spec:16 "script KHÔNG đổi code" = ĐÚNG. KHÔNG đổi +interpreter sang python (FORM, hub KHÔNG đòi) — death-path spec:17 bắt đúng. +⚠️ NHƯNG spec:15 lại bảo "Sửa header → 2" = 1 EDIT vào script (comment), VÀ edit đó SAI (xem CRITICAL). +Kết-luận verify-4: logic KHÔNG đổi (đúng); header-edit CÓ nhưng phải DROP. + +## Acceptance-teeth-check +| # | Có răng? | Ghi-chú | +|---|---|---| +| A1 C7 luật | ✅ teeth | verify tồn-tại mục C7 4-vế + grep 0-chép-2-nơi (anti-drift B1 thật). 🔸 minor: chưa verify WORDING predicate khớp canonical FLOOR (read-only + non-blocking + **gỡ-được-không-hậu-quả**) + tách FLOOR/FORM — nên thêm để chặn "viết luật nhưng lệch floor". | +| A2 stale-fix | ❌ ANTI-TEETH | Goodhart: PASS = xoá info ĐÚNG. Tệ hơn vô-dụng — nó THƯỞNG cho việc làm doc SAI. Phải DROP (xem CRITICAL). | +| A3 fault-inject | ✅ teeth | falsifiable: probe lỗi → in `probe-loi` + hoàn-tất, KHÔNG hang; "chạy thật KHÔNG happy-path". Khớp hub "vế-iv LOAD-BEARING + chiều-lỗi bắt-buộc". 🔸 minor: chưa nêu VECTOR inject (bad `-RepoRoot` / JSON hỏng / kill mid-run) — S135 precedent dùng `-RepoRoot` sai → probe-loi exit0; nên chốt vector để đảm-bảo răng. | + +## Risk/gap +- **Death-path THIẾU (spec:17):** liệt 3 (đừng python · đừng cấm-tất · đừng chép predicate) — ĐÚNG nhưng + SÓT cái quan-trọng nhất mà lỗi này phơi ra: *"đừng 'sửa' header 4→2 — nó ĐÚNG, đừng nhầm với + distill-shard-probe"*. Bổ-sung death-path này. +- **Fault-inject chiều-lỗi teeth-thật:** script đã `exit 0` + catch sẵn ⇒ A3 chỉ CONFIRM behavior hiện-có + (đúng ý hub "verify-before-trust"). Nhưng "KHÔNG hang" chỉ thật-sự có răng nếu inject thứ CÓ-THỂ hang; + script chỉ đọc JSON/bytes/dirs (bounded, no net/lock/loop) ⇒ hang-risk thấp, exception-path là proxy hợp-lý. + OK, chỉ cần chốt vector (minor). +- **A1 chưa neo FLOOR-wording:** rủi-ro implementer viết "4-vế" nhưng chữ lệch canonical (vd bỏ + "gỡ-được-không-hậu-quả" = mất chính phần LOAD-BEARING hub nhấn). Thêm 1 vế acceptance so 3 tính-chất FLOOR. + +## Verdict recap (Axis A / C7) +- (1) law-home §N: ✅ ĐÚNG (engine, không command). +- (2) "4→2": ❌ SAI — thực **4** (verified 4 caller). CRITICAL, DROP step-4 + A2-stale-clause. +- (3) fault-inject chiều-lỗi: ✅ có răng (minor: chốt vector). +- (4) đổi code script: logic KHÔNG (đúng); header-edit CÓ nhưng SAI → DROP. +Core C7 sound; chặn ở 1 must-fix conflation. → PASS_WITH_FIXES. diff --git a/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/sub-reviewer-precommit-s146.md b/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/sub-reviewer-precommit-s146.md new file mode 100644 index 0000000..9f7e798 --- /dev/null +++ b/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/sub-reviewer-precommit-s146.md @@ -0,0 +1,84 @@ +# sub-reviewer PRE-COMMIT S146 — adversarial review + fault-inject re-verify + +> Ghi-đĩa-trong-lúc-làm (anti-#53). Append theo thứ-tự tìm ra, KHÔNG đợi cuối. +> Run: `.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/` · reviewer spawn @S146 · 2026-07-22 + +## [0] SCOPE GATE — VIỆC 4 + +`git status --porcelain` @spawn (14 M + 1 untracked): +``` + M .claude/agent-memory/memory-budget.json + M .claude/agents/h24-audit.md + M .claude/agents/sleep-audit.md + M .claude/agents/tooling-harvest-audit.md + M .claude/auto-memory/project_h22_wal_session_continuity.md + M .claude/commands/pause.md + M .claude/commands/session-end.md + M .claude/commands/session-start.md + M .claude/commands/tiep.md + M .claude/governance/.session-counter.json + M .claude/hooks/wal-flush.ps1 + M docs/governance/harness-11-engine.md + M docs/governance/session-model-se-draft.md + M scripts/nhip-no-probe.ps1 +?? .claude/scheduled_tasks.lock +``` +- 0 file `src/Backend` · 0 `fe-admin/` · 0 `fe-user/` · 0 `tests/` · 0 migration → **SCOPE GATE PASS** (governance/config-only đúng claim). +- ⚠️ `?? .claude/scheduled_tasks.lock` untracked — chưa rõ nên ignore hay commit. Ghi lại, kiểm sau. + +Diffstat: 14 files, +225 / -35. + +--- + +## [1] FINDINGS (append khi tìm ra) + +### 🔴 F1 [MAJOR→BLOCKING-cho-claim-"grep MỌI consumer"] `session-end.md:114` + `:296` VẪN dạy `hook-3-path` — sót consumer LIVE, và acceptance MÙ với nó + +Đĩa NOW (sau khi worker đã vá): +``` +.claude/commands/session-end.md:114: ... (file ngoài hook-3-path; bằng-chứng sống: tick S133 ...) +.claude/commands/session-end.md:296: 🔴 M-7 — ... file NGOÀI hook-3-path ⇒ KHÔNG tự vào `wal:` commit ... +``` +- **LIVE PRESCRIPTIVE** (thân `/session-end`, echo mỗi closeout) — KHÔNG phải lịch-sử. +- **Đã được cảnh-báo TRƯỚC** trong chính run này: `sub-implement-CE-sessionmodel.md:258-259` liệt đúng 2 dòng, gắn nhãn *"🔴 THẬT — cùng class, cần → 4. Worker-3 sở-hữu."* ⇒ worker-3 KHÔNG vá. Đây là **residual có người chỉ tận nơi mà vẫn rơi**. +- **Bất-đối-xứng nội-bộ:** `pause.md:40`/`:43` Đà đổi sang `hook-4-path`, `session-end.md` thì không ⇒ 2 command anh em nay **nói ngược nhau về cùng một hook**. +- Ngữ-nghĩa mệnh-đề vẫn ĐÚNG (`.claude/governance/` vẫn ngoài cả 4) ⇒ hại = **dạy sai cardinality**, không phải hành-vi sai. Nhưng đó đúng là thứ C2b-EXT sinh ra để chặn. + +### 🔴 F2 [MAJOR] Acceptance C2b-EXT (bản siết) **KHÔNG có răng với 3 lớp ca** — tự chứng bằng cách chạy nó trên HEAD (bản TRƯỚC khi vá) + +Chạy **nguyên văn** phép (1) của ADDENDUM trên `HEAD` (git grep, tức trạng-thái tiền-vá): +``` +HEAD:.claude/auto-memory/project_h22_wal_session_continuity.md:10 ✅ bắt +HEAD:.claude/commands/tiep.md:21 ✅ bắt +HEAD:.claude/commands/tiep.md:23 ✅ bắt +HEAD:.claude/commands/tiep.md:75 ✅ bắt +HEAD:.claude/governance/.session-counter.json:4 ✅ bắt +HEAD:docs/governance/harness-11-engine.md:406 ✅ bắt +HEAD:docs/governance/harness-11-engine.md:407 ✅ bắt +=> 7 dòng. THIẾU 4 site THẬT: +``` +| Ca TRƯỢT | Vì sao trượt | +|---|---| +| `tiep.md:78` (HEAD) *"Bẩn ngoài 3 path + không phải EOL-only ⇒ NÊU"* | vế lọc thứ-2 đòi dấu-hiệu hook **CÙNG DÒNG**; dòng này không có `hook`/`WAL.md`/`agent-memory`/`workflows/runs`/`wal-flush` ⇒ **bị vứt**. Đây là site LIVE, worker phải sửa tay mới xong. | +| `session-end.md:114` + `:296` (`hook-3-path`) | regex chỉ có `3 path` (**dấu cách**). `hook-3-path` là **gạch nối** ⇒ 0 match. Cũng nằm **ngoài** ý-định "quét `.claude/commands/`"? KHÔNG — thư-mục có trong scope, chỉ **mẫu chữ** trượt. | +| `session-model-se-draft.md:13` (`persist 3-path`) + `:56` (`quét đúng 3 path`) | file **NGOÀI tập quét** của phép (1) (chỉ có commands/hooks/auto-memory/.session-counter.json/engine). Site LIVE (draft đang được cập-nhật, không phải dated-report). | +⇒ Bản siết **đúng hướng** (bỏ dương-giả `session-end.md:162`) nhưng **siết lệch trục**: nó siết bằng *co-occurrence CÙNG DÒNG* + *tập-file hẹp* + *một mẫu chữ duy nhất*, trong khi 3 lớp ca thật đều lọt. **Không vacuous** (vẫn bắt 7/11) nhưng **không đủ để làm cổng**. + +### ✅ F3 [HELD] Live-verify hook 4-path = THẬT (tự xác minh, không tin lead) +``` +$ git show --name-only --format='%H|%s|%ci' da7ee8a +da7ee8aebf458bd3aa1ba26ee48b14f3ff3872e3|wal: flush 20260722T2256|2026-07-22 22:56:10 +0700 +.claude/WAL.md +.claude/sessions/session-1/probe.md <== path thứ-4 BỊ NUỐT THẬT +.claude/workflows/runs/.../spec-apply-hub-s145-v2.md +... +``` ++ `grep -n 'paths = @' .claude/hooks/wal-flush.ps1` → **13:** (comment "GIỮ $paths Ở ĐÚNG DÒNG 13" khớp đĩa) ++ `.claude/settings.json` dùng `-File .claude/hooks/wal-flush.ps1` ⇒ body re-đọc mỗi Stop, không cần restart. Claim của lead **ĐỨNG**. + +### 🟠 F4 [MAJOR] Residue `session-1/probe.md` đã COMMIT vào repo ⇒ (a) ô-nhiễm ID-space phiên-LOGIC, (b) tín-hiệu ⑤ KÊU vĩnh-viễn cho tới khi push +- `da7ee8a` là commit THẬT trên `main`, chứa `.claude/sessions/session-1/probe.md` (vật thử nghiệm). +- Hệ-quả (a): `session-start.md` BƯỚC 0.8 định ` = max( hiện có)+1` ⇒ phiên-LOGIC THẬT đầu tiên sẽ là `session-2`, còn `session-1` là rác probe. `regex ^session-\d+$` khớp `session-1` ⇒ **nó được tính**. +- Hệ-quả (b): ⑤ = `git log --name-only origin/main..HEAD | grep -q '.claude/sessions/'` ⇒ commit `da7ee8a` chưa push ⇒ **⑤ KÊU** ở mọi `/tiep` tới khi push. Sàn-3 sẽ "HỎI LẠI ANH" vì một file probe. (Hướng hỏng an-toàn, nhưng là **báo động thường-trực do rác test**.) + + diff --git a/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/sub-reviewer-session-model.md b/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/sub-reviewer-session-model.md new file mode 100644 index 0000000..8cefc1a --- /dev/null +++ b/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/sub-reviewer-session-model.md @@ -0,0 +1,58 @@ +# VERDICT: PASS_WITH_FIXES + +Lăng-kính SESSION-MODEL (Axis C). Review spec `spec-apply-hub-s145.md` [2]§Axis-C (dòng 25-33) + acceptance [3] C1-C4 (dòng 57-60). Canonical = manifest `101e69d6` (4 khoản) + WAL S144 owner-decision (dòng 6). + +## Findings + +### Canonical-alignment = SOLID (5 verify point owner giao) +1. **Spec BÁM WAL S144, KHÔNG bám draft VC-3 stale — PASS.** Spec:26 khai thẳng "🔴 Draft VC-3 (`logic-sessions/L`) STALE — owner S144 override → hub-form `sessions/session-/`". Khớp WAL:6 ("VC-1 nhan-2-tang · K4 theo-hub `sessions/session-/` · hook noi 4-path"). Draft `session-model-se-draft.md:43` ĐÚNG là bản VC-3 stale (đề `logic-sessions/L.md`) → spec:30 yêu cầu align nó về hub-form. Chuẩn. +2. **VC-1 2-tầng BẮT BUỘC — GIỮ (spec:30, acceptance C3).** `S` (vật-lý) + `logic:L`. Cơ-chế bẫy có thật: draft:23 + session-start OR-guard (head + session-label content-addressed, "phép 7 PASS đo S137") → single-tier S=logic ⇒ session-clause khớp nhãn cũ ⇒ tick chết (+0). Design đúng. **NHƯNG teeth-gap C3 — xem MAJOR-2.** +3. **hook 4-path — spec khai pending-restart NHƯNG claim SAI. Xem MAJOR-1.** wal-flush.ps1:13 xác nhận đúng 3-path hiện tại (`WAL.md`, `agent-memory/`, `workflows/runs/`). +4. **Q4-audit-DEFER = ĐÚNG (spec:32, C4).** "chỉ build DISPLAY, KHÔNG audit-rerun giữa phiên (phá C7 non-blocking)". Khớp hub reply + WAL:44. PASS. +5. **session_ctx_kb=64 — khớp manifest default (Khoản 3 dòng 74 "vắng→64KB"). NHƯNG 0-consumer. Xem MINOR-1.** + +### MAJOR-1 [spec:28 + acceptance C2] — hook "pending-restart" claim SAI + 0 behavioral-teeth (asymmetric vs Axis A/B) +- **Bằng chứng:** `.claude/settings.json:9` = `powershell.exe -ExecutionPolicy Bypass -File .claude/hooks/wal-flush.ps1`. Invocation `-File` ⇒ powershell RE-ĐỌC body script MỖI Stop-event. Thêm `.claude/sessions/` vào `$paths` (wal-flush.ps1:13) = **body-edit** ⇒ ăn NGAY Stop kế, **KHÔNG cần restart**. Restart chỉ cần khi đổi REGISTRATION trong settings.json (script nào chạy / thêm hook-event), KHÔNG phải khi sửa body script đã-đăng-ký. Memory "hot-reload ENV-DEP #2/#3" = AGENT #2/#3, KHÔNG phải hook này. +- **Hệ quả:** (a) acceptance C2 = "wal-flush.ps1 = 4 path (grep) + khai pending-restart" = pure presence-check, KHÔNG chạy hook ⇒ pass dù hook gãy (path-string sai / loop mishandle path-4 / syntax). (b) claim "pending-restart" khiến implementer HOÃN live-verify dễ-làm-ngay. (c) Axis A & B đều có fault-inject 2-chiều; Axis C — điểm CHẠM-CƠ-CHẾ thật — lại KHÔNG có. +- **Sửa:** thay "khai pending-restart" bằng **live-verify chạy thật**: stage 1 file trong `.claude/sessions/session-N/`, chạy hook thủ-công (hoặc trigger Stop) → confirm commit `wal: flush` NUỐT file đó (lành) + confirm dir rỗng KHÔNG commit-thừa (chiều-2). Sửa/bỏ framing "ENV-dep restart" — hook -File ăn-ngay. + +### MAJOR-2 [acceptance C3] — kiểm HÌNH-DẠNG nhãn, KHÔNG kiểm HÀNH-VI tick (chưa test đúng bẫy S135) +- C3 chỉ grep nhãn = `S` + `logic:L` (2-tầng) + draft aligned. Đây là bẫy Goodhart-nhẹ: **2-tầng-label BẢO-VỆ tick CHỈ KHI `logic:L` thuần ADDITIVE và KHÔNG cơ-chế tick/counter/H24/phép-7 nào chuyển sang đọc L.** C3 không kiểm điều đó ⇒ nếu implementer lỡ để L rò vào session-clause OR-guard, nhãn VẪN 2-tầng (C3 xanh) mà tick VẪN chết — đúng cái S135 vá. +- **Sửa:** thêm teeth hành-vi: (i) grep counter/OR-guard/H24 đọc `S` KHÔNG `L` (điểm-neo đếm giữ nguyên đơn-vị vật-lý) + (ii) fault-inject: ép session-clause key theo L → tick PHẢI +0 (chứng guard có răng), key theo S → tick +1. Kiểm BEHAVIOR không chỉ SHAPE. + +### MAJOR-3 [spec:33 death-path + thiếu acceptance] — orphan-L: orphan-class MỚI, chỉ nhắc "(cần rule)", 0 acceptance close-or-defer +- Wire session-model đẻ orphan-class MỚI: `sessions/session-/` (hoặc field `logic:L`) MỞ mà KHÔNG bao giờ `_end`-đóng vì phiên-logic chết giữa chừng (cửa-sổ sập / bỏ dở). Draft:69 tự khai UNSOLVED ("L không đóng khi phiên-logic chết → cần Sàn-3 mở rộng: tệp L mồ-côi = tín hiệu mạnh thứ 5?; ghi nhận, chưa giải trong v0"). +- Spec:33 chỉ nhắc trong đường-chết "L mồ-côi khi phiên chết = drift-vector (cần rule)" — **KHÔNG có acceptance** buộc `/tiep` Sàn-3 phát-hiện folder mở. Vi phạm chính triết-lý Sàn-3 "sổ trống≠sạch" (Axis E): logic-session chết để lại folder mở, Sàn-3 không soi ⇒ `/tiep` kết luận "sạch" GIẢ. +- **Bất-đối-xứng với chính spec:** Axis D2 buộc "đóng HOẶC defer-có-lý-do documented (không im-lặng bỏ)". Orphan-L phải chịu CÙNG kỷ-luật — hiện đang lơ-lửng (death-path mention ≠ close ≠ documented-defer). +- **Sửa:** thêm acceptance "Sàn-3 mở rộng: `sessions/session-/` mở-không-`_end` = tín-hiệu-mạnh #5" HOẶC defer-có-lý-do tường-minh (vd: usage session-model ban đầu thấp + scaffold idempotent) — KHÔNG để limbo. + +### MINOR-1 [spec:27 + acceptance C1] — session_ctx_kb=64 = declarative, 0-consumer (H18 defined-but-unread) +- Verify: grep `session_ctx_kb` toàn repo → **0 code-consumer**. `scripts/nhip-no-probe.ps1:42` chỉ là COMMENT ("same discipline as declining to pick session_ctx_kb"), KHÔNG đọc làm config. Probe đọc `h24_cadence` (:72) + budget-path (:75), KHÔNG đọc session_ctx_kb. +- Không phải ghost-wire ĐỘC (kiến-trúc memory-nén VỐN em-main-manual; giống `harness_floor.rounded_up_tokens` "NOT actively subtracted by current scripts"). Set=64 THỎA manifest Khoản-3 function-floor ("có một trần HOẶC chấp-nhận default"). NHƯNG acceptance C1 = pure presence-check (key=64) = weak-teeth, và spec nên khai TƯỜNG-MINH "declarative, 0 active-consumer, em-main honor thủ-công" để tránh bẫy H18 "defined-but-unread trông-như-wired". +- **Sửa:** giữ C1 nhưng thêm 1 dòng honest "session_ctx_kb = declarative-ceiling thỏa manifest floor, chưa có script enforce (như rounded_up_tokens)". + +### MINOR-2 [acceptance C4] — per-pause context-map thiếu teeth chạy-thật +- C4 gộp "per-pause context-map" như presence-item. Spec:31 = pause.md append context-block vào `sessions/session-/`; tiep.md đọc. Teeth nên cụ-thể: chạy `/pause` 1 lần → `sessions/session-/` có block MỚI append (accumulate, KHÁC WAL overwrite); chạy `/tiep` → đọc được. Hiện chỉ "documented". + +## Acceptance-teeth-check +| Acc | Có răng? | Ghi chú | +|---|---|---| +| C1 session_ctx_kb=64 | WEAK (presence-only) | 0-consumer; thỏa manifest floor nhưng nên khai declarative (MINOR-1) | +| C2 hook 4-path | **FAIL-teeth** | presence-check + claim restart SAI; thiếu live-verify/fault-inject (MAJOR-1) | +| C3 VC-1 2-tầng | **WEAK (shape≠behavior)** | grep nhãn ≠ test tick; chưa chứng bẫy S135 (MAJOR-2) | +| C4 scaffold | PARTIAL | gitignore-verify OK (răng thật, exit-code) + regex OK; per-pause context-map + Q4-defer = "documented" (MINOR-2); THIẾU orphan-L (MAJOR-3) | + +**Đã tự-verify (không tin doc):** +- `git check-ignore -q .claude/sessions/session-1/` → exit **1** (dir) + exit **1** (file `_context.md`) ⇒ sessions/ KHÔNG bị nuốt, C4 gitignore-acceptance PASS cho SE. (`.gitignore:83 !.claude/**` re-include, 0 pattern-sau bắt sessions/). +- `wal-flush.ps1:13` = đúng 3-path hiện tại; loop per-path add+commit (thêm path-4 an-toàn về cấu-trúc). +- `settings.json:9` = hook `-File` invocation ⇒ body-edit live-ngay (bác claim restart). +- `session_ctx_kb` grep repo-wide = 0 code-consumer. + +## Risk/gap +- **Teeth-asymmetry:** Axis A/B có fault-inject 2-chiều; Axis C (2 điểm chạm-cơ-chế THẬT: hook + VC-1-tick) lại thiếu behavioral-test. Đây là nghịch-lý — axis rủi-ro-cao nhất (chạm counter + chạm hook) lại acceptance mềm nhất. +- **orphan-L (MAJOR-3):** vector drift MỚI do chính session-model đẻ ra, spec biết mà không close/defer-tường-minh. +- **Direction-of-error MAJOR-1 = CONSERVATIVE** (claim thừa cẩn-thận, không gây false "chạy được") ⇒ không phải lỗi-nguy-hiểm nhưng LÀM MẤT một live-verify rẻ + weaken C2 thành presence-check. +- Canonical-fidelity: **KHÔNG có mismatch** với WAL S144 / manifest 101e69d6 — 5/5 verify-point owner giao đều đúng hướng; vấn đề nằm ở ĐỘ-CHẶT acceptance, không ở nội-dung quyết-định. + +## Verdict rationale +Design canonical-đúng + bám WAL S144 chuẩn + Q4-defer đúng + gitignore verified-clean ⇒ KHÔNG FAIL. Nhưng 3 MAJOR teeth-gap (C2 restart-claim+no-live-verify · C3 shape≠tick-behavior · orphan-L limbo) phải vá TRƯỚC implement để acceptance falsifiable thật ⇒ **PASS_WITH_FIXES**. diff --git a/.gitignore b/.gitignore index caf1190..1a95293 100644 --- a/.gitignore +++ b/.gitignore @@ -123,3 +123,9 @@ backups/ # Pattern AFTER the !.claude/** negation -> last-match-wins ignores these state files. .claude/agent-memory/.mfe-state.json .claude/agent-memory/.archive-strikes.json + +# [S146] Scheduled-tasks LOCK file — runtime mutex, machine-local, NOT source. +# Bat @S146: no KHONG duoc ignore nen bat ky `git add -A` nao cung nuot no vao commit +# (lock file trong git = nhieu + de xung dot giua may). Hook wal-flush.ps1 khong cham +# (ngoai 4 path co dinh) nhung closeout `add -A` thi co. Pattern AFTER !.claude/** -> last-match-wins. +.claude/scheduled_tasks.lock diff --git a/CLAUDE.md b/CLAUDE.md index 415a0fd..b99e528 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -20,6 +20,13 @@ Kiến trúc: **.NET 10 Clean Architecture + 2 React FE (admin + user) + SQL Ser > ⛓️ **Mạch việc dở (H22):** nằm ở `.claude/WAL.md`; nối lại DUY-NHẤT bằng `/tiep` — kể cả khi anh gõ "làm tiếp" bằng text thường. Không tự recovery cách khác. (Chốt dừng chủ-động = `/pause`; cơ-chế → `docs/governance/harness-11-engine.md` PHẦN N.) +> 🎛️ **Chế-độ đang hiệu-lực (operating-posture) — TRA Ở ĐÂU** *(adap đợt-11, `3-khoan:31-41` discoverability-home ⟂ implement-home)*: +> file này **CỐ Ý KHÔNG chép giá-trị** ON/OFF — chép là sai ngay lượt sau khi anh toggle. Chỉ trỏ **nơi tra**: +> - **HMW-mode** (fan-out Workflow) → marker `.claude/hmw-mode.on`; `/session-start` BƯỚC 0.5 in trạng-thái mỗi phiên. Bật/tắt: `/ultra-on` · `/ultra-off`. +> - **Engine-đắt** (`/fable-real` · `/fable-clone`) → **per-invocation, KHÔNG persist** (H21) — không có mode để tra, chỉ sống trong lượt anh gõ. +> - **Lead model** → `~/.claude/settings.json` (**global, NGOÀI git** — grep trong repo sẽ ra 0 hit); probe runtime mỗi phiên ở BƯỚC 0.6. +> - **Nhịp H24 / ngân-sách memory** → `.claude/agent-memory/memory-budget.json` (single-source; doc **trỏ key, không chép số**). + ## ⚡ Quick Rules ### Backend — `.NET 10` Clean Architecture diff --git a/broadcasts/_index.md b/broadcasts/_index.md index 90f335a..59dd5c0 100644 --- a/broadcasts/_index.md +++ b/broadcasts/_index.md @@ -55,6 +55,8 @@ | 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 | ✓ | ## 📤 OUTBOUND (gửi — qua `/send-email `) | sent (ISO) | id | from → to | folder | sha256(12) | @@ -102,5 +104,6 @@ | 2026-07-18 | 2026-07-18-se-to-ai_infra-nam-vong-dong-va-xin-mau-session-model | se → ai_infra | outbox/ai_infra | b9ef5ede5679 | | 2026-07-22 | 2026-07-22-se-to-ai_infra-bao-nac-wave-dot-9-10 | se → ai_infra | outbox/ai_infra | 6c94873f72e0 | | 2026-07-22 | 2026-07-22-se-to-ai_infra-errata-bao-nac-wave-dot-9-10 (errata-of ↑) | se → ai_infra | outbox/ai_infra | e43484cef10f | +| 2026-07-22 | 2026-07-22-se-to-ai_infra-adap11-hoi-c7-va-bulk-note-shards | se → ai_infra | outbox/ai_infra | 9f783be8e18a | > 🔴 **Reconcile S123 (2026-07-15):** 2 row đầu (`…wave-report` · `…r6-user-memory…`) là **email S122 Đà GỬI nhưng CHƯA từng được log** — `_index` có **0 row** cho ngày 07-15 trong khi `outbox/ai_infra/` có **3 file**. S122 chạy tới bước 6c (selftest-stamp PASS cả 2, đã ghi trong closeout) rồi **bỏ bước 7**. Phát hiện tình cờ khi S123 đọc `_index` để append row thứ 3. Hash lấy **từ chính frontmatter file trên đĩa**, không tính lại — 2 email đó đã đóng băng (đã gửi). ⚠️ **Bài:** `_index` là sổ mà hub/audit đọc; email gửi mà không log = **hub không biết có nó**. Bước 7 nên là một phần của cùng một lượt với 6c, đừng để tách. diff --git a/broadcasts/inbox/2026-07-18-Governance-spawn-label-panel-audit-khung.md b/broadcasts/inbox/2026-07-18-Governance-spawn-label-panel-audit-khung.md new file mode 100644 index 0000000..1206c49 --- /dev/null +++ b/broadcasts/inbox/2026-07-18-Governance-spawn-label-panel-audit-khung.md @@ -0,0 +1,51 @@ +--- +id: 2026-07-18-Governance-spawn-label-panel-audit-khung +from: ai_infra +to: all-fit +targets: all-fit +category: Governance +type: new +date: 2026-07-18 +supersedes: null +re: "Khung đặt nhãn (label) cho mọi tác-vụ nền / lần gọi sub-agent: 4 thành-phần {nhóm-hoặc-vòng · vai · pha-hoặc-wave · mã-phiên} + vừa-khung-panel, để owner audit bảng Background-tasks bằng mắt không cần mở transcript. Mẫu gốc từ một dự-án sister (VIPIX) — hub chuẩn-hoá thành khung sàn; hình-thức mỗi dự-án tự quyết." +status: "PUBLISHED s105 (2026-07-18) — anh-lệnh trực-tiếp · gate PASS-W-FIXES folded · stamp exit-0 · sister pull /adap-apply." +content_sha256: "6cbded684636dda7f51c945bb381f90d73d4907088014aa04ceb851e10b3eae6" +reviewer_gate: "PASS-W-FIXES (gate-sub s105 2026-07-18 — 1-MAJOR exemplar-thiếu-pha + 3-MINOR Đà fold · falsify 3-claim: 1-BROKE-fixed · 2-HELD)" +--- + +# Khung nhãn spawn/tác-vụ nền — để owner audit panel bằng mắt + +> 🎯 **Một dòng tóm:** từ nay mỗi lần gọi sub-agent hoặc tác-vụ nền, phần mô-tả (label hiện trên bảng Background-tasks) phải tự nói đủ **nó là ai, làm gì, thuộc nhịp nào, phiên nào** — owner liếc panel là nắm, không phải mở transcript. + +Chào các dự án. Owner khi audit thường nhìn **bảng Background-tasks** trước tiên. Nếu label chỉ là mô-tả tự do ("audit tài liệu", "kiểm tra memory"...), owner phải mở từng transcript mới biết con nào thuộc nhịp nào. Một dự-án sister (**VIPIX — credit mẫu gốc**) đã tự đặt label theo dạng rất gọn, ví dụ `Vòng-2 lead-stale @start s125` (bên cạnh dạng gọn hơn nữa như `Vòng-3 harness-audit s125` — hub chuẩn-hoá sàn = đủ 4 thành-phần như khoản ① dưới) — owner xác nhận trực tiếp: *"như thế này tao dễ audit hơn rất nhiều"* — và yêu cầu hub chuẩn-hoá cho cả đội. Bản này là khung đó. + +## 1. Khung sàn (function-floor — 4 khoản bắt buộc) + +1. **Đủ 4 thành-phần trong label:** `{nhóm-hoặc-vòng} {vai} {pha-hoặc-wave} {mã-phiên}`. Ví dụ dạng: `Vòng-3 w1 @start s`. Thiếu thành-phần nào owner phải đoán thành-phần đó. +2. **Vừa khung panel:** giữ label ngắn (khoảng ≤40 ký tự) để panel không cắt chữ. Ưu tiên bỏ từ thừa, KHÔNG bỏ 4 thành-phần; tên-vai dài mà hai khoản xung-đột thì khoản ① thắng khoản ② (chấp nhận vượt ~40 một chút hơn là bỏ thành-phần). +3. **Một khuôn nhất quán trong toàn dự-án:** owner học khuôn 1 lần rồi đọc được mọi task. Không trộn nhiều kiểu trong cùng repo. +4. **Phủ MỌI loại spawn:** nhịp tự-bảo-trì 2 đầu phiên, việc thường giao sub, cổng review trước khi phát, và task bên trong workflow — không loại nào được để label trống/mô-tả tự do. + +## 2. Hình-thức tự quyết (mỗi dự-án) + +- **Tiếng:** Việt hay Anh tuỳ dự-án. +- **Tên nhóm:** dự-án đã adopt khung 5-vòng tự-bảo-trì thì map thẳng {Vòng-1 tooling/harvest · Vòng-2 lead-stale/gap · Vòng-3 đo→đề-xuất→kiểm (kèm w1/w2/w3) · Vòng-4 nén-ngủ · Vòng-5 truth-floor}; chưa adopt thì tự phân loại theo roster của mình — miễn khoản ③ (nhất quán) giữ. +- **Tiền-tố phụ** cho loại ngoài vòng: ví dụ `Core` (sub việc-chính) · `Gate` (review trước phát) · `WF` (workflow-task) · `Obs` (chạy lại/bổ-sung trong cùng phiên) — đặt tên khác cũng được, miễn nhất quán. + +## 3. Ví dụ hub đang chạy (dogfood thật) + +| Label trên panel | Đọc ra | +|---|---| +| `Vòng-3 harness-refine w2 @start s105` | vòng-3 memory, vai đề-xuất, wave-2, đầu phiên s105 | +| `Vòng-3 harness-audit w3 @start s105` | vòng-3, vai kiểm, wave-3 (cuối), đầu phiên s105 | +| `Gate reviewer label-broadcast s105` | cổng review cho bản phát này, phiên s105 | + +Khai thật: hub áp khuôn từ **giữa phiên phát hành** (các spawn trước thời-điểm owner chốt trong cùng phiên vẫn mang label cũ — giữ làm vết, không sửa lùi). Bảng trên mới phủ 2 loại (nhịp tự-bảo-trì + cổng review); loại việc-thường và workflow-task áp từ spawn kế tiếp. + +## 4. Kiểm nhanh (falsifier chạy được) + +Mở bảng Background-tasks → chọn ngẫu nhiên 3 task đang/vừa chạy → **chỉ đọc label**, nói được {ai · làm gì · thuộc nhịp nào · phiên nào}. Nói được cả 3 = ĐẠT khoản ①③; có label nào bị panel cắt chữ = TRƯỢT khoản ②; có task nào label tự do ngoài khuôn = TRƯỢT khoản ④. + +## 5. Nấc adopt + +Pull bản này bằng quy trình thường (`/adap-apply`), áp từ phiên kế, tự báo nấc per-khoản (sent→ACK→agreed→executed→verified) trong report-back định kỳ. Không cần re-verify gì ngoài chính panel của bạn (khoản 4 ở trên là phép kiểm tại chỗ). diff --git a/broadcasts/inbox/2026-07-19-Agent-ensemble-cost-lens-khan-hiem-va-routing.md b/broadcasts/inbox/2026-07-19-Agent-ensemble-cost-lens-khan-hiem-va-routing.md new file mode 100644 index 0000000..480ab42 --- /dev/null +++ b/broadcasts/inbox/2026-07-19-Agent-ensemble-cost-lens-khan-hiem-va-routing.md @@ -0,0 +1,50 @@ +--- +id: 2026-07-19-Agent-ensemble-cost-lens-khan-hiem-va-routing +from: ai_infra +to: all-fit +targets: all-fit +category: Agent +type: update +date: 2026-07-19 +supersedes: null +re: "Điều-chỉnh CÁCH ĐỌC bản số-đo phát chiều nay (owner hub duyệt số xong chốt thêm): ① so-sánh cost thật-vs-ảo phải đọc theo ĐƠN-VỊ KHAN-HIẾM của nhà bạn (quota model-hạng-nhất bị trần + giá ×2) chứ không phải token-thô — '10× token hạng-hai' cho việc-fix có thể là đánh-đổi ĐÚNG; ② heuristic routing owner hub đang dùng: việc MỚI → chế-độ thật, FIX cái đã tồn-tại → model ảo trần; ③ pattern phối-hợp mềm: lead suggest 1-dòng non-blocking rồi chạy, owner đọc thấy chỉnh nếu muốn — không codify cứng thành auto-route. Cả 3 = owner-side chia-sẻ, KHÔNG floor." +status: "PUBLISHED (2026-07-19) — delta-đọc chồng bản số-đo cùng ngày · owner-chốt verbal sau khi duyệt số · sister pull /adap-apply (FYI, không bắt làm gì)." +content_sha256: "0a03b2c83fb9a04d2c45b274886d5397af04079e4e407f5b59750d55f38c3389" +reviewer_gate: "broadcast-gate PASS-W-FIXES folded (0C/0M/8m — G-014 machine-grep CLEAN cả frontmatter · fidelity owner-verbatim 3-khoản HELD · 'số KHÔNG đổi' verified từng-số · no-floor 5-disclaimer HELD · falsify-8 {5-HELD · 3-PARTIAL-folded: cực-2-nêu-đủ + refine-khai + n=1-soften})" +--- + +# Đọc lại bản số-đo: trục cost đúng là đơn-vị KHAN-HIẾM + routing mềm thật-vs-ảo + +> 🎯 **Một dòng tóm:** bản số-đo chiều nay kết "thật thắng hiệu-quả/token" — owner hub duyệt số xong chỉnh lại CÁCH ĐỌC: token-thô không phải trục quyết-định; trục đúng là **đơn-vị khan-hiếm của nhà bạn** (quota hạng-nhất bị trần + đắt ×2). Kèm heuristic routing owner đang dùng + pattern suggest-mềm giữ tự-chủ owner. + +Chào các dự án. Bản này là `type:update` NHỎ chồng **bản số-đo cùng ngày** (`2026-07-19-Agent-ensemble-depth-cost-update-so-do-thuc` · sha `294be326` — per-lượt ~114 nghìn, 10 lượt ≈ 10-11×) — số KHÔNG đổi; đổi là **lens đọc số** + 2 mảnh vận-hành owner hub vừa chốt sau khi xem kết-quả. Đây là **refine (không thay)** câu kết của bản số *"thật = mặc-định cho phán-quyết hệ-trọng"*: qua lens khan-hiếm, "thật" thành **suất-để-dành** → default thực-dụng đẩy việc-fix về ảo, suất thật dành cho việc xứng nó. Cả 3 khoản = chia-sẻ cách-làm, **KHÔNG floor mới**. + +## 1. Trục cost đúng = đơn-vị KHAN-HIẾM, không phải token-thô + +Bản số kết "chế-độ thật thắng rõ hiệu-quả/token" — đúng theo trục token, nhưng owner hub chỉ ra trục đó KHÔNG phải trục quyết-định của nhà mình: **model-hạng-nhất bị trần quota (~50%) và giá token gấp đôi (tiêu-thụ thực-tế đôi khi cũng gấp đôi)** — tức đơn-vị khan-hiếm thật là *suất hạng-nhất*, còn token hạng-hai tương-đối dồi-dào. + +Đọc theo trục đó: **đốt 10× token hạng-hai cho việc-fix để DÀNH suất hạng-nhất cho việc xứng nó = đánh-đổi ĐÚNG**, không phải "chịu đắt 10×". + +**Bài học chuyển được:** bảng cost của bạn nên có thêm cột *"đốt đơn-vị NÀO"* bên cạnh *"bao nhiêu"* — hai chế-độ cùng làm một việc nhưng tiêu hai loại tiền khác nhau; rẻ theo trục này có thể đắt theo trục kia. Trần/giá cụ-thể mỗi nhà tự điền theo subscription của mình. + +## 2. Heuristic routing owner hub đang dùng (form tự quyết) + +Owner hub chốt sau khi xem đấu tay-đôi (diễn-đạt theo vocab kênh, không phải trích nguyên văn): **việc mới để chế-độ thật · fix cái cũ để model ảo.** + +- **Việc MỚI** (thiết-kế, kết-tinh cách làm — chưa có nguồn tồn-tại để đào) → **chế-độ thật** (1 con hạng-nhất): trong lần đo n=1, bên thật bắt trọn lớp *lỗ-ngữ-nghĩa thiết-kế* (lời-hứa-doc ↔ hành-vi-code) mà bên ảo miss. +- **FIX / audit cái Đà tồn-tại** (có code/artifact để đào) → **model ảo trần** (ensemble + tầng-2): cùng lần đo, bên ảo bắt trọn lớp *đào-trên-cái-tồn-tại* (lật fix bằng invariant, giết phát-hiện giả, bắt degrade runtime) mà bên thật miss. + +Khớp tự-nhiên với dữ-kiện n=1 của bản số (mỗi bên độc-quyền đúng lớp đó). Là heuristic khởi-điểm, **không phải luật** — chính owner hub dặn *"đôi khi tao đánh giá sai"* → cần lớp mềm ở khoản 3. + +## 3. Pattern phối-hợp mềm: suggest 1-dòng, không codify cứng + +Owner hub thử cả 2 cực trong cùng ngày rồi chốt ở giữa: +- **Cực 1 — nén CỨNG heuristic thành rule máy** (lead auto-route theo new/fix) → owner RÚT: mất tự-chủ, và đóng cửa việc lead bắt case heuristic sai. +- **Cực 2 — tự-chủ hoàn-toàn, lead im** (owner tự nhớ + tự chọn mọi lần, lead không nói gì) → owner cũng không chọn nốt: *"đôi khi tao đánh giá sai"* — cần con mắt thứ hai. +- **Chốt giữa:** lệnh gõ đích-danh của owner = kênh cứng (thực thi, không bàn); còn khi owner giao việc không chỉ-định chế-độ → lead đánh giá + **suggest đúng 1 dòng non-blocking** (*"việc này ảo/thật làm tốt hơn — vì …"*) **rồi chạy luôn** — owner đọc thấy, muốn thì chỉnh, không ai treo chờ ai. + +**Vì sao đáng chuyển:** giữ được cả 3 thứ cùng lúc — tốc-độ (không blocking), tự-chủ owner (mọi lựa chọn hiện ra chữ, override được bằng 1 lệnh), và lưới bắt-sai 2 chiều (lead được phép lệch heuristic khi case cụ-thể cho thấy khác). Mọi tri-thức vận-hành dạng "thường thì X" nên sống ở tầng suggest-mềm này thay vì rule máy — trừ khi owner chủ-động nâng nó thành floor. + +## 4. Nấc adopt + +FYI owner-side — KHÔNG floor, không bắt làm gì. Nhà nào có 2 chế-độ thật/ảo: đối-chiếu bảng cost theo khoản ① (thêm cột "đốt đơn-vị nào") + tham-khảo heuristic ②. **Khoản ③ áp được cho MỌI nhà** (kể cả 1-chế-độ): pattern suggest-1-dòng-non-blocking dùng cho bất-kỳ lựa-chọn vận-hành nào lead làm thay owner được nhưng owner muốn giữ mắt nhìn. Owner mỗi nhà tự chốt form. Pull `/adap-apply`, báo nấc thường-lệ. diff --git a/broadcasts/inbox/2026-07-19-Agent-ensemble-depth-axis-deepen-on-contested.md b/broadcasts/inbox/2026-07-19-Agent-ensemble-depth-axis-deepen-on-contested.md new file mode 100644 index 0000000..6ea3d84 --- /dev/null +++ b/broadcasts/inbox/2026-07-19-Agent-ensemble-depth-axis-deepen-on-contested.md @@ -0,0 +1,59 @@ +--- +id: 2026-07-19-Agent-ensemble-depth-axis-deepen-on-contested +from: ai_infra +to: all-fit +targets: all-fit +category: Agent +type: update +date: 2026-07-19 +supersedes: null +re: "Bổ trục CHIỀU SÂU cho ensemble đa-lăng-kính (owner-lệnh 19-07): ensemble trước đây chỉ đi chiều RỘNG (N góc nhìn 1 lượt) — thêm được trục SÂU trực-giao kiểu 'đào-vào-điểm-tranh-cãi': sau khi các góc đề-xuất + 1 lượt thử-phá, cho k worker TƯƠI đào tầng-2 CHỈ vào điểm nóng (bị phá / bỏ sót / mâu-thuẫn) rồi thử-phá lần 2; bằng-chứng tầng-2 đè đồng-thuận tầng-1. AI_INFRA chọn mặc-định TRẦN (sâu+rộng nhất) + dial-down theo chủ-đề + lệnh MAX; escape về chiều-rộng luôn còn. Khung sàn 4 khoản dưới; posture default + hình-thức mỗi dự-án tự quyết." +status: "PUBLISHED (2026-07-19) — owner-lệnh broadcast điều-chỉnh · máy-verify 49/49 + rà-soát-độc-lập folded · runtime-dogfood đang tiến-hành (số-cost thực-đo cập-nhật bản update sau) · sister pull /adap-apply." +content_sha256: "f05eba5b8e8c5ac733bc1f8038b07ea9d365723b1fb6832362fb0683fd883199" +reviewer_gate: "broadcast-gate PASS-W-FIXES folded (leak-strip body+frontmatter · base-cite 2026-07-03 · honest-caveat · fidelity 6-claim vs source HELD · falsify 6/6) + impl gate PASS-W-FIXES · máy-verify 49/49." +--- + +# Ensemble đa-lăng-kính: thêm trục CHIỀU SÂU (đào-vào-điểm-tranh-cãi) + +> 🎯 **Một dòng tóm:** ensemble đa-lăng-kính giỏi quét RỘNG (nhiều góc nhìn 1 lượt) nhưng không đào SÂU — khi các góc cãi nhau hoặc lượt thử-phá phá được 1 điểm, không ai đào tiếp. Bổ **trục sâu trực-giao**: cho k worker TƯƠI đào tầng-2 CHỈ vào điểm nóng, bằng-chứng tầng-2 ĐÈ đồng-thuận tầng-1. AI_INFRA chọn **mặc-định TRẦN (sâu+rộng nhất) + dial-down theo chủ-đề + lệnh MAX khoá trần**; **tắt trục sâu tường-minh = về chiều-rộng** (escape an-toàn luôn còn). Dự-án khác tự chọn posture. + +Chào các dự án. Bản này là `type:update` **nối bản ensemble "model ảo" đã phát trước (2026-07-03)** — thêm TRỤC SÂU cho chính cơ-chế ensemble đó (thuật-ngữ: "model ảo" = ensemble đa-lăng-kính nói ở đây). Áp cho dự-án nào có **ensemble đa-agent / đa-lăng-kính** (nhiều model/nhiều góc nhìn chạy song song rồi tổng-hợp). Không có ensemble → FYI, chưa cần áp. + +## 1. Vấn đề — ensemble chỉ có 1 trục (chiều rộng) + +Ensemble kiểu "N lăng-kính 1 lượt" (mỗi con 1 góc: nguyên-lý-nền / đảo-ngược / thực-dụng…) → tổng-hợp: **quét rộng tốt**, nhưng đơn-trục. Khi 2 đề-xuất mâu-thuẫn, hoặc con thử-phá phá được 1 điểm hội-tụ, **không có bước đào tiếp điểm đó** — kết-luận dừng ở tầng-1 dù điểm nóng chưa được truy tới nguồn. + +## 2. Cách đóng — trục sâu "đào-vào-điểm-tranh-cãi" (DEEPEN-ON-CONTESTED) + +Thêm 2 bước SAU lượt propose + thử-phá (KHÔNG đụng lượt cũ): +- **Đào (Deepen):** k worker **TƯƠI** (chưa đọc gì) đào tầng-2 CHỈ vào **điểm NÓNG** — cái bị-phá, góc bỏ-sót, chỗ các đề-xuất mâu-thuẫn. 3 lăng-kính đào: **truy-bằng-chứng** (chase tới nguồn sơ-cấp) · **mô-hình-đối** (dựng giải-thích khác) · **săn-ca-biên** (input làm kết-luận gãy). +- **Thử-phá-2:** phá tiếp phát-hiện tầng-2 (cùng khuôn lượt thử-phá cũ). +- **Tổng-hợp depth-aware:** bằng-chứng tầng-2 REFUTE-kèm-evidence **ĐÈ** đồng-thuận tầng-1. Ngược lại tầng-2 chỉ nhắc-lại tầng-1 (0 phát-hiện mới) → coi như 0 tín-hiệu, GIỮ tầng-1. + +**3 quyết-định thiết-kế then-chốt (vì sao làm thế):** +1. **Posture default tự-chọn** — AI_INFRA chọn mặc-định TRẦN (sâu+rộng nhất) + dial-down theo chủ-đề + lệnh MAX khoá trần; **tắt trục sâu tường-minh = về chiều-rộng**, behavior-identical bản cũ (escape an-toàn LUÔN còn). Dự-án e-ngại cost → chọn opt-in-off. Điểm sàn: phải CÓ escape về chiều-rộng, không khoá cứng. +2. **Tuyến-tính, KHÔNG nhiều-vòng** — thêm k+1 lượt tuyến-tính, KHÔNG ping-pong nhiều vòng (vòng 2-3 bão-hoà + trôi-đề + phá mất tính độc-lập của các lăng-kính). +3. **Chống-mỏ-neo** — worker đào bị dặn *"tầng-1 là VẬT-LIỆU không phải đáp-án; đồng-ý-lại = 0 điểm"* + *"lời thử-phá cũng là vật-liệu, kiểm cả nó"*. Đây chống đúng bệnh chính của debate nhiều-vòng: a-dua theo đồng-thuận. + +## 3. Khung sàn (function-floor — 4 khoản) + +1. **Trục sâu = owner-gated, posture tự-chọn**: mỗi dự-án chọn default (AI_INFRA = trần + dial-down + MAX; hoặc opt-in-off); **tắt-trục-sâu = escape về chiều-rộng LUÔN còn** (không khoá cứng); clamp trần cứng (vd ≤3) + assert tổng-lượt ≤ trần. +2. **Đào-vào-điểm-tranh-cãi, KHÔNG đào-tất**: worker tầng-2 nhắm điểm nóng (bị-phá/bỏ-sót/mâu-thuẫn) + nhận lời-thử-phá làm bản-đồ, KHÔNG tổng-hợp (không có đồng-thuận để nịnh). +3. **Chống-mỏ-neo tường-minh**: worker tầng-2 = con TƯƠI, prompt-floor "đồng-ý-lại=0-điểm"; tầng-2 REFUTE-có-evidence đè tầng-1, tầng-2-paraphrase = 0-tín-hiệu. +4. **Cận-ngân-sách LOUD**: vượt ngân-sách trước bước đào → BỎ đào + báo RÕ (không văng lỗi, không lặng-thầm bỏ), trả kết-quả chiều-rộng. + +## 4. Hình-thức tự quyết + +Số worker đào, tên 3 lăng-kính, cách nhắm điểm-nóng, có cấp quyền đọc-file cho worker đào hay chỉ-pack — mỗi dự-án tự quyết theo engine mình. Không có ensemble → khoản này chưa áp; có ensemble đơn-trục → 4 khoản trên là sàn đáng thêm trục sâu. + +## 5. Kiểm nhanh (falsifier chạy được) + +Ensemble của bạn: *"khi 2 đề-xuất mâu-thuẫn hoặc con thử-phá phá được 1 điểm — có bước nào cho con TƯƠI đào tiếp CHÍNH điểm đó không, hay kết-luận dừng ở tầng-1?"* Không có = còn hở trục sâu. Và: *"nếu có bước đào — con đào bị chặn a-dua tầng-1 thế nào?"* Không trả lời được = trục sâu thiếu chống-mỏ-neo (dễ thành lặp-lại tốn token). + +## 6. Nấc adopt + +Pull bằng quy trình thường (`/adap-apply`), tự báo nấc trong report-back định kỳ. **Posture default (trần+dial-down HAY opt-in-off) mỗi dự-án tự chọn** — điểm sàn adopt = có trục sâu **bật-được** + có **escape width-only** (không khoá cứng), KHÔNG bắt buộc default nào. + +--- + +> ⚠️ **Trạng-thái trung-thực (đọc trước khi adopt):** engine ensemble tham-chiếu của hub đã **SHIPPED + máy-verify** (behavior-identical khi tắt trục sâu · falsify-coupling · clamp trần · telemetry) + **đã qua rà-soát độc-lập ở hub**. Phần chứng-minh runtime *"đào có bắt được cái chiều-rộng bỏ sót không"* (differential có-kiểm-soát) + hiệu-chỉnh bảng-cost thực-đo **đang tiến-hành** (dogfood owner-gated). Nói thẳng: **PATTERN + code đã chín để bạn đọc/áp; số-cost-thực-đo sẽ ra ở bản `update` sau.** Bạn adopt principle được ngay; nếu muốn calibrate cost bên mình thì chờ số-đo thực (hub sẽ phát delta). diff --git a/broadcasts/inbox/2026-07-19-Agent-ensemble-depth-cost-update-so-do-thuc.md b/broadcasts/inbox/2026-07-19-Agent-ensemble-depth-cost-update-so-do-thuc.md new file mode 100644 index 0000000..eca23b7 --- /dev/null +++ b/broadcasts/inbox/2026-07-19-Agent-ensemble-depth-cost-update-so-do-thuc.md @@ -0,0 +1,63 @@ +--- +id: 2026-07-19-Agent-ensemble-depth-cost-update-so-do-thuc +from: ai_infra +to: all-fit +targets: all-fit +category: Agent +type: update +date: 2026-07-19 +supersedes: null +re: "Số-đo THỰC cho trục chiều-sâu ensemble (trả nợ bản sáng nay 'số-cost sẽ ra ở bản update sau'): lần chạy trọn đầu tiên đo được — chi-phí mỗi-lượt của 'model ảo' NGANG một phát 'chế-độ thật' (~114 nghìn token/lượt), ensemble trả tiền theo SỐ LƯỢT (trần 10 lượt ≈ 10× một phát thật, ~11× tính cả lượt tổng-hợp); số phải khai 2 đơn-vị (tổng vào+ra vs phía-ra theo bộ-đếm runtime) — hai số lệch nhau 2.4×, và ước-lượng cũ của hub trộn đơn-vị nên thấp ~3×. Kèm: đấu tay-đôi thật-vs-ảo cùng đề (n=1) → 2 chế-độ BÙ nhau không thay nhau; 9 chỗ vá hardening lộ ra từ chính lần đo, có bài học chuyển được." +status: "PUBLISHED (2026-07-19) — dogfood-run trọn đầu tiên (owner-authorized) · số n=1 khai rõ class-task · sister pull /adap-apply (FYI-số + bài-học, KHÔNG floor mới)." +content_sha256: "294be326cb5bd5b2d837f394a868a096e3b4c91420e7df27e9c1af9d50cefb9e" +reviewer_gate: "broadcast-gate PASS-W-FIXES folded (fidelity-số: MỌI phép cộng reviewer tự cộng lại = EXACT {tổng-stage 467,524 · tổng-10-lượt 1,143,775 · 41.5% · 10.02×} · G-014 0-hit · falsify-8 {6-HELD · 2-PARTIAL-folded} · M-1 nhãn-đơn-vị resolve bằng contract-citation runtime)" +--- + +# Trục chiều-sâu ensemble: số-đo thực + đấu tay-đôi thật-vs-ảo (bản update đã hứa) + +> 🎯 **Một dòng tóm:** đã chạy trọn trục sâu lần đầu và ĐO: mỗi-lượt của "model ảo" tốn NGANG một phát "chế-độ thật" (~114 nghìn token/lượt, vào+ra) — ensemble không rẻ hơn per-lượt, nó trả tiền theo **số lượt** (trần 10 lượt ≈ 10× một phát thật). Và đấu tay-đôi cùng đề cho thấy 2 chế-độ **bù nhau**: mỗi bên bắt được lỗi bên kia miss. + +Chào các dự án. Bản này là `type:update` **trả nợ số** cho bản trục-chiều-sâu phát sáng nay (đã khai "số-cost thực-đo sẽ ra ở bản update sau") — giữ đúng lời: đây là số đo, không phải ước. Không floor mới; FYI-số + bài học. + +## 1. Số đo (lần chạy trọn đầu — n=1, khai rõ) + +Đề: audit sâu một engine ~430 dòng code có nguồn đọc được (verdict-mode). Cấu-hình trần: 5-góc + thử-phá + 3-đào-tầng-2 + thử-phá-2 = **10 lượt**. + +| Phép đo | Giá trị | +|---|---| +| **Tổng (vào+ra)** — con số burn thật | **~1.14 triệu token** (+ lượt tổng-hợp ~129 nghìn — tính cả nó: ~11× một phát thật) | +| **Phía-ra** (bộ-đếm trong-script của runtime — contract định-nghĩa: *token đầu-ra*) | **467.5 nghìn** {đề-xuất 207.9 · thử-phá 65.7 · đào 145.1 · thử-phá-2 48.8 — cộng KHỚP CHÍNH XÁC} | +| **Per-lượt (vào+ra)** | **~114 nghìn/lượt trung-bình** (dải thật 76–143 nghìn — lượt-đào đắt hơn lượt-đề-xuất ~25%) — trung-bình đúng bằng 1 phát "chế-độ thật" cùng đề (114.1 nghìn) | +| Lớp-đào chiếm | 194 nghìn phía-ra = 41.5% run | + +> Provenance khai thẳng: phía "ảo" có raw-artifact đầy-đủ (JSON per-lượt); phía "thật" + lượt tổng-hợp = số từ sổ-harvest của hub (không có artifact đối-xứng) — bất-đối-xứng này là một phần lý-do đọc §2 như n=1. + +**3 bài học số:** +1. **Khai 2 đơn-vị hoặc sai 3×.** Ước-lượng cũ "~395 nghìn" gần đúng ở lens phía-ra (467.5) nhưng thấp **2.9×** so tổng vào+ra (1.14M) — trộn 2 đơn-vị là nguồn sai chính. Mọi bảng cost nên ghi rõ đơn-vị nào. +2. **Ensemble trả tiền theo SỐ LƯỢT, không rẻ per-lượt.** Per-lượt ảo ≈ per-lượt thật → chọn ảo/thật là chọn *cấu-trúc* (nhiều-góc + tầng-2 + tự-phá) chứ không phải chọn giá-đơn-vị. +3. **Cost scale theo kích-thước đề** — số trên là 1 class-task (code-audit có nguồn); đề to hơn = đắt hơn tuyến-tính theo pack. + +## 2. Đấu tay-đôi thật-vs-ảo cùng đề (n=1 — đọc như dữ-kiện đầu, không phải kết-luận đóng) + +Cùng đề audit, chạy song song 1 phát **chế-độ thật** (114 nghìn) vs **model ảo trần 10-lượt** (1.14M): + +- **Hiệu-quả/token: thật THẮNG rõ** — cùng cỡ ~5 lỗi-nặng thật, giá 1/10; và bắt được lỗi *chủ-sở-hữu-critical nhất* (lệnh ép-full-power của owner bị máy tự hạ được — lỗ ngữ-nghĩa giữa lời-hứa-doc và hành-vi-code) mà cả 10 lượt ảo miss. +- **Chiều-sâu tuyệt-đối: ảo+tầng-2 bắt 4 lỗi độc-quyền** — quý nhất: tầng-2 **lật chính fix của vòng-1** (fix đề-xuất vi-phạm invariant của đúng file nó định sửa) và lớp thử-phá-2 **giết 5 phát-hiện giả** do floor "đồng-ý-lại=0-điểm" ép ra — tức cơ-chế chống-mỏ-neo vừa HOẠT-ĐỘNG vừa TỰ ĐẺ noise cần lưới riêng. +- **Kết thực-dụng:** 2 chế-độ **bù nhau, không thay nhau** — 9 lỗi gộp không bên nào một mình bắt đủ. Gợi-ý dùng: thật = mặc-định cho phán-quyết hệ-trọng (mạnh nhất/token); ảo-trần = khi cần đào chéo + tự-sửa-sai trên artifact lớn có nguồn, chấp-nhận ≈10× phần ensemble (~11× tính cả lượt tổng-hợp). + +## 3. 9 chỗ vá lộ ra từ chính lần đo (bài học chuyển được) + +Lần chạy thật đầu tiên lộ 9 defect mà bộ test thuần-logic + 2 lượt rà-soát trước đó đều mù (lớp runtime-degradation + cross-file). 4 bài đáng chuyển: + +1. **Lệnh ép-full-power của owner phải khoá cả chiều MÁY.** "Không được hạ" mà chỉ cấm người, còn cổng-ngân-sách tự hạ được = máy đè lệnh owner. Vá: chế-độ ép-trần bypass cổng + log to (owner chịu cost chủ-động). +2. **"Thử-rồi-chết" ≠ "chạy-rồi-sạch".** Tầng-2 spawn mà 0 worker sống, nếu không có trạng-thái riêng, tầng tổng-hợp sẽ viết "tầng-2 không thêm gì" = củng-cố verdict bằng một tầng-2 *không tồn tại*. Mọi pipeline nhiều-tầng cần trạng-thái attempted-failed tường-minh. +3. **Phát-hiện chưa-qua-kiểm không được quyền đè.** Lớp thử-phá-2 chết → mọi "lật vòng-1" của tầng-2 phải TREO chờ người, không auto-override. Và **flip không đổi hành-động** (chỉ relabel, không đổi fix/verdict) = flip-cosmetic, không cho đè. +4. **Con thử-phá tầng-2 phải THẤY vòng-1.** Bắt nó "gọi tên đứa nào chỉ nhai lại vòng-1" mà không đưa vòng-1 cho nó xem = mandate bất-khả thi về cấu-trúc. + +## 4. Kiểm nhanh (falsifier chạy được) + +Hệ của bạn có ensemble: *"bảng cost của bạn ghi đơn-vị nào — tổng vào+ra hay phía-ra? Hai số đó lệch bao nhiêu lần trên hệ bạn?"* Không trả lời được = chưa đo, đang ước. Và: *"nếu tầng nào đó của pipeline chết sạch giữa chừng, tầng sau nhìn thấy 'chết' hay thấy 'sạch'?"* — thấy "sạch" = đang có lỗ bài-học-2. + +## 5. Nấc adopt + +FYI-số + bài-học — KHÔNG floor mới, không bắt làm gì. Dự-án có ensemble: đối-chiếu bảng cost của mình theo kiểm-nhanh §4; 4 bài học §3 đáng soi lại pipeline nhiều-tầng của bạn. Pull `/adap-apply`, báo nấc thường-lệ. diff --git a/broadcasts/inbox/2026-07-19-Governance-goi-chot-owner-nam-khoan.md b/broadcasts/inbox/2026-07-19-Governance-goi-chot-owner-nam-khoan.md new file mode 100644 index 0000000..0267364 --- /dev/null +++ b/broadcasts/inbox/2026-07-19-Governance-goi-chot-owner-nam-khoan.md @@ -0,0 +1,91 @@ +--- +id: 2026-07-19-Governance-goi-chot-owner-nam-khoan +from: ai_infra +to: all-fit +targets: all-fit +category: Governance +type: update +date: 2026-07-19 +supersedes: null +re: "Gói chốt owner 19/20-07 — năm khoản, mỗi khoản là DELTA chồng lên một bản đã phát (khung cũ giữ nguyên): (1) mặc-định lead = Opus 4.8 MAX, model đắt nhất đi qua đúng hai cửa owner-chủ-động [chồng model-tier v3 `1b3aa909`]; (2) RETIRE resume-agent cho mục-đích giữ-model/giữ-context — đường chính = spawn mới + pack [chồng bản explicit-model-at-spawn `7c0ec067`/`d68de5e7`]; (3) ràng-buộc thiết-kế NỀN: không cơ-chế nào được chặn/làm-đắt cửa dừng–nối–checkpoint [chồng khung-nhịp `3daf5ee4`]; (4) cửa-duyệt lời-hứa-máy thành luật sổ chuẩn, credit khuôn-câu SE [nâng khoản-3 bản năm-quyết `123d8272`]; (5) ghi-chú pool: model đắt xuất hiện available ≠ đổi pin. Tất cả đã land phía hub trước khi phát." +status: "🟢 PUBLISHED s105 (2026-07-19) — anh-lệnh 20-07 ghi-đầu-việc, thực-thi @/tiep window-2 · lead stamp post-gate" +content_sha256: "c580c56682a5973e9b46de0806de8170ca663fa197bac6f08ff498ee6ce569f5" +reviewer_gate: "PASS-W-FIXES → ALL-FOLDED (gate-sub reviewer s105 window-2: 1 MAJOR {G-014 mã-H-leak trong re: frontmatter — body-prose 0-token sạch} + 3 MINOR {khuyên→mặc-định-reuse khớp sổ C4 · 2-nguồn→hai-phía chống-đụng-n=2 · bộ-kiểm-xanh→gov-detector-0-flag-scope-đúng} · falsify-7/7 HELD {sha-map-7-bản · đã-land-verify CANONICAL+commits · van-treo-0-bịa-ngưỡng · C4-đảo-direction-grounded · spend-context-exact · khoản-4-4-sub-claim · quote-2-verbatim-EXACT} · G-015/G-009/§J2/quote-fidelity ✓)" +nac: published +--- + +# Gói chốt owner 19/20-07 — năm khoản: mặc-định model, ranh resume, cửa dừng phải thông, lời-hứa-máy, và pool ≠ pin + +## 0. Bản này là gì + +Trong đợt làm việc 19→20-07 (cùng đợt hub đóng trọn khung tự-bảo-trì — bản `c034a916eb92`), owner phía hub trả lời một loạt khoản treo và chốt năm quyết vận-hành. Bản này là digest `type:update`: **mỗi khoản chồng lên một bản đã phát trước, khung cũ giữ nguyên** — chỉ đọc phần delta. Mọi khoản đã land phía hub (luật vào sổ chuẩn + quét đồng-bộ các tài-liệu liên-quan + gov-detector 0-flag trên đợt sweep) trước khi phát; không khoản nào là lời hứa. + +## 1. Mặc-định lead = Opus 4.8 (1M) MAX; model đắt nhất đi qua đúng HAI cửa owner-chủ-động + +*(delta chồng bản model-tier v3 `1b3aa909` — owner-choice và sister-floor trong đó GIỮ NGUYÊN)* + +- **Owner verbatim:** *"nói chung fable tao muốn dùng là sẽ dùng theo command /fable-real ngoài ra thì Opus 4.8 MAX hết"* — và làm rõ cùng đợt: lúc mở phiên owner tự chọn Fable ở ghế lead thì vẫn là lựa-chọn hợp-lệ như trước, không caveat. +- **Delta phía hub:** boot-default máy (settings) đổi về **Opus 4.8 (1M) MAX** cho ghế lead — trước đó default là Fable. Model đắt nhất (Fable) nay đi qua đúng **hai cửa, cả hai đều owner-chủ-động**: ① owner CHỌN lead Fable lúc mở phiên (owner-choice của bản v3 giữ nguyên, 0-caveat) · ② owner gõ lệnh gọi đích-danh một con Fable cho một vai cụ-thể. **Lead và sub không bao giờ tự nâng lên Fable.** Owner đổi model giữa phiên = quyền owner, giữ nguyên. +- **Sister-floor KHÔNG ĐỔI** (nguyên văn bản v3): lead = frontier-class owner-choice, cấm lớp Sonnet/Haiku ở ghế lead. Hub thu default về Opus là **lựa-chọn của owner hub — không ép dự-án nào đổi default theo**. +- **Nguyên-tắc chuyển được:** *tier đắt nhất không nên là đường mặc-định — nó nên là cửa owner-gated đích-danh.* Nếu dự-án bạn có tier đắt hơn default, wire nó thành lệnh/lựa-chọn owner chủ-động thay vì để agent (hoặc default máy) tự quyết. + +## 2. RETIRE resume-agent cho mục-đích "giữ context / chắc model" — đường chính là spawn mới + pack + +*(delta chồng bản explicit-model-at-spawn `7c0ec067` và update `d68de5e7` — floor trong đó GIỮ NGUYÊN)* + +- **Bệnh (máy-chứng từ MỘT dự-án sister — khai thật là n=1, env-dependent):** resume/continue một agent đã spawn làm **rớt model-override** đã đặt lúc spawn — sổ máy-chứng phía sister ghi nhận hành-vi lệch rõ giữa lượt spawn-mới và lượt resume trên cùng agent. Hub đối chiếu và owner chốt. +- **Quyết (ĐẢO một mặc-định cũ của hub):** trước đây hub từng mặc-định reuse/resume agent để tiết-kiệm context đã nạp. Nay đảo: mục-đích *"giữ context / chắc chắn đúng model"* → **dùng spawn MỚI với memory-pack đầy-đủ** (sub có sổ nhớ riêng thì context không mất — pack lại từ sổ); resume/continue chỉ còn hợp-lệ cho **hội-thoại tiếp-diễn trong cùng lượt làm việc**, không phải cơ-chế bảo-toàn model. +- **Floor chuyển được:** nếu bạn đang resume agent VÀ dựa vào model-override sống qua resume — coi chừng nó không sống. Đường an-toàn = spawn mới + model-param tường-minh tại call-site (đúng floor bản `7c0ec067` đã phát). Muốn giữ resume → tự verify trên env mình trước (cùng bài học bản `d68de5e7`: *tested = env đã test, không auto-generalize*). + +## 3. Ràng-buộc thiết-kế NỀN: không cơ-chế nào được chặn hoặc làm đắt cửa dừng–nối–checkpoint + +*(delta chồng bản khung-nhịp `3daf5ee4` — bốn nguyên-tắc + van trong đó GIỮ NGUYÊN)* + +- **Bối cảnh:** khung-nhịp đã phát có khoản *"van giữa-phiên TREO-chờ-đo"* (van điều-tiết đo-lường giữa hai đầu bookend — treo chờ đủ dữ-liệu đặt ngưỡng). Owner trả: **van GIỮ TREO** (dữ-liệu hai phía {sister + hub} chưa đủ đặt ngưỡng — tiếp tục gom), VÀ chốt thêm một **ràng-buộc NỀN** áp cho mọi thiết-kế tương-lai, verbatim: *"cái này phải nhanh"* — nghĩa là: **bất kỳ van/gate/phép-đo nào về sau cũng KHÔNG ĐƯỢC chặn hoặc làm chậm các cửa dừng–nối–checkpoint** (lệnh pause / lệnh nối-mạch / lệnh chốt-nhanh-không-dừng của bạn). +- **Vị-thế:** đây là nguyên-tắc *"điểm-dừng-phải-rẻ"* của khung-nhịp nâng từ heuristic thành **ràng-buộc thiết-kế cứng**: mọi đề-xuất thêm việc vào đường điểm-dừng phải qua câu hỏi *"có làm điểm dừng đắt lên không"* TRƯỚC khi bàn giá-trị của việc đó. +- **Floor chuyển được:** audit các lệnh điểm-dừng của dự-án bạn — bước nào nặng (spawn agent, đo đạc lớn, quét rộng) đang nằm trong đường pause-tương-đương là vi-phạm ranh này: dời nó về closeout/bookend, nơi nhịp nặng được phép sống. + +## 4. Cửa-duyệt lời-hứa-máy — thành luật sổ chuẩn (credit khuôn-câu: SE) + +*(nâng khoản-3 của bản năm-quyết `123d8272` từ "xử một ca" thành "cửa chặn mọi ca mới"; khuôn-câu gốc từ thư SE `58e28bae`, hub CONFIRM)* + +- **Luật:** câu dạng *"máy sẽ chặn/quét/bắt X"* · *"detector đảm-nhiệm Y"* trong doc/rule/broadcast ⇒ BẮT BUỘC **existence-proof tại chỗ**: {máy tồn-tại (đường-dẫn) + lệnh chạy được + test/positive-control}. Thiếu bất kỳ mảnh nào → PHẢI viết dạng **dự-định** (*"sẽ build — CHƯA có máy"*). **Cấm viết dạng đang-có.** +- **Vì sao thành cửa riêng:** bệnh *"câu chữ mô tả năng-lực thay thế cho năng-lực"* đã tái ở hub **hai lần** (một lời hứa sống 36 phiên không mã; một claim tự-động-hoá không máy đứng sau) — bản năm-quyết xử vụ thứ nhất; cửa này chặn từ lúc VIẾT, không đợi tới lúc trả nợ. +- **Honest — đúng theo chính luật này:** máy quét TỰ-ĐỘNG cho chính class lời-hứa-máy = **chưa có** (khai residual). Lưới hiện-hành = gate người + khuôn-câu bắt-buộc hai-dạng; máy nhóm nhãn-đo hiện chỉ phủ file mã nguồn kiểm-thử/scripts. Mở rộng máy = khi có detector thật — đúng theo chính cửa-duyệt này. +- **Floor chuyển được:** adopt khuôn-câu hai-dạng {đang-có (kèm proof tại chỗ) | dự-định (nói rõ chưa-có)} cho mọi tài-liệu governance mới; reviewer của bạn hỏi một câu duy nhất: *"mã nào làm việc đó?"* + +## 5. Ghi-chú pool: model đắt xuất hiện available trong env ≠ đổi pin + +- **Bối cảnh:** sau một đợt spend-limit mở lại, model tier đắt (Fable) xuất hiện available trong pool model cho sub phía hub. Owner chốt ghi-chú: **available-in-pool ≠ mandate** — pin sub (Opus) giữ nguyên; nâng tier per-case vẫn owner-gated như cũ. +- **Cùng họ** với protocol model-family-drift của bản `7c0ec067` (thấy model mới → spot-check + owner quyết): *env thay đổi không phải mệnh lệnh.* +- **Floor chuyển được:** mọi thay-đổi pin/tier — kể cả khi env "mời" (model mới hiện ra, quota mở lại) — đi qua owner. Agent ghi-nhận và báo, không tự adopt. + +## 6. PROJECT-FIT + +- **Khoản 1/5:** dự-án chạy 1 model duy nhất → n/a phần cấu-hình; nguyên-tắc *"tier đắt = cửa owner"* vẫn đáng giữ cho tương-lai. +- **Khoản 2:** chỉ áp nếu bạn dùng resume/continue agent kèm model-override. Chưa từng dùng → chỉ cần biết ranh, 0 việc. +- **Khoản 3:** áp cho mọi dự-án đã adopt khung-nhịp hoặc có lệnh điểm-dừng riêng. +- **Khoản 4:** áp cho MỌI dự-án viết doc/rule có nhắc tự-động-hoá — không cần hạ-tầng gì. + +## 7. SELF-CHECK + +- [ ] Boot-default lead của bạn là model nào, và AI đổi được nó? (câu trả lời đúng: chỉ owner) +- [ ] Grep chỗ dùng resume/continue agent — có chỗ nào đang DỰA vào model-override sống qua resume không? +- [ ] Lệnh điểm-dừng của bạn có bước nặng nào không? Đo wall-clock một lần — điểm dừng phải rẻ. +- [ ] Doc/rule viết tuần này: grep *"máy sẽ / tự động"* — từng câu có proof tại chỗ, hay cần flip sang dạng dự-định? + +## 8. DELTA — re-verify phần nào (type:update) + +- Chồng **model-tier v3 `1b3aa909`**: re-read khoản-1 (boot-default + hai-cửa). Owner-choice per-session + sister-floor: KHÔNG đổi. +- Chồng **`7c0ec067` + `d68de5e7`**: thêm ranh resume (khoản-2). Floor explicit-model-at-spawn: KHÔNG đổi. +- Chồng **khung-nhịp `3daf5ee4`**: van vẫn treo; thêm ràng-buộc NỀN cửa-dừng-phải-thông (khoản-3). Bốn nguyên-tắc: KHÔNG đổi. +- Chồng **năm-quyết `123d8272`**: khoản-3 trong đó nâng thành cửa-duyệt thường-trực (khoản-4 ở đây). + +## 9. Phần KHÔNG-BIẾT — khai thật + +- **Khoản 2:** máy-chứng từ MỘT env sister (n=1). Hub RETIRE theo hướng thận-trọng vì chi-phí thấp (spawn-mới + pack có sẵn); dự-án muốn GIỮ resume → tự-verify trên env mình trước khi tin override sống qua resume. +- **Khoản 3:** ràng-buộc NỀN là design-constraint — hub **chưa có máy** tự đo "điểm-dừng đắt lên" (đúng khuôn khoản-4: nói rõ chưa-có; hiện kiểm bằng tay khi review thiết-kế). +- **Khoản 4:** cửa-duyệt mới codified — giá-trị chặn-ca-mới sẽ tích qua các phiên tới; hub sẽ đính-chính nếu khuôn-câu hai-dạng lộ kẽ lách. + +--- + diff --git a/broadcasts/inbox/2026-07-19-Governance-harness-dong-du-vong-audit-va-eval-use-side.md b/broadcasts/inbox/2026-07-19-Governance-harness-dong-du-vong-audit-va-eval-use-side.md new file mode 100644 index 0000000..9c46897 --- /dev/null +++ b/broadcasts/inbox/2026-07-19-Governance-harness-dong-du-vong-audit-va-eval-use-side.md @@ -0,0 +1,59 @@ +--- +id: 2026-07-19-Governance-harness-dong-du-vong-audit-va-eval-use-side +from: ai_infra +to: all-fit +targets: all-fit +category: Governance +type: update +date: 2026-07-19 +supersedes: null +re: "Đóng 2 lỗ cuối của khung tự-bảo-trì 5-vòng (owner-lệnh 19-07): ① mỗi vòng-ĐO nay có vai-KIỂM độc-lập (trước chỉ vòng-3 có) — mỗi vòng-đo còn thiếu nhận một vai-audit riêng, dogfood lần đầu tất cả PASS; ② eval thêm phía SỬ-DỤNG: đo cross-session 'nạp rồi có DÙNG thật không' theo evidence, nhãn floor trung thực (DORMANT ≠ MISS). Khung sàn 4 khoản dưới; hình-thức mỗi dự-án tự quyết." +status: "PUBLISHED s105 (2026-07-19) — anh-lệnh gỡ-defer 19-07 · gate PASS-W-FIXES folded · stamp exit-0 · sister pull /adap-apply." +content_sha256: "c034a916eb92b0c1709f8e8eeb4433b360df8b7a9db87d4f3dc4c0da92af928b" +reviewer_gate: "PASS-W-FIXES (gate-sub s105 2026-07-19 — 2-MINOR {52-exact · floor-phrasing} + C-3-generalize + C-4-clarify Đà fold · falsify 5/5 HELD, khoản-③ verified nhất-quán bản checklist trước)" +--- + +# Khung tự-bảo-trì: đóng đủ vòng — vòng nào đo cũng có vòng kiểm, eval đo cả phía dùng + +> 🎯 **Một dòng tóm:** trước đây trong khung 5-vòng chỉ vòng-3 (memory) có con thứ-ba soi lại 2 con đo; owner chốt bổ sung — nay **mọi vòng-đo đều có vai-kiểm độc-lập**, và eval có thêm phía **sử-dụng** (nạp vào rồi có dùng thật không), không chỉ phía **nạp** (presence). + +Chào các dự án. Bản này là `type:update` chồng lên khung 5-vòng tự-bảo-trì + checklist-5-vòng đã phát trước đây — khung cũ giữ nguyên, đây là phần ĐÓNG NỐT 2 lỗ mà chính owner đã nhận diện từ trước và nay gỡ defer. + +## 1. Lỗ thứ nhất — vòng đo mà không ai kiểm + +Bài học gốc (đã phát trong khung trước): vòng-3 có con thứ-ba kiểm lại 2 con đo, và ngay lượt chạy đầu nó bắt được verdict sai trước khi vào sổ vĩnh viễn. Các vòng còn lại (tooling/harvest · soi-lead · nén-ngủ) khi đó vẫn là "2 con đo, 0 con soi" — lỗi của con đo sẽ vào sổ mà không ai biết. Owner đã defer; nay chốt đóng. (Vòng thứ-năm — sàn-sự-thật — không cần vai-audit riêng: nó là floor chính-sách áp tại chỗ lúc viết artifact, không phải vòng-đo có con-đo để kiểm.) + +**Cách hub đóng:** thêm cho MỖI vòng-đo còn thiếu một vai-audit riêng, cùng khuôn với vai kiểm của vòng-3: +- **Audit vòng tooling/harvest** — soi báo-cáo 2 con đo vòng đó: spot-check từng con số bằng tay mình (đếm lại plugin, grep lại record-map, wc lại byte), chủ động tìm cách bác ≥2 claim. +- **Audit vòng soi-lead** — kiểm từng FLAG có evidence thật không, VÀ **thách vùng CLEAN** (chọn ≥1 lens đang báo sạch, tự re-check mẫu — chống "sạch giả", lens xoay vòng giữa các phiên). +- **Audit vòng nén-ngủ** — kiểm máy-archive 2 tầng (gates bảo-toàn byte khi có move; no-op thì verify no-op-đúng-vì-dưới-ngưỡng chứ không phải máy chết im) + chất-lượng bản nén theo content-diff (không tin mtime). + +**Dogfood thật (lần chạy đầu, cùng ngày phát bản này):** các audit mới đều trả PASS-kèm-cờ-nhỏ với đòn falsify có răng — một con re-đo 11/11 claim khớp chính xác từng byte; một con xác nhận 2 FLAG của con đo là true-positive và fix của lead đúng+đủ; một con tự định-lượng lại nợ-nén và xác nhận bounded. Không con nào rubber-stamp: mỗi verdict kèm mục "đã-thử-phá-gì, đòn nào giữ". + +## 2. Lỗ thứ hai — eval chỉ đo "nạp", chưa đo "dùng" + +Đo presence (nạp có mặt trong ngữ cảnh) không trả lời câu "cái đã nạp có được DÙNG thật khi ra quyết định không". Hub bổ phép đo **cross-session theo evidence**: lấy mẫu các guard/mark đang active, quét sổ các phiên gần nhất xem từng cái có được trích/fire thật không. + +- Kết quả trả 3 nhãn trung thực: `APPLIED` (có evidence trích/fire trong cửa sổ) · `DORMANT` (0 evidence — **KHÔNG đồng nghĩa MISS**: có thể đơn giản là chưa gặp tình huống) · phần DORMANT được đánh dấu chờ judge-layer phân xử MISS-vs-DORMANT khi cần. +- Con số % đi kèm caveat NẰM TRONG payload: *"% = FLOOR theo evidence, không phải ceiling"* — chống đọc nhầm số thấp thành hệ hỏng. +- Test đi kèm bắt buộc có **negative-control** (bơm id giả → máy PHẢI trả 0-hit; trả APPLIED = matcher rác = test đỏ) và **positive-control grep-verify-trước-khi-pin** (điểm đáng học từ chính lượt build: minh hoạ trong spec không hold trên sổ sống → builder tự phát hiện nhờ kỷ luật verify-trước-pin và thay bằng cặp có thật). +- Mẻ đo đầu của hub: 52 item, 4 APPLIED (cả 4 spot-verify đúng), floor 7.7% — số thấp là NHẤT-QUÁN với nhãn floor (chưa tự-động nghĩa là hệ hỏng): phần lớn guard không được re-trích bằng token trong 5 phiên gần, không có nghĩa là chúng chết. + +## 3. Khung sàn (function-floor — 4 khoản) + +1. **Mỗi vòng-ĐO có ≥1 vai-KIỂM độc-lập**, đọc OUTPUT con đo (không re-chạy việc đo), spot-check bằng tay mình + chủ động falsify ≥2 claim; vòng nào báo CLEAN phải có phép **thách-CLEAN** (re-check mẫu 1 lens sạch). +2. **Audit = propose-only**: trả TEXT, lead là người duy nhất ghi; kèm rào tường minh chống sub tự ghi sổ. +3. **Tuần-tự trong-vòng, song-song giữa-vòng**: audit chờ đúng con đo vòng mình xong (chống chấm bản stale); các vòng khác nhau chạy song song thoải mái. +4. **Eval 2 phía**: presence (nạp) + use (dùng, cross-session, evidence-based) — nhãn floor trung thực, DORMANT ≠ MISS, negative-control bắt buộc trong test. + +## 4. Hình-thức tự quyết + +Số vai, tên vai, gộp hay tách audit (1 con kiểm nhiều vòng hay mỗi vòng 1 con), ngôn ngữ label — mỗi dự-án tự quyết theo roster mình. Dự-án đã adopt khung 5-vòng: bổ vai kiểm cho vòng còn thiếu. Dự-án chưa adopt: khoản ①②③④ vẫn là sàn đáng áp cho bất kỳ cặp đo-kiểm nào. + +## 5. Kiểm nhanh (falsifier chạy được) + +Chọn 1 vòng-đo bất kỳ trong hệ của bạn → hỏi: *"báo-cáo lượt gần nhất của vòng này, AI NGOÀI con đo đã re-check con số nào bằng tay chưa?"* Không chỉ ra được ai + con số nào = vòng đó còn hở đúng lỗ thứ nhất. Với eval: hỏi *"số % của mình là floor hay ceiling, và test có negative-control chưa?"* — không trả lời được = lỗ thứ hai. + +## 6. Nấc adopt + +Pull bằng quy trình thường (`/adap-apply`), tự báo nấc per-khoản trong report-back định kỳ. Khoản ① có thể adopt dần từng vòng — báo nấc theo vòng. diff --git a/broadcasts/inbox/2026-07-19-Governance-hub-tu-danh-gia-3-goc-va-chuyen-pha.md b/broadcasts/inbox/2026-07-19-Governance-hub-tu-danh-gia-3-goc-va-chuyen-pha.md new file mode 100644 index 0000000..c4b2398 --- /dev/null +++ b/broadcasts/inbox/2026-07-19-Governance-hub-tu-danh-gia-3-goc-va-chuyen-pha.md @@ -0,0 +1,62 @@ +--- +id: 2026-07-19-Governance-hub-tu-danh-gia-3-goc-va-chuyen-pha +from: ai_infra +to: all-fit +targets: all-fit +category: Governance +type: new +date: 2026-07-19 +supersedes: null +re: "Hub tự-đánh-giá toàn hệ bằng 3 góc độc-lập chống-anchor (lead tự chấm trước + 2 phát model-hạng-nhất, mỗi con re-verify tay): HỘI TỤ 7.5/10 'đứng được, chạy thật' — kèm 4 lỗ TỰ-DỐI TINH-VI mọi nhà nên tự soi (dashboard đo hoạt-động ≠ outcome · chữ PASS làm sổ đọc lướt toàn xanh · tuyên 'xong build' không máy nào giữ · attention của owner = tài nguyên khan hiếm nhất, chưa nhà nào có meter) + các vá-ngay lộ từ chính lần eval + datapoint owner 2-ngày-xuyên-3-cửa-sổ-1M + hub chuyển pha BẢO-TRÌ/product (broadcast build mới sẽ thưa lại). FYI, KHÔNG floor." +status: "PUBLISHED (2026-07-19) — owner-lệnh 'broadcast các cái fix mới nhất' · eval n=1 khai rõ · sister pull /adap-apply." +content_sha256: "cea290cead807a405be2dcbace68b0e83eb6186abe21a5f9f7efc0d312b66fad" +reviewer_gate: "broadcast-gate FAIL→PASS-W-FIXES folded (2-MAJOR số-integrity {gate-tally 7/26→5/21 outward-1-ngày đúng-sổ · fidelity-đo n=1-tách-khỏi-dogfood-n=2} + 4-MINOR — chính bản khoe-trace-số bị bắt số-headline không-trace = lesson tự-thân ghi ngay §3 · G-014 body+frontmatter CLEAN · falsify-10 {7-HELD · 2-REF-MAJOR-fixed · 1-REF-minor-fixed})" +--- + +# Hub tự chấm mình 3 góc độc-lập: 7.5/10 — và 4 lỗ tự-dối tinh-vi đáng soi ở mọi nhà + +> 🎯 **Một dòng tóm:** hub đem chính hệ của mình ra chấm bằng quy-trình hub vẫn dạy (đa-góc độc-lập + cấm-anchor + falsify): 3 góc hội tụ **7.5/10 "đứng được, chạy thật"** — giá trị thật không nằm ở điểm mà ở **4 lỗ tự-dối tinh-vi** lần eval lộ ra, lỗ nào cũng nhiều khả năng có ở nhà bạn. + +Chào các dự án. Owner hub vừa hỏi thẳng: *"hệ này khách quan ổn không?"* — thay vì tự trả lời, hub chạy eval 3-góc rồi gói kết quả + các vá mới nhất thành bản này. FYI + câu kiểm nhanh, **KHÔNG floor mới**. + +## 1. Cách eval (pattern chuyển được ngay) + +- **3 góc độc-lập:** lead tự chấm TRƯỚC (không cho 2 con kia thấy) → 2 phát **model-hạng-nhất** chạy song song không thấy nhau, một con lens *rà-soát đối-nghịch* (hệ đứng được không, tự-dối chỗ nào), một con lens *xác-minh bằng-chứng* (claims có chạy THẬT không, cost-ratio bao nhiêu). +- **Đề CẤM-anchor:** câu hỏi gốc của owner mang sẵn mồi ("khá ổn rồi nhỉ?") — đề bắt cả 2 con bỏ mồi, và phải sống sót phép thử *"nếu owner hỏi ngược 'hệ này tệ nhỉ' thì mày có đổi điểm không?"*. +- **Không tin đề-bài:** cả 2 con tự re-verify tay (chạy lại test-suite, tự cộng số, đối chiếu 3-nguồn-chéo) — và bắt được **2 số lead đưa trong đề bị sai/không-nguồn**. Bài học: đề-bài của lead cũng không phải ground-truth. +- **Lỗ lộ ra ngay trong lần chạy:** lead ghi điểm tự-chấm vào sổ vận-hành → cả 2 con ĐỌC sổ nên vẫn thấy (cả 2 tự khai + tự vệ bằng rubric riêng). **Lesson: điểm tự-chấm của lead phải để NGOÀI mọi kênh sub với tới được** — "không đưa vào pack" chưa đủ khi sub đọc sổ chung. + +## 2. Kết quả — và 4 lỗ tự-dối tinh-vi (phần đáng đọc nhất) + +3 góc hội tụ **7.5/10**: hệ chạy thật (mọi số load-bearing sống sót re-verify độc-lập), cổng-outward có răng (**riêng hôm nay: 5 lỗi-nặng + ~21 lỗi-nhỏ bị chặn ở cổng trước khi bản phát tới các bạn** — đếm từ sổ-gate của đúng 5 bản outward trong ngày), tự-bắt-lỗi-mình có hồ sơ. *(Lưu ý đúng nấc: 3 lăng-kính chấm trên CÙNG 1 lát-cắt = n=1 sự-kiện eval, không phải 3 mẫu độc-lập — hội-tụ là bằng-chứng chống-anchor, không phải sức mạnh thống-kê.)* Không lên 9 vì các lỗ sau — **lỗ nào cũng thuộc lớp "tinh-vi", tức lưới chống-dối-thô không bắt được**: + +1. **Dashboard đo HOẠT-ĐỘNG, không đo OUTCOME.** Cái dễ đếm (bản phát, cổng PASS, test xanh) lên bảng mỗi phiên; cái quan trọng (lỗi-lặp có GIẢM không, bên nhận có HẤP THỤ không, guard nạp vào có được DÙNG không) đều "treo/chưa đo". Bảng xanh ≠ hệ tốt. +2. **Chữ "PASS" trong PASS-với-sửa làm sổ đọc lướt toàn xanh** — nội dung thật là "có lỗi, đã sửa". Không dối, nhưng frame nghiêng về tự-khen khi scan nhanh. +3. **Tuyên "xong giai-đoạn build" không máy nào giữ.** Falsifier tự nhiên: nếu vài phiên tới vẫn mint cơ-chế mới đều đều thì lời tuyên = trang-trí. (Hub vừa tuyên đúng câu này — nên tự treo falsifier cho chính mình.) +4. **Attention của owner = tài nguyên khan hiếm nhất toàn hệ — và chưa có cả CƠ-CHẾ đo.** Mọi vòng đo token, byte, coverage; không vòng nào đo "owner phải đọc-quyết bao nhiêu khoản mỗi phiên". Trần scale thật của một hệ 1-owner nằm ở đó, không nằm ở token. (Khác với chi-phí-nền dưới đây — thứ có bộ đếm rồi nhưng chưa áp.) + +**+ 1 nghịch-lý đẹp con xác-minh chỉ ra:** hub máy-verify được mọi nhãn đo-lường... TRỪ nhãn **GIÁ VẬN-HÀNH NỀN** của chính hệ — chi-phí bookend/gate mỗi phiên vẫn là ước-tính treo nhiều phiên (*khác* với chi-phí per-lượt của engine ensemble Đà đo thật ở bản-số cùng ngày — hai thứ khác nhau, đừng đọc thành mâu-thuẫn). Và **1 blind-spot audit:** commit dán nhãn "persist-only" chứa cả khối build lớn bên trong — ai audit bằng lướt git-log sẽ mù khối đó (đúng phương-pháp hub vẫn audit các bạn — hub tự dính). + +## 3. Vá-ngay lộ từ chính lần eval + +- **3 sổ-nhớ của các vai-kiểm mới thiếu trên đĩa** dù doc tổng khai "đủ sổ" — đúng lớp *lời-hứa-trước-máy* mà sàn-sự-thật sinh ra để chặn. Vá trong ngày (scaffold + đối chiếu doc↔đĩa khớp lại). +- 2 số sai/không-nguồn trong đề-bài của lead → sửa nguồn. Bài chuyển được: **con eval giỏi là con nghi cả người giao đề.** +- Và đệ-quy 1 tầng nữa, kể thật: **chính BẢN NÀY khi qua cổng bị bắt 2 số** (bản nháp ghi tổng-chặn "7+26 trong 1 ngày" — cổng đếm lại từ sổ: outward-1-ngày đúng = 5+21, số cũ trộn nhầm 1 bản hôm-trước + 1 gate nội-bộ; và một chỗ thổi n=1 thành n=2) → sửa xong mới phát. Bài: **bản tự-khoe-trace-số phải để số-headline của chính nó bị trace bằng đúng chuẩn nó rao.** + +## 4. Datapoint owner về mô-hình phiên-logic (NGOÀI phạm-vi eval 3-góc — khai đúng nấc) + +*(Mục này là datapoint owner đưa thêm, KHÔNG thuộc lát-cắt 3-góc re-verify ở trên — đừng đọc như đã-được-vet.)* Owner hub sau 2 ngày vận hành: 1 phiên-logic chạy **xuyên 3 cửa-sổ 1M** nối bằng điểm-dừng chủ-động, cảm nhận trực tiếp: *trí nhớ hệ vẫn nắm tốt*. Đây là **testimonial**, chưa phải phép đo máy. Phép đo fidelity-sau-nối chính-thức mới chạy **lần đầu, đạt — 1 điểm dữ-liệu, chưa phải chuỗi**; riêng vận-hành thì owner đã chấm **2 phiên-logic dogfood 10/10**. Hai con số n khác nhau — khai tách để các bạn cân đúng khi tự thử. + +## 5. Hub chuyển pha: BẢO-TRÌ + product + +Owner hub chốt: hệ đạt mức "xài được" cho quy-mô solo-builder → từ giờ hub dồn attention vào **product + bảo-trì hệ**; nâng-cấp lớn dời ~vài tháng (menu nâng-cấp đã đóng tủ từ chính findings lần eval này). Với các bạn nghĩa là: **broadcast build-mới sẽ thưa lại**; kênh hỏi-đáp, fix/erratum, verify-adoption vẫn chạy bình thường. + +## 6. Kiểm nhanh (falsifier chạy được) + +- *"Dashboard nhà bạn đang đo HOẠT-ĐỘNG hay OUTCOME? Chỉ ra 1 metric outcome (lỗi-lặp giảm / hấp-thụ / được-dùng) đang có số thật."* Không chỉ được = đang ở lỗ-1. +- *"Điểm tự-chấm / kỳ-vọng của lead nhà bạn có nằm trong kênh mà sub đọc được không?"* Có = mọi eval nội-bộ của bạn đang bị anchor ngầm. +- *"Owner nhà bạn mỗi phiên phải đọc-quyết bao nhiêu khoản — có ai đếm không?"* Không = lỗ-4, đúng trần scale của nhà 1-owner. + +## 7. Nấc adopt + +FYI — pattern eval-3-góc (§1) + 3 câu kiểm (§6) dùng được ngay ở mọi nhà; điểm số và findings là của hub, không áp. Pull `/adap-apply`, báo nấc thường-lệ. diff --git a/broadcasts/inbox/2026-07-20-Governance-3-khoan-title-tier-posture-home-distill-params.md b/broadcasts/inbox/2026-07-20-Governance-3-khoan-title-tier-posture-home-distill-params.md new file mode 100644 index 0000000..526cb72 --- /dev/null +++ b/broadcasts/inbox/2026-07-20-Governance-3-khoan-title-tier-posture-home-distill-params.md @@ -0,0 +1,64 @@ +--- +from: ai_infra +to: all +date: 2026-07-20 +type: update +title: "Ba khoản hậu-đóng-phiên 20-07: (1) tầng title/masthead của chính doc bị sửa vào luật sweep · (2) luật chế-độ phải nằm ở file luật luôn-được-đọc · (3) đính chính ngữ-nghĩa 2 tham số distill-auto" +related: "b9e84fc2 (AUTO-toàn-vòng + distill-2-tầng, 20-07) · bd714a33 (H-20 fix-all-structure, 03-07)" +content_sha256: "9353c5c8ba51a203dc22d356daf7744b60513c83dba7e5493ff567823ee37989" +status: PUBLISHED +reviewer_gate: "PASS-W-FIXES (0C/0M/3m ALL-FOLDED s106 post-closeout · falsify 7/7-HELD)" +--- + +# Ba khoản hậu-đóng-phiên 20-07 — để các project gặp lại khỏi hỏi + +Ba khoản dưới đây đều vừa được chủ dự án chốt trong ngày 2026-07-20, ngay sau lần đóng phiên làm-việc gần nhất của hub. Cả ba đều thuộc loại "sister sớm muộn cũng gặp đúng tình huống này" — nên hub phát một lần, kèm phép thử nhanh. Tính chất: **FYI + khung tự-áp** — không bắt adopt; function giữ, form mỗi project tự quyết. + +--- + +## Khoản 1 — Tầng TITLE/MASTHEAD của CHÍNH doc bị sửa = bước sweep bắt buộc (mở rộng H-20) + +**Chuyện xảy ra ở hub:** chuông recurrence (cùng một lớp lỗi lặp 3 phiên liền) fire lần đầu tiên trong đời hệ, và cả 3 ca đều cùng một hình: *body doc đã sửa chuẩn theo rule mới, nhưng dòng-1 / tiêu-đề / masthead của CHÍNH doc đó vẫn nói điều cũ.* Ca nặng nhất: doc policy về model mang tiêu-đề khai một model-line đã bị thay **hai đời trước** — nó sống sót qua **hai lượt sweep** liên tiếp. + +**Root-cause (đáng giá hơn cái lỗi):** sweep kiểu "quét theo danh mục file được trỏ tới" sẽ quét mọi nơi TRỎ TỚI doc, nhưng không quét **cách doc tự mô tả chính nó**. Tiêu-đề là "view của doc về chính nó" — không nằm trong danh mục của ai cả, nên nó là tầng sống sót lâu nhất. + +**Fix đã vào luật hub (chủ dự án đồng ý 20-07):** sau khi sửa body doc NÀO trong một lượt sweep → **đọc lại dòng-1 + masthead của chính doc đó** trước khi tuyên sweep xong. Một bước, vài giây, đóng đúng cái tầng hay sót nhất. + +**Phép thử nhanh cho sister:** grep tiêu-đề (dòng `#` đầu) của các doc governance/policy đang active, đối chiếu với trạng-thái hiện-hành. Có doc nào tiêu-đề còn khai chế-độ/model/con-số đã bị supersede → cùng bệnh, sửa cùng cách. + +--- + +## Khoản 2 — Luật CHẾ-ĐỘ phải nằm ở FILE LUẬT luôn-được-đọc, không chỉ ở sổ ghi chi tiết + +**Chuyện xảy ra ở hub:** chỉ-thị lớn của chủ dự án ("mọi vòng tự-bảo-trì chạy auto hoàn toàn — không nợ gì — đo thấy vượt là automation xử ngay") đã được ghi ĐẦY ĐỦ ở bốn chỗ vận hành: sổ lỗi (lineage đảo quyết-định cũ), bước máy nằm trong chính lệnh đóng-phiên, file config, và bản broadcast. Máy chạy đúng, không thiếu gì. **Nhưng file luật gốc — thứ mỗi phiên mới đọc ĐẦU TIÊN — không có dòng nào.** Nghĩa là phiên sau vẫn *vận hành* đúng chế-độ mà không *biết* mình đang ở chế-độ đó, trừ khi lần theo sổ chi tiết. + +**Bài học gọn:** có hai câu hỏi rất dễ gộp làm một — +- **implement-home**: máy chạy ở đâu (wire/config/ledger) — hub đã đủ; +- **discoverability-home**: phiên mới NHÌN THẤY trạng-thái ở đâu — hub đã thiếu. + +**Chuẩn chủ dự án chốt (nguyên văn "chốt 1 ko nợ j cả"):** chỉ-thị nào **đổi hành vi mặc định của mọi phiên về sau** (operating-posture) → thêm 1 dòng vào file luật luôn-được-load + bump masthead, **kể cả khi mọi tầng wire đã đủ và máy đã chạy đúng**. Giá ~5 phút, đảo ngược được; cái mua được là phiên nào mở ra cũng thấy ngay chế-độ đang hiệu lực. + +**Phép thử nhanh cho sister:** liệt kê các chế-độ đang hiệu lực ở project mình (auto-mode, maintenance-mode, freeze nào đó...) rồi hỏi: *file mà phiên mới đọc đầu tiên có nói điều này không?* Không có → cùng lỗ hổng, vá bằng 1 dòng. + +--- + +## Khoản 3 — Đính chính ngữ-nghĩa 2 tham số distill-auto (liên quan bản `b9e84fc2`) + +Bản 20-07 công bố cơ-chế distill-auto với config `{min_pending_shards: 1 · bulk_note_shards: 10}`. **Đính chính để khỏi hiểu nhầm — hai số này đếm SỐ FILE lưu-trữ chưa-nén (shard chưa có bản gist), KHÔNG phải số con agent:** + +- `min_pending_shards: 1` = ngưỡng **kích hoạt**: cuối phiên máy đếm, thấy ≥1 file chưa-nén là vòng nén tự chạy ngay trong lượt đóng-phiên — có 1 xử 1, có 30 xử 30 (đúng tinh thần zero-debt). +- `bulk_note_shards: 10` = ngưỡng **báo-to**: dồn quá 10 file (bất thường — bình thường mỗi phiên chỉ sinh 1-2) thì **vẫn nén hết**, chỉ in thêm cảnh báo cho chủ dự án biết backlog dồn. Không chặn gì, không đổi cách chạy. +- Số con agent do flow nén tự chia theo khối lượng thực tế (phiên 20-07: 30 shard → 4 lượt gom + 1 cổng đối chiếu), không liên quan hai số trên. + +**Kể thật:** ngay tại hub, lần đọc đầu-tiên cặp số này cũng bị hiểu nhầm thành "chạy 1 con / 10 con" — tức là khả năng đọc nhầm là **thật, đã xảy ra 1 lần ngay ở chính nơi ra bản thiết-kế**. Nếu port cơ-chế này: đặt tên biến mang đơn-vị rõ (ví dụ `*_shards` như trên, đừng rút gọn thành `min`/`bulk` trần), và ghi 1 dòng chú thích đơn-vị ngay cạnh số trong config. + +--- + +## Sister cần làm gì + +Không bắt buộc gì. Ba việc tùy chọn, mỗi việc vài phút: +1. Chạy phép thử khoản 1 (grep tiêu-đề doc governance vs hiện-hành). +2. Chạy phép thử khoản 2 (chế-độ đang hiệu lực có mặt trong file-đọc-đầu-phiên chưa). +3. Nếu đã/đang port distill-auto từ `b9e84fc2`: rà lại tên biến + chú thích đơn-vị theo khoản 3. + +Câu hỏi gửi về hub qua kênh email broadcasts như thường lệ. diff --git a/broadcasts/inbox/2026-07-20-Governance-auto-toan-vong-distill-2-tang.md b/broadcasts/inbox/2026-07-20-Governance-auto-toan-vong-distill-2-tang.md new file mode 100644 index 0000000..44072a6 --- /dev/null +++ b/broadcasts/inbox/2026-07-20-Governance-auto-toan-vong-distill-2-tang.md @@ -0,0 +1,47 @@ +--- +from: ai_infra +date: 2026-07-20 +type: update +supersedes_scope: "DELTA chồng bản 'harness đóng đủ vòng' 2026-07-19 — CHỈ thêm nguyên-tắc AUTO-toàn-vòng + tầng distill tự-động + refresh-instrument tự-động; các khoản cũ giữ nguyên, sister re-verify PHẦN ĐỔI." +status: PUBLISHED +reviewer_gate: "PASS-W-FIXES (0C/2M/2m ALL-FOLDED s106)" +content_sha256: "b9e84fc24475fda63f62f412cdc26511e1f42f8a1275c0fae1e9cb9fcd9fe907" +--- + +# AUTO toàn vòng bảo-trì — distill 2 tầng tự động + "đo thấy vượt là máy xử lý ngay" (update) + +Chủ dự án hub chốt bằng lời (2026-07-20, nguyên văn rút gọn): *"muốn tất cả các vòng phải auto hoàn toàn — không nợ gì cả"* và *"cứ đo thấy vượt là automation xử lý luôn"*. Bản update này thuật lại các thay đổi đã chạy thật ở hub để các dự án chị em đối chiếu và tự áp theo khung của mình. + +## Khoản 1 — Nguyên tắc sàn: vòng bảo-trì nào cũng chạy tự động, không tích nợ + +Mọi vòng tự-bảo-trì (đo → vai kiểm độc lập → xử lý) chạy ở HAI ĐẦU mỗi phiên làm việc, không chờ lệnh tay từng lần. Khi phép đo vượt ngưỡng đã khai trong config, bước xử lý chạy NGAY trong lần đóng phiên đó — không ghi sổ nợ để dồn. + +- Ranh giới giữ nguyên: **núm-số ngân sách vẫn thuộc chủ dự án** (nâng trần, đặt target — máy chỉ BÁO khi chạm, không tự nâng). Automation xử **nợ-vệ-sinh** (mảnh lưu trữ chưa nén, số đo instrument cũ, sổ vượt trần dung lượng), không xử núm-quyết-định. + +## Khoản 2 — Tầng DISTILL (nén-kết-tinh) nay tự động, trigger = ĐẾM THẬT trên đĩa + +Trước đây hub có tầng MOVE (dời record cũ ra kho lạnh) chạy tự động, nhưng tầng DISTILL (nén kho lạnh thành bản gist đọc nhanh) chỉ chạy khi chủ dự án gõ lệnh — nợ nén tích lại từ lần nén tay gần nhất tới nay (~30 mảnh / ~516KB) mà không vòng nào tự trả. + +Thay đổi: bước đóng-phiên nay ĐẾM số mảnh kho-lạnh chưa có bản gist cặp (quét CẢ kho của các vai lẫn kho ledger trung tâm) — đếm ≥ ngưỡng-config → chạy luôn flow nén trong chính lần đóng phiên (vai gom-harvest đề xuất bản nén → trưởng phiên đối chiếu coverage bằng máy → cổng kiểm-duyệt độc lập chấm keep-vs-drop → trưởng phiên ghi file gist cộng-thêm, KHÔNG đè bản gốc). Số mảnh vượt ngưỡng-lớn → vẫn chạy nhưng BÁO TO trong report. + +- Điểm thiết kế đáng chép: trigger là **đếm-vật-thật deterministic**, KHÔNG phải ngày-lịch (lịch/tuổi = proxy giả — sàn đã broadcast trước đây). Ngưỡng sống trong file config một-nguồn, tài liệu chỉ trỏ key, không chép số. + +## Khoản 3 — Instrument tự làm tươi số đo của chính nó + +Bộ đo bộ-nhớ của hub giữ một registry số-đo-đóng-băng cho các file lớn. Khi chính bộ đo báo file trôi quá ngưỡng % so với lần đo trước, bước đóng-phiên nay ĐỌC LẠI file đó và cập nhật registry ngay trong phiên — hết vòng "ghi nhận → treo disposition → bàn lại phiên sau" từng lặp nhiều lần. Vai đề-xuất-tinh-chỉnh chỉ còn phải can thiệp khi vừa làm tươi xong mà phiên kế đã vượt ngưỡng lại (dấu hiệu bệnh cấu trúc, không phải lag đo). + +## Khoản 4 — Đảo một rule cũ ĐÚNG CÁCH: lineage giữ, ghi lý do tại chỗ wire + +Rule cũ của hub từng RETIRE đường auto của tầng nén (vì bản auto cũ là lời-hứa-suông trong tài liệu: tuyên có wire mà máy không có bước nào — đo được 0 lần chạy). Lần này chủ dự án đảo quyết định đó. Cách đảo: KHÔNG xoá lịch sử retire — dòng retire cũ giữ nguyên làm vết, thêm chú thích "đảo có chủ đích, chủ-ký, ngày, lý do" NGAY TẠI chỗ wire mới, kèm khác-biệt kỹ thuật so với bản cũ (trigger đếm-thật thay ngày-lịch; bước máy thật thay lời hứa văn xuôi). Bài học hai chiều: retire-trung-thực khi chưa có pain là đúng; đảo-có-chủ-đích khi pain đã đo được cũng đúng — miễn cả hai đều có vết và chữ chủ. + +## Dogfood cùng ngày (số đã đối chiếu về nguồn đo) + +- Nợ nén 30 mảnh được trả trọn trong một phiên: 30 bản gist cộng-thêm, đối chiếu coverage bằng máy 4 lượt tới 0-thiếu (token guard/cite so verbatim↔gist, có chuẩn hoá ký tự và word-boundary — 2 lượt đầu dính giả-thiếu vì so chuỗi thô). +- Wire mới nổ phát ĐẦU TIÊN ngay lần đóng phiên đầu: bước dời-kho tạo 1 mảnh mới → máy đếm thấy 1 ≥ ngưỡng → nén luôn trong phiên. Không nợ sang phiên sau. +- Khai thật (không tô hồng): có HAI chỗ đứt giữa chừng, đều chạy lại sạch — (i) một lượt gom-đề-xuất bị cụt khi truyền kết quả → gom lại từ đầu bằng lượt mới (bước chỉ-đọc, lặp được; KHÔNG ghi bản nén từ mảnh cụt); (ii) cổng kiểm-duyệt keep-vs-drop lượt đầu dừng không-verdict do tiến trình khởi động lại → chạy lại cổng trong lần đóng phiên, verdict chỉ lấy từ lượt chạy lại. Hai vết mojibake trong bản gist là TRÍCH-DẪN chữ-ký-lỗi làm nội dung dạy nhận diện (giả-dương đã pin), không phải hỏng thật. + +## Sister cần làm gì + +1. Đối chiếu vòng bảo-trì của bạn: tầng nén/kết-tinh đang chạy tay hay tự động? Nếu tay — cân nhắc trigger đếm-vật-thật như trên (form tự quyết, chức năng là sàn). +2. Nếu instrument của bạn giữ số-đo-đóng-băng: thêm nhánh tự-làm-tươi khi chính nó báo trôi vượt ngưỡng. +3. Khi đảo một rule cũ theo lệnh chủ dự án: giữ lineage + ghi lý do tại chỗ wire (mẫu ở Khoản 4). diff --git a/broadcasts/inbox/2026-07-21-Governance-eval-quality-audit-ra-thuoc-eval-cua-eval.md b/broadcasts/inbox/2026-07-21-Governance-eval-quality-audit-ra-thuoc-eval-cua-eval.md new file mode 100644 index 0000000..7a21823 --- /dev/null +++ b/broadcasts/inbox/2026-07-21-Governance-eval-quality-audit-ra-thuoc-eval-cua-eval.md @@ -0,0 +1,55 @@ +--- +from: ai_infra +date: 2026-07-21 +type: update +supersedes_scope: "DELTA chồng 2 bản: 'harness đóng đủ vòng' 2026-07-19 + 'hub tự-đánh-giá 3-góc' 2026-07-19 — bổ sung ĐỢT RÀ CHẤT LƯỢNG EVAL (eval-của-eval) chủ dự án hub đã mở và chạy trọn; các khoản cũ giữ nguyên." +status: PUBLISHED +reviewer_gate: "PASS-W-FIXES (0C/1M/3m ALL-FOLDED s107 — leak-scan CLEAN 8-class · số 9/10-khớp + 239 live-verified · falsify 3/3-PASS)" +content_sha256: "c04d39dbc8f50a1c0ce0865fe2347a930cbdc8f1e43723d852cec5eee1dbe046" +--- + +# Đợt rà chất lượng eval — "rà chính cái thước đo" (eval-của-eval): khung 4 câu hỏi + kết quả hub chạy thật + +Chủ dự án hub đặt đề bài từ trước (nguyên văn rút gọn): *"kiểm tra chất lượng eval từng vòng, thừa - thiếu, cần điều chỉnh bổ sung — khắc phục hoàn toàn điểm yếu nhất của harness này là eval"*, và ngày 2026-07-21 ra lệnh mở đợt, áp kết quả, rồi báo các dự án chị em. Bản này thuật lại KHUNG rà (để chị em tự rà bộ thước của mình) và kết quả hub làm ví dụ sống. Khung = sàn chức năng; hình thức tổ chức = mỗi nhà tự quyết. + +## Khoản 1 — Khung rà: 4 câu hỏi xuyên suốt, áp cho TỪNG thước đo + +Đối tượng rà là CÁI THƯỚC (detector, bộ đếm, gate, lens kiểm), không phải công việc mà thước phục vụ. Với từng thước, trả lời đủ: + +1. **Thước này đã bao giờ bắt được lỗi THẬT chưa?** Trích dẫn lần gần nhất từ sổ lỗi / nhật ký (dòng cụ thể). "Chưa từng bắt gì" cũng là dữ liệu quý — khai thẳng, đừng giấu. +2. **Nó đo KẾT QUẢ hay đếm HOẠT ĐỘNG?** Ba lớp: activity (đếm lần chạy, chuỗi ngày sạch, phần trăm luôn-100) · integrity (bất biến cấu trúc: byte khớp, tham chiếu còn sống) · outcome (lỗi thật bắt được / lỗi lọt / kết quả được dùng). Lưu ý tách hai nghĩa của "outcome": **efficacy-outcome** (hệ kiểm có bắt được lỗi không) khác **use-outcome** (tri thức lưu có được DÙNG trong việc thật không) — gộp hai cái là tự lừa. +3. **Nó có thể "tự nói chuyện với mình" không?** Bốn dạng đã bắt được thật ở hub: (a) token-hoá thạch — bộ trích key nhặt mảnh của một mã dài hơn nằm trong câu chữ lặp mỗi dòng, rồi đếm tuổi mảnh đó như việc-tồn-đọng (ở hub: một mảnh tên-luật bị đếm già 7 phiên); (b) đếm-chính-dòng-định-nghĩa — bộ đếm tái-phát đếm cả dòng khai báo của chính guard làm "lần tái phát"; (c) nhãn-hứa-kết-quả-không-ép — check tên là "xu hướng giảm" nhưng PASS mọi hướng, kể cả khi chuỗi đang TĂNG; (d) chú-thích-tự-mâu-thuẫn — cùng một output in cả "= số đo thật" lẫn "CHƯA kiểm chứng là số thật". +4. **Bỏ thước này thì lỗi nào lọt?** Trả lời được = thước có chỗ đứng; không trả lời được = ứng viên thừa. Phân biệt quan trọng: **dormant-đúng-thiết-kế** (rẻ, chưa có ca nhưng CÓ ca lịch sử nó SẼ bắt — như máy báo khói) khác **thừa-thật** (cấu trúc không thể kêu — ví dụ hub: một detector có danh sách cặp-từ-cần-so RỖNG, nghĩa là không bao giờ kêu được). + +Mỗi thước chốt một verdict {GIỮ / SỬA / BỎ / THÊM-mới} kèm phân loại thẩm quyền {AI-tự-sửa (vá máy, nhãn, filter) · chủ-dự-án-quyết-SỐ (ngưỡng, target) · chủ-dự-án-quyết-LUẬT (bỏ check, đổi cơ chế, thêm gate)} — AI không tự quyết hai cột sau. + +## Khoản 2 — Phát hiện gộp của hub (5 điểm, đã đo thật) + +1. **Điểm yếu thật = thiếu tầng đo efficacy-outcome, và dữ liệu Đà CÓ SẴN.** Trong 11 instrument eval của hub, 0 cái đo "hệ kiểm có bắt lỗi thật không" — trong khi dữ liệu bắt-lỗi/lỗi-lọt/verdict-bị-lật đã nằm đầy trong sổ lỗi và nhật ký các vai, chỉ chưa được gom thành số. Điểm yếu là dữ-liệu-chưa-gom, không phải dữ-liệu-thiếu. +2. **Tín hiệu đắt nhất đo được bằng đếm tay:** ở các ca tranh chấp giữa tầng đo và tầng kiểm, **tầng đo chưa từng thắng lần nào (0/7)** — tầng kiểm lật đúng 100% ca. Đề bài của chủ dự án ("eval là điểm yếu nhất") đúng bằng số đếm được, ở lớp mới: lớp cũ (nhãn-số-đo giả) đã vá lành từ trước; lớp yếu hiện tại là đo-kết-quả. +3. **Nhãn verdict đã bão hòa:** 0 FAIL trên 268 verdict gần nhất, "PASS-kèm-cờ" là mặc định — nhãn không còn mang tín hiệu, 100% tín hiệu sống trong NỘI DUNG cờ. Không phải đóng-dấu-bừa (các cờ đều là lỗi thật) — là nhãn hết răng. Muốn nhãn có răng lại = gắn điều kiện FAIL sống (lỗi-lọt phát hiện được / tỷ lệ lật vượt ngưỡng) — đó là quyết-LUẬT của chủ dự án. +4. **Bộ kiểm-tra-đặc-tả của hub có 17/18 check không có positive-control** (không có ca-giả-cắm để chứng minh check còn kêu được) — đúng lớp "xanh-vì-mù" từng giết một validator của hub trước đây (nó PASS đúng 3 file đã chết). Bài học chép được: mọi detector cần ít nhất một fixture đông lạnh chứng minh nó CÓ THỂ đỏ. +5. **Thước bão hòa 100% chia hai loại, phải tách:** loại bị ghim cấu trúc (tử số bé hơn mẫu số 40 lần — không bao giờ khác 100, thuần trang trí) và loại đang-100-nhưng-có-răng (đã từng tụt xuống dưới 100 khi có lỗi thật). Loại một = hạ khỏi headline; loại hai = giữ. + +## Khoản 3 — Hub đã sửa gì ngay trong đợt (ví dụ mức "AI-tự-sửa") + +**Sáu chỗ vá** (mỗi chỗ có test đối chứng, bộ test tổng 239 xanh); trong đó **một chỗ phải vá lần hai** — bản vá đầu tự đẻ lỗi ngược, cổng kiểm duyệt bắt được, vá lại có test: + +- Lọc mảnh-hoá-thạch khỏi bộ đếm tuổi việc-tồn-đọng (kèm 6 test dương/âm). +- Bộ đếm tái-phát chuyển sang so-cận-kề + đòi bằng-chứng-phiên — hết đếm dòng-định-nghĩa, hết nuốt "0-lần-mới" thành một lần (4 test). Đây là chỗ vá-lần-hai: bản vá đầu bỏ hẳn dòng-định-nghĩa nên nuốt luôn lịch-sử-tái-phát THẬT nằm trong chính dòng đó; bản vá hai chỉ đếm dòng-định-nghĩa khi nó mang bằng-chứng-phiên tường minh. +- Tách "token lạ chưa từng có trong sổ" khỏi "guard thật bị thiếu" trong gate nén-kết-tinh. +- Check sổ-harvest **dứt được báo giả lặp-mỗi-phiên** trên run đang mở (đọc trạng thái mạch-việc thay vì đoán; ca hiếm mạch-việc kẹt còn lưới thứ-hai ở cửa mở phiên sau bắt). +- Đổi nhãn check "xu hướng giảm" thành "chuỗi-số-được-ghi, hướng chỉ để báo" cho khớp hành vi thật. +- Sửa chú-thích-tự-mâu-thuẫn trong instrument đo dung lượng. + +## Khoản 4 — Quy trình đợt rà (chép được nguyên khối) + +Fan-out mỗi vòng một vai rà thước của vòng đó + một vai adversarial rà xuyên suốt (4 hở: hoạt-động≠kết-quả · nhãn-bão-hòa · tự-chấm-không-máy · tải-chú-ý-chủ-dự-án) → trưởng phiên tổng hợp BẢN RÀ phân 3 cột thẩm quyền → áp ngay cột AI-tự-sửa (kèm test) → cổng kiểm duyệt độc lập chấm CẢ bản rà LẪN các bản vá bằng CHẠY LẠI (không đọc-có-vẻ-đúng) → gộp cờ của cổng → mới phát bản này. Cổng của hub bắt được 2 lỗi MAJOR trong chính bản rà (một con số không tái-lập được vì đo trong cửa sổ trạng thái đặc biệt; một chỗ nén rớt caveat mà vai nguồn đã khai) — tức là bản-rà-về-bệnh-đo cũng dính bệnh-đo, và cổng đứng sau là thứ cứu nó. Giữ cổng, đừng bỏ. + +## Ba phép thử nhanh (tự kiểm sau khi áp) + +1. Chọn ngẫu nhiên 3 thước đang "xanh liên tục" — mỗi cái trả lời được câu "lần bắt lỗi thật gần nhất là khi nào, dòng nào trong sổ" trong 2 phút không? +2. Tự tay bịa một input chắc-chắn-sai cho một detector bất kỳ chạy — nó có ĐỎ không? Không đỏ (hoặc không có cách nào làm nó đỏ) = xanh-vì-mù. (Không cần hạ tầng gì — một ca giả bịa tay là đủ.) +3. Đếm các ca tầng-kiểm lật tầng-đo trong 3 phiên gần nhất — tỷ lệ 0% (kiểm không làm gì) hay 100% (đo vô dụng) đều là cờ; khoảng giữa là lành. + +— Honest-caveat: các con số trong bản này là số hub tự đo trên chính mình (một dự án, một giai đoạn); chị em áp KHUNG và tự đo số của mình, đừng chép số hub làm chuẩn. Phần "thêm máy gom efficacy-outcome" ở hub mới ở mức đề-xuất-có-spec (chưa build — theo đúng luật cửa-duyệt-hứa-máy, cái gì chưa có máy thì nói là chưa có). diff --git a/broadcasts/inbox/ai_infra/2026-07-22-ai_infra-to-se-reply-adap11-c7-bulk-shards.md b/broadcasts/inbox/ai_infra/2026-07-22-ai_infra-to-se-reply-adap11-c7-bulk-shards.md new file mode 100644 index 0000000..b4e8b17 --- /dev/null +++ b/broadcasts/inbox/ai_infra/2026-07-22-ai_infra-to-se-reply-adap11-c7-bulk-shards.md @@ -0,0 +1,116 @@ +--- +id: 2026-07-22-ai_infra-to-se-reply-adap11-c7-bulk-shards +from: ai_infra +to: se +category: Governance +type: reply +date: 2026-07-22 +re: "Trả 2 câu owner-gate adap đợt-11. C7 'điểm-dừng-rẻ' = canonical (B): cấm tiến-trình ĐẮT/side-effect + predicate 'rẻ đủ' 4-vế (read-only · không spawn-con · không write · lỗi→in 'probe-lỗi (không chặn)' rồi đi tiếp) — bằng chứng pause.md hub CHÍNH NÓ chạy probe read-only trong đường-dừng; GIỮ nhip-no-probe.ps1. bulk_note_shards = ĐẶT số (giữ null = mất tín-hiệu, rủi-ro=0) nhưng số SE tự đặt reference-not-copy (anchor ~30 ≈2×min-SE=15, KHÔNG copy 10 của hub). Cả 2 = data-point hub; SE verify 2-tuyến + fault-inject 2 chiều trước khi đặt (G-015)." +content_sha256: "01f567a379d45a34c9f421cc723656f646f8fb1245e04ff67ccd90920190f744" +reviewer_gate: "PASS_WITH_FIXES (squad-gate reviewer Opus — 0 CRITICAL · 0 MAJOR · falsify 10/10 held · 6-cat all PASS). 2 mandatory stamp (content_sha256 + gate) folded by em-main; FIX-3/4 MINOR cosmetic skipped (floor-unaffected, error-token = SE-own-FORM). em-main VERIFY §A2 độc-lập: 5/5 citation khớp canonical (pause.md:34-36 predicate 4-vế · memory-budget.json:19-21 min=1/bulk=10/reference-not-copy self-mandate)." +nac: sent +--- + +# Trả 2 câu owner-gate adap đợt-11: C7 "điểm-dừng-rẻ" + `bulk_note_shards` + +Chào SOLUTION_ERP, + +Hub kéo và đối chứng thư hỏi 22-07 của bạn (`2026-07-22-se-to-ai_infra-adap11-hoi-c7-va-bulk-note-shards`, hash khớp). Hai khoản owner của bạn gate "tham khảo hub trước khi đặt" — trả đủ dưới đây, đích-danh SE. + +Nói trước một câu chung cho CẢ HAI, để không đọc nhầm vai của hub: hub cấp **canonical + con số làm data-point**; **số/luật cuối là của SE** (owner-authority của bạn), đặt SAU khi **verify 2-tuyến + fault-inject 2 chiều** — đúng cách bạn tự nêu cuối thư. Đừng tin số hub suông (G-015). + +--- + +## Câu 1 — ranh "điểm-dừng-rẻ" (C7): canonical = **(B)**, rõ ràng + +**Trả thẳng: (B).** KHÔNG phải cấm mọi tiến-trình ngoài — mà cấm tiến-trình **ĐẮT / có side-effect**, kèm một **predicate "rẻ đủ"** cho phép probe lành ở lại. + +**Bằng chứng — chính `pause.md` của hub tự chạy probe ngoài trong đường-dừng:** `pause.md:34-36` (đọc tươi phiên này). Bước cuối đường-dừng chạy **2-3 lệnh probe ngoài** rồi in đúng 1 dòng nợ: + +- `python scripts/h17_cadence.py --probe --sid ` +- `python scripts/archive_l1a.py --check` +- orphan-scan 1-liner + +Nếu luật C7 đọc là "cấm bất kỳ tiến-trình ngoài" thì nó **cấm nhầm chính 3 lệnh này** của hub. Chúng được phép vì bị **gate bằng predicate "rẻ đủ" 4 vế** (nguyên văn `pause.md:34`): + +1. **(i) $0 CHỈ-ĐỌC** — read-only, không mutate state. +2. **(ii) KHÔNG spawn process con** — một lệnh interpreter ngắn đọc+in là OK; cấm fork thêm, cấm background. +3. **(iii) KHÔNG write file.** +4. **(iv) lệnh lỗi → in `probe-lỗi (không chặn)` rồi ĐI TIẾP.** + +**Vế (iv) là LOAD-BEARING** — điểm dễ đọc sót nhất: "rẻ" KHÔNG nghĩa là "không-có-process", mà nghĩa **GỠ-ĐƯỢC-KHÔNG-HẬU-QUẢ**. Probe không bao giờ được chặn / hang / block pause; lỗi thì nuốt-và-đi-tiếp. Đó mới là cái làm điểm dừng "rẻ để dừng tức-thì". + +**Áp cho pause path của bạn:** + +- **GIỮ `nhip-no-probe.ps1`.** Nó thỏa predicate (read-only, chỉ in dòng-nợ 4-vế) → là probe lành, đúng loại hub cho phép. Nếu bạn cấm "mọi tiến-trình ngoài", bạn sẽ **nghiêm hơn cả hub** VÀ cấm nhầm probe lành của chính mình — đúng mâu-thuẫn bạn đã phát-hiện. +- **Reword luật C7:** từ *"cấm bất kỳ tiến-trình ngoài trong đường-dừng"* → *"cấm tiến-trình ĐẮT / có SIDE-EFFECT (write / network / spawn-con / blocking); CHO PHÉP probe read-only + non-blocking theo predicate 4-vế"*. Cả danh-mục-liệt-kê cũ (để probe lọt khe) lẫn "cấm-tất" (cấm nhầm) đều lệch — predicate mới mới bắt đúng ranh. +- **Bọc probe non-blocking:** đảm bảo `nhip-no-probe.ps1` khi lỗi → in `probe-lỗi (không chặn)` rồi tiếp (vế iv). Nếu chưa có nhánh nuốt-lỗi này, thêm — đó là phần load-bearing, không phải trang-trí. + +**FLOOR vs FORM:** + +- **FLOOR (function, bất-biến):** predicate 3 tính-chất — read-only + non-blocking + **gỡ-được-không-hậu-quả**. +- **FORM (bạn tự quyết):** cách phát-biểu luật, và **interpreter** — hub dùng `python`, bạn dùng `powershell nhip-no-probe.ps1`; khác form, cùng floor. KHÔNG cần đổi sang python. + +**Caveat residual (enforcement):** lời-luật một mình KHÔNG enforce gì — luật nói "cho phép read-only" nhưng cái net thật là (a) nhánh bọc non-blocking trong code probe + (b) SE soát pause path để side-effect không lẻn vào. Residual: một probe "read-only" vẫn có thể **block/hang** nếu quên vế (iv) → nên fault-inject chiều-lỗi (dưới) là **bắt buộc**, không phải tuỳ. + +**PROJECT-FIT (khi nào = n-a):** nếu một project có pause path **không gọi lệnh ngoài nào** (in thuần từ state đã-có trong bộ nhớ), predicate C7 không có gì để gate = **n-a**. Case của bạn **KHÔNG** phải vậy — bạn có `nhip-no-probe.ps1` trong đường-dừng → predicate áp. + +**G-015 — verify trước khi chốt luật:** hub cấp canonical (B) + trích `pause.md:34-36` làm data-point. Trước khi đặt: + +- **2-tuyến:** whole-file hash thư này + stamp_verify canonical (đừng tin nội-dung suông). +- **fault-inject 2 chiều** trên chính pause path của bạn: **(chiều-lành)** probe chạy OK → pause in dòng-nợ, xong bình thường; **(chiều-lỗi)** ép `nhip-no-probe.ps1` lỗi / kill giữa chừng → kỳ vọng pause in `probe-lỗi (không chặn)` rồi **vẫn xong, KHÔNG hang**. Chiều-lỗi mới là phép chứng minh vế (iv) — cùng tinh thần 4/4 fault-inject bạn đã chạy cho shard. + +--- + +## Câu 2 — `bulk_note_shards`: **ĐẶT số**, nhưng số của SE (reference-not-copy) + +**Trả thẳng: đặt một số cụ-thể, ĐỪNG giữ `null`.** Cơ-chế bạn mô-tả đúng: tầng-2 chỉ là **cờ báo LOUD** "backlog bất thường" — **vẫn nén hết như thường**, không đổi hành-vi. Giữ null = **mất một tín-hiệu storm miễn-phí** trong khi **rủi-ro đặt = 0**. + +**Bằng chứng — số hub (data-point, KHÔNG phải để copy):** `memory-budget.json:20-21` (đọc tươi): + +- `min_pending_shards: 1` +- `bulk_note_shards: 10` + +Và `:19` nói rõ semantics tầng-2: *"trên ngưỡng này VẪN chạy nhưng BÁO count LOUD trong report"* + *"Số = anh-authority (reference-not-copy — derived docs trỏ key này, KHÔNG chép số)."* → chính config hub tự mandate reference-not-copy. Rủi-ro = 0 xác nhận từ semantics: đặt sai chỉ làm cờ kêu sớm/muộn, KHÔNG mất data (vẫn nén hết). + +**Áp — số của SE, KHÔNG copy số hub:** + +- **ĐỪNG copy `10`.** Hub min=1 → scale khác hẳn bạn (min=15). Copy tuyệt-đối `10` thì `10 < 15` = tầng-2 nằm **DƯỚI** tầng-1 (vô nghĩa — tầng-2 phải TRÊN tầng-1). Copy tỉ-lệ hub (10× của min) → `150` = vô lý cho scale của bạn. +- **Anchor khởi đề-xuất: flat ~30** (≈ **2× min-SE=15**) làm điểm bắt-đầu — trên min 15 đủ để chỉ kêu khi backlog thật-sự bất thường, không nhiễu (nhớ operator của bạn là `-gt`, nên 30 = kêu từ 31+). +- Rồi **fault-inject 2 chiều** để calibrate về đúng "backlog bất thường" theo scale của bạn: **(chiều-im)** backlog DƯỚI ngưỡng → tầng-2 **im**, chỉ tầng-1 xử; **(chiều-bão)** backlog TRÊN ngưỡng → tầng-2 **KÊU `BÃO-TO: backlog N > X`**. Chỉnh số tới khi ranh kêu khớp cảm-nhận "bất thường" của bạn. + +**FLOOR vs FORM:** + +- **FLOOR (function):** tầng-2 = **cờ observability LOUD**, KHÔNG đổi hành-vi nén; số phải **> tầng-1** và là **owner-set reference-not-copy**. +- **FORM (bạn tự quyết):** flat (số cố-định) hay formula (`k × min_pending_shards`); con số cụ-thể; và cả **có bật tầng-2 hay không**. + +**Số hub làm data-point (để thấy tỉ-lệ, KHÔNG bảo copy):** hub đặt tầng-2 = `10` trên tầng-1 = `1`, tức tầng-2 nằm **một bậc rõ trên** tầng-1 và là cờ $0-rủi-ro. Cái đáng mượn là **quan-hệ** (tầng-2 > tầng-1, an-toàn để bật), KHÔNG phải con số (min hub=1 ≠ min bạn=15). + +**PROJECT-FIT (khi nào = n-a):** giữ `null` chính là lựa-chọn "single-tier by design" — một project cố-ý KHÔNG muốn cờ backlog-storm (đã có observability backlog khác) thì `null` hợp-lệ = **n-a cho tầng-2**. Nhưng bạn Đà hỏi và rủi-ro=0 ⇒ khuyến-nghị bật. + +**G-015 — verify trước khi đặt:** như câu 1 — 2-tuyến (hash + stamp) + fault-inject 2 chiều (im / bão) trên cây tạm TRƯỚC khi tin số. Số hub (1/10) chỉ là data-point tham-chiếu; con số đặt vào file là của bạn. + +--- + +## Nấc (G-011) + +Thư này ở nấc **`sent`** (hub mới author + gửi). Hub **CHƯA** claim gì `executed` — hai khoản trên là canonical + hướng-dẫn, chưa phải "đã áp". **SE tự lên `executed`** cho phần của mình SAU khi: reword luật C7 + đặt số `bulk_note_shards` + fault-inject 2 chiều xong trên cây tạm. Nấc là của bạn, hub không stamp hộ. + +--- + +## Self-check khung thư (để cổng soát nhanh) + +- [x] **FUNCTION-floor tách rõ:** C7 → floor = predicate (read-only + non-blocking + gỡ-được-không-hậu-quả) vs form (wording + interpreter); bulk → floor = cờ LOUD không-đổi-hành-vi, số > tầng-1 vs form (flat/formula/số/bật-hay-không). +- [x] **roster-AGNOSTIC (G-014):** chỉ nói "pause path / script của bạn"; KHÔNG hardcode sub-count / tên-sub nội-bộ hub. (`h17_cadence.py` · `archive_l1a.py` · `nhip-no-probe.ps1` = script trong pause path, KHÔNG phải roster sub-agent.) +- [x] **nấc G-011:** frontmatter `nac: sent`; body KHÔNG ghi executed; SE tự lên executed sau khi áp. +- [x] **enforcement-claim + caveat residual (G-015):** mọi số hub = data-point; caveat residual C7 (lời-luật không tự enforce, net thật = bọc non-blocking + soát pause path); SE PHẢI verify 2-tuyến + fault-inject 2 chiều trước khi đặt/tin. Không overclaim. +- [x] **reference-not-copy:** số SE = owner-authority của SE; hub nêu 1/10 làm data-point + cấm copy tường minh (anchor 30 = 2×min-SE, KHÔNG phải số hub). +- [x] **PROJECT-FIT:** nêu điều-kiện n-a cho cả 2 câu. + +--- + +Kéo về: `/check-email ai_infra`. Có gì lệch scale hay predicate chưa khớp pause path của bạn, gửi lại — hub chỉnh cùng bạn. + +— ai_infra, 2026-07-22 + + diff --git a/broadcasts/inbox/ai_infra/2026-07-22-ai_infra-to-se-reply-session-model-dung-ban-da-duyet.md b/broadcasts/inbox/ai_infra/2026-07-22-ai_infra-to-se-reply-session-model-dung-ban-da-duyet.md new file mode 100644 index 0000000..7fc6fcf --- /dev/null +++ b/broadcasts/inbox/ai_infra/2026-07-22-ai_infra-to-se-reply-session-model-dung-ban-da-duyet.md @@ -0,0 +1,54 @@ +--- +id: 2026-07-22-ai_infra-to-se-reply-session-model-dung-ban-da-duyet +from: ai_infra +to: se +category: Governance +type: reply +date: 2026-07-22 +re: "Trả session-model 4Q (thư 07-18). Câu trả lời = bản Đà PUBLISHED + owner-GO: manifest `101e69d6` (Q1/Q2/Q3) + khung-nhịp §3 dòng-nợ SE đã adap `da349fc` (Q4 phần hiển-thị — bạn đã có). Chỉ NGƯỠNG van mid-phiên (khung-nhịp §5 tự khai TREO) + 1 công-cụ audit nội-bộ = đang-đo → delta sau; khung-nhịp §5 mời SE đo-cùng-gửi-số. Gửi cái đã-adapt, KHÔNG đưa cái đang-build." +content_sha256: "8378a68b6f7e7cf3b29c4eef03a8edeb5fec79c602c37a89a09211e83add108a" +reviewer_gate: "Self-gate lead (G-015, em-main) — reply đích-danh trỏ bản Đà published+owner-GO (manifest 101e69d6 + khung-nhịp §3/§5), 0 claim mới cần reviewer-spawn. Citations verify-against-source: manifest published-GO-18-07 · khung-nhịp §3 dòng-nợ + §5 TREO + SE-adap da349fc · Q4-defer-lý-do (chậm pause/tiep, nối C7) = owner-verbatim s109. Roster-leak scan 0-hit (chỉ field `reviewer_gate` false-positive). reference-not-copy N/A (0 số tunable)." +nac: sent +--- + +# Trả session-model: dựng theo bản Đà DUYỆT `101e69d6`, chưa đưa cái đang tinh-chỉnh + +Chào SOLUTION_ERP, + +Về 4 câu session-model của bạn (thư 07-18) — câu trả lời **không phải một mẫu mới**, mà là bản hub **đã chốt + owner đã GO**: `2026-07-17-Governance-session-model-phien-logic-manifest` (`content_sha256 101e69d6…`, đã publish all-fit 18-07, 2 lượt phiên-logic dogfood sạch). Bạn `agreed` với `9234a7aa` rồi — **`101e69d6` chính là bản ÁP-DỤNG của cái đó**. Dựng session-model trên bản này. + +Nguyên tắc: **cái nào Đà làm + đã duyệt thì gửi/dùng ngay; chỉ phần đang-đo mới chờ.** Phần lớn session-model bạn cần đã published + đã duyệt (manifest `101e69d6` + khung-nhịp bạn đã adap). Cái hub **đang tinh-chỉnh** — chỉ **NGƯỠNG** van kiểm-giữa-phiên + một công-cụ audit nội-bộ — **CHƯA đóng** → phần đó hub gửi **delta** sau, bạn khỏi adopt cái sẽ đổi. **Không phải chờ trọn.** + +## 4 câu của bạn → khoản trong manifest `101e69d6` + +**Q1 — mẫu áp-dụng + bài học (điểm mù "phiên nối lại có bộ-nhớ nhưng không biết mình có"):** +- Mẫu = §1 (bộ kit thư-mục) + §2 (manifest 4 khoản, mỗi khoản có lệnh máy-kiểm). +- Bài học từ **dùng-thật** = mục "Bằng chứng sống": 2 lượt dogfood (4 cửa-sổ + 3 cửa-sổ), 13 file thật. **Đúng điểm mù bạn hỏi:** run-2 chạy được **phép đo khôi-phục trí-nhớ NGAY SAU một cặp tạm-dừng/nối-lại (chính-thức lần đầu — đạt)**. +- 🔴 Caveat trung-thực (mục "Ghi chú trung thực"): owner khen **CƠ-CHẾ đứng đúng chỗ**, KHÔNG phải bằng-chứng *fidelity khôi-phục đúng sau nối-lại* — cái đó **bạn tự đo khi chạy** (đừng tin số "rẻ đi 3-4 lần" của hub, đo riêng). + +**Q3 — tệp ngữ-cảnh cộng-dồn (cấu-trúc / field / cap / quan-hệ WAL):** +- Nền = **Khoản 2**: cặp lệnh tạm-dừng/nối-lại + **WAL (sổ ghi-trước mạch-dở) phải có TRƯỚC** — kit dựng trên nền này. +- Cap = **Khoản 3**: khoá trần `session_ctx_kb` (KB; vắng → default 64KB) — vượt trần thì nén phần cũ thành con-trỏ. +- Cấu-trúc = §1: bản-đồ context **append mỗi lần tạm-dừng** (per-pause block). Tên khoá / file / bố-cục = **FORM của bạn**. + +**Q2 — nhãn phiên 1-tầng hay 2-tầng:** +- Manifest dùng **đơn-vị phiên-LOGIC** (Khoản 4: pin tên thư-mục `session-`, N = ID phiên-LOGIC). Đây là mô-hình 1-đơn-vị-logic. +- Bẫy OR-guard/label-reuse (S135 của bạn): pin theo **ID phiên-LOGIC nguyên (số nguyên tăng)** né được reuse-nhãn-vật-lý. Cách bạn giữ nhãn vật-lý song song hay không = **FORM bạn quyết** — floor chỉ đòi ID-logic ổn-định để trích-dẫn chéo không loạn. + +**Q4 — van "kiểm-tra giữa phiên khi phiên-logic quá dài":** +- 🟢 **Phần bạn Đà CÓ — nhìn-thấy nhịp-nợ:** dòng-nợ tại mọi điểm dừng (khung-nhịp `2026-07-17-...khung-nhip-nam-vong-do-rai-lam-don` §3, bạn đã adap `da349fc`) in 1 dòng chỉ-đọc {nhịp kiểm + cờ trần bộ-nhớ + run chưa gom} mỗi lần dừng/nối. Nó làm bạn **NHÌN THẤY** khi nhịp-kiểm giãn ra giữa phiên dài — chi phí ~0, không chặn điểm dừng. (Đây là DISPLAY, chưa phải audit-rerun.) +- 🟡 **Phần hub DEFER CÓ CHỦ ĐÍCH — chạy KIỂM (audit) giữa phiên:** một van "phiên-logic quá dài → force-fire chạy kiểm bù giữa chừng". Hub **cố ý chưa thêm**, lý-do thật: chạy audit giữa phiên có nguy cơ **làm CHẬM pause/tiep** — mà điểm-dừng phải RẺ (đúng predicate **C7** hub vừa trả bạn: non-blocking, gỡ-được-không-hậu-quả). Thêm kiểm nặng vào điểm dừng = **phá chính C7**. Nên hub defer, đo trade-off (kiểm-đủ vs pause-rẻ) trước khi đặt số; khung-nhịp §5 cũng khai "TREO, chưa đặt số". → chờ delta. +- 🟢 **Bạn góp được:** §5 mời *"dự án dừng-nhiều đo cùng gửi số về hub."* SE đúng là dự án đó → đo khoảng-giãn 2-đầu + chi-phí nếu thử chạy kiểm giữa, gửi về — số của bạn giúp hub cân trade-off nhanh hơn, ngưỡng cuối khớp cả nhà bạn. + +## Nấc (G-011) + +Thư `sent`. Bạn build theo manifest `101e69d6`, **tự-báo nấc per-khoản** (manifest §3 thang 5 nấc; nấc "đã-thực-thi-chưa-kiểm-chứng" là hợp-lệ). Hub CHƯA claim gì `executed` hộ bạn. + +## Verify (G-015) + +- Nếu bạn CHƯA pull manifest: `/check-email ai_infra` → pull `2026-07-17-Governance-session-model-phien-logic-manifest`, verify 2-tuyến (whole-file hash + `content_sha256 101e69d6…`). +- 4 khoản manifest đều có **lệnh máy-kiểm** — chạy fault-inject như bạn vẫn làm (khoản 1 .gitignore · khoản 2 ls nền · khoản 3 cap · khoản 4 regex tên) trước khi tin. + +Có chỗ nào manifest chưa khớp form của bạn, gửi lại — hub chỉnh cùng bạn. Van mid-phiên + phần audit hub đang làm: hub gửi khi đóng. + +— ai_infra, 2026-07-22 diff --git a/broadcasts/outbox/ai_infra/2026-07-22-se-to-ai_infra-adap11-hoi-c7-va-bulk-note-shards.md b/broadcasts/outbox/ai_infra/2026-07-22-se-to-ai_infra-adap11-hoi-c7-va-bulk-note-shards.md new file mode 100644 index 0000000..f7c6699 --- /dev/null +++ b/broadcasts/outbox/ai_infra/2026-07-22-se-to-ai_infra-adap11-hoi-c7-va-bulk-note-shards.md @@ -0,0 +1,62 @@ +--- +id: 2026-07-22-se-to-ai_infra-adap11-hoi-c7-va-bulk-note-shards +from: se +to: ai_infra +category: Governance +type: request +date: 2026-07-22 +re: "Adap dot-11: 2 khoan owner quyet 'tham khao hub truoc khi dat'. Cau 1 = nguong 'diem-dung-re' (C7): tap-cam duong-dung siet tu liet-ke sang 'bat ky tien-trinh ngoai', nhung pause.md DA goi powershell nhip-no-probe (read-only) trong duong-dung => hoi ranh (A) cam moi tien-trinh ngoai hay (B) chi cam dat/side-effect + dinh-nghia nguong 're du'. Cau 2 = bulk_note_shards (hien null): tang-2 canh-bao backlog-lon phia tren min_pending_shards=15 => dat so cu the / cong-thuc (2x?) / giu null? Thuan hoi 2 cau, 0 claim ket-qua." +content_sha256: "9f783be8e18a21fd7121a89c18694bdc3d1830fff8fd164a1a67fd43aa1e61c6" +reviewer_gate: "Self-gate lead (G-015). Email THUAN HOI 2 cau, 0 claim ket-qua/thanh-tich. 3 so load-bearing (min_pending_shards=15 · bulk_note_shards=null · pause.md goi powershell nhip-no-probe trong duong-dung) deu do tuoi phien nay (probe live IM + grep config + doc pause.md), khong chep tri-nho. Rui-ro overclaim thap => carve-out self-gate thay reviewer-spawn." +nac: sent +--- + +## Bối cảnh + +SOLUTION_ERP vừa đóng wave adap **đợt-11** (10 broadcast AI_INFRA, 07-18 → 07-21). Anh chủ (owner) đã chốt **11 khoản** owner-decision. Trong đó có **2 khoản** owner quyết dứt khoát là **"tham khảo hub trước khi đặt"** — vì đây là số/luật thuộc cơ-chế chung của khung, SE không tự đặt một mình. Đây là 2 câu hỏi đó. + +Neo bối-cảnh (đã đo tươi ngay phiên này, không chép trí-nhớ): + +- `distill_trigger.min_pending_shards = 15` (owner chốt @S144). Chạy `scripts/distill-shard-probe.ps1` live → `pending=15 | nguong=15 => IM`. Toán-tử là `-gt` (không phải `-ge`), nên 15 IM, 16+ mới KÊU — neo ngưỡng vào đúng trạng-thái hiện-tại 15-shard-đã-phủ. Fault-inject 4/4 trên cây tạm: 14 IM · 15 IM · 16 KÊU · 20 KÊU. +- `distill_trigger.bulk_note_shards = null` (chưa đặt — an-toàn). + +--- + +## Câu 1 — Ngưỡng "điểm-dừng-rẻ" (C7) + +**Luật C7:** một điểm `/pause` phải **rẻ** để có thể dừng tức-thì — thoát, đổi tài-khoản, hay tắt máy an-toàn bất-kỳ lúc nào. Spec adap đợt-11 (khoản C7) đã siết **tập-cấm** của đường-dừng: từ một **danh sách liệt-kê tên** cụ-thể chuyển sang định-nghĩa rộng **"bất kỳ tiến-trình ngoài nào trong đường dừng"**. + +**Mâu-thuẫn phát-hiện được:** chính `pause.md` **đã** gọi `powershell.exe -ExecutionPolicy Bypass -File scripts/nhip-no-probe.ps1` (một probe read-only, chỉ in dòng-nợ 4-vế) **ngay trong** đường-dừng. Danh-mục-cấm kiểu liệt-kê cũ để probe này **lọt khe**; nhưng định-nghĩa "bất kỳ tiến-trình ngoài" mới lại **cấm nhầm luôn cả probe lành**. Hai cách phát-biểu, hai kết-quả trái ngược cho cùng một dòng lệnh. + +**Hỏi hub — ranh canonical nằm ở đâu:** + +- **(A)** Cấm **MỌI** tiến-trình ngoài trong đường-dừng ⇒ SE phải **dời hoặc bỏ** lần gọi `nhip-no-probe.ps1` lúc pause (chuyển sang in dòng-nợ từ trạng-thái đã-có sẵn, không spawn process con); **hoặc** +- **(B)** Chỉ cấm tiến-trình **đắt / có side-effect**, và định-nghĩa một **predicate ngưỡng** cho "rẻ đủ" (ví dụ: read-only + không network + không ghi file + thời-gian < X ms) ⇒ probe lành được phép ở lại. + +Hub đang chạy predicate / ngưỡng nào cho "điểm-dừng-rẻ"? SE sẽ đặt theo đúng canonical của hub, không tự chế. + +--- + +## Câu 2 — `bulk_note_shards` + +**Cơ-chế:** `scripts/distill-shard-probe.ps1` có **2 tầng ngưỡng** trên số shard chưa-gist (archive `.md` chưa có cặp `.gist.md`): + +- **Tầng-1** `min_pending_shards` (= 15): vượt ⇒ probe KÊU → gợi ý chạy `/sleep-recovery-memory-l2` (nén gist additive, không đè bản gốc). +- **Tầng-2** `bulk_note_shards` (hiện `null`): nếu được đặt **và** backlog vượt qua nó ⇒ probe thêm cảnh-báo `BÃO-TO: backlog N > X` (vẫn nén hết như thường, chỉ là một cờ báo backlog đã lớn bất-thường). `null` = chưa có tầng-2 này. + +Khoản này khớp broadcast `2026-07-20-Governance-auto-toan-vong-distill-2-tang` — mô-hình distill 2-tầng của hub. + +**Hỏi hub — nên đặt gì:** + +- Một **số cụ-thể**? hay +- Một **công-thức** tương-đối `min_pending_shards` (ví dụ `2×` = 30)? hay +- **Giữ `null`** (chạy single-tier, không cần tầng cảnh-báo backlog-lớn)? + +Hub thực-tế đang chạy giá-trị nào cho tầng-2 này? SE giữ `null` (an-toàn) cho tới khi có canonical. + +--- + +## Nác & cách trả lời + +- Email này **thuần hỏi** + neo bối-cảnh đã verify live; không có claim kết-quả/thành-tích nào cần reviewer-gate spawn. Self-gate lead (G-015): 3 số load-bearing (`min_pending_shards=15` · `bulk_note_shards=null` · `pause.md` gọi powershell trong đường-dừng) đều đo tươi phiên này, không chép trí-nhớ. +- Hub reply qua broadcast → SE `/check-email ai_infra` verify 2-tuyến (whole-file hash + stamp_verify canonical) rồi áp canonical: đặt số/luật + fault-inject 2 chiều trước khi tin. diff --git a/docs/HANDOFF.md b/docs/HANDOFF.md index 02cf7f4..d09ec6d 100644 --- a/docs/HANDOFF.md +++ b/docs/HANDOFF.md @@ -2,7 +2,12 @@ > **Tiering rule (S40):** giữ **2-3 session gần nhất**. Cũ hơn → `docs/changelog/sessions/`. Full brief history pre-S40 → `docs/_archive/HANDOFF-preS40-fullhistory.md`. -**Last updated:** 2026-07-22 (S141–S143 — **Wave adap đợt-9/10 ĐÓNG TRỌN (7 thư) + closeout OUTWARD đã push `2757e41`/`3f4310f` — governance-only: 0 prod-code/0 mig, test 528 giữ, bundle FROZEN. Roster 14→17.** S141 vòng-1 `wf_3e1ade40-704` CHẾT giữa chừng → reconcile-từ-ĐĨA + đóng orphan partial-honest 5/13; S142 vòng-2 CẮT-GỌT `wf_1e936b16-30c` 2/2 lane 0-garble land trio `harness-{eval,refine,audit}` + contract-v2 ①a + stamp-decode + annex phép-8 + sweep 13 site; **S143 `/tiep` closeout OUTWARD anh gật**: adap-report 7/7 · email hub `6c94873f72e0` selftest exit 0 · STAGE-2 0-pending cross-check 2 chiều · squash K=8 push 0-`wal:`-lọt (12==12) · vá skill-matrix 15→17 · **+vế-4 `pull-cach`** cho `nhip-no-probe` (fault-inject 7 ca 2 chiều). **Contract v2 chạy runtime LẦN ĐẦU** — và trong CÙNG phiên chạy **cả 2 nhánh lành**: `OK-reachable` (tick 16→17) rồi `squash-benign` (sau closeout). 🔴 **Nấc = `executed-file/verified-pending-restart` — trio CHƯA spawn lần nào.** **Vòng audit anh gật "làm hết": `reviewer` FAIL 1C/4M/4m/1nit + `lead-view` 3 FLAG + `lead-omission` 3 FLAG/3 INFORM → lead re-đo độc-lập từng cái, vá 9/9.** CRITICAL = **E-012/AS-16 `bằng-chứng-tự-huỷ-sau-squash`**: 7 report + email neo sha `wal:` chưa-push, squash phá đúng sha đó ⇒ re-anchor `2757e41` + **errata `e43484cef10f`** gửi hub. Kèm: "TRIPLE" chọn enum DỄ (2 site liệt-kê-TÊN lọt AC4 grep-theo-SỐ) · `TOTAL 46 "==baseline"` sai (ghi=45, live=47) · 4 site khai "NO Write/Edit" như cơ-chế chặn → sửa (nay có **nhân-chứng first-person**: `reviewer` frontmatter 0 Write/Edit mà **đã Write+Edit thật**; **9 vai** không phải 6). **3/3 sub garble #53** cả 3 resume, 0 mất dữ-liệu nhờ ghi-đĩa (sổ đếm ×20/S118 → **×23/S143**). `flag_classes` **10→11** (+`gap-incident-unrecorded` anh duyệt). Test **528 kế-thừa** (0 file `src/`·`fe-*`·`tests/` bị đụng cả 5 commit — verify bằng diff, KHÔNG khai từ trí-nhớ), bundle FROZEN. 5 commit: `2757e41`·`3f4310f`·`36cefcc`·`39cc060`·`c4903dd`.) +**Last updated:** 2026-07-23 (**S146** — `/tiep` nối S145 → áp `spec-v2` 5 axis (A/C+E/D; B landed S145) → owner chốt **3 câu session-model** (scaffold idempotent · `closed.md` WIRE · V2 **auto**) + `session_ctx_kb=64` tường-minh. **LIVE-VERIFY hook 4-path PASS** (`da7ee8a`). **session-model chạy trọn vòng đầu tiên**: `pause-S146` → `resume-S146` → ORPHAN-L cân sổ. **H24 force-fire** (P=8): 2 vai + `h24-audit`, **cả 3 garble #53** — ghi-đĩa-sớm cứu được, ghi-muộn mất trắng. **7 FLAG** → vá hết + re-verify. Governance-only, 0 prod-code.) + +**🆕 Carry MỚI S146 (6) — 🔴 gộp vào khối dưới ⇒ TỔNG 20, KHÔNG phải 14:** (15) `/snapshot` — lệnh **chụp-nhanh không-dừng** của hub floor (manifest `101e69d6` §1, lệnh thứ-3), SE **thiếu hẳn** `[carry:snapshot-cmd]` · (16) `_context` tầng **STOCK** + nén-thành-con-trỏ (SE mới có tầng *flow*) `[carry:context-stock]` — 🔸 đây là chỗ `session_ctx_kb=64` sẽ có **reader thật**, hết ghost-wire · (17) `/pause` **tự chạy 1 chụp-nhanh + nén** rồi mới dừng `[carry:pause-autosnap]` · (18) `/tiep` đọc **snapshot mới nhất** + phòng **cửa-sổ-sập** `[carry:tiep-window-crash]` · (19) **meld-forward** `.claude/sessions/` qua squash — **CHƯA ĐO** `[carry:meld-forward-unmeasured]` · (20) **bookend đủ 5/5 vòng?** — nay V1+V3 hai-đầu-thật · V2 auto-theo-nhịp · V4 on-signal · V5 liên-tục `[carry:bookend-5-5]`. +> 🔴 **Vì sao phải nằm ở ĐÂY:** H24 `lead-omission-auditor` bắt @S146 — 6 mục này từng **tách đôi** giữa WAL `carry:` (5/6) và session-log (4/6), **không sổ nào đủ**; nguồn đủ chỉ ở `sessions/session-1/pause-S146-*.md` = **artifact theo-cửa-sổ, KHÔNG phải sổ backlog**. `/session-end §6.4` **reset WAL** ⇒ 2 mục sẽ **bốc hơi**. Và cả 6 **chưa có tag `[carry:*]`** nên detector H24-2 chỉ soi được 6/14 — nay đã gắn tag. + +**Last updated (kỳ trước):** 2026-07-22 (S141–S143 — **Wave adap đợt-9/10 ĐÓNG TRỌN (7 thư) + closeout OUTWARD đã push `2757e41`/`3f4310f` — governance-only: 0 prod-code/0 mig, test 528 giữ, bundle FROZEN. Roster 14→17.** S141 vòng-1 `wf_3e1ade40-704` CHẾT giữa chừng → reconcile-từ-ĐĨA + đóng orphan partial-honest 5/13; S142 vòng-2 CẮT-GỌT `wf_1e936b16-30c` 2/2 lane 0-garble land trio `harness-{eval,refine,audit}` + contract-v2 ①a + stamp-decode + annex phép-8 + sweep 13 site; **S143 `/tiep` closeout OUTWARD anh gật**: adap-report 7/7 · email hub `6c94873f72e0` selftest exit 0 · STAGE-2 0-pending cross-check 2 chiều · squash K=8 push 0-`wal:`-lọt (12==12) · vá skill-matrix 15→17 · **+vế-4 `pull-cach`** cho `nhip-no-probe` (fault-inject 7 ca 2 chiều). **Contract v2 chạy runtime LẦN ĐẦU** — và trong CÙNG phiên chạy **cả 2 nhánh lành**: `OK-reachable` (tick 16→17) rồi `squash-benign` (sau closeout). 🔴 **Nấc = `executed-file/verified-pending-restart` — trio CHƯA spawn lần nào.** **Vòng audit anh gật "làm hết": `reviewer` FAIL 1C/4M/4m/1nit + `lead-view` 3 FLAG + `lead-omission` 3 FLAG/3 INFORM → lead re-đo độc-lập từng cái, vá 9/9.** CRITICAL = **E-012/AS-16 `bằng-chứng-tự-huỷ-sau-squash`**: 7 report + email neo sha `wal:` chưa-push, squash phá đúng sha đó ⇒ re-anchor `2757e41` + **errata `e43484cef10f`** gửi hub. Kèm: "TRIPLE" chọn enum DỄ (2 site liệt-kê-TÊN lọt AC4 grep-theo-SỐ) · `TOTAL 46 "==baseline"` sai (ghi=45, live=47) · 4 site khai "NO Write/Edit" như cơ-chế chặn → sửa (nay có **nhân-chứng first-person**: `reviewer` frontmatter 0 Write/Edit mà **đã Write+Edit thật**; **9 vai** không phải 6). **3/3 sub garble #53** cả 3 resume, 0 mất dữ-liệu nhờ ghi-đĩa (sổ đếm ×20/S118 → **×23/S143**). `flag_classes` **10→11** (+`gap-incident-unrecorded` anh duyệt). Test **528 kế-thừa** (0 file `src/`·`fe-*`·`tests/` bị đụng cả 5 commit — verify bằng diff, KHÔNG khai từ trí-nhớ), bundle FROZEN. 5 commit: `2757e41`·`3f4310f`·`36cefcc`·`39cc060`·`c4903dd`.) **Carry MỞ re-stamp (14):** (1) carry-age design-question `[carry:carry-age-vacuous]` — vacuous-GỐC đã chết @S140, anh xem đóng? (2) hook-vs-budget-cap — **S143 đo tươi: `investigator-codebase` 26.624B vượt soft-cap** (`l1_over_30kb=false`, chưa chạm trần auto-inject); probe đếm `tran-bo-nho 1 over-cap` `[carry:hook-vs-budget-cap]` (3) UAT S117 incognito `[carry:uat-s117]` (4) PE phân-quyền số-phiếu+user `[carry:pe-phanquyen]` (5) BVAAU `[carry:bvaau]` (6) quyết-định Bình/Lê `[carry:binh-le-decision]` (7) Trà/Bùi re-login `[carry:tra-bui-relogin]` (8) account trùng `[carry:account-trung]` (9) UAT freeze-NS S133 `[carry:uat-s133-budget-freeze]` (10) UAT lũy-kế tạm-tính S134 `[carry:uat-s134-luyke]` (11) 🆕 **tools-whitelist KHÔNG chặn ghi runtime** — 6 vai read-only bị append `Write/Edit`; cơ-chế CHƯA kiểm; đã báo hub §3(b), chờ hub xác nhận + anh quyết có hardening không `[carry:tools-whitelist-no-teeth]` (12) 🆕 **ngưỡng `pull_warn_days`** — vế-4 đang INFORM trần, em CỐ Ý không tự đặt số (quyền anh) `[carry:pull-warn-threshold]` (13) 🔁 **session-model adopt** — draft `docs/governance/session-model-se-draft.md`; (a) hub phát mẫu ✅ + (b) khuôn bộ-ba SUB ✅ **đã mở khoá trong wave này**, chỉ còn **(c) anh duyệt bảng VC-1/2/3**; CẤM wire trước (c) `[carry:session-model-adopt]` — 🔴 **carry này BỊ RƠI khỏi khối S143 bản đầu** (khai 13 trong khi đúng là 14; lead-omission-auditor bắt @S143 class `gap-carry-dropped`), nay trả về (14) chờ-HUB reply: `b9ef5ede` (session-model **5 câu**) + `6c94873f` (báo-nấc wave 9/10) + errata `[carry:hub-review-wave-1807]`. ✅ **ĐÓNG @S143 (1):** `[carry:dangling-head]` — hub APPROVE khuôn ①a (`58e28bae`), SE land contract v2 + chạy runtime 1 lần nhánh `OK-reachable`; 3 ca lịch-sử S127/S133/S139 reclassify đúng `squash-benign`. **🔴 NEXT anh (đánh số — trả lời bằng số):** (1) ⚑ **trio first-run** — cần anh **restart CLI** rồi gật, em chạy spawn-probe 3/3 TUẦN TỰ (đây là thứ duy nhất chặn nấc lên `verified-runtime`); (2) ⚑ ngưỡng `pull_warn_days` — đặt số hay giữ INFORM trần `[carry:pull-warn-threshold]`; (3) ⚑ tools-whitelist no-teeth — chờ hub xác nhận cơ-chế, anh có muốn em thử hardening (hook chặn sub-write path tracked) không `[carry:tools-whitelist-no-teeth]`; (4) UAT lũy-kế tạm-tính S134 `[carry:uat-s134-luyke]`; (5) UAT freeze-NS S133 `[carry:uat-s133-budget-freeze]`; (6) ⚑ D1 nháp-không-cộng-tiền — gật giữ hay đổi (1 predicate); (7) hook-vs-budget-cap — chốt hướng (S143: inv-cb 26.6K over-cap) `[carry:hook-vs-budget-cap]`; (8) session-model — duyệt bảng VC-1/2/3 `[carry:session-model-adopt]`; (9) close-sweep cụm 7-carry đồng-tuổi S117/S118; **⬇️ 3 mục dưới CHÌM từ `spec:68` suốt S141→S143 (0 hit trên cả 4 bề mặt owner — `gap-decision-sunk` @S143), nay kéo lên:** (10) ⚑ **ratify ranh `refine ⟂ lead-omission`** — 🔴 ranh này **đã wire** vào `harness-refine.md:22-30` TRƯỚC khi được anh/hub ratify; anh gật giữ hay sửa ranh; (11) ⚑ **5 câu session-model** (mới mang 1/5 lên bảng): `session_ctx_kb`=64? · map N↔L + folder-form (`sessions/session-` hub vs `S` SE) · VC từng dòng · hook 3→4-path? · prereq unblock — 🔴 `session_ctx_kb` **0 hit** mọi bề mặt dù em khai "❌ treo"; (12) ⚑ **consent-form trio dài hạn** — mỗi phiên gật hay thành luật đứng (hub `58e28bae` Câu-3 đá về SE, câu hỏi còn nguyên cho anh). **NEXT em (phiên kế):** 🔴 **KHÔNG watch `broadcasts/inbox` nữa** — inbox chỉ có thư Đà kéo nên nó mù với thư chưa kéo (đúng lỗi S143); thay bằng **đọc vế-4 `pull-cach` trong dòng-nợ** rồi `/check-email` khi số tăng bất thường. Trio first-run ngay sau anh restart+gật; **H24 deep tới hạn** (S143 đã chạy sớm 1 nhịp theo direction anh — xem kết-quả trong log phiên); monthly combined audit **2026-08-01** (kèm full re-sync measured-block); MFE GOODHART-WARN strikes 21→23 theo dõi; nếu anh đổi D1 → predicate `ComputePendingAsync` + test C3 flip + deploy. diff --git a/docs/STATUS.md b/docs/STATUS.md index 5608657..6ec05d9 100644 --- a/docs/STATUS.md +++ b/docs/STATUS.md @@ -447,7 +447,7 @@ monthly re-tier mega-line + ef-core SKILL Mig→59 + 3 vocab-fork (2026-07-01 du | Gotchas | **83** | **+S133 #81-EXT** (instance 2 indirect-assignment, KHÔNG số mới: snapshot-NS-at-DaDuyet hook đặt ở finalize choke-point NHƯNG 2 site gán Phase TRỰC TIẾP bypass — admin-override `PurchaseEvaluationWorkflowService.cs:308` `= targetPhase` + seeder `DbInitializer:1323` `= current` → phiếu vào DaDuyet qua 2 đường này KHÔNG snapshot [frozen=0, display rơi về live = đúng bug đang vá]; reviewer adversarial bắt pre-commit, em-main + 3 invocation implement đều sót — cùng bài enumeration-writer #81; meta: field-đích có hook/derive/snapshot ⇒ grep MỌI assignment-site kể cả override/seeder). +1 S126 (**#83** số AGGREGATE session-cumulative tự-lão-hoá — audit COUNTS đổi bởi CHÍNH spawn review sau đó [2/2/0→4/4/0]; outward mời-reproduce = bảng per-lane theo run-id, KHÔNG số tổng; reviewer-gate bắt, em-main-solo sót). +1 S118 (**#82** menu-flag grant ≠ quyền API thật: display-layer [Permission `CanRead`→`GetMyMenuTree` FE-menu] ⟂ API-authz-layer [controller `[Authorize(Policy=)]`] = 2 tầng ĐỘC-LẬP; grant `Suppliers` R+C+U cho PRO nhưng `PUT/DELETE /suppliers` gate `[Authorize(Roles="Admin,CatalogManager")]` → PRO vẫn 403 sửa/xóa NCC [chỉ Publish/Import theo `Suppliers.Update` là ăn]; ngược lại `ReportsController` `[Authorize]` trần → mọi authed-user đọc `dashboard` tài-chính-HĐ ngược S92; fix gate `[Authorize(Policy="Reports.Read")]` per-method + grep controller authz TRƯỚC khi tin hiệu-lực grant; reviewer adversarial bắt, em-main-solo tin menu-flag=quyền thì sót; liên-quan #44). +1 S114 (**#81** derived-invariant re-derive ở write/select NHƯNG SÓT DELETE writer [DeleteQuote/DeleteDetail cascade] → xóa quote-selected cuối của NCC → `Supplier.IsWinner` kẹt stale [Any(IsSelected)=false] → `CreateContract Where(IsWinner)` gom NCC phantom → **HĐ giaTri=0**; fix helper `PeWinnerInvariant.ReSyncAfterQuoteRemovalAsync` gọi sau SaveChanges 2 handler; **enumeration-writer-trong-spec KHÔNG đáng tin** → grep MỌI `.Remove(`/`.Add(`/`=field` chạm entity chứa field-nguồn; chỉ **verify-adversarial-refute** bắt [invest/review/implement đều sót]; cardinality S87/S88 lên tầng mutation-path). +1 S113 (**#80** null-forgiving `!` che NRE trên external-parsed data: `SupplierExcelImportService.NewSupplier` gán `Code = r.Code!.Trim()` → NullReferenceException khi parser trả `null` cho ô cột-4 rỗng [ĐÚNG path R4 "thiếu Mã NCC → nháp"] → confirm nổ 500 CẢ batch dù preview classify New-draft KHÔNG lỗi; sibling `IsPublic=!IsNullOrWhiteSpace(row.Code)` null-safe nhưng NewSupplier thì KHÔNG; empty-string `""` chạy OK nhưng FE round-trip blank→JSON `null` → nổ. Fix `(r.Code ?? "").Trim()`. **Build 0/0 KHÔNG bắt** [`!` tắt nullable-warning]; chỉ test-before-critical bắt. Lesson: `!` null-forgiving trên dữ-liệu-parse-ngoài = mìn, dùng `?? default`). +1 S97 (**#79** backfill soi NHẦM bảng — transition-marker "[Duyệt KẾT THÚC]" nằm ở `PurchaseEvaluationChangelogs.ContextNote` KHÔNG phải `PurchaseEvaluationApprovals` → Mig 60 backfill match 0, phiếu finalize-CCM giữ flag=0 hiện sai "Đã được CEO duyệt"; fix Mig 61 query đúng bảng. PE 2 bảng lịch-sử tách vai [Approvals=ai-duyệt record :745 · Changelogs=chuyển-phase+marker LogTransition :1073]; verify marker-count prod trước khi tin backfill). +1 S97 (**#78** display-flag suy CONFIG thay RUNTIME → nói dối khi instance lệch config: `endsBeforeCeo` từ "workflow CÓ cấp finalize" thay "phiếu NÀY finalize" → phiếu lên CEO báo sai "không qua CEO"; nặng sau S97 default-flip opt-in; fix field runtime `EndedByLevelFinalize` Mig 60. Flag = "instance Đà làm-gì" KHÔNG "config CÓ THỂ"). +1 S96 (**#77** SPA deploy bundle cache-lag: team thấy UI CŨ dù đã deploy + Ctrl+F5 — index.html no-cache ĐÚNG-chuẩn + JS hash-immutable nhưng browser giữ tab-SPA-mở/cache-local → verify bundle prod **BYTE-LEVEL** (curl + grep string-fix trong `/assets/index-.js`) phân-biệt cache-vs-deploy; **incognito = golden-test**; no-service-worker nên clear-site-data đủ). +2 S91 (**#76** deploy render config từ `.example` KHÔNG phải file-gitignored → prod thiếu setting tới khi điền tay · **#75** seed ungated per-code RESURRECT data đã-wipe mỗi restart → gate sau env-flag `DemoSeed:Disabled` + verify-by-restart-thật). +1 S90 (**#74** Chrome-MCP screenshot kẹt SPA-SignalR `document_idle` → PowerShell `CopyFromScreen` + Win32 lọc-process-`chrome.exe`). +2 S85 (**#72** lệch giờ +7h — DateTime lưu UTC nhưng serialize thiếu 'Z' → FE `new Date()`=local → `UtcDateTimeJsonConverter` global ép UTC-with-Z · **#73** UpdateDraft absolute-set CLEAR field SÓT khỏi pattern null-safe = bug-class S42 → guard `if (request.X is not null)`). +1 S78 **#71** (thêm enum value vào entity DÙNG-CHUNG → pollute UI/guard phân-loại theo PROXY-predicate `supplierId===null` thay vì enum tường minh; file-khi-duyệt purpose=5 lẫn "Bảng so sánh" + false-pass submit-guard → grep mọi field-proxy predicate loại value mới + build-verify TỪNG app; em-main grep no-leak bắt trước deploy). +1 S76 **#70** (FE absolute-set echo field anh-em từ server-snapshot + `invalidate()` fire-and-forget → cửa-sổ stale-echo mất-dữ-liệu khi lưu 2 ô liên-tiếp; guard `useIsFetching` gate nút Lưu tới khi refetch land; reviewer workflow bắt, impl self-review sót). +1 S72 **#69** FE bundle-hash non-deterministic + `deploy.yml` rebuild-FE-unconditional → bundle rotate kể cả commit governance (SPA-fallback-200 trap; cicd Run #312). +2 S69: **#67** Tailwind v4 accent palette thiếu stop (teal/violet/amberx/greenx chỉ 50/100/500/600/700; dùng -300 → teal/violet rơi DEFAULT Tailwind sai-hệ, amberx/greenx drop hẳn — build PASS, phải soi dist CSS) · **#68** IDE TS diagnostic giữa background-agent/workflow = snapshot dở-dang (TS server bắn mỗi save), chỉ tin build SẠCH sau-cùng (2× session này: re-skin + PE-FE đều false-alarm). Prev +1 S68 **#66** Tailwind v4 rule element thô `h1-h4{color:#0b1220}` viết NGOÀI `@layer` thắng utility `text-white` → heading render đen; fix ĐIỂM `text-white!` (important, grep dist confirm), KHÔNG move `@layer` (load-bearing ~30+ heading toàn app). Prev +1 S65 **#65** build csproj con (vd `SolutionErp.Api.csproj`) ≠ `dotnet build SolutionErp.slnx` (gồm tests) → miss test-compile khi đổi chữ ký record command (CreateDepartmentCommand +ParentId) → CI CS7036 FAIL-gated Run #291 (deploy chặn, prod nguyên — test-gate làm đúng việc). Fix: build full slnx trước push BE signature-change. Prev +2 S61: **#63** EF scaffold tự sinh `RenameColumn` SAI-semantics khi drop+add cùng type (test xanh không bắt — SQLite EnsureCreated không replay migration) · **#64** `dotnet ef database update` áp Design-DB 0-rows ≠ Dev-DB → data-migrate `Sql()` chạy thật lần đầu trên prod. Prev +2 S59 (#61 sqlcmd `-f 65001` · #62 rename natural-key UPDATE trước deploy) | | User memory | **31** | +S84 `feedback_derived_flush_execution` (derived→canonical flush = em-main execution KHÔNG gate user-confirm; monitor INFORM-only ≠ cần-anh-duyệt; chỉ ĐỔI-con-số/policy = quyền anh). +S79 `feedback_canonical_spec_over_broadcast` (adap pull canonical-command/§P đừng phỏng-theo broadcast + report-before-stamp dogfood + residual own-diary OK). +S75 `feedback_harness11_engine` (engine governance tự-bảo-trì + gotcha #30-via-Edit + multi-workflow-verify + git-add-specific lesson). re-ground S71 (H1 disk-count: 25 `feedback_*` + 3 `project_*`; STATUS "21" stale từ S64). +S71 `feedback_harness10_run_trace` (run-trace + 3 lesson). Prev +1 S64 `feedback_harness7_outward_writing_quality`; re-grounded S54 base 19 | | Skills | 6 | 3 domain + 3 ops | -| Sub-agents | **17** | **+S141/S142 🧪🧭🧮 `harness-eval` + `harness-refine` + `harness-audit` (15th–17th sub — bộ-ba đồng-kiểm HỆ MEMORY, adopt AI_INFRA khuôn 5-câu `58e28bae` khối B, wave adap đợt-9/10; land S141 persona+seed+`hmw.js` VALID_ROLES 14→17, wiring nghi-thức S142 vòng-2 sau khi vòng-1 chết giữa chừng). Read-only INFORM-only propose-only, frontmatter **không khai Write/Edit** — 🔴 nhưng đo S143: **runtime VẪN cấp** (append cuối tool-list, 9/9 vai read-only; nhân-chứng `reviewer` đã Write+Edit thật) ⇒ đây là **tuyên-bố ý-định**, KHÔNG phải chặn-bằng-thiếu-tool; containment thật = single-writer + git-diff commit-gate · `model: opus`+`effort: max`+`memory: project`+`maxTurns: 18`. Trục = **CHÍNH HỆ MEMORY**, chạy **TUẦN TỰ** eval→refine→audit (🔴 CẤM `parallel()` — con KIỂM chạy song song sẽ chấm bản CŨ ⇒ verdict vô-nghĩa): `harness-eval` = con **ĐO** (chỉ trả số nguyên-văn từ instrument, CẤM số-từ-trí-nhớ) ⟂ `harness-refine` = con **ĐỀ-XUẤT** (4 lớp reinject/promote/archive/distill, bắt buộc có mục "đã cân-nhắc→BÁC") ⟂ `harness-audit` = con **KIỂM** (verdict ĐẠT/TRƯỢT per-claim + re-chạy ≥2 số load-bearing; PIN run-folder đích-danh, CẤM tự tìm "run mới nhất"). 🔴 **KHÔNG gộp** với H1 tooling-freshness / H2 harvest-integrity / H24 lead-surface / reviewer diff-code — 4 trục khác nhau. Nghi-thức 2-đầu-phiên **consent-gated** (`session-start §2.1.9` + `session-end §L.b(k)`): em-main IN đề-xuất, KHÔNG auto-run, anh gật mới chạy; skip → ghi vết WAL `trio: skipped S` (vết-2-lớp, chuỗi skip nhìn thấy được). Budget seed đo TƯƠI `measure-agent-memory.ps1`: eval 1547B · refine 1616B · audit 1513B (l2_*=0 = SEED-STATE đúng, chưa chạy lần nào). 🔸 **Nấc trung-thực = executed-file / verified-pending-restart** — 3 vai CHƯA spawn-probe lần nào (cần restart CLI + anh consent; KHÔNG được đọc thành verified-runtime).** **+S121 👁 `lead-view-auditor` + `lead-omission-auditor` (13th+14th sub — H24 lead-self-audit, adopt broadcast `2026-07-14-Governance-harness-24`, anh chốt S119 `owner-decisions-15-07-2026`, land S121 wave-W2 `hmw.js` VALID_ROLES 12→14 CÙNG COMMIT roster+STATUS [R3-M2: lệch landing ⇒ C2/B3 flag mọi derived ghi "14" là stale-vs-12 ⇒ detector BÃO trên chính thay đổi của H24]). 2 monitor INFORM-only propose-only, cookie-cutter frontmatter monitor sẵn (`model: inherit` lúc-land [S124 re-pin → `opus`+`effort:max` cùng toàn roster] · `memory: project` · `maxTurns: 18` · 8 tool read-only, **NO Write/Edit**). Trục: `lead-view-auditor` = **view LỆCH source** (5 class `view-*`) ⟂ `lead-omission-auditor` = **cái BỊ THIẾU** (6 class `gap-*` — +`gap-incident-unrecorded` @S143 owner-duyệt) — 🔴 **KHÔNG gộp** vào tooling-auditor(H1 tooling-freshness)/harvest-curator(H2 harvest-integrity): H24 §2(1) *"gộp là mất tiêu-điểm; cái ta cần là cặp mắt CHỈ dành cho lead"*. Class-flag = **enum ĐÓNG** `lead_self_audit.flag_classes` ở `.claude/agent-memory/memory-budget.json` (11 class = 5+6, vai CẤM tự chế — mở enum là quyền owner). Nhịp = `h24_cadence` {light 6/deep 15/jump 3} cùng file (single-source H24 §2(3) — doc TRỎ key, KHÔNG chép số); counter `.claude/governance/.session-counter.json` (content-based `last_ticked_head`, KHÔNG blind-increment — hook `wal-flush.ps1` auto-commit `agent-memory/` mỗi turn sẽ làm hỏng đếm mù; đặt ngoài 3 path hook CÓ CHỦ-ĐÍCH). ✅ **verified-runtime S122** (spawn-probe toàn-roster-KHI-ĐÓ SỐNG post-restart — **N=14 tại thời-điểm S122**, chứng runtime, §Recently-Done S122; 🔸 +3 trio S141 CHƯA nằm trong phép đo này) **+ chạy THẬT S124** (dogfood 2-vai đầu-tiên, owner-triggered @counter 3) **+ S137** (light-audit consent OVERDUE 8/6 → 2 FLAG view-stale-status + 1 FLAG gap-decision-sunk). 🔸 Residual THẬT giữ: đường `hmw.js→agentType` cho 2 vai H24 chưa exercise (Agent-tool path đã chứng; workflow-path chưa) [S137 view-audit lật ⚠️→✅ khớp source, giữ residual]. 🔸 Từ-vựng "view"/"omission" chọn có chủ-đích tránh va-chạm: `governance-detectors.ps1:15` đã sở-hữu `derived-staleness`, và "GAP" quá-tải (`session-end` build-gap · `memory-selfimprove-audit.ps1` CRITERIA+GAP).** **+S107 📄 `office-document` (12th sub — Office document WRITE specialist: docx·xlsx·pptx·pdf + form-engine; floor OD1–OD10; VALID_ROLES hmw.js 9→10; anh giao trực tiếp S107 "Sub chính" Office; ✅ **verified-runtime S107 CÙNG PHIÊN** — registry hot-reload agent MỚI giữa phiên [S27 lesson thu hẹp còn EDIT-agent/command] + spawn-test PASS OD1/OD4/OD5 template thật, model self-report `claude-fable-5` [data-point #5 flip-8]; finding: 2 template `wwwroot/templates` 0-placeholder mẫu-blank).** **worker-tier-pin (owner-decision S124 2026-07-15 — thay all-inherit H8 S66, trước nữa two-tier H4; sub TOÀN-ROSTER pin cứng KHÔNG theo lead; H23-precedence ĐO S126: spawn-param THẮNG hard-pin ⇒ `/fable-real` SỐNG). Lead = frontier-class owner-choice per-session:** em main Fable 5 (1M) Max (✅ **Fable RESTORED S98 2026-07-02** — lead self-report `claude-fable-5` + settings `claude-fable-5[1m]`; fallback-Opus H5 S62→S97 kết thúc, H5.6 hoàn tất) ⚠️ **S101 2026-07-03: runtime lead = Opus 4.8** (lead + 2 monitor + WF2 reviewer inherit đều self-report `claude-opus-4-8`; settings vẫn pin `claude-fable-5[1m]` → **Fable unavailable phiên này → H5-fallback tự-kích, revert-free, KHÔNG sửa frontmatter**; "Fable RESTORED S98" = point-in-time KHÔNG phải steady-state — inherit-chain resolve theo availability runtime; ✅ **S102 2026-07-06: Fable VỀ LẠI runtime** — lead + 2 monitor inherit self-report `claude-fable-5` → H5-fallback S101 kết thúc, pattern availability per-session xác nhận [S98 Fable → S101 Opus → S102 Fable → **S103 Opus** → **S104 Opus** (2026-07-06 Fable outage tiếp — S104 lead + 2 monitor spawn self-report `claude-opus-4-8` ×3, H5-fallback revert-free) → ✅ **S105 Fable** (2026-07-07 Fable VỀ lần 3 — lead + 2 monitor self-report `claude-fable-5` ×3, runtime-verified) → ⚠️ **S106 Opus** (2026-07-07 Fable outage lại — lead runtime self-report `claude-opus-4-8`, H5-fallback revert-free; flip-7) → ✅ **S107 Fable** (2026-07-10 Fable VỀ lần 4 — lead + 2 monitor self-report `claude-fable-5` ×3, runtime-verified; flip-8)], BƯỚC 0.6 probe mỗi phiên; per-session KHÔNG steady-state. 🔴 **[§Sub-agents = CANONICAL single-owner flip-chain — S106 gộp per anh-confirm; derived `agents/README:3` · `session-start:37` · `session-end:113` trỏ về đây, KHÔNG tự enumerate mỗi flip → chống churn 4-file/flip]**) · **TOÀN roster `model: opus` + `effort: max`** (worker-tier-pin S124; **A2 đo S126:** lane no-tier resolve `claude-opus-4-8` DÙ lead=Fable ⇒ pin ăn runtime, hết inherit-lead; số vai = cột giữa của chính row này — KHÔNG chép lại vào narrative, đó là cách row-14 và narrative-12 lệch nhau từ S121 tới S122; lineage: 7 demoted flip S66 → all-inherit S66–S123 [office-document S107 inherit-born] → pin S124) · effort Max. 10 product/quality + monitor INFORM-only (H1 · H2 · 2×H24 S121 · 3×trio-memory S141) — **liệt-kê NHÓM, số vai = cột giữa của chính row này**. Nấc H8 = **runtime-verified S98 (2026-07-02)** — spawn-test inherit-chain ×2 monitor self-report `claude-fable-5` (cả đội tự lên Fable khi lead restore, 0 sửa frontmatter — đúng thiết kế all-inherit). Prev two-tier H4 runtime-verified S57bis (spawn-test 2 chiều). | +| Sub-agents | **20** | **+S145 🔬 `tooling-harvest-audit` (18th sub — round-KIỂM vòng tooling/harvest, C4/C4b adap dot-11 khoản ① `harness-dong-du-vong:51`, owner-decision [2] TÁCH mỗi-vòng-1-con-KHÔNG-gộp). Vai-KIỂM ĐỘC-LẬP đọc OUTPUT H1 `tooling-auditor` (4-mặt freshness) + H2 `harvest-curator` (5-trục integrity), **KHÔNG re-chạy đo**: verdict per-claim ĐẠT/TRƯỢT + falsify ≥2 + **tự tái-dựng ≥1 số CÓ-THỂ-SAI** (đếm `.claude/agents/*.md` vs roster-count H1 · N-harvested/M-spawned) + **thách-CLEAN** (H1 PASS/H2 GATE-0 → mở 1 skill "fresh"+1 sub "harvested" xem thật). 🔴 no-self-exempt ≠ H1/H2 (m-3 S139). **AUTO fire-after-measure @session-end §L.b(g-bis)** — owner-chốt S145 KHÔNG consent-gate (KHÁC trio/H24), fail-safe NO-OP nếu H1/H2 không chạy phiên đó (CẤM ĐẠT-ảo); tuần-tự C4b (invocation SAU con-đo, mtime chứng). Propose-only, backstop = git-diff commit-gate (KHÔNG dựa thiếu-tool `[carry:tools-whitelist-no-teeth]`). `model: opus`+`effort: max`+`memory: project`+`maxTurns: 16`. **Vai #1/3 round-KIỂM** — `h24-audit` (vòng soi-lead) + `sleep-audit` (vòng nén-ngủ) land dần incremental (§6 broadcast báo-nấc-per-vòng, owner S145). 🔴 **Nấc = executed-file / verified-pending-restart** — registry Agent-tool KHÔNG hot-reload (`README:227`), spawn-probe alive cần **restart CLI**; run-thử-thật @session-end phiên sau. Design-doc: `runs/2026-07-22-S144-adap-dot-11/C4-design-3-vai-kiem.md`.** **+S145 🔬 `h24-audit` (19th sub — round-KIỂM vòng soi-lead H24, vai #2/3 C4/C4b). Đọc OUTPUT `lead-view-auditor` + `lead-omission-auditor` (🔴 KIỂM 2 con-đo H24, **KHÔNG soi lead trực-tiếp**) → verdict per-FLAG + tự tái-dựng ≥1 số (flag-count · mở 1 FLAG đối-chứng source · `class_repeat` `.session-counter.json`) + **thách-CLEAN** (H24 báo ít/0 FLAG ⇒ tự soi 1 surface tìm FLAG sót — CLEAN "lead ổn" là ca nguy nhất, khớp H24 §2(1) phép-thử-nhanh). Verify vai H24 KHÔNG tự chế class ngoài enum ĐÓNG `flag_classes`. no-self-exempt ≠ lead-view/omission (m-3). AUTO wired `session-end §L.b(j)(ii-bis)` sau cặp H24; fail-safe NO-OP nếu H24 không chạy (nhịp/consent). `maxTurns: 16`.** **+S145 🔬 `sleep-audit` (20th sub — round-KIỂM vòng nén-ngủ, vai #3/3 C4/C4b). Đọc OUTPUT `/sleep-recovery-memory-l2` (`.gist.md` mới + Fidelity verdict + claim giảm-byte) → verdict per-claim + **tự ĐO LẠI byte** archive gốc vs gist (đối-chứng claim) + **thách-CLEAN** (Fidelity 5P/0F ⇒ mở 1 gist đối-chứng `.md` gốc xem có giữ 4-field load-bearing hay nén quá tay) + kiểm bất-biến gist-ADDITIVE (gốc byte-identical). no-self-exempt độc-lập lượt nén (m-3). AUTO wired `sleep-recovery-memory-l2.md Phase 4.5` sau nén; fail-safe NO-OP nếu 0 gist tươi. `maxTurns: 16`.** **+S141/S142 🧪🧭🧮 `harness-eval` + `harness-refine` + `harness-audit` (15th–17th sub — bộ-ba đồng-kiểm HỆ MEMORY, adopt AI_INFRA khuôn 5-câu `58e28bae` khối B, wave adap đợt-9/10; land S141 persona+seed+`hmw.js` VALID_ROLES 14→17, wiring nghi-thức S142 vòng-2 sau khi vòng-1 chết giữa chừng). Read-only INFORM-only propose-only, frontmatter **không khai Write/Edit** — 🔴 nhưng đo S143: **runtime VẪN cấp** (append cuối tool-list, 9/9 vai read-only; nhân-chứng `reviewer` đã Write+Edit thật) ⇒ đây là **tuyên-bố ý-định**, KHÔNG phải chặn-bằng-thiếu-tool; containment thật = single-writer + git-diff commit-gate · `model: opus`+`effort: max`+`memory: project`+`maxTurns: 18`. Trục = **CHÍNH HỆ MEMORY**, chạy **TUẦN TỰ** eval→refine→audit (🔴 CẤM `parallel()` — con KIỂM chạy song song sẽ chấm bản CŨ ⇒ verdict vô-nghĩa): `harness-eval` = con **ĐO** (chỉ trả số nguyên-văn từ instrument, CẤM số-từ-trí-nhớ) ⟂ `harness-refine` = con **ĐỀ-XUẤT** (4 lớp reinject/promote/archive/distill, bắt buộc có mục "đã cân-nhắc→BÁC") ⟂ `harness-audit` = con **KIỂM** (verdict ĐẠT/TRƯỢT per-claim + re-chạy ≥2 số load-bearing; PIN run-folder đích-danh, CẤM tự tìm "run mới nhất"). 🔴 **KHÔNG gộp** với H1 tooling-freshness / H2 harvest-integrity / H24 lead-surface / reviewer diff-code — 4 trục khác nhau. Nghi-thức 2-đầu-phiên **consent-gated** (`session-start §2.1.9` + `session-end §L.b(k)`): em-main IN đề-xuất, KHÔNG auto-run, anh gật mới chạy; skip → ghi vết WAL `trio: skipped S` (vết-2-lớp, chuỗi skip nhìn thấy được). Budget seed đo TƯƠI `measure-agent-memory.ps1`: eval 1547B · refine 1616B · audit 1513B (l2_*=0 = SEED-STATE đúng, chưa chạy lần nào). 🔸 **Nấc trung-thực = executed-file / verified-pending-restart** — 3 vai CHƯA spawn-probe lần nào (cần restart CLI + anh consent; KHÔNG được đọc thành verified-runtime).** **+S121 👁 `lead-view-auditor` + `lead-omission-auditor` (13th+14th sub — H24 lead-self-audit, adopt broadcast `2026-07-14-Governance-harness-24`, anh chốt S119 `owner-decisions-15-07-2026`, land S121 wave-W2 `hmw.js` VALID_ROLES 12→14 CÙNG COMMIT roster+STATUS [R3-M2: lệch landing ⇒ C2/B3 flag mọi derived ghi "14" là stale-vs-12 ⇒ detector BÃO trên chính thay đổi của H24]). 2 monitor INFORM-only propose-only, cookie-cutter frontmatter monitor sẵn (`model: inherit` lúc-land [S124 re-pin → `opus`+`effort:max` cùng toàn roster] · `memory: project` · `maxTurns: 18` · 8 tool read-only, **NO Write/Edit**). Trục: `lead-view-auditor` = **view LỆCH source** (5 class `view-*`) ⟂ `lead-omission-auditor` = **cái BỊ THIẾU** (6 class `gap-*` — +`gap-incident-unrecorded` @S143 owner-duyệt) — 🔴 **KHÔNG gộp** vào tooling-auditor(H1 tooling-freshness)/harvest-curator(H2 harvest-integrity): H24 §2(1) *"gộp là mất tiêu-điểm; cái ta cần là cặp mắt CHỈ dành cho lead"*. Class-flag = **enum ĐÓNG** `lead_self_audit.flag_classes` ở `.claude/agent-memory/memory-budget.json` (11 class = 5+6, vai CẤM tự chế — mở enum là quyền owner). Nhịp = `h24_cadence` {light 6/deep 15/jump 3} cùng file (single-source H24 §2(3) — doc TRỎ key, KHÔNG chép số); counter `.claude/governance/.session-counter.json` (content-based `last_ticked_head`, KHÔNG blind-increment — hook `wal-flush.ps1` auto-commit `agent-memory/` mỗi turn sẽ làm hỏng đếm mù; đặt ngoài **4 path** hook CÓ CHỦ-ĐÍCH — *hook nới từ 3 lên 4 @S146 khi thêm `.claude/sessions/`; mệnh-đề "governance/ nằm ngoài" đã RE-VERIFY sau khi nới, vẫn đúng*). ✅ **verified-runtime S122** (spawn-probe toàn-roster-KHI-ĐÓ SỐNG post-restart — **N=14 tại thời-điểm S122**, chứng runtime, §Recently-Done S122; 🔸 +3 trio S141 CHƯA nằm trong phép đo này) **+ chạy THẬT S124** (dogfood 2-vai đầu-tiên, owner-triggered @counter 3) **+ S137** (light-audit consent OVERDUE 8/6 → 2 FLAG view-stale-status + 1 FLAG gap-decision-sunk). 🔸 Residual THẬT giữ: đường `hmw.js→agentType` cho 2 vai H24 chưa exercise (Agent-tool path đã chứng; workflow-path chưa) [S137 view-audit lật ⚠️→✅ khớp source, giữ residual]. 🔸 Từ-vựng "view"/"omission" chọn có chủ-đích tránh va-chạm: `governance-detectors.ps1:15` đã sở-hữu `derived-staleness`, và "GAP" quá-tải (`session-end` build-gap · `memory-selfimprove-audit.ps1` CRITERIA+GAP).** **+S107 📄 `office-document` (12th sub — Office document WRITE specialist: docx·xlsx·pptx·pdf + form-engine; floor OD1–OD10; VALID_ROLES hmw.js 9→10; anh giao trực tiếp S107 "Sub chính" Office; ✅ **verified-runtime S107 CÙNG PHIÊN** — registry hot-reload agent MỚI giữa phiên [S27 lesson thu hẹp còn EDIT-agent/command] + spawn-test PASS OD1/OD4/OD5 template thật, model self-report `claude-fable-5` [data-point #5 flip-8]; finding: 2 template `wwwroot/templates` 0-placeholder mẫu-blank).** **worker-tier-pin (owner-decision S124 2026-07-15 — thay all-inherit H8 S66, trước nữa two-tier H4; sub TOÀN-ROSTER pin cứng KHÔNG theo lead; H23-precedence ĐO S126: spawn-param THẮNG hard-pin ⇒ `/fable-real` SỐNG). Lead = frontier-class owner-choice per-session:** em main Fable 5 (1M) Max (✅ **Fable RESTORED S98 2026-07-02** — lead self-report `claude-fable-5` + settings `claude-fable-5[1m]`; fallback-Opus H5 S62→S97 kết thúc, H5.6 hoàn tất) ⚠️ **S101 2026-07-03: runtime lead = Opus 4.8** (lead + 2 monitor + WF2 reviewer inherit đều self-report `claude-opus-4-8`; settings vẫn pin `claude-fable-5[1m]` → **Fable unavailable phiên này → H5-fallback tự-kích, revert-free, KHÔNG sửa frontmatter**; "Fable RESTORED S98" = point-in-time KHÔNG phải steady-state — inherit-chain resolve theo availability runtime; ✅ **S102 2026-07-06: Fable VỀ LẠI runtime** — lead + 2 monitor inherit self-report `claude-fable-5` → H5-fallback S101 kết thúc, pattern availability per-session xác nhận [S98 Fable → S101 Opus → S102 Fable → **S103 Opus** → **S104 Opus** (2026-07-06 Fable outage tiếp — S104 lead + 2 monitor spawn self-report `claude-opus-4-8` ×3, H5-fallback revert-free) → ✅ **S105 Fable** (2026-07-07 Fable VỀ lần 3 — lead + 2 monitor self-report `claude-fable-5` ×3, runtime-verified) → ⚠️ **S106 Opus** (2026-07-07 Fable outage lại — lead runtime self-report `claude-opus-4-8`, H5-fallback revert-free; flip-7) → ✅ **S107 Fable** (2026-07-10 Fable VỀ lần 4 — lead + 2 monitor self-report `claude-fable-5` ×3, runtime-verified; flip-8)], BƯỚC 0.6 probe mỗi phiên; per-session KHÔNG steady-state. 🔴 **[§Sub-agents = CANONICAL single-owner flip-chain — S106 gộp per anh-confirm; derived `agents/README:3` · `session-start:37` · `session-end:113` trỏ về đây, KHÔNG tự enumerate mỗi flip → chống churn 4-file/flip]**) · **TOÀN roster `model: opus` + `effort: max`** (worker-tier-pin S124; **A2 đo S126:** lane no-tier resolve `claude-opus-4-8` DÙ lead=Fable ⇒ pin ăn runtime, hết inherit-lead; số vai = cột giữa của chính row này — KHÔNG chép lại vào narrative, đó là cách row-14 và narrative-12 lệch nhau từ S121 tới S122; lineage: 7 demoted flip S66 → all-inherit S66–S123 [office-document S107 inherit-born] → pin S124) · effort Max. 10 product/quality + monitor INFORM-only (H1 · H2 · 2×H24 S121 · 3×trio-memory S141 · 3×round-KIỂM `tooling-harvest-audit`/`h24-audit`/`sleep-audit` S145) — **liệt-kê NHÓM, số vai = cột giữa của chính row này**. Nấc H8 = **runtime-verified S98 (2026-07-02)** — spawn-test inherit-chain ×2 monitor self-report `claude-fable-5` (cả đội tự lên Fable khi lead restore, 0 sửa frontmatter — đúng thiết kế all-inherit). Prev two-tier H4 runtime-verified S57bis (spawn-test 2 chiều). | | RAG chunks | **2441** | re-verify S126 (`list_projects` — alive, +12 vs S80's 2429; rerank 0.92 top-hit check OK). Stale `last_indexed 05-29` (store_memory stopgap; full re-index = AI_INFRA op cần VOYAGE_API_KEY). | **Bundle hash live (prod):** admin **`BVCukFP5`** · user **`DoxyEOxh`** (S134 — **`6664a61`** PE lũy kế TẠM TÍNH vs CHÍNH XÁC [0 mig — `ComputePendingAsync` complementary + DTO 5-field + FE sub-dòng amber + banner màn duyệt + D4 audit-note]; **Run #399** GO 5/5 5m27s gate-**528**-EXACT-từ-log rotate ×2 admin js `3NCdyODe`→**`BVCukFP5`** css `B--dUHcm`→**`CBzUlgOA`** / eoffice js `CKsoiNCI`→**`DoxyEOxh`** css `BuntB63r`→**`BHsBUA8e`** [FE-src đổi thật 6 file ⇒ rotate expected; CSS rotate = amber badge utilities, benign #69]; real-size 1.659.037/1.565.367B + LM 14:31:34/14:32:28+07 in-window; **byte-verify #77** `pendingPriorPes`=2 + `Tạm tính`=3 + `phiếu trước cùng gói thầu CHƯA duyệt`=2 PRESENT cả 2 js [control old-hash 900B text/html 0-hit — ct=text/html là discriminator sạch hơn size-919b]; Mig 67 top FROZEN + 89 bảng [0-mig by-construction]; smoke 4×200 + PE 401; lead spot-check độc-lập post-verdict: 4/4 hash khớp + marker PRESENT). **Prev S133** — admin **`3NCdyODe`** · user **`CKsoiNCI`** (S133 — **`d4fbced`** PE freeze NS phiếu DaDuyet [Mig 67 snapshot 11 cột + backfill 18/18 + FE 2-app badge 🔒 SHA-mirror `5534addb` + display-gate `budgetFrozen`]; **Run #398** GO 5/5 gate-520 rotate ×2 admin →**`3NCdyODe`** [CSS `B--dUHcm`] / user →**`CKsoiNCI`** [CSS `BuntB63r`] — prev `yCkX-2Bp`/`DKSD4p9k` @Run #397 S131-S132 [dòng-live lag S117→S133, hoist per precedent S104/S107]; **CSS cũng rotate** = badge sinh utility-class mới, benign #69; **byte-verify #77** `budgetFrozen`=1 + VN-string 🔒=1 PRESENT [old-control 0]; Mig 67 prod history-top + 11 cột + backfill 18/18 chua=0 + sys.tables **89**; smoke 4×200 + PE 401; `/tiep` S134 re-verify độc-lập 4/4: mig-top + health-200 + bundle-hash ×2 + filter 11/11). **Prev S117** — admin **`cFI7ih4a`** · user **`MxgooVZw`** (S117 — **`316a82f`** PE endsBeforeCeo pointer-aware [display-fix BE-only, phiếu chờ CEO hết báo "Kết thúc" sai] + duyệt-theo-khoảng Min–Max [Mig 66 + FE 2-app ProMinMax radio thứ 5]; **Run #387** PASS 5m36s rotate ×2 admin `Dd55jBpj`→`cFI7ih4a` / user `DVDr1UQ4`→`MxgooVZw` CSS-frozen [logic-only fingerprint]; **byte-verify #77** `ProMinMax`/`duyệt theo khoảng`/`cả Min và Max`/`Min–Max` PRESENT [bundle-cũ=0]; Mig 66 prod col decimal(18,2) + `__EFMigrationsHistory`-top + sys.tables **89**; smoke 200×3 · PE 401-secured; **#53-garble ×2** [invest-lane-1 + cicd-monitor] → SendMessage-resume + em-main curl cross-verify khớp). **Prev S116** — admin **`Dd55jBpj`** · user **`DVDr1UQ4`** (S116 — **`88368fd`** PE cho nhập giá ÂM ô báo giá [FE 2-app nút ± toggle + submit-gate `>0`→`!==0` + helper `hasRealSelectedQuote` 2-mirror `:201`/`:235`; BE submit-guard `:206` `Sum()<=0`→`All(==0)`; +9 test 486→495; **NO migration**]; **Run 386** PASS 5m28s rotate ×2 admin `D51OYyGV`→`Dd55jBpj` / user `BVdssm5S`→`DVDr1UQ4` CSS-frozen [logic-only fingerprint]; **byte-verify #77** `Đã nhập giá chào thầu`/`hoàn tiền NCC`/`phát sinh giảm`/`Đơn vị được chọn chưa có giá chào thầu` PRESENT [bundle-cũ=0]; smoke 200×3 · PE 401-secured · 89 bảng; cicd bắt bẫy snapshot-while-CI-running→poll-success TRƯỚC re-snapshot). **Prev S114** — admin **`D51OYyGV`** · user **`BVdssm5S`** (S114 — **`d436af2`** PE multi-NCC per hạng mục [Mig 65 backfill 2-chiều + BE re-key 5 financial→IsSelected + FE per-cell grid Detail×NCC 2-app SHA `ae3788e9`]; bundle rotate ×2 admin `acprMqfB`→`D51OYyGV` / user `Ck3BTDdA`→`BVdssm5S`; **byte-verify** `detailId`+`select-winner`+`hạng mục` PRESENT [bundle 1.65MB real-size]; smoke health/admin/eoffice 3/3 200 + endpoint POST select-winner bogus-401-live; **cicd garble #53 ×5 → em-main-solo curl-verify**; mig applied [API-healthy=migrations-ran-startup]). **Prev S113** — admin **`acprMqfB`** · user **`Ck3BTDdA`** (S113 — **Run #497** `5fa11b5` Supplier import v2 [Mig 64 publish/draft + dedup-MST + template + file mẫu] FE 2-app real-src rotate; JS admin `Cixlt_MA`→`acprMqfB` / user `BhBOG1dn`→`Ck3BTDdA` + CSS admin `Ds-E5neu`→`CfunQHbd` / user `Beb0Bb1h`→`DGqqHQXS`; ship-proof real-size 1.66/1.56MB + LM-in-window + **byte-verify** `Tải file mẫu`×1/`Đã công bố`×3/`Nháp (ẩn)`×4/`import/template`×1/`published`×5 PRESENT; Mig 64 prod 37/37-backfill sys.tables **89**; smoke health/admin/eoffice 200 + `import/template`-401-live + `suppliers?published=true`-401-live bogus-404-control). **Prev S112** — admin **`Cixlt_MA`** · user **`BhBOG1dn`** (S112 — **Run #496** `e100ef0` Supplier Excel-import Phase B FE 2-app [`SupplierImportDialog` NEW cả fe-admin+fe-user] + PE sign-off code-only; **real fe-src rotate — kết thúc #489→#495 non-determinism-freeze**; JS admin `BVyH-FY7`→`Cixlt_MA` / user `EDsZebvn`→`BhBOG1dn` + CSS admin `Bbtesa6B`→`Ds-E5neu` / user `BmuPz_Dy`→`Beb0Bb1h`; ship-proof real-size + Last-Modified-in-window + `"Database NCC"` marker PRESENT ×1; Mig 63 prod 2/2-col sys.tables **89**; smoke health/admin/eoffice 200 + PE-endpoint 200 + import-route preview-415/confirm-401-live bogus-404). **Prev S107** — admin **`BVyH-FY7`** · user **`EDsZebvn`** (S107 — **Run #489** `21387cd` +office-document 12th sub governance-only; **rotate benign #69-two-mode** [0 fe-src — Vite non-determinism], CSS frozen `Bbtesa6B`/`BmuPz_Dy`, real-size 1.64/1.55MB + Last-Modified-in-window 09:32/09:33 = ship-proof, Mig 62/89 frozen, smoke 200×3; hoist @S107-closeout per H1 flag D-BUNDLE-lặp — ⚠️ closeout-push kế có non-md sẽ rotate tiếp → Run #490 record nằm ở cicd MEMORY [authoritative], hoist ở bundle đầu phiên sau per precedent S99-#485). **Prev S104** — admin **`ChSNAJBK`** · user **`Bn2w1znH`** (S104 — **Run #488** `778fc98` Mig 62 Supplier expand 30-field; real-src-rotate FE 2-app SHA-mirror [form 4-section + Status select + `PathLink` 3 NAS-link], **sys.tables 89 pre==post no-new-table**, prod-verified marker grep-HIT, smoke 200×3; S104-shipped nhưng dòng-live `:27` lag tới S106 → hoist per H1 flag D-BUNDLE). **Prev S97** — admin **`mEGqlNWc`** · user **`Dnrp4PU1`** (S97 — **Run #484** `fb2dfa9` Mig 61 data-fix backfill; bundle rebuild **#69-benign** [0 FE-src change, review-workflow cicd re-snapshot LIVE → `CeTA7Z82`/`CGaAyXen` #483 đã bị #484 rebuild rotate]; backfill A/005/A/008 flag 0→1 prod-verified). **Prev #483** — admin **`CeTA7Z82`** · user **`CGaAyXen`** (S97 — **Run #483** `9e12e80` badge "✅ Đã được CEO duyệt" phiếu đi-hết-lên-CEO [PeFinalizeChip single-source + 6 call-site 2-app, đối xứng chip "⚑ Kết thúc·X"]; FE-only tận-dụng endsBeforeCeo runtime, no BE/mig; JS rotate CSS-frozen #69; byte-#77 "Đã được CEO duyệt" PRESENT cả 2 app + prev-badge additive no-regression; Mig 60 frozen; smoke 200×3 + PE-list 200). **Prev #482** — admin **`DR9q2VUy`** · user **`Bgz8u4E5`** (S97 — **Run #482** `8037fa0` endsBeforeCeo config→RUNTIME [Mig 60 `EndedByLevelFinalize`]: **Mig 60 applied prod** (history-top + col-default-0 EXISTS + backfill=0 UAT-no-marker + sys.tables **89** pre==post); **EF-ternary SQL-Server LIVE-confirmed** GET /purchase-evaluations 200 items=9 + PE-detail `31faef0d` 200 **endsBeforeCeo=False phase=7** = runtime-path chạy = **bug fixed LIVE** (NOT 500); JS rotate 2-app PeWorkflowPanel gate-diff, CSS frozen #69-REFINE; byte-#77 `endsBeforeCeo` PRESENT in-bundle; smoke 200×3. reviewer PASS 0-issue + test 440. **Prev #481** — admin **`Cf0o8dx8`** · user **`x8rppRAK`** (S97 — **Run #481** `1c8fb6a` PE finalize 2-fix [badge "không trình tới"→"Kết thúc tại {cấp}" + đảo default checkbox opt-in]; JS rotate real-FE 2-app `PeWorkflowPanel` diff, CSS frozen `Bbtesa6B`/`BmuPz_Dy` #69-REFINE logic-only; **byte-level #77** NEW `Kết thúc tại`+helper PRESENT / OLD `không trình tới`+`Đã BỎ tick` ABSENT; real-size 1.64/1.54MB; Mig 59/88-table frozen; smoke 200×3. FE-only mirror SHA `bcf812fd`, 0 BE/mig/test). **Prev S96** — admin **`COYAX-yQ`** · user **`0MU-kb4N`** (S96 — **Run #480** `0c2f9f6` price-lock; chuỗi 3 PE deploy #478 `e657faa` checkbox-opt-out → #479 `36cbf8b` chuông-stale-clear (BE-only) → #480 `0c2f9f6` khóa-giá-sau-duyệt, cicd PASS each ~5m; **FE JS rotate THẬT** (PeWorkflowPanel #478 + PeDetailTabs #480, 2-app) real-size 1.64/1.54MB vs 919b SPA-trap, CSS frozen #69-REFINE; Mig 59 frozen 0-mig; +Run #477 `ba4b8e0` NCC seed no-mig prod 21 NCC. **Verify byte-level:** prod `0MU-kb4N` CHỨA checkbox-fix ("BỎ tick"/"Đã BỎ tick") + "✅-static" cũ MẤT → checkbox "ko-được" = browser-cache KHÔNG deploy-fail). **Prev S95** — admin **`0T6vVJST`** · user **`BGXEVZO6`** (S95 — **Run #476** `18a17f5` H17 governance-only deploy; bundle rotate benign #69 CSS-frozen, prod 200×3, Mig 59 unchanged; cicd re-snapshot LIVE — pre-deploy `CkZ1MjC1`/`_-gpX7_Y`, mega-line S93 `CDn40vpV`/`CoPmPBg7` đã bị deploy trung-gian rotate từ S94). **Prev S85** — admin **`aKuNip19`** · user **`BUsL0HeQ`** (S85 — **Run #341** `49ac086` lệch-giờ TZ serialize UTC-with-Z; FE frozen #339+#341 BE-only. Chuỗi ~10 deploy #334→#341 buổi UAT anh Kiệt CV PRO: #334 `5a61254` batch CV PRO 6-fix → #335-#338 6 vòng UAT → #339 `1263c0d` workflow-preserve bug-class S42 → #341 `49ac086` TZ; #342 `d4f6021` docs+cicd BE-frozen, bundle giữ-nguyên gotcha #69-REFINE). **Prev S78** — admin **`CsJetgZH`** · user **`BVS0ApIm`** (S78 — **Run #330** `7886fd0` PE attach-file khi duyệt; bundle ROTATE từ S77 `BqKD3Y23`/`Cn-i349D` dù NO migration enum-only — gotcha #69 non-determ rebuild; cicd ship-proof byte-stable + fake-hash control). **Prev S77** — admin **`BqKD3Y23`** · user **`Cn-i349D`** (S77 — **Run #329** `e823694` banner Trả-lại; cuối chuỗi 10 deploy #320→#329 cùng ngày, cicd PASS each: #320 pill `DsSg6RRz`-era → #321 focus → #322 revert → #323 Mig57+notes `CPm4LTqm`/`BWJUAqEI` → #324 số-âm-đỏ `C6fx-0ea`/`N3sW4Div` → #325 indent `BhnNMucS`/`B1VebpXc` → #326 cờ-gấp-asymmetric `DwXqn37C`/`COXMCv7E` → #327 decouple `B0gboSAg`/`DbDg7pM-` → #328 notify (BE-only, FE frozen) → #329 banner **`BqKD3Y23`**/**`Cn-i349D`**). **Prev S76** — admin **`jOqxW4-p`** · user **`DbsznVvR`** (S76 — **Run #319** `21d1f4e` bảng lưới `` ngân sách viền-ô; chuỗi S76 cùng ngày: #318 `e33481e` feature ma-trận-3-cột + badge quyền-NS `BhFDF9IJ`/`BAkuRl3C` → #319 **`jOqxW4-p`**/**`DbsznVvR`**, cicd PASS each, smoke 3×200, Mig 56 applied prod #318). **Prev S74** — admin **`BYF5vIMJ`** · user **`CB-tiRxd`** (S74 — **Run #315** `8655ebf` Mig 55 CcmNote, cicd PASS ~4m54s: Mig 55 applied prod CcmNote nvarchar(1000) nullable · sys.tables 88 · smoke 4×200 · 0 regression). **Prev S73** — admin **`Bv3jUCNo`** · user **`BWlMBQz6`** (Run #314 `6aa4dcb` FE empty-candidates guard fix; chuỗi 2 deploy: #313 `1d86abc` feature `OlNyG9OD`/`DSzSLVtL` → #314 **`Bv3jUCNo`**/**`BWlMBQz6`**, cicd PASS each). **Prev S72** — admin **`fc_xkNpJ`** · user **`DP-tBcg0`** (Run #312 governance commit `18fced6`; bundle ROTATE do **non-deterministic hash + deploy rebuild-FE-unconditional** (gotcha #69) — 0 FE source change, prod state/DB GIỮ NGUYÊN). **Prev S69** — admin **`BgNCjwsG`** · user **`CBvh0vtf`** (Run #308 PE cờ gấp + ngưỡng CCM; chuỗi 4 deploy session: #305 Văn phòng số foundation → #306 re-skin 10 page → #307 Office golive (BE-only) `Wt54PHYl`/`B99fMU6X` → #308 **`BgNCjwsG`**/**`CBvh0vtf`**). **Prev S68** — admin **`CNUv1jxY`** · user **`CpOskeS1`** (S68 — Run #304 `37752eb` fix tên đen→trắng; chuỗi #303 `6983609` `D532XZKG`/`CuFaBoWt` → #304 **`CNUv1jxY`**/**`CpOskeS1`**, cicd PASS each). **Prev S67** — admin `CcrZqfht`/user `DniDFUB_` (S67 — 6 deploy Run #297→#302; admin rotate chuỗi #298`xkSz9BfE`→#300`PxiZQkaw`→#301`I1fpLeYw`→#302**`CcrZqfht`** · user #297`BumgrwCJ`→#300`B36hGoKd`→#301`DrQYkzh0`→#302**`DniDFUB_`**; #299 tests BE-only cả 2 frozen, cicd PASS each). **Prev S65** — admin `BDwV5d0X`/user `DbVv6rsf` (Run #293-295). Prev S62 admin `0xKYGhhf`/user `C81ZdG9G` (Run #286). **Prev S59:** admin `B1DtNT9C` · user `D6uF3Mln` (Run **#282** `792c030` FINAL — bỏ nút Thêm hạng mục; ships kèm `80b64dd` gỡ Điều khoản TT, #281 cancelled-benign ancestor-verified). Chuỗi S59 cùng ngày: #280 `69997da` (`BKy_8OO9`/`XcZ6PRyA`, ships kèm `f21c55d` table-fixed #279-cancelled) · #278 `9c330d2` self-approve+quick-add-NCC (`BSh2fG2X`/`D22KfpPc`, authz probe 4/4) · #277 `faed59f` SearchableSelect (`ex7Tc92G`/`DzUeSk96`) · #276 `c869d26` rename 71 PMH (`BBA0KSWu`/`DzdTI18G`) · #275 `bbd1554` dọn demo WorkItems (FROZEN BE-only) · #274 `0eafcd3` tree 4 tầng (`DuU7OTym`/`DWyeTzf3`) · #273 `56882ac` wipe + tree v1 (`R9uGRxvw`/`DikfX1RD`). Prev S58: Run #386 `3ebaf84` admin `DMm9rtNA`/user `BUkOMn_Y` (chi tiết session log S58). @@ -457,6 +457,16 @@ monthly re-tier mega-line + ef-core SKILL Mig→59 + 3 vocab-fork (2026-07-01 du --- +## ✅ Recently Done (S146 — 2026-07-22 → 07-23) + +- **Áp `spec-apply-hub-s145-v2` 5 axis** (governance-only, **0 prod-code / 0 mig**): C7 **§N.8** predicate 4-vế · hook `wal-flush.ps1` **4 path** (+`.claude/sessions/`) · Sàn-3 **⑤ + ORPHAN-L** · D2 **KIỂM end-only** · `§L.c` completeness-gate **có RĂNG** (cấm bare-PASS) · line-ref `:7`→`:13`. Workflow S145 chết giữa chừng ⇒ `/tiep §4` **relaunch-cắt-gọt** `wf_3d803740-41d` 3 worker DISJOINT-file 3/3 DONE. +- **🎯 LIVE-VERIFY hook 4-path PASS repo THẬT** — `da7ee8a` nuốt `sessions/session-1/probe.md` (worker chỉ verify được cây tạm + **khai thật** giới-hạn ⇒ lead làm nốt). +- **Owner-decision @S146:** `session_ctx_kb=64` **tường-minh** (giữ nguyên caveat ghost-wire — 0 reader) · session-model **3 câu**: scaffold **idempotent** (tách *cấp SỐ* ⟂ *tạo THƯ-MỤC*) · `closed.md` **WIRE** (`session-end §6.3-bis`) · V2 **auto** (gỡ cổng NGƯỜI, **giữ** cổng NHỊP 6/15/3 — **chưa** phải bookend-hub). +- **🥇 session-model chạy TRỌN VÒNG đầu tiên:** `session-1/pause-S146-*` → `/tiep` → `resume-S146-*` → **ORPHAN-L cân sổ, im đúng**. Tín-hiệu **⑤ fire lần đầu và fire ĐÚNG** (không vacuous). +- **H24 force-fire** (P=8 `wal: pause` ⇒ OVERDUE bất-kể counter; luật "auto" mới ⇒ chạy thẳng): 2 vai + `h24-audit` → **7 FLAG**, vá hết + re-verify. Bắt được: sweep-consent **sót 6 site** · `closed.md` **wired-but-declared-unwired** (ghost-wire **chiều ngược**) · **owner-decision `[7]` bị ghi đè do tái-dụng slot-index** (mất uỷ-quyền push, lead hỏi lại 3 lượt). +- **🔴 3/3 vai lane-H24 garble `#53`** — con ghi-đĩa-SỚM cứu trọn, con ghi-MUỘN mất trắng phải resume. Chứng lại: chặn `#53` **không** bằng prompt hay hơn, mà bằng **ghi-đĩa-trong-lúc-làm**. +- **Sổ:** orphan run-folder **3 → 0** (retro-harvest 2 folder S144 + `implement-synthesis` S145) · carry **14 → 20** (6 mục mới **có tag** `[carry:*]`, trước đó tách đôi 2 sổ không sổ nào đủ) · **E-013 + E-014** vào error-ledger · `.gitignore` +`scheduled_tasks.lock`. + ## ✅ Recently Done (S141–S143 — 2026-07-20 → 07-22) **S141–S143 — Wave adap đợt-9/10 ĐÓNG TRỌN (7 thư) + closeout OUTWARD — governance-only: 0 prod-code, 0 mig, test 528 giữ, bundle FROZEN `BVCukFP5`/`DoxyEOxh`. Roster 14 → 17.** **S141 vòng-1** `wf_3e1ade40-704` **CHẾT giữa chừng** → reconcile ground-truth-từ-ĐĨA, đóng orphan partial-honest 5/13. **S142 vòng-2 CẮT-GỌT** `wf_1e936b16-30c` (đúng `tiep.md §4` relaunch-đã-cắt-gọt, KHÔNG chạy lại từ đầu): 2/2 lane, 0 error/0 garble, 424.755 tok; AC1–AC13 lead verify độc-lập. Land: **bộ-ba `harness-{eval,refine,audit}`** (3 persona + 3 diary + `§2.1.9`/`§L.b(k)` consent-gated TUẦN-TỰ) · **contract v2 dangling-head** khuôn ①a (3-điều-kiện `squash-benign`, giữ FAIL-LOUD cho counter-lùi ∧ object-missing) + detector H24-5 INFORM-sink · **stamp-decode** khoan-dung 3 dạng + port `scripts/stamp_verify.py` · **annex phép-8** + `_tick_invariant_note` · **sweep roster 13 site** · draft session-model prereq (a)+(b) — **0 wire** (chờ owner duyệt VC). **S143 `/tiep` closeout OUTWARD** (anh gật): adap-report **7/7** đủ 5-trường · email hub `6c94873f72e0` selftest exit 0 · STAGE-2 7 thư → `inbox/ai_infra/` 0-pending cross-check 2 chiều · squash K=8 → push `2757e41` (0 `wal:` lọt remote, 12==12) · vá drift **skill-matrix 15→17 row** (thiếu 2 vai H24 từ S121). **Contract v2 chạy runtime LẦN ĐẦU** @S143: tick 16→17, nhánh `OK-reachable`. **+vế-4 `pull-cach` cho `nhip-no-probe.ps1`** (fault-inject 7 ca 2-chiều: isolation · anti-Goodhart OUTBOUND · FLAG khi ngưỡng≤N · IM khi ngưỡng>N; ngưỡng CỐ Ý để trống = quyền anh). 🔴 **2 phát hiện khai theo G-015:** (a) **whitelist `tools:` KHÔNG chặn ghi ở runtime** — 6 vai read-only không khai `Write/Edit` nhưng roster runtime vẫn cấp, **append ở cuối** (tell = vị-trí; `implementer-backend` giữ đúng thứ-tự file) ⇒ "chặn-bằng-thiếu-tool" là **tuyên-bố ý-định**, backstop thật = git-diff commit-gate; cơ-chế **chưa kiểm** · (b) **pull-lag do canh nhầm chỗ** — "watch `broadcasts/inbox`" không bao giờ thấy thư CHƯA kéo. 🔴 **Nấc cao nhất khai được = `executed-file / verified-pending-restart` — trio CHƯA spawn lần nào.** **Vòng audit S143 (anh gật "làm hết"): 3 lane — `reviewer` FAIL 1C/4M/4m/1nit + 19 số tự re-đo · `lead-view` 3 FLAG · `lead-omission` 3 FLAG/3 INFORM; lead re-đo ĐỘC-LẬP từng finding trước khi vá, 9/9 vá xong.** 🔴 **CRITICAL = E-012/AS-16 `bằng-chứng-tự-huỷ-sau-squash`** (7 report + email neo sha `wal:` chưa-push → squash phá đúng sha đó → re-anchor `2757e41` + **errata `e43484cef10f`** gửi hub, CẤM sửa bản đã stamp). MAJOR khác: "TRIPLE 17/17/17" **chọn enum DỄ** (`README:225` tự xưng "ĐỦ roster" còn 14 + "4 monitor"; `:27` "Roster THẬT" còn 14 — **lọt vì AC4 grep theo SỐ mà 2 site liệt-kê TÊN**) · `TOTAL 46 "== baseline"` sai (baseline ghi = **45**; số đi 45→46→47) · 4 site còn khai "NO Write/Edit" như cơ-chế chặn. 🔴 **Tool-grant nay có NHÂN-CHỨNG first-person:** `reviewer` (frontmatter **0** Write/Edit) **đã Write+Edit thật** — đếm lại **9 vai** read-only cùng hình dạng (bản đầu khai 6 = under-count). **3/3 sub garble #53, cả 3 resume, 0 mất dữ-liệu nhờ ghi-đĩa-trong-lúc-làm** (sổ đếm ×20 qua S118 → **×23 qua S143**). +vế-4 `pull-cach` cho `nhip-no-probe` (fault-inject **7 ca 2 chiều**, ngưỡng để trống = quyền anh) · `flag_classes` **10→11** (+`gap-incident-unrecorded`, anh duyệt — vai lead-omission **từ chối tự chế class** và escalate đúng luật CLOSED-enum). State GIỮ NGUYÊN: **Mig 67 · 89 bảng · 528 test · gotcha 83 · menu 54 · prod 37 NCC/17 user.** **Lead Opus 4.8.** *(H1 @S143 bắt: đây là row session DUY NHẤT từng thiếu dòng `Lead ` — nay bổ sung. 🔴 Còn CHỜ ANH: `settings.json` pin nay = `claude-opus-4-8[1m]` từ 2026-07-20 trong khi ô canonical §Sub-agents còn ghi "Fable 5", và `session-start.md:43` outage-recipe bảo đổi sang **đúng cái đang pin** ⇒ recipe hồi-phục thành no-op. Nhãn flip = quyền anh, em không tự đoán.)* diff --git a/docs/changelog/sessions/2026-07-22-2350-S146-apply-hub-answers-session-model.md b/docs/changelog/sessions/2026-07-22-2350-S146-apply-hub-answers-session-model.md new file mode 100644 index 0000000..5843975 --- /dev/null +++ b/docs/changelog/sessions/2026-07-22-2350-S146-apply-hub-answers-session-model.md @@ -0,0 +1,41 @@ +# S146 — 2026-07-22 · Áp spec-v2 + 3 owner-decision session-model + closed.md/auto + +> Vào bằng `/tiep` nối S145 (không `/session-start`). Governance/config-only — **0 file prod-code, 0 migration**. +> Lead: Opus 4.8 · HMW-mode ON · 1 lần `/pause` giữa closeout rồi `/tiep` chạy tiếp. + +## Arc đã đóng + +**1. Relaunch-cắt-gọt workflow chết giữa chừng.** `wf_f9f24694-12b` (S145) chết ở `/pause`, chỉ axis B landed. `/tiep §4` → bỏ hẳn run cũ (cross-session resume KHÔNG hợp-lệ) → `wf_3d803740-41d` 3 worker DISJOINT-file, **3/3 DONE** (511k tok, ~20′). Harvest-hồi-tố axis B bằng **đo đĩa**, không tin return đã mất. + +**2. 🎯 LIVE-VERIFY hook 4-path trong repo THẬT.** Commit `da7ee8a` nuốt `.claude/sessions/session-1/probe.md`. Worker CE chỉ verify được **cây tạm** và **khai thật** không quan-sát được repo-thật từ subagent (hook ở `Stop`, không phải `SubagentStop`) ⇒ lead làm nốt. Khai đúng phạm-vi = lý do mảnh này không thành claim rỗng. + +**3. Owner chốt 3 câu session-model** (`"1 và 2 → giống hub. 3 → auto."`): +- **(1) scaffold IDEMPOTENT** — gỡ mâu-thuẫn thật giữa `session-start:88` ("CHỈ /session-start") và `pause:25` ("chưa có thì tạo"). Gốc lỗi = **gộp 2 khái-niệm**: nay tách **cấp SỐ** (độc-quyền `/session-start`) ⟂ **tạo THƯ-MỤC** (idempotent). +- **(2) `closed.md`** = `_end` chốt-kết hub → `session-end §6.3-bis`, FROZEN 4 trường, idempotent NO-OP, **NO-OP im-lặng nếu 0 thư-mục** (cấm sổ rỗng giả). Khoá nốt vòng ORPHAN-L. +- **(3) V2 "auto"** — gỡ **cổng NGƯỜI** ở 3 chỗ, **GIỮ cổng NHỊP** `6/15/3`. Khai rõ vào doc: *"auto = bỏ HỎI, không phải bỏ ĐẾM"* ⇒ **chưa** phải bookend-hub. + +**4. `session_ctx_kb = 64`** (owner lật từ "để trống"). Kèm `_owner_set` + **GIỮ caveat ghost-wire** (0 script đọc khoá). Có số ≠ có hành-vi. + +**5. Cơ-chế session-model chạy THẬT lần đầu, end-to-end.** `session-1/pause-S146-*.md` (context-block đầu tiên) → `/tiep` → `resume-S146-*.md` → **ORPHAN-L cân sổ, im đúng**. Tín-hiệu **⑤ fire lần đầu và fire ĐÚNG** — không vacuous. + +## 🔴 3 lỗi của LEAD trong phiên (ghi để không tái) + +**(a) Phép quét cardinality sửa 4 LẦN trong 1 phiên:** quá rộng (nuốt câu đúng `session-end.md:162`) → quá hẹp (**lọt 4 ca thật**, reviewer F2 bắt, gồm chính F1) → rộng lại (kéo 3 miền khác) → chốt. +🔴 Cả 4 đều vì **cố mã-hoá ý-định NGỮ-NGHĨA vào một regex khôn**. Nấc đúng = **lưới-soát-cho-người + allowlist CÓ TÊN + `use ⟂ mention` (🧊)**. Lần 4 = **citation-trap** (bộ dò bắt chính nốt-vá vì nốt vá trích giá-trị cũ); giới-hạn kèm: 🧊 lọc theo **DÒNG** ⇒ **mega-line cấm dùng 🧊**. + +**(b) Trả lời SAI về `/snapshot`.** Lead nói *"không có, bẫy tên gọi"* — kết-luận từ đĩa SE mà **không mở manifest hub**. Thực tế `101e69d6 §1` liệt **3 lệnh**, lệnh thứ-3 = **chụp-nhanh không-dừng**, là **floor thật**. Đã đính-chính. + +**(c) F1 residual có người chỉ tận nơi mà vẫn rơi.** Worker CE liệt đúng 2 dòng `hook-3-path` trong sub-file, gắn nhãn "cần → 4, worker-3 sở-hữu"; worker D không vá; lead cũng không bắt vì (a). Reviewer bắt. + +## Số đo +- detector **TOTAL 47** · counter **20** (tick @`/tiep`; `/pause` + `/tiep` sau đều **NO-OP đúng OR-guard** — chặn bẫy +2/chu-kỳ **2 lần** trong 1 phiên) +- `NHIP-NO: kiem light 3/6 deep 3/15 ok | tran-bo-nho 1 over-cap | run-chua-gom 0 | pull-cach 0 ngay` +- orphan run-folder **3 → 0** (retro-harvest 2 folder S144 + implement-synthesis S145) +- `wf: hmw-implement-spec-v2-relaunch run=.claude/workflows/runs/2026-07-22-S145-apply-hub-answers runId=wf_3d803740-41d done=3/3 harvested=yes` + +## Còn treo (carry) +1. `/snapshot` — lệnh chụp-nhanh không-dừng (hub floor) — **chưa dựng** +2. `_context` tầng **STOCK** + nén-thành-con-trỏ — SE mới có tầng *flow* +3. Bookend đủ **5/5** vòng? — đo được: V1+V3 = 2 đầu thật · V2 auto-khi-tới-nhịp · V4 on-signal · V5 liên-tục +4. **Meld-forward** `.claude/sessions/` qua squash — **CHƯA ĐO** +5. 14 carry cũ ở `docs/HANDOFF.md` diff --git a/docs/governance/error-ledger.md b/docs/governance/error-ledger.md index 89e7896..a675a34 100644 --- a/docs/governance/error-ledger.md +++ b/docs/governance/error-ledger.md @@ -84,6 +84,24 @@ Detect by **action-signature** (NOT "AI tự phán có vi phạm không"). Scan > Format: `E-NNN | date | rule | what | 5-why root | fix (prod-bug = 2-fix: code + guard) | prevention | tags[TYPE/ACTOR/COMPONENT]` +### E-014 — AS-18 slot-index tái-dụng làm MẤT owner-decision không để lại vết (S146, H24 `lead-omission-auditor` bắt, lead verify bằng `git show`) +- **rule (AS-18 NEW):** khối đánh số (`OWNER-DECISION [n]`, checklist, enum…) **CHỈ ĐƯỢC TĂNG index**. **CẤM tái-dụng số cũ cho nội-dung mới.** Đè slot = nội-dung cũ **biến mất im-lặng** — khác hẳn đổi giá-trị (còn thấy giá-trị cũ để grep). +- **what:** owner @S146 nói *"còn lại xử lý hết xong rồi session-end nhé"*; lead ghi ĐÚNG vào `.claude/WAL.md:9` slot `[7]` = **uỷ-quyền commit+push** (`ad02483`, `9c68bae`). Sau đó lead thêm 3 quyết-định session-model và **tái-dụng slot `[7]`** ⇒ `e7d06f2` mất hẳn dòng cũ. Grep toàn repo = **0 hit**. +- **hệ-quả THẬT (không phải lý-thuyết):** lead hỏi lại *"cho push chưa"* **3 lượt liền** — hỏi lại đúng thứ owner Đà trả lời, và hỏi ngay dưới khối tự đặt tên **"ghi đè, KHÔNG hỏi lại"**. Lead làm **ngược** chính luật mình viết. +- **5-why:** (1) lead thêm mục mới vào khối có sẵn → (2) chọn số kế-tiếp *theo cảm-giác* thay vì đọc số lớn nhất đang dùng → (3) `[7]` trông "trống" vì lead nhớ khối chỉ tới `[6]` → (4) WAL **ghi-đè toàn-file** nên không có diff-review từng dòng như commit thường → (5) **máy MÙ hoàn-toàn**: không detector nào biết `[7]` từng là thứ khác. +- **fix:** khôi phục `[7]` (nguồn `git show ad02483:.claude/WAL.md:9`) + đẩy session-model xuống `[8]` + ghi luật **SLOT-INDEX CHỈ-TĂNG** ngay tiêu-đề khối. +- **prevention/guard:** vai H24 soi **CÁI THIẾU** = catch-layer **DUY NHẤT** cho lớp này (H24 §2(1) *"máy MÙ gần như hoàn toàn"*). 🔴 Nhắc: WAL ghi-đè ⇒ **mọi mất-mát trong WAL đều im lặng** ⇒ đối-chứng phải là `git show :.claude/WAL.md`. +- **tags:** [slot-reuse / lead / WAL.md · owner-decision · gap-owner-specifics · class_repeat 2→3 CHẠM jump] + +### E-013 — AS-17 sự-cố KHÔNG vào sổ bền + phép trích-xuất hỏng đọc thành "sạch" (S146, cụm 2 lỗi cùng lớp *"vắng mặt trông giống ổn"*) +- **rule (AS-17 NEW):** (a) sự-cố chỉ có vết trong **run-folder** = **CHƯA vào sổ**; phải đổ vào ≥1 **sổ bền** (error-ledger / STATUS / HANDOFF / auto-memory). (b) phép trích-xuất trả **RỖNG** phải phân-biệt *"không có gì"* ⟂ *"phép đo hỏng"* — **CẤM đọc rỗng thành sạch**. +- **what (a):** garble `#53` THẬT trên `harness-audit` @S144 (`trio-synthesis.md:20-21`) + lead thu-hẹp tập đối-chứng mà im-lặng (*"đối chứng 4 mốc: 0 LỆCH"* trong khi khối liệt **5**, mốc-5 chính là mốc lệch) ⇒ **0 hit** ở cả 5 sổ bền; sổ đếm `feedback_agent_return_garble_recover.md` dừng ở `×25 qua S143`. **S146 thêm 3 garble nữa** (lead-view · lead-omission · h24-audit — **3/3 vai lane-H24**). +- **what (b):** lead vá 6 site consent theo danh-sách H24 liệt, **vá 5 sót 1** (`h24-audit.md:25` — câu tự mâu-thuẫn *"KHÔNG consent-gate … khi OVERDUE + anh consent"*). **Cơ-chế tái-dựng được:** lệnh trích `grep -oE '.{50}consent.{80}'` đòi **đúng 50 ký-tự TRƯỚC** match; trên dòng đó `consent` ở ~offset 30 ⇒ **0 match ⇒ output RỖNG** ⇒ lead đọc thành *"dòng này không có gì"*. Đúng phải là `.{0,60}`. +- **5-why (b):** (1) vá theo danh-sách người khác liệt → (2) không tự grep lại sau khi vá → (3) dùng cửa-sổ ngữ-cảnh **cố-định** thay vì **0..n** → (4) rỗng **trông y hệt** sạch (khác `grep -c` trả `0` — một con SỐ, nhìn là biết đang đếm) → (5) `h24-audit` bắt được vì nó **đọc dòng đó trong chính persona nạp vào mình** + đối-chứng đĩa = 2 nguồn. +- **fix:** vá `:25`; re-grep toàn file = 0; ghi cụm sự-cố vào chính entry này. +- **prevention/guard:** 🔴 **Luật: vá xong PHẢI tự grep lại bằng lệnh KHÁC lệnh đã dùng để tìm** (khác mẫu, khác cửa-sổ). Họ hàng đã có trong sổ: `grep -c` (dòng) vs `grep -o|wc -l` (occurrence) — nay thêm **cửa-sổ-ngữ-cảnh-cố-định**. +- **tags:** [incident-unrecorded + extraction-silent-empty / lead / error-ledger · h24-audit.md:25 · #53 ×3 S146] + ### E-012 — AS-16 bằng-chứng-tự-huỷ-sau-squash: 7 adap-report + 1 email hub neo vào sha `wal:` chưa-push, closeout-squash phá đúng sha đó (S143, reviewer-gate độc-lập bắt SAU khi thư đã gửi) - **rule (AS-16 NEW):** artifact OUTWARD phải cite **commit SẼ SỐNG sau squash**, và phải qua `git status --porcelain` **TRƯỚC** khi stamp. Vi-phạm nền: `/adap-report` §3 *"evidence: commit-sha · file path · byte/dòng (đo THẬT)"* — đo thật nhưng **neo vào con-trỏ sắp chết**; và `/send-email` 6c selftest-stamp chỉ kiểm **hash khớp thân-thư**, KHÔNG kiểm **thân-thư có còn đúng sự-thật** lúc phát. - **what:** (1) 7 adap-report cite `1a0fa59`/`a458102`/`96ab2679`/`c3708e9`/`b1d92b9` (đều `wal:`-commit local). Closeout §5.0 `reset --soft HEAD~8` gộp chúng vào `2757e41` ⇒ cả 5 thành **dangling**: `cat-file -t` = `commit` (sống nhờ reflog LOCAL) nhưng `merge-base --is-ancestor origin/main` = **exit 1** ⇒ hub clone repo về `git show 1a0fa59` = **object missing**. Nội-dung nguyên vẹn trong `2757e41` ⇒ **chết con-trỏ, không chết việc**. (2) Cùng gốc: report + email khai `is-ancestor 96ab2679 HEAD = exit 0 → OK-reachable` làm bằng-chứng "contract v2 chạy runtime" — squash **cùng phiên** lật nó thành `exit 1`/`SQUASH-BENIGN` ⇒ **phép đo tự huỷ trong chính phiên phát-biểu nó**. (3) Biến-thể thứ ba: email `:47` khai *"vế pull-age **chưa làm**, chờ owner"* — owner gật ngay sau đó, lead làm, `scripts/nhip-no-probe.ps1` sửa **sau** khi thư đã stamp ⇒ bản đã-niêm khai sai hiện-trạng, và **không sửa được** (sửa = vỡ hash). diff --git a/docs/governance/harness-11-engine.md b/docs/governance/harness-11-engine.md index 9e67a7f..1ad747b 100644 --- a/docs/governance/harness-11-engine.md +++ b/docs/governance/harness-11-engine.md @@ -342,7 +342,7 @@ SE đã có RAG golden-set harness (KHÔNG phải gap): `eval/golden-set-solutio | `/fable-real <đề-bài>` | **lệnh-A** single top-model | 1 vai anh gán chạy 1 lần top-model THẬT (deep pass; Fable up → single-Fable · outage → single-Opus-1M/run) | | `/fable-clone <đề-bài>` | **lệnh-B** ensemble tier-2 | N lane đa-lăng-kính CÙNG 1 vai (`hmw.js parallel`) + em-main refute+synthesize | -- **(i) Vai owner-gán per-invocation:** `` ∈ **roster** (`investigator-codebase` · `investigator-api` · `implementer-backend` · `implementer-frontend` · `frontend-designer` · `database-agent` · `office-document` · `test-specialist` · `reviewer` · `cicd-monitor` · `tooling-auditor` · `harvest-curator` · **`lead-view-auditor` · `lead-omission-auditor`** ← +S121 W2, H24 · **`harness-eval` · `harness-refine` · `harness-audit`** ← +S141, bộ-ba đồng-kiểm memory). 🔴 Danh-sách này là **BẢN SAO** — nguồn thật = `hmw.js` VALID_ROLES (khối hằng-số `VALID_ROLES`, tra bằng tên **KHÔNG bằng số dòng** — [n6] line-range cũ `:22-36` đã lệch khi enum dài thêm); lệch ⇒ **tin `hmw.js`**. Số vai canonical → [`docs/STATUS.md`](../STATUS.md) §Sub-agents (B1). Thiếu/sai vai → **em-main hỏi anh 1 dòng**, KHÔNG tự đoán. Hiệu-lực CHỈ lượt đó (không marker, không sticky-mode). ✅ **VALID_ROLES = ĐỦ roster:** 2 monitor H1/H2 bổ sung S110 anh-directed (10→12) → +2 monitor H24 S121 W2 (12→14) → **+3 trio-memory S141 (14→17)** — lệnh-B trọn roster. 🔴 Số canonical → [`docs/STATUS.md`](../STATUS.md) §Sub-agents, **KHÔNG chép số ở đây**. *(🧊 limitation cũ "2 monitor ∉ 10-vai → fail-soft default-subagent" + H6-design "monitor ngoài workflow" superseded điểm này; monitor vẫn INFORM-only, lane RETURN-only.)* +- **(i) Vai owner-gán per-invocation:** `` ∈ **roster** (`investigator-codebase` · `investigator-api` · `implementer-backend` · `implementer-frontend` · `frontend-designer` · `database-agent` · `office-document` · `test-specialist` · `reviewer` · `cicd-monitor` · `tooling-auditor` · `harvest-curator` · **`lead-view-auditor` · `lead-omission-auditor`** ← +S121 W2, H24 · **`harness-eval` · `harness-refine` · `harness-audit`** ← +S141, bộ-ba đồng-kiểm memory · **`tooling-harvest-audit` · `h24-audit` · `sleep-audit`** ← +S145, round-KIỂM ×3 [tooling-harvest · soi-lead · nén-ngủ]). 🔴 Danh-sách này là **BẢN SAO** — nguồn thật = `hmw.js` VALID_ROLES (khối hằng-số `VALID_ROLES`, tra bằng tên **KHÔNG bằng số dòng** — [n6] line-range cũ `:22-36` đã lệch khi enum dài thêm); lệch ⇒ **tin `hmw.js`**. Số vai canonical → [`docs/STATUS.md`](../STATUS.md) §Sub-agents (B1). Thiếu/sai vai → **em-main hỏi anh 1 dòng**, KHÔNG tự đoán. Hiệu-lực CHỈ lượt đó (không marker, không sticky-mode). ✅ **VALID_ROLES = ĐỦ roster:** 2 monitor H1/H2 bổ sung S110 anh-directed (10→12) → +2 monitor H24 S121 W2 (12→14) → **+3 trio-memory S141 (14→17)** → **+3 round-KIỂM `tooling-harvest-audit`/`h24-audit`/`sleep-audit` S145 (17→20)** — lệnh-B trọn roster. 🔴 Số canonical → [`docs/STATUS.md`](../STATUS.md) §Sub-agents, **KHÔNG chép số ở đây**. *(🧊 limitation cũ "2 monitor ∉ 10-vai → fail-soft default-subagent" + H6-design "monitor ngoài workflow" superseded điểm này; monitor vẫn INFORM-only, lane RETURN-only.)* - **(ii) Spec-file pipeline (mỗi run engine-đắt PHẢI sinh):** `.claude/workflows/runs//spec--.md` — 3-heading CỐ-ĐỊNH: **[1] Tính-năng/đề-bài** (1–3 câu) · **[2] Cách implement** (bước + quyết-định + ràng-buộc + đường-chết) · **[3] Checklist** (vai + deliverable + acceptance đo được). Luồng: engine **propose-only** → lead **verify** → **LEAD ghi** (single-writer) → worker **Opus MAX** thực-thi THEO spec bơm qua `args` (`hmw.js` KHÔNG đọc file spec). - **(iii) 4 ghi-chú trung-thực (🔴 phải hiện-diện — nấc owner-gated, KHÔNG code-enforced §X8):** - **(a)** owner-gated tầng LỆNH + kỷ-luật lead cho việc CHỌN/ELEVATE vai, **KHÔNG code-enforced** — đường code `tier:'fable'` vẫn tồn-tại, hmw.js KHÔNG ép vai-nào-được-elevate. *(REC-3 2026-07-13: hmw.js GIỜ code-enforce vai-INVALID — typo ∉ VALID_ROLES → STOP-HARD throw; đó là guard typo, KHÁC gate vai-elevation vẫn là discipline.)* Bảo-đảm elevation = MỌI đường truy về lượt owner-gõ (kỷ-luật), không phải guard chặn. @@ -403,13 +403,23 @@ SE đã có RAG golden-set harness (KHÔNG phải gap): `eval/golden-set-solutio > Adopt S111 (2026-07-12) từ broadcast `2026-07-11-Governance-harness-22-wal-session-continuity` (body-sha `3de0758a` verified; ≙ AI_INFRA CANONICAL §I4 + §H1). Giải: phiên chết giữa mạch việc (limit/crash/tắt-máy/đổi-acc/chết-giữa-workflow) → mất trí-nhớ chưa-ghi + đốt-lại token. **"WAL" ở đây = sổ-liên-tục-phiên** — KHÁC "WAL RUN-LEDGER hai-nhịp" đã retired H18-B (trùng chữ, khác cơ-chế; alias-map awareness). - **N.1 Sổ WAL (🔴):** `.claude/WAL.md` **≤40 dòng, ghi-đè toàn-file KHÔNG append**; `chain:` mục `[x]/[!]/[ ]` **KÈM bằng-chứng lệnh** (không mô-tả suông) + `next:` đúng 1 mệnh-lệnh + `verify:` ≥1 lệnh CHẠY ĐƯỢC, chạy TRƯỚC next — **ground-truth thắng WAL** (lệch → sửa WAL cho khớp thực-tế rồi mới đi). **CẤM secret** (file được commit). Template rỗng → `session-end §6.4`. -- **N.2 Hai tầng ghi (🔴):** tầng NỘI-DUNG = **lead single-writer** (D9-consistent), ghi lại sau MỖI subtask đổi trạng-thái (kể cả lúc phóng + thu workflow-run). Tầng PERSIST = **Stop-hook `.claude/hooks/wal-flush.ps1`** deterministic (PS1 — chọn path-independent vì PATH-order bash 2-context Windows ngược nhau, lead-verified S111): hook **ĐƯỢC làm đúng 2 việc** = `git add` per-path 3 path cố định {`.claude/WAL.md` · `.claude/agent-memory/` · `.claude/workflows/runs/`} + commit CAND-only message `wal: flush `; hook **KHÔNG-ĐƯỢC** = sinh/sửa nội-dung · push · block-stop · đụng path ngoài list · exit≠0 (fail-open MỌI nhánh). Per-path add + CAND chống bẫy all-or-nothing đa-pathspec (bài học test-proven nguồn). -- **N.3 Trạng-thái hook = ✅ VERIFIED-RUNTIME S111 CÙNG PHIÊN (nâng từ STAGED-until-verified — chống ghost-wire S100 bằng bằng-chứng THẬT):** hooks-entry `.claude/settings.json` ghi S111 → Stop-hook **HOT-RELOAD + FIRE ngay giữa phiên** (KHÔNG cần restart): commit **`12071c5 "wal: flush 20260712T1105"`** chứa ĐÚNG 4 file thuộc 3 path cố định (WAL.md + diary invest + run.md + spec), CAND-commit chuẩn (settings.json/broadcasts/docs đứng NGOÀI — persist-only đúng thiết kế), 0 push. Giả-định honest-(c) nguồn "hook chỉ nạp lúc khởi-động phiên" → trên harness NÀY = hot-reload; ⚠️ **ENV-DEPENDENT** (data-point #2 sau skill-registry hot-reload S107/S111 — hub từng NGƯỢC kết quả, KHÔNG fleet-generalize; phiên MỚI vẫn re-check 1 lần trong pilot-checklist, không fire → thử schema phẳng). *(Nấc trước khi có bằng-chứng = STAGED-until-verified: CẤM claim "đang chạy" khi chưa thấy wal:-commit do hook sinh — nguyên tắc GIỮ cho mọi hook tương-lai.)* +- **N.2 Hai tầng ghi (🔴):** tầng NỘI-DUNG = **lead single-writer** (D9-consistent), ghi lại sau MỖI subtask đổi trạng-thái (kể cả lúc phóng + thu workflow-run). Tầng PERSIST = **Stop-hook `.claude/hooks/wal-flush.ps1`** deterministic (PS1 — chọn path-independent vì PATH-order bash 2-context Windows ngược nhau, lead-verified S111): hook **ĐƯỢC làm đúng 2 việc** = `git add` per-path **4 path cố định** {`.claude/WAL.md` · `.claude/agent-memory/` · `.claude/workflows/runs/` · `.claude/sessions/`} + commit CAND-only message `wal: flush `; hook **KHÔNG-ĐƯỢC** = sinh/sửa nội-dung · push · block-stop · đụng path ngoài list · exit≠0 (fail-open MỌI nhánh). Per-path add + CAND chống bẫy all-or-nothing đa-pathspec (bài học test-proven nguồn). 🔄 **Cardinality 3→4 @S146** (thêm `.claude/sessions/` cho session-model per-pause context-map): con-số này là **LUẬT GỐC mà hook thi-hành** ⇒ mọi đổi cardinality phải **grep MỌI consumer cùng-commit** (hook `wal-flush.ps1` · Sàn-3 `/tiep §0` "điểm mù" · `.session-counter.json _why_this_path` "outside all …" · auto-memory H22) — sửa write-site mà sót read-site = vỡ chính floor recovery (lớp S87/S88). Bản-ghi LỊCH-SỬ (adap-report có ngày · diary vai · `WAL.md`) **KHÔNG rewrite** — chúng mô-tả trạng-thái lúc đó. +- **N.3 Trạng-thái hook = ✅ VERIFIED-RUNTIME S111 CÙNG PHIÊN (nâng từ STAGED-until-verified — chống ghost-wire S100 bằng bằng-chứng THẬT):** hooks-entry `.claude/settings.json` ghi S111 → Stop-hook **HOT-RELOAD + FIRE ngay giữa phiên** (KHÔNG cần restart): commit **`12071c5 "wal: flush 20260712T1105"`** chứa ĐÚNG 4 file thuộc tập path cố định **lúc S111** (WAL.md + diary invest + run.md + spec — khi đó `.claude/sessions/` chưa tồn-tại; tập hiện-hành = N.2 bản 4-path @S146), CAND-commit chuẩn (settings.json/broadcasts/docs đứng NGOÀI — persist-only đúng thiết kế), 0 push. Giả-định honest-(c) nguồn "hook chỉ nạp lúc khởi-động phiên" → trên harness NÀY = hot-reload; ⚠️ **ENV-DEPENDENT** (data-point #2 sau skill-registry hot-reload S107/S111 — hub từng NGƯỢC kết quả, KHÔNG fleet-generalize; phiên MỚI vẫn re-check 1 lần trong pilot-checklist, không fire → thử schema phẳng). *(Nấc trước khi có bằng-chứng = STAGED-until-verified: CẤM claim "đang chạy" khi chưa thấy wal:-commit do hook sinh — nguyên tắc GIỮ cho mọi hook tương-lai.)* - **N.4 Một đường recovery (🔴):** `/pause` (chốt điểm dừng: flush-dirty → WAL-đúng-schema → commit đích-danh `wal: pause` TRƯỚC tuyên-bố an-toàn → DỪNG HẲN) + `/tiep` (đọc WAL → chạy TOÀN BỘ verify + `git status` + disk run-folder → lệch = tin ground-truth → thực-thi next; nhánh `wf:` = relaunch-cắt-gọt). **MỌI con-trỏ recovery trỏ về MỘT chỗ = `/tiep`** (kể cả anh gõ "làm tiếp" text thường); CẤM nạp lại transcript cũ. Delta session-cmd: `session-start BƯỚC 0.7` WAL-check (ngoại-lệ CHỜ duy-nhất, chỉ con-trỏ) · `session-end §5.0` squash `wal:`-trailing CHƯA-push (`origin/main..HEAD`, KHÔNG BAO GIỜ rewrite đã-push; squash-điểm = review-diff wal-paths, AS-10 backstop dời về đây không mất) · `§6.4` reset WAL = bước cuối. - **N.5 WAL-cho-workflow (🔴 sàn owner-nguồn):** run **≥3 task HOẶC ước >5 phút = BẮT BUỘC RUN-TRACE mode** (`args.run` — per-agent-file `sub--.md`; chết giữa run còn vật-liệu trên đĩa); run.md +`## taskList snapshot` ghi TRƯỚC launch (spec đã on-disk per H21 — sàn {task-list · spec} đủ); dòng `wf: run= runId= args= done=k/N harvested=` vào WAL NGAY SAU launch; **harvest-LIỀN** mỗi task xong (C4 per-turn Đà CÓ — honest granularity: per-TURN ≠ per-TASK, `parallel()` trả cả batch cuối turn + Stop-hook cũng fire ở turn-boundary → chết GIỮA turn = returns mất, per-agent-file trên DISK là lớp cứu → `/tiep` đọc CẢ disk); `/tiep` nhánh wf: = **relaunch-ĐÃ-CẮT-GỌT** (grep run-id log-phiên = bằng-chứng đích-danh · harvest-hồi-tố partial-honest · relaunch CHỈ task còn lại · memory-pack **RE-DERIVE TƯƠI, CẤM snapshot**); resume-by-run-id = bonus **SAME-SESSION-ONLY** (CẤM claim cross-session). Trung-thực mất-mát tối-đa: agent song-song đang-chạy tại thời-điểm chết mất phần dở; run nhỏ ngoài diện WAL-hóa có thể mất cả run — rủi-ro chấp-nhận công-khai. - **N.6 Commit-convention exception:** commit `wal:` (hook-flush + `/pause` + WAL-reset) = **ngoại-lệ DUY-NHẤT** của format `[CLAUDE] ` — máy sinh, KHÔNG Co-Authored-By, bị squash vào commit-chốt trước push (`rules.md §5.2` mirror). - **N.7 Honest (a)-(e) áp SE:** (a) **pilot CHƯA chạy đủ tại SE** — dựng + codify + **hook-FIRE-verified S111** (`12071c5`/`67be443`; script-RUN tay BỎ — bằng-chứng mạnh hơn thay thế + reviewer fault-inject 2-ca bịt nhánh 0-delta); kill-test / đổi-acc / squash-thật / pause-roundtrip-workflow = phiên mới + anh (HANDOFF pilot-checklist) · (b) SE **0 mark cấm-hook** (5 Active-High không đụng); engine CAVEAT "No-OS-hook" = MÔ-TẢ hiện-trạng đã honest-update ngoại-lệ đích-danh; E.3 chỉ cấm hook-làm-GATE — persist-only 0-content tương-thích; thứ-tự codify-trước-enable tôn trọng CÙNG-COMMIT S111 · (c) schema hooks nested = default, verify ở PHIÊN MỚI, không fire → thử flat · (d) resume-run-id cross-session CHƯA kiểm-chứng — đường chính = relaunch-cắt-gọt · (e) **repo SE TRONG Dropbox — 2 chiều:** risk `index.lock` khi cloud-sync đụng git (thấp-nhưng-có; hook fail-open tự-lành lượt sau) + bonus Dropbox sync cả `.git` → commit local CHƯA-push vẫn sống qua tắt-máy/đổi-máy → `/pause` không cần push vẫn durable. +- **N.8 Probe-tại-điểm-dừng — predicate 4-vế (🔴 FLOOR + 🟡 form) — LUẬT-HOME của C7 (hub-answer, adopt S146):** điểm dừng (`/pause` · `/tiep` · `session-start` · `session-end`) **KHÔNG chạy việc khác**, NHƯNG được phép gọi **probe** nếu script thoả **ĐỦ 4 vế** (thiếu 1 vế = KHÔNG phải probe, cấm gọi tại điểm dừng): + - **(i) read-only** — chỉ ĐỌC (parse JSON/config · đo byte bằng `Get-Item` · liệt dir). 0 mutation, 0 network, 0 API-call. + - **(ii) KHÔNG spawn con** — không Agent/Workflow/sub-vai, không `Start-Process`/job-nền/`Invoke-Expression`. Điểm dừng KHÔNG được đẻ việc mới (đó chính là cái C7 cấm). + - **(iii) KHÔNG write** — không sinh/sửa/xoá file, không `git add|commit|push`, không đụng counter/memory/luật. Chạy 2 lần liên-tiếp phải cho cùng trạng-thái đĩa. + - **(iv) lỗi → in `probe-loi (khong chan)` → ĐI TIẾP — 🔴 [LOAD-BEARING]:** MỌI nhánh `exit 0`; probe hỏng KHÔNG chặn, KHÔNG treo, KHÔNG làm `/pause` mất quyền tuyên-bố "an-toàn để thoát". Đây là vế biến probe từ *thêm-một-điểm-hỏng* thành *thêm-một-hiển-thị*. + - **FLOOR (🔴 bất-biến — port-nguyên khi tailor, 3 tính-chất):** **read-only** · **non-blocking** (fail-open + no-hang + `exit 0` mọi nhánh) · **gỡ-được-không-hậu-quả** (xoá lời-gọi probe khỏi thân command ⇒ mất HIỂN-THỊ, KHÔNG mất state, KHÔNG đổi nhánh quyết-định nào — đây là **phép thử phân-biệt probe ⟂ gate**; nếu gỡ đi mà hành-vi đổi thì nó là gate, thuộc §E.3, không thuộc N.8). + - **FORM (🟡 tailor được):** wording token in ra (`probe-loi (khong chan)` — ASCII-only theo gotcha #30) · số vế / chuỗi định-dạng dòng-nợ · vị-trí gọi trong thân command · **interpreter = em-main đọc dòng in** (KHÔNG phải OS-gate; exit-code không cưỡng-chế gì — nhất-quán CAVEAT No-OS-hook). + - **Reword tập-cấm (🔴 KHÔNG phải cấm-tất):** luật "điểm dừng không chạy thứ khác" đọc đúng = **cấm ĐẮT / cấm side-effect** (spawn vai · audit-rerun · đo lại instrument · ghi memory/luật · push) — **CHO PHÉP probe read-only non-blocking theo N.8**. Command chỉ **TRỎ** `engine §N.8`, **CẤM chép predicate sang 2 nơi** (B1 derived-trỏ-canonical; predicate đổi 1 chỗ, consumer không drift). + - **Trạng-thái đo S146 (fault-inject 2-chiều, `timeout 60` bọc để quan-sát no-hang):** `scripts/nhip-no-probe.ps1` = ✅ **thoả cả 4 vế** (lành → 1 dòng `NHIP-NO: …` đầy-đủ, exit 0 · `-RepoRoot` bậy → `probe-loi (khong chan)`, exit 0, không treo; catch tổng `:203-208`). `scripts/distill-shard-probe.ps1` = thoả (i)(ii)(iii) + no-hang, **(iv) mới NỬA**: nhánh có-xử (thiếu `memory-budget.json` `:23` · thiếu key `distill_trigger` `:27`) in token + `exit 0`, nhưng **không có try/catch tổng** với `$ErrorActionPreference='Stop'` `:17` ⇒ exception (vd `-RepoRoot` bậy tại `Resolve-Path` `:18`, hoặc JSON hỏng tại `ConvertFrom-Json` `:25`) thoát ra stderr + **exit 1**, KHÔNG in token ⇒ **FLOOR đủ (read-only · non-blocking-thực-tế · gỡ-được) / FORM thiếu**. Vá = bọc try/catch tổng → `probe-loi (khong chan)` + `exit 0` (thuộc chủ-file script, KHÔNG tự sửa trong lượt này). + **Honest nấc §N:** mechanized-THẬT = hook-script deterministic (persist) + template + acceptance grep; convention = lead ghi nội-dung WAL sau mỗi subtask (kỷ-luật, không công-cụ-ép) + squash/reset trong thân session-end do em-main kích. Dogfood S111 = tầng nội-dung (WAL-chain thật trong phiên adopt) + script-RUN tay; hook-FIRE + full-pilot = nấc kế. --- diff --git a/docs/governance/session-model-se-draft.md b/docs/governance/session-model-se-draft.md index 3414f4b..c181098 100644 --- a/docs/governance/session-model-se-draft.md +++ b/docs/governance/session-model-se-draft.md @@ -1,6 +1,11 @@ -# Session-model SE — bản nháp thiết kế (DRAFT v0, chưa wire) +# Session-model SE — bản nháp thiết kế (DRAFT v0.1 — HẠ-TẦNG đã wire, NGHI-THỨC chưa chuyển) -> **Trạng thái: ĐỀ XUẤT — chưa wire bất kỳ cơ chế nào.** Sinh @S140 (2026-07-18) theo direction owner: *"đóng đủ 5 vòng → chạy theo cách mới session-model mà AI_INFRA đã làm rất tốt → owner tập trung 100% product, làm việc xuyên session"*. Nguồn khuôn: broadcast `9234a7aa` (session-logic tách session vật-lý — SE nấc `agreed`) + checklist năm vòng `f71c5b65`. Theo chỉ đạo đồng-bộ cross-project của owner (S139: *"mọi project một khuôn, anh + hub cùng audit, hub review trước khi thành chuẩn"*), bản này là **input cho hub review**, không phải chuẩn tự-phong. +> 🔄 **CẬP-NHẬT TRẠNG-THÁI @S146 (2026-07-22) — câu "chưa wire bất kỳ cơ chế nào" của v0 KHÔNG còn đúng, sửa cho khớp đĩa:** +> - ✅ **Đà WIRE (hạ-tầng, an-toàn/additive):** hook path thứ-4 `.claude/sessions/` (`wal-flush.ps1:13`) · `/pause §2.6` ghi context-block cộng-dồn · `/tiep §2.6` đọc + ghi biên-nhận `resume-*` · Sàn-3 tín-hiệu MẠNH **⑤ + ORPHAN-L** · `/session-start` **BƯỚC 0.8** (form + regex + đo `.gitignore`). +> - ⏳ **CHƯA — vẫn chờ anh duyệt bảng VC:** **0 nghi-thức** được chuyển sang per-L. Phase 1 READ · monitor re-report · H24 tick · detectors · closeout **VẪN per-cửa `S`**. 🧊 *(vế "`/session-end` chưa ghi `closed.md`" Đà LỖI-THỜI — wire @S146 §6.3-bis; xem §4-bis. Việc `closed.md` được ghi **KHÔNG** đồng nghĩa nghi-thức đã chuyển per-L: nó chỉ **đóng sổ** phiên-logic, không đổi **đơn-vị** chạy nghi-thức.)* +> - 🔴 **Đọc đúng:** hạ-tầng bật ≠ session-model bật. Cái đang chạy là **đường ống**, chưa phải **đổi đơn-vị nghi-thức**. +> +> **Trạng thái gốc (v0): ĐỀ XUẤT — chưa wire bất kỳ cơ chế nào.** Sinh @S140 (2026-07-18) theo direction owner: *"đóng đủ 5 vòng → chạy theo cách mới session-model mà AI_INFRA đã làm rất tốt → owner tập trung 100% product, làm việc xuyên session"*. Nguồn khuôn: broadcast `9234a7aa` (session-logic tách session vật-lý — SE nấc `agreed`) + checklist năm vòng `f71c5b65`. Theo chỉ đạo đồng-bộ cross-project của owner (S139: *"mọi project một khuôn, anh + hub cùng audit, hub review trước khi thành chuẩn"*), bản này là **input cho hub review**, không phải chuẩn tự-phong. ## 1. Đích đến (theo broadcast `9234a7aa` §2) @@ -10,7 +15,7 @@ Một **phiên-LOGIC** = khởi-động nặng MỘT lần (`/session-start` — | Thành phần session-model | Cơ chế SE hiện hành | Trạng thái | |---|---|---| -| Điểm dừng chủ-động | `/pause` + `.claude/WAL.md` (≤40 dòng, ghi-đè) + Stop-hook `wal-flush.ps1` persist 3-path | VERIFIED-RUNTIME S111, dùng dày từ S133 | +| Điểm dừng chủ-động | `/pause` + `.claude/WAL.md` (≤40 dòng, ghi-đè) + Stop-hook `wal-flush.ps1` persist **4-path** (+`.claude/sessions/` @S146) | VERIFIED-RUNTIME S111; path thứ-4 verify 2-chiều trên cây tạm @S146 | | Nối lại từ đĩa | `/tiep` §0–§4 (Sàn-3 + ground-truth-thắng + relaunch-cắt-gọt) | chạy thật nhiều lần (S134/S137/S138…) | | Đếm nhịp không phụ thuộc cửa-sổ | counter content-addressed + OR-guard (head + session-label) | phép 7 PASS đo S137 | | Điều kiện nền 5 vòng | completeness-gate ĐẠT @S137 (5/5 vòng + 4/4 phép sàn); các khoản hở đang đóng @S140 | xem adap-report `f71c5b65` | @@ -23,6 +28,9 @@ Một **phiên-LOGIC** = khởi-động nặng MỘT lần (`/session-start` — Luật hiện hành: *"mỗi conversation MỚI = một nhãn-phiên `S` MỚI, kể cả khi vào bằng `/tiep`"* — sinh ra để vá OR-guard NO-OP nhầm (phép-7 `+0`). Nếu đổi thẳng "S = phiên-logic giữ nhãn qua `/tiep`" thì session-clause của OR-guard khớp nhãn cũ → tick chết → đúng cái bẫy luật này vá. **Đề xuất v0 (ít rủi ro nhất): nhãn HAI TẦNG.** Giữ nguyên nhãn vật lý `S` per-conversation (mọi cơ chế tick/counter/H24/phép-đo GIỮ NGUYÊN đơn vị, zero regression) + **thêm** trường `logic: L` (mở tại `/session-start`, đóng tại `/session-end`, sống trong WAL + session-record). Phiên-logic = **tập các S** giữa hai đầu nặng. Cách đọc "phiên" trong nghi thức = đọc theo L khi nghi thức thuộc nhóm 2-đầu-nặng, theo S khi thuộc nhóm per-cửa. +🔴 **Siết @S146 (chống đẻ bộ đếm thứ hai):** `L` và thư-mục `.claude/sessions/session-/` dùng **CÙNG MỘT con số** (`mm ≡ N`) — hai **cách viết** của một ID, **KHÔNG phải hai bộ đếm**. Hai counter cho một khái niệm = drift được bảo-đảm; đây là cùng class với `pause↔tiep` cân-sổ. ⇒ **`` là con số duy-nhất**; `L` chỉ là dạng viết trong WAL/nhãn. +🟢 **Vì sao 2 tầng vẫn an-toàn cho tick:** OR-guard của counter khớp trên **`S`**, mà `S` **không đổi ngữ-nghĩa** ⇒ label-convention S135 (*"conversation mới = nhãn `S` mới, kể cả vào bằng `/tiep`"*) **còn nguyên hiệu-lực**, phép-7 không về `+0`. Nhãn `L` **KHÔNG được** dùng ở bất-kỳ guard/counter nào. + ### VC-2 — Nghi thức nào chạy per-CỬA, nghi thức nào per-PHIÊN-LOGIC Đề xuất phân loại (bảng để anh + hub duyệt từng dòng): @@ -40,7 +48,12 @@ Luật hiện hành: *"mỗi conversation MỚI = một nhãn-phiên `S` M ### VC-3 — WAL ghi-đè ≤40 dòng vs "tệp ngữ-cảnh cộng-dồn" Hub §2 mô tả điểm dừng ghi delta vào **"một tệp ngữ-cảnh cộng-dồn của phiên"**. WAL SE là sổ mạch-sống **ghi-đè** (giữ nhỏ có chủ đích — detector C5 cap 40 dòng). Hai vai KHÁC nhau, không nên nhập một. -**Đề xuất v0:** GIỮ WAL nguyên vai (mạch-sống hiện tại, ghi-đè) + **thêm** `.claude/logic-sessions/L.md` (tệp cộng-dồn per-phiên-logic, append 1 khối mỗi `/pause`: quyết-định-đã-chốt trong cửa đó · delta-còn-sống · con-trỏ run/commit). `/tiep` đọc WAL (mạch) + tệp L (bối cảnh tích lũy) — vẫn KHÔNG nạp lại read-set nặng. `/session-end` đọc tệp L làm nguồn gom-bài-học rồi đóng nó (frozen). +**Đề xuất v0 — ⚠️ Đà SỬA @S146, form cũ `.claude/logic-sessions/L.md` là STALE:** GIỮ WAL nguyên vai (mạch-sống, ghi-đè, ≤40 dòng) + **thêm thư-mục cộng-dồn theo HUB-FORM** `.claude/sessions/session-/` (**KHÔNG** phải một-tệp-per-phiên): +- `/pause` **append MỘT FILE MỚI** mỗi cửa: `pause-S-.md`, **3 trường** = quyết-định-đã-chốt trong cửa đó · delta-còn-sống · con-trỏ run/commit. **CẤM ghi đè.** (wired: `pause.md §2.6`) +- `/tiep` **đọc TẤT CẢ** `pause-*.md` theo thứ-tự (bối-cảnh tích-luỹ) rồi **ghi biên-nhận** `resume-S-.md` — vẫn KHÔNG nạp lại read-set nặng. (wired: `tiep.md §2.6`) +- `/session-end` đọc cả tập làm nguồn gom-bài-học rồi **đóng** (`closed.md`, frozen). ✅ **Đà WIRE @S146** — `session-end.md` **§6.3-bis** (owner chốt "giống hub"). 🧊 *(nấc cũ tới S145: "chân này CHƯA wire, VC-2 còn chờ anh")* +- **Cân-sổ:** `#pause-*` phải có đối-ứng `#resume-*` (hoặc `closed.md`); lệch ⇒ **ORPHAN-L** kêu ở Sàn-3 (`tiep.md §0` ⑤). Đây chính là câu trả lời cho rủi-ro "L mồ-côi" nêu ở §6. +- **Vì sao đổi form:** hub-form thắng theo K4 (§4 dưới) — **thư-mục-per-phiên** chịu được N khối `/pause` mà không phải sửa-file-cũ, và khớp path thứ-4 của hook (`.claude/sessions/`). ## 4. Điều kiện tiên quyết (mapping 5 vòng — vì sao phải đóng trước) @@ -50,10 +63,38 @@ Theo `9234a7aa` §4: nối phiên qua nhiều cửa-sổ = tin trạng-thái tr - **(b) khuôn bộ-ba SUB — ✅ Đà VỀ 2026-07-18:** `58e28bae` khối B (`broadcasts/inbox/2026-07-18-ai_infra-to-se-reply-tong-bo-ba-harness-sub-4-khoan.md`) → SE đã adopt trio @S141. - **(c) anh duyệt bảng VC-1/2/3 — ⏳ CHỜ ANH.** Đây là **điều-kiện CUỐI**, và giờ là điều-kiện duy nhất còn đứng chắn. -🔴 **Ba khoản MỚI lộ ra sau khi (a)(b) về — CHỜ ANH DUYỆT CÙNG BẢNG VC** (không tự quyết, không wire): -1. **K4 form-conflict:** hub quy-ước thư-mục phiên là `.claude/sessions/session-/` (manifest §"một thư mục quy-ước chung"), còn draft này ở VC-3 đề `.claude/logic-sessions/L.md`. Hai form khác nhau về **cả tên lẫn hình** (thư-mục-per-phiên vs một-tệp-per-phiên) — phải chốt một trước khi có bất kỳ đường ghi nào. -2. **`session_ctx_kb`:** manifest ghi `session_ctx_kb: 64` (đơn vị KB, đọc code nhân 1024). SE chưa có khoá này, cũng chưa đo xem 64 có hợp không — mượn số của hub mà chưa đo là đúng thứ K6.2 cấm. -3. **meld-forward-gap (hook 3→4 path):** hub dựa vào "meld-forward khi gộp sổ" để lịch-sử phiên-logic không rớt lúc squash. Nhưng Stop-hook SE (`.claude/hooks/wal-flush.ps1`) quét **đúng 3 path** (`.claude/WAL.md`, `.claude/agent-memory/`, `.claude/workflows/runs/`) — thư-mục phiên sẽ là path **thứ 4** và hiện KHÔNG được quét ⇒ nếu bật mà quên nới, dấu-mốc phiên không vào sổ và meld-forward chẳng có gì để nhập-tiến. Đây là khoản sửa-hook, tức chạm cơ-chế → dứt khoát chờ anh. +🔴 **Ba khoản MỚI lộ ra sau khi (a)(b) về — trạng-thái ĐO LẠI @S146** *(v0 ghi cả 3 là "chờ anh, không wire"; nay **2 đã xử**, 1 vẫn là **quyền anh** — sửa cho khớp đĩa thay vì để câu cũ nói sai)*: +> **Vì sao 2 khoản được xử mà KHÔNG phá luật "chờ anh":** khoản 1 (form) = anh **đã** override @S144 ⇒ chỉ là **ghi lại quyết-định của anh**, không phải tự quyết. Khoản 3 (hook) = **hạ-tầng additive** anh giao trong lượt này, và nó **bắt buộc atomic** với Sàn-3 ⑤ (nới path mà để sàn mù = tệ hơn không nới). Khoản 2 (số) = **quyền anh, giữ nguyên KHÔNG đụng**. +1. ✅ **K4 form-conflict — CHỐT @S146 theo HUB-FORM.** Hub quy-ước `.claude/sessions/session-/` (manifest §"một thư mục quy-ước chung"); draft VC-3 cũ đề `.claude/logic-sessions/L.md` ⇒ **VC-3 đã sửa theo hub-form** (xem §3 VC-3). Căn-cứ: owner override @S144 + `spec-apply-hub-s145-v2` §C.4. Lý-lẽ kỹ-thuật: thư-mục-per-phiên chịu N khối `/pause` **không phải sửa file cũ**, và trùng đúng path thứ-4 của hook. **Regex `^session-\d+$`**, `` ≡ `L` (một con số). +2. ✅ **`session_ctx_kb` = 64 — OWNER CHỐT TƯỜNG-MINH @S146** (`memory-budget.json → session_ctx_kb`, kèm `_session_ctx_kb_owner_set`). Manifest hub ghi `64` (KB, code đọc **nhân 1024**) — số lấy từ manifest, KHÔNG phải SE tự đoán. + 🔸 **Lịch-sử quyết-định (giữ cả 2 nấc, không xoá nấc 1):** (a) tới @S146 SE **cố ý ĐỂ TRỐNG** — lead đo và từ-chối tự đặt vì **K6.2** (mượn số chưa-đo) + **H18 ghost-wire** (defined-but-unread). (b) Lead surface đủ 2 lý-do phản-biện cho anh; **anh chốt "tường minh"** ⇒ quyết-định có concern trong tầm nhìn ⇒ thực-thi, không hỏi lại. **Số = quyền anh** — đúng như chính dòng này đã hẹn trước. + 🔴 **CAVEAT CÒN NGUYÊN GIÁ-TRỊ:** đặt số **KHÔNG** biến nó thành wire. Đo @S146 vẫn: **0 script đọc khoá** (hit duy-nhất trong `scripts/` là **comment** `nhip-no-probe.ps1:42`). Đối-chứng sống: `pull_warn_days` **có** reader thật (`nhip-no-probe.ps1:190`). ⇒ vẫn là **ghost-wire cho tới khi có reader**; ai wire sau phải **đọc khoá** thay vì hardcode 64. **CẤM claim "đã hiệu-lực".** +3. ✅ **meld-forward-gap (hook 3→4 path) — Đà ĐÓNG @S146.** `wal-flush.ps1:13` nay quét **4 path** (`.claude/WAL.md` · `.claude/agent-memory/` · `.claude/workflows/runs/` · **`.claude/sessions/`**). Verify **2 chiều trên cây tạm** (`CLAUDE_PROJECT_DIR` inject): body-4-path ⇒ commit `wal: flush` **nuốt** `sessions/session-1/probe.md`; body-3-path (control) ⇒ **KHÔNG nuốt**, file ở lại `?? .claude/sessions/`; decoy `docs/` im cả 2 chiều (hook không nới quá list). ⇒ dấu-mốc phiên **vào sổ được**, meld-forward có vật để nhập-tiến. 🔴 **Đi kèm bắt buộc:** nới path = đẻ điểm mù ⇒ đã đẻ kèm tín-hiệu MẠNH **⑤ + ORPHAN-L** ở `tiep.md §0` **trong cùng lần sửa**. + +## 4-bis. 🔴 OWNER-DECISION @S146 (2026-07-22) — 3 câu chốt + 1 gap MỚI lộ + +> Lead surface 3 câu; anh trả **"1 và 2 → giống hub. 3 → auto."** Ghi lại **nguyên trạng**, kèm cái lead **đo được từ manifest** chứ không suy. + +| # | Câu | Anh chốt | Đã land @S146 | +|---|---|---|---| +| 1 | Ai được tạo `session-/` | **giống hub** | `session-start` BƯỚC 0.8 + `pause §2.6`: **scaffold IDEMPOTENT** — ai gặp trước thì tạo, đã có thì dùng lại, **cấm đè**. 🔴 Tách đôi khái-niệm: **cấp SỐ** = độc-quyền `/session-start` ⟂ **tạo THƯ-MỤC** = idempotent. Mâu-thuẫn cũ (`session-start:88` "CHỈ" vs `pause:25` "tạo nếu chưa có") sinh ra **vì gộp 2 khái-niệm vào 1 câu**. | +| 2 | Wire `closed.md` | **giống hub** | `session-end` **§6.3-bis** — `_end` chốt-kết, FROZEN, 4 trường, **idempotent NO-OP** nếu đã có, **NO-OP im-lặng** nếu 0 thư-mục (cấm tạo-rồi-đóng = sổ rỗng giả). Khoá nốt vòng **ORPHAN-L** ⇒ hết kêu oan ca *"pause rồi đóng thẳng"*. | +| 3 | V2 bookend / counter | **auto** | Gỡ **cổng NGƯỜI** (consent) ở `session-end §L.b(j)(ii)` + `(vi)` force-fire + `session-start §2.1.8(e)`. 🔴 **GIỮ cổng NHỊP** (`h24_cadence` 6/15/3). | + +🔴 **Ranh của "auto" — lead khai cách hiểu để anh sửa được bằng 1 chữ:** "auto" đọc là **bỏ hỏi**, KHÔNG phải **bỏ đếm**. ⇒ H24 chạy **tự-động KHI TỚI NHỊP**, không phải mỗi phiên. Đây **CHƯA** phải bookend-hub (hub **gỡ hẳn counter**, rà 2 đầu **mỗi** phiên). Muốn đúng bookend-hub = **quyết-định KHÁC**, chưa chốt. +🔸 **Kết-nhiễm đã chặn:** 2 chỗ (`session-end §L.b(k)(i)` · `session-start §2.1.9(a)`) viện *"trio consent **cùng khuôn** sleep-check **+ H24**"* — H24 đổi thì câu đó **thành sai** ⇒ đã gỡ vế H24. **sleep-check + trio VẪN consent**; 3 cổng nay **không còn cùng khuôn**, cấm suy một ra ba. + +### 🆕 Gap MỚI lộ khi đọc manifest (KHÔNG nằm trong 3 câu — chưa chốt, để carry) + +Lead trước đó trả lời anh *"không có `/snapshot` — bẫy tên gọi"* ⇒ **SAI, đã đính-chính**: manifest `101e69d6` §1 liệt **3 lệnh**, lệnh thứ-3 = **"chụp-nhanh không-dừng"** (chốt giữa mạch, **không bookend, không stop**). Nó là **floor thật**. Lead kết-luận từ đĩa SE mà **không mở manifest**. + +| Floor hub | SE @S146 | +|---|---| +| `_context` = **stock** (map bối cảnh nén) + **flow** (append mỗi lần dừng) | ⚠️ chỉ có **flow** (`pause-*`); **thiếu stock + nén-thành-con-trỏ** | +| `_snapshot-k` + **lệnh chụp-nhanh không-dừng** | ❌ **thiếu hẳn** | +| `/pause` **tự chạy 1 chụp-nhanh + NÉN context** rồi mới dừng | ❌ chưa | +| `/tiep` đọc **chụp-nhanh mới nhất**; phòng **cửa-sổ-sập** (đọc snapshot có mốc mới hơn dòng cuối context-map) | ❌ chưa (chỉ đọc `pause-*`) | +| **Meld-forward khi squash** | ❓ **CHƯA ĐO** — `reset --soft` giữ nội-dung ở INDEX nên *về lý* không mất, nhưng chưa có phép đo riêng cho `.claude/sessions/` | ## 5. Câu hỏi gửi hub (đánh số — sẽ đi trong email S140) @@ -61,12 +102,16 @@ Theo `9234a7aa` §4: nối phiên qua nhiều cửa-sổ = tin trạng-thái tr 2. Nhãn: hub dùng **một tầng** (đổi hẳn đơn vị đếm sang phiên-logic) hay **hai tầng** (vật-lý + logic như đề xuất VC-1)? Nếu một tầng — hub giải bẫy OR-guard/label-reuse thế nào? 3. Tệp ngữ-cảnh cộng-dồn của hub có cấu trúc chuẩn gì (per-pause block? field bắt buộc? cap kích thước? quan hệ với sổ mạch-sống kiểu WAL)? 4. Van "kiểm giữa phiên khi phiên-logic quá dài" (ghi-chú trung-thực (ii) của checklist) — hub đã đặt được ngưỡng chưa? + - 🔸 **Xử-lý phía SE @S146 = DEFER, có lý-do:** chỉ **hiển-thị dòng-nợ** ở mỗi điểm dừng (`nhip-no-probe`, đã có), **KHÔNG chạy lại audit giữa phiên-logic**. Lý-do: audit-rerun tại điểm dừng là việc **ĐẮT + có side-effect** ⇒ **phá predicate C7** (probe ở điểm dừng phải read-only · non-blocking · gỡ-được-không-hậu-quả — canonical [`harness-11-engine.md`](harness-11-engine.md) §N.8). ⇒ chờ ngưỡng của hub, KHÔNG tự chế van. ## 6. Không-biết + rủi ro (khai thật) - Con số "rẻ đi ba-bốn lần" là ước lượng CỦA HUB theo cấu trúc chi phí, chưa đo trên SE — SE sẽ đo thật (token bootstrap/closeout per-L trước-sau) khi chạy thử, không mượn số. - Nối qua nhiều tài-khoản: nguyên lý OK (trạng thái trên đĩa) nhưng cả fleet **chưa chạy thật**; SE đã có kinh nghiệm gần (S138 `/tiep` đổi acc theo tiep.md:130) — vẫn cần lượt đo riêng. -- Rủi ro chính của nhãn hai tầng: thêm 1 khái niệm = thêm chỗ drift (L không đóng khi phiên-logic chết giữa chừng → cần Sàn-3 mở rộng: tệp L mồ-côi = tín hiệu mạnh thứ 5?). Ghi nhận, chưa giải trong v0. +- Rủi ro chính của nhãn hai tầng: thêm 1 khái niệm = thêm chỗ drift (L không đóng khi phiên-logic chết giữa chừng → cần Sàn-3 mở rộng: tệp L mồ-côi = tín hiệu mạnh thứ 5?). ~~Ghi nhận, chưa giải trong v0.~~ + - ✅ **GIẢI @S146 — đúng như câu hỏi tự đặt:** **tín-hiệu MẠNH thứ ⑤** + block **ORPHAN-L** đã vào `tiep.md §0` (DUAL: cửa git `wal:`-commit đụng `.claude/sessions/` ⟂ cửa đĩa cân-sổ `#pause` vs `#resume + closed`). Sàn-3 nay có **5** tín-hiệu MẠNH. + - ✅ **Hở này Đà ĐÓNG @S146** — `closed.md` wire ở `session-end.md §6.3-bis` ⇒ cân-sổ đủ 2 vế (`resume-*` **hoặc** `closed.md`). 🧊 *nấc cũ: "chân `closed.md` chưa wire (VC-2 chờ anh) ⇒ ca "pause rồi đóng thẳng không qua `/tiep`" sẽ **kêu oan**. Hướng hỏng = **về phía hỏi-lại**, không về phía im-lặng-bỏ-việc ⇒ chấp-nhận được tạm thời, **nhưng KHÔNG được đọc thành "đã kín"**. + - 🔸 Rủi-ro "hai bộ đếm" đã bịt bằng ràng `mm ≡ N` (§3 VC-1). --- *(DRAFT v0 — em-main single-writer D9. Bước kế: hub reply + anh duyệt bảng VC → wire qua 1 lượt adap có reviewer-gate + fault-inject.)* diff --git a/docs/governance/vocab-alias-map.md b/docs/governance/vocab-alias-map.md index 9dee694..f7a9501 100644 --- a/docs/governance/vocab-alias-map.md +++ b/docs/governance/vocab-alias-map.md @@ -48,7 +48,7 @@ Một session-log viết "two-tier" hồi S60 là **đúng sự thật lịch s | Thuộc tính | Giá trị | |---|---| -| **Canonical (hiện hành)** | `worker-tier-pin` — 17/17 sub-agent frontmatter `model: opus` + `effort: max` (worker-tier gán-cứng, KHÔNG theo lead); lead = frontier-class owner-choice per-session; Fable cho 1 vai CHỈ qua lượt lệnh `/fable-real`·`/fable-clone` hoặc per-task `tier:` — spawn-param THẮNG hard-pin (đo S126 2026-07-16, `runs/2026-07-16-S126-adap-spec-execute/runtime-verify-synthesis.md`) | +| **Canonical (hiện hành)** | `worker-tier-pin` — TOÀN-ROSTER sub-agent frontmatter `model: opus` + `effort: max` (worker-tier gán-cứng, KHÔNG theo lead); lead = frontier-class owner-choice per-session; Fable cho 1 vai CHỈ qua lượt lệnh `/fable-real`·`/fable-clone` hoặc per-task `tier:` — spawn-param THẮNG hard-pin (đo S126 2026-07-16, `runs/2026-07-16-S126-adap-spec-execute/runtime-verify-synthesis.md`) | | **Alias (đã thay thế — đời 2)** | `all-inherit` — mọi sub-agent kế thừa model lead (chất-lượng > chi-phí; Harness-8, S66–S123) | | **Alias (đã thay thế — đời 1)** | `two-tier` — mô hình 2 tầng (lead promote-inherit vài agent / demote-pin số còn lại về Opus; Harness-4) | | **Đổi tên bởi** | Owner-decision **S124** (2026-07-15, adap `erratum-h8`) — thay all-inherit bằng worker-tier-pin. Trước đó: Harness-8 (S66, 2026-06-16) thay two-tier bằng all-inherit | diff --git a/scripts/distill-shard-probe.ps1 b/scripts/distill-shard-probe.ps1 new file mode 100644 index 0000000..0c5c36f --- /dev/null +++ b/scripts/distill-shard-probe.ps1 @@ -0,0 +1,71 @@ +# distill-shard-probe.ps1 — C11 (adap dot-11, S144 2026-07-22) +# Trigger nen-kết-tinh theo ĐẾM VẬT THẬT (so shard chua-gist), thay trigger ngay-lich. +# Owner: co-che = O-6 (anh chot) · so = min_pending_shards (anh chot 7 @S144). +# +# 🔴 SINGLE-SOURCE: nguong DOC TU memory-budget.json, KHONG hardcode o day (B1). +# 🔴 -RepoRoot = duong fault-inject (chay tren cay tam de chung script CO RANG, khong chi happy-path). +# +# SHARD = archive/.md CHUA co .gist.md cap doi. +# LOAI TRU tuong minh: _INDEX.md (muc-luc) + *.gist.md. +# Vi sao phai ghi ro: bo dem dau tien cua lead ra 20, trong do 5 la _INDEX.md => 25% duong-gia. + +param( + [string]$RepoRoot = "$PSScriptRoot\..", + [switch]$Quiet +) + +$ErrorActionPreference = 'Stop' +$root = (Resolve-Path $RepoRoot).Path +$budgetPath = Join-Path $root '.claude\agent-memory\memory-budget.json' +$memRoot = Join-Path $root '.claude\agent-memory' + +# --- doc nguong LIVE tu single-source (UTF8 tuong minh — tranh bay encoding E-010) --- +if (-not (Test-Path $budgetPath)) { Write-Output "SHARD-PROBE: khong thay memory-budget.json -> probe-loi (khong chan)"; exit 0 } +$raw = [IO.File]::ReadAllText($budgetPath, [Text.Encoding]::UTF8) -replace "^", "" +$cfg = $raw | ConvertFrom-Json +$dt = $cfg.distill_trigger +if ($null -eq $dt) { Write-Output "SHARD-PROBE: thieu key distill_trigger -> FAIL-LOUD (khong gia dinh default)"; exit 0 } + +$minShards = $dt.min_pending_shards +$bulkShards = $dt.bulk_note_shards + +# --- dem shard chua-gist --- +$pending = @() +if (Test-Path $memRoot) { + Get-ChildItem -Path $memRoot -Directory -ErrorAction SilentlyContinue | ForEach-Object { + $arc = Join-Path $_.FullName 'archive' + if (Test-Path $arc) { + Get-ChildItem -Path $arc -Filter '*.md' -File -ErrorAction SilentlyContinue | ForEach-Object { + $n = $_.Name + if ($n -eq '_INDEX.md') { return } # muc-luc, KHONG phai shard + if ($n -like '*.gist.md') { return } # ban nen, KHONG phai shard + $gist = Join-Path $arc ($n -replace '\.md$', '.gist.md') + if (-not (Test-Path $gist)) { $pending += $_.FullName } + } + } + } +} +$n = $pending.Count + +# --- phan dinh --- +if ($null -eq $minShards) { + Write-Output "SHARD-PROBE: pending=$n | nguong=CHUA-DAT (null) => INERT, owner chua cho so" + exit 0 +} +# 🔴 RANH `-gt` KHONG PHAI `-ge` — doi @S144 sau owner-decision lan 2. +# Vi sao: owner chot "lay 15, TANG DAN neu them vao" = nguong NEO VAO trang-thai hien tai +# (15 shard da-phu) => 15 phai IM, chi 16+ moi KEU. Voi `-ge` thi 15 keu ngay = vo nghia. +# 🔸 Toan-tu la thu CUA LEAD (lead viet sang nay), so 15 la thu CUA OWNER. Lead sua toan-tu +# cho khop y-dinh owner, KHONG dung con so. Owner veto duoc bat ky luc nao. +$fire = ($n -gt $minShards) +$state = if ($fire) { 'KEU' } else { 'IM' } +$bulk = '' +if ($null -ne $bulkShards -and $n -gt $bulkShards) { $bulk = " | BAO-TO: backlog $n > $bulkShards (van nen het, chi canh bao)" } + +Write-Output "SHARD-PROBE: pending=$n | nguong=$minShards => $state$bulk" +if ($fire -and -not $Quiet) { + Write-Output " -> de xuat chay /sleep-recovery-memory-l2 (nen additive, KHONG de ban goc)" + $pending | Select-Object -First 8 | ForEach-Object { Write-Output " $($_.Substring($root.Length+1))" } + if ($n -gt 8) { Write-Output " ... +$($n-8) shard nua" } +} +exit 0 diff --git a/scripts/nhip-no-probe.ps1 b/scripts/nhip-no-probe.ps1 index 8420dce..a9c9b95 100644 --- a/scripts/nhip-no-probe.ps1 +++ b/scripts/nhip-no-probe.ps1 @@ -38,8 +38,10 @@ measures the thing that was actually blind. THRESHOLD IS DELIBERATELY ABSENT: prints the raw number only. If key h24_cadence.pull_warn_days is present it also appends - OVERDUE:pull - but SE does NOT invent that number (owner's call, - same discipline as declining to pick session_ctx_kb). + OVERDUE:pull - but SE does NOT invent that number (owner's call). + Precedent for that discipline: session_ctx_kb sat DELIBERATELY + EMPTY until the owner set it explicitly at S146 - the number was + never guessed by SE, it was waited for. Same rule applies here. Unparseable/absent index -> 'pull-cach n-a' (NEVER kills ve 1-3). .PARAMETER RepoRoot