项目整体完成情况与后续执行计划 生成时间: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。 十三、2026-06-15 继续执行记录:INI panel launch API manifest 本轮按“第一原则:加快实质性推进”继续推进 SDK/API surface,为 launch page 增加轻量 API manifest,使外部 shell 可以在不读取 DOM、不加载 control-page iframe 的情况下发现入口方法、 visible entries、目标页面路径和 read-only control-page browser API 清单。 完成内容: - `wasm-port/runtime/ui/ini-panel/ui-shell.js` 新增 `createIniPanelLaunchApiManifest()`; - `createIniPanelShellViewModel()` 新增 `launchApiManifest`; - launch API manifest 固定包含: - `apiName` - `methods` - `visibleEntries` - `targetPages` - `controlPageApiMethods` - `launch.html` 的 `window.linuxCncIniPanelLaunchApi` 新增 `getLaunchApiManifest()`; - `ini_panel_launch_smoke.html` 在真实 launch iframe 中校验: - manifest API name; - manifest method list; - visible entry count; - control-page target href; - launch API 与 shell helper 一致; - `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 manifest helper 与文档入口; - `docs/panel-entry.md` 记录 `createIniPanelLaunchApiManifest()` 和 `linuxCncIniPanelLaunchApi.getLaunchApiManifest()`; - 未新增控制按钮; - 未解析 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_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 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_ui_shell_node_smoke=ok ini_panel_shell_control_page_contract_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 ``` 下一步建议: 继续推进 browser/UI workflow。下一批建议给 launch API manifest 增加一个 focused Node smoke `verify_ini_panel_launch_api_manifest.sh`,直接校验 manifest shape、entries 深拷贝、target page 映射和 control-page API methods,避免这些能力只被大 smoke 间接覆盖;仍保持只读,不新增控制 按钮,不解析 G-code。 十四、2026-06-15 继续执行记录:INI panel launch API manifest focused gate 本轮按“第一原则:加快实质性推进”继续推进 browser/UI workflow,为 launch API manifest 增加 focused Node gate,直接校验 manifest shape、entries 深拷贝、target page 映射和 control-page API methods,避免这些能力只被大 smoke 间接覆盖。 完成内容: - 新增 `wasm-port/tests/ui/node/verify_ini_panel_launch_api_manifest.mjs`; - 新增 `wasm-port/tests/ui/node/verify_ini_panel_launch_api_manifest.sh`; - `verify_ini_panel_launch_api_manifest.mjs` 覆盖: - `apiName` - `methods` - `visibleEntries` - `targetPages` - `controlPageApiMethods` - manifest 深拷贝行为; - custom entries 的 target page 映射; - `launch.html` 暴露 `linuxCncIniPanelLaunchApi.getLaunchApiManifest()`; - `ui-shell.js` 暴露 `createIniPanelLaunchApiManifest()`; - `verify_ui_node_smokes.sh` 接入 launch API manifest focused gate; - 未新增控制按钮; - 未解析 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_launch_api_manifest.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_launch_api_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 ``` 下一步建议: 继续推进 OPFS/session persistence。下一批建议为 launch API manifest 加入 `persistenceCapabilities` 或等价只读字段,明确 launch 入口可发现的 OPFS/session workflow 能力(如 machine files、 session snapshot、readonly status),并由 focused Node gate 与 browser launch smoke 双向校验; 仍保持只读,不新增控制按钮,不解析 G-code。 十五、2026-06-15 继续执行记录:INI panel launch persistence capabilities manifest 本轮按“第一原则:加快实质性推进”继续推进 OPFS/session persistence,把 launch API manifest 扩展为可发现的 persistence capabilities 清单,让入口页和外部 shell 能在不读取 DOM、不加载 control-page iframe 的情况下发现 machine files、session snapshot 和 readonly status 能力。 完成内容: - `createIniPanelLaunchApiManifest()` 新增 `persistenceCapabilities`; - persistence capabilities 固定包含: - `machine-files` / `Machine text files` / `opfs` - `session-snapshot` / `Machine session snapshot` / `opfs` - `readonly-status` / `Read-only machine session status` / `control-page` - `verify_ini_panel_launch_api_manifest.mjs` 覆盖 persistence capabilities shape 和深拷贝行为; - `ini_panel_launch_smoke.html` 在真实 launch iframe 中校验 persistence capabilities 数量、 id 清单和 readonly status scope; - `docs/panel-entry.md` 记录 launch manifest 中的 OPFS/session persistence capabilities; - `verify_ini_panel_entry_docs.mjs` 覆盖文档中的 machine files、session snapshots 和 read-only status 能力说明; - 未新增控制按钮; - 未解析 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_launch_api_manifest.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_launch_api_manifest_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。下一批建议为 `persistenceCapabilities` 增加 stable schema helper 或 manifest version 字段(例如 `manifestVersion: 1`),由 focused Node gate、launch browser smoke 和 docs gate 共同校验,便于后续外部 shell 做兼容性判断;仍保持只读,不新增控制按钮,不解析 G-code。 十六、2026-06-15 继续执行记录:INI panel launch manifest version schema 本轮按“第一原则:加快实质性推进”继续推进 SDK/API surface,为 launch API manifest 增加 stable schema helper 和 `manifestVersion: 1`,便于外部 shell 在消费 launch methods、entries、 target pages、control-page API methods 与 persistence capabilities 前进行兼容性判断。 完成内容: - `wasm-port/runtime/ui/ini-panel/ui-shell.js` 新增 `createIniPanelLaunchApiSchema()`; - `createIniPanelLaunchApiManifest()` 新增 `manifestVersion: 1`; - schema 固定描述: - `apiName` - `manifestVersion` - `fields` - `verify_ini_panel_launch_api_manifest.mjs` 覆盖 schema shape、manifest version 和 shell view-model version; - `ini_panel_launch_smoke.html` 在真实 launch iframe 中校验 `manifestVersion`; - `verify_ini_panel_ui_shell.mjs` 覆盖 shell view-model 的 manifest version; - `verify_ini_panel_entry_docs.mjs` 与 `docs/panel-entry.md` 记录并校验 `createIniPanelLaunchApiSchema()` 和 `manifestVersion`; - 未新增控制按钮; - 未解析 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_launch_api_manifest.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_launch_api_manifest_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 ``` 下一步建议: 继续推进 browser/UI workflow。下一批建议把 launch manifest 的 schema/version 信息暴露到 `linuxCncIniPanelLaunchApi` 的独立 `getLaunchApiSchema()` 方法,并由 browser launch smoke 与 focused Node gate 双向校验;仍保持只读,不新增控制按钮,不解析 G-code。 十七、2026-06-15 继续执行记录:INI panel launch API schema exposure 本轮按“第一原则:加快实质性推进”继续推进 browser/UI workflow,把 launch manifest 的 schema/version 信息通过真实 browser launch API 独立暴露,方便外部 shell 在读取完整 manifest 前先做兼容性判断。 完成内容: - `createIniPanelShellViewModel()` 新增 `launchApiSchema`; - `launch.html` 的 `window.linuxCncIniPanelLaunchApi` 新增 `getLaunchApiSchema()`; - `createIniPanelLaunchApiManifest().methods` 新增 `getLaunchApiSchema`; - `ini_panel_launch_smoke.html` 在真实 launch iframe 中校验: - `getLaunchApiSchema()` 存在; - schema `manifestVersion`; - schema fields 包含 `persistenceCapabilities`; - manifest methods 包含 `getLaunchApiSchema`; - `verify_ini_panel_launch_api_manifest.mjs` 覆盖 shell view-model 的 `launchApiSchema`; - `verify_ini_panel_ui_shell.mjs` 覆盖 `launchApiSchema`; - `verify_ini_panel_entry_docs.mjs` 与 `docs/panel-entry.md` 记录并校验 `linuxCncIniPanelLaunchApi.getLaunchApiSchema()`; - 未新增控制按钮; - 未解析 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_launch_api_manifest.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_launch_api_manifest_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。下一批建议为 `createIniPanelLaunchApiSchema()` 增加 focused schema compatibility helper(例如 `isSupportedIniPanelLaunchApiManifest()` 或等价只读 predicate),让外部 shell 可以用 schema/version 判断 manifest 是否可消费,并由 Node/browser gate 校验;仍保持只读, 不新增控制按钮,不解析 G-code。 十八、2026-06-15 继续执行记录:INI panel launch manifest compatibility predicate 本轮按“第一原则:加快实质性推进”继续推进 SDK/API surface,为 launch manifest 增加只读 compatibility predicate,让外部 shell 能用 schema/version 和必需字段判断 manifest 是否可消费。 完成内容: - `wasm-port/runtime/ui/ini-panel/ui-shell.js` 新增 `isSupportedIniPanelLaunchApiManifest()`; - `launch.html` 的 `window.linuxCncIniPanelLaunchApi` 新增 `isSupportedLaunchApiManifest()`; - `createIniPanelLaunchApiManifest().methods` 新增 `isSupportedLaunchApiManifest`; - predicate 固定校验: - manifest 是对象; - `apiName` 匹配 schema; - `manifestVersion` 匹配 schema; - schema fields 全部存在; - `verify_ini_panel_launch_api_manifest.mjs` 覆盖 supported、错误 version、错误 apiName、 缺少字段和 null 输入; - `ini_panel_launch_smoke.html` 在真实 launch iframe 中校验支持当前 manifest,并拒绝错误 `manifestVersion`; - `verify_ini_panel_ui_shell.mjs`、`verify_ini_panel_entry_docs.mjs` 与 `docs/panel-entry.md` 记录并校验 predicate 入口; - 未新增控制按钮; - 未解析 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_launch_api_manifest.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_launch_api_manifest_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 ``` 下一步建议: 继续推进 browser/UI workflow。下一批建议把 control-page browser API 也补齐 schema/version 与 compatibility predicate,使 launch API 和 control-page API 具备一致的外部 shell 接入模型;仍保持 只读,不新增控制按钮,不解析 G-code。 十九、2026-06-15 继续执行记录:INI panel control-page API manifest compatibility predicate 本轮按“第一原则:加快实质性推进”继续推进 browser/UI workflow,把 control-page browser API 补齐 schema/version、manifest 和 compatibility predicate,使 launch API 与 control-page API 具备一致的外部 shell 接入模型。 完成内容: - `wasm-port/runtime/ui/ini-panel/ui-shell.js` 新增: - `createControlPageBrowserApiSchema()`; - `createControlPageBrowserApiManifest()`; - `isSupportedIniPanelControlPageApiManifest()`; - `createControlPageBrowserApiMethods()` 新增: - `isSupportedControlPageApiManifest`; - `getControlPageApiSchema`; - `getControlPageApiManifest`; - `createIniPanelShellViewModel().controlPage` 新增: - `browserApiSchema`; - `browserApiManifest`; - `isSupportedBrowserApiManifest`; - `control-page.js` 的 `window.linuxCncIniPanelControlPageApi` 新增真实 browser 入口: - `isSupportedControlPageApiManifest()`; - `getControlPageApiSchema()`; - `getControlPageApiManifest()`; - `ini_panel_control_page_smoke.html` 在真实 control-page iframe 中校验: - schema `manifestVersion`; - schema fields 包含 `readonlyStatusApiManifest`; - 当前 manifest 被 predicate 接受; - 错误 `apiName` 被 predicate 拒绝; - manifest methods 与 browser API methods 一致; - manifest 暴露 readonly status API manifest; - `verify_ini_panel_shell_control_page_contract.mjs` 覆盖 control-page browser API schema、 manifest、supported、错误 version、错误 apiName、缺少字段和 null 输入; - `verify_ini_panel_ui_shell.mjs`、`verify_ini_panel_entry_docs.mjs` 与 `docs/panel-entry.md` 记录并校验 control-page browser API schema/manifest/predicate; - launch manifest 继续通过同一 `createControlPageBrowserApiMethods()` 获取 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/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_ini_panel_launch_api_manifest.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 ini_panel_launch_api_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 ``` 下一步建议: 继续推进 SDK/API surface。下一批建议把 launch API 和 control-page API 的 manifest 组合成一个 可复用的 shell integration manifest(例如 `createIniPanelShellIntegrationManifest()`),让外部 shell 一次读取入口页、目标页、launch API、control-page API、OPFS/session persistence 能力与 compatibility predicate 状态;仍保持只读,不新增控制按钮,不解析 G-code。