Files
solution-erp/.claude/workflows/runs/2026-07-24-S149-hoi-tu-bookend/sub-impl-M5-sentinel.md
pqhuy1987 398d343403
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 5m48s
[CLAUDE] Docs: S149-S150 closeout — bookend lượt đầu end-to-end (hình B) + 2 arc đóng + tally #53 chốt 45
- Arc-1 hội-tụ-bookend (rename 5 vai + 4 máy PS1 + C9-C12) + arc-2 adap-backlog 23/23 + probe Opus-5 khép (S149)
- Bookend @close S150: wave 6 vai (4 đo + 2 KIỂM) → 20 FLAG disposition từng-dòng; ring1 31/34-ĐẠT, ring2 10/10 + M-1 view-stale-role-desc
- Khoá _frozen_until_owner CẮM trước h24-signal-write (frozen-held in thật); 9 class FIRE; JUMP dải {5,4,4,3}+asym{1,4} chờ anh #21
- STATUS bump CURRENT S149-S150 + 2 khối Recently Done; HANDOFF segment mới + re-stamp đủ-slug + (17)(18)(19) lật + (14) viết lại + 6 slot #21-#26
- K2 posture-A @engine PHẦN K + K5 luật TÁCH vòng-đo-mới @session-end (O-2/O-3 OWNER-DELEGATED execute)
- sleep-doc derive-monitor-set (bỏ hardcode 4-tên); spawn-model-audit desc/comment fix; h24-signal-write param-default fix (first-live bug)
- M9 on-behalf ×3 (tooling + inv-cb F3 + reviewer F4); ring1/ring4 nhà seed; ring2 3 cite-dead vá
- Sổ garble #53 derive-from-body chốt 45 + sub-class ngược-#53/skeleton-ruột-rỗng (ghi-đĩa CẦN-KHÔNG-ĐỦ)
- Session-log S149-S150 (Sàn-5 đăng-ký 6 run=) + closeout-synthesis dạng-1

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 12:17:05 +07:00

108 lines
8.8 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.

# sub-impl-M5-sentinel — closeout-sentinel.ps1 (M5 / K5)
> Role: implementer (hmw) · Task-4 · run `2026-07-24-S149-hoi-tu-bookend`
> Deliverable: `scripts/closeout-sentinel.ps1` (1 file mới) + positive-control 5 ca lịch-sử THẬT
> Trần lượt ~30 · VERDICT: **DONE — 5/5 positive-control khớp; predicate = OBS-PAIR (ground-truth), lệch tên-vai/counter so task-wording đã ghi rõ + chứng minh bằng đo, KHÔNG nới**
## 0. Trạng thái
- [x] Đọc spec M5 + K5 + VIPIX `:153` (`--nghi-thuc`) reference (đọc TRỌN handler)
- [x] Đo file-list 5 commit positive-control (git diff-tree)
- [x] Viết `scripts/closeout-sentinel.ps1` (ASCII-only body, PS 5.1, advisory exit-0)
- [x] Chạy positive-control 5 ca → 5/5 khớp
- [x] Fault-injection 5 test (teeth) — auto-detect · SKIP · role-set decisive · counter-gate · bad-commit
- [x] Deviation-vs-VIPIX + deviation-vs-task-wording ghi comment đầu file (D1-D5, T1-T2)
## 1. Đề-bài (M5 / K5)
`scripts/closeout-sentinel.ps1 -Commit <sha>`: với 1 commit closeout, KHI phiên đó CÓ chạy audit H24
(`-AuditRan` HOẶC tự dò run-folder H24 cùng phiên) → kiểm closeout CÓ ghi tín-hiệu vòng-audit lên đĩa chưa.
Thiếu → FLAG `audit do roi nhu chua do`. Positive-control lịch-sử THẬT: S140/S143 PASS · S146/S147/S148 FLAG.
K5 (predicate ĐÃ SỬA theo W2): **predicate = delta BẤT KỲ dưới `agent-memory/<role>/**`** (không MEMORY.md-only).
## 2. Phát hiện then chốt — predicate thực-tế = OBS-PAIR, không phải "lead-stale/gap-auditor"
Task-wording (dòng deliverable) ghi role = `lead-stale-auditor` HOẶC `lead-gap-auditor` + counter-AND.
NHƯNG đo đĩa 5 commit chứng minh predicate 5/5 = **obs-pair {harvest-curator, tooling-auditor}**, KHÔNG phải lead-audit pair:
- **invest sub-MD `:116`** (bản thiết-kế M5 gốc): *"kiểm ... delta CẢ `tooling-auditor/MEMORY.md` LẪN `harvest-curator/MEMORY.md`"* — obs-pair.
- **VIPIX `:153`** (nguồn tailor): kiểm `tooling-auditor/MEMORY.md` AND `harvest-curator/MEMORY.md` — obs-pair.
- **git file-list**: S140/S143 chạm obs-pair (→PASS); S146/S147/S148 KHÔNG chạm obs-pair (→FLAG).
- 🔴 **Chốt hạ (ca S148):** commit `932d607` chạm `lead-view-auditor/MEMORY.md` + `lead-omission-auditor/MEMORY.md`
(TÊN CŨ của cặp soi-lead) **VÀ** `.session-counter.json`. Nếu predicate = lead-audit-pair thì S148 → **PASS**,
MÂU THUẪN kỳ-vọng FLAG. Đã ĐO trực-tiếp (test T-C): `-Roles lead-view-auditor,lead-omission-auditor` trên S148 → **PASS**.
⇒ tập-role positive-control = obs-pair ĐỘC-QUYỀN (loại lead-audit pair ra khỏi tập).
Kết-luận: default `-Roles = harvest-curator,tooling-auditor`; **configurable** (M6 bookend-hoá xong thì trỏ
`-Roles lead-stale-auditor,lead-gap-auditor`). Đây là **hiệu-chỉnh tập-role theo ground-truth, KHÔNG nới** —
obs-pair AND-cả-hai chặt HƠN lead-pair OR-một-trong-hai.
## 3. Bảng đo file-list 5 commit (git diff-tree --name-status)
| SID | commit | obs-pair delta (path) | .session-counter.json | lead-audit pair | Kỳ vọng | Verdict |
|---|---|---|---|---|---|---|
| S140 | b146e2b | ✓ harvest+tooling **archive/2026-07.gist.md** | ✗ | ✗ | PASS | **PASS** ✓ |
| S143 | a1e2416 | ✓ harvest+tooling **MEMORY.md** | ✓ | ✗ | PASS | **PASS** ✓ |
| S146 | 8b6df0a | ✗ (chỉ reviewer/*) | ✓ | ✗ | FLAG | **FLAG** ✓ |
| S147 | 5f6c3be | ✗ (cicd/investigator/reviewer) | ✗ | ✗ | FLAG | **FLAG** ✓ |
| S148 | 932d607 | ✗ | ✓ | ✓ lead-view+lead-omission MEMORY.md | FLAG | **FLAG** ✓ |
🔴 Cột "archive/gist" ca S140 = chính điểm W2: predicate MEMORY.md-only sẽ FLAG OAN S140 (nó chỉ chạm gist,
không MEMORY.md) → K5 mở predicate thành "delta BẤT KỲ dưới role-dir" (script khớp mọi path: `MEMORY.md`, `archive/*`).
🔴 Ma-trận này chứng: KHÔNG combo nào có counter-AND cho S140=PASS (S140 counter=✗). Chi tiết mục 6/T2.
## 4. Thiết kế script (`scripts/closeout-sentinel.ps1`)
- Param: `-Commit <sha>` (bắt buộc) · `-AuditRan` (switch) · `-Roles <csv>` (default obs-pair) ·
`-AnyRole` (OR thay AND) · `-RequireCounter` (nâng counter thành gate) · `-RepoRoot`.
- Luồng: resolve+validate commit → lấy file-list (`diff-tree --root`) → xác định audit-ran
(`-AuditRan` HOẶC auto-detect run-folder chứa `h24|sub-lead|lead-(view|omission|stale|gap)`) →
nếu KHÔNG-RUN ⇒ **SKIP** (không có gì để ghi, tránh false-flag) → nếu RAN ⇒ kiểm role-dir-delta
(predicate-1, quyết verdict) + counter-touch (predicate-2, AUXILIARY/WARN, non-gating mặc-định).
- Role-delta match: file StartsWith `.claude/agent-memory/<role>/` (khớp cả `MEMORY.md` lẫn `archive/*`).
- AND semantics mặc-định (mọi role phải có delta — trung-thành VIPIX); `-AnyRole` nới thành OR.
- Advisory: **exit 0 LUÔN**; đọc dòng `verdict: PASS|FLAG|SKIP|ERROR`.
- ASCII-only body (gotcha #30 — verified 12976 bytes 0 non-ASCII); FLAG string transliterate ASCII
`audit do roi nhu chua do` (bản gốc dấu tiếng-Việt nằm trong comment giải-thích, KHÔNG trong output-runtime của PS 5.1).
- Robustness fix trong lúc test: `[string[]]$Roles` khi gọi từ shell NGOÀI dạng `-Roles a,b` bị bind thành
1 element `"a,b"` → thêm chuẩn-hoá split-on-comma (bắt được nhờ test T-C, KHÔNG suy-luận).
- Bug fix trong lúc test: `$PSScriptRoot` RỖNG khi `-File` bằng path TƯƠNG-ĐỐI (PS 5.1) → fallback chain
`$PSScriptRoot → $PSCommandPath → $MyInvocation → cwd`.
## 5. Kết quả positive-control 5 ca (chạy trên repo THẬT)
```
b146e2b (S140) expected=PASS got=PASS OK [obs-pair delta = archive/2026-07.gist.md ×2, counter=n WARN]
a1e2416 (S143) expected=PASS got=PASS OK [obs-pair delta = MEMORY.md × 2, counter=y]
8b6df0a (S146) expected=FLAG got=FLAG OK [obs-pair 0/2, reviewer-only]
5f6c3be (S147) expected=FLAG got=FLAG OK [obs-pair 0/2]
932d607 (S148) expected=FLAG got=FLAG OK [obs-pair 0/2 dù có lead-view/omission+counter]
```
**5/5 KHỚP.** Không ca nào lệch → không phải nới predicate cho vừa (predicate obs-pair là ground-truth từ invest+VIPIX+đo đĩa).
Fault-injection (chứng có RĂNG, không chỉ happy-path):
- **T-A auto-detect:** S148 KHÔNG `-AuditRan` → tự dò `2026-07-24-S148-h24-force-fire` → RAN → FLAG. ✓
- **T-B SKIP:** S147 KHÔNG `-AuditRan` (phiên S147 không tạo run-folder H24) → NOT-RUN → SKIP (= vì sao positive-control phải assert `-AuditRan`). ✓
- **T-C role-set decisive:** `-Roles lead-view-auditor,lead-omission-auditor` trên S148 → **PASS** (delta OK cả 2 MEMORY.md)
⇒ chứng lead-audit-pair predicate sẽ vỡ S148=FLAG ⇒ obs-pair là tập DUY-NHẤT cho 5/5. ✓
- **T-D counter-gate boundary:** S140 `-RequireCounter` → flip **FLAG** (S140 counter=✗) ⇒ chứng counter-as-hard-gate
vỡ S140=PASS ⇒ vì sao counter non-gating mặc-định. ✓
- **T-E bad commit:** `deadbeef...` → `verdict: ERROR resolve-commit`, exit 0 (graceful). ✓
## 6. Deviation ghi nhận (đầy đủ trong comment đầu file .ps1)
**vs VIPIX `:153` (`--nghi-thuc`):**
- D1 SCOPE: VIPIX soi 3-closeout gần nhất (rule-of-3) + auto-detect qua MARKERS (STATUS+HANDOFF+CRYSTALLIZED);
SE soi ĐÚNG 1 `-Commit` (giống VIPIX `--commit` forced) vì K5 per-commit.
- D2 PATH: VIPIX pin `*/MEMORY.md`; SE mở "delta BẤT KỲ dưới role-dir" (W2-fix cho S140 archive-gist).
- D3 GATE: VIPIX không cổng "audit-ran" (obs-pair chạy vô-điều-kiện, vắng-mặt = tín-hiệu); SE cổng `-AuditRan`/auto-detect
để phiên pre-bookend genuinely-skip → SKIP không false-flag.
- D4 COUNTER: VIPIX không kiểm counter; SE surface counter như WARN auxiliary.
- D5 RUNTIME: SE PS 5.1 ASCII-only (gotcha #30); VIPIX Node giữ dấu tiếng-Việt.
**vs task-wording (ghi rõ, KHÔNG nới — K5 "CẤM nới predicate cho vừa"):**
- T1 ROLE-DEFAULT: task ghi lead-stale/gap-auditor; ground-truth (invest:116 + VIPIX:153 + đo 5-commit + T-C) = obs-pair.
Default obs-pair, configurable `-Roles`. Hiệu-chỉnh theo sự-thật, KHÔNG nới (obs-pair AND chặt hơn lead-pair OR).
- T2 COUNTER-AS-GATE: task ghi counter = hard-AND ("Thiếu → FLAG"). BẤT-KHẢ toán-học với 5/5:
S140 counter=✗ (git-verified) mà PHẢI PASS ⇒ mọi `[X AND counter]` cho S140=FLAG. Spec K5 (authoritative)
KHÔNG liệt counter làm gate. Giải: counter = REPORT/WARN non-gating; `-RequireCounter` nâng thành gate cho tương-lai
(sau M2/M3 cơ-khí-hoá counter-tick). Đã chứng T-D.
## 7. Đường dẫn
- Deliverable: `D:\Dropbox\CONG_VIEC\SOLUTION\SOLUTION_ERP\scripts\closeout-sentinel.ps1`
- Sub-MD (file này): `.claude/workflows/runs/2026-07-24-S149-hoi-tu-bookend/sub-impl-M5-sentinel.md`