本番確認を公開します ── 20回の確認で止まったのは7ページ、本当の不具合はスマホの幅の1ページだった
(一体記事・2026-10-12・表6・実物3)
結論
push のあとに、公開中のページを1ページずつ確かめるツール「本番確認」を公開します。本番確認は、公開したページが正しく出ているかの確認です。ぼくは2026年9月27日に、この作業をスクリプトにしました。10月10日までの記録に残る20回(のべ502ページ)で、止めたのは7ページです。そのうち本当の不具合は1ページで、スマホの幅で、押す部分の高さが足りませんでした。確かめたページの中に、本番に出ていなかったページはありませんでした。
| やったこと | 結果 | つまずき |
|---|---|---|
| push のあとに、公開中のページを確かめた(2026年9月28日〜10月10日・20回) | のべ502ページのうち、止めたのは7ページ | 7ページのうち6ページは、確かめる側が誤って止めた |
| 止めた7ページを、本当の不具合か、誤って止めたかで分けた | 本当の不具合1ページ(スマホの幅の押す部分)・誤って止めた6ページ | 誤って止めた6ページは、どれも9月28日の1回に出た |
| 内部版から公開版を切り出し、作ったばかりのリポジトリと、ぼくのサイトで試した(10月11日) | 止まる回4回は終了コード 1、通る回2回は終了コード 0 | 内部版は、main とカードの値の読み方・ヘッダーとロゴの名前が、ぼくのサイトの書き方に合わせてあった。公開版で直した |
本番確認で見ているもの
push が通っても、公開の仕組みの build(公開するページを組み立てる処理)が終わるまで、本番のページは変わりません。本番確認は、その build のあとに、公開中のページを1ページずつ開いて確かめます。
| 列 | 見るもの |
|---|---|
| a 開けるか | ページが開けるか(応答が 200 か)。手元の出力を渡したときは、本文(main の中)が手元と同じになったかも。そろわなければ30秒おきに最大3分待ち、それでもそろわなければ「未」 |
| b OG | SNS のカードに使う3つの値(題名・説明・画像)があり、画像が開けるか |
| c 画像 | スマホの幅で読んだ画像のうち、いちばん大きい1枚が上限(300KB)以下か |
| d 出したくない語 | 内部版だけ。ページの全文に、出したくない語が無いか |
| e 390px | スマホの幅(390px)で、横スクロール・16px 未満の文字・幅より広い要素・ヘッダーが見出しに重なる・押す部分が 44px 未満・明度差 4.5 未満の6項目が全部 0 か |
1つでも × か「未」があれば、止まります。直すのは人です。
20回の記録
内部版は、確かめた結果を、○ でも × でも1行ずつ記録のファイルに残しています。10月10日までに20行ありました。
| 回の種類 | 回数 | のべページ |
|---|---|---|
| サイトの全ページを見た回(46〜50ページ) | 10 | 480 |
| 一部のページだけを見た回(1〜6ページ) | 10 | 22 |
| 合計(2026年9月28日〜10月10日) | 20 | 502 |
止めたのは、20回のうち2回です。
| 日時 | 見たページ | 止めたページ | 本当の不具合か、誤って止めたか |
|---|---|---|---|
| 2026-09-28 19:08 | 46 | 6(出したくない語 5・本文の比べ方 1) | 6ページとも誤って止めた |
| 2026-10-02 04:59 | 48 | 1(スマホの幅の押す部分) | 本当の不具合 |
残りの18回は、全部のページが ○ でした。
20回に含めていないものが2つあります。9月27日の初回は、結果の書き方に穴が見つかり、その日の手元の変更ごと捨てたので、結果が残っていません(書き先を作り直したのは翌日の9月28日です)。記録を残さない試しの回は、回数も結果も残らない作りです。
本当の不具合だった1ページ(10月2日)
10月2日の4時57分に、解剖 02 ── 毎朝の自動実行が「合っているか」を確かめる仕組みの構造の末尾にある箇条3行を、行まるごとのリンクにして push しました。4時59分の本番確認で、このページだけが止まりました。
実物1: 10月2日4時59分の記録の、要約と詳細(原文)
× 1/48 ページ(2026-10-02 04:59)
/kousei/morning-receipt/ e: 押す部分が 44px 未満 1
文の中の語のリンクは、この項目では数えません。箇条の1行がまるごとリンクだと、押す部分は、その行の高さか幅になります。足りなかったリンクの数は1つでした(どのリンクかは、記録に残していません)。
5時01分に、リンクを文の中の語2か所に置き直し、行まるごとのリンク3本は元の字に戻して push しました。同じ5時01分に、このページだけを確かめ直して通りました。止まってから、およそ3分です。
誤って止めた6ページ(9月28日)
9月28日の19時08分は、サイトを組み立てる仕組みを変えた push のあとで、公開中の46ページ全部を見た回です。6ページで止まり、6ページとも、確かめる側が誤って止めたページでした。
5ページは、d(出したくない語)の確かめでした。読者向けの文にも普通に出てくる語と、ほかの語の一部に当たる短い英字の語を、出したくない語に入れていたためです。中身は出したくない語スキャンを公開します(2026年10月5日)に書きました。
残りの1ページは、a の本文の比べ方の誤りでした。そのページの本文には、問い合わせ用のメールアドレスが1つあります。ぼくのサイトは Cloudflare Pages で出していて、独自ドメインでは、Cloudflare のメール保護(Email Address Obfuscation。ページの中のメールアドレスを、ボットに読まれにくい形のリンクに書き換える機能)が、そのアドレスを書き換えていました。手元の出力と一字も同じにならないので、3分待っても「未」のままでした。ページそのものは、本番に出ていました。
Cloudflare の説明では、この機能は登録したときに自動で有効になります。ドメインごとの設定です。同じページを、Cloudflare Pages が最初に付けるアドレス(pages.dev)で開くと、アドレスは書き換わっていませんでした(2026年10月11日に確かめた)。
実物2: 10月11日に、独自ドメインのページから取り出した、書き換え後のリンク(属性の値の長い文字列は「…」で略した)
<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="…">[email protected]</a>
直し方は、比べる前に、手元と本番の両方の本文から、@ を含む語と、メール保護のリンクを外すことにしました。19時26分に、止まった6ページだけを確かめ直して、6ページとも通りました。最初の止まりから18分です。
確かめたページの中で、本番に出ていなかったページはありませんでした。本番確認を作る前の9月24日には、Cloudflare Pages の build が途中で失敗したことが1回あります(やり直しで直りました)。
内部版から公開版へ
内部版は、ぼくのサイトの書き方に合わせて作っていました。公開版では、ほかのサイトでも使えるように、次を変えました。
| もの | 内部版 | 公開版 |
|---|---|---|
| 確かめるページ | 直前の push で変わった原稿から決める | 渡した URL の一覧か、sitemap.xml(サイトのページの一覧を書いたファイル)の全ページ |
| サイトの URL | ぼくのサイトに固定 | 引数で渡す |
| main の読み方 | 属性の無い main だけ | 属性つきの main も読む |
| カードの3つの値の読み方 | 属性が決まった順に並ぶ書き方だけ | 属性の順によらず読む |
| ヘッダーの重なり | ぼくのサイトのヘッダーの名前に固定 | ヘッダーを指定したときだけ見る |
| ヘッダーのロゴ | 画像の大きさに数えない | 外す扱いをやめ、全部数える |
ほかに、d(出したくない語)・画像の上限を build の設定から読む作り・朝の自動実行に結果を渡す仕組みを外しました。記録のファイルは、渡したときだけ書きます。
公開版で確かめたこと
10月11日に、公開版を7回走らせました。止まる回と通る回の両方です。
| 回 | 何に | 結果 |
|---|---|---|
| 1 | 作ったばかりのリポジトリ(push 先なし)で、手元で配った架空のサイト(2ページ)に、その出力を渡した | 2ページとも ○・終了コード 0 |
| 2 | 同じリポジトリで、手元の出力を1字変えた(/posts/hello/ だけを渡した) | 3分待って「未」・終了コード 1 |
| 3 | カードの説明(og:description)を消した架空のページ | b が ×・終了コード 1 |
| 4 | 画像の上限を 0KB で渡した | 画像のあるページの c が ×・終了コード 1 |
| 5 | Playwright(Python からブラウザを動かす部品。c と e で Chromium というブラウザを動かす)を入れていない環境 | 1行の知らせ・終了コード 2 |
| 6 | 配布先のリポジトリのフォルダから、このサイト(sitemap.xml の51ページ)に、手元の出力を渡した | 1ページ(note転載キットを公開します ── 初めて使った日、AIの「そろっています」の下に空白が2つあった)が「未」・終了コード 1 |
| 7 | 同じことを、手元の出力を作り直してもう一度 | 51ページとも ○・終了コード 0 |
6回目の「未」は、手元の出力が本番より古かったためです。手元の出力は、その日の17時18分に push した版から作っていました。走らせる2分前の18時17分に、別の作業で、ほかの記事(note転載キットを公開します ── 初めて使った日、AIの「そろっています」の下に空白が2つあった)に追記を1段足した版が push されていて、本番はその追記の入った版になっていました。出力の詳細に出た最初の違いの場所も、その追記の頭(本番「追記(2026年10月11日): …」)でした。手元の出力をその版から作り直した7回目は、51ページとも ○ でした。
実物3: 2回目の出力(抜粋。表の1行と、詳細の1行〈行の頭の「- 」は外した〉と、最後の1行)
| /posts/hello/ | 未 | 未 | 未 | 未 |
/posts/hello/ a: 3分待ってもそろわない。200 だが <main> が手元の出力と違う。最初の違いは 27字目のあたり: 本番「/h1> <p>まめ太が、棚を1つ作った日の記録です(架空)。</p> <h2 」/手元「/h1> <p>まめ太が、棚を2つ作った日の記録です(架空)。</p> <h2 」
[prod_check] 1ページのうち 1ページで止まった(未 1・× 0)(2026-10-11 18:18・Chromium 起動せず)
「未」のページはブラウザで開かないので、最後の行の Chromium の版は「起動せず」になります。
6回目と7回目の51ページには、9月28日に「未」で止めた、メールアドレスのあるページも入っています。今の比べ方では、2回とも ○ でした。
配布物と、できないこと
配布先は GitHub の haif-tools。中身は本体(prod_check.py)・スマホの幅の6項目の判定(check_390.js)・架空のサイト(2ページ)・README の4つです。使い方は①Playwright と Chromium を入れる ②push して、build が終わるころに、サイトの URL と手元の出力を渡して走らせる ③止まったら詳細を見て直し、止まったページだけをもう一度確かめる。
できないこと: 「未」は、build の失敗と遅れを見分けません。手元の出力と比べるのは main の中だけです。見た目と、SNS のカードの出方は見ません。スマホの幅は 390px だけです。出したくない語は見ません。外れた所は直さず、push を止める設定も入っていません。公開中のサイトで確かめたのは、Cloudflare Pages で出しているぼくのサイトだけで、環境は macOS だけです。詳しくはツールページに書きました。
この記事のツール
- 配布物(GitHub): github.com/mhitori/haif-tools/tools/prod-check
- ツールページ: 本番確認
- push の前に使うツール: 出したくない語スキャン
この記事について
同じところで詰まった、ここが分からなかった、があれば聞かせてください。次の記事の材料にします。ツールを使って詰まった場合は、リポジトリのIssueでも受け付けています。
Xで返信する →