target_fine_idx 어긋남 발견·수정 + defect-15 문서화7676aa4b) 직후 사용자 검증: target_fine_idx 8.2%(617/7503 target seg) 어긋남 적발 — defect-14emit_fine_subtasks의 _seg_turn_count가 defect-13 fix에서 count는 door-grounded로 교정했으나 target_fine_idx는 base resolved_target_idx 그대로 → door step 삽입 후 인덱스 어긋남228dc0b45e23, pytest 221 passedbuild_turns_for_test keyframe push가 base 인덱스 참조 → ~8% target seg에 door step이 keyframe으로 잘못 마킹) — pytest.skip + 후속 사이클로 처리 결정
Sub-project A가 공식 종료(Option B 선택, HF additive push 7676aa4b37f3)된 직후,
사용자가 재생성된 fine_subtasks.json의 target_fine_idx가
fine_subtasks 배열 내 target step 위치와 맞지 않는다고 지적했다.
예를 들어 combo_002 RestockBowls의 경우:
door step 삽입(defect-13 fix에서 구현된 door-grounding)이 배열 길이를 늘렸으나
target_fine_idx는 base(door 없는) 인덱스 그대로 남아 있었다.
이는 Sub-project A의 핵심 산출물인 oracle fine_subtasks.json(HF에 공개)에
직접 영향을 미치는 결함이라 즉시 수정이 필요했다.
defect-13 fix(_seg_turn_count가 resolve_subtasks_with_doors를
사용하도록 교정)는 각 segment의 turn count를 door-grounded 값으로 올바르게 바꿨다.
그러나 target_fine_idx 계산은 별도 경로(resolved_target_idx)를
그대로 참조하고 있었다. door step이 target step 앞에 삽입되면 base 인덱스가
door-grounded 배열에서 +1~+n이 되므로 어긋남이 발생한다.
수정 방법: base target step의 문자열(task_subtasks에서
조회한 원본 subtask instruction)을 door-grounded sequence에서 검색해 마지막 발생 위치를
target_fine_idx로 채택. 빌더의 FIFO push 지점(마지막 동일 문자열)과 일치하므로
의미론적으로 올바른 보정이다.
수정 후 신규 회귀 테스트 추가(combo_002 RestockBowls 케이스 포함),
전수 17955 target seg 스캔으로 0 mismatch 확인. pytest 221 passed.
수정된 emit_fine_subtasks.py로 local mirror를 재생성한 후
huggingface_hub upload_folder(allow_patterns: fine_subtasks.json 858 + manifest,
delete_patterns 없음)로 additive 재push. 원본 subtasks.json 858 /
eval_spec.json 858 불변.
build_turns_for_test의 keyframe push 조건:
push = (ai == tgt_idx)에서 ai는 door-grounded sequence 인덱스이나
tgt_idx는 base resolved_target_idx다. door step이 삽입된 경우
ai == tgt_idx가 door step에서 True가 되어 keyframe push가 실제 target step
대신 "Open the cabinet door"에 마킹된다.
test_target_fine_idx_matches_kf_push는 pytest.skip + 이유 명시
(weakening 금지 원칙 준수, fix 시 re-enable).
| 항목 | 수정 전 | 수정 후 |
|---|---|---|
| target_fine_idx 어긋남 (전수 7503 target seg) | 617 (8.2%) | 0 (0%) |
| 전수 스캔 (17955 target seg, 모든 door 포함) | — | 0 mismatch |
| pytest | 221 passed + 1 skip | 221 passed + 1 skip |
| HF fine_subtasks push | 7676aa4b (defect-14 포함) | 228dc0b (fix 반영) |
| HF 원본 subtasks/eval_spec | 858 불변 | 858 불변 |
| 지표 | 영향 여부 | 근거 |
|---|---|---|
| B1 m1 final-query (88.36% / 89.42%) | 무관 | 문자열 매칭, keyframe과 별개 |
| B1 m3 keyframe precision/recall | 영향 있음 | GT의 ~8% target seg에 door step이 keyframe으로 마킹됨 |
| oracle LoRA 학습 데이터 | ~8% 영향 | keyframe push가 door step에 잘못 마킹 (행동 영향 미측정) |
| 재현성 계약 / task_subtasks.json | 무관 | baseline 복원, 안전 golden 221 green |
target_fine_idx 어긋남을 잡지 못했다. 사용자가 재생성된 JSON을 직접 열어 확인한 것이 적발 경로. 외부 산출물(HF public)에 반영되기 직전에 잡은 것이 다행.
빌더 결함은 데이터 전체에 영향을 미치므로 수정 시 full pipeline 재실행(재빌드 → 재학습 → 재평가)이 필요하다. B1 m1 수치(88.36% / 89.42%)는 keyframe과 무관한 문자열 매칭으로 산출되어 현재 결과의 신뢰성은 유지된다. 그러나 oracle LoRA가 ~8% target seg에서 잘못된 keyframe으로 학습된 점은 정직하게 기록하고, 빌더 fix 후 재학습 사이클에서 수치 개선 여부를 측정한다.
build_turns_for_test에서 keyframe push 조건을 door-grounded 인덱스 기반으로 교정SMV2_DATA=data/scene_mem_v2_oracle — baseline 불변emit_fine_subtasks.py(defect-14 fix), test_emit_fine_subtasks.py(defect-15 skip + 회귀 테스트), scripts/eval_scene_mem_benchmark.py(harness fix), memer_eval/scene_mem_trainstruct.py, eval_b1_sharded.sh, analysis/context — 사용자 커밋 지시 대기. data / HF / baseline 백업 byte-불변.