CHANGELOG.md 31 KB

CHANGELOG — PCB轴向磁通电机自动化仿真系统

本文件承接 README.md 的全部历史更新记录(按时间倒序)。 README 只保留最近更新的摘要表;当前项目状态以 docs/HANDOFF.md 第 3 节为唯一权威来源。 记录规范:新条目加在最上方,格式 ## YYYY-MM-DD — 主题,里程碑明细另见 docs/P1-P5交付总结与上手指南.md


2026-09-01 — AI 协作方法论框架升级(Playbook V2)

背景:项目已沉淀完整工程纪律(AGENTS.md 硬约束 + TEST_RECORDS + 单一事实源 + 里程碑管理),但缺 playbook 的“接续/换机/上下文延续”机制。本次融合本项目框架与 ai-collab-dev-playbook.md(MARS 电机热仿真方法论)产出 V2 框架,并落地本项目。

新增/修改

  1. 新增 ai-collab-dev-playbook-v2.md:五支柱文件体系(README/AGENTS/HANDOFF/KNOWLEDGE_BASE/留痕双件套)+ 五步启动法 V2 + 全套模板(含里程碑管理/测试纪律/单一事实源),下个项目可直接复用
  2. 新增 docs/HANDOFF.md:环境要求、恢复步骤、当前进度(P1~P5+P6-M1 完成)、阻塞点(5 个未验证变量/热求解/多工具 mock/Kriging 降级)、待办(P6-M2/M3)+ 接续提示词
  3. 新增 scripts/check_machine_paths.py:只读环境体检(Python 版本/环境变量/Motor-CAD exe/Python 包/Git 状态/仓库资产/node),--fix 打印修复命令;含项目 venv 探测提示
  4. AGENTS.md 接入新框架:补 HANDOFF/playbook-v2 引用、环境体检命令、会话日志强制、反模式自查表、接续与交接节
  5. 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 节落地清单逐项对齐。

  • V2.1 迭代(本次):playbook 已通用化重构——主文不绑定任何项目,新增「版本更新记录」;MARS/PCB 降级为附录案例,可直接复制到任何新项目初始化。

2026-08-30(晚)— P5-M2 拓扑感知变量名映射与执行前校验

背景

Plan 23 的 80 个扫描点全部失败,根因是扫描变量使用了径向磁通电机(RFM)的变量名 Stator_Lam_Outer_Dia / Stator_Lam_Inner_Dia,而当前模型是轴向磁通电机(AFM/SSSR),Motor-CAD 中不存在这些变量。

修复内容

  1. 新增拓扑感知变量名映射模块 web/backend/app/services/topology_variable_map.py

    • 定义 SSSR / AFIR / RFM 三种拓扑的已知变量集合(41 个 AFM 变量)
    • RFM→AFM 别名映射(Stator_Lam_Outer_DiaStator_Outer_Diameter 等)
    • 模板逻辑名→Motor-CAD 实际名映射(Number_of_SlotsSlot_Number 等)
    • 变量名校验 + 未知变量建议功能
  2. 修复参数展开函数 _expand_plan_to_parameters()

    • 扫描变量现在经过模板 motorcad_var + 拓扑别名映射,不再直接用原始 name
    • fixed_params 中不在模板里的参数也经过拓扑别名解析
  3. 新增执行前变量名校验 start_simulation

    • 启动仿真前校验所有参数名,未知变量直接返回 400 错误并给出建议名
    • 防止静默的 Motor-CAD "Could not find variable" 失败
  4. 补充模板缺失的 motorcad_var

    • 为 8 个几何/电气参数补充了 motorcad_var(Stator_Outer_DiameterCurrentDefinition 等)
    • 仅剩 Current_DensityInsulation_Class 合理留空(非直接 Motor-CAD 变量)
  5. 新增变量目录 API GET /api/plans/variable-catalog?topology=SSSR

    • 返回指定拓扑的模板参数(含 motorcad_var)和已知变量集合
    • 前端用于填充扫描变量下拉列表
  6. 前端优化 PlanDetail.vue

    • 扫描变量从后端 API 获取拓扑感知的变量目录
    • 下拉列表显示中文名 + 逻辑名 + Motor-CAD 实际变量名
    • 不再依赖本地硬编码模板

测试

  • 单元测试 scripts/test_topology_variable_map.py:8/8 PASS
  • 包含 plan 23 回归测试:验证 RFM 变量名被正确映射,80 个点全部已知

2026-08-30 — P6-M1:Web 前端 UI/UX 全面重构(专业仿真工具风格)

背景:P5 完成后功能完备,但前端存在信息过载(PlanDetail 1129 行长卷)、导航 14 项平铺无分组、参数三套命名口径、监控页功能重叠、stat-card 四处重复手写等问题。参考 SimScale / Ansys 等在线仿真工具的设计语言(工作流树式导航、三级可见性、高数据墨水比、卡片式分组、上下文操作就近放置),完成 B1(信息架构)+ B2(PlanDetail 分层)两批次改造。

全局设计系统

  • 新建 src/style.css 设计令牌(CSS 变量):专业深蓝主色 #2563eb、中性灰阶、8px 网格间距、统一圆角/阴影/过渡
  • 新建 3 个公共组件:StatCard.vue(统计卡片,消除 4 处重复手写)、SectionCard.vue(内容区块)、PageHeader.vue(页面头部)
  • Element Plus 主题变量覆盖(按钮/卡片/表格/标签/Tabs 统一为设计令牌色)

B1 信息架构重构MainLayout.vue):

  • 侧边栏由 7 项平铺改为 5 组工作流导航:工作台 / 执行 / 分析 / AI 智能 / 知识
  • AI 高级功能(L0预筛选、多保真度校准、经验库AI增强)收进「高级功能」可折叠子组
  • 面包屑升级为 项目→方案→任务 层级链(原仅两级)
  • 顶栏新增全局任务状态条(运行中任务数,10s 轮询,点击跳转任务管理)
  • 侧边栏支持折叠(240px ↔ 64px)
  • 页面切换淡入过渡动画

B2 PlanDetail 分层重构PlanDetail.vue):

  • 单页长卷改为 4 Tab:概览 / 方案参数 / 仿真结果 / AI 闭环
  • 概览 Tab:统计卡 + AI 设计思路 + 验收标准 + 结果摘要(前5行)+ 快捷操作卡片
  • 方案参数 Tab:扫描变量(主)+ 边界条件 + 固定参数(默认只显示"已修改"项,其余按分类折叠)
  • 仿真结果 Tab:完整结果表 + 导出
  • AI 闭环 Tab:步骤指示器 + AI分析/生成迭代/提取经验 三步向导
  • 运行中进度横幅(始终可见,含预计剩余时间)
  • 预估耗时由硬编码 points×3min 改为 points×2.5min(贴近真实 90~150s/点)
  • 固定参数"需确认"变量名高亮标签(README 已知的 5 个未验证变量)

其他页面优化

  • 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(流程引导+仿真前检查清单+耗时校准)待实施。


2026-08-30 — 文档卫生修复 + 前端分包优化(外部工程审核整改)

背景:外部系统专家审核发现 3 处文档污染与 1 处前端性能问题,本次全部修复。

  1. README.md 控制字符清理:清除 2 个粘贴带入的控制字符(0x07/0x08),修复 daptive→adaptiveatch_scheduler.py→batch_scheduler.py 两处被吞字符的文本
  2. docs/TEST_RECORDS.md 修复:清除 3 个控制字符(fmcore→afmcore 等);重建"测试记录索引"表(TEST-004~022 原本 5 列错位、内容串行,现恢复为 22 条完整 5 列表格)
  3. 前端 chunk 分包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 包)。


2026-08-30 — P5-M6:多物理场 L2 接入(热网络+结构指标 + 报告模板化)

背景:P5 路线最后一批。metrics.py 仅 25 个电磁指标,报告为单一 metrics 表。P5-M6 扩加热网络+结构指标(自动生效),robust_motorcad 加热求解开关,报告按物理域分组。

metrics.py 扩项(单一事实源,extract_all_metrics 自动生效):

  • 热网络 6 项(domain=thermal):winding_hotspot_temp_c / magnet_temp_c / stator_temp_c / bearing_temp_c / temp_rise_c / thermal_resistance_k_w
  • 结构 4 项(domain=structural):axial_force_n / radial_force_n / max_stress_mpa / deformation_mm
  • 均 required=False,含英文+中文别名;总指标 25→35

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)。


2026-08-30 — P5-M5:多工具适配器(Maxwell/JMAG mock + 执行器 tool 参数化)

背景:适配器层仅有 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 不同以区分工具
  • 两者均实现 SimulationAdapter 协议(connect/disconnect/load_model/set_parameter/run_simulation/extract_metrics),set_parameter 含回读校验,mock=False 时 connect() 抛 RuntimeError 标注环境依赖

执行器改造MotorCADTaskExecutor._ensure_adapter() 从硬编码 import 改为根据 self.tool 动态 import(motorcad/maxwell/jmag);executor_config.jsontool 字段现在可切换工具。

验证:test_adapters.py 22/22 PASS(注册/全链路/工具区分/回读校验/边界/异常/执行器动态 import);全量回归 20/20。真实 Maxwell/JMAG 接入待目标机环境(需 Ansys Maxwell + PyAEDT / JMAG + jmagpy)。详见 TEST_RECORDS TEST-021。


2026-08-30 — P5-M4:策略层高级管线(Morris 灵敏度 + IDW 代理 + 预算自适应)

背景:蓝图 §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_parameters
  • SurrogateGuidedStrategy(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。


2026-08-30 — P5-M3:adaptive 可视化补全(批次状态 + L0 摘要 + 运行期轮询)

背景:P4-M4 上线收敛曲线后,adaptive 优化页面缺少批次级状态可见性(每批多少点成功/失败/不可行)、L0 预筛选结果展示(采样可行率/不可行原因),且运行期只能手动刷新。P5-M3 补齐三视图。

后端feasibility_search.py get_state_summary() 增加 batch_summary(每批进度/状态分布/批内最优)、l0_summary(采样可行率/不可行原因 Top N)、infeasible_pointsfailed_pointssearch.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。


2026-08-30 — P5-M2:EXE 配置化 config.json + mock 分支修复

背景:本地执行器 EXE 此前只能靠环境变量(MOTORCAD_MODEL / WEB_BASE_URL)配置,部署到目标机需改环境。P5-M2 引入 executor_config.json 侧车配置:web 地址 / 模型路径 / 日志 / 实例数全部可改,无需重新打包。

改动

  1. scripts/executor_config.py(新增):配置加载器。优先级:--config > $EXECUTOR_CONFIG > <EXE目录>/executor_config.json > <仓库根>/executor_config.json > 内置默认;单字段仍可被环境变量覆盖;相对路径按 EXE 目录/仓库根解析;数值/枚举/类型校验。
  2. executor_config.json(新增,仓库根模板):web_base_url / model_path / poll_interval / instances / log_dir / log_level / tool / enable_mock。
  3. scripts/run_task_executor.py:argparse 支持 --config / --instances / --interval / --mock / --log-dir / --log-level;logging 落盘;支持单入口多实例(instances>1)。
  4. scripts/run_task_executor_parallel.py:复用共享配置加载(保留原 CLI 兼容)。
  5. 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 元数据键排除。真实短扫描/多实例可在目标机验证。


2026-08-30 — P5-M1:前端全量 build 类型错误清零(backlog B1)

背景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。

改动

  1. web/frontend/src/api/index.ts:axios 实例类型改写为 UnwrappedApi 接口(get/post/put/delete 返回 Promise<T>,默认 any),类型声明与运行时行为对齐;拦截器逻辑原样保留(实例改名 instance 后 cast)。
  2. 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。


2026-08-29 — 方案详情页三栏职责重构(P2-M2 增强)

背景:边界条件栏与固定参数栏数量不平衡。根因:边界条件从模板全量渲染(27项),而固定参数只加载AI方案实际写入的少量参数;且边界条件栏混入了大量设计实现参数。

改动内容

  1. 边界条件栏瘦身(27 → 14项):只保留需求/约束型参数

    • 性能规格:功率/转速/转矩/电流/母线电压/效率/脉动/损耗
    • 几何约束:最大外径/轴向长度;热约束:最大温升
    • 需求描述:拓扑/防护等级/应用场景
    • 移出(归入固定参数):气隙、内径、槽数、极对数、匝数、并联支路、电流密度、磁钢材料、硅钢片、剩磁、冷却方式、环境温度、绝缘等级
  2. 固定参数栏扩容(模板驱动,36项全量展示)

    • 后端 app/services/fixed_params_template.py 扩充为36个参数,按电机工程习惯分8类
    • plan_generator.py 固定参数改为模板全量驱动:AI不再需要输出固定参数,系统按边界条件推断全部参数值
    • 前端 PlanDetail.vue 加载方案时按模板自动补齐缺失固定参数
    • 每个固定参数加来源标记(AI/用户),用户修改后自动切换为用户
    • 移除"添加固定参数"按钮与弹窗(参数已全量展示,后续扩展往模板里加)
  3. AI方案思路中文简短化

    • plan_generator.py 默认提示词改造:reasoning 用中文、约200字、只讲关键设计决策与核心参数
    • AI输出固定模板(plan_name/topology/scan_variables/search_strategy/acceptance_criteria/reasoning),固定参数由系统模板生成
  4. 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中确认后修正

2026-08-29 二期 — 本地执行器真实仿真全链路打通(P2 关键里程碑)

问题:前端"一键启动仿真"后一直"仿真中"无进度,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内操作。


2026-08-29 三期 — 平台化改造第一批:共享核心层 + 适配器抽象

背景:按平台化升级设计方案(docs/PLATFORM_DESIGN_V2.md),消除"指标定义三处漂移"与"解析器两套实现"两大平台性短板,为多工具/多拓扑/多策略扩展铺路。

改动内容

  1. 新建共享核心层 src/afmcore/(单一事实源)
    • metrics.py:25 项指标定义(key/label/unit/direction/required/aliases) + 归一化解析器
    • adapters/:SimulationAdapter 接口 + 注册表 + MotorCADAdapter 实现
  2. 三个消费端接入共享层:solver_core / robust_motorcad / metrics_constants 全部改为从 afmcore.metrics 导入
  3. 修复 tavg_nm/ripple_pct 解析缺口(TEST-003 遗留):根因为 robust_motorcad 无归一化精确匹配,已统一为归一化匹配(全角括号→半角、去空白、小写)
  4. 命名规避冲突:共享包从 platform 改名 afmcore(避免与标准库同名)

验证:单元验证全部 PASS(含全角字符解析/中文别名/% 守卫/三端导入/78 文件编译/适配器协议),详见 docs/TEST_RECORDS.md TEST-004。

进展路线(后续批次):P2 拓扑注册表 + task_executor 切换适配器;P3 执行策略接入(adaptive);P4 方案 Schema 统一 + 文档同步 + EXE 打包。


2026-08-29 四期 — 平台化改造第二批:拓扑注册表 + 执行器切换适配器

背景:按平台化设计方案 P2,消除“拓扑是裸字符串”与“求解器硬编码”两个平台性短板。

改动内容

  1. 新建拓扑注册表 src/afmcore/topology.py:SSSR 完整参数体系(8 组 37 项)注册,DRSS/SDSR 预留;提供拓扑验证/参数校验/UI 序列化
  2. plan_schema.validate() 集成拓扑校验:未知拓扑拦截,新增拓扑只做注册
  3. task_executor 切换 get_adapter():从硬编码 RobustMotorCADSolver 改为统一适配器入口;修复结果嵌套导致的 _compute_metrics 聚合空的缺口

验证:新增可重复运行回归测试 scripts/test_platform_registry.py(36 项断言全 PASS);79 个 .py 编译 0 失败;三端导入回归通过。详见 TEST_RECORDS.md TEST-005。


2026-08-29 五期 — P3 平台化改造(第一批:策略抽象层 + 自适应编排器)

背景:按 P3 实施计划(docs/archive/P3_IMPLEMENTATION_PLAN.md),把 Web 端已验收的 adaptive 搜索能力接到本地执行器,打通「方案 -> 批次任务 -> 本地执行 -> 回填搜索 -> 续批/收敛」闭环。

M1 执行策略抽象层(src/afmcore/strategies/)

  • 新增 SimulationStrategy ABC + STRATEGY_REGISTRY,执行器改为向策略要批次,不再硬编码全因子
  • full_factorial(笛卡尔积,自包含)/ lhs(纯 Python 拉丁超立方)/ adaptive(backend 注入桥接,共享层不依赖 web)三种策略注册可用
  • plan_schema 的 SearchStrategy.method 归一化(legacy active_learning/constrained -> adaptive)并经策略注册表校验

M2 任务模型扩展 + 自适应编排器

  • Task 模型新增 task_type / loop_id / batch_id / point_ids / dynamic 字段(旧库自动迁移 ADD COLUMN)
  • 新建 strategy_orchestrator.py:AdaptiveOrchestrator(start_loop / advance_loop / get_loop_status),桥 FeasibilityFirstSearch <-> 任务系统 <-> 本地执行器,loop 状态落盘 output/adaptive_loops/
  • 修复现存 bug:task_manager.report_results 未定义 plan_id(应取 task.plan_id)

验证:闭环回归脚本 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。


2026-08-29 六期 — P3 平台化改造(第二批:执行器批次化 + 多实例)

背景:P3-M3,让本地执行器原生支持 adaptive_batch 任务与多实例并行,配合 M2 编排器形成批次闭环。

改动(scripts/task_executor.py)

  • point_id 回传:逐点结果顶层带 point_id(OK/FAILED 均保留),编排器可精确回填搜索
  • 认领原子化:dispatch 失败(被其他实例认领)即跳过该任务,多实例不重复仿真
  • executor_id 唯一化 + 修复 report_results 本地模式 on_complete 参数个数不一致 bug

新增: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 原子迁移)防重复,执行器侧无需额外锁。


2026-08-29 七期 — P3 平台化改造(第三批:调度契约统一)

背景:P3-M4,统一两套调度状态词汇(TaskManager 的 pending/dispatched 与 BatchScheduler 的 queued),并让调度器任务字段与 Task ORM 对齐。

改动

  • 新建 web/backend/app/services/task_contract.py(无依赖契约层):规范状态常量 + STATUS_ALIASES 归一(queued->pending、canceled->cancelled、completed_with_errors->completed)+ normalize_status/is_terminal/merge_adaptive_fields
  • batch_scheduler.py:add_task 支持 task_type/loop_id/batch_id/point_ids/dynamic 透传,_summary 输出新字段(状态词 queued 向后兼容)

验证:scripts/test_p3_m4_contract.py(PASS),M2 闭环回归不破坏;见 docs/TEST_RECORDS.md TEST-008。

技术决策:用契约层声明统一词汇/字段而非重构两个既有服务,消除漂移同时保持向后兼容;状态归一采用「别名映射 + 未知词透传」(能报错而非静默)。


2026-08-29 九期 — P3 平台化改造(第四批:HTTP 全链路闭环验证)

注:历史记录中无“八期”编号,沿用原始记录。

背景:P3-M5,验证「orchestrator -> 任务系统 -> 本地执行器(HTTP) -> 仿真 -> point_id 回填 -> 续批 -> 收敛」全链路真实闭环。

改动

  • strategy_orchestrator.py:AI 分析按 KIMI_API_KEY 门控(无 key 时保持 quantitative,不空打 AI 日志)
  • 新增 scripts/test_p3_closed_loop.py:真实 FastAPI(temp DB)+ orchestrator + mock 执行器全链路闭环回归,exit 0

验证:闭环 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 平台化改造(第五批:Web 端执行桥 + 路由整合)

背景:P3-M6。Web 端已有 AdaptiveLoop 闭环(AI 方案 -> L0 -> FeasibilityFirstSearch -> 选批 -> report-results 回填 -> AI 分析 -> 经验库 -> 收敛),但「本地执行器执行」环节缺失;平台层已具备任务系统 + 执行器(批次 Task、point_id 回填)。本批打通两套体系。

改动

  • adaptive_loop.py:新增 submit_batch_to_executor() —— 把当前 pending 批次包装为 adaptive_batch Task(复用 task_manager 原语),交由本地执行器认领执行
  • routers/adaptive.py:新增 POST /api/adaptive/loops/{loop_id}/submit-batch 端点
  • 撤销误建的 adaptive_orchestrator 路由(与既有 adaptive.py 路径冲突),main.py 还原
  • 新增 scripts/test_p3_adaptive_execution.py:Web 端 AdaptiveLoop + 执行桥全闭环集成回归(temp DB + fake executor + 无 AI)

验证: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 循环并存。

P3 收尾遗留处理 + P4 平台化第四批(十期)

背景:用户要求"先处理遗留问题 → 写 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 端点
  • ASCII 纪律:plans.py + fixed_params_template.py 中文串转 \uXXXX(运行解码正确)
  • 环境依赖测试:test_api_client.py 真实链路;未动用户常驻服务

P4 实施(M1~M5,5 commit)

  • M1 Schema 单一权威src/plan_schema.py 增 parse/validate 入口 + 别名容错 + require_model_path 分级;web 端 main.py 注入 repo root,plans/ai_plan 接入校验(400/422)
  • M2 文档 V1.1→V2.0:设计方案追加"附录 B 实现现状对照"(蓝图 vs 实现逐项映射)
  • M3 EXE 打包scripts/build_executable.ps1 + PyInstaller onefile → dist/PCB-AFM-Executor.exe(12.6MB,--version/--self-test 通过)
  • M4 前端收敛曲线:search state 增 points_history(逐评估点数据)+ AdaptiveOptimize.vue echarts 收敛曲线
  • M5 L0 上提共享核心L0PreScreeningEnginesrc/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。