「AIエージェントに自律的に動いてほしい」——この願いを持ったエンジニアが今、共通の壁に当たっている。デモでは動く。でも本番では壊れる。原因の多くはモデルの限界ではなく、モデルを動かす環境の設計不足だ。
その環境設計に体系的に取り組む方法論が「ハーネスエンジニアリング」だ。
この記事ではClaude Codeに特化して解説します。Claude Code全般は Claude Code完全ガイド2026:インストールから本番運用まで をご覧ください。
この記事でわかること
- ハーネスエンジニアリングの5つの流派と定義の違い
- Fowlerの「Guides + Sensors」二軸モデルと実践への応用
- Context Rot・長期タスク設計の最新知見
- どの流派の考え方をどう使い分けるか——判断フロー
「ハーネスエンジニアリング」——なぜ定義が人によって違うのか
ハーネスエンジニアリングという言葉が急速に広まった2025〜2026年、奇妙な現象が起きている。言葉を使う人によって、指している範囲がまるで違うのだ。
「ハーネスって何ですか?」と5人の専門家に聞けば、5通りの答えが返ってくる。これは定義が未整備なのではなく、それぞれが異なる問題意識から同じ言葉に辿り着いたからだ。
日本語でのハーネスエンジニアリング論考(speakerdeck.com/kinopeee/hanesuenziniaringutoha)が整理した5つの流派は、この状況をよく表している。
「モデル以外のすべて」"] H --> B["Hashimoto派
「失敗を再発不能にする環境」"] H --> C["Fowler派
Guides + Sensors"] H --> D["Chawla派
プロンプト⊂コンテキスト⊂ハーネス"] H --> E["Codex派
プロダクションスケール対応"] style H fill:#4A90D9,color:#fff style A fill:#F5A623 style B fill:#7ED321,color:#fff style C fill:#BD10E0,color:#fff style D fill:#E74C3C,color:#fff style E fill:#50E3C2
各流派の中心にある考え方を整理する。
5つの流派の比較——何が同じで何が違うか
Chase派:「モデル以外のすべてがハーネス」
LangChain創業者のHarrison Chaseが体現する考え方だ。
“If you’re not the model, you’re the harness.”
ツール実行、メモリ管理、サブエージェント制御、ガードレール、オーケストレーション——これらすべてがハーネスに含まれる。包括的・総合的なフレームワーク設計の視点から語られるため、LangChain・LangGraphのような大型フレームワークの文脈で使われることが多い。
この定義の利点は「モデルへの入出力以外はすべてエンジニアリング対象」という明快さだ。一方で広すぎて、「ハーネスを改善しよう」という議論が何を指しているのか曖昧になりやすい。
Hashimoto派:「失敗を物理的に再発不能にする環境の累積」
HashiCorp創業者のMitchell Hashimotoが実践し発信している流派で、現場感覚に最も近いとされる。
プロセスはシンプルだ。
- エージェントが失敗する
- その失敗が「物理的に起きないような」ルールをAGENTS.mdやCLAUDE.mdに追記する
- 繰り返す
特別なアーキテクチャ設計から始まるのではなく、実際の失敗から学んでルールファイルを育てていく。後から振り返ると、ルールファイルが「蓄積されたハーネス」になっているという考え方だ。
この流派の強みは「今日から始められる」点だ。何か大掛かりなシステムを構築する前に、エージェントを実際に動かして失敗から学ぶ。その記録がそのままハーネスになる。
Fowler派:「Guides(事前制御)+ Sensors(事後検証)」
ThoughtworksのDistinguished EngineerであるMartin Fowlerのハーネスエンジニアリング論文が提唱する構造化された二軸モデルだ。
Fowler派の定式は Agent = Model + Harness であり、HarnessをGuidesとSensorsの二軸で定義する。
| 軸 | 制御タイミング | 役割 |
|---|---|---|
| Guides(ガイド) | 事前(フィードフォワード) | エージェントが最初から正しい結果を出せるよう誘導 |
| Sensors(センサー) | 事後(フィードバック) | エージェントの出力を外部から監視し自己修正を促す |
GuideとSensorはさらにそれぞれ「計算的(deterministic)」と「推論的(probabilistic)」に分かれる。
LSP・自動補完
ブートストラップスクリプト"] G2["推論的ガイド
AGENTS.md・スキル定義
アーキテクチャ原則"] end subgraph Sensors["Sensors(事後検証)"] S1["計算的センサー
Lint・型チェッカー
構造テスト"] S2["推論的センサー
AIコードレビュー
E2Eテスト"] end M["モデル"] --> Guides M --> Sensors Sensors -->|"自己修正フィードバック"| M
Fowler派の強みは、何をどの層で対処するかを明確に区別できる点だ。「このチェックはLintでやる(計算的センサー)のか、AIレビューエージェントでやる(推論的センサー)のかを意識的に選択できる」という設計判断の軸になる。
また「コンテキスト設計の特定形式」としてハーネスを位置づけることで、CLAUDE.mdやAGENTS.mdの記述がどの軸に貢献しているかを整理できる。
Chawla派:「プロンプト⊂コンテキスト⊂ハーネスの三重構造」
教育系ライターのAvi Chawlaが提唱する初学者向けの可視化モデルだ。
ハーネス
└─ コンテキスト
└─ プロンプト
「LLMはCPU、コンテキストはRAM、ツールはデバイスドライバ、ハーネスはOS」というコンピュータアーキテクチャのアナロジーで説明する。
この流派はChase派と逆の包含関係になることがある点が注意だ。Fowler派では「ハーネス⊂コンテキスト設計」となる場合もある。
Codex派:「プロダクションスケール特有の故障モードへの対応」
OpenAI CodexチームのRyan Lopopoloが体現するスケール駆動の流派だ。「3人で百万行、95% AI生成」という実績から生まれた考え方で、小規模では現れない問題——Context Rot、コスト爆発、セッション間の記憶損失、再現不能なバグ——に対処するための構造設計を指す。
この流派が重要なのは、デモ環境と本番環境の差を最も直視しているからだ。
エンタープライズAIエージェントプロジェクトの88%が本番到達に失敗するという市場データは、Codex派が解くべき問題の大きさを示している。
5流派の比較と選択指針
| 流派 | 核心 | 強み | 弱み | 最適なシーン |
|---|---|---|---|---|
| Chase | モデル以外すべて | 包括的・明快 | 広すぎて議論が曖昧に | フレームワーク設計・全体設計 |
| Hashimoto | 失敗から育てる | 即実践可能・現場的 | 体系化しにくい | 個人・小チームの開発 |
| Fowler | Guides + Sensors | 設計判断を明確化 | 複雑・学習コスト高 | チーム設計・大規模システム |
| Chawla | 三重構造 | 初学者に伝わりやすい | 現場応用に限界 | 教育・説明の場面 |
| Codex | 本番故障モード対応 | 実際の問題を直視 | 前提知識が必要 | プロダクション展開 |
実務では単一の流派に縛られる必要はない。Hashimoto流で始めて(失敗から学ぶ)、Fowler流で整理し(Guides/Sensors)、Codex流でスケールに対応する——という重ね使いが現実的だ。
「言葉の定義は重要ではない。大切なのは期待した結果を得ること」——kinopeee
日本の現場は命名が広まる前から同じ実装を行っていた。名前がついたことで体系化できるようになったが、定義論争より手元の環境をどう改善するかが本質だ。
Fowler派の実践——Guides設計とSensors設計
Fowlerモデルは設計の判断軸として最も実用的だ。Claude Code環境での具体例を示す。
Guidesの設計
計算的ガイド(確定的・高速)
# .claude/settings.json — 許可ツールの明示的設定
{
"permissions": {
"allow": [
"Bash(npm run *)",
"Bash(git diff *)",
"Read",
"Write(src/**)",
"Edit(src/**)"
],
"deny": [
"Bash(rm -rf *)",
"Bash(git push --force *)"
]
}
}
許可・拒否リストは確定的ガイドの典型だ。モデルがどんな推論をしても、このリストで決まったツールしか使えない。
推論的ガイド(確率的・柔軟)
# CLAUDE.md — 推論的ガイドの例
## アーキテクチャ原則
- 新規ファイルは必ず src/features/{feature-name}/ 配下に作成する
- 外部APIコールは必ず src/lib/api/ 経由にする(直接fetchは禁止)
- テストファイルは実装ファイルと同ディレクトリに置く
## コミットルール
- 動作確認済みのコードのみコミットする
- マイグレーションファイルは単体でコミットする
CLAUDE.mdの記述はモデルへの確率的な影響を与える。「絶対に守られる」保証はないが、大半のケースでモデルは従う。LintルールやCI設定(計算的センサー)と組み合わせて使う。
Sensorsの設計
計算的センサー(確定的・自動)
コード変更後に自動で走るLint・型チェック・テストは計算的センサーだ。Claude Codeのフックシステムで実装できる。
#!/bin/bash
# .claude/hooks/post-write.sh — PostToolUse フック
INPUT=$(cat)
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty')
case "${FILE_PATH##*.}" in
ts|tsx)
# 型エラーをエージェントにフィードバック
TYPE_RESULT=$(npx tsc --noEmit 2>&1)
if [ -n "$TYPE_RESULT" ]; then
jq -n --arg fb "$TYPE_RESULT" \
'{"hookSpecificOutput":{"hookEventName":"PostToolUse","additionalContext":$fb}}'
fi
;;
esac
推論的センサー(確率的・高コスト)
AIレビューエージェントや人間のコードレビューが推論的センサーに当たる。計算的センサーが検出できない意味的な問題——過剰設計、ドメインロジックの誤り、セキュリティの論理的欠陥——を補う。
コストが高いため、CI後段や週次レビューなど、適切なタイミングに置くことが重要だ。
Context Rot——長期タスクで必ず直面する問題
Codex派が最も重視する問題のひとつがContext Rot(コンテキスト腐敗)だ。
Context Rotとは何か
ツール実行結果が積み重なるにつれ、コンテキストウィンドウは肥大化する。LLMの注意機構はウィンドウ内の後半部分に弱い——前半の指示が「薄れ」、古いコンテキストを無視した処理が増え始める。
Context Rotの症状:
- タスクが「完了した」と誤報告する
- 以前に書いたコードと矛盾するコードを書く
- 同じ処理を重複して実装する
- 指示の細部を無視し始める
Context Rotの対策戦略
戦略1:外部アーティファクトへの記憶の外出し
コンテキスト内に長大な作業履歴を蓄積しない。代わりにAGENTS.mdやtodo.mdなどのファイルに状態を書き出し、次のセッションで読み込む。
Anthropicが推奨する「Initializer + Coding Agent」の二段構成はこの考え方の実装だ。InitializerがセッションごとのAGENTS.mdを生成し、Coding Agentが読み込んで継続する。
<!-- claude-progress.txt の例(セッション間で引き継ぐファイル) -->
## セッション2 終了時点(2026-04-25)
### 完了
- src/auth/login.ts — JWT認証実装済み、テスト全通過
- src/auth/middleware.ts — 認証ミドルウェア実装済み
### 次のセッションで着手
- [ ] src/users/profile.ts — ユーザープロフィールAPI
- [ ] メール確認フロー(POST /auth/verify-email)
### 既知の問題
- Refreshトークンのローテーションは Sprint 3 以降
- エラーメッセージのi18n未対応
戦略2:KVキャッシュの安定化
Anthropicの実測データによれば、プロンプトの先頭部分が安定しているとKVキャッシュが効き、トークンコストが最大10分の1になるケースがある。
動的な要素(タイムスタンプ、セッションIDなど)をプロンプトの先頭に置くと、毎回キャッシュが無効化される。CLAUDE.mdのような静的な文書を先頭に固定し、動的な要素は後半に置く構成がコスト面でも有利だ。
戦略3:セッション分割とHandoff
長期タスクを「スプリント」に分割し、スプリント境界でコンテキストをリセットする。前セクションのProgressファイルがHandoffドキュメントになる。
目安:1スプリントでのコンテキスト消費量は50〜60%以内に収めると品質が安定する。claude --verboseで使用率を観察しながら適切なスプリント粒度を見つける。
判断フロー——何から始めるか、何を使うか
ハーネスを設計するとき、最初に悩むのは「どこから手をつけるか」だ。以下の判断フローで整理できる。
動かして失敗から学ぶ"] Q1 -->|"失敗パターンが溜まってきた"| Q2{"主な問題は?"} Q2 -->|"品質のばらつき"| F["Fowler流でGuides強化
AGENTS.md・スキル定義を整備"] Q2 -->|"バグの見落とし"| S["Fowler流でSensors強化
Lint・テスト・AIレビュー導入"] Q2 -->|"長期タスクで壊れる"| C["Codex流でスプリント設計
Context Rot対策・Handoff設計"] Q1 -->|"チームで使う"| T["Fowler流で全体設計
Guides/Sensors の役割分担を明文化"] H --> IMPROVE["実際の失敗を観察"] IMPROVE --> Q2 style START fill:#4A90D9,color:#fff style H fill:#7ED321,color:#fff style F fill:#BD10E0,color:#fff style S fill:#E74C3C,color:#fff style C fill:#F5A623 style T fill:#50E3C2
Guides vs Sensorsの設計バランス
どちらを先に強化すべきかは、今の問題によって変わる。
| 症状 | 推奨アクション |
|---|---|
| エージェントが意図しないファイルを変更する | Guides強化:許可パスをsettings.jsonで明示 |
| コードは動くが品質が低い | Sensors強化:Lint・型チェックをフックに追加 |
| 最初は良いが長時間で劣化する | Context Rot対策:外部アーティファクト設計 |
| チームメンバーによって品質がばらつく | Guides強化:AGENTS.mdのアーキテクチャ原則を充実 |
| デプロイ後にバグが頻発する | Sensors強化:E2EテストをCI後段に追加 |
| 同じ失敗が繰り返される | Hashimoto流:失敗パターンをAGENTS.mdに追記 |
Fowler論文が指摘する「未解決の課題」
ハーネスエンジニアリングの現在地を正確に把握するため、Fowlerが「まだ解けていない問題」として挙げる課題を紹介する。
1. ハーネスの一貫性維持
AGENTS.mdのルールが増えるにつれ、矛盾するルールが混在し始める。人間のコードベースと同様、ハーネス自体も「リファクタリング」が必要になる。しかしハーネスの品質をどう評価するかの方法論はまだ確立していない。
2. 行動レベルの信頼性
Lint(計算的センサー)が通った、型エラーが0になった——でも機能の動作が正しいかどうかは別問題だ。「仕様に対して正しく動く」という行動レベルの検証は、LLMベースのセンサー(確率的)に頼らざるを得ない部分が多く、信頼性が低い。
3. 矛盾する指示への対処
「コードはシンプルにしろ」と「テストカバレッジを100%にしろ」は場合によって矛盾する。人間なら文脈でバランスを取るが、エージェントは指示を字義通りに解釈しがちだ。ハーネスで「優先度の高いルール」を明示する方法が求められる。
4. Ashby’s Law問題
制御工学の「必要多様性の法則(Ashby’s Law)」によれば、制御者がシステムを制御するには同等の複雑性が必要だ。エージェントが複雑になるほど、それを制御するハーネスも複雑になる——理論的な限界だ。だからこそ「ハーネスを定期的にシンプル化する」という原則が重要になる。
モデルが賢くなるにつれ、以前は複雑なフィードバックループが必要だった処理が、シンプルな指示で解決できるようになる。ハーネスは育てながら削るもの、という意識を持つと長期的に維持しやすくなる。
ハーネスエンジニアリングとプロンプトエンジニアリングの違い
よく混同される概念との整理をしておく。
| 比較軸 | プロンプトエンジニアリング | ハーネスエンジニアリング |
|---|---|---|
| 対象 | 単一のリクエスト・応答 | エージェントの実行環境全体 |
| スコープ | リクエスト単位 | セッション〜プロジェクト単位 |
| 永続性 | 都度変更 | 環境として固定・育てる |
| 制御方法 | 自然言語による誘導(確率的) | 外部制約+フィードバックループ |
| 典型的な成果物 | プロンプトテンプレート | AGENTS.md・Hooks・CI設定 |
| 主な解決問題 | 出力品質の向上 | 信頼性・再現性・安全性 |
プロンプトエンジニアリングは「何を言えばいい出力が出るか」を最適化する。ハーネスエンジニアリングは「エージェントが長期にわたって安全・確実に動ける環境を作る」ことを目的とする。
Claude Codeでのハーネス設計の実践ロードマップ
具体的にClaude Code環境でハーネスを育てる順序を整理する。Claude Skillsを徹底解説で解説したスキルシステムも、ここで言うGuides(推論的)の一形態だ。
CLAUDE.md作成
(推論的ガイド初期化)"] --> W2["Week 2
Hooks追加
(計算的センサー)"] W2 --> W3["Week 3
スキル定義
(推論的ガイド充実)"] W3 --> W4["Week 4
ログ・可観測性
(センサーの記録化)"] W4 --> M2["Month 2
スプリント設計
(長期タスク対応)"] M2 --> M3["Month 3
ハーネスレビュー
(不要な複雑さを削る)"] style W1 fill:#d4edda style W2 fill:#d4edda style W3 fill:#fff3cd style W4 fill:#fff3cd style M2 fill:#f8d7da style M3 fill:#f8d7da
Month 3の「ハーネスレビュー」はよく忘れられるが重要なフェーズだ。Fowlerが指摘するように、モデルが賢くなると以前は必要だったHooksやルールが不要になる。定期的に「このSensorがまだ必要か」「このGuideはモデルが自然に守れるようになったか」を見直す。
まとめ——どの流派を使うか、より何を解くか
ハーネスエンジニアリングは定義が揺れている分野だが、各流派が解こうとしている問題は共通している:「AIエージェントを長期にわたって、安全に、再現性高く動かすための環境設計」だ。
定義を巡る論争より、手元の問題に最も効く考え方を選んで使う——これがkinopeeeの言う「言葉の定義より結果」の意味だ。
- 今日から始めるなら Hashimoto流(失敗から学ぶ)
- 品質を体系化するなら Fowler流(Guides/Sensors)
- 本番に持っていくなら Codex流(プロダクション故障モード)
それぞれの流派は競合ではなく、成熟フェーズに応じた補完関係にある。ハーネスは設計して終わりではなく、エージェントと共に育て、モデルの進化に合わせて削ぎ落としていくものだ。
ハーネスの実装パターン(Generator-Evaluator、スプリント分解、Hooksセキュリティ)を詳しく知りたい場合は Claude Code Hooksガイド も参照してほしい。
参照ソース
- ハーネスエンジニアリングとは(speakerdeck.com/kinopeee) — 5流派の分類と日本語での体系整理
- Harness Engineering for Coding Agent Users — Martin Fowler — Guides + Sensors二軸モデルの原典
- Effective harnesses for long-running agents — Anthropic Engineering Blog — Initializer/Coding Agent設計パターン
- Building effective agents — Anthropic — エージェント設計の基本原則
- Claude Code Best Practices — Anthropic Engineering Blog — Claude Code実践ガイド
- Claude Code公式ドキュメント — Hooks — フックシステムの仕様
- Agent Harness Engineering — The Rise of the AI Control Plane(Medium) — KVキャッシュ最適化・Context Rot対策
- awesome-harness-engineering(GitHub) — パターン・ツール・評価手法のキュレーション