[CLAUDE] Docs: closeout OUTWARD wave adap đợt-9/10 + vá drift skill-matrix H24
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 5m43s
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 5m43s
Closeout 4 mục OUTWARD của wave S141-S142 (anh gật @S143): - adap-report 7/7 thư, đủ 5 trường REPORT-FORMAT LOCK, evidence đo thật - email hub báo-nấc (sha 6c94873f72e0, selftest_verify exit 0, log _index cùng lượt) - STAGE-2: 7 thư -> inbox/ai_infra/, _index 0 pending, cross-check 7/7 - squash K=8 wal: -> commit chốt Ngoài wave: agents/README skill-matrix thiếu 2 row H24 (drift S121) -> 15/17 thành 17/17. Nấc cao nhất khai được = executed-file/verified-pending-restart (trio CHƯA spawn). 2 phát hiện khai thẳng theo G-015 (chi tiết trong report + email): - whitelist `tools:` KHÔNG chặn ghi ở runtime: 6 vai read-only bị append Write+Edit - pull-lag do "watch broadcasts/inbox" canh nhầm chỗ TICK H24: counter 16->17 (S143), 3-điều-kiện OK-reachable, không fail-loud. Detector TOTAL 46 == baseline 46, 0 flag mới. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -14,7 +14,14 @@ argument-hint: <from_project | all>
|
||||
1. Validate `$1`.
|
||||
2. READ `<from>/broadcasts/outbox/se/*.md` (message gửi cho se).
|
||||
3. Mỗi file CHƯA có trong inbox (so id): **COPY VERBATIM** → `broadcasts/inbox/<id>.md` (**root = pending**). [repo MÌNH §J2]
|
||||
4. **Verify đối chứng:** (a) **whole-file** `Get-FileHash` copy == nguồn (byte-identical = tuyến CHÍNH); (b) **body** recompute `SHA256(body)` == `content_sha256`, body canonical (khớp `AI_INFRA\scripts\stamp_verify.py`): `$txt=[Text.Encoding]::UTF8.GetString([IO.File]::ReadAllBytes($f)) -replace "^\uFEFF",""; (($txt -replace "\r","") -split "(?m)^---\s*$",3)[2] -replace "^\n",""` → SHA256-UTF8. 🔴 **CẤM `Get-Content -Raw` cho hash** — PS 5.1 đọc UTF-8-no-BOM bằng ANSI → mojibake → **false-tamper** (S125). ✗ → **nghi VERIFIER TRƯỚC** (đối chứng `python <AI_INFRA>\scripts\stamp_verify.py <file>` + test 1 sibling known-good; verifier fail cả sibling ⇒ lỗi tool, KHÔNG phải tamper); vẫn ✗ → **flag tamper, KHÔNG move**, báo anh.
|
||||
4. **Verify đối chứng:** (a) **whole-file** `Get-FileHash` copy == nguồn (byte-identical = tuyến CHÍNH); (b) **body** recompute `SHA256(body)` == `content_sha256` khai ở frontmatter.
|
||||
|
||||
**4(b) — đầu-đọc stamp KHOAN-DUNG (adopt S141, ghim S142):**
|
||||
- 🔴 **ƯU TIÊN chạy SCRIPT, đừng tự chế lệnh rút hash:** `python scripts/stamp_verify.py <file>` — **bản port LOCAL trong repo này** (KHÔNG trỏ hub-path `AI_INFRA/scripts/...` nữa; hub-path chỉ còn là nguồn **re-pull** khi hub đổi §N canon). Script in `declared / canonical / no-strip` + verdict; **exit 0 = OK**, exit 1 = có MISMATCH. Nó còn tách được `WRONG-METHOD` (stamp bằng biến-thể no-strip) khỏi `MISMATCH` thật — thứ mắt thường không phân biệt nổi.
|
||||
- **Rút hash declared — PIN mẫu KHOAN-DUNG:** `content_sha256:\s*"?([0-9a-fA-F]{8,64})"?` — phủ **CẢ 3 dạng đang sống trên đĩa**: (i) **có-ngoặc** `content_sha256: "abc..."` · (ii) **không-ngoặc** `content_sha256: abc...` · (iii) **rút-gọn ≥8-hex** (so bằng **tiền-tố**, KHÔNG đòi bằng độ-dài).
|
||||
- 🔴 **CẤM mẫu quote-strict `content_sha256:\s*([0-9a-fA-F]+)`** — nó **whiff ngay ký-tự `"` đầu tiên** ⇒ hash có-ngoặc rút ra rỗng ⇒ đọc thành "không khớp" ⇒ **FALSE-TAMPER**. Bẫy ĐÃ GẶP, không phải giả-định: S141 suýt kết oan tamper cả ba trên ba thư mà cả ba đều lành. Mẫu chặt hơn ở đây **KHÔNG** an-toàn hơn — nó chỉ đổi lỗi "bỏ sót" thành lỗi "vu oan".
|
||||
- **Body canonical** (khớp ĐÚNG `scripts/stamp_verify.py`): `$txt=[Text.Encoding]::UTF8.GetString([IO.File]::ReadAllBytes($f)) -replace "^\uFEFF",""; (($txt -replace "\r","") -split "(?m)^---\s*$",3)[2] -replace "^\n",""` → SHA256-UTF8. 🔴 **CẤM `Get-Content -Raw` cho hash** — PS 5.1 đọc UTF-8-no-BOM bằng ANSI → mojibake → **false-tamper** (S125).
|
||||
- ✗ → **nghi VERIFIER TRƯỚC** (chạy `python scripts/stamp_verify.py <file>` + test 1 sibling known-good; verifier fail cả sibling ⇒ lỗi tool, KHÔNG phải tamper); vẫn ✗ → **flag tamper, KHÔNG move**, báo anh.
|
||||
5. Log `_index.md` §INBOUND: `received · id · <from> → se · status=pending · folder=(root) · sha256(12) · verify=✓`.
|
||||
|
||||
**STAGE 2 — Xử lý xong → archive (PROCESSED):**
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
---
|
||||
description: /fable-clone <vai> <đề-bài> — ENGINE-ĐẮT LỆNH-B per-invocation (H21): vai anh GÁN chạy ENSEMBLE tier-2-mạnh-nhất (N lane đa-lăng-kính CÙNG 1 VAI qua hmw.js parallel + em-main refute+synthesize) cho đề-bài đó — KHÔNG marker, KHÔNG mode persist. Thiếu/sai vai → em main hỏi lại anh 1 dòng, KHÔNG tự chọn. Cặp /fable-real.
|
||||
argument-hint: <vai ∈ roster 14> <đề-bài phán-quyết> — vd "reviewer rà commit X" · "investigator-codebase truy bug Y"
|
||||
argument-hint: <vai ∈ roster 17> <đề-bài phán-quyết> — vd "reviewer rà commit X" · "investigator-codebase truy bug Y"
|
||||
---
|
||||
|
||||
# /fable-clone — ENGINE-ĐẮT LỆNH-B: 1 vai × ENSEMBLE tier-2 (per-invocation, H21)
|
||||
@ -15,10 +15,10 @@ argument-hint: <vai ∈ roster 14> <đề-bài phán-quyết> — vd "reviewer r
|
||||
- **`/fable-clone <vai> <đề-bài>`** = vai anh gán chạy **ENSEMBLE tier-2-mạnh-nhất** = **N lane đa-lăng-kính CÙNG 1 VAI** (qua HMW `parallel`) + em-main **refute + synthesize** (P3/P4) = "bản sao Fable". Rẻ quota top-model, giữ tầng phản-biện chống-đồng-thuận-sai.
|
||||
- **Hiệu-lực CHỈ lượt đó** — **KHÔNG còn "về mặc-định"**, KHÔNG marker, KHÔNG persist (H19 mode thật/ảo đã retired H21). Lượt sau muốn ensemble = gõ lại lệnh.
|
||||
|
||||
## 🔴 Vai BẮT BUỘC ∈ roster 14 (H21 ②)
|
||||
`investigator-codebase` · `investigator-api` · `implementer-backend` · `implementer-frontend` · `frontend-designer` · `database-agent` · `office-document` · `test-specialist` · `reviewer` · `cicd-monitor` · `tooling-auditor` · `harvest-curator` · `lead-view-auditor` · `lead-omission-auditor`.
|
||||
## 🔴 Vai BẮT BUỘC ∈ roster 17 (H21 ②)
|
||||
`investigator-codebase` · `investigator-api` · `implementer-backend` · `implementer-frontend` · `frontend-designer` · `database-agent` · `office-document` · `test-specialist` · `reviewer` · `cicd-monitor` · `tooling-auditor` · `harvest-curator` · `lead-view-auditor` · `lead-omission-auditor` · **`harness-eval` · `harness-refine` · `harness-audit`**.
|
||||
- **Thiếu `<vai>` HOẶC vai ngoài roster** → em main **hỏi lại anh 1 dòng**, **KHÔNG tự chọn vai**.
|
||||
- ✅ **VALID_ROLES đủ roster 14** — canonical đếm ở [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents (B1 derived-trỏ-canonical; **KHÔNG chép số ở đây khi roster đổi** — đó chính là class `view-stale-role-desc` mà `lead-view-auditor` soi). Lịch-sử: 10→12 (S110, +2 monitor `tooling-auditor`/`harvest-curator`) → **12→14 (S121 W2, +2 monitor H24 `lead-view-auditor`/`lead-omission-auditor`)**. *(🧊 limitation cũ 10-vai + H6-design "monitor ngoài workflow" superseded; monitor vẫn INFORM-only, lane RETURN-only.)*
|
||||
- ✅ **VALID_ROLES đủ roster** — canonical đếm ở [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents (B1 derived-trỏ-canonical; **KHÔNG chép số ở đây khi roster đổi** — đó chính là class `view-stale-role-desc` mà `lead-view-auditor` soi). Lịch-sử: 10→12 (S110, +2 monitor `tooling-auditor`/`harvest-curator`) → 12→14 (S121 W2, +2 monitor H24 `lead-view-auditor`/`lead-omission-auditor`) → **14→17 (S141, +3 trio-memory `harness-eval`/`harness-refine`/`harness-audit` — read-only INFORM-only, TUẦN TỰ eval→refine→audit)**. *(🧊 limitation cũ 10-vai + H6-design "monitor ngoài workflow" superseded; monitor vẫn INFORM-only, lane RETURN-only.)*
|
||||
- 🔒 **Honest-note (a/b):** bảo-đảm = **owner-gated tầng lệnh + kỷ-luật lead**, **KHÔNG code-enforced**; lệnh/alias = cách anh **gán vai nhanh**, hệ **KHÔNG tự chọn vai**.
|
||||
|
||||
## 🔴 Spec-file 3-mục BẮT BUỘC mỗi run (H21 ①)
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
---
|
||||
description: /fable-real <vai> <đề-bài> — ENGINE-ĐẮT LỆNH-A per-invocation (H21): vai anh GÁN chạy 1 LẦN SINGLE top-model THẬT (Fable 5; outage → single-Opus-1M/run) deep-pass cho ĐÚNG đề-bài đó, hiệu-lực CHỈ lượt đó — KHÔNG marker, KHÔNG mode persist. Thiếu/sai vai → em main hỏi lại anh 1 dòng, KHÔNG tự chọn. Cặp /fable-clone.
|
||||
argument-hint: <vai ∈ roster 14> <đề-bài phán-quyết> — vd "reviewer rà-soát commit X" · "investigator-codebase truy nguồn bug Y"
|
||||
argument-hint: <vai ∈ roster 17> <đề-bài phán-quyết> — vd "reviewer rà-soát commit X" · "investigator-codebase truy nguồn bug Y"
|
||||
---
|
||||
|
||||
# /fable-real — ENGINE-ĐẮT LỆNH-A: 1 vai × SINGLE top-model deep-pass (per-invocation, H21)
|
||||
@ -16,9 +16,9 @@ argument-hint: <vai ∈ roster 14> <đề-bài phán-quyết> — vd "reviewer r
|
||||
- **`/fable-real <vai> <đề-bài>`** = vai anh gán chạy **1 LẦN top-model THẬT** (sâu nhất, đắt nhất) cho ĐÚNG đề-bài đó. Fable up = single-Fable; Fable **outage** (H5, lỗi `"Model isn't available"`) = single-**Opus-1M** fallback **theo từng lần chạy** (KHÔNG mode toàn-cục).
|
||||
- **Hiệu-lực CHỈ lượt đó** — hết lượt là hết. KHÔNG marker, KHÔNG persist. Lượt sau muốn engine-đắt = gõ lại lệnh.
|
||||
|
||||
## 🔴 Vai BẮT BUỘC ∈ roster 14 (H21 ②)
|
||||
`investigator-codebase` · `investigator-api` · `implementer-backend` · `implementer-frontend` · `frontend-designer` · `database-agent` · `office-document` · `test-specialist` · `reviewer` · `cicd-monitor` · `tooling-auditor` · `harvest-curator` · `lead-view-auditor` · `lead-omission-auditor`.
|
||||
> Số vai canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents (B1 derived-trỏ-canonical). +2 @S121 W2 = 2 monitor H24 lead-self-audit.
|
||||
## 🔴 Vai BẮT BUỘC ∈ roster 17 (H21 ②)
|
||||
`investigator-codebase` · `investigator-api` · `implementer-backend` · `implementer-frontend` · `frontend-designer` · `database-agent` · `office-document` · `test-specialist` · `reviewer` · `cicd-monitor` · `tooling-auditor` · `harvest-curator` · `lead-view-auditor` · `lead-omission-auditor` · **`harness-eval` · `harness-refine` · `harness-audit`**.
|
||||
> Số vai canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents (B1 derived-trỏ-canonical). +2 @S121 W2 = 2 monitor H24 lead-self-audit · **+3 @S141 = bộ-ba đồng-kiểm memory (trio-memory, read-only INFORM-only; TUẦN TỰ eval→refine→audit)**.
|
||||
- **Thiếu `<vai>` HOẶC vai ngoài roster** → em main **hỏi lại anh 1 dòng** ("engine-đắt cần vai đích-danh — vai nào?"), **KHÔNG tự chọn vai**.
|
||||
- 🔒 **Honest-note (a):** "không tự chọn vai" = tầng **KỶ-LUẬT owner-gated** (anh phải gõ vai) — **KHÔNG claim code-enforced**.
|
||||
- 🔒 **Honest-note (b):** lệnh/alias = cách anh **GÁN VAI NHANH**, vẫn phải anh gõ — hệ **KHÔNG tự chọn vai**.
|
||||
|
||||
@ -25,11 +25,13 @@ argument-hint: <to_project> [category] [intent...]
|
||||
1. **Validate** `$1` ∈ 6 others (≠ `se`/unknown) → else ABORT.
|
||||
2. **Soạn body** markdown theo intent.
|
||||
3. **id** = `<YYYY-MM-DD>-se-to-<to>-<slug>` (unique).
|
||||
4. **content_sha256** = `SHA256(body)` **canonical** (strip ALL `\r` + strip 1 leading newline — Y HỆT receive + khớp `stamp_verify.py` hub): `$txt=[Text.Encoding]::UTF8.GetString([IO.File]::ReadAllBytes($f)) -replace "^\uFEFF",""; (($txt -replace "\r","") -split "(?m)^---\s*$",3)[2] -replace "^\n",""` → SHA256-UTF8. 🔴 **CẤM `Get-Content -Raw` cho hash** (PS 5.1 đọc UTF-8-no-BOM bằng ANSI → hash sai — S125 false-tamper).
|
||||
4. **content_sha256** = `SHA256(body)` **canonical** (strip ALL `\r` + strip 1 leading newline — Y HỆT receive + khớp `scripts/stamp_verify.py` **bản port LOCAL** — KHÔNG trỏ hub-path nữa): `$txt=[Text.Encoding]::UTF8.GetString([IO.File]::ReadAllBytes($f)) -replace "^\uFEFF",""; (($txt -replace "\r","") -split "(?m)^---\s*$",3)[2] -replace "^\n",""` → SHA256-UTF8. 🔴 **CẤM `Get-Content -Raw` cho hash** (PS 5.1 đọc UTF-8-no-BOM bằng ANSI → hash sai — S125 false-tamper).
|
||||
5. **Frontmatter:** `id · from: se · to: <to> · category · type: broadcast|update|fix|report|request|coord · date · content_sha256 · nac: sent`.
|
||||
6. **Ghi** `broadcasts/outbox/<to>/<id>.md` (**Write tool**, KHÔNG shell-write — chống mojibake). [chỉ repo MÌNH §J2]
|
||||
6b. **infra-CC** (Harness-3 §N3) — NẾU `category` ∈ {Governance·Agent·Memory·Rag·Mcp·Skill·Cmd} (≠`Coord`) VÀ `to` ≠ `ai_infra`: ghi **bản-2** `broadcasts/outbox/ai_infra/<id>-cc.md` (Write tool — repo MÌNH = §J2-safe, KHÔNG ghi inbox ai_infra) — **body + `content_sha256` Y HỆT** primary; frontmatter `id: <id>-cc · from: se · to: ai_infra · cc-of: <to> · category · type · date · content_sha256 · nac: sent`. (Đã có `outbox/ai_infra/.gitkeep`.) → AI_INFRA pull qua `/check-email se`.
|
||||
6c. **🔴 Selftest-stamp (H19-ack 2026-07-03 — chống sai-phương-pháp + sửa-sau-stamp):** NGAY sau Write, recompute `SHA256(body-canonical)` file vừa ghi (Y HỆT bước 4: split-frontmatter + strip-1-leading-newline + UTF8) → so `content_sha256` frontmatter. **Lệch → ABORT gửi + báo anh** (KHÔNG log `_index`, KHÔNG relay). Khớp → tiếp. *(Bài học: file `2026-06-18-...harness-10...` stamp bằng body KHÔNG-strip-newline → lệch canonical, AI_INFRA bắt; 12/13 file khác đúng. Bước này chẩn cả 2 lớp lỗi.)*
|
||||
- 🔴 **ƯU TIÊN chạy SCRIPT thay vì gõ tay:** `python scripts/stamp_verify.py broadcasts/outbox/<to>/<id>.md` — **bản port LOCAL** (hub-path `AI_INFRA/scripts/...` chỉ còn là nguồn **re-pull** khi hub đổi §N canon). **exit 0 = PASS** → tiếp; exit 1 → đọc verdict: `WRONG-METHOD` = stamp sai phương-pháp (re-stamp canonical) ≠ `MISMATCH` = nghi sửa-sau-stamp. Hai lớp lỗi này **khác cách xử**, đừng gộp.
|
||||
- **Rút hash declared — CÙNG mẫu KHOAN-DUNG như `/check-email` 4(b):** `content_sha256:\s*"?([0-9a-fA-F]{8,64})"?` (phủ có-ngoặc · không-ngoặc · rút-gọn ≥8-hex so bằng tiền-tố). 🔴 **CẤM quote-strict `content_sha256:\s*([0-9a-fA-F]+)`** — whiff dấu `"` ⇒ rút rỗng ⇒ **ABORT oan chính thư mình vừa ghi đúng** (S141). Đầu-đọc gửi và đầu-đọc nhận PHẢI cùng một mẫu, lệch mẫu = hai bên cãi nhau về một file lành.
|
||||
7. **Log** append `broadcasts/_index.md` §OUTBOUND (+ 1 row tag `cc` nếu có bản-2).
|
||||
8. **Báo.** KHÔNG tự relay — bên nhận tự `/check-email se`.
|
||||
|
||||
|
||||
@ -49,7 +49,7 @@ Em main PHẢI echo **TOÀN BỘ nội dung command body này** (đầy đủ Ph
|
||||
|
||||
**§L.a — Deterministic detect (scan action-signature, KHÔNG để AI tự-phán):** quét session theo bảng **AS-1..AS-9** trong error-ledger. Mỗi hit → 1 RCA entry blameless (5-why + fix + guard). **Bug-production = lỗi KÉP → 2 fix** (vá code **VÀ** vá guard/eval-case). List AS mở — gặp class mới thì thêm.
|
||||
|
||||
**§L.b — auto-maintain **(a)→(j)** (đủ HẾT, KHÔNG skip — thiếu = ledger thối). (d)(f) = H2 harvest-curator · (g) = H1 tooling-auditor (2026-06-07 Harness 1) · (h) = User-Mark H-12/13 (S79) · (i) = H18-D(a) (S100) · (j) = H24 lead-self-audit (S122):**
|
||||
**§L.b — auto-maintain **(a)→(k)** (đủ HẾT, KHÔNG skip — thiếu = ledger thối). (d)(f) = H2 harvest-curator · (g) = H1 tooling-auditor (2026-06-07 Harness 1) · (h) = User-Mark H-12/13 (S79) · (i) = H18-D(a) (S100) · (j) = H24 lead-self-audit (S122) · (k) = bộ-ba đồng-kiểm memory (S141):**
|
||||
> 🔸 *Nhãn cũ ghi "8-step" trong khi thân đã có (a)→(i) = 9 — `view-stale-count` điển-hình, vá @S122 khi thêm (j). Từ nay **KHÔNG chép số** vào nhãn: đếm từ thân (B1).*
|
||||
- **(a) summary-index** += 1 dòng/session vào `STATUS.md` Recently Done (pointer, KHÔNG full-log).
|
||||
- **(b) Active-Guards** (error-ledger): promote guard **2-strike** (episodic→procedural) · mark `verified` nếu held qua session · retire theo **net-effect** (hại>lợi → gỡ).
|
||||
@ -108,9 +108,19 @@ Em main PHẢI echo **TOÀN BỘ nội dung command body này** (đầy đủ Ph
|
||||
🔢 **Luật đánh-số chờ-anh (điểm sàn #5 master-checklist `cadd24ae`, S138 — rename S139 tránh trùng token "Sàn-5" H22 ở trên, quyết anh + L3 nit-1):** khối **chờ-anh** trong `HANDOFF` LUÔN **đánh số** (anh trả lời bằng số) — khớp nhóm-3 MASTER-CHECKLIST + nghi-thức re-stamp carry ở trên; số cố-định giúp anh trả lời gọn.
|
||||
- **(v) 🔷 TICK-at-close (Item 1(d) S135 — idempotent):** tick `.claude/governance/.session-counter.json` **theo contract** — 🔴 **CON-TRỎ `session-start §2.1.8`, CẤM chép logic tick** (B1). Idempotent: cùng nhãn-phiên phiên này ⇒ **NO-OP** (nếu `/session-start` hoặc `/tiep` đã tick nhãn này). Có delta → **§5.1 add đích-danh counter-file** (file ngoài hook-3-path; bằng-chứng sống: tick S133 nằm uncommitted qua 2 closeout liên tiếp — M-7).
|
||||
- **(vi) 🔥 Force-fire bù khi closeout gộp sổ (Item 3 S135 — floor B1 §3.2):** đếm `P` = số `wal: pause` gộp vào closeout này: `P=$(git log --format=%s "<closeout-liền-trước>..HEAD" | grep -c '^wal: pause' || true)` — `<closeout-liền-trước>` = commit gần nhất match **regex closeout DÙNG CHUNG Item 4** `^\[CLAUDE\] Docs: S\d+.*(closeout|session-end)` (1 regex, đừng chép 2 bản). 🔴 **so-sánh SỐ, KHÔNG dùng exit-code** (`grep -c` trả exit 1 khi đếm 0 — §5.0 (a)): `[ "$P" -ge 1 ]`. Nếu **`P >= 1` HOẶC** nhãn đóng dạng `S<a>-S<b>` (closeout gộp nhiều phiên) ⇒ coi như **`OVERDUE(light)` bất-kể counter** → in dòng-nợ (qua (i)) + **INFORM-BẮT-BUỘC** anh + **đề-xuất spawn cặp H24 (`lead-view-auditor` + `lead-omission-auditor`) NGAY closeout này**. 🔴 **DP-3 consent-gate GIỮ** (luật owner-era §L.b(j)(ii) + `session-start §2.1.8(e)` "KHÔNG auto-run — anh consent" + hẹn hub "light-run owner-triggered"): force-fire = INFORM-bắt-buộc + đề-xuất-chạy mặc-định, **anh gật mới chạy trong closeout**. Báo hub SELF-CHECK ô3 = **"PASS-với-carve-out (consent)"**, KHÔNG PASS trần.
|
||||
*baseline-ghi-bù (phép-8 annex `dede7ec5`, khai-1-lần): cơ-chế force-fire bù closeout-gộp tồn tại từ 2026-07-17 (`da349fc`, S135 — re-đo 19:12:41+07). Phép-8 CHỈ tính FAIL cho closeout SINH SAU mốc; closeout trước = baseline hợp-lệ ghi n/a, KHÔNG đếm FAIL. Không lặp mỗi lần chạy.*
|
||||
- **(g) 🔌 tooling-freshness CHỐT (🟫 tooling-auditor H1 — Harness 1):** spawn → chốt 4-mặt (skill·sub-role·plugin·docs) đổi gì session này + **new-alloc audit** (skill/plugin MỚI chưa phân-bổ → đề-xuất gán em main + sub phù-hợp vai) + flag doc-drift/roster-lệch/count-stale. Propose → em main APPEND/sửa doc (single-writer). 🔴 G-015: 2 monitor = propose-only, em main VERIFY trước APPEND (Bash residual → KHÔNG "read-only enforced").
|
||||
- **(h) 🔏 User-Mark CHỐT cuối phiên (H-12/13 canonical §P/P7, S79 — `harness-11-engine.md §E`):** đọc [`.claude/governance/ACTIVE-MARKS.md`](../governance/ACTIVE-MARKS.md) → (i) **hiển-thị** status-filtered (Active-High/Active hiện · Medium tóm-tắt · Disable ẩn) cho anh đọc lại (đối-xứng `session-start §2.1.4`); (ii) nếu session này có **quyết-định cấp-governance MỚI** (scope-check P6: đổi CANONICAL §-rule/authority) → chạy `/user-mark-<cấp>` DACI: adjust-gov → double-check → **report-trước-đóng-dấu 3-7 tiêu-chí khách-quan (P4)** → anh confirm → stamp `RC-pqhuy1987-dd-mm-yyyy-hh-mm-ss`; (iii) supersede/disable mark cũ (P5) → con-trỏ-xuôi + Active-High cần anh-confirm RIÊNG. 🔴 **KHÔNG tự đóng dấu / đổi cấp trước khi báo (P4/P8).** 0 quyết-định-mới → "n-a, chỉ hiển-thị".
|
||||
- **(i) 🎯 H18-D(a) outcome spot-check (S100 — [`harness-11-engine.md §J`](../../docs/governance/harness-11-engine.md)):** session governance/review-heavy → chọn **3–5 artifact đã tự-động-qua-cổng** trước đó (cicd GO verdict · detector verdict · monitor verdict · adap-report claim) → **kiểm-lại TƯƠI bằng ground-truth** (tính lại giá-trị đối-chứng · mở định-nghĩa gốc xem claim có thật-cover · đối-chiếu nguyên-văn nguồn). Gấp vào review sẵn có (chi-phí ~0). Sàn-vai trượt-THẬT khỏi nhật-ký → reinject-on-real-miss qua [`reinject-ledger.md`](../governance/reinject-ledger.md) CG-1 (≤1 lần/N=3 phiên, vẫn trượt → escalate anh — REUSE H17 §I B2, KHÔNG sổ mới). Light/hỏi-đáp → skip. (Nấc honest: dogfood n=1 S100 = mẫu hiệu-chỉnh, CHƯA "proven" — caveat 1 broadcast H18.)
|
||||
- **(k) 🧪🧭🧮 Bộ-ba đồng-kiểm memory @ĐÓNG-PHIÊN (adopt S141 — đối-xứng `session-start §2.1.9`; khuôn hub 5-câu `58e28bae` khối B):** đầu-thứ-2 của nhịp 2-đầu-phiên. Trục = **CHÍNH-HỆ-MEMORY**, KHÁC (g) H1 tooling / (d)(f) H2 harvest / (j) H24 lead / reviewer chấm-diff. Contract từng vai = canonical ở `.claude/agents/harness-{eval,refine,audit}.md` (B1 — KHÔNG chép contract vai vào đây).
|
||||
- **(i) 🔴 CONSENT-GATED, KHÔNG auto-run** (cùng khuôn sleep-check (c) + H24 (j)(ii)): in **đề-xuất 1 dòng** `trio-memory: de-xuat chay eval->refine->audit @S<nn> (consent?)` → **anh gật mới chạy**.
|
||||
- **(ii) 🔴 TUẦN TỰ, CẤM song song:** **3 spawn RIÊNG** eval → refine → audit. **KHÔNG dùng `parallel()` của `hmw.js`** — refine đọc output eval, audit chấm cả 2; song song ⇒ chấm **bản cũ** ⇒ verdict vô-nghĩa.
|
||||
- **(iii) Lead scribe NGAY (single-writer):** return từng con → ghi `.claude/workflows/runs/<run-id>/harness-{eval,refine,audit}-return.md` **ngay khi con đó trả**, KHÔNG đợi đủ 3 (3 vai **không có Write/Edit** ⇒ tự-ghi-đĩa bất-khả; phiên chết ⇒ mất return — bài-học vòng-1 S141).
|
||||
- **(iv) PIN đích-danh (fail-closed):** refine nhận **path** `…/harness-eval-return.md`; audit nhận **path run-folder** đang chấm. 🔴 Pin missing/rỗng ⇒ **TỪ-CHỐI / TRƯỢT**; CẤM tự tìm "run mới nhất" (⇒ **ĐẠT-ảo**).
|
||||
- **(v) 🔴 ĐỌC số ĐÃ ĐO trong closeout, KHÔNG chạy lại instrument:** khối (c) ở trên đã chạy `measure-agent-memory.ps1` · `memory-archive-gate.ps1` · `crystallized-backfill.ps1` · `nhip-no-probe.ps1` (+`mfe-eval.ps1` khi có `eval`) — con ĐO **đọc output đó**. Chạy lại = **đo 2 lần lệch cửa-sổ** + phá **đóng-băng bề-mặt-đo (c)**. Ngoại-lệ DUY NHẤT = con KIỂM **re-chạy ≥2 số load-bearing** để đối-chứng byte-exact (đúng contract vai).
|
||||
- **(vi) Post-wave assertion:** xong 3 con → `git status --short` → **kỳ vọng 0 tracked-change ngoài run-folder**; có thay-đổi lạ ⇒ residual-write ⇒ **báo anh + revert** (G-015: propose-only KHÔNG code-enforced ở kênh Bash — git-diff = backstop THẬT).
|
||||
- **(vii) [M4] Vết 2 lớp:** proposal-line ở (i) **IN CẢ khi Light/hỏi-đáp** (Light ⇒ skip CHẠY hợp-lệ, **CẤM skip IM-LẶNG**); khi skip ⇒ ghi **1 dòng vết** vào `.claude/WAL.md`: `trio: skipped S<nn> (<ly-do: light | khong-gat | ...>)`.
|
||||
- **(viii) Đơn-vị nhịp:** "phiên-LOGIC" hub map **TẠM** = nhãn-phiên `S<nn>` (SE chưa adopt session-logic). 🔴 **KHÔNG cadence-key** trong `memory-budget.json`, **KHÔNG tick** counter cho bộ-ba (nhịp bộ-ba ≠ nhịp H24 — trộn 2 đồng-hồ = hỏng cả hai).
|
||||
|
||||
## Phase 2 — WRITE (update MD/RAG)
|
||||
|
||||
@ -139,7 +149,7 @@ Em main PHẢI echo **TOÀN BỘ nội dung command body này** (đầy đủ Ph
|
||||
- Phase 9 UAT mode: feature test-after (có thể skip per chunk), vẫn `npm run build` × 2 app. Nếu chỉ docs/infra → ghi "N/A".
|
||||
|
||||
### 3.2 Sub-agent state
|
||||
- Kiểm tra trạng thái spawn sub-agent (**10 product/quality + 4 monitor INFORM-only**; số vai canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents, B1 KHÔNG chép số ở đây)
|
||||
- Kiểm tra trạng thái spawn sub-agent (**10 product/quality + monitor INFORM-only (H1 · H2 · 2×H24 · 3×trio-memory)**; số vai canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents, B1 KHÔNG chép số ở đây)
|
||||
- Task bất kỳ phải phân việc đầy đủ đúng vai trò split boundary (BE→backend, FE→frontend, test→test-specialist)
|
||||
|
||||
### 3.3 RAG + MCP state
|
||||
|
||||
@ -61,7 +61,7 @@ Registry sub-agent = **ảnh-chụp lúc khởi phiên** (đo 2 lần S120 + S12
|
||||
- 🔴 **Bằng-chứng falsifiable DUY-NHẤT = spawn-probe THẬT** → spawn vai đó, nhận return. Static-check (`ls` + grep `VALID_ROLES`) **KHÔNG đủ** — đúng nguyên-văn broadcast ③(d): *"RESTART rồi VERIFY danh-sách agent"*.
|
||||
|
||||
**Khi nào chạy:** phiên **ĐẦU TIÊN sau khi roster đổi** (thêm/xoá/sửa vai), hoặc khi nghi registry lệch đĩa. Roster ổn-định → **skip** (không cần mỗi phiên).
|
||||
**Cách:** spawn từng vai với task PROBE tối-thiểu (trả đúng `ALIVE|<role>`, cấm gọi tool) → đếm **N/N sống**. Đo S122: **14/14 ALIVE, 0 error, 0 garble**; 2 vai mới lean nhất (~26K tok).
|
||||
**Cách:** spawn từng vai với task PROBE tối-thiểu (trả đúng `ALIVE|<role>`, cấm gọi tool) → đếm **N/N sống**. Đo S122: **toàn-roster-khi-đó ALIVE (N=14 tại thời-điểm S122), 0 error, 0 garble**; 2 vai mới lean nhất (~26K tok). 🔴 **Đây là MỐC ĐO LỊCH-SỬ (S122), KHÔNG phải roster hiện-tại:** +3 vai trio-memory (S141) **CHƯA probe lần nào** — lần probe đầu = phiên SAU restart (đừng đọc con số cũ thành "đủ roster hôm nay").
|
||||
|
||||
> 🔸 **Khai chặt phạm-vi (S122) — đừng đọc thành "đã phủ hết":** probe này phủ đường **Agent-tool registry**. Đường **`hmw.js VALID_ROLES` → `agentType`** là **BỀ-MẶT KHÁC**, chỉ chứng được khi có workflow THẬT gọi vai đó. Đổi roster = đổi **CẢ HAI bề-mặt** — 1 probe KHÔNG phủ cả 2.
|
||||
> 🔸 `tool_uses=0` ở probe = **ĐÚNG THEO LỆNH** (mình cấm gọi tool, câu hỏi không cần tool) — **KHÔNG** phải chữ-ký #53 (= `tool_uses=0` **CỘNG VỚI** bịa đã-làm-việc). Đừng nhìn cột đó rồi tưởng dính garble.
|
||||
@ -94,7 +94,7 @@ Em main đọc `.claude/WAL.md` (sổ mạch-việc-dở H22 — ghi-đè ≤40
|
||||
|
||||
## Phase 2 — AUDIT (state check)
|
||||
|
||||
### 2.1 Sub-agent state (topology — **10 product/quality + 4 monitor INFORM-only**; số vai canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents, B1 KHÔNG chép số ở đây)
|
||||
### 2.1 Sub-agent state (topology — **10 product/quality + monitor INFORM-only (H1 · H2 · 2×H24 · 3×trio-memory)**; số vai canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents, B1 KHÔNG chép số ở đây)
|
||||
- Check TOÀN roster đã spawn chưa:
|
||||
- 🟦 **investigator-codebase** — internal SQL/EF/grep/reference mirror audit
|
||||
- 🟦 **investigator-api** — external docs/CVE/lib/cross-project reference
|
||||
@ -110,6 +110,10 @@ Em main đọc `.claude/WAL.md` (sổ mạch-việc-dở H22 — ghi-đè ≤40
|
||||
- ⬜ **harvest-curator** (monitor H2, INFORM-only) — harvest-integrity 5-trục (Coverage/Completeness/Fidelity/Placement/Corruption)
|
||||
- 🔷 **lead-view-auditor** (monitor **H24**, INFORM-only, **+S121 W2**) — soi **VIEW LỆCH SOURCE** của chính cái LEAD surface (bản-tóm-tắt trỏ số cũ · tiêu-đề chưa bump · chú-thích-trạng-thái chưa lật · số trong mô-tả một VAI lệch · dư-lượng bất-đối-xứng)
|
||||
- 🔶 **lead-omission-auditor** (monitor **H24**, INFORM-only, **+S121 W2**) — soi **CÁI BỊ THIẾU** trong cái LEAD surface (việc rớt khỏi work-state · carry rớt/quá-già · yêu-cầu owner ghi chung-chung mất specifics · quyết-định-treo chìm · memory nạp dưới hạn-mức)
|
||||
- 🧪 **harness-eval** (monitor **trio-memory**, INFORM-only, **+S141**) — con **ĐO**: đọc output 5+1 instrument + `memory-budget.json` → TRẢ **số nguyên-văn** + so-baseline + verdict {HEALTHY|REGRESSION|MIXED}. 🔴 CẤM số-từ-trí-nhớ.
|
||||
- 🧭 **harness-refine** (monitor **trio-memory**, INFORM-only, **+S141**) — con **ĐỀ-XUẤT**: đọc `harness-eval-return.md` (PIN) → action 4-lớp {nạp-lại · thăng-hạng · lưu-kho L1→L2 · chưng-cất} + mục "đã cân-nhắc→BÁC". Chỉ acts **AGENT-MEMORY corpus** (lead hot-feed/carry ⇒ NHƯỜNG `lead-omission-auditor`).
|
||||
- 🧮 **harness-audit** (monitor **trio-memory**, INFORM-only, **+S141**) — con **KIỂM**: đọc **run-folder PIN đích-danh** → verdict ĐẠT/TRƯỢT per-claim + falsify-log + **re-chạy ≥2 số load-bearing**. 🔴 CẤM tự tìm "run mới nhất", CẤM ĐẠT-ảo.
|
||||
- 🔴 **Bộ-ba trio-memory = trục CHÍNH-HỆ-MEMORY, KHÁC H1/H2/H24/reviewer** — chạy **TUẦN TỰ** eval→refine→audit, **consent-gated**; nghi-thức đầy-đủ ở **§2.1.9** (đầu phiên) / `session-end §L.b(k)` (cuối phiên).
|
||||
- 🔴 **2 vai H24 = trục KHÁC H1/H2, KHÔNG gộp:** H1 = tooling-freshness · H2 = harvest-integrity · **H24 = soi chính LEAD**. Class-flag lấy từ **enum ĐÓNG** `lead_self_audit.flag_classes` (`.claude/agent-memory/memory-budget.json`) — **vai KHÔNG tự chế class**. Nhịp = `h24_cadence` (cùng file), **KHÔNG chạy mỗi phiên**.
|
||||
- Task match delegate criteria (ACCEPT) → BẮT BUỘC delegate (xem `.claude/agents/README.md` decision tree)
|
||||
- Con cũ rảnh TRONG-session → resume qua SendMessage (khả dụng lại — F2 S100) HOẶC fresh spawn re-inject MEMORY; cross-session luôn fresh spawn
|
||||
@ -193,7 +197,11 @@ ngược lại → counter += 1 ; last_ticked_session = S<nn> ; last_ticked_head
|
||||
🔴 **Label-convention (PIN THÀNH LUẬT — S135):** mỗi conversation MỚI = một **nhãn-phiên `S<nn>` MỚI**, **kể cả khi vào bằng `/tiep`** (nối qua phiên/đổi acc — `tiep.md:130` "session: khác phiên hiện-tại là BÌNH-THƯỜNG" = use-case chuẩn; thực-hành S134/S135). 🔴 **CẤM reuse nhãn cũ khi nối** — thiếu luật này thì session-clause khớp nhãn cũ ⇒ OR-guard NO-OP nhầm ngay cửa `/tiep` ⇒ tiep KHÔNG tick ⇒ **phép-7 `+0`**.
|
||||
> 🔸 **Đơn-vị đếm + khai thật giới-hạn (reconcile gốc "đếm phiên-có-làm-HEAD-đổi"):** counter đếm **nhãn-phiên `S<nn>`** — phiên thường (SE chưa adopt session-logic `9234a7aa`; khi adopt thì đọc lại = **phiên-LOGIC**, caveat B1 §7). OR-guard cho **mỗi nhãn-phiên +1** ở điểm tick ĐẦU. 🔸 **Ca hiếm giữ khai:** một nhãn-phiên MỚI mà **không commit gì** (Q&A thuần, không chạm WAL) ⇒ HEAD trùng `last_ticked_head` ⇒ head-clause NO-OP ⇒ **+0** (đúng gốc "phiên-có-làm-HEAD-đổi", giữ khai). Thực-tế hook chạm WAL gần như mọi phiên nên hiếm; **đừng đọc counter thành "số phiên tuyệt-đối"**.
|
||||
|
||||
**(b) FAIL-LOUD, CẤM tự chữa:** counter đến **THẤP HƠN** giá-trị đã lưu, HOẶC `last_ticked_head` trỏ commit **không reachable từ HEAD** → 🔴 **BÁO ANH**, **KHÔNG silent-reset**. Counter lùi = file bị rollback/sửa tay; reset lặng sẽ **giấu mất khoảng nhịp đã trôi**.
|
||||
**(b) 3-ĐIỀU-KIỆN — FAIL-LOUD vs SQUASH-BENIGN (v2 @S141, khuôn ①a hub APPROVED; canonical wording = `.claude/governance/.session-counter.json → _contract.fail_loud_on_regress`, B1 — bước này mô-tả nghi-thức, đừng chép ngược):** 🔴 **KHÔNG còn** luật cũ "not-reachable ⇒ báo ngay". **PHÂN-LOẠI TRƯỚC, rồi mới quyết:**
|
||||
1. 🔴 **counter LÙI** (giá-trị đọc được **THẤP HƠN** giá-trị đã lưu) → **FAIL-LOUD BÁO ANH**, **KHÔNG silent-reset**, **CẤM tự chữa**. Counter lùi = file bị rollback/sửa tay; reset lặng sẽ **giấu mất khoảng nhịp đã trôi**.
|
||||
2. ✅ **`last_ticked_head` không reachable từ HEAD** (`git merge-base --is-ancestor <last_ticked_head> HEAD` exit ≠ 0) **NHƯNG** object **VẪN TỒN-TẠI** (`git cat-file -t <last_ticked_head>` in ra `commit`) **VÀ** counter **KHÔNG lùi** → **`squash-benign`**: append **1 dòng vết** vào `history[]` với event-class `squash-benign` → **ĐI TIẾP, KHÔNG báo anh**. *Vì sao hợp-lệ:* closeout squash **nhấc đầu-tick mỗi chu-kỳ** ⇒ drift KỲ-VỌNG, không phải mất dữ-liệu; **nhãn-phiên cũ còn nguyên = corroborate** (2 nguồn khớp mới cho đi tiếp).
|
||||
3. 🔴 **object MISSING** (`cat-file -t` fail — sha không còn trong repo) **HOẶC** counter lùi → **FAIL-LOUD như cũ** (báo anh, KHÔNG silent-reset).
|
||||
🔴 **Ranh 2 tầng (đừng gộp):** contract runtime (b) này = **RĂNG THẬT**, chạy trong nghi-thức, **độc-lập detector**. Lưới `governance-detectors.ps1` **H24-5 `counter-ancestor-classify`** (co-land S141) soi CÙNG 3 nhánh trên nhưng **INFORM-only, KHÔNG vào TOTAL** — **KHÔNG** được coi là thay thế (b); detector chết vẫn KHÔNG làm mất FAIL-LOUD.
|
||||
|
||||
**(c) OVERDUE:**
|
||||
- `OVERDUE(light)` khi `counter − last_audit.light_at_counter >= h24_cadence.light_every`
|
||||
@ -207,6 +215,22 @@ ngược lại → counter += 1 ; last_ticked_session = S<nn> ; last_ticked_head
|
||||
🔴 **Số nhịp = quyền anh.** Bước này **ĐỌC** `h24_cadence`, **KHÔNG** ghi. **CẤM hardcode nhịp ở đây** — copy số vào doc dẫn-xuất chính là drift mà single-source sinh ra để chặn (detector `governance-detectors.ps1` H24-2 **fail-loud** nếu key thiếu, **không** giả-định default).
|
||||
> 🟡 **Honest-caveat mang theo khi báo hub:** hub nói rõ *"số của các em = config của các em; ĐỪNG chép 3 số này"*. SE chọn **cùng 6/15/3** là **điểm khởi-đầu anh CỐ Ý chọn**, KHÔNG phải chép vô-thức. **Chỉnh lại sau chu-kỳ-2 CỦA SE** (deep-audit lần 2, xem .session-counter.json last_audit). Hub đã GỠ counter (bookend 07-15, sha 85bf89ca) → ví-dụ 6/15/3 "ở nguồn" = lịch-sử, KHÔNG còn mốc hub để so; delta hub hứa từ run-2 KHÔNG BAO GIỜ có (hub gỡ trước run-2) — **chưa ai được bán câu "đã chứng minh hiệu-quả"**. ✅ **Ratified 2026-07-17:** anh mark cổng reply `e50a4bd0` (2026-07-16-ai_infra-to-se-reply-adap); canonical = `memory-budget.json → h24_cadence._owner_ratified` (B1 — wording sống ở đó, đừng chép lại đây).
|
||||
|
||||
### 2.1.9 Bộ-ba đồng-kiểm memory — nhịp 2-đầu-phiên, CONSENT-GATED (adopt S141, khuôn hub 5-câu `58e28bae` khối B)
|
||||
|
||||
> Trục = **CHÍNH HỆ MEMORY** (độ-giữ · hành-động · đúng-spec) — **KHÁC** H1 tooling-freshness · H2 harvest-integrity · H24 soi-LEAD · reviewer chấm-diff. 3 vai read-only INFORM-only propose-only, chạy **TUẦN TỰ**: `harness-eval` (con ĐO) → `harness-refine` (con ĐỀ-XUẤT) → `harness-audit` (con KIỂM). Contract từng vai = canonical ở [`.claude/agents/harness-{eval,refine,audit}.md`](../agents/harness-eval.md) (B1 — **KHÔNG chép contract vai vào đây**).
|
||||
|
||||
- **(a) 🔴 CONSENT-GATED — KHÔNG auto-run** (cùng khuôn sleep-check §2.1.2 + H24 §2.1.8(e)): em-main **IN đề-xuất 1 dòng** dạng `trio-memory: de-xuat chay eval->refine->audit @S<nn> (consent?)` → **anh gật mới chạy**. Không gật ⇒ KHÔNG chạy (KHÔNG hỏi vòng 2, KHÔNG "chạy thử cho nhanh").
|
||||
- **(b) 🔴 TUẦN TỰ, CẤM song song:** **3 spawn RIÊNG** đúng thứ-tự eval → refine → audit. **KHÔNG dùng `parallel()` của `hmw.js` cho bộ-ba** — refine đọc output eval, audit chấm output của cả 2; chạy song song ⇒ chấm **bản cũ** ⇒ verdict vô-nghĩa.
|
||||
- **(c) Lead scribe NGAY (single-writer):** return từng con → lead ghi `.claude/workflows/runs/<run-id>/harness-{eval,refine,audit}-return.md` **ngay khi con đó trả**, **KHÔNG đợi đủ 3**. Lý-do: 3 vai **không có Write/Edit** (chặn-bằng-thiếu-tool) nên tự-ghi-đĩa bất-khả; phiên chết giữa chừng ⇒ mất return (bài-học vòng-1 S141).
|
||||
- **(d) PIN đích-danh (fail-closed):** `harness-refine` nhận **path** `…/harness-eval-return.md`; `harness-audit` nhận **path run-folder** đang chấm. 🔴 Pin **missing/rỗng ⇒ vai TỪ-CHỐI / TRƯỢT** — **CẤM** để vai tự đi tìm "run mới nhất" (vớ bản cũ ⇒ **ĐẠT-ảo**).
|
||||
- **(e) Đóng-băng bề-mặt-đo:** cửa-sổ chạy bộ-ba nằm TRONG **Mirror C1** (§2.1.2) — KHÔNG ghi bề-mặt-đo giữa chừng; việc ghi phát sinh xếp hàng SAU verdict.
|
||||
- **(f) Post-wave assertion:** chạy xong 3 con → `git status --short` → **kỳ vọng 0 tracked-change ngoài run-folder**. Có thay-đổi lạ ⇒ vai đã ghi (residual-write) ⇒ **báo anh + revert**. (G-015: propose-only **KHÔNG** code-enforced ở kênh Bash — git-diff là backstop THẬT.)
|
||||
- **(g) KHAI ranh 2 cánh-tay (chống đọc nhầm thành "đo 2 lần"):** **script-arm** = §2.1.2/§2.1.6/§2.1.7 (các script deterministic **in SỐ**) ⟂ **sub-arm** = bộ-ba (**ĐỌC** output script-arm rồi ĐO-lại/ĐỀ-XUẤT/CHẤM). Bộ-ba **KHÔNG thay** script-arm và **KHÔNG re-implement máy đo**.
|
||||
- **(h) Đơn-vị nhịp:** "**phiên-LOGIC**" của hub map **TẠM** = nhãn-phiên `S<nn>` của SE (SE chưa adopt session-logic — cùng caveat đơn-vị với counter §2.1.8). 🔴 **KHÔNG thêm cadence-key** vào `memory-budget.json` và **KHÔNG tick** counter cho bộ-ba (nhịp bộ-ba ≠ nhịp H24 — trộn 2 đồng-hồ = hỏng cả hai).
|
||||
- **(i) [M4] Vết 2 lớp — chuỗi skip PHẢI nhìn thấy được:**
|
||||
- **(1)** proposal-line ở (a) **IN CẢ khi Light/hỏi-đáp session**. Light ⇒ skip **CHẠY** là hợp-lệ, nhưng **CẤM skip IM-LẶNG**.
|
||||
- **(2)** khi skip (anh không gật **HOẶC** Light) ⇒ ghi **1 dòng vết** vào [`.claude/WAL.md`](../WAL.md): `trio: skipped S<nn> (<ly-do: light | khong-gat | ...>)`. Chuỗi skip dài ⇒ **nhìn ra ngay** ở WAL thay vì biến mất.
|
||||
|
||||
### 2.2 Skill registry (6 skill)
|
||||
- Liệt kê: `contract-workflow` · `form-engine` · `permission-matrix` · `dependency-audit-erp` · `ef-core-migration` · `iis-deploy-runbook`
|
||||
- Dùng skill khi task khớp (KHÔNG tự suy luận lại). Phân bổ per agent: xem README skill matrix.
|
||||
|
||||
Reference in New Issue
Block a user