diff --git a/PROJECT_COMPLETION_TRACKER.md b/PROJECT_COMPLETION_TRACKER.md index 49937a6..63b55d9 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: workflow overview release readiness artifact browser API +- Latest completed batch: workflow overview release readiness artifact DOM workflow - 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, release readiness artifact validation, 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/rendering, 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 bfb4c22..0cc698a 100644 --- a/text14.txt +++ b/text14.txt @@ -3001,6 +3001,92 @@ project_release_gate=ok 继续只做实质能力推进。优先选择真实 browser/UI workflow 或外部 shell 可消费能力; 如果继续 release 路径,必须继续产出可调用 API、可验证 workflow、可执行 gate 或可消费 artifact。 +三十九、2026-06-16 继续执行记录:workflow overview release readiness artifact DOM workflow + +本轮继续按“每批必须产出可调用 API、可验证 workflow、可执行 gate、或真实 UI/browser 能力”推进, +把 workflow overview release readiness artifact validation 从“返回数据”推进到可直接渲染和挂载的 +DOM workflow。外部 shell 现在可以把 release readiness artifact validation 渲染进 caller-owned DOM, +并通过 browser smoke 验证真实 iframe 调用链。 + +完成内容: + +- `ui-shell.js` 新增 release readiness artifact DOM workflow helpers: + - `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel()`; + - `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState()`; + - `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomContract()`; + - `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomReadiness()`; + - `renderIniPanelShellWorkflowOverviewReleaseReadinessArtifactState()`; + - `mountIniPanelShellWorkflowOverviewReleaseReadinessArtifactState()`; +- `createIniPanelShellWorkflowOverviewContract().methodNames` 新增对应 workflow overview iframe API; +- `workflow-overview.html` 的 `linuxCncIniPanelWorkflowOverviewApi` 暴露: + - `getWorkflowOverviewReleaseReadinessArtifactDisplayViewModel()`; + - `getWorkflowOverviewReleaseReadinessArtifactRenderState()`; + - `getWorkflowOverviewReleaseReadinessArtifactDomContract()`; + - `getWorkflowOverviewReleaseReadinessArtifactDomReadiness()`; + - `renderWorkflowOverviewReleaseReadinessArtifactState()`; + - `mountWorkflowOverviewReleaseReadinessArtifactState()`; +- 新 DOM workflow 使用独立 scope: + - `workflow-overview-release-readiness-artifact`; + - 默认 selectors: + - `[data-workflow-overview-release-readiness-artifact]`; + - `[data-workflow-overview-release-readiness-artifact-status]`; + - `[data-workflow-overview-release-readiness-artifact-rows]`; +- `runtime/sdk/src/index.js` re-export 新 DOM workflow helpers; +- `verify_ini_panel_ui_shell.mjs` 覆盖 display/render/DOM contract/readiness/render/mount; +- `verify_ini_panel_shell_integration_manifest.mjs` 覆盖 methodNames、missing method 和 helper exports; +- `ini_panel_workflow_overview_smoke.html` 在真实 workflow overview iframe 中渲染 release artifact validation; +- `ini_panel_shell_integration_workflow_smoke.html` 从外部 shell DOM 渲染并挂载 release artifact validation; +- `verify_sdk_surface.mjs` 覆盖 SDK export 和 render-state scope; +- `docs/panel-entry.md`、`docs/project-release-handoff.md`、`runtime/sdk/README.md` 记录新 DOM workflow; +- `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/ui/node/verify_ini_panel_ui_shell.sh +wasm-port/tests/ui/node/verify_ini_panel_shell_integration_manifest.sh +wasm-port/tests/sdk/node/verify_sdk_surface.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 +ini_panel_ui_shell_node_smoke=ok +ini_panel_shell_integration_manifest_node_smoke=ok +sdk_surface_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。 + 三十八、2026-06-16 继续执行记录:workflow overview release readiness artifact browser API 本轮继续按“每批必须产出可调用 API、可验证 workflow、可执行 gate、或真实 UI/browser 能力”推进, diff --git a/wasm-port/docs/panel-entry.md b/wasm-port/docs/panel-entry.md index f0e68e8..fa96121 100644 --- a/wasm-port/docs/panel-entry.md +++ b/wasm-port/docs/panel-entry.md @@ -64,6 +64,12 @@ import { renderIniPanelShellWorkflowOverviewEmbeddingMountState, mountIniPanelShellWorkflowOverviewEmbeddingMountState, validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson, + createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel, + createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState, + createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomContract, + createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomReadiness, + renderIniPanelShellWorkflowOverviewReleaseReadinessArtifactState, + mountIniPanelShellWorkflowOverviewReleaseReadinessArtifactState, renderIniPanelShellSessionHandoffWorkflowState, mountIniPanelShellSessionHandoffWorkflow, renderIniPanelShellSessionHandoffMountState, @@ -156,6 +162,15 @@ 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 `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel()`, +`createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState()`, +`createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomContract()`, +`createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomReadiness()`, +`renderIniPanelShellWorkflowOverviewReleaseReadinessArtifactState()`, or +`mountIniPanelShellWorkflowOverviewReleaseReadinessArtifactState()` when that +validation needs to be rendered into caller-owned DOM. The workflow overview +page exposes equivalent methods with the `getWorkflowOverview...`, +`renderWorkflowOverview...`, and `mountWorkflowOverview...` prefixes. 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 6d3fcf0..fa13e08 100644 --- a/wasm-port/docs/project-release-handoff.md +++ b/wasm-port/docs/project-release-handoff.md @@ -46,7 +46,10 @@ continuation records are in `../text14.txt`. 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. + through the workflow overview iframe and receive stable validation rows. When + the outer shell needs DOM output, the workflow overview iframe also exposes + display, render-state, DOM readiness, renderer, and mount helpers for the + same release readiness artifact validation. - 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 b560b5a..7663c8a 100644 --- a/wasm-port/runtime/sdk/README.md +++ b/wasm-port/runtime/sdk/README.md @@ -41,6 +41,10 @@ import { createIniPanelShellWorkflowOverviewContract, createIniPanelShellWorkflowOverviewEmbeddingMountDomContract, createIniPanelShellWorkflowOverviewEmbeddingMountDomReadiness, + createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel, + createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomContract, + createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomReadiness, + createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState, createLinuxCncIniSdk, createLinuxCncInterpSdk, createMachineSessionPersistenceDisplayViewModel, @@ -68,6 +72,7 @@ import { machineFilePaths, machineIniPath, mountIniPanelShellWorkflowOverviewEmbeddingMountState, + mountIniPanelShellWorkflowOverviewReleaseReadinessArtifactState, normalizeOpfsPath, parameterFilePath, parseProjectReleaseReadinessArtifactJson, @@ -75,6 +80,7 @@ import { planSimConfigStaging, readMachineSessionReadiness, renderIniPanelShellWorkflowOverviewEmbeddingMountState, + renderIniPanelShellWorkflowOverviewReleaseReadinessArtifactState, restoreMachineParametersFromOpfs, saveMachineSessionSnapshot, saveMachineTextFiles, @@ -266,7 +272,14 @@ for external browser shells: overview iframe API contract. - `validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson()` for the read-only workflow overview artifact validation wrapper exposed by - `workflow-overview.html`. + `workflow-overview.html`. Use + `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel()`, + `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState()`, + `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomContract()`, + `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomReadiness()`, + `renderIniPanelShellWorkflowOverviewReleaseReadinessArtifactState()`, and + `mountIniPanelShellWorkflowOverviewReleaseReadinessArtifactState()` when an + outer shell needs to render that validation into caller-owned DOM. - `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 8982379..30d540d 100644 --- a/wasm-port/runtime/sdk/src/index.js +++ b/wasm-port/runtime/sdk/src/index.js @@ -97,6 +97,10 @@ export { createIniPanelShellWorkflowOverviewEmbeddingMountRenderState, createIniPanelShellWorkflowOverviewEmbeddingRenderState, createIniPanelShellWorkflowOverviewEmbeddingReport, + createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel, + createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomContract, + createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomReadiness, + createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState, createIniPanelShellWorkflowOverviewReadiness, getIniPanelEntryByHref, getIniPanelEntryManifest, @@ -111,7 +115,9 @@ export { mountIniPanelShellWorkflowOverviewEmbeddingMountState, mountIniPanelShellWorkflowOverviewEmbeddingState, renderIniPanelShellSessionHandoffMountState, + renderIniPanelShellWorkflowOverviewReleaseReadinessArtifactState, renderIniPanelShellWorkflowOverviewEmbeddingMountState, renderIniPanelShellWorkflowOverviewEmbeddingState, + mountIniPanelShellWorkflowOverviewReleaseReadinessArtifactState, 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 f2283ce..3daaf90 100644 --- a/wasm-port/runtime/ui/ini-panel/ui-shell.js +++ b/wasm-port/runtime/ui/ini-panel/ui-shell.js @@ -1874,6 +1874,12 @@ export function createIniPanelShellWorkflowOverviewContract() { "getWorkflowOverviewApiSurfaceInventory", "getWorkflowOverviewPersistenceSummary", "validateWorkflowOverviewReleaseReadinessArtifactJson", + "getWorkflowOverviewReleaseReadinessArtifactDisplayViewModel", + "getWorkflowOverviewReleaseReadinessArtifactRenderState", + "getWorkflowOverviewReleaseReadinessArtifactDomContract", + "getWorkflowOverviewReleaseReadinessArtifactDomReadiness", + "renderWorkflowOverviewReleaseReadinessArtifactState", + "mountWorkflowOverviewReleaseReadinessArtifactState", "getWorkflowOverviewDomContract", "getWorkflowOverviewDomReadiness", "renderWorkflowOverview", @@ -1923,6 +1929,240 @@ export function validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJso } } +export function createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel( + validation = validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson("{}"), +) { + const missing = Array.isArray(validation?.missing) ? validation.missing : []; + const rows = Array.isArray(validation?.rows) + ? validation.rows.map(({ id, label, value }) => ({ + id, + label, + value: value == null ? "" : String(value), + })) + : []; + return { + phase: validation?.phase === "ready" ? "ready" : "blocked", + title: "Release readiness artifact", + statusText: validation?.ready ? "Ready" : "Blocked", + detailText: validation?.ready + ? "No blocking reasons" + : (missing.length > 0 ? missing.join(", ") : validation?.error ?? "artifact validation blocked"), + rows, + }; +} + +export function createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState( + displayViewModel = createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel(), +) { + const rows = Array.isArray(displayViewModel?.rows) + ? displayViewModel.rows.map(({ id, label, value }) => ({ + id, + label, + value: value == null ? "" : String(value), + })) + : []; + const ready = displayViewModel?.phase === "ready" && displayViewModel?.statusText === "Ready"; + const statusText = displayViewModel?.statusText ?? (ready ? "Ready" : "Blocked"); + const detailText = displayViewModel?.detailText ?? "No blocking reasons"; + return { + apiName: "ini-panel-shell-workflow-overview-release-readiness-artifact-render-state", + renderStateVersion: 1, + phase: ready ? "ready" : "blocked", + ready, + title: displayViewModel?.title ?? "Release readiness artifact", + statusText, + detailText, + statusLine: `${statusText}: ${detailText}`, + rows, + dataset: { + handoffPhase: ready ? "ready" : "blocked", + handoffReady: ready ? "true" : "false", + handoffScope: "workflow-overview-release-readiness-artifact", + }, + }; +} + +export function createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomContract({ + rowDatasetPrefix = "workflowOverviewReleaseReadinessArtifact", + selectors = {}, +} = {}) { + const mountSelector = selectors.mount ?? "[data-workflow-overview-release-readiness-artifact]"; + const statusSelector = selectors.status ?? "[data-workflow-overview-release-readiness-artifact-status]"; + const rowsSelector = selectors.rows ?? "[data-workflow-overview-release-readiness-artifact-rows]"; + return { + apiName: "ini-panel-shell-workflow-overview-release-readiness-artifact-dom-contract", + contractVersion: 1, + requiredNodeIds: ["mount", "status", "rows"], + selectors: { + mount: mountSelector, + status: statusSelector, + rows: rowsSelector, + }, + mountDatasetKeys: ["handoffPhase", "handoffReady", "handoffScope"], + rowDatasetPrefix, + rowDatasetKeys: { + term: [`${rowDatasetPrefix}Row`, `${rowDatasetPrefix}Status`], + detail: [`${rowDatasetPrefix}Value`, `${rowDatasetPrefix}Status`], + }, + renderResultFields: ["rendered", "statusLine", "rowCount", "rowIds", "dataset"], + }; +} + +export function createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomReadiness({ + rowDatasetPrefix = "workflowOverviewReleaseReadinessArtifact", + contract = createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomContract({ rowDatasetPrefix }), + documentRef = globalThis.document, + mountNode = documentRef?.querySelector?.(contract.selectors.mount), + statusNode = documentRef?.querySelector?.(contract.selectors.status), + rowsNode = documentRef?.querySelector?.(contract.selectors.rows), +} = {}) { + const checks = { + document: Boolean(documentRef?.createElement), + mount: Boolean(mountNode), + status: Boolean(statusNode), + rows: Boolean(rowsNode), + rowDatasetPrefix: Boolean(contract.rowDatasetPrefix), + }; + const missing = Object.entries(checks) + .filter(([, passed]) => !passed) + .map(([name]) => name); + const ready = missing.length === 0; + return { + apiName: "ini-panel-shell-workflow-overview-release-readiness-artifact-dom-readiness", + readinessVersion: 1, + phase: ready ? "ready" : "blocked", + ready, + missing, + checks, + contract, + }; +} + +export function renderIniPanelShellWorkflowOverviewReleaseReadinessArtifactState( + renderState = createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState(), + { + rowDatasetPrefix = "workflowOverviewReleaseReadinessArtifact", + contract = createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomContract({ rowDatasetPrefix }), + documentRef = globalThis.document, + mountNode = documentRef?.querySelector?.(contract.selectors.mount), + statusNode = documentRef?.querySelector?.(contract.selectors.status), + rowsNode = documentRef?.querySelector?.(contract.selectors.rows), + } = {}, +) { + const readiness = createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomReadiness({ + contract, + documentRef, + mountNode, + statusNode, + rowsNode, + }); + if (!readiness.ready) { + throw new Error( + `Workflow overview release readiness artifact DOM is not ready: ${readiness.missing.join(", ")}`, + ); + } + + mountNode.dataset.handoffPhase = renderState?.dataset?.handoffPhase ?? "blocked"; + mountNode.dataset.handoffReady = renderState?.dataset?.handoffReady ?? "false"; + mountNode.dataset.handoffScope = renderState?.dataset?.handoffScope + ?? "workflow-overview-release-readiness-artifact"; + statusNode.textContent = renderState?.statusLine ?? "Blocked: No release readiness artifact render state"; + rowsNode.replaceChildren(); + + const rows = Array.isArray(renderState?.rows) ? renderState.rows : []; + const effectiveRowDatasetPrefix = contract.rowDatasetPrefix; + for (const row of rows) { + const term = documentRef.createElement("dt"); + term.dataset[`${effectiveRowDatasetPrefix}Row`] = row.id; + term.dataset[`${effectiveRowDatasetPrefix}Status`] = renderState?.ready ? "pass" : "blocked"; + term.textContent = row.label; + const detail = documentRef.createElement("dd"); + detail.dataset[`${effectiveRowDatasetPrefix}Value`] = row.id; + detail.dataset[`${effectiveRowDatasetPrefix}Status`] = renderState?.ready ? "pass" : "blocked"; + detail.textContent = row.value; + rowsNode.append(term, detail); + } + + return { + rendered: true, + statusLine: statusNode.textContent, + rowCount: rows.length, + rowIds: rows.map(({ id }) => id), + dataset: { + handoffPhase: mountNode.dataset.handoffPhase, + handoffReady: mountNode.dataset.handoffReady, + handoffScope: mountNode.dataset.handoffScope, + }, + }; +} + +export function mountIniPanelShellWorkflowOverviewReleaseReadinessArtifactState({ + renderState = createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState(), + rowDatasetPrefix = "workflowOverviewReleaseReadinessArtifact", + contract = createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomContract({ rowDatasetPrefix }), + documentRef = globalThis.document, + mountNode = documentRef?.querySelector?.(contract.selectors.mount), + statusNode = documentRef?.querySelector?.(contract.selectors.status), + rowsNode = documentRef?.querySelector?.(contract.selectors.rows), +} = {}) { + const domReadiness = createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomReadiness({ + contract, + documentRef, + mountNode, + statusNode, + rowsNode, + }); + if (!domReadiness.ready) { + return { + apiName: "ini-panel-shell-workflow-overview-release-readiness-artifact-dom-mount", + workflowVersion: 1, + phase: "blocked", + ready: false, + statusLine: `Blocked: ${domReadiness.missing.join(", ")}`, + contract, + domReadiness, + renderState, + renderResult: null, + error: null, + }; + } + + try { + const renderResult = renderIniPanelShellWorkflowOverviewReleaseReadinessArtifactState(renderState, { + contract, + documentRef, + mountNode, + statusNode, + rowsNode, + }); + return { + apiName: "ini-panel-shell-workflow-overview-release-readiness-artifact-dom-mount", + workflowVersion: 1, + phase: renderState?.phase === "ready" ? "ready" : "blocked", + ready: renderState?.ready === true, + statusLine: renderResult.statusLine, + contract, + domReadiness, + renderState, + renderResult, + error: null, + }; + } catch (error) { + return { + apiName: "ini-panel-shell-workflow-overview-release-readiness-artifact-dom-mount", + workflowVersion: 1, + phase: "blocked", + ready: false, + statusLine: `Blocked: ${error?.message ?? "release readiness artifact DOM mount error"}`, + contract, + domReadiness, + renderState, + renderResult: null, + error: error?.message ?? String(error), + }; + } +} + 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 b6fe32c..16ca4df 100644 --- a/wasm-port/runtime/ui/ini-panel/workflow-overview.html +++ b/wasm-port/runtime/ui/ini-panel/workflow-overview.html @@ -106,6 +106,12 @@ renderIniPanelShellWorkflowOverviewEmbeddingMountState, mountIniPanelShellWorkflowOverviewEmbeddingMountState, validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson, + createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel, + createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState, + createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomContract, + createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomReadiness, + renderIniPanelShellWorkflowOverviewReleaseReadinessArtifactState, + mountIniPanelShellWorkflowOverviewReleaseReadinessArtifactState, renderIniPanelShellSessionHandoffWorkflowState, mountIniPanelShellSessionHandoffWorkflow, } from "./ui-shell.js"; @@ -137,6 +143,24 @@ validateWorkflowOverviewReleaseReadinessArtifactJson: (artifactJson) => ( validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson(artifactJson) ), + getWorkflowOverviewReleaseReadinessArtifactDisplayViewModel: (validation) => ( + createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel(validation) + ), + getWorkflowOverviewReleaseReadinessArtifactRenderState: (displayViewModel) => ( + createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState(displayViewModel) + ), + getWorkflowOverviewReleaseReadinessArtifactDomContract: (options) => ( + createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomContract(options) + ), + getWorkflowOverviewReleaseReadinessArtifactDomReadiness: (options) => ( + createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomReadiness(options ?? { documentRef: document }) + ), + renderWorkflowOverviewReleaseReadinessArtifactState: (renderState, options) => ( + renderIniPanelShellWorkflowOverviewReleaseReadinessArtifactState(renderState, options ?? { documentRef: document }) + ), + mountWorkflowOverviewReleaseReadinessArtifactState: (options) => ( + mountIniPanelShellWorkflowOverviewReleaseReadinessArtifactState(options ?? { documentRef: document }) + ), 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 f2af654..6740bd0 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 @@ -18,6 +18,10 @@
waiting
waiting
+