[{"data":1,"prerenderedAt":503},["ShallowReactive",2],{"content-/2026-08-13-diary":3,"all-pages-for-dir":486,"related-/2026-08-13-diary":487,"og-image-/2026-08-13-diary":502},{"id":4,"title":5,"body":6,"category":467,"concepts":468,"description":469,"extension":470,"meta":471,"navigation":402,"ogImage":468,"path":472,"project_name":473,"published":474,"publishedAt":475,"seo":476,"source":477,"stem":478,"tags":479,"todo":468,"unpublished":474,"updatedAt":468,"__hash__":485},"pages/2026-08/2026-08-13/diary-2026-08-13.md","2026年8月13日の開発日記 - 本番検索の伏兵とCodex CLI復旧、開発環境の総点検",{"type":7,"value":8,"toc":450},"minimark",[9,14,18,21,25,32,35,40,48,54,64,75,78,82,85,89,97,105,107,111,114,118,126,134,136,140,143,147,155,163,165,169,172,176,187,195,197,200,364,366,369,386,388,391,423,425,428],[10,11,13],"h1",{"id":12},"_2026年8月13日の開発日記","2026年8月13日の開発日記",[15,16,17],"p",{},"今日は、開いた作業のどれもが「思っていた原因」を裏切る一日になった。",[15,19,20],{},"本番の検索が壊れていた理由は、前日のデプロイではなくlocalStorageの上限超過だった。Codexのレビューは、動いているように見えて実は空振りしていた。パレート図の記憶は、85%ではなく80%だった。記事プレビューが開かない理由も、ファイアウォールやプロキシではなく、残っていたタブが指す先の開発サーバーがすでに止まっていたことだった。11セッションを3プロジェクトにまたいで動かしながら、そのたびに思い込みを実地で確かめ直す一日になった。",[22,23,24],"h2",{"id":24},"今日のタイムライン",[15,26,27],{},[28,29],"img",{"alt":30,"src":31},"タイムライン","/2026-08/2026-08-13/timeline-2026-08-13.png",[22,33,34],{"id":34},"今日やったこと",[36,37,39],"h3",{"id":38},"_1-本番検索の障害調査と方針転換","1. 本番検索の障害調査と方針転換",[15,41,42,43,47],{},"前日の非公開記事ダンプ対策を本番にデプロイして確認したあと、計画書の積み残しを片付ける途中で、本番の検索が ",[44,45,46],"code",{},"no such column: \"unpublished\""," というエラーを返していることに気づいた。原因を追うと、Nuxt Contentのクライアントキャッシュを置くlocalStorageが5MBの上限を超えていた。本番のダンプは11.3MBに達しており、checksumだけが更新されて古い世代のダンプが残り続け、自力では回復できない壊れ方をしていた。前日のデプロイとは無関係な既存問題だと分かり、issueに残した。計画を締めようとしたところ、別マシンからのマージでブランチがmasterに切り替わっていたので、cherry-pickで取り込んだ。プッシュはすでにoriginへ反映済みだったので不要だった。次のセッションでは検索の修正から「検索機能ごと廃止する」方向へ方針を転換し、Codexにレビューを重ねてもらいながら、404のcatch-allでも同じダンプ取得が起きるという想定外の広がりを実測で確認した。4件の決裁を得たところで、実装は次のセッションへ持ち越した。",[15,49,50],{},[51,52,53],"strong",{},"主な成果:",[55,56,57,61],"ul",{},[58,59,60],"li",{},"本番検索エラーの真因をlocalStorage 5MBの上限超過と特定し、issue化",[58,62,63],{},"検索機能の廃止方針をCodexレビューで固め、4件の決裁を取得",[15,65,66,69,70],{},[51,67,68],{},"詳細:"," ",[71,72,74],"a",{"href":73},"/search-localstorage-quota-fix","本番/searchが壊れた本当の原因はlocalStorageの上限超過だった",[76,77],"hr",{},[36,79,81],{"id":80},"_2-codex-cliの復旧","2. Codex CLIの復旧",[15,83,84],{},"朝のmake-diaryチェーンを回している最中、Codexのレビューがexit 0のまま静かに空振りしていることに気づいた。原因を切り分けると、PCに二重インストールされていたCodex CLIのうち、PATH上にある方だけがサンドボックス用のヘルパーバイナリを同梱しないまま、更新から取り残されていたと判明した。公式アプリ版を優先するランチャーへの切り替えを承認し、issue自身をレビューにかけて実際に動くことを確かめた。復旧したあとは、別件の技術調査でCodexに独立したクロスチェックを依頼したところ、指摘がそのまま的中し、実戦でも裏取りができた。make-diaryのレビュー検証ロジックも「exit 0だけで成功と判定しない」形に直させ、ブランチ経由でmasterに取り込んだ。",[15,86,87],{},[51,88,53],{},[55,90,91,94],{},[58,92,93],{},"Codex CLIの空振りを、二重インストールとPATHの取り違えまで特定して復旧",[58,95,96],{},"レビュー検証ロジックを「exit 0だけで成功と判定しない」形に修正",[15,98,99,69,101],{},[51,100,68],{},[71,102,104],{"href":103},"/codex-cli-windows-fix","Windows で Codex CLI が動かなくなった原因を切り分けて復旧した記録",[76,106],{},[36,108,110],{"id":109},"_3-所有ドメインのga4計測棚卸し","3. 所有ドメインのGA4計測棚卸し",[15,112,113],{},"前日の対応表に残っていた未了12件を、一つずつ実地で確かめ直すところから始めた。最優先だった本体サイトの計測記録漏れは、コード側の不具合ではなく計測ツール側の反映待ちだと判明した。4サイト分のプロパティ作成を止めていたアカウント権限の壁は、サブアカウントへの切り替えで解消し、そのうちの1つはこのブログ自体だった。サーチコンソールへの登録、522エラーの原因特定に加えて、リダイレクト未追従と通信エラーの再試行という2件の見誤りも実地確認で解消し、12件のうち11件を完了させた。別セッションでは、もう使っていない旧ドメインについて、レジストリ上「そもそも登録記録が無い」状態であることを3つの経路で確認した。",[15,115,116],{},[51,117,53],{},[55,119,120,123],{},[58,121,122],{},"未了12件のうち11件を実地確認で完了",[58,124,125],{},"旧ドメインの登録状況を3つの経路でクロスチェック",[15,127,128,69,130],{},[51,129,68],{},[71,131,133],{"href":132},"/domain-analytics-inventory","所有ドメインのGA4計測を棚卸しし、未了12件を実地確認でつぶした",[76,135],{},[36,137,139],{"id":138},"_4-図解カタログのb案統合","4. 図解カタログのB案統合",[15,141,142],{},"「85%で寝るパレート図」を探す計画書の続きに着手したが、記憶していた閾値は実際には80%で、図もリポジトリの外にあった。閾値と保存場所という二重の的外れのまま長時間の探索が空振りしていたと分かったのは、svg-diagramスキルの追加リファレンスを読んだあとだった。原典はそのまま保存し、描き直しは別工程に回すことにした。前日から持ち越していたフレーム分離のB案(フレームをVue側に持たせる案)と、ローカルworktreeにしかなかったカテゴリA11型の実装をmasterへマージした。消失リスクのある未pushブランチを最優先で退避し、並行して動いていた別セッションの終了を確認してからマージした。マージ直後に発生した10秒タイムアウトは、再コンパイル待ちによる誤検知だった。",[15,144,145],{},[51,146,53],{},[55,148,149,152],{},[58,150,151],{},"フレーム分離B案とカテゴリA11型をmasterへ統合",[58,153,154],{},"未pushブランチを退避し、消失リスクを解消",[15,156,157,69,159],{},[51,158,68],{},[71,160,162],{"href":161},"/diagram-catalog-frame-separation","図解カタログをB案でmasterへ統合した日。カテゴリA11型と、消えていた原典の顛末",[76,164],{},[36,166,168],{"id":167},"_5-開発環境の総点検","5. 開発環境の総点検",[15,170,171],{},"種類も原因もまったく違う「動かない」を4つ、順番に片付けた。モニタの電源復旧をきっかけに、ノートPCの横スクロール不具合の残タスクを実測ログで確かめ、見張りタスクによる恒久対策が完了していることを確定させてコミットした。記事プレビューがConnection refusedで開けなかった原因は、停止中の開発サーバーに残ったブラウザタブと判明し、表示確認は静的検証で代替して次回に持ち越した。Chrome拡張のダウンロードボタンが動かない原因は、ChromeのPATHにPythonが入っていないことまで突き止めて修正し、実際にダウンロードが成功するところまで確認した。本番ビルド中に走りっぱなしだったdevプロセスとMCPサーバーを22個掃除し、過去に実績のあるメモリ不足クラッシュを避けた。",[15,173,174],{},[51,175,53],{},[55,177,178,181,184],{},[58,179,180],{},"ノートPCの横スクロール不具合の恒久対策を確定",[58,182,183],{},"Chrome拡張のダウンロード機能を実際の成功まで確認",[58,185,186],{},"走りっぱなしのプロセスを22個掃除",[15,188,189,69,191],{},[51,190,68],{},[71,192,194],{"href":193},"/dev-environment-cleanup","開発環境に溜まった4つの不具合を一日で片付けた記録",[76,196],{},[22,198,199],{"id":199},"今日の試行錯誤",[201,202,203,225],"table",{},[204,205,206],"thead",{},[207,208,209,213,216,219,222],"tr",{},[210,211,212],"th",{},"#",[210,214,215],{},"テーマ",[210,217,218],{},"試したこと",[210,220,221],{},"結果",[210,223,224],{},"気づき",[226,227,228,246,263,280,296,313,330,347],"tbody",{},[207,229,230,234,237,240,243],{},[231,232,233],"td",{},"1",[231,235,236],{},"Codexレビュー",[231,238,239],{},"exit 0を成功の証拠として扱う",[231,241,242],{},"失敗（空振りを見逃す）",[231,244,245],{},"PATH上のCodexだけが更新から取り残されていた",[207,247,248,251,254,257,260],{},[231,249,250],{},"2",[231,252,253],{},"本番検索エラー",[231,255,256],{},"デプロイ由来のバグと疑う",[231,258,259],{},"失敗（見当違い）",[231,261,262],{},"原因はlocalStorageの5MB上限超過という既存問題だった",[207,264,265,268,271,274,277],{},[231,266,267],{},"3",[231,269,270],{},"パレート図探し",[231,272,273],{},"「85%で寝る」という記憶を頼りに探す",[231,275,276],{},"失敗（見つからず）",[231,278,279],{},"実際の閾値は80%で、図もリポジトリの外にあった",[207,281,282,285,288,291,293],{},[231,283,284],{},"4",[231,286,287],{},"GA4計測記録漏れ",[231,289,290],{},"コード側の不具合を疑う",[231,292,259],{},[231,294,295],{},"計測ツール側の反映待ちだった",[207,297,298,301,304,307,310],{},[231,299,300],{},"5",[231,302,303],{},"GA4リダイレクト調査",[231,305,306],{},"リダイレクト未追従を不具合と判断",[231,308,309],{},"失敗（見誤り）",[231,311,312],{},"実地確認で正常動作と判明",[207,314,315,318,321,324,327],{},[231,316,317],{},"6",[231,319,320],{},"Chrome拡張のダウンロード",[231,322,323],{},"ボタンの実装を疑う",[231,325,326],{},"失敗（原因は別）",[231,328,329],{},"ChromeのPATHにPythonが入っていなかった",[207,331,332,335,338,341,344],{},[231,333,334],{},"7",[231,336,337],{},"記事プレビュー接続拒否",[231,339,340],{},"開発サーバーの停止を疑う",[231,342,343],{},"部分的中",[231,345,346],{},"真因は停止中サーバーに残ったブラウザタブだった",[207,348,349,352,355,358,361],{},[231,350,351],{},"8",[231,353,354],{},"マージ後のタイムアウト",[231,356,357],{},"ビルドの不具合を疑う",[231,359,360],{},"誤検知と判明",[231,362,363],{},"再コンパイル待ちのタイムアウトだった",[76,365],{},[22,367,368],{"id":368},"今日の学び",[55,370,371,374,377,380,383],{},[58,372,373],{},"動いているように見えることは、成功の証拠にならない。exit 0だけを頼りにCodexレビューを信用していたら、1日分のレビューがまるごと素通りしていた",[58,375,376],{},"本番障害は、直前の変更を疑う前に、独立した既存問題である可能性を切り分ける必要がある。localStorageの上限超過は、前日のデプロイと無関係だった",[58,378,379],{},"記憶している数値は疑ってかかる。パレート図の閾値を85%だと思い込んだまま探し続け、実際は80%だった",[58,381,382],{},"環境トラブルの原因は、疑っているレイヤーとは別の場所に潜んでいる。ダウンロードボタンが動かない原因はPATHのPythonで、プレビューが開かない原因は残ったブラウザタブだった",[58,384,385],{},"消失リスクのあるブランチは、マージ作業より先に退避する",[76,387],{},[22,389,390],{"id":390},"明日やること",[55,392,395,405,411,417],{"className":393},[394],"contains-task-list",[58,396,399,404],{"className":397},[398],"task-list-item",[400,401],"input",{"disabled":402,"type":403},true,"checkbox"," 検索機能の廃止を実装する（決裁済みの方針に沿って）",[58,406,408,410],{"className":407},[398],[400,409],{"disabled":402,"type":403}," パレート図の原典をもとに、図の描き直しを進める",[58,412,414,416],{"className":413},[398],[400,415],{"disabled":402,"type":403}," 記事プレビューの実際の表示を確認する（静的検証からの本確認）",[58,418,420,422],{"className":419},[398],[400,421],{"disabled":402,"type":403}," GA4計測棚卸しの残り1件を確認する",[76,424],{},[22,426,427],{"id":427},"関連記事",[55,429,430,434,438,442,446],{},[58,431,432],{},[71,433,74],{"href":73},[58,435,436],{},[71,437,104],{"href":103},[58,439,440],{},[71,441,133],{"href":132},[58,443,444],{},[71,445,162],{"href":161},[58,447,448],{},[71,449,194],{"href":193},{"title":451,"searchDepth":452,"depth":452,"links":453},"",2,[454,455,463,464,465,466],{"id":24,"depth":452,"text":24},{"id":34,"depth":452,"text":34,"children":456},[457,459,460,461,462],{"id":38,"depth":458,"text":39},3,{"id":80,"depth":458,"text":81},{"id":109,"depth":458,"text":110},{"id":138,"depth":458,"text":139},{"id":167,"depth":458,"text":168},{"id":199,"depth":452,"text":199},{"id":368,"depth":452,"text":368},{"id":390,"depth":452,"text":390},{"id":427,"depth":452,"text":427},"diary",null,"本番/searchの原因がlocalStorage上限超過だったと判明した日。Codex CLIの復旧、GA4計測の未了12件つぶし、図解カタログのmaster統合、開発環境の4件の不具合対応まで、11セッションの記録。","md",{},"/2026-08-13-diary","daily-log",false,"2026-08-13T00:00:00.000Z",{"title":5,"description":469},"make-diary","2026-08/2026-08-13/diary-2026-08-13",[480,481,482,483,484],"日記","本番障害","Codex CLI","GA4","図解カタログ","laZv_OqQXtqJw3PBT4apOCBQ8tPWp9J1f_DmwwpzDx4",[],[488,492,496,500,501],{"title":489,"path":490,"publishedAt":491},"2026年8月12日の開発日記 - 隠したつもり、届いたつもり、揃ったつもりを1日で剥がした","/2026-08-12-diary","2026-08-12T00:00:00.000Z",{"title":493,"path":494,"publishedAt":495},"2026年5月28日の開発日記 - 反論で記事を鍛え、Codexに数字を直され、本番障害2件を片付けた一日","/2026-05-28-diary","2026-05-28T00:00:00.000Z",{"title":497,"path":498,"publishedAt":499},"2026年3月5日の開発日記 - SSGビルド復旧＆新規クライアント記帳自動化","/2026-03-05-diary","2026-03-05T00:00:00.000Z",{"title":104,"path":103,"publishedAt":475},{"title":162,"path":161,"publishedAt":475},"https://log.eurekapu.com/og/blog/2026-08-13-diary.png?v=2026-08-13T00%3A00%3A00.000Z&title=2026%E5%B9%B48%E6%9C%8813%E6%97%A5%E3%81%AE%E9%96%8B%E7%99%BA%E6%97%A5%E8%A8%98%20-%20%E6%9C%AC%E7%95%AA%E6%A4%9C%E7%B4%A2%E3%81%AE%E4%BC%8F%E5%85%B5%E3%81%A8Codex%20CLI%E5%BE%A9%E6%97%A7%E3%80%81%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%81%AE%E7%B7%8F%E7%82%B9%E6%A4%9C&author=Kei%20Komatsu&sig=8c5dae1a84d60bb0",1786703897916]