| fix: 修复测试框架评测报告评分解析与 session 导出问题,优化 opencode 工作空间
Co-authored-by: hello_simida<wangyi206@huawei.com>
# message auto-generated for no-merge-commit merge:
!278 merge master into master
fix: 修复测试框架评测报告评分解析与 session 导出问题,优化 opencode 工作空间
Created-by: hello_simida
Commit-by: hello_simida
Merged-by: cann-robot
Description: ## 描述
本次 PR 包含以下改进:
### 1. 修复评测报告评分解析与 session 导出问题
- 修复 test_skill_evals.py 中评分解析逻辑
- 优化 conftest.py 配置管理
- 改进 main.py 评测流程控制
- 完善 opencode_runner.py 执行器
- 增强 sandbox_manager.py 沙箱管理
### 2. 优化 opencode 执行工作空间
- 优化工作空间管理逻辑
- 提升执行环境稳定性
### 3. 测试系统文档与安全改进
- 更新 tests/system/README.md 文档
- 移除废弃的测试用例 ascendc-task-focus_evals.md
- 安全相关改进
## 关联的Issue
无
## 测试
测试框架内部改进,通过 CI 验证。
## 文档更新
更新了 tests/system/README.md。
## 类型标签
- [x] 🐛 Bug 修复
- [ ] ✨ 新特性
- [ ] ⚡ 性能优化
- [ ] ♻️ 重构
- [ ] 🧪 测试
- [ ] 📦 构建/CI
- [ ] 🔧 配置变更
- [ ] 📝 文档更新
- [ ] ⬆️ 依赖升级
- [x] 🔒 安全修复
- [ ] 🧹 代码清理
- [ ] ❓ 其他,请描述:
<!-- CODE_REVIEW_REPORT -->
## 🤖 自动代码检视报告
**检视状态:** 完成 ✅
**摘要:**
- 检视文件数:7 个
- 发现风险点:3 个(CRITICAL: 0, HIGH: 0, MEDIUM: 2, LOW: 1)
---
### 变更概览
| 文件 | 变更行数 | 主要内容 |
|------|---------|---------|
| README.md | +128/-70 | 文档全面更新:沙箱机制、HTML 报告、配置说明 |
| ascendc-task-focus_evals.md | +0/-22 | 移除格式错误的废弃期望断言 |
| main.py | +38/-20 | 新增 --report-only 模式;提取 _eval_skills() 降低函数复杂度 |
| conftest.py | +60/-10 | 新增 _find_json_by_depth() 深度追踪 JSON 解析;增强 JSON 修复兼容性;raw_output 包装容错 |
| opencode_runner.py | +48/-15 | 新增 _safe_env() 安全环境隔离;-- 分隔 prompt 防 CLI 注入;导出超时容错 + 部分数据保留 |
| sandbox_manager.py | +33/-4 | 沙箱安全加固:写入 opencode.json 工具权限白名单;skill 副本移至 .opencode/skills/ |
| test_skill_evals.py | +65/-41 | 新增 _validate_prompt() 安全校验;提取 _setup_eval_sandbox();REPORT_ONLY 模式支持 |
---
### 详细问题列表
| 文件 | 行号 | 风险等级 | 问题类型 | 描述 |
|------|------|---------|---------|------|
| opencode_runner.py | 551 | MEDIUM | 安全配置 | --dangerously-skip-permissions 绕过了 opencode 内置权限提示系统。当前由 sandbox_manager.py 的 opencode.json 工具白名单(deny bash/websearch/webfetch 等)作为补偿控制。建议在代码注释中显式说明这一依赖关系,防止未来单独修改任一端导致安全漏洞。 |
| opencode_runner.py | 496-501 | MEDIUM | 环境变量白名单 | _safe_env() 采用显式白名单方式传递环境变量,当前仅保留 PATH/HOME/USER 等 10 个基础变量。若未来 opencode 或评测框架需要额外的环境变量(如代理设置、自定义路径),可能导致静默失败。建议添加可配置的额外变量列表或提供覆盖机制。 |
| test_skill_evals.py | 38-68 | LOW | 可维护性 | _validate_prompt() 新增了 4 项安全检查(长度上限、前导空白、控制字符、CLI 注入),设计合理。建议在文档中补充各检查项的触发阈值和错误信息示例,便于用例编写者排查问题。 |
---
### 正面发现
1. **沙箱安全隔离** (sandbox_manager.py): 通过在沙箱中写入 opencode.json 配置,deny bash/websearch/webfetch/repo_clone/external_directory/question 等危险工具,结合 --dangerously-skip-permissions 实现自动化评测的同时保持了安全边界。设计合理。
2. **Prompt 注入防护** (test_skill_evals.py + opencode_runner.py): 双重防护 — _validate_prompt() 拒绝控制字符和 - 开头的 prompt,_run_command() 使用 -- 分隔符防止 prompt 被解析为 CLI 参数。
3. **JSON 解析鲁棒性** (conftest.py): _find_json_by_depth() 正确处理字符串值内的花括号(如 ${ASCEND_HOME_PATH}),使用 early continue 降低嵌套深度,代码清晰。
4. **超时容错** (opencode_runner.py): 导出超时时保留部分数据(returncode -1),避免评测结果完全丢失。
5. **方法提取重构** (main.py + test_skill_evals.py): _eval_skills() 和 _setup_eval_sandbox() 的提取不改变业务逻辑,纯重构降低函数复杂度,代码审查友好。
---
**检视信息:**
- Agent: Claude Code CLI
- Model: deepseek-v4-flash[1m]
- Skill: cann-community-helper (code review workflow)
💡 此报告由 cann-community-helper code review workflow 自动生成,仅供参考。
<!-- /CODE_REVIEW_REPORT -->
See merge request: cann/cannbot-skills!278 | 9 天前 |