All checks were successful
CI / test (push) Successful in 4m2s
方案③落地后,智能评估执行机制从'常驻 cron 每分钟自唤醒'改为'平台每 60s 扫描入队 + 按需触发无状态 headless agent'(触发式执行)。对齐领域语言: - CONTEXT.md:Cron 池/工作单元(Worker)标 deprecated;新增触发式执行词条; 修正时间窗口(cron 自唤醒→平台扫描时段到期)、任务队列(消费端)、决策日志 - ADR-0009 新增:记录触发式执行取代 cron 池的决策(原因:cron 需外部 channel, OpenClaw webchat 非 channel 账号无法 delivery);ADR-0007 标 superseded - 代码标 deprecated:cron_pool / fault_tolerance / openclaw_cron_pool 路由 / CronPoolMonitor 页(导航入口已从 App.tsx 移除,监控由 TaskQueueMonitor 承担) 895 passed, vitest 19 passed
2.6 KiB
2.6 KiB
ADR-0009: 智能评估执行改为触发式执行(取代 Cron 池)
状态: 已接受 日期: 2026-08-17 决策者: 架构团队 相关: 取代 ADR-0007(Cron 池模式)、CONTEXT.md(智能评估词汇)
Context
智能评估原按 ADR-0007 采用 Cron 池模式:平台维护 5-20 个 OpenClaw cron(工作单元),每个 cron 每分钟自唤醒、从平台任务队列取任务执行。2026-08 实际部署验证发现该机制依赖外部 IM channel:OpenClaw 的 cron delivery 需要一个 channel 账号,而 webchat 是 Control UI 内置、非 channel 账号,无法用于 delivery;--command cron 同样 fail-closed。结果 cron worker 永远无法被唤醒执行,评估卡在 assigned。
Decision
将智能评估执行改为触发式执行(Trigger-driven):
- 平台掌控节奏:lifespan 后台循环每 60s 扫描 executing 评估 → 判断时段到期/欠账 → 入队(任务队列语义不变)
- 平台按需触发:有 pending 任务时
docker exec openclaw-eval openclaw agent --agent main -m "<worker skill + 立即完成,不要等待下一节拍>" --json,触发一个无状态 headless agent(--deliver默认 false,免外部 channel)执行 worker skill,从任务队列取任务,完成即退 - 平台兜底:assigned 超时(>10min)重入队(
requeue_stale_assigned_tasks);agent 未上报决策日志时按状态补录(cron_id=platform)
任务队列、决策日志、评估状态机等共享层原样保留;变化只在"执行主体":常驻 cron(pull、有状态)→ 按需触发的一次性 agent(push、无状态)。
已否决的方案
- 常驻 cron worker(ADR-0007 原方案):需外部 IM channel,OpenClaw webchat 非 channel 账号,
--commandcron fail-closed——cron 无法被唤醒 - 平台静态执行:平台直接驱动对话会退化为静态评测,失去 OpenClaw 的自主决策(ADR-0007 已否决过)
Consequences
- Cron 池代码遗留:cron_pool.py / fault_tolerance.py / openclaw_cron_pool 路由 / Cron 池监控页为遗留,标注 deprecated,导航入口移除;t480 上旧
intelligent-eval-workercron 已禁用(保留agenteval-patrol独立 cron) - 卡死检测机制变化:cron 的 busy/last_active stuck 检测对无状态 agent 不适用,改为平台 assigned 超时重入队
- 触发指令必须带"立即完成"语义:
openclaw agent无 cron state,若只发 skill 名会按 worker skill 的"跨节拍"设计决策后等下一拍而死锁 - 监控载体变化:旧"定时触发"可视化由任务队列监控页(TaskQueueMonitor)取代