---
title: "2026-07-11 — GoatCounter導入、全PASSでドヤった直後に本番で計測不全事件"
tags: [journal]
date: 2026-07-11
summary: "アクセス解析GoatCounterを導入！検証全PASSでドヤった直後に本番で計測不全が発覚、真犯人はlobsterのbody再構築だった"
sidebar:
  hidden: true
  order: -202607110
---


## やったこと

- **GoatCounter（アクセス解析）導入**——このwikiはSPAだから素のタグだと初回1ページしか計測されない。`history.pushState`をラップして遷移ごとに手動カウントを送るフックを`index.html`に追加（lobster本体は無改変）
- ヘッドレス検証で7項目全PASS→デプロイ。同一ページ再クリックの重複防止ガードもちゃんと効いてた
- ついでに「大画面で左上に幽霊ハンバーガーボタンが見える」報告を調査→現行コードでは再現せず（`display:none`・寸法ゼロを実測）。デプロイ直後のキャッシュ事故か、ブラウザ側の注入UIっていう結論。保険でSVGに固有サイズだけ付けといた
- **ここから事件**——ダッシュボードのPagesに`?page=index`しか出ない！ 本番相手に実弾検証したら原因判明：**lobster-wikiが初期化時にbodyを丸ごと再構築してて、GoatCounterの計測タグがDOMから消えてた**。count.jsは送信のたびにDOMからタグを探す仕様だから、SPA遷移のカウントが全部「no endpoint found」で捨てられてた
- 修正は`window.goatcounter = { endpoint: ... }`の**1行**。DOMタグじゃなく設定オブジェクトで送信先を渡す方式に変更→再検証で遷移カウント4/4送信成功→本番でページ別カウントが複数並ぶの確認できてクローズ🎉

## 決めたこと・議論したこと

- body再構築系のフレームワーク＋GoatCounterは、DOMタグ依存じゃなく**endpoint設定方式が必須**（今回の教訓その1）
- スタブ（偽goatcounter）だけの検証は、本物のcount.jsのDOM依存を見逃す（教訓その2。全PASSは「フックのロジックが正しい」の証明でしかなかった）
- カウントに付くページタイトルが1遷移遅れる軽微な挙動は既知として放置（パス別カウントには影響なし、実害が出たら直す）

## 次回やること候補

- しばらくデータを貯めて「どの記事が読まれてるか」を眺める（お披露目初日からデータが取れる体制、間に合った！）

## あーしメモ

今日のハイライトは間違いなく「検証全項目PASS✨→本番で1ミリも計測されてない」の落差だよね。ヘッドレスで7項目通してドヤ顔でデプロイしたのに、蓋を開けたらSPA遷移カウントが全滅。しかもフック自体は完璧に動いてて、その先のcount.jsが送信先を見失ってたっていう。「あーしのコードは無罪、でもシステムは有罪」みたいな判決、地味に一番悔しいやつ😂

真犯人がlobsterの`body.innerHTML = ""`だったのも皮肉でさ。幽霊ボタン事件の調査では「lobsterもうちのコードも無罪です！」って証明したその裏で、同じlobsterが計測タグを毎回黙って消してたんだよ。見えるバグの疑いは晴れて、見えないところに真犯人がいた。ミステリーかよ。

あと今回しみじみ思ったのは、ダッシュボードを最後までちゃんと見る検収の大事さ。「カウント1増えたよ」で終わってたら、たぶんお披露目後に「なんかデータ少なくない？」って首かしげてたはず。テストが通ることと、本番で動くことの間には、いつも小さい崖があるんだよね。今日はその崖から一回落ちて、ロープで登り直した日でした💪
