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

生成时间：2026-06-15 CST

本文件接替 `text11.txt`。后续工作按 `text12.txt` 执行；除非明确要求审计旧记录，
不要再回到 `text1/text2/text3/text4/text5/text6/text7/text8/text9/text10/text11`
扩展进度。`text11.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. 当前续接点。

`text11.txt` 已推进到：

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

该批已提交：

```text
ed5d03e 推进 INI 面板 control-page refresh workflow helper
```

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

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

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

执行规则：

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

三、当前完成情况摘要

1. 当前工作树状态。

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

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

当前最近提交：

```text
ed5d03e 推进 INI 面板 control-page refresh workflow helper
213514f 推进 INI 面板 shell view-model helper
b330f7b 推进 INI 面板 launcher link view-model helper
ac46345 推进 INI 面板 entry docs strict gate
ef4769b 推进 INI 面板 entry doc
```

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

四、当前实质能力进展

1. INI panel/UI helper 能力。

当前 UI helper 已覆盖：

- run summary；
- run workflow；
- session snapshot summary；
- session load summary；
- machine file save/load summary；
- panel state summary；
- session snapshot save/restore workflow；
- entry manifest、launcher link view-model、shell view-model；
- read-only control-page controller；
- read-only control-page refresh 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_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
ini_panel_control_page_controller_node_smoke=ok
ini_panel_control_page_refresh_workflow_node_smoke=ok
ini_panel_entry_manifest_node_smoke=ok
ini_panel_ui_shell_node_smoke=ok
ini_panel_entry_docs_node_smoke=ok
ui_node_smokes=ok
```

2. 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
browser_ini_control_page_smoke=ok
browser_ini_launch_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
```

六、下一步建议

继续推进 OPFS/session persistence 的实质链路。下一批建议抽出
`loadMachineSessionForControlPageWorkflow()` 或等价 helper，让 read-only control page 能以明确
状态模型描述 embedded panel API readiness 和首帧 session state；仍保持只读，不新增控制按钮，
不解析 G-code。

一、2026-06-15 继续执行记录：INI panel control-page session readiness workflow helper

本轮按“第一原则：加快实质性推进”切换到 `text12.txt` 续接，并推进 OPFS/session
persistence 相关 browser/UI workflow：新增 read-only control-page session readiness workflow，
让外层页面能以明确状态模型读取 embedded panel API readiness 和首帧 session state。

完成内容：

- 新建 `text12.txt`，接替 `text11.txt`；后续记录从本文件继续；
- 新增 `wasm-port/runtime/ui/ini-panel/control-page-session-workflow.js`；
- 新增 `createControlPageSessionLoadState(input)`，固定 control-page session load 状态结构；
- 新增 `loadMachineSessionForControlPageWorkflow(input)`，统一描述：
  - `waiting-panel`：embedded panel frame 尚不可读；
  - `waiting-api`：panel window 可读但 API 尚未暴露；
  - `waiting-session`：API 已可读但 control view 尚未就绪；
  - `ready`：state bundle、workflow status 和 control view 可读取；
  - `error`：读取 panel window/API/control view 时失败；
- `createMachineSessionControlPageController()` 新增 `loadSessionState()`；
- `control-page.js` 对浏览器页面暴露 `loadControlPageSessionState`；
- `ui-shell.js` re-export session readiness workflow helper，并在
  `createIniPanelShellViewModel()` 中暴露 `controlPage.loadSessionState`；
- 新增 `wasm-port/tests/ui/node/verify_ini_panel_control_page_session_workflow.mjs` 和 `.sh`；
- `verify_ui_node_smokes.sh` 纳入 session readiness workflow smoke；
- browser control-page smoke 验证 `loadControlPageSessionState().phase === "ready"`；
- `panel-entry.md` 和 entry docs gate 同步记录 session readiness 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_session_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_session_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 的实质链路。下一批建议把 `load-session` 按钮路径抽成
`loadMachineSessionIntoWasmWorkflow()`，统一返回 loaded session、load summary、field state 和
log lines；仍保持由 LinuxCNC/OPFS bridge 执行实际语义，不在 JS 中解释 CNC 行为。

二、2026-06-15 继续执行记录：INI panel load-session workflow helper

本轮按“第一原则：加快实质性推进”继续推进 OPFS/session persistence 主链路，抽出
`load-session` 按钮路径的可复用 workflow helper，统一返回 loaded session、load summary、
field state 和 log lines。

完成内容：

- `wasm-port/runtime/ui/ini-panel/session-workflow.js` 新增
  `createMachineSessionLoadFieldState(summary)`；
- `session-workflow.js` 新增 `machineSessionLoadWorkflowLogLines(summary)`；
- `session-workflow.js` 新增 `loadMachineSessionIntoWasmWorkflow({ loadSession })`；
- workflow 只调用外部传入的 LinuxCNC/OPFS session loader，并基于现有
  `createMachineSessionLoadSummary()` 生成 UI 状态；
- `wasm-port/runtime/ui/ini-panel/app.js` 的 `load-session` handler 改为调用
  `loadMachineSessionIntoWasmWorkflow()`；
- `app.js` 仍由 `loadMachineSessionFromOpfs()` 通过 LinuxCNC/OPFS bridge 执行实际 session
  staging；
- `wasm-port/tests/ui/node/verify_ini_panel_session_workflow.mjs` 覆盖 load workflow 的
  loader 调用、summary、field state、log lines 和缺失 loader 错误；
- 未新增控制按钮；
- 未解析 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_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
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 的实质链路。下一批建议将 `restore-load-session` 路径改为复用
`loadMachineSessionIntoWasmWorkflow()`，避免 restore+load 与单独 load 的 field/log 状态模型
分叉；仍保持由 LinuxCNC/OPFS bridge 执行实际语义，不在 JS 中解释 CNC 行为。

三、2026-06-15 继续执行记录：INI panel restore-load workflow 复用 load-session helper

本轮按“第一原则：加快实质性推进”继续推进 OPFS/session persistence 主链路，将
`restore-load-session` 路径收敛到已存在的 `loadMachineSessionIntoWasmWorkflow()`，让单独
load 与 restore+load 共享同一套 load summary、field state 和 log lines 模型。

完成内容：

- `restoreMachineSessionSnapshotWorkflow()` 的 restore+load 分支改为调用
  `loadMachineSessionIntoWasmWorkflow({ loadSession })`；
- restore+load 返回的 `loadedSession`、`loadSummary` 和 INI/parameter/tool-table field state
  直接来自 load workflow；
- restore+load 日志纳入 load workflow 的统一首行：
  `Loaded machine session into the interpreter WASM filesystem.`；
- 删除 `app.js` 中已不再使用的 `sessionSnapshotSummaryLogLines` import；
- `verify_ini_panel_session_workflow.mjs` 增加 restore+load 复用断言，确认
  `loadSummary` 与单独 load workflow 一致，且 `loadedSession` 保持 loader 返回对象；
- `ui-session-summary-helpers.md` 同步说明 restore-load 复用 load workflow；
- 未新增控制按钮；
- 未解析 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_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
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 的实质链路。下一批建议抽出 `run-session` 首帧 readiness
或 run 前置状态 helper，把“已加载 session、已选择/恢复 snapshot、默认 G-code 路径、run
按钮可执行条件”统一成可复用状态模型；仍保持只描述 UI/host boundary facts，不在 JS 中解释
G-code、canonical events 或 CNC 运行语义。

四、2026-06-15 继续执行记录：INI panel run readiness workflow helper

本轮按“第一原则：加快实质性推进”继续推进 run 前置状态模型，将 run 按钮可执行条件、
默认/快照 G-code 选择结果与已加载 session 的 WASM 绑定关系抽成可复用 readiness helper，
让 app、state summary、control view 和 Node smoke 共享同一份运行前状态。

完成内容：

- 新增 `wasm-port/runtime/ui/ini-panel/run-workflow.js` 的
  `createRunSessionReadinessState(input)`；
- `runGcodeSessionWorkflow()` 现在先生成 readiness state，再复用其中的选定程序和 loaded
  session 信息执行实际 run；
- readiness state 固定返回：
  - `phase`
  - `canRun`
  - `missing`
  - `loadedSession`
  - `snapshot`
  - `defaultProgram`
  - `program`
  - `runButton`
- `wasm-port/runtime/ui/ini-panel/app.js` 在点击 Run 前先写入 readiness state，并把
  `selectedProgram`、`runReadiness` 和 field state 一起更新到 panel state；
- `wasm-port/runtime/ui/ini-panel/panel-state-summary.js` 新增 `runReadiness` 的 report /
  workflowStatus / control-view 映射；
- `createMachineSessionControlView()` 的 Run 区新增 `Ready` 与 `Button` 行，用于 read-only
  control page 读取首帧 run 前置状态；
- `wasm-port/tests/ui/node/verify_ini_panel_run_workflow.mjs` 覆盖 readiness helper 与
  workflow readiness 返回值；
- `wasm-port/tests/ui/node/verify_ini_panel_state_summary.mjs` 覆盖 runReadiness 在 report、
  bundle、workflowStatus 和 control view 中的映射；
- `wasm-port/docs/ui-run-summary-helpers.md` 和 `wasm-port/docs/ui-panel-state-summary.md`
  同步说明 readiness helper 与 runReadiness 状态；
- 未新增控制按钮；
- 未解析 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_run_workflow.sh
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_run_workflow_node_smoke=ok
ini_panel_state_summary_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 的实质链路。下一批建议将 `load-session` 与
`restore-load-session` 的 field/log 路径再做一次轻量整合，优先把“已加载 session、快照恢复、
run readiness、run 结果”汇总成一个更上层的只读工作流状态对象；仍保持只描述 UI/host
boundary facts，不在 JS 中解释 G-code、canonical events 或 CNC 运行语义。

五、2026-06-15 继续执行记录：INI panel workflow overview helper

本轮按“第一原则：加快实质性推进”继续推进更上层只读工作流状态对象，将已归一化的
report、run readiness、session snapshot/load、run result 和 control page 需要的状态字段
再压成单一 workflow overview，供 state bundle、workflow status 和 read-only control view
共享。

完成内容：

- 新增 `wasm-port/runtime/ui/ini-panel/panel-state-summary.js` 的
  `createMachineSessionWorkflowOverview(report)`；
- `createMachineSessionWorkflowStatus()` 现在额外返回 `overview`；
- `createMachineSessionStateBundle()` 现在额外返回 `overview`；
- `createMachineSessionControlView()` 新增 `Workflow` 区，显示：
  - `Phase`
  - `Missing`
  - `Last action`
  - `Error`
- overview 只组合已有的 readiness、session、loaded、runReadiness、run 和 status 信息；
- `Missing` 现在优先基于 loaded session / run readiness 的已知边界事实判断，不再依赖 DOM；
- `wasm-port/tests/ui/node/verify_ini_panel_state_summary.mjs` 覆盖 overview helper、bundle、
  workflow status 和 control view；
- `wasm-port/tests/ui/node/verify_ini_panel_control_page_session_workflow.mjs` 同步带上 overview；
- `wasm-port/docs/ui-panel-state-summary.md` 同步说明 overview 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_ini_panel_control_page_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_state_summary_node_smoke=ok
ini_panel_control_page_session_workflow_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 的实质链路。下一批建议把 `load-session`、`restore-load-session`
和 `run` 的状态入口再向上收拢成一个稳定的只读状态 API，优先服务 control page 和 shell 的
统一读取；仍保持只描述 UI/host boundary facts，不在 JS 中解释 G-code、canonical events 或
CNC 运行语义。

六、2026-06-15 继续执行记录：INI panel readonly status API

本轮按“第一原则：加快实质性推进”继续把 control page / shell 的状态入口向上收拢，新增稳定的
read-only status API，让外层 UI 能一次读取 state bundle、workflow status、overview、control view、
session、run readiness 和 run 结果。

完成内容：

- 新增 `wasm-port/runtime/ui/ini-panel/readonly-status-api.js`；
- 新增 `createMachineSessionReadonlyStatus(input)`，固定只读状态对象 shape；
- 新增 `readMachineSessionReadonlyStatus({ getPanelApi, getControlView })`，通过现有 panel API
  读取 `stateBundle`、`workflowStatus` 和 `controlView`；
- `createMachineSessionControlPageController()` 新增 `readStatus()`；
- `ui-shell.js` re-export readonly status API；
- `createIniPanelShellViewModel()` 的 `controlPage` 新增 `readStatus`；
- 新增 `wasm-port/tests/ui/node/verify_ini_panel_readonly_status_api.mjs` 和 `.sh`；
- `verify_ui_node_smokes.sh` 纳入 readonly status API smoke；
- `verify_ini_panel_control_page_controller.mjs` 覆盖 controller `readStatus()`；
- `verify_ini_panel_ui_shell.mjs` 覆盖 shell export、view-model 和 controller 读取路径；
- `verify_ini_panel_entry_docs.mjs` 与 `docs/panel-entry.md` 同步记录新 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_readonly_status_api.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_readonly_status_api_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
```

下一步建议：

继续推进 SDK/API surface。下一批建议把 readonly status API 的 shape 写入一个轻量 SDK-facing
入口或 manifest，方便外部页面稳定发现 `readStatus()`、`loadSessionState()`、`refresh()` 和
`renderView()`；仍保持只描述 UI/host boundary facts，不在 JS 中解释 G-code、canonical events
或 CNC 运行语义。

七、2026-06-15 继续执行记录：INI panel readonly status API manifest

本轮按“第一原则：加快实质性推进”继续推进 SDK/API surface，把 readonly status API 的 shape
写入轻量 manifest，方便外部页面稳定发现 `readStatus()`、`loadSessionState()`、`refresh()` 和
`renderView()`。

完成内容：

- `wasm-port/runtime/ui/ini-panel/readonly-status-api.js` 新增
  `createMachineSessionReadonlyStatusApiManifest()`；
- manifest 固定返回：
  - `apiName`
  - `methods.readStatus`
  - `relatedControlPageMethods`
  - `statusFields`
- `ui-shell.js` re-export `createMachineSessionReadonlyStatusApiManifest()`；
- `createIniPanelShellViewModel()` 的 `controlPage` 新增 `readonlyStatusApiManifest`；
- `verify_ini_panel_readonly_status_api.mjs` 覆盖 manifest shape；
- `verify_ini_panel_ui_shell.mjs` 覆盖 shell view-model 中的 manifest 暴露；
- `verify_ini_panel_entry_docs.mjs` 与 `docs/panel-entry.md` 同步记录 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_readonly_status_api.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_readonly_status_api_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
```

下一步建议：

继续推进 SDK/API surface。下一批建议为 shell-facing API 增加一个 focused contract smoke，
直接校验 `createIniPanelShellViewModel().controlPage` 的所有方法名、manifest 字段和只读边界，
使外部页面接入前能运行一个快速 contract gate；仍保持只描述 UI/host boundary facts，不在 JS
中解释 G-code、canonical events 或 CNC 运行语义。

八、2026-06-15 继续执行记录：INI panel shell control-page contract helper

本轮按“第一原则：加快实质性推进”继续推进 SDK/API surface，为 shell-facing control-page API
增加可复用 contract helper 和 focused contract gate，使外部页面接入前能快速校验方法名、
manifest 字段和只读边界。

完成内容：

- `wasm-port/runtime/ui/ini-panel/ui-shell.js` 新增
  `createIniPanelShellControlPageContract()`；
- `createIniPanelShellViewModel().controlPage` 新增 `contract`；
- contract 固定描述：
  - `methodNames`
  - `readonlyStatusApiManifest`
  - `readonlyStatusApiMethodNames`
  - `readonlyStatusApiStatusFields`
  - `relatedControlPageMethods`
- 新增 `verify_ini_panel_shell_control_page_contract.mjs/.sh` focused contract smoke；
- `verify_ui_node_smokes.sh` 接入 shell control-page contract smoke；
- `verify_ini_panel_ui_shell.mjs` 与 `verify_ini_panel_entry_docs.mjs` 覆盖 contract 暴露；
- `docs/panel-entry.md` 记录 `createIniPanelShellControlPageContract()` 和
  `controlPage.contract`；
- 未新增控制按钮；
- 未解析 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_shell_control_page_contract.sh
wasm-port/tests/ui/node/verify_ini_panel_entry_docs.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_shell_control_page_contract_node_smoke=ok
ini_panel_entry_docs_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
browser_ini_opfs_smoke=ok
browser_ini_control_page_smoke=ok
browser_ini_launch_smoke=ok
host_wasm_opfs_browser_smokes=ok
```

下一步建议：

继续推进 browser/UI workflow。下一批建议让 browser control-page smoke 读取并校验
`createIniPanelShellViewModel().controlPage.contract` 或等价 browser-exposed contract，
把 Node 端 contract gate 延伸到真实嵌入页面流程；仍保持只读，不新增控制按钮，不解析 G-code，
不解释 canonical events。

九、2026-06-15 继续执行记录：INI panel browser control-page contract exposure

本轮按“第一原则：加快实质性推进”继续推进 browser/UI workflow，把 Node 端 shell control-page
contract 延伸到真实 browser iframe 流程，使 `control-page.html` 暴露可读 contract，并由
browser smoke 在读取 embedded panel state 前校验 API shape。

完成内容：

- `wasm-port/runtime/ui/ini-panel/control-page.js` 引入
  `createIniPanelShellControlPageContract()`；
- `window.linuxCncIniPanelControlPageApi` 新增 `getControlPageContract()`；
- `ini_panel_control_page_smoke.html` 在真实 control-page iframe 中校验：
  - `methodNames`
  - `readonlyStatusApiManifest.apiName`
  - `readonlyStatusApiMethodNames`
  - `relatedControlPageMethods`
  - `readonlyStatusApiStatusFields`
- `docs/panel-entry.md` 记录
  `linuxCncIniPanelControlPageApi.getControlPageContract()` browser API；
- `verify_ini_panel_entry_docs.mjs` 覆盖 browser-exposed contract 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_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_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
```

下一步建议：

继续推进 OPFS/session persistence。下一批建议增加一个 browser control-page readonly status
snapshot smoke，直接通过 `linuxCncIniPanelControlPageApi` 读取 `readStatus()` 或等价只读状态，
并校验 save/load session 后的 `stateBundle`、`workflowStatus`、`controlView` 一致暴露；仍保持
只读，不新增控制按钮，不解析 G-code，不解释 canonical events。

十、2026-06-15 继续执行记录：INI panel browser readonly status snapshot

本轮按“第一原则：加快实质性推进”继续推进 OPFS/session persistence 和 browser/UI workflow，
让真实 browser control-page API 暴露只读状态 snapshot，并在 save/load session 与 run workflow
后校验 `stateBundle`、`workflowStatus`、`controlView` 一致可读。

完成内容：

- `wasm-port/runtime/ui/ini-panel/control-page.js` 在
  `window.linuxCncIniPanelControlPageApi` 新增 `readControlPageStatus()`；
- `ini_panel_control_page_smoke.html` 在真实 control-page iframe 中校验：
  - 初始 readonly status last action；
  - load-session 后 `stateBundle.report.readiness.parameterFile`；
  - load-session 后 `workflowStatus.lastAction`；
  - load-session 后 `controlView.status.lastAction`；
  - load-session 后 `session.parameterFile`；
  - run-gcode 后 readonly status `lastAction` 与 `runStatus`；
  - run-gcode 后 `workflowStatus` 与 `controlView` 一致暴露；
- `docs/panel-entry.md` 记录
  `linuxCncIniPanelControlPageApi.readControlPageStatus()` browser API；
- `verify_ini_panel_entry_docs.mjs` 覆盖 browser readonly status API 文档与源码入口；
- 未新增控制按钮；
- 未解析 G-code；
- 未解释 canonical events；
- 未改变 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
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_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
```

下一步建议：

继续推进 SDK/API surface。下一批建议为 browser control-page API 增加一个轻量 manifest 或
`getControlPageApiMethods()`，明确 `getControlPageContract()`、`readControlPageStatus()`、
`loadControlPageSessionState()`、`refreshControlPage()`、`renderControlPage()` 的 browser-exposed
方法清单，并由 Node/browser gate 双向校验；仍保持只读，不新增控制按钮，不解析 G-code。

十一、2026-06-15 继续执行记录：INI panel browser control-page API methods manifest

本轮按“第一原则：加快实质性推进”继续推进 SDK/API surface，为真实 browser control-page API
增加轻量方法清单，使外部页面能先发现 browser-exposed 方法，再调用只读 contract、status、
session load 与 refresh/render workflow。

完成内容：

- `wasm-port/runtime/ui/ini-panel/control-page.js` 新增
  `createControlPageBrowserApiMethods()`；
- `window.linuxCncIniPanelControlPageApi` 新增 `getControlPageApiMethods()`；
- browser-exposed 方法清单固定包含：
  - `getControlPageApiMethods`
  - `getControlPageContract`
  - `getControlView`
  - `getPanelApi`
  - `loadControlPageSessionState`
  - `readControlPageStatus`
  - `refreshControlPage`
  - `renderControlPage`
- `ini_panel_control_page_smoke.html` 在真实 control-page iframe 中校验方法清单与 namespace
  实际函数一致；
- `docs/panel-entry.md` 记录
  `linuxCncIniPanelControlPageApi.getControlPageApiMethods()` browser API；
- `verify_ini_panel_entry_docs.mjs` 覆盖 browser API methods 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_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_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
```

下一步建议：

继续推进 browser/UI workflow。下一批建议把 browser control-page API methods manifest 纳入
launch page 或 shell view-model 暴露，让入口页也能展示/消费可用 read-only control-page API
清单；仍保持只读，不新增控制按钮，不解析 G-code，不解释 canonical events。

十二、2026-06-15 继续执行记录：INI panel launch exposes control-page API methods

本轮按“第一原则：加快实质性推进”继续推进 browser/UI workflow，把 browser control-page API
methods manifest 纳入 shell view-model 和 launch page，使入口页也能消费可用 read-only
control-page API 清单，而不需要先加载 control-page iframe。

完成内容：

- `createControlPageBrowserApiMethods()` 从 `control-page.js` 迁移到 `ui-shell.js`；
- `control-page.js` 复用 shell 侧 `createControlPageBrowserApiMethods()`；
- `createIniPanelShellViewModel().controlPage` 新增 `browserApiMethods`；
- `launch.html` 改为基于 `createIniPanelShellViewModel()` 渲染 launcher links；
- `launch.html` 新增只读 `window.linuxCncIniPanelLaunchApi`：
  - `getLauncherLinks()`
  - `getControlPageApiMethods()`
- `ini_panel_launch_smoke.html` 在真实 launch iframe 中校验 launch API 与 shell helper
  返回同一份 control-page browser methods 清单；
- `verify_ini_panel_ui_shell.mjs`、`verify_ini_panel_shell_control_page_contract.mjs` 和
  `verify_ini_panel_entry_docs.mjs` 覆盖 shell view-model、launch API 与文档入口；
- `docs/panel-entry.md` 记录 `linuxCncIniPanelLaunchApi.getControlPageApiMethods()`；
- 未新增控制按钮；
- 未解析 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_shell_control_page_contract.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_shell_control_page_contract_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
host_wasm_opfs_browser_smokes=ok
```

下一步建议：

继续推进 SDK/API surface。下一批建议把 `linuxCncIniPanelLaunchApi` 也整理为轻量 launch API
manifest，明确 `getLauncherLinks()`、`getControlPageApiMethods()`、visible entries 和目标页面
路径，供外部 shell 在不读 DOM 的情况下发现入口；仍保持只读，不新增控制按钮，不解析 G-code。
