Index
2026-09-11 — Analysis

Routine(type3) 정식 데이터 검수 — HF e02c1f3d (v1.2)

scene_bench | 100편 · 314행 전수 정합 + 하네스 관통 + 질의 시점 누출 측정 | API $0

TL;DR

314
routine rows
100
type3 contexts
0
twin fixed points
14/15
last-task leak (self)
1000/1141
rooms via scene card
$0
API

1 배경 / 목적

Routine 가족은 지금까지 임시 어댑터 + 파일럿 3편(260907)으로만 관통돼 있었다. 데이터팀이 정식 릴리즈(Keh0t0/scene-mem-benchmark main, 커밋 e02c1f3d, 2026-09-11 05:47 UTC, "v1.2: the routine family is new")를 올렸으므로 본 측정 전에 (1) 규격이 설계서와 어디서 다른지 (2) 행·정답·규칙·쌍둥이 정합 (3) 하네스가 그대로 먹는지 (4) 질의 시점 누출을 잰다.

기존 한계: 파일럿 3편에서 cloth·multi 행에 leak_last_frame 플래그가 섰지만 "몇 편의 특수 사례"인지 "구조"인지 몰랐고, 방 이름은 임시 팩커가 plan.json에서 넣어 준 것이라 정식 데이터에도 있을지 미확인이었다.

2 이 task는 무엇이고 어떻게 재는가

2-1. 컨텍스트(type3) — 집의 정리 규칙을 보여 주는 영상

한 편은 한 집에서 규칙 2–3개(물체 상위 클래스 → 수납처 클래스, 값은 무작위: "수저 → 소파")를 보여 준다. 클래스 6종(FOOD·DISH·CUTLERY·GADGET·CLOTH·TOILETRY), 수납처 9종. 규칙마다 사용자가 frame 1에 "Put the food from the countertop on the side table."처럼 시키고(클래스·수납처는 말하지만 방은 안 말함), 로봇이 4유닛을 옮긴다(실패 유닛 71/426 보존). 40편에는 로봇이 옮기지 않고 지나가며 본 규칙(observed, D②)이 1개 있다 — 증거 3물체가 처음부터 수납처 위에 있고 pass-by 세그먼트·max_px가 기록돼 있다. 각 클래스의 홀드아웃(컨텍스트에 안 나온 하위 카테고리: 토마토·손수건·알람시계·스프레이…)이 출발 테이블 위에 처음부터 놓여 있고 로봇은 건드리지 않는다.

train_1102__7832 keyframes
Figure 1. train_1102__7832 (self FOOD→SideTable, observed GADGET→Sofa). 상단: 시작 자세(거실) → 부엌 조리대(토마토·알람시계 홀드아웃과 음식) → 지나가며 소파 위 휴대폰·리모컨을 봄(관찰 규칙). 하단: 같은 순간 exo2 → 마지막 프레임 = 질의 이미지: 사과를 사이드테이블에 막 놓은 장면(exo1) · wrist 45k px → 증거 누출.

2-2. 질의(eval/routine) — 컨텍스트 끝(states/final.npz)에서

kind질의정답행
routine_directPut the tomato on the countertop away.그 홀드아웃 1개 → 규칙 수납처 클래스의 어느 인스턴스든(instances[] 1–5개)214 (self 174 · observed 40)
routine_multiClear the countertop.테이블 위 전부: 홀드아웃(seen=false) + 같은 클래스 여분/실패 유닛 물체(seen=true) → 각자 클래스 수납처. 정답 2–11개(최빈 4)100

정식 채점(데이터팀): scoring=result — 실행 후 정답 물체 전부가 각자 receptacle_class의 어느 인스턴스 위(support_of) 또는 안(바구니)에 있으면 성공(routine_judge.judge). 쌍둥이(twin_id, 216행/108쌍)는 둘 다 맞아야 pair. budget_steps·oracle은 null(미실행; 계획은 max(400, 1.5×oracle)). 분석 축: evidence_source self/observed · n_rules 2/3 · twin_row · holdout_cls · receptacle_class · n_answers_multi.

우리 read-track(260907 결정): find와 같은 답 {category, room, surface}+abstain. 헤드라인 loc_set/place_set(GT = 증거 인스턴스의 방+수납처), 진단 place_any(어느 인스턴스든)·class_ok, 쌍둥이 pair_ok, leak_last_frame 행은 헤드라인 제외. 발화는 들은 시점에 메모리 입력(textlog·frames 캡션·rf/vis ingest).

README "the rule is never spoken"은 질의에만 해당 — self 규칙은 컨텍스트 안에서 수납처 클래스가 들린다(textlog A2 오라클 조건, 방은 없음). observed 규칙만 완전 무언.

3 검수 결과

3-1. 규모·분포 (README = stats = index, 전부 일치)

contexts
100 / 59 houses
twins
34 pairs + 32 single
length
13.5 h · med 7.6 min
rules / ctx
2 (82) · 3 (18)
observed-rule ctx
40
units ok
355 / 426 (83.3%)
rows / answers
314 / 743
answer instances
1:130 2:50 3:28 4:4 5:2
수납처 클래스(정답)SofaSideTableBasketDiningTableShelvingUnitDeskCounterTopCoffeeTableTVStand
정답 수19617814110851481074
바디 접두사sofa 218 + armchair 192standt?cont_Laundry_Hamperdiningtableshelfdeskcountertopcoffeetablestand

홀드아웃 10종(Spray_Bottle 39 · Hand_Towel 36 · Alarm_Clock 35 · Tomato 24 · Bread 22 · Mug 19 · Spoon 13 · Fork 11 · Plate 8 · ButterKnife 7), 출발 테이블 countertop 150행 / dining table 64행, 정답 클래스 = 출발 테이블 클래스인 행 0/214(자명한 행 없음).

3-2. 정합성 — 통과

통과: 개수 = stats · query_id 유일 · direct 정답 = 홀드아웃 · 규칙 value = receptacle_class 214/214 · axes = 규칙 · meta.rules = 행 rules 100/100 · self 발화 수 = self 규칙 수(observed 발화 0) · observed 증거 3물체 전부 ≥200 px · context_frames=[0,T−1], T = mp4 프레임 = h5 스텝(9편 실측, 예 11757) · final.npz 100/100 · multi 정답 클래스 전부 규칙 있음, n_items/n_unseen 일치 · 쌍둥이 대칭·같은 집·같은 질의 216/216·정답 고정점 0.

3-3. 어긋남 8건 (채점 불가 행은 없음)

#항목실측영향
1방 이름 없음meta.rooms 없음, subtasks[].room 100편 null, 정답에 room/surface 없음(바디 uid만)read-track GT에 필수. datagen scene_cards/train/<house>.json(59집 전부)로 인스턴스 1000/1141 해결, 나머지 141 = 주입 바구니 → tasks[].room(observed Basket 규칙 0건). 집 사실이라 누출 아님
23규칙인데 direct 2행 (4편)3514__6505·8831__6696: R2 ok=false(성립 안 함)인데 rules[]·n_rules=3에 남음 / 1639__6874/6875: R2 성립인데 홀드아웃 h2 없음README "성립한 규칙 전부"·"규칙마다 행" 불일치. n_rules 축 소폭 오염
3쌍둥이 규칙 값 비순열5162__7664/7665: (Sofa, DiningTable) vs (DiningTable, SideTable)정답은 다 다르므로 pair 무해
4multi 20쌍 정답 집합 상이여분(seen) 물체가 실행 결과 따라 다름 (예 7338 5개 vs 7339 4개)pair "둘 다 맞음" 정의 유지 가능
5봉투 tags 없음314행 전부문서
6multi 행 holdout[] 없음대신 surface(출발 테이블 uid)README "모든 행"과 불일치; 어댑터가 direct 행에서 모음
7index.json type3 n_steps nulltype1은 채워짐문서
8README 'eight receptacle classes' · seen 정의실제 9종(TVStand 4); seen=true 315개 중 286개는 손대지 않은 같은 클래스 여분(옮겨진 건 실패 유닛 29)문서

3-4. 질의 시점 누출 (다운로드된 15편 30 direct 행; 100편은 자동 재측정 중)

조건증거 ≥200 px (마지막 5 s)마지막 측정 프레임 ≥200 px
전체15/3014/30
self 규칙14/2313/23
self & 마지막으로 실행된 task의 규칙14/1513/15
self & 다른 task0/80/8
observed 규칙1/71/7
홀드아웃이 보임0/30—
구조적 누출: 컨텍스트는 항상 "마지막 유닛을 수납처에 놓은 직후"에 끝나므로 마지막 프레임에 그 규칙의 증거가 찍힌다. 마지막 유닛의 task = T1 44편 / T2 43편 / T3 13편 → 편마다 self 규칙 1개 누출 → self direct 174행 중 ≈100행(57%)이 플래그, 헤드라인엔 self ≈74 + observed ≈39행만 남는다. 파일럿의 cloth·multi 플래그가 사실 이것이었다.
twin 6874 twin 6875
Figure 2. 쌍둥이 train_1639__6874(CLOTH→Sofa, TOILETRY→ShelvingUnit, FOOD→Basket) / __6875(CLOTH→ShelvingUnit, TOILETRY→Basket, FOOD→Sofa). 같은 집·같은 질의·정답 전부 다름. 두 편 모두 마지막 프레임에 바구니(6874: 사과 13k px 누출; 6875: 사과 1.3k px)가 보인다.

3-5. 하네스 관통

load_episode(15편): heard 1–3건(frame=1) · tasks 1–3 · tracked K 10–16 · last frame 480×640 ✓ gt_routine(정식 행) → KeyError 'holdout' (answers에 holdout/room/surface 없음) routine_labels(정식 행) → KeyError 'k_evidence' leak_last_frame(정식 행) → 항상 False (leak_objects 없음) textlog_lines_type3: "placed it on the tv stand" ← stand_ uid → SURFACE_DISPLAY['stand']='tv stand' GT receptacle_class = SideTable (stand 바디 234 중 226), 발화는 "side table" → 자기모순
파일럿 설계와의 차이: 정식엔 control(pen) 행이 없다(A5 축 소멸). multi에 leave 항목 없음, 정답 2–11개(파일럿 3+1). 발화는 "on the armchair"라고도 하므로 Sofa 클래스 별칭(armchair) 필요.

3-6. 후속 질문 — "테이블에서 끝내면?" 시뮬레이션 (39편 78 direct 행)

프록시: 마지막 유닛의 at-table 구간(policy_phase approach/grasp/lift, 편당 중앙 302프레임)에서 다른 규칙 증거 물체의 최대 px.

조건현행 (마지막 5 s, 수납처 앞)테이블에서 끝냄시작 자세 (frame 0–24)
전체35/783/783/78
self34/681/683/68
self & 마지막 task 규칙25/300/302/30
self & 다른 task9/381/381/38
observed1/102/100/10
홀드아웃 보임—63/78 (질의 물체, 무해)—
질의 이미지 누출 45% → 4%. 잔여 3행은 조리대에서 거실 소파/식탁이 보이는 집. 데이터팀 요청안: 마지막 place 후 출발 테이블로 nav 1회 붙여 종료 — final.npz에서 이어 렌더(v1.1 부분 재렌더 방식)하면 궤적 본체 불변, 꼬리만 추가.
stand_ 바디: scene card category로 routine 정답 234개 = SideTable 226 / TVStand 8, find/restore 66개 = SideTable 28 / TVStand 38. vocab_v1.json(v3)이 접두사 전체를 "tv stand"로 고정 → find/restore는 닫힌 목록이라 채점 무해(의미상 28/66 오표기), routine은 "side table"이 목록에 있어 textlog/GT 불일치. 표시는 receptacle_class에서 가져와야.
control 행: 데이터 계획서 §3-3의 STATIONERY 미끼(정답 = 그대로 두기, A5)는 09-07 개정 §4-3에서 폐기. 파일럿의 pen 행은 옛 계획대로 임시 어댑터가 만든 것. 정식엔 없어 "규칙 없는 물건에 기권"은 측정 불가 → 포기 / 데이터팀 복원 요청 / read-track 텍스트 합성 중 결정.

3-7. 후속 — 시작 자세 이미지 실물 + 하네스 env 복원 시험

🔴 하네스 env는 type3 종료 상태를 복원하지 못한다. build_env(train_1102) 후 restore_final_state → n_set 0 / missing 11: 홀드아웃(h*_)·태스크 자산(t*a*_)·관찰 증거(o*e*_)·바구니(t*cont_)는 데이터 생성기가 주입한 에셋이라 우리 MolmoSpaces bench 씬에 없다(fingerprint nbody 388 vs 250; 집 가구·문 31/31은 있음). 같은 주입 방식인 resume(type2)도 동일. → 실행 트랙은 데이터팀의 씬 재구성 정보(plan injections 또는 MJCF)가 선행, 시작 자세 문제와 무관.

현재 이미지 프록시(routine_query_view_v2.py): 행별로 대상이 1.0 m 안인 픽 자세 중 가장 늦은 유닛의 nav 끝 프레임(베이스 도착, 팔은 아직 홈 자세)을 영상에서 꺼낸다 — 실제 시작 상태(팔 홈·그리퍼 열림)와 같은 모양. nav 끝→grasp 끝 베이스 이동 중앙 0.000 m·최대 0.032 m라 자세는 동일. 이미 옮겨진 물체가 최대한 사라진 상태라 첫 버전(최근접 자세, stale 125/214)보다 정합이 낫다.

대상 ≤1.0 m홀드아웃 보임진짜 누출(놓인/관찰 증거 ≥200px)나중에 옮겨질 물체가 보이는 프레임
direct 214행203/214180157 (+집던 물체 1개 항상)
multi 100행410/529 (전부 36행)—246
query view proxy sheet
Figure 3. 행별 시작 자세 프록시(중립 팔 자세, v3) 10행 × 3캠(exo1·exo2·wrist). 1–2행 = 누출 플래그 행(뒤로 식탁/수납처가 보임), 3–6행 = 조리대 앞 홀드아웃(토마토·알람시계·손수건·스프레이) 정면·stale 0, 7–8행 = 식탁(stale 1), 9–10행 = multi. 라벨 d = 대상까지 거리(m).
읽기 트랙은 이 프록시로 진행 가능(누출 1/214). stale 물체는 "옮기기 전 자리"라 정답 정보가 없지만 상태와 어긋나므로 문서화. 정확한 렌더와 실행 트랙은 씬 정보 수령 후.

3-8. 테이블 복귀 릴리즈 수령 — HF main dc1c8144 (11:55 UTC, 미디어 39.95 GB)

데이터팀이 모든 컨텍스트 끝에 "출발 테이블로 복귀 후 정면 정지" 꼬리(중앙 25.8 s, final.npz에서 따로 시뮬·렌더해 이어 붙임)를 추가. subtasks.return_to_table/tail, meta.tail 신설, 질의 314행은 context_frames만 연장. 메타 검사 100/100(복귀 ok·테이블=홀드아웃 테이블·프레임 정합·기존 필드 불변).

미디어 검사 (100편)구판 e02c1f3d신판 dc1c8144
영상 = h5 = context_frames+1100/100100/100
이음새 베이스·물체 점프—0.000 m
누출: direct 규칙 증거 ≥200px (마지막 5 s)97/2142/214 (self 0/174 · observed 2/40, 218·255 px)
마지막 프레임에 홀드아웃 보임17/214162/214
종료 자세→홀드아웃 ≤1.0 m (direct)—131/214 (중앙 0.88 m · 최대 3.11)
꼬리 동안 물체 이동 >5 cm—20개 / 19편
dc1c8144 last frames
Figure 4. 신판 마지막 프레임(=질의 이미지) 6편 × 3캠. 테이블 정면, 팔 홈 자세, 홀드아웃(토마토·스프레이·알람시계·스프레이병 등)이 시야 안. 1639__6874는 식탁 앞이지만 홀드아웃이 시야 밖(반대편).
🟠 꼬리 주행 충돌: 바닥 물체를 베이스가 6.7–6.8 m 밀고 감 2건(4619__7892, 2492__7559), 로봇 몸체에 얹혀 같이 이동 3건(1949__7457 Bowl z 1.03 m 4.7 m 등), 수납처에서 떨어짐 3건(그중 규칙 증거 1건 2224__6458 Soap_Bottle 소파→바닥), 홀드아웃 12 cm 밀림 2건(4533__7194/7195). 읽기 트랙 GT엔 영향 없음. 실행 트랙 start_state의 "반례 없음" 검사가 꼬리 이전 기준일 수 있어 데이터팀에 19편 목록 전달.
읽기 트랙 준비 완료. 정식 루트 = ~/datasets/scene-mem-benchmark-v1_dc1c8144/. 누출 2행은 플래그 제외. 다음 = 어댑터 재작성 → dry-run → 승인 → 측정(flash-3.7 ≈$60).

4 Takeaway

의미

데이터는 채점 가능 314행 전량, 구조적 결함 없음. 데이터팀에 전할 정정 8건은 전부 문서·메타 수준이다. 병목은 우리 쪽 두 가지 — (a) 방 지도는 릴리즈에 없지만 scene card + tasks.room으로 100% 재구성 가능(집 사실, 정답 아님; 정석은 데이터팀이 meta.rooms를 추가). (b) 마지막 프레임 누출 ≈57%(self)는 데이터 결함이 아니라 "컨텍스트 끝에서 질의" 설계의 귀결이라, 플래그 제외만 하면 self 셀 절반이 사라진다.

측정 규모: 314행 × 5전략 + ingest 100편. 파일럿 단가($1.78/3편)로 flash-3.7 ≈ $60, 오픈 3종은 GPU만. 실행 전 승인 필수.

5 Next Steps

사용자 결정 3건

① 누출 처리 — 제외(현행) / routine 질의 이미지 제거(홀드아웃은 어차피 안 보이고 로봇은 테이블에서 떨어져 있음) / 마지막 task 규칙 셀 별도 표기 · ② control 행 부재를 그대로 갈지(A5 포기) · ③ 방 지도 출처(scene card 자체 생성 vs 데이터팀 meta.rooms 대기).

어댑터 재작성 + textlog 수정

scripts/build_routine_rows.py를 정식 행 입력으로: answers에 holdout 단어·room(scene card/tasks.room)·surface(규칙 value 표시명)·instances{uid,room,surface}, leak_objects(그 규칙 증거), axes.k_evidence; multi는 leave=[]. 팩커는 폐기. textlog 수납처 표시를 uid 접두사 대신 규칙 value/발화 단어로. 별칭 armchair·shelving unit·coffee table.

확정 대기

type3 미디어 37.7 GB 다운로드 완료 후 tmp/hf_check/routine_leak_e02c1f3d.log에서 214행 누출 수치 확정. 데이터팀 전달 목록: 위 8건 + README 문구 3곳.

원천: tmp/hf_check/inspect_e02c1f3d_routine.{py,log} · routine_leak_e02c1f3d.{py,json} · 로그 claude/260911/analysis-routine_dataset_e02c1f3d.md · 데이터 ~/datasets/scene-mem-benchmark-v1_e02c1f3d/