Pattern Skills

reopt-state-and-memory-control

상태와 기억 제어

단기 상태와 장기 기억을 분리해 정보 누수와 혼선을 방지한다.

OCLS LAYER

설치

cp skills/patterns/reopt-state-and-memory-control/SKILL.md <your-project>/.claude/skills/reopt-state-and-memory-control/SKILL.md

이 레포의 파일을 당신의 프로젝트에 복사하면 Claude Code 세션에서 바로 활성화된다.

markdownskills/patterns/reopt-state-and-memory-control/SKILL.md
---
name: reopt-state-and-memory-control
description: When session state and long-term memory need to be separated. Distinguishing what must outlive the session from temporary state that should be cleared with it. When there's risk of data leakage across sessions.
---

# 상태와 기억 제어 (State and Memory Control)

OCLS 단계: **LAYER** · 단기 상태와 장기 기억을 분리해 정보 누수와 혼선을 방지한다.

## 핵심 규칙

- 세션 범위의 단기 상태와 시스템 범위의 장기 기억 사이에 분명한 경계를 긋는다.
- 단기 상태는 세션 종료 시 자동 소거된다.
- 장기 기억으로 승격할지는 명시적 기준(반복 패턴, 품질 기여 등)이 결정한다.
- 다중 에이전트 환경에서는 공유 기억에 대한 읽기·쓰기 권한을 에이전트별로 정의한다.
- 장시간 실행되는 에이전트는 컨텍스트 윈도우 한계를 다루기 위해 compaction을 사용한다 — 아키텍처 결정, 미해결 버그, 구현 세부는 보존하고 중복된 도구 출력은 버린다.

## 판단 질문

**무엇은 세션에 머물러야 하고, 무엇은 시스템 기억으로 승격되어야 하는가?**

## 적용 체크

1. 단기 상태와 장기 기억의 경계가 코드에 명시되어 있는가?
2. 세션 종료 시 단기 상태가 자동으로 소거되는가?
3. 장기 기억 승격 기준이 선언되어 있는가?
4. 공유 기억의 읽기·쓰기 권한이 에이전트별로 정의되어 있는가?

## 코드 예시

```typescript
// 단기 상태 — 세션 범위 (Redis TTL로 자동 만료)
interface SessionState {
  sessionId: string;
  currentStep: string;
  tempVars: Record<string, unknown>;
  // ttl: 30 * 60  (30분 후 자동 삭제)
}

// 장기 기억 — 시스템 범위 (승격 기준 충족 시에만 쓰기 가능)
interface MemoryRecord {
  customerId: string;
  pattern: string;
  evidence: { sessionIds: string[]; count: number };
  writtenBy: "qa-agent"; // 권한: QA만 쓰기
  createdAt: string;
}

async function promote(observation: Observation) {
  if (observation.occurrences < 3) return; // 승격 기준 미충족
  await memoryStore.write({
    customerId: observation.customerId,
    pattern: observation.pattern,
    evidence: observation.evidence,
    writtenBy: "qa-agent",
    createdAt: new Date().toISOString(),
  });
}

// Response Agent는 읽기만 가능
const context = await memoryStore.read(customerId); // ✅
await memoryStore.write(...);                        // ❌ 권한 없음
```

## 안티패턴

**고객 응대**: 분리가 없으면 이전 세션의 "배송 지연" 컨텍스트가 새 세션의 "결제 변경" 응답에 새어 들어가 부적절한 "배송 지연 죄송합니다"를 만든다. 반대로 세션 종료 시 모든 것을 삭제하면 같은 고객이 같은 문제로 다시 왔을 때 같은 제안을 반복하게 된다.

**장시간 실행 코딩 에이전트**: compaction 없이 수백 단계를 실행하면 컨텍스트 윈도우가 포화되어 "아키텍처 결정을 잊고 잘못된 경로를 다시 시도"하는 사고가 발생한다. 아키텍처 결정과 미해결 버그를 보존하고 중복된 도구 출력을 버리는 compaction이 필수다.

## 호출 예시

```
"Response Agent가 세션 간 상태를 누수시키고 있다.
reopt-state-and-memory-control을 적용해 단기 상태(SessionState)와
장기 기억(MemoryRecord)을 분리하고, 승격 기준과 쓰기 권한을 선언해줘."
```

## 관련 패턴

- 컨텍스트 라우팅 — 세션 간 컨텍스트 전달 규칙
- 평가와 가드레일 — 승격 기준의 검증

연결된 패턴

State and Memory Control상태와 기억 제어 — 단기 상태와 장기 기억을 분리해 정보 누수와 혼선을 방지한다.