项目整体完成情况与后续执行计划 生成时间:2026-06-13 CST 本文件接替 `text5.txt`。后续工作按 `text6.txt` 执行;除非明确要求审计旧记录, 不要再回到 `text1/text2/text3/text4/text5` 扩展进度。`text5.txt` 作为历史归档 保留。 一、text5 重复记录问题处理结果 1. 问题原因。 `text5.txt` 后段出现过重复进度记录,主要发生在快速连续执行时: - 工作已经在提交中完成,但继续轮次又根据旧上下文重复追加同名记录; - 未先核对 `git status --short`、`git log -n`、`tail text5.txt` 和标题唯一性; - 在记录 `m98m99`、`g10`、`g52`、early direct-file guard 时,曾出现同编号或同主题 重复段。 2. 已完成清理。 当前 `text5.txt` 已完成重复记录清理: - 当前记录范围到 `八十三、2026-06-13 继续执行记录:more direct-file staging path guard`; - 标题唯一性核查命令: ```bash awk '/^[一二三四五六七八九十百]+、/ {print}' text5.txt | sort | uniq -d ``` 当前输出为空,表示没有重复标题。 3. 后续防重规则。 从 `text6.txt` 开始,每轮执行必须先做下面四步: ```bash git status --short git log -5 --oneline tail -n 120 text6.txt awk '/^[一二三四五六七八九十百]+、/ {print}' text6.txt | sort | uniq -d ``` 执行规则: - 如果 `git status --short` 是 clean,且最新提交已经包含当前建议工作,不要重复追加记录。 - 每轮只追加一个新的中文编号记录;提交前再次检查标题唯一性。 - `text6.txt` 只记录新的后续进度,不复制 `text5.txt` 的长历史。 - 每批完成后,如果要写记录,先写 `text6.txt`,再提交该批代码和记录。 - 如果发现重复记录,先做 dedupe 清理并提交,再继续新功能或新 guard。 二、当前项目纪律 1. LinuxCNC 仍是唯一 CNC 语义来源。 G-code、remap、tool、parameter、planner、kinematics、user-M、tool DB、Python remap 等语义必须来自 LinuxCNC upstream 或 vendored LinuxCNC C/C++/配置/脚本源码。 2. 本项目允许实现的范围仍限于: - build; - source sync; - runtime shim; - filesystem staging; - OPFS; - WASM/browser boundary; - 测试胶水; - 文档; - 机器可读 gate/artifact。 3. 禁止事项继续有效: - 不在 JS 中重写 G-code 或 CNC 语义; - 不修改 vendored LinuxCNC 源文件来让测试通过; - 不把 full-process/HAL/UI/Python/tool DB 依赖伪装成 standalone pass; - 不把 expected failure 硬改成 pass,除非已有 LinuxCNC-owned runtime proof,并且 native、Node、browser gate 都按顺序通过; - browser 不能依赖目录枚举。 三、当前完成情况 1. WASM port 基础架构已稳定。 `wasm-port` 已按独立移植工作区组织,包含 vendor、runtime/core、runtime/sdk、 runtime/opfs、runtime/ui、native/wasm/browser tests、docs 和 tools。 2. 关键基线保持稳定。 - `linuxcnc/nc_files` native Layer 1: - `total 107` - `pass 101` - `expected_fail 6` - `unexpected_fail 0` - `linuxcnc/configs/sim` native Layer 2: - `total 159` - `pass 151` - `expected_fail 8` - `unexpected_fail 0` - Node sim-config inventory: - `executed=28` - `passed=28` - `skipped=131` - `unexpected_fail=0` 3. blocked runtime family 仍未 promotion。 仍 blocked,不允许 promotion: - `L4-USER-M-PROCESS` - `L4-TOOL-DB` - `L4-PYTHON-REMAP` 当前 host 仍按缺少 LinuxCNC host runtime 处理,不执行任何: ```bash ENABLE_MILLTURN_USER_M_RUNTIME_PROBE=1 bash wasm-port/tests/native/probe_millturn_user_m_runtime.sh ENABLE_TOOL_DB_RUNTIME_PROBE=1 bash wasm-port/tests/native/probe_tool_db_runtime.sh ENABLE_PYTHON_REMAP_RUNTIME_PROBE=1 bash wasm-port/tests/native/probe_python_remap_runtime.sh ``` 4. 近期已完成的 staged path guard。 已完成并提交的近期批次包括: - `m98m99` 24 项 fixed `.ngc` manifest 的 staged path guard; - `g10` 5 项 fixed `.ngc` manifest 的 staged path guard; - `g52/g92` direct-file staged path guard; - early direct-file staged path guard: - `do-while-break` - `exists` - `return-value` - `subs-follow-main` - `fractional-linenumbers` - `crazy-paths` - INI-context/staging helper guard: - `oword-unwind` - `sequence-number` - `nested-sub-error` - `abort-hot-comment` - `m19` - `iniparam` - `iniparam-failassign` 5. 当前最新提交。 当前最近提交包括: ```text 6899195 Guard more direct-file staging paths 4e9ca73 Deduplicate early fixture progress note 675ee5f Guard early direct-file staging paths 17df47d Guard g52 staging path bf17469 Guard final g10 staging paths ``` 四、当前必须保持通过的验证入口 每批后续改动至少运行: ```bash git diff --check wasm-port/tools/verify_vendor_sync.sh wasm-port/tools/verify_no_standalone_cnc_semantics.sh SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh wasm-port/tests/host/verify_host_smokes.sh ``` 涉及 native baseline 或大范围 source/staging 改动时,再运行: ```bash wasm-port/tests/native/verify_nc_files.sh wasm-port/tests/native/verify_sim_configs.sh wasm-port/tests/native/verify_native_probes.sh ``` 五、下一步执行计划 1. 当前第一候选批次。 继续 early direct-file fixture staged path guard,小批量选择: ```text oword-bug315/test.ngc oword-bug315-p2/test.ngc namedparam-bug424/test.ngc ``` 执行目标: - Node 侧增加 fixed `.ngc` manifest; - Node 侧与 `interpRegressionNgcFilesRecursive(...)` 精确对账; - Node 侧检查 staged path 与 fixed manifest 一致; - browser 侧增加 fixed-count 和 duplicate-free guard; - browser 侧检查 staged path 去掉 `/work/browser-interp/.../` 前缀后与 fixed manifest 一致; - browser 仍不枚举目录。 2. 第一候选批次验证。 执行: ```bash git diff --check SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh wasm-port/tools/verify_vendor_sync.sh wasm-port/tools/verify_no_standalone_cnc_semantics.sh SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh wasm-port/tests/host/verify_host_smokes.sh ``` 如果通过,提交建议: ```text Guard oword/namedparam staging paths ``` 3. 后续候选原则。 继续只选: - 已有 Node/browser coverage; - 不依赖 HAL/task/tool DB/Python remap/user-M process; - direct-file 或 staging helper 已成型; - 每批 2 到 3 个 case; - 只做 host/filesystem staging guard,不新增 CNC 语义。 暂不推进: - blocked runtime promotion; - browser full 159 sim-config inventory; - full-process/HAL/UI/Python/tool DB 执行; - upstream intake 大批量扩面。 六、下一次开始执行时的第一条命令 从这里继续: ```bash git status --short git log -5 --oneline tail -n 120 text6.txt awk '/^[一二三四五六七八九十百]+、/ {print}' text6.txt | sort | uniq -d ``` 如果输出显示工作区 clean 且 `text6.txt` 无重复标题,再执行第五部分第一候选批次。 七、2026-06-13 继续执行记录:oword/namedparam staging path guard 本批按第五部分第一候选批次完成 3 个 early direct-file fixture 的 staged path guard: - `oword-bug315/test.ngc` - `oword-bug315-p2/test.ngc` - `namedparam-bug424/test.ngc` 完成内容: - Node 侧为上述 3 个 fixture 增加 fixed `.ngc` manifest; - Node 侧用 `interpRegressionNgcFilesRecursive(...)` 与 upstream vendored fixture 精确对账; - Node 侧检查 staged path 与 fixed manifest 一致; - browser 侧增加 fixed-count 与 duplicate-free guard; - browser 侧检查 staged path 去掉 `/work/browser-interp/.../` 前缀后与 fixed manifest 一致; - browser 仍不依赖目录枚举。 已运行验证: ```bash git diff --check SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh wasm-port/tools/verify_vendor_sync.sh wasm-port/tools/verify_no_standalone_cnc_semantics.sh SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh wasm-port/tests/host/verify_host_smokes.sh ``` 结果:全部通过。 下一步建议: 继续按“小批量 direct-file/staging helper guard”原则推进。优先从已有 Node/browser coverage、且不依赖 HAL/task/tool DB/Python remap/user-M process 的 interp fixture 中, 再选择 2 到 3 个只需要 host/filesystem staging 对账的 case。不要推进 blocked runtime promotion,也不要扩展 browser full 159 sim-config inventory。 八、2026-06-13 继续执行记录:flowsnake/inside-corners staging path guard 本批继续按“小批量 direct-file fixture staged path guard”推进,完成 3 个已有 Node/browser coverage 的 interp fixture: - `flowsnake/flowsnake.ngc` - `inside-corners/test.ngc` - `inverse-time-with-comp/inverse.ngc` 完成内容: - Node 侧为上述 3 个 fixture 增加 fixed `.ngc` manifest; - Node 侧用 `interpRegressionNgcFilesRecursive(...)` 与 upstream vendored fixture 精确对账; - Node 侧检查 staged path 与 fixed manifest 一致; - browser 侧增加 fixed-count 与 duplicate-free guard; - browser 侧检查 staged path 去掉 `/work/browser-interp/.../` 前缀后与 fixed manifest 一致; - browser 仍不依赖目录枚举。 已运行验证: ```bash git diff --check SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh wasm-port/tools/verify_vendor_sync.sh wasm-port/tools/verify_no_standalone_cnc_semantics.sh SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh wasm-port/tests/host/verify_host_smokes.sh ``` 结果:全部通过。 下一步建议: 继续沿 interp direct-file coverage 向后补 guard,但优先选择短小、单文件、 无 INI/工具表依赖的 case。下一批可考虑 `g33.1/g33.1.ngc`、`g6164/test.ngc`, 再搭配一个已明确 expected-error 或 direct-file loop case;如果 case 属于目录集合 或带参数化循环,先检查是否已有固定 manifest 风格,避免扩大执行面。 九、2026-06-13 继续执行记录:g33/g6164 staging path guard 本批继续按“小批量 direct-file fixture staged path guard”推进,完成 2 个短小、 单文件、无 INI/工具表依赖的 interp fixture: - `g33.1/g33.1.ngc` - `g6164/test.ngc` 完成内容: - Node 侧为上述 2 个 fixture 增加 fixed `.ngc` manifest; - Node 侧用 `interpRegressionNgcFilesRecursive(...)` 与 upstream vendored fixture 精确对账; - Node 侧检查 staged path 与 fixed manifest 一致; - browser 侧增加 fixed-count 与 duplicate-free guard; - browser 侧检查 staged path 去掉 `/work/browser-interp/.../` 前缀后与 fixed manifest 一致; - browser 仍不依赖目录枚举。 本批没有纳入 `g72` loop 组;该组在测试代码中是参数化循环,后续应按整组或 明确固定 manifest 风格处理,避免为了凑数量拆出不自然的单项 guard。 已运行验证: ```bash git diff --check SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh wasm-port/tools/verify_vendor_sync.sh wasm-port/tools/verify_no_standalone_cnc_semantics.sh SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh wasm-port/tests/host/verify_host_smokes.sh ``` 结果:全部通过。 下一步建议: 继续推进时优先处理已经有固定 manifest 或自然成组的 direct-file fixtures。候选: `good` arc 6 项可按已有 fixed fixture list 补 staged path 对账;或者 `g72` 两项、 `g71` 四项按 loop manifest 成组补 guard。继续避免 blocked runtime promotion、 browser full inventory 扩面,以及任何 JS CNC 语义实现。 十、2026-06-13 继续执行记录:good arc staging path guard 本批按“自然成组 direct-file fixture staged path guard”推进,完成 `good` arc 目录 6 个已有 Node/browser coverage 的 `.ngc` fixture: - `good/good-arc.big.imperial.center-format.ngc` - `good/good-arc.big.metric.center-format.ngc` - `good/good-arc.medium.imperial.center-format.ngc` - `good/good-arc.medium.metric.center-format.ngc` - `good/good-arc.small.imperial.center-format.ngc` - `good/good-arc.small.metric.center-format.ngc` 完成内容: - Node 侧复用既有 `goodArcFixtures` fixed manifest; - Node 侧继续用 `interpRegressionNgcFiles("good")` 与 upstream vendored fixture 精确对账; - Node 侧收集实际 staged path,并检查与 fixed manifest 一致; - browser 侧复用既有 fixed-count 与 duplicate-free guard; - browser 侧收集实际 staged path,去掉 `/work/browser-interp/good/` 前缀后与 fixed manifest 一致; - browser 仍不依赖目录枚举。 已运行验证: ```bash git diff --check SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh wasm-port/tools/verify_vendor_sync.sh wasm-port/tools/verify_no_standalone_cnc_semantics.sh SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh wasm-port/tests/host/verify_host_smokes.sh ``` 结果:全部通过。 下一步建议: 继续处理自然成组 direct-file fixtures。优先候选:`g72` 两项或 `g71` 四项按 loop manifest 成组补 staged path guard;如果选择 `bad` expected-error 目录, 需要按现有 `badInterpFixtures` fixed list 做 staged path 对账,不改变 expected-error 语义。继续避免 blocked runtime promotion、browser full inventory 扩面和 JS CNC 语义实现。 十一、2026-06-13 继续执行记录:g72 staging path guard 本批按“自然成组 direct-file fixture staged path guard”推进,完成 `g72` loop 组 2 个已有 Node/browser coverage 的 `.ngc` fixture: - `g72-facing/g72-iterations-present.ngc` - `g72-missing-iteration/g72-iterations-missing.ngc` 完成内容: - Node 侧将 `g72` inline loop 提成 `g72Fixtures` fixed manifest; - Node 侧用 `interpRegressionNgcFilesRecursive(...)` 分别与 upstream vendored fixture 目录精确对账; - Node 侧检查 staged path 与 fixed manifest 一致; - browser 侧增加 fixed-count 与 duplicate-free guard; - browser 侧检查 staged path 去掉 `/work/browser-interp/` 前缀后与 `dir/file` fixed manifest 一致; - browser 仍不依赖目录枚举。 已运行验证: ```bash git diff --check SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh wasm-port/tools/verify_vendor_sync.sh wasm-port/tools/verify_no_standalone_cnc_semantics.sh SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh wasm-port/tests/host/verify_host_smokes.sh ``` 结果:全部通过。 下一步建议: 继续处理自然成组 direct-file fixtures。优先候选:`g71` 四项按现有 loop manifest 补 staged path guard;或者处理 `bad` expected-error 目录,只做 fixed list 与 staged path 对账,不改变 expected-error 语义。继续避免 blocked runtime promotion、 browser full inventory 扩面和 JS CNC 语义实现。 十二、2026-06-13 继续执行记录:g71 staging path guard 本批按“自然成组 direct-file fixture staged path guard”推进,完成 `g71` loop 组 4 个已有 Node/browser coverage 的 `.ngc` fixture: - `g71-endless-loop/g71-endless-loop.ngc` - `g71-endless-loop2/g71-endless-loop2.ngc` - `g71-endless-loop_2/g71-endless-loop_2.ngc` - `g71-with-g70/g71-with-g70.ngc` 完成内容: - Node 侧将 `g71` inline loop 提成 `g71Fixtures` fixed manifest; - Node 侧用 `interpRegressionNgcFilesRecursive(...)` 分别与 upstream vendored fixture 目录精确对账; - Node 侧检查 staged path 与 fixed manifest 一致; - browser 侧增加 fixed-count 与 duplicate-free guard; - browser 侧检查 staged path 去掉 `/work/browser-interp/` 前缀后与 `dir/file` fixed manifest 一致; - browser 仍不依赖目录枚举。 已运行验证: ```bash git diff --check SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh wasm-port/tools/verify_vendor_sync.sh wasm-port/tools/verify_no_standalone_cnc_semantics.sh SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh wasm-port/tests/host/verify_host_smokes.sh ``` 结果:全部通过。 下一步建议: 继续处理已有 fixed manifest 的 direct-file fixtures。优先候选:`bad` expected-error 目录,按现有 `badInterpFixtures` fixed list 补 staged path 对账;只校验文件清单 和 staging 路径,不改变 expected-error 语义。也可以继续找短小单文件 case,但仍需 保持每批 2 到 3 个或自然成组,不推进 blocked runtime promotion。 十三、2026-06-13 继续执行记录:bad expected-error staging path guard 本批按“已有 fixed manifest 的 direct-file fixture staged path guard”推进,完成 `bad` expected-error 目录 21 个已有 Node/browser coverage 的 `.ngc` fixture。 完成内容: - Node 侧复用既有 `badInterpFixtures` fixed manifest; - Node 侧继续用 `interpRegressionNgcFiles("bad")` 与 upstream vendored fixture 精确对账; - Node 侧收集实际 staged path,并检查与 fixed manifest 一致; - browser 侧复用既有 fixed-count 与 duplicate-free guard; - browser 侧收集实际 staged path,去掉 `/work/browser-interp/bad/` 前缀后与 fixed manifest 一致; - 仅校验文件清单与 staging 路径,不改变 expected-error 语义; - browser 仍不依赖目录枚举。 已运行验证: ```bash git diff --check SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh wasm-port/tools/verify_vendor_sync.sh wasm-port/tools/verify_no_standalone_cnc_semantics.sh SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh wasm-port/tests/host/verify_host_smokes.sh ``` 结果:全部通过。 下一步建议: 继续找已有 Node/browser coverage 且可自然成组的 fixture。优先候选:`g76` 这种 需要工具表/INI 的目录可按 `writeInterpRegressionFiles(...)` 现有 file list 做 staged path 对账;或者继续挑选短小单文件 direct-file case。仍不要推进 blocked runtime promotion、browser full inventory 扩面或任何 JS CNC 语义实现。 十四、2026-06-13 继续执行记录:g76 file-list staging path guard 本批按“已有明确 file list 的 fixture staged path guard”推进,完成 `g76` 目录 现有 Node/browser coverage 使用的 2 个 staged 文件: - `g76/g76only.ngc` - `g76/test.tbl` 完成内容: - Node 侧新增 `g76Files` fixed manifest; - Node 侧用 `interpRegressionNgcFilesRecursive("g76")` 与 upstream vendored `.ngc` fixture 精确对账; - Node 侧检查 `writeInterpRegressionFiles(...)` 目标 staged path 与 fixed manifest 一致; - browser 侧增加 fixed-count 与 duplicate-free guard; - browser 侧检查 staged path 去掉 `/work/browser-interp/g76/` 前缀后与 fixed manifest 一致; - 仅校验文件清单与 staging 路径,不改变工具表/INI 语义; - browser 仍不依赖目录枚举。 已运行验证: ```bash git diff --check SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh wasm-port/tools/verify_vendor_sync.sh wasm-port/tools/verify_no_standalone_cnc_semantics.sh SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh wasm-port/tests/host/verify_host_smokes.sh ``` 结果:全部通过。 下一步建议: 继续处理已有 Node/browser coverage 且 file list 明确的 fixture。优先候选: `cam-nisley` 同样使用 `writeInterpRegressionFiles(...)` staging `cam.ngc` 与 `test.tbl`,可按本批模式补 file-list guard;或者继续挑选短小单文件 direct-file case。仍不要推进 blocked runtime promotion、browser full inventory 扩面或 JS CNC 语义实现。 十五、2026-06-13 继续执行记录:cam-nisley file-list staging path guard 本批按“已有明确 file list 的 fixture staged path guard”推进,完成 `cam-nisley` 目录现有 Node/browser coverage 使用的 2 个 staged 文件: - `cam-nisley/cam.ngc` - `cam-nisley/test.tbl` 完成内容: - Node 侧新增 `camNisleyFiles` fixed manifest; - Node 侧用 `interpRegressionNgcFilesRecursive("cam-nisley")` 与 upstream vendored `.ngc` fixture 精确对账; - Node 侧检查 `writeInterpRegressionFiles(...)` 目标 staged path 与 fixed manifest 一致; - browser 侧增加 fixed-count 与 duplicate-free guard; - browser 侧检查 staged path 去掉 `/work/browser-interp/cam-nisley/` 前缀后与 fixed manifest 一致; - 仅校验文件清单与 staging 路径,不改变工具表/INI 语义; - browser 仍不依赖目录枚举。 已运行验证: ```bash git diff --check SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh wasm-port/tools/verify_vendor_sync.sh wasm-port/tools/verify_no_standalone_cnc_semantics.sh SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh wasm-port/tests/host/verify_host_smokes.sh ``` 结果:全部通过。 下一步建议: 继续选择已有 Node/browser coverage 且清单稳定的 fixture。优先候选:`rotation` 组三项已有 fixed manifest,可补 staged path 对账;或者继续挑选短小单文件 direct-file case。仍不要推进 blocked runtime promotion、browser full inventory 扩面或 JS CNC 语义实现。 十六、2026-06-13 继续执行记录:rotation staging path guard 本批按“已有 fixed manifest 的 direct-file fixture staged path guard”推进,完成 `rotation` 组现有 Node/browser coverage 使用的 3 个 staged `.ngc` 文件: - `rotation/abs-pts/test.ngc` - `rotation/g28/g28.ngc` - `rotation/g53/g53.ngc` 完成内容: - Node 侧复用既有 `rotationRegressionFiles` fixed manifest; - Node 侧继续用 `interpRegressionNgcFilesRecursive("rotation")` 与 upstream vendored `.ngc` fixture 精确对账; - Node 侧检查实际 staged path 与 fixed manifest 一致; - browser 侧复用既有 fixed-count 与 duplicate-free guard; - browser 侧检查 staged path 去掉 `/work/browser-interp/rotation/` 前缀后与 fixed manifest 一致; - 不扩大 staging 到 `rotation/abs-pts/test.tbl`,保持现有 direct-file coverage; - browser 仍不依赖目录枚举。 已运行验证: ```bash git diff --check SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh wasm-port/tools/verify_vendor_sync.sh wasm-port/tools/verify_no_standalone_cnc_semantics.sh SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh wasm-port/tests/host/verify_host_smokes.sh ``` 结果:全部通过。 下一步建议: 继续选择已有 Node/browser coverage 且清单稳定的 fixture。优先候选:`g10`、`g52` 之外的 remaining direct-file 单项,或已经有 fixed list 的分组;若涉及工具表/INI, 只按现有 `writeInterpRegressionFiles(...)` 或 staging helper 输出做路径 guard。 继续避免 blocked runtime promotion、browser full inventory 扩面和 JS CNC 语义实现。 十七、2026-06-13 继续执行记录:ccomp staging path guard 本批按“已有 staging helper 的 fixture staged path guard”推进,完成现有 Node/browser ccomp coverage 使用的 4 个目录: - `ccomp/lathe-comp` - `ccomp/mill-g90g91g92` - `ccomp/mill-line-arc-entry` - `ccomp/mill-zchanges` 完成内容: - Node 侧新增 `ccompRegressionFiles` fixed manifest:`test.ngc`、`test.tbl`; - Node 侧新增 `assertCcompRegressionStaging(...)`,与 upstream vendored `.ngc/.tbl` fixture 精确对账; - Node 侧检查 `writeCcompRegressionFiles(...)` 目标 staged path 与 fixed manifest 一致; - browser 侧新增同名 fixed manifest 与 staged path guard; - browser 侧检查 staged path 去掉 `/work/browser-ccomp//` 前缀后与 fixed manifest 一致; - 仅校验文件清单与 staging 路径,不改变 cutter-comp、工具表或 INI 语义; - browser 仍不依赖目录枚举。 已运行验证: ```bash git diff --check SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh wasm-port/tools/verify_vendor_sync.sh wasm-port/tools/verify_no_standalone_cnc_semantics.sh SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh wasm-port/tests/host/verify_host_smokes.sh ``` 结果:全部通过。 下一步建议: 继续选择已有 Node/browser coverage 且 staging helper/file list 明确的 fixture。 优先候选:继续扫描剩余 `write*RegressionFiles(...)` helper 输出,或挑选短小单文件 direct-file case。仍不要推进 blocked runtime promotion、browser full inventory 扩面或 JS CNC 语义实现。 十八、2026-06-13 继续执行记录:initial remap file-list staging path guard 本批按“已有明确 file list 的 remap fixture staged path guard”推进,完成现有 Node/browser remap coverage 的 6 个小目录: - `remap/duplicate-o-word` - `remap/fail/args.0` - `remap/fail/args.1` - `remap/fail/args.2` - `remap/fail/body-ngc` - `remap/m30-interaction` 完成内容: - Node 侧新增 `assertRemapRegressionStaging(...)`; - Node 侧将上述 6 个 inline remap file list 提成 fixed manifest; - Node 侧用 upstream vendored `.ini/.ngc` 文件清单与 fixed manifest 精确对账; - Node 侧检查 `writeRemapRegressionFiles(...)` 目标 staged path 与 fixed manifest 一致; - browser 侧新增同名 staged path guard; - browser 侧检查 staged path 去掉 `/work/browser-remap//` 前缀后与 fixed manifest 一致; - 仅校验文件清单与 staging 路径,不改变 remap 执行语义; - browser 仍不依赖目录枚举。 已运行验证: ```bash git diff --check SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh wasm-port/tools/verify_vendor_sync.sh wasm-port/tools/verify_no_standalone_cnc_semantics.sh SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh wasm-port/tests/host/verify_host_smokes.sh ``` 结果:全部通过。 下一步建议: 继续按小批量处理剩余 `writeRemapRegressionFiles(...)` file list,例如 `nested-remaps-oword`、`posargs.0`、`sequencing`、`remap-io`。注意 `remap-io` 会额外生成 `simpockets.tbl`,如处理该项应明确区分 vendored file list 与运行时 生成文件。继续避免 blocked runtime promotion、browser full inventory 扩面和 JS CNC 语义实现。 十九、2026-06-13 继续执行记录:posargs/sequencing remap staging path guard 本批继续按“小批量 remap file-list staged path guard”推进,完成现有 Node/browser remap coverage 的 2 个目录: - `remap/posargs.0` - `remap/sequencing` 完成内容: - Node 侧将 `posargs.0` 与 `sequencing` 的 inline remap file list 提成 fixed manifest; - Node 侧复用 `assertRemapRegressionStaging(...)`,用 upstream vendored `.ini/.ngc` 文件清单与 fixed manifest 精确对账; - Node 侧检查 `writeRemapRegressionFiles(...)` 目标 staged path 与 fixed manifest 一致; - browser 侧复用同名 staged path guard; - browser 侧检查 staged path 去掉 `/work/browser-remap//` 前缀后与 fixed manifest 一致; - 未处理 `nested-remaps-oword`,因为该目录含当前 smoke 未 staging 的 `testsub.ngc`,应单独判断是否扩展 file list; - 仅校验文件清单与 staging 路径,不改变 remap 执行语义; - browser 仍不依赖目录枚举。 已运行验证: ```bash git diff --check SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh wasm-port/tools/verify_vendor_sync.sh wasm-port/tools/verify_no_standalone_cnc_semantics.sh SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh wasm-port/tests/host/verify_host_smokes.sh ``` 结果:全部通过。 下一步建议: 继续处理剩余 remap file-list guard。优先候选:`remap-io`,但需要明确把 vendored file list 与运行时生成的 `simpockets.tbl` 分开校验;`nested-remaps-oword` 也可处理, 但需先决定是否把未 staging 的 `testsub.ngc` 纳入 fixed manifest。继续避免 blocked runtime promotion、browser full inventory 扩面和 JS CNC 语义实现。 二十、2026-06-13 继续执行记录:remap-io staging path guard 本批继续按“remap file-list staged path guard”推进,完成现有 Node/browser `remap-io` coverage: - vendored staged files: - `remap-io/test-ngc.ini` - `remap-io/io_input_m66.ngc` - `remap-io/io_output_m62.ngc` - `remap-io/io_output_m63.ngc` - `remap-io/io_output_m64.ngc` - `remap-io/io_output_m65.ngc` - `remap-io/io_output_m67.ngc` - `remap-io/io_output_m68.ngc` - runtime generated file: - `remap-io/simpockets.tbl` 完成内容: - Node 侧将 `remap-io` inline remap file list 提成 `remapIoFiles` fixed manifest; - Node 侧复用 `assertRemapRegressionStaging(...)` 校验 vendored `.ini/.ngc` 文件清单 与 staged path; - Node 侧单独检查运行时生成的 `simpockets.tbl` staged path; - browser 侧复用同名 staged path guard; - browser 侧同样单独检查运行时生成的 `simpockets.tbl` staged path; - 明确区分 vendored file list 与运行时生成文件,不改变 remap-io 执行语义; - browser 仍不依赖目录枚举。 已运行验证: ```bash git diff --check SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh wasm-port/tools/verify_vendor_sync.sh wasm-port/tools/verify_no_standalone_cnc_semantics.sh SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh wasm-port/tests/host/verify_host_smokes.sh ``` 结果:全部通过。 下一步建议: `nested-remaps-oword` 是剩余 remap 候选,但目录包含当前 smoke 未 staging 的 `testsub.ngc`,下一步应先判断是否应扩展 file list;若不扩展,则需要专门记录 “vendored extra fixture intentionally unstaged”的 guard。继续避免 blocked runtime promotion、browser full inventory 扩面和 JS CNC 语义实现。 二十一、2026-06-13 继续执行记录:nested remaps oword unstaged fixture guard 本批继续按“remap file-list staged path guard”推进,完成剩余 `nested-remaps-oword` coverage 的 staged/unstaged 文件清单对账。 完成内容: - Node 侧将 `nested-remaps-oword` inline remap file list 提成 `nestedRemapsOwordFiles` fixed manifest; - Node 侧新增 `expectedUnstagedFiles` 参数,用 upstream vendored `.ini/.ngc` 文件清单与 staged manifest 加 expected-unstaged manifest 精确对账; - Node 侧显式记录 `testsub.ngc` 为 vendored extra fixture、当前 smoke 不 staging; - Node 侧检查 expected-unstaged 文件不得与 staged manifest 重叠; - browser 侧新增同名 fixed manifest 与 expected-unstaged overlap guard; - browser 侧继续只校验 fixed staged path,不依赖目录枚举; - 仅校验文件清单与 staging 路径,不改变 remap 执行语义。 已运行验证: ```bash git diff --check SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh wasm-port/tools/verify_vendor_sync.sh wasm-port/tools/verify_no_standalone_cnc_semantics.sh SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh wasm-port/tests/host/verify_host_smokes.sh ``` 结果:全部通过。 下一步建议: remap file-list guard 的当前显性剩余项已基本收束。下一批建议回到 `write*RegressionFiles(...)` helper 扫描,优先选择已有 Node/browser coverage、 文件清单固定且不涉及 HAL/task/tool DB/Python remap/user-M process 的 2 到 3 个 fixture;若没有合适小批次,转向补齐 staging guard 的文档索引或生成一个 machine-readable fixture coverage manifest。继续避免 blocked runtime promotion、 browser full inventory 扩面和 JS CNC 语义实现。 二十二、2026-06-13 继续执行记录:interp fixture staging helper guard 本批回到 `writeInterpRegressionFiles(...)` helper,先整理已有 Node/browser coverage 里的两个固定 `.ngc/.tbl` fixture: - `interp/cam-nisley` - `interp/g76` 完成内容: - Node 侧新增 `assertInterpRegressionStaging(...)`; - Node 侧对 upstream vendored `.ini/.ngc/.tbl` 文件清单与 fixed manifest 精确对账; - Node 侧检查 staged path 与 `/work/interp//...` fixed manifest 一致; - browser 侧新增同名 `assertInterpRegressionStaging(...)`; - browser 侧检查 fixed manifest duplicate-free,并检查 staged path 去掉 `/work/browser-interp//` 前缀后与 fixed manifest 一致; - `cam-nisley` 与 `g76` 改用该 helper,去掉内联重复 guard; - 仅整理 host/filesystem staging guard,不改变 G-code、tool table 或 threading 语义。 已运行验证: ```bash git diff --check SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh wasm-port/tools/verify_vendor_sync.sh wasm-port/tools/verify_no_standalone_cnc_semantics.sh SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh wasm-port/tests/host/verify_host_smokes.sh ``` 结果:全部通过。 下一步建议: 继续复用 `assertInterpRegressionStaging(...)` 处理已有 `writeInterpRegressionFiles(...)` 调用里的小批次。优先候选: - `m98m99/09-disable-fanuc-subs` - `m98m99/11-main-program-oword` 这两个已有固定 file list 和 Node/browser coverage,适合把现有 m98m99 aggregate slice guard 拆出更直接的 per-directory staged path guard。仍不推进 blocked runtime promotion、browser full inventory 扩面或 JS CNC 语义实现。 二十三、2026-06-13 继续执行记录:m98m99 interp directory staging guard 本批继续复用 `assertInterpRegressionStaging(...)`,把两个已有 m98m99 目录从 aggregate slice guard 拆成更直接的 per-directory staged path guard: - `m98m99/09-disable-fanuc-subs` - `m98m99/11-main-program-oword` 完成内容: - Node 侧对 `09-disable-fanuc-subs` 的 `.ini/.ngc` fixed manifest 与 vendored 文件清单精确对账; - Node 侧对 `11-main-program-oword` 的 `.ngc` fixed manifest 与 vendored 文件清单 精确对账; - Node 侧保留相邻 direct-file smoke 的 slice guard,但不再让该 slice 夹带目录 file-list 对账; - browser 侧复用同名 helper 检查 fixed manifest duplicate-free; - browser 侧检查 staged path 去掉 `/work/browser-interp//` 前缀后与 fixed manifest 一致; - browser 侧仍不枚举目录; - 仅整理 host/filesystem staging guard,不改变 Fanuc sub、main-program oword 或 interpreter 语义。 已运行验证: ```bash git diff --check SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh wasm-port/tools/verify_vendor_sync.sh wasm-port/tools/verify_no_standalone_cnc_semantics.sh SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh wasm-port/tests/host/verify_host_smokes.sh ``` 结果:全部通过。 下一步建议: 继续扫描 `writeInterpRegressionFiles(...)` 与 m98m99 剩余 direct-file aggregate guard。 优先候选是把 `m98m99/13-named-program` 的 fixed file list 提成 per-directory guard, 同时保留 `m98m99/14-o-expression-call` direct-file slice guard;如继续小批量, 也可处理 `m98m99/09`、`11` 后续文档索引。继续避免 blocked runtime promotion、 browser full inventory 扩面和 JS CNC 语义实现。 二十四、2026-06-13 继续执行记录:m98m99 named-program staging guard 本批继续复用 `assertInterpRegressionStaging(...)`,把 `m98m99/13-named-program` 从 final aggregate direct-file guard 中拆成 per-directory staged path guard,同时保留 `m98m99/14-o-expression-call` 的 direct-file slice guard。 完成内容: - Node 侧将 `13-named-program` 的 `test-named.ngc` 与 `test-numbered.ngc` 提成 fixed manifest; - Node 侧用 upstream vendored `.ngc` 文件清单与 fixed manifest 精确对账; - Node 侧检查 staged path 与 `/work/interp/m98m99/13-named-program/...` 一致; - Node 侧将 final direct-file slice 收缩为只覆盖 `14-o-expression-call/test.ngc`; - browser 侧新增同名 fixed manifest guard; - browser 侧检查 staged path 去掉 `/work/browser-interp/m98m99/13-named-program/` 前缀后与 fixed manifest 一致; - browser 侧仍不枚举目录; - 仅整理 host/filesystem staging guard,不改变 named-program 或 o-expression call 语义。 已运行验证: ```bash git diff --check SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh wasm-port/tools/verify_vendor_sync.sh wasm-port/tools/verify_no_standalone_cnc_semantics.sh SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh wasm-port/tests/host/verify_host_smokes.sh ``` 结果:全部通过。 下一步建议: m98m99 目录级 staged path guard 已基本收束。下一批建议扫描 `writeInterpRegressionFile(...)` 的剩余单文件 direct-file guard,优先选择仍由 aggregate slice 间接覆盖的短小 case, 把它们改成局部 fixed path guard;如果继续保持小步提交,可从 `g10` 之后的 direct-file families 或 `writeInterpRegressionFiles(...)` 其他调用点继续收敛。仍不推进 blocked runtime promotion、browser full inventory 扩面或 JS CNC 语义实现。