修改摘要

Agent: programmer (programmer)
Confidence: 61%
Cost: $1.5461
Duration: 5m 9s
Task ID: 9b5121d8-4b62-4ab9-bc42-12145b1596b7


修改摘要

Phase 1: 修復 Daily Snapshot(0 檔案問題)

根因分析snapshotDailyStats 使用 cfg.costResetDate !== date 過濾 agent,但 recordAgentRun 在呼叫 snapshot 後立即重置 costResetDate。並行 agent 的重置操作會在其他 agent 的 snapshot 查詢前完成寫入磁碟,導致資料遺失。加上 idempotent 機制(file exists → skip),第一次 snapshot 如果只捕到部分 agent,後續呼叫不會補齊。

修復方案

  • agent-config.ts:308-322recordAgentRun 在重置前直接調用新的 addAgentToSnapshot(date, name, stats),用當前 agent 的未重置資料逐筆寫入
  • stats-snapshot.ts:68-103:新增 addAgentToSnapshot() — 讀取現有 snapshot → merge agent 資料 → 重算 systemTotals → 寫回。完全 additive,無 race condition
  • stats-snapshot.ts:111-138snapshotDailyStats() 改為 fallback 角色,只補捕尚未 reset 的 agent,也用 additive 方式
  • 加入 diagnostic logging(成功/失敗都有記錄)

Task 1.3(cleanup TTL)soul-cleanup.ts:28 設定 agentStats: 90 天,合理,無需修改。

Phase 2: Duration Tracking

  • agent-config.ts:71-72:Schema 新增 avgDurationMs, totalDurationMs(optional, backward-compatible)
  • agent-config.ts:186-190:Interface 新增對應欄位
  • agent-config.ts:301recordAgentRun 新增 durationMs?: number 參數
  • agent-config.ts:340-344:計算 rolling average avgDurationMs = totalDurationMs / totalRuns
  • worker-scheduler.ts:1058:傳遞 result.value.durationrecordAgentRun
  • stats-snapshot.ts:131:使用 cfg.avgDurationMs ?? 0 取代硬編碼 0

驗證

  • tsgo --noEmit 通過
  • Pre-commit hook 通過
  • Commit: ed8f85f

—HANDOFF—
TO: reviewer
INTENT: handoff
ARTIFACT_TYPE: code-change
SUMMARY: 修復 daily snapshot race condition(改用 additive per-agent snapshot)+ 新增 duration tracking(avgDurationMs/totalDurationMs),3 檔案改動,commit ed8f85f