@kienntpixon/dieu-phoi 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +33 -0
- package/README.md +10 -3
- package/agents/dp-exec.md +38 -0
- package/agents/dp-helper.md +23 -0
- package/agents/dp-scout.md +25 -0
- package/agents/dp-verify.md +25 -0
- package/bin/dieu-phoi.cjs +8 -3
- package/hook.cjs +600 -23
- package/lib/aggregate.cjs +98 -19
- package/lib/choose.cjs +79 -19
- package/lib/commands.cjs +206 -23
- package/lib/setup.cjs +71 -2
- package/package.json +2 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,38 @@
|
|
|
1
1
|
# Changelog — @kienntpixon/dieu-phoi
|
|
2
2
|
|
|
3
|
+
## 0.5.0
|
|
4
|
+
|
|
5
|
+
Giới hạn ngữ cảnh subagent (đo trên 429 subagent từ 2026-10-09: p50 đỉnh 144k, p90 373k, max 789k; lượt >128k = 83% chi phí; subagent không bao giờ tự nén vì chạy cửa sổ 1M).
|
|
6
|
+
|
|
7
|
+
- **Nâng cấp:** dán lại `sheet/Code.gs` (cột `parent_task_id`, `parent_agent_id`; luật tiếp nối handoff) rồi `dieu-phoi setup` để cài agent `dp-*`.
|
|
8
|
+
- **File bàn giao `dp-out-<task>-<role>-try<n>.md`:** Claude Code chặn cứng Write trong subagent khi tên khớp `/^(REPORT|SUMMARY|FINDINGS|ANALYSIS).*.md$/i` (trước cả permissions, không cấu hình được) nên exec/verify/scout ghi toàn bộ kết quả vào `dp-out-*` và chỉ trả đường dẫn + `STATUS` + ≤ 3 dòng. Hook `SubagentStop`: agent exec/verify/plan trả kết quả mà không có file (Write hỏng, trả inline) → lưu nguyên văn phần trả về thành `<run>/dp-out-<task>-<role>-try<n>.inline.md` (bỏ qua khi đã có `dp-out-*` hoặc `report-*`/`verify-*` cũ của lượt đó, khi agent handoff, khi là helper; run dir lấy từ đường dẫn trong brief, không bao giờ ra ngoài `runsDir()`). Agent `dp-exec`/`dp-verify`/`dp-scout` ghi rõ hợp đồng này.
|
|
9
|
+
- **Loại agent `dp-exec`, `dp-verify`, `dp-scout`, `dp-helper`** (`cli/agents/`, `setup` cài vào `~/.claude/agents/`): `autoCompactWindow: 200000`, không đặt model, chỉ `dp-exec` có Agent; `dp-helper` không Agent/Edit/Write (độ sâu dừng ở 2). Setup idempotent, không bao giờ ghi đè file trùng tên không có dấu `# dieu-phoi-managed:`; `uninstall` gỡ đúng file của mình; `doctor` báo `agents: …=ok|outdated|missing|foreign`.
|
|
10
|
+
- **Watchdog ngữ cảnh** (`hook.cjs --watch`, PostToolUse trong frontmatter agent dp-*): subagent có thẻ `[dp:` vượt 150k rồi 180k token ngữ cảnh → additionalContext một lần mỗi ngưỡng: ghi `handoff-<task_id>.md` trong run dir và dừng với `STATUS: partial — handoff`. Đọc đuôi transcript subagent, ~2 ms tính.
|
|
11
|
+
- **Handoff = `aborted`, không phải fail:** `SubagentStop` ghi verdict `aborted` `reason_code=auto-handoff`; thước đo (CLI + sink, fixture parity thêm ô `refactor`) nối tầng agent của lượt exec đầu sang agent tiếp nối cùng `try`.
|
|
12
|
+
- **Gen-2 có kiểm soát** (`hook.cjs --gate`, PreToolUse(Agent) của `dp-exec`): tối đa 4 `dp-helper`/bước, model haiku|sonnet đặt rõ, thẻ `role=helper|parent=<task>`; sai luật → deny kèm lý do. Thẻ nhận `role=helper` và `parent=`; dispatch ghi `parent_task_id` + `parent_agent_id`. `choose --role helper` kẹp trần sonnet/high; helper không bao giờ là lượt/mẫu.
|
|
13
|
+
- **Sửa sau review:** suất helper của `--gate` là file `data/gate/<task>/slot-1..4.json` tạo độc quyền (`wx`) — gọi Agent song song không vượt 4, không còn ghi đè trạng thái `--watch` (hai file riêng; file watch tạo bằng `wx`). Suất chỉ tính khi helper chạy thật: xác nhận qua `--watch` (helper tự xác nhận, hoặc PostToolUse(Agent) của exec), trả lại qua `--gate-release` (PostToolUseFailure(Agent) mới trong `dp-exec`) hoặc sau 10 phút chưa xác nhận. Watchdog cho `dp-verify`/`dp-scout`/`dp-helper`: trả verdict/tóm tắt ngay, không ghi handoff (chỉ exec handoff). `attempt_*` (ước lượng `choose`) cộng mọi đoạn exec của chuỗi handoff; fixture parity thêm chuỗi 3 đoạn (ô `refactor` n=3). `doctor` so agent với node đã đăng ký trong settings, không báo "outdated" giả khi chạy bằng node khác.
|
|
14
|
+
|
|
15
|
+
## 0.4.0
|
|
16
|
+
|
|
17
|
+
Theo bản rà soát telemetry tune0001 (2026-10-12: 886 sự kiện sạch, ~157 task, 8 phiên điều phối).
|
|
18
|
+
|
|
19
|
+
- **Nâng cấp:** **dán lại `sheet/Code.gs` và deploy bản mới TRƯỚC khi nâng CLI** — Code.gs cũ từ chối kind mới `discard` (rơi vào `sync-rejected.jsonl`), coi `aborted` như verdict thường và tính `orch_share` từ đầu phiên. Sau đó `npm i -g @kienntpixon/dieu-phoi@0.4.0` rồi `dieu-phoi setup`.
|
|
20
|
+
- **Chi phí điều phối tính từ dispatch đầu tiên** của mỗi phiên, không từ đầu phiên (`orchestration.orch_usd_total` / `orch_share`, CLI + sink, fixture parity cập nhật). Trước đây một phiên làm việc khác suốt buổi rồi mới giao một agent bị tính $540 "điều phối": `orch_share` báo 46% trong khi thật ~9,5%, làm tín hiệu retro mục 6 bắn sai.
|
|
21
|
+
- **Outcome mới `aborted`** cho agent dừng vì hết usage limit / quota: không phải pass hay fail, không thành mẫu, không tính leo thang. Hook `SubagentStop` tự ghi verdict `aborted` (`reason_code` `auto-usage-limit` khi dòng cuối là lỗi API "You've hit your … limit" / `rate_limit` / 429; `auto-quota-pause` khi dòng đầu báo cáo cuối là đúng dấu `STATUS: partial — quota-pause`). `verdict <agent_id> aborted` để ghi tay. Dữ liệu cũ: `timeout` có `reason_code` bắt đầu bằng `paused-for-quota` / `quota-pause` / `usage-limit` được đọc là `aborted` (5/18 lượt không pass trong log thật là quota pause, 3 trên sonnet/high). `state` hiện `aborted`, rồi `done` khi agent được làm tiếp và xong; `verdict last` vẫn coi agent `aborted` là chờ verdict.
|
|
22
|
+
- **Leo thang đếm cả làm lại bằng `SendMessage`:** mỗi verdict agent là một kết quả ở tier đó — fail, fail trên **cùng** một agent = 2 fail cùng tier → lên tier (trước đây chỉ verdict cuối của mỗi agent được tính, nên luật "2 fail cùng tier" không bao giờ bắn: 10 agent fail-rồi-pass, 2 agent fail-fail-pass).
|
|
23
|
+
- **`verdict --root <root_task_id> accept [--steps a,b]`:** người dùng nghiệm thu mọi bước đã giao exec của kế hoạch đã duyệt mà chưa có verdict người dùng, trong một lệnh (chỉ 16% task có verdict người dùng).
|
|
24
|
+
- **Steer chỉ tính pha exec:** steer trên scout/planner (trả lời câu hỏi cổng 1) và verifier không vào `steer_rate` / tín hiệu "brainstorm hỏi quá ít" nữa, mà vào cột mới `plan_phase_actions` (16/28 hành động lái trong log thật là trả lời cổng 1 cho scout). `steer --task` không đánh dấu verifier. Sink cũng bỏ steer trên agent không phải exec khỏi cột `steer_*`.
|
|
25
|
+
- **Bài học cho điều phối viên tới được điều phối viên:** `start` (`orch_lessons` trong `--json`) và khối UserPromptSubmit in 5 dòng cuối của `profile/lessons.md` có thẻ `[orch]` (hoặc `[orchestrator]` cũ), mỗi dòng ≤ 240 ký tự.
|
|
26
|
+
- **Override khi duyệt kế hoạch:** `plan-table --approve` ghi sự kiện `override` cho bước có `override` khác đề xuất (cả khi duyệt lại đổi tier); không nhân đôi khi đã có override cùng task + tier. Trước đây override trong file steps không bao giờ thành sự kiện (0 override trong log thật).
|
|
27
|
+
- **Chặn task_type tự đặt:** `choose` đổi nhãn quen sang loại cố định (`bug-fix`→`debug`, `config`/`shell`/`deploy`→`mechanical-edit`, `docs`→`content-write`, `design`/`plan`→`plan-design`, `research`→`research-synth`, `art-fix`→`art-gen` khi profile có, …) kèm `task_type`, `mapped_from`, `type_warning`; nhãn lạ khác → `action:"ask_user"`, `unknown_type:true`. `plan-table` cảnh báo, `--approve` từ chối nhãn lạ, bản ghi kế hoạch lưu loại đã đổi. (23 agent / 9 nhãn tự đặt trong log thật đã rơi về opus/medium.)
|
|
28
|
+
- **Ghi log an toàn hơn:** mỗi sự kiện là một lệnh ghi O_APPEND trọn dòng; file không kết thúc bằng `\n` (tiến trình chết giữa dòng) → ghi `\n` trước để mảnh dở không nuốt sự kiện mới. Điều tra dispatch `a955459fed35d6614` có trên Sheet mà mất ở `events.jsonl`: không phải tranh ghi — một agent theo yêu cầu người dùng đã **sửa tay** log để xoá một yêu cầu nhầm (task `63w6xmsh`, có bản sao `.bak-63w6xmsh`) sau khi dòng đó đã được đẩy lên sink. Sửa gốc: lệnh mới **`dieu-phoi discard --task <id> [--reason R]`** ghi sự kiện `discard` (kind mới, đồng bộ lên sink); CLI (stats/choose/state/verdict --root) và sink bỏ mọi sự kiện của task đó và của agent của nó; `orchestration` giữ nguyên (tiền đã tiêu).
|
|
29
|
+
- (sau verifier) Nhận diện `aborted` chỉ theo dấu chính xác: dòng đầu báo cáo `STATUS: partial — quota-pause`, hoặc dòng lỗi usage limit tổng hợp của Claude Code (`<synthetic>` + `rate_limit`/429/"You've hit your … limit"); `timeout` cũ chỉ đổi thành `aborted` khi `reason_code` bắt đầu bằng `quota-pause|usage-limit|auto-*|paused-for-quota`. `doctor` bỏ qua thư mục có tên giống file tạm.
|
|
30
|
+
- **Cảnh báo context bớt ồn:** `choose --json` thêm `orch_ctx_warn` — `true` chỉ khi vượt một ngưỡng mới của phiên (trần, 2×, 4×, …) hoặc vẫn vượt sau một lần `/compact`; dòng `CẢNH BÁO` của bản chữ chỉ in khi đó (trạng thái ở `data/ctx-warn.json`). `orch_ctx_over` giữ nghĩa cũ. Trước đây cảnh báo bắn ở 78% dispatch.
|
|
31
|
+
- `doctor`: dòng `tmp-files` xoá file `*.tmp-*` bỏ dở cũ hơn 1 giờ (6 file trong máy thật), dòng `plans` cảnh báo kế hoạch có root id sai định dạng.
|
|
32
|
+
- `retro --json`: `outcomes.aborted`, `totals.discarded_tasks`.
|
|
33
|
+
- `time_cap_min` mặc định của core (chỉ dùng khi không có profile) theo profile ai-lab đã tune: feature-impl 80, content-write 40, debug 55.
|
|
34
|
+
- **Không đổi:** priors, λ, `explore_rate`, `orch_ctx_soft_cap`, trần opus/medium, không Fable, không thăm dò task phán đoán / khó hoàn tác / gấp.
|
|
35
|
+
|
|
3
36
|
## 0.3.0
|
|
4
37
|
|
|
5
38
|
- **Khởi động không qua shell:** hook mới `UserPromptSubmit` (`setup` đăng ký, không matcher, timeout 5 s; chạy lại không nhân đôi; `uninstall` gỡ). Chỉ kích hoạt khi prompt **mở đầu** (sau khi cắt khoảng trắng) bằng `/dieu-phoi`, "điều phối" (không phân biệt hoa thường / có dấu hay không, có thể kèm ":") hoặc một cụm đặc trưng "spawn subagents", "orchestrate subagents", "chia việc cho agent", "giao cho subagent"; "điều phối" ở giữa câu ("trung tâm điều phối…", "không cần điều phối") không kích hoạt, yêu cầu kiểu retro / state / stats / lệnh CLI và "điều phối viên…" cũng không → hook tạo sẵn `root_task_id` (cùng bộ sinh với `new-id`), **tạo** run dir `~/.dieu-phoi/runs/<id>/` (theo `DIEU_PHOI_RUNS_DIR`), 10 `step_ids` dự phòng cho các bước, tình trạng sức khoẻ cục bộ và đường dẫn brief scout dựng sẵn, rồi tiêm vào `hookSpecificOutput.additionalContext` (dòng đầu `dieu-phoi: khởi động sẵn (hook UserPromptSubmit, …)`). Prompt khác → im lặng. Không gọi mạng, không ghi sự kiện, luôn exit 0 (lỗi → `hook-errors.log`). Đo: ~40 ms cả tiến trình node, < 5 ms phần xử lý. Lý do: lệnh shell đầu tiên của phiên Claude Code trong repo lớn có thể treo 6–11 phút trước khi có shell snapshot; trước đây `doctor; new-id` nằm đúng trên đường găng của cổng 1.
|
package/README.md
CHANGED
|
@@ -8,6 +8,10 @@ Hook + CLI cho skill **dieu-phoi**: ghi lại mỗi lần Claude Code giao việ
|
|
|
8
8
|
|
|
9
9
|
## Cài đặt
|
|
10
10
|
|
|
11
|
+
> Nâng cấp lên 0.5.0: dán lại `sheet/Code.gs` (cột `parent_task_id`, `parent_agent_id`, luật tiếp nối handoff) rồi chạy lại `dieu-phoi setup` để cài agent `dp-*`.
|
|
12
|
+
|
|
13
|
+
> Nâng cấp lên 0.4.0: **dán lại `sheet/Code.gs` và deploy bản mới TRƯỚC khi nâng CLI** — Code.gs cũ từ chối kind mới `discard` và tính `orch_share` theo cách cũ; sau đó `npm i -g @kienntpixon/dieu-phoi@0.4.0` rồi `dieu-phoi setup`.
|
|
14
|
+
>
|
|
11
15
|
> Nâng cấp lên 0.2.0: **dán lại `sheet/Code.gs` và deploy bản mới TRƯỚC khi nâng CLI** — Code.gs cũ bỏ qua (làm rơi) các trường mới `session_id, orch_ctx_tokens, orch_cum_usd, orch_ctx_baseline, orch_compactions` của bản ghi được đẩy lên trong lúc chưa cập nhật; sau đó `npm i -g @kienntpixon/dieu-phoi@0.2.0` rồi `dieu-phoi setup`.
|
|
12
16
|
|
|
13
17
|
Khuyến nghị cài toàn cục để skill gọi được `dieu-phoi …` trực tiếp:
|
|
@@ -25,6 +29,7 @@ Không cài toàn cục được thì dùng `npx -y @kienntpixon/dieu-phoi <lệ
|
|
|
25
29
|
1. chép `hook.cjs` + `pricing.json` vào `~/.claude/dieu-phoi/bin/`;
|
|
26
30
|
2. sao lưu `~/.claude/settings.json` thành `settings.json.bak-dieu-phoi-<thời gian>` rồi đăng ký `PostToolUse` (matcher `Agent`) và `SubagentStop` chạy `"<đường dẫn node>" "<…>/dieu-phoi/bin/hook.cjs"` (node tuyệt đối, không phụ thuộc PATH). Các hook và khoá khác giữ nguyên, kể cả mảng/đối tượng rỗng. Chạy lại khi hook đã đúng thì không ghi file, không tạo bản sao lưu. Đổi phiên bản node (nvm…) thì chạy lại `setup`;
|
|
27
31
|
3. ghi `~/.claude/dieu-phoi/config.json` (phòng ban, sink, đường dẫn skill, mã băm người dùng). Thư mục skill tự dò: `<claude>/skills/dieu-phoi`, hoặc thư mục `<claude>/skills/*` có `profile/profile.json` và `SKILL.md` mang `name: dieu-phoi` (fork phòng ban đổi tên thư mục vẫn tìm được).
|
|
32
|
+
4. (0.5.0) ghi `~/.claude/agents/dp-exec.md`, `dp-verify.md`, `dp-scout.md`, `dp-helper.md` (`autoCompactWindow: 200000`, hook watchdog ngữ cảnh + cổng helper gen-2 trong frontmatter — chỉ chạy khi điều phối viên giao bằng các loại agent này). File trùng tên không phải của dieu-phoi được giữ nguyên.
|
|
28
33
|
|
|
29
34
|
Khởi động lại Claude Code sau khi cài. Kiểm tra bằng `dieu-phoi doctor` (chạy thử chính lệnh hook đã đăng ký).
|
|
30
35
|
|
|
@@ -36,8 +41,10 @@ Khởi động lại Claude Code sau khi cài. Kiểm tra bằng `dieu-phoi doct
|
|
|
36
41
|
|---|---|
|
|
37
42
|
| `setup [--dept D] [--sink-url U --sink-token T] [--skill-dir P]` | cài hook, đăng ký `PostToolUse(Agent)` + `SubagentStop` + `SessionStart(compact)` + `UserPromptSubmit` trong settings, ghi config; tạo thư mục báo cáo `~/.dieu-phoi/runs` (env `DIEU_PHOI_RUNS_DIR` để đổi; ngoài `~/.claude` vì đó là protected path) và thêm quyền `Read`/`Edit(~/.dieu-phoi/runs/**)` + `additionalDirectories` để subagent nền ghi được báo cáo (không nhân đôi, có sao lưu); gỡ luật cũ của bản dev cho `~/.claude/dieu-phoi/runs` |
|
|
38
43
|
| `doctor [--net] [--json]` | kiểm node, hook, settings (+ `prompt-hook`), config, profile, sink (từ bộ nhớ đệm 24 giờ; `--net` kiểm trực tiếp); context phiên điều phối hiện tại nếu đo được (`orch-ctx`); thư mục `~/.dieu-phoi/runs` + quyền của nó, không còn luật cũ (`run-permissions`); `--json` có `runs_dir` |
|
|
39
|
-
| `verdict <agent_id\|last> <pass\|fail\|timeout> [--verify tests\|lint\|review\|judgment\|none] [--reason short-kebab]` | nghiệm thu tầng agent (`by=agent`). `last` = agent hoàn thành gần nhất; từ chối (liệt kê ứng viên) nếu trong 30 phút qua có > 1 agent xong mà chưa có verdict. Được viết tắt agent_id nếu không trùng |
|
|
44
|
+
| `verdict <agent_id\|last> <pass\|fail\|timeout\|aborted> [--verify tests\|lint\|review\|judgment\|none] [--reason short-kebab]` | nghiệm thu tầng agent (`by=agent`). `aborted` (0.4.0) = dừng vì usage limit/quota: không pass/fail, không leo thang; hook tự ghi khi bắt được. `last` = agent hoàn thành gần nhất; từ chối (liệt kê ứng viên) nếu trong 30 phút qua có > 1 agent xong mà chưa có verdict. Được viết tắt agent_id nếu không trùng |
|
|
40
45
|
| `verdict --task <task_id> <accept\|reject> [--cause quality\|scope] [--round n] [--reason R]` | nghiệm thu của **người dùng** (`by=user`). `reject` bắt buộc `--cause`: `quality` = làm sai (tính là fail), `scope` = yêu cầu đổi/thiếu (không tính cho model). `--round` mặc định tự tăng |
|
|
46
|
+
| `verdict --root <root_task_id> accept [--steps a,b]` | (0.4.0) người dùng nhận một lúc mọi bước đã giao exec của kế hoạch đã duyệt mà chưa có verdict người dùng |
|
|
47
|
+
| `discard --task <task_id> [--reason R]` | (0.4.0) rút một task nhầm khỏi stats/choose/state/sink bằng sự kiện `discard` — không bao giờ sửa tay `events.jsonl` |
|
|
41
48
|
| `steer <agent_id> \| --task <task_id> --kind minor\|plan\|redirect [--reason R]` | ghi **một** lần người dùng lái giữa chừng (một `steer_id`). `--task` chỉ đánh dấu agent đang chạy của task; không có agent nào đang chạy → bản ghi cấp task. `plan`/`redirect` trước verdict loại lượt đó khỏi tỉ lệ của tier (chi phí vẫn tính); steer không xoá fail đã ghi |
|
|
42
49
|
| `stats [--type T] [--json]` | các ô `task_type × model/effort` theo "Thước đo" của `CONTRACT.md`: n, n_excluded, accept_rate, agent_pass_rate, chi phí/thời gian mỗi task (TB, p50, p75); bảng steer theo task_type; tóm tắt điều phối (`orchestration`: số phiên, context p50/max, chi phí điều phối vs subagent, `orch_share`) |
|
|
43
50
|
| `choose --type T --score N [--urgency U] [--reversible y\|n] [--verifiable y\|n] [--role R] [--task ID] [--override M/E \| --approved M/E] [--skill-dir P] [--seed S] [--json]` | đề xuất model + effort kèm lý do, `action`, `role`, ước tính chi phí/thời gian. `--override` cần `--task`. Kèm `orch_ctx_tokens`, `orch_ctx_growth`, `orch_ctx_over` (như `ctx`); vượt trần mềm → thêm một dòng cảnh báo |
|
|
@@ -53,7 +60,7 @@ Khởi động lại Claude Code sau khi cài. Kiểm tra bằng `dieu-phoi doct
|
|
|
53
60
|
### `choose`
|
|
54
61
|
|
|
55
62
|
1. **Luật an toàn** (cố định trong core): trần `opus/medium` (opus/high, xhigh, max, Fable bị kẹp về opus/medium; `--override opus/high` bị từ chối). Sàn: score ≥ 9 → opus/medium; `--verifiable n` → tối thiểu opus/medium; `--reversible n` → tối thiểu opus/medium (role exec). Score ≥ 9, `--verifiable n`, `--reversible n` hoặc `urgent` → không thăm dò xuống tier thấp. Sàn được ghi rõ trong `reason`.
|
|
56
|
-
2. **Leo thang** với `--task <task_id>`: fail 1 lần → cùng tier (làm lại kèm lỗi); fail 2 lần cùng tier → lên một tier; tier kế vượt opus/medium (role exec) → **không tự lập lại kế hoạch**, trả `action: "ask_user"` kèm `fails` và `tried` để hỏi người dùng. Fail = agent `fail|timeout` hoặc người dùng `reject --cause quality
|
|
63
|
+
2. **Leo thang** với `--task <task_id>`: fail 1 lần → cùng tier (làm lại kèm lỗi); fail 2 lần cùng tier → lên một tier; tier kế vượt opus/medium (role exec) → **không tự lập lại kế hoạch**, trả `action: "ask_user"` kèm `fails` và `tried` để hỏi người dùng. Fail = agent `fail|timeout` hoặc người dùng `reject --cause quality`; mỗi verdict là một kết quả, nên làm lại bằng `SendMessage` cho cùng agent cũng được đếm (0.4.0); `aborted` không bao giờ tính. Lượt bị steer `plan`/`redirect` không tính.
|
|
57
64
|
3. **Prior** từ `<skill-dir>/profile/profile.json` (không thấy thì dùng bản sao dựng sẵn của `skill/profile/profile.json` v1.0.0). `profile_source` trong kết quả cho biết đang dùng file nào (`builtin` hoặc đường dẫn).
|
|
58
65
|
4. **Thompson sampling** khi ô của prior có ≥ 5 task đã xong + có verdict: rút p ~ Beta(1+pass, 1+fail) cho từng tier đủ dữ liệu, điểm = E[cost]/p + λ·E[time_phút]/p (urgent dùng p75 thời gian), chọn điểm thấp nhất. Tier có p75 vượt `time_cap_min` của loại task bị loại.
|
|
59
66
|
5. **Thăm dò** một tier thấp hơn với xác suất `explore_rate` (mặc định 0.1) khi luật an toàn cho phép.
|
|
@@ -85,7 +92,7 @@ Kết quả `--json`: `{"action":"dispatch","model":"sonnet","model_id":"claude-
|
|
|
85
92
|
|
|
86
93
|
## Dữ liệu
|
|
87
94
|
|
|
88
|
-
- Sự kiện: `~/.claude/dieu-phoi/data/events.jsonl` (`dispatch`, `complete`, `verdict`, `steer`, `override`; `schema: 1`), xem `CONTRACT.md`. File chỉ ghi nối (append-only), không bao giờ viết lại. Tiến độ đẩy lên sink nằm ở `data/sync-offset.json` (byte offset sau dòng cuối đã đẩy); trạng thái segment từng agent ở `data/segments/<agent_id>.json`.
|
|
95
|
+
- Sự kiện: `~/.claude/dieu-phoi/data/events.jsonl` (`dispatch`, `complete`, `verdict`, `steer`, `override`, `discard`; `schema: 1`), xem `CONTRACT.md`. File chỉ ghi nối (append-only), không bao giờ viết lại. Tiến độ đẩy lên sink nằm ở `data/sync-offset.json` (byte offset sau dòng cuối đã đẩy); trạng thái segment từng agent ở `data/segments/<agent_id>.json`.
|
|
89
96
|
- Lỗi của hook: `~/.claude/dieu-phoi/hook-errors.log`.
|
|
90
97
|
- Subagent nội bộ của Claude Code (không có transcript, không qua Agent tool) không được ghi; số lần bỏ qua ở `data/skipped-internal.json`. Log cũ của 0.1.0 có các `complete` rỗng loại này — `stats`/`retro` tự bỏ qua, không cần sửa file (từ 0.1.1).
|
|
91
98
|
- Người dùng chỉ lưu dạng sha256 rút gọn 8 ký tự (`git config user.email`, không có thì tên tài khoản máy). Phiên: `session` = sha256-8; từ 0.2.0 `dispatch` có thêm `session_id` thô (mã phiên, không phải nội dung) để nối với `dieu-phoi ctx`.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dp-exec
|
|
3
|
+
description: "dieu-phoi only — executor subagent dispatched by the dieu-phoi orchestrator with a [dp:...] brief. Do not pick this agent on your own."
|
|
4
|
+
# dieu-phoi-managed: do not edit (dieu-phoi setup rewrites this file)
|
|
5
|
+
autoCompactWindow: 200000
|
|
6
|
+
hooks:
|
|
7
|
+
PostToolUse:
|
|
8
|
+
- matcher: "*"
|
|
9
|
+
hooks:
|
|
10
|
+
- type: command
|
|
11
|
+
command: '__DP_HOOK__ --watch'
|
|
12
|
+
timeout: 5
|
|
13
|
+
PreToolUse:
|
|
14
|
+
- matcher: "Agent|Task"
|
|
15
|
+
hooks:
|
|
16
|
+
- type: command
|
|
17
|
+
command: '__DP_HOOK__ --gate'
|
|
18
|
+
timeout: 5
|
|
19
|
+
PostToolUseFailure:
|
|
20
|
+
- matcher: "Agent|Task"
|
|
21
|
+
hooks:
|
|
22
|
+
- type: command
|
|
23
|
+
command: '__DP_HOOK__ --gate-release'
|
|
24
|
+
timeout: 5
|
|
25
|
+
---
|
|
26
|
+
Bạn là agent thực thi (exec) của dieu-phoi. Brief ở tin nhắn đầu (dòng đầu là thẻ `[dp:...]`) là hợp đồng: làm đúng phạm vi, tự kiểm chứng, ghi báo cáo vào run dir và trả về bản tóm tắt ngắn đúng định dạng brief yêu cầu.
|
|
27
|
+
|
|
28
|
+
Bàn giao qua file: ghi TOÀN BỘ kết quả vào `dp-out-<task_id>-exec-try<n>.md` trong run dir (đường dẫn brief chỉ định), rồi chỉ trả: đường dẫn file đó, dòng `STATUS:`, và ≤ 3 dòng ý chính. Không đặt tên file `report*` / `summary*` / `findings*` / `analysis*.md` — Claude Code chặn cứng Write các tên đó trong subagent. File dp-out/handoff mà brief trỏ tới là báo cáo chính thức: đọc thẳng, không cần xin thêm quyền.
|
|
29
|
+
|
|
30
|
+
Helper thế hệ 2 (tuỳ chọn, chỉ khi giúp giữ ngữ cảnh nhỏ): tối đa 4 agent `subagent_type: dp-helper`, `model` đặt rõ `haiku` hoặc `sonnet`, cho đúng hai loại việc — (a) đọc/quét code hoặc tài liệu rồi trả tóm tắt ≤ 15 dòng, (b) chạy test / Unity smoke rồi tóm tắt log. Dòng đầu prompt helper: `[dp:<type>|s<n>|<urgency>|try1|task=<id mới từ dieu-phoi new-id>|role=helper|parent=<task của bạn>]`. Hook từ chối mọi lần giao sai luật. Không giao helper sửa code.
|
|
31
|
+
|
|
32
|
+
Giữ ngữ cảnh nhỏ (mỗi lượt gửi lại toàn bộ ngữ cảnh — số lượt mới là thứ làm phình):
|
|
33
|
+
- Grep/Glob trước, rồi Read đúng đoạn cần bằng offset/limit; không cat/sed -n cả file qua Bash.
|
|
34
|
+
- Không đọc lại file đã đọc — ghi chú điều cần nhớ ngay khi đọc.
|
|
35
|
+
- Lọc output lệnh dài (`| tail -n 40`, `| grep ...`); không dump log/JSON thô.
|
|
36
|
+
- Mỗi ảnh/screenshot xem một lần, ghi nhận xét thành chữ, không mở lại.
|
|
37
|
+
- Không bao giờ đọc transcript phiên (`~/.claude/projects/**/*.jsonl`).
|
|
38
|
+
- Khi hook dieu-phoi báo ngữ cảnh chạm ngưỡng: dừng việc mới, ghi file handoff hook chỉ định (`handoff-<task_id>.md` trong run dir: Đã xong / Đang dở / Bước tiếp theo / File đã động / Bẫy & ghi chú) rồi kết thúc với dòng đầu báo cáo đúng `STATUS: partial — handoff`.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dp-helper
|
|
3
|
+
description: "dieu-phoi only — gen-2 helper spawned by a dp-exec agent (read/scan and summarize, or run tests and summarize logs). Do not pick this agent on your own."
|
|
4
|
+
# dieu-phoi-managed: do not edit (dieu-phoi setup rewrites this file)
|
|
5
|
+
disallowedTools: Agent, Task, Edit, Write, NotebookEdit
|
|
6
|
+
autoCompactWindow: 200000
|
|
7
|
+
hooks:
|
|
8
|
+
PostToolUse:
|
|
9
|
+
- matcher: "*"
|
|
10
|
+
hooks:
|
|
11
|
+
- type: command
|
|
12
|
+
command: '__DP_HOOK__ --watch'
|
|
13
|
+
timeout: 5
|
|
14
|
+
---
|
|
15
|
+
Bạn là helper thế hệ 2 của dieu-phoi, do một agent exec giao (thẻ `[dp:...|role=helper|parent=...]`). Chỉ làm một trong hai việc: (a) đọc/quét code hoặc tài liệu được chỉ định rồi trả tóm tắt ≤ 15 dòng (đường dẫn + dòng + kết luận, không dán nguyên văn dài); (b) chạy test / Unity smoke được chỉ định rồi tóm tắt log (pass/fail, lỗi đầu tiên, đường dẫn log). Không sửa file, không giao việc tiếp. Câu trả lời cuối ≤ 15 dòng, trả bằng chữ cho dp-exec cha (helper không ghi file).
|
|
16
|
+
|
|
17
|
+
Giữ ngữ cảnh nhỏ (mỗi lượt gửi lại toàn bộ ngữ cảnh — số lượt mới là thứ làm phình):
|
|
18
|
+
- Grep/Glob trước, rồi Read đúng đoạn cần bằng offset/limit; không cat/sed -n cả file qua Bash.
|
|
19
|
+
- Không đọc lại file đã đọc — ghi chú điều cần nhớ ngay khi đọc.
|
|
20
|
+
- Lọc output lệnh dài (`| tail -n 40`, `| grep ...`); không dump log/JSON thô.
|
|
21
|
+
- Mỗi ảnh/screenshot xem một lần, ghi nhận xét thành chữ, không mở lại.
|
|
22
|
+
- Không bao giờ đọc transcript phiên (`~/.claude/projects/**/*.jsonl`).
|
|
23
|
+
- Khi hook dieu-phoi báo ngữ cảnh chạm ngưỡng: dừng đọc/chạy thêm, trả bản tóm tắt NGAY với những gì đã có và ghi rõ phần chưa kiểm được. Không ghi file handoff — chỉ agent exec mới handoff.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dp-scout
|
|
3
|
+
description: "dieu-phoi only — read-only scout/planner subagent dispatched by the dieu-phoi orchestrator with a [dp:...|role=plan] brief. Do not pick this agent on your own."
|
|
4
|
+
# dieu-phoi-managed: do not edit (dieu-phoi setup rewrites this file)
|
|
5
|
+
disallowedTools: Agent, Task, Edit, NotebookEdit
|
|
6
|
+
autoCompactWindow: 200000
|
|
7
|
+
hooks:
|
|
8
|
+
PostToolUse:
|
|
9
|
+
- matcher: "*"
|
|
10
|
+
hooks:
|
|
11
|
+
- type: command
|
|
12
|
+
command: '__DP_HOOK__ --watch'
|
|
13
|
+
timeout: 5
|
|
14
|
+
---
|
|
15
|
+
Bạn là scout/planner của dieu-phoi: khảo sát (code, tài liệu, dữ liệu) theo brief ở tin nhắn đầu (thẻ `[dp:...|role=plan]`) và trả về kế hoạch/câu hỏi đúng định dạng brief. Không sửa file của dự án; Write chỉ dùng để ghi báo cáo/kế hoạch vào run dir.
|
|
16
|
+
|
|
17
|
+
Bàn giao qua file: ghi TOÀN BỘ kết quả vào `dp-out-<task_id>-plan-try<n>.md` trong run dir (đường dẫn brief chỉ định), rồi chỉ trả: đường dẫn file đó, dòng `STATUS:`, và ≤ 3 dòng ý chính. Không đặt tên file `report*` / `summary*` / `findings*` / `analysis*.md` — Claude Code chặn cứng Write các tên đó trong subagent. File dp-out/handoff mà brief trỏ tới là báo cáo chính thức: đọc thẳng, không cần xin thêm quyền.
|
|
18
|
+
|
|
19
|
+
Giữ ngữ cảnh nhỏ (mỗi lượt gửi lại toàn bộ ngữ cảnh — số lượt mới là thứ làm phình):
|
|
20
|
+
- Grep/Glob trước, rồi Read đúng đoạn cần bằng offset/limit; không cat/sed -n cả file qua Bash.
|
|
21
|
+
- Không đọc lại file đã đọc — ghi chú điều cần nhớ ngay khi đọc.
|
|
22
|
+
- Lọc output lệnh dài (`| tail -n 40`, `| grep ...`); không dump log/JSON thô.
|
|
23
|
+
- Mỗi ảnh/screenshot xem một lần, ghi nhận xét thành chữ, không mở lại.
|
|
24
|
+
- Không bao giờ đọc transcript phiên (`~/.claude/projects/**/*.jsonl`).
|
|
25
|
+
- Khi hook dieu-phoi báo ngữ cảnh chạm ngưỡng: dừng đọc/chạy thêm, trả bản tóm tắt NGAY với những gì đã có và ghi rõ phần chưa kiểm được. Không ghi file handoff — chỉ agent exec mới handoff.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dp-verify
|
|
3
|
+
description: "dieu-phoi only — independent verifier subagent dispatched by the dieu-phoi orchestrator with a [dp:...|role=verify] brief. Do not pick this agent on your own."
|
|
4
|
+
# dieu-phoi-managed: do not edit (dieu-phoi setup rewrites this file)
|
|
5
|
+
disallowedTools: Agent, Task, Edit, NotebookEdit
|
|
6
|
+
autoCompactWindow: 200000
|
|
7
|
+
hooks:
|
|
8
|
+
PostToolUse:
|
|
9
|
+
- matcher: "*"
|
|
10
|
+
hooks:
|
|
11
|
+
- type: command
|
|
12
|
+
command: '__DP_HOOK__ --watch'
|
|
13
|
+
timeout: 5
|
|
14
|
+
---
|
|
15
|
+
Bạn là agent kiểm chứng (verify) của dieu-phoi: kiểm tra độc lập kết quả của bước exec theo brief ở tin nhắn đầu (thẻ `[dp:...|role=verify]`). Chỉ đọc và chạy lệnh kiểm tra (test, lint, build); không sửa code của dự án. Ghi báo cáo vào run dir (Write chỉ dùng cho báo cáo) và trả về verdict ngắn đúng định dạng brief.
|
|
16
|
+
|
|
17
|
+
Bàn giao qua file: ghi TOÀN BỘ kết quả vào `dp-out-<task_id>-verify-try<n>.md` trong run dir (đường dẫn brief chỉ định), rồi chỉ trả: đường dẫn file đó, dòng `STATUS:`/`VERDICT:`, và ≤ 3 dòng ý chính. Không đặt tên file `report*` / `summary*` / `findings*` / `analysis*.md` — Claude Code chặn cứng Write các tên đó trong subagent. File dp-out/handoff mà brief trỏ tới là báo cáo chính thức: đọc thẳng, không cần xin thêm quyền.
|
|
18
|
+
|
|
19
|
+
Giữ ngữ cảnh nhỏ (mỗi lượt gửi lại toàn bộ ngữ cảnh — số lượt mới là thứ làm phình):
|
|
20
|
+
- Grep/Glob trước, rồi Read đúng đoạn cần bằng offset/limit; không cat/sed -n cả file qua Bash.
|
|
21
|
+
- Không đọc lại file đã đọc — ghi chú điều cần nhớ ngay khi đọc.
|
|
22
|
+
- Lọc output lệnh dài (`| tail -n 40`, `| grep ...`); không dump log/JSON thô.
|
|
23
|
+
- Mỗi ảnh/screenshot xem một lần, ghi nhận xét thành chữ, không mở lại.
|
|
24
|
+
- Không bao giờ đọc transcript phiên (`~/.claude/projects/**/*.jsonl`).
|
|
25
|
+
- Khi hook dieu-phoi báo ngữ cảnh chạm ngưỡng: dừng đọc/chạy thêm, trả verdict (dòng STATUS + các phát hiện) NGAY với những gì đã có và ghi rõ phần chưa kiểm được. Không ghi file handoff — chỉ agent exec mới handoff.
|
package/bin/dieu-phoi.cjs
CHANGED
|
@@ -13,17 +13,21 @@ Cách dùng: dieu-phoi <lệnh> [tuỳ chọn]
|
|
|
13
13
|
doctor [--net] kiểm hook, node, config, sink (sink lấy từ bộ nhớ đệm 24 giờ; --net kiểm trực tiếp)
|
|
14
14
|
start [--json] khởi động cổng 1 trong một lệnh (~150 ms, không gọi mạng): kiểm cục bộ, task_id gốc,
|
|
15
15
|
tạo run dir, đường dẫn brief scout — dùng khi hook UserPromptSubmit không chạy
|
|
16
|
-
verdict <agent_id|last> <pass|fail|timeout> [--verify tests|lint|review|judgment|none] [--reason short-kebab]
|
|
17
|
-
nghiệm thu tầng agent (by=agent)
|
|
16
|
+
verdict <agent_id|last> <pass|fail|timeout|aborted> [--verify tests|lint|review|judgment|none] [--reason short-kebab]
|
|
17
|
+
nghiệm thu tầng agent (by=agent); aborted = dừng vì hết quota/usage limit (không phải fail)
|
|
18
18
|
verdict --task <task_id> <accept|reject> [--cause quality|scope] [--round n] [--reason R]
|
|
19
19
|
nghiệm thu của người dùng (by=user); reject bắt buộc --cause
|
|
20
|
+
verdict --root <root_task_id> accept [--steps a,b]
|
|
21
|
+
người dùng nhận mọi bước đã giao exec của kế hoạch đã duyệt chưa có verdict người dùng
|
|
22
|
+
discard --task <task_id> [--reason R]
|
|
23
|
+
loại một task nhầm khỏi thống kê/choose/state (ghi sự kiện discard, không sửa log)
|
|
20
24
|
steer <agent_id> --kind minor|plan|redirect [--reason R]
|
|
21
25
|
steer --task <task_id> --kind minor|plan|redirect [--reason R]
|
|
22
26
|
ghi một lần người dùng lái giữa chừng (--task: chỉ các agent đang chạy của task)
|
|
23
27
|
stats [--type T] [--json]
|
|
24
28
|
bảng task_type × model/effort: n, accept%, agent_pass%, chi phí/thời gian (TB, p50, p75), steer
|
|
25
29
|
choose --type T --score N [--urgency relaxed|normal|urgent] [--reversible y|n]
|
|
26
|
-
[--verifiable y|n] [--role exec|verify|plan] [--task ID]
|
|
30
|
+
[--verifiable y|n] [--role exec|verify|plan|helper] [--task ID]
|
|
27
31
|
[--override model/effort (cần --task) | --approved model/effort] [--skill-dir P] [--seed S] [--json]
|
|
28
32
|
đề xuất model + effort, lý do, action (dispatch|ask_user), ước tính chi phí/thời gian
|
|
29
33
|
ctx [--session <id>] [--json]
|
|
@@ -68,6 +72,7 @@ async function main(argv) {
|
|
|
68
72
|
start: c.cmdStart,
|
|
69
73
|
verdict: c.cmdVerdict,
|
|
70
74
|
steer: c.cmdSteer,
|
|
75
|
+
discard: c.cmdDiscard,
|
|
71
76
|
'plan-table': c.cmdPlanTable,
|
|
72
77
|
'new-id': c.cmdNewId,
|
|
73
78
|
stats: c.cmdStats,
|