はじめに
AIエージェントにある程度まとまった機能を実装させると、次のような経験をした人は多いはずです。
- 要件の曖昧な部分をAIが勝手に解釈して、想定と違うものができあがる
- テストは通っているが、実装とテストが同じ誤解を共有していて意味がない
- コードは動くが、浅いモジュールや細切れの関数が増えて設計が劣化していく
TypeScript界隈で知られるMatt Pocock氏が公開しているAIエージェント用のSkill集 mattpocock/skills は、これらを「モデルの性能問題」ではなくワークフローの設計問題として扱っています。Skillは手順を書いたMarkdownで、Claude Codeでは/名前で呼び出します。本記事では、このSkill集の考え方と使い方を紹介し、Claude Code + GitLabの環境で実際の業務の改修を一周して分かったことを共有します。
結論から言うと、要点は3つです。
- 開発を一括でAIに任せるのではなく、判断点ごとに小さな手順(Skill)を差し込み、人間の承認を挟む
- 流れは「設計を詰める → 仕様に固定する → 小さく分割する → TDDで実装する → 仕様適合とコード品質を別々にレビューする」
- 一番効いたのは実装の前半、曖昧さと矛盾を実装前に見つける部分だった
対象読者は、Claude CodeなどのAIコーディングエージェントを日常的に使っている(使い始めた)エンジニアです。内容は2026年10月15日に、READMEの手順(Claude Codeの公式marketplace)で入るv1.2.3で確認しました。開発の活発なOSSなので、最新は公式READMEを正としてください。たとえばGitHubのmainは公式marketplaceの版より先に進んでいて、v1.3系ではCONTEXT.mdがGLOSSARY.mdに改名されています。公式marketplaceの版が更新されれば、本記事のCONTEXT.mdはGLOSSARY.mdに読み替えてください。
READMEをすでに読んだ方は、「使いどころ」から読んでも構いません。
設計思想
4つの原則にまとめられます。
- 小さく組み合わせられる: 質問・仕様化・チケット分割・TDD・レビューを、独立したSkillに分けている
- 人間は意思決定、AIは調査と実行: コードを読めば分かる事実はAIが調べ、要件やトレードオフの判断だけを人間に確認する
- 成果物を残す: 用語は
CONTEXT.md、覆しにくい設計判断はADR(Architecture Decision Record: 設計判断とその理由を残す短い記録)、実装内容はspecとticketに残す - 深いモジュール: 小さなインターフェースの背後に多くの複雑さを隠すモジュール(John Ousterhout『A Philosophy of Software Design』の用語)の境界をテストの面にして、AIがコード量だけを増やして設計を劣化させるのを防ぐ
全体フロー

四角がAIの進めるステップ、黄色のひし形が人間の承認ゲートです。AIは各ゲートで合意を取るまで先へ進みません。「判断点ごとに小さな手順を差し込む」という設計思想が、このゲートの配置にそのまま表れています。最初のsetupはリポジトリごとに一度だけ行う準備で、後半の実践で扱います。
以下、各ステップで何をしているかと、どこに工夫があるかを見ていきます。
1. grill: 曖昧さを実装前に潰す
grill-with-docsは、曖昧なアイデアを問い詰めて明確にするSkillです。「誰が何のために使うのか」「異常系をどう扱うか」「後方互換性は必要か」といった判断を、依存関係の木として扱います。前提がすでに決まっていて今すぐ答えられる質問だけを、番号と推奨の答えを付けて1ラウンドにまとめて聞き、答えが出たら次のラウンドに進みます。
役割分担も徹底されています。コードベースを調べれば分かることは、AIがサブエージェント(本体とは別のコンテキストで動く子エージェント)に調べさせ、その結果を待たずに答えられる質問は先に進めます。人間には製品要件やトレードオフの判断だけを聞きます。
回答は種類ごとに行き先が決まっています。
- 用語や概念 →
CONTEXT.md(仕様書ではなく共有語彙の辞書として扱う) - 覆しにくく、文脈なしでは意外に見え、実際のトレードオフの結果である設計判断(3つすべてを満たすもの)→ ADR。条件が厳しいので、ADRが1つも作られないセッションのほうが普通
- 機能要件や実装計画 → この段階ではまだ書かない
CONTEXT.mdは会話の最後にまとめて書かれるのではなく、用語が1つ決まるたびにその場で更新されます。
リポジトリの外で計画や文章を詰めたいときは、何も保存しない軽量版のgrill-meを使います。
2. to-spec: 会話を仕様に固定する
to-specは、ここまでの会話とコードベースの理解を、実装できる仕様書に変換します。ここで改めてヒアリングはしないのがルールで、grillで合意した内容を統合して出力します。
仕様書はProblem Statement(問題)、Solution(解決策)、User Stories(ユーザーストーリー)、Implementation Decisions(実装上の決定)、Testing Decisions(テスト方針)、Out of Scope(対象外)などで構成され、受け入れ条件はUser StoriesとTesting Decisionsが担います。
特徴的なのは、仕様書を書く前にtest seamを確認する手順が挟まることです。seamはレガシーコード改善の文脈で知られるMichael Feathersの用語で、元は「その場所を編集せずに振る舞いを差し替えられる場所」を指します。このSkill集では、それをテストを当てる公開の境界という意味で使っています。内部の関数を個別にテストするのではなく、なるべく高い位置の境界を選び、既存のseamを優先し、新しく作るseamは理想的には1つに抑えます。この設計をユーザーが承認してから仕様書が書かれます。
テスト境界を実装前の合意事項にするのがこのフローの肝で、後述のTDDはこの合意を基準に動きます。起票されたIssueにはready-for-agentラベルが付き、エージェントがそのまま拾える状態になります。
3. to-tickets: vertical sliceに分割する
仕様を、独立して実装できる小さなチケットに分割します。ここで「DB → API → UI」のような水平分割は明確に禁止されています。代わりに、ユーザーから見て小さくても動作するvertical sliceに分けます。Pocock氏はこれをtracer bullet(『達人プログラマー』で言う曳光弾: 全層を貫通する最小の動く実装)とも呼んでいます。

たとえば「1件登録して表示できる → 入力エラーを表示できる → 編集と削除ができる」のような分け方です。
各チケットには受け入れ条件、依存するチケット、親specへの参照が入ります。分割案は登録する前に、粒度と依存関係をユーザーに確認します。例外は広範囲の機械的なリファクタリングで、この場合に限りexpand–contract方式(新旧を併存させ、段階的に移行し、旧形式を消す移行パターン)を使います。
ここでコンテキストの管理も押さえておきます。grill → spec → ticketsまでは1つの連続したコンテキストで進め、to-ticketsが終わって初めて/clearでクリアします(コンテキストが大きくなりすぎたときは、フェーズの境目で/compactする例外があります)。各チケットの実装は毎回まっさらなコンテキストから始めます。チケットに必要な情報がすべて書かれているから成り立つ運用で、チケットを「独立して実装できる単位」にこだわる理由もここにあります。
4. implement + tdd: 1テストずつ進める
implementは実装の統括役です。spec/ticketを読み、事前に合意したseamでテストを書き、内部でtddを回します。実装中は型チェックと対象のテストを頻繁に実行し、最後に全テスト → code-review → commitという流れです。implementは計画を蒸し返さず、追加のヒアリングもしません(test seamを事前に合意していない場合だけ、最初に確認が入ります)。曖昧さはgrillとspecの段階で潰しておく前提です。
tddの運用には3つの縛りがあります。
- テストをまとめて書かず、1テストずつ通して進める。 AIは放っておくとテストを大量に書いてから一気に実装しがちで、それを明示的に禁止している。
- テストは内部構造ではなく公開された振る舞いを記述する。 「private関数が3回呼ばれる」ではなく「有効なカートで注文を確定できる」。
- リファクタリングはループに含めない。 ループはRed → Greenの繰り返しで、リファクタリングはレビュー段階に回す。
さらに、期待値を実装と同じ計算式で作ることも禁止しています。仕様書の例、手計算した値、既知の正解など、実装とは独立した根拠を使います。これを怠ると、実装とテストが同じ誤りを共有する自己循環テストになります。
5. code-review: 「正しく作ったか」と「正しいものを作ったか」を分ける
レビューは2つの独立したサブエージェントで並列に実行されます。
- Standardsレビュー: リポジトリに文書化された規約(
CONTRIBUTING.mdなど)に違反していないか、Martin Fowler『リファクタリング』3章のコードスメルがないか - Specレビュー: 元のspec・Issueを満たしているか、受け入れ条件を実装しているか、余計な振る舞いや欠落がないか
分ける理由は、設計上の好みが仕様適合性の判断に混ざったり、逆に「仕様は満たしている」ことで品質の問題を見逃したりするのを防ぐためです。結果もStandardsとSpecに分けて報告し、1つの合否にまとめません。レビュー対象はgit diff <固定点>...HEADとして定義し、仕様が見つからない場合は要求を推測せず、Spec側を飛ばします。
6. 保守: improve-codebase-architecture
機能開発とは別に、手が空いたときに回す設計改善のSkillもあります。最近変更された箇所(ホットスポット)を中心に浅いモジュールを探し、深いモジュールに変える候補をbefore/afterの図付きのHTMLレポートで示します。選んだ候補は、再びgrillからのフローに乗せます。
筆者は別の業務案件の検証ツールでも一度回しました(2026年7月時点の版、v1.2.0)。検証関数に渡す文脈が型のない辞書で同じキーの一覧が5か所に写されていること、合成役の9個の関数がすべて数行のラッパで、キーを1つ足すたびに4か所を書き換えていたことが浅いモジュールとして挙がりました。候補を5つのIssueに分けて挙動を変えずに直し、キーの追加は宣言1か所の変更で済むようになりました。
使いどころ: 向くタスク・向かないタスク
このフローはゲートが多いぶん、一周するのにそれなりの時間とトークンを使います。すべてのタスクに適用するものではありません。
向いているタスク
- 仕様が曖昧なまま着手しがちな、まとまった新機能
- トレードオフを伴う設計変更や、後から覆すコストが高い判断を含むタスク
- 複数のチケットに分割するくらいの規模の開発
- ドメイン用語の認識がメンバー間でずれているリポジトリ(
CONTEXT.mdの整備自体に価値がある)
向いていないタスク
- 1行〜数行のバグ修正や小さな改修 → 通常の依頼か、
/tdd単体で十分 - 仕様が完全に明確な機械的作業(rename、依存の更新など) → grillやspecを挟む意味が薄い
- リポジトリに紐づかない設計相談 →
/grill-me単体で完結させる
また、フローの全部を使う必要もありません。1つの不変条件を守る変更ではto-ticketsを飛ばす、という判断もありえます(後述の「実践して分かったこと」)。
迷ったら/ask-mattに状況を伝えると、合うSkillと流れを案内してくれます。案内の軸になる主経路は次のとおりです。
/grill-with-docsで詰めた後、会話だけでは決まらない疑問(状態の持ち方や画面の見え方など)があれば、/prototypeで使い捨てのコードを書いて確かめる- 複数のセッションにまたがる規模なら、
/to-spec→/to-tickets→ チケットごとに/implement - 1セッションで終わる規模なら、そのまま同じコンテキストで
/implement
溜まったバグや要望にはtriage、原因の分からないバグにはdiagnosing-bugsという入り口も用意されています。
実践: Claude Code + GitLabで動かす
ここからは、導入して1機能を流すまでの手順です。Issue trackerとしてGitLabを使う前提で書いています。GitHubの場合はglabの代わりにghを使うだけで、流れは同じです。
前提条件
| 必要なもの | 備考 |
|---|---|
| Claude Code | ターミナルでclaudeが起動できること |
glab CLI |
Claude CodeがGitLabのIssueを読み書きするために使う。インストールと認証は公式の手順を参照 |
セルフホストのGitLabなら、glab auth login --hostname <GitLabのホスト名>で認証し、対象リポジトリでglab issue listが通ることを確認しておきます。
落とし穴: 対話プロンプトを開くCLIはエージェントを止める。 たとえば
glab issue create --description -は標準入力ではなくエディタを開く指定のため、エージェントが実行すると応答待ちのまま固まります。--yes付きのコマンドをClaude Codeの許可リスト(/permissionsやsettings.jsonのallow)に入れる、長いdescriptionは--description "$(cat ファイル)"のようにファイル経由で渡す、の2点を押さえておくと安全です。
Step 1. Skillsをインストールする
READMEのClaude Code向けの手順は、公式marketplaceからプラグインとして入れる方法です。プラグインは自動で更新されます。チームで使う場合は、メンバーによって版がずれる時期があることも頭に入れておいてください。
claude plugin install mattpocock-skills@claude-plugins-official
落とし穴: 公式marketplaceが未登録だと失敗する。 筆者の環境(Claude Code 2.1.300)では
claude-plugins-officialが登録されておらず、上のコマンドは「marketplaceにプラグインが見つからない」というエラーで止まりました。その場合は次のコマンドで先にmarketplaceを登録してから、もう一度インストールします。
claude plugin marketplace add https://github.com/anthropics/claude-plugins-official.git
VS Code拡張機能では、入力欄で/pluginsと打つとManage pluginsの画面が開きます。Pluginsタブでmattpocock-skillsを検索してInstallします。一覧に出てこなければ、Marketplacesタブでanthropics/claude-plugins-officialを先に追加します。
Claude Code以外のエージェントで使う場合や、Skillのファイルを編集して使いたい場合は、READMEにあるskills.shの方式もあります。プラグインとskills.shの両方を入れると同じSkillが二重に登録されうるので、どちらか一方にします。
インストール後、Claude Codeで/を打ち、/mattpocock-skills:grill-with-docsのようにプラグイン名の付いたSkillが一覧に出てくれば成功です。ほかのコマンドと名前が衝突しなければ/grill-with-docsだけでも呼べるので、本記事ではプラグイン名を省いて書きます。
落とし穴:
code-reviewは名前が衝突する。 Claude Codeには組み込みの/code-reviewがあり、こちらはバグを探すための別物です。このSkill集の公式docsでも、最も多く報告されている問題として挙げられています。単体で呼ぶときは/mattpocock-skills:code-reviewとプラグイン名を付けてください。
Step 2. リポジトリをセットアップする(初回のみ)
対象のリポジトリでClaude Codeを起動し、/setup-matt-pocock-skillsを実行します。リポジトリを調べたうえで、項目ごとに推奨の答えを先頭にした質問が来ます。
- Issue tracker → GitLab(
git remoteがGitLabを指していれば最初から提案される) - triage用ラベル → 既存の運用ラベルがあればそれを指定し、なければ既定の
ready-for-agentなどをそのまま採用する CONTEXT.mdとADRの置き場所 → 通常はルートのCONTEXT.mdとdocs/adr/が質問なしで採用され、モノレポの場合だけ聞かれる
完了するとCLAUDE.md(またはAGENTS.md)とdocs/agents/以下に設定が書き込まれます。後続のSkillはこの設定を読んで出力先を判断するので、「どこに何を書くか」をSkillごとに毎回考えさせずに済みます。これらはコミットしてチームで共有してください。 メンバーは各自プラグインを入れるだけで、同じ設定で動きます。
Step 3. 機能を1つ流してみる
例として「検索結果をCSVでエクスポートできるようにする」という機能で、フローを一周します。
(1) grill — 要件を詰める
/grill-with-docs 検索結果をCSVでエクスポートできるようにしたい
「誰が使うのか」「文字コードは」「件数の上限は」「失敗時の挙動は」といった質問が、番号と推奨の答えが付いた形でまとめて来ます。推奨のままでよい質問は「推奨で」と答えるだけで進みます。コードを読めば分かることは聞かれません。用語が決まるたびにCONTEXT.mdがその場で更新され、条件を満たす設計判断があればADRにするかを提案されます。セッションの後で内容を確認してコミットします。
(2) to-spec — 仕様に固定する
/to-specを実行すると、仕様書を書く前にtest seamの確認(「CSVエクスポートはHTTPエンドポイントの境界でテストします。よいですか?」など)が入るので、ここだけはしっかり判断してください。承認すると、ここまでの会話が仕様書にまとまり、Step 2の設定に従ってGitLabに親Issueとして起票されます。
(3) to-tickets — 分割する
/to-ticketsを実行すると、vertical sliceの分割案(例:「1. 全件を固定カラムでCSV出力できる → 2. カラムを選択できる → 3. 非同期化して大量件数に対応する」)が示されます。粒度と依存関係を確認・修正してから承認すると、GitLabに個別のIssueとして登録されます。
(4) implement — 実装する
implementは現在のブランチにそのままコミットし、ブランチは作りません。先に作業ブランチを切っておきます。
コンテキストをクリア(/clear)してから/implementを実行し、対象のチケットを伝えます。チケットは番号だけでなくIssueのURLで渡し、タイトルを復唱させてから始めると取り違えを防げます(番号だけだと、エージェントが見ている別の一覧の番号と解釈されることがあります)。合意したseamでテストを書き、内部でtddを回し、型チェック → 全テスト → code-review → コミットまで進みます。仕様についての質問は来ないので、ここで仕様の穴に気づいたらgrillやspecに戻ります。implementはレビューの指摘には対応しないので、StandardsとSpecの指摘のどれに対応するかは自分で判断してClaude Codeに指示します。
(5) MRを作る
MRの作成はSkillではなく、普通にClaude Codeへ頼めば十分です。
このブランチのMRを作成して。descriptionには親Issueとチケットへの参照と、チケットを閉じる Closes #番号 を入れて
Claude Codeがglab mr createでMRを作成します。
実践して分かったこと
業務で担当しているデータ集計ツールの改修で、このフローを一周しました。ある集計値が、グラフとテキストの出力とで食い違う問題です。実践は2026年8月時点の版(v1.2.0)で回しました。1つのリポジトリで1回一周しただけの観察で、一般化はしていませんが、架空の例では見えなかった学びを5つ共有します。
1. grillの最大の成果は「質問への答え」ではなく「矛盾の発見」だった。 コード内のコメントは「過去に出力した数値との整合を保つため旧仕様を残す」と言い、Issueは同じ箇所を「バグ」と呼んでいました。grillはこの矛盾を指摘し、「整合性」という一語に2つの意味(出力どうしの内部の整合性 / 過去の数値との連続性)が同居していたことが分かりました。用語を分けてCONTEXT.mdに収め、「衝突したときは正しい数値を優先する」をADRにしました。コードをいくら書いても解決しない種類の判断で、人間のゲートが必要な場面でした。
2. to-ticketsを飛ばす判断もフローの一部。 今回は「除外条件を1か所に集約する」単一のseamのリファクタリングでした。チケットに分割すると「一部の出力だけ除外が効く」中間状態、つまり直そうとしているバグそのものが生まれるため、分割せずspec → implementに直行しました。1つの不変条件(例:「全出力で母数を一致させる」)を守る変更は分割しないは、分割を判断する基準の一つになりそうです。レビューの粒度を細かくしたければ、チケットではなくMRを分けます。
3. CONTEXT.mdとADRは実装より先にmainへ入れる。 specのIssueは用語集とADRを参照します。ready-for-agentのIssueを後からエージェントが拾ったとき、参照先がmainに無いと空振りします。今回はドキュメント2ファイルだけの小さなMRを先にマージしてから、実装ブランチを切りました。
4. 2軸のレビューは実際に別々の問題を見つけた。 指摘はStandardsとSpecに分けて、別のコミットで直しました。Standardsは「テスト用に開けた除外条件の差し替え口が、ADRの趣旨と矛盾する」を、Specは「差分確認の自動化が、仕様の求める水準に達していない」を指摘しました。どちらも相手側の観点の対象外の指摘で、観点の分担どおりに別々の問題が出ました。ただし、レビューは万能ではありません。レビューでは見つからず、実データでツールを一通り動かしてみて初めて見つかったバグもありました(集計キーの誤判定)。レビューは実行の代わりになりません。
5. 最後の漏れを見つけたのは、ドメインを知る人間の質問だった。 テストもレビューも通った後、筆者がAIに投げた「このデータには集計から外すべき種類の利用者も混ざっているが、考慮されているか?」という一つの質問が、合意事項(特定の利用者を全出力から除外する)の適用漏れを1件あぶり出しました。不変条件のテストはありましたが、フィクスチャがそのケースを含んでいませんでした。不変条件テストを信頼できるのはフィクスチャが網羅している範囲までで、ドメインのレビューはフローの外に残ります。
まとめ: チームに取り入れるなら
全部をそのまま導入する必要はありません。効果が大きそうな順に、部分的に真似できます。
- grillの習慣: 実装を頼む前に「判断が必要な点を先に聞いてから進めて」と指示するだけでも、実践1のような食い違いを実装前に拾える見込みが上がります。今日から使えます。
- テスト境界(seam)の事前合意: 「どの境界でテストするか」を実装前にAIと合意します。テストの粒度が安定し、自己循環テストも防ぎやすくなります。ただし、フィクスチャがケースを網羅しているかは別に確認が必要です(実践5)。
- Standards / Specの分離レビュー: レビューの観点を2つに分け、サブエージェントや別セッションのように別々のコンテキストで走らせます。既存のレビューフローにも足しやすい方法です。
- vertical sliceのチケット分割: AIに限らず有効なプラクティスですが、「1チケット = エンドツーエンドで動く単位」をAIへの指示に明文化すると効果的です。ただし、1つの不変条件を守る変更は分割しません(実践2)。
どれを取り入れても、実データで動かすことと、ドメイン知識を持つ人に見てもらうことは残ります。フローはそこまでの手戻りを減らすためのもので、その2つの代わりにはなりません。
リポジトリはMITライセンスで公開されており、各SkillのMarkdownを読むだけでもプロンプト設計の参考になります。エージェントにコマンド実行の権限を持たせて動かす手順書でもあるので、チームに入れる前に一度目を通しておくことをお勧めします。まずはREADMEから眺めてみてください。
参考リンク
本記事で確認した版(公式marketplaceのv1.2.3、コミットc55ee46)へのリンクです。
- mattpocock/skills — リポジトリ本体
- setup-matt-pocock-skills
- ask-matt
- grill-with-docs(解説ページ)
- to-spec
- to-tickets
- implement / 解説ページ
- tdd
- code-review / 解説ページ
- improve-codebase-architecture
採用情報
HEROZは、一緒に働くエンジニアを募集しています。 興味のある方は、以下の採用情報からご応募ください。heroz.co.jp



