サイトのトップを転送する作業で、AIが「実物と照合済み」と書いた手順書が、着手前の数秒の測定で7件ズレました

転職用のポートフォリオとして、個人でWebアプリ「Hubpin」を作っています。
制作の経緯は「Hubpin 開発記録」に時系列でまとめています。
設計と判断は自分で行い、実装も原則自分で書いています。AIには手順書・レビュー・調査を任せています。

公開にあたって、自分のドメインのトップページを新しいアプリへ転送する作業がありました。
サーバーの設定ファイルに1行足すだけです。

その1行のために、AIに手順書を書いてもらいました。
手順書には「実物を読んで書いた」と明記されていました。
罠を16件洗い出し、コードを開いて確認し、机上の計画には無かった罠も2件見つけてありました。
手順書は念入りに見えました。

着手前に、手順書を書いたAIとは別の、作業側で使っているAIが外からサーバーの状態を測るコマンドを打ちました。
20本、かかったのは数秒です。

手順書と、7件ズレていました。

目次

数秒で出た7件

手順書の記載 実物
1 同じ場所に同居しているのは自作ツール2つ 10パス以上(クライアント案件を含む)
2 触ってはいけないDNSレコードは11本 37本
3 認証の記載なし 4箇所に認証がかかっていた
4 完了条件「このパスが200を返すこと」 403が正常だった
5 「転送の設定を持っていることがある」(一般論) 転送の設定が実在して動いていた
6 SSLの記載なし 全ドメインでHTTPからHTTPSへの転送が効いていた
7 同居はドメイン直下だけ サブドメインにクライアントのテストサイトがあった

手順書が嘘を書いたわけではありません。
参照した棚卸しの文書が古く、書かれた時点では正しかったものが、3ヶ月半のあいだに実物のほうが動いていました。

一番効いたのは1番です。
変更対象のディレクトリに何が同居しているかを、自分も把握し切れていませんでした。
そこには、ポートフォリオに掲載している実案件のURLも含まれています。
設定を1行書き間違えると、クライアント案件と就活の資産が同時に落ちる構造でした。

測るコストと、外したときの損失が釣り合っていませんでした。
数秒を惜しんだ先にあったのは、それです。

「照合済み」の照合先は、コードだった

なぜズレたのか。

AIが照合したのはリポジトリのコードで、これから変更を加える対象であるサーバーは見ていませんでした。
変更するのはサーバーの設定ファイルで、確認したのはアプリのコード。
同じ「実物」という言葉で、違うものを指していました。

「実物と照合済み」と書いてあっても、何を実物と呼んでいるのかを聞いていませんでした。

判定基準を「200」から「変更前と同じ値」に変えた

7件のうち4番は、検証の書き方そのものを変えることになりました。

最初の手順書の検証はこうでした。

/tool-a/ が 200 であること
/assets/ が 200 であること

成功は200。
入門で最初に覚えるので、自分も疑わずに読んでいました。

実際に測ったら、4箇所で誤判定する書き方でした。

パス 実測 200を期待すると
/assets/ 403(一覧表示の禁止) 正常なのに「壊れた」と読む
認証つきの3箇所 401(認証待ち) 同上

直し方は、AIから2つ提示されました。

  • A: 個別に覚える。「ここは403が正常」「ここは401が正常」と手順書に書く
  • B: 判定基準を変える。「変更前と同じ値が返ること」にする

AIはBを勧め、自分もそれで進めることにしました。
覚えるべきことが全部消えます。

認証が1つ増えても手順書は嘘になりません。
棚卸しが古くなっても壊れません。
増えるのは「変更前に測る」という一手間だけで、それは数秒です。

Aを選んでいたら、手順書に例外リストが育ち続けていたと思います。
覚え漏れた分だけ穴になる方式です。

Bは「何が正常か」を知らなくてよくなる書き方でした。
ただし、変更前の値が取れる作業でしか使えません。
新規構築には使えないので、一般化しすぎないようにしています。

「戻せる?」と聞いたら、手順書に無い前提が3つ出た

7件を反映して、いよいよ1行足す直前になりました。
そこで、自分から聞きました。

「元のページの内容は保存されている? 復元しようと思えばできる?
いつかこの作品を削除することになった時に、今の構成に戻せる?」

答えは「できます」で合っていました。
でもAIが推測で答えずに実測したので、手順書に書いていない前提が3つ出てきました。

1. その設定ファイルは、サーバー上にしか無かった

場所 ある?
本番サーバー ここだけ
手元 無い
GitHub 無い(バージョン管理の外)

サイト本体は3重に残っています。
でも、この設定ファイルだけは世界に1つしかありませんでした。
壊したら復元元が無い。

「触る前に控えを取る」は最初から手順書に書いてありました。
でも「控えが唯一の保険になる」ことは書いていませんでした。
重みがまるで違います。

2. 中身は2種類だと思っていたが、3種類目があった

外から観察して、2種類の設定が入っていると推定されていました。
3種類目は、別のリポジトリの README に書いてありました。

「この設定ファイルで、リポジトリの管理フォルダへのアクセスは404にしている」

セキュリティ設定でした。
知らずに書き換えていたら、リポジトリの中身が外から見える状態に戻していました。

3つの中でいちばん実害が大きいのがこれです。
そして書いたのは、過去の自分でした。

3. 転送を入れても、直接ファイル名を叩くと元のページが見える

指定した書き方はトップだけにマッチします。
だから /index.html を直接叩くと、元のページがそのまま見え続けます。

元ページの確認に使える利点でもあり、検索エンジンには重複ページに見える欠点でもあります。
検証項目を決める前に知っておきたいことでした。

3つとも「開いた後では遅い」前提だった

  • 1は、控えを取る前に知っておくこと
  • 2は、書き換える前に知っておくこと
  • 3は、検証項目を決める前に知っておくこと

そして3つとも、この作業の手順書には書いていませんでした。
出どころは、別のプロジェクトの README でした。

触る対象が別プロジェクトの成果物なら、そのプロジェクトのドキュメントが一次情報です。
この作業の手順書をいくら読み返しても出てきません。

聞いたのは「戻せるか」で、出てきたのは「壊す側の前提」でした。
質問に答えてもらうために調べたら、質問と関係ないものが出た形です。

手順書があったから止まれた

結論は「AIの手順書は当てにならない」ではありません。

手順書があったから、着手前に測るという段取りが取れました。
罠を「断定していない」書き方にしてあったので、実物と違っても詰まらずに済んだ場面もあります。

文書は古くなります。
古くなることを前提に、着手時に測る。
数秒で済むものは、惜しまない。

そして「照合済み」と書いてあったら、何と照合したかを自分が聞く。
その一言で、7件のうちいくつかは手順書の段階で出ていたと思います。

目次