Index
2026-05-21 — Analysis

Defect-14/15 — emit target_fine_idx 어긋남 발견·수정 + defect-15 문서화

memer / Sub-project A 종료 직후 사후 검증 | scene-mem v2 oracle

TL;DR

617
어긋남 target seg (전)
0
mismatch (후, 17955 전수)
8.2%
영향 비율
221
pytest passed
228dc0b
HF re-push commit

1 배경/목적 (왜)

Sub-project A가 공식 종료(Option B 선택, HF additive push 7676aa4b37f3)된 직후, 사용자가 재생성된 fine_subtasks.jsontarget_fine_idxfine_subtasks 배열 내 target step 위치와 맞지 않는다고 지적했다.

예를 들어 combo_002 RestockBowls의 경우:

target_fine_idx = 1 fine_subtasks[1] = "Open the cabinet door" ← 틀림 fine_subtasks[2] = "Place a bowl in the cabinet" ← 실제 target (또는 [4])

door step 삽입(defect-13 fix에서 구현된 door-grounding)이 배열 길이를 늘렸으나 target_fine_idx는 base(door 없는) 인덱스 그대로 남아 있었다. 이는 Sub-project A의 핵심 산출물인 oracle fine_subtasks.json(HF에 공개)에 직접 영향을 미치는 결함이라 즉시 수정이 필요했다.

defect-14 적발 맥락: Sub-project A에서 결함이 13번이나 반복된 패턴과 동일 — 서브에이전트/자동 검증이 못 잡고 사용자 육안 검증이 적발. 이번에도 zero-trust 원칙이 사후 검증 형태로 작동.

2 작업 내용 (어떻게)

defect-14: 원인 분석 및 수정

defect-13 fix(_seg_turn_countresolve_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 지점(마지막 동일 문자열)과 일치하므로 의미론적으로 올바른 보정이다.

# emit_fine_subtasks.py 수정 (핵심) # 기존: target_fine_idx = resolved_target_idx (base 인덱스) # 수정: base target 문자열로 door-grounded sequence에서 마지막 발생 위치 조회 grounded_seq = [step["subtask"] for step in door_grounded_steps] base_target_str = task_subtasks[task][target_idx]["subtask"] # 마지막 발생(builder FIFO push 지점)을 보정 인덱스로 target_fine_idx = len(grounded_seq) - 1 - grounded_seq[::-1].index(base_target_str)

수정 후 신규 회귀 테스트 추가(combo_002 RestockBowls 케이스 포함), 전수 17955 target seg 스캔으로 0 mismatch 확인. pytest 221 passed.

HF additive 재push

수정된 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 불변.

HF commit: 228dc0b45e230cc454352a4bc3add7edd66fa085 repo: Keh0t0/scene-mem-benchmark 독립검증: HF fine_subtasks 858 + manifest PASS SMOKE target_fine_idx byte-identical (combo_002 RestockBowls = 4, 정확)

defect-15: 빌더 keyframe push 잘못된 인덱스 — 문서화 결정

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"에 마킹된다.

사용자 결정 A (defect-15): 현재 사이클에서 빌더 fix → 데이터 재빌드 → oracle LoRA 재학습 → B1 재평가 → HF 재push의 전체 사이클은 별도 진행. test_target_fine_idx_matches_kf_pushpytest.skip + 이유 명시 (weakening 금지 원칙 준수, fix 시 re-enable).
# tests/test_emit_fine_subtasks.py @pytest.mark.skip(reason=( "defect-15: build_turns_for_test uses base resolved_target_idx for kf-push " "instead of door-grounded index. ~8% target segs have door step marked as " "keyframe instead of actual target step. Fix requires builder change → full " "data rebuild → oracle retrain → B1 re-eval → HF re-push (future cycle)." )) def test_target_fine_idx_matches_kf_push(): ...

3 결과 (수치)

defect-14 수정 검증

항목수정 전수정 후
target_fine_idx 어긋남 (전수 7503 target seg)617 (8.2%)0 (0%)
전수 스캔 (17955 target seg, 모든 door 포함)0 mismatch
pytest221 passed + 1 skip221 passed + 1 skip
HF fine_subtasks push7676aa4b (defect-14 포함)228dc0b (fix 반영)
HF 원본 subtasks/eval_spec858 불변858 불변

defect-14 수정 예시 (spot-check)

combo_002 RestockBowls_obj1: door-grounded fine_subtasks: [0] Navigate to the cabinet [1] Pick up a bowl ← base idx=1 (원래 target) [2] Open the cabinet door ← door 삽입 [3] Pick up a bowl ← 반복 (per-object 확장) [4] Place a bowl in cabinet ← 실제 target (마지막 발생) [5] Close the cabinet door ← door 삽입 수정 전 target_fine_idx = 1 ("Pick up a bowl" — 틀림) 수정 후 target_fine_idx = 4 ("Place a bowl in cabinet" — 정확)

defect-15 영향 범위

지표영향 여부근거
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

4 Takeaway

defect-14 패턴: defect-12(harness assert), defect-13(emit count), defect-14(emit index) — 세 결함 모두 동일 뿌리. oracle door-grounding이 배열 길이를 변경한 뒤 관련 모든 인덱스/카운트가 일관되게 교정됐는지 확인이 어렵다는 구조적 문제. Sub-project A에서 14번의 결함이 반복된 이유이기도 하다.
사용자 사후 검증의 가치: 자동화 pytest(221) + 서브에이전트 보고 + zero-trust 게이트도 target_fine_idx 어긋남을 잡지 못했다. 사용자가 재생성된 JSON을 직접 열어 확인한 것이 적발 경로. 외부 산출물(HF public)에 반영되기 직전에 잡은 것이 다행.

defect-15 처리 원칙

빌더 결함은 데이터 전체에 영향을 미치므로 수정 시 full pipeline 재실행(재빌드 → 재학습 → 재평가)이 필요하다. B1 m1 수치(88.36% / 89.42%)는 keyframe과 무관한 문자열 매칭으로 산출되어 현재 결과의 신뢰성은 유지된다. 그러나 oracle LoRA가 ~8% target seg에서 잘못된 keyframe으로 학습된 점은 정직하게 기록하고, 빌더 fix 후 재학습 사이클에서 수치 개선 여부를 측정한다.

5 Next Steps

defect-15 후속 사이클 (사용자 결정 시)

  1. 빌더 fix: build_turns_for_test에서 keyframe push 조건을 door-grounded 인덱스 기반으로 교정
  2. 858 oracle 데이터 재빌드: SMV2_DATA=data/scene_mem_v2_oracle — baseline 불변
  3. oracle LoRA 재학습 (8 GPU, sbm) + eval_loss 비교
  4. B1 side-by-side 재평가: baseline 88.36% 재현 확인 + oracle Δ 측정
  5. HF additive 재push: fine_subtasks(defect-15 fix 반영) + manifest
미커밋 상태: 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-불변.