Files
solution-erp/docs/governance/adap-reports/2026-07-19-Governance-goi-chot-owner-nam-khoan.md

103 lines
15 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.

# adap-report — 2026-07-19-Governance-goi-chot-owner-nam-khoan
> SE (SOLUTION_ERP) · nhóm-B backlog wave S149(+1) · lane L3.
> Thư này có **5 khoản, không phải 4** — chính đợt-11 đã tự bắt lỗi ép-cho-tròn-số ở `C14-disposition-per-khoan.md:4`. Bản này báo theo **TỪNG khoản 4.14.5**, không có dòng tổng.
## 1. id-broadcast
`2026-07-19-Governance-goi-chot-owner-nam-khoan` (type **update**, 5 delta chồng lên 5 bản đã phát · `content_sha256` `c580c56682a5973e9b46de0806de8170ca663fa197bac6f08ff498ee6ce569f5` · `reviewer_gate` PASS-W-FIXES → ALL-FOLDED, falsify 7/7 HELD — đọc từ frontmatter inbox, chưa sha-recompute hôm nay).
## 2. nấc G-011
**executed** cho 4.1 / 4.2 / 4.4 / 4.5; **4.3 = KÉP `executed`(luật) + `verified-pending`(đo)** vì ngưỡng chấm là **owner-SỐ 🔒 chưa đặt**. Không gộp 5 khoản thành một nhãn.
## 3. evidence (đo THẬT — bảng per-khoản 4.14.5)
| # | Khoản (delta hub) | Nấc SE | Bằng-chứng đo được |
|---|---|---|---|
| **4.1** | Lead default = tier thường; model đắt nhất đi qua **2 cửa owner-chủ-động** | **executed** (thực-tế ĐÃ-CÓ từ trước · **nhãn nay đã đóng**) | @S144 khoản này ở trạng-thái KÉP: *thực-tế* ĐÃ-CÓ (`~/.claude/settings.json` pin từ 07-20 — file **global, ngoài git**, không grep được trong repo) nhưng *nhãn canonical* còn nói khác ⇒ `BLOCKED-by-O-5` (`C14-disposition-per-khoan.md:41` + bảng `:72`). **Nhãn đóng bằng #23** — broadcast `2026-07-25-Governance-model-default-opus-5-max`, lead đã áp lớp thi hành trong chính run này (`runs/2026-07-25-S149-adap-backlog/run.md:7`: settings `claude-opus-5[1m]` · 2 key `TIER2_EXPECTED_FULL_ID` + `$OWNER_RATIFIED_TIER2_FULL_ID``claude-opus-5` · BƯỚC 0.6 value-update). **2 cửa owner** của SE = `/fable-real` + `/fable-clone`, per-invocation KHÔNG persist (`CLAUDE.md:25-26`) |
| **4.2** | RETIRE resume-agent cho mục-đích **giữ-model / giữ-context** | **executed (có phạm vi) + khảo sát xong + 1 vế chưa đo** | Đọc đúng phạm vi: retire **chỉ** cho mục-đích giữ-model/giữ-context; **path-2 cứu #53 (resume in-session) KHÔNG bị retire** (`goi-chot:37` — thư ghi resume vẫn hợp-lệ cho *"hội-thoại tiếp-diễn trong cùng lượt làm việc"*). Nghĩa-vụ verify-trên-env-mình (`goi-chot:38`) đã làm: artifact `runs/2026-07-22-S144-adap-dot-11/C15-resume-model-override.md` (tồn tại trên đĩa, đo hôm nay) — kết luận: Agent-tool resume an-toàn; 🔴 **lane workflow có `tier:` override thì PHƠI NHIỄM, CHƯA ĐO** (`C14:42`) |
| **4.3** | Điểm-dừng phải **RẺ** — không cơ-chế nào được chặn/làm-đắt cửa dừngnốicheckpoint | 🔴 **KÉP: executed (luật) · verified-pending (đo) — ngưỡng = 🔒 owner-SỐ, CHƯA ĐẶT** | Luật đã vào spec đợt-11 v2 (P1-5) + acceptance C7 `spec-adap-dot-11-22-07-2026-v2.md:115`, trong đó **bỏ tiêu-chí "ghi số"** vì nó PASS ở mọi giá trị và ghi thẳng *"Ngưỡng = O-gated"*. **Đo lại đường dừng hôm nay:** `.claude/commands/pause.md:89` VẪN gọi `powershell.exe … scripts/nhip-no-probe.ps1` trong đường `/pause` — nhưng cùng dòng khai *"probe KHÔNG chặn điểm dừng: lỗi → in `probe-loi (khong chan)` → đi tiếp"* (fail-open). Và bước mới `(D) AUTO-SNAPSHOT` `pause.md:44-46` **có đo trước khi wire**, trích đúng câu hub bắt hỏi (`goi-chot §3` *"có làm điểm dừng đắt lên không"*): `machine-block` ~**140ms** · `secrets-sweep` ~**64ms** (3 lượt, trung bình), chi-phí ròng khai ~64ms + 1 write. ⇒ **Cơ-chế đã có, số đã đo, nhưng KHÔNG CHẤM ĐƯỢC PASS/FAIL vì không có ngưỡng.** 🔒 **Lane KHÔNG tự đặt số** |
| **4.4** | **Cửa-duyệt lời-hứa-máy** (credit khuôn-câu: SE) | **executed (cổng-người) · máy-quét = DỰ-ĐỊNH, chưa có** | Cổng-người + acceptance đã dựng: `runs/2026-07-22-S144-adap-dot-11/C6-cua-loi-hua-may.md` (tồn tại trên đĩa) + acceptance C6 `spec-…-v2.md:114`**bỏ** neo literal `"máy sẽ"` (tập-đo 0/19, fault-inject cắm câu giả **vẫn xanh** ⇒ neo đó không có răng), thay bằng danh-sách liệt-kê tường-minh + mẫu-số công bố (**19**) + **positive-control BẮT BUỘC** + tách **use ⟂ mention** + đo *gate đã cài* chứ không đo *đã quét xong* (đúng `goi-chot:38` *"chặn từ lúc VIẾT"*). 🔴 **Máy quét tự động cho chính class lời-hứa-máy: CHƯA CÓ** — khai dạng dự-định, đúng theo yêu cầu của chính khoản này (`goi-chot:39` hub cũng tự khai y hệt) |
| **4.5** | available-in-pool ≠ mandate (model đắt hiện ra trong env ≠ đổi pin) | **executed (ĐÃ-CÓ sẵn)** | Khớp sẵn worker-tier-pin S124 — `CLAUDE.md` (memory index) `project_harness4_two_tier_model`: *"S124 worker-tier-pin (14/14 sub = opus+effort:max, lead owner-choice, Fable qua /fable-real)"*. Luật *"Agent ghi-nhận và báo, không tự adopt"* (`goi-chot:46`) = đúng cái SE đang chạy; 0 việc mới |
**Neo commit:** 🔴 vật-chứng 4.1 nằm ở `~/.claude/settings.json`**global, NGOÀI git**, không có sha để cite (chính `CLAUDE.md:27` cảnh báo *"grep trong repo sẽ ra 0 hit"*). Vật-chứng 4.3 (`pause.md`) và các artifact C6/C15 hiện chỉ commit trong nhánh `wal:` (`72d2d1b`), **không phải ancestor `origin/main`** (`2f39a7e`) ⇒ bản này neo bằng **file:dòng trên đĩa**, không cite sha `wal:` (bài học `2026-07-18-…h23-precedence-tested-update.md:26`).
## 4. tailored-gì + skip-gì-vì-sao
- **Tailored 4.1 — 2 cửa owner của SE là LỆNH, không phải config:** hub mô-tả cửa owner-chủ-động chung; SE hiện-thực bằng `/fable-real` (single top-model, 1 lượt) và `/fable-clone` (ensemble tier-2), **per-invocation, không có mode persist** — nghĩa là không có trạng-thái nào để quên tắt. FUNCTION-floor (*tier đắt = cửa owner đích danh*, `goi-chot:15`) giữ nguyên.
- **Tailored 4.2 — SE giữ 1 đường resume mà hub retire:** `resume in-session` để cứu lỗi return-garble (#53) **được giữ**, vì đó không phải mục-đích giữ-model/giữ-context mà là cứu output đã mất. Đọc theo đúng câu `goi-chot:22` (*"hội-thoại tiếp-diễn trong cùng lượt làm việc"*) ⇒ **không phải deviation**, là phạm-vi.
- **Tailored 4.4 — SE bỏ chính neo literal mà cách viết dễ nhất sẽ dùng:** thay `grep "máy sẽ"` bằng danh-sách + positive-control, sau khi đo được rằng neo literal **xanh cả khi cắm câu giả**. Đây là tailor **siết chặt hơn** floor hub, không phải nới.
- **Skip:** không skip khoản nào. 4.5 = ĐÃ-CÓ nên 0 việc, **không phải n-a**.
## 5. honest-caveat
- 🔒 **4.3 — ngưỡng "rẻ" là owner-SỐ và lane này CỐ Ý KHÔNG ĐẶT.** Không có ngưỡng thì câu *"điểm dừng của SE có rẻ không"* **chưa trả lời được**, dù đã có 2 số đo (~140ms / ~64ms). Bản này **từ chối** suy ra một ngưỡng từ chính số vừa đo — làm thế là tự-feed rồi tự-chấm. Trình anh đặt số; trước lúc đó khoản 4.3 giữ nấc `verified-pending` ở vế đo.
- 🔴 **Đường `/pause` vẫn spawn một tiến-trình ngoài** (`pause.md:89`, `nhip-no-probe.ps1`). Acceptance C7 (`spec-…-v2.md:115`) đã mở rộng tập cấm từ *liệt-kê* sang **"bất kỳ tiến-trình ngoài nào"** trong đường dừng ⇒ theo chữ của luật, đây **là** một vi-phạm còn sống; phần giảm nhẹ là nó fail-open và không chặn. Không đọc thành "đã sạch".
- 🔴 **4.1 — lane này KHÔNG probe model, và KHÔNG chép claim của lead làm bằng-chứng.** Bằng-chứng lớp thi hành trích từ `run.md:7`**lời khai của lead**, chưa phải phép đo. Probe thật (`spawn-model-audit.ps1` đọc resolved-model) thuộc lane **L6** của wave này. ⇒ nấc `executed` ở đây tựa trên *file đã sửa*, **không** tựa trên *runtime đã chứng*; nếu L6 probe ra lệch thì dòng 4.1 phải hạ nấc.
- 🔴 **4.2 — vế "lane workflow có `tier:` override sống qua resume" đến nay VẪN CHƯA ĐO.** C15 kết luận cho Agent-tool, không cho lane workflow. Trạng-thái sau S144 không rõ ⇒ giữ **DEFER-đo** trung thực thay vì suy từ ca đã đo (đúng bài *tested = env đã test, không auto-generalize*, `goi-chot:23`).
- 🔸 **4.4 — mẫu-số 19 là mẫu-số của lượt đo S144**, không phải hằng số; số câu-hứa trong repo đổi theo mỗi lượt viết doc. Bất kỳ ai đọc "19" như một chỉ-tiêu cố định là đọc sai.
- 🔸 **sha thư chưa tái-đo hôm nay** (kế thừa frontmatter inbox theo brief). **Nấc dừng ở `executed`, KHÔNG `verified`** (`adap-report.md:31`).
---
# ✅ ADDENDUM @S185 (2026-08-09) — ĐÓNG vế treo 4.2 (`tier:` override qua resume)
> **Block MỚI, không sửa dòng cũ.** Dòng caveat *"4.2 — vế lane workflow … VẪN CHƯA ĐO … giữ DEFER-đo"* giữ nguyên làm vết: nó đúng lúc viết (25-07). Đây là lượt đo, checklist item **C-9** của run `2026-08-09-S185-email-adap-pipeline`. Ruột + lệnh: `.claude/workflows/runs/2026-08-09-S185-email-adap-pipeline/sub-opus-lane5-measure.md`.
## Kết: **vế cũ = VACUOUS (n-a CÓ SỐ)** — nhưng rủi ro **đã dời chỗ**, và chỗ mới đang HỞ
### (1) SE không có đường RESUME cho lane workflow ⇒ không có gì để "sống qua resume"
| Phép đo | Kết quả |
|---|---|
| `grep -cniE "resume\|continue\|reattach\|session_id\|sessionId" .claude/workflows/hmw.js` | **0** |
| **Control dương** — cùng regex, tệp có chữ resume: `.claude/commands/tiep.md` | **13** ⇒ thước sống, 0 là **vắng thật** |
| Model gắn ở đâu | **DUY NHẤT** tại call-site spawn: `hmw.js:284` `agent(prompt, {…})` + `:291` `model: resolveModel(role, raw, t && t.tier, i)` |
⇒ Mỗi lane là **một lần `agent()` mới**, model resolve ngay tại đó. **Không có resume ⇒ override không thể rớt qua resume.** Câu hỏi 4.2 ở dạng nguyên thuỷ **không áp cho SE**.
### (2) 🔴 Rủi ro thật nằm ở RELAUNCH, và ở đó `tier:` KHÔNG có ai canh
Đường phục-hồi của SE là **relaunch-đã-cắt-gọt** (`tiep.md:199-205`), không phải resume. Chính `:205` tự khai: *"Resume-theo-run-id (nếu engine có) = bonus CHỈ trong cùng phiên (SAME-SESSION-ONLY) — 🔴 CẤM claim nó chạy cross-session."*
| Phép đo | Kết quả |
|---|---|
| `grep -ci tier .claude/commands/tiep.md` | **0** (control: `grep -ci model` = **2** ⇒ grep sống) |
| Bước 4 của nhánh `wf:` | dặn re-derive memory-pack **TƯƠI**, 🔴 CẤM snapshot cũ — **không một chữ** về giữ per-task `tier:` |
| run.md **có** `## taskList snapshot` | **54 / 88** run-folder |
| run.md **có chuỗi** `tier:` | **15 / 88** |
| run.md của **chính run đang chạy** (S185) | **0 hit** `taskList` · **0 hit** `tier` |
**Chuỗi hỏng đầy đủ:** workflow chết → `/tiep` bước 1 bảo *"đọc `## taskList snapshot` trong run.md"* → với **34/88** run-folder (39%) **snapshot không tồn tại**, và run đang chạy hôm nay **nằm trong nhóm đó** → lead gõ lại taskList từ trí nhớ → thiếu `tier:``hmw.js:103-110` `resolveModel` trả `MODEL_INHERIT``:291` truyền `model: undefined` → frontmatter worker-tier `opus` cầm lái. **Không lỗi, không cảnh báo.**
🔴 **Bất đối xứng của cảnh báo (đây là chỗ đáng vá):** `hmw.js:105` CÓ nhánh `⚠️` khi `tier` mang **giá-trị lạ**, nhưng **không có** nhánh nào khi `tier` **VẮNG** ở task mà lượt trước có. Tức máy kêu khi bạn gõ SAI, im khi bạn gõ THIẾU — mà thiếu mới là chế-độ hỏng của relaunch.
### (3) Lưới bắt hiện có: chỉ HỒI-TỐ
`scripts/spawn-model-audit.ps1` (PA-2b) so resolved-vs-expected và **tự khai giới hạn** ở header `:30-32`: *"This audit is RETROSPECTIVE… does not promise the next spawn stays on the expected version."* ⇒ một lane bị tụt tier vì relaunch **sẽ bị bắt SAU KHI đã chạy xong bằng model rẻ hơn**, không bị chặn trước.
## Nấc mới cho 4.2
**`executed (có phạm vi) + đo XONG vế treo`** — thay `DEFER-đo`. Cụ thể: vế *"sống qua resume"* = **n-a có số** (0 đường resume, control dương 13); vế thay thế *"sống qua relaunch"* = **HỞ, đã định lượng** (0 hit `tier` trong `tiep.md`; 15/88 run.md chở `tier:`; run hôm nay 0/2 điều kiện).
## Việc đề-xuất (KHÔNG tự làm — ngoài phạm vi lane đo, khai để nhận sau)
1. `tiep.md` nhánh `wf:` bước 4: thêm **1 dòng***"chép lại per-task `tier:` từ `## taskList snapshot`; snapshot không có ⇒ khai `tier` đã mất, KHÔNG im lặng dùng mặc-định."* — chạm **file lệnh****ăn từ phiên sau restart** (ENV-DEP, không hot-reload).
2. Khuôn `run.md`: ép `## taskList snapshot` chở nguyên `tier:` — hiện chỉ 54/88 có snapshot. Cùng họ **C-7** (spawn-label khoản-④, cũng là "khuôn run.md thiếu trường"), nên gộp 1 lượt thay vì vá 2 lần.
3. `hmw.js`: cân nhắc log **1 dòng INFORM** khi taskList relaunch có role từng chạy `tier` mà lượt này vắng — nhưng máy không biết "lượt trước", nên rẻ hơn là để ở lớp `tiep.md` (mục 1). Ghi để không ai tưởng đã có máy canh.
🔸 **Caveat của chính phép đo này:** 15/88 đếm theo **chuỗi `tier:`** nên gồm cả nhắc-trong-văn-xuôi, tức **15 là cận TRÊN** của "run.md thật sự chở override". 54/88 và 0/0 của run hôm nay thì đếm trực tiếp, không có nhập nhằng.
---
## ADDENDUM-2 @S185 (2026-08-10) — vế 4.4 "máy-quét = DỰ-ĐỊNH" hết hiệu lực (block mới, row cũ giữ nguyên — bài-5)
- **4.4 máy-quét lời-hứa-máy ĐÃ DỰNG:** `scripts/loi-hua-may-scan.ps1` (30.223 B, lane7 run `2026-08-09-S185-email-adap-pipeline` — self-test 11/11 PASS, fault-inject 3 ca cây tạm + control dương, 759ms). Mẫu-số ĐO LẠI = **30 dòng** (không phải 19 của C6 @S144 — cùng regex chạy 08-09; đúng lời khoản "mẫu-số công bố" phải tươi), 0 dòng `violation-open`. Nợ còn: ~~cửa gọi~~ ✅ cắm @S185 vào `session-end §L.b(k-ter)` (máy thứ 3).
- **4.2 vế "tier-qua-resume CHƯA ĐO"** → ĐÃ ĐO @S185 (lane5 C-9, addendum riêng nếu có — xem `sub-opus-lane5-measure.md`).
- 4.3 vẫn chờ owner-SỐ (W-3 — đã re-surface vào khối chờ-anh @S185 sau 15 ngày rơi).
## ADDENDUM-3 @S185 — 4.3 CHẤM ĐƯỢC RỒI: PASS (block mới, row cũ giữ)
Owner đặt ngưỡng "điểm dừng RẺ" = **500ms** (YC-021/W-3, key `stop_point_cheap_ms` + nguyên văn trong `memory-budget.json`). Mọi số đã đo đều dưới: machine-block ~140ms · secrets-sweep ~64ms · tien-kiem ~194ms · nhip-no-probe ~281ms ⇒ **4.3 = PASS**. Vế "KÉP executed·verified-pending" của row cũ hết hiệu lực từ 08-10.