AIに手順書や社内向けの説明を書かせた。読むと筋は通っている。けれど、このまま社内に出してよいのか、確信が持てない。そういう人へ。
AIの文章には「もっともらしい誤り」が混ざります。厄介なのは、読んで確かめても見つからず、実際に動かして初めて見つかる種類がある、ということです。 このサイトの記事はAIに書かせています。今日、別のAIに検証環境を作らせて記事の手順を再現させたところ、記述の誤りが5つ出ました。読み終えると、同じ確かめ方を自分の会社で小さく回せます。
- この記事で出来ること
- AIに書かせた手順書を、配る前に「書いた当人ではない誰かに実際にやらせる」形で確かめられる
- 前提
- 専門知識は不要。検証環境を自分で作る場合だけ、Dockerが動くパソコンが1台要る
- 所要時間
- 読むのに10分。確認表を1本の手順書に当てるのに30分〜半日
先に結論:私ならこうします
- AIに書かせた手順書は、書いた当人ではない誰か(別の担当か、別のAI)に実際にやらせてから配る。
- 検証環境を作れない物は、公式の文書か、業者の検証結果に当たる。
- 同じAIの同じ会話に「合ってる?」と聞いて済ませない。今回の5つは、書いたAI自身は1つも疑っていませんでした。
1. 何をしたか
このサイトは、AIのコーディング支援ツールと、その上で動かす複数のエージェントの分業で作っています。役割は4つに分けました。
| 役 | やること |
|---|---|
| 書く役 | 公式の文書を出典に、記事を書く |
| 再現して撮る役 | 検証環境を作り、記事の手順と場面を実際に動かし、出力を保存する。記事には触らない |
| 読者になりきって判定する役 | 「用語は初耳、焦っている、スマホ」の読者として読み、5つの問いで合否を付ける |
| 事実を確かめる役 | 記事の中の出力と保存した出力を機械的に突き合わせ、数字と引用を原文で確認する |
決まりは1つ、書いた本人に検証させないことです。再現する役には記事を直す権限を与えず、「記事と違っていた点」を報告させました。
検証環境は、アカウントの登録が要らない物だけで組みました。Dockerの上に、DNSサーバ(親・旧・新)とキャッシュDNS、メールサーバ、Webサーバ、取引先の送信サーバ役。別に、LinuxのRAID 1と、Sambaのファイルサーバ。アドレスは文書用の 192.0.2.0/24、ドメインは example.jp で、外のDNSには問い合わせません。
2. 見つかった5つの誤り
① 「エラーが送信者に返る」→ 実際は、何も返らず保留されていた
AIが書いた文: ネームサーバーの切り替えでMX(メールの届け先)を写し忘れた場面で、「Webサーバがメールを受けなければ送り主にエラーが返り」。
検証環境で起きたこと: 送信サーバ(Postfix)のログはこうでした。
lab$ grep -E "status=" /var/log/mail.log | tail -3
(中略)
Sep 20 11:08:24 client postfix/smtp[364]: 194C540AE6: to=<info@example.jp>, relay=none, delay=0.01, delays=0/0/0/0, dsn=4.4.1, status=deferred (connect to example.jp[192.0.2.80]:25: Connection refused)
Sep 20 11:09:02 client postfix/smtp[364]: 194C540AE6: to=<info@example.jp>, relay=mail.example.jp[192.0.2.22]:25, delay=38, delays=38/0/0.01/0.03, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 2EE6C42D4D)
1行目が status=deferred(保留)。メールは送信側の待ち行列に残り、送り主には何も返っていません。MXを直した後の2行目で、同じ1通(194C540AE6)が新しいサーバへ status=sent になっています。後から届いたわけです。Postfixが保留を続ける日数の既定値は5日です(postconf の maximal_queue_lifetime)。送り主に即座に不達通知が返ったのは、MXもAレコードも無い場合だけでした。
![MXが空でAレコードだけが返る dig の出力と、Postfixのログ「connect to example.jp[192.0.2.80]:25: Connection refused」「status=deferred」、mailqに1通残っている様子](/shots/mail-not-arriving-after-ns-change/03-fallback-to-a-deferred.webp)
なぜ読んでも気づけなかったか: 「届かなければエラーが返る」は日常の感覚に合っていて、文として不自然な所がありません。RFC 5321 が再送を数日続けるよう求めていることを知っていても、この1文と結び付けて疑うのは難しい。しかも意味が逆になります。「エラーが来ないから届いているはず」と取引先が思い込む数日間が、いちばん危ない。
直した文: 「Webサーバが25番を閉じていれば、相手のメールサーバは配送を保留にして、数日間、再送を続けます。その間、送り主には何も返りません。裏を返せば、この間にMXを直せば、保留されていたメールは後から届きます」
② 「無い」という答えも覚えられている、が抜けていた
AIが書いた文: TTL(DNSの答えを覚えておく秒数)の説明はありました。ただ、「MXを足した直後に、まだ見えない」場面の説明がありませんでした。誤りというより、欠落です。
検証環境で起きたこと: 新しいネームサーバーにMXを足した3秒後、キャッシュDNSの答えはこうでした。
lab$ date "+%H:%M:%S"; dig +noall +answer +authority example.jp MX
11:08:32
example.jp. 6 IN SOA ns1.new-dns.example. hostmaster.lab.example. 2026092101 3600 600 86400 60
lab$ date "+%H:%M:%S"; dig +noall +answer +authority example.jp MX
11:08:45
example.jp. 120 IN MX 10 mail.example.jp.
1回目はMXではなくSOAの行が返っています。「MXは無い」という答えを、あと6秒覚えている、という意味です(RFC 2308 のネガティブキャッシュ)。13秒後にMXが見えました。検証環境は60秒に設定しましたが、実際のDNSではもっと長いことがあります。

なぜ気づけなかったか: 書かれていない事は、読んでも見つかりません。手順どおりに動かして「足したのに見えない」に自分でぶつかって、初めて欠落だと分かります。現場では、ここで慌てて設定を何度も書き換える事故になります。
直した文: 「慌てて設定を書き換えないでください。『無い』という答えも、一定時間キャッシュされます。新しいネームサーバーに直接聞いて入っていれば、あとは待つだけです」
③ アカウントを止めても、開いていた接続は生きていた
AIが書いた文: 退職者の処理で「②サインインを止める」。停止は戻せるので先に止める、で終わっていました。
検証環境で起きたこと: Sambaで、利用者の接続を1本開いたままにして、その間にアカウントを無効にしました。
lab$ smbclient //localhost/share -A /lab/auth/tanaka -c 'ls'
session setup failed: NT_STATUS_ACCOUNT_DISABLED
新しい接続は拒否されます。ところが、無効にする前から開いていた接続では、無効にした後も、フォルダの一覧とファイルの取り出しが通りました。

なぜ気づけなかったか: 「止めた」の後に何が残るかは、止めてみないと見えません。読む側も「止めれば止まる」と思って読みます。
直した文: 「止めた後、開いたままの接続を切るところまでが②です」。ただし、これは単体のSambaでの結果です。Windows Server や Active Directory、各社のNASでは確かめていないので、記事にも「検証環境のSambaでは」と断って書きました。
④ 「3行とも入れよう」と書いたサイト自身に、DMARCが無かった
AIが書いた文: 別の記事で「SPF・DKIM・DMARCの3行を入れる」。
検証で起きたこと: 再現する役が、このサイトのドメインを外から引きました。
lab$ dig +noall +comments _dmarc.it-techo.com TXT | grep status
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 759
NXDOMAIN、つまり、その行が存在しない。勧めている当のサイトが、2行目までしか入れていませんでした。その日のうちにDMARCの行を足し、記事には足した後の出力を載せています。
なぜ気づけなかったか: 記事の文は正しいからです。誤っていたのは文章ではなく足元で、文章をいくら読んでも出てきません。「自分の環境に同じコマンドを打つ」を検証の項目に入れていたから見つかりました。
⑤ 「名前も住所も出ない」→ 国と都道府県は出ていた
AIが書いた文: ドメインの登録情報の代理公開について、「自分の名前も住所も出ません」。
検証で起きたこと: このサイトのドメインをRDAP(WHOISの後継)で引くと、登録者の氏名は DATA REDACTED、番地・市区町村・郵便番号も伏せられていました。ただし、国と都道府県の欄には値が入っていました。ICANNの方針で、伏せない項目です。

なぜ気づけなかったか: 「概ね正しい」からです。ほとんど正しい文は、疑う気が起きません。けれど、自宅の住所で登録する人にとって、都道府県が出るかどうかは小さな話ではありません。
直した文: 「登録者の欄に自分の名前も番地も出ません。ただし国と都道府県までは表示されます」
3. 読者になりきる役が落とした6本
誤りとは別の話ですが、同じ日の結果なので書いておきます。読者になりきって判定する役は、14本のうち6本を「上から読むだけでは、今やることが分からない」で不合格にしました。型は1つで、コマンドを打てる前提で始まり、打てない人・管理画面に入れない人の道が記事の後ろにある。書く役は技術的に正しい順に書き、焦っている人が読む順には書いていませんでした。事実の誤りではないので、事実を確かめる役には見つけられない種類の欠点です。
4. つまずいた所
検証環境づくりも、すんなりは行きませんでした。
- MacのDockerでは、RAIDが組めなかった。 Docker Desktop が使うLinuxのカーネルに、ソフトウェアRAID(md)の機能が入っていませんでした。コンテナの中でQEMUを動かし、Alpine Linux の本物のカーネルを起動して、その中で mdadm を使う形に変えています。1回の通しは2〜3分です。
- クラウド同期のフォルダの下では、bind mount が固まった。 作業フォルダがクラウド同期の配下にあり、設定ファイルをコンテナに見せる方法(bind mount)が止まりました。設定はすべてイメージに焼き、切り替えるファイルだけを Docker のボリュームにコピーする形にしています。
検証環境にも限界があります。故障は論理的に起こした物で、物理的な故障ではない。Sambaは単体で、Active Directory ではない。再現できなかった事は「再現していない」と、検証環境の説明書きに残しました。
5. 小さな会社で真似するなら
私ならこうします。
- AIに書かせた手順書は、配る前に、別の担当か別のAIに「実際にやらせる」。 読ませるのではなく、やらせる。詰まった所、書いてある結果と違った所を報告してもらう。今回の5つのうち①②③は、やって初めて出ました。
- 検証環境を作れない物は、公式の文書か、業者の検証結果に当たる。 基幹のサーバや契約中のクラウドで試すわけにはいきません。「この手順は検証済みですか。どの版で、いつ」と業者に聞くのは、失礼ではありません。
- 自分の環境に同じ確認のコマンドを打つ。 ④と⑤は、検証環境ではなく、自分のドメインを外から引いて出ました。見るだけのコマンドなら、何も壊れません。
- AIの判定を最終判断にしない。 読者になりきる役の「合格」は、人間の読者の合格ではありません。社内に出すかどうかを決めるのは、出した後に問い合わせを受ける人です。
- 再現できなかった事は「未確認」と書いて残す。 確かめた範囲を書いておけば、次に確かめる人がそこから始められます。
やめたほうがいいのは、次の2つです。
- AIの出力を、そのまま社内手順にする。文が整っていることと、合っていることは別です。
- 書いた当人(同じAIの同じ会話)に「合ってる?」と聞いて済ませる。自分の文脈の中で読み直すだけで、動かしてはいません。今回、書く役は5つのどれも自分からは疑いませんでした。
6. 確認表:自社で回すための5項目
AIに書かせた手順書1本ごとに、配る前に埋めます。
| # | 確かめること | 結果 | 確かめた人・日付 |
|---|---|---|---|
| 1 | 書いた当人ではない人かAIが、手順を最初から最後まで実際にやったか | ||
| 2 | 手順に書いてある結果(画面・出力)と、実際の結果が一致したか。違った所はどこか | ||
| 3 | 試せなかった手順について、公式の文書か業者の検証結果を確認したか(URL・版・日付) | ||
| 4 | 自社の環境で、見るだけの確認(設定の一覧、dig など)を実際に打ったか | ||
| 5 | 確かめられなかった事を「未確認」として手順書に書き残したか |
誤りが見つかった記事
どれも、上の内容を反映して直してあります。
- ①②: ネームサーバーを切り替えたらメールが届かなくなった
- ③: 退職者のアカウント処理の一覧表
- ④: SPF・DKIM・DMARCはこの3行を入れる
- ⑤: ドメインをどこで登録するかと、登録情報の代理公開
- 食い違いが出なかった記事: RAIDはバックアップではない、SPFが2行ある、共有フォルダの権限設計