6
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Skillsを50個運用して気づいた — 増やすほど生産性が下がるパラドックス

6
Posted at

はじめに

Claude Code Skillsにハマりました。

最初は1つ、2つ。定型作業を自動化するだけのつもりでした。自作のSkillが半年で20個を超え、さらにsuperpowersやeverything-claude-code等のプラグインを入れた結果、気づけば50個以上のSkillを運用する環境になっていました。

最初は確かに便利でした。「これ、全部Skillにすればいいじゃん」と思っていた時期もあります。しかし30個を超えたあたりから、明らかに様子がおかしくなりました。Skillを使いこなしているはずなのに、作業がスムーズに進まない。何かがおかしいと感じ始めました。

この記事では、Skillsを50個以上運用して実際に起きた問題を整理します。解決策は次回のPart 2に譲り、本記事では「問題提起」に集中します。

本記事はAgent Skillsの基本を理解している方を対象にしています。Skillsの概要や作成方法は「Claude Code Skills 完全活用ガイド 2026」を参照してください。

Skillsが増えるとなぜ問題になるのか

理論の話ではありません。自分が実際に体験した話です。

「どのSkillを使えばいいか分からない」問題

50個もあると、似た目的のSkillが複数存在し始めます。

自分の環境では、トレンド関連だけで3つのSkillがあります。fetch-trends(単発のトレンド収集)、aggregate-trends(8チャンネル並列収集)、daily-topic-ideas(記事ネタ向けのトレンド収集)。それぞれ微妙に用途が違いますが、「最近のAI動向を知りたい」というざっくりした目的のとき、どれを使えばいいか一瞬迷います。

問題は迷う時間の長さではありません。似たSkillが複数あると、「この場面ではどちらが適切か」の判断自体が難しくなります。各Skillの細かな違いを正確に覚えていないと、正しい選択ができません。結果として、fetch-trendsで十分な場面でaggregate-trendsを実行してしまい、8チャンネル並列で走るため完了まで数分待つことになります。Skillの管理が甘いと、こうしたミスが日常的に起きます。

トリガーワードの競合

CLAUDE.mdにトリガーワードを定義していますが、ワードが似ているSkillは意図しない方が発火します。

「トレンドは?」と聞くと、fetch-trendsが動いてほしい場面でaggregate-trendsが起動することがありました。両方のdescriptionに「トレンド」が含まれているため、Claude側の判断が安定しません。結果として、毎回「/fetch-trendsを実行して」とスラッシュコマンドで明示的に指定するようになりました。

自然言語で呼び出せるのがSkillsの魅力だったはずです。しかしSkillが増えるほど、曖昧な指示では正しいSkillが選ばれなくなります。自然言語の利便性が、Skillの数に反比例して失われていきます。これは想定外でした。

Skillの存在を自分が忘れる

笑い話のようですが、本当にあった話です。

ある日、「記事のタイトル案を5パターン出して」と手動で指示を出しました。いつも通りClaudeが考えてくれて、まあまあの結果が返ってきました。翌日、CLAUDE.mdを整理していて気づきました。generate-titlesというSkillがあることに気づきました。タイトル生成に特化したプロンプトと出力フォーマットが定義されていて、手動で指示するよりずっと良い結果が出るSkillです。自分で作ったにもかかわらず、完全に忘れていました。

50個もあると、すべてを把握し続けるのは無理です。特に月に1回しか使わないSkillは、存在自体を忘れます。作ったことすら覚えていないSkillが出てくるのは、さすがに管理が破綻しているサインでした。

サードパーティ製Skillとの混在

問題をさらに複雑にしているのが、自作以外のSkillの存在です。

superpowersやeverything-claude-codeといったプラグインをインストールすると、数十個のSkillが一気に追加されます。マーケットプレイス経由でインストールしたSkillも加わります。自分の環境では、自作とプラグイン経由を合わせて50個以上のSkillが読み込まれています。

こうなると、「このSkillは自分が作ったものか、プラグインで入ったものか」が分からなくなります。似た名前のSkillが自作とサードパーティで重複していることもあります。draft-articleという自作Skillと、プラグインが提供するarticle-writingが共存していて、どちらが発火するか予測できない状態になったこともありました。

.claude/skills/の中身をlsしてみると、見覚えのないSkillが大量にあります。どのプラグインが追加したものか、まだ必要なのか、自作のSkillと競合していないか。これを把握するだけでも一苦労です。

名前規約(自作Skillにプレフィックスをつける等)で整理する手もありますが、後付けで全Skillをリネームするのは影響範囲が大きく、簡単にはいきません。この問題の対処はPart 2で扱います。

増やすほど生産性が下がるパラドックス

Skillの数と生産性の関係を、自分の体感で振り返ります。

Skill 1〜10個: 生産性2倍の体感

最初の10個は劇的でした。朝の工程表作成(morning-planner)、トレンド収集(fetch-trends)、記事の下書き(draft-article)、メモリ保存(save-memo)、Issue登録(auto-issue)。どれも週に何度も繰り返す作業で、Skill化の効果がすぐに実感できました。

定型作業が一発で終わる。出力フォーマットも安定する。「もっと作ろう」と自然に思いました。

Skill 11〜20個: まだ快適

ワークフローの大部分をカバーできた時期です。経理更新、週次レポート、タイトル生成、記事執筆パイプライン、戦略分析。業務のほぼ全領域にSkillが行き渡りました。

この段階ではまだ全Skillを把握できていました。「この作業はこのSkill」という対応が頭に入っていて、迷いもありませんでした。

Skill 21〜30個+プラグイン導入: 管理の手間が見え始める

自作Skillが20個を超えたあたりで、superpowersやeverything-claude-code等のプラグインも導入しました。一気に数十個のSkillが追加され、環境内のSkill総数が30個を超えます。ここから雲行きが変わりました。

まず、Skillの更新忘れが発生しました。MCPサーバーのツール名が変わったのに、それを参照しているSkillを更新していませんでした。エラーが出て初めて気づきます。

次に、似たSkillの乱立が始まりました。自作のSkillとプラグインが提供するSkillで用途が被るケースも出てきます。「この用途のSkillはなかったっけ?」と探すのが面倒で、つい新しく作ってしまいます。結果として、目的が重複するSkillが生まれます。

CLAUDE.mdのトリガーワード定義も肥大化しました。テーブルが長くなり、一覧性が落ちます。新しいSkillを追加するたびに、既存のトリガーワードと競合しないか確認する手間が増えました。

Skill 30〜50個: メンテコストが生産性を食い始める

この段階で、生産性の向上カーブが明らかに鈍化しました。

新しいSkillを1つ追加するたびに、以下の作業が発生します。

  • CLAUDE.mdのトリガーワードテーブルに追記
  • 既存Skillとの競合チェック
  • 依存するMCPサーバーやAPIの動作確認
  • 数週間後の「まだ正しく動いているか」の確認

30個を超えたあたりからは、利用頻度が月1〜2回のニッチなものが多いです。使用頻度が低いSkillほど、壊れていても気づきにくいです。気づいたときには「いつから壊れていたのか」すら分かりません。

体感としては、最初の10個で得た生産性向上の3割くらいを、残り40個のメンテナンスコストで吐き出している感覚です。

これは「Skillsを10個以内に抑えるべき」という話ではありません。問題はSkillの数ではなく、管理の仕組みがないことです。コードが100ファイルあっても、テストとCIがあれば管理できます。Skillsにはそれがないのが根本原因です。

実際に起きた5つのトラブル

ここからは具体的なトラブル事例です。

トラブル1: MCPサーバーの仕様変更で静かに壊れた

Google Workspace系のMCPサーバーがアップデートされ、ツール名が変わりました。google_sheets_readgoogle_sheets_get_valuesに変更されたのです。

sync-accountingスキルはこのツールに依存していました。しかし、エラーメッセージはTool not foundと出るだけで、Skill全体がクラッシュするわけではありません。Claudeは「ツールが見つからなかったので、代替手段で対応します」と、別のアプローチで処理を試みます。

結果、微妙に違うデータが返ってきました。正しいデータに見えますが、取得元のシートが違っていました。気づいたのは2週間後、月次の経理チェックのときです。

この「静かに壊れる」パターンが一番怖いです。エラーで止まってくれるなら気づけます。それっぽい結果を返してくるから見逃します。

トラブル2: Claude Codeのアップデートでhooksが変わった

Claude Code本体のアップデートで、PreToolUse/PostToolUse Hookが渡すfile_pathの形式が変わりました。相対パスが渡されるケースがあった仕様が、絶対パスに統一されました。

自分のHookスクリプトでは、file_pathの先頭が./で始まる前提でパス判定をしていました。絶対パスに変わった結果、条件分岐が常にfalseになり、Hookが何もしなくなりました。

エラーは出ません。ログにも異常はありません。Hookは正常に発火しているけれど、処理がスキップされているだけです。気づいたのは3日後でした。出力ファイルが生成されていないことに違和感を覚え、半日かけて原因を特定しました。

トラブル3: 同じ目的のSkillを2つ作っていた

これは純粋に自分の管理不足です。

記事の下書きを生成するSkillとしてdraft-articleがありました。ある日、「もっとリサーチを深くしてから書くSkillが欲しい」と思い、research-deepを作りました。さらに後日、「記事のネタ出しからやってくれるSkillが欲しい」と思い、idea-generatorを作りました。

ここまでは意図的です。問題は、数ヶ月後にdraft-articleの中身を見返したとき、リサーチ工程を含むように拡張されていたことです。過去の自分がいつの間にか機能を追加していました。結果としてdraft-articleresearch-deep + draft-articleの組み合わせが、ほぼ同じことをする状態になっていました。

Skillが5個なら全体を把握できます。50個になると、各Skillの現在の状態を正確に把握するのは困難です。

トラブル4: チームメンバーがSkillの出力を無検証で使った

自分が作ったSkillを、プロジェクトのメンバーにも共有していました。aggregate-trendsは8チャンネルからトレンドを並列収集するSkillで、毎朝の情報収集に重宝していました。

あるとき、メンバーがaggregate-trendsの出力をそのままクライアント向け資料に転記しました。しかしそのとき、8チャンネルのうち2つがAPIの認証エラーで取得に失敗していました。Skillの出力には6チャンネル分のデータしか含まれていませんでしたが、出力フォーマット上はそれが分かりにくい構造でした。

「Skillが出した結果だから正しいだろう」という信頼が裏目に出たケースです。Skillの出力は「AIが生成したもの」であり、常に検証が必要です。しかし、Skillが安定して動いている期間が長いほど、検証を怠りがちになります。

トラブル5: メンテナンスに週2時間以上かかるようになった

50個のSkillを維持するために、以下の作業が定期的に発生します。

  • Claude Codeアップデート後の動作確認(月2〜3回)
  • MCPサーバーの更新チェック(月1回)
  • CLAUDE.mdのトリガーワード整理(月1回)
  • 壊れたSkillの修正(不定期、月2〜3件)
  • Skillの出力品質チェック(週1回)

積み上げると、週あたり2時間以上です。Skillsで節約している時間が週3〜4時間だとすると、純粋な効果は半減しています。しかもメンテナンス作業自体が退屈で、後回しにしがちです。後回しにすると壊れたSkillが放置され、次に使ったときにトラブルが起きる。悪循環です。

なぜこうなるのか — Skillsの構造的な特性

個別のトラブルを見てきましたが、根本には構造的な原因があります。

Skillsはコードではなくプロンプト

Skillsの実体はMarkdownファイルです。プログラミング言語のコードではありません。そのため、通常のコードのようなユニットテストを書くのが困難です。

コードならassertで期待値を検証できます。Skillsの場合、「期待通りの出力か」の判定自体が曖昧です。LLMの出力は非決定的で、同じ入力でも毎回少しずつ違う結果が返ります。「壊れた」と「出力のバリエーション」の境界が不明瞭です。

依存関係が暗黙的

Skillは内部でMCPサーバーのツールを呼んだり、外部APIにアクセスしたり、他のSkillを参照したりします。しかし、これらの依存関係はSkillのMarkdown内に自然言語で書かれているだけです。

## 手順
1. google_sheets_get_values で経理データを取得
2. 取得したデータを整形
3. output/finance/ に保存

コードならimport文やpackage.jsonで依存関係が明示されます。Skillsにはそれがありません。どのSkillがどのMCPサーバーに依存しているかを把握するには、標準的な方法では一覧化されないため、手動での確認に頼りがちです。

バージョン管理はできるが、検証が難しい

SkillsのファイルはGitで管理できます。変更履歴も追えます。しかし「この変更でSkillが壊れていないか」を自動で検証するファーストクラスの仕組みがまだ整っていません。

コードならgit pushのたびにCIが走り、テストが通るか確認できます。Skillsにはその仕組みがないため、「変更後に手動で動かして確認する」しかありません。50個のSkillを毎回手動確認するのは現実的ではなく、結果として確認を省略しがちになります。

コンテキストの圧迫

Claude Codeのコンテキストは1Mトークンまで拡張され、容量自体が問題になることは少なくなりました。とはいえ、Skill自体がコンテキストを消費する事実は変わりません。

Agent Skills仕様のProgressive Disclosure設計により、セッション開始時には各Skillのnamedescriptionだけが読み込まれます。1つあたり50〜100トークン程度で、70個あっても数千トークンです。1Mの中では微々たるものです。

ただし、タスクに合致したSkillが選ばれるとSKILL.mdの本文全体が読み込まれます。複数のSkillが同時に選択されることもあります。容量としては余裕があっても、Skillの数が多いとLLMの注意(Attention)が分散しやすくなります。無関係なSkillの情報がコンテキストに混ざることで、指示の理解精度が微妙に落ちる可能性があります。

致命的な問題ではありませんが、「不要なSkillは整理しておくに越したことはない」という意識は持っておくべきです。

「正しく動いている」の定義が曖昧

これが最も根深い問題です。

コードのテストでは、入力と期待出力を定義して一致を確認します。Skillsの場合、同じ入力に対して毎回異なる出力が返ります。「トレンドを収集して」の結果は、実行日によって当然変わります。

では何をもって「正しい」とするのか。出力フォーマットが崩れていないこと?必要なセクションが含まれていること?情報源が正しいこと?これらを定義し、自動で検証する仕組みが必要ですが、現時点では標準的な手段が確立されていません。

まとめ — 問題は「Skillsが悪い」ではなく「管理の仕組みがない」

誤解のないように書いておきます。Skillsは間違いなく強力です。自分の業務効率は、Skills導入前と比べて確実に向上しています。

問題は、Skillsの数が増えたときの管理手法が確立されていないことです。

コードには長い歴史の中で培われた管理の仕組みがあります。ユニットテスト、CI/CD、コードレビュー、リンター、依存関係管理。これらがあるから、数百ファイルのプロジェクトでも品質を保てます。

Skillsにはまだそれがありません。Git管理はできますが、テスト・CI・リンターといった仕組みが標準では用意されていません。結果として、Skillの品質は「作った人の記憶力と勤勉さ」に依存します。5個なら記憶力で回せます。50個になると破綻します。

次回のPart 2では、この問題に対する具体的な解決策を共有します。SkillsにCI/テスト/品質管理の仕組みを導入し、50個以上のSkillを安定運用するための設計です。

本記事で挙げた問題に心当たりがある方は、ぜひコメントで「うちではこう対処している」を教えてください。Skillsの管理手法は、コミュニティ全体で知見を共有していくべきフェーズにあると感じています。

6
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?