Caveman 探索与委派机制详解:Explorer、Cavecrew 子代理与 Delegate 工具的上下文隔离设计
在 Caveman(一个通过压缩 token 开销来优化 Claude Code 等编码代理工作流的开源项目)中,本文聚焦 探索与委派文档 讲解的核心问题:宽范围仓库检索会在开始编辑前耗尽主代理的上下文。Caveman 提供了只读 explorer 代理、三个紧凑委派的 Cavecrew 子代理,以及可选的 caveman-delegate MCP 工具,让搜索过程与结果留在独立上下文中,只把证据交还给解决者。读完本文,你将掌握这三套机制的安装命令、权限契约、输出格式约定与模型覆盖配置,并能根据任务特征决定何时委派、何时直查。
1. 问题背景:为什么搜索会吃掉主上下文
代理在处理"X 定义在哪里"这类问题时,通常要在主线程里连续发起多次文件读取和搜索。从 Cavecrew 决策指南 的说明可以看到,子代理的工具结果会被逐字注入主上下文——一次返回 2k token 散文的探索调用,每次都要在主上下文里支付 2k token 的预算。文档的解法是机制隔离:让搜索记录留在子代理自己的会话里,主代理只接收经过压缩的证据。
需要强调文档中的一个关键界定:隔离是机制,不是结果保证。explorer 和委派调用本身也会消耗模型用量,只有在总任务用量和解决质量上做了对比之后,才能声称净收益为正。
2. FastContext 风格 Explorer:只读定位代理
2.1 安装命令
CLI 提供了一个名为 fastcontext 的 Claude Code 代理文件,受 FastContext 研究启发,但不实现该论文的训练模型、也不继承论文报告的结果。安装分两个作用域:
# 为当前项目安装
cave explore install
# 为当前用户安装(写入 ~/.claude/skills,跨仓库生效)
cave explore install --user
从 CLI 源码看,explore 是一个未列入打印 help 的兼容别名,其实现直接转发到 skills 安装命令:
// packages/cli/src/index.ts
async function explore(rest: string[]) {
if (rest[0] !== "install") return exploreUsage();
const agent = flagFrom(rest, "--agent", "claude");
guardExploreAgent(agent);
return skills(["install", "caveman-explore", ...rest.slice(1), "--no-pixel"]);
}
即 cave explore install 等价于:
caveman tools skills install caveman-explore --no-pixel
--no-pixel 表示安装纯文本版 SKILL.md,不做 pixel 图像化转换。当前安装器仅支持 Claude Code:源码中的 guardExploreAgent 会对非 claude 目标直接报错退出,提示 codex 需要先在"转录隔离(transcript isolation)"上有专门验证后才接入——这与文档"保留 Codex 集成直到转录隔离有独立证明"的表述一致(见 CLI 入口)。
2.2 权限边界与引用契约
Explorer 只被授予 Read、Glob、Grep 三个工具,不能编辑文件、不能执行命令(见 explorer 代理定义 的 frontmatter:tools: Read, Glob, Grep,model: haiku)。它的输出契约是每行一个经过验证的引用:
path/to/file.ext:START-END reason location matters
规则细节:
- 行号区间必须来自 explorer 实际读取过的文件内容,禁止臆造或估算,也不得引用超出文件末尾的区间;
- 精确的小区间优于模糊的大区间;
- 回复必须是且仅是证据块——每行一个引用,无前言、无解释、无 markdown 标题;
- 当确实找不到相关内容时,契约要求返回单行
no relevant locations found,而不是编造引用。文档明确指出这种诚实回答优于猜测。
2.3 工作方式:并行撒网,尽快收网
explorer 代理定义 正文规定了工作节奏:第一轮就并行发起多个工具调用,同时覆盖互补假设——用 Glob 匹配候选路径模式、用 Grep 匹配符号和字符串、用 Read 直读最有希望的文件;之后最多再追一两轮证据即可收手。它优化的是"解决者的 token 预算",所以越快结束越好。
2.4 何时使用、何时跳过
文档给出的使用判据:
- 使用:冷启动定位(cold-start localization)、跨文件的宽范围关系梳理、或"否则会在解决者上下文里堆入大量文件读取"的搜索;
- 跳过:任务已经指名了精确文件或符号,或此前的证据已经提供了可用位置。
explorer 代理定义 的 description 字段把同一判据浓缩成了代理自身的系统提示,保证代理在会话内也会自我约束:"如果精确文件或符号已经指名,跳过我。"
3. Cavecrew:三个紧凑委派的 Claude Code 子代理
cavecrew 是一组决策指南,覆盖三个 Claude Code 子代理。Cavecrew 技能文件 的定位是:它们做的工作与 Anthropic 默认子代理(Explore、编辑型代理、reviewer)相同,区别在于返回的工具结果经过 caveman 压缩,每次委派让主上下文缩水。
3.1 三个子代理的分工
| 子代理 | 权限与输出 | 适用场景 |
|---|---|---|
| Investigator | 只读位置清单 | 定义、调用方、测试 |
| Builder | 手术式编辑 | 一到两个已知文件 |
| Reviewer | 紧凑发现项 | Diff 或文件评审 |
三个代理的完整定义分别位于 cavecrew-investigator、cavecrew-builder 和 cavecrew-reviewer。
cavecrew-investigator:只读代码定位器。输出为 path:line — 符号 — 不超过 6 词注释 的位置表,3 行以上用单词表头分组(Defs: / Refs: / Callers: / Tests: / Imports: / Sites:),单命中只出一行无表头,零命中输出 No match.,末尾给出统计行(如 2 defs, 5 refs.)。被要求修复时拒绝并回 Read-only. Spawn cavecrew-builder.。注意它的 frontmatter 里除了 Read/Grep/Glob 还包含 Bash——但限定用途是 git log -S/git grep/find 这类只读检索加速,不做变更操作。其 description 声称输出相比原生 Explore 让主线程少消耗约 60% token(见 investigator 定义 与 explorer 对比说明)。
cavecrew-builder:手术式 1-2 文件编辑,适用于错别字修复、单函数重写、机械重命名、注释清理等范围明确的小改动。工具集为 Read, Edit, Write, Grep, Glob,没有 Bash——不能执行 shell 命令、不能 push、不能删除。硬规则:3 个及以上文件范围直接拒绝(too-big. split: <n one-line tasks>.);主代理应自己负责更大的重构与跨组件决策。它的输出是"diff 回执"(receipt):
<path:line-range> — <change ≤10 words>.
verified: <re-read OK | mismatch @ path:line>.
另有三种终止态首词:too-big. / needs-confirm. / ambiguous. / regressed.,主线程可据此直接决策。
cavecrew-reviewer:diff/分支/文件评审器,每个发现项一行、带严重度标签、无客套话、无范围蔓延,格式为 path:line: <emoji> <severity>: <problem>. <fix>.,严重度分四级:🔴 bug(错误输出、崩溃、安全漏洞、数据丢失)、🟡 risk(边界情况、竞态、泄漏、性能断崖、缺失守卫)、🔵 nit(风格命名,仅在用户要求 thorough 时输出)、❓ question(需作者意图才能判断)。零发现输出 No issues.。
3.2 委派决策与串联模式
Cavecrew 技能文件 给出一张任务到代理的路由表,核心口诀是:"如果你希望子代理输出以 1/3 的 token 交付,选 cavecrew;如果你希望散文,选原生代理。" 三条串联模式:
- 定位 → 修复 → 验证(最常见):investigator 返回位置清单 → 主线程挑 1-2 个位置交给 builder → reviewer 审计 diff;
- 并行侦察(调查面很宽时):一条消息里并发 2-3 个 investigator(defs / callers / tests 不同角度),主线程聚合;
- 单点编辑(位置已知时):跳过 investigator,直接把精确
path:line交给 builder。
对应的反模式:不知道文件位置时不要用 builder(否则主线程要费 token 传上下文);不要为 5 文件重构串 investigator→builder(builder 会返回 too-big.,浪费一轮)。
3.3 模型覆盖:CAVECREW_*_MODEL 环境变量
每个子代理可以单独指定模型:
CAVECREW_REVIEWER_MODEL
CAVECREW_BUILDER_MODEL
CAVECREW_INVESTIGATOR_MODEL
覆盖的实现位于 cavecrew-model-overrides,由 caveman-activate.js 在 SessionStart 早期调用。源码揭示了文档"只补丁已安装代理 frontmatter 的 model 行"这一行为的完整规则:
- 变量未设置或为空 → 无操作;
- 值包含换行或控制字符(
\x00-\x1f\x7f)→ 忽略; - 已有
model:行 → 原位替换(如 investigator 默认的model: haiku); - 没有
model:行 → 插入到tools:之后,或关闭分隔符---之前; - 文件缺失或不在插件布局内 → 静默无操作;所有文件系统错误静默失败,绝不阻塞会话启动。
此外该 hook 还有一层安全防御(见 源码):若插件根目录位于 git 工作树内,说明当前运行的是源码 checkout 而非已安装插件——此时覆盖会被跳过,否则每次打开仓库,SessionStart 都会重写被跟踪的 agents/*.md 文件并弄脏工作树。这与文档提醒的"插件更新或重新安装会替换补丁"共同构成使用时必须了解的两个限制。
4. 可选的 caveman-delegate MCP 工具
CLI 在 execute.delegate 配置项开启时可以注册 caveman-delegate MCP server。它是显式 opt-in 的,因为委派工作会消耗独立的权限与模型用量。开启步骤:
caveman tools config set execute.delegate true
caveman tools mcp install claude --server caveman-delegate
从 CLI 源码看,execute.delegate 是一个布尔配置项,默认为 false;wrap 流程会检查该 server 是否已安装,若启用但不可用则向 stderr 提示 "delegate enabled but caveman-delegate server is unavailable; launching without delegate" 并降级为不带 delegate 启动(见 wrap 逻辑)。
delegate server 的实现是一个无依赖的 stdio MCP server(caveman-delegate-mcp),只暴露一个工具 caveman_delegate:在 pi harness 中运行一个有界的子任务并返回 worker 报告加上 provider 上报的用量。源码注释给出了选型理由——pi 子任务约 4.5k token 前缀,而裁剪过的 Claude Code 子进程最小约 30k token。可通过环境变量调参:
CAVE_DELEGATE_PROVIDER pi provider id(默认 openai-codex)
CAVE_DELEGATE_MODEL 模型 id(默认读取 ~/.codex/config.toml 的 model=,兜底 gpt-5.2-codex)
CAVE_DELEGATE_PI_BIN pi 二进制路径(默认 pi)
CAVE_DELEGATE_PI_DIR PI_CODING_AGENT_DIR 覆盖(隔离/测试用)
CAVE_DELEGATE_TIMEOUT_MS worker 超时(默认 300000 毫秒)
权限边界方面文档的表述与实现一致:宿主代理和 server 各自拥有确切的沙箱与审批行为;启用该功能不会授予超出宿主配置允许范围的更宽权限。
5. 证据规则:如何诚实地评估隔离收益
文档最后列出了五条必须遵守的评估规则,它们同样适用于使用 explorer 与 Cavecrew 的任何人:
- 把 explorer 和委派调用计入总用量——子代理调用本身就是模型开销;
- 不要从"返回的散文更短"推断整任务的节省——短输出 ≠ 净节省,必须对比总 token;
- 存在行号漂移(line drift)可能时,编辑前先验证引用——explorer 给出的
START-END区间基于它读取时的文件状态; - 基准测试中保留失败与无结果案例——
no relevant locations found这类诚实的负结果同样需要被测量; - 把论文结果当作外部研究,而非本包的性能数据——FastContext 的指标不能移用于 Caveman。
6. 小结
Caveman 的探索与委派体系围绕一个原则设计:让主代理只接收证据,不接收过程。只读 explorer 用"每行一个引用"的契约把定位任务隔离出去;Cavecrew 用三个带严格输出格式与拒绝规则的子代理覆盖定位、小编辑、评审三类高频委派;caveman-delegate 则提供了一个低前缀开销的独立 worker 通道,并以 opt-in 与宿主权限为边界。三者共同的前提是文档反复强调的评估纪律:隔离只是机制,净收益必须用总任务用量与解决质量来验证。相关实现可继续在 explorer 定义、三个子代理定义、Cavecrew 决策指南、模型覆盖 hook 和 delegate server 中查证。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0623
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00