产物校验
校验用同一条命令回答两个不同的问题。针对源码,它问的是项目是否描述了一个合法的捆绑包;针对 产物,它问的是输出的字节是否就是清单所承诺的字节。
validate --artifact、mcp 与 hooks 都能在项目源码已被删除的情况下针对已构建产物工作。这是刻意
如此:只有在源码树存在时才能通过校验的产物,其实并不算自包含;测试中的
packed-deleted-source 证明级别存在的理由与此相同。
内容寻址,而不是路径存在性
agent-bundle.manifest.json 为每个输出文件记录一份 SHA-256 摘要,包括被复制的脚本与资源。产物校验
把真实字节与这些摘要比对,因此被手工改过的生成文件会失败,而不会因为路径还在就通过。被引用的文件同样
会被检查——清单声明的 logo 若在产物中缺失或逃逸出部署树,会报告 AB6025。
每条诊断都是一份结构化记录:稳定的 AB 代码、一个严重级别、一条消息,通常还有 sourcePath 与一条
recovery 提示。由诊断把关的命令——build、prepack、validate、doctor、install 与 dev——只有
存在 error 级诊断时才以非零退出;warning 与 info 绝不会为构建、校验或 dev 重建把关。eval 与 inspect
在试验失败或无定论、或模型无效时也会以 1 退出,这与错误诊断无关——见
命令行退出码。
Claude Code 严格校验
当 Claude Code 位于 PATH 上时,产物校验会为输出的 claude target 以及统一的 plugin target 运行
claude plugin validate <bundle-dir> --strict:
- 宿主的 error 会变成 Agent Bundle 的 error。
- 宿主的 warning 保持为 warning,除非设置了
agent-bundle validate --strict。 - 二进制文件缺失会被报告为一次显式的信息性跳过,绝不会伪造成功。
CI 应当使用严格校验:
当需要确定性的、只看 schema 的检查时使用 --no-host-validation ——没有安装这些宿主的机器也必须能运行
同一道门禁,并得到同样的 schema 结论。
在开发期,你可以在不安装的情况下加载一个已构建 target 并核实注册情况:
Codex 与 Cursor:被固定的 schema
Codex 与 Cursor 目前都没有发布插件校验的开发者动词,因此 Agent Bundle 用自己 vendored 的、被固定的 schema 校验它们输出的 JSON 文档,并把宿主的 schema 生成器视为一个漂移信号,绝不当作替代的插件契约。
AB6031 是其中最值得注意的一条:当 Codex 生成的 schema 与被固定的版本不一致时,只有在 Codex 发布了
匹配的契约之后才会更新这个固定版本。自动跟随宿主的实时输出,会把一次上游变更变成这里一次无声的契约变更。
Agent Skills 规范 lint
AB6034 是针对输出字节的 error:某份 SKILL.md 拥有合法的 YAML frontmatter,但其后没有 Markdown
指令正文。被固定的 Agent Skills 规范要求 frontmatter 之后必须跟随 Markdown 内容,而这项检查针对的是
产物实际包含的内容,而不是编写时的源码。
哈希固定与仓库自有的表格
哈希固定覆盖那些真实来源位于本仓库之外、且可能漂移的 vendored 外部内容:src/adapters/schemas/* 下的
宿主文档 schema(其上游 URL、commit 与 SHA-256 记录在 PROVENANCE.json 中)、清单 agentSkills 块中
由 Agent Skills 规范派生的 schema 固定值,以及为完整性而记录的输出产物文件与源输入。
仓库自有的能力表格与证据不做哈希。能力证据记录被观察到的宿主版本(observedVersion)与 target,
适配器则携带一个单调递增的 adapterRevision。Git 已经为仓库自有内容做了版本管理;在仓库内部再哈希一遍
是自我指涉的,并且会让每次编辑表格都产生变动噪声。
npm prepack 门禁
prepack 运行发布构建与 npm pack --dry-run --json --ignore-scripts,随后对精确的包与产物清单、清单
哈希、包 bin 目标以及发布版本一致性把关。--output 是相对 --root 的产物路径,会覆盖配置中的
output.distPath,默认值为 artifact。把它用作 npm 的 prepack 脚本;--ignore-scripts 可防止递归,
而且任何 npm 生命周期都绝不会执行宿主安装。
发布构建同样会拒绝完全没有发布版本的项目(AB4013),因此已发布的产物绝不会携带
0.0.0-dev.<short-revision> 这个开发期回退值。声明的 plugin.version 与 package.json 不一致时会
报告 AB4008 警告。