agent-fleet/openspec/changes/dynamic-execution-mode/tasks.md
Zer4tul 48c93e2ce9 feat: dynamic execution mode — Undecided tasks, two-phase dispatch, assign API
- ExecutionMode enum adds Undecided variant (default for new tasks)
- Webhook creates tasks as Undecided instead of hardcoded SshCli
- Dispatch loop: Phase 1 matches ssh_cli hosts, Phase 2 marks remaining as HttpPull
- Dequeue now returns http_pull AND undecided tasks (atomic claim)
- New endpoint: POST /api/v1/tasks/{id}/assign for coordinator explicit assignment
- Backward compatible: existing SshCli/HttpPull tasks unaffected
- 37 tests passing (6 new)
2026-05-13 05:29:12 +08:00

2.2 KiB
Raw Blame History

1. 数据模型

  • 1.1 ExecutionMode enum 新增 Undecided 变体
  • 1.2 Task 默认 execution_mode 改为 Undecided
  • 1.3 DB schema 更新(如需要)
  • 1.4 单元测试Undecided 序列化/反序列化

2. Forgejo Webhook

  • 2.1 移除 forgejo.rs 中硬编码的 ExecutionMode::SshCli
  • 2.2 改为 ExecutionMode::Undecided
  • 2.3 测试webhook 创建的任务 execution_mode 为 Undecided

3. Dispatch Loop 重写

  • 3.1 Phase 1扫描 Undecided 任务,尝试匹配 ssh_cli host
    • 匹配成功 → 标记 SshCli + 执行
    • 匹配失败或 host offline → 保持 Undecided
  • 3.2 Phase 2超时未匹配的 Undecided 任务标记为 HttpPull
    • 超时阈值可配置(默认 30s即 3 个 dispatch cycle
    • 或者:直接让 dequeue 也能拉 Undecided更简单
  • 3.3 单元测试:两个阶段的各种场景
  • 3.4 集成测试:混合 ssh_cli + http_pull 环境

4. Dequeue API 更新

  • 4.1 SQL 查询改为 execution_mode IN ('http_pull', 'undecided')
  • 4.2 Dequeue 时原子更新 execution_mode 为 HttpPull如果原为 Undecided
  • 4.3 测试dequeue Undecided 任务返回 200 + 正确赋值

5. Coordinator 指派 API

  • 5.1 新增 POST /api/v1/tasks/{id}/assign
    • 请求体:{"agent_id": "...", "execution_mode": "..."(可选)}
    • 自动检测:注册的 http_pull agent → HttpPull配置的 ssh_cli host → SshCli
    • 错误处理404agent 不存在、400任务状态不允许
  • 5.2 路由注册
  • 5.3 测试:指派成功、指派失败的各种场景

6. 文档更新

  • 6.1 API 参考新增 assign 端点
  • 6.2 Skill 更新dequeue 现在也能拿到 Undecided 任务
  • 6.3 架构文档更新:两阶段 dispatch 说明

7. 验证

  • 7.1 端到端测试webhook 创建任务 → dispatch → ssh_cli 执行
  • 7.2 端到端测试webhook 创建任务 → 无 ssh_cli 匹配 → http_pull dequeue
  • 7.3 端到端测试coordinator 指派 → agent 执行
  • 7.4 竞争条件测试dispatch 和 dequeue 同时抢任务
  • 7.5 向后兼容:已有 SshCli/HttpPull 任务不受影响