muse-agent-example/harness/specs/skill-testing.md
zizi c9f69d9d6d 治理: Skill 测试治理第一阶段——harness 控制平面 + 实现测试迁出运行时目录
范围(不含 design-story-foundation、docs/、humanization/README.md 等进行中改动):

1. 新增 harness/ 控制平面
   - skill_harness.py 静态审计:32 个运行时 Skill 的 frontmatter/manifest/文档污染,当前 0 问题
   - run_selected.py 选择性执行器:manifest 与磁盘一一对账、依赖阻断、
     空跑与 skip-only 失败关闭、AST 测试形状门
   - manifests/skills.json:32 个 Skill 的合同责任方与协作领域登记
   - manifests/test-inventory.json:81 个测试资产登记
   - specs/skill-testing.md 与 README.md:测试分层、证据边界与 harness 职责

2. 实现测试从 .claude/skills/*/scripts/ 迁至 tests/skills/<skill>/
   - 71 个测试文件迁移并修复项目根与临时目录运行导入
   - 数据库触发器测试宽泛异常收窄为 psycopg.errors.RaiseException
   - 抽取离线大测试拆出真实 PG smoke(默认阻断,不计入离线通过)
   - 抽取 presence 去重边界拆出独立测试:493 + 78 = 571 项检查不变

3. 运行时文档清理
   - 13 个 SKILL.md 移除自测/离线验证段落、测试命令与测试文件事实源表述,
     只保留运行时合同;业务运行合同、额度、授权与离线模式均保留

4. SoT 同步
   - AGENTS.md:新增 Skill 领域索引(7 个合同责任方分组,覆盖 32 个运行时 Skill)
   - 领域 07:测试入口改由 harness/manifests/ 登记,SKILL.md 不承载测试命令
   - humanization 覆盖矩阵:活动测试路径同步迁移

验证证据: harness 自测 15 项 + runner 自测 13 项通过;静态审计 32 Skill / 0 问题;
73 个非数据库测试通过;8 个集成条目中 6 个 PostgreSQL 项被依赖门明确阻断;
py_compile 与 git diff --check 通过。未连接 PostgreSQL、网络、真实模型或额度。

已知边界: 真正 skill_behavior_eval 仍为 0,尚未验证任何 Skill 自然语言行为;
evaluate-frozen-replay 的 raw 存储边界冲突留待单独治理。
2026-08-19 01:50:20 +08:00

116 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Skill 测试与评测规范
> 状态:生效规范
> 适用范围:`agent-example/.claude/skills/*/SKILL.md`、其确定性工具和 Skill 行为评测。
> Owner:`agent-example/harness/`
> 本文件是开发与评测支架规范,不属于任何 Skill 的运行时提示词。
## 1. 三层边界
### 1.1 Skill 运行时指令
`SKILL.md` 只描述 Agent 执行该 Skill 时必须知道的稳定合同:唯一目的、消费者、输入、输出、schema/version、允许读取、允许副作用、禁止动作、数据库读写、授权、预算、raw 和失败关闭规则,以及实际执行所需的业务工具与流程。
`SKILL.md` 不承载开发者测试说明、测试文件路径、测试框架命令、夹具细节或测试结论。
禁止在运行时 Skill 文本中出现:
- `## 自测`、`## 测试`、`## 开发验证` 等开发测试章节;
- `test_*.py`、`*_test.py`、pytest、unittest 等实现测试入口;
- “本测试通过”“测试覆盖 N 项”等开发证据;
- 把测试文件、测试常量或测试输出说成事实源或业务合同。
评测 Skill 的生产/评测执行命令可以保留,但必须是用户请求该评测时实际执行的业务步骤,而不是验证实现代码的开发测试。
### 1.2 确定性工具验证
工具验证回答“Python、数据库或状态机实现是否守住机械合同”,不回答模型是否写得好,也不证明 Skill 的自然语言指令有效。
- 单元测试、离线合同测试和数据库集成测试属于这一层;
- 项目运行时 Skill 的实现测试统一放在 `tests/skills/<skill>/`,领域包保留自己的 `tests/`;两者都必须在 harness 的开发验证清单中登记;
- 测试通过只能证明列出的机械行为,不得升级为模型质量或产品可用性结论;
- 真实数据库、网络、模型和额度探针必须显式标记并单独授权。
### 1.3 Skill 行为评测
行为评测回答“把 Skill 内容交给 Agent 后,Agent 是否按合同行动”。评测由 harness 从外部驱动,不能由 `SKILL.md` 自己宣布通过。
行为评测至少区分:
- 正向触发:应该使用该 Skill 的任务;
- 负向触发:不应该使用该 Skill 的任务;
- 输入缺失与越界;
- 输出合同与失败关闭;
- 关键禁止动作;
- 多样例稳定性和已知混淆项。
行为评测结果必须保留输入、Skill 版本指纹、模型/运行配置、输出摘要、判定证据和失败原因。小样本合同回放不等于文学质量、通用效果或生产完成。
## 2. Harness 职责
Harness 只负责从外部发现、运行、收集和裁决测试/评测证据:
1. 扫描运行时 Skill 文档中的开发测试污染;
2. 登记和分类确定性工具测试、集成测试、fake pipeline 测试和真实探针;
3. 驱动 Skill 行为评测案例;
4. 生成带证据类型和失败原因的结构化报告;
5. 防止空跑、静默跳过、宽泛异常吞错和证据级别越权。
Harness 不负责:
- 修改 `SKILL.md` 或业务代码;
- 判断文学质量;
- 用字符串出现证明自然语言合同有效;
- 把 fake、离线回放或小样本结果升级成生产结论。
## 3. 证据分级
从低到高仅表示证据类型,不允许自动跨级:
1. 静态结构检查:frontmatter、路径、禁用污染模式;
2. 确定性离线测试:纯函数、schema、状态机和失败分支;
3. 真实依赖集成测试:PostgreSQL、文件系统或外部服务;
4. Skill 行为评测:外部 Agent/模型运行与结构化裁决;
5. 人工内容评审:文学质量、声音和语义效果。
任一层通过都不能代替更高层证据。没有行为评测,不得声称 Skill 内容有效;没有真实依赖证据,不得声称生产链路可用。
## 4. 改动门禁
### 只改运行时合同
- 通过 harness 的运行时文档污染扫描;
- 更新受影响的行为评测案例,或记录只改措辞、不改变行为的理由;
- 不新增把测试细节塞回 `SKILL.md` 的说明。
### 只改确定性工具
- 更新针对变更不变量的离线测试;
- 对真实数据库、网络和模型测试单独标记;
- 保留失败关闭和副作用边界证据。
### 改变 Skill 意图或边界
- 更新行为评测清单和正/负向案例;
- 检查消费者、Agent 槽位和 `meta/chains` 映射;
- 重新执行相关层级的验证,不得只跑 Python 单测。
## 5. 明确禁止
- 用 `assertIn` 检查几个词出现,就宣称 Skill 内容正确;
- 用测试文件或测试输出作为运行时事实源;
- 用 `except Exception: pass` 把错误依赖、连接失败或实现错误当成预期拒绝;
- 用任意总入口的“零测试”结果当成通过;
- 把离线 fake、模型探针或小样本合同回放写成真实质量结论;
- 为了让 harness 变绿而修改业务合同、降低断言或静默跳过测试。
## 6. 完成定义
本治理任务只有同时满足以下条件,才可称为完成:
- 运行时 `SKILL.md` 不再携带开发测试说明;
- harness 能机械发现并阻断明显的测试污染;
- 实现测试、集成测试和 Skill 行为评测的证据类型可区分;
- 改动范围内的回归测试真实执行,失败不会被吞掉;
- 报告明确区分已验证事实、推断和未验证的模型质量假设。