AI に読まれるサイトへ ― 研究から仕事までの道を引き直した
この記事の素材(コード・ログ・データ 7ファイル・まとめてダウンロードあり)arrow_downwardpixelstomotors.com を開いている閲覧の約9割は機械で、人の閲覧は1日20表示前後でした。その少ない人が読みに来ていたのは、自分でロボットの学習環境を作る話と、配膳ロボットを現場で回す話です。 そこで、研究の記録から仕事の相談までの道を1晩で引き直しました。相談のページを作り、記事の書き出しを AI が答えに引用しやすい形に直し、公開したページを検索エンジンへすぐ知らせる仕組みを入れています。
このサイトには、ロボットの学習と配膳ロボットのシミュレーションの記録を、コードとログを省かずに400本ほど置いています。誰が、何を読みに来ているのか。それを知りたくて、自前で入れていた計測の数字を読みました。結果は思っていたのと違いました。計測の数え方では「ページが開かれた回数」が3日で867回ありましたが、そのうち751回は、検索エンジンのページの確かめや、自動で動くブラウザによるものでした。人だと分かるのは78回です。
数は少なくても、人の動きには形がありました。いちばん読まれていたのは「ロボットの AI の学習用 GPU を、買うか借りるか」の導入比較ガイドで、研究室の記録を何本も渡り歩いた人、記事の下に置いた調査メモや zip まで取りに来た人もいました。一方で、相談のフォームに入力を始めた人は0人です。詰まっているのは入口ではなく、読んだ人が「この人に頼める」と気づく出口のほうでした。
もう1つ分かったのは、AI の読み方です。サイトに来るクローラー(自動でページを集めに来るプログラム)を数えると、4日で4,298回。そのうち32回は、誰かが ChatGPT に質問し、その答えを作るために ChatGPT がこのサイトを読みに来た回数でした。人が検索するより AI に聞いて調べるようになると、AI に読まれて引用されることが、人に届く道そのものになります。
やったことは次のとおりです。
| やったこと | なぜ | どうなったか |
|---|---|---|
| 自前の計測の数を読む | 誰が何を読んでいるかを知るため | 人は1日20表示前後。読まれていたのは学習環境づくりと配膳ロボットの現場の話 |
| 小さな改善を4つ入れる | 数が少なくても損をしない所から直すため | ハコブくんの知らせの数を人と機械に分け、導入比較ガイドの最初に結論を出し、古い記録と記事の素材に入口を付けた |
| 改善の判断の基準を先に決める | あとで数字に合わせて基準を動かさないため | 効果・楽さ・施策の質の3つと、結論の決め方を決めた |
| MASTER を v2.1 にする | 研究の先に仕事を置くため | Mission に4行目を足し、主指標を「研究」と「仕事」の2本にした |
| 相談のページを作る | 何を頼めるかが分からなかったため | 一緒に手を動かすコンサルの案内(/consult)を公開した |
| 公開をすぐ Bing に知らせる | ChatGPT の検索は Bing を土台にしているため | 全674ページを知らせ、以後は公開のたびに自動で知らせる |
記事の書き出しを、問いへの答えにする | AI は答えに使える一文を探して読むため | 決まりを足し、研究の記録35本の書き出しを直した |
効果が出たかはまだ分かりません。人の閲覧が1週分たまる11月7日ごろに、決めた基準で確かめます。この記事の「見込める効果」は、すべて見込みです。
この記事の最初の段落も、新しく決めた書き出しの決まり(最初の1〜2文で、記事が答える問いに答える)で書いています。
作業ログ ― アクセスの数を読んでから、相談のページと書き出しの決まりを入れるまで
この記事のコード・ログ・データは、1ファイルずつ下に置いています。全文はリンク先にあります。
ファイルの一覧(7本)
01_sec01.txt ― 差分:p2m-site commit daae7c1(ハコブくんの数の直し・導入比較ガイドの結論・古い記録の帯・記事の素材の帯)・15,621字
02_sec01.txt ― 差分:p2m-site commit fdae8ed(相談のページを検索に出し、フッター・研究の記録の末尾・llms.txt からつなぐ)・6,349字
03_sec01.txt ― 差分:相談のページのデザインの直し(commit d6e6729・d9e4104・fc74adf・f51f95c)・30,623字
04_sec01.txt ― コード:src/pages/consult.astro(公開した最後の版)・12,715字
05_sec01.py.txt ― コード:tools/indexnow.py(鍵の値は <INDEXNOW_KEY> に置き換えた)・3,501字
06_sec01.py.txt ― データ:書き出しの直しの中身 spec.py(35本の答えの文とメタディスクリプション)・10,754字
07_sec01.txt ― 差分:MASTER v2 → v2.1・5,419字
自前の計測の表は、鍵がないと開かない作りだった
数を見る表(/api/ev-stats)を開くと、404(ページがない)が返ってきました。一緒に作業している AI(Claude)は「計測が止まっているかもしれない」と言いかけましたが、そうではありませんでした。5日前に、数の表を外から見られないよう、鍵(Cloudflare の秘密の値 STATS_KEY)を付けたときだけ開く作りにしていました。鍵がなければ、表は「ない」ふりをします。
鍵変えたよ。自分でやったんだから、あとのログから調べなよ
鍵の控えは、外付けの SSD(KIOXIA)に置いたファイルにあります。Claude は、そのファイルを中身を画面に出さずに読み込み、表に渡して数を取りました。鍵の場所と取り方は、検証の記録(claude/web_improvement_trial.md)に書き足しています。
人と機械を分けると、表示の約9割は機械だった
計測には、10月26日から「人か機械か」の印を付けていました。マウスや指の操作があった表示を「人」、自動で動くブラウザやクローラーの名乗りがある表示を「機械」、どちらでもない表示を「不明」にしています。
| 週(月曜はじまり) | 表示 | 人 | 機械 | 不明 | 印なし |
|---|---|---|---|---|---|
| 10/12〜10/18 | 22 | — | — | — | 22 |
| 10/19〜10/25 | 1,292 | 1 | 20 | 1 | 1,270 |
10/26〜10/28(途中) | 867 | 78 | 751 | 38 | 0 |
10月19日の週の1,270回には印がありません。表示時間の中央値が6秒なのに、75%以上読んだ割合が82%でした。一瞬で最後まで読み込む、機械に近い形です。人の数として使えるのは、10月26日からだけでした。
人の78表示の中身は次のとおりです。
| 見たもの | 数 |
|---|---|
| 表示時間の中央値 | 11秒 |
| 75%以上読んだ割合 | 24% |
| スマホの割合 | 46% |
| 来た所 | 直接・不明 39、サイト内 16、Google 16、Yahoo 3、LinkedIn 3、Google アプリ 1、Microsoft Teams 1 |
| よく見られたページ | 導入比較ガイド 14(75%以上読んだのは14%)、配膳ロボットのラストワンマイルの記事 6(外へのリンクを3回押した)、トップ 5、自宅の研究室づくり Log#1 4、模倣学習の先の考察記事 4 |
| 押したもの | |
| 迷い | リンクでない所を押した 4、連打 0 |
| フォーム | メッセージのページの表示 2、入力を始めた 0 |
外から来た訪問は約60回、1日20回前後です。見た人を見分ける番号を残さない作りなので、何人かは数えられません。
サイトのどんなことに興味持っているようですか?
人の関心は2本に分かれていました。自分でロボットの学習環境をどう作るか(導入比較ガイド・研究室の記録・π0.5 の記録)と、配膳ロボットを現場でどう回すか(ラストワンマイル・協働ロボットの法律)です。サイトが出しているものとは噛み合っていました。ただ、導入比較ガイドは、来た人を最後まで読ませられていません。
少ない数でも損をしない所から、4つ直した
まだはっきり改修がどんなことが必要かがわかるほど情報がないので、改修するとしたらどのあたりがいいですか?
数が少ないうちは、どの結果になっても損をしない所と、少ない数でも効果が見える所を選びました。
そのくらいの変更なら今進めてください。
1つ目は計測の直しです。更新を知らせるハコブくん(新しい記録が出ると画面の下を走るキャラクター)の数には、人と機械の区別がありませんでした。さらに、自分の閲覧を外す設定(?p2m-notrack=1)にも従っていませんでした。自分の確認の閲覧が「出た」に入っていたことになります。機械の印を付け、自分の閲覧を外すようにしました。
- ねらい:ハコブくんの知らせを、人だけの数で判断できるようにする
- 変わったこと:/api/hk-stats に「機械の印なし」「機械」「印なし(10/28より前)」の表と、?who=notbot などの絞り込みが付いた
- 見込める効果:今の「出た 643・押した 5」の割合(1%未満)が、人だけで出し直せる。11月7日ごろに確かめる
2つ目は導入比較ガイドです。最初の画面の文を、やったことの説明から結論に変えました。「結論:使うのが月180時間より少ないなら、借りる方が安い。RTX 5090 の PC を4年使う場合の目安です。買うなら、GPU のメモリは24GB以上が条件です。」
- ねらい:いちばん来るページで、最初の画面だけで答えが分かるようにする
- 変わったこと:最初の画面の文が結論になった(ページの数字の出典はそのまま)
- 見込める効果:計算機(#calc)へのクリックが増える。75%以上読んだ割合は下がってもよい。結論を最初に読んで離れるのは失敗ではないため
3つ目は古い記録です。検索から来た人は、mechArm の初期の DAY の記録に着くことが多く、そこで止まっていました。公開から60日より前の記録のタイトルの下に、同じシリーズの最新(シリーズが止まっていればサイト全体の最新)への黒い帯を出しました。
4つ目は記事の素材です。素材のファイルを分けて置いている記事のタイトルの下に、「この記事の素材(コード・ログ・データ ○ファイル・まとめてダウンロードあり)」の灰色の帯を出し、ファイルの一覧へ飛べるようにしました。
- ねらい:再現したい人が、記事を下までたどらずに素材へ着けるようにする(Mission の「再現可能な形で公開する」に近い動き)
- 変わったこと:素材のある48本の記事のタイトルの下に入口が付いた
- 見込める効果:押したものに「素材」(数える場所 files)が出る。/files/ への移動が増える
帯も結論の文も、押された回数を数える印を付けています。全体で約15分(依頼から公開と本番の確認まで)、そのうち人が手を動かした時間は0分でした。
改善の判断の基準を、次の改善の前に決めた
この改善は、「Claude と組んで数字を読む → 直す → 公開する、を回すと、売り物になるか」を確かめる検証の1回目です。基準をあとで決めると、出た数字に合わせて動かしてしまいます。
これを決めましょう!
| 見るもの | 基準 |
|---|---|
| 効果 | 判断できた改善のうち、半分以上が狙いどおりに動く(対象の数が30未満なら「判断できない」として数えない) |
| 楽さ | 改善1回あたり、人が手を動かした時間(判断・確認を含む)の平均が10分以内 |
| 施策の質 | Claude が出した案の3分の2以上が採用され、公開後の直し・戻しが改善1回あたり1回以下 |
| 結論の決め方 | 3つとも満たせば「売り物として成り立つ」、2つなら「条件つき」、1つ以下なら「成り立たない」 |
AI に読まれているのは誰か、クローラーの内訳を出した
AIがたくさん読んでいるのはなぜですか?記事ペースが多いから?
自前の計測は、ページの中の仕掛け(JavaScript)が動いたときだけ数えます。ChatGPT などが記事を集めに来るときの多くは、ページの文字を取るだけで、仕掛けを動かしません。そのため、配信のときに名乗りで見分けて数える別の表(/api/cr-stats)を、10月25日から置いていました。
| クローラー | どこの何か | 回数 | 見たページ |
|---|---|---|---|
meta-externalagent | Meta(AI) | 1,040 | 700 |
| Googlebot | Google(検索) | 997 | 422 |
| Amazonbot | Amazon(Alexa・AI) | 686 | 534 |
| Applebot | Apple(Siri・検索・AI) | 346 | 217 |
| GoogleOther | Google(その他) | 322 | 179 |
| ClaudeBot | Anthropic(学習) | 319 | 227 |
| GPTBot | OpenAI(学習) | 228 | 225 |
| bingbot | Bing(検索。ChatGPT の検索・Copilot も使う) | 193 | 103 |
| OAI-SearchBot | OpenAI(ChatGPT の検索) | 109 | 53 |
| ChatGPT-User | ChatGPT(利用者の依頼で読む) | 32 | 17 |
| Bytespider | ByteDance(AI) | 10 | 4 |
| YandexBot | Yandex(検索) | 10 | 1 |
| Baiduspider | Baidu(検索) | 2 | 2 |
| DuckDuckBot | DuckDuckGo(検索) | 2 | 1 |
| Yeti | Naver(検索) | 1 | 1 |
| Claude-User | Claude(利用者の依頼で読む) | 1 | 1 |
4日で4,298回、今週は1日あたり約1,400回です。記事の数そのものより、10月17日に検索に出す設定へ切り替え、サイトマップと AI 向けの案内(/llms.txt)を置いたことで、一通り集めに来ている形です。GPTBot や ClaudeBot は、記事の外に分けたコード(LOG383 のスクリプトなど)まで1本ずつ読んでいました。
ChatGPT-User の32回のうち14回はトップページで、試しに URL を渡した読みが混ざっていると見ています。残りは、マイクロファクトリー、π0.5 の学習、配膳ロボットの費用と補助金、Claude Code の課金など、16本の記事に1回ずつ散らばっていました。
これは狙い通りかな。これがもっと増えてほしいところだね
研究の先に仕事を置き、MASTER を v2.1 にした
Claude は最初、MASTER(判断の軸を書いた上位の文書)に沿って「AI に引用される数は副次の指標で、主指標は再現可能な環境数」と答えました。
まぁそうだけど、人がAIを活用するので同じくらい大事だよ
それとも仕事や相談につながる入口として、が大事だろうね。研究だけしていても意味はなく、研究の先に仕事が必ずないといけないかな
このやり取りで、話の中心が「引用の数」から「研究から仕事までの道」に移りました。MASTER を直した所は次のとおりです。
| 直した所 | 前 | 後 |
|---|---|---|
| Mission | 3行(環境を作る・再現可能な形で公開する・誰でも始められる状態を増やす) | 4行目「その研究を、Physical AI を導入する組織と一緒に手を動かす仕事につなげる。」を足した |
| 主指標 | 再現可能な環境数(唯一) | 研究=再現可能な環境数/仕事=仕事につながった数(相談を実際に行った件数と、有料になった件数の2段) |
| 手前の指標 | なし | AI 経由で人に届いた数(ChatGPT-User など。記事のページだけ)と、相談のページへ来た数。目標にはしない |
| 契約層の主 | 共同研究/R&D契約/Motion UX コンサル | 一緒に手を動かすコンサル(主)/共同研究/R&D契約 |
| 相談の窓口 | AI活用の記事とフォームだけ。トップ・SNS には出さない | フィジカルAI は /consult。フッターと SNS のプロフィール欄にもリンクを1つ置く。トップの画面の中と SNS の投稿には出さない |
相談の窓口を「トップと SNS に出さない」決まりを残すかでは、4つの案(残す/フッターとプロフィール欄にだけ置く/トップに出す/投稿でも呼びかける)を並べ、フッターとプロフィール欄にだけ置く案になりました。探した人だけが確実にたどり着け、「まず記録を読んでもらう」も崩さない形です。
一緒に手を動かすコンサルの案内を作った
コンサルが一番ありそうかな。オンラインや定期的に時間を作って出張するくらいなら可能な気がする。でもコンサルと言っても一緒に手を動かすが前提にはなると思うけど
決まったことは、打ち合わせは週1回、訪問は月1回くらい(全国どこでも。交通費と宿泊費は別)、料金はページに出さず相談で決める、最初の相談はオンライン30分まで無料、それ以降は有料、の5つです。MASTER は新しい肩書きやキャッチコピーを作ることを禁じているので、「伴走型」のような名前は付けず、「一緒に手を動かすコンサル」と中身をそのまま書いています。
最初の画面は、主役の違う3案(一緒にやること/根拠の数字/進め方)を作り、「一緒にやること」を主役にした案Aにしました。来た人が何を頼めばいいか分からないことが問題だったので、最初の画面はその答えにしています。

ページは、最初の画面(一緒にやること3つ)、根拠の数字、進め方、誰がやっているか、の順です。根拠の3つ目は、はじめ「止まった配膳ロボットを店員が直す時間(約5秒)」にしていましたが、1年の記録(/one-year)につながる「1年分の作業ログ379本」に替えました。
デザインは、導入比較ガイドに合わせて直しました。色・太い見出し・白抜きの番号の見出し・大きな数字の並べ方・白と薄い灰色と黒の帯をそろえ、写真や絵は使っていません。そのあと画面を見ながら、次の順に直しています。
| 直し | 中身 |
|---|---|
| 1 | 見出しが「フィジカルAI/の導入を、」で折れていたので小さくした |
| 2 | 最初の画面のカードの上の線を消し、上下の余白を詰めた(ページ全体の節の余白が、最初の画面にも重なっていた) |
| 3 | 最初の画面の 01〜03 のカードを押すと、各節へ移るようにした |
| 4 | 進め方のカードの上の線を消し、マウスを乗せると黒くなるようにした |
| 5 | ボタンとカードに、ガイドのボタンと同じ 4px の角丸を付けた |
| 6 | 相談のボタンを、ガイドの相談のボタンと同じオレンジ(#f2600c)にした |

- ねらい:記録を読んで興味を持った人が、何を頼めるかと、頼んだらどう進むかを1ページで分かるようにする
- 変わったこと:フッターの「相談について」、研究室と導入シミュレーションの記録の末尾、AI 向けの案内(/llms.txt)から /consult へつながった。ボタンは相談の種類「フィジカルAI」を選んだ状態でフォームを開く
- 見込める効果:相談のページへ来た数と、そこからフォームに進んだ数で確かめる。今のフォームの入力開始は0
公開したページを、IndexNow で Bing にすぐ知らせるようにした
ChatGPT の検索は、Bing の検索結果を土台にしています。今までは、Bing が自分で巡回して見つけるのを待っていました。IndexNow は、ページを公開したときに、こちらから検索エンジンへ「このページが変わった」と知らせる仕組みです。
main に push すると、GitHub Actions が公開を2分待ってから、増えた・変わったページだけを送ります。記録が変わったときは、トップと /llms.txt も一緒に送ります。最初の1回は、サイトマップの全674ページを送りました。
1回目は 403 で断られました。サイトマップを取りに行く Python の既定の名乗りが Cloudflare の守りに止められたのと、鍵のファイルの確認がまだ済んでいなかったためです。名乗りを付け、数分待って送り直すと、200(受け付けた)が返りました。鍵のファイル名は IndexNow の決まりで公開する文字列ですが、この記事では <INDEXNOW_KEY> に置き換えています。
- ねらい:新しい記録が ChatGPT の答えに使われるまでの時間を短くする
- 変わったこと:公開のたびに、変わったページが自動で Bing などに届く
- 見込める効果:ChatGPT-User が読みに来る回数(今は3日で32回、うち14回はトップ)で確かめる
記事の最初の1〜2文を、問いへの答えにする決まりを足し、35本を直した
AI は、質問への答えに使える一文を探してページを読みます。今までの書き出しの決まりは「最初の1〜2段落で、何が起きていたか・なぜ気になるかを言う」でしたが、最初の文が場面の説明だと、答えとして切り出せません。記事の書き方の決まり(article_rules.md)の冒頭の書き出しに、次を足しました。
- 書く前に、その記事が答える問いを1つ決める。問いは本文に書かない
- 最初の1〜2文で、その問いに答える。主語・対象・条件・数字を入れ、「今回」「この店」のような前後に頼る語を使わない
- 道具や機体は、最初に出る所で正式な名前にする(例: Physical Intelligence の π0.5)
- 実物の話か、シミュレーションの話かを、答えの文の中で分かるようにする
- 答えが出ていない記事は、今の時点で分かっていることを1文で書く
- メタディスクリプションの最初の文も、同じ答えにそろえる
フィジカルAI研究所とサービスロボット導入シミュレーションの記事はこの形式に全て直してください。
公開済みの記録は直さない決まりがありますが、直すように言われたときは直します。フィジカルAI研究室の15本とサービスロボット導入シミュレーションの20本、合わせて35本の書き出しを直しました。最初の差し替えでは LOG352 の1本が漏れていて、対象の記事の数(35)と直した数(34)が合わないことを確かめの段階で見つけ、あとから足しています。多くは、今の書き出しの前に答えの段落を足しています。もともと冒頭に答えがあった7本(LOG361・370・374・382・393・397・398)は、最初の文だけを置き換えました。
| 記事 | 前の最初の文 | 後の最初の文 |
|---|---|---|
| LOG393 | 28卓の小さなファミレスに配膳ロボットを2台入れたら、… | 3Dのファミレスのシミュレーションで、28卓の小さな店に配膳ロボットを2台入れると、… |
| LOG382 | 配膳ロボットを入れたら、ホールのスタッフを1人減らせるのか。 | 配膳ロボットでホールのスタッフを1人減らせる条件は、…試算で見つかりましたが、差し引きは月約7.5万円の持ち出しでした。 |
| LOG345 | お手本を19回見せて覚えさせた AI に、机の上のロボットアームを初めて動かさせました。 | お手本19本で学習した Physical Intelligence の π0.5 で mechArm 270 を初めて動かすと、…手首が指令の角度に届かず止まりました。 |
検索結果に出る説明文(メタディスクリプション、Studio から移した記事は description)の最初の文も同じ答えにそろえ、AI が読む全文のファイル(記事の素材の中の全文)にも同じ直しを入れました。数字は、それぞれの記事の本文と説明文にあるものだけを使っています。直した35ページは、IndexNow で公開と同時に知らせています。
次に確かめること
| いつ | 何を |
|---|---|
| 11月7日ごろ | 改善 No.01 の結果(導入比較ガイドの計算機へのクリック、「今の続き」と「素材」の帯が押された数、ハコブくんの知らせの人だけの割合) |
| 11月7日ごろ | ChatGPT-User が読みに来た回数と、読まれた記事(IndexNow と書き出しの直しの効果) |
| 11月7日ごろ | 相談のページに来た数と、そこからフォームに進んだ数 |
| 残り | X と LinkedIn のプロフィール欄への相談のページのリンク、MASTER v2.1 の Project への貼り替え(人の手で行う) |
差分:p2m-site commit daae7c1(ハコブくんの数の直し・導入比較ガイドの結論・古い記録の帯・記事の素材の帯)
commit daae7c1
アクセスの数から見た小さな改善4つ(計測の直し・導入比較ガイドの結論・古い記録から今への道・記事の素材の入口)
- ハコブくんの記録も ?p2m-notrack=1 と「トラッキングしないで」に従い、機械の印(k)を付ける。/api/hk-stats に人と機械の表と ?who=notbot・bot・old
- 導入比較ガイドの最初の画面の文を、結論(月180時間より少ないなら借りる方が安い・買うならGPUメモリ24GB以上)に変える
- 公開から60日より前の記録のタイトルの下に、シリーズの最新(なければサイト全体の最新)への道を出す(数える場所 now)
- 分けたファイルのある記事のタイトルの下に、素材の枠(#files)への入口を出す(数える場所 files)
- README に、Claude の確認では ?p2m-notrack=1 を付けることと、上の決まりを書く差分:p2m-site commit fdae8ed(相談のページを検索に出し、フッター・研究の記録の末尾・llms.txt からつなぐ)
commit fdae8ed
相談のページ(/consult)を検索に出し、フッター・研究の記録の末尾・llms.txt からつなぐ(MASTER v2.1)
- フッターの ADAPT DESIGN の列に「相談について」
- フィジカルAI研究室と導入シミュレーションの記録の末尾に、仕事で使うときの一言と /consult へのボタン(AI活用の相談の案内が出る記事には出さない)
- /llms.txt の導入前ガイドの並びに /consult
- /consult の noindex とサイトマップからの除外を外し、構造化データ(Service)を足す
- トップの画面の中と SNS の投稿には出さない差分:相談のページのデザインの直し(commit d6e6729・d9e4104・fc74adf・f51f95c)
commit d6e6729
相談のページのデザインを導入比較ガイドにそろえ、3つ目の根拠を1年の記録へ
- 色・文字(Manrope+Noto Sans JP の 900)・番号の見出し(白抜きの 01〜03)・数字の強調(.facts3)・白/薄い灰色/黒の帯・角のないボタンを、/gpu-buy-or-rent と同じ値にした。差し色の橙(実際に払った分専用)は使わない
- 3つ目の根拠を「店員が直す時間」から「1年分の作業ログ 379本」(/one-year へ)に替えた
- 見出しの1行目が「フィジカルAI/の導入を、」で折れないよう、大きさを下げた
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>コード:src/pages/consult.astro(公開した最後の版)
---
// 一緒に手を動かすコンサルの案内(2026-10-28)。「何を頼めるか」を書き、ほかのページの出口はここへつなぐ
// 決めたこと(エイイチ 2026-10-28):打ち合わせは週1回・訪問は月1回くらい(全国どこでも。交通費・宿泊費は別)・
// 料金はページに出さず相談で決める・最初の相談はオンライン30分まで無料、それ以降は有料
// 最初の画面は案A(一緒にやることが主役)。新しい肩書き・キャッチコピーは付けない(MASTER の枝概念の追加禁止)
// デザインは導入比較ガイド(/gpu-buy-or-rent)にそろえる(色・文字・番号の見出し・数字の強調・帯)。写真や絵は使わない(2026-10-28)
// 入口(MASTER v2.1・2026-10-28):フッター(相談について)・研究の記録の末尾(フィジカルAI研究室・導入シミュレーション)・/llms.txt。
// トップの画面の中と SNS の投稿には出さない(SNS はプロフィール欄にだけリンクを置く)コード:tools/indexnow.py(鍵の値は <INDEXNOW_KEY> に置き換えた)
#!/usr/bin/env python3
"""公開したページを、IndexNow で検索エンジン(Bing など。ChatGPT の検索は Bing を土台にしている)にすぐ知らせる(2026-10-28)。
使い方(.github/workflows/indexnow.yml が main への push のたびに動かす)
python3 tools/indexnow.py <前の commit> <今の commit> … その間に増えた・変わったページだけ知らせる
python3 tools/indexnow.py --all … 公開中のサイトマップの全ページを知らせる(最初の1回・まとめて出し直すとき)
どちらも --dry-run を付けると、送らずに一覧だけ出す
コード:.github/workflows/indexnow.yml
# 公開したページを、IndexNow で検索エンジン(Bing など)にすぐ知らせる(2026-10-28)
# main に push されたら、Cloudflare の公開(約40秒)を待ってから、増えた・変わったページだけを送る
# 手で動かすとき(Actions の画面の Run workflow)は、公開中のサイトマップの全ページを送る
# 中身は tools/indexnow.py
name: 公開したページを検索エンジンに知らせる
on:
push:
branches: [main]
paths: ['src/**', 'public/**']
workflow_dispatch:
permissions:
contents: read
concurrency:
group: indexnow
cancel-in-progress: false
jobs:
notify:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: 公開を待つ
run: sleep 120
- name: 知らせる
env:
BEFORE: ${{ github.event.before }}
AFTER: ${{ github.sha }}
run: |
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
python3 tools/indexnow.py --all
else
if [ -z "$BEFORE" ] || [ "$BEFORE" = "0000000000000000000000000000000000000000" ]; then BEFORE="$AFTER~1"; fi
python3 tools/indexnow.py "$BEFORE" "$AFTER"
fi
出力:IndexNow の最初の送信(全674ページ)
# 鍵のファイルが公開されたかを確かめる
$ curl -s -o /dev/null -w "key %{http_code}\n" https://pixelstomotors.com/<INDEXNOW_KEY>.txt
key 200
# 1回目:Python の既定の名乗りでサイトマップを取りに行くと、Cloudflare に止められた
urllib.error.HTTPError: HTTP Error 403: Forbidden
# 2回目:サイトマップは curl で取り、送信に名乗りを付けた。鍵の確認がまだ済んでいなかった
674 True
status 403 b'{"errorCode":"SiteVerificationNotCompleted","message":"Site Verification is not completed. Please wait for some time for the verification to complete and try again.","details":null}'
# 3回目:数分待って送り直した
674 status 200
データ:書き出しの直しの中身 spec.py(35本の答えの文とメタディスクリプション)
# 書き出しの直し(2026-10-28・article_rules.md「最初の1〜2文は、問いへの答えにする」)
# mode: 'pre' = 今の最初の段落の前に、答えの段落を足す / ('rep', old) = 最初の段落の頭の old を new に置き換える
# meta: メタディスクリプション(md の記事だけ。120字以内・最初の文を答えにそろえる)
SPEC = {
'precision-is-not-learning-so101': dict(mode='pre',
new='ロボットアームの動きを細かく合わせる表(FKテーブル)をいくら濃くしても、アームが失敗から学ぶようにはなりません。精度を上げることと失敗から学ぶことは別の仕事だと、mechArm 270 の動的追従の作業を振り返る対話で行き着き、次は失敗から学ぶアームを SO-101 で作ることにしました。'),
'where-learning-data-lives': dict(mode='pre',
new='模倣学習で生まれるデータ(人が操作して集めたお手本・手首カメラの録画・学習途中のモデル)は、Mac の中ではなく 2TB の外付け SSD を定位置にして、1か所に集めることにしました。決める前に、Mac の空き容量が約90GBから20GBまで減っていた原因を突き止めて片付けました。'),コード:書き出しを記事・説明文・全文のファイルに入れたスクリプト
# 書き出しの直し(spec.py の SPEC)を、記事・メタディスクリプション・分けたファイルの全文に入れる(p2m-site の中で実行)
import sys,json,glob,re,os
sys.path.insert(0,'/tmp/claude-0/-home-claude/32a20279-f0a5-5df7-ae34-d5ed505a9d2f/scratchpad/lead'); from spec import SPEC
done=[];full=[];bad=[]
for k,v in SPEC.items():
if 'meta' in v and len(v['meta'])>120: bad.append((k,'meta',len(v['meta'])))
def first_para_start(body):
return body.lstrip()[:40]
for f in glob.glob('src/content/records/*.md'):
t=open(f,encoding='utf-8').read(); _,fm,body=t.split('---',2)
m=re.search(r'^slug:\s*"?([\w.-]+)"?',fm,re.M); slug=m.group(1)
if slug not in SPEC: continue
v=SPEC[slug]; lead=body.lstrip()
p1=lead[:40]
if v['mode']=='pre':
newbody=body.replace(lead, v['new']+'\n\n'+lead,1); anchor=p1
else:
old=v['mode'][1]
if not lead.startswith(old): bad.append((slug,'old not at start')); continue
newbody=body.replace(old, v['new'],1); anchor=None
if 'meta' in v:
fm2=re.sub(r'^meta_description:.*$', 'meta_description: '+json.dumps(v['meta'],ensure_ascii=False), fm, count=1, flags=re.M)
if fm2==fm: bad.append((slug,'no meta line'))
fm=fm2
open(f,'w',encoding='utf-8').write('---'+fm+'---'+newbody); done.append(slug)
day=re.search(r'^day:\s*(\d+)',fm,re.M).group(1)
for ff in glob.glob(f'public/files/LOG{day}/LOG{day}_full.*'):
s=open(ff,encoding='utf-8').read()
if v['mode']=='pre':
i=s.find(p1)
if i<0: bad.append((slug,'full: p1 not found',ff)); continue
s=s[:i]+v['new']+'\n\n'+s[i:]
else:
if old not in s: bad.append((slug,'full: old not found',ff)); continue
s=s.replace(old,v['new'],1)
if 'meta' in v: s=re.sub(r'^meta_description:.*$', 'meta_description: '+json.dumps(v['meta'],ensure_ascii=False), s, count=1, flags=re.M)
open(ff,'w',encoding='utf-8').write(s); full.append(ff)
for f in glob.glob('src/data/records/*.json'):
d=json.load(open(f,encoding='utf-8'))
if d['slug'] not in SPEC or d.get('series') not in ('フィジカルAI研究室','導入シミュレーション'): continue
v=SPEC[d['slug']]; assert v['mode']=='pre'
i=d['body'].find('<p'); d['body']=d['body'][:i]+'<p>'+v['new']+'</p>'+d['body'][i:]
json.dump(d,open(f,'w',encoding='utf-8'),ensure_ascii=False,indent=2); done.append('studio:'+d['slug'])
day=re.sub(r'\D','',d['day'])
for ff in glob.glob(f'public/files/LOG{day}/LOG{day}_full.*'):
s=open(ff,encoding='utf-8').read(); i=s.find('<p');
if ff.endswith('.html') and i>=0: s=s[:i]+'<p>'+v['new']+'</p>'+s[i:]; open(ff,'w',encoding='utf-8').write(s); full.append(ff)
else: bad.append((d['slug'],'studio full not html',ff))
print(len(done),'done'); print(len(full),'full files'); print('BAD',bad)
出力:書き出しを入れたスクリプトの出力(LOG352 が漏れる前の1回目)
35 done
32 full files
BAD [('pi05-mecharm-demo-to-inference', 'studio full not html', 'public/files/LOG337/LOG337_full.md')]
.../records/precision-is-not-learning-so101.json | 64 ++++++++++++-
src/data/records/where-learning-data-lives.json | 52 ++++++++++-
67 files changed, 637 insertions(+), 81 deletions(-)
コード:Studio から移した記事の JSON を1行の形に戻したスクリプト
# Studio から移した記事の JSON が、上の json.dump(indent=2) で整形し直されてしまったので、元の1行の形に戻す
import json,glob
for f in glob.glob('src/data/records/*.json'):
import subprocess
if subprocess.run(['git','diff','--quiet','--',f]).returncode==0: continue
d=json.load(open(f,encoding='utf-8'))
open(f,'w',encoding='utf-8').write(json.dumps(d,ensure_ascii=False))
コード:ビルドしたページで書き出しを確かめたスクリプト
# ビルドしたページで、本文(目次のあと)の最初に答えの文があるか、説明文(meta description)が答えで始まるかを確かめる
import sys,re,html; sys.path.insert(0,'/tmp/claude-0/-home-claude/32a20279-f0a5-5df7-ae34-d5ed505a9d2f/scratchpad/lead'); from spec import SPEC
for slug,v in SPEC.items():
h=open(f'dist/record/{slug}.html',encoding='utf-8').read()
body=h[h.find('class="richText"'):]
body=re.sub(r'<nav class="toc">.*?</nav>','',body,count=1,flags=re.S)
body=re.sub(r'^.*?<!--TOC-->','',body,count=1,flags=re.S)
txt=html.unescape(re.sub('<[^>]+>','',body)).replace('class="richText">','')
head=v['new'].replace('**','')[:30]
ok=txt.lstrip()[:400].find(head)>=0
md=html.unescape(re.search(r'<meta name="description" content="([^"]*)',h).group(1))
print(('OK ' if ok else 'NG '), slug, '| 説明文:', md[:45])
出力:書き出しの確かめ(LOG352 を足したあと・35本)
OK precision-is-not-learning-so101 | 説明文: アームの動きを合わせる表(FKテーブル)を濃くしても、失敗から学ぶようにはならない。精度を
OK where-learning-data-lives | 説明文: 模倣学習のデータは、Macではなく2TBの外付けSSDを定位置にして1か所に集めることにし
OK building-a-physical-ai-lab-at-home | 説明文: ロボットのAI(Physical AI)が学習できる環境を、個人の自宅にゼロから作り、誰で
OK openpi-remote-inference-first-run | 説明文: Physical Intelligenceのπ0.5はMacでは動かないが、Runpodで
OK pi05-libero-benchmark-first-run | 説明文: Physical Intelligenceのπ0.5は、Runpodで借りたA40の上で、
OK pi05-mecharm-demo-to-inference | 説明文: Physical Intelligenceのπ0.5をmechArm 270のお手本2本で
OK pi05-mecharm-lora-2000-steps | 説明文: Physical Intelligenceのπ0.5をmechArm 270のお手本19本
OK pi05-mecharm-first-real-run | 説明文: お手本19本で学習したPhysical Intelligenceのπ0.5でmechArm
OK pi05-mecharm-4000-steps | 説明文: Physical Intelligenceのπ0.5の学習を4,000ステップに倍にしても
OK drag-teach-waypoint-replay | 説明文: mechArm 270に姿勢を手で教えて再生させる方法で、ブロックを箱に入れる動きを4回続
OK serving-robot-simulation-simpy | 説明文: 配膳ロボットでスタッフを1人減らせるかは店の形で分かれた。混む2時間をSimPyで再現した
OK serving-robot-observation-sheet | 説明文: 配膳ロボットが店で何回止まるかは公開データが見つからなかった。そこで、止まった場所と原因、
OK pi05-retrain-five-positions | 説明文: 置き場所を5か所に広げたお手本19本で、Physical Intelligenceのπ0.
OK service-robot-five-sites | 説明文: 病院の検体搬送・夜間清掃・ホテル配送・夜間警備・歩道の配送の5現場を調べると、ロボットが人
OK unity-family-restaurant-serving-robot | 説明文: Unityに35卓のファミレスを建て配膳ロボット2台を走らせると、最初の版では往復の88%
OK pi05-learned-the-pauses | 説明文: Physical Intelligenceのπ0.5は、お手本の中の止まっている時間まで覚
OK audit-simulator-before-unity | 説明文: 配膳ロボットの試算をUnityに合わせる前に試算を点検し、入店待ちを満席と「席はあるのに片
OK floor-plans-into-simulator | 説明文: 配膳ロボットの試算に平面図のある店を6つ足し、卓まで何m走るか・通路の一番狭い所が何cmか
OK pi05-first-block-in-box | 説明文: Physical Intelligenceのπ0.5で動かすmechArm 270が、初め
OK unity-store-from-site-json | 説明文: Unityのファミレスを試算の店の図面(JSON)から建てると、卓42・席160・ロボット
OK pi05-all-three-positions | 説明文: Physical Intelligenceのπ0.5で動かすmechArm 270が、試し
OK serving-robot-jam-points | 説明文: Unityのファミレスで配膳ロボット2台を回すと、店が止まった原因は助けに行く店員がロボッ
OK serving-robot-cost-subsidy | 説明文: 配膳ロボット2台を月額で借りる試算では、99条件のうち47条件で店が回る人数は減らなかった
OK serving-robot-stage-b-18-runs | 説明文: Unityのファミレスと配膳ロボットの試算は、ロボットなしなら料理の待ちが平均0.2〜0.
OK serving-robot-fixed-route-jam | 説明文: Unityのファミレスで配膳ロボット2台が向かい合って止まり続けた元は、ロボットを決まった
OK serving-robot-map-planner | 説明文: Unityのファミレスで配膳ロボットに店の地図を渡し、道を自分で引いて回り込む形にすると、
OK serving-robot-hidden-waits | 説明文: Unityのファミレスで配膳ロボットを入れても入店待ちが縮まなかった原因は、レジの決まりと
OK serving-robot-video-part2 | 説明文: 配膳ロボットでホールを1人減らせる条件は試算で見つかったが、差し引きは月約7.5万円の持ち
OK serving-robot-night-runs | 説明文: Unityのファミレスのシミュレーションを、画面なしの実行ファイルと結果の自動振り分けで夜
OK serving-robot-pass-by-standard | 説明文: Unityのファミレスでは、Macが忙しいほど配膳ロボットが詰まる回数が増えた。夜は4本同
OK serving-robot-video-ledger | 説明文: 実店舗の配膳ロボットの動画5本をコマ送りで読むと、止まったロボットを直す作業は1〜10秒、
OK small-store-second-robot-wait | 説明文: 3Dのファミレスで28卓の小さな店に配膳ロボットを2台入れると、入店待ちはロボットなしの倍
OK large-store-cleanup-bottleneck | 説明文: 配膳ロボットを足すと入店待ちは縮むが、大きなファミレスで詰まるのはレジではなく片付けと案内
OK standby-jam-every-store | 説明文: 38卓のファミレスをUnityの3Dで再現しても、配膳ロボットを足すと入店待ちは縮んだが、
OK teach-replay-19-demos | 説明文: mechArm 270に手で教えた動きを再生しながら録り、Physical Intelli
決まり:article_rules.md に足した節「最初の1〜2文は、問いへの答えにする」
### 最初の1〜2文は、問いへの答えにする(2026-10-28 エイイチの指示)
**記事の最初の1〜2文は、その記事が答える問いへの答えとして、その文だけを切り出しても意味が通る形で書く。** 人が検索するより AI に聞いて調べることが増え、AI は答えに使える一文を探してページを読む(ChatGPT が利用者の依頼で記事を読んだ回数を、サイトのクローラーの記録 /api/cr-stats で見ている)。最初の文が経緯や場面の説明だと、答えとして引用されない。
- 書く前に、その記事が答える問いを1つ決める(例: 「配膳ロボットを入れると、店は速くなるのか」)。問いは本文に書かなくてよい
- 最初の1〜2文で、その問いに答える。主語・対象・条件・数字を入れ、「これ」「今回」「前回」「この記事」のような、前後を読まないと分からない語に頼らない
- 道具・モデル・機体は、最初に出る所で正式な名前にする(例: Physical Intelligence の π0.5、Runpod の A40)
- 実物の話か、シミュレーションの話かを、答えの文の中で分かるようにする
- 答えが出ていない記事(途中の記録・考察記事)は、「今の時点で分かっていること」か「今の考え」を1文で答える。分からないことは分からないと書く
- その次の文から、上の書き出しの決まり(何が起きていたか・なぜ気になるか・全体の見渡し)に続ける。答えの文が、冒頭の太字の1か所を兼ねてよい
- メタディスクリプションの最初の文も、同じ答えにそろえる
- Q&A の形(「Q.」「A.」)や、問いをそのまま見出しにする書き方はしない。ふだんの文章で答える
- 公開前の確かめ:最初の2文だけを読んで、問いへの答えになっているかを見る
見本(LOG397 をこの決まりで書いたとき):
> 配膳ロボットを足すと入店待ちは縮むが、大きなファミレスで詰まるのは会計のレジではなく、食べ終えた卓の片付けと空いた席への案内だった。46卓・200席の店を Unity の3Dで再現したシミュレーションで、ロボットの台数を変えて確かめた。
この見本で見るところ:最初の文だけで「ロボットを足すとどうなるか」に答えている。「今回」「この店」のような前後に頼る語がない。2文目で、シミュレーションの話だと分かる。
差分:MASTER v2 → v2.1
--- /tmp/claude-0/-home-claude/32a20279-f0a5-5df7-ae34-d5ed505a9d2f/scratchpad/master/MASTER_before.md 2026-10-28 20:05:31.317635495 +0900
+++ /tmp/claude-0/-home-claude/32a20279-f0a5-5df7-ae34-d5ed505a9d2f/scratchpad/master/MASTER_v2.1_20261028.md 2026-10-28 20:09:16.997285436 +0900
@@ -1,7 +1,7 @@
# Pixels to Motors — MASTER v2
-バージョン: v2(実行フェーズ)
-最終更新: 2026-10-26
+バージョン: v2.1(実行フェーズ)