====================================================================
回し方の決まり（案B）を切り替えで入れ、④で確かめた
依頼：20261027_12_受け渡し口は1台ずつ_同じ卓は1台.md
2026-10-27 22:28　check-in：cs:31（決まりを入れた）→ cs:32（受け渡し口の決まりの直し）
build_id cs32_20261027_2227（保留 0）
====================================================================

結論

  ・2つの決まりを入れた。値は params の unity_rules から読む。既定は切。
  ・切のままの1回（p2ruleB_off）は、p2check3 の2台の回と数字が同じではなかった
    （往復 89／73、30秒以上の止まり 92／85、入店待ち 21.09／20.74 分）。切のときに通る処理は
    前と変えていないが、1回だけでは「回ごとの揺れ」と見分けられない（下の 4 章）。
  ★ 入の2台の回（cs:31）は、決まりの作りの誤りで正しく測れていない。
    往復を終えたロボットは待機場所まで下がらず、受け渡し口の点で止まっていることが多い
    （切の回でも同じ）。cs:31 では、そうして止まっているロボットを「受け渡し口の前にいる」と
    数えたので、2台とも受け渡し口で止まると互いを待ってどちらも出られなくなった。
    往復は 23 回だけ、受け渡し口の決まりで待った時間は 12,575 秒（台×秒。回は 206 分）。
    数字（止まり 24 回・入店待ち 10.49 分など）は「ロボットがほとんど走らなかった回」の数字で、
    決まりの効き目としては使えない。
  ・cs:32 で直した（往復していないロボットは数えない）。依頼で台帳に足す行は 4 行と決まっているので、
    直した版での回し直しはしていない（決めてほしいこと 1）。
  ・0台・1台の回は、決まりが効かない形（もう1台がいない）なので cs:31 のままで有効。
  ・台帳は 364 → 368 行（4行を追記）。先頭 364 行の md5 は退避と同じ。


====================================================================
1. 始める前の確かめ（5つとも合格。22:05 ごろ）
====================================================================

  1. Unity エディタ：起動していない（Unity Hub だけが起動していた）
  2. /Volumes/KIOXIA：マウントされている。unity_ledger_v1.lock：なし
  3. 台帳の md5：4ca50edbd6a04dc41c66785b4b0c74af（退避と同じ・どちらも 364 行）
  4. ServiceSim の保留：0（cs:30 head）
  5. サイトの params の meta.schema_version：serving-robot-params/0.3（はじめの取得で 0.3 だった）


====================================================================
2. 入れたもの（cs:31・cs:32）
====================================================================

  params：https://pixelstomotors.com/sim/serving-robot-params.json を curl でそのまま写した
          （md5 4f26ef40668b22d68eb170c2758b0576）。
          cs:30 の写しとの違いは meta.schema_version（0.2 → 0.3）と unity_rules が足されたことだけ。
          meta のほかの項目・common・stores・unity_conditions は同じ。

  変えたファイル
    cs:31
      Assets/ServiceSim/Experiment/serving-robot-params.json（公開版の写し）
      Assets/ServiceSim/Experiment/SimParams.cs        unity_rules を読む口（role=site_rule だけ）
      Assets/ServiceSim/Experiment/ExperimentRunner.cs 1回ごとの切り替え（Job.ruleB）・値を読む・記録・ログ
      Assets/ServiceSim/Service/ServiceOps.cs          2つの決まりと、待った回数・秒数
      Assets/ServiceSim/Experiment/TripLogger.cs       run_info.json と summary.json に rule_b
      Assets/ServiceSim/Store/KitchenMonitor.cs        待つ理由をモニターに出す
      Assets/ServiceSim/Experiment/HeadlessRun.cs      -ssRuleB on|off（既定 off）・フォルダ名に _ruleb
      Assets/ServiceSim/Editor/ServiceSimSiteRun.cs    メニュー「④ スタッフ2人・ロボット2台（回し方の決まり 入）」
      tools/make_queue.py                              --rule-b on|off（既定 off）
      tools/night_runner.py                            queue の rule_b を -ssRuleB で渡す・--rule-b・_ruleb
    cs:32
      Assets/ServiceSim/Service/ServiceOps.cs          受け渡し口の決まりの直し（3 章）

  画面なしの実行ファイル
    cs:31 で作った build（cs31_20261027_2218・保留なし）で 5 と 7 の4回を回した。
    そのあと cs:32 で作り直した：build_id cs32_20261027_2227 / unity_cs ServiceSim/cs:32 /
    pending_changes 空。Build Finished, Result: Success・error CS 0。作ったあとも保留 0。
    （入れる前に一度、保留ありのまま作って、組み立てが通るかだけを確かめた。それでは回していない）

  順番を依頼から変えたところ
    依頼は「5 切の1回 → 6 check-in して作り直す → 7 入の3回」だった。保留ありの実行ファイルで5を
    回すと、台帳の unity_cs が cs:30 のまま、中身は cs:30 と違う行になってしまう。そうならないよう、
    先に check-in して作り直し（cs:31）、5 と 7 をどちらも cs:31 で回した。

  切り替えの渡し方
    画面なし   -ssRuleB on|off（既定 off）
    make_queue --rule-b on|off（既定 off）。queue の各回と頭に rule_b を書く
    night_runner  queue の各回の rule_b を渡す（無ければ off）。--rule-b を付けると、queue に rule_b の
               無い回にはその値を使う。queue と食い違う回があれば始めない
    出力フォルダ名  …_s{種}[_passon][_ruleb][_try{n}]（入の回だけ _ruleb。C# と Python で同じ字）
    run_info.json  "rule_b": {enabled, pass_one_robot, pass_clear_m, same_table_one_robot, source}
    summary.json   "rule_b": {enabled, pass_waits, pass_wait_s, table_held_dishes, table_held_s,
                              table_held_to_staff}（切の回は 0）
    台帳の列は増やしていない（59 列のまま）。runs.csv の列も変えていない


====================================================================
3. 2つの決まりの入れ方（決めたところ）
====================================================================

  値は ExperimentRunner が params の unity_rules から読み、ServiceOps に渡す。入の回で読めなければ回さない。
  切の回は値を読まず、ServiceOps の処理も通らない（料理の選び方・コマの進め方は前と同じ）。

  受け渡し口は1台ずつ（pass_one_robot・pass_clear_m 1.5 m）
    ・出発点は store.PassPoint（FoodPass の点 11.05, 4.45）。
    ・料理を積めるロボット（Idle / Done）は、ほかのロボットが「受け渡し口の前にいる」間は積まずに待つ。
      「前にいる」とするのは次のどちらか
        a. 出たばかりで、まだ受け渡し口の前を抜けていない台
           抜けた＝出発点から 1.5 m 以内に入ってから 1.5 m より離れた。
           地図の道は今いる所から引くので、受け渡し口の前を通らずに出ることがある。その台は
           1.5 m より離れ、かつ出たときより出発点から遠くなったら抜けたとする。
           卓に着いた・戻り始めた台も外す
        b. 動いている台（卓へ・戻る・立ち往生）で、体が出発点から 1.5 m 以内にある台
           → 戻ってきて受け渡し口の前を通る台・戻りの線が使えず受け渡し口の前へ戻る台も入る
    ・往復していない台（Idle / Done）は、受け渡し口の前にいても数えない（cs:32 の直し）。
      cs:31 では「自分の待機場所に止まっている台だけを数えない」にしていた。
      ところが今の作りでは、往復を終えた台はたいてい受け渡し口の点（10.8〜10.9, 4.3〜4.5）で
      「往復おわり」のまま止まっていて、待機場所（12.4, 4.55）・（13.2, 4.55）まで下がらない
      （cs:31 の切の回でも、p2check3 でも同じ。robot_track.csv で確かめた）。
      そのため2台とも受け渡し口で止まると、互いを「前にいる」と数えてどちらも出られなかった。
      cs:32 では、止まっている台どうしなら先に積んだ1台が出て、もう1台はその台が抜けるまで待つ。
    ・戻ってきた台は待たせない（戻る道はそのまま）。下げ膳をロボットが返す作りはない
      （条件は上げ膳 mode=serve だけ）ので、扱いは入れていない。
    ・待った回数＝積める料理があるのに待ち始めた回数（台ごとに数えて足す）、秒数＝そのときの台×秒。

  同じ卓は1台（same_table_one_robot）
    ・料理を積むとき、ほかの台がその卓へ向かっている（その卓がまだ届けていない止まる所にある）なら、
      その皿は積まずに受け渡し口に残す。その卓で受け渡しをしている最中（25 秒）の台も入れた。
    ・待つ上限は今の robot_first_wait_s（120 秒）のまま。過ぎればスタッフの仕事板に出る（今までどおり）。
    ・「同じ通路に2台を集めない」より先に見る。細い通路の卓は、もともと同じ通路の決まりでも積まないので、
      この決まりが新しく効くのは、細い通路の中にない卓だけ。
    ・数え方：残した皿の数（1皿1回）、秒数＝空いた台が積めたのにこの決まりで積まなかったコマの皿×秒、
      そのうち結局スタッフが運んだ皿の数。

  キッチンのモニター
    ・決まりで待っている台は「1号機 待機 ／ 待機：受け渡し口に前のロボット」
    ・入の回だけ「回し方の決まり 入（受け渡し口で待った N 回・同じ卓で積まなかった N 皿）」の行と、
      そのとき積んでいない皿があれば「積まない：同じ卓へ向かっている 卓05・卓12」の行が出る
    ・画面なしの回ではモニターは作らない（今までどおり）


====================================================================
4. 切のままの1回（④・2台・種0・すれ違い入・ラベル p2ruleB_off・cs:31）
====================================================================

  python3 tools/make_queue.py --stores fam_p2 --conditions fam_p2_s2_r2_a28 --seeds 0
      --label p2ruleB_off --out /tmp/p2rb/queue_p2ruleB_off.json
  python3 tools/night_runner.py --queue /tmp/p2rb/queue_p2ruleB_off.json --parallel 4 --night 20261027
      --label p2ruleB_off --record-name 20261027_p2ruleB_off
  出力 20261027_p2ruleB_off_cs31_fam_p2_r2_s0_passon（completed・終了コード 0・3.2 分。同時 1 本）
  run_info.json の rule_b.enabled = false、summary.json の rule_b はすべて 0

                         今回（cs:31 切）   p2check3（cs:30）   参考：p2check2（cs:29）／④の夜の種0
  往復の数                89                 73                  84 ／ 78
  30秒以上の止まり        92                 85                  87 ／ 87
  入店待ち（分）          21.09              20.74               16.34 ／ 15.30
  動けなくなった          73                 66                  65 ／ 67
  打ち切り                15                 16                  14 ／ 15
  店の時間（分）          258.3              239.8
  → 同じ数字ではない。往復の数は前に見た幅（73〜84）より多い。
    切の回で通る処理は前と同じにしてある（足した処理はどれも「入のときだけ」の枝の中）ので、
    回ごとの揺れ（同じ版・同じ種でもずれる。前回の報告の 4 章）と見ているが、1回では言い切れない。
    違いとして、今回は1本だけで回した（p2check3 は同時 3 本）。


====================================================================
5. 入の3回（④・ロボット 0・1・2台・種0・すれ違い入・ラベル p2ruleB・cs:31）
====================================================================

  python3 tools/make_queue.py --stores fam_p2 --seeds 0 --label p2ruleB --rule-b on
      --out /tmp/p2rb/queue_p2ruleB.json
  python3 tools/night_runner.py --queue /tmp/p2rb/queue_p2ruleB.json --parallel 4 --night 20261027
      --label p2ruleB --record-name 20261027_p2ruleB --rule-b on
  出力 20261027_p2ruleB_cs31_fam_p2_r{0,1,2}_s0_passon_ruleb（3本とも completed・終了コード 0・
       2.8／3.0／3.3 分。同時 3 本）
  記録 night/20261027_p2ruleB/
  run_info.json の rule_b：enabled true・pass_one_robot true・pass_clear_m 1.5・same_table_one_robot true

  ★ 2台の回は 1 章・3 章の誤りで正しく測れていない（cs:31 の作り）。0台・1台の回は決まりが効かない

  書き方：入（cs:31）／ 切（p2check3・cs:30）／ 試算（site_result）。単位は分。割合は 0〜1
                              0台                    1台                    2台（★）
  最後まで回ったか            completed／completed    completed／completed    completed／completed
  全員帰ったか                はい／はい             はい／はい             はい／はい
  （参考）店の時間            192.3／192.6           196.0／198.1           205.8／239.8
  入れた組の数                48／48／55.95          48／48／54.30          48／48／55.30
  入店待ち                    6.46／6.41／10.39      8.00／8.79／2.93       10.49／20.74／3.46
   うち席は空いているのに待った 5.32／5.27／8.37      6.67／7.51／2.01       9.27／19.49／1.99
  料理の待ち                  1.30／1.26／0.88       2.72／2.65／1.28       3.86／4.02／0.47
  会計待ち                    1.56／1.48／4.20       3.17／3.26／4.91       1.83／3.22／5.25
  ロボットが運んだ皿の割合    0／0／0                0.842／0.825／0.956    0.258／0.817／1.000
  往復の数                    0／0                   68／66                 23／73
  30秒以上の止まり            0／0                   23／27                 24／85
   （1往復あたり）            0／0                   0.338／0.409           1.043／1.164
  動けなくなった（60秒）      0／0                   18／24                 19／66
  卓を空けた（逃がし弁）      0／0                   0／0                   0／1
  瞬間移動                    0／0                   23／30                 5／32
  打ち切り                    0／0                   1／2                   5／16
  （参考）あきらめた          0／0                   29／39                 25／80
  （参考）冷めた皿の割合      0.025／0.033／0.003    0.267／0.258／0.039    0.633／0.425／0
  （参考）卓が使えるまで      22.9／22.9／16.8       20.8／23.2／5.2        21.8／36.1／4.9

  2台の回でロボットが運んだ皿は 0.258 だけで、残りはスタッフが運んだ（料理の 120 秒待ちのあと）。
  入店待ちが短く見えるのは、ロボットがほとんど走らず店の中の邪魔が減ったためで、決まりの効き目ではない。
  冷めた皿の割合は 0.633 に上がった。


====================================================================
6. 2台の回の 30 秒以上の止まり（理由ごと・場所ごと。前回と同じ数え方）
====================================================================

  数え方は前回と同じ（stops.csv の duration_s が 30 秒以上。場所は x 9.8 以上＝受け渡し口の前、
  x 9.8 未満で y 2.9 未満＝下の列、x 3.0 未満で y 2.9 以上＝左の列、y 8.5 以上＝上の列、残り＝その他）。
  この数え方で p2check3 を数え直し、前回の報告と同じ数（85 回・理由・場所）になることを確かめた。

  並びは 入（cs:31★）／ 切（p2check3）／ 参考：切（cs:31・p2ruleB_off）
  往復の数                       23 ／ 73 ／ 89

  理由ごと
    もう1台のロボット            8 ／ 36 ／ 33
    人が立ち止まっていた         7 ／ 28 ／ 32
    スタッフとすれ違った         8 ／ 15 ／ 19
    お客さんとすれ違った         1 ／  5 ／  6
    椅子・荷物・ベビーカー       0 ／  1 ／  0
    分からない                   0 ／  0 ／  2
    合わせて                    24 ／ 85 ／ 92

  場所ごと
    受け渡し口の前               1 ／ 26 ／ 41
    下の列                      15 ／ 25 ／ 35
    左の列                       8 ／ 28 ／ 11
    その他（真ん中の通路）       0 ／  5 ／  4
    上の列                       0 ／  1 ／  1

  理由×場所（多いもの）
    もう1台のロボット・受け渡し口の前     0 ／ 17 ／ 18
    人が立ち止まっていた・下の列          6 ／ 12 ／ 15
    スタッフとすれ違った・下の列          5 ／  6 ／  6
    もう1台のロボット・下の列             4 ／  5 ／ 10
    もう1台のロボット・左の列             4 ／ 12 ／  4
    スタッフとすれ違った・左の列          2 ／  4 ／  3
    スタッフとすれ違った・受け渡し口の前  1 ／  5 ／ 10
    人が立ち止まっていた・左の列          1 ／ 10 ／  3
    お客さんとすれ違った・左の列          1 ／  1 ／  1
    人が立ち止まっていた・受け渡し口の前  0 ／  4 ／ 11

  受け渡し口の前のまわり（x 9.8〜13.6・y 2.9〜5.0）の止まり：1 ／ 23 ／ 32
  ★ 入の「もう1台のロボット・受け渡し口の前」は 0 だが、ロボットがほとんど走っていない回なので
    減ったとは言えない。


====================================================================
7. 決まりで待った回数と秒数（summary.json の rule_b）
====================================================================

                          受け渡し口（待った回・台×秒）   同じ卓（残した皿・皿×秒・うちスタッフ）
  0台（入）               0 回・0 秒                     0 皿・0 秒・0
  1台（入）               0 回・0 秒                     0 皿・0 秒・0
  2台（入・cs:31★）       33 回・12,574.8 秒             0 皿・0 秒・0
  切の回（p2ruleB_off）    0                              0

  2台の回の 12,575 秒は、2台が互いを待ち続けた時間（3 章の誤り）。
  同じ卓の決まりは1度も効かなかった。この回はロボットがほとんど同時に走っていないうえ、
  ④の卓の多くは細い通路の中で、もともと同じ通路の決まりで積まないため。


====================================================================
8. 台帳
====================================================================

  行数：364 → 368（4 行足した。追記だけ。4行とも unity_cs ServiceSim/cs:31）
    20261027_p2ruleB_off_cs31_fam_p2_r2_s0_passon
    20261027_p2ruleB_cs31_fam_p2_r{0,1,2}_s0_passon_ruleb
  先頭 364 行の md5：4ca50edbd6a04dc41c66785b4b0c74af（退避と同じ）
  列は 59 列のまま。鍵ファイルは残っていない


====================================================================
9. 何も指定しないときに③⑦の60回・切のままか（台帳には書いていない）
====================================================================

  python3 tools/make_queue.py --out /tmp/p2rb/q_default.json
    → 条件 6（fam_p1・fam_p5 × 0・1・2 台）× 種 0〜9 ＝ 60 回・すれ違い入 60・rule_b はすべて off
    → v4 の夜の night/20261029/queue.json と、条件・種・すれ違いの並びが同じ
      （違うのは queue の layout_generation の字・stores の欄・rule_b の欄が足されたことだけ）
  プロジェクトの queue.json（③⑦の60回）は触っていない（md5 07f2acccf5b13abbf1a96148fbc70e9f のまま）


====================================================================
10. 一時ファイル・気づいたこと
====================================================================

  queue は作業フォルダの外（/tmp/p2rb/）に作った。作業フォルダに queue の一時ファイルはない。最後の保留 0（cs:32 head）。
  判定（judge_night.py）は night_runner が「--runs {夜}_{ラベル}_*」で呼ぶので、
  ラベル p2ruleB の判定に p2ruleB_off の回も入った（night/20261027_p2ruleB/judge.md は 4 回。
  どれも「基準なし」）。また judge_night.py は決まりの入切を条件として分けない。
  今回は④に基準データがないので判定に効いていない。直していない（依頼の範囲の外）。


====================================================================
11. エイイチが画面で見る手順
====================================================================

  1. Unity で ServiceSim を開き、ServiceSim_Family シーンを開く
  2. メニュー ServiceSim → Site Run → 「④ スタッフ2人・ロボット2台（回し方の決まり 入）」
     （ほかの Site Run のメニューは切のまま。入にするのはこの1回だけで、.asset は書き換えない）
  3. Play に入る。Console の「回し始め」の行に「回し方の決まり（案B）: 入（受け渡し口は1台ずつ 入・
     離れる距離 1.5 m／同じ卓は1台 入。値は params の unity_rules）」と出る
  4. Scene ビューのキッチンのモニターに、待っている台は「待機：受け渡し口に前のロボット」、
     「回し方の決まり 入（…）」の行、積んでいない皿があれば「積まない：同じ卓へ向かっている 卓NN」が出る
  5. 出力は KIOXIA の {日付}_p2_efficient_narrow_fam_p2_s2_r2_a28_s{種}_ruleb_{時刻}/ に出る。
     台帳には書かない（台帳に書くのは段階Bのメニューと画面なしの実行だけ）
  ※ エディタは cs:32（直したあと）の作りで動く


====================================================================
12. 決めてほしいこと
====================================================================

  1. 入の2台の回（cs:31）は、作りの誤りで測れていなかった。cs:32 で直し、実行ファイルも作り直したが、
     依頼で台帳に足すのは 4 行と決まっていたので回し直していない。
     cs:32 で入の3回（またはせめて2台の1回）を回し直すか（台帳にさらに 3 行（または 1 行）足すことになる）。
     cs:31 の入の3行は台帳に残っている（追記だけなので消していない）。比べるときにこの3行をどう扱うかも。
  2. 往復を終えたロボットが待機場所まで下がらず、受け渡し口の点で止まっていることが多い（切の回でも同じ）。
     受け渡し口の前の止まりにも関わっていそうだが、今回は直していない（店の回し方が変わるので依頼の範囲の外）。
     調べて直すかどうか。
  3. 切のままの1回は p2check3 と数字が同じではなかった（往復 89／73 など）。処理は変えていないので
     回ごとの揺れと見ているが、確かめるなら同じ版・同じ種を何回か回す必要がある（台帳に行が増える）。
