---
title: "サービスロボット導入シミュレーション Log#25 | 配膳ロボットの効き目は、ファミレスのスタッフ数で変わる"
slug: understaffed-famires-robot
date: 2026-10-30
day: 409
meta_description: "配膳ロボットの効き目はスタッフの数で変わる。Unityで再現したファミレス6店では、ロボット0台なら人数を変えても試算と待ち時間がそろったが、人の少ない店にロボットを2台足しても入店待ちは試算ほど縮まなかった。"
tags: [サービスロボット導入シミュレーション, 配膳ロボット, 飲食店, ファミレス, 人手不足, Unity, シミュレーション, BellaBot]
series: "導入シミュレーション"
---

配膳ロボットを入れたファミレスで待ち時間がどれだけ縮むかは、スタッフの人数で変わります。Unity の3Dで再現したファミレス6店を一晩360回回すと、ロボット0台ではスタッフの人数を変えても、サイトの試算（計算で出す待ち時間）とほぼ同じ入店待ちになりました。ところが、**スタッフが少ない店に配膳ロボットを2台足しても、入店待ちは試算ほど縮みませんでした**。42卓の店をスタッフ3人で回すと、Unity は14.8分から13.1分、試算は10.6分から4.0分です。

配膳ロボットを検討する店の多くは、人が足りないから入れます。人が少ない店ほどロボットが助けになる、と考えるのが自然です。試算もそう答えていました。ところが、人とロボットが同じ通路を歩く3Dの店では、人の少ない店ほど、試算との差が大きく出ました。ロボットを足すと、片付けや案内にかかる時間が延び、動けなくなったロボットを人が動かしに行く手間も増えます。その手間が、人の少ない店ではそのまま入店待ちに響きます。小さめの店（④）では、スタッフを3人にしても、ロボットを足すほど入店待ちが延びました（2.9分 → 5.2分 → 12.7分）。

このシリーズでは、同じ6つのファミレスを2つの道具で回しています。数字の正はサイトの試算で、Unity は通路で起きることを測る役です。これまで Unity は、スタッフを店ごとの真ん中の人数（2〜4人）でしか回していませんでした。今回は人数を少なく・多くして回しました。

| やったこと | なぜ | 結果 |
|---|---|---|
| 6店の待機場所で、ロボットどうしが詰まる原因を数えた | 6店すべてで、同じ所に止まりが集まっていた | 1台分の幅0.8mが狭い。メーカーの設置ガイドでは約0.92m。今は直さず記録だけ |
| ロボットが動けなくなり、人が動かしに行く割合を店ごとに数えた | ロボットがいるとスタッフの仕事が増える理由を知るため | 試算は1往復あたり0.01、Unity は1台で0.02〜0.22・2台で0.04〜0.57。今は記録だけ |
| Unity が読む条件に、スタッフが少ない・多いの36条件を足した | 試算はスタッフの人数を3通り選べるが、Unity は1通りだった | 条件は54件から90件に。前からある54件は変えていない |
| 6店 × スタッフ少ない・多い × ロボット0・1・2台 × 種10個、360回を回した | 人数によって、ロボットの効き目がどう変わるかを見るため | 0台は試算とそろう。人が少ないと、ロボットを足しても試算ほど縮まない |
| 比較動画の素材を6店 × 11条件の66本、夜に録画し、④のロボット0台と2台を並べた動画を作った | 数字と文章だけでは、ロボットを足しても待ちが縮まない様子が伝わりにくい | 2台の店ではロボットが通路で止まり、スタッフが動かしに行く場面が続く |

下の図で、店とスタッフの人数を切り替えると、ロボット0・1・2台の入店待ちを Unity と試算で並べて見られます。

【図解】LOG409_staff_robot_effect.html

下の動画は、④の狭い店をスタッフ3人で回した Unity の店を、ロボット0台（左）と2台（右）で並べたものです（30倍速）。2台の店では、白い配膳ロボットが通路で止まり、青いスタッフが動かしに行く場面が何度も出ます。

【動画】LOG409_compare_p2_st3_r0_vs_r2.mp4 ④ 効率重視・狭い店をスタッフ3人・1時間28組で回した Unity の3Dシミュレーションを、ロボット0台（左）と2台（右）で左右に並べた30倍速の動画（6分31秒）。0台は入店待ちの平均4.0分、2台は12.6分でロボットが56回動けなくなった

配膳ロボットを自分の店に入れたら何人で回るかは、このシリーズの試算をもとにした別のページで試せます。

【バナー】serving-robot-one-less-staff


## 作業ログ ― 6店の待機場所で、ロボットどうしが詰まる原因を数えた

### サイトの試算・Unity・依頼箱・BellaBot は、このシリーズで何をしているか

| 言葉 | 何か | このシリーズでの使い方 |
|---|---|---|
| サイトの試算 | Python の [SimPy](https://simpy.readthedocs.io/)（出来事を時刻の順に進める、待ち行列のシミュレーションの道具）で書いた計算（`haizen_sim.py`） | 店・スタッフの人数・ロボットの台数・混み具合の組み合わせ32,850通りを、それぞれ40回回した平均を [試算のページ](https://pixelstomotors.com/sim/serving-robot) に出している。数字の正。今の版は v2.9 |
| Unity | ゲームなどを作る3Dの開発環境（[Unity](https://unity.com/ja)） | サイトの店の形どおりに店を建て、スタッフ・お客さん・ロボットを通路で歩かせて、止まる回数や待ち時間を測る |
| 依頼箱 | Claude が書いた依頼を、Mac の見張り係が [Claude Code](https://claude.com/claude-code)（コードを書いて動かす AI）に自動で渡す仕組み | Unity を動かす作業はすべてここから頼む。夜のあいだも続けて回せる |
| 種 | 乱数の出発点。同じ種なら同じお客さんの来方になる | Unity は1つの条件を種10個で回し、10回の中央値（真ん中の値）で見る |
| 台帳 | Unity の回ごとの記録を1行ずつ足していく表（`unity_ledger_v1.csv`） | 回す前に控えを取り、前からある行が変わっていないことを md5（ファイルの指紋）で確かめる |
| [BellaBot](https://academy.pudutech.com/en/docs/huan-le-song-chan-pin-jian-jie) | Pudu Robotics の配膳ロボット。猫の顔の画面が付いた機種で、日本のファミレスでもよく見かける | 店の形を作るときの基準の機種。通れる通路の幅（80cm）も、この機種の公表値から決めた |
| 待機場所 | 料理の受け渡し口の近くで、仕事のないロボットが並んで待つ場所 | 店の形のデータに、店ごとに3台分（④は2台分）を置いている |
| 動けなくなった | Unity のロボットが60秒止まったまま動けない状態 | Unity ではスタッフが動かしに行く。試算では「立ち往生」として、1往復あたりの割合（`stuck_rate`）で入れている |

店の番号と形は次のとおりです。③ 効率重視・入口が角（42卓）、⑦ ③の列の間の通路を95cmにした店、④ 効率重視・狭い店・入口が右の壁、⑤ ゆったり型・入口が正面の中央、⑥ ゆったり型・入口が左の壁、② 定番の郊外型（昔働いていたファミレスを記憶から起こした店）。

### 待機場所の中の30秒以上の止まりを、行き先ごとに分けた standby_jam_count.py

前の夜（20261102〜20261106）の2台の回で、待機場所の四角の中で30秒以上止まったものを、止まったロボットがどこへ向かっていたかで分けました。四角と受け渡し口の点は、各店の店の形から取った値です。KIOXIA の `service_sim/unity` で動かしました。

```python
import csv,glob,json,collections,os
rects={'fam_p1':(16.5,18.9,5.65,6.45,(15.3,5.95)),'fam_p5':(16.5,18.9,5.65,6.45,(15.3,5.95)),'fam_p2':(12.0,13.6,4.15,4.95,(11.05,4.45)),
'fam_p3':(14.2,16.6,8.55,9.35,(12.5,8.85)),'fam_p4':(15.5,17.9,5.65,6.45,(14.3,5.95)),'fam_p0':(12.2,14.6,5.1,5.9,(10.9,5.45))}
name={'fam_p1':'③','fam_p5':'⑦','fam_p2':'④','fam_p3':'⑤','fam_p4':'⑥','fam_p0':'②'}
for st,(x0,x1,z0,z1,fp) in rects.items():
  C=collections.Counter(); D=collections.Counter(); slots=None; n=0; dur=0
  for r in glob.glob(f'2026110[2-6]_night*_{st}_r2_s*'):
    if not os.path.exists(r+'/stops.csv'): continue
    if slots is None:
      tr=list(csv.DictReader(open(r+'/robot_track.csv')))[:2]
      slots=[(t['x'],t['z']) for t in tr]
    for s in csv.DictReader(open(r+'/stops.csv')):
      x,z=float(s['x']),float(s['z'])
      if not(x0<=x<=x1 and z0<=z<=z1): continue
      if float(s['duration_s'])<30: continue
      n+=1; dur+=float(s['duration_s'])
      to=s['solve_to']; fr=s['solve_from']
      tx,tz=map(float,to.split(';')) if to else (0,0)
      kind='受け渡し口へ' if abs(tx-fp[0])<0.3 and abs(tz-fp[1])<0.3 else ('待機の点へ' if x0<=tx<=x1 and z0<=tz<=z1 else ('卓など外へ' if to else '不明'))
      C[kind]+=1; D[(kind,s['cause'],s['cause_detail'][:12])]+=1
  print(name[st],st,'2台の初期位置',slots,'30秒以上',n,'平均',round(dur/max(n,1)),'秒',dict(C))
  for k,v in D.most_common(5): print('   ',k,v)
```

```text
③ fam_p1 2台の初期位置 [('16.9', '6.05'), ('17.7', '6.05')] 30秒以上 112 平均 55 秒 {'卓など外へ': 35, '待機の点へ': 72, '受け渡し口へ': 5}
    ('待機の点へ', 'もう1台のロボット', 'ServingRobot') 70
    ('卓など外へ', 'もう1台のロボット', 'ServingRobot') 32
    ('卓など外へ', 'もう1台のロボット', '') 3
    ('受け渡し口へ', 'もう1台のロボット', 'ServingRobot') 3
    ('待機の点へ', 'もう1台のロボット', '') 2
⑦ fam_p5 2台の初期位置 [('16.9', '6.05'), ('17.7', '6.05')] 30秒以上 139 平均 55 秒 {'卓など外へ': 35, '待機の点へ': 102, '受け渡し口へ': 2}
    ('待機の点へ', 'もう1台のロボット', 'ServingRobot') 98
    ('卓など外へ', 'もう1台のロボット', 'ServingRobot') 32
    ('卓など外へ', 'もう1台のロボット', '') 3
    ('待機の点へ', 'もう1台のロボット', '') 3
    ('受け渡し口へ', '分からない', '') 2
④ fam_p2 2台の初期位置 [('12.4', '4.55'), ('13.2', '4.55')] 30秒以上 186 平均 57 秒 {'卓など外へ': 38, '待機の点へ': 133, '受け渡し口へ': 15}
    ('待機の点へ', 'もう1台のロボット', 'ServingRobot') 132
    ('卓など外へ', 'もう1台のロボット', 'ServingRobot') 37
    ('受け渡し口へ', 'もう1台のロボット', 'ServingRobot') 7
    ('受け渡し口へ', '分からない', '') 6
    ('卓など外へ', 'もう1台のロボット', '') 1
⑤ fam_p3 2台の初期位置 [('14.6', '8.95'), ('15.4', '8.95')] 30秒以上 87 平均 55 秒 {'待機の点へ': 61, '受け渡し口へ': 11, '卓など外へ': 15}
    ('待機の点へ', 'もう1台のロボット', 'ServingRobot') 47
    ('卓など外へ', 'もう1台のロボット', 'ServingRobot') 13
    ('待機の点へ', '人が立ち止まっていた', 'Guest(Clone)') 6
    ('受け渡し口へ', 'もう1台のロボット', 'ServingRobot') 4
    ('受け渡し口へ', '人が立ち止まっていた', 'Staff02') 2
⑥ fam_p4 2台の初期位置 [('15.9', '6.05'), ('16.7', '6.05')] 30秒以上 205 平均 54 秒 {'待機の点へ': 126, '卓など外へ': 76, '受け渡し口へ': 3}
    ('待機の点へ', 'もう1台のロボット', 'ServingRobot') 119
    ('卓など外へ', 'もう1台のロボット', 'ServingRobot') 74
    ('待機の点へ', 'もう1台のロボット', '') 6
    ('卓など外へ', 'もう1台のロボット', '') 2
    ('受け渡し口へ', '分からない', '') 2
② fam_p0 2台の初期位置 [('12.6', '5.5'), ('13.4', '5.5')] 30秒以上 166 平均 56 秒 {'待機の点へ': 123, '卓など外へ': 41, '受け渡し口へ': 2}
    ('待機の点へ', 'もう1台のロボット', 'ServingRobot') 119
    ('卓など外へ', 'もう1台のロボット', 'ServingRobot') 40
    ('待機の点へ', 'もう1台のロボット', '') 4
    ('受け渡し口へ', 'もう1台のロボット', 'ServingRobot') 2
    ('卓など外へ', 'もう1台のロボット', '') 1
```

6店とも、止まりのほとんどは「もう1台のロボット」が理由で、いちばん多いのは待機の点（自分の待つ場所）へ戻ろうとして止まったものでした。止まっている長さは平均54〜57秒で、60秒の「動けなくなった」の手前まで続いています。

### 止まったときにもう1台がどこにいたかを見た standby_jam_pair.py

止まったロボットの位置・行き先と、同じ時刻のもう1台の位置と状態を並べました。③と②で動かしました（引数は店と待機場所の四角）。

```python
import csv,glob,collections,bisect,sys
st=sys.argv[1]; x0,x1,z0,z1=map(float,sys.argv[2:6])
C=collections.Counter(); ex=[]
for r in sorted(glob.glob(f'2026110[2-6]_night*_{st}_r2_s*'))[:40]:
  try: tr=list(csv.DictReader(open(r+'/robot_track.csv')))
  except: continue
  T=collections.defaultdict(list)
  for t in tr: T[t['robot_id']].append((float(t['t_s']),float(t['x']),float(t['z']),t['phase']))
  for s in csv.DictReader(open(r+'/stops.csv')):
    x,z=float(s['x']),float(s['z'])
    if not(x0<=x<=x1 and z0<=z<=z1) or float(s['duration_s'])<30: continue
    other=[k for k in T if k!=s['robot_id']][0]; L=T[other]; ts=[a[0] for a in L]
    i=min(bisect.bisect_left(ts,float(s['t_s'])),len(L)-1); o=L[i]
    to=s['solve_to']
    key=(f"自分({x:.1f},{z:.1f})", f"行き先{to}", f"相手({o[1]:.1f},{o[2]:.1f}){o[3]}")
    C[key]+=1
for k,v in C.most_common(12): print(v,k)
```

```text
$ python3 standby_jam_pair.py fam_p1 16.5 18.9 5.65 6.45
27 ('自分(16.6,5.9)', '行き先16.9;6.05', '相手(17.5,5.9)往復おわり')
21 ('自分(16.5,5.9)', '行き先16.9;6.05', '相手(17.5,6.0)往復おわり')
6 ('自分(16.7,6.0)', '行き先16.9;6.05', '相手(17.6,5.8)往復おわり')
3 ('自分(16.6,5.7)', '行き先16.9;6.05', '相手(17.5,6.0)往復おわり')
3 ('自分(16.6,5.9)', '行き先15.963;5.313', '相手(17.5,5.9)往復おわり')
3 ('自分(16.6,6.1)', '行き先16.9;6.05', '相手(17.5,6.0)往復おわり')
3 ('自分(16.5,5.9)', '行き先16.9;6.05', '相手(17.5,6.1)往復おわり')
2 ('自分(16.6,5.8)', '行き先16.9;6.05', '相手(17.5,6.1)往復おわり')
2 ('自分(16.5,5.9)', '行き先15.963;5.338', '相手(17.5,6.0)往復おわり')
2 ('自分(16.5,5.8)', '行き先16.9;6.05', '相手(17.5,6.0)往復おわり')
2 ('自分(16.5,5.9)', '行き先16.488;5.363', '相手(17.5,6.0)往復おわり')
2 ('自分(16.5,5.9)', '行き先16.9;6.05', '相手(17.5,5.9)往復おわり')

$ python3 standby_jam_pair.py fam_p0 12.2 14.6 5.1 5.9
41 ('自分(12.3,5.5)', '行き先12.6;5.5', '相手(13.2,5.5)往復おわり')
23 ('自分(12.2,5.5)', '行き先12.6;5.5', '相手(13.2,5.5)往復おわり')
21 ('自分(12.3,5.5)', '行き先12.6;5.5', '相手(13.2,5.4)往復おわり')
11 ('自分(12.2,5.3)', '行き先12.6;5.5', '相手(13.2,5.5)往復おわり')
6 ('自分(12.4,5.5)', '行き先12.6;5.5', '相手(13.3,5.3)往復おわり')
5 ('自分(12.2,5.4)', '行き先12.6;5.5', '相手(13.2,5.5)往復おわり')
5 ('自分(12.3,5.5)', '行き先12.413;4.888', '相手(13.2,5.5)往復おわり')
4 ('自分(12.3,5.5)', '行き先12.438;4.888', '相手(13.2,5.5)往復おわり')
3 ('自分(12.3,5.5)', '行き先12.6;5.5', '相手(13.2,5.4)往復おわり')
3 ('自分(12.2,5.5)', '行き先12.438;4.888', '相手(13.2,5.5)往復おわり')
3 ('自分(12.3,5.5)', '行き先11.588;4.813', '相手(13.2,5.4)往復おわり')
3 ('自分(12.2,5.5)', '行き先12.6;5.5', '相手(13.2,5.4)往復おわり')
```

形は2店とも同じでした。往復を終えたロボットが、受け渡し口に近い1番目の場所（③なら x16.9）へ入ろうとして、手前（x16.5〜16.6）で止まります。そのとき、もう1台も「往復おわり」の状態で、2番目の場所（x17.7）の0.1〜0.2m手前（x17.5〜17.6）にいます。2台とも自分の場所に着き切らないまま、近すぎてお互いに動けなくなっていました。

### 待機場所に戻ったロボットが止まる位置と、止まりの終わり方 standby_park_gap.py

③で、待機場所の近くにいるロボットの位置を0.1m単位で数え、30秒以上の止まりのときのいちばん近い障害物までの距離と、止まりの終わり方を数えました。

```python
import csv,glob,collections
P=collections.Counter(); G=[]; res=collections.Counter()
for r in sorted(glob.glob('2026110[2-6]_night*_fam_p1_r2_s*'))[:40]:
  try: tr=csv.DictReader(open(r+'/robot_track.csv'))
  except: continue
  for t in tr:
    if t['phase'] in('往復おわり','待機') and 16.3<float(t['x'])<19 and 5.5<float(t['z'])<6.6: P[(t['phase'],round(float(t['x']),1),round(float(t['z']),1))]+=1
  for s in csv.DictReader(open(r+'/stops.csv')):
    x,z=float(s['x']),float(s['z'])
    if 16.5<=x<=18.9 and 5.65<=z<=6.45 and float(s['duration_s'])>=30:
      G.append(float(s['min_gap_cm'])); res[(s['resolved'],round(float(s['duration_s'])/10)*10)]+=1
for k,v in P.most_common(10): print(v,k)
G.sort(); print('min_gap_cm', G[0],G[len(G)//2],G[-1]); print(res.most_common(8))
```

```text
8936 ('往復おわり', 16.7, 6.0)
7355 ('往復おわり', 17.6, 5.8)
5175 ('待機', 17.7, 6.0)
4852 ('往復おわり', 17.6, 5.9)
3933 ('待機', 16.9, 6.0)
3842 ('往復おわり', 17.5, 6.0)
3488 ('往復おわり', 16.8, 5.9)
3352 ('往復おわり', 17.9, 5.9)
3113 ('往復おわり', 16.7, 5.9)
2197 ('往復おわり', 17.5, 5.9)
min_gap_cm 19.0635 37.8247 111.3066
[(('動けなくなった', 60), 75), (('よける場所へ動いた', 40), 17), (('よける場所へ動いた', 50), 6), (('よける場所へ動いた', 60), 5), (('よける場所へ動いた', 30), 4), (('自分で動き出した', 60), 1), (('回り込んで動き出した', 60), 1), (('回り込んで動き出した', 40), 1)]
```

「往復おわり」のまま、場所の中心（x16.9・x17.7）から0.1〜0.2mずれた所にいる時間が長く、30秒以上の止まり110回のうち75回は60秒の「動けなくなった」で終わっていました。

### BellaBot Pro の設置ガイドでは、隣のロボットとの間を35cm空ける

店の形を作る決まりでは、待機場所の1台分の大きさを0.8m×0.8m以上にしています（`famires_v3.py` の `standby_slot=0.8`）。2台の中心の間が0.8mなので、どちらかが10〜20cmずれて止まるだけで、もう1台が入れなくなります。

Pudu の [BellaBot Pro の設置ガイド](https://cdn.robotshop.com/media/P/Pud/RB-Pud-20/pdf/bellabot-pro-guide-v-1-240624.pdf)（v1・2024年6月24日）には、待機場所の決まりが書かれています。

| 項目 | ガイドの値 |
|---|---|
| 機体の大きさ | 570mm × 550mm × 1290mm |
| 待機場所で2台を並べるときの間 | 35cm |
| 待機場所の後ろの壁から | 15cm |
| 待機場所の横の壁から | 35cm |
| 走れる最小の通路の幅 | 65cm |
| 2台が正面からすれ違うのに勧める幅 | 1.6m より広く |

機体の幅57cmに隣との間35cmを足すと、1台分の幅は約0.92mになります。今の0.8mでは足りていません。店の形の決まりにある BellaBot の機体の幅は0.50mで、ガイドの BellaBot Pro の0.57mより小さい値でした。

### 1台分を0.95mにした場合を、店の形の作り方で試した standby_pitch_try.py

店の形を作るコード（p2m-site の `tools/sim_layouts/famires_v3.py`）は変えずに、読み込んだ店の形の待機場所の四角だけを、1台分0.95mの長さにのばして、決まりの確かめと卓までの距離の計算を回しました。のばす向きは、受け渡し口から遠い側です。`tools/sim_layouts/` の中で動かします。

```python
import sys, json, copy
sys.path.insert(0, '.')
import famires_v3 as v
PITCH=float(sys.argv[1]) if len(sys.argv)>1 else 0.95
base='../../public/sim/layouts/'
for nm, fn in v.BUILDS:
    L = v.prepare(fn())
    sb = L["robot_standby"]; x0,y0,x1,y1 = sb["rect"]; n=sb["slots"]
    dish = L["dish_up"][0]["rect"]; dx=(dish[0]+dish[2])/2
    need = n*PITCH
    horiz = (x1-x0) >= (y1-y0)
    cur = (x1-x0) if horiz else (y1-y0)
    ext = round(need-cur, 3)
    if horiz:
        if abs(x0-dx) < abs(x1-dx): sb["rect"]=[x0,y0,round(x1+ext,3),y1]; side='右へ'
        else: sb["rect"]=[round(x0-ext,3),y0,x1,y1]; side='左へ'
    else:
        sb["rect"]=[x0,y0,x1,round(y1+ext,3)]; side='上へ'
    vio = v.check_rules(L)
    old = json.load(open(base+nm+'_analysis.json'))['tables']
    msg=''
    if not vio:
        try:
            res,err = v.analyze(L, v.SETTINGS['res']); vio += err
            ch=[(a['id'],a['category'],b['category'],round(a.get('dist') or 0,2),round(b.get('dist') or 0,2)) for a,b in zip(res,old)
                if a['category']!=b['category'] or abs((a.get('dist') or 0)-(b.get('dist') or 0))>0.005]
            msg=f'距離・分け方が変わる卓 {len(ch)}: {ch[:6]}'
        except ValueError as e: vio.append(('出発点',str(e)))
    print(nm, L['name'], f'{n}台 {cur:.2f}m→{need:.2f}m（{side}{ext:+.2f}m）', 'rect', sb['rect'])
    for k,m in vio[:6]: print('   NG', k, m)
    if msg: print('   ', msg)
```

1台分0.95mのとき：

```text
$ python3 standby_pitch_try.py 0.95
p0_memory ② 定番の郊外型 3台 2.40m→2.85m（右へ+0.45m） rect [12.2, 5.1, 15.05, 5.9]
    距離・分け方が変わる卓 0: []
p1_efficient_corner ③ 効率重視型・入口が左下の角 3台 2.40m→2.85m（右へ+0.45m） rect [16.5, 5.65, 19.35, 6.45]
    距離・分け方が変わる卓 0: []
p2_efficient_narrow ④ 効率重視型・狭い店・入口が右の壁 2台 1.60m→1.90m（右へ+0.30m） rect [12.0, 4.15, 13.9, 4.95]
    距離・分け方が変わる卓 0: []
p3_relaxed_center ⑤ ゆったり型・入口が正面の中央 3台 2.40m→2.85m（右へ+0.45m） rect [14.2, 8.55, 17.05, 9.35]
    距離・分け方が変わる卓 7: [('T25', 'robot', 'robot', 17.54, 17.31), ('T26', 'robot', 'robot', 15.69, 15.46), ('T27', 'robot', 'robot', 15.09, 14.86), ('T28', 'robot', 'robot', 15.58, 15.34), ('T33', 'robot', 'robot', 9.1, 8.97), ('T37', 'robot', 'robot', 17.3, 17.07)]
p4_relaxed_side ⑥ ゆったり型・入口が左の壁 3台 2.40m→2.85m（右へ+0.45m） rect [15.5, 5.65, 18.35, 6.45]
    距離・分け方が変わる卓 0: []
p5_crammed ⑦ ③の列の間の通路を95cmに（卓と席数は③と同じ） 3台 2.40m→2.85m（右へ+0.45m） rect [16.5, 5.65, 19.35, 6.45]
    距離・分け方が変わる卓 0: []
```

比べる相手（公開中の analysis）と同じ計算になっているかを、今の幅のまま（1台分0.8m・のばす長さ0）で回して確かめました。⑤も変わる卓は0でした。

```text
$ python3 standby_pitch_try.py 0.8 | grep -A1 p3_
p3_relaxed_center ⑤ ゆったり型・入口が正面の中央 3台 2.40m→2.40m（右へ-0.00m） rect [14.2, 8.55, 16.6, 9.35]
    距離・分け方が変わる卓 0: []
```

### ⑤だけ、右側の卓までの距離が延びる standby_pitch_p3_detail.py

⑤で距離が変わる卓を、止まる位置と一緒に出しました。

```python
import sys, json
sys.path.insert(0,'.')
import famires_v3 as v
L=v.prepare(dict(v.BUILDS)['p3_relaxed_center']())
L['robot_standby']['rect']=[14.2,8.55,17.05,9.35]
res,_=v.analyze(L,v.SETTINGS['res'])
old={t['id']:t for t in json.load(open('../../public/sim/layouts/p3_relaxed_center_analysis.json'))['tables']}
for a in res:
    b=old[a['id']]
    if abs(a['dist']-b['dist'])>0.005: print(a['id'],a['stop'],b['stop'],a['dist'],b['dist'],a['side'],b['side'])
print('start',L['start'])
for t in L['tables']:
    if t['id'] in('T33','T25'): print(t)
print([ (r['label'],r['rect']) for r in L['rooms']][:12])
```

```text
T25 [np.float64(24.013), np.float64(10.488)] [24.013, 10.488] 17.54 17.31 left left
T26 [np.float64(24.013), np.float64(12.338)] [24.013, 12.338] 15.69 15.46 left left
T27 [np.float64(24.013), np.float64(13.338)] [24.013, 13.338] 15.09 14.86 left left
T28 [np.float64(24.013), np.float64(14.513)] [24.013, 14.513] 15.58 15.34 left left
T33 [np.float64(19.963), np.float64(10.962)] [19.963, 10.962] 9.1 8.97 left left
T37 [np.float64(23.788), np.float64(10.638)] [23.788, 10.638] 17.3 17.07 right right
T38 [np.float64(23.788), np.float64(12.488)] [23.788, 12.488] 15.45 15.22 right right
start [12.5, 8.85]
{'type': 'booth', 'axis': 'v', 'x': 24.8, 'y': 8.8, 'w': 1.2, 'h': 1.85, 'seats': 4, 'id': 'T25'}
{'type': 'booth', 'axis': 'v', 'x': 20.75, 'y': 10.8, 'w': 1.2, 'h': 1.85, 'seats': 4, 'id': 'T33'}
[('パントリー', [7.5, 9.4, 17.5, 10.6]), ('キッチン', [7.5, 10.6, 17.5, 14.0]), ('洗い場', [7.5, 14.0, 12.5, 17.0]), ('冷蔵・冷凍・保存', [12.5, 14.0, 17.5, 17.0]), ('更衣室・社員トイレ', [17.5, 14.5, 21.5, 17.0]), ('トイレ', [0.0, 14.6, 3.0, 17.0]), ('レジ', [11.2, 0.3, 11.9, 2.8]), ('レジ内', [10.4, 0.3, 11.2, 2.8]), ('待合', [15.4, 0.3, 15.9, 2.3]), ('ドリンクバー', [15.0, 4.6, 18.6, 5.3])]
```

止まる位置は変わらず、右側の7卓（T25〜T28・T33・T37・T38）で距離が0.13〜0.23m延びます。⑤はパントリーの右端が x17.5 で、のばした待機場所の端（x17.05）との間が狭くなり、受け渡し口から右へ抜ける道が少し回り道になるためです。直すなら、⑤だけ試算を計算し直すことになります。

### 待機場所は、今は直さず記録だけにした

1台分を0.95mにする案、2台のときは1番と3番の場所に置く案（3台以上で同じことが残る）、記録だけにする案を並べ、記録だけにすることになりました。直すときの候補は「1台分を0.95mにして、⑤だけ試算を計算し直す」です。原因・ガイドの値・試した結果は、ずれの一覧 `unity/unity_stageC_gaps_v1.md` に書き足しました。


## 作業ログ ― ロボットが動けなくなり、人が動かしに行く割合を店ごとに数えた

### ロボットがいると、スタッフの仕事が増える理由のいちばん大きいもの

前の記録（LOG405）で、④の混んでいる日・ロボット2台では、スタッフが1組あたりに使う時間が試算より約46%長く、いちばん大きいのは「ロボットを動かしに行く」（1組あたり30.6秒）でした。試算にも、ロボットが動けなくなってスタッフが動かしに行く「立ち往生」が入っていて、1往復あたり0.01の割合、動かす作業は15秒です。Unity で実際にどれくらい起きているかを、混み具合を広げた夜（20261106）で店ごとに数えました。

### 1往復あたりの「動けなくなった」の数を、場所と理由で分けた stuck_rate_by_store.py

```python
import csv,glob,collections,json
R={'fam_p1':(16.5,18.9,5.65,6.45,15.3,5.95),'fam_p5':(16.5,18.9,5.65,6.45,15.3,5.95),'fam_p2':(12.0,13.6,4.15,4.95,11.05,4.45),'fam_p3':(14.2,16.6,8.55,9.35,12.5,8.85),'fam_p4':(15.5,17.9,5.65,6.45,14.3,5.95),'fam_p0':(12.2,14.6,5.1,5.9,10.9,5.45)}
nm={'fam_p1':'③','fam_p5':'⑦','fam_p2':'④','fam_p3':'⑤','fam_p4':'⑥','fam_p0':'②'}
for st,(x0,x1,z0,z1,px,pz) in R.items():
  for rob in ('r1','r2'):
    for a in sorted(set(d.split('_')[2] for d in glob.glob(f'20261106_night_a*_cs44_{st}_{rob}_s*'))):
      C=collections.Counter(); trips=0; groups=0; n=0
      for r in glob.glob(f'20261106_night_{a}_cs44_{st}_{rob}_s*'):
        n+=1
        trips+=sum(1 for _ in open(r+'/trips.csv'))-1
        groups+=sum(1 for _ in open(r+'/groups.csv'))-1
        for s in csv.DictReader(open(r+'/stops.csv')):
          if s['resolved']!='動けなくなった': continue
          x,z=float(s['x']),float(s['z'])
          k='待機場所' if x0<=x<=x1 and z0<=z<=z1 else ('受け渡し口2.5m' if (x-px)**2+(z-pz)**2<=6.25 else 'そのほか')
          C[(k,'ロボどうし' if 'ロボット' in s['cause'] else '人など')]+=1
      tot=sum(C.values())
      print(nm[st],rob,a,f'種{n} 往復{trips} 組{groups} 動けなくなった{tot}（1往復あたり{tot/trips:.3f}）', dict(C))
```

```text
③ r1 a30 種10 往復646 組589 動けなくなった48（1往復あたり0.074） {('そのほか', '人など'): 47, ('受け渡し口2.5m', '人など'): 1}
③ r1 a54 種10 往復798 組1081 動けなくなった77（1往復あたり0.096） {('そのほか', '人など'): 76, ('受け渡し口2.5m', '人など'): 1}
③ r2 a30 種10 往復1051 組589 動けなくなった99（1往復あたり0.094） {('そのほか', '人など'): 50, ('待機場所', 'ロボどうし'): 27, ('受け渡し口2.5m', '人など'): 2, ('受け渡し口2.5m', 'ロボどうし'): 10, ('待機場所', '人など'): 1, ('そのほか', 'ロボどうし'): 9}
③ r2 a54 種10 往復1520 組1081 動けなくなった150（1往復あたり0.099） {('そのほか', '人など'): 78, ('受け渡し口2.5m', 'ロボどうし'): 17, ('待機場所', 'ロボどうし'): 17, ('そのほか', 'ロボどうし'): 33, ('受け渡し口2.5m', '人など'): 5}
⑦ r1 a30 種10 往復653 組589 動けなくなった44（1往復あたり0.067） {('そのほか', '人など'): 44}
⑦ r1 a54 種10 往復809 組1081 動けなくなった50（1往復あたり0.062） {('そのほか', '人など'): 50}
⑦ r2 a30 種10 往復984 組589 動けなくなった109（1往復あたり0.111） {('そのほか', '人など'): 50, ('待機場所', 'ロボどうし'): 34, ('そのほか', 'ロボどうし'): 14, ('受け渡し口2.5m', 'ロボどうし'): 4, ('受け渡し口2.5m', '人など'): 7}
⑦ r2 a54 種10 往復1600 組1081 動けなくなった153（1往復あたり0.096） {('そのほか', 'ロボどうし'): 8, ('そのほか', '人など'): 95, ('待機場所', 'ロボどうし'): 43, ('受け渡し口2.5m', 'ロボどうし'): 1, ('受け渡し口2.5m', '人など'): 6}
④ r1 a20 種10 往復573 組385 動けなくなった118（1往復あたり0.206） {('そのほか', '人など'): 112, ('待機場所', '人など'): 5, ('受け渡し口2.5m', '人など'): 1}
④ r1 a36 種10 往復1006 組717 動けなくなった222（1往復あたり0.221） {('そのほか', '人など'): 191, ('受け渡し口2.5m', '人など'): 25, ('待機場所', '人など'): 6}
④ r2 a20 種10 往復702 組385 動けなくなった402（1往復あたり0.573） {('待機場所', 'ロボどうし'): 52, ('そのほか', 'ロボどうし'): 122, ('そのほか', '人など'): 185, ('受け渡し口2.5m', 'ロボどうし'): 15, ('受け渡し口2.5m', '人など'): 26, ('待機場所', '人など'): 2}
④ r2 a36 種10 往復1292 組717 動けなくなった679（1往復あたり0.526） {('そのほか', 'ロボどうし'): 222, ('受け渡し口2.5m', 'ロボどうし'): 47, ('そのほか', '人など'): 259, ('待機場所', 'ロボどうし'): 85, ('待機場所', '人など'): 4, ('受け渡し口2.5m', '人など'): 62}
⑤ r1 a33 種10 往復622 組646 動けなくなった31（1往復あたり0.050） {('そのほか', '人など'): 31}
⑤ r1 a59 種10 往復854 組1184 動けなくなった40（1往復あたり0.047） {('そのほか', '人など'): 40}
⑤ r2 a33 種10 往復1038 組646 動けなくなった76（1往復あたり0.073） {('そのほか', '人など'): 34, ('待機場所', 'ロボどうし'): 20, ('そのほか', 'ロボどうし'): 14, ('受け渡し口2.5m', 'ロボどうし'): 6, ('受け渡し口2.5m', '人など'): 2}
⑤ r2 a59 種10 往復1698 組1184 動けなくなった64（1往復あたり0.038） {('受け渡し口2.5m', 'ロボどうし'): 7, ('待機場所', 'ロボどうし'): 2, ('そのほか', '人など'): 40, ('待機場所', '人など'): 2, ('そのほか', 'ロボどうし'): 12, ('受け渡し口2.5m', '人など'): 1}
⑥ r1 a27 種10 往復718 組532 動けなくなった17（1往復あたり0.024） {('そのほか', '人など'): 15, ('受け渡し口2.5m', '人など'): 2}
⑥ r1 a49 種10 往復983 組991 動けなくなった19（1往復あたり0.019） {('そのほか', '人など'): 19}
⑥ r2 a27 種10 往復1097 組532 動けなくなった42（1往復あたり0.038） {('待機場所', 'ロボどうし'): 37, ('受け渡し口2.5m', 'ロボどうし'): 2, ('受け渡し口2.5m', '人など'): 3}
⑥ r2 a49 種10 往復1747 組991 動けなくなった98（1往復あたり0.056） {('待機場所', 'ロボどうし'): 54, ('受け渡し口2.5m', 'ロボどうし'): 4, ('受け渡し口2.5m', '人など'): 9, ('そのほか', '人など'): 12, ('そのほか', 'ロボどうし'): 17, ('待機場所', '人など'): 2}
② r1 a14 種10 往復526 組275 動けなくなった10（1往復あたり0.019） {('受け渡し口2.5m', '人など'): 2, ('そのほか', '人など'): 8}
② r1 a24 種10 往復730 組474 動けなくなった138（1往復あたり0.189） {('そのほか', '人など'): 137, ('受け渡し口2.5m', '人など'): 1}
② r2 a14 種10 往復633 組275 動けなくなった118（1往復あたり0.186） {('そのほか', 'ロボどうし'): 30, ('待機場所', 'ロボどうし'): 40, ('受け渡し口2.5m', '人など'): 20, ('受け渡し口2.5m', 'ロボどうし'): 23, ('そのほか', '人など'): 5}
② r2 a24 種10 往復1003 組474 動けなくなった226（1往復あたり0.225） {('待機場所', 'ロボどうし'): 44, ('そのほか', '人など'): 119, ('そのほか', 'ロボどうし'): 42, ('受け渡し口2.5m', 'ロボどうし'): 19, ('受け渡し口2.5m', '人など'): 2}
```

| 店 | 1台・空いている | 1台・混んでいる | 2台・空いている | 2台・混んでいる |
|---|---|---|---|---|
| ③ | 0.074 | 0.096 | 0.094 | 0.099 |
| ⑦ | 0.067 | 0.062 | 0.111 | 0.096 |
| ④ | 0.206 | 0.221 | 0.573 | 0.526 |
| ⑤ | 0.050 | 0.047 | 0.073 | 0.038 |
| ⑥ | 0.024 | 0.019 | 0.038 | 0.056 |
| ② | 0.019 | 0.189 | 0.186 | 0.225 |

試算の0.01に対して、Unity は1台で2〜22倍、2台で4〜57倍でした。2台の分には、上の待機場所の詰まりを含む「ロボットどうし」の止まりが入っています。

### 1台のときに動けなくなった理由と場所 stuck_cause_one_robot.py

1台ならロボットどうしの止まりはありません。多かった3つ（④混んでいる・②混んでいる・③混んでいる）で、理由と場所（2m四方のマス）を数えました。

```python
import csv,glob,collections
for st,a in (('fam_p2','a36'),('fam_p0','a24'),('fam_p1','a54')):
  C=collections.Counter(); M=collections.Counter(); D=collections.Counter()
  for r in glob.glob(f'20261106_night_{a}_cs44_{st}_r1_s*'):
    for s in csv.DictReader(open(r+'/stops.csv')):
      if s['resolved']!='動けなくなった': continue
      C[s['cause']]+=1; D[s['cause_detail'].split('(')[0][:10]]+=1
      M[(int(float(s['x'])//2*2),int(float(s['z'])//2*2), 'narrow' if s['in_narrow']=='1' else '')]+=1
  print(st,a,dict(C)); print('   ',D.most_common(6)); print('   ',M.most_common(5))
```

```text
fam_p2 a36 {'スタッフとすれ違った': 44, '人が立ち止まっていた': 138, '分からない': 8, 'お客さんとすれ違った': 28, '椅子・荷物・ベビーカー': 4}
    [('Staff02', 76), ('Staff01', 71), ('Guest', 63), ('', 8), ('Table01/Ch', 4)]
    [((4, 2, ''), 71), ((2, 2, ''), 59), ((6, 2, ''), 17), ((8, 4, ''), 17), ((2, 8, ''), 13)]
fam_p0 a24 {'人が立ち止まっていた': 132, 'お客さんとすれ違った': 3, 'スタッフとすれ違った': 3}
    [('Guest', 123), ('Staff01', 12), ('', 2), ('Staff02', 1)]
    [((12, 0, ''), 114), ((12, 2, ''), 23), ((8, 4, ''), 1)]
fam_p1 a54 {'人が立ち止まっていた': 43, 'スタッフとすれ違った': 24, 'お客さんとすれ違った': 10}
    [('Guest', 20), ('Staff01', 20), ('Staff03', 13), ('Staff04', 13), ('Staff02', 11)]
    [((8, 4, ''), 24), ((4, 4, ''), 12), ((0, 8, ''), 10), ((2, 4, ''), 7), ((0, 4, ''), 5)]
```

1台の分は人が原因で、場所が偏っていました。②の混んでいる日は138回のうち114回が入口・レジのまわり（x12〜14・y0〜2）で、待っているお客さんが立ち止まっていました。④の混んでいる日は、下の左（x2〜6・y2〜4）で、スタッフとお客さんが立ち止まっていました。

### 試算の立ち往生の割合は、0.01のままにした

試算に Unity の値を入れる案（1台の分だけ店ごとに入れる・2台の分まで店ごとに入れる）と、記録だけにする案を並べ、記録だけにすることになりました。2台の分には、2026-10-24 に「Unity の作りの問題」として扱うと決めたロボットどうしの止まりが混ざっています。1台の分も、店と場所でこれだけ偏るなら、平均を入れると偏りが見えなくなります。数えた値は、ずれの一覧に書き足しました。


## 作業ログ ― 6店のスタッフの人数を「少ない・多い」に広げて、Unity で360回回した

### Unity が読む条件のファイルに、スタッフの人数の36条件を足した

Unity は、サイトの `public/sim/serving-robot-params.json` を読んで条件を決めます（値を手で写さないため）。書き出しの `export_params.py`（試算 v2.9 のフォルダ）に、店ごとに「スタッフが少ない 0・1・2台 → 多い 0・1・2台」の6条件を後ろに足しました。混み具合は普通のままです。

- ねらい：ロボットの効き目がスタッフの人数でどう変わるかを、3Dの店でも確かめる。最終的には、どの人数でも Unity で回せるようにする
- 変わったこと：Unity が読む条件が54件から90件に。前の54件の条件は並びも中身も同じで、変わったのは試算の結果の値（v2.8 → v2.9）だけ
- 見込める効果：Unity が回せる組み合わせが、混み具合3通りに加えてスタッフの人数3通りになり、試算の表の見方（人数を変えて何人で回るかを見る）と同じ切り口で比べられる

```diff
--- _前の版_08db8a0d067c_v29/export_params_before_staff_20261030.py	2026-10-30 02:22:48.911808481 +0000
+++ export_params.py	2026-10-30 02:22:48.930820661 +0000
@@ -6,7 +6,7 @@
 使い方: python3 export_params.py results.json <出力先>   （出力先は p2m-site の public/sim/serving-robot-params.json）
 - common：店に共通の値。role が "unity_measures" の値は Unity で測ってサイトに戻すための仮の値なので、Unity は読まない
 - stores：Unity で回す店（fam_p1・fam_p5・fam_p2・fam_p3・fam_p4・fam_p0）の値。registers はレジの数（v2.8）
-- unity_conditions：Unity で回す条件（0〜17番は店ごとに混み具合が普通の3つ。18〜53番は2026-10-29に足した空いている・混んでいるの各3つ。計54条件）と、同じ条件の試算の結果（40回の平均）。Unity の店はレジの内側に店員が1人だけなので、レジは1つ
+- unity_conditions：Unity で回す条件（0〜17番は店ごとに混み具合が普通の3つ。18〜53番は2026-10-29に足した空いている・混んでいるの各3つ。54〜89番は2026-10-30に足したスタッフが少ない・多いの各3つ（混み具合は普通）。計90条件）と、同じ条件の試算の結果（40回の平均）。Unity の店はレジの内側に店員が1人だけなので、レジは1つ
 """
 import json
 import sys
@@ -59,6 +59,18 @@
         for robots in (0, 1, 2):
             c = {"store": k, "staff": staff, "robots": robots, "arrivals_per_h": arr, "mode": "serve",
                  "trays": 3 if robots else 1, "fragile_by": "any", "registers": UNITY_REGISTERS}
+            r = rows[h.key(c)]
+            conds.append({"condition": c, "site_result": {m: r[m] for m in r if m not in c}})
+
+# 2026-10-30 エイイチと決めた：スタッフの人数を「少ない・多い」にも広げて夜に回す（段階4の中で1回）。
+# 前の54条件（0〜53番）は並びも中身も変えず、後ろに足す（店ごとに 少ない0・1・2台 → 多い0・1・2台。混み具合は普通）
+for k in UNITY_STORES:
+    s = h.STORES[k]
+    arr = s["arrivals"][1]          # 普通のまま
+    for staff in (s["staff"][0], s["staff"][2]):   # 少ない・多い
+        for robots in (0, 1, 2):
+            c = {"store": k, "staff": staff, "robots": robots, "arrivals_per_h": arr, "mode": "serve",
+                 "trays": 3 if robots else 1, "fragile_by": "any", "registers": UNITY_REGISTERS}
             r = rows[h.key(c)]
             conds.append({"condition": c, "site_result": {m: r[m] for m in r if m not in c}})
 
```

書き出したファイルを、前の54件のファイルと比べました。

```text
$ python3 export_params.py results.json params_staff.json
54 90 first54 same True {'meta': True, 'common': True, 'unity_rules': True, 'stores': True}
fam_p1 staff 3 r 0 arr 42 entry 10.64 staffwait 9.86 dish 0.88
fam_p1 staff 3 r 1 arr 42 entry 5.62 staffwait 4.37 dish 2.14
fam_p1 staff 3 r 2 arr 42 entry 4.0 staffwait 3.09 dish 0.92
fam_p1 staff 5 r 0 arr 42 entry 1.04 staffwait 0.31 dish 0.27
fam_p1 staff 5 r 1 arr 42 entry 1.08 staffwait 0.3 dish 1.87
fam_p1 staff 5 r 2 arr 42 entry 0.92 staffwait 0.27 dish 0.96
fam_p5 staff 3 r 0 arr 42 entry 12.02 staffwait 11.16 dish 0.9
fam_p5 staff 3 r 1 arr 42 entry 6.8 staffwait 5.23 dish 2.2
fam_p5 staff 3 r 2 arr 42 entry 4.15 staffwait 2.96 dish 0.94
fam_p5 staff 5 r 0 arr 42 entry 1.44 staffwait 0.44 dish 0.27
fam_p5 staff 5 r 1 arr 42 entry 1.67 staffwait 0.39 dish 1.91
fam_p5 staff 5 r 2 arr 42 entry 1.34 staffwait 0.33 dish 0.99
fam_p2 staff 1 r 0 arr 28 entry 52.32 staffwait 45.62 dish 4.5
fam_p2 staff 1 r 1 arr 28 entry 33.09 staffwait 31.01 dish 1.0
fam_p2 staff 1 r 2 arr 28 entry 34.94 staffwait 32.03 dish 0.41
fam_p2 staff 3 r 0 arr 28 entry 2.41 staffwait 1.25 dish 0.47
fam_p2 staff 3 r 1 arr 28 entry 1.28 staffwait 0.5 dish 1.33
fam_p2 staff 3 r 2 arr 28 entry 1.04 staffwait 0.37 dish 0.5
fam_p3 staff 3 r 0 arr 46 entry 19.17 staffwait 17.37 dish 1.12
fam_p3 staff 3 r 1 arr 46 entry 11.09 staffwait 8.82 dish 2.32
fam_p3 staff 3 r 2 arr 46 entry 8.61 staffwait 6.48 dish 1.09
fam_p3 staff 5 r 0 arr 46 entry 2.34 staffwait 0.8 dish 0.41
fam_p3 staff 5 r 1 arr 46 entry 2.58 staffwait 0.56 dish 2.05
fam_p3 staff 5 r 2 arr 46 entry 2.54 staffwait 0.48 dish 1.24
fam_p4 staff 2 r 0 arr 38 entry 29.82 staffwait 27.37 dish 1.72
fam_p4 staff 2 r 1 arr 38 entry 15.29 staffwait 13.96 dish 1.85
fam_p4 staff 2 r 2 arr 38 entry 14.48 staffwait 13.17 dish 0.7
fam_p4 staff 4 r 0 arr 38 entry 1.64 staffwait 1.04 dish 0.51
fam_p4 staff 4 r 1 arr 38 entry 1.33 staffwait 0.42 dish 1.84
fam_p4 staff 4 r 2 arr 38 entry 0.71 staffwait 0.26 dish 0.87
fam_p0 staff 1 r 0 arr 19 entry 24.45 staffwait 21.48 dish 2.06
fam_p0 staff 1 r 1 arr 19 entry 13.55 staffwait 11.76 dish 0.78
fam_p0 staff 1 r 2 arr 19 entry 13.45 staffwait 11.96 dish 0.37
fam_p0 staff 3 r 0 arr 19 entry 1.02 staffwait 0.31 dish 0.23
fam_p0 staff 3 r 1 arr 19 entry 1.24 staffwait 0.3 dish 0.92
fam_p0 staff 3 r 2 arr 19 entry 0.99 staffwait 0.24 dish 0.41
```

試算 v2.8 のときの写し（54件）と v2.9 の54件を比べると、違いは meta と common の model の名前（v2.8 → v2.9）と、試算の結果の値だけでした。v2.9 は、会計のスタッフをお客さんがレジに並んだ順に付ける形に試算を直した版です（LOG405）。Unity の会計の頼み方に試算を合わせた版なので、Unity の動きは変えません。

```text
54 90
meta ['model']
common ['model']
conds same condition keys True
v2.8 v2.9
会計はレジ1つにつき1組ずつ（pay_s 秒）。食べ終えた組は卓に座ったまま順番を待つ。Unity の条件はすべてレジ1つ（v2.8）
会計はレジ1つにつき1組ずつ（pay_s 秒）。食べ終えた組は卓に座ったまま順番を待つ。Unity の条件はすべてレジ1つ（v2.8）
```

前の54件のファイルは `simulation/v2_9/_前の版_08db8a0d067c_v29/` に控え、新しいファイルを p2m-site に入れて公開しました（commit d73b98d）。公開されたファイルが90件・v2.9 になっていることを確かめてから、依頼を出しました。台帳は回す前に KIOXIA の `archive/unity_ledger_v1_prenight_20261107_staff/` に控えました（1032行・md5 52e433713d4f7d41dfa8ccfb889492cd）。

### 依頼32「スタッフの人数を広げて夜を回す」の全文

依頼箱の「確認待ち」に置き、11:41に「新規」へ移して始めました。

````markdown
---
作業フォルダ: /Users/shimazueiichi/Robotics_UX/ServiceSim
上限時間: 720
---
# 依頼：試算 v2.9 の条件を写し、6店のスタッフの人数を「少ない・多い」に広げて、夜（360回）を回す（2026-10-30）

エイイチと決めたこと：今までの Unity は、6店ともスタッフが「真ん中の人数」だけだった。サイトの試算はスタッフの人数を3通り選べるので、Unity でも少ない・多いを回す（段階4の中で1回。最終的にはどの人数でも回せるようにするための準備）。混み具合は普通。

サイト（正）はもう更新した（p2m-site commit d73b98d）。
- `public/sim/serving-robot-params.json`：試算が v2.8 → **v2.9**（会計のスタッフを、客がレジに並んだ順に付ける。Unity の今の会計の頼み方に試算を合わせた版。Unity は変えない）
- unity_conditions が 54件 → 90件。0〜53番は条件（condition）の並びも中身も前と同じ。変わったのは試算の結果（site_result）の値だけ。54〜89番に、店ごとに「スタッフが少ない 0・1・2台 → 多い 0・1・2台」の6条件を足した
- meta・common は model の名前（v2.8 → v2.9）だけが変わった。unity_rules・stores は前と同じ。店の形の版は 08db8a0d067c のまま
- 足した条件のスタッフの人数（少ない・多い）：③ 3・5／⑦ 3・5／④ 1・3／⑤ 3・5／⑥ 2・4／② 1・3。来客のペースは普通（③⑦ 42・④ 28・⑤ 46・⑥ 38・② 19 組/時）
- ④②は、スタッフ1人の条件が入る。1人で案内・料理・会計・片付けを全部やる形になる
- 台帳の退避は Claude が済ませた：`/Volumes/KIOXIA/r2r2r-data/service_sim/unity/archive/unity_ledger_v1_prenight_20261107_staff/unity_ledger_v1.csv`（1032行・md5 52e433713d4f7d41dfa8ccfb889492cd）

## 始める前に確かめること（違えば手を止めて報告）

1. Unity エディタが起動していない（起動していたら閉じずに報告して終わる）
2. /Volumes/KIOXIA がマウントされている。鍵ファイル unity_ledger_v1.lock がない
3. 台帳の md5 が上の退避と同じ
4. ServiceSim の保留が 0
5. https://pixelstomotors.com/sim/serving-robot-params.json の unity_conditions が90件、meta.model が v2.9、meta.layout_generation が 08db8a0d067c（違えば数分おきに取り直す。30分たっても違えば報告して終わる）

## A. 条件を写して、並びを作る

1. サイトの params を、今までと同じやり方でプロジェクトに写す（手で値を写さない）。前の写し（54件・v2.8）と比べて、変わったのが「meta・common の model」「0〜53番の site_result の値」「54〜89番の追加」だけであることを確かめる。店の形のファイルは写し直さなくてよい（版が同じため）
2. 実行ファイルが params を中に持っている作りなら、今までと同じやり方で画面なしの実行ファイルを作り直す。コードは変えない。check-in して保留 0
3. 並びを作る。6店 × スタッフ少ない・多い × 0・1・2台 × 種0〜9 = **360回**（すれ違い入・待機場所へ戻る 入・案B 切。今の標準のまま。混み具合は普通）
   - make_queue.py に、スタッフの人数で選ぶ指定（例 `--staff few,many`）を足してよい。店ごとにスタッフの人数の少ない順に「少ない few・真ん中 mid・多い many」とする（--crowd と同じ考え方）
   - **何も指定しないとき・--stores だけ・--crowd だけを指定したときの並びは、前と同じにする**（スタッフは真ん中だけ）。params が90件になって、何も指定しない並び（③⑦の60回）や --stores だけの並び（その店の普通の30回）に、足したスタッフの条件が混ざらないこと。前の make_queue.py ＋前の params と、新しい make_queue.py ＋新しい params で並びを作って比べる（前回の --crowd の確かめと同じやり方）
   - 回の名前（フォルダ名）にスタッフの人数が入らず、名前が重なるなら、真ん中でない回の名札を `night_st{人数}`（例 `night_st3`）にして重ならないようにする（真ん中の人数の回の名前は今までどおり）。台帳の列は変えない（staff の列がある）
   - 並べる順は、少ない180回 → 多い180回が望ましい（朝までに終わらなくても、詰まりやすい少ない方が先に揃うように）。できなければ順はそのままでよい
   - 回す前に、queue が360回で、名前に重なりがなく、台帳の今までのフォルダ名とも重ならず、真ん中の人数の条件と普通でない混み具合の条件が入っていないことを確かめる。違えば回さずに報告

## B. 夜（360回）

```
python3 tools/night_runner.py --queue queue_staff.json --parallel 4 --night 20261107 --record-name 20261107_staff
```

- 夜の名前は 20261107。記録は night/20261107_staff/ に置く。オプションの名前が違えば、同じ意味になるように合わせる
- 同時に回す本数は4のまま。1回おおよそ4〜8分。スタッフ1人の回は長くなるかもしれないので、7〜9時間かかる見込み。時刻で止めず、並べた回が全部終わるまで回す
- 回している間は、ほかの作業をしない。Assets・tools・設定ファイルを開かない・変えない。Unity を開かない
- Ctrl+C で止めない。途中で止まっても、同じ夜を回し直さない（そのまま報告する）
- スタッフが少ない回は、全員が帰る前に打ち切られることがある。それは失敗として扱わず、そのまま記録する
- 終わったら queue_staff.json を作業フォルダに残さない
- judge_night.py は回してよい。基準（v5）は③⑦の普通・真ん中の人数にしかないので、今回の条件は「基準なし」になってよい。judge が今回の条件で止まっても、judge は直さずにその旨を報告する

## 変えないもの

- 店の回し方・人とロボットの動き・速さ・Stiffness などの物理の設定・同時に回す本数（N=4）
- 台帳の列（59列）と今までの行。今までの night/ と出力の記録
- night_runner.py・judge_night.py。make_queue.py は A-3 の追加だけ

## 報告

依頼箱の結果に加えて、claude_code_reports に 1つ書く（場所：~/Library/Mobile Documents/com~apple~CloudDocs/デスクトップ/ADAPT DESIGN/じぶんの/PixelstoMotors/デジタルツイン学習R2R2R/サービスロボット導入シミュレーション/unity/claude_code_reports/）。

**20261107_night_staff.txt**
- 始める前の確かめ5つの結果。写した params の比べ方と結果。作り直したなら cs 番号・build_id
- make_queue.py に足したもの（差分の全文）と、回の名前の付け方。前と同じ並びになることの確かめの結果
- runner_log のまとめ（completed の回数・失敗・止まった回・打ち切られた回・最長の実時間・夜全体の始まりと終わりの時刻）
- 台帳の行数（1032 → 1392 になるはず）と、先頭1032行の md5 が退避と同じか
- 全員が帰らなかった回の名前（原因の調べはしない）
- 店ごと × スタッフの人数ごと × 台数ごと（0・1・2台）に、種10個の中央値と最小・最大：入店待ち・そのうち席は空いているのに待った時間・料理の待ち・会計待ち・入れた組の数・ロボットが運んだ皿の割合・往復の数・30秒以上の止まり（1往復あたり）・動けなくなった（60秒。1往復あたり）・瞬間移動・打ち切り・卓を空けた・冷めた皿の割合・スタッフの手がふさがっている割合。試算 v2.9 の値（params の site_result）も並べる
- 同じ店の普通・真ん中の人数の夜の中央値も横に並べる（③⑦ 20261102・④ 20261030・⑤ 20261103・⑥ 20261104・② 20261105）。標準（待機場所へ戻る・すれ違い・cs）が今回と違う夜は、その違いを書く。並べる試算の値は v2.9（今回写した params の0〜17番の site_result）
- ロボットを1台増やしたとき（0→1・1→2）の向き（入店待ち・料理の待ち）が、種の過半数で試算と同じか逆か。店 × スタッフの人数ごとに
- スタッフ1人の回（④②）で、スタッフが何をしていた時間が長いか（timeline.csv の仕事ごとの人数を足したもの。案内・配膳・呼び出し・会計・片付け・ロボット救出・待機）。種10個の中央値
- judge.md ができたか（中身の判断はしない）
````

### 依頼32 の結果（依頼箱の報告）

11:41 に始まり、19:12 に終わりました（451分）。360回とも最後まで回り、失敗は0です。

```markdown
# 結果：20261030_32_スタッフの人数を広げて夜を回す

- 状態：完了
- 始めた時刻：2026-10-30 11:41
- 終わった時刻：2026-10-30 19:12（451分）
- 作業フォルダ：/Users/shimazueiichi/Robotics_UX/ServiceSim
- この続きを Claude Code で話すとき：作業フォルダで `claude --resume cdce3e4b-34ea-4913-8439-d5393057b561`

## Claude Code の報告

**やったこと**
- 始める前の確かめを5つ行い、5つとも合格でした（エディタは起動していない・鍵ファイルなし・台帳 1032 行で md5 は退避と同じ・保留 0・サイトは 90 件で v2.9・08db8a0d067c）。
- サイトの params を cp でそのまま写しました（cs:46）。前の写しと JSON で比べると、変わっていたのは次の3つだけでした。
  - meta と common の model（v2.8 → v2.9）
  - 0〜53 番の site_result の値（条件は同じ）
  - 54〜89 番の追加
- 実行ファイルを作り直しました。最初に作ったもの（cs:46）は、「試算の版 v2.8 を待っている」という確かめで、回し始める前に止まりました。依頼にはない変更ですが、SimParams.asset の expectModel を v2.8 → v2.9 に書き換えました（1行だけ・cs:47・コードには触っていません）。作り直した build_id は cs47_20261030_1147 です。実行ファイルが 90 件の条件を知っていることを確かめました。
- make_queue.py に `--staff few,many` を足しました（cs:48）。真ん中でない回の名札は `night_st{人数}` です。
  - 前の make_queue.py ＋前の params と、新しい方どうしで並びを作って比べました。何も付けない 60 回、--stores だけ各 30 回、--crowd、--conditions のどれも同じでした。違うのは params の場所と版の名前の欄だけです。
  - 足さずに古い make_queue.py で新しい params を使うと、60 回が 180 回に、30 回が 90 回に増えていました。
- 夜 20261107（360 回）を、スタッフが少ない 180 回 → 多い 180 回の順で回しました。そのあと queue_staff.json を消しました。

**結果**
- 11:48:48〜19:01:50（7時間13分）でした。
  - completed 360、失敗・止まった回・やり直しは 0 です。
  - 全員が帰らなかった回（打ち切られた回）は 0 です。スタッフ1人の回も、全部で全員が帰りました。
  - 最長の実時間は 9.3 分（④スタッフ1人・2台・種6）、平均は 4.7 分です。
- 台帳は 1032 → 1392 行になりました。先頭 1032 行の md5 は退避と同じです。
- スタッフが少ないと、どの店でも入店待ちが試算より長くなりました。
  - ④1人・2台：70.97 分（試算 34.94）
  - ③3人・2台：13.07 分（試算 4.00）
- スタッフが多いと、③⑦⑤では会計待ちが試算より長くなりました。
  - ⑤5人・0台：12.75 分（試算 10.00）
- ロボットを1台増やしたときの向きが、種の過半数で試算と逆になったのは6か所です。
  - ④少ない：1→2台の料理の待ち（10 種中 7）
  - ④多い：0→1台の入店待ち（10 種中 10）
  - ④多い：1→2台の入店待ち（10 種中 10）
  - ④多い：1→2台の料理の待ち（10 種中 8）
  - ⑤少ない：1→2台の入店待ち（10 種中 6）
  - ②少ない：1→2台の料理の待ち（10 種中 6）
- スタッフ1人の回（④②）では、どの台数でも片付けがいちばん長くなりました。
  - 例：④0台は片付け 108 分＞会計 84 分＞配膳 68 分
  - 2番目は会計です。ただし④2台だけは案内でした。
- judge.md はできました。360 回とも「基準なし」です。
- 気づいたこと（原因は調べていません）：17:31〜17:42 の 11 分間、runner_log に何も書かれていません。その時間に回っていた1回（⑤5人・2台・種5）は、runs.csv の実時間が 6.3 分なのに、台帳の wall_seconds は 17.5 分になっています。結果は completed で、全員が帰りました。
- 表（店 × スタッフの人数 × 台数ごとに、種10個の中央値［最小〜最大］・試算 v2.9・普通の夜の中央値）と、向きの内訳は報告ファイルの7章にあります。

**変えたファイル**
- `Assets/ServiceSim/Experiment/serving-robot-params.json`（cs:46）
- `Assets/ServiceSim/Experiment/SimParams.asset` の expectModel 1行（cs:47）
- `tools/make_queue.py`（cs:48。--staff の追加だけ）
- `unity/site_copy_08db8a0d067c_d73b98d/`（新しい控え）
- `claude_code_reports/20261107_night_staff.txt` と `20261107_night_staff_files/`（集計に使ったもの・表・差分）
- 台帳には 360 行を追記しました。記録は `night/20261107_staff/` にあります。

**決めてほしいこと**
- 試算の版の確かめ（expectModel）を v2.9 に書き換えてよかったか。依頼では「Unity は変えない・v2.9 で回す」と決まっていたので書き換えましたが、もともとは版が違えば回さないための確かめです。よくなければ、cs:47 を戻して、今夜の 360 回をどう扱うかを決めてください。
- SimParams.asset の fetchedAt と sourceUrl の欄は、前から古いまま（2026-10-25・site_copy_v28）です。今回は変えていません。直すかどうかを決めてください。
```

### Claude Code の報告 20261107_night_staff.txt の全文

```text
====================================================================
6店のスタッフの人数を「少ない・多い」に広げた夜 360 回
依頼：20261030_32_スタッフの人数を広げて夜を回す.md
夜の名前 20261107　記録 night/20261107_staff/　回した日時 2026-10-30 11:48〜19:01
build_id cs47_20261030_1147（ServiceSim/cs:47・保留 0）　make_queue.py の追加は cs:48
====================================================================

結論

  ・360 回とも completed・全員帰った。失敗 0・止まった回 0・やり直し 0・回ごと打ち切られた回 0。
    最長の実時間 9.3 分（④スタッフ1人・2台・種6）。
  ・台帳 1032 → 1392 行（360 行足した。追記だけ）。先頭 1032 行の md5 は退避と同じ。列は 59 列のまま。
  ・依頼にない変更を1つした：実行ファイルが「試算の版 v2.8 を待っている」ため v2.9 の params では回し始める前に止まった。
    SimParams.asset の expectModel を v2.8 → v2.9 にした（1行だけ。cs:47）。コードは変えていない。下の 2 章と「決めてほしいこと」に書いた。
  ・スタッフが少ないと、どの店でも入店待ちが試算より長い（例 ④1人 2台 70.97 分／試算 34.94、③3人 2台 13.07／試算 4.00）。
    多いと、③⑦⑤の会計待ちが試算より長い（例 ⑤5人 0台 12.75 分／試算 10.00、③5人 0台 9.30／試算 5.53）。原因は調べていない。
  ・ロボットを1台増やしたときの向きが、種の過半数で試算と逆になったのは6か所：
    ④少ない 1→2台の料理の待ち（逆 7/10）・④多い 0→1台の入店待ち（逆 10/10）・④多い 1→2台の入店待ち（逆 10/10）・
    ④多い 1→2台の料理の待ち（逆 8/10）・⑤少ない 1→2台の入店待ち（逆 6/10）・②少ない 1→2台の料理の待ち（逆 6/10）。
  ・スタッフ1人の回（④②）では、どの台数でも「片付け」がいちばん長く、次が「会計」（④2台だけ 2番目が「案内」）。
  ・judge.md はできた（360 回とも「基準なし」。依頼のとおり）。
  ・気づいたこと（調べていない）：17:31〜17:42 の 11 分間、runner_log に何も書かれていない。その間に回っていた
    20261107_night_st5_cs47_fam_p3_r2_s5_passon_sbret は、runs.csv の実時間 6.3 分に対して台帳の wall_seconds が 1049.8 秒（17.5 分）。
    結果は completed・全員帰った。


====================================================================
1. 始める前の確かめ（5つとも合格。2026-10-30 11:40 ごろ）
====================================================================

  1. Unity エディタ：起動していない（Unity Hub だけが起動していた）
  2. /Volumes/KIOXIA：マウントされている。unity_ledger_v1.lock：なし
  3. 台帳 unity_ledger_v1.csv：1032 行・md5 52e433713d4f7d41dfa8ccfb889492cd（退避と同じ）
  4. ServiceSim の保留：0（cs:45 head）
  5. 公開中の serving-robot-params.json：unity_conditions 90 件・meta.model v2.9・meta.layout_generation 08db8a0d067c（1回目の取得で合った。11:42）


====================================================================
2. 写した params と作り直し
====================================================================

  写し元：https://pixelstomotors.com/sim/serving-robot-params.json（curl で取得）
    控え：unity/site_copy_08db8a0d067c_d73b98d/（params と README.txt。前の控えは変えていない）
  比べ方：前の写し（cs:45 の Assets/ServiceSim/Experiment/serving-robot-params.json。md5 64845ccf6c17ee50e39723416a18e87d）と JSON として読んで比べた
    meta：model だけ違う（v2.8 → v2.9）
    common：model だけ違う（{value v2.8} → {value v2.9}。role site_only のまま）
    unity_rules・stores：同じ
    unity_conditions：54 件 → 90 件。0〜53 番は condition の並びも中身も同じ。site_result はキーが同じで値だけ違う（54 件とも値が違う）。
      54〜89 番は店ごとにスタッフ 少ない 0・1・2台 → 多い 0・1・2台 の6条件（③3・5／⑦3・5／④1・3／⑤3・5／⑥2・4／②1・3。
      来客は普通 ③⑦42・④28・⑤46・⑥38・②19。registers 1・mode serve・trays 0台1／1・2台3）
  cp でそのまま写した（md5 978b6878b29957b11e5b0928838a1447）。店の形のファイルは写し直していない。
  check-in：cs:46（params 1 ファイルだけ）

  実行ファイル：params を TextAsset として中に持つ作りなので、今までと同じコマンド（BuildHeadless.Build・-batchmode）で作り直した
    1回目 build_id cs46_20261030_1143：Build Success・error CS 0。ところが知らない条件の名前で起動して確かめると、
      「試算の版が違います: meta.model v2.9 / 待っている版 v2.8（写し直してください）」で回し始める前に止まった。
      待っている版は SimParams.asset の expectModel: v2.8（依頼 v10 で入れた見張り）。
    依頼は「v2.9 を写して Unity で回す・Unity は変えない」と決めているので、コードには触らず、
      Assets/ServiceSim/Experiment/SimParams.asset の expectModel を v2.8 → v2.9 にした（差はこの1行だけ。cs:47）。
      fetchedAt・sourceUrl の欄は前から古いまま（2026-10-25・site_copy_v28）で、変えていない。
    2回目 build_id cs47_20261030_1147 / unity_cs ServiceSim/cs:47 / pending_changes 空 / Build Finished, Result: Success・error CS 0
      確かめ：知らない条件の名前で起動し（台帳にもフォルダにも何も書かない道。台帳は 1032 行のまま）、
      実行ファイルが知っている条件が 90 件（54〜89 番の名前 fam_p1_s3_r0_a42 … fam_p0_s3_r2_a19 を含む）であることを見た
  保留は check-in のあと 0、夜のあとも 0。


====================================================================
3. make_queue.py に足したもの（cs:48）と回の名前
====================================================================

  足したもの：--staff（few / mid / many をカンマ区切り。挙げた順にスタッフの人数ごとにまとめて並べ、その中は今までどおり種ごと）。
    店ごとにスタッフの人数の少ない順で 少ない few・真ん中 mid・多い many とした（--crowd と同じ考え方。1通りしかない店は真ん中）。
    --staff を付けないときは真ん中だけ。--crowd も挙げたときは、混み具合のまとまりの中をさらにスタッフの人数でまとめる。
  回の名前：出力フォルダ名は {夜}_{名札}_{cs}_{店}_r{台数}_s{種}… でスタッフの人数が入らず、少ない・多いで名前が重なるので、
    真ん中でない回の名札を night_st{人数} にした（混み具合も普通でない回は night_a{来客}_st{人数}。今回は無い）。
    例 20261107_night_st3_cs47_fam_p1_r0_s0_passon_sbret。真ん中の回の名前は今までどおり。台帳の列は変えていない。
  変わらないことの確かめ：前の make_queue.py ＋前の params（54件・v2.8）と、新しい make_queue.py ＋新しい params（90件・v2.9）で
    queue を作って比べた（params_source と params_model（v2.8 / v2.9）以外すべて同じ）
    何も付けない：60 回で同じ／--stores fam_p1・fam_p5・fam_p2・fam_p3・fam_p4・fam_p0 をそれぞれ1つ：30 回で同じ／
    --stores 6店：180 回で同じ／--stores 6店 --crowd busy,quiet：360 回で同じ／--crowd quiet,normal,busy：180 回で同じ／
    --conditions を付けた場合：同じ／--pass-by off --pass-by-extra：70 回で同じ
    （足さずに前の make_queue.py で新しい params を使うと、何も付けない 60 → 180 回、--stores fam_p2 だけ 30 → 90 回に増えていた）
  回す前の確かめ：360 回・名前の重なり 0・台帳の今までのフォルダ名との重なり 0・今までのフォルダとの重なり 0・
    真ん中の人数の条件 0・普通でない混み具合の条件 0・36 条件 × 種 10・
    並べた順は少ない 180 回 → 多い 180 回・360 回ともすれ違い入・待機場所へ戻る入・案B切
  使ったコマンド
    python3 tools/make_queue.py --stores fam_p1,fam_p5,fam_p2,fam_p3,fam_p4,fam_p0 --staff few,many --out queue_staff.json
    python3 tools/night_runner.py --queue queue_staff.json --parallel 4 --night 20261107 --record-name 20261107_staff
  終わったあと queue_staff.json は消した（記録の queue.json は night/20261107_staff/ に残っている）。
  気づいたこと：make_queue の表示「種0 の全36条件」は、スタッフの人数ごとにまとめたときは実際は 18 条件ずつ（表示だけ。並びは正しい。前回の --crowd と同じ）。

  差分の全文
--- /tmp/staff_dl/make_queue.orig.py	2026-10-30 11:42:37
+++ tools/make_queue.py	2026-10-30 11:47:54
@@ -48,6 +48,18 @@
   回ごとの名札を {--label}_a{来客/時}（例 night_a54）にする（普通の回の名前は今までどおり）。
   --conditions を付けたときは、その名前の条件をそのまま使う（--crowd の既定では絞らない）。
 
+スタッフの人数（2026-10-30。params の unity_conditions が 90 件になり、店ごとにスタッフの人数が3つになった）:
+  --crowd と同じ考え方で、店ごとにスタッフの人数（staff）の違う値を並べ、
+  いちばん少ないものを「少ない few」、真ん中を「真ん中 mid」、いちばん多いものを「多い many」とする
+  （1つしかない店はそれが真ん中）。
+  --staff を付けないときは **真ん中だけ**（今までと同じ。何も付けない ③⑦ の60回・--stores だけの 30回・
+  --crowd だけの並びは変わらない）。
+  --staff few,many のように挙げると、挙げた順にスタッフの人数ごとにまとめて並べる（その中は今までどおり種ごと。
+  --crowd も挙げたときは、混み具合ごとのまとまりの中を、さらにスタッフの人数ごとにまとめる）。
+  真ん中でない回は、回ごとの名札を {--label}_st{スタッフ}（例 night_st3）にする
+  （混み具合も普通でない回は {--label}_a{来客/時}_st{スタッフ}。真ん中の回の名前は今までどおり）。
+  --conditions を付けたときは、その名前の条件をそのまま使う（--staff の既定では絞らない）。
+
 使い方（プロジェクトの中で）
   # 60回（すれ違い入・待機場所へ戻る入・案B切。2026-10-28 から標準）
   python3 tools/make_queue.py --out /tmp/queue.json
@@ -142,6 +154,28 @@
     return out
 
 
+STAFFS = ('few', 'mid', 'many')
+
+
+def staff_of(conds):
+    """条件の名前 → スタッフの人数（few / mid / many）。店ごとにスタッフの人数の少ない順で決める（2026-10-30）"""
+    nums = {}
+    for c in conds:
+        nums.setdefault(c['store'], set()).add(int(c['staff']))
+    out = {}
+    for c in conds:
+        r = sorted(nums[c['store']])
+        v = int(c['staff'])
+        if len(r) == 1:
+            out[condition_id(c)] = 'mid'
+        elif len(r) == 3:
+            out[condition_id(c)] = STAFFS[r.index(v)]
+        else:
+            sys.exit('%s のスタッフの人数が %d 通り（%s）で、少ない・真ん中・多いに分けられません'
+                     % (c['store'], len(r), ','.join(str(x) for x in r)))
+    return out
+
+
 def rule_value(rules, key):
     """unity_rules の値（role=site_rule のものだけ。Unity の SimParams.UnityRule と同じ）。
     無ければ止める（既定を手で埋めない）"""
@@ -164,6 +198,9 @@
     ap.add_argument('--crowd', default='',
                     help='混み具合をカンマ区切りで選ぶ（quiet / normal / busy。挙げた順に並べる）。'
                          '既定は normal だけ（--conditions を付けたときは絞らない）')
+    ap.add_argument('--staff', default='',
+                    help='スタッフの人数をカンマ区切りで選ぶ（few / mid / many。挙げた順に並べる）。'
+                         '既定は mid だけ（--conditions を付けたときは絞らない）')
     ap.add_argument('--label', default='night', help='出力フォルダに入る名札')
     ap.add_argument('--pass-by-extra', default='',
                     help='すれ違い「入」でも回す条件（カンマ区切り）。'
@@ -207,6 +244,15 @@
         sys.exit('--crowd に同じ混み具合が2回あります: %s' % a.crowd)
     if not crowds and not want:
         crowds = ['normal']       # 付けないときは普通だけ（今までと同じ並び）
+    staff = staff_of(conds)       # 店を絞る前の全条件で決める（2026-10-30）
+    staffs = [s.strip() for s in a.staff.split(',') if s.strip()]
+    bad = [s for s in staffs if s not in STAFFS]
+    if bad:
+        sys.exit('知らないスタッフの人数です: %s\n  使えるスタッフの人数: %s' % (', '.join(bad), ', '.join(STAFFS)))
+    if len(set(staffs)) != len(staffs):
+        sys.exit('--staff に同じスタッフの人数が2回あります: %s' % a.staff)
+    if not staffs and not want:
+        staffs = ['mid']          # 付けないときは真ん中だけ（今までと同じ並び）
     stores = [s.strip() for s in a.stores.split(',') if s.strip()]
     if stores:
         known_stores = []
@@ -229,6 +275,8 @@
         conds = [c for c in conds if condition_id(c) in want]
     if crowds:
         conds = [c for c in conds if crowd[condition_id(c)] in crowds]
+    if staffs:
+        conds = [c for c in conds if staff[condition_id(c)] in staffs]
 
     extra = [s.strip() for s in a.pass_by_extra.split(',') if s.strip()]
     if extra and a.pass_by == 'on':
@@ -261,6 +309,9 @@
         # 普通でない回は名札に来客のペースを入れる（出力フォルダ名がぶつからないように。2026-10-29）
         if crowd[condition_id(c)] != 'normal':
             r['label'] = '%s_a%d' % (a.label, int(c['arrivals_per_h']))
+        # 真ん中でない回は名札にスタッフの人数を入れる（同じ理由。2026-10-30）
+        if staff[condition_id(c)] != 'mid':
+            r['label'] = '%s_st%d' % (r.get('label', a.label), int(c['staff']))
         return r
 
     # 1種ぶんの「条件の並び」を先に作る。
@@ -289,14 +340,20 @@
     #   どの条件も同じ扱いになる。
     #   --crowd を挙げたときは、挙げた順に混み具合ごとにまとめ、その中を種ごとに並べる
     #   （例 busy,quiet：混んでいるを先に揃える。2026-10-29）
+    #   --staff を挙げたときも同じく、挙げた順にスタッフの人数ごとにまとめる
+    #   （例 few,many：詰まりやすい少ないを先に揃える。2026-10-30）
     groups = [crowds] if not a.crowd else [[g] for g in crowds]
+    sgroups = [staffs] if not a.staff else [[g] for g in staffs]
     runs = []
     for g in groups:
-        for s in seeds:
-            for c, pb in units:
-                if crowds and crowd[condition_id(c)] not in g:
-                    continue
-                runs.append(make(c, s, pb))
+        for sg in sgroups:
+            for s in seeds:
+                for c, pb in units:
+                    if crowds and crowd[condition_id(c)] not in g:
+                        continue
+                    if staffs and staff[condition_id(c)] not in sg:
+                        continue
+                    runs.append(make(c, s, pb))
 
     q = {
         'schema': 'servicesim-night-queue/0.1',
@@ -320,6 +377,8 @@
     }
     if a.crowd:
         q['crowd'] = crowds          # 混み具合（並べた順。2026-10-29）
+    if a.staff:
+        q['staff'] = staffs          # スタッフの人数（並べた順。2026-10-30）
 
     out_dir = os.path.dirname(os.path.abspath(a.out))
     if out_dir and not os.path.isdir(out_dir):
@@ -342,6 +401,8 @@
                                        else '切（往復を終えた台は受け渡し口の点で止まる）', src[standby_from]))
     if a.crowd:
         print('  混み具合: %s の順（普通でない回の名札は %s_a{来客/時}）' % (' → '.join(crowds), a.label))
+    if a.staff:
+        print('  スタッフの人数: %s の順（真ん中でない回の名札は %s_st{スタッフ}）' % (' → '.join(staffs), a.label))
     for cid in q['conditions']:
         mark = '（＋すれ違い入も %d 回）' % len(seeds) if cid in extra else ''
         print('    %s%s' % (cid, mark))


====================================================================
4. runner_log のまとめ
====================================================================

  始まり 2026-10-30 11:48:48　終わり 2026-10-30 19:01:50（7 時間 13 分）　runner の終了コード 0
  completed 360 / 失敗 0 / 止まった（stopped）0 / やり直し 0（tryno はすべて 1）/ 終了コード すべて 0
  実時間（runs.csv）：最短 2.7 分・平均 4.7 分・最長 9.3 分（20261107_night_st1_cs47_fam_p2_r2_s6_passon_sbret・560 秒。上限 90 分）
    ほかに長かったのも ④スタッフ1人（2台 種9 9.3 分・0台 種2 8.3 分）
  回ごと打ち切られた回（全員が帰る前に止まった回）：0。スタッフ1人の回も 60 回とも全員帰った
  （参考）往復の打ち切り（timeouts 列）が1つ以上あった回は 126 回・合わせて 604
  （参考）17:31:06〜17:42:15 の 11 分、runner_log に何も書かれていない。上の結論に書いた1回の wall_seconds の食い違いと同じ時間帯。調べていない。


====================================================================
5. 台帳
====================================================================

  行数：1032 → 1392（360 行足した。360 行とも unity_cs ServiceSim/cs:47・layout_generation 08db8a0d067c・params_model v2.9・completed）
  先頭 1032 行の md5：52e433713d4f7d41dfa8ccfb889492cd（退避と同じ）
  列は 59 列のまま。鍵ファイルは残っていない


====================================================================
6. 全員が帰らなかった回
====================================================================

  なし（360 回とも全員帰った）


====================================================================
7. 表・向き・スタッフ1人の仕事
====================================================================

  表の各欄：Unity の種10個の中央値［最小〜最大］／試算 v2.9（今回写した params の site_result。種によらず同じ値）／同じ店の普通・真ん中の人数の夜の中央値
    「（真ん中の試算 v2.9）」の行は、普通の夜と同じ条件の v2.9 の値（params 0〜17 番の site_result）
    単位は分。割合は 0〜1。「席は空いているのに待った」は judge と同じ staff_wait（片付け待ち＋案内待ち）。blocked_wait も下の行に並べた
    入れた組の数は summary.json の site_metrics.groups、試算は site_result.groups
    30 秒以上の止まりは stops.csv の duration_s が 30 秒以上のもの（judge と同じ）。動けなくなった（60秒）は台帳の stuck_count
    スタッフの手がふさがっている割合は site_metrics.staff_util（試算は site_result.staff_util）
  普通の夜：③⑦ 20261102（cs:34）・④ 20261030（cs:29）・⑤ 20261103（cs:36）・⑥ 20261104（cs:38）・② 20261105（cs:40）
    標準の違い：すれ違いはどの夜も入。待機場所へ戻るは ④ 20261030 だけ切（_sbret なし）、ほかは入。案B はどれも切。
    試算の版は普通の夜はどれも v2.8、今回は v2.9（表に並べた試算の値はすべて v2.9）。
    cs は今回 cs:47。cs:40 のあとに入ったのは、録画のしくみ（cs:41〜43。-ssRecord のときだけ動く）・params の写し（cs:44・cs:46）・
    expectModel の1行（cs:47）。店の回し方・人とロボットの動きのコードは cs:40 から変わっていない
  向き：judge と同じ数え方（5%・0.2 分より小さい変化は「変わらない」）。試算の向きは v2.9 の値で決めた。
    試算が「変わらない」ところは向きを比べず、Unity の増減の数だけ書いた
  スタッフ1人の仕事：timeline.csv（60 秒ごと）の staff_idle・staff_guide・staff_serve・staff_call・staff_pay・staff_clear・staff_rescue の
    人数を足して分にしたもの（待機・案内・配膳・呼び出し・会計・片付け・ロボット救出）
  集計に使ったもの：20261107_night_staff_files/analyze.py（読むだけ。台帳・出力には書かない）。表は同じフォルダの tables.txt と同じ

  表の各欄：Unity の種10個の中央値［最小〜最大］／試算 v2.9（params の site_result）／同じ店の普通・真ん中の人数の夜の中央値（試算 v2.9 の真ん中の値は「真ん中の試算」の行）

■ ③ スタッフ少ない（3 人。真ん中は 4 人・来客 42 組/時）
  入店待ち                       0台 14.79［3.33〜31.13］／10.64／4.09　1台 9.44［1.79〜23.50］／5.62／5.00　2台 13.07［1.72〜26.16］／4.00／3.99
  　（真ん中の試算 v2.9）             0台 4.09　1台 1.68　2台 1.13
  うち席は空いているのに待った             0台 12.96［2.13〜23.05］／9.86／2.88　1台 7.54［0.59〜17.24］／4.37／3.30　2台 11.19［0.48〜17.79］／3.09／1.68
  　（真ん中の試算 v2.9）             0台 2.66　1台 0.49　2台 0.39
  （片付け待ちだけ blocked）          0台 12.26［1.46〜22.47］／9.29／2.48　1台 7.14［0.00〜16.78］／3.91／2.90　2台 10.63［0.00〜17.41］／2.64／1.28
  　（真ん中の試算 v2.9）             0台 2.29　1台 0.36　2台 0.30
  料理の待ち                      0台 1.27［1.16〜1.50］／0.88／0.98　1台 2.30［2.10〜2.74］／2.14／2.48　2台 1.69［1.26〜2.66］／0.92／1.95
  　（真ん中の試算 v2.9）             0台 0.63　1台 1.97　2台 0.96
  会計待ち                       0台 3.62［2.27〜4.72］／3.17／4.45　1台 4.02［2.45〜6.40］／4.01／6.13　2台 4.34［2.24〜6.00］／4.95／7.08
  　（真ん中の試算 v2.9）             0台 4.80　1台 5.64　2台 6.58
  入れた組の数                     0台 82［64〜102］／82.7／82　1台 82［64〜102］／83.5／82　2台 82［64〜102］／84.3／82
  　（真ん中の試算 v2.9）             0台 85.5　1台 82.3　2台 83.8
  ロボットが運んだ皿の割合               0台 0.000［0.000〜0.000］／0.000／0.000　1台 0.789［0.723〜0.806］／0.783／0.706　2台 0.909［0.811〜0.988］／0.995／0.832
  　（真ん中の試算 v2.9）             0台 0.000　1台 0.727　2台 0.993
  往復の数                       0台 0［0〜0］／—／0　1台 79［65〜99］／—／65.5　2台 140.5［116〜179］／—／119.5
  30秒以上の止まり                  0台 0［0〜0］／—／0　1台 7.5［4〜13］／—／6　2台 22［11〜39］／—／24.5
  （1往復あたり）                   0台 0.000［0.000〜0.000］／—／0.000　1台 0.103［0.040〜0.135］／—／0.083　2台 0.162［0.066〜0.255］／—／0.173
  動けなくなった（60秒）               0台 0［0〜0］／—／0　1台 3［2〜8］／—／3.5　2台 13.5［3〜31］／—／18
  （1往復あたり）                   0台 0.000［0.000〜0.000］／—／0.000　1台 0.043［0.020〜0.083］／—／0.050　2台 0.103［0.018〜0.203］／—／0.127
  瞬間移動                       0台 8［7〜10］／—／10.5　1台 51［27〜65］／—／49　2台 62.5［38〜73］／—／60
  打ち切り                       0台 0［0〜0］／—／0　1台 0［0〜0］／—／0　2台 3［0〜13］／—／4.5
  卓を空けた                      0台 0［0〜0］／—／0　1台 0［0〜2］／—／0　2台 0［0〜1］／—／0
  冷めた皿の割合                    0台 0.031［0.000〜0.115］／0.006／0.000　1台 0.268［0.192〜0.340］／0.194／0.286　2台 0.134［0.062〜0.283］／0.013／0.163
  　（真ん中の試算 v2.9）             0台 0.000　1台 0.092　2台 0.009
  スタッフの手がふさがっている割合           0台 0.875［0.792〜0.916］／0.850／0.767　1台 0.828［0.732〜0.896］／0.782／0.726　2台 0.839［0.731〜0.902］／0.772／0.718
  　（真ん中の試算 v2.9）             0台 0.743　1台 0.622　2台 0.596
  （参考）あきらめた                  0台 8［5〜16］／—／12.5　1台 36.5［17〜64］／—／45.5　2台 48.5［24〜66］／—／51.5
  回の数 0台 10・1台 10・2台 10（普通の夜 10・10・10）

■ ③ スタッフ多い（5 人。真ん中は 4 人・来客 42 組/時）
  入店待ち                       0台 1.85［1.27〜8.96］／1.04／4.09　1台 2.61［1.31〜10.41］／1.08／5.00　2台 3.06［1.34〜9.67］／0.92／3.99
  　（真ん中の試算 v2.9）             0台 4.09　1台 1.68　2台 1.13
  うち席は空いているのに待った             0台 0.32［0.07〜1.69］／0.31／2.88　1台 0.75［0.07〜3.59］／0.30／3.30　2台 1.00［0.08〜2.32］／0.27／1.68
  　（真ん中の試算 v2.9）             0台 2.66　1台 0.49　2台 0.39
  （片付け待ちだけ blocked）          0台 0.21［0.00〜1.60］／0.23／2.48　1台 0.65［0.00〜3.27］／0.28／2.90　2台 0.88［0.00〜2.18］／0.26／1.28
  　（真ん中の試算 v2.9）             0台 2.29　1台 0.36　2台 0.30
  料理の待ち                      0台 0.56［0.50〜0.76］／0.27／0.98　1台 2.16［1.93〜2.83］／1.87／2.48　2台 1.61［1.29〜2.20］／0.96／1.95
  　（真ん中の試算 v2.9）             0台 0.63　1台 1.97　2台 0.96
  会計待ち                       0台 9.30［2.78〜13.02］／5.53／4.45　1台 10.32［3.21〜15.40］／6.09／6.13　2台 10.86［4.24〜14.38］／6.33／7.08
  　（真ん中の試算 v2.9）             0台 4.80　1台 5.64　2台 6.58
  入れた組の数                     0台 82［64〜102］／82／82　1台 82［64〜102］／82.6／82　2台 82［64〜102］／83.1／82
  　（真ん中の試算 v2.9）             0台 85.5　1台 82.3　2台 83.8
  ロボットが運んだ皿の割合               0台 0.000［0.000〜0.000］／0.000／0.000　1台 0.662［0.597〜0.775］／0.717／0.706　2台 0.898［0.809〜0.956］／0.990／0.832
  　（真ん中の試算 v2.9）             0台 0.000　1台 0.727　2台 0.993
  往復の数                       0台 0［0〜0］／—／0　1台 67.5［62〜74］／—／65.5　2台 129［103〜154］／—／119.5
  30秒以上の止まり                  0台 0［0〜0］／—／0　1台 6.5［1〜15］／—／6　2台 22.5［9〜51］／—／24.5
  （1往復あたり）                   0台 0.000［0.000〜0.000］／—／0.000　1台 0.100［0.014〜0.221］／—／0.083　2台 0.164［0.076〜0.495］／—／0.173
  動けなくなった（60秒）               0台 0［0〜0］／—／0　1台 3.5［1〜13］／—／3.5　2台 10.5［6〜43］／—／18
  （1往復あたり）                   0台 0.000［0.000〜0.000］／—／0.000　1台 0.056［0.014〜0.191］／—／0.050　2台 0.078［0.039〜0.417］／—／0.127
  瞬間移動                       0台 12.5［9〜19］／—／10.5　1台 43.5［33〜56］／—／49　2台 68.5［39〜96］／—／60
  打ち切り                       0台 0［0〜0］／—／0　1台 0［0〜1］／—／0　2台 1.5［0〜6］／—／4.5
  卓を空けた                      0台 0［0〜0］／—／0　1台 0［0〜1］／—／0　2台 0［0〜1］／—／0
  冷めた皿の割合                    0台 0.000［0.000〜0.000］／0.000／0.000　1台 0.146［0.087〜0.288］／0.060／0.286　2台 0.110［0.037〜0.182］／0.009／0.163
  　（真ん中の試算 v2.9）             0台 0.000　1台 0.092　2台 0.009
  スタッフの手がふさがっている割合           0台 0.623［0.533〜0.680］／0.586／0.767　1台 0.559［0.485〜0.642］／0.502／0.726　2台 0.575［0.485〜0.627］／0.475／0.718
  　（真ん中の試算 v2.9）             0台 0.743　1台 0.622　2台 0.596
  （参考）あきらめた                  0台 14.5［8〜26］／—／12.5　1台 46.5［20〜76］／—／45.5　2台 62.5［33〜102］／—／51.5
  回の数 0台 10・1台 10・2台 10（普通の夜 10・10・10）

■ ⑦ スタッフ少ない（3 人。真ん中は 4 人・来客 42 組/時）
  入店待ち                       0台 14.87［3.46〜30.19］／12.02／4.49　1台 12.27［1.77〜26.61］／6.80／3.22　2台 10.18［1.90〜22.14］／4.15／3.56
  　（真ん中の試算 v2.9）             0台 3.08　1台 1.58　2台 1.60
  うち席は空いているのに待った             0台 13.08［2.28〜22.89］／11.16／3.27　1台 10.96［0.57〜19.81］／5.23／1.47　2台 8.72［0.71〜14.31］／2.96／1.66
  　（真ん中の試算 v2.9）             0台 2.13　1台 0.54　2台 0.47
  （片付け待ちだけ blocked）          0台 12.30［1.63〜22.27］／10.58／2.85　1台 10.56［0.00〜19.46］／4.75／1.09　2台 8.33［0.00〜13.88］／2.51／1.23
  　（真ん中の試算 v2.9）             0台 1.77　1台 0.41　2台 0.37
  料理の待ち                      0台 1.29［1.17〜1.46］／0.90／0.96　1台 2.36［2.15〜2.63］／2.20／2.51　2台 1.59［1.25〜3.81］／0.94／1.61
  　（真ん中の試算 v2.9）             0台 0.63　1台 2.01　2台 1.01
  会計待ち                       0台 3.85［2.20〜4.68］／3.35／4.40　1台 4.72［2.38〜5.58］／3.77／5.12　2台 4.12［2.46〜6.26］／4.62／7.18
  　（真ん中の試算 v2.9）             0台 4.86　1台 5.82　2台 6.60
  入れた組の数                     0台 82［64〜102］／83.2／82　1台 82［64〜102］／85.3／82　2台 82［64〜102］／82.2／82
  　（真ん中の試算 v2.9）             0台 84.2　1台 83.3　2台 84.9
  ロボットが運んだ皿の割合               0台 0.000［0.000〜0.000］／0.000／0.000　1台 0.774［0.719〜0.831］／0.778／0.669　2台 0.918［0.638〜0.981］／0.993／0.916
  　（真ん中の試算 v2.9）             0台 0.000　1台 0.716　2台 0.989
  往復の数                       0台 0［0〜0］／—／0　1台 81.5［64〜98］／—／67.5　2台 137.5［95〜185］／—／124
  30秒以上の止まり                  0台 0［0〜0］／—／0　1台 7.5［4〜19］／—／8　2台 19.5［5〜24］／—／26.5
  （1往復あたり）                   0台 0.000［0.000〜0.000］／—／0.000　1台 0.092［0.049〜0.213］／—／0.127　2台 0.116［0.053〜0.168］／—／0.197
  動けなくなった（60秒）               0台 0［0〜0］／—／0　1台 4.5［2〜11］／—／5.5　2台 9.5［2〜14］／—／16.5
  （1往復あたり）                   0台 0.000［0.000〜0.000］／—／0.000　1台 0.054［0.025〜0.124］／—／0.077　2台 0.067［0.021〜0.105］／—／0.124
  瞬間移動                       0台 10［7〜21］／—／13　1台 44.5［37〜71］／—／48.5　2台 56［36〜73］／—／62.5
  打ち切り                       0台 0［0〜0］／—／0　1台 0［0〜1］／—／0　2台 2［0〜17］／—／3.5
  卓を空けた                      0台 0［0〜0］／—／0　1台 0［0〜1］／—／0　2台 0［0〜3］／—／0
  冷めた皿の割合                    0台 0.015［0.000〜0.077］／0.009／0.000　1台 0.280［0.194〜0.368］／0.211／0.328　2台 0.151［0.049〜0.352］／0.013／0.117
  　（真ん中の試算 v2.9）             0台 0.000　1台 0.103　2台 0.013
  スタッフの手がふさがっている割合           0台 0.879［0.797〜0.915］／0.859／0.774　1台 0.827［0.760〜0.878］／0.796／0.739　2台 0.826［0.793〜0.877］／0.767／0.694
  　（真ん中の試算 v2.9）             0台 0.741　1台 0.635　2台 0.602
  （参考）あきらめた                  0台 8［6〜16］／—／13　1台 37［24〜71］／—／40.5　2台 50［28〜61］／—／54.5
  回の数 0台 10・1台 10・2台 10（普通の夜 10・10・10）

■ ⑦ スタッフ多い（5 人。真ん中は 4 人・来客 42 組/時）
  入店待ち                       0台 1.86［1.27〜8.64］／1.44／4.49　1台 2.41［1.27〜10.18］／1.67／3.22　2台 2.70［1.28〜10.20］／1.34／3.56
  　（真ん中の試算 v2.9）             0台 3.08　1台 1.58　2台 1.60
  うち席は空いているのに待った             0台 0.36［0.07〜1.97］／0.44／3.27　1台 0.71［0.06〜2.19］／0.39／1.47　2台 0.56［0.06〜3.65］／0.33／1.66
  　（真ん中の試算 v2.9）             0台 2.13　1台 0.54　2台 0.47
  （片付け待ちだけ blocked）          0台 0.24［0.00〜1.76］／0.37／2.85　1台 0.58［0.00〜2.04］／0.36／1.09　2台 0.42［0.00〜3.40］／0.31／1.23
  　（真ん中の試算 v2.9）             0台 1.77　1台 0.41　2台 0.37
  料理の待ち                      0台 0.59［0.51〜0.71］／0.27／0.96　1台 2.20［1.88〜2.63］／1.91／2.51　2台 1.45［1.16〜2.50］／0.99／1.61
  　（真ん中の試算 v2.9）             0台 0.63　1台 2.01　2台 1.01
  会計待ち                       0台 9.08［3.14〜13.21］／6.46／4.40　1台 10.05［2.81〜14.31］／6.29／5.12　2台 11.12［3.05〜13.67］／6.49／7.18
  　（真ん中の試算 v2.9）             0台 4.86　1台 5.82　2台 6.60
  入れた組の数                     0台 82［64〜102］／83.4／82　1台 82［64〜102］／84.7／82　2台 82［64〜102］／83.8／82
  　（真ん中の試算 v2.9）             0台 84.2　1台 83.3　2台 84.9
  ロボットが運んだ皿の割合               0台 0.000［0.000〜0.000］／0.000／0.000　1台 0.651［0.570〜0.781］／0.698／0.669　2台 0.906［0.670〜0.969］／0.990／0.916
  　（真ん中の試算 v2.9）             0台 0.000　1台 0.716　2台 0.989
  往復の数                       0台 0［0〜0］／—／0　1台 64.5［58〜79］／—／67.5　2台 130［101〜161］／—／124
  30秒以上の止まり                  0台 0［0〜0］／—／0　1台 6.5［2〜18］／—／8　2台 20.5［11〜37］／—／26.5
  （1往復あたり）                   0台 0.000［0.000〜0.000］／—／0.000　1台 0.092［0.029〜0.286］／—／0.127　2台 0.149［0.081〜0.276］／—／0.197
  動けなくなった（60秒）               0台 0［0〜0］／—／0　1台 2.5［0〜14］／—／5.5　2台 11.5［4〜26］／—／16.5
  （1往復あたり）                   0台 0.000［0.000〜0.000］／—／0.000　1台 0.035［0.000〜0.222］／—／0.077　2台 0.082［0.032〜0.194］／—／0.124
  瞬間移動                       0台 13.5［10〜21］／—／13　1台 47.5［37〜65］／—／48.5　2台 64.5［34〜73］／—／62.5
  打ち切り                       0台 0［0〜0］／—／0　1台 0［0〜1］／—／0　2台 1［0〜6］／—／3.5
  卓を空けた                      0台 0［0〜0］／—／0　1台 0［0〜1］／—／0　2台 0.5［0〜2］／—／0
  冷めた皿の割合                    0台 0.000［0.000〜0.000］／0.000／0.000　1台 0.159［0.094〜0.312］／0.059／0.328　2台 0.088［0.010〜0.196］／0.010／0.117
  　（真ん中の試算 v2.9）             0台 0.000　1台 0.103　2台 0.013
  スタッフの手がふさがっている割合           0台 0.633［0.538〜0.691］／0.597／0.774　1台 0.577［0.474〜0.651］／0.514／0.739　2台 0.563［0.473〜0.629］／0.478／0.694
  　（真ん中の試算 v2.9）             0台 0.741　1台 0.635　2台 0.602
  （参考）あきらめた                  0台 14［8〜31］／—／13　1台 37［20〜70］／—／40.5　2台 46［33〜94］／—／54.5
  回の数 0台 10・1台 10・2台 10（普通の夜 10・10・10）

■ ④ スタッフ少ない（1 人。真ん中は 2 人・来客 28 組/時）
  入店待ち                       0台 59.95［31.46〜102.60］／52.32／12.95　1台 50.27［30.48〜85.76］／33.09／13.78　2台 70.97［42.13〜95.47］／34.94／26.85
  　（真ん中の試算 v2.9）             0台 10.91　1台 4.81　2台 5.57
  うち席は空いているのに待った             0台 50.52［30.32〜72.59］／45.62／11.49　1台 46.40［29.14〜64.72］／31.01／12.12　2台 59.58［40.26〜77.04］／32.03／23.93
  　（真ん中の試算 v2.9）             0台 9.41　1台 3.92　2台 4.23
  （片付け待ちだけ blocked）          0台 46.91［27.59〜70.12］／43.21／10.92　1台 44.59［27.33〜63.17］／29.35／11.36　2台 53.68［35.42〜73.86］／30.42／21.91
  　（真ん中の試算 v2.9）             0台 8.75　1台 3.38　2台 3.63
  料理の待ち                      0台 4.23［3.79〜6.19］／4.50／1.26　1台 1.65［0.84〜2.69］／1.00／2.10　2台 3.14［0.72〜5.78］／0.41／3.47
  　（真ん中の試算 v2.9）             0台 0.99　1台 1.29　2台 0.47
  会計待ち                       0台 5.94［4.31〜7.90］／5.04／1.86　1台 3.78［2.28〜8.11］／2.93／2.34　2台 7.65［3.21〜15.81］／2.88／3.83
  　（真ん中の試算 v2.9）             0台 1.66　1台 1.52　2台 1.54
  入れた組の数                     0台 53.5［44〜70］／54.6／53.5　1台 53.5［44〜70］／54.7／53.5　2台 53.5［44〜70］／55.5／53.5
  　（真ん中の試算 v2.9）             0台 55.3　1台 55　2台 57.4
  ロボットが運んだ皿の割合               0台 0.000［0.000〜0.000］／0.000／0.000　1台 0.969［0.920〜1.000］／0.985／0.851　2台 0.978［0.920〜1.000］／1.000／0.868
  　（真ん中の試算 v2.9）             0台 0.000　1台 0.956　2台 1.000
  往復の数                       0台 0［0〜0］／—／0　1台 99［86〜123］／—／79　2台 108［83〜162］／—／89.5
  30秒以上の止まり                  0台 0［0〜0］／—／0　1台 16.5［7〜32］／—／23　2台 59［18〜113］／—／104
  （1往復あたり）                   0台 0.000［0.000〜0.000］／—／0.000　1台 0.159［0.064〜0.320］／—／0.314　2台 0.551［0.111〜0.983］／—／1.031
  動けなくなった（60秒）               0台 0［0〜0］／—／0　1台 10.5［3〜29］／—／13　2台 44［10〜95］／—／78.5
  （1往復あたり）                   0台 0.000［0.000〜0.000］／—／0.000　1台 0.104［0.026〜0.290］／—／0.163　2台 0.425［0.062〜0.826］／—／0.788
  瞬間移動                       0台 0［0〜0］／—／0　1台 15.5［9〜29］／—／20　2台 23［16〜45］／—／53.5
  打ち切り                       0台 0［0〜0］／—／0　1台 0［0〜3］／—／0　2台 10［1〜21］／—／12.5
  卓を空けた                      0台 0［0〜0］／—／0　1台 0［0〜1］／—／0　2台 0［0〜1］／—／1
  冷めた皿の割合                    0台 0.454［0.358〜0.552］／0.411／0.026　1台 0.167［0.023〜0.307］／0.051／0.235　2台 0.292［0.040〜0.453］／0.000／0.406
  　（真ん中の試算 v2.9）             0台 0.020　1台 0.046　2台 0.000
  スタッフの手がふさがっている割合           0台 0.972［0.956〜0.993］／0.963／0.844　1台 0.952［0.925〜0.990］／0.924／0.810　2台 0.973［0.959〜0.993］／0.924／0.886
  　（真ん中の試算 v2.9）             0台 0.820　1台 0.740　2台 0.744
  （参考）あきらめた                  0台 0［0〜2］／—／0　1台 19.5［8〜38］／—／32.5　2台 44［30〜83］／—／95.5
  回の数 0台 10・1台 10・2台 10（普通の夜 10・10・10）

■ ④ スタッフ多い（3 人。真ん中は 2 人・来客 28 組/時）
  入店待ち                       0台 2.89［1.38〜11.11］／2.41／12.95　1台 5.23［1.80〜14.80］／1.28／13.78　2台 12.66［4.73〜24.88］／1.04／26.85
  　（真ん中の試算 v2.9）             0台 10.91　1台 4.81　2台 5.57
  うち席は空いているのに待った             0台 1.33［0.22〜5.01］／1.25／11.49　1台 3.32［0.57〜8.73］／0.50／12.12　2台 9.77［2.96〜13.85］／0.37／23.93
  　（真ん中の試算 v2.9）             0台 9.41　1台 3.92　2台 4.23
  （片付け待ちだけ blocked）          0台 0.98［0.00〜4.61］／0.97／10.92　1台 2.85［0.21〜8.44］／0.35／11.36　2台 8.72［1.33〜12.70］／0.24／21.91
  　（真ん中の試算 v2.9）             0台 8.75　1台 3.38　2台 3.63
  料理の待ち                      0台 0.82［0.74〜0.91］／0.47／1.26　1台 2.34［1.83〜3.11］／1.33／2.10　2台 3.70［2.24〜4.20］／0.50／3.47
  　（真ん中の試算 v2.9）             0台 0.99　1台 1.29　2台 0.47
  会計待ち                       0台 1.93［1.06〜2.68］／1.31／1.86　1台 2.30［1.26〜3.10］／1.19／2.34　2台 3.51［2.27〜6.57］／1.20／3.83
  　（真ん中の試算 v2.9）             0台 1.66　1台 1.52　2台 1.54
  入れた組の数                     0台 53.5［44〜70］／54.9／53.5　1台 53.5［44〜70］／55.7／53.5　2台 53.5［44〜70］／55.5／53.5
  　（真ん中の試算 v2.9）             0台 55.3　1台 55　2台 57.4
  ロボットが運んだ皿の割合               0台 0.000［0.000〜0.000］／0.000／0.000　1台 0.764［0.716〜0.810］／0.917／0.851　2台 0.785［0.673〜0.915］／0.999／0.868
  　（真ん中の試算 v2.9）             0台 0.000　1台 0.956　2台 1.000
  往復の数                       0台 0［0〜0］／—／0　1台 64［57〜84］／—／79　2台 79.5［66〜108］／—／89.5
  30秒以上の止まり                  0台 0［0〜0］／—／0　1台 25.5［13〜30］／—／23　2台 87［57〜98］／—／104
  （1往復あたり）                   0台 0.000［0.000〜0.000］／—／0.000　1台 0.414［0.200〜0.466］／—／0.314　2台 1.113［0.633〜1.310］／—／1.031
  動けなくなった（60秒）               0台 0［0〜0］／—／0　1台 19［9〜23］／—／13　2台 67［42〜80］／—／78.5
  （1往復あたり）                   0台 0.000［0.000〜0.000］／—／0.000　1台 0.291［0.138〜0.397］／—／0.163　2台 0.873［0.467〜0.988］／—／0.788
  瞬間移動                       0台 0［0〜2］／—／0　1台 23.5［11〜33］／—／20　2台 50［39〜66］／—／53.5
  打ち切り                       0台 0［0〜0］／—／0　1台 1［0〜3］／—／0　2台 11［6〜15］／—／12.5
  卓を空けた                      0台 0［0〜0］／—／0　1台 0［0〜1］／—／0　2台 0.5［0〜2］／—／1
  冷めた皿の割合                    0台 0.000［0.000〜0.000］／0.000／0.026　1台 0.239［0.136〜0.325］／0.028／0.235　2台 0.420［0.231〜0.516］／0.000／0.406
  　（真ん中の試算 v2.9）             0台 0.020　1台 0.046　2台 0.000
  スタッフの手がふさがっている割合           0台 0.681［0.591〜0.749］／0.625／0.844　1台 0.669［0.604〜0.705］／0.534／0.810　2台 0.743［0.688〜0.811］／0.524／0.886
  　（真ん中の試算 v2.9）             0台 0.820　1台 0.740　2台 0.744
  （参考）あきらめた                  0台 2.5［0〜7］／—／0　1台 41.5［20〜50］／—／32.5　2台 101.5［74〜119］／—／95.5
  回の数 0台 10・1台 10・2台 10（普通の夜 10・10・10）

■ ⑤ スタッフ少ない（3 人。真ん中は 4 人・来客 46 組/時）
  入店待ち                       0台 21.63［6.02〜37.64］／19.17／8.14　1台 16.76［3.80〜32.24］／11.09／6.60　2台 17.47［6.29〜34.88］／8.61／5.46
  　（真ん中の試算 v2.9）             0台 7.51　1台 3.16　2台 2.37
  うち席は空いているのに待った             0台 19.55［4.88〜27.82］／17.37／6.50　1台 14.59［2.61〜20.77］／8.82／4.56　2台 15.97［5.11〜24.36］／6.48／3.41
  　（真ん中の試算 v2.9）             0台 5.50　1台 1.40　2台 0.68
  （片付け待ちだけ blocked）          0台 18.77［4.09〜27.25］／16.66／5.93　1台 14.04［2.06〜19.98］／8.29／4.20　2台 15.27［3.57〜23.62］／5.96／2.99
  　（真ん中の試算 v2.9）             0台 5.05　1台 1.12　2台 0.53
  料理の待ち                      0台 1.39［1.16〜1.52］／1.12／1.12　1台 2.51［2.40〜2.96］／2.32／2.59　2台 2.40［1.57〜3.05］／1.09／2.19
  　（真ん中の試算 v2.9）             0台 0.77　1台 2.28　2台 1.27
  会計待ち                       0台 4.58［2.60〜5.58］／4.09／5.72　1台 4.83［2.76〜6.13］／5.08／7.17　2台 5.58［4.16〜9.18］／6.15／6.98
  　（真ん中の試算 v2.9）             0台 6.09　1台 8.58　2台 9.92
  入れた組の数                     0台 91.5［71〜110］／92.8／91.5　1台 91.5［71〜110］／92.8／91.5　2台 91.5［71〜110］／93.6／91.5
  　（真ん中の試算 v2.9）             0台 94.2　1台 92.5　2台 93
  ロボットが運んだ皿の割合               0台 0.000［0.000〜0.000］／0.000／0.000　1台 0.772［0.745〜0.785］／0.769／0.669　2台 0.837［0.734〜0.940］／0.990／0.819
  　（真ん中の試算 v2.9）             0台 0.000　1台 0.675　2台 0.981
  往復の数                       0台 0［0〜0］／—／0　1台 87［70〜100］／—／68　2台 141［109〜180］／—／132.5
  30秒以上の止まり                  0台 0［0〜0］／—／0　1台 4［2〜11］／—／5　2台 16［5〜40］／—／17
  （1往復あたり）                   0台 0.000［0.000〜0.000］／—／0.000　1台 0.051［0.022〜0.120］／—／0.071　2台 0.114［0.046〜0.328］／—／0.131
  動けなくなった（60秒）               0台 0［0〜0］／—／0　1台 1.5［0〜9］／—／1　2台 12.5［3〜35］／—／11.5
  （1往復あたり）                   0台 0.000［0.000〜0.000］／—／0.000　1台 0.016［0.000〜0.098］／—／0.016　2台 0.089［0.028〜0.287］／—／0.090
  瞬間移動                       0台 11［6〜18］／—／10　1台 58［41〜75］／—／48　2台 61［38〜101］／—／62
  打ち切り                       0台 0［0〜0］／—／0　1台 0［0〜1］／—／0　2台 5［1〜13］／—／4
  卓を空けた                      0台 0［0〜0］／—／0　1台 3.5［0〜6］／—／0.5　2台 2.5［0〜8］／—／3
  冷めた皿の割合                    0台 0.053［0.000〜0.112］／0.036／0.000　1台 0.355［0.331〜0.446］／0.246／0.352　2台 0.229［0.106〜0.284］／0.023／0.250
  　（真ん中の試算 v2.9）             0台 0.000　1台 0.192　2台 0.031
  スタッフの手がふさがっている割合           0台 0.908［0.867〜0.958］／0.902／0.807　1台 0.882［0.827〜0.931］／0.844／0.797　2台 0.861［0.824〜0.946］／0.824／0.804
  　（真ん中の試算 v2.9）             0台 0.801　1台 0.701　2台 0.652
  （参考）あきらめた                  0台 1［0〜2］／—／2　1台 44［27〜56］／—／32.5　2台 69［34〜100］／—／79.5
  回の数 0台 10・1台 10・2台 10（普通の夜 10・10・10）

■ ⑤ スタッフ多い（5 人。真ん中は 4 人・来客 46 組/時）
  入店待ち                       0台 2.32［1.27〜10.78］／2.34／8.14　1台 3.38［1.34〜12.14］／2.58／6.60　2台 4.95［1.42〜12.59］／2.54／5.46
  　（真ん中の試算 v2.9）             0台 7.51　1台 3.16　2台 2.37
  うち席は空いているのに待った             0台 0.70［0.11〜2.39］／0.80／6.50　1台 1.34［0.14〜1.87］／0.56／4.56　2台 1.90［0.18〜4.10］／0.48／3.41
  　（真ん中の試算 v2.9）             0台 5.50　1台 1.40　2台 0.68
  （片付け待ちだけ blocked）          0台 0.46［0.00〜2.01］／0.63／5.93　1台 1.16［0.00〜1.65］／0.51／4.20　2台 1.58［0.00〜3.80］／0.45／2.99
  　（真ん中の試算 v2.9）             0台 5.05　1台 1.12　2台 0.53
  料理の待ち                      0台 0.72［0.64〜0.96］／0.41／1.12　1台 2.43［2.29〜3.33］／2.05／2.59　2台 2.02［1.70〜2.62］／1.24／2.19
  　（真ん中の試算 v2.9）             0台 0.77　1台 2.28　2台 1.27
  会計待ち                       0台 12.75［3.32〜17.65］／10.00／5.72　1台 12.77［4.51〜19.04］／9.95／7.17　2台 11.99［4.80〜16.56］／10.22／6.98
  　（真ん中の試算 v2.9）             0台 6.09　1台 8.58　2台 9.92
  入れた組の数                     0台 91.5［71〜110］／93.2／91.5　1台 91.5［71〜110］／93.7／91.5　2台 91.5［71〜110］／93.7／91.5
  　（真ん中の試算 v2.9）             0台 94.2　1台 92.5　2台 93
  ロボットが運んだ皿の割合               0台 0.000［0.000〜0.000］／0.000／0.000　1台 0.626［0.547〜0.714］／0.659／0.669　2台 0.857［0.763〜0.915］／0.975／0.819
  　（真ん中の試算 v2.9）             0台 0.000　1台 0.675　2台 0.981
  往復の数                       0台 0［0〜0］／—／0　1台 62.5［58〜79］／—／68　2台 121.5［101〜147］／—／132.5
  30秒以上の止まり                  0台 0［0〜0］／—／0　1台 3.5［1〜18］／—／5　2台 20［11〜36］／—／17
  （1往復あたり）                   0台 0.000［0.000〜0.000］／—／0.000　1台 0.050［0.013〜0.277］／—／0.071　2台 0.156［0.087〜0.310］／—／0.131
  動けなくなった（60秒）               0台 0［0〜0］／—／0　1台 1［0〜16］／—／1　2台 11.5［8〜26］／—／11.5
  （1往復あたり）                   0台 0.000［0.000〜0.000］／—／0.000　1台 0.015［0.000〜0.246］／—／0.016　2台 0.094［0.061〜0.224］／—／0.090
  瞬間移動                       0台 12.5［6〜17］／—／10　1台 49.5［31〜64］／—／48　2台 66.5［50〜88］／—／62
  打ち切り                       0台 0［0〜0］／—／0　1台 0［0〜2］／—／0　2台 3［0〜9］／—／4
  卓を空けた                      0台 0［0〜0］／—／0　1台 1［0〜4］／—／0.5　2台 3［0〜7］／—／3
  冷めた皿の割合                    0台 0.000［0.000〜0.000］／0.000／0.000　1台 0.251［0.185〜0.339］／0.084／0.352　2台 0.180［0.127〜0.241］／0.021／0.250
  　（真ん中の試算 v2.9）             0台 0.000　1台 0.192　2台 0.031
  スタッフの手がふさがっている割合           0台 0.670［0.604〜0.717］／0.661／0.807　1台 0.645［0.572〜0.704］／0.566／0.797　2台 0.678［0.607〜0.735］／0.524／0.804
  　（真ん中の試算 v2.9）             0台 0.801　1台 0.701　2台 0.652
  （参考）あきらめた                  0台 3［1〜9］／—／2　1台 42［17〜73］／—／32.5　2台 76.5［30〜107］／—／79.5
  回の数 0台 10・1台 10・2台 10（普通の夜 10・10・10）

■ ⑥ スタッフ少ない（2 人。真ん中は 3 人・来客 38 組/時）
  入店待ち                       0台 29.67［14.50〜49.78］／29.82／9.60　1台 17.50［5.12〜34.75］／15.29／6.04　2台 19.03［4.55〜34.64］／14.48／4.83
  　（真ん中の試算 v2.9）             0台 7.91　1台 3.68　2台 2.11
  うち席は空いているのに待った             0台 28.48［13.35〜38.79］／27.37／8.42　1台 16.30［3.95〜28.31］／13.96／4.84　2台 17.82［3.39〜28.52］／13.17／3.49
  　（真ん中の試算 v2.9）             0台 6.59　1台 2.50　2台 1.61
  （片付け待ちだけ blocked）          0台 27.34［12.53〜37.79］／26.33／7.92　1台 15.83［3.31〜27.81］／13.14／4.41　2台 17.28［2.69〜27.90］／12.34／3.17
  　（真ん中の試算 v2.9）             0台 6.04　1台 2.10　2台 1.24
  料理の待ち                      0台 1.97［1.57〜2.43］／1.72／1.12　1台 1.75［1.47〜1.86］／1.85／2.09　2台 1.21［0.90〜2.36］／0.70／1.27
  　（真ん中の試算 v2.9）             0台 0.84　1台 2.01　2台 0.82
  会計待ち                       0台 3.67［2.28〜5.26］／2.87／3.03　1台 3.30［1.84〜4.45］／2.52／3.00　2台 3.39［2.26〜4.30］／2.53／3.31
  　（真ん中の試算 v2.9）             0台 2.45　1台 3.00　2台 2.98
  入れた組の数                     0台 73.5［59〜88］／76.7／73.5　1台 73.5［59〜88］／74.5／73.5　2台 73.5［59〜88］／75.1／73.5
  　（真ん中の試算 v2.9）             0台 74.5　1台 74.4　2台 73.6
  ロボットが運んだ皿の割合               0台 0.000［0.000〜0.000］／0.000／0.000　1台 0.914［0.888〜0.947］／0.895／0.831　2台 0.956［0.846〜0.994］／0.999／0.960
  　（真ん中の試算 v2.9）             0台 0.000　1台 0.808　2台 0.999
  往復の数                       0台 0［0〜0］／—／0　1台 108［80〜130］／—／79　2台 149.5［121〜186］／—／137.5
  30秒以上の止まり                  0台 0［0〜0］／—／0　1台 2［0〜4］／—／2.5　2台 14.5［1〜35］／—／12.5
  （1往復あたり）                   0台 0.000［0.000〜0.000］／—／0.000　1台 0.017［0.000〜0.032］／—／0.030　2台 0.099［0.008〜0.208］／—／0.092
  動けなくなった（60秒）               0台 0［0〜0］／—／0　1台 0［0〜2］／—／1　2台 10.5［0〜28］／—／8
  （1往復あたり）                   0台 0.000［0.000〜0.000］／—／0.000　1台 0.000［0.000〜0.022］／—／0.012　2台 0.060［0.000〜0.167］／—／0.052
  瞬間移動                       0台 0［0〜3］／—／1　1台 23.5［16〜34］／—／25.5　2台 27［13〜32］／—／28.5
  打ち切り                       0台 0［0〜0］／—／0　1台 0［0〜0］／—／0　2台 4［0〜13］／—／1.5
  卓を空けた                      0台 0［0〜0］／—／0　1台 0［0〜0］／—／0　2台 0［0〜0］／—／0
  冷めた皿の割合                    0台 0.175［0.077〜0.345］／0.157／0.008　1台 0.180［0.053〜0.223］／0.162／0.209　2台 0.076［0.027〜0.194］／0.007／0.069
  　（真ん中の試算 v2.9）             0台 0.003　1台 0.157　2台 0.005
  スタッフの手がふさがっている割合           0台 0.929［0.901〜0.955］／0.938／0.832　1台 0.883［0.840〜0.919］／0.874／0.753　2台 0.874［0.803〜0.900］／0.868／0.753
  　（真ん中の試算 v2.9）             0台 0.815　1台 0.728　2台 0.707
  （参考）あきらめた                  0台 3.5［0〜9］／—／7　1台 11［6〜22］／—／19　2台 16.5［1〜27］／—／28.5
  回の数 0台 10・1台 10・2台 10（普通の夜 10・10・10）

■ ⑥ スタッフ多い（4 人。真ん中は 3 人・来客 38 組/時）
  入店待ち                       0台 2.16［1.27〜8.62］／1.64／9.60　1台 1.69［1.24〜7.27］／1.33／6.04　2台 1.65［1.28〜7.07］／0.71／4.83
  　（真ん中の試算 v2.9）             0台 7.91　1台 3.68　2台 2.11
  うち席は空いているのに待った             0台 0.89［0.13〜4.87］／1.04／8.42　1台 0.40［0.08〜2.45］／0.42／4.84　2台 0.32［0.09〜2.12］／0.26／3.49
  　（真ん中の試算 v2.9）             0台 6.59　1台 2.50　2台 1.61
  （片付け待ちだけ blocked）          0台 0.59［0.00〜4.53］／0.77／7.92　1台 0.21［0.00〜2.31］／0.33／4.41　2台 0.17［0.00〜1.99］／0.18／3.17
  　（真ん中の試算 v2.9）             0台 6.04　1台 2.10　2台 1.24
  料理の待ち                      0台 0.86［0.55〜1.06］／0.51／1.12　1台 2.01［1.61〜2.48］／1.84／2.09　2台 1.16［0.77〜1.97］／0.87／1.27
  　（真ん中の試算 v2.9）             0台 0.84　1台 2.01　2台 0.82
  会計待ち                       0台 3.30［1.45〜6.94］／3.47／3.03　1台 4.42［1.95〜6.95］／3.47／3.00　2台 5.28［1.52〜8.70］／3.44／3.31
  　（真ん中の試算 v2.9）             0台 2.45　1台 3.00　2台 2.98
  入れた組の数                     0台 73.5［59〜88］／75.7／73.5　1台 73.5［59〜88］／74／73.5　2台 73.5［59〜88］／74.2／73.5
  　（真ん中の試算 v2.9）             0台 74.5　1台 74.4　2台 73.6
  ロボットが運んだ皿の割合               0台 0.000［0.000〜0.000］／0.000／0.000　1台 0.759［0.714〜0.885］／0.770／0.831　2台 0.970［0.866〜1.000］／0.995／0.960
  　（真ん中の試算 v2.9）             0台 0.000　1台 0.808　2台 0.999
  往復の数                       0台 0［0〜0］／—／0　1台 74［65〜80］／—／79　2台 129［123〜164］／—／137.5
  30秒以上の止まり                  0台 0［0〜0］／—／0　1台 1.5［0〜16］／—／2.5　2台 8［3〜22］／—／12.5
  （1往復あたり）                   0台 0.000［0.000〜0.000］／—／0.000　1台 0.020［0.000〜0.246］／—／0.030　2台 0.062［0.018〜0.173］／—／0.092
  動けなくなった（60秒）               0台 0［0〜0］／—／0　1台 0［0〜12］／—／1　2台 3.5［1〜19］／—／8
  （1往復あたり）                   0台 0.000［0.000〜0.000］／—／0.000　1台 0.000［0.000〜0.185］／—／0.012　2台 0.027［0.006〜0.150］／—／0.052
  瞬間移動                       0台 0［0〜2］／—／1　1台 26［9〜32］／—／25.5　2台 34［17〜46］／—／28.5
  打ち切り                       0台 0［0〜0］／—／0　1台 0［0〜1］／—／0　2台 0［0〜9］／—／1.5
  卓を空けた                      0台 0［0〜0］／—／0　1台 0［0〜0］／—／0　2台 0［0〜2］／—／0
  冷めた皿の割合                    0台 0.000［0.000〜0.005］／0.000／0.008　1台 0.164［0.054〜0.234］／0.068／0.209　2台 0.053［0.000〜0.101］／0.008／0.069
  　（真ん中の試算 v2.9）             0台 0.003　1台 0.157　2台 0.005
  スタッフの手がふさがっている割合           0台 0.715［0.592〜0.747］／0.684／0.832　1台 0.641［0.504〜0.675］／0.570／0.753　2台 0.610［0.499〜0.655］／0.543／0.753
  　（真ん中の試算 v2.9）             0台 0.815　1台 0.728　2台 0.707
  （参考）あきらめた                  0台 10.5［5〜18］／—／7　1台 23.5［12〜34］／—／19　2台 23.5［11〜43］／—／28.5
  回の数 0台 10・1台 10・2台 10（普通の夜 10・10・10）

■ ② スタッフ少ない（1 人。真ん中は 2 人・来客 19 組/時）
  入店待ち                       0台 26.01［5.27〜50.26］／24.45／1.96　1台 17.83［1.95〜39.97］／13.55／1.69　2台 23.98［2.08〜44.53］／13.45／2.10
  　（真ん中の試算 v2.9）             0台 2.61　1台 1.79　2台 1.30
  うち席は空いているのに待った             0台 24.15［4.21〜36.73］／21.48／0.77　1台 16.51［0.86〜29.24］／11.76／0.43　2台 21.27［0.98〜30.98］／11.96／0.77
  　（真ん中の試算 v2.9）             0台 1.55　1台 0.87　2台 0.62
  （片付け待ちだけ blocked）          0台 22.94［3.01〜35.83］／20.10／0.39　1台 15.61［0.07〜28.50］／10.48／0.11　2台 19.42［0.07〜30.20］／10.77／0.10
  　（真ん中の試算 v2.9）             0台 1.17　1台 0.59　2台 0.36
  料理の待ち                      0台 2.20［1.72〜3.26］／2.06／0.89　1台 1.21［0.57〜2.86］／0.78／1.04　2台 1.29［0.47〜2.32］／0.37／1.04
  　（真ん中の試算 v2.9）             0台 0.61　1台 0.91　2台 0.40
  会計待ち                       0台 2.60［1.97〜4.39］／2.26／1.13　1台 2.10［1.47〜2.61］／1.81／1.06　2台 2.38［1.60〜3.48］／1.77／1.33
  　（真ん中の試算 v2.9）             0台 0.88　1台 0.74　2台 0.65
  入れた組の数                     0台 36.5［26〜48］／37.6／36.5　1台 36.5［26〜48］／37／36.5　2台 36.5［26〜48］／37.3／36.5
  　（真ん中の試算 v2.9）             0台 37.3　1台 37.6　2台 35.9
  ロボットが運んだ皿の割合               0台 0.000［0.000〜0.000］／0.000／0.000　1台 0.961［0.800〜1.000］／0.994／0.956　2台 0.982［0.905〜1.000］／1.000／0.967
  　（真ん中の試算 v2.9）             0台 0.000　1台 0.980　2台 1.000
  往復の数                       0台 0［0〜0］／—／0　1台 72.5［61〜89］／—／64　2台 81［66〜107］／—／77.5
  30秒以上の止まり                  0台 0［0〜0］／—／0　1台 3.5［0〜29］／—／2　2台 26［1〜42］／—／18.5
  （1往復あたり）                   0台 0.000［0.000〜0.000］／—／0.000　1台 0.047［0.000〜0.326］／—／0.028　2台 0.311［0.013〜0.487］／—／0.210
  動けなくなった（60秒）               0台 0［0〜0］／—／0　1台 3［0〜29］／—／0　2台 20［0〜37］／—／12.5
  （1往復あたり）                   0台 0.000［0.000〜0.000］／—／0.000　1台 0.040［0.000〜0.326］／—／0.000　2台 0.245［0.000〜0.350］／—／0.147
  瞬間移動                       0台 1［0〜3］／—／1.5　1台 3.5［2〜9］／—／9　2台 6.5［4〜14］／—／13.5
  打ち切り                       0台 0［0〜0］／—／0　1台 0.5［0〜6］／—／0　2台 5［0〜11］／—／1.5
  卓を空けた                      0台 0［0〜0］／—／0　1台 0［0〜0］／—／0　2台 0［0〜1］／—／0
  冷めた皿の割合                    0台 0.232［0.101〜0.459］／0.219／0.000　1台 0.091［0.000〜0.233］／0.012／0.041　2台 0.084［0.000〜0.210］／0.000／0.055
  　（真ん中の試算 v2.9）             0台 0.003　1台 0.008　2台 0.000
  スタッフの手がふさがっている割合           0台 0.922［0.852〜0.975］／0.913／0.658　1台 0.870［0.770〜0.933］／0.850／0.558　2台 0.880［0.821〜0.942］／0.851／0.581
  　（真ん中の試算 v2.9）             0台 0.644　1台 0.544　2台 0.513
  （参考）あきらめた                  0台 1［0〜4］／—／2　1台 2.5［0〜7］／—／3.5　2台 9［2〜18］／—／10.5
  回の数 0台 10・1台 10・2台 10（普通の夜 10・10・10）

■ ② スタッフ多い（3 人。真ん中は 2 人・来客 19 組/時）
  入店待ち                       0台 1.42［1.07〜5.11］／1.02／1.96　1台 1.45［1.09〜6.69］／1.24／1.69　2台 1.55［1.12〜5.60］／0.99／2.10
  　（真ん中の試算 v2.9）             0台 2.61　1台 1.79　2台 1.30
  うち席は空いているのに待った             0台 0.22［0.00〜1.53］／0.31／0.77　1台 0.18［0.00〜1.13］／0.30／0.43　2台 0.25［0.04〜1.19］／0.24／0.77
  　（真ん中の試算 v2.9）             0台 1.55　1台 0.87　2台 0.62
  （片付け待ちだけ blocked）          0台 0.09［0.00〜1.20］／0.23／0.39　1台 0.08［0.00〜1.09］／0.26／0.11　2台 0.17［0.00〜1.10］／0.21／0.10
  　（真ん中の試算 v2.9）             0台 1.17　1台 0.59　2台 0.36
  料理の待ち                      0台 0.46［0.38〜0.64］／0.23／0.89　1台 1.30［1.03〜2.28］／0.92／1.04　2台 1.34［0.86〜2.16］／0.41／1.04
  　（真ん中の試算 v2.9）             0台 0.61　1台 0.91　2台 0.40
  会計待ち                       0台 0.77［0.50〜1.56］／0.46／1.13　1台 0.80［0.64〜1.97］／0.62／1.06　2台 0.81［0.43〜3.19］／0.57／1.33
  　（真ん中の試算 v2.9）             0台 0.88　1台 0.74　2台 0.65
  入れた組の数                     0台 36.5［26〜48］／37.3／36.5　1台 36.5［26〜48］／37.9／36.5　2台 36.5［26〜48］／37.6／36.5
  　（真ん中の試算 v2.9）             0台 37.3　1台 37.6　2台 35.9
  ロボットが運んだ皿の割合               0台 0.000［0.000〜0.000］／0.000／0.000　1台 0.910［0.744〜0.974］／0.976／0.956　2台 0.938［0.838〜1.000］／1.000／0.967
  　（真ん中の試算 v2.9）             0台 0.000　1台 0.980　2台 1.000
  往復の数                       0台 0［0〜0］／—／0　1台 60［50〜80］／—／64　2台 76［61〜106］／—／77.5
  30秒以上の止まり                  0台 0［0〜0］／—／0　1台 2［0〜19］／—／2　2台 24［8〜45］／—／18.5
  （1往復あたり）                   0台 0.000［0.000〜0.000］／—／0.000　1台 0.033［0.000〜0.373］／—／0.028　2台 0.293［0.091〜0.738］／—／0.210
  動けなくなった（60秒）               0台 0［0〜0］／—／0　1台 1［0〜17］／—／0　2台 16.5［3〜39］／—／12.5
  （1往復あたり）                   0台 0.000［0.000〜0.000］／—／0.000　1台 0.016［0.000〜0.333］／—／0.000　2台 0.203［0.048〜0.639］／—／0.147
  瞬間移動                       0台 3［0〜5］／—／1.5　1台 10［6〜15］／—／9　2台 14［7〜23］／—／13.5
  打ち切り                       0台 0［0〜0］／—／0　1台 0［0〜2］／—／0　2台 2［0〜7］／—／1.5
  卓を空けた                      0台 0［0〜0］／—／0　1台 0［0〜0］／—／0　2台 0［0〜0］／—／0
  冷めた皿の割合                    0台 0.000［0.000〜0.011］／0.000／0.000　1台 0.041［0.013〜0.124］／0.005／0.041　2台 0.065［0.038〜0.138］／0.000／0.055
  　（真ん中の試算 v2.9）             0台 0.003　1台 0.008　2台 0.000
  スタッフの手がふさがっている割合           0台 0.453［0.356〜0.598］／0.441／0.658　1台 0.389［0.294〜0.489］／0.367／0.558　2台 0.399［0.301〜0.512］／0.358／0.581
  　（真ん中の試算 v2.9）             0台 0.644　1台 0.544　2台 0.513
  （参考）あきらめた                  0台 3［1〜9］／—／2　1台 5.5［2〜10］／—／3.5　2台 8.5［4〜15］／—／10.5
  回の数 0台 10・1台 10・2台 10（普通の夜 10・10・10）

■ ロボットを1台増やしたときの向き（種ごと。judge と同じ数え方：5%・0.2 分より小さい変化は「変わらない」）
  各欄：試算の向き → Unity の種10個の内訳（同じ向き・逆・変わらない）→ 過半数で 同じ／逆／どちらでもない
  ③少ない 0→1台  入店待ち：試算 短くなる／同じ 9・逆 0・変わらない 1 → 同じ　料理の待ち：試算 長くなる／同じ 10・逆 0・変わらない 0 → 同じ
  ③少ない 1→2台  入店待ち：試算 短くなる／同じ 2・逆 5・変わらない 3 → どちらでもない　料理の待ち：試算 短くなる／同じ 9・逆 1・変わらない 0 → 同じ
  ③多い 0→1台  入店待ち：試算 変わらない／試算は変わらない（Unity は長く 6・短く 0・変わらない 4）　料理の待ち：試算 長くなる／同じ 10・逆 0・変わらない 0 → 同じ
  ③多い 1→2台  入店待ち：試算 変わらない／試算は変わらない（Unity は長く 2・短く 3・変わらない 5）　料理の待ち：試算 短くなる／同じ 9・逆 0・変わらない 1 → 同じ
  ⑦少ない 0→1台  入店待ち：試算 短くなる／同じ 9・逆 1・変わらない 0 → 同じ　料理の待ち：試算 長くなる／同じ 10・逆 0・変わらない 0 → 同じ
  ⑦少ない 1→2台  入店待ち：試算 短くなる／同じ 6・逆 1・変わらない 3 → 同じ　料理の待ち：試算 短くなる／同じ 8・逆 2・変わらない 0 → 同じ
  ⑦多い 0→1台  入店待ち：試算 長くなる／同じ 6・逆 0・変わらない 4 → 同じ　料理の待ち：試算 長くなる／同じ 10・逆 0・変わらない 0 → 同じ
  ⑦多い 1→2台  入店待ち：試算 短くなる／同じ 0・逆 4・変わらない 6 → どちらでもない　料理の待ち：試算 短くなる／同じ 8・逆 0・変わらない 2 → 同じ
  ④少ない 0→1台  入店待ち：試算 短くなる／同じ 9・逆 0・変わらない 1 → 同じ　料理の待ち：試算 短くなる／同じ 10・逆 0・変わらない 0 → 同じ
  ④少ない 1→2台  入店待ち：試算 長くなる／同じ 10・逆 0・変わらない 0 → 同じ　料理の待ち：試算 短くなる／同じ 2・逆 7・変わらない 1 → 逆
  ④多い 0→1台  入店待ち：試算 短くなる／同じ 0・逆 10・変わらない 0 → 逆　料理の待ち：試算 長くなる／同じ 10・逆 0・変わらない 0 → 同じ
  ④多い 1→2台  入店待ち：試算 短くなる／同じ 0・逆 10・変わらない 0 → 逆　料理の待ち：試算 短くなる／同じ 0・逆 8・変わらない 2 → 逆
  ⑤少ない 0→1台  入店待ち：試算 短くなる／同じ 10・逆 0・変わらない 0 → 同じ　料理の待ち：試算 長くなる／同じ 10・逆 0・変わらない 0 → 同じ
  ⑤少ない 1→2台  入店待ち：試算 短くなる／同じ 3・逆 6・変わらない 1 → 逆　料理の待ち：試算 短くなる／同じ 5・逆 2・変わらない 3 → どちらでもない
  ⑤多い 0→1台  入店待ち：試算 長くなる／同じ 8・逆 0・変わらない 2 → 同じ　料理の待ち：試算 長くなる／同じ 10・逆 0・変わらない 0 → 同じ
  ⑤多い 1→2台  入店待ち：試算 変わらない／試算は変わらない（Unity は長く 4・短く 0・変わらない 6）　料理の待ち：試算 短くなる／同じ 8・逆 1・変わらない 1 → 同じ
  ⑥少ない 0→1台  入店待ち：試算 短くなる／同じ 10・逆 0・変わらない 0 → 同じ　料理の待ち：試算 変わらない／試算は変わらない（Unity は長く 0・短く 5・変わらない 5）
  ⑥少ない 1→2台  入店待ち：試算 短くなる／同じ 3・逆 4・変わらない 3 → どちらでもない　料理の待ち：試算 短くなる／同じ 7・逆 1・変わらない 2 → 同じ
  ⑥多い 0→1台  入店待ち：試算 短くなる／同じ 5・逆 0・変わらない 5 → どちらでもない　料理の待ち：試算 長くなる／同じ 10・逆 0・変わらない 0 → 同じ
  ⑥多い 1→2台  入店待ち：試算 短くなる／同じ 1・逆 0・変わらない 9 → どちらでもない　料理の待ち：試算 短くなる／同じ 9・逆 0・変わらない 1 → 同じ
  ②少ない 0→1台  入店待ち：試算 短くなる／同じ 10・逆 0・変わらない 0 → 同じ　料理の待ち：試算 短くなる／同じ 8・逆 1・変わらない 1 → 同じ
  ②少ない 1→2台  入店待ち：試算 変わらない／試算は変わらない（Unity は長く 5・短く 2・変わらない 3）　料理の待ち：試算 短くなる／同じ 3・逆 6・変わらない 1 → 逆
  ②多い 0→1台  入店待ち：試算 長くなる／同じ 3・逆 0・変わらない 7 → どちらでもない　料理の待ち：試算 長くなる／同じ 10・逆 0・変わらない 0 → 同じ
  ②多い 1→2台  入店待ち：試算 短くなる／同じ 2・逆 2・変わらない 6 → どちらでもない　料理の待ち：試算 短くなる／同じ 5・逆 3・変わらない 2 → どちらでもない

■ スタッフ1人の回（④②）の仕事ごとの時間（timeline.csv の staff_* を 60 秒ごとに足したもの。分。種10個の中央値［最小〜最大］）
  ④ 0台：待機 11［3〜16］・案内 62［47〜79］・配膳 68［60〜92］・呼び出し 20［15〜25］・会計 84［73〜110］・片付け 108［90〜141］・ロボット救出 0［0〜0］
      長い順（中央値）：片付け 108 ＞ 会計 84 ＞ 配膳 68 ＞ 案内 62 ＞ 呼び出し 20 ＞ 待機 11
  ④ 1台：待機 16［5〜25］・案内 76［63〜90］・配膳 3［0〜17］・呼び出し 24［19〜30］・会計 88［74〜115］・片付け 118［97〜163］・ロボット救出 3［0〜12］
      長い順（中央値）：片付け 118 ＞ 会計 88 ＞ 案内 76 ＞ 呼び出し 24 ＞ 待機 16 ＞ 配膳 3 ＞ ロボット救出 3
  ④ 2台：待機 10［3〜19］・案内 94［69〜121］・配膳 5［0〜19］・呼び出し 26［23〜29］・会計 87［70〜121］・片付け 125［103〜152］・ロボット救出 24［9〜57］
      長い順（中央値）：片付け 125 ＞ 案内 94 ＞ 会計 87 ＞ 呼び出し 26 ＞ ロボット救出 24 ＞ 待機 10 ＞ 配膳 5
  ② 0台：待機 20［10〜32］・案内 38［27〜50］・配膳 45［31〜59］・呼び出し 16［9〜21］・会計 58［41〜74］・片付け 76［53〜94］・ロボット救出 0［0〜0］
      長い順（中央値）：片付け 76 ＞ 会計 58 ＞ 配膳 45 ＞ 案内 38 ＞ 待機 20 ＞ 呼び出し 16
  ② 1台：待機 31［17〜47］・案内 39［26〜58］・配膳 2［0〜12］・呼び出し 14［8〜17］・会計 60［44〜75］・片付け 75［52〜99］・ロボット救出 2［0〜7］
      長い順（中央値）：片付け 75 ＞ 会計 60 ＞ 案内 39 ＞ 待機 31 ＞ 呼び出し 14 ＞ 配膳 2 ＞ ロボット救出 2
  ② 2台：待機 30［15〜35］・案内 41［28〜54］・配膳 2［0〜10］・呼び出し 15［7〜20］・会計 60［44〜81］・片付け 80［56〜97］・ロボット救出 8［0〜14］
      長い順（中央値）：片付け 80 ＞ 会計 60 ＞ 案内 41 ＞ 待機 30 ＞ 呼び出し 15 ＞ ロボット救出 8 ＞ 配膳 2

全員が帰らなかった回：0 回
status：{'completed': 360}
最長の実時間：17.5 分（20261107_night_st5_cs47_fam_p3_r2_s5_passon_sbret）
往復の打ち切りが1つ以上あった回：126 回・合わせて 604
回の数：360


====================================================================
8. judge
====================================================================

  night/20261107_staff/judge.md ができた（judge.csv も 360 行）。runner が最後に自分で呼んだ（judge は直していない）。
  振り分けは 360 回とも「基準なし」（基準 v5 は ③⑦ の普通・真ん中の人数だけのため）。
  judge.md に「試算の版が基準と違う（今回 v2.9／基準 v2.8）」の注意が出ている。中身の判断はしていない。


====================================================================
9. 変えたもの・変えていないもの
====================================================================

  変えた：Assets/ServiceSim/Experiment/serving-robot-params.json（cs:46。サイトの写し）
          Assets/ServiceSim/Experiment/SimParams.asset の expectModel 1行（cs:47。v2.8 → v2.9）
          tools/make_queue.py（cs:48。--staff の追加だけ）
          unity/site_copy_08db8a0d067c_d73b98d/（新しい控え）・この報告と 20261107_night_staff_files/
  変えていない：店の回し方・人とロボットの動き・速さ・物理の設定・同時に回す本数（4）・台帳の列と今までの行・今までの night/ と出力・
          night_runner.py・judge_night.py・C# のコード
```

### ロボット0台なら、スタッフの人数を変えても Unity と試算の入店待ちはそろった

入店待ち（店に来てから案内されて席に着くまで・分）を、ロボット0台で並べました。Unity は種10個の中央値、試算は v2.9 の40回の平均です。真ん中の人数の Unity は、前の夜（混み具合は普通）の中央値です。

| 店 | 少ない：Unity／試算 | 真ん中：Unity／試算 | 多い：Unity／試算 |
|---|---|---|---|
| ③（3・4・5人） | 14.8／10.6 | 4.1／4.1 | 1.9／1.0 |
| ⑦（3・4・5人） | 14.9／12.0 | 4.5／3.1 | 1.9／1.4 |
| ④（1・2・3人） | 60.0／52.3 | 13.0／10.9 | 2.9／2.4 |
| ⑤（3・4・5人） | 21.6／19.2 | 8.1／7.5 | 2.3／2.3 |
| ⑥（2・3・4人） | 29.7／29.8 | 9.6／7.9 | 2.2／1.6 |
| ②（1・2・3人） | 26.0／24.5 | 2.0／2.6 | 1.4／1.0 |

人数が1人減ると入店待ちが何倍にもなる向きも、その大きさも、2つの道具でほぼそろっています。スタッフ1人の④②も、全員が帰るまで回り切りました。人だけで回す店の動きは、試算でも3Dの店でも同じように出ています。

### スタッフが少ない店では、ロボットを足しても入店待ちが試算ほど縮まない

同じスタッフが少ない条件で、ロボット0台から2台にしたときに入店待ちが何分縮んだかを並べました。

| 店（スタッフ） | Unity 0台 → 2台 | 試算 0台 → 2台 | Unity で縮んだ分 ÷ 試算で縮んだ分 |
|---|---|---|---|
| ③（3人） | 14.8 → 13.1（−1.7） | 10.6 → 4.0（−6.6） | 26% |
| ⑦（3人） | 14.9 → 10.2（−4.7） | 12.0 → 4.2（−7.9） | 59% |
| ④（1人） | 60.0 → 71.0（＋11.0） | 52.3 → 34.9（−17.4） | 延びた |
| ⑤（3人） | 21.6 → 17.5（−4.2） | 19.2 → 8.6（−10.6） | 39% |
| ⑥（2人） | 29.7 → 19.0（−10.6） | 29.8 → 14.5（−15.3） | 69% |
| ②（1人） | 26.0 → 24.0（−2.0） | 24.5 → 13.5（−11.0） | 18% |

試算は、人が足りない店ほどロボットで大きく縮む計算です。Unity も縮む向きは同じ店が多いものの、縮み方は試算の2〜7割でした。報告の「向き」の表では、ロボットを1台増やしたときの入店待ちが種の過半数で試算と逆になったのは、⑤少ない 1→2台（10種中6）と、下の④多いの2か所でした。

スタッフが多い店は、ロボットがいなくても入店待ちが1〜3分台で、ロボットを足しても大きくは変わりません。ここは試算も同じです。

### ④は、スタッフを3人にしても、ロボットを足すと入店待ちが延びた

| ④（3人） | 0台 | 1台 | 2台 |
|---|---|---|---|
| Unity 入店待ち | 2.9 | 5.2 | 12.7 |
| 試算 入店待ち | 2.4 | 1.3 | 1.0 |
| Unity 席は空いているのに待った | 1.3 | 3.3 | 9.8 |
| Unity 料理の待ち | 0.8 | 2.3 | 3.7 |

0→1台・1→2台とも、種10個すべてで試算と逆の向きでした。④は狭い店で、前の夜でも、ロボットが動けなくなる割合が6店でいちばん多い店です（上の作業ログで2台 0.53〜0.57）。動けなくなったロボットを人が動かしに行くあいだ、片付けと案内が止まり、席は空いているのに待つ時間が延びます。

### スタッフ1人の店では、片付けにいちばん長く時間を使っていた

スタッフ1人の④②で、スタッフが何をしていた時間が長いかを、Unity の記録（60秒ごとの仕事ごとの人数）から足しました（分・種10個の中央値）。

| | 待機 | 案内 | 配膳 | 呼び出し | 会計 | 片付け | ロボット救出 |
|---|---|---|---|---|---|---|---|
| ④ 0台 | 11 | 62 | 68 | 20 | 84 | 108 | 0 |
| ④ 1台 | 16 | 76 | 3 | 24 | 88 | 118 | 3 |
| ④ 2台 | 10 | 94 | 5 | 26 | 87 | 125 | 24 |
| ② 0台 | 20 | 38 | 45 | 16 | 58 | 76 | 0 |
| ② 1台 | 31 | 39 | 2 | 14 | 60 | 75 | 2 |
| ② 2台 | 30 | 41 | 2 | 15 | 60 | 80 | 8 |

ロボットを入れると配膳の時間はほぼなくなります（④ 68分 → 3〜5分）。ところが④では、そのぶん案内（62 → 94分）と片付け（108 → 125分）が延び、ロボット救出が24分入りました。空いた手が、そのまま次のお客さんの案内に回っていません。

### Claude Code が書き換えた試算の版の確かめ（expectModel）は、そのまま使う

Unity には、読んだ条件のファイルの試算の版が、待っている版と違えば回し始めない確かめがあります。Claude Code はこれを v2.8 から v2.9 に1行書き換えてから回しました（cs:47）。v2.9 の条件で回すと決めて出した依頼なので、そのまま使います。写した日と写し元の欄（fetchedAt・sourceUrl）が前回の値のままになっている件は、次に Unity へ依頼するときに一緒に直してもらいます。

17:31〜17:42 の11分間、実行の記録が止まっていて、その間の1回は台帳の実時間が17.5分（ふだんは6.3分）になっていました。その回も最後まで回り、全員が帰っています。原因は調べていません。


## 作業ログ ― 混み具合とスタッフの人数を広げたところで区切る

ここまでで、Unity は6店で、混み具合3通りとスタッフの人数3通りを、ロボット0・1・2台で回せるようになりました。台帳は1392行です。

| ずれ | 今の扱い |
|---|---|
| 待機場所のまわりの詰まり（6店すべて） | 原因は1台分の幅0.8m。直すなら0.95m（⑤だけ試算を計算し直す）。今は記録だけ |
| ロボットが動けなくなる割合（試算 0.01、Unity 0.02〜0.57） | 試算は0.01のまま。今は記録だけ |
| スタッフが少ない店で、ロボットを足しても試算ほど縮まない | 縮み方は試算の2〜7割。④は延びる |
| 混んでいるとき、Unity のほうが入店待ちが長い | 片付け1回の長さの差（135秒・123秒）として記録（LOG405） |

ロボットのいない店は、混み具合を変えても人数を変えても、試算と3Dの店がほぼ同じ答えを出すようになりました。残っているずれは、どれもロボットが人と同じ通路にいることから出ています。次は、スタッフが少ない店でロボットの効き目が縮む分を、片付け・案内の延びとロボット救出の時間に分けて数えます。そのあと、比較動画の素材のストックを録画し、最初の比較動画を作りました（下の2つの作業ログ）。


## 作業ログ ― 比較動画の素材を、6店 × 11条件の66本、夜に録画した

### データと文章だけでは伝わりにくいので、比較動画を載せていく

ここまでの記録は、表と数字が中心でした。ロボットを足しても入店待ちが縮まらない様子は、数字だけでは伝わりにくいと考え、Unity の店を録画した比較動画を記事に載せていくことにしました。

比較動画は、使いたくなったときにすぐ作れるよう、素材を先にいろいろなパターンで撮って保管しておきます。録画は Mac で Unity を描くので、昼のほかの作業と重ならないよう、夜に回します。

- ねらい：記事やLPで比べたい組み合わせが出たとき、その日のうちに比較動画を作れるようにする
- 変わったこと：6店 × 11条件の録画が手元にそろい、同じ店の11本は同じお客さんの来方（同じ種）で撮ってある
- 見込める効果：比較動画1本を、録画の待ちなしで作れる（④の0台・2台の1本は、録画を選んでから約6分で書き出せた）

| 撮った条件（店ごと） | ロボット |
|---|---|
| 普通の混み具合・真ん中の人数 | 0・1・2台 |
| スタッフが少ない（混み具合は普通） | 0・2台 |
| 混んでいる（真ん中の人数） | 0・2台 |
| スタッフが多い（混み具合は普通） | 0・2台 |
| 空いている（真ん中の人数） | 0・2台 |

### 依頼38「比較動画の素材をストックする」の全文

依頼箱の番号は、はじめ35にしていましたが、ロボットアームの依頼が35〜37を使っていたので、38に付け直しました。21時に「新規」へ移し、21:02 に始まりました。

````markdown
---
作業フォルダ: /Users/shimazueiichi/Robotics_UX/ServiceSim
上限時間: 720
---
# 依頼：比較動画の素材のストックを録画する（6店 × 11条件。夜・2026-10-30）

エイイチと決めたこと：データとテキストだけでは分かりにくいので、比較動画を記事に載せていく。比較動画は、いざというときにすぐ作れるよう、素材をいろいろなパターンで先に撮って保管しておく。録画は昼の作業と重ならないよう、夜に回す。

使うのは今ある録画のしくみ（cs:41〜43 の SimTimeRecorder・RecordBuild。-ssRecord を付けた回だけ動く）。店の回し方・人とロボットの動き・速さ・物理の設定は変えない。

## 始める前に確かめること（違えば手を止めて報告）

1. Unity エディタが起動していない（起動していたら閉じずに報告して終わる）
2. /Volumes/KIOXIA がマウントされている。鍵ファイル unity_ledger_v1.lock がない
3. 台帳 unity_ledger_v1.csv が 1392 行（夜 20261107 のあと）。始める前に archive/unity_ledger_v1_prerec_20261030/ に控え、md5 を報告に書く
4. ServiceSim の保留が 0
5. プロジェクトの params が v2.9・90件（cs:46 の写しのまま）

## A. 録画のしくみに、撮る範囲と粗さの指定を足す（足りなければ）

今の録画は、店の時刻 900〜1650 秒を 0.2 秒ごとに撮る形。素材のストックには次が要る。引数で指定できなければ、SimTimeRecorder.cs（-ssRecord の回だけ動く部品）にだけ足してよい。何も指定しないときの動き（900〜1650 秒・0.2 秒ごと・今の2つの映し方）は変えない。

- 撮る時刻の範囲：**回の最初（0 秒）から全員が帰るまで**
- 撮る間隔：**0.5 秒ごと**（30 コマ/秒の動画で 15 倍速）
- 映し方：全体（店の外寸に 0.8 m の余白。今の映像B）を **幅 2560 画素**（あとで待機場所などを切り抜けるように）。寄り（映像A）は撮らない
- 光：今の録画と同じ（-ssRecSunPitch の既定 75）
- 動画と一緒に、コマ番号 → 店の時刻の対応（今の _frames.csv と同じ形）を書く

足したら、録画用の実行ファイルを今までと同じやり方で作り直し、check-in して保留 0。夜用の実行ファイル（Builds/headless）は触らない。
作り直したら、短い確かめを1回だけ回す（③・真ん中の人数・0台・種0 で 0〜300 秒だけ撮る）。動画が開けて、コマ数と時刻の対応が合うことを見る。この確かめの回は台帳に書かない形で回せるならそうする（書いてしまったら、その行の名前を報告に書く）。

## B. 撮る回（6店 × 11条件 × 種1つ = 66 回）

各店について、種は1つに決める：その店の「普通・真ん中の人数・0台」の夜（③⑦ 20261102・④ 20261030・⑤ 20261103・⑥ 20261104・② 20261105）の種0〜9 のうち、入店待ちが10個の中央値にいちばん近い種。同じ店の11条件は、すべてその種で撮る（同じお客さんの来方で並べて比べられるように）。選んだ種と、その理由の数字を報告に書く。

条件（params の unity_conditions の名前で指定する。すべて今の標準：すれ違い入・待機場所へ戻る入・案B切）：

1. 普通・真ん中の人数：0・1・2台
2. スタッフが少ない（普通）：0・2台
3. 混んでいる（真ん中の人数）：0・2台
4. スタッフが多い（普通）：0・2台
5. 空いている（真ん中の人数）：0・2台

撮る順は上の 1 → 5（朝までに全部終わらなくても、大事な方から揃うように）。店の順は ③⑦④⑤⑥②。

- 回の名前の名札は `rec`（例 20261030_rec_st3_cs{cs}_fam_p1_r2_s{種}_passon_sbret のように、混み具合・人数が普通でない回は今の夜と同じ付け方で区別する）。名前が重ならないことを回す前に確かめる
- 動画は今までどおり、その回の出力フォルダの recordings/ に置く
- 同時に回す本数は、描く重さを見て 2 本までで決めてよい（決めた本数と理由を報告に書く）
- 回ごとの台帳の行と出力（stops.csv・timeline.csv など）は今までどおり書く。動画の中の動きと、その回の数字が一致するようにするため
- 時刻で止めず、並べた回が全部終わるまで回す。途中で止まっても、同じ回を回し直さない（そのまま報告する）
- 回している間は、ほかの作業をしない。Unity を開かない

## C. 素材の一覧を作る

全部終わったら、/Volumes/KIOXIA/r2r2r-data/service_sim/unity/night/20261030_rec/ に次を置く（night/ の下は今までの夜と同じ置き方）。

- `rec_index.csv`：1行1本。列は 店・条件の名前・スタッフ・ロボット台数・来客/時・種・回の名前・動画のパス・解像度・長さ（秒）・コマ数・撮った店の時刻の範囲・入店待ち・席は空いているのに待った・料理の待ち・会計待ち・動けなくなった・ロボット救出・全員が帰ったか
- `README.md`：何を撮ったか、映し方、時刻の対応の読み方、選んだ種

## 変えないもの

- 店の回し方・人とロボットの動き・速さ・Stiffness などの物理の設定
- 夜用の実行ファイル（Builds/headless）・night_runner.py・judge_night.py・make_queue.py
- 台帳の列と今までの行。今までの出力と recordings/

## 報告

依頼箱の結果に加えて、claude_code_reports に 1つ書く（場所：~/Library/Mobile Documents/com~apple~CloudDocs/デスクトップ/ADAPT DESIGN/じぶんの/PixelstoMotors/デジタルツイン学習R2R2R/サービスロボット導入シミュレーション/unity/claude_code_reports/）。

**20261030_rec_stock.txt**
- 始める前の確かめの結果。録画のしくみに足したもの（差分の全文）・cs 番号・build_id・確かめの回の結果
- 店ごとに選んだ種と、その理由の数字
- 66 回の結果（completed の数・失敗・止まった回・最長の実時間・夜全体の始まりと終わり・同時に回した本数）
- 動画の合計の大きさと、1本あたりの長さ・大きさの目安
- 台帳の行数と、先頭 1392 行の md5 が控えと同じか
- rec_index.csv の全文
- 同じ条件の夜（画面なし）の同じ種の回と、入店待ちなどの数字が合っているか（合わなければ、どの回がいくつ違うか。原因は調べなくてよい）
````

### Claude Code の報告 20261030_rec_stock.txt の全文

録画は 21:11 に始まり、翌朝 06:11 に66本とも終わりました（2本ずつ同時・9.0時間）。依頼箱の結果のファイルは、記録を書いた時点ではまだ出ていなかったので、報告ファイルだけを載せます。

```text
====================================================================
比較動画の素材のストックを録画した（6店 × 11条件 × 種1つ = 66 回）
依頼：20261030_38_比較動画の素材をストックする.md
2026-10-30 21:11 〜 10-31 06:11　check-in：cs:49（録画のしくみだけ）　最後の状態：cs:49 head・保留 0
====================================================================

結論

  ・始める前の確かめ5つは、すべて合格だった。
  ・録画のしくみに「回の終わり（全員が帰る）まで撮る」（-ssRecTo end）を足した。SimTimeRecorder.cs だけ。cs:49。
    範囲・間隔・映し方は今までの引数（-ssRecFrom・-ssRecStep・-ssRecView）で指定できたので、足していない。
  ・確かめの回（③・真ん中の人数・0台・種0・0〜300 秒）：601 コマ・0.5 秒ごと・mp4 も 601 コマ。台帳には書かなかった。
  ・66 回とも completed。失敗 0・止まった回 0。同時 2 本。最長の実時間 27.9 分。
  ・動画は合計 2.63 GB。1本 平均 39.9 MB・平均 834 秒（15 倍速）。66 本とも全員が帰るまで撮れた。
  ・台帳 1392 → 1458 行（+66・追記だけ）。先頭 1392 行の md5 は控えと同じ。
  ・種は「入店待ちの中央値にいちばん近い種」だと、6店とも 2 つが同じ近さで並んだ（10 個で偶数のため）。
    番号の小さい方を選んで回した（決めてほしいこと 1）。
  ・画面なしの夜の同じ回と、数字は 66 回とも完全には合わなかった。0台の回は近い（入店待ちの差 中央値 0.09 分）が、
    ロボットのいる回はずれる（最大 8.7 分）（7 章）。


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

  1. Unity エディタ：起動していない（Unity Hub だけ）
  2. /Volumes/KIOXIA：マウントされている。unity_ledger_v1.lock：なし
  3. 台帳 unity_ledger_v1.csv：1392 行・md5 9ba75ab7684e143afd82d2a40344ffcc
     控え：archive/unity_ledger_v1_prerec_20261030/unity_ledger_v1.csv（md5 同じ）
  4. ServiceSim の保留：0（cs:48 head）
  5. params：v2.9・unity_conditions 90 件。cs:46 から cs:48 までに変わったのは SimParams.asset と make_queue.py だけ
     （params は cs:46 の写しのまま）
  名前の重なり：20261030_rec* のフォルダ・台帳の行はなかった。66 本の名前も重ならない


====================================================================
2. 録画のしくみに足したもの（cs:49）
====================================================================

  変えたのは Assets/ServiceSim/Recording/SimTimeRecorder.cs だけ（-ssRecord の回だけ動く部品）。
  ・-ssRecTo end：撮る範囲の終わりを決めず、回が終わる（全員が帰る。帰らなければ打ち切り）まで撮る
  ・撮り始めたあとで回が終わったら（ExperimentRunner の _jobRunning が切になったら）、そこで ffmpeg を閉じ、
    _frames.csv を書く。今までは終了のとき（OnApplicationQuit）に閉じていた
  ・何も指定しないとき（900〜1650 秒・0.2 秒ごと・指定した映し方）は今までと同じ
  ・撮る時刻 0 秒から・0.5 秒ごと・幅 2560 の全体だけ、は今までの引数で指定した（コードは足していない）

  差分の全文（cs:48 → cs:49）
  --- /tmp/SimTimeRecorder_cs48.cs	2026-10-30 21:07:31
  +++ Assets/ServiceSim/Recording/SimTimeRecorder.cs	2026-10-30 21:07:31
  @@ -33,6 +33,8 @@
       /// 引数
       ///   -ssRecord {名前の頭}     … mp4 の名前の頭（例 20261029_1930_lpdemo_after）
       ///   -ssRecFrom 900 -ssRecTo 1650 -ssRecStep 0.2
  +    ///   -ssRecTo end                      … 回の終わり（全員が帰って回が終わる）まで撮る
  +    ///                                       （2026-10-30・依頼 38「比較動画の素材をストックする」）
       ///   -ssRecFps 30 -ssRecCrf 16
       ///   -ssRecFfmpeg {ffmpeg のパス}
       ///   -ssRecView name,x0,x1,y0,y1,w,h   … 撮る範囲（店の座標 m）と大きさ。何本でも
  @@ -68,6 +70,7 @@
   
           string _prefix = "", _ffmpeg = "ffmpeg";
           float _from = 900f, _to = 1650f, _step = 0.2f;
  +        bool _toEnd;                                // -ssRecTo end（回の終わりまで撮る。依頼 38）
           int _fps = 30, _crf = 16;
           float _sunPitch = DefaultSunPitch;
           float _stillAt = -1f;                       // 0 以上なら静止画だけ書く回
  @@ -103,7 +106,8 @@
               _prefix = Find(argv, "-ssRecord") ?? "";
               _ffmpeg = Find(argv, "-ssRecFfmpeg") ?? "ffmpeg";
               _from = F(Find(argv, "-ssRecFrom"), _from);
  -            _to = F(Find(argv, "-ssRecTo"), _to);
  +            _toEnd = Find(argv, "-ssRecTo") == "end";
  +            _to = _toEnd ? float.PositiveInfinity : F(Find(argv, "-ssRecTo"), _to);
               _step = F(Find(argv, "-ssRecStep"), _step);
               _fps = (int)F(Find(argv, "-ssRecFps"), _fps);
               _crf = (int)F(Find(argv, "-ssRecCrf"), _crf);
  @@ -153,7 +157,7 @@
                       "°・" + _views.Count + " 本。書いたら回を途中で終えます");
                   return;
               }
  -            Log("撮ります: 店の時刻 " + _from + "〜" + _to + " 秒・" + _step + " 秒ごと・" + _fps + " コマ/秒・CRF " + _crf +
  +            Log("撮ります: 店の時刻 " + _from + "〜" + (_toEnd ? "回の終わり" : _to + " 秒") + "・" + _step + " 秒ごと・" + _fps + " コマ/秒・CRF " + _crf +
                   "・" + _views.Count + " 本");
           }
   
  @@ -164,7 +168,12 @@
               if (_runner == null) _runner = FindObjectOfType<ExperimentRunner>();
               if (_headless == null) _headless = FindObjectOfType<HeadlessRun>();
               if (_runner == null || _headless == null) return;
  -            if (!(bool)_fJobRunning.GetValue(_runner)) return;
  +            if (!(bool)_fJobRunning.GetValue(_runner))
  +            {
  +                // 撮り始めたあとで回が終わったら、そこで閉じる（-ssRecTo end のとき。依頼 38）
  +                if (_started) Close();
  +                return;
  +            }
   
               float t = Time.time - (float)_fOffset.GetValue(_runner);
               float target = _from + _next * _step;

  cs:49　コメント「依頼38：録画のしくみに -ssRecTo end（回の終わり＝全員が帰るまで撮る）を足す …」
  実行ファイル：Builds/rec3_stock49（RecordBuild.Build・今までと同じ作り方）
    build_id cs49_20261030_2108・unity_cs ServiceSim/cs:49・pending_changes なし
  夜用の Builds/headless は触っていない（10-30 11:47 のまま）

  確かめの回（③ fam_p1_s4_r0_a42・種0・すれ違い入・待機場所へ戻る入・案B切・0〜300 秒）
    20261030_rectest_cs49_fam_p1_r0_s0_passon_sbret/recordings/
      …_whole.mp4　2560×1760・h264・yuv420p・30/1・601 コマ・20.03 秒・481,181 バイト
      …_whole_frames.csv　601 行・0.0 → 300.0 秒・間はすべて 0.5 秒・frame は 0〜600 の連番
    撮り終わったところで回を止めた（SIGTERM）。台帳には書かれていない（1392 行・md5 同じ）。
    途中までの記録は 20261030_rectest_cs49_fam_p1_r0_s0_passon_sbret_stopped/ に残る
    1コマ取り出して見た：店全体・余白・人・ロボットが映っている
  「回の終わりまで」の確かめは、本番の1本目（③普通0台）で行った：23,519 コマ・0〜11,759 秒・0.5 秒ごと・mp4 と同じコマ数


====================================================================
3. 店ごとに選んだ種
====================================================================

  決め方：その店の「普通・真ん中の人数・0台」の夜の種 0〜9 の入店待ち（台帳 entry_wait_mean）の中央値に、いちばん近い種。
  10 個なので中央値は真ん中の 2 つの平均。どの店でも 2 つの種が同じ近さで並んだ（台帳の 4 桁の丸めで、差は 0.0001 以下）。
  番号の小さい方を選んだ。

  ③ fam_p1（20261102_night_cs34）中央値 4.0891　種7 3.9766 ／ 種8 4.2015 → 種7
     種0〜9：1.5098 3.9687 12.8086 1.6199 8.9696 1.6093 14.8045 3.9766 4.2015 8.1883
  ⑦ fam_p5（20261102_night_cs34）中央値 4.4922　種7 4.3360 ／ 種8 4.6483 → 種7
     種0〜9：1.5465 4.3139 13.1807 1.7095 9.7350 1.5871 15.2534 4.3360 4.6483 8.3898
  ④ fam_p2（20261030_night_cs29）中央値 12.9501　種1 14.3356 ／ 種8 11.5645 → 種1
     種0〜9：6.6068 14.3356 30.0650 9.8339 20.3303 4.7029 16.9468 6.7014 11.5645 15.4319
  ⑤ fam_p3（20261103_night_cs36）中央値 8.1423　種1 8.2575 ／ 種7 8.0271 → 種1
     種0〜9：1.7883 8.2575 16.8587 2.7355 13.8823 2.1640 20.0669 8.0271 6.6006 12.5153
  ⑥ fam_p4（20261104_night_cs38）中央値 9.6024　種1 9.5294 ／ 種8 9.6753 → 種1
     種0〜9：1.8651 9.5294 20.3839 5.0889 15.1933 1.5776 21.8371 8.1129 9.6753 15.9068
  ② fam_p0（20261105_night_cs40）中央値 1.9610　種8 1.7778 ／ 種9 2.1442 → 種8
     種0〜9：1.3470 9.0247 8.2742 6.5495 8.4018 1.3871 1.2496 1.3457 1.7778 2.1442

  ※ 種を選ぶのに使った夜は、②以外は今と違う店の形の版（③⑦ 39257d16b68a・④ 25e420d53394・⑤ d7bb919590d4・
    ⑥ 2e9fc773050a）。④の 20261030 は待機場所へ戻る 切。依頼どおりこの夜を使った


====================================================================
4. 66 回の結果
====================================================================

  回し方：tools/night_runner.py を変えずに読み込み、実行ファイルを起こすときの引数だけを差し替える実行係
    （night/20261030_rec/rec_runner.py）。-nographics を外し、録画の引数を足した
      -ssRecord {回の名前} -ssRecFrom 0 -ssRecTo end -ssRecStep 0.5 -ssRecView whole,{店の外寸＋0.8 m},2560,{高さ}
      光は -ssRecSunPitch を付けない（既定 75）
    台帳・runs.csv・runner_log.txt・judge の呼び方は night_runner.py のまま。--no-retry（やり直さない）・上限 90 分
  同時に回した本数：2 本
    理由：依頼の上限。確かめの回で、描く重さは1本でも小さかった（店の 300 秒を実時間 約 20 秒）。
    1本だと全体が 18 時間ほどになり朝までに終わらないので、上限の 2 本にした
  completed 66 ／ 失敗 0 ／ 止まった 0 ／ 台帳に書けなかった 0
  実時間：平均 16.2 分・最長 27.9 分
  夜全体：始まり 2026-10-30 21:11:22 ／ 終わり 2026-10-31 06:11:20（9.0 時間）
  全員が帰った：66 回とも（台帳 everyone_left = 1）
  judge_night.py も、今までどおり最後に呼ばれた（night/20261030_rec/judge.md）


====================================================================
5. 動画の大きさと長さ
====================================================================

  66 本の合計：2,632,170,368 バイト（2.63 GB）
  1本：19.6〜58.7 MB（平均 39.9 MB）・674〜1,521 秒（平均 834 秒＝約 14 分）・30 コマ/秒
  66 本とも、mp4 のコマ数と _frames.csv の行数が同じで、時刻の間はすべて 0.5 秒
  撮った最後の時刻は、台帳の「店の時間 × 60」と −55〜+44 秒ずれる（理由は調べていない）


====================================================================
6. 台帳
====================================================================

  行数：1392 → 1458（+66・追記だけ。66 行とも completed・unity_cs ServiceSim/cs:49・08db8a0d067c・v2.9）
  先頭 1392 行の md5：9ba75ab7684e143afd82d2a40344ffcc（控えと同じ）
  鍵ファイルは残っていない。確かめの回の行はない


====================================================================
7. rec_index.csv の全文
====================================================================

  置き場所：/Volumes/KIOXIA/r2r2r-data/service_sim/unity/night/20261030_rec/rec_index.csv
  （待ちは分。「席は空いているのに待った」＝ staff_wait_mean。「動けなくなった」＝ stuck_count。「ロボット救出」＝ rescues）

店,条件の名前,条件の種類,スタッフ,ロボット台数,来客/時,種,回の名前,動画のパス,解像度,長さ（秒）,コマ数,撮った店の時刻の範囲（秒）,入店待ち（分）,席は空いているのに待った（分）,料理の待ち（分）,会計待ち（分）,動けなくなった（回）,ロボット救出（回）,全員が帰ったか,店の時間（分）,大きさ（バイト）
③,fam_p1_s4_r0_a42,普通・真ん中の人数,4,0,42,7,20261030_rec_cs49_fam_p1_r0_s7_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_cs49_fam_p1_r0_s7_passon_sbret/recordings/20261030_rec_cs49_fam_p1_r0_s7_passon_sbret_whole.mp4,2560x1760,783.97,23519,0〜11759,3.9801,2.0021,1.0511,8.1084,0,0,はい,195.5374,41767148
③,fam_p1_s4_r1_a42,普通・真ん中の人数,4,1,42,7,20261030_rec_cs49_fam_p1_r1_s7_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_cs49_fam_p1_r1_s7_passon_sbret/recordings/20261030_rec_cs49_fam_p1_r1_s7_passon_sbret_whole.mp4,2560x1760,800.60,24018,0〜12008.5,3.2931,1.0272,2.4784,9.9731,1,1,はい,199.682,44647103
③,fam_p1_s4_r2_a42,普通・真ん中の人数,4,2,42,7,20261030_rec_cs49_fam_p1_r2_s7_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_cs49_fam_p1_r2_s7_passon_sbret/recordings/20261030_rec_cs49_fam_p1_r2_s7_passon_sbret_whole.mp4,2560x1760,785.13,23554,0〜11776.5,3.5402,1.5129,1.854,7.9314,12,12,はい,195.8263,47100568
⑦,fam_p5_s4_r0_a42,普通・真ん中の人数,4,0,42,7,20261030_rec_cs49_fam_p5_r0_s7_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_cs49_fam_p5_r0_s7_passon_sbret/recordings/20261030_rec_cs49_fam_p5_r0_s7_passon_sbret_whole.mp4,2560x1760,777.30,23319,0〜11659,4.1402,2.2566,0.9695,7.2536,0,0,はい,193.8731,41490550
⑦,fam_p5_s4_r1_a42,普通・真ん中の人数,4,1,42,7,20261030_rec_cs49_fam_p5_r1_s7_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_cs49_fam_p5_r1_s7_passon_sbret/recordings/20261030_rec_cs49_fam_p5_r1_s7_passon_sbret_whole.mp4,2560x1760,798.23,23947,0〜11973,3.3274,0.9699,2.4558,9.9253,3,3,はい,199.0926,44916695
⑦,fam_p5_s4_r2_a42,普通・真ん中の人数,4,2,42,7,20261030_rec_cs49_fam_p5_r2_s7_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_cs49_fam_p5_r2_s7_passon_sbret/recordings/20261030_rec_cs49_fam_p5_r2_s7_passon_sbret_whole.mp4,2560x1760,804.03,24121,0〜12060,3.1895,0.7285,1.8073,11.6992,18,18,はい,200.5337,48126366
④,fam_p2_s2_r0_a28,普通・真ん中の人数,2,0,28,1,20261030_rec_cs49_fam_p2_r0_s1_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_cs49_fam_p2_r0_s1_passon_sbret/recordings/20261030_rec_cs49_fam_p2_r0_s1_passon_sbret_whole.mp4,2560x1872,804.63,24139,0〜12069,14.1861,12.43,1.3332,1.9276,0,0,はい,200.6806,34411703
④,fam_p2_s2_r1_a28,普通・真ん中の人数,2,1,28,1,20261030_rec_cs49_fam_p2_r1_s1_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_cs49_fam_p2_r1_s1_passon_sbret/recordings/20261030_rec_cs49_fam_p2_r1_s1_passon_sbret_whole.mp4,2560x1872,782.07,23462,0〜11730.5,11.5955,9.6754,1.7934,2.2959,5,5,はい,195.0626,37131653
④,fam_p2_s2_r2_a28,普通・真ん中の人数,2,2,28,1,20261030_rec_cs49_fam_p2_r2_s1_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_cs49_fam_p2_r2_s1_passon_sbret/recordings/20261030_rec_cs49_fam_p2_r2_s1_passon_sbret_whole.mp4,2560x1872,926.30,27789,0〜13894,21.9539,19.9801,2.8905,4.5579,66,69,はい,230.9784,44184139
⑤,fam_p3_s4_r0_a46,普通・真ん中の人数,4,0,46,1,20261030_rec_cs49_fam_p3_r0_s1_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_cs49_fam_p3_r0_s1_passon_sbret/recordings/20261030_rec_cs49_fam_p3_r0_s1_passon_sbret_whole.mp4,2560x1726,807.33,24220,0〜12109.5,8.2583,7.1261,0.9979,5.79,0,0,はい,201.3521,41833316
⑤,fam_p3_s4_r1_a46,普通・真ん中の人数,4,1,46,1,20261030_rec_cs49_fam_p3_r1_s1_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_cs49_fam_p3_r1_s1_passon_sbret/recordings/20261030_rec_cs49_fam_p3_r1_s1_passon_sbret_whole.mp4,2560x1726,803.70,24111,0〜12055,6.8672,5.5636,2.5585,6.3255,1,1,はい,200.4531,45783217
⑤,fam_p3_s4_r2_a46,普通・真ん中の人数,4,2,46,1,20261030_rec_cs49_fam_p3_r2_s1_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_cs49_fam_p3_r2_s1_passon_sbret/recordings/20261030_rec_cs49_fam_p3_r2_s1_passon_sbret_whole.mp4,2560x1726,817.43,24523,0〜12261,9.1132,7.5618,1.8283,7.6013,20,20,はい,203.8722,49350074
⑥,fam_p4_s3_r0_a38,普通・真ん中の人数,3,0,38,1,20261030_rec_cs49_fam_p4_r0_s1_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_cs49_fam_p4_r0_s1_passon_sbret/recordings/20261030_rec_cs49_fam_p4_r0_s1_passon_sbret_whole.mp4,2560x1860,780.87,23426,0〜11712.5,9.5783,8.3827,1.163,3.6201,0,0,はい,194.763,34207463
⑥,fam_p4_s3_r1_a38,普通・真ん中の人数,3,1,38,1,20261030_rec_cs49_fam_p4_r1_s1_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_cs49_fam_p4_r1_s1_passon_sbret/recordings/20261030_rec_cs49_fam_p4_r1_s1_passon_sbret_whole.mp4,2560x1860,739.80,22194,0〜11096.5,6.6071,5.4306,2.4765,2.6862,7,7,はい,184.5372,35678668
⑥,fam_p4_s3_r2_a38,普通・真ん中の人数,3,2,38,1,20261030_rec_cs49_fam_p4_r2_s1_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_cs49_fam_p4_r2_s1_passon_sbret/recordings/20261030_rec_cs49_fam_p4_r2_s1_passon_sbret_whole.mp4,2560x1860,726.37,21791,0〜10895,5.1363,3.9347,1.2401,3.2882,15,15,はい,181.192,37584314
②,fam_p0_s2_r0_a19,普通・真ん中の人数,2,0,19,8,20261030_rec_cs49_fam_p0_r0_s8_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_cs49_fam_p0_r0_s8_passon_sbret/recordings/20261030_rec_cs49_fam_p0_r0_s8_passon_sbret_whole.mp4,2560x2080,700.67,21020,0〜10509.5,1.7763,0.7155,1.05,1.0793,0,0,はい,174.7921,22470869
②,fam_p0_s2_r1_a19,普通・真ん中の人数,2,1,19,8,20261030_rec_cs49_fam_p0_r1_s8_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_cs49_fam_p0_r1_s8_passon_sbret/recordings/20261030_rec_cs49_fam_p0_r1_s8_passon_sbret_whole.mp4,2560x2080,688.60,20658,0〜10328.5,1.3789,0.2651,1.0256,0.832,0,0,はい,171.7881,24230036
②,fam_p0_s2_r2_a19,普通・真ん中の人数,2,2,19,8,20261030_rec_cs49_fam_p0_r2_s8_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_cs49_fam_p0_r2_s8_passon_sbret/recordings/20261030_rec_cs49_fam_p0_r2_s8_passon_sbret_whole.mp4,2560x2080,679.97,20399,0〜10199,1.4074,0.2963,1.3219,1.0696,16,16,はい,169.6348,25184989
③,fam_p1_s3_r0_a42,スタッフが少ない,3,0,42,7,20261030_rec_st3_cs49_fam_p1_r0_s7_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_st3_cs49_fam_p1_r0_s7_passon_sbret/recordings/20261030_rec_st3_cs49_fam_p1_r0_s7_passon_sbret_whole.mp4,2560x1760,900.07,27002,0〜13500.5,15.0605,12.822,1.3427,3.7565,0,0,はい,224.449,42446092
③,fam_p1_s3_r2_a42,スタッフが少ない,3,2,42,7,20261030_rec_st3_cs49_fam_p1_r2_s7_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_st3_cs49_fam_p1_r2_s7_passon_sbret/recordings/20261030_rec_st3_cs49_fam_p1_r2_s7_passon_sbret_whole.mp4,2560x1760,807.83,24235,0〜12117,6.3154,4.1662,1.3493,6.2592,7,7,はい,201.4824,45261541
⑦,fam_p5_s3_r0_a42,スタッフが少ない,3,0,42,7,20261030_rec_st3_cs49_fam_p5_r0_s7_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_st3_cs49_fam_p5_r0_s7_passon_sbret/recordings/20261030_rec_st3_cs49_fam_p5_r0_s7_passon_sbret_whole.mp4,2560x1760,906.13,27184,0〜13591.5,15.2384,12.982,1.3736,3.7987,0,0,はい,225.9573,42842295
⑦,fam_p5_s3_r2_a42,スタッフが少ない,3,2,42,7,20261030_rec_st3_cs49_fam_p5_r2_s7_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_st3_cs49_fam_p5_r2_s7_passon_sbret/recordings/20261030_rec_st3_cs49_fam_p5_r2_s7_passon_sbret_whole.mp4,2560x1760,862.67,25880,0〜12939.5,9.6145,6.6648,1.8874,7.9872,24,24,はい,215.1322,48058179
④,fam_p2_s1_r0_a28,スタッフが少ない,1,0,28,1,20261030_rec_st1_cs49_fam_p2_r0_s1_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_st1_cs49_fam_p2_r0_s1_passon_sbret/recordings/20261030_rec_st1_cs49_fam_p2_r0_s1_passon_sbret_whole.mp4,2560x1872,1412.50,42375,0〜21187,61.7806,51.4775,6.1955,7.8653,0,0,はい,353.6016,43818740
④,fam_p2_s1_r2_a28,スタッフが少ない,1,2,28,1,20261030_rec_st1_cs49_fam_p2_r2_s1_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_st1_cs49_fam_p2_r2_s1_passon_sbret/recordings/20261030_rec_st1_cs49_fam_p2_r2_s1_passon_sbret_whole.mp4,2560x1872,1520.77,45623,0〜22811,79.9679,63.7658,2.9508,11.2174,33,33,はい,381.0962,52654667
⑤,fam_p3_s3_r0_a46,スタッフが少ない,3,0,46,1,20261030_rec_st3_cs49_fam_p3_r0_s1_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_st3_cs49_fam_p3_r0_s1_passon_sbret/recordings/20261030_rec_st3_cs49_fam_p3_r0_s1_passon_sbret_whole.mp4,2560x1726,967.37,29021,0〜14510,21.8155,20.6136,1.2836,5.2395,0,0,はい,241.2042,44317568
⑤,fam_p3_s3_r2_a46,スタッフが少ない,3,2,46,1,20261030_rec_st3_cs49_fam_p3_r2_s1_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_st3_cs49_fam_p3_r2_s1_passon_sbret/recordings/20261030_rec_st3_cs49_fam_p3_r2_s1_passon_sbret_whole.mp4,2560x1726,1039.10,31173,0〜15586,18.5255,16.8999,2.5086,6.1946,23,23,はい,259.0733,53634149
⑥,fam_p4_s2_r0_a38,スタッフが少ない,2,0,38,1,20261030_rec_st2_cs49_fam_p4_r0_s1_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_st2_cs49_fam_p4_r0_s1_passon_sbret/recordings/20261030_rec_st2_cs49_fam_p4_r0_s1_passon_sbret_whole.mp4,2560x1860,1070.27,32108,0〜16053.5,30.0651,28.8483,2.2329,4.1787,0,0,はい,266.8287,38319585
⑥,fam_p4_s2_r2_a38,スタッフが少ない,2,2,38,1,20261030_rec_st2_cs49_fam_p4_r2_s1_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_st2_cs49_fam_p4_r2_s1_passon_sbret/recordings/20261030_rec_st2_cs49_fam_p4_r2_s1_passon_sbret_whole.mp4,2560x1860,948.00,28440,0〜14219.5,20.6423,19.4651,1.333,3.8478,20,20,はい,236.3847,40604800
②,fam_p0_s1_r0_a19,スタッフが少ない,1,0,19,8,20261030_rec_st1_cs49_fam_p0_r0_s8_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_st1_cs49_fam_p0_r0_s8_passon_sbret/recordings/20261030_rec_st1_cs49_fam_p0_r0_s8_passon_sbret_whole.mp4,2560x2080,1009.90,30297,0〜15148,25.5285,23.5951,2.8008,2.5804,0,0,はい,251.8026,27016072
②,fam_p0_s1_r2_a19,スタッフが少ない,1,2,19,8,20261030_rec_st1_cs49_fam_p0_r2_s8_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_st1_cs49_fam_p0_r2_s8_passon_sbret/recordings/20261030_rec_st1_cs49_fam_p0_r2_s8_passon_sbret_whole.mp4,2560x2080,969.07,29072,0〜14535.5,24.4109,21.4884,1.655,3.3393,23,23,はい,241.6317,29706860
③,fam_p1_s4_r0_a54,混んでいる,4,0,54,7,20261030_rec_a54_cs49_fam_p1_r0_s7_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_a54_cs49_fam_p1_r0_s7_passon_sbret/recordings/20261030_rec_a54_cs49_fam_p1_r0_s7_passon_sbret_whole.mp4,2560x1760,876.73,26302,0〜13150.5,17.6014,8.4007,1.0009,4.9054,0,0,はい,218.6352,49232124
③,fam_p1_s4_r2_a54,混んでいる,4,2,54,7,20261030_rec_a54_cs49_fam_p1_r2_s7_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_a54_cs49_fam_p1_r2_s7_passon_sbret/recordings/20261030_rec_a54_cs49_fam_p1_r2_s7_passon_sbret_whole.mp4,2560x1760,885.43,26563,0〜13281,17.4191,7.5907,1.5753,5.0083,26,26,はい,220.8058,56524156
⑦,fam_p5_s4_r0_a54,混んでいる,4,0,54,7,20261030_rec_a54_cs49_fam_p5_r0_s7_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_a54_cs49_fam_p5_r0_s7_passon_sbret/recordings/20261030_rec_a54_cs49_fam_p5_r0_s7_passon_sbret_whole.mp4,2560x1760,886.77,26603,0〜13301,19.1257,9.5727,1.1162,4.5353,0,0,はい,221.1395,50284058
⑦,fam_p5_s4_r2_a54,混んでいる,4,2,54,7,20261030_rec_a54_cs49_fam_p5_r2_s7_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_a54_cs49_fam_p5_r2_s7_passon_sbret/recordings/20261030_rec_a54_cs49_fam_p5_r2_s7_passon_sbret_whole.mp4,2560x1760,864.27,25928,0〜12963.5,12.6098,3.0638,1.6162,9.0576,17,17,はい,215.5323,56691738
④,fam_p2_s2_r0_a36,混んでいる,2,0,36,1,20261030_rec_a36_cs49_fam_p2_r0_s1_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_a36_cs49_fam_p2_r0_s1_passon_sbret/recordings/20261030_rec_a36_cs49_fam_p2_r0_s1_passon_sbret_whole.mp4,2560x1872,1037.33,31120,0〜15559.5,34.1523,22.4633,1.3468,2.4445,0,0,はい,258.6308,45811954
④,fam_p2_s2_r2_a36,混んでいる,2,2,36,1,20261030_rec_a36_cs49_fam_p2_r2_s1_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_a36_cs49_fam_p2_r2_s1_passon_sbret/recordings/20261030_rec_a36_cs49_fam_p2_r2_s1_passon_sbret_whole.mp4,2560x1872,1189.47,35684,0〜17841.5,47.1437,31.5688,2.5808,4.2733,71,71,はい,296.9762,58343369
⑤,fam_p3_s4_r0_a59,混んでいる,4,0,59,1,20261030_rec_a59_cs49_fam_p3_r0_s1_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_a59_cs49_fam_p3_r0_s1_passon_sbret/recordings/20261030_rec_a59_cs49_fam_p3_r0_s1_passon_sbret_whole.mp4,2560x1726,936.60,28098,0〜14048.5,22.0505,11.4166,1.0916,7.7634,0,0,はい,233.5417,50351948
⑤,fam_p3_s4_r2_a59,混んでいる,4,2,59,1,20261030_rec_a59_cs49_fam_p3_r2_s1_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_a59_cs49_fam_p3_r2_s1_passon_sbret/recordings/20261030_rec_a59_cs49_fam_p3_r2_s1_passon_sbret_whole.mp4,2560x1726,903.33,27100,0〜13549.5,19.6037,7.5639,1.7348,10.3151,13,13,はい,225.265,58672479
⑥,fam_p4_s3_r0_a49,混んでいる,3,0,49,1,20261030_rec_a49_cs49_fam_p4_r0_s1_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_a49_cs49_fam_p4_r0_s1_passon_sbret/recordings/20261030_rec_a49_cs49_fam_p4_r0_s1_passon_sbret_whole.mp4,2560x1860,1003.10,30093,0〜15046,28.7431,17.5473,1.1776,5.1367,0,0,はい,250.1051,45200718
⑥,fam_p4_s3_r2_a49,混んでいる,3,2,49,1,20261030_rec_a49_cs49_fam_p4_r2_s1_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_a49_cs49_fam_p4_r2_s1_passon_sbret/recordings/20261030_rec_a49_cs49_fam_p4_r2_s1_passon_sbret_whole.mp4,2560x1860,888.83,26665,0〜13332,19.9169,10.6488,1.4769,4.5413,10,10,はい,221.6517,49908561
②,fam_p0_s2_r0_a24,混んでいる,2,0,24,8,20261030_rec_a24_cs49_fam_p0_r0_s8_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_a24_cs49_fam_p0_r0_s8_passon_sbret/recordings/20261030_rec_a24_cs49_fam_p0_r0_s8_passon_sbret_whole.mp4,2560x2080,808.30,24249,0〜12124,11.1384,6.026,1.0602,1.0668,0,0,はい,201.5995,27658198
②,fam_p0_s2_r2_a24,混んでいる,2,2,24,8,20261030_rec_a24_cs49_fam_p0_r2_s8_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_a24_cs49_fam_p0_r2_s8_passon_sbret/recordings/20261030_rec_a24_cs49_fam_p0_r2_s8_passon_sbret_whole.mp4,2560x2080,778.30,23349,0〜11674,10.8543,5.7123,1.793,1.4813,19,19,はい,194.1255,31450497
③,fam_p1_s5_r0_a42,スタッフが多い,5,0,42,7,20261030_rec_st5_cs49_fam_p1_r0_s7_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_st5_cs49_fam_p1_r0_s7_passon_sbret/recordings/20261030_rec_st5_cs49_fam_p1_r0_s7_passon_sbret_whole.mp4,2560x1760,802.83,24085,0〜12042,2.3461,0.4365,0.5268,11.7169,0,0,はい,200.2348,43271454
③,fam_p1_s5_r2_a42,スタッフが多い,5,2,42,7,20261030_rec_st5_cs49_fam_p1_r2_s7_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_st5_cs49_fam_p1_r2_s7_passon_sbret/recordings/20261030_rec_st5_cs49_fam_p1_r2_s7_passon_sbret_whole.mp4,2560x1760,803.73,24112,0〜12055.5,2.8198,0.7046,1.4689,11.6731,6,6,はい,200.459,48371206
⑦,fam_p5_s5_r0_a42,スタッフが多い,5,0,42,7,20261030_rec_st5_cs49_fam_p5_r0_s7_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_st5_cs49_fam_p5_r0_s7_passon_sbret/recordings/20261030_rec_st5_cs49_fam_p5_r0_s7_passon_sbret_whole.mp4,2560x1760,795.70,23871,0〜11935,2.2629,0.5178,0.5669,10.7878,0,0,はい,198.4568,43399004
⑦,fam_p5_s5_r2_a42,スタッフが多い,5,2,42,7,20261030_rec_st5_cs49_fam_p5_r2_s7_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_st5_cs49_fam_p5_r2_s7_passon_sbret/recordings/20261030_rec_st5_cs49_fam_p5_r2_s7_passon_sbret_whole.mp4,2560x1760,799.03,23971,0〜11985,3.2072,1.0182,2.385,11.1358,24,24,はい,199.2894,50882685
④,fam_p2_s3_r0_a28,スタッフが多い,3,0,28,1,20261030_rec_st3_cs49_fam_p2_r0_s1_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_st3_cs49_fam_p2_r0_s1_passon_sbret/recordings/20261030_rec_st3_cs49_fam_p2_r0_s1_passon_sbret_whole.mp4,2560x1872,678.37,20351,0〜10175,3.9598,2.2606,0.8666,2.2452,0,0,はい,169.2356,33673327
④,fam_p2_s3_r2_a28,スタッフが多い,3,2,28,1,20261030_rec_st3_cs49_fam_p2_r2_s1_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_st3_cs49_fam_p2_r2_s1_passon_sbret/recordings/20261030_rec_st3_cs49_fam_p2_r2_s1_passon_sbret_whole.mp4,2560x1872,773.53,23206,0〜11602.5,12.6075,10.6151,3.3269,5.1549,56,56,はい,192.9409,43236173
⑤,fam_p3_s5_r0_a46,スタッフが多い,5,0,46,1,20261030_rec_st5_cs49_fam_p3_r0_s1_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_st5_cs49_fam_p3_r0_s1_passon_sbret/recordings/20261030_rec_st5_cs49_fam_p3_r0_s1_passon_sbret_whole.mp4,2560x1726,800.83,24025,0〜12012,1.8941,0.7233,0.7994,12.8012,0,0,はい,199.7343,43162701
⑤,fam_p3_s5_r2_a46,スタッフが多い,5,2,46,1,20261030_rec_st5_cs49_fam_p3_r2_s1_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_st5_cs49_fam_p3_r2_s1_passon_sbret/recordings/20261030_rec_st5_cs49_fam_p3_r2_s1_passon_sbret_whole.mp4,2560x1726,815.47,24464,0〜12231.5,2.6887,1.2471,1.703,13.8651,6,6,はい,203.3792,50962409
⑥,fam_p4_s4_r0_a38,スタッフが多い,4,0,38,1,20261030_rec_st4_cs49_fam_p4_r0_s1_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_st4_cs49_fam_p4_r0_s1_passon_sbret/recordings/20261030_rec_st4_cs49_fam_p4_r0_s1_passon_sbret_whole.mp4,2560x1860,688.57,20657,0〜10328,1.8604,0.6745,0.9048,3.717,0,0,はい,171.7756,32716523
⑥,fam_p4_s4_r2_a38,スタッフが多い,4,2,38,1,20261030_rec_st4_cs49_fam_p4_r2_s1_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_st4_cs49_fam_p4_r2_s1_passon_sbret/recordings/20261030_rec_st4_cs49_fam_p4_r2_s1_passon_sbret_whole.mp4,2560x1860,693.63,20809,0〜10404,1.8251,0.6023,1.2121,4.1633,5,5,はい,173.0415,37151509
②,fam_p0_s3_r0_a19,スタッフが多い,3,0,19,8,20261030_rec_st3_cs49_fam_p0_r0_s8_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_st3_cs49_fam_p0_r0_s8_passon_sbret/recordings/20261030_rec_st3_cs49_fam_p0_r0_s8_passon_sbret_whole.mp4,2560x2080,683.07,20492,0〜10245.5,1.2065,0.1317,0.5211,0.7812,0,0,はい,170.4118,22748491
②,fam_p0_s3_r2_a19,スタッフが多い,3,2,19,8,20261030_rec_st3_cs49_fam_p0_r2_s8_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_st3_cs49_fam_p0_r2_s8_passon_sbret/recordings/20261030_rec_st3_cs49_fam_p0_r2_s8_passon_sbret_whole.mp4,2560x2080,689.83,20695,0〜10347,1.2001,0.0886,0.7947,0.7919,5,5,はい,172.0935,26666179
③,fam_p1_s4_r0_a30,空いている,4,0,30,7,20261030_rec_a30_cs49_fam_p1_r0_s7_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_a30_cs49_fam_p1_r0_s7_passon_sbret/recordings/20261030_rec_a30_cs49_fam_p1_r0_s7_passon_sbret_whole.mp4,2560x1760,716.53,21496,0〜10747.5,1.2561,0.0778,0.5905,4.2558,0,0,はい,178.7424,32467102
③,fam_p1_s4_r2_a30,空いている,4,2,30,7,20261030_rec_a30_cs49_fam_p1_r2_s7_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_a30_cs49_fam_p1_r2_s7_passon_sbret/recordings/20261030_rec_a30_cs49_fam_p1_r2_s7_passon_sbret_whole.mp4,2560x1760,793.13,23794,0〜11896.5,1.4555,0.2363,2.7794,4.9148,5,5,はい,197.821,38740124
⑦,fam_p5_s4_r0_a30,空いている,4,0,30,7,20261030_rec_a30_cs49_fam_p5_r0_s7_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_a30_cs49_fam_p5_r0_s7_passon_sbret/recordings/20261030_rec_a30_cs49_fam_p5_r0_s7_passon_sbret_whole.mp4,2560x1760,715.63,21469,0〜10734,1.2707,0.0879,0.5981,4.0751,0,0,はい,178.52,32821458
⑦,fam_p5_s4_r2_a30,空いている,4,2,30,7,20261030_rec_a30_cs49_fam_p5_r2_s7_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_a30_cs49_fam_p5_r2_s7_passon_sbret/recordings/20261030_rec_a30_cs49_fam_p5_r2_s7_passon_sbret_whole.mp4,2560x1760,718.23,21547,0〜10773,1.2794,0.0697,1.0835,4.087,5,5,はい,179.165,37160625
④,fam_p2_s2_r0_a20,空いている,2,0,20,1,20261030_rec_a20_cs49_fam_p2_r0_s1_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_a20_cs49_fam_p2_r0_s1_passon_sbret/recordings/20261030_rec_a20_cs49_fam_p2_r0_s1_passon_sbret_whole.mp4,2560x1872,700.77,21023,0〜10511,2.7245,1.5651,1.33,2.0811,0,0,はい,174.817,25538119
④,fam_p2_s2_r2_a20,空いている,2,2,20,1,20261030_rec_a20_cs49_fam_p2_r2_s1_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_a20_cs49_fam_p2_r2_s1_passon_sbret/recordings/20261030_rec_a20_cs49_fam_p2_r2_s1_passon_sbret_whole.mp4,2560x1872,753.63,22609,0〜11304,5.468,4.2168,4.1147,2.7713,30,30,はい,187.9837,30840705
⑤,fam_p3_s4_r0_a33,空いている,4,0,33,1,20261030_rec_a33_cs49_fam_p3_r0_s1_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_a33_cs49_fam_p3_r0_s1_passon_sbret/recordings/20261030_rec_a33_cs49_fam_p3_r0_s1_passon_sbret_whole.mp4,2560x1726,677.47,20324,0〜10161.5,1.4243,0.2675,0.7753,2.7558,0,0,はい,169.0173,31569306
⑤,fam_p3_s4_r2_a33,空いている,4,2,33,1,20261030_rec_a33_cs49_fam_p3_r2_s1_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_a33_cs49_fam_p3_r2_s1_passon_sbret/recordings/20261030_rec_a33_cs49_fam_p3_r2_s1_passon_sbret_whole.mp4,2560x1726,718.13,21544,0〜10771.5,1.9545,0.6891,2.5369,3.737,11,11,はい,179.1434,37907980
⑥,fam_p4_s3_r0_a27,空いている,3,0,27,1,20261030_rec_a27_cs49_fam_p4_r0_s1_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_a27_cs49_fam_p4_r0_s1_passon_sbret/recordings/20261030_rec_a27_cs49_fam_p4_r0_s1_passon_sbret_whole.mp4,2560x1860,682.07,20462,0〜10230.5,1.7077,0.5797,1.1428,2.0137,0,0,はい,170.1619,26881526
⑥,fam_p4_s3_r2_a27,空いている,3,2,27,1,20261030_rec_a27_cs49_fam_p4_r2_s1_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_a27_cs49_fam_p4_r2_s1_passon_sbret/recordings/20261030_rec_a27_cs49_fam_p4_r2_s1_passon_sbret_whole.mp4,2560x1860,679.67,20390,0〜10194.5,1.5361,0.4133,1.1639,2.3508,3,3,はい,169.5659,30152353
②,fam_p0_s2_r0_a14,空いている,2,0,14,8,20261030_rec_a14_cs49_fam_p0_r0_s8_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_a14_cs49_fam_p0_r0_s8_passon_sbret/recordings/20261030_rec_a14_cs49_fam_p0_r0_s8_passon_sbret_whole.mp4,2560x2080,674.20,20226,0〜10112.5,1.109,0.0253,0.5111,0.6167,0,0,はい,168.2054,19565531
②,fam_p0_s2_r2_a14,空いている,2,2,14,8,20261030_rec_a14_cs49_fam_p0_r2_s8_passon_sbret,/Volumes/KIOXIA/r2r2r-data/service_sim/unity/20261030_rec_a14_cs49_fam_p0_r2_s8_passon_sbret/recordings/20261030_rec_a14_cs49_fam_p0_r2_s8_passon_sbret_whole.mp4,2560x2080,677.80,20334,0〜10166.5,1.5252,0.3414,1.7465,0.6475,9,9,はい,169.1011,23374659


====================================================================
8. 画面なしの夜の同じ回との比べ
====================================================================

  比べた相手：同じ店・スタッフ・ロボット台数・来客/時・種で、すれ違い入・待機場所へ戻る入・案B切の、画面なしの completed の回
    スタッフ少ない／多い → 20261107_night_st*（cs:47・今の版・v2.9）
    混んでいる／空いている → 20261106_night_a*（cs:44・今の版・v2.8）
    普通・真ん中の人数 → ②は 20261105_night（cs:40・今の版）。③⑦⑤⑥④は今の版の夜がないので、種を選んだ夜と同じ古い版の夜
      （＊印。④の 0台・2台は待機場所へ戻る 切の 20261030_night_cs29 しかなく、†印）
  結果：66 回とも、どれかの数字が違う（完全に同じ回は 0）
  入店待ちの差（録画 − 画面なし の大きさ）
    今の版・0台　25 回：中央値 0.09 分・最大 0.68 分・0.5 分以内 24 回
    今の版・1〜2台 26 回：中央値 0.59 分・最大 8.72 分・0.5 分以内 12 回
    古い版・0台　5 回：中央値 0.05 分・最大 0.26 分
    古い版・1〜2台 10 回：中央値 1.70 分・最大 7.92 分
  原因は調べていない。今までの録画（依頼 26）でも、画面ありの回は途中から画面なしとずれた。

  1回ずつ（録画／画面なし）
  20261030_rec_cs49_fam_p1_r0_s7_passon_sbret＊
      ⇔ 20261102_night_cs34_fam_p1_r0_s7_passon_sbret　入店待ち 3.9801／3.9766（+0.00）・動けなくなった 同じ
      入店待ち 3.9801／3.9766・席空き待ち 2.0021／2.1265・料理 1.0511／1.0304・会計 8.1084／7.1903・店の時間 195.5374／193.7602
  20261030_rec_cs49_fam_p1_r1_s7_passon_sbret＊
      ⇔ 20261102_night_cs34_fam_p1_r1_s7_passon_sbret　入店待ち 3.2931／7.5377（-4.24）・動けなくなった 1／14
      入店待ち 3.2931／7.5377・席空き待ち 1.0272／4.9336・料理 2.4784／2.8025・会計 9.9731／6.2677・動けず 1／14・救出 1／14・店の時間 199.682／204.4616
  20261030_rec_cs49_fam_p1_r2_s7_passon_sbret＊
      ⇔ 20261102_night_cs34_fam_p1_r2_s7_passon_sbret　入店待ち 3.5402／3.6548（-0.11）・動けなくなった 12／31
      入店待ち 3.5402／3.6548・席空き待ち 1.5129／1.2244・料理 1.854／2.1835・会計 7.9314／10.3633・動けず 12／31・救出 12／31・店の時間 195.8263／199.8215
  20261030_rec_cs49_fam_p5_r0_s7_passon_sbret＊
      ⇔ 20261102_night_cs34_fam_p5_r0_s7_passon_sbret　入店待ち 4.1402／4.336（-0.20）・動けなくなった 同じ
      入店待ち 4.1402／4.336・席空き待ち 2.2566／2.2677・料理 0.9695／1.073・会計 7.2536／7.9831・店の時間 193.8731／195.5009
  20261030_rec_cs49_fam_p5_r1_s7_passon_sbret＊
      ⇔ 20261102_night_cs34_fam_p5_r1_s7_passon_sbret　入店待ち 3.3274／3.6997（-0.37）・動けなくなった 3／4
      入店待ち 3.3274／3.6997・席空き待ち 0.9699／1.3991・料理 2.4558／2.5581・会計 9.9253／8.8178・動けず 3／4・救出 3／4・店の時間 199.0926／197.4283
  20261030_rec_cs49_fam_p5_r2_s7_passon_sbret＊
      ⇔ 20261102_night_cs34_fam_p5_r2_s7_passon_sbret　入店待ち 3.1895／4.879（-1.69）・動けなくなった 18／28
      入店待ち 3.1895／4.879・席空き待ち 0.7285／2.3416・料理 1.8073／2.246・会計 11.6992／8.9391・動けず 18／28・救出 18／28・店の時間 200.5337／200.0074
  20261030_rec_cs49_fam_p2_r0_s1_passon_sbret＊†
      ⇔ 20261031_p2_cs33_fam_p2_r0_s1_passon　入店待ち 14.1861／14.4424（-0.26）・動けなくなった 同じ
      入店待ち 14.1861／14.4424・席空き待ち 12.43／12.6259・料理 1.3332／1.3213・会計 1.9276／2.2012・店の時間 200.6806／201.8394
  20261030_rec_cs49_fam_p2_r1_s1_passon_sbret＊
      ⇔ 20261031_p2_cs33_fam_p2_r1_s1_passon_sbret　入店待ち 11.5955／14.7531（-3.16）・動けなくなった 5／14
      入店待ち 11.5955／14.7531・席空き待ち 9.6754／12.9088・料理 1.7934／2.1596・会計 2.2959／2.7427・動けず 5／14・救出 5／14・店の時間 195.0626／198.1904
  20261030_rec_cs49_fam_p2_r2_s1_passon_sbret＊
      ⇔ 20261031_p2_cs33_fam_p2_r2_s1_passon_sbret　入店待ち 21.9539／29.8772（-7.92）・動けなくなった 66／78
      入店待ち 21.9539／29.8772・席空き待ち 19.9801／25.2787・料理 2.8905／3.5265・会計 4.5579／7.3942・動けず 66／78・救出 69／78・店の時間 230.9784／245.919
  20261030_rec_cs49_fam_p3_r0_s1_passon_sbret＊
      ⇔ 20261103_night_cs36_fam_p3_r0_s1_passon_sbret　入店待ち 8.2583／8.2575（+0.00）・動けなくなった 同じ
      入店待ち 8.2583／8.2575・席空き待ち 7.1261／7.119・料理 0.9979／0.9824・会計 5.79／5.7815・店の時間 201.3521／202.1938
  20261030_rec_cs49_fam_p3_r1_s1_passon_sbret＊
      ⇔ 20261103_night_cs36_fam_p3_r1_s1_passon_sbret　入店待ち 6.8672／5.3116（+1.56）・動けなくなった 1／0
      入店待ち 6.8672／5.3116・席空き待ち 5.5636／4.0255・料理 2.5585／2.5493・会計 6.3255／7.1722・動けず 1／0・救出 1／0・店の時間 200.4531／194.5056
  20261030_rec_cs49_fam_p3_r2_s1_passon_sbret＊
      ⇔ 20261103_night_cs36_fam_p3_r2_s1_passon_sbret　入店待ち 9.1132／5.7589（+3.35）・動けなくなった 20／16
      入店待ち 9.1132／5.7589・席空き待ち 7.5618／4.1174・料理 1.8283／2.1245・会計 7.6013／9.8626・動けず 20／16・救出 20／16・店の時間 203.8722／202.8819
  20261030_rec_cs49_fam_p4_r0_s1_passon_sbret＊
      ⇔ 20261104_night_cs38_fam_p4_r0_s1_passon_sbret　入店待ち 9.5783／9.5294（+0.05）・動けなくなった 同じ
      入店待ち 9.5783／9.5294・席空き待ち 8.3827／8.3452・料理 1.163／1.0498・会計 3.6201／3.7729・店の時間 194.763／193.9661
  20261030_rec_cs49_fam_p4_r1_s1_passon_sbret＊
      ⇔ 20261104_night_cs38_fam_p4_r1_s1_passon_sbret　入店待ち 6.6071／5.8024（+0.80）・動けなくなった 7／5
      入店待ち 6.6071／5.8024・席空き待ち 5.4306／4.6284・料理 2.4765／2.4942・会計 2.6862／3.0851・動けず 7／5・救出 7／5・店の時間 184.5372／184.4127
  20261030_rec_cs49_fam_p4_r2_s1_passon_sbret＊
      ⇔ 20261104_night_cs38_fam_p4_r2_s1_passon_sbret　入店待ち 5.1363／3.4226（+1.71）・動けなくなった 15／4
      入店待ち 5.1363／3.4226・席空き待ち 3.9347／2.2267・料理 1.2401／1.0369・会計 3.2882／3.3786・動けず 15／4・救出 15／4・店の時間 181.192／176.2945
  20261030_rec_cs49_fam_p0_r0_s8_passon_sbret
      ⇔ 20261105_night_cs40_fam_p0_r0_s8_passon_sbret　入店待ち 1.7763／1.7778（-0.00）・動けなくなった 同じ
      入店待ち 1.7763／1.7778・席空き待ち 0.7155／0.7182・料理 1.05／1.0597・会計 1.0793／0.9639・店の時間 174.7921／175.8911
  20261030_rec_cs49_fam_p0_r1_s8_passon_sbret
      ⇔ 20261105_night_cs40_fam_p0_r1_s8_passon_sbret　入店待ち 1.3789／1.378（+0.00）・動けなくなった 同じ
      入店待ち 1.3789／1.378・席空き待ち 0.2651／0.268・料理 1.0256／0.9827・会計 0.832／1.1472・店の時間 171.7881／171.6328
  20261030_rec_cs49_fam_p0_r2_s8_passon_sbret
      ⇔ 20261105_night_cs40_fam_p0_r2_s8_passon_sbret　入店待ち 1.4074／1.2824（+0.12）・動けなくなった 16／6
      入店待ち 1.4074／1.2824・席空き待ち 0.2963／0.1818・料理 1.3219／0.69・会計 1.0696／1.0335・動けず 16／6・救出 16／6・店の時間 169.6348／169.6182
  20261030_rec_st3_cs49_fam_p1_r0_s7_passon_sbret
      ⇔ 20261107_night_st3_cs47_fam_p1_r0_s7_passon_sbret　入店待ち 15.0605／15.0456（+0.01）・動けなくなった 同じ
      入店待ち 15.0605／15.0456・席空き待ち 12.822／12.5772・料理 1.3427／1.5015・会計 3.7565／4.3602・店の時間 224.449／226.7434
  20261030_rec_st3_cs49_fam_p1_r2_s7_passon_sbret
      ⇔ 20261107_night_st3_cs47_fam_p1_r2_s7_passon_sbret　入店待ち 6.3154／13.8416（-7.53）・動けなくなった 7／22
      入店待ち 6.3154／13.8416・席空き待ち 4.1662／11.3781・料理 1.3493／2.0524・会計 6.2592／6.0036・動けず 7／22・救出 7／22・店の時間 201.4824／228.46
  20261030_rec_st3_cs49_fam_p5_r0_s7_passon_sbret
      ⇔ 20261107_night_st3_cs47_fam_p5_r0_s7_passon_sbret　入店待ち 15.2384／15.6583（-0.42）・動けなくなった 同じ
      入店待ち 15.2384／15.6583・席空き待ち 12.982／13.2743・料理 1.3736／1.4564・会計 3.7987／4.0512・店の時間 225.9573／227.1294
  20261030_rec_st3_cs49_fam_p5_r2_s7_passon_sbret
      ⇔ 20261107_night_st3_cs47_fam_p5_r2_s7_passon_sbret　入店待ち 9.6145／9.0508（+0.56）・動けなくなった 24／8
      入店待ち 9.6145／9.0508・席空き待ち 6.6648／6.8211・料理 1.8874／2.1119・会計 7.9872／5.5739・動けず 24／8・救出 24／8・店の時間 215.1322／211.4592
  20261030_rec_st1_cs49_fam_p2_r0_s1_passon_sbret
      ⇔ 20261107_night_st1_cs47_fam_p2_r0_s1_passon_sbret　入店待ち 61.7806／61.7646（+0.02）・動けなくなった 同じ
      入店待ち 61.7806／61.7646・席空き待ち 51.4775／51.4821・料理 6.1955／6.1907・会計 7.8653／7.8484・店の時間 353.6016／353.577
  20261030_rec_st1_cs49_fam_p2_r2_s1_passon_sbret
      ⇔ 20261107_night_st1_cs47_fam_p2_r2_s1_passon_sbret　入店待ち 79.9679／71.2434（+8.72）・動けなくなった 33／40
      入店待ち 79.9679／71.2434・席空き待ち 63.7658／60.9883・料理 2.9508／2.093・会計 11.2174／7.8677・動けず 33／40・救出 33／40・店の時間 381.0962／368.3138
  20261030_rec_st3_cs49_fam_p3_r0_s1_passon_sbret
      ⇔ 20261107_night_st3_cs47_fam_p3_r0_s1_passon_sbret　入店待ち 21.8155／21.6348（+0.18）・動けなくなった 同じ
      入店待ち 21.8155／21.6348・席空き待ち 20.6136／20.44・料理 1.2836／1.1871・会計 5.2395／5.1773・店の時間 241.2042／241.4457
  20261030_rec_st3_cs49_fam_p3_r2_s1_passon_sbret
      ⇔ 20261107_night_st3_cs47_fam_p3_r2_s1_passon_sbret　入店待ち 18.5255／18.5367（-0.01）・動けなくなった 23／12
      入店待ち 18.5255／18.5367・席空き待ち 16.8999／17.0171・料理 2.5086／3.0017・会計 6.1946／6.5032・動けず 23／12・救出 23／12・店の時間 259.0733／247.717
  20261030_rec_st2_cs49_fam_p4_r0_s1_passon_sbret
      ⇔ 20261107_night_st2_cs47_fam_p4_r0_s1_passon_sbret　入店待ち 30.0651／29.6489（+0.42）・動けなくなった 同じ
      入店待ち 30.0651／29.6489・席空き待ち 28.8483／28.4304・料理 2.2329／2.2692・会計 4.1787／4.3214・店の時間 266.8287／265.2025
  20261030_rec_st2_cs49_fam_p4_r2_s1_passon_sbret
      ⇔ 20261107_night_st2_cs47_fam_p4_r2_s1_passon_sbret　入店待ち 20.6423／20.0207（+0.62）・動けなくなった 20／9
      入店待ち 20.6423／20.0207・席空き待ち 19.4651／18.7763・料理 1.333／1.215・会計 3.8478／3.7378・動けず 20／9・救出 20／9・店の時間 236.3847／245.0615
  20261030_rec_st1_cs49_fam_p0_r0_s8_passon_sbret
      ⇔ 20261107_night_st1_cs47_fam_p0_r0_s8_passon_sbret　入店待ち 25.5285／25.528（+0.00）・動けなくなった 同じ
      入店待ち 25.5285／25.528・席空き待ち 23.5951／23.5932・料理 2.8008／2.8221・会計 2.5804／2.6393・店の時間 251.8026／251.9014
  20261030_rec_st1_cs49_fam_p0_r2_s8_passon_sbret
      ⇔ 20261107_night_st1_cs47_fam_p0_r2_s8_passon_sbret　入店待ち 24.4109／24.5268（-0.12）・動けなくなった 23／20
      入店待ち 24.4109／24.5268・席空き待ち 21.4884／21.4907・料理 1.655／1.3386・会計 3.3393／3.2628・動けず 23／20・救出 23／20・店の時間 241.6317／236.8952
  20261030_rec_a54_cs49_fam_p1_r0_s7_passon_sbret
      ⇔ 20261106_night_a54_cs44_fam_p1_r0_s7_passon_sbret　入店待ち 17.6014／18.0746（-0.47）・動けなくなった 同じ
      入店待ち 17.6014／18.0746・席空き待ち 8.4007／9.2476・料理 1.0009／0.9988・会計 4.9054／4.405・店の時間 218.6352／220.0945
  20261030_rec_a54_cs49_fam_p1_r2_s7_passon_sbret
      ⇔ 20261106_night_a54_cs44_fam_p1_r2_s7_passon_sbret　入店待ち 17.4191／15.5375（+1.88）・動けなくなった 26／29
      入店待ち 17.4191／15.5375・席空き待ち 7.5907／5.7383・料理 1.5753／2.0796・会計 5.0083／5.937・動けず 26／29・救出 26／29・店の時間 220.8058／217.5411
  20261030_rec_a54_cs49_fam_p5_r0_s7_passon_sbret
      ⇔ 20261106_night_a54_cs44_fam_p5_r0_s7_passon_sbret　入店待ち 19.1257／18.4438（+0.68）・動けなくなった 同じ
      入店待ち 19.1257／18.4438・席空き待ち 9.5727／9.1907・料理 1.1162／1.0229・会計 4.5353／4.6527・店の時間 221.1395／219.4063
  20261030_rec_a54_cs49_fam_p5_r2_s7_passon_sbret
      ⇔ 20261106_night_a54_cs44_fam_p5_r2_s7_passon_sbret　入店待ち 12.6098／15.0187（-2.41）・動けなくなった 17／21
      入店待ち 12.6098／15.0187・席空き待ち 3.0638／5.3316・料理 1.6162／2.1027・会計 9.0576／6.5554・動けず 17／21・救出 17／21・店の時間 215.5323／217.2614
  20261030_rec_a36_cs49_fam_p2_r0_s1_passon_sbret
      ⇔ 20261106_night_a36_cs44_fam_p2_r0_s1_passon_sbret　入店待ち 34.1523／34.164（-0.01）・動けなくなった 同じ
      入店待ち 34.1523／34.164・席空き待ち 22.4633／22.4103・料理 1.3468／1.3456・会計 2.4445／2.4962・店の時間 258.6308／259.4759
  20261030_rec_a36_cs49_fam_p2_r2_s1_passon_sbret
      ⇔ 20261106_night_a36_cs44_fam_p2_r2_s1_passon_sbret　入店待ち 47.1437／47.5748（-0.43）・動けなくなった 71／82
      入店待ち 47.1437／47.5748・席空き待ち 31.5688／24.3459・料理 2.5808／3.3973・会計 4.2733／7.8291・動けず 71／82・救出 71／82・店の時間 296.9762／299.1387
  20261030_rec_a59_cs49_fam_p3_r0_s1_passon_sbret
      ⇔ 20261106_night_a59_cs44_fam_p3_r0_s1_passon_sbret　入店待ち 22.0505／21.8255（+0.22）・動けなくなった 同じ
      入店待ち 22.0505／21.8255・席空き待ち 11.4166／11.2257・料理 1.0916／1.0596・会計 7.7634／7.987・店の時間 233.5417／234.8034
  20261030_rec_a59_cs49_fam_p3_r2_s1_passon_sbret
      ⇔ 20261106_night_a59_cs44_fam_p3_r2_s1_passon_sbret　入店待ち 19.6037／18.4748（+1.13）・動けなくなった 13／1
      入店待ち 19.6037／18.4748・席空き待ち 7.5639／6.388・料理 1.7348／1.6146・会計 10.3151／11.273・動けず 13／1・救出 13／1・店の時間 225.265／225.8577
  20261030_rec_a49_cs49_fam_p4_r0_s1_passon_sbret
      ⇔ 20261106_night_a49_cs44_fam_p4_r0_s1_passon_sbret　入店待ち 28.7431／28.42（+0.32）・動けなくなった 同じ
      入店待ち 28.7431／28.42・席空き待ち 17.5473／17.3987・料理 1.1776／1.2474・会計 5.1367／5.2567・店の時間 250.1051／248.5462
  20261030_rec_a49_cs49_fam_p4_r2_s1_passon_sbret
      ⇔ 20261106_night_a49_cs44_fam_p4_r2_s1_passon_sbret　入店待ち 19.9169／19.2665（+0.65）・動けなくなった 10／4
      入店待ち 19.9169／19.2665・席空き待ち 10.6488／10.5895・料理 1.4769／1.5799・会計 4.5413／4.7209・動けず 10／4・救出 10／4・店の時間 221.6517／223.7028
  20261030_rec_a24_cs49_fam_p0_r0_s8_passon_sbret
      ⇔ 20261106_night_a24_cs44_fam_p0_r0_s8_passon_sbret　入店待ち 11.1384／11.3071（-0.17）・動けなくなった 同じ
      入店待ち 11.1384／11.3071・席空き待ち 6.026／6.2118・料理 1.0602／0.9759・会計 1.0668／1.0842・店の時間 201.5995／198.8918
  20261030_rec_a24_cs49_fam_p0_r2_s8_passon_sbret
      ⇔ 20261106_night_a24_cs44_fam_p0_r2_s8_passon_sbret　入店待ち 10.8543／9.7747（+1.08）・動けなくなった 19／12
      入店待ち 10.8543／9.7747・席空き待ち 5.7123／3.3809・料理 1.793／3.0642・会計 1.4813／1.6622・動けず 19／12・救出 19／12・店の時間 194.1255／192.4338
  20261030_rec_st5_cs49_fam_p1_r0_s7_passon_sbret
      ⇔ 20261107_night_st5_cs47_fam_p1_r0_s7_passon_sbret　入店待ち 2.3461／2.3321（+0.01）・動けなくなった 同じ
      入店待ち 2.3461／2.3321・席空き待ち 0.4365／0.4806・料理 0.5268／0.5232・会計 11.7169／11.0749・店の時間 200.2348／199.1507
  20261030_rec_st5_cs49_fam_p1_r2_s7_passon_sbret
      ⇔ 20261107_night_st5_cs47_fam_p1_r2_s7_passon_sbret　入店待ち 2.8198／4.1191（-1.30）・動けなくなった 6／43
      入店待ち 2.8198／4.1191・席空き待ち 0.7046／1.8218・料理 1.4689／2.1953・会計 11.6731／9.4464・動けず 6／43・救出 6／43・店の時間 200.459／200.0522
  20261030_rec_st5_cs49_fam_p5_r0_s7_passon_sbret
      ⇔ 20261107_night_st5_cs47_fam_p5_r0_s7_passon_sbret　入店待ち 2.2629／2.3551（-0.09）・動けなくなった 同じ
      入店待ち 2.2629／2.3551・席空き待ち 0.5178／0.5702・料理 0.5669／0.5999・会計 10.7878／10.6158・店の時間 198.4568／198.3854
  20261030_rec_st5_cs49_fam_p5_r2_s7_passon_sbret
      ⇔ 20261107_night_st5_cs47_fam_p5_r2_s7_passon_sbret　入店待ち 3.2072／3.83（-0.62）・動けなくなった 24／17
      入店待ち 3.2072／3.83・席空き待ち 1.0182／0.8203・料理 2.385／2.5008・会計 11.1358／12.2813・動けず 24／17・救出 24／17・店の時間 199.2894／203.9519
  20261030_rec_st3_cs49_fam_p2_r0_s1_passon_sbret
      ⇔ 20261107_night_st3_cs47_fam_p2_r0_s1_passon_sbret　入店待ち 3.9598／3.8826（+0.08）・動けなくなった 同じ
      入店待ち 3.9598／3.8826・席空き待ち 2.2606／2.1688・料理 0.8666／0.836・会計 2.2452／2.3071・店の時間 169.2356／168.745
  20261030_rec_st3_cs49_fam_p2_r2_s1_passon_sbret
      ⇔ 20261107_night_st3_cs47_fam_p2_r2_s1_passon_sbret　入店待ち 12.6075／15.4177（-2.81）・動けなくなった 56／59
      入店待ち 12.6075／15.4177・席空き待ち 10.6151／13.0109・料理 3.3269／3.9473・会計 5.1549／3.8847・動けず 56／59・救出 56／59・店の時間 192.9409／206.4339
  20261030_rec_st5_cs49_fam_p3_r0_s1_passon_sbret
      ⇔ 20261107_night_st5_cs47_fam_p3_r0_s1_passon_sbret　入店待ち 1.8941／1.779（+0.12）・動けなくなった 同じ
      入店待ち 1.8941／1.779・席空き待ち 0.7233／0.6075・料理 0.7994／0.819・会計 12.8012／12.867・店の時間 199.7343／199.9202
  20261030_rec_st5_cs49_fam_p3_r2_s1_passon_sbret
      ⇔ 20261107_night_st5_cs47_fam_p3_r2_s1_passon_sbret　入店待ち 2.6887／6.1701（-3.48）・動けなくなった 6／26
      入店待ち 2.6887／6.1701・席空き待ち 1.2471／4.0978・料理 1.703／2.3752・会計 13.8651／11.7703・動けず 6／26・救出 6／26・店の時間 203.3792／205.0667
  20261030_rec_st4_cs49_fam_p4_r0_s1_passon_sbret
      ⇔ 20261107_night_st4_cs47_fam_p4_r0_s1_passon_sbret　入店待ち 1.8604／1.7135（+0.15）・動けなくなった 同じ
      入店待ち 1.8604／1.7135・席空き待ち 0.6745／0.5204・料理 0.9048／0.8528・会計 3.717／3.7111・店の時間 171.7756／171.4153
  20261030_rec_st4_cs49_fam_p4_r2_s1_passon_sbret
      ⇔ 20261107_night_st4_cs47_fam_p4_r2_s1_passon_sbret　入店待ち 1.8251／1.4291（+0.40）・動けなくなった 5／3
      入店待ち 1.8251／1.4291・席空き待ち 0.6023／0.2246・料理 1.2121／1.1737・会計 4.1633／4.489・動けず 5／3・救出 5／3・店の時間 173.0415／172.1948
  20261030_rec_st3_cs49_fam_p0_r0_s8_passon_sbret
      ⇔ 20261107_night_st3_cs47_fam_p0_r0_s8_passon_sbret　入店待ち 1.2065／1.2098（-0.00）・動けなくなった 同じ
      入店待ち 1.2065／1.2098・席空き待ち 0.1317／0.1356・料理 0.5211／0.5233・会計 0.7812／0.7805・店の時間 170.4118／170.4159
  20261030_rec_st3_cs49_fam_p0_r2_s8_passon_sbret
      ⇔ 20261107_night_st3_cs47_fam_p0_r2_s8_passon_sbret　入店待ち 1.2001／1.4852（-0.29）・動けなくなった 5／26
      入店待ち 1.2001／1.4852・席空き待ち 0.0886／0.3028・料理 0.7947／1.8219・会計 0.7919／0.8114・動けず 5／26・救出 5／26・店の時間 172.0935／171.0393
  20261030_rec_a30_cs49_fam_p1_r0_s7_passon_sbret
      ⇔ 20261106_night_a30_cs44_fam_p1_r0_s7_passon_sbret　入店待ち 1.2561／1.251（+0.01）・動けなくなった 同じ
      入店待ち 1.2561／1.251・席空き待ち 0.0778／0.0702・料理 0.5905／0.6182・会計 4.2558／3.969・店の時間 178.7424／178.2253
  20261030_rec_a30_cs49_fam_p1_r2_s7_passon_sbret
      ⇔ 20261106_night_a30_cs44_fam_p1_r2_s7_passon_sbret　入店待ち 1.4555／1.2991（+0.16）・動けなくなった 5／7
      入店待ち 1.4555／1.2991・席空き待ち 0.2363／0.0917・料理 2.7794／1.1219・会計 4.9148／4.2387・動けず 5／7・救出 5／7・店の時間 197.821／179.7261
  20261030_rec_a30_cs49_fam_p5_r0_s7_passon_sbret
      ⇔ 20261106_night_a30_cs44_fam_p5_r0_s7_passon_sbret　入店待ち 1.2707／1.2628（+0.01）・動けなくなった 同じ
      入店待ち 1.2707／1.2628・席空き待ち 0.0879／0.0822・料理 0.5981／0.6103・会計 4.0751／3.892・店の時間 178.52／177.9697
  20261030_rec_a30_cs49_fam_p5_r2_s7_passon_sbret
      ⇔ 20261106_night_a30_cs44_fam_p5_r2_s7_passon_sbret　入店待ち 1.2794／1.31（-0.03）・動けなくなった 5／14
      入店待ち 1.2794／1.31・席空き待ち 0.0697／0.1073・料理 1.0835／1.317・会計 4.087／3.4808・動けず 5／14・救出 5／14・店の時間 179.165／178.0419
  20261030_rec_a20_cs49_fam_p2_r0_s1_passon_sbret
      ⇔ 20261106_night_a20_cs44_fam_p2_r0_s1_passon_sbret　入店待ち 2.7245／2.9921（-0.27）・動けなくなった 同じ
      入店待ち 2.7245／2.9921・席空き待ち 1.5651／1.8259・料理 1.33／1.5139・会計 2.0811／1.9706・店の時間 174.817／175.1573
  20261030_rec_a20_cs49_fam_p2_r2_s1_passon_sbret
      ⇔ 20261106_night_a20_cs44_fam_p2_r2_s1_passon_sbret　入店待ち 5.468／2.8729（+2.60）・動けなくなった 30／8
      入店待ち 5.468／2.8729・席空き待ち 4.2168／1.6496・料理 4.1147／2.6409・会計 2.7713／2.0282・動けず 30／8・救出 30／8・店の時間 187.9837／170.9048
  20261030_rec_a33_cs49_fam_p3_r0_s1_passon_sbret
      ⇔ 20261106_night_a33_cs44_fam_p3_r0_s1_passon_sbret　入店待ち 1.4243／1.3611（+0.06）・動けなくなった 同じ
      入店待ち 1.4243／1.3611・席空き待ち 0.2675／0.1974・料理 0.7753／0.7375・会計 2.7558／2.9309・店の時間 169.0173／169.082
  20261030_rec_a33_cs49_fam_p3_r2_s1_passon_sbret
      ⇔ 20261106_night_a33_cs44_fam_p3_r2_s1_passon_sbret　入店待ち 1.9545／1.7015（+0.25）・動けなくなった 11／5
      入店待ち 1.9545／1.7015・席空き待ち 0.6891／0.4764・料理 2.5369／1.8019・会計 3.737／3.6014・動けず 11／5・救出 11／5・店の時間 179.1434／170.259
  20261030_rec_a27_cs49_fam_p4_r0_s1_passon_sbret
      ⇔ 20261106_night_a27_cs44_fam_p4_r0_s1_passon_sbret　入店待ち 1.7077／1.5984（+0.11）・動けなくなった 同じ
      入店待ち 1.7077／1.5984・席空き待ち 0.5797／0.4618・料理 1.1428／1.0266・会計 2.0137／1.9933・店の時間 170.1619／169.6099
  20261030_rec_a27_cs49_fam_p4_r2_s1_passon_sbret
      ⇔ 20261106_night_a27_cs44_fam_p4_r2_s1_passon_sbret　入店待ち 1.5361／1.3875（+0.15）・動けなくなった 3／1
      入店待ち 1.5361／1.3875・席空き待ち 0.4133／0.2696・料理 1.1639／1.0163・会計 2.3508／2.0972・動けず 3／1・救出 3／1・店の時間 169.5659／168.3548
  20261030_rec_a14_cs49_fam_p0_r0_s8_passon_sbret
      ⇔ 20261106_night_a14_cs44_fam_p0_r0_s8_passon_sbret　入店待ち 1.109／1.1096（-0.00）・動けなくなった 同じ
      入店待ち 1.109／1.1096・料理 0.5111／0.5164・会計 0.6167／0.672・店の時間 168.2054／168.1822
  20261030_rec_a14_cs49_fam_p0_r2_s8_passon_sbret
      ⇔ 20261106_night_a14_cs44_fam_p0_r2_s8_passon_sbret　入店待ち 同じ・動けなくなった 同じ
      会計 0.6475／0.6474


====================================================================
9. 残ったもの・変えたもの
====================================================================

  プロジェクト（VCS）：SimTimeRecorder.cs だけ（cs:49）。保留 0
  プロジェクト（VCS の外）：Builds/rec3_stock49（録画用の実行ファイル）
  KIOXIA
    20261030_rec*_cs49_* の 66 フォルダ（出力と recordings/）
    night/20261030_rec/（rec_index.csv・README.md・queue.json・queue_src.json・runs.csv・runner_log.txt・logs/・judge.*・rec_runner.py）
      __pycache__/ が1つ残っている（rec_runner.py の確かめで読み込んだときにできた。消す許可が出なかったので残した）
    20261030_rectest_cs49_fam_p1_r0_s0_passon_sbret/ と _stopped/（確かめの回。台帳には書いていない）
    archive/unity_ledger_v1_prerec_20261030/（台帳の控え）
  変えていない：店の回し方・人とロボットの動き・速さ・物理、Builds/headless、night_runner.py・judge_night.py・make_queue.py、
    台帳の列と今までの行、今までの出力と recordings/。Unity エディタは開いていない


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

  1. 種の選び方が 2 つで並んだときの決め方。番号の小さい方で回した（③⑦ 種7・④⑤⑥ 種1・② 種8）。
     もう片方（③⑦ 種8・④ 種8・⑤ 種7・⑥ 種8・② 種9）がよければ、撮り直しが要る。
  2. 動画に添える数字。録画の回は、画面なしの同じ回と数字が合わない（ロボットのいる回で入店待ちが最大 8.7 分違う）。
     動画にはその録画の回の数字（rec_index.csv）を添えるのがよいと思うが、どちらを使うか。
  3. 普通・真ん中の人数の画面なしの回は、③⑦④⑤⑥ では今の店の形の版で回した夜がない（比べた相手は古い版）。
     今の版で回し直すかどうか。
  4. 残ったもの（確かめの回の 2 フォルダ・night/20261030_rec/__pycache__・Builds/rec3_stock49）を消すか残すか。
```

### 録画した回の数字は、画面なしで回した回とロボットがいると合わない

録画した回は、画面なしで回した同じ条件・同じ種の回と、数字が完全には合いませんでした。ロボット0台なら入店待ちの差は中央値0.09分ですが、ロボットがいる回では最大8.72分ずれます（今の店の形の版で比べた26回）。前の録画（LP 用に②を撮った依頼26）でも、画面ありの回は途中から画面なしの回とずれていました。原因は調べていません。

報告の「決めてほしいこと」は、次のように決めました。

| 決めること | 決めたこと |
|---|---|
| 種が2つ同じ近さで並んだときの選び方 | 番号の小さい方のまま（③⑦ 種7・④⑤⑥ 種1・② 種8）。どちらも真ん中に近いので撮り直さない |
| 動画に添える数字 | その録画の回の数字（`rec_index.csv`）を使う。動画の中の動きと数字が一致するため |
| 普通・真ん中の人数の画面なしの回を、今の店の形の版で回し直すか | 今は回し直さない。動画には録画の回の数字を使うので、比べる相手として急がない |
| 試しの回のフォルダ・録画用の実行ファイルなどの残り | 消さずに残す（撮り直すときに使う） |


## 作業ログ ― 録画のストックから、④のロボット0台と2台を並べた比較動画を作った

### ④ 効率重視・狭い店、スタッフ3人で、ロボット0台と2台を左右に並べた

最初の1本は、④の狭い店をスタッフ3人で回した回にしました。初めは③のスタッフ3人で作る予定でしたが、撮った③の回（種7）では、ロボット2台で入店待ちが15.1分から6.3分に大きく縮んでいました。種10個の中央値（14.8分 → 13.1分）とは違う向きに見えるので、この記事で分かったこと（ロボットを足すと入店待ちが延びる店がある）がはっきり出る④を選びました。

【動画】LOG409_compare_p2_st3_r0_vs_r2.mp4 ④ 効率重視・狭い店をスタッフ3人・1時間28組で回した Unity の3Dシミュレーションを、ロボット0台（左）と2台（右）で左右に並べた30倍速の動画（6分31秒）。上の帯に店の時刻・入店待ちの組・片付け待ちの卓・ロボットが動けなくなった累計の回数が出る。0台は入店待ちの平均4.0分・動けなくなった0回、2台は12.6分・56回

| ④ スタッフ3人・種1（録画の回） | ロボット0台 | ロボット2台 |
|---|---|---|
| 入店待ち（平均） | 4.0分 | 12.6分 |
| ロボットが動けなくなった | 0回 | 56回 |
| 回の長さ（店の時刻） | 約2時間49分 | 約3時間13分 |

2台の店では、白いロボットが通路で止まり、青いスタッフがそこへ向かう場面が繰り返し出ます。そのあいだ、上の帯の入店待ちの組と片付け待ちの卓の数が、0台の店より多いまま続きます。店の時刻2:05の時点で、0台の店は入店待ちの組0・片付け待ちの卓0、2台の店は入店待ちの組3・片付け待ちの卓5・動けなくなった累計33回でした。

### 比較動画を作る make_compare.py

録画のストックの2本を選び、半分の大きさにして左右に並べ、上下に帯を付けて書き出します。上の帯の数字は、その回の `timeline.csv`（60秒ごと）と `stops.csv`（動けなくなった時刻）から1分ごとに出し、録画の `_frames.csv` で店の時刻と動画の時刻を合わせます。録画は0.5秒ごと・30コマ/秒（15倍速）なので、1コマおきに使って30倍速にしました。字幕の形式（ASS）で文字を重ねています。

```python
"""サービスロボット導入シミュレーションの録画ストック（night/20261030_rec）から、2本を左右に並べた比較動画を作る（2026-10-31）
使い方: python3 make_compare.py <左の回の名前> <右の回の名前> <左の見出し> <右の見出し> <上の説明> <出力の mp4> [倍速 既定2]
- 録画は 0.5 秒ごと・30 コマ/秒（15 倍速）。倍速 2 なら 1 コマおきに使い 30 倍速
- 上に、店の時刻・入店を待っている組・片付け待ちの卓・動けなくなった（累計）を1分ごとに出す（timeline.csv と stops.csv から）
- 最後に、その回の入店待ちの平均（rec_index.csv）を出す
"""
import csv, sys, os, subprocess, bisect
U = os.environ.get('SIM_UNITY', '/Volumes/KIOXIA/r2r2r-data/service_sim/unity')
L, R, HL, HR, CAP, OUT = sys.argv[1:7]
SPD = int(sys.argv[7]) if len(sys.argv) > 7 else 2
IDX = {r['回の名前']: r for r in csv.DictReader(open(U + '/night/20261030_rec/rec_index.csv', encoding='utf-8'))}
W, H, TOP, BOT = 1280, 880, 150, 70     # 片側の大きさ（2560x1760 を半分）・上下の帯

def info(run):
    d = f'{U}/{run}'
    T = [(float(r['t_s']), int(r['waiting_groups']), int(r['tables_dirty_untaken']) + int(r['tables_clearing'])) for r in csv.DictReader(open(d + '/timeline.csv'))]
    S = sorted(float(r['t_s']) for r in csv.DictReader(open(d + '/stops.csv')) if r['resolved'] == '動けなくなった')
    fr = [float(r[list(r.keys())[1]]) for r in csv.DictReader(open(f'{d}/recordings/{run}_whole_frames.csv'))]
    return T, S, fr, IDX[run]

def ts(v):  # 動画の秒 → ASS の時刻
    h = int(v // 3600); m = int(v % 3600 // 60); s = v % 60
    return f'{h}:{m:02d}:{s:05.2f}'

def clock(t):
    return f'{int(t // 3600)}:{int(t % 3600 // 60):02d}'

ev = []
dur = 0
for side, run, head in ((0, L, HL), (1, R, HR)):
    T, S, fr, ix = info(run)
    vlen = len(fr) / 30 / SPD
    dur = max(dur, vlen)
    x = side * W + 40
    ev.append((0, 99999, f'{{\\an7\\pos({x},18)\\fs46\\b1}}{head}'))
    for i, (t, wg, dirty) in enumerate(T):
        a = bisect.bisect_left(fr, t) / 30 / SPD
        b = (bisect.bisect_left(fr, T[i + 1][0]) / 30 / SPD) if i + 1 < len(T) else vlen
        if a >= vlen: break
        n = bisect.bisect_right(S, t)
        ev.append((a, b, f'{{\\an7\\pos({x},84)\\fs30}}店の時刻 {clock(t)}　入店待ちの組 {wg}　片付け待ちの卓 {dirty}　動けなくなった 累計{n}回'))
    ev.append((vlen, 99999, f'{{\\an7\\pos({x},84)\\fs30\\b1}}おわり　入店待ちの平均 {float(ix["入店待ち（分）"]):.1f}分　動けなくなった {ix["動けなくなった（回）"]}回'))
ev.append((0, 99999, f'{{\\an1\\pos(40,{TOP + H + BOT - 18})\\fs26}}{CAP}'))
ev.append((0, 99999, f'{{\\an3\\pos({2 * W - 40},{TOP + H + BOT - 18})\\fs26}}{{\\c&HE07A2A&}}●{{\\c&HF0F5F5&}} スタッフ　{{\\c&H22C8F5&}}●{{\\c&HF0F5F5&}} お客さん　{{\\c&HFFFFFF&}}●{{\\c&HF0F5F5&}} 配膳ロボット'))  # 色の見本（Unity の色に合わせた）
end = dur + 4
ass = ['[Script Info]', 'ScriptType: v4.00+', f'PlayResX: {2 * W}', f'PlayResY: {TOP + H + BOT}', '',
       '[V4+ Styles]', 'Format: Name, Fontname, Fontsize, PrimaryColour, OutlineColour, BackColour, Bold, Italic, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV',
       'Style: D,Noto Sans CJK JP,30,&H00F0F5F5,&H000D0D0D,&H000D0D0D,0,0,1,0,0,7,0,0,0', '',
       '[Events]', 'Format: Layer, Start, End, Style, Text']
for a, b, txt in ev:
    ass.append(f'Dialogue: 0,{ts(a)},{ts(min(b, end))},D,{txt}')
af = '/tmp/' + os.path.basename(OUT)[:-4] + '.ass'   # libass が外付けの KIOXIA 上のファイルを読めないため、いったん /tmp に書く
open(af, 'w', encoding='utf-8').write('\n'.join(ass) + '\n')
open(OUT[:-4] + '.ass', 'w', encoding='utf-8').write('\n'.join(ass) + '\n')   # 控え
vin = [f'{U}/{r}/recordings/{r}_whole.mp4' for r in (L, R)]
sel = f'select=not(mod(n\\,{SPD})),setpts=N/30/TB,' if SPD > 1 else ''
fc = (f'[0:v]{sel}scale={W}:{H},tpad=stop_mode=clone:stop_duration=600[a];'
      f'[1:v]{sel}scale={W}:{H},tpad=stop_mode=clone:stop_duration=600[b];'
      f'[a][b]hstack=2,pad={2 * W}:{TOP + H + BOT}:0:{TOP}:color=0x0d0d0d,'
      f'drawbox=x={W - 1}:y=0:w=3:h={TOP + H}:color=0xf5f5f0:t=fill,ass={af},trim=duration={end:.2f}[v]')
cmd = ['ffmpeg', '-y', '-hide_banner', '-loglevel', 'error', '-i', vin[0], '-i', vin[1], '-filter_complex', fc, '-map', '[v]',
       '-r', '30', '-c:v', 'libx264', '-preset', 'veryfast', '-crf', '22', '-pix_fmt', 'yuv420p', '-movflags', '+faststart', OUT]
print(' '.join(cmd[:6]), '...'); subprocess.run(cmd, check=True)
print(OUT, f'{end:.1f}秒', os.path.getsize(OUT))
```

### 比較動画を書き出したコマンドと、できた動画の確かめ

```text
$ export SIM_UNITY=/mnt/user-data/uploads/KIOXIA/r2r2r-data/service_sim/unity
$ python3 make_compare.py 20261030_rec_st3_cs49_fam_p2_r0_s1_passon_sbret 20261030_rec_st3_cs49_fam_p2_r2_s1_passon_sbret "ロボット0台" "ロボット2台" "④ 効率重視・狭い店　スタッフ3人・1時間28組　同じお客さんの来方（種1）で並べた Unity の3Dシミュレーション　30倍速" "$W/p2_st3_r0_vs_r2.mp4" 2
ffmpeg -y -hide_banner -loglevel error -i ...
/tmp/claude-0/-home-claude/6b82a170-2fde-52f3-8d47-7b6b5e561574/scratchpad/cmp/p2_st3_r0_vs_r2.mp4 390.8秒 13106632

$ ffprobe -v error -show_entries format=duration,size:stream=codec_name,width,height,nb_frames,r_frame_rate -of compact p2_st3_r0_vs_r2.mp4
stream|codec_name=h264|width=2560|height=1100|r_frame_rate=30/1|nb_frames=11724
format|duration=390.800000|size=13106632
```

書き出した動画から、真ん中（250秒）と終わりの手前（385秒）のコマを取り出して、帯の数字・色の見本・左右の区切りが出ていることを見ました。

### Mac の作業環境では書き出せず、クラウドの作業環境で作った

はじめは Mac 連携の作業環境で書き出そうとしましたが、2つのことで止まりました。

- 字幕を重ねる部品（libass）が、KIOXIA の上に置いた字幕のファイルを読めなかった（`Could not create a libass track when reading file`）。字幕のファイルを /tmp に書いてから読む形に直した
- 書き出しには数分かかるが、Mac 連携の作業環境は1回の呼び出しが終わると、後ろで動かしていた ffmpeg も止まってしまう

そこで、録画2本と `timeline.csv`・`stops.csv`・`_frames.csv`・`rec_index.csv` をクラウドの作業環境に写して書き出し、できた動画を KIOXIA の `videos/service_sim_compare/` に戻しました。作り方のスクリプトは `videos/_tools/make_compare.py` に置き、店の録画の場所は環境変数 `SIM_UNITY` で切り替えられるようにしました（何も指定しなければ `/Volumes/KIOXIA/r2r2r-data/service_sim/unity`）。
