关于 immune
immune 是用于检查文本、代码等内容的自适应技能,依据领域相关的正向策略和错误模式进行审查。它会筛选并分层记忆条目,让检查聚焦当前任务,并根据结果更新记忆。
主要功能
- 01按领域扫描内容
- 02注入正向策略清单
- 03记忆采用冷热分层
- 04按任务检索模式
- 05威胁去重与重新激活
适用场景
- 01检查代码中的常见问题
- 02依据已存指导审阅文本
- 03跨多个领域扫描输出
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ mathews-tom/ armory --skill immune安装后在 Claude Code 中输入/immune确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
cheatsheet_memory.jsonconfig.yamlimmune_memory.jsonagents/immune-scan.mdevals/cases.yamlscripts/retrieve.py详细介绍
免疫系统 v3 — 速查表 + 免疫
你使用的是一个混合式自适应系统,包含两种互补的记忆:
- 速查表(正向模式):在生成前注入特定领域的策略,以提升输出质量
- 免疫(负向模式):用于检测已知错误并在生成后发现新威胁的抗体
两种记忆都采用冷热分层,以精简上下文。
输入解析
用户会提供要扫描的内容。解析以下参数:
- input:要扫描的文本/代码/内容(必需——可直接提供,也可从上下文获取)
- domain:以下之一:fitness、code、writing、research、strategy、webdesign、_global(默认:自动检测)
- domains:领域数组(覆盖单个领域)。示例:
domains=fitness,code - constraints:输出应满足的具体要求(可选)
- mode:
full(速查表 + 扫描,默认)|scan-only(跳过速查表)|cheatsheet-only(返回速查表,不扫描)
如果未提供内联文本,则扫描对话中的最后一条实质性输出。
**领域自动检测:**读取 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 的抗体),在领域过滤之后、冷热分层分类之前,执行检索步骤:
- 为当前任务计算
task_signature(prompt)。 - 将条目与活跃领域集合传入
retrieve(...)。 - 仅将返回的子集传入下方的分层分类。
检索时被过滤掉的条目不会进入冷热分层——这能让扫描上下文保持精简且聚焦于任务。
执行
第 0 步 — 备忘清单注入(正向模式)
如果 mode == "scan-only",跳过此步骤。
0a. 加载备忘清单:
读取 cheatsheet_memory.json(与此技能位于同一目录)。
0b. 按领域筛选:
保留 domains 与检测到的 domains 中任意一项重合的策略,或 domains 中包含 "_global" 的策略。
0c. 分层分类(逻辑与抗体相同): 符合以下任意条件的策略为 HOT:
effectiveness >= 0.7seen_count >= 3last_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 >= 3last_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 中的每个新威胁:
- 将其
pattern与所有 COLD 抗体进行比较(模糊匹配 — 相同领域 + 相似关键词)。 - 如果匹配到某个 COLD 抗体 → 重新激活:
- 递增该 COLD 抗体的
seen_count - 将其
last_seen更新为今天 - 记录日志:
[IMMUNE] Reactivated COLD antibody {id}: {pattern} - 不要创建新抗体(防止重复)
- 递增该 COLD 抗体的
- 如果没有匹配到 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 中的每个新策略:
- 与所有现有策略进行比较(模糊匹配 — 领域重叠 + 模式相似)。
- 如果匹配到某个现有策略 → 强化:
- 递增
seen_count - 将
last_seen更新为今天 - 调整
effectiveness:new_eff = old_eff * 0.8 + reported_eff * 0.2(指数移动平均) - 记录日志:
[IMMUNE] Reinforced strategy {id}: {pattern} (eff: {old}→{new})
- 递增
- 如果没有匹配项且
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}
- id:"{prefix}-{next_number}"(prefix 来自
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 检测新的威胁。