103 lines
15 KiB
Markdown
103 lines
15 KiB
Markdown
# 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.1–4.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.1–4.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ừng–nối–checkpoint | 🔴 **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à **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.
|