Index
2026-05-16 — Engineering

scene-mem v2 데이터 파이프라인 완성

§7 composite fallback · LLM 게이트 방어 · Full Build 무결성 PASS · HF push — memer

TL;DR

858
Scenarios Kept
95.7%
Fine Turns
0%
Garbage (V2)
0.0066
LoRA eval_loss
74,902
Train Turns

1 배경 / 목적

scene-mem v2는 V1의 핵심 결함(~7% silent garbage 라벨)을 제거하기 위해 재설계한 MemER 학습 데이터 파이프라인이다. V1은 비-target subtask를 regex로 긁어 실패 시 "object"/"counter→counter"로 silent fallback — 51k 학습 턴의 ~7%가 가비지였다.

V1 결함: 51,000 학습 턴 중 ~3,500개가 fabricated 가비지 라벨. silent이라 학습 중 감지 불가.

V2 설계 원칙: silent-wrong 절대 금지, 분해 불가 시 loud-fail. 그러나 초기 구현의 AND-gate("모든 segment가 fully resolved돼야 kept")가 858 scenario 중 696개를 불필요하게 drop하고 있었다 — memory 턴 하나가 irreducible이면 target이 완벽해도 scenario 전체를 버리는 구조.

병목: 초기 V2 빌더-kept = 162/858 (18.9%). V1 2604 sample의 ~1/5 수준 → 학습 신호 부족.

이 세션의 목표: (1) AND-gate를 §7 semantic-aware 정책으로 대체해 858 전부 복구, (2) LLM 보조 분해로 27 irreducible의 품질 검증, (3) full build + 무결성 게이트 통과 후 LoRA 학습 제출, (4) fine_subtasks 통합 artifact HF push.

2 작업 내용

T1 — §7 composite-instruction fallback 구현

핵심 통찰: scene-mem-benchmark의 eval_spec은 TARGET을 항상 fine-resolvable task(21종)로만 질의한다. needs_review/absent를 TARGET으로 두지 않는다. 즉 AND-gate가 막던 696개는 전부 "memory turn이 irreducible"이라는 이유였고, TARGET은 멀쩡했다.

§7 정책 (사용자 승인): MEMORY turn과 TARGET turn을 구분.

TARGET irreducible → 기존 유지 (scenario loud-skip). Pi0.5-grade fine subgoal은 날조 불가. MEMORY irreducible → drop 대신 verbatim segment["instruction"] 단일-step turn emit. (실제 robot 명령 = 100% 충실, composite 입도일 뿐 garbage 아님) fine-resolvable → fine 분해 그대로 유지 (downgrade 금지)

TDD로 구현: 계약 테스트 7개 fail-first → 최소 구현. 핵심 변경: build_scene_mem_v2.py_memory_fallback_subtasks() 신규, AND-gate 전역 제거, TARGET-only loudfail. try/except 0개.

검증 게이트 6종 통과: 301 passed / validator VALID / 5 scenario real-decode smoke (fine 423 banned 0 / fallback 15 byte-identical) / 9 scenario 독립 source 검증 / 결정론 byte-identical

T2 — LLM 보조 분해 tier (27 needs_review 대상)

27 genuinely-irreducible task를 letsur gateway gpt-5.5-pro-2026-04-23로 초안. 4종 TDD 인프라: llm_decompose_{facts,verify,client,run}.py + 13 unit test. 검증 게이트 = 소스-grounding(closed-list, hallucination reject), 비타협 독립 검증.

결과: 17 PASS / 7 INFEASIBLE / 0 REJECT → 독립 적대적 source-faithfulness 리뷰 수행 → 2개 FAITHFUL 판정 → 기존 골든 test_manual_subtasks_v2.py 확인 → ClearSinkSpace + PreheatPot 둘 다 이미 DELIBERATELY_OMITTED (소스 근거 명시) → 1차 리뷰가 놓친 결함을 기존 골든이 차단 → HARD STOP, 전부 revert (무커밋) → ClearSinkSpace 재검토: _get_obj_cfgs에 obj_groups 없음 → {obj} 채울 게 없음 → irreducible 확정 최종: 0/17 머지. 27 전부 §7 verbatim 유지.

데이터-정확성 원칙 실증

LLM 초안 0 머지가 실패가 아니라 성공이다 — 게이트가 가비지를 막았다. 기존에 커밋된 골든 테스트(3단 독립 검증을 통과한 소스-grounded pin)가 신규 3단 검증이 놓친 결함을 포착했다. 데이터-정확성 비타협 원칙의 정면 입증.

T3 — Full Build + 무결성 게이트

CPU sbatch job 3936 (gpu:0 -c16 --mem 64G --qos=extra), 8 workers. 무결성 게이트 tmp/scene_mem_v2_integrity.py: 빌더 loud-fail 불신, primary scene-mem 소스에서 재도출. cross-reference = current_subtask이 clean fine step이거나 소스 segment["instruction"]과 byte-동일해야만 PASS (V1 fabricated 가비지는 소스에 없어 탈락).

T4 — fine_subtasks 통합 artifact + HF push

emit_fine_subtasks.py로 학습 JSONL에서 직접 재구성(byte-identical by construction). 1차 구현이 self-test false PASS(같은 결함끼리 비교)였으나 orchestrator가 실 JSONL 대조로 적발 → Option B fix (commit 9afe8bd) → 100 scenario / 321 test 0 divergence PASS.

3 결과

§7 Fallback — 데이터 복구

구분Kept상세
all-fine (fallback 미사용)162기존 162와 동일 — zero regression
≥1 verbatim-memory-fallback696새로 복구된 scenario
dropped (TARGET irreducible)0eval_spec TARGET이 21종 fine-resolvable만 사용
총 kept858 / 858AND-gate가 유일한 병목이었음 확인

Full Build 무결성 (job 3936, 2h18m50s)

Scenarios
858 / 858
Train / Val
2604 / 189
Total Turns
74,902
Fine Turns
95.7%
Verbatim Fallback
4.3%
Garbage
0%
무결성 게이트V1V2
Garbage turns (silent wrong)~7%0%
Missing images-0
Brace leak / banned-not-verbatim-0
Image dimensions (320×360)-100%
Target turn verbatim (forbidden)-0
Data volume (train/val)2604 / 1892604 / 189
핵심 성과: V1과 동일한 데이터 볼륨(2604/189)에서 V1 ~7% silent 가비지 → V2 0%. "정확성 vs 커버리지" 트레이드오프 없음 — §7 fallback이 둘 다 달성.

LoRA Training (job 3993)

QOS: core-own (non-preemptible, 최고우선) Resources: 8 GPU / 64 CPU / 1600G / 24h node: n6 Checkpoint: runs/ckpts/scene_mem_v2_lora_260516_125653/v0-20260516-125746/checkpoint-123 eval_loss: 0.0066 (V1 tier3b 대비 6.5× 낮음)

HF Push (scene-mem-benchmark)

Repository: Keh0t0/scene-mem-benchmark (private) Commit: ecebbadf Files: 7727 → 8586 (+859: fine_subtasks.json × 858 + manifest) 기존 파일(subtasks.json / eval_spec.json / videos) 불변 (additive only)
단일 진실 원천 보장: fine_subtasks.json은 학습 JSONL에서 byte-identical 재구성. 1차 self-test false PASS를 독립 검증이 잡아 수정 후 321 test / 0 divergence 확인.

4 Takeaway

§7 fallback이 설계를 구원했다

핵심 데이터 사실: scene-mem 벤치마크는 TARGET을 항상 fine-resolvable task로만 질의한다. 이 구조적 속성을 발견하자 AND-gate 제거가 자명해졌다 — 858 전체를 살리면서 TARGET 품질은 100% 유지. "696개는 memory turn 하나 때문에 버려지고 있었다"는 정량 확인이 설계 전환의 근거였다.

LLM 게이트 = 빈 손이 아니라 성공

gpt-5.5-pro 초안 0 머지는 LLM의 한계가 아니라 검증 파이프라인이 올바르게 작동한 것이다. 3단 독립 검증이 놓친 결함을 기존 골든 테스트(test_manual_subtasks_v2.py)가 잡았다 — DELIBERATELY_OMITTED pin이 hallucination을 막은 구체적 사례. 이 원칙(에이전트/LLM self-report 불신, primary source 직접 대조)은 B1 eval에도 그대로 적용됐다.

V1→V2의 정량적 가치: 동일 볼륨 2604/189에서 7% 가비지 → 0%, 95.7% 검증된 fine label. Pi0.5 cascade에 먹이는 학습 신호의 질이 근본적으로 개선됐다.

5 Next Steps

B1 → B2: Pi0.5 cascade

B1 offline eval (88.4% m1, 97.2% chunked) 완료. 다음 단계는 사용자의 Pi0.5 V2 fine 재학습 후 B2 cascade — 진짜 memory_success를 robocasa sim에서 측정. MemER subgoal → Pi0.5 low-level policy 전달 채널이 목표.

4.3% verbatim fallback memory turn 영향 분석

가설: fallback memory turn(composite 입도)이 fine turn보다 memory recall 신호가 약할 수 있다. B1 결과(chunked 97.2%, notchunked 77.1%)에서 fallback-memory scenario vs all-fine scenario를 분해 비교해 검증 예정.

27 needs_review — 현황 고정

letsur 키 한도 소진으로 3개 미처리. 단, sibling 분석상 genuinely irreducible로 예상되며 §7 verbatim이 충실하게 커버하므로 재시도 저우선. primary source 재검토 후 irreducible 확정 시 test_*_deliberately_omitted pin 추가 권장.