2026 Coding Harness 实现图谱:Skill、上下文与扩展系统
AI Coding 产品常被放进一张“功能对比表”,但模型、API、Harness 和最终产品并不在同一层。把 Kimi 模型和 Claude Code 的本地文件扫描放在一起比较,或者用 API 的 Prompt Cache 解释 CLI 的 Skill 热更新,都会制造错误结论。
更稳定的比较单位是 Coding Harness:它位于模型与代码仓库之间,负责发现指令、装配上下文、暴露工具、执行 Hook、派生子 Agent,并在长会话里处理压缩与恢复。
核验日期:2026-07-17。表格只记录官方文档和官方更新日志能够支持的事实。未公开的实现统一标成“未知”,不根据相似产品补齐。
先确定比较层级
| 层级 | 主要职责 | 不应混入的结论 |
|---|---|---|
| 模型 | 推理、上下文容量、工具调用格式、多模态能力 | 不负责扫描本地 SKILL.md |
| API / Provider | 请求协议、鉴权、缓存计费、托管工具 | 不等于 CLI 每轮如何装配上下文 |
| Coding Harness | 指令发现、Skill 目录、工具运行、compact、Hook、子 Agent | 本文的主要比较对象 |
| 能力包 | Rules、Skills、Commands、Plugins、MCP 配置 | 需要由 Harness 解释和执行 |
| 产品 | IDE、终端、账户、套餐、团队治理、云端任务 | 同一 Harness 可能有多个产品入口 |
“支持 Skill”至少包含发现、目录暴露、触发、正文加载、资源访问和会话生命周期六个环节。只看到一个 SKILL.md 文件夹,无法判断正文是否已经进入模型上下文。
版本与证据锚点
不同项目的文档版本策略不一致。没有绑定单一发行版的文档,只能作为核验日的当前契约,不能反推某个历史版本已经具备同样行为。
| 对象 | 本文采用的版本锚点 | 可以确认的演进事实 | 不能从该锚点推出的事实 |
|---|---|---|---|
| Claude Code | 2026-07-17 官方文档快照;相关页面未绑定单一 CLI 版本 | 当前 Skill、compact、Hook、Plugin、Subagent 契约 | 各能力首次发布的准确版本 |
| Codex | 2026-07-17 Codex 官方文档快照;相关页面未绑定单一 CLI 版本 | 当前 AGENTS、Skill、Hook、Plugin、Subagent 契约 | 文档行为在旧版 CLI 中的起始时间 |
| OpenCode | 2026-07-17 官方文档快照;页面未绑定单一发行版 | 当前 Rules、Skills、Plugin、Agent、MCP 契约 | Skill 热更新和 compact 恢复的内部细节 |
| Cursor Agent | 当前官方文档;Cursor 2.4、2.5 更新日志 | 2.4 引入 Skills 与 Subagents;2.5 扩展 Plugins 与嵌套异步 Subagents | 当前所有细节从 2.4 起就完全一致 |
| Kimi Code CLI | 0.26.0,发布于 2026-07-16 |
0.1.0 完成 TypeScript/Node 重写;0.20.1 增加 Plugin 生命周期 Hook;0.24.2 重命名动态工具加载能力;0.26.0 扩展 coder 子 Agent | Kimi 模型或 Kimi Agent 产品自动继承 CLI 行为 |
这张表表达的是证据强度,不是产品排名。当前文档回答“现在公开承诺什么”,更新日志回答“某个日期发生过什么”,两者都不能代替未公开的运行时源码。
Coding Harness 的组件结构
组件图把静态组件、运行时数据和恢复链路放在同一个边界内。不同产品会合并其中若干组件,但职责仍可分开辨认。
flowchart LR
subgraph Sources["Instruction Sources"]
Rules["AGENTS / CLAUDE / Rules"]
Skills["Skill Directories"]
Config["User / Project Config"]
Plugins["Plugin Packages"]
end
subgraph Harness["Coding Harness"]
Scanner["Discovery Scanner"]
Catalog["Metadata Catalog"]
Router["Trigger Router"]
Loader["Body and Resource Loader"]
Assembler["Context Assembler"]
Tools["Tool Registry"]
Hooks["Hook Dispatcher"]
Session["Session Journal"]
Compact["Compactor"]
Recover["Recovery Policy"]
Agents["Subagent Runtime"]
end
Model["Model Turn"]
Runtime["Filesystem / Shell / MCP"]
Rules --> Scanner
Skills --> Scanner
Config --> Scanner
Plugins --> Scanner
Scanner --> Catalog
Catalog --> Router
Router --> Loader
Loader --> Assembler
Rules --> Assembler
Tools --> Assembler
Assembler --> Model
Model --> Tools
Tools --> Runtime
Hooks -.observe and gate.-> Tools
Plugins --> Tools
Plugins --> Hooks
Model --> Session
Session --> Compact
Compact --> Recover
Recover --> Assembler
Model --> Agents
Agents --> Runtime
这里有三个容易混淆的边界:
- Scanner 读到了文件,不代表 Loader 已经把全文送进模型。
- Tool Registry 保存了工具,不代表每个工具的完整 schema 都常驻上下文。
- Compactor 生成了摘要,不代表被加载过的 Skill 正文一定会自动恢复。
指令来源与发现范围
| Harness | 常规指令来源 | Skill 来源 | 发现与优先级的公开契约 |
|---|---|---|---|
| Claude Code | CLAUDE.md 家族及受管配置 |
项目 .claude/skills、用户 ~/.claude/skills、Plugin、Enterprise |
启动时暴露 Skill 名称与描述;处理嵌套目录文件时可发现更深层 Skill |
| Codex | 全局 ~/.codex/AGENTS.override.md 或 AGENTS.md;项目根到当前目录的 AGENTS.md |
项目层级的 .agents/skills、用户 $HOME/.agents/skills、管理员 /etc/codex/skills、内置 Skill |
每次运行构建指令链;项目指令由根到当前目录叠加,离当前目录更近的文件优先 |
| OpenCode | 项目与全局 AGENTS.md、CLAUDE.md 回退、配置中的 instructions |
项目和全局的 .opencode/skills、.claude/skills、.agents/skills |
从当前目录向 Git worktree 根查找;可通过权限规则限制具体 Skill |
| Cursor Agent | .cursor/rules/*.mdc、AGENTS.md |
项目和用户的 .agents/skills、.cursor/skills,兼容 .claude/skills 与 .codex/skills |
先发现并呈现可用 Skill;Rules 可按 Always、Auto Attached、Agent Requested、Manual 应用 |
| Kimi Code CLI | $KIMI_CODE_HOME/AGENTS.md、~/.agents/AGENTS.md、项目 .kimi-code/AGENTS.md 或 AGENTS.md |
Project、User、Extra、Built-in 四层;项目 .kimi-code/skills、.agents/skills,用户目录同理 |
优先级为 Project > User > Extra > Built-in;支持自动匹配和 /skill:name 手动调用 |
目录兼容只解决了可移植性的第一步。即使几个 Harness 都识别 .agents/skills,它们对元数据预算、重复调用、热更新和 compact 恢复的处理仍可能不同。
目录、触发与正文加载
| Harness | 模型先看到什么 | 触发方式 | 正文与资源怎样进入运行时 |
|---|---|---|---|
| Claude Code | 可用 Skill 的名称和描述 | 模型自动选择或用户 /skill;可用 disable-model-invocation 禁止自动触发 |
触发后把渲染后的正文作为一条消息加入会话;可按引用读取脚本、参考资料和资源 |
| Codex | 名称、描述和路径;初始 Skill 列表有上下文预算 | $skill、/skills 或依据描述隐式选择 |
选择后读取完整 SKILL.md;脚本与 references 按需使用 |
| OpenCode | skill 工具描述中的可用 Skill 元数据 |
模型调用原生 skill 工具,权限可设为 allow、deny、ask |
调用后加载正文;支持随 Skill 保存脚本和资源 |
| Cursor Agent | 发现后的可用 Skill 目录 | Agent 依据描述选择或用户通过 / 手动触发;可禁止模型调用 |
SKILL.md 正文及 scripts、references、assets 渐进加载 |
| Kimi Code CLI | 已发现 Skill 的目录信息 | 依据 description、whenToUse 自动匹配,或 /skill:name 手动调用 |
展开占位符后把正文发送给模型;Skill 可嵌套调用,公开上限为三层 |
Codex 的初始 Skill 列表预算值得单独标注:官方文档规定,列表最多占模型上下文的 2%;无法得知上下文大小时使用 8,000 字符上限。超出预算时先缩短描述,仍超出则可能省略部分 Skill 并发出警告。这是目录预算,不是 Skill 正文的大小上限。
Claude Code 的“正文作为一条消息加入会话”也比“按需读取文件”更具体。它说明正文进入了对话历史,因此重复调用和 compact 恢复都需要独立规则。
会话生命周期:热更新、重复调用与压缩恢复
这一组行为经常被“其他产品也是这样”的推断替代。只有 Claude Code 公开了较完整的三段式契约;其余产品存在的空白需要保留。
| Harness | Skill 热更新 | 同一 Skill 再次调用 | compact 后恢复 |
|---|---|---|---|
| Claude Code | 监视已存在的 Skill 目录,可在当前会话识别增删改;会话启动时不存在的顶层目录需要重启;Plugin 的 Hook、MCP、Agent 需 /reload-plugins |
渲染内容相同只追加简短的 already loaded 提示;内容变化则追加完整正文 | 最近一次调用的每个 Skill 可重新附着,单个最多 5K tokens,共享 25K tokens 预算,按新到旧处理 |
| Codex | 自动检测 Skill 变化;未出现更新时官方建议重启 | 未公开去重、替换或追加规则 | 支持 /compact,但 Skill 正文是否单独恢复、恢复预算多少未公开 |
| OpenCode | 文档公开通用文件 watcher,但未承诺 Skill 文件的热更新语义 | 未公开 | 支持自动 compact 与预留 token 配置,但被调用 Skill 如何进入摘要或恢复未公开 |
| Cursor Agent | 当前 Skill 文档未公开热更新语义 | 未公开 | 当前公开文档未说明 Skill 正文在压缩后的保留或重挂规则 |
| Kimi Code CLI | Skill 文档未公开专用热更新语义;Plugin MCP 可通过 /reload 或新会话刷新 |
未公开 | 支持自动 compact 和 /compact,但 Skill 正文的保留、摘要或重挂规则未公开 |
“有 compact”只能证明 Harness 会压缩会话。要判断一个 Skill 在压缩后是否仍然有效,还需要知道:
- 正文是否被普通摘要吸收;
- 是否保存独立的 Skill 调用记录;
- 是否在恢复阶段重新注入;
- 是否有单 Skill 和总量预算;
- 内容变化后采用旧版本还是新版本。
除 Claude Code 外,当前官方材料无法完整回答这些问题。
工具发现、缓存与扩展系统
Skill 解决“如何做”,Tool 解决“能够调用什么”。两者都可能渐进披露,但缓存对象并不相同。
| Harness | 工具发现与缓存的公开事实 | Hooks | Plugins | Subagents |
|---|---|---|---|---|
| Claude Code | MCP 工具可接入;工具搜索可先暴露名称、再按需取得完整定义 | 支持生命周期 Hook | Plugin 可打包 Skill、Hook、MCP、Agent 等 | 支持独立上下文、工具与权限配置 |
| Codex | 支持内置工具和 MCP;公开文档没有完整定义工具目录裁剪、schema 缓存和失效算法 | 支持 hooks.json 或配置中的 Hook |
Plugin 可组合 Skills、MCP 应用或配置、Hooks | 支持派生 Agent 和专门角色 |
| OpenCode | MCP 工具加入后自动可用且会增加上下文;Plugin 的 npm 依赖缓存于 ~/.cache/opencode/node_modules,这不等于模型 Prompt Cache |
通过 Plugin 事件 Hook 扩展 | 支持本地 JS/TS 和 npm Plugin | 支持 primary agent、subagent 与 task 工具 |
| Cursor Agent | 支持 MCP;完整工具 schema 的渐进披露和缓存失效细节未公开 | 当前文档支持 Hooks | 2.5 起 Plugin 可打包 Skills、Subagents、MCP、Hooks、Rules | 2.4 起支持;2.5 增加异步和嵌套能力 |
| Kimi Code CLI | MCP 工具与内置工具共同暴露;0.24.2 将动态工具加载能力名由 select_tools 改为 dynamically_loaded_tools;0.26.0 记录模型或 effort 切换会使现有 Prompt Cache 失效 |
支持工具、会话、compact、subagent 等生命周期 Hook | 可打包 Skills、sessionStart Skill、MCP、Hooks、Commands | 内置 coder、explore、plan;0.26.0 扩展 coder 的后台任务、计划、Skill 调用与嵌套 Agent |
至少要区分四类“缓存”:
| 缓存对象 | 典型用途 | 不能直接说明什么 |
|---|---|---|
| Prompt Cache | 复用请求前缀的模型计算 | Skill 文件是否被重新扫描 |
| Skill Catalog Cache | 避免反复扫描目录和元数据 | 正文是否常驻模型上下文 |
| Tool Schema Cache | 延迟或复用工具定义 | 工具执行结果是否缓存 |
| Plugin Package Cache | 复用已下载依赖 | 模型请求是否命中 Prompt Cache |
OpenCode 的 npm Plugin 缓存与 Kimi Code 的 Prompt Cache 失效属于不同层。把两者写成同一个“缓存管理能力”,比较结果没有可解释性。
Kimi 必须拆成四层
Kimi 相关材料容易发生层级串线。Kimi Code CLI 的更新日志不能证明 Kimi 模型具备 Skill 扫描能力;Kimi Agent 的帮助页也不能直接替代 CLI 文档。
flowchart TB
Model["Model Layer<br/>K3 / K2.7 Code<br/>reasoning and context"]
API["API and Provider Layer<br/>Kimi / OpenAI / Responses / Anthropic / Google / Vertex protocols"]
Harness["Harness Layer<br/>Kimi Code CLI 0.26.0<br/>Skills, AGENTS, sessions, compact, tools, hooks, plugins, subagents"]
Product["Product Layer<br/>Kimi Code service, CLI, VS Code<br/>Kimi Agent is a separate product surface"]
Product --> Harness
Harness --> API
API --> Model
| Kimi 层级 | 2026-07-17 可确认事实 | 不应归到这一层的能力 |
|---|---|---|
| 模型 | Kimi Code 文档列出 K3,最长 1M 上下文;K2.7 Code 为 256K | 本地 Skill 扫描、Plugin 重载、AGENTS 优先级 |
| API / Provider | Kimi Code CLI 可配置 Kimi、OpenAI、Responses、Anthropic、Google、Vertex 等 Provider 类型 | 项目目录发现和会话 compact 策略 |
| Harness | Kimi Code CLI 0.26.0 负责 Skills、AGENTS、session、compact、MCP、Hooks、Plugins、Subagents | 模型套餐、IDE 账户和通用 Kimi Agent 行为 |
| 产品 | Kimi Code 服务提供 CLI、VS Code 等入口;Kimi Agent 有独立的 Skill 产品说明 | 不能用 Kimi Agent 帮助页填补 CLI 未公开的重复调用语义 |
Kimi Code CLI 0.1.0 在 2026 年 5 月转向 TypeScript/Node 基础并包含子 Agent。之后的变化显示,能力扩展已经从单个命令转向插件生命周期、动态工具目录和可嵌套子 Agent。这个演进属于 Harness,不是模型架构演进。
能力演进不是功能清单变长
Coding Harness 的演进可以按控制面拆成六个阶段。产品可能跨阶段实现,也可能只公开其中一部分,因此这张图仍然不是成熟度排名。
flowchart LR
A["Static Instructions<br/>whole-file prompt"]
B["Scoped Rules<br/>directory and path precedence"]
C["Skill Catalog<br/>metadata first"]
D["Progressive Loading<br/>body and resources on demand"]
E["Context Lifecycle<br/>hot reload, reinvoke, compact recovery"]
F["Execution Ecosystem<br/>hooks, plugins, MCP, subagents"]
G["Dynamic Control Plane<br/>tool search, budgets, cache invalidation"]
A --> B --> C --> D --> E --> F --> G
静态指令阶段主要回答“模型应遵守什么”。Scoped Rules 增加目录作用域和覆盖关系。Skill Catalog 将可用能力的元数据与正文分离,避免启动时塞入全部操作手册。
渐进加载把 Skill 进一步拆成入口正文、脚本、参考资料和资源。上下文生命周期阶段开始处理文件变更、重复调用和压缩恢复;Claude Code 当前公开契约在这一段最具体。
Hook、Plugin、MCP 和 Subagent 将 Harness 从单循环执行器变成扩展平台。动态控制面继续处理工具目录预算、按需 schema、缓存失效和多 Agent 调度。Kimi Code 0.24.2 与 0.26.0、Cursor 2.4 与 2.5 提供了带日期的演进锚点。
Claude Code、Codex 和 OpenCode 的当前文档能够证明它们已经覆盖多个阶段,但公开材料不足以精确还原每个能力的首次发布时间。缺失的时间点保持未知,比用文档更新时间猜测发布历史更可靠。
当前仍然未知的关键实现
| 问题 | Claude Code | Codex | OpenCode | Cursor Agent | Kimi Code CLI |
|---|---|---|---|---|---|
| Skill 目录是否有进程内缓存 | 公开热更新行为,但底层缓存结构未知 | 未完整公开 | 未公开 | 未公开 | 未公开 |
| 重复调用采用去重、替换还是追加 | 已公开:相同内容短提示,变化内容追加全文 | 未公开 | 未公开 | 未公开 | 未公开 |
| compact 后是否专门重挂 Skill | 已公开,且有 5K / 25K 预算 | 未公开 | 未公开 | 未公开 | 未公开 |
| 工具 schema 的目录预算与淘汰算法 | 部分工具搜索行为公开,完整算法未知 | 未公开 | 未公开 | 未公开 | 动态加载存在,完整算法未知 |
| Prompt Cache 与 Skill 变更如何联动 | 未形成完整公开契约 | 未公开 | 未公开 | 未公开 | 已公开模型或 effort 切换失效;Skill 变更联动未知 |
| 子 Agent 是否继承父会话已加载 Skill | 取决于 Agent 配置,通用继承规则未完整公开 | 未完整公开 | 未公开 | 未公开 | coder 可调用 Skill,但通用继承规则未公开 |
这些空白不是待填充的产品缺陷,而是公开可验证边界。源码、运行日志或后续官方文档可以缩小边界;在证据出现前,矩阵不应替实现做决定。
读取这张图谱的方法
评估一个 Coding Harness 时,可以沿一条 Skill 的生命周期逐项核验:
- 哪些目录被扫描,作用域和优先级是什么;
- 模型初始只看到元数据,还是已经拿到正文;
- 自动触发、显式触发和权限控制如何组合;
- 脚本、参考资料和资源在何时读取;
- 文件变化后目录与正文如何刷新;
- 重复调用如何处理相同或变化的内容;
- compact 后依靠摘要、重挂还是重新读取;
- 子 Agent、Plugin、Hook 和 MCP 是否共享同一上下文边界;
- 所谓缓存到底缓存请求前缀、Skill 目录、工具 schema 还是依赖包。
这条核验链把“支持 Skill”拆成可验证行为,也能避免用 UI 上的同名功能推断底层实现。长任务稳定性通常取决于目录预算、恢复策略和扩展边界,而不是 UI 中是否存在一个 Skill 菜单。
系列文章
- AI Coding Agent 的上下文操作系统:组件、生命周期与阅读地图
- AI Coding Agent 的上下文栈:组件边界与装配顺序
- 从 Rules 到 Agent Skills:能力加载机制的演变
- AI Coding Agent 的 Skill 加载机制深度解析
- 一次 AI Coding Agent Turn 的上下文生命周期
- Messages 数组与 Prompt Cache:六种操纵策略
- Context Paging:Compact、外部化、恢复与 Memory 生命周期
参考资料
Claude Code:
Codex:
OpenCode:
Cursor:
Kimi:




