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의 각 새 위협에 대해:
- 다중 기준 유사도(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 } 반환
- 중복이 true인 경우 (점수 >= 0.7, 동일 도메인 + 유사 패턴) → 재활성화:
- 매치된 항체 업데이트:
update-antibody --id {matched_id} --increment_seen true --last_seen {오늘} - 로그:
[IMMUNE] COLD 항체 {id} 재활성화됨: {pattern} - 새 항체를 생성하지 않음 (중복 방지)
- 매치된 항체 업데이트:
- 매치가 없고
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의 각 새 전략에 대해:
- 다중 기준 유사도를 사용하여 중복 확인:
node ~/.claude/skills/immune/immune-adapter.js check-duplicate --pattern "{pattern}" --domains '{domains_json}' --type strategy
- 중복이 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})
- 새 효과성 계산:
- 매치가 없고
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를 통해 새 위협을 감지할 수 있음.