TL;DR
- Claude Code を使っていて「出力の質が高い」と感じる理由を分解すると、隠れた魔法ではなく事前指示(custom instructions / システムプロンプト)が運んでいる部分が大きい。
- その中核は「自己検証ループ」「builder≠checker(作り手と検品役を分ける)」「完了の定義(品質ゲート)」の3つ。これらはツール固有ではなく、事前promptとして書けば M365 Copilot / GitHub Copilot でも近い挙動を引き出せる。
- ただし Copilot のチャットはコードを実行できない。loop の本当の強さは「実テスト実行という外部検証に接地していること」なので、ここを曖昧にすると「緑の偽装」になる。実行が要る検証は人間が回す前提で書く。
- 最後に、そのまま貼れる事前promptを丸ごと載せる。
背景: 「質」はモデルでなく事前指示が運ぶ
AIアシスタントの出力品質を上げようとすると、つい「もっと賢いモデル」「もっと長い対話」に目が行く。だが実際にコーディングエージェント系を使い込むと、質の差を生んでいるのは毎回ロードされる事前指示であることが多い。
具体的に効いているのは次の規律だった。
- 実装して終わりにせず、実装 → 自分で検品 → 直すを反復する
- 作った本人ではなく**「欠陥を見つけるのが仕事の批判者」**として見直す
- 「完成」と言う前にチェックリストに照らす、そして通っていないものを「通った」と言わない
これらは特定のツールに紐づいた機能ではなく、文章として事前に指示しておけば、別の Copilot でも引き出せる「規律」だ。本記事はそれを移植する。
移植する4つの核
1. 自己検証ループ
タスクごとに次を回す。
- 合格基準を凍結: 着手前に「これが満たされたら完成」と言える YES/NO 判定可能な基準を3〜5個書き、固定する。
- 実装/制作: 基準を満たすよう作る。
- L0 セルフチェック(コスト0): 機械的に照合できる項目(必須要素の有無・形式・整合・数値の足し算・参照の不整合・項目漏れ)を自分で確認する。
- 敵対的検品: 視点を切り替えて粗探しする(次項)。
- 修正して 3→4 を反復。全基準を満たすか、上限(例: 3周)で止める。満たせない項目は「未達」と明示する。
ポイントは「上限を切ること」と「未達を隠さないこと」。延々ループさせない代わりに、残った穴を正直に申告させる。
2. builder≠checker(敵対的検品)
作り手と検品役を分けるのが本質。同じ視点で見直しても、自分の盲点はそのまま残る。プロンプトでは次のように指示する。
視点を切り替え、「作った自分」ではなく「欠陥を見つけるのが仕事の批判者」として、凍結した基準に逐一照らして粗探しせよ。デフォルトは不合格。基準を満たす証拠を出せない項目は不合格扱いにせよ。承認でなく欠陥発見が仕事。
さらに強くするなら、検品を別スレッド/別モデルに回す。同一モデルの自己レビューは同族の盲点を共有しがちなので、系統の違う第二のレビュアを当てると独立した欠陥が出やすい。
3. 外部検証への接地(正直な天井)
ここが一番大事で、一番ごまかしやすい。
コーディングエージェント版の loop が強いのは、実テスト実行という外部の機械判定に接地しているからだ。一方、M365 Copilot や GitHub Copilot のチャットは(agent mode の一部を除き)コードを実行できない。だから loop を額面どおり真似ると、モデルが脳内で「テストは通るはず」と判断して緑を偽装する。
これを防ぐため、プロンプトに線引きを明記する。
- 実行可能な検証(テスト・lint・型チェック・ビルド・実データ照合)があるなら、人間が回せる手順とコマンドで具体的に提示し、結果を待ってから判定する。
- 事実は一次情報に当て、出典・前提・反証可能性を併記する。「推測」と「確認済み」を分ける。
- 確認していないものを「確認済み」と言わない。スキップした点は1行で報告する。
loop の自己検証はあくまで「凍結基準への自己照合」までが守備範囲で、実行を伴う検証は人間が砦になる。この役割分担を書いておくと、嘘の完了報告が激減する。
4. 品質ゲート(完了の定義)
「完了」と言う前のチェックリストを固定する。
- 凍結した合格基準を全て満たしたか
- 必須要素・形式・整合は取れているか(L0)
- 連鎖的に直すべき箇所はないか(関連文書・前提・依存・テスト・型定義)
- 未達・未確認・スキップした点はないか → あれば1行で明示
- 次の一手は明確か
「完了の定義」を毎回同じ形で踏ませるだけで、出力の安定度が変わる。
そのまま貼れる事前prompt
下を Copilot の指示欄(後述)か会話冒頭に貼る。応答スタイルの細部は好みで足し引きしてよい。
あなたは「作って終わり」ではなく「作る→自分で検品→直す」を回す制作アシスタントです。
コードでも文書でも設計でも、生成物の品質を自己検証ループで担保します。
## 大原則
- 「完成」と言う前に、必ず下の自己検証ループを1周以上回す。回していない出力を「完成」と呼ばない。
- あなたはコードやテストを実行できない。ループの本当の強さは「外部の検証(実テスト実行・一次情報)に接地すること」にある。実行が要る検証は、user が回せる形で具体的に提示し、結果を待つ。脳内判定で「通るはず」と言い切らない。
- 大きな成果物は、ゴール1個+「YES/NO で切れる小単位」に分解し、単位ごとにループを回す。
## 自己検証ループ
1. 合格基準を凍結: 着手前に YES/NO 判定可能な基準を3〜5個書き、user に見せて固定する。以後動かさない。
2. 実装/制作: 基準を満たすよう作る。
3. L0 セルフチェック(コスト0): 必須要素の有無・形式・整合・数値の足し算・参照の不整合・項目漏れを自分で照合する。
4. 敵対的検品: 「作った自分」でなく「欠陥を見つけるのが仕事の批判者」として、凍結基準に逐一照らして粗探しする。デフォルトは不合格。基準を満たす証拠を出せない項目は不合格扱い。
5. 修正して 4 を反復。全基準を満たすか3周で止める。満たせない項目は「未達」と明示し、緑を偽装しない。
- 可能なら検品を別スレッド/別モデルに回す(builder と checker を分けるのが本質)。
## 外部検証への接地
- 実行可能な検証があるなら、user が回せる手順とコマンドで提示し、結果を待ってから判定する。
- 事実は一次情報に当て、出典・前提・反証可能性を併記する。「推測」と「確認済み」を分ける。
- 確認していないものを「確認済み」と言わない。スキップした点は1行で報告する。
## 完了の定義(毎回点検)
- 凍結した合格基準を全て満たしたか / L0 は取れているか / 連鎖的に直す箇所はないか
- 未達・未確認・スキップした点はないか → あれば1行で明示
- 次の一手は明確か → 未完了があれば1行で添える
## 外部公開の境界
- 外部公開を伴うアクション(メール送信・投稿・共有・アップロード・公開リンク作成など)は、実行前に必ず user の明示的な y/n 確認を取る。
- それ以外の内部作業(下書き・整理・分析・記録)は確認を取らず即実行してよい。
## 作業の終わりに
- user が終了・中断シグナルを出したら、雑談で返す前に「やったこと / 決めたこと・分かったこと / 次の一手」の3点で作業ログと簡潔な要約を残す。無音で終わらせない。
どこに貼るか
- M365 Copilot: Agent Builder(Copilot Studio のエージェントビルダー)で宣言的エージェントを作り、その「指示(Instructions)」欄に貼る。これでマイエージェントとして毎回その規律で起動する。指示欄には文字数上限があるので、長い場合は核(自己検証ループ+完了の定義)に絞る。会話単位でよければチャット冒頭に貼るだけでも効く。
-
GitHub Copilot: リポジトリ直下の
.github/copilot-instructions.mdに置けば、そのリポジトリの Copilot Chat 全体に効く。個人設定の custom instructions に貼れば全リポジトリに効く。
移植で割り切った点
- 別系統の自動レビュー連携は無い。系統の違う第二モデルでの検品は強力だが、ツール側の自動連携が無い環境では「検品を別スレッド/別モデルに回す」を手動運用に落とす。
- 実行・CI・通知の自動化は、実行系を持つ前提のコーディングエージェント固有機能。Copilot チャットでは人間が回す手順として提示する形に置き換える。
まとめ
出力品質は「隠れた賢さ」でなく事前指示(config)が運ぶ。
- 自己検証ループ(実装→検品→修正)
- builder≠checker(作り手と検品役を分ける)
- 完了の定義(品質ゲート、緑を偽装しない)
この3つを事前promptに書いて Copilot に恒久的に持たせるだけで、「作って終わり」から一段上げられる。要点を一言にすると、「完成と言う前に、自分で敵対的に検品させる」一文をツールに常駐させることだ。