diff --git a/text10.txt b/text10.txt index 81e968f..3da0d46 100644 --- a/text10.txt +++ b/text10.txt @@ -912,3 +912,60 @@ host_wasm_opfs_browser_smokes=ok 显示到 INI panel 日志,例如 `Workflow` 与 `Default G-code`,让用户不用打开 JSON 也能审计 保存/恢复的会话来源;并在 browser smoke 中验证日志包含这些 metadata。仍不解析或改写 任何 CNC 语义。 + +十二、2026-06-14 继续执行记录:INI panel snapshot metadata log summary + +本轮继续沿 OPFS/session/UI boundary 推进,把 saved/restored snapshot metadata 的关键信息 +显示到 INI panel 日志,提升用户可审计性。 + +完成内容: + +- 在 `wasm-port/runtime/ui/ini-panel/app.js` 新增 `sessionMetadataLogLines(metadata)`; +- 保存 snapshot 的日志现在显示: + - `Workflow: save-session-snapshot`; + - `Default G-code: linuxcnc/gcode/ui-session.ngc`; +- 恢复 snapshot 的日志同样显示 Workflow 与 Default G-code; +- `Restore And Load Session` 的组合流程日志也显示同一 metadata 摘要; +- browser INI panel smoke 验证: + - 保存 snapshot 日志包含 metadata 摘要; + - 恢复 snapshot 日志包含 metadata 摘要; + - restore-and-load 日志包含 metadata 摘要; +- 未改变 snapshot envelope、payload 文件清单、metadata JSON 内容、OPFS path model、 + G-code 文本内容、interpreter run API 或 LinuxCNC-owned runtime semantics。 + +验证已通过: + +```bash +git diff --check +SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_ini_panel_browser.sh +wasm-port/tests/opfs/node/verify_file_service.sh +wasm-port/tools/verify_vendor_sync.sh +wasm-port/tools/verify_no_standalone_cnc_semantics.sh +SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh +SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh +SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh +wasm-port/tests/host/verify_host_smokes.sh +``` + +关键输出: + +```text +browser_ini_opfs_smoke=ok +opfs_file_service_node_smoke=ok +vendor sync up to date +standalone CNC semantics guard complete +interp_wasm_node_smoke=ok +sim_configs_wasm_node_inventory_executed=28 +sim_configs_wasm_node_inventory_passed=28 +sim_configs_wasm_node_inventory_skipped=131 +sim_configs_wasm_node_inventory_unexpected_fail=0 +browser_interp_smoke=ok +host_wasm_opfs_browser_smokes=ok +``` + +下一步建议: + +继续沿 OPFS/session/UI boundary 推进。优先把 machine session snapshot 的 metadata 摘要 +也带入 `Run G-code` 成功日志,例如显示 `Snapshot`、`Program source`、`Workflow`, +让用户能从一次运行日志中确认程序来源与会话来源;并在 browser smoke 中验证 snapshot +run 与 default fallback run 的日志差异。仍不解析或改写任何 CNC 语义。 diff --git a/wasm-port/runtime/ui/ini-panel/app.js b/wasm-port/runtime/ui/ini-panel/app.js index 01a392f..1164283 100644 --- a/wasm-port/runtime/ui/ini-panel/app.js +++ b/wasm-port/runtime/ui/ini-panel/app.js @@ -334,6 +334,13 @@ function sessionSnapshotMetadata() { }; } +function sessionMetadataLogLines(metadata = {}) { + return [ + `Workflow: ${metadata.workflow ?? "-"}`, + `Default G-code: ${metadata.defaultGcodeOpfsPath ?? "-"}`, + ]; +} + async function loadSelectedGcodeProgram() { const opfsPath = restoredSessionSnapshot?.payload?.files?.gcode; let filename = UI_SESSION.defaultGcodeFilename; @@ -529,6 +536,7 @@ document.getElementById("save-session-snapshot").addEventListener("click", async [ "Saved machine session snapshot to OPFS.", `Snapshot: ${sessionSnapshotLabel(UI_SESSION)}`, + ...sessionMetadataLogLines(snapshot.metadata), `INI: ${snapshot.payload.files.ini}`, `Parameter file: ${snapshot.payload.files.parameters}`, `Tool table file: ${snapshot.payload.files.toolTable}`, @@ -547,6 +555,7 @@ document.getElementById("restore-session-snapshot").addEventListener("click", as [ "Restored machine session snapshot from OPFS.", `Snapshot: ${sessionSnapshotLabel(snapshot.sessionId)}`, + ...sessionMetadataLogLines(snapshot.metadata), `INI: ${snapshot.payload.files.ini}`, `Parameter file: ${snapshot.payload.files.parameters}`, `Tool table file: ${snapshot.payload.files.toolTable}`, @@ -585,6 +594,7 @@ document.getElementById("restore-load-session").addEventListener("click", async [ "Restored and loaded machine session snapshot.", `Snapshot: ${sessionSnapshotLabel(snapshot.sessionId)}`, + ...sessionMetadataLogLines(snapshot.metadata), `INI: ${loadedSession.ini.opfsPath} -> ${loadedSession.ini.wasmPath}`, `Parameter file: ${loadedSession.parameters.opfsPath} -> ${loadedSession.parameters.wasmPath}`, `Parameters: ${loadedSession.parameters.result.trim()}`, diff --git a/wasm-port/tests/browser/ini_panel_smoke.html b/wasm-port/tests/browser/ini_panel_smoke.html index 2435242..6e89ff5 100644 --- a/wasm-port/tests/browser/ini_panel_smoke.html +++ b/wasm-port/tests/browser/ini_panel_smoke.html @@ -428,6 +428,13 @@ TOOL_TABLE = browser-tool.tbl "linuxcnc/gcode/ui-session.ngc", "UI snapshot G-code OPFS path", ); + const savedSnapshotLog = uiDocument.getElementById("log").textContent; + if ( + !savedSnapshotLog.includes("Workflow: save-session-snapshot") || + !savedSnapshotLog.includes("Default G-code: linuxcnc/gcode/ui-session.ngc") + ) { + throw new Error(`UI saved snapshot log missing metadata summary: ${savedSnapshotLog}`); + } const savedUiSnapshot = await loadMachineSessionSnapshot( "ui-machine-session", "xyzab-tdr", @@ -460,6 +467,13 @@ TOOL_TABLE = browser-tool.tbl "ui-machine-session/ui-machine-session.json", "UI restored session snapshot path", ); + const restoredSnapshotLog = uiDocument.getElementById("log").textContent; + if ( + !restoredSnapshotLog.includes("Workflow: save-session-snapshot") || + !restoredSnapshotLog.includes("Default G-code: linuxcnc/gcode/ui-session.ngc") + ) { + throw new Error(`UI restored snapshot log missing metadata summary: ${restoredSnapshotLog}`); + } if (!uiDocument.getElementById("ini-editor").value.includes("MACHINE = browser-smoke")) { throw new Error("UI restored session snapshot did not reload INI text"); } @@ -489,6 +503,8 @@ TOOL_TABLE = browser-tool.tbl } if ( !uiLog.includes("Snapshot: ui-machine-session/ui-machine-session.json") || + !uiLog.includes("Workflow: save-session-snapshot") || + !uiLog.includes("Default G-code: linuxcnc/gcode/ui-session.ngc") || !uiLog.includes( "Parameter file: linuxcnc/machines/xyzab-tdr/linuxcnc.var -> /work/session-linuxcnc.var", ) ||