◉CLAUDE LABEN
●CODE 2.1.325 — zstd 圧縮応答の復号に関するセキュリティ修正が入りました(11/13)●CODE MODE — 2.1.323 で、Claude が JavaScript でツールを呼ぶ実験的な Code Mode が加わりました●SONNET 4.5 — Claude API での提供終了は 11/30、残り16日。移行先は Sonnet 5.5●STATUS — 2.1.323 で subagentStatusLine が消え、サブエージェントごとの費用が見えないという声が出ています●MANAGED — Claude Managed Agents を自前で動かせる self-hosted 版が公開されています(11/12)●NEW — Cowork が作った表の合計を元データと突き合わせる●CODE 2.1.325 — zstd 圧縮応答の復号に関するセキュリティ修正が入りました(11/13)●CODE MODE — 2.1.323 で、Claude が JavaScript でツールを呼ぶ実験的な Code Mode が加わりました●SONNET 4.5 — Claude API での提供終了は 11/30、残り16日。移行先は Sonnet 5.5●STATUS — 2.1.323 で subagentStatusLine が消え、サブエージェントごとの費用が見えないという声が出ています●MANAGED — Claude Managed Agents を自前で動かせる self-hosted 版が公開されています(11/12)●NEW — Cowork が作った表の合計を元データと突き合わせる
記事一覧/Claude Code
⟐ Claude Code/2026-08-14上級

生成物1ファイルが手書きコード70本より重いので、Claude Code に読ませる範囲を決め直しました

運用中のリポジトリを対象に、どの領域が文脈をどれだけ食うかを数え直しました。生成物の除外・探索パターンの選び方・settings.json での固定まで、実際に決めた運用ルールとその根拠をまとめます。

Claude Code285settings.json10コンテキスト9コスト設計7リポジトリ運用

✦ プレミアム記事

「プレビューの打ち切り位置を決めているのはどのファイルですか」。運用しているサイトのリポジトリで、Claude Code にそう尋ねたときのことです。

返事が来る前に、セッションはアプリケーションコードの探索を始めていました。答え自体は正しく、2ファイルを指して的確でした。ただ、そこに至るまでに読まれた量が、私の想像していた「ちょっと探す」の範囲を超えていました。

個人開発では、この手の摩擦を指摘してくれる人がいません。気になったので、探索の作法を変える前に、リポジトリ側を数えることにしました。読ませる範囲を決めるには、まず何がどれだけ重いのかを知らないと始まらないからです。

結果として一番驚いたのは、ビルドで作り直せる生成物1ファイルが、手で書いた70本のソースコード全部よりも重かったことでした。

セッションを始める前に、リポジトリ側を数える

計測対象は claudelab.net のリポジトリです。日本語806本・英語806本の記事を MDX で抱えた Next.js のサイトで、git 管理下のファイルは1,796件あります。

最初に書いたのは、領域ごとの「読ませたときの重さ」を出すだけの小さなスクリプトです。トークナイザを厳密に再現する必要はありません。領域同士を比べて意思決定できれば十分なので、日本語は1文字を約1トークン、それ以外は約3.6文字を1トークンとして概算しています。

#!/usr/bin/env python3
"""ctxweight.py - git 管理下のファイルを「読ませたときの重さ」で並べる。
 
使い方:
    python3 ctxweight.py            # リポジトリ全体
    python3 ctxweight.py src        # 特定ディレクトリのみ
"""
import collections
import subprocess
import sys
 
PRICE_PER_MTOK = 2.0  # 入力単価(USD / 1M tokens)。自分が使うモデルの値に置き換える
 
 
def estimate_tokens(text: str) -> int:
    """CJK は約1文字=1トークン、それ以外は約3.6文字=1トークンとして概算する。
 
    正確な値はモデルのトークナイザ依存なので、絶対値ではなく
    「領域Aは領域Bの何倍か」を判断するための相対指標として使う。
    """
    cjk = sum(1 for ch in text if ' ' <= ch <= '鿿' or '＀' <= ch <= '￯')
    return int(cjk + (len(text) - cjk) / 3.6)
 
 
def tracked_files(roots):
    # git ls-files を使うと .gitignore 済みのファイルを自動的に除ける
    out = subprocess.check_output(['git', 'ls-files', '-z'] + list(roots)).decode()
    return [f for f in out.split('\0') if f]
 
 
def group(path: str) -> str:
    parts = path.split('/')
    return '/'.join(parts[:2]) if len(parts) > 1 else '(root)'
 
 
def main():
    agg = collections.defaultdict(lambda: [0, 0])  # [tokens, files]
    per_file = []
 
    for path in tracked_files(sys.argv[1:]):
        try:
            text = open(path, encoding='utf-8').read()
        except (UnicodeDecodeError, OSError):
            continue  # 画像などのバイナリは対象外。読めないものは黙って飛ばす
        tokens = estimate_tokens(text)
        agg[group(path)][0] += tokens
        agg[group(path)][1] += 1
        per_file.append((tokens, path))
 
    total = sum(v[0] for v in agg.values()) or 1
    print(f"{'領域':<28}{'推定tok':>12}{'files':>7}{'占有率':>8}{'$/回':>9}")
    for key, (tokens, files) in sorted(agg.items(), key=lambda x: -x[1][0])[:15]:
        print(f"{key:<28}{tokens:>12,}{files:>7,}"
              f"{tokens / total * 100:>7.1f}%{tokens / 1e6 * PRICE_PER_MTOK:>9.3f}")
    print(f"{'合計':<28}{total:>12,}"
          f"{sum(v[1] for v in agg.values()):>7,}{100.0:>7.1f}%"
          f"{total / 1e6 * PRICE_PER_MTOK:>9.3f}")
 
    print("\n-- 単体で重いファイル --")
    for tokens, path in sorted(per_file, reverse=True)[:5]:
        print(f"{tokens:>12,}  {path}")
 
 
if __name__ == '__main__':
    main()

git ls-files を使っているのは、.gitignore 済みのファイルを自分で除外しなくて済むからです。node_modules や .next を数えても意味がありませんし、除外リストを手で保守すると必ずずれます。

リポジトリ全体に当てると、こうなりました。

領域推定トークンファイル数占有率
content/articles7,666,9271,61291.0%
src/generated289,60323.4%
ルート直下162,418151.9%
content/blog157,421701.9%
src/app80,278361.0%
src/components37,332220.4%
合計8,422,3231,796100%

記事本文が9割を占めるのは、コンテンツサイトなので当然です。予想どおりでした。

想定と食い違ったのは、その次の行でした。

生成物1ファイルが、手で書いたコード全部の2.2倍だった

src だけに絞ると、内訳の歪みがはっきりします。

領域推定トークンファイル数src 内の占有率
src/generated289,603268.9%
src/app80,2783619.1%
src/components37,332228.9%
src/config8,11521.9%
src/lib ほか5,029101.2%

手で書いたソースコード70本を合計しても130,754トークンです。対して src/generated はたった2ファイルで289,603トークン、うち articles.json 単体が284,072トークンを占めています。比にして2.21倍。

このファイルは MDX から機械的に組み立てられるメタデータの集約で、ビルドのたびに作り直されます。つまり、読ませても新しい情報は一切増えません。元データはすべて content/ 側にあります。

それでも src を対象にした探索では、真っ先に候補に挙がる位置にいます。ファイル名が articles.json で、パスが src の下にあるからです。名前とパスが「重要そう」に見えるファイルほど、実は導出物であることがあります。

入力単価に置き換えると、この2ファイルは1回読むだけで約0.58ドルです。手書きコード全部を読んでも0.26ドルなので、情報量ゼロの側が2倍以上高い、という状態でした。

なお、単価は契約やモデルの改定で動きます。スクリプト側の PRICE_PER_MTOK は、記事の数字ではなく、必ず自分で確認した値に置き換えてください。

✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦自分のリポジトリのどこが文脈を食っているかを1コマンドで割り出し、読ませない範囲を根拠つきで決められるようになります
✦生成物やロックファイルが混ざったまま探索を始めて、入力コストと的外れな推論を同時に招く事故を、踏む前に防げるようになります
✦検索の絞り込みが甘いと、ファイルを直接読むより高くつく場面があることを見分けられるようになります
✦領域別の集計が単体の重いファイルを隠す場面を知り、集計表と単体ランキングを並べて読む習慣を持てるようになります
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

⟐ Claude Code2026-10-20
席を離れて戻ると会話に要約が差し込まれていた — アイドル圧縮の見分け方と、消したくない細部の残し方
v2.1.299 で入ったアイドル圧縮により、約54分放置した長い会話は自動で要約されます。何が起きたかの見分け方、止め方、そして要約に消されたくない前提を CLAUDE.md へ退避させる手順をまとめます。
⟐ Claude Code2026-10-19
MCP の allow を `mcp__サーバー名` で書いていた人へ — v2.1.299 の変更で見直すのは名前に `__` を含むサーバーだけ
Claude Code v2.1.299 で MCP の allow ルールが「名指ししたサーバーだけ」に一致する形へ変わりました。裸の mcp__サーバー名 が影響を受けるのは、名前に __ を含む、または末尾が _ のサーバーだけです。点検用の Python スクリプト付き。
⟐ Claude Code2026-10-14
Grep の先頭250行は、一致した183ファイルのうち42ファイルしか見ていませんでした
記事リポジトリで「hook」を探したところ、一致は1,312行・183ファイル。ripgrep・git grep・grep の速さは11〜35 msで差がなく、効いたのは出力の量と順番でした。先頭250行の取りこぼしを事前に見積もるスクリプトと、探索の順番を実測値つきでまとめます。