feat: complete llm sourcegen plan
This commit is contained in:
@@ -10,7 +10,7 @@
|
||||
> 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; **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).
|
||||
> 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 **10 PASS / 0 FAIL**; frontend Vitest **16 PASS / 0 FAIL**; backend `npm test` **46 PASS / 0 FAIL / 3 SKIP** (LLM judge thiếu Anthropic key).
|
||||
> Đ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).
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
|---|:--:|---|
|
||||
| **10 Traceability + H3 Eval** | ✅ MVP done+test | Đã nối traceability vào Evidence Pack + **symbol/line-level refs** (missing symbol/line ⇒ gate FAIL, phase10 6/0 WSL) + enforce trong CI (`ci-harness-gate.sh`). Sau MVP: H3 eval-set độc lập (nhiều model) + enrich symbol refs cho FR-02→FR-05. |
|
||||
| **03 Cloud patch** | 🟡 MVP done+test | `model-call.py` đã hỗ trợ `openai:<model>` và `anthropic:<model>` qua endpoint hard-pin + API key env; parser token usage và malformed payload có deterministic test. Còn live smoke với key thật + billing usage API ground truth. |
|
||||
| **02 LLM source-gen** | 🟡 đợt A MVP done+test | `01-srs` và `02-bd` hỗ trợ `CASAN_GEN_MODE=model`: gọi `model-router.sh --role generate`, scan H4 draft bằng `artifact-scan.sh`, validate token bắt buộc, fallback template nếu lỗi. Test `phase2-sourcegen` 3/0. Còn đợt B/C/D + full live pipeline smoke. |
|
||||
| **02 LLM source-gen** | ✅ **A–D done+test (offline/local)** | `01-srs`, `02-bd`, `03-spec`, `05-plan`, `07-dd`, `08-testkit`, `09-tasks`, `10-implement` 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, ghi H5 sourcegen audit + H6 telemetry, fallback template nếu lỗi. Real pipeline có STEP10 implement draft + STEP12 run-tests gate; retry/escalation loops STEP5→STEP3, STEP7→STEP6, STEP11→STEP10. Test `phase2-sourcegen` **10/0**; full template pipeline smoke trong `/tmp` tới STEP12 PASS; backend **46/0/3skip**, frontend **16/0**. Cloud OpenAI/Anthropic live smoke + billing ground truth thuộc Plan-03 (cần key thật). |
|
||||
| **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/<project>/domain/` + set `CASAN_DOMAIN_ROOT` (đã có `domain_root` per-project trong `project-registry.json`). |
|
||||
|
||||
@@ -20,7 +20,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 | ✅ (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) |
|
||||
| 02 | `CASAN_PLAN_02_LLM_SOURCEGEN.md` | Nối LLM thật vào sinh source thay template | ✅ A–D done+test |
|
||||
| 03 | `CASAN_PLAN_03_CLOUD_PATCH.md` | Patch cloud OpenAI/Anthropic, bỏ stub | 🟡 / 🔌 live |
|
||||
| 04 | `CASAN_PLAN_04_SELFIMPROVE.md` | Khép vòng `casan improve` | 📋 |
|
||||
| 05 | `CASAN_PLAN_05_CICD.md` | CI/CD + release package | 🟡 |
|
||||
@@ -54,7 +54,7 @@
|
||||
| **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 |
|
||||
| P6 | ✅ Plan-02 source-gen A–D | Done offline/local; cloud provider live smoke nằm ở Plan-03 vì cần key thật |
|
||||
| P7 | Plan-03 live cloud smoke | Cần key thật (điều kiện gỡ blocker: xem Plan-03) |
|
||||
| P8 | Plan-04 / 08 / 12 | Làm sau các plan nền |
|
||||
|
||||
|
||||
@@ -1,16 +1,17 @@
|
||||
# KẾ HOẠCH 02 — Nối LLM thật vào sinh source (thay template deterministic)
|
||||
|
||||
> Status 2026-07-06: **Đợt A MVP implemented + tested** cho `01-srs` và
|
||||
> `02-bd`. Mặc định vẫn dùng template deterministic; khi bật
|
||||
> `CASAN_GEN_MODE=model`, hai step này gọi `model-router.sh --role generate`,
|
||||
> H4 artifact-scan output nháp, validate tiêu chí tối thiểu, rồi mới ghi
|
||||
> artifact. Lỗi model / output thiếu / H4 block đều fallback template và ghi
|
||||
> `source=template-fallback` trong report.
|
||||
> Status 2026-07-09: **Plan-02 A–D implemented + tested (offline/local)**.
|
||||
> Mặc định vẫn dùng template deterministic; khi bật `CASAN_GEN_MODE=model`,
|
||||
> các step `01-srs`, `02-bd`, `03-spec`, `05-plan`, `07-dd`, `08-testkit`,
|
||||
> `09-tasks`, `10-implement` gọi `model-router.sh --role generate`, H4
|
||||
> `artifact-scan` output nháp, validate token bắt buộc, ghi H5 sourcegen audit
|
||||
> + H6 sourcegen telemetry, rồi mới ghi artifact. Lỗi model / output thiếu /
|
||||
> H4 block đều fallback template và ghi `source=template-fallback` trong report.
|
||||
>
|
||||
> Hiện `casan-step.mjs` vẫn sinh các step sau bằng **template hard-code** trong
|
||||
> `switch(step)` [có, đọc code]; model đã dùng ở H3 judge + H4 semantic và nay
|
||||
> ở source-gen đợt A. Kế hoạch: mở rộng dần để LLM **thật sự sinh artifact**,
|
||||
> nhưng **mọi output vẫn chui qua H1→H7**.
|
||||
> `run-casan-pipeline.mjs` đã có STEP10 implement draft + STEP12 run-tests
|
||||
> gate thật; STEP5/STEP7/STEP11 có retry/escalation loop. Cloud OpenAI/Anthropic
|
||||
> live smoke vẫn thuộc Plan-03 vì cần API key thật; Plan-02 local path dùng
|
||||
> Ollama qua router, timeout sourcegen mặc định 240s cho prompt dài.
|
||||
>
|
||||
> Phụ thuộc: nên làm sau **03 (cloud patch)** để có lựa chọn model mạnh cho bước khó; **01** giúp gọn nhưng không bắt buộc.
|
||||
|
||||
@@ -35,8 +36,8 @@ Thứ tự chuyển ưu tiên step **rõ ràng, ít rủi ro** trước:
|
||||
| Đợt | Step chuyển | Vì sao trước/sau |
|
||||
|---|---|---|
|
||||
| A | `01-srs`, `02-bd` | văn bản có cấu trúc, dễ chấm, rủi ro thấp |
|
||||
| B | `03-spec`, `06-plan` | có review loop (STEP5/7) đỡ lỗi |
|
||||
| C | `08-dd`, `09-tasks` | phụ thuộc spec/plan tốt |
|
||||
| B | `03-spec`, `05-plan` | có review loop (STEP5/7) đỡ lỗi |
|
||||
| C | `07-dd`, `08-testkit`, `09-tasks` | phụ thuộc spec/plan tốt |
|
||||
| D | `10-implement` (code) | rủi ro cao nhất → làm cuối, cần test thật (STEP12) làm lưới |
|
||||
|
||||
---
|
||||
@@ -45,17 +46,17 @@ Thứ tự chuyển ưu tiên step **rõ ràng, ít rủi ro** trước:
|
||||
|
||||
| Task | Việc | File | Verify | Done khi |
|
||||
|---|---|---|---|---|
|
||||
| 2.1 | Trừu tượng hoá: thêm hàm `generate(step, ctx)` chọn **model** hoặc **template** theo cờ `CASAN_GEN_MODE` | `casan-step.mjs` | mode=template → hành vi cũ y hệt | ✅ đợt A |
|
||||
| 2.2 | Viết prompt-template cho mỗi step (đưa requirement + architecture + tiêu chí chấp nhận vào prompt) | mới `prompts/<step>.md` | prompt render đủ ngữ cảnh | có prompt từng step |
|
||||
| 2.3 | Gọi model qua `model-router.sh --role generate` (KHÔNG gọi model-call trực tiếp) | `casan-step.mjs` | output đi qua H4 trước khi ghi | ✅ đợt A (`01-srs`, `02-bd`) |
|
||||
| 2.4 | Chuẩn hoá output model → đúng file artifact + `STEP-RESULT` block | parser | verdict/artifacts hợp lệ | schema đúng |
|
||||
| 2.1 | Trừu tượng hoá: thêm hàm `generate(step, ctx)` chọn **model** hoặc **template** theo cờ `CASAN_GEN_MODE` | `casan-step.mjs` | mode=template → hành vi cũ y hệt | ✅ A–D |
|
||||
| 2.2 | Viết prompt-template cho mỗi step (đưa requirement + architecture + tiêu chí chấp nhận vào prompt) | `packages/casan-harness/prompts/sourcegen/<step>.md` | prompt render đủ ngữ cảnh | ✅ prompt từng step |
|
||||
| 2.3 | Gọi model qua `model-router.sh --role generate` (KHÔNG gọi model-call trực tiếp) | `casan-step.mjs` | output đi qua H4 trước khi ghi | ✅ A–D |
|
||||
| 2.4 | Chuẩn hoá output model → đúng file artifact + `STEP-RESULT` block | parser | verdict/artifacts hợp lệ | ✅ schema đúng |
|
||||
| 2.5 | Nạp **golden + tiêu chí** cho H3 judge từng step | `apps/okr/domain/golden-runs/` | judge chấm được đạt/không | H3 hoạt động |
|
||||
| 2.6 | Fallback: model SKIP/kém → dùng template (đợt A/B), hoặc REJECT → vòng review | `casan-step.mjs` | ép model lỗi → không vỡ | ✅ đợt A |
|
||||
| 2.7 | Chuyển đợt A (srs, bd) sang mode=model | pipeline | chạy full, 2 artifact do model sinh, qua harness | 🟡 MVP done; full live pipeline smoke còn |
|
||||
| 2.8 | Chuyển đợt B (spec, plan) + kiểm vòng REJECT hoạt động | pipeline | ép spec kém → STEP5 REJECT → retry | loop chạy |
|
||||
| 2.9 | Chuyển đợt C (dd, tasks) | pipeline | artifact hợp lệ, drift trong ngưỡng | đợt C xong |
|
||||
| 2.10 | Chuyển đợt D (implement code) — **bắt buộc** STEP12 chạy test thật làm cổng | pipeline | test dự án PASS mới nhận code | đợt D xong |
|
||||
| 2.11 | Ghi prompt + model + token vào audit (H5) & telemetry (H6) | logging | audit có prompt, provider-usage có token | truy vết được |
|
||||
| 2.6 | Fallback: model SKIP/kém → dùng template (đợt A/B), hoặc REJECT → vòng review | `casan-step.mjs`, `run-casan-pipeline.mjs` | ép model lỗi → không vỡ | ✅ A–D |
|
||||
| 2.7 | Chuyển đợt A (srs, bd) sang mode=model | pipeline/test | artifact do model sinh, qua harness | ✅ done+test |
|
||||
| 2.8 | Chuyển đợt B (spec, plan) + kiểm vòng REJECT hoạt động | pipeline/test | ép spec/plan kém → STEP5/7 REJECT → retry | ✅ loop chạy |
|
||||
| 2.9 | Chuyển đợt C (dd, testkit, tasks) | pipeline/test | artifact hợp lệ, drift trong ngưỡng | ✅ đợt C xong |
|
||||
| 2.10 | Chuyển đợt D (implement code) — **bắt buộc** STEP12 chạy test thật làm cổng | pipeline/test | test dự án PASS mới nhận code | ✅ đợt D xong |
|
||||
| 2.11 | Ghi prompt + model + token vào audit (H5) & telemetry (H6) | logging | audit có prompt, provider-usage có token | ✅ truy vết được |
|
||||
|
||||
---
|
||||
|
||||
@@ -88,10 +89,18 @@ flowchart LR
|
||||
| Regression pipeline | `CASAN_GEN_MODE=template` luôn giữ đường cũ |
|
||||
|
||||
## Tiêu chí HOÀN THÀNH
|
||||
- [x] `CASAN_GEN_MODE=template` cho hành vi cũ y hệt (an toàn quay lui) ở đợt A.
|
||||
- [ ] `CASAN_GEN_MODE=model`: đợt A–D artifact do LLM sinh, **đều qua H1→H7**. Đợt A đã có MVP cho `01-srs`/`02-bd`.
|
||||
- [ ] Code (đợt D) chỉ nhận khi STEP12 test PASS.
|
||||
- [ ] Prompt/model/token vào audit (H5) + telemetry (H6).
|
||||
- [ ] Có escalation khi H3 REJECT lặp; local vẫn là mặc định.
|
||||
|
||||
> Sau kế hoạch này, câu "pipeline sinh source bằng AI" mới **đúng nghĩa**. Trước đó phải nói rõ đang dùng **template**.
|
||||
- [x] `CASAN_GEN_MODE=template` cho hành vi cũ y hệt (an toàn quay lui).
|
||||
- [x] `CASAN_GEN_MODE=model`: đợt A–D artifact đi qua `model-router --role generate`, H4 scan, required-token validation, fallback template khi lỗi, và harness H1→H7 ở pipeline.
|
||||
- [x] Code/implement draft (đợt D) chỉ được accept khi STEP12 run-tests PASS (`implementation.accepted.json` chỉ ghi sau PASS).
|
||||
- [x] Prompt/model/token vào H5 sourcegen audit + H6 sourcegen telemetry.
|
||||
- [x] Có escalation khi H3 REJECT lặp; local vẫn là mặc định, cloud/frontier chỉ dùng khi cấu hình `CASAN_REVIEW_ESCALATE_MODEL` + key.
|
||||
|
||||
## Verify 2026-07-09
|
||||
- `phase2-sourcegen-tests.sh`: **10/0** — A–D model-mode mocked router, fallback H4, audit/telemetry, STEP12 pass/fail acceptance.
|
||||
- `run-casan-pipeline.mjs` full template smoke in `/tmp`: STEP1/2/3/5/6/7/8/8b/9/10/11 APPROVED, STEP12 PASS; loops STEP5→STEP3, STEP7→STEP6, STEP11→STEP10 exercised.
|
||||
- App test gate: backend `npm test -w backend` **46 pass / 0 fail / 3 skip**; frontend `npm test -w frontend` **16/0**.
|
||||
- Local Ollama generate path verified via `model-router.sh --role generate` (`ollama:ornith:9b`, real token telemetry); sourcegen prompts use 240s default timeout for long local generations.
|
||||
|
||||
> Sau kế hoạch này, câu "pipeline sinh source bằng AI" đúng với mode model/local.
|
||||
> Nếu cần OpenAI/Anthropic live-provider smoke và billing ground truth, làm tiếp
|
||||
> theo Plan-03 vì cần API key/dịch vụ ngoài.
|
||||
|
||||
@@ -48,10 +48,11 @@ Expected evidence:
|
||||
| P4 | Add model allowlist policy for approved cloud models | Unknown cloud model names require approval or block |
|
||||
| P5 | Decide default failover order for local -> cloud or cloud -> local | `model-fallback.sh` policy is explicit per role |
|
||||
|
||||
## Điều kiện gỡ blocker API key (để P02 đợt B–D không treo vô thời hạn)
|
||||
## Điều kiện gỡ blocker API key (để live provider smoke không treo vô thời hạn)
|
||||
|
||||
Live smoke (P1 ở trên) và Plan-02 đợt B–D **đều chờ cùng một điều kiện**: có API
|
||||
key provider thật. Ghi rõ để bất kỳ AI/người kế tiếp gỡ được:
|
||||
Live smoke (P1 ở trên) cần API key provider thật. Plan-02 A–D đã có đường
|
||||
offline/local qua `model-router`; phần còn lại ở đây chỉ là claim **live cloud
|
||||
provider thật**. Ghi rõ để bất kỳ AI/người kế tiếp gỡ được:
|
||||
|
||||
| Hạng mục | Quyết định cần chốt |
|
||||
|---|---|
|
||||
@@ -61,7 +62,7 @@ key provider thật. Ghi rõ để bất kỳ AI/người kế tiếp gỡ đư
|
||||
| **Evidence phải lưu** | 1 file smoke ghi: exit `0`, token thật > 0 trong `/tmp/out.json`, 1 dòng `provider-usage.jsonl` với source `*_api_real_tokens`, và xác nhận không rò secret. |
|
||||
| **Khi CHƯA có key** | Giữ nguyên trạng thái: deterministic offline test là bằng chứng hợp lệ; **không** claim live provider. Không tạo fake PASS/fake token. |
|
||||
|
||||
> **Chốt:** P02 đợt B–D có thể phát triển & test offline bằng deterministic mock;
|
||||
> **Chốt:** P02 A–D có thể phát triển & test offline bằng deterministic mock/local;
|
||||
> chỉ **bước xác nhận live** mới cần key. Vì vậy thiếu key **không chặn** việc
|
||||
> mở rộng source-gen — chỉ chặn claim "đã chạy live provider thật".
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
| 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` |
|
||||
| Source-gen gate included | `phase2-sourcegen-tests.sh` included | sourcegen 3/0 |
|
||||
| Source-gen gate included | `phase2-sourcegen-tests.sh` included | sourcegen 10/0 |
|
||||
| Traceability gate included | `phase10-traceability-tests.sh` included | traceability 3/0 |
|
||||
| Frontend runtime tests included | `npm test -w frontend` when npm is present | frontend Vitest path |
|
||||
| Optional Docker local-prod lab | `CASAN_CI_RUN_INFRA_LAB=1` runs `phase-prod-infra-lab-tests.sh` only when Docker Compose is available | skip-aware by default |
|
||||
|
||||
Reference in New Issue
Block a user