diff --git a/text15.txt b/text15.txt index aeeba41..27f7f43 100644 --- a/text15.txt +++ b/text15.txt @@ -354,3 +354,65 @@ project_release_gate=ok - 新增内容只属于 release gate evidence packaging、SDK/API surface、browser/UI artifact validation render rows、docs 和测试 gate; - blocked runtime families 仍不 promotion。 + +五十八、2026-06-16 继续执行记录:OPFS/session persistence 独立 browser workflow gate + +本批继续按“每批必须产出可调用 API、可验证 workflow、可执行 gate、或真实 UI/browser 能力” +推进,选择 `text15.txt` 下一步建议中的 OPFS/session persistence 独立 SDK/browser gate。 + +本批新增实质能力: + +- 新增真实浏览器 workflow 页面:`tests/browser/opfs_session_workflow_smoke.html`; +- 新增独立 browser gate:`tests/browser/verify_opfs_session_workflow_browser.sh`; +- 该 gate 在真实 Chromium + OPFS 中验证: + - 初始 `readMachineSessionReadiness()` blocked/missing 检查; + - `saveMachineTextFiles()` 保存 INI、parameter、tool-table; + - `saveGcodeProgram()` 保存 G-code; + - `saveMachineSessionSnapshot()` 保存 machine session snapshot; + - `loadMachineTextFiles()`、`loadGcodeProgram()`、`loadMachineSessionSnapshot()` 回读; + - `readMachineSessionReadiness()` ready 检查; + - `loadMachineSessionFromOpfs()` 把 OPFS machine session 加载到 WASM; + - `createMachineSessionPersistenceSummary()` 输出 ready persistence summary。 +- 顶层 release gate manifest 新增 `opfs-session-browser` gate; +- `createProjectReleaseGateManifest()`、release readiness artifact fixture、artifact writer/validator + 与 SDK/browser/UI tests 已同步到 11 个 release gates; +- `verify_project_release_gate.sh` 和 `verify_host_smokes.sh` 均纳入独立 OPFS/session browser gate; +- `docs/opfs-session-persistence.md` 与 `docs/project-release-handoff.md` 记录该独立 gate。 + +本批新增/更新可执行验证: + +```bash +SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_opfs_session_workflow_browser.sh +wasm-port/tests/sdk/node/verify_project_release_gate_manifest.sh +wasm-port/tests/sdk/node/verify_sdk_surface.sh +wasm-port/tests/docs/node/verify_opfs_session_docs.sh +wasm-port/tests/docs/node/verify_project_release_handoff_docs.sh +SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_release_artifact_url_workflow_browser.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_project_release_gate.sh +``` + +关键通过输出: + +```text +browser_opfs_session_workflow_smoke=ok +project_release_gate_manifest_node_smoke=ok +sdk_surface_node_smoke=ok +opfs_session_docs_node_smoke=ok +project_release_handoff_docs_node_smoke=ok +browser_release_artifact_url_workflow_smoke=ok +browser_ini_shell_integration_workflow_smoke=ok +ui_node_smokes=ok +project_release_readiness_artifact_node_smoke=ok +project_release_gate=ok +``` + +本批仍保持 LinuxCNC 语义边界: + +- 未修改 vendored LinuxCNC 源码; +- 未在 JS/browser 中实现 G-code、tool、parameter、planner、kinematics、remap 或 canonical motion + 语义; +- 新增内容只验证 host OPFS/session persistence、WASM staging、SDK/browser workflow 和 release gate + evidence; +- blocked runtime families 仍不 promotion。 diff --git a/wasm-port/docs/opfs-session-persistence.md b/wasm-port/docs/opfs-session-persistence.md index fb03058..e6ff1a4 100644 --- a/wasm-port/docs/opfs-session-persistence.md +++ b/wasm-port/docs/opfs-session-persistence.md @@ -92,10 +92,17 @@ The aggregate browser gate is: SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_ini_panel_browser.sh ``` +The dedicated OPFS/session browser workflow gate is: + +```bash +SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_opfs_session_workflow_browser.sh +``` + Required output: ```text browser_ini_opfs_smoke=ok +browser_opfs_session_workflow_smoke=ok browser_ini_control_page_smoke=ok browser_ini_launch_smoke=ok browser_ini_workflow_overview_smoke=ok @@ -105,6 +112,9 @@ browser_ini_shell_integration_workflow_smoke=ok `browser_ini_opfs_smoke=ok` covers real browser OPFS/session persistence, including INI text persistence, session snapshots, machine-file helpers, G-code program helpers, and the INI panel frame workflow. +`browser_opfs_session_workflow_smoke=ok` isolates the save machine files -> +save G-code -> save session snapshot -> readiness -> load session into WASM -> +persistence summary workflow in a standalone browser gate. ## Release gate @@ -121,6 +131,7 @@ wasm-port/tests/ui/node/verify_ui_node_smokes.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 +SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_opfs_session_workflow_browser.sh wasm-port/tests/host/verify_host_smokes.sh ``` @@ -131,6 +142,7 @@ opfs_file_service_node_smoke=ok sdk_surface_node_smoke=ok ui_node_smokes=ok browser_ini_opfs_smoke=ok +browser_opfs_session_workflow_smoke=ok browser_ini_shell_integration_workflow_smoke=ok host_wasm_opfs_browser_smokes=ok ``` diff --git a/wasm-port/docs/project-release-handoff.md b/wasm-port/docs/project-release-handoff.md index 88a3cc6..110d878 100644 --- a/wasm-port/docs/project-release-handoff.md +++ b/wasm-port/docs/project-release-handoff.md @@ -94,6 +94,10 @@ continuation records are in `../text15.txt`. API surface inventory row, and launch/workflow-overview APIs expose the same helper for external shells. The summary also has display and render-state helpers for caller-owned DOM. +- OPFS/session persistence also has a dedicated browser workflow gate, + `verify_opfs_session_workflow_browser.sh`, covering save machine files, save + G-code, save session snapshot, session readiness, load into WASM, and + persistence summary output. - OPFS/session persistence is host-side storage glue. Parameter and tool-table behavior still comes from the LinuxCNC-backed interpreter SDK calls. - Sim-config inventory promotion remains evidence-driven and must keep @@ -117,6 +121,7 @@ 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 +SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_opfs_session_workflow_browser.sh SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_release_artifact_url_workflow_browser.sh wasm-port/tests/ui/node/verify_ui_node_smokes.sh wasm-port/tests/sdk/node/verify_project_release_artifact_url_workflow.sh @@ -169,6 +174,7 @@ browser_ini_control_page_smoke=ok browser_ini_launch_smoke=ok browser_ini_workflow_overview_smoke=ok browser_ini_shell_integration_workflow_smoke=ok +browser_opfs_session_workflow_smoke=ok browser_release_artifact_url_workflow_smoke=ok ``` diff --git a/wasm-port/runtime/sdk/src/project-release-readiness.js b/wasm-port/runtime/sdk/src/project-release-readiness.js index 8716165..7f02486 100644 --- a/wasm-port/runtime/sdk/src/project-release-readiness.js +++ b/wasm-port/runtime/sdk/src/project-release-readiness.js @@ -34,6 +34,12 @@ const REQUIRED_RELEASE_GATES = [ command: "SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_ini_panel_browser.sh", expectedOutput: "browser_ini_shell_integration_workflow_smoke=ok", }, + { + id: "opfs-session-browser", + label: "OPFS session browser workflow smoke", + command: "SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_opfs_session_workflow_browser.sh", + expectedOutput: "browser_opfs_session_workflow_smoke=ok", + }, { id: "release-artifact-url-browser", label: "Release artifact URL browser workflow smoke", diff --git a/wasm-port/tests/browser/ini_panel_workflow_overview_smoke.html b/wasm-port/tests/browser/ini_panel_workflow_overview_smoke.html index 4d5107d..eeae078 100644 --- a/wasm-port/tests/browser/ini_panel_workflow_overview_smoke.html +++ b/wasm-port/tests/browser/ini_panel_workflow_overview_smoke.html @@ -138,7 +138,7 @@ "workflow overview release artifact validation API name", ); assertEqual(releaseArtifactValidation.ready, true, "workflow overview release artifact validation readiness"); - assertEqual(releaseArtifactValidation.gateCount, 10, "workflow overview release artifact validation gates"); + assertEqual(releaseArtifactValidation.gateCount, 11, "workflow overview release artifact validation gates"); assertEqual( releaseArtifactValidationSummary.statusLine, "Ready: Artifact evidence complete", diff --git a/wasm-port/tests/browser/opfs_session_workflow_smoke.html b/wasm-port/tests/browser/opfs_session_workflow_smoke.html new file mode 100644 index 0000000..58702a8 --- /dev/null +++ b/wasm-port/tests/browser/opfs_session_workflow_smoke.html @@ -0,0 +1,203 @@ + + + + + LinuxCNC OPFS Session Workflow Smoke + + +
running
+ + + diff --git a/wasm-port/tests/browser/release_artifact_url_workflow_smoke.html b/wasm-port/tests/browser/release_artifact_url_workflow_smoke.html index 46ef190..9b8af12 100644 --- a/wasm-port/tests/browser/release_artifact_url_workflow_smoke.html +++ b/wasm-port/tests/browser/release_artifact_url_workflow_smoke.html @@ -68,7 +68,7 @@ ); assertEqual(readyWorkflow.ready, true, "ready workflow readiness"); assertEqual(readyWorkflow.httpStatus, 200, "ready workflow HTTP status"); - assertEqual(readyWorkflow.validation.gateCount, 10, "ready workflow gate count"); + assertEqual(readyWorkflow.validation.gateCount, 11, "ready workflow gate count"); assertEqual( readyWorkflow.validationSummaryViewModel.statusLine, "Ready: Artifact evidence complete", diff --git a/wasm-port/tests/browser/verify_opfs_session_workflow_browser.sh b/wasm-port/tests/browser/verify_opfs_session_workflow_browser.sh new file mode 100755 index 0000000..b7d74d6 --- /dev/null +++ b/wasm-port/tests/browser/verify_opfs_session_workflow_browser.sh @@ -0,0 +1,81 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "$0")/../.." && pwd)" +CHROMIUM="${CHROMIUM:-$(command -v chromium || command -v chromium-browser || command -v google-chrome || command -v google-chrome-stable || true)}" + +if [[ -z "$CHROMIUM" ]]; then + echo "missing Chromium-compatible browser; set CHROMIUM=/path/to/browser" >&2 + exit 1 +fi + +if [[ "${SKIP_INI_BUILD:-0}" != "1" ]]; then + "$ROOT_DIR/tools/build_ini_panel.sh" +fi +if [[ "${SKIP_INTERP_BUILD:-0}" != "1" ]]; then + "$ROOT_DIR/tools/build_wasm_core.sh" +fi + +TMP_DIR="$(mktemp -d)" +PORT_FILE="$TMP_DIR/port" +SERVER_LOG="$TMP_DIR/server.log" +CHROME_PROFILE="$TMP_DIR/chrome-profile" +mkdir -p "$CHROME_PROFILE" + +cleanup() { + if [[ -n "${SERVER_PID:-}" ]]; then + kill "$SERVER_PID" 2>/dev/null || true + wait "$SERVER_PID" 2>/dev/null || true + fi + rm -rf "$TMP_DIR" +} +trap cleanup EXIT + +python3 - <<'PY' "$ROOT_DIR" "$PORT_FILE" >"$SERVER_LOG" 2>&1 & +import functools +import http.server +import pathlib +import socketserver +import sys + +root = pathlib.Path(sys.argv[1]) +port_file = pathlib.Path(sys.argv[2]) + +handler = functools.partial(http.server.SimpleHTTPRequestHandler, directory=str(root)) +with socketserver.TCPServer(("127.0.0.1", 0), handler) as httpd: + port_file.write_text(str(httpd.server_address[1]), encoding="ascii") + httpd.serve_forever() +PY +SERVER_PID=$! + +for _ in $(seq 1 100); do + [[ -s "$PORT_FILE" ]] && break + sleep 0.05 +done + +if [[ ! -s "$PORT_FILE" ]]; then + echo "OPFS/session workflow browser smoke HTTP server did not start" >&2 + cat "$SERVER_LOG" >&2 || true + exit 1 +fi + +PORT="$(cat "$PORT_FILE")" +URL="http://127.0.0.1:$PORT/tests/browser/opfs_session_workflow_smoke.html" +OUT="$TMP_DIR/chromium.out" + +"$CHROMIUM" \ + --headless=new \ + --disable-gpu \ + --no-sandbox \ + --user-data-dir="$CHROME_PROFILE" \ + --virtual-time-budget=10000 \ + --dump-dom \ + "$URL" >"$OUT" 2>&1 + +if ! grep -Fq "browser_opfs_session_workflow_smoke=ok" "$OUT"; then + echo "OPFS/session workflow browser smoke failed" >&2 + sed -n '1,220p' "$OUT" >&2 + exit 1 +fi + +echo "browser_opfs_session_workflow_smoke=ok" diff --git a/wasm-port/tests/docs/node/verify_opfs_session_docs.mjs b/wasm-port/tests/docs/node/verify_opfs_session_docs.mjs index e8904d7..5a004cf 100644 --- a/wasm-port/tests/docs/node/verify_opfs_session_docs.mjs +++ b/wasm-port/tests/docs/node/verify_opfs_session_docs.mjs @@ -22,6 +22,8 @@ for (const phrase of [ "restoreMachineParametersFromOpfs", "loadMachineToolTableFromOpfs", "browser_ini_opfs_smoke=ok", + "browser_opfs_session_workflow_smoke=ok", + "verify_opfs_session_workflow_browser.sh", "sdk_surface_node_smoke=ok", "host_wasm_opfs_browser_smokes=ok", "verify_no_standalone_cnc_semantics.sh", @@ -37,6 +39,7 @@ assert.match(sdkReadmeText, /OPFS\/session persistence exports/); assert.match(sdkReadmeText, /readMachineSessionReadiness/); assert.match(hostSmokeText, /verify_sdk_surface\.sh/); assert.match(hostSmokeText, /verify_file_service\.sh/); +assert.match(hostSmokeText, /verify_opfs_session_workflow_browser\.sh/); assert.match(browserSmokeText, /browser_ini_opfs_smoke=ok/); assert.match(trackerText, /OPFS\/session persistence/); diff --git a/wasm-port/tests/docs/node/verify_project_release_handoff_docs.mjs b/wasm-port/tests/docs/node/verify_project_release_handoff_docs.mjs index a11742b..1c09506 100644 --- a/wasm-port/tests/docs/node/verify_project_release_handoff_docs.mjs +++ b/wasm-port/tests/docs/node/verify_project_release_handoff_docs.mjs @@ -60,12 +60,14 @@ for (const phrase of [ "build/project-release-readiness.json", "verify_project_release_readiness_artifact.sh", "verify_project_release_artifact_url_workflow.sh", + "verify_opfs_session_workflow_browser.sh", "host_wasm_opfs_browser_smokes=ok", "project_release_readiness_artifact_node_smoke=ok", "project_release_artifact_url_workflow_node_smoke=ok", "project_release_gate=ok", "sim_configs_wasm_node_inventory_unexpected_fail=0", "browser_ini_shell_integration_workflow_smoke=ok", + "browser_opfs_session_workflow_smoke=ok", "browser_release_artifact_url_workflow_smoke=ok", "project_release_handoff_docs_node_smoke=ok", "L4-USER-M-PROCESS", @@ -90,6 +92,7 @@ for (const phrase of [ "verify_interp_wasm.sh", "verify_sim_configs_inventory_wasm.sh", "verify_ini_panel_browser.sh", + "verify_opfs_session_workflow_browser.sh", "verify_release_artifact_url_workflow_browser.sh", "verify_ui_node_smokes.sh", "verify_host_smokes.sh", diff --git a/wasm-port/tests/fixtures/project-release-readiness-ready.json b/wasm-port/tests/fixtures/project-release-readiness-ready.json index 56d1c28..d501b35 100644 --- a/wasm-port/tests/fixtures/project-release-readiness-ready.json +++ b/wasm-port/tests/fixtures/project-release-readiness-ready.json @@ -25,7 +25,7 @@ "gateManifest": { "apiName": "project-release-gate-manifest", "manifestVersion": 1, - "gateCount": 10, + "gateCount": 11, "gateIds": [ "diff-check", "vendor-sync", @@ -33,6 +33,7 @@ "interp-wasm", "sim-config-inventory", "ini-panel-browser", + "opfs-session-browser", "release-artifact-url-browser", "ui-node-smokes", "host-smokes", @@ -75,6 +76,12 @@ "command": "SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_ini_panel_browser.sh", "expectedOutput": "browser_ini_shell_integration_workflow_smoke=ok" }, + { + "id": "opfs-session-browser", + "label": "OPFS session browser workflow smoke", + "command": "SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_opfs_session_workflow_browser.sh", + "expectedOutput": "browser_opfs_session_workflow_smoke=ok" + }, { "id": "release-artifact-url-browser", "label": "Release artifact URL browser workflow smoke", @@ -106,14 +113,14 @@ "manifestVersion": 1, "phase": "ready", "ready": true, - "gateCount": 10, - "passedCount": 10, + "gateCount": 11, + "passedCount": 11, "unknownCount": 0, "missingGateIds": [], "manifest": { "apiName": "project-release-gate-manifest", "manifestVersion": 1, - "gateCount": 10, + "gateCount": 11, "gateIds": [ "diff-check", "vendor-sync", @@ -121,6 +128,7 @@ "interp-wasm", "sim-config-inventory", "ini-panel-browser", + "opfs-session-browser", "release-artifact-url-browser", "ui-node-smokes", "host-smokes", @@ -163,6 +171,12 @@ "command": "SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_ini_panel_browser.sh", "expectedOutput": "browser_ini_shell_integration_workflow_smoke=ok" }, + { + "id": "opfs-session-browser", + "label": "OPFS session browser workflow smoke", + "command": "SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_opfs_session_workflow_browser.sh", + "expectedOutput": "browser_opfs_session_workflow_smoke=ok" + }, { "id": "release-artifact-url-browser", "label": "Release artifact URL browser workflow smoke", @@ -196,7 +210,7 @@ "command": "git diff --check", "expectedOutput": null, "observedOutput": null, - "observedOutputCount": 9, + "observedOutputCount": 10, "status": "passed", "passed": true, "evidence": "explicit-result" @@ -207,7 +221,7 @@ "command": "wasm-port/tools/verify_vendor_sync.sh", "expectedOutput": "vendor sync up to date", "observedOutput": "vendor sync up to date", - "observedOutputCount": 9, + "observedOutputCount": 10, "status": "passed", "passed": true, "evidence": "expected-output" @@ -218,7 +232,7 @@ "command": "wasm-port/tools/verify_no_standalone_cnc_semantics.sh", "expectedOutput": "standalone CNC semantics guard complete", "observedOutput": "standalone CNC semantics guard complete", - "observedOutputCount": 9, + "observedOutputCount": 10, "status": "passed", "passed": true, "evidence": "expected-output" @@ -229,7 +243,7 @@ "command": "SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh", "expectedOutput": "interp_wasm_node_smoke=ok", "observedOutput": "interp_wasm_node_smoke=ok", - "observedOutputCount": 9, + "observedOutputCount": 10, "status": "passed", "passed": true, "evidence": "expected-output" @@ -240,7 +254,7 @@ "command": "SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh", "expectedOutput": "sim_configs_wasm_node_inventory_unexpected_fail=0", "observedOutput": "sim_configs_wasm_node_inventory_unexpected_fail=0", - "observedOutputCount": 9, + "observedOutputCount": 10, "status": "passed", "passed": true, "evidence": "expected-output" @@ -251,7 +265,18 @@ "command": "SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_ini_panel_browser.sh", "expectedOutput": "browser_ini_shell_integration_workflow_smoke=ok", "observedOutput": "browser_ini_shell_integration_workflow_smoke=ok", - "observedOutputCount": 9, + "observedOutputCount": 10, + "status": "passed", + "passed": true, + "evidence": "expected-output" + }, + { + "id": "opfs-session-browser", + "label": "OPFS session browser workflow smoke", + "command": "SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_opfs_session_workflow_browser.sh", + "expectedOutput": "browser_opfs_session_workflow_smoke=ok", + "observedOutput": "browser_opfs_session_workflow_smoke=ok", + "observedOutputCount": 10, "status": "passed", "passed": true, "evidence": "expected-output" @@ -262,7 +287,7 @@ "command": "SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_release_artifact_url_workflow_browser.sh", "expectedOutput": "browser_release_artifact_url_workflow_smoke=ok", "observedOutput": "browser_release_artifact_url_workflow_smoke=ok", - "observedOutputCount": 9, + "observedOutputCount": 10, "status": "passed", "passed": true, "evidence": "expected-output" @@ -273,7 +298,7 @@ "command": "wasm-port/tests/ui/node/verify_ui_node_smokes.sh", "expectedOutput": "ui_node_smokes=ok", "observedOutput": "ui_node_smokes=ok", - "observedOutputCount": 9, + "observedOutputCount": 10, "status": "passed", "passed": true, "evidence": "expected-output" @@ -284,7 +309,7 @@ "command": "wasm-port/tests/host/verify_host_smokes.sh", "expectedOutput": "host_wasm_opfs_browser_smokes=ok", "observedOutput": "host_wasm_opfs_browser_smokes=ok", - "observedOutputCount": 9, + "observedOutputCount": 10, "status": "passed", "passed": true, "evidence": "expected-output" @@ -295,7 +320,7 @@ "command": "wasm-port/tests/host/verify_project_release_gate.sh", "expectedOutput": "project_release_gate=ok", "observedOutput": "project_release_gate=ok", - "observedOutputCount": 9, + "observedOutputCount": 10, "status": "passed", "passed": true, "evidence": "expected-output" @@ -307,14 +332,14 @@ "matrixVersion": 1, "phase": "ready", "ready": true, - "gateCount": 10, - "passedCount": 10, + "gateCount": 11, + "passedCount": 11, "unknownCount": 0, "missingGateIds": [], "manifest": { "apiName": "project-release-gate-manifest", "manifestVersion": 1, - "gateCount": 10, + "gateCount": 11, "gateIds": [ "diff-check", "vendor-sync", @@ -322,6 +347,7 @@ "interp-wasm", "sim-config-inventory", "ini-panel-browser", + "opfs-session-browser", "release-artifact-url-browser", "ui-node-smokes", "host-smokes", @@ -364,6 +390,12 @@ "command": "SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_ini_panel_browser.sh", "expectedOutput": "browser_ini_shell_integration_workflow_smoke=ok" }, + { + "id": "opfs-session-browser", + "label": "OPFS session browser workflow smoke", + "command": "SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_opfs_session_workflow_browser.sh", + "expectedOutput": "browser_opfs_session_workflow_smoke=ok" + }, { "id": "release-artifact-url-browser", "label": "Release artifact URL browser workflow smoke", @@ -439,6 +471,14 @@ "status": "passed", "passed": true }, + { + "id": "opfs-session-browser", + "label": "OPFS session browser workflow smoke", + "command": "SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_opfs_session_workflow_browser.sh", + "expectedOutput": "browser_opfs_session_workflow_smoke=ok", + "status": "passed", + "passed": true + }, { "id": "release-artifact-url-browser", "label": "Release artifact URL browser workflow smoke", @@ -478,8 +518,8 @@ "planVersion": 1, "phase": "ready", "ready": true, - "gateCount": 10, - "completedCount": 10, + "gateCount": 11, + "completedCount": 11, "pendingCount": 0, "completedGateIds": [ "diff-check", @@ -488,6 +528,7 @@ "interp-wasm", "sim-config-inventory", "ini-panel-browser", + "opfs-session-browser", "release-artifact-url-browser", "ui-node-smokes", "host-smokes", @@ -549,6 +590,14 @@ "status": "passed", "passed": true }, + { + "id": "opfs-session-browser", + "label": "OPFS session browser workflow smoke", + "command": "SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_opfs_session_workflow_browser.sh", + "expectedOutput": "browser_opfs_session_workflow_smoke=ok", + "status": "passed", + "passed": true + }, { "id": "release-artifact-url-browser", "label": "Release artifact URL browser workflow smoke", diff --git a/wasm-port/tests/host/verify_host_smokes.sh b/wasm-port/tests/host/verify_host_smokes.sh index ff04fae..238576b 100755 --- a/wasm-port/tests/host/verify_host_smokes.sh +++ b/wasm-port/tests/host/verify_host_smokes.sh @@ -20,6 +20,7 @@ SKIP_TP_BUILD=1 "$ROOT_DIR/tests/wasm/node/verify_tp_wasm.sh" "$ROOT_DIR/tests/docs/node/verify_project_release_handoff_docs.sh" "$ROOT_DIR/tests/ui/node/verify_ui_node_smokes.sh" SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 "$ROOT_DIR/tests/browser/verify_ini_panel_browser.sh" +SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 "$ROOT_DIR/tests/browser/verify_opfs_session_workflow_browser.sh" SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 "$ROOT_DIR/tests/browser/verify_interp_browser.sh" echo "host_wasm_opfs_browser_smokes=ok" diff --git a/wasm-port/tests/host/verify_project_release_gate.sh b/wasm-port/tests/host/verify_project_release_gate.sh index 602c82d..fbaf480 100755 --- a/wasm-port/tests/host/verify_project_release_gate.sh +++ b/wasm-port/tests/host/verify_project_release_gate.sh @@ -12,6 +12,7 @@ git diff --check SKIP_INTERP_BUILD=1 "$ROOT_DIR/tests/wasm/node/verify_interp_wasm.sh" SKIP_INTERP_BUILD=1 "$ROOT_DIR/tests/wasm/node/verify_sim_configs_inventory_wasm.sh" SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 "$ROOT_DIR/tests/browser/verify_ini_panel_browser.sh" +SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 "$ROOT_DIR/tests/browser/verify_opfs_session_workflow_browser.sh" SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 "$ROOT_DIR/tests/browser/verify_release_artifact_url_workflow_browser.sh" "$ROOT_DIR/tests/ui/node/verify_ui_node_smokes.sh" "$ROOT_DIR/tests/sdk/node/verify_project_release_artifact_url_workflow.sh" diff --git a/wasm-port/tests/host/verify_project_release_readiness_artifact.mjs b/wasm-port/tests/host/verify_project_release_readiness_artifact.mjs index 5370345..66fb19f 100644 --- a/wasm-port/tests/host/verify_project_release_readiness_artifact.mjs +++ b/wasm-port/tests/host/verify_project_release_readiness_artifact.mjs @@ -20,8 +20,8 @@ assert.equal(validation.phase, "ready"); assert.deepEqual(validation.missing, []); assert.equal(validation.artifactApiName, "project-release-readiness-report"); assert.equal(validation.artifactVersion, 1); -assert.equal(validation.gateCount, 10); -assert.equal(validation.expectedGateCount, 10); +assert.equal(validation.gateCount, 11); +assert.equal(validation.expectedGateCount, 11); assert.equal(validation.gateManifestReady, true); assert.equal(validation.gateExecutionManifestReady, true); assert.equal(validation.gateResultMatrixReady, true); @@ -33,6 +33,7 @@ assert.deepEqual(validation.expectedGateIds, [ "interp-wasm", "sim-config-inventory", "ini-panel-browser", + "opfs-session-browser", "release-artifact-url-browser", "ui-node-smokes", "host-smokes", @@ -40,7 +41,7 @@ assert.deepEqual(validation.expectedGateIds, [ ]); assert.equal(artifact.gateManifest.apiName, "project-release-gate-manifest"); assert.equal(artifact.gateExecutionManifest.apiName, "project-release-gate-execution-manifest"); -assert.equal(artifact.gateExecutionManifest.passedCount, 10); +assert.equal(artifact.gateExecutionManifest.passedCount, 11); assert.equal(artifact.gateResultMatrix.apiName, "project-release-gate-result-matrix"); assert.equal(artifact.gateActionPlan.apiName, "project-release-gate-action-plan"); assert.equal(artifact.gateActionPlan.pendingCount, 0); diff --git a/wasm-port/tests/host/write_project_release_readiness_artifact.mjs b/wasm-port/tests/host/write_project_release_readiness_artifact.mjs index 4dc791f..4c0d546 100644 --- a/wasm-port/tests/host/write_project_release_readiness_artifact.mjs +++ b/wasm-port/tests/host/write_project_release_readiness_artifact.mjs @@ -15,6 +15,7 @@ const passedGateResults = { "interp-wasm": true, "sim-config-inventory": true, "ini-panel-browser": true, + "opfs-session-browser": true, "release-artifact-url-browser": true, "ui-node-smokes": true, "host-smokes": true, @@ -29,6 +30,7 @@ const report = createProjectReleaseReadinessReport({ "interp_wasm_node_smoke=ok", "sim_configs_wasm_node_inventory_unexpected_fail=0", "browser_ini_shell_integration_workflow_smoke=ok", + "browser_opfs_session_workflow_smoke=ok", "browser_release_artifact_url_workflow_smoke=ok", "ui_node_smokes=ok", "host_wasm_opfs_browser_smokes=ok", diff --git a/wasm-port/tests/sdk/node/verify_project_release_gate_manifest.mjs b/wasm-port/tests/sdk/node/verify_project_release_gate_manifest.mjs index 251bab6..fe45102 100644 --- a/wasm-port/tests/sdk/node/verify_project_release_gate_manifest.mjs +++ b/wasm-port/tests/sdk/node/verify_project_release_gate_manifest.mjs @@ -19,7 +19,7 @@ const manifest = createProjectReleaseGateManifest(); assert.equal(manifest.apiName, "project-release-gate-manifest"); assert.equal(manifest.manifestVersion, 1); -assert.equal(manifest.gateCount, 10); +assert.equal(manifest.gateCount, 11); assert.deepEqual(manifest.gateIds, [ "diff-check", "vendor-sync", @@ -27,6 +27,7 @@ assert.deepEqual(manifest.gateIds, [ "interp-wasm", "sim-config-inventory", "ini-panel-browser", + "opfs-session-browser", "release-artifact-url-browser", "ui-node-smokes", "host-smokes", @@ -41,6 +42,7 @@ assert.deepEqual( "interp_wasm_node_smoke=ok", "sim_configs_wasm_node_inventory_unexpected_fail=0", "browser_ini_shell_integration_workflow_smoke=ok", + "browser_opfs_session_workflow_smoke=ok", "browser_release_artifact_url_workflow_smoke=ok", "ui_node_smokes=ok", "host_wasm_opfs_browser_smokes=ok", @@ -51,6 +53,10 @@ assert.equal( manifest.gates.find(({ id }) => id === "release-artifact-url-browser")?.command, "SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_release_artifact_url_workflow_browser.sh", ); +assert.equal( + manifest.gates.find(({ id }) => id === "opfs-session-browser")?.command, + "SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_opfs_session_workflow_browser.sh", +); const partialMatrix = createProjectReleaseGateResultMatrix({ gateResults: { @@ -65,14 +71,15 @@ assert.equal(partialMatrix.apiName, "project-release-gate-result-matrix"); assert.equal(partialMatrix.matrixVersion, 1); assert.equal(partialMatrix.phase, "waiting"); assert.equal(partialMatrix.ready, false); -assert.equal(partialMatrix.gateCount, 10); +assert.equal(partialMatrix.gateCount, 11); assert.equal(partialMatrix.passedCount, 3); -assert.equal(partialMatrix.unknownCount, 7); +assert.equal(partialMatrix.unknownCount, 8); assert.deepEqual(partialMatrix.missingGateIds, [ "standalone-cnc-semantics", "interp-wasm", "sim-config-inventory", "ini-panel-browser", + "opfs-session-browser", "ui-node-smokes", "host-smokes", "project-release-gate", @@ -99,9 +106,9 @@ assert.equal(partialExecutionManifest.apiName, "project-release-gate-execution-m assert.equal(partialExecutionManifest.manifestVersion, 1); assert.equal(partialExecutionManifest.phase, "waiting"); assert.equal(partialExecutionManifest.ready, false); -assert.equal(partialExecutionManifest.gateCount, 10); +assert.equal(partialExecutionManifest.gateCount, 11); assert.equal(partialExecutionManifest.passedCount, 3); -assert.equal(partialExecutionManifest.unknownCount, 7); +assert.equal(partialExecutionManifest.unknownCount, 8); assert.deepEqual(partialExecutionManifest.missingGateIds, partialMatrix.missingGateIds); assert.deepEqual( partialExecutionManifest.rows.filter(({ passed }) => passed).map(({ id, evidence }) => [id, evidence]), @@ -125,9 +132,9 @@ assert.equal(partialActionPlan.apiName, "project-release-gate-action-plan"); assert.equal(partialActionPlan.planVersion, 1); assert.equal(partialActionPlan.phase, "waiting"); assert.equal(partialActionPlan.ready, false); -assert.equal(partialActionPlan.gateCount, 10); +assert.equal(partialActionPlan.gateCount, 11); assert.equal(partialActionPlan.completedCount, 3); -assert.equal(partialActionPlan.pendingCount, 7); +assert.equal(partialActionPlan.pendingCount, 8); assert.deepEqual(partialActionPlan.completedGateIds, [ "diff-check", "vendor-sync", @@ -138,13 +145,14 @@ assert.deepEqual(partialActionPlan.pendingGateIds, [ "interp-wasm", "sim-config-inventory", "ini-panel-browser", + "opfs-session-browser", "ui-node-smokes", "host-smokes", "project-release-gate", ]); assert.equal(partialActionPlan.nextGateId, "standalone-cnc-semantics"); assert.equal(partialActionPlan.nextCommand, "wasm-port/tools/verify_no_standalone_cnc_semantics.sh"); -assert.equal(partialActionPlan.commands.length, 7); +assert.equal(partialActionPlan.commands.length, 8); assert.equal(partialActionPlan.commands[0].step, 1); assert.equal(partialActionPlan.commands[0].gateId, "standalone-cnc-semantics"); assert.equal(partialActionPlan.rows[0].id, "standalone-cnc-semantics"); @@ -179,7 +187,7 @@ assert.deepEqual(createProjectReleaseReadinessSummaryViewModel(report), { { id: "gate-results", label: "Release gates", - value: "10/10 passed", + value: "11/11 passed", }, { id: "unknown-gates", @@ -245,7 +253,7 @@ assert.deepEqual( artifactValidationSummary.rows.map(({ id, value }) => [id, value]), [ ["artifact", "project-release-readiness-report"], - ["gate-count", "10/10"], + ["gate-count", "11/11"], ["gate-manifest", "ready"], ["gate-execution-manifest", "ready"], ["gate-result-matrix", "ready"], diff --git a/wasm-port/tests/sdk/node/verify_sdk_surface.mjs b/wasm-port/tests/sdk/node/verify_sdk_surface.mjs index 112b6ee..07bb2c5 100644 --- a/wasm-port/tests/sdk/node/verify_sdk_surface.mjs +++ b/wasm-port/tests/sdk/node/verify_sdk_surface.mjs @@ -250,7 +250,7 @@ assert.deepEqual(releaseReadinessWaiting.missing, ["project-release-gate"]); assert.equal(releaseReadinessWaiting.simConfigInventory.unexpectedFail, 0); assert.deepEqual(releaseReadinessWaiting.promotedBlockedFamilies, []); assert.equal(releaseReadinessWaiting.gateActionPlan.apiName, "project-release-gate-action-plan"); -assert.equal(releaseReadinessWaiting.gateActionPlan.pendingCount, 10); +assert.equal(releaseReadinessWaiting.gateActionPlan.pendingCount, createProjectReleaseGateManifest().gateCount); assert.equal(releaseReadinessWaiting.gateActionPlan.nextGateId, "diff-check"); assert.equal( releaseReadinessWaiting.rows.find(({ id }) => id === "blocked-runtime-families")?.value, @@ -262,7 +262,7 @@ const releaseReadinessReady = createProjectReleaseReadinessReport({ assert.equal(releaseReadinessReady.ready, true); assert.equal(releaseReadinessReady.releaseGate.passed, true); assert.deepEqual(releaseReadinessReady.gateManifest, createProjectReleaseGateManifest()); -assert.equal(releaseReadinessReady.gateResultMatrix.rows.length, 10); +assert.equal(releaseReadinessReady.gateResultMatrix.rows.length, createProjectReleaseGateManifest().gateCount); assert.equal(createProjectReleaseGateActionPlan({ gateResultMatrix: releaseReadinessReady.gateResultMatrix, }).ready, false); @@ -277,18 +277,7 @@ assert.equal( true, ); const releaseReadinessArtifact = parseProjectReleaseReadinessArtifactJson(JSON.stringify(createProjectReleaseReadinessReport({ - gateResults: { - "diff-check": true, - "vendor-sync": true, - "standalone-cnc-semantics": true, - "interp-wasm": true, - "sim-config-inventory": true, - "ini-panel-browser": true, - "release-artifact-url-browser": true, - "ui-node-smokes": true, - "host-smokes": true, - "project-release-gate": true, - }, + gateResults: Object.fromEntries(createProjectReleaseGateManifest().gateIds.map((id) => [id, true])), }))); assert.equal(releaseReadinessArtifact.apiName, "project-release-readiness-report"); const releaseReadinessArtifactValidation = createProjectReleaseReadinessArtifactValidation(releaseReadinessArtifact); @@ -300,8 +289,8 @@ assert.deepEqual(releaseReadinessArtifactValidation, { missing: [], artifactApiName: "project-release-readiness-report", artifactVersion: 1, - gateCount: 10, - expectedGateCount: 10, + gateCount: createProjectReleaseGateManifest().gateCount, + expectedGateCount: createProjectReleaseGateManifest().gateCount, expectedGateIds: createProjectReleaseGateManifest().gateIds, gateManifestReady: true, gateExecutionManifestReady: true, diff --git a/wasm-port/tests/ui/node/verify_ini_panel_ui_shell.mjs b/wasm-port/tests/ui/node/verify_ini_panel_ui_shell.mjs index d5bc4ad..832c23a 100644 --- a/wasm-port/tests/ui/node/verify_ini_panel_ui_shell.mjs +++ b/wasm-port/tests/ui/node/verify_ini_panel_ui_shell.mjs @@ -1306,7 +1306,7 @@ assert.equal( ); assert.equal(releaseArtifactValidation.ready, true); assert.equal(releaseArtifactValidation.validation.ready, true); -assert.equal(releaseArtifactValidation.gateCount, 10); +assert.equal(releaseArtifactValidation.gateCount, 11); const releaseArtifactValidationSummary = createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel( releaseArtifactValidation,