Files
CASAN/docs/plans/CASAN_PLAN_17_LOOP_ENGINEERING.md
T
thanhnvandClaude Opus 4.8 4918012199 docs(plans): sync roadmap status + paths to post-restructure state
- Plan-01 marked ✅ DONE (INDEX table + P3 tier + BACKLOG row + plan header).
- Plan-06 / Plan-12 dependency on 01 satisfied → 🔓 unblocked (headers + BACKLOG rows).
- Repoint command/path refs in all plans (except Plan-01's migration narrative):
  .specify/{scripts,tests,security,config,templates,governance} -> packages/casan-harness/...;
  golden-runs/traceability-map/docs-input -> apps/okr/domain/...; `cd AINative_OKR_CASAN5`
  -> `cd $(git rev-parse --show-toplevel)`; fix relative links + Plan-13 control-plane location.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-08 14:57:01 +09:00

220 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.
# 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<br/>(Track 3)"}
G -- FAIL --> C["structured correction<br/>(bounded retries)"]
C --> G
G -- PASS --> B{"Budget Governor<br/>(Track 1)"}
B -- exceeded --> HB["HALT(budget)"]
B -- ok --> CV{"Convergence<br/>(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<br/>append-only, hash-linked<br/>(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)._