古い木の扉の鍵穴に、新しい真鍮の鍵が途中まで差さったまま回らない

温泉ブログ(温泉ランド.com)の横の広告枠に、楽天市場の売れ筋1位の商品を毎朝入れ替えて並べる仕組みを入れた。

部屋着の広告を手で差し替えて試したらクリックが出たので、毎日自動で入れ替えたくなった。
それで、AI(Claude)にWordPressのプラグインを作ってもらった。

今はブログの中で動いている。
ただ、最初に渡された版は、ブログに入れた瞬間に止まった。

「重大なエラーを引き起こしたため」

プラグインは、ほかのWordPressのブログでも使えるように、単体で作ってもらった。
楽天のランキングから「総合」「年代・性別」「ジャンル」を選べて、1位の商品の画像とリンクを毎朝取ってくる。

10月3日の昼、AIは1.0.0を渡してきた。
報告にはこうあった。

  • 動作を確かめる試験は132件、すべて合格
  • 別の目で見直して、16か所を直した

翌日の夜、ブログの管理画面でプラグインを有効にしようとすると、こう出た。

重大なエラーを引き起こしたため、プラグインを有効化できませんでした。

試験に全部合格していたものが、入れることすらできなかった。

試験は、WordPressの代用品の上で動いていた

AIはまず、手元のパソコンに本物のWordPressを用意して、同じ手順で有効化してみた。
すぐに同じエラーが出た。
調べ始めてから直した版を渡すまで、7分ほどだった。

原因は名前のぶつかりだった。

WordPressのウィジェット(横の枠に置く部品)には、元から「is_preview」という名前の機能が入っている。
AIは自分で作った部品の中に、同じ名前の機能を書いていた。

名前が重なると、WordPressは読み込みの途中で止まる。

では、132件の試験はなぜ通ったのか。
試験は、本物のWordPressではなく、簡単な代用品の上で動いていた。

本物は大きくて試験に持ち込むのが手間なので、必要な部品だけを中身のほぼ空の作り物に置き換えていた。
作り物には「is_preview」という名前が無い。
だから、ぶつかりようがなかった。

AIはこう書いた。

私の試験はWordPressを簡単な代わりの物で動かしていたので、このぶつかりを見逃していました。

16か所を直した見直しでも、この問題は見つかっていなかった。
コードを目で読むだけでは、本物の部品と並べたときに初めて起きる失敗は見えない。

「確かめていないこと」は、書いてあった

あとで1.0.0を渡されたときの報告を読み直すと、AIはちゃんと書いていた。

本物のWordPressでの動き:確かめたのは、WordPressの関数を差し替えた試験(132件すべて合格)だけです。

隠してはいなかった。
ただ、確かめていないと書いたまま、「アップロードして有効化してください」という手順も一緒に渡していた。

僕は試験の件数のほうを見て、そのまま入れた。
確かめれば7分で分かることを、32時間後に僕の画面で知ることになった。

本物のWordPressで試す仕組みを残した

AIは直した版と一緒に、本物のWordPressで試す仕組みを残した。
手順はこうだ。

  1. WordPress本体を公式サイトから取ってきて、手元に置く
  2. データベースの代わりに、ファイル1つで動くSQLiteという仕組みを使う。サーバー用のデータベースを入れなくても、本物のWordPressが手元で動く
  3. 試すプラグインを入れて、管理画面と同じ条件で有効化する

用意は最初の1回だけで、10分ほどかかる。
そのあとは、次の4つを毎回確かめる。

確かめること中身
有効化管理画面で有効にするのと同じ手順で、エラーが出ないか
公開ページ広告枠に商品が出るか、毎朝入れ替わるか
管理画面設定画面が開くか、保存できるか
削除止めて、消して、もう一度入れても壊れないか

楽天へのアクセスは、本物を呼ばずに作り物の返事で済ませる。
警告が1件でも出たら不合格にする。

この仕組みで、もう1つ不具合が見つかった。
設定画面を開くたびに、中身の空っぽの赤いお知らせの枠と、警告が出ていた。

代用品の上の試験では、管理画面を本当に開くことはないので、これも見つからなかったものだ。

その日の夜に作った1.1.0(記事の最後にも商品を出す版)では、代用品の上の試験が150件、本物のWordPressでの試験が62件、どちらも合格してから渡された。

それでも1回、止まった

1.1.0をサーバーに上書きしている最中に、WordPressから「致命的なエラー」のメールが1通届いた。
管理画面の部品が、新しく増えた部品を呼ぼうとして、見つからずに止まったという内容だった。

上書きが終わってから確かめると、ブログは普通に動いていて、記事の最後にも商品が出ていた。
AIの見立てでは、ファイルを順に置き換えている途中の一瞬、新しいファイルと古いファイルが混ざった状態で、管理画面への要求が1回だけ動いた。

ただ、これはAIの推定で、決め手になる記録はない。

次の版では、部品を呼ぶ前に「その部品があるか」を確かめる一行を足す予定になっている。
まだ入っていない。

手元で本物のWordPressを使って試しても、サーバーに置き換えている途中の一瞬までは再現できなかった。

プラグインを作る人、AIに作らせる人へ

  1. 「試験に全部合格」は、「入れられる」の保証ではない。試験が本物の上で動いているかを先に聞く
  2. 渡す前に、本物のWordPressで有効化まで回す。手元で10分あれば用意できる
  3. 警告も不合格にする。空の赤い枠は、警告として見つかった
  4. 自分で付ける名前は、WordPress本体が持っていそうな一般的な名前を避ける。特に、本体の部品をもとに作るときは、元の部品が持つ名前を調べる
  5. AIの報告に「確かめていないこと」があったら、それを確かめてから受け取る

分かったこと

132という数字は、たしかに安心感があった。
でも、試験の数は、何の上で試したかを教えてくれない。

代用品の上で132回合格するより、本物の上で1回有効化するほうが、この場合は意味があった。

AIは正直に「確かめていない」と書いていた。
その一行を読み飛ばしたのは僕だった。

今は、プラグインを受け取る前に、本物のWordPressでの結果も一緒に出してもらっている。