この1か月、Claude Code の設定を測っては「ドキュメントに書いていない」「書いてあることと違う」と記事にしてきました。10件たまったので、今どうなっているか全部測り直しました。
解消していた(文書に載り、挙動も当時と同じ) 6件
挙動が変わっていた 2件
今も食い違う 2件
未文書だった環境変数は、4つとも載っていました。 しかも「非対話では明示的にONが要る」まで書かれています。
一方で、挙動そのものが変わっていたものが2件ありました。ドキュメントは今の挙動を正しく書いているので、古い記事を信じたままだと間違えます。
検証環境: Windows 10 / Claude Code 2.1.260 / モデル
claude-opus-5/ 測定は 2026-09-08 時点
最新は 2.1.263 ですが、changelog 上は bug fixes のみのため 2.1.260 で測っています
一覧
| # | 当時 | 今 |
|---|---|---|
| 1 | fork の「既定ON」は対話セッション限定 | 公式に明記された |
| 2 |
CLAUDE_CODE_FORK_SUBAGENT が未文書 |
env-vars に載った |
| 3 |
ENABLE_TASKS=0 でタスク管理が全部消える |
公式に明記された |
| 4 |
ENABLE_TODO_TOOLS=1 で戻るのは Task ツール |
挙動が変わった。今は TodoWrite が戻る |
| 5 |
/model を押すと ANTHROPIC_DEFAULT_MODEL が効かない |
変わらず。changelog にも明記された |
| 6 |
SUBAGENT_MODEL は定義に負ける。_FORCE で勝つ |
変わらず。経緯まで明記された |
| 7 |
notify_when_idle は「macOS and Linux」表記だが Windows で動く |
今も表記のまま |
| 8 | spellcheck は綴りチェッカーが別途要る | 前提は明記された。辞書の話は今も無い |
| 9 |
/cost と /usage は同じ画面 |
変わらず |
| 10 | Fable のキャッシュ修正は「ツール結果のあと」限定 | ツールなし側も乗るようになってきた |
測り方
全部 claude -p で測れます。 セッションに「今なにが使えるか」を聞くだけです。
claude -p "List the names of every task-tracking tool you have available right now.
Output only the names separated by commas. If you have none, output NONE."
モデルやトークンを見たいときは JSON で取ります。
claude -p "hi" --output-format json
modelUsage のキーが実際に走ったモデルIDです。
挙動が変わっていた① タスク管理ツールの戻し方
ここだけ結果が変わりました。
以前は「CLAUDE_CODE_ENABLE_TODO_TOOLS=1 で戻すと、戻ってくるのは TodoWrite ではなく Task ツールだ」と書きました。今はこうです。
| 設定 | 出てくるツール |
|---|---|
| 設定なし | NONE |
ENABLE_TASKS=0 |
NONE |
ENABLE_TASKS=0 + ENABLE_TODO_TOOLS=1
|
TodoWrite |
ENABLE_TODO_TOOLS=1 |
TaskCreate, TaskUpdate, TaskGet, TaskList, TaskOutput, TaskStop |
2つの変数の役割がきれいに分かれています。
-
ENABLE_TODO_TOOLS… 出すか出さないか -
ENABLE_TASKS… どちらの系統を出すか(Task 系 かTodoWriteか)
ドキュメントもそう書いています。
Set to
1to get the task-tracking tools on the models listed under Task tool availability, where Claude Code otherwise leaves them out.CLAUDE_CODE_ENABLE_TASKSstill selects the Task tools orTodoWrite.
(1にすると、本来は付かないモデルでもタスク管理ツールが付く。どちらの系統かはENABLE_TASKSが引き続き決める)
もう1つ、設定なしで NONE だったのが意外でした。 この環境では、既定でタスク管理ツールが1つも付いていません。ドキュメントは「sessions that have them」という条件付きの書き方をしていて、モデルによって付いたり付かなかったりします。
「タスクリストが出ない」と思ったら、まず何が付いているか聞いてみるのが早いです。
挙動が変わっていた② Fable のキャッシュが乗るようになった
9月2日に「Claude Fable 5.1 は2ターン目のキャッシュに乗り損ねる。18回中13回外した」と書きました。9月4日に測り直したときは、ツールを使わないと9回中8回外れるままでした。
今日また測ったら、乗るほうが多くなっていました。
ツールを使わない(hi → hi again)
99.7% 99.6% 99.6% 38.4% ← 4回中3回は乗る
ツールを使う(1ターン目で Bash を1回呼ぶ)
100% 100% 100% 100% ← 4回とも乗る
ツールを使う側は当時と同じで、全部乗ります。 変わったのは使わない側です。
外したときの中身は当時と変わりません。
乗ったとき read 83,128 create 247
外したとき read 32,047 create 51,377 ← 5万トークン書き直す
ただし4回では割合を言えません。 「当時ほど外さなくなったように見える」までです。今も割れること自体は変わっていません(4回のうち1回は外した)。
以前の記事に「12回中8回外した」と書いたので、同じ条件でも数字が動くことを、身をもって確かめた形になりました。回数を書いていないと、こういう比較ができません。
今も食い違う① Windows で動くのに書かれていない
notify_when_idle は、別のセッションが暇になったら1回だけ知らせてもらう機能です。changelog の記述は今もこうです。
Added
notify_when_idleto cross-sessionSendMessage: ask another Claude Code session on this machine to send one notice when it next goes idle — opt-in, one-shot, no polling (macOS and Linux)
末尾の (macOS and Linux) が残ったままです。 Windows で動くことを確かめたのは8月25日で、そこから2週間経っています。
ドキュメント本体(cross-session messaging のページ)にはOS制限が書かれていません。changelog だけが古いままです。
Windows で使う人が changelog を読むと「自分には関係ない」と判断します。 実際には動きます。
今も食い違う② spellcheck の辞書
以前は「有効にしても、まず動かない」と書きました。今は前提条件の節ができています。
Prerequisites
Install aspell, hunspell, or ispell and make sure it's on yourPATH. Claude Code runs the first of the three it finds, in that order, on every platform, including a.cmdshim a package manager installs on Windows.
To check that the program is on yourPATH, runaspell --version,hunspell --version, orispell -vin your terminal.
確認コマンドまで書いてあります。 これは大きな改善です。
今日この環境で確かめたら、3つとも入っていませんでした。
aspell : 見つからず
hunspell : 見つからず
ispell : 見つからず
ただし「辞書」の話は今も書かれていません。 プログラムを入れても、辞書が0個なら何も指摘されません。 そして辞書なしでも終了コードは 0 なので、「綴りは全部正しい」と区別がつきません。
動いていないことと、指摘がゼロであることが、同じ見た目になります。
変わらなかったもの
残りは当時のまま再現しました。公式の記述も追いついています。
fork は -p では使えない
環境変数なし -> NO
CLAUDE_CODE_FORK_SUBAGENT=1 -> YES
CLAUDE_CODE_FORK_SUBAGENT=0 -> NO
ドキュメントに、そのままの言葉で載りました。
Claude Code turns fork mode on by default in interactive sessions and leaves it off by default in non-interactive mode with
-pand in the Agent SDK.
「既定でON」は対話セッションの話です。 バッチや CI で使うなら明示的に立てます。
/model を押すと ANTHROPIC_DEFAULT_MODEL は効かない
settings.json に model が保存されていると、環境変数は無視されます。
環境変数なし -> claude-fable-5-1
ANTHROPIC_DEFAULT_MODEL=haiku -> claude-fable-5-1 ← 効かない
ANTHROPIC_MODEL=haiku -> claude-haiku-4-5 ← こちらは効く
changelog にも書かれるようになりました。
Added
ANTHROPIC_DEFAULT_MODELenvironment variable: sets the model new sessions start on, while a/modelpick still overrides it and persists across restarts (unlikeANTHROPIC_MODEL)
(新しいセッションが始まるモデルを決める。ただし/modelでの選択がそれを上書きし、再起動をまたいで残る)
_DEFAULT_ が付くほうは「既定値」なので、保存された選択に負けます。
サブエージェントのモデルは定義が勝つ
code-reviewer(model: sonnet)で測りました。
環境変数なし -> claude-sonnet-5
SUBAGENT_MODEL=haiku -> claude-sonnet-5 ← 定義が勝つ
SUBAGENT_MODEL=haiku + _FORCE=1 -> claude-haiku-4-5-20251001
ドキュメントには変更の経緯まで書かれていました。
Before v2.1.251, this variable overrode both the per-invocation model and the definition's
modelfield
「昔はこうだった」が明記されているのは珍しいと思います。古い記事を読んで混乱した人向けの配慮に見えます。
対照を取らないと、逆の結論になりかけた
/cost と /usage は同じ画面だと書いていました。今日測ると文字数が違います。
/cost 1,071 文字
/usage 1,065 文字
「変わったのか」と思いましたが、/cost を2回叩いて比べました。
/cost #1 1,071 文字
/cost #2 1,065 文字 ← 同じコマンド同士でも違う
違っていたのは3行だけでした。
cost#1: resets Sep 14, 3:59am
cost#2: resets Sep 14, 4am
リセット時刻の丸めが変わっただけです。 内容は同じでした。
同じもの同士を比べる対照がないと、「変わった」と書いていました。 差が出たときは、まず同じ条件をもう一度測ります。
自分の環境で確かめる
全部その場で叩けます。 以下は今日実際に使ったものです。
何のツールが付いているか
claude -p "List the names of every task-tracking tool you have available right now.
Output only the names separated by commas. If you have none, output NONE."
環境変数を付けて2回叩けば、違いが出ます。
CLAUDE_CODE_ENABLE_TODO_TOOLS=1 claude -p "..."
CLAUDE_CODE_ENABLE_TASKS=0 CLAUDE_CODE_ENABLE_TODO_TOOLS=1 claude -p "..."
fork が使えるか
claude -p "Is 'fork' listed as an available subagent_type for the Agent tool right now?
Answer with exactly one word: YES or NO."
実際に走ったモデル
claude -p "hi" --output-format json
modelUsage のキーを見ます。ANTHROPIC_DEFAULT_MODEL を付けても変わらなければ、settings.json に model が保存されています。
grep model ~/.claude/settings.json
サブエージェントのモデル
claude -p "Launch the subagent named code-reviewer and ask it to report
the exact model ID it is running on. Reply with ONLY that model ID string."
キャッシュのヒット率
claude -p "hi" --output-format json # session_id を控える
claude -p "hi again" --resume <ID> --output-format json
cache_read_input_tokens ÷(read + create + input)がヒット率です。
綴りチェッカーが入っているか
aspell --version || hunspell --version || ispell -v
注意が2つあります。
-
-pは対話セッションとは条件が違います。 fork の既定やPrompt cache (main)行は、-pでは出ません -
自己申告です。 「何が使えるか」はセッション本人に聞いているので、取りこぼしがありえます。
トークン数のように外から数えられるもののほうが確かです
測り直して分かったこと
未文書だと書いた環境変数は、4つとも載っていました。
CLAUDE_CODE_FORK_SUBAGENT -> env-vars / sub-agents に記載
CLAUDE_CODE_ENABLE_TASKS -> env-vars に記載
CLAUDE_CODE_ENABLE_TODO_TOOLS -> env-vars に記載
CLAUDE_CODE_SUBAGENT_MODEL_FORCE -> env-vars / sub-agents に記載
しかも「非対話では明示的にONが要る」「昔はこうだった」まで書かれています。1か月で追いついています。
残ったのは2件だけでした。
-
changelog の OS 表記(
notify_when_idle) - spellcheck の辞書
どちらも「本体のドキュメントは正しいが、別の場所が古い、または触れていない」型です。
そして挙動が変わったのが1件。 これは自分で測らないと気づけません。ドキュメントは今の挙動を正しく書いているので、読み直せば分かりますが、過去の記事を信じたままだと間違えます。
まとめ
- 1か月で書いた「ドキュメントと違う」10件を、2.1.260 で測り直した
- 6件は解消していた。 未文書だった環境変数4つは、条件や経緯まで含めて記載された
-
2件は挙動が変わっていた。
ENABLE_TODO_TOOLS=1で戻るのは、今はTodoWrite。
Fable のキャッシュは、ツールを使わなくても4回中3回乗るようになった -
2件は今も食い違う。
notify_when_idleの changelog は「(macOS and Linux)」のままだが Windows で動く。
spellcheck は辞書が無いと、終了コード0で「指摘ゼロ」に見える - 既定でタスク管理ツールが1つも付かない環境があった。まず何が付いているか聞くのが早い
-
差が出たら、同じ条件をもう一度測る。
/costは自分同士でも文字数が違った
設定の記事は、書いた時点から古くなります。 測り直すと、公式が追いついた部分と、まだ残っている部分が分かれます。
参考
- Environment variables — 4つの環境変数の現在の記述
- Subagents — fork mode とモデル選択の優先順位
- Interactive mode — spellcheck の前提条件
-
Changelog —
notify_when_idleの OS 表記
※ 引用は原文と日本語訳を併記しています。訳は読みやすさを優先しているので、正確な表現は原典をご確認ください。
関連記事
- Claude Code の設定でハマる箇所まとめ — 当時の記録
- Claude Code にスキルを80本足しても、増えたトークンは185だった — 同じ手順で測った回
JQITのエンジニアの95%以上は未経験からの採用です。
よければコーポレートサイトにも遊びに来てください。
エンジニア採用も行っています。もしご興味あれば覗いてみてください。
▶ 採用サイト