展开promotion证据行
结论:workflow overview promotion candidate drilldown 现在展示8条evidence-ready候选的family、G-code path、source count和manifest-backed状态,hard block仍保持locked,baseline保持28/28/131/0。
This commit is contained in:
@@ -3990,6 +3990,20 @@ export function createIniPanelShellWorkflowOverviewPromotionCandidateDrilldownVi
|
|||||||
sourceKind: classifyPromotionFamilySource(sourceFile),
|
sourceKind: classifyPromotionFamilySource(sourceFile),
|
||||||
manifestBacked: candidate?.manifestChecked === true,
|
manifestBacked: candidate?.manifestChecked === true,
|
||||||
}));
|
}));
|
||||||
|
const evidenceRows = candidateRows.map((row, index) => ({
|
||||||
|
id: `evidence-${index + 1}`,
|
||||||
|
label: row.id ?? `Evidence ${index + 1}`,
|
||||||
|
value: row.gcodePath ?? "not provided",
|
||||||
|
familyId: row.simConfigTarget ?? "not provided",
|
||||||
|
sourceFileCount: Array.isArray(row.sourceFiles) ? row.sourceFiles.length : 0,
|
||||||
|
manifestBacked: row.manifestChecked === true,
|
||||||
|
status: row.complete === true &&
|
||||||
|
row.currentNodeInventoryStatus === "PASS" &&
|
||||||
|
row.blockedKind === "-" &&
|
||||||
|
row.targetBrowserEvidence === "explicit-browser-diagnostics"
|
||||||
|
? "evidence-ready"
|
||||||
|
: "blocked",
|
||||||
|
}));
|
||||||
return {
|
return {
|
||||||
apiName: "ini-panel-shell-workflow-overview-promotion-candidate-drilldown-view-model",
|
apiName: "ini-panel-shell-workflow-overview-promotion-candidate-drilldown-view-model",
|
||||||
viewModelVersion: 1,
|
viewModelVersion: 1,
|
||||||
@@ -4005,7 +4019,9 @@ export function createIniPanelShellWorkflowOverviewPromotionCandidateDrilldownVi
|
|||||||
candidate,
|
candidate,
|
||||||
rows,
|
rows,
|
||||||
sourceRows,
|
sourceRows,
|
||||||
|
evidenceRows,
|
||||||
sourceFileCount: sourceRows.length,
|
sourceFileCount: sourceRows.length,
|
||||||
|
evidenceRowCount: evidenceRows.length,
|
||||||
requiredReports,
|
requiredReports,
|
||||||
blockedFamilyExcluded,
|
blockedFamilyExcluded,
|
||||||
nodeInventoryReady,
|
nodeInventoryReady,
|
||||||
@@ -4029,11 +4045,19 @@ export function createIniPanelShellWorkflowOverviewPromotionCandidateDrilldownRe
|
|||||||
...row,
|
...row,
|
||||||
label: `${row.label} (${row.sourceKind})`,
|
label: `${row.label} (${row.sourceKind})`,
|
||||||
})),
|
})),
|
||||||
].map(({ id, label, value, sourceKind, manifestBacked }) => ({
|
...(Array.isArray(viewModel?.evidenceRows) ? viewModel.evidenceRows : []).map((row) => ({
|
||||||
|
...row,
|
||||||
|
label: `${row.label} (${row.familyId})`,
|
||||||
|
evidenceReady: row.status === "evidence-ready",
|
||||||
|
})),
|
||||||
|
].map(({ id, label, value, sourceKind, manifestBacked, familyId, sourceFileCount, evidenceReady }) => ({
|
||||||
id,
|
id,
|
||||||
label,
|
label,
|
||||||
value: value == null ? "" : String(value),
|
value: value == null ? "" : String(value),
|
||||||
...(sourceKind ? { sourceKind } : {}),
|
...(sourceKind ? { sourceKind } : {}),
|
||||||
|
...(familyId ? { familyId } : {}),
|
||||||
|
...(sourceFileCount != null ? { sourceFileCount: Number(sourceFileCount) } : {}),
|
||||||
|
...(evidenceReady != null ? { evidenceReady: evidenceReady === true } : {}),
|
||||||
...(manifestBacked != null ? { manifestBacked: manifestBacked === true } : {}),
|
...(manifestBacked != null ? { manifestBacked: manifestBacked === true } : {}),
|
||||||
}));
|
}));
|
||||||
const ready = viewModel?.ready === true;
|
const ready = viewModel?.ready === true;
|
||||||
@@ -4050,6 +4074,7 @@ export function createIniPanelShellWorkflowOverviewPromotionCandidateDrilldownRe
|
|||||||
rows,
|
rows,
|
||||||
rowCount: rows.length,
|
rowCount: rows.length,
|
||||||
sourceFileCount: viewModel?.sourceFileCount ?? 0,
|
sourceFileCount: viewModel?.sourceFileCount ?? 0,
|
||||||
|
evidenceRowCount: viewModel?.evidenceRowCount ?? 0,
|
||||||
dataset: viewModel?.dataset ?? {
|
dataset: viewModel?.dataset ?? {
|
||||||
handoffPhase: ready ? "ready" : "blocked",
|
handoffPhase: ready ? "ready" : "blocked",
|
||||||
handoffReady: ready ? "true" : "false",
|
handoffReady: ready ? "true" : "false",
|
||||||
@@ -4154,6 +4179,12 @@ export function renderIniPanelShellWorkflowOverviewPromotionCandidateDrilldownSt
|
|||||||
term.dataset[`${effectiveRowDatasetPrefix}SourceKind`] = row.sourceKind;
|
term.dataset[`${effectiveRowDatasetPrefix}SourceKind`] = row.sourceKind;
|
||||||
term.dataset[`${effectiveRowDatasetPrefix}ManifestBacked`] = row.manifestBacked ? "true" : "false";
|
term.dataset[`${effectiveRowDatasetPrefix}ManifestBacked`] = row.manifestBacked ? "true" : "false";
|
||||||
}
|
}
|
||||||
|
if (row.familyId) {
|
||||||
|
term.dataset[`${effectiveRowDatasetPrefix}FamilyId`] = row.familyId;
|
||||||
|
term.dataset[`${effectiveRowDatasetPrefix}EvidenceReady`] = row.evidenceReady ? "true" : "false";
|
||||||
|
term.dataset[`${effectiveRowDatasetPrefix}SourceFileCount`] = String(row.sourceFileCount ?? 0);
|
||||||
|
term.dataset[`${effectiveRowDatasetPrefix}ManifestBacked`] = row.manifestBacked ? "true" : "false";
|
||||||
|
}
|
||||||
term.textContent = row.label;
|
term.textContent = row.label;
|
||||||
const detail = documentRef.createElement("dd");
|
const detail = documentRef.createElement("dd");
|
||||||
detail.dataset[`${effectiveRowDatasetPrefix}Value`] = row.id;
|
detail.dataset[`${effectiveRowDatasetPrefix}Value`] = row.id;
|
||||||
@@ -4162,6 +4193,12 @@ export function renderIniPanelShellWorkflowOverviewPromotionCandidateDrilldownSt
|
|||||||
detail.dataset[`${effectiveRowDatasetPrefix}SourceKind`] = row.sourceKind;
|
detail.dataset[`${effectiveRowDatasetPrefix}SourceKind`] = row.sourceKind;
|
||||||
detail.dataset[`${effectiveRowDatasetPrefix}ManifestBacked`] = row.manifestBacked ? "true" : "false";
|
detail.dataset[`${effectiveRowDatasetPrefix}ManifestBacked`] = row.manifestBacked ? "true" : "false";
|
||||||
}
|
}
|
||||||
|
if (row.familyId) {
|
||||||
|
detail.dataset[`${effectiveRowDatasetPrefix}FamilyId`] = row.familyId;
|
||||||
|
detail.dataset[`${effectiveRowDatasetPrefix}EvidenceReady`] = row.evidenceReady ? "true" : "false";
|
||||||
|
detail.dataset[`${effectiveRowDatasetPrefix}SourceFileCount`] = String(row.sourceFileCount ?? 0);
|
||||||
|
detail.dataset[`${effectiveRowDatasetPrefix}ManifestBacked`] = row.manifestBacked ? "true" : "false";
|
||||||
|
}
|
||||||
detail.textContent = row.value;
|
detail.textContent = row.value;
|
||||||
rowsNode.append(term, detail);
|
rowsNode.append(term, detail);
|
||||||
}
|
}
|
||||||
@@ -4171,6 +4208,7 @@ export function renderIniPanelShellWorkflowOverviewPromotionCandidateDrilldownSt
|
|||||||
rowCount: rows.length,
|
rowCount: rows.length,
|
||||||
rowIds: rows.map(({ id }) => id),
|
rowIds: rows.map(({ id }) => id),
|
||||||
sourceFileCount: rows.filter(({ sourceKind }) => Boolean(sourceKind)).length,
|
sourceFileCount: rows.filter(({ sourceKind }) => Boolean(sourceKind)).length,
|
||||||
|
evidenceRowCount: rows.filter(({ familyId }) => Boolean(familyId)).length,
|
||||||
dataset: {
|
dataset: {
|
||||||
handoffPhase: mountNode.dataset.handoffPhase,
|
handoffPhase: mountNode.dataset.handoffPhase,
|
||||||
handoffReady: mountNode.dataset.handoffReady,
|
handoffReady: mountNode.dataset.handoffReady,
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import {
|
|||||||
createVirtualHalCommandScriptFixtureReport,
|
createVirtualHalCommandScriptFixtureReport,
|
||||||
createVirtualHalMotionControllerMatrixReport,
|
createVirtualHalMotionControllerMatrixReport,
|
||||||
createVirtualHalSimConfigMacroLoadFixtureReport,
|
createVirtualHalSimConfigMacroLoadFixtureReport,
|
||||||
|
createVirtualHalSimConfigEvidenceExpansionReport,
|
||||||
createVirtualHalSimConfigPromotionCandidateReport,
|
createVirtualHalSimConfigPromotionCandidateReport,
|
||||||
createVirtualHalSimConfigSourceCoverageReport,
|
createVirtualHalSimConfigSourceCoverageReport,
|
||||||
createVirtualHalSimulationReplacementReport,
|
createVirtualHalSimulationReplacementReport,
|
||||||
@@ -1431,6 +1432,13 @@ const releaseReadinessPromotionCandidates = createVirtualHalSimConfigPromotionCa
|
|||||||
],
|
],
|
||||||
motionControllerMatrix: releaseReadinessMotionControllerMatrix,
|
motionControllerMatrix: releaseReadinessMotionControllerMatrix,
|
||||||
});
|
});
|
||||||
|
const releaseReadinessEvidenceExpansion = createVirtualHalSimConfigEvidenceExpansionReport({
|
||||||
|
manifestEntries: [
|
||||||
|
...VIRTUAL_HAL_MOTION_MATRIX_MANIFEST_ENTRIES,
|
||||||
|
"linuxcnc/configs/sim/axis/vismach/puma/puma_cube.ini",
|
||||||
|
],
|
||||||
|
motionControllerMatrix: releaseReadinessMotionControllerMatrix,
|
||||||
|
});
|
||||||
const releaseReadinessMacroLoadFixtures = createVirtualHalSimConfigMacroLoadFixtureReport({
|
const releaseReadinessMacroLoadFixtures = createVirtualHalSimConfigMacroLoadFixtureReport({
|
||||||
manifestEntries: [
|
manifestEntries: [
|
||||||
...VIRTUAL_HAL_MOTION_MATRIX_MANIFEST_ENTRIES,
|
...VIRTUAL_HAL_MOTION_MATRIX_MANIFEST_ENTRIES,
|
||||||
@@ -1445,6 +1453,7 @@ const releaseReadinessArtifactJson = JSON.stringify(createProjectReleaseReadines
|
|||||||
gateResults: Object.fromEntries(createProjectReleaseGateManifest().gateIds.map((id) => [id, true])),
|
gateResults: Object.fromEntries(createProjectReleaseGateManifest().gateIds.map((id) => [id, true])),
|
||||||
virtualHalSimConfigSourceCoverage: createVirtualHalSimConfigSourceCoverageReport(),
|
virtualHalSimConfigSourceCoverage: createVirtualHalSimConfigSourceCoverageReport(),
|
||||||
virtualHalSimConfigPromotionCandidates: releaseReadinessPromotionCandidates,
|
virtualHalSimConfigPromotionCandidates: releaseReadinessPromotionCandidates,
|
||||||
|
virtualHalSimConfigEvidenceExpansion: releaseReadinessEvidenceExpansion,
|
||||||
virtualHalSimConfigMacroLoadFixtures: releaseReadinessMacroLoadFixtures,
|
virtualHalSimConfigMacroLoadFixtures: releaseReadinessMacroLoadFixtures,
|
||||||
virtualHalMotionControllerMatrix: releaseReadinessMotionControllerMatrix,
|
virtualHalMotionControllerMatrix: releaseReadinessMotionControllerMatrix,
|
||||||
}));
|
}));
|
||||||
@@ -1457,6 +1466,7 @@ const browserDiagnosticsArtifact = {
|
|||||||
virtualHalSourceCompliance: createVirtualHalSourceComplianceReport({ halState: browserDiagnosticsVirtualHalState }),
|
virtualHalSourceCompliance: createVirtualHalSourceComplianceReport({ halState: browserDiagnosticsVirtualHalState }),
|
||||||
virtualHalSimConfigSourceCoverage: createVirtualHalSimConfigSourceCoverageReport(),
|
virtualHalSimConfigSourceCoverage: createVirtualHalSimConfigSourceCoverageReport(),
|
||||||
virtualHalSimConfigPromotionCandidates: releaseReadinessPromotionCandidates,
|
virtualHalSimConfigPromotionCandidates: releaseReadinessPromotionCandidates,
|
||||||
|
virtualHalSimConfigEvidenceExpansion: releaseReadinessEvidenceExpansion,
|
||||||
virtualHalPromotionCandidateSummary: {
|
virtualHalPromotionCandidateSummary: {
|
||||||
apiName: "real-browser-simulation-promotion-candidate-summary",
|
apiName: "real-browser-simulation-promotion-candidate-summary",
|
||||||
summaryVersion: 1,
|
summaryVersion: 1,
|
||||||
@@ -2013,6 +2023,22 @@ assert.equal(
|
|||||||
"passed",
|
"passed",
|
||||||
);
|
);
|
||||||
assert.equal(promotionCandidateDrilldownViewModel.sourceFileCount, 2);
|
assert.equal(promotionCandidateDrilldownViewModel.sourceFileCount, 2);
|
||||||
|
assert.equal(promotionCandidateDrilldownViewModel.evidenceRowCount, 8);
|
||||||
|
assert.equal(
|
||||||
|
promotionCandidateDrilldownViewModel.evidenceRows.every(({ status, manifestBacked }) =>
|
||||||
|
status === "evidence-ready" && manifestBacked === true
|
||||||
|
),
|
||||||
|
true,
|
||||||
|
);
|
||||||
|
assert.equal(
|
||||||
|
promotionCandidateDrilldownViewModel.evidenceRows.some(({ label, value, familyId, sourceFileCount }) =>
|
||||||
|
label === "puma-seam-weld" &&
|
||||||
|
value === "linuxcnc/configs/sim/axis/vismach/puma/puma_seam_weld.ngc" &&
|
||||||
|
familyId === "vismach-remap-sims" &&
|
||||||
|
sourceFileCount === 3
|
||||||
|
),
|
||||||
|
true,
|
||||||
|
);
|
||||||
assert.deepEqual(
|
assert.deepEqual(
|
||||||
promotionCandidateDrilldownViewModel.sourceRows.map(({ value, sourceKind, manifestBacked }) => [
|
promotionCandidateDrilldownViewModel.sourceRows.map(({ value, sourceKind, manifestBacked }) => [
|
||||||
value,
|
value,
|
||||||
@@ -2025,8 +2051,9 @@ assert.deepEqual(
|
|||||||
],
|
],
|
||||||
);
|
);
|
||||||
assert.equal(promotionCandidateDrilldownRenderState.ready, true);
|
assert.equal(promotionCandidateDrilldownRenderState.ready, true);
|
||||||
assert.equal(promotionCandidateDrilldownRenderState.rowCount, 11);
|
assert.equal(promotionCandidateDrilldownRenderState.rowCount, 19);
|
||||||
assert.equal(promotionCandidateDrilldownRenderState.sourceFileCount, 2);
|
assert.equal(promotionCandidateDrilldownRenderState.sourceFileCount, 2);
|
||||||
|
assert.equal(promotionCandidateDrilldownRenderState.evidenceRowCount, 8);
|
||||||
assert.equal(
|
assert.equal(
|
||||||
createIniPanelShellWorkflowOverviewPromotionCandidateDrilldownDomContract().selectors.mount,
|
createIniPanelShellWorkflowOverviewPromotionCandidateDrilldownDomContract().selectors.mount,
|
||||||
"[data-workflow-overview-promotion-candidate-drilldown]",
|
"[data-workflow-overview-promotion-candidate-drilldown]",
|
||||||
@@ -2066,7 +2093,8 @@ const promotionCandidateDrilldownMountResult =
|
|||||||
rowsNode: promotionCandidateDrilldownRowsNode,
|
rowsNode: promotionCandidateDrilldownRowsNode,
|
||||||
});
|
});
|
||||||
assert.equal(promotionCandidateDrilldownRenderResult.rendered, true);
|
assert.equal(promotionCandidateDrilldownRenderResult.rendered, true);
|
||||||
assert.equal(promotionCandidateDrilldownRenderResult.rowCount, 11);
|
assert.equal(promotionCandidateDrilldownRenderResult.rowCount, 19);
|
||||||
|
assert.equal(promotionCandidateDrilldownRenderResult.evidenceRowCount, 8);
|
||||||
assert.deepEqual(promotionCandidateDrilldownRenderResult.dataset, {
|
assert.deepEqual(promotionCandidateDrilldownRenderResult.dataset, {
|
||||||
handoffPhase: "ready",
|
handoffPhase: "ready",
|
||||||
handoffReady: "true",
|
handoffReady: "true",
|
||||||
@@ -2082,8 +2110,16 @@ assert.equal(promotionCandidateDrilldownRowsNode.children.some((node) =>
|
|||||||
node.dataset?.workflowOverviewPromotionCandidateDrilldownManifestBacked === "true" &&
|
node.dataset?.workflowOverviewPromotionCandidateDrilldownManifestBacked === "true" &&
|
||||||
node.textContent === "linuxcnc/configs/sim/qtdragon/qtdragon_multi_joint/on_abort.ngc"
|
node.textContent === "linuxcnc/configs/sim/qtdragon/qtdragon_multi_joint/on_abort.ngc"
|
||||||
), true);
|
), true);
|
||||||
|
assert.equal(promotionCandidateDrilldownRowsNode.children.some((node) =>
|
||||||
|
node.dataset?.workflowOverviewPromotionCandidateDrilldownValue === "evidence-7" &&
|
||||||
|
node.dataset?.workflowOverviewPromotionCandidateDrilldownFamilyId === "vismach-remap-sims" &&
|
||||||
|
node.dataset?.workflowOverviewPromotionCandidateDrilldownEvidenceReady === "true" &&
|
||||||
|
node.dataset?.workflowOverviewPromotionCandidateDrilldownSourceFileCount === "3" &&
|
||||||
|
node.textContent === "linuxcnc/configs/sim/axis/vismach/puma/puma_seam_weld.ngc"
|
||||||
|
), true);
|
||||||
assert.equal(promotionCandidateDrilldownMountResult.ready, true);
|
assert.equal(promotionCandidateDrilldownMountResult.ready, true);
|
||||||
assert.equal(promotionCandidateDrilldownMountResult.renderResult.sourceFileCount, 2);
|
assert.equal(promotionCandidateDrilldownMountResult.renderResult.sourceFileCount, 2);
|
||||||
|
assert.equal(promotionCandidateDrilldownMountResult.renderResult.evidenceRowCount, 8);
|
||||||
assert.equal(
|
assert.equal(
|
||||||
releaseArtifactUrlWorkflowSummary.rows.find(({ id }) => id === "virtual-hal-promotion-families")?.value,
|
releaseArtifactUrlWorkflowSummary.rows.find(({ id }) => id === "virtual-hal-promotion-families")?.value,
|
||||||
expectedPromotionFamilySummary,
|
expectedPromotionFamilySummary,
|
||||||
|
|||||||
Reference in New Issue
Block a user