Index
2026-08-26 ~ 08-27 — Plan / Decision

v1 final 채점 계약 확정 + 비용 산정 + eval job 제출

scene_bench | HF v1 final(find) 수령 후 실측 착수까지의 의사결정 로그

TL;DR

545/545
place_gradable (최종)
39
C 제외 행
$72
flash 6종 실비/100편
4
제출 job (97359/97369→97372/97370)

1 배경 / 목적

전날(260826-hf_dataset_v1_final.html) HF v1 final(find) 데이터를 수령·프로파일링한 결과, queries.jsonl 584행 중 answers의 surface가 null인 답이 88개(13.8%) 있음을 확인했다. 기존 8/21 v1 채점 계약은 이런 케이스를 다루지 않아 — 코드는 크래시 없이 place_gradable=False(room-only 채점)로 조용히 강등시킬 뿐이었다. 이 상태로 전량 측정을 돌리면 place accuracy가 왜곡되므로, surface-None 88답을 무엇으로 채점할지 결정하지 않고는 실측에 착수할 수 없었다. 전날 리포트의 "결정 대기" 항목을 여기서 닫는다.

기존 한계: hidden(닫힌 fixture 안)·on_floor(바닥 낙하)·표면 미라벨이라는 세 가지 원인이 동일하게 surface=None 한 값으로 뭉뚱그려져 있어, 원인별로 분리하지 않으면 올바른 GT를 세울 수 없었다.

2 작업 내용

2-1. surface-None 88답 원인 분해

A 바닥 (14건): room·surface 모두 null, on_floor=True, z 중앙값 0.04 m B hidden (35건, +표면 있는 hidden 8 = 총 43): z 0.29–0.85 m, 전부 candidates[].fixture 존재 (chestofdrawers 21 · stand 9 · desk 9 · shelf 4) C 표면 미라벨 (39건): z 0.30–0.90 m, 20건 misplaced=wrong_surface — 라벨 없는 지지대

2-2. 채점 구현 — 1차: 반점(partial credit)

facts.gt_selections: A는 floor 유지 / B는 candidates[].fixture가 정답 표면(엄격) / C는 surface=None + unlabeled=True 플래그. grading.score_query에 C 반점 규칙 추가 (행 점수 = (표면까지 맞은 답 + 0.5×방만 맞은 C 답)/n_gt, 단 모든 답 충족 + 개수 일치 시에만). query_labels에 concealment(open 541/hidden 43) 축 추가. 회귀 테스트 test_v1_final_grading.py 11개 신설, 기존 98→99 통과.

2-3. 사용자 정정 — 반점 철회, exclusion으로 교체

사용자: "fixture를 정답으로 하자, 미라벨은 그냥 빼자." facts.surface_unlabeled(query)로 C 답 판정 → run_eval_v1.py가 평가 대상에서 C 행을 제거하고 results.json["excluded"]["surface_unlabeled"]에 query_id를 기록. grading.score_query는 이진 채점으로 복귀(반점 코드 삭제), 방어적으로 C 입력 시 place_gradable=False 유지. 회귀 테스트를 반점 2개 → 제외 헬퍼 테스트로 교체, 98개 재통과.

2-4. 비용 산정 — 카나리아 실측 → 예산 반영

8/19 S3 353질의 런(75편) 단가를 results.json에서 재집계 + v1 드리프트 검증용 카나리아 (train_1299__2 1편 6행 × 3 오프라인 전략, flash/sonnet/gpt-5.5) — S3 대비 행당 단가 ±15~23% 이내. GPT 저가형 카나리아(gpt-5-mini $0.032/편, gpt-5.4-mini $0.036/편, gpt-5.4-nano $0.011/편)도 비교해 flash보다 저렴함을 확인. cap 8(이미지 예산)을 기본으로 확정(8/23 실측: cap16→8은 vis-pure −0.15만, frames-uniform만 실제로 저렴해짐).

2-5. 런처 파라미터화 + job 제출

scripts/run_v1_final_shards.sh MODEL TAG N CAP [STRATS] — eval 대상 100편을 N샤드 라운드로빈, 워커 1 job 안에서 N 프로세스(run_eval_v1, 편 단위 체크포인트). 5번째 인자로 전략 subset 지정 가능(파트 분할 제출용, results.json 행 단위 병합).

3 결과 (수치)

place_gradable 커버리지 변화

단계place_gradable비고
8/21 v1 계약 (수정 전)510/584 (87.3%)surface None 88건 전부 room-only 강등
1차: C 반점581/584 (99.5%)B(43)+C(39) 편입, 3행만 room 미유도로 잔류 실격
최종: C 제외545/545 (100%)C 39행 + 방 미유도 3행 함께 평가 세트에서 제거
부작용: 제외가 target 축에 편중(38/39 target, 1/39 distractor) → kind 균형이 293:291 → 255:290으로 이동. 후속 리포트에 명시 필요.

kind × concealment (최종 545행)

구분openhidden합계
find_target22035255
find_distractor2828290

비용 실측 vs 사전 추정

단계flash 6종 / 100편sonnet 4종(p1) / 100편근거
카나리아 사전 추정$45 → $60(cap8 보정)—S3 단가 + 1편 카나리아 외삽
첫 체크포인트 실비$0.717/편 → ≈$72$0.258/편 → ≈$26flash 4편/120행, sonnet p1 8편/168행 실측 집계

초과 원인: v1 편이 v0.7보다 길어 ingest 비용 상승(tagmem $0.128/편·vis-pure $0.179/편·rf-v2 $0.104/편), cap을 16→8로 줄여도 frames-uniform 외 전략은 비용이 줄지 않음(이미 ≤8장 읽던 전략들).

job 제출/재조정 타임라인

job내용상태
97359 v1final_flashflash × 6종, 4샤드, CPU-only, own실행(당일 완료 → 260826-v1final_find_eval.html)
97369 v1final_sonnet_p1sonnet × blind/textlog/frames-uniform/rf-v2취소(예산 초과, 8편 체크포인트 보존)
97372 v1final_sonnet_p1 재예약97369 동일 내용--begin=2026-08-27T21:00 UTC
97370 v1final_sonnet_p2sonnet × vis-pure/tagmem-r3(ingest형)--begin=2026-08-27T21:00 UTC
예산 산수: 당일 합 $1(카나리아)+$72(flash)+$26(sonnet p1 예정) = $99 → 하루 $100 상한 밀착 → p1을 다음날로 미뤄야 p2($43)와 합쳐도 안전.

4 Takeaway

의미

HF 릴리즈가 사전 설계에 없던 축(hidden fixture, on_floor, 표면 미라벨)을 새로 들여왔을 때, 채점 계약을 코드 레벨에서 명시적으로 재정의하지 않으면 "조용한 오채점"(room-only 강등)으로 이어진다. 이번엔 회귀 테스트가 있어 반점→제외라는 하루 두 번의 규칙 변경도 안전하게 반영할 수 있었다. 비용 쪽에서는 카나리아 추정(1편)이 전체(100편) 실비를 과소평가했다(+60%) — v1 편이 v0.7보다 길어진 게 원인이며, 이후 예산 계획(하루 $100 상한)에 직접 영향을 줬다(job 취소·재예약). 이 결정들 없이는 260826-v1final_find_eval.html의 실측(flash 545행, $71.52)이 존재할 수 없었다.

5 Next Steps

미해결 한계

sonnet 결과가 아직 없음(97372/97370, 8/27 21:00 UTC 시작 예정) — 모델 격자(flash × sonnet)를 채우려면 이 결과가 필요. gpt-5.4-mini 등 저가형 후보(6종 ≈$15~18)는 아직 실행 여부 미결.

다음 작업

sonnet p1/p2 완료 후 flash와 동일 스크립트(merge_v1final.py)로 병합 → 모델 격자 표 완성. 논문 표를 S3(v0.7)에서 v1 final 545행 표로 교체하고, hidden/multi 층 표를 신설한다.