[{"data":1,"prerenderedAt":347},["ShallowReactive",2],{"content-/blog-payload-null-rerun":3,"all-pages-for-dir":345,"og-image-/blog-payload-null-rerun":346},{"id":4,"title":5,"body":6,"category":326,"description":327,"extension":328,"meta":329,"navigation":285,"ogImage":330,"path":331,"project_name":332,"published":333,"publishedAt":334,"seo":335,"stem":336,"tags":337,"todo":330,"unpublished":333,"updatedAt":330,"__hash__":344},"pages/2026-06/2026-06-23/blog-payload-null-rerun.md","/blog ページの payload null 化が再発した話 — 再デプロイで直したが原因は特定できず",{"type":7,"value":8,"toc":315},"minimark",[9,13,22,45,54,57,72,95,98,108,111,121,130,154,161,165,176,186,189,192,216,225,229,238,241,271,274,312],[10,11,12],"h2",{"id":12},"起きたこと",[14,15,16,17,21],"p",{},"朝 ",[18,19,20],"code",{},"https://log.eurekapu.com/blog/"," を開くと、記事一覧が一瞬だけ映って空っぽになった。記事リンクが見える時間は 100ms あるかないかで、目を凝らさないと気づかない。",[14,23,24,25,28,29,32,33,36,37,40,41,44],{},"「前にも同じことがあった」と直感した。2026-06-04 に踏んだ payload null 化と同じ症状だ。あのときは ",[18,26,27],{},"useBlogArticles.ts"," で ",[18,30,31],{},"queryCollection().all()"," の戻り値をそのまま返していて、Cloudflare Pages にデプロイされた ",[18,34,35],{},"_payload.json"," の該当 slot が ",[18,38,39],{},"null"," に化けていた。プロジェクトの ",[18,42,43],{},".claude/rules/nuxt-content-payload-null.md"," に対策と検出方法を書き残してあるはずだ。",[14,46,47,48,50,51,53],{},"直感どおりだった。今回も ",[18,49,35],{}," が ",[18,52,39],{}," を吐いていた。",[10,55,56],{"id":56},"切り分け",[14,58,59,60,63,64,67,68,71],{},"まず SSR と CSR を別々に観察した。Claude Code に ",[18,61,62],{},"curl"," で HTML を引いてもらい、",[18,65,66],{},"a.article-link"," の出現数と ",[18,69,70],{},"current-month"," のラベルを数える。",[73,74,75,79],"ul",{},[76,77,78],"li",{},"SSR HTML: 記事リンク 208 件、当月ラベル「2026年6月」。正しい。",[76,80,81,83,84,87,88,91,92,94],{},[18,82,35],{},": ",[18,85,86],{},"blog-public-articles"," と ",[18,89,90],{},"og-blog-index"," の両方の slot が ",[18,93,39],{},"。完全に化けている。",[14,96,97],{},"SSR は当月分の記事を吐けているのに、CSR で hydration するときに参照する payload は空っぽだった。だから一瞬だけ正しい DOM が見えてから、Vue が CSR で「データが空だから」と表示を消しにいく。2026-06-04 と教科書どおり同じ流れだ。",[14,99,100,101,103,104,107],{},"ここで ",[18,102,27],{}," を読み直してもらった。対策の plain POJO 化は確かに入っていた。",[18,105,106],{},".map"," で必要フィールドだけ詰め替える D 案がそのまま残っている。コードレベルでは対策済みのはずなのに、本番だけ null 化している。意味がわからない。",[10,109,110],{"id":110},"ローカル再現を試みる",[14,112,113,114,117,118,120],{},"「今のコードでも ",[18,115,116],{},"pnpm generate"," し直したら同じ payload null が出るのでは」と疑った。CLAUDE.md に「",[18,119,116],{}," は10分かかるから検証目的で勝手に走らせるな」と書いてあるが、今回はまさに本番検証なので走らせる判断をした。",[14,122,123,125,126,129],{},[18,124,116],{}," をバックグラウンドで投げ、待ち時間に本番の他のページを観察する。10分後、",[18,127,128],{},"dist/blog/_payload.json"," を確認した。",[73,131,132,144],{},[76,133,134,135,83,137],{},"ローカル build の ",[18,136,35],{},[138,139,140,141,143],"strong",{},"757KB、",[18,142,86],{}," 配列に中身あり",[76,145,146,147,83,149],{},"本番 (Cloudflare Pages) の ",[18,148,35],{},[138,150,151,152],{},"116 byte、",[18,153,39],{},[14,155,156,157,160],{},"ローカルでは再現しない。今のコードは正しく POJO 配列を書き出している。",[138,158,159],{},"本番にデプロイされているビルド成果物だけが壊れている","という結論に落ち着いた。",[10,162,164],{"id":163},"対処再デプロイ","対処：再デプロイ",[14,166,167,168,171,172,175],{},"ローカルの ",[18,169,170],{},"dist/"," は既に正常な payload を持っている。これをそのまま Cloudflare に投げ直せば直るはずだ。",[18,173,174],{},"wrangler pages deploy dist"," で押し込んでもらった。",[14,177,178,179,181,182,185],{},"デプロイ後、もう一度本番の ",[18,180,35],{}," を fetch して中身を確認したら、配列が返ってきた。ブラウザで ",[18,183,184],{},"/blog/"," を開き直すと、一覧が消えなくなった。直った。",[10,187,188],{"id":188},"原因は特定できなかった",[14,190,191],{},"Claude Code に「原因は何だった？」と聞いても、特定できないという返事だった。手元にある状況証拠はこれだけ:",[73,193,194,201,207,213],{},[76,195,196,197,200],{},"今朝の ",[18,198,199],{},"measure-deploy.ps1"," 経由のビルド+デプロイは exit 0 で正常終了している",[76,202,203,204,206],{},"そのとき push された ",[18,205,128],{}," だけが null に化けていた",[76,208,209,210,212],{},"同じソースで今もう一度 ",[18,211,116],{}," し直した結果は正常な配列を吐く",[76,214,215],{},"ローカルでは何度試しても再現しない",[14,217,218,219,221,222,224],{},"仮説としては「朝のビルド時に何らかのタイミング問題で ",[18,220,35],{}," だけがシリアライズに失敗した」あたりだが、ログが残っていないので確証は得られない。",[18,223,199],{}," のビルドログを残す運用にしておけば、次は追えるかもしれない。",[10,226,228],{"id":227},"反省対策ルールが効いていると過信していた","反省：対策ルールが「効いている」と過信していた",[14,230,231,233,234,237],{},[18,232,43],{}," に「plain POJO 化すれば直る」と書き残してあったので、もう同じ問題は踏まないと思い込んでいた。今回踏んだのはコードレベルの問題ではなく",[138,235,236],{},"ビルドアーティファクトの問題","で、ルールの対策範囲を超えていた。",[14,239,240],{},"ルールに欠けていた観点はこのあたりだと思う。",[73,242,243,252,265],{},[76,244,245,248,249,251],{},[138,246,247],{},"デプロイ後の検出スニペット","は書いてあるが、毎回デプロイ後に流す運用にしていなかった。今朝の ",[18,250,199],{}," 直後に流していれば、その場で気づけた",[76,253,254,264],{},[138,255,256,257,260,261,263],{},"ローカル ",[18,258,259],{},"dist/_payload.json"," と本番 ",[18,262,35],{}," の差分チェック","がルールに入っていなかった。コード対策が入っていてもビルド成果物がズレることがある、という観点が抜けていた",[76,266,267,270],{},[138,268,269],{},"「対策を入れたから安心」と思考停止していた","。POJO 化は必要条件であって十分条件ではなかった",[10,272,273],{"id":273},"残タスク",[73,275,278,294,302],{"className":276},[277],"contains-task-list",[76,279,282,287,288,290,291,293],{"className":280},[281],"task-list-item",[283,284],"input",{"disabled":285,"type":286},true,"checkbox"," ",[18,289,199],{}," にデプロイ完了後の payload 健全性チェックを組み込む（",[18,292,35],{}," のサイズが閾値以下なら警告）",[76,295,297,287,299,301],{"className":296},[281],[283,298],{"disabled":285,"type":286},[18,300,43],{}," に「ローカル dist と本番 dist を fetch して比べる」観点を追記",[76,303,305,307,308,311],{"className":304},[281],[283,306],{"disabled":285,"type":286}," ビルドログを ",[18,309,310],{},"memo/{日付}/build-log.txt"," に残す運用を試す",[14,313,314],{},"ここまで書き残しておけば、次に同じことが起きたとき自分が早く気づける。",{"title":316,"searchDepth":317,"depth":317,"links":318},"",2,[319,320,321,322,323,324,325],{"id":12,"depth":317,"text":12},{"id":56,"depth":317,"text":56},{"id":110,"depth":317,"text":110},{"id":163,"depth":317,"text":164},{"id":188,"depth":317,"text":188},{"id":227,"depth":317,"text":228},{"id":273,"depth":317,"text":273},"dev","デプロイ後に /blog の記事一覧が一瞬だけ映って消える hydration mismatch が再発した。2026-06-04 と同じ症状で、対策ルールも入っていたのに本番だけ payload が null に化けた。再デプロイで復旧したが原因は掴めなかった記録。","md",{},null,"/blog-payload-null-rerun","mdx-playground",false,"2026-06-23T00:00:00.000Z",{"title":5,"description":327},"2026-06/2026-06-23/blog-payload-null-rerun",[338,339,340,341,342,343],"nuxt-content","payload","hydration","SSG","cloudflare-pages","再発バグ","mbp6II6C-czMkBy1O5dJIaC4mA0nt5DV0NXYyoGnSHQ",[],"https://log.eurekapu.com/og/blog/blog-payload-null-rerun.png?v=2026-06-23T00%3A00%3A00.000Z&title=%2Fblog%20%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AE%20payload%20null%20%E5%8C%96%E3%81%8C%E5%86%8D%E7%99%BA%E3%81%97%E3%81%9F%E8%A9%B1%20%E2%80%94%20%E5%86%8D%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%A7%E7%9B%B4%E3%81%97%E3%81%9F%E3%81%8C%E5%8E%9F%E5%9B%A0%E3%81%AF%E7%89%B9%E5%AE%9A%E3%81%A7%E3%81%8D%E3%81%9A&author=Kei%20Komatsu&sig=e72762069ebe32df",1782364625292]