~/field-notes — leeguoo@misonote — zsh EN 中文 ● 日本語
❯ field-notes v3.4.1
leeguoo@misonote:/ja/posts/claude-statusbar-cache-countdown/ $ 記事

# ステータスバーのあの cache 4m23s は、結局正確なのか?

私が Claude Code 向けに書いたステータスバーには、prompt-cache のカウントダウン行がある。それが何を基準にしているのか、式はどう立てるのか、どんなときに誤解させるのか——ソースコードと実際の transcript を一緒に掘り下げる。

2026年5月29日 · 記事 · 公開 · 記事

このページの目次
1.まず 2 つの「cache」を{区別|くべつ}しよう。{混同|こんどう}しない2.どこを{基準|きじゅん}にしているか3.Anthropic の{実際|じっさい}の{挙動|きょどう}をちゃんとモデル{化|か}できているか4.どこが{不正確|ふせいかく}か——{証拠|しょうこ}を{出|だ}す5.1. デフォルト TTL が 5 {分|ふん}で{固定|こてい}されているが、あなたは 1 {時間|じかん}キャッシュで{動|うご}いているかもしれない6.2. アンカーは「1 ラウンドの{終了|しゅうりょう}」であって、「キャッシュが{更新|こうしん}されたその{瞬間|しゅんかん}」ではない7.3. {色|いろ}は{数値|すうち}ではなく{文字列|もじれつ}を{見|み}て{推測|すいそく}している8.それで、{正確|せいかく}なのか

私が Claude Code 向けに書いた状態じょうたいバー cs / claude-statusbar には、cache 4m23s というぎょうがある。緑色みどりいろで、毎秒まいびょうカウントダウンし、わりまですすむと赤色あかいろcache COLD になる。

あるひとかれた。この数字すうじ結局けっきょくどう計算けいさんしているのか、正確せいかくなのか?

価値かちのある質問しつもんだ。Pro / Max の契約けいやくユーザーにとって、キャッシュがヒットしたとき、その部分ぶぶんの context は基本的きほんてきに 5h / 7d の上限じょうげんをほとんど消費しょうひしない。ましてしまうと、つぎの prompt では全体ぜんたいのコンテキストを定価ていか最初さいしょから再投入さいとうにゅうすることになる。だから「あと何分なんぷん」というこの一行いちぎょうは、「いまあついうちにもう一通いっつうおくるべきか」をめるものだ。以下いかでそれを分解ぶんかいしつつ、正確せいかくなのかにもこたえる。

いそいでいるひと向けに一言ひとことでいうと、標準設定ひょうじゅんせってい、5 ふんキャッシュでは正確せいかくだ。ただし、体系的たいけいてきあやまってせる唯一ゆいいつのケースは、1 時間じかんキャッシュを有効ゆうこうにしているのに TTL を変更へんこうしていないとき——この場合ばあいは 55 ふんはや通知つうちする。 一行いちぎょう設定せっていなおせる。理由りゆうした説明せつめいする。

まず 2 つの「cache」を区別くべつしよう。混同こんどうしない

このリポジトリには cache とばれるものが 2 つある。「正確せいかくかどうか」をまえに、どちらのことをいているのかを確認かくにんする必要ひつようがある。

  • データキャッシュcache.pyCACHE_MAX_AGE_S = 30claude-monitor出力しゅつりょくを 30 びょうキャッシュするものだ。これは純粋じゅんすいに、ステータスバーが毎秒まいびょう再描画さいびょうがされるたびに、毎回まいかいサブプロセスを shell でたたかなくてすむようにするためのもの。 「のこ時間じかん正確せいかくか」とは関係かんけいない。
  • prompt-cache ののこ時間じかん今日きょう主役しゅやく。これは「Anthropic のプロンプトキャッシュがあとどれくらいで期限切きげんぎれになるか」を計算けいさんしている。

以下いかでは 2 つだけをあつかう。

どこを基準きじゅんにしているか

ロジックはかなりみじかく、関数は 1 つだけ、get_cache_age_text だ。やっていることは 3 つ。

  1. ~/.cache/claude-statusbar/last_stdin.jsonみ、現在げんざいのセッションの transcript_pathる。
  2. この JSONL をうしろからみ、直近ちょっきん type == "assistant" のレコードをさがし、その timestampる。
  3. remaining = ttl_seconds - <ruby>経過<rt>けいか</rt></ruby>した<ruby>秒数<rt>びょうすう</rt></ruby> として、カウントダウンのかたちにフォーマットする。

2 番目ばんめ_last_assistant_age で、要点ようてんはこの 1 ぎょうだけ。

$ python
if entry.get("type") != "assistant":
    continue
...
return (datetime.now(timezone.utc) - last_ts).total_seconds()

基準点きじゅんてん注意ちゅうい直近ちょっきんの assistant メッセージのタイムスタンプ——ユーザーメッセージでもなく、ファイルの mtime でもない。この選択せんたくただしい。なぜかはつぎせつ説明せつめいする。

しきおなじく素直すなおだ。

$ python
remaining = ttl_seconds - age_s
if remaining <= 0:
    return "COLD"

ttl_seconds はデフォルトで 300。remaining <= 0、またはそもそも assistant レコードがつからない(age_s is None場合ばあいは、どちらも COLDかえす。transcript_path すらない場合ばあい空文字列からもじれつかえし、この表示ひょうじブロック全体ぜんたいかくれる。

ついでに歴史れきしすこし:v3.2.2 のこの PR よりまえは、このぎょうが「どれくらい経過けいかしたか」(elapsed)を表示ひょうじしていたが、あとでカウントダウン(countdown)にわった。ユーザーが本当ほんとうりたいのは「前回ぜんかい回答かいとうから何分なんぷんったか」ではなく、「キャッシュがまえに、まだもう 1 つうおく時間じかんがあるか」だからだ——カウントダウンなら直接ちょくせつこたえてくれるし、elapsed だと自分じぶんあたまなかざんしなければならない。

Anthropic の実際じっさい挙動きょどうをちゃんとモデルできているか

公式こうしきドキュメント Prompt cachingると、方向ほうこうめるぶんが 2 つある:

By default, the cache has a 5-minute lifetime.

The cache is refreshed for no additional cost each time the cached content is used.

つまり、TTL はスライディングウィンドウだ。ヒットするたびに 5 ふんへリセットされる。

これは、「直近ちょっきんの 1 かいの assistant をアンカーにする」のがなぜただしいかをちょうど説明せつめいしている——1 かい回答かいとうえるたびに、age_s はゼロからかぞなおしになり、カウントダウンは自動じどうまんタンまで延長えんちょうされ、サーバーがわの「1 かい使つかうたびに 1 かい延長えんちょう」という挙動きょどう一致いっちする。コードないのあのコメント # 5min — Anthropic's default prompt cache TTL間違まちがっていない。このそうでは、モデルはちゃんとっている。

どこが不正確ふせいかくか——証拠しょうこ

ここからが本題ほんだい。3 つのそうを、いちばんさるものから、いちばんどうでもいいものへならべる。

1. デフォルト TTL が 5 ふん固定こていされているが、あなたは 1 時間じかんキャッシュでうごいているかもしれない

ここだけが、本当にひとをだますところ。証拠しょうこは、手元てもと直近ちょっきん assistant レコードの usage ブロックから:

$ json
"cache_creation": {
  "ephemeral_1h_input_tokens": 1421,
  "ephemeral_5m_input_tokens": 0
}

全部ぜんぶ 1 時間じかんバケットにはいっている。つまりこのマシンで実際じっさいはしっているのは 1h キャッシュで、本当ほんとう生存時間せいぞんじかんは 60 ぷん。でも cs のデフォルトは cache_ttl_seconds = 300 なので、5 ふんには cache COLDさけぶ——真実しんじつより 55 ふんはやい。

いちばん皮肉ひにくなのは、5m か 1h かを判定はんていする「真実しんじつのシグナル」(ephemeral_1h_input_tokens vs ephemeral_5m_input_tokens)が、ツールがすでにひらいているおなじファイル、おなじレコードなかころがっていることだ。なのに _last_assistant_agetypetimestamp の 2 フィールドだけをみ、その usage ブロックをそのまま素通すどおりしている。理論上りろんじょうは transcript からどの TTL を使つかうべきか自動判定じどうはんていできるのに、いま手動しゅどうcs config set cache_ttl_seconds 3600 する必要ひつようがある。これはめるべき TODO だ。

2. アンカーは「1 ラウンドの終了しゅうりょう」であって、「キャッシュが更新こうしんされたその瞬間しゅんかん」ではない

assistant の timestamp は、おおむねそのラウンドを**えた**時刻じこくだ。一方、キャッシュはリクエストが**送信そうしんされた**瞬間しゅんかんにサーバーがわ更新こうしんされる。そのあいだには生成遅延せいせいちえんがある。実際じっさいの transcript にある、おな会話かいわセグメントの assistant タイムスタンプをると:

$ text
assistant  2026-05-29T04:46:18.432Z
assistant  2026-05-29T04:46:19.653Z
assistant  2026-05-29T04:46:25.680Z

数秒すうびょうから十数秒じゅうすうびょうのオーダー。300s / 3600s の TTL とくらべれば、無視むしできる。方向ほうこうとしてはたぶん楽観寄らっかんより(表示ひょうじされるのこりが、実際じっさいのサーバーがわよりすこおおい)だが、ひとむほどではない。

ここは正直しょうじきうと、源码ソースコードだけでは Anthropic サーバーがわがリクエスト開始かいしからかぞえるのか、終了しゅうりょうからかぞえるのかは証明しょうめいできない。だから正確せいかくかたは——**アンカーは「1 ラウンドの遅延ちえん精度せいど」の代理値だいりち**であって、キャッシュ更新こうしん正確せいかく瞬間しゅんかんではない。実用じつようには十分じゅうぶん。でもストップウォッチだとはおもわないほうがいい。

3. いろ数値すうちではなく文字列もじれつ推測すいそくしている

おもしろい工学上こうがくじょうり。_cache_severityのこ秒数びょうすうらず、**すでにフォーマットみの文字列もじれつ**をり、そのなかm / h があるかをる:

$ python
if cache_text == "COLD":
    return theme.s_hot          # 赤
if "m" in cache_text or "h" in cache_text:
    return theme.s_ok           # 緑、快適ゾーン
return theme.s_warn             # 黄、純粋な "Ys"、1 分未満

1 ぷん未満みまんのとき、formatter はわざと m なしのはだかYs だけを出力しゅつりょくする。colorizer が「そろそろにする時間じかんだ」と検出けんしゅつできるようにするためだ。formatter と colorizer のあいだには暗黙あんもく契約けいやくがある。リポジトリには、この契約けいやく固定こていする test_cache_severity.py がわざわざあり、いつかフォーマットをえたときにいろがこっそり混線こんせんしないようにしている。使つかえるが、たしかに結合けつごうではある——っておく価値かちはある。

もうひとつはしはなし:transcript の逆読ぎゃくよみには 320KB の上限じょうげん(10×32KB) がある。巨大きょだいな transcript で、末尾まつび 320KB に assistant がつからなければ、そのまま COLD あつかいになる。これは性能上せいのうじょうりだ——ステータスバーは毎秒まいびょう再描画さいびょうがされるので、毎回まいかい 数 MB を走査そうさするわけにはいかない。日常にちじょうではまずまない。

それで、正確せいかくなのか

  • 5 ふんキャッシュ + デフォルト設定せってい正確せいかく。アンカーはただしいし、スライディングウィンドウのモデリングもただしい。境界きょうかいケース(時計とけいもどりは 0 にクランプ、naive タイムスタンプは UTC あつかい、Z 接尾辞せつびじ正規化せいきか)も処理しょりされている。
  • 1 時間じかんキャッシュ + TTL 未変更みへんこう構造的こうぞうてきに 55 ふんはや報告ほうこくする。cs config set cache_ttl_seconds 3600 の 1 ぎょうなおせる。
  • 秒単位びょうたんい精度せいど期待きたいしないこと。アンカー自体じたいに 1 ラウンドぶん遅延ちえんという代理誤差だいりごさがある。これは「あと何分なんぷんのこっているか」きゅうのヒントであって、計時器けいじきではない。

一言ひとことでまとめると、これは「キャッシュがまだあついうちに、いまもう 1 ぱつげるべきか」にこたえるものだ。このいにはかなり正確せいかくこたえる。ストップウォッチとして使つかうなら、それは道具どうぐ間違まちがえている。

自分じぶんるなら、_last_assistant_ageget_cache_age_text の 2 つの関数かんすうからはいるといい。30 ぎょうほどでわる。

次の記事 →
ソフトな手法からハードなパッチへ — macOS Mach-O リバースエンジニアリング方法論の振り返り

コメント

コメントは即時公開されますが、ポリシー違反時は非表示になる場合があります。

最大 1000 文字。

    ⎇ main ● 0 errors · 0 warnings UTF-8 Markdown /ja/posts/claude-statusbar-cache-countdown/ © 2026 leeguoo