From 23f337834b70cd5de5e7c58332a1a4619d781666 Mon Sep 17 00:00:00 2001 From: wangdequan Date: Tue, 16 Jun 2026 09:46:29 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9A=B4=E9=9C=B2=20workflow=20overview=20?= =?UTF-8?q?=E5=8F=91=E5=B8=83=20artifact=20=E6=A0=A1=E9=AA=8C=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PROJECT_COMPLETION_TRACKER.md | 4 +- text14.txt | 78 +++++++++++++++++++ wasm-port/docs/panel-entry.md | 7 ++ wasm-port/docs/project-release-handoff.md | 3 + wasm-port/runtime/sdk/README.md | 4 + wasm-port/runtime/sdk/src/index.js | 1 + wasm-port/runtime/ui/ini-panel/ui-shell.js | 49 ++++++++++++ .../ui/ini-panel/workflow-overview.html | 4 + ...anel_shell_integration_workflow_smoke.html | 43 ++++++++++ .../ini_panel_workflow_overview_smoke.html | 40 ++++++++++ .../verify_project_release_handoff_docs.mjs | 1 + .../tests/sdk/node/verify_sdk_surface.mjs | 9 +++ .../ui/node/verify_ini_panel_entry_docs.mjs | 2 + ...y_ini_panel_shell_integration_manifest.mjs | 8 ++ .../ui/node/verify_ini_panel_ui_shell.mjs | 49 ++++++++++++ 15 files changed, 300 insertions(+), 2 deletions(-) diff --git a/PROJECT_COMPLETION_TRACKER.md b/PROJECT_COMPLETION_TRACKER.md index 8b8913e..49937a6 100644 --- a/PROJECT_COMPLETION_TRACKER.md +++ b/PROJECT_COMPLETION_TRACKER.md @@ -9,7 +9,7 @@ turn-by-turn continuation notes and next-batch execution records. ## Current Status - Active continuation file: `text14.txt` -- Latest completed batch: project release readiness artifact validation workflow +- Latest completed batch: workflow overview release readiness artifact browser API - Latest relevant commit: use `git log -1 --oneline` after each committed batch - Working tree at tracker creation: clean - Required policy: LinuxCNC remains the only CNC semantic source @@ -44,7 +44,7 @@ The project is complete for the current scope when all of the following are true | Native sim configs baseline | Stable | Last recorded Layer 2: `total 159`, `pass 151`, `expected_fail 8`, `unexpected_fail 0`. | | OPFS/session persistence | Stable for current scope | Browser smoke passes, SDK re-exports OPFS/session helpers including `readMachineSessionReadiness()` and `createMachineSessionPersistenceSummary()`, the UI exposes `getMachineSessionPersistenceSummary()`, and `docs/opfs-session-persistence.md` defines the project-level release gate. | | SDK/API surface | Stable for current scope | SDK re-exports core, OPFS/session readiness/load helpers, sim-config staging, project release readiness report/artifact validation, INI panel entry/launcher/control-page/shell/workflow overview helpers, the session readiness workflow report, and the shell API surface inventory with a Node surface smoke. | -| Browser/UI workflow | Stable for current scope | Workflow overview embedding mount DOM closure is complete, and INI panel session workflows plus read-only control/shell handoff expose, render, and report OPFS/session readiness, OPFS/session persistence summary, and API surface inventory before loading or reading WASM session state. | +| Browser/UI workflow | Stable for current scope | Workflow overview embedding mount DOM closure is complete, and INI panel session workflows plus read-only control/shell handoff expose, render, and report OPFS/session readiness, OPFS/session persistence summary, release readiness artifact validation, and API surface inventory before loading or reading WASM session state. | | Workflow overview embedding | Stable for current scope | Report/display/render, DOM contract/readiness/renderer, mount result/display/render, mount DOM contract/readiness/renderer/wrapper exist. | | Host/runtime boundary proof | Stable blocked state | Host smoke passes; runtime families remain blocked and `docs/host-runtime-boundary-handoff.md` records host readiness, promotion blockers, dispatch, and evidence gates. | | Documentation/release gate | Stable for current scope | `docs/project-release-handoff.md` links README, panel entry, SDK, OPFS/session, sim-config, host/runtime, source reuse, drift, tracker acceptance paths, and the machine-readable release readiness report/artifact. | diff --git a/text14.txt b/text14.txt index 51a8bc0..bfb4c22 100644 --- a/text14.txt +++ b/text14.txt @@ -3000,3 +3000,81 @@ project_release_gate=ok 继续只做实质能力推进。优先选择真实 browser/UI workflow 或外部 shell 可消费能力; 如果继续 release 路径,必须继续产出可调用 API、可验证 workflow、可执行 gate 或可消费 artifact。 + +三十八、2026-06-16 继续执行记录:workflow overview release readiness artifact browser API + +本轮继续按“每批必须产出可调用 API、可验证 workflow、可执行 gate、或真实 UI/browser 能力”推进, +把 project release readiness artifact validation 从 SDK/host workflow 推进到真实 browser workflow overview +iframe API。外部 shell 现在可以向 workflow overview iframe 传入 readiness artifact JSON,并获得稳定的 +只读 validation report。 + +完成内容: + +- `ui-shell.js` 新增: + - `validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson()`; +- `createIniPanelShellWorkflowOverviewContract().methodNames` 新增: + - `validateWorkflowOverviewReleaseReadinessArtifactJson`; +- `workflow-overview.html` 的 `linuxCncIniPanelWorkflowOverviewApi` 暴露: + - `validateWorkflowOverviewReleaseReadinessArtifactJson()`; +- 该 API: + - 解析 project release readiness artifact JSON; + - 复用 SDK `createProjectReleaseReadinessArtifactValidation()`; + - 返回 `ini-panel-shell-workflow-overview-release-readiness-artifact-validation`; + - 返回 `phase/ready/missing/error/artifactApiName/artifactVersion/gateCount/rows/validation`; + - 对 malformed JSON 返回结构化 blocked result; +- `runtime/sdk/src/index.js` re-export workflow overview artifact validation wrapper; +- `verify_ini_panel_ui_shell.mjs` 覆盖 ready artifact 和 malformed JSON; +- `verify_ini_panel_shell_integration_manifest.mjs` 覆盖 contract/readiness 新 method; +- `ini_panel_workflow_overview_smoke.html` 在真实 iframe 中调用新 API; +- `ini_panel_shell_integration_workflow_smoke.html` 从外部 shell iframe 调用新 API; +- `docs/panel-entry.md`、`docs/project-release-handoff.md`、`runtime/sdk/README.md` 记录外部调用方式; +- `verify_ini_panel_entry_docs.mjs`、`verify_project_release_handoff_docs.mjs`、`verify_sdk_surface.mjs` + 覆盖新 API; +- `PROJECT_COMPLETION_TRACKER.md` 同步 latest completed batch 和 Browser/UI workflow 状态; +- 未新增控制按钮; +- 未执行 release gate/action-plan; +- 未解析 G-code; +- 未解释 canonical events; +- 未新增 JS CNC 语义; +- 未运行 opt-in runtime probes; +- 未 promotion blocked runtime family; +- 未改变 LinuxCNC interpreter、tool、parameter、planner、kinematics、remap 或 LinuxCNC-owned + runtime semantics。 + +验证已通过: + +```bash +git diff --check +wasm-port/tests/sdk/node/verify_sdk_surface.sh +wasm-port/tests/ui/node/verify_ini_panel_ui_shell.sh +wasm-port/tests/ui/node/verify_ini_panel_shell_integration_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/tests/docs/node/verify_project_release_handoff_docs.sh +wasm-port/tools/verify_vendor_sync.sh +wasm-port/tools/verify_no_standalone_cnc_semantics.sh +wasm-port/tests/host/verify_project_release_gate.sh +``` + +关键输出: + +```text +sdk_surface_node_smoke=ok +ini_panel_ui_shell_node_smoke=ok +ini_panel_shell_integration_manifest_node_smoke=ok +ini_panel_entry_docs_node_smoke=ok +ui_node_smokes=ok +browser_ini_workflow_overview_smoke=ok +browser_ini_shell_integration_workflow_smoke=ok +project_release_handoff_docs_node_smoke=ok +vendor sync up to date +standalone CNC semantics guard complete +project_release_readiness_artifact_node_smoke=ok +project_release_gate=ok +``` + +下一步工作计划: + +继续只做实质能力推进。优先选择真实 browser/UI workflow 或外部 shell 可消费能力; +如果继续 release 路径,必须继续产出可调用 API、可验证 workflow、可执行 gate 或可消费 artifact。 diff --git a/wasm-port/docs/panel-entry.md b/wasm-port/docs/panel-entry.md index 4020d5f..f0e68e8 100644 --- a/wasm-port/docs/panel-entry.md +++ b/wasm-port/docs/panel-entry.md @@ -63,6 +63,7 @@ import { createIniPanelShellWorkflowOverviewEmbeddingMountDomReadiness, renderIniPanelShellWorkflowOverviewEmbeddingMountState, mountIniPanelShellWorkflowOverviewEmbeddingMountState, + validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson, renderIniPanelShellSessionHandoffWorkflowState, mountIniPanelShellSessionHandoffWorkflow, renderIniPanelShellSessionHandoffMountState, @@ -149,6 +150,12 @@ status, and handoff readiness rows. The launch page exposes the same helper as `linuxCncIniPanelLaunchApi.getMachineSessionPersistenceSummary()`, and the workflow overview page exposes it as `linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewPersistenceSummary()`. +Use `validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson()` or +`linuxCncIniPanelWorkflowOverviewApi.validateWorkflowOverviewReleaseReadinessArtifactJson()` +when an outer shell needs to validate a project release readiness artifact JSON +through the same read-only workflow overview surface. It parses the artifact, +returns stable validation rows, and does not execute release gates or CNC +behavior. Use `createMachineSessionPersistenceDisplayViewModel()` and `createMachineSessionPersistenceRenderState()` when that summary needs stable display text, rows, status line, and dataset fields for caller-owned DOM. diff --git a/wasm-port/docs/project-release-handoff.md b/wasm-port/docs/project-release-handoff.md index d8b1516..6d3fcf0 100644 --- a/wasm-port/docs/project-release-handoff.md +++ b/wasm-port/docs/project-release-handoff.md @@ -44,6 +44,9 @@ continuation records are in `../text14.txt`. validates it with `verify_project_release_readiness_artifact.sh`. External tools can load that artifact with `parseProjectReleaseReadinessArtifactJson()` and validate it with `createProjectReleaseReadinessArtifactValidation()`. + Browser shells can also pass the JSON to + `linuxCncIniPanelWorkflowOverviewApi.validateWorkflowOverviewReleaseReadinessArtifactJson()` + through the workflow overview iframe and receive stable validation rows. - OPFS/session callers can use `createMachineSessionPersistenceSummary()` or `linuxCncIniPanelApi.getMachineSessionPersistenceSummary()` to inspect machine files, session snapshot, session readiness, session load, readonly diff --git a/wasm-port/runtime/sdk/README.md b/wasm-port/runtime/sdk/README.md index b91fcd0..b560b5a 100644 --- a/wasm-port/runtime/sdk/README.md +++ b/wasm-port/runtime/sdk/README.md @@ -82,6 +82,7 @@ import { saveTextFile, sessionSnapshotPath, toolTablePath, + validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson, validateSessionSnapshot, } from "./src/index.js"; ``` @@ -263,6 +264,9 @@ for external browser shells: read-only `persistence-summary` row. - `createIniPanelShellWorkflowOverviewContract()` for discovering the workflow overview iframe API contract. +- `validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson()` for the + read-only workflow overview artifact validation wrapper exposed by + `workflow-overview.html`. - `createIniPanelShellApiSurfaceInventory()` for a machine-readable inventory of launch, control-page, workflow overview, persistence, and session readiness report API counts, including persistence summary row counts. diff --git a/wasm-port/runtime/sdk/src/index.js b/wasm-port/runtime/sdk/src/index.js index 1a13328..8982379 100644 --- a/wasm-port/runtime/sdk/src/index.js +++ b/wasm-port/runtime/sdk/src/index.js @@ -113,4 +113,5 @@ export { renderIniPanelShellSessionHandoffMountState, renderIniPanelShellWorkflowOverviewEmbeddingMountState, renderIniPanelShellWorkflowOverviewEmbeddingState, + validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson, } from "../../ui/ini-panel/ui-shell.js"; diff --git a/wasm-port/runtime/ui/ini-panel/ui-shell.js b/wasm-port/runtime/ui/ini-panel/ui-shell.js index 0b20bfb..f2283ce 100644 --- a/wasm-port/runtime/ui/ini-panel/ui-shell.js +++ b/wasm-port/runtime/ui/ini-panel/ui-shell.js @@ -31,6 +31,10 @@ import { import { createMachineSessionPersistenceSummary, } from "./panel-state-summary.js"; +import { + createProjectReleaseReadinessArtifactValidation, + parseProjectReleaseReadinessArtifactJson, +} from "../../sdk/src/project-release-readiness.js"; export { controlPageStatusText, createControlPageRefreshState, @@ -72,6 +76,10 @@ export { createMachineSessionWorkflowOverview, createMachineSessionWorkflowStatus, } from "./panel-state-summary.js"; +export { + createProjectReleaseReadinessArtifactValidation, + parseProjectReleaseReadinessArtifactJson, +} from "../../sdk/src/project-release-readiness.js"; export function getVisibleIniPanelEntries() { return getIniPanelEntryManifest(); @@ -1865,6 +1873,7 @@ export function createIniPanelShellWorkflowOverviewContract() { "getWorkflowOverviewSessionReadinessReport", "getWorkflowOverviewApiSurfaceInventory", "getWorkflowOverviewPersistenceSummary", + "validateWorkflowOverviewReleaseReadinessArtifactJson", "getWorkflowOverviewDomContract", "getWorkflowOverviewDomReadiness", "renderWorkflowOverview", @@ -1874,6 +1883,46 @@ export function createIniPanelShellWorkflowOverviewContract() { }; } +export function validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson(artifactJson) { + try { + const artifact = parseProjectReleaseReadinessArtifactJson(artifactJson); + const validation = createProjectReleaseReadinessArtifactValidation(artifact); + return { + apiName: "ini-panel-shell-workflow-overview-release-readiness-artifact-validation", + validationVersion: 1, + phase: validation.ready ? "ready" : "blocked", + ready: validation.ready, + missing: [...validation.missing], + error: null, + artifactApiName: validation.artifactApiName, + artifactVersion: validation.artifactVersion, + gateCount: validation.gateCount, + validation, + rows: [...validation.rows], + }; + } catch (error) { + return { + apiName: "ini-panel-shell-workflow-overview-release-readiness-artifact-validation", + validationVersion: 1, + phase: "blocked", + ready: false, + missing: ["artifact-json"], + error: error?.message ?? "Unable to parse release readiness artifact JSON", + artifactApiName: null, + artifactVersion: null, + gateCount: 0, + validation: null, + rows: [ + { + id: "artifact-json", + label: "Readiness artifact JSON", + value: "blocked", + }, + ], + }; + } +} + export function createIniPanelShellWorkflowOverviewReadiness({ overviewApi = null, contract = createIniPanelShellWorkflowOverviewContract(), diff --git a/wasm-port/runtime/ui/ini-panel/workflow-overview.html b/wasm-port/runtime/ui/ini-panel/workflow-overview.html index 4b99170..b6fe32c 100644 --- a/wasm-port/runtime/ui/ini-panel/workflow-overview.html +++ b/wasm-port/runtime/ui/ini-panel/workflow-overview.html @@ -105,6 +105,7 @@ createIniPanelShellWorkflowOverviewEmbeddingMountDomReadiness, renderIniPanelShellWorkflowOverviewEmbeddingMountState, mountIniPanelShellWorkflowOverviewEmbeddingMountState, + validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson, renderIniPanelShellSessionHandoffWorkflowState, mountIniPanelShellSessionHandoffWorkflow, } from "./ui-shell.js"; @@ -133,6 +134,9 @@ getWorkflowOverviewPersistenceSummary: (options) => ( createMachineSessionPersistenceSummary(options) ), + validateWorkflowOverviewReleaseReadinessArtifactJson: (artifactJson) => ( + validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson(artifactJson) + ), getWorkflowOverviewDomContract: (options) => ( createIniPanelShellSessionHandoffWorkflowDomContract(options) ), diff --git a/wasm-port/tests/browser/ini_panel_shell_integration_workflow_smoke.html b/wasm-port/tests/browser/ini_panel_shell_integration_workflow_smoke.html index a3f2fa9..f2af654 100644 --- a/wasm-port/tests/browser/ini_panel_shell_integration_workflow_smoke.html +++ b/wasm-port/tests/browser/ini_panel_shell_integration_workflow_smoke.html @@ -309,6 +309,39 @@ TOOL_TABLE = browser-shell-tool.tbl const workflowOverviewReadiness = launchApi.getWorkflowOverviewReadiness({ overviewApi: workflowOverviewApi, }); + const workflowOverviewReleaseArtifactValidation = workflowOverviewApi + .validateWorkflowOverviewReleaseReadinessArtifactJson(JSON.stringify({ + apiName: "project-release-readiness-report", + reportVersion: 1, + phase: "ready", + ready: true, + missing: [], + releaseGate: { + command: "wasm-port/tests/host/verify_project_release_gate.sh", + passed: true, + expectedOutput: "project_release_gate=ok", + }, + simConfigInventory: { + executed: 28, + passed: 28, + skipped: 131, + unexpectedFail: 0, + }, + blockedRuntimeFamilies: [ + "L4-USER-M-PROCESS", + "L4-TOOL-DB", + "L4-PYTHON-REMAP", + ], + promotedBlockedFamilies: [], + gates: Array.from({ length: 9 }, (_, index) => ({ id: `gate-${index}`, passed: true })), + rows: [ + { + id: "project-release-gate", + label: "Project release gate", + value: "passed", + }, + ], + })); const workflowOverviewEmbedding = launchApi.mountWorkflowOverviewEmbedding({ overviewApi: workflowOverviewApi, }); @@ -370,6 +403,16 @@ TOOL_TABLE = browser-shell-tool.tbl }); assertEqual(workflowOverviewReadiness.ready, true, "shell workflow overview iframe readiness"); assertEqual(workflowOverviewReadiness.missing.join(","), "", "shell workflow overview iframe missing methods"); + assertEqual( + workflowOverviewReleaseArtifactValidation.apiName, + "ini-panel-shell-workflow-overview-release-readiness-artifact-validation", + "shell workflow overview release artifact validation API", + ); + assertEqual( + workflowOverviewReleaseArtifactValidation.ready, + true, + "shell workflow overview release artifact validation readiness", + ); assertEqual(workflowOverviewEmbedding.apiName, "ini-panel-shell-workflow-overview-embedding", "shell workflow overview embedding API"); assertEqual(workflowOverviewEmbedding.renderState.dataset.handoffScope, "workflow", "shell workflow overview embedding scope"); assertEqual(workflowOverviewEmbedding.mountResult.renderResult.rowCount, 8, "shell workflow overview embedding rows"); 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 47bc126..97f2867 100644 --- a/wasm-port/tests/browser/ini_panel_workflow_overview_smoke.html +++ b/wasm-port/tests/browser/ini_panel_workflow_overview_smoke.html @@ -34,6 +34,7 @@ !workflowApi?.getWorkflowOverviewSessionReadinessReport || !workflowApi?.getWorkflowOverviewApiSurfaceInventory || !workflowApi?.getWorkflowOverviewPersistenceSummary || + !workflowApi?.validateWorkflowOverviewReleaseReadinessArtifactJson || !workflowApi?.getWorkflowOverviewDomContract || !workflowApi?.getWorkflowOverviewDomReadiness || !workflowApi?.renderWorkflowOverview || @@ -62,6 +63,38 @@ const sessionReadinessReport = workflowApi.getWorkflowOverviewSessionReadinessReport(); const apiSurfaceInventory = workflowApi.getWorkflowOverviewApiSurfaceInventory(); const persistenceSummary = workflowApi.getWorkflowOverviewPersistenceSummary(); + const releaseArtifactValidation = workflowApi.validateWorkflowOverviewReleaseReadinessArtifactJson(JSON.stringify({ + apiName: "project-release-readiness-report", + reportVersion: 1, + phase: "ready", + ready: true, + missing: [], + releaseGate: { + command: "wasm-port/tests/host/verify_project_release_gate.sh", + passed: true, + expectedOutput: "project_release_gate=ok", + }, + simConfigInventory: { + executed: 28, + passed: 28, + skipped: 131, + unexpectedFail: 0, + }, + blockedRuntimeFamilies: [ + "L4-USER-M-PROCESS", + "L4-TOOL-DB", + "L4-PYTHON-REMAP", + ], + promotedBlockedFamilies: [], + gates: Array.from({ length: 9 }, (_, index) => ({ id: `gate-${index}`, passed: true })), + rows: [ + { + id: "project-release-gate", + label: "Project release gate", + value: "passed", + }, + ], + })); const domContract = workflowApi.getWorkflowOverviewDomContract(); const domReadiness = workflowApi.getWorkflowOverviewDomReadiness(); const renderResult = workflowApi.renderWorkflowOverview(); @@ -107,6 +140,13 @@ "workflow overview persistence summary API name", ); assertEqual(persistenceSummary.rows.length, 7, "workflow overview persistence summary rows"); + assertEqual( + releaseArtifactValidation.apiName, + "ini-panel-shell-workflow-overview-release-readiness-artifact-validation", + "workflow overview release artifact validation API name", + ); + assertEqual(releaseArtifactValidation.ready, true, "workflow overview release artifact validation readiness"); + assertEqual(releaseArtifactValidation.gateCount, 9, "workflow overview release artifact validation gates"); assertEqual(displayViewModel.title, "Shell handoff workflow", "workflow overview display title"); assertEqual(renderState.renderStateVersion, 1, "workflow overview render-state version"); assertEqual(renderState.dataset.handoffScope, "workflow", "workflow overview render-state scope"); 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 96464c3..fd881f4 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 @@ -34,6 +34,7 @@ for (const phrase of [ "createProjectReleaseReadinessReport()", "parseProjectReleaseReadinessArtifactJson()", "createProjectReleaseReadinessArtifactValidation()", + "validateWorkflowOverviewReleaseReadinessArtifactJson()", "createIniPanelShellApiSurfaceInventory()", "createIniPanelShellSessionReadinessWorkflowReport()", "workflow overview embedding mount DOM", diff --git a/wasm-port/tests/sdk/node/verify_sdk_surface.mjs b/wasm-port/tests/sdk/node/verify_sdk_surface.mjs index 8b97ccd..cc31566 100644 --- a/wasm-port/tests/sdk/node/verify_sdk_surface.mjs +++ b/wasm-port/tests/sdk/node/verify_sdk_surface.mjs @@ -63,6 +63,7 @@ import { saveTextFile, sessionSnapshotPath, toolTablePath, + validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson, validateSessionSnapshot, } from "../../../runtime/sdk/src/index.js"; @@ -78,6 +79,10 @@ const requiredExports = [ ["createProjectReleaseReadinessArtifactValidation", createProjectReleaseReadinessArtifactValidation], ["createProjectReleaseReadinessReport", createProjectReleaseReadinessReport], ["parseProjectReleaseReadinessArtifactJson", parseProjectReleaseReadinessArtifactJson], + [ + "validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson", + validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson, + ], ["planIniFileContextStaging", planIniFileContextStaging], ["planSimConfigStaging", planSimConfigStaging], ["analyzeIniRuntimeBoundaries", analyzeIniRuntimeBoundaries], @@ -241,6 +246,10 @@ assert.deepEqual( "rows.project-release-gate", ], ); +assert.equal( + validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson(JSON.stringify(releaseReadinessArtifact)).ready, + true, +); assert.equal( createProjectReleaseReadinessReport({ observedOutputs: ["project_release_gate=ok"], diff --git a/wasm-port/tests/ui/node/verify_ini_panel_entry_docs.mjs b/wasm-port/tests/ui/node/verify_ini_panel_entry_docs.mjs index 788c8da..2322352 100644 --- a/wasm-port/tests/ui/node/verify_ini_panel_entry_docs.mjs +++ b/wasm-port/tests/ui/node/verify_ini_panel_entry_docs.mjs @@ -53,6 +53,7 @@ import { createIniPanelShellWorkflowOverviewEmbeddingMountDomReadiness, renderIniPanelShellWorkflowOverviewEmbeddingMountState, mountIniPanelShellWorkflowOverviewEmbeddingMountState, + validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson, renderIniPanelShellSessionHandoffWorkflowState, mountIniPanelShellSessionHandoffWorkflow, renderIniPanelShellSessionHandoffMountState, @@ -154,6 +155,7 @@ const requiredShellExports = [ "createIniPanelShellWorkflowOverviewEmbeddingMountDomReadiness", "renderIniPanelShellWorkflowOverviewEmbeddingMountState", "mountIniPanelShellWorkflowOverviewEmbeddingMountState", + "validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson", "renderIniPanelShellSessionHandoffWorkflowState", "mountIniPanelShellSessionHandoffWorkflow", "renderIniPanelShellSessionHandoffMountState", diff --git a/wasm-port/tests/ui/node/verify_ini_panel_shell_integration_manifest.mjs b/wasm-port/tests/ui/node/verify_ini_panel_shell_integration_manifest.mjs index af63b1e..aa13fc0 100644 --- a/wasm-port/tests/ui/node/verify_ini_panel_shell_integration_manifest.mjs +++ b/wasm-port/tests/ui/node/verify_ini_panel_shell_integration_manifest.mjs @@ -51,6 +51,7 @@ import { createIniPanelShellWorkflowOverviewEmbeddingMountDomReadiness, renderIniPanelShellWorkflowOverviewEmbeddingMountState, mountIniPanelShellWorkflowOverviewEmbeddingMountState, + validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson, renderIniPanelShellSessionHandoffWorkflowState, mountIniPanelShellSessionHandoffWorkflow, createIniPanelShellSessionHandoffPackageReport, @@ -780,6 +781,7 @@ assert.deepEqual(createIniPanelShellWorkflowOverviewContract(), { "getWorkflowOverviewSessionReadinessReport", "getWorkflowOverviewApiSurfaceInventory", "getWorkflowOverviewPersistenceSummary", + "validateWorkflowOverviewReleaseReadinessArtifactJson", "getWorkflowOverviewDomContract", "getWorkflowOverviewDomReadiness", "renderWorkflowOverview", @@ -817,6 +819,11 @@ assert.equal(typeof createIniPanelShellWorkflowOverviewEmbeddingMountDomContract assert.equal(typeof createIniPanelShellWorkflowOverviewEmbeddingMountDomReadiness, "function"); assert.equal(typeof renderIniPanelShellWorkflowOverviewEmbeddingMountState, "function"); assert.equal(typeof mountIniPanelShellWorkflowOverviewEmbeddingMountState, "function"); +assert.equal(typeof validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson, "function"); +assert.equal( + validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson("{}").apiName, + "ini-panel-shell-workflow-overview-release-readiness-artifact-validation", +); assert.deepEqual( createIniPanelShellWorkflowOverviewReadiness({ overviewApi: { @@ -829,6 +836,7 @@ assert.deepEqual( "getWorkflowOverviewDisplayViewModel", "getWorkflowOverviewSummary", "getWorkflowOverviewPersistenceSummary", + "validateWorkflowOverviewReleaseReadinessArtifactJson", "getWorkflowOverviewDomContract", "getWorkflowOverviewDomReadiness", "renderWorkflowOverview", 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 8a7cfae..0891663 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 @@ -51,6 +51,7 @@ import { createIniPanelShellWorkflowOverviewEmbeddingMountDomReadiness, renderIniPanelShellWorkflowOverviewEmbeddingMountState, mountIniPanelShellWorkflowOverviewEmbeddingMountState, + validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson, renderIniPanelShellSessionHandoffWorkflowState, mountIniPanelShellSessionHandoffWorkflow, renderIniPanelShellSessionHandoffMountState, @@ -674,6 +675,7 @@ assert.deepEqual(shellViewModel.shellWorkflowOverviewContract, { "getWorkflowOverviewSessionReadinessReport", "getWorkflowOverviewApiSurfaceInventory", "getWorkflowOverviewPersistenceSummary", + "validateWorkflowOverviewReleaseReadinessArtifactJson", "getWorkflowOverviewDomContract", "getWorkflowOverviewDomReadiness", "renderWorkflowOverview", @@ -1269,6 +1271,52 @@ assert.equal(workflowDomMountResult.ready, false); assert.equal(workflowDomMountResult.renderResult.rowCount, 8); assert.equal(workflowDomMountResult.renderResult.dataset.handoffScope, "workflow"); assert.deepEqual(createIniPanelShellWorkflowOverviewContract(), shellViewModel.shellWorkflowOverviewContract); +const releaseReadinessArtifactJson = JSON.stringify({ + apiName: "project-release-readiness-report", + reportVersion: 1, + phase: "ready", + ready: true, + missing: [], + releaseGate: { + command: "wasm-port/tests/host/verify_project_release_gate.sh", + passed: true, + expectedOutput: "project_release_gate=ok", + }, + simConfigInventory: { + executed: 28, + passed: 28, + skipped: 131, + unexpectedFail: 0, + }, + blockedRuntimeFamilies: [ + "L4-USER-M-PROCESS", + "L4-TOOL-DB", + "L4-PYTHON-REMAP", + ], + promotedBlockedFamilies: [], + gates: Array.from({ length: 9 }, (_, index) => ({ id: `gate-${index}`, passed: true })), + rows: [ + { + id: "project-release-gate", + label: "Project release gate", + value: "passed", + }, + ], +}); +const releaseArtifactValidation = validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson( + releaseReadinessArtifactJson, +); +assert.equal( + releaseArtifactValidation.apiName, + "ini-panel-shell-workflow-overview-release-readiness-artifact-validation", +); +assert.equal(releaseArtifactValidation.ready, true); +assert.equal(releaseArtifactValidation.validation.ready, true); +assert.equal(releaseArtifactValidation.gateCount, 9); +assert.deepEqual( + validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson("{").missing, + ["artifact-json"], +); assert.deepEqual(createIniPanelShellWorkflowOverviewReadiness(), { apiName: "ini-panel-shell-workflow-overview-readiness", readinessVersion: 1, @@ -1284,6 +1332,7 @@ const workflowOverviewApi = { getWorkflowOverviewSessionReadinessReport: () => sessionReadinessWorkflowReport, getWorkflowOverviewApiSurfaceInventory: () => shellViewModel.shellApiSurfaceInventory, getWorkflowOverviewPersistenceSummary: () => shellViewModel.shellPersistenceSummary, + validateWorkflowOverviewReleaseReadinessArtifactJson: () => ({ ready: true }), getWorkflowOverviewDomContract: createIniPanelShellSessionHandoffWorkflowDomContract, getWorkflowOverviewDomReadiness: createIniPanelShellSessionHandoffWorkflowDomReadiness, renderWorkflowOverview: renderIniPanelShellSessionHandoffWorkflowState,