← 목록으로
2026-05-19 · memer · engineering

Oracle V3 — All-Scene-Fixtures Coverage + Manifest-Gap Routing + Task 5b Build Prep

commits 5c60091, a71fae7, 6ad0343 · oracle_version "3-pathB-all-fixtures"

TL;DR

438
Tests Passed
30
rds tasks
0
Uncaught KeyError
VALID
Validator (162)

1 배경/목적 (왜)

V2 oracle(env.fixture_refs-only)에는 858/858 scenario에서 manifest-coverage gap이 있었다. env.fixture_refs는 env task에 등록된 fixture만 포함하는데, 각 scenario는 단일 scene이라 비-env-task 세그먼트도 같은 scene 내 fixture의 초기상태가 필요하다.

독립 정량화 결과: V2 누락 occurrence cabinet 609 · microwave 485 · toaster oven 276 · fridge 229 · freezer 184 · oven 146 · dishwasher 37 · drawer 9. 이전 세션에서 실행 에이전트가 "OvenBroilFish는 env_task가 아니다"고 주장했으나 실제 41개 scenario에서 env_task임 — 34개 combo만 확인한 표본 편향이었다.

Task 5b는 oracle로 만든 858 manifest를 사용해 oracle tree를 별도 경로에 빌드하고 before→after를 정량화하는 것이다. multi-hour 빌드 제출 전 pre-flight가 필수(이전 6h44m 손실 교훈).

2 작업 내용 (어떻게)

1. init_state_oracle.py 전면 재설계 (V3)

query_initial_door_states: env.fixture_refsenv.fixtures(ALL scene fixtures).

robocasa fixture class 기반 canonical noun 결정:

Robocasa ClassCanonical Noun비고
Fridge subclass"fridge" + "freezer"2 compartment flat
Cabinet subclass (Hinge/Single/Open/Panel/Housing)"cabinet"Drawer는 slidejoint만 → 제외
Microwave"microwave"
Oven"oven"
Dishwasher"dishwasher"
ToasterOven"toaster oven"

Multi-instance no-guess: 같은 noun의 instance ≥ 2 → undetermined(state emit 절대 금지). combo_002에서 cabinet 45개 instance → undetermined 1항목.

target_doors: eval_spec.tests[*].fixture.joint_names으로 직접 qpos read → {test_id: {joint_names, fixture_type, state}}. 예: RestockBowls_obj1 → cabinet closed [cab_6_…_leftdoorhinge, …_rightdoorhinge].

2. build_scene_mem_v2.py — manifest-coverage routing

_missing_manifest_noun(reqs, manifest_scenario): required_door_states의 fixture noun이 manifest에 없거나 undetermined이면 해당 noun 반환.

_ManifestCoverageGap exception class: resolve_subtasks_with_doors에서 coverage 미충족 시 raise (KeyError 아님).

라우팅 분기:

3. Task 5b build prep (commit 6ad0343)

MANDATORY pre-flight: build_scene_mem_v2.py + transitive imports 전체에서 subprocess/os.system/Popen/check_output/git/robocasa/mujoco 스캔 → 전부 0건. robocasa import 없음 → memer env에서 동작.

data/task_subtasks_oracle.json: extract_composite_subtasks.py --emit-door-annotations + validator → VALID, 162 tasks, 30 non-empty rds(19 auto + 11 manual Task 5a source-verified).

scripts/diff_scene_mem_trees.py: per-split samples/changed/turn/door delta + oracle open/close count. scripts/run_build_oracle_tree.sh: build wrapper.

Baseline sha256 prep 전후 byte-identical: train.jsonl 28b4bc75…, val.jsonl 37590604…, task_subtasks.json 1e1db30d….

Build job: 5207, memer, --qos=extra --gres=gpu:0 -c 32 --mem 128GB.

3 결과 (수치)

438
Total tests passed
30
rds non-empty
0
Uncaught KeyError
0
Baseline diff

테스트 (438 = 434 memer + 4 robocasa oracle)

1-scenario 검증 (combo_002_L29_S48_0006, MoveFridgeToFreezer env)

Task 5b pre-flight CLEAN: 기존 6h44m 손실 사고(git shellout)와 동일 패턴이 0건으로 확인됐다. _rc365_commitimport subprocess는 dead import(미사용)임을 line-by-line 확인.

Task 5b 검증 결과

4 Takeaway

V2의 근본적 insufficiency를 해결했다: oracle이 scene의 모든 doored fixture를 커버하므로 비-env-task 세그먼트의 fixture도 manifest에 존재한다. Multi-instance cabinet(전형적으로 scene당 40-50개)는 undetermined → §7 verbatim fallback으로 라우팅 — "silent wrong은 절대 없음, 단 불확실하면 fallback"이라는 no-silent-wrong 원칙을 manifest-coverage 레벨까지 확장.

OvenBroilFish env_task 41개가 V2에서 커버 안 됐던 것은 에이전트가 34개 combo만 봐 일반화한 표본 편향의 결과였다. 독립 정량화가 표본 편향 주장을 항상 이겨야 한다는 교훈.

설계 결정 기록: TARGET 세그먼트의 manifest-absent noun은 §7 fallback 대신 RuntimeError+skip으로 처리했다. 이유: TARGET은 eval_spec이 이미 fixture를 지정했으므로 oracle이 모른다면 데이터 오염 위험이 있다. 반면 non-target는 fallback이 verbatim composite로 충실하다. 이 분기가 V3B의 target_doors 배선으로 target cabinet을 grounding 가능하게 했다.

5 Next Steps