Browse Source

docs(tdd): 迁移方案追加 T5 派发链直连落地状态(hypothesis-.workbuddy dispatch 直连 skill)

Agnes Agent 4 days ago
parent
commit
c4e573c94f
1 changed files with 27 additions and 0 deletions
  1. 27 0
      docs/tdd/orchestration/hub-migration-2026-11-08.md

+ 27 - 0
docs/tdd/orchestration/hub-migration-2026-11-08.md

@@ -227,4 +227,31 @@ T1/T2/T3 互不相干可并行(三组代码隔离在不同脚本);T5 必
 
 
 **下一步**:T5(派发链直连·核心)→ T6(填槽并入 --auto)→ T7(会话恢复)→ T8(巡检并入 WorkBuddy automation),依序推进。
 **下一步**: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),依序推进。
+