# sub-n3-lane-c-gd34 — LANE C / 6 · GĐ-3 (nghi thức 2 đầu + cổng chặn mã lỗi) · GĐ-4 (sổ yêu cầu chủ dự án + chấm điểm) - run: `2026-08-07-S180-adap-upgrade-pack-phased` · lane **C** · vai `reviewer` (`/fable-clone`) - engine: `/fable-clone reviewer` · model tự khai: **claude-opus-5** · effort **max** - đầu vào ghim đích danh: - `broadcasts/inbox/ai_infra/2026-08-04-Governance-upgrade-pack-phased-thu-chinh.md` §GĐ-3 (`:174-191`) · §GĐ-4 (`:195-214`) - `…-phu-luc-spec-pitfall.md` §GĐ-3 (`:181-227`) · §GĐ-4 (`:230-289`) - `…-luat-cham-diem.md` TOÀN VĂN (9.970 B, `:1-147`) - `…-khuon-fit-map-report-checklist.md` Phần C (`:228-380`) - `sub-invest-fitmap-S180.md` (N1) · `sub-review-n2-S180.md` (N2) · `run.md` · `spec-…md` - ranh vai: **read-only, propose-only.** Không tự chọn phương án ở 2 xung đột — trình phương án + đánh đổi, quyền chọn là của anh. > Trạng thái ghi: file này được **đổ ruột trong lúc làm** (chống #53). Mục nào chưa đo xong ghi `CHƯA ĐO — cần `; mục nào đo rồi mà không kết luận được ghi `KHÔNG ĐO ĐƯỢC` kèm lý do. --- ## §0 — Cách đọc bảng khoản Mỗi khoản GĐ-3/GĐ-4 được bóc theo đúng đơn vị **in đậm của phụ lục** (sàn) và **bước làm đánh số của thư chính** (thi hành). Hai nguồn đánh số LỆCH nhau — N2 F-07b đã bắt N1 giẫm chỗ này. Lane C dùng **cặp mã kép**: `TC3-Lb` = *thư chính bước b* · `PL3-(x)` = *phụ lục khoản (x)*, và ghi rõ khi hai bên không ánh xạ 1-1. Trạng thái mỗi khoản: `CÓ` (SE đã có vật tương đương, kèm `file:line`) · `NỬA` (có mảnh, thiếu vế) · `THIẾU` (không có vật) · `NGƯỢC` (SE có luật/máy chiều ngược) · `KHÔNG ĐO ĐƯỢC`. --- # 🔴 PHẦN ƯU-TIÊN — 4 mục N4 không chia wave được nếu thiếu ## §A — XUNG ĐỘT 1: phạm vi THẬT của doctrine exit-0 (ĐO XONG) ### A.1 — Mệnh đề vào vs đo lại | Mệnh đề vào | Đo lại hôm nay | Kết luận | |---|---|---| | N1/lead: *"SE chỉ có **2 máy fail-loud** (`session-counter-tick.ps1`, `h24-signal-write.ps1`) + `hmw.js` checkpoint throw"* | **ĐẾM THIẾU.** Có **5 máy** trả exit≠0 khi PHÁT HIỆN LỖI (không tính exit≠0 do thiếu hạ tầng), và `hmw.js` có **4 chỗ throw** chứ không phải 1 | 🔴 **SỬA SỐ** — 2 → **5 máy**, 1 → **4 throw** | | lead cite `governance-detectors.ps1:1963` | dòng thật = **`:1962`** (`:1964` = `exit 0`). N2 F-11.2 đã bắt; lane C xác nhận ĐỘC LẬP bằng `sed -n '1955,1964p'` | ✅ N2 đúng, dùng `:1962` | **Vì sao lệch này quan trọng:** đề bài trình bày SE như *"gần như không có cổng chặn nào"* ⇒ mọi phương án hoà giải sẽ bị vẽ như **du nhập một cơ chế lạ**. Đo lại thì SE **đã có sẵn cả hai chế độ**, và **đã có một ranh giới thành văn**. Bài toán đúng vì thế là **mở rộng ranh có sẵn**, rẻ hơn nhiều so với đổi doctrine. ### A.2 — Liệt TỪNG TÊN (17 máy cắm vào cửa lệnh) Phép đếm: `grep -ohE "scripts/[a-z0-9._-]+\.(ps1|py)" .claude/commands/*.md | sort | uniq -c | sort -rn` → **17 tên riêng biệt, 43 lần nhắc**. Control-dương: `session_ctx.py`=8 · `nhip-no-probe.ps1`=6 · `stamp_verify.py`=5 ⇒ thước có bắt, không phải 0-hit câm. **Nhóm 1 — FAIL-LOUD: exit≠0 khi PHÁT HIỆN LỖI (5 máy)** | # | Máy | Mã thoát | Điều kiện trả mã ≠0 | Neo | |---|---|---|---|---| | 1 | `scripts/session-counter-tick.ps1` | `42`, `$code` | counter regression · missing-head | `:269`, `:79` | | 2 | `scripts/h24-signal-write.ps1` | `2`, `3` | class ngoài enum-đóng · đầu vào sai khuôn | `:136,:142,:159,:175,:186,:191,:303,:307` | | 3 | `scripts/memory-archive-gate.ps1` | `2` | **A7 toàn-vẹn con-trỏ**: pointer gãy / archive 0-byte | `:325` | | 4 | `scripts/session-scaffold.ps1` | `3`, `4`, `5` | không lấy được đồng hồ · trùng id · đè `_context` đã có | `:14,:16,:137-138` | | 5 | `scripts/stamp_verify.py` | `1` (`2` = sai cú pháp gọi) | băm nội dung KHÔNG khớp `content_sha256` khai báo | `:51` | **Nhóm 2 — EXIT-0-ADVISORY: luôn 0 kể cả khi đầy cờ (9 máy)** | # | Máy | Neo `exit 0` | Ghi chú | |---|---|---|---| | 6 | `scripts/governance-detectors.ps1` | `:1964` (doctrine `:1962`) | **ĐO SỐNG HÔM NAY: `TOTAL FLAGS: 49` + `INFORM-ONLY: 21` — vẫn `exit 0`** | | 7 | `scripts/closeout-sentinel.ps1` | `:138,:211,:234,:247` | verdict đọc bằng DÒNG IN, không bằng mã thoát | | 8 | `scripts/nhip-no-probe.ps1` | `:230` | doctrine tự khai `:10-11` *"exit 0 ALWAYS - a probe MUST NEVER block a stop point"* | | 9 | `scripts/distill-shard-probe.ps1` | `:23,:27,:53,:71` | thiếu key thì in `FAIL-LOUD (khong gia dinh default)` **nhưng vẫn exit 0** — tên gọi ≠ mã thoát | | 10 | `scripts/mfe-eval.ps1` | `:45,:48,:334` | tự khai `READ-ONLY on budget; exit 0` | | 11 | `scripts/spawn-model-audit.ps1` | `:522` (khai `:140`) | tự khai `INFORMATIONAL, exit 0 always` | | 12 | `scripts/memory-selfimprove-audit.ps1` | `:346` | `:220` khai *"detector owns the verdict"* | | 13 | `scripts/agent-frontmatter-eol-check.ps1` | `:339` | `:325` khai *"Advisory only - exit code stays 0"* | | 14 | `scripts/crystallized-backfill.ps1` | `:159,:236` | header `:32` khai *"(7) exit 0 ALWAYS : measure-and-report, NOT a build-gate"* | **Nhóm 3 — BIÊN (3 máy): exit≠0 CHỈ khi thiếu hạ tầng, không phải khi phát hiện lỗi** | # | Máy | Mã | Ghi chú | |---|---|---|---| | 15 | `scripts/measure-agent-memory.ps1` | `1` | chỉ khi thiếu thư mục gốc (`:7`) | | 16 | `scripts/applied-eval-nokey.ps1` | `1` | chỉ ở nhánh `-Selftest` (`:346`); chạy thường = `exit 0` (`:362`) | | 17 | `scripts/session_ctx.py` | — | **0 câu `sys.exit`** trong file ⇒ mã thoát mặc định 0 trừ khi tràn ngoại lệ | ### A.3 — 🔴 PHÁT HIỆN LỚN NHẤT CỦA LANE C: ranh giới ĐÃ TỒN TẠI, SE đã viết thành lời, trong CÙNG MỘT MÁY `scripts/memory-archive-gate.ps1:323-325` — chép nguyên văn, không sửa: ``` # Exit non-zero only on A7 integrity failure (broken pointer / 0-byte archive). # Over-cap is a FLAG (not an error) - the gate reports, a human curates. if ($gateFailPtr -gt 0) { exit 2 } else { exit 0 } ``` Một máy, **hai chế độ, ranh vẽ sẵn**: - **TOÀN VẸN quyết được bằng máy** (con trỏ có resolve không · tệp có 0 byte không) ⇒ **chặn**. - **PHÁN XÉT cần người** (vượt trần bao nhiêu thì nên dọn) ⇒ **gắn cờ, không chặn**. Đối chiếu 5 máy fail-loud thì ranh này **khớp 5/5** — không phải trùng hợp: | Máy | Thuộc loại | Vì sao chặn được mà không sợ oan | |---|---|---| | `session-counter-tick` | sắp GHI trạng thái | từ chối **ghi** một bộ đếm sai — chặn để **không tạo dữ liệu hỏng** | | `h24-signal-write` | sắp GHI trạng thái | từ chối **ghi** một class ngoài enum | | `session-scaffold` | sắp GHI trạng thái | từ chối **đè** `_context` đã có | | `memory-archive-gate` (nhánh A7) | toàn vẹn tham chiếu | con trỏ resolve hay không — nhị phân, không cãi được | | `stamp_verify.py` | toàn vẹn băm | băm khớp hay không — nhị phân, không cãi được | ⇒ **Luật ngầm của SE, nay phát biểu thành lời:** *một máy được phép CHẶN khi (a) nó sắp GHI, hoặc (b) vị từ của nó là nhị phân quyết-được-bằng-máy. Máy chỉ được GẮN CỜ khi vị từ của nó là phán-xét hoặc ước lượng.* Đây chính là câu trả lời cho *"ranh vẽ ở đâu"*, và nó **không do lane C bịa ra** — nó đã nằm trên đĩa từ S73 (header `memory-archive-gate.ps1:1` ghi *Harness-11 PART-A (S73, 2026-06-18)*). ### A.4 — SE có lý-do-kỹ-thuật CHỐNG chặn-mù, nên gửi ngược hub `.claude/workflows/hmw.js` có **4 chỗ throw**: `:126` (thiếu taskList) · `:132` (checkpoint chưa duyệt) · `:184` (vai ngoài whitelist) · `:209` (sàn danh-nghĩa) — nhiều hơn con số 1 mà đề bài ghi. Quan trọng hơn là **2 chỗ CỐ Ý KHÔNG throw, kèm lý do viết sẵn**: - `hmw.js:166` — *"CHẠY {keptN} lane ĐẦU, BỎ {dropped} lane CUỐI (**LOUD-skip, KHÔNG throw** — depth-axis:43)"* - `hmw.js:288` — *"🔴 **CỐ Ý KHÔNG throw**: :124-125 đã khai per-lane throw **bị nuốt thành null = STOP-SILENT**"* - `hmw.js:178` — *"throw có thể bị nuốt thành null = STOP-SILENT, **tệ hơn**"* 🔴 **Phản biện gửi ngược hub, dùng chính lập luận của hub.** Hub nói *"thuốc căn cơ cho tự-ý là CỔNG CHẶN"* (phụ lục `:206`, khoản (viii)). Nhưng SE đo được một chế-độ-hỏng mà hub chưa liệt: **cổng chặn đặt ở nơi mã thoát bị NUỐT thì biến thành DỪNG CÂM**, và dừng câm **trông giống hệt** "chạy xong sạch" với người đọc. Đó đúng là lớp lỗi hub tự đặt tên ở món 4 `:98`: *"nhãn không phản bác được thì không phải phép đo"*. ⇒ **Khoản đề xuất gửi ngược (anh duyệt trước khi gửi):** thang mã thoát 4 trạng thái của GĐ-3 nên kèm điều kiện tiên quyết — **chỉ cắm cổng chặn ở nơi mã thoát CHẮC CHẮN được đọc**; nơi mã thoát có thể bị nuốt thì cổng phải là **dòng in LOUD** thay vì mã thoát. SE có ca thật để dẫn chứng: `hmw.js:288`. ### A.5 — Đánh đổi định lượng, đo sống hôm nay `powershell.exe -ExecutionPolicy Bypass -File scripts/governance-detectors.ps1` → **`TOTAL FLAGS: 49`** + **`INFORM-ONLY: 21`** (đếm tách riêng, chống-Goodhart) — và vẫn **exit 0**. ⇒ Lật `governance-detectors.ps1` sang chế độ chặn **ngay hôm nay** = **49 cờ chặn mọi cửa tức thì**. Đây là con số phải đặt lên bàn trước khi chọn phương án. ### A.6 — 4 PHƯƠNG ÁN HOÀ GIẢI (trình để anh chọn — lane C KHÔNG chọn) #### PA-1 — "Kéo dài ranh đã có" (ranh = sắp-GHI hoặc vị-từ-NHỊ-PHÂN) Áp cổng chặn cho đúng lớp máy đã được phép chặn, mở rộng sang các vị từ nhị phân còn đang advisory. Giữ `governance-detectors` + `closeout-sentinel` + 4 probe ở nguyên exit-0. - **Vào lớp chặn:** vị từ *tồn-tại-tệp-mốc* của nghi thức hai đầu phiên — đúng thứ hub đòi ở nghiệm thu (`phụ lục:223` *"giả lập thiếu một tệp mốc thì cổng phải trả mã khác không"*), vì đó là vị từ nhị phân. - **Giữ advisory:** mọi thứ phán xét — trôi tài liệu, độ phủ, văn phong, vượt trần, phân tầng trích dẫn. - **Được:** không cờ nào trong 49 cờ hiện tại bị lật thành chặn ⇒ chi phí chuyển đổi gần bằng 0; ranh đã có sẵn trên đĩa nên không phải dựng luật mới; khớp đúng chữ hub ở phần nghiệm thu GĐ-3. - **Mất:** **không** phủ được TC-06 (*"tự ý bỏ"*) ở lớp phán xét — một nghi thức bị bỏ mà không sinh tệp mốc thì vẫn lọt. Hub `:206` nói thẳng rằng lời nhắc không phải thuốc. - **Rủi ro:** sinh ra cám dỗ **không sinh tệp mốc** để khỏi bị cổng bắt — đúng dạng "rời tập-đo" (memory `feedback_goodhart_leave_measurement_set`). Phải kèm luật *cửa nào có nghi thức thì bắt buộc sinh tệp mốc*, mà luật đó lại nằm ở lớp advisory ⇒ vòng lặp chưa đóng. Khai thẳng, không giấu. #### PA-2 — "Hai mã thoát trong một máy" (tách TOÀN-VẸN ⟂ PHÁN-XÉT ngay trong từng máy) Nhân bản đúng khuôn `memory-archive-gate.ps1:325` sang các máy nghi thức: mỗi máy tự chia cờ của nó làm hai rổ — rổ *toàn vẹn* lái mã thoát, rổ *phán xét* chỉ in ra. - **Được:** phủ được cả TC-06 lẫn TC-08 mà **không** lật 49 cờ (phần lớn 49 cờ rơi vào rổ phán xét); giữ nguyên doctrine "đèn không chặn điểm dừng"; là khuôn **SE đã chạy thật từ S73** nên rủi ro thấp. - **Mất:** phải **phân loại lại từng cờ** trong `governance-detectors.ps1` (49 + 21 = 70 cờ) — công việc thật, không nhỏ. Và bản thân việc phân loại **chính nó là phán xét**, nên phân loại sai sẽ đẻ ra cổng chặn oan. - **Rủi ro:** rổ toàn vẹn phình dần theo thời gian, mỗi lần có người thấy cờ của mình quan trọng — đúng dạng ranh trôi. Cần luật: **vào rổ toàn vẹn phải có mã dấu RC của anh**, mượn đúng cơ chế `ACTIVE-MARKS.md` đang sống. #### PA-3 — "Thang 4 trạng thái ở DÒNG IN, không ở mã thoát" Hub đòi *phân biệt được* bốn trạng thái (`phụ lục:200`: *"Gộp chúng thành một mã là mất thông tin ngay tại chỗ cần nhất"*). Đọc kỹ thì yêu cầu cốt lõi là **phân biệt được**; *mã thoát* là phương tiện hub chọn. SE đã in **dòng verdict khuôn cố định** — đó chính là cách `closeout-sentinel` đang hoạt động (*"exit ALWAYS 0, READ verdict-line"*). - **Được:** không có rủi ro dừng câm (`hmw.js:288`); tương thích ngược hoàn toàn; làm xong trong một wave; khai với hub là **"làm KHÁC, không phải làm thiếu"** đúng mục 6 của khuôn báo cáo. - **Mất:** **không có răng** — đúng thứ hub gọi là lời nhắc, và hub đã tuyên nó không phải thuốc. Ai bỏ qua dòng in thì không có gì chặn lại. - **Rủi ro:** đây là phương án dễ trượt lượt soi chéo của hub nhất. Nếu chọn thì phải khai thẳng và khai trước, kèm bằng chứng `hmw.js:288`, chứ không im lặng. #### PA-4 — "Cửa sau có răng" (chặn ở lượt SAU, không chặn lượt này) Không chặn cửa đang chạy. Thay vào đó, **tiền kiểm ở đầu cửa kế** đọc tệp mốc của cửa đã đóng gần nhất; **thiếu mốc thì trả mã thoát ≠0 ngay đầu cửa kế**. Khớp đúng chữ hub `thu-chinh:182` (*"tiền kiểm chi phí bằng không, chạy ở đầu mọi cửa, chỉ đọc, soi cửa đã đóng gần nhất"*) và giữ được TC-07 (anh vắng vẫn thoát phiên được). - **Được:** hoà cả hai phía — cửa **dừng** không bao giờ bị chặn (TC-07 an toàn, đúng lo ngại của SE), nhưng lệch thì **không thoát được** vì cửa kế sẽ chặn. SE đã có sẵn đúng cơ chế neo: carrier-commit `git log --diff-filter=A -1 -- ` (S158, 8/8 resolve) = *"dấu thời gian ghi TRONG tệp/lịch sử, không tin mtime của hệ điều hành"* — **trùng khít chữ hub `:182`**. - **Mất:** trễ một nhịp — lệch bị bắt ở phiên sau chứ không phải tại chỗ. Với phiên dài thì độ trễ đáng kể. - **Rủi ro:** anh mở phiên mới và **bị chặn ngay ở cửa đầu tiên** vì lỗi của phiên trước, tức trải nghiệm xấu đúng lúc anh vừa ngồi xuống. Phải có đường **khai suy giảm một dòng để đi tiếp**, nếu không thì tự tạo ra một biến thể mới của bệnh TC-07. **Bảng cân nhanh — để anh cân, KHÔNG phải khuyến nghị:** | | phủ TC-06 | rủi ro dừng câm | chi phí chuyển | lật 49 cờ? | rủi ro trượt lượt soi hub | |---|---|---|---|---|---| | PA-1 | thấp | rất thấp | rất thấp | không | trung bình | | PA-2 | cao | thấp | **cao** (phân loại 70 cờ) | không | thấp | | PA-3 | rất thấp | không có | rất thấp | không | **cao** | | PA-4 | cao | thấp | trung bình | không | thấp | 🔴 **Lane C KHÔNG chọn.** Cả bốn phương án đều thi hành được; chọn cái nào là một quyết định cơ chế, tức **quyền anh** (nguyên tắc SE: đổi cơ chế = quyền anh, memory `feedback_derived_flush_execution`). --- ## §B — XUNG ĐỘT 2: sổ-là-đường-ghi-chính ⟂ sàn-3 cấm-nguồn-đôi (ĐO XONG) ### B.1 — Đo lại hai vế của xung đột **Vế hub** — `luat-cham-diem:63`: *"**Cuốn sổ là đường ghi chính**, vì nó được ghi ngay trong lượt trao đổi."* Nằm trong mục *Nguồn đếm*, và khối chữ ký `:140` liệt phạm vi đã ký gồm **"nguồn đếm"** ⇒ câu này **thuộc phần BẤT BIẾN**, không phải hình thức đổi được. N2 F-08 đã bắt đúng chỗ này. **Vế SE** — đo lại nguyên văn hôm nay, cả hai bản còn sống: - `tiep.md:181`: *"🔴 **Checklist = VIEW derive tươi — CẤM tạo file checklist nguồn-đôi (sàn-3).**"* - `pause.md:117`: cùng câu, trong khối *MASTER-CHECKLIST rút-gọn (S138)*. ### B.2 — 🔴 Đọc kỹ phạm vi của luật SE: nó hẹp hơn N1/N2 đang giả định Luật SE cấm **"file checklist nguồn-đôi"**. Chủ ngữ là **checklist** — một *khung nhìn dẫn xuất về trạng thái việc*. Câu trước nó (`tiep.md:179-180`) định nghĩa rõ checklist gồm gì: **vừa-xong · vẫn-treo · chờ-anh**, tất cả **derive từ WAL đã reconcile + HANDOFF**. ⇒ **Luật này KHÔNG phải lệnh cấm chung cho mọi artifact mới.** Nó cấm đúng một hình: *dựng một tệp lưu trạng-thái-việc song song với WAL*. Một cuốn sổ lưu **lời anh đã nói** không phải checklist, vì lời nói **không derive được từ WAL** — WAL chưa bao giờ giữ chúng. Điều này thu hẹp xung đột lại rất nhiều: **xung đột chỉ xảy ra ở ĐÚNG MỘT CỘT** — cột *trạng thái* mà hub đòi trong khối việc-được-giao (`phụ lục:240`). Mọi cột khác của sổ đều rơi vào vùng trống thật. ### B.3 — Đo "chỗ nào thật sự trống": bảng phủ 4 kho hiện có Đo trực tiếp trên đĩa hôm nay: | Thứ hub đòi sổ giữ | `.claude/WAL.md` | `docs/HANDOFF.md` | `_context-s-.md` | `.claude/auto-memory/*.md` | Kết luận | |---|---|---|---|---|---| | mạch việc `[x]/[!]/[ ]` | ✅ **NGUỒN** (khối `chain:`) | — | — | — | hub **không đòi** — không đụng nhau | | **lời anh NGUYÊN VĂN** | ❌ (khối `goal/next/verify` là chữ lead) | ✅ **CÓ THẬT** — bảng 2 cột `Nguyên văn \| Lead thi-hành` (`:10-17`) | ❌ | ❌ (tiêu đề là nhãn-đội) | 🟡 **có mảnh, nhưng bị ghi đè mỗi phiên** | | **mã định danh VĨNH VIỄN** | ❌ | 🔴 **NGƯỢC** — đánh số `1..7` và **tái dụng mỗi phiên** | ❌ | ❌ (slug theo chủ đề, không theo lượt nói) | **TRỐNG THẬT** | | **số lần đã nhắc** | ❌ | ❌ | ❌ | ❌ | **TRỐNG HOÀN TOÀN** | | **khối sở-thích-thường-trực** | ❌ | ❌ | ❌ | 🟡 có **nội dung** (61 tệp) nhưng là *nhãn-đội + Why/How*, không nguyên văn, không mã, không liệt lằn-ranh-đỏ | **TRỐNG ở dạng hub đòi** | | **khối lời-phàn-nàn** | ❌ | ❌ | ❌ | ❌ | **TRỐNG HOÀN TOÀN** — N1 đo `grep "sở-thích\|phàn nàn"` = 0, N2 tái lập tách vế, đứng | | **trạng thái mở/đóng của một YÊU CẦU** | 🟡 gián tiếp qua task | 🟡 cột *Lead thi-hành* | ❌ | ❌ | 🔴 **ĐÂY LÀ CHỖ DUY NHẤT ĐỤNG** | Đếm kèm lệnh: `ls -1 .claude/auto-memory/*.md | wc -l` = **61** (khớp N1, đề-bài-lead ghi 60 — N2 đã bắt). ⇒ **Trả lời thẳng câu hỏi cốt lõi:** **CÓ chỗ thật sự trống, và trống nhiều.** Bốn trong bảy hàng trên không có bất kỳ kho nào giữ. Sổ-3-khối **không phải bản sao thứ hai của thứ gì cả** — trừ đúng một cột. ### B.4 — 🔴 Bằng chứng SE ĐÃ TRẢ GIÁ cho đúng cái hub cảnh báo Hub `phụ lục:246`, khoản (ii): *"Mã định danh vĩnh viễn, cấm tái sử dụng... **Bài học đã trả giá: nhãn thứ tự bị dùng lại làm gãy mọi chỗ trích dẫn chéo tới nhãn đó.**"* SE có **đúng ca đó, đã ghi vào ký ức**: memory `feedback_absence_looks_like_clean` — *"slot-index tái-dụng xoá IM-LẶNG (mất uỷ-quyền owner, **hỏi lại 3 lượt**)"*. Và cấu trúc gây bệnh **vẫn đang chạy hôm nay**: bảng `HANDOFF:10-17` đánh số `1..7` rồi phiên sau đánh lại từ `1`. ⇒ Đây không phải "adopt một luật lạ của hub". Đây là **vá một vết SE đã chảy máu**, bằng đúng liều thuốc hub kê. Ghi vào báo cáo là **hội tụ độc lập**, không phải sao chép. ### B.5 — Ba phương án vẽ ranh (trình để anh chọn — lane C KHÔNG chọn) #### PB-1 — "Sổ giữ LỜI, WAL giữ VIỆC; cột trạng thái của sổ là VIEW" Sổ là **nguồn duy nhất** cho: lời nguyên văn · mã vĩnh viễn · thời điểm · số lần nhắc · sở thích · phàn nàn. Cột *trạng thái* của sổ **không tự lưu**, mà **derive** từ con trỏ tới WAL/todo (đúng khuôn `tiep.md:181` đang bắt checklist làm). - **Được:** không vi phạm một chữ nào của sàn-3 — vì phần derive vẫn derive, phần lưu là phần WAL chưa bao giờ có. Giữ trọn "sổ là đường ghi chính" cho **nguồn đếm chấm điểm** (mà công thức chỉ cần *mục bị lặp*, không cần trạng thái). - **Mất:** lượt dò 0-phí phải **đọc 2 tệp** (sổ + WAL) mới trả được số "đang treo" ⇒ máy dò phức tạp hơn, và **hỏng một trong hai thì số sai** — phải in `dò lỗi, không chặn` đúng luật đèn nợ. - **Rủi ro:** con trỏ sổ→WAL gãy khi WAL bị squash. **Nhưng SE đã có thuốc:** neo bằng carrier-commit (`git log --diff-filter=A -1 -- `, S158, 8/8 resolve, sống-sau-squash by construction). #### PB-2 — "Sổ giữ REQUEST, WAL giữ TASK — hai tầng khác nhau, cả hai đều là nguồn" Tuyên minh bạch rằng đây là **hai đại lượng khác nhau**, không phải hai bản sao: *yêu cầu của anh* (REQUEST, sống xuyên phiên, đóng khi anh hài lòng) ⟂ *việc phải làm* (TASK, sống trong mạch, đóng khi code chạy). Một REQUEST đẻ ra N TASK. - **Được:** đơn giản nhất để thi công và để đọc; máy dò chỉ đọc **một** tệp ⇒ đúng chữ hub *"lượt dò không tốn phí"*; hợp với thực tế là **một câu anh nói thường đẻ nhiều task**. - **Mất:** phải **sửa phạm vi luật đã ratify** — bổ sung một câu vào `tiep.md:181` + `pause.md:117` kiểu *"sàn-3 cấm nguồn-đôi cho **trạng-thái-việc**; sổ yêu cầu ở tầng REQUEST không thuộc phạm vi cấm"*. **Sửa luật đã ratify = quyền anh**, không phải việc lead tự làm. - **Rủi ro:** mở một ngoại lệ vào sàn-3 thì lần sau ai cũng viện được. Cần **đóng khung bằng liệt kê**, không bằng tính từ (đúng bài học A6 của chính hub): ghi thẳng *"ngoại lệ áp cho ĐÚNG tệp `<đường-dẫn-sổ>`, không cho tệp nào khác"*. #### PB-3 — "Không đẻ tệp mới — mở rộng HANDOFF thành sổ" Không dựng artifact mới. Nâng cấp chính bảng `HANDOFF:10-17` (vốn **đã đúng hình 2 cột nguyên-văn ⟂ thi-hành**) thành sổ: đổi số `1..7` thành **mã vĩnh viễn**, thêm cột *số lần nhắc*, thêm hai khối *sở thích* và *phàn nàn*, và **ngừng ghi đè mỗi phiên** (append-only). - **Được:** **0 tệp mới ⇒ 0 nguy cơ nguồn-đôi theo định nghĩa**; tận dụng cấu trúc SE tự nghĩ ra và đã chứng minh có tác dụng (B.4); không phải động vào luật ratify nào. - **Mất:** **phá vỡ hợp đồng của HANDOFF** — memory `feedback_status_handoff_tiering` ghi rõ HANDOFF phải *"giữ lean (current + 2-3 session)"*. Một cuốn sổ append-only vĩnh viễn thì **không lean được**, và HANDOFF là tệp *brief 5 phút* được đọc mỗi phiên ⇒ phình sẽ trả giá ở mọi phiên. - **Rủi ro:** trộn hai mục đích vào một tệp (brief-để-đọc ⟂ sổ-để-tra) là đúng dạng lỗi mà chính SE đã tách ra ở tiering. Có thể cứu bằng *HANDOFF giữ 3 phiên gần nhất, phần cũ đẩy sang archive có `_INDEX`* — nhưng thế là **quay lại đẻ tệp**, tức PB-1/PB-2 trá hình. Khai thẳng chỗ này. **Bảng cân nhanh:** | | phạm luật ratify? | số tệp máy dò phải đọc | phình HANDOFF? | giữ được "đường ghi chính"? | |---|---|---|---|---| | PB-1 | không | 2 | không | có (cho nguồn đếm) | | PB-2 | **có — cần anh sửa luật** | 1 | không | có, trọn vẹn | | PB-3 | không | 1 | **có** | có, nhưng đổi bằng độ lean | 🔴 **Lane C KHÔNG chọn.** Cả ba đều thi hành được. PB-2 đòi anh **sửa một luật đã ratify** nên nó là quyết định của anh theo đúng nghĩa hẹp nhất; PB-1 và PB-3 không đòi sửa luật nhưng đều có giá phải trả đã ghi ở trên. ### B.6 — Điều-kiện-vào bắt buộc cho wave W4 (khớp N2 F-10, lane C xác nhận độc lập) W4 **không được thi công trước khi anh chốt một trong ba phương án B.5**. Lý do đo được: cả ba phương án cho ra **cấu trúc tệp khác nhau** (PB-1 có cột con-trỏ, PB-2 không, PB-3 không có tệp mới) ⇒ thi công trước rồi chốt sau nghĩa là **làm lại từ đầu**. --- ## §C — BẪY A1 / GĐ-4-bẫy-5: SE có mắc không? (ĐO XONG — kết luận NGƯỢC với gợi ý của đề bài) ### C.1 — Chữ của bẫy, chép nguyên văn - `phụ lục GĐ-4 bẫy-5` (`:274`): *"**Cấm đổ hàng loạt 'nhãn của đội' vào cột dành cho 'lời chủ dự án'.** Đó là tiêm diễn giải vào đúng cột cấm diễn giải, và tạo sẵn một loạt mục sẽ trượt khi đối chiếu. Cách đúng là đưa chúng vào một phụ lục riêng."* - `Phần C A1` (`:278`): *"Dấu hiệu adapt thiếu, **đã xảy ra thật ở hub**: đổ hàng loạt khoản việc từ một sổ nội bộ sang cột lời nguyên văn."* **Cơ chế của bẫy, tách rạch ròi:** ô nhiễm **cột nguyên văn** bằng chữ do đội đặt ⇒ khi đối chiếu ngược với bản ghi hội thoại, các mục đó **trượt** vì anh chưa từng nói câu ấy. ### C.2 — Ca sống đề bài đưa: `docs/HANDOFF.md:17` Đo tận nơi. Bảng `HANDOFF:10-17` có **đúng hai cột**: `| # | Nguyên văn | Lead thi-hành |`. Dòng 5 (`:17`) nguyên văn trên đĩa: | Cột | Nội dung thật | |---|---| | `#` | `5` | | `Nguyên văn` | `*"5 -> OK"*` | | `Lead thi-hành` | *"🔴 lead **tự thu-hẹp** thành "ghi-nhận, CHƯA phải lệnh đổi số" ⇒ giữ `hmw_width.cap`=20. **Diễn-giải của lead, không phải chữ của anh** — nếu anh ý là "nâng đi" thì nói lại, đừng để lead phán hộ"* | ### C.3 — 🔴 KẾT LUẬN: **KHÔNG phải bẫy này.** Và lane C từ chối gật theo đề bài. Ba lý do đo được, không phải lý luận: 1. **Cột nguyên văn SẠCH.** Ô chứa đúng bốn ký tự anh gõ: `5 -> OK`. Không một chữ nào của đội lọt vào. Bẫy A1 đòi hỏi *ô nhiễm cột nguyên văn* — điều kiện này **không thoả**. 2. **Diễn giải nằm ở cột ĐƯỢC PHÉP diễn giải.** Cột thứ hai tên là *Lead thi-hành*, tồn tại đúng để chứa hành động của đội. Hub gọi cách đúng là *"đưa chúng vào một phụ lục riêng"* — SE đã làm mạnh hơn: không phải phụ lục ở cuối tệp, mà là **cột kề bên**, đọc song song được. 3. **Việc thu hẹp đã được TỰ KHAI, ngay trong ô, bằng chữ đỏ.** Câu *"Diễn-giải của lead, không phải chữ của anh — nếu anh ý là 'nâng đi' thì nói lại, đừng để lead phán hộ"* là một **lời khai suy giảm**, đúng nhãn *suy-giảm-hợp-lệ* của GĐ-3 (`phụ lục:191`: *"đặc tả cho phép và đã khai đủ bằng chứng. Không tính lỗi"*). ⇒ Nếu chấm theo đúng thang bốn nhãn của hub, ca `HANDOFF:17` là **suy-giảm-hợp-lệ**, **không phải** *tự ý bỏ*, và **không phải** bẫy A1. ### C.4 — Nhưng đây MỚI là điều đáng lo, và nó ngược chiều: **khuôn sổ của hub KHÔNG bắt được ca này** Khối *việc-được-giao* của hub (`phụ lục:240`) có đúng sáu trường: *mã · lời nguyên văn · thời điểm và phiên · trạng thái · số lần đã nhắc · con trỏ*. **Không có trường nào cho "đội đã hiểu lệnh này thành gì".** ⇒ Nếu SE dựng sổ **đúng y khuôn hub**, dòng cho ca này sẽ là: `mã · "5 -> OK" · S179 · đang-mở · 1 lần · `. Toàn bộ phần *lead tự thu hẹp phạm vi lệnh* — tức **đúng cái sai thật sự đã xảy ra** — **bốc hơi khỏi sổ**. 🔴 **Đây là một khoản SE làm MẠNH HƠN hub, có bằng chứng trên đĩa, và nên gửi ngược hub** (mục 6 + mục 8 của khuôn báo cáo): *khối việc-được-giao cần thêm một trường thứ bảy — **"đội hiểu thành gì"** — đặt cạnh cột nguyên văn. Thiếu trường này thì lớp lỗi "đội thu hẹp phạm vi lệnh mà không hỏi lại" không có chỗ nào để lộ ra, trong khi nó khác hẳn lớp lỗi "quên làm".* SE có ca thật để dẫn: `docs/HANDOFF.md:17`. ### C.5 — Chỗ SE **SẼ** mắc bẫy A1 nếu thi công W4 theo bản đồ N1 (xác nhận N2 F-04, đo thêm) N1 (`sub-invest-fitmap-S180.md:120`) liệt nguyên liệu cho sổ: *"việc-được-giao → WAL chain + HANDOFF + `docs/changelog/migration-todos.md`; sở-thích → 61 file auto-memory"*. Đo: `.claude/auto-memory/*.md` = **61 tệp**, và tiêu đề của chúng là **nhãn do đội đặt** — ví dụ đọc thẳng từ chỉ mục: *"Máy rộng, UI hẹp"* · *"Vắng-mặt trông giống ổn"* · *"Claim mạnh hơn việc đã làm"* · *"Dry-run bắt lời-hứa-chưa-land"*. Không câu nào trong số đó là chữ anh gõ; chúng là **chữ lead đúc ra để gợi nhớ**. ⇒ Đổ 61 tiêu đề này vào cột *lời nguyên văn* = **mắc bẫy A1 chính xác từng chi tiết**, và tạo sẵn 61 mục sẽ trượt khi đối chiếu ngược. Tương tự với `WAL.md` (khối `chain:` toàn chữ lead) và `migration-todos.md`. **Acceptance bắt buộc cho spec W4** (trùng N2 F-04, lane C xác nhận và siết thêm): 1. Cột *lời nguyên văn* **chỉ nhận chữ anh gõ**, và chỉ **từ thời điểm dựng sổ trở đi**. 2. Dữ liệu cũ từ WAL / HANDOFF / auto-memory / migration-todos vào **phụ lục riêng của sổ**, cột riêng, nhãn rõ là *suy ra, không phải nguyên văn*. 3. **Ngoại lệ duy nhất được đề xuất:** bảng `HANDOFF:10-17` — vì cột *Nguyên văn* của nó **đã là nguyên văn thật** (kiểm được bằng đối chiếu bản ghi phiên). Nhập bảng này thì hợp lệ; nhập bất cứ thứ gì khác thì không. 🔴 **Đây là đề xuất, cần anh gật** — vì nó là ngoại lệ đầu tiên và mọi ngoại lệ sau sẽ viện nó. --- ## §D — SỔ-3-KHỐI: hình dạng đề xuất (khối nào · ghi gì · AI ghi · ghi LÚC NÀO) > Đây là **bản vẽ đề xuất**, không phải bản thi công. Hình dạng cuối phụ thuộc anh chọn PB-1/PB-2/PB-3 ở §B.5 — cột *trạng thái* và cột *con trỏ* đổi theo phương án. ### D.1 — Ba khối, đúng tên hub quy ước (A1 đòi *"ba tiêu đề khối tồn tại"*) #### Khối 1 — `việc-được-giao` | Trường | Nội dung | Ai ghi | Lúc nào | |---|---|---|---| | mã | `YC-` — **vĩnh viễn, cấm tái dụng**; đóng thì lật trạng thái, **không xoá dòng** | lead | ngay lượt anh nói | | lời nguyên văn | đúng chữ anh gõ, cắt theo **trần ký tự cứng** đọc từ tệp cấu hình chung | lead | ngay lượt anh nói | | thời điểm · phiên | dấu thời gian + `S` | lead | cùng lúc | | trạng thái | mở / đóng — **hình dạng tuỳ phương án §B.5** | lead | lật lúc đóng | | số lần đã nhắc | số nguyên, **lần đầu tính là 1** | lead ghi 1; **vai đọc sổ** tăng | tăng khi vai đọc sổ nhận ra trùng nghĩa | | con trỏ | trỏ tới nơi việc đang nằm (WAL / run-folder / commit) | lead | khi việc được nhận | | 🔴 **đội hiểu thành gì** *(trường thứ 7 — SE thêm, xem §C.4)* | diễn giải của lead, **tách hẳn khỏi cột nguyên văn** | lead | ngay khi lead diễn giải | #### Khối 2 — `sở-thích-thường-trực` | Trường | Nội dung | Ai ghi | Lúc nào | |---|---|---|---| | mã | `ST-` vĩnh viễn | lead | khi anh phát biểu một sở thích | | lời nguyên văn | chữ anh gõ | lead | ngay lượt đó | | phạm vi được làm thẳng | liệt kê loại việc | lead | cùng lúc | | **lằn ranh đỏ vẫn phải hỏi** | 🔴 **LIỆT KÊ TỪNG LOẠI, cấm tính từ** (A6) | lead | cùng lúc | | lý do anh đã lường trước | ghi nếu anh có nói | lead | cùng lúc | | thời điểm · trạng thái | — | lead | — | **Hai mục mồi bắt buộc** (hub `thu-chinh:201`; nghiệm thu đòi `grep -c '' ` ≥ 2): - `ST-001` — cho phép làm thẳng trong phạm vi việc thường ngày. **Lằn ranh đỏ đề xuất, liệt từng loại** — SE có sẵn nguyên liệu, không phải bịa: đổi lược đồ dữ liệu (migration) · xoá dữ liệu · việc hướng ra ngoài (email/broadcast/adap-report) · việc không lùi được (deploy prod, wipe) · việc dính tiền · **đổi cơ chế governance** (SE-đặc-thù, `feedback_derived_flush_execution`) · **đổi con số nhịp/ngân sách** (SE-đặc-thù, quyền anh). - `ST-002` — cho phép tự trị khi anh vắng. 🔴 **Nội dung phải là luật ba bậc của GĐ-3** — xem §E.3, và xem cảnh báo nguồn-đôi ở §F.2. #### Khối 3 — `lời-phàn-nàn` | Trường | Nội dung | Ai ghi | Lúc nào | |---|---|---|---| | mã | `PN-` vĩnh viễn | lead | ngay lượt anh phàn nàn | | lời nguyên văn | chữ anh gõ | lead | ngay lượt đó | | chủ đề gộp | nhãn gộp để đếm lặp | **vai đọc sổ** | cuối phiên | | thời điểm · phiên | — | lead | ngay lượt đó | | số lần lặp | — | **vai đọc sổ** | cuối phiên | **Đo trạng thái SE hôm nay cho khối 3:** `grep -rln "sở-thích\|phàn nàn" .claude/commands/ docs/governance/*.md` = **0 hit** (N1 đo, N2 tái lập tách vế bằng ripgrep, control-dương *"điểm dừng"* = **5 tệp** — N2 sửa số control của N1 từ 3 lên 5). ⇒ **khối này SE trống tuyệt đối**, không có gì để migrate, dựng mới hoàn toàn. ### D.2 — AI ghi: phân vai đề xuất, và chỗ nó đụng roster | Việc | Vai | SE đã có vai chưa? | |---|---|---| | ghi NGAY lời anh vào khối 1/2/3 | **lead (em-main)** | ✅ có — nhưng **kỷ luật chưa thành văn**, phải cắm vào tệp luôn nạp (§D.3) | | tăng *số lần nhắc* · gộp chủ đề phàn nàn · đếm độc lập tầng 2 | **vai đọc sổ** — 4 thấu kính | ❌ **CHƯA CÓ** — đẻ vai mới ⇒ **VƯỢT-KHUNG** (đụng roster + `hmw.js` VALID_ROLES + GĐ-6 điều-kiện-vào-danh-sách trọn-gói-1-commit) | | kiểm PHÉP ĐẾM ở tầng 3, **cấm đề xuất điểm khác** | **vai soi vai** | 🟡 SE có **họ hàng gần**: `ring2-audit` (soi lại vai kiểm) + cặp `lead-stale-auditor`/`lead-gap-auditor`. Gán thêm nhiệm vụ hay đẻ vai mới = **quyền anh** | | quyết điểm cuối (tầng 4) | **anh** | — | 🔴 **Khoản "thu hẹp vai cũ cùng lượt"** (hub `thu-chinh:206`): phải đo xem vai nào của SE đang soi phần *yêu cầu của anh*. **CHƯA ĐO** — cần: `grep -rln "yêu cầu của anh\|owner-request\|lời anh" .claude/agents/*.md` kèm control-dương. Nếu có chồng lấn thì phải chuyển giao **trong cùng một lượt** và ghi rõ phần đã chuyển. ### D.3 — Ghi LÚC NÀO: hai kỷ luật, và chỗ cắm phải đúng Hub `phụ lục:252` cấm rất rõ: *"**Cấm cắm vào tệp lệnh của một cửa**: tệp lệnh chỉ được đọc khi tới cửa, nên cắm ở đó là chấp nhận mất mọi câu nói giữa hai cửa."* **Chỗ cắm hợp lệ của SE — đo được, có hai ứng viên:** | Ứng viên | Có luôn được nạp mỗi lượt không? | Bằng chứng | |---|---|---| | `CLAUDE.md` (gốc repo) | ✅ | tự khai *"project instructions, checked into the codebase"*, nạp mọi lượt | | `.claude/auto-memory/MEMORY.md` | ✅ | tự khai *"user's auto-memory, persists across conversations"*, nạp mọi lượt | | `.claude/commands/*.md` | ❌ **CẤM** | đúng thứ hub cấm — chỉ đọc khi tới cửa | ⇒ Hai kỷ luật (**ghi NGAY** · **tra sổ TRƯỚC khi hỏi**) phải cắm vào một trong hai tệp trên. A3 còn đòi tìm được luật *tra-sổ* ở **tối thiểu hai chỗ**: tệp luôn nạp **và** tài liệu hướng dẫn nội bộ của đội (SE: `docs/rules.md`). **Định nghĩa A5 phải viết kèm, không được ghi chung chung** (hub `Phần C:300`): *hỏi lại mà **không viện dẫn được thông tin mới nào** là vi phạm; hỏi lại **kèm thông tin mới và trích được nguồn** là kỷ luật đúng.* SE có họ hàng nhưng **chưa thành văn** — N1 khai `grep "viện dẫn"` auto-memory = **0 hit**, N2 tái lập bằng ripgrep, control-dương `How to apply` = **48/61 tệp** ⇒ 0-hit này **đứng**. --- ## §E — GĐ-3: ba món N1 nêu thiếu — bóc từng món, và SE dựng thế nào cho khớp nghi thức hai đầu đang chạy ### E.1 — Món 1: **bốn nhãn**, mỗi nhãn một vị từ kiểm được trên đĩa Chữ hub (`phụ lục:189-192`), bóc thành bốn dòng: | Nhãn | Định nghĩa hub | Vị từ đĩa đề xuất cho SE | SE đã có mảnh nào? | |---|---|---|---| | **quên** | không có dấu vết ý định nào | tệp mốc của bước **vắng** **và** không có dòng khai nào trỏ tới bước đó | 🟡 `closeout-sentinel` M5 bắt *"audit đo rồi như chưa đo"* | | **tự ý bỏ** | bỏ mà không khai, **hoặc** khai "bỏ êm" trong khi điều kiện cho phép bỏ **đánh giá lại trên đĩa là sai** | tệp mốc vắng **và** có dòng khai bỏ, **và** phép kiểm điều kiện chạy lại ra `sai` | ❌ vế thứ hai (đánh giá lại điều kiện) **chưa có máy nào làm** | | **suy giảm hợp lệ** | đặc tả cho phép **và** đã khai đủ bằng chứng | có dòng khai + con trỏ tới đặc tả cho phép | ✅ **CÓ VĂN HOÁ MẠNH** — `nhip-no` in `probe-loi (khong chan)` · khối `ERRATA` trong WAL (3 ERRATA lead tự khai @S180) · `HANDOFF:17` (§C.3) | | **bị chặn** | điều kiện bên ngoài, **có bằng chứng đã tìm cách gỡ** | có dòng khai + con trỏ tới nỗ lực gỡ | 🟡 có văn hoá, chưa có khuôn | 🔴 **Chỗ SE giàu hơn nhưng KHÁC TRỤC — phải khai, không được nhận vơ:** SE có taxonomy **AS-signature 20 mã** trong error-ledger. Nhưng đó là **chữ ký hành động** (làm gì sai), còn bốn nhãn của hub là **nhãn ý định** (vì sao lệch). Hai trục **không thay thế nhau**. Ánh xạ được một phần: *quên* ↔ `E-011`/`AS-15` (*nghi thức chạy tắt*). ⇒ **dựng bốn nhãn là việc mới**, không phải đổi tên cái cũ. **Cách dựng khớp nghi thức hai đầu đang chạy:** bốn nhãn là **giá trị của một cột** trong bảng vòng-hỏi-ngược (§E.2), và cặp `lead-stale-auditor` + `lead-gap-auditor` — vốn **đã spawn vô điều kiện ở cả hai đầu** (`session-start.md:269` + `session-end.md:119`) — là chỗ tự nhiên để sinh ra bảng đó. **Không cần đẻ vai mới cho món này.** ### E.2 — Món 2: **vòng hỏi ngược**, đóng khi không còn dòng trống Chữ hub (`phụ lục:196`): bảng năm cột — *bước thiếu hoặc lệch · đặc tả nói gì · bằng chứng trên đĩa · nhãn nào · câu hỏi đích danh*; người điều phối **định đoạt từng dòng**; **không dòng nào trống thì mới đóng được**. - **SE đã có gần nhất:** *bảng disposition từng dòng* (memory `feedback_meta_count_selfcoverage_blindspot` — bài học S119: *"'vá 19 finding' khi thật 23 = con số đóng vai đã-phủ-hết ⇒ bảng disposition TỪNG DÒNG thay số tổng"*). 🔴 **Đây là hội tụ độc lập rất mạnh**: luật đóng của hub (*không dòng nào trống*) và bài học S119 của SE (*từng dòng, không dùng số tổng*) là **cùng một phát hiện**, tìm ra ở hai nơi khác nhau. - **SE thiếu:** khuôn năm cột cố định + **luật đóng cơ khí hoá**. Hiện là nghi thức, chưa có máy. - **Cách dựng khớp:** cột *đặc tả nói gì* phải trỏ **chính tệp lệnh của cửa đó** (hub `:194` ràng: nguồn đối chiếu là đặc tả trong tệp lệnh, và **đặc tả tự mâu thuẫn thì gắn cờ xung đột trả người điều phối, cấm tự phán**). SE có tiền lệ đúng luật này: memory `feedback_edit_must_predate_review` ghi *"spec tự-mâu-thuẫn → fix-mới thắng footer-cũ **+ khai trong report**"* — tức SE đã từng gặp và đã xử đúng hướng. ### E.3 — Món 3: **thang mã thoát bốn trạng thái** Chữ hub (`phụ lục:200`): *trọn · thiếu-có-tên · không-xác-định · đặc-tả-xung-đột*; *"Gộp chúng thành một mã là mất thông tin ngay tại chỗ cần nhất."* - **SE đo được:** thang này **không tồn tại ở bất kỳ máy nào**. Nhưng §A.2 cho thấy SE **đã có sẵn mã thoát phân biệt** ở nhóm fail-loud: `h24-signal-write` dùng **2 và 3** cho hai loại lỗi khác nhau; `session-scaffold` dùng **3/4/5** cho ba nguyên nhân khác nhau; `session-counter-tick` dùng **42**. ⇒ **văn hoá mã-thoát-có-nghĩa đã có**, chỉ chưa chuẩn hoá thành một thang chung. - **Cách dựng khớp:** thang bốn trạng thái này là thứ **phụ thuộc trực tiếp vào phương án anh chọn ở §A.6**. Với PA-3 thì thang nằm ở **dòng in**; với PA-1/PA-2/PA-4 thì nằm ở **mã thoát**. 🔴 **Không thi công món này trước khi anh chốt §A.6** — làm trước là làm lại. ### E.4 — Ba món khác của GĐ-3 mà N1 **không** liệt vào nhóm thiếu, lane C bổ sung - **PL3-(vii) guard vắng tệp phải là vị từ máy** — N2 F-07a đã bắt N1 bỏ sót. Lane C xác nhận và bổ sung: SE **giàu vị từ đĩa**, đây là khoản dễ khai tương đương (`Test-Path` rải khắp; `distill-shard-probe.ps1:23` là mẫu chuẩn: *"khong thay memory-budget.json -> probe-loi (khong chan)"*). - **TC3-L8 trần chi phí cho cửa hay dùng** — SE **KHÔNG ĐO ĐƯỢC** (khớp TC-10 của chính hub). Doctrine SE: *"đo BYTE, CẤM quy token"* (S158). Nếu adopt thì trần = **hướng dẫn + nghĩa vụ khai khi vượt**, đúng chữ hub `:185` (*"Không có dụng cụ đo thì khai KHÔNG ĐO ĐƯỢC, đừng in số bịa"*). - **TC3-L5 tiền kiểm ở đầu MỌI cửa** — 🔴 **ĐO XONG, và kết quả xấu hơn N1 tưởng.** Xem §E.5. ### E.5 — 🔴 ĐO: "tiền kiểm ở đầu MỌI cửa" — SE phủ **4/19 cửa**, không phải "gần đủ" Phép đo (liệt từng cửa, đúng luật A4 *cấm ghi gộp*): `ls -1 .claude/commands/*.md | wc -l` = **19 cửa**. Đếm dấu vết tiền kiểm mỗi cửa bằng `grep -c "nhip-no-probe\|Sàn-3\|san-3\|tiền kiểm\|probe"`: | Cửa | hit | Có tiền kiểm thật? | |---|---|---| | `session-start.md` | 19 | ✅ | | `session-end.md` | 12 | ✅ | | `tiep.md` | 10 | ✅ | | `pause.md` | 4 | ✅ | | `sleep-recovery-memory-l2.md` | 2 | 🟡 CHƯA ĐO — hit có thể là nhắc chữ, không phải lời gọi | | `check-email.md` | 2 | 🟡 CHƯA ĐO — như trên | | `snapshot.md` | 1 | 🟡 CHƯA ĐO — như trên | | `adap-apply.md` · `adap-report.md` · `adap-request.md` · `fable-real.md` · `fable-clone.md` · `send-email.md` · `ultra-on.md` · `ultra-off.md` · `user-mark-active.md` · `user-mark-active-high.md` · `user-mark-medium.md` · `user-mark-disable.md` | **0** | ❌ **KHÔNG** | ⇒ **Chắc chắn có: 4 cửa. Chắc chắn không: 12 cửa. Cần đo thêm: 3 cửa.** Con số để báo cáo là **4/19 chắc chắn**, cận trên **7/19** nếu 3 cửa kia hoá ra có thật. 🔴 **Ca `LỚP-2` (thợ rèn không có dao) — xảy ra NGAY TRONG LƯỢT NÀY:** cửa `/adap-apply` — **chính cửa đang được dùng để áp gói tài liệu này** — có **0 tiền kiểm**. Tức lượt áp một gói quy trình đòi *"tiền kiểm ở đầu mọi cửa"* lại đi qua một cửa không có tiền kiểm nào. Ghi vào báo cáo như một ca thật của lớp lỗi số 2, không phải như lời tự trách. 🔸 **Khai giới hạn của thước:** đây là phép đo **sự hiện diện của chuỗi ký tự**, không phải phép đo *lời gọi có chạy không*. Ba cửa có hit 1-2 cần mở ra đọc mới kết luận được. Không suy 1 hit thành "có tiền kiểm". --- ## §F — Bóc TỪNG KHOẢN GĐ-3 (8 bước thư chính × 8 khoản phụ lục) > Mã kép: `TC3-L` = bước n của `thu-chinh:178-185` · `PL3-(x)` = khoản (x) của `phu-luc:187-208`. Hai nguồn **không ánh xạ 1-1** — ghi rõ chỗ lệch. | # | Khoản | Nguồn | Trạng thái SE | Bằng chứng `file:line` | |---|---|---|---|---| | **C3-01** | Bốn nhãn lệch nghi thức, mỗi nhãn một vị từ đĩa | `TC3-L1` + `PL3-(i)` | **THIẾU** (có văn hoá cho nhãn *suy-giảm-hợp-lệ*) | §E.1 · `WAL.md` khối `ERRATA` · `nhip-no-probe.ps1:10-11` | | **C3-02** | Vai kiểm **chỉ đối chiếu, không phán đặc tả**; đặc tả tự chỏi ⇒ gắn cờ xung đột trả người điều phối | `TC3-L2` + `PL3-(ii)` | **NỬA** — có vai kiểm hai đầu, nhưng ràng buộc *cấm phán đặc tả* **chưa thành văn** | `session-start.md:269` · `session-end.md:119` · tiền lệ xử đúng: memory `feedback_edit_must_predate_review` | | **C3-03** | Vòng hỏi ngược 5 cột, **đóng khi không dòng nào trống** | `TC3-L3` + `PL3-(iii)` | **THIẾU khuôn** — có họ hàng *bảng disposition từng dòng* (S119) | §E.2 | | **C3-04** | Cổng chặn bằng mã lỗi, **thang 4 trạng thái** | `TC3-L4` + `PL3-(v)` + `PL3-(viii)` | 🔴 **NGƯỢC** — xung đột 1, xem §A | `governance-detectors.ps1:1962` | | **C3-05** | Tiền kiểm chi phí 0 ở **đầu MỌI cửa**, chỉ đọc, soi cửa đóng gần nhất, chọn cửa bằng **dấu thời gian TRONG tệp** | `TC3-L5` + `PL3-(iv)` | **NỬA** — cơ chế neo **ĐÚNG NGUYÊN VĂN hub**, nhưng phủ **4/19 cửa** | §E.5 · carrier-commit `git log --diff-filter=A -1 -- ` (S158, 8/8 resolve) | | **C3-06** | Vai kiểm chạy ở **cả hai đầu** phiên | `TC3-L6` + `PL3-(iv)` vế sau | ✅ **CÓ — ĐÚNG NGUYÊN VĂN** | `session-start.md:269` + `session-end.md:119`, spawn **vô điều kiện**, HÌNH B @S149 | | **C3-07** | Luật **tự trị ba bậc** khi anh vắng, đặt ở chỗ điều phối chắc chắn đọc | `TC3-L7` + `PL3-(vi)` | **THIẾU nội dung** — hạ tầng có, ruột không | xem §F.1 | | **C3-08** | Trần chi phí cho cửa hay dùng + nghĩa vụ khai khi vượt | `TC3-L8` | **KHÔNG ĐO ĐƯỢC** (khớp TC-10 hub) | doctrine *"đo BYTE, cấm quy token"* (S158) | | **C3-09** | **Guard vắng tệp phải là vị từ máy**, cấm dùng mệnh đề *"cái đó chưa làm"* | `PL3-(vii)` — **không có bước tương ứng ở thư chính** | ✅ **CÓ mạnh** — khai tương đương được | `distill-shard-probe.ps1:23` · `mfe-eval.ps1:45` · `memory-archive-gate.ps1:40-41` | | **C3-10** | Khai thẳng ranh giới: máy đo **sự hiện diện và khuôn dạng, không đo CHẤT** | `PL3` kết (`:208`) — **không có bước tương ứng** | ✅ **CÓ văn hoá mạnh** | `governance-detectors.ps1:1962` *"FLAGs are advisory"* · `spawn-model-audit.ps1:140` *"INFORMATIONAL"* | **⇒ GĐ-3: 10 khoản.** Có 3 · Nửa 3 · Thiếu 3 · Ngược 1. 🔴 **Lệch đánh số giữa hai nguồn — ghi để người thi công không trỏ nhầm** (mở rộng N2 F-07b): thư chính có **8 bước**, phụ lục có **8 khoản**, nhưng **không phải 8↔8**. `PL3-(vii)` và câu kết `:208` **không có bước nào ở thư chính**; ngược lại `TC3-L8` (trần chi phí) **không có khoản nào ở phụ lục**. Ai dò theo số khoản của một nguồn sẽ mất 2 khoản. ### F.1 — Đo `C3-07`: luật tự trị ba bậc — hạ tầng CÓ, ruột KHÔNG N1 để mục này ở dạng *"CHƯA ĐO"*. Lane C đo xong: - **Hạ tầng:** `.claude/governance/ACTIVE-MARKS.md` tồn tại, **31.197 B**, có **19** dấu vết `RC-pqhuy1987|ACTIVE|mã dấu` ⇒ cơ chế mark sống thật. - **Ruột ba bậc:** đếm từng vế trên chính tệp đó — `bậc` = **1 hit** (và hit đó là chuỗi *"bậc-MẠNH"*, **không phải** luật tự trị) · `tự vá` = **0** · `an toàn` = **0** · `mơ hồ` = **0** · `phá huỷ` = **0** · `phá hủy` = **0** · `tự trị` = **0** · `vắng` = **0**. - **Control-dương cho thước:** cùng tệp, mẫu `RC-pqhuy1987|ACTIVE|mã dấu` = **19 hit** ⇒ thước đọc được tiếng Việt có dấu và có bắt. 0-hit ở trên **không phải thước hỏng**. ⇒ **Kết luận: `ACTIVE-MARKS.md` là cơ chế uỷ quyền theo từng quyết định, KHÔNG phải luật tự trị ba bậc.** Hai thứ khác nhau: mark trả lời *"anh đã cho phép việc X chưa"*; luật ba bậc trả lời *"anh vắng, gặp việc CHƯA có mark thì làm gì"*. Cái thứ hai SE **không có**. 🔴 **Cảnh báo nguồn-đôi ngay tại đây (§F.2 dưới):** luật tự trị ba bậc bị **hai giai đoạn cùng đòi** — `C3-07` đòi nó ở *"chỗ người điều phối chắc chắn đọc"*, và GĐ-4 mục mồi `ST-002` đòi nó **trong sổ**. Xây hai lần = đẻ đúng thứ xung đột 2 đang cố tránh. ### F.2 — 🔴 KIỂM LẠI MỆNH ĐỀ OD-2 "GĐ-4 độc lập GĐ-3" — đề bài dặn đừng nhận suông, và đúng là có lỗ **Vế ĐÚNG:** hub `thu-chinh:197` nguyên văn — *"Giai đoạn này **độc lập với GĐ-2, GĐ-3 và GĐ-5**"*. Về **điều kiện vào**, GĐ-4 chỉ đòi GĐ-1. ⇒ *cổng-mã-lỗi treo ở §A không chặn điều kiện vào của GĐ-4* — **mệnh đề này đứng**. **Ba lỗ đo được, đề bài dặn kiểm và kiểm ra thật:** 1. 🔴 **Trùng VẬT, không chỉ trùng vùng:** `C3-07` (luật tự trị ba bậc) và `ST-002` (mục mồi *tự trị khi anh vắng*) là **cùng một luật**, bị hai giai đoạn đòi ở **hai đích ghi khác nhau**. Làm GĐ-4 trước rồi GĐ-3 sau mà không nối, SE sẽ có **hai bản luật tự trị trôi khỏi nhau** — đúng bệnh nguồn-đôi. **Thuốc:** một bản là NGUỒN, bản kia **trỏ** (luật B1 của SE: *derived trỏ canonical, cấm chép*). 2. **Trùng VÙNG CHẠM:** `C3-05`/`C3-06` sửa `session-start.md` · `session-end.md` · `tiep.md` · `pause.md`; GĐ-4 bước 7 (đèn nợ mọi cửa) và bước 9 (khối chấm điểm hai cửa) sửa **đúng bốn tệp đó**. Chạy W3 và W4 **song song** = xung đột sửa cùng tệp. Không phải lỗi logic, là lỗi lập lịch — nhưng N4 phải biết. 3. **Trùng ĐÍCH CẮM:** `C3-07` đòi cắm ở *"chỗ điều phối chắc chắn đọc"*; GĐ-4 bước 4/5 đòi cắm hai kỷ luật vào *"tệp luôn được nạp mỗi lượt"*. Với SE **hai mô tả này trỏ cùng tập tệp** (`CLAUDE.md` / `auto-memory/MEMORY.md`, §D.3) ⇒ hai wave cùng sửa một tệp. ⇒ **Kết luận về OD-2:** *"GĐ-4 độc lập GĐ-3"* **đúng ở trục điều-kiện-vào**, **sai nếu đọc thành "hai wave chạy song song không đụng nhau"**. Khuyến nghị cho N4 (không phải quyết định): W3 và W4 **không xếp song song**, và bên nào chạy trước phải **chốt đích ghi của luật tự trị** cho bên kia trỏ về. --- ## §G — Bóc TỪNG KHOẢN GĐ-4 (9 bước thư chính × 7 khoản phụ lục) > Mã kép: `TC4-L` = bước n của `thu-chinh:199-207` · `PL4-(x)` = khoản (x) của `phu-luc:238-266`. | # | Khoản | Nguồn | Trạng thái SE | Bằng chứng | |---|---|---|---|---| | **C4-01** | Sổ **ba khối** ở lane quản trị; cột lời nguyên văn có **trần ký tự cứng** | `TC4-L1` + `PL4-(i)` | **THIẾU** (khối 3 trống tuyệt đối) | §D.1 · 0-hit `sở-thích\|phàn nàn`, control *"điểm dừng"*=5 tệp | | **C4-02** | **Mã định danh vĩnh viễn, cấm tái dụng**; đóng thì lật trạng thái, **không xoá dòng** | `TC4-L2` + `PL4-(ii)` | 🔴 **NGƯỢC — SE đang tái dụng chỉ số** | `HANDOFF:10-17` đánh số `1..7` **lặp lại mỗi phiên**; SE đã trả giá: memory `feedback_absence_looks_like_clean` | | **C4-03** | **Hai mục mồi** ở khối sở thích, kèm **liệt kê lằn ranh đỏ** | `TC4-L3` + `PL4-(iii)` | **THIẾU chỗ chứa** — nguyên liệu có, chưa liệt kê một chỗ | §D.1 · lằn ranh rải trong 61 tệp auto-memory | | **C4-04** | Kỷ luật **ghi NGAY**, cắm vào **tệp luôn nạp**, **cấm cắm vào tệp lệnh** | `TC4-L4` + `PL4-(iv)a` | **THIẾU** — chỗ cắm hợp lệ tồn tại, luật chưa có | §D.3 | | **C4-05** | Kỷ luật **tra sổ trước khi hỏi**, ở **hai chỗ**; + định nghĩa A5 | `TC4-L5` + `PL4-(iv)b` | **THIẾU** | `grep "viện dẫn"` auto-memory = 0 (control `How to apply` = 48/61) | | **C4-06** | **Lượt dò không tốn phí**: trả *đang treo* + *nhắc từ lần 2*; phân biệt **chưa-có-dữ-liệu ⟂ đo-và-bằng-0**; hỏng thì in dấu hỏi; **không bao giờ chặn** | `TC4-L6` + bẫy-1 | 🟢 **KHUNG ĐÃ CÓ VÀ KHỚP TỪNG CHI TIẾT — chỉ thiếu dữ liệu nguồn** | `nhip-no-probe.ps1:10-11,:49,:230` — read-only, exit-0, luôn in, lỗi in `probe-loi (khong chan)`, `CONFIG-THIEU` không tự chế mặc định | | **C4-07** | **Đèn nợ ở MỌI cửa dừng**: thứ tự trường cố định · mọi trường luôn in · số **dán nguyên văn từ máy dò, cấm gõ tay** | `TC4-L7` + `PL4-(v)` + bẫy-2 | **NỬA** — có ở **4/19 cửa** | `session-start.md:269` · `session-end.md:118` · `tiep.md:154` · `pause.md:113` — cả 4 in *"probe KHÔNG chặn"* | | **C4-08** | **Vai đọc sổ độc lập, bốn thấu kính** + **vai soi lại vai này**; nhịp ba cửa, **trong lượt KHÔNG chạy vai này** | `TC4-L8` + `PL4-(vi)` | **THIẾU vai** — có vai soi-vai họ hàng | `ring2-audit` · cặp `lead-stale`/`lead-gap` | | **C4-09** | **Thu hẹp vai cũ cùng lượt**, ghi rõ phần chuyển giao | `TC4-L8` vế sau + `PL4-(vii)` | **CHƯA ĐO** — cần `grep -rln "yêu cầu của anh\|lời anh\|owner-request" .claude/agents/*.md` + control-dương | — | | **C4-10** | Áp **luật chấm điểm** (món 4); in khối chấm ở **cả hai cửa phiên** | `TC4-L9` | 🔴 **VẮNG HOÀN TOÀN** | §H | | **C4-11** | **Cấm đổ nhãn-của-đội vào cột nguyên văn**, đưa vào phụ lục riêng | `PL4` bẫy-5 + `A1` — **không có bước tương ứng ở thư chính** | ✅ **SE KHÔNG mắc** — và mạnh hơn hub | §C | | **C4-12** | **Đường ghi lại khi chấm sai**: xác định *tầng nào sai* · nhãn lớp lỗi riêng · ghi vào nhật ký vai đã sai; lớp lỗi sống ở **sổ lỗi**, **cấm** nhét vào tập tín hiệu của máy cảnh báo | `A10` + `luat:104-106` | **NỬA MẠNH** — vế *phép thử* SE **có máy thật**, vế *quy trình* chưa thành văn | `h24-signal-write.ps1` từ chối class ngoài enum (exit 2/3) + `_frozen_until_owner`; error-ledger = đúng chỗ hub chỉ | **⇒ GĐ-4: 12 khoản.** Có 2 · Nửa 3 · Thiếu 5 · Ngược 1 · Chưa đo 1. 🔴 **Phép thử A10 chạy được NGAY HÔM NAY, không cần xây gì:** hub đòi *"thử đẩy lớp nhãn mới vào máy cảnh báo — nó **phải từ chối**"*. SE có `h24-signal-write.ps1` với enum đóng + thông điệp *"a monitor may NOT invent a class"* + exit 2. Đây là **khoản GĐ-4 duy nhất SE có thể tick ngay với bằng chứng chạy được**, nên đưa vào wave đầu để có ít nhất một ô xanh có thật. --- ## §H — `luat-cham-diem` bóc theo **4 tầng chấm** + **3 mốc niêm phong** (luật ĐÃ KÝ, áp thẳng) ### H.1 — Phạm vi BẤT BIẾN: dùng `:140`, KHÔNG dùng câu tóm `:23` Khối chữ ký `:140` liệt **5 khoản** bất biến: *công thức · **nguồn đếm** · bốn tầng · ba mốc niêm phong · **đường ghi lại khi chấm sai***. Câu tóm ở `:23` chỉ nhắc 3 khoản (công thức · ba mốc · ranh giới tầng). N2 F-08 bắt đúng: thiết kế theo `:23` sẽ tưởng *nguồn đếm* là hình thức đổi được — trong khi nó **đã ký**. 🔴 **Lane C xác nhận và nhấn mạnh: chính khoản "nguồn đếm" là khoản đẻ ra xung đột 2** (§B). Đọc nhầm phạm vi ⇒ tưởng có thể né xung đột bằng cách đổi nguồn đếm. **Không né được.** Cái được đổi: tên trường · cách trình bày · chỗ đặt tệp (`:23`). ### H.2 — Công thức > **điểm = max(0, 10 − số MỤC bị lặp từ lần thứ hai trở lên)** (`:49`) Ba cách đọc bắt buộc (`:53-55`), thiếu một là áp sai: 1. **MỤC** = một mã yêu cầu **hoặc** một chủ đề phàn nàn — **không phải một lần nói**. 2. Lặp năm lần cùng một mục **vẫn chỉ trừ một**. 3. Nhắc **một lần thì không trừ**. Điểm sàn 0, không bao giờ âm (`:57`). Nghiệm thu đòi thử một ca lặp nhiều lần cho ra **trừ đúng một** (`:120`). 🔴 **Hệ quả cho SE, đo được:** công thức chỉ cần **số MỤC bị lặp ≥2**. Nó **không cần** cột *trạng thái*. ⇒ **xung đột 2 (§B) không chặn việc chấm điểm** — chấm được ngay cả khi chưa chốt ranh sổ⟂WAL. Đây là một đường tách wave có thật cho N4. ### H.3 — Nguồn đếm (khoản đẻ ra xung đột 2) - `:63` — *"**Cuốn sổ là đường ghi chính**, vì nó được ghi ngay trong lượt trao đổi."* - `:64` — dòng hội thoại là **gương bắt buộc**: mọi mục có lời nguyên văn **phải** có khối trích tương ứng để đối chiếu với bản ghi phiên. - `:65` — hub đo thật và thấy dòng hội thoại của mình **rất thưa** ⇒ *"một máy chấm chỉ đọc dòng hội thoại sẽ **luôn cho điểm tuyệt đối**"*. Hub tự gọi đây là lớp *"bộ dò sinh ra để chống X lại tự đẻ ra X"*. - `:66` — **chưa có số phủ sóng thì in `KHÔNG ĐO ĐƯỢC`, CẤM in điểm.** Số phủ sóng = tỉ lệ tin của anh đã được bắt vào dòng hội thoại trên tổng số tin thật. - `:67` — máy dò phải **loại các dòng mẫu trống** khỏi phép đếm. 🔴 **SE ở đâu:** **KHÔNG ĐO ĐƯỢC** số phủ sóng, và **CHƯA ĐO** cả việc SE có "dòng hội thoại" theo nghĩa hub hay không — cần: `ls .claude/**/transcript*` hoặc xác định vật tương đương. ⇒ Theo đúng luật `:66`, **khối chấm điểm đầu tiên của SE phải in `KHÔNG ĐO ĐƯỢC`, không được in số**. Đây là ô **duy nhất đúng** cho phiên đầu — in một con số 10/10 là vi phạm luật đã ký, và cũng là *"đèn xanh đầu tiên của sổ mới là đèn giả"* (bẫy-1 GĐ-4). ### H.4 — Bốn tầng chấm (`:73-80`) | Tầng | Ai | Làm gì | Ranh giới CỨNG | SE có vai chưa? | |---|---|---|---|---| | **1** | người điều phối (lead) | tự chấm ở **cửa đóng phiên** | chấm **TRƯỚC** khi đọc kết quả tầng 2 | ✅ có người, ❌ chưa có nghi thức | | **2** | **vai đọc sổ độc lập** | đếm lại độc lập, so lệch **TỪNG MỤC** | **không xem điểm tầng 1** trước khi đếm xong | ❌ **chưa có vai** — VƯỢT-KHUNG | | **3** | **vai soi độc lập** | **kiểm PHÉP ĐẾM, không chấm lại** | 🔴 **CẤM đề xuất một điểm khác** | 🟡 `ring2-audit` họ hàng gần | | **4** | **anh** | quyết cuối | im lặng có điều kiện = xác nhận, **chỉ khi đủ 3 mốc** | — | `:80` — *"Cho tầng ba chấm lại là biến nó thành một tầng hai thứ hai, và thế là mất hẳn lớp kiểm."* **Dòng tổng kết ghi vào sổ phiên** (`:82`) phải có: **điểm cuối · giá trị của cả ba tầng đầu · trạng thái niêm phong · liệt kê TỪNG MỤC bị lặp kèm mã**. Không có mục nào thì ghi thẳng *"danh sách rỗng"* — **cấm gộp danh sách thành khoảng**. 🔴 **Hội tụ độc lập đáng ghi:** ranh giới tầng-2 (*"không xem điểm tầng 1 trước khi đếm xong"*) là **đúng liều thuốc** cho bệnh SE đã tự chẩn ở memory `feedback_meta_count_selfcoverage_blindspot` — *"lead ĐO tốt (~80% đúng) nhưng ĐẾM-VỀ-MÌNH sai (~13%), tập trung trọn ở meta-count/coverage"*. Lead tự chấm phiên của chính mình **chính là** meta-count về mình. ⇒ tầng 2 không phải thủ tục thừa, nó vá một lỗ SE đã đo được. Ghi vào báo cáo như **lý do adopt**, không phải như nghĩa vụ. ### H.5 — Ba mốc niêm phong (`:86-98`) — thiếu một là **nhãn không phản bác được** | Mốc | Tên trường gợi ý | Nội dung | |---|---|---| | **1** | `emit_ts` | thời điểm **điểm được phát ra** | | **2** | `redisplay_ts` | thời điểm điểm được **hiển thị lại** ở cửa anh chắc chắn đọc | | **3** | `first_owner_msg_ts` | thời điểm **tin đầu tiên của anh SAU lần hiển thị lại** | **Điều kiện hợp lệ (`:94`):** mốc 3 đến **SAU** mốc 2, **VÀ** tin ở mốc 3 **không nhắc gì tới điểm**. **Thiếu mốc 3 ⇒ trạng thái là *chờ niêm phong*** — **không phải** *đã niêm phong* — **và cũng không đẩy vào hàng chờ của anh** (`:96`). `:98`, đáng chép nguyên si: *"'chủ dự án đã thấy mà không nói gì' khác hẳn 'chủ dự án chưa thấy'. Không có ba mốc thì hai trạng thái đó **trông y hệt nhau**."* 🔴 **Đây là bài học SE đã có tên riêng:** memory `feedback_absence_looks_like_clean` — *"vắng-mặt trông giống ổn"*. Cùng một lớp lỗi, hai nơi tìm ra độc lập. Mốc 2 được hub chỉ định thực hiện **ngay tại khối chấm ở cửa mở phiên** (`:114`). ### H.6 — Chỗ hiển thị (`:110-114`) In khối chấm điểm ở **cửa mở phiên** và **cửa đóng phiên**. Ở cửa mở phiên, khối này **THAY THẾ** nghi thức cũ kiểu *"hỏi anh chấm mấy điểm"* — vì chính nghi thức đó là nguyên nhân bệnh TC-12. 🔴 **SE đặc thù, phải khai với hub:** SE **không có nghi thức cũ để thay thế** — `grep -rn "chấm điểm" .claude/commands/*.md` = **0 hit** (N1 đo; control-dương *"điểm dừng"* = 5 tệp, N2 sửa số). ⇒ với SE đây là **dựng mới**, không phải thay thế. **TC-12 ở SE nặng hơn ở hub**: hub có điểm nhưng bị treo; SE **chưa từng sinh ra một điểm nào**. ### H.7 — Đường ghi lại khi chấm sai (`:102-106`) Khi anh điều chỉnh điểm: ghi **phân tích nguyên nhân ngắn xác định TẦNG NÀO SAI** · gắn nhãn lớp lỗi **"chấm sai"** · ghi một dòng vào **nhật ký của vai đã sai**. 🔴 Ràng buộc cứng (`:106`): *"Lớp lỗi 'chấm sai' sống ở **SỔ LỖI**, cấm nhét vào **tập tín hiệu đóng** của máy cảnh báo. Tập đó nuôi bộ đếm ngưỡng; thêm một lớp vào đó là **đổi ngữ nghĩa của cả bộ đếm** mà không ai nhận ra. Muốn có nhịp đếm thì dùng lớp gom sẵn có, hoặc trình chủ dự án xin mở tập tín hiệu — **không tự mở**."* **SE khớp sẵn:** `h24-signal-write.ps1` = tập tín hiệu đóng **có máy canh thật** (exit 2 khi class ngoài enum); `error-ledger` = sổ lỗi, đúng chỗ hub chỉ. ⇒ chỉ cần **viết quy trình thành văn**, không cần xây máy. Khoản rẻ. ### H.8 — Tám ô nghiệm thu của luật (`:120-127`) — trạng thái SE hôm nay | # | Ô nghiệm thu | SE hôm nay | |---|---|---| | 1 | Công thức thành văn + thử ca lặp nhiều lần ra **trừ đúng một** | ❌ chưa có | | 2 | Hai hệ đo (trải nghiệm ⟂ kỹ thuật) ở **hai chỗ khác nhau**, không có chỉ số tổng trộn | 🟢 **SE thuận sẵn** — mọi phép đo hiện có đều là kỹ thuật; hệ trải nghiệm chưa tồn tại nên **không có nguy cơ trộn**, chỉ cần đặt đúng chỗ ngay từ đầu | | 3 | Dòng tổng kết đủ: điểm cuối · 3 giá trị tầng · trạng thái niêm phong · **liệt từng mục kèm mã** | ❌ | | 4 | Ba mốc có mặt ở phiên gần nhất; mốc 3 sau mốc 2 | ❌ | | 5 | Thiếu mốc 3 ⇒ in *chờ niêm phong* | ❌ | | 6 | Chưa có phủ sóng ⇒ in `KHÔNG ĐO ĐƯỢC`, **không in điểm** | ❌ — nhưng đây là ô **SE phải tick đầu tiên** (§H.3) | | 7 | Lớp *"chấm sai"* ở sổ lỗi; đẩy vào máy cảnh báo thì **máy phải từ chối** | 🟢 **phép thử chạy được NGAY** — `h24-signal-write.ps1` | | 8 | Khối chấm hiện diện ở **cả hai cửa phiên** | ❌ | **⇒ 2/8 ô SE có thể chạm ngay (ô 2 · ô 7), 6/8 phải dựng.** --- ## §I — VƯỢT-KHUNG: liệt từng khoản, gắn nhãn, KHÔNG tự quyết Đề bài báo *"2 trong 4 khoản vượt-khung của N1 nằm ở lane này"*. Lane C đo lại: **đúng 2 khoản của N1 nằm ở đây, và lane C tìm thêm 3 khoản nữa**. | # | Khoản | Vì sao vượt khung | Cần ai | |---|---|---|---| | **VK-1** *(N1 (a))* | Đổi doctrine exit-0 → cổng chặn | Đổi **cơ chế đang sống** ở 9 máy + 4 cửa; 49 cờ đang mở | **anh** chọn PA-1/2/3/4 (§A.6); nếu chọn PA-3 thì **báo hub** vì là *làm khác* | | **VK-2** *(N1 (c))* | Sổ 3 khối = artifact mới cạnh WAL | Nguy cơ nguồn-đôi; PB-2 còn đòi **sửa luật đã ratify** `tiep.md:181` + `pause.md:117` | **anh** chọn PB-1/2/3 (§B.5) | | **VK-3** *(lane C thêm)* | **Đẻ vai đọc sổ** (tầng 2) + **gán vai tầng 3** | Đụng roster + `hmw.js` VALID_ROLES + GĐ-6 điều-kiện-vào-danh-sách **trọn gói một commit**; và *"thu hẹp vai cũ cùng lượt"* là **rút bớt quyền của vai đang chạy** | **anh** | | **VK-4** *(lane C thêm)* | **In khối chấm điểm ở hai cửa phiên** | Sửa nghi thức `session-start.md` + `session-end.md` — nghi thức hai đầu là **vật anh đã chốt**; luật hub miễn *chữ ký hub* (`luat:133`) nhưng **không miễn quyền anh với nghi thức nhà mình** | **anh** | | **VK-5** *(lane C thêm)* | **Ngoại lệ nhập bảng `HANDOFF:10-17` vào sổ** (§C.5 khoản 3) | Là **ngoại lệ đầu tiên** của luật *cấm đổ dữ liệu cũ vào cột nguyên văn*; mọi ngoại lệ sau sẽ viện nó làm tiền lệ | **anh** | 🔴 Lane C **không quyết khoản nào trong năm khoản trên**. Trình phương án + đánh đổi là hết phần việc của lane C. --- ## §J — Khoản gửi ngược hub (đề xuất — cần anh duyệt trước khi gửi) 1. **Thang mã thoát cần điều kiện tiên quyết về nơi đọc mã** — cổng chặn đặt ở chỗ mã thoát bị nuốt sẽ biến thành **dừng câm**, và dừng câm trông giống hệt chạy-xong-sạch. Bằng chứng SE: `hmw.js:288` + `:178`. Đây đúng là lớp *"nhãn không phản bác được"* mà hub tự đặt tên ở `luat:98`. (§A.4) 2. **Khối *việc-được-giao* thiếu trường thứ bảy: "đội hiểu thành gì"** — thiếu nó thì lớp lỗi *đội tự thu hẹp phạm vi lệnh* không có chỗ lộ ra. Bằng chứng SE làm mạnh hơn: `docs/HANDOFF.md:17`. (§C.4) 3. **`status: DRAFT` + `reviewer_gate: PENDING` trên cả bốn thư** trong khi `thu-chinh:66` tuyên bản nháp thì không có dấu trạng thái đã duyệt — F-1 của N1, lead đã verify 4/4, hash khớp canonical. Lane C **không đo lại**, chỉ nhắc để mục phản biện không rớt. --- ## §K — Ô CHƯA ĐO còn lại (ghi kèm lệnh, không để trống) | Ô | Lệnh cần chạy | |---|---| | `C4-09` thu hẹp vai cũ — vai nào đang soi phần *yêu cầu của anh* | `grep -rln "yêu cầu của anh\|lời anh\|owner-request\|chờ-anh" .claude/agents/*.md` + control-dương `grep -rlc "FLAG" .claude/agents/*.md` | | §E.5 — 3 cửa hit 1-2 có tiền kiểm thật không | `grep -n "nhip-no-probe\|probe" .claude/commands/check-email.md .claude/commands/snapshot.md .claude/commands/sleep-recovery-memory-l2.md` | | §H.3 — SE có "dòng hội thoại" theo nghĩa hub không, và số phủ sóng | xác định vật tương đương trước; nếu không có thì kết luận **KHÔNG ĐO ĐƯỢC** là đúng chứ không phải thiếu sót | | `C4-01` trần ký tự cột nguyên văn đọc từ tệp cấu hình chung | `grep -n "char_cap\|max_chars\|trần" .claude/agents/memory-budget.json` — khuôn có sẵn (`memory-budget.json`), chưa có khoá cho sổ | --- **END sub-n3-lane-c-gd34** — GĐ-3 **10 khoản** (có 3 · nửa 3 · thiếu 3 · ngược 1) · GĐ-4 **12 khoản** (có 2 · nửa 3 · thiếu 5 · ngược 1 · chưa đo 1) · **5 khoản VƯỢT-KHUNG** · xung đột 1 có **4 phương án**, xung đột 2 có **3 phương án**, lane C **không chọn khoản nào**.