# KẾ HOẠCH 17 — Loop Engineering / Agentic Loop Governance
> Status 2026-07-07: **🟢 T1–T6 implemented+tested (offline), 97/0 in WSL, wired into
> CI — all 5 loop primitives + orchestrator.** Governor (T1), Convergence (T2),
> Verify Contract (T3), Trace/Replay (T4 offline slice), Meta-loop (T5),
> Orchestrator `loop-run.sh` (T6, 17.20–17.21) are done as deny-by-default,
> fail-closed harness primitives (`loop-governor.py`, `loop-convergence.py`,
> `loop-gate.py`, `loop-trace.py`, `loop-metaloop.py`, `loop-run.sh` +
> `packages/casan-harness/config/loop-policy.yaml`/`loop-policy.schema.json` + `loop_common.py`).
> Suites: governor 15/0 · convergence 15/0 · gate 20/0 · trace 16/0 · metaloop 15/0 ·
> loop-run 16/0. Meta-loop changes route through the governed CP store
> (versioned + audit + rollback + SoD) and **actually change the governor's ceiling**;
> a loosen above `org_ceiling` is refused (17.19). **Remaining (infra-gated): T4
> chain KMS-anchor (A7 Vault), T6 Command Center widget 17.22 (C5), live H3-judge.**
>
> Mục tiêu: nâng CASAN từ "governance rời rạc" thành **Agentic
> Loop Governance** — kỹ thuật hoá **vòng lặp agent** (không chỉ prompt).
>
> Nhãn trạng thái: xem legend ở `CASAN_BACKLOG_STATUS.md`.
> Phụ thuộc: **07** (H5 audit chain, H6 AgentOps, C4 approval) · **10** (H3 eval —
> gate mỗi vòng) · **13** (Control Plane — widget Loop + governed loop-policy) ·
> **14** (RBAC — nới budget cần org-admin) · **16** (fail-closed, approval JWT thật,
> secure-by-default — Plan-17 PHẢI tuân các bài học này) · **04** (self-improve —
> meta-loop). Bổ trợ **08** (context compaction giữa các vòng).
---
## 1. Bối cảnh — vì sao cần "loops engineering"
**Prompt engineering** tối ưu **một lần gọi**: câu vào tốt → câu ra tốt. Độ tin cậy
phụ thuộc model + prompt, không có bảo đảm hệ thống.
**Loops engineering** tối ưu **vòng lặp bao quanh model**: `observe → plan → act →
verify → correct → lặp`, với **điều kiện dừng, gate mỗi vòng, ngân sách, phát hiện
không hội tụ, phục hồi lỗi, leo thang cho người**. Độ tin cậy đến từ **cấu trúc vòng
lặp**, không phải một prompt hoàn hảo.
> *Prompt tốt cho câu trả lời hay; loop tốt cho **hệ thống đáng tin**.*
### CASAN đã có sẵn bộ máy loop (đối chiếu FPT §10.4, §4.4, §14)
7 harness component chính là cơ khí của một vòng lặp được kỹ thuật hoá:
| Yếu tố loops-engineering | CASAN đã có |
|---|---|
| Cấu trúc lặp observe→act→verify→correct | **H7 Orchestration / điều phối** (FPT §10.4) |
| Gate kiểm định mỗi vòng | **H3 Evaluation/Validation** + `security-check` action-gate |
| Guardrail trong vòng (fail-closed) | **H4 Security** (deny-by-default) |
| Leo thang cho người khi bí/rủi ro | **H5 Governance** + HITL approval (L0–L5, §4.4) |
| Quản trị ngữ cảnh giữa các vòng | **H1 Context** + `context-compress.py` |
| Quan sát/trace theo vòng | **H6 AgentOps** + audit hash-chain |
| Cải thiện chính vòng lặp | `self-improve.py` (propose ≠ apply) |
**Kết luận:** CASAN vốn là loop-engineering nhiều hơn prompt-engineering — chỉ **chưa
đặt tên và chưa formalize các "loop primitive" hạng nhất.**
### Khoảng trống (5 primitive còn thiếu)
1. **Loop Budget Governor** — trần số bước / token / thời gian / chi phí mỗi vòng lặp → tự dừng (loop-breaker). *Chưa có.*
2. **No-progress / Oscillation Detector** — phát hiện lặp cùng hành động hoặc không tiến gần mục tiêu → halt/leo thang. *Chưa có.*
3. **Per-iteration Verify Contract** — mỗi vòng phải qua gate mới sang vòng sau; fail → correction có cấu trúc, không retry mù. *H3 có gate nhưng chưa là hợp đồng theo vòng.*
4. **Loop Trace / Replay** — ghi từng vòng (state/action/verdict) để audit & tua lại một loop. *Audit chain có mảnh, chưa có "loop view".*
5. **Meta-loop** — self-improve đề xuất sửa chính loop-policy → người duyệt. *Có self-improve, chưa mở sang loop policy.*
---
## 2. Nguyên tắc (bắt buộc, kế thừa Plan-16)
- **Fail-closed toàn diện:** mọi primitive lỗi/thiếu dữ liệu/không đọc được policy ⇒ **HALT vòng lặp** (không "cho chạy tiếp"). Không có đường thoát fail-open.
- **Deny-by-default budget:** run không có policy khớp ⇒ áp **ceiling mặc định chặt nhất**, không phải "vô hạn".
- **Secure-by-default (không opt-in):** trong profile `prod`, loop governance **bật mặc định**; muốn tắt phải **opt-out tường minh có audit** (đảo lại lỗi ARCH-03 của Plan-16). Profile `dev` có thể nới nhưng vẫn ghi audit.
- **Tăng tự chủ = cần duyệt cấp cao:** nới budget / hạ mức gate / tăng delegation-level (L→L+1) là **security-sensitive setting** ⇒ phải qua approval JWT thật (SEC-07) + SoD (proposer ≠ approver), versioned, rollback. Nối Plan-13/14.
- **Mọi số có provenance:** output primitive bọc envelope `{source, artifact_path, commit, run_at, verified}` — cùng data-contract §8.6 Plan-13 (để Command Center "wow thực chất").
- **Con người luôn có nút dừng:** loop-breaker ở **mức vòng lặp** (kill-switch granular hơn Plan-07 C7).
- **Idempotent & tail-safe:** trace append-only, hash-linked; replay không sửa nguồn.
---
## 3. Định nghĩa "Vòng lặp CASAN chuẩn" (Loop Contract)
Một **run** là chuỗi **iteration**. Mỗi iteration là một bản ghi bất biến:
```
Iteration = {
run_id, step,
intent, # ý định của bước (mục tiêu con)
action, tool, inputs_ref, # hành động + tool + tham chiếu input (không nhúng secret)
gate_verdict, # H3/H4: PASS | FAIL | DENY (+ evidence_ref)
progress, # tín hiệu tiến độ (đơn điệu tăng khi tiến gần goal)
budget_snapshot, # {steps, tokens, elapsed_s, cost_usd} tích luỹ
decision # CONTINUE | HALT | ESCALATE | DONE
}
```
**Điều kiện dừng (bất kỳ cái nào đúng ⇒ kết thúc):**
- `DONE` — verify đạt **success-criteria** của goal (không phải "model tự nói xong").
- `HALT(budget)` — vượt trần Governor (Track 1).
- `HALT(no-progress)` / `HALT(oscillation)` — Convergence detector (Track 2).
- `ESCALATE(human)` — gate DENY nghiêm trọng, hoặc stall ở mức rủi ro cao ⇒ vào approvals inbox (Plan-13 §3.4).
- `HALT(human)` — loop-breaker do người bấm.
```mermaid
flowchart TD
S["observe / plan"] --> A["act (tool call)"]
A --> G{"H3/H4 verify gate
(Track 3)"}
G -- FAIL --> C["structured correction
(bounded retries)"]
C --> G
G -- PASS --> B{"Budget Governor
(Track 1)"}
B -- exceeded --> HB["HALT(budget)"]
B -- ok --> CV{"Convergence
(Track 2)"}
CV -- STALLED/OSC --> ESC["ESCALATE / HALT"]
CV -- converging --> D{"success-criteria?"}
D -- yes --> DONE["DONE ✅"]
D -- no --> S
G -- DENY --> ESC
A -.trace.-> T[("Loop Trace
append-only, hash-linked
(Track 4)")]
G -.trace.-> T
B -.trace.-> T
CV -.trace.-> T
```
Vị trí file (sau Plan-01 restructure → `packages/casan-harness/`; hiện tại
`packages/casan-harness/scripts/bash/`). Config ở `packages/casan-harness/config/`. Không nằm trong `apps/okr`.
---
## 4. Tasks theo track
### Track 1 — Loop Budget Governor
| Task | Việc | File | Verify (WSL) |
|---|---|---|---|
| 17.1 | Schema `loop-policy.yaml`: `defaults` + override theo `delegation_level` (L0–L5) + theo `project`. Trường: `max_steps`, `max_tokens`, `max_wall_clock_sec`, `max_cost_usd`, `max_corrections_per_step`, `on_exceed: halt\|escalate`. Bao gồm `profile: prod\|dev`. | mới `config/loop-policy.yaml` + `loop-policy.schema.json` | schema validate; thiếu policy → dùng default chặt nhất |
| 17.2 | `loop-governor.py`: `check --run-id --step --tokens --elapsed --cost` → exit 0 = CONTINUE, exit 3 = HALT(budget) kèm lý do JSON (envelope provenance). **Deny-by-default**; đọc policy lỗi ⇒ exit 3 (fail-closed). | mới `loop-governor.py` | vượt trần → exit 3 + audit; policy hỏng → exit 3 |
| 17.3 | Nới budget = **security-sensitive** → phải qua `control-plane-settings.py` (approval JWT thật + SoD + versioned + rollback). | nối Plan-13/14 | nới không approval → DENY |
| 17.4 | Audit event khi HALT(budget) (hash-chain, Plan-07 H5). | nối audit | bản ghi truy được |
### Track 2 — No-progress / Oscillation Detector
| Task | Việc | File | Verify (WSL) |
|---|---|---|---|
| 17.5 | `loop-convergence.py observe --run-id --step --action-hash --progress` (append vào state run). `verdict --run-id` → `CONVERGING\|STALLED\|OSCILLATING`. | mới `loop-convergence.py` | chuỗi tiến bộ → CONVERGING |
| 17.6 | Luật phát hiện: (a) **oscillation** = cùng `action-hash` lặp ≥ N (config); (b) **no-progress** = `progress` không cải thiện trong cửa sổ W bước; (c) **thrash** = xen kẽ 2 state. Ngưỡng N/W trong `loop-policy.yaml`. | cùng file | lặp action → OSCILLATING; phẳng W bước → STALLED |
| 17.7 | STALLED/OSCILLATING → `on_stall: escalate\|halt` (mặc định escalate vào approvals inbox Plan-13). | nối Plan-13 §3.4 | stall → tạo pending approval |
| 17.8 | Envelope provenance + audit khi phán quyết STALLED/OSC. | nối audit | verdict truy được nguồn |
### Track 3 — Per-iteration Verify Contract
| Task | Việc | File | Verify (WSL) |
|---|---|---|---|
| 17.9 | `loop-gate.py verify --run-id --step --artifact` → `PASS\|FAIL\|DENY` + `correction_hint`. Bọc H3 (faithfulness/eval) + H4 (security-check action-gate) thành **một hợp đồng theo vòng**. | mới `loop-gate.py` (điều phối H3/H4) | fixture pass→PASS; injection→DENY |
| 17.10 | **Correction có cấu trúc**: FAIL → retry tối đa `max_corrections_per_step` (Track 1); vượt → ESCALATE. **Không** retry mù. | cùng file | quá số correction → ESCALATE |
| 17.11 | **Fail-closed**: gate lỗi/timeout/không đọc được artifact ⇒ FAIL (không PASS ngầm). Kế thừa SEC-04/SEC-09 Plan-16. | cùng file | gate throw → FAIL |
| 17.12 | Cấm "self-declared done": `DONE` chỉ hợp lệ khi verify đạt **success-criteria** khai báo trước (không dựa lời model). | contract check | model nói xong nhưng verify fail → không DONE |
### Track 4 — Loop Trace / Replay
| Task | Việc | File | Verify (WSL) |
|---|---|---|---|
| 17.13 | `loop-trace.py record` — append-only bản ghi Iteration (§3) vào audit chain **hash-linked** (nối H5). Không nhúng secret (chỉ `inputs_ref`). | mới `loop-trace.py` | ghi N bước → chain liên tục |
| 17.14 | `loop-trace.py show --run-id` → "loop view" (từng vòng, verdict, budget, progress) — JSON + bảng người đọc. | cùng file | render đúng thứ tự bước |
| 17.15 | `loop-trace.py replay --run-id` — **tua lại xác định**: chạy lại verify trên artifact đã ghi, so verdict cũ/mới ⇒ phát hiện non-determinism/tamper. | cùng file | sửa 1 artifact → replay lệch → cảnh báo |
| 17.16 | `loop-trace.py verify-chain` — tamper-evidence (nối SEC-01/02 Plan-16, KMS-anchored khi TIER-2). | cùng file | sửa 1 bản ghi → chain BREAK |
### Track 5 — Meta-loop (self-improving loop policy)
| Task | Việc | File | Verify (WSL) |
|---|---|---|---|
| 17.17 | Mở rộng `self-improve.py propose`: dựa AgentOps (H6) + loop-trace, đề xuất **sửa loop-policy** (nới/siết budget, thêm gate, chỉnh cửa sổ convergence) ở dạng **dry-run proposal**. | nối Plan-04 | propose không đổi policy (dry-run) |
| 17.18 | `apply` chỉ qua `control-plane-settings.py` (approval JWT thật + **SoD proposer≠approver** + versioned + rollback). | nối Plan-13/14/16 | apply không approval → DENY; rollback được |
| 17.19 | Meta-loop cũng bị Governor giới hạn (không tự nới vô hạn budget của chính nó). | nối Track 1 | đề xuất nới quá trần org → chặn |
### Track 6 — Orchestrator integration & Control Plane
| Task | Việc | File | Verify |
|---|---|---|---|
| 17.20 | Wrapper `loop-run.sh`: mỗi turn gọi `loop-gate` → `loop-governor` → `loop-convergence` → `loop-trace.record`. Profile `prod` **bật mặc định**; opt-out phải tường minh + audit. | mới `loop-run.sh` | turn vi phạm bất kỳ gate → dừng đúng nhánh |
| 17.21 | Nối `model-router.sh`: loop context compaction giữa vòng dùng `context-compress.py` (Plan-08) + must-keep. | nối Plan-08 | context giữa vòng bị nén, giữ must-keep |
| 17.22 | Widget **Loop panel** trên Command Center (§8.6 Plan-13): budget gauge, convergence status, per-iteration ticker, **loop-breaker** (halt granular), click bước → Evidence drawer (loop-trace show). Data đọc-only từ artifact thật. | nối Plan-13 §8.6 | số khớp fixture; loop-breaker → HALT(human) |
---
## 5. Red-team / test (kế thừa phong cách adversarial-harness)
| Test | Kỳ vọng |
|---|---|
| Runaway loop (không điều kiện dừng) | HALT(budget) trước trần; audit ghi |
| Oscillation (A→B→A→B…) | Track 2 phát hiện OSCILLATING → escalate |
| No-progress (chạy nhưng metric phẳng) | STALLED trong ≤ W bước |
| Blind-retry abuse (spam correction) | dừng ở `max_corrections_per_step` → ESCALATE |
| Self-declared done (model nói xong, verify fail) | KHÔNG DONE |
| Policy tampering (sửa loop-policy né budget) | apply cần approval; `verify-chain` phát hiện sửa lén |
| Fail-open probe (làm gate throw để "được chạy tiếp") | FAIL/HALT (fail-closed) |
| Meta-loop tự nới budget vô hạn | chặn bởi trần org + SoD |
| Replay tamper (sửa artifact đã ghi) | replay lệch verdict → cảnh báo; chain BREAK |
**File test:** `packages/casan-harness/tests/phase-loop-governor-tests.sh`, `phase-loop-convergence-tests.sh`,
`phase-loop-gate-tests.sh`, `phase-loop-trace-tests.sh`, `phase-loop-metaloop-tests.sh`.
Chạy trong **WSL Ubuntu** (deterministic, không cần model/docker/mạng). Nối
`ci-harness-gate.sh`. Cập nhật tổng test ở `CASAN_HARDENING_STATUS.md`.
---
## 6. Tiêu chí hoàn thành (Definition of Done)
- [ ] 5 primitive có script + config schema + test xanh trong WSL, nối CI.
- [ ] Mọi primitive **fail-closed** (chứng minh bằng test làm gate lỗi → HALT/FAIL).
- [ ] Loop governance **bật mặc định** ở profile `prod`; opt-out có audit.
- [ ] Nới budget / hạ gate / tăng delegation-level đều cần **approval JWT thật + SoD** (không bypass bằng chuỗi non-empty — bài học M-08/SEC-07).
- [ ] `loop-trace verify-chain` phát hiện tamper; `replay` phát hiện non-determinism.
- [ ] Meta-loop `propose ≠ apply`; apply có versioned + rollback.
- [ ] Widget Loop trên Command Center đọc **artifact thật** + click-to-evidence (không vanity).
- [ ] Không đụng OKR app; core harness giữ nguyên số test hiện có + thêm suite loop.
---
## 7. Ghi chú trung thực
- **T1–T6 đã implement+tested (offline, 97/0 WSL, nối CI)** — đủ 5 loop primitive +
orchestrator. T4 mới là **offline slice** (hash-chain local; KMS-anchor head 17.16
còn chờ A7). T5 meta-loop apply đi qua **governed CP store thật** (versioned +
audit + rollback + SoD) và **đổi được ceiling của governor**; loosen vượt org_ceiling
bị chặn (17.19). Còn lại (infra-gated): T4 KMS-anchor, T6 widget Command Center
(17.22, dep C5), live H3-judge. Không over-claim: primitive "thật" nhờ Plan-16 đã
vá (approval JWT SEC-07 ✅, fail-closed SEC-04/09 ✅, tamper-evidence SEC-01/02 ✅).
- **Không phải làm lại từ đầu:** nền tảng (H3/H4/H5/H6/H7 + `self-improve.py` + `context-compress.py` + audit chain) đã có và test xanh. Plan-17 = **đặt tên "loop engineering" + bổ sung 5 primitive** bọc lên nền đó.
- **Phụ thuộc cứng vào Plan-16:** các primitive chỉ "thật" khi approval JWT thật (SEC-07), fail-closed (SEC-04/09), tamper-evidence (SEC-01/02), secure-by-default (SEC-17/ARCH-03) đã vá. Nếu Plan-16 chưa xong, Track 1/3/5 vẫn viết được nhưng **enforcement còn hở** — phải ghi rõ khi báo cáo, không over-claim.
- **Rẻ + verify offline trước:** khuyến nghị bắt đầu bằng **17.1–17.2 (Governor)** và **17.5–17.6 (Convergence)** — thuần Python/bash, deterministic, verify WSL ngay, không cần model/infra.
- **Giá trị định vị:** biến CASAN thành **"Agentic Loop Governance"** — hợp trend 2026 và hợp câu chuyện "wow thực chất" (budget/convergence/loop-trace là số **đo được, verify được, click-to-evidence được**).
---
_Liên quan: `CASAN_PLAN_07_PRODUCTION_HARDENING.md` (H5 audit, H6 AgentOps, C4 approval, C7 kill-switch) · `CASAN_PLAN_10_TRACEABILITY_EVAL.md` (H3 eval — gate mỗi vòng) · `CASAN_PLAN_13_CONTROL_PLANE.md` (§3.4 HITL inbox, §8.6 Command Center — widget Loop + governed loop-policy) · `CASAN_PLAN_14_RBAC.md` (nới budget cần org-admin + SoD) · `CASAN_PLAN_16_SECURITY_AUDIT_REMEDIATION.md` (fail-closed, approval JWT thật, tamper-evidence) · `CASAN_PLAN_04_SELFIMPROVE.md` (meta-loop) · `CASAN_PLAN_08_CONTEXT_COMPRESSION.md` (compaction giữa vòng)._