# 書き出しの直し（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まで減っていた原因を突き止めて片付けました。'),
 'building-a-physical-ai-lab-at-home': dict(mode='pre',
  new='ロボットの AI（Physical AI）が学習できる環境を、個人の自宅にゼロから作り、誰でも同じ手順で作り直せる形で公開するシリーズを始めました。目的はロボットを持つことではなく、学習と推論を自分の手で回せる環境を残すことです。'),
 'openpi-remote-inference-first-run': dict(mode='pre',
  new='Physical Intelligence の π0.5 は手元の Mac では動きませんが、Runpod で NVIDIA A40 の GPU を時間単位で借りれば動かせました。Mac から画像と指示文を送り、π0.5 が返すロボットアームの動きの数値を受け取るところまで通しました。'),
 'pi05-libero-benchmark-first-run': dict(mode='pre',
  new='Physical Intelligence の π0.5 は、Runpod で借りた NVIDIA A40 の上で、シミュレータ LIBERO の中のアームを動かし、「黒いボウルを拾って皿に置く」作業を20回すべて成功させました。あわせて、π0.5 が使う GPU メモリの量を測りました。'),
 'pi05-mecharm-demo-to-inference': dict(mode='pre',
  new='Physical Intelligence の π0.5 は、mechArm 270 で録ったお手本のうち2本で200ステップ追加学習しただけで、学習の誤差（loss）が0.1031から0.0162に下がり、Mac から動きの予測を受け取れるところまで進みました。実物のアームはまだ動かしていません。',
  meta='Physical Intelligenceのπ0.5をmechArm 270のお手本2本でA40で200ステップ追加学習すると、lossは0.1031から0.0162へ下がり、Macで予測を受け取れた。実機はまだ動かしていない。'),
 'pi05-mecharm-lora-2000-steps': dict(mode='pre',
  new='Physical Intelligence の π0.5 を mechArm 270 のお手本19本で2,000ステップ追加学習すると、実物のアームに送る前の予測は、お手本の最初の1秒と関節ごとに数度以内で一致しました。',
  meta='Physical Intelligenceのπ0.5をmechArm 270のお手本19本で2,000ステップ学習すると、実機に送る前の予測はお手本の最初の1秒と数度以内で一致した。lossは0.1155から0.0054へ。'),
 'pi05-mecharm-first-real-run': dict(mode='pre',
  new='お手本19本で学習した Physical Intelligence の π0.5 で mechArm 270 を初めて動かすと、アームはブロックの真上までは来ましたが、手首が指令の角度に届かず止まりました。原因は手前の爪がブロックの上に乗っていたことで、関節の記録ではなく動画で分かりました。',
  meta='お手本19本で学習したPhysical Intelligenceのπ0.5でmechArm 270を初めて動かすと、ブロックの真上で手首が指令に届かず止まった。原因は爪がブロックに乗っていたことで、動画で分かった。'),
 'pi05-mecharm-4000-steps': dict(mode='pre',
  new='Physical Intelligence の π0.5 の学習を2,000ステップから4,000ステップへ倍にしても、mechArm 270 が手を伸ばす先は変わらず、爪は2回ともブロックの奥で空を閉じました。学習の誤差（loss）は0.0030まで下がっていました。',
  meta='Physical Intelligenceのπ0.5の学習を4,000ステップに倍にしても、mechArm 270が手を伸ばす先は変わらず、爪は2回ともブロックの奥で空を閉じた。lossは0.0030まで下がっていた。'),
 'drag-teach-waypoint-replay': dict(mode='pre',
  new='mechArm 270 の姿勢を人が手で動かして教え、アームにそのまま再生させる方法（ダイレクトティーチング）で、ブロックを箱に入れる動きを4回続けて成功させました。最初は床に当たって止まりましたが、教える姿勢を高めにし、着いたかを確かめる幅を広げて直しました。',
  meta='mechArm 270に姿勢を手で教えて再生させる方法で、ブロックを箱に入れる動きを4回続けて成功させた。床に当たって止まったが、高めに教え直し確認の幅を広げて直した。π0.5に渡すお手本を作るため。'),
 'serving-robot-simulation-simpy': dict(mode='pre',
  new='配膳ロボットを入れてホールのスタッフを1人減らせるかは、店の形で分かれます。飲食店の混む2時間をパソコンで再現した試算では、35卓のファミレスは入口の待ちが7.7分から14.0分に延び、焼肉の食べ放題は8.2分から4.5分に縮みました。',
  meta='配膳ロボットでスタッフを1人減らせるかは店の形で分かれた。混む2時間をSimPyで再現した試算で、ファミレスは入店待ちが7.7分から14.0分に延び、食べ放題は8.2分から4.5分に縮んだ。'),
 'serving-robot-observation-sheet': dict(mode='pre',
  new='配膳ロボットが店の通路で何回止まるかは、公開されたデータが見つかりませんでした。そこで、止まった場所と原因、皿を下げる時間などを、店でスマホを押して数える観察シートを作りました。',
  meta='配膳ロボットが店で何回止まるかは公開データが見つからなかった。そこで、止まった場所と原因、皿を下げる時間、設定を変える前と後を、店でスマホを押して数える観察シートを作った。'),
 'pi05-retrain-five-positions': dict(mode='pre',
  new='ブロックの置き場所を5か所に広げたお手本19本で、Physical Intelligence の π0.5 を Runpod の A40 で4,000ステップ学習し直すと、学習の誤差（loss）は0.0858から0.0037に下がりました。GPU の空きを待ったため、学習を始めるまでに約4時間半かかりました。',
  meta='置き場所を5か所に広げたお手本19本で、Physical Intelligenceのπ0.5をA40で4,000ステップ学習し直すと、lossは0.0858から0.0037へ。GPUの空き待ちで起動まで約4時間半かかった。'),
 'service-robot-five-sites': dict(mode='pre',
  new='配膳の次にサービスロボットが入りそうな5つの現場（病院の検体搬送・夜間清掃・ホテルの配送・夜間警備・歩道の配送）を調べると、ロボットが人を呼ぶ回数はどの現場も公開されていませんでした。そこで、その回数を仮に置いて変えられる試算を作りました。',
  meta='病院の検体搬送・夜間清掃・ホテル配送・夜間警備・歩道の配送の5現場を調べると、ロボットが人を呼ぶ回数はどこも公開されていなかった。仮に置いて変えられるSimPyの試算を作った。'),
 'unity-family-restaurant-serving-robot': dict(mode='pre',
  new='Unity に35卓のファミレスを建て、配膳ロボット2台を走らせる3Dのシミュレーションを作ると、最初の版では往復の88%でロボットが60秒以上動けませんでした。原因はロボットより、店の間取りと人の動きの側にありました。',
  meta='Unityに35卓のファミレスを建て配膳ロボット2台を走らせると、最初の版では往復の88%でロボットが60秒以上動けなかった。原因はロボットより店の間取りと人の動きの側にあった。'),
 'pi05-learned-the-pauses': dict(mode='pre',
  new='Physical Intelligence の π0.5 は、お手本の動きと一緒に、お手本の中でアームが止まっていた待ち時間まで覚えていました。止まっている時間を詰めて学習し直すと、mechArm 270 はブロックをつかんで箱まで運びましたが、持ち上げずに箱の外で離しました。',
  meta='Physical Intelligenceのπ0.5は、お手本の中の止まっている時間まで覚えていた。停止を詰めて学習し直すと、mechArm 270はブロックをつかんで箱まで運んだが、持ち上げずに箱の外で離した。'),
 'audit-simulator-before-unity': dict(mode='pre',
  new='配膳ロボットの試算を Unity の3Dのシミュレーションに合わせる前に、試算のほうを点検し、入店待ちを「満席で待つ」と「席はあるのに片付け・案内が追いつかずに待つ」に分けました。席があるのに10分以上待たせる条件を「店が回らない」として、試算のページに出しました。',
  meta='配膳ロボットの試算をUnityに合わせる前に試算を点検し、入店待ちを満席と「席はあるのに片付け・案内が追いつかない」に分けた。席があるのに10分以上待つ条件を「店が回らない」とした。'),
 'floor-plans-into-simulator': dict(mode='pre',
  new='配膳ロボットの試算に平面図のある店を6つ足し、ロボットが卓まで何m走り、通路の一番狭い所が何cmかを、図面から測って計算に入れました。図面は、昔働いたファミレスの記憶と、席の並べ方の決まりからコードで起こしました。',
  meta='配膳ロボットの試算に平面図のある店を6つ足し、卓まで何m走るか・通路の一番狭い所が何cmかを図面から測って入れた。図面は昔働いたファミレスの記憶と席の並べ方の決まりからコードで起こした。'),
 'pi05-first-block-in-box': dict(mode=('rep', '机の上の小さなロボットアームが、AI の指示だけで赤いブロックをつかみ、持ち上げて、白い箱の中に落としました。人がお手本を見せて学ばせた AI でこのアームを動かし始めてから、ブロックが箱に入ったのはこれが初めてです。'),
  new='Physical Intelligence の π0.5 で動かす mechArm 270 が、初めて赤いブロックをつかんで持ち上げ、白い箱に入れました。AI は学習し直さず、AI に渡す肩の角度を直前の目標に変えただけで、毎回約2°ずつ足りずに箱に当てていた動きが直りました。',
  meta='Physical Intelligenceのπ0.5で動かすmechArm 270が、初めてブロックを箱に入れた。学習し直さず、AIに渡す肩の角度を直前の目標に変えただけで、毎回約2°足りず箱に当てていた動きが直った。'),
 'unity-store-from-site-json': dict(mode='pre',
  new='Unity の3Dのファミレスを、配膳ロボットの試算が使う店の図面（JSON）からそのまま建てる形にすると、卓42・席160・ロボットが止まる位置42か所がサイトと一致しました。80cm通路の店で人が21卓に入れなかった原因は、Unity に残っていた古い「通れる床」の計算でした。',
  meta='Unityのファミレスを試算の店の図面（JSON）から建てると、卓42・席160・ロボットの止まる位置42か所がサイトと一致した。80cm通路の店で人が21卓に入れない原因は古い通れる床の計算だった。'),
 'pi05-all-three-positions': dict(mode='pre',
  new='Physical Intelligence の π0.5 で動かす mechArm 270 が、お手本を録った置き場所のうち試した3か所（位置C・D・E）すべてで、ブロックを白い箱に入れました。ただ、位置D は離す前に爪から落ち、位置E は箱の縁すれすれでした。',
  meta='Physical Intelligenceのπ0.5で動かすmechArm 270が、試した3か所すべてでブロックを箱に入れた。Dは離す前に爪から落ち、Eは縁すれすれ。運ぶ間の肩はお手本より2.9〜4.0°低かった。'),
 'serving-robot-jam-points': dict(mode='pre',
  new='Unity の3Dのファミレスで配膳ロボット2台を最後まで回すと、店が止まった原因はロボットではなく、助けに行く店員がロボットに近づけない決まりの食い違いでした。詰まりを1つずつ直すと、時間切れになった往復は47のうち45から、51のうち16に減りました。',
  meta='Unityのファミレスで配膳ロボット2台を回すと、店が止まった原因は助けに行く店員がロボットに近づけない決まりの食い違いだった。詰まりを直し、時間切れの往復は47中45から51中16に減った。'),
 'serving-robot-cost-subsidy': dict(mode='pre',
  new='配膳ロボット2台を月額で借りる試算では、99条件のうち47条件で、店を回すのに要るスタッフは1人も減りませんでした。1人減る条件でも、浮く人件費（月14.1万円）はロボット2台の費用（月14.4万円）とほぼ同じでした。',
  meta='配膳ロボット2台を月額で借りる試算では、99条件のうち47条件で店が回る人数は減らなかった。1人減る条件でも浮く人件費とロボットの費用はほぼ同じ。補助金と人件費以外の変化も並べた。'),
 'serving-robot-stage-b-18-runs': dict(mode='pre',
  new='Unity の3Dのファミレスと配膳ロボットの試算は、ロボットなしなら料理の待ちが平均0.2〜0.4分の差で合いましたが、ロボットを入れると3.5〜4.5分ずれました。店2つ×ロボット0〜2台×3回の18回を回して確かめました。',
  meta='Unityのファミレスと配膳ロボットの試算は、ロボットなしなら料理の待ちが平均0.2〜0.4分差で合ったが、ロボットを入れると3.5〜4.5分ずれた。店2つ×0〜2台×3回の18回で確かめた。'),
 'serving-robot-fixed-route-jam': dict(mode=('rep', '配膳ロボットを2台入れたファミレスを、Unity（建物や人を3Dで置いて動かせるソフト）の中で動かすと、2台が通路で向かい合ったまま動けなくなる場面が何度も出ていました。直しても直しても、詰まる場所が変わるだけでした。調べていくと、**詰まりの元は、ロボットを決まった線の上しか走らせない Unity の作りでした。**'),
  new='**Unity（建物や人を3Dで置いて動かせるソフト）の中のファミレスで、配膳ロボット2台が通路で向かい合ったまま動けなくなっていた元は、ロボットを決まった線の上しか走らせない作りでした。** それまでは、直しても直しても、詰まる場所が変わるだけでした。',
  meta='Unityのファミレスで配膳ロボット2台が向かい合って止まり続けた元は、ロボットを決まった線の上しか走らせない作りだった。皿を卓に着いた時点で届いたにする直しも入れた。'),
 'serving-robot-map-planner': dict(mode=('rep', '配膳ロボットを2台入れたファミレスを Unity（建物や人を3Dで置いて動かせるソフト）の中で動かすと、2台が通路で向かい合ったまま止まる場面が何度も出ていました。原因は、ロボットに1本の線の上しか走らせない作りでした。そこで、実際の配膳ロボットと同じように、**ロボットに店の地図を渡し、行き先までの道を自分で引かせ、前がふさがったら回り込ませる形に変えると、60秒以上止まった回数は57回から20回に減りました。**'),
  new='**Unity（建物や人を3Dで置いて動かせるソフト）の中のファミレスで、配膳ロボットに店の地図を渡し、行き先までの道を自分で引かせ、前がふさがったら回り込ませる形に変えると、60秒以上止まった回数は57回から20回に減りました。** それまでは、ロボットに1本の線の上しか走らせない作りのせいで、2台が通路で向かい合ったまま止まる場面が何度も出ていました。',
  meta='Unityのファミレスで配膳ロボットに店の地図を渡し、道を自分で引いて回り込む形にすると、60秒の止まりは57回から20回に減り、料理の待ちは試算に近づいた。ドリンクバーも動かした。'),
 'serving-robot-hidden-waits': dict(mode='pre',
  new='Unity の3Dのファミレスで、配膳ロボットを入れても入店待ちが縮まなかった原因は2つあり、レジの会計が1組ずつだったことと、片付け待ちを途中で打ち切る仕組みでした。試算にもレジを入れ、Unity を直すと、ロボットを足すと待ちが縮む向きは試算とそろい、詰まる場所の違いが残りました。',
  meta='Unityのファミレスで配膳ロボットを入れても入店待ちが縮まなかった原因は、レジの決まりと片付け待ちの打ち切りだった。試算にレジを入れUnityを直すと向きはそろい、詰まる場所の違いが残った。'),
 'serving-robot-video-part2': dict(mode=('rep', '配膳ロボットを入れたら、ホールのスタッフを1人減らせるのか。ファミレスの混む2時間をパソコンの中で再現して確かめると、減らせる条件は見つかりました。'),
  new='配膳ロボットでホールのスタッフを1人減らせる条件は、ファミレスの混む2時間をパソコンの中で再現した試算で見つかりましたが、差し引きは月約7.5万円の持ち出しでした。',
  meta='配膳ロボットでホールを1人減らせる条件は試算で見つかったが、差し引きは月約7.5万円の持ち出しだった。その結果を伝える解説動画の2回目を試算v2.7で作り直した記録。'),
 'serving-robot-night-runs': dict(mode='pre',
  new='Unity の3Dのファミレスのシミュレーションを、画面を出さない実行ファイルで回し、結果を自動で「正常」「直す候補」などに振り分ける仕組みができて、人が寝ている間も回せるようになりました。1回は2〜3分で、画面を出して回すより約4.4倍速くなりました。',
  meta='Unityのファミレスのシミュレーションを、画面なしの実行ファイルと結果の自動振り分けで夜も回せるようにした。1回2〜3分でエディタの約4.4倍速い。基準の18回のずれも見つけて作り直した。'),
 'serving-robot-pass-by-standard': dict(mode='pre',
  new='Unity の3Dのファミレスのシミュレーションでは、同じ店・同じ条件でも、Mac がほかの仕事で忙しいほど配膳ロボットが動けなくなる回数が増えました（1本だけで回すと中央値1回、4本同時だと7回）。そこで夜は必ず4本同時で回すと決め、3晩200回のうち60回を、比べるときの基準にしました。',
  meta='Unityのファミレスでは、Macが忙しいほど配膳ロボットが詰まる回数が増えた。夜は4本同時に固定し、3晩200回のうち、すれ違いは止まらず通る形の60回を比べる基準にした。'),
 'serving-robot-video-ledger': dict(mode='pre',
  new='実店舗の配膳ロボットの動画5本をコマ送りで読むと、止まったロボットを店員が直す作業は1〜10秒で、店員が来るまでには18秒から45秒以上かかっていました。時間の大半は、直すことではなく、止まったことに人が気づいて来るまでに使われていました。',
  meta='実店舗の配膳ロボットの動画5本をコマ送りで読むと、止まったロボットを直す作業は1〜10秒、店員が来るまでは18秒〜45秒以上だった。台帳にして3Dのシミュレーションの前提と比べた。'),
 'small-store-second-robot-wait': dict(mode=('rep', '28卓の小さなファミレスに配膳ロボットを2台入れたら、お客さんが席に着くまでの待ち時間は、ロボットがいないときの倍になりました。'),
  new='3Dのファミレスのシミュレーションで、28卓の小さな店に配膳ロボットを2台入れると、お客さんが席に着くまでの待ち時間は、ロボットがいないときの倍になりました。',
  meta='3Dのファミレスで28卓の小さな店に配膳ロボットを2台入れると、入店待ちはロボットなしの倍、試算の約7倍に延びた。席・ドリンクバー・回し方を直し、待機場所へ戻らない作りの誤りを見つけた。'),
 'large-store-cleanup-bottleneck': dict(mode=('rep', '46卓・200席の大きなファミレスを3Dで建てて、配膳ロボットを走らせました。'),
  new='配膳ロボットを足すと入店待ちは縮みますが、大きなファミレスで詰まるのは会計のレジではなく、食べ終えた卓の片付けと空いた席への案内でした。46卓・200席の店を Unity の3Dで再現したシミュレーションで、配膳ロボットを走らせて確かめました。',
  meta='配膳ロボットを足すと入店待ちは縮むが、大きなファミレスで詰まるのはレジではなく片付けと案内だった。46卓の店をUnityの3Dで再現し、ロボットの抜け道を店の形で作って確かめた。'),
 'standby-jam-every-store': dict(mode=('rep', '38卓・158席のファミレスを3Dで建てて、配膳ロボットを0台・1台・2台で走らせました。'),
  new='38卓・158席のファミレスを Unity の3Dで再現したシミュレーションでも、配膳ロボットを足すと入店待ちは縮みましたが、詰まるのは会計のレジではなく、片付けと案内でした。ロボットは0台・1台・2台で走らせました。',
  meta='38卓のファミレスをUnityの3Dで再現しても、配膳ロボットを足すと入店待ちは縮んだが、詰まるのはレジではなく片付けと案内だった。建てる前に図面を直し、30回回して確かめた。'),
 'teach-replay-19-demos': dict(mode='pre',
  new='mechArm 270 に人が手で教えた動きを再生させながら上のカメラで録り、Physical Intelligence の π0.5 に渡すお手本を、ブロックの置き場所5か所で19本集めました。肩を約88°より深く倒した姿勢は、命令がエラーなしに捨てられ、アームが動きませんでした。',
  meta='mechArm 270に手で教えた動きを再生しながら録り、Physical Intelligenceのπ0.5に渡すお手本を5か所19本集めた。肩を約88°より深く倒した姿勢は、命令がエラーなしに捨てられていた。'),
}
