turn-eta——预测本轮任务何时完成,并从实际耗时中学习
在开始工作之前,将步骤写为编号列表,并说明何时完成。每完成一步,计时该步骤。本轮结束时,用实际完成时间结束回复。下一次估算将读取日志。
何时运行
每一轮包含实际工作的对话——编辑文件、运行命令、搜索代码库。
- 本轮包含实际工作 → 在 开始前 调用
plan,并在回复开头打印它输出的内容,按输出顺序:首先是**ETA …**行,单独一行,然后是编号步骤。完成时间是读者最关心的;下面的步骤是推理过程。每完成一步调用step <id>,本轮工作完成时调用done <id>。 - 最后一段也是时间,具体是哪一种取决于是否仍有任务在运行。
- 所有工作在回复写出前已完成 → 整个
done块输出:来自done的完成时间。此时 ETA 已经过期;重复打印只会给读者一个已被时间证伪的猜测,而每步耗时则显示了问题出在哪里。 - 仍有任务在运行(后台作业、委托任务)→ 预报:
**ETA 17:45**。在写出回复时重新计算,切勿粘贴plan先前打印的数字。
- 所有工作在回复写出前已完成 → 整个
- 纯对话轮(回答问题、决定构建内容)→ 不做任何事。那是噪音。
- 一行代码的修复也不值得这一套仪式。当步骤多于一个时再使用。
命令
纯 Node.js,无需安装。从技能安装目录调用。
# 工作开始前——列出步骤并获取 ETA
node <skill>/scripts/eta.js plan \
"复现故障" "修复日期解析器" "更新测试数据" "重新运行测试套件" \
--provider anthropic --model claude-opus-5 --size M
# **ETA 17:45**(14 分钟)
#
# 1. 复现故障
# 2. 修复日期解析器
# 3. 更新测试数据
# 4. 重新运行测试套件
#
# 4 个步骤,约 14 分钟(来自 anthropic/claude-opus-5 M 的每步 3.5 分钟,6 轮)
#
# (最近 6 次估算偏长了 3 分钟)
# turn id: 48i35qek
# 每完成一步——计时,并根据实际进度重新预报剩余时间
node <skill>/scripts/eta.js step 48i35qek
# 2/4 修复日期解析器 — 8 分 06 秒
#
# **ETA 17:49**(4 分钟后)
# 当本轮工作完成时
node <skill>/scripts/eta.js done 48i35qek
# **完成时间 17:48**(预估 14 分钟 / 实际 17 分钟)
# 查看当前日志内容
node <skill>/scripts/eta.js stats
请命名步骤,不要只计数。 plan 拒绝纯数字。无法验证的计数不是计划——命名步骤可以让阅读的人在你开始前说“跳过第 3 步”。将编号列表放在回复顶部,然后再开始工作。
你必须传递自己的 --provider 和 --model。 Shell 无法知道是哪个模型在驱动。使用你自己知道的标识符——--provider anthropic --model claude-opus-5、--provider openai --model gpt-5-codex、--provider google --model gemini-3-pro。缺失任何一项都会归入 unknown/unknown,虽然仍然可用,但会将所有模型的数据混在一起。
--size 是 S(小修复)、M(普通,默认值)或 L(大块任务)。大致估计即可;它只防止小任务拉大任务平均值的后腿。
turn id 是必需的。 plan 会打印一个;请在所有 step 和最后的 done 中携带它——step 48i35qek、done 48i35qek。同一个项目中的另一个智能体也会写入同一个日志,因此没有 id 的调用曾经会关闭恰好打开的任意一个轮次——可能是别人的。step 和 done 现在拒绝没有 id 的调用。超过四小时无人触碰的轮次将被视为已放弃。
日志存储位置
<project root>/.eta/<provider>/<model>/log.tsv
位于项目内部,因此权限仅限于工作目录的智能体仍然可以读取自己的历史记录。项目根目录是向上查找最近的 .git,否则是当前目录。提供商和模型作为文件夹名称,因此一个模型的节奏不会悄悄变成另一个模型的。
将 .eta/ 添加到 .gitignore。它是对你机器在你轮次上的度量;对其他人毫无意义,并且在每个轮次中都会变化。
设置 TURN_ETA_DIR 指向另一个 .eta 目录,可以在项目间共享历史记录。仅当本地日志数据太少无法作出合理估算时才会查询它。
估算如何变得更准确
done 记录估算值、实际值以及每步耗时。plan 读取这些记录,并取 每步中位时间,从最精确的匹配层级向外扩展,在第一个至少有 3 个已完成轮次的层级停止:
- 当前提供商 + 模型 + 相同规模
- 当前提供商 + 模型
- 当前提供商,任意模型
- 本项目
.eta中的所有数据 TURN_ETA_DIR中的共享日志,相同顺序- 否则每步 4 分钟
采用中位数而非平均数,因此一次过长的轮次不会拖累所有未来的估算。每个层级只计入最近 20 个轮次。plan 会打印使用了哪个层级,因此数字永远不会是一个谜。
在对轮次进行中,step 将该历史记录与本轮实际运行速度混合,权重取决于本轮已完成的比例:在 4 个步骤中的第 1 步时,历史记录仍占四分之三;到第 3 步时,本轮已占四分之三。一步慢不会完全接管完成时间,但会使其可见。