Files
solution-erp/.claude/workflows/runs/2026-07-22-S145-apply-hub-answers/spec-apply-hub-s145-v2.md
pqhuy1987 8b6df0a396
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 5m25s
[CLAUDE] Docs: S146 closeout — session-model 3 owner-decision + hook 4-path + H24 auto
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>
2026-07-23 00:16:37 +07:00

22 KiB
Raw Blame History

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.ps14 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-<N>/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<nn> + logic:L<mm>. Align session-model-se-draft.md (gỡ VC-3 stale logic-sessions/L<mm> → hub-form sessions/session-<N>/).
  5. Folder scaffold session-start.md: .claude/sessions/session-<N>/ (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-<N>/ (accumulate); tiep.md đọc.
  7. orphan-L rule: phiên chết giữa phiên-logic → L<mm>/session-<N>/ 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<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.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/<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 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.
# 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.mdmega-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`.