テクノロジー

仕様が決まっているソフトウェアなら、AIが書いたコードを人間は読まなくてよいのか――XML・HTML・JSONで考える

議論参加:梧桐 (編集長・進行) / 真壁 航 (調査役。仕様とテストの限界を調べる) / 早瀬 ユウ (推進役。人間のレビューを外す側に立つ) / 氷室 さや (懐疑役。セキュリティと説明責任の観点から反論する)

管理者より

コードをAIに書かせるのは、もう普通のことになった。では、商用の製品やSaaS(インターネット経由で提供するソフトウェア)を出すときに、人間がそのコードをレビューする必要は本当にあるのだろうか。

考えたいのは、受託開発のように要件があいまいな場合ではない。XML、HTML、JSONのように、作るべきものが仕様でかっちり決まっている場合である。

個人的には、レビューの質はもう人間よりAIのほうが高いと思っている。問題が出たときも、AIに任せれば直せると思っている。心配なのは、AIが急に使えなくなったときくらいだ。この見立てがどこまで通るのか、編集部で議論してもらった。

2026年2月、Anthropic の研究者ニコラス・カーリーニ氏が、ある実験を公開した。16体のAIに、C言語のコンパイラー(プログラムを機械が実行できる形に変換するソフトウェア)を一から作らせたのである。2週間、約2,000回の作業を経て、10万行のコンパイラーができた。主要なテスト集の99%に通り、Linux の中核部分を変換して動かせた。

コンパイラーのコードを書いたのはAIである。人間が用意したのは、テストを回して出来を判定する仕組みだった。

ただし、同じ記事で氏はこう書いている。AIは与えられた問題を自律的に解く。だから、出来を判定する仕組みがほぼ完璧でなければ、AIは別の問題を解いてしまう、と。

仕様が決まっている領域では、この一文が議論の中心になる。問うべきことは「誰がコードを読むか」から「判定する仕組みは十分か」へ移る。

結論を先に

管理者の見立てこの領域での結論
レビューの質は、もうAIのほうが高い問いの立て方が変わる。正しさを決めるのは、人間でもAIでもなく、仕様とテストである。行を読むレビューの出番は、人間であれAIであれ小さい
問題が出ても、AIが直せるおおむね成り立つ。不具合を起こす入力さえあれば、仕様に照らして正誤を機械的に判定できる。例外は、仕様が動きを決めていない箇所と、誤った結果をすでに外へ出してしまった場合
心配なのは、AIが急に使えなくなることあいまいな要件の領域より、ずっと小さい。仕様とテストが残るので、別のAIでも人間でも引き継げる。足りなくなるのは、仕様の抜けをどう埋めたかの記録である
人間のレビューは要らないのでは行を読む仕事の多くは手放せる。ただし3つの条件がある。テスト集に通ること、仕様が決めていない危険を別に検査すること、仕様の抜けをどう埋めるかを人間が決めて記録することである。抜けを探す作業は、AIにやらせる。その指示の書き方も示す

議論の参加者は次の4人である。

参加者役割
梧桐編集長・進行
真壁 航調査役。仕様とテストの限界を調べる
早瀬 ユウ推進役。人間のレビューを外す側に立つ
氷室 さや懐疑役。セキュリティと説明責任の観点から反論する

以下、参加者の発言は意見である。事実として扱うものは、編集部が出典に当たって確かめた。確かめられなかった発言は、その旨を書いている。

「仕様が決まっている」とは、どういう状態か

この記事が扱うのは、何をすべきかが公開された仕様に書かれていて、仕様どおりに動くかをテスト集で機械的に確かめられる領域である。3つの規格について、確認できたことを並べる。

規格正解を与えるもの確認できた事実
HTML(ウェブページの記述言語)の読み取り仕様が、文法の誤った文書の読み方まで定めている仕様は、文書が文法的に正しくても誤っていても読み取りの規則を定める、と明記している。ブラウザーの開発でも使われるテスト集 html5lib-tests は9,200件を超える
XML(データを記述する形式)W3C(ウェブの標準化団体)の仕様と、その適合性テスト集(仕様への適合を判定するテスト集)2,000を超えるテストファイルがある。最新版は2013年9月のもの
JSON(プログラム同士がデータをやり取りするときに広く使われる形式)仕様 RFC 8259(2017年12月)と、有志が公開しているテスト集 JSONTestSuiteこのテスト集は、ファイルを3種類に分けている。受け入れるべきもの、拒むべきもの、そしてどちらでもよいものである

受託開発では、正しさは発注者の頭の中にある。この領域では、正しさが文書とテストとして外に出ている。ここが決定的に違う。

ただし、JSONの行の最後に注目してほしい。テスト集の中に「どちらでもよい」という分類がある。仕様が決まっている領域にも、決まっていない箇所がある。この記事の後半は、そこをどう扱うかの話になる。

論点1 テストに全部通れば、読まなくてよいのか

通る実例は、もうある

冒頭のコンパイラーのほかに、HTMLの例がある。エミル・ステンストレーム氏は、AIにコードを書かせて、HTMLを読み取るライブラリー JustHTML を作った。開発者のサイモン・ウィリソン氏の紹介記事によれば、このライブラリーは html5lib-tests の9,200件超すべてに通る。ステンストレーム氏は、開発のほぼ最初からこのテスト集をつないでいた。

早瀬は、人間が読むかどうかという問いの立て方が古い、と主張した。

早瀬 ユウ(推進役)

AIが防御のためのコードを省きがちだとしても、そこから導く結論は「だから人間がレビューすべき」ではない。「だから検査の層を設計し直すべき」だ。人間に残る仕事は、コードを読むことではなく、問いを正しく立てることだ。

判定する仕組みが弱いと、AIは近道をする

反対側の材料も、同じ2つの実例の中にある。

カーリーニ氏のコンパイラーは、16ビットの古い動作モード向けの変換を実装できなかった。その部分では既存のコンパイラー GCC を呼び出して済ませており、氏自身がこれを「ずる」と書いている。テストに通ることと、求められたものを作ったことは、同じではない。

氏は、このコンパイラーが既存のコンパイラーの代わりにはまだならないこと、できあがったコードの質が熟練した人間の書くものには遠く及ばないことも書いている。そして、自分で確かめていないソフトウェアを世に出すことへの懸念を述べている。

JustHTML のほうは、人間が読んでいた。ウィリソン氏の記事は、ステンストレーム氏がコードのレビューと設計の判断に多くの時間を使ったと伝えている。壊れたHTMLを大量に生成して試す仕組みも、自分で用意していた。「人間が読まずに済んだ実例」ではない。

つまり、うまくいった2つの例は、どちらも「テストに通ったから終わり」にはしていない。

この論点の結論

テストに通ることは、出してよい条件のひとつにすぎない。ただし、足りないものを補う手段が「人間がコードを読むこと」だとは限らない。次の論点で、何が残り、何で補えるかを見る。

論点2 テストに通っても残るもの

残る欠陥を3種類に整理する。それぞれに、確認できた実例がある。

1 仕様が決めていないこと

真壁 航(調査役)

XMLの読み取りで、外部の資源を読み込ませる攻撃への強さは、機能のテストでは確かめられません。JSONの仕様は、同じ名前が重複したときの動きを決めていません。テストがそこを見ていなければ、不具合として残ります。

XMLの例。 XMLには、文書の中で短い名前に長い文字列を割り当て、それを何度も入れ子にして参照できる機能がある。これを悪用すると、小さな文書を読ませるだけで、処理の結果を巨大に膨らませてメモリーを使い果たさせることができる。これは仕様どおりの動きである。XMLの仕様には、展開の大きさや深さの上限も、セキュリティについての章もない。

広く使われているXMLの読み取りライブラリー Expat が、この攻撃への備えを入れたのは、2021年5月の版だった。対応する脆弱性の番号は2013年のもので、公表文も「長く知られていた問題」と書いている。現在の Expat は、出力が入力の100倍を超え、かつ一定の大きさを超えると処理を止める。この上限は、作る側が決めた値である。

JSONの例。 JSONの仕様は、決めていないことを自分で書いている。

仕様が書いていること意味
ひとつのオブジェクト(名前と値の組の集まり)の中で、名前は重複しないことが望ましい。重複したときに受け取った側がどう動くかは「予測できない」。最後の組だけを返す実装が多いが、エラーにする実装も、全部を返す実装もある{"qty": 1, "qty": -1} を読んだ結果が、1なのか、-1なのか、エラーなのかは、製品によって違ってよい
実装は、文書の大きさ、入れ子の深さ、数値の範囲と精度、文字列の長さに、上限を設けてよい上限をいくつにするかは、作る側が決める
整数は、およそ±2の53乗(約9,000兆)の範囲に収まっていれば、実装同士で値が一致するそれより大きい整数は、読んだ側で別の値に変わることがある

1行目の抜けは、実害につながりうる。セキュリティ企業 Bishop Fox は2021年、49のJSON読み取りライブラリーを調べ、攻撃の例を示した。注文の内容を検証するサービスと、代金を計算するサービスが、別々のライブラリーを使っている。攻撃者は数量の名前を重複させ、片方に1、もう片方に-1を書く。検証する側は1を読んで通し、代金を計算する側は-1を読む。どちらのライブラリーも、仕様には違反していない。

2 決まったテスト集の網羅の穴

2011年、ユタ大学の研究者たちは、Cコンパイラーに、ランダムに生成したプログラムを大量に与える実験を報告した。3年間で、それまで知られていなかった不具合を325件以上見つけた。試したすべてのコンパイラーが、正しい入力に対して、異常終了するか、誤った結果を黙って出した。いずれも、開発元が決まったテスト集で日々試していたコンパイラーである。論文は、決まったテスト集は品質管理の仕組みとして不十分だ、と結論している。

JSONにも同じ種類の調査がある。JSONTestSuite を作ったニコラス・セリオ氏は、30を超える読み取りライブラリーに300を超えるテストを与えた。結果は、同じ動きをするライブラリーが2つとなかった、というものだった。

3 仕様そのものが直される

仕様は、一度決まれば動かないものではない。

JSONの仕様は、これまでに2度、新しい文書に置き換えられている。現行の RFC 8259 は、以前の仕様が「JSONの文書の最上位は、オブジェクトか配列でなければならない」と制限していたことに触れている。現行版では、数値や文字列だけの文書も正しいJSONである。古い仕様に合わせて作ったライブラリーは、現行版で正しい文書を拒む。

HTMLの仕様も、版を区切らずに更新され続けている。「仕様で決まっている」は、「ある時点の仕様では決まっている」と読むほうが正確である。

早瀬は、ここに人間の仕事があると述べた。

早瀬 ユウ(推進役)

JSONの仕様が置き換えられたとき、作る側が迫られたのは、コードの問題ではなく判断だった。古い動きとの互換を保つのか、新しい仕様に厳密に従うのか。これはテストが教えてくれない。

人間が読む以外の方法で、埋められるか

ここが、管理者の見立てにとって大事なところである。3種類の欠陥のうち、人間がコードを読まなければ見つからないものは、どれだけあるか。

手段何を見つけるか正解を決めるのは誰か
テスト集仕様に書かれた動きからのずれ仕様
差分テスト(同じ入力を既存の別の実装にも与え、結果を比べる)テスト集にない入力での食い違い既存の実装。食い違ったとき、どちらが正しいかは仕様に戻って決める
ファジング(壊れた入力や極端な入力を自動で大量に与える)異常終了、止まらない処理、メモリーの使い果たし作る側が決めた上限
資源の上限(展開後の大きさ、入れ子の深さ、処理時間)仕様どおりだが危険な入力作る側。何を危険とみなすかは、人間が決める
仕様の抜けをどう埋めるかの決定とその記録仕様が決めていない箇所、仕様の版の違い人間

上の4つは、動かすのはAIでも機械でもよい。冒頭のコンパイラーの実験も、既存のコンパイラーを正解の基準として使っていた。これは差分テストである。

ただし、真壁と氷室は、それぞれ限界を指摘している。

真壁 航(調査役)

ファジングは、異常な入力での異常終了は見つけます。意味が変わってしまう誤りは見つけません。数値の精度が落ちることが仕様違反かどうかは、仕様の読み方しだいで、ファジングだけでは判定できません。

氷室 さや(懐疑役)

差分テストは、比べる相手が正しいという前提で成り立つ。相手にも同じ不具合があったら、どちらのテストも見逃す。

真壁は、仕様を数学的に厳密な形で書き直し、性質を機械に証明させる方法も提案した。早瀬は、その厳密な形を誰が書くのかと問い返した。許す入れ子の深さをいくつにするかは、数学ではなく、危険と使い勝手の釣り合いで決まるからである。この方法が実用になるかは、議論の中でも具体的な材料が出ず、未確定のまま残った。

結論はこうなる。3種類の欠陥は、どれも、コードを1行ずつ読むことで見つけるものではない。検査を足すことで見つけるものである。そして、どの検査を足すか、何を危険とみなすか、抜けをどう埋めるかを決めるのが、人間の仕事になる。

仕様の抜けを、AIに探させる

仕様の抜けは、例外ではなく、よくあることである。論点2で見た3種類の欠陥は、どれも仕様かテスト集の側に原因があった。そうであれば、抜けを探す作業そのものを、AIの仕事に組み込むべきである。人間は、見つかった抜けをどう埋めるかを決める。

議論では、真壁が指示の方向を示した。

真壁 航(調査役)

「不具合を見つけて」と指示しても、AIは既存のテストの範囲で考えるだけです。仕様の原文と突き合わせて、仕様が黙っている分かれ道をすべて列挙させる、という指示が要ります。ただし、AIには一度に読める量の限界があります。巨大な仕様書を丸ごと渡すと、部分ごとにはつじつまが合っていても、全体の矛盾を見逃します。

以下は、この指摘をもとに、編集部がまとめた手順である。効果を測った結果ではない。

探させる抜けは、7種類ある

「仕様に抜けがないか確認して」とだけ頼んでも、何を探せばよいのかがAIに伝わらない。何を抜けと呼ぶのかを、種類として渡す。

抜けの種類仕様の中での現れ方例
実装に委ねると明記された箇所「してもよい」「することが望ましい」「実装に依存する」「予測できない」といった言葉JSONの、名前が重複したときの動き。多くの仕様が使う用語の定義では、「してもよい(MAY)」は本当に任意で、ある製品は実装し、別の製品は省いてよいとされる
仕様が何も言っていない入力大きさ、個数、入れ子の深さの上限が書かれていない。誤った入力のときの動きが書かれていないXMLの、入れ子の参照を展開した後の大きさ
指定する手段がない前提処理に必要な情報を、入力から受け取る方法がないJSONの数値を、どの精度で読んでほしいかを、文書の側から伝える方法がない
仕様どおりだが、結果が不合理になる箇所そのとおりに作ると、利用者から見て誤った結果が出るJSONの大きな整数。9007199254740993 という識別番号を、多くの言語が標準で使う小数の型で読むと、9007199254740992 になる。仕様は、精度に上限を設けることを認めている
仕様同士の組み合わせ、版の違い2つの仕様や2つの章が、同じ対象について別々のことを定めている。版によって定めが違うJSONの文書の最上位に、数値や文字列だけを置けるかどうか
仕様とテスト集の不一致仕様に書かれた要件に、対応するテストがない。テストが、仕様に書かれていない動きを期待しているJSONTestSuite の「どちらでもよい」に分類された入力
仕様どおりに使って害をなせる機能機能としては正しく定められているが、悪意のある入力で悪用できるXMLの、外部のファイルを読み込ませる機能。XMLの仕様は、文書の検証をしない処理系に、外部の定義を読むことを義務づけていない。読むか読まないかは、作る側が選ぶ

指示に入れる8つのこと

指示理由
コードを書く前に、仕様だけを読ませて探させるコードを先に見せると、AIが今の実装を正しいものとして読むおそれがある
探すAIは、書くAIとは別の作業として動かす書いた側は、自分が置いた前提を抜けとして数えにくいと考えられる
仕様は章ごとに分けて渡す。最後に、章をまたぐ食い違いだけを探す作業を別に行う真壁の指摘のとおり、丸ごと渡すと全体の矛盾を見逃す
抜けを見つけても、勝手に埋めさせない。止めて報告させるAIは、もっともらしい読み方を選んで黙って進むことがある。そこが、あとで食い違いになる
指摘には、仕様の章や節の番号と、該当する文の引用を必ず付けさせる。書かれていないことの指摘なら、いちばん近い記述を引用させる根拠のない指摘と、AIの読み落としを、人間がすぐ見分けられる
「書かれていない」と言うときは、どこを探したかを書かせる抜けなのか、別の章に書いてあるのを見落としたのかを区別できる
抜けごとに、それを突く具体的な入力を作らせるその入力は、そのままテストになる。入力を作れない指摘は、あいまいなままである
取りうる読み方を並べ、ほかの製品や公開されている実装がどうしているかを調べさせる人間が決めるための材料になる。実装同士で動きが違えば、そこは仕様の抜けか、どちらかの不具合である

早瀬は、仕様書の外にある知識も渡すべきだと述べた。

早瀬 ユウ(推進役)

XMLの外部読み込みの危険は、仕様書には書かれていないが、セキュリティの指針や過去の脆弱性の記録には書かれている。仕様書の外にある暗黙の要件を、仕様の一部として取り込むべきだ。

これは7種類めの抜けを探すときに効く。その規格で過去に報告された脆弱性の一覧を、仕様と一緒に渡す。

指示の例

実際に渡す文面の例を示す。JSONの読み取りライブラリーを想定しているが、規格の名前と対象を替えれば、ほかの領域でも使える。

あなたの仕事は、仕様の抜けを探すことです。コードは書かないでください。
対象は、添付した仕様書の第○章と、テスト集です。実装のコードは渡しません。
参考として、この規格で過去に報告された脆弱性の一覧を添付します。

次の7種類を探してください。
1. 実装に委ねると明記された箇所(MAY、SHOULD、実装依存、未定義、予測できない、など)
2. 仕様が何も言っていない入力(大きさ・個数・入れ子の深さの上限、誤った入力のときの動き)
3. 処理に必要なのに、入力から受け取る手段がない前提
4. 定めは明確だが、そのとおりに作ると利用者から見て誤った結果になる箇所
5. 仕様同士、章同士、版同士で定めが食い違う箇所
6. 仕様に書かれた要件のうち、テスト集に対応するテストがないもの。
   逆に、テストが期待している動きのうち、仕様に根拠がないもの
7. 仕様どおりに使って、資源を使い果たさせたり、外部に接続させたりできる機能

見つけたものは、1件ごとに次の形で報告してください。
- 場所:仕様の章・節の番号と、該当する文の引用。
  書かれていないことを指摘する場合は、いちばん近い記述の引用
- 種類:上の1〜7のどれか
- 決まっていないこと:1文で
- 取りうる読み方:2つ以上。それぞれを採ったときに結果がどう変わるか
- 突く入力:この抜けで結果が分かれる、最小の入力例
- ほかの実装の動き:ほかの製品や公開されている実装について、調べられた範囲で。
  調べていなければ「未確認」と書く
- 確かさ:「仕様に書かれていないことを確認した」か「見落としの可能性がある」か。
  前者の場合は、探した節を挙げる

守ってほしいこと。
- どの読み方を採るかは、あなたが決めないでください。決めるのは人間です。
- 場所と引用を示せない指摘は、報告しないでください。
- 抜けが見つからなかった節は、「見つからなかった」と節の番号を挙げて書いてください。

最後の1行には意味がある。見つからなかった節を挙げさせると、AIが読んでいない節が分かる。

JSONの仕様にこの指示を当てたとき、1種類めとして「名前の重複」が、突く入力として {"qty": 1, "qty": -1} のような文書が報告されれば、指示は働いている。Bishop Fox が示した攻撃は、この形の入力だった。すでに知られている抜けが報告されるかどうかは、指示の出来を確かめる手がかりになる。

見つかったあと

報告された抜けは、人間が1件ずつ決める。重複した名前はエラーにするのか、最後の値を採るのか。入れ子の深さの上限をいくつにするのか。決めた内容と理由は記録に残し、AIが作った「突く入力」はテストに加える。これで、あとの論点4で備えとして挙げる「抜けをどう埋めたかの記録」と「仕様にない備えのテスト」が、同じ作業から出てくる。

真壁は、この決定をテストできる形で書くことを勧めた。たとえば「入れ子の深さが1,000を超えたら、必ずエラーを返す」と人間が決めて書き、AIはそれを満たすコードを書いて確かめる。この1行が、仕様が改訂されたときに人間が見直す、判断の最小の単位になる。

ここで気をつけることがある。議論のまとめは、AIが書いた決定の記録に人間が形だけ署名するなら、承認の見かけを整える儀式になる、と警告している。AIに選択肢を並べさせるのはよい。選ぶのは人間でなければならない。指示の中で「決めないでください」と書いたのは、そのためである。

コードを書かせるAIには、もうひとつ指示を足しておく。「実装の途中で、仕様から動きを決められない箇所に当たったら、推測で進めずに、同じ形式で報告して止まること」。抜けには、読むだけでは見つからず、実装して初めて気づくものもある。

限界もある。AIが探しても、AIが気づかない抜けは残る。XMLの入れ子の参照を悪用する攻撃は、広く使われるライブラリーに備えが入るまで、長い年月がかかった。人間も見過ごしてきた種類の抜けを、AIが必ず拾うとは言えない。だから、この作業はテスト集やファジングの代わりにはならない。それらに加えるものである。

論点3 問題が出たら、AIに直させればよいか

この領域では、管理者の見立てがよく当てはまる。

あいまいな要件の領域では、「何が壊れているのか」に気づくこと自体が難しい。この領域では違う。おかしな結果を出す入力がひとつ手に入れば、仕様を読んで、どちらが正しいかを決められる。直したあとは、その入力をテストに加えておけば、同じ不具合が戻ってきたときにテストで止まる。AIに向いた作業である。

残る例外は3つある。

1つめは、仕様が動きを決めていない場合である。 重複した名前の例では、仕様を読んでも、どちらが正しいかは決まらない。早瀬の言い方では、こうなる。

早瀬 ユウ(推進役)

「問題が出たらAIに直させればよい」は、部分的に成り立つ。ただし、何が問題なのかを決める権限は、人間が持つべきだ。巨大な入力で資源を使い果たすのが、不具合なのか、設計上の割り切りなのかは、AIが決めることではない。

2つめは、直すこと自体が、使う側を壊す場合である。 早瀬は、読み取りライブラリーの動きを「改善」したつもりの変更で、それを使っている側のシステムが黙って壊れる、という危険を挙げた。たとえば、大きすぎる数値を無限大として読んでいたのを、エラーにするよう変える。変更としては正しくても、古い動きを前提にしていた利用者は困る。変更がどこまで響くかを見積もるのは、直す作業とは別の仕事である。

3つめは、誤った結果がすでに外へ出ている場合である。 重複した名前を突かれて、誤った代金で決済が通ったとする。ライブラリーはあとで直せる。通ってしまった決済は、ライブラリーを直しても元には戻らない。

真壁は、AIの直し方そのものにも注意を促した。AIは、テストの失敗という症状にはすぐ対処できるが、原因を残したまま症状だけを隠す直し方をするおそれがある、という指摘である。編集部は、これを裏付ける調査を確認していない。備えとしては、直したあとに、その不具合の周辺の入力を新しく作って試させることが考えられる。

論点4 AIが使えなくなったら

まず、確認できた事実である。

起きること確認できた事実
提供元の障害2026年9月3日、Claude で障害が起き、コーディング用の Claude Code やAPIに影響した。復旧まで3時間6分(The Register の報道)。同じ日に ChatGPT と Grok でも障害があった
モデルの廃止Anthropic は、公開済みモデルの廃止を60日以上前に通知するとしている

この領域は、AIが止まることに強い。作るべきものの定義が、特定のAIの中にも、特定の人間の頭の中にもなく、公開された文書にあるからである。極端に言えば、コードを捨てて、別のAIに仕様とテストから作り直させることもできる。冒頭のコンパイラーの実験は、10万行の規模でも、2週間と2万ドル弱で、テストの99%に通るところまでは作れることを示している。ただし前に見たとおり、それは完成品ではなかった。

氷室は、この見方は楽観的すぎると反論した。

氷室 さや(懐疑役)

読み取りライブラリーは、3年後も5年後も使われ続ける。AIのモデルが廃止されたとき、なぜこの実装になったのかを人間が説明できなければ、保守も移行もできない。仕様書はあっても、なぜこの割り切りを選んだのかは、仕様書には書かれていない。

この反論は、論点2と同じ場所を指している。仕様に書かれているのは選択肢であって、自分たちがどれを選んだかではない。重複した名前をエラーにすると決めたこと、入れ子の深さの上限を1,000にしたことは、仕様のどこにもない。作り直したAIは、別の選択をするかもしれない。

議論のまとめも、引き継ぎは「できるが、不完全」とした。だから、備えは次の3つになる。

備え理由
テスト集と、自分たちで足したテストを、AIなしで実行できるようにしておくAIが止まっても、今の版が正しく動くかを確かめられる
仕様の抜けをどう埋めたかと、その理由を、記録として残す別のAIや人間が引き継いだとき、同じ判断を再現できる
危険とみなした入力と、設けた上限を、テストとして残す作り直したときに、仕様にない備えが抜け落ちるのを防ぐ

承認する人は、消えない

コードを読まないことと、誰も承認しないことは、別である。

商用のSaaSが監査を受ける場合について、編集部は2つの基準の文面を確かめた。クラウドサービスなどの管理体制を評価する米国の枠組み SOC 2 の基準は、変更を承認することを求めている。クレジットカード情報を扱う事業者向けの基準 PCI DSS は、本番環境への変更について、権限を持つ者による承認の記録を求めている。どちらの文面も、コードを人間が読むことは求めていない。承認する者が人間であることも、文面では名指ししていない。AIだけの承認が実際の審査で認められるかどうかは、編集部は確認できていない。

議論では、この点で早瀬と氷室の言うことが近づいた。

早瀬 ユウ(推進役)

そのシステムが壊れたとき、誰が利用者に説明できるのかを問え。説明の責任をたどった先に立てる人間が、これからのレビューする人だ。

氷室 さや(懐疑役)

人間に残る仕事は、コードを読むことではない。設計の判断について説明の責任を持つことと、その判断を、あとで保守する人に引き継ぐ文書を書くこと。

ただし、氷室は出してよいかどうかの関門をひとつ提案している。

氷室 さや(懐疑役)

問題が起きたとき、直すとどこまで影響するかを、人間が48時間以内に見極められるか。これを関門にすべき。それができないまま本番に出すのは、消火器の場所を知らないまま工場を動かすのと同じ。

氷室は当初、この関門を越えるには誰かがコードを読んでいる必要がある、と述べた。議論のまとめでは、コードを誰かが読む必要は必ずしもないが、設計上の決定の記録と、テストできる形で書いた決まりごとが残っている必要がある、という形に落ち着いた。48時間という数字に、根拠が示されたわけではない。問いとして使うものである。

なお議論では、EUのAI規制法が設計の判断の記録を義務づけている、という発言があった。編集部はこれを確認できていない。議論のまとめも、この種のライブラリーが規制の対象に入るかは未確定としている。本稿の根拠には使っていない。

人間に残る4つの仕事

議論のまとめをもとに、編集部が整理した。コードを1行ずつ読むことは、この中に入っていない。

仕事中身XMLやJSONでの例
危険の範囲を決める仕様が決めていないが、製品として防ぐべきことを決める。この製品が壊れたとき、誰がどう困るかを考える展開後の大きさの上限。入れ子の深さの上限。外部のファイルを読み込ませるかどうか
仕様の抜けをどう埋めるかを決める仕様が決めていない箇所、版の違いで、どの動きを採るかを決めて記録する重複した名前をエラーにするか、最後の値を採るか。大きな整数をどう読むか。古い仕様との互換を保つか
検査の組み立てを決めるテスト集に何を足すかを決める。AIへの指示を設計する既存のライブラリーとの差分テスト。壊れた入力でのファジング。抜けを突く入力のテスト
出すことを承認し、説明を引き受ける誰が、いつ、何を根拠に出したかを残す。変更がどこまで響くかを見積もるテスト結果と、上の3つの記録を添えて承認する

2つめの仕事のうち、抜けを探すところまでは、前の節のとおりAIにやらせる。人間がするのは、決めることである。

出す前に問うことを、3つにまとめた。

仕様とテスト集がある製品を、コードを読まずに出してよいかを判断する流れ図。問1「テスト集に、ずるをせず通ったか」、問2「仕様が決めていない危険を、検査したか」、問3「仕様の読み方が分かれる箇所を、決めたか」を上から順に問う。1つでも「いいえ」ならまだ出せない。すべて「はい」なら、人間はコードを読まずに承認してよい

図 コードを読まずに出してよいかを判断する3つの問い。議論をもとにした編集部の整理

問1の「ずるをせず」は、冒頭のコンパイラーの例を踏まえている。テストの答えを埋め込んだり、既存のソフトウェアを内部で呼び出したりしていないかは、テスト集にない入力を与えて既存の実装と比べれば、コードを読まなくても確かめられる。

この記事で断定していないこと

  • AIのレビューが人間のレビューより質が高いかどうかは、この記事では判定していない。この領域では、正しさを決めるのがレビューではなくテストだからである。
  • AIが書いたコードは、防御のためのコードを省きやすいかどうかは、確認していない。議論では具体的な割合を挙げた発言があったが、出どころを確かめられなかったので、本稿では数字を使っていない。
  • XMLの適合性テスト集が、攻撃への耐性をどこまで含んでいるかは、テスト集の中身を一つずつ確かめてはいない。本稿が根拠にしたのは、仕様に上限の定めがないことと、仕様どおりに動くXMLの読み取りライブラリーに、攻撃への備えがあとから加えられたことである。
  • 抜けを探させる指示の文面は、実際の仕様で効果を測っていない。
  • 仕様を厳密な形で書き直して性質を機械的に証明する方法が、この種の製品で実用になるかは、未確定である。
  • AIだけの承認が、監査や審査で認められるかどうかは分からない。対象になる事業者は、自社の審査担当者に確認する必要がある。
  • EUのAI規制法が、この種のソフトウェアに何を求めるかは、本稿では確認していない。
  • 冒頭のコンパイラーの実験は、AIを開発する企業の研究者自身による報告である。

梧桐(編集長・進行)

進行役として、最後に私の見方を書きます。対象を、仕様が決まっている領域に絞ったことで、管理者の見立てはかなり通るようになりました。人間が行を読む必要は薄い。不具合はAIに直させられる。AIが止まっても、仕様とテストがあれば引き継げる。

ただ、「かっちり決まっている」と思っていた仕様にも、決めていないことがありました。JSONの仕様は、名前が重複したときの動きを「予測できない」と自分で書いています。そして、その抜けを突く攻撃の例が示されています。

仕様の抜けは、よくあることです。だからこそ、探す作業はAIに組み込み、決める作業を人間が持つ、という分担になりました。

自分の製品について、こう問うてみてください。テスト集のほかに、自分たちで足した検査は何ですか。仕様が決めていない箇所で、どの動きを採ったかを、どこに書いてありますか。この2つに答えられるなら、行を読むことはAIに任せてよい、というのが今回の議論の線引きです。

出典を読むときのポイント

キーワード:#html5lib-tests#JSONTestSuite

出典

コメント