📖 背景
Claude Code を SaaS 規模の長期プロジェクトで使い続けると、CLAUDE.md に全ルールを書き込む運用はすぐに限界が来る。ファイルが 500 行を超え、毎ターン cache の温度が揺らぎ、Opus 4.7 の 1M context を使っても recall が劣化する(Context Rot)。
この問題に対して、CTS の SaaS 開発プロジェクトでは 7 層にコンテキストを分離する「ハーネスエンジニアリング」 を採用している。本記事では各層の役割と、Opus 4.7 固有機能を CTS がどう運用ルールに落とし込んでいるかを紹介する。
🧱 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. Hooks | scripts/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-reviewer | implementation-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 を自動適用 |
| Stop | fix コミット検出 → 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 つでも該当したら即座に:
- Read / Grep で裏取り(Evidence over Claims)
- 進行中タスクを tasklist.md に書き戻す
- 500K 未満でも
/compactを前倒し - セッション分離(
/resumeで再開)
実運用閾値:
| 消費トークン | アクション |
|---|---|
| 〜200K | 通常運用 |
| 200K〜500K | recall 兆候を監視 |
| 500K〜 | compact 必須 |
| 700K〜 | 新規セッション推奨 |
Adaptive Thinking
Opus 4.7 は Adaptive Thinking のみをサポートし、Manual thinking: {budget_tokens: N} を渡すと 400 エラーで拒否される(Opus 4.6 からの silent breaking change)。また display デフォルトが summarized → omitted に変更されているため、思考内容を表示したい場合は display: "summarized" の明示指定が必要。
自前 API を書く場面での effort 選択基準:
| 場面 | 推奨 effort |
|---|---|
| DDD 設計判断・集約境界検討 | high(default) |
| ステアリング立案・壁打ち | high |
| 単純な lookup | low |
| L 規模 agentic workflow | high or xhigh |
Server-side Compaction との使い分け
Anthropic API の beta 機能 compact-2026-01-12(Context management 公式アナウンス)は、入力 150K トークンを超えると自動で古い履歴を要約する。ローカル /compact との最大の違いは cache への影響:
| 観点 | ローカル /compact | Server-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.6 | Sonnet 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 でキャッシュ miss | 5 分 TTL を意識せず間隔を空けすぎ | 並列起動を 5 分 TTL 内に集約 |
| 単純タスクでも Opus を呼ぶ | sub-agent に model 指定がない | 軽量タスクは Haiku / Sonnet に固定 |
モデルそのものの能力以上に、ハーネスが既存機能を引き出せているかが運用寿命を決める。他モデル(Codex 等)の併用は、OpenAI SDK 固有の挙動調査など特殊タスクに限定すれば十分で、日常の開発運用で標準化する理由にはならない。
🔄 7層が噛み合う瞬間
ある MR 前の検証フローを例に、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.json に deny ブロック明示 |
🏁 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 時代のコンテキストエンジニアリングの本質である。
🔗 参考資料
- Effective context engineering for AI agents — Anthropic 公式の Context Engineering 総論
- Effective harnesses for long-running agents — ハーネス設計の原則
- Managing context on the Claude Developer Platform — Server-side compaction を含む context 管理機能
- Building with extended thinking — Adaptive Thinking 仕様
- Prompt caching — 5 分 TTL / 4 breakpoint の仕様
- Context windows — 1M context と compaction の API ガイド
- Long context prompting tips — 長いコンテキストでの指示順序のベストプラクティス
🔗 関連記事
- ステアリング駆動開発とは:概要 — 本ハーネスを動かす上位概念。シリーズ #1
- Agent Teams 編 — 本記事で扱った Agent 別モデル割当・責務マトリクスの実装詳細(
.claude/agents/*.md定義、チーム構成、マルチエージェント協調)。ステアリング駆動開発シリーズ #8 - Gemini API モデル移行ガイド — モデル世代交代をハーネス側でどう吸収するかの姉妹記事
🔗 関連用語
- Context Rot — 長コンテキスト下で想起精度が劣化する現象
- コンテキストエンジニアリング — 本記事が扱う上位ディシプリン
- ハーネスエンジニアリング — 7 層構造そのもの