Index
2026-09-10 — Analysis

여섯 전략의 실패는 원인 하나다 — 쓰기 시점의 되돌릴 수 없는 결정

scene_bench | find · restore · resume · routine 통합 메모리 전략 진단 (API 비용 0, 기존 final_results 재분석)

TL;DR

0 / 6
두 칸 이상 이긴 전략
97.5%
tagmem 기권 = 쓰기 실패
0%
검색 실패
.769
담았을 때 tagmem loc
20.6
편당 저장 entry (18청크)
$0
추가 API 비용

1네 가족을 한 장으로 (flash-3.7 · loc / resume_ok / place)

전략find (526)restore (519)resume (161)routine (8)
blind.242.035.056.00
textlog (oracle).479.485.789.875
frames-uniform.571.232.161.625
rf-v3 (MEM-style).448.142.056 → .143v2.875
vis-pure (MemER-style).656.326.211 → .242v2.25
tagmem (ours).557.285.106—

오라클 / 최고 비오라클 비: resume 3.7–6.8배 · restore 1.7배 · find 0.73배(역전) · routine 1.0. 가족마다 요구하는 것이 다르다는 뜻이고, 그 축이 무엇인지가 §3이다.

2실패 분류 — 무너지는 곳 = 쓰기 때 버린 것

전략쓰기 시점의 결정버려지는 것실측 붕괴
textlog"로봇이 한 일만 적는다"안 만진 물체 전부find-distractor .179 < blind .221 · restore-distractor .024
frames-uniform(결정 없음) 균등 N장사건 의미 · 횟수resume .161 · find-multi .066
vis-purekeep / drop 8장선택 못 받은 구간routine 8장 중 4장이 마지막 3초 → .25
rf-v3매 청크 재작성 · 병합반복 · 이전 위치resume .056 = blind · restore .142
tagmem (ours)0–3개만 저장저장 안 된 것기권율 .14–.73 · 8B 최하위
대우(對偶)로도 성립한다. 판단을 요구하지 않는 frames-uniform이 qwen3vl-8b · cosmos-r2-8b · molmo2-8b 세 모델 전부에서 find·restore 비오라클 1위다. 판단을 요구하는 전략(vis-pure의 keep, tagmem의 태깅, rf-v3의 병합)은 모델이 약해지면 같이 무너지고, 그 손실은 되돌릴 수 없다.
이미 측정돼 있으나 논문에서 뺀 대조군. rf-v2(naive append)가 restore에서 rf-v3의 2배(.269 vs .137, 575행), find에서도 .474 vs .442. 같은 입력·같은 채널, 차이는 "누적이냐 재작성이냐" 하나뿐이다.

3축은 두 개다 — 행동 채널과 관찰 채널

가족이 요구하는 것은 행동(내가 뭘, 몇 번 했나)과 관찰(뭐가 어디 있었나, 안 만진 것 포함)의 두 축이다. 증거가 대칭적으로 나온다.

증거행동 채널관찰 채널
온라인 textlog가 정답 카테고리 언급D1(내가 옮김) 31/31 = 100%D2(남이 옮김) 2/52 = 4%
restore 면별 loc — 오라클D① .948D② .031
restore 면별 loc — vis-pureD① .458D② .292

두 채널을 다 가진 전략은 rf-v3 하나다(영상만 보고 방별 인벤토리를 쓴다). 그런데 매 청크 재작성으로 반복과 과거를 지운다. 가족별 수요: find = 관찰 우세 restore = 관찰 + 시간축 resume = 행동 압도 routine = 행동 + 추상화

4신규 A — tagmem 기권은 검색이 아니라 쓰기 실패다

기권한 행마다 (W) 정답을 담은 entry가 애초에 저장됐나 / (R) 저장은 됐는데 검색이 놓쳤나 / (U) 검색까지 됐는데 모델이 안 썼나로 갈랐다. 판정은 entry의 text + tags를 정규화해 GT category+(surface|room) 동시 포함 여부, 검색 결과는 행에 실린 tagmem_diag.retrieved_ids.

모델기권W 쓰기실패R 검색실패U 사용실패
gemini-3.7-flash81 / 589 (13.8%)79 (97.5%)0 (0.0%)2 (2.5%)
molmo2-8b426 / 589 (72.3%)424 (99.5%)1 (0.2%)1 (0.2%)

물체 단위로 봐도 flash 76/81(93.8%) · molmo 422/426(99.1%)에서 GT 카테고리가 그 편 어느 entry에도 없다 — 표현 차이가 아니라 커버리지 문제다(white bowl↔bowl 같은 부분일치는 인정한 판정). 기권행의 90.1% / 98.1%가 정확일치 0히트라 r3 최후폴백까지 발동했고, 그래도 답이 없었다.

인덱스를 고쳐 얻을 것이 없다. R2 모델 태거 · 1-hop 공출현 확장 · 최후 폴백은 이미 다 작동했다. 막힌 곳은 "0–3개만 저장 + 중복·trivia 금지" 게이트 하나다 — 18청크 편에서 저장된 entry가 평균 20.6개(청크당 1.1개)뿐이다.

5신규 B — 쓰기 커버리지 head-to-head

같은 편에서 세 텍스트 메모리가 GT 물체 / (물체+장소) 쌍을 담는 비율. rf-v3·rf-v2는 문장 단위로 잘라 같은 문장 안 동시 출현만 인정했다(한 덩어리 인벤토리의 우연 공출현 배제).

모델kindntagmem 물체/쌍rf-v3 물체/쌍rf-v2 물체/쌍
flash-3.7distractor295.522 / .454.685 / .590.478 / .444
target294.697 / .605.694 / .520.650 / .551
molmo2-8bdistractor295.047 / .041.108 / .010.017 / .007
target294.156 / .085.092 / .010.034 / .003
편당 분량 (flash-3.7): tagmem 20.6 entry · rf-v3 915자 · rf-v2 2,313자 편당 분량 (molmo2-8b): tagmem 23.3 entry · rf-v3 14,918자 · rf-v2 1,580자 ← 길이만 길고 쌍 커버리지 .010
tagmem은 target 커버리지가 rf-v3와 같은데(.697 vs .694) distractor에서만 16pp 뒤진다. 사건 중심으로 쓰기 때문에 "안 만진 물체"가 통째로 빠진다. rf-v3의 우위는 방별 인벤토리를 쓰는 데서 온다 — 그게 관찰 채널이다.

6신규 C — 조건부 loc: 읽기는 멀쩡하다, 쓰기가 굶었다

전략kind커버리지담았을 때 loc못 담았을 때 loc담았을 때 기권
tagmemdistractor.454.769.311.000
tagmemtarget.605.764.336.011
rf-v2distractor.444.710.183.008
rf-v2target.551.722.288.105
rf-v3distractor.590.632.264.155
rf-v3target.520.575.206.294
tagmem의 읽기 변환율이 세 전략 중 최고다(.769 / .764). 태그 entry + LATEST 주석 + 이미지 첨부 구조는 작동하고 있고, 전체 점수 .557을 만든 것은 커버리지 .45–.61이다. "ours"를 버릴 이유가 없다.
반대로 rf-v3는 커버리지 최고(.590)·변환율 최저(.632). 한 덩어리 인벤토리는 정밀하게 읽히지 않는다 — 커버리지와 정밀도가 맞교환된다.

그러나 이 표가 설계에 거는 제약 — 텍스트 전사는 픽셀을 못 이긴다

tagmem 커버리지를 rf-v3 수준(.59)까지 끌어올려도 distractor 기대치는

.769 × .59 + .311 × .41 = .58 vs vis-pure .705 vis-pure와 비기려면 필요한 커버리지 c: .769c + .311(1−c) = .705 → c = .86

커버리지 .86은 "본 것을 거의 다 정확히 받아 적는다"는 뜻이고, molmo2 열이 보여주듯 약한 모델에서는 불가능하다. 반대로 press_button은 픽셀에 아예 흔적이 없다. 따라서 통합 방법은 대칭이 아니라 비대칭이어야 한다 — 행동 채널 = 텍스트(append-only, 카운트 포함) · 관찰 채널 = 이미지(고정률, 축출 없음) · 텍스트는 이미지의 인덱스. "관찰을 텍스트로 전사한다"는 첫 초안은 이 표가 반증했다.

7🔴 정정 — tagmem 쓰기 이미지 축출은 하네스 결함이었다

사용자 지적으로 다시 판 결과, run_eval_v1.py:180이 기본값 IMG_CAP=16을 덮어씁니다 — img_cap=args.cap(find/restore 런의 --cap = 8). image entry가 8장을 넘으면 오래된 것부터 삭제됐고, 두 모델 100/100편이 정확히 8.0장으로 깎였습니다.

전략보관 이미지가 마지막 1/3에 있는 비율편 대비 시간 스팬
tagmem0.810.37
vis-pure0.360.93
frames-uniform0.33 (정의상)1.00
restore의 goal image는 정의상 "옮겨지기 전" 프레임 = 편 전반부입니다. 그 후보가 구조적으로 소각돼 있었습니다.
그리고 순수한 중복이었습니다. 같은 파일 229줄에 읽기 예산이 따로 있습니다 — retrieve(..., budget_img=args.cap) = 8. 질의 컨텍스트의 이미지 수는 어차피 8장으로 강제되므로 공정성은 이미 잡혀 있었고, 쓰기 축출은 "고를 후보를 없애는" 효과만 했습니다. vis-pure의 8장은 MemER 자신의 설계지 예산 제약이 아닙니다.

결론: 현재 논문 표의 tagmem 수치는 과소평가입니다

원인이 하네스이므로(모델 한계가 아니라) 고치는 것이 맞고, 논문에 "tagmem v1 수치는 쓰기 축출 결함 하에서 측정됨" 각주가 필요합니다. 관찰 지시도 권고형(consider one image entry)이라 rf-v3의 명령형 대비 distractor 커버리지가 16pp 뒤집니다(.522 vs .685).

조치 6건 (구현 완료 · 기본값 동작 불변 · pytest tests/eval 151 passed)

1 img_cap=None 쓰기 축출 없음 tagmem.py:ingest_tagmem 2 max_per_chunk=None 청크당 저장 상한 없음 tagmem.py:parse_store_lines 3 prompts/tagmem_v5.txt 관찰 명령형 + n= 회차 슬롯 (신규) 4 fill_images=True 남는 이미지 예산을 시간 균등으로 채움 tagmem.py:retrieve 5 fallback_frames=True 문법 붕괴 청크는 프레임 1장 등록 tagmem.py:ingest_tagmem 6 read_version="v5" IMG <id> 라벨 + PREV-HOP (goal image) tagmem.py:memory_turns_tagmem 게이트: --tagmem-uncapped / --tagmem-write v5 / --tagmem-read v5 (v1 러너) SBENCH_TAGMEM_{WRITE,UNCAPPED,READ} (resume·routine·v3) 전부 기본 off — 기존 수치 재현 가능
앞선 초안 철회. "관찰 채널을 텍스트(SAW:)로 전사하는 청크 로그"는 폐기합니다 — entry 단위 주소지정과 _object_timelines를 버리게 되는데, 그 둘이 각각 변환율 .769의 원천이고 goal image 조회의 메커니즘입니다. 또 "텍스트 전사는 커버리지 .86이 필요"라는 §6의 산술은 순수 텍스트 전략(rf-v2/rf-v3)에만 적용됩니다 — tagmem은 같은 DB에 이미지가 있어 그 상한에 걸리지 않습니다.

8어떤 구조도 못 넘는 한계

press_button — 다른 누름 간 픽셀차 12.5 < 같은 누름 내부 19.8. v2 프롬프트로 보고 적기까지 했는데도("reaching toward its upper door/control area") 3모델 rf-v3·tagmem 전부 .000. 전 100편 최종 메모리에서 반복·개수 표현이 있는 편 0/100.
visit_rooms — 발화에 총 방 수가 없어 오라클도 .419. 유일하게 오라클 상한이 1.0이 아닌 셀.

이 둘은 메모리 구조의 문제가 아니라 매체·데이터의 문제다. 통합 방법의 성능 주장에서 분리해 서술해야 한다.

9Takeaway & Next

Takeaway

Next

재현 (API 0): python3 tmp/diag_unified.py # A. tagmem 기권 3분해 (W/R/U) python3 tmp/diag_coverage.py # B. 쓰기 커버리지 + C. 조건부 loc 원천: final_results/find_v1.0_e987b40f/models/{gemini-3.7-flash,molmo2-8b}/ 로그: claude/260910/analysis-unified_memory_diagnosis.md