본문으로 건너뛰기

ADR-012: 적응형 계층 메모리

항목
상태Accepted
날짜2026-03-18
범위AdaptiveTrigger, CalibrationStore, RegimeDetector/Classifier/Manager, SegmentSummarizer, Content-Level Detection, WorkType Classification

배경

분석 파이프라인(ADR-011)은 제안을 생성하지만 시간적 컨텍스트가 결여되어 있습니다 — 시점별 스냅샷을 분석하기 때문에 작업 세그먼트나 시간에 걸친 행동 패턴을 이해하지 못합니다. 고정 간격 요약(시간/일 단위)은 정보 손실을 가져옵니다 — 90분짜리 deep work 세션이 경계로 분할되고, 혼란스런 10분 구간은 한가한 1시간에 묽어집니다.

정보 밀도로 구동되는 적응형 세그먼테이션과 자동 발견되는 활동 regime 으로 작업 모드별 파라미터를 최적화하는 시스템이 필요합니다.

결정

§1 Dual-EWMA Trigger 를 이용한 적응형 세그먼테이션

세그먼트 경계는 wall-clock 간격이 아니라 trigger scoring 함수로 결정됩니다. 4가지 신호(밀도, 중요도, 컨텍스트 변화, 버퍼 압력)를 설정 가능한 가중치로 결합합니다. hysteresis gate (T_high/T_low) 가 진동을 방지합니다.

AdaptiveTrigger 는 maekon-analysis순수 알고리즘 — I/O 의존성 없음. TriggerInput 이벤트를 받아 세그먼트 lifecycle 액션을 emit 합니다.

세그먼트 최소 시간: 120 초 (의미 없는 마이크로 세그먼트 방지). 세그먼트 최대 시간: 600 초 (요약을 강제하는 hard backstop).

§2 CalibrationStore — 버퍼링된 동기 쓰기 + 비동기 읽기

maekon-core 의 두 port trait:

  • CalibrationWriter: Send + SyncCalibrationBuffer 를 통한 동기적 배치 쓰기 (10 entry 또는 5초마다 flush). hot-path 지연을 피하기 위해 이벤트별 동기 쓰기 안 함.
  • CalibrationReader: Send + Sync + #[async_trait] — regime 감지를 위한 비동기 bulk 읽기.

모든 trigger 입력은 retroactive recalibration, 노이즈 제외, regime 재학습을 위해 영속됩니다. 보존: 30일 또는 500,000 row (ring buffer backstop).

파라미터 스냅샷은 정규화됩니다 — params_version_id 가 행별 JSON 비대화를 피하기 위해 별도 trigger_params_snapshots 테이블을 참조.

§3 자동 발견되는 Regime

regime (활동 모드) 은 수동 정의가 아니라 클러스터링으로 자동 발견 됩니다. 프리셋 프로파일(Developer, Manager 등)은 Day 1 seed 역할을 하며 학습된 regime 으로 superseded 됩니다.

RegimeDetector: 직접 구현한 k-means 클러스터링(외부 의존성 없음). 5 feature, 최대 7 cluster, optimal k 선택을 위한 silhouette score. 매일 또는 on-demand 실행.

RegimeClassifier: 5분 sliding window 위 실시간 nearest-centroid 매칭. regime 전이 시 AdaptiveTrigger 파라미터 전환.

RegimeManager: lifecycle 규칙 — 생성 (≥50 sample), 머지 (유사 centroid), 비활성화 (14일 부재), 아카이브 (30일 비활성), 한계 (활성 최대 7개).

§4 파라미터 계층 (CSS Cascade)

파라미터는 specificity 기반 override 로 resolve 됩니다:

Level 0: 전역 기본값 (ResolvedParams::default())
Level 1: Regime override (Option 필드 — Some 값만 override)
Level 2: 카테고리 override (AppCategory 별)
Level 3: Process override (앱 이름 별)

TriggerParams 는 cascade 모델을 위해 Option<f32> 필드 사용. ResolvedParams 는 완전히 resolve 된 (Option 없는) 출력. 가중치는 합 1.0 으로 자동 정규화.

§5 콘텐츠 수준 활동 감지

OCR 기반 감지로 사용자가 각 앱 내에서 어떤 콘텐츠 로 작업하는지 보편적으로 감지 — RDP/VM 컨테이너만이 아님.

TitleBarParser: 윈도우 제목에서 콘텐츠를 추출하는 앱별 설정 가능 regex 규칙. VSCode, Chrome, Slack, Terminal, IntelliJ, Figma 등의 알려진 패턴.

컨테이너 감지: RDP/VM/VNC/Citrix 앱의 프리셋 목록. 활성 앱이 컨테이너일 때 OCR 이 내부 title bar 를 파싱해 sub-process 감지.

ContentTracker: 각 세그먼트 내 콘텐츠별 지속 시간 누적.

§6 WorkType 분류

입력 활동 패턴(InputActivityCollector 의 키보드/마우스)을 OCR 콘텐츠와 상관시켜 작업 유형 을 분류: ActiveCoding, CodeReview, Writing, Reading, Designing, FormFilling, PassiveMeeting 등.

WorkTypeClassifier: maekon-analysis 의 순수 알고리즘. (KeyboardActivity, MouseActivity, content_label, app_category)WorkType 로 변환.

WorkType 전이는 AdaptiveTrigger 에 유의미한 이벤트입니다.

CalibrationStore 는 ConsentManager (activity_pattern_learning 권한)를 통한 명시적 동의가 필요합니다. TieredMemoryConfig.enabled 와 consent 둘 다 true 여야 합니다.

§8 노이즈 처리

  • 짧은 이상 신호 (<1 시간, regime 매칭 없음): 노이즈로 표시, 학습에서 제외
  • 지속적 shift (>24 시간): regime 재감지 트리거
  • Retroactive recalibration: 사용자가 시간 범위를 노이즈로 표시 → regime 파라미터 재계산
  • 저장된 모든 입력이 롤백 + 재학습 가능하게 함

§9 ContextAnalyzer 와의 통합

AdaptiveTrigger 와 ContextAnalyzer 는 공존합니다:

  • AdaptiveTrigger: 언제 세그먼트할지 (신호 기반)
  • ContextAnalyzer: 무엇을 제안할지 (LLM 기반)

통합: 현재 세그먼트 통계 + regime 정보가 ContextAssembler 에 입력되어 더 풍부한 LLM 컨텍스트 제공. regime 인지 제안 필터링 (Deep Focus 중 저우선순위 억제, Communication 중 협업 제안 boost).

결과

  • maekon-analysis 가 다음을 포함하도록 확장: AdaptiveTrigger, SegmentBuffer, CalibrationBuffer, RegimeDetector, RegimeClassifier, RegimeManager, SegmentSummarizer, TitleBarParser, ContentTracker, WorkTypeClassifier
  • maekon-core 가 다음을 추가: TriggerParams/ResolvedParams, TriggerInput, CalibrationEntry, RegimeFeatures, Regime, SegmentSummary, ContentActivity, WorkType, EngagementMetrics, CalibrationWriter/CalibrationReader port, TieredMemoryConfig, PresetProfile
  • SQLite V9 마이그레이션이 4개 테이블 추가: calibration_log, trigger_params_snapshots, regimes, activity_segments
  • 외부 ML 의존성 없음 (k-means 직접 구현)
  • ContextAssembler 가 current_segment + current_regime 파라미터 추가
  • Monitor 루프가 기존 경로 외에 AdaptiveTrigger 에도 이벤트 공급

참고

  • ADR-011: 독립 분석 파이프라인 (기반)
  • ADR-001 §1-7: 에러 타입, async trait, DI, crate 경계
  • ADR-003: 디렉토리 모듈 패턴 (파일이 500 line 을 초과할 때 적용)
  • 설계 spec: 내부 adaptive tiered memory 설계 노트
  • 연구 자료: Dual-EWMA, ESPRESSO, CUSUM, MemGPT memory consolidation