按text32继续推进evidence expansion过滤预设

结论:已完成 evidence expansion family/source filter 的 summary/action-plan、query/hash 预选、UI/API/SDK/浏览器验证覆盖,并保持 sim-config inventory baseline=82/82/77/0。
This commit is contained in:
2026-06-20 12:18:08 +08:00
parent 8a1c4699b1
commit a6eda3fbff
18 changed files with 2144 additions and 51 deletions

View File

@@ -244,7 +244,7 @@ TOOL_TABLE = browser-shell-tool.tbl
"shell handoff action-plan next steps",
);
assertEqual(handoffChecklist.ready, true, "shell handoff checklist readiness");
assertEqual(handoffChecklist.checks.length, 5, "shell handoff checklist checks");
assertEqual(handoffChecklist.checks.length, 11, "shell handoff checklist checks");
assertEqual(
handoffChecklist.checks.map(({ status }) => status).join(","),
"pass,pass,pass,pass,pass",
@@ -1041,14 +1041,29 @@ TOOL_TABLE = browser-shell-tool.tbl
);
assertEqual(
workflowOverviewReleaseArtifactUrlWorkflowSummary.rows.find(({ id }) => id === "evidence-expansion-full-candidate-list")?.value,
"woodpecker-on-abort, puma-cube, melfa-example, trt-boat-xyzac, trt-xyzac-switchkins",
"woodpecker-on-abort, puma-cube, melfa-example, trt-boat-xyzac, trt-xyzac-switchkins, trt-boat-xyzbc, trt-impeller-7bl-xyzac, trt-xyzac-switchkins-test-1, trt-xyzac-switchkins-test-2, trt-xyzac-switchkins-test-3, trt-xyzbc-switchkins",
"shell workflow overview release artifact URL workflow evidence expansion full candidate list",
);
assertEqual(
workflowOverviewReleaseArtifactUrlWorkflowSummary.rows.find(({ id }) => id === "evidence-expansion-full-gcode-list")?.value,
"linuxcnc/configs/sim/woodpecker/on_abort.ngc, linuxcnc/configs/sim/axis/vismach/puma/puma_cube.ngc, linuxcnc/configs/sim/axis/vismach/melfa-sim/example.ngc, linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzac.ngc, linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins.ngc",
"linuxcnc/configs/sim/woodpecker/on_abort.ngc, linuxcnc/configs/sim/axis/vismach/puma/puma_cube.ngc, linuxcnc/configs/sim/axis/vismach/melfa-sim/example.ngc, linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzac.ngc, linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins.ngc, linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzbc.ngc, linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/impeller-7bl-xyzac.ngc, linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_1.ngc, linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_2.ngc, linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_3.ngc, linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzbc_switchkins.ngc",
"shell workflow overview release artifact URL workflow evidence expansion full gcode list",
);
assertEqual(
workflowOverviewReleaseArtifactUrlWorkflowSummary.rows.find(({ id }) => id === "evidence-expansion-family-count")?.value,
"3 families",
"shell workflow overview release artifact URL workflow evidence expansion family count",
);
assertEqual(
workflowOverviewReleaseArtifactUrlWorkflowSummary.rows.find(({ id }) => id === "evidence-expansion-family-summary")?.value,
"woodpecker: 1/1 ready; vismach-remap-sims: 2/2 ready; five-axis-trt: 8/8 ready",
"shell workflow overview release artifact URL workflow evidence expansion family summary",
);
assertEqual(
workflowOverviewReleaseArtifactUrlWorkflowSummary.rows.find(({ id }) => id === "evidence-expansion-family-source-count-list")?.value,
"woodpecker:3, vismach-remap-sims:6, five-axis-trt:12",
"shell workflow overview release artifact URL workflow evidence expansion family source count",
);
assertEqual(
workflowOverviewReleaseArtifactUrlWorkflowRenderResult.rowIds.includes("hard-block-runtime-lock"),
true,

View File

@@ -33,9 +33,11 @@
}
}
async function loadWorkflowOverviewFrame() {
async function loadWorkflowOverviewFrame(
src = "../../runtime/ui/ini-panel/workflow-overview.html",
) {
const frame = document.createElement("iframe");
frame.src = "../../runtime/ui/ini-panel/workflow-overview.html";
frame.src = src;
document.body.appendChild(frame);
await new Promise((resolve, reject) => {
frame.addEventListener("load", resolve, { once: true });
@@ -72,6 +74,17 @@
!workflowApi?.renderWorkflowOverviewReleaseReadinessArtifactUrlWorkflowState ||
!workflowApi?.mountWorkflowOverviewReleaseReadinessArtifactUrlWorkflowState ||
!workflowApi?.getWorkflowOverviewPromotionFamilyRowsRenderState ||
!workflowApi?.getWorkflowOverviewEvidenceExpansionFamilyRowsRenderState ||
!workflowApi?.getWorkflowOverviewEvidenceExpansionFamilySourceFilterViewModel ||
!workflowApi?.getWorkflowOverviewEvidenceExpansionFamilySourceFilterDomContract ||
!workflowApi?.getWorkflowOverviewEvidenceExpansionFamilySourceFilterDomReadiness ||
!workflowApi?.getWorkflowOverviewEvidenceExpansionFamilySourceFilterSummary ||
!workflowApi?.getWorkflowOverviewEvidenceExpansionFamilySourceFilterActionPlan ||
!workflowApi?.getWorkflowOverviewEvidenceExpansionFamilySourceFilterSelectionActionPlan ||
!workflowApi?.handleWorkflowOverviewEvidenceExpansionFamilySourceFilterSelectionChange ||
!workflowApi?.bindWorkflowOverviewEvidenceExpansionFamilySourceFilterSelectionControls ||
!workflowApi?.renderWorkflowOverviewEvidenceExpansionFamilySourceFilterState ||
!workflowApi?.mountWorkflowOverviewEvidenceExpansionFamilySourceFilterState ||
!workflowApi?.getWorkflowOverviewPromotionFamilySourceFilterViewModel ||
!workflowApi?.getWorkflowOverviewPromotionFamilySourceFilterDomContract ||
!workflowApi?.getWorkflowOverviewPromotionFamilySourceFilterDomReadiness ||
@@ -741,12 +754,12 @@
);
assertEqual(
releaseArtifactUrlWorkflowSummary.rows.find(({ id }) => id === "evidence-expansion-full-candidate-list")?.value,
"woodpecker-on-abort, puma-cube, melfa-example, trt-boat-xyzac, trt-xyzac-switchkins",
"woodpecker-on-abort, puma-cube, melfa-example, trt-boat-xyzac, trt-xyzac-switchkins, trt-boat-xyzbc, trt-impeller-7bl-xyzac, trt-xyzac-switchkins-test-1, trt-xyzac-switchkins-test-2, trt-xyzac-switchkins-test-3, trt-xyzbc-switchkins",
"workflow overview release artifact URL workflow evidence expansion full candidate list",
);
assertEqual(
releaseArtifactUrlWorkflowSummary.rows.find(({ id }) => id === "evidence-expansion-full-gcode-list")?.value,
"linuxcnc/configs/sim/woodpecker/on_abort.ngc, linuxcnc/configs/sim/axis/vismach/puma/puma_cube.ngc, linuxcnc/configs/sim/axis/vismach/melfa-sim/example.ngc, linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzac.ngc, linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins.ngc",
"linuxcnc/configs/sim/woodpecker/on_abort.ngc, linuxcnc/configs/sim/axis/vismach/puma/puma_cube.ngc, linuxcnc/configs/sim/axis/vismach/melfa-sim/example.ngc, linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzac.ngc, linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins.ngc, linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzbc.ngc, linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/impeller-7bl-xyzac.ngc, linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_1.ngc, linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_2.ngc, linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_3.ngc, linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzbc_switchkins.ngc",
"workflow overview release artifact URL workflow evidence expansion full gcode list",
);
assertEqual(
@@ -1042,14 +1055,29 @@
);
assertEqual(
workflowDoc.querySelector('[data-workflow-overview-release-readiness-artifact-url-workflow-value="evidence-expansion-full-candidate-list"]').textContent,
"woodpecker-on-abort, puma-cube, melfa-example, trt-boat-xyzac, trt-xyzac-switchkins",
"woodpecker-on-abort, puma-cube, melfa-example, trt-boat-xyzac, trt-xyzac-switchkins, trt-boat-xyzbc, trt-impeller-7bl-xyzac, trt-xyzac-switchkins-test-1, trt-xyzac-switchkins-test-2, trt-xyzac-switchkins-test-3, trt-xyzbc-switchkins",
"workflow overview fixed URL workflow form evidence expansion full candidate list row",
);
assertEqual(
workflowDoc.querySelector('[data-workflow-overview-release-readiness-artifact-url-workflow-value="evidence-expansion-full-gcode-list"]').textContent,
"linuxcnc/configs/sim/woodpecker/on_abort.ngc, linuxcnc/configs/sim/axis/vismach/puma/puma_cube.ngc, linuxcnc/configs/sim/axis/vismach/melfa-sim/example.ngc, linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzac.ngc, linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins.ngc",
"linuxcnc/configs/sim/woodpecker/on_abort.ngc, linuxcnc/configs/sim/axis/vismach/puma/puma_cube.ngc, linuxcnc/configs/sim/axis/vismach/melfa-sim/example.ngc, linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzac.ngc, linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins.ngc, linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzbc.ngc, linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/impeller-7bl-xyzac.ngc, linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_1.ngc, linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_2.ngc, linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_3.ngc, linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzbc_switchkins.ngc",
"workflow overview fixed URL workflow form evidence expansion full gcode list row",
);
assertEqual(
workflowDoc.querySelector('[data-workflow-overview-release-readiness-artifact-url-workflow-value="evidence-expansion-family-count"]').textContent,
"3 families",
"workflow overview fixed URL workflow form evidence expansion family count row",
);
assertEqual(
workflowDoc.querySelector('[data-workflow-overview-release-readiness-artifact-url-workflow-value="evidence-expansion-family-summary"]').textContent,
"woodpecker: 1/1 ready; vismach-remap-sims: 2/2 ready; five-axis-trt: 8/8 ready",
"workflow overview fixed URL workflow form evidence expansion family summary row",
);
assertEqual(
workflowDoc.querySelector('[data-workflow-overview-release-readiness-artifact-url-workflow-value="evidence-expansion-family-source-count-list"]').textContent,
"woodpecker:3, vismach-remap-sims:6, five-axis-trt:12",
"workflow overview fixed URL workflow form evidence expansion family source count row",
);
assertEqual(
workflowDoc.querySelector('[data-workflow-overview-release-readiness-artifact-url-workflow-value="virtual-hal-promotion-source-file-count"]').textContent,
"17 source files",
@@ -1198,6 +1226,142 @@
"0",
"workflow overview source filter changed rose engine promotion allowed",
);
const evidenceExpansionSourceFilterMount = workflowDoc.querySelector("[data-workflow-overview-evidence-expansion-family-source-filter]");
const evidenceExpansionSourceFilterFamilySelect = workflowDoc.querySelector(
'[data-workflow-overview-evidence-expansion-family-source-filter-select="family"]',
);
const evidenceExpansionSourceFilterKindSelect = workflowDoc.querySelector(
'[data-workflow-overview-evidence-expansion-family-source-filter-select="source-kind"]',
);
assertEqual(
evidenceExpansionSourceFilterMount.dataset.selectedFamilyId,
"all",
"workflow overview evidence expansion source filter default family",
);
assertEqual(
workflowDoc.body.dataset.evidenceExpansionFamilySourceFilterReady,
"true",
"workflow overview evidence expansion source filter ready",
);
assertEqual(
workflowDoc.body.dataset.evidenceExpansionFamilySourceFilterCount,
"21",
"workflow overview evidence expansion source filter default source count",
);
evidenceExpansionSourceFilterFamilySelect.value = "evidence-expansion-family-five-axis-trt";
evidenceExpansionSourceFilterKindSelect.value = "gcode";
evidenceExpansionSourceFilterFamilySelect.dispatchEvent(new Event("change", { bubbles: true }));
assertEqual(
workflowDoc.body.dataset.evidenceExpansionFamilySourceFilterFamily,
"evidence-expansion-family-five-axis-trt",
"workflow overview evidence expansion source filter change body family",
);
assertEqual(
workflowDoc.body.dataset.evidenceExpansionFamilySourceFilterSourceKind,
"gcode",
"workflow overview evidence expansion source filter change body source kind",
);
assertEqual(
workflowDoc.body.dataset.evidenceExpansionFamilySourceFilterCount,
"8",
"workflow overview evidence expansion source filter changed source count",
);
assertEqual(
evidenceExpansionSourceFilterMount.dataset.handoffScope,
"workflow-overview-evidence-expansion-family-source-filter",
"workflow overview evidence expansion source filter scope",
);
assertEqual(
workflowDoc.querySelectorAll(
'[data-workflow-overview-evidence-expansion-family-source-filter-type="source-row"]',
).length,
16,
"workflow overview evidence expansion source filter changed source DOM nodes",
);
assertEqual(
workflowDoc.querySelectorAll(
'[data-workflow-overview-evidence-expansion-family-source-filter-type="candidate-row"]',
).length,
16,
"workflow overview evidence expansion source filter changed candidate DOM nodes",
);
assertEqual(
workflowDoc.querySelector(
'[data-workflow-overview-evidence-expansion-family-source-filter-type="candidate-row"][data-workflow-overview-evidence-expansion-family-source-filter-value="linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzac.ngc"]',
)?.dataset.workflowOverviewEvidenceExpansionFamilySourceFilterCandidateStatus,
"evidence-expansion-ready",
"workflow overview evidence expansion source filter TRT candidate status",
);
assertEqual(
workflowDoc.querySelector(
'[data-workflow-overview-evidence-expansion-family-source-filter-type="candidate-row"][data-workflow-overview-evidence-expansion-family-source-filter-value="linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzac.ngc"]',
)?.dataset.workflowOverviewEvidenceExpansionFamilySourceFilterPromotionAllowed,
"0",
"workflow overview evidence expansion source filter promotion allowed",
);
const presetWorkflowDoc = await loadWorkflowOverviewFrame(
"../../runtime/ui/ini-panel/workflow-overview.html?evidenceExpansionFamily=evidence-expansion-family-five-axis-trt&evidenceExpansionSourceKind=gcode",
);
const presetWorkflowApi = presetWorkflowDoc.defaultView.linuxCncIniPanelWorkflowOverviewApi;
presetWorkflowDoc.querySelector("[data-release-artifact-url-input]").value =
"../../tests/fixtures/project-release-readiness-ready.json";
presetWorkflowDoc.querySelector("[data-browser-diagnostics-url-input]").value =
"../../tests/fixtures/real-browser-simulation-diagnostics-ready.json";
const presetReleaseArtifactUrlFormResult = await presetWorkflowApi.runWorkflowOverviewReleaseReadinessArtifactUrlForm({
fetchRef: async (url) => {
if (String(url).endsWith("real-browser-simulation-diagnostics-ready.json")) {
return {
ok: true,
status: 200,
text: async () => diagnosticsArtifactJson,
};
}
return fetch(url);
},
});
const presetEvidenceExpansionSourceFilterMount = presetWorkflowDoc.querySelector(
"[data-workflow-overview-evidence-expansion-family-source-filter]",
);
assertEqual(
presetWorkflowDoc.body.dataset.evidenceExpansionFamilySourceFilterFamily,
"evidence-expansion-family-five-axis-trt",
"workflow overview evidence expansion query preset body family",
);
assertEqual(
presetWorkflowDoc.body.dataset.evidenceExpansionFamilySourceFilterSourceKind,
"gcode",
"workflow overview evidence expansion query preset body source kind",
);
assertEqual(
presetWorkflowDoc.body.dataset.evidenceExpansionFamilySourceFilterCount,
"8",
"workflow overview evidence expansion query preset source count",
);
assertEqual(
presetWorkflowDoc.body.dataset.evidenceExpansionFamilySourceFilterSummary,
"Ready: evidence expansion filter evidence-expansion-family-five-axis-trt / gcode is externally readable",
"workflow overview evidence expansion query preset summary",
);
assertEqual(
presetEvidenceExpansionSourceFilterMount.dataset.selectedFamilyId,
"evidence-expansion-family-five-axis-trt",
"workflow overview evidence expansion query preset mount family",
);
assertEqual(
presetEvidenceExpansionSourceFilterMount.dataset.selectedSourceKind,
"gcode",
"workflow overview evidence expansion query preset mount source kind",
);
assertEqual(
presetReleaseArtifactUrlFormResult.evidenceExpansionFamilySourceFilterSummary.filteredSourceFileCount,
8,
"workflow overview evidence expansion query preset summary source count",
);
assertEqual(
presetReleaseArtifactUrlFormResult.evidenceExpansionFamilySourceFilterActionPlan.baselineChanging,
false,
"workflow overview evidence expansion query preset baseline unchanged",
);
assertEqual(
releaseArtifactJsonWorkflow.statusLine,
"Ready: Artifact JSON workflow complete",

View File

@@ -669,8 +669,8 @@
!diagnosticsArtifact.virtualHalSimConfigSourceCoverage?.sourceFiles?.includes("linuxcnc/configs/sim/qtdragon_hd/qtdragon_hd_z_compensation/qtdragon_hd_z_compensation.ini") ||
diagnosticsArtifact.virtualHalSimConfigPromotionCandidates?.complete !== true ||
diagnosticsArtifact.virtualHalSimConfigEvidenceExpansion?.complete !== true ||
diagnosticsArtifact.virtualHalSimConfigEvidenceExpansion?.candidateCount !== 5 ||
diagnosticsArtifact.virtualHalSimConfigEvidenceExpansion?.readyCandidateCount !== 5 ||
diagnosticsArtifact.virtualHalSimConfigEvidenceExpansion?.candidateCount !== 11 ||
diagnosticsArtifact.virtualHalSimConfigEvidenceExpansion?.readyCandidateCount !== 11 ||
diagnosticsArtifact.virtualHalSimConfigEvidenceExpansion?.promotionAllowed !== false ||
!diagnosticsArtifact.virtualHalSimConfigEvidenceExpansion?.rows?.some((row) =>
row.id === "trt-boat-xyzac" &&
@@ -699,12 +699,15 @@
doc.body.dataset.promotionCandidateReady !== "true" ||
doc.body.dataset.promotionCandidatePreferred !== "qtdragon-multi-joint-on-abort" ||
doc.body.dataset.evidenceExpansionReady !== "true" ||
doc.body.dataset.evidenceExpansionCount !== "5" ||
doc.body.dataset.evidenceExpansionReadyCount !== "5" ||
doc.body.dataset.evidenceExpansionCount !== "11" ||
doc.body.dataset.evidenceExpansionReadyCount !== "11" ||
api.getVirtualHalEvidenceExpansionSummary?.().ready !== true ||
api.getVirtualHalEvidenceExpansionSummary?.().candidateIds?.join(", ") !== "woodpecker-on-abort, puma-cube, melfa-example, trt-boat-xyzac, trt-xyzac-switchkins" ||
doc.querySelector('[data-evidence-expansion-summary-value="candidate-count"]')?.textContent !== "5/5 ready" ||
doc.querySelector('[data-evidence-expansion-summary-value="candidate-list"]')?.textContent !== "woodpecker-on-abort, puma-cube, melfa-example, trt-boat-xyzac, trt-xyzac-switchkins" ||
api.getVirtualHalEvidenceExpansionSummary?.().candidateIds?.join(", ") !== "woodpecker-on-abort, puma-cube, melfa-example, trt-boat-xyzac, trt-xyzac-switchkins, trt-boat-xyzbc, trt-impeller-7bl-xyzac, trt-xyzac-switchkins-test-1, trt-xyzac-switchkins-test-2, trt-xyzac-switchkins-test-3, trt-xyzbc-switchkins" ||
doc.querySelector('[data-evidence-expansion-summary-value="candidate-count"]')?.textContent !== "11/11 ready" ||
doc.querySelector('[data-evidence-expansion-summary-value="candidate-list"]')?.textContent !== "woodpecker-on-abort, puma-cube, melfa-example, trt-boat-xyzac, trt-xyzac-switchkins, trt-boat-xyzbc, trt-impeller-7bl-xyzac, trt-xyzac-switchkins-test-1, trt-xyzac-switchkins-test-2, trt-xyzac-switchkins-test-3, trt-xyzbc-switchkins" ||
doc.querySelector('[data-evidence-expansion-summary-value="family-count"]')?.textContent !== "3" ||
doc.querySelector('[data-evidence-expansion-summary-value="family-summary"]')?.textContent !== "woodpecker: 1/1 ready; vismach-remap-sims: 2/2 ready; five-axis-trt: 8/8 ready" ||
doc.querySelector('[data-evidence-expansion-summary-value="family-source-count-list"]')?.textContent !== "woodpecker:3, vismach-remap-sims:6, five-axis-trt:12" ||
doc.querySelector('[data-evidence-expansion-summary-value="promotion-allowed"]')?.textContent !== "0 baseline changes" ||
doc.querySelector('[data-evidence-expansion-summary-value="inventory-baseline"]')?.textContent !== "unchanged" ||
doc.querySelector('[data-promotion-candidate-summary-value="preferred-candidate"]')?.textContent !== "qtdragon-multi-joint-on-abort" ||