問題
Claude Codeを使っていると、スキルAからスキルB(、スキルC、…)を呼ぶ場合、呼ばれたスキル側で終了してしまい、呼び出し元まで返ってこない、ということがそこそこ発生する。
(Claude Codeにおける「スキルフォーク問題」と呼んでもいいかもしれない。)
Codexで同じスキルを使っているとき、このようなことは起こらなかった。
対応方法 = スキルのインライン展開実行
ひとまず、該当スキルを含むプロジェクトの CLAUDE.md に以下のように記述することにした。
## スキルのインライン実行
- スキル(SKILL.md)が別のスキルへの委譲を含む場合、`Skill` ツールでサブスキルを新規起動しない。委譲先の SKILL.md を直接読み込み、その指示を現在の実行フロー内でインラインに従う。
- 複数のサブスキルや後続ステップを含む親スキルでは、各段階が完了しても停止せず、親スキルのすべてのステップが完了するまで継続して実行する。
- ユーザーへの最終報告は、親スキルで定義されたすべての手順が終わってから行う。
これを書いたところ、スキルそのものには手を加えることなく安定して意図した通りに動作するようになった。
原因らしきこと(Claude談)
「なんでそうなるの?」って聞いてみたら、(もううろ覚えだけど)次のようなことを言っていた。
- Claude Codeの中ではスキルの委譲処理を見つけると、デフォルトではそのスキルを直接実行するモードに入る
- このとき、フロントエンドのプロセスも含めてそのスキルに乗っ取られるらしい。言い換えれば、直前のコンテキストを忘れるということか
- …ので、そのスキルが終わったらプロセスも終了し、呼び出し元まで返ってこれなくなるそうな
- 「子プロセスによる親プロセスの乗っ取り」みたいな?