“所有评测配置都合法,所以所有 Skill 都验证过了。”

“智能体能生成结果,所以这个 Skill 已经在生产环境中证明有效。”

这两句话的问题是证据跨级了,不是语法。PASS 只对某个检查、某个用例、某个环境和某个证据范围负责。

四个证据等级

SQEM 把证据分成四层:

等级名称能支持的典型结论
E1静态结构定义、元数据、引用和静态规则通过
E2评测某些行为契约、规则、评判器或回归用例得到观察
E3运行时在真实智能体运行框架、基准测试或模型与智能体组合中运行过
E4真实项目有真实项目使用、真实失败、用户反馈和长期记录

E1 很重要,但只证明工程结构。E2 可以说明特定用例的行为。E3 说明实际运行时里观察过。E4 才开始接近长期实践证据。它们不是质量等级,也不能互相自动替换。

PASS 到底证明什么

一条结果应该写成带范围的陈述:

在版本 V、智能体 A、模型 M、环境 E 下,用例 C 的行为检查 = PASS。

而不是:

Skill 的一次检查标记为 PASS,所以它可靠、兼容、有效。

后一句把多个未执行的结论偷渡进来了。

状态模型

评测契约允许使用这些状态:

状态含义
PASS当前检查在当前范围内满足预期
FAIL有证据表明预期没有满足
PARTIAL只有部分要求或部分环境得到支持
NOT_RUN尚未执行
BLOCKED因环境、工具、凭据或事件缺失无法完成
INSUFFICIENT_EVIDENCE已有观察,但不足以支持目标结论

“没有观察到失败”不等于 PASS。没有运行也不等于失败。缺少 skill.selection 追踪记录时,正确状态是 BLOCKED,不是“没有触发”。

一个常见的证据跨级

假设仓库检查了:

  • SKILL.md 存在;
  • frontmatter 合法;
  • 评测 YAML 可以解析;
  • 引用文件路径存在。

这些结果可以支持:

规范与 Skill 包检查 = PASS
证据等级 = E1 静态

它们不能直接支持:

  • 智能体一定会正确触发;
  • 模型一定会遵守行为契约;
  • 使用 Skill 比不使用 Skill 更好;
  • 另一个智能体或模型也兼容;
  • 真实项目长期使用没有问题。

这些声明分别需要 E2、E3 或 E4 的对应证据。

质量声明门禁

质量声明应该与证据一一对应:

声明需要的证据
“支持 Codex”Codex 运行时证据
“改善测试设计质量”对比基准证据
“跨模型可用”跨模型证据
“已在生产中证明”真实项目证据
“所有引用均有效”静态引用验证

这不意味着每个 Skill 都必须拥有所有证据,而是要求团队说清楚目前能作出哪些声明。

质量画像的正确用法

可以用一张质量画像汇总当前状态:

Skill: functional-testing
版本:x.y.z
目标测试级别:L3 已评估
当前测试级别:L2 已验证

Q1 规范       PASS
Q2 设计       PASS
Q3 Skill 包    PASS
Q4 行为       PASS
Q5 有效性     NOT_RUN
Q6 兼容性     PARTIAL
Q7 证据/演进  PASS

证据等级:E2 评测
已知缺口:
- 基准测试尚未执行
- 跨模型证据不完整
- 真实项目证据有限

这张表没有把 Skill 压成一个总分,也没有假装未知项已经被验证。它让下一步行动变得具体。

skill-change-verification 的价值在这里

变更验证 Skill 不只是列检查命令。它要求准确说明证据支持什么、哪些没有执行、还有哪些残余风险。

例如 skill-up validate 通过,可以作为静态或结构证据;它不是运行时语义验证。一次命令行冒烟检查可以说明安装路径走通;它不能证明跨模型兼容。一次人工输出看起来不错,可以作为观察记录;它不能替代基准测试或真实项目证据。

报告标题可能掩盖这些边界,所以状态和证据等级应该直接写出来。

输入不完整时的诚实输出

现实任务经常缺少环境、凭据、版本或选择事件。此时报告可以这样写:

触发:BLOCKED
原因:缺少 skill.selection 追踪记录
行为检查:NOT_RUN
原因:未提供运行时目标
静态包检查:PASS
证据等级:E1 静态
质量声明:仅限于 Skill 包有效性

这份报告看起来没有那么“绿”,但它不会把未知变成事实。后续拿到环境后,也知道应该从哪里继续。

把一句质量声明拆成证据

团队如果在运行检查前就写清楚什么算证据,质量声明会容易处理很多。“支持 Codex”需要明确目标宿主、Skill 版本、代表性请求、实际观察到的选择和行为,以及保留下来的追踪记录;“改善测试设计质量”需要和明确的基线做比较;“已经在生产中证明”则需要真实项目观察,并且上下文足以解释当时发生了什么。

用一张简单的声明映射表记录五项:声明内容、所需证据等级、当前状态、已知缺口和下一步动作。它不需要把每个状态都填成 PASS,作用是避免一次静态包检查被误当成运行时或生产证据。

这样也更容易维护文档。证据过期、依赖变化或某个运行时不再可用时,把受影响的声明调整为 PARTIAL、NOT_RUN 或 BLOCKED 即可,不用重写整篇说明。这些限制也应该写进产物。

安装与调用

npx skills add https://github.com/naodeng/awesome-qa-skills/tree/main/skills/en --skill skill-change-verification
请使用 skill-change-verification Skill。
对每项检查,记录状态、证据等级、运行时元数据、限制,以及它能支持的具体声明。
分别记录静态验证、触发证据、行为证据、基准测试证据、兼容性证据和真实项目证据。
检查无法执行时,保留 NOT_RUN、BLOCKED 或 INSUFFICIENT_EVIDENCE 状态。

两个实际问题

PASS 越多,质量画像就越好吗?

不一定。关键是 PASS 是否覆盖了与目标声明相关的风险。一个只有静态 PASS 的质量画像,可能比一个诚实标出基准测试 NOT_RUN 的质量画像更不完整。

PARTIAL 会不会显得项目质量很差?

它只说明证据范围有限。清楚的 PARTIAL 比无依据的“全面通过”更方便决策,也更容易安排下一步验证。

参考

分享