Skip to content

機械ゲートと意味ゲートの分離(Separating Mechanical Gates from Semantic Gates)

検証を、決定的に判定できるもの(機械ゲート)と、意味の判断が要るもの(意味ゲート)に分けて置く。機械に判定できることを、モデルの自己申告やレビューの目視に任せない。そして「命令に書く」は、どちらのゲートでもない。

問題

モデルが「直した」と言うが、直っていない。原因はたいてい嘘ではなく、確かめていないことである。そこで人間は命令ファイルに「テストを通してから完了と言え」と書き足す。ところが命令はコンテキストであって強制される設定ではなく(公式、出典は具体例節)、遵守は非決定的である(公式、限定と出典は具体例節)。確実に止めたいことが、確実でない手段に載っている。 逆も起きる — lint が一瞬で判定できる形式の崩れを、モデルやレビューの目視に任せ、見落とす。

コンテキスト

適用する条件:

  • 「守られているはず」の制約がある — 命令・規約・口頭の合意など、言葉だけで運用されている
  • CI・テスト・lint・スキャナのような機械の検査を持っている、または書ける
  • モデルの自己申告を信じるしかない状態になっている — 「確認しました」を確認する手段が無い

適用しないケース:

  • 機械で判定できないものを、無理に機械化しようとするとき。 「読みやすいか」「設計が妥当か」は機械ゲートに載らない。載せようとすると、判定できる代理指標(行数、カバレッジ率)で品質を測ることになり、指標だけが緑になる

隣接パターンとの境界:

  • 失敗の制度記憶化 — 機械で止められる失敗はゲートにする。命令に書くのは、機械で判定できない失敗だけである。同パターンが記憶に残す側から書いているこの境界を、本パターンはゲートに載せる側から書く
  • ルールを拘束力で階層化する — 同パターンの限界が本パターンの入口である。拘束力は言葉であり、言葉は非決定的にしか効かない
  • 検証対象の明示 — 本パターンは「どの種類のゲートに載せるか」、同パターンは「何を検証させるか」
  • 無人経路にこそ強いゲート — 同パターンは「どの経路に」ゲートを厚くするか、本パターンは「どの種類の」ゲートに載せるか

解決

機械ゲートと意味ゲートの振り分け確かめたい制約を「決定的に判定できるか」で振り分ける。判定できるならテストや lint などの機械ゲートに載せ、通らなければ事実として不合格になる。判定できないならレビューなどの意味ゲートに載せ、指摘は一つの意見として受け取る。命令ファイルに書くことは第3の選択肢ではない — 命令はコンテキストであって強制ではない。確かめたい制約止めたい失敗ふるい決定的に判定できるか?(同じ入力なら同じ答えか)はいいいえ機械ゲートに載せる・テスト、lint、型検査、スキャナ・通らない = 事実として不合格・判定できることしか判定しない緑は品質の証明ではない意味ゲートに載せる・レビュー、批評、第二の意見・指摘 = 一つの意見・見落とすことがある機械に判定できない妥当性を見る✕「命令に書く」は第3の選択肢ではない命令はコンテキストであって強制ではない

検証には2つの種類があり、性質が違う:

機械ゲート意味ゲート
判定決定的 — 同じ入力なら同じ答え非決定的
判定できるもの形式・存在・一致・既知パターン妥当性・意図・設計・読みやすさ
テスト、lint、型検査、スキャナレビュー、批評
失敗の仕方判定できることしか判定しない判定を見落とす

なぜ分離が効くのか。ゲートの価値は決定性にある。 機械ゲートは、通らなければ通らない。誰が何度流しても同じ所で止まる。意味ゲートは、機械に判定できない妥当性を見られる代わりに、見落とすことがある。この差は程度ではなく種類である — 機械ゲートの「通った」は事実の主張であり、意味ゲートの「問題なし」は一つの意見である。

失敗の仕方も対になっている。機械ゲートは判定できることしか判定しない — テストが緑でも設計は壊れうる。意味ゲートは判定を見落とす — 目視は形式の崩れを拾いきれない。この2つは互いを補えるが、互いを代替できない。 混ぜると両方の弱点だけが残る: 意味ゲートに形式の判定を任せれば見落とし、機械ゲートに妥当性の判定を任せれば、無意味な指標が緑になる。

そして最も多い事故は、第3の場所に載せることである。「気をつけろ」「必ず確認しろ」と命令ファイルに書くのは、どちらのゲートでもない。命令はコンテキストであって強制ではなく(公式、出典は具体例節)、遵守は非決定的である(公式、限定と出典は具体例節)。書いた本人はゲートを置いたつもりでいるが、何も置かれていない。 命令に書く価値があるのは、機械で判定できない、この環境固有の失敗の記憶だけである(「失敗の制度記憶化」)— そしてそれも保証ではない。

トレードオフ

利点

  • 決定的に止めたいものが、実際に止まる。 命令と違い、機械ゲートの「通らない」は読み飛ばされることも、うっかり守り忘れられることもない。
  • 意味ゲートが、意味の判定に集中できる。 形式・既知パターンは機械が先に落としているので、レビューの注意力が設計と意図に使われる。

代償

  • 機械ゲートには初期費用がある。 テスト・lint・スキャナは書けば資産になるが、書くまではタダではない。一度きりの制約をゲート化すると、費用だけ払って回収できない。
  • 緑が品質の証明として読まれやすい。 機械ゲートは判定できることしか判定しないのに、「全部緑」は全部確かめたかのように見える。緑を合格の証明と読んで意味ゲートを省略する運用は、本パターンの分離を逆側から壊す。

GitHub Copilot での具体例

Copilot は単一の製品ではない。ここでは cloud agent と github.com(Copilot code review)の面を扱い、比較として Claude Code を置く。

cloud agent — 同じ経路に、2種類のゲートが並べて置かれている

出典: Copilot cloud agent のリスクと緩和策(取得日: 2026-07-16)。cloud agent が生成したコードには、既定で機械の検査が走る 公式:

  • CodeQL is used to identify code security issues.
  • Newly introduced dependencies are checked against the GitHub Advisory Database for malware advisories, and for any CVSS-rated High or Critical vulnerabilities.
  • Secret scanning is used to detect sensitive information such as API keys, tokens, and other secrets.

〔訳〕CodeQL を使ってコードのセキュリティ上の問題を特定する。新たに導入された依存関係は、マルウェアの勧告や CVSS で High・Critical と評価された脆弱性がないか GitHub Advisory Database と照合される。secret scanning を使って API キーやトークンなどの機密情報を検出する。

3つとも機械ゲートである — 既知パターンとの照合(CodeQL)、データベースとの突き合わせ(Advisory Database)、形式の検出(secret scanning)。いずれも「決定的に判定できるか?」に「はい」で答えられる種類の検査である。

同じページが、続けて別の種類のゲートを書いている 公式:

By default, Copilot cloud agent checks code it generates for security issues and gets a second opinion on its code with Copilot code review.

〔訳〕既定では、Copilot cloud agent は生成したコードにセキュリティ上の問題がないか確認し、Copilot code review によってそのコードについて第二の意見(second opinion)を得る。

Copilot code review は「second opinion」— 第二の意見と呼ばれている。機械ゲートの結果は意見とは呼ばれない。通ったか、通らなかったかである。同じ製品が、同じ経路に、2種類のゲートを並べて置き、片方を検査として、もう片方を意見として書き分けている。 本パターンの分離が、製品の既定に埋め込まれている実例である。

github.com — code review カスタム命令(命令の遵守は非決定的)

この引用が語る範囲

以下の原文は Copilot code review のカスタム命令についての記述である。命令ファイル一般へ広げない。

出典: Using custom instructions to unlock the power of Copilot code review(取得日: 2026-07-16)公式:

  • Non-deterministic behavior: Copilot may not follow every instruction perfectly every time.

〔訳〕非決定的な挙動: Copilot は毎回すべての指示に完全に従うとは限らない。

すべての命令が毎回完全に守られるわけではない。「テストを通してから完了と言え」と命令に書くことと、テストを CI のゲートに置くことの差がここにある。前者は守られないことがあり、後者は通らなければ通らない。

他ツールでの対応物 — Claude Code

命令が強制でないのは Copilot の癖ではない。Claude Code は自分の命令ファイル(CLAUDE.md)についてこう書いている(出典: code.claude.com/docs/en/memory、取得日: 2026-07-16)公式:

Because they're context rather than enforced configuration, how you write instructions affects how reliably Claude follows them. Specific, concise, well-structured instructions work best.

〔訳〕強制される設定ではなくコンテキストであるからこそ、命令の書き方が Claude がどれだけ確実に従うかを左右する。具体的で簡潔かつ構造化された命令が最もよく効く。

命令はコンテキストであって、強制される設定ではない(context rather than enforced configuration)。だから書き方が遵守の度合いを左右する — 強制なら書き方は関係ないはずである。二つのベンダーが、それぞれ自分の製品について同じ性質を書いている。命令で止まらないものは、命令の外 — 機械ゲート — で止めるしかないという本パターンの前提は、この2つの 公式 に立っている。

別名

呼称出典
機械ゲートと意味ゲートの分離 / Separating Mechanical Gates from Semantic Gates記述本カタログの記述的呼称であり、一次資料に出典は無い

個々のゲートには確立した名前がある — CodeQL、secret scanning、Copilot code review(いずれも出典は具体例節)。名前が無いのは、検証をどちらの種類のゲートに載せるかを判断するという分離の作法のほうである。道具は両方の種類のゲートを提供するが、どちらに何を載せるべきかは言わない。判断の側に名前を与えた。

関連

  • 失敗の制度記憶化 — 機械で止められる失敗はゲートにする。命令に書くのは、機械で判定できない失敗だけである。同パターンは記憶に残す側から、本パターンはゲートに載せる側から、同じ境界を書いている
  • ルールを拘束力で階層化する — 同パターンの限界が本パターンの入口である。拘束力は言葉であり、言葉は非決定的にしか効かない。決定的に止めたい制約は、段ではなくゲートにする
  • 検証対象の明示 — 本パターンは「どの種類のゲートに載せるか」、同パターンは「何を検証させるか」。機械ゲートに載らない基準が残ったら、次はその基準を言葉の契約として明示する番である
  • 無人経路にこそ強いゲート — 同パターンは「どの経路に」ゲートを厚くするか、本パターンは「どの種類の」ゲートに載せるか
  • 計算をコードに落とす — 同じ発想の別適用である。決定的に出せる答えを、非決定的な手段に出させない
  • まず次に読むなら 計算をコードに落とす — 判定を機械に任せたら、次は計算も機械に任せる番である