Index
2026-09-11 — Engineering

Routine 정식 데이터(dc1c8144) 읽기 평가 준비 — 어댑터 · textlog 수정 · 샤드 스크립트

scene_bench | Routine(type3) 읽기 트랙 하네스 어댑테이션

TL;DR

314
행 / 100편
33
신규 테스트 통과
2/214
누출 (직전 검수와 일치)
≈$38
flash-3.7 견적

1 배경 / 목적

사용자 지시(260912 00:40 KST): "routine is ready. plz check and ready for the eval". 정식 릴리즈는 HF main dc1c8144(09-11 11:55 UTC, 모든 type3 컨텍스트 끝에 테이블 복귀 꼬리를 붙여 질의 이미지 누출을 97/214→2/214로 줄인 버전)이고, 다른 세션이 미디어 39.95GB 수령·전수 검수까지 끝낸 상태였다(claude/260911/analysis-routine_dataset_e02c1f3d.md).

남은 문제: 정식 행이 하네스 입력 규격과 다르다. gt_routine/routine_labels/leak_last_frame이 answers[].holdout/room/surface·axes.k_evidence·leak_objects를 요구하는데 정식 행엔 receptacle_class+instances[](uid)만 있고, meta.json에 방 이름조차 없다. 이대로는 로더가 KeyError로 죽는다.

2 작업 내용

어댑터 — scripts/build_routine_official.py (원본 불변)

읽기 루트 ~/datasets/scene-mem-benchmark-v1_dc1c8144_read/를 신설 — eval/index.json·README·stats.json 사본 + 하네스 필드를 채운 eval/routine/queries.jsonl + contexts/type3/<ctx>/(videos·traj.h5·states·subtasks.json은 symlink, meta.json만 사본).

answers[].holdout = 질의 단어 (subcat → "spray bottle" / "butter knife" / …) answers[].room = 수납처 인스턴스의 방 (uid 접미사 rid → scene card rooms[].type, 바구니는 tasks[].room) answers[].surface = 클래스 표시명 (SideTable→"side table" · TVStand→"tv stand" · ShelvingUnit→"shelf" · Basket→"laundry basket", Sofa는 바디 기준 sofa/armchair) instances = [{room, surface, uid}] (place_any 진단용) surface_uid = 증거 인스턴스 self: tasks[].dst_surface|container → 174/174 ∈ instances observed: stage.O*.dst_surface → 40/40 일치 (헤드라인 GT = "증거 인스턴스", 프로토콜 260907 확정) axes.k_evidence = self n_units_ok / observed 증거 물체 수 leak_objects = 규칙 증거 물체 commands = tasks[].start_frame/utterance multi = evidence_source="mixed" meta.json 추가 필드: rooms {rid: "living room" …} surface_display {uid: 표시명} (집 사실 = scene card, 정답 정보 아님)

textlog 결함 수정 — memory_strategy._surface_word

stand_ 접두 body가 SideTable·TVStand 둘 다에 쓰여 접두사 표시가 "tv stand"로 오기되던 것을, meta.surface_display[uid]를 우선 조회하도록 고쳤다(없으면 기존 접두사 표시로 폴백 → find/restore/resume 바이트 불변). 수정 후 100편 textlog 검사: "tv stand" 0회 · "side table" 135회.

샤드 스크립트

scripts/run_routine_shards.sh(API, run_resume_shards 구조 재사용) · scripts/serve_eval_vllm_routine.sh(오픈, vLLM 동거 서빙). 컨텍스트 목록은 queries.jsonl에서 읽고, 기본 5전략(blind·textlog·frames·rf-v3·vis-pure, 사용자 결정 260907), writer v2 env는 inner_cmd에 직접 박는다.

3 결과 (검증, API $0)

항목결과
어댑터 산출 행 수314행 / 100편 — surface 10종 전부 어휘 안(side table 178·sofa 128·armchair 68·laundry basket 141·dining table 108·shelf 51·desk 48·countertop 10·coffee table 7·tv stand 4)
방 커버리지4종 전부 어휘 안, holdout 단어 22종
k_evidence 분포{1: 91, 2: 113, 3: 89, 4: 21}
evidence_source 분포{self: 234, observed: 40, mixed: 40}
누출 검증load_context + leak_last_frame 100편 관통 — direct 2/214 · multi 2/100 (선행 데이터 검수 수치와 일치 → 집계에서 자동 제외)
테스트run_eval_routine --dry-run 2편 정상, 샤드 스크립트 dry-run 2샤드 정상, tests/eval -k routine 33 passed
비용 견적: 파일럿 v2 writer 단가(청크당 $0.0146) × 정식 청크 합 1,759 + 읽기 1,570행 × $0.0077 기준 — flash-3.7 ≈ $38, luna ≈ $6, 오픈 3종 $0(GPU 1장 각 3~5h). sonnet 보류.

4 Takeaway

의미

Routine은 데이터 확정부터 측정 착수까지 하네스 코드 변경 없이(어댑터 신설 + textlog 표시명 수정만으로) 갈 수 있음을 확인했다. find/restore/resume 세 가족에서 이미 검증된 "어댑터 계층으로 데이터 포맷 변화를 흡수한다" 패턴이 네 번째 가족(routine)에서도 그대로 재현됐다 — 하네스 핵심 로직의 안정성을 보여주는 사례. 이 작업 직후(9/12) flash-3.7·luna·오픈 3종 제출이 이어져 routine_official_grid 5모델 결과로 이어졌다.

5 Next Steps

미해결 한계

armchair/sofa 표기는 GT가 바디 기준이라, 모델이 "sofa"라고 답한 armchair 행은 오답 처리된다 — 발화 자체가 "armchair"라고 말하므로 정합이지만, 결과 해석 시 이 셀을 별도로 확인할 필요가 있다.

다음 작업

사용자 승인 후 flash-3.7·luna·오픈 3종 제출:

sbm "SBENCH_WRITER_PREAMBLE=v2 SBENCH_RF_REWRITE_PROMPT=v3b bash scripts/run_routine_shards.sh gemini-3.7-flash routine_flash37 4 8 all" --gres=gpu:0 -c 8 --mem 48G --time 6:00:00 --qos=own

KST 9/12 버킷 견적: D(힌트) ≈$26 + flash ≈$38 + luna ≈$6 ≈ $70. 격자 생성기(grid_routine.py)·보관소 가족 추가는 결과 도착 후 — 결과는 260914-online_v2seed_rerun.html과 별개로 260907-260913/260912-routine_official_grid.html에 정리됨.