doc: update status
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
#!/usr/bin/env bash
|
||||
set -uo pipefail
|
||||
|
||||
# CASAN — Model-digest pinning (Plan-07 B4 / V16, trust the model backend).
|
||||
#
|
||||
# An attacker who swaps or poisons the local model (e.g. re-tags a different
|
||||
# ornith:9b) changes CASAN's behaviour with no code change. This pins the
|
||||
# approved model's content digest and refuses (or warns) when the live digest
|
||||
# no longer matches — so a silent model swap is detected.
|
||||
#
|
||||
# Digest source: Ollama /api/tags (real) or CASAN_MODEL_DIGEST (override, for
|
||||
# CI/tests). If neither is available the check SKIPs (cannot verify).
|
||||
#
|
||||
# Usage:
|
||||
# model-digest-check.sh pin [model] # record the current digest as approved
|
||||
# model-digest-check.sh verify [model] # compare live digest to the pinned one
|
||||
# model-digest-check.sh show [model]
|
||||
# Env: CASAN_MODEL (default ornith:9b) · CASAN_MODEL_DIGEST (override) ·
|
||||
# CASAN_MODEL_DIGEST_PIN (pin file) · OLLAMA_HOST (default 127.0.0.1:11434)
|
||||
# Exit: 0 match/pinned · 2 MISMATCH (swap detected) · 3 unpinned/undeterminable.
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)"
|
||||
PIN_FILE="${CASAN_MODEL_DIGEST_PIN:-$PROJECT_ROOT/.specify/security/model-digest.pin}"
|
||||
mkdir -p "$(dirname "$PIN_FILE")"
|
||||
CMD="${1:-verify}"
|
||||
MODEL="${2:-${CASAN_MODEL:-ornith:9b}}"
|
||||
OLLAMA="${OLLAMA_HOST:-127.0.0.1:11434}"
|
||||
|
||||
current_digest() {
|
||||
# 1) explicit override (deterministic for CI/tests)
|
||||
if [[ -n "${CASAN_MODEL_DIGEST:-}" ]]; then printf '%s' "$CASAN_MODEL_DIGEST"; return 0; fi
|
||||
# 2) live Ollama
|
||||
local d
|
||||
d="$(curl -sf "http://$OLLAMA/api/tags" 2>/dev/null | \
|
||||
python3 -c "import json,sys
|
||||
m=sys.argv[1]
|
||||
try: d=json.load(sys.stdin)
|
||||
except Exception: sys.exit(1)
|
||||
for x in d.get('models',[]):
|
||||
if x.get('name')==m: print(x.get('digest','')); break" "$MODEL" 2>/dev/null)"
|
||||
[[ -n "$d" ]] && { printf '%s' "$d"; return 0; }
|
||||
return 1
|
||||
}
|
||||
|
||||
pinned_digest() { awk -v m="$MODEL" '$1==m {print $2; exit}' "$PIN_FILE" 2>/dev/null; }
|
||||
|
||||
case "$CMD" in
|
||||
pin)
|
||||
D="$(current_digest)" || { echo "MODEL_DIGEST_UNAVAILABLE model=$MODEL (Ollama down + no CASAN_MODEL_DIGEST)" >&2; exit 3; }
|
||||
tmp="$(mktemp)"; grep -v "^$MODEL " "$PIN_FILE" 2>/dev/null > "$tmp" || true
|
||||
printf '%s\t%s\n' "$MODEL" "$D" >> "$tmp"; mv "$tmp" "$PIN_FILE"
|
||||
echo "MODEL_DIGEST_PINNED model=$MODEL digest=${D:0:24}…"
|
||||
;;
|
||||
verify)
|
||||
P="$(pinned_digest)"
|
||||
[[ -n "$P" ]] || { echo "MODEL_DIGEST_UNPINNED model=$MODEL (run: model-digest-check.sh pin)" >&2; exit 3; }
|
||||
D="$(current_digest)" || { echo "MODEL_DIGEST_UNAVAILABLE model=$MODEL — cannot verify" >&2; exit 3; }
|
||||
if [[ "$D" == "$P" ]]; then
|
||||
echo "MODEL_DIGEST_OK model=$MODEL digest=${D:0:24}…"
|
||||
exit 0
|
||||
fi
|
||||
echo "MODEL_DIGEST_MISMATCH model=$MODEL pinned=${P:0:24}… live=${D:0:24}… — model may have been swapped/poisoned" >&2
|
||||
exit 2
|
||||
;;
|
||||
show)
|
||||
echo "model=$MODEL pinned=$(pinned_digest || echo none) live=$(current_digest || echo unavailable)"
|
||||
;;
|
||||
*)
|
||||
echo "Usage: model-digest-check.sh {pin|verify|show} [model]" >&2; exit 64 ;;
|
||||
esac
|
||||
@@ -0,0 +1,68 @@
|
||||
# CASAN — Backlog & Handoff Status (single source of truth for "what's left")
|
||||
|
||||
> **Mục đích:** liệt kê MỌI hạng mục còn tồn đọng theo ưu tiên, kèm trạng thái +
|
||||
> 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: `feat/plan07-track-a-hardening` (đã merge vào `main` @ `c943273`).
|
||||
> Test hiện tại: **211 PASS / 0 FAIL** trên 12 suite. Điểm công tâm ~81.6/100, harness thấp nhất 80.
|
||||
> Nguồn liên quan: `CASAN_HARDENING_STATUS.md` (chi tiết control) · `evidence/scoring-run-report.md` (điểm).
|
||||
|
||||
## Quy ước
|
||||
- **Nhãn:** ✅ done+test · 🟡 MVP done (bản prod cần hạ tầng) · 🟦 deliverable-now (làm được offline) · 🔌 needs-infra (cần key/dịch vụ ngoài) · 📋 handoff-only (platform lớn, cần nhiều phiên).
|
||||
- **Nguyên tắc bàn giao:** mỗi mục 🔌/📋 phải có "Bước tiếp theo" đủ cụ thể để người khác bắt tay ngay.
|
||||
- **Bất biến an toàn:** giữ 211/0; mọi control mới phải có test đối kháng fail-able; không hardcode verdict, không bypass.
|
||||
|
||||
---
|
||||
|
||||
## TIER 1 — Làm được ngay (deterministic/mock, đóng nốt Plan-07) 🟦
|
||||
|
||||
| # | 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 | 🟦 → (làm trong phiên này) | Ghi digest model đã duyệt vào `security/model-digest.pin`; `model-router.sh`/1 gate so digest hiện tại; đổi digest bất ngờ → cảnh báo/lock. Test: pin→match=OK, đổi→WARN/BLOCK. |
|
||||
| T1.2 | **IdP/OIDC cho approval** (thay registry pubkey tĩnh) | 07 C4 / V20 | 🟦 (mock IdP) | Verify approver bằng **JWT ký bởi IdP** (RS256): `approval-verify.sh` chấp nhận `CASAN_APPROVAL_JWT` — verify chữ ký bằng JWKS/pubkey, check claim `sub`(=approver)/`role`/`exp`. MVP dùng khoá IdP-giả (như Vault dev); prod trỏ JWKS thật. Test: JWT hợp lệ→APPROVED, hết hạn/sai role/chữ ký giả→DENY. |
|
||||
| T1.3 | **Traceability REQ→code→test** (khác biệt nhất) | 10 | 🟦 → (làm trong phiên này) | Sinh ma trận: parse FR-xx từ `docs/input/okr-requirement.md` → map sang file code + test; gate: mọi FR phải có ≥1 code + ≥1 test, cảnh báo FR mồ côi. Test: FR đủ→PASS, FR thiếu test→FAIL. |
|
||||
|
||||
## TIER 2 — Plan-07 gaps cần hạ tầng (MVP đã có, cần bản prod) 🔌
|
||||
|
||||
| # | Hạng mục | Trạng thái | Bước tiếp theo (bản production) |
|
||||
|---|---|:--:|---|
|
||||
| T2.1 | KMS mặc định + HSM | 🟡 (Vault Transit live, chưa default) | Đặt `sign-audit-head.sh`/`telemetry-integrity.sh` route qua KMS khi có `VAULT_ADDR` (đã vậy); thêm cấu hình prod: Vault/AWS-KMS/CloudHSM + token ngắn hạn qua IdP; bỏ fallback khoá local ở môi trường prod (giữ cho dev). |
|
||||
| T2.2 | WORM store thật (S3 Object Lock) | 🟡 (ledger local hash-link) | `audit-ship.sh` thêm backend S3: `aws s3api put-object --object-lock-mode COMPLIANCE --retain-until-date …`; hoặc QLDB. Giữ ledger local làm cache. Cần: AWS creds + bucket Object-Lock. |
|
||||
| T2.3 | Dashboard deploy + auth | 🟡 (HTTP local + /healthz) | Đóng gói `dashboard-server.py` vào container + nginx reverse-proxy + auth (OIDC/basic); expose `/healthz` cho uptime monitor. Cần: host + TLS cert. |
|
||||
| T2.4 | Kênh alert managed + on-call | 🟡 (webhook + dead-letter) | `alert-dispatch.sh` trỏ `CASAN_ALERT_WEBHOOK` tới Slack/PagerDuty incoming-webhook; map severity→on-call rota (tie C7 incident). Cần: webhook URL + rota. |
|
||||
| T2.5 | Billing-API telemetry thật | 🟡 (fetch vs endpoint local) | `provider-usage-fetch.sh` trỏ tới usage API thật của OpenAI/Anthropic (đã có schema-gate + reconcile). Cần: API key thật (chưa test). |
|
||||
| T2.6 | Sandbox: rootless/nsjail + base image CI | 🟡 (container isolation live via Docker) | Thêm profile nsjail/bubblewrap cho Linux CI (không cần Docker daemon); hardened base image tối thiểu. `sandbox-container.sh` đã có bản Docker. |
|
||||
|
||||
## TIER 3 — Platform plans (INDEX 01–12, việc lớn nhiều phiên) 📋
|
||||
|
||||
| Plan | Trạng thái | Lõi cần làm (bước tiếp theo cho AI kế) |
|
||||
|---|:--:|---|
|
||||
| **10 Traceability + H3 Eval** | 🟦 MVP phiên này (xem T1.3) | Sau MVP: nối traceability vào Evidence Pack (thêm `traceability-matrix.json` vào pack); mở rộng H3 eval-set độc lập (nhiều model). |
|
||||
| **02 LLM source-gen** | 📋 chưa bắt đầu | Thay template bằng LLM thật sinh source qua `model-router.sh`; đi qua wrapper H4→H7. Phụ thuộc 03. Bước 1: định contract prompt→file cho 1 module (objectives), gate bằng H3 judge + traceability. |
|
||||
| **03 Cloud patch** | 📋 chưa bắt đầu | Bỏ stub trong `model-call.py` cho OpenAI/Anthropic; test bằng key thật (🔌). Bước 1: env `CASAN_MODEL_PRIMARY=openai:…`, xác thực round-trip + ghi provider-usage thật. |
|
||||
| **04 Self-improve** | 📋 chưa bắt đầu | Khép vòng `casan improve`: đọc metrics/drift/hallucination → đề xuất vá → chạy lại gate. Phụ thuộc 02, 05. Bước 1: script đọc `metrics.jsonl` + `drift-report.json` → sinh backlog vá tự động. |
|
||||
| **05 CI/CD** | 📋 một phần (act_runner/deploy có) | Chuẩn hoá pipeline phát hành package `fpt-casan-sdd-harness` + chạy 12 suite trong CI (Vault+Docker service). Bước 1: `.gitea/workflows/harness-ci.yml` chạy toàn bộ suite + security-gate. |
|
||||
| **06 Onboard dự án 2** | 📋 chưa bắt đầu | Chứng minh reuse: cắm 1 repo khác + golden/corpus/input, đăng ký qua `verify-harness-reuse.sh`, không sửa gate. Phụ thuộc 01. |
|
||||
| **08 Context compression** | 📋 chưa bắt đầu | Nén prompt/context giảm token (H1.5). Làm SAU khi core ổn (nén thêm bề mặt rủi ro → cần quét lại). Bước 1: đo token baseline mỗi step, thử tóm tắt có kiểm chứng (H3 judge so sánh). |
|
||||
| **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ữ 211/0. |
|
||||
| Future B1–B6 | 💤 vision | `CASAN_PLAN_FUTURE_PHASES.md` — approval workflow nâng cao · state machine · model benchmark · governed memory · auto-remediation · platform KPI. |
|
||||
|
||||
---
|
||||
|
||||
## Trần điểm & điều kiện lên "Strong (81+)"
|
||||
Harness thấp nhất = 80 (H5, H6). Để CẢ pipeline vào Strong cần đóng **các mục 🔌 TIER 2**
|
||||
(IdP live, WORM-S3, KMS default, dashboard deploy, managed alert, billing-API) — đều là
|
||||
**hạ tầng/khoá thật**, không code thuần được nữa. Các mục 🟦 TIER 1 nâng H4/H2 nhưng không
|
||||
đổi trần (H5/H6 vẫn 80) cho tới khi TIER 2 xong.
|
||||
|
||||
## Cách kiểm chứng nhanh (bất kỳ AI kế nào)
|
||||
```bash
|
||||
cd AINative_OKR_CASAN5
|
||||
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; do
|
||||
bash .specify/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).
|
||||
```
|
||||
Reference in New Issue
Block a user