diff --git a/STATUS.md b/STATUS.md index de184683..559d1815 100644 --- a/STATUS.md +++ b/STATUS.md @@ -2,18 +2,18 @@ > Trạng thái sống của repo — cập nhật cuối mỗi gói việc. Handoff giữa máy/agent đọc **file này + `_acceptance/`**, không đọc lịch sử chat. -## Hiện trạng (2026-09-09, sau khi ký B4 hai-đường-chạy-một-venv — dòng B4 của kế hoạch ✅) +## Hiện trạng (2026-09-17, sau khi ký và hạ cánh B5 skill-system-v1 — dòng B5 của kế hoạch ✅) > Chỉ mục tính năng theo góc nhìn người dùng nằm ở [`docs/feature-index.md`](docs/feature-index.md). > File này giữ vai *đang ở đâu*; *làm gì tiếp* nằm ở **một chỗ duy nhất**: khối kế hoạch trong > [docs/roadmap.md](docs/roadmap.md), mục "Kế hoạch lát cắt chứng minh". -- **40 hồ sơ đã ký** (guard sổ cái xanh 40/40, 09/09); 39 đã trên `main`, `hai-duong-chay-mot-venv` (B4, ký 09/09) đang ở PR #115 — `director-wire-shape` hạ cánh 08/09 qua PR #111. Hai hồ sơ ký ngày 04/09 đã hạ cánh: `khong-noi-sai-ve-kho-khoa` (PR #95) và `hang-rao-doc-nham-loi-thanh-khong-co-gi` (PR #96). +- **41 hồ sơ đã ký** (sổ cái 41/41, 17/09); cả 41 đã trên `main` — `skill-system-v1` (B5, ký 17/09) hạ cánh qua PR #120, `hai-duong-chay-mot-venv` (B4) qua PR #115, `director-wire-shape` 08/09 qua PR #111. `normalize-text-vi` **nghỉ hẳn 17/09** cùng plugin đã rút: vẫn đếm là đã ký, và vẫn chặn lưới trước merge (xem Nợ). Hai hồ sơ ký ngày 04/09 đã hạ cánh: `khong-noi-sai-ve-kho-khoa` (PR #95) và `hang-rao-doc-nham-loi-thanh-khong-co-gi` (PR #96). - **Định vị ba tầng** ghi ở [vision.md](docs/strategy/vision.md) (04/09): nền tảng đa mục đích → năm trụ cột → lát cắt. Skill #1 là lát cắt chứng minh đầu tiên, không phải định nghĩa sản phẩm. - **Đóng băng mở hạng mục mới** từ khi `lat-cat-chung-minh` merge tới khi 16/16 ★ và ≥ 85% dòng ✅. Xem tỉ lệ: `pnpm plan:check`. Ngoại lệ chỉ ba lý do: mất-dữ-liệu · bảo-mật · chặn-★, và mỗi ngoại lệ cộng vào mẫu số. - **Máy dev đang cài 4 plugin:** `oneflow-api-ffmpeg`, `oneflow-api-openai` (phục vụ cả hai slot transcribe — S3 de facto xong), `oneflow-api-pyscenedetect`, `oneflow-modal-compose-overlay` (mắt Modal duy nhất còn lại trên chuỗi Skill #1 → B6). - **4 nhánh chưa về `main`** (đo lại 08/09, sau khi B2 và B3 hạ cánh): `fix/t1-escape-doi-hoi-artifact-ho-so` (2, → S1), `chore/roadmap-alias-guard` (1), `draft/bo-phan-loai-token` (1), `chore/acceptance-ci-recheck-all` (1) — cả bốn park, giữ nguyên trên ổ. -- **Kit gate, hai tầng phiên bản:** plugin cache **acceptance-gate 2.8.0 + feature-loop 2.8.0** (đo 04/09 qua `installed_plugins.json`); thước vendored trong `scripts/pre-merge-check.sh` là bản fork của repo. Hỏi "version nào" phải nêu cả hai — các con số kit cũ ở mục Lịch sử là sử liệu. +- **Kit gate, hai tầng phiên bản:** plugin cache **acceptance-gate 2.14.0 + feature-loop 2.14.0** (đo 17/09, vòng B5 chạy trên bản này); thước vendored trong `scripts/pre-merge-check.sh` hợp nhất lên nền kit 2.14.0 ở PR #119, giữ cụm phạm vi hẹp theo `paths`. Hỏi "version nào" phải nêu cả hai — các con số kit cũ ở mục Lịch sử là sử liệu. - **Nền tảng:** fork TongFlow (AGPL-3.0). SDK `oneflow-sdk` 0.2.23 trên PyPI, import `tongflow`; B4 (09/09) sửa engine trong kho mà không bump — bản vá tới tay người `pip install` ở chuyến phát hành SDK sau. - **Làn D — Director trường kỳ ([ADR-0013](docs/adr/0013-director-truong-ky.md), 26/08):** khảo sát 26/08 vật chất hoá "agent là giao diện" thành nền trạng thái bốn tầng + học derived-first. Bằng chứng: [research-director-truong-ky-2026-08.md](docs/strategy/research-director-truong-ky-2026-08.md), [research-mo-hoa-2026-08.md](docs/strategy/research-mo-hoa-2026-08.md). Lộ trình: mục **Làn D** trong [roadmap.md](docs/roadmap.md) (xen kẽ, không nối đuôi). **Gói D0 đã đi hết ba cổng người** — [`_acceptance/director-wire-shape/`](_acceptance/director-wire-shape/opportunity.md): Cổng Đáng 26/08, Cổng 2 08/09 (`status: signed-off`), Cổng Giá trị 08/09 (`verdict: release`, xem [uat-session.md](_acceptance/director-wire-shape/uat-session.md) — 5 prompt tiếng Việt, 5 dòng sổ, 0 mồ côi). Hai thước còn trống vì bộ đo ghim lỗi thời: tỉ lệ thành công và p95. Chi tiết bàn giao: [HANDOFF.md](_acceptance/director-wire-shape/HANDOFF.md). @@ -119,13 +119,15 @@ Bài học đắt ghi lại cho máy sau: **round 2→7 churn vì sửa hành vi - **[đã xử lý]** **2 PR dependabot cũ (#1, #2) đã đóng thủ công** — commit của chúng không nằm trong PR #17 nên GitHub không tự đóng. - **[park — gói nợ fork]** **Gói nợ "lần fork thật đầu tiên"** (từ 8 round review của per-plugin-origin, chi tiết ở Known limits contract đó). ~~link "mở kho" trong plugins-dialog ghép từ org mặc định~~ **đã sửa 03/08** (`7ff8bd5` — `officialGitUrl(entry)` giải origin theo từng entry, dialog render `p.repoUrl`; văn bản cũ trong file này và trong contract `per-plugin-origin` đã lạc hậu 5 ngày so với code). Còn mở: bản sao luật URL thứ tư trong `sdk/tongflow/engine/plugins.py` (engine standalone ngoài app vẫn ghép từ org mặc định, có `overrides` che); di trú tự động khi đổi origin (cần AC + eval git-fixture riêng — **lưu ý S2 KHÔNG kích hoạt đường này**: nó thay hẳn `id` chứ không dời origin của cùng một id, nên cơ chế 409 không chạm tới); 3 LOW (query/fragment lọt qua `requireHttpUrl`, message CLI hardcode `plugins/`, catch trần trong `remoteIsAhead`); `assertSafeGitUrl` lỏng hơn biên manifest. - **[B4 đã ký 09/09 — `hai-duong-chay-mot-venv`, giữ lại làm sử liệu]** **Hai đường chạy giành nhau đúng một thư mục venv — phát hiện 17/08, đóng 09/09.** S2 chỉ sửa **phía TS**. Phía Python thì `_venv_dir()` ([`sdk/tongflow/engine/plugins.py:98`](sdk/tongflow/engine/plugins.py)) vẫn trả `data_dir/.tongflow/plugin-venv` và dựng **một venv chung ngay tại đó** — đúng cái path mà TS nay coi là **root chứa nhiều venv con** ([`plugin-python-env.server.ts:36`](src/lib/plugins/plugin-python-env.server.ts)). Vòng lặp: engine chạy → tạo venv chung ở root → lần chạy TS kế tiếp thấy `pyvenv.cfg` ở root → `removeLegacySharedVenv()` `rmSync(root, recursive)` → **xoá sạch mọi venv per-plugin cùng lúc**. Kiểm chứng trên máy này: root đang có `pyvenv.cfg` + `bin/` + `lib/`, tức đang ở trạng thái venv-chung. Kèm theo, `prepare_python_env` (dòng 233-235) `except Exception → return sys.executable` — **đúng hành vi mà AC-18 vừa cố ý gỡ khỏi phía TS** vì nó biến lỗi cài đặt thành `ImportError` mù. `_acceptance/local-cpu-plugins/contract.md` §Out of scope **không nhắc đường engine**, nên đây là lỗ hổng chưa ghi ở đâu, không phải known limit đã disclose. +- **[nợ đã ghi — owner bỏ qua khi merge]** **`normalize-text-vi` chặn lưới trước merge ở MỌI PR.** Plugin của nó rút 26/08 vì kho nguồn không tồn tại công khai, nên ba ô E14b, E17a, E17b không bao giờ xanh lại và hồ sơ không ghim lại được. Owner quyết 17/09 cho hồ sơ nghỉ hẳn (contract §«Nghỉ hẳn»), không ký lại, không khai ô không-chạy. Kit 2.14.0 không có trạng thái nghỉ, nên `status` giữ `signed-off` và `Acceptance Gate` đỏ đúng một vi phạm này cho tới khi kit có trạng thái nghỉ hoặc hồ sơ được gỡ khỏi `_acceptance/` bằng quyết định riêng. PR #120 merge 17/09 với bỏ-qua-có-ghi-nhận. +- **[park — skill-system-v1]** **17 hạn chế đã biết của B5** (contract §Notes). Nặng nhất: đóng rồi mở lại ngăn Skill khi lượt đang chạy làm lượt đó chạy lại, vì luồng chờ mở lại không kèm `reconnect=true`. Kế đó: phản hồi lỗi không phải JSON làm biểu mẫu đứng im, lượt thất bại đánh dấu «đã xong» cho bước chưa chạy, màn theo dõi có thể kẹt ở «đang chạy». - **[park — cost_usd/gpu_type]** **`cost_usd` / `gpu_type` chưa từng được ghi một lần nào.** Không phải "thiếu mặt tiền": grep toàn `src/` cho ra 0 chỗ ghi (chỉ có schema + 2 file test); comment trong `src/db/workspace.schema.ts:48-52` tự khai hai cột này "stay NULL until a backend-neutral plugin metadata channel exists". `duration_ms` thì có ghi thật. Nghĩa là **DoD "mỗi task ghi đủ 3 cột" của hạng mục 0.2 chỉ đạt 1/3 trên đường workflow**, và eval `task-metering` PASS 8/8 vẫn xanh vì nó ký **trước** khi engine thành đường chạy workflow duy nhất — bằng chứng cũ không phủ được lỗ mới. - **[park]** **Trần 3 lượt chạy đồng thời chỉ chặn một nửa.** `checkConcurrentTaskLimit` chỉ được gọi ở `/api/workflow/execute`; `/api/task/create` không có. Chạy từng node lẻ không bị chặn, và bộ đếm đếm mọi task `pending`+`processing` bất kể loại — nên 3 task node lẻ kẹt ở `pending` sẽ **khoá vĩnh viễn** mọi lượt chạy cả sơ đồ. - ~~**[trong kế hoạch B2]** **`docker run` một dòng trong README cho ra bản UPSTREAM, không phải bản này.** `README.md` và `docker-compose.yml:11` mặc định kéo `ghcr.io/tong-io/tongflow:latest`; ảnh của fork là `ghcr.io/${{ github.repository }}` và chỉ build khi đẩy tag `v*`. Ai self-host theo README sẽ chạy bản không có ADR-0011 và không có 3 plugin `oneflow-*`.~~ **ĐÓNG 07/09** — hồ sơ `mo-hoa-b01` ký Cổng 2 ngày 07/09/2026 (Phan Le Manh). `docker-compose.yml` nay trỏ `ghcr.io/phanlemanh/oneflow:latest` và README dùng `docker compose up -d --build`. - ~~**CI không chạy `pnpm test`**~~ — **đã đóng 05/08** (`ci-vitest-sdk-pin`). CI nay có job `Unit Tests (vitest)`; guard `check-vitest-job.sh` canh job không bị làm mềm và tự chứng minh có răng bằng cách đọc lệnh RA TỪ `ci.yml` chứ không ghi cứng. - **[park — overlay-canvas-reach; B6 thay plugin]** **Known limits của `compose-overlay`** (chi tiết ở contract §Known limits): ~~ghi cứng SDK pin~~ **đã gỡ 05/08** · CLAUDE.md §"Registering an official plugin" mô tả guard bản cũ (`expected_count`) · `compose-overlay-op-form.tsx` dùng `