项目整体完成情况与后续执行计划

生成时间：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 语义实现。
