按text22收束promotion证据

结论:完成 evidence-ready / inventory-ready 双层 promotion candidate 管理,release/SDK gate 已纳入 virtual HAL promotion summary,baseline 保持 28/28/131/0,Python remap、tool DB、external user-M hard block 继续 locked。
This commit is contained in:
2026-06-18 17:20:29 +08:00
parent 014081f1f9
commit 1c94ea4527
29 changed files with 8500 additions and 121 deletions

View File

@@ -244,6 +244,8 @@
!api?.getVirtualHalSourceComplianceReport ||
!api?.getVirtualHalSimConfigSourceCoverageReport ||
!api?.getVirtualHalSimConfigPromotionCandidateReport ||
!api?.getVirtualHalPromotionCandidateSummary ||
!api?.getVirtualHalPromotionFamilyRows ||
!api?.getVirtualHalSimConfigMacroLoadFixtureReport ||
!api?.getVirtualHalCommandScriptFixtureReport ||
!api?.getVirtualHalMotionControllerMatrixReport ||
@@ -409,6 +411,7 @@
throw new Error(`simulation virtual HAL registry/integrity drift: ${JSON.stringify(initialVirtualHalRegistry)}`);
}
const diagnosticsArtifact = api.exportDiagnosticsArtifact();
const promotionCandidateSummary = api.getVirtualHalPromotionCandidateSummary();
const expectedPromotionCandidates = [
[
"qtdragon-multi-joint-on-abort",
@@ -458,6 +461,9 @@
"linuxcnc/configs/sim/axis/rose_engine/rcone.ngc",
false,
"linuxcnc/configs/sim/axis/rose_engine/rose_engine.ini",
"rcone.ngc",
34,
"linuxcnc/configs/sim/axis/rose_engine/rose_engine.ini",
"linuxcnc/configs/sim/axis/rose_engine/rcone.ngc",
"linuxcnc/configs/sim/axis/rose_engine/rcone_demo.ngc",
],
@@ -466,6 +472,9 @@
"linuxcnc/configs/sim/axis/external_offsets/queuebuster.ngc",
true,
"linuxcnc/configs/sim/axis/external_offsets/eoffsets.ini",
"queuebuster.ngc",
40,
"linuxcnc/configs/sim/axis/external_offsets/eoffsets.ini",
"linuxcnc/configs/sim/axis/external_offsets/eoffsets.ngc",
],
];
@@ -481,6 +490,18 @@
"L4-PYTHON-REMAP",
],
];
const expectedMacroLoadAuditCandidates = [
[
"gscreen-industrial-lathe-wear-toolchange-audit",
"linuxcnc/configs/sim/gscreen/industrial_lathe_wear/toolchange.ngc",
"blocked-missing-owning-ini",
],
[
"qtvcp-industrial-lathe-wear-toolchange-audit",
"linuxcnc/configs/sim/qtvcp_screens/industrial_lathe_wear/toolchange.ngc",
"blocked-missing-owning-ini",
],
];
if (
diagnosticsArtifact.apiName !== "real-browser-simulation-diagnostics-artifact" ||
diagnosticsArtifact.statusHistory.length === 0 ||
@@ -495,18 +516,41 @@
!diagnosticsArtifact.virtualHalSimConfigSourceCoverage?.sourceFiles?.includes("linuxcnc/configs/sim/qtdragon/qtdragon_xyz45/qtdragon_xyza.ini") ||
!diagnosticsArtifact.virtualHalSimConfigSourceCoverage?.sourceFiles?.includes("linuxcnc/configs/sim/qtdragon_hd/qtdragon_hd_z_compensation/qtdragon_hd_z_compensation.ini") ||
diagnosticsArtifact.virtualHalSimConfigPromotionCandidates?.complete !== true ||
diagnosticsArtifact.virtualHalPromotionCandidateSummary?.ready !== true ||
diagnosticsArtifact.virtualHalPromotionCandidateSummary?.preferredCandidateId !== "qtdragon-multi-joint-on-abort" ||
diagnosticsArtifact.virtualHalPromotionCandidateSummary?.candidateCount !== 8 ||
diagnosticsArtifact.virtualHalPromotionCandidateSummary?.readyCandidateCount !== 8 ||
diagnosticsArtifact.virtualHalPromotionCandidateSummary?.sourceFileCount !== 17 ||
diagnosticsArtifact.virtualHalPromotionCandidateSummary?.inventoryBaseline !== "executed=28 passed=28 skipped=131 unexpected_fail=0" ||
promotionCandidateSummary.ready !== true ||
promotionCandidateSummary.preferredIniPath !== "linuxcnc/configs/sim/qtdragon/qtdragon_multi_joint/qtdragon_xyyz.ini" ||
doc.body.dataset.promotionCandidateReady !== "true" ||
doc.body.dataset.promotionCandidatePreferred !== "qtdragon-multi-joint-on-abort" ||
doc.querySelector('[data-promotion-candidate-summary-value="preferred-candidate"]')?.textContent !== "qtdragon-multi-joint-on-abort" ||
doc.querySelector('[data-promotion-candidate-summary-value="inventory-baseline"]')?.textContent !== "28/28 pass; 131 skip unchanged" ||
!diagnosticsArtifact.virtualHalSimConfigPromotionCandidates?.familyRows?.some((row) =>
row.id === "qtdragon-on-abort" &&
row.candidateCount === 6 &&
row.completeCount === 6 &&
row.explicitBrowserDiagnosticsCount === 6 &&
row.explicitBrowserDiagnosticsReady === true &&
row.complete === true
) ||
!expectedPromotionCandidates.every(([id, ...sourceFiles]) =>
diagnosticsArtifact.virtualHalSimConfigPromotionCandidates?.rows?.some((row) =>
row.id === id &&
row.complete === true &&
row.currentNodeInventoryStatus === "PASS" &&
row.currentMatrixBrowserStatus === "explicit-browser-diagnostics" &&
row.targetBrowserEvidence === "explicit-browser-diagnostics" &&
sourceFiles.every((sourceFile) => row.sourceFiles.includes(sourceFile))
)
) ||
diagnosticsArtifact.virtualHalSimConfigMacroLoadFixtures?.complete !== true ||
diagnosticsArtifact.virtualHalSimConfigMacroLoadFixtures?.blockedFixturePromotionViolations?.length !== 0 ||
!expectedMacroLoadFixtures.every(([id, fixturePath, declaredOnly, ...sourceFiles]) =>
diagnosticsArtifact.virtualHalSimConfigMacroLoadFixtures?.blockedBoundaryEvidenceViolations?.length !== 0 ||
diagnosticsArtifact.virtualHalSimConfigMacroLoadFixtures?.auditPromotionViolations?.length !== 0 ||
!expectedMacroLoadFixtures.every(([id, fixturePath, declaredOnly, declarationSourceFile, declarationValue, declarationLine, ...sourceFiles]) =>
diagnosticsArtifact.virtualHalSimConfigMacroLoadFixtures?.rows?.some((row) =>
row.id === id &&
row.complete === true &&
@@ -514,6 +558,12 @@
row.targetBrowserEvidence === "non-main-fixture-diagnostics" &&
row.fixturePath === fixturePath &&
row.declaredOnly === declaredOnly &&
row.requiresDeclarationEvidence === true &&
row.declarationEvidenceReady === true &&
row.declarationEvidence?.sourceFile === declarationSourceFile &&
row.declarationEvidence?.key === "NGCGUI_SUBFILE" &&
row.declarationEvidence?.value === declarationValue &&
row.declarationEvidence?.line === declarationLine &&
sourceFiles.every((sourceFile) => row.sourceFiles.includes(sourceFile))
)
) ||
@@ -523,6 +573,38 @@
row.fixturePath === fixturePath &&
row.blockedKind === blockedKind &&
row.excludedFromPositiveFixtures === true &&
row.boundaryEvidenceReady === true &&
row.boundaryEvidence?.baselineSummary?.executed === 28 &&
row.boundaryEvidence?.baselineSummary?.passed === 28 &&
row.boundaryEvidence?.baselineSummary?.skipped === 131 &&
row.boundaryEvidence?.baselineSummary?.unexpectedFail === 0 &&
row.boundaryEvidence?.sourceArtifactHashes?.["wasm-port/build/wasm/sim-configs-inventory/boundary-summary.tsv"] === "de6cf57b7c07182e3bcb32e22dbdf202b618cabc14620d6dff1ef815587950b9" &&
row.boundaryEvidence?.sourceArtifactHashes?.["wasm-port/build/wasm/sim-configs-inventory/ini-boundary-summary.tsv"] === "b0afe27224e97a82fbecbbd75a7c86233c98fe957d9c1ba20f0656f8745a5eae" &&
row.boundaryEvidence?.boundarySummary?.recommendedBlocked === "UNAVAILABLE" &&
row.boundaryEvidence?.boundarySummary?.dependencies?.includes("missing_vendored_ini:") &&
row.boundaryEvidence?.iniBoundarySummary?.vendored === 0 &&
row.boundaryEvidence?.iniBoundarySummary?.reportAvailable === 0 &&
row.complete === true
)
) ||
!expectedMacroLoadAuditCandidates.every(([id, fixturePath, auditStatus]) =>
diagnosticsArtifact.virtualHalSimConfigMacroLoadFixtures?.auditRows?.some((row) =>
row.id === id &&
row.fixturePath === fixturePath &&
row.auditStatus === auditStatus &&
row.promotionAllowed === false &&
row.excludedFromPositiveFixtures === true &&
row.boundaryEvidenceReady === true &&
row.boundaryEvidence?.baselineSummary?.executed === 28 &&
row.boundaryEvidence?.baselineSummary?.passed === 28 &&
row.boundaryEvidence?.baselineSummary?.skipped === 131 &&
row.boundaryEvidence?.baselineSummary?.unexpectedFail === 0 &&
row.boundaryEvidence?.sourceArtifactHashes?.["wasm-port/build/wasm/sim-configs-inventory/boundary-summary.tsv"] === "de6cf57b7c07182e3bcb32e22dbdf202b618cabc14620d6dff1ef815587950b9" &&
row.boundaryEvidence?.sourceArtifactHashes?.["wasm-port/build/wasm/sim-configs-inventory/ini-boundary-summary.tsv"] === "b0afe27224e97a82fbecbbd75a7c86233c98fe957d9c1ba20f0656f8745a5eae" &&
row.boundaryEvidence?.boundarySummary?.recommendedBlocked === "UNAVAILABLE" &&
row.boundaryEvidence?.boundarySummary?.dependencies?.includes("missing_vendored_ini:") &&
row.boundaryEvidence?.iniBoundarySummary?.vendored === 0 &&
row.boundaryEvidence?.iniBoundarySummary?.reportAvailable === 0 &&
row.complete === true
)
) ||
@@ -946,6 +1028,7 @@
}
const virtualHalReplacement = api.getVirtualHalSimulationReplacementReport();
const promotionCandidateReport = api.getVirtualHalSimConfigPromotionCandidateReport();
const promotionFamilyRows = api.getVirtualHalPromotionFamilyRows();
const macroLoadFixtureReport = api.getVirtualHalSimConfigMacroLoadFixtureReport();
if (
virtualHalReplacement.apiName !== "linuxcnc-wasm-virtual-hal-simulation-replacement-report" ||
@@ -966,6 +1049,17 @@
!api.getVirtualHalSimConfigSourceCoverageReport().sourceFiles.includes("linuxcnc/configs/sim/qtdragon/qtdragon_xyz/on_abort.ngc") ||
promotionCandidateReport.complete !== true ||
promotionCandidateReport.inventoryBaselineUnchanged !== true ||
doc.body.dataset.promotionFamilyReady !== "true" ||
doc.body.dataset.promotionFamilyCount !== "3" ||
promotionFamilyRows.length !== 3 ||
![
["qtdragon-on-abort", "6/6 ready; sources=12"],
["vismach-remap-sims", "1/1 ready; sources=3"],
["rose-engine-rcone-demo", "1/1 ready; sources=2"],
].every(([id, value]) =>
doc.querySelector(`[data-promotion-family-row="${id}"]`)?.dataset.promotionFamilyReady === "true" &&
doc.querySelector(`[data-promotion-family-value="${id}"]`)?.textContent === value
) ||
!expectedPromotionCandidates.every(([id, ...sourceFiles]) =>
promotionCandidateReport.rows.some((row) =>
row.id === id &&
@@ -978,13 +1072,21 @@
macroLoadFixtureReport.inventoryBaselineUnchanged !== true ||
macroLoadFixtureReport.standaloneMainViolations.length !== 0 ||
macroLoadFixtureReport.blockedFixturePromotionViolations.length !== 0 ||
!expectedMacroLoadFixtures.every(([id, fixturePath, declaredOnly, ...sourceFiles]) =>
macroLoadFixtureReport.blockedBoundaryEvidenceViolations.length !== 0 ||
macroLoadFixtureReport.auditPromotionViolations.length !== 0 ||
!expectedMacroLoadFixtures.every(([id, fixturePath, declaredOnly, declarationSourceFile, declarationValue, declarationLine, ...sourceFiles]) =>
macroLoadFixtureReport.rows.some((row) =>
row.id === id &&
row.complete === true &&
row.nonMainFixture === true &&
row.fixturePath === fixturePath &&
row.declaredOnly === declaredOnly &&
row.requiresDeclarationEvidence === true &&
row.declarationEvidenceReady === true &&
row.declarationEvidence?.sourceFile === declarationSourceFile &&
row.declarationEvidence?.key === "NGCGUI_SUBFILE" &&
row.declarationEvidence?.value === declarationValue &&
row.declarationEvidence?.line === declarationLine &&
sourceFiles.every((sourceFile) => row.sourceFiles.includes(sourceFile))
)
) ||
@@ -994,6 +1096,38 @@
row.fixturePath === fixturePath &&
row.blockedKind === blockedKind &&
row.excludedFromPositiveFixtures === true &&
row.boundaryEvidenceReady === true &&
row.boundaryEvidence?.baselineSummary?.executed === 28 &&
row.boundaryEvidence?.baselineSummary?.passed === 28 &&
row.boundaryEvidence?.baselineSummary?.skipped === 131 &&
row.boundaryEvidence?.baselineSummary?.unexpectedFail === 0 &&
row.boundaryEvidence?.sourceArtifactHashes?.["wasm-port/build/wasm/sim-configs-inventory/boundary-summary.tsv"] === "de6cf57b7c07182e3bcb32e22dbdf202b618cabc14620d6dff1ef815587950b9" &&
row.boundaryEvidence?.sourceArtifactHashes?.["wasm-port/build/wasm/sim-configs-inventory/ini-boundary-summary.tsv"] === "b0afe27224e97a82fbecbbd75a7c86233c98fe957d9c1ba20f0656f8745a5eae" &&
row.boundaryEvidence?.boundarySummary?.recommendedBlocked === "UNAVAILABLE" &&
row.boundaryEvidence?.boundarySummary?.dependencies?.includes("missing_vendored_ini:") &&
row.boundaryEvidence?.iniBoundarySummary?.vendored === 0 &&
row.boundaryEvidence?.iniBoundarySummary?.reportAvailable === 0 &&
row.complete === true
)
) ||
!expectedMacroLoadAuditCandidates.every(([id, fixturePath, auditStatus]) =>
macroLoadFixtureReport.auditRows.some((row) =>
row.id === id &&
row.fixturePath === fixturePath &&
row.auditStatus === auditStatus &&
row.promotionAllowed === false &&
row.excludedFromPositiveFixtures === true &&
row.boundaryEvidenceReady === true &&
row.boundaryEvidence?.baselineSummary?.executed === 28 &&
row.boundaryEvidence?.baselineSummary?.passed === 28 &&
row.boundaryEvidence?.baselineSummary?.skipped === 131 &&
row.boundaryEvidence?.baselineSummary?.unexpectedFail === 0 &&
row.boundaryEvidence?.sourceArtifactHashes?.["wasm-port/build/wasm/sim-configs-inventory/boundary-summary.tsv"] === "de6cf57b7c07182e3bcb32e22dbdf202b618cabc14620d6dff1ef815587950b9" &&
row.boundaryEvidence?.sourceArtifactHashes?.["wasm-port/build/wasm/sim-configs-inventory/ini-boundary-summary.tsv"] === "b0afe27224e97a82fbecbbd75a7c86233c98fe957d9c1ba20f0656f8745a5eae" &&
row.boundaryEvidence?.boundarySummary?.recommendedBlocked === "UNAVAILABLE" &&
row.boundaryEvidence?.boundarySummary?.dependencies?.includes("missing_vendored_ini:") &&
row.boundaryEvidence?.iniBoundarySummary?.vendored === 0 &&
row.boundaryEvidence?.iniBoundarySummary?.reportAvailable === 0 &&
row.complete === true
)
) ||