😊

Claude Codeでauto-compactが発生するまでにタスク完了を目指す

に公開

この記事は、GENDA Advent Calendar 2025 シリーズ1 Day17 の記事です。

https://qiita.com/advent-calendar/2025/genda

はじめに

GENDAでモバイルエンジニアをしているsatorunです。

Claude Codeを使っていると、セッションが長くなるにつれてauto-compactが発生し、作業が中断されることがあります。この記事では、その解決策として作業を積極的にサブエージェントに委譲するアプローチを紹介します。

具体的には、スキルを中心とした仕組みを構築してみました。プラグインとして公開していますので、ご参照ください。

https://github.com/satorun/claude-plugin/tree/20251217

それでは、背景から順を追って説明していきます。

背景

私はiOSなどのネイティブアプリ開発においてClaude Codeを利用しており、最近はコーディングのほとんどを任せています。日々の開発では、設計や実装を依頼し、Claudeの出力にフィードバックしたり追加の調査を依頼したりと、会話しながらタスクを進めています。

しかし、そうしたやりとりを続けているとコンテキストをすぐに消費し、auto-compactが発生します。待ち時間による中断や、compact後に文脈を見失うこともあり、ストレスを感じていました。

そのためタスクを細かく分解して、1セッションでの開発規模を小さく保つようにしています。また、明示的にサブエージェントで作業を行うことでコンテキストの消費を抑えています。最近ではClaudeが自動でサブエージェントを利用してくれることも増えました。

これをさらに進めて、実態のある作業を可能な限りサブエージェントに任せることで、Claudeとの会話をより長く続けられるようにしたいというのが今回のモチベーションです。

基本方針

Claudeとの会話をより長く続けるため、実態のある作業をサブエージェントに委譲し、メインセッションでは全体の管理とコミュニケーションにコンテキストを使うことを目指します。

サブエージェントの活用

サブエージェントは、メインセッションとは独立したコンテキストで動作する専門のAIアシスタントです。タスクを委譲し結果だけを受け取ることで、メインセッションのコンテキストを節約できます。

独自のサブエージェントを定義することもできますが、タスクの種類ごとに定義するのは大変なので、今回は組み込みのものを利用します。今後は専門のサブエージェントを定義することで、個別タスクの精度向上や、自動利用されやすくなることが期待できそうです。

スキルによる実装

機能の中核はスキルを利用して実装します。スキルはSKILL.mdを中心としたフォルダで構成され、Claudeの機能を拡張する仕組みです。スクリプトやテンプレートなどのサポートファイルも含めることができ、構造的に定義できます。

スキルの特徴の一つは、Claudeがコンテキストに基づいて自律的に起動タイミングを判断する点です。SKILL.mddescriptionに利用シチュエーションを記載しておくと、条件が合致するタイミングで自動的に起動します。今回の仕組みでは、自然な会話の中でサブエージェントへの委譲が行われることを期待しました。

実装

実際に作成したスキル群の全体構成は以下のとおりです。なお、これらのスキルもすべてClaudeにより実装しています。

skills/
├── orchestrating-tasks/
│   ├── SKILL.md
│   └── reference/
│       ├── workflow.md
│       ├── best-practices.md
│       └── ...
├── building-task-prompts/
│   ├── SKILL.md
│   └── templates/
│       ├── research-web.md
│       ├── implement.md
│       └── ...
└── analyzing-session-patterns/
    ├── SKILL.md
    └── reference/
        ├── workflow.md
        ├── examples.md
        └── ...

各スキルはSKILL.mdを中心としたフォルダで定義します。reference/templates/にはワークフローの詳細やテンプレートなどを配置し、SKILL.mdから参照する構成です。

SKILL.mdの冒頭にはYAMLフロントマターでスキルの名前や自動起動の条件を記述します。以下はorchestrating-tasksスキルの例です。

---
name: orchestrating-tasks
description: 作業指示(調べて/探して/実装して/ビルドして/テストして/レビューして)や承認(やって/進めて/OK)でサブエージェントに委譲。コンテキスト効率化。
allowed-tools:
  - Task
  - Skill
  - Read
  - Write
---

各スキルについての概要は以下の通りです。詳細は各リンク先のSKILL.mdを参照してください。

orchestrating-tasks

ユーザーの指示から、サブエージェントへのタスクの委譲方法を決めて実行するためのスキルです。並列実行の判断や、次のbuilding-task-promptsスキルを利用したプロンプト生成も担います。

building-task-prompts

サブエージェントに渡すプロンプトを生成するスキルです。このスキルにより、多少曖昧な指示でも具体的な指示に変換してタスクの実施精度を高めることができます。タスクタイプ別のテンプレートを用意しており、結果のフォーマットも含めることで、メインセッションに返す情報を簡潔にまとめられるようにしています。

analyzing-session-patterns

セッション全体を振り返り、スキルの使用状況と改善点を分析するスキルです。このスキルは今回の仕組み自体を改善するために用意しました。auto-compact発生前にタスクを完了できれば、セッション全体のログが残っているため、より精度の高い振り返りができると考えました。

課題と改善

上記の実装で基本的な機能は実現できたので、実際に使ってみました。期待していたのは、「〜を実装して」「〜を調査して」といった指示を出すと、orchestrating-tasksスキルが自動で発動し、サブエージェントへの委譲が自然に行われることでした。

しかし実際には、orchestrating-tasksスキルの発動率が低く、期待どおりには動きませんでした。「実装して」「調査して」など具体的なトリガーワードをdescriptionに含めてみましたが、改善しませんでした。

原因として2点考えられます。1つ目は、スキルがメタ的な性質を持っていることです。Anthropicの公式ブログでは、スキルについて以下のように説明されています。

Skills extend Claude's capabilities by packaging your expertise into composable resources for Claude, transforming general-purpose agents into specialized agents that fit your needs.
(スキルは、あなたの専門知識をClaudeの構成可能なリソースとしてパッケージ化し、汎用エージェントをニーズに合った専門エージェントに変換します。)

つまりスキルは本来、具体的な手続き的知識をパッケージ化するものです。しかし今回のorchestrating-tasksは「他のタスクをどう委譲するか」を決めるメタ的なスキルであり、この目的からやや外れています。

2つ目は、descriptionの対象範囲が広いことです。「実装して」「調査して」などあらゆる作業指示を対象としているため、発動タイミングの判断が曖昧になりやすかったと考えられます。

自動発動についてはモデル判断のため、今後のアップデートの中でうまく発動できるようになることを期待しつつ、改善を図ります。

スラッシュコマンドによる改善

スキルが自動発動しないという課題に対して、スラッシュコマンドを併用することで改善しました。

スラッシュコマンドは、よく使うプロンプトをMarkdownファイルとして定義し、明示的に呼び出せる機能です。スキルがコンテキストに基づいて自動的に発動するのに対し、スラッシュコマンドはユーザーが/command-nameの形式で直接呼び出します。

各スキル用にスラッシュコマンドを用意し、コマンドの中でスキルを利用するよう指示を記述しました。スキルの利用はあくまでモデル判断ですが、明示的に指示することでスキルを読み取って問題なく機能するようです。

以下はorchestrating-tasksスキルを利用するための/orchestrateコマンドです。

---
description: 開発タスクのオーケストレーション(調査、実装、テスト等)
---

タスク: $ARGUMENTS

**orchestrating-tasks Skillを使用して実行してください。**

/orchestrateは並列実行の判断なども含めた包括的なオーケストレーションを行いますが、シンプルに1つのタスクをサブエージェントへ委譲したいケースも多くありました。そのため、明示的にサブエージェントを起動する/taskコマンドも用意しました。コマンド内でbuilding-task-promptsスキルも利用しています。

---
description: サブエージェントで直接タスクを実行(building-task-prompts活用)
---

タスク: $ARGUMENTS

**以下の手順で即座に実行してください:**

1. **building-task-prompts Skill** を使用して、上記のタスクから効果的なプロンプトを生成
2. 生成したプロンプトを使って **Task tool** でサブエージェントを起動
3. **TaskOutput** で結果を取得し、ユーザーに報告

**実行方針:**
- オーケストレーションなし(承認不要、即座に実行)
- サブエージェントに完全に委譲
- 詳細は `.claude/tmp/` に保存し、サマリーのみ報告

また、analyzing-session-patternsスキルを利用する/retrospectiveコマンドも用意しています。セッションの振り返りは「このセッションを振り返って」などの指示で比較的発動しやすいですが、振り返りを行いたいタイミングではコンテキストが逼迫していることも多く、より確実に実行するためのコマンドとして用意しました。

---
description: セッションの振り返りと改善点の分析
---

**analyzing-session-patterns Skillを使用してセッションを振り返り、改善点を分析してください。**

改善の効果

スラッシュコマンドを併用することで、毎回コマンドを入力するという手間は増えたものの、期待通りに動作するケースが増えました。

なお、最初からスラッシュコマンドで実装する方法もあると思います。より確実に動作させたいなら、こちらの方が正攻法でシンプルです。

ただ今回は「こういう指示もスキルとして捉えられるのでは」という発想からスタートしたこともあり、スキルを試してみたいという思いがありました。スキルには今後の自動発動への期待や、構造的に定義でき拡張が容易という利点もあるため、この構成を維持しています。

おわりに

今回はClaudeとの会話をより長く続けるために、作業をサブエージェントに委譲する仕組みを構築しました。実装にはスキルとスラッシュコマンドを組み合わせています。自動発動の課題からスラッシュコマンドとの併用になりましたが、当初の目的であるauto-compact前にタスクを完了できるケースが大幅に増えました。

コマンド入力の手間など課題は残っていますが、独自のサブエージェントの定義など改善の余地はまだまだ多いので、試行錯誤を続けていきたいと思います。コンテキストを節約するための取り組みの一例として、少しでも参考になれば幸いです。

参考

https://www.claude.com/blog/skills-explained
https://www.claude.com/blog/building-skills-for-claude-code
https://www.claude.com/blog/how-to-create-skills-key-steps-limitations-and-examples
https://zenn.dev/mizchi/articles/claude-code-orchestrator

GENDA

Discussion