本文件承接 README.md 的全部历史更新记录(按时间倒序)。 README 只保留最近更新的摘要表;当前项目状态以 docs/HANDOFF.md 第 3 节为唯一权威来源。 记录规范:新条目加在最上方,格式
## YYYY-MM-DD — 主题,里程碑明细另见docs/P1-P5交付总结与上手指南.md。
结果导出能力完整交付:
GET /api/plans/{id}/export-xlsx + export-csv:双行表头(类目分组+中文列名带单位),格式复用 torqrippswap scan_results.xlsx 的 write_summary_xlsx测试:TEST-066/067,test_xlsx_export.py 52 项全过;真实任务端到端验证(897 字段入库、885 列导出)。
热仿真首次打通并完整交付:
git 远程推送:配置 gogsgit.ez4l.com(store 凭据助手 + ~/.git-credentials),以后代码更新后推送免干预。已知限制:ls-remote/fetch(upload-pack 方向)超时,push 正常。
测试:TEST-060~062 实测通过(稳态热/磁热耦合/三档端到端),test_executor_m3 修复(claim 逻辑测试夹具缺陷)。
背景:项目已沉淀完整工程纪律(AGENTS.md 硬约束 + TEST_RECORDS + 单一事实源 + 里程碑管理),但缺 playbook 的“接续/换机/上下文延续”机制。本次融合本项目框架与 ai-collab-dev-playbook.md(MARS 电机热仿真方法论)产出 V2 框架,并落地本项目。
新增/修改:
ai-collab-dev-playbook-v2.md:五支柱文件体系(README/AGENTS/HANDOFF/KNOWLEDGE_BASE/留痕双件套)+ 五步启动法 V2 + 全套模板(含里程碑管理/测试纪律/单一事实源),下个项目可直接复用docs/HANDOFF.md:环境要求、恢复步骤、当前进度(P1~P5+P6-M1 完成)、阻塞点(5 个未验证变量/热求解/多工具 mock/Kriging 降级)、待办(P6-M2/M3)+ 接续提示词scripts/check_machine_paths.py:只读环境体检(Python 版本/环境变量/Motor-CAD exe/Python 包/Git 状态/仓库资产/node),--fix 打印修复命令;含项目 venv 探测提示AGENTS.md 接入新框架:补 HANDOFF/playbook-v2 引用、环境体检命令、会话日志强制、反模式自查表、接续与交接节docs/CONVERSATION_LOG.md:头部补统一模板说明 + 追加本次会话记录验证:check_machine_paths.py 本机运行通过(py_compile + 纯 ASCII + 体检输出正常,详见 TEST_RECORDS TEST-024)。
技术决策:check_machine_paths.py 采用“默认只读 + --fix 仅打印命令不自动执行”(避免脚本擅自改系统环境);会话日志沿用现有 CONVERSATION_LOG(不新建 session_log,避免双日志漂移)。
已知问题/后续:新项目可直接复用 playbook-v2;PCB 项目对照框架第 8 节落地清单逐项对齐。
Plan 23 的 80 个扫描点全部失败,根因是扫描变量使用了径向磁通电机(RFM)的变量名 Stator_Lam_Outer_Dia / Stator_Lam_Inner_Dia,而当前模型是轴向磁通电机(AFM/SSSR),Motor-CAD 中不存在这些变量。
新增拓扑感知变量名映射模块 web/backend/app/services/topology_variable_map.py
Stator_Lam_Outer_Dia → Stator_Outer_Diameter 等)Number_of_Slots → Slot_Number 等)修复参数展开函数 _expand_plan_to_parameters()
新增执行前变量名校验 start_simulation
补充模板缺失的 motorcad_var
Stator_Outer_Diameter、CurrentDefinition 等)Current_Density 和 Insulation_Class 合理留空(非直接 Motor-CAD 变量)新增变量目录 API GET /api/plans/variable-catalog?topology=SSSR
前端优化 PlanDetail.vue
scripts/test_topology_variable_map.py:8/8 PASS背景:P5 完成后功能完备,但前端存在信息过载(PlanDetail 1129 行长卷)、导航 14 项平铺无分组、参数三套命名口径、监控页功能重叠、stat-card 四处重复手写等问题。参考 SimScale / Ansys 等在线仿真工具的设计语言(工作流树式导航、三级可见性、高数据墨水比、卡片式分组、上下文操作就近放置),完成 B1(信息架构)+ B2(PlanDetail 分层)两批次改造。
全局设计系统:
src/style.css 设计令牌(CSS 变量):专业深蓝主色 #2563eb、中性灰阶、8px 网格间距、统一圆角/阴影/过渡StatCard.vue(统计卡片,消除 4 处重复手写)、SectionCard.vue(内容区块)、PageHeader.vue(页面头部)B1 信息架构重构(MainLayout.vue):
B2 PlanDetail 分层重构(PlanDetail.vue):
points×3min 改为 points×2.5min(贴近真实 90~150s/点)其他页面优化:
ProjectList.vue:PageHeader + StatCard + SectionCard + 搜索/拓扑筛选 + 创建弹窗边界条件双列布局Dashboard.vue:PageHeader + StatCard + ECharts 趋势/Pareto 图 + 结果表TaskManager.vue:PageHeader + 6 项状态统计卡 + 状态筛选 + 创建任务从方案下拉选择(JSON 降为高级折叠项)+ 详情抽屉优化验证:npm run build 全绿(vue-tsc 0 错误,vite 11.62s 构建完成,2283 模块)。详见 TEST_RECORDS TEST-023。
后续批次:B3(参数目录单一事实源,前后端协同)、B4(流程引导+仿真前检查清单+耗时校准)待实施。
背景:外部系统专家审核发现 3 处文档污染与 1 处前端性能问题,本次全部修复。
daptive→adaptive、atch_scheduler.py→batch_scheduler.py 两处被吞字符的文本fmcore→afmcore 等);重建"测试记录索引"表(TEST-004~022 原本 5 列错位、内容串行,现恢复为 22 条完整 5 列表格)vite.config.ts 增加 manualChunks(vendor-vue / vendor-echarts / vendor-element 三包拆分),业务代码与第三方库解耦,改善缓存与首屏加载;重新 build 验证 EXIT=0(vue-tsc 0 错误)验证:README / TEST_RECORDS / .gitignore 三文件控制字符清零;npm run build 全绿;业务 chunk 由 1MB 级降为 13~54kB(vendor 库独立成 3 包)。
背景:P5 路线最后一批。metrics.py 仅 25 个电磁指标,报告为单一 metrics 表。P5-M6 扩加热网络+结构指标(自动生效),robust_motorcad 加热求解开关,报告按物理域分组。
metrics.py 扩项(单一事实源,extract_all_metrics 自动生效):
robust_motorcad 热求解:enable_thermal 开关(init + run_single_point),默认关;电磁求解后尽力而为 do_thermal_calculation + Thermal 导出合并,失败不中断电磁结果。需要模型热网络配置(环境依赖)。
报告模板化:report_generator Results Summary 按域分组(Electromagnetic / Thermal / Structural),每域子标题+表格,空域跳过;从 afmcore.metrics 取 domain/label/unit;JSON fallback 含 metrics_by_domain。
验证:test_metrics_extension.py 20/20 PASS(定义/提取/中文别名/必需校验/域分组/报告JSON/robust参数);全量回归 21/21。真实热求解待模型配置+实际运行。详见 TEST_RECORDS TEST-022。
P5 路线全部完成(M1-M6)。
背景:适配器层仅有 MotorCADAdapter,执行器硬编码 import motorcad。P5-M5 新增 MaxwellAdapter/JMAGAdapter(mock 实现,真实接入标注环境依赖),执行器根据 tool 动态选择适配器。
新增适配器:
MaxwellAdapter(tool=maxwell):mock 实现,capability_domains=(electromagnetic, thermal),确定性合成指标(含 winding_temp_c)JMAGAdapter(tool=jmag):mock 实现,capability_domains=(electromagnetic,),指标系数与 Maxwell 不同以区分工具执行器改造:MotorCADTaskExecutor._ensure_adapter() 从硬编码 import 改为根据 self.tool 动态 import(motorcad/maxwell/jmag);executor_config.json 的 tool 字段现在可切换工具。
验证:test_adapters.py 22/22 PASS(注册/全链路/工具区分/回读校验/边界/异常/执行器动态 import);全量回归 20/20。真实 Maxwell/JMAG 接入待目标机环境(需 Ansys Maxwell + PyAEDT / JMAG + jmagpy)。详见 TEST_RECORDS TEST-021。
背景:蓝图 §6 设计四阶段优化管线(Morris 筛选 → LHS 采样 → Kriging 代理 → NSGA-II),但当前策略层仅有 full_factorial/lhs/adaptive。P5-M4 新增 Morris 灵敏度筛选和代理模型引导策略,补齐蓝图前两阶段。
依赖降级:环境无 numpy/scipy/sklearn,项目纪律要求纯 stdlib。代理模型用 IDW(反距离加权) 替代 Kriging——预测 + 最近邻距离不确定性,支持 UCB explore-exploit 权衡。后续升级 Kriging 须引入 scipy 并在同接口下替换。
新增策略:
MorrisStrategy(kind=morris):纯 stdlib Morris OAT 灵敏度筛选,state() 返回 sensitivity_ranking(mu/mu_star/sigma)+ key_parametersSurrogateGuidedStrategy(kind=surrogate_guided):初始 LHS → IDW 代理 + UCB 采集 + 预算自适应批次大小,state() 返回 phase/budget/surrogate 诊断(loo_rmse/mean_uncertainty)验证:test_strategy_morris.py 15/15 + test_strategy_surrogate.py 17/17;Morris 线性函数灵敏度排名正确(a=2.0 > b=0.5);SurrogateGuided bowl 函数收敛 best y=0.007(理想 0.0);全量回归 19/19。详见 TEST_RECORDS TEST-020。
背景:P4-M4 上线收敛曲线后,adaptive 优化页面缺少批次级状态可见性(每批多少点成功/失败/不可行)、L0 预筛选结果展示(采样可行率/不可行原因),且运行期只能手动刷新。P5-M3 补齐三视图。
后端:feasibility_search.py get_state_summary() 增加 batch_summary(每批进度/状态分布/批内最优)、l0_summary(采样可行率/不可行原因 Top N)、infeasible_points、failed_points;search.py SearchStateResponse 同步增加字段(向后兼容)。
前端:AdaptiveOptimize.vue 增加①运行期 3s 自动轮询(非 searching 状态自动停止)②L0 预筛选摘要卡片(可行率进度条 + 不可行原因 tag)③批次状态总览卡片(每批进度条 + 状态分布 tag + 批内最优)。
验证:test_search_state_summary.py 8/8 PASS;vue-tsc && vite build 零类型错误;独立后端端到端 create/state 新字段正常。详见 TEST_RECORDS TEST-019。
背景:本地执行器 EXE 此前只能靠环境变量(MOTORCAD_MODEL / WEB_BASE_URL)配置,部署到目标机需改环境。P5-M2 引入 executor_config.json 侧车配置:web 地址 / 模型路径 / 日志 / 实例数全部可改,无需重新打包。
改动:
scripts/executor_config.py(新增):配置加载器。优先级:--config > $EXECUTOR_CONFIG > <EXE目录>/executor_config.json > <仓库根>/executor_config.json > 内置默认;单字段仍可被环境变量覆盖;相对路径按 EXE 目录/仓库根解析;数值/枚举/类型校验。executor_config.json(新增,仓库根模板):web_base_url / model_path / poll_interval / instances / log_dir / log_level / tool / enable_mock。scripts/run_task_executor.py:argparse 支持 --config / --instances / --interval / --mock / --log-dir / --log-level;logging 落盘;支持单入口多实例(instances>1)。scripts/run_task_executor_parallel.py:复用共享配置加载(保留原 CLI 兼容)。scripts/task_executor.py(修复 P4-M3 遗留):MotorCADTaskExecutor._run_simulation_point 此前忽略 enable_mock 无条件走真实 adapter;现 enable_mock=True 时走基类 mock(结果带 source="mock"),不启动 Motor-CAD、不要求 model_path。测试:scripts/test_executor_config.py(20 用例:默认/文件合并/环境覆盖/优先级/边界/异常/空值)+ scripts/test_executor_p5m2.py(6 用例:mock 分支正常/多点/非法路径仍 mock/默认关闭/真实模式缺模型路径报错/空路径),全部 EXIT=0;全量回归 16/16 PASS。
EXE 端到端验证(mock):重新打包 dist/PCB-AFM-Executor.exe(1.1.0);独立后端(8010 + 临时 DB)→ EXE(--config 侧车,enable_mock=true)认领 3 点任务 → mock 求解 → 回传 Web → 任务 completed、3/3 成功、指标入库(tavg 34.56~42.05 N·m、eff 87.95~89.73%)。点级结果带 source="mock" 防混淆。
真实 Motor-CAD 端到端:✅ 本机已验证单点全链路(EXE → 真实 Motor-CAD → Web,duration 167.5s,tavg=0.52187 / eff=86.06% / losses=41.945W / back_emf=11.15V,与 TEST-010 完全一致,见 TEST-018)。过程中修复两个真实链路 bug:业务名 airgap_mm→Airgap 映射 + point_id 元数据键排除。真实短扫描/多实例可在目标机验证。
背景:npm run build(vue-tsc && vite build)历史遗留 71 处类型错误(TS2339/TS2345/TS7006,6 个 .vue)。根因:src/api/index.ts 响应拦截器运行时已 unwrap 为 .data,但 TS 类型上 api.get/post 仍声明为 Promise<AxiosResponse>,导致调用处直接访问响应字段报 TS2339;PlanDetail 中 task.status 被误判为 HTTP 状态码 number 报 TS2345。
改动:
web/frontend/src/api/index.ts:axios 实例类型改写为 UnwrappedApi 接口(get/post/put/delete 返回 Promise<T>,默认 any),类型声明与运行时行为对齐;拦截器逻辑原样保留(实例改名 instance 后 cast)。web/frontend/src/views/PlanDetail.vue:@selection-change 回调参数 sel 显式标注 any[](消除 TS7006)。验证:npm run build 全绿(vue-tsc 0 错误 + vite 2274 modules 构建成功,真实退出码 0);后端 health 200 + test_api_client.py 真实链路 PASSED;前端 vite dev + API 代理 200;14 个 Python 回归脚本全绿。详见 docs/TEST_RECORDS.md TEST-016。
背景:边界条件栏与固定参数栏数量不平衡。根因:边界条件从模板全量渲染(27项),而固定参数只加载AI方案实际写入的少量参数;且边界条件栏混入了大量设计实现参数。
改动内容:
边界条件栏瘦身(27 → 14项):只保留需求/约束型参数
固定参数栏扩容(模板驱动,36项全量展示)
app/services/fixed_params_template.py 扩充为36个参数,按电机工程习惯分8类plan_generator.py 固定参数改为模板全量驱动:AI不再需要输出固定参数,系统按边界条件推断全部参数值PlanDetail.vue 加载方案时按模板自动补齐缺失固定参数AI方案思路中文简短化
plan_generator.py 默认提示词改造:reasoning 用中文、约200字、只讲关键设计决策与核心参数Bug修复:固定参数含字符串值(磁钢材料/硅钢片/冷却方式等)时一键启动仿真500错误
plans.py _expand_plan_to_parameters:数值转float、字符串保留原样涉及文件:
web/backend/app/services/fixed_params_template.py(扩充36参数+8类中文)web/backend/app/services/plan_generator.py(模板驱动+中文prompt)web/backend/app/routers/plans.py(字符串参数启动修复)web/frontend/src/views/PlanDetail.vue(三栏重构+来源标记+去添加按钮)已知问题:
Max_Speed/Winding_Connection/Current_Density/Magnet_Remanence/Insulation_Class 的 Motor-CAD 变量名未验证,description 已标注"变量名需确认",执行时可能标记FAILED,需在.mot中确认后修正问题:前端"一键启动仿真"后一直"仿真中"无进度,Motor-CAD 未打开。
根因链:本地执行器未运行 -> 认领逻辑矛盾(只拉pending但任务已dispatched) -> 列表接口不含parameters -> 字符串参数float崩溃 -> 模板变量名非真实Motor-CAD变量 -> AFM_D_Rotor改外径破坏线性几何。
修复:
scripts/run_task_executor.py 执行器启动入口(后台常驻,认领pending+dispatched任务)scripts/task_executor.py:_hydrate_task 拉取完整参数集;心跳注册(在线/进度)scripts/robust_motorcad.py:跳过非数值参数写入fixed_params_template.py:模板加 motorcad_var(真实Motor-CAD变量名,从.mot提取);
默认值对齐基线模型;AFM_D_Rotor 不写入(外径作约束)plans.py _expand_plan_to_parameters:模板为骨架合并用户修改,仅写真实变量名验证:plan 21 扫描 Airgap 1->2mm 2点全部OK,Motor-CAD打开、进度推进、结果回传, 物理规律正确(气隙↑->反电动势↓)。
涉及文件:scripts/run_task_executor.py(新)、scripts/task_executor.py、scripts/robust_motorcad.py、 web/backend/app/services/fixed_params_template.py、web/backend/app/routers/plans.py
已知问题:字符串参数(材料/冷却/绝缘)暂不写入,用基线默认;几何改型需Motor-CAD内操作。
背景:按平台化升级设计方案(docs/PLATFORM_DESIGN_V2.md),消除"指标定义三处漂移"与"解析器两套实现"两大平台性短板,为多工具/多拓扑/多策略扩展铺路。
改动内容:
src/afmcore/(单一事实源)
metrics.py:25 项指标定义(key/label/unit/direction/required/aliases) + 归一化解析器adapters/:SimulationAdapter 接口 + 注册表 + MotorCADAdapter 实现验证:单元验证全部 PASS(含全角字符解析/中文别名/% 守卫/三端导入/78 文件编译/适配器协议),详见 docs/TEST_RECORDS.md TEST-004。
进展路线(后续批次):P2 拓扑注册表 + task_executor 切换适配器;P3 执行策略接入(adaptive);P4 方案 Schema 统一 + 文档同步 + EXE 打包。
背景:按平台化设计方案 P2,消除“拓扑是裸字符串”与“求解器硬编码”两个平台性短板。
改动内容:
src/afmcore/topology.py:SSSR 完整参数体系(8 组 37 项)注册,DRSS/SDSR 预留;提供拓扑验证/参数校验/UI 序列化plan_schema.validate() 集成拓扑校验:未知拓扑拦截,新增拓扑只做注册task_executor 切换 get_adapter():从硬编码 RobustMotorCADSolver 改为统一适配器入口;修复结果嵌套导致的 _compute_metrics 聚合空的缺口验证:新增可重复运行回归测试 scripts/test_platform_registry.py(36 项断言全 PASS);79 个 .py 编译 0 失败;三端导入回归通过。详见 TEST_RECORDS.md TEST-005。
背景:按 P3 实施计划(docs/archive/P3_IMPLEMENTATION_PLAN.md),把 Web 端已验收的 adaptive 搜索能力接到本地执行器,打通「方案 -> 批次任务 -> 本地执行 -> 回填搜索 -> 续批/收敛」闭环。
M1 执行策略抽象层(src/afmcore/strategies/):
M2 任务模型扩展 + 自适应编排器:
验证:闭环回归脚本 scripts/test_p3_orchestrator.py(fake 执行器,temp DB 隔离),exit 0;详细记录见 docs/TEST_RECORDS.md TEST-006。
技术决策:orchestrator 采用 pull 驱动(advance_loop 由调用方/路由/调度器触发),与既有执行器轮询哲学一致;L0 可行性预筛依赖参数名对齐(airgap_mm/current_a),真实 AI plan 生成即对齐。
已知问题/后续:路由/定时器接入与真实 Motor-CAD 烟雾测试放 M5;adaptive 前端视图放 P4。
背景:P3-M3,让本地执行器原生支持 adaptive_batch 任务与多实例并行,配合 M2 编排器形成批次闭环。
改动(scripts/task_executor.py):
新增:scripts/run_task_executor_parallel.py(--instances N 并行启动,--mock 供测试)
验证:scripts/test_executor_m3.py(PASS),P2 回归 36/36 不破坏;见 docs/TEST_RECORDS.md TEST-007。
技术决策:多实例并行复用 Web 端 dispatch 的幂等语义(pending->dispatched 原子迁移)防重复,执行器侧无需额外锁。
背景:P3-M4,统一两套调度状态词汇(TaskManager 的 pending/dispatched 与 BatchScheduler 的 queued),并让调度器任务字段与 Task ORM 对齐。
改动:
验证:scripts/test_p3_m4_contract.py(PASS),M2 闭环回归不破坏;见 docs/TEST_RECORDS.md TEST-008。
技术决策:用契约层声明统一词汇/字段而非重构两个既有服务,消除漂移同时保持向后兼容;状态归一采用「别名映射 + 未知词透传」(能报错而非静默)。
注:历史记录中无“八期”编号,沿用原始记录。
背景:P3-M5,验证「orchestrator -> 任务系统 -> 本地执行器(HTTP) -> 仿真 -> point_id 回填 -> 续批 -> 收敛」全链路真实闭环。
改动:
验证:闭环 n_results=8 budget_exhausted;P2 36 项 + M2/M3/M4 全量回归 PASS;91 个 .py 编译 0 失败;详见 docs/TEST_RECORDS.md TEST-009。
技术决策:AI 分析为可选项——无 key 环境自动降级为纯定量结果,配置 key 后自动启用;避免每次批次空调 AI 的日志噪音与延迟。
真实 Motor-CAD 烟雾:已通过(TEST-010)——连接/基线加载/求解 1 点/解析 21 项指标全 OK,back_emf=11.15V 与历史 TR-01 一致;同时发现并修复 MotorCADAdapter.run_point 忽略 model_path 的真实 bug。
背景:P3-M6。Web 端已有 AdaptiveLoop 闭环(AI 方案 -> L0 -> FeasibilityFirstSearch -> 选批 -> report-results 回填 -> AI 分析 -> 经验库 -> 收敛),但「本地执行器执行」环节缺失;平台层已具备任务系统 + 执行器(批次 Task、point_id 回填)。本批打通两套体系。
改动:
验证:M6 集成测试 PASS(fake plan -> 初始 3 点 -> submit-batch -> 3 批 -> budget_exhausted,8 点/8 预算;Task 落库含 loop_id/batch_id/point_ids/dynamic;幂等性 OK;HTTP 端点 404/200 正常);P2 36 项 + M2/M3/M4/M5/M6 全量回归 PASS;详见 docs/TEST_RECORDS.md TEST-011。
技术决策:采用「Web 智能层 + 平台执行层」整合而非新建第二套循环路由——给 AdaptiveLoop 补执行桥(只加方法/端点,不改既有流程),复用已验证的任务系统/执行器,避免两套 /api/adaptive 循环并存。
背景:用户要求"先处理遗留问题 → 写 P4 详细计划 → 直接做 P4"。P4 按 docs/archive/P4_IMPLEMENTATION_PLAN.md 五件套实施,全部完成。
P3 遗留处理(4 commit):
task_manager.dispatch_task 改 SQLAlchemy 条件 UPDATE(8 线程竞争恰 1 win)FeasibilityFirstSearch.import_state() + AdaptiveLoop.export/restore + /loops/{id}/export、/loops/import 端点\uXXXX(运行解码正确)test_api_client.py 真实链路;未动用户常驻服务P4 实施(M1~M5,5 commit):
src/plan_schema.py 增 parse/validate 入口 + 别名容错 + require_model_path 分级;web 端 main.py 注入 repo root,plans/ai_plan 接入校验(400/422)scripts/build_executable.ps1 + PyInstaller onefile → dist/PCB-AFM-Executor.exe(12.6MB,--version/--self-test 通过)L0PreScreeningEngine 迁 src/afmcore/l0/prescreening.py(唯一实现,纯 stdlib),web 薄 re-export 兼容 6 处调用点验证:新增 test_p4_schema / test_p4_m4_convergence / test_p4_m5_l0 全过;P2 36 + M6 + closed_loop + checkpoint + concurrency 全量回归绿;全量 py_compile 0 失败;ASCII 0 违规;vue-tsc 对 AdaptiveOptimize.vue 0 错误(全量 build 仍有既有类型错误属 backlog)。详见 docs/TEST_RECORDS.md TEST-013~015。