Communitygithub.com

Mnemoclaw/immune

Claude Code를 위한 하이브리드 적응형 메모리 시스템 — Cheatsheet (긍정 패턴) + Immune (부정 패턴)

immune란 무엇인가요?

이 기술은 Claude Code가 대화 중에 학습하고 적응할 수 있도록 하는 하이브리드 적응형 메모리 시스템입니다. 'Cheatsheet'는 생성 전에 주입되는 긍정적인 도메인별 전략을 저장하여 출력 품질을 향상시키고, 'Immune'은 생성 후에 알려진 오류를 감지하고 새로운 위협을 발견하는 항체 역할을 합니다. 두 메모리 모두 Hot/Cold 계층화를 사용하여 컨텍스트를 간결하게 유지하며, 모든 데이터 접근은 전용 어댑터 CLI를 통해 이루어집니다. 이 시스템은 피트니스, 코드, 글쓰기, 연구, 전략, 웹 디자인 등 여러 도메인을 지원하며, 과거 세션 인식, 중복 감지, 품질 관문 검증 등의 고급 기능을 제공합니다. 주요 사용 사례로는 코드 리뷰, 문서 검증, 전략 수립 등이 있으며, 사용자는 자연어 명령으로 시스템을 호출하고 스캔 결과와 교정된 출력을 받을 수 있습니다.

지원 대상✓Claude Code~Codex CLI~Cursor
npx skills add Mnemoclaw/immune

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

Immune System v5.1 — 하이브리드 Cheatsheet + Immune

두 가지 상호 보완적인 메모리를 가진 하이브리드 적응형 시스템을 운영합니다:

  • Cheatsheet (긍정 패턴): 생성 전에 주입되어 출력 품질을 향상시키는 도메인별 전략
  • Immune (부정 패턴): 생성 후에 알려진 오류를 감지하고 새로운 위협을 발견하는 항체

두 메모리 모두 Hot/Cold 계층화를 사용하여 컨텍스트를 간결하게 유지합니다. 모든 데이터 접근은 어댑터 CLI(node ~/.claude/skills/immune/immune-adapter.js)를 통해 이루어집니다.

입력 파싱

사용자가 스캔할 콘텐츠를 포함하여 호출합니다. 다음 매개변수를 파싱하세요:

  • input: 스캔할 텍스트/코드/콘텐츠 (필수 — 인라인 또는 컨텍스트에서)
  • domain: 다음 중 하나: fitness, code, writing, research, strategy, webdesign, _global (기본값: 자동 감지)
  • domains: 도메인 배열 (단일 도메인 재정의). 예시: domains=fitness,code
  • constraints: 출력이 충족해야 하는 특정 요구사항 (선택 사항)
  • mode: full (cheatsheet + 스캔, 기본값) | scan-only (cheatsheet 건너뛰기) | cheatsheet-only (cheatsheet 반환, 스캔 없음)

<예시> <예시> /immune 이 함수에서 일반적인 함정 확인 → domains=["code"] (자동 감지), mode=full </예시> <예시> /immune domain=fitness 이 근육 운동 프로그램 확인 → domains=["fitness"] (명시적) </예시> <예시> /immune domains=fitness,code 이 운동 생성기 API 확인 → domains=["fitness", "code"] (다중 도메인) </예시> <예시> /immune → 대화에서 가장 최근 출력 스캔 </예시> </예시>

인라인 텍스트가 제공되지 않으면, 대화의 마지막 실질적인 출력을 스캔합니다.

도메인 자동 감지: ~/.claude/skills/immune/config.yaml을 읽고 domain_keywords에 대해 콘텐츠를 매칭합니다. 강한 매칭이 없으면 ["_global"]을 사용합니다. 단일 domain 문자열이 제공되면 배열로 래핑합니다: domains = [domain].

실행

단계 -1 — 컨텍스트 검색 (과거 세션 인식)

현재 스캔에 정보를 제공하기 위해 관련 과거 세션을 검색합니다:

node ~/.claude/skills/immune/immune-adapter.js get-context --query "{작업 키워드 또는 도메인}" --days 90 --limit 5

결과가 있으면, 해당 도메인의 반복적인 패턴이나 과거 문제를 기록합니다. 이는 과거 인식으로 스캔을 풍부하게 합니다 — 스캐너는 유사한 콘텐츠가 이전에 플래그 지정되었는지 알게 됩니다.

로그: [IMMUNE] 컨텍스트: {count}개의 관련 과거 세션 발견

단계 0 — Cheatsheet 주입 (긍정 패턴)

mode == "scan-only"인 경우 이 단계를 건너뜁니다.

0a. 어댑터를 통해 HOT 전략 로드:

실행:

node ~/.claude/skills/immune/immune-adapter.js get-strategies --domains '{domains_json}' --tier hot --limit 15

JSON 출력을 파싱합니다. 어댑터는 도메인별로 사전 필터링되고, HOT으로 분류되며, 효과성 내림차순으로 정렬되고, 최대 15개로 제한된 전략을 반환합니다.

0b. COLD 전략 요약 로드:

실행:

node ~/.claude/skills/immune/immune-adapter.js get-strategies --domains '{domains_json}' --tier cold

각 COLD 전략의 pattern 필드에서 짧은 키워드를 추출합니다. 쉼표로 구분된 목록으로 결합합니다.

0c. Cheatsheet 블록 구축: HOT 전략을 XML로 포맷:

<cheatsheet domain="{domains}">
  <strategy id="{id}" effectiveness="{effectiveness}">
    {pattern}
    예시: {example}
  </strategy>
  ...
</cheatsheet>

COLD 전략이 있으면 한 줄을 추가합니다:

<cheatsheet_cold>다음도 고려: {쉼표로 구분된 COLD 패턴 키워드}</cheatsheet_cold>

mode == "cheatsheet-only"인 경우 cheatsheet 블록을 출력하고 여기서 중단합니다.

로그:

[IMMUNE] Cheatsheet: {n_hot} HOT + {n_cold} COLD 전략 (도메인: {domains})

0d. 사용자에게 Cheatsheet 표시: 독립 실행형(/immune)으로 실행되는 경우, 사용자가 다음 생성에 적용해야 하는 컨텍스트로 cheatsheet를 표시합니다. Chimera에 의해 호출된 경우, PRISM 프롬프트에 주입할 XML 블록을 반환합니다.

단계 1 — 항체 로드 및 분류 (Hot/Cold)

1a. 어댑터를 통해 HOT 항체 로드:

실행:

node ~/.claude/skills/immune/immune-adapter.js get-antibodies --domains '{domains_json}' --tier hot --limit 15

어댑터는 도메인별로 사전 필터링되고, HOT(심각도=critical OR seen_count>=3 OR last_seen<30d)으로 분류되며, 심각도 다음 seen_count 기준으로 정렬되고, 최대 15개로 제한된 항체를 반환합니다.

1b. COLD 항체 요약 로드:

실행:

node ~/.claude/skills/immune/immune-adapter.js get-antibodies --domains '{domains_json}' --tier cold

각 COLD 항체에 대해 pattern 필드에서 짧은 키워드를 추출합니다. 쉼표로 구분된 목록으로 결합합니다.

로그:

[IMMUNE] 계층 분할: {n_hot} HOT + {n_cold} COLD / {n_hot + n_cold} 총계 (도메인: {domains})

단계 2 — 스캔

다음 XML 구조의 프롬프트로 immune-scan 에이전트(Haiku)를 시작합니다:

<scan_request>
  <domains>{감지된 도메인 (JSON 배열)}</domains>
  <task>{작업 설명 또는 "다음 콘텐츠에서 오류 및 위협 스캔"}</task>
  <constraints>{제약 조건 또는 "없음"}</constraints>

  <content>
{스캔할 입력 텍스트/코드/콘텐츠}
  </content>

  <hot_antibodies>
{JSON 배열의 HOT 항체 — id, domains, pattern, severity, correction 전체 객체}
  </hot_antibodies>

  <cold_summary>
휴면 패턴 (상세하지 않음, 인식용): {쉼표로 구분된 COLD 키워드}
  </cold_summary>

  <cheatsheet_applied>
{단계 0에서 주입된 전략 ID 및 패턴 목록, 또는 scan-only 모드인 경우 "없음"}
  </cheatsheet_applied>
</scan_request>

로그: [IMMUNE] 스캔 중... ({n_hot} 활성 항체) 결과를 기다립니다.

수정 사항이 적용된 경우: 로그: [IMMUNE] 매치 {antibody_id}: {original} → {corrected} 새 위협이 감지된 경우: 로그: [IMMUNE] 새 위협: {pattern} 새 전략이 감지된 경우: 로그: [IMMUNE] 새 전략: {pattern}

단계 3 — Immune 메모리 업데이트 (COLD 중복 제거 포함)

3a. 매치된 HOT 항체: 스캐너가 매치한 각 항체에 대해 어댑터를 통해 업데이트:

node ~/.claude/skills/immune/immune-adapter.js update-antibody --id {antibody_id} --increment_seen true --last_seen {오늘}

3b. 새 위협 — 유사도 점수로 중복 제거: new_threats_detected의 각 새 위협에 대해:

  1. 다중 기준 유사도(Jaccard + 서브스트링 + 도메인)를 사용하여 중복 확인:
node ~/.claude/skills/immune/immune-adapter.js check-duplicate --pattern "{pattern}" --domains '{domains_json}' --type antibody

{ duplicate: true/false, best_match: { id, score, pattern }, threshold: 0.7 } 반환

  1. 중복이 true인 경우 (점수 >= 0.7, 동일 도메인 + 유사 패턴) → 재활성화:
    • 매치된 항체 업데이트: update-antibody --id {matched_id} --increment_seen true --last_seen {오늘}
    • 로그: [IMMUNE] COLD 항체 {id} 재활성화됨: {pattern}
    • 새 항체를 생성하지 않음 (중복 방지)
  2. 매치가 없고 auto_add_threats가 true인 경우 → 새 항체 생성:
node ~/.claude/skills/immune/immune-adapter.js add-antibody --json '{"id":"AB-{next_number}","domains":{domains},"pattern":"{pattern}","severity":"{severity}","correction":"{correction}","seen_count":1,"first_seen":"{오늘}","last_seen":"{오늘}"}'
  • 로그: [IMMUNE] + 새 항체 {id}: {pattern}

3c. 업데이트된 통계 가져오기:

node ~/.claude/skills/immune/immune-adapter.js stats

로그: [IMMUNE] 메모리: {total} 항체 ({n_hot} 핫, {n_cold} 콜드) | +{new} 추가됨 | 재활성화됨: {reactivated}

단계 3b — Cheatsheet 메모리 업데이트 (긍정 패턴)

mode == "scan-only"이거나 스캔 결과에 new_strategies_detected가 없으면 건너뜁니다.

3b-i. 유사도 점수로 중복 제거: new_strategies_detected의 각 새 전략에 대해:

  1. 다중 기준 유사도를 사용하여 중복 확인:
node ~/.claude/skills/immune/immune-adapter.js check-duplicate --pattern "{pattern}" --domains '{domains_json}' --type strategy
  1. 중복이 true인 경우 (점수 >= 0.7, 중복 도메인 + 유사 패턴) → 강화:
    • 새 효과성 계산: new_eff = old_eff * 0.8 + reported_eff * 0.2 (지수 이동 평균)
    • 업데이트: update-strategy --id {matched_id} --increment_seen true --last_seen {오늘} --effectiveness {new_eff}
    • 로그: [IMMUNE] 전략 {id} 강화됨: {pattern} (효과: {old}→{new})
  2. 매치가 없고 auto_add_strategies가 true인 경우 → 새 전략 생성:
node ~/.claude/skills/immune/immune-adapter.js add-strategy --json '{"id":"{prefix}-{next_number}","domains":{domains},"pattern":"{pattern}","example":"{example}","effectiveness":{eff},"seen_count":1,"first_seen":"{오늘}","last_seen":"{오늘}"}'
  • 로그: [IMMUNE] + 새 전략 {id}: {pattern}

3b-ii. 낮은 효과성 정리: effectiveness < 0.2이고 seen_count >= 5인 전략이 있으면 수동 검토를 위해 기록합니다.

로그: [IMMUNE] Cheatsheet: {total} 전략 | +{new} 추가됨 | 강화됨: {reinforced}

단계 4 — 점수

어댑터를 통해 범용 점수 계산:

node ~/.claude/skills/immune/immune-adapter.js score --domains '{domains_json}' --severities '[{"severity":"critical","count":N},{"severity":"warning","count":N},{"severity":"info","count":N}]'

어댑터 반환: score (0-100), pass (boolean), z (도메인 기준선 대비 z-점수), baseline (평균, 표준편차, 임계값, n), deductions.

단계 5 — 출력

깨끗한 경우:

───
IMMUNE v5.1 | 도메인={domains} | 점수: {score}/100 ({PASS|FAIL}) | z={z}
   기준선 ({domain}): 평균={mean} 표준편차={std} 임계값={threshold}
   Cheatsheet: {n_strategies} 전략 적용됨 | 항체: {n_hot}/{max} HOT, {n_cold} COLD
   발견된 문제 없음
───

수정 사항 또는 위협이 발견된 경우:

───
IMMUNE v5.1 | 도메인={domains} | 점수: {score}/100 ({PASS|FAIL}) | z={z}
   기준선 ({domain}): 평균={mean} 표준편차={std} 임계값={threshold}

적용된 수정 사항:
  [AB-XXX] {pattern} → {correction}

감지된 새 위협:
  [{severity}] {pattern} — {suggested_correction}

재활성화됨:
  [AB-XXX] {pattern} (COLD였음, 현재 HOT)

학습된 새 전략:
  [CS-XXX] {pattern} (효과: {effectiveness})

───
수정된 출력:
{도메인에 맞게 포맷된 수정된 콘텐츠}
───
메모리: {total_ab} 항체 + {total_cs} 전략 | +{new_ab} AB | +{new_cs} CS
───

그런 다음 수정된 출력을 도메인에 적합한 사람이 읽을 수 있는 형식으로 표시합니다.

단계 6 — 세션 로그

향후 컨텍스트를 위해 세션 결과를 로그로 기록합니다:

node ~/.claude/skills/immune/immune-adapter.js log-session --date {오늘} --domains '{domains_json}' --result {clean|corrected|flagged} --summary "{스캔 및 발견된 내용에 대한 간략한 요약}" --score {score}

이것은 context/YYYY-MM-DD.md + SQLite session_logs + 향후 get-context 검색을 위한 FTS4 인덱스에 기록됩니다.

단계 7 — 사전 압축 플러시 (선택 사항)

대화 컨텍스트가 압축에 가까워지면 아직 커밋되지 않은 보류 중인 항체/전략을 저장합니다:

node ~/.claude/skills/immune/immune-adapter.js flush-pending --json '{"antibodies":[...],"strategies":[...]}'

품질 관문 검증:

  • 패턴은 최소 20자 이상이어야 함
  • 항체 필수 항목: id, pattern, severity, correction
  • 전략 필수 항목: id, pattern
  • FTS4 중복 검사는 기존 패턴 재생성을 방지
  • 플러시된 레코드는 quality_gate=1로 플래그 지정

로그: [IMMUNE] 사전 압축 플러시: +{n} 항체, +{n} 전략 (quality_gate=true)

오류 처리

  • 어댑터 CLI가 실패하면: JSON 파일(immune_memory.json, cheatsheet_memory.json)을 직접 읽는 것으로 대체 — 이중 쓰기를 통해 동기화 상태 유지.
  • immune_memory.json이 없으면: 어댑터가 빈 항체로 자동 생성.
  • cheatsheet_memory.json이 없으면: 어댑터가 빈 전략으로 자동 생성.
  • immune_memory.json에 "version": 2가 있으면: 어댑터가 자동으로 "domain"을 "domains": ["domain_value"]로 마이그레이션.
  • 에이전트가 유효하지 않은 JSON을 반환하면: 한 번 재시도. 여전히 유효하지 않으면 경고와 함께 원시 출력을 보고.
  • 입력이 제공되지 않고 최근 출력이 없으면: 사용자에게 스캔할 항목을 물어봄.
  • 모든 항체가 COLD이면(HOT 자격이 없으면): 빈 hot_antibodies 배열과 전체 cold_summary로 스캔을 계속 전송. Haiku는 여전히 Phase 2를 통해 새 위협을 감지할 수 있음.

관련 스킬