Skill 的回归不一定表现为“模型突然完全不会了”。更常见的是小改动改变了行为边界:description 变了,智能体不再触发;主提示词增加了一项要求,输出开始编造细节;引用文件换了路径,关键规则没有加载;模型升级后,原本稳定的行为开始漂移。

所以“文件能解析、静态检查通过”不能代替回归验证。

先按变更类型看影响

不同变化影响的运行时环节不同:

变更可能影响最小关注点
description发现、触发、选择正向、异常、边界
SKILL.md 工作流行为、输出、轨迹行为、回归、必要时运行时
参考资料知识、引用和边界相关用例、引用完整性
脚本或模板产物、副作用脚本、产物、副作用
评测预期证据解释和回归可信度评测有效性、评判器校准
模型或智能体触发和输出稳定性多次运行、兼容性

变更范围决定回归范围。跑了全量静态检查,不代表覆盖了真正变化的行为。

把真实失败沉淀为回归用例

SQEM 建议把真实失败整理成可重复的回归用例:

观察到失败
-> 保存证据
-> 复现
-> 分类
-> 确认根因
-> 修复
-> 回归用例
-> 现有用例集
-> 发布证据

这里的关键不是“失败出现过”,而是已经确认它是什么问题。没有根因的失败,可能来自 Skill、评测、基础设施或未知条件;直接加入回归套件只会把噪声保存下来。

用 skill-change-verification 选择最小验证

skill-change-verification 的职责是根据变更范围选择最小但足够的检查,并准确说明证据能支持什么结论。它要求把变更分为内容、元数据/目录、脚本、评测和运行时影响,再记录命令、结果、未执行项和残余风险。

一个实际变更可能是:只修改了 functional-testing 的 description,新增一个触发短语。合理的最小验证应关注:

  1. 结构和元数据仍然合法;
  2. 原有正向用例仍能触发;
  3. 异常和边界用例没有新增误触发;
  4. 如果缺少 skill.selection 追踪记录,状态写成 BLOCKED,不猜测;
  5. 输出结论只覆盖真正运行过的智能体和模型。

没有必要因为改了一行 description 就重跑所有高成本基准测试,但也不能只看 git diff 就说“没有影响”。

拉取请求、发布和定期检查

变更验证可以按所需时间和成本分层:

拉取请求阶段

静态验证
关键评测
变更 Skill 的评测
回归冒烟检查

发布阶段

全部相关评测
回归测试套件
选定的基准测试
选定的兼容性测试
证据报告

定期检查阶段

跨模型测试
跨智能体测试
扩展基准测试
长期回归测试

这样可以把低成本、确定性强的反馈留在拉取请求阶段,把成本更高、波动更大的检查放到发布或定期任务中。

回归报告应该写什么

一个可复核的报告至少说明:

  • 变更版本和影响范围;
  • 执行了哪些用例;
  • 使用的智能体、模型、工具和环境;
  • 每条结论的状态和证据等级;
  • 哪些检查没有执行,以及为什么;
  • 是否发现 Skill、评测、基础设施或原因未知的问题;
  • 修复后新增了哪条回归用例。

“全量检查通过”不是完整报告。它没有告诉下一位维护者全量检查到底覆盖了什么。

回归测试和基准测试不是一回事

回归测试比较旧版本和当前版本,问的是“有没有破坏既有行为”。基准测试比较不使用 Skill 和使用 Skill,问的是“有没有带来增益”。

同一版本的回归测试可以通过,但基准测试仍未证明 Skill 有效;反过来,基准测试显示出增益,也不代表某次 description 修改没有漏掉边界用例。

把两个结果分开记录,讨论会简单很多。

怎样把一条回归用例写完整

一条真实失败记录,只有整理成别人可以重新运行的用例后,才有价值。至少把六件事放在一起:观察到的症状、发生变化的范围、已经确认的根因、能够暴露问题的最小输入、预期保持稳定的行为,以及证明结果的产物。

比如修改 description 后,一个常见请求不再触发目标 Skill,就保存这个请求和相邻的异常请求,记录旧版本与当前版本的选择结果,并说明边界为什么发生了变化。回归用例只覆盖最相关的部分,不要因为原始失败很复杂,就悄悄把它扩成一次完整的基准测试。

用例还需要维护规则。如果预期行为发生变化,就同时更新预期和变更原因;如果只是实现发生变化,但行为应该保持稳定,就保留用例并重新运行。没有负责人维护的回归套件,最后会变成堆满旧假设的博物馆。

安装与调用

npx skills add https://github.com/naodeng/awesome-qa-skills/tree/main/skills/zh --skill skill-change-verification
请使用 skill-change-verification Skill。
变更范围:修改 functional-testing 的 description,增加一个中文触发短语。
请选择最小但充分的静态检查、触发检查、边界检查和回归检查。
记录已执行的命令及结果、未执行项目、证据等级和残余风险。
没有 skill.selection 证据时标记为 BLOCKED,不要推断触发成功或失败。

两个实际问题

只改参考资料,也需要回归吗?

需要。引用内容可能改变判断、边界和输出。先评估引用是否会影响核心行为,再选择相关用例,不必机械地跑所有项目。

回归全部 PASS,就能写“没有任何风险”吗?

不能。回归只覆盖已选择的历史和代表性行为。环境、模型、未执行用例和新输入仍然可能存在缺口。

参考

分享