# 27-04 HAL Component Precompile Runtime Gate 实施记录 ## 定位 本文件落实 `ACC-039/INT-026`,承接 `24` 的阶段 B-D 和 `26` 的 P1 源码同步结果,把 `and2`、`or2`、`not`、`mux2`、`scale` 从“源码已同步”推进到 LinuxCNC `halcompile` 派生、预编译 manifest、WASM 实例化、线程回调、net 传播和代表 Web 配置消费均有机器 gate 的状态。 严格边界:本轮只晋级 Web/WASM 虚拟 HAL 仿真运行时。`dynamicLoadrtSupported=false`,未知组件必须 blocked;宿主 RTAPI 实时内核、共享内存、内核模块、硬件驱动和任意动态模块加载没有晋级。 ## LinuxCNC 派生链 生成入口: ```text wasm-port/tools/generate_hal_component_sources.sh wasm-port/tools/generate_hal_component_sources.mjs ``` 生成器固定为锁定源码树中的 `../linuxcnc/bin/halcompile --preprocess`。脚本校验 LinuxCNC HEAD 与 `tools/upstream-baseline.txt`,从五个 vendored `.comp` 生成 `build/generated/hal-components/*.c`,仅规范化生成时间行并附加最窄的 start/reset C ABI。`generation-report.json` 逐组件记录 source、generator、command fingerprint 和 generated SHA-256。 生成 C 不进入上游 vendor manifest,也不冒充 LinuxCNC 原始源码;其上游语义仍由 `26` 的 P0/P1 字节和固定哈希 gate 约束。 ## 预编译 Manifest 新增 `wasm-port/runtime/manifests/hal_component_precompile_manifest.json`,固定: - `upstreamCommit=60597ee0718873d2449058c824262a275e5e4bad`; - allowlist 恰好为 `and2/or2/not/mux2/scale`; - 每个组件的 `.comp` 路径、source SHA-256、generated path、factory/step symbol、pin 和 `count/names` 参数; - `dynamicLoadrtSupported=false`; - `unknownComponentPolicy=blocked`。 `verify_hal_component_precompile_manifest.mjs` 同时复算 source/generated hash,并将 manifest、generation report 和实际文件闭合。 ## 真实执行链 `linuxcnc_hal_runtime.cpp` 现按以下路径执行 allowlist 组件: ```text loadrt + names/count -> allowlist/factory -> halcompile 生成的 pin 与 hal_export_funct -> addf 绑定 callback/instance -> lchal_step_threads 调用生成公式 -> HAL_OUT 更新 signal -> net 传播到下游 pin ``` 运行时同时补齐: - `names=` 与 `count=` 互斥和非法参数 blocked; - 未知 `loadrt` 返回 blocked,不再只记成功事件; - LinuxCNC HAL `net` 行的 `=>`、`<=`、`<=>` 方向标记解析; - 同一 WASM 模块重新初始化 HAL session 时清空生成组件实例链; - 保留 `trivkins` 既有 legacy boundary,避免回退既有 Task/Motion gate。 ## 专项证据 ```bash cd wasm-port ./tools/build_task_hal_wasm.sh node tests/wasm/node/verify_hal_component_precompile_manifest.mjs node tests/wasm/node/verify_hal_component_truth_tables.mjs node tests/wasm/node/verify_hal_component_thread_net_execution.mjs ``` 实际输出: ```text hal_component_generation=ok linuxcnc_task_hal_wasm_build=ok hal_component_precompile_manifest=ok hal_component_truth_tables=ok hal_component_thread_net_execution=ok unknown_loadrt_component_blocked=ok hal_component_session_reset=ok ``` truth-table gate 覆盖 `and2/or2` 各 4 组、`not` 2 组、`mux2` 两路选择和 `scale` 三组正负 gain/offset 浮点公式,输出 `build/evidence/hal-component-truth-table-evidence.json`。thread/net gate 证明生成函数真实执行、输出 signal 传播、非法参数阻断和第二 HAL session 重建。 ## Web 代表配置消费 目标 Web 项目新增 `tests/node/verify_hal_component_runtime_evidence.mjs` 并挂入 `smoke:node`。gate 读取 vendored `xyzac-trt_cmds.hal` 中: ```text loadrt mux2 names=J0_mux,J1_mux,J2_mux,J3_mux,J4_mux loadrt scale names=rpm_rps addf J0_mux servo-thread addf rpm_rps servo-thread ``` 随后用同一 task-HAL WASM 实例化并执行 `J0_mux` 和 `rpm_rps`,验证 `J0_mux.out=37.25`、`rpm_rps.out=20`,同时阻断 `web-local-formula` 未知组件。Web 项目没有复制五个组件公式。 ## 回归结果 以下既有 gate 全部通过: - `verify_hal_component_source_sync.sh`、`verify_vendor_sync.sh`; - `verify_hal_runtime.sh`、`verify_task_hal_wasm.sh`; - 目标 Web `smoke:node`; - `verify_linuxcnc_task_hal_runtime.mjs`。 补充执行的 `build_native_probes.sh` 已通过。全量 `verify_native_probes.sh` 后续在组件范围外的 `xyzac_switchkins_test_3.ngc` 出现 Bus error;该 INI 引用锁定源码树中不存在的 `xyzac.var`,汇总产生 1 个 unexpected fail。本轮没有将其伪装为 expected-fail,因此不把全量 native 包列入上述通过清单。 后续状态:该历史失败已在 `ACC-045/INT-032` 中由当前 source/vendor 资产和串行全量复验解除。最终结果为 sim-config `159 total / 151 pass / 8 expected_fail / 0 unexpected_fail`、nc_files `107 total / 101 pass / 6 expected_fail / 0 unexpected_fail`,详见 `33-Native全量回归最终收口.md`。 系统 `/usr/bin/emcc` 与 `wasm-opt` 版本不匹配,因此 `wasm_incremental_build_lib.sh` 现优先加载仓库机器已有 EMSDK;最终构建使用 EMSDK 6.0.2 并通过。 ## 04 状态 | 04 项 | 本轮后状态 | | --- | --- | | `4.7-4.11` | L3 条件通过:LinuxCNC 派生预编译 Web/WASM 仿真运行时、truth-table/formula、thread/net 和 Web 代表配置 gate 通过 | | `4.16` | 条件通过/Blocked:allowlist `loadrt` 可实例化执行;未知组件和任意运行时动态模块加载仍 blocked | ## 下一步 优先落实 `23` 的 HAL Meter/Scope JSON evidence,或 `25` 的 host runtime evidence/release-promotion 分离 gate。不得从本轮组件仿真证据继承宿主 realtime 或 hardware promotion。 ## 结论 `ACC-039/INT-026` 已闭合五个基础 HAL component 的 LinuxCNC 派生预编译运行时证据。04 的 `4.7-4.11` 可在 Web/WASM simulation 边界内晋级,`4.16` 仅对固定 allowlist 条件通过;动态模块加载仍不支持。