====================================================================
依頼91：下げ膳で卓に着いた台のふさぎを直し、120回を回し、比較動画の素材を撮る（ここで区切る）
2026-11-04 09:39〜12:20　作業場所 cs:77 → cs:78　build_id cs78_20261104_1011（画面なし・保留 0）
====================================================================

結論
  ・(イ) と (ウ) を入れた（cs:78。bus の回だけ働く）。serve の回は base73 と記録が一致、bus の同じ種の2回も一致
  ・120 回（bus75）：瞬間移動 0・1コマの跳び 0。全員が帰らなかった回は 4 回 → 1 回（④2台 種4）。
    解けずに残った詰まりは 53 件 → 4 件（どれも ④2台 種4）。上限で戻った 14 回・卓で待つ下げ膳の台を動かす助け 166 回
  ・④2台 種4 は、料理の往復の2台が向かい合って止まったもの（下げ膳の台ではない。依頼90 と同じ場所）。区切りに従い記録だけにした
  ・比較動画の素材を撮った（③2台 種7 の serve と bus。どちらも全員帰った）。通しのパネル付き動画も2本作った（どちらも 10.5 倍）
  ・止める線（瞬間移動・serve が base73 と違う・bus の同じ種の2回が違う）には当たっていない

--------------------------------------------------------------------
0. 始める前の確かめ（どれも依頼どおり）
--------------------------------------------------------------------
  Unity エディタ・night_runner・rec_runner：動いていない（Unity Hub だけ）／KIOXIA：マウント済み／unity_ledger_v1.lock：無し／
  保留 0／作業場所 cs:77 - head
  台帳を archive/unity_ledger_v1_pre_bus91_20261104/ に退避（2804 行・md5 8beaf91f429e049ce10152bd5ebf6946）

--------------------------------------------------------------------
1. 入れたこと（cs:78。条件の mode が bus の回だけ働く）
--------------------------------------------------------------------
  (イ) 卓でスタッフを待っている下げ膳の台は、助けで動かしてよい
    ・30 秒動けなかった台の向かい合いの相手が、卓でスタッフを待っている下げ膳の台なら、その台を動かす
      （往復を終えて止まっている台と同じ扱い：止まっている方を動かす。動かす先の決め方も同じ＝相手の道の先から
       相手の半径＋前のセンサー 0.6 m＋自分の半径＋robotYieldSeparationM 離れた、床をたどって届く所）
    ・押されたあとは道を引き直さず、押された所でスタッフを待ち続ける。載せ終えたら、そこから洗い場へ
      （スタッフはそのまま卓で載せる。押されている間は卓での待ちの続きなので止まりに数えない）
    ・人が 30 秒動けず、すぐ前に止まっている台があるときにどかす決まり（依頼84）にも、この台を入れた。
      ただし、その台の片付けのスタッフのためにはどかさない
    ・助けのスタッフが 60 秒着けずに交代するとき、相手の台に動かす台を替える決まり（依頼84）にも、この台を入れた
    ・料理の受け渡し中の台（25 秒）は、今までどおり動かさない
  (ウ) 卓でスタッフを待つ時間の上限 120 秒（ServiceOps.BusWaitCapSec）
    ・台が卓に着いて（スタッフのそばで着いたとみた時も）から 120 秒たっても、スタッフが皿を載せ始めていなければ、
      皿を載せずに待機場所へ戻る（洗い場には寄らない）。その卓はスタッフが人だけで下げる（返却口へ運ぶ・拭く。今までの人だけと同じ）
    ・スタッフがもう載せ始めていたら戻らない（皿を載せたまま放り出さないため）
    ・120 秒はサイトの params に無い（試算には上限が無い）ので、コードの定数にした。サイトの試算に入れるかは決めてほしいこと 2
  記録（bus の回だけ。serve の回は今までと同じファイル・同じ列）
    ・bus_runs.csv のいちばん後ろに wait_capped（上限で戻ったら 1。end_why は「上限で戻った」）
    ・bus_summary.json に wait_cap_s（120）・bus_wait_cap_returns（上限で戻った回数）・bus_wait_rescue_calls（卓で待つ台を動かす助けを呼んだ回数）

  試しの回（check-in の前。書き先を KIOXIA の night/20261104_try91/ に向ける一時の直しを入れた版で、台帳には書いていない）：
    依頼90 で止まった4回のうち ③2台 種2・④2台 種9・⑥2台 種4 は全員帰った。④2台 種4 は残った（下の 5 章）。
    一時の直しは check-in の前に外した（HeadlessRun.cs は cs:77 と1字も違わないことを確かめ、保留から外した）

--------------------------------------------------------------------
2. 変えたファイル・版
--------------------------------------------------------------------
  cs:78：Service/ServiceOps.cs・Robot/ServingRobotController.cs・People/StaffAgent.cs・Experiment/ExperimentRunner.cs
  実行ファイル：Builds/headless　build_id cs78_20261104_1011・unity_cs ServiceSim/cs:78・pending_changes 空・error CS 0
  録画用：Builds/rec20_bus91（Builds/headless の写し）
  make_panel_video.py（status_videos/tools）：ロボットの欄に「下げ膳」を出すようにした（下の 6 章。元は night/20261104_rec91/make_panel_video_orig.py）

--------------------------------------------------------------------
3. 確かめ（画面なし・cs:78）
--------------------------------------------------------------------
  ・serve：⑦ fam_p5・2台・種7（det91s）と base73（cs:76）の同じ回
    contacts・dishes・give_ups・groups・nowarp_jams・passes・people_jams・requeues・rescues・robot_track・stops・timeline・yields は1行も違わない。
    trips.csv は plan_ms_max の列だけ、summary.json・conditions.json は written_at だけ、run_info.json は build_id・night・parallel・
    parallel_actual・run_label・speedup・unity_cs・wall_seconds・written_at と plan_ms_max_per_trip（道を引く実時間）だけ違う → 一致（依頼86・90 と同じ扱い）
  ・bus：③ fam_p1・2台・bus・種7 を2回（det91a・det91b）。上の13ファイル・bus_runs.csv・bus_summary.json・summary.json・conditions.json が一致。
    違うのは run_info.json の run_label・speedup・wall_seconds・written_at・plan_ms_max_per_trip と trips.csv の plan_ms_max だけ → 一致
  記録：night/20261104_det91s・det91a・det91b

--------------------------------------------------------------------
4. 120回（label bus75・同時4本・条件 120〜131 × 種0〜9）
--------------------------------------------------------------------
  120 回とも completed（やり直し 0）。10:13〜10:56。実時間 平均 1.4 分・最長 3.8 分
  見張り（1分ごと）：瞬間移動 0・1コマの跳び 0 のまま終わった
  記録：night/20261104_bus75_cs78/（queue_src.json・runner_log・runs.csv・judge.md・agg91.py・agg91_out.txt・run120.sh・watch91.py・watch_log.txt）

全体（同じ店・台数・種どうし）	serve（base73・cs:76）	bus74（cs:77）	bus75（cs:78）
回の数	120	120	120
瞬間移動	0	0	0
1コマの跳び	0	0	0
解けずに残った詰まり（件）	1	53	4
同（回）	1	4	1
全員が帰ったあとに始まった詰まり（件）	0	0	1
全員が帰らなかった回	なし	③2台種2・④2台種4・④2台種9・⑥2台種4	④2台種4
上限（120秒）で戻った回数	-	-	14
卓で待つ下げ膳の台を動かす助け（呼んだ回数）	-	-	166
詰まり（回）	2215	2565	2544
詰まり（秒）	133086	1567741	326575
卓を強引に空けた	32	30	25
助け	2243	2674	2732

  下げ膳の合計（bus75）：片付け 8484・ロボットが運んだ 2582・人だけ 5902・ロボットが向かった 2608・載せる前に取りやめ 23（うち上限で戻った 14）・
    スタッフのそばで卓に着いたとみた 1545（bus74：片付け 8316・運んだ 2496・人だけ 5820・向かった 2514・取りやめ 10・そばで着いた 1485）

店・台数ごと（種 0〜9 の中央値。分・km・割合。向き＝serve→bus75 の増減、＋は増える）
店 台数	項目	serve	bus74	bus75（向き）	試算 serve→bus（向き）	合う？
③1台	入店待ち	3.47	3.47	3.47（＝）	1.68→1.72（＋）	逆
③1台	料理の待ち	2.45	2.50	2.50（＋）	1.97→2.03（＋）	合う
③1台	turn	4.97	5.11	5.10（＋）	2.27→2.27（－）	逆
③1台	歩いた距離km	2.72	2.63	2.62（－）	1.88→1.86（－）	合う
③1台	下げ膳を運んだ割合	-	0.150	0.150	試算 0.165	（記録）
③2台	入店待ち	2.72	3.61	3.95（＋）	1.13→2.22（＋）	合う
③2台	料理の待ち	1.71	1.82	1.76（＋）	0.96→1.08（＋）	合う
③2台	turn	4.05	5.58	6.05（＋）	2.14→2.00（－）	逆
③2台	歩いた距離km	2.54	2.35	2.35（－）	1.61→1.45（－）	合う
③2台	下げ膳を運んだ割合	-	0.354	0.358	試算 0.442	（記録）
⑦1台	入店待ち	3.87	3.87	3.87（＝）	1.58→1.53（－）	逆
⑦1台	料理の待ち	2.51	2.51	2.51（＋）	2.01→2.04（＋）	合う
⑦1台	turn	6.47	6.59	6.59（＋）	2.31→2.27（－）	逆
⑦1台	歩いた距離km	2.74	2.63	2.62（－）	1.97→1.90（－）	合う
⑦1台	下げ膳を運んだ割合	-	0.145	0.145	試算 0.166	（記録）
⑦2台	入店待ち	3.87	5.07	4.65（＋）	1.60→1.70（＋）	合う
⑦2台	料理の待ち	1.52	1.83	1.86（＋）	1.01→1.10（＋）	合う
⑦2台	turn	4.49	6.79	8.06（＋）	2.19→2.04（－）	逆
⑦2台	歩いた距離km	2.55	2.37	2.36（－）	1.69→1.47（－）	合う
⑦2台	下げ膳を運んだ割合	-	0.386	0.364	試算 0.443	（記録）
④1台	入店待ち	11.02	11.38	11.39（＋）	4.81→4.85（＋）	合う
④1台	料理の待ち	1.79	1.95	1.91（＋）	1.29→1.38（＋）	合う
④1台	turn	19.72	19.41	19.66（－）	9.51→9.43（－）	合う
④1台	歩いた距離km	2.37	2.17	2.17（－）	1.75→1.64（－）	合う
④1台	下げ膳を運んだ割合	-	0.298	0.303	試算 0.274	（記録）
④2台	入店待ち	18.66	16.70	16.70（－）	5.57→3.86（－）	合う
④2台	料理の待ち	1.98	3.03	3.03（＋）	0.47→0.57（＋）	合う
④2台	turn	28.61	31.51	30.62（＋）	9.88→8.57（－）	逆
④2台	歩いた距離km	2.66	2.20	2.25（－）	1.75→1.37（－）	合う
④2台	下げ膳を運んだ割合	-	0.550	0.590	試算 0.710	（記録）
⑤1台	入店待ち	6.99	6.98	6.98（－）	3.16→3.38（＋）	逆
⑤1台	料理の待ち	2.63	2.69	2.68（＋）	2.28→2.32（＋）	合う
⑤1台	turn	10.21	10.83	10.30（＋）	3.39→3.40（＋）	合う
⑤1台	歩いた距離km	3.22	3.10	3.10（－）	2.59→2.52（－）	合う
⑤1台	下げ膳を運んだ割合	-	0.121	0.132	試算 0.145	（記録）
⑤2台	入店待ち	6.12	5.83	5.83（－）	2.37→2.78（＋）	逆
⑤2台	料理の待ち	1.71	2.06	2.06（＋）	1.27→1.34（＋）	合う
⑤2台	turn	10.45	9.86	9.84（－）	2.41→2.25（－）	合う
⑤2台	歩いた距離km	2.87	2.62	2.66（－）	2.12→1.91（－）	合う
⑤2台	下げ膳を運んだ割合	-	0.353	0.348	試算 0.392	（記録）
⑥1台	入店待ち	5.19	4.92	4.92（－）	3.68→4.01（＋）	逆
⑥1台	料理の待ち	2.03	2.09	2.09（＋）	2.01→2.03（＋）	合う
⑥1台	turn	11.73	11.40	11.40（－）	6.61→6.57（－）	合う
⑥1台	歩いた距離km	2.58	2.47	2.47（－）	2.18→2.09（－）	合う
⑥1台	下げ膳を運んだ割合	-	0.172	0.172	試算 0.164	（記録）
⑥2台	入店待ち	4.54	4.54	4.54（－）	2.11→1.77（－）	合う
⑥2台	料理の待ち	1.05	1.32	1.34（＋）	0.82→0.92（＋）	合う
⑥2台	turn	12.05	10.42	11.87（－）	5.27→4.74（－）	合う
⑥2台	歩いた距離km	2.37	2.14	2.14（－）	1.91→1.64（－）	合う
⑥2台	下げ膳を運んだ割合	-	0.400	0.393	試算 0.482	（記録）
②1台	入店待ち	1.60	1.62	1.62（＋）	1.79→2.47（＋）	合う
②1台	料理の待ち	1.02	1.13	1.13（＋）	0.91→1.04（＋）	合う
②1台	turn	3.49	3.01	3.01（－）	3.06→3.02（－）	合う
②1台	歩いた距離km	1.53	1.33	1.33（－）	1.16→1.09（－）	合う
②1台	下げ膳を運んだ割合	-	0.403	0.403	試算 0.399	（記録）
②2台	入店待ち	1.65	1.66	1.66（＋）	1.30→2.12（＋）	合う
②2台	料理の待ち	0.61	0.94	0.98（＋）	0.40→0.48（＋）	合う
②2台	turn	4.03	3.80	3.90（－）	2.80→2.66（－）	合う
②2台	歩いた距離km	1.55	1.21	1.19（－）	1.11→0.91（－）	合う
②2台	下げ膳を運んだ割合	-	0.690	0.704	試算 0.818	（記録）
  （turn＝客が帰ってから卓が使えるまで。歩いた距離＝スタッフ1人の歩いた距離）
  向き：合う 38・逆 10（bus74 と同じ本数・同じ項目）。逆の 10 本は bus74 と同じ：turn 5 本（③1・2台・⑦1・2台・④2台。試算は bus で減るか
    横ばい、Unity は増える。⑦2台は 6.79→8.06 とさらに増えた）・入店待ち 5 本（③⑦1台・⑤1・2台・⑥1台。差が小さいものが多い）
  ロボットが下げ膳を運んだ割合は ④1台・⑥1台を除き試算より低め（例 ③2台 0.358／試算 0.442、②2台 0.704／0.818）

  夜の判定（judge.md）の「回の失敗」2 件：④2台 種4 の全員が帰っていない（5 章）と、②2台 種3 の「ロボットが1コマで 0.05 m 超え」2コマ
    （瞬間移動 0・1コマの跳び 0。依頼90 で書いたのと同じ、連れて戻す速さ 1.0 m/秒 × 0.05 秒がちょうど 0.05 m になるもの）

--------------------------------------------------------------------
5. 残った詰まりの中身と場所（記録だけ。直していない）
--------------------------------------------------------------------
  ・④2台 種4（全員帰らなかった。回の上限 720 分まで回った）：料理の往復の2台が (3.51, 2.39)（7050 秒から）と (4.42, 2.34)（7112 秒から）で
    向かい合って止まり、どちらも 1往復の打ち切りのまま回の終わりまで残った。近くでスタッフの呼び出し (5.09, 2.65)・料理 (5.11, 2.10) も
    止まったまま。下げ膳の台は関わっていない（この回の最後の下げ膳は 6267 秒に終わっている）。依頼90 と同じ場所・同じ形。
    serve（base73）の同じ回は全員が帰っている
  ・③2台 種7（全員は帰った。11701 秒）：全員が帰ったのとほぼ同じ時刻（11700.9 秒）に2号機を卓22 への下げ膳に出したが、卓を強引に空けたので
    取りやめになり、2号機は待機場所のそば (17.3〜17.75, 5.6〜5.7) で行ったり来たりしたまま、600 秒後の 1往復の打ち切り（12299 秒）で回が終わった
    （「全員が帰ったあとに始まった詰まり」の 1 件）。bus74 の同じ回では起きていない（(イ)(ウ) で卓の動きが変わり、最後の下げ膳の時刻が変わった）。
    録画した同じ回（6 章）は録画なしの回と数字が違い（下記）、こちらでは起きていない
  serve（base73）の同じ 120 回で残った詰まりは 1 件（⑤2台 種7・スタッフ片付け (5.68, 13.13)。base73b で書いたもの）

--------------------------------------------------------------------
6. 比較動画の素材
--------------------------------------------------------------------
  回し方：night/20261104_rec91/rec_runner.py（依頼90 の写し。説明を足しただけ）で --oblique --hide-paths --max-wall-min 80 --parallel 2 --no-retry
    --limit-min 120 --build Builds/rec20_bus91。カメラは依頼87 と同じ wide_l30・wide_r30（方位 ±30°・見下ろし 60°・画角 40°・3840×2160・
    0.5 秒ごと・30 コマ/秒・回の最初から終わりまで・カメラの行列も）。並び：night/20261104_rec91/queue.json（③ fam_p1・2台・種7 の serve と bus）
  ・serve：20261104_rec91_cs78_fam_p1_r2_s7_passon_sbret_ek_post_rescue
      completed・全員帰った・店の時刻 199.5 分・実時間 58.0 分・瞬間移動 0・1コマの跳び 0・解けずに残った詰まり 0
      録画 wide_l30 799.9 秒（23996 コマ・店の時刻 0〜11997.5 秒）・wide_r30 も同じ長さ
  ・bus：20261104_rec91_cs78_fam_p1_r2_s7_passon_sbret_ek_post_rescue_bus
      completed・全員帰った・店の時刻 196.6 分・実時間 57.5 分・瞬間移動 0・1コマの跳び 0・解けずに残った詰まり 0
      録画 wide_l30 788.3 秒（23649 コマ・店の時刻 0〜11824.0 秒）・wide_r30 も同じ長さ
      録画なしの同じ回（det91a・bus75）は 205.0 分で 5 章の終わりの詰まりがあった。録画した回と録画なしの回で数字が違うのは
      依頼87 で書いたのと同じ（動画の映像とパネルの数字は、同じ録画の回の timeline.csv なので合っている）
  置き場所：/Volumes/KIOXIA/r2r2r-data/service_sim/unity/rec_compare_20261104/{serve|bus}/
    （録画 mp4・frames.csv・camera.json の写し、timeline.csv・summary.json、bus は bus_summary.json・bus_runs.csv も）
  通しのパネル付き動画：night/20261104_rec91/post91.py（依頼87 の panel87.py の「通し」と同じ作り方：wide_l30 を開店から終わりまで、
    0.5 刻みで 75 秒にいちばん近く 60〜90 秒に入る速さ）で make_panel_video.py を呼んだ
    ・serve/panel/whole_wide_l30_panel.mp4　76.2 秒・10.5 倍・1920x1080・30fps　題「③ 標準ファミレス・ロボット2台・配膳だけ」
    ・bus/panel/whole_wide_l30_panel.mp4　　75.1 秒・10.5 倍・1920x1080・30fps　題「③ 標準ファミレス・ロボット2台・配膳＋下げ膳」
    ・どちらも真ん中のコマ whole_wide_l30_panel_mid.png と panel_log.txt
    ・2本とも同じ 10.5 倍なので、並べたときに店の時刻がそろう（長さの違いは、bus の方が 173 秒早く全員が帰ったため）
  パネルの「下げ膳」：今の make_panel_video.py はロボットの欄を「運んでいる／待機」の2つだけで出していたので、timeline.csv に
    robots_bussing の列がある回だけ、動いている台のうち下げ膳の台を「下げ膳」と出すようにした。bus の動画の 2時間13分（店の 7980 秒）の
    コマで「運んでいる」「下げ膳」と出ることを確かめた。serve の timeline.csv にはこの列が無いので、serve の絵は前と同じ
    make_panel_video.py の md5 eed8539039501415828a5ff39384c889 → 45a541e860222bb0426ea30c5bd976d8　差分：
      46a47,48
      >     # 下げ膳にも使う回（timeline.csv に robots_bussing の列がある回）だけ、動いている台のうち下げ膳の台を「下げ膳」と出す（2026-11-04・依頼91）
      >     bus = min(int(row.get("robots_bussing") or 0), rb)
      51c53
      <         d.text((x0 + 68 + i * 150, y + 25), "運んでいる" if busy else "待機", font=F(24, True), fill=INK if busy else QUIET, anchor="mm")
      ---
      >         d.text((x0 + 68 + i * 150, y + 25), ("下げ膳" if i >= rb - bus else "運んでいる") if busy else "待機", font=F(24, True), fill=INK if busy else QUIET, anchor="mm")
  気づいたこと：パネルの題は 26 px の1行で、bus の題「③ 標準ファミレス・ロボット2台・配膳＋下げ膳」はパネルの右端で「配膳＋下」まで切れる
    （serve の題は右端ぎりぎりで収まる）。形は変えていない（決めてほしいこと 1）

--------------------------------------------------------------------
7. 台帳
--------------------------------------------------------------------
  2804 行 → 2929 行（追記 125 行だけ：確かめ 3・120 回・録画 2。どれも completed・unity_cs ServiceSim/cs:78）
  先頭 2804 行の md5 は 8beaf91f429e049ce10152bd5ebf6946（退避と同じ）。終わったあとの md5 a0589b65d2aae361301c9033afe92994。鍵ファイルは残っていない
  試しの回（night/20261104_try91/）は別の台帳（ヘッダだけ）に書かせ、本物の台帳には書いていない

--------------------------------------------------------------------
決めてほしいこと（どれも作業を止めるものではない。素材は撮り終えた）
--------------------------------------------------------------------
  1. bus の動画の題がパネルで切れる（「…配膳＋下」まで）。題を短くするか、パネルの題の字を小さくするか（パネルの形は変えていない）。
     比較動画を作るときに題を付け直すなら、このままでもよい
  2. 下げ膳の台が卓で待つ上限 120 秒は、サイトの params に無いのでコードの定数にした。サイトの試算（meta.bus）にも入れるか
  3. 区切りに従い記録だけにしたもの：④2台 種4 の料理の往復どうしの向かい合い（全員帰らない）・③2台 種7 の終わりの2号機の行ったり来たり・
     turn と入店待ちの向きが試算と逆の 10 本。いつ直すか

判定：合格
