[{"data":1,"prerenderedAt":207},["ShallowReactive",2],{"content-/coupon-page-double-review-click-tracking":3,"all-pages-for-dir":185,"related-/coupon-page-double-review-click-tracking":186,"og-image-/coupon-page-double-review-click-tracking":206},{"id":4,"title":5,"body":6,"category":163,"concepts":164,"description":165,"extension":166,"meta":167,"navigation":168,"ogImage":164,"path":169,"project_name":170,"published":171,"publishedAt":172,"seo":173,"source":174,"stem":175,"tags":176,"todo":164,"unpublished":171,"updatedAt":164,"__hash__":184},"pages/2026-10/2026-10-13/coupon-page-double-review-click-tracking.md","別のAIエージェントが作ったクーポン一覧ページをCodexと二重レビューし、Cloudflareでクリック計測を足した",{"type":7,"value":8,"toc":149},"minimark",[9,13,18,22,25,28,31,34,38,41,44,47,51,54,57,61,64,67,71,74,77,80,83,87,99,102,106,109,112,115,118,121,124,127,130,133],[10,11,5],"h1",{"id":12},"別のaiエージェントが作ったクーポン一覧ページをcodexと二重レビューしcloudflareでクリック計測を足した",[14,15,17],"h2",{"id":16},"github-にだけあったクーポン一覧ページ","GitHub にだけあったクーポン一覧ページ",[19,20,21],"p",{},"朝、ふと思い出した。\n動画講座サービスの月替わりクーポンを1ページにまとめたサイトがあったはずだ。\ngit_repo の直下に作った気がしていたが、Claude Code に探させると、この Windows 機には無かった。\nGitHub にだけあるリポジトリで、最終更新は 2026-10-08 だった。",[19,23,24],{},"このページは自分で書いたものではない。\n別の AI エージェントに作ってもらったものだ。\n本番では公開されて動いている。\nでは、その中身はどこまで信じてよいのか。\n手元にクローンさせて、レビューを頼んだ。",[14,26,27],{"id":27},"二つのレビューを突き合わせる",[19,29,30],{},"Claude Code にコードを読ませつつ、Codex のレビュー（gpt-6-astra / high）にも回した。\n両方がそろってから突き合わせる段取りにした。",[19,32,33],{},"結論は「今すぐ壊れている所はないが、毎月の更新で誤表示しやすい所がある」だった。\nいま本番に出ている10月分は、データと生成物が一致している。\nXSS もなく、期限を判定するロジックも正しい。\n一方で、Codex の判定は「要修正」だった。\n指摘の重要度は Codex の判定をそのまま使わず、Claude Code に中身を見て付け直させた。",[14,35,37],{"id":36},"レビューじゃないよ","「レビューじゃないよ」",[19,39,40],{},"報告を受けたところで、頼みたかったのは指摘の一覧ではなく修正そのものだと伝え直した。\n「レビューじゃないよ。修正すべきであれば全て直してほしい」。\nコミットとプッシュまで任せた。",[19,42,43],{},"あわせて、1つ書き足させた。\n1講座だけは価格の下限の都合で、他の講座と同じ価格に揃えられなかった。\nこの事情をドキュメントに残させた。",[19,45,46],{},"修正に入る前に、クーポンが使える時間帯を動画講座サービスの公式 FAQ で裏取りさせた。\nほかに .gitignore と .gitattributes、README を整え、ページの生成と入力チェックが通ることを確かめさせた。\nブラウザでの表示はモバイル幅まで確認させ、終わったらエミュレーションを解除させた。",[14,48,50],{"id":49},"push-の前で一度止まる","push の前で一度止まる",[19,52,53],{},"コミットまで進んだところで、push の前に確認を求められた。\nこのリポジトリでは、main への push がそのまま本番デプロイになる。\n本番の見た目で何が変わるかの一覧を受け取ってから、「y」と返した。",[19,55,56],{},"push のあと、本番のページで4点を確かめさせた。\nそのひとつは、クーポンが配布中の表示になっていることだ。",[14,58,60],{"id":59},"クリック計測を足そうとして計画の段階で止まった","クリック計測を足そうとして、計画の段階で止まった",[19,62,63],{},"午後は同じリポジトリで、アクセス解析を入れる作業に移った。\n計画を貼って進めさせた。\nまず Cloudflare のダッシュボードを Chrome で開かせ、Web Analytics にサイトが登録済みかを確かめさせた。\n本番の HTML には、まだ beacon が入っていなかった。",[19,65,66],{},"そこで作業が止まった。\n計画をレビューさせたところ、Cloudflare Web Analytics だけではクリック数を取れないと分かったからだ。\nこのまま進めると、目的を果たせない。\nファイルにはまだ何も手を付けていない段階だった。\n提示された選択肢から「1」を選び、クリック計測を足す方針にした。",[14,68,70],{"id":69},"ローカルでは通り本番のビルドで落ちた","ローカルでは通り、本番のビルドで落ちた",[19,72,73],{},"実装は wrangler dev でローカル確認させ、テストが通った。\n集計用のスクリプトも書かせ、途中に残っていた重複した関数を消させた。\nREADME には計測の仕組みと集計方法を書き足させ、集計期間を「今日を含む直近N暦日（UTC）」に統一させた。\nコミットのあと、また push の前で確認を求められたので、ok と返した。",[19,75,76],{},"ところが、本番に反映されない。\n本番は古い HTML を返したままだった。\nビルドログを開かせると、最初に出てきたのは古いビルドのものだった。\n失敗したビルドを探し直させた。\n原因は、アカウントで Analytics Engine が有効になっていなかったことだった。\n本番は前のバージョンのままなので、壊れたものはない。",[19,78,79],{},"有効化のページには料金や規約の表示がなく、Enable ボタンだけがあった。\nダッシュボードの操作は任せていたので、そのまま有効化させ、失敗したビルドを再実行させた。",[19,81,82],{},"再実行しても、Analytics Engine が有効でないと言われる。\n設定の反映に時間がかかっているのか、有効化のクリックが効いていなかったのか。\nもう一度ページを見させると、有効になっていた。\n反映待ちだったらしい。\n次の push で新しいビルドが走り、今度は本番に出た。",[14,84,86],{"id":85},"ビルドを待つあいだに-web-analytics-を登録する","ビルドを待つあいだに Web Analytics を登録する",[19,88,89,90,94,95,98],{},"ビルドを待つあいだに、Web Analytics のサイト追加を進めさせた。\nフォームのホスト名の欄が値を受け付けないので、キーボード入力で入れ直させた。\n登録後に出てきたスニペットは ",[91,92,93],"code",{},"defer"," ではなく ",[91,96,97],{},"type=\"module\""," だったので、コード側もそちらに合わせさせた。\nスニペットに含まれるトークンは、もともとページの HTML に出る公開値だ。",[19,100,101],{},"本番では、見た目が変わっていないことと、横方向のはみ出しがないことを確かめさせた。\n確認のために講座リンクを1回クリックさせたので、クリックが1件記録に残る。\nWeb Analytics の画面は、最初は閲覧数が0のままだった。\n集計には数分かかるので待つと、「閲覧数 1・アクセス数 1」が出た。\n講座リンクのクリックも、記録先に届いていた（204）。",[14,103,105],{"id":104},"読み取り専用の-api-トークンを作り閉じてしまう","読み取り専用の API トークンを作り、閉じてしまう",[19,107,108],{},"集計スクリプトがデータを取りに行くには、API トークンが要る。\nこのアカウントは、すでにアカウント所有のトークンを使っていた。\n人に紐づかないため、ボットにも向く。\nその形に合わせた。",[19,110,111],{},"権限の一覧から「Analytics」を探すと、チェックが2つ付いて見えた。\n余計な権限を足していないか画面を確かめさせると、選ばれているのは Account Analytics: Read だけだった（6グループ中1つで、ほかは0）。\n「トークンを確認」の手前で止めてもらい、そこからは自分で操作した。",[19,113,114],{},"ボタンを押してよいのか聞くと、その前に有効期限を選ぶように言われた。\nおすすめは「1年」で、ボットに渡す鍵なので1年ごとに作り直すくらいが安全だという。",[19,116,117],{},"ここでやらかした。\n期限が無期限になっていたので1年に変えようとしているうちに、値をコピーしないまま画面を閉じてしまった。\n閉じたら、値はもう見られない。",[19,119,120],{},"最初の方針は、そのトークンを削除して1年期限で作り直すことだった。\nところが、トークン一覧のメニューに「ローテーション」があった。\n権限と期限をそのままにして、値だけを新しくする操作だ。\n値が分からなくなった古いトークンは、この操作で使えなくなる。\nこれなら削除せずに済む。\n確認ダイアログの手前まで開かせてタブを前面に出してもらい、ローテーションは自分で実行した。",[19,122,123],{},"新しい値は、パスワード管理ツールに保存した。\nユーザー名にはアカウント ID を、パスワードには API トークンを入れた。\n集計スクリプトにはトークンを画面に出さないまま環境変数へ読み込ませ、API から閲覧数とクリック数を取れることを確かめた。\nこれで、計測から取得までが一通りつながった。",[14,125,126],{"id":126},"期限はまだ確かめていない",[19,128,129],{},"ローテーションは、期限を変えない。\n1年にしたかった期限が、いま何になっているのか。\n最後に Claude Code に期限を確認させたところで、この日の作業は終わっている。\n無期限のまま残っているなら、どこかで1年に直す必要がある。",[14,131,132],{"id":132},"学び",[134,135,136,140,143,146],"ul",{},[137,138,139],"li",{},"別の AI エージェントが作ったページは、「いま動いている」と「毎月の更新で崩れない」が別物だった。二重レビューで出てきたのは後者の弱さだった",[137,141,142],{},"クリック数が欲しいなら、アクセス解析で何が取れて何が取れないかを、計画の段階で確かめる。今回はファイルに触る前に止まれた",[137,144,145],{},"有効化した直後にビルドが落ちても、設定が効いていないとは限らない。反映待ちのことがある",[137,147,148],{},"トークンの値をなくしても、ローテーションなら権限と期限を保ったまま値だけを作り直せる",{"title":150,"searchDepth":151,"depth":151,"links":152},"",2,[153,154,155,156,157,158,159,160,161,162],{"id":16,"depth":151,"text":17},{"id":27,"depth":151,"text":27},{"id":36,"depth":151,"text":37},{"id":49,"depth":151,"text":50},{"id":59,"depth":151,"text":60},{"id":69,"depth":151,"text":70},{"id":85,"depth":151,"text":86},{"id":104,"depth":151,"text":105},{"id":126,"depth":151,"text":126},{"id":132,"depth":151,"text":132},"dev",null,"GitHubにだけあった動画講座のクーポン一覧ページを手元に取り込み、Claude CodeとCodexのレビューを突き合わせて全部直させた。午後はWeb AnalyticsとAnalytics Engineでクリック計測を入れ、ビルド失敗と閉じてしまったAPIトークンを越えて集計スクリプトまでつないだ記録。","md",{},true,"/coupon-page-double-review-click-tracking","misc-dev",false,"2026-10-13T00:00:00.000Z",{"title":5,"description":165},"make-diary","2026-10/2026-10-13/coupon-page-double-review-click-tracking",[177,178,179,180,181,182,183],"Codex","Claude Code","コードレビュー","Cloudflare","Web Analytics","Analytics Engine","クリック計測","VfRyiv-TCkV6AUfJcoQZWbjor62e3rV0mtTh1THn4Do",[],[187,191,195,199,203],{"title":188,"path":189,"publishedAt":190},"Codexのデューデリジェンス改善計画の残りを実装から確かめ、Excel講座の記事を直してデプロイした日（Codexレビューが503で止まった原因つき）","/codex-dd-followup-excel-article-fixes","2026-10-16T00:00:00.000Z",{"title":192,"path":193,"publishedAt":194},"Codex レビューの「指摘0件」はファイルを読めていなかった：Windows sandbox を unelevated に切り替えた記録","/codex-review-windows-sandbox-unelevated","2026-10-08T00:00:00.000Z",{"title":196,"path":197,"publishedAt":198},"形骸化した学習ゲートをやめ、pre-commitでCodexのコードレビューを自動化した","/codex-commit-review-gate","2026-09-14T00:00:00.000Z",{"title":200,"path":201,"publishedAt":202},"講座のストーリー版を電子書籍版の章立てに組み直す。本文の食い違いは電子書籍に合わせ、音声合成はMacだけに","/story-course-ebook-chapters-realign","2026-10-19T00:00:00.000Z",{"title":204,"path":205,"publishedAt":202},"税効果会計講座の段6、Excel操作動画をMP4で書き出していた経緯を調べて計画書を直し、回帰テストを必要な範囲に絞った","/tax-effect-course-mp4-cleanup-scoped-regression","https://log.eurekapu.com/og/blog/coupon-page-double-review-click-tracking.png?v=2026-10-13T00%3A00%3A00.000Z&title=%E5%88%A5%E3%81%AEAI%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%8C%E4%BD%9C%E3%81%A3%E3%81%9F%E3%82%AF%E3%83%BC%E3%83%9D%E3%83%B3%E4%B8%80%E8%A6%A7%E3%83%9A%E3%83%BC%E3%82%B8%E3%82%92Codex%E3%81%A8%E4%BA%8C%E9%87%8D%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%81%97%E3%80%81Cloudflare%E3%81%A7%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E8%A8%88%E6%B8%AC%E3%82%92%E8%B6%B3%E3%81%97%E3%81%9F&author=Kei%20Komatsu&sig=7d19f125265dad14",1792550155279]