diff --git a/docs/plans/CASAN_APPLY_REALESTATE_MATCHING.md b/docs/plans/CASAN_APPLY_REALESTATE_MATCHING.md index 3b336f7..d389b61 100644 --- a/docs/plans/CASAN_APPLY_REALESTATE_MATCHING.md +++ b/docs/plans/CASAN_APPLY_REALESTATE_MATCHING.md @@ -79,7 +79,7 @@ realestate-match/ hard_filter.py # luật cứng — deterministic, NGOÀI model ranker.py # gọi model qua model-router explainer.py # trích thuộc tính thật → evidence - harness/ -> (dùng .specify/scripts/bash của CASAN) + harness/ -> (dùng packages/casan-harness/scripts/bash của CASAN) artifacts/ # output + audit + evidence (append-only) ``` diff --git a/docs/plans/CASAN_BACKLOG_STATUS.md b/docs/plans/CASAN_BACKLOG_STATUS.md index 7cf41e2..a249448 100644 --- a/docs/plans/CASAN_BACKLOG_STATUS.md +++ b/docs/plans/CASAN_BACKLOG_STATUS.md @@ -26,9 +26,9 @@ | # | Hạng mục | Plan | Trạng thái | Bước tiếp theo | |---|---|---|:--:|---| -| 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.1 | **Model-digest pinning** (chống model bị tráo/poison) | 07 B4 / V16 | ✅ done+test | `packages/casan-harness/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.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 `apps/okr/domain/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) 🔌 @@ -49,14 +49,14 @@ | **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:` và `anthropic:` 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** | � 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. | +| **04 Self-improve** | � core done+test | `packages/casan-harness/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 | `packages/casan-harness/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 (🔓 **đã mở khoá** — 01 done) | 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 ✅. App mới chỉ cần `apps//domain/` + set `CASAN_DOMAIN_ROOT` (đã có `domain_root` per-project trong `project-registry.json`). | | **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. **Đã 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). | +| **12 Domain Pack SDK** | 📋 chưa bắt đầu (🔓 01 done, còn chờ 06) | Onboard bằng khai báo (golden/corpus/policy theo domain). Phụ thuộc 01 ✅, 06. | +| **01 Restructure** | ✅ **done+test (2026-07-08, merged main)** | Đã tách: harness code → `packages/casan-harness/`, domain OKR → `apps/okr/domain/`, runtime state ở `.specify/`; **app promote lên git root** (hết wrapper `AINative_OKR_CASAN5/`); facade `.specify` symlink **gỡ sạch** (hard cutoff); path resolve qua `casan-paths.sh` (marker walk-up). Full gate **PASS=64 FAIL=0 SKIP=3** từ cấu trúc mới. CI (`.gitea/workflows/ci.yml`) + docs đã đồng bộ. Mở khoá 06/12. Chi tiết: `CASAN_PLAN_01_RESTRUCTURE.md`. | +| **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: `packages/casan-harness/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: `packages/casan-harness/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. | | **17 Loop Engineering** | � T1–T6 done+test (offline) | **Agentic Loop Governance** — đủ 5 primitive + orchestrator (97/0 WSL, nối CI). T1 **Governor** (`loop-governor.py`; deny-by-default, no/corrupt policy→strict/HALT, on_exceed halt/escalate) 15/0; T2 **Convergence** (`loop-convergence.py`; repeat/thrash→OSCILLATING, flat→STALLED, fail-closed) 15/0; T3 **Verify Contract** (`loop-gate.py`; H4→DENY, unmet→FAIL, correction bounded→ESCALATE, no self-declared DONE) 20/0; T4 **Trace/Replay** (`loop-trace.py`; append-only hash-linked, edited→BREAK, tampered artifact→replay DRIFT) 16/0; T5 **Meta-loop** (`loop-metaloop.py`; propose≠apply, SoD, loosen>org_ceiling refused, apply qua governed CP store→đổi thật ceiling + rollback) 15/0; T6 **Orchestrator** (`loop-run.sh`; gate→governor→convergence→trace/turn, secure-by-default opt-out, nén giữa vòng) 16/0. State qua `CASAN_LOOP_STATE_ROOT` (repo `.specify/state` sạch). **Còn (infra):** T4 KMS-anchor head (A7 Vault), T6 widget Command Center (17.22, C5), live H3-judge. Chi tiết: `CASAN_PLAN_17_LOOP_ENGINEERING.md`. | @@ -72,12 +72,12 @@ Các mục này cần key/dịch vụ ngoài nên chưa nên claim production St ## Cách kiểm chứng nhanh (bất kỳ AI kế nào) ```bash -cd AINative_OKR_CASAN5 +cd "$(git rev-parse --show-toplevel)" # repo root (app promoted here) for s in run-casan4-harness adversarial-harness phase1-track-a phase2-track-c \ phase3-evidence-pack phase-h5-approval phase-h5-infra phase-h6-agentops \ phase-c7-incident phase-h4-multilingual phase-c6-sandbox phase-h4-split-inject \ phase10-traceability; do - bash .specify/tests/$s-tests.sh >/dev/null 2>&1 && echo "$s OK" || echo "$s FAIL"; done + bash packages/casan-harness/tests/$s-tests.sh >/dev/null 2>&1 && echo "$s OK" || echo "$s FAIL"; done # KMS live cần Vault dev; C6 live cần Docker (không có thì SKIP, không fail). -bash .specify/tests/phase-prod-infra-lab-tests.sh # starts/verifies local-prod Docker lab +bash packages/casan-harness/tests/phase-prod-infra-lab-tests.sh # starts/verifies local-prod Docker lab ``` diff --git a/docs/plans/CASAN_HARDENING_STATUS.md b/docs/plans/CASAN_HARDENING_STATUS.md index b98e883..6a5b4e3 100644 --- a/docs/plans/CASAN_HARDENING_STATUS.md +++ b/docs/plans/CASAN_HARDENING_STATUS.md @@ -65,8 +65,8 @@ | B1 | **Multilingual VI/JA injection (V2)**: VI/JA block-patterns (matched on raw UTF-8, anchored on the injection object) catch injections English regex missed, with 0 false positives on the benign VI/JA corpus | [implemented+tested] | `prompt-filter.yaml` (PI-VI-*, PI-JA-*) | phase-h4-multilingual (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**: 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) | +| 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`, `packages/casan-harness/security/model-digest.pin` | phase3-model-router (digest cases) | +| 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`, `apps/okr/domain/traceability-map.json`, `docs/output/casan/traceability-matrix.json` | phase10-traceability (6) | ### Phase 7 — Local production-like infra lab (Tier-2 emulation) — [implemented+tested] @@ -77,7 +77,7 @@ ### 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*` +> Each control listed has an executable fail-able test in `packages/casan-harness/tests/phase-sec*` > wired into `ci-harness-gate.sh`. **24 SEC suites = 118 checks, 0 fail (WSL).** | ID | Control | Status | Where | Test | diff --git a/docs/plans/CASAN_PLAN_00_INDEX.md b/docs/plans/CASAN_PLAN_00_INDEX.md index f3db836..fe95be6 100644 --- a/docs/plans/CASAN_PLAN_00_INDEX.md +++ b/docs/plans/CASAN_PLAN_00_INDEX.md @@ -19,7 +19,7 @@ | # | 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 | 📋 | +| 01 | `CASAN_PLAN_01_RESTRUCTURE.md` | Tái cấu trúc thư mục Phase 0→6 + tách package harness | ✅ (2026-07-08, merged main) | | 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` | 📋 | @@ -51,7 +51,7 @@ |:--:|---|---| | **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 | +| **P3** | ✅ **Plan-01 restructure DONE** (2026-07-08, merged main; gate 64/0/3) | Đã tách package harness (`packages/casan-harness`) + domain (`apps/okr/domain`) → **06/12 đã mở khoá** | | **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 | @@ -96,16 +96,16 @@ flowchart LR ## Lệnh kiểm chứng nhanh ```bash -cd AINative_OKR_CASAN5 +cd "$(git rev-parse --show-toplevel)" # repo root (app promoted here) for s in run-casan4-harness adversarial-harness phase1-track-a phase2-track-c \ phase3-evidence-pack phase-h5-approval phase-h5-infra phase-h6-agentops \ phase-c7-incident phase-h4-multilingual phase-c6-sandbox phase-h4-split-inject \ phase10-traceability; do - bash .specify/tests/$s-tests.sh >/dev/null 2>&1 && echo "$s OK" || echo "$s FAIL" + bash packages/casan-harness/tests/$s-tests.sh >/dev/null 2>&1 && echo "$s OK" || echo "$s FAIL" done -bash .specify/tests/phase-prod-infra-lab-tests.sh -bash .specify/scripts/bash/infra-lab.sh verify +bash packages/casan-harness/tests/phase-prod-infra-lab-tests.sh +bash packages/casan-harness/scripts/bash/infra-lab.sh verify ``` ## Ghi chú cho AI tiếp theo diff --git a/docs/plans/CASAN_PLAN_03_CLOUD_PATCH.md b/docs/plans/CASAN_PLAN_03_CLOUD_PATCH.md index acc4e96..574e90c 100644 --- a/docs/plans/CASAN_PLAN_03_CLOUD_PATCH.md +++ b/docs/plans/CASAN_PLAN_03_CLOUD_PATCH.md @@ -9,7 +9,7 @@ | Capability | Where | Verification | |---|---|---| -| Model spec prefixes `openai:` and `anthropic:` | `.specify/scripts/bash/model-call.py` | `phase3-model-router-tests.sh` | +| Model spec prefixes `openai:` and `anthropic:` | `packages/casan-harness/scripts/bash/model-call.py` | `phase3-model-router-tests.sh` | | Endpoint allowlist/SSRF posture | Cloud hosts are hard-pinned to `api.openai.com` and `api.anthropic.com`; Ollama remains `127.0.0.1:11434` only | router SSRF test | | Honest unavailable state | Missing `OPENAI_API_KEY` / `ANTHROPIC_API_KEY` exits non-zero; no fake PASS or fake token usage | router cloud-unavailable test | | Real provider token usage path | OpenAI `usage.prompt_tokens/completion_tokens`; Anthropic `usage.input_tokens/output_tokens` | deterministic monkeypatched cloud parser test | @@ -19,14 +19,14 @@ ## How to run live when keys exist ```bash -cd AINative_OKR_CASAN5 +cd "$(git rev-parse --show-toplevel)" # repo root (app promoted here) export CASAN_MODEL_PRIMARY=openai:gpt-4o-mini export OPENAI_API_KEY=... -bash .specify/scripts/bash/model-router.sh /tmp/prompt.txt /tmp/out.json --role classify +bash packages/casan-harness/scripts/bash/model-router.sh /tmp/prompt.txt /tmp/out.json --role classify export CASAN_MODEL_PRIMARY=anthropic:claude-sonnet-4-5 export ANTHROPIC_API_KEY=... -bash .specify/scripts/bash/model-router.sh /tmp/prompt.txt /tmp/out.json --role judge +bash packages/casan-harness/scripts/bash/model-router.sh /tmp/prompt.txt /tmp/out.json --role judge ``` Expected evidence: diff --git a/docs/plans/CASAN_PLAN_04_SELFIMPROVE.md b/docs/plans/CASAN_PLAN_04_SELFIMPROVE.md index 6c645ed..d2f28a3 100644 --- a/docs/plans/CASAN_PLAN_04_SELFIMPROVE.md +++ b/docs/plans/CASAN_PLAN_04_SELFIMPROVE.md @@ -1,7 +1,7 @@ # KẾ HOẠCH 04 — Khép vòng tự cải tiến (`casan improve`) > Status 2026-07-06: **🟡 core implemented + tested (harness-owned).** -> `.specify/scripts/bash/self-improve.py`: `propose` đọc telemetry (metrics.jsonl + +> `packages/casan-harness/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` diff --git a/docs/plans/CASAN_PLAN_05_CICD.md b/docs/plans/CASAN_PLAN_05_CICD.md index 7eb9748..c0f61a1 100644 --- a/docs/plans/CASAN_PLAN_05_CICD.md +++ b/docs/plans/CASAN_PLAN_05_CICD.md @@ -9,7 +9,7 @@ | Capability | Where | Verification | |---|---|---| -| One-command harness CI gate | `.specify/scripts/bash/ci-harness-gate.sh` | `bash -n`; local suites are callable in safe order | +| One-command harness CI gate | `packages/casan-harness/scripts/bash/ci-harness-gate.sh` | `bash -n`; local suites are callable in safe order | | Safe test order | `run-casan4` runs first because it rewrites `.specify/logs`; hardening suites run after | script order | | Per-suite timeout | `CASAN_CI_STEP_TIMEOUT_SEC` protects CI from hung model/security subprocesses | full gate attempt exposed a long A6 run; timeout wrapper added | | Filtered local verification | `CASAN_CI_SUITE_FILTER='phase2-sourcegen|phase10-traceability'` | `CI_GATE_SUMMARY PASS=2 FAIL=0 SKIP=15` | @@ -59,10 +59,10 @@ Optional gate: ## Local commands ```bash -cd AINative_OKR_CASAN5 -bash -n .specify/scripts/bash/ci-harness-gate.sh -CASAN_CI_RUN_FRONTEND=1 CASAN_CI_RUN_INFRA_LAB=0 bash .specify/scripts/bash/ci-harness-gate.sh -CASAN_CI_RUN_INFRA_LAB=1 bash .specify/tests/phase-prod-infra-lab-tests.sh +cd "$(git rev-parse --show-toplevel)" # repo root (app promoted here) +bash -n packages/casan-harness/scripts/bash/ci-harness-gate.sh +CASAN_CI_RUN_FRONTEND=1 CASAN_CI_RUN_INFRA_LAB=0 bash packages/casan-harness/scripts/bash/ci-harness-gate.sh +CASAN_CI_RUN_INFRA_LAB=1 bash packages/casan-harness/tests/phase-prod-infra-lab-tests.sh ``` ## Notes diff --git a/docs/plans/CASAN_PLAN_06_ONBOARD.md b/docs/plans/CASAN_PLAN_06_ONBOARD.md index 3dd8e79..b25c227 100644 --- a/docs/plans/CASAN_PLAN_06_ONBOARD.md +++ b/docs/plans/CASAN_PLAN_06_ONBOARD.md @@ -2,7 +2,12 @@ > `project-registry.json` hiện có 1 dự án active (OKR) + 2 entry **demo** (A/B) [demo]. Kế hoạch: onboard **một dự án thật khác domain** để `verify-harness-reuse.sh` trả `HARNESS_REUSE_VALID` một cách có thật — bằng chứng harness tái dùng được. Task-level, chưa thực thi. > -> Phụ thuộc: **01** (package tách + config/domain), **05** (CI). Đây là mảng thuyết phục nhất về "tái sử dụng". +> Status 2026-07-08: **🔓 đã mở khoá** — Plan-01 ✅ done (harness = `packages/casan-harness/`, +> domain = `apps/okr/domain/`). Onboard app mới giờ chỉ cần: tạo `apps//domain/` +> (golden/corpus/input), thêm entry vào `project-registry.json` với `domain_root` riêng, set +> `CASAN_DOMAIN_ROOT` — KHÔNG sửa gate. Chưa thực thi (task-level). +> +> Phụ thuộc: **01** ✅ (package tách + config/domain — DONE), **05** (CI). Đây là mảng thuyết phục nhất về "tái sử dụng". ## Mục tiêu - Chọn 1 domain khác OKR (ví dụ: quản lý công việc/ticket, kho hàng, hoặc CRUD nghiệp vụ khác). @@ -20,7 +25,7 @@ | Task | Việc | File/Đối tượng | Verify | Done khi | |---|---|---|---|---| -| 6.1 | Chọn domain + viết `okr-requirement`-tương đương cho dự án 2 | mới `apps//docs/input/*.md` | có requirement + architecture | input sẵn sàng | +| 6.1 | Chọn domain + viết `okr-requirement`-tương đương cho dự án 2 | mới `apps//domain/input/*.md` | có requirement + architecture | input sẵn sàng | | 6.2 | Tạo `apps//` theo khuôn app (pipeline trỏ package) | mới | `casan run` gọi được | app khung chạy | | 6.3 | Nạp `config/thresholds.yaml` riêng (hoặc dùng default) | `apps//config` | override hoạt động | config áp đúng | | 6.4 | Tạo **golden-runs** cho artifact chính của domain 2 | `apps//domain/golden-runs/` | drift-detect có mốc | golden sẵn | diff --git a/docs/plans/CASAN_PLAN_08_CONTEXT_COMPRESSION.md b/docs/plans/CASAN_PLAN_08_CONTEXT_COMPRESSION.md index 017c5bd..bce27bd 100644 --- a/docs/plans/CASAN_PLAN_08_CONTEXT_COMPRESSION.md +++ b/docs/plans/CASAN_PLAN_08_CONTEXT_COMPRESSION.md @@ -3,10 +3,10 @@ > 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 +> `packages/casan-harness/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 +> fail-able. Test `packages/casan-harness/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. > @@ -73,10 +73,10 @@ Nén là **capability cắt ngang**, không phải harness thứ 8 (tránh phìn ## 6. Module layout (đề xuất) Trước restructure (hiện tại): ``` -.specify/scripts/bash/compress-context.sh # H1 owner -.specify/scripts/python/context-compress.py # extractive/structural/dedup -.specify/scripts/bash/token-budget-check.sh # H6 -.specify/scripts/python/verify-compression.py # H3 faithfulness + must-keep +packages/casan-harness/scripts/bash/compress-context.sh # H1 owner +packages/casan-harness/scripts/python/context-compress.py # extractive/structural/dedup +packages/casan-harness/scripts/bash/token-budget-check.sh # H6 +packages/casan-harness/scripts/python/verify-compression.py # H3 faithfulness + must-keep .specify/level5/compression-policy.yaml # mode, ratio, must-keep, budget ``` Sau restructure (khớp Plan 01): diff --git a/docs/plans/CASAN_PLAN_09_EVIDENCE_PACK.md b/docs/plans/CASAN_PLAN_09_EVIDENCE_PACK.md index f37b606..e53dadd 100644 --- a/docs/plans/CASAN_PLAN_09_EVIDENCE_PACK.md +++ b/docs/plans/CASAN_PLAN_09_EVIDENCE_PACK.md @@ -4,7 +4,7 @@ > > 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` +> Bổ sung **unified governance evidence report** `packages/casan-harness/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. diff --git a/docs/plans/CASAN_PLAN_10_TRACEABILITY_EVAL.md b/docs/plans/CASAN_PLAN_10_TRACEABILITY_EVAL.md index 18fdae4..b901112 100644 --- a/docs/plans/CASAN_PLAN_10_TRACEABILITY_EVAL.md +++ b/docs/plans/CASAN_PLAN_10_TRACEABILITY_EVAL.md @@ -8,8 +8,8 @@ | Capability | Where | Verification | |---|---|---| -| 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 | +| Parse `FR-*` from `apps/okr/domain/input/okr-requirement.md` | `packages/casan-harness/scripts/bash/traceability-matrix.py` | `phase10-traceability-tests.sh` | +| Declarative FR→code→test map | `apps/okr/domain/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 | @@ -20,16 +20,16 @@ ## Current result ```bash -python3 .specify/scripts/bash/traceability-matrix.py --gate +python3 packages/casan-harness/scripts/bash/traceability-matrix.py --gate # TRACEABILITY_MATRIX requirements=5 pass=5 fail=0 symbols=2/2 ... -bash .specify/tests/phase10-traceability-tests.sh # chạy trong WSL +bash packages/casan-harness/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` (nạp thêm `symbol_refs`, `missing_symbols`, `missing_lines`) +- `docs/output/casan/traceability-matrix.json` (nạp thêm `symbol_refs`, `missing_symbols`, `missing_lines`) ## Next steps diff --git a/docs/plans/CASAN_PLAN_12_DOMAIN_PACK.md b/docs/plans/CASAN_PLAN_12_DOMAIN_PACK.md index 75f0a4a..c4f3acc 100644 --- a/docs/plans/CASAN_PLAN_12_DOMAIN_PACK.md +++ b/docs/plans/CASAN_PLAN_12_DOMAIN_PACK.md @@ -2,7 +2,10 @@ > Onboard dự án mới **không copy folder thủ công** — chỉ khai báo một **Domain Pack** (YAML) là CASAN tự hiểu golden/corpus/threshold/quality-rules của domain đó. Chuẩn hoá "harness reusable, domain data tách khỏi core". Task-level, chưa thực thi. > -> Nhãn: [có]/[demo]/[mới]. Phụ thuộc: **01** (tách `config`/`apps//domain`) là điều kiện tiên quyết · **06** (onboard thủ công là bản chạy tay của cái này) · **07/10** (rules tham chiếu). +> Status 2026-07-08: **🔓 điều kiện tiên quyết 01 đã xong** — `apps//domain` + `CASAN_DOMAIN_ROOT` +> per-project đã có (Plan-01 ✅). Còn chờ 06 (bản chạy tay) trước khi chuẩn hoá thành SDK khai báo. +> +> Nhãn: [có]/[demo]/[mới]. Phụ thuộc: **01** ✅ (tách `config`/`apps//domain` — DONE) · **06** (onboard thủ công là bản chạy tay của cái này) · **07/10** (rules tham chiếu). ## 1. Vì sao đáng làm - Plan-06 onboard dự án 2 **thủ công**; Domain Pack biến việc đó thành **khai báo** → reuse thật ở tầm platform. diff --git a/docs/plans/CASAN_PLAN_13_CONTROL_PLANE.md b/docs/plans/CASAN_PLAN_13_CONTROL_PLANE.md index ea8cf3e..8b2210f 100644 --- a/docs/plans/CASAN_PLAN_13_CONTROL_PLANE.md +++ b/docs/plans/CASAN_PLAN_13_CONTROL_PLANE.md @@ -3,9 +3,9 @@ > 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 + +> `packages/casan-harness/scripts/bash/control-plane-settings.py` (settings store versioned + > audit hash-chain + deny-by-default + approval cho key nhạy cảm + rollback + verify), -> test `.specify/tests/phase-control-plane-tests.sh` **7/0 (WSL)**, nối CI +> test `packages/casan-harness/tests/phase-control-plane-tests.sh` **7/0 (WSL)**, nối CI > (`phase-control-plane`). Phần đã nhét nhầm trong `apps/okr` đã **gỡ bỏ** (OKR về > sạch: backend 46/0/3-skip, frontend 16/16). > **Còn lại:** web app **React+NestJS độc lập** ở `control-plane/` (sau Plan-01 → @@ -161,7 +161,7 @@ monitor + manage + settings"] --> API["Control-Plane API (NestJS)"] > 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`. +**Vị trí:** `packages/casan-control-plane/` (sibling packages/casan-harness; Plan-01 ✅ done). **KHÔNG** nằm trong `apps/okr`. **Nguyên tắc:** NestJS API **không** chứa logic governance — mọi set/rollback/authz **gọi harness CLI** (`control-plane-settings.py`, `rbac-check.py`) để governance chỉ có **một nguồn** trong harness. UI role-gated. Harness vẫn là nguồn quyết định cuối. diff --git a/docs/plans/CASAN_PLAN_14_RBAC.md b/docs/plans/CASAN_PLAN_14_RBAC.md index c6052e0..231e0d6 100644 --- a/docs/plans/CASAN_PLAN_14_RBAC.md +++ b/docs/plans/CASAN_PLAN_14_RBAC.md @@ -1,10 +1,10 @@ # 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` +> RBAC decision engine đã dời/đặt trong harness: `packages/casan-harness/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`). +> `packages/casan-harness/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. > diff --git a/docs/plans/CASAN_PLAN_15_RESPONSIBLE_AI_DATA_GOV.md b/docs/plans/CASAN_PLAN_15_RESPONSIBLE_AI_DATA_GOV.md index 5dcd4ea..bcd88b2 100644 --- a/docs/plans/CASAN_PLAN_15_RESPONSIBLE_AI_DATA_GOV.md +++ b/docs/plans/CASAN_PLAN_15_RESPONSIBLE_AI_DATA_GOV.md @@ -1,7 +1,7 @@ # 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` +> Guard đã đặt trong harness: `packages/casan-harness/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:** diff --git a/docs/plans/CASAN_PLAN_16_SECURITY_AUDIT_REMEDIATION.md b/docs/plans/CASAN_PLAN_16_SECURITY_AUDIT_REMEDIATION.md index c29ecfc..86d47b1 100644 --- a/docs/plans/CASAN_PLAN_16_SECURITY_AUDIT_REMEDIATION.md +++ b/docs/plans/CASAN_PLAN_16_SECURITY_AUDIT_REMEDIATION.md @@ -84,7 +84,7 @@ drift-detect **coarse** (chỉ char-similarity → **lật phủ định lọt** ## 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/`, +> Nguyên tắc: mỗi fix phải kèm **test đối kháng fail-able** trong `packages/casan-harness/tests/`, > nối `ci-harness-gate.sh`, giữ 280/0. Verify trong WSL. ### P0 — chặn đứng "gãy" & bypass toàn vẹn diff --git a/docs/plans/CASAN_PLAN_17_LOOP_ENGINEERING.md b/docs/plans/CASAN_PLAN_17_LOOP_ENGINEERING.md index 4736198..60f2fef 100644 --- a/docs/plans/CASAN_PLAN_17_LOOP_ENGINEERING.md +++ b/docs/plans/CASAN_PLAN_17_LOOP_ENGINEERING.md @@ -6,7 +6,7 @@ > Orchestrator `loop-run.sh` (T6, 17.20–17.21) are done as deny-by-default, > fail-closed harness primitives (`loop-governor.py`, `loop-convergence.py`, > `loop-gate.py`, `loop-trace.py`, `loop-metaloop.py`, `loop-run.sh` + -> `.specify/config/loop-policy.yaml`/`loop-policy.schema.json` + `loop_common.py`). +> `packages/casan-harness/config/loop-policy.yaml`/`loop-policy.schema.json` + `loop_common.py`). > Suites: governor 15/0 · convergence 15/0 · gate 20/0 · trace 16/0 · metaloop 15/0 · > loop-run 16/0. Meta-loop changes route through the governed CP store > (versioned + audit + rollback + SoD) and **actually change the governor's ceiling**; @@ -116,7 +116,7 @@ flowchart TD ``` Vị trí file (sau Plan-01 restructure → `packages/casan-harness/`; hiện tại -`.specify/scripts/bash/`). Config ở `.specify/config/`. Không nằm trong `apps/okr`. +`packages/casan-harness/scripts/bash/`). Config ở `packages/casan-harness/config/`. Không nằm trong `apps/okr`. --- @@ -183,7 +183,7 @@ Vị trí file (sau Plan-01 restructure → `packages/casan-harness/`; hiện t | Meta-loop tự nới budget vô hạn | chặn bởi trần org + SoD | | Replay tamper (sửa artifact đã ghi) | replay lệch verdict → cảnh báo; chain BREAK | -**File test:** `.specify/tests/phase-loop-governor-tests.sh`, `phase-loop-convergence-tests.sh`, +**File test:** `packages/casan-harness/tests/phase-loop-governor-tests.sh`, `phase-loop-convergence-tests.sh`, `phase-loop-gate-tests.sh`, `phase-loop-trace-tests.sh`, `phase-loop-metaloop-tests.sh`. Chạy trong **WSL Ubuntu** (deterministic, không cần model/docker/mạng). Nối `ci-harness-gate.sh`. Cập nhật tổng test ở `CASAN_HARDENING_STATUS.md`. diff --git a/docs/plans/CASAN_TEAM_ALLOCATION_3DEV.md b/docs/plans/CASAN_TEAM_ALLOCATION_3DEV.md index df71d30..4b63193 100644 --- a/docs/plans/CASAN_TEAM_ALLOCATION_3DEV.md +++ b/docs/plans/CASAN_TEAM_ALLOCATION_3DEV.md @@ -15,7 +15,7 @@ - **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); + [`ci-harness-gate.sh`](../../packages/casan-harness/scripts/bash/ci-harness-gate.sh); **không** sửa app OKR; không hardcode verdict; không bypass. --- @@ -168,7 +168,7 @@ C phụ thuộc A ở **KMS (A7→C3)** và **approval (SEC-07→C4)**. | # | 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á | +| S1 | **Config namespace** `packages/casan-harness/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 | @@ -210,7 +210,7 @@ C phụ thuộc A ở **KMS (A7→C3)** và **approval (SEC-07→C4)**. - **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. + không chặn Wave 1. Nếu chưa có key: giữ Docker local-prod lab ([`infra-lab.sh`](../../packages/casan-harness/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). diff --git a/docs/plans/CASAN_TEAM_QA.md b/docs/plans/CASAN_TEAM_QA.md index f05e96d..69e92c3 100644 --- a/docs/plans/CASAN_TEAM_QA.md +++ b/docs/plans/CASAN_TEAM_QA.md @@ -155,7 +155,7 @@ Hash-chain tự chứa: kẻ tấn công sửa 1 record rồi **tính lại toà ## PHẦN G — THỰC HÀNH / VẬN HÀNH -**G1. Chạy full self-scoring bằng gì?** `bash .specify/scripts/bash/security-gate.sh` → kỳ vọng `PASS=10 FAIL=0 SKIP=0` (khi có model + node). +**G1. Chạy full self-scoring bằng gì?** `bash packages/casan-harness/scripts/bash/security-gate.sh` → kỳ vọng `PASS=10 FAIL=0 SKIP=0` (khi có model + node). **G2. Vì sao trên máy sạch harness "FAIL" lúc đầu?** Do **môi trường**: thiếu `python` (script gọi `python` không phải `python3`), BSD grep, thiếu coreutils, hoặc msys fork trên Windows. **Không phải control giả** — vá xong là xanh. [đo thật: casan4 35/35 sau khi có python]. @@ -170,7 +170,7 @@ Hash-chain tự chứa: kẻ tấn công sửa 1 record rồi **tính lại toà ## PHẦN J — HARNESS vs SẢN PHẨM OKR & CÁCH DÙNG THỰC TẾ **J1. Harness có liên quan gì tới app OKR không?** -Về bản chất **tách biệt**. **OKR chỉ là testbed** (sản phẩm mẫu để chứng minh). **Harness** (`.specify/scripts/bash/*` + `.specify/level5/*`) là **lớp kiểm soát dùng chung**, **không phụ thuộc OKR** — `casan-harness.sh` nhận `-- ` nên bọc được mọi agent/domain. Hai thứ chỉ "đấu dây" tại **một file**: `scripts/run-casan-pipeline.mjs` (nó gọi `casan-harness.sh ... -- node casan-step.mjs `). Bỏ OKR đi, harness vẫn nguyên vẹn dùng cho dự án khác. +Về bản chất **tách biệt**. **OKR chỉ là testbed** (sản phẩm mẫu để chứng minh). **Harness** (`packages/casan-harness/scripts/bash/*` + `.specify/level5/*`) là **lớp kiểm soát dùng chung**, **không phụ thuộc OKR** — `casan-harness.sh` nhận `-- ` nên bọc được mọi agent/domain. Hai thứ chỉ "đấu dây" tại **một file**: `scripts/run-casan-pipeline.mjs` (nó gọi `casan-harness.sh ... -- node casan-step.mjs `). Bỏ OKR đi, harness vẫn nguyên vẹn dùng cho dự án khác. **J2. Có mấy cách dùng hệ thống?** **Hai:**