项目接续文件：OPFS/WASM hard block 移植优先级建议

生成时间：2026-06-19 CST

本文件接替 `text22.txt` 的“另开 milestone”建议，专门回答：

```text
在基于 OPFS、WASM 的数控系统仿真中，
L4-PYTHON-REMAP、L4-TOOL-DB、L4-USER-M-PROCESS 哪些可以移植，
以及应该先移植哪一个。
```

重要边界：

```text
本文件是 future runtime milestone 建议，不改变 text22.txt 的当前阶段铁律。
当前阶段仍不得解锁 L4-PYTHON-REMAP / L4-TOOL-DB / L4-USER-M-PROCESS；
Node inventory baseline 仍保持 executed=28 passed=28 skipped=131 unexpected_fail=0；
promotion_allowed 仍必须保持 0。
```

一、简要结论

三类 hard block 都可以“部分或项目定义下完整”移植到 OPFS/WASM 环境，但可移植方式不同。

推荐优先级：

```text
1. L4-TOOL-DB
2. L4-PYTHON-REMAP
3. L4-USER-M-PROCESS
```

建议先移植 `L4-TOOL-DB`，原因是：

- 当前只有 1 个 inventory row：`axis/db_demo/base.ngc`；
- 协议边界清晰：`DB_PROGRAM`、`v2.1`、`g`、`FINI`、`l`、`p`、`u`；
- OPFS 与 tool DB flat-file persistence 天然匹配；
- 可用 Worker / WASM Python runtime 隔离 `DB_PROGRAM`；
- 已有 `text20.txt` / `text21.txt` 规划和 machine-readable artifacts；
- 不需要一次性承诺完整 Python remap lifecycle 或 arbitrary external process；
- 成功后能形成第一个 hard-block runtime unlock 的可复用 proof pattern。

二、可移植性判断

| Family | 能否移植到 OPFS/WASM | 推荐优先级 | 主要原因 |
| --- | --- | ---: | --- |
| `L4-TOOL-DB` | 可以，建议先做 | 1 | 协议小、状态明确、OPFS 持久化适配自然、只有 1 个 row。 |
| `L4-PYTHON-REMAP` | 可以，但应分阶段做 | 2 | 覆盖面最大，价值高，但需要 LinuxCNC Python remap lifecycle、prolog/epilog、module loading、interpreter state binding。 |
| `L4-USER-M-PROCESS` | 只建议做受控子集，最后做 | 3 | 浏览器不能运行 arbitrary external process；必须把 external process 收束成 LinuxCNC-owned state transition proof。 |

三、为什么先做 L4-TOOL-DB

`L4-TOOL-DB` 当前 blocked row 是：

```text
axis/db_demo/base.ngc
```

当前阻塞原因不是 G-code 解释器本身，而是 INI 声明：

```text
[EMCIO]
DB_PROGRAM = ./db_nonran.py
```

这意味着 `.tbl` fallback 不能算 pass。必须证明 LinuxCNC tool DB process protocol：

```text
startup handshake: v2.1
get-all: g ... FINI
spindle load notify: l
tool offset notify: p
spindle unload notify: u
flat-file DB persistence
```

在 OPFS/WASM 环境中，推荐定义：

```text
ToolDbProcessPort
```

职责：

- 按 INI 中的 `DB_PROGRAM` 启动受控 runtime；
- 维持 line-based protocol；
- 记录 transcript；
- 将 DB flat file 映射到 OPFS；
- 导出 release/browser diagnostics。

不允许：

- 用 `.tbl` fallback 代替 DB_PROGRAM；
- 用 JS 直接构造 tool semantics；
- 跳过 `tooldb.py` / `db.py` 行为；
- 只靠 browser glue 声称 tool DB pass。

建议 first milestone：

```text
tool-db-opfs-wasm-milestone
```

最小完成定义：

1. Native `ENABLE_TOOL_DB_RUNTIME_PROBE=1` 可在完整 LinuxCNC host runtime 上通过；
2. WASM/Worker 能执行等价 DB protocol loop；
3. OPFS 能保存并恢复 DB flat-file state；
4. transcript 包含 `v2.1` / `g` / `FINI` / `l` / `p` / `u`；
5. browser diagnostics 输出 DB program path、OPFS DB path、transcript hash、state summary；
6. release artifact 标明 `.tbl fallback sufficient=false`；
7. 只有 native + WASM + browser proof 都齐后，才允许考虑把 `axis/db_demo/base.ngc` 从 `SKIP L4-TOOL-DB` 推进。

四、L4-PYTHON-REMAP 的移植建议

`L4-PYTHON-REMAP` 可以移植，但不应该作为第一个解锁对象。

原因：

- 当前涉及 53 个 skip/block rows；
- 覆盖 Python module loading、remap callable、prolog/epilog、NGC-only subpath、interpreter state、HAL/UI/HALUI assumptions；
- 一旦边界设计不严，很容易把 Python runtime 当作 JS/browser-owned CNC semantics；
- 需要比 tool DB 更深地嵌入 LinuxCNC interpreter Python plugin lifecycle。

推荐路线：

```text
先复用 tool DB milestone 中建立的 Python/WASM substrate；
再做最小 Python remap lifecycle fixture；
最后扩大到 family-level inventory。
```

首个 fixture 仍建议沿用已有 artifact 中的计划：

```text
axis/remap/stop-lookahead/nc_files
```

原因是它更适合作为 lifecycle proof：

- 有 Python runtime phase；
- 当前已有 native runtime fixture plan；
- 比完整 tool-change / five-axis Python remap family 更窄；
- 可以先证明 Python module import、callable dispatch、interpreter lifecycle 和 state observation。

Python remap milestone 的完成定义应至少包括：

1. `python-remap-native-runtime-readiness.tsv` host readiness clear；
2. `ENABLE_PYTHON_REMAP_RUNTIME_PROBE=1` native lifecycle probe pass；
3. WASM Python runtime 能复现同一 lifecycle；
4. remap/prolog/epilog callable 来源绑定 LinuxCNC config/source；
5. browser diagnostics 明确 Python runtime mode；
6. 不把 NGC-only subroutine asset 当 standalone main program；
7. 不因为 Python runtime 可运行就批量解锁全部 53 rows。

五、L4-USER-M-PROCESS 的移植建议

`L4-USER-M-PROCESS` 在浏览器中最不适合按 native external process 语义原样移植。

当前代表 row：

```text
axis/vismach/millturn/example.ngc
```

核心阻塞是 external user-M process：

```text
M128 / M129 Tcl scripts
HAL pin state updates
kinstype guard
ini.[xyz].* soft-limit state transitions
```

浏览器/WASM 环境不能安全、通用地支持：

- arbitrary executable spawn；
- native Tcl process execution；
- host HAL daemon mutation；
- unrestricted process side effects。

因此不建议把 `L4-USER-M-PROCESS` 定义成“浏览器运行任意 USER_M_PATH executable”。

可行路线只能是受控子集：

```text
LinuxCNC-owned user-M state transition boundary
```

例如对 `millturn`：

- 读取 config-owned `M128` / `M129` source；
- 绑定 `M428 -> M128`、`M429 -> M129`；
- 证明 `kinstype.is-0` / `kinstype.is-1` guard；
- 证明 `ini.x.*` / `ini.y.*` / `ini.z.*` state target；
- browser 只执行已证明的 state-transition adapter；
- diagnostics 明确 `arbitrary_external_process=false`。

推荐把它放在第三优先级，原因是：

- 成功解锁只覆盖 1 个 row；
- 需要 HAL/Tcl/user-M process state proof；
- 不能形成通用 external process 支持；
- 安全边界和用户期望更容易误读。

六、总体推荐路线

推荐 roadmap：

```text
Phase A：继续保持 text22 lock
Phase B：L4-TOOL-DB OPFS/WASM proof
Phase C：复用 Python/WASM substrate，做最小 L4-PYTHON-REMAP lifecycle proof
Phase D：做受控 L4-USER-M-PROCESS state-transition proof
```

不要反过来做：

- 不要先做 `L4-USER-M-PROCESS`，因为它不是通用 browser process model；
- 不要直接批量做 `L4-PYTHON-REMAP`，因为 blast radius 太大；
- 不要用 `.tbl` fallback 解 `L4-TOOL-DB`；
- 不要用 virtual HAL 或 JS glue 替代 LinuxCNC CNC/runtime 语义。

七、建议的下一步文件/代码工作

如果要开启第一个 hard-block runtime milestone，建议创建：

```text
text24.txt
```

主题：

```text
L4-TOOL-DB OPFS/WASM runtime milestone execution plan
```

内容应包括：

1. `ToolDbProcessPort` API 草案；
2. Worker/Python runtime 选择；
3. OPFS DB file layout；
4. transcript schema；
5. native/WASM/browser proof gates；
6. release diagnostics fields；
7. promotion lock 更新条件；
8. rollback 条件。

八、最终建议

当前问题的直接答案：

```text
都可以研究移植；
第一个应该移植 L4-TOOL-DB；
第二个做 L4-PYTHON-REMAP；
第三个做 L4-USER-M-PROCESS 的受控 state-transition 子集。
```

当前阶段仍不应改变：

```text
L4-PYTHON-REMAP locked
L4-TOOL-DB locked
L4-USER-M-PROCESS locked
promotion_allowed=0
baseline=28/28/131/0
```
