CTS-KB
AI駆動開発

Claude Code 7層ハーネスエンジニアリング:Opus 4.7 新機能の最適化

⏱ 約 13 分で読めます
#Claude Code #Opus 4.7 #ハーネスエンジニアリング #コンテキストエンジニアリング #Context Rot #Prompt Caching #AI Agent #プロンプト設計

📖 背景

Claude Code を SaaS 規模の長期プロジェクトで使い続けると、CLAUDE.md に全ルールを書き込む運用はすぐに限界が来る。ファイルが 500 行を超え、毎ターン cache の温度が揺らぎ、Opus 4.7 の 1M context を使っても recall が劣化する(Context Rot)。

この問題に対して、CTS の SaaS 開発プロジェクトでは 7 層にコンテキストを分離する「ハーネスエンジニアリング を採用している。本記事では各層の役割と、Opus 4.7 固有機能を CTS がどう運用ルールに落とし込んでいるかを紹介する。

🧱 7層の全体像

Claude Code ハーネスエンジニアリングの 7 層スタック構成図(責務分離)

配置役割ロード契機
1. CLAUDE.mdプロジェクトルート必須ルール・禁止事項・全体コンテキスト常時
2. Skills.claude/skills/*/SKILL.md領域別ワークフロー・ドメインルールpaths: / triggers: で条件発火
3. Agents.claude/agents/*.md専門特化サブエージェントTask ツール呼び出し時
4. Settings.claude/settings.json権限(allow/deny)・hooks 定義常時
5. Hooksscripts/hooks/*.shイベント駆動の自動ゲートSessionStart / UserPromptSubmit / PreToolUse / PostToolUse / Stop
6. Memory.claude/agent-memory/ + .serena/memories/セッション跨ぎの学習永続化Agent 呼び出し・/resume
7. Steering.steering/YYYYMMDD-*/タスク単位の詳細仕様・進捗 SSoT/steering 系コマンドで参照

この7層には明確な責務分離の原則がある。「常時ロード」に載るのは第1層と第4層のみ、それ以外はすべて条件付き遅延ロード。これが 1M context 時代でもコンテキストを「細く長く」保つための核心だ。

🎯 層ごとの設計意図

第1層: CLAUDE.md — 「やらないこと」の集約

CLAUDE.md は全ターンで暗黙的に読まれるため、肥大化すると cache prefix が揺れて全無効化を招く。そこでプロジェクトでは 10 個の必須ルール(禁止事項中心) に絞り、詳細は Skills に委譲する構造にした。

## STOP: 必須ルール(10個)
1. main への直接 Push 禁止
2. Push と MR 作成は同時に実行
# 以下 8 項目(抜粋)

“STOP:” プレフィックスを統一してモデルの注意を引き、記述密度を上げている。

第2層: Skills — paths: frontmatter で条件発火

Skills は paths: frontmatter でロード条件を宣言する。

---
name: dotnet-development
description: .NET バックエンド開発ルール
paths: "dotnet/**/*.{cs,json}"
---

これによって dotnet/ 配下を編集するターンでのみ .NET ルールがロードされ、frontend 作業中は cache を汚染しない。Opus 4.7 の 1M context でも、attention budget は有限という前提に立つと、不要な層のロードは常に害。

第3層: Agents — 責務マトリクスで並列化

サブエージェントは単なる「別タスク」ではなく、観点重複を設計的に排除して並列起動する対象として扱う。例えばコードレビューは 2 エージェントに分割:

観点code-reviewerimplementation-validator
TDD 準拠
DDD 設計逸脱
コーディング規約
エラーハンドリング
テスト網羅性
実装完全性(TODO/stub 検出)

責務マトリクスが明示されているため、並列起動しても出力が被らない。wall-clock が約半分になる。

第4層: Settings — deny で破壊的操作を宣言的に禁止

allow だけで運用するケースが多いが、実運用では deny も必須。

"deny": [
  "Bash(rm -rf /*)",
  "Bash(git push --force*)",
  "Bash(git reset --hard*)",
  "Bash(dropdb:*)",
  "Bash(terraform destroy*)"
]

Hooks でも branch-guard は実装しているが、宣言的 deny の方が後から読んだ人間が監査しやすい

第5層: Hooks — 自動ゲートの主戦場

このプロジェクトで特に効いているのが 5 種のフック。

フック用途
SessionStartステアリング自動ロード・ファイル監視起動
UserPromptSubmit「確認」「再確認」キーワード検知で Evidence over Claims 原則を強制
PreToolUse Bash(git push*)main への直接 push を decision: block で拒否
PostToolUse Edit.cs → dotnet format、.ts → prettier、.py → ruff を自動適用
Stopfix コミット検出 → Serena memory 追記提案、未コミット警告

UserPromptSubmit の evidence-gate は特に効く。「先ほどの設計を思い出して」とユーザーが打った瞬間、hook がキーワードを検知して「記憶ではなくツール実行で裏取りせよ」という system メッセージを注入する。Claude 自身の confidence を運用側が外部から押し下げる設計。

第6層: Memory — 失敗事例の永続化

エージェントごとの学習は .claude/agent-memory/<agent-name>/ に、プロジェクト全体の学習は .serena/memories/ に分けて永続化する。特に doc-reviewer の memory には「どのドキュメントで過去どんな指摘が出たか」が蓄積されており、レビュー再実行時の精度が上がる。

第7層: Steering — タスク単位の SSoT

対話の状態をすべて .steering/YYYYMMDD-<title>/ に書き戻す。requirements.md / design.md / tasklist.md / decision.md の4点セットで、セッションが切れても文脈を復元可能。これが Context Rot 対策の最後の砦でもある。

🚀 Opus 4.7 新機能への対応

1M context と Context Rot

Opus 4.7 は 1M context を持つが、Anthropic 公式の Context engineering ガイドも「attention budget は有限」「トークン上限まで使い切ることは非推奨」としている(Context windows ドキュメントも同様)。プロジェクトでは 兆候ベースの Context Rot 検知 を採用した。

兆候チェックリスト:

  • 直前の指示を忘れる・反復を求められる
  • Read 済みファイルの内容を誤引用する
  • tasklist.md の項番を取り違える
  • 「先ほどの〜」の参照先が不正確

1 つでも該当したら即座に:

  1. Read / Grep で裏取り(Evidence over Claims)
  2. 進行中タスクを tasklist.md に書き戻す
  3. 500K 未満でも /compact を前倒し
  4. セッション分離(/resume で再開)

実運用閾値:

消費トークンアクション
〜200K通常運用
200K〜500Krecall 兆候を監視
500K〜compact 必須
700K〜新規セッション推奨

Adaptive Thinking

Opus 4.7 は Adaptive Thinking のみをサポートし、Manual thinking: {budget_tokens: N} を渡すと 400 エラーで拒否される(Opus 4.6 からの silent breaking change)。また display デフォルトが summarizedomitted に変更されているため、思考内容を表示したい場合は display: "summarized" の明示指定が必要。

自前 API を書く場面での effort 選択基準:

場面推奨 effort
DDD 設計判断・集約境界検討high(default)
ステアリング立案・壁打ちhigh
単純な lookuplow
L 規模 agentic workflowhigh or xhigh

Server-side Compaction との使い分け

Anthropic API の beta 機能 compact-2026-01-12Context management 公式アナウンス)は、入力 150K トークンを超えると自動で古い履歴を要約する。ローカル /compact との最大の違いは cache への影響:

観点ローカル /compactServer-side compaction
cache 影響全 cache 無効化(再構築)system/tool 定義 cache は保持
発火手動 + Claude Code 自動入力 > trigger で自動
コスト計上内包usage.iterations に明示

運用上は Claude Code CLI ではローカル /compact を SSoT とし、自作 API 実装時のみ server-side を opt-in する。

Prompt Caching の 5 分 TTL 意識

一言でいえば 「サブエージェントはまとめて一気に呼べ」。背景には Prompt Caching の 5 分 TTL というコスト構造がある。

なぜ同時発射か — API コスト構造

Claude Code は内部で Anthropic API の cache_control ブロックを自動設定している。CLAUDE.md / Skills / Agents 定義はキャッシュブロックとして保存され、5 分以内に再利用すれば読み込みコストが基本入力の 1/10(90% 割引) になる。

種別コスト (基本入力比)補足
通常入力1.0 倍毎回フル課金
キャッシュ書き込み (TTL 5 分)1.25 倍初回のみ 25% 割増
キャッシュ書き込み (TTL 1 時間)2.0 倍長時間運用時の opt-in
キャッシュ読み込み0.1 倍2 回目以降は劇的割引

計算上、2.5 回ヒットすれば書き込み時の割増分を回収できる。CLAUDE.md + Skills + Agents 定義で軽く 30K tokens を使う運用では、cache hit 率の差が請求額に直結する。最小キャッシュサイズは Opus 4.7 で 4,096 tokens、Sonnet / Haiku で 1,024 tokens(これ以下の短いプレフィックスはキャッシュされない)。

バラバラ起動 vs まとめ起動

❌ バラバラ起動(cache 切れの連鎖)
  10:00  code-reviewer 起動   → cache 新規作成(1.25 倍)
  10:08  test-runner 起動     → 5 分超過で expired → また 1.25 倍
  10:20  doc-reviewer 起動    → また expired → また 1.25 倍
  書き込み × 3 回、cache hit ゼロ

✅ まとめ起動(同じメッセージ内で並列発射)
  10:00  code-reviewer + test-runner + doc-reviewer  同時
  書き込み × 1 回、残り 2 つは cache hit(0.1 倍)

副次的に wall-clock も 1/2 〜 1/3 に短縮し、モデルの attention も同じ文脈で揃うため判断の一貫性が上がる。

運用ルール(cache を壊す典型パターン)

パターン影響
会話冒頭に「現在時刻 YYYY-MM-DD HH:MM」を貼るcache prefix が毎ターン変わり全無効化
並列できるサブエージェントをシリアルに起動cache hit 機会を逃し書き込みが積み重なる
サブエージェントを 30 分空けて起動5 分 TTL 切れで毎回 cache miss
/compact 直後に Agent を連続起動書き込みコスト × 起動回数

300 秒ルール — ScheduleWakeup の delay 選択

300 秒(5 分ちょうど)はワーストオブボース。TTL 境界に乗るため cache miss が確定しやすく、かつその miss を償却できる長さでもない。取るべきは 270 秒(cache 温存)1200 秒以上(cache を諦めて長く待つ) の二択。

# ✅ cache 温存(4 分 30 秒で戻る)
ScheduleWakeup(delaySeconds=270, reason="bun build ~8min wait, cache warm")

# ✅ cache 諦めて長く休む
ScheduleWakeup(delaySeconds=1200, reason="CI deploy 20min wait")

# ❌ 最悪パターン(cache miss 確定、しかも償却されない)
ScheduleWakeup(delaySeconds=300, reason="wait 5 min")

Cache の仕組みが CLI では、あまり知られていない

Claude Code CLI を使う限り、cache は完全に裏方で、ユーザーが cache_control ブロックを直接意識する設計にはなっていない。ところが起動タイミングと指示順序で cache hit 率は 10% ~ 80% の差が出る。API 従量課金や Max プランの上限到達時に、請求書やレート制限として初めて表に出てくるため、平時は気付きにくい構造である。Anthropic SDK を直接叩く実装では cache_control / cache_creation_input_tokens / cache_read_input_tokens が API レスポンスに露出するため、そちらを触って初めて挙動が腹落ちするケースも多い。

CTS の 7 層ハーネスでは、この「裏方のコスト構造」を Claude Code 運用者が起動タイミングと指示順序で最適化できる運用ルールに翻訳している。TTL 5 分という API 側の制約があるからこそ、「サブエージェントはまとめて起動」「300 秒 delay を避ける」といった具体的なルールが導出される。

💰 モデル割り当てとコストパフォーマンス

Claude Code は Agent 単位でモデルを指定できる(agent frontmatter の model: opus | sonnet | haiku)。これを第 3 層の責務マトリクスと組み合わせることで、重い Opus を常時呼ばず、検証・整形系は Sonnet、軽量処理は Haiku に振り分けられる。

CTS での Agent 別モデル割当

Agent役割モデル選定理由
plan-architectステアリング立案・壁打ちOpus 4.7 (Adaptive high)要件分解は深い推論が必要
code-reviewer設計・TDD/DDD 準拠判断Sonnet 4.6Sonnet 4.6 は Opus 4.5 相当の判断力で、レビューでは精度と速度のバランスが最適
implementation-validator規約・エラーハンドリング検査Sonnet 4.6パターン照合中心、Sonnet で十分な精度
test-runner × 3 layer単体 / 統合 / E2E 実行と整形Sonnet 4.6実行結果の整形が主、高速性を優先
doc-reviewerドキュメント整合性・差分検査Sonnet 4.6用語・依存関係・NG 表現の照合は文脈理解が必要で、Sonnet が適材
daily-reporter / doc-updater / pr-creator / context-preparer構造化タスク・定型整形Haiku 4.5定型処理は Haiku で十分、コストを抑制

重い Opus の出番は Phase 境界・計画立案に限定、日常のレビュー / 実装ループは Sonnet、構造化整形は Haiku が主役。これだけで Opus 呼び出し回数は体感 1/3 以下になる。

各 Agent の agents/*.md 定義(フロントマターでの model 指定、責務マトリクス、チーム構成、マルチエージェント協調)の実装詳細は、Agent Teams 編で扱う(ステアリング駆動開発シリーズ #8)。

実運用コスト感

この割当で SaaS 規模の EC プロジェクトを毎日フル稼働で運用しても、Claude Max 20x プランの利用制限に到達した月は一度もない。ハーネスがモデルを適切に振り分けるため、常時運用でも枠に収まる。

「Claude Code はすぐ制限、Codex 併用を」論との距離

巷では「Claude Code はすぐ利用制限に引っかかる」「Codex(OpenAI)を併用すべき」という言説も見られる。CTS の運用実感では、これは Claude Code そのものの限界ではなく、ハーネス設計が不足しているケースがほとんどである。

よくある症状典型的な原因本ハーネスでの対策
利用制限に頻繁に到達全 Agent を Opus 固定で呼び出しているAgent ごとに model を使い分け(上表)
長セッションで応答劣化compact せず Context Rot 放置Phase 境界で /compact、500K で強制圧縮
並列 Agent でキャッシュ miss5 分 TTL を意識せず間隔を空けすぎ並列起動を 5 分 TTL 内に集約
単純タスクでも Opus を呼ぶsub-agent に model 指定がない軽量タスクは Haiku / Sonnet に固定

モデルそのものの能力以上に、ハーネスが既存機能を引き出せているかが運用寿命を決める。他モデル(Codex 等)の併用は、OpenAI SDK 固有の挙動調査など特殊タスクに限定すれば十分で、日常の開発運用で標準化する理由にはならない。

🔄 7層が噛み合う瞬間

ある MR 前の検証フローを例に、7層がどう連動するか示す。

Claude Code の /pre-push コマンドにおける 7 層ハーネス連動フロー図

① ユーザー: /pre-push

② Hook (PreToolUse) → push-readiness スタンプを確認
③ Skill (steering/common) → tasklist.md の未完了確認
④ Agent 並列起動(5分 TTL 内)
   ├─ code-reviewer            (Sonnet 4.6)
   ├─ implementation-validator (Sonnet 4.6)
   └─ test-runner × 3 layer    (Sonnet 4.6)
⑤ Memory (agent-memory/*) → 過去の指摘パターンを参照
⑥ Settings.deny → 万一の git push --force を宣言的にブロック
⑦ Steering (tasklist.md) → 結果を書き戻して永続化

並列起動は cache 温存を前提に 5 分 TTL 内に集約、責務マトリクスで観点重複を排除、Memory で過去のミスを学習済み、という設計が揃って初めて Opus 4.7 の 1M context を「細く長く」使える。

⚠️ 失敗例から学んだこと

実際に運用して判明した落とし穴:

事例原因対策
長セッションで毎ターン日付を注入 → cache hit 率ほぼ 0揮発情報を会話冒頭に置いた時刻・進捗は会話末尾・TodoWrite に限定
ステアリング完了後に compact せずに次タスクへPhase 移行で不要コンテキスト持越しstrategic-compact Skill で Phase 境界圧縮を自動提案
サブエージェントが「相手領域」を指摘責務マトリクス違反Agent 定義で観点を明示的に除外
main への force push 事故allow 任せで deny 未定義settings.jsondeny ブロック明示

🏁 7層ハーネスの完成度

本 7 層ハーネスは、Anthropic が 2026 年までに公開した最新のコンテキスト制御機能をすべて運用レイヤーに取り込んでいる

Anthropic 公式機能7 層ハーネスでの吸収先
Adaptive Thinking第 3 層 Agents — effort マトリクスで役割別に割当
Server-side Compaction第 5 層 Hooks + 第 7 層 Steering — Phase 境界圧縮
Context Rot / 1M context第 1 層 CLAUDE.md + 第 7 層 Steering — 兆候ゲート
Prompt Caching第 2 層 Skills + 第 4 層 Settings — cache prefix 設計
Effective harnesses for long-running agents全 7 層の責務分離そのもの

つまり本ハーネスは「Opus 4.7 の新機能に後追いで対応した構成」ではなく、Anthropic が公開しているハーネスエンジニアリングの原則を、SaaS 規模のプロジェクトで運用可能な形に具体化したリファレンス実装である。モデル側の仕様変更(Opus 4.8 以降)が来た場合も、該当する層のみを差し替えれば追随できる。

✅ まとめ

  • CLAUDE.md / Skills / Agents / Settings / Hooks / Memory / Steering の 7 層で責務を分離
  • 常時ロードは最小限(第1層・第4層のみ)、他は条件発火で attention budget を節約
  • Opus 4.7 の Adaptive Thinking・Server-side Compaction・1M context は「機能として知っている」では不十分。運用ルールに落とし込んで初めて使える
  • Context Rot は兆候ベースで検知、数値閾値だけに頼らない
  • Prompt Cache は運用側の指示順序で温度を保つ(5 分 TTL を跨がない / 300 秒 delay を避ける)

Claude Code の真価は、モデル単体の能力ではなく モデルとハーネスを一緒に設計すること で初めて引き出せる。1M context を「使い切る」のではなく「細く長く保つ」設計が、Opus 4.7 時代のコンテキストエンジニアリングの本質である。

🔗 参考資料

🔗 関連記事

🔗 関連用語