展示URL工作流hard block锁

结论:release URL workflow 已展示 hard-block runtime lock 与 promoted blocked family count;baseline 保持 28/28/131/0,Python remap、tool DB、external user-M 仍 locked。
This commit is contained in:
2026-06-18 17:51:53 +08:00
parent eb2fc22129
commit f2cc1e4c57
7 changed files with 70 additions and 7 deletions

View File

@@ -2562,6 +2562,9 @@ export function createProjectReleaseReadinessArtifactUrlWorkflowSummaryViewModel
const missing = arrayOrEmpty(workflow?.missing); const missing = arrayOrEmpty(workflow?.missing);
const promotionCandidateSummary = objectOrEmpty(workflow?.diagnosticsArtifact?.virtualHalPromotionCandidateSummary); const promotionCandidateSummary = objectOrEmpty(workflow?.diagnosticsArtifact?.virtualHalPromotionCandidateSummary);
const promotionCandidateSummaryReady = promotionCandidateSummary.ready === true; 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 ready = workflow?.ready === true;
const statusText = ready ? "Ready" : "Blocked"; const statusText = ready ? "Ready" : "Blocked";
const detailText = ready const detailText = ready
@@ -2671,6 +2674,16 @@ export function createProjectReleaseReadinessArtifactUrlWorkflowSummaryViewModel
label: "Candidate inventory baseline", label: "Candidate inventory baseline",
value: promotionCandidateSummary.inventoryBaseline ?? "not provided", 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", id: "saved-session-diagnostics",
label: "Saved-session diagnostics", label: "Saved-session diagnostics",

View File

@@ -2557,6 +2557,11 @@ export function createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWo
?? {} ?? {}
); );
const promotionCandidateSummaryReady = promotionCandidateSummary.ready === true; 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 ready = workflow?.ready === true;
const promotionFamilyRows = ( const promotionFamilyRows = (
workflow?.validation?.virtualHalPromotionFamilyRows workflow?.validation?.virtualHalPromotionFamilyRows
@@ -2660,6 +2665,16 @@ export function createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWo
label: "Candidate inventory baseline", label: "Candidate inventory baseline",
value: promotionCandidateSummary.inventoryBaseline ?? "not provided", 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", id: "virtual-hal-promotion-families",
label: "Virtual HAL promotion families", label: "Virtual HAL promotion families",

View File

@@ -981,9 +981,14 @@ TOOL_TABLE = browser-shell-tool.tbl
); );
assertEqual( assertEqual(
workflowOverviewReleaseArtifactUrlWorkflowRenderResult.rowCount, workflowOverviewReleaseArtifactUrlWorkflowRenderResult.rowCount,
8, 10,
"shell workflow overview release artifact URL workflow render rows", "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( assertEqual(
workflowOverviewReleaseArtifactUrlWorkflowRenderResult.rowIds.includes("mount-result"), workflowOverviewReleaseArtifactUrlWorkflowRenderResult.rowIds.includes("mount-result"),
true, true,

View File

@@ -597,7 +597,7 @@
); );
assertEqual( assertEqual(
releaseArtifactUrlWorkflowRenderResult.rowCount, releaseArtifactUrlWorkflowRenderResult.rowCount,
21, 23,
"workflow overview release artifact URL workflow render rows", "workflow overview release artifact URL workflow render rows",
); );
assertEqual( assertEqual(
@@ -650,6 +650,16 @@
"executed=28 passed=28 skipped=131 unexpected_fail=0", "executed=28 passed=28 skipped=131 unexpected_fail=0",
"workflow overview release artifact URL workflow candidate baseline", "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( assertEqual(
releaseArtifactUrlWorkflowRenderResult.rowIds.includes("saved-session-diagnostics"), releaseArtifactUrlWorkflowRenderResult.rowIds.includes("saved-session-diagnostics"),
true, true,

View File

@@ -178,6 +178,14 @@ assert.equal(
readySummary.rows.find(({ id }) => id === "virtual-hal-promotion-candidate-baseline")?.value, readySummary.rows.find(({ id }) => id === "virtual-hal-promotion-candidate-baseline")?.value,
"executed=28 passed=28 skipped=131 unexpected_fail=0", "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( assert.deepEqual(
readySummary.rows readySummary.rows
.filter(({ id }) => expectedPromotionFamilyRows.some(([familyId]) => familyId === id)) .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-source-file-count", "17 source files"],
["virtual-hal-promotion-browser-diagnostics-count", "8 diagnostics-ready"], ["virtual-hal-promotion-browser-diagnostics-count", "8 diagnostics-ready"],
["virtual-hal-promotion-candidate-baseline", "executed=28 passed=28 skipped=131 unexpected_fail=0"], ["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"], ["saved-session-diagnostics", "ready"],
["next-command", "none"], ["next-command", "none"],
["missing", "none"], ["missing", "none"],

View File

@@ -471,6 +471,8 @@ assert.deepEqual(
["virtual-hal-promotion-source-file-count", "not provided"], ["virtual-hal-promotion-source-file-count", "not provided"],
["virtual-hal-promotion-browser-diagnostics-count", "not provided"], ["virtual-hal-promotion-browser-diagnostics-count", "not provided"],
["virtual-hal-promotion-candidate-baseline", "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"], ["saved-session-diagnostics", "not requested"],
["next-command", "none"], ["next-command", "none"],
["missing", "none"], ["missing", "none"],

View File

@@ -1797,7 +1797,7 @@ const releaseArtifactMountResult = mountIniPanelShellWorkflowOverviewReleaseRead
rowsNode: releaseArtifactRowsNode, rowsNode: releaseArtifactRowsNode,
}); });
assert.equal(releaseArtifactRenderResult.rendered, true); 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.dataset.handoffScope, "workflow-overview-release-readiness-artifact");
assert.equal( assert.equal(
releaseArtifactRenderResult.rowIds.includes("gate-execution-manifest"), releaseArtifactRenderResult.rowIds.includes("gate-execution-manifest"),
@@ -1828,7 +1828,7 @@ assert.equal(
true, true,
); );
assert.equal(releaseArtifactMountResult.ready, true); assert.equal(releaseArtifactMountResult.ready, true);
assert.equal(releaseArtifactMountResult.renderResult.rowCount, 17); assert.equal(releaseArtifactMountResult.renderResult.rowCount, 20);
assert.deepEqual( assert.deepEqual(
validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson("{").missing, validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson("{").missing,
["artifact-json"], ["artifact-json"],
@@ -1887,7 +1887,7 @@ assert.equal(
); );
assert.equal(releaseArtifactUrlWorkflow.renderState.statusLine, "Ready: No blocking reasons"); assert.equal(releaseArtifactUrlWorkflow.renderState.statusLine, "Ready: No blocking reasons");
assert.equal(releaseArtifactUrlWorkflow.mountResult.ready, true); assert.equal(releaseArtifactUrlWorkflow.mountResult.ready, true);
assert.equal(releaseArtifactUrlWorkflow.mountResult.renderResult.rowCount, 17); assert.equal(releaseArtifactUrlWorkflow.mountResult.renderResult.rowCount, 20);
const releaseArtifactUrlWorkflowSummary = const releaseArtifactUrlWorkflowSummary =
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel( createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel(
releaseArtifactUrlWorkflow, releaseArtifactUrlWorkflow,
@@ -1955,6 +1955,14 @@ assert.equal(
releaseArtifactUrlWorkflowSummary.rows.find(({ id }) => id === "virtual-hal-promotion-candidate-baseline")?.value, releaseArtifactUrlWorkflowSummary.rows.find(({ id }) => id === "virtual-hal-promotion-candidate-baseline")?.value,
"executed=28 passed=28 skipped=131 unexpected_fail=0", "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 = const promotionCandidateDrilldownViewModel =
createIniPanelShellWorkflowOverviewPromotionCandidateDrilldownViewModel( createIniPanelShellWorkflowOverviewPromotionCandidateDrilldownViewModel(
releaseArtifactUrlWorkflowSummary, releaseArtifactUrlWorkflowSummary,
@@ -2577,7 +2585,7 @@ const releaseArtifactUrlWorkflowMountResult =
rowsNode: releaseArtifactUrlWorkflowRowsNode, rowsNode: releaseArtifactUrlWorkflowRowsNode,
}); });
assert.equal(releaseArtifactUrlWorkflowRenderResult.rendered, true); assert.equal(releaseArtifactUrlWorkflowRenderResult.rendered, true);
assert.equal(releaseArtifactUrlWorkflowRenderResult.rowCount, 25); assert.equal(releaseArtifactUrlWorkflowRenderResult.rowCount, 27);
assert.equal( assert.equal(
releaseArtifactUrlWorkflowRenderResult.rowIds.includes("browser-diagnostics"), releaseArtifactUrlWorkflowRenderResult.rowIds.includes("browser-diagnostics"),
true, true,
@@ -2595,7 +2603,7 @@ assert.equal(
true, true,
); );
assert.equal(releaseArtifactUrlWorkflowMountResult.ready, true); assert.equal(releaseArtifactUrlWorkflowMountResult.ready, true);
assert.equal(releaseArtifactUrlWorkflowMountResult.renderResult.rowCount, 25); assert.equal(releaseArtifactUrlWorkflowMountResult.renderResult.rowCount, 27);
const releaseArtifactUrlWorkflowMissingDom = await loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl({ const releaseArtifactUrlWorkflowMissingDom = await loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl({
artifactUrl: "/project-release-readiness.json", artifactUrl: "/project-release-readiness.json",
fetchRef: async () => ({ fetchRef: async () => ({