Index
2026-09-05 — Plan · Examples

Routine v2 — TidyBot식 정리 예시(D① 자기 실행) + Direct ②(관찰형) 설계

train_1652 · 12개를 조리대 하나에 섞고 규칙 3개로 분류 · 쌍둥이 짝 · v2g(책상·식탁·바구니) / v2e(소파 판) · D② = 남이 정리해 둔 결과를 보고 규칙 유도

TL;DR

9/12
v2g 유닛 (D①, 두 편)
3/3 · 3/3
v2g 첫 바퀴
10/12
v2e 재판정 (기록 6/12, 소파 버그)
13분
D① 편 sim (유닛 6)
≈9분
D② 편 sim (실행 2 규칙 · 관찰 1)
4/4 ×3
D② 실행 유닛 (깨끗)
760 px
관찰 증거 최대 (거실 소파, 4/4 유닛)
~600줄
D② 코드 (실행기 0)

1 v2 설계 한눈에 — 무엇을 어디에 두고, 무엇을 시키고, 무엇을 묻나

요소v2 (train_1652)
출발 상면부엌 조리대 하나에 12개를 섞어 둔다 — TidyBot 의 "바닥에 흩어진 물건" 에 해당
물체 (클래스 × 4)FOOD: Apple_13 · Potato_6 · Egg_29 · Apple_9  /  CUTLERY: Knife_1 · Ladle_1 · Spatula_1 · Knife_4  /  CLOTH: Cloth_6 · Cloth_10 · Cloth_11 · Cloth_12 (얇은 천만)
수납처 (규칙 3)침실 책상 · 거실 식탁 · 부엌에 주입한 빨래 바구니(뚜껑 열어 고정). 소파·TV장은 파일럿에서 탈락
규칙 값클래스와 무관하게 뽑는다(수저→소파 허용). 쌍둥이 = 값을 고정점 없이 순환
지시편 시작에 세 문장 → 로봇이 R1·R2·R3·R1·R2·R3 순으로 유닛 6개(두 바퀴). 유닛 실패해도 편은 계속(drop_on_unit_fail=False)
시작 자세테이블 방이 아닌 침실 anchor — 바구니가 부엌 anchor 옆에 서서 로봇과 겹치는 것을 피한다
질의 (미구현)끝 상태에서 증거 9개를 숨김 상자로 치우고, 본 적 없는 하위 카테고리(손수건·토마토·포크)를 꺼내 "Put this away." / "Clear the counter."
__2000 "Put the food from the countertop on the desk." "Put the kitchen utensils from the countertop on the dining table." "Put the clothes from the countertop into the laundry basket." __2001 "Put the clothes from the countertop on the desk." ← 쌍둥이: 값 순환 "Put the food from the countertop on the dining table." "Put the kitchen utensils from the countertop into the laundry basket."

2 v2g 영상 — 책상·식탁·바구니 (job 109680, 1시간 7분) · 두 편 모두 첫 바퀴 3/3

train_1652__2000 (음식→책상 · 도구→식탁 · 천→바구니) — 유닛 5/6 · sim 13분 41초

exo_camera_1 · 16× — 감자 → 책상 · 칼 → 식탁 · 천 → 바구니 · (사과 운반 중 낙하) · 칼 → 식탁 · 천 → 바구니
wrist_camera · 16×
v2g strip
유닛 경계 7장: 시작(침실) · 감자를 책상에 · 칼을 식탁에 · 천을 바구니에 · 사과(실패) · 칼을 식탁에 · 천을 바구니에
유닛결과물체벽시계비고
t1u0 음식→책상OKPotato_61,001 s첫 배우 Apple_13 파지 계획 불능 → 감자
t2u0 도구→식탁OKKnife_1770 s
t3u0 천→바구니OKCloth_6544 s
t1u1 음식→책상FAILApple_9409 s계란 파지 계획 불능 → 사과 파지 성공 → 운반 중 낙하
t2u1 도구→식탁OKKnife_4645 s
t3u1 천→바구니OKCloth_11355 s

train_1652__2001 (쌍둥이: 천→책상 · 음식→식탁 · 도구→바구니) — 유닛 4/6 · sim 13분 21초

exo_camera_1 · 16× — 천 → 책상 · 사과 → 식탁 · 뒤집개 → 바구니 · (천 파지 실패) · 계란 → 식탁 · (칼 파지 실패)
wrist_camera · 16×
v2g twin strip
시작 · 천을 책상에 · 사과를 식탁에 · 바구니 옆 · 조리대의 남은 천 · 계란을 식탁에 · 조리대의 칼
유닛결과물체벽시계비고
t1u0 천→책상OKCloth_10895 s
t2u0 음식→식탁OKApple_13817 s식탁 수납처 첫 실증
t3u0 도구→바구니OKSpatula_1551 s
t1u1 천→책상FAILCloth_11187 sCloth_6 베이스 후보 3개 → Cloth_11 그리퍼가 11.6 cm 떨어져 닫힘
t2u1 음식→식탁OKEgg_29809 s (2회)계란 파지 첫 성공
t3u1 도구→바구니FAILKnife_1436 s칼 파지점이 칼날 끝 → 그리퍼가 17.5·22 cm 떨어져 닫힘
쌍둥이 짝의 실물: 같은 집·같은 12개·같은 조리대에서 규칙 값만 바뀌어 천이 한 편은 바구니, 다른 편은 책상으로, 칼이 한 편은 식탁, 다른 편은 바구니로 갔다. 두 편 모두 규칙 세 개가 전부 실행된 첫 바퀴가 있다. 편 합격 기준을 "한 바퀴 3/3" 또는 "task 당 2개 중 1개" 로 두면 두 편 다 합격.
남은 실패는 전부 두 번째 바퀴 파지: 첫 바퀴가 조리대 앞쪽 물체를 걷어 가면 안쪽 물체는 베이스 후보가 3~16개로 준다. 칼은 파지점이 칼날 끝에 잡힌다. 사과는 운반 중 떨어졌다. 데이터 판 처방: 배우 순서를 로봇 쪽부터, 칼 파지점을 손잡이로, 사과 그립 폭.

3 v2e 영상 — 소파 판 (job 109656, 1시간 28분) · 기록 6/12 → 재판정 10/12 (소파는 판정 버그)

v2g 와 같은 집·같은 12개·같은 시작 자세에서 3번째 수납처가 소파였던 판. 당시 "소파 안착 실패 4/4" 로 기록했지만 판정 버그였다(§7): 로봇은 칼·국자·사과·계란·감자를 전부 좌석 위(z 0.45~0.57)에 놓았고, 완료 판정이 소파 몸체 AABB 꼭대기(등받이 0.94 m)를 기준으로 재서 탈락시켰다. 고친 판정으로는 소파에 놓인 6개가 전부 통과 → 소파 유닛은 사실상 4/4, 편은 5/6 · 5/6.

__2000 (음식→책상 · 도구→소파 · 천→바구니) — 감자 → 책상 · 칼 → 소파 · 천 → 바구니 ×2 · 사과 → 책상(운반 중 낙하) · 국자 → 소파. 재판정 5/6
__2001 (천→책상 · 음식→소파 · 도구→바구니) — 천 → 책상 ×2 · 뒤집개 → 바구니 · 사과·감자 → 소파 · 칼 → 바구니(파지 실패). 재판정 5/6
v2e strip
v2e __2000 — 시작(침실) · 책상 접근 · 감자를 책상에 · 바구니 옆 부엌 · 천을 바구니에 ×2

4 파일럿에서 확정된 것 (계획서 §11-5)

항목실측데이터 판 규칙
수납처책상·식탁·바구니·소파 OK (소파 "실패" 는 판정 버그, §7). TV장은 놓기 IK 탈락소파·침대는 top_z 판정으로 복귀. TV장 제외. 집 선정 때 클래스별 놓기 가능을 사전 패스 프로브로 전수 스캔
천얇은 천(2.8~3.3 cm)만 파지. 8.6 cm 는 5장 전멸CLOTH 배우 = Cloth_6·10·11·12
출발 상면12개가 조리대 하나에 선다. n_reach_spots 는 용량이 아님넓은 DiningTable/CounterTop 우선
시작 자세바구니가 로봇 시작 자리와 33 cm 겹쳐 끼임테이블 방이 아닌 방에서 출발(근본: 통 자리 탐색이 시작 자리를 keep 점으로)
스테이징 순서천→책상 프로브가 task 순서에 따라 성립/탈락큰 물체 task 를 먼저 세운다
쌍둥이 사전 패스도착 상면 위 소품이 커서 프로브가 먼저 죽으면 영영 안 지워짐짝 편의 strip_props 공유 (PRESTAGE_SEED_STRIP)
유닛 실패type2 는 편 폐기routine 은 drop_on_unit_fail=False 로 완주 후 편 판정
발화L2 문장이 task 낱말 고정 → 계란 유닛이 "apple"유닛별 실제 배우 낱말
벽시계유닛 187~1,802 s, 편 67~88분배우·베이스 후보·재시도 상한 축소

5 Direct ② — 다른 규칙을 수행하다 지나가며 본 규칙 (내가 옮긴 적 없는 배치)

정의(사용자 260905): 한 편 안에 규칙이 섞여 있다. 실행 규칙은 사용자가 지시하고 로봇이 옮긴다(D① 그대로). 관찰 규칙은 아무도 말하지 않고 로봇도 옮긴 적이 없다 — 증거가 처음부터 수납처에 놓여 있고, 로봇이 실행 규칙의 유닛을 수행하는 동선에서 그 배치를 본다. 예: 음식을 책상에, 천을 바구니에 나르는 동안 침실 소파에 칼 3개가 놓인 걸 본다 → "칼은 소파" 를 알게 된다. 전용 투어는 없다.

행: 같은 편에서 관찰 규칙의 홀드아웃(포크)을 물으면 D② 행, 실행 규칙의 홀드아웃(손수건)을 물으면 D① 행. 편 하나가 두 행을 낸다. 격자(scene_bench 260903)의 Direct ① Tidy up / ② Observed 가 이것이다.

D① 행 (실행 규칙의 홀드아웃)D② 행 (관찰 규칙의 홀드아웃)
증거지시문 + 내가 옮긴 유닛 2~3개동선에서 화면에 잡힌 배치 (내가 옮긴 적 없음, 언급도 없음)
규칙이 텍스트에있다없다 — 영상 없이는 알 수 없다 (A2 구조 만족)
기억의 형태내 행동 이력 → 규칙지나가며 본 것 → 규칙 (주변 관찰에서 선호를 읽는 TidyBot 형)
정답실행 규칙의 값관찰 규칙의 값 — 소파·침대도 놓을 수 있으므로(§7) result 채점. 도달 지점 0 인 상면(집마다 다름)만 scoring=intent
편같은 편 · 같은 시작 상태 편집 · 같은 쌍둥이 짝

5-1. 컨텍스트 문법 — 규칙 3 = 실행 2 + 관찰 1 또는 실행 1 + 관찰 2 (n=2 는 1+1), 편마다 섞는다

[심기] 실행 규칙 배우: 조리대에 섞어 둔다 (D① 그대로, 규칙당 4) 관찰 규칙 증거 3개(하위 카테고리 2종+): **수납처에 미리** 놓는다. 로봇은 건드리지 않는다 수납처 자리 = 실행 유닛의 동선 위 — 도착 방 우선(책상 옆 소파), 출발 방, 통과 방 소파·침대도 된다 (놓기·판정 모두 OK, §7). 예측기가 **수납처 위 어느 자리**(소파 어느 쪽 끝)가 경로에서 보이는지까지 고른다. settle 300 스텝, 5 cm 검사 홀드아웃·미끼 숨김 상자, 규칙 클래스의 씬 물체 strip ← D① 동일 사전 패스: 유닛별 주행 경로(격자) × 머리 카메라 frustum × mj_ray 가림 → "보이는 구간" 예측. 실행 유닛 ≥ 2개에서 보여야 성립. 안 보이면 다른 수납처 → 다른 집 [컨텍스트] 지시는 실행 규칙만: "Put the food from the countertop on the desk." / "Put the clothes from the countertop into the laundry basket." 유닛 R1 R2 R1 R2 (4개 ≈ 9 분). 칼은 아무도 말하지 않는다 책상 유닛마다 접근·놓기·복귀 중 침실 소파 위 칼 3개가 화면에 잡힌다 → 증거 구간 2~4개 standby [실행 후] 픽셀 로그(tracked_obj_pixels)로 evidence[] 확정: 증거 3개 각각 ≥ 200 px 구간이 **서로 다른 유닛에서 ≥ 2** 미달 → 편 폐기. **폴백 없음** — 증거는 동선에서 보이는 곳에 두는 것이 원칙 (사용자 260905). 예측기가 자리를 고른다 [질의] q_direct(D②) "Put this away." (포크) → 소파 q_direct(D①) "Put this away." (손수건) → 바구니 q_multi "Clear the counter." 토마토 → 책상 · 손수건 → 바구니 · 포크 → 소파 · 펜 → 그대로(control) [쌍둥이] 값을 실행·관찰 통틀어 고정점 없이 순환한다 — 소파도 놓을 수 있으니 풀을 가를 필요가 없다. 단 관찰 수납처는 두 편 모두 동선에서 보여야 한다(예측기 검사). 홀드아웃 동일 → D② 행도 짝 채점. __3001: 천→책상 · 칼→바구니 (실행), 음식→소파 (관찰)

5-2. 예시 — train_1652 D② 쌍둥이 짝 (D① 과 같은 집·같은 물체)

train_1652__3000 방: 2:Bedroom, 6:Kitchen, 7:LivingRoom 시작: 거실 anchor (3.10, 8.09) 심기: countertop(방6) ← Apple_13, Potato_6, Egg_29, Apple_9, Cloth_6, Cloth_10, Cloth_11, Cloth_12 실행 배우 8 sofa_179b…(방2 침실, 책상에서 ~2 m) ← Knife_1, Ladle_1, Spatula_1 관찰 증거 [CUTLERY → Sofa], 로봇 무접촉 hidden_box(방6, 닫힘) ← Tomato_10, Hand_Towel_1, Fork_1, Pen_3 strip: 씬의 apple · egg · Irishpotato · spatula · butterknife 지시: U1 "Put the food from the countertop on the desk." [FOOD → Desk] 실행 U2 "Put the clothes from the countertop into the laundry basket." [CLOTH → Basket] 실행 (칼·국자·뒤집개는 아무도 언급하지 않는다) 유닛: t1u0 감자 → 책상 (침실) 접근·놓기 중 소파 위 칼 3개 화면에 evidence CUTLERY #1 frames [4100, 4700] t2u0 천 → 바구니 (부엌) t1u1 사과 → 책상 evidence #2 frames [11800, 12500] t2u1 천 → 바구니 standby (거실) sim ≈ 9 분 (유닛 4) 질의: q_direct(D②) "Put this away." (로봇 앞 Fork_1) → Sofa 어느 인스턴스든, scoring=intent q_direct(D①) "Put this away." (로봇 앞 Hand_Towel_1) → Basket q_multi "Clear the counter." (조리대: Tomato_10, Hand_Towel_1, Fork_1, Pen_3) → 토마토 Desk · 손수건 Basket · 포크 Sofa · 펜 그대로 (control) train_1652__3001 (쌍둥이: 값 순환) 실행: 천 → 책상 · 칼 → 바구니 관찰: 감자·사과·계란 → 침실 소파 (책상 유닛 동선에서 보임) 홀드아웃 동일 질의: 포크 → Basket · 손수건 → Desk · 토마토 → Sofa · 펜 그대로 train_1652__3002 (실행 1 + 관찰 2) 실행: 천 → 바구니 관찰: 칼·국자·뒤집개 → 거실 식탁 (부엌↔바구니 동선) · 감자·사과·계란 → 거실 소파 질의: 포크 → DiningTable (D②) · 토마토 → Sofa (D②) · 손수건 → Basket (D①)

5-3. 행 스키마 — 규칙마다 evidence_source, 행에는 물은 규칙의 출처

{ "family":"routine", "kind":"routine_direct", "query_id":"routine:train_1652__3000:direct_obs", "query":"Put this away.", "start_state":"states/q_direct_obs.npz", "cue":"bare", "axes":{ "n_rules":3, "n_observed":1, "evidence_source":"observed", "receptacles":["Desk","Basket","Sofa"] }, "rules":[ {"id":"R1","cls":"FOOD","value":"Desk","evidence_source":"self", "evidence":[{"kind":"unit","unit":"t1u0","obj":"Potato_6","frames":[0,5294]}, {"kind":"unit","unit":"t1u1",…}]}, {"id":"R2","cls":"CLOTH","value":"Basket","evidence_source":"self","evidence":[…]}, {"id":"R3","cls":"CUTLERY","value":"Sofa","evidence_source":"observed", "evidence":[{"kind":"pass_by","unit":"t1u0","surface":"sofa_179b…","objs":["Knife_1","Ladle_1","Spatula_1"],"frames":[4100,4700],"min_px":331}, {"kind":"pass_by","unit":"t1u1","surface":"sofa_179b…","objs":[…],"frames":[11800,12500],"min_px":290}]} ], "holdout":[{"obj":"Fork_1","cls":"CUTLERY","subcat":"Fork","placed":"floor_front"}], "answers":[{"obj":"Fork_1","cls":"CUTLERY","receptacle_class":"Sofa","any_instance_ok":true,"expect":"store","scoring":"result"}], "evidence_cleared":true, "twin_id":"routine:train_1652__3001:direct_obs", "rule_stmt":null }

같은 편의 D① 행(direct_self)은 holdout=Hand_Towel_1, answers.receptacle_class="Basket", axes.evidence_source="self" 만 다르다. scoring 은 find 의 answers[].scoring 규약 재사용 — 기본 result. 도달 지점 0 인 상면(예: 이 집의 침대)만 intent.

5-4. 코드 변경 지도 (D① 위에 얹는다)

파일무엇규모
routine_gen.py--observed {1,2}: 규칙을 실행/관찰로 나누고(편마다 섞음), 관찰 수납처·자리를 실행 유닛 동선(도착 방 > 출발 방 > 통과 방)에서 예측기로 고른다. 발화는 실행 규칙만. 쌍둥이는 값 순환 + 두 편 모두 가시성 검사~100줄
resume_stage.py관찰 증거를 도착 수납처에 세운다(소파·침대 포함, 놓기 IK 불필요) + settle 5 cm 검사. 지금은 출발 상면만 세운다~40줄
tools/prestage_resume.py가시성 예측기: 유닛별 주행 경로 × 머리 카메라 frustum × mj_ray 가림 → 보이는 구간 수. 렌더 없음~80줄
scene_mem_script.py0 — 관찰 규칙은 유닛이 아니다 (판정 버그 수정 3줄은 이미 반영, §7)0
tools/build_routine_queries.py픽셀 로그 → 관찰 규칙 evidence[](pass_by 구간·min_px) + 불변식 검사 + D①/D② 행 둘 다 생성 + scoring~60줄 (D① 빌더에 추가)
하네스변경 없음 — 같은 kind·같은 채점, scoring=intent 는 find 규약0

5-5. 리스크와 처방

리스크처방
동선에서 안 보인다 (가장 큰 위험)사전 패스 예측기(경로 × frustum × 가림)가 보이는 자리를 고른다 + 실행 후 픽셀 로그 확정. 폴백 없음, 미달 편은 폐기
"남의 물건" 으로 읽혀 규칙으로 안 잡힌다k=3 · 하위 카테고리 2종+ · 반례 0(씬 물체 strip) · 2회 이상 재관찰 · 쌍둥이
관찰 수납처에 로봇이 못 놓는다소파·침대는 놓을 수 있다(§7). 카드 n_reach_spots=0 인 상면만 intent 채점
심은 칼이 소파에서 미끄러진다settle 300 스텝 후 5 cm 검사, 실패 시 다른 spot/수납처. 놓기가 아니라 배치라 비용 0
관찰 규칙이 실행 규칙과 위치가 겹친다관찰 수납처 ≠ 실행 도착 상면 ≠ 출발 상면 (사전 패스 `all_dst` 제외 규칙 확장)
D① 텍스트 로그 누출같은 편의 D①/D② 행을 나란히 채점하면 "텍스트로 푼 것" 과 "영상으로 푼 것" 이 갈린다 — 이 구조가 곧 통제

5-6. 선택 — D②-b "안 볼 때 정리됐다" (hard 층)

시작에 관찰 클래스도 조리대에 섞여 있고(로봇이 봄), 로봇이 실행 유닛으로 다른 방에 간 사이 세계가 그 물체들을 소파로 옮긴다(시야 밖 teleport + settle). 돌아온 로봇은 조리대에서 칼이 사라지고 소파에 놓인 것을 본다 — 증거 = 변화. 필요한 primitive g_world_move(~40줄)는 생성기에 없다(평가팀 노트의 "misplaced 장치" 는 실행-의도 불일치 라벨). Restore ②·Resume ② 도 같은 장치를 요구하므로 한 번 만들어 세 곳에 쓴다.

결정됨 (사용자 260905)

  1. 폴백 없음 — 관찰 증거는 동선에서 보이는 곳에 둔다. 예측기가 수납처와 자리를 고르고, 픽셀 로그 미달 편은 폐기.
  2. 소파·침대는 놓을 수 있다 — 파일럿의 "소파 실패" 는 판정 버그(§7)였고 고쳤다. 관찰 수납처 풀을 따로 두지 않는다.
  3. 편마다 섞는다 — 규칙 3 = 실행 2 + 관찰 1 또는 실행 1 + 관찰 2, 규칙 2 = 1 + 1. 매 편 D①·D② 행 둘 다.

6 D② 파일럿 실측 — 구현 후 train_1652 에서 실제로 돌린 것

실행기 변경 0 으로 D② 가 관통했다: 생성기(--observed CUTLERY) → 무대(관찰 증거 심기) → 사전 패스(가시성 예측) → 워커 실행 → 픽셀 로그로 노출 실측(tools/routine_evidence.py). 실행 유닛은 세 번의 실행 모두 4/4 · 편 판정 깨끗(파일럿 첫 무결점 편들). 어려운 것은 실행이 아니라 "지나가며 보이게" 놓는 것이었다.

6-1. 기본 편 train_1652__3000 — 실행: 음식→책상 · 천→바구니 / 관찰: 칼·국자·뒤집개 → 소파 (아무도 말하지 않음)

1차: 침실 소파 (예측기 v1 "점이 보이나")2차: 거실 소파 (예측기 v2 "몇 px 인가", 후보 전수 비교)
실행 유닛4/4 깨끗 · sim 11분 48초 · 벽시계 41분4/4 깨끗 · sim 11분 48초 · 벽시계 41분
경로 → 증거 최소거리1.58 ~ 1.84 m (1.5 m 안 0 프레임)0.99 ~ 1.40 m (1.5 m 안 326 ~ 1,160 프레임)
실측 최대 px (칼 · 국자 · 뒤집개)166 · 217 · 49760 · 426 · 276
≥ 200 px 프레임0 · 5 · 0114 · 83 · 26
증거 3개 전부 보인 유닛0 → 불변식 탈락4/4 → 불변식 성립
예측v1: 4/4 (거짓 양성) · v2 재예측: 점수 0, max px 189·626·212v2: 4/4, 점수 4,148, max px 648·430·408 (실측 오차 ≤ 30%)
2차 (거실 소파) exo_camera_1 · 16× — 거실 출발 → 조리대 감자 → 침실 책상 (가는 길에 거실 소파 옆을 지난다) → 천 → 바구니 → 계란 → 책상 → 천 → 바구니. 칼은 아무도 언급하지 않는다
wrist_camera · 16×
glimpse exo2
2차 — 노출 최대 프레임(14,779, exo_camera_2): 천을 들고 바구니로 가다 거실 소파 위 칼·국자가 화면 왼쪽에 잡힌다 (칼 750 px)
glimpse bedroom
1차 — 노출 최대 프레임(12,689, exo_camera_1): 침실 책상 앞에서 오른쪽 가장자리 소파 위 칼·국자가 몇 px 로만 걸린다 — 1.8 m 는 칼에겐 멀다
d2 strip
2차 유닛 경계 5장: 거실 시작 · 감자를 책상에 · 천을 바구니에 · 계란을 책상에 · 천을 바구니에

6-2. 쌍둥이 — 실행: 음식→바구니 · 천→거실 소파 / 관찰: 칼 → ? (값 교체)

관찰 수납처경로 최소거리 (3002 실측 궤적)예측 max px (칼·국자·뒤집개)실측판정
거실 식탁 (__3002, 실행함)3.12 mv2·A* 동선: 444·458·349 (거짓 양성 — A* 가 실제 동선을 못 맞춤)64 · 74 · 37 px, 0 유닛탈락 (실행은 4/4 깨끗)
침실 책상 (__3001)1.45 m실측 궤적 모드: 132·137·183—탈락
TV장 (__3004)1.27 m실측 궤적 모드: 329·323·321, 유닛 3개, 점수 2,223769 · 369 · 260 px — 3개 전부 ≥200 px 인 유닛 t1u1 만 (칼·국자는 t1u0 도), 프레임 10·9·2근접 미달 (유닛 2개 필요) · 실행 3/4
TV장 경로 쪽 (__3006, k=3)3004 궤적 기준 1.02 m → 실제 1.60 m (k=3 으로 조리대 배치가 바뀌어 동선이 달라짐)3004 궤적: 401·535·992, 유닛 2개 (지속 시간 조건)175 · 197 · 165 px, 0 프레임탈락 — 다른 계획의 궤적은 이 계획의 동선이 아니다 · 실행 3/4 (천 파지)
TV장 경로 쪽 (__3002_tv, seed 3002 그대로)3002 자기 궤적 1.27 m (동일 계획 → 동선 재현)3002 자기 궤적 + 지속 조건: 283·322·361, 유닛 3개(각 3 표본), 점수 1,985721 · 805 · 161 px, 프레임 2 · 1 · 0 — 경로는 0.56~0.64 m 까지 붙었으나(1.5 m 안 450~540 프레임) 옆으로 지나가 정면 원뿔에 잠깐만 들어옴. 뒤집개는 얇아 예측(361) 대비 과대탈락 · 실행 3/4 (소파 놓기 IK 해가 원판과 달라 천 낙하 → 재시도)
__3002 exo_camera_1 · 16× — 사과·감자 → 바구니, 천 → 거실 소파 ×2 (소파 판정 수정 후 1회 성공). 식탁의 칼은 3 m 밖
table glimpse
__3002 노출 최대 프레임: 로봇이 놓은 천이 소파 위, 식탁의 칼은 오른쪽 가장자리에 점으로

6-2′. 쌍둥이 train_1652__3004 실행 결과 (job 110361, 24분) — 실행 3/4, 관찰은 근접 미달

유닛결과물체벽시계비고
t1u0 음식→바구니OKApple_9375 s
t2u0 천→거실 소파OKCloth_6627 s (2회)Cloth_12 그리퍼 20 cm 떨어져 닫힘 ×2 · Cloth_11·10 파지 계획 불능 → 천 3장 소모
t1u1 음식→바구니OKPotato_6407 s
t2u1 천→소파FAIL—0 s배우가 동났다 (4/4) → 편 "개수 미달"
__3004 exo_camera_1 · 16× — 사과 → 바구니 · 천 → 거실 소파 · 감자 → 바구니. TV장의 칼·국자·뒤집개는 아무도 언급하지 않는다 (sim 7분 2초)
tv glimpse
__3004 노출 최대 프레임(7,594, exo_camera_1): 감자를 들고 바구니로 가는 길, TV장 위 칼·국자·뒤집개 (합 849 px)
3004 strip
__3004 유닛 경계 4장: 거실 시작 · 사과를 바구니에 · 천을 소파에 · 감자를 바구니에
쌍둥이 판정 (3회 시도: 식탁 · TV장 가운데 · TV장 경로 쪽): 이 집에서 칼을 관찰 규칙으로 두는 쌍둥이는 불변식(유닛 ≥ 2 에서 셋 다 ≥200 px 지속)을 못 채웠다. 세 물체 모두 ≥200 px 로 잡힌 적은 있으나(TV장: 칼 769·805, 국자 369·805, 뒤집개 260) 스쳐 지나가는 노출이다 — 어깨 카메라는 전방 아래를 보므로 경로 옆의 수납처는 로봇이 그쪽으로 돌 때만 잡히고, 뒤집개처럼 얇은 물체는 예측보다 작다. 기본 편(거실 소파)이 성립한 것은 소파가 부엌→침실 동선의 정면에 놓여 있었기 때문. 실행 쪽은 천 파지·소파 놓기가 실행마다 갈려(3/4 ×3) 여분 천 k=3 이 필요하고, 같은 계획이라도 strip 소품이 달라지면 IK 해가 바뀐다(geom 순서 의존 추정).
__3002_tv exo_camera_1 · 16× — 사과 → 바구니 · 천 → 소파(낙하 후 재시도 성공) · 감자 → 바구니. TV장 옆 0.6 m 를 지나지만 카메라는 앞을 본다
tv glimpse 3002tv
__3002_tv 노출 최대 프레임(9,714): 감자를 들고 돌아설 때 TV장 위 칼·국자가 크게(721·805 px) 잡히지만 한두 프레임이다

6-3. 배운 것 — 생성기 규칙으로 굳힌 것

실측규칙
칼(25×3 cm)은 1.8 m 에서 166 px, 1.0 m 에서 760 px. exo 카메라는 어깨 높이 1.55 m 에서 아래 34° — 2 m 밖은 작다예측기는 "점이 보이나" 가 아니라 예상 픽셀 px ≈ fx²·A/d² 로 판정. 작은 물체(칼·계란)는 경로 ≤ 1.2 m, 큰 물체(천)는 ~6 m 까지
"실행 도착 방의 수납처" 라는 후보 순서가 틀렸다 — 같은 방이라도 경로 반대편이면 안 보인다무대가 그 클래스의 상면을 전부 세워 보고 노출 점수(세 물체의 최소 px 합) 최대를 고른다. pin 은 먼저 시험, 점수 0 이면 나머지
A* 동선 모형은 로봇이 고르는 베이스 자리·우회로를 못 맞춘다 (식탁 3.1 m 를 1.5 m 로, 책상 1.45 m 를 "안 보임" 으로)실측 궤적 모드(ROUTINE_TRAJ): 같은 실행 계획은 유닛 시간이 초 단위로 재현되므로(379/382/375 s) 앞선 실행의 robot_base_pose 로 노출을 잰다 — 데이터 판은 2-pass(실행 계획 1회 → 관찰 배치 → 재실행) 또는 실행 계획별 궤적 캐시
픽셀 로그는 카메라 셋 중 최대 — 오른쪽 어깨(exo_camera_2)가 왼쪽보다 잘 보는 자리가 있다예측기도 두 어깨 카메라(좌우 대칭)의 최대
소파 판정 수정이 런타임에서 안 먹었다(런타임 ctx 는 _card 만 든다)surface_top_z 가 _card 도 본다. 쌍둥이 천→소파 1회 403 s 성공으로 확인
지시 전에 증거를 보면 "지나가며" 가 아니다시작 자세는 관찰 방도 피한다 (거실 anchor)
경로 0.6 m 옆을 지나도(1.5 m 안 540 프레임) 한두 프레임만 잡힌다 — 어깨 카메라는 전방 아래 34° 를 본다수납처는 동선의 정면 원뿔(진행 방향 ±40°)에 있어야 한다: 방 입구 맞은편·목적지 접근 방향. 예측기는 이미 heading 을 쓰므로 여유를 요구한다(예측 ≥ 400 px · 셋 다 보이는 표본 ≥ 5)
뒤집개(얇은 판)는 예측 361 px, 실측 161 px — 옆에서 보면 선이다얇은 물체는 면적 보정 0.7 → 0.35, 또는 관찰 배우에서 제외
같은 계획이라도 strip 소품이 달라지면 소파 놓기 IK 해가 바뀌어 낙하(3002 vs 3002_tv)플래너의 geom 순서 의존을 없애거나(정렬), 2-pass 는 strip 도 고정. 실행 여분 천 k=3
같은 계획(seed·k 동일)이면 동선이 완전히 재현된다 — 3000 1차·2차 궤적 108.6 m 동일(소파 1.20 m/912 프레임, 책상 0.80 m/3,019 프레임 모두 일치). seed·k 가 다르면 경로 길이 80 → 52 → 51 m, TV장 거리 1.27 → 1.02 → 1.60 m2-pass 는 동일 계획으로: 실행 계획을 한 번 돌려 궤적을 얻고, 그 계획을 그대로 두고 관찰 배치만 바꿔 재실행. 다른 seed 의 궤적은 쓰지 않는다 (__3006 의 실패 원인)
TV장 가운데에 놓은 칼은 스쳐 지나가는 정도(0.4 s)로만 보였다 — 크기는 맞고 지속 시간이 짧다예측기에 지속 시간 조건(유닛당 셋 다 ≥200 px 인 표본 ≥ 3 = 1.2 s) + 증거를 수납처 위 경로 쪽 가장자리(동선에 가장 가까운 점으로 최대 0.4 m)에 놓는다 → 같은 TV장이 점수 2,223 → 2,961, 유닛 2개 성립. 재실행 __3006(여분 k=3, job 110442)
결론: D② 컨텍스트는 실행기 변경 없이 만들어진다(6회 실행: 실행 유닛 4/4 깨끗 ×3, 3/4 ×3). "지나가며 본다" 는 생성기가 노출을 픽셀·지속 시간으로 예측하고 실측으로 확정해야 성립하며, 성립 조건은 동선 정면 ≤ 1.2 m 에 놓인 충분히 큰 물체다. 기본 편(칼 → 거실 소파)은 성립 — 칼 114 프레임 · 최대 760 px · 4/4 유닛. 쌍둥이는 이 집의 나머지 수납처가 전부 동선 옆이라 3회 모두 근접 미달 → 데이터 판에서는 집·짝 선정 단계에서 두 편 모두 예측 노출(≥ 400 px · ≥ 5 표본 · 유닛 ≥ 2)을 통과하는 조합만 뽑는다(이 집·칼 조합은 기각).

7 소파 "실패" 는 판정 버그였다 — on_surface 가 등받이를 기준으로 쟀다

v2e 로그를 다시 보니 소파 유닛 네 번 모두 [place] 최종 … → OK 로 물체가 좌석 위 z 0.45~0.57 에 놓였는데 유닛 판정만 FAIL 이었다. 완료 판정 resume_stage.on_surface 는 상면 몸체 전체의 AABB 꼭대기에서 15 cm 아래를 하한으로 쓴다 — 소파는 등받이(0.94 m), 침대는 헤드보드(0.65 m)가 꼭대기라 좌석(0.43)·매트리스(0.41) 위 물체는 구조적으로 탈락한다. 책상·식탁·조리대는 상판이 곧 꼭대기라 문제가 없었다.

상면 (train_1652)카드 top_z몸체 AABB 꼭대기옛 판정 하한상면 위 물체
Sofa (거실)0.430.94z > 0.79탈락
Sofa (침실)0.431.10z > 0.95탈락
Bed0.410.65z > 0.50탈락
Desk · DiningTable · CounterTop · TVStand0.72~0.94= top_ztop_z − 0.15통과

수정: on_surface(…, top_z=) 에 카드가 잰 놓는 면 높이를 넘긴다(surface_top_z(ctx, name), 호출부 3곳). v2e 두 편의 저장 상태(final.npz)로 재판정:

편소파에 놓은 물체z옛 판정새 판정
__2000Knife_1 · Knife_4 · Ladle_10.45 · 0.45 · 0.46FAIL ×3OK ×3
__2001Apple_13 · Egg_29 · Potato_60.50 · 0.57 · 0.48FAIL ×3OK ×3
(대조) 조리대에 남은 것Spatula_1 · Apple_9 …0.95~0.99FAILFAIL (xy 밖)
의미: 소파·침대·안락의자가 수납처 풀로 돌아온다(TidyBot 의 "리모컨은 소파" 가 된다). v2e 는 소파 유닛 4개가 전부 OK 였을 것이므로 편 기준 5/6 · 5/6 — 이미 3종 수납처 예시가 두 짝이다. 옛 판정은 유닛을 실패로 보고 여분 배우로 재시도했으니 v2e 벽시계(88분)도 이 버그가 부풀렸다. type2(resume) `move_objects` 도 같은 판정을 쓰므로 소파·침대 목적지가 있었다면 같은 손실이 있었다.

8 Next

① 집·짝 선정에 예측 노출 여유(≥400 px · ≥5 표본 · 유닛 ≥2, 두 편 모두) → 다른 집에서 쌍둥이 1짝 · 정면 원뿔 규칙 · 얇은 물체 보정 · 플래너 geom 순서 결정성 · 2-pass(실행 계획 → 궤적 → 관찰 배치) 를 생성기 기본 경로로 ③ D①·D② 공용 데이터 판: 유닛별 낱말, 배우 순서·칼 파지점, 홀드아웃·미끼·숨김 상자, build_routine_queries, pack, eval 등록 ④ 세계 이동 primitive(D②-b · Restore ② · Resume ② 공용) 는 별도 항목.