Claude Code をうまく使う「コンテキストエンジニアリング」実践ガイド|Anthropic流の運用環境設計8原則

Claude Code をうまく使う「コンテキストエンジニアリング」実践ガイド|Anthropic流の運用環境設計8原則 AI開発

「もっと賢い指示の出し方はないか」——Claude Code を使い始めた多くのエンジニアが最初に向かうのがプロンプトの改善です。しかし Anthropic のエンジニアたちが行き着いた答えは、少し違うところにありました。

「プロンプトエンジニアリング」から「コンテキストエンジニアリング」へ。一回の指示を磨くより、Claude が毎回参照できる知識・環境・自動化の仕組みを育てること——これが Anthropic 流の Claude Code 活用の核心です。

本記事では、Claude Code の開発者 Boris Cherny を含む Anthropic エンジニアの実践から整理した8つの設計原則を、具体的な実装例とともに解説します。単発のテクニックではなく、使うほど賢くなる「運用環境」をどう設計するか、という視点でまとめています。

スポンサーリンク
  1. 原則1:プロンプトより「コンテキスト」を設計する
    1. コンテキスト腐敗(Context Rot)という問題
    2. Claude Code のコンテキスト管理3層構造
    3. コンテキストエンジニアリングを実現する CLAUDE.md の書き方
  2. 原則2:手段ではなく「成功基準」を与える
    1. 成功基準として機能する3種類の手段
  3. 原則3:「探索型」と「計画型」を状況で使い分ける
    1. 要件が曖昧なとき:先に使い捨てプロトタイプを作る
    2. 要件が明確なとき:Plan Mode で計画を固めてから実装する
  4. 原則4:Claude を「1人の助手」ではなく「複数の分身」として使う
    1. git worktree による並列セッションの分離
    2. `–worktree` フラグ:Claude Code 組み込みの worktree 対応
    3. 並列セッションの運用ルール
  5. 原則5:繰り返す作業をカスタムコマンドで定型化する
    1. 実践的なカスタムコマンド例
  6. 原則6:Hooks で Claude の「うっかり」を構造的に防ぐ
    1. Stop Hook:テストが通るまで終了させない
    2. tdd-guard プラグイン:最もシンプルな Stop Hook 実装
    3. その他の実用的な Hooks パターン
  7. 原則7:サブエージェントで単一視点の偏りをなくす
    1. Opponent Processor:賛成役と反論役を別エージェントで立てる
    2. Agent Teams(実験的機能)
    3. サブエージェントを使う fan-out パターン
    4. 調査特化型サブエージェント:メインのコンテキストを汚さない
  8. 原則8:Task Diary で「セッションをまたぐ学び」を蓄積する
    1. Manus-style 3ファイルパターン
    2. CLAUDE.md への昇格:Compound Engineering サイクル
    3. Hooks でセッション記録を自動化する
  9. よくある失敗パターンと対処法
    1. 「過度な自律性」への警戒
  10. Anthropic 流の役割分担:人間と Claude がそれぞれ担うべきこと
  11. 8原則のまとめ
  12. よくある質問

原則1:プロンプトより「コンテキスト」を設計する

Anthropic が公式ブログで定義しているコンテキストエンジニアリングとは、「LLMの推論中に最適なトークンセットを厳選・維持するための戦略群」です。一回の推論で最良の出力を得ようとするプロンプトエンジニアリングとは根本的に異なります。

概念 対象 焦点 寿命
プロンプトエンジニアリング 単一コンテキスト内の指示文 一回の推論で最良の出力を得る その指示限り
コンテキストエンジニアリング 複数ターン・複数セッション全体 どの情報をいつ渡すかを継続的に制御する 育て続けるほど蓄積される

コンテキスト腐敗(Context Rot)という問題

Anthropic の研究でわかった事実として、コンテキストウィンドウの 50%を超えると精度が明確に低下するという報告があります。会話が長くなるにつれて Claude は以前に渡した情報を正確に参照できなくなる——これを「コンテキスト腐敗」と呼びます。

  • 長い会話の後半で指示を「忘れる」:最初のセッションで伝えた制約が後半で無視される
  • 矛盾した情報が共存する:修正前の情報と修正後の情報が混在する
  • 同じ失敗を繰り返す:以前のやり取りから学習されない

コンテキストエンジニアリングはこの問題への根本的な対処です。重要な情報を会話履歴ではなくファイルに書き出し、Claude が毎回参照できる形で管理します。

Claude Code のコンテキスト管理3層構造

仕組み 特徴
常時コンテキスト CLAUDE.md(セッション開始時に自動読み込み) 毎回確実に参照される。チームで共有できる
動的コンテキスト ファイル参照・grep等のツール 必要なときだけロードされる(コンテキスト節約)
セッション外コンテキスト auto-memory・Task Diary セッションをまたいで知識が蓄積される
実践ポイント:/btw コマンドを使うと、質問の回答をコンテキスト履歴に含めずにサイドクエリができます。「このコードの意図を教えて」のような確認作業でコンテキストを無駄に消費しないための機能です。また /clear でコンテキストをリセットし新鮮な状態で再開するのも有効な戦略です。

コンテキストエンジニアリングを実現する CLAUDE.md の書き方

CLAUDE.md はコンテキストエンジニアリングの中核です。「ルールブック」として機能させるためには、書く内容と書かない内容を意識的に選ぶ必要があります。

書くべき内容 書かなくていい内容
プロジェクト固有の制約・命名規則 コードの仕様(コードから読める)
過去に発生したバグと回避策 git 履歴で確認できる変更履歴
チームの設計判断と理由 一般的なプログラミングのベストプラクティス
使用するコマンド・ツールのパス 現在進行中の作業状況(Task Diary に分離)
外部 API のクセや注意点 汎用的なライブラリの使い方(ドキュメントで十分)
CLAUDE.md の実践的なテンプレート
# プロジェクト名

## 概要
- **技術スタック**: Node.js 20 / TypeScript / Drizzle ORM / PostgreSQL
- **テストフレームワーク**: Vitest(`npm test`)
- **コードフォーマット**: Prettier(コミット前に `npm run format` を実行)

## 必ず守るルール
- `main` ブランチへの直接 push は禁止(必ず PR 経由)
- コミットメッセージは Conventional Commits 形式(feat:/fix:/docs: など)
- 環境変数は `.env.example` を更新してから `.env` に追加

## このプロジェクト固有の注意点
- DB マイグレーションは `npm run db:migrate` で実行(本番は手動承認が必要)
- テスト用 DB のリセット: `npm run db:reset`(テスト前に毎回実行)
- E2E テストはローカル Dev サーバーが起動している状態で実行する

## 過去の失敗と教訓
- JWT オプションは `{ expiresIn: "24h" }` 形式で指定(数値指定は無効エラーになる)
- bcrypt は非同期版を使うこと(同期版はテストがタイムアウトする)
- Drizzle の型推論は `$inferSelect` を使う(`InferModel` は deprecated)

## 開発フロー
1. `git checkout -b feat/機能名` でブランチを切る
2. 実装前に `docs/task_plan.md` にタスクを書く
3. テストを書いてから実装する(TDD)
4. `npm test` が通ったら PR を作成する

CLAUDE.md はチームで Git 管理し、新しい教訓が出たらすぐに追記する習慣を作ることが重要です。Boris Cherny のチームでは CLAUDE.md が現在 2,500 トークン規模になっており、チーム全体の知識ベースとして機能しています。CLAUDE.md の詳細な書き方については別記事を参照してください。

原則2:手段ではなく「成功基準」を与える

Anthropic の公式ベストプラクティスで最初に挙げられているのが、「検証手段を与える」アプローチです。「このファイルをこう直して」という手段の指定ではなく、「こうなっていたら成功」という基準を渡すことで、Claude が自律的に探索・検証・修正のループを回せます。

NG:手段を指定する OK:成功基準を与える
“validateEmail 関数を実装して” “validateEmail 関数を実装して。user@example.com は true、invalid は false になること。テストを実行して確認して”
“ダッシュボードの見た目をよくして” “[スクリーンショット貼付] このデザインに実装して。スクリーンショットを撮って比較し、差分をリスト化して修正して”
“ビルドが失敗している” “ビルドがこのエラーで失敗している: [エラー貼付]。修正してビルドが成功することを確認して。エラーを抑制するのではなく根本原因を直して”
“認証機能を追加して” “メール・パスワードでのログインを実装して。登録→ログイン→ログアウトのE2Eテストが通ること。JWTの有効期限は24時間”

「成功基準を与える」アプローチが強力な理由は、Claude に 検証フィードバックループを持たせられるからです。テスト・スクリーンショット・Bash コマンドのいずれかを「成功の判定基準」として与えると、Claude は「実装→検証→修正」を自律的に繰り返します。Boris Cherny は「検証フィードバックループを持つことで最終成果物の品質が2〜3倍向上する」と述べています。

成功基準として機能する3種類の手段

種類 用途
テストコード コードの正確な動作検証 npm test が通ること。テストカバレッジ80%以上
スクリーンショット UI実装の視覚的検証 スクリーンショットを撮ってデザインカンプと比較
Bash コマンド ビルド・lint・APIレスポンスの検証 npm run build が 0 で終了すること

原則3:「探索型」と「計画型」を状況で使い分ける

コードを書く前の進め方は一つではありません。要件の明確さによって使い分けることが重要です。

要件が曖昧なとき:先に使い捨てプロトタイプを作る

「何を作りたいか」がまだはっきりしていない段階で詳細な計画を立てようとしても徒労に終わります。このとき有効なのが使い捨てプロトタイプの作成です。

使い捨てプロトタイプの指示例
# まず動くものを素早く作る
Create a rough prototype of the dashboard. Don't worry about code quality.
I want to see how it feels to use it.

# 確認後、本実装に切り替える
/clear

# 新しいセッションで本実装
Now implement the dashboard properly based on what we learned.
Requirements:
- [プロトタイプで確認した仕様を箇条書き]
Success criteria: npm test passes, screenshot matches the design

プロトタイプは /clear で捨てます。「試して学んでから本実装する」という二段階アプローチが、要件が曖昧なタスクで最も品質が高くなります。

要件が明確なとき:Plan Mode で計画を固めてから実装する

要件が明確な場合は、Plan ModeShift+Tab または --plan フラグ)で計画だけを詳細に詰め、合意してから実装フェーズに移ります。

Plan Mode の使い分け
# Plan Mode を起動(実装は行わない)
claude --plan

# または対話中に切り替え
# Shift+Tab で Plan Mode / Auto-accept を切り替え

# Plan Mode での指示例
Implement user authentication with email/password.
Do NOT write any code yet.
Just create a detailed implementation plan including:
- File structure
- API endpoints
- Database schema
- Test strategy

計画を確認・修正したら auto-accept モードに切り替えて実装を実行します。Plan Mode の詳細な使い方については別記事を参照してください。

原則4:Claude を「1人の助手」ではなく「複数の分身」として使う

Claude Code の開発者 Boris Cherny は、ローカルで5セッション、リモートでさらに5〜10セッションを同時に動かしています。各セッションは独立したタスクを担当し、互いに干渉しません。セッションの10〜20%は想定外の問題で破棄が前提——それでも並列で動かした方が最終的なスループットが高い、という運用哲学です。

git worktree による並列セッションの分離

並列セッションの鍵は、各セッションが独立した作業ディレクトリを持つことです。git worktree を使うと、同一リポジトリから複数のチェックアウトを作成でき、ブランチ間の競合を防げます。

git worktree + tmux で並列セッションを起動
# 3つの独立した作業ディレクトリを作成
git worktree add ../project-feat-auth feat/auth
git worktree add ../project-feat-search feat/search
git worktree add ../project-bugfix fix/login-bug

# tmux で各 worktree に Claude を起動(並列実行)
tmux new-session -d -s auth    -c ../project-feat-auth    'claude'
tmux new-session -d -s search  -c ../project-feat-search  'claude'
tmux new-session -d -s bugfix  -c ../project-bugfix        'claude'

# セッションを切り替える
tmux switch-client -t auth
tmux switch-client -t search

`–worktree` フラグ:Claude Code 組み込みの worktree 対応

Boris Cherny が 2026年に導入を発表した --worktree フラグを使うと、Claude Code が自動的に新しい git worktree を作成し、その中でセッションを起動します。手動で worktree を管理する手間が省けます。

–worktree フラグの使い方
# 自動命名 worktree で独立セッションを起動
claude --worktree

# 名前を指定して起動
claude --worktree feat/payment-refactor

# tmux と組み合わせて起動
claude --worktree --tmux

サブエージェントも worktree を使って隔離実行できるようになりました。大規模なコード移行やバッチ変更に特に有効です。

コミュニティツール:muxtree(git worktree + tmux セッションの自動作成)・workmux(同用途の別実装)・claude-tmux(tmux ポップアップ + PR 作成まで対応)といったサードパーティツールもコミュニティで普及しています。

並列セッションの運用ルール

  • 1セッション1タスク:セッションをまたぐタスクは CLAUDE.md か docs/ に書いてコンテキストを渡す
  • 各セッションに独立した worktree を割り当てる:同じファイルへの同時編集でコンフリクトが発生しないよう分離する
  • セッション開始時にスコープを宣言する:「このセッションでは認証機能のみ実装する。他のファイルは触らない」と最初に伝える
  • 破棄前提で起動する:10〜20%は想定外の問題で破棄。進捗を docs/ に記録しておくと再起動が楽になる

原則5:繰り返す作業をカスタムコマンドで定型化する

Claude Code のカスタムコマンド(Skills)は、.claude/commands/ ディレクトリに Markdown ファイルを置くだけで作成できます。lint・テスト・コミット・PR 作成といった繰り返し作業を一つのコマンドにまとめることで、作業の品質と再現性が上がります。

実践的なカスタムコマンド例

.claude/commands/commit-push-pr.md
# commit-push-pr

現在の変更をコミット・push して PR を作成します。

## 手順

1. lint を実行する: `npm run lint`
   - エラーがあれば自動修正を試みる
2. テストを実行する: `npm test`
   - 失敗したら修正してから続行する
3. 変更内容を確認: `git diff --staged`
4. 変更内容を要約してコミットメッセージを作成する(Conventional Commits 形式)
5. コミットして push する
6. `gh pr create` で PR を作成する
   - タイトル: コミットメッセージの1行目
   - 本文: 変更の概要・テスト方法・レビューポイント

## 注意
- `main` や `master` ブランチに直接 push しない
- PR は draft で作成する(`--draft` フラグ)
.claude/commands/review-checkpoint.md
# review-checkpoint

実装の中間チェックポイントを実施します。

## 実行内容

1. テストを実行し、すべて通過していることを確認
2. 現在の実装と当初の計画(docs/plan.md)を比較
3. 逸脱している箇所をリスト化
4. 技術的負債になりそうな箇所を指摘
5. 次のステップの提案

セッション開始時に必ずこのコマンドを実行すること。

カスタムコマンドの詳細な設計方法については別記事を参照してください。gstacktsumiki といったコミュニティのスキル集もカスタムコマンドとして機能します。

原則6:Hooks で Claude の「うっかり」を構造的に防ぐ

Hooks は Claude の行動に連動して自動実行されるシェルコマンドです。「フォーマットを忘れる」「テストが通っていないのに終了する」「危険なコマンドを実行しようとする」といった問題を、人間が毎回確認しなくても構造的に防げます。

Stop Hook:テストが通るまで終了させない

Stop Hook は Claude が作業を終了しようとするタイミングで実行されます。テストが失敗していたら終了をブロックし、Claude に修正を促します。

.claude/settings.json(Stop Hook の設定)
{
  "hooks": {
    "Stop": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "python .claude/hooks/test-gate.py"
          }
        ]
      }
    ]
  }
}
.claude/hooks/test-gate.py
#!/usr/bin/env python3
import json, sys, subprocess

input_data = json.load(sys.stdin)

# 無限ループ防止(絶対に必要)
# Stop Hook が「ブロック」すると Claude が再実行 → Stop Hook が再発火 → 無限ループ
if input_data.get('stop_hook_active', False):
    sys.exit(0)

# lint → test → build の順でチェック
checks = [
    (['npm', 'run', 'lint'], 'リントエラーが検出されました'),
    (['npm', 'test'],        'テストが失敗しています'),
    (['npm', 'run', 'build'], 'ビルドが失敗しています'),
]

for cmd, message in checks:
    result = subprocess.run(cmd, capture_output=True, timeout=120)
    if result.returncode != 0:
        output = result.stdout.decode('utf-8', errors='replace')
        print(json.dumps({
            "decision": "block",
            "reason": f"{message}。修正してから終了してください。

{output[:2000]}"
        }))
        sys.exit(0)

# すべて通過 → 終了を許可(何も出力しない)
sys.exit(0)
stop_hook_active のチェックは必須:このフラグを確認しないと「Stop Hook がブロック → Claude が修正しようとする → 再び終了 → Stop Hook が再発火」という無限ループが発生します。

tdd-guard プラグイン:最もシンプルな Stop Hook 実装

Stop Hook の実装に手間をかけたくない場合は tdd-guard プラグインが便利です。テストランナーの設定を自動検出し、Stop Hook を自動構成します。

tdd-guard のインストール
/plugin install tdd-guard@tdd-guard
/tdd-guard:setup

その他の実用的な Hooks パターン

Hook タイプ 用途 実装例
PostToolUse (Edit後) ファイル保存後に自動フォーマット prettier --write $FILE
PreToolUse (Bash前) 危険なコマンドの実行前に警告 rm -rfgit reset --hard を検出して確認
Stop セッション終了時に Task Diary を自動更新 セッション内の変更を docs/progress.md に追記
PostToolUse (WebFetch後) 外部 URL へのアクセスをログ記録 echo.claude/fetch-log.txt に記録

Hooks の詳細な設計方法と実装例については別記事を参照してください。

原則7:サブエージェントで単一視点の偏りをなくす

サブエージェントは調査・検証・並列実行に強力ですが、Anthropic エンジニアの実践では特に「単一視点の偏りを防ぐ」用途が注目されています。

Opponent Processor:賛成役と反論役を別エージェントで立てる

一人で考えていると「最初に思いついた仮説」に引きずられるアンカリングが起きやすくなります。Opponent Processor パターンは、賛成役・反論役を別々のサブエージェントに担当させることでこれを防ぎます。

Opponent Processor の指示例
# バグ調査に適用する例
Users report the app exits after one message instead of staying connected.
Spawn 5 agent teammates to investigate different hypotheses.
Have them talk to each other to try to disprove each other'"'"'s theories,
like a scientific debate.
Update docs/findings.md with whatever consensus emerges.

# 設計議論に適用する例
I'"'"'m designing a new caching strategy. Create an agent team:
- One agent supporting Redis-based caching (make the strongest case)
- One agent supporting in-memory caching (make the strongest case)
- One playing devil'"'"'s advocate for both
Have them debate and summarize the trade-offs in docs/cache-decision.md.

# コードレビューに適用する例
Review the authentication module in src/auth/.
Create three specialized reviewers:
- Security reviewer: focus on vulnerabilities and attack vectors
- Performance reviewer: focus on bottlenecks and scalability
- Test coverage reviewer: focus on edge cases and missing tests
Consolidate findings in docs/auth-review.md.

設計思想として重要なのは「独立した複数エージェントが互いに反論することで、生き残った仮説が真因に近い」という点です。順序調査では最初の仮説に後続調査が引きずられますが、並列で独立した検証を行えばこのバイアスを除去できます。

Agent Teams(実験的機能)

Claude Code には Agent Teams という実験的機能があり、エージェント間の非同期コミュニケーションをサポートします。

.claude/settings.json(Agent Teams を有効化)
{
  "env": {
    "CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1"
  }
}

Agent Teams を有効にすると、TeammateIdleTaskCreatedTaskCompleted などの Hooks でチーム全体の品質ゲートを構成できます。現在は実験的機能のため、本番プロジェクトへの適用は慎重に行ってください。

サブエージェントを使う fan-out パターン

大量のファイルを一括変換・マイグレーションする際は、claude -p(非対話モード)をループで呼び出すパターンが有効です。

fan-out パターン:大量ファイルの並列マイグレーション
# files.txt に変換対象ファイルのリスト
cat files.txt | while read file; do
  claude -p "Migrate $file from React class components to hooks.
Return OK if successful, FAIL with reason if not." \
    --allowedTools "Edit,Bash(git add *,git commit *)" &
done
wait   # すべての並列実行が完了するまで待機

fan-out パターンを使う際は、各サブエージェントの作業スコープを明確に限定し、結果を docs/findings.md や個別のログファイルに出力させると後から集約しやすくなります。また --allowedTools で使用できるツールを限定することで、サブエージェントが意図しないファイルを変更するリスクを防げます。

調査特化型サブエージェント:メインのコンテキストを汚さない

調査・探索タスクをサブエージェントに委ねることでメインのコンテキストを清潔に保てます。長い調査結果をメインの会話に貼り付けると、コンテキスト腐敗が加速するためです。

調査特化型サブエージェントの指示例
# API 仕様の調査をサブエージェントに委ねる
Spawn a subagent to research the Stripe Webhooks API.
Focus on:
- Event types for payment lifecycle
- Signature verification best practices
- Retry behavior and idempotency
Write findings to docs/stripe-research.md. Return when complete.

# コードベース調査をサブエージェントに委ねる
Spawn a subagent to understand how authentication is currently implemented.
Read all files in src/auth/ and middleware/.
Summarize the architecture and any security concerns in docs/auth-analysis.md.
Do NOT make any changes. Return when complete.

原則8:Task Diary で「セッションをまたぐ学び」を蓄積する

Claude Code のコンテキストウィンドウは揮発性の RAM です。セッションが終わればそこで得た知見は消えます。Task Diary はこの問題を解決するための仕組みで、セッション中の試行錯誤を記録し、次のセッションに持ち越します。

Manus-style 3ファイルパターン

コミュニティで最も普及している実装は、3つの Markdown ファイルで役割を分担する方法です。この手法を適用したベンチマークでは 96.7% のタスク通過率(未適用では 6.7%)という結果が報告されています。

ファイル 役割 更新タイミング
docs/task_plan.md 現在のタスク一覧・フェーズ・依存関係 タスク開始時・完了時
docs/findings.md 調査結果・失敗したアプローチ・発見した制約 2ツール操作ごと(2-Action Rule)
docs/progress.md セッションログ・テスト結果・次回の開始点 セッション終了時
docs/task_plan.md の記述例
# タスク計画

## 現在のフェーズ: Phase 2 - 認証機能実装

## タスク一覧

### Phase 1: 環境構築(完了)
- [x] TASK-001: DB スキーマ作成
- [x] TASK-002: プロジェクト初期化

### Phase 2: 認証機能(進行中)
- [x] TASK-003: ユーザーモデル実装
- [ ] TASK-004: ログインエンドポイント(⚡ 現在作業中)
- [ ] TASK-005: JWT ミドルウェア

## 判明した制約
- bcrypt のハッシュ化は非同期処理が必要(同期版はテストがタイムアウトする)
- テスト用 DB は毎回 `npm run db:reset` でリセットする必要がある
docs/progress.md のセッション記録例
## セッション 2026-03-20

### 試したこと
- JWT の有効期限を1時間に設定 → ログインテストが断続的に失敗
- 有効期限を24時間に変更 → テスト安定化

### 成功したアプローチ
- `jsonwebtoken` ライブラリのオプション `{ expiresIn: "24h" }` を使う

### 失敗したアプローチ
- `expiry: 3600` を直接渡す → `invalid options` エラーになる(要注意)

### 次回の開始点
- TASK-005 JWT ミドルウェアの実装から再開
- `src/middleware/auth.ts` の `validateToken()` 関数から始める

CLAUDE.md への昇格:Compound Engineering サイクル

Task Diary に蓄積した知見は、一定期間後に CLAUDE.md の「教訓」セクションに昇格させます。every.to が提唱する Compound Engineering では、この「学びを CLAUDE.md に還流するサイクル」を4ステップで設計しています。

ステップ 割合 内容
Plan(計画) 40% サブエージェントがコードベース・ベストプラクティスを並列調査し実装計画を立てる
Work(実装) 10% 計画に基づき Claude が実装・テスト作成を実行
Review(レビュー) 40% 複数の専門レビューエージェントが並列でセキュリティ・パフォーマンス・テストカバレッジを確認
Compound(蓄積) 10% 学びを CLAUDE.md・docs/solutions/・専用エージェントに格納して次のサイクルに持ち越す
CLAUDE.md の「教訓」セクション例
## 教訓(累積)

### 認証関連
- JWT の有効期限は `{ expiresIn: "24h" }` 形式で指定すること(数値指定は無効)
- bcrypt のハッシュ化は必ず非同期版を使うこと(同期版はタイムアウトする)

### デプロイ関連
- deploy_to_db() は SSH stdin パイプ方式を使う(SCP 方式は Windows パスが文字化けする)
- 内部リンクは post_name ではなく本番 post_id で構成すること

### テスト関連
- テスト用 DB は各テスト前に `npm run db:reset` でリセットが必要
- E2E テストは `playwright.config.ts` で retries: 2 を設定するとフラキーテストが減る

Boris Cherny のチームでは CLAUDE.md を Git にコミットし、チーム全体でエラーと教訓を追記していきます。「次のセッションで Claude は過去の失敗を繰り返さない」——これが複利的エンジニアリングの本質です。Claude Code のメモリ設計について詳しくはこちらを参照してください。

Hooks でセッション記録を自動化する

Stop Hook を使うと、セッション終了時に自動的に進捗が記録されます。毎回手動で書く手間を省けます。

.claude/hooks/diary.py(Stop Hook での自動記録)
#!/usr/bin/env python3
"""セッション終了時に progress.md を自動更新する"""
import json, sys, datetime, subprocess, os

input_data = json.load(sys.stdin)

if input_data.get('stop_hook_active', False):
    sys.exit(0)

# 本日の日付
today = datetime.date.today().isoformat()

# 直近の git diff を取得(変更サマリ)
diff = subprocess.run(
    ['git', 'diff', '--stat', 'HEAD'],
    capture_output=True, text=True
).stdout.strip()

# progress.md に追記
progress_path = 'docs/progress.md'
os.makedirs('docs', exist_ok=True)

with open(progress_path, 'a', encoding='utf-8') as f:
    f.write(f'
## セッション {today}
')
    f.write('### 変更ファイル
')
    f.write(f'```
{diff or "(変更なし)"}
```
')
    f.write('### 次回の開始点
')
    f.write('(ここに次回開始時の状況を記録する)
')

sys.exit(0)

よくある失敗パターンと対処法

8つの原則を知っていても、実際の運用では陥りやすい落とし穴があります。よくある失敗と対処法を整理します。

失敗パターン なぜ起きるか 対処法
会話が長くなるにつれて指示を「忘れる」 コンテキスト腐敗。重要な情報が会話の深い部分に埋まる CLAUDE.md に制約を書く。会話が長くなったら /clear でリセット
同じバグを繰り返す 失敗から学ぶ仕組みがない docs/findings.md に失敗したアプローチを記録し、教訓を CLAUDE.md に昇格させる
テストなしに実装が進む 成功基準を与えていない 指示に「〇〇のテストが通ること」を必ず含める
想定外のファイルが書き変わる タスクのスコープを限定していない 「src/auth/ 以外は変更しないこと」とスコープを明示する
計画が途中で変わって混乱する Plan Mode を使わず直接実装に入る 要件が明確な場合は Plan Mode で計画を固めてから実装に移る
並列セッションでコンフリクトが頻発する worktree を使わず同一ディレクトリで並列実行する claude --worktree で各セッションを独立した作業ディレクトリに分離

「過度な自律性」への警戒

コンテキストエンジニアリングが整い、Claude が自律的に動くようになると、逆に「過度な自律性」のリスクが生まれます。Claude が誤った前提のまま長時間作業を進め、気づいたときには大量の変更が必要になっている、というケースです。

  • 長時間タスクには中間チェックポイントを設ける:「30分ごとに現在の進捗を報告して」という指示を加える
  • 許可ツールを限定する--allowedTools で使用可能なツールを絞り込む
  • Stop Hook で成果物を検証する:自律作業の終了条件を人間が定義したテストで担保する
  • 重要な判断は確認を求める:CLAUDE.md に「アーキテクチャを変更する場合は必ず確認すること」と書く

Anthropic 流の役割分担:人間と Claude がそれぞれ担うべきこと

8つの原則を実践する上で重要なのが、人間と Claude の役割分担を明確にすることです。Anthropic エンジニアの実践から見えてくる理想的な分担は次のとおりです。

担当 役割
人間が担うべきこと アーキテクチャの最終判断 / 「何をテストするか」の決定 / 成果物のレビューと承認 / ビジネス要件の定義 / 優先度の判断
Claude が担うべきこと 実装コードの記述 / テストコードの記述と実行 / コードベースの調査・探索 / 反復的な修正作業 / ドキュメント生成

この分担で重要なのは「何をテストするか」を人間が決める点です。テストケースの設計はビジネスロジックの理解を必要とする判断であり、Claude には任せきりにしない方が品質が高くなります。テストを書いて・実装して・テストを通す、という繰り返し作業は Claude に委ねることができます。

「使うほど賢くなる」設計とは:CLAUDE.md に教訓を蓄積する・docs/ にタスク記録を残す・Hooks で品質ゲートを設ける——これらは最初は手間に感じるかもしれません。しかし一度整えると「新しいセッションを始めるたびに前回の続きから高品質にスタートできる」状態になります。この複利的な蓄積が、単発でいい指示を出すより長期的に高い品質を生み出します。

8原則のまとめ

原則 核心 最初に試すこと
コンテキストエンジニアリング CLAUDE.md に知識を蓄積し、毎回参照できる環境を作る /init で CLAUDE.md を生成し Git にコミットする
成功基準アプローチ 手段ではなく「こうなったら成功」という基準を渡す 「〇〇してテストを実行して確認して」という形で指示する
探索型 vs 計画型 要件の明確さで進め方を使い分ける 要件が曖昧なら先に使い捨てプロトタイプ・明確なら Plan Mode
並列セッション git worktree で独立した作業ディレクトリを用意し複数の分身を動かす claude --worktree で独立セッションを起動する
カスタムコマンド .claude/commands/ に Markdown を置いて繰り返し作業を定型化 /commit-push-pr コマンドを作って PR 作成を自動化する
Stop Hook テストが通るまで Claude を終了させないゲートを設ける tdd-guard プラグインをインストールして即座に導入する
Opponent Processor 賛成役・反論役サブエージェントで単一視点の偏りをなくす バグ調査時に「5つの仮説をそれぞれ検証させる」指示を試す
Task Diary セッション中の学びを docs/ に記録し CLAUDE.md に還流する docs/findings.md を作り失敗したアプローチを書き始める

8つすべてを一度に導入する必要はありません。まず「成功基準アプローチ」と「CLAUDE.md の整備」から始め、徐々に他の原則を追加していくのが現実的です。Claude Code の基本的な使い方Hooks の設計サブエージェント活用の各記事も合わせて参照してください。

よくある質問

QCLAUDE.md と Task Diary(docs/progress.md)はどう使い分けますか?
ACLAUDE.md はプロジェクト全体に渡って有効な「ルールと教訓」を書く場所です。Task Diary(docs/progress.md)はセッション単位の作業記録を書く場所です。Task Diary に蓄積した内容のうち「汎用的な教訓」だけを定期的に CLAUDE.md に昇格させます。詳細な作業ログは docs/ に残し、CLAUDE.md は重要な情報だけに絞るのがコンテキスト管理の鉄則です。
Qセッションをまたいで学習させることはできますか?
AClaude Code のコンテキストウィンドウは揮発性です(会話履歴はセッション終了で消えます)。セッションをまたいで学習させるには、CLAUDE.md・docs/・auto-memory(.claude/auto-memory/)のファイルに知識を書き出す必要があります。これらのファイルは次のセッションで Claude が参照できます。
QStop Hook の無限ループを防ぐ方法は?
AStop Hook の Python スクリプトで必ず `input_data.get(“stop_hook_active”, False)` をチェックし、True のとき即座に exit(0) します。このチェックがないと「ブロック → Claude が修正しようとする → 再び終了 → Stop Hook 再発火」の無限ループになります。tdd-guard プラグインはこのチェックが内蔵されているので、自分で実装する手間が省けます。
QOpponent Processor は通常のサブエージェントと何が違いますか?
A通常のサブエージェントは「調査して結果を返す」という単方向の動きをします。Opponent Processor パターンでは「互いに反論させる」という双方向のやり取りを通じて、一方的な仮説を排除します。バグ調査・設計議論・コードレビューなど、単一の答えが正しいとは限らないタスクで特に有効です。
Q並列セッションで git のコンフリクトが起きませんか?
Agit worktree を使えば各セッションが独立したワーキングディレクトリを持つため、同じファイルへの同時編集によるコンフリクトは起きません。ただし worktree をマージするタイミングで通常の git コンフリクトが発生する可能性はあります。各セッションのスコープ(担当するファイル・機能)を最初に明確にしておくとコンフリクトを最小化できます。