新下一步执行计划 生成时间:2026-06-09 14:20 CST 本计划接替 `text.txt`。后续执行以本文件为准。 项目纪律: - 数控/G-code/remap/tool/parameter/planner/kinematics/user-M 语义必须来自 LinuxCNC upstream 或 vendored LinuxCNC C/C++ source。 - 本项目允许写的代码范围是:构建、source sync、runtime shim、filesystem staging、OPFS、WASM/browser boundary、测试胶水、文档。 - 不通过修改 G-code 语义、JS 解释逻辑、或 standalone `Interp::...` 实现来让 测试通过。 - 需要 INI/tool table/parameter file/SUBROUTINE_PATH/USER_M_PATH/remap-NGC 上下文的程序,必须带上下文运行,不能脱离配置单独判断。 - browser 不能依赖目录枚举。browser/Node 共享 staging 时,优先使用 `tools/source-manifest.txt` + INI 文本生成计划。 当前已完成基线: - 规划 i:G-code run_step 状态输出已完成第一阶段。 已输出当前行号、statement_uri、进度相关 step、X/Y/Z/A/B/C/U/V/W 位置。 UI 已优先解析 run_step,fallback 到 canonical event。 - 规划 ii:基础 G-code smoke 已固化代表集。 `nc_files/3D_Chips.ngc` 已按 tool-table context 运行,裸跑缺 tool 的负向边界 已明确。 - configs/sim 代表 runtime edge 已覆盖: `axis/foam` U/V axis mask、bridge-mill W/remap path、`axis/geometry` M110、 `external_offsets` M111 和 subroutine staging 已在 native/WASM/browser representative smoke 中验证。 - 文件上下文 staging 规则已抽成通用 SDK helper: `planIniFileContextStaging()` 负责 generic INI-context manifest-based plan; `planSimConfigStaging()` 是 `configs/sim` wrapper; Node 和真实 browser smoke 已覆盖 INI、OPEN_FILE、TOOL_TABLE、PARAMETER_FILE、 multi-directory SUBROUTINE_PATH、USER_M_PATH、executable user-M、remap-NGC 和 wasmPath 输出。 - 测试分层文档已补齐: `docs/compatibility-validation.md` 已记录 4 层测试的入口、当前结果、 LinuxCNC-owned behavior、host/WASM adapter allowance 和 expected-failure policy。 当前验证口径: - Layer 1: `wasm-port/tests/native/verify_nc_files.sh` 当前基线:total 107, pass 101, expected_fail 6, unexpected_fail 0。 - Layer 2: `wasm-port/tests/native/verify_sim_configs.sh` 当前基线:total 159, pass 151, expected_fail 8, unexpected_fail 0。 - Layer 3: `wasm-port/tests/native/verify_native_probes.sh` 当前应通过,包含 source sync、no-standalone-semantics、native fixture baseline、sim-config 和 nc_files checks。 - Layer 4: `wasm-port/tests/host/verify_host_smokes.sh` 当前应通过,包含 Node WASM、OPFS、browser interpreter 和 browser INI panel representative smoke。 新执行顺序: 1. 先稳定当前大批改动,不继续扩大测试面 目标: - 对当前累计改动做一次完整一致性验证。 - 确认 vendor manifest、native probes、Node/browser smoke 都仍处于可提交状态。 - 在继续新增 upstream tests 前,先把当前批次变成一个清晰、可审查的工作集。 执行: ```bash git diff --check wasm-port/tools/verify_vendor_sync.sh wasm-port/tests/wasm/node/verify_interp_wasm.sh wasm-port/tests/wasm/node/verify_sim_configs_wasm.sh wasm-port/tests/browser/verify_interp_browser.sh wasm-port/tests/host/verify_host_smokes.sh wasm-port/tests/native/verify_native_probes.sh ``` 通过条件: - `git diff --check` clean。 - `vendor sync validation complete`。 - `interp_wasm_node_smoke=ok`。 - `sim_configs_wasm_node_smoke=ok`。 - `browser_interp_smoke=ok`。 - `host_wasm_opfs_browser_smokes=ok`。 - native summaries 中仍为: `sim-configs total 159 pass 151 expected_fail 8 unexpected_fail 0` 和 `nc_files total 107 pass 101 expected_fail 6 unexpected_fail 0`。 不做: - 不新增 upstream fixture。 - 不改 LinuxCNC vendored 文件内容。 - 不把 expected failure 改成 pass,除非 runtime edge 已经通过 vendored source 路径证明。 2. 整理当前大批改动的提交/审查边界 目标: - 把当前累计改动按逻辑拆成可审查批次。 - 如果不提交,也至少在文档里列出可拆分边界,方便后续 review。 建议拆分边界: - Batch A: run_step 状态输出和 UI/browser/Node 断言。 - Batch B: nc_files 代表 smoke 和 `3D_Chips.ngc` tool-table context。 - Batch C: upstream `tests/interp/*`、`tests/ccomp/*` selected fixture 扩展。 - Batch D: G92 parameter persistence、tool table、G10/G52/G71/G72/G76 等 interpreter regression coverage。 - Batch E: generic INI-context staging helper 和 Node/browser synthetic coverage。 - Batch F: 文档分层、source reuse map、compatibility validation、tracker 更新。 执行: ```bash git status --short git diff --stat git diff --name-only ``` 输出要求: - 记录每个 batch 对应文件。 - 标明哪些新增 `wasm-port/vendor/linuxcnc/...` 文件必须由 `tools/source-manifest.txt` 和 `verify_vendor_sync.sh` 覆盖。 3. 收敛 configs/sim 剩余 expected failure,不改语义 目标: - 继续分析 Layer 2 中 8 个 expected_fail。 - 明确哪些只是 upstream `rs274` 缺 task/user-M/runtime context; 哪些已经由 Layer 3/4 runtime representative smoke 覆盖; 哪些仍需要新的 runtime adapter 或 blocked entry。 重点对象: - `axis/foam/foam.ngc` 已有 U/V axis mask runtime coverage。确认 Layer 2 expected_fail 是否只属于 native upstream standalone context 限制。 - `axis/vismach/5axis/bridgemill/5axisgui.ngc` 已有 bridge-mill W/remap representative coverage。确认 expected_fail 是否只 属于 native full sim/task/HAL boundary。 - `axis/geometry/xyzc.ngc` 已有 M110 USER_M_PATH deterministic boundary。确认 native expected_fail 与 runtime coverage 对齐。 - `axis/external_offsets/*.ngc` 已有 M111 deterministic boundary 和 `opa_demo.ngc -> circles.ngc` SUBROUTINE_PATH staging。确认剩余 expected_fail 的具体原因。 - `incremental_repetition_g533.ngc` 保留 upstream demo expected failure。禁止通过修改 G-code 语义或 runner 语义让它 pass。 执行: ```bash wasm-port/tests/native/verify_sim_configs.sh cat wasm-port/build/native/sim-configs/summary.tsv ``` 产出: - 更新 `docs/compatibility-validation.md` 或 `docs/linuxcnc-test-porting-tracker.md`,逐条记录 8 个 expected_fail 的当前 层级归因。 - 如果某项已由 Layer 3/4 覆盖,写明对应验证命令和 smoke assertion。 - 如果某项未覆盖,加入明确 blocked dependency 或下一步 runtime boundary。 4. 将 generic INI-context staging helper 用到更多手写 staging 点 目标: - 减少 Node/browser 测试中手写 `TOOL_TABLE`、`PARAMETER_FILE`、 `SUBROUTINE_PATH`、`USER_M_PATH` 和 remap files 的重复。 - 只迁移“已经 vendored 且 manifest 完整”的测试,不扩大功能面。 候选: - `tests/wasm/node/verify_interp_wasm.mjs` 中带 `test.ini`、`test.tbl`、 `startup.var`、`subs/*.ngc` 的 upstream regression staging。 - `tests/browser/interp_smoke.html` 中与 Node 同构的 upstream regression staging。 - 不急于迁移 five-axis 专用 staging,除非能保持 `executionMode: "fiveAxisRemap"` 现有路径清晰。 执行原则: - 先抽小 helper:`loadPlannedVendorFiles(plan)` 或测试局部 helper。 - 保持 `planIniFileContextStaging()` 只返回 plan,不读文件、不 fetch。 - Node 侧从 filesystem 读 `vendor/linuxcnc/${sourceRel}`。 - Browser 侧 fetch `../../vendor/linuxcnc/${sourceRel}`。 - 每次迁移后跑: ```bash wasm-port/tests/wasm/node/verify_interp_wasm.sh wasm-port/tests/browser/verify_interp_browser.sh wasm-port/tests/host/verify_host_smokes.sh ``` 5. 继续 upstream `tests/interp/*` intake,但必须小批量 前置条件: - 第 1 步完整验证通过。 - 第 2 步当前工作集边界清楚。 - 第 3 步 expected failure 归因没有新疑点。 候选优先级: - 纯 interpreter file execution。 - 不需要 Python remap。 - 不需要 full task/motion/HAL process。 - 需要 tool table/parameter/subroutine context 的测试,必须通过 INI-context staging 运行。 - 有 upstream expected output 或可稳定断言 canonical event/error text。 候选方向: - `tests/interp/oword-unwind` 可能适合 continue-on-error runner;先 native probe 验证,再 Node/browser。 - `tests/interp/g6164` 先确认是否纯 interpreter、是否需要额外 machine/runtime context。 - `tests/interp/compile` 先判断它是 compile/source test 还是 runtime interpreter test;不要误归类。 - `tests/interp/mdi-*`、`oword-mdi-*` 默认视为 MDI/UI/full-process 候选,先加入 blocked table,除非能证明存在 NGC-only subpath。 - `tests/interp/pymove`、`python-self` 默认 blocked:Python O-word/remap boundary 未实现。 每个 intake 必须执行 checklist: - 记录 upstream path。 - byte-for-byte vendor 原始文件。 - 更新 `tools/source-manifest.txt` 和 vendor sync。 - 确认 LinuxCNC source ownership。 - 先 native harness/probe,再 Node WASM,再 browser。 - 更新 `docs/source-reuse-map.md`、 `docs/compatibility-validation.md`、 `docs/linuxcnc-test-porting-tracker.md`。 - 如 blocked,加入 blocked-test table 并写清 dependency。 6. 不做事项 - 不继续扩大 `configs/sim` 全量 WASM/browser 执行面,除非某个 expected failure 已经有明确 runtime boundary 价值。 - 不引入 JS G-code parser 或 JS remap/tool/parameter semantics。 - 不编辑 `linuxcnc/` upstream 工作树。 - 不修改 `wasm-port/vendor/linuxcnc/` vendored 文件内容;只能 byte-for-byte copy upstream 文件。 - 不绕过 `tools/verify_no_standalone_cnc_semantics.sh`。 推荐下一次立即执行: 1. 运行第 1 步完整一致性验证。 2. 如果通过,执行第 2 步,整理当前工作集 batch 边界。 3. 然后再进入第 3 步,逐条归因 configs/sim 8 个 expected_fail。