mcpField
I
immune

immune

github.com/mathews-tomAgent 工作流33789 次安装2 天前更新
代码仓库

关于 immune

immune 是用于检查文本、代码等内容的自适应技能,依据领域相关的正向策略和错误模式进行审查。它会筛选并分层记忆条目,让检查聚焦当前任务,并根据结果更新记忆。

主要功能

  1. 01按领域扫描内容
  2. 02注入正向策略清单
  3. 03记忆采用冷热分层
  4. 04按任务检索模式
  5. 05威胁去重与重新激活

适用场景

  1. 01检查代码中的常见问题
  2. 02依据已存指导审阅文本
  3. 03跨多个领域扫描输出

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/mathews-tom/armory --skill immune

安装后在 Claude Code 中输入/immune确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

cheatsheet_memory.json
config.yaml
immune_memory.json
agents/
immune-scan.md
evals/
cases.yaml
scripts/
retrieve.py

详细介绍

免疫系统 v3 — 速查表 + 免疫

你使用的是一个混合式自适应系统,包含两种互补的记忆:

  • 速查表(正向模式):在生成前注入特定领域的策略,以提升输出质量
  • 免疫(负向模式):用于检测已知错误并在生成后发现新威胁的抗体

两种记忆都采用冷热分层,以精简上下文。

输入解析

用户会提供要扫描的内容。解析以下参数:

  • input:要扫描的文本/代码/内容(必需——可直接提供,也可从上下文获取)
  • domain:以下之一:fitness、code、writing、research、strategy、webdesign、_global(默认:自动检测)
  • domains:领域数组(覆盖单个领域)。示例:domains=fitness,code
  • constraints:输出应满足的具体要求(可选)
  • mode:full(速查表 + 扫描,默认)| scan-only(跳过速查表)| cheatsheet-only(返回速查表,不扫描)
/immune Check this function for common pitfalls → domains=["code"](自动检测),mode=full /immune domain=fitness Vérifie ce programme de musculation → domains=["fitness"](显式指定) /immune domains=fitness,code Check this workout generator API → domains=["fitness", "code"](多领域) /immune → 扫描对话中最近一条实质性输出

如果未提供内联文本,则扫描对话中的最后一条实质性输出。

**领域自动检测:**读取 config.yaml(与此技能位于同一目录),并将内容与 domain_keywords 匹配。如果没有明显匹配项,则使用 ["_global"]。如果提供了单个 domain 字符串,则将其包装为数组:domains = [domain]。

任务条件检索(v3.1.0+)

抗体和速查表策略可以带有可选的 triggers 字段,用于按任务过滤。这实现了 Memento-Skills 反思循环的读取阶段(arXiv 2603.18743)——根据当前任务与历史上下文之间的词汇重合度对条目进行排名。

架构(可选增补):

{
  "id": "AB-042",
  "domains": ["code"],
  "pattern": "SQL injection via string concatenation",
  "severity": "critical",
  "correction": "Use parameterized queries",
  "triggers": {
    "task_signatures": ["code query review sql", "audit code sql"],
    "domains": ["code"]
  }
}

**向后兼容:**不带 triggers 的条目始终启用(v3.0.0 的行为)。config.yaml 中的 task_conditioned_retrieval: true 标志会启用此过滤器。禁用时,无论任务如何,都会加载所有条目。

排名辅助工具:scripts/retrieve.py 实现了评分逻辑。调用方(包括扫描器 Agent、P2 中的技能管理员,以及 P3 中的技能路由器)会调用 retrieve(prompt, entries, active_domains, historical_success),以在分层分类前获取排名后的子集。评分采用 scripts/task_signature.py 中归一化任务签名的 Jaccard 相似度,并乘以根据 evals/history.jsonl 得出的可选条目成功率。

加载时(阶段 0 的速查表、阶段 1 的抗体),在领域过滤之后、冷热分层分类之前,执行检索步骤:

  1. 为当前任务计算 task_signature(prompt)。
  2. 将条目与活跃领域集合传入 retrieve(...)。
  3. 仅将返回的子集传入下方的分层分类。

检索时被过滤掉的条目不会进入冷热分层——这能让扫描上下文保持精简且聚焦于任务。

执行

第 0 步 — 备忘清单注入(正向模式)

如果 mode == "scan-only",跳过此步骤。

0a. 加载备忘清单: 读取 cheatsheet_memory.json(与此技能位于同一目录)。

0b. 按领域筛选: 保留 domains 与检测到的 domains 中任意一项重合的策略,或 domains 中包含 "_global" 的策略。

0c. 分层分类(逻辑与抗体相同): 符合以下任意条件的策略为 HOT:

  • effectiveness >= 0.7
  • seen_count >= 3
  • last_seen 距今不到 30 天

其余策略均为 COLD。

0d. 限制 HOT 策略数量: 按 effectiveness 降序、再按 seen_count 降序排序。 最多保留 15 个(取自 config.yaml → cheatsheet.max_hot)。

0e. 构建备忘清单区块: 将 HOT 策略格式化为 XML:

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

如果有 COLD 策略,添加一行说明:

<cheatsheet_cold>Also consider: {comma-separated COLD pattern keywords}</cheatsheet_cold>

如果 mode == "cheatsheet-only",输出备忘清单区块并在此处停止。

记录日志:

[IMMUNE] Cheatsheet: {n_hot} HOT + {n_cold} COLD strategies (domains: {domains})

0f. 向用户呈现备忘清单: 如果单独运行(/immune),将备忘清单作为用户下一次生成时应应用的上下文展示。如果由其他系统调用,则返回 XML 区块,以便注入提示词。

第 1 步 — 加载并分类抗体(HOT/COLD)

读取 immune_memory.json 和 config.yaml(与此技能位于同一目录)。

1a. 按领域筛选: 保留 domains 与检测到的 domains 中任意一项重合的抗体,或 domains 中包含 "_global" 的抗体。

向后兼容: 如果抗体使用 "domain"(字符串)而非 "domains"(数组),则将其视为 domains = [domain]。

1b. 分层分类: 对于每个筛选出的抗体,符合以下任意条件时将其分类为 HOT:

  • severity == "critical"
  • seen_count >= 3
  • last_seen 距今不到 30 天(相对于今天的日期)

其余均为 COLD。

1c. 限制 HOT 抗体数量: 按以下顺序对 HOT 抗体排序:severity(critical > warning > info),再按 seen_count 降序。 最多保留 15 个(取自 config.yaml → tiers.hot.max_per_scan)。 如果符合 HOT 条件的抗体超过 15 个,超出的部分归入 COLD。

1d. 构建 COLD 摘要: 为每个 COLD 抗体从其 pattern 字段中提取一个简短关键词。 用逗号分隔并连接。例如:"SQL transactions, épicondylite, debug flags, tautologies"

记录日志:

[IMMUNE] Tier split: {n_hot} HOT + {n_cold} COLD / {total} total (domains: {domains})
第 2 步 — 扫描

使用以下 XML 结构化提示词启动 immune-scan Agent(Haiku):

<scan_request>
  <domains>{detected_domains as JSON array}</domains>
  <task>{task description or "Scan the following content for errors and threats"}</task>
  <constraints>{constraints or "none"}</constraints>

  <content>
{the input text/code/content to scan}
  </content>

  <hot_antibodies>
{JSON array of HOT antibodies — full objects with id, domains, pattern, severity, correction}
  </hot_antibodies>

  <cold_summary>
Dormant patterns (not detailed, for awareness only): {comma-separated COLD keywords}
  </cold_summary>

  <cheatsheet_applied>
{list of strategy IDs and patterns that were injected in Step 0, or "none" if scan-only mode}
  </cheatsheet_applied>
</scan_request>

记录日志:[IMMUNE] Scanning... ({n_hot} active antibodies) 等待结果。

如果已应用修正: 记录日志:[IMMUNE] Match {antibody_id}: {original} → {corrected} 如果检测到新威胁: 记录日志:[IMMUNE] New threat: {pattern} 如果检测到新策略: 记录日志:[IMMUNE] New strategy: {pattern}

步骤 3 — 更新免疫记忆(并使用 COLD 去重)

读取当前的 immune_memory.json。

3a. 匹配到的 HOT 抗体: 对于扫描器匹配到的每个抗体,递增 seen_count,并将 last_seen 更新为今天。

3b. 新威胁 — 与 COLD 去重: 对于 new_threats_detected 中的每个新威胁:

  1. 将其 pattern 与所有 COLD 抗体进行比较(模糊匹配 — 相同领域 + 相似关键词)。
  2. 如果匹配到某个 COLD 抗体 → 重新激活:
    • 递增该 COLD 抗体的 seen_count
    • 将其 last_seen 更新为今天
    • 记录日志:[IMMUNE] Reactivated COLD antibody {id}: {pattern}
    • 不要创建新抗体(防止重复)
  3. 如果没有匹配到 COLD 抗体且 auto_add_threats 为 true → 创建新抗体:
    • id:"AB-{next_number}"
    • domains:来自威胁的 recommended_antibody.domains(数组)
    • pattern、severity、correction:来自威胁的 recommended_antibody
    • seen_count:1
    • first_seen:今天的日期
    • last_seen:今天的日期
    • 记录日志:[IMMUNE] + New antibody {id}: {pattern}

3c. 更新统计信息:

  • 递增 stats.outputs_checked
  • 将 stats.issues_caught 增加修正项数 + 新威胁数
  • 将 stats.antibodies_total 更新为当前抗体数量

写回 immune_memory.json。

记录日志:[IMMUNE] Memory: {total} antibodies ({n_hot} hot, {n_cold} cold) | +{new} added | Reactivated: {reactivated}

步骤 3b — 更新备忘单记忆(正向模式)

如果 mode == "scan-only",或扫描结果中没有 new_strategies_detected,则跳过。

读取当前的 cheatsheet_memory.json。

3b-i. 去重: 对于 new_strategies_detected 中的每个新策略:

  1. 与所有现有策略进行比较(模糊匹配 — 领域重叠 + 模式相似)。
  2. 如果匹配到某个现有策略 → 强化:
    • 递增 seen_count
    • 将 last_seen 更新为今天
    • 调整 effectiveness:new_eff = old_eff * 0.8 + reported_eff * 0.2(指数移动平均)
    • 记录日志:[IMMUNE] Reinforced strategy {id}: {pattern} (eff: {old}→{new})
  3. 如果没有匹配项且 auto_add_strategies 为 true → 创建新策略:
    • id:"{prefix}-{next_number}"(prefix 来自 config.yaml → cheatsheet.id_prefix.{domain})
    • domains:来自该策略(数组)
    • pattern、example:来自该策略
    • effectiveness:来自该策略(或 config.yaml → cheatsheet.default_effectiveness)
    • seen_count:1
    • first_seen:今天的日期
    • last_seen:今天的日期
    • 记录日志:[IMMUNE] + New strategy {id}: {pattern}

3b-ii. 清除低效策略: 如果某个策略的 effectiveness < config.cheatsheet.min_effectiveness 且 seen_count >= 5:

  • 删除该策略
  • 记录日志:[IMMUNE] - Pruned strategy {id}: {pattern} (eff: {eff})

3b-iii. 更新统计信息:

  • 递增 stats.outputs_assisted
  • 将 stats.strategies_applied 增加已使用的备忘单策略数
  • 将 stats.strategies_total 更新为当前策略数量

写回 cheatsheet_memory.json。

记录日志:[IMMUNE] Cheatsheet: {total} strategies | +{new} added | Reinforced: {reinforced}

步骤 4 — 输出

如果没有问题:

───
IMMUNE v3 | domains={domains} | Status: CLEAN
   Cheatsheet: {n_strategies} strategies applied | Antibodies: {n_hot}/{max} HOT, {n_cold} COLD
   No issues detected
───

如果发现修正项或威胁:

───
IMMUNE v3 | domains={domains} | Status: {CORRECTED|FLAGGED}

Corrections Applied:
  [AB-XXX] {pattern} → {correction}

New Threats Detected:
  [{severity}] {pattern} — {suggested_correction}

Reactivated:
  [AB-XXX] {pattern} (was COLD, now HOT)

New Strategies Learned:
  [CS-XXX] {pattern} (eff: {effectiveness})

───
Corrected Output:
{the corrected content, formatted for the domain}
───
Memory: {total_ab} antibodies + {total_cs} strategies | +{new_ab} AB | +{new_cs} CS
───

然后以符合该领域的易读格式呈现修正后的输出。

错误处理

  • 如果 immune_memory.json 不存在:创建该文件,内容为 {"version": 3, "antibodies": [], "stats": {"outputs_checked": 0, "issues_caught": 0, "antibodies_total": 0}}
  • 如果 cheatsheet_memory.json 不存在:创建该文件,内容为 {"version": 3, "strategies": [], "stats": {"outputs_assisted": 0, "strategies_applied": 0, "strategies_total": 0}}
  • 如果 immune_memory.json 中的 "version": 2:自动迁移,将每个抗体的 "domain" 转换为 "domains": ["domain_value"],并将版本设为 3。立即写回文件。
  • 如果 Agent 返回无效 JSON:重试一次。如果仍然无效,则在报告原始输出时附上警告。
  • 如果没有提供输入,且不存在最近的输出:询问用户要扫描什么。
  • 如果所有抗体都是 COLD(没有任何抗体符合 HOT 条件):仍然发送扫描请求,并将 hot_antibodies 数组留空,同时提供完整的 cold_summary。Haiku 仍可通过 Phase 2 检测新的威胁。

评论

支持 Markdown