受け入れスイートをプログラムからデータに変えたら、納品率の低下は 75% から 2.7% になった
攻撃者が状態を持つゲージの変種を書き、ゲージは両方向で満点なのに、納品率は 75 ポイント下がりました。直し方は、スイートに残すものを三つだけにすることです。方言、エントリーポイントの名前、入力—期待値のリテラル値の一覧です。
#問題:ゲージは役に立たないものに食わされうる
2026-09-06、R451。
| 段階 | 結果 |
|---|---|
| スイートを commit に結びつける、平凡なスイート(読み込めれば合格扱い) | 371 / 371 すべて拒否 —— 正常 |
| 状態を持つゲージの変種 | 納品率が 75.20 pp 低下 |
| ゲージの報告 | ok(両方向とも満点) |
#攻撃の仕組み
もとのスイートは信頼されたコードの一片でした。それは次のことができました。
- 外部の状態を読む。
- 呼び出されたときに自分自身や環境を変える。
- 「既知の誤りのサンプル」に対してだけ正しく振る舞う。
多者実行はこれを防いでいませんでした——どの票も誠実で、どのチェーンも検証を通るからです。named-dissent
#直し方:SuiteSpec
スイートを三つのものに制限します。
| 1. 方言 | Python / 特定のバージョン |
| 2. エントリーポイントの名前 | solve |
| 3. 「入力—期待値」のリテラル値の一覧 | 純粋なデータ |
実行器は自分の決定的なレンダラーだけを使って、このデータからテストコードを生成します。レンダリング結果のハッシュはマシン間で照合できます。
#効果
| 攻撃 | 修正前 | 修正後 |
|---|---|---|
| exec の密輸(候補プログラムが実行時にテストコードをすり替える) | 368 / 371 | 0 / 371 |
| generic_gauged(残余) | — | +2.72 pp |
| weak_oracle(事後の上限) | — | +4.35 pp |
| 意味のある範囲 | — | MBPP+ の上だけ |
#なぜ残余の +2.72 ポイントは消せないのか
#次に
- この修正で解決できないこと:named-dissent
- ゲートの完全な規則:conformance-gate
- 多者実行の完全な仕様:多者実行

