| 项 | 内容 |
|---|---|
| 评审报告 | 第三方评审/代码评审报告_V1.0_20260828.md |
| 应审日期 | 2026-08-28 |
| 应审人 | 开发团队 |
| 评审方法 | 逐项代码核验 + 实际 Motor-CAD 测试结果对照 |
评审报告质量很高,发现的问题绝大多数属实且有代码位置证据支撑。尤其是三类系统性问题的归纳精准:
\uXXXX 乱码和 axios .data 遗漏是低级但致命的错误我们虚心接受,逐项修复。以下为逐项评估。
| # | 评审结论 | 核验结果 | 处理决定 |
|---|---|---|---|
| A1 | upload-results 指标清单双份硬编码漂移 | 属实。后端 plans.py 硬编码清单与 solver_core.METRIC_KEYS 不一致 | 修复:以 solver_core.METRIC_KEYS 为单一事实源 |
| A2 | 仿真失败静默回退 mock 假数据标 status=ok | 属实。task_executor.py:288 确认存在 mock 回退 | 修复:失败标 failed,mock 需显式开关+source 标注 |
| A3 | MotorCAD 实例管理三铁律全违反 | 属实。未传 open_new_instance、无 set_visible、无基线重载 | 修复:复用 RobustMotorCADSolver |
| A4 | 回读校验被 except pass 架空 | 属实 | 修复:去掉 try/except,异常上抛 |
| A5 | get_variable 取结果用了错误变量名 | 属实。Torque_Avg/Efficiency/Total_Losses 无出处 | 修复:复用导出文件解析路径 |
| A6 | 自适应闭环缺本地执行桥 | 属实,但属功能缺失而非 bug | P1 后续:工作量较大(约 1-2 天),本轮先记录,P4 收尾后优先实现 |
| A7 | GUI self._plan 从不更新 | 属实 | 修复:_start_scan 中回写 self._plan |
| A8 | delete_experience 204 空响应抛异常 | 属实。_request() 无条件 json.loads | 修复:空 body 返回 None |
| # | 评审结论 | 核验结果 | 处理决定 |
|---|---|---|---|
| B1 | BatchScheduler 必现死锁 | 属实。第 70/107 行在锁内调 _notify_callbacks,后者第 181 行再获取锁 | 修复:改用 RLock 或将回调移到锁外 |
| B2 | 扫描中关窗崩溃 | 属实。无 closeEvent | 修复:重写 closeEvent |
| B3 | 变量表格非数字输入全局崩溃 | 属实。float() 无 try/except | 修复:逐行 try/except |
| B4 | GUI 路径 MotorCAD 进程泄漏 | 属实。disconnect 不在 finally 中 | 修复:try/finally |
| B5 | run_single_point 提前 return 跳过落盘 | 属实。第 612 行 return 跳过第 680-681 行 append/落盘 | 修复:改为走正常收尾路径 |
| B6 | point_timeout 死代码 | 属实。参数接收但未使用 | 修复:本轮先修正文档标注为未实现,真实超时列入 P1 |
| B7 | 本地文件兜底模式无限重复执行 | 属实 | 修复:执行后重命名为 .done.json |
| # | 评审结论 | 核验结果 | 处理决定 |
|---|---|---|---|
| C1 | 转矩目标比较方向写反 | 属实。第 355 行 "torque" in metric,但 key 是 tavg_nm | 修复:显式 metric-direction 映射表 |
| C2 | 六类收敛判据只执行四类 | 属实。check_optimum_stability 和 check_surrogate_error 无调用方 | 修复:本轮接入两个判据,真正实现六类 |
| C3 | L0 预筛选空跑即通过 | 属实。total_checks=0 时 feasible=True | 修复:增加最低覆盖判定,0 检查时返回 unknown |
| C4 | 信任域锚点无视优化方向 | 属实。恒取 max | 修复:按 objective_direction 选 max/min |
| C5 | 信任域中心不随最优点迁移 | 属实 | 修复:is_better 时同步迁移中心 |
| # | 评审结论 | 核验结果 | 处理决定 |
|---|---|---|---|
| D1 | Vue 模板 \uXXXX 字面乱码 | 属实。6 个 AI 页面确认存在 | 修复:.vue 文件直接写 UTF-8 中文 |
| D2 | axios 响应未取 .data | 属实。无响应拦截器 | 修复:加响应拦截器 r => r.data |
| D3 | ECharts 动态导入 mod.default 错误 | 属实 | 修复:改为 mod 或静态 import |
| D4 | 热力图/收敛轨迹伪造数据 | 属实。硬编码 P1-P6/Q1-Q5 | 修复:热力图接真实数据,收敛轨迹标注示意图或接 adaptive 数据 |
| # | 评审结论 | 核验结果 | 处理决定 |
|---|---|---|---|
| E1 | .env 会被烤入 Docker 镜像 | 属实。无 .dockerignore | 修复:新增 .dockerignore |
| E2 | KIMI_API_KEY 空值屏蔽 .env 密钥 | 属实 | 修复:删除 compose 空值行,config.py 跳过空值 |
| E3 | SQLite 无持久化卷 | 属实 | 修复:增加卷映射 |
| E4 | API 无认证 | 属实,但当前为本地/内网部署 | P1 后续:本轮加共享 Token 中间件(简单实现) |
| # | 评审结论 | 核验结果 | 处理决定 |
|---|---|---|---|
| F1 | 断点续扫是死代码 | 属实。每次毫秒时间戳生成新目录 | P1 后续:工作量大,本轮记录 |
| F2 | 删除项目无级联 | 属实 | 修复:cascade + PRAGMA foreign_keys |
| F3 | 3 个 web 端 .py 内嵌中文 | 属实 | 修复:中文 prompt 抽取到 prompts/ 模板文件 |
| F4 | Git preflight 可绕过 | 属实 | 裁决:改为硬拒绝(与 AGENTS.md 纪律一致) |
| F5 | GET 请求带写副作用 | 属实 | 修复:download 只读,状态迁移改 POST |
评审报告注明"未启动 Motor-CAD、未运行动态仿真"。我们已完成 3 次真实 Motor-CAD 测试(TEST-001/002/003),以下几点需补充说明:
RobustMotorCADSolver 实际可用性已验证:3 次测试均成功连接、计算(133-174 秒)、导出、解析。弹窗抑制(MessageDisplayState=2)确实生效,TEST-002/003 无任何 GUI 弹窗。评审中关于"弹窗需人工点确定"的问题已在 TEST-002 前修复。
指标解析已部分改善:METRIC_DEFINITIONS 从 12 个扩展到 20 个后,TEST-003 成功解析 14 个指标(TEST-002 为 7 个)。但 A1 指出的"后端清单与本地端不一致"问题仍然存在,需要修复。
preflight 权限层 FAIL 不阻断功能:评审第 18 项建议将"非默认安装路径"降级为 warning。实际上我们的 preflight 设计是分层的——permission 层 FAIL 只记录警告,不阻断连接和计算,3 次测试均正常完成。但"非默认安装路径"硬编码 C:\ANSYS_Motor-CAD 确实不合理,将降级为 info。
export_results 签名问题已修复:评审前我们已发现并修复了 export_results 缺少 solution_type 参数的 bug(commit f3b492a),TEST-002/003 导出均成功。
按评审第八章 P0 清单顺序,共约 20 项:
| 批次 | 内容 | 预估 |
|---|---|---|
| 1 | A2+A3+A4+A5: task_executor 重构(复用 RobustMotorCADSolver) | 0.5h |
| 2 | A1: 指标清单单一事实源 | 0.5h |
| 3 | A7+A8: GUI plan 回写 + api_client 204 | 20min |
| 4 | B1: BatchScheduler 死锁 | 20min |
| 5 | D1+D2: 前端 6 个 AI 页面中文还原 + axios 拦截器 | 1h |
| 6 | C1+C2+C3: 转矩方向 + 六类判据 + L0 覆盖率 | 1h |
| 7 | B3+B4+B5+B7: GUI 输入校验/finally/落盘/重复执行 | 0.5h |
| 8 | C4+C5+D3+D4: 信任域修复 + ECharts 修复 | 0.5h |
| 9 | E1+E2+E3+F2+F3+F5: 部署/级联/中文外置/GET 副作用 | 1h |
| 10 | F4: Git preflight 硬拒绝 + B2 closeEvent | 0.5h |
web/backend/prompts/ 模板文件。.vue 文件不适用此纪律,直接写 UTF-8 中文。应审总结完成,立即开始 P0 修复。
第一轮 P0 修复完成后,继续修复 P1 项和高优先级风险项:
| # | 问题 | 修复内容 |
|---|---|---|
| 1 | 3.4-34 状态枚举全仓库不统一 | 新建 src/status_constants.py 定义 POINT_OK/POINTFAILED/TASK* 常量;robust_motorcad.py 和 task_executor.py 中小写 "ok"/"failed" 统一改为大写 "OK"/"FAILED" |
| 2 | 3.4-25 Session 管理不统一 | task_manager.py 中 7 处 next(get_db()) 改为 with SessionLocal() as db:,确保 Session 自动关闭 |
| 3 | E4 API 无认证 + max_tokens 无上限 | main.py 添加可选 API Key 中间件(AFM_API_KEY 环境变量,未设置时不启用);ai.py ChatRequest.max_tokens 加 Field(le=8192) 上限 |
| 4 | 3.1-1 求解无超时 + 无连续失败重连 | solver_core.py MotorCADSolver 添加 point_timeout=600s 和 max_consecutive_failures=3 参数;run_single 用 daemon thread 实现超时,连续失败达阈值后自动 disconnect+connect 重连 |
| 5 | F1 断点续扫 | scan_engine.py 已有完整的 _load_completed_indices + CSV 追加模式实现,确认功能正常,无需额外修改 |
| 6 | plan_id 碰撞风险 | plans.py _generate_plan_id 从时间戳改为时间戳+6位随机hex后缀(uuid),避免同秒碰撞 |
| 7 | 分页参数无上限 | projects.py 和 experience.py 的 list 接口 limit 参数加 Query(le=200) 上限,skip 加 Query(ge=0) |
| 8 | 经验库无去重 | experience.py create_experience 添加 source_plan_id + params_json 去重检查,重复时返回已存在记录 |
第二轮修复完成,提交推送。