---
title: "フィジカルAI研究室を作る Log#33 | アームの成否判定を Google の Gemini Decision 1 に任せられるか"
slug: gemini-decision-1-judge-mecharm-270-pick-and-place
date: 2026-11-13
day: 497
meta_description: "Google の判断専用モデル Gemini Decision 1 は、ロボットアーム mechArm 270 がブロックを箱に入れたかを56本すべて見分けたが、つかみの深さは見分けられなかった。1回約1秒・168回で約2円。"
tags: [フィジカルAI研究室, mechArm 270, Gemini Decision 1, Gemini Decisions API, Google, 成功判定, π0.5, お手本, 依頼箱]
series: "フィジカルAI研究室"
---

**Google の判断専用モデル Gemini Decision 1 は、小型ロボットアーム mechArm 270 がブロックを箱に入れたかどうかを、上カメラの1枚の画像から、正解のある56本すべてで見分けられた（答えの値を0.39で区切った場合）。一方で、ブロックを爪の奥まで深くつかめたか、爪がブロックの上に乗ってしまったか、といった細かい形はほとんど見分けられなかった。** 2026年11月11日に出たばかりのこのモデルを、実機の記録56本で試しました。

試したことで、次のことが分かりました。

- 成功・失敗の判定は任せられそう：「箱に入ったか」は56本中56本、「持ち上がったか」は56本中54本が人の判定と合った。今は Claude に画像を2枚見せて文章で判定させているが、その置き換えの候補になる
- 細かい形の判定は任せられない：「浅いつかみ」はほとんどの本を「やや浅い」と答え、「爪がブロックに乗った」と「人の手が写っている」は全部を「いいえ」と答えた。こちらは今までどおり、画素を数えて測る自前の道具（grasp_depth.py）を使う
- 速さと費用：1回の問い合わせは中央値0.96秒（手元の Mac から画像を送って答えが返るまで）。56本・168回で入力は12万5,664トークン、有料なら約0.013ドル（約2円）。今回は無料枠なので0円

この回は、X で見かけた tatsuki さんの投稿で「判断するだけの AI」が出たと知ったのがきっかけです。[Google の発表](https://blog.google/innovation-and-ai/technology/developers-tools/gemini-decisions-api/) によると、Gemini Decision 1 は文章を書かず、こちらが用意した選択肢に確率を付けて返すだけのモデルで、1回に最大1,000問をまとめて聞けます。ロボットの研究で使うなら、「つかめたか」「箱に入ったか」のような決まった問いに、速く安く答えてくれる道具になるかもしれない。そこで、すでに人が判定を付けてあるお手本の記録で、どこまで当たるかを測りました。

| やったこと | なぜ | 結果 |
|---|---|---|
| 正解の付いたお手本56本から、上カメラのコマを1本3枚ずつ切り出した | 同じ画像で、人の判定と比べるため | 閉じて1秒後・閉じて3秒後・最後のコマの168枚 |
| 5つの問いを作り、依頼箱で Mac から Gemini Decision 1 に聞いた | 「入ったか」のような結果と、「深さ」のような形の両方を試すため | 168回すべて通った。エラー0件 |
| 正解と比べ、答えの値が「はい」と「いいえ」でどれだけ分かれるかを見た | 0.5で切った一致の数だけだと、偏った答えでも高く見えるため | 箱に入った・持ち上がったは分かれた。深さ・爪が乗った・手は分かれなかった |

数字はすべて、記録（results.csv）から計算した値です。今の Claude の判定と比べてどちらが良いかは、まだ測っていません。

GPU を買うか借りるかの判断は、Runpod で実際に借りて学習させた費用をもとに、別のページにまとめています。

【バナー】gpu-buy-or-rent

【図解】LOG497_decision_split.html


## 作業ログ ― Gemini Decision 1 に mechArm 270 のお手本56本を判定させるまで

ここから下は作業の記録です。コードと出力は全量で載せます。

この回で何度も出てくる言葉を先に言い換えておきます。

- お手本：ロボット用の AI（Physical Intelligence の π0.5）に学ばせるために、人が教えた動きを mechArm 270 に再生させて撮った記録。1本が「ブロックをつかんで箱に入れる」1回分
- 浅いつかみ：爪を閉じて1秒後に、ブロックが爪先の印から24ピクセル（約9mm）より先にはみ出している状態。持ち上げで落としやすいので、学習のお手本から外している
- 爪がブロックに乗った：爪が開いたままブロックの上に降りてしまい、横から挟めなかった回
- 依頼箱：Claude Code への依頼を iCloud のフォルダに置くと、Mac の見張り役が自動で Claude Code に渡し、報告を書き戻す仕組み


### Gemini Decision 1 は、選択肢に確率を付けて返すだけの Google のモデル

[Gemini Decision 1](https://blog.google/innovation-and-ai/technology/developers-tools/gemini-decisions-api/) は、Google DeepMind が2026年11月11日に出した、判断だけをするモデルです。[Gemini Decisions API](https://flaviocopes.com/gemini-decisions-api/)（Google AI Studio の鍵で使える入口）から呼びます。ふつうの AI のように答えの文章を1語ずつ作るのではなく、こちらが決めた選択肢を一度の計算で採点し、確率を返します。

| 言葉 | この回での意味 |
|---|---|
| noul（はい／いいえ） | 「はい」である確率を 0.01〜0.99 で返す問い。この回の「箱に入ったか」など4つ |
| score（段階の採点） | 0 から始まる段階に確率を付け、その平均を返す問い。この回の「深さ」（0＝深い・1＝やや浅い・2＝浅い） |
| choice（選択） | 2〜255 の選択肢から1つを選ぶ問い。この回は使っていない |
| 自信の値（confidence） | いちばん確率の高い答えの確率。はい／いいえなら、0.9 は「はい」か「いいえ」に強く寄っている |
| 区切り | 「この値以上ならはい」とみなす線。0.5 が素直な区切りだが、問いごとに決め直してよい |

Google の発表では、1回の問い合わせは通信込みで150〜250ミリ秒、入力100万トークンあたり0.10ドルで、答えの側（出力）には料金がかかりません。無料枠もあり、無料枠で送ったデータは Google の製品の改善に使われます。この回は無料枠で試しました。

このプロジェクトでは、mechArm 270 の上カメラの画像を見て「つかめたか」「箱に入ったか」を判定する所に使えるかを試します。今はこの判定を、Claude（Sonnet）に動く前と後の画像2枚を見せ、理由の文章つきで答えさせています（実機の台帳 pick_place_ledger_v3.csv の pick_reason の列）。


## 正解のある56本を選び、上カメラのコマを3枚ずつ切り出した

正解には、2026年11月9日に深いお手本を撮った2回（LOG463 の研究室 Log#25・LOG479 の Log#26）の記録を使いました。この2回は、人が1本ずつ「つかめたか・箱に入ったか」を判定し、外した理由（浅い・爪がブロックに乗った）も表に残しています。深さは grasp_depth.py が画素で測った値です。

| 正解の種類 | 本数（56本のうち） | 正解の元 |
|---|---|---|
| 浅いつかみ | 17 | grasp_depth.py（閉じて1秒後 24px 超） |
| 爪がブロックに乗った | 8 | 人が付けた外した理由 |
| 人の手が写っている疑い | 3 | grasp_depth.py（閉じる前のコマで肌の色を拾った） |
| 持ち上がらなかった | 6 | 人の判定（pick） |
| 箱に入らなかった | 6 | 人の判定（place） |

コマは問いに合わせて3枚にしました。深さ・爪・手は閉じて1秒後のコマ（grasp_depth.py が測ったのと同じコマ）、持ち上がったかは閉じて3秒後、箱に入ったかは最後のコマです。画像は元の1920×1080 を 1280×720 に縮めて送りました。

### prep.py（正解の表 manifest.csv とコマ168枚を作る）

Mac の KIOXIA の `lab/Log33/` で動かしました。元の記録（runs/）は読むだけです。

```python
import csv,sys,os,cv2,bisect
D=os.path.expanduser("~/mnt/KIOXIA/r2r2r-data")
gd={}
for f in [D+"/lab/Log25/grasp_depth.csv","gd_log26.csv"]:
    for r in csv.DictReader(open(f)): gd[r["run"]]=r
rows=[]
for f,log in [(D+"/lab/Log25/runs_table.csv","Log25"),(D+"/lab/Log26/runs_table.csv","Log26")]:
    for r in csv.DictReader(open(f)): rows.append((log,r))
os.makedirs("img",exist_ok=True); out=[]
for log,r in rows:
    run=r["run"]; g=gd[run]; rd=f"{D}/runs/run_pick_place/{run}/recording"
    ts=[float(x["capture_ts"]) for x in csv.DictReader(open(rd+"/top_frame_log.csv"))]
    tc=float(g["t_close"]) if g["t_close"] else None
    cap=cv2.VideoCapture(rd+"/top.mp4"); n=int(cap.get(7))
    def grab(i,name):
        i=max(0,min(i,n-1)); cap.set(1,i); ok,fr=cap.read()
        if not ok: return ""
        fr=cv2.resize(fr,(1280,720)); p=f"img/{run}_{name}.jpg"; cv2.imwrite(p,fr,[cv2.IMWRITE_JPEG_QUALITY,90]); return p
    fa=int(g["frame_after"]) if g["frame_after"] else None
    lift=bisect.bisect_left(ts,tc+3.0) if tc else None
    out.append(dict(log=log,run=run,position=r["position"],human_pick=r["pick"],human_place=r["place"],
      after_px=g["after_px"],shallow=g["shallow"],hand_suspect=g["hand_suspect"],use=r["use"],reason=r["reason"],
      claw_on_block="爪がブロック" in r["reason"],
      img_after=grab(fa,"after") if fa is not None else "", img_lift=grab(lift,"lift") if lift else "", img_end=grab(n-1,"end")))
w=csv.DictWriter(open("manifest.csv","w"),fieldnames=list(out[0])); w.writeheader(); w.writerows(out)
print(len(out), sum(1 for o in out if o["img_after"]))
```

### manifest.csv（56本の正解とコマのパス）

```csv
log,run,position,human_pick,human_place,after_px,shallow,hand_suspect,use,reason,claw_on_block,img_after,img_lift,img_end
Log25,run_0001_20261109_093045,1,yes,yes,43.4,True,False,外す,浅い (閉じて 1.0 秒後 43.4px > 24px) / 教え直す前の記録,False,img/run_0001_20261109_093045_after.jpg,img/run_0001_20261109_093045_lift.jpg,img/run_0001_20261109_093045_end.jpg
Log25,run_0001_20261109_094839,1,yes,yes,16.2,False,False,使う,,False,img/run_0001_20261109_094839_after.jpg,img/run_0001_20261109_094839_lift.jpg,img/run_0001_20261109_094839_end.jpg
Log25,run_0001_20261109_095308,1,yes,yes,19.6,False,False,使う,,False,img/run_0001_20261109_095308_after.jpg,img/run_0001_20261109_095308_lift.jpg,img/run_0001_20261109_095308_end.jpg
Log25,run_0001_20261109_095452,1,yes,yes,29.2,True,False,外す,浅い (閉じて 1.0 秒後 29.2px > 24px),False,img/run_0001_20261109_095452_after.jpg,img/run_0001_20261109_095452_lift.jpg,img/run_0001_20261109_095452_end.jpg
Log25,run_0001_20261109_095630,1,yes,yes,26.0,True,False,外す,浅い (閉じて 1.0 秒後 26.0px > 24px),False,img/run_0001_20261109_095630_after.jpg,img/run_0001_20261109_095630_lift.jpg,img/run_0001_20261109_095630_end.jpg
Log25,run_0001_20261109_095810,1,yes,yes,11.2,False,False,使う,,False,img/run_0001_20261109_095810_after.jpg,img/run_0001_20261109_095810_lift.jpg,img/run_0001_20261109_095810_end.jpg
Log25,run_0001_20261109_095948,1,yes,yes,19.5,False,False,使う,,False,img/run_0001_20261109_095948_after.jpg,img/run_0001_20261109_095948_lift.jpg,img/run_0001_20261109_095948_end.jpg
Log25,run_0001_20261109_100126,1,yes,yes,10.5,False,False,使う,,False,img/run_0001_20261109_100126_after.jpg,img/run_0001_20261109_100126_lift.jpg,img/run_0001_20261109_100126_end.jpg
Log25,run_0001_20261109_100307,1,yes,yes,19.2,False,False,使う,,False,img/run_0001_20261109_100307_after.jpg,img/run_0001_20261109_100307_lift.jpg,img/run_0001_20261109_100307_end.jpg
Log25,run_0001_20261109_100444,1,yes,yes,12.0,False,False,使う,,False,img/run_0001_20261109_100444_after.jpg,img/run_0001_20261109_100444_lift.jpg,img/run_0001_20261109_100444_end.jpg
Log25,run_0001_20261109_100716,1,yes,yes,22.5,False,False,使う,,False,img/run_0001_20261109_100716_after.jpg,img/run_0001_20261109_100716_lift.jpg,img/run_0001_20261109_100716_end.jpg
Log25,run_0001_20261109_100852,1,yes,yes,29.4,True,False,外す,浅い (閉じて 1.0 秒後 29.4px > 24px),False,img/run_0001_20261109_100852_after.jpg,img/run_0001_20261109_100852_lift.jpg,img/run_0001_20261109_100852_end.jpg
Log25,run_0001_20261109_101023,1,yes,yes,30.5,True,False,外す,浅い (閉じて 1.0 秒後 30.5px > 24px),False,img/run_0001_20261109_101023_after.jpg,img/run_0001_20261109_101023_lift.jpg,img/run_0001_20261109_101023_end.jpg
Log25,run_0001_20261109_101157,1,yes,yes,15.6,False,False,使う,,False,img/run_0001_20261109_101157_after.jpg,img/run_0001_20261109_101157_lift.jpg,img/run_0001_20261109_101157_end.jpg
Log25,run_0001_20261109_101434,1,yes,yes,1.9,False,False,外す,爪がブロックに乗った (PICK の区間 7.9 秒),True,img/run_0001_20261109_101434_after.jpg,img/run_0001_20261109_101434_lift.jpg,img/run_0001_20261109_101434_end.jpg
Log25,run_0001_20261109_101615,1,yes,yes,24.9,True,False,外す,浅い (閉じて 1.0 秒後 24.9px > 24px),False,img/run_0001_20261109_101615_after.jpg,img/run_0001_20261109_101615_lift.jpg,img/run_0001_20261109_101615_end.jpg
Log25,run_0001_20261109_102109,2,yes,yes,10.9,False,False,使う,,False,img/run_0001_20261109_102109_after.jpg,img/run_0001_20261109_102109_lift.jpg,img/run_0001_20261109_102109_end.jpg
Log25,run_0001_20261109_102248,2,yes,yes,-0.9,False,False,使う,,False,img/run_0001_20261109_102248_after.jpg,img/run_0001_20261109_102248_lift.jpg,img/run_0001_20261109_102248_end.jpg
Log25,run_0001_20261109_102431,2,yes,yes,-4.6,False,False,使う,,False,img/run_0001_20261109_102431_after.jpg,img/run_0001_20261109_102431_lift.jpg,img/run_0001_20261109_102431_end.jpg
Log25,run_0001_20261109_102715,1,no,no,-15.7,False,True,外す,爪がブロックに乗った (PICK の区間 8.5 秒),True,img/run_0001_20261109_102715_after.jpg,img/run_0001_20261109_102715_lift.jpg,img/run_0001_20261109_102715_end.jpg
Log25,run_0001_20261109_102903,1,no,no,-1.9,False,False,外す,爪がブロックに乗った (PICK の区間 9.1 秒),True,img/run_0001_20261109_102903_after.jpg,img/run_0001_20261109_102903_lift.jpg,img/run_0001_20261109_102903_end.jpg
Log25,run_0001_20261109_103049,1,yes,yes,3.0,False,False,使う,,False,img/run_0001_20261109_103049_after.jpg,img/run_0001_20261109_103049_lift.jpg,img/run_0001_20261109_103049_end.jpg
Log25,run_0001_20261109_103504,2,yes,yes,0.2,False,False,外す,爪がブロックに乗った (PICK の区間 7.9 秒),True,img/run_0001_20261109_103504_after.jpg,img/run_0001_20261109_103504_lift.jpg,img/run_0001_20261109_103504_end.jpg
Log25,run_0001_20261109_103804,2,yes,yes,-6.9,False,False,使う,,False,img/run_0001_20261109_103804_after.jpg,img/run_0001_20261109_103804_lift.jpg,img/run_0001_20261109_103804_end.jpg
Log25,run_0001_20261109_103943,2,yes,yes,-7.8,False,True,使う,,False,img/run_0001_20261109_103943_after.jpg,img/run_0001_20261109_103943_lift.jpg,img/run_0001_20261109_103943_end.jpg
Log25,run_0001_20261109_104110,2,yes,yes,-2.0,False,False,使う,,False,img/run_0001_20261109_104110_after.jpg,img/run_0001_20261109_104110_lift.jpg,img/run_0001_20261109_104110_end.jpg
Log25,run_0001_20261109_104517,2,yes,yes,-7.8,False,True,使う,,False,img/run_0001_20261109_104517_after.jpg,img/run_0001_20261109_104517_lift.jpg,img/run_0001_20261109_104517_end.jpg
Log26,run_0001_20261109_120818,3,yes,yes,42.5,True,False,外す,浅い (閉じて 1.0 秒後 42.5px > 24px),False,img/run_0001_20261109_120818_after.jpg,img/run_0001_20261109_120818_lift.jpg,img/run_0001_20261109_120818_end.jpg
Log26,run_0001_20261109_121128,3,yes,yes,32.4,True,False,外す,浅い (閉じて 1.0 秒後 32.4px > 24px),False,img/run_0001_20261109_121128_after.jpg,img/run_0001_20261109_121128_lift.jpg,img/run_0001_20261109_121128_end.jpg
Log26,run_0001_20261109_121224,3,yes,yes,39.3,True,False,外す,浅い (閉じて 1.0 秒後 39.3px > 24px),False,img/run_0001_20261109_121224_after.jpg,img/run_0001_20261109_121224_lift.jpg,img/run_0001_20261109_121224_end.jpg
Log26,run_0001_20261109_121320,3,yes,yes,35.9,True,False,外す,浅い (閉じて 1.0 秒後 35.9px > 24px),False,img/run_0001_20261109_121320_after.jpg,img/run_0001_20261109_121320_lift.jpg,img/run_0001_20261109_121320_end.jpg
Log26,run_0001_20261109_121416,3,yes,yes,28.7,True,False,外す,浅い (閉じて 1.0 秒後 28.7px > 24px),False,img/run_0001_20261109_121416_after.jpg,img/run_0001_20261109_121416_lift.jpg,img/run_0001_20261109_121416_end.jpg
Log26,run_0001_20261109_121511,3,yes,yes,40.4,True,False,外す,浅い (閉じて 1.0 秒後 40.4px > 24px),False,img/run_0001_20261109_121511_after.jpg,img/run_0001_20261109_121511_lift.jpg,img/run_0001_20261109_121511_end.jpg
Log26,run_0001_20261109_121605,3,yes,yes,39.1,True,False,外す,浅い (閉じて 1.0 秒後 39.1px > 24px),False,img/run_0001_20261109_121605_after.jpg,img/run_0001_20261109_121605_lift.jpg,img/run_0001_20261109_121605_end.jpg
Log26,run_0001_20261109_121659,3,yes,yes,47.7,True,False,外す,浅い (閉じて 1.0 秒後 47.7px > 24px),False,img/run_0001_20261109_121659_after.jpg,img/run_0001_20261109_121659_lift.jpg,img/run_0001_20261109_121659_end.jpg
Log26,run_0001_20261109_121815,3,yes,yes,32.0,True,False,外す,浅い (閉じて 1.0 秒後 32.0px > 24px),False,img/run_0001_20261109_121815_after.jpg,img/run_0001_20261109_121815_lift.jpg,img/run_0001_20261109_121815_end.jpg
Log26,run_0001_20261109_123655,3,yes,yes,25.9,True,False,外す,浅い (閉じて 1.0 秒後 25.9px > 24px),False,img/run_0001_20261109_123655_after.jpg,img/run_0001_20261109_123655_lift.jpg,img/run_0001_20261109_123655_end.jpg
Log26,run_0001_20261109_123756,3,yes,yes,21.8,False,False,外す,"位置3 を 10 本にそろえるため, いちばん浅い本を外した (依頼131)",False,img/run_0001_20261109_123756_after.jpg,img/run_0001_20261109_123756_lift.jpg,img/run_0001_20261109_123756_end.jpg
Log26,run_0001_20261109_123848,3,yes,yes,9.5,False,False,使う,,False,img/run_0001_20261109_123848_after.jpg,img/run_0001_20261109_123848_lift.jpg,img/run_0001_20261109_123848_end.jpg
Log26,run_0001_20261109_123940,3,yes,yes,25.6,True,False,外す,浅い (閉じて 1.0 秒後 25.6px > 24px),False,img/run_0001_20261109_123940_after.jpg,img/run_0001_20261109_123940_lift.jpg,img/run_0001_20261109_123940_end.jpg
Log26,run_0001_20261109_124032,3,yes,yes,20.4,False,False,使う,,False,img/run_0001_20261109_124032_after.jpg,img/run_0001_20261109_124032_lift.jpg,img/run_0001_20261109_124032_end.jpg
Log26,run_0001_20261109_124117,3,yes,yes,2.7,False,False,使う,,False,img/run_0001_20261109_124117_after.jpg,img/run_0001_20261109_124117_lift.jpg,img/run_0001_20261109_124117_end.jpg
Log26,run_0001_20261109_124207,3,yes,yes,18.1,False,False,使う,,False,img/run_0001_20261109_124207_after.jpg,img/run_0001_20261109_124207_lift.jpg,img/run_0001_20261109_124207_end.jpg
Log26,run_0001_20261109_124256,3,yes,yes,4.5,False,False,使う,,False,img/run_0001_20261109_124256_after.jpg,img/run_0001_20261109_124256_lift.jpg,img/run_0001_20261109_124256_end.jpg
Log26,run_0001_20261109_124438,3,yes,yes,-2.1,False,False,使う,,False,img/run_0001_20261109_124438_after.jpg,img/run_0001_20261109_124438_lift.jpg,img/run_0001_20261109_124438_end.jpg
Log26,run_0001_20261109_124530,3,no,no,-38.2,False,False,外す,爪がブロックに乗った (PICK の区間 6.57 秒),True,img/run_0001_20261109_124530_after.jpg,img/run_0001_20261109_124530_lift.jpg,img/run_0001_20261109_124530_end.jpg
Log26,run_0001_20261109_124817,3,yes,yes,-0.6,False,False,使う,,False,img/run_0001_20261109_124817_after.jpg,img/run_0001_20261109_124817_lift.jpg,img/run_0001_20261109_124817_end.jpg
Log26,run_0001_20261109_124920,3,yes,yes,2.2,False,False,使う,,False,img/run_0001_20261109_124920_after.jpg,img/run_0001_20261109_124920_lift.jpg,img/run_0001_20261109_124920_end.jpg
Log26,run_0001_20261109_125209,4,no,no,-25.3,False,False,外す,爪がブロックに乗った (PICK の区間 7.22 秒),True,img/run_0001_20261109_125209_after.jpg,img/run_0001_20261109_125209_lift.jpg,img/run_0001_20261109_125209_end.jpg
Log26,run_0001_20261109_125607,4,no,no,3.1,False,False,外す,爪がブロックに乗った (PICK の区間 6.66 秒),True,img/run_0001_20261109_125607_after.jpg,img/run_0001_20261109_125607_lift.jpg,img/run_0001_20261109_125607_end.jpg
Log26,run_0001_20261109_125825,4,no,no,-35.7,False,False,外す,爪がブロックに乗った (PICK の区間 6.62 秒),True,img/run_0001_20261109_125825_after.jpg,img/run_0001_20261109_125825_lift.jpg,img/run_0001_20261109_125825_end.jpg
Log26,run_0001_20261109_130542,4,yes,yes,5.4,False,False,使う,,False,img/run_0001_20261109_130542_after.jpg,img/run_0001_20261109_130542_lift.jpg,img/run_0001_20261109_130542_end.jpg
Log26,run_0001_20261109_130723,4,yes,yes,3.8,False,False,使う,,False,img/run_0001_20261109_130723_after.jpg,img/run_0001_20261109_130723_lift.jpg,img/run_0001_20261109_130723_end.jpg
Log26,run_0001_20261109_130824,4,yes,yes,1.6,False,False,使う,,False,img/run_0001_20261109_130824_after.jpg,img/run_0001_20261109_130824_lift.jpg,img/run_0001_20261109_130824_end.jpg
Log26,run_0001_20261109_130929,4,yes,yes,10.0,False,False,使う,,False,img/run_0001_20261109_130929_after.jpg,img/run_0001_20261109_130929_lift.jpg,img/run_0001_20261109_130929_end.jpg
Log26,run_0001_20261109_131103,4,yes,yes,3.6,False,False,使う,,False,img/run_0001_20261109_131103_after.jpg,img/run_0001_20261109_131103_lift.jpg,img/run_0001_20261109_131103_end.jpg
```


## 5つの問いを作り、依頼箱で Mac から聞いた

問いは英語で書きました（Gemini Decisions API の例が英語で、問いの文がそのまま判定に使われるため）。どの問いにも、写っているものの説明を1行付けています。

| 問い（記録の名前） | 見るコマ | 型 | 問いの中身 |
|---|---|---|---|
| depth | 閉じて1秒後 | 段階の採点 | ブロックは爪の奥まで入っているか（深い・やや浅い・浅い） |
| claw_on_block | 閉じて1秒後 | はい／いいえ | 爪がブロックの横ではなく上に乗っているか |
| hand | 閉じて1秒後 | はい／いいえ | 人の手や指が写っているか |
| picked | 閉じて3秒後 | はい／いいえ | ブロックが爪の間にあり、マットから持ち上がっているか |
| placed | 最後のコマ | はい／いいえ | ブロックが白い箱の中にあるか |

鍵は、マンガの絵を作るときに使っている Google AI Studio の鍵（KIOXIA の `gemini_api_key.txt`）をそのまま使いました。Decisions API は同じ Gemini API の入口なので、新しく鍵を作る必要はありませんでした。

この作業場所（Claude のクラウドの作業環境）からは Google の API に届かなかったので、問い合わせは依頼箱で Mac の Claude Code に回してもらいました。

### decision_eval.py（Gemini Decision 1 に問い、正解と比べる）

```python
#!/usr/bin/env python3
"""decision_eval.py — Gemini Decision 1 が mechArm のお手本をどこまで正しく判定できるかを測る (読むだけ).

正解: lab/Log25・Log26 の runs_table.csv (人の判定 pick/place・外した理由) と grasp_depth.py の結果 (浅い=閉じて1秒後 24px 超・手の疑い).
入力: manifest.csv (prep.py が作る. 1本につき上カメラのコマ3枚: 閉じて1秒後 after / 閉じて3秒後 lift / 最後のコマ end)
鍵:   /Volumes/KIOXIA/gemini_api_key.txt
  python3 decision_eval.py run  [--limit N] [--resolution low|medium|high]   # API を呼んで results.csv に書く
  python3 decision_eval.py score                                             # results.csv と正解を比べて score.md に書く
"""
import argparse, base64, csv, json, os, sys, time, urllib.request, statistics as st

URL = "https://generativelanguage.googleapis.com/v1beta/decisions"
KEY = "/Volumes/KIOXIA/gemini_api_key.txt"
CTX = ("Top-down camera image of a small desktop robot arm (mechArm 270) with a two-finger gripper "
       "picking a red cube from a mat and placing it into a white box.\n")
Q = {
 "after": {
  "depth": {"type": "score", "instructions": CTX + "The gripper has just closed on the red cube. How deep is the cube inside the gripper fingers?",
            "criteria": ["Deep: the cube sits well inside the fingers, not sticking out past the finger tips.",
                         "Partly: the cube sticks out slightly past the finger tips.",
                         "Shallow: the cube is held only at the very tips of the fingers or sticks out a lot."]},
  "claw_on_block": {"type": "noul", "instructions": CTX + "Is a gripper finger resting on top of the red cube instead of closing beside it?"},
  "hand": {"type": "noul", "instructions": CTX + "Is a human hand or finger visible in the image?"},
 },
 "lift": {"picked": {"type": "noul", "instructions": CTX + "Is the red cube held between the gripper fingers and lifted off the mat?"}},
 "end":  {"placed": {"type": "noul", "instructions": CTX + "Is the red cube inside the white box?"}},
}

def call(key, img, questions, res):
    body = {"model": "gemini-decision-1",
            "input": [{"type": "image", "data": base64.b64encode(open(img, "rb").read()).decode(),
                       "mime_type": "image/jpeg", "resolution": res}],
            "questions": questions}
    req = urllib.request.Request(URL, json.dumps(body).encode(), {"Content-Type": "application/json", "x-goog-api-key": key})
    t = time.time()
    with urllib.request.urlopen(req, timeout=60) as r: out = json.load(r)
    return out, time.time() - t

def run(a):
    key = open(KEY).read().strip()
    rows = list(csv.DictReader(open("manifest.csv")))[: a.limit or None]
    w = csv.writer(open("results.csv", "w")); w.writerow(["run", "image", "question", "value", "probabilities", "confidence", "latency_s", "input_tokens", "resolution"])
    for r in rows:
        for kind, qs in Q.items():
            img = r[f"img_{kind}"]
            if not img: continue
            try: out, lat = call(key, img, qs, a.resolution)
            except Exception as e:
                print("ERR", r["run"], kind, e, file=sys.stderr); continue
            tok = out.get("usage", {}).get("total_input_tokens", "")
            for q, ans in out["answers"].items():
                v = ans.get("noul", ans.get("score", ans.get("choice")))
                w.writerow([r["run"], kind, q, v, json.dumps(ans.get("probabilities", "")), ans.get("confidence"), round(lat, 3), tok, a.resolution])
            print(r["run"], kind, "ok", round(lat, 2))
            time.sleep(0.4)

def score(a):
    man = {r["run"]: r for r in csv.DictReader(open("manifest.csv"))}
    res = {}
    for r in csv.DictReader(open("results.csv")): res[(r["run"], r["question"])] = r
    truth = {  # 正解 (True = 問いに「はい」)
      "depth": lambda m: m["shallow"] == "True",            # 浅い (24px 超)
      "claw_on_block": lambda m: m["claw_on_block"] == "True",
      "hand": lambda m: m["hand_suspect"] == "True",
      "picked": lambda m: m["human_pick"] == "yes",
      "placed": lambda m: m["human_place"] == "yes"}
    L = ["# Gemini Decision 1 の判定と正解の比べ\n", "| 問い | 本数 | 正解が「はい」 | 一致 | 見逃し | 誤り | 自信0.8以上の一致 | 自信0.8未満の本数 |", "|---|---|---|---|---|---|---|---|"]
    for q, f in truth.items():
        n = tp = fn = fp = hi_n = hi_ok = lo = 0; pos = 0
        for run, m in man.items():
            r = res.get((run, q))
            if not r: continue
            t = f(m); v = float(r["value"]); c = float(r["confidence"] or 0)
            p = (v >= 1.0) if q == "depth" else (v >= 0.5)   # depth は 0〜2 の段階の平均. 1 以上を「浅い」とみなす
            n += 1; pos += t; ok = (p == t); tp += ok and t; fn += (t and not p); fp += (p and not t)
            if c >= 0.8: hi_n += 1; hi_ok += ok
            else: lo += 1
            agree = sum(1 for _ in [0])
        if n: L.append(f"| {q} | {n} | {pos} | {sum(1 for run,m in man.items() if (run,q) in res and ((float(res[(run,q)]['value'])>=(1.0 if q=='depth' else 0.5))==f(m)))} | {fn} | {fp} | {hi_ok}/{hi_n} | {lo} |")
    lats = [float(r["latency_s"]) for r in res.values()]; toks = [int(r["input_tokens"]) for r in res.values() if r["input_tokens"]]
    if lats: L.append(f"\n1回の依頼の時間 (通信込み): 中央値 {st.median(lats):.2f} 秒 / 最大 {max(lats):.2f} 秒")
    if toks: L.append(f"入力トークン: 1回あたり中央値 {int(st.median(toks))} / 合計 {sum(toks)} (費用の目安 ${sum(toks)/1e6*0.10:.4f})")
    open("score.md", "w").write("\n".join(L) + "\n"); print("\n".join(L))

if __name__ == "__main__":
    ap = argparse.ArgumentParser(); ap.add_argument("cmd", choices=["run", "score"]); ap.add_argument("--limit", type=int); ap.add_argument("--resolution", default="medium")
    a = ap.parse_args(); run(a) if a.cmd == "run" else score(a)
```

### 依頼160 の依頼文（20261113_160_GeminiDecision1でお手本の判定を正解と比べる.md）

依頼の文と、記録の置き場所の名前は Log32 のままです。あとで、研究室の Log#32 は LOG492 ですでに使っていたと分かり、置き場所を `lab/Log33/` に移しました。

```markdown
---
作業フォルダ: /Users/shimazueiichi/r2r2r-scripts
上限時間: 40
---
# Gemini Decision 1 で mechArm のお手本の判定を正解と比べる（研究室 Log32・LOG497）

Google の Gemini Decisions API（gemini-decision-1）に、お手本のコマを問い、人の判定・grasp_depth.py の結果と比べる。**読むだけの比べ。実機は動かさない。r2r2r-scripts のファイルは変えない。**

準備は Claude（チャット）が済ませた：
- `/Volumes/KIOXIA/r2r2r-data/lab/Log32/` に manifest.csv（56本・正解つき）、img/（168枚）、code/decision_eval.py・code/prep.py、gd_log26.csv
- 鍵は `/Volumes/KIOXIA/gemini_api_key.txt`（マンガと同じ鍵。表示しない・どこにも写さない）。無料枠で行う（エイイチの決め 2026-11-13）

## 手順

1. `cd /Volumes/KIOXIA/r2r2r-data/lab/Log32`（KIOXIA がつながっていなければ止めて報告）
2. まず3本だけ試す：`python3 code/decision_eval.py run --limit 3`
   - HTTP 400/403/404 などで通らなければ、そこで止める。エラーの本文（鍵は除く）を報告に写す。直し方を推測で試し続けない（入口の URL・入力の形の直しは1回だけ試してよい。そのときは何を変えたかを報告に書く）
3. 通ったら全部：`python3 code/decision_eval.py run`（56本×3枚＝168回。1回ごとに 0.4 秒あける）
4. `python3 code/decision_eval.py score` で score.md を作る
5. 実行の記録として `run_log.txt` に、実行した日時・コマンド・ERR の行の数を書く

## 報告に入れること
- score.md の中身をそのまま
- ERR があった数と、その理由の例
- 1回の時間の中央値・入力トークンの合計
- 決めてほしいこと（なければ「なし」）

## 守ること
- 書いてよいのは `lab/Log32/` の中の results.csv・score.md・run_log.txt だけ。ほかの記録（runs/・datasets/）は読むだけ
- 鍵の中身をログ・報告・ファイルに出さない
- git の操作はしない
```

### 依頼160 の報告（結果/20261113_160_GeminiDecision1でお手本の判定を正解と比べる_20261113_0040.md）

```markdown
# 結果：20261113_160_GeminiDecision1でお手本の判定を正解と比べる

- 状態：完了
- 始めた時刻：2026-11-13 00:40
- 終わった時刻：2026-11-13 00:45（5分）
- 作業フォルダ：/Users/shimazueiichi/r2r2r-scripts
- この続きを Claude Code で話すとき：作業フォルダで `claude --resume 461d38fb-51f9-4fe1-8480-4d2c76afbc1f`

## Claude Code の報告

**やったこと**
- KIOXIA は接続されていました。`/Volumes/KIOXIA/r2r2r-data/lab/Log32` で、まず `run --limit 3` を試しました。9回とも通ったので、続けて `run`（56本×3枚＝168回）を全部実行しました。そのあと `score` で score.md を作り、run_log.txt に実行の日時・コマンド・ERR の行の数を書きました。
- 入口の URL や入力の形は直していません。実機は動かしていません。git の操作もしていません。
- 鍵の中身は、ログ・報告・ファイルのどこにも出していません。

**結果**
score.md の中身（そのまま）：

# Gemini Decision 1 の判定と正解の比べ

| 問い | 本数 | 正解が「はい」 | 一致 | 見逃し | 誤り | 自信0.8以上の一致 | 自信0.8未満の本数 |
|---|---|---|---|---|---|---|---|
| depth | 56 | 17 | 27 | 0 | 29 | 0/0 | 56 |
| claw_on_block | 56 | 8 | 48 | 8 | 0 | 0/1 | 55 |
| hand | 56 | 3 | 53 | 3 | 0 | 53/56 | 0 |
| picked | 56 | 50 | 54 | 0 | 2 | 18/18 | 38 |
| placed | 56 | 50 | 53 | 3 | 0 | 24/24 | 32 |

1回の依頼の時間 (通信込み): 中央値 0.96 秒 / 最大 2.52 秒
入力トークン: 1回あたり中央値 916 / 合計 228256 (費用の目安 $0.0228)

- **ERR の数**：0（3本の試しも全部の実行も、168回すべて通りました）。
- **1回の時間の中央値**：0.96 秒。
- **入力トークンの合計**：1回の依頼ごとに数えると 125,664 です。
  - score.md の「合計 228256」は、1回の依頼に入っている問いの数だけ同じトークンを足し直した値です。after のコマは3問なので3倍に数えられ、多く出ています。score.md は decision_eval.py が出すまま残し、run_log.txt にこの違いを書きました。
- **値の幅**：一致の数だけでは見えないので書いておきます。
  - claw_on_block の値は 0.20〜0.41、hand は 0.06〜0.13 でした。どちらも一度も「はい」になっていません。一致が多いのは、正解に「いいえ」が多いからです。
  - depth の値は 0.90〜1.48 で、56本中46本を「浅い」と答えています。区切りは 1.0 で、誤りの29本はこれが原因です。
  - picked と placed は、自信 0.8 以上の答えだけを見ると全部当たっていました（18/18、24/24）。

**変えたファイル**
- `/Volumes/KIOXIA/r2r2r-data/lab/Log32/results.csv`（新しく作成。280行）
- `/Volumes/KIOXIA/r2r2r-data/lab/Log32/score.md`（新しく作成）
- `/Volumes/KIOXIA/r2r2r-data/lab/Log32/run_log.txt`（新しく作成）
- r2r2r-scripts のファイルは変えていません。いつも作る作業の記録（logs/）も、今回は書いてよい場所が決まっていたので作っていません。

**決めてほしいこと**
1. depth の「浅い」の区切りを 1.0 のままにするかどうか。今の区切りだと、ほとんどが「浅い」になります。
2. score.md のトークン合計の数え方を、1回の依頼ごとに直すかどうか。直すには decision_eval.py を変える必要があり、今回の範囲の外なので変えていません。
```

### run_log.txt（実行の記録）

```text
Gemini Decision 1 お手本の判定の比べ (依頼 160・Log32) 実行の記録

2026-11-13 00:40:46  python3 code/decision_eval.py run --limit 3   -> 9 回すべて ok / ERR 0 行 (この results.csv は次の全部の実行で上書き)
2026-11-13 00:41:18  python3 code/decision_eval.py run              -> 168 回すべて ok / ERR 0 行 / 終了 00:45:19 (終了コード 0)
2026-11-13 00:45 頃  python3 code/decision_eval.py score            -> score.md を作成

ERR の行の数: 0
results.csv: 280 行 (見出しを除く. 56 本 x 問い 5 つ)
1 回の依頼の時間 (通信込み) の中央値: 0.96 秒
入力トークンの合計 (1 回の依頼ごとに数えた値): 125664
  ※ score.md の「合計 228256」は 1 回の依頼の中の問いの数だけ同じトークンを重ねて足した値 (after は 3 問なので 3 倍)
解像度: medium
番号の付け直し: 2026-11-13 07:12 に lab/Log32 から lab/Log33 へ移した（研究室の Log#32 は LOG492 で使っていたため。エイイチの決め）
```

### score.md（decision_eval.py score の出力）

```markdown
# Gemini Decision 1 の判定と正解の比べ

| 問い | 本数 | 正解が「はい」 | 一致 | 見逃し | 誤り | 自信0.8以上の一致 | 自信0.8未満の本数 |
|---|---|---|---|---|---|---|---|
| depth | 56 | 17 | 27 | 0 | 29 | 0/0 | 56 |
| claw_on_block | 56 | 8 | 48 | 8 | 0 | 0/1 | 55 |
| hand | 56 | 3 | 53 | 3 | 0 | 53/56 | 0 |
| picked | 56 | 50 | 54 | 0 | 2 | 18/18 | 38 |
| placed | 56 | 50 | 53 | 3 | 0 | 24/24 | 32 |

1回の依頼の時間 (通信込み): 中央値 0.96 秒 / 最大 2.52 秒
入力トークン: 1回あたり中央値 916 / 合計 228256 (費用の目安 $0.0228)
```

score.md の入力トークンの合計（228,256）は、1回の問い合わせに入っている問いの数だけ、同じ画像のトークンを重ねて足していました。閉じて1秒後のコマは3問をまとめて1回で聞いているので3倍に数えています。1回ごとに数え直すと125,664です（Claude Code が報告で気づいて書き添えた）。


### results.csv（Gemini Decision 1 の答え。56本×問い5つの280行）

```csv
run,image,question,value,probabilities,confidence,latency_s,input_tokens,resolution
run_0001_20261109_093045,after,hand,0.07825768639650402,"""""",0.921742313603496,0.801,916,medium
run_0001_20261109_093045,after,claw_on_block,0.34722401849086054,"""""",0.6527759815091394,0.801,916,medium
run_0001_20261109_093045,after,depth,1.484278681760648,"{""2"": 0.6009309944115484, ""1"": 0.28241669293755106, ""0"": 0.11665231265090062}",0.6009309944115484,0.801,916,medium
run_0001_20261109_093045,lift,picked,0.80335932549735,"""""",0.80335932549735,0.711,667,medium
run_0001_20261109_093045,end,placed,0.7828334951626438,"""""",0.7828334951626438,0.706,661,medium
run_0001_20261109_094839,after,depth,1.2999504879618984,"{""0"": 0.17842460629738316, ""2"": 0.47837509425928165, ""1"": 0.3432002994433352}",0.47837509425928165,0.624,916,medium
run_0001_20261109_094839,after,hand,0.11374083289454251,"""""",0.8862591671054575,0.624,916,medium
run_0001_20261109_094839,after,claw_on_block,0.3729087346066859,"""""",0.6270912653933141,0.624,916,medium
run_0001_20261109_094839,lift,picked,0.6087300707227506,"""""",0.6087300707227506,0.631,667,medium
run_0001_20261109_094839,end,placed,0.6861316710277711,"""""",0.6861316710277711,0.613,661,medium
run_0001_20261109_095308,after,hand,0.06316467683057825,"""""",0.9368353231694218,0.741,916,medium
run_0001_20261109_095308,after,claw_on_block,0.3760473828236374,"""""",0.6239526171763625,0.741,916,medium
run_0001_20261109_095308,after,depth,1.1728337211437156,"{""0"": 0.2494280924796529, ""2"": 0.4222618136233684, ""1"": 0.32831009389697874}",0.4222618136233684,0.741,916,medium
run_0001_20261109_095308,lift,picked,0.7284562419005459,"""""",0.7284562419005459,2.52,667,medium
run_0001_20261109_095308,end,placed,0.7492670830212711,"""""",0.7492670830212711,0.742,661,medium
run_0001_20261109_095452,after,claw_on_block,0.3638027691706754,"""""",0.6361972308293247,1.058,916,medium
run_0001_20261109_095452,after,depth,1.276389561375232,"{""0"": 0.19183231968038314, ""1"": 0.3399457992640013, ""2"": 0.4682218810556154}",0.4682218810556154,1.058,916,medium
run_0001_20261109_095452,after,hand,0.13183042450182392,"""""",0.8681695754981761,1.058,916,medium
run_0001_20261109_095452,lift,picked,0.728348691398107,"""""",0.728348691398107,1.043,667,medium
run_0001_20261109_095452,end,placed,0.7909952793512397,"""""",0.7909952793512397,0.751,661,medium
run_0001_20261109_095630,after,depth,1.2334536005750556,"{""2"": 0.4514575303154636, ""1"": 0.33053853994412835, ""0"": 0.21800392974040808}",0.4514575303154636,0.99,916,medium
run_0001_20261109_095630,after,claw_on_block,0.35247893432847005,"""""",0.64752106567153,0.99,916,medium
run_0001_20261109_095630,after,hand,0.097462707899559,"""""",0.902537292100441,0.99,916,medium
run_0001_20261109_095630,lift,picked,0.7810104950955188,"""""",0.7810104950955188,0.78,667,medium
run_0001_20261109_095630,end,placed,0.6532972896181847,"""""",0.6532972896181847,1.057,661,medium
run_0001_20261109_095810,after,depth,1.2420678879149918,"{""0"": 0.2125992566226687, ""1"": 0.3327335988396709, ""2"": 0.4546671445376604}",0.4546671445376604,0.88,916,medium
run_0001_20261109_095810,after,claw_on_block,0.3704440786580568,"""""",0.6295559213419433,0.88,916,medium
run_0001_20261109_095810,after,hand,0.06643942346341124,"""""",0.9335605765365887,0.88,916,medium
run_0001_20261109_095810,lift,picked,0.6916668654049893,"""""",0.6916668654049893,1.015,667,medium
run_0001_20261109_095810,end,placed,0.6967579423017927,"""""",0.6967579423017927,1.163,661,medium
run_0001_20261109_095948,after,depth,1.247131401017933,"{""0"": 0.20354772424752246, ""2"": 0.4506791252654557, ""1"": 0.34577315048702173}",0.4506791252654557,0.99,916,medium
run_0001_20261109_095948,after,claw_on_block,0.3414648105832947,"""""",0.6585351894167053,0.99,916,medium
run_0001_20261109_095948,after,hand,0.11538749435623025,"""""",0.8846125056437697,0.99,916,medium
run_0001_20261109_095948,lift,picked,0.6931147144616,"""""",0.6931147144616,0.886,667,medium
run_0001_20261109_095948,end,placed,0.8243937196851882,"""""",0.8243937196851882,0.923,661,medium
run_0001_20261109_100126,after,depth,1.075961920986297,"{""1"": 0.3789839177292893, ""2"": 0.3484890016285038, ""0"": 0.2725270806422068}",0.3789839177292893,0.996,916,medium
run_0001_20261109_100126,after,claw_on_block,0.2421879618847859,"""""",0.7578120381152141,0.996,916,medium
run_0001_20261109_100126,after,hand,0.10457024731729979,"""""",0.8954297526827002,0.996,916,medium
run_0001_20261109_100126,lift,picked,0.5424426598233046,"""""",0.5424426598233046,0.949,667,medium
run_0001_20261109_100126,end,placed,0.751426196881013,"""""",0.751426196881013,1.158,661,medium
run_0001_20261109_100307,after,hand,0.09649110560462407,"""""",0.903508894395376,0.964,916,medium
run_0001_20261109_100307,after,claw_on_block,0.2865770343789549,"""""",0.7134229656210451,0.964,916,medium
run_0001_20261109_100307,after,depth,1.3495461331123244,"{""0"": 0.17329499818344304, ""1"": 0.3038638705207893, ""2"": 0.5228411312957676}",0.5228411312957676,0.964,916,medium
run_0001_20261109_100307,lift,picked,0.6744921847503987,"""""",0.6744921847503987,0.961,667,medium
run_0001_20261109_100307,end,placed,0.7386262783361065,"""""",0.7386262783361065,0.868,661,medium
run_0001_20261109_100444,after,hand,0.07970659936402986,"""""",0.9202934006359701,0.954,916,medium
run_0001_20261109_100444,after,depth,1.1015598833789546,"{""1"": 0.3362104697254454, ""2"": 0.3826747068267546, ""0"": 0.2811148234478001}",0.3826747068267546,0.954,916,medium
run_0001_20261109_100444,after,claw_on_block,0.38775926701423336,"""""",0.6122407329857666,0.954,916,medium
run_0001_20261109_100444,lift,picked,0.6220990793020288,"""""",0.6220990793020288,0.999,667,medium
run_0001_20261109_100444,end,placed,0.838515180537258,"""""",0.838515180537258,0.815,661,medium
run_0001_20261109_100716,after,claw_on_block,0.30036921255444377,"""""",0.6996307874455563,0.975,916,medium
run_0001_20261109_100716,after,hand,0.074597463950869,"""""",0.925402536049131,0.975,916,medium
run_0001_20261109_100716,after,depth,1.354149503749384,"{""0"": 0.15629761081557478, ""1"": 0.3332552746194662, ""2"": 0.510447114564959}",0.510447114564959,0.975,916,medium
run_0001_20261109_100716,lift,picked,0.7511793879017937,"""""",0.7511793879017937,1.179,667,medium
run_0001_20261109_100716,end,placed,0.7940243029917343,"""""",0.7940243029917343,1.026,661,medium
run_0001_20261109_100852,after,claw_on_block,0.33170015043970064,"""""",0.6682998495602994,1.036,916,medium
run_0001_20261109_100852,after,depth,1.4449715544269732,"{""2"": 0.5725354695876881, ""1"": 0.2999006152515971, ""0"": 0.12756391516071477}",0.5725354695876881,1.036,916,medium
run_0001_20261109_100852,after,hand,0.0744931527662361,"""""",0.9255068472337639,1.036,916,medium
run_0001_20261109_100852,lift,picked,0.8333200516846367,"""""",0.8333200516846367,0.914,667,medium
run_0001_20261109_100852,end,placed,0.827723405686118,"""""",0.827723405686118,0.929,661,medium
run_0001_20261109_101023,after,claw_on_block,0.3048568030240302,"""""",0.6951431969759698,1.226,916,medium
run_0001_20261109_101023,after,depth,1.2651803061322553,"{""2"": 0.4628053485904144, ""1"": 0.3395696089514265, ""0"": 0.19762504245815904}",0.4628053485904144,1.226,916,medium
run_0001_20261109_101023,after,hand,0.10499140809486932,"""""",0.8950085919051307,1.226,916,medium
run_0001_20261109_101023,lift,picked,0.764897259433054,"""""",0.764897259433054,0.826,667,medium
run_0001_20261109_101023,end,placed,0.6942048174085936,"""""",0.6942048174085936,0.919,661,medium
run_0001_20261109_101157,after,claw_on_block,0.3280733786798793,"""""",0.6719266213201207,0.833,916,medium
run_0001_20261109_101157,after,hand,0.07888482893569679,"""""",0.9211151710643032,0.833,916,medium
run_0001_20261109_101157,after,depth,1.3472531279197129,"{""2"": 0.5171339223720037, ""1"": 0.3129852831757053, ""0"": 0.169880794452291}",0.5171339223720037,0.833,916,medium
run_0001_20261109_101157,lift,picked,0.6729294966156413,"""""",0.6729294966156413,1.117,667,medium
run_0001_20261109_101157,end,placed,0.79988137923655,"""""",0.79988137923655,1.273,661,medium
run_0001_20261109_101434,after,claw_on_block,0.3397576875295283,"""""",0.6602423124704717,1.295,916,medium
run_0001_20261109_101434,after,hand,0.10350514652653339,"""""",0.8964948534734666,1.295,916,medium
run_0001_20261109_101434,after,depth,1.1922588950833373,"{""0"": 0.22310914020165232, ""2"": 0.4153680352849897, ""1"": 0.3615228245133579}",0.4153680352849897,1.295,916,medium
run_0001_20261109_101434,lift,picked,0.7448670874227433,"""""",0.7448670874227433,1.162,667,medium
run_0001_20261109_101434,end,placed,0.42106233634895324,"""""",0.5789376636510468,1.209,661,medium
run_0001_20261109_101615,after,claw_on_block,0.31227844531099663,"""""",0.6877215546890034,0.857,916,medium
run_0001_20261109_101615,after,depth,1.2334919620166045,"{""0"": 0.2221331957562476, ""2"": 0.455625157772852, ""1"": 0.3222416464709004}",0.455625157772852,0.857,916,medium
run_0001_20261109_101615,after,hand,0.06725262544544398,"""""",0.932747374554556,0.857,916,medium
run_0001_20261109_101615,lift,picked,0.7361468814535878,"""""",0.7361468814535878,1.214,667,medium
run_0001_20261109_101615,end,placed,0.7340761490802118,"""""",0.7340761490802118,0.864,661,medium
run_0001_20261109_102109,after,hand,0.11668769589909045,"""""",0.8833123041009096,0.911,916,medium
run_0001_20261109_102109,after,depth,1.0583948056378825,"{""0"": 0.2906231968322637, ""2"": 0.34901800247014614, ""1"": 0.36035880069759013}",0.36035880069759013,0.911,916,medium
run_0001_20261109_102109,after,claw_on_block,0.3002786901412292,"""""",0.6997213098587708,0.911,916,medium
run_0001_20261109_102109,lift,picked,0.7098372268957737,"""""",0.7098372268957737,1.826,667,medium
run_0001_20261109_102109,end,placed,0.5902566703451961,"""""",0.5902566703451961,1.657,661,medium
run_0001_20261109_102248,after,claw_on_block,0.2914609099091963,"""""",0.7085390900908037,1.667,916,medium
run_0001_20261109_102248,after,hand,0.11539419514678328,"""""",0.8846058048532167,1.667,916,medium
run_0001_20261109_102248,after,depth,1.1402406859301704,"{""1"": 0.34363957461012457, ""0"": 0.2580598697298526, ""2"": 0.39830055566002287}",0.39830055566002287,1.667,916,medium
run_0001_20261109_102248,lift,picked,0.8028471386734956,"""""",0.8028471386734956,1.548,667,medium
run_0001_20261109_102248,end,placed,0.7421220058947621,"""""",0.7421220058947621,0.891,661,medium
run_0001_20261109_102431,after,hand,0.07341581355220862,"""""",0.9265841864477914,0.939,916,medium
run_0001_20261109_102431,after,depth,1.0625722240382922,"{""2"": 0.3561639140193971, ""0"": 0.293591689981105, ""1"": 0.35024439599949786}",0.3561639140193971,0.939,916,medium
run_0001_20261109_102431,after,claw_on_block,0.3535676977832471,"""""",0.6464323022167529,0.939,916,medium
run_0001_20261109_102431,lift,picked,0.7119161321708873,"""""",0.7119161321708873,1.643,667,medium
run_0001_20261109_102431,end,placed,0.7036471888428885,"""""",0.7036471888428885,1.043,661,medium
run_0001_20261109_102715,after,depth,1.1087982478565293,"{""2"": 0.35887202197061785, ""1"": 0.39105420391529344, ""0"": 0.25007377411408865}",0.39105420391529344,0.753,916,medium
run_0001_20261109_102715,after,hand,0.0933645486854996,"""""",0.9066354513145004,0.753,916,medium
run_0001_20261109_102715,after,claw_on_block,0.32777844885107893,"""""",0.6722215511489211,0.753,916,medium
run_0001_20261109_102715,lift,picked,0.6080496705965098,"""""",0.6080496705965098,1.165,667,medium
run_0001_20261109_102715,end,placed,0.12511776101099356,"""""",0.8748822389890064,0.852,661,medium
run_0001_20261109_102903,after,depth,1.0208317758225902,"{""0"": 0.3078871269728205, ""1"": 0.36339397023176884, ""2"": 0.3287189027954107}",0.36339397023176884,1.013,916,medium
run_0001_20261109_102903,after,hand,0.0776730415605503,"""""",0.9223269584394497,1.013,916,medium
run_0001_20261109_102903,after,claw_on_block,0.3507297253531531,"""""",0.6492702746468468,1.013,916,medium
run_0001_20261109_102903,lift,picked,0.2508221419764871,"""""",0.7491778580235129,0.834,667,medium
run_0001_20261109_102903,end,placed,0.12780883544942861,"""""",0.8721911645505713,0.87,661,medium
run_0001_20261109_103049,after,hand,0.09902614898319148,"""""",0.9009738510168085,1.253,916,medium
run_0001_20261109_103049,after,depth,0.991333286403675,"{""2"": 0.3086457961020824, ""0"": 0.3173125096984073, ""1"": 0.3740416941995102}",0.3740416941995102,1.253,916,medium
run_0001_20261109_103049,after,claw_on_block,0.27780062399397387,"""""",0.7221993760060261,1.253,916,medium
run_0001_20261109_103049,lift,picked,0.5204880023080126,"""""",0.5204880023080126,1.066,667,medium
run_0001_20261109_103049,end,placed,0.8372214139878952,"""""",0.8372214139878952,1.151,661,medium
run_0001_20261109_103504,after,claw_on_block,0.35448520200752925,"""""",0.6455147979924707,0.964,916,medium
run_0001_20261109_103504,after,hand,0.06776929867700986,"""""",0.9322307013229901,0.964,916,medium
run_0001_20261109_103504,after,depth,1.0465827285302054,"{""2"": 0.34458678384929314, ""1"": 0.3574091608316192, ""0"": 0.2980040553190877}",0.3574091608316192,0.964,916,medium
run_0001_20261109_103504,lift,picked,0.5146211625573611,"""""",0.5146211625573611,1.144,667,medium
run_0001_20261109_103504,end,placed,0.8330833143423189,"""""",0.8330833143423189,0.994,661,medium
run_0001_20261109_103804,after,hand,0.07943354759279393,"""""",0.920566452407206,0.816,916,medium
run_0001_20261109_103804,after,depth,0.9038776789176342,"{""2"": 0.2723350947066504, ""1"": 0.35920748950433334, ""0"": 0.3684574157890162}",0.3684574157890162,0.816,916,medium
run_0001_20261109_103804,after,claw_on_block,0.2541134737791826,"""""",0.7458865262208174,0.816,916,medium
run_0001_20261109_103804,lift,picked,0.6876195560896553,"""""",0.6876195560896553,1.346,667,medium
run_0001_20261109_103804,end,placed,0.780487365892437,"""""",0.780487365892437,0.996,661,medium
run_0001_20261109_103943,after,depth,1.1267541477175311,"{""2"": 0.3685517043833689, ""0"": 0.2417975566658379, ""1"": 0.38965073895079316}",0.38965073895079316,0.88,916,medium
run_0001_20261109_103943,after,claw_on_block,0.3029268676688482,"""""",0.6970731323311519,0.88,916,medium
run_0001_20261109_103943,after,hand,0.1176216379360212,"""""",0.8823783620639788,0.88,916,medium
run_0001_20261109_103943,lift,picked,0.6137730409775153,"""""",0.6137730409775153,0.797,667,medium
run_0001_20261109_103943,end,placed,0.722372144103381,"""""",0.722372144103381,0.909,661,medium
run_0001_20261109_104110,after,claw_on_block,0.2559420402517385,"""""",0.7440579597482615,0.822,916,medium
run_0001_20261109_104110,after,depth,0.9590215710330632,"{""0"": 0.3460333722462058, ""2"": 0.305054943279269, ""1"": 0.3489116844745252}",0.3489116844745252,0.822,916,medium
run_0001_20261109_104110,after,hand,0.09165770965849329,"""""",0.9083422903415067,0.822,916,medium
run_0001_20261109_104110,lift,picked,0.5744889729270998,"""""",0.5744889729270998,1.068,667,medium
run_0001_20261109_104110,end,placed,0.7710949142081639,"""""",0.7710949142081639,0.931,661,medium
run_0001_20261109_104517,after,claw_on_block,0.4099623067048645,"""""",0.5900376932951354,1.098,916,medium
run_0001_20261109_104517,after,depth,0.9449036926279983,"{""2"": 0.2853812471427626, ""0"": 0.34047755451476436, ""1"": 0.3741411983424731}",0.3741411983424731,1.098,916,medium
run_0001_20261109_104517,after,hand,0.11116278195577325,"""""",0.8888372180442268,1.098,916,medium
run_0001_20261109_104517,lift,picked,0.5607596114889611,"""""",0.5607596114889611,0.928,667,medium
run_0001_20261109_104517,end,placed,0.8635108778722517,"""""",0.8635108778722517,0.782,661,medium
run_0001_20261109_120818,after,claw_on_block,0.3585873200334799,"""""",0.6414126799665201,1.078,916,medium
run_0001_20261109_120818,after,depth,1.1812905247108694,"{""0"": 0.22240031114516162, ""1"": 0.3739088529988074, ""2"": 0.403690835856031}",0.403690835856031,1.078,916,medium
run_0001_20261109_120818,after,hand,0.1037993490507591,"""""",0.8962006509492408,1.078,916,medium
run_0001_20261109_120818,lift,picked,0.7992622097298968,"""""",0.7992622097298968,0.772,667,medium
run_0001_20261109_120818,end,placed,0.7287062753768934,"""""",0.7287062753768934,0.882,661,medium
run_0001_20261109_121128,after,hand,0.08801705385477543,"""""",0.9119829461452246,1.122,916,medium
run_0001_20261109_121128,after,claw_on_block,0.26234336385850937,"""""",0.7376566361414907,1.122,916,medium
run_0001_20261109_121128,after,depth,1.082672333131081,"{""2"": 0.3537536302897067, ""1"": 0.37516507255166764, ""0"": 0.2710812971586256}",0.37516507255166764,1.122,916,medium
run_0001_20261109_121128,lift,picked,0.7960004690514605,"""""",0.7960004690514605,0.956,667,medium
run_0001_20261109_121128,end,placed,0.8183667733481849,"""""",0.8183667733481849,1.161,661,medium
run_0001_20261109_121224,after,hand,0.08600517773800076,"""""",0.9139948222619992,0.835,916,medium
run_0001_20261109_121224,after,depth,1.0915587562662414,"{""1"": 0.3996328695006862, ""0"": 0.2544041871165361, ""2"": 0.3459629433827776}",0.3996328695006862,0.835,916,medium
run_0001_20261109_121224,after,claw_on_block,0.2362686001173664,"""""",0.7637313998826336,0.835,916,medium
run_0001_20261109_121224,lift,picked,0.812800763326322,"""""",0.812800763326322,0.919,667,medium
run_0001_20261109_121224,end,placed,0.8548909919933684,"""""",0.8548909919933684,0.87,661,medium
run_0001_20261109_121320,after,depth,1.0213871274222939,"{""0"": 0.30633966195233053, ""2"": 0.32772678937462435, ""1"": 0.3659335486730452}",0.3659335486730452,0.847,916,medium
run_0001_20261109_121320,after,claw_on_block,0.3594930765951995,"""""",0.6405069234048004,0.847,916,medium
run_0001_20261109_121320,after,hand,0.09660189263477206,"""""",0.903398107365228,0.847,916,medium
run_0001_20261109_121320,lift,picked,0.8258638316029348,"""""",0.8258638316029348,0.834,667,medium
run_0001_20261109_121320,end,placed,0.7655630083241214,"""""",0.7655630083241214,0.753,661,medium
run_0001_20261109_121416,after,depth,1.2403211865401629,"{""2"": 0.44014607974378955, ""1"": 0.3600290270525838, ""0"": 0.19982489320362667}",0.44014607974378955,1.024,916,medium
run_0001_20261109_121416,after,claw_on_block,0.24495877672376984,"""""",0.7550412232762301,1.024,916,medium
run_0001_20261109_121416,after,hand,0.09055705061402346,"""""",0.9094429493859766,1.024,916,medium
run_0001_20261109_121416,lift,picked,0.7752495617186336,"""""",0.7752495617186336,1.11,667,medium
run_0001_20261109_121416,end,placed,0.8485986212491313,"""""",0.8485986212491313,0.814,661,medium
run_0001_20261109_121511,after,hand,0.1266616713347945,"""""",0.8733383286652054,1.16,916,medium
run_0001_20261109_121511,after,claw_on_block,0.32045864714826455,"""""",0.6795413528517354,1.16,916,medium
run_0001_20261109_121511,after,depth,1.0721841965551793,"{""0"": 0.2644408639755932, ""1"": 0.3989340754936343, ""2"": 0.3366250605307725}",0.3989340754936343,1.16,916,medium
run_0001_20261109_121511,lift,picked,0.7241633046916844,"""""",0.7241633046916844,1.154,667,medium
run_0001_20261109_121511,end,placed,0.8071965879180675,"""""",0.8071965879180675,0.851,661,medium
run_0001_20261109_121605,after,hand,0.11132974621367822,"""""",0.8886702537863218,0.949,916,medium
run_0001_20261109_121605,after,claw_on_block,0.2882719638143915,"""""",0.7117280361856084,0.949,916,medium
run_0001_20261109_121605,after,depth,1.087598879775658,"{""0"": 0.26916066696834373, ""1"": 0.3740797862876547, ""2"": 0.35675954674400157}",0.3740797862876547,0.949,916,medium
run_0001_20261109_121605,lift,picked,0.7036109206179194,"""""",0.7036109206179194,0.989,667,medium
run_0001_20261109_121605,end,placed,0.7808215863779472,"""""",0.7808215863779472,0.805,661,medium
run_0001_20261109_121659,after,hand,0.09763754533869395,"""""",0.902362454661306,2.058,916,medium
run_0001_20261109_121659,after,claw_on_block,0.2883008650456221,"""""",0.711699134954378,2.058,916,medium
run_0001_20261109_121659,after,depth,1.291628638012461,"{""0"": 0.17412299647552837, ""2"": 0.46575163448798956, ""1"": 0.360125369036482}",0.46575163448798956,2.058,916,medium
run_0001_20261109_121659,lift,picked,0.8176837998311605,"""""",0.8176837998311605,0.798,667,medium
run_0001_20261109_121659,end,placed,0.6268775287647678,"""""",0.6268775287647678,0.801,661,medium
run_0001_20261109_121815,after,hand,0.07880994306928268,"""""",0.9211900569307173,1.339,916,medium
run_0001_20261109_121815,after,claw_on_block,0.25935711268469597,"""""",0.740642887315304,1.339,916,medium
run_0001_20261109_121815,after,depth,1.1560772382768074,"{""0"": 0.23291932585760844, ""1"": 0.3780841100079758, ""2"": 0.3889965641344158}",0.3889965641344158,1.339,916,medium
run_0001_20261109_121815,lift,picked,0.8095060266636925,"""""",0.8095060266636925,0.798,667,medium
run_0001_20261109_121815,end,placed,0.8588461542767917,"""""",0.8588461542767917,1.155,661,medium
run_0001_20261109_123655,after,claw_on_block,0.27193951879913675,"""""",0.7280604812008633,0.863,916,medium
run_0001_20261109_123655,after,depth,1.123608118483086,"{""2"": 0.3808571025522359, ""0"": 0.2572489840691501, ""1"": 0.361893913378614}",0.3808571025522359,0.863,916,medium
run_0001_20261109_123655,after,hand,0.11516756863920868,"""""",0.8848324313607914,0.863,916,medium
run_0001_20261109_123655,lift,picked,0.7307228140317402,"""""",0.7307228140317402,0.977,667,medium
run_0001_20261109_123655,end,placed,0.8079025749205785,"""""",0.8079025749205785,1.28,661,medium
run_0001_20261109_123756,after,claw_on_block,0.28989605505742966,"""""",0.7101039449425703,1.011,916,medium
run_0001_20261109_123756,after,hand,0.10420174462904103,"""""",0.8957982553709589,1.011,916,medium
run_0001_20261109_123756,after,depth,1.371896526862261,"{""0"": 0.13236595791717273, ""2"": 0.5042624847794338, ""1"": 0.3633715573033934}",0.5042624847794338,1.011,916,medium
run_0001_20261109_123756,lift,picked,0.8024702123975682,"""""",0.8024702123975682,1.283,667,medium
run_0001_20261109_123756,end,placed,0.8397157583498427,"""""",0.8397157583498427,0.827,661,medium
run_0001_20261109_123848,after,depth,1.090004544519032,"{""1"": 0.37221670609599805, ""0"": 0.2688893746924849, ""2"": 0.358893919211517}",0.37221670609599805,0.865,916,medium
run_0001_20261109_123848,after,claw_on_block,0.3056929781055336,"""""",0.6943070218944665,0.865,916,medium
run_0001_20261109_123848,after,hand,0.1047011099994817,"""""",0.8952988900005183,0.865,916,medium
run_0001_20261109_123848,lift,picked,0.7516949611317821,"""""",0.7516949611317821,1.132,667,medium
run_0001_20261109_123848,end,placed,0.8152725459223212,"""""",0.8152725459223212,0.937,661,medium
run_0001_20261109_123940,after,hand,0.07614383218500471,"""""",0.9238561678149952,1.388,916,medium
run_0001_20261109_123940,after,claw_on_block,0.3626251983705085,"""""",0.6373748016294916,1.388,916,medium
run_0001_20261109_123940,after,depth,1.181268722800764,"{""0"": 0.22214232795294855, ""1"": 0.3744466212933389, ""2"": 0.40341105075371253}",0.40341105075371253,1.388,916,medium
run_0001_20261109_123940,lift,picked,0.8433458319332096,"""""",0.8433458319332096,1.156,667,medium
run_0001_20261109_123940,end,placed,0.6622766706453345,"""""",0.6622766706453345,1.163,661,medium
run_0001_20261109_124032,after,hand,0.1181116017549198,"""""",0.8818883982450803,0.964,916,medium
run_0001_20261109_124032,after,depth,1.2066666570636204,"{""0"": 0.2157023517630556, ""1"": 0.36192863941026826, ""2"": 0.4223690088266761}",0.4223690088266761,0.964,916,medium
run_0001_20261109_124032,after,claw_on_block,0.3502840579320588,"""""",0.6497159420679413,0.964,916,medium
run_0001_20261109_124032,lift,picked,0.7789856688118247,"""""",0.7789856688118247,0.824,667,medium
run_0001_20261109_124032,end,placed,0.8766518263452706,"""""",0.8766518263452706,0.923,661,medium
run_0001_20261109_124117,after,hand,0.08108332311849899,"""""",0.918916676881501,0.867,916,medium
run_0001_20261109_124117,after,depth,1.199702386926718,"{""1"": 0.3493743531344839, ""0"": 0.22546162996939903, ""2"": 0.42516401689611705}",0.42516401689611705,0.867,916,medium
run_0001_20261109_124117,after,claw_on_block,0.3950073973179174,"""""",0.6049926026820827,0.867,916,medium
run_0001_20261109_124117,lift,picked,0.8154452632185285,"""""",0.8154452632185285,1.253,667,medium
run_0001_20261109_124117,end,placed,0.39527804180856885,"""""",0.6047219581914312,1.149,661,medium
run_0001_20261109_124207,after,claw_on_block,0.3461639633715683,"""""",0.6538360366284317,1.156,916,medium
run_0001_20261109_124207,after,depth,1.1000712983452703,"{""1"": 0.3690371752745658, ""2"": 0.36551706153535224, ""0"": 0.265445763190082}",0.3690371752745658,1.156,916,medium
run_0001_20261109_124207,after,hand,0.08094326826791431,"""""",0.9190567317320857,1.156,916,medium
run_0001_20261109_124207,lift,picked,0.6389633246803093,"""""",0.6389633246803093,0.854,667,medium
run_0001_20261109_124207,end,placed,0.6156245538675639,"""""",0.6156245538675639,0.873,661,medium
run_0001_20261109_124256,after,depth,1.15347020552834,"{""2"": 0.3956494573075963, ""0"": 0.24217925177925637, ""1"": 0.36217129091314726}",0.3956494573075963,1.534,916,medium
run_0001_20261109_124256,after,hand,0.0795218041238892,"""""",0.9204781958761108,1.534,916,medium
run_0001_20261109_124256,after,claw_on_block,0.26775505841835207,"""""",0.7322449415816479,1.534,916,medium
run_0001_20261109_124256,lift,picked,0.869479086057478,"""""",0.869479086057478,0.873,667,medium
run_0001_20261109_124256,end,placed,0.8551766843429539,"""""",0.8551766843429539,1.059,661,medium
run_0001_20261109_124438,after,depth,1.0217791357858454,"{""2"": 0.31561118626578966, ""1"": 0.3905567632542661, ""0"": 0.2938320504799442}",0.3905567632542661,1.254,916,medium
run_0001_20261109_124438,after,hand,0.0848214084268902,"""""",0.9151785915731098,1.254,916,medium
run_0001_20261109_124438,after,claw_on_block,0.3396351921036528,"""""",0.6603648078963472,1.254,916,medium
run_0001_20261109_124438,lift,picked,0.7385425728844414,"""""",0.7385425728844414,1.074,667,medium
run_0001_20261109_124438,end,placed,0.6636053860214718,"""""",0.6636053860214718,0.875,661,medium
run_0001_20261109_124530,after,hand,0.08417534717329885,"""""",0.9158246528267011,0.777,916,medium
run_0001_20261109_124530,after,depth,1.0583512137923887,"{""0"": 0.2769342859690351, ""2"": 0.33528549976142374, ""1"": 0.3877802142695413}",0.3877802142695413,0.777,916,medium
run_0001_20261109_124530,after,claw_on_block,0.4034861615062629,"""""",0.5965138384937372,0.777,916,medium
run_0001_20261109_124530,lift,picked,0.14041243991640553,"""""",0.8595875600835945,0.924,667,medium
run_0001_20261109_124530,end,placed,0.14938325093771032,"""""",0.8506167490622897,0.991,661,medium
run_0001_20261109_124817,after,claw_on_block,0.24263306617255598,"""""",0.757366933827444,1.633,916,medium
run_0001_20261109_124817,after,depth,1.0180082792598344,"{""0"": 0.29479779440404164, ""2"": 0.3128060736638759, ""1"": 0.3923961319320825}",0.3923961319320825,1.633,916,medium
run_0001_20261109_124817,after,hand,0.08876990177287448,"""""",0.9112300982271255,1.633,916,medium
run_0001_20261109_124817,lift,picked,0.8137693312434633,"""""",0.8137693312434633,1.254,667,medium
run_0001_20261109_124817,end,placed,0.7962297113266288,"""""",0.7962297113266288,1.062,661,medium
run_0001_20261109_124920,after,depth,1.1188861732636082,"{""2"": 0.3726380073541263, ""1"": 0.3736101585553555, ""0"": 0.2537518340905181}",0.3736101585553555,0.953,916,medium
run_0001_20261109_124920,after,claw_on_block,0.30252625249671167,"""""",0.6974737475032884,0.953,916,medium
run_0001_20261109_124920,after,hand,0.08807654199518428,"""""",0.9119234580048157,0.953,916,medium
run_0001_20261109_124920,lift,picked,0.7314966146529577,"""""",0.7314966146529577,0.838,667,medium
run_0001_20261109_124920,end,placed,0.8588204457165818,"""""",0.8588204457165818,0.803,661,medium
run_0001_20261109_125209,after,claw_on_block,0.24667749930614205,"""""",0.753322500693858,0.84,916,medium
run_0001_20261109_125209,after,hand,0.08033642217976027,"""""",0.9196635778202398,0.84,916,medium
run_0001_20261109_125209,after,depth,0.9263189200907602,"{""2"": 0.2873112930227396, ""1"": 0.35169633404528106, ""0"": 0.3609923729319794}",0.3609923729319794,0.84,916,medium
run_0001_20261109_125209,lift,picked,0.32984015413932666,"""""",0.6701598458606733,1.291,667,medium
run_0001_20261109_125209,end,placed,0.13171876471675914,"""""",0.8682812352832409,0.785,661,medium
run_0001_20261109_125607,after,claw_on_block,0.19802630658109932,"""""",0.8019736934189007,1.385,916,medium
run_0001_20261109_125607,after,hand,0.09847685105834927,"""""",0.9015231489416508,1.385,916,medium
run_0001_20261109_125607,after,depth,0.9573541037904447,"{""0"": 0.3341898202417039, ""1"": 0.37426625572614775, ""2"": 0.29154392403214846}",0.37426625572614775,1.385,916,medium
run_0001_20261109_125607,lift,picked,0.6768945171471846,"""""",0.6768945171471846,1.292,667,medium
run_0001_20261109_125607,end,placed,0.13198383212983122,"""""",0.8680161678701688,1.025,661,medium
run_0001_20261109_125825,after,claw_on_block,0.3025572139131831,"""""",0.6974427860868169,1.122,916,medium
run_0001_20261109_125825,after,hand,0.07985940468720032,"""""",0.9201405953127997,1.122,916,medium
run_0001_20261109_125825,after,depth,1.0546943595363887,"{""1"": 0.36825477664575584, ""2"": 0.34321979144531645, ""0"": 0.28852543190892765}",0.36825477664575584,1.122,916,medium
run_0001_20261109_125825,lift,picked,0.2031989668981862,"""""",0.7968010331018138,1.432,667,medium
run_0001_20261109_125825,end,placed,0.15936145894887443,"""""",0.8406385410511256,1.161,661,medium
run_0001_20261109_130542,after,hand,0.08484441835443005,"""""",0.91515558164557,1.156,916,medium
run_0001_20261109_130542,after,claw_on_block,0.3455832006357524,"""""",0.6544167993642476,1.156,916,medium
run_0001_20261109_130542,after,depth,1.001110021094866,"{""0"": 0.3227623846904318, ""2"": 0.32387240578529763, ""1"": 0.35336520952427064}",0.35336520952427064,1.156,916,medium
run_0001_20261109_130542,lift,picked,0.8786876372780051,"""""",0.8786876372780051,0.9,667,medium
run_0001_20261109_130542,end,placed,0.7868517220665792,"""""",0.7868517220665792,0.959,661,medium
run_0001_20261109_130723,after,depth,0.9399844111385205,"{""1"": 0.3540460705713436, ""2"": 0.2929691702835885, ""0"": 0.3529847591450679}",0.3540460705713436,1.161,916,medium
run_0001_20261109_130723,after,claw_on_block,0.3381033698599952,"""""",0.6618966301400049,1.161,916,medium
run_0001_20261109_130723,after,hand,0.08751260561603605,"""""",0.912487394383964,1.161,916,medium
run_0001_20261109_130723,lift,picked,0.8349195788651506,"""""",0.8349195788651506,0.968,667,medium
run_0001_20261109_130723,end,placed,0.4043700515088324,"""""",0.5956299484911676,0.893,661,medium
run_0001_20261109_130824,after,claw_on_block,0.2929100262191237,"""""",0.7070899737808762,0.892,916,medium
run_0001_20261109_130824,after,hand,0.09342292134543916,"""""",0.9065770786545608,0.892,916,medium
run_0001_20261109_130824,after,depth,0.9739844710586504,"{""1"": 0.36087808126563237, ""0"": 0.33256872383785857, ""2"": 0.306553194896509}",0.36087808126563237,0.892,916,medium
run_0001_20261109_130824,lift,picked,0.848665800893131,"""""",0.848665800893131,0.976,667,medium
run_0001_20261109_130824,end,placed,0.7292575944826252,"""""",0.7292575944826252,0.831,661,medium
run_0001_20261109_130929,after,hand,0.10882339931579199,"""""",0.891176600684208,1.165,916,medium
run_0001_20261109_130929,after,claw_on_block,0.2943355803172461,"""""",0.705664419682754,1.165,916,medium
run_0001_20261109_130929,after,depth,0.9865840849306511,"{""1"": 0.3708192849842798, ""0"": 0.3212983150425346, ""2"": 0.3078823999731856}",0.3708192849842798,1.165,916,medium
run_0001_20261109_130929,lift,picked,0.8397508485520536,"""""",0.8397508485520536,0.923,667,medium
run_0001_20261109_130929,end,placed,0.8129076733514312,"""""",0.8129076733514312,0.877,661,medium
run_0001_20261109_131103,after,claw_on_block,0.29888484725644204,"""""",0.701115152743558,0.924,916,medium
run_0001_20261109_131103,after,hand,0.1003283636059976,"""""",0.8996716363940024,0.924,916,medium
run_0001_20261109_131103,after,depth,0.9163297982052143,"{""1"": 0.36102454272217743, ""0"": 0.3613228295363041, ""2"": 0.27765262774151844}",0.3613228295363041,0.924,916,medium
run_0001_20261109_131103,lift,picked,0.873908329265663,"""""",0.873908329265663,0.951,667,medium
run_0001_20261109_131103,end,placed,0.5202160641000049,"""""",0.5202160641000049,0.868,661,medium
```


## 0.5 で切った一致の数だけでは、偏った答えを見落とす

score.md では「人の手」が56本中53本、「爪がブロックに乗った」が48本と、一致が多く見えます。ところが報告にあるとおり、この2つは1本も「はい」と答えていませんでした。正解の多くが「いいえ」なので、全部「いいえ」と答えるだけで一致が多くなります。

そこで、区切りを決めずに、正解が「はい」の本と「いいえ」の本で答えの値がどれだけ分かれているかを見ました。AUC は、「はい」の本を1つ、「いいえ」の本を1つ選んだとき、「はい」の本のほうが高い値をもらっている割合です。1.0 なら完全に分かれ、0.5 なら見分けがついていません。

### analyze.py（正解の「はい」と「いいえ」で答えの値を分けて並べる）

```python
#!/usr/bin/env python3
"""analyze.py — results.csv（Gemini Decision 1 の答え）を、正解で「はい」と「いいえ」に分けて並べる（読むだけ）.

score.md は 0.5（深さは 1.0）で切った一致の数だけを出す. ここでは区切りを決めずに,
(1) 正解が「はい」の本と「いいえ」の本で、答えの値がどれだけ分かれているか（並べ替えの当たり＝AUC。1.0 で完全に分かれる・0.5 で見分けがない）
(2) 値の幅
(3) 区切りを動かしたときに一致がいちばん多くなる区切りと、その一致の数
(4) 0.5 で切って外れた本
を問いごとに出す. 入力トークンは 1 回の依頼ごとに数え直す（score.md の合計は問いの数だけ重ねて足していた）.
  python3 code/analyze.py > analysis.txt
"""
import csv, statistics as st

man = {r["run"]: r for r in csv.DictReader(open("manifest.csv"))}
res = {}
for r in csv.DictReader(open("results.csv")):
    res[(r["run"], r["question"])] = r
TRUTH = {
    "depth": ("浅いつかみ（閉じて1秒後に爪先から24px超）", lambda m: m["shallow"] == "True"),
    "claw_on_block": ("爪がブロックに乗った", lambda m: m["claw_on_block"] == "True"),
    "hand": ("人の手が写っている（手の疑い）", lambda m: m["hand_suspect"] == "True"),
    "picked": ("持ち上がった（人の判定 pick=yes）", lambda m: m["human_pick"] == "yes"),
    "placed": ("箱に入った（人の判定 place=yes）", lambda m: m["human_place"] == "yes"),
}

def auc(pos, neg):
    return sum((p > n) + 0.5 * (p == n) for p in pos for n in neg) / (len(pos) * len(neg))

for q, (name, f) in TRUTH.items():
    rows = [(float(res[(k, q)]["value"]), f(m), k, m) for k, m in man.items() if (k, q) in res]
    pos = sorted(v for v, t, _, _ in rows if t); neg = sorted(v for v, t, _, _ in rows if not t)
    cut0 = 1.0 if q == "depth" else 0.5
    best = max(((sum((v >= c) == t for v, t, _, _ in rows), c) for c in sorted({v for v, *_ in rows})), key=lambda x: x[0])
    print(f"== {q}：{name}")
    print(f"  本数 {len(rows)}（はい {len(pos)}・いいえ {len(neg)}）  AUC {auc(pos, neg):.3f}")
    print(f"  はいの値   : 最小 {pos[0]:.3f} / 中央 {st.median(pos):.3f} / 最大 {pos[-1]:.3f}")
    print(f"  いいえの値 : 最小 {neg[0]:.3f} / 中央 {st.median(neg):.3f} / 最大 {neg[-1]:.3f}")
    print(f"  {cut0} で切った一致 {sum((v >= cut0) == t for v, t, _, _ in rows)}/{len(rows)}   一致がいちばん多い区切り {best[1]:.3f} 以上を「はい」→ {best[0]}/{len(rows)}")
    for v, t, k, m in sorted(rows):
        if (v >= cut0) != t and q in ("picked", "placed"):
            print(f"    外れ {k}  正解 {'はい' if t else 'いいえ'}  値 {v:.3f}  理由欄「{m['reason']}」")
    print()

lat = {}; tok = {}
for r in res.values():
    key = (r["run"], r["image"])
    lat[key] = float(r["latency_s"]); tok[key] = int(r["input_tokens"] or 0)
print(f"依頼の回数 {len(lat)}  時間の中央値 {st.median(lat.values()):.2f} 秒  最小 {min(lat.values()):.2f}  最大 {max(lat.values()):.2f}")
for img in ("after", "lift", "end"):
    t = [v for (k, i), v in tok.items() if i == img]
    print(f"  {img}: 入力トークン 1回 {int(st.median(t))}（{len(t)} 回）")
s = sum(tok.values())
print(f"入力トークンの合計（1回の依頼ごと） {s}  費用の目安 ${s/1e6*0.10:.4f}（無料枠なので実際は0）")
```

### analysis.txt（analyze.py の出力）

```text
== depth：浅いつかみ（閉じて1秒後に爪先から24px超）
  本数 56（はい 17・いいえ 39）  AUC 0.724
  はいの値   : 最小 1.021 / 中央 1.181 / 最大 1.484
  いいえの値 : 最小 0.904 / 中央 1.076 / 最大 1.372
  1.0 で切った一致 27/56   一致がいちばん多い区切り 1.445 以上を「はい」→ 41/56

== claw_on_block：爪がブロックに乗った
  本数 56（はい 8・いいえ 48）  AUC 0.534
  はいの値   : 最小 0.198 / 中央 0.334 / 最大 0.403
  いいえの値 : 最小 0.236 / 中央 0.305 / 最大 0.410
  0.5 で切った一致 48/56   一致がいちばん多い区切り 0.403 以上を「はい」→ 48/56

== hand：人の手が写っている（手の疑い）
  本数 56（はい 3・いいえ 53）  AUC 0.774
  はいの値   : 最小 0.093 / 中央 0.111 / 最大 0.118
  いいえの値 : 最小 0.063 / 中央 0.089 / 最大 0.132
  0.5 で切った一致 53/56   一致がいちばん多い区切り 0.132 以上を「はい」→ 52/56

== picked：持ち上がった（人の判定 pick=yes）
  本数 56（はい 50・いいえ 6）  AUC 0.947
  はいの値   : 最小 0.515 / 中央 0.748 / 最大 0.879
  いいえの値 : 最小 0.140 / 中央 0.290 / 最大 0.677
  0.5 で切った一致 54/56   一致がいちばん多い区切り 0.515 以上を「はい」→ 54/56
    外れ run_0001_20261109_102715  正解 いいえ  値 0.608  理由欄「爪がブロックに乗った (PICK の区間 8.5 秒)」
    外れ run_0001_20261109_125607  正解 いいえ  値 0.677  理由欄「爪がブロックに乗った (PICK の区間 6.66 秒)」

== placed：箱に入った（人の判定 place=yes）
  本数 56（はい 50・いいえ 6）  AUC 1.000
  はいの値   : 最小 0.395 / 中央 0.781 / 最大 0.877
  いいえの値 : 最小 0.125 / 中央 0.132 / 最大 0.159
  0.5 で切った一致 53/56   一致がいちばん多い区切り 0.395 以上を「はい」→ 56/56
    外れ run_0001_20261109_124117  正解 はい  値 0.395  理由欄「」
    外れ run_0001_20261109_130723  正解 はい  値 0.404  理由欄「」
    外れ run_0001_20261109_101434  正解 はい  値 0.421  理由欄「爪がブロックに乗った (PICK の区間 7.9 秒)」

依頼の回数 168  時間の中央値 0.96 秒  最小 0.61  最大 2.52
  after: 入力トークン 1回 916（56 回）
  lift: 入力トークン 1回 667（56 回）
  end: 入力トークン 1回 661（56 回）
入力トークンの合計（1回の依頼ごと） 125664  費用の目安 $0.0126（無料枠なので実際は0）
```

| 問い | AUC | いちばん合う区切りでの一致 | 読み取れること |
|---|---|---|---|
| 箱に入った | 1.000 | 0.395 以上で 56/56 | 「はい」は 0.40〜0.88、「いいえ」は 0.13〜0.16。きれいに分かれた |
| 持ち上がった | 0.947 | 0.515 以上で 54/56 | 外れの2本は、どちらも爪がブロックに乗っていた回 |
| 浅いつかみ | 0.724 | 1.445 以上で 41/56 | 「浅い」17本の値はやや高いが、「深い」と重なる。いちばん合う区切りは、ほぼ全部を「深い」とする所 |
| 人の手 | 0.774 | 0.132 以上で 52/56 | 値は 0.06〜0.13。「はい」は3本だけで判断できない |
| 爪がブロックに乗った | 0.534 | 0.403 以上で 48/56 | 「はい」の8本が「いいえ」の中に混ざる。見分けがついていない |

**結果の判定（箱に入ったか・持ち上がったか）は使えて、つかみ方の細かい形の判定は使えない。** 区切りは0.5のままではなく、問いごとに決める必要があります。「箱に入った」は「はい」の本でも値が0.40〜0.88で、0.5 で切ると3本を見逃しました。

ねらい・変わったこと・見込める効果（成功・失敗の判定）

- ねらい：お手本や実機推論の1本ごとの「つかめたか・箱に入ったか」の判定を、決まった問いで速く安く出す
- 変わったこと：「箱に入った」は区切り0.39で56本すべて、「持ち上がった」は54本が人の判定と合った。1回の問い合わせは中央値0.96秒
- 見込める効果：今の Claude の文章での判定と並べて同じくらい当たるなら、台帳の判定をこちらに替えられる見込み（今の判定と同じ画像での比べはまだしていない）


## 箱に入ったかは見分け、爪が乗ったかは真上のカメラでは見えていない

答えの値が高かった本と低かった本の画像を並べると、何が見えていて何が見えていないかが分かります。

【画像】LOG497_01_deep_and_shallow.jpg 閉じて1秒後の上カメラのコマ。左は深くつかめた本（爪先の印より奥にブロックがある）、右は浅い本（ブロックが爪先から外へはみ出している）。Gemini Decision 1 の深さの答えは左が1.13、右が1.29で、どちらも「やや浅い」の近く

人が見ると、右のほうがブロックが爪先から出ているのは分かります。それでも答えの値の差は0.16しかありませんでした。画像全体（1280×720）のうち、爪のまわりは1割にも満たない広さです。

【画像】LOG497_02_placed_high_low.jpg 最後のコマ。左は「箱に入った」の値がいちばん高かった本（0.877）、右はいちばん低かった本（0.395）。どちらもブロックは箱の中にある

右も箱の中にブロックがあります。ブロックが箱の左の壁に寄っていて、爪の先が箱の近くにある分、値が下がったのかもしれません（確かめてはいない）。それでも「いいえ」の本（0.13〜0.16）よりは十分に高いので、区切りを0.39にすれば分けられます。

【画像】LOG497_03_claw_on_block.jpg 爪がブロックに乗った回（run_0001_20261109_102715）。左は閉じて3秒後で、真上から見るとブロックが爪の間にあるように見える。右は最後のコマで、ブロックはマットに残っている

持ち上がったかの外れ2本は、この形でした。真上のカメラでは、ブロックが爪に挟まれて持ち上がっているのか、爪の下にあるだけなのかを区別できません。人が判定したときは、動画で前後の動きを見ていました。1枚の画像で高さを聞くのは、問いのほうに無理があります。


## 手元の Mac から1回0.96秒、168回で約2円

Google の発表の150〜250ミリ秒に対して、記録では中央値0.96秒、最大2.52秒でした。この時間は、Mac で画像を読み、base64 にして送り、答えが返ってくるまでのすべてを含みます（Google の窓口までの通信と、約170KB の画像を送る時間が入っています）。発表の値と同じ条件では測っていません。

入力トークンは、閉じて1秒後のコマ（3問）が1回916、ほかのコマ（1問）が661〜667でした。問いを増やしても、画像の分は1回にしか数えられません。168回で125,664トークン、有料の値段なら約0.013ドルです。

試すのにかかった時間は、依頼箱で全部を回すのが5分（00:40〜00:45）でした。


## 次は、今の Claude の判定と同じ画像で並べる

この回で分かったのは、Gemini Decision 1 が人の判定とどれだけ合うかまでです。台帳の判定を替えるかどうかは、今の Claude（Sonnet）の判定と同じ画像で並べてから決めます。

- 結果の判定（箱に入った・持ち上がった）：Claude の判定と、当たりの数・時間・費用を並べる
- 持ち上がったか：真上の1枚では高さが見えないので、横のカメラのコマも一緒に送る形を試す
- 細かい形（深さ・爪が乗った）：爪のまわりだけを切り抜き、解像度を上げて送れば分かれるかを試す。分かれなければ、今の grasp_depth.py を使い続ける


## 出典

- Google「Gemini Decisions API: Fast, calibrated multimodal decisions」（2026-11-11）https://blog.google/innovation-and-ai/technology/developers-tools/gemini-decisions-api/
- Flavio Copes「How to use the Gemini Decisions API」 https://flaviocopes.com/gemini-decisions-api/
- SiliconANGLE「Google enters decision model market with Gemini Decisions API」（2026-11-11）https://siliconangle.com/2026/11/11/google-enters-the-decision-model-market-with-gemini-decisions-api/
