--- /tmp/claude-0/-home-claude/2afc91f9-ca44-5f2d-a1f2-8ded1ee7eedd/scratchpad/v2_6/haizen_sim.py	2026-10-23 18:12:52.750476718 +0900
+++ /tmp/claude-0/-home-claude/2afc91f9-ca44-5f2d-a1f2-8ded1ee7eedd/scratchpad/v2_7/haizen_sim.py	2026-10-23 20:26:49.112509336 +0900
@@ -94,7 +94,8 @@
     "warmup_min": 60,         # 回るかの確かめで、数えない慣らしの時間（分）
     "util_sample_s": 10,      # 手がふさがっている人数・台数を数える間隔（秒）
     "max_extra_min": 600,     # 数える時間のあと、追いかけるのを打ち切る上限（分）。店が回らない条件の保険
-    "model": "v2.4",          # モデルの版（前の版の結果を使い回さないための印）
+    "robot_first_wait_s": 120,  # v2.7 ロボット優先：料理はロボットを待つ。これだけ待っても来なければスタッフが運ぶ（秒）
+    "model": "v2.7",          # モデルの版（前の版の結果を使い回さないための印）
 }
 
 # ---------------------------------------------------------------
@@ -292,35 +293,46 @@
                 yield self.env.process(self.staff_job(0, d, p["rescue_s"]))
 
     # ---- 配膳
-    # 料理ができたら、ロボットとスタッフのうち先に空いた方が運ぶ（同時ならロボット）。
+    # v2.7 ロボット優先（2026-10-23 エイイチと決めた）：料理ができたら、まずロボットを待つ。スタッフは料理を持たず、
+    # ほかの仕事（案内・片付け・会計）を続ける。robot_first_wait_s（2分）待ってもロボットが空かなければ、
+    # そこからはロボットとスタッフのうち先に空いた方が運ぶ（料理が冷める前の逃げ道）。
+    # 割れ物を人が運ぶ設定（fragile_by=staff）と、ロボット0台のときは、今までどおりスタッフが運ぶ。
+    # v2.6 までは、はじめから「先に空いた方」だったため、受け渡し口の横で待つスタッフが多く運んでいた。
     # ロボットが出るときは、受け渡し口で待っている料理を段の数までまとめて載せ、近い卓から回る。
     def deliver(self, d, fragile=False, counted=True):
         env, p = self.env, self.p
         rec = {"d": d, "ready": env.now, "fragile": fragile, "counted": counted,
                "taken": env.event(), "arrived": env.event()}
         robot_ok = self.robots is not None and not (fragile and p["fragile_by"] == "staff")
-        sreq = self.staff.request(priority=1)
         if not robot_ok:
+            sreq = self.staff.request(priority=1)
             yield sreq
             yield env.process(self._staff_carry(rec, sreq))
             return
         rreq = self.robots.request(priority=0)
-        rec["sreq"], rec["rreq"] = sreq, rreq
+        rec["sreq"], rec["rreq"] = None, rreq
         self.pass_q.append(rec)
-        yield rreq | sreq | rec["taken"]
+        yield rreq | rec["taken"] | env.timeout(p["robot_first_wait_s"])   # まずロボットだけを待つ
+        if not (rreq.triggered or rec["taken"].triggered):                # 2分たった：ここからはスタッフも運べる
+            sreq = self.staff.request(priority=1)
+            rec["sreq"] = sreq
+            yield rreq | sreq | rec["taken"]
+        sreq = rec["sreq"]
         if rec["taken"].triggered:          # ほかの料理と一緒にロボットに載った
             yield rec["arrived"]
             return
         self.pass_q.remove(rec)
         if rreq.triggered:                  # ロボットが運ぶ
-            self._drop(sreq, self.staff)
+            if sreq is not None:
+                self._drop(sreq, self.staff)
             batch = [rec]
             for o in list(self.pass_q):
                 if len(batch) >= p["trays"]:
                     break
                 self.pass_q.remove(o)
                 self._drop(o["rreq"], self.robots)
-                self._drop(o["sreq"], self.staff)
+                if o["sreq"] is not None:
+                    self._drop(o["sreq"], self.staff)
                 o["taken"].succeed()
                 batch.append(o)
             env.process(self._robot_run(batch, rreq))
