feat: update plan 16 sec14-26
This commit is contained in:
@@ -4,13 +4,13 @@
|
||||
> bước tiếp theo cụ thể + cờ phụ-thuộc-hạ-tầng, để **bất kỳ AI/người nào tiếp quản
|
||||
> 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.
|
||||
> Cập nhật lần cuối: 2026-07-07 · 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).
|
||||
> Test hiện tại: **218 PASS / 0 FAIL** trên 13 core harness suite; **Plan-16 security remediation 33 SEC suite = 181 PASS / 0 FAIL** (WSL, đã nối `ci-harness-gate.sh`); 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** (3 case cần Ollama live); `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).
|
||||
|
||||
@@ -56,11 +56,11 @@
|
||||
| **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. |
|
||||
| **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. **Đã thêm:** tenant data-boundary (SEC-23 23.13, org-admin A không đụng B) + **audit quyết định vào H5** (`CASAN_RBAC_AUDIT_LOG`, `phase-rbac-audit` 5/0). Còn: enforcement trong web app (13), ánh xạ IdP claim→role thật (07-C4). |
|
||||
| **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ế. |
|
||||
|
||||
| **16 Security audit remediation** | � P0/P1/P2 phần lớn done+test | **Remediation đã thực thi:** 28 SEC suite (151/0 WSL, nối `ci-harness-gate.sh`). Done: SEC-01..10, 12, 13, **14** (model-digest bỏ env-override ở prod/strict), 15, 16..21, **22** (trusted-time JWT `exp` ARCH-06 + tag proposal nguồn-không-tin ARCH-08), **26** (stored/second-order injection scan), 27..30, **23 Phase 1–5 offline** (multi-tenant: tenant-store+guard · per-tenant CP/audit/telemetry · RBAC data-boundary · tenant kill-switch/quota · ký registry · crypt at-rest per-tenant), **24 offline** (image digest-pin + ký workflow), **25 offline** (artifact attestation tested==deployed); **SEC-11 gộp vào SEC-17** (`CASAN_PROFILE=prod` enforce-by-default). **Còn 📋 planned (hạ tầng/process):** SEC-22 ARCH-10 (attestation ngoài) · SEC-23 23.11 (crypt qua Vault Transit) · **SEC-24 còn** (live CVE/OSV + scan image thật — offline image-pin/ký-workflow đã done) · **SEC-25 còn** (signed-commit enrollment + SLSA chain — offline artifact-attestation đã done). Chi tiết: `CASAN_PLAN_16` §0a/§2d. |
|
||||
| **18 Chat Console** | 📋 target arch xong · MVP-0 làm ngay | **Governed Chat Console** (cắt lát MVP chống lan man). **MVP-0 = Ask CASAN read-only** (Prompt Router `READ_ONLY/BLOCK`, context whitelist, H4 in/out, H5 audit, H6 token, trả lời kèm nguồn) — **không phụ thuộc Plan-17/14/SEC-23**, làm được ngay trên H4/H5/H6. Sau: MVP-1 operator (action-gate) → MVP-2 chat-as-loop + agent/skill (**cần Plan-17+14**) → MVP-3 multi-tenant (**cần SEC-23**). Bắt đầu: Track 0/1/2 (router+read-only+audit, WSL). Chi tiết: `CASAN_PLAN_18_CHAT_CONSOLE.md` §1b. |
|
||||
---
|
||||
|
||||
## Trần điểm & điều kiện lên "Strong (81+)"
|
||||
|
||||
@@ -74,6 +74,34 @@
|
||||
|---|---|---|---|
|
||||
| Docker Compose lab for Vault KMS, OIDC/JWKS IdP, MinIO Object Lock WORM, dashboard behind nginx basic auth, alert webhook, and provider billing API mock | [implemented+tested] (local-prod emulation; managed prod services still required for Strong claim) | `infra/local-prod/docker-compose.yml`, `infra-lab.sh` | phase-prod-infra-lab (2); `infra-lab verify` internal 7/0 |
|
||||
|
||||
### Phase 8 — Plan-16 security-audit remediation (P0/P1/P2) — mixed
|
||||
|
||||
> Adversarial audit of the harness scripts (`CASAN_PLAN_16`) turned into fixes.
|
||||
> Each control listed has an executable fail-able test in `.specify/tests/phase-sec*`
|
||||
> wired into `ci-harness-gate.sh`. **24 SEC suites = 118 checks, 0 fail (WSL).**
|
||||
|
||||
| ID | Control | Status | Where | Test |
|
||||
|---|---|---|---|---|
|
||||
| SEC-01 | **Unsigned = FAIL** in enforced mode (verify-audit-chain / verify-tool-audit / telemetry-integrity / evidence-pack): tamper→recompute→strip-sig no longer passes | [implemented+tested] | those verifiers (`CASAN_VERIFY_STRICT`/prod) | phase-sec01 (10) |
|
||||
| SEC-02 | **KMS-anchor** for heads, no local auto-gen key in enforced mode | [implemented+tested] | `vault-kms.sh`, `sign-audit-head.sh` | phase-sec02 (3) |
|
||||
| SEC-03 | **rollback-manager**: no `bash -c`, structured argv only (RCE closed) | [implemented+tested] | `rollback-manager.sh` | phase-sec03 (3) |
|
||||
| SEC-04 | **action-gate fail-closed**: Python RC checked, default DENY | [implemented+tested] | `action-gate.sh` | phase-sec04 (4) |
|
||||
| SEC-05 | **JSON-safe writers** (no log-injection forged records) | [implemented+tested] | `governance-check.sh`, `agent-metrics.sh`, `incident.sh` | phase-sec05 (4) |
|
||||
| SEC-06 | **Control-plane / governance-report signed head** (no false CERTIFIED) | [implemented+tested] | `control-plane-settings.py`, `governance-report.py` | phase-sec06 (5) |
|
||||
| SEC-07..10 | **Approval-JWT**, **pii fail-closed**, **input-caps/fail-closed read**, **non-spoofable identity** | [implemented+tested] | supply-chain/self-improve/CP · `pii-mask.py` · security-check/drift/compress · tool-registry/agent-metrics | phase-sec07/08/09/10 (7/4/7/5) |
|
||||
| SEC-11 | **Enforce-by-default** (tool-output-scan/kill-switch/preflight) | ✅ **consolidated into SEC-17** | `CASAN_PROFILE=prod` | phase-sec17 |
|
||||
| SEC-12..15 | **drift-invariant**, **SSRF allowlist**, **model-digest env-override ignored in prod** (SEC-14), **low-cluster** (typosquat≤2 / tool-exec fail-closed / nested schema recursion) | [implemented+tested] | drift-detect · provider-usage-fetch/JWKS/dashboard · `model-digest-check.sh` · supply-chain-scan/tool-exec/validate-tool-input | phase-sec12/13/14/15 (5/6/5/7) |
|
||||
| SEC-16..21 | **bundle-integrity** (ARCH-01), **prod-profile enforce-by-default** (ARCH-03), **test-integrity** (ARCH-02), **atomic-store flock** (ARCH-05), **toolchain path-pin** (ARCH-04), **model/run budget** (ARCH-07) | [implemented+tested] | `bundle-integrity.py`, `test-integrity.py`, atomic writes, `toolchain-verify.sh`, budget checks | phase-sec16..21 (6/6/5/4/5/4) |
|
||||
| SEC-27..30 | **log control-char strip** (X-02), **path-traversal realpath** (X-04), **audit fail-closed on disk-fail** (X-05), **approval-replay nonce/jti** (X-06) | [implemented+tested] | log writers, path-guard, audit append, `approval-verify.sh` | phase-sec27..30 (3/4/3/3) |
|
||||
| SEC-26 | **stored / second-order injection** (X-01): scan golden-runs/red-team corpus/traceability-map/requirement with H4 before prompt-load; stored injection → BLOCK, missing source → fail-closed | [implemented+tested] | `stored-content-scan.sh` (→ `artifact-scan.sh`) | phase-sec26 (5) |
|
||||
| SEC-22 | ARCH-06 **trusted-time for `exp`** (clock-skew defeated; file error fail-closed) + ARCH-08 **untrusted-telemetry tag** in self-improve (unsigned metrics → untrusted; enforced apply of an untrusted proposal BLOCKED). ARCH-10 external attestation is an external track (like TIER-2) | [implemented+tested] | `approval-verify.sh`, `self-improve.py` | phase-sec22 (9) |
|
||||
| SEC-23 | MT-01/02/03/04 **multi-tenant partition** (Phase 1–5 offline): tenant-store + cross-tenant guard + secure-by-default; per-tenant control-plane settings/audit-chain + telemetry; RBAC data-boundary + casan-harness tenant-scoping; tenant kill-switch + per-tenant cost/quota; **signed tenant registry** (unsigned/tampered/forged → refuse); **per-tenant encryption at rest** (local-key; tenant B cannot read tenant A's plaintext). Only 23.11 (Vault Transit non-exportable) needs infra | [implemented+tested] (offline; 23.11 KMS planned) | `tenant-store.sh`, `tenant-paths.sh`, `tenant-registry-verify.sh`, `tenant-crypt.sh`, `control-plane-settings.py`, `rbac-check.py`, `casan-harness.sh`, `kill-switch.sh`, `cost-spike-detect.sh` | phase-sec23-tenant-store (10), -state-isolation (9), -rbac-tenant (6), -scope (4), -registry-crypt (7) |
|
||||
| SEC-24 | SC-05/06 (offline): **image digest-pin lint** (reject floating tags) + **signed/verified CI workflow** (unsigned/tampered/forged → refuse). Live CVE/OSV + real image scan need infra | [partial] | `supply-chain-integrity.sh` | phase-sec24 (8) |
|
||||
| SEC-25 | SC-07 (offline): **build-artifact attestation** — sign artifact hash + verify tested==deployed (swap/forged/unsigned → refuse). Signed-commit enrollment + full SLSA chain need CI/key infra | [partial] | `artifact-attest.sh` | phase-sec25 (5) |
|
||||
| SEC-24 | SC-04/05/06: SCA + pin runner/base-image + signed workflow | [planned] | — | — |
|
||||
| SEC-25 | SC-07: signed commits + SLSA-style attestation | [planned] | — | — |
|
||||
| SEC-26 | X-01: scan golden/corpus/map with H4 on prompt-load (stored injection) | [implemented+tested] | `stored-content-scan.sh` | phase-sec26 (5) |
|
||||
|
||||
## 2. Test inventory (all suites)
|
||||
|
||||
| Suite | Checks | Purpose |
|
||||
@@ -94,12 +122,14 @@
|
||||
| `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-rbac-audit-tests.sh` | 5 | **New** — Plan-14 RBAC decision audit into an H5-style oversight log (ALLOW/DENY recorded, append-only, cross-tenant reason; opt-in `CASAN_RBAC_AUDIT_LOG`) |
|
||||
| `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** | **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. |
|
||||
| `phase-sec{01..30}` + `phase-sec23-tenant-store/-state-isolation/-rbac-tenant/-scope/-registry-crypt` + `phase-sec24` + `phase-sec25` (33 suites) | 181 | **New — Plan-16 security-audit remediation P0/P1/P2** (each control has a fail-able adversarial test; wired into `ci-harness-gate.sh`): SEC-01..21 P0/P1/arch controls; trusted-time for JWT exp + untrusted-telemetry tag (SEC-22, ARCH-06/08); **multi-tenant partition (SEC-23 Phase 1–5 offline, MT-01/02/03/04)**; **supply-chain image-pin + signed workflow (SEC-24 offline)**; **build-artifact attestation tested==deployed (SEC-25 offline)**; stored/second-order injection scan (SEC-26); log control-char strip, path-traversal, audit fail-closed, approval-replay nonce (SEC-27..30) |
|
||||
| **Total** | **466 core + 2 local-prod infra lab** | Baseline 79 preserved; +206 governance checks (traceability/compression/control-plane/RBAC/RBAC-audit/RAI/self-improve/governance-report/preflight) + **+181 Plan-16 SEC-remediation checks across 33 suites** (all fail-able; SEC-11⊂SEC-17; SEC-22 done ARCH-06/08 — ARCH-10 external; **SEC-23 Phase 1–5 offline done — only 23.11 Vault-KMS planned**; **SEC-24/25 offline slice done — live-CVE/image-scan + signed-commit/SLSA need infra**). Full-suite green verified on CI/Mac with Ollama+Docker; the deterministic new suites verify **in WSL** (msys+Python Windows path skew). Preflight wiring is opt-in (`CASAN_PREFLIGHT` default off). Direct `phase3-model-router-tests.sh` adds 11/0 (3 cases need live Ollama); `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.
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
- **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
|
||||
- **Core harness:** **218 core checks PASS / 0 FAIL**; **Plan-16 security remediation 24 SEC suite = 118 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 mục plan
|
||||
@@ -33,8 +33,9 @@
|
||||
| 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 |
|
||||
| 16 | `CASAN_PLAN_16_SECURITY_AUDIT_REMEDIATION.md` | Security audit core harness + kế hoạch vá (tamper-evidence/injection/fail-open) | � P0/P1/P2 done |
|
||||
| 17 | `CASAN_PLAN_17_LOOP_ENGINEERING.md` | Loop Engineering / Agentic Loop Governance (budget governor, convergence, verify-contract, loop trace/replay, meta-loop) | 📋 |
|
||||
| 18 | `CASAN_PLAN_18_CHAT_CONSOLE.md` | Governed Chat Console (target arch; cắt MVP: **MVP-0 Ask CASAN read-only** làm ngay → operator → chat-as-loop → multi-tenant) | 📋 MVP-0 ready |
|
||||
| Future | `CASAN_PLAN_FUTURE_PHASES.md` | Approval workflow, state machine, benchmark, memory, remediation, KPI | 💤 vision |
|
||||
|
||||
> **Không có plan số 11:** số 11 được bỏ trống có chủ ý — nhánh eval/traceability đã
|
||||
@@ -85,6 +86,9 @@ flowchart LR
|
||||
P13 --> P17["17 Loop Engineering<br/>Agentic Loop Governance"]
|
||||
P10X --> P17
|
||||
P04 --> P17
|
||||
P17 --> P18["18 Chat Console<br/>chat = governed loop-run"]
|
||||
P13 --> P18
|
||||
P14 --> P18
|
||||
style CORE fill:#d0e8ff,stroke:#2c3e91,stroke-width:2px
|
||||
style STRONG fill:#d0ffd0,stroke:#1e8449,stroke-width:2px
|
||||
```
|
||||
@@ -108,6 +112,7 @@ bash .specify/scripts/bash/infra-lab.sh verify
|
||||
|
||||
- `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_TEAM_ALLOCATION_3DEV.md` = phân công việc còn lại cho team 3 người (task nhỏ + dependency + waves).
|
||||
- `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
|
||||
|
||||
@@ -1,14 +1,35 @@
|
||||
# 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).
|
||||
> Status 2026-07-07: **🟢 remediation P0/P1/P2 phần lớn ĐÃ thực thi** (24 SEC suite,
|
||||
> **118 check fail-able, 0 fail** trong WSL, đã nối `ci-harness-gate.sh`). Phần dưới
|
||||
> vẫn giữ nguyên kết quả audit đối kháng + kế hoạch vá; các mục còn `📋 planned` là
|
||||
> hạ tầng/process lớn (multi-tenant, SCA/ký workflow, signed commits, stored-injection
|
||||
> scan, trusted-time/attestation ngoài). Mỗi task đã làm có test đối kháng fail-able.
|
||||
> Bất biến: giữ core harness không tụt; 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`.
|
||||
|
||||
## 0a. Trạng thái remediation (cập nhật 2026-07-07)
|
||||
|
||||
| Nhóm | Task | Trạng thái | Ghi chú |
|
||||
|---|---|:--:|---|
|
||||
| **P0** | SEC-01…06 | ✅ done+test | unsigned=FAIL · KMS-anchor · rollback no-`bash -c` · action-gate fail-closed · JSON-safe · CP/governance ký head |
|
||||
| **P1** | SEC-07, 08, 09, 10 | ✅ done+test | approval JWT · pii fail-closed · input-cap/fail-closed · identity không spoof |
|
||||
| **P1** | SEC-11 (enforce-by-default) | ✅ **gộp vào SEC-17** | `CASAN_PROFILE=prod` bật enforce mặc định (kill-switch/audit/CP), explicit `=0` vẫn thắng |
|
||||
| **P2** | SEC-12, 13, 15 | ✅ done+test | drift-invariant · SSRF allowlist · low-cluster (typosquat/tool-exec/validate-input) |
|
||||
| **P2** | SEC-14 (model-digest env-override) | ✅ done+test | prod/`CASAN_MODEL_DIGEST_STRICT=1` bỏ tin `CASAN_MODEL_DIGEST`; forged override → không OK (`phase-sec14` 5/0) |
|
||||
| **Arch** | SEC-16, 17, 18, 19, 20, 21 | ✅ done+test | bundle-integrity · prod-profile · test-integrity · atomic-store · toolchain-pin · model/run budget |
|
||||
| **X-layer** | SEC-27, 28, 29, 30 | ✅ done+test | log control-char strip · path-traversal · audit fail-closed · approval-replay nonce |
|
||||
| **X-01** | SEC-26 | ✅ done+test | quét golden/corpus/traceability-map/requirement bằng H4 khi nạp prompt; stored-injection → BLOCK, missing source → fail-closed (`phase-sec26` 5/0) |
|
||||
| **Arch** | SEC-22 (ARCH-06/08) | ✅ done+test | **trusted-time cho `exp`** (clock-skew vô hiệu, file lỗi→fail-closed) + **tag proposal nguồn-không-tin** (self-improve: telemetry chưa ký→untrusted; apply untrusted ở prod/strict→BLOCK); `phase-sec22` 9/0. ARCH-10 (attestation ngoài) là track ngoài như TIER-2 |
|
||||
| **MT** | SEC-23 | � done (offline) — chỉ còn 23.11 Vault (🔌) | Phase 1–5 offline xong: tenant-store+guard · per-tenant CP/audit/telemetry · RBAC data-boundary + harness wiring · tenant kill-switch + quota · **ký registry** (MT-04, unsigned/tampered/forged→refuse) · **crypt at-rest per-tenant local-key** (MT-02, B không đọc plaintext A). 5 suite `phase-sec23-*` = 36/0. 23.11 (Vault Transit non-exportable) cần infra — xem §2d |
|
||||
| **SC** | SEC-24 | � partial (offline) | **image digest-pin lint** (chặn `:latest`/floating tag) + **ký/verify workflow** CI (unsigned/tampered/forged→refuse); `phase-sec24` 8/0. Còn live CVE/OSV scan + image scan thật (cần infra) |
|
||||
| **SC** | SEC-25 | 🟡 partial (offline) | **artifact attestation**: ký hash build + verify **tested==deployed** (swap/forged/unsigned→refuse); `phase-sec25` 5/0. Còn signed-commit enrollment + SLSA chain đầy đủ (cần CI/key) |
|
||||
|
||||
> **Đọc tiếp:** bảng findings + kế hoạch chi tiết bên dưới giữ nguyên để tra cứu.
|
||||
> Cột "Trạng thái" ở trên là nguồn nhanh; số check chi tiết xem `CASAN_HARDENING_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,
|
||||
@@ -170,6 +191,60 @@ drift-detect **coarse** (chỉ char-similarity → **lật phủ định lọt**
|
||||
| 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 |
|
||||
|
||||
## 2d. SEC-23 — chia bước chi tiết (multi-tenant partition · MT-01..04)
|
||||
|
||||
> **Mục tiêu:** không còn state chung không phân vùng; run của tenant A **không đọc/sửa**
|
||||
> được state của B (kể cả khi bỏ qua RBAC tầng API bằng cách đụng thẳng file). Task lớn
|
||||
> (L) ⇒ chia **6 phase, 14 bước nhỏ**, mỗi bước có **test đối kháng fail-able** riêng, nối
|
||||
> `ci-harness-gate.sh`, giữ core harness không tụt. Verify **WSL**.
|
||||
>
|
||||
> **Nguyên tắc:** deny-by-default · secure-by-default ở `CASAN_PROFILE=prod` (thiếu tenant ⇒
|
||||
> fail-closed) · RBAC ở **cả tầng dữ liệu** không chỉ API · tái dùng `path-guard.sh`
|
||||
> (SEC-28), `sign-audit-head.sh`/KMS (SEC-02), atomic+flock (SEC-19).
|
||||
>
|
||||
> **Cờ:** 🟦 offline được ngay · 🔌 cần Vault/KMS (skip-aware).
|
||||
|
||||
### Phase 1 — Nền: tenant resolver + guard (🟦) — ✅ done (`tenant-store.sh` + `phase-sec23-tenant-store` 10/0, nối CI)
|
||||
| Bước | Việc | File | Test (fail-able) | Dep |
|
||||
|---|---|---|---|---|
|
||||
| 23.1 | `tenant-store.sh resolve <logical-name>` → path phân vùng `.specify/state/tenants/<tenant_id>/…` theo `CASAN_TENANT_ID`; validate id (allowlist charset, chặn `..`/`/`) | mới `tenant-store.sh` | 2 tenant → 2 path khác; id `../evil` → reject | — |
|
||||
| 23.2 | **Cross-tenant guard**: cho path yêu cầu + tenant hiện tại, từ chối truy cập partition tenant khác (realpath, phải nằm trong tenant-root của mình) | `tenant-store.sh guard` (nối `path-guard.sh`) | tenant A đọc/ghi path của B → DENY | 23.1 |
|
||||
| 23.3 | Tạo tenant-dir quyền **0700** (owner-only) — OS bổ trợ guard logic | `tenant-store.sh init` | mode dir = 0700 | 23.1 |
|
||||
| 23.12 | **Secure-by-default**: prod bắt buộc `CASAN_TENANT_ID`; thiếu ⇒ fail-closed (refuse). Dev có default tenant | `tenant-store.sh` | prod thiếu tenant → refuse; dev → default | 23.1 |
|
||||
|
||||
### Phase 2 — Chuyển state chung → per-tenant (🟦) — ✅ done. 23.4/23.5/23.6 (CP settings+audit-chain per-tenant qua `CASAN_TENANT_ID`; telemetry qua `tenant-paths.sh`) + **23.13** (casan-harness source `tenant-paths.sh`; RBAC data-boundary `rbac-check.py` — org-admin A không đụng B). `phase-sec23-state-isolation` 9/0 + `phase-sec23-rbac-tenant` 6/0
|
||||
| Bước | Việc | File | Test | Dep |
|
||||
|---|---|---|---|---|
|
||||
| 23.4 | **Audit chain per-tenant** (append/verify qua tenant-store) | nối `tool-audit-lib.sh`/`verify-audit-chain.sh` | chain A độc lập; B không đọc/ghi được audit A | 23.2 |
|
||||
| 23.5 | **Control-plane settings store per-tenant** | nối `control-plane-settings.py` | đổi setting A không ảnh hưởng B | 23.2 |
|
||||
| 23.6 | **Telemetry/metrics + logs per-tenant** | nối `agent-metrics.sh`/`casan-log.sh` | telemetry A tách khỏi B | 23.2 |
|
||||
| 23.13 | Wire tenant-store vào `casan-harness.sh` + **RBAC data-layer**: quyết định RBAC còn chặn ranh giới tenant khi truy cập dữ liệu (không chỉ API) | nối `casan-harness.sh`, `rbac-check.py` | action RBAC-hợp-lệ ở A không đụng được dữ liệu B | 23.4, 23.5 |
|
||||
|
||||
### Phase 3 — MT-03 tài nguyên scope theo tenant (🟦) — ✅ done (23.7 tenant kill-switch: A halt không ảnh hưởng B; 23.8 per-tenant cost/quota: chi tiêu A không tính vào budget B; `phase-sec23-scope` 4/0)
|
||||
| Bước | Việc | File | Test | Dep |
|
||||
|---|---|---|---|---|
|
||||
| 23.7 | **Kill-switch scope tenant** (thêm scope `tenant` cạnh project/model/provider/global) | nối `kill-switch.sh`, `casan-harness.sh` | A engage tenant-switch → A refuse, B vẫn chạy | 23.1 |
|
||||
| 23.8 | **Cost/quota/budget per-tenant** (chống noisy-neighbor) | nối `cost-spike-detect.sh` | A burn budget → A capped, B không ảnh hưởng | 23.1 |
|
||||
|
||||
### Phase 4 — MT-04 ký registry (🟦) — ✅ done (`tenant-registry-verify.sh`: valid→OK; tampered/forged/**unsigned**→refuse fail-closed; `phase-sec23-registry-crypt` 23.9)
|
||||
| Bước | Việc | File | Test | Dep |
|
||||
|---|---|---|---|---|
|
||||
| 23.9 | Ký `project-registry.json`/tenant-registry + verify khi load; unsigned/forged → reject (tái dùng `sign-audit-head.sh`) | mới `tenant-registry-verify.sh` | registry giả/sửa → load DENY | 23.1 |
|
||||
|
||||
### Phase 5 — MT-02 mã hoá at-rest — 🟡 23.10 ✅ done offline (`tenant-crypt.sh`: khoá per-tenant, state A là ciphertext, B không giải mã được; `phase-sec23-registry-crypt` 23.10). **23.11 🔌 còn lại** (Vault Transit non-exportable, cần infra) per-tenant
|
||||
| Bước | Việc | File | Test | Dep | Cờ |
|
||||
|---|---|---|---|---|:--:|
|
||||
| 23.10 | Mã hoá state nhạy cảm (audit/telemetry) at-rest bằng **khoá local per-tenant** (KMS-ready) → admin/tenant A không đọc plaintext của B | mới `tenant-crypt.sh` | audit B trên đĩa là ciphertext; A không giải mã được | 23.4 | 🟦 |
|
||||
| 23.11 | Khoá per-tenant qua **Vault Transit** (non-exportable) — bản production | nối `vault-kms.sh` | khoá theo tenant, non-exportable (live/skip) | 23.10 | 🔌 |
|
||||
|
||||
### Phase 6 — Nối CI & chốt (🟦)
|
||||
| Bước | Việc | File | Test | Dep |
|
||||
|---|---|---|---|---|
|
||||
| 23.14 | Nối `phase-sec23-*` vào `ci-harness-gate.sh` + cập nhật tổng test (`CASAN_HARDENING_STATUS.md`) + trạng thái (`CASAN_BACKLOG_STATUS.md`, §0a) | `ci-harness-gate.sh` | full SEC xanh WSL; số check không tụt | tất cả 23.x |
|
||||
|
||||
**Thứ tự thực thi đề xuất:** Phase 1 → 2 → 3/4 (song song được) → 5 → 6. Phần **offline (Phase 1–4 + 23.10)** làm ngay không cần infra; chỉ **23.11 (Vault)** là 🔌 skip-aware.
|
||||
**Gợi ý test files:** `phase-sec23-tenant-store`, `phase-sec23-audit-isolation`, `phase-sec23-killswitch-scope`, `phase-sec23-registry-sign`, `phase-sec23-crypt`. Mỗi suite deterministic, hermetic (temp tenant roots).
|
||||
|
||||
## 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.
|
||||
|
||||
@@ -0,0 +1,367 @@
|
||||
# KẾ HOẠCH 18 — Governed Chat Console (Chat-as-Loop qua Control Plane)
|
||||
|
||||
> Status 2026-07-07: **📋 planned — CHƯA implement.** Plan thiết kế; không có code
|
||||
> trong đợt này. Mục tiêu: thêm **cửa sổ chat** vào Control Plane (Plan-13) như một
|
||||
> **bề mặt tương tác của core harness** — mỗi lượt chat là **một loop-run được
|
||||
> governance** (Plan-17), đi qua đúng H1→H7, không có đường vòng. Đây **không** phải
|
||||
> một chatbot; nó là **governed agent console**.
|
||||
>
|
||||
> Nhãn trạng thái: xem legend ở `CASAN_BACKLOG_STATUS.md`.
|
||||
> Phụ thuộc: **17** (Loop Contract — turn = loop-run; budget/convergence/verify/trace) ·
|
||||
> **13** (Control Plane — API bọc harness, HITL inbox §3.4, Command Center §8.6) ·
|
||||
> **14** (RBAC — ai được chat/chọn agent nào) · **16** (fail-closed, approval JWT thật,
|
||||
> secure-by-default, tamper-evidence — Plan-18 PHẢI tuân) · **03/02** (model-router +
|
||||
> skill/agent) · **08** (nén context giữa vòng) · **07** (H5 audit, C4 approval, C7
|
||||
> kill-switch). **Chặn cứng multi-user:** SEC-23 (tenant-partition) — chat state là
|
||||
> per-tenant, không được dùng file chung.
|
||||
>
|
||||
> **⚠️ Scope note (chống lan man — đọc trước khi implement):** file này mô tả **target
|
||||
> architecture** cho Governed Chat Console production. **KHÔNG implement toàn bộ một
|
||||
> lần.** MVP đầu tiên chỉ là **Ask CASAN — Read-only Evidence Assistant**: Prompt
|
||||
> Router chỉ `READ_ONLY/BLOCK/NOT_SUPPORTED`, context whitelist (Evidence Pack/reports/
|
||||
> docs), H4 scan in/out, H5 audit chat, H6 token tracking, trả lời **kèm nguồn
|
||||
> evidence**. Operator/Codegen/Agent-selection/Chat-as-loop/tenant-hardening làm **theo
|
||||
> phase sau** (xem §1b). Thứ tự bắt buộc: **MVP-0 → MVP-1 → MVP-2 → MVP-3**; không mở
|
||||
> khoá phase sau khi phase trước chưa xanh CI.
|
||||
|
||||
---
|
||||
|
||||
## 1. Bối cảnh — vì sao là "chat", vì sao qua harness
|
||||
|
||||
CASAN đã là **loop-engineering** (Plan-17): `observe→act→verify→correct` với gate mỗi
|
||||
vòng, budget, hội tụ, leo thang cho người. Nhưng bộ máy đó hiện **chạy batch/CLI** —
|
||||
con người không "ngồi trong vòng lặp". **Chat console** biến vòng lặp đó thành một
|
||||
**bề mặt hội thoại**: người nhập ý định → agent chạy một loop-run được governance →
|
||||
người thấy từng bước, duyệt khi cần, bấm dừng khi muốn.
|
||||
|
||||
**Ranh giới quyết định (nếu vi phạm thì đừng làm):**
|
||||
|
||||
| Chatbot thường (❌ không làm) | Governed Chat Console (✅ plan này) |
|
||||
|---|---|
|
||||
| Input → model → stream thẳng ra | Input → **H4 preflight/injection** → route → **act qua action-gate** → **H3/H4 verify** → mới lộ |
|
||||
| Tool call tự do | Mọi tool-call qua `action-gate` + `tool-exec` sandbox + tool-allowlist theo agent |
|
||||
| Chọn agent = tiện ích UI | Chọn agent = **quyết định routing được RBAC + approval + audit** |
|
||||
| Lịch sử = 1 file/log chung | Lịch sử **per-tenant** (SEC-23), hash-linked, replay được |
|
||||
| "Model nói xong là xong" | `DONE` chỉ hợp lệ khi verify đạt **success-criteria** (Plan-17 §3) |
|
||||
|
||||
> **Một câu:** chat không phải kênh mới để *né* harness; chat là **cửa để harness trở
|
||||
> nên hữu hình**. Giá trị nằm ở chỗ mỗi lượt đều **verify được, replay được,
|
||||
> click-to-evidence được**.
|
||||
|
||||
### Bám tư tưởng (FPT §4.3/§4.4/§14 · tư tưởng CASAN)
|
||||
- **Human-led, AI-first** hiện thân trực tiếp: chat là nơi con người **nhìn thấy &
|
||||
hành động** trong vòng lặp (nối Plan-13 §3.4 approvals inbox + delegation L0–L5).
|
||||
- **Core harness là lõi, không phải source-gen:** chat là **vỏ mỏng** trên harness
|
||||
core (single-source governance) — nó **không** thêm quyền phán quyết mới, không tái
|
||||
hiện gate. Ưu tiên vẫn là củng cố core (Index P1); chat đứng **sau** Plan-17.
|
||||
- **Governance-first, không "wow rỗng":** mọi số trên UI có provenance envelope
|
||||
(Plan-13 §8.6) — đọc từ artifact thật, không vanity.
|
||||
|
||||
---
|
||||
|
||||
## 1b. Lát cắt MVP & thứ tự thực thi (bắt buộc — chống scope-creep)
|
||||
|
||||
> Plan-18 = **target architecture**. Để làm gần mà không ngợp, cắt thành **4 lát**,
|
||||
> mỗi lát tự đứng được (shippable) và **không** mở khoá lát sau nếu lát trước chưa
|
||||
> xanh CI. Đây là phần chống "càng làm càng nhiều chức năng".
|
||||
|
||||
| MVP | Tên | Làm gì | KHÔNG làm | Phụ thuộc thêm | Tracks |
|
||||
|---|---|---|---|---|---|
|
||||
| **MVP-0** | **Ask CASAN** (Read-only Evidence Assistant) | Chat panel đọc **whitelist** (Evidence Pack/reports/docs); Prompt Router `READ_ONLY/BLOCK/NOT_SUPPORTED`; H4 scan in/out; H5 audit; H6 token; trả lời **kèm nguồn** | Không command · không file-write · không skill/agent exec · không tenant/RBAC nặng | **Không cần Plan-17/14/SEC-23** — chỉ H4/H5/H6 (đã có) + model-router read-only | 0 (rút gọn), 1, 2, M (tối thiểu), 7 (UI tối thiểu) |
|
||||
| **MVP-1** | **Operator** (registered actions) | Whitelist hành động an toàn: `run tests` / `build pack` / `verify pack` qua `action-gate` | Không codegen · không agent tự chọn · không loop tự chủ · không free-command | +Plan-07 action-gate/kill-switch | 3 |
|
||||
| **MVP-2** | **Chat-as-Loop + Agent/Skill** | Turn = loop-run (Plan-17); agent/skill selection (RBAC+allowlist); codegen qua H4; streaming draft-hold | Không multi-tenant production | **+Plan-17 (T1–T3), +Plan-14 RBAC** | 4, 5, 6, 8 |
|
||||
| **MVP-3** | **Multi-tenant governed production** | tenant-partition (SEC-23), per-tenant encrypt, approvals inbox đầy đủ, replay/verify-chain KMS | — | **+SEC-23, +Plan-07 TIER-2** | 9, 8 (đầy đủ) |
|
||||
|
||||
> **Quy tắc cổng:** MVP-0 **không** phụ thuộc Plan-17/14/SEC-23 ⇒ làm được ngay trên
|
||||
> nền hiện có. Loop-core (Plan-17) + RBAC (14) chỉ cần từ **MVP-2**; tenant-partition
|
||||
> (SEC-23) chỉ cần ở **MVP-3**. Một tính năng chỉ "thật" khi có test đối kháng xanh.
|
||||
|
||||
---
|
||||
|
||||
## 2. Nguyên tắc (bắt buộc — kế thừa Plan-16 + Plan-17)
|
||||
1. **Không đường vòng.** Chat input là input-vector trực tiếp ⇒ đi qua **cùng**
|
||||
`harness-preflight` (PII→cloud), `security-check`/H4, `context-assemble-scan`,
|
||||
`tool-output-scan` như mọi luồng khác. UI/API **không** được bypass gate.
|
||||
2. **Single-source governance.** Chat backend gọi lại `.specify/**` harness core (đúng
|
||||
mô hình "API bọc harness" của Plan-13). **Cấm** reimplement verdict ở tầng chat.
|
||||
3. **Secure-by-default = L1.** Mặc định người duyệt mọi hành động có side-effect;
|
||||
tăng tự chủ (L→L+1) là **security-sensitive** ⇒ approval JWT thật + SoD + versioned
|
||||
+ rollback (bài học ARCH-03/SEC-07). Profile `prod` bật enforce mặc định.
|
||||
4. **Fail-closed toàn diện.** Gate lỗi/timeout/không đọc được policy ⇒ **chặn lượt**
|
||||
(không "cứ trả lời"). Kế thừa SEC-04/SEC-09.
|
||||
5. **Tenant-partition từ ngày đầu.** `chat_id`/lịch sử/loop-trace phân vùng theo
|
||||
`tenant_id` + quyền FS; không file chung (MT-01/SEC-23). RBAC ở **cả tầng dữ liệu**,
|
||||
không chỉ API.
|
||||
6. **Streaming có kỷ luật.** Được stream **draft** nhưng gắn nhãn `UNCERTIFIED` tới khi
|
||||
H3/H4 pass; **side-effect/tool-call bị giữ** cho tới lúc pass (xem §3c).
|
||||
7. **Mọi lượt replay được.** Turn = loop-run ⇒ ghi vào loop-trace hash-linked (Plan-17
|
||||
Track 4). Không nhúng secret (chỉ `*_ref`).
|
||||
|
||||
---
|
||||
|
||||
## 3. Định nghĩa — "Chat Turn = Loop Run"
|
||||
|
||||
Một **chat** là chuỗi **turn**. **Mỗi turn = một loop-run của Plan-17** (không định
|
||||
nghĩa vòng lặp riêng — tái dùng Loop Contract §3 của Plan-17). Bản ghi bất biến:
|
||||
|
||||
```
|
||||
ChatTurn = {
|
||||
chat_id, tenant_id, turn_id, actor,
|
||||
user_msg_ref, # tham chiếu (không nhúng PII/secret thô)
|
||||
agent_selected, skill_selected,
|
||||
tool_allowlist, delegation_level, # bind theo agent (§3c)
|
||||
loop_run_id, # NỐI Plan-17: turn chạy như 1 loop-run
|
||||
preflight_verdict, # H4: PII→cloud / injection (PASS|DENY)
|
||||
iterations[], # từng Iteration theo Loop Contract (Plan-17 §3)
|
||||
output_ref, certified, # certified=false ('UNCERTIFIED') tới khi H3/H4 PASS
|
||||
decision # ANSWERED | ESCALATED | HALTED | DENIED
|
||||
}
|
||||
```
|
||||
|
||||
**Điều kiện kết thúc turn** (ánh xạ thẳng Plan-17 §3):
|
||||
- `ANSWERED` — verify đạt success-criteria ⇒ output `certified=true`.
|
||||
- `ESCALATED(human)` — gate DENY nghiêm trọng / stall rủi ro cao ⇒ vào approvals inbox
|
||||
(Plan-13 §3.4).
|
||||
- `HALTED` — budget governor (Plan-17 T1) / convergence (T2) / loop-breaker người bấm.
|
||||
- `DENIED` — RBAC/preflight chặn ngay từ đầu.
|
||||
|
||||
### 3a. Kiến trúc luồng một turn
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
U["User msg + chọn agent/skill"] --> RB{"RBAC (14):<br/>được chat + chọn agent này?"}
|
||||
RB -- no --> DEN["DENIED + lý do (audit)"]
|
||||
RB -- yes --> BIND["bind tool-allowlist + delegation_level (§3c)"]
|
||||
BIND --> PF{"H4 preflight:<br/>PII→cloud, injection scan"}
|
||||
PF -- DENY --> DEN
|
||||
PF -- PASS --> H1["H1 context assemble + compress (Plan-08, must-keep)"]
|
||||
H1 --> RT["model-router --role + agent (03/02)"]
|
||||
RT --> LOOP["loop-run.sh (Plan-17): observe→act→verify→correct"]
|
||||
LOOP --> ACT["act: tool-call → action-gate + tool-exec sandbox<br/>(chỉ tool trong allowlist)"]
|
||||
ACT --> VG{"loop-gate verify (Plan-17 T3):<br/>H3 eval + H4 security"}
|
||||
VG -- FAIL --> CORR["structured correction (bounded, T1)"] --> ACT
|
||||
VG -- DENY/sensitive --> ESC["ESCALATE → approvals inbox (13 §3.4)"]
|
||||
VG -- PASS --> REVEAL["reveal output (certified=true)"]
|
||||
LOOP -. draft .-> DRAFT["stream UNCERTIFIED (side-effect giữ) (§3c)"]
|
||||
REVEAL --> TR["loop-trace record (T4) + H5 audit (per-tenant)"]
|
||||
TR --> GOV{"budget governor (T1) + convergence (T2)"}
|
||||
GOV -- continue --> H1
|
||||
GOV -- DONE/HALT --> END["kết thúc turn (replayable)"]
|
||||
style VG fill:#fff3cd,stroke:#8a6d3b,stroke-width:2px
|
||||
style RB fill:#d0e8ff,stroke:#2c3e91,stroke-width:2px
|
||||
```
|
||||
|
||||
### 3b. Điểm căng đã quyết: **Streaming vs Verify-before-output**
|
||||
- **Read-only agent (L0):** cho **stream trực tiếp** (không side-effect) — vẫn qua
|
||||
preflight, output vẫn đi qua H3/H4 rồi mới `certified=true`.
|
||||
- **Agent có side-effect (≥L1):** **stream draft `UNCERTIFIED`** cho UX, nhưng **mọi
|
||||
tool-call/ghi file/exec bị GIỮ** đến khi `loop-gate` PASS; nếu DENY → draft bị thu
|
||||
hồi, không có tác dụng phụ nào xảy ra.
|
||||
- **Bất biến:** draft **không bao giờ** được thực thi tool trước gate. "Nhìn thấy" ≠
|
||||
"đã làm".
|
||||
|
||||
### 3c. Chọn skill/agent = **routing được governance** (không phải dropdown tự do)
|
||||
- `agent-registry.yaml` (managed qua Control Plane, versioned + audit): mỗi agent khai
|
||||
báo `tool_allowlist`, `max_delegation_level`, `roles_allowed`, `model_role`.
|
||||
- Chọn agent ⇒ **bind** `tool_allowlist` + `delegation_level` cho turn đó; RBAC (14)
|
||||
quyết ai được chọn agent nào; chọn agent tự chủ cao hơn mức cho phép = **security-
|
||||
sensitive** ⇒ approval JWT thật + SoD.
|
||||
- Skill (code-gen) chạy **trong** allowlist của agent + vẫn qua H4 artifact-scan như
|
||||
Plan-02. Không có skill nào "thoát" gate.
|
||||
|
||||
### 3d. Prompt Mode Router (rule-first, model-assisted) — cổng phân loại TRƯỚC loop
|
||||
|
||||
> Không phải chat nào cũng cần một loop-run nặng. **Router phân loại ý định TRƯỚC**,
|
||||
> rồi mới quyết mức xử lý — read-only thì nhẹ, operator/codegen mới nặng. Đây là lý do
|
||||
> MVP-0 không cần Plan-17: `READ_ONLY` không kích hoạt loop-run.
|
||||
|
||||
| Mode | Ý nghĩa | Cho phép | Gate / mức | MVP |
|
||||
|---|---|---|---|:--:|
|
||||
| `READ_ONLY` | Hỏi–đáp trên evidence/doc whitelist | đọc context whitelist | H4 in/out, không side-effect | 0 |
|
||||
| `ANALYSIS` | Suy luận/tổng hợp không side-effect | đọc rộng hơn + reasoning | H4 in/out, L0 | 0/1 |
|
||||
| `OPERATOR` | Chạy hành động đã đăng ký | run/build/verify pack | action-gate + approval theo mức | 1 |
|
||||
| `CODEGEN` | Sinh/sửa mã | skill trong allowlist | H4 artifact-scan + loop-gate | 2 |
|
||||
| `ADMIN`/`GOVERNANCE` | Đổi settings/policy/delegation | control-plane-settings | approval JWT + SoD (security-sensitive) | 2/3 |
|
||||
| `BLOCK`/`NOT_SUPPORTED` | Injection / ngoài phạm vi / nguy hiểm | — | DENY + audit | 0 |
|
||||
|
||||
**Nguyên tắc router:**
|
||||
- **Rule-first, deterministic:** phân loại theo *requested-capabilities* + *denied-verbs*
|
||||
+ *bypass-terms* (regex/keyword), **không** phụ thuộc model.
|
||||
- **Model-assisted chỉ cho ca mơ hồ**, và **rule thắng nếu rủi ro cao hơn** (model nói
|
||||
`READ_ONLY` nhưng rule thấy `rm -rf`/`deploy`/`chmod` ⇒ giữ mức cao / `BLOCK`).
|
||||
- **Preview cho người:** UI hiện `mode phát hiện + risk + gates + có cần approval`.
|
||||
- **Fail-closed:** router lỗi / không đọc được policy ⇒ `BLOCK`; kết quả phân loại ghi
|
||||
vào H5 audit.
|
||||
|
||||
---
|
||||
|
||||
## 4. Tasks theo track (gắn nhãn MVP)
|
||||
|
||||
> Thứ tự đọc = thứ tự làm: **Router → Read-only → session/audit → operator → agent →
|
||||
> loop → streaming → API/UI → replay → tenant.** Mỗi track gắn nhãn MVP; **không** làm
|
||||
> track của MVP sau khi MVP trước chưa xanh CI. Tất cả verify trong **WSL** (deterministic).
|
||||
|
||||
### Track 0 — Prompt Mode Router `[MVP-0 rút gọn → đầy đủ ở MVP-1/2]`
|
||||
| Task | Việc | File | Verify (WSL) |
|
||||
|---|---|---|---|
|
||||
| 18.0.1 | Định nghĩa modes + policy map `mode→gate/mức` (READ_ONLY/ANALYSIS/OPERATOR/CODEGEN/ADMIN/BLOCK/NOT_SUPPORTED) | mới `config/prompt-modes.yaml` | schema validate; thiếu policy → BLOCK |
|
||||
| 18.0.2 | Classifier **deterministic**: requested-capabilities + denied-verbs + bypass-terms | mới `prompt-mode-router.py` | `rm -rf`/`deploy` → OPERATOR/BLOCK, không READ_ONLY |
|
||||
| 18.0.3 | Model-assisted **chỉ cho ca mơ hồ** (optional, skip-aware) | cùng file | không model → vẫn phân loại bằng rule |
|
||||
| 18.0.4 | **Rule thắng model** khi rule rủi ro cao hơn | cùng file | model=READ_ONLY + rule=OPERATOR → giữ OPERATOR |
|
||||
| 18.0.5 | Preview `{mode, risk, gates, needs_approval}` cho UI | cùng file | payload đúng cho từng mode |
|
||||
| 18.0.6 | Audit kết quả phân loại vào H5 (fail-closed: lỗi → BLOCK) | nối audit | router lỗi → BLOCK + audit |
|
||||
|
||||
### Track 1 — Read-only Ask CASAN (Evidence Assistant) `[MVP-0]`
|
||||
| Task | Việc | File | Verify (WSL) |
|
||||
|---|---|---|---|
|
||||
| 18.1.1 | Context **whitelist**: Evidence Pack + reports + docs (đọc-only, chặn path ngoài whitelist) | mới `chat-context-readonly.sh` | hỏi ngoài whitelist → không lộ |
|
||||
| 18.1.2 | Trả lời **kèm nguồn** (`answer + sources[]`, provenance envelope) | cùng file | mỗi câu trả lời có ≥1 source ref |
|
||||
| 18.1.3 | H4 scan **input + output**; H6 token tracking mỗi lượt | nối H4/H6 | injection → DENY; token ghi H6 |
|
||||
| 18.1.4 | Cấm tuyệt đối side-effect ở mode này (no command/no write/no skill) | guard | thử exec ở READ_ONLY → BLOCK |
|
||||
|
||||
### Track 2 — Chat session + audit trace `[MVP-0]`
|
||||
| Task | Việc | File | Verify (WSL) |
|
||||
|---|---|---|---|
|
||||
| 18.2.1 | Schema phiên `chat_id/turn_id/actor` (tenant-ready; MVP-0 single-tenant OK) | mới `config/chat-session.schema.json` | schema validate |
|
||||
| 18.2.2 | Ghi `ChatTurn` (§3) append-only, hash-linked H5 (không nhúng PII/secret, chỉ `*_ref`) | nối H5 audit | N turn → chain liên tục; secret không lộ |
|
||||
| 18.2.3 | PII mask trước khi lưu (nối `pii-mask.py`/RAI Plan-15) | nối `rai-guard.py` | msg có PII → audit đã mask |
|
||||
|
||||
### Track M — Model Provider Binding `[MVP-0 tối thiểu → lớn dần]`
|
||||
| Task | Việc | File | Verify (WSL) |
|
||||
|---|---|---|---|
|
||||
| 18.M.1 | `provider_id` per agent + `model_role` per skill; routing theo mode (nối Plan-03/02) | mới `config/model-providers.yaml` | mode → provider đúng |
|
||||
| 18.M.2 | Data policy `local/internal/cloud`: **PII/secret → cloud phải qua C3 guard** | nối `data-exfil-guard.sh` (C3) | PII→cloud không guard → BLOCK |
|
||||
| 18.M.3 | Credential ngoài repo (env/secret store), không commit | nối `secrets-scan.sh` | key trong repo → scan FAIL |
|
||||
| 18.M.4 | Provider-call audit + token/cost telemetry → H6 | nối H6 | mỗi call → có bản ghi cost |
|
||||
|
||||
### Track 3 — Operator mode (registered actions) `[MVP-1]`
|
||||
| Task | Việc | File | Verify (WSL) |
|
||||
|---|---|---|---|
|
||||
| 18.3.1 | Whitelist hành động: `run tests` / `build pack` / `verify pack` (đăng ký, **không** free-command) | mới `config/operator-actions.yaml` | lệnh ngoài whitelist → DENY |
|
||||
| 18.3.2 | Mỗi action qua `action-gate` (ALLOW/WARN/REQUIRE_APPROVAL/BLOCK) | nối `action-gate.sh` | destructive → REQUIRE_APPROVAL |
|
||||
| 18.3.3 | Kết quả action là artifact có provenance, hiển thị lại trong chat | cùng | action → evidence link |
|
||||
|
||||
### Track 4 — Agent/Skill selection governance `[MVP-2]`
|
||||
| Task | Việc | File | Verify (WSL) |
|
||||
|---|---|---|---|
|
||||
| 18.4.1 | `agent-registry.yaml` versioned (tool_allowlist, max_delegation, roles_allowed, model_role) + resolver bind theo turn | mới `config/agent-registry.yaml` | chọn agent → allowlist đúng |
|
||||
| 18.4.2 | RBAC gate chọn agent (14): role không đủ → DENY; vượt `max_delegation` → security-sensitive → approval | nối `rbac-check.py` | role thấp chọn agent tự chủ → DENY |
|
||||
| 18.4.3 | Tool-call runtime chỉ tool **trong allowlist**; ngoài → `action-gate` BLOCK | nối `action-gate.sh` | tool ngoài allowlist → BLOCK |
|
||||
| 18.4.4 | Skill code-gen chạy trong allowlist + H4 artifact-scan (Plan-02) trước output | nối `artifact-scan.sh` | skill sinh mã có injection → BLOCK |
|
||||
|
||||
### Track 5 — Chat-as-loop pipeline `[MVP-2]`
|
||||
| Task | Việc | File | Verify (WSL) |
|
||||
|---|---|---|---|
|
||||
| 18.5.1 | `chat-turn.sh` full: preflight → H1 context/compress → router → model-router → `loop-run.sh` → verify → trace (**gọi harness core, không reimplement**) | mới `chat-turn.sh` | bỏ 1 bước gate → test FAIL |
|
||||
| 18.5.2 | Turn = loop-run: budget governor + convergence + verify-contract (Plan-17 T1/T2/T3) | nối Plan-17 | runaway chat → HALT(budget) |
|
||||
| 18.5.3 | Preflight bắt buộc: `harness-preflight` + `context-assemble-scan` + `tool-output-scan`, fail-closed | nối H4 | injection trong msg → DENY |
|
||||
|
||||
### Track 6 — Streaming / verify reconciliation `[MVP-2]`
|
||||
| Task | Việc | File | Verify (WSL) |
|
||||
|---|---|---|---|
|
||||
| 18.6.1 | Kênh draft `UNCERTIFIED`: stream token nhưng **giữ** side-effect tới khi `loop-gate` PASS | `chat-turn.sh` + API | side-effect trước gate → không xảy ra |
|
||||
| 18.6.2 | DENY sau khi đã stream draft → **thu hồi** draft, turn `DENIED`, audit | cùng | draft bị DENY → không tác dụng phụ |
|
||||
| 18.6.3 | L0 read-only stream thẳng; ≥L1 bắt buộc draft-hold | resolver | L1 agent không stream-exec thẳng |
|
||||
|
||||
### Track 7 — Chat API (NestJS) + UI (React) trên Command Center `[MVP-0 tối thiểu → lớn dần]`
|
||||
| Task | Việc | File | Verify |
|
||||
|---|---|---|---|
|
||||
| 18.7.1 | Chat API (NestJS) **bọc** harness (MVP-0: endpoint read-only; single-source, không verdict riêng) | `control-plane/` (sau 01 → `packages/`) | API chỉ gọi harness |
|
||||
| 18.7.2 | Chat panel React + hiển thị **evidence sources** + badge `mode/risk` (Prompt Router preview) | Control Plane UI | render nguồn + mode đúng |
|
||||
| 18.7.3 | (MVP-2) agent/skill picker theo RBAC + badge `UNCERTIFIED/CERTIFIED` + nút **loop-breaker** + delegation-level | Control Plane UI | picker ẩn agent ngoài quyền |
|
||||
| 18.7.4 | Fail-loud: API/telemetry chết → UI `STALE/503` (tái dùng D3 `/healthz`) | nối Plan-07 D3 | ngắt backend → UI báo stale |
|
||||
|
||||
### Track 8 — Replay / Evidence / Command Center widgets `[MVP-2 → MVP-3]`
|
||||
| Task | Việc | File | Verify (WSL) |
|
||||
|---|---|---|---|
|
||||
| 18.8.1 | **Replay** một turn (verify lại artifact đã ghi) phát hiện tamper/non-determinism | nối `loop-trace.py replay` | sửa artifact turn → replay lệch |
|
||||
| 18.8.2 | `verify-chain` lịch sử chat (tamper-evidence, SEC-01/02, KMS khi TIER-2) | nối `loop-trace verify-chain` | sửa 1 turn → chain BREAK |
|
||||
| 18.8.3 | Widget **Chat/Loop** trên Command Center (13 §8.6): ticker per-iteration, budget gauge, click → Evidence drawer | nối Plan-13 §8.6 | số khớp fixture; click → evidence |
|
||||
| 18.8.4 | **Approvals/Escalation panel**: turn `ESCALATED` vào approvals inbox (13 §3.4), duyệt/từ chối (JWT + SoD + lý do) | nối Plan-13 §3.4 | escalate → pending; JWT giả → DENY |
|
||||
|
||||
### Track 9 — Multi-tenant hardening `[MVP-3]`
|
||||
| Task | Việc | File | Verify (WSL) |
|
||||
|---|---|---|---|
|
||||
| 18.9.1 | tenant-partition state + quyền FS (SEC-23); RBAC ở **cả tầng dữ liệu** | store per-tenant | tenant A không đọc/ghi state B |
|
||||
| 18.9.2 | per-tenant encrypt at-rest (MT-02) | nối KMS | admin A không đọc audit B |
|
||||
| 18.9.3 | quota / kill-switch scope theo tenant (MT-03) | nối kill-switch | 1 tenant burn budget không ảnh hưởng tenant khác |
|
||||
|
||||
---
|
||||
|
||||
## 5. Red-team / test (kế thừa phong cách adversarial-harness)
|
||||
| Test | Kỳ vọng |
|
||||
|---|---|
|
||||
| Injection trong chat msg (VI/JA/split/base64) | preflight/H4 → DENY, không tới model context |
|
||||
| Prompt Router: model=READ_ONLY nhưng msg có `rm -rf`/`deploy` | **rule thắng** → OPERATOR/BLOCK, không READ_ONLY |
|
||||
| Read-only hỏi tài liệu ngoài whitelist | không lộ nội dung ngoài whitelist |
|
||||
| PII/secret → cloud provider không qua C3 | BLOCK trước khi gọi provider |
|
||||
| Bypass-attempt: gọi API bỏ qua preflight | pipeline từ chối (không có đường vòng) |
|
||||
| Agent ngoài quyền (RBAC) | DENIED trước khi chạy |
|
||||
| Chọn delegation vượt mức (không approval) | security-sensitive → DENY tới khi có JWT + SoD |
|
||||
| Tool-call ngoài allowlist của agent | action-gate BLOCK |
|
||||
| Streaming abuse: side-effect trước gate | GIỮ; không tác dụng phụ; DENY → thu hồi draft |
|
||||
| Cross-tenant: chat A đọc lịch sử B | chặn ở tầng dữ liệu (SEC-23) |
|
||||
| Runaway chat (loop vô hạn) | HALT(budget) (Plan-17 T1) |
|
||||
| Self-declared done (model nói xong, verify fail) | KHÔNG `ANSWERED/certified` |
|
||||
| Replay tamper (sửa turn đã ghi) | replay lệch + chain BREAK |
|
||||
|
||||
**File test (theo MVP):** MVP-0 — `phase-chat-prompt-router-tests.sh`,
|
||||
`phase-chat-readonly-tests.sh`, `phase-chat-session-audit-tests.sh`; MVP-1 —
|
||||
`phase-chat-operator-tests.sh`; MVP-2 — `phase-chat-pipeline-tests.sh`,
|
||||
`phase-chat-agent-select-tests.sh`, `phase-chat-stream-hold-tests.sh`,
|
||||
`phase-chat-replay-tests.sh`; MVP-3 — `phase-chat-tenant-tests.sh`. Chạy **WSL**
|
||||
(deterministic, mock model; nhánh live cần Ollama SKIP-aware). Nối `ci-harness-gate.sh`;
|
||||
cập nhật tổng test ở `CASAN_HARDENING_STATUS.md`.
|
||||
|
||||
---
|
||||
|
||||
## 6. Tiêu chí hoàn thành (Definition of Done)
|
||||
|
||||
**MVP-0 (Ask CASAN read-only) — cổng ship đầu tiên:**
|
||||
- [ ] Prompt Router phân loại `READ_ONLY/BLOCK/NOT_SUPPORTED` deterministic; **rule thắng model**; router lỗi → BLOCK.
|
||||
- [ ] Chat chỉ đọc **whitelist**; hỏi ngoài whitelist không lộ; **không** command/write/skill.
|
||||
- [ ] H4 scan input+output; H5 audit mỗi lượt; H6 token tracking; PII→cloud chặn qua C3.
|
||||
- [ ] Trả lời **kèm ≥1 nguồn evidence**; UI hiện sources + badge mode/risk.
|
||||
- [ ] Suite MVP-0 xanh trong WSL, nối CI; không đụng OKR app.
|
||||
|
||||
**Full (target architecture) — DoD tổng:**
|
||||
- [ ] Turn chạy **đúng như một loop-run Plan-17** (không định nghĩa vòng lặp riêng).
|
||||
- [ ] **Không đường vòng:** test chứng minh bỏ bất kỳ gate nào (preflight/verify) → FAIL.
|
||||
- [ ] Chọn agent/skill qua **RBAC + allowlist**; nâng delegation cần **approval JWT + SoD**.
|
||||
- [ ] Streaming: side-effect **luôn** sau gate; draft DENY → thu hồi, không tác dụng phụ.
|
||||
- [ ] Chat state **per-tenant**; test cross-tenant bị chặn ở tầng dữ liệu.
|
||||
- [ ] Turn **replay được** + `verify-chain` phát hiện tamper.
|
||||
- [ ] API chỉ **bọc** harness (không verdict riêng); UI đọc **artifact thật** + click-to-evidence.
|
||||
- [ ] Không đụng OKR app; core harness giữ nguyên số test + thêm suite chat.
|
||||
|
||||
---
|
||||
|
||||
## 7. Ghi chú trung thực & Non-goals (không lan man)
|
||||
- **[mới] — 📋 chưa implement.** Plan mô tả thiết kế; chưa viết script trong đợt này.
|
||||
- **MVP-first (chống lan man):** **MVP-0 (Ask CASAN read-only) KHÔNG phụ thuộc Plan-17/
|
||||
14/SEC-23** — làm được ngay trên nền H4/H5/H6 hiện có. Chỉ **MVP-2 trở đi** (chat-as-
|
||||
loop + agent) mới cần Plan-17 (T1–T3) + Plan-14 RBAC; **MVP-3** mới cần SEC-23 tenant.
|
||||
Thứ tự bắt buộc: **MVP-0 → MVP-1 → MVP-2 → MVP-3**, không nhảy cóc.
|
||||
- **Phụ thuộc cứng Plan-16:** enforcement chỉ "thật" khi approval JWT thật (SEC-07),
|
||||
fail-closed (SEC-04/09), secure-by-default (SEC-17), tamper-evidence (SEC-01/02) đã vá.
|
||||
- **Non-goals (KHÔNG làm trong plan này):**
|
||||
- Không làm chatbot đa mục đích/khách hàng cuối; đây là **ops/dev console** nội bộ.
|
||||
- Không thêm quyền phán quyết mới ở tầng chat (single-source harness).
|
||||
- Không tự sinh agent/skill mới ngoài `agent-registry` đã governance.
|
||||
- Không stream side-effect; không autonomous-by-default.
|
||||
- Không thay thế core harness track — chat là **vỏ mỏng**, đứng sau core (Index P1).
|
||||
- **Rẻ + verify offline trước:** bắt đầu **Track 0 (18.0.x Prompt Router)** + **Track 1
|
||||
(18.1.x Read-only Ask CASAN)** + **Track 2 (18.2.x session/audit)** — thuần bash/python,
|
||||
deterministic, mock model, WSL; không cần Plan-17/14/infra. Đây chính là **MVP-0**.
|
||||
- **Giá trị định vị:** biến core harness thành **bề mặt hội thoại có governance** —
|
||||
câu chuyện "wow thực chất": mỗi lượt chat **verify được, replay được, click-to-
|
||||
evidence được**, và là hiện thân trực tiếp của **Human-led, AI-first**.
|
||||
|
||||
---
|
||||
_Liên quan: `CASAN_PLAN_17_LOOP_ENGINEERING.md` (Loop Contract — turn = loop-run) ·
|
||||
`CASAN_PLAN_13_CONTROL_PLANE.md` (§3.4 HITL inbox, §8.6 Command Center, API bọc harness) ·
|
||||
`CASAN_PLAN_14_RBAC.md` (ai được chat/chọn agent) · `CASAN_PLAN_16_SECURITY_AUDIT_REMEDIATION.md`
|
||||
(fail-closed, approval JWT thật, tamper-evidence, SEC-23 tenant-partition) ·
|
||||
`CASAN_PLAN_03_CLOUD_PATCH.md` + `CASAN_PLAN_02_LLM_SOURCEGEN.md` (model-router + skill/agent) ·
|
||||
`CASAN_PLAN_08_CONTEXT_COMPRESSION.md` (nén context giữa vòng) ·
|
||||
`CASAN_PLAN_07_PRODUCTION_HARDENING.md` (H5 audit, C4 approval, C7 kill-switch, D3 fail-loud)._
|
||||
@@ -0,0 +1,220 @@
|
||||
# CASAN — Phân công team 3 người (Task Allocation & Dependency Map)
|
||||
|
||||
> Cập nhật: 2026-07-07. File này **chia toàn bộ việc còn lại** (từ `CASAN_BACKLOG_STATUS.md`
|
||||
> + các plan) cho **3 dev**, với **task nhỏ có ID**, **mức liên quan (dependency)** giữa
|
||||
> các task, và **link tới từng plan**. Đây là file điều phối — "còn gì phải làm" vẫn lấy
|
||||
> chuẩn từ [`CASAN_BACKLOG_STATUS.md`](CASAN_BACKLOG_STATUS.md); mục lục plan ở
|
||||
> [`CASAN_PLAN_00_INDEX.md`](CASAN_PLAN_00_INDEX.md).
|
||||
|
||||
## Cách đọc & quy ước
|
||||
|
||||
- **Người:** **A** = Harness Guardian (core harness/security/CI/eval) · **B** = Loop & Chat
|
||||
(Plan-17 + Plan-18 + nén) · **C** = Platform & Control Plane (13/14/15/01/06/12 + infra).
|
||||
- **Effort:** `S` ≤1 ngày · `M` 2–4 ngày · `L` ≥1 tuần.
|
||||
- **Cờ:** 🟦 làm offline được ngay · 🔌 cần key/dịch vụ ngoài · 🔗 phụ thuộc người khác.
|
||||
- **Dep:** task phải xong trước (ID ở cột này). "—" = không chặn, làm song song được.
|
||||
- **Bất biến (mọi người):** giữ **218/0 core + 118/0 SEC** ([`CASAN_HARDENING_STATUS.md`](CASAN_HARDENING_STATUS.md));
|
||||
mỗi control mới có **test đối kháng fail-able**, verify **WSL**, nối
|
||||
[`ci-harness-gate.sh`](../AINative_OKR_CASAN5/.specify/scripts/bash/ci-harness-gate.sh);
|
||||
**không** sửa app OKR; không hardcode verdict; không bypass.
|
||||
|
||||
---
|
||||
|
||||
## 1. Chia vai (mission + plan sở hữu)
|
||||
|
||||
| Dev | Mission | Plan sở hữu chính |
|
||||
|---|---|---|
|
||||
| **A — Harness Guardian** | Giữ & siết core harness; đóng nợ security; biến CI thành bộ gác | [16](CASAN_PLAN_16_SECURITY_AUDIT_REMEDIATION.md) · [10](CASAN_PLAN_10_TRACEABILITY_EVAL.md) · [05](CASAN_PLAN_05_CICD.md) · [03](CASAN_PLAN_03_CLOUD_PATCH.md)/[02](CASAN_PLAN_02_LLM_SOURCEGEN.md) (phần verify) · [07](CASAN_PLAN_07_PRODUCTION_HARDENING.md) (KMS/WORM/tamper) |
|
||||
| **B — Loop & Chat** | Xây Agentic Loop Governance + Governed Chat Console MVP | [17](CASAN_PLAN_17_LOOP_ENGINEERING.md) · [18](CASAN_PLAN_18_CHAT_CONSOLE.md) · [08](CASAN_PLAN_08_CONTEXT_COMPRESSION.md) |
|
||||
| **C — Platform & Control Plane** | Console vận hành + multi-project reuse + infra | [13](CASAN_PLAN_13_CONTROL_PLANE.md) · [14](CASAN_PLAN_14_RBAC.md) · [15](CASAN_PLAN_15_RESPONSIBLE_AI_DATA_GOV.md) · [01](CASAN_PLAN_01_RESTRUCTURE.md) · [06](CASAN_PLAN_06_ONBOARD.md) · [12](CASAN_PLAN_12_DOMAIN_PACK.md) · [07](CASAN_PLAN_07_PRODUCTION_HARDENING.md) TIER-2 |
|
||||
|
||||
> Ưu tiên tổng thể theo [`CASAN_PLAN_00_INDEX.md`](CASAN_PLAN_00_INDEX.md): **core harness là P1**
|
||||
> (A giữ), TIER-2 infra là đòn bẩy điểm (C), loop/chat là hướng mới (B) nhưng **đứng sau** core.
|
||||
|
||||
---
|
||||
|
||||
## 2. Dev A — Harness Guardian (core/security/CI/eval)
|
||||
|
||||
| ID | Task nhỏ | Plan | Effort | Cờ | Dep |
|
||||
|---|---|---|:--:|:--:|---|
|
||||
| A1 | ✅ **done** — **SEC-26** stored-injection: quét `golden-runs`/`redteam-corpus`/`traceability-map`/requirement bằng H4 khi nạp prompt (`stored-content-scan.sh` + `phase-sec26` 5/0, nối CI) | [16 §2c X-01](CASAN_PLAN_16_SECURITY_AUDIT_REMEDIATION.md) | M | 🟦 | — |
|
||||
| A2 | ✅ **done** — **SEC-22**: trusted-time cho JWT `exp` (ARCH-06) + tag proposal nguồn-không-tin (ARCH-08, self-improve untrusted→BLOCK ở prod/strict). `approval-verify.sh` + `self-improve.py` + `phase-sec22` 9/0, nối CI. Còn ARCH-10 (attestation ngoài) = track ngoài như TIER-2 | [16 §2c ARCH-06/08](CASAN_PLAN_16_SECURITY_AUDIT_REMEDIATION.md) | M | 🟦 | — |
|
||||
| A3 | � **offline done** — **SEC-23** multi-tenant (MT-01..04), **6 phase / 14 bước** ([16 §2d](CASAN_PLAN_16_SECURITY_AUDIT_REMEDIATION.md)). **Phase 1–5 offline ✅** (tenant-store+guard · per-tenant CP/audit/telemetry · RBAC data-boundary+harness · tenant kill-switch+quota · ký registry · crypt at-rest per-tenant; 5 suite `phase-sec23-*` = 36/0, nối CI). **Chỉ còn 23.11** (crypt qua Vault Transit 🔌) | [16 §2d MT-01..04](CASAN_PLAN_16_SECURITY_AUDIT_REMEDIATION.md) | L | ✅ offline (23.11 🔌) | — |
|
||||
| A4 | 🟡 **partial (offline)** — **SEC-24**: image digest-pin lint + ký/verify CI workflow (`supply-chain-integrity.sh` + `phase-sec24` 8/0, nối CI). Còn live CVE/OSV scan + image scan thật (🔌 infra) | [16 §2c SC-04/05/06](CASAN_PLAN_16_SECURITY_AUDIT_REMEDIATION.md) | M | 🟦 offline (🔌 live) | — |
|
||||
| A5 | 🟡 **partial (offline)** — **SEC-25**: build-artifact attestation tested==deployed (`artifact-attest.sh` + `phase-sec25` 5/0, nối CI). Còn signed-commit enrollment + SLSA chain (🔌 CI/key) | [16 §2c SC-07](CASAN_PLAN_16_SECURITY_AUDIT_REMEDIATION.md) | M | 🟦 offline (🔌 live) | — |
|
||||
| A6 | **Plan-10 H3 eval-set độc lập** (nhiều model) + enrich symbol/line refs FR-02→FR-05 | [10](CASAN_PLAN_10_TRACEABILITY_EVAL.md) | M | 🟦 | — |
|
||||
| A7 | **KMS-anchor mặc định** (Vault Transit) cho mọi head + assert non-exportable; bỏ fallback khoá local ở prod | [07 B3](CASAN_PLAN_07_PRODUCTION_HARDENING.md) · [16 SEC-02](CASAN_PLAN_16_SECURITY_AUDIT_REMEDIATION.md) | M | 🔌 (Vault) | — |
|
||||
| A8 | **WORM thật** S3 Object Lock/QLDB + trusted timestamp thay ledger local | [07 C5](CASAN_PLAN_07_PRODUCTION_HARDENING.md) | M | 🔌 (AWS) | — |
|
||||
| A9 | **Plan-05 CI xanh trên runner thật** + bật Docker infra-lab + xử lý A6 chậm/treo | [05](CASAN_PLAN_05_CICD.md) | L | 🔌 (runner) | — |
|
||||
| A10 | **Release package** `fpt-casan-sdd-harness` (đóng gói + version) | [05](CASAN_PLAN_05_CICD.md) | M | 🟦 | A9 |
|
||||
| A11 | **Nối mọi suite mới của B/C vào CI** + giữ tổng test không tụt (gác ARCH-02 test-integrity) | [05](CASAN_PLAN_05_CICD.md) · [16 SEC-18](CASAN_PLAN_16_SECURITY_AUDIT_REMEDIATION.md) | S | 🔗 | B*, C* |
|
||||
|
||||
**A cung cấp cho B/C (interface):** tamper-evidence + audit-chain (`loop-trace` dùng lại),
|
||||
approval JWT thật ([16 SEC-07](CASAN_PLAN_16_SECURITY_AUDIT_REMEDIATION.md)), SEC-23 tenant-partition (Chat MVP-3, Control Plane multi-tenant).
|
||||
|
||||
---
|
||||
|
||||
## 3. Dev B — Loop & Chat (Plan-17 + Plan-18 + nén)
|
||||
|
||||
### 3.1 Loop Engineering ([Plan-17](CASAN_PLAN_17_LOOP_ENGINEERING.md))
|
||||
| ID | Task nhỏ | Plan | Effort | Cờ | Dep |
|
||||
|---|---|---|:--:|:--:|---|
|
||||
| B1 | **Loop Budget Governor** `loop-governor.py` + `loop-policy.yaml` (deny-by-default, fail-closed) | [17 T1 (17.1–17.4)](CASAN_PLAN_17_LOOP_ENGINEERING.md) | M | 🟦 | — |
|
||||
| B2 | **Convergence detector** `loop-convergence.py` (oscillation/no-progress/thrash) | [17 T2 (17.5–17.8)](CASAN_PLAN_17_LOOP_ENGINEERING.md) | M | 🟦 | — |
|
||||
| B3 | **Per-iteration Verify Contract** `loop-gate.py` (bọc H3+H4, correction bounded) | [17 T3 (17.9–17.12)](CASAN_PLAN_17_LOOP_ENGINEERING.md) | M | 🟦 | — |
|
||||
| B4 | **Loop Trace/Replay** `loop-trace.py` (append-only hash-linked, replay, verify-chain) | [17 T4 (17.13–17.16)](CASAN_PLAN_17_LOOP_ENGINEERING.md) | M | 🔗 | A7 |
|
||||
| B5 | **Meta-loop** mở `self-improve.py` sang loop-policy (propose≠apply, approval+SoD) | [17 T5 (17.17–17.19)](CASAN_PLAN_17_LOOP_ENGINEERING.md) · [04](CASAN_PLAN_04_SELFIMPROVE.md) | M | 🔗 | B1, A(SEC-07) |
|
||||
| B6 | **Orchestrator** `loop-run.sh` (gate→governor→convergence→trace) + nén giữa vòng | [17 T6 (17.20–17.21)](CASAN_PLAN_17_LOOP_ENGINEERING.md) | M | 🔗 | B1,B2,B3,B7 |
|
||||
|
||||
### 3.2 Context compression ([Plan-08](CASAN_PLAN_08_CONTEXT_COMPRESSION.md))
|
||||
| ID | Task nhỏ | Plan | Effort | Cờ | Dep |
|
||||
|---|---|---|:--:|:--:|---|
|
||||
| B7 | Track 1 nén INPUT + Track 2 nén VIEW liên-bước + nối H4/H5 pipeline | [08](CASAN_PLAN_08_CONTEXT_COMPRESSION.md) | M | 🟦 | — |
|
||||
| B8 | Track 4 abstractive (gated) | [08](CASAN_PLAN_08_CONTEXT_COMPRESSION.md) | M | 🟦 | B7 |
|
||||
|
||||
### 3.3 Chat Console ([Plan-18](CASAN_PLAN_18_CHAT_CONSOLE.md)) — theo lát cắt MVP
|
||||
| ID | Task nhỏ | Plan | Effort | Cờ | Dep |
|
||||
|---|---|---|:--:|:--:|---|
|
||||
| B9 | **MVP-0** Prompt Router (Track 0) + Read-only Ask CASAN (Track 1) + session/audit (Track 2) + model-provider tối thiểu (Track M) | [18 §1b, Track 0/1/2/M](CASAN_PLAN_18_CHAT_CONSOLE.md) | L | 🟦 | — |
|
||||
| B10 | **MVP-1** Operator mode registered actions (Track 3, qua `action-gate`) | [18 Track 3](CASAN_PLAN_18_CHAT_CONSOLE.md) | M | 🔗 | B9 |
|
||||
| B11 | **MVP-2** Chat-as-loop (Track 5) + Agent/Skill selection (Track 4) + streaming draft-hold (Track 6) | [18 Track 4/5/6](CASAN_PLAN_18_CHAT_CONSOLE.md) | L | 🔗 | B6, C7(RBAC), B10 |
|
||||
| B12 | **Widget Loop/Chat** trên Command Center (loop ticker/budget/replay drawer) | [17 (17.22)](CASAN_PLAN_17_LOOP_ENGINEERING.md) · [18 Track 8](CASAN_PLAN_18_CHAT_CONSOLE.md) | M | 🔗 | C5(Command Center) |
|
||||
| B13 | **MVP-3** multi-tenant chat hardening (Track 9) | [18 Track 9](CASAN_PLAN_18_CHAT_CONSOLE.md) | M | 🔗 | A3(SEC-23) |
|
||||
|
||||
---
|
||||
|
||||
## 4. Dev C — Platform & Control Plane
|
||||
|
||||
### 4.1 Control Plane web app ([Plan-13](CASAN_PLAN_13_CONTROL_PLANE.md))
|
||||
| ID | Task nhỏ | Plan | Effort | Cờ | Dep |
|
||||
|---|---|---|:--:|:--:|---|
|
||||
| C1 | **Track 1 read-only monitoring API (NestJS)** đọc telemetry/audit/traceability | [13 §4 Track 1 (13.1–13.3)](CASAN_PLAN_13_CONTROL_PLANE.md) | M | 🟦 | — |
|
||||
| C2 | **Ops Console (React)** verdicts/cost/drift/incident + stale-aware | [13 §4 Track 1](CASAN_PLAN_13_CONTROL_PLANE.md) | M | 🟦 | C1 |
|
||||
| C3 | **Track 2 settings store versioned + H5 audit + rollback** (13.4–13.6) | [13 §4 Track 2](CASAN_PLAN_13_CONTROL_PLANE.md) | M | 🔗 | A7(KMS) |
|
||||
| C4 | **HITL surface**: approvals inbox + delegation L0–L5 + oversight log (13H.1–13H.3) | [13 §3.4](CASAN_PLAN_13_CONTROL_PLANE.md) | L | 🔗 | C7, A(SEC-07) |
|
||||
| C5 | **Command Center §8.6** data-contract envelope (provenance) — nền cho widget của B | [13 §8.6](CASAN_PLAN_13_CONTROL_PLANE.md) | M | 🟦 | C1 |
|
||||
|
||||
### 4.2 RBAC + RAI ([Plan-14](CASAN_PLAN_14_RBAC.md) / [Plan-15](CASAN_PLAN_15_RESPONSIBLE_AI_DATA_GOV.md))
|
||||
| ID | Task nhỏ | Plan | Effort | Cờ | Dep |
|
||||
|---|---|---|:--:|:--:|---|
|
||||
| C6 | **IdP claim → role mapping** (07-C4) + enforcement trong web app | [14](CASAN_PLAN_14_RBAC.md) · [07 C4](CASAN_PLAN_07_PRODUCTION_HARDENING.md) | M | 🔌 (IdP) | — |
|
||||
| C7 | **RBAC enforcement API** (expose `rbac-check.py` cho B/chat) + audit quyết định vào H5 | [14](CASAN_PLAN_14_RBAC.md) | M | 🟦 | — |
|
||||
| C8 | **RAI view** trên Control Plane (retention/model-card/PII report) | [15](CASAN_PLAN_15_RESPONSIBLE_AI_DATA_GOV.md) | M | 🔗 | C2 |
|
||||
|
||||
### 4.3 Nền tảng & reuse ([Plan-01](CASAN_PLAN_01_RESTRUCTURE.md)/[06](CASAN_PLAN_06_ONBOARD.md)/[12](CASAN_PLAN_12_DOMAIN_PACK.md)) + infra ([Plan-07 TIER-2](CASAN_PLAN_07_PRODUCTION_HARDENING.md))
|
||||
| ID | Task nhỏ | Plan | Effort | Cờ | Dep |
|
||||
|---|---|---|:--:|:--:|---|
|
||||
| C9 | **Plan-01 restructure** Phase 0→6 (nhánh riêng, giữ 218/0) → `packages/casan-harness` | [01](CASAN_PLAN_01_RESTRUCTURE.md) | L | 🟦🔗 | (freeze window) |
|
||||
| C10 | **Plan-06 onboard dự án 2** qua `verify-harness-reuse.sh` (không sửa gate) | [06](CASAN_PLAN_06_ONBOARD.md) | M | 🔗 | C9 |
|
||||
| C11 | **Plan-12 Domain Pack SDK** (golden/corpus/policy theo domain khai báo) | [12](CASAN_PLAN_12_DOMAIN_PACK.md) | L | 🔗 | C9, C10 |
|
||||
| C12 | **TIER-2 infra**: dashboard TLS/OIDC + alert managed (Slack/PagerDuty) + billing API thật | [07 T2.3/2.4/2.5](CASAN_PLAN_07_PRODUCTION_HARDENING.md) | M | 🔌 | C2 |
|
||||
|
||||
---
|
||||
|
||||
## 5. Bản đồ phụ thuộc chéo (ai chặn ai)
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
subgraph A[Dev A — Harness/Security]
|
||||
A3[SEC-23 tenant]:::a
|
||||
A7[KMS anchor]:::a
|
||||
A9[CI xanh runner]:::a
|
||||
SEC07[approval JWT SEC-07]:::a
|
||||
end
|
||||
subgraph B[Dev B — Loop/Chat]
|
||||
B1[Governor]:::b
|
||||
B3[Verify contract]:::b
|
||||
B4[Loop trace]:::b
|
||||
B6[Orchestrator]:::b
|
||||
B9[Chat MVP-0]:::b
|
||||
B11[Chat MVP-2]:::b
|
||||
B12[Loop/Chat widget]:::b
|
||||
B13[Chat MVP-3]:::b
|
||||
end
|
||||
subgraph C[Dev C — Platform]
|
||||
C3[Settings store]:::c
|
||||
C5[Command Center §8.6]:::c
|
||||
C7[RBAC API]:::c
|
||||
C9[Restructure]:::c
|
||||
end
|
||||
|
||||
A7 --> B4
|
||||
SEC07 --> B5[Meta-loop]:::b
|
||||
B1 --> B6
|
||||
B3 --> B6
|
||||
B4 --> B6
|
||||
B6 --> B11
|
||||
C7 --> B11
|
||||
C5 --> B12
|
||||
A3 --> B13
|
||||
A7 --> C3
|
||||
SEC07 --> C4[Approvals inbox]:::c
|
||||
C7 --> C4
|
||||
A9 --> Release[A10 release pkg]:::a
|
||||
C9 --> Onboard[C10 onboard]:::c
|
||||
C9 --> Domain[C11 domain pack]:::c
|
||||
classDef a fill:#d0e8ff,stroke:#2c3e91;
|
||||
classDef b fill:#e8f8d0,stroke:#3e7a1e;
|
||||
classDef c fill:#ffe8d0,stroke:#8a5a1e;
|
||||
```
|
||||
|
||||
**Đọc nhanh:** B phụ thuộc A nhiều nhất ở **KMS (A7→B4)**, **approval (SEC-07→B5)** và
|
||||
**tenant (A3→B13)**; B phụ thuộc C ở **RBAC (C7→B11)** và **Command Center (C5→B12)**;
|
||||
C phụ thuộc A ở **KMS (A7→C3)** và **approval (SEC-07→C4)**.
|
||||
|
||||
---
|
||||
|
||||
## 6. Điểm đồng bộ (sync points — họp chốt interface, tránh va nhau)
|
||||
|
||||
| # | Chủ đề | Ai | Chốt gì |
|
||||
|---|---|---|---|
|
||||
| S1 | **Config namespace** `.specify/config/*` | A/B/C | `loop-policy.yaml` (B) · `agent-registry.yaml`/`prompt-modes.yaml`/`model-providers.yaml` (B) · settings store (C) · không trùng key/khoá |
|
||||
| S2 | **Audit-chain / tamper-evidence** | A→B,C | A định dạng head + verify-chain; B dùng cho `loop-trace`; C dùng cho control-plane audit — **một serializer, một verifier** |
|
||||
| S3 | **Approval contract (JWT+SoD)** | A→B,C | 1 đường `approval-verify.sh`; B (meta-loop) + C (settings/approvals inbox) gọi lại, không tự chế |
|
||||
| S4 | **RBAC contract** | C→A,B | `rbac-check.py` là nguồn; B (chat chọn agent) gọi; A đảm bảo trong CI |
|
||||
| S5 | **Command Center data-contract §8.6** | C→B | envelope `{source,artifact_path,commit,run_at,verified}` — widget Loop/Chat của B tuân theo |
|
||||
| S6 | **Restructure freeze** (Plan-01) | C→A,B | C9 chạy trên nhánh riêng; A/B **đóng băng path** trong cửa sổ merge để giữ 218/0 |
|
||||
|
||||
---
|
||||
|
||||
## 7. Thứ tự sóng (waves — song song hoá tối đa)
|
||||
|
||||
> Mỗi sóng ~2–3 tuần; kết thúc sóng phải **xanh CI** trước khi mở sóng sau.
|
||||
|
||||
| Sóng | Dev A | Dev B | Dev C |
|
||||
|---|---|---|---|
|
||||
| **Wave 1** (offline, không cần infra) | A1 SEC-26 · A2 SEC-22 · A3 SEC-23 · A6 H3 eval | B1 Governor · B2 Convergence · B3 Verify · B7 nén T1/T2 | C1 monitoring API · C2 console · C5 Command Center · C7 RBAC API |
|
||||
| **Wave 2** | A7 KMS · A9 CI runner · A11 nối suite mới | B4 Loop-trace · B6 Orchestrator · B9 **Chat MVP-0** · B8 nén T4 | C3 settings store · C6 IdP→role · C4 approvals inbox · C9 restructure |
|
||||
| **Wave 3** | A4 SEC-24 · A5 SEC-25 · A8 WORM · A10 release | B5 Meta-loop · B10 **MVP-1** · B11 **MVP-2** · B12 widget · B13 MVP-3 | C8 RAI view · C10 onboard · C11 domain pack · C12 TIER-2 infra |
|
||||
|
||||
**Song song trong Wave 1:** A/B/C độc lập hoàn toàn (không dep chéo) ⇒ khởi động nhanh nhất.
|
||||
**Nút cổ chai Wave 2:** A7 (KMS) mở khoá B4 + C3; C7 (RBAC) + C5 (Command Center) chuẩn bị cho B ở Wave 3.
|
||||
**Wave 3 hội tụ:** B11 cần B6+C7; B12 cần C5; B13 cần A3 → giữ đúng thứ tự.
|
||||
|
||||
---
|
||||
|
||||
## 8. Mốc hoàn thành theo sóng (Definition of Done)
|
||||
|
||||
- **W1 done:** core harness vẫn 218/0 + 118/0 SEC; +SEC-22/23/26 xanh; Loop T1–T3 xanh WSL; Control Plane read-only chạy + Command Center có data-contract.
|
||||
- **W2 done:** KMS-anchor mặc định + CI xanh trên runner thật; Loop-trace/replay + Orchestrator; **Chat MVP-0 (Ask CASAN read-only) demo được**; settings store + approvals inbox + restructure merge (giữ 218/0).
|
||||
- **W3 done:** SEC-24/25 + WORM + release package; Meta-loop; **Chat MVP-1/2** (operator + chat-as-loop) + widget; RAI view + onboard dự án 2 + domain pack + TIER-2 infra (nơi có key).
|
||||
|
||||
---
|
||||
|
||||
## 9. Rủi ro & ghi chú bàn giao
|
||||
|
||||
- **Chống lan man:** B bám **lát cắt MVP** của [Plan-18 §1b](CASAN_PLAN_18_CHAT_CONSOLE.md) — MVP-0 làm được ngay,
|
||||
**không** nhảy vào chat-as-loop/tenant trước khi Loop core (B6) + RBAC (C7) + SEC-23 (A3) sẵn sàng.
|
||||
- **Đơn người-điểm:** A là **nguồn đơn** cho tamper-evidence/approval/tenant → nếu A chậm,
|
||||
B4/B5/B13 + C3/C4 chậm theo. Ưu tiên A7 (KMS) + SEC-07 sớm trong Wave 1–2.
|
||||
- **Restructure (C9) rủi ro cao:** đụng nhiều path → nhánh riêng + freeze window (S6) +
|
||||
chạy full `ci-harness-gate.sh` trước khi merge.
|
||||
- **Cần key/infra (🔌):** A4/A5/A7/A8/A9, C6/C12, [Plan-03 live smoke](CASAN_PLAN_03_CLOUD_PATCH.md) — gom vào Wave 2–3,
|
||||
không chặn Wave 1. Nếu chưa có key: giữ Docker local-prod lab ([`infra-lab.sh`](../AINative_OKR_CASAN5/.specify/scripts/bash/infra-lab.sh)) làm bằng chứng.
|
||||
- **Bất biến bàn giao:** mỗi task đóng lại phải kèm test đối kháng fail-able + cập nhật
|
||||
[`CASAN_HARDENING_STATUS.md`](CASAN_HARDENING_STATUS.md) (tổng test) + [`CASAN_BACKLOG_STATUS.md`](CASAN_BACKLOG_STATUS.md) (trạng thái).
|
||||
|
||||
---
|
||||
_Liên quan: [`CASAN_PLAN_00_INDEX.md`](CASAN_PLAN_00_INDEX.md) (mục lục + ưu tiên) ·
|
||||
[`CASAN_BACKLOG_STATUS.md`](CASAN_BACKLOG_STATUS.md) (nguồn "còn gì phải làm") ·
|
||||
[`CASAN_HARDENING_STATUS.md`](CASAN_HARDENING_STATUS.md) (control đã có + tổng test)._
|
||||
Reference in New Issue
Block a user