Ap spec-apply-hub-s145-v2 (5 axis, governance-only: 0 prod-code, 0 migration). Workflow S145 chet giua chung -> /tiep §4 relaunch-cat-gon wf_3d803740-41d 3/3 DONE. Owner-decision @S146: - session_ctx_kb = 64 TUONG-MINH (giu nguyen caveat ghost-wire: 0 reader) - session-model: scaffold IDEMPOTENT (tach cap-SO vs tao-THU-MUC) · closed.md WIRE (session-end §6.3-bis) · V2 AUTO (go cong NGUOI, GIU cong NHIP 6/15/3) Landed: C7 §N.8 predicate 4-ve · hook wal-flush.ps1 4 path (+.claude/sessions/) · San-3 tin-hieu ⑤ + ORPHAN-L · D2 KIEM end-only · §L.c completeness-gate co RANG. LIVE-VERIFY hook 4-path PASS repo THAT (da7ee8a). Session-model chay TRON VONG dau tien: pause-S146 -> resume-S146 -> ORPHAN-L can so. H24 force-fire (P=8 pause >= 1, luat auto moi): 2 vai + h24-audit -> 7 FLAG, va het: - sweep-consent sot 6 site (h24-audit.md:4 = frontmatter description) - closed.md wired-but-declared-unwired (ghost-wire CHIEU NGUOC) - owner-decision [7] BI GHI DE do tai-dung slot-index -> mat uy-quyen push 3/3 vai lane-H24 garble #53: ghi-dia-SOM cuu tron, ghi-MUON mat trang. So: orphan run-folder 3->0 · carry 14->20 (co tag [carry:*]) · +E-013 +E-014 error-ledger · +memory feedback_absence_looks_like_clean · .gitignore +lock file. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
22 KiB
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ế
- 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. - 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).
- 🔴🔴 GỠ HẲN v1-A.4 + v1-A2 "4 surface→2" — LÀ TIỀN-ĐỀ SAI. Verify đĩa:
nhip-no-probe.ps1có 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ỏ.) - Fault-inject 2-chiều (chứng vế-iv, script KHÔNG đổi code —
nhip-no-probe.ps1:203-208catch→exit 0 đã thỏa): inject-vector = ép-RepoRootbậ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. - 🔸 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
memory-budget.json:11null→30 +_bulk_notenote (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ờ).- 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-gtkhô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)
- 🔴🔴 session_ctx_kb = ĐỂ TRỐNG (KHÔNG hardcode 64). Verify đĩa: 0 script đọc
session_ctx_kb(ghost-wire, khácpull_warn_dayscó readernhip-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 markowner-gated-inert-pending-wire). - hook 4-path
wal-flush.ps1:13: 3-path → +.claude/sessions/(full path). 🔴 KHÔNG "pending-restart" —settings.json:9-Filere-đọc body MỖI Stop ⇒ ăn NGAY. Live-verify: stage 1 filesessions/session-<N>/x→ trigger hook → confirm commitwal: flushnuốt nó. + fault-inject. - 🔴🔴 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ànhwal:, 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 = 0sau vá.
- (a) 4 site "3 path"/"3 điểm mù" → "4 path"/"4 điểm mù":
- VC-1 nhãn 2-tầng
S<nn>+logic:L<mm>. Alignsession-model-se-draft.md(gỡ VC-3 stalelogic-sessions/L<mm>→ hub-formsessions/session-<N>/). - Folder scaffold
session-start.md:.claude/sessions/session-<N>/(N=phiên-LOGIC ID nguyên tăng, regex^session-\d+$); .gitignore verifycheck-ignore -qexit=1. - per-pause context-map
pause.mdappend context-block vàosessions/session-<N>/(accumulate);tiep.mdđọc. - orphan-L rule: phiên chết giữa phiên-logic →
L<mm>/session-<N>/mồ-côi. Thêm ruletiepphát-hiện (gộp signal ⑤). KHÔNG để drift-vector hở. - 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
- 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.
- 🔴 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.mdcạ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). - 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.
- 🔴 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
- E1 concrete teeth (thay "review PASS" vòng-tròn):
pause.md:17wf: đủ 5-trường (grep run=/runId=/args=/done=/harvested=) ·tiep.md §0đủ 4 (→ post-C.2 là 5) signal MẠNH ·tiep.md:127rule "memory-pack DẪN-XUẤT-LẠI TƯƠI (CẤM reuse cũ)" present · run.md có## taskList snapshot. - Fix line-ref
tiep.md:23wal-flush.ps1:7→:13(paths thật ở :13; :7=comment). Gộp khi vá §0 (C.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<nn> KHÔNG L<mm>; fault-inject ép L → tick +0 (chứng guard, KHÔNG chỉ label-shape) |
| C4 | scaffold + orphan-L | sessions/session-<N> 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.md4 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 classcardinality-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ầmsession-end.md:162→ "3 pathruns/<id>/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 classmatcher 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ủawal-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 pathphải đứng cạnh chữhook/WAL.md/…) + tập-file hẹp. Đo lại trênHEADtiền-vá: bắt 7/11 site — trượt 4 ca THẬT:
ca trượt vì sao session-end.md×2hook-3-pathregex chỉ có 3 pathdấ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×2file 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.
# 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/<id>/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`.