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

生成时间：2026-06-14 CST

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

一、第一原则：加快实质性推进

后续批次必须以“实质性能力优先”为第一遵守原则。

1. 优先级从高到低：

- OPFS/session persistence；
- SDK/API surface；
- browser/UI workflow；
- sim config coverage promotion；
- host/runtime boundary proof；
- 文档化可执行工作流。

2. 每批默认应产出至少一种可直接复用的能力：

- 可调用 helper；
- 可复用 API；
- 可验证用户流程；
- 可执行 gate；
- 可提升覆盖面的 runtime boundary proof；
- 能直接指导下一步实现的设计/清单。

3. 暂停低收益推进：

- 不再把“局部常量化、路径变量收敛、断言分组整理”作为主目标；
- 只有当它支撑可复用 workflow/API/gate 时，才允许做测试胶水；
- 禁止为了推进而扩大 CNC 语义边界；
- 禁止启动性能测试，除非已有明确用户流程需要性能基线。

4. LinuxCNC 仍是唯一 CNC 语义来源：

- G-code、remap、tool、parameter、planner、kinematics、user-M、tool DB、Python remap
  等语义必须来自 LinuxCNC upstream 或 vendored LinuxCNC C/C++/配置/脚本源码；
- JS/browser 只允许做 build、source sync、runtime shim、filesystem staging、OPFS、
  WASM/browser boundary、测试胶水、文档和机器可读 gate/artifact；
- 不在 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. 当前续接点。

`text10.txt` 已推进到：

```text
二十八、2026-06-14 继续执行记录：INI panel session snapshot workflow helper
```

该批已提交：

```text
4e4a9c6 推进 INI 面板 session snapshot workflow helper
```

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

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

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

执行规则：

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

三、当前完成情况摘要

1. 当前工作树状态。

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

```text
git status --short: clean
```

当前最近提交：

```text
4e4a9c6 推进 INI 面板 session snapshot workflow helper
48a0f61 收拢 browser explicit session readback path helper
b85444b 推进 INI 面板状态汇总 helper
405cc0b 推进 INI 面板 machine file helper 文档
a60826b 推进 INI 面板 machine file summary helper
```

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

四、当前实质能力进展

1. INI panel/UI helper 能力。

当前 UI helper 已覆盖：

- run summary；
- session snapshot summary；
- session load summary；
- machine file save/load summary；
- panel state summary；
- session snapshot save workflow。

当前聚合验证入口：

```bash
wasm-port/tests/ui/node/verify_ui_node_smokes.sh
```

当前 `verify_ui_node_smokes.sh` 覆盖：

```text
ini_panel_run_summary_node_smoke=ok
ini_panel_session_summary_node_smoke=ok
ini_panel_session_workflow_node_smoke=ok
ini_panel_machine_file_summary_node_smoke=ok
ini_panel_state_summary_node_smoke=ok
ui_node_smokes=ok
```

2. Session snapshot save workflow。

当前已新增：

```text
wasm-port/runtime/ui/ini-panel/session-workflow.js
```

导出：

```text
saveMachineSessionSnapshotWorkflow(input)
createSessionSnapshotFieldState(summary)
sessionSnapshotSaveLogLines(summary)
```

该 workflow helper 执行完整 host-boundary 保存链路：

- 写入当前 INI/tool/parameter machine text files；
- 写入默认 G-code program；
- 保存 machine session snapshot；
- 返回 snapshot summary、UI field state 和 log lines。

`wasm-port/runtime/ui/ini-panel/app.js` 的 `Save Session Snapshot` 按钮已改为调用该
workflow helper，按钮处理器只负责 field/log 渲染。

3. Browser/UI workflow 验证。

当前 browser INI panel smoke 继续覆盖真实 OPFS/session persistence workflow：

```bash
SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_ini_panel_browser.sh
```

关键输出：

```text
browser_ini_opfs_smoke=ok
```

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

每批后续改动至少运行：

```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_ini_panel_browser.sh
wasm-port/tests/ui/node/verify_ui_node_smokes.sh
wasm-port/tests/host/verify_host_smokes.sh
```

如果涉及 browser interpreter smoke，再运行：

```bash
SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.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. 当前第一候选批次：restore/load session workflow helper。

按“实质性能力优先”，下一批不要回到零散 path guard。优先把
`Restore Session Snapshot` 与 `Restore And Load Session` 抽成 session workflow helper，
让 restore、load、field state、summary/log lines 走同一套可调用 API。

建议目标：

- 在 `wasm-port/runtime/ui/ini-panel/session-workflow.js` 增加 restore workflow helper；
- helper 通过注入函数执行：
  - `loadMachineSessionSnapshot(...)`；
  - `loadMachineTextFiles(...)`；
  - 可选 `loadMachineSessionFromOpfs(...)`；
- 返回：
  - restored snapshot；
  - editor INI text；
  - snapshot summary；
  - optional load summary；
  - UI field state；
  - log lines；
- `app.js` 的 `Restore Session Snapshot` 和 `Restore And Load Session` 按钮改为调用该
  workflow helper；
- Node smoke 覆盖 restore-only 与 restore-and-load 两种流程；
- Browser INI panel smoke 继续验证真实 OPFS/session persistence；
- 不改变 snapshot-store、machine-file-store、LinuxCNC interpreter、tool、parameter 或
  G-code semantics。

2. 第一候选批次验证。

执行：

```bash
git diff --check
wasm-port/tests/ui/node/verify_ini_panel_session_workflow.sh
wasm-port/tests/ui/node/verify_ui_node_smokes.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
推进 INI 面板 restore/load session workflow helper
```

3. 后续候选。

如果 restore/load workflow 完成后仍有余力，继续推进更实质的用户流程能力：

- 把 `run-gcode` 的 snapshot/default program selection、WASM write、run summary、field/log
  更新抽成可调用 workflow helper；
- 给 UI/API 暴露一个更完整的 machine session state snapshot，用于上层应用直接消费；
- 只在这些 workflow helper 的验证需要时，继续收敛局部测试胶水。

一、2026-06-14 继续执行记录：INI panel restore/load session workflow helper

本轮按 `text11.txt` 第一原则继续推进实质性 UI/session persistence 能力，把
`Restore Session Snapshot` 和 `Restore And Load Session` 两条用户流程抽成可复用 workflow
helper，而不是继续做局部 path/test glue 收敛。

完成内容：

- 扩展 `wasm-port/runtime/ui/ini-panel/session-workflow.js`；
- 新增导出：
  - `restoreMachineSessionSnapshotWorkflow(input)`；
  - `sessionSnapshotRestoreLogLines(summary)`；
- restore workflow 通过注入函数执行：
  - `loadMachineSessionSnapshot(...)`；
  - `loadMachineTextFiles(...)`；
  - 可选 `loadSession()`；
- restore-only 返回：
  - restored snapshot；
  - editor INI text；
  - snapshot summary；
  - OPFS field state；
  - restore log lines；
- restore-and-load 返回：
  - loaded session；
  - load summary；
  - WASM field state；
  - snapshot + OPFS-to-WASM load log lines；
- `wasm-port/runtime/ui/ini-panel/app.js` 的 `Restore Session Snapshot` 和
  `Restore And Load Session` 按钮改为调用 workflow helper，按钮处理器只负责写 editor、
  field 和 log；
- `wasm-port/tests/ui/node/verify_ini_panel_session_workflow.mjs` 覆盖 save、restore-only
  和 restore-and-load 三条 workflow；
- `wasm-port/docs/ui-session-summary-helpers.md` 更新 restore workflow API、返回结构、
  log helper 和边界说明；
- 未改变 OPFS bridge、snapshot-store、machine-file-store、LinuxCNC interpreter、tool、
  parameter、G-code 文本或 LinuxCNC-owned runtime semantics。

验证已通过：

```bash
git diff --check
wasm-port/tests/ui/node/verify_ini_panel_session_workflow.sh
wasm-port/tests/ui/node/verify_ui_node_smokes.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
ini_panel_session_workflow_node_smoke=ok
ini_panel_run_summary_node_smoke=ok
ini_panel_session_summary_node_smoke=ok
ini_panel_machine_file_summary_node_smoke=ok
ini_panel_state_summary_node_smoke=ok
ui_node_smokes=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
host_wasm_opfs_browser_smokes=ok
```

下一步建议：

继续按“实质性能力优先”推进。下一批优先把 `run-gcode` 的用户流程抽成可调用 workflow
helper，覆盖 snapshot/default program selection、G-code OPFS load、WASM write、LinuxCNC
interpreter run、run summary、field/log state 和 error state。该 helper 仍只能编排
host/runtime boundary，不解析或实现 G-code、planner、tool、parameter 或 canonical-event
语义。

二、2026-06-14 继续执行记录：INI panel run G-code workflow helper

本轮继续按 `text11.txt` 第一原则推进实质性 UI workflow 能力，把 `run-gcode` 用户流程抽成
可复用 helper，让上层 UI/API 可以直接复用 session/default G-code 选择、OPFS load、WASM
staging、LinuxCNC interpreter run、run summary、field/log state 的编排。

完成内容：

- 新增 `wasm-port/runtime/ui/ini-panel/run-workflow.js`；
- 导出：
  - `selectSessionGcodeProgram(input)`；
  - `runSessionContextLogLines(program, snapshot, snapshotLabel)`；
  - `runGcodeSessionWorkflow(input)`；
- workflow helper 执行 host/runtime boundary 编排：
  - 从 snapshot G-code OPFS path 或默认 G-code path 选择程序；
  - 通过注入的 `loadGcodeProgram(...)` 读取 OPFS G-code 文本；
  - 调用 `interp.writeTextFile(...)` 写入 interpreter WASM filesystem；
  - 调用 LinuxCNC-owned `interp.runFileWithIni(...)`；
  - 返回 program、resultText、run summary、UI field state、motionSnapshots 和 log lines；
- `wasm-port/runtime/ui/ini-panel/app.js` 的 `Run G-code` 按钮改为调用 workflow helper；
- canonical-event 展示和 motion playback 仍留在 UI 层，workflow 只通过注入的
  `summarizeRun(...)` 接收已观察到的 UI summary/motion state；
- 新增 `wasm-port/tests/ui/node/verify_ini_panel_run_workflow.mjs` 和 shell wrapper；
- `wasm-port/tests/ui/node/verify_ui_node_smokes.sh` 纳入 run workflow smoke；
- `wasm-port/docs/ui-run-summary-helpers.md` 更新 run workflow API、返回结构和边界说明；
- 未改变 OPFS bridge、machine-file-store、LinuxCNC interpreter、G-code 文本、canonical-event
  语义、tool、parameter、planner 或 LinuxCNC-owned runtime semantics。

验证已通过：

```bash
git diff --check
wasm-port/tests/ui/node/verify_ini_panel_run_workflow.sh
wasm-port/tests/ui/node/verify_ui_node_smokes.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
ini_panel_run_workflow_node_smoke=ok
ini_panel_run_summary_node_smoke=ok
ini_panel_session_summary_node_smoke=ok
ini_panel_session_workflow_node_smoke=ok
ini_panel_machine_file_summary_node_smoke=ok
ini_panel_state_summary_node_smoke=ok
ui_node_smokes=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
host_wasm_opfs_browser_smokes=ok
```

下一步建议：

继续按“实质性能力优先”推进。优先把 save/restore/load/run workflow 的结果汇总成一个
更完整的 machine session state snapshot helper，供上层 UI/API 直接消费当前 machine、
session、loaded WASM mapping、selected G-code、last run summary、panel badges 和 error
state；该 helper 只聚合已有 host/runtime boundary facts，不解析 G-code 或扩展 CNC 语义。

三、2026-06-14 继续执行记录：INI panel machine session state snapshot helper

本轮继续按 `text11.txt` 第一原则推进实质性 UI/API 能力，把 save/restore/load/run workflow
的结果汇总成一个 machine session state snapshot，供上层 UI/API 直接读取，而不是继续
依赖分散的 DOM 字段、日志文本和临时全局值。

完成内容：

- 扩展 `wasm-port/runtime/ui/ini-panel/panel-state-summary.js`；
- 新增导出 `createMachineSessionStateSnapshot(input)`；
- state snapshot 汇总：
  - panel badges；
  - machine；
  - machineFiles；
  - sessionSnapshot；
  - sessionLoad；
  - selectedProgram；
  - run summary；
  - fields；
  - lastAction；
  - error；
  - fiveaxisRemap；
- `wasm-port/runtime/ui/ini-panel/app.js` 在 save/restore/load/run/failure/boot 路径后更新
  `window.linuxCncIniPanelMachineSessionState`；
- browser INI panel smoke 现在直接校验该 state snapshot 的关键字段；
- `wasm-port/tests/ui/node/verify_ini_panel_state_summary.mjs` 覆盖新 state snapshot 形状；
- `wasm-port/docs/ui-panel-state-summary.md` 更新 state snapshot API、window 暴露和边界说明；
- 未改变 OPFS bridge、snapshot-store、machine-file-store、LinuxCNC interpreter、G-code 文本、
  canonical-event 语义、tool、parameter、planner 或 LinuxCNC-owned runtime semantics。

验证已通过：

```bash
git diff --check
wasm-port/tests/ui/node/verify_ini_panel_state_summary.sh
wasm-port/tests/ui/node/verify_ui_node_smokes.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
ini_panel_state_summary_node_smoke=ok
ini_panel_run_summary_node_smoke=ok
ini_panel_run_workflow_node_smoke=ok
ini_panel_session_summary_node_smoke=ok
ini_panel_session_workflow_node_smoke=ok
ini_panel_machine_file_summary_node_smoke=ok
ui_node_smokes=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
host_wasm_opfs_browser_smokes=ok
```

下一步建议：

继续按“实质性能力优先”推进。下一批优先把 `window.linuxCncIniPanelMachineSessionState`
整理成更明确的 API/文档使用方式，或者在 `run-gcode`/restore/load/save 之外再补一层
更高阶的 UI consumer helper，用于读取状态并生成上层展示/导出结果；只围绕已有
host/runtime boundary facts 组合，不回到 path guard。

四、2026-06-14 继续执行记录：INI panel machine session state report helper

本轮继续按 `text11.txt` 第一原则推进上层 UI/API 可消费能力，把 machine session state
snapshot 转成稳定的 consumer report 结构，方便外部 UI、导出路径或测试直接读取状态。

完成内容：

- 扩展 `wasm-port/runtime/ui/ini-panel/panel-state-summary.js`；
- 新增导出 `createMachineSessionStateReport(state)`；
- report helper 输出稳定分组：
  - readiness；
  - session；
  - loaded；
  - program；
  - run；
  - status；
- `wasm-port/tests/ui/node/verify_ini_panel_state_summary.mjs` 覆盖 report 输出结构；
- `wasm-port/docs/ui-panel-state-summary.md` 增加 report API、用途和边界说明；
- 未改变 INI panel UI workflow、OPFS bridge、snapshot-store、machine-file-store、
  LinuxCNC interpreter、G-code 文本、canonical-event 语义、tool、parameter、planner 或
  LinuxCNC-owned runtime semantics。

验证已通过：

```bash
git diff --check
wasm-port/tests/ui/node/verify_ini_panel_state_summary.sh
wasm-port/tests/ui/node/verify_ui_node_smokes.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
ini_panel_state_summary_node_smoke=ok
ini_panel_run_summary_node_smoke=ok
ini_panel_run_workflow_node_smoke=ok
ini_panel_session_summary_node_smoke=ok
ini_panel_session_workflow_node_smoke=ok
ini_panel_machine_file_summary_node_smoke=ok
ui_node_smokes=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
host_wasm_opfs_browser_smokes=ok
```

下一步建议：

继续按“实质性能力优先”推进。优先把该 state report 接入浏览器 UI 的真实可用流程，例如
新增一个导出/复制 report 的 UI action 或一个明确的 SDK-facing getter，使上层消费者不必
直接读取 `window` 内部对象；仍只导出 host/runtime boundary facts，不解析或实现 CNC 语义。

合适的收敛点是当前这条线再补完两块后：

- machine session state report 稳定下来；
- run/save/restore/load workflow 都有对称的可复用入口。

到那时，把 `text11.txt` 里的建议收敛成一个明确 UI roadmap，建议分成这几段：

1. 状态层

- `MachineSessionState`
- `MachineSessionStateReport`
- 明确哪些字段是给上层 UI 读的

2. 会话层

- save / restore / restore-load / load
- session snapshot persistence
- OPFS 路径与 WASM 路径映射

3. 运行层

- G-code 选择
- run workflow
- run summary / motion / canonical-event 只做展示编排

4. 控制层

- 未来网页按钮和面板动作
- 用户启动、恢复、运行、查看状态
- 报错与恢复流程

5. 导出层

- 状态 report 导出
- 复制、下载、对外 API

当前阶段先继续补 workflow 和 report，后面再把它整理成一版面向“控制网页界面”的 roadmap。

五、2026-06-14 继续执行记录：INI panel browser state report getter

本轮按“导出层”第一步推进，把 `MachineSessionStateReport` 接入真实浏览器 INI panel
流程，提供明确的上层 UI/API 读取入口，避免继续让消费者直接抓 DOM 或读取临时
`window.linuxCncIniPanelMachineSessionState`。

完成内容：

- `wasm-port/runtime/ui/ini-panel/app.js` 新增并暴露
  `window.getMachineSessionStateReport()`；
- getter 每次调用 `createMachineSessionStateReport(window.linuxCncIniPanelMachineSessionState)`，
  返回当前稳定 report；
- `wasm-port/tests/browser/ini_panel_smoke.html` 在真实 save、restore-load、run
  流程后读取 report，并验证：
  - snapshot label；
  - G-code OPFS path；
  - loaded INI/parameter WASM path；
  - selected program source/path；
  - run status；
  - canonical-event 和 motion snapshot count；
  - last action 与 error；
- `wasm-port/docs/ui-panel-state-summary.md` 明确上层 UI/API 应读取
  `createMachineSessionStateReport(...)` 或 `window.getMachineSessionStateReport()`，
  不应抓 DOM 或直接依赖临时 window state；
- 未新增下载/复制按钮，先稳定 API 入口；
- 未改变 INI panel OPFS bridge、snapshot-store、machine-file-store、LinuxCNC
  interpreter、G-code 文本、canonical-event 语义、tool、parameter、planner 或
  LinuxCNC-owned runtime semantics。

验证已通过：

```bash
git diff --check
wasm-port/tools/verify_vendor_sync.sh
wasm-port/tools/verify_no_standalone_cnc_semantics.sh
wasm-port/tests/ui/node/verify_ui_node_smokes.sh
SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_ini_panel_browser.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
ini_panel_run_summary_node_smoke=ok
ini_panel_run_workflow_node_smoke=ok
ini_panel_session_summary_node_smoke=ok
ini_panel_session_workflow_node_smoke=ok
ini_panel_machine_file_summary_node_smoke=ok
ini_panel_state_summary_node_smoke=ok
ui_node_smokes=ok
browser_ini_opfs_smoke=ok
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
host_wasm_opfs_browser_smokes=ok
```

下一步建议：

继续沿“导出层/控制网页界面”roadmap 推进。下一批可以在不新增复杂 UI 按钮的前提下，
补一个更靠近上层消费者的 report export helper 或 SDK-facing wrapper，例如把 report
序列化成稳定 JSON 文本/Blob 输入；仍只组合已有 host/runtime boundary facts，不解析
G-code、不推导 CNC 语义、不读取 DOM。

六、2026-06-14 继续执行记录：INI panel state report JSON export helper

本轮继续推进“导出层”，在不新增复制/下载按钮的前提下，把 machine session state report
包装成上层 UI/API 可直接复用的稳定 JSON export payload。

完成内容：

- `wasm-port/runtime/ui/ini-panel/panel-state-summary.js` 新增
  `createMachineSessionStateReportExport(state, options)`；
- export helper 返回：
  - `filename`；
  - `mediaType: "application/json"`；
  - `report`；
  - 带末尾换行的 pretty JSON `text`；
- `wasm-port/runtime/ui/ini-panel/app.js` 暴露
  `window.getMachineSessionStateReportExport()`；
- `wasm-port/tests/ui/node/verify_ini_panel_state_summary.mjs` 覆盖默认 filename、
  media type、report 和 JSON text；
- `wasm-port/tests/browser/ini_panel_smoke.html` 在真实 save、restore-load、run 后读取
  browser export getter，并验证 JSON text 可解析、run count 和 program source 稳定；
- `wasm-port/docs/ui-panel-state-summary.md` 增加 export helper 说明；
- 未新增 UI 按钮，未抓 DOM，未直接依赖临时 window state；
- 未改变 OPFS/session persistence、LinuxCNC interpreter、G-code 文本、canonical-event
  语义、tool、parameter、planner 或 LinuxCNC-owned runtime semantics。

验证已通过：

```bash
git diff --check
wasm-port/tests/ui/node/verify_ini_panel_state_summary.sh
wasm-port/tests/ui/node/verify_ui_node_smokes.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
ini_panel_state_summary_node_smoke=ok
ini_panel_run_summary_node_smoke=ok
ini_panel_run_workflow_node_smoke=ok
ini_panel_session_summary_node_smoke=ok
ini_panel_session_workflow_node_smoke=ok
ini_panel_machine_file_summary_node_smoke=ok
ui_node_smokes=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
host_wasm_opfs_browser_smokes=ok
```

下一步建议：

继续按“实质性能力优先”推进。下一批建议把 report/export getter 收敛成一个更明确的
INI panel API namespace，例如 `window.linuxCncIniPanelApi.getMachineSessionStateReport()`
和 `getMachineSessionStateReportExport()`，为后续控制网页界面调用 save/restore/load/run
工作流预留统一入口；仍先不做复杂按钮，不解析 CNC 语义，不扩大 LinuxCNC runtime 边界。

七、2026-06-14 继续执行记录：INI panel API namespace

本轮继续推进“控制网页界面/API surface”方向，把上轮的 report/export getter 收敛到
明确的 INI panel API namespace，为后续统一暴露 save、restore、load、run 工作流入口做准备。

完成内容：

- `wasm-port/runtime/ui/ini-panel/app.js` 新增
  `window.linuxCncIniPanelApi`；
- namespace 当前暴露：
  - `getMachineSessionStateReport()`；
  - `getMachineSessionStateReportExport()`；
- 保留旧的 `window.getMachineSessionStateReport()` 与
  `window.getMachineSessionStateReportExport()` 作为兼容 shim；
- `wasm-port/tests/browser/ini_panel_smoke.html` 改为优先通过
  `window.linuxCncIniPanelApi` 读取 report/export；
- browser smoke 继续验证旧 global getter 与 namespace getter 输出一致；
- `wasm-port/docs/ui-panel-state-summary.md` 明确上层 UI/API 应读取
  `window.linuxCncIniPanelApi.getMachineSessionStateReport()`，不要抓 DOM 或直接依赖
  `window.linuxCncIniPanelMachineSessionState`；
- 未新增复杂 UI 按钮；
- 未改变 OPFS/session persistence、LinuxCNC interpreter、G-code 文本、canonical-event
  语义、tool、parameter、planner 或 LinuxCNC-owned runtime semantics。

验证已通过：

```bash
git diff --check
wasm-port/tests/ui/node/verify_ini_panel_state_summary.sh
SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_ini_panel_browser.sh
wasm-port/tests/ui/node/verify_ui_node_smokes.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
ini_panel_state_summary_node_smoke=ok
browser_ini_opfs_smoke=ok
ini_panel_run_summary_node_smoke=ok
ini_panel_run_workflow_node_smoke=ok
ini_panel_session_summary_node_smoke=ok
ini_panel_session_workflow_node_smoke=ok
ini_panel_machine_file_summary_node_smoke=ok
ui_node_smokes=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
host_wasm_opfs_browser_smokes=ok
```

下一步建议：

继续按“实质性能力优先”推进。下一批建议在 `window.linuxCncIniPanelApi` 下暴露第一个
只读/低风险 workflow-facing helper，例如 `getMachineSessionState()` 或
`getMachineSessionWorkflowStatus()`，把当前 last action、error、readiness、session/run
摘要合并为控制网页界面可直接轮询的状态对象；仍不新增按钮、不解析 G-code、不把 CNC
语义搬进 JS。

八、2026-06-14 继续执行记录：INI panel workflow status helper

本轮继续推进 `window.linuxCncIniPanelApi` 的只读面，补一个更适合控制网页界面轮询的
workflow status helper，把现有 report 派生为更轻量的状态对象。

完成内容：

- `wasm-port/runtime/ui/ini-panel/panel-state-summary.js` 新增
  `createMachineSessionWorkflowStatus(state)`；
- helper 只从 `createMachineSessionStateReport(state)` 派生，返回：
  - `readiness`；
  - `lastAction`；
  - `error`；
  - `session`；
  - `run`；
- `wasm-port/runtime/ui/ini-panel/app.js` 在
  `window.linuxCncIniPanelApi`、`window.getMachineSessionWorkflowStatus()` 下暴露该 helper；
- `wasm-port/tests/ui/node/verify_ini_panel_state_summary.mjs` 覆盖 workflow status 的字段；
- `wasm-port/tests/browser/ini_panel_smoke.html` 通过真实 save、restore-load、run 流程验证
  workflow status，并确认其与 report / export / legacy getter 一致；
- `wasm-port/docs/ui-panel-state-summary.md` 补充 workflow status helper 说明；
- 未新增按钮；
- 未解析 G-code；
- 未改变 OPFS/session persistence、LinuxCNC interpreter、canonical-event 语义、tool、
  parameter、planner 或 LinuxCNC-owned runtime semantics。

验证已通过：

```bash
git diff --check
wasm-port/tests/ui/node/verify_ini_panel_state_summary.sh
wasm-port/tests/ui/node/verify_ui_node_smokes.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
ini_panel_state_summary_node_smoke=ok
browser_ini_opfs_smoke=ok
ini_panel_run_summary_node_smoke=ok
ini_panel_run_workflow_node_smoke=ok
ini_panel_session_summary_node_smoke=ok
ini_panel_session_workflow_node_smoke=ok
ini_panel_machine_file_summary_node_smoke=ok
ini_panel_state_summary_node_smoke=ok
ui_node_smokes=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
host_wasm_opfs_browser_smokes=ok
```

下一步建议：

继续沿 `window.linuxCncIniPanelApi` 收敛控制面。下一批建议把当前散落的 report/export/
status getter 再包成一个明确的 `getMachineSessionStateBundle()` 或 `getMachineSessionView()`
只读入口，给控制网页界面一个单点轮询对象；仍保持只读，不加按钮，不扩大 CNC 语义边界。

九、2026-06-14 继续执行记录：INI panel state bundle helper

本轮继续沿 `window.linuxCncIniPanelApi` 收敛控制面，把现有 report/export/status 入口
聚合成一个单点只读 bundle helper，给控制网页界面或上层 SDK 一个更稳的轮询对象。

完成内容：

- `wasm-port/runtime/ui/ini-panel/panel-state-summary.js` 新增
  `createMachineSessionStateBundle(state, options)`；
- bundle helper 返回：
  - `report`；
  - `export`；
  - `workflowStatus`；
- `wasm-port/runtime/ui/ini-panel/app.js` 在
  `window.linuxCncIniPanelApi`、`window.getMachineSessionStateBundle()` 下暴露该 helper；
- `wasm-port/tests/ui/node/verify_ini_panel_state_summary.mjs` 覆盖 bundle 与单项 getter 的
 结构一致性；
- `wasm-port/tests/browser/ini_panel_smoke.html` 在真实 save、restore-load、run 流程后验证
  bundle，确认其 report/export/status 与单项 getter 一致；
- `wasm-port/docs/ui-panel-state-summary.md` 补充 bundle helper 说明，并明确它是控制页的
推荐单点只读入口；
- 未新增按钮；
- 未解析 G-code；
- 未改变 OPFS/session persistence、LinuxCNC interpreter、canonical-event 语义、tool、
  parameter、planner 或 LinuxCNC-owned runtime semantics。

验证已通过：

```bash
git diff --check
wasm-port/tests/ui/node/verify_ini_panel_state_summary.sh
wasm-port/tests/ui/node/verify_ui_node_smokes.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
ini_panel_state_summary_node_smoke=ok
ui_node_smokes=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
host_wasm_opfs_browser_smokes=ok
```

下一步建议：

继续沿“单点只读入口”推进，把 `window.linuxCncIniPanelApi` 再收敛成一个更明确的
`getMachineSessionView()` 或 `getMachineSessionStateBundle()` 的稳定消费者契约，并开始只
在这个 bundle 上面叠控制页展示逻辑；仍不新增按钮、不把 CNC 语义搬进 JS。

十、2026-06-14 继续执行记录：INI panel control view helper

本轮按“加快实质性推进”继续往控制网页界面的只读展示层推进，在 bundle 之上新增
control view helper，让上层 UI 可以直接渲染 status 与 sections/rows。

完成内容：

- `wasm-port/runtime/ui/ini-panel/panel-state-summary.js` 新增
  `createMachineSessionControlView(bundle)`；
- control view 返回：
  - `status`；
  - `sections`；
  - readiness/session/run 三组 rows；
- `wasm-port/runtime/ui/ini-panel/app.js` 在
  `window.linuxCncIniPanelApi`、`window.getMachineSessionControlView()` 下暴露该 helper；
- `wasm-port/tests/ui/node/verify_ini_panel_state_summary.mjs` 覆盖 view model 输出结构；
- `wasm-port/tests/browser/ini_panel_smoke.html` 在真实 save、restore-load、run 流程后验证
  control view 的 status、section id、workflow row 和 canonical-event row；
- `wasm-port/docs/ui-panel-state-summary.md` 补充 control view helper 说明；
- 未新增按钮；
- 未解析 G-code；
- 未解释 canonical events；
- 未改变 OPFS/session persistence、LinuxCNC interpreter、tool、parameter、planner 或
  LinuxCNC-owned runtime semantics。

验证已通过：

```bash
git diff --check
wasm-port/tests/ui/node/verify_ini_panel_state_summary.sh
wasm-port/tests/ui/node/verify_ui_node_smokes.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
ini_panel_state_summary_node_smoke=ok
ui_node_smokes=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
host_wasm_opfs_browser_smokes=ok
```

下一步建议：

继续推进实际控制网页界面的只读展示层。下一批建议新增一个极薄的 browser smoke 或
文档化控制页消费示例，直接读取 `window.linuxCncIniPanelApi.getMachineSessionControlView()`
并渲染 sections；仍保持只读，不加控制按钮，不解析 G-code。

十一、2026-06-14 继续执行记录：INI panel control view DOM consumer

本轮按“加快实质性推进”把 control view 从纯数据 helper 推到真实 browser consumer 层，
新增一个极薄的只读 DOM 渲染示例，直接消费
`window.linuxCncIniPanelApi.getMachineSessionControlView()`。

完成内容：

- `wasm-port/tests/browser/ini_panel_smoke.html` 新增只读 control view DOM 容器；
- 新增 `renderControlView(document, view)`，按 `view.sections` 渲染 section heading 与
  `dl/dt/dd` rows；
- browser smoke 在真实 save、restore-load、run 流程后：
  - 读取 `getMachineSessionControlView()`；
  - 渲染 sections；
  - 验证 DOM status；
  - 验证 DOM section count；
  - 验证 run section canonical-event row；
- `wasm-port/docs/ui-panel-state-summary.md` 增加最小 browser consumer 示例；
- 未新增控制按钮；
- 未解析 G-code；
- 未解释 canonical events；
- 未改变 OPFS/session persistence、LinuxCNC interpreter、tool、parameter、planner 或
  LinuxCNC-owned runtime semantics。

验证已通过：

```bash
git diff --check
wasm-port/tests/ui/node/verify_ini_panel_state_summary.sh
wasm-port/tests/ui/node/verify_ui_node_smokes.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
ini_panel_state_summary_node_smoke=ok
ui_node_smokes=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
host_wasm_opfs_browser_smokes=ok
```

下一步建议：

继续推进实质控制网页界面，但保持只读边界。下一批建议把这个 DOM consumer 提取为一个
可复用的纯 renderer helper，例如 `renderMachineSessionControlView(container, view)`，
供真实页面和 smoke 共用；仍不新增控制按钮，不解析 G-code。

十二、2026-06-14 继续执行记录：INI panel control view renderer helper

本轮按“加快实质性推进”把上一批 browser smoke 内的只读 DOM consumer 提取成 runtime
可复用 renderer，并接入真实 INI panel 页面，使控制页展示不再依赖测试内临时函数。

完成内容：

- 新增 `wasm-port/runtime/ui/ini-panel/control-view-renderer.js`；
- 导出 `renderMachineSessionControlView(container, view)`；
- renderer 只负责把 `createMachineSessionControlView(...)` 的 status、sections、rows 渲染
  到 DOM；
- `wasm-port/runtime/ui/ini-panel/index.html` 新增
  `#machine-session-control-view` 只读控制视图容器和对应样式；
- `wasm-port/runtime/ui/ini-panel/app.js` 新增
  `window.linuxCncIniPanelApi.renderMachineSessionControlView(container)`；
- panel state 每次更新后会刷新内置 control view；
- `wasm-port/tests/browser/ini_panel_smoke.html` 删除测试内临时 `renderControlView(...)`，
  改为导入 runtime renderer；
- browser smoke 同时验证外部 consumer 容器和真实页面内置 control view 容器；
- `wasm-port/tests/ui/node/verify_ini_panel_state_summary.mjs` 覆盖纯 renderer DOM 输出；
- `wasm-port/docs/ui-panel-state-summary.md` 补充 renderer API 和外部页面消费方式；
- 未新增控制按钮；
- 未解析 G-code；
- 未解释 canonical events；
- 未改变 OPFS/session persistence、LinuxCNC interpreter、tool、parameter、planner 或
  LinuxCNC-owned runtime semantics。

验证已通过：

```bash
git diff --check
wasm-port/tests/ui/node/verify_ini_panel_state_summary.sh
wasm-port/tests/ui/node/verify_ui_node_smokes.sh
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
ini_panel_state_summary_node_smoke=ok
ui_node_smokes=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
host_wasm_opfs_browser_smokes=ok
```

下一步建议：

继续保持只读边界，下一批建议把 control view renderer 的页面消费路径进一步固化为一个
小型控制页入口或 example page：只读取 `linuxCncIniPanelApi`，展示当前 machine/session/run
状态，不新增控制按钮，不解析 G-code。若要优先 SDK/API surface，也可以先把当前
state bundle/control view renderer 的导出面整理进一个明确的 UI module 文档入口。

十三、2026-06-14 继续执行记录：INI panel control page entry

本轮按“加快实质性推进”继续把只读 control view 从 renderer 推到可直接打开的页面入口，
新增一个独立的控制页 example，并把 browser smoke 扩展为双入口验证。

完成内容：

- 新增 `wasm-port/runtime/ui/ini-panel/control-page.html`；
- 新增 `wasm-port/runtime/ui/ini-panel/control-page.js`；
- control page 通过隐藏 iframe 载入真实 `runtime/ui/ini-panel/index.html`，只读读取
  `window.linuxCncIniPanelApi.getMachineSessionControlView()`；
- control page 把当前 status 与 sections 镜像到可见页面；
- 继续沿用现有 `renderMachineSessionControlView(container, view)`，没有新增控制按钮；
- 新增 `wasm-port/tests/browser/ini_panel_control_page_smoke.html`，覆盖 control page 入口、
  iframe 内面板 API、渲染轮询和 DOM 输出；
- `wasm-port/tests/browser/verify_ini_panel_browser.sh` 现同时验证：
  - `browser_ini_opfs_smoke=ok`
  - `browser_ini_control_page_smoke=ok`
- `wasm-port/docs/ui-panel-state-summary.md` 增加 control page 入口说明；
- 未解析 G-code；
- 未解释 canonical events；
- 未改变 OPFS/session persistence、LinuxCNC interpreter、tool、parameter、planner 或
  LinuxCNC-owned runtime semantics。

验证已通过：

```bash
git diff --check
wasm-port/tests/browser/verify_ini_panel_browser.sh
wasm-port/tests/ui/node/verify_ui_node_smokes.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
browser_ini_opfs_smoke=ok
browser_ini_control_page_smoke=ok
ui_node_smokes=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
host_wasm_opfs_browser_smokes=ok
```

下一步建议：

继续把这个控制页入口向“可复用上层入口”推进。下一批建议把
`control-page.html/js` 的页面消费逻辑抽成更小的页面 controller helper，或者直接加一个
只读导航入口页，把 `index.html` 与 `control-page.html` 作为并列入口统一暴露；仍保持
只读，不新增控制按钮，不解析 G-code。

十四、2026-06-14 继续执行记录：INI panel control page controller helper

本轮按“加快实质性推进”把 control page 的页面消费逻辑抽成可复用 controller helper，
让只读控制页入口不再把 iframe/API 轮询和渲染逻辑内联在页面脚本里。

完成内容：

- 新增 `wasm-port/runtime/ui/ini-panel/control-page-controller.js`；
- 导出 `createMachineSessionControlPageController(input)`；
- controller 负责：
  - 读取隐藏 iframe 的 `linuxCncIniPanelApi`；
  - 调用 `getMachineSessionControlView()`；
  - 渲染 waiting/status；
  - 用注入的 renderer 渲染 control view；
  - 启动轮询；
  - 挂载 panel iframe；
- `wasm-port/runtime/ui/ini-panel/control-page.js` 收敛为 DOM 绑定层；
- 新增 `wasm-port/tests/ui/node/verify_ini_panel_control_page_controller.mjs`；
- 新增 `wasm-port/tests/ui/node/verify_ini_panel_control_page_controller.sh`；
- `wasm-port/tests/ui/node/verify_ui_node_smokes.sh` 纳入 controller node smoke；
- `wasm-port/docs/ui-panel-state-summary.md` 补充 controller helper 说明；
- 未新增控制按钮；
- 未解析 G-code；
- 未解释 canonical events；
- 未改变 OPFS/session persistence、LinuxCNC interpreter、tool、parameter、planner 或
  LinuxCNC-owned runtime semantics。

验证已通过：

```bash
git diff --check
wasm-port/tests/ui/node/verify_ini_panel_control_page_controller.sh
wasm-port/tests/ui/node/verify_ui_node_smokes.sh
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
ini_panel_control_page_controller_node_smoke=ok
ui_node_smokes=ok
browser_ini_opfs_smoke=ok
browser_ini_control_page_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
host_wasm_opfs_browser_smokes=ok
```

下一步建议：

继续保持只读边界，下一批建议新增一个极薄的 UI entry index，例如
`runtime/ui/ini-panel/launch.html`，把编辑/运行面板 `index.html` 与只读控制页
`control-page.html` 作为并列入口暴露，并用 browser smoke 验证两个入口链接可达；仍不新增
控制按钮，不解析 G-code。

十五、2026-06-14 继续执行记录：INI panel launch entry

本轮按“加快实质性推进”新增只读 launcher 入口页，把编辑/运行面板和只读控制页作为并列
入口统一暴露，并把 launcher 可达性接入 browser smoke。

完成内容：

- 新增 `wasm-port/runtime/ui/ini-panel/launch.html`；
- launcher 提供两个并列入口：
  - `./index.html` 编辑/运行面板；
  - `./control-page.html` 只读控制视图；
- 新增 `wasm-port/tests/browser/ini_panel_launch_smoke.html`；
- `wasm-port/tests/browser/verify_ini_panel_browser.sh` 现在同时验证：
  - `browser_ini_opfs_smoke=ok`
  - `browser_ini_control_page_smoke=ok`
  - `browser_ini_launch_smoke=ok`
- `wasm-port/docs/ui-panel-state-summary.md` 补充 launcher 入口说明；
- 未新增控制按钮；
- 未解析 G-code；
- 未解释 canonical events；
- 未改变 OPFS/session persistence、LinuxCNC interpreter、tool、parameter、planner 或
  LinuxCNC-owned runtime semantics。

验证已通过：

```bash
git diff --check
wasm-port/tests/browser/verify_ini_panel_browser.sh
wasm-port/tests/ui/node/verify_ui_node_smokes.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
browser_ini_opfs_smoke=ok
browser_ini_control_page_smoke=ok
browser_ini_launch_smoke=ok
ui_node_smokes=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
host_wasm_opfs_browser_smokes=ok
```

下一步建议：

继续保持实质 UI workflow 优先。下一批建议把 launcher 中的入口清单抽成一个小的
`entry-manifest.js`，供 launcher、docs 或未来外层 shell 共用，并用 node/browser smoke 验证
入口 href 与标题一致；仍保持只读，不新增控制按钮，不解析 G-code。

十六、2026-06-14 继续执行记录：INI panel entry manifest

本轮按“加快实质性推进”把 launcher 的入口清单抽成共享 manifest，使入口 href/title 成为
可复用的 UI entry contract，而不是散落在 HTML 和 smoke 断言里。

完成内容：

- 新增 `wasm-port/runtime/ui/ini-panel/entry-manifest.js`；
- 导出：
  - `INI_PANEL_ENTRIES`；
  - `getIniPanelEntryManifest()`；
  - `getIniPanelEntryByHref(href)`；
- `wasm-port/runtime/ui/ini-panel/launch.html` 改为从 manifest 同步入口标题和 href；
- `wasm-port/tests/browser/ini_panel_launch_smoke.html` 改为同时验证 manifest 与 launcher DOM；
- 新增 `wasm-port/tests/ui/node/verify_ini_panel_entry_manifest.mjs`；
- 新增 `wasm-port/tests/ui/node/verify_ini_panel_entry_manifest.sh`；
- `wasm-port/tests/ui/node/verify_ui_node_smokes.sh` 纳入 entry manifest node smoke；
- `wasm-port/docs/ui-panel-state-summary.md` 补充 entry manifest 说明；
- 未新增控制按钮；
- 未解析 G-code；
- 未解释 canonical events；
- 未改变 OPFS/session persistence、LinuxCNC interpreter、tool、parameter、planner 或
  LinuxCNC-owned runtime semantics。

验证已通过：

```bash
git diff --check
wasm-port/tests/ui/node/verify_ini_panel_entry_manifest.sh
wasm-port/tests/ui/node/verify_ui_node_smokes.sh
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
ini_panel_entry_manifest_node_smoke=ok
ui_node_smokes=ok
browser_ini_opfs_smoke=ok
browser_ini_control_page_smoke=ok
browser_ini_launch_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
host_wasm_opfs_browser_smokes=ok
```

下一步建议：

继续优先推进可复用 UI/API surface。下一批建议把 `entry-manifest.js` 与 control page
controller/renderer 组合成一个更明确的 `ui-shell` 或 `panel-entry` 文档/API 入口，或者新增
一个 node smoke 验证 docs 中列出的入口与 manifest 完全一致；仍保持只读，不新增控制按钮，
不解析 G-code。

十七、2026-06-14 继续执行记录：INI panel ui shell export

本轮按“加快实质性推进”新增统一 UI shell 导出，把 entry manifest、control page controller
和 control view renderer 收敛到单一入口模块，方便上层页面、文档和 smoke 共享。

完成内容：

- 新增 `wasm-port/runtime/ui/ini-panel/ui-shell.js`；
- `ui-shell.js` 统一 re-export：
  - `INI_PANEL_ENTRIES`；
  - `getIniPanelEntryByHref()`；
  - `getIniPanelEntryManifest()`；
  - `createMachineSessionControlPageController()`；
  - `renderMachineSessionControlView()`；
- 新增 `wasm-port/tests/ui/node/verify_ini_panel_ui_shell.mjs`；
- 新增 `wasm-port/tests/ui/node/verify_ini_panel_ui_shell.sh`；
- `wasm-port/tests/ui/node/verify_ui_node_smokes.sh` 纳入 ui shell node smoke；
- `wasm-port/docs/ui-panel-state-summary.md` 补充 ui shell 说明；
- 未新增控制按钮；
- 未解析 G-code；
- 未解释 canonical events；
- 未改变 OPFS/session persistence、LinuxCNC interpreter、tool、parameter、planner 或
  LinuxCNC-owned runtime semantics。

验证已通过：

```bash
git diff --check
wasm-port/tests/ui/node/verify_ini_panel_ui_shell.sh
wasm-port/tests/ui/node/verify_ui_node_smokes.sh
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
ini_panel_ui_shell_node_smoke=ok
ui_node_smokes=ok
browser_ini_opfs_smoke=ok
browser_ini_control_page_smoke=ok
browser_ini_launch_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
host_wasm_opfs_browser_smokes=ok
```

下一步建议：

继续保持只读边界，下一批建议在 `docs/ui-panel-state-summary.md` 之外补一个更短的
`ui-shell.md` 或 `panel-entry.md`，只列出 `ui-shell.js`、`launch.html`、`control-page.html`
三者关系和最小用法，或者把 launcher 页面改成从 `ui-shell.js` 读取 manifest；仍不新增控制
按钮，不解析 G-code。

十八、2026-06-14 继续执行记录：launcher and smoke shell alignment

本轮把 launcher 页面和 launch smoke 统一切到 `ui-shell.js`，使入口页面、测试断言与统一
shell 入口保持一致，减少入口契约的重复来源。

完成内容：

- `wasm-port/runtime/ui/ini-panel/launch.html` 改为从 `ui-shell.js` 读取 manifest；
- `wasm-port/tests/browser/ini_panel_launch_smoke.html` 改为从 `ui-shell.js` 读取 manifest；
- `wasm-port/tests/ui/node/verify_ini_panel_ui_shell.mjs` 增加 manifest 复制语义检查；
- 保持 `ui-shell.js` 作为 entry manifest、controller、renderer 的单一导出入口；
- 未新增控制按钮；
- 未解析 G-code；
- 未解释 canonical events；
- 未改变 OPFS/session persistence、LinuxCNC interpreter、tool、parameter、planner 或
  LinuxCNC-owned runtime semantics。

验证已通过：

```bash
git diff --check
wasm-port/tests/ui/node/verify_ini_panel_ui_shell.sh
wasm-port/tests/ui/node/verify_ui_node_smokes.sh
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
ini_panel_ui_shell_node_smoke=ok
ui_node_smokes=ok
browser_ini_opfs_smoke=ok
browser_ini_control_page_smoke=ok
browser_ini_launch_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
host_wasm_opfs_browser_smokes=ok
```

下一步建议：

继续压缩重复文档与入口说明。下一批建议新增一个极短的 `panel-entry.md`，只写
`ui-shell.js`、`launch.html`、`control-page.html` 三者关系和最小调用方式，或者直接把
launcher 页面改成从 `ui-shell.js` 导出更稳定的可见入口列表；仍保持只读，不新增控制按钮，
不解析 G-code。

十九、2026-06-14 继续执行记录：INI panel entry doc

本轮按“加快实质性推进”新增极短的入口文档，只保留 `ui-shell.js`、launcher、
control-page 的关系和最小调用方式，并把文档内容纳入 Node smoke。

完成内容：

- 新增 `wasm-port/docs/panel-entry.md`；
- 文档只保留：
  - `ui-shell.js` 的 shell-facing import；
  - `launch.html`、`index.html`、`control-page.html` 的最小关系表；
  - entry manifest 表；
  - boundary 说明；
- 新增 `wasm-port/tests/ui/node/verify_ini_panel_entry_docs.mjs`；
- 新增 `wasm-port/tests/ui/node/verify_ini_panel_entry_docs.sh`；
- `wasm-port/tests/ui/node/verify_ui_node_smokes.sh` 纳入 entry docs node smoke；
- `wasm-port/docs/ui-panel-state-summary.md` 补充入口文档指向；
- 未新增控制按钮；
- 未解析 G-code；
- 未解释 canonical events；
- 未改变 OPFS/session persistence、LinuxCNC interpreter、tool、parameter、planner 或
  LinuxCNC-owned runtime semantics。

验证已通过：

```bash
git diff --check
wasm-port/tests/ui/node/verify_ini_panel_entry_docs.sh
wasm-port/tests/ui/node/verify_ui_node_smokes.sh
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
ini_panel_entry_docs_node_smoke=ok
ui_node_smokes=ok
browser_ini_opfs_smoke=ok
browser_ini_control_page_smoke=ok
browser_ini_launch_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
host_wasm_opfs_browser_smokes=ok
```

下一步建议：

继续压缩表述面。下一批建议让 `ui-shell.js` 直接成为 launcher 页面和 docs 的唯一入口
来源，或者再补一个更短的 `ui-shell.md` 汇总 shell、launcher、control-page 三者关系；仍保持
只读，不新增控制按钮，不解析 G-code。

二十、2026-06-14 继续执行记录：INI panel entry docs strict gate

本轮按“加快实质性推进”加强 `panel-entry.md` 的一致性 gate，从字符串存在检查升级为完整
shell export、页面路径和 manifest 表校验，减少入口文档漂移风险。

完成内容：

- `wasm-port/docs/panel-entry.md` 的 shell import 示例补齐：
  - `INI_PANEL_ENTRIES`；
  - `getIniPanelEntryByHref`；
  - `getIniPanelEntryManifest`；
  - `createMachineSessionControlPageController`；
  - `renderMachineSessionControlView`；
- `wasm-port/tests/ui/node/verify_ini_panel_entry_docs.mjs` 现在校验：
  - `ui-shell.js` 实际导出名；
  - 文档中的 shell import 名；
  - `launch.html`、`index.html`、`control-page.html` 页面路径；
  - `getIniPanelEntryManifest()` 与 `INI_PANEL_ENTRIES` 一致；
  - 文档 manifest 表中每个 entry 的 id、href、title；
- 未新增控制按钮；
- 未解析 G-code；
- 未解释 canonical events；
- 未改变 OPFS/session persistence、LinuxCNC interpreter、tool、parameter、planner 或
  LinuxCNC-owned runtime semantics。

验证已通过：

```bash
git diff --check
wasm-port/tests/ui/node/verify_ini_panel_entry_docs.sh
wasm-port/tests/ui/node/verify_ui_node_smokes.sh
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
ini_panel_entry_docs_node_smoke=ok
ui_node_smokes=ok
browser_ini_opfs_smoke=ok
browser_ini_control_page_smoke=ok
browser_ini_launch_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
host_wasm_opfs_browser_smokes=ok
```

下一步建议：

继续推进实质 UI/API surface。下一批建议把 `ui-shell.js` 中用于 launcher 的入口列表再封装成
`getVisibleIniPanelEntries()`，让页面不需要知道 manifest 复制语义；仍保持只读，不新增控制
按钮，不解析 G-code。

二十一、2026-06-14 继续执行记录：INI panel visible entries helper

本轮按“加快实质性推进”在 `ui-shell.js` 增加 launcher-facing 的可见入口 helper，让页面和
文档使用 `getVisibleIniPanelEntries()`，不再直接依赖 manifest 复制语义。

完成内容：

- `wasm-port/runtime/ui/ini-panel/ui-shell.js` 新增 `getVisibleIniPanelEntries()`；
- `getVisibleIniPanelEntries()` 返回 launcher 可见入口列表；
- `wasm-port/runtime/ui/ini-panel/launch.html` 改为调用 `getVisibleIniPanelEntries()`；
- `wasm-port/tests/browser/ini_panel_launch_smoke.html` 改为验证 visible entries；
- `wasm-port/tests/ui/node/verify_ini_panel_ui_shell.mjs` 覆盖 visible entries 与复制语义；
- `wasm-port/docs/panel-entry.md` 改为以 `getVisibleIniPanelEntries()` 作为入口列表 API；
- `wasm-port/tests/ui/node/verify_ini_panel_entry_docs.mjs` 同步验证文档和 visible entries；
- 未新增控制按钮；
- 未解析 G-code；
- 未解释 canonical events；
- 未改变 OPFS/session persistence、LinuxCNC interpreter、tool、parameter、planner 或
  LinuxCNC-owned runtime semantics。

验证已通过：

```bash
git diff --check
wasm-port/tests/ui/node/verify_ini_panel_ui_shell.sh
wasm-port/tests/ui/node/verify_ini_panel_entry_docs.sh
wasm-port/tests/ui/node/verify_ui_node_smokes.sh
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
ini_panel_ui_shell_node_smoke=ok
ini_panel_entry_docs_node_smoke=ok
ui_node_smokes=ok
browser_ini_opfs_smoke=ok
browser_ini_control_page_smoke=ok
browser_ini_launch_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
host_wasm_opfs_browser_smokes=ok
```

下一步建议：

继续推进 UI/API surface，但避免纯文档循环。下一批建议把 `getVisibleIniPanelEntries()` 用到
更多外层 shell 消费示例，或新增一个小型 Node helper 生成 launcher link view-model；仍保持
只读，不新增控制按钮，不解析 G-code。

二十二、2026-06-15 继续执行记录：INI panel launcher link view-model helper

本轮按“加快实质性推进”继续推进 UI/API surface，在 shell 层新增 launcher link
view-model helper，让 launcher 页面不直接读取 manifest 字段名。

完成内容：

- `wasm-port/runtime/ui/ini-panel/ui-shell.js` 新增
  `createIniPanelLauncherLinkViewModel()`；
- launcher link view-model 输出 `entryId`、`href`、`label`，作为外层 shell 可直接渲染的
  链接模型；
- `wasm-port/runtime/ui/ini-panel/launch.html` 改为调用
  `createIniPanelLauncherLinkViewModel()` 渲染链接；
- `wasm-port/tests/browser/ini_panel_launch_smoke.html` 覆盖 launcher link view-model；
- `wasm-port/tests/ui/node/verify_ini_panel_ui_shell.mjs` 覆盖 view-model 内容与复制语义；
- `wasm-port/tests/ui/node/verify_ini_panel_entry_docs.mjs` 同步校验文档和 shell helper；
- `wasm-port/docs/panel-entry.md` 记录 launcher link view-model API；
- 未新增控制按钮；
- 未解析 G-code；
- 未解释 canonical events；
- 未改变 OPFS/session persistence、LinuxCNC interpreter、tool、parameter、planner 或
  LinuxCNC-owned runtime semantics。

验证已通过：

```bash
git diff --check
wasm-port/tests/ui/node/verify_ini_panel_ui_shell.sh
wasm-port/tests/ui/node/verify_ini_panel_entry_docs.sh
wasm-port/tests/browser/verify_ini_panel_browser.sh
wasm-port/tests/ui/node/verify_ui_node_smokes.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_ini_panel_browser.sh
wasm-port/tests/host/verify_host_smokes.sh
```

关键输出：

```text
ini_panel_ui_shell_node_smoke=ok
ini_panel_entry_docs_node_smoke=ok
browser_ini_opfs_smoke=ok
browser_ini_control_page_smoke=ok
browser_ini_launch_smoke=ok
ui_node_smokes=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/API surface 的可复用边界。下一批建议新增一个
`createIniPanelShellViewModel()`，把 launcher links、可用页面和 control-page helper 暴露为
单一 shell model，供外层应用一次性挂载；仍保持只读，不新增控制按钮，不解析 G-code。

二十三、2026-06-15 继续执行记录：INI panel shell view-model helper

本轮按“第一原则：加快实质性推进”继续推进 UI/API surface，新增单一 shell view-model，
让外层应用可以一次性读取 launcher links、页面列表和 control-page 挂载 helper。

完成内容：

- `wasm-port/runtime/ui/ini-panel/ui-shell.js` 新增 `createIniPanelShellViewModel()`；
- shell view-model 返回：
  - `pages`：只读页面列表；
  - `launcherLinks`：可直接渲染的 launcher link view-model；
  - `controlPage.createController`：现有 read-only control-page controller；
  - `controlPage.renderView`：现有 read-only control-view renderer；
- `wasm-port/tests/ui/node/verify_ini_panel_ui_shell.mjs` 覆盖 shell view-model 结构、
  helper 引用和复制语义；
- `wasm-port/tests/ui/node/verify_ini_panel_entry_docs.mjs` 同步校验文档和 shell helper；
- `wasm-port/docs/panel-entry.md` 记录 `createIniPanelShellViewModel()`；
- 未新增控制按钮；
- 未解析 G-code；
- 未解释 canonical events；
- 未改变 OPFS/session persistence、LinuxCNC interpreter、tool、parameter、planner 或
  LinuxCNC-owned runtime semantics。

验证已通过：

```bash
git diff --check
wasm-port/tests/ui/node/verify_ini_panel_ui_shell.sh
wasm-port/tests/ui/node/verify_ini_panel_entry_docs.sh
SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_ini_panel_browser.sh
wasm-port/tests/ui/node/verify_ui_node_smokes.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
ini_panel_ui_shell_node_smoke=ok
ini_panel_entry_docs_node_smoke=ok
browser_ini_opfs_smoke=ok
browser_ini_control_page_smoke=ok
browser_ini_launch_smoke=ok
ui_node_smokes=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 或 browser/UI workflow 的实质链路。下一批建议在
`app.js` 外抽出一个 control-page snapshot refresh workflow helper，让 read-only 页面能复用
明确的 refresh 状态模型；仍保持只读，不新增控制按钮，不解析 G-code。

二十四、2026-06-15 继续执行记录：INI panel control-page refresh workflow helper

本轮按“第一原则：加快实质性推进”推进 browser/UI workflow，在 `app.js` 外新增
read-only control-page refresh workflow helper，让外层页面可复用明确的 refresh 状态模型。

完成内容：

- 新增 `wasm-port/runtime/ui/ini-panel/control-page-refresh-workflow.js`；
- 新增 `controlPageStatusText(status)`，格式化已观察到的 control view status 字段；
- 新增 `createControlPageRefreshState(input)`，固定 refresh 状态结构；
- 新增 `refreshMachineSessionControlPage(input)`，统一处理：
  - `waiting`：panel API 尚不可用；
  - `rendered`：读取 control view 并调用 renderer；
  - `error`：control view getter 或 renderer 抛错；
- `createMachineSessionControlPageController()` 改为通过 refresh workflow 执行 render；
- control-page controller 新增 `refresh()`，保留原 `render()` 返回值兼容；
- `control-page.js` 对浏览器页面暴露 `refreshControlPage`；
- `ui-shell.js` re-export refresh workflow helper，并在 `createIniPanelShellViewModel()` 中暴露
  `controlPage.refresh`；
- 新增 `wasm-port/tests/ui/node/verify_ini_panel_control_page_refresh_workflow.mjs` 和 `.sh`；
- `verify_ui_node_smokes.sh` 纳入 refresh workflow smoke；
- browser control-page smoke 验证 `refreshControlPage().phase === "rendered"`；
- `panel-entry.md` 和 entry docs gate 同步记录 refresh workflow API；
- 未新增控制按钮；
- 未解析 G-code；
- 未解释 canonical events；
- 未改变 OPFS/session persistence、LinuxCNC interpreter、tool、parameter、planner 或
  LinuxCNC-owned runtime semantics。

验证已通过：

```bash
git diff --check
wasm-port/tests/ui/node/verify_ini_panel_control_page_refresh_workflow.sh
wasm-port/tests/ui/node/verify_ini_panel_control_page_controller.sh
wasm-port/tests/ui/node/verify_ini_panel_ui_shell.sh
wasm-port/tests/ui/node/verify_ini_panel_entry_docs.sh
wasm-port/tests/ui/node/verify_ui_node_smokes.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
ini_panel_control_page_refresh_workflow_node_smoke=ok
ini_panel_control_page_controller_node_smoke=ok
ini_panel_ui_shell_node_smoke=ok
ini_panel_entry_docs_node_smoke=ok
ui_node_smokes=ok
browser_ini_opfs_smoke=ok
browser_ini_control_page_smoke=ok
browser_ini_launch_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 的实质链路。下一批建议抽出
`loadMachineSessionForControlPageWorkflow()` 或等价 helper，让 read-only control page 能以明确
状态模型描述 embedded panel API readiness 和首帧 session state；仍保持只读，不新增控制按钮，
不解析 G-code。
