文件最后提交记录最后更新时间
feat(tests/system): ST 框架新增正向看护能力(skill_activated 程序化断言 + Distractor 沙箱注入) Co-authored-by: hello_simida<wangyi206@huawei.com> Co-authored-by: zzZzz__zzZzz<821946509@qq.com> # message auto-generated for no-merge-commit merge: !254 merge skilltest into master feat(tests/system): ST 框架新增正向看护能力(skill_activated 程序化断言 + Distractor 沙箱注入) Created-by: zzZzz__zzZzz Commit-by: zzZzz__zzZzz;hello_simida Merged-by: cann-robot Description: ## 描述 本 PR 在 ST 框架现有的双 Phase 验证(静态结构 + AI 语义评测)基础上,新增 **正向看护(Forward Verification)能力** —— 验证 AI 在多个干扰 skill 同时可用的真实环境中,仍能正确选择并激活目标 skill。同时修复了 ST 文档与实际代码不一致的多处问题,并优化了评测报告的错误展示。 正向看护采用**程序化断言**(不依赖 AI 评审模型):从导出的 session JSON 中精确匹配 tool=skill 事件的 state.input.name,给出确定性判断。 ### 新特性 New Features - 【tests/system 程序化断言】test_skill_evals.py 新增 [skill_activated] 类型 Expectation:从 ses.json 解析所有 tool=skill 事件的 state.input.name(fallback 到 state.metadata.name),与期望 skill 名严格匹配;失败时列出实际激活的 skill 列表辅助定位。 - 【tests/system Distractor 配置】evals_parser.py 新增解析 case-level ## Config - Distractor skills: a;b;csandbox_manager 支持在沙箱 .opencode/skills/ 下同时部署目标 + 多个 distractor skill 的目录树(默认软链接,不重复复制)。 - 【tests/system HTML 正向看护块】conftest.py 新增 _parse_skill_activated_block 钩子,将正向看护失败渲染为紫色专属块:清晰展示"期望激活"vs"实际加载"对比 + 失败原因提示,与普通 contains/file 类失败块视觉区分。 - 【tests/system 示例用例】cases/cann-env-setup_evals.md 新增 Case 7「正向看护 - 多 skill 环境下正确触发目标 skill」:4 个 distractor + [skill_activated] cann-env-setup 断言。 ### 特性增强 - 【tests/system 报告优化】所有断言错误改为中文 + 过滤无关 traceback 行,提升评审可读性。 - 【tests/system 配置修复】skill-test.configskill_dirs 路径 model/skills 修正为 model,与实际仓库目录结构对齐。 - 【tests/system 静态验证扩展】test_skill_basic.py 新增 test_eval_cases_distractor_skills_valid —— 校验 distractor skill 名称在仓库中真实存在。 ### 文档更新 - 【tests/system ST 设计指南】ST_DESIGN_AND_DEVELOPMENT_GUIDE.md 大幅修订:补充缺失 skill 项、修正用例计数、移除无效引用、新增正向看护章节(+173/-97 行)。 ## 关联的Issue <!-- 暂未关联 Issue --> ## 测试 - **Phase 1 静态验证**:36/36 PASSED(含新增 distractor 字段校验) - **_validate_skill_activated 单元行为**:6 种场景人工注入 session JSON 验证全部符合预期(命中 input.name / 命中 metadata.name fallback / 加载错误 skill / 未加载任何 skill / 多 skill 命中 / 空 pattern 配置错误) - **沙箱多 skill 部署**:Case 7 的 1 目标 + 4 distractor 全部在 .opencode/skills/ 下完成软链接部署,SKILL.md 均可达 - **HTML 正向看护块渲染**:手工注入失败 longrepr 后 _parse_skill_activated_block 输出正确包含期望/实际对比与紫色样式 - **main.py 主流程**:Phase 1 → Phase 2 → 归档 zip 编排正常,exit code 反映失败状态 - **evals_parser 字段提取**:Case 7 正确解析出 distractor_skills=[ascendc-task-focus, npu-arch, ascendc-docs-search, ascendc-runtime-debug][skill_activated] cann-env-setup ## 文档更新 - 更新 tests/system/docs/ST_DESIGN_AND_DEVELOPMENT_GUIDE.md:补充正向看护章节、修正用例计数、移除无效引用。 ## 类型标签 <!-- [x] 表示选中 --> - [x] 🌟 新特性 - [x] ✨ 特性增强 - [ ] 🐛 Bug 修复 - [ ] ⚡ 性能优化 - [x] 🧪 测试用例 - [ ] 📦 构建 / CI - [x] 📝 文档更新 - [x] 🔧 配置变更 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] ♻️ 代码重构 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: ## 流水线故障排查 <!-- 如果下方的流水线检查未通过,可参考以下指引进行自助修复 --> > **UT_Test 未通过?** > 请在下方流水线表格的 **UT_Test** 行,点击右侧的 >>>>> 下载 **CANNBot-skills UT 测试报告**(HTML 格式)。 > 打开报告后,展开页面中的「UT Test 失败修复指南」,复制其中的提示词并粘贴给 Agent,Agent 将根据日志自动定位并修复问题。 See merge request: cann/cannbot-skills!2547 天前
feat(tests/system): ST 框架新增正向看护能力(skill_activated 程序化断言 + Distractor 沙箱注入) Co-authored-by: hello_simida<wangyi206@huawei.com> Co-authored-by: zzZzz__zzZzz<821946509@qq.com> # message auto-generated for no-merge-commit merge: !254 merge skilltest into master feat(tests/system): ST 框架新增正向看护能力(skill_activated 程序化断言 + Distractor 沙箱注入) Created-by: zzZzz__zzZzz Commit-by: zzZzz__zzZzz;hello_simida Merged-by: cann-robot Description: ## 描述 本 PR 在 ST 框架现有的双 Phase 验证(静态结构 + AI 语义评测)基础上,新增 **正向看护(Forward Verification)能力** —— 验证 AI 在多个干扰 skill 同时可用的真实环境中,仍能正确选择并激活目标 skill。同时修复了 ST 文档与实际代码不一致的多处问题,并优化了评测报告的错误展示。 正向看护采用**程序化断言**(不依赖 AI 评审模型):从导出的 session JSON 中精确匹配 tool=skill 事件的 state.input.name,给出确定性判断。 ### 新特性 New Features - 【tests/system 程序化断言】test_skill_evals.py 新增 [skill_activated] 类型 Expectation:从 ses.json 解析所有 tool=skill 事件的 state.input.name(fallback 到 state.metadata.name),与期望 skill 名严格匹配;失败时列出实际激活的 skill 列表辅助定位。 - 【tests/system Distractor 配置】evals_parser.py 新增解析 case-level ## Config - Distractor skills: a;b;csandbox_manager 支持在沙箱 .opencode/skills/ 下同时部署目标 + 多个 distractor skill 的目录树(默认软链接,不重复复制)。 - 【tests/system HTML 正向看护块】conftest.py 新增 _parse_skill_activated_block 钩子,将正向看护失败渲染为紫色专属块:清晰展示"期望激活"vs"实际加载"对比 + 失败原因提示,与普通 contains/file 类失败块视觉区分。 - 【tests/system 示例用例】cases/cann-env-setup_evals.md 新增 Case 7「正向看护 - 多 skill 环境下正确触发目标 skill」:4 个 distractor + [skill_activated] cann-env-setup 断言。 ### 特性增强 - 【tests/system 报告优化】所有断言错误改为中文 + 过滤无关 traceback 行,提升评审可读性。 - 【tests/system 配置修复】skill-test.configskill_dirs 路径 model/skills 修正为 model,与实际仓库目录结构对齐。 - 【tests/system 静态验证扩展】test_skill_basic.py 新增 test_eval_cases_distractor_skills_valid —— 校验 distractor skill 名称在仓库中真实存在。 ### 文档更新 - 【tests/system ST 设计指南】ST_DESIGN_AND_DEVELOPMENT_GUIDE.md 大幅修订:补充缺失 skill 项、修正用例计数、移除无效引用、新增正向看护章节(+173/-97 行)。 ## 关联的Issue <!-- 暂未关联 Issue --> ## 测试 - **Phase 1 静态验证**:36/36 PASSED(含新增 distractor 字段校验) - **_validate_skill_activated 单元行为**:6 种场景人工注入 session JSON 验证全部符合预期(命中 input.name / 命中 metadata.name fallback / 加载错误 skill / 未加载任何 skill / 多 skill 命中 / 空 pattern 配置错误) - **沙箱多 skill 部署**:Case 7 的 1 目标 + 4 distractor 全部在 .opencode/skills/ 下完成软链接部署,SKILL.md 均可达 - **HTML 正向看护块渲染**:手工注入失败 longrepr 后 _parse_skill_activated_block 输出正确包含期望/实际对比与紫色样式 - **main.py 主流程**:Phase 1 → Phase 2 → 归档 zip 编排正常,exit code 反映失败状态 - **evals_parser 字段提取**:Case 7 正确解析出 distractor_skills=[ascendc-task-focus, npu-arch, ascendc-docs-search, ascendc-runtime-debug][skill_activated] cann-env-setup ## 文档更新 - 更新 tests/system/docs/ST_DESIGN_AND_DEVELOPMENT_GUIDE.md:补充正向看护章节、修正用例计数、移除无效引用。 ## 类型标签 <!-- [x] 表示选中 --> - [x] 🌟 新特性 - [x] ✨ 特性增强 - [ ] 🐛 Bug 修复 - [ ] ⚡ 性能优化 - [x] 🧪 测试用例 - [ ] 📦 构建 / CI - [x] 📝 文档更新 - [x] 🔧 配置变更 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] ♻️ 代码重构 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: ## 流水线故障排查 <!-- 如果下方的流水线检查未通过,可参考以下指引进行自助修复 --> > **UT_Test 未通过?** > 请在下方流水线表格的 **UT_Test** 行,点击右侧的 >>>>> 下载 **CANNBot-skills UT 测试报告**(HTML 格式)。 > 打开报告后,展开页面中的「UT Test 失败修复指南」,复制其中的提示词并粘贴给 Agent,Agent 将根据日志自动定位并修复问题。 See merge request: cann/cannbot-skills!2547 天前
feat(tests/system): ST 框架新增正向看护能力(skill_activated 程序化断言 + Distractor 沙箱注入) Co-authored-by: hello_simida<wangyi206@huawei.com> Co-authored-by: zzZzz__zzZzz<821946509@qq.com> # message auto-generated for no-merge-commit merge: !254 merge skilltest into master feat(tests/system): ST 框架新增正向看护能力(skill_activated 程序化断言 + Distractor 沙箱注入) Created-by: zzZzz__zzZzz Commit-by: zzZzz__zzZzz;hello_simida Merged-by: cann-robot Description: ## 描述 本 PR 在 ST 框架现有的双 Phase 验证(静态结构 + AI 语义评测)基础上,新增 **正向看护(Forward Verification)能力** —— 验证 AI 在多个干扰 skill 同时可用的真实环境中,仍能正确选择并激活目标 skill。同时修复了 ST 文档与实际代码不一致的多处问题,并优化了评测报告的错误展示。 正向看护采用**程序化断言**(不依赖 AI 评审模型):从导出的 session JSON 中精确匹配 tool=skill 事件的 state.input.name,给出确定性判断。 ### 新特性 New Features - 【tests/system 程序化断言】test_skill_evals.py 新增 [skill_activated] 类型 Expectation:从 ses.json 解析所有 tool=skill 事件的 state.input.name(fallback 到 state.metadata.name),与期望 skill 名严格匹配;失败时列出实际激活的 skill 列表辅助定位。 - 【tests/system Distractor 配置】evals_parser.py 新增解析 case-level ## Config - Distractor skills: a;b;csandbox_manager 支持在沙箱 .opencode/skills/ 下同时部署目标 + 多个 distractor skill 的目录树(默认软链接,不重复复制)。 - 【tests/system HTML 正向看护块】conftest.py 新增 _parse_skill_activated_block 钩子,将正向看护失败渲染为紫色专属块:清晰展示"期望激活"vs"实际加载"对比 + 失败原因提示,与普通 contains/file 类失败块视觉区分。 - 【tests/system 示例用例】cases/cann-env-setup_evals.md 新增 Case 7「正向看护 - 多 skill 环境下正确触发目标 skill」:4 个 distractor + [skill_activated] cann-env-setup 断言。 ### 特性增强 - 【tests/system 报告优化】所有断言错误改为中文 + 过滤无关 traceback 行,提升评审可读性。 - 【tests/system 配置修复】skill-test.configskill_dirs 路径 model/skills 修正为 model,与实际仓库目录结构对齐。 - 【tests/system 静态验证扩展】test_skill_basic.py 新增 test_eval_cases_distractor_skills_valid —— 校验 distractor skill 名称在仓库中真实存在。 ### 文档更新 - 【tests/system ST 设计指南】ST_DESIGN_AND_DEVELOPMENT_GUIDE.md 大幅修订:补充缺失 skill 项、修正用例计数、移除无效引用、新增正向看护章节(+173/-97 行)。 ## 关联的Issue <!-- 暂未关联 Issue --> ## 测试 - **Phase 1 静态验证**:36/36 PASSED(含新增 distractor 字段校验) - **_validate_skill_activated 单元行为**:6 种场景人工注入 session JSON 验证全部符合预期(命中 input.name / 命中 metadata.name fallback / 加载错误 skill / 未加载任何 skill / 多 skill 命中 / 空 pattern 配置错误) - **沙箱多 skill 部署**:Case 7 的 1 目标 + 4 distractor 全部在 .opencode/skills/ 下完成软链接部署,SKILL.md 均可达 - **HTML 正向看护块渲染**:手工注入失败 longrepr 后 _parse_skill_activated_block 输出正确包含期望/实际对比与紫色样式 - **main.py 主流程**:Phase 1 → Phase 2 → 归档 zip 编排正常,exit code 反映失败状态 - **evals_parser 字段提取**:Case 7 正确解析出 distractor_skills=[ascendc-task-focus, npu-arch, ascendc-docs-search, ascendc-runtime-debug][skill_activated] cann-env-setup ## 文档更新 - 更新 tests/system/docs/ST_DESIGN_AND_DEVELOPMENT_GUIDE.md:补充正向看护章节、修正用例计数、移除无效引用。 ## 类型标签 <!-- [x] 表示选中 --> - [x] 🌟 新特性 - [x] ✨ 特性增强 - [ ] 🐛 Bug 修复 - [ ] ⚡ 性能优化 - [x] 🧪 测试用例 - [ ] 📦 构建 / CI - [x] 📝 文档更新 - [x] 🔧 配置变更 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] ♻️ 代码重构 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: ## 流水线故障排查 <!-- 如果下方的流水线检查未通过,可参考以下指引进行自助修复 --> > **UT_Test 未通过?** > 请在下方流水线表格的 **UT_Test** 行,点击右侧的 >>>>> 下载 **CANNBot-skills UT 测试报告**(HTML 格式)。 > 打开报告后,展开页面中的「UT Test 失败修复指南」,复制其中的提示词并粘贴给 Agent,Agent 将根据日志自动定位并修复问题。 See merge request: cann/cannbot-skills!2547 天前
feat(tests/system): ST 框架新增正向看护能力(skill_activated 程序化断言 + Distractor 沙箱注入) Co-authored-by: hello_simida<wangyi206@huawei.com> Co-authored-by: zzZzz__zzZzz<821946509@qq.com> # message auto-generated for no-merge-commit merge: !254 merge skilltest into master feat(tests/system): ST 框架新增正向看护能力(skill_activated 程序化断言 + Distractor 沙箱注入) Created-by: zzZzz__zzZzz Commit-by: zzZzz__zzZzz;hello_simida Merged-by: cann-robot Description: ## 描述 本 PR 在 ST 框架现有的双 Phase 验证(静态结构 + AI 语义评测)基础上,新增 **正向看护(Forward Verification)能力** —— 验证 AI 在多个干扰 skill 同时可用的真实环境中,仍能正确选择并激活目标 skill。同时修复了 ST 文档与实际代码不一致的多处问题,并优化了评测报告的错误展示。 正向看护采用**程序化断言**(不依赖 AI 评审模型):从导出的 session JSON 中精确匹配 tool=skill 事件的 state.input.name,给出确定性判断。 ### 新特性 New Features - 【tests/system 程序化断言】test_skill_evals.py 新增 [skill_activated] 类型 Expectation:从 ses.json 解析所有 tool=skill 事件的 state.input.name(fallback 到 state.metadata.name),与期望 skill 名严格匹配;失败时列出实际激活的 skill 列表辅助定位。 - 【tests/system Distractor 配置】evals_parser.py 新增解析 case-level ## Config - Distractor skills: a;b;csandbox_manager 支持在沙箱 .opencode/skills/ 下同时部署目标 + 多个 distractor skill 的目录树(默认软链接,不重复复制)。 - 【tests/system HTML 正向看护块】conftest.py 新增 _parse_skill_activated_block 钩子,将正向看护失败渲染为紫色专属块:清晰展示"期望激活"vs"实际加载"对比 + 失败原因提示,与普通 contains/file 类失败块视觉区分。 - 【tests/system 示例用例】cases/cann-env-setup_evals.md 新增 Case 7「正向看护 - 多 skill 环境下正确触发目标 skill」:4 个 distractor + [skill_activated] cann-env-setup 断言。 ### 特性增强 - 【tests/system 报告优化】所有断言错误改为中文 + 过滤无关 traceback 行,提升评审可读性。 - 【tests/system 配置修复】skill-test.configskill_dirs 路径 model/skills 修正为 model,与实际仓库目录结构对齐。 - 【tests/system 静态验证扩展】test_skill_basic.py 新增 test_eval_cases_distractor_skills_valid —— 校验 distractor skill 名称在仓库中真实存在。 ### 文档更新 - 【tests/system ST 设计指南】ST_DESIGN_AND_DEVELOPMENT_GUIDE.md 大幅修订:补充缺失 skill 项、修正用例计数、移除无效引用、新增正向看护章节(+173/-97 行)。 ## 关联的Issue <!-- 暂未关联 Issue --> ## 测试 - **Phase 1 静态验证**:36/36 PASSED(含新增 distractor 字段校验) - **_validate_skill_activated 单元行为**:6 种场景人工注入 session JSON 验证全部符合预期(命中 input.name / 命中 metadata.name fallback / 加载错误 skill / 未加载任何 skill / 多 skill 命中 / 空 pattern 配置错误) - **沙箱多 skill 部署**:Case 7 的 1 目标 + 4 distractor 全部在 .opencode/skills/ 下完成软链接部署,SKILL.md 均可达 - **HTML 正向看护块渲染**:手工注入失败 longrepr 后 _parse_skill_activated_block 输出正确包含期望/实际对比与紫色样式 - **main.py 主流程**:Phase 1 → Phase 2 → 归档 zip 编排正常,exit code 反映失败状态 - **evals_parser 字段提取**:Case 7 正确解析出 distractor_skills=[ascendc-task-focus, npu-arch, ascendc-docs-search, ascendc-runtime-debug][skill_activated] cann-env-setup ## 文档更新 - 更新 tests/system/docs/ST_DESIGN_AND_DEVELOPMENT_GUIDE.md:补充正向看护章节、修正用例计数、移除无效引用。 ## 类型标签 <!-- [x] 表示选中 --> - [x] 🌟 新特性 - [x] ✨ 特性增强 - [ ] 🐛 Bug 修复 - [ ] ⚡ 性能优化 - [x] 🧪 测试用例 - [ ] 📦 构建 / CI - [x] 📝 文档更新 - [x] 🔧 配置变更 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] ♻️ 代码重构 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: ## 流水线故障排查 <!-- 如果下方的流水线检查未通过,可参考以下指引进行自助修复 --> > **UT_Test 未通过?** > 请在下方流水线表格的 **UT_Test** 行,点击右侧的 >>>>> 下载 **CANNBot-skills UT 测试报告**(HTML 格式)。 > 打开报告后,展开页面中的「UT Test 失败修复指南」,复制其中的提示词并粘贴给 Agent,Agent 将根据日志自动定位并修复问题。 See merge request: cann/cannbot-skills!2547 天前
feat(sandbox): skill 沙箱默认使用软链接代替复制,增加token消耗限制 Co-authored-by: hello_simida<wangyi206@huawei.com> # message auto-generated for no-merge-commit merge: !289 merge master into master feat(sandbox): skill 沙箱默认使用软链接代替复制,增加token消耗限制 Created-by: hello_simida Commit-by: hello_simida Merged-by: cann-robot Description: ## 描述 将 skill 评测沙箱中 skill 目录的部署方式从 shutil.copytree 复制改为 os.symlink 软链接。每个 skill 有 5-6 个 eval case 时,不再重复拷贝同一份 skill 文件,显著节省磁盘空间并加快沙箱创建速度。 ### 改动内容 - **sandbox_manager.py**: __init__ 新增 use_symlink 参数(默认 True),create_skill_link 按模式选择 symlink_tocopytree - **conftest.py**: sandbox_manager fixture 读取 SKILL_SANDBOX_COPY=1 环境变量可切回复制模式(opt-out) - **test_skill_evals.py**: collect_generated_files 利用已有 original_skill_dir 参数过滤软链接追踪到的源 skill 文件 ### 使用方式 ```bash # 默认:软链接模式 python3 scripts/main.py --repo-root ... --changed-files "ops/ascendc-task-focus/SKILL.md" # 切回复制模式 SKILL_SANDBOX_COPY=1 python3 scripts/main.py ... ``` ## 关联的Issue 无 ## 测试 - [x] 默认模式(软链接)端到端测试:基础验证 17/17 PASS,AI 语义评测 5/5 PASS - [x] --fast 回归测试:10/10 PASS,0 失败 - [x] 沙箱清理后源文件完好无损 - [x] 复制模式 opt-out 功能正常 ## 类型标签 - [x] ✨ 新特性 See merge request: cann/cannbot-skills!2898 天前
README.md

Skill 测试框架

基于变更文件识别受影响的 skills,执行对应的评测用例,输出 HTML 测试报告。用于 CI/CD 门禁检查,确保 skills 代码变更质量。

核心工作流程

输入:repo_root + changed_files
    │
    ├─ 步骤1:识别受影响的 skills
    │   └─ 从变更文件路径中提取 skill 目录名
    │
    ├─ 步骤2:加载评测用例
    │   └─ 读取 tests/system/cases/<skill>_evals.md
    │
    ├─ 步骤3:执行评测
    │   ├─ Phase 1: 静态结构验证(test_skill_basic.py)
    │   └─ Phase 2: AI 语义评测(test_skill_evals.py)
    │       ├─ 创建独立沙箱
    │       ├─ 通过 opencode CLI 执行 skill,收集回复
    │       ├─ 使用独立 AI 模型评审回复质量
    │       └─ 生成 HTML 报告(含评分和交互详情)
    │
    ├─ 步骤4:保存结果(HTML 报告 + JSON 日志归档)
    │
    └─ 返回:通过/失败状态

输入参数

参数 必填 说明 默认值
repo_root 必填 仓库根目录的绝对路径 -
changed_files 必填 变更文件列表(空格分隔,支持相对或绝对路径) -
--parallel / -p 并行 worker 数,auto=CPU 核数 - 1,或指定数字如 4 1 (顺序执行)
--report-only 仅从已有沙箱 JSON 文件重新生成 HTML 报告,不执行测试 false
--eval-id 仅运行指定 ID 的评测用例(传入 pytest) 全部

输出结果

文件 说明
results/<skill>_evals_validation.html 每个受影响 skill 的 Phase 2 语义评测 HTML 报告(含评分和交互详情)
logs/test_results_<timestamp>.zip logs/ 与 results/ 目录的归档压缩包,供流水线下载

HTML 报告结构

报告包含每个评测用例的一行记录,展示:

  • Result — 通过/失败徽章
  • Skill — skill 名称
  • 描述 — 用例中文描述(如"AI 语义评测")
  • 评测得分 — 百分制分数,颜色标识:>=80 绿色,>=60 黄色,<60 红色,未解析显示
  • TestId — 参数化测试节点 ID,格式 <skill>::eval_<N>
  • Duration — 执行耗时

点击行可展开查看交互详情,包含:

  • 输入 Prompt
  • 预期要点
  • AI 思考过程的工具调用
  • AI 最终回复
  • 评审结果(含各维度得分说明)

测试阶段

Phase 1:静态结构验证(test_skill_basic.py)

无需 AI 调用,快速验证 skill 的结构完整性:

  • _evals.md 文件存在性、格式合法性、必填字段检查
  • 每个 eval case 的 id、prompt、expected_output 格式校验
  • SKILL.md 存在性、YAML frontmatter 格式校验

Phase 2:AI 语义评测(test_skill_evals.py)

使用 opencode CLI 执行评测用例,验证 skill 的实际表现:

  • 执行 Session:向 skill 发送 prompt,收集 AI 回复
  • 评测 Session:独立评测模型评审回复质量
  • 断言验证:检查 expectations 中的 contains / not_contains 模式

评分标准

评审模型按四个维度评分(总分 100,>= 60 通过):

维度 分值 说明
信息覆盖度 0-40 是否完整覆盖预期回复中的关键要点
技术准确性 0-30 技术信息是否正确,无错误或误导
回复质量 0-20 结构清晰、逻辑连贯、简洁直接
Token 消耗 0-10 回复长度合理,思考过程工具调用高效

评测用例格式(evals.md)

评测用例文件存放在 tests/system/cases/<skill>_evals.md,使用 Markdown + YAML frontmatter 格式:

---
skill_name: skill-name
eval_mode: text        # text(默认)或 file_based
---

每个用例以 # Case <N>: <标题> 开头,包含以下章节:

Config(可选)

用例级配置,格式 - Key: value

配置项 类型 说明 默认值
Eval Mode string text(语义评审)或 file_based(文件产出验证) text
Max Tokens int Token 消耗上限,超过则用例失败 无限制
## Config
- Eval Mode: file_based
- Max Tokens: 50000

Prompt

发送给 skill 的用户问题。

Expected Output

预期回答的要点描述,供评审模型评分时参考。

Expectations

可选的断言列表,格式 - [contains] 期望内容,用于模式匹配验证。

# Case 1: 检查NPU驱动安装命令

## Prompt

我有一台昇腾服务器,想检查NPU驱动是否已安装,应该用什么命令?

## Expected Output

回复应说明使用 npu-smi info 命令检查驱动

## Expectations

- [contains] npu-smi info

沙箱隔离机制

每个评测用例在独立的沙箱目录中执行,确保互不干扰:

tests/system/sandboxes/
├── <skill>_eval_1/
│   ├── .opencode/
│   │   ├── opencode.json                    # opencode 工具权限白名单配置
│   │   └── skills/
│   │       └── <skill>/                     # skill 目录(默认软链接,指向源目录)
│   └── logs/                                # session 导出 JSON
│       ├── <skill>_case_1_ses.json          # 执行 session 数据
│       └── <skill>_case_1_review_ses.json   # 评审 session 数据
├── <skill>_eval_2/
│   └── ...
└── ...

Skill 目录默认使用软链接指向源目录,避免每个用例重复复制 skill 文件,节省磁盘空间和创建时间。 若需切回复制模式(Agent 可写源文件),设置环境变量 SKILL_SANDBOX_COPY=1

SKILL_SANDBOX_COPY=1 python tests/system/scripts/main.py \
    --repo-root . \
    --changed-files ops/foo/SKILL.md

logs/ 目录下的 JSON 文件可在测试后用于分析或重新生成报告。

使用方式

完整执行评测

python tests/system/scripts/main.py \
    --repo-root /path/to/repo \
    --changed-files ops/ascendc-st-design/SKILL.md

仅重新生成报告(不执行测试)

当已有沙箱 JSON 文件时,跳过测试执行,仅重新生成 HTML 报告(用于验证报告展示效果或修复报告生成逻辑后):

python tests/system/scripts/main.py \
    --report-only \
    --repo-root . \
    --changed-files ops/cann-env-setup/SKILL.md

通过 gate_check.sh 调用(CI 门禁)

# 方式1:手动指定变更文件
export CHANGED_FILES="ops/ascendc-st-design/SKILL.md"
export REPO_ROOT="/path/to/repo"
./tests/gate_check.sh

# 方式2:Git 自动检测(对比 origin/master HEAD 变更)
./tests/gate_check.sh

# 方式3:指定目标分支对比
export CI_MERGE_REQUEST_TARGET_BRANCH_NAME="main"
./tests/gate_check.sh

并行执行

Phase 2 的 eval 用例相互独立,可通过 --parallel 并行执行:

python tests/system/scripts/main.py \
    --repo-root /path/to/repo \
    --changed-files ops/foo/SKILL.md \
    --parallel auto

配置

编辑 tests/system/config/skill-test.config 调整扫描路径:

skill_dirs:
  - "ops"
  - "graph"
  - "model/skills"
exclude_skills:
  - "skill-test-framework"

依赖安装

pip install -r tests/system/scripts/requirements.txt

目录结构

tests/system/
├── README.md                    # 本文档
├── config/
│   └── skill-test.config        # 扫描路径与白名单配置
├── docs/
│   └── USER_GUIDE.md            # 详细使用指南
├── cases/                       # 集中式评测用例定义
│   └── <skill>_evals.md
├── results/                     # HTML 报告输出目录
├── logs/                        # 运行日志与归档压缩包
├── sandboxes/                   # 沙箱隔离目录(用例级别)
└── scripts/
    ├── main.py                  # CI 门禁主入口
    ├── conftest.py              # pytest 共享配置、钩子、工具函数
    ├── evals_parser.py          # evals.md Markdown 解析器
    ├── opencode_runner.py       # opencode CLI 封装(流式输出、Session 导出)
    ├── sandbox_manager.py       # 沙箱创建与管理
    ├── test_skill_basic.py      # Phase 1: 静态结构验证
    ├── test_skill_evals.py      # Phase 2: AI 语义评测
    ├── run_eval.py              # 命令行评测启动脚本
    ├── session_stats.py         # Session 数据统计工具
    ├── pytest.ini               # pytest 渲染配置
    └── requirements.txt         # Python 依赖

注意事项

  1. 变更识别:只有配置的 skill_dirs 目录下的变更才会触发评测。支持白名单过滤(skill_whitelist)。
  2. 评测用例必需:skill 必须在 tests/system/cases/ 下有 <skill>_evals.md 文件才会执行 Phase 2 评测。
  3. --report-only 前提:沙箱目录中须有可用的 JSON 文件(来自之前的完整测试运行)。若数据不完整(如 ses.json 截断),会话详情区块可能缺失,但评分不受影响。
  4. 超时设置:批量评测超时 1200 秒,单个评测用例超时 300 秒。
  5. 退出码:所有评测通过返回 0,任一失败返回 1。