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

生成时间：2026-06-14 CST

本文件接替 `text9.txt`。后续工作按 `text10.txt` 执行；除非明确要求审计旧记录，
不要再回到 `text1/text2/text3/text4/text5/text6/text7/text8/text9` 扩展进度。
`text9.txt` 作为历史归档保留。

一、续接状态与防重规则

1. 当前续接点。

`text9.txt` 已推进到：

```text
五十一、2026-06-14 继续执行记录：browser ini-named readback path groups guard
```

该批已提交并推送：

```text
0b7771b 继续推进浏览器 ini-named readback path 组 guard
```

本文件从 `text10.txt` 重新开始记录后续进度。

2. 每轮开始前必须先执行。

```bash
git status --short
git log -5 --oneline
tail -n 120 text10.txt
awk '/^[一二三四五六七八九十百]+、/ {print}' text10.txt | sort | uniq -d
```

执行规则：

- 如果 `git status --short` 是 clean，且最新提交已经包含当前建议工作，不要重复追加记录；
- 每轮只追加一个新的中文编号记录；提交前再次检查标题唯一性；
- `text10.txt` 只记录新的后续进度，不复制 `text9.txt` 的长历史；
- 每批完成后，如果要写记录，先写 `text10.txt`，再提交该批代码和记录；
- 如果发现重复记录，先做 dedupe 清理并提交，再继续新功能或新 guard；
- `text9.txt` 不再追加新进度，除非明确要求审计或修正历史记录。

二、当前项目纪律

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 不能依赖目录枚举。

4. 加快实质性推进铁律。

核心移植已稳定后，暂停性能测试和纯 test glue 微整理，后续默认优先推进能被用户或
上层 API 直接使用的实质性能力：

- 优先级从高到低为：OPFS/session persistence、SDK/API surface、browser/UI workflow、
  sim config coverage promotion、host/runtime boundary proof、文档化可执行工作流；
- 每批应尽量产出一个可调用 helper、可复用 API、可验证用户流程、可执行 gate、
  可提升覆盖面的 runtime boundary proof，或者一份直接指导下一步实现的设计/清单；
- 允许继续做测试胶水，但只能作为支撑实质能力的验证，不再把“局部常量化/断言整理”
  作为主要目标；
- 禁止启动性能测试，除非已有明确功能路径和用户流程需要性能基线；
- 禁止为了“推进”而扩大 CNC 语义边界；G-code、tool、parameter、planner 等语义仍必须
  由 LinuxCNC-owned runtime 提供；
- 每批仍必须小步、可验证、可回滚，并按 `text10.txt` 记录结论和下一步建议。

三、当前完成情况摘要

1. 当前工作树状态。

切换到 `text10.txt` 前已确认：

```text
git status --short: clean
text9.txt duplicate Chinese headings: none
```

当前最近提交：

```text
0b7771b 继续推进浏览器 ini-named readback path 组 guard
c0bce74 继续推进浏览器 custom saved staging 断言组 guard
32aeba7 继续推进浏览器 saved staging 断言组 guard
7d9cf88 继续推进浏览器 random session path 断言组 guard
cba210b 继续推进浏览器 session path 断言组 guard
```

2. WASM port 基础架构稳定。

`wasm-port` 仍按独立移植工作区组织，包含 vendor、runtime/core、runtime/sdk、
runtime/opfs、runtime/ui、native/wasm/browser tests、docs 和 tools。

3. 关键基线保持稳定。

- `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`

4. 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
```

5. `text9.txt` 最新收敛方向。

`text9.txt` 后半段继续沿 browser/OPFS boundary guard 小批量推进，最近完成的重点包括：

- browser-random/direct-random saved tool-table expected line groups；
- browser-random/direct-random tool-table load/save result line groups；
- browser-interp/direct tool-table load/save result line groups；
- browser-interp/direct parameter restore/save/readback/backup groups；
- ini-named/explicit session parameter/tool-table result/backing text groups；
- invalid INI session reject input/error groups；
- browser-interp、browser-random、ini-named、explicit session path assertion groups；
- browser-interp/browser-random saved file staging groups；
- ini-named/explicit custom session saved file staging groups；
- ini-named parameter/tool-table readback path groups。

这些改动均只收敛 browser/OPFS test glue 与 boundary guard，未改变 OPFS bridge
behavior、file-service、path-model、SDK planner、interpreter、INI、tool、parameter
或 LinuxCNC-owned runtime semantics。

四、当前必须保持通过的验证入口

每批后续改动至少运行：

```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. 当前第一候选批次。

继续小批量 browser test glue guard。优先扫描 explicit session saved readback path groups，
看是否能像 ini-named session 一样局部常量化：

- `loadedIniOverrideSession.parameters.opfsPath`；
- `savedExplicitParameters.backupOpfsPath`；
- `loadedIniOverrideSession.toolTable.opfsPath`。

执行目标：

- 只处理 `wasm-port/tests/browser/interp_smoke.html` 内的 browser/OPFS test glue；
- 优先让 explicit session saved parameter/tool-table readback path groups 使用局部常量；
- 保持 expected readback text、OPFS path、WASM path、machine id、filename 与 save/load
  行为不变；
- 不改变参数值、tool-table 值、INI 内容、OPFS path、WASM path 字符串；
- 不改变 OPFS bridge behavior、file-service、path-model、SDK planner、interpreter、
  INI、tool、parameter 或 LinuxCNC-owned runtime semantics。

2. 第一候选批次验证。

执行：

```bash
git diff --check
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_interp_wasm.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
继续推进浏览器 explicit readback path 组 guard
```

3. 后续候选。

如果 explicit readback path group 收益不明显，转向 machine text store path assertion
groups，重点检查 `saveMachineTextFiles(...)` 相关输入是否已有可复用局部常量或 helper。

继续只选：

- browser/OPFS test glue；
- path/readback/staging/result/expected line 的局部常量化；
- 已有 helper 的复用；
- 不改变行为的小批量 guard。

避免：

- 新增抽象过度包装；
- 把 save API 输入对象提成无用常量；
- 触碰 runtime、SDK、OPFS bridge 或 LinuxCNC-owned semantics。

二、2026-06-14 继续执行记录：browser OPFS session snapshot manifest helper

本轮按“暂停性能测试，进行实质性功能推进”的要求，补充了一个新的 OPFS/runtime
能力：生成可恢复的机器会话快照清单，范围仍局限在 `runtime/opfs` 与对应 smoke。

完成内容：

- 在 `wasm-port/runtime/opfs/snapshot-store.js` 新增
  `createMachineSessionSnapshotPayload(machineId, options)`；
- 该 helper 基于现有 `path-model` 生成机器级 session snapshot payload，默认包含
  `ini`、`parameters`、`toolTable`，可选包含 `gcode`；
- 支持自定义 `iniOpfsPath`、`parameterOpfsPath`、`toolTableOpfsPath`、`gcodeOpfsPath`；
- 支持自定义 `iniFilename`、`parameterFilename`、`toolTableFilename`、`gcodeFilename`；
- 在 Node OPFS smoke 与 browser INI panel smoke 中补了覆盖，验证默认路径、自定义
  文件名和 G-code 路径均能按预期生成；
- 未改变 session snapshot 的格式、版本、存储位置或既有 save/load 行为；
- 未改变 OPFS bridge behavior、file-service、SDK planner、interpreter、INI、tool、
  parameter 或 LinuxCNC-owned runtime semantics。

验证已通过：

```bash
git diff --check
wasm-port/tests/opfs/node/verify_file_service.sh
SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_ini_panel_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_interp_wasm.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
opfs_file_service_node_smoke=ok
browser_ini_opfs_smoke=ok
vendor sync up to date
standalone CNC semantics guard complete
interp_wasm_node_smoke=ok
sim_configs_wasm_node_inventory_executed=28
sim_configs_wasm_node_inventory_passed=28
sim_configs_wasm_node_inventory_skipped=131
sim_configs_wasm_node_inventory_unexpected_fail=0
browser_interp_smoke=ok
host_wasm_opfs_browser_smokes=ok
```

下一步建议：

继续把这个 helper 扩到更明确的实际入口，优先扫描 browser/Node 里已有的 session
snapshot 调用是否能复用它，或者把 machine session 生成入口整理到更显式的 API；
只做 OPFS/filesystem/browser boundary 相关功能推进，不碰 CNC 语义。

一、2026-06-14 继续执行记录：browser explicit readback path groups guard

本轮按 `text10.txt` 第一候选批次继续收敛 explicit session saved readback path groups，
范围仍只触及 `wasm-port/tests/browser/interp_smoke.html` 的 browser/OPFS test glue。

完成内容：

- 新增 `explicitSavedParameterTextPath` 局部常量，承载 explicit parameter saved text
  readback path；
- 新增 `explicitSavedParameterBackupPath` 局部常量，承载 explicit parameter backup
  text readback path；
- 新增 `explicitSavedToolTableTextPath` 局部常量，承载 explicit tool-table saved text
  readback path；
- explicit parameter/tool-table saved readback 断言改为复用上述 path groups；
- 保持 explicit saved file expected OPFS path、WASM path、machine id、filename 与
  readback text 不变；
- 未改变任何 expected 字符串、输入、OPFS path、WASM path 字符串或 load/save/read
  行为；
- 未改变 staging path 模型、OPFS bridge behavior、file-service、SDK planner、
  interpreter、INI、tool、parameter 或 LinuxCNC-owned runtime semantics。

验证已通过：

```bash
git diff --check
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_interp_wasm.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
vendor sync up to date
standalone CNC semantics guard complete
interp_wasm_node_smoke=ok
sim_configs_wasm_node_inventory_executed=28
sim_configs_wasm_node_inventory_passed=28
sim_configs_wasm_node_inventory_skipped=131
sim_configs_wasm_node_inventory_unexpected_fail=0
browser_interp_smoke=ok
host_wasm_opfs_browser_smokes=ok
```

下一步建议：

继续小批量 browser test glue guard。优先扫描 machine text store path assertion groups
或剩余 OPFS readback path groups 是否还能进一步局部常量化或复用 existing helpers；
只改测试胶水，不改变输入、OPFS path、WASM path 字符串或保存/读取行为。

三、2026-06-14 继续执行记录：OPFS machine session snapshot save helper

本轮先将“加快实质性推进”规则写入 `text10.txt` 的当前项目纪律铁律中，并按该规则
继续推进 OPFS/session persistence 的实际 API 入口，而不是继续纯 test glue 微整理。

完成内容：

- 在“当前项目纪律”中新增“加快实质性推进铁律”；
- 在 `wasm-port/runtime/opfs/snapshot-store.js` 新增
  `saveMachineSessionSnapshot(sessionId, machineId, options)`；
- 该 helper 组合既有 `createMachineSessionSnapshotPayload(...)` 与
  `saveSessionSnapshot(...)`，让上层能用一个入口生成并保存机器会话快照；
- 支持沿用既有 `storage`、snapshot `filename`、`createdAt`、`metadata` 以及
  `iniFilename`、`parameterFilename`、`toolTableFilename`、`gcodeFilename`、
  `iniOpfsPath`、`parameterOpfsPath`、`toolTableOpfsPath`、`gcodeOpfsPath`
  选项；
- 在 Node OPFS smoke 中验证组合 helper 的自定义 snapshot 文件名、G-code path、
  metadata 与 load round trip；
- 在 browser INI panel smoke 中验证浏览器运行时可直接调用组合 helper，并能加载回
  parameter/tool-table/G-code path 与 metadata；
- 未改变 session snapshot envelope 格式、版本、path model、file-service 行为或既有
  save/load API；
- 未改变 OPFS bridge behavior、SDK planner、interpreter、INI、tool、parameter 或
  LinuxCNC-owned runtime semantics。

验证已通过：

```bash
git diff --check
wasm-port/tests/opfs/node/verify_file_service.sh
SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_ini_panel_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_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
```

关键输出：

```text
opfs_file_service_node_smoke=ok
browser_ini_opfs_smoke=ok
vendor sync up to date
standalone CNC semantics guard complete
interp_wasm_node_smoke=ok
sim_configs_wasm_node_inventory_executed=28
sim_configs_wasm_node_inventory_passed=28
sim_configs_wasm_node_inventory_skipped=131
sim_configs_wasm_node_inventory_unexpected_fail=0
browser_interp_smoke=ok
host_wasm_opfs_browser_smokes=ok
```

下一步建议：

继续沿 OPFS/session persistence 的实质能力推进。优先新增
`loadMachineSessionSnapshot(sessionId, machineId, options)`，在读取 generic snapshot
后校验 `payload.machineId` 与机器文件 path 结构，并补 Node/browser smoke；如果该入口
已足够清晰，再把 save/load machine session snapshot 接到 INI panel 的实际会话保存/恢复
workflow。仍只处理 OPFS/filesystem/browser boundary，不引入或重写任何 CNC 语义。

四、2026-06-14 继续执行记录：OPFS machine session snapshot load helper

本轮继续按“加快实质性推进铁律”推进 OPFS/session persistence 的实际 API 入口，
补齐 machine session snapshot 的读取校验侧能力。

完成内容：

- 在 `wasm-port/runtime/opfs/snapshot-store.js` 新增
  `loadMachineSessionSnapshot(sessionId, machineId, options)`；
- 该 helper 复用既有 `loadSessionSnapshot(...)` envelope 校验，然后校验
  `payload.machineId` 与调用方传入的 `machineId` 一致；
- 新增内部 machine snapshot payload 校验，要求 `payload.files` 为 plain object，
  且 `ini`、`parameters`、`toolTable` 为合法 OPFS path，`gcode` 如存在也必须是合法
  OPFS path；
- 校验只覆盖 host-side snapshot/path boundary，不解释 G-code、parameter、tool-table
  内容，不扩大 CNC 语义边界；
- 在 Node OPFS smoke 中覆盖 machine snapshot load round trip、machine id mismatch
  reject，以及非法 OPFS path reject；
- 在 browser INI panel smoke 中覆盖浏览器运行时的 checked machine snapshot load 和
  wrong-machine reject；
- 未改变 generic session snapshot envelope、path model、file-service、save/load API
  兼容性或已有 storage 行为；
- 未改变 OPFS bridge behavior、SDK planner、interpreter、INI、tool、parameter 或
  LinuxCNC-owned runtime semantics。

验证已通过：

```bash
git diff --check
wasm-port/tests/opfs/node/verify_file_service.sh
SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_ini_panel_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_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
```

关键输出：

```text
opfs_file_service_node_smoke=ok
browser_ini_opfs_smoke=ok
vendor sync up to date
standalone CNC semantics guard complete
interp_wasm_node_smoke=ok
sim_configs_wasm_node_inventory_executed=28
sim_configs_wasm_node_inventory_passed=28
sim_configs_wasm_node_inventory_skipped=131
sim_configs_wasm_node_inventory_unexpected_fail=0
browser_interp_smoke=ok
host_wasm_opfs_browser_smokes=ok
```

下一步建议：

继续把 machine session snapshot save/load helper 接到更明确的用户流程。优先扫描
`wasm-port/runtime/ui/ini-panel/app.js` 和 browser smoke，增加一个最小会话保存/恢复
workflow：保存当前 INI、parameter/tool-table path 和可选 G-code snapshot，再通过
`loadMachineSessionSnapshot(...)` 恢复出待加载文件清单。范围仍限定 OPFS/filesystem/UI
workflow，不解析或重写任何 LinuxCNC-owned CNC 语义。

五、2026-06-14 继续执行记录：INI panel session snapshot workflow

本轮继续按“加快实质性推进铁律”推进可直接使用的 browser/UI workflow，把 machine
session snapshot save/load helper 接入 INI panel 的最小会话保存/恢复流程。

完成内容：

- 在 `wasm-port/runtime/ui/ini-panel/app.js` 引入
  `saveMachineSessionSnapshot(...)` 与 `loadMachineSessionSnapshot(...)`；
- 新增固定 UI session snapshot id 与 filename：
  `ui-machine-session/ui-machine-session.json`；
- 新增 `Save Session Snapshot` 控件：
  - 保存当前编辑器 INI 到 OPFS machine files；
  - 保存默认 parameter/tool-table text；
  - 保存默认 G-code program；
  - 生成并保存 machine session snapshot；
  - 回填 INI、parameter、tool-table、G-code 和 snapshot path 字段；
- 新增 `Restore Session Snapshot` 控件：
  - 通过 `loadMachineSessionSnapshot(...)` 读取并校验 snapshot；
  - 从 OPFS machine files 恢复 INI 到编辑器；
  - 回填 snapshot 中的待加载文件清单；
- 在 `wasm-port/runtime/ui/ini-panel/index.html` 增加两个按钮和
  `Session Snapshot` 状态字段；
- 在 browser INI panel smoke 中覆盖保存 snapshot、恢复 snapshot、字段回填和 INI
  文本恢复；
- 未改变 LinuxCNC INI parser、interpreter、parameter restore/save、tool-table load/save
  或 G-code 执行语义；
- 未改变 OPFS path model、generic snapshot envelope、file-service、machine-session
  bridge 或 LinuxCNC-owned runtime semantics。

验证已通过：

```bash
git diff --check
SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_ini_panel_browser.sh
wasm-port/tests/opfs/node/verify_file_service.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_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
```

关键输出：

```text
browser_ini_opfs_smoke=ok
opfs_file_service_node_smoke=ok
vendor sync up to date
standalone CNC semantics guard complete
interp_wasm_node_smoke=ok
sim_configs_wasm_node_inventory_executed=28
sim_configs_wasm_node_inventory_passed=28
sim_configs_wasm_node_inventory_skipped=131
sim_configs_wasm_node_inventory_unexpected_fail=0
browser_interp_smoke=ok
host_wasm_opfs_browser_smokes=ok
```

下一步建议：

继续推进 browser/UI workflow 的实质能力。优先把 `Restore Session Snapshot` 后的文件清单
与现有 `Load Machine Session` 串联成单个可执行入口，例如新增
`Restore And Load Session`：先校验 snapshot，再把 OPFS INI/parameter/tool-table 加载到
interpreter WASM FS，并保持 G-code path 可运行。范围仍限定 OPFS/session/UI 编排，不
解析或改写任何 CNC 语义。

六、2026-06-14 继续执行记录：INI panel restore-and-load session workflow

本轮继续推进 browser/UI workflow 的实质能力，把 snapshot restore 和 machine-session
load 串成一个可直接执行的入口。

完成内容：

- 在 `wasm-port/runtime/ui/ini-panel/app.js` 抽出
  `restoreSessionSnapshotToEditor()`，统一执行 checked snapshot load、OPFS machine
  file restore、编辑器回填和 snapshot 文件清单字段回填；
- 抽出 `loadMachineSessionIntoWasm()`，统一通过既有
  `loadMachineSessionFromOpfs(...)` 把 OPFS INI、parameter、tool-table 加载到
  interpreter WASM FS；
- 保留既有 `Restore Session Snapshot` 与 `Load Machine Session` 按钮行为，并让它们
  复用上述 workflow helper；
- 新增 `Restore And Load Session` 控件：
  - 先通过 `loadMachineSessionSnapshot(...)` 校验 snapshot；
  - 再恢复 OPFS machine files 到编辑器；
  - 再把 INI、parameter、tool-table 加载到 interpreter WASM FS；
  - 保留 snapshot G-code path，供后续 `Run G-code` 使用；
- 在 browser INI panel smoke 中改为通过 `Restore And Load Session` 完成 session
  恢复加载，再继续执行 G-code run，验证 snapshot path、OPFS file mapping、
  LinuxCNC parameter/tool-table load result 和 canonical-event flow；
- 未改变 LinuxCNC INI parser、interpreter、parameter restore/save、tool-table load/save
  或 G-code 执行语义；
- 未改变 OPFS path model、generic snapshot envelope、file-service、machine-session
  bridge 或 LinuxCNC-owned runtime semantics。

验证已通过：

```bash
git diff --check
SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_ini_panel_browser.sh
wasm-port/tests/opfs/node/verify_file_service.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_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
```

关键输出：

```text
browser_ini_opfs_smoke=ok
opfs_file_service_node_smoke=ok
vendor sync up to date
standalone CNC semantics guard complete
interp_wasm_node_smoke=ok
sim_configs_wasm_node_inventory_executed=28
sim_configs_wasm_node_inventory_passed=28
sim_configs_wasm_node_inventory_skipped=131
sim_configs_wasm_node_inventory_unexpected_fail=0
browser_interp_smoke=ok
host_wasm_opfs_browser_smokes=ok
```

下一步建议：

继续沿 UI workflow 做实质推进。优先把 `Run G-code` 的输入从固定
`GCODE_FILENAME` 收敛为“优先使用已恢复 snapshot 中的 G-code OPFS path，否则回退默认
G-code”，并在 browser smoke 中验证 restore-and-load 后运行的程序来自 snapshot 文件清单。
仍只做 OPFS/session/UI 编排，不解析或改写 G-code 语义。
