diff --git a/PROJECT_COMPLETION_TRACKER.md b/PROJECT_COMPLETION_TRACKER.md index 470e13d..c2517e9 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 summary view-model API +- Latest completed batch: workflow overview release artifact validation summary 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 gate manifest/result matrix/action-plan/readiness summary view-model, project release readiness report/artifact validation summary plus URL loading workflow, 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, fetch, validate, 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. | +| 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, fetch, validate, summarize, 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 1597d28..7273d91 100644 --- a/text14.txt +++ b/text14.txt @@ -3308,6 +3308,74 @@ ui_node_smokes=ok 继续只做实质能力推进。优先选择可执行 gate、SDK/API surface、或真实 browser workflow; 不要做只整理断言或局部常量化的批次。 +四十八、2026-06-16 继续执行记录:workflow overview release artifact validation summary browser API + +本轮继续按“每批必须产出可调用 API、可验证 workflow、可执行 gate、或真实 UI/browser 能力”推进, +把 release readiness artifact validation summary 从 SDK helper 暴露到 INI workflow overview iframe 和 +launch shell API。外部 browser shell 现在可以通过 workflow overview API 直接获取 artifact validation +summary statusLine 和 dashboard rows,不需要导入 SDK 私有路径或解释 validation flags。 + +完成内容: + +- `runtime/ui/ini-panel/ui-shell.js` 新增并导出: + - `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel()`; +- `createIniPanelShellWorkflowOverviewContract().methodNames` 新增: + - `getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel`; +- `createIniPanelLaunchApiManifest().methods` 新增同名 discovery method; +- `createIniPanelShellViewModel()` 暴露: + - `createWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel`; +- `workflow-overview.html` 暴露: + - `window.linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel()`; +- `launch.html` 暴露: + - `window.linuxCncIniPanelLaunchApi.getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel()`; +- `runtime/sdk/src/index.js` re-export 新 UI helper; +- Browser smoke 不再手写旧 release artifact JSON,改为读取 + `tests/fixtures/project-release-readiness-ready.json`; +- `ini_panel_workflow_overview_smoke.html` 覆盖 workflow overview iframe summary API; +- `ini_panel_shell_integration_workflow_smoke.html` 覆盖 launch API 与 workflow overview iframe API summary 一致; +- `release_artifact_url_workflow_smoke.html` 同步 enhanced validation rows; +- UI Node smoke、launch manifest smoke、shell integration manifest smoke、entry docs smoke、SDK surface smoke + 覆盖新 helper/API; +- `docs/panel-entry.md`、`runtime/sdk/README.md`、`PROJECT_COMPLETION_TRACKER.md` 同步新 browser/API 能力; +- 未新增控制按钮; +- 未在 browser/API 中执行 release gate 或 shell command; +- 未解析 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。 + +验证已通过(先行 targeted): + +```bash +wasm-port/tests/sdk/node/verify_sdk_surface.sh +wasm-port/tests/ui/node/verify_ini_panel_entry_docs.sh +wasm-port/tests/docs/node/verify_project_release_handoff_docs.sh +wasm-port/tests/ui/node/verify_ini_panel_shell_integration_manifest.sh +wasm-port/tests/ui/node/verify_ui_node_smokes.sh +SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_ini_panel_browser.sh +SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_release_artifact_url_workflow_browser.sh +``` + +关键输出: + +```text +sdk_surface_node_smoke=ok +ini_panel_entry_docs_node_smoke=ok +project_release_handoff_docs_node_smoke=ok +ini_panel_shell_integration_manifest_node_smoke=ok +ui_node_smokes=ok +browser_ini_shell_integration_workflow_smoke=ok +browser_release_artifact_url_workflow_smoke=ok +``` + +下一步工作计划: + +继续只做实质能力推进。优先选择可执行 gate、SDK/API surface、或真实 browser workflow; +不要做只整理断言或局部常量化的批次。 + 四十七、2026-06-16 继续执行记录:project release readiness artifact validation summary view-model API 本轮继续按“每批必须产出可调用 API、可验证 workflow、可执行 gate、或真实 UI/browser 能力”推进, diff --git a/wasm-port/docs/panel-entry.md b/wasm-port/docs/panel-entry.md index 07c4868..7e428ea 100644 --- a/wasm-port/docs/panel-entry.md +++ b/wasm-port/docs/panel-entry.md @@ -167,6 +167,10 @@ Use `loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl()` or `linuxCncIniPanelWorkflowOverviewApi.loadWorkflowOverviewReleaseReadinessArtifactUrl()` when the shell should fetch the artifact JSON URL, validate it, and optionally mount the render-state into caller-owned DOM without executing gates. +Use `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel()` or +`linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel()` +when the shell needs stable artifact validation status text and dashboard rows +without interpreting validation flags itself. Use `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel()`, `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState()`, `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomContract()`, diff --git a/wasm-port/runtime/sdk/README.md b/wasm-port/runtime/sdk/README.md index ea7f8d5..622efd0 100644 --- a/wasm-port/runtime/sdk/README.md +++ b/wasm-port/runtime/sdk/README.md @@ -45,6 +45,7 @@ import { createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomContract, createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomReadiness, createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState, + createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel, createLinuxCncIniSdk, createLinuxCncInterpSdk, createMachineSessionPersistenceDisplayViewModel, @@ -301,6 +302,7 @@ for external browser shells: optionally mount the resulting render-state into caller-owned DOM. `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel()`, `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState()`, + `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel()`, `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomContract()`, `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomReadiness()`, `renderIniPanelShellWorkflowOverviewReleaseReadinessArtifactState()`, and diff --git a/wasm-port/runtime/sdk/src/index.js b/wasm-port/runtime/sdk/src/index.js index e39f05b..3efe161 100644 --- a/wasm-port/runtime/sdk/src/index.js +++ b/wasm-port/runtime/sdk/src/index.js @@ -102,6 +102,7 @@ export { createIniPanelShellWorkflowOverviewEmbeddingMountRenderState, createIniPanelShellWorkflowOverviewEmbeddingRenderState, createIniPanelShellWorkflowOverviewEmbeddingReport, + createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel, createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel, createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomContract, createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomReadiness, diff --git a/wasm-port/runtime/ui/ini-panel/launch.html b/wasm-port/runtime/ui/ini-panel/launch.html index b51b0cb..95ace22 100644 --- a/wasm-port/runtime/ui/ini-panel/launch.html +++ b/wasm-port/runtime/ui/ini-panel/launch.html @@ -300,6 +300,9 @@ loadWorkflowOverviewReleaseReadinessArtifactUrl: (options) => ( shellViewModel.loadWorkflowOverviewReleaseReadinessArtifactUrl(options) ), + getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel: (validation) => ( + shellViewModel.createWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel(validation) + ), getWorkflowOverviewEmbeddingReport: (embeddingResult, contract) => ( shellViewModel.createWorkflowOverviewEmbeddingReport(embeddingResult, contract) ), diff --git a/wasm-port/runtime/ui/ini-panel/ui-shell.js b/wasm-port/runtime/ui/ini-panel/ui-shell.js index a3e6200..8205c8c 100644 --- a/wasm-port/runtime/ui/ini-panel/ui-shell.js +++ b/wasm-port/runtime/ui/ini-panel/ui-shell.js @@ -33,6 +33,7 @@ import { } from "./panel-state-summary.js"; import { createProjectReleaseReadinessArtifactValidation, + createProjectReleaseReadinessArtifactValidationSummaryViewModel, parseProjectReleaseReadinessArtifactJson, } from "../../sdk/src/project-release-readiness.js"; export { @@ -78,6 +79,7 @@ export { } from "./panel-state-summary.js"; export { createProjectReleaseReadinessArtifactValidation, + createProjectReleaseReadinessArtifactValidationSummaryViewModel, parseProjectReleaseReadinessArtifactJson, } from "../../sdk/src/project-release-readiness.js"; @@ -195,6 +197,7 @@ export function createIniPanelLaunchApiManifest(entries = getVisibleIniPanelEntr "getWorkflowOverviewReadiness", "mountWorkflowOverviewEmbedding", "loadWorkflowOverviewReleaseReadinessArtifactUrl", + "getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel", "getWorkflowOverviewEmbeddingReport", "getWorkflowOverviewEmbeddingDisplayViewModel", "getWorkflowOverviewEmbeddingRenderState", @@ -1876,6 +1879,7 @@ export function createIniPanelShellWorkflowOverviewContract() { "getWorkflowOverviewPersistenceSummary", "validateWorkflowOverviewReleaseReadinessArtifactJson", "loadWorkflowOverviewReleaseReadinessArtifactUrl", + "getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel", "getWorkflowOverviewReleaseReadinessArtifactDisplayViewModel", "getWorkflowOverviewReleaseReadinessArtifactRenderState", "getWorkflowOverviewReleaseReadinessArtifactDomContract", @@ -2058,6 +2062,14 @@ export function createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDispl }; } +export function createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel( + validation = validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson("{}"), +) { + return createProjectReleaseReadinessArtifactValidationSummaryViewModel( + validation?.validation ?? validation, + ); +} + export function createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState( displayViewModel = createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel(), ) { @@ -3270,6 +3282,8 @@ export function createIniPanelShellViewModel(entries = getVisibleIniPanelEntries mountShellSessionHandoffWorkflow: mountIniPanelShellSessionHandoffWorkflow, createWorkflowOverviewContract: createIniPanelShellWorkflowOverviewContract, createWorkflowOverviewReadiness: createIniPanelShellWorkflowOverviewReadiness, + createWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel: + createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel, loadWorkflowOverviewReleaseReadinessArtifactUrl: loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl, mountWorkflowOverviewEmbedding: mountIniPanelShellWorkflowOverviewEmbedding, diff --git a/wasm-port/runtime/ui/ini-panel/workflow-overview.html b/wasm-port/runtime/ui/ini-panel/workflow-overview.html index 9ce2b53..e876a66 100644 --- a/wasm-port/runtime/ui/ini-panel/workflow-overview.html +++ b/wasm-port/runtime/ui/ini-panel/workflow-overview.html @@ -107,6 +107,7 @@ mountIniPanelShellWorkflowOverviewEmbeddingMountState, validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson, loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl, + createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel, createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel, createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState, createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomContract, @@ -147,6 +148,9 @@ loadWorkflowOverviewReleaseReadinessArtifactUrl: (options) => ( loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl(options) ), + getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel: (validation) => ( + createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel(validation) + ), getWorkflowOverviewReleaseReadinessArtifactDisplayViewModel: (validation) => ( createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel(validation) ), 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 f8bd2fb..11b64cb 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 @@ -116,6 +116,7 @@ TOOL_TABLE = browser-shell-tool.tbl !launchApi?.getWorkflowOverviewReadiness || !launchApi?.mountWorkflowOverviewEmbedding || !launchApi?.loadWorkflowOverviewReleaseReadinessArtifactUrl || + !launchApi?.getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel || !launchApi?.getWorkflowOverviewEmbeddingReport || !launchApi?.getWorkflowOverviewEmbeddingDisplayViewModel || !launchApi?.getWorkflowOverviewEmbeddingRenderState || @@ -314,39 +315,18 @@ TOOL_TABLE = browser-shell-tool.tbl const workflowOverviewReadiness = launchApi.getWorkflowOverviewReadiness({ overviewApi: workflowOverviewApi, }); + const workflowOverviewReleaseArtifactJson = await fetch("../../tests/fixtures/project-release-readiness-ready.json") + .then((response) => response.text()); 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: 10 }, (_, index) => ({ id: `gate-${index}`, passed: true })), - rows: [ - { - id: "project-release-gate", - label: "Project release gate", - value: "passed", - }, - ], - })); + .validateWorkflowOverviewReleaseReadinessArtifactJson(workflowOverviewReleaseArtifactJson); + const workflowOverviewReleaseArtifactSummary = workflowOverviewApi + .getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel( + workflowOverviewReleaseArtifactValidation, + ); + const launchReleaseArtifactSummary = launchApi + .getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel( + workflowOverviewReleaseArtifactValidation, + ); const workflowOverviewReleaseArtifactDisplay = workflowOverviewApi .getWorkflowOverviewReleaseReadinessArtifactDisplayViewModel(workflowOverviewReleaseArtifactValidation); const workflowOverviewReleaseArtifactRenderState = workflowOverviewApi @@ -463,6 +443,16 @@ TOOL_TABLE = browser-shell-tool.tbl true, "shell workflow overview release artifact validation readiness", ); + assertEqual( + workflowOverviewReleaseArtifactSummary.statusLine, + "Ready: Artifact evidence complete", + "shell workflow overview release artifact validation summary", + ); + assertEqual( + launchReleaseArtifactSummary.statusLine, + workflowOverviewReleaseArtifactSummary.statusLine, + "launch release artifact validation summary", + ); assertEqual( workflowOverviewReleaseArtifactDomReadiness.ready, true, 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 354349e..5ebe4ec 100644 --- a/wasm-port/tests/browser/ini_panel_workflow_overview_smoke.html +++ b/wasm-port/tests/browser/ini_panel_workflow_overview_smoke.html @@ -36,6 +36,7 @@ !workflowApi?.getWorkflowOverviewPersistenceSummary || !workflowApi?.validateWorkflowOverviewReleaseReadinessArtifactJson || !workflowApi?.loadWorkflowOverviewReleaseReadinessArtifactUrl || + !workflowApi?.getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel || !workflowApi?.getWorkflowOverviewReleaseReadinessArtifactDisplayViewModel || !workflowApi?.getWorkflowOverviewReleaseReadinessArtifactRenderState || !workflowApi?.getWorkflowOverviewReleaseReadinessArtifactDomContract || @@ -70,38 +71,13 @@ 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: 10 }, (_, index) => ({ id: `gate-${index}`, passed: true })), - rows: [ - { - id: "project-release-gate", - label: "Project release gate", - value: "passed", - }, - ], - })); + const releaseArtifactJson = await fetch("../../tests/fixtures/project-release-readiness-ready.json") + .then((response) => response.text()); + const releaseArtifactValidation = workflowApi.validateWorkflowOverviewReleaseReadinessArtifactJson( + releaseArtifactJson, + ); + const releaseArtifactValidationSummary = workflowApi + .getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel(releaseArtifactValidation); const releaseArtifactDisplay = workflowApi.getWorkflowOverviewReleaseReadinessArtifactDisplayViewModel( releaseArtifactValidation, ); @@ -162,6 +138,11 @@ ); assertEqual(releaseArtifactValidation.ready, true, "workflow overview release artifact validation readiness"); assertEqual(releaseArtifactValidation.gateCount, 10, "workflow overview release artifact validation gates"); + assertEqual( + releaseArtifactValidationSummary.statusLine, + "Ready: Artifact evidence complete", + "workflow overview release artifact validation summary", + ); assertEqual(releaseArtifactDisplay.statusText, "Ready", "workflow overview release artifact display status"); assertEqual(releaseArtifactRenderState.statusLine, "Ready: No blocking reasons", "workflow overview release artifact render status"); assertEqual( @@ -278,9 +259,9 @@ }); assertEqual(releaseArtifactDomReadinessReady.ready, true, "workflow overview release artifact DOM readiness"); assertEqual(releaseArtifactRenderResult.rendered, true, "workflow overview release artifact render result"); - assertEqual(releaseArtifactRenderResult.rowCount, 3, "workflow overview release artifact render row count"); + assertEqual(releaseArtifactRenderResult.rowCount, 6, "workflow overview release artifact render row count"); assertEqual(releaseArtifactMountResult.ready, true, "workflow overview release artifact mount readiness"); - assertEqual(releaseArtifactMountResult.renderResult.rowCount, 3, "workflow overview release artifact mount rows"); + assertEqual(releaseArtifactMountResult.renderResult.rowCount, 6, "workflow overview release artifact mount rows"); assertEqual(releaseArtifactUrlWorkflow.ready, true, "workflow overview release artifact URL workflow readiness"); assertEqual(releaseArtifactUrlWorkflow.httpStatus, 200, "workflow overview release artifact URL workflow status"); assertEqual(releaseArtifactUrlWorkflow.mountResult.ready, true, "workflow overview release artifact URL workflow mount"); 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 3c3dfac..76d1edd 100644 --- a/wasm-port/tests/browser/release_artifact_url_workflow_smoke.html +++ b/wasm-port/tests/browser/release_artifact_url_workflow_smoke.html @@ -66,7 +66,7 @@ assertEqual(readyWorkflow.validation.gateCount, 10, "ready workflow gate count"); assertEqual(readyWorkflow.renderState.statusLine, "Ready: No blocking reasons", "ready workflow status"); assertEqual(readyWorkflow.mountResult.ready, true, "ready workflow mount readiness"); - assertEqual(readyWorkflow.mountResult.renderResult.rowCount, 3, "ready workflow mount rows"); + assertEqual(readyWorkflow.mountResult.renderResult.rowCount, 6, "ready workflow mount rows"); assertEqual( releaseArtifactStatus.textContent, "Ready: No blocking reasons", diff --git a/wasm-port/tests/sdk/node/verify_sdk_surface.mjs b/wasm-port/tests/sdk/node/verify_sdk_surface.mjs index 0ef0fc1..aa10f94 100644 --- a/wasm-port/tests/sdk/node/verify_sdk_surface.mjs +++ b/wasm-port/tests/sdk/node/verify_sdk_surface.mjs @@ -26,6 +26,7 @@ import { createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomContract, createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomReadiness, createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState, + createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel, createLinuxCncIniSdk, createLinuxCncInterpSdk, createMachineSessionSnapshotPayload, @@ -165,6 +166,10 @@ const requiredExports = [ "createIniPanelShellWorkflowOverviewEmbeddingMountDomReadiness", createIniPanelShellWorkflowOverviewEmbeddingMountDomReadiness, ], + [ + "createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel", + createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel, + ], [ "createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel", createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel, 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 367885b..468eb4c 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 @@ -164,6 +164,7 @@ const requiredShellExports = [ "mountIniPanelShellWorkflowOverviewEmbeddingMountState", "validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson", "loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl", + "createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel", "createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel", "createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState", "createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomContract", diff --git a/wasm-port/tests/ui/node/verify_ini_panel_launch_api_manifest.mjs b/wasm-port/tests/ui/node/verify_ini_panel_launch_api_manifest.mjs index 55a0867..6157f24 100644 --- a/wasm-port/tests/ui/node/verify_ini_panel_launch_api_manifest.mjs +++ b/wasm-port/tests/ui/node/verify_ini_panel_launch_api_manifest.mjs @@ -83,6 +83,7 @@ assert.deepEqual(manifest, { "getWorkflowOverviewReadiness", "mountWorkflowOverviewEmbedding", "loadWorkflowOverviewReleaseReadinessArtifactUrl", + "getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel", "getWorkflowOverviewEmbeddingReport", "getWorkflowOverviewEmbeddingDisplayViewModel", "getWorkflowOverviewEmbeddingRenderState", @@ -243,6 +244,7 @@ assert.match(launchText, /\bgetWorkflowOverviewContract\b/); assert.match(launchText, /\bgetWorkflowOverviewReadiness\b/); assert.match(launchText, /\bmountWorkflowOverviewEmbedding\b/); assert.match(launchText, /\bloadWorkflowOverviewReleaseReadinessArtifactUrl\b/); +assert.match(launchText, /\bgetWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel\b/); assert.match(launchText, /\bgetWorkflowOverviewEmbeddingReport\b/); assert.match(launchText, /\bgetWorkflowOverviewEmbeddingDisplayViewModel\b/); assert.match(launchText, /\bgetWorkflowOverviewEmbeddingRenderState\b/); 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 0b2c4f8..e1adac8 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 @@ -53,6 +53,7 @@ import { mountIniPanelShellWorkflowOverviewEmbeddingMountState, validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson, loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl, + createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel, createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel, createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState, createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomContract, @@ -187,7 +188,7 @@ assert.deepEqual(readiness, { counts: { pages: 3, launcherLinks: 3, - launchMethods: 59, + launchMethods: 60, controlPageMethods: 11, persistenceCapabilities: 3, }, @@ -250,7 +251,7 @@ assert.deepEqual(handoffSummary, { counts: { pages: 3, launcherLinks: 3, - launchMethods: 59, + launchMethods: 60, controlPageMethods: 11, persistenceCapabilities: 3, }, @@ -790,6 +791,7 @@ assert.deepEqual(createIniPanelShellWorkflowOverviewContract(), { "getWorkflowOverviewPersistenceSummary", "validateWorkflowOverviewReleaseReadinessArtifactJson", "loadWorkflowOverviewReleaseReadinessArtifactUrl", + "getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel", "getWorkflowOverviewReleaseReadinessArtifactDisplayViewModel", "getWorkflowOverviewReleaseReadinessArtifactRenderState", "getWorkflowOverviewReleaseReadinessArtifactDomContract", @@ -835,6 +837,7 @@ assert.equal(typeof renderIniPanelShellWorkflowOverviewEmbeddingMountState, "fun assert.equal(typeof mountIniPanelShellWorkflowOverviewEmbeddingMountState, "function"); assert.equal(typeof validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson, "function"); assert.equal(typeof loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl, "function"); +assert.equal(typeof createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel, "function"); assert.equal(typeof createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel, "function"); assert.equal(typeof createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState, "function"); assert.equal(typeof createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomContract, "function"); @@ -845,6 +848,10 @@ assert.equal( validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson("{}").apiName, "ini-panel-shell-workflow-overview-release-readiness-artifact-validation", ); +assert.equal( + createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel().phase, + "blocked", +); assert.deepEqual( createIniPanelShellWorkflowOverviewReadiness({ overviewApi: { @@ -859,6 +866,7 @@ assert.deepEqual( "getWorkflowOverviewPersistenceSummary", "validateWorkflowOverviewReleaseReadinessArtifactJson", "loadWorkflowOverviewReleaseReadinessArtifactUrl", + "getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel", "getWorkflowOverviewReleaseReadinessArtifactDisplayViewModel", "getWorkflowOverviewReleaseReadinessArtifactRenderState", "getWorkflowOverviewReleaseReadinessArtifactDomContract", @@ -1284,7 +1292,7 @@ assert.deepEqual(createIniPanelShellIntegrationReadiness(blockedManifest), { counts: { pages: 3, launcherLinks: 3, - launchMethods: 59, + launchMethods: 60, controlPageMethods: 11, persistenceCapabilities: 3, }, 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 ba50a51..58f9916 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 @@ -58,6 +58,7 @@ import { mountIniPanelShellWorkflowOverviewEmbeddingMountState, validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson, loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl, + createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel, createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel, createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState, createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomContract, @@ -689,6 +690,7 @@ assert.deepEqual(shellViewModel.shellWorkflowOverviewContract, { "getWorkflowOverviewPersistenceSummary", "validateWorkflowOverviewReleaseReadinessArtifactJson", "loadWorkflowOverviewReleaseReadinessArtifactUrl", + "getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel", "getWorkflowOverviewReleaseReadinessArtifactDisplayViewModel", "getWorkflowOverviewReleaseReadinessArtifactRenderState", "getWorkflowOverviewReleaseReadinessArtifactDomContract", @@ -1303,6 +1305,19 @@ assert.equal( assert.equal(releaseArtifactValidation.ready, true); assert.equal(releaseArtifactValidation.validation.ready, true); assert.equal(releaseArtifactValidation.gateCount, 10); +const releaseArtifactValidationSummary = + createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel( + releaseArtifactValidation, + ); +assert.equal( + releaseArtifactValidationSummary.apiName, + "project-release-readiness-artifact-validation-summary-view-model", +); +assert.equal(releaseArtifactValidationSummary.statusLine, "Ready: Artifact evidence complete"); +assert.equal( + createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel().phase, + "blocked", +); const releaseArtifactDisplay = createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel( releaseArtifactValidation, ); @@ -1428,6 +1443,7 @@ const workflowOverviewApi = { getWorkflowOverviewPersistenceSummary: () => shellViewModel.shellPersistenceSummary, validateWorkflowOverviewReleaseReadinessArtifactJson: () => ({ ready: true }), loadWorkflowOverviewReleaseReadinessArtifactUrl: loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl, + getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel: () => releaseArtifactValidationSummary, getWorkflowOverviewReleaseReadinessArtifactDisplayViewModel: () => releaseArtifactDisplay, getWorkflowOverviewReleaseReadinessArtifactRenderState: () => releaseArtifactRenderState, getWorkflowOverviewReleaseReadinessArtifactDomContract: createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomContract,