====================================================================
720 分終わらなかった回の調べ
20261027_night_cs21_fam_p1_r2_s0_passon（③2台・すれ違い入・種0）
2026-10-27 07:43　調べただけ。Assets は直していません
====================================================================

結論（ひとことで）

  **ロボット1 が、料理2皿を持ったまま 600 秒ごとのやり直しを 56 回くり返し、
  その2皿を待っていた2組が永久に帰れなくなりました。**

  ・持っていた料理   dish 157（卓15・**割れやすい**）と dish 153（卓16）
  ・待っていた客     組62（卓15・4人）と 組63（卓16・2人）
  ・スタッフ         4人とも手空き。仕事板は空。**一度も頼まれていない**
  ・場所             待機場所 standby1（x=16.9, z=6.05）から出て、
                     卓15 の停止点（x=5.613, z=8.662）に着けないまま時間切れ
  ・始まり           132.0 分（**最後のすれ違いが起きた分と同じ**）
  ・終わり           708.2 分まで同じことをくり返し、720 分の上限で打ち切り

  ★ **なぜロボットが着けないのか**は、出力だけでは特定できませんでした。
    記録の上ではロボットは「止まってもいない・立ち往生もしていない・
    道も引けている」と言っているのに、600 秒かけて着きません（4 章）。


====================================================================
1. 店が固まった様子（timeline.csv）
====================================================================

  171 分から **549 分間、1ミリも変わりません**。

    分      待ち組  着席  空卓  汚卓  板（案内/配膳/呼出/会計/片付）  手空  ロボ稼働
    ────────────────────────────────────────────────────────────────────
    171      0      2    40    0    0 / 0 / 0 / 0 / 0            4      1
    …（720 分まで同じ）

  ・着席している組が **2組**。待っている組は 0
  ・空いている卓 40（店はほぼ空）
  ・**仕事板は空っぽ**（案内も配膳も呼出も会計も片付けも 0 件）
  ・**スタッフ4人は全員手空き**
  ・**ロボットは1台だけ、ずっと稼働中**

  店は 118 分の 24 組から順調に減り、168 分で 2組になって、そこで止まりました。
  混んで詰まったのではありません（入店待ちは 1.46 分と低い）。


====================================================================
2. 帰れなかった2組（groups.csv）
====================================================================

  組 62　卓15・4人
    来店 113.4 分 → 着席 114.6 分 → 食べ始め 128.0 分 → **食べ終わり 153.8 分**
    会計の開始 なし（-1）／帰った なし（-1）／state = Eating
    料理 2皿（dish 145・148）は届いている。**3皿めの dish 157 が来ない**
    → 食べ終わってはいるが、注文した料理が揃っていないので会計に進まない

  組 63　卓16・2人
    来店 114.0 分 → 着席 115.9 分 → **食べ始め なし（-1）**
    state = Seated
    料理 1皿（dish 147）は 126.2 分に届いている。**2皿めの dish 153 が来ない**
    → 料理が揃わないので、食べ始められない

  ★ 組63 は全64組の中で **料理が1皿しか記録されていない唯一の組**です
    （ほかの2人組は 2〜3皿）。足りない1皿が dish 153 で、
    それがロボット1 に握られたままでした。


====================================================================
3. ロボット1 の無限やり直し（trips.csv・requeues.csv）
====================================================================

  往復の記録（ロボット1。132 分以降）

    往復   開始     所要     時間切れ  未配膳  卓      料理        戻り先
    ──────────────────────────────────────────────────────────────
    118   132.0分  600.0秒   1       1     16     153        standby1
    119   141.9分  600.0秒   1       2     15;16  157;153    pass
    121   151.9分  600.0秒   1       2     15;16  157;153    standby1
    122   161.8分  600.0秒   1       2     15;16  157;153    standby1
      …（**まったく同じ行が 176 まで続く**）…
    176   708.2分  600.0秒   1       2     15;16  157;153    standby1

    ・**56 回**（往復121〜176）、10 分ごとに、1秒も違わず同じ
    ・毎回 total_s = 600.027 秒で **時間切れ**（timeout = 1）
    ・毎回 未配膳 2 皿
    ・毎回 standby1 に戻ってやり直し

  料理の積み直し（requeues.csv）

    t=9710.8 秒  dish 157（卓15・割れやすい）waited 1228.9 秒  積み直し 2 回め  why=打ち切り
    t=9710.8 秒  dish 153（卓16）          waited 1793.3 秒  積み直し 3 回め  why=打ち切り
    t=10308.5 秒 dish 157  waited 1826.7 秒  積み直し 3 回め  why=打ち切り
    t=10308.5 秒 dish 153  waited 2391.0 秒  積み直し 4 回め  why=打ち切り
      …（158 分以降で **112 件**。dish 157 が 56 回・dish 153 が 56 回）…

    ・**料理はちゃんと board に戻されています**（why = 打ち切り）
    ・けれど戻した **同じ瞬間に同じロボットが取り直します**
    ・積み直しの回数（requeued_so_far）は 57 回まで増え続ける
    ・待ち時間（waited_s）は 2988 秒 … と増え続け、上限がない

  ★ ここが本当の詰まりです。
    「board に戻す」までは動いているのに、**何回失敗しても
    ロボットから取り上げてスタッフに渡す道がありません**。
    だから仕事板は（私たちが見る瞬間には）いつも空で、
    スタッフ4人は「頼まれていないから手空き」のままでした。

  ★ スタッフに渡す道は **ある**のに使われていません。
    同じ回の dish 93 は robot_wait_expired=1 で、
    staff_dishes=7（7皿はスタッフが運んだ）と記録されています。
    つまり「ロボットを待ちきれない→スタッフが運ぶ」仕組みは動くのに、
    **往復が時間切れになった後の皿には効いていません**。


====================================================================
4. なぜロボットが着けないのか（ここは特定できていません）
====================================================================

  記録の上では、ロボットは自分を「正常」と言っています。

    立ち往生（stuck）        0
    止まった回数（n_stops）   1（0.95 秒だけ）
    通路待ち（wait_aisle_s）  0
    他のロボットと会った      0 回
    道の引き直し（replans）   0
    よけた（robot_yields）    0
    道は引けたか             **引けた**（standby1 → 卓15 の停止点・角 10 個）
    最小の余裕              1.97 m（狭い通路に入っていない）

  動いた記録（往復121 のみ）
    x=16.9, z=6.05（standby1・左の余裕 29.9 cm）
      → x=15.3, z=5.95（左の余裕 42.1 cm）
      → x=12.298, z=3.857（左の余裕 90.0 cm・**スタッフとすれ違った**）
    行き先は毎回 x=5.613, z=8.662（卓15 の停止点）。標準の経路長 14.31 m。

  往復122 以降は、standby1 での 0.95 秒の止まりが1件だけで、
  **ほかには何も記録されていません**。9.3 時間で止まりの記録は合計 57 件。
  経路 14.3 m を普通に走れば 30 秒ほどで着く距離を、600 秒かけて着きません。

  ・NavMesh の警告・例外はログに1件もありません（Unity のログを確認）
  ・NavMesh からの外れ（off_mesh 1.77 cm）は standby1 では **8.2 分の往復1
    でも同じ値**で、そのときは普通に動けています。原因ではありません

  いちばん疑っているもの（**証拠はまだありません**）

    cs:10 で入れた「すれ違いの後ずさり」の分かれ道です。
      ServingRobotController.FaceAndMove の頭に
        if (_passByBackingOff) { BackOffStep(dt); return; }
      を置きました。ここに入ると、**目的地へ進む処理も、
      止まりを記録する処理も通りません**。
    これなら「止まりも立ち往生も記録されないのに着かない」と合います。

    合わない点もあります：132 分以降 すれ違いは1件も起きておらず
    （met_robot=0）、_passByOther は居ないはずです。
    「旗が立ったまま戻らない」場合に限って説明がつきます。

  はっきりさせる方法（どれも Assets を直さずにできます）
    (ア) この回を **SimHud の1倍**で見る（依頼 v13 の 依頼2）。
         種0・③2台・すれ違い入 を Site Run で回し、132 分あたりを見る。
         1倍だと 132 分まで 2 時間以上かかるので、
         倍率表示だけ入れて速く回し、止まったところで見るのが現実的です
    (バ) det_frames（1コマごとの位置の指紋）を入れて回し、
         132 分以降のロボット1 の座標を追う。
         ExperimentPlan の detCheckFrameFingerprint を入れるだけで、
         Assets のコードは直しません
    (ウ) 後ずさりの旗が立った回数を数える欄を足す（コードを直すので、
         今日はやりません）

  私は **(バ)** を勧めます。座標が出れば「その場で揺れている」のか
  「どこかを往復している」のかが分かり、疑いを白黒つけられます。


====================================================================
5. 「切」と比べる（これは「入」特有です）
====================================================================

  70回ぜんぶの分布

    積み直し（requeued_dishes）
      切 60回   中央 0.0   幅 0〜4
      入 10回   中央 0.5   幅 **0〜117**

    時間切れ（trips.timeouts）
      切 60回   中央 0.0   幅 0〜7
      入 10回   中央 2.0   幅 **1〜59**

  ・**「入」の10回は、すべて1回以上 時間切れ**になっています（幅 1〜59）。
    「切」の60回は中央値 0 です。
  ・この回（種0・入）は 時間切れ 59 回・積み直し 117 回で、
    2番目（切の ⑦2台・種2 の 時間切れ 7 回）から大きく離れた外れ値です。
  ・全員が帰らなかった回は、70回のうち **この1回だけ**です。

  → すれ違いの走り方（cs:10 の①②③）は、
    **店を悪くするだけでなく、まれに回を壊します**。
    「標準は切のまま」というエイイチの判断は、この件でさらに裏づけられました。


====================================================================
6. まとめ（誰が・どこで・何を待っていたか）
====================================================================

  客     組62（卓15・4人）… dish 157（割れやすい）を待っていた。
                            食べ終わっているのに会計に進めない
         組63（卓16・2人）… dish 153 を待っていた。食べ始められない

  ロボット ロボット1 … 上の2皿を持って、standby1（x=16.9, z=6.05）から
                      卓15 の停止点（x=5.613, z=8.662）へ向かうが着けない。
                      600 秒で時間切れ → 皿を board に戻す →
                      同じ瞬間に取り直す、を **56 回**

  スタッフ 4人とも手空き。仕事板は空。
          **皿はいつもロボットが握っていたので、一度も頼まれなかった**

  ロボット2 往復120（152 分ごろ）で仕事を終えて、あとは待機。
            この件には関わっていません


====================================================================
7. 直すとしたらの案（まだ直していません）
====================================================================

  A. 積み直しに上限をつける（いちばん効く・いちばん小さい）
     同じ皿が N 回（例 2回）打ち切りで戻されたら、
     **ロボットには渡さずスタッフの仕事にする**。
     仕組みは既にあります（robot_wait_expired → staff_dishes）。
     「往復の時間切れ」をその引き金に足すだけです。
     → これなら、原因が分からなくても回が壊れなくなります

  B. 同じ皿を同じロボットが続けて取らないようにする
     打ち切った皿は、そのロボットだけ一定時間取れないようにする

  C. 往復の時間切れを「立ち往生」として数える
     いまは stuck=0・n_stops=1 なので、判定にも台帳にも
     「おかしい」が出ません。時間切れ59回が summary の
     trips.timeouts にしか出ないのは見つけにくいです

  D. 4 章の原因そのものを直す（まず (バ) で特定してから）

  ★ A だけでも「720 分終わらない回」は無くなります。
    原因（D）が分かっていなくても先に入れられるので、
    次の夜の前に A を入れるのを勧めます。やりますか。


====================================================================
8. 使った記録
====================================================================

  20261027_night_cs21_fam_p1_r2_s0_passon/
    timeline.csv    60 秒ごとの店の様子（722 行）… 1 章
    groups.csv      64 組の流れ … 2 章
    dishes.csv      届いた 158 皿 … 2 章（153・157 は入っていない＝届いていない）
    trips.csv       176 往復 … 3 章
    requeues.csv    117 件の積み直し … 3 章
    stops.csv       1051 件の止まり … 4 章
    passes.csv      84 件のすれ違い（最後は 132.4 分）… 4 章
    summary.json    face_stop・requeued_dishes など … 3・5 章
  night/20261027/logs/…_s0_passon.log   Unity のログ（警告・例外なし）
