多くの人は、AI エージェントを間違ったレイヤーで修正しようとしている。
エージェントが失敗すると、プロンプトを書き直す。それでも失敗すると、指示を追加し、モデルを切り替え、コンテキストウィンドウを広げ、別のツールを接続する。
そして同じ問題がぶり返す。
エージェントは重要な判断を忘れ、間違ったツールを使い、3 ステップ前に何が起きたかを見失い、結果を確認せずにタスク完了だと主張し、予算が尽きるまで同じ失敗したアクションをリトライし続ける。
問題は常にモデルにあるわけではない。
問題は、その周囲の環境にある。
その環境こそが harness(ハーネス) である。
Harness Engineering とは、モデルの周囲にシステムを構築する実践のことだ。何が見えるか、何ができるか、何を記憶するか、何が成功とみなされるか、失敗時にどう振る舞うかを決定するシステムである。
より良いプロンプトは、1 つの応答を改善できる。
より良い harness は、すべての実行を改善する。
AI エージェント、自動化、本番システムのより実践的な解説については、私の Substack をフォローしてください:
1. モデルはエージェントではない
モデルは推論し、生成し、比較し、選択できる。
しかし、それだけでは信頼できるエージェントにはならない。
真のエージェントには、適切なコンテキストを見つけ、ツールを使い、状態を保持し、権限を尊重し、自身の作業を検証し、環境が想定通りに動かないときに復旧する能力も必要だ。
モデルはあくまで推論エンジンにすぎない。
その推論を実際の「実行」に変換するすべてが harness である。
1ユーザーのリクエスト2 |3 v4+-----------------------------+5| HARNESS |6| |7| contract context |8| tools state |9| policy verification |10| traces recovery |11+-----------------------------+12 |13 v14 MODEL15 |16 v17現実の環境
同じモデルをチャットボックスに入れれば、質問に答えるだけになる。

ターミナルアクセス、テスト、ブラウザツール、プロジェクトメモリ、制御された権限、レビューループを持つリポジトリの中に入れれば、実際の仕事を完了できるようになる。
モデルは変わっていない。
変わったのは harness だ。
2. すべてのリクエストをコントラクトに変換する
自然言語は柔軟だ。
しかし、自律的な実行は柔軟であってはならない。
次のようなリクエストは:
オンボーディングフローを改善して。
人間がモデルの隣にいるなら問題ない。
だが、本番環境の指示としては最悪だ。
エージェントが行動する前に、リクエストを境界の定まったタスクコントラクトに変換する。

1objective: オンボーディングの離脱率を下げる23inputs:4 - プロダクト概要資料5 - アナリティクスデータ6 - リポジトリ78constraints:9 - 認証機能は維持する10 - データベーススキーマは変更しない11 - 現在のモバイルでの挙動は維持する1213deliverable:14 - レビュー可能なプルリクエスト1516done_when:17 - テストが通過する18 - アナリティクスイベントが正しく発火する19 - デスクトップ版フローがレビューを通過する20 - モバイル版フローがレビューを通過する2122approval_required:23 - 本番環境へのデプロイ
重要なのは done_when(完了条件)だ。
これがないと、エージェントは少し簡単なバージョンの問題を解いただけで、「タスクは完了しました」と自信満々に宣言してしまう。
これがあれば、完了が測定可能になる。
エージェントはこう尋ねるべきではない:
次に何をすればいいですか?
こう尋ねるべきだ:
どのアクションが、現在の環境をコントラクトで定められた成果に近づけるか?
こちらの方がはるかに強力なループになる。
3. 巨大なコンテキストウィンドウではなく「地図」を与える
エージェントのミスに対するよくある反応は、モデルにより多くのコンテキストを与えることだ。
もっとドキュメントを。
もっと会話履歴を。
もっとファイルを。
もっとツールの出力を。
そのうちエージェントはすべてを受け取り、何も理解しなくなる。
コンテキストはストレージではない。
注意(アテンション)の予算だ。

プロジェクト全体を毎回の実行に放り込むのではなく、有用な情報がどこにあるかを示す小さな地図をエージェントに渡す。
1プロジェクトマップ23product rules -> docs/product/4architecture -> docs/architecture.md5frontend -> apps/web/6backend -> services/api/7tests -> tests/8commands -> docs/commands.md9security -> docs/security.md
そして必要なときだけ展開する。
1タスク2 |3 v4プロジェクトマップ5 |6 v7関連するシステム8 |9 v10対象ファイル11 |12 v13ローカルな指示
元記事ではこれを progressive disclosure(段階的開示)と呼んでいる。harness が情報を読み込むべきなのは、タスクがそれを必要とするからであり、単に情報が存在するからではない。
目的はコンテキストの最大化ではない。
有用なシグナルの最大化だ。
4. モデルとツールの間にゲートウェイを置く
20 個のツールを持つモデルが、自動的に 20 倍有能になるわけではない。
単に失敗する方法が 20 個増えただけかもしれない。
すべてのツールにはコントラクトが必要だ。
1TOOL: edit_file23INPUTS4path5patch67PRECONDITIONS8path が存在すること9path がワークスペース内であること1011SUCCESS12patch が適用されたこと13diff が返されたこと1415FAILURE16構造化されたエラー17部分的な上書きは発生しないこと1819RISK20可逆的
すると実行パスはこうなる:
1モデルが提案する2 |3 v4ゲートウェイが検証する5 |6 v7ポリシーが認可する8 |9 v10ツールが実行する11 |12 v13harness が結果を記録する
どのアクションを取りたいかを決めるのはモデルだ。
そのアクションが妥当で、許可されており、安全かどうかを決めるのは harness である。

この区別は、ツールがメッセージ送信、本番環境の変更、支払い、データ削除を行える場合に決定的に重要になる。
優れたツールゲートウェイは、タイムアウトの追加、引数の検証、ファイルパスの制限、エラーの正規化、リトライの安全化も担える。
良いツールは、モデルが推測しなければならないことを減らす。
5. メモリを会話の外へ移す
会話をシステムの記録源にしてはいけない。
長時間稼働するエージェントは、いずれコンテキスト上限に達し、クラッシュし、再起動するか、別のセッションへ作業を引き継ぐ。
重要な判断がすべてログの中にしか存在しなければ、ワークフローは脆い。
永続的な状態は別に保存する。

1{2 "task_id": "feature_042",3 "status": "verifying",4 "current_step": "mobile_check",56 "completed": [7 "implementation",8 "unit_tests",9 "desktop_check"10 ],1112 "decisions": [13 "既存のエクスポートエンドポイントを再利用する",14 "現在の日付フォーマットを維持する"15 ],1617 "artifacts": [18 "export.csv",19 "desktop-after.png"20 ],2122 "open_risks": [23 "モバイルのツールバーがはみ出す可能性がある"24 ],2526 "next_action": "モバイルビューポートを描画する"27}
実用的なシステムは、メモリを 4 つのカテゴリに分ける:
1FACTS(事実)2不変の知識34DECISIONS(判断)5何を選び、なぜ選んだか67STATE(状態)8現在の実行がどこまで進んでいるか910LESSONS(教訓)11今後の実行に影響すべき失敗
次のエージェントセッションが引き継ぐべきは、前回の会話を圧縮した物語ではなく、作業の状態そのものだ。
6. 完了のゲートを「証拠」にする
エージェントが「完了しました」と言うことは、仕事が終わった証明にはならない。

それはもう一つのモデル出力にすぎない。
harness には観察可能な証拠が必要だ。
1主張 証拠23「バグは修正済み」 失敗していたテストが通過する45「ページは正常に動く」 ブラウザでのフローが完了する67「データは正しい」 値がソースと一致する89「マイグレーションは安全」 ドライラン+ロールバックが成功する1011「タスクは完了」 すべての受け入れチェックが通過する
まずは決定論的なチェックを使う。
1構文チェック2 |3 v4型チェック5 |6 v7フォーカステスト8 |9 v10統合テスト11 |12 v13視覚的/意味的レビュー14 |15 v16人間の承認
コンパイラ、テスト、スキーマ、データベースクエリで証明できることを、別のモデルに答えさせてはいけない。
判断にはモデルを使う。
事実には決定論的なシステムを使う。
成果物を作るのはモデルだ。
その成果物に関する証拠を作るのは環境だ。
証拠が十分かどうかを判断するのは harness である。
7. 作る人と検証する人を分ける
自己レビューにはもう一つ問題がある。
ミスを作り出したエージェントは、レビュー時にも同じ前提を持ち込んでしまうことが多い。

より堅牢なアーキテクチャは、ワーカーと検証者を分離する。
1BUILDER2 |3 v4候補を作成する5 |6 v7VERIFIER8 |9 +-- コントラクトを確認する10 +-- 欠落しているケースを探す11 +-- 根拠のない主張をテストする12 +-- 結果を壊そうとする13 |14 +------ PASS ------> ACCEPT15 |16 +------ FAIL ------> RETURN EVIDENCE
検証者はこう問うべきではない:
これは良さそうに見えるか?
こう問うべきだ:
何が起これば、これは受け入れ不可になるか?
これにより、レビューは「確認作業」から「反証の試み」へと変わる。
元記事では、検証専用の却下基準を与え、最初の結果を生んだ前提に異議を唱えられるだけの独立性を持たせることを明確に推奨している。
8. 権限管理をモデルの外に出す
一部のルールは、モデルが覚えてくれることに依存してはならない。
1承認なしで公開しない2シークレットを露出させない3支出上限を超えない4ワークスペース外に書き込まない5実行していないテストを「通過した」と主張しない
これらはプロンプトへのお願いではない。

ポリシーだ。
シンプルな権限の階層:
1低リスク23read4search5inspect67-> 自動許可89可逆的操作1011edit workspace12run tests13create draft1415-> 自動許可+トレース記録1617外部に影響する操作1819send20deploy21purchase2223-> 承認が必要2425不可逆/機密操作2627delete data28rotate credentials29publish globally3031-> 厳格なゲートまたは禁止
影響が大きいほど、制御も強くする。
アクションを推奨できるのはモデルだ。
認可するのは harness である。
実行するのはツールだ。
自律性とは、制御がないことではない。
強制力のある境界の内側での自由だ。
9. 盲目的なリトライをやめる
最悪のリカバリー方針の一つはこれだ:
失敗した。もう一度やれ。
何も変わらないなら、システムは同じ失敗を再現するためにお金を払っているだけだ。
まず失敗を分類すべきだ。

1ツールのタイムアウト2-> バックオフ付きでリトライ34無効な引数5-> ツール呼び出しを修正67コンテキスト不足8-> 不足しているソースを取得910テスト失敗11-> 失敗した挙動を検査1213権限拒否14-> 承認を要求1516要件の矛盾17-> エスカレーション1819変化のない繰り返しの失敗20-> 停止
実用的なエージェントループはこうなる:
1OBSERVE(観察)2 |3 v4DECIDE(判断)5 |6 v7ACT(実行)8 |9 v10MEASURE(計測)11 |12 +---- ACCEPT(受容)13 |14 +---- REPAIR(修復)15 |16 +---- ESCALATE(報告)17 |18 +---- STOP(停止)
すべてのループには、試行回数、時間、コスト、破壊的範囲の上限が必要だ。
信頼できるエージェントは、どう続けるかを知る必要がある。
同時に、いつ次の試みが無駄になるのかも知る必要がある。
10. 繰り返される指示をインフラに変える
プロンプトにこう書かれているとしよう:
必ずフォーマッターを実行すること。
フォーマッターが自動で走るようになれば、このルールはより強固になる。
指示にこう書かれていたとしよう:
UI コードはデータベースに直接アクセスしてはならない。
ルール違反時に失敗するアーキテクチャテストとして実装した方が、はるかに強力だ。
進化の過程はこうなる:
1説明2 |3 v4チェックリスト5 |6 v7テンプレート8 |9 v10自動チェック11 |12 v13強制されるポリシー
判断について説明すべきはプロンプトだ。
不変条件を強制すべきは harness である。
繰り返されるミスはすべて、この階段を一段ずつ下げていくべきだ。
最終的に、モデルはその教訓を覚えている必要がなくなる。
環境がモデルの代わりに覚えてくれるからだ。
11. 実行を記録する
完璧な成果物が、ひどい実行プロセスを隠すことがある。
エージェントが間違ったソースにアクセスしたかもしれない。
失敗したコマンドを無視したかもしれない。
外部アクションを 2 回繰り返したかもしれない。
想定予算の 10 倍を使ったかもしれない。
間違った理由で正解を出したかもしれない。
何が起きたかを再構成できるだけの情報を記録する。
109:14 タスクコントラクト作成209:15 architecture.md 読み込み309:17 checkout.ts 編集409:18 フォーカステスト失敗509:21 実装修正609:22 フォーカステスト通過709:24 統合テスト通過809:25 デプロイブロック:承認が必要
有用なトレースには、コンテキストソース、ツール呼び出し、状態変化、検証結果、リトライ理由、承認判断、コスト、レイテンシが含まれる。
ログ集めを楽しむのが目的ではない。
失敗箇所を局所化するのが目的だ。
ステップ 18 で壊れたなら、ステップ 18 だけを修正できるべきだ。
実行全体を巻き戻す必要はない。
12. すべての実行にレシートを発行する
40 メッセージ分のログを人間にレビューさせるべきではない。
結果を小さなレシートにまとめる。
1OBJECTIVE(目的)23クーポンの重複適用を修正する。45CHANGED(変更点)67checkout のバリデーション8回帰テスト910VERIFIED(検証済み)1112lint 通過13ユニットテスト通過14統合テスト通過1516NOT VERIFIED(未検証)1718本番環境の決済プロバイダー1920RISKS(リスク)2122レガシーモバイルクライアントが利用不可2324APPROVAL NEEDED(要承認)2526ステージング環境へのデプロイ
これは、モデルが「こうなった」と主張した内容の要約ではない。
harness が「こうなった」と証明できる内容の要約だ。
この違いがあるからこそ、レシートはレビュー、引き継ぎ、将来のエージェントセッションで役立つ。
13. すべての失敗で harness を改善する
多くのチームは、失敗した出力だけを修正する。
より良いアプローチは、その失敗を許してしまったシステム自体を修正することだ。
1コンテキスト不足2-> プロジェクトマップを改善34間違ったツール5-> ルーティングまたはツールコントラクトを改善67悪い出力8-> バリデーターを追加910無限ループ11-> リトライ上限を追加1213危険なアクション14-> 権限ゲートを追加1516判断の消失17-> 状態を永続化1819原因不明の失敗20-> トレース機能を改善
ここで Harness Engineering の複利効果が生まれ始める。
1 つの出力を修正しても、助かるのは 1 回の実行だけだ。
harness を 1 つ修正すれば、それ以降のすべての実行が改善される。
最高のエージェントシステムが信頼性を増していくのは、ミスがインフラという遺産を残すからだ。
14. 最小限の有用な harness から始める
始めるのに巨大なオーケストレーション基盤は不要だ。
層を重ねて構築する。
1LEVEL 023prompt4model56LEVEL 178task contract9project map10tools1112LEVEL 21314structured state15verification16bounded loop1718LEVEL 31920permissions21traces22recovery23human gates
短い調査タスクなら、プロンプトと 1 回のレビューだけで十分なこともある。
ファイルアクセス、ネットワークアクセス、デプロイ機能を伴う 6 時間のコーディングタスクなら、ずっと多くのものが必要だ。
複雑さを追加するのは、失敗の可能性がそれを正当化するときだけにする。
エージェントアーキテクチャがかっこよく見えるからではない。
Harness Engineering チェックリスト
エージェントに意味のある自律性を与える前に、こう問いかけよ:
1[ ] 実行前に成功が定義されているか?23[ ] エージェントはすべてを読み込まずに4 適切なコンテキストを見つけられるか?56[ ] すべてのツールに明確な目的、7 スキーマ、失敗時の状態が定義されているか?89[ ] 重要な判断が会話の外に10 保存されているか?1112[ ] 完了に証拠が求められているか?1314[ ] リスクの高いアクションがポリシーで保護されているか?1516[ ] すべてのループにリトライ上限があるか?1718[ ] 中断後に実行を再開できるか?1920[ ] すべての重要なアクションを再構成できるか?2122[ ] 失敗がルール、ツール、23 テスト、マップ、権限のいずれかを改善するか?2425[ ] 最終的な変更をロールバックできるか?
複数の答えが「ノー」なら、より強力なモデルを使ってもエージェントは自動的には信頼できない。
単に失敗が速く、高くつくようになるだけかもしれない。
本当のパラダイムシフト
Prompt engineering はこう問う:
モデルに何を伝えるべきか?
Context engineering はこう問う:
モデルは今何を知っているべきか?
Harness engineering はこう問う:
モデルが行動し、自身の作業を検証し、失敗から復旧し、安全に動作できるシステムとは何か?
1PROMPT2-> 指示34CONTEXT5-> 作業用の視界67HARNESS8-> 実行環境910LOOP11-> 局所的な修正1213GRAPH14-> 協調
モデルは変わり続ける。
持続的な優位性は、その周囲に宿る。
あなたのコントラクトは良くなる。
あなたのツールは良くなる。
あなたのテストは良くなる。
あなたの状態管理は整理される。
あなたの権限制御は安全になる。
あなたのリカバリーロジックは賢くなる。
あなたの失敗はインフラに変わる。
そうやって、有能なモデルは信頼できるエージェントになる。
それが Harness Engineering だ。
ここまで読んでくれたあなたへ
このガイドをブックマークしてほしい。
X でフォローする: x.com/0xjmori
Substack を購読する: substack.com/@lunarresearcher
エージェントの失敗を、まだ長いプロンプトで解決しようとしている人にこの記事を送ってあげてほしい。



![[お詫び] フリーランスでの独立を推奨しなくなった理由](/cdn-cgi/image/width=1920,quality=90,format=auto,metadata=none/https%3A%2F%2Fcms-assets.youmind.com%2Fmedia%2F1790615558140_ndvona_HTQ9s6laYAAX4J7.jpg)

