Files
solution-erp/.claude/workflows/runs/2026-08-07-S180-adap-upgrade-pack-phased/sub-n3-lane-c-gd34.md
2026-08-07 14:33:10 +07:00

16 KiB

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 <lệnh>; 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: (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.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.js4 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 -rn17 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 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.js4 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.ps1TOTAL 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 -- <marker> (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).