计划执行与检查节点
executing-plans
按既定实施计划完成工作,保持过程检查和反馈。
du-dum【效率与协作】使用双时钟架构在自主代理循环中将昂贵的观察与廉价的决策分离。快时钟将 数据累积到摘要文件中;慢时钟读取摘要并仅在有待办事项时行动。空闲周期 零成本,因为行动时钟在读取空摘要后立即返回。在构建必须持续观察但只能 偶尔行动的自主代理时、当 API 或 LLM 成本占主导且大多数周期无事可做时、 在设计具有观察和行动阶段的基于 cron 的代理架构时,或当现有心跳循环因 每次 tick 调用 LLM 而过于昂贵时使用。
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
使用以不同频率运行的两个时钟分离观察与行动。快时钟(分析)廉价地收集数据并写入紧凑摘要。慢时钟(行动)读取摘要并决定是否行动。如果摘要表示无待办事项,行动时钟立即退出 —— 空闲周期零成本。
名称源自心跳节律:du-dum、du-dum。第一拍(du)观察;第二拍(dum)行动。多数时候,只有第一拍触发。
将所有工作分为观察(廉价、频繁)和行动(昂贵、罕见)。
| 时钟 | 成本特征 | 频率 | 示例 |
|---|---|---|---|
| 快(分析) | 廉价:API 读取、文件解析、无 LLM | 每天 4-6 次 | 扫描 GitHub 通知、解析 RSS、读取日志 |
| 慢(行动) | 昂贵:LLM 推理、写操作 | 每天 1 次 | 撰写响应、更新仪表板、发送告警 |
预期结果: 清晰的双列拆分,每个操作恰好分配给一个时钟。快时钟无 LLM 调用;慢时钟无数据收集。
失败处理: 若操作既需读取又需 LLM 推理(如"汇总新 issue"),拆分它:快时钟将原始 issue 收集到摘要;慢时钟汇总它们。摘要是边界。
摘要是连接两个时钟的低带宽消息。它必须紧凑、人类可读、机器可解析。
pending: none 或空部分)示例摘要结构:
# Digest — 2026-03-22T06:30:00Z
## Pending
- PR #42 needs review response (opened 2h ago, author requested feedback)
- Issue #99 has new comment from maintainer (action: reply)
## Status
- Last analyzed: 2026-03-22T06:30:00Z
- Sources checked: github-notifications, rss-feed, error-log
- Items scanned: 14
- Items pending: 2
无待办事项时:
# Digest — 2026-03-22T06:30:00Z
## Pending
(none)
## Status
- Last analyzed: 2026-03-22T06:30:00Z
- Sources checked: github-notifications, rss-feed, error-log
- Items scanned: 8
- Items pending: 0
预期结果: 一个带有清晰 pending/empty 状态的摘要模板。行动时钟可通过检查单个字段或部分来确定是否继续。
失败处理: 若摘要变得太大(>50 行),快时钟包含了过多原始数据。将细节移到单独的数据文件,保持摘要为带指针的概述。
构建按快速调度运行的观察脚本。
# Pseudocode: analyze-notifications.sh
fetch_notifications()
filter_actionable(notifications)
format_as_digest_entries(filtered)
atomic_write(digest_path, entries)
log("analyzed {count} notifications, {pending} actionable")
调度示例(cron):
# Fast clock: analyze every 4 hours
30 */4 * * * /path/to/analyze-notifications.sh >> /var/log/analysis.log 2>&1
0 6 * * * /path/to/analyze-pr-status.sh >> /var/log/analysis.log 2>&1
预期结果: 一个或多个分析脚本,每个产出或更新摘要文件。脚本独立运行 —— 若一个失败,其他仍更新各自部分。
失败处理: 若数据源暂时不可用,脚本应记录错误并保留先前摘要条目完好。源故障时不要清除摘要 —— 对行动时钟而言,过时数据胜过缺失数据。
构建读取摘要并决定是否行动的行动脚本。
# Pseudocode: heartbeat.sh (the slow clock)
digest = read_file(digest_path)
if digest.pending is empty:
log("heartbeat: nothing pending, exiting")
exit(0)
# Only reaches here if work exists
response = call_llm(digest.pending, system_prompt)
execute_actions(response)
archive_digest(digest_path)
log("heartbeat: processed {count} items, cost: {tokens} tokens")
调度示例(cron):
# Slow clock: act once per day at 7am
0 7 * * * /path/to/heartbeat.sh >> /var/log/heartbeat.log 2>&1
预期结果: 行动脚本在空闲周期内 1 秒内退出(仅文件读取和空检查)。在活跃周期内,处理待办事项并清除摘要。
失败处理: 若 LLM 调用失败,不要清除摘要。待办事项保留供下个行动周期。考虑在摘要中实现重试计数器,以避免对永久失败项的无限重试。
成本节省源于空闲检测 —— 行动时钟必须以最小开销可靠地区分"无事可做"与"有事可做"。
# Minimal idle check
if grep -q "^(none)quot; "$DIGEST_PATH" || grep -q "pending: 0" "$DIGEST_PATH"; then
echo "$(date -u +%FT%TZ) heartbeat: idle" >> "$LOG_PATH"
exit 0
fi
预期结果: 空闲路径是单次文件读取后跟字符串匹配。无网络调用、除脚本本身外无进程产生。
失败处理: 若空闲检查不可靠(误报导致漏工作,或漏报导致不必要的 LLM 调用),简化摘要格式。文件顶部的单个布尔字段(has_pending: true/false)是最可靠的方法。
计算预期成本以确认双时钟架构带来节省。
fast_runs = 24 / fast_interval_hoursfast_runs * cost_per_analysis_run(若无 LLM 应约为 $0)active_days_fraction * cost_per_action_run(1 - active_days_fraction) * cost_per_idle_check(应约为 $0)成本比较示例:
| 架构 | 每日成本(活跃) | 每日成本(空闲) | 月度成本(80% 空闲) |
|---|---|---|---|
| 单循环(每 30 分钟 LLM) | $13.74/37h | $13.74/37h | ~$400 |
| Du-dum(6 次分析 + 1 次行动) | $0.30 | $0.00 | ~$6 |
预期结果: 成本模型显示在空闲日 du-dum 架构比原始至少便宜 10 倍。
失败处理: 若成本模型未显示显著节省,可能是以下之一:(a) 快时钟过频,(b) 快时钟包含隐藏的 LLM 调用,或 (c) 系统很少空闲。Du-dum 受益于高空闲比的系统。若系统始终活跃,更简单的轮询方法可能更合适。
manage-token-budget —— du-dum 使之实用的成本控制框架;du-dum 是架构模式,token 预算是会计层circuit-breaker-pattern —— 处理故障情况(工具损坏);du-dum 处理正常情况(无事可做)。一起使用:du-dum 用于空闲检测,circuit-breaker 用于故障恢复observe —— 快时钟的观察方法;du-dum 通过摘要构造观察何时及如何变得可执行forage-resources —— 战略探索层;du-dum 是 forage-resources 在其内运行的执行节奏coordinate-reasoning —— 共生信号模式;摘要文件是共生的一种形式(通过环境工件的间接协调)