Grok Build · Memory Engineering

Dream의 실제 메커니즘

Dream은 최근 세션 로그와 기존 MEMORY.md를 합쳐 장기 기억을 형성합니다. 세션 종료, 선택적 주기 확인, 또는 수동 명령으로 진입하며, 게이팅과 최선 노력 잠금의 공동 제약을 받습니다.

학습 목표

Dream의 트리거부터 인덱스 재구성까지의 전체 체인을 이해하고, DreamGate, 멱등성 요건, 잠금 경합, 쓰기 실패 롤백이 각각 어떤 문제를 해결하는지 설명할 수 있습니다.

TEACHING DIAGRAM

Dream 상태 머신

아래 다이어그램은 교육용 시각 자료입니다. 노드 이름은 소스 코드에서 가져왔으며, 레이아웃과 설명은 교육 목적으로 재구성되었습니다.

Dream 진입점부터 인덱스 동기화까지의 흐름 진입점이 세 개의 게이트를 통과한 후 메시지를 구성하고, 모델을 호출하며, 잠금을 획득하고, 메모리를 기록한 다음 정리하고 인덱스를 동기화합니다. 진입점end / timer / slash DreamGateenabled / hours / sessions build message32K input cap model call30 min timeout try_acquirebest effort lock write MEMORYfailure → rollback cleanup + indexonly deleted stems
진입점 및 게이팅

1. 구성 게이트

MemoryDreamConfig.enabled는 기본값이 true입니다. 하위 Agent 세션은 Dream을 완전히 건너뜁니다.

2. 시간 게이트

min_hours의 기본값은 4입니다. 잠금 파일의 mtime이 마지막 성공적인 consolidation 시간을 기록합니다.

3. 세션 게이트

min_sessions의 기본값은 3입니다. 마지막 consolidation 이후 수정된 세션 Markdown을 카운트하되, 현재 세션은 제외합니다.

트리거 사실: 기본값 check_interval_secs = None은 주기 확인이 비활성화됨을 의미합니다. 소스 코드는 세션 종료와 /dream을 명시적으로 지원하며, 확인 간격을 설정해야만 세션 actor가 주기적으로 게이트를 확인합니다. 따라서 "유휴 시마다 자동으로 실행된다"고 일반화할 수 없습니다.
crates/codegen/xai-grok-memory/src/dream.rs crates/codegen/xai-grok-memory/src/dream_lock.rs crates/codegen/xai-grok-memory/src/storage.rs crates/codegen/xai-grok-memory/src/index.rs crates/codegen/xai-grok-config-types/src/memory.rs crates/codegen/xai-grok-shell/src/session/acp_session_impl/memory_dream.rs check_dream_gates maybe_run_dream
잠금, 멱등성 및 실패 복구

DreamLock은 최선 노력 협조입니다

.dream-lock은 PID를 저장하고, mtime을 마지막 성공 시간으로도 사용합니다. 살아있는 프로세스가 만료되지 않은 잠금을 보유 중이면 Ok(None)을 반환합니다. 죽은 프로세스나 만료된 잠금은 회수될 수 있습니다.

소스 코드 주석에 엄격한 상호 배제가 아님이 명시되어 있습니다. 쓰기 후 재읽기로 경합 가능성을 낮추지만, 두 프로세스가 모두 승리했다고 믿을 수 있으므로 Dream은 중복 consolidation을 허용해야 합니다.

성공 경계가 정리 경계를 결정합니다

  • 모델이 빈 값, NO_REPLY, 또는 Markdown 헤딩 없이 반환하면 아무것도 쓰지 않고 세션도 삭제하지 않습니다.
  • MEMORY.md 쓰기에 실패하면 rollback(prior)을 호출하여 이전 잠금 상태를 복원합니다.
  • 쓰기 성공 후에만 읽은 세션을 정리합니다; 5분 내 활성 파일은 건너뜁니다.
  • 검색 인덱스는 실제로 삭제된 경로만 제거한 후, 새 MEMORY.md의 인덱스와 임베딩을 재구성합니다.
실제 소스 코드 스냅샷
crates/codegen/xai-grok-memory/src/dream.rsREAL SOURCE · abridged
pub fn check_dream_gates(
    config: &MemoryDreamConfig,
    lock: &DreamLock,
    sessions_dir: &Path,
    current_session_sid8: Option<&str>,
) -> DreamGate {
    if !config.enabled { return DreamGate::Disabled; }
    // Time gate, then session gate
    ...
    DreamGate::Open { sessions }
}

스냅샷 설명: 코드는 실제 함수 서명과 반환 타입을 유지하며, 중간 구현은 줄임표로 압축되었습니다. 페이지의 상태 머신 SVG는 교육용 표현으로, 저장소에서 생성된 아키텍처 다이어그램과 다릅니다.

수업 실습: 실패 후 시스템 상태 파악

시나리오: Dream이 모델 호출을 완료했지만 MEMORY.md 쓰기에 실패했습니다. 다음 질문에 답하세요: 잠금 파일은 어떤 상태로 복원되어야 하나요? 어떤 세션 파일을 삭제할 수 있나요? 인덱스를 업데이트해야 하나요? execute_dream의 분기에서 근거를 제시하세요.

Takeaway: Dream의 신뢰성은 성공 경계 설계에서 비롯됩니다. 게이팅은 불필요한 호출을 줄이고, 최선 노력 잠금은 동시성을 낮추며, 멱등성은 소량의 중복 위험을 흡수하고, 롤백과 지연 정리는 실패 후에도 재시도가 가능하도록 보장합니다.