feat: certify chat operator turns through loop-run

This commit is contained in:
thanhnv
2026-07-08 22:31:03 +09:00
parent 004afa73c9
commit 49d0363c6a
13 changed files with 423 additions and 26 deletions
+21 -12
View File
@@ -1,6 +1,6 @@
# KẾ HOẠCH 18 — Governed Chat Console (Chat-as-Loop qua Control Plane)
> Status 2026-07-08: **🟡 MVP-0 + MVP-1 done+test; MVP-2 Track 4 foundation done — target architecture còn planned.**
> Status 2026-07-08: **🟡 MVP-0 + MVP-1 done+test; MVP-2 Track 4 + Operator Track 5/6 done — target architecture còn planned.**
> Đã implement **Ask CASAN — Read-only Evidence Assistant** qua harness + Control
> Panel (`/api/v1/chat/ask`, `/chat` UI): Prompt Router deterministic
> `READ_ONLY/OPERATOR/BLOCK/NOT_SUPPORTED`, context whitelist, H4 scan in/out, H5
@@ -9,6 +9,9 @@
> qua `action-gate`, không free-command, kết quả có artifact provenance. **MVP-2
> Track 4 foundation** đã có `agent-registry.yaml`, agent/skill resolver, RBAC
> gate chọn agent, delegation hold, tool allowlist block, Control Panel agent picker.
> **Operator Track 5/6** đã bind mỗi side-effect turn vào Plan-17 `loop-run.sh`,
> verify trace/replay, H4 preflight/context/tool-output scan, và chỉ release action
> sau khi draft được certify.
> Mục tiêu
> tổng thể vẫn là thêm **cửa sổ chat** vào Control Plane (Plan-13) như một
> **bề mặt tương tác của core harness** — mỗi lượt chat là **một loop-run được
@@ -261,23 +264,23 @@ flowchart TD
### Track 5 — Chat-as-loop pipeline `[MVP-2]`
| Task | Việc | File | Verify (WSL) |
|---|---|---|---|
| 18.5.1 | `chat-turn.sh` full: preflight → H1 context/compress → router → model-router → `loop-run.sh` → verify → trace (**gọi harness core, không reimplement**) | mới `chat-turn.sh` | bỏ 1 bước gate → test FAIL |
| 18.5.2 | Turn = loop-run: budget governor + convergence + verify-contract (Plan-17 T1/T2/T3) | nối Plan-17 | runaway chat → HALT(budget) |
| 18.5.3 | Preflight bắt buộc: `harness-preflight` + `context-assemble-scan` + `tool-output-scan`, fail-closed | nối H4 | injection trong msg → DENY |
| 18.5.1 | 🟡 OPERATOR path done: preflight → router → agent bind → `loop-run.sh` → trace/replay → action release (**gọi harness core, không reimplement**). CODEGEN/full model-router path còn pending | `chat-turn.py` | bỏ gate/draft injection → test FAIL |
| 18.5.2 | 🟡 OPERATOR turn = loop-run: budget governor + convergence + verify-contract (Plan-17 T1/T2/T3) | nối Plan-17 `loop-run.sh`/`loop-trace.py` | operator turn có `loop_run`, trace verify + replay OK |
| 18.5.3 | ✅ Preflight bắt buộc cho OPERATOR: `harness-preflight` + `context-assemble-scan` + `tool-output-scan`, fail-closed | nối H4 | injection trong msg → DENY, side-effect không chạy |
### Track 6 — Streaming / verify reconciliation `[MVP-2]`
| Task | Việc | File | Verify (WSL) |
|---|---|---|---|
| 18.6.1 | Kênh draft `UNCERTIFIED`: stream token nhưng **giữ** side-effect tới khi `loop-gate` PASS | `chat-turn.sh` + API | side-effect trước gate → không xảy ra |
| 18.6.2 | DENY sau khi đã stream draft → **thu hồi** draft, turn `DENIED`, audit | cùng | draft bị DENY → không tác dụng phụ |
| 18.6.3 | L0 read-only stream thẳng; ≥L1 bắt buộc draft-hold | resolver | L1 agent không stream-exec thẳng |
| 18.6.1 | ✅ OPERATOR draft-hold: draft artifact `UNCERTIFIED` giữ side-effect tới khi `loop-run` PASS | `chat-turn.py` + API | side-effect trước gate → không xảy ra |
| 18.6.2 | ✅ DENY sau draft/preflight → draft held, turn `DENIED/HALTED`, audit; không action | cùng | draft bị DENY → không tác dụng phụ |
| 18.6.3 | ✅ L0 read-only stream thẳng; ≥L1 OPERATOR bắt buộc draft-hold | resolver + `chat-turn.py` | L1 operator không stream-exec thẳng |
### Track 7 — Chat API (NestJS) + UI (React) trên Command Center `[MVP-0 tối thiểu → lớn dần]`
| Task | Việc | File | Verify |
|---|---|---|---|
| 18.7.1 | ✅ Chat API (NestJS) **bọc** harness (MVP-0/1: read-only + operator; single-source, không verdict riêng) | `packages/casan-control-panel/backend/src/chat/*` | API gọi `chat-turn.py`; `console:test` xanh |
| 18.7.2 | ✅ Chat panel React + hiển thị **evidence sources**, registered actions, action-gate + badge `mode/risk` | `packages/casan-control-panel/frontend/src/pages/Chat.tsx` | `console:build` xanh |
| 18.7.3 | 🟡 (MVP-2 partial) agent/skill picker theo RBAC + delegation-level đã có; còn badge `UNCERTIFIED/CERTIFIED` + nút **loop-breaker** khi Track 5/6 mở | Control Plane UI | picker hiện locked agent, backend DENY agent ngoài quyền |
| 18.7.3 | 🟡 (MVP-2 partial) agent/skill picker theo RBAC + delegation-level + loop certification badges đã có; còn nút **loop-breaker** và replay drawer khi Track 8 mở | Control Plane UI | picker hiện locked agent, backend DENY agent ngoài quyền; OPERATOR hiện `loop_run` |
| 18.7.4 | Fail-loud: API/telemetry chết → UI `STALE/503` (tái dùng D3 `/healthz`) | nối Plan-07 D3 | ngắt backend → UI báo stale |
### Track 8 — Replay / Evidence / Command Center widgets `[MVP-2 → MVP-3]`
@@ -346,6 +349,12 @@ cập nhật tổng test ở `CASAN_HARDENING_STATUS.md`.
- [x] Delegation vượt agent max → `REQUIRES_APPROVAL`; tool ngoài allowlist → BLOCK trước runtime.
- [x] Control Panel `GET /api/v1/chat/agents`, `/chat` agent/skill/delegation picker, response có `agent_binding`. Verify: `phase-chat-agent-select` 8/0, RBAC 12/0, SEC-23 RBAC 6/0, `console:test` 25/0, `console:build` xanh.
**MVP-2 Track 5/6 OPERATOR slice (Chat-as-loop + draft-hold):**
- [x] OPERATOR turns create an `UNCERTIFIED` draft artifact, run `harness-preflight`, `context-assemble-scan`, `loop-run.sh`, `loop-trace verify-chain`, and `loop-trace replay` before action release.
- [x] Side effects are held until `loop_run.draft_certified=true`; denied drafts keep `side_effect_released=false` and do not execute the registered action.
- [x] Tool output is scanned with `tool-output-scan.sh` before returning the operator result to chat.
- [x] Control Panel response includes `loop_run`; `/chat` displays loop certification/replay status. Verify: `phase-chat-pipeline` 4/0, `phase-chat-stream-hold` 2/0, `phase-chat-operator` 8/0, `console:test` 25/0, `console:build` xanh.
**Full (target architecture) — DoD tổng:**
- [ ] Turn chạy **đúng như một loop-run Plan-17** (không định nghĩa vòng lặp riêng).
- [ ] **Không đường vòng:** test chứng minh bỏ bất kỳ gate nào (preflight/verify) → FAIL.
@@ -359,10 +368,10 @@ cập nhật tổng test ở `CASAN_HARDENING_STATUS.md`.
---
## 7. Ghi chú trung thực & Non-goals (không lan man)
- **[MVP-0 + MVP-1 + MVP-2 Track 4 foundation] — 🟡 done+test.** Ask CASAN read-only,
Operator registered actions, và agent/skill governance foundation đã có harness CLI
+ Control Panel API/UI. Các phase Chat-as-loop / streaming / replay / multi-tenant
production vẫn chưa mở.
- **[MVP-0 + MVP-1 + MVP-2 Track 4 + Operator Track 5/6] — 🟡 done+test.** Ask CASAN
read-only, Operator registered actions, agent/skill governance foundation, và
OPERATOR chat-as-loop/draft-hold đã có harness CLI + Control Panel API/UI. Các
phase CODEGEN-as-loop / replay widget / multi-tenant production vẫn chưa mở.
- **MVP-first (chống lan man):** **MVP-0 (Ask CASAN read-only) KHÔNG phụ thuộc Plan-17/
14/SEC-23** — làm được ngay trên nền H4/H5/H6 hiện có. Chỉ **MVP-2 trở đi** (chat-as-
loop + agent) mới cần Plan-17 (T1–T3) + Plan-14 RBAC; **MVP-3** mới cần SEC-23 tenant.