env.fixture_refs-only) → V3: env.fixtures 전체 doored fixture 커버 + robocasa class 기반 canonical noun map + multi-instance → undetermined(no-guess)target_doors: eval_spec.tests[*].fixture.joint_names로 직접 qpos read → TARGET fixture의 정확한 door state 구조체 생성_ManifestCoverageGap raise → non-target는 §7 verbatim fallback, TARGET은 clean RuntimeError skiptask_subtasks_oracle.json(30 rds), diff_scene_mem_trees.py, build wrapper → oracle tree build job 5207 제출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 손실 교훈).
query_initial_door_states: env.fixture_refs → env.fixtures(ALL scene fixtures).
robocasa fixture class 기반 canonical noun 결정:
| Robocasa Class | Canonical 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].
_missing_manifest_noun(reqs, manifest_scenario): required_door_states의 fixture noun이 manifest에 없거나 undetermined이면 해당 noun 반환.
_ManifestCoverageGap exception class: resolve_subtasks_with_doors에서 coverage 미충족 시 raise (KeyError 아님).
라우팅 분기:
_memory_fallback_subtasks(seg)(§7 verbatim fallback). 크래시 없음.RuntimeError("TARGET segment required door noun 'X' absent/undetermined") → process_scenario가 skip 기록. main()까지 KeyError 전파 없음.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.
RuntimeError: "TARGET segment required door noun 'cabinet' absent/undetermined" → skipped (이후 V3B에서 target_doors 배선으로 해결)_rc365_commit의 import subprocess는 dead import(미사용)임을 line-by-line 확인.
data/task_subtasks_oracle.json: 162 tasks, VALID, required_door_states non-empty 30개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만 봐 일반화한 표본 편향의 결과였다. 독립 정량화가 표본 편향 주장을 항상 이겨야 한다는 교훈.
diff_scene_mem_trees.py data/scene_mem_v2 data/scene_mem_v2_oracle로 before→after door-step delta 정량화. baseline row count 일치 = diff 유효성 gate.