Files
CASAN/docs/plans/CASAN_PLAN_13_CONTROL_PLANE.md

288 lines
23 KiB
Markdown
Raw Permalink 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 13 — Control Plane (Dashboard giám sát + quản lý + settings)
> Status 2026-07-08: **🟡 Governance CORE + Track 1/2/3 + FinOps/SLO + Command Center + local-prod deploy smoke DONE (managed prod còn).**
> **Track 1** built: real NestJS API + React UI at `packages/casan-control-panel/` (read-only
> monitoring over harness telemetry: overview/runs/governance/security/incidents/tools/
> traceability/drift/cost/command + stale-aware `/healthz`). API serves REAL data;
> harness gate untouched (64/0/3). Run: `npm run console:api` + `npm run console:ui`.
> **Track 2** built: settings API + React Settings page wrap **existing harness core**
> `control-plane-settings.py` and call `rbac-check.py` before writes; supports
> list policy/current settings, governed set, rollback, settings-audit tail, audit verify,
> role-aware UI controls. **Track 3**: kill-switch API + Incidents UI call
> `kill-switch.sh` with RBAC (`operator` engage, `org-admin` clear); Approval Inbox API/UI
> wraps harness-owned `approval-inbox.py`; `delegation-policy.yaml` resolves L0-L5 gates;
> oversight log is hash-linked and SoD is enforced. Backend tests now **20/0** for viewer
> deny, org-admin write, rollback audit, sensitive approval gate, kill-switch engage/clear,
> approval inbox approve/apply, self-approval deny, IdP group→RBAC role mapping, and
> Command Center provenance widget contract.
> Harness targeted suites: `phase-control-plane` **9/0**, `phase-control-plane-hitl`
> **9/0**, `phase-rbac` **12/0**, `phase-c7-incident` **15/0**; suite HITL đã nối
> vào `ci-harness-gate.sh`.
> **Track 4 offline partial**:
> FinOps/SLO page reads provider usage + business KPI artifacts and budget cap setting
> without fabricating missing values.
> **Command Center §8.6 built:** `GET /api/v1/command` returns nine evidence-backed
> widgets, including Plan-18 `chat_loop`, with `{source, artifact_path, commit, run_at, verified}` envelopes; React
> `/command` page has executive briefing VI/EN, live governance ticker, and evidence drawer.
> **Deploy scaffold + local-prod smoke:** `Dockerfile.control-panel-api`,
> `Dockerfile.control-panel-ui`, `docker-compose.control-panel.yml`,
> `docker-compose.control-panel.local.yml`, `nginx/control-panel.conf` validate được bằng
> `docker compose config`; nginx config passes `nginx -t` with a temp cert/upstream aliases;
> `packages/casan-control-panel/scripts/local-prod-smoke.sh` passes
> `CP_LOCAL_SMOKE_PASS https_oidc=true actor=oidc-ops role=org-admin` and asserts
> `/api/v1/command` returns all 9 widgets with provenance envelopes.
> `prod-readiness-check.sh` validates managed-prod host prerequisites (compose, TLS,
> oauth2-proxy OIDC env, nginx) without printing secrets.
> `managed-prod-smoke.sh` validates deployed endpoint auth enforcement (unauth blocked,
> spoofed identity headers blocked) and, with a real IdP cookie jar, authenticated
> `/settings` + `/command` behavior.
> Local-prod now runs that managed smoke with the mock-IdP authenticated cookie jar and
> emits `CP_MANAGED_SMOKE_PASS actor=oidc-ops role=org-admin widgets=9`.
> Nginx `auth_request` overwrites identity headers and API maps IdP groups → RBAC roles.
> **Còn:** managed host/cert/enterprise IdP env thật (07 T2).
>
> Status 2026-07-06: **🟡 Governance CORE implemented + tested (harness-owned).**
> **Sửa kiến trúc:** Control Plane là **tài sản của core harness**, KHÔNG nằm trong app
> OKR (OKR chỉ là testbed được gen). Governance core đã dời vào harness:
> `packages/casan-harness/scripts/bash/control-plane-settings.py` (settings store versioned +
> audit hash-chain + deny-by-default + approval cho key nhạy cảm + rollback + verify),
> test `packages/casan-harness/tests/phase-control-plane-tests.sh` **7/0 (WSL)**, nối CI
> (`phase-control-plane`). Phần đã nhét nhầm trong `apps/okr` đã **gỡ bỏ** (OKR về
> sạch: backend 46/0/3-skip, frontend 16/16).
> **Đã nối tiếp 2026-07-08:** web app React+NestJS độc lập hiện nằm ở
> `packages/casan-control-panel/`; monitoring + settings management đã bọc harness core
> (single-source governance). Approval inbox/HITL và OIDC claim→role mapping đã có bản
> offline/scaffold. Còn lại: live deploy prod TLS/OIDC (07 TIER 2).
>
> Nhãn trạng thái: xem legend ở `CASAN_BACKLOG_STATUS.md`.
> Phụ thuộc: **07** (H5 audit, C4 approval/IdP, D3 dashboard hosting, kill-switch) ·
> **14** (RBAC — ai được xem/đổi gì) · **04** (đổi setting = proposal→approval→apply) ·
> **01** (đường dẫn sau restructure). **Chặn mềm** bởi 14 cho phần quản lý.
## 1. Quyết định kiến trúc — web app control-plane thật
> Repo đã có **frontend React + backend NestJS** thật. Control Plane là **web app
> thật** (admin/ops console) tích hợp vào stack hiện có. **Sàn tối thiểu = React +
> NestJS** (frontend + API thật) — không thấp hơn. **HTML tĩnh KHÔNG bao giờ được
> dùng làm control-plane.** Nếu cân nhắc bản nhẹ hơn, nó vẫn phải là web app thật
> (ví dụ SPA gọn + API tối thiểu), có đủ monitoring + settings API + governance —
> **không phải** trang tĩnh sinh sẵn. Dashboard HTML sinh sẵn hiện tại chỉ giữ vai
> trò **export/offline read-only**, không phải control-plane.
```mermaid
flowchart LR
UI["Ops Console (React)
monitor + manage + settings"] --> API["Control-Plane API (NestJS)"]
API --> RBAC["RBAC (Plan-14)"]
API --> APPROVAL["Proposal→Approval (Plan-04 + 07-C4 IdP)"]
API --> AUDIT["H5 audit-chain (mọi thay đổi)"]
API --> STORE["Settings store
(versioned: policy/threshold/routing)"]
API --> READ["Read-only telemetry
(metrics/drift/incident/cost)"]
READ --> HARNESS["Core harness .specify/**"]
STORE --> HARNESS
style AUDIT fill:#fff3cd,stroke:#8a6d3b,stroke-width:2px
style RBAC fill:#d0e8ff,stroke:#2c3e91,stroke-width:2px
```
## 2. Nguyên tắc (governance-first)
- **Đọc ≠ Ghi:** phần **monitoring** đọc telemetry là read-only; phần **management**
(đổi settings/threshold/kill-switch) đi qua **RBAC + proposal→approval + H5 audit**.
- **Mọi thay đổi setting đều bất biến & rollback được:** ghi audit-chain (H5) +
version cũ→mới + actor + reason; hoàn tác qua H7 checkpoint.
- **Không nới lỏng bảo mật ngầm:** đổi setting kiểu "nới" (giảm ngưỡng chặn, tắt
gate) bắt buộc nhãn `security-sensitive` + duyệt cấp cao (tái dùng Plan-04 §4.8).
- **Không đường vòng qua UI:** UI không được bypass gate — nó chỉ ghi vào settings
store mà harness đọc; harness vẫn là nguồn quyết định cuối.
- **Fail-loud:** control-plane sập/không đọc được telemetry → hiển thị `STALE`/`503`,
không hiển thị số liệu cũ như thật (tái dùng `/healthz` stale-aware của D3).
## 3. Phạm vi tính năng
### 3.1 Monitoring (mở rộng từ D3 read-only)
| Nhóm | Nội dung | Nguồn |
|---|---|---|
| Harness verdicts | pass/fail từng gate H1→H7 theo run/step | `.specify/logs`, evidence pack |
| Cost & token | cost_per_run, token_saved, budget vs actual | H6 telemetry, provider-usage.jsonl |
| Drift & quality | drift-report, H3 reject rate, hallucination rate | drift-detect, business-kpi |
| Incident | incident severity, kill-switch state | incident.sh, kill-switch.sh |
| Traceability | REQ→code→test coverage (Plan-10) | traceability-matrix.json |
### 3.2 Management / Settings (mới — phần chính)
| Setting | Đối tượng file (harness đọc) | Ràng buộc đổi |
|---|---|---|
| Compression policy (Plan-08) | `compression-policy.yaml` | mode/ratio/exclude/must-keep; đổi → audit |
| Thresholds (cost/circuit/FP) | `thresholds.yaml` | siết = duyệt thường; nới = duyệt cấp cao |
| Model routing (Plan-03/02) | `model-fallback.yaml` | đổi provider/model → approval |
| Kill-switch (Plan-07 C7) | `kill-switch` scope | engage/disengage → HIGH audit + alert |
| Approval reviewers (Plan-07 C4) | `reviewers.registry` | chỉ org-admin (RBAC Plan-14) |
| Feature flags (bật/tắt track) | mới `feature-flags.yaml` | audit |
### 3.3 FinOps & SLO (gộp vào đây, không tách plan)
- Budget theo dự án/org + cảnh báo vượt; biểu đồ xu hướng cost/token.
- SLO/KPI platform (block_rate, FP, token_saved, time_to_approval…) — kế thừa Future B6.
### 3.4 Human-in-the-loop surface (hiện thân của "Human-led, AI-first" — FPT §4.3/§4.4)
> Control Plane là **nơi con người nhìn thấy & hành động** trong vòng lặp — làm cho
> tư tưởng Human-led, AI-first **hiển thị được**, không chỉ là approval token ngầm.
| Thành phần | Nội dung | Nguồn |
|---|---|---|
| **Approvals inbox** | Hàng đợi hành động **đang chờ người duyệt** (setting nhạy cảm, nới ngưỡng, kill-switch, self-improve proposal) → duyệt/từ chối kèm lý do; verify JWT (SEC-07), chống replay (X-06), SoD | control-plane-settings + approval-verify + self-improve |
| **Delegation level L0–L5** | Đặt **mức uỷ quyền AI per project/action** theo CASAN §4.4 (L1 người duyệt toàn bộ … L5 tự chủ vùng đã governance); mức quyết định hành động nào cần vào inbox | mới `delegation-policy.yaml` (managed qua Control Plane) |
| **Oversight log** | Nhật ký **ai duyệt/từ chối, khi nào, vì sao** + human-oversight events (kill-switch, override) — cho RAI report (Plan-15) | H5 audit + governance-report |
| **Pending gate view** | Hiển thị step đang bị chặn chờ người (REQUIRE_APPROVAL) + context để quyết | security-check/action-gate verdict |
**Tasks (bổ sung Plan-13):**
| Task | Việc | Verify |
|---|---|---|
| 13H.1 | `delegation-policy.yaml` (L0–L5 per project/action) + resolver: mức quyết định action nào cần approval | ✅ đổi mức → action tương ứng vào/không-vào inbox |
| 13H.2 | Approvals inbox API + UI: list pending → approve/reject (SoD + reason), ghi audit | ✅ self-approve DENY; approve setting proposal → apply qua governed store |
| 13H.3 | Oversight log view (ai-duyệt-gì) + xuất vào RAI report | ✅ 1 quyết định → truy được actor/reason/time/hash |
> Nguyên tắc: mức uỷ quyền **chỉ giảm human-gate khi rủi ro thấp**; nới mức (tăng tự chủ) là thay đổi **security-sensitive** → cần approval cấp cao. Đây là điểm nối trực tiếp giữa tư tưởng CASAN và bề mặt vận hành.
## 4. Tasks theo track
### Track 1 — Read-only monitoring API + console
| Task | Việc | Verify | Done |
|---|---|---|---|
| 13.1 | Control-Plane API (NestJS) đọc telemetry/audit/traceability (read-only) | GET trả metrics đúng nguồn | API đọc được |
| 13.2 | Ops Console (React) hiển thị verdicts/cost/drift/incident/traceability | render đúng số liệu, stale→badge | console xem được |
| 13.3 | Stale-aware `/healthz` + hiển thị `STALE` khi telemetry chết | ngắt telemetry → UI báo stale, không giả tươi | fail-loud |
### Track 2 — Settings store versioned + audit
| Task | Việc | Verify | Done |
|---|---|---|---|
| 13.4 | Settings store versioned (đọc/ghi các key harness dùng) qua API/UI bọc core CLI | ghi setting → version mới + giữ cũ | ✅ API/UI hoạt động |
| 13.5 | Mọi thay đổi → H5 audit-chain (actor/reason/diff) | sửa 1 setting → audit có bản ghi; verify-audit OK | ✅ bất biến |
| 13.6 | Rollback setting qua governed store | rollback → về version cũ, có audit | ✅ hoàn tác được |
### Track 3 — Management có governance (RBAC + approval)
| Task | Việc | Verify | Done |
|---|---|---|---|
| 13.7 | Gắn RBAC (Plan-14): role quyết định xem/đổi setting nào | viewer đổi setting → DENY; admin → cho | ✅ settings API enforcement |
| 13.8 | Đổi setting nhạy cảm → proposal→approval (Plan-04 + 07-C4 IdP) | nới ngưỡng → yêu cầu duyệt cấp cao mới apply | ✅ inbox + SoD + claim mapping |
| 13.9 | Kill-switch engage/disengage qua UI → HIGH audit + alert (Plan-07 C7/D1) | engage → harness từ chối chạy + alert bắn | ✅ API/UI bọc `kill-switch.sh` |
### Track 4 — FinOps / SLO / production deploy
| Task | Việc | Verify | Done |
|---|---|---|---|
| 13.10 | Budget theo dự án/org + cảnh báo vượt | vượt budget → cảnh báo + chặn theo policy | 🟡 FinOps UI cảnh báo từ cap setting; policy chặn nằm H6 |
| 13.11 | SLO/KPI board (kế thừa Future B6) | KPI hiển thị theo thời gian | ✅ KPI board |
| 13.12 | Deploy production-like: host + TLS + OIDC (nối Plan-07 T2.3/T2.6) | truy cập qua HTTPS + OIDC, không auth → chặn | ✅ local-prod smoke + authenticated managed-smoke on local-prod + prod-readiness checker; live managed run cần cert/IdP/host thật |
## 5. Red-team / test
| Test | Kỳ vọng |
|---|---|
| `adv-settings-change-no-audit` (đổi setting bỏ qua audit) | BLOCK / phát hiện mismatch |
| `adv-loosen-threshold-no-approval` (nới ngưỡng không duyệt) | DENY |
| `adv-viewer-writes-setting` (role thấp ghi setting) | DENY (RBAC) |
| `adv-ui-bypass-gate` (UI cố ghi verdict trực tiếp) | không thể — UI chỉ ghi settings store |
| `adv-stale-telemetry-shown-fresh` (telemetry chết vẫn hiện tươi) | UI báo STALE |
| `benign-settings-roundtrip` (đổi hợp lệ + rollback) | PASS + audit đầy đủ |
## 6. Tiêu chí HOÀN THÀNH
- [x] Monitoring đọc đúng telemetry, stale-aware, không giả số liệu.
- [x] Mọi thay đổi setting qua Control Panel: RBAC + (approval nếu nhạy cảm) + H5 audit + rollback được.
- [x] UI không bypass được gate; harness vẫn là nguồn quyết định cuối.
- [x] Các key settings đang whitelist trong `control-plane-settings.py` quản lý được qua console (compression/cost/model/security/kill-switch/loop); kill-switch UI có.
- [x] FinOps/SLO board đọc provider usage + business KPI artifact thật; thiếu budget cap thì báo chưa cấu hình.
- [x] Approval inbox + delegation L0-L5 + oversight log có API/UI và test SoD/apply.
- [x] Command Center §8.6 có API/UI: 9 widget evidence-backed (gồm `chat_loop`), provenance envelope, executive briefing VI/EN, live ticker, evidence drawer.
- [x] Local production-like deploy có TLS + OIDC + oauth2-proxy + nginx `auth_request`; smoke pass qua HTTPS.
- [x] Managed production readiness checker cho cert/host/enterprise IdP env thật.
- [x] Managed production endpoint smoke script cho unauth/spoof/authenticated-cookie checks.
- [x] Authenticated managed endpoint smoke pass trên local-prod HTTPS/OIDC endpoint (`CP_MANAGED_SMOKE_PASS actor=oidc-ops role=org-admin widgets=9`).
- [ ] Managed production deploy với cert/host/enterprise IdP thật (nối Plan-07 TIER 2).
- [x] Red-team mục 5 targeted xanh: control-plane 9/0 + HITL 9/0 + RBAC 12/0 + C7 15/0; full gate dài đã pass qua adversarial 44/0 nhưng A6 mất thời gian nên không claim full-gate xanh trong lượt này.
## 7. Ghi chú trung thực
- Control Plane **không** thay quyền quyết định của harness; nó là lớp quản trị + quan sát có governance.
- Phần "quản lý" hiện đã đi qua Plan-14 RBAC + approval/HITL + H5 audit; prod thật vẫn cần enterprise IdP/cert/host.
## 8. Kế hoạch thực thi — web app độc lập (historical baseline; đã build trong `packages/casan-control-panel/`)
> Governance core (settings + RBAC) nằm trong harness và test xanh. Web app là **lớp
> trình bày** bọc core, không chứa logic governance riêng. Baseline này đã được hiện thực
> trong `packages/casan-control-panel/`; §8.6 Command Center và Ask CASAN read-only
> đã có, các mục còn lại nên đi theo RAI view, Chat MVP-1 Operator, hoặc managed
> production rollout.
**Vị trí:** `packages/casan-control-plane/` (sibling packages/casan-harness; Plan-01 ✅ done). **KHÔNG** nằm trong `apps/okr`.
**Nguyên tắc:** NestJS API **không** chứa logic governance — mọi set/rollback/authz **gọi harness CLI** (`control-plane-settings.py`, `rbac-check.py`) để governance chỉ có **một nguồn** trong harness. UI role-gated. Harness vẫn là nguồn quyết định cuối.
**Cấu trúc & tasks:**
| Task | Việc | Verify |
|---|---|---|
| 13W.1 | `control-plane/api` (NestJS): `main.ts`, `app.module.ts`, `harness.service.ts` (exec `control-plane-settings.py` + `rbac-check.py` qua child_process), `control-plane.controller.ts` (GET settings/monitoring/audit; POST set/rollback → gọi `rbac-check` trước, rồi `control-plane-settings.py`) | ✅ `npm run console:build` |
| 13W.2 | `api/test/control-plane.e2e.test.ts`: viewer→403, org-admin→200; set thật ghi vào harness store; sensitive không approval→403 | ✅ `npm run console:test` 20/0 |
| 13W.3 | `control-plane/web` (Vite React): `App.tsx`, `MonitoringCards`/`SettingsTable` (tái tạo), `lib/api.ts` gọi API | ✅ vite build |
| 13W.4 | `web/src/__tests__/*.test.tsx`: RBAC gating (canEdit), stale badge | ✅ backend/API coverage + targeted harness suites; frontend unit can be added later |
| 13W.5 | Deploy prod: host + TLS + OIDC (nối Plan-07 T2.3/T2.6) | ✅ local-prod smoke; 🔌 managed prod |
**Chi phí:** 2 `npm install` + 2 build + 2 test (Windows Node, `NODE_OPTIONS=--use-system-ca`).
**Bất biến:** app độc lập, không đụng OKR/core harness 245/0.
---
## 8.6 CASAN Command Center — trực quan hóa TƯ TƯỞNG lõi cho lãnh đạo
> **Mục tiêu:** tư tưởng CASAN không chỉ nằm trong code mà **hiện rõ trên giao diện** —
> lãnh đạo nhìn phát **wow ngay**. Nhưng "wow" phải là **wow thực chất**: mọi con số
> đọc từ artifact thật của core, **click xuống được bằng chứng**. Đây là "kính buồng
> lái", **không phải áp phích**.
### Nguyên tắc bất di (chống "dashboard diễn")
1. **Real glass, not paint** — mỗi widget đọc từ artifact core ĐÃ CÓ (không bịa số).
2. **Provenance envelope bắt buộc** — mọi số kèm `{source, artifact_path, commit, run_at}`; UI hiển thị badge nguồn. Thiếu provenance → **không render số**, hiện "chưa có dữ liệu".
3. **Click-to-evidence khắp nơi** — click số → mở audit/trace/log gốc. Đây là điểm phân biệt sống còn với demo thường: *"Không tin? Bấm xem tận gốc."*
4. **Không vanity metric** — cấm widget mà data phải phỏng đoán (vd "ROI dự phóng"). Chỉ hiển thị cái core chứng minh được — nếu không, phá vỡ chính tư tưởng evidence-based.
5. **Fail-honest** — data cũ/không verify được → badge vàng "stale", audit hỏng → seal đỏ. Không bao giờ tô xanh khi chưa chứng thực.
### 8 widget — mỗi cái map 1 tư tưởng, gắn nguồn thật
| # | Widget | Tư tưởng CASAN | Artifact nguồn (đã có) | API |
|---|---|---|---|---|
| V1 | **Maturity gauge + radar H1–H7** (hero) | 5 mức CASAN + 7 thành phần harness | `phase3-real-run-scoring.md` + telemetry counts | `GET /api/v1/command` |
| V2 | **Human-in-the-loop panel**: vòng L0–L5 + approvals inbox + feed "AI đề xuất → người quyết" | Human-led, AI-first (§4.3/4.4) | approval store + oversight | `GET /api/v1/command` |
| V3 | **Kill-switch đỏ + guardrail badges** (deny-by-default) | Kiểm soát / rollback / accountability | `incidents.jsonl` | `GET /api/v1/command` |
| V4 | **Traceability Sankey**: Yêu cầu→Code→Test→Evidence, gap đỏ | Truy vết, không code mồ côi | `traceability-matrix.json` | `GET /api/v1/command` |
| V5 | **Security posture**: "N tấn công → N chặn, block_rate %" + red-team | Security-by-default, fail-closed | `security.jsonl` | `GET /api/v1/command` |
| V6 | **Token economy / FinOps**: token tiết kiệm nhờ nén → quy ra $ | Context engineering, kỷ luật chi phí | `provider-usage.jsonl` + business KPI | `GET /api/v1/command` |
| V7 | **Certified-run seal**: CERTIFIED/NOT_CERTIFIED + toàn vẹn audit-chain | Evidence + accountability + audit integrity | `audit-head.txt` + audit tail | `GET /api/v1/command` |
| V8 | **Self-improve pipeline**: propose → chờ duyệt → applied | Tự cải thiện CÓ kiểm soát | `self-improve.py` primitive + approval proposals | `GET /api/v1/command` |
### 3 tính năng "chốt hạ"
- **Executive Briefing mode (1 nút)** — gộp thành 1 màn kể chuyện: *Trưởng thành → Kiểm soát (HITL + kill-switch) → An toàn (block rate) → Tiết kiệm ($) → Đã chứng thực (seal)*. **Song ngữ VI/EN** cho lãnh đạo + đối tác quốc tế.
- **Live governance ticker** — dòng sự kiện chạy realtime: *"14:03 AI xin nới ngưỡng → Trưởng phòng TỪ CHỐI"*, *"14:05 Certified run #128 ✅"*. Biến governance trừu tượng thành thứ **nhìn thấy đang sống**.
- **Evidence drawer** — panel trượt ra khi click bất kỳ số nào: hiển thị artifact JSON gốc + commit + link chạy lại lệnh core sinh ra số đó.
### Data contract (để "wow thực chất")
- API **không tính toán governance** — chỉ **đọc & bọc** artifact/core telemetry hiện có; nguồn quyết định vẫn là harness.
- Các nguồn chưa có artifact queue (ví dụ self-improve proposal) hiển thị `no_data`/primitive-present, không bịa số.
- Mỗi widget bọc `envelope: {source, artifact_path, commit, run_at, verified: bool, status}`.
### Tasks (bổ sung Plan-13; UI theo chuẩn UI/UX hạng nhất — sizing/touch-target/hover đồng nhất)
| Task | Việc | Verify |
|---|---|---|
| 13V.0 | Chuẩn hóa envelope provenance trong Control API; core `--json` bổ sung sau khi có widget cần gọi CLI live | ✅ `commandCenter()` envelope có `source/artifact_path/commit/run_at/verified/status` |
| 13V.1 | API `GET /api/v1/command` gom 9 widget đọc-only, không ghi state | ✅ `console:test` contract 26/0 |
| 13V.2 | V1 Maturity gauge + radar H1–H7 (click widget → evidence drawer) | ✅ `/command` widget + drawer |
| 13V.3 | V2 HITL panel + approvals inbox/oversight | ✅ đọc approval store; thiếu artifact → `no_data` |
| 13V.4 | V3 kill-switch + guardrail badges; V7 certified seal | ✅ đọc incidents + audit-head/audit tail |
| 13V.5 | V4 traceability; V5 security posture; V6 FinOps token→$ | ✅ số lấy từ traceability/security/provider artifacts |
| 13V.6 | V8 self-improve pipeline | ✅ hiển thị primitive present + proposal nếu có trong inbox; không fabricate queue |
| 13V.7 | Executive Briefing mode (song ngữ VI/EN) + Live ticker + Evidence drawer dùng chung | ✅ `/command` page |
| 13V.8 | Provenance guard: thiếu source→`no_data`/`missing`, stale vẫn qua freshness | ✅ contract test + UI status badge |
| 13V.9 | Widget Loop/Chat chuyên sâu | ✅ `chat_loop` widget + ticker/budget/replay evidence drawer (Plan-18 Track 8.3) |
> **Hiện trạng:** Command Center baseline và Widget Loop/Chat chuyên sâu đã có. RAI view
> nằm ở Plan-15 follow-up, không còn chặn Plan-13 baseline.
---
_Liên quan: `CASAN_PLAN_07_PRODUCTION_HARDENING.md` (D3 dashboard, C4 IdP, C7 kill-switch, TIER 2 deploy) · `CASAN_PLAN_14_RBAC.md` (phân quyền) · `CASAN_PLAN_04_SELFIMPROVE.md` (proposal→approval) · `CASAN_PLAN_08_CONTEXT_COMPRESSION.md` (compression-policy là settings) · `CASAN_PLAN_15_RESPONSIBLE_AI_DATA_GOV.md` (RAI/data view)._