plan: update plan20

This commit is contained in:
thanhnv
2026-07-22 00:20:12 +07:00
parent 6faf589694
commit 0cc43d94d3
8 changed files with 566 additions and 4 deletions
@@ -0,0 +1,295 @@
# CASAN Plan-20 — Transparent Agentic Client Integration
> Ngày lập: 2026-07-22
> Trạng thái: **PLAN — thực hiện sau khi Spike-20 đạt exit gate**
> Thứ tự bắt buộc: **Claude Code → Codex → Claude/Codex trên VS Code**
Kết quả khảo sát và test matrix: [CASAN Spike-20](../spikes/CASAN_SPIKE_20_AGENTIC_CLIENT_HOOKS.md).
## 1. Mục tiêu
Cho phép developer gõ prompt bình thường trong agentic coding client mà không phải chạy
`bin/casan-chat`, nhưng mọi kết quả được CASAN chứng nhận vẫn phải có trace H1→H7 đầy đủ.
Trải nghiệm đích:
1. Member mở project trong Claude Code, Codex hoặc client VS Code được hỗ trợ.
2. Member gõ prompt như bình thường.
3. CASAN mở một admission/trace cho turn đó trước khi agent được phép tạo side effect.
4. Mọi tool call có tác động được CASAN kiểm tra và ghi evidence.
5. Khi turn kết thúc, CASAN finalize H3–H7 và H6 hiển thị runtime/token/cost/failure cùng
nguồn và chất lượng của số liệu.
6. Turn không có admission hợp lệ hoặc không finalize được **không được gắn nhãn certified**.
## 2. Phạm vi và giới hạn cam kết
### Trong phạm vi
- Claude Code CLI/native UI, triển khai đầu tiên bằng lifecycle hooks.
- Codex CLI/IDE host, triển khai sau khi Claude Code đạt gate.
- Claude Code và Codex extension trên VS Code, nếu thực nghiệm xác nhận extension dùng cùng
project hooks với CLI.
- Một CASAN Chat Participant riêng cho VS Code/Copilot nếu cần tuyến chat do CASAN sở hữu.
- Cài đặt và tài liệu cho Windows PowerShell, macOS/Linux.
- Mapping turn/session/client vào trace H1→H7 và H6 report.
### Ngoài phạm vi Plan-20
- Chặn prompt trong mọi AI extension bất kỳ của bên thứ ba.
- Khẳng định project hook là security boundary tuyệt đối khi user có thể sửa/tắt cấu hình.
- Gọi model lần thứ hai từ hook để “chạy lại qua CASAN”.
- Thay đổi core semantics H1→H7 hoặc cài thêm thư viện runtime.
## 3. Nguyên tắc kiến trúc
### 3.1 Không chạy model hai lần
`chat-turn.py ask` hiện là đường CASAN sở hữu cả model execution. Native adapter **không**
được gọi lệnh này rồi để Claude/Codex tiếp tục xử lý cùng prompt, vì sẽ tạo hai lượt model,
hai chi phí và hai kết quả cạnh tranh.
Plan-20 thêm một lifecycle bridge chỉ làm admission, policy, evidence và finalize:
```mermaid
sequenceDiagram
actor U as Developer
participant C as Claude/Codex/VS Code
participant B as CASAN Agentic Bridge
participant H as H1-H7 Harness
participant M as Native Model
U->>C: Prompt bình thường
C->>B: begin(prompt, client, session)
B->>H: H1 context + H4 security admission
H-->>B: admission_id + trace_id hoặc block
B-->>C: allow/context hoặc block
C->>M: Native model execution (một lần)
loop Mỗi tool call
C->>B: pre-tool(admission_id, tool, input)
B->>H: H2/H4/H5 policy gate
H-->>C: allow/deny
C->>B: post-tool(result, duration)
B->>H: append evidence
end
C->>B: finalize(last message, outcome)
B->>H: H3/H5/H7 + H6 telemetry
H-->>C: certified / non-certified
```
### 3.2 Certification strength phải hiển thị công khai
Mỗi trace native có `integration_mode` và `certification_strength`:
| Strength | Ý nghĩa | Cam kết |
|---|---|---|
| `casan_owned` | Launcher/SDK/Chat Participant do CASAN điều khiển toàn vòng đời | Mạnh nhất trong local client |
| `managed_hook` | Hook/policy được tổ chức pin và user thường không thể tắt | Guardrail tổ chức |
| `project_hook` | Hook được commit trong repo và user trust project | Guardrail theo project, có thể bị bypass bởi người có quyền sửa cấu hình |
| `observed_only` | Chỉ thu telemetry, không đủ tool/admission gate | Không certified |
UI và export H6 không được gom bốn mức trên thành một nhãn `pass` duy nhất.
### 3.3 Fail-closed ở điểm tạo side effect
Hook nhận prompt có thể có giới hạn fail-open của client. Vì vậy điều kiện tối thiểu để một
turn được certified là:
- có `admission_id` hợp lệ, ngắn hạn và gắn với project/session/turn;
- mọi tool side-effect được hỗ trợ phải qua `pre-tool`;
- tool bị từ chối khi không có admission hoặc bridge không phản hồi trong internal timeout;
- `finalize` chỉ chứng nhận evidence thực sự quan sát được;
- hook timeout/error được ghi là failure, không tự suy diễn các H downstream đã pass.
Absolute enforcement cần `casan_owned` hoặc cấu hình `managed_hook`; Plan-20 không quảng bá
`project_hook` như một sandbox tuyệt đối.
## 4. Agentic bridge dùng chung
Thêm executable Python stdlib-only trong `packages/casan-harness` với các operation:
| Operation | Input chính | Output/side effect |
|---|---|---|
| `begin` | client, project, session, prompt | scan H1/H4, tạo trace/admission, trả client-native allow/block JSON |
| `pre-tool` | admission, tool name/input | H2/H4/H5 decision, allow/deny/update input nếu client hỗ trợ |
| `post-tool` | tool result/status/duration | append evidence đã redact |
| `telemetry` | model, runtime, token/cost fields | ghi H6 cùng provenance và data quality |
| `finalize` | stop reason, assistant summary, changed files | chạy verify/final controls và đóng trace |
| `abort` | failure/interruption reason | đóng trace non-certified, phát failure telemetry |
### State contract
- State nằm dưới `.specify/state/agentic-sessions/`, dùng atomic write và file lock hiện có.
- Không dùng raw prompt làm key; dùng hash + opaque `turn_id`.
- Admission có TTL, project root canonical và client/session binding.
- Không ghi secret, credential hoặc toàn bộ tool output vào audit log.
- Hook response renderer tách theo adapter; core bridge không phụ thuộc Claude/Codex JSON.
- Mọi record có `schema_version`, `trace_id`, `project_id`, `client`, `client_version`,
`integration_mode`, `certification_strength`, `occurred_at`.
## 5. H6 cho native agentic client
H6 cần bổ sung các field sau nhưng vẫn giữ tương thích schema hiện tại:
| Nhóm | Field |
|---|---|
| Client | `client`, `client_version`, `adapter_version`, `integration_mode` |
| Identity | `client_session_id_hash`, `client_turn_id_hash`, `trace_id` |
| Runtime | `started_at`, `finished_at`, `duration_ms`, `tool_calls`, `failures`, `retries` |
| Usage | input/output/cache token nếu client cung cấp |
| Cost | amount, currency, `cost_source`, estimated/provider-reported |
| Quality | `telemetry_quality=complete|partial|insufficient`, warnings, missing fields |
| Trust | `certification_strength`, hook trust/policy mode, bypass/fallback signal |
Quy tắc:
- Không biến dữ liệu thiếu thành `0`.
- Token/cost không có nguồn chính xác phải là `null` kèm warning.
- Claude status-line estimate và session delta phải ghi rõ provenance; không gọi là
provider-reported.
- Codex usage/cost chỉ được gắn `complete` sau khi spike chứng minh nguồn lifecycle ổn định.
- H6 report cho phép filter theo `client`, `integration_mode`, `trace_id` và project.
## 6. Kế hoạch thực hiện theo wave
### Wave 0 — Common contract và fixtures
| ID | Việc | Deliverable | Gate |
|---|---|---|---|
| 20.0.1 | Chốt JSON lifecycle contract | schema + fixtures begin/pre/post/finalize | invalid payload fail rõ ràng |
| 20.0.2 | Implement bridge state machine | script + atomic state | replay/expired/cross-project admission bị chặn |
| 20.0.3 | Nối evidence H1→H7 | trace writer dùng contract hiện có | không phát evidence downstream giả |
| 20.0.4 | Mở rộng H6 provenance | writer/report/UI/export | thiếu token/cost hiển thị partial, không thành 0 |
| 20.0.5 | Threat tests | tamper, timeout, bypass, injection | security suite xanh |
### Wave 1 — Claude Code spike và MVP
Thực hiện trước mọi code Codex/VS Code.
| ID | Việc | Deliverable | Gate |
|---|---|---|---|
| 20.1.1 | Prototype `UserPromptSubmit` → `begin` | `.claude/settings.json` fixture + command hook | prompt allow/block đúng |
| 20.1.2 | Prototype `PreToolUse`/`PostToolUse` | tool adapter | side effect thiếu admission bị deny |
| 20.1.3 | Prototype `Stop`/failure | finalize/abort adapter | trace đóng đúng, không vòng lặp stop |
| 20.1.4 | Telemetry experiment | status-line/session correlation | H6 ghi provenance + quality đúng |
| 20.1.5 | Windows installer | PowerShell install/doctor/uninstall | clean Windows clone chạy được |
| 20.1.6 | Claude acceptance suite | fixture + black-box test | exit gate mục 8 đạt |
Project config được commit; secret và machine-specific path không được commit. Hook command
phải tự resolve repo root và gọi interpreter có sẵn trong CASAN distribution.
### Wave 2 — Claude Code hardening và rollout nhỏ
- Internal timeout ngắn hơn outer hook timeout; mọi timeout tạo H6 failure.
- PreToolUse deny side effect khi admission thiếu/expired.
- Doctor kiểm tra hook loaded, project trust, bridge version và log permissions.
- Pilot với ít nhất Windows PowerShell và macOS/Linux.
- Tài liệu nêu rõ project-hook vs managed-hook.
- Chỉ chuyển sang Codex khi Claude exit gate xanh và có rollback test.
### Wave 3 — Codex spike và MVP
| ID | Việc | Deliverable | Gate |
|---|---|---|---|
| 20.3.1 | Map Codex lifecycle payload | fixtures cho UserPromptSubmit/Pre/Post/Stop | contract mapping đầy đủ |
| 20.3.2 | Project hook adapter | `.codex/hooks.json` + `.codex/config.toml` | trust onboarding rõ ràng |
| 20.3.3 | Managed policy path | requirements/MDM guide | pin hook và chống disable được chứng minh |
| 20.3.4 | Tool coverage audit | coverage matrix | tool ngoài coverage bị ghi warning/non-certified |
| 20.3.5 | H6 usage experiment | stable source hoặc partial contract | không suy diễn token/cost |
| 20.3.6 | Windows acceptance | install/doctor/normal prompt | cùng behavior với Claude MVP |
Codex tool hooks là guardrail chứ không được xem là coverage tuyệt đối cho hosted/specialized
tools. Certification phải hạ cấp khi một turn dùng tool mà adapter không quan sát được.
### Wave 4 — VS Code và extension
Thực hiện theo ba tuyến riêng, không gom thành một tuyên bố “mọi plugin”:
1. **Claude Code extension:** black-box test xem project `.claude/settings.json` và hooks có
chạy trong extension host hay không.
2. **Codex IDE extension:** black-box test xem `.codex/hooks.json`, trust và managed policy
có giống CLI hay không.
3. **VS Code/Copilot generic:** tạo `@casan` Chat Participant nếu cần một UI do CASAN sở hữu.
Participant detection chỉ là auto-route best effort; built-in participant có thể được ưu
tiên nên không được quảng bá là chặn mọi prompt Copilot mặc định.
Mỗi tuyến có capability badge riêng trong H6: `verified`, `partial`, `unsupported`.
### Wave 5 — Adoption, reporting và release
- Update `packages/casan-devkit` để cài config/hook theo client được chọn.
- Thêm `casan doctor --client claude|codex|vscode` và smoke command.
- Update hướng dẫn Windows từ clone sạch, không yêu cầu người dùng copy file thủ công.
- H6 UI drill-down từ client session → trace → H1–H7 evidence.
- Release notes liệt kê client/version đã test và limitation còn lại.
- Pilot ≥ 2 project, trong đó có project Basic Design lớn trên Windows.
## 7. Definition of Done
Một client chỉ được ghi là `supported` khi:
- gõ prompt bình thường tạo đúng một native model execution và một CASAN trace;
- prompt bị policy block không tới model theo capability thực tế của client;
- side-effect tool thiếu admission bị từ chối trong coverage đã công bố;
- allow, deny, timeout, interruption và hook crash đều có automated test;
- H6 hiển thị client/runtime/failure và token/cost theo đúng data quality;
- H1→H7 evidence truy ngược được từ cùng `trace_id`;
- Windows install, doctor, uninstall và restart đã chạy trên clean clone;
- bypass limitation được ghi trong UI/docs, không dùng từ “bắt buộc tuyệt đối” sai mức;
- core harness regression suite vẫn xanh.
## 8. Exit gate theo giai đoạn
### Claude Code GO để bắt đầu Codex
- 100% test lifecycle fixtures pass.
- 100% side-effect test trong published coverage bị deny khi thiếu admission.
- Không có double model execution.
- Timeout/hook failure tạo non-certified trace và H6 failure.
- Windows + macOS/Linux smoke pass.
- H6 HTML/JSON thể hiện `project_hook` hoặc `managed_hook` và telemetry quality.
### Codex GO để bắt đầu VS Code
- Project trust onboarding có test và doctor diagnostic.
- Managed hook path có tài liệu/policy test.
- Tool coverage matrix được machine-readable và phản ánh trong certification.
- Token/cost source được chứng minh hoặc để `partial`, không giả số.
### VS Code release gate
- Mỗi extension/version có black-box evidence độc lập.
- `@casan` participant được mô tả là CASAN-owned route; participant detection không được
dùng làm bằng chứng interception tuyệt đối.
- Unsupported extension không được hiện `certified`.
## 9. Rollout và rollback
- Feature flags: `CASAN_AGENTIC_BRIDGE_ENABLED`, `CASAN_AGENTIC_ENFORCEMENT_MODE` và client
allowlist.
- Bắt đầu `observe`, sau đó `enforce` trong pilot; production default chỉ đổi sau exit gate.
- Mỗi installer lưu manifest file đã tạo để uninstall không xóa config của user.
- Rollback chỉ tắt adapter; `bin/casan-chat` và core H1→H7 hiện tại vẫn hoạt động.
- Trace sinh trong observe mode luôn mang `observed_only`, không retroactively certified.
## 10. Deliverable dự kiến
```text
packages/casan-harness/
scripts/python/agentic_bridge.py
adapters/claude-code/
adapters/codex/
schemas/agentic-lifecycle.schema.json
tests/phase-agentic-bridge-tests.sh
packages/casan-devkit/
templates/claude/
templates/codex/
windows/install-agentic.ps1
docs/casan/
CASAN_AGENTIC_CLIENTS_WINDOWS.md
CASAN_AGENTIC_CLIENT_SECURITY.md
docs/spikes/
CASAN_SPIKE_20_AGENTIC_CLIENT_HOOKS.md
```
Tên/file cụ thể có thể điều chỉnh sau Spike-20, nhưng lifecycle contract, single-model
invariant và certification strength là quyết định kiến trúc bắt buộc.