merge: 合并冲突解决 —— worker 池化评估 + SDK resume 抗抖动 [tsk_xbtd6GpS4NYg]

将 maestro/tsk_74Acz1Nh4K1J 分支的 DESIGN.md 改动手动合并:
1. §19 分期状态:新增「🟡 worker 池化(已评估,暂缓)」说明
2. §20 风险与注意事项:新增「SDK 抖动 → resume 续跑」条目

保留了 HEAD 中已有的更详细版本的「自动执行安全」和「中断恢复(多进程 re-adopt)」条目。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
wangjia
2026-06-13 16:46:50 +08:00
parent 0ed4f73106
commit 724cebb653
+2
View File
@@ -239,9 +239,11 @@ daemon 启动时订阅 Store 事件流,符合条件时用 `osascript display n
-**Phase 2(自动化,已完成)**:编排器 + score 调度 + Agent SDK executorEasy/Medium/Hard worktree 自动执行)+ verify + 双复审(code review + 安全审计)+ 自动合并(--no-ff + 逃生口)。
-**Phase 3(打磨,核心已完成)**:多进程执行解耦(daemon 监工 + 独立 worker 进程 + job.json/outbox/heartbeat 文件通讯 + 重启 re-adopt,见 §7+ macOS 原生通知 + Claude 订阅额度透传 + 归档详情时间线 + 模型分级(复杂度→模型映射 + env 覆盖 + 回退链)+ 项目 logo + 侧栏拖动排序。
- 🔲 **后续**:并发资源精细监控 / 指标面板 / 可选远程看板 / PR 平台集成(GitHub PR 链接)。
- 🟡 **worker 池化(已评估,暂缓)**:长驻 worker 从队列拉任务、省 spawn 冷启动开销,仅在 spawn 量很大时才有收益。当前模型是干净的「一 run ↔ 一 pid」:`setWorkerPid`/`isWorkerAlive`/reaper/`reconcileInterrupted` 全靠「每 run 一个 pid + 一份心跳」判活与恢复,且 worker 与 DB 完全隔离 + 重启 re-adopt 天然得到崩溃恢复。池化会打破该不变量(一个池 worker 在跑哪个 run?单进程崩溃波及 N 个任务、共享 worktree 冲突),收益只在高并发量下兑现。现规模下**保持「每任务一进程 + 失败从头重跑」的简单模型**,不引入池化。
## 20. 风险与注意事项
- **Agent SDK headless 执行可靠性**verify_cmd 把关 + 双复审 + needs_attention 人工兜底。executor run 最多 100 轮、30min 超时兜底;reviewer run 最多 40 轮、15min 超时兜底。
- **SDK 抖动 → resume 续跑**`cc.ts`):单次会话若因流式异常中断(流断 / 没收到 result,**非**超时取消、**非** max_turns 等终态),且已拿到 sessionId,则在 worker 进程内用 `resume` 接着原会话续跑一次(保留已干的活,不从头重来),剩余预算不足时至少留 60s。这是 worker 内部健壮性小优化,与「重启靠 re-adopt、整体失败靠 daemon 从头重跑」**正交、不替代**它们;`MAESTRO_SDK_RESUME=0` 可关闭。与模型不可用回退(换模型重开会话)互斥。
- **自动执行安全**:worktree 隔离(改动不进主检出)+ 不自动 push + merge 需 exec_review accept + 安全审计 run 专门检查凭证/注入/权限问题;worker 进程不碰 DB(无法越权改任务状态),spawn 时黑名单剥离真密钥类 env。
- **中断恢复(多进程 re-adopt**daemon 重启后 `reconcileInterrupted()``worker_pid + 心跳` 真判活——worker 仍活则 **re-adopt**(保留 executing,续 ingest 其 outbox,不打断正在跑的 agent);已死则 `failTaskAttempt` 回收重试。daemon 与 worker 解耦后,daemon 崩溃/重启不再丢失在途执行。
- **长任务上下文超限**100 turns / 30min 兜底,超时后转 failed → 重试。