Communitygithub.com

Mnemoclaw/immune

Claude Code 的混合適應性記憶系統 — Cheatsheet(正面模式)+ Immune(負面模式)

immune 是什麼?

這是一套專為 Claude Code 設計的混合適應性記憶系統,結合了兩種互補記憶:Cheatsheet(正面模式)和 Immune(負面模式)。Cheatsheet 會在生成前注入領域特定策略,以提升輸出品質;Immune 則在生成後利用抗體檢測已知錯誤並發現新威脅。系統透過熱/冷分層(Hot/Cold tiering)保持上下文精簡,並透過 adapter CLI (`node ~/.claude/skills/immune/immune-adapter.js`) 存取資料。支援 fitness(健身)、code(程式碼)、writing(寫作)、research(研究)、strategy(策略)、webdesign(網頁設計)及 `_global`(全域)等領域,可自動檢測或手動指定。運作流程包含:載入策略、分類抗體、掃描內容、更新記憶(含重複檢測與合併)、計算分數、輸出結果,以及記錄會話以供未來參考。此技能能顯著提升開發者在使用 Claude Code 時的生產力與準確性。

相容平台✓Claude Code~Codex CLI~Cursor
npx skills add Mnemoclaw/immune

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

Immune System v5.1 — 混合 Cheatsheet + Immune

你操作一個混合適應性系統,包含兩種互補記憶:

  • Cheatsheet(正面模式):領域特定策略,在生成前注入以改善輸出品質
  • Immune(負面模式):抗體,用於在生成後檢測已知錯誤並發現新威脅

兩種記憶皆使用熱/冷分層(Hot/Cold tiering)來保持上下文精簡。 所有資料存取皆透過 adapter CLI (node ~/.claude/skills/immune/immune-adapter.js)。

輸入解析

使用者會提供要掃描的內容。請解析以下參數:

  • input:要掃描的文字/程式碼/內容(必要——可以是內聯或來自上下文)
  • domain:下列其中之一:fitness, code, writing, research, strategy, webdesign, _global(預設:自動檢測)
  • domains:領域陣列(覆蓋單一 domain)。範例:domains=fitness,code
  • constraints:輸出應滿足的任何特定要求(選用)
  • mode:full(cheatsheet + 掃描,預設)| scan-only(跳過 cheatsheet)| cheatsheet-only(僅回傳 cheatsheet,不掃描)

如果沒有提供內聯文字,則掃描對話中最近的主要輸出。

領域自動檢測: 讀取 ~/.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] Context: {count} 個相關過去會話已找到

步驟 0 — Cheatsheet 注入(正面模式)

如果 mode == "scan-only",則跳過此步驟。

0a. 透過 adapter 載入 HOT 策略:

執行:

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

解析 JSON 輸出。adapter 會回傳已按領域預先篩選、分類為 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 呼叫,則回傳 XML 區塊以注入 PRISM 提示中。

步驟 1 — 載入與分類抗體(Hot/Cold)

1a. 透過 adapter 載入 HOT 抗體:

執行:

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

adapter 會回傳已按領域預先篩選、分類為 HOT(severity=critical 或 seen_count>=3 或 last_seen<30d)、按 severity 後按 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>{detected_domains 為 JSON 陣列}</domains>
  <task>{任務描述或「掃描以下內容中的錯誤與威脅」}</task>
  <constraints>{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 抗體:

對於掃描器比對到的每個抗體,透過 adapter 更新:

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

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(score >= 0.7,相同領域 + 相似模式)→ 重新啟用:
    • 更新比對到的抗體:update-antibody --id {matched_id} --increment_seen true --last_seen {today}
    • 記錄:[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":"{today}","last_seen":"{today}"}'
  • 記錄:[IMMUNE] + 新抗體 {id}:{pattern}

3c. 取得更新後的統計資料:

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

記錄:[IMMUNE] 記憶:{total} 個抗體({n_hot} 個 hot,{n_cold} 個 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(score >= 0.7,重疊領域 + 相似模式)→ 強化:
    • 計算新的有效性:new_eff = old_eff * 0.8 + reported_eff * 0.2(指數移動平均)
    • 更新:update-strategy --id {matched_id} --increment_seen true --last_seen {today} --effectiveness {new_eff}
    • 記錄:[IMMUNE] 強化策略 {id}:{pattern}(eff:{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":"{today}","last_seen":"{today}"}'
  • 記錄:[IMMUNE] + 新策略 {id}:{pattern}

3b-ii. 修剪低有效性策略:

如果任何策略的 effectiveness < 0.2 且 seen_count >= 5,則記下以供人工審查。

記錄:[IMMUNE] Cheatsheet:{total} 個策略 | +{new} 新增 | 強化:{reinforced}

步驟 4 — 評分

透過 adapter 計算通用分數:

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

adapter 會回傳:score(0-100)、pass(布林值)、z(相對於領域基準的 z 分數)、baseline(mean、std、threshold、n)、deductions。

步驟 5 — 輸出

如果內容乾淨:

───
IMMUNE v5.1 | 領域={domains} | 分數:{score}/100 ({PASS|FAIL}) | z={z}
   基準線({domain}):mean={mean} std={std} threshold={threshold}
   Cheatsheet:已套用 {n_strategies} 個策略 | 抗體:{n_hot}/{max} 個 HOT,{n_cold} 個 COLD
   未檢測到問題
───

如果找到修正或威脅:

───
IMMUNE v5.1 | 領域={domains} | 分數:{score}/100 ({PASS|FAIL}) | z={z}
   基準線({domain}):mean={mean} std={std} threshold={threshold}

已套用的修正:
  [AB-XXX] {pattern} → {correction}

檢測到的新威脅:
  [{severity}] {pattern} — {suggested_correction}

重新啟用:
  [AB-XXX] {pattern}(原為 COLD,現為 HOT)

學到的新策略:
  [CS-XXX] {pattern}(eff:{effectiveness})

───
修正後的輸出:
{修正後的內容,根據領域格式化}
───
記憶:{total_ab} 個抗體 + {total_cs} 個策略 | +{new_ab} AB | +{new_cs} CS
───

然後以適合該領域的人類可讀格式呈現修正後的輸出。

步驟 6 — 會話記錄

記錄會話結果以供未來上下文使用:

node ~/.claude/skills/immune/immune-adapter.js log-session --date {today} --domains '{domains_json}' --result {clean|corrected|flagged} --summary "{所掃描內容及發現的簡短摘要}" --score {score}

這會寫入到 context/YYYY-MM-DD.md + SQLite session_logs + FTS4 索引,以供未來的 get-context 搜尋使用。

步驟 7 — 壓縮前快取(選用)

如果對話上下文即將壓縮,請儲存任何尚未提交的待處理抗體/策略:

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

品質檢查驗證:

  • Pattern 長度必須 >= 20 個字元
  • 抗體需要:id、pattern、severity、correction
  • 策略需要:id、pattern
  • FTS4 重複檢查防止重新建立現有模式
  • 快取的記錄會標記為 quality_gate=1

記錄:[IMMUNE] 壓縮前快取:+{n} 個抗體,+{n} 個策略(quality_gate=true)

錯誤處理

  • 如果 adapter CLI 失敗:直接回退到讀取 JSON 檔案(immune_memory.json、cheatsheet_memory.json)——它們會透過雙重寫入保持同步。
  • 如果 immune_memory.json 不存在:adapter 會自動以空的抗體陣列建立它。
  • 如果 cheatsheet_memory.json 不存在:adapter 會自動以空的策略陣列建立它。
  • 如果 immune_memory.json 中有 "version": 2:adapter 會自動將 "domain" 遷移為 "domains": ["domain_value"]。
  • 如果代理回傳無效的 JSON:重試一次。如果仍然無效,則回傳原始輸出並附上警告。
  • 如果未提供輸入且沒有最近的輸出:詢問使用者要掃描什麼。
  • 如果所有抗體都是 COLD(沒有任何抗體符合 HOT 資格):仍以空的 hot_antibodies 陣列和完整的 cold_summary 發送掃描請求。Haiku 仍然可以透過第二階段檢測新威脅。

相關技能