Files
solution-erp/docs/governance/session-model-se-draft.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

118 lines
19 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Session-model SE — bản nháp thiết kế (DRAFT v0.1 — HẠ-TẦNG đã wire, NGHI-THỨC chưa chuyển)
> 🔄 **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<nn>`**. 🧊 *(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)
Một **phiên-LOGIC** = khởi-động nặng MỘT lần (`/session-start` — read-set ~368K) → làm việc qua **N cửa-sổ vật-lý** nối bằng điểm dừng chủ-động (`/pause` → cửa-sổ mới `/tiep`, nhẹ) → chốt nặng MỘT lần (`/session-end`). Chi phí cố định (bootstrap + closeout) trả 1 lần thay vì N lần; không còn tổn thất nén-ép do máy cắt.
## 2. Nền SE đã có (không phải xây từ đầu)
| 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 **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` |
**Khoảng cách thật:** SE hiện coi **mỗi conversation = một phiên ĐẦY ĐỦ**`/tiep` đã nhẹ (không nạp lại full read-set) nhưng nghi thức quản trị (nhãn, tick, kỳ vọng closeout, monitor re-report) vẫn tính theo **cửa-sổ**, chưa có khái niệm phiên-LOGIC làm đơn vị nhóm.
## 3. Ba điểm va chạm với luật hiện hành (cần quyết TRƯỚC khi wire)
### VC-1 — Label-convention S135 (PIN LUẬT) vs nhãn phiên-logic
Luật hiện hành: *"mỗi conversation MỚI = một nhãn-phiên `S<nn>` 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<nn> = 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<nn>` 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<mm>` (mở tại `/session-start`, đóng tại `/session-end`, sống trong WAL + session-record). Phiên-logic = **tập các S<nn>** 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<mm>` và thư-mục `.claude/sessions/session-<N>/` 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ổ. ⇒ **`<N>` là con số duy-nhất**; `L<N>` 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<nn>`**, mà `S<nn>` **không đổi ngữ-nghĩa** ⇒ label-convention S135 (*"conversation mới = nhãn `S<nn>` 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<N>` **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):
| Nghi thức | Hiện tại | Đề xuất session-model |
|---|---|---|
| Phase 1 READ full read-set | mỗi `/session-start` | **per-L** (1 lần đầu phiên-logic) |
| Monitor re-report H1/H2 | đầu phiên (skip được) | **per-L** mở + đóng |
| H24 tick counter | mỗi cửa (mỗi S) | **GIỮ per-S** (content-addressed — đo nhịp thật) |
| NHIP-NO probe 4-vế | 4 điểm lệnh | GIỮ per-điểm-dừng (per-S) |
| Sàn-3 WAL-check | mỗi `/tiep` + `/session-start` | GIỮ per-cửa (an toàn nối mạch) |
| governance-detectors + H17 + M.B | mỗi `/session-start` (skip light) | **per-L** mở (giữa phiên chỉ khi nghi drift) |
| Master-checklist 2-tầng | 4 cửa (in @mỗi cửa) | GIỮ per-cửa (rẻ, chống rơi việc) |
| session-end đầy đủ (§L.b harvest + memory-triple + squash + push) | mỗi lần "đóng" | **per-L** (1 lần cuối phiên-logic) |
| Force-fire H24 khi closeout gộp ≥2 phiên-dừng | @closeout | GIỮ — phép 8 checklist đã chuẩn hóa đúng ca này |
### 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 — ⚠️ ĐÃ SỬA @S146, form cũ `.claude/logic-sessions/L<mm>.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-<N>/` (**KHÔNG** phải một-tệp-per-phiên):
- `/pause` **append MỘT FILE MỚI** mỗi cửa: `pause-S<nn>-<yyyyMMddTHHmm>.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<nn>-<ts>.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)
Theo `9234a7aa` §4: nối phiên qua nhiều cửa-sổ = tin trạng-thái trên đĩa. Trạng thái đóng vòng của SE @S140: vòng 1/2/3/5 chức-năng CÓ + runtime; vòng 4 lượt nén-sau-nâng đang chạy @S140; vòng-3-có-SUB (bộ ba `harness-eval/refine/audit` — owner đã quyết CÓ) **chờ khuôn hub** (email `fc2b218d3eed`). SE **không bật** session-model trước khi:
- **(a) hub phát mẫu áp dụng — ✅ ĐÃ VỀ (đợt 2026-07-18):** `101e69d6` kit + manifest (`broadcasts/inbox/2026-07-17-Governance-session-model-phien-logic-manifest.md`, thư đề ngày 2026-07-17, pull trong đợt 07-18). ⚠️ **Câu 4 (van-ngưỡng "kiểm giữa phiên khi phiên-logic quá dài") CHƯA được trả lời** — kit đến mà van thì không; và hub **cố-ý KHÔNG mang khoá counter** trong manifest (đã soát: 0 hit `counter`/`đếm` trong thư). Nên "(a) đã về" ≠ "(a) đã đủ để bật".
- **(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ề — 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-<N>/` (manifest §"một thư mục quy-ước chung"); draft VC-3 cũ đề `.claude/logic-sessions/L<mm>.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+$`**, `<N>``L<N>` (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/`**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-<N>/` | **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)
1. Hub đã chạy phiên-logic thật (checklist `f71c5b65` ghi "một-hai phiên-logic đầu tiên") — xin **mẫu áp dụng + bài học** (đặc biệt: điểm mù "phiên nối lại có bộ-nhớ nhưng không biết mình có" đã kiểm bằng dùng thật chưa, kết quả?).
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.~~
-**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.)*