专栏 REA 解剖

技能:一份 525 行的调查协议

工具告诉模型"能调什么",技能告诉它"什么时候调、按什么顺序、什么算完成"。REA 的 525 行 SKILL.md 不是说明书,是一份带恢复路径的调查协议。

技能:一份 525 行的调查协议

REA 安装到客户端的东西有两样:一个 MCP server,一份技能文件。

MCP server 提供能力,技能文件提供方法。前者是”你能调什么”,后者是”你什么时候该调、按什么顺序调、什么算做完、做砸了怎么办”。

很多人把 skill 当成更长的工具说明。REA 的写法不是这样:它的 SKILL.md 只有 525 行,真正的细节放在 7 份参考文档里,合计 2,480 行;主文件负责路由和纪律,参考文档负责领域细节。

第一段就在说”什么时候不要用”

技能的开头不是功能介绍,而是适用边界:

Use REA when a claim depends on a shipped binary or package, decompilation, requested runtime evidence, or comparison with behavior not established by available source. For ordinary analysis of a complete source repository, use normal repository tools and do not run REA readiness or provider commands.

这句话挡掉了一大类误用:用户只是想让 Agent 读一个开源仓库,结果 Agent 先跑一遍 doctor、再装引擎、再开二进制分析。技能明确说:有完整源码的普通架构分析,不要用 REA。

接下来还有一条更细的:

Do not run diagnostics or setup before every investigation.

工具连得上就直接干活;连不上再按恢复路径处理。把”诊断”当成每次调查的仪式,是 Agent 常见的浪费。

路由表:先认目标,再选工具

SKILL.md 的第二节叫 “Route the target first”,列了一张目标到首个工具的映射:

目标 第一个工具
ASAR / 解包后的 JS/Electron 目录 analyze_javascript_application
ZIP/APK/IPA/MSIX/AppX/DMG/PyInstaller open_binary → inspect_artifact
Apple plist / IB / 资源目录 open_bundle_resources
Android APK 代码 inspect_android_package
.NET 程序集 inspect_managed_artifact
固件镜像 inspect_firmware_regions / extract_firmware
原生程序行为 运行时工作流(Frida / GDB / 进程捕获)
已打开的浏览器页面 list_browser_targets
HAR/SAZ 流量 inspect_web_network_capture

这张表解决的是”工具太多,模型从哪开始”的问题。172 个工具里,大多数只在特定目标上有意义;先认目标,就把候选缩到了一个族。

证据纪律写在主文件里

技能里最重要的一段,不是工具用法,而是这句话:

Every conclusion must distinguish observations, inferences, and unknowns. Cite Evidence IDs, preserve limitations and incomplete coverage, and never imply that static analysis observed execution.

它要求模型在回答里做三件事:

  1. 把”看到的”、”算出来的”、”猜的”分开。
  2. 引用 Evidence ID,而不是只说”源码显示”。
  3. 保留 limitations 和 coverage,不把静态分析说成运行时观测。

这不是文风要求,是输出契约。REA 的 Evidence 已经把这些字段准备好了;技能负责让模型真的去用它们。

调查是一个循环,不是一次调用

“Plan broader investigations” 这一节给了七步:

  1. 把请求拆成问题清单,写清每个答案需要什么证据。
  2. 检查当前会话、目标身份、已有数据库、书签和旧证据,能复用就复用。
  3. 从最小的概览或清单开始,沿入口追到状态变化和结果。
  4. 同时看打包资源和配置,不要只读代码。
  5. 用证据类型匹配结论:静态答不了的问题才上运行时。
  6. 能并行的独立问题分给 worker,要求返回来源、结论和未解缺口。
  7. 维护一份 finding ledger:结论、Evidence ID、置信度、搜索边界、剩余未知。

最后一条最重要:调查结束前要回到最初的问题清单,逐条标记 answered / partially answered / unresolved。不能因为”大部分都答了”就说调查完成。

恢复路径是按故障分的

技能里有一份 connection-and-recovery.md,它不把所有失败都归为”重装”:

  • 工具不在目录里:检查注册和客户端。
  • 调用被客户端拦:检查审批策略。
  • provider 不可用:检查引擎安装和宿主。
  • 启动超时:区分”还在跑”和”已经死了”。
  • 连接断开:只在安全可重试时重试一次。
  • 插件安装:走插件自己的恢复路径,不要跑 setup。

这种分法避免了一个常见循环:Agent 遇到任何问题都跑一遍 setup,装完还是不通,再跑一遍。

技能本身也能被检索

技能文件不是一次性塞进上下文的。REA 提供两个工具:

  • search_guidance:按问题在安装好的技能包里找章节。
  • read_guidance_section:按 locator 读回完整章节。

限制是 1 MiB / 文件、4 MiB / bundle、4,096 个 section;locator 带内容哈希,技能包换了版本会报 stale,而不是返回旧内容。

这样主文件可以保持短,细节按需加载。模型不需要在开局就背下 2,480 行。

安装:版本化,可回滚

rea setup 会把技能文件复制到客户端目录(共享路径是 ~/.agents/skills),同时写 MCP 注册。它有几个约束:

  • 注册里记录绝对 runtime 和入口脚本,不依赖 npx 的临时缓存。
  • 覆盖已有文件前先备份,备份路径写进计划。
  • 只改 REA 自己的注册和技能文件,不动别的配置。
  • doctor 只读;uninstall 只删 REA 拥有的东西。

插件安装(Claude Code / Codex)是另一条路:插件把技能和 MCP 注册打包在一起,升级走插件机制,不走 setup。

技能不是强制

最后要说清楚:技能是 instructions,不是 enforcement。模型可以不读、可以读错、可以读了不照做。

REA 没有把安全性寄托在技能上。真正强制的东西在 server 里:schema 校验、路径检查、进程监管、证据哈希、响应预算。技能负责的是”在没人强制的地方,让模型有一个正确的默认动作”。

用一句话收束这个专栏:

工具让模型有力气,技能让它有纪律,证据让它可被审计。

三者缺一,逆向 Agent 都只是一个会说话的 strings。