Index
2026-08-18 — Design (N12 준비)

배포형 메모리 재설계 — 자필 노트로 전환

scene_bench | 현행 textlog의 GT 누출 진단 → 배포 가능성 계약 → 신설계 · 측정 · 구현 계획

TL;DR

3
GT 누출 지점
0
재설계 필요 전략 (전부 어댑터)
8.6초
노트 1콜 (실측)
+$0.03
4-서브골 에피소드 추가비
4
arm (blind/notes/frames/oracle)

1 문제 — 무엇이 GT였나

#누출코드 근거배포 환경에 존재?
L1메모리 문장의 category·room이 전역 씬 메타데이터에서 옴orchestrator.py:286-288 — by_id는 room-scope를 받지 않는 GLOBAL 룩업. 주석도 "room-scope로 제한된 프롬프트 인벤토리와 무관하게" 기록한다고 명시✗
L2성공/실패가 oracle physics predicate_textlog_line(decision, ok, ...)의 ok (orchestrator.py:183-197)✗
L3하네스가 기록 주체 — 무엇을·얼마나 정확히 적을지 에이전트 무관여_textlog_line이 결정론적으로 문장 합성✗
치명성: 기억의 어려운 부분 — 관측에서 무엇을 건질지 고르고, 오인 없이 적고, 나중에 쓸 수 있게 남기는 것 — 을 전부 시뮬레이터가 대행했다. 남는 측정은 "모델이 우리가 써준 로그를 읽을 수 있는가"뿐이다.
N9가 여전히 유효한 부분: 주입 경로(memory_text 관통), room-scope 인벤토리 + 전역 가드레일 비대칭, 시나리오 필터(공리 A1 실증), 2축 지표 제안, blind의 실패 모드(기권 아닌 확신 오답) — 배선·설계 자산은 그대로 이월된다.

2 배포 가능성 계약

기준은 하나다 — 실제 로봇이 배포 환경에서 그 신호를 가질 수 있는가. 원시 능력 단위로 고정한다.

원시 능력판정근거
현재 방 인벤토리 (여기·지금 보이는 물체)허용지각 모듈의 추상화. 공리 A3(메모리/제어 분리) — 제어 그라운딩은 주고 메모리만 측정
현재 방 라벨허용SLAM/토폴로지 맵 노드에 해당 (§6 리스크 2 참조)
자기가 명령한 skill·대상허용에이전트가 스스로 아는 사실
서브골 중 캡처된 프레임 (exo/wrist)허용로봇 자신의 카메라 관측 (orchestrator.py:366-379에서 이미 보유)
전역 인벤토리 룩업금지L1
oracle 성공/실패금지L2
하네스가 합성한 이벤트 문장금지L3

경계 판단: 관측 시점에 현재 방 인벤토리에 있던 물체의 id를 에이전트가 노트에 적는 것은 허용(within-exposure — 자기 인터페이스가 그때 보여준 것). 단 선별·기술의 책임은 에이전트에게 있고, §3의 navigate(room)로 이 의존 자체를 줄이는 것을 기본 경로로 한다.

3 신설계

3.1 Writer — 서브골 경계마다 에이전트가 쓴다

[서브골 k 실행 종료] 입력: 이번 서브골의 캡처 프레임 N장(exo+wrist) + 지금까지의 노트 + 자기가 내린 결정 → VLM 1콜 → 갱신된 노트 (관측 요약 + 불확실 표기) 금지: 전역 인벤토리 룩업, oracle ok

eval 쪽 rollforward.ingest()의 루프 바디(청크당 1콜 + notes 이월)와 read(notes_memory_turns)를 재사용한다 — 오프라인 의존성은 "청크가 어디서 오는가"뿐이고, 온라인에서는 세그먼트 = 서브골로 1:1 대응한다. 역방향 import 금지 원칙에 따라 포맷/프롬프트는 sbench_online에 로컬 복제.

3.2 Outcome — 오라클 차단

성공/실패를 메모리에 넣으려면 에이전트가 이미지로 판정해야 한다. 기존 done_mode="vlm" 경로(planner.py:51, :208)가 이를 이미 구현하므로 배포형 arm은 이 모드를 강제한다. 물리 predicate는 채점에만 쓴다.

3.3 Grounding — navigate(room)

"TV 있던 방에서 상자를 봤다" (노트) → navigate(room=R) → 도착 → 그 방 인벤토리가 UID를 다시 노출 → pick_and_place(UID, ...)

실제 로봇은 UID를 기억하지 않는다. 장소로 돌아가 다시 인식하는 경로를 만들면 UID 특권이 사라진다. 방 라벨·방별 물체는 snapshot()의 room 필드와 robot_room()(inventory.py:57-87)로 이미 확보돼 있고, nav0는 방 앵커로 텔레포트하면 된다.

3.4 Arms — 샌드위치

arm메모리역할
blind없음하한 (chance 확인)
notes (배포형)에이전트 자필 노트측정 대상
frames (배포형, 2순위)보관 프레임 재열람기록 매체 비교
textlog-oracle하네스 GT 로그상한 (공리 A2 게이트)
해석 규칙: blind ≤ notes ≤ textlog가 성립해야 정상. notes ≈ textlog면 과제가 너무 쉽거나 누출이 남은 것이고, notes ≈ blind면 write-phase(관측→기록)가 병목이다 — eval 파일럿에서 flash가 bowl을 "potted plant"로 오기록해 기권한 사례가 그 전형.

4 측정 설계

항목설계출처
지표2축 분리 — ① object-id-match(무엇을 아는가) ② procedure-match(절차가 맞는가)N9 리뷰 채택. strict 단일 지표는 절차 축의 특수해였다
시나리오 필터타깃 카테고리가 로봇 현재 방에 중복되면 제외 (없으면 메모리 없이 풀림)공리 A1 — N9에서 실증 후 resolve_scenario에 구현됨
staleness모든 베이스 이동을 관측 기반 기록 + 노트에 시점 표기 강제. 잔여 오류는 측정값으로 보고N9 M2 (복귀 미기록 → 위치 오추론). C분류 Restoring의 예고편
표본arm당 ≥3, 씬 2곳 이상n=1/셀 한계 반복 지적

5 비용 · 구현 계획

항목값
노트 ingest1콜/서브골, ~8.6초 (eval 파일럿 실측)
4-서브골 에피소드+~34초, +$0.02~0.03
textlog·frames arm추가 콜 0
4-arm × n3 데모 총계노트 콜 ~48회 (~7분, ~$0.3)

병렬화 불가 — 다음 planner 콜 전에 노트가 갱신돼야 하므로 온라인 루프의 고정 비용으로 수용.

단계내용
M1--memory notes writer (프레임+노트→VLM 1콜), 포맷 로컬 복제, oracle 미노출
M2navigate(room) — 스키마 · nav0 앵커 · 가드레일
M3배포형 규약 강제: done_mode=vlm, 메모리 합성 경로에서 전역 룩업 제거
M44-arm 데모 (n≥3) + 2축 채점 — 우선 decision-only, 이후 VLA 결합
M5리포트 (노트 원문 인용, arm 비교, 실패 사례 다건)

6 리스크 · 미결정

#리스크대응
1노트 품질이 곧 성능 — write-phase 오인식이 지배 병목일 가능성 (eval 파일럿 실증)arm에 모델 축(flash vs sonnet) 추가 검토
2room 라벨 허용의 타당성 — 노트가 라벨에 과의존하면 "시각 기억"이 아니라 "라벨 기억"이 됨1차는 허용(SLAM 노드 비유), 2차 라운드에서 ablation (라벨 금지 + 시각 묘사만)
3within-exposure UID 기록 — 완전 차단은 아님navigate(room)로 의존도 감소. 필요시 UID 문자열 금지 arm 추가
4staleness가 서브골 수에 비례해 악화시점 표기 + 이동 전량 기록. 잔여는 측정·보고

판단

이번 교정의 본질은 "메모리 전략을 바꾸는 것"이 아니라 측정의 주체를 하네스에서 에이전트로 되돌리는 것이다. 배선(N9)은 이미 서 있으므로 교체 비용은 작고(어댑터 수준, 재설계 필요 전략 0개), 대신 결과의 의미가 완전히 달라진다 — 지금까지는 "우리가 써준 로그를 읽는가"를 쟀고, 앞으로는 "스스로 본 것을 남겨 나중에 쓰는가"를 잰다. 그게 이 벤치마크가 원래 재려던 것이다.