build_scene_mem_v2.py resolver _try_build에 doorless/non-target rds 억제 TDD 구현 — defect-9(over-skip 577/858), defect-10(A2 target grounding 파괴), defect-11(doorless over-skip 129) 세 결함 동시 해소. commit ef0fcd5. job 5475 kept 858/858(baseline parity). §9-2 정량화: train 2604 중 1946(75%) records에 grounded Open ADDED = 사용자 영상 버그(닫힌 fixture 앞 Open 누락) 수정 전반 입증. Oracle LoRA 학습 완료: eval_loss 0.0087.
이전 세션(260519-defect9_a2_defect10.html)에서 defect-9(858 full build가 577/858만 kept, SortingCleanup 152 + FoodCleanup 129 over-skip), defect-10(A2 fix가 RestockBowls TARGET cabinet door step을 소멸시킴)이 발견됐고, "A2 revert + resolver _try_build 수정이 올바른 fix"까지 결론됐다.
본 세션에서는 해당 fix를 실제 TDD로 구현하고, 이 과정에서 새로 발견된 defect-11(doorless opencabinet TARGET 129 over-skip)까지 포함해 세 결함을 동시에 해소한다. 858/858 게이트를 통과해야만 §9-4 oracle LoRA 학습과 B1 side-by-side를 진행할 수 있다.
_test_target_fixture_noun(test): eval_spec fixture.type(_→ 정규화)로 이 test가 질의하는 타겟 fixture 명사 반환resolve_subtasks_with_doors per-req 분기: 단일 RuntimeError raise → 세 분기
is_target ∧ target_doors-covered → 유지 (combo_002/005/024/035_bowl 보존)is_target ∧ noun ≠ 이 test 타겟 fixture → 억제(composite-내부 비-target, no-guess)_ManifestCoverageGap raise (§7 fallback 타겟)_try_build: skip 조건에 and missing_noun == _test_target_fixture_noun(test) 추가 — 타겟 자신 door ungroundable일 때만 honest skip5417 job(729/858 kept) 모니터링 결과 FoodCleanup 129 여전히 skip. 근본원인: eval_spec fixture.joint_names=[](opencabinet, 문 없음) → oracle target_doors 미생성 → generic rds("cabinet door") 비적용인데 _try_build가 "타겟 자신 door ungroundable"로 over-skip.
초안 헬퍼(not .get("joint_names"))가 기존 golden test_target_manifest_absent_noun_returns_runtime_error(joint_names 키 없음 = unknown) 깨뜨림 → golden 무수정, 헬퍼 엄격화로 근본정정.
| 측정 항목 | defect-9 후(5317) | resolver fix(5417) | +defect-11 fix(5475) |
|---|---|---|---|
| kept | 577/858 (67.2%) | 729/858 (85%) | 858/858 (100%) |
| skip_res | 281 | 129 (FoodCleanup만 잔존) | 0 |
| train / val | 1680 / 118 | 2244 / ~157 | 2604 / 189 (baseline 정확 일치) |
| baseline byte-safe | ✅ | ✅ | ✅ |
| 항목 | 수치 | 해석 |
|---|---|---|
| Open ADDED ≥1 | 1946 / 2604 (75%) | 닫힌 fixture 누락 Open 복구 |
| Open REMOVED ≥1 | 746 | 이미-open / ungroundable / doorless 억제 |
| net door: train | 9191 → 9230 (+39) | baseline→oracle 순증가 |
| net door: val | 621 → 633 (+12) | 동형 |
| turns delta | 69848 → 65722 (−4126) | DoorStateMachine 중복 Close 통합 (설계 동작) |
validator oracle task_subtasks: VALID (162 tasks, 27 needs_review). 전 관련 pytest 382 passed, 1 skipped. commit ef0fcd5 — 5파일(코드+테스트+분석/context), data 불변.
| 항목 | oracle (job 5571) | baseline (260516) |
|---|---|---|
| eval_loss | 0.00868 | 0.0066 |
| token_acc | 0.9976 | ~0.998 |
| 학습 시간 | 43분, 3 epoch | ~유사 |
| checkpoint | runs/ckpts/scene_mem_v2_oracle_lora_260519_091016/checkpoint-123 | 별도 보존 |
| baseline ckpt 영향 | 없음 (SMV2_DATA override + 별도 OUTPUT_DIR) | |
Sub-project A 데이터 파이프라인 acceptance 게이트 통과. defect-9(붕괴 577)·10(A2-kill grounding)·11(doorless over-skip) = 한 뿌리(multi-instance cabinet 추측불가)의 세 양상이 resolver 라우팅 정밀화로 동시 해소됐다.
80-scenario 게이트가 front-loaded combo_002/012 표본만 커버해 후반 클러스터 회귀(SortingCleanup/FoodCleanup)를 놓침. 858-scale spot-check가 결정적 게이트. 이후 게이트는 반드시 broad 858-scale 재카운트를 포함해야 함.
데이터 1946/2604(75%)에 grounded Open이 추가됐다는 것은 "수치가 올랐다"가 아니라 물리적으로 잘못된 학습 데이터를 고쳤다는 의미. B1 m1 점수 변화와 무관하게 데이터 정확성 향상이 목표의 본질.
task_subtasks.json/init_state_manifest 배선 필요 (defect-12 = per-turn assert가 구조-divergent oracle 차단 → 별도 카드)