Chu du an chot 6 cau @S181; so quyet-dinh o runs/2026-08-07-S180-adap-upgrade-pack-phased/owner-decisions-07-08-2026-dot-2.md - P2=PB-2 sua luat da ratify du 2 SITE (tiep.md §3-bis canonical + pause.md b6 chi TRO). Cau cam san-3 GIU NGUYEN, chi them ranh REQUEST ⟂ TASK. - W4: docs/governance/so-yeu-cau-chu-du-an.md 3 khoi, ma YC/ST/PN vinh vien. Config: tiep_reload.sources 8->9 + owner_request_verbatim_char_cap. nhip-no-probe ve-5 "so-yc treo/nhac2+", fault-inject 5/5, phan biet chua-co-du-lieu ⟂ treo 0. Ky luat ghi-NGAY + A5 cam CLAUDE.md + rules.md §6.0. - P5: ACTIVE-MARKS §LT3 luat tu-tri 3 bac + mark RC-...-07-08-2026-20-57-48. - P7(i): docs/governance/expensive-runs-view.md derive-view 5 cot. - P3=B: niem phong _sealed_P3B_S181 (forward-only). Phep thu A10 da co rang (fault-inject: class tu che => exit 2; class hop le => exit 0). - Khoan 6: scripts/naming-baseline.json = NGUON, script chi doc. Fault-inject 6/6 hai chieu. 7/7 baseline xanh. 0 byte non-ASCII. - Khoan 5: broadcasts/_index.md +cot "ap" cuoi hang, backfill 42/4/23 = 69. - W3 acceptance 6/6 dong + va defect con-tro bang-19-cua (view-stale-status). Con treo: P8/W4b, W5, P7 ve (ii), VK-5, P3 hoi-to hay forward-only. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
127 lines
17 KiB
Markdown
127 lines
17 KiB
Markdown
---
|
||
description: /pause — chốt điểm dừng chủ-động (Harness-22 WAL session-continuity). Ghi mạch việc dở vào .claude/WAL.md ≤40 dòng + commit `wal: pause` ĐÍCH-DANH rồi DỪNG HẲN — an-toàn để thoát / đổi acc / tắt máy. Nối lại DUY-NHẤT bằng /tiep.
|
||
argument-hint: (không tham số)
|
||
---
|
||
|
||
# /pause — chốt điểm dừng chủ-động (Harness-22 WAL session-continuity)
|
||
|
||
> **Mục-đích:** chốt trạng-thái làm-việc hiện-tại xuống đĩa một cách an-toàn, để có thể thoát / đổi tài-khoản / tắt máy mà KHÔNG mất trí-nhớ đã có và KHÔNG phải đốt lại token cho phần đã xong.
|
||
> Cặp với **`/tiep`** (đường recovery duy-nhất). 🔴 restart Claude Code sau khi tạo/sửa command `.md` (no hot-reload).
|
||
|
||
Thực-hiện **tuần-tự 5 bước** sau; trong lúc chạy **KHÔNG nhận việc mới**:
|
||
|
||
## 1. NGỪNG spawn mới — xử-lý task đang chạy
|
||
- KHÔNG spawn / phóng thêm bất-kỳ task hay workflow nào nữa.
|
||
- 🔴 **Carve-out DUY NHẤT (OWNER-VETO @S153 — mirror hub O-1(a)):** vai `ctx-curator` ở bước §2.6(C-bis)-2bis ĐƯỢC spawn trong `/pause` (vai-1 vòng Ctx hub-form 3-vai, anh chốt "Build đủ 3 vai như hub"). Ngoài nó ra, luật này nguyên vẹn.
|
||
- Với task đang chạy (background hoặc workflow):
|
||
- **Sắp-xong** (ước `< ~2 phút`) → **CHỜ** nhận kết-quả rồi **harvest-liền** (append phần trí-nhớ đã verify) trước khi chốt.
|
||
- **Còn lâu** → **KHÔNG chờ**. Ghi vào WAL một mục `[!]` **đủ trường**. Nếu là **workflow** → ghi một dòng `wf:` **năm-trường**: `wf:<mục-đích> run=<run-folder> runId=<id|pending> args=<snapshot> done=<k>/<N> harvested=no` (nhánh khôi-phục xem `/tiep`).
|
||
|
||
## 2. Flush trí-nhớ dirty xuống đĩa
|
||
- Đẩy mọi trí-nhớ đang dirty (chưa ghi) xuống đĩa (agent-memory / run-folder).
|
||
- Ghi-chú-dở **DÀI** (context, phân-tích giữa chừng) để ở **run-folder / work-state**, **KHÔNG** nhét chi-tiết dài vào WAL — WAL phải giữ tính "liếc một cái là biết".
|
||
|
||
### 2.5 🔴 C2 checklist artifact-vs-entry — ÉP SEED TRƯỚC KHI CHỐT (wire @S172, owner slot 69)
|
||
|
||
> **Vì sao cửa này tồn-tại — truy được CƠ-CHẾ, không phải đãng-trí (`lead-gap-auditor` FLAG-6 @S172, `ring2-audit` F-4 HELD tuyệt-đối):** cổng ép-seed C2 trước đây **CHỈ có ở `/session-end`**; `/pause.md` đo được **0 hit trên cả 5 token** (`C2` · `seed` · `MEMORY.md` · `on-behalf` · `diary`). Phiên nào **kết bằng `/pause`** thì phép đếm A∖B **không bao giờ chạy** ⇒ sót seed là **TẤT-YẾU CẤU-TRÚC**. Ca thật: S171 kết bằng `/pause`, `ctx-verifier` chạy 15:47 mà sổ dừng ở S168 — phát-hiện mãi tới S172, và đó là **lần thứ 5** của carry `tiep-3ter-seed-unwired`. Không wire cửa này thì **lần 6 đã hẹn giờ ở cửa `/pause` kế**.
|
||
> 🔗 **Luật đầy-đủ = canonical [`session-end.md`](session-end.md) §L.b(j)(ii-ter)3-bis.** 🔴 **B1 — mục này CHỈ ÁP, CẤM chép luật.**
|
||
|
||
**Đếm 2 cột, ngay trước khi ghi WAL:**
|
||
- **cột-A** = tập VAI có artifact sinh trong cửa-sổ này (`ls .claude/workflows/runs/<run của cửa-sổ>/sub-*.md` → rút tên vai; **cộng** mọi sub spawn lẻ không qua run-folder).
|
||
- **cột-B** = tập vai có **entry MỚI** trong `.claude/agent-memory/<vai>/MEMORY.md` mang nhãn phiên hiện-hành.
|
||
|
||
🔴 **`A ∖ B ≠ ∅` ⇒ SEED ON-BEHALF NGAY (lead single-writer, B3 VERIFY→APPEND), CẤM commit `wal: pause` khi hiệu còn phần-tử.**
|
||
|
||
- **11/23 vai bị luật CẤM tự-ghi** (INFORM-only, `tools:` không khai Write/Edit) ⇒ lead-seed là **ĐÚNG THIẾT-KẾ**, không phải chống-chế. Bệnh nằm ở **bước seed thiếu phép đếm ép** — KHÔNG sửa bằng cách "bắt vai tự ghi". *(🔴 `ring2-audit` F-6 @S172 làm chặt thêm: vai vẫn có `Bash` nên **ghi được về vật-lý**; nhưng khai read-only mà ghi = **residual-write vi-phạm khai-báo**, và backstop THẬT là git-diff commit-gate — nên đừng đọc thành "vai bất-khả-thi", cũng đừng cấp Write để làm đẹp chỉ-số.)*
|
||
- **Bằng-chứng cửa này cần thiết:** M9 (nghi-thức seed on-behalf) tồn-tại từ S149 mà **vẫn rớt 3 lần** (S153 · S158 · S162) vì chạy bằng **TRÍ-NHỚ**. Phép đếm 2 cột thay trí-nhớ bằng **luật soi-được** — cùng bài với `dry-run bắt lời-hứa-chưa-land`.
|
||
- Cửa này **KHÔNG chặn** `/pause` khi không đo được (lỗi script/glob) ⇒ in `C2-probe loi (khong chan)` + ghi 1 dòng `[!]` vào WAL rồi đi tiếp; **im-lặng bỏ qua thì KHÔNG được**.
|
||
|
||
## 2.6 Ghi context-block vào thư-mục phiên-LOGIC (S146 — lane CỘNG-DỒN, cặp với `/tiep §2.6`)
|
||
|
||
🔴 **FORM HUB (owner chốt @S148 "đối ứng đúng chính xác như hub") — TÁCH marker ⟂ narrative, KHÔNG gộp 1 file như form SE cũ:**
|
||
|
||
**(A) Marker `_pause-<i>.md`** — `<i>` = số TUẦN TỰ trong thư-mục (`max(_pause-*)+1`), **KHÔNG** nhãn `S<nn>`, **KHÔNG** timestamp trong tên. Đúng **5 trường, ~200B**, không thêm bớt:
|
||
```
|
||
ts: <ISO-8601 +07:00>
|
||
head-sha: <full sha, git rev-parse HEAD>
|
||
window-ordinal: <thứ mấy trong phiên-logic>
|
||
jsonl-hint: <project-dir>/<session-uuid>
|
||
account-label: none
|
||
```
|
||
|
||
**(B) Narrative → APPEND vào `_context-s-<N>.md`** (một file DUY NHẤT/phiên-logic, cộng dồn) — thêm đúng 1 entry `### PAUSE-<k> <ts>` dưới `FLOW-START`:
|
||
- 🔴 **Dòng đầu entry = `> anh: <tin-nhắn anh VERBATIM>`** — chép **nguyên văn**, CẤM paraphrase. Không có tin-nhắn ⇒ ghi `(THIẾU — lý do)`, **CẤM dựng lại từ trí nhớ**.
|
||
- Rồi 3 mục cũ: **(1) quyết-định đã CHỐT** · **(2) delta còn SỐNG** · **(3) con-trỏ**.
|
||
- 🔴 **FLOW append-only, entry cũ IMMUTABLE** — CẤM rewrite, CẤM tự-tóm (chống self-summary lossy). Vượt `session_ctx_kb` ⇒ distill **SECTION CŨ** thành pointer, KHÔNG sửa entry verbatim.
|
||
|
||
**(C) Máy-derive `§(c) STOCK-touched`** — `python scripts/session_ctx.py machine-block --session <N> --json` → điền bảng §(c) của `_context-s-<N>.md`. **KHÔNG điền tay** (template ràng "máy-derive @pause/snapshot").
|
||
🔸 **Khai giới-hạn:** `changed_files` = `git diff anchor..HEAD` ⇒ **chỉ phần ĐÃ COMMIT**; việc còn dirty không hiện. Đừng đọc thành "toàn bộ việc đã làm".
|
||
|
||
**(C-bis) Refresh lớp MỀM `_mind-s-<N>.md`** *(adopt thư `0df10df4` @S153 — sàn khoản 2; đặt TRƯỚC (D) để secrets-sweep của auto-snap quét luôn block vừa chèn = lưới-2 sau máy-draft lưới-1; 🔴 nghi-thức ĂN từ phiên sau restart CLI — command no-hot-reload)*:
|
||
1. Soạn **NHÁP** block A-E (scratchpad): **A** gói-turn · **B** hướng-tiếp + nhánh-đã-loại · **C** kế-hoạch delta-suy-nghĩ (KHÔNG chép checklist) · **D** đang-thảo-luận + nhãn `{mới-nêu|đang-cãi|gần-chốt|treo-chờ-anh}` · **E** dòng-sống 1-dòng/spawn `{verdict + con-trỏ}`. Mục trống ghi `(trống — khai)`; việc ĐÃ-CHỐT = con-trỏ WAL/HANDOFF, **CẤM chép**.
|
||
2. `python scripts/session_ctx.py mind-check --session <N> --draft <file-nháp>` — **TRƯỢT ⇒ sửa nháp, CẤM chèn** (rào quét dịch-trái).
|
||
2-bis. **Spawn `ctx-curator`** (vai-1 Ctx — carve-out §1, OWNER-VETO @S153 hub-form 3-vai; **máy TRƯỚC vai**): PIN {nháp · `_mind` · run-folder-đang-mở-hoặc-khai-0 · WAL} → nhận `CTX-CURATOR: DAT|SUA|SKIP-CO-KHAI` → điểm SỬA thì sửa nháp + chạy lại bước 2 → verdict 1-dòng ghi vào entry `PAUSE-<k>` mục (3) của `_context` (vết, không đẻ file). Núm-hạ-tần-suất = quyền anh (1 câu là hạ nhịp/tắt — máy-$0 vẫn lo).
|
||
3. Chèn **TOP** dưới `<!-- MIND-TOP -->`; số hiệu = **ĐẾM block TRƯỚC chèn** (block-0 chiếm số 0). 🔴 `_mind` mới-nhất-ở-**TRÊN** — **NGƯỢC chiều** `_context` FLOW (mới-nhất-ở-CUỐI), đừng chép khuôn bên kia.
|
||
4. `mind-check` full. Trần = khoá **`mind_ctx_kb`** (B1 — CẤM chép số vào đây); vượt ⇒ nén block CŨ NHẤT trừ block-0 + top; <3 block ⇒ **TỪ-CHỐI nén + giương cờ**. File `_mind` chưa có (ca vào giữa phiên-logic) ⇒ tạo từ `session-mind-template.md` + khai trễ.
|
||
**Chi phí ĐO THẬT @S153 (T4 Measure-Command ×3 — thay ước ban đầu 0.3-0.6s lệch 2.2-5.4×): +~0.12s máy (draft 61,3ms + full 55,4ms; file 34KB vẫn 63,8ms) + 1 Edit + ~1-3K tok soạn nháp + 🔄 1 spawn `ctx-curator` (OWNER-VETO @S153 hub-form 3-vai — carve-out §1, floor ~100K tok/spawn, chi phí anh đã chấp nhận; núm hạ = 1 câu của anh).** 🧊 *Câu cũ "0 spawn — vai kiểm chỉ sống @2 bookend" = quyết (36)(b)+(38)(a) trước veto — hết hiệu lực vế spawn-@pause, vế máy-$0-mỗi-cửa GIỮ.*
|
||
|
||
**(D) AUTO-SNAPSHOT — chạy `/snapshot` §2→§4 ngay trước bước 3** *(đóng `[carry:pause-autosnap]` #17, anh chốt @S148)*:
|
||
- ✅ **Đo trước khi wire, đúng câu hub bắt hỏi** (`goi-chot` §3 — *"có làm điểm dừng đắt lên không"* phải hỏi TRƯỚC khi bàn giá-trị): `machine-block` **~140ms** · `secrets-sweep` **~64ms** (3 lượt, tb).
|
||
- 🔴 **Chi-phí RÒNG của auto-snap chỉ là ~64ms + 1 write**, KHÔNG phải 204ms: `machine-block` **vốn đã phải chạy** ở (C) cho §(c) STOCK-touched. `/pause` cũng vốn đã commit sẵn ở bước 4.
|
||
- 🔸 **Ranh giữ khai:** hub **KHÔNG** ràng 1 pause = 1 snapshot (đo đĩa hub: `session-102` pause=3/snap=5 · `session-107` pause=2/snap=1). SE chọn auto-snap-tại-pause là **quyết-định SE**, không phải floor hub — ai thấy đắt thì gỡ, đã có số để cãi.
|
||
|
||
🧊 **Form SE cũ `pause-S<nn>-<ts>.md` (gộp marker+narrative) = LEGACY, CẤM viết mới.** Sàn-3 ⑤ vẫn **nhận** nó (dual-accept, `tiep.md §0`) vì `session-1` còn dùng — đúng luật retire: *gỡ nhánh legacy khi tập di-sản RỖNG, giữ khi CÒN người thụ-hưởng*.
|
||
|
||
- `<N>` = phiên-LOGIC **đang mở** — xem [`session-start.md`](session-start.md) BƯỚC 0.8.
|
||
- 🔴 **Scaffold idempotent (owner chốt @S146 "giống hub"):** thư-mục chưa có ⇒ **TẠO**; đã có ⇒ **DÙNG LẠI, CẤM đè**. Chạy lại nhiều lần vô hại.
|
||
- 🔴 **NHƯNG `/pause` KHÔNG BAO GIỜ tự tăng `<N>`** — cấp-số là **độc-quyền `/session-start`** (BƯỚC 0.8, canonical; B1 — mục này chỉ TRỎ). `/pause` chỉ tạo thư-mục cho số **đang mở**. Không có số nào đang mở (vào thẳng bằng `/tiep` rồi `/pause`, chưa từng `/session-start`) ⇒ dùng `max+1` **và ghi 1 dòng khai** trong khối: `N-cap-ngoai-session-start: <N> (ly-do: <...>)` — để `<N>` không bao giờ xuất-hiện mà không ai biết nó ở đâu ra.
|
||
- 🔴 **ACCUMULATE — CẤM ghi đè, CẤM sửa khối cũ.** Mỗi `/pause` = **một file mới**. (Ghi đè = mất chính thứ mà lane này sinh ra để giữ.)
|
||
- **3 trường** (đúng khuôn VC-3 draft): **(1) quyết-định đã CHỐT trong cửa này** · **(2) delta còn SỐNG** (việc/nghi-vấn mang sang cửa sau) · **(3) con-trỏ** run-folder / commit / file.
|
||
- 🔴 **Ranh với WAL — KHÔNG nhập một:** WAL = **mạch-sống, ghi-đè, cứng ≤40 dòng** (liếc-một-cái-là-biết, bước 3 dưới). Context-map = **bối-cảnh tích-luỹ, không cap 40 dòng**. Ghi-chú-dở DÀI thuộc **về đây**, KHÔNG nhồi vào WAL.
|
||
- **CẤM secret** (thư-mục này sẽ được commit — cùng kỷ-luật WAL bước 3).
|
||
- 🔸 Hook `wal-flush.ps1` đã phủ `.claude/sessions/` (path thứ-4, S146) ⇒ khối này **tự vào `wal:` commit** ở turn-boundary. Vẫn **PHẢI add đích-danh** ở bước 4 (đừng dựa vào hook để chốt điểm dừng — hook là lưới, không phải nghi-thức).
|
||
|
||
## 2.7 Kéo thư cross-project (cửa RA 2/2 — owner chốt S148)
|
||
|
||
**DÒ 2 kênh** (`outbox/se` + `outbox/all` × 6 repo) — **TRƯỚC** khi ghi WAL (bước 3), để `thu-moi: se=X all=Y` kịp vào `carry:`/context-map nếu có.
|
||
🔴 **CHỈ list + so id. KHÔNG copy · KHÔNG hash · KHÔNG python** — `/pause` là **cửa dừng**, ràng-buộc BINDING của hub (`goi-chot` §3) cấm làm nó đắt lên. Kéo thật = việc của bookend.
|
||
|
||
> 🔗 **Luật nhịp đầy-đủ = canonical [`check-email.md`](check-email.md) §"Nhịp chạy — 4 CỬA PHIÊN".** 🔴 **B1 — CHỈ TRỎ + GỌI, CẤM chép luật.**
|
||
> 🔴 **KHÔNG chặn điểm dừng:** lỗi ⇒ `check-email loi (khong chan)` → đi tiếp bước 3. `/pause` tồn-tại để **dừng an-toàn**; một bước kéo thư hỏng **không được phép** giữ anh lại.
|
||
|
||
## 3. Cập-nhật `.claude/WAL.md` đúng schema
|
||
- **`chain:`** — đầy-đủ mọi mục trạng-thái (`[x]` đã-xong · `[!]` đang-dở · `[ ]` chưa-làm), **KÈM BẰNG-CHỨNG** là một lệnh / đường-dẫn / hash chứng-minh trạng-thái đó (KHÔNG mô-tả suông).
|
||
- **`next:`** — đúng **một mệnh-lệnh cụ-thể**: làm gì tiếp theo.
|
||
- **`verify:`** — **ít nhất một lệnh CHẠY ĐƯỢC cho từng mục `[!]`**, để `/tiep` chạy được và đối-chứng.
|
||
- 🔴 WAL **ghi-đè toàn-file** (KHÔNG append), **cứng ≤ 40 dòng**. **CẤM secret** (WAL sẽ được commit): không key, không token, không credential.
|
||
|
||
## 3.5 TICK counter (H24 — TRƯỚC commit bước 4; Item 1(c) S135)
|
||
- Tick `.claude/governance/.session-counter.json` **theo contract** (idempotent — NO-OP nếu cùng nhãn-phiên/cùng HEAD) — 🔴 **CON-TRỎ `session-start.md §2.1.8`, CẤM chép logic tick** (B1 canonical).
|
||
- 🔴 **TRƯỚC commit bước 4** ⇒ delta counter được gộp vào commit `wal: pause` (file NGOÀI hook-4-path nên PHẢI add đích-danh ở bước 4).
|
||
|
||
## 4. Commit ĐÍCH-DANH — message `wal: pause`
|
||
- `git add` **đích-danh** đúng các path: **WAL + path persist** (agent-memory / run-folder / **`.claude/sessions/session-<N>/` — context-block bước 2.6, S146**) **+ `.claude/governance/.session-counter.json`** (🔴 M-7: tick bước 3.5 nằm TRONG commit `wal: pause` — file ngoài hook-4-path nên PHẢI add đích-danh; thiếu dòng này thì claim "tick nằm trong wal: pause" SAI) **+ file dở**, rồi `git commit -m "wal: pause"`.
|
||
- 🔴 **TUYỆT ĐỐI KHÔNG `git add -A`** — chỉ add đúng path cần chốt, tránh nuốt file rác / secret ngoài ý-muốn.
|
||
- **KHÔNG push.** (Repo trong Dropbox → thư-mục `.git` được cloud-sync, nên commit local vẫn **durable** qua tắt-máy / đổi-acc.)
|
||
|
||
## 5. Báo-cáo ngắn rồi DỪNG HẲN
|
||
Báo đúng sáu ý:
|
||
1. **goal** — mạch việc đang dở là gì.
|
||
2. **mục `[!]` đầu-tiên** — bước dở gần nhất.
|
||
3. **workflow bỏ lại** (nếu có) — dòng `wf:` đã ghi.
|
||
4. "**an-toàn để thoát, đổi acc, hoặc tắt máy**".
|
||
5. **dòng-nợ (Item 2 S135):** gọi `powershell.exe -ExecutionPolicy Bypass -File scripts/nhip-no-probe.ps1` in dòng-nợ 4-vế (nhịp-kiểm đọc post-tick bước 3.5). 🔴 **probe KHÔNG chặn điểm dừng**: lỗi → in `probe-loi (khong chan)` → đi tiếp, VẪN tuyên-bố "an-toàn để thoát".
|
||
> 🔗 **Predicate C7 đầy-đủ (probe nào được phép chạy ở điểm dừng) = canonical [`harness-11-engine.md`](../../docs/governance/harness-11-engine.md) §N.8.** 🔴 **B1 — dòng này CHỈ TRỎ, CẤM chép predicate sang đây.**
|
||
6. **🧾 MASTER-CHECKLIST rút-gọn (S138):** derive từ WAL vừa ghi (bước 3) + HANDOFF — in **Tầng-1** mỗi arc 1 dòng `{đóng · đang · chưa}` + **đếm 4-nhóm** (`xong` / `đang-dở` / `chờ-anh` / `chưa-làm`) + **liệt nhóm chờ-anh — 🔢 BẮT BUỘC ĐÁNH SỐ** (anh trả lời bằng số). 🔴 **Checklist = VIEW derive tươi — CẤM tạo file checklist nguồn-đôi (sàn-3).**
|
||
> 🔧 **SỬA LUẬT ĐÃ RATIFY — P2 = PB-2, chủ dự án chốt @S180, thi hành @S181 (2026-08-07). SITE 2/2.**
|
||
> Câu cấm trên **GIỮ NGUYÊN**; ranh **REQUEST ⟂ TASK** + lý-lẽ đầy-đủ + lineage = canonical ở [`tiep.md` §3-bis](tiep.md) — **B1: chỉ TRỎ, CẤM chép sang đây** (chép 2 nơi = 2 nguồn sự-thật, đúng thứ chính câu cấm này chặn).
|
||
> Tóm đúng 1 dòng để đọc tại chỗ: **TASK** (việc tới đâu) = **CHỈ** `.claude/WAL.md` · **REQUEST** (anh đã yêu-cầu gì) = sổ yêu-cầu W4, **CẤM** mang cột trạng-thái-thi-công riêng, cần thì **TRỎ** về WAL.
|
||
|
||
Rồi **DỪNG HẲN**, KHÔNG nhận việc mới.
|
||
|
||
---
|
||
|
||
🔒 **Bất-biến:** commit ở **bước 4 xảy ra TRƯỚC** tuyên-bố ở **bước 5** — chết ngay sau khi tuyên-bố "an-toàn để thoát" cũng KHÔNG mất gì (điểm dừng đã nằm trên đĩa).
|
||
|
||
👉 **Nối lại = `/tiep`** (MỘT đường recovery duy-nhất — kể cả khi user gõ "làm tiếp" bằng text thường, KHÔNG tự recovery cách khác).
|