turn-eta — 說出這個回合何時完成,然後從實際耗時中學習
在開始工作之前,將步驟寫成編號列表,並說出預計完成的時間。每個步驟完成時記錄時間。當回合結束時,在回覆的結尾加上實際完成的時間。下一次的預估會讀取該記錄檔。
何時執行
每個包含實際工作的回合——編輯檔案、執行命令、搜尋程式碼庫。
- 回合中有工作 → 在開始之前呼叫
plan,並以它輸出的內容作為回覆的開頭,依序輸出:先單獨一行顯示**ETA …**,然後是編號步驟。完成時間是讀者最關心的;下方的步驟是推論的依據。每個步驟完成時呼叫step <id>,當回合工作全部完成時呼叫done <id>。 - 最後一段也是時間,而這個時間取決於是否還有程式在執行。
- 所有工作在你寫回覆前已完成 → 顯示
done輸出的整個區塊:完成時間行來自done。此時 ETA 已經過期;重新印出 ETA 會給讀者一個已經被時鐘推翻的猜測,而每個步驟的實際時間則顯示了哪裡出了問題。 - 仍有程式在執行(背景工作、委派任務)→ 顯示預測:
**ETA 17:45**。在寫回覆時重新計算,千萬不要貼上plan之前輸出的數字。
- 所有工作在你寫回覆前已完成 → 顯示
- 純對話回合(回答問題、決定要做什麼)→ 不做任何事。那是雜訊。
- 一行就能修復的修改也不值得執行這個儀式。只有在步驟多於一個時才使用。
命令
純 Node 環境,無需安裝。從技能安裝目錄執行。
# 工作之前 — 列出步驟並取得 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
# **FINISHED 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(大型區塊)。大致估算即可;它只是避免小型回合拖累大型回合的平均值。
回合 ID 是必需的。 plan 會輸出一個回合 ID;在每次 step 和最終的 done 中都必須攜帶——step 48i35qek、done 48i35qek。在同一個專案中工作的另一個代理會寫入同一個記錄檔,因此沒有 ID 的呼叫曾經會關閉任何開啟中的回合——包括別人的回合。step 和 done 現在拒絕沒有 ID 的呼叫。超過四小時無人觸碰的回合會被視為已放棄。
記錄檔存放位置
<專案根目錄>/.eta/<provider>/<model>/log.tsv
位於專案內,因此權限僅限於工作目錄的代理仍然可以讀取自己的歷史記錄。專案根目錄是向上尋找最近的 .git 目錄,否則為當前目錄。Provider 和 model 是資料夾名稱,這樣一個模型的速度就不會默默變成另一個模型的速度。
將 .eta/ 加入 .gitignore。這是你的機器在你回合中的測量數據;對其他人沒有意義,而且每個回合都會改變。
設定 TURN_ETA_DIR 指向另一個 .eta 目錄,可以在不同專案之間共享歷史記錄。只有在本地記錄檔資料太少無法提供預估時,才會參考這個目錄。
預估如何變得更準
done 記錄了預估值、實際值以及每個步驟的時間。plan 讀取這些資料,並取每個步驟的中位數分鐘數,從最精確的匹配開始向外擴展,並在第一個至少有 3 個已完成回合的層級停止:
- 相同 provider + model + 相同 size
- 相同 provider + model
- 相同 provider,任何 model
- 這個專案
.eta中的所有資料 TURN_ETA_DIR中的共享記錄檔,採用相同順序- 否則每個步驟 4 分鐘
使用中位數而非平均數,這樣一個耗時較長的回合就不會拖累未來的所有預估。每個層級只計算最近 20 個回合。plan 會輸出它使用了哪個層級,因此數字來源永遠不是謎。
在回合進行中,step 會將該歷史資料與當前回合的實際速度混合,權重取決於當前回合完成的進度:在第 1 步(共 4 步)時,歷史資料仍佔四分之三;到第 3 步時,當前回合佔四分之三。一個緩慢的第一步會移動完成時間,但不會完全主導預估。