From eb2fc22129a0504aa6fb03333a056039e8ed3d1f Mon Sep 17 00:00:00 2001 From: wangdequan Date: Thu, 18 Jun 2026 17:44:45 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BC=BA=E5=8C=96hard=20block=E9=94=81?= =?UTF-8?q?=E5=AE=9A=E5=8F=AF=E8=A7=81=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 结论:release readiness 现显式展示 hard-block runtime lock 和 promoted blocked family count;baseline 保持 28/28/131/0,Python remap、tool DB、external user-M 仍 locked。 --- .../sdk/src/project-release-readiness.js | 59 +++++++++++++++++- .../project-release-readiness-ready.json | 62 ++++++++++++++++++- ...ify_project_release_readiness_artifact.mjs | 8 +++ .../verify_project_release_gate_manifest.mjs | 10 +++ .../tests/sdk/node/verify_sdk_surface.mjs | 30 +++++++++ 5 files changed, 165 insertions(+), 4 deletions(-) diff --git a/wasm-port/runtime/sdk/src/project-release-readiness.js b/wasm-port/runtime/sdk/src/project-release-readiness.js index a8f99e8..a279b0b 100644 --- a/wasm-port/runtime/sdk/src/project-release-readiness.js +++ b/wasm-port/runtime/sdk/src/project-release-readiness.js @@ -132,6 +132,15 @@ function createPromotionFamilySummaryRows(candidateReport = {}) { }); } +function createHardBlockRuntimeLockSummary(blockedFamilies = [], promotedBlockedFamilies = []) { + const blockedCount = arrayOrEmpty(blockedFamilies).length; + const promotedCount = arrayOrEmpty(promotedBlockedFamilies).length; + return { + lockValue: promotedCount === 0 ? `locked (${blockedCount} families)` : `violated (${promotedCount} promoted)`, + promotedCountValue: `${promotedCount} promoted`, + }; +} + const BLOCKED_RUNTIME_FAMILIES = [ "L4-USER-M-PROCESS", "L4-TOOL-DB", @@ -1854,6 +1863,7 @@ export function createProjectReleaseReadinessReport({ virtualHalMotionControllerMatrix, ); const blockedRuntimeReady = promotedBlockedFamilies.length === 0; + const hardBlockRuntimeLockSummary = createHardBlockRuntimeLockSummary(blockedFamilies, promotedBlockedFamilies); const axisScreenshotArtifactSummary = createAxisScreenshotArtifactSummary(axisScreenshotArtifacts); const axisScreenshotArtifactsReady = axisScreenshotArtifactSummary.ready; const ready = releaseGatePassed && @@ -1954,6 +1964,16 @@ export function createProjectReleaseReadinessReport({ label: "Blocked runtime families", value: blockedRuntimeReady ? blockedFamilies.join(", ") : `promoted: ${promotedBlockedFamilies.join(", ")}`, }, + { + id: "hard-block-runtime-lock", + label: "Hard-block runtime lock", + value: hardBlockRuntimeLockSummary.lockValue, + }, + { + id: "promoted-blocked-family-count", + label: "Promoted blocked families", + value: hardBlockRuntimeLockSummary.promotedCountValue, + }, { id: "axis-screenshot-artifacts", label: "AXIS screenshot artifacts", @@ -1978,6 +1998,10 @@ export function createProjectReleaseReadinessSummaryViewModel( const axisScreenshotArtifactSummary = objectOrEmpty(report?.axisScreenshotArtifactSummary); const blockedRuntimeFamilies = arrayOrEmpty(report?.blockedRuntimeFamilies); const promotedBlockedFamilies = arrayOrEmpty(report?.promotedBlockedFamilies); + const hardBlockRuntimeLockSummary = createHardBlockRuntimeLockSummary( + blockedRuntimeFamilies, + promotedBlockedFamilies, + ); const ready = report?.ready === true; const statusText = ready ? "Ready" : "Waiting"; const detailText = ready ? "No blocking reasons" : (missing.length > 0 ? missing.join(", ") : "release evidence missing"); @@ -2033,6 +2057,16 @@ export function createProjectReleaseReadinessSummaryViewModel( ? `promoted: ${promotedBlockedFamilies.join(", ")}` : (blockedRuntimeFamilies.join(", ") || "none"), }, + { + id: "hard-block-runtime-lock", + label: "Hard-block runtime lock", + value: hardBlockRuntimeLockSummary.lockValue, + }, + { + id: "promoted-blocked-family-count", + label: "Promoted blocked families", + value: hardBlockRuntimeLockSummary.promotedCountValue, + }, { id: "axis-screenshot-artifacts", label: "AXIS screenshot artifacts", @@ -2819,6 +2853,12 @@ export function createProjectReleaseReadinessArtifactValidation(artifact = {}) { virtualHalMotionControllerMatrix, ) && artifactObject.virtualHalMotionControllerMatrixReady === true; const axisScreenshotArtifacts = arrayOrEmpty(axisScreenshotArtifactSummary.artifacts); + const blockedRuntimeFamilies = arrayOrEmpty(artifactObject.blockedRuntimeFamilies); + const promotedBlockedFamilies = arrayOrEmpty(artifactObject.promotedBlockedFamilies); + const hardBlockRuntimeLockSummary = createHardBlockRuntimeLockSummary( + blockedRuntimeFamilies, + promotedBlockedFamilies, + ); const axisScreenshotSummaryReady = !axisScreenshotArtifactSummary.apiName || axisScreenshotArtifacts.length === 0 || ( @@ -2900,7 +2940,7 @@ export function createProjectReleaseReadinessArtifactValidation(artifact = {}) { virtualHalMotionControllerMatrixReady, axisScreenshotArtifactSummaryReady: axisScreenshotSummaryReady, axisScreenshotArtifactCount: axisScreenshotArtifacts.length, - blockedRuntimeFamilies: arrayOrEmpty(artifactObject.blockedRuntimeFamilies), + blockedRuntimeFamilies, rows: [ { id: "artifact", @@ -2968,6 +3008,23 @@ export function createProjectReleaseReadinessArtifactValidation(artifact = {}) { label: "Virtual HAL motion controller matrix", value: virtualHalMotionControllerMatrixReady ? "ready" : "missing", }, + { + id: "blocked-runtime-families", + label: "Blocked runtime families", + value: promotedBlockedFamilies.length > 0 + ? `promoted: ${promotedBlockedFamilies.join(", ")}` + : (blockedRuntimeFamilies.join(", ") || "none"), + }, + { + id: "hard-block-runtime-lock", + label: "Hard-block runtime lock", + value: hardBlockRuntimeLockSummary.lockValue, + }, + { + id: "promoted-blocked-family-count", + label: "Promoted blocked families", + value: hardBlockRuntimeLockSummary.promotedCountValue, + }, { id: "axis-screenshot-artifacts", label: "AXIS screenshot artifacts", diff --git a/wasm-port/tests/fixtures/project-release-readiness-ready.json b/wasm-port/tests/fixtures/project-release-readiness-ready.json index 71a599f..3c3e2be 100644 --- a/wasm-port/tests/fixtures/project-release-readiness-ready.json +++ b/wasm-port/tests/fixtures/project-release-readiness-ready.json @@ -662,6 +662,20 @@ "id": "qtdragon-on-abort", "label": "qtdragon-on-abort", "value": "6/6 ready; sources=12; diagnostics=ready", + "sourceFiles": [ + "linuxcnc/configs/sim/qtdragon/qtdragon_multi_joint/qtdragon_xyyz.ini", + "linuxcnc/configs/sim/qtdragon/qtdragon_multi_joint/on_abort.ngc", + "linuxcnc/configs/sim/qtdragon/qtdragon_xyz/qtdragon_inch.ini", + "linuxcnc/configs/sim/qtdragon/qtdragon_xyz/on_abort.ngc", + "linuxcnc/configs/sim/qtdragon/qtdragon_xyz45/qtdragon_xyza.ini", + "linuxcnc/configs/sim/qtdragon/qtdragon_xyz45/on_abort.ngc", + "linuxcnc/configs/sim/qtdragon_hd/qtdragon_hd_xyz/qtdragon_hd_vertical.ini", + "linuxcnc/configs/sim/qtdragon_hd/qtdragon_hd_xyz/on_abort.ngc", + "linuxcnc/configs/sim/qtdragon_hd/qtdragon_hd_z_compensation/qtdragon_hd_z_compensation.ini", + "linuxcnc/configs/sim/qtdragon_hd/qtdragon_hd_z_compensation/on_abort.ngc", + "linuxcnc/configs/sim/qtvcp_screens/qtdragon/qtdragon_mpg.ini", + "linuxcnc/configs/sim/qtvcp_screens/qtdragon/on_abort.ngc" + ], "candidateCount": 6, "completeCount": 6, "sourceFileCount": 12, @@ -672,6 +686,11 @@ "id": "vismach-remap-sims", "label": "vismach-remap-sims", "value": "1/1 ready; sources=3; diagnostics=ready", + "sourceFiles": [ + "linuxcnc/configs/sim/axis/vismach/puma/puma.ini", + "linuxcnc/configs/sim/axis/vismach/puma/puma_seam_weld.ngc", + "linuxcnc/configs/sim/axis/vismach/puma/remap_subs/428remap.ngc" + ], "candidateCount": 1, "completeCount": 1, "sourceFileCount": 3, @@ -682,6 +701,10 @@ "id": "rose-engine-rcone-demo", "label": "rose-engine-rcone-demo", "value": "1/1 ready; sources=2; diagnostics=ready", + "sourceFiles": [ + "linuxcnc/configs/sim/axis/rose_engine/rose_engine.ini", + "linuxcnc/configs/sim/axis/rose_engine/rcone_demo.ngc" + ], "candidateCount": 1, "completeCount": 1, "sourceFileCount": 2, @@ -2273,17 +2296,40 @@ { "id": "virtual-hal-promotion-family-qtdragon-on-abort", "label": "Promotion family qtdragon-on-abort", - "value": "6/6 ready; sources=12; diagnostics=ready" + "value": "6/6 ready; sources=12; diagnostics=ready", + "sourceFiles": [ + "linuxcnc/configs/sim/qtdragon/qtdragon_multi_joint/qtdragon_xyyz.ini", + "linuxcnc/configs/sim/qtdragon/qtdragon_multi_joint/on_abort.ngc", + "linuxcnc/configs/sim/qtdragon/qtdragon_xyz/qtdragon_inch.ini", + "linuxcnc/configs/sim/qtdragon/qtdragon_xyz/on_abort.ngc", + "linuxcnc/configs/sim/qtdragon/qtdragon_xyz45/qtdragon_xyza.ini", + "linuxcnc/configs/sim/qtdragon/qtdragon_xyz45/on_abort.ngc", + "linuxcnc/configs/sim/qtdragon_hd/qtdragon_hd_xyz/qtdragon_hd_vertical.ini", + "linuxcnc/configs/sim/qtdragon_hd/qtdragon_hd_xyz/on_abort.ngc", + "linuxcnc/configs/sim/qtdragon_hd/qtdragon_hd_z_compensation/qtdragon_hd_z_compensation.ini", + "linuxcnc/configs/sim/qtdragon_hd/qtdragon_hd_z_compensation/on_abort.ngc", + "linuxcnc/configs/sim/qtvcp_screens/qtdragon/qtdragon_mpg.ini", + "linuxcnc/configs/sim/qtvcp_screens/qtdragon/on_abort.ngc" + ] }, { "id": "virtual-hal-promotion-family-vismach-remap-sims", "label": "Promotion family vismach-remap-sims", - "value": "1/1 ready; sources=3; diagnostics=ready" + "value": "1/1 ready; sources=3; diagnostics=ready", + "sourceFiles": [ + "linuxcnc/configs/sim/axis/vismach/puma/puma.ini", + "linuxcnc/configs/sim/axis/vismach/puma/puma_seam_weld.ngc", + "linuxcnc/configs/sim/axis/vismach/puma/remap_subs/428remap.ngc" + ] }, { "id": "virtual-hal-promotion-family-rose-engine-rcone-demo", "label": "Promotion family rose-engine-rcone-demo", - "value": "1/1 ready; sources=2; diagnostics=ready" + "value": "1/1 ready; sources=2; diagnostics=ready", + "sourceFiles": [ + "linuxcnc/configs/sim/axis/rose_engine/rose_engine.ini", + "linuxcnc/configs/sim/axis/rose_engine/rcone_demo.ngc" + ] }, { "id": "virtual-hal-sim-config-macro-load-fixtures", @@ -2300,6 +2346,16 @@ "label": "Blocked runtime families", "value": "L4-USER-M-PROCESS, L4-TOOL-DB, L4-PYTHON-REMAP" }, + { + "id": "hard-block-runtime-lock", + "label": "Hard-block runtime lock", + "value": "locked (3 families)" + }, + { + "id": "promoted-blocked-family-count", + "label": "Promoted blocked families", + "value": "0 promoted" + }, { "id": "axis-screenshot-artifacts", "label": "AXIS screenshot artifacts", diff --git a/wasm-port/tests/host/verify_project_release_readiness_artifact.mjs b/wasm-port/tests/host/verify_project_release_readiness_artifact.mjs index 23db72b..e616139 100644 --- a/wasm-port/tests/host/verify_project_release_readiness_artifact.mjs +++ b/wasm-port/tests/host/verify_project_release_readiness_artifact.mjs @@ -96,6 +96,14 @@ assert.equal( ), true, ); +assert.equal( + artifact.rows.find(({ id }) => id === "hard-block-runtime-lock")?.value, + "locked (3 families)", +); +assert.equal( + artifact.rows.find(({ id }) => id === "promoted-blocked-family-count")?.value, + "0 promoted", +); assert.equal(artifact.virtualHalSimConfigMacroLoadFixtures.apiName, "linuxcnc-wasm-virtual-hal-sim-config-macro-load-fixture-report"); assert.equal(artifact.virtualHalSimConfigMacroLoadFixtures.complete, true); assert.equal(artifact.virtualHalSimConfigMacroLoadFixturesReady, true); 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 1157280..6c7e6a5 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 @@ -286,6 +286,16 @@ assert.deepEqual(createProjectReleaseReadinessSummaryViewModel(report), { label: "Blocked runtime families", value: "L4-USER-M-PROCESS, L4-TOOL-DB, L4-PYTHON-REMAP", }, + { + id: "hard-block-runtime-lock", + label: "Hard-block runtime lock", + value: "locked (3 families)", + }, + { + id: "promoted-blocked-family-count", + label: "Promoted blocked families", + value: "0 promoted", + }, { id: "axis-screenshot-artifacts", label: "AXIS screenshot artifacts", diff --git a/wasm-port/tests/sdk/node/verify_sdk_surface.mjs b/wasm-port/tests/sdk/node/verify_sdk_surface.mjs index 901d7d4..43366d4 100644 --- a/wasm-port/tests/sdk/node/verify_sdk_surface.mjs +++ b/wasm-port/tests/sdk/node/verify_sdk_surface.mjs @@ -1474,6 +1474,14 @@ assert.equal( releaseReadinessWaiting.rows.find(({ id }) => id === "blocked-runtime-families")?.value, "L4-USER-M-PROCESS, L4-TOOL-DB, L4-PYTHON-REMAP", ); +assert.equal( + releaseReadinessWaiting.rows.find(({ id }) => id === "hard-block-runtime-lock")?.value, + "locked (3 families)", +); +assert.equal( + releaseReadinessWaiting.rows.find(({ id }) => id === "promoted-blocked-family-count")?.value, + "0 promoted", +); const releaseReadinessReady = createProjectReleaseReadinessReport({ observedOutputs: ["project_release_gate=ok"], virtualHalSimConfigSourceCoverage: simConfigSourceCoverageReport, @@ -1652,6 +1660,21 @@ assert.deepEqual(releaseReadinessArtifactValidation, { label: "Virtual HAL motion controller matrix", value: "ready", }, + { + id: "blocked-runtime-families", + label: "Blocked runtime families", + value: "L4-USER-M-PROCESS, L4-TOOL-DB, L4-PYTHON-REMAP", + }, + { + id: "hard-block-runtime-lock", + label: "Hard-block runtime lock", + value: "locked (3 families)", + }, + { + id: "promoted-blocked-family-count", + label: "Promoted blocked families", + value: "0 promoted", + }, { id: "axis-screenshot-artifacts", label: "AXIS screenshot artifacts", @@ -1892,6 +1915,13 @@ assert.equal( }).missing.includes("blocked-runtime-families"), true, ); +assert.equal( + createProjectReleaseReadinessSummaryViewModel(createProjectReleaseReadinessReport({ + observedOutputs: ["project_release_gate=ok"], + promotedRuntimeFamilies: ["L4-TOOL-DB"], + })).rows.find(({ id }) => id === "hard-block-runtime-lock")?.value, + "violated (1 promoted)", +); assert.deepEqual(getIniPanelEntryManifest(), INI_PANEL_ENTRIES); assert.deepEqual(getVisibleIniPanelEntries(), INI_PANEL_ENTRIES);