Dream의 실제 메커니즘
Dream은 최근 세션 로그와 기존 MEMORY.md를 합쳐 장기 기억을 형성합니다. 세션 종료, 선택적 주기 확인, 또는 수동 명령으로 진입하며, 게이팅과 최선 노력 잠금의 공동 제약을 받습니다.
Dream의 트리거부터 인덱스 재구성까지의 전체 체인을 이해하고, DreamGate, 멱등성 요건, 잠금 경합, 쓰기 실패 롤백이 각각 어떤 문제를 해결하는지 설명할 수 있습니다.
Dream 상태 머신
아래 다이어그램은 교육용 시각 자료입니다. 노드 이름은 소스 코드에서 가져왔으며, 레이아웃과 설명은 교육 목적으로 재구성되었습니다.
1. 구성 게이트
MemoryDreamConfig.enabled는 기본값이 true입니다. 하위 Agent 세션은 Dream을 완전히 건너뜁니다.
2. 시간 게이트
min_hours의 기본값은 4입니다. 잠금 파일의 mtime이 마지막 성공적인 consolidation 시간을 기록합니다.
3. 세션 게이트
min_sessions의 기본값은 3입니다. 마지막 consolidation 이후 수정된 세션 Markdown을 카운트하되, 현재 세션은 제외합니다.
DreamLock은 최선 노력 협조입니다
.dream-lock은 PID를 저장하고, mtime을 마지막 성공 시간으로도 사용합니다. 살아있는 프로세스가 만료되지 않은 잠금을 보유 중이면 Ok(None)을 반환합니다. 죽은 프로세스나 만료된 잠금은 회수될 수 있습니다.
소스 코드 주석에 엄격한 상호 배제가 아님이 명시되어 있습니다. 쓰기 후 재읽기로 경합 가능성을 낮추지만, 두 프로세스가 모두 승리했다고 믿을 수 있으므로 Dream은 중복 consolidation을 허용해야 합니다.
성공 경계가 정리 경계를 결정합니다
- 모델이 빈 값, NO_REPLY, 또는 Markdown 헤딩 없이 반환하면 아무것도 쓰지 않고 세션도 삭제하지 않습니다.
- MEMORY.md 쓰기에 실패하면 rollback(prior)을 호출하여 이전 잠금 상태를 복원합니다.
- 쓰기 성공 후에만 읽은 세션을 정리합니다; 5분 내 활성 파일은 건너뜁니다.
- 검색 인덱스는 실제로 삭제된 경로만 제거한 후, 새 MEMORY.md의 인덱스와 임베딩을 재구성합니다.
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의 분기에서 근거를 제시하세요.