diff --git a/wasm-port/runtime/sdk/src/project-release-readiness.js b/wasm-port/runtime/sdk/src/project-release-readiness.js index a279b0b..65e0b9a 100644 --- a/wasm-port/runtime/sdk/src/project-release-readiness.js +++ b/wasm-port/runtime/sdk/src/project-release-readiness.js @@ -2562,6 +2562,9 @@ export function createProjectReleaseReadinessArtifactUrlWorkflowSummaryViewModel const missing = arrayOrEmpty(workflow?.missing); const promotionCandidateSummary = objectOrEmpty(workflow?.diagnosticsArtifact?.virtualHalPromotionCandidateSummary); const promotionCandidateSummaryReady = promotionCandidateSummary.ready === true; + const validationRows = arrayOrEmpty(workflow?.validation?.rows); + const hardBlockRuntimeLock = validationRows.find(({ id }) => id === "hard-block-runtime-lock")?.value; + const promotedBlockedFamilyCount = validationRows.find(({ id }) => id === "promoted-blocked-family-count")?.value; const ready = workflow?.ready === true; const statusText = ready ? "Ready" : "Blocked"; const detailText = ready @@ -2671,6 +2674,16 @@ export function createProjectReleaseReadinessArtifactUrlWorkflowSummaryViewModel label: "Candidate inventory baseline", value: promotionCandidateSummary.inventoryBaseline ?? "not provided", }, + { + id: "hard-block-runtime-lock", + label: "Hard-block runtime lock", + value: hardBlockRuntimeLock ?? "not provided", + }, + { + id: "promoted-blocked-family-count", + label: "Promoted blocked families", + value: promotedBlockedFamilyCount ?? "not provided", + }, { id: "saved-session-diagnostics", label: "Saved-session diagnostics", diff --git a/wasm-port/runtime/ui/ini-panel/ui-shell.js b/wasm-port/runtime/ui/ini-panel/ui-shell.js index 5142491..68de1ff 100644 --- a/wasm-port/runtime/ui/ini-panel/ui-shell.js +++ b/wasm-port/runtime/ui/ini-panel/ui-shell.js @@ -2557,6 +2557,11 @@ export function createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWo ?? {} ); const promotionCandidateSummaryReady = promotionCandidateSummary.ready === true; + const validationRows = Array.isArray(workflow?.validation?.rows) + ? workflow.validation.rows + : (Array.isArray(workflow?.validation?.validation?.rows) ? workflow.validation.validation.rows : []); + const hardBlockRuntimeLock = validationRows.find(({ id }) => id === "hard-block-runtime-lock")?.value; + const promotedBlockedFamilyCount = validationRows.find(({ id }) => id === "promoted-blocked-family-count")?.value; const ready = workflow?.ready === true; const promotionFamilyRows = ( workflow?.validation?.virtualHalPromotionFamilyRows @@ -2660,6 +2665,16 @@ export function createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWo label: "Candidate inventory baseline", value: promotionCandidateSummary.inventoryBaseline ?? "not provided", }, + { + id: "hard-block-runtime-lock", + label: "Hard-block runtime lock", + value: hardBlockRuntimeLock ?? "not provided", + }, + { + id: "promoted-blocked-family-count", + label: "Promoted blocked families", + value: promotedBlockedFamilyCount ?? "not provided", + }, { id: "virtual-hal-promotion-families", label: "Virtual HAL promotion families", 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 b7b4b4a..7cea3f0 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 @@ -981,9 +981,14 @@ TOOL_TABLE = browser-shell-tool.tbl ); assertEqual( workflowOverviewReleaseArtifactUrlWorkflowRenderResult.rowCount, - 8, + 10, "shell workflow overview release artifact URL workflow render rows", ); + assertEqual( + workflowOverviewReleaseArtifactUrlWorkflowRenderResult.rowIds.includes("hard-block-runtime-lock"), + true, + "shell workflow overview release artifact URL workflow hard-block lock row", + ); assertEqual( workflowOverviewReleaseArtifactUrlWorkflowRenderResult.rowIds.includes("mount-result"), 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 51b3cc4..d04976e 100644 --- a/wasm-port/tests/browser/ini_panel_workflow_overview_smoke.html +++ b/wasm-port/tests/browser/ini_panel_workflow_overview_smoke.html @@ -597,7 +597,7 @@ ); assertEqual( releaseArtifactUrlWorkflowRenderResult.rowCount, - 21, + 23, "workflow overview release artifact URL workflow render rows", ); assertEqual( @@ -650,6 +650,16 @@ "executed=28 passed=28 skipped=131 unexpected_fail=0", "workflow overview release artifact URL workflow candidate baseline", ); + assertEqual( + releaseArtifactUrlWorkflowSummary.rows.find(({ id }) => id === "hard-block-runtime-lock")?.value, + "locked (3 families)", + "workflow overview release artifact URL workflow hard-block lock", + ); + assertEqual( + releaseArtifactUrlWorkflowSummary.rows.find(({ id }) => id === "promoted-blocked-family-count")?.value, + "0 promoted", + "workflow overview release artifact URL workflow promoted blocked count", + ); assertEqual( releaseArtifactUrlWorkflowRenderResult.rowIds.includes("saved-session-diagnostics"), true, diff --git a/wasm-port/tests/sdk/node/verify_project_release_artifact_url_workflow.mjs b/wasm-port/tests/sdk/node/verify_project_release_artifact_url_workflow.mjs index 7314e4c..aa7c266 100644 --- a/wasm-port/tests/sdk/node/verify_project_release_artifact_url_workflow.mjs +++ b/wasm-port/tests/sdk/node/verify_project_release_artifact_url_workflow.mjs @@ -178,6 +178,14 @@ assert.equal( readySummary.rows.find(({ id }) => id === "virtual-hal-promotion-candidate-baseline")?.value, "executed=28 passed=28 skipped=131 unexpected_fail=0", ); +assert.equal( + readySummary.rows.find(({ id }) => id === "hard-block-runtime-lock")?.value, + "locked (3 families)", +); +assert.equal( + readySummary.rows.find(({ id }) => id === "promoted-blocked-family-count")?.value, + "0 promoted", +); assert.deepEqual( readySummary.rows .filter(({ id }) => expectedPromotionFamilyRows.some(([familyId]) => familyId === id)) @@ -206,6 +214,8 @@ assert.deepEqual( ["virtual-hal-promotion-source-file-count", "17 source files"], ["virtual-hal-promotion-browser-diagnostics-count", "8 diagnostics-ready"], ["virtual-hal-promotion-candidate-baseline", "executed=28 passed=28 skipped=131 unexpected_fail=0"], + ["hard-block-runtime-lock", "locked (3 families)"], + ["promoted-blocked-family-count", "0 promoted"], ["saved-session-diagnostics", "ready"], ["next-command", "none"], ["missing", "none"], 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 6c7e6a5..c9d05b0 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 @@ -471,6 +471,8 @@ assert.deepEqual( ["virtual-hal-promotion-source-file-count", "not provided"], ["virtual-hal-promotion-browser-diagnostics-count", "not provided"], ["virtual-hal-promotion-candidate-baseline", "not provided"], + ["hard-block-runtime-lock", "locked (3 families)"], + ["promoted-blocked-family-count", "0 promoted"], ["saved-session-diagnostics", "not requested"], ["next-command", "none"], ["missing", "none"], 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 5e6a5bc..2a03cfe 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 @@ -1797,7 +1797,7 @@ const releaseArtifactMountResult = mountIniPanelShellWorkflowOverviewReleaseRead rowsNode: releaseArtifactRowsNode, }); assert.equal(releaseArtifactRenderResult.rendered, true); -assert.equal(releaseArtifactRenderResult.rowCount, 17); +assert.equal(releaseArtifactRenderResult.rowCount, 20); assert.equal(releaseArtifactRenderResult.dataset.handoffScope, "workflow-overview-release-readiness-artifact"); assert.equal( releaseArtifactRenderResult.rowIds.includes("gate-execution-manifest"), @@ -1828,7 +1828,7 @@ assert.equal( true, ); assert.equal(releaseArtifactMountResult.ready, true); -assert.equal(releaseArtifactMountResult.renderResult.rowCount, 17); +assert.equal(releaseArtifactMountResult.renderResult.rowCount, 20); assert.deepEqual( validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson("{").missing, ["artifact-json"], @@ -1887,7 +1887,7 @@ assert.equal( ); assert.equal(releaseArtifactUrlWorkflow.renderState.statusLine, "Ready: No blocking reasons"); assert.equal(releaseArtifactUrlWorkflow.mountResult.ready, true); -assert.equal(releaseArtifactUrlWorkflow.mountResult.renderResult.rowCount, 17); +assert.equal(releaseArtifactUrlWorkflow.mountResult.renderResult.rowCount, 20); const releaseArtifactUrlWorkflowSummary = createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel( releaseArtifactUrlWorkflow, @@ -1955,6 +1955,14 @@ assert.equal( releaseArtifactUrlWorkflowSummary.rows.find(({ id }) => id === "virtual-hal-promotion-candidate-baseline")?.value, "executed=28 passed=28 skipped=131 unexpected_fail=0", ); +assert.equal( + releaseArtifactUrlWorkflowSummary.rows.find(({ id }) => id === "hard-block-runtime-lock")?.value, + "locked (3 families)", +); +assert.equal( + releaseArtifactUrlWorkflowSummary.rows.find(({ id }) => id === "promoted-blocked-family-count")?.value, + "0 promoted", +); const promotionCandidateDrilldownViewModel = createIniPanelShellWorkflowOverviewPromotionCandidateDrilldownViewModel( releaseArtifactUrlWorkflowSummary, @@ -2577,7 +2585,7 @@ const releaseArtifactUrlWorkflowMountResult = rowsNode: releaseArtifactUrlWorkflowRowsNode, }); assert.equal(releaseArtifactUrlWorkflowRenderResult.rendered, true); -assert.equal(releaseArtifactUrlWorkflowRenderResult.rowCount, 25); +assert.equal(releaseArtifactUrlWorkflowRenderResult.rowCount, 27); assert.equal( releaseArtifactUrlWorkflowRenderResult.rowIds.includes("browser-diagnostics"), true, @@ -2595,7 +2603,7 @@ assert.equal( true, ); assert.equal(releaseArtifactUrlWorkflowMountResult.ready, true); -assert.equal(releaseArtifactUrlWorkflowMountResult.renderResult.rowCount, 25); +assert.equal(releaseArtifactUrlWorkflowMountResult.renderResult.rowCount, 27); const releaseArtifactUrlWorkflowMissingDom = await loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl({ artifactUrl: "/project-release-readiness.json", fetchRef: async () => ({