|
|
@@ -227,4 +227,31 @@ T1/T2/T3 互不相干可并行(三组代码隔离在不同脚本);T5 必
|
|
|
|
|
|
**下一步**:T5(派发链直连·核心)→ T6(填槽并入 --auto)→ T7(会话恢复)→ T8(巡检并入 WorkBuddy automation),依序推进。
|
|
|
|
|
|
+---
|
|
|
+
|
|
|
+### T5 派发链直连(核心改造) —— ✅ 已落地 + 验证通过(2026-11-08 用户拍板「立即实施 T5」)
|
|
|
+
|
|
|
+**目标**:`dispatch.py` 不再 `subprocess.run(tools/xaf_agent_hub/hub.py dispatch)`,改为直接 `import tdd_orchestrate` 复用 skill 的 T1–T4 能力(实例级模型链 / 家族黑窗 / 负载选路 / 槽位锁)完成选路、建会话、投递——hub 的派发末端从进程依赖变为零依赖(第二步 hub 退役后,派发链路 100% 由 skill 自给)。
|
|
|
+
|
|
|
+**改动**:
|
|
|
+- **`E:/cfc/.workbuddy/dispatch.py`**:
|
|
|
+ 1. 常量 `HUB_PY` → `SKILL_TDD_DIR`/`SKILL_TDD_SCRIPTS`(`TDD_SKILL_DIR` 可覆盖,默认 `~/.workbuddy/skills/tdd-orchestrator`);把 skill scripts 加入 `sys.path`。
|
|
|
+ 2. 新增 `_import_skill()`:导入 `tdd_orchestrate`,失败返回 None(优雅降级,错误信息提示 `TDD_SKILL_DIR`)。
|
|
|
+ 3. `_hub_dispatch` → `_skill_dispatch(instruction, tid, session_id="", instance="", dry_run=False, model_hint="")`:
|
|
|
+ - ① 优先复用调用方已建会话(auto_dispatch 经 `_alloc_with_quota_check` 分配、T4 槽位锁内 commit 的 `session_id`,经 `--session` 传入,避免二次分配/锁竞争)→ 直接 `send_prompt`;
|
|
|
+ - ② 无会话 → skill 选路(`pick_least_loaded_instance`,T3)→ `_alloc_dedicated_session(client_override=...)` 建会话(实例级模型链 + 家族黑窗,T1/T2);
|
|
|
+ - ③ `cc.send_prompt(sid, instruction)` 入队成功即 verified(异步语义,执行确认仍由 git 真理兜底)。
|
|
|
+ 4. `main()` 新增 argparse `--session`/`--instance`(供 auto_dispatch 透传);dry-run 分支改交 `_skill_dispatch(dry_run=True)` 处理(含选路/建会话预演,只是不 send_prompt);模块 docstring 更新(不再提 hub 为派发引擎)。
|
|
|
+- **skill `tdd-orchestrator/scripts/tdd_orchestrate.py`**:`auto_dispatch` 子进程调用 `[sys.executable, dp, "--task", tid, "--json"]` → 追加 `--session <sid>`(若已分配)与 `--instance <picked>`(若选路成功)——T4 锁内分配的会话不再被 dispatch 侧二次浪费。
|
|
|
+
|
|
|
+**验证(全过)**:
|
|
|
+- `py_compile` 通过 `dispatch.py` + `tdd_orchestrate.py`;`dispatch.py` grep 确认代码层 `_hub_dispatch`/`HUB_PY`/`hub.py` 调用 0 命中(仅注释/docstring 记录历史)。
|
|
|
+- dry-run 快速路径:`python .workbuddy/dispatch.py --task S-cfc-20 --json --dry-run --instance lan-189` → `{"verified": true, "verify_detail": "[DRY-RUN] 将直连 skill 建会话并投递到 lan-189(未发送)..."}` ✓
|
|
|
+- dry-run 会话透传:`--instance lan-189 --session sess-test-001` → `"[DRY-RUN] 将直连 skill send_prompt 到 lan-189/sess-test-001(未发送)"` ✓(JSON 格式符合编排器约定)
|
|
|
+- 最小集成:真实 `machine.json` 解析 `_opencode_client(lan-189)` 返回 `OpenCodeClient` 且 `hasattr(cc, 'send_prompt')==True`;`_import_opencode_client` 经 `_clients_json_candidates` 回退路径正确定位 `opencode-orchestrator/scripts` ✓
|
|
|
+
|
|
|
+**注意(记录)**:`opencode_client.py` 位于 `opencode-orchestrator/scripts/`(非 tdd-orchestrator),由 tdd_orchestrate `_import_opencode_client` 经相对路径回退导入——**两 skill 必须同机共存**,第二步 hub 退役不受影响。
|
|
|
+
|
|
|
+**下一步**:T6(填槽并入 --auto)→ T7(会话恢复)→ T8(巡检并入 WorkBuddy automation),依序推进。
|
|
|
+
|
|
|
|