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>
13 KiB
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.mdDUY-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
- B0 — đọc spec-v2 toàn-file (gồm §[4] ADDENDUM @S146) + run.md
- 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 - B2 — VIỆC 2: N.2
3 path cố định→4 path cố định(+.claude/sessions/) →:406(+N.3:407gỡ literal stale, giữ sự-thật lịch-sử) - B3 — VIỆC 3: verify
scripts/distill-shard-probe.ps1vs N.8 → (i)(ii)(iii) PASS · (iv) NỬA (chi-tiết dưới) — KHÔNG sửa script - B4 — VIỆC 4: fault-inject 2-chiều
scripts/nhip-no-probe.ps1(KHÔNG đổi code) → 2/2 chiều PASS - B5 — acceptance greps chạy thật, output dán dưới
- 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 "<TEMP>\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 "<TEMP>\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).