Index
2026-08-22 — Analysis

실행 SR 채점 규칙 변경 — 바닥에 떨어진 답은 reach-only

scene_bench | commit 76a8e6e

TL;DR

+0.011
oracle-loc Δ
30
바닥 층 n
15
신규 테스트
1,216
재집계 플랜

1 배경 / 목적

온라인 v5 bowls 질의(val_379__0, "Pick up all the bowls I moved earlier")의 두 번째 bowl은 컨텍스트 중 로봇이 "가다 떨어뜨린" 물체로 바닥에 놓여 있다(on_floor: true, z=0.08). 데이터셋(v0.7)은 질의 상단에 scoring: lifted·pickable: true를 붙여 두 물체 모두 "들어야 성공"으로 명세하지만, 재생 트랙에서 oracle(정답 위치, 접근 0.46m)과 textlog 둘 다 이 bowl을 2회 × 600스텝 실패했다.

사용자 판단(260822): "떨어져 있는 건 reach-only로 하는 게 맞다. 안 하면 무조건 fail이다." — 데이터가 형식적으로는 pick을 요구해도, 정책이 구조적으로 못 드는 바닥 물체를 계속 fail 처리하면 실행 SR이 메모리 신호가 아니라 조작 정책의 한계를 재는 지표로 오염된다. 마침 v1 데이터셋(다른 세션에서 생성)도 답별로 scoring: pick | navigate_only를 명세하고 있어, 이 계약에 v0.7도 맞추기로 했다.

기존 한계: 바닥 물체를 pickable로 표시해 둔 v0.7 계약이, 정책이 실제로 들 수 없는 물체를 "메모리 실패"와 구분 없이 실행 SR에 섞고 있었다.

2 작업 내용

단일 판정 소스를 질의 단위에서 답 단위로 내렸다 (commit 76a8e6e).

plans.answer_scoring(a, q): 1. 질의 상단 reached_only → 전 답 navigate_only 2. 답 자체 scoring (v1: pick/navigate_only, 옛 lifted/reached_only 매핑) 3. on_floor 또는 misplaced == "on_floor" → navigate_only ← 신규 4. 그 외 → pick aggregate._final: 답별 판정을 단일 소스로 - pick 답 = lifted 필요 - navigate_only 답 = lifted 또는 reached 중 하나로 충족 - multi 질의 = 전 답 충족, single = 하나 이상 옛 "전부 lift" 규칙은 sr_c_strict로 별도 병기(층별)

Stage C(재생 실행)는 navigate_only 답을 pick 시도 대상에서 제외한다. 온라인 트랙은 navigate 도착 시 GT 원위치까지의 거리로 답별 reached를 판정(online_success(answer_scoring=, reached_gt=))하도록 확장하고, 행에 success_strict / reached_gt / answer_scoring을 함께 기록해 두 방식을 비교할 수 있게 했다.

테스트 15개 추가(exec 스위트 103개 통과)로 회귀를 막고, 플랜 파일을 전량 재생성했다(tmp/exec_plans, 1,216 플랜·3,883 셀·id 동일 — scoring lifted 938 / reached_only 278, navigate_only 답 포함 플랜 284건, pick+floor 혼합 6건). 재생 트랙은 재실행 없이 기존 결과를 새 규칙으로 재집계만 했다(tmp/exec_summary, 옛 집계는 tmp/exec_summary_strict_backup_260822로 백업).

3 결과 (수치)

옛 SR_C새 SR_C (바닥=reach)Δ바닥 층(n=30) 옛→새
oracle-loc0.6470.658+0.0110.80→0.93
vis-pure@flash0.4770.47700.30→0.30
frames-uniform@flash0.4540.463+0.0090.40→0.43
textlog@flash0.2900.296+0.0060.33→0.40
rollforward-v2@flash0.1670.175+0.0090.27→0.30
그 외 (sonnet 셀·blind)Δ 0~+0.006

순위는 불변이다. 영향이 작은 이유: 바닥 답은 대부분 도달하면 이미 들려 있었고(바닥 pick의 P(lift|reached)가 높음), 애초에 바닥 답의 절대 수 자체가 적다(질의 353건 중 바닥 층은 30건).

온라인 v5 재판정: bowls 질의 = bowl#1 lifted + bowl#2 도달 0.70m(카운터탑 접근 포즈) → 새 규칙에서 (옛 규칙에서는 ✗) → v5 최종 2/3(remote ✓, spatulas ✗ 조기 done). HTML 260822-online_first3_v5_turns.html TL;DR에 답별 채점 병기, 재생 리포트 260821-e2e_exec_sr_results.html 격자에도 (all-lift) 값을 병기했다.

핵심 발견: 답 단위 채점으로 바꿔도 순위·전반적 SR은 거의 그대로다 — 즉 이전 규칙이 크게 왜곡한 것은 아니었고, 이번 변경은 "바닥에 떨어진 물체를 기억해서 접근하는가"라는 벤치마크 취지에 더 가깝게 정의를 다듬은 것에 가깝다.

4 Takeaway

의미

"무엇을 성공으로 볼지"는 데이터가 정하지만, 데이터가 pickable로 표시해도 정책이 구조적으로 못 드는 바닥 물체를 pick 기준으로 채점하면 실행 SR이 정책 한계로 오염된다. 답별 채점(바닥=도달)은 메모리 벤치마크가 재고자 하는 "어디 있는지 기억하는가"에 더 가깝고, 옛 값은 sr_c_strict로 남겨 비교 가능성을 유지했다.

5 Next Steps

미해결 한계

바닥 이외에 "구조적으로 못 드는" 답(예: 높은 선반)은 아직 이 규칙이 다루지 않는다 — v1 데이터셋의 pick_fail → navigate_only 강등 계약으로 전환하면 자동으로 흡수될 예정.

다음 실험

온라인 spatulas류의 조기 done(허위 완료 주장)이 남은 온라인 손실 축이다 — false-claim 지표를 추가하고, 1차 셀 실행(80질의 × {textlog, vis-pure, blind} × flash) 여부는 사용자 결정 대기.