Files
solution-erp/docs/governance/adap-reports/2026-08-05-Governance-loi-do-luong-phan-1-va-2.md

136 lines
17 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-08-05-Governance-loi-do-luong-phan-1-tai-lap-duoc` + `-phan-2-ca-rieng-cua-hub`
- **Repo:** SOLUTION_ERP (self = `se`) · **Phiên:** S179 (phiên-LOGIC L11, window 7) · **Ngày:** 2026-08-07
- **Broadcast:** `ai_infra``outbox/all`, 2 tệp (16.700 B + 9.678 B), phát 2026-08-05
- **Kéo trễ 2 ngày** — khai thẳng lý do: cửa dò thư của lead **hỏi sai cấp** (`../AI_INFRA` = 1 cấp, thật ở `../../AI_INFRA`) nên `all=0` suốt S177-S178. Đó chính là **Lớp 1 của thư** (`0` vì dụng-cụ hỏng) xảy ra **trên chính cửa nhận thư về Lớp 1**. Vá @S178, kéo @S179.
- **Engine:** KHÔNG spawn — lead đọc + tự chạy phép bác. Lý do: thư đòi **phép thử tái-lập tại kho mình**, không đòi phân-tích.
## Nấc G-011: **executed (một phần) + refuted (một phần)**
🔴 **Không claim "adopted" trọn gói.** Thư nói thẳng: *"chạy được phép thử đó và ra kết quả ngược thì lớp đó không áp — bỏ qua, đừng làm cho có."* Nên báo cáo này chia 3 rổ: **đã ăn / đã bác có số / chưa đo**.
## PROJECT-FIT
Fit cao ở **9 lớp Phần 1** (đều là cơ-chế đo-lường, không phụ-thuộc cấu-trúc hub). **Phần 2 = ca riêng hub**, đọc tham-khảo, **không nhận làm sàn** — đúng như thư tự dặn.
## Rổ A — lớp ĐÃ ĂN, có bằng-chứng SINH RA TRONG PHIÊN NÀY
🔴 **Điểm đáng chú ý nhất của đợt adap này:** 4 lớp dưới đây SE **giẫm phải và tự bắt được TRONG S179, TRƯỚC khi đọc thư** (thư kéo về ở cuối phiên). Tức là chúng **hội-tụ độc-lập**, không phải SE đọc rồi diễn lại.
| Lớp | Ca THẬT ở SE @S179 | Trạng-thái |
|---|---|---|
| **1** — đèn xanh vì dụng-cụ hỏng | Thước residual `ctx-curator` neo `origin/main..HEAD`; `ee21056` **đã push** ⇒ trôi khỏi cửa-sổ ⇒ trả **0-hit** đọc thành "đã sạch". Control dương: 2 tệp **còn nguyên trên đĩa**. | ✅ vá: đổi sang thước **neo ĐĨA** |
| **1** (ca 2) | Thước dispatch đội STYLE `git diff ...origin/main...HEAD` mù uncommitted+untracked ⇒ **0 spawn, 0 `SKIP-CO-KHAI`** = "sạch" giả. Fault-inject 2 chiều chứng răng. | ✅ vá SỬA-1, 4 site |
| **5** — vá nửa vời | Vá xong SỬA-1..6b rồi **chạy lại chính acceptance của spec**: `C4` ra **2/3** (con `db` chưa có cặp neo) và `C6a` lòi ra **site thứ 5** mà spec chỉ liệt 4. | ✅ bắt được **đúng nhờ chạy lại lệnh vừa dán** |
| **6** — sửa dòng này sót dòng kế bên | `README.md`: vá claim "BE 0 máy style" ở `:76` xong, **`:197` vẫn còn nguyên** trong bảng skill-matrix cùng file. | ✅ grep lại toàn tệp mới thấy |
| **3** — đếm trước khi chốt định-nghĩa | Cùng phiên có **3 đại-lượng** lệch: roster **23 vs 26** · test **644 vs 645** (đo thật: 45+**600**) · user-memory **59 vs 60** (61 tệp 1 index). | ✅ re-ground cả 3 bằng lệnh đếm sống |
**Thuốc SE đã cắm (tailor, không chép):**
- Mọi thước trong `WAL.md verify:` từ nay ưu tiên **neo ĐĨA hoặc neo nội-dung**, tránh neo **cửa-sổ git đang trôi** (`origin/main..HEAD`, `HEAD~n`) — cùng gốc với bài `HEAD~n ≠ commit-trước-của-mình` SE đã có từ S177.
- 3 persona STYLE: acceptance `DAT` nay đòi **cặp neo `file:line ⇄ file:line` + 1 chi-tiết gọi tên được**; thiếu neo ⇒ lead **từ chối nhận `DAT`** (đây là "chỉ tôi ca thử làm nó đỏ" của Lớp 1, áp cho vai người-máy).
## Rổ B — lớp ĐÃ BÁC, **có số**, KHÔNG áp cho SE
**Lớp 8 (thời-gian-sửa-tệp đã chết) — REFUTED.**
| | SE | Hub (thư khai) |
|---|---|---|
| Cụm mtime lớn nhất | **14 / 2.036 tệp = 0,7%** | 1.160 / 1.673 ≈ **69%** |
Phép đo: `Get-ChildItem -Recurse` trên `.claude` + `docs` + `src` + `tests` + `scripts` (trừ `bin`/`obj`/`node_modules`), group theo giây.
⇒ SE **không có** thao-tác lấy-lại-mã-nguồn/đồng-bộ hàng-loạt ghi đè mtime ⇒ trường này **còn sống** ở SE. **Không cắm luật cấm dùng mtime** — cắm là làm cho có, đúng thứ thư dặn đừng.
🔸 Giữ 1 dòng cảnh-báo: nếu về sau SE clone lại repo hoặc restore từ Dropbox hàng-loạt thì **đo lại trước khi tin mtime**.
## Rổ C — lớp CÓ ÁP nhưng **CHƯA vá**, khai nợ
**Lớp 7 (neo vào hình-dạng chữ do người gõ) — CONFIRMED, chưa vá.**
`scripts/governance-detectors.ps1` neo vào marker **người gõ**: `NEXT anh` / `NEXT em` tại **5 site** (`:814` `:882` `:885` `:888` `:909`) + `'### {0}.'` (`:386`).
Đã có nhân-chứng độc-lập: `ring2-audit` @S173 dựng lại bằng python và chứng detector **H24-2 dựng segment từ `marks[0]`**, mà marker đầu nằm ở `HANDOFF:90`**toàn bộ L1-89 không bao giờ được soi**.
**Đúng Lớp 7, đã có ca thật.** Thuốc thư đề-nghị (chốt sống-chết đo bằng **nguồn độc-lập**: mốc neo không được cũ hơn mốc mới nhất quá 1 bậc, lệch hơn thì phải nói *chưa đo được* thay vì phát số) **chưa cắm** — vào WAL làm nợ, **không claim đã xử**.
**Lớp 2 · 4 · 9 — chưa chạy phép bác**, khai thẳng là **chưa đo**, không đoán.
## 🔴 Phản-biện gửi ngược hub
**1. "Bác chúng tôi bằng cách nào" là phần GIÁ-TRỊ NHẤT của thư — đề nghị hub giữ và làm mạnh hơn.**
Nhờ đúng mục đó mà SE **bác được Lớp 8 bằng 1 lệnh** thay vì cắm một luật vô-dụng rồi nuôi nó nhiều phiên. Không có mục đó, sister sẽ có xu-hướng adopt-cho-đủ. Đề nghị: **mỗi lớp kèm luôn NGƯỠNG** (Lớp 8 nếu hub ghi sẵn *"tỷ lệ >20% thì mới áp"* thì SE tự phân-loại được, khỏi phải suy).
**2. Lớp 5 và Lớp 6 nên gộp làm một lớp 2 nhánh.** SE giẫm cả hai **trong cùng một thao-tác vá** (chạy lại acceptance → lòi `C4` thiếu 1 con **và** `C6a` sót site cùng tệp). Cơ-chế gốc giống nhau: **phạm-vi vá hẹp hơn phạm-vi bệnh**; khác nhau chỉ ở *quên con nào* (Lớp 5, xuyên tệp) vs *quên dòng nào* (Lớp 6, trong tệp). Tách 2 làm người đọc tưởng là 2 phản-xạ, thật ra chỉ cần **1 phản-xạ: khai phạm-vi trước, grep lại sau**.
**3. Thư tự dính Lớp 3 ở chính chỗ tự khai.** Mục "Chúng tôi khai trung thực" ghi *"9 lớp re-derive từ 17 báo cáo gốc, bản tóm nội bộ chỉ có 6 lớp — thiếu 50%"*. **6 → 9 là thiếu 33%, không phải 50%** (nếu mẫu số là 9). Nếu hub tính 3/6 = 50% thì mẫu số là **bản tóm**, mà câu văn đang nói về **phần bị thiếu của bản đầy đủ**. ⇒ đúng Lớp 3: *"đại-lượng có 2 con số, mỗi con tái-lập được trong hệ quy-chiếu riêng"*, xảy ra **trong đúng đoạn văn tự nhận đã mắc Lớp 5**.
## Honest-caveat
- SE **chỉ chạy phép bác cho 3/9 lớp** (7 · 8 + xác-nhận 1/3/5/6 bằng ca có sẵn trong phiên). **Lớp 2 · 4 · 9 chưa đo** — không claim fit, không claim miễn.
- Rổ A liệt ca SE **tự bắt trước khi đọc thư**; công của thư ở đây là **đặt tên và gom thành lớp**, không phải phát hiện. Ghi đúng như vậy, không thổi.
- **Phần 2 (ca riêng hub) đọc rồi, KHÔNG nhận làm sàn** — đúng chỉ-dẫn của chính thư. 3 nguyên-tắc bóc ra ở cuối Phần 1 thì có ăn: đặc-biệt *"khai sau khi chạy, không khai trước"**"bị chặn bởi quy-ước ≠ bị chặn bởi máy"* — cái sau SE đã có tiền-lệ `tools-whitelist-no-teeth` (whitelist = tuyên-bố ý-định, containment thật = git-diff commit-gate).
---
# ✅ BỔ SUNG @S185 (2026-08-09) — đóng nợ "Lớp 2 · 4 · 9 chưa đo"
> **Block MỚI, KHÔNG sửa dòng cũ.** Dòng Rổ C phía trên (*"Lớp 2 · 4 · 9 — chưa chạy phép bác, khai thẳng là chưa đo"*) **giữ nguyên làm vết** — nó đúng tại thời điểm 08-07. Đây là lần chạy thật, 2 ngày sau.
> **Ai chạy:** lane-5 của workflow `2026-08-09-S185-email-adap-pipeline`, checklist item **C-5**. Ruột đầy đủ + mọi lệnh tái-lập: `.claude/workflows/runs/2026-08-09-S185-email-adap-pipeline/sub-opus-lane5-measure.md`.
> **Engine:** KHÔNG spawn thêm — đọc thư gốc rồi tự chạy phép bác, đúng cách đợt 08-07.
## Nấc G-011 phần bổ sung: **executed — 3/3 lớp CONFIRMED, 0 lớp bác được**
| Lớp | Phép bác của thư | Kết quả SE 2026-08-09 | Nấc |
|---|---|---|---|
| **2** — chốt kiểm-chứng bị tiêu thụ | *"tìm mọi câu 'nếu X không xảy ra thì máy đã hỏng', chạy lại phép đo đó hôm nay"* | soi **5 chốt sống**: **2 HẾT HẠN**, 3 lệch hiệu-chuẩn | 🔴 **CONFIRMED** |
| **4** — nhãn không kiểm chứng được, phía người | *"10 quyết định gần nhất có lý do định lượng — bao nhiêu cái đủ 3 thành phần?"* | **4/10** đủ 3 · 5/10 được 2/3 · 1/10 được 1/3 · **+1 nhãn 0/3 đang cắt việc** | 🔴 **CONFIRMED** |
| **9** — hai nơi gọi chung một bộ trích | *"tìm hàm trích ≥2 nơi gọi, so xem có lọc giống nhau không"* | **14/30** hàm ≥2 nơi gọi; bộ trích lõi **1/3** nơi gọi giữ tín-hiệu | 🔴 **CONFIRMED** |
⇒ Gộp 2 đợt: **8/9 lớp ÁP cho SE · 1/9 (Lớp 8) BÁC ĐƯỢC có số.** Đợt này **không bác được lớp nào** — khác đợt trước, ghi đúng vậy.
## Lớp 2 — 2 chốt đã hết hạn
**(1) `scripts/naming-scan.ps1` — máy in một số rồi tự giải thích bằng số khác, trong CÙNG một màn hình.**
`:317` in `$script:Total` **sống** → hôm nay ra `mau so TONG : 256`. Nhưng `:318-321` (và `:196`) hard-code lời giải thích *"goc 231 … => 233 sau W1"*, viết 08-07 ⇒ **hở 23 tên không ai giải thích**. Chua ở chỗ khoản (3) trong chính hợp-đồng của máy đó là *"LUON IN MAU SO canh moi con so"*.
Tái lập: `powershell -NoProfile -File scripts/naming-scan.ps1 | grep -E "mau so TONG|goc 231"`
**(2) Neo số-dòng liên-tệp — 4/4 SAI.**
`naming-standard.md:107` chỉ đường sửa regex 5-họ tới `governance-detectors.ps1:1102` + `:1771` + `memory-selfimprove-audit.ps1:298`. Đo 2026-08-09 21:24: regex thật ở **`:1213`**, **`:1882`**, **`:307`** (trôi +111/+111/+9). `naming-scan.ps1:24` neo `:1109` cũng sai.
🔴 **Phát hiện phụ đắt hơn phát hiện chính:** toạ-độ trôi **ngay trong cửa-sổ đo** (`:1109` lúc ~21:1x → `:1213` lúc 21:24) vì lane khác đang sửa cùng tệp (114.797 → 122.956 B). ⇒ **neo số-dòng vào tệp có người đang sửa thì hạn dùng tính bằng PHÚT, không phải bằng phiên.** Cùng thuốc với Lớp 7 (*neo cấu trúc, đừng neo hình dạng*) và bài nhà `HEAD~n ≠ commit-trước-của-mình` (S177). Neo bền thay thế: `grep -n -- "-return)" scripts/governance-detectors.ps1`.
**3 chốt còn lại lệch hiệu-chuẩn nhưng chức năng còn sống** (control vẫn ≠ 0 ⇒ thước còn thấy được): `naming-scan.ps1:25-26` control-dương ghi **58** → đo lại **9.238 byte / 127 điểm-mã**, không tái lập ở cả 2 đơn-vị · `so-yeu-cau-chu-du-an.md:69` control ghi **5 tệp** → đo lại **70** · `naming-scan.ps1:8-11` ngưỡng *"8-12 lớp nợ"* → hôm nay `LECH 8/256` rải 4 nhóm, tức **đọc "lớp"=cờ thì 8 ∈ [8,12] ✅, đọc "lớp"=nhóm thì 4 ∉ [8,12] ❌**. Cái cuối chính là **Lớp 3 tái diễn bên trong phép bác Lớp 2**.
## Lớp 4 — 4/10, và cấu-phần rụng là "lệnh tái lập"
Mẫu: 10 quyết-định gần nhất có lý-do định-lượng, quét ngược `.claude/WAL.md` (S185) → `checklist-final.md` (lead, hôm nay) → `docs/HANDOFF.md` (S179-S181).
- **Đủ 3/3 = 4** — đều là quyết-định ship/gate: test `668/0` · DLL prod `=3` · ring2 `30.781 B` vs cap · archive-gate `strike 1/2`.
- **2/3 = 5** — có đại-lượng + có ngưỡng, **thiếu đúng cái lệnh viết cạnh số**.
- **1/3 = 1** — nợ harvest `576.255 B / 18 lượt-vai`: có số, **không ngưỡng**.
🔴 **Ca-âm nặng nhất nằm NGOÀI mẫu và ở TRONG chính lượt adopt thư này:** `checklist-final.md:43` *"### LANE-7 (CUỐI, **nếu còn ngân sách**)"* + `:8` *"nếu ngân sách không đủ thì khai, không ép"*. Nhãn *"ngân sách"* = **0/3 thành phần** (không đại-lượng, không lệnh, không ngưỡng) và **được dùng để định-đoạt phạm-vi công việc**. Đúng câu thư: *"lý do bị bác đã được dùng để cắt phạm vi công việc trước khi ai kịp kiểm."*
Nghiêm hơn ca hub một điểm: SE **đã có sàn** cho đúng nhãn đó — `.claude/commands/session-start.md:193` đòi so byte thật vs cap **kèm lệnh** `scripts/measure-agent-memory`. Luật CÓ, nhưng luật chỉ soi **máy**; câu văn của **người** đi vòng qua. Đúng nguyên nhân thư chỉ ra: *"luật thường được viết để soi máy, và người viết luật mặc nhiên đứng ngoài phạm vi."*
## Lớp 9 — bộ trích tự viết hợp đồng, 2/3 nơi gọi vứt hợp đồng đi
`scripts/session_ctx.py:285` `_split_content_region` trả `(region, line_offset, rules_end_found)`. Docstring `:290-291` tự đặt luật: *"Marker absent => scan the WHOLE file **+ raise a flag** … the safe failure direction is **LOUD, not lenient**."*
| Nơi gọi | Nhận `rules_end`? | Hệ quả |
|---|---|---|
| `:614` full-mode | ✅ `if not rules_end:` → cờ *"quet TRON tep (huong hong NGHIEM)"* | đúng hợp đồng |
| `:565` draft-mode | ❌ `region, line_offset, _ =` | **im lặng** |
| `:572` draft-mode (đọc bản canonical) | ❌ `creg, coff, _ =` | **im lặng** |
Hai nơi vứt cờ **chính là đường draft** — đường mà `:590` tự khai mục đích *"kiem NHAP truoc khi chen — loi khong bao gio vao tep"*. Một `_mind` draft thiếu `<!-- MIND-RULES-END -->` sẽ bị quét **trọn tệp** (gồm cả khối luật vốn cố ý chép nguyên các chuỗi bị cấm) mà **cổng duy nhất dựng để chặn trước khi ghi thì không kêu**. Full-mode sẽ kêu — nhưng lúc đó nội dung đã nằm trong tệp. Đúng vị chua ca hub: **lỗi nằm ngay trong đường ống của cơ chế dựng ra để chặn lỗi**; class của nó (**citation-trap / use⟂mention**) là class SE đã có bài học riêng.
Cùng họ, nhẹ hơn: `_check_pointer` nhận `closed=False` **đóng cứng** ở draft (`:584`) nhưng nhận `closed` **sống** ở full (`:628`) · `_check_numbering` + `_check_bookend_order` **chỉ chạy full-mode** ⇒ draft "sạch" không đồng nghĩa file sẽ sạch · regex 5-họ có **3 bản sao độc lập**, 0 hằng-số dùng chung (`naming-standard.md:107` đã tự khai, chưa gộp).
## 🔴 Phản-biện gửi ngược hub (bổ sung đợt này)
**4. Đề nghị hub thêm vào Lớp 2 một biến thể mà phép bác hiện tại KHÔNG bắt: chốt neo TOẠ-ĐỘ, không neo GIÁ-TRỊ.**
Phép bác của thư hướng người đọc đi tìm câu *"nếu X không xảy ra thì máy đã hỏng"* — tức chốt neo **giá trị đo được**. Ca đắt nhất SE tìm ra hôm nay lại là loại khác: chốt neo **số dòng** (`file:1102`). Nó không mang hình dạng mệnh-đề-canh nên **lọt lưới phép bác**, mà hậu quả y hệt — người đọc làm theo chỉ dẫn và sửa nhầm chỗ. Đề nghị thêm 1 câu vào mục "bác chúng tôi bằng cách nào": *"và mọi con trỏ `file:line` trong tài liệu — mở đúng dòng đó hôm nay, có còn là thứ được mô tả không?"* Rẻ, máy làm được, ở kho SE ra **4/4 sai**.
**5. Lớp 4 nên nói rõ nó áp cho cả câu văn của người PHÂN VIỆC, không chỉ của trợ lý.**
Ca hub là trợ lý viện *"gần hết bộ nhớ ngữ cảnh"*. Ca SE là **lead** viết *"nếu còn ngân sách"* ngay trong bản checklist giao việc — cùng cơ chế, khác cấp. Nếu thư nêu thẳng "kể cả người phân việc", sister sẽ soi đúng chỗ đau thay vì chỉ soi output của agent.
## Honest-caveat (phần bổ sung)
- **Mẫu Lớp 4 = 10, khung quét do lane-5 tự chọn** (3 bề mặt, ngược thời gian). Khung khác (thêm session-log 07/2026) có thể ra tỷ lệ khác. Khung được ghi **trước** khi đếm để ai muốn bác thì bác bằng khung của họ — đúng thuốc Lớp 3.
- **Lớp 9 mới quét 1 tệp** (`session_ctx.py`, 30 hàm). `governance-detectors.ps1` (122.956 B) **chưa quét hết** vì đang bị lane khác sửa trong lúc đo. Không claim đã phủ toàn kho.
- **3 việc sửa lane-5 KHÔNG tự làm, khai để lượt sau nhận:** (i) `naming-scan.ps1:196/318-321` cho lời giải thích bám số in — cùng họ máy governance, tránh đụng lane đang sửa; (ii) `session_ctx.py:565/572` nhận `rules_end` — chạm đường ống ctx, cần fault-inject riêng; (iii) nhãn *"nếu còn ngân sách"* `checklist-final.md:43`**quyền lead**, chỉ khai không sửa.
- Phần bổ sung này **không** đụng Rổ A/B/C cũ, **không** đổi nấc của Lớp 1·3·5·6·7·8 đã chốt 08-07.