feat: harden chat state by tenant

This commit is contained in:
thanhnv
2026-07-08 23:38:22 +09:00
parent b3b0544ba8
commit c800f7edf7
20 changed files with 380 additions and 54 deletions
+17 -7
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 + MVP-2 done+test; MVP-3 multi-tenant còn planned.**
> Status 2026-07-08: **✅ MVP-0 + MVP-1 + MVP-2 + MVP-3 done+test.**
> Đã 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
@@ -15,6 +15,8 @@
> loop certification. **Track 8.1/8.2/8.3/8.4** đã có replay/verify-chain
> foundation, Command Center Chat/Loop widget đọc chat audit/replay evidence thật,
> và escalation vào approvals inbox.
> **Track 9/MVP-3** đã partition chat state theo tenant, guard explicit paths,
> ghi encrypted audit snapshot, và scope kill-switch/quota theo tenant.
> 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
@@ -297,9 +299,9 @@ flowchart TD
### Track 9 — Multi-tenant hardening `[MVP-3]`
| Task | Việc | File | Verify (WSL) |
|---|---|---|---|
| 18.9.1 | tenant-partition state + quyền FS (SEC-23); RBAC ở **cả tầng dữ liệu** | store per-tenant | tenant A không đọc/ghi state B |
| 18.9.2 | per-tenant encrypt at-rest (MT-02) | nối KMS | admin A không đọc audit B |
| 18.9.3 | quota / kill-switch scope theo tenant (MT-03) | nối kill-switch | 1 tenant burn budget không ảnh hưởng tenant khác |
| 18.9.1 | ✅ tenant-partition state + quyền FS (SEC-23); RBAC ở **cả tầng dữ liệu** | `tenant-store.sh` + chat audit/replay paths | tenant A không đọc/ghi state B |
| 18.9.2 | ✅ per-tenant encrypt at-rest (MT-02 offline snapshot) | `tenant-crypt.sh` | admin/tenant B không decrypt audit A |
| 18.9.3 | ✅ quota / kill-switch scope theo tenant (MT-03) | `kill-switch.sh` + `cost-spike-detect.sh` | 1 tenant burn budget không ảnh hưởng tenant khác |
---
@@ -379,12 +381,19 @@ cập nhật tổng test ở `CASAN_HARDENING_STATUS.md`.
- [x] Control Panel `/approvals` can pass an approval JWT for strict review; dev mode remains backward-compatible.
- [x] Verify: `phase-chat-approval` 4/0, `phase-chat-agent-select` 8/0, `phase-chat-replay` 4/0, `console:test` 28/0, `console:build` xanh.
**MVP-3 Track 9 (Multi-tenant hardening):**
- [x] Non-default tenant chat turns write audit/head/agent-binding/metrics/artifacts/loop state under `tenant-store.sh` partitions; default single-tenant path remains backward-compatible.
- [x] `chat-replay.py` and explicit chat audit overrides are guarded by tenant-store, so tenant A cannot point replay at tenant B's audit path.
- [x] Chat audit writes create per-tenant encrypted `.enc` snapshots via `tenant-crypt.sh`; tenant B cannot decrypt tenant A's snapshot.
- [x] Chat entry checks tenant-scoped kill-switch and tenant cost quota before work; tenant A halt/quota does not halt tenant B.
- [x] Verify: `phase-chat-tenant` 8/0, `console:test` 29/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.
- [ ] Chọn agent/skill qua **RBAC + allowlist**; nâng delegation cần **approval JWT + SoD**.
- [ ] Streaming: side-effect **luôn** sau gate; draft DENY → thu hồi, không tác dụng phụ.
- [ ] Chat state **per-tenant**; test cross-tenant bị chặn ở tầng dữ liệu.
- [x] Chat state **per-tenant**; test cross-tenant bị chặn ở tầng dữ liệu.
- [ ] Turn **replay được** + `verify-chain` phát hiện tamper.
- [ ] API chỉ **bọc** harness (không verdict riêng); UI đọc **artifact thật** + click-to-evidence.
- [ ] Không đụng OKR app; core harness giữ nguyên số test + thêm suite chat.
@@ -392,11 +401,12 @@ 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] — 🟡 done+test.**
- **[MVP-0 + MVP-1 + MVP-2 + MVP-3] — ✅ done+test.**
Ask CASAN read-only, Operator registered actions, agent/skill governance foundation,
CODEGEN draft-as-loop, OPERATOR chat-as-loop/draft-hold, replay/verify-chain foundation,
Command Center Chat/Loop widget, approvals escalation đã có harness CLI + Control Panel
API/UI. Phase multi-tenant production vẫn chưa mở.
API/UI. Multi-tenant chat state, replay guard, encrypted audit snapshot, tenant kill-switch,
và tenant quota đã có test đối kháng.
- **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.