Claude Code機能多すぎ問題
2週間ほど前、会社のブログに「LINE iOSアプリ開発を高速化するClaude Code基盤の設計思想」という記事を書いた。
この記事では、ビルド実行のようなタスクをSubagentに分離し、高度な操作をSkillsで隠蔽する方法を紹介している。
---
name: module-builder
description: Build specific modules for the app
tools: Bash, Read, Grep, Glob
skills: creating-xcode-build-scheme
---
# mobule-builder
しかし、わずかここ数週間ほどの間でcontext: forkという新たなSkillのオプションが導入された*1 。これを使うと、Skill実行をメインContextからフォークした別Contextを持つエージェントに委譲できる。
---
name: building-module
context: fork
---
今まではSkillは全てメインエージェント上で実行されていたが、これにより、Subagent + Skillといった複雑な組み合わせを使わずとも、軽量な操作であればSkill単体で完結できるようになった。実質Subagent。
それに加えて、ContextをフォークしたSkillにもSubagentを指定する手段も提供された。agent:オプション だ。これはforkしたSkillを任意のSubagentで実行できるようにするオプション。
---
name: building-module
context: fork
agent: module-builder
---
すなわち、SkillをSubagent化して実行する方法に、現状3つの手段があることになる。
SubagentからSkillを実行する(skills:)
Skillをフォークしたコンテキストを持つサブエージェントで実行する(context: fork)
Skillを指定したSubagentで実行する(context: fork + agent:)
全部同じじゃないですか!
Subagent + Skill vs context: fork
いちいちSkillとSubagentを別けて作るのは面倒だし、もはや全部context: forkで良いのでは?などと思っていたが、公式ドキュメントにそれっぽい記述があった。
これらの指定の比較。読んでもよくわからない
これを見てみてもいまいちピンとこない。Taskとは?Claude's delegation messageとは?
Skillの分類 - Reference ContentsとTask Contents
これを理解するには、どうやらスキルコンテンツの種類 を知る必要があるようだ。Skillが持つプロンプトは大きくReference ContentsとTask Contentsに大別できる。
Reference Contents は、Agentに現在の作業に適応する知識を渡すタイプのSkill。特定の作業を行う際に、プロンプトが常に読み込まれ知識として利用される。 例えば、コーディング規約やドメイン知識、スタイルガイドといった、常に知っておくべき知識が該当する。
一方でTask Contents は、Agentに特定の作業手順を実行させるタイプのSkill。「PRを開く」とか、「特定のコードを生成する」と言った能動的に実行するタスクリストがこちらに当たり、最近Skillに統合された 従来のCustom Slash Commandsはこちらに分類される。
これは、ゲームにおけるパッシブスキルとアクティブスキルのようなもの だと考えると理解しやすい。
Subagentが主か、Skillが主か
このSkillの分類を理解すると、それぞれの指定の意味が見えてくる。要はSubagentとSkillのどちらを主体に据えるかという点だ。
従来のSubagentへのskill:指定は、Subagentの中にSkillの知識を展開する という挙動になる。すなわち、Reference Contentsを持ったSkillを隔離されたContextに展開し、その中で作業をさせるイメージ。
このとき、実行する操作は、SKILL.mdではなく、サブエージェントを立ち上げる際にメインエージェントから渡されるプロンプトに従うことになる。そのため、Task Contentsの実行には向かないかもしれない*2 。上記の表にある"Claude's delegation message"はこのような挙動を指しているのだろう。
一方で、Skillへのcontext: forkの指定は、Skillの実行をメインエージェントから分離する ために使う。Skillから新しいサブエージェントを立ち上げるという挙動になるため、逆にSkillが主となる。
上述のドキュメントにはcontext: forkでは、Reference Contentsは上手く動作しないと警告されている 。Task Contentsを持つSkillにのみ適応するのが無難そうだ。
agent:の指定
agent:オプションは、Skillからサブエージェントを立ち上げる際に、そのSubagentを指定するためのオプションだ。利用例 によると、サブエージェントの利用するモデルやパーミッションを細かく切り替えたい場合に使うようだが、ほとんどの場合は組み込みSubagent (Explore, Plan, general-purpose)で十分な気がする。
ここのSubagentに与えたプロンプトは、上記の表によるとシステムプロンプトと同格の扱いになるようだが、Skillの方に書く場合とどれぐらいの違いがあるかはよくわからなかった。
context: forkはTask Contentsにのみ使う
現状の使い分けとしては、Reference ContentsはSubagent + Skillを使い、Task Contentsはcontext: forkも選択肢に入る 、という理解であっていそう。
これまでの話を表にざっくりまとめると以下のようになる。
Subagent + Skill
context: fork
context: fork + agent:
Contextの引き継ぎ
新しいContextが生成される
メインContextがフォークされる
メインContextがフォークされる
システムプロンプト
SubagentのMarkdown
組み込みAgentのSystem Prompt
SubagentのMarkdown
実行するタスク
元請けのメインエージェントが決める
SKILL.md内で定義された内容
SKILL.md内で定義された内容
追加で読み込まれるプロンプト
SKILL.md + CLAUDE.md
CLAUDE.md
CLAUDE.md + SubagentのMarkdown
向いている用途
Reference Contents。Subagentの中でルールに従って処理をさせる
Task Contents。明確なTaskリストをSubagentで実行させる
Task Contents。Subagentの挙動をさらに細かくカスタムしたい場合
これであってるかな?
最初の記事に戻ると、現在ではビルドのようなタスクはTask Contentsと言えるので、context: forkで十分で、「ビルド設定ファイルの編集」のような知識を伴う操作はSubagent + Skillで実装するのが良さそうだ。この場を借りてお詫びして訂正いたします*3 。
ほぼ日刊Claude Code
本記事は、1/27現在の最新版、2.1.20時点での情報を元にしている。
Claude Codeのアップデートは比喩ではなく日々配信されていて、もはや日刊Claude Codeの様相を呈している。数日で環境がコロコロ変わるし、キャッチアップが追いつかない!
今回の記事の内容はあまり日本語の情報を見かけたことがないので調べて役立ったし、Skillの実装やレビューも感覚でやっていたので、ちゃんとした論拠ができて良かった。公式ドキュメントはちゃんと読むものだなあ。