cs:114 で Check-in しました（v5b の道順・v5 の0章の直し2つ・NavMesh の焼き直し・hardToPass 削除）。
そのあと v5 の 3 章（回し方をサイトにそろえる）を入れました。Unity は押していません（Editor が開いたまま）。

────────────────────────────────────────────────────────
0. cs:114 の中身（21 項目）
────────────────────────────────────────────────────────

  新規  Store/RouteBook.cs（＋.meta）
        Experiment/serving-robot-params.json（＋.meta）
        Experiment/SimParams.cs（＋.meta）・SimParams.asset（＋.meta）
  変更  Store/JsonStoreLayout.cs・StorePlan.cs・StoreBuilder.cs・NavMeshBaker.cs
        Robot/RobotSpec.cs・Robot/ServingRobotController.cs
        Editor/ServiceSimJsonStore.cs・Editor/ServiceSimMenu.cs
        Store/Layouts/*.json（3つ）・StoreLayout_p1_efficient_corner.asset・p5_crammed.asset

  .git は入っていません（ignore.conf に足す案は、まだご相談のままです）。

────────────────────────────────────────────────────────
1. そろえたこと（v5 3章の表のとおり）
────────────────────────────────────────────────────────

(a) 条件：unity_conditions の6つを選べるようにした

  新しいメニュー **ServiceSim/Site Run/**
    条件を一覧する（回さない）
    ③ スタッフ4人・ロボット0台 / 1台 / 2台
    ⑦ スタッフ4人・ロボット0台 / 1台 / 2台
    出力フォルダを開く

  選ぶのは条件だけです。数字は ExperimentRunner が JSON から読みます。
  ロボット0台とスタッフ4人は、そのまま回せます（0台のときは走りが0なので、
  「走りがあるのに記録が0」の見張りは働きません）。

  置き場所は KIOXIA（v5 の5章）
    /Volumes/KIOXIA/r2r2r-data/service_sim/unity/{日付}_{店}_{条件}_s{種}_{時刻}/
  KIOXIA がつながっていないときは、回さずに止めます。

(b) 始め方：空の店から、来客 120 分 ＋ 全員が帰るまで

  これまで                これから（サイトの条件のとき）
  8割埋まった店で始める → 空の店から始める（慣らしの組を置かない）
  慣らし 15 分 ＋ 計測 120 分 → 来客 peak_min（120 分）→ そのあと新しい組は来ない
                              → 全員が帰ったら終わり
                              → 帰らないまま max_extra_min（600 分）を過ぎたら打ち切り

  打ち切りだったかは summary.json の site_run.everyone_left で分かります（true なら全員帰った）。
  これまでの回し方（慣らし＋計測）は、そのまま残してあります（Run One・Stage 3 は前のまま）。

(c) 立ち往生：受け渡し口へ移す（warp）をやめ、スタッフを呼ぶ形にした

  これまで：60 秒動けない → 15 秒待つ → **受け渡し口へ移して往復を終える**（stuck=1）
  これから：60 秒動けない → **スタッフを呼ぶ**（仕事板に優先度 0 で出す。ほかの仕事より先）
            → スタッフが歩いて来て rescue_s（15 秒）動かす
            → **止まっていた所から、同じ道順の続きを走る**（道順は変えない）

  ・「動けなくなった」の判定は今のまま（stuckAfterStoppedSec = 60 秒）
  ・1往復で何度でも起こりえます（動かしてもらった先でまた動けなくなる）。
    回数は trips.csv の stuck_count、待った秒数は stuck_wait_s に出ます
  ・「ほかの仕事より先」は、**次に取る仕事として先**という意味です
    （いま案内や片付けをしている人を、途中で引き離すことはしません）
  ・いつまでも来ないときの最後の保険は、今までどおり1往復 600 秒の打ち切り（timeout=1）です
  ・スタッフがロボットのところへ着けないときは、今までどおり B1 の
    「あきらめた → 3回で移した」が働きます（回数は give_ups.csv に残ります）

(d) 逃がし弁：回数を記録した（仕組みは消していません）

  summary.json の site_run に、あきらめた（gave_up）・移した（warped）・卓を空けた（table_freed）を
  並べて出します。立ち往生で呼んだ回数（rescues）・動かした回数（rescues_done）・
  呼んでから動き出すまでの秒数（rescue_wait_s。歩いた時間＋15 秒）も同じ欄です。

(e) 出す数字：meta.metrics と同じ名前で出した

  summary.json に **site_metrics** という欄を足しました。名前はサイトのままです。
    entry_wait_mean / full_wait_mean / staff_wait_mean / dish_wait_mean / dish_wait_p90 /
    cold_share / turn_mean / walk_km_per_staff / staff_util / robot_util / robot_share /
    rescues / pauses / groups
  同じ summary.json に **site_result**（その条件のサイトの答え）も写すので、
  並べた表はあとから手で写さずに作れます。

  **定義が違うもの（ご依頼のとおり報告します）**

    1. staff_wait_mean
       サイト … blocked_wait（卓が空くのを待った）＋ guide_wait の合計
       Unity … **案内の仕事が板に出てから、スタッフが取るまで**
       Unity は空き卓が出た瞬間に卓を割り当てるので、「卓は空いているのに待つ」のは
       案内の人が来ないあいだだけになります。そこを測っています。

    2. turn_mean（客が帰ってから卓が使えるまで）
       名前と定義は同じですが、中身が違います。Unity はそのあいだに
       **片付けのスタッフが歩く時間と、bus_trips（2 往復）の返却口への行き帰り**も入ります。
       サイトは clear_s＋wipe_s の時間だけです。Unity の方が長く出るはずです。

    3. entry_wait_mean の内訳が足し算になりません（サイト側も同じ）
       サイトの ③ロボット0台では entry 3.1814 ＝ full 0.1472 ＋ staff 2.8545 ＋ 0.18 で、
       ぴったりにはなりません（平均をとる母数が違うため）。
       Unity も entry ＝ full ＋ staff ＋（歩いた時間＋45 秒）で、足し算にはなりません。

    4. site_result にあって meta.metrics に無い名前が6つあります
       seat_wait_mean・blocked_wait_mean・guide_wait_mean・robot_bus_share・collects・fragile_robot
       このうち seat_wait_mean は Unity も前から出しています（sim_like）。
       ほかの5つは Unity では出していません（下げ膳と追加注文を作っていないため）。

    5. pauses と rescues は、サイト側が **unity_measures の仮の値**（pause_rate 0.3・
       stuck_rate 0.01）から出した数です。Unity はこれを読まずに実際に数えるので、
       site_result の pauses 41.6 / rescues 1.475 とは、そもそも出どころが違います。
       ここは「Unity で測ってサイトに返す」側の数字です。

(f) Unity で測る値：往復ごとに出した（設計書2章の4つ）

  trips.csv に足した列
    speed_mps                実際に走れた速さ ＝ distance_m /（total_s − stopped_s）
    stuck_count              動けなくなってスタッフを呼んだ回数
    stuck_wait_s             スタッフを待った秒数
    via_narrow               その往復でサイトの道順が 0.8 m の道を使ったか（routes の use）
    stops_in_narrow          狭い通路の中で止まった回数
    stops_out_narrow         外で止まった回数
    stopped_in_narrow_s      中で止まっていた秒数
    stopped_out_narrow_s     外で止まっていた秒数
  止まっていた長さの分布は、これまでどおり stop_durations_s（往復ごと）と stops.csv（1回ごと）です。
  stops.csv には **in_narrow** を足したので、分布も中と外に分けて読めます。

  「狭い」の決め方はサイトの決まりのままです（通路の幅 < meta.settings.normal_width = 1.0 m）。
    ③ 通路 1.2 m → 中は 0 回（ぜんぶ「外」）
    ⑦ 通路 0.8 m → A01・A02・A03 の中が「中」

(g) ServiceSpec・PeopleSpec を JSON から読む形にした

  新しい Experiment/SiteValues.cs が、その回だけ .asset に入れて、回し終わりに戻します
  （停止点（C1）と同じやり方。.asset は書き換わりません）。実際に入れた値は Console に出ます。

  入れる値
    条件から   arrivals_per_h → ServiceSpec.arrivalsPerHour（混み具合を使わなくなる）
               trays / fragile_by / staff（PeopleSpec.staffCount）/ robots
    common から guide_s・pay_s・call_s・staff_place_s・clear_s・wipe_s・rescue_s・
               max_extra_min・cold_min・fragile_cook・staff_speed・
               robot_handoff_s（RobotSpec.tableDwellSec）
    stores から peak_min・call_rate・fragile・bus_trips・eat_min・first_dishes[0][1]

  **.asset の値と実際に違っていたのは2つだけ**です（ほかは同じ値を手で写してありました）
    来客       35 組/時（混み具合「普通」）→ **42 組/時**（条件の arrivals_per_h）
    スタッフ   2 人 → **4 人**
    （ロボット0台の条件だけ trays が 3 → 1 になります）

  読まない値（unity_measures）: robot_speed・pause_rate・pause_s・stuck_rate
  サイトにあるが Unity で形にしていないもの（Console と報告に出します）
    common.load_s（スタッフがロボットに皿を載せる 15 秒）
      … Unity は受け渡し口で待つ 3 秒（staffDwellAtPassSec）だけ。**ここは差になります**
    common.guest_load_s（下げ膳で客が皿を載せる 20 秒）… mode=serve なので使わない
    common.dish_extra_m（0 分）… 0 なので差は出ない
    stores.extra_orders（0）・extra_cook … 追加注文が 0 なので使わない
    stores.staff_all・arrivals・dist_m・dist_list … 条件の範囲と道のりの確かめに使う値

  回す前に止める決まり（Unity で埋めない）
    ・版の番号が合わない（店の形の meta.generation ↔ 試算の meta.layout_generation）
    ・読めない値が1つでもある
    ・建てた卓の数が stores.tables（42）と違う
    ・条件の mode が serve でない
  いまの JSON で、上の4つはすべて通ります（私の側で JSON を読んで確かめました）。
    版の番号 9628954a582f（③・⑦・summary.json・試算の4つとも同じ）
    読めない値 0 件 / 卓 42 = 42 / mode すべて serve

  Unity にしか無いもの（組の人数・2人席・ドリンクバー・トイレ・椅子を引く）は、そのまま残しています。
  歩く客・待合に立つ客の人数だけは、まだ「混み具合」の値（普通）を使っています
  （サイトに人数が無いため。Unity だけの値です）。

────────────────────────────────────────────────────────
2. 触ったファイル
────────────────────────────────────────────────────────

  新規 Experiment/SiteValues.cs（＋.meta）        サイトの値をその回だけ入れて戻す
       Editor/ServiceSimSiteRun.cs（＋.meta）     Site Run のメニュー（6条件）

  変更 Experiment/ExperimentRunner.cs   Job にサイトの条件を足す／始め方と終わり方／
                                        往復ごとの測り／site_metrics に渡す値
       Experiment/TripLogger.cs         trips.csv に8列・stops.csv に1列・
                                        summary.json に site_metrics / site_run / site_result
       Experiment/SimParams.cs          条件を番号で引く・first_dishes を読む
       Service/ServiceOps.cs            Rescue の仕事・立ち往生の回数・robot_util・
                                        スタッフの歩いた距離・入店待ちの内訳
       Service/GroupManager.cs          来客を 120 分で止める・慣らしを置かない・
                                        満席で待った分を数える
       Service/ServiceSpec.cs           arrivalsPerHour・rescueSec・maxExtraMin を追加
       People/StaffAgent.cs             Rescue の仕事（歩いて行って rescue_s 動かす）・
                                        歩いた距離を残す
       Robot/ServingRobotController.cs  warp をやめて Rescued() で走りを続ける・
                                        stuck_count / stuck_wait_s / via_narrow
       Robot/RobotSpec.cs               stuckRecoveryWaitSec は使わなくなった（説明を直した）
       Store/JsonStoreLayout.cs         版の番号・卓の数・normal_width・試算の店の名前を読めるように
       Editor/ServiceSimSetup.cs        SimParams を ExperimentRunner に入れる
       Editor/ServiceSimStage2.cs       同じ（メニューから回すときの下ごしらえ）
       Editor/ServiceSimLabels.cs       字幕「動けない・人を待つ N 秒」

────────────────────────────────────────────────────────
3. お願い（押す順番）
────────────────────────────────────────────────────────

  1. **ServiceSim/Site Run/条件を一覧する（回さない）**
     Console に6条件と、meta.metrics の名前・意味が出ます。
     「合わないもの: なし」になっていることを見てください（ここで止まるなら回しても止まります）。

  2. **ServiceSim/Site Run/③ スタッフ4人・ロボット2台**（v5 の4章の確かめ）
     乱数の種は ExperimentPlan の trialSeed（いまの値）です。1回だけ回します。
     Console の「とちゅう」が1分ごとに出ます（組・帰った数・走り・立ち往生・実時間）。

  見ていただきたいのは、v5 の4章の5点です。
    1. 1回にかかった実時間と、全員が帰るまでの店の中の時間
       （summary.json の site_run.total_minutes と everyone_left）
    2. site_metrics と site_result を並べた数字
    3. 立ち往生で呼ばれた回数（rescues）と、逃がし弁の回数（gave_up・warped・table_freed）
    4. trips.csv の speed_mps と via_narrow
    5. ⑦は、そのあと同じように回して T17・T22 の道のりを見ます

  **注意**：来客 120 分 ＋ 全員が帰るまでなので、店の中の時間は 120 分より長くなります
  （打ち切りは 720 分）。これまでの 135 分より長い回になります。
  長すぎるときは Play を止めてください（そのときは何も書き出しません）。
  1回にかかった時間を見てから、6条件を何回ずつ回すかをご相談します。

  まだ Check-in していません（通ってからにします）。

════════════════════════════════════════════════════════
追記（2026-10-22 22:10）ご指示の4点を直して Check-in しました
════════════════════════════════════════════════════════

1. まだ入っていなかったファイルを、別の Check-in で先に入れました → **cs:115**（34 項目・.git なし）

   Service/（フォルダごと：ServiceOps.cs・GroupManager.cs・JamWatcher.cs・
            ServiceSpec.cs・ServiceSpec.asset）
   Experiment/ExperimentRunner.cs
   Editor/ServiceSimLabels.cs・ServiceSimLegend.cs・ServiceSimStage2.cs・ServiceSimStage3.cs
   People/PersonRobotYield.cs
   Store/FloorPaint.cs・Materials/Mat_PeopleFloor.mat・Mat_RobotFloor.mat・Prefabs/BenchSeat.prefab
   LABEL_RULES.md（＋それぞれの .meta）

   一度も Check-in されておらず「Added」のままだったものです。中身は変えていません。
   ただし、このうち 6 本（ServiceOps.cs・GroupManager.cs・ServiceSpec.cs・
   ExperimentRunner.cs・ServiceSimLabels.cs・ServiceSimStage2.cs）には、
   今日の v5 3章の変更がもう入っています（いちばん古い版が残っていないため、
   いまの中身のまま入れました）。Check-in のコメントにもそう書いています。

2. staff_wait_mean をサイトにそろえました

   分け方をサイトの試算（haizen_sim.py）と同じにしました。
     seat_wait    店に来てから案内が始まるまで
     blocked_wait そのうち、卓は空いたのに片付けが終わらず待った分
                  … **片付け待ちの卓の数だけ、待っている列の前から順に、
                     そのコマの時間を足す**（サイトの _acc と同じ）
     full_wait    seat_wait − blocked_wait
     guide_wait   案内の仕事が板に出てから、スタッフが取るまで
     staff_wait   blocked_wait ＋ guide_wait
   summary.json の site_metrics に blocked_wait_mean・guide_wait_mean・seat_wait_mean も出します。

   「片付け待ちの卓」は、客が帰ってから拭き終わって使えるようになるまでの卓です
   （ServiceOps.TableSlot.clearing）。
   サイトの試算には卓の大きさが無いので、ここも席数を見ずに列の前から数えます
   （2人席・4人席は Unity だけのものです）。

   確かめ：サイトの6条件すべてで、full = seat − blocked と staff = blocked + guide が
   小数4桁まで成り立ちました。分け方は合っています。

     条件        seat   blocked  full   seat−blocked  guide  staff  blocked+guide
     ③ 0台     2.6020  2.4548  0.1472     0.1472    0.3997 2.8545    2.8545
     ③ 1台     1.4919  1.1414  0.3505     0.3505    0.2909 1.4322    1.4323
     ③ 2台     0.6083  0.5116  0.0967     0.0967    0.2337 0.7453    0.7453
     ⑦ 0台     2.9121  2.5981  0.3140     0.3140    0.4008 2.9990    2.9989
     ⑦ 1台     1.6327  1.3084  0.3243     0.3243    0.2853 1.5937    1.5937
     ⑦ 2台     0.7970  0.6554  0.1416     0.1416    0.2469 0.9024    0.9023

3. turn_mean は直していません（サイトもスタッフ待ち・歩き・往復を含む。同じ定義）。
   前の報告に「定義が違う」と書いた分は取り下げ、summary.json の説明文からも外しました。

4. 上げ膳では、受け渡し口で載せる時間を 0 秒にしました

   サイトの条件で回すとき、PeopleSpec.staffDwellAtPassSec を 0 にします
   （SiteValues が覚えて、回し終わりに元の 3 秒へ戻します）。
   なお、この値は StaffAgent からは読まれていませんでした（料理を運ぶ仕事の1歩めは、
   前から dwell 0 秒）。ですので動きは変わらず、**0 秒という決まりが設定にも残る**という直しです。
   load_s（15 秒）は下げ膳だけで使う値、という扱いに書き換えました。

   → これで「サイトにあるが Unity で形にしていないもの」から load_s は外れました。
     残りは guest_load_s（下げ膳）・dish_extra_m（0）・extra_orders（0）・extra_cook です。

v5 3章ぶんは **cs:116**（14 項目）に入れました。
  変更 StaffAgent.cs・ServiceSimSetup.cs・TripLogger.cs・SimParams.cs・ExperimentRunner.cs・
       RobotSpec.cs・ServingRobotController.cs・JsonStoreLayout.cs・GroupManager.cs・ServiceOps.cs
  新規 Editor/ServiceSimSiteRun.cs・Experiment/SiteValues.cs（＋.meta）
Check-in していない .asset・prefab・シーン・ProjectSettings は、今回も触っていません。
