桌面用量视图需要缓存,才能在冷启动和短暂网络故障时继续工作。危险的简化是给整个快照只设置一个更新时间:Claude 刷新成功、Codex 刷新失败后,只要重写文件,旧的 Codex 结果就会被一个新时间戳续期。
正确边界应该和故障边界一致:每个 provider 单独记录时间,并用保守规则决定哪些数据可以进入缓存。
值与新鲜度一起保存
Agent Island v1.7.1 的快照包含 Claude、Codex、兼容旧结构的整体时间,以及独立的 claudeUpdatedAt 和 codexUpdatedAt。旧缓存可以回退到整体时间,新写入则保留每个 provider 的真实年龄。
snapshot = {
claude, codex,
updatedAt,
claudeUpdatedAt,
codexUpdatedAt
}整体时间可以帮助兼容旧记录和快速淘汰快照,但它不能证明两个 provider 都同样新鲜。
错误结果不能当成新数据缓存
一个结果只有在相关窗口没有错误,并且至少有一个真实信号时才可缓存:正的使用比例或 reset 时间。只有套餐名称、两个窗口都是 0%,不算真实用量。否则身份验证失败或空响应可能被保存成看似正常的 0%。
即使失败结果保留了上次成功的比例,只要仍带错误,也不能用本次时间写入缓存。它可以临时显示,但不能把旧数值洗成新数据。
部分成功可以保留,不能续期
如果 Claude 返回新结果而 Codex 超时,快照可以保存新的 Claude,并带上上次有效的 Codex。时间戳必须保持真实:
Claude: 新值 claudeUpdatedAt: 当前时间
Codex: 旧值 codexUpdatedAt: 原时间如果两个 provider 都没有产生可缓存的新结果,就不写新快照。没有被抓取的 provider 也遵守同一规则:可以保留有效旧值,但不能因为同伴被抓取就获得新时间。
恢复时分别过期
恢复缓存时,每个 provider 的时间都要单独与最大年龄比较。一个 provider 可以恢复,另一个可以变为空。这样在部分故障期间仍能利用有效数据,又不会把两份数据包装成同一种可信度。
这也能处理响应结构变化。2026 年 7 月的 Codex 可能只有一个实际使用窗口,第二窗口明确缺失。只要真实窗口含有使用比例或 reset 时间,该结构仍可缓存。强制要求两个窗口都有数据,反而会让有效响应永远无法缓存。
应该覆盖的策略测试
- 带错误的保留值不能新建或续期快照。
- 只有套餐、0% 且无 reset 的数据不能缓存或恢复。
- 真实用量保留比例与 reset 时间。
- Claude 刷新成功时,可以保留旧 Codex,但不能修改 Codex 时间。
- 未抓取的 provider 不能获得新时间。
- 恢复时可以保留一方并淘汰另一方。
- 有效的单窗口响应仍可缓存。
产品与指标边界
这套缓存策略与测试存在于 v1.7.1 标签的 macOS 和 Windows 源码中。macOS 用户可见的用量界面已经核验;Windows 策略文件存在,并不能单独证明 Windows 每个用量界面的行为,仍需另做 UI 验证。
用量比例和本地 API value 估计也不等于订阅账单、节省金额、收入、用户数或安装量。缓存正确性只是让显示更诚实,不会改变指标本身的含义。
实现可在公开的 Agent Island v1.7.1 源码中核验。可复用原则是:按失败依赖划分新鲜度,不给未抓取的数据续期,也不要把空响应自动解释为 0%。
