会話するAI vs 働くAI ─ Claude.aiとClaude Codeは別物

Claude.aiの調子でClaude Codeを触ったら、なぜか手応えが薄い

もし、「Claude.ai (チャット) と Claude Code は同じ Claude だから、同じノリで使える」と思っていたら、それは罠です。

ターミナルで claude と打ちます。プロンプトを投げます。「〜について教えて」と聞きます。返事は来ます。でも、Claude.ai のときに感じた「ぐっと前に進んだ感覚」がありません。

何を隠そう、私もこの罠にハマりました。Claude.ai のサブスクを毎月払って、毎日 Web で対話していたので、ターミナル版に切り替えても「同じ Claude が、もう少し便利になっただけ」と思っていました。違いました。

あれ、これブラウザ版で良くない?

そう思って、私は1ヶ月ほど Claude Code を放置しました。あなたも似た経験があるかもしれません。これが #01 で予告した 罠1 の正体です。

Claude.aiは会話するAI、Claude Codeは働くAI

結論を先に書きます。Claude.ai と Claude Code は、同じ「Claude」の名前を持っていますが、別ジャンルの道具です

Claude.ai は 会話する AI です。あなたの質問に答えてくれます。Web ブラウザのタブの中で完結します。

Claude Code は 働く AI です。あなたのプロジェクトのフォルダに常駐し、ファイルを開き、コマンドを叩き、テストを走らせ、git にコミットします。机を借りて、仕事を肩代わりします。

Claude.ai は コールセンター です。電話で答えてくれます。よく訓練されています。でも、こちらの机には来ません。

Claude Code は 常駐エンジニア です。あなたのオフィスに座って、エディタの代わりに直接ファイルを編集します。テストを走らせます。コミットメッセージまで書いて push します。

「Claude Code は強化版 Claude.ai」という理解だと、ずっと電話の向こう側にいるイメージのまま使うことになります。これがすべての違和感の正体です。

flowchart TD subgraph A["Claude.ai(会話するAI)"] A1["ユーザー"] --> A2["プロンプト"] A2 --> A3["Claude モデル"] A3 --> A4["返答テキスト"] end subgraph B["Claude Code(働くAI)"] B1["ユーザー"] --> B2["プロンプト"] B2 --> B3["ハーネス<br/>CLAUDE.md / 設定 / Hooks"] B3 --> B4["Claude モデル"] B4 --> B5["ツール実行<br/>Read / Edit / Bash"] B5 --> B6["ファイル更新・コミット"] B5 --> B3 end

両方とも裏にいるのは同じ Claude モデルです。違うのは、モデルの周りに何があるかです。Claude.ai はモデルだけ、Claude Code はモデルを ハーネス(エージェントを制御する仕組み全体) が包んでいます。

「プロンプトが強ければ同じ」という誤解

ここから本題です。「結局どちらも Claude なんだから、強いプロンプトを書けば同じだろう」── これは半分だけ正しく、本質的に間違っています

単発タスクでだけ、その理屈は通る

「再帰版の Fibonacci 関数を書いて」のような 単発タスク なら、Claude.ai でも Claude Code でも結果はだいたい同じです。同じトークンを同じモデルに渡せば、同じ分布の出力が返ります。これは事実です。

つまりこういうことです。

単発タスクの場合: 出力品質 ≈ プロンプト品質

この領域では、Claude Code はチャットボットに対して優位を持ちません。逆に言えば、この領域だけを見ていると Claude Code の価値は見えません。Claude.ai 出身者の多くは、この領域だけで Claude Code を試して帰ります。

でも、本物のエンジニアリング作業では崩壊する

実務の作業は単発タスクではありません。「このバグを直して」「このテストを追加して」「この機能をリリースして」── これらはすべて、コードベースに触れて、ファイルを読み、関連ファイルを探し、テストを走らせ、結果を見て、また直す、というループです。

ここで、Claude Code のハーネスが効いてきます。

sequenceDiagram participant U as ユーザー participant CA as Claude.ai participant CC as Claude Code(ハーネス) participant M as Claude モデル participant FS as ファイルシステム Note over U,M: ケース1: Claude.ai に「このバグを直して」と頼む U->>CA: 「このバグを直して」+ コード貼り付け CA->>M: テキストだけ送信 M->>CA: 修正案テキスト CA->>U: 修正案を表示 Note over U: ユーザーが手でコピペし保存 Note over U,FS: ケース2: Claude Code に「このバグを直して」と頼む U->>CC: 「このバグを直して」 CC->>FS: 関連ファイルを Read CC->>FS: テストを実行 CC->>M: コード+テスト結果+CLAUDE.md+履歴 M->>CC: 編集差分とコマンド CC->>FS: ファイルを直接 Edit CC->>FS: テストを再実行 CC->>U: 完了報告(テストGREEN)

同じ「このバグを直して」という1文でも、起こることが違います。Claude.ai はテキストを返します。Claude Code は コードベースを直接触って、テストを通すまで自走 します。

「プロンプト」という言葉の二重性

ここに混乱の原因があります。「プロンプト」という言葉が、2つの違う意味で使われています。

意味誰がコントロールするかサイズ
(a) ユーザーがタイプしたものユーザー6〜60トークン
(b) モデルが推論で実際に見るものハーネス5,000〜50,000+トークン

Claude.ai では (a) ≈ (b) です。あなたが書いたものが、ほぼそのままモデルに届きます。

Claude Code では (b) ≫ (a) です。あなたが「このバグを直して」と6トークンだけ打っても、モデルは1万5千トークン以上を受け取ります。

ユーザーがタイプしたもの (a): "このバグを直して" ← 6トークン
モデルが実際に見るもの (b): ├── CLAUDE.md(プロジェクト規約) ├── 触ったパスにマッチする .claude/rules/*.md ├── モジュラーシステムプロンプト断片 ├── ツール定義 ├── 環境情報(cwd、git status、プラットフォーム) ├── 過去ターン履歴 ├── Read / Grep ツールで読み込んだファイル └── ユーザーの6トークンのリクエスト
→ 合計 約15,000トークン

出力品質は (b) の関数であって、(a) の関数ではありません。プロンプトを強くすることは (a) を増やすことです。ハーネスがやっているのは (b) を構築することです。(a) を強くしても、ハーネスが構築する (b) には到達できません。

これが「強いプロンプトで Claude.ai を使えば Claude Code と同じだろう」という還元論が崩壊する理由です。

ハーネスが効く10の層

ハーネスがプロンプトに代替されない領域を、10個の機能で具体化します。これは shanraisshan さん(Anthropic とは無関係の個人)が整理した非公式のベストプラクティス集 shanraisshan/claude-code-best-practice のレポート reports/why-harness-is-important.md です。Anthropic 公式 docs は code.claude.com/docs にあります。

機能番号機能何をするかプロンプトで代替できない理由
1コンテキスト分離Subagent が別ウィンドウで動くプロンプトは1ウィンドウだけ。N 個並列で動かせば N 倍の実効コンテキスト
2ツール制限allowed-tools がモデルが使う前にツールをブロックプロンプトの指示は推奨にすぎず、モデルは無視できる。deny ルールは無視できない
3遅延ロードpaths: フロントマターで触れたファイルにマッチした時だけルールをロードプロンプトは静的。実行時のファイル状況に応じて変わらない
4Hooksライフサイクル(PreToolUse, PostToolUse, Stop など)でシェルコマンドを実行し、ツール呼び出しを ブロック できるプロンプトは自分のツール呼び出しを止められない。Hooks はモデルが「やりたく」なくても実行される
5モデル切替model: haikumodel: opus で別モデルにルーティングプロンプト内のどんな単語も、回答するモデルを変えられない
6並列実行複数の Subagent が同時に動くプロンプトは逐次。ハーネスは並列プロセスを起動して結果を集める
7クロスセッション永続化メモリと設定階層が会話を超えて残るプロンプトはセッションが終わると消える
8モジュラーシステムプロンプトCLI が110個以上のシステムプロンプト断片を、有効化された機能に応じて条件付きでロードユーザーは内部断片を手書きしたり差し替えたりできない
9Skill 注入skills: フィールドで Skill の本文を Subagent の起動コンテキストに完全注入ユーザーは別エージェントの中身に手を入れられない
10権限分類auto 権限モードがバックグラウンド分類器で事前承認・事前ブロックプロンプトは自分自身に事前安全層を追加できない

10行のうち、1つでも「これプロンプトでは無理だな」と感じたら、Claude Code が必要な理由がそこにあります

逆に、上の10機能を1つも使っていない Claude Code 利用は、Claude.ai の Web 版を高い金を払ってターミナルで開いているのとほぼ同じです。「Claude Code を使っても Claude.ai と変わらない」と感じている人は、ほぼ確実にこの状態です。

Borisが偶然たどり着いたハーネス

Claude Code のハーネスは、最初から設計されたものではありません。Boris Cherny(Claude Code の作者)は Y Combinator のポッドキャストで、誕生秘話をこう語っています。

私の翻訳でかいつまむと、こうです。

Anthropic でコーディング製品を作ろうという話になった。CLI を作ろうという指示は誰からも出ていなかった。私はまず Anthropic の API を理解する必要があったので、ターミナル用の小さなチャットアプリを書いた。UI を作らずに済むからだった。

ツール使用機能が出たので、試しに bash ツールを与えてみた。「今、何の音楽を聴いてる?」と聞いたら、Apple Script を書いて私の Mac の音楽プレイヤーをスクリプトしてきた。

Oh my god, the model just wants to use tools. (なんと、このモデルは道具を使いたいだけなんだ) それが私の最初の “fuel the AGI moment” (AGIの瞬間) だった。

ここに Claude Code の本質があります。Claude Code は、モデルがツールを使いたがる前提に対する受け皿として育ちました。後から「便利な機能を足した」のではなく、「モデルがツールを使うために必要なもの」を1つずつ積み上げた結果が、今のハーネスです。

これは Claude.ai とは出自が違います。Claude.ai は「モデルとの会話を快適にする UI」として育ちました。Claude Code は「モデルが手を動かすための机」として育ちました。両者は別の問題を解いている道具です。

Claude.ai出身者が必ずハマる5つの罠

ハーネスの存在を知った今、自分が今どの状態にいるか診断してください。私が観察している(自分も通った)典型は、次の5つです。1つでも当てはまったら、その罠から抜け出すのがそのまま処方箋になります。

罠1: 同じプロンプトを毎回タイプしている

毎セッションで「私は Python のエンジニアで、〇〇というプロジェクトで…」と前提を貼り直していませんか? Claude.ai 時代の癖がそのまま出ています。

Claude Code には CLAUDE.md という、毎回自動でロードされるメモリファイルがあります。前提は1回書けばよく、毎回書かなくていい。これを使わずに毎回プロンプトに前提を貼っているなら、機能の3が完全に無駄になっています。

罠2: 全部1人のClaudeにやらせている

調査もコーディングもレビューもデバッグも、1セッションで回そうとしていませんか? コンテキストがすぐ溢れ、途中で記憶があやふやになり、出力品質が落ちます。

Claude Code には Subagent という、別のコンテキストウィンドウで動く部下を雇う仕組みがあります。レビュー専門、調査専門、テスト書き専門、というように分業できます。1人で全部やらせるのは、機能の1と6を無視している状態です。

罠3: 毎回コピペで起動している

「いつもの3手順」を毎回タイプしていませんか? 例えば「main から最新を pull して、依存をインストールして、テストを走らせて、結果を要約して」。

これを /setup-and-test のような Slash Command 1個に圧縮できます。.claude/commands/setup-and-test.md を1ファイル書けば、次から /setup-and-test だけで起動します。

罠4: 設定なしで使っている

権限プロンプトに毎回手で答えていませんか? モデル選択を意識していますか? Hooks を1度も触っていませんか?

.claude/settings.json を1行も書いていないなら、機能の4・5・10が全部寝ています。最初は1行でいい。「bash(npm test:*) を auto で許可する」だけでも、毎回の権限プロンプトから解放されます。

罠5: 出力のくどさに耐えられず止める

「ファイルを読みました」「テストを実行しました」というログが目障りで、早々に Esc を押していませんか?

Boris 本人がインタビューで「くどさは意図的に残している」と語っています。Anthropic 社内で一度 bash 出力を要約しようとしたら、社員から猛反発があったそうです。くどさは監視のためにあるのです。観察=介入のチャンスです。

「暴走される前に止める」のは、最初に Plan mode を通すだけで解決します。プラン承認を挟めば、ハーネスはあなたの確認なしに動きません。

5つの罠と、それぞれに対応する処方箋を一枚の図にまとめます。

mindmap root(("Claude.ai出身者が<br/>ハマる5つの罠")) 罠1 同じプロンプトを毎回タイプ 処方 CLAUDE.md に固定 機能3 遅延ロード 罠2 全部1人のClaudeにやらせる 処方 Subagent で分業 機能1 コンテキスト分離 機能6 並列実行 罠3 毎回コピペで起動 処方 Slash Command 1個 .claude commands に保存 罠4 設定なしで使う 処方 settings.json を1行 機能4 Hooks 機能5 モデル切替 機能10 権限分類 罠5 verboseで止める 処方 Plan mode を通す verbose は監視のため

「罠→処方箋→ハーネス機能」の順で結びついています。罠から1個選んで、その処方箋を1個だけ実装するのが、Claude Code を本当に使い始める第一歩です。

今週やる1つだけのアクション

ここまで読んで「やることが多すぎる」と感じたら、安心してください。今週やることは1つです。

ターミナルを開いて claude と打つ。それだけ

これが今週の最低ラインです。残り全部は、来週以降の処方箋シリーズで1つずつ埋めます。

可能ならもう1〜2手だけ進めてください。

# 1. インストール
npm install -g @anthropic-ai/claude-code
# 2. 適当なリポジトリに移動して起動
cd ~/your-favorite-repo
claude
# 3. 最初の質問は「軽いやつ」でいい
> このリポジトリの構造を1分で説明して

それでも物足りない人だけ、もう1段だけ進んでください。

# CLAUDE.md(50行以内)
## プロジェクト概要
- 何のリポジトリか1〜2行
- 主な技術スタック1行
## やってほしくないこと
- ありがちなアンチパターンを3〜5個
## 最近詰まったポイント
- 過去2週間で踏んだ罠を3〜5個
## どこにファイルがあるか
- 主要ディレクトリの役割を3〜5行
## コミットメッセージのルール
- 1〜2行の規約

Boris 本人の助言を1つだけ守ってください。「困ったら CLAUDE.md を全消ししてやり直す」。Boris は社内のインタビューでこう言いました。

もし CLAUDE.md が膨らみすぎたら、私のおすすめは消して空からやり直すことです。みんなオーバーエンジニアリングしがちです。本当にやりたいのは、モデルを軌道に乗せるための最小限の指示です。

今週やらないでほしいことを1つだけ書きます。Subagent と Skill と Slash Command を一気に全部作ろうとしない

私もこの罠にハマっていた

最後に正直に書きます。私はこのシリーズの #01 を書く直前まで、Claude Code に対して「Claude.ai のターミナル版」というイメージを持っていました。Udemy の教材リポジトリで毎日プロンプトを投げていましたが、CLAUDE.md は10行も書いていませんでした。Subagent も Skill も Slash Command も Hooks もゼロでした。

つまり、私は罠1から罠4まで全部踏んでいました。

それでも「Claude Code は便利だ」と感じていたのは、ハーネスが10機能のうち2〜3個だけ勝手に効いていたからです。CLAUDE.md がなくても、ハーネスは cwd と git status と環境情報を勝手に積みます。Read / Grep ツールも勝手に使います。ハーネスは、設定なしでも最低限の仕事をしてくれる。これが、Claude.ai 出身者が「設定なしで使っても、まあ動く」と勘違いしてしまう理由です。

設定をちゃんと書き始めて、初めて Claude Code の真価がわかりました。10機能を全部使う必要はありません。1つでも追加すれば、それだけで Claude.ai では絶対に届かない場所に手が届きます。

来週も Claude.ai のタブは開きます。でも、開く回数は確実に減りました。あなたも、たぶん同じ道を通ります。

TL;DR

  • Claude.ai は会話する AI、Claude Code は働く AI です
  • 同じモデルでも、外側のハーネスが決定的に違います
  • 「強いプロンプトで同じ」は単発タスクでだけ正しい話です
  • ハーネスは10の層でプロンプトに代替されない仕事をします
  • ユーザーがタイプする (a) と、モデルが見る (b) は別物。Claude Code では (b) ≫ (a)
  • Claude.ai 出身者は「プロンプト直書き/全部1人で/毎回コピペ/設定なし/verbose で止める」の5つにハマります
  • 今週やること: ターミナルで claude を1回打つ。CLAUDE.md を50行で書く。困ったら全消し
  • やらないこと: Subagent / Skill / Command を一気に全部作る、200行超の CLAUDE.md を最初から書く