サイトの計測を別の AI に疑わせる ― 人の来訪が急に減った理由の言い過ぎを Codex が見つけた

この記事の素材(コード・ログ・データ 5ファイル・まとめてダウンロードあり)
AIで読む ChatGPT・Claude などで、この記事に質問できます

pixelstomotors.com で2026年11月11日に人のページ表示が1日20〜30件から3件に減った理由は、11月12日の時点ではまだ決められない。 Claude は最初「計測の故障ではなく、本当に人が来なくなった」と言い切ったが、OpenAI の Codex(コードを読んで検証する AI)に穴を探させると、その根拠は機械として数えられる記録が届くことを確かめただけで、人のブラウザで記録が届くかは確かめていなかった。

この検証で、次のことが変わりました。

  • 分析の言い過ぎを、公開する前に止められた。Claude が出した4つの結論のうち、2つは撤回、1つは言い方を弱め、1つは範囲を限れば言ってよいと分かった
  • 計測のコードの不具合が2つ見つかった。夜中の0時をまたいで送り直された表示を2日に1件ずつ数えてしまう所と、自分の閲覧を計測から外す設定が、ブラウザによっては効かない所。後のほうはその日のうちに直した
  • 時間:Codex の検証は、依頼を置いてから報告が書き終わるまで5分(18:32〜18:37)。人がしたのは「Codex に検証を頼んで」と言うことだけで、依頼書づくりと受け渡しは Claude と依頼箱(Claude Code への依頼を Mac の見張り係が自動で渡す仕組み)が行った

pixelstomotors.com は、ロボットとフィジカルAI(現実の物を動かす AI)の研究を、ひとりで記録して公開しているサイトです。人の来訪は1日20〜30表示ほどで、ページを自動で読みに回る機械(クローラー)はその10倍以上来ます。人と機械を分けるために、ページの中の小さなプログラムが「マウスを動かした・画面に触れた」などの人の操作があったかを記録しています(LOG451)。

11月12日の週の分析で、この人の表示が11日に3件、12日(19時まで)に2件しかないことに気づきました。それまでは平日に1日16〜30件ありました。Claude は計測のコードと実際の動きを確かめたうえで「故障ではない」と報告しましたが、そのあとの話の中で、Claude 自身の見立てが何度も揺れました。

一旦計測についてもう一度見直して、Codexに敵対的検証を依頼してください

敵対的検証は、合っていることを確かめるのではなく、穴を探す役を別の AI に任せるやり方です。同じ書き手が書いて確かめると同じ盲点を持つので、このプロジェクトではコードを変えたら外の AI に見てもらう決まりにしています。

やったことなぜ結果
今週の3つの数字を見た週の分析
人の表示が11/11から急に減っていた
計測のコードの変更・送信・ブロックを確かめた
故障かどうかを見るため
計測のコードは11/6から変わっていない。機械として数えられる記録は届く
Claude の読みを1件ずつの時刻で返せるようにした
「試しが混ざっているかも」で止めていたため
11/3 の12件はエイイチの試しと確定。残りはだれか分からない
Codex に敵対的検証を頼んだ
結論の言い過ぎを探すため
4つの結論のうち2つ撤回・1つ弱め・1つ範囲を限定
同じ曜日どうしで数え直し、Search Console と LinkedIn の投稿数を並べた
Codex が挙げた次の確認のため
減ったのは主に「直接・不明」。Search Console の表示回数も11/10から落ちて見えるが、まだ途中の数
計測の除外設定の穴と、読み方の説明を直した
Codex の指摘
0時またぎの二重の数え方は未修正

下の図で、人の表示と同じ日のほかの数を切り替えて見られます。Claude の4つの結論と Codex の判定も、押すと理由が出ます。

作業ログ ― 週の分析から Codex の検証まで

この記事のコード・ログ・データは、1ファイルずつ下に置いています。全文はリンク先にあります。

ファイルの一覧(5本)

01_sec01.md ― Codex への検証の依頼書(codex_verification_request.md)・3,947字

02_sec01.md ― Codex の報告の全文(codex_report_20261112.md)・10,769字

03_sec01.py.txt ― 集計のスクリプト(summarize_LOG494.py)・3,157字

04_sec01.txt ― 集計の出力(summarize_LOG494_output.txt)・3,404字

05_sec01.txt ― 計測のコードに入れた変更(11/12 の4つの commit)・9,512字

11/9の週の3つの数字:AI に読まれる数は横ばいに見え、人の表示が急に減った

主に見る3つの数字(AI の利用者の依頼で読みに来た数・AI のサービスのリンクから来た人の数・サイト名の検索の数)を、計測の道具(kpi・site_usage・crawler_visits)で取りました。11/9(月)から11/12(木)の途中までの数です。

11/9〜11/12
11/2〜11/5(同じ曜日)
AI の利用者の依頼で読みに来た数
24(ChatGPT 18・Claude 6)
37
AI のリンクから来た人12
人の表示5392
サイト名の検索未記録0(途中の数)

人の表示は、日ごとに見ると11/9が28、11/10が20、11/11が3、11/12が2(19時まで)でした。最初の報告では「Claude の読みには、エイイチや Claude の試しが入っている可能性があります」と書き添えています。この一文が、あとで問題になりました。

人の表示が11/11に3件になった ― 最初に Claude が確かめたこと

計測の故障かどうかを、次の4つで確かめました。

  1. 計測のコードの変更:サイトのコード(GitHub の p2m-site)で、記録を送る部分(SiteMeasure.astro)と受け取る部分(worker/index.js の evRecord・evKind・guarded・sameSite)の最後の変更は11/6。11/10〜11/11 の変更は記事と病院の試算だけで、ページの共通の部品(レイアウト・ヘッダー)も変わっていなかった
  2. 記録が届くか:クラウドの Playwright(自動で動かすブラウザ)で、PC とスマホ(iPhone 13 のまね)から記事を開き、ページを隠したときに送る記録が受け付けられる(204)のを見た
  3. ブロックされていないか:クラウドのサーバーから開いても、確認画面は出ずに 200 が返った
  4. 機械と AI の読み:機械の表示は1日300〜400件のまま、AI の読みも普段どおりだった

ここから Claude は「故障ではなく、来訪が本当に減った」と報告しました。あとで分かったとおり、2 の自動のブラウザは navigator.webdriver(自動で動いている印)が立つので、記録は「機械」として数えられます。人として数えられる道筋は、ここでは一度も確かめていません。

記録が届くかを見た Playwright のスクリプト(t.js)

const { chromium, devices } = require('playwright');
(async () => {
  const b = await chromium.launch();
  for (const opt of [{}, devices['iPhone 13']]) {
    const ctx = await b.newContext(opt); const p = await ctx.newPage();
    const errs = []; p.on('pageerror', e => errs.push(e.message)); p.on('console', m => { if (m.type()==='error') errs.push(m.text()); });
    const res = [];
    p.on('request', r => { if (r.url().includes('/api/ev')) res.push('req '+r.method()); }); p.on('response', r => { if (r.url().includes('/api/ev')) res.push(r.status()); });
    p.on('requestfailed', r => { if (r.url().includes('/api/ev')) res.push('failed '+r.failure().errorText); });
    await p.goto('https://pixelstomotors.com/record/day18', { waitUntil: 'load' });
    await p.mouse.move(100,100); await p.waitForTimeout(1500);
    await p.evaluate(()=>{Object.defineProperty(document,'visibilityState',{value:'hidden',configurable:true});Object.defineProperty(document,'hidden',{value:true,configurable:true});document.dispatchEvent(new Event('visibilitychange'));window.dispatchEvent(new Event('pagehide'));}); await p.waitForTimeout(2000);
    console.log(opt.userAgent ? 'phone' : 'pc', 'ev:', res, 'errors:', errs.slice(0,5));
    await ctx.close();
  }
  await b.close();
})();

t.js の出力

pc ev: [ 'req POST', 204 ] errors: []
phone ev: [ 'req POST', 204 ] errors: []

最初の1回は、ページを移る操作で記録を送らせようとして、送信の様子が取れませんでした(送信は出ていたが、Playwright の応答の記録に残らない形だった)。ページを隠す操作に変えた2回目が上の出力です。

サーバーから開いたときの返り(curl)

$ curl -sS -o /dev/null -w '%{http_code} %{size_download}\n' -A 'Mozilla/5.0 (iPhone; CPU iPhone OS 18_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1' 'https://pixelstomotors.com/?p2m-notrack=1' --max-time 20
200 465845
$ curl -sS -o /dev/null -w 'ev POST no-origin: %{http_code}\n' -X POST https://pixelstomotors.com/api/ev -d '{}' --max-time 15
ev POST no-origin: 403

2つ目の 403 は、ほかのサイトからの送信を断る決まり(sameSite)が働いている印で、故障ではありません。

「直接・不明」の来訪の話は、エイイチの閲覧ではなかった

Claude は次に「先週の『直接・不明』には、エイイチの閲覧が入っていたかもしれない」と書きました。エイイチの返事は「いやないよ。ブロックしてるから」。エイイチのブラウザは ?p2m-notrack=1 で計測から外してあります。続けて、検索から来る人はもともと少なかったのでは、という指摘があり、数え直すと11/2〜11/12 の人の表示189件のうち、いちばん多いのは「直接・不明」82件で、Google は56件でした。重みの付け方を、Google 中心から「直接・不明」中心に直しています。

Claude の読みを1件ずつの時刻で見られるようにした

AI に読まれる数の推移を報告したとき、Claude はまた「Claude の分は、エイイチや私の試しが入っている可能性があります」と書きました。エイイチは、何度も確かめるよう言ってきたのに毎回同じことを書いている、と指摘しました。

これ調べられないの?毎回言うよね?何度もチェックさせているつもりだけど。

計測の記録(Cloudflare R2 の cr/{日付}/)には、1件ずつの時刻が入っていました。ただ、Claude が使う計測の道具(MCP の crawler_visits)は日ごとの合計しか返していません。そこで、クローラーを1つ指定したときに、1件ずつの時刻・ページ・結果を返すようにしました(worker/index.js の crStats に hits を足した)。

  • ねらい:「混ざりうる」で止めずに、時刻をチャットの履歴と突き合わせて確かめる
  • 変わったこと:crawler_visits に bot を指定すると、新しい順に200件まで、日本時間の時刻とページが返る
  • 見込める効果:試しの分を数から外せる。ただし、読み切れなかった範囲がある日は最新の200件ではない(あとで Codex が指摘した)

返った時刻を、エイイチの claude.ai のチャットの履歴と突き合わせました。11/3 09:26〜09:29 の12件は、トップの「AIで読む」を Claude で試したチャット(LOG437)で、Claude が答えの出典に挙げたページと一致しました。残りの7回(ページ10件)は、該当するチャットが見つかりませんでした。

Claude は「11/8 に作業中の Claude がサイトを読んだのに、その日の記録は0件だったので、作業中の Claude の読みは記録に入らない。残りは外の人」と報告しました。エイイチは、表の7回を見て次のように答えています。

疑いあるのはこれだけなの?これだけならおれのはずないよ。もっとアクセスしているから

この「外の人」という言い切りも、Codex の検証で撤回することになります。

Codex への依頼:4つの結論と計測の作りの穴を探させた

依頼書には、Claude が出した4つの結論と、それぞれの攻めてほしい点を書きました。Codex はネットにつながらない前提で、コードの写し・数字の写し・依頼書だけを読んで判断します。依頼書と数字の写しは、計測のコード(index.js・kpi.js・mcp.js・SiteMeasure.astro・wrangler.jsonc)の写しと一緒に、Mac の PixelstoMotors/_measurement_review_20261112/ に置きました。

結論
Claude が出したときの言い方
1
11/11 からの人の表示の急減は計測の故障ではなく、来訪が本当に減った
2
減ったのは主に「直接・不明」で、Google からも減った
3
11/3 以降の Claude の読みのうち、試しは11/3 の12件だけで、残りは外の人
4
AI の依頼読みは横ばい(週55 → 61 → 4日で24)

依頼箱には「Codex を起動して検証を任せることだけ。検証そのものはしない」という依頼を置きました。前の依頼(病院のシミュレーション、依頼157)が18:31 に終わり、18:32 に始まって18:37 に終わっています。

Codex の判定:結論1と3は撤回、4は弱め、2は範囲を限れば言える

Codex の報告の最後の表を、そのまま載せます(報告の全文は下の節)。

結論判定と採用すべき言い方
1:故障ではなく本当の減少
故障を否定した部分は撤回。 『記録された操作あり表示は11/11に3件、11/12途中に2件。実減か選択的欠損かは未確定』
2:直接・不明とGoogleが減った
記録上の11/11以降の減少に限定すれば可。 週全体のGoogle大幅減や直接流入の実減とする言い方は弱める。異なる長さ・曜日・途中日の合計比較は避ける
3:残り7回10ページは外部の人
外部帰属の断定を撤回。 『自己試行と確認された11/3分を除き、7つの時刻群・非robots10取得は帰属未確認』。7依頼/7人とも確定しない
4:AI依頼読みは横ばい
55→61→途中24の観測値はそのまま可、横ばいは弱める。 同期間・自己試行・取得単位・真正性を揃えるまでは傾向未確定

Claude が見落としていた点を、言い換えて並べます。

  • 人として数えられる道筋を確かめていなかった。 自動のブラウザの記録は「機械」になるので、204 が返っても、実際の人のブラウザ(Safari や LinkedIn・X のアプリの中のブラウザ)で記録が届くかの根拠にならない
  • スマホ幅の割合0%は、0件の意味ではなかった。 計測の表は割合を四捨五入して出すので、645件のうち1〜3件あっても0%と出る。実際に11/12 の人の表示2件のうち1件はスマホ幅だった
  • AI の読みの数は、ページの数ではなく取得の回数。 同じページを2回取れば2件、/llms.txt も入る。依頼の数や人数には直せない
  • 0時をまたいで送り直された表示を、2日に1件ずつ数える。 記録は届いた日の箱に入り、日ごとの集計はその日の中だけで同じ表示をまとめるため。Codex が実際の集計のコードを模擬のデータで動かして、二重になるのを確かめた
  • 自分の閲覧を外す設定が、ブラウザによっては効かない。 設定を覚える場所(localStorage)が使えないブラウザでは、?p2m-notrack=1 を付けて開いても記録を送っていた
  • 1件ずつの時刻(hits)は、読み切れなかった範囲がある日は最新の200件ではない。 全部のクローラーの記録を古い順に読んで途中で打ち切るため

分析し直し①:同じ曜日どうしで比べると、減ったのは「直接・不明」だった

Codex は、長さも曜日も違う期間の合計を比べるのをやめるよう指摘しました。計測の表(ev-stats)を「その日以降」で日ごとに取り、隣の日との差から1日ずつの数を出しました(スクリプトと出力は下の節)。

日人の表示Google から直接・不明サイト内機械の表示不明(操作なし)
11/2(月)3052022506
11/3(火)25412724310
11/4(水)168703495
11/5(木)21412334010
11/6(金)2912743094
11/7(土)1035132510
11/8(日)51403652
11/9(月)2884123839
11/10(火)209923196
11/11(水)31103741
11/12(木・19時まで)21103132

月〜水で比べると、人の表示は71 → 51、Google から17 → 18、直接・不明39 → 14でした。Google から来た数は月火ではむしろ増えていて、11/11 の1日だけ落ちています。直接・不明は、11/9 からすでに少なくなっていました。機械の表示は842 → 1,076 と増えていて、操作のない表示(不明)も21 → 16 で大きくは変わっていません。

11/11〜11/12 の人の表示5件のうち、スマホ幅は少なくとも1件ありました。「スマホが0になった」という手がかりは、四捨五入の見え方でした。

分析し直し②:Search Console の表示回数も11/10 から落ちて見える(まだ途中の数)

Codex は、計測の外の数と比べるよう挙げていました。Google の Search Console は、Google の検索結果にサイトが出た回数(表示回数)とクリックを Google の側で数えるので、サイトの中のプログラムが動かなくても数が残ります。

日クリック表示回数自前の計測の Google から
11/42968
11/561334
11/659812
11/71703
11/84951
11/961488
11/102219
11/11 13:00〜11/12 の24時間
03―

表示回数は1日70〜150回あったものが、11/10 は21回、直近24時間は3回でした。ただし Search Console の数は2〜3日遅れて確定し、画面の最終更新は6時間前でした。11/10 のクリックが2回なのに、自前の計測では Google から9件来ているので、11/10 の数はまだ途中だと見ています。表示回数が本当に落ちたのなら、サイトの中の計測とは関係なく Google の側で見つかりにくくなったことになるので、確定した数を11/15 以降に見直します。

自前の計測の「Google から」と Search Console のクリックは、もともと合っていません(11/6 は12件と5回)。Google の別の場所(画像検索・Discover・Google アプリなど)からも www.google.com として来るためと考えていますが、確かめてはいません。

分析し直し③:「直接・不明」の減り方は、LinkedIn の投稿を1日4本から1本にした時期と重なる

「直接・不明」には、リンク元を送らないアプリ(LinkedIn や X のアプリ、メール)から開いた人が入ります。11/9 に LinkedIn の投稿を、1日4本から平日に1日1本へ組み直していました(LOG478)。自動投稿の記録から、日ごとに出した本数を数えました。

日LinkedIn に出した本数直接・不明
11/447
11/5412
11/647
11/735
11/824
11/924
11/1019
11/1111
11/1211

11/2〜11/12 の人の表示には、LinkedIn に出した4コマ(/manga/ep126〜131)と課題地図(/issues/liability-demarcation・/issues/tacit-knowledge-capture)が1〜2件ずつ入っていて、出した投稿と同じページです。マンガは11/10 から LinkedIn に出していません。本数と「直接・不明」は同じ向きに減っていますが、11/10 は1本で9件あり、ぴったりとは合いません。LinkedIn が「直接・不明」の大きな部分だったという見方は、今の数では「重なる」までです。

分析し直し④:AI の依頼読みは、同じ曜日で比べると34 → 21

11/2〜11/411/9〜11/11
AI の依頼読み(取得の回数)3421
11/3 の試し12件を除くと2221

試しを除くと、同じ曜日どうしでほぼ同じでした。ただし数えているのは取得の回数で、1回の質問で何ページ読んだかが違えば数も変わります。「横ばい」とは言わず、観測した回数として残します。

直したコード:自分の閲覧を外す設定と、計測の読み方の説明

Codex の指摘のうち、すぐに直せて影響の小さい2つを直しました(commit 8af4e01)。

  • ねらい:自分の閲覧が人の数に混ざる穴をふさぐ。Claude が次の分析で同じ言い過ぎをしないよう、読み方の説明を検証の結果に合わせる
  • 変わったこと:?p2m-notrack=1 で開いた表示は、設定を覚えられないブラウザでも送らない。読み方の説明に「依頼読みは取得の回数」「作業中の Claude の読みが記録に入るかは未確認」「日ごとの集計は作ったあとの記録が入らず、0時またぎを二重に数えることがある」を書いた
  • 見込める効果:自分の閲覧が混ざる分が減る(どれだけ減ったかは数えられない)。次の週の分析で、試しや外の人を言い切らなくなる

0時をまたぐ二重の数え方と、1件ずつの時刻の打ち切りは、集計の作り(日付の決め方・まとめる範囲)を変える必要があるので、まだ直していません。

まだ決まっていないこと:人の表示の急減は、実機の1件を端から端まで追うまで決められない

Codex が挙げた、急減の原因を決めるための確認を、この記事の時点の状態と並べます。

確認状態
日本の家庭や携帯の回線で、実物の Safari と、LinkedIn・X のアプリの中のブラウザから1件開き、記録が「人」として残るまでを追う
公開のあと、LINE の中のブラウザで1件行い、「人」として残った(下の追記)。Safari と LinkedIn・X はまだ
11/10 前後に Cloudflare の設定(ボット対策・WAF・チャレンジ)や配信が変わっていないかを見る
まだ。計測のコードとサイトの共通の部品は変わっていない
元の記録を日付と範囲を固めて数え直し、Search Console の確定値と比べる
日ごとの数え直しはした(上の表)。Search Console は11/15 以降に確定値を見る

いま言えるのは、記録に残った人の操作のある表示が11/11 に3件、11/12(19時まで)に2件だったことと、同じ時期に「直接・不明」が先に減り、Search Console の表示回数も途中の数では落ちて見えることまでです。来訪が本当に減ったのか、人の記録だけが落ちているのかは、まだ分けられていません。

追記(19:14):LINE の中のブラウザから開いた1件は「人」として記録された

公開のあと、Codex が挙げた確認の1つ目を、エイイチのスマホで行いました。印(utm_source=p2mtest1112)を付けた住所を、スマホの LINE の自分だけのトークに貼ってタップし、LINE の中のブラウザで開いて少しスクロールしてから、ホーム画面に戻ってもらいました。最初は LinkedIn のアプリで自分あてのメッセージに貼ろうとしましたが、LinkedIn では宛先に自分を選べなかったので、同じくアプリの中のブラウザで開く LINE に替えています。

開いた住所:https://pixelstomotors.com/record/day18?utm_source=p2mtest1112

計測の表(ev-stats・11/12 から)を、人・機械・不明に分けて取ると、印の付いた1件は「人」のほうにだけありました。

分け
印 p2mtest1112 の表示
11/12 の表示スマホ幅の割合/record/day18
人(操作あり)13(開く前は2)67%1件・13秒・半分まで読んだ
機械03221%
6件(Claude の Playwright の確認を含む)
不明(操作なし)0250%0件

人の表示3件のうち2件がスマホ幅になったので、開いた1件はスマホ幅として数えられています。スマホのアプリの中のブラウザから来た人の記録は、実機の1件では落ちずに「人」として残った。 確かめたのは LINE とエイイチのスマホの1件だけで、Safari・LinkedIn や X のアプリの中のブラウザ・ほかの人の端末は見ていません。人の記録だけが落ちる経路が全部否定されたわけではありませんが、11/11 からの減少が本当の来訪の減少である側の根拠が1つ増えました。

確かめに使ったコマンドと出力(2026-11-12 19:15)

$ K=$(tr -d ' \n\r' < "$HOME/mnt/KIOXIA/p2m_stats_key.txt"); for w in human bot unknown; do curl -s --max-time 60 -H "Authorization: Bearer $K" "https://pixelstomotors.com/api/ev-stats?format=json&since=2026-11-12&who=$w" | python3 -c "
import json,sys;d=json.load(sys.stdin);w=d['byWeek'][0] if d['byWeek'] else {}
print('$w', 'utm:',[u for u in d['utmSources'] if 'p2m' in u['source']], 'views',w.get('views'),'sp%',w.get('spPct'), 'day18:',[p for p in d['byPage'] if p['path']=='/record/day18'])"; done
human utm: [{'source': 'p2mtest1112', 'count': 1}] views 3 sp% 67 day18: [{'path': '/record/day18', 'views': 1, 'medianSeconds': 13, 'read25Pct': 100, 'read50Pct': 100, 'read75Pct': 0, 'read100Pct': 0, 'deadClicks': 0, 'rageClicks': 0, 'copies': 0, 'videoPlays': 0, 'outClicks': 0}]
bot utm: [] views 322 sp% 1 day18: [{'path': '/record/day18', 'views': 6, 'medianSeconds': 2, 'read25Pct': 0, 'read50Pct': 0, 'read75Pct': 0, 'read100Pct': 0, 'deadClicks': 0, 'rageClicks': 0, 'copies': 0, 'videoPlays': 0, 'outClicks': 0}]
unknown utm: [] views 2 sp% 50 day18: []

この印の付いた1件は試しの表示なので、これからの人の数の分析では外して数えます。

Codex への検証の依頼書(codex_verification_request.md)

01_sec01.md3,947字・77行・markdown
# 敵対的検証の依頼:pixelstomotors.com の計測と、2026-11-12 の分析の結論

あなたの役目は、Claude が出した結論と計測の作りの**穴を探すこと**です。「合っている」と確かめるのではなく、「どこが間違っている可能性があるか」「どの結論が根拠より強く言い過ぎているか」を見つけてください。

このフォルダの中身:
- `code/` … 計測のコードの写し(p2m-site の HEAD は `code/HEAD.txt`)。`index.js`(Cloudflare Worker 本体。/api/ev・/api/cr-stats・/api/ev-stats・クローラーの記録)、`kpi.js`(3つの数字の日ごとの集計)、`mcp.js`(Claude が使う計測ツールと「読み方」の説明)、`SiteMeasure.astro`(ブラウザ側の記録)、`wrangler.jsonc`、`measurement_git_log.txt`(10/20 以降の関係する変更)
- `data_snapshot.md` … 計測ツールから写した数字と、Claude が行った確認
別のタブで開く保存

Codex に渡した数字の写し(data_snapshot.md)

# 計測の数字の写し(2026-11-12 16:00 ごろ、計測ツール kpi / site_usage / crawler_visits から)

日付は日本時間。週は月曜はじまり。11/12 は途中の数。

## 日ごとの数(kpi)

| 日 | 人の表示 (humanViews) | 外から入った人の表示 | AI の依頼読み (aiReads) | うち ChatGPT-User | うち Claude-User | AI のリンクから来た人 |
|---|---|---|---|---|---|---|
| 10/26 | 52 | – | 9 | 8 | 1 | 0 |
| 10/27 | 17 | – | 13 | 13 | 0 | 0 |
| 10/28 | 21 | – | 4 | 4 | 0 | 0 |
| 10/29 | 33 | – | 4 | 4 | 0 | 0 |
| 10/30 | 10 | – | 17 | 16 | 1 | 0 |
| 10/31 | 18 | – | 6 | 5 | 1 | 0 |
| 11/1 | 13 | – | 2 | 2 | 0 | 0 |
| 11/2 | 30 | 28 | 7 | 7 | 0 | 1 |
| 11/3 | 25 | 18 | 22 | 10 | 12 | 1 |
| 11/4 | 16 | 16 | 5 | 5 | 0 | 0 |
| 11/5 | 21 | 18 | 3 | 3 | 0 | 0 |
| 11/6 | 29 | 25 | 5 | 5 | 0 | 0 |
| 11/7(土) | 10 | 9 | 13 | 9 | 4 | 1 |
| 11/8(日) | 5 | 5 | 6 | 6 | 0 | 0 |
| 11/9 | 28 | 16 | 2 | 2 | 0 | 0 |
| 11/10 | 20 | 18 | 6 | 5 | 1 | 0 |
| 11/11 | **3** | **3** | 13 | 10 | 3 | 1 |
| 11/12(16時まで) | **2** | **2** | 3 | 1 | 2 | 0 |

## 人の表示の来た所(site_usage, who=human)

| 期間 | 合計 | Google | 直接・不明 | サイト内 | その他 |
|---|---|---|---|---|---|
| 11/2〜11/8 | 136 | 37 | 67 | 17 | LinkedIn など |
| 11/9〜11/12 | 53 | 19 | 15 | 14 | LinkedIn 2・keep.google 2・chatgpt 1 |
| 11/10〜11/12 | 25 | 14 | – | – | – |
| 11/11〜11/12 | 5 | 3 | – | – | t.co 1・chatgpt 1 |

- 11/11〜11/12 の全部の表示(人・機械・不明)は 645 件。うち機械 638・人 5・不明 2。スマホ幅(sp)の割合は 0%(11/2〜11/8 の人の表示では 21%)
- 機械の表示は 1日 300〜400 件で、11/11 以降も変わらない
- 11/2〜11/8 の「不明(操作なし)」47 件、11/9〜 17 件

## Claude-User の1回ずつの訪問(crawler_visits bot=Claude-User の hits。robots.txt を含む)

```
2026-11-12 13:18:00 /            ; 13:18:00 /robots.txt ; 13:17:59 /
2026-11-11 14:05:22 /message
2026-11-11 13:46:10 /            ; 13:46:10 /robots.txt ; 13:46:10 /
2026-11-10 21:08:38 /record/making-explainer-video-with-ai ; 21:08:37 /robots.txt
2026-11-07 18:15:34 /record/making-explainer-video-with-ai
2026-11-07 11:37:37 /series2     ; 11:37:37 /robots.txt
2026-11-07 07:53:48 /record/day78 ; 07:53:48 /robots.txt ; 07:53:47 /
2026-11-03 09:26:19〜09:29:39  /llms.txt?via=claude と記事11本(+ robots.txt)
```

## Claude が行った確認(2026-11-12)

1. 計測にかかわるコード(worker/index.js の evRecord・evKind・guarded・sameSite、SiteMeasure.astro)の最後の変更は 11/6。11/10〜11/12 の変更は記事・試算・トップの見た目だけ(code/measurement_git_log.txt)
2. クラウドの Playwright(Chromium)で、PC と iPhone 13 のエミュレーションから記事を開き、ページを隠す操作をして /api/ev への POST が 204 で受け付けられるのを確かめた。ページのエラーなし。navigator.webdriver が立つので機械として数えられる
3. クラウドのサーバーから curl で開いても、確認画面(チャレンジ)は出ず 200
4. 11/3 09:26〜09:29 の Claude-User 12件は、エイイチが claude.ai で TOP の「AIで読む」を試したチャット(LOG437)の出典と記事が一致
5. 11/8 に Claude Code のセッションが WebFetch で /serving-robot-one-less-staff を読んだが、11/8 の Claude-User は 0 件。ここから「Claude の作業のセッションの WebFetch は Claude-User に入らない」とした
6. エイイチは自分のブラウザの閲覧を計測から外している(本人談)。11/3 以降の Claude-User の未確認の7回について、本人は「自分ならもっと多く読むので、自分ではない」と言っている

依頼箱に置いた依頼(20261112_159)

---
作業フォルダ: /Users/shimazueiichi/r2r2r-scripts
上限時間: 90
---
# Codex に、サイトの計測と 11/11 からの人の急減の結論の敵対的検証を頼む

あなた(Claude Code)の仕事は **Codex を起動して検証を任せることだけ**。検証そのものはしない。どのファイルも変更しない(r2r2r-scripts も含む)。

## 手順

1. Codex CLI があるか確かめる:`command -v codex || ls ~/.npm-global/bin/codex`。見つからない・ログインが切れている場合は、何もせずに止めて、報告の「決めてほしいこと」にその旨を書く。
2. 次のコマンドで Codex に渡す(そのまま実行。検証依頼書の中身はあなたが要約・書き換えしない):

```bash
REVIEW_DIR="$HOME/Library/Mobile Documents/com~apple~CloudDocs/デスクトップ/ADAPT DESIGN/じぶんの/PixelstoMotors/_measurement_review_20261112"
find "$REVIEW_DIR" -type f -exec brctl download {} \; 2>/dev/null
codex exec --skip-git-repo-check -C "$REVIEW_DIR" -s workspace-write \
  "codex_verification_request.md を読んで、その指示どおりに検証し、報告を codex_report_20261112.md としてこのフォルダに書いてください。code/ と data_snapshot.md は読むだけで、書いてよいのはこの報告ファイルだけです。" \
  > "$REVIEW_DIR/_codex_run_20261112.log" 2>&1
```

3. 終わったら `codex_report_20261112.md` ができたか確かめる。
   - できていれば、報告には「できた」とそのパスと、最後のサマリ節だけを写す。
   - できていなければ、`_codex_run_20261112.log` の末尾 40 行を報告に写す。

## 守ること

- Codex の報告の中身をあなたが評価・手直ししない。
- `-s workspace-write` を外さない・制限を外す指定を足さない。
- 失敗しても自分で検証を代わりにやらない。

報告の最後は「判定:合格/止めた(決めてほしいことあり)/失敗」のどれか1つで終える。

Codex の報告の全文(codex_report_20261112.md)

02_sec01.md10,769字・175行・markdown
# pixelstomotors.com 計測・分析の敵対的検証

検証日:2026-11-12。対象 HEAD:`1e04e85`(写しの `code/HEAD.txt`)。

## 検証の範囲と結論

依頼書、`data_snapshot.md`、`code/` の全ファイルを対象に静的検証した。ネット接続、本番への送信、本番設定の照会は行っていない。Playwright・curl・チャット履歴の確認は、提供された記述であり、今回独立に再現した事実ではない。行番号はこのフォルダの写しに対応する。
別のタブで開く保存

日ごとの数を取ったスクリプト(fetch_ev_by_day.py)

鍵は KIOXIA の p2m_stats_key.txt から読み、中身は表示しません。Worker の処理が重く、1回の実行で全部の日を取ると時間切れになったので、日付を4〜5日ずつ渡して3回に分けて動かしました。1回は Worker の資源の上限(Error 1102)で失敗し、その日は取り直しています。

import json,subprocess,os,sys
K=open(os.path.expanduser('~/mnt/KIOXIA/p2m_stats_key.txt')).read().strip()
P=os.path.expanduser('~/days.json')
res=json.load(open(P)) if os.path.exists(P) else {}
def get(since,who):
    o=subprocess.run(['curl','-s','--max-time','60','-H','Authorization: Bearer '+K,f'https://pixelstomotors.com/api/ev-stats?format=json&since={since}&who={who}'],capture_output=True,text=True).stdout
    d=json.loads(o); w=d['byWeek']
    return dict(views=sum(x['views'] for x in w),sp=sum(round(x['spPct']*x['views']/100) for x in w),ref={r['from']:r['count'] for r in d['referrers']},trunc=d['truncated'])
for d in sys.argv[1:]:
    if d in res: continue
    res[d]={w:get(d,w) for w in ('human','bot','unknown')}
    json.dump(res,open(P,'w'),ensure_ascii=False)
print(sorted(res))

集計のスクリプト(summarize_LOG494.py)

03_sec01.py.txt3,157字・70行・python
"""LOG494 の集計:ev-stats を「その日以降」で日ごとに取った値の差から、1日ずつの数を出す。

使い方: python3 summarize_LOG494.py <LOG494_data のフォルダ>
入力:  ev_by_since_day.json(fetch_ev_by_day.py が /api/ev-stats?since=日付&who=human|bot|unknown を取ったもの)
       kpi_since1026.json(/api/kpi-stats?since=2026-10-26)
       linkedin_posted_by_day.txt(r2r2r-content の git log から数えた LinkedIn の自動投稿の数)
出力:  標準出力(summarize_LOG494_output.txt に保存する)
別のタブで開く保存

集計の出力(summarize_LOG494_output.txt)

04_sec01.txt3,404字・78行・text
== 1日ずつの表示(ev。人=人の操作あり・機械・不明=操作なし)と、人の表示の来た所
日          人  機械 不明  Google 直接・不明 サイト内 その他  打ち切り
2026-10-30   10   280   12       1         5        0      4  False
2026-10-31   18   255    4       3         6        9      0  False
2026-11-01   13   225    4       4         2        7      0  False
2026-11-02   30   250    6       5        20        2      3  False
2026-11-03   25   243   10       4        12        7      2  False
2026-11-04   16   349    5       8         7        0      1  False
別のタブで開く保存

Search Console から写した数(search_console_20261112.txt)

Google Search Console(sc-domain:pixelstomotors.com・検索タイプ:ウェブ)を 2026-11-12 19:10 ごろ(日本時間)に Chrome で開いて写した値。
画面の「最終更新日」は 6 時間前。新しい日の数は2〜3日遅れて確定するので、11/10 以降は途中の数の可能性がある。

■ 7日間(1日ごと)
日付        クリック  表示回数
2026/11/04      2        96
2026/11/05      6       133
2026/11/06      5        98
2026/11/07      1        70
2026/11/08      4        95
2026/11/09      6       148
2026/11/10      2        21
合計           26       661(平均 CTR 3.9%・平均掲載順位 15.8)

■ 24時間(1時間ごと・2026/11/11 13:00 から)
合計クリック 0・合計表示回数 3・平均掲載順位 33.7

■ 自前の計測(ev・人の操作ありの表示)で Google から来た数(比べるため)
11/04 8・11/05 4・11/06 12・11/07 3・11/08 1・11/09 8・11/10 9・11/11 1・11/12 1(19時ごろまで)

Claude-User の1回ずつの訪問(cr-stats・bot=Claude-User・11/9 から)

11/3 からで取ると、記録の読み込みが打ち切られた印(truncated)が付きました。11/9 からで取ると打ち切りはなく、11/9 以降の部分は両方で同じ9件でした。下は11/9 からの hits です。

[
 {
  "at": "2026-11-12 13:18:00",
  "path": "/",
  "via": "",
  "status": "200",
  "verified": "0"
 },
 {
  "at": "2026-11-12 13:18:00",
  "path": "/robots.txt",
  "via": "",
  "status": "200",
  "verified": "0"
 },
 {
  "at": "2026-11-12 13:17:59",
  "path": "/",
  "via": "",
  "status": "200",
  "verified": "0"
 },
 {
  "at": "2026-11-11 14:05:22",
  "path": "/message",
  "via": "",
  "status": "200",
  "verified": "0"
 },
 {
  "at": "2026-11-11 13:46:10",
  "path": "/",
  "via": "",
  "status": "200",
  "verified": "0"
 },
 {
  "at": "2026-11-11 13:46:10",
  "path": "/robots.txt",
  "via": "",
  "status": "200",
  "verified": "0"
 },
 {
  "at": "2026-11-11 13:46:10",
  "path": "/",
  "via": "",
  "status": "200",
  "verified": "0"
 },
 {
  "at": "2026-11-10 21:08:38",
  "path": "/record/making-explainer-video-with-ai",
  "via": "",
  "status": "200",
  "verified": "0"
 },
 {
  "at": "2026-11-10 21:08:37",
  "path": "/robots.txt",
  "via": "",
  "status": "200",
  "verified": "0"
 }
]

計測のコードに入れた変更(11/12 の4つの commit)

05_sec01.txt9,512字・119行・diff
commit 71cb145(2026-11-12 16:15)
crawler_visits:bot を指定したとき、1回ずつの訪問(日本時間の時刻・ページ)を hits に返す(Claude-User の読みがエイイチ・Claude の試しかを時刻で突き合わせるため)

diff --git a/worker/index.js b/worker/index.js
index bbe919f..e327cdb 100644
--- a/worker/index.js
+++ b/worker/index.js
@@ -593,7 +593,7 @@ async function crStats(request, env, url) {
別のタブで開く保存

次は、11/15 以降に Search Console の確定値と、実機の1件の記録を見る

Search Console の11/10〜11/12 の数が確定したら、表示回数が本当に落ちたかを見ます。落ちていれば Google の側の変化として原因を探し、落ちていなければ人の記録の道筋を疑います。それと並べて、アプリの中のブラウザから印を付けた住所を1件開き、記録が人として残るかを追います。0時をまたぐ二重の数え方は、日付の決め方をそろえてから直します。