TL;DR
- 8차 결함 종료: multi-instance cabinet(scene당 ~45개)이 TARGET일 때 by-noun undetermined → scenario-skip으로 데이터셋 붕괴(60-scenario에서 kept 4/60)했던 마지막 결함을,
target_doors(eval_spec joint qpos)를 resolver TARGET 경로에 배선해 해소
- kept 4/60 → 80/80 (100%): 80-scenario 광범위 빌드에서 skip 0 (commit
e226113)
- door step ground-truth 3/3 PASS: "skip 안 됨"이 아니라 실제 분해가 물리적으로 옳음을 검증 (closed→Open+Close / open→suppress+Close / 비-타겟 multi→§7 verbatim)
- 전 항목 orchestrator 독립검증: 서브에이전트 self-report 본 세션 8회 부정확 → 직접 재실행·재카운트·byte 대조한 것만 채택. baseline·HF byte-불변
1 배경 / 목적
사용자가 B1 렌더 영상에서 본 결함: "cabinet이 닫혀 있는데 열고-닫으라는 암묵 step이 분해에 빠져 있다". 이를 고치는 Sub-project A = 에피소드의 실제 초기 door 물리상태로 분해를 grounding(robocasa env 인스턴스화 → door 술어). 이번이 8차이자 마지막 결함.
결함-8: 한 scene에 cabinet이 ~45 인스턴스. 그 중 하나가 메모리-probe의 TARGET이면, by-noun 판정은 "어느 인스턴스인지 모름(undetermined)"으로 떨어져 scenario 전체를 skip → 60-scenario 빌드에서 kept 4/60 (58 skip_res), 데이터셋 사실상 붕괴.
설계 §4c는 oracle이 eval_spec.json 자신의 fixture.joint_names로 타겟 인스턴스만 정확 grounding한 target_doors를 emit하도록 정의했으나, resolver의 TARGET 경로가 이를 소비하지 않아 그 정밀 정보가 버려지고 있었다.
2 작업 내용 / 접근
서브에이전트(a410e54072a69803d)가 path A 수정 수행 — commit e226113:
scripts/build_scene_mem_v2.py (+59)
_target_covers_noun(noun, test, scn) # target_doors[test_id].fixture_type == noun
_seed_machine_with_target(scn, test) # by-noun 시드 후 target_doors로 TARGET override
_try_build / resolve_subtasks_with_doors # TARGET이 target_doors로 커버 → undetermined여도 skip 안 함
scripts/init_state_oracle.py (+4)
_fixture_class_noun: Stove → "oven" # Stove XML 변형의 오븐 도어조인트 undetermined 누출 제거
tests/test_decomposition_regrounding.py (+157) # 3 신규 테스트
검증 원칙 (왜 직접 재실행했는가)
본 세션에서 서브에이전트 self-report가 8회 부정확(예: "OvenBroilFish env task 아님"→실제 41건, "build smoke OK"→1-scenario만 봐 60-scenario 회귀 누락). 따라서 보고를 결론으로 쓰지 않고, orchestrator가 ① 내 소유 모니터로 raw build 로그 직접 read, ② manifest↔eval_spec joint byte 대조, ③ 분해 3-spot-check vs 초기상태, ④ baseline sha256, ⑤ pytest 직접 재실행 — 모두 통과한 것만 채택.
3 결과 (수치)
3-1. 빌드 회계 (job 5286 COMPLETED, 내 모니터가 raw 로그 직접 read)
| 지표 | 결함-8 (이전) | V3B (e226113) |
| total scenarios | 60 | 80 |
| kept | 4/60 | 80/80 (100%) |
| skip (resolution) | 58 | 0 |
| skip (needs_review) | — | 0 |
| train / val samples | 4 / — | 223 / 15 |
3-2. joint 식별 정확성 (spot-check #4 — byte 대조)
combo_002_L29_S48_0006 RestockBowls_obj1:
| 항목 | eval_spec.json (benchmark GT) | manifest.target_doors |
| fixture.type | cabinet | cabinet ✅ |
| fixture.instance | cab_6_main_group | (cab_6 joint) ✅ |
| joint_names | [cab_6…leftdoorhinge, …rightdoorhinge] | byte-identical ✅ |
| state | (물리 joint 읽음) | closed |
45개 cabinet 중 추측 0. eval_spec 자신의 joint로 타겟 cab_6만 grounding, 나머지 44개는 undetermined no-guess로 정확 분리 (§4c 사양 그대로).
3-3. door step 정확성 (spot-check ×3 — 분해 vs 초기상태)
| # | 케이스 | 초기상태 | emit 결과 |
| 1 | closed multi-instance TARGET cabinet (cab_6, combo_002) | closed | Open the cabinet door → … → Close the cabinet door ✅ |
| 2 | open TARGET freezer/fridge (동 에피소드 MoveFridgeToFreezer) | open | spurious Open 없음, instruction대로 Close만 emit ✅ |
| 3 | combo_012 LoadPreparedFood (다른 env task) | fridge open / dishwasher closed | fridge Open억제+Close / dishwasher Open→Close / 비-타겟 multi cabinet → §7 verbatim (추측 0) ✅ |
3-4. 불변식 / 게이트
baseline sha256 (핸드오프 기록값과 일치 = 불변)
data/scene_mem_v2/train.jsonl 28b4bc75…
data/scene_mem_v2/val.jsonl 37590604…
data/task_subtasks.json 1e1db30d…
data/manual_subtasks.json 9c5bf23c…
pytest tests/test_decomposition_regrounding.py → 15 passed in 1.02s (memer env, 직접 실행)
HEAD = e226113 (--amend/hook-skip 없음, 작업트리 코드 변경 clean)
858 fresh regen → job 5305 RUNNING (n32, target_doors 포함 manifest 산출)
4 Takeaway
Sub-project A 8차 결함 체인 전부 종료. multi-instance cabinet TARGET이 이전엔 데이터셋을 붕괴(4/60)시켰으나, eval_spec joint 기반 정밀 grounding으로 80/80 kept이며 door step이 물리적으로 정확함을 ground-truth 대조로 입증. baseline·HF byte-불변, 깨진 데이터 0. no-silent-wrong 불변식(비-타겟 multi-instance는 추측 대신 §7 verbatim)이 매번 작동.
5 Next
- job 5305(858 fresh regen, target_doors 포함) 완주 대기 → 완료 시 858 full build into
data/scene_mem_v2_oracle (sbm memer; 사전 grep으로 worker-unsafe shellout 0 재확인 — §3-4 교훈)
- before→after 정량화(
scripts/diff_scene_mem_trees.py: door 추가/억제/교정 scenario 수, turn delta, §7-fallback율, needs_review delta) — orchestrator 재카운트
- validator VALID + emit_fine_subtasks 0-divergence + 전 pytest green
- 별도 ckpt 학습(
SMV2_DATA=data/scene_mem_v2_oracle, baseline ckpt 미덮어쓰기) → B1 side-by-side(baseline 88.36% vs oracle) → 사용자 판단으로만 병합·HF additive push