maestro/docs/evaluations/2026-07-01-agent-design-20-principles.html
oss-sync b1292e34b2
Some checks failed
CI / build-and-test (push) Has been cancelled
sync: update from private repo (edc775f2)
2026-07-06 01:04:12 +00:00

129 lines
15 KiB
HTML
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AIエージェント設計20原則 × MAESTRO — コード実測による再評価</title>
<style>
:root { --green:#16a34a; --blue:#2563eb; --amber:#d97706; --red:#dc2626; --ink:#1f2937; --muted:#6b7280; --line:#e5e7eb; --bg:#f9fafb; }
* { box-sizing: border-box; }
body { font-family: -apple-system, "Hiragino Kaku Gothic ProN", "Noto Sans JP", sans-serif; color: var(--ink); line-height: 1.7; max-width: 1000px; margin: 0 auto; padding: 24px; background: #fff; }
h1 { font-size: 1.6rem; margin: .2em 0; }
h2 { font-size: 1.25rem; margin-top: 2em; border-bottom: 2px solid var(--line); padding-bottom: .3em; }
h3 { font-size: 1.05rem; margin-top: 1.4em; }
.badge { display: inline-block; padding: 3px 12px; border-radius: 999px; font-size: .8rem; font-weight: 700; color: #fff; background: var(--green); }
.meta { color: var(--muted); font-size: .85rem; margin: .5em 0 1.5em; }
table { border-collapse: collapse; width: 100%; margin: 1em 0; font-size: .9rem; }
th, td { border: 1px solid var(--line); padding: 7px 10px; text-align: left; vertical-align: top; }
th { background: var(--bg); font-weight: 700; }
code { background: var(--bg); padding: 1px 5px; border-radius: 4px; font-size: .85em; font-family: ui-monospace, "SF Mono", Menlo, monospace; }
.ok { color: var(--green); font-weight: 700; }
.part { color: var(--amber); font-weight: 700; }
.no { color: var(--red); font-weight: 700; }
.wrong { background: #fef2f2; }
.summary-box { background: var(--bg); border-left: 4px solid var(--blue); padding: 12px 18px; border-radius: 0 8px 8px 0; margin: 1em 0; }
.tally { display: flex; gap: 16px; flex-wrap: wrap; margin: 1em 0; }
.tally div { flex: 1; min-width: 120px; text-align: center; border: 1px solid var(--line); border-radius: 8px; padding: 12px; }
.tally .num { font-size: 1.8rem; font-weight: 800; }
.note { color: var(--muted); font-size: .85rem; }
.pri { font-weight: 700; padding: 2px 8px; border-radius: 4px; color:#fff; }
.p1 { background: var(--red); } .p2 { background: var(--amber); } .p3 { background: var(--muted); }
</style>
</head>
<body>
<span class="badge">完成 / 検証済み</span>
<h1>Anthropic「AIエージェント設計20の原則」× MAESTRO — コード実測による再評価</h1>
<p class="meta">
評価日: 2026-07-01 対象: <code>origin/main</code> commit <code>be4e98d7</code>(全ソースを実測)<br>
基にした資料: Zenn記事「Anthropic公式に学ぶAIエージェント設計20の原則」ながたく, 2026/06/23の MAESTRO 評価表<br>
手法: 3チームでコード横断監査各原則→該当 <code>file:line</code>→適合判定)。推測(記事の「⚠️不明」)を実コードで置換。
</p>
<div class="summary-box">
<strong>結論。</strong> 20の原則そのものは妥当Anthropicの実指針。しかし元記事の<strong>MAESTRO評価は精度が低い</strong> — 表の大半が「⚠不明確認必要」で、コードを読まずに書かれている。コード実測の結果、MAESTROは20原則に<strong>強く整合</strong>しており適合17部分適合3非適合0、記事が「改善余地大」とした項目のうち<strong>7件は実装済み機能を見落とした事実誤認</strong>だった。実質的な改善余地は<strong>3件</strong>に絞られる。
</div>
<div class="tally">
<div><div class="num ok">17</div>適合</div>
<div><div class="num part">3</div>部分適合</div>
<div><div class="num no">0</div>非適合</div>
<div><div class="num">7</div>記事の事実誤認を反証</div>
</div>
<h2>1. 記事の主張 vs 実コード(是正一覧)</h2>
<p>元記事が否定的・不明とした主要項目のうち、実コードと矛盾するものを列挙する。</p>
<table>
<tr><th>原則</th><th>記事の主張</th><th>実測判定</th><th>根拠file:line</th></tr>
<tr class="wrong"><td>1 注意予算/トークン計測</td><td>「トークン計測<strong>未実装</strong></td><td class="ok">誤り→適合</td><td><code>context-manager.ts:68-83</code><code>update(usage.prompt_tokens)</code>+比率閾値 0.7/0.85/0.95)/配線 <code>context-control.ts:64-116</code></td></tr>
<tr class="wrong"><td>4 サブエージェント</td><td><strong>並列化に偏り</strong>、汚染防止を文書化できていない」</td><td class="ok">誤り→適合</td><td><code>delegate-runner.ts:25-29</code>「isolation invariant」独立Conversation<code>orchestration.ts:7-11</code>「中間作業は文脈に残らない」。隔離型<code>delegate</code>と並列型<code>SpawnSubTask</code>が別実装</td></tr>
<tr class="wrong"><td>5 長タスク3戦略</td><td>「仕組みがあるか<strong>不明</strong>・改善余地大」</td><td class="ok">半分誤り→適合</td><td>圧縮=<code>history-compactor.ts</code><code>prompt-guard.ts</code>、検索=<code>task-conversation.ts</code>Search/ReadTaskConversationtranscript replay、ート=<code>mission.ts</code>MissionBrief今回 user_constraints/decisions/current_focus 拡張。3戦略とも実在</td></tr>
<tr class="wrong"><td>7 相対パス問題</td><td>「相対パス問題を避けるため<strong>絶対パス必須化</strong></td><td class="no">推奨が有害</td><td>逆。MAESTROは<strong>ワークスペース相対</strong>を強制しjail外の絶対パスを拒否<code>core.ts:457/494/729</code>, <code>browser.ts:118</code>)。絶対パス必須化はサンドボックスを壊す</td></tr>
<tr class="wrong"><td>14 マルチエージェント</td><td>「コスト対効果の<strong>基準不明</strong></td><td class="ok">誤り→適合</td><td><code>MAX_DELEGATION_DEPTH=2</code><code>agent-loop.ts:179</code>)+直列契約+<code>research.yaml</code> dig に opt-in判断基準複数独立対象/overflowリスク時のみ</td></tr>
<tr class="wrong"><td>17-18 CLAUDE.md</td><td>「フックの有無不明200行超で肥大化」</td><td class="part">カテゴリ違い</td><td>記事はリポジトリの<code>CLAUDE.md</code>Claude-Code向け手引き, 277行とMAESTRO製品の実行時プロンプトを混同。製品側は<code>allowed_tools</code>機械ゲート+<code>MISSION_TOTAL_CHAR_BUDGET=3200</code>で境界を機械強制(<code>movement-setup.ts:36</code>, <code>prompt.ts:102-108</code></td></tr>
<tr class="wrong"><td>20 訂正回数</td><td>「訂正回数の<strong>管理不明</strong></td><td class="ok">誤り→適合</td><td>3層のループ検出: Progressive Pressure<code>prompt.ts:315</code>連続再訪ABORT<code>piece-runner.ts:1115</code>toolLoopTracker<code>loop-safety.ts</code>, 同一バッチ5回で中断</td></tr>
</table>
<h2>2. 全20原則 — 証拠ベース判定</h2>
<h3>コンテキストエンジニアリング1〜6</h3>
<table>
<tr><th>#</th><th>原則</th><th>判定</th><th>根拠</th></tr>
<tr><td>1</td><td>コンテキストは有限の注意予算</td><td class="ok">適合</td><td><code>ContextManager</code>が実usageからトークン追跡閾値アクションcontext-manager.ts / context-control.ts</td></tr>
<tr><td>2</td><td>文脈はジャストインタイムで引く</td><td class="ok">適合</td><td><code>ReadToolDoc</code>遅延ロードdocs.ts:1101行ツールカタログ自動注入prompt.ts:290skill indexRead offset/limit</td></tr>
<tr><td>3</td><td>コード実行で中間データ処理</td><td class="ok">適合</td><td>Bashcore.ts:807, cwdWS・パス検証スクリプト作業をprompt自動推奨prompt.ts:157RunUserScriptMCP</td></tr>
<tr><td>4</td><td>サブエージェント=文脈汚染の隔離</td><td class="ok">適合</td><td>隔離型<code>delegate</code>独立Conversation, 結果のみ返却)と並列型<code>SpawnSubTask</code>が別々に実装</td></tr>
<tr><td>5</td><td>長タスクは3戦略を使い分け</td><td class="ok">適合</td><td>圧縮検索task-conversation構造化ートMissionBriefすべて実在</td></tr>
<tr><td>6</td><td>長文は文書冒頭・クエリ末尾</td><td class="ok">適合</td><td><code>Conversation.seed</code>: index0=system(preamble+guidance)、index1=user(タスク本文)。参照材料が先・クエリが後</td></tr>
</table>
<h3>ツール設計・ACI7〜12</h3>
<table>
<tr><th>#</th><th>原則</th><th>判定</th><th>根拠</th></tr>
<tr><td>7</td><td>ツール設計は一次作業</td><td class="ok">適合</td><td>1文description<code>docs/tools/*.md</code>39本の二層設計。CLAUDE.md/maintenance-checklistに明文規律。※記事の絶対パス推奨は不採用有害</td></tr>
<tr><td>8</td><td>タスクの自然な単位</td><td class="ok">適合</td><td>SplitExcelSheets/delegate/BrowseWeb(batched actions)/CreateChecklist 等、薄いラッパーでなくワークフロー単位。今回tool-dispatcher分割で内部の関心分離も改善(#702)</td></tr>
<tr><td>9</td><td>人間が即答できる粒度</td><td class="part">部分適合<br>(記事が正しい)</td><td><strong>89ツール</strong>と多い。重複クラスタ: delegate/SpawnSubTask/WaitSubTask、WebFetch/BrowseWeb/InteractiveBrowse/BrowseWithSession、ssh/ssh-console、Read系。allowed_tools/META_TOOLSで提示は絞るが棚卸し価値あり</td></tr>
<tr><td>10</td><td>応答識別子は自然言語名</td><td class="ok">適合</td><td>WS相対パスsavedRelPath等、サブタスク#N、checklist item_id、browser ref(e1/f1.e3)、comment:&lt;id&gt;/transcript:&lt;index&gt;。不透明UUIDをLLMに晒さない</td></tr>
<tr><td>11</td><td>エラー応答は改善指示</td><td class="ok">適合</td><td>invalid transition→有効な遷移先列挙、Read binary→Bashでの確認手順、大出力→Grep/offset提案 等。弱点: Edit old_string not foundSSH command rejected は原因のみ</td></tr>
<tr><td>12</td><td>現実的複雑度で評価</td><td class="part">部分適合</td><td>bench 5軸100点LLM-judge、composite-mini-reportは3ソース融合・現実的。<strong>だがbenchタスクが2本のみ</strong>。89ツールの大半は未網羅unitテスト46本で部分補完</td></tr>
</table>
<h3>ワークフロー選択・プロンプト・運用13〜20</h3>
<table>
<tr><th>#</th><th>原則</th><th>判定</th><th>根拠</th></tr>
<tr><td>13</td><td>事前特定でWF/Agentを選ぶ</td><td class="ok">適合</td><td>ハイブリッド: movementグラフは静的rules[].next、終端値はlint拒否 piece-runner.ts:92、movement内はReActエージェント最大200反復</td></tr>
<tr><td>14</td><td>並列価値がコストを上回る時だけ</td><td class="ok">適合</td><td>depth=2上限直列delegateresearch.ymlのopt-in判断基準</td></tr>
<tr><td>15</td><td>ルール列挙より3〜5例</td><td class="part">部分適合</td><td>chat/research/ssh-opsに具体テンプレ・few-shotあり。ただし一部はまだルール列挙。例示ファーストに寄せる余地</td></tr>
<tr><td>16</td><td>指示に理由を添える</td><td class="ok">適合</td><td>ssh-ops「ローカルで回避してはいけない」「MITM疑い→自動リトライしない」等の理由付き。<code>why_no_default</code>必須フィールドで構造的にも強制</td></tr>
<tr><td>17</td><td>重要境界は機械的ブロック</td><td class="ok">適合</td><td><code>getToolDefs</code>がallowed_tools外を提示しないフィルタで強制。editフラグ、rules終端値lint、SSH allowlist。記事はCLAUDE.md混同のカテゴリ違い</td></tr>
<tr><td>18</td><td>CLAUDE.mdは200行未満</td><td class="ok">適合(runtime)</td><td>製品ランタイムは<code>MISSION_TOTAL_CHAR_BUDGET=3200</code>で切詰め。リポジトリCLAUDE.md 277行はClaude-Code向けの軽微なnitで製品所見ではない</td></tr>
<tr><td>19</td><td>検証コマンドで完了定義</td><td class="ok">適合</td><td><code>vitest run</code><code>npm run bench</code><code>validate-help-docs.mjs</code>Stopフックchangelog警告</td></tr>
<tr><td>20</td><td>同じ修正2回でリセット</td><td class="ok">適合</td><td>Progressive Pressure連続再訪ABORT(loop_detected)toolLoopTrackercontext force_transitiontext-only上限。カウントは管理されている</td></tr>
</table>
<h2>3. 実質的な改善余地コード実測で残った3件</h2>
<p>記事の「優先改善トップ5」のP0CLAUDE.md肥大化・トークン予算未実装は前提が誤りのため除外。実測で残る改善余地は次の通り。</p>
<table>
<tr><th>優先</th><th>改善点</th><th>原則</th><th>根拠</th></tr>
<tr><td><span class="pri p1">P1</span></td><td><strong>ツール棚卸し・統合</strong>。89ツールを「人間が1秒で使い分けを言えるか」で監査し、重複クラスタサブエージェント3種ブラウザ4種SSH2系統を整理・description明確化。CLAUDE.mdのツール表も実態と乖離棚卸し漏れの症状</td><td>8,9</td><td>実測89ツール、重複4クラスタ特定</td></tr>
<tr><td><span class="pri p2">P2</span></td><td><strong>bench網羅の拡充</strong>。現在2タスクのみ。主要ツール群を現実的タスクで評価する bench を追加</td><td>12</td><td>bench/tasks/ に2本のみ</td></tr>
<tr><td><span class="pri p3">P3</span></td><td>細部: (a) pieceの一部ルール列挙を例示に寄せる15、(b) Edit/SSHの一部エラーに次の一手を追記11</td><td>11,15</td><td>該当箇所を特定済み</td></tr>
</table>
<h2>4. 総評</h2>
<p>
MAESTROは、記事が「基礎はある」とした以上に、20原則の<strong>大部分を既に実装済み</strong>である — トークン予算管理、JITコンテキスト、隔離型サブエージェント、3層ループ検出、機械的ツールゲート、char-budget化された実行時プロンプトは、いずれもコードに実在する。記事の否定的評価の多くは、コードを読まずアーキテクチャ要約から推測したことによる事実誤認だった。
</p>
<p>
唯一、記事が正しく指摘し実測でも残るのは<strong>ツールカタログの肥大原則9と評価網羅原則12</strong>である。特に89ツールという規模は「人間が使い分けを即答できる」水準を超えており、重複クラスタの統合が最も費用対効果の高い改善となる。
</p>
<hr style="margin:2em 0; border:none; border-top:1px solid var(--line);">
<p class="note">
トレーサビリティ: 本評価は 2026-07-01 に <code>origin/main</code>(be4e98d7) の全ソースを3チームで横断監査した結果。各判定は該当 <code>file:line</code> を根拠とする。元記事の評価は本番コードへのアクセスなしに書かれており、本書はそれを実測で全面的に置換したもの。<br>
設計と実装の差分: 元記事の「⚠不明」20項目中17項目が「実装済み・適合」と判明。すなわち<strong>設計意図(原則)と実装は大きく乖離しておらず、乖離していたのは記事の推測と実コードの間</strong>だった。
</p>
</body>
</html>