Files
cnc_wams/完善wasm/working/06-决策记录.md
2026-07-10 21:26:42 -04:00

317 lines
16 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.
# 06-决策记录
本文件记录关键技术决策。后续如需变更,必须新增记录说明原因、影响和替代方案,不直接覆盖旧决策。
## 记录模板
```text
## ADR-XXX 标题
日期:
状态:
背景:
决策:
理由:
影响:
变更条件:
```
## ADR-011 严格上游清单与生成 Vendor Overlay 分离
日期2026-07-10
状态:生效
背景:
`verify_vendor_sync.sh` 原来要求 vendor 树中的所有文件都来自 `source-manifest.txt` 并与锁定上游逐字节一致。前序 native TRT phase0 probe 又按 D-013 在 vendor 树保留了由 LinuxCNC `basic_sim.tcl` 生成、但不在锁定 commit 中的 `xyzac-trt_cmds.hal` fallback导致严格上游同步 gate 与已登记的运行目录 overlay 需求冲突。
决策:
`tools/source-manifest.txt` 继续只登记锁定 LinuxCNC commit 中可逐字节比较的上游文件。非上游生成 fallback 必须登记到独立 `tools/vendor-overlay-manifest.tsv`,至少绑定相对路径、固定 SHA-256 和 provenance。`verify_vendor_sync.sh` 必须拒绝未登记额外文件、source/overlay 路径重叠、重复 overlay、无效哈希、缺失 provenance 和哈希漂移。
理由:
这样既不删除 native phase0 所需的既有生成输入,也不把生成文件伪装成 LinuxCNC commit 内的上游源码。严格上游字节一致与少量显式生成 overlay 可以在同一 gate 中分别验证。
影响:
- 当前只允许一个 `xyzac-trt_cmds.hal` generated overlay固定哈希为 `d12f6c737000aba518c0a1502943f3aef17bbd5d54b4b8ae45a11f9f236a4ab3`
- `vendor sync validation complete` 表示所有 upstream manifest 文件一致,且所有额外文件均通过 overlay manifest不表示 overlay 文件存在于上游 commit。
- 新增 overlay 必须经过单独 provenance 审查,不能为了让 gate 通过而自动收录未知文件。
变更条件:
`xyzac-trt_cmds.hal` 可由锁定工具链在构建期确定性生成并迁出 vendor 树,或上游 commit 正式包含等价文件时,可以新增 ADR 调整或删除该 overlay 行。
## ADR-008 Full-process promotion 仅限 Web/WASM simulation runtime
日期2026-07-10
状态:生效
背景:
`04基于Web的LinuxCNC兼容数控仿真平台.txt` 将 Task、Motion、HAL servo-thread、五轴联动和 full-process 相关能力写为通过;`web-rtcp-5axis-xyzbc-trt-sim-plan` 也已具备 `full-execution-boundary.js`、task/HAL runtime、native readiness audit 等 Web/WASM 仿真运行时证据。但浏览器环境仍不是 LinuxCNC 原生实时内核,也没有运行真实硬件驱动、完整 native NML/process topology 或任意宿主 User-M/Tool DB 外部进程。
决策:
`完善wasm/working` 将 full-process promotion 限定为 `linuxcnc_task_motion_hal_wasm_simulation_runtime`。当 kinematics、interpreter、planner、machine-file staging、task/motion/HAL runtime、Tool DB Web simulation 和 controlled User-M Web simulation 全部通过时,可以声明 Web/WASM 仿真运行时晋级;同时必须保留 `hardwareDrive=false``hostRealtimeKernel=false``hostExternalUserMProcessReady=false``hostToolDbProcessReady=false``promotion_scope=web_simulation_only`
理由:
这样可以承认可复验的 Web/WASM task-motion-HAL 运行时进展,同时避免把仿真运行时误写成 LinuxCNC 原生实时系统、硬件控制系统或任意宿主外部进程执行环境。
影响:
- 新增 `22-04-Full-Process-Realtime-Runtime-Proof实现缺口复核.md`
- `ACC-034/INT-021` 可按实现缺口复核完成。
- `14-04-125项逐项源码证据绑定表.md` 中 full-process/realtime 项改为指向 `22`Web/WASM simulation proof 与 host/hardware/realtime false 必须同时记录。
- `verify_native_task_hal_audit.mjs` 生成的 readiness artifact 是 Web simulation boundary 证据,不是宿主实时/硬件 promotion 证据。
变更条件:
只有新增并通过显式 opt-in 的 host realtime、硬件、完整 native process topology 或宿主外部进程 gate 后,才允许新增 ADR 扩大 promotion 范围。
## ADR-009 HAL 基础组件必须由 vendored `.comp` 可复现派生
日期2026-07-10
状态:生效
背景:
04 将 `and2``or2``not``mux2``scale` 写为 HAL 已通过组件,但当前五个 `.comp` 只存在于上游 `linuxcnc/src/hal/components`,没有进入 `wasm-port/vendor/linuxcnc` 或 source manifest现有 HAL runtime 的 `loadrt``addf` 和 servo step 也只记录事件,不执行组件函数。
决策:
HAL 基础组件的 Web/WASM 实现必须先逐字节同步 vendored `.comp` 并锁定 SHA-256再使用 LinuxCNC `halcompile` 或能够证明由该 `.comp` 可复现派生的生成链产生预编译实现。禁止在 JS/TS 或项目自有 C/C++ 中手写等价公式后标记为 LinuxCNC 源码复用。`loadrt` 必须实例化 allowlist 组件,`addf` 必须绑定可调用函数servo step 必须真实更新输出 pin/signal未知组件保持 blocked。
理由:
五个公式虽然简单,但手写副本会建立第二套 HAL 语义来源,并绕过 source manifest、上游漂移和 LinuxCNC 生成命名规则。把 P1 同步、生成器 provenance、WASM symbol 和执行 evidence 串成一条链,才能证明组件行为来自锁定的 LinuxCNC 源码。
影响:
- 新增 `24-04-HAL-Component-Precompile-Manifest-Truth-Table-Gate落地蓝图.md`
- `4.7-4.11` 在五个 `.comp` 进入 vendor/source manifest 前不得晋级。
- `4.16` 仅允许预编译 allowlist 条件通过,任意运行时动态模块加载继续 Blocked。
- truth-table/formula 测试必须经过真实 `loadrt -> addf -> servo-step -> pin/signal` 路径,不能只直接调用测试 helper。
变更条件:
只有验收标准明确允许非 LinuxCNC 派生的独立 HAL 扩展时,才可新增单独的“产品扩展”路径;该路径仍不得计入 LinuxCNC 对标完成率。
## ADR-010 Project release readiness 与 host runtime promotion 必须分离
日期2026-07-10
状态:生效
背景:
当前 `wasm-port/build/project-release-readiness.json` 可以同时出现 `ready=true`、release gate 通过和非空 `blockedRuntimeFamilies`。Host readiness TSV 也可显示三个 opt-in probe 均可 dispatch但仍明确 `execution_enabled=0``promotion_allowed=0`Python stop-lookahead 单 fixture 已接受 native evidencemanual promotion lock 仍生效。
决策:
项目发布 readiness 与宿主能力 promotion 使用两套独立状态。`ready=true`、host ready、dispatch allowed、`ready_disabled_by_default`、native pass、evidence accepted、Node/Browser complete、manual unlock 和 promotion 不得合并或跳级。任何 probe 脚本不得直接写 `promotion_allowed=1`;只有独立人工审查 artifact 可以解除对应 fixture/family 的 promotion lock。User-M/Tool DB/Python process probe 不授权 Linux realtime kernel 或硬件驱动。
理由:
发布 gate 回答“当前已声明范围是否可发布”host promotion 回答“某项宿主 LinuxCNC 能力是否有完整运行证据并获准开放”。如果共用一个 `ready` 字段,会把默认禁用、单 fixture pass 或 Web simulation proof 误写成外部进程、实时内核或硬件已经完成。
影响:
- 新增 `25-04-Host-Runtime-Opt-In-Promotion-Evidence-Gate落地蓝图.md`
- 后续增加 `host_runtime_opt_in_evidence`、promotion state machine 和 release/promotion separation gate。
- Python stop-lookahead 只能按 fixture 记录;不能批量晋级全部 Python remap rows。
- `hostRealtimeKernel=false``hardwareDrive=false` 只能由独立 realtime/hardware 安全任务解除。
变更条件:
只有总验收标准改为要求宿主原生 LinuxCNC 部署且配套安全/人工审查流程已经实现时,才允许调整两套状态的组织方式;仍不得取消逐 family/fixture 证据。
## ADR-006 双项目总控采用“核心移植 + 代表应用”口径
日期2026-07-10
状态:生效
背景:
用户要求 `/home/mes123456/cnc_wams/wasm-port``/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan` 完全对标 LinuxCNC 源程序,并在 `完善wasm/working` 中创建相关文件。两个目录职责不同:`wasm-port` 是 LinuxCNC 源码到 Native/WASM/Browser/OPFS/SDK 的核心移植层;`web-rtcp-5axis-xyzbc-trt-sim-plan``xyzbc-trt.ini` 的 Web 代表应用和 UI/evidence 闭环。
决策:
`完善wasm/working` 采用“核心移植 + 代表应用”的总控口径:`wasm-port` 证明 CNC 核心语义来自 LinuxCNC 源码;`web-rtcp-5axis-xyzbc-trt-sim-plan` 证明这些语义能在真实 Web 应用中通过 OPFS、Worker、UI、3D 和 native/Web JSON 对比呈现。二者共用同一 LinuxCNC commit、同一 source reuse 约束和同一条件边界规则。
理由:
这能避免把 Web UI 工程误当成 LinuxCNC 核心移植,也能避免只看 `wasm-port` 命令全绿却缺少真实代表应用证据。双项目总控必须同时保留源码级证据和用户可见应用证据。
影响:
- 新增 `07``12` 作为跨项目总控文件。
- `09-联合任务矩阵.md` 管理跨项目任务;原 `04-任务矩阵.md` 继续管理 `wasm-port` 核心验收。
- `04基于Web的LinuxCNC兼容数控仿真平台.txt` 在 ADR-006 创建时为空;补齐后已由 ADR-007 和 `13-04验收文档任务对标矩阵.md` 重新纳入任务体系。
- `xyzbc-trt` 的完成结论必须继续由 smoke、evidence JSON 和 compare JSON 复验,不因文档登记自动通过。
变更条件:
如果后续出现新的 Web 代表应用、`04基于Web...txt` 补齐为正式需求,或 `wasm-port` 与 Web 应用职责边界改变,必须新增 ADR 更新总控口径。
## ADR-005 当前验收闭合采用“命令全绿 + 条件边界显式锁定”口径
日期2026-07-09
状态:生效
背景:
本轮已让上游基线、vendor 同步、Native/WASM/Browser/OPFS/UI/Host 聚合命令通过,但 Python remap、User M 外部进程、硬件驱动和实时内核天然涉及浏览器沙箱、外部进程或实时环境限制,不能因为 smoke 全绿就宣称无条件 LinuxCNC full-process 支持。
决策:
`ACC-001``ACC-023` 的当前闭合采用“可执行命令包全绿 + 条件边界显式锁定”口径:能由 LinuxCNC 源码、Native probe、WASM Node、真实浏览器和 UI/OPFS gate 证明的部分标为完成Python remap、User M、硬件/实时等仍保留 `manual_promotion_lock`、Blocked 或条件通过说明。
理由:
这样既满足当前发布前命令包 `unexpected_fail=0` 的可复验证据,又避免把浏览器环境无法直接承载的 LinuxCNC 外部进程/实时能力误报为已经完整实现。
影响:
- `04-任务矩阵.md` 中相关任务可以闭合,但状态使用“条件通过”而不是无条件“完成”。
- `05-验收证据.md` 必须保留 inventory `29/29/130/0`、skip/block 分类和 Python remap manual lock 说明。
- 后续如果要解除条件边界,必须新增 ACC 任务、源码归属、runtime owner、fixture 和验收 gate。
变更条件:
只有当对应 runtime 或安全边界真正实现,并且 Native/WASM/Browser/UI 证据同时通过后,才能把条件通过项升级为无条件完成。
## ADR-007 04 验收文档的“通过/100%”表述必须降解为待核验任务
日期2026-07-10
状态:生效
背景:
`完善wasm/04基于Web的LinuxCNC兼容数控仿真平台.txt` 已补齐,文档中声明基于 Web/WASM/OPFS 的 LinuxCNC 兼容仿真平台 10 个模块、125 个功能项总体 97.6%,核心模块 100%,并给出多项“通过”结论。但该文件本身不是命令输出、不是 LinuxCNC 源码、不是 Native/WASM/Browser evidence。
决策:
04 文档中的模块和功能项必须进入 `13-04验收文档任务对标矩阵.md`,作为待验证任务和目标声明处理。任何“通过/100%/超越”表述都不能自动成为 working 的最终验收结论;必须由 LinuxCNC 源码归属、`wasm-port` gate、目标 Web 应用 gate 和 evidence JSON 共同证明。
理由:
这与 `03完全对标LinuxCNC的可执行验收标准.txt` 的一票否决规则一致,可以避免把总结性文档当成可复验证据,也能防止 full-process、实时内核、动态加载、多通道、HAL Scope/Meter 等边界被静默标绿。
影响:
- `INT-010` 改为“04 参考说明纳入任务体系”。
- 新增 `INT-013` 负责 04 的 125 项逐行 evidence 绑定。
- 04 的受限项继续保留条件通过或 Blocked 口径。
变更条件:
只有当 04 每个功能项都绑定到源码、测试、命令输出和 evidence并且 `unexpected_fail=0`,才能把对应 W04 任务升级为完成。
## ADR-001 以 LinuxCNC 源码和测试资产作为唯一数控语义基准
日期2026-07-09
状态:生效
背景:
验收标准明确要求“完全对标 LinuxCNC”必须证明核心数控语义来自 LinuxCNC 源码、测试资产和运行规则,而不是界面相似或项目自研近似实现。
决策:
`wasm-port` 的 G 代码解释、刀补、参数、remap、刀具、轨迹规划、运动学、Task/HAL/Motion 等 CNC 语义只能来自 LinuxCNC 源码复用、vendored 同步或明确的薄封装。JS/TS、浏览器 UI 和项目自有 C/C++ 只能承担文件、调度、展示、持久化、C ABI 和边界桥接职责。
理由:
这能避免 Web 端逐渐形成第二套状态真相也能让上游测试迁移、Native/WASM/Browser 对比和 blocked table 具备共同基准。
影响:
- 新功能必须先找到 LinuxCNC 源码归属。
- 找不到归属的功能不能宣称为 LinuxCNC 对标功能。
- 疑似自研 CNC 语义必须通过 `verify_no_standalone_cnc_semantics.sh` 或人工审查解释清楚。
变更条件:
只有验收标准更新并允许某类非 LinuxCNC 语义作为产品扩展时,才能改变此决策;即使变更,也必须与 LinuxCNC 对标功能分开标识。
## ADR-002 采用 L0-L5 加 Blocked 的晋级模型
日期2026-07-09
状态:生效
背景:
只写“完成”无法区分源码已同步、Native 通过、WASM 通过、浏览器通过和 UI 发布,也容易把 full-process 或硬件依赖降级为解释器通过。
决策:
所有任务使用 `L0 已盘点``L1 已同步``L2 Native 通过``L3 WASM 通过``L4 Browser 通过``L5 UI 发布``Blocked` 表达真实进度。
理由:
该模型与验收标准的分层证据体系一致,可以防止跳级宣称,也方便后续按证据缺口继续推进。
影响:
- 任务矩阵必须记录晋级目标。
- 浏览器/UI 功能不能只凭 Native 或 WASM 结果标为 L5。
- Python remap、动态 loadrt、硬件驱动、实时内核等未闭合项应标 Blocked 或条件通过。
变更条件:
如果新增运行层级或验收标准调整证据层级,需要补充状态定义。
## ADR-003 把 `完善wasm/working` 作为总验收推进入口
日期2026-07-09
状态:生效
背景:
`wasm-port/working` 已存在 task/status JSON 等局部推进文档,并显示当前 task-HAL 工作已闭合。新的验收标准覆盖整个 LinuxCNC 功能树,需要一个更高层的总入口。
决策:
`完善wasm/working` 作为完整 LinuxCNC 对标推进入口,维护总任务矩阵、验收证据和决策记录;`wasm-port/working` 继续作为 `wasm-port` 内部具体阶段文档和历史证据来源。
理由:
这样可以避免把某个已闭合子方向误认为整体验收完成,同时保留既有工作成果。
影响:
- 后续总体验收先看 `完善wasm/working/README.md``04-任务矩阵.md`
- 涉及具体实现时,再跳转到 `wasm-port/docs``wasm-port/working` 和对应测试。
变更条件:
如果后续决定把总入口迁入 `wasm-port/working`,必须同步迁移任务编号、证据和决策记录,避免两套矩阵并行。
## ADR-004 截图和 UI smoke 只能作为补充证据
日期2026-07-09
状态:生效
背景:
验收标准明确浏览器测试不能只验证页面元素存在UI 的坐标、模态、刀具、主轴、程序状态必须与底层 LinuxCNC 状态快照一致。
决策:
截图、录屏、DOM smoke 和页面存在性检查只作为 P5 证据。任何核心语义、OPFS、Worker、UI 状态发布都必须有 C ABI、状态 JSON、OPFS 文件或底层快照证据支撑。
理由:
UI 可以显示正确外观但底层状态错误P4/P5 分离可以防止验收被外观证据污染。
影响:
- UI 任务必须绑定底层状态断言。
- 真实浏览器 smoke 需要检查运行结果、错误、文件或快照,而不是只检查按钮。
变更条件:
无底层状态可取的纯视觉展示功能可用截图验收,但不得宣称 LinuxCNC 核心语义通过。