All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 5m25s
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>
276 lines
20 KiB
Markdown
276 lines
20 KiB
Markdown
# 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-<N>).
|
||
# 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 <path>` ⇒ 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=<tmp> 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<nn>` (cửa-sổ vật-lý, **mọi** tick/counter/H24 giữ nguyên đơn-vị) + `logic: L<mm>`. 🔴 **Siết thêm:** `L<mm>` và `session-<N>` 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<nn>` **không đổi ngữ-nghĩa** ⇒ label-convention S135 còn nguyên, phép-7 không về `+0`; `L<N>` **CẤM** dùng ở guard/counter.
|
||
|
||
### (4.2) Gỡ VC-3 stale → hub-form (K4 chốt)
|
||
`.claude/logic-sessions/L<mm>.md` (**một-tệp-per-phiên**) → **`.claude/sessions/session-<N>/`** (**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-<N>/`, **regex `^session-\d+$`**, `<N>` = `max+1`, **chỉ `/session-start` mở `<N>` 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<nn>-<yyyyMMddTHHmm>.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-<N>/` 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/<id>/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.
|
||
|