AIに本番反映を任せたら、35ページが別のページで上書きされた|環境をまたぐ照合に連番IDを使ってはいけない
ローカルでは全ページ問題なかった。
本番に出した直後、35ページが別のページの中身に化けていた。
原因は、環境をまたいで auto_increment の主キーを信じたことだった。
このサイトのデザインを全面的に作り直して、今日の午前中に本番へ反映した。
ローカル環境では全ページ確認済みで、問題は一つも残っていなかった。
反映した直後、本番の35ページが「まったく別のページの中身」に上書きされていた。
原因は単純で、しかも誰でも踏む種類のものだったので、忘れないうちに書いておく。
ローカルで完璧だったものが、本番で35ページ分化けた
この CMS では、ページの本体がデータベースのテーブルに1行ずつ入っている。
各行には page_id という連番の主キーが付いていて、これは行を挿入した順に自動で増えていく、いわゆる auto_increment の代理キーだ。
移行の作業は、乱暴に言えば「ローカルの35番の内容を、本番の35番へ入れる」という置き換えになる。
自分はそのやり方で指示を出した。
結果として、スポット一覧のページにトップページ用の内容が入り、掲示板のページに開発日記が入った。
本番でしか存在しないページが、ローカルの別ページで塗り潰された形になる。
原因は、環境をまたいで連番IDを信じたこと
ローカルと本番は、半年ものあいだ別々に動いてきた。
ローカルでは検証用のページを作っては消し、本番では実際のコンテンツが増えていく。
auto_increment は、それぞれの環境で独立に進む。
つまり page_id = 35 という値は、「35番目に作られた行」という以上の意味を持っていない。
どちらの環境でも35は35だが、それが同じものを指す保証はどこにもない。
代理キーは、あくまでその1つのデータベースの中でだけ一意なものだ。
正しい照合キーは、そのデータに内在する自然キーのほうになる。
このケースなら page_path、つまり /spots/ のような URL のパスだ。
これは環境が違っても同じページを指すし、人間が見て意味が分かる。
復旧は、バックアップから戻したうえで、照合キーを page_id から page_path に引き直して流し直す形で片付いた。
作業そのものは30分ほどで終わる。
厄介なのは、事故に気づくまでの時間のほうだった。
AIは、間違った指示をためらわずに完遂する
この作業の大半は Claude にやらせている。
そしてこの事故で一番考えさせられたのが、その部分だった。
AI は、自分が出した指示のとおりに35件を正確に処理した。
取りこぼしは一件もない。
処理の速度も申し分ない。
ただ、途中で「この2つは同じページですか」とは聞かれなかった。
人に頼んでいたら、たぶん手が止まったと思う。
「スポット一覧にトップページの中身が入ることになりますが」と一度は確認されたはずだ。
その一言が無い代わりに、間違いが完璧な精度で実行される。
速度と正確さは、向かう先が正しいときだけ味方になる。
だから、指示を出す側の責任の重心が変わってきていると感じる。
手を動かす速さではなく、「その照合キーで本当にいいのか」を問う側に寄ってきている。
「HTTP 200 が返る」は検証になっていなかった
もう一つ、検証の設計を間違えていた。
反映後、自分は全ページに対して到達確認をしていた。
すべて 200 が返ってきたので、正常だと判断した。
ページのタイトルも照合した。
それでも、掲示板と開発日記が入れ替わっている状態は素通りしてしまった。
ページは正しく表示される。
タイトルはテンプレート側から出ていたので、中身とは無関係に正しく出る。
壊れていたのは本文だけだった。
いま採っている確認方法は、ページ種別ごとに固有のクラス名を決めておいて、その出現数まで数えるやり方だ。
掲示板のページなら bbs_ で始まるクラスが何個出るか、連載ページなら series_ が何個か。
本文の作りが別物になっていれば、この数がゼロになるので機械的に検出できる。
目視で56ページを見比べるより、こちらのほうが速いし確実だった。
恒久ルールにしたこと
同じことを繰り返さないために、3つをルールとして書いて残した。
1つ目、環境をまたぐ照合に auto_increment の主キーを使わない。自然キーで突き合わせる。使えそうな自然キーが無いときは、移行用の識別子を先に用意してから作業に入る。
2つ目、反映後の検証は到達確認とタイトルで終わらせない。本文の作りが目的のものかどうかを、機械的に数えられる形まで落とし込む。
3つ目、本番反映の最中はローカル側を一切触らない。直したくなる場面は必ず来るが、触った瞬間に「ローカルと本番のどちらが正しいのか」が分からなくなって、切り分けができなくなる。
どれも、文字にしてしまえば当たり前のことばかりだ。
当たり前のことを、一度壊してからでないと書けなかった。
AI に任せる範囲が広がるほど、この種の「前提の確認」だけは手放せなくなると思う。
ほかにも書いています
note・スタンプ※noteは運営者が個人で書いているものです。
