navigate(room) 추가 → "그 방으로 돌아가 다시 인식하고 행동" — 실제 배포 흐름과 일치done_mode="vlm"로 에이전트가 이미지로 판정, 물리 predicate는 채점에만 사용| # | 누출 | 코드 근거 | 배포 환경에 존재? |
|---|---|---|---|
| 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이 결정론적으로 문장 합성 | ✗ |
기준은 하나다 — 실제 로봇이 배포 환경에서 그 신호를 가질 수 있는가. 원시 능력 단위로 고정한다.
| 원시 능력 | 판정 | 근거 |
|---|---|---|
| 현재 방 인벤토리 (여기·지금 보이는 물체) | 허용 | 지각 모듈의 추상화. 공리 A3(메모리/제어 분리) — 제어 그라운딩은 주고 메모리만 측정 |
| 현재 방 라벨 | 허용 | SLAM/토폴로지 맵 노드에 해당 (§6 리스크 2 참조) |
| 자기가 명령한 skill·대상 | 허용 | 에이전트가 스스로 아는 사실 |
| 서브골 중 캡처된 프레임 (exo/wrist) | 허용 | 로봇 자신의 카메라 관측 (orchestrator.py:366-379에서 이미 보유) |
| 전역 인벤토리 룩업 | 금지 | L1 |
| oracle 성공/실패 | 금지 | L2 |
| 하네스가 합성한 이벤트 문장 | 금지 | L3 |
경계 판단: 관측 시점에 현재 방 인벤토리에 있던 물체의 id를 에이전트가 노트에 적는 것은 허용(within-exposure — 자기 인터페이스가 그때 보여준 것). 단 선별·기술의 책임은 에이전트에게 있고, §3의 navigate(room)로 이 의존 자체를 줄이는 것을 기본 경로로 한다.
eval 쪽 rollforward.ingest()의 루프 바디(청크당 1콜 + notes 이월)와 read(notes_memory_turns)를 재사용한다 — 오프라인 의존성은 "청크가 어디서 오는가"뿐이고, 온라인에서는 세그먼트 = 서브골로 1:1 대응한다. 역방향 import 금지 원칙에 따라 포맷/프롬프트는 sbench_online에 로컬 복제.
성공/실패를 메모리에 넣으려면 에이전트가 이미지로 판정해야 한다. 기존 done_mode="vlm" 경로(planner.py:51, :208)가 이를 이미 구현하므로 배포형 arm은 이 모드를 강제한다. 물리 predicate는 채점에만 쓴다.
navigate(room)실제 로봇은 UID를 기억하지 않는다. 장소로 돌아가 다시 인식하는 경로를 만들면 UID 특권이 사라진다. 방 라벨·방별 물체는 snapshot()의 room 필드와 robot_room()(inventory.py:57-87)로 이미 확보돼 있고, nav0는 방 앵커로 텔레포트하면 된다.
| arm | 메모리 | 역할 |
|---|---|---|
| blind | 없음 | 하한 (chance 확인) |
| notes (배포형) | 에이전트 자필 노트 | 측정 대상 |
| frames (배포형, 2순위) | 보관 프레임 재열람 | 기록 매체 비교 |
| textlog-oracle | 하네스 GT 로그 | 상한 (공리 A2 게이트) |
| 항목 | 설계 | 출처 |
|---|---|---|
| 지표 | 2축 분리 — ① object-id-match(무엇을 아는가) ② procedure-match(절차가 맞는가) | N9 리뷰 채택. strict 단일 지표는 절차 축의 특수해였다 |
| 시나리오 필터 | 타깃 카테고리가 로봇 현재 방에 중복되면 제외 (없으면 메모리 없이 풀림) | 공리 A1 — N9에서 실증 후 resolve_scenario에 구현됨 |
| staleness | 모든 베이스 이동을 관측 기반 기록 + 노트에 시점 표기 강제. 잔여 오류는 측정값으로 보고 | N9 M2 (복귀 미기록 → 위치 오추론). C분류 Restoring의 예고편 |
| 표본 | arm당 ≥3, 씬 2곳 이상 | n=1/셀 한계 반복 지적 |
| 항목 | 값 |
|---|---|
| 노트 ingest | 1콜/서브골, ~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 미노출 |
| M2 | navigate(room) — 스키마 · nav0 앵커 · 가드레일 |
| M3 | 배포형 규약 강제: done_mode=vlm, 메모리 합성 경로에서 전역 룩업 제거 |
| M4 | 4-arm 데모 (n≥3) + 2축 채점 — 우선 decision-only, 이후 VLA 결합 |
| M5 | 리포트 (노트 원문 인용, arm 비교, 실패 사례 다건) |
| # | 리스크 | 대응 |
|---|---|---|
| 1 | 노트 품질이 곧 성능 — write-phase 오인식이 지배 병목일 가능성 (eval 파일럿 실증) | arm에 모델 축(flash vs sonnet) 추가 검토 |
| 2 | room 라벨 허용의 타당성 — 노트가 라벨에 과의존하면 "시각 기억"이 아니라 "라벨 기억"이 됨 | 1차는 허용(SLAM 노드 비유), 2차 라운드에서 ablation (라벨 금지 + 시각 묘사만) |
| 3 | within-exposure UID 기록 — 완전 차단은 아님 | navigate(room)로 의존도 감소. 필요시 UID 문자열 금지 arm 추가 |
| 4 | staleness가 서브골 수에 비례해 악화 | 시점 표기 + 이동 전량 기록. 잔여는 측정·보고 |
이번 교정의 본질은 "메모리 전략을 바꾸는 것"이 아니라 측정의 주체를 하네스에서 에이전트로 되돌리는 것이다. 배선(N9)은 이미 서 있으므로 교체 비용은 작고(어댑터 수준, 재설계 필요 전략 0개), 대신 결과의 의미가 완전히 달라진다 — 지금까지는 "우리가 써준 로그를 읽는가"를 쟀고, 앞으로는 "스스로 본 것을 남겨 나중에 쓰는가"를 잰다. 그게 이 벤치마크가 원래 재려던 것이다.