Files
FreeCADWasmDev/docs/WEB_BUSINESS_MIGRATION_RULES.md
wangdequan 9a7c4f0335 Save FreeCAD Web workspace sources and user validation evidence
IFC native binding remains incomplete; preserve accurate test results.
2026-09-15 22:01:58 +08:00

115 lines
18 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# FreeCAD Web 功能业务移植铁律
## 2026-09-11 最新用户执行优先级
用户铁律原文:**全部功能先打通,现在不需要验证,等待用户使用时自己验证。** 本条覆盖下文历史的自动验收与验证优先安排,适用于人工执行、无人值守、重启及上下文续接;未经用户新的明确要求,不得恢复自动验证。
- 当前阶段只做既有成果复用、功能实现/接线、必要的增量编译链接、资源同步及路由生成;不自动运行或编写业务验收、回归、浏览器、性能及历史对账任务。
- 已有测试、验收证据、源码、WASM 和缓存全部保留,但验收失效不得重新占用功能实施队列;测试交给用户使用阶段决定。
- 接通完成记为 `implementation_ready` 或“待用户验证”,绝不伪造 `acceptance passed`。当前进度以实际接线和产物为主,历史验收比例不作为本阶段停止条件。
- 运行策略持久化在 `docs/current/execution-policy.json`;同模块共享调用链集中补齐,一次必要增量编译,不反复验证或重做已完成工作。
技术路线固定为用户此前已采用的 **OCCT WASM、FreeCAD WASM、Three.js、OPFS、React**。复用现有几何内核、原生文档能力、三维显示、浏览器文件存储和交互组件,不另换路线。计算与文档语义在 WASM 内执行,Three.js 显示、React 交互,实际文档文件由 OPFS 持久化;localStorage 元数据不能冒充 OPFS 文件保存。
职责、已核对调用链、当前未统一部分和构建检查集中在 `docs/OCCT_GEOMETRY_BOUNDARY.md`。前端构建必须执行 `npm run check:geometry-boundary`,禁止把静态检查通过当作全项目唯一运行实例已完成;未贯通的真实几何入口继续保留并修复。
2026-09-09 用户再次明确:**几何内核使用 OCCT WASM,三维显示使用 Three.js**。FreeCAD WASM 承载桌面文档、特征、约束及业务接口,并复用现有 OCCT 几何能力;不得用 Three.js 网格操作替代 CAD 内核语义。STL 读写优先复用现成 OCCT 能力,按既有功能边界接入;已链接到 FreeCAD WASM 的 OCCT 仍属于这条路线,不为名称区分重复加载独立内核或跨 WASM 传裸指针。
2026-09-08 梳理:本文件是项目铁律的统一入口,适用于人工、无人值守及优化回合。执行优先级为:用户最新明确要求、本文件、已制定方案的具体操作步骤、历史任务卡与报告。旧提示词、旧任务卡及统计口径不得覆盖用户要求;遇到冲突先按这一顺序核对,不另起一套方案。
开始任务及上下文恢复时先核对本文件和当前检查点,明确本轮复用什么、真正缺什么、准备执行什么。主线是把桌面 FreeCAD 移植到 Web FreeCAD,以实际功能及路由推进,不是重复建设调度系统或逐 API 排队。
## 现有 WASM 与本地执行优先铁律
2026-09-09 用户明确要求:**“牢记 OCCT WASM 已经提供了,尽量利用上。”** OCCT WASM 已提供是跨回合、重启和无人值守续接必须保留的既定事实。先从现有模块 manifest、`web/public/kernel` 和已核对的构建目录复用实际 OCCT 产物及既有绑定;不得重新索要、另换内核、重复实现几何算法,或仅因缺少新验收记录而重新编译。只有相关产物确实缺失、输入依赖改变或原生首错明确要求修复时,才增量处理受影响目标。
2026-09-09 用户追加铁律:**“OCCT WASM 已经提供了,几何算法要统一到这个唯一出口,这个环节要打通,并且充分利用上。”** 几何运算以已提供的 OCCT WASM 为唯一内核出口,接通现有页面/Facade/Worker 到实际 OCCT 运算和结果返回的链路;FreeCAD 的文档与特征语义保留,Three.js 只负责显示。不得新增平行几何内核、用前端算法或固定网格替代,也不得把静态链接关系当作全部入口已经统一的证明。独立模块的内存、原生对象归属和序列化交接必须核对,唯一出口的实际贯通情况按真实调用与结果逐项确认。
2026-09-12 用户再次明确:**“铁律:模型算法,来源于 occt wasm 唯一接口。”** 本条是几何实现的强制归属规则:任何模型算法、拓扑运算、布尔、曲面处理、网格化及其权威结果,必须通过已经提供的 OCCT WASM 唯一接口;FreeCAD WASM 只承载文档/特征/事务语义并衔接该出口,Three.js 只显示 native 结果。禁止以 Three.js CSG、前端数学、固定网格、Assimp 或另一个独立几何库替代,也禁止仅凭“链接 OCCT”或“编译成 WASM”宣称已经接通。发现旁路时,先回接现有 OCCT 接口;若接口缺失,记录真实依赖缺口,不用占位结果绕过。
2026-09-08 用户明确:“不需要把源码提交给你,在本地编译连接测试就可以的。”“大部分源码,我已经编译完成 wasm 了,你直接利用就可以了。” 已编译的 WASM 是当前执行起点,不能把已有移植当作未开始。
- 先使用 `web/public/modules/manifest.json` 中实际命令路由对应的现成 runtime/WASM,以及 `web/public/kernel`、`freecad-source/build-web` 的既有产物。直接接入现有 Worker/Facade、页面和针对性测试;不先重新分析或编译桌面源码。
- 已有产物和证据的输入指纹未变时直接复用。构建系统的依赖检查不等同于重新编译;保留必要检查,但不得以缺少新的回执、切换任务或新开模型会话为由重新链接。
- 仅在产物缺失、相关源码或依赖实际改变、或运行首错确认必须修改 native 实现时,增量构建受影响目标;纯前端接线和缺失业务用例不重建未变化的 WASM。
- 编译、链接与针对性测试在本机完成,不要求用户重新提交或上传源码,不以模型重审或远程仓库推送为执行前置。已有命令可直接执行时由本地流水线完成;源码只用于定位明确缺口和必要修复,不转储整库源码或完整日志。
- 必要源码片段被模型读取时仍会进入模型上下文;本地构建不意味着模型完全离线或片段零传输。不得把“无需用户提交源码”误报成此类保证。
- 现成 WASM 是可复用成果,业务结果仍按真实输入和实际执行确认;不得因缺少验收而否认产物,也不得仅凭产物存在宣称全部业务完成。
## DXF 使用已有 C++ 实现
用户已明确:DXF 已经移植完成,FreeCAD 源码中已有 DXF 的 C++ 源码,直接使用用户提供的实现与编译成果。
- 已确认源码为 `freecad-source/src/Mod/Import/App/dxf/ImpExpDxf.cpp`、`ImpExpDxf.h`、`dxf.cpp`、`dxf.h`,读写实现包括 `ImpExpDxfRead`、`ImpExpDxfWrite`。优先复用承载它们的现有 WASM,不重新编写 DXF 解析器、导出器或另做 Python 版移植。
- `AppImportPy.cpp` 的 `Import.readDXF` / `Import.writeDXFObject` 是 C++ 实现的调用绑定;不能因上层出现 Python 入口,就把已有 C++ 底层误判为缺失,更不能反复寻找旧 Python DXF 库。
- 复用 `docs/business-acceptance/Draft.json`、`tools/draft-business-cases.mjs` 与 `docs/current/business-acceptance.json` 中有效证据。DXF 的已完成实现不再作为新算法移植任务排队;其它工作台若缺少入口,只补其接线,不重做底层读写。
- 只有明确受影响的运行路径、输入、产物变化或新的真实故障,才重新确认相应业务。重复验收不是新增功能,重复刷新回执或证据不能计作新交付;已完成记录不得为刷新统计而重开。
## 项目定位与已有成果复用铁律
用户于 2026-09-08 明确要求:**“本项目是将桌面版的 FreeCAD 移植到 WEB FreeCAD,前期已经做了大部分工作,要充分利用上。”** 这是所有后续实现、优化和续接的既定前提,不是从零开发另一套 CAD。
- 以用户提供的桌面版 FreeCAD 源码和资料为业务语义依据,继续移植到 Web FreeCAD;不得用重新发明的简化算法、固定样例或模拟结果替代已有 FreeCAD 实现。
- 开始任务前先核对并复用前期已完成的桌面源码移植、原生适配、模块 WASM、增量构建目录、依赖、缓存、Facade、Worker、页面接线、用例和有效证据。入口为 `docs/current/provided-source-index.md`,已核对且指纹未变的结果直接沿用。
- 已有实现可用则接通并复用;已有功能但缺少证据则补必要用例;接口不一致则定点补接线;确有缺陷则修改受影响部分。只有确认不存在可复用实现后才新增,不得无依据推倒重来、重复扫描、重复编译或重复验证。
- “尚未取得当前业务验收证据”不等于“前期没有完成工作”。源码实现、接线、构建产物和实际业务结果分别记账;既不抹掉前期成果,也不把已有回执直接当成全部功能通过。
- 每次修复和移植应记录复用的实际路径或证据、具体剩余缺口、本次改动及实际结果;把执行时间用于补齐缺口,不能以重新分析或重复建设代替推进。
## 源码与资料优先铁律
用户于 2026-09-08 明确要求:“先搜索我提供的 FreeCAD 的源程序和相关资料”。本条适用于人工协作、无人值守业务批次及每 30 分钟的优化任务。
用户已明确确认:**“我已经提供了桌面版 FreeCAD 的源码和资料。”** 这是项目的既定前提,跨会话、重启及上下文续接均必须保留,不得重新假定用户尚未提供。
- 先复用已有 WASM、接线与有效证据;只有定位具体缺口需要源码时,才定点搜索用户已提供的 FreeCAD 源程序、依赖和资料。源码是修复依据,不是每轮重新审阅、重新编译的前置任务。
- 本地资料入口为 `docs/current/provided-source-index.md`;桌面源码主目录为 `freecad-source`。先核对索引、实际路径、相关符号和版本,不得把路径写错、一次搜索无匹配或尚未检索解释为“用户未提供源码或资料”,不得据此重复索要、空等或从零重写。
- 优先复用当前项目 `freecad-source/src`、`FreeCADBaseLib/sources`、`docs`、`tools`、`web/src` 和现有 `freecad-source/build-web` 产物。用户提供的其它本地源码与资料按已确认的目录索引继续查找。
- 已核对且指纹未变的搜索结果直接复用,记录实际路径、关键符号和发现;不得每回合重复全量扫描,也不得把路径猜错或未检索到当作源码不存在。
- 本地实现已有的,先移植或接通现有实现;本地资料不足的,先说明检查范围和具体缺口,再定向查找官方外部资料。不得跳过用户提供的源码而重新发明实现或先依赖外部搜索。
- 搜索始终服务于当前功能模块业务和功能路由,不扩大为逐 API 清查。验收失败回到对应业务修复,不能用固定样例、摘要或静态成功标记代替实际业务结果。
- 发现可在已授权项目范围内解决的问题,必须及时利用本地源码和资料定点修复,并核对实际构建或业务结果;不得只监测、登记瓶颈、调整重试参数或反复等待。外部服务异常与本地可执行工作分别处理,不能据此声称本地源码不可用。
## 完成定义
- 主线只有用户业务及其功能路由。Python API、对象、工作台、GUI、格式和依赖均由对应业务需要驱动落地,不建立逐 API 移植队列。
- 846/791 是旧清单规模,不是固定上限。遗漏的桌面命令、菜单、工具栏、格式和交互必须映射到业务记录;发现遗漏就补充,禁止通过缩小分母取得满分。
- 分开记录路由接通、实现/构建回执、业务完成。只有真实输入、当前文档状态和 FreeCAD WASM 运算产生正确结果,才能确认对应业务完成。只返回固定 fixture、参数回显、摘要、状态字符串或空成功不能算完成。
- 业务结果确认仅覆盖当前业务及其共享执行链;不启动全量 API、历史 Full Parity 或无关测试。已有业务证据与源码、产物匹配时直接复用;失效只重开受影响模块。
- 历史实现回执、源码、构建目录、WASM/data、缓存、可用 Facade/Worker 和业务用例全部保留。缺少业务证据不等于从零重写;先复用和补接线,最后才新增实现。
## 持续执行顺序
1. 承接当前检查点,先修直接阻断当前业务的真实问题;有效的已有结果直接沿用,不重新领取已完成项。
2. 按已定交付顺序贯通工作区、Document、Part、Sketcher、PartDesign 和文件业务,再推进工程工作台及其余完整范围。模块独立、业务成组,不退回逐 API 队列;优先子集不得替代全部迁移范围。
3. 使用用户文件、实际选中对象和当前文档贯通导入、编辑、重算、保存、重开、导出,以及树/属性/选择/视图、撤销重做、错误和取消。不得用临时固定样例替代用户文档。
4. 已有用例直接在本机执行或复用有效结果;缺接线则补接线,缺用例则补必要断言,发现 native 缺陷才修改对应 C++/Python 实现。实现与必要业务确认交替推进,不为验收重复重建未变化的 WASM。
## 效率与边界
- 2026-09-09 用户要求将本次解阻经验应用于后续移植。所有后续工作包遵守 `docs/UNATTENDED_WORKFLOW.md` 的“业务解阻固定流程”:复用本机成果,最小失败输入,原生阶段计时,按证据检查线程/事件循环/GIL,修共用入口,受影响目标增量构建,再确认相关组并复用有效证据。禁止仅增大超时/线程池、重跑原失败大组或重新实现已有算法;Part/Mesh 已通过结果见 `docs/current/part-mesh-business-unblock.md`,不得据此假定其它模块全部通过。
- 同模块同执行模型成批修改,共享 native dispatcher、Facade/Worker 和参数 schema;相关改动合并一次增量构建/链接。
- 模块专属的桌面命令参数、回执校验和选择同步放入已接通的 `web/src/<module>-desktop-adapter.ts`;当前 Part、TechDraw 已有适配器,直接复用。只有真实共用协议缺陷或首次接线才改共用 `desktop-command-dispatcher.ts`,避免单模块修改让全部有效证据反复失效;不能通过取消指纹校验掩盖真实共用变更。
- WASM 按模块动态加载,使用统一 `{cmd,args}` / `fc_web_dispatch_json` 与现有 Facade/Worker。页面和其它模块保持运行,只替换受影响 Worker;同一 revision 的 JS/WASM/data 配套使用,替换前处理取消与资源释放。不得逐命令建立 WASM,也不得合成单体 WASM。
- 2026-09-09 用户补充:按功能模块独立编译 WASM,根据需要预加载。直接沿用 `docs/WEB_WASM_INCREMENTAL_MODULARIZATION.md`、现有模块 manifest 和预加载入口;仅预取当前业务将使用的模块,地址去重、下载并发上限 2,缓存预取与 Worker/原生运行时初始化分别计时。已有产物不重编译,首屏不预加载全部模块;跨独立 WASM 不传递原生指针。
- 后台计算、几何、约束、文档和持久化由移植的 FreeCAD C++/Python 在 WASM 内执行;React/TypeScript 负责交互和编排。
- 失败只修当前业务首错,保留成功产物。历史失败不得无差别重放;直接关联当前业务的失败随批次修复,其余保留分类和最终对账。能在本地解决的应及时解决,不能只监测或用冷却、重启冒充修复。
- 不删除历史回执、不伪造验收、不仅删除保护判断就宣称功能完成;保护解除前必须确认实际 Worker/native contract 可执行。
- 调度器持续领取模块业务包,直到业务清单全部闭合。停止、额度耗尽、环境错误和暂时无任务必须如实显示,不得解释为全部移植完成。
- 无人值守自动修复:续接保留批次、预检和启动入口共同排除冷却业务;watchdog 独立检测违反冷却规则的新回合,记录恢复请求并在工具结束后重启、重排。已知调度故障自动处理,未知业务语义缺口继续按原业务排队,禁止以重启冒充实现进展。
## 上下文、耗时和进度
- 上下文只带当前批次、必要路径/指纹/片段、首错、剩余问题和下一步;全文、历史和构建日志留在磁盘。默认提示词上限 24000 UTF-8 字节,按完整字段和源码行选取;不能把回合累计输入 token 当作单次请求上下文,也不能因换会话重复全库检索。
- 逐步记录准备、读取、模型/接口等待、编辑、编译、链接、同步和测试耗时。事件间隔不是纯本地计算时间;发现高耗时步骤后要解决具体原因,不无限增加统计和规则文档。
- 已有实现、WASM、路由、业务验收分别汇报。重复通过、证据刷新、任务切换、文档更新及调度轮数不是新增业务交付;验收比例也不能冒充全部源码移植完成度。
- 当前业务做针对性本地测试,不在每个小批次重复全量 API、Full Parity、浏览器矩阵或无关历史测试。全量收口按既定方案和用户指令执行;不伪造通过,不删除失败或已有成果。
## 业务结果合同
`docs/business-acceptance/<Module>.json` 声明一个模块的复用用例入口:`{"command":["node","tools/<module>-business-cases.mjs"]}`,也可使用项目内 Python 脚本。入口通过 `FREECAD_BUSINESS_IDS` 只执行当前批次。
脚本 stdout 输出一个 JSON 对象:`{"schema":"freecad-web-business-cases/v1","results":[{"capabilityId":"<业务 ID>","status":"passed","cases":[{"input":{},"assertions":[{"name":"实际结果断言","passed":true}]}]}]}`。`input` 必须记录实际请求,断言必须检查运行结果;不得直接写常量通过。计算业务必须执行真实 WASM;UI 业务必须操作真实页面。可复用已有脚本及 fixture,但必须证明当前业务语义,不能用模块 smoke 覆盖整个模块。
外层运行 `tools/run_business_acceptance.py`,保存执行命令、输入/断言、源码/产物指纹及证据哈希。只有该证据有效时业务进入完成计数。实现阶段的构建回执继续独立保留。