私はもう、AI のいうことを確かめていません。「テストは通っています」も、「画面で確認しました」も。連載「確かめない技術」は、その状態を仕組み一つずつで作ってきた記録で、この記事が最終回です。各回の仕組みは序論の一覧から辿れます。
白状することが一つあります。
私は、5 回とも確かめています
各回の終わりに「検証手順」という節があります。あれは全部、私が自分で壊して確かめた記録です。端末を 2 つ開いて 2 本目のテストを叩き、禁句の判定を hook から 1 行消して素通りするのを見て、中身を空にした宣言で撮影が止まるのを確かめ、ファイルを 1 つ触ってから --last の日時が動かないことを見ました。そのうえ読者にも、毎回同じ手順を渡しています。「確かめない技術」と題した連載が、5 回とも確認の手順で終わっています。
数えると、確かめた回数は仕組み 1 つにつき 1 回です。置いた日の 1 回だけで、そのあとは一度も確かめていません。
もう一つ、あの節には共通の形があります。合格条件は、手順を走らせる前に決まっています。 何を渡し、何が起きたら通ったとするか——走らせてから決めた回は 1 つもありません。本文でやっていたことと、同じ形でした。
5 つの仕組みは、2 つの入口にしか置いていません
| 回 | 置いたもの | 置いた先 |
|---|---|---|
| 1 | 撮影の前の 2 問と、安い順のはしご | 指示文 1 枚(入口ではありません) |
| 2 | 宣言ファイルの存在を実行の前提にする hook | 撮影・スモークの入口 |
| 3 | 前回の結果を読み直す --last | テストの入口 |
| 4 | 1 本しか通さないロック | テストの入口 |
| 5 | 間引きと、走らせていない領域の一覧 | テストの入口 |
新しく作ったファイルは 2 つです。残る 3 つは、1 作目「読まない技術」の第 1 回で置いたラッパー 1 本への追記でした。5 回かけて足したのは、全部で数十行です。
確かめ方——回数・本数・範囲・手段・形跡——を実行より先に決められたのは、決めたものを置く場所が 1 本しか無かったからです。テストの入口が 3 つに割れていたら、ロックも --last も一覧も、どこへ置いても効きません。第 2 回と第 4 回の注意に書いたとおり、あれらが見ているのは、その入口を通った実行だけです。入口が 1 本になっているかどうかが、この連載の前提でした。
減らしたぶんは、どこかに出ています
序論で一つ約束しました。各回は、確認を減らす仕組みと一緒に、減らしたぶんがどこに出るかを必ず 1 つ置く。並べます。
| 回 | しなくなったこと | 代わりに、毎回出るもの |
|---|---|---|
| 1 | スクリーンショットを撮らない | 残った画像に「何を検証した画像か」の 1 文 |
| 2 | 宣言を信じない | 止めた日時と理由が、記録に 1 行 |
| 3 | テストを再実行しない | 前回の要約と、その実行日時 |
| 4 | 偽の失敗を読まない | 実行中の相手と、出口の案内 |
| 5 | 全部走らせない | 走らせていない領域が 22 行 |
確認は、一つも減っていません。 減ったのは、確認をその場で決める仕事のほうです。右の列は、私が読みに行かなくても目の前に出ます。読みに行かなくていいものだけが、確かめずに済みます。
前作の最終回に並べた「しなくなったこと」は 31 個でした。ここに 5 つ足して、36 個です。
抜け穴は、全部そのままです
各回の注意に、その仕組みの死角を書いてきました。安いか高いかを決めているのは AI 自身で、2 問の中身が正しいかは誰も見ていない(第 1 回)。hook も形しか見ないので、それらしい 1 文が入っていれば通る。しかも拾えるのは hook に名前を書いた入口だけで、私が普段叩いているラッパー 14 本は、置いた日から一度も見られていない(第 2 回)。--last はコードを変えていないときだけの近道(第 3 回)。ロックの外側に、別のクローンと CI がいる(第 4 回)。一覧は走らせ忘れを見えるようにするだけで、防ぎはしない(第 5 回)。
どれも塞いでいません。理由は第 1 回の出発点と同じで、「この検証は単体テストで済むか」の真偽を機械が決められないからです。決められない場所に判定を置こうとすると、判定する側をもう一段作ることになり、そこはまた誰かの判断になります。
そのうえで、5 つの死角には共通点があります。どれも見ていないだけで、見ているふりはしていません。 hook は中身を見ないと決めてあり、一覧は走らせていないものを毎回出します。序論に書いた「速くする工夫は、何を見ていないかを隠す」の、逆側に置いたつもりです。
数え違えていたのは、記事のほうでした
この 5 本は、もともと 1 作目の増補でした。連載として独立させたとき、前の連載の本数が動きます。3 作目の最終回には、その本数が印字されています——「命令形で書いたのはこの 3 本だけです」の前に、母数が入っている文です。私は移設の記録を書き、参照を全部張り直し、そのあと点検もしました。それでも、印字された数は 11 箇所が古いまま残っていました。 存在しない規模を、読者に渡すところでした。
見つけたのは、読み返したときではありません。記事の実物から数えて、印字された数と突き合わせる検査を置いたときです。第 5 回と同じ形でした——数えていないものを、毎回目の前に出す。
同じころ、私はもう一度間違えています。第 2 回の注意に、最初は「あとから足した入口を hook に足し忘れた」と書きました。git で見ると逆で、入口のほうが先にあり、hook は置いた日から一度もそちらを見ていませんでした。書いてから数えたので、記事に出る前に直りました。
結論
確かめない技術は、確かめ方を、その場で決めない技術です。
確認は、やるか・やらないかの二択に見えます。その下にぶら下がっている、いつ・何回・どこまで・どの手段で・どんな形跡を残すかは、二択で答えた瞬間に、その場にいる AI が埋めます。埋め方は毎回違って、変わったことに私は気づけません。
だから、決める場所を実行の前に移しました。移した先は 2 つの入口で、置いたのは指示文 1 枚と hook 1 本、あとはラッパーへの追記です。確かめ方が先に決まっていれば、確かめた結果は読まなくて済みます。
それでも、確かめる日は残ります。仕組みを置く日です。壊して、止まるべきものが止まり、通るべきものが通ることを、一度だけ確かめてください。合格条件を先に書いてから走らせれば、それも「その場で決めた確認」にはなりません。
序論で、直近のセッションで確かめるために実行した回数を数えてください、とお願いしました。そのうち、実行する前にどこまでやるかが決まっていたものは何回か。
いま同じ問いに答えると、私の手元では「走ったものは全部」になります。決まっていないものは、走り出す前に止まるからです。
各回の仕組みの置き方は序論の一覧からどうぞ。この仕組みで作られたものは typingtube で動いています。確かめなくなったぶんの時間で作った画面が、そこに並んでいます。