按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:
@@ -36,8 +36,11 @@ import {
|
||||
VIRTUAL_HAL_COVERAGE_STATES,
|
||||
VIRTUAL_HAL_MOTION_CONTROLLER_MATRIX_FIXTURES,
|
||||
VIRTUAL_HAL_PROJECT_PIN_GROUPS,
|
||||
VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_AUDIT_CANDIDATES,
|
||||
VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_BLOCKED_FIXTURES,
|
||||
VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_FIXTURES,
|
||||
VIRTUAL_HAL_SIM_CONFIG_INVENTORY_ARTIFACT_HASHES,
|
||||
VIRTUAL_HAL_SIM_CONFIG_INVENTORY_BASELINE,
|
||||
VIRTUAL_HAL_SIM_CONFIG_PROMOTION_CANDIDATES,
|
||||
VIRTUAL_HAL_SIM_CONFIG_SOURCE_TARGETS,
|
||||
VIRTUAL_HAL_SOURCE_DERIVED_CAPABILITIES,
|
||||
@@ -178,6 +181,16 @@ const sdkIndexText = readFileSync(resolve(root, "runtime/sdk/src/index.js"), "ut
|
||||
const sdkReadmeText = readFileSync(resolve(root, "runtime/sdk/README.md"), "utf8");
|
||||
const sourceManifestText = readFileSync(resolve(root, "tools/source-manifest.txt"), "utf8");
|
||||
const trackerText = readFileSync(resolve(root, "../PROJECT_COMPLETION_TRACKER.md"), "utf8");
|
||||
const expectedPromotionFamilySummary =
|
||||
"qtdragon-on-abort: 6/6 ready; vismach-remap-sims: 1/1 ready; rose-engine-rcone-demo: 1/1 ready";
|
||||
const expectedPromotionFamilyRows = [
|
||||
["virtual-hal-promotion-family-qtdragon-on-abort", "6/6 ready; sources=12; diagnostics=ready"],
|
||||
["virtual-hal-promotion-family-vismach-remap-sims", "1/1 ready; sources=3; diagnostics=ready"],
|
||||
["virtual-hal-promotion-family-rose-engine-rcone-demo", "1/1 ready; sources=2; diagnostics=ready"],
|
||||
];
|
||||
const hasFreshBoundaryArtifactHashes = (boundaryEvidence) =>
|
||||
Object.entries(VIRTUAL_HAL_SIM_CONFIG_INVENTORY_ARTIFACT_HASHES)
|
||||
.every(([artifactPath, expectedHash]) => boundaryEvidence?.sourceArtifactHashes?.[artifactPath] === expectedHash);
|
||||
|
||||
const requiredExports = [
|
||||
["createLinuxCncIniSdk", createLinuxCncIniSdk],
|
||||
@@ -551,6 +564,10 @@ assert.match(sdkIndexText, /\bVIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_FIXTURES\b/);
|
||||
assert.match(sdkReadmeText, /\bVIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_FIXTURES\b/);
|
||||
assert.match(sdkIndexText, /\bVIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_BLOCKED_FIXTURES\b/);
|
||||
assert.match(sdkReadmeText, /\bVIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_BLOCKED_FIXTURES\b/);
|
||||
assert.match(sdkIndexText, /\bVIRTUAL_HAL_SIM_CONFIG_INVENTORY_ARTIFACT_HASHES\b/);
|
||||
assert.match(sdkReadmeText, /\bVIRTUAL_HAL_SIM_CONFIG_INVENTORY_ARTIFACT_HASHES\b/);
|
||||
assert.match(sdkIndexText, /\bVIRTUAL_HAL_SIM_CONFIG_INVENTORY_BASELINE\b/);
|
||||
assert.match(sdkReadmeText, /\bVIRTUAL_HAL_SIM_CONFIG_INVENTORY_BASELINE\b/);
|
||||
assert.match(sdkIndexText, /\bcreateVirtualHalSimConfigMacroLoadFixtureReport\b/);
|
||||
assert.match(sdkReadmeText, /\bcreateVirtualHalSimConfigMacroLoadFixtureReport\b/);
|
||||
assert.match(sdkIndexText, /\bcreateVirtualHalSourceComplianceReport\b/);
|
||||
@@ -784,6 +801,39 @@ assert.equal(simConfigPromotionCandidateReport.missingCandidates.length, 0);
|
||||
assert.equal(simConfigPromotionCandidateReport.blockedCandidateIds.length, 0);
|
||||
assert.equal(simConfigPromotionCandidateReport.missingManifestFiles.length, 0);
|
||||
assert.equal(simConfigPromotionCandidateReport.missingRequiredReports.length, 0);
|
||||
assert.equal(
|
||||
simConfigPromotionCandidateReport.familyRows.some((row) =>
|
||||
row.id === "qtdragon-on-abort" &&
|
||||
row.candidateCount === 6 &&
|
||||
row.completeCount === 6 &&
|
||||
row.explicitBrowserDiagnosticsCount === 6 &&
|
||||
row.explicitBrowserDiagnosticsReady === true &&
|
||||
row.complete === true &&
|
||||
row.sourceFiles.includes("linuxcnc/configs/sim/qtdragon/qtdragon_multi_joint/qtdragon_xyyz.ini") &&
|
||||
row.sourceFiles.includes("linuxcnc/configs/sim/qtvcp_screens/qtdragon/on_abort.ngc")
|
||||
),
|
||||
true,
|
||||
);
|
||||
assert.equal(
|
||||
simConfigPromotionCandidateReport.familyRows.some((row) =>
|
||||
row.id === "vismach-remap-sims" &&
|
||||
row.candidateCount === 1 &&
|
||||
row.complete === true &&
|
||||
row.explicitBrowserDiagnosticsReady === true &&
|
||||
row.sourceFiles.includes("linuxcnc/configs/sim/axis/vismach/puma/puma_seam_weld.ngc")
|
||||
),
|
||||
true,
|
||||
);
|
||||
assert.equal(
|
||||
simConfigPromotionCandidateReport.familyRows.some((row) =>
|
||||
row.id === "rose-engine-rcone-demo" &&
|
||||
row.candidateCount === 1 &&
|
||||
row.complete === true &&
|
||||
row.explicitBrowserDiagnosticsReady === true &&
|
||||
row.sourceFiles.includes("linuxcnc/configs/sim/axis/rose_engine/rcone_demo.ngc")
|
||||
),
|
||||
true,
|
||||
);
|
||||
const expectedPromotionCandidates = [
|
||||
[
|
||||
"qtdragon-multi-joint-on-abort",
|
||||
@@ -833,6 +883,7 @@ for (const [id, ...sourceFiles] of expectedPromotionCandidates) {
|
||||
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))
|
||||
),
|
||||
@@ -847,6 +898,19 @@ assert.equal(virtualHalRuntime.getSimConfigPromotionCandidateReport({
|
||||
}).complete, true);
|
||||
assert.equal(VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_FIXTURES.length >= 2, true);
|
||||
assert.equal(VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_BLOCKED_FIXTURES.length >= 2, true);
|
||||
assert.equal(VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_AUDIT_CANDIDATES.length >= 2, true);
|
||||
assert.deepEqual(VIRTUAL_HAL_SIM_CONFIG_INVENTORY_BASELINE, {
|
||||
executed: 28,
|
||||
passed: 28,
|
||||
skipped: 131,
|
||||
unexpectedFail: 0,
|
||||
});
|
||||
assert.deepEqual(VIRTUAL_HAL_SIM_CONFIG_INVENTORY_ARTIFACT_HASHES, {
|
||||
"wasm-port/build/wasm/sim-configs-inventory/boundary-summary.tsv":
|
||||
"de6cf57b7c07182e3bcb32e22dbdf202b618cabc14620d6dff1ef815587950b9",
|
||||
"wasm-port/build/wasm/sim-configs-inventory/ini-boundary-summary.tsv":
|
||||
"b0afe27224e97a82fbecbbd75a7c86233c98fe957d9c1ba20f0656f8745a5eae",
|
||||
});
|
||||
const simConfigMacroLoadFixtureReport = createVirtualHalSimConfigMacroLoadFixtureReport({
|
||||
manifestText: sourceManifestText,
|
||||
});
|
||||
@@ -862,7 +926,13 @@ assert.equal(simConfigMacroLoadFixtureReport.missingFixtures.length, 0);
|
||||
assert.equal(simConfigMacroLoadFixtureReport.blockedFixtureIds.length, 0);
|
||||
assert.equal(simConfigMacroLoadFixtureReport.standaloneMainViolations.length, 0);
|
||||
assert.equal(simConfigMacroLoadFixtureReport.blockedFixturePromotionViolations.length, 0);
|
||||
assert.equal(simConfigMacroLoadFixtureReport.blockedBoundaryEvidenceViolations.length, 0);
|
||||
assert.equal(simConfigMacroLoadFixtureReport.missingAuditRows.length, 0);
|
||||
assert.equal(simConfigMacroLoadFixtureReport.auditPromotionViolations.length, 0);
|
||||
assert.equal(simConfigMacroLoadFixtureReport.auditBoundaryEvidenceViolations.length, 0);
|
||||
assert.equal(simConfigMacroLoadFixtureReport.auditPromotionAllowedViolations.length, 0);
|
||||
assert.equal(simConfigMacroLoadFixtureReport.missingManifestFiles.length, 0);
|
||||
assert.equal(simConfigMacroLoadFixtureReport.declarationEvidenceViolations.length, 0);
|
||||
assert.equal(
|
||||
simConfigMacroLoadFixtureReport.rows.some((row) =>
|
||||
row.id === "rose-engine-rcone-macro-load" &&
|
||||
@@ -870,6 +940,12 @@ assert.equal(
|
||||
row.nonMainFixture === true &&
|
||||
row.targetBrowserEvidence === "non-main-fixture-diagnostics" &&
|
||||
row.fixturePath === "linuxcnc/configs/sim/axis/rose_engine/rcone.ngc" &&
|
||||
row.requiresDeclarationEvidence === true &&
|
||||
row.declarationEvidenceReady === true &&
|
||||
row.declarationEvidence.sourceFile === "linuxcnc/configs/sim/axis/rose_engine/rose_engine.ini" &&
|
||||
row.declarationEvidence.key === "NGCGUI_SUBFILE" &&
|
||||
row.declarationEvidence.value === "rcone.ngc" &&
|
||||
row.declarationEvidence.line === 34 &&
|
||||
row.sourceFiles.includes("linuxcnc/configs/sim/axis/rose_engine/rcone.ngc") &&
|
||||
row.sourceFiles.includes("linuxcnc/configs/sim/axis/rose_engine/rcone_demo.ngc")
|
||||
),
|
||||
@@ -881,18 +957,50 @@ assert.equal(
|
||||
row.complete === true &&
|
||||
row.nonMainFixture === true &&
|
||||
row.declaredOnly === true &&
|
||||
row.declarationEvidenceReady === true &&
|
||||
row.declarationEvidence.sourceFile === "linuxcnc/configs/sim/axis/external_offsets/eoffsets.ini" &&
|
||||
row.declarationEvidence.key === "NGCGUI_SUBFILE" &&
|
||||
row.declarationEvidence.value === "queuebuster.ngc" &&
|
||||
row.declarationEvidence.line === 40 &&
|
||||
row.fixturePath === "linuxcnc/configs/sim/axis/external_offsets/queuebuster.ngc" &&
|
||||
row.sourceFiles.includes("linuxcnc/configs/sim/axis/external_offsets/eoffsets.ini") &&
|
||||
row.sourceFiles.includes("linuxcnc/configs/sim/axis/external_offsets/eoffsets.ngc")
|
||||
),
|
||||
true,
|
||||
);
|
||||
assert.equal(createVirtualHalSimConfigMacroLoadFixtureReport({
|
||||
manifestText: sourceManifestText,
|
||||
fixtures: [
|
||||
{
|
||||
...VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_FIXTURES.find(({ id }) => id === "external-offsets-queuebuster-macro-load"),
|
||||
declarationEvidence: null,
|
||||
},
|
||||
],
|
||||
}).declarationEvidenceViolations.includes("external-offsets-queuebuster-macro-load"), true);
|
||||
assert.equal(createVirtualHalSimConfigMacroLoadFixtureReport({
|
||||
manifestText: sourceManifestText,
|
||||
fixtures: [
|
||||
{
|
||||
...VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_FIXTURES.find(({ id }) => id === "rose-engine-rcone-macro-load"),
|
||||
declarationEvidence: null,
|
||||
},
|
||||
],
|
||||
}).declarationEvidenceViolations.includes("rose-engine-rcone-macro-load"), true);
|
||||
assert.equal(
|
||||
simConfigMacroLoadFixtureReport.blockedRows.some((row) =>
|
||||
row.id === "silverdragon-tool-sensor-python-ui-boundary" &&
|
||||
row.fixturePath === "linuxcnc/configs/sim/gscreen/silverdragon/macros/tool_sensor.ngc" &&
|
||||
row.blockedKind === "PYTHON-UI-PROCESS" &&
|
||||
row.excludedFromPositiveFixtures === true &&
|
||||
row.boundaryEvidenceReady === true &&
|
||||
hasFreshBoundaryArtifactHashes(row.boundaryEvidence) &&
|
||||
row.boundaryEvidence.boundarySummary.dependencies.includes("missing_vendored_ini:configs/sim/gscreen/silverdragon/silverdragon.ini") &&
|
||||
row.boundaryEvidence.baselineSummary.executed === VIRTUAL_HAL_SIM_CONFIG_INVENTORY_BASELINE.executed &&
|
||||
row.boundaryEvidence.baselineSummary.passed === VIRTUAL_HAL_SIM_CONFIG_INVENTORY_BASELINE.passed &&
|
||||
row.boundaryEvidence.baselineSummary.skipped === VIRTUAL_HAL_SIM_CONFIG_INVENTORY_BASELINE.skipped &&
|
||||
row.boundaryEvidence.baselineSummary.unexpectedFail === VIRTUAL_HAL_SIM_CONFIG_INVENTORY_BASELINE.unexpectedFail &&
|
||||
row.boundaryEvidence.iniBoundarySummary.vendored === 0 &&
|
||||
row.boundaryEvidence.iniBoundarySummary.reportAvailable === 0 &&
|
||||
row.complete === true
|
||||
),
|
||||
true,
|
||||
@@ -903,10 +1011,170 @@ assert.equal(
|
||||
row.fixturePath === "linuxcnc/configs/sim/gmoccapy/macros/on_abort.ngc" &&
|
||||
row.blockedKind === "L4-PYTHON-REMAP" &&
|
||||
row.excludedFromPositiveFixtures === true &&
|
||||
row.boundaryEvidenceReady === true &&
|
||||
hasFreshBoundaryArtifactHashes(row.boundaryEvidence) &&
|
||||
row.boundaryEvidence.boundarySummary.dependencies.includes("missing_vendored_ini:configs/sim/gmoccapy/6_axis.ini") &&
|
||||
row.boundaryEvidence.baselineSummary.executed === VIRTUAL_HAL_SIM_CONFIG_INVENTORY_BASELINE.executed &&
|
||||
row.boundaryEvidence.baselineSummary.passed === VIRTUAL_HAL_SIM_CONFIG_INVENTORY_BASELINE.passed &&
|
||||
row.boundaryEvidence.baselineSummary.skipped === VIRTUAL_HAL_SIM_CONFIG_INVENTORY_BASELINE.skipped &&
|
||||
row.boundaryEvidence.baselineSummary.unexpectedFail === VIRTUAL_HAL_SIM_CONFIG_INVENTORY_BASELINE.unexpectedFail &&
|
||||
row.boundaryEvidence.iniBoundarySummary.vendored === 0 &&
|
||||
row.boundaryEvidence.iniBoundarySummary.reportAvailable === 0 &&
|
||||
row.complete === true
|
||||
),
|
||||
true,
|
||||
);
|
||||
assert.equal(
|
||||
simConfigMacroLoadFixtureReport.auditRows.some((row) =>
|
||||
row.id === "gscreen-industrial-lathe-wear-toolchange-audit" &&
|
||||
row.fixturePath === "linuxcnc/configs/sim/gscreen/industrial_lathe_wear/toolchange.ngc" &&
|
||||
row.auditStatus === "blocked-missing-owning-ini" &&
|
||||
row.promotionAllowed === false &&
|
||||
row.excludedFromPositiveFixtures === true &&
|
||||
row.boundaryEvidenceReady === true &&
|
||||
hasFreshBoundaryArtifactHashes(row.boundaryEvidence) &&
|
||||
row.boundaryEvidence.boundarySummary.recommendedBlocked === "UNAVAILABLE" &&
|
||||
row.boundaryEvidence.boundarySummary.dependencies.includes("missing_vendored_ini:configs/sim/gscreen/industrial_lathe_wear/industrial_lathe_wear.ini") &&
|
||||
row.boundaryEvidence.baselineSummary.executed === VIRTUAL_HAL_SIM_CONFIG_INVENTORY_BASELINE.executed &&
|
||||
row.boundaryEvidence.baselineSummary.passed === VIRTUAL_HAL_SIM_CONFIG_INVENTORY_BASELINE.passed &&
|
||||
row.boundaryEvidence.baselineSummary.skipped === VIRTUAL_HAL_SIM_CONFIG_INVENTORY_BASELINE.skipped &&
|
||||
row.boundaryEvidence.baselineSummary.unexpectedFail === VIRTUAL_HAL_SIM_CONFIG_INVENTORY_BASELINE.unexpectedFail &&
|
||||
row.boundaryEvidence.iniBoundarySummary.vendored === 0 &&
|
||||
row.boundaryEvidence.iniBoundarySummary.reportAvailable === 0 &&
|
||||
row.complete === true
|
||||
),
|
||||
true,
|
||||
);
|
||||
assert.equal(
|
||||
simConfigMacroLoadFixtureReport.auditRows.some((row) =>
|
||||
row.id === "qtvcp-industrial-lathe-wear-toolchange-audit" &&
|
||||
row.fixturePath === "linuxcnc/configs/sim/qtvcp_screens/industrial_lathe_wear/toolchange.ngc" &&
|
||||
row.auditStatus === "blocked-missing-owning-ini" &&
|
||||
row.promotionAllowed === false &&
|
||||
row.excludedFromPositiveFixtures === true &&
|
||||
row.boundaryEvidenceReady === true &&
|
||||
hasFreshBoundaryArtifactHashes(row.boundaryEvidence) &&
|
||||
row.boundaryEvidence.boundarySummary.recommendedBlocked === "UNAVAILABLE" &&
|
||||
row.boundaryEvidence.boundarySummary.dependencies.includes("missing_vendored_ini:configs/sim/qtvcp_screens/industrial_lathe_wear/industrial_lathe_wear.ini") &&
|
||||
row.boundaryEvidence.baselineSummary.executed === VIRTUAL_HAL_SIM_CONFIG_INVENTORY_BASELINE.executed &&
|
||||
row.boundaryEvidence.baselineSummary.passed === VIRTUAL_HAL_SIM_CONFIG_INVENTORY_BASELINE.passed &&
|
||||
row.boundaryEvidence.baselineSummary.skipped === VIRTUAL_HAL_SIM_CONFIG_INVENTORY_BASELINE.skipped &&
|
||||
row.boundaryEvidence.baselineSummary.unexpectedFail === VIRTUAL_HAL_SIM_CONFIG_INVENTORY_BASELINE.unexpectedFail &&
|
||||
row.boundaryEvidence.iniBoundarySummary.vendored === 0 &&
|
||||
row.boundaryEvidence.iniBoundarySummary.reportAvailable === 0 &&
|
||||
row.complete === true
|
||||
),
|
||||
true,
|
||||
);
|
||||
assert.equal(createVirtualHalSimConfigMacroLoadFixtureReport({
|
||||
manifestText: sourceManifestText,
|
||||
auditCandidates: [],
|
||||
}).complete, true);
|
||||
assert.equal(createVirtualHalSimConfigMacroLoadFixtureReport({
|
||||
manifestText: sourceManifestText,
|
||||
blockedFixtures: [
|
||||
{
|
||||
id: "bad-blocked-boundary-evidence",
|
||||
fixturePath: "linuxcnc/configs/sim/gscreen/silverdragon/macros/tool_sensor.ngc",
|
||||
owningIniPath: "linuxcnc/configs/sim/gscreen/silverdragon/silverdragon.ini",
|
||||
blockedKind: "PYTHON-UI-PROCESS",
|
||||
dependencyClass: "macro-load-python-ui-boundary",
|
||||
reason: "negative fixture: blocked row missing generated boundary evidence must fail",
|
||||
},
|
||||
],
|
||||
}).blockedBoundaryEvidenceViolations.includes("bad-blocked-boundary-evidence"), true);
|
||||
assert.equal(createVirtualHalSimConfigMacroLoadFixtureReport({
|
||||
manifestText: sourceManifestText,
|
||||
blockedFixtures: [
|
||||
{
|
||||
...VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_BLOCKED_FIXTURES.find(
|
||||
({ id }) => id === "silverdragon-tool-sensor-python-ui-boundary",
|
||||
),
|
||||
id: "stale-blocked-boundary-evidence",
|
||||
boundaryEvidence: {
|
||||
...VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_BLOCKED_FIXTURES.find(
|
||||
({ id }) => id === "silverdragon-tool-sensor-python-ui-boundary",
|
||||
).boundaryEvidence,
|
||||
baselineSummary: {
|
||||
...VIRTUAL_HAL_SIM_CONFIG_INVENTORY_BASELINE,
|
||||
skipped: 130,
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
}).blockedBoundaryEvidenceViolations.includes("stale-blocked-boundary-evidence"), true);
|
||||
assert.equal(createVirtualHalSimConfigMacroLoadFixtureReport({
|
||||
manifestText: sourceManifestText,
|
||||
blockedFixtures: [
|
||||
{
|
||||
...VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_BLOCKED_FIXTURES.find(
|
||||
({ id }) => id === "silverdragon-tool-sensor-python-ui-boundary",
|
||||
),
|
||||
id: "stale-hash-blocked-boundary-evidence",
|
||||
boundaryEvidence: {
|
||||
...VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_BLOCKED_FIXTURES.find(
|
||||
({ id }) => id === "silverdragon-tool-sensor-python-ui-boundary",
|
||||
).boundaryEvidence,
|
||||
sourceArtifactHashes: {
|
||||
...VIRTUAL_HAL_SIM_CONFIG_INVENTORY_ARTIFACT_HASHES,
|
||||
"wasm-port/build/wasm/sim-configs-inventory/boundary-summary.tsv": "stale",
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
}).blockedBoundaryEvidenceViolations.includes("stale-hash-blocked-boundary-evidence"), true);
|
||||
assert.equal(createVirtualHalSimConfigMacroLoadFixtureReport({
|
||||
manifestText: sourceManifestText,
|
||||
fixtures: [
|
||||
...VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_FIXTURES,
|
||||
{
|
||||
id: "bad-positive-industrial-lathe-audit",
|
||||
label: "Bad positive industrial lathe audit fixture",
|
||||
fixturePath: "linuxcnc/configs/sim/gscreen/industrial_lathe_wear/toolchange.ngc",
|
||||
sourceFiles: [
|
||||
"linuxcnc/configs/sim/axis/rose_engine/rose_engine.ini",
|
||||
],
|
||||
owningIniPath: "linuxcnc/configs/sim/gscreen/industrial_lathe_wear/industrial_lathe_wear.ini",
|
||||
pairedMainProgram: "linuxcnc/configs/sim/axis/rose_engine/rcone_demo.ngc",
|
||||
declarationSource: "NGCGUI_SUBFILE",
|
||||
currentNodeInventoryStatus: "PASS",
|
||||
dependencyClass: "macro-load-ui-family-audit",
|
||||
targetBrowserEvidence: "non-main-fixture-diagnostics",
|
||||
blockedKind: "-",
|
||||
nonMainFixture: true,
|
||||
declaredOnly: false,
|
||||
evidence: "negative fixture: audit candidate must not be promoted as a positive fixture",
|
||||
},
|
||||
],
|
||||
}).auditPromotionViolations.includes("gscreen-industrial-lathe-wear-toolchange-audit"), true);
|
||||
assert.equal(createVirtualHalSimConfigMacroLoadFixtureReport({
|
||||
manifestText: sourceManifestText,
|
||||
auditCandidates: [
|
||||
{
|
||||
id: "bad-audit-boundary-evidence",
|
||||
fixturePath: "linuxcnc/configs/sim/gscreen/industrial_lathe_wear/toolchange.ngc",
|
||||
owningIniPath: "linuxcnc/configs/sim/gscreen/industrial_lathe_wear/industrial_lathe_wear.ini",
|
||||
dependencyClass: "macro-load-ui-family-audit",
|
||||
auditStatus: "blocked-missing-owning-ini",
|
||||
promotionAllowed: false,
|
||||
reason: "negative fixture: missing generated boundary evidence must fail",
|
||||
},
|
||||
],
|
||||
}).auditBoundaryEvidenceViolations.includes("bad-audit-boundary-evidence"), true);
|
||||
assert.equal(createVirtualHalSimConfigMacroLoadFixtureReport({
|
||||
manifestText: sourceManifestText,
|
||||
auditCandidates: [
|
||||
{
|
||||
id: "bad-audit-promotion-allowed",
|
||||
fixturePath: "linuxcnc/configs/sim/qtvcp_screens/industrial_lathe_wear/toolchange.ngc",
|
||||
owningIniPath: "linuxcnc/configs/sim/qtvcp_screens/industrial_lathe_wear/industrial_lathe_wear.ini",
|
||||
dependencyClass: "macro-load-ui-family-audit",
|
||||
auditStatus: "blocked-missing-owning-ini",
|
||||
promotionAllowed: true,
|
||||
reason: "negative fixture: promotionAllowed true without boundary/source proof must fail",
|
||||
},
|
||||
],
|
||||
}).auditPromotionAllowedViolations.includes("bad-audit-promotion-allowed"), true);
|
||||
assert.equal(virtualHalRuntime.getSimConfigMacroLoadFixtureReport({
|
||||
manifestText: sourceManifestText,
|
||||
}).complete, true);
|
||||
@@ -958,6 +1226,22 @@ const browserDiagnosticsArtifact = {
|
||||
virtualHalSourceCompliance: sourceComplianceReport,
|
||||
virtualHalSimConfigSourceCoverage: simConfigSourceCoverageReport,
|
||||
virtualHalSimConfigPromotionCandidates: simConfigPromotionCandidateReport,
|
||||
virtualHalPromotionCandidateSummary: {
|
||||
apiName: "real-browser-simulation-promotion-candidate-summary",
|
||||
summaryVersion: 1,
|
||||
phase: "ready",
|
||||
ready: true,
|
||||
candidateCount: 8,
|
||||
readyCandidateCount: 8,
|
||||
familyCount: 3,
|
||||
sourceFileCount: 17,
|
||||
preferredCandidateId: "qtdragon-multi-joint-on-abort",
|
||||
preferredIniPath: "linuxcnc/configs/sim/qtdragon/qtdragon_multi_joint/qtdragon_xyyz.ini",
|
||||
preferredGcodePath: "linuxcnc/configs/sim/qtdragon/qtdragon_multi_joint/on_abort.ngc",
|
||||
blockedCandidateIds: [],
|
||||
explicitBrowserDiagnosticsCount: 8,
|
||||
inventoryBaseline: "executed=28 passed=28 skipped=131 unexpected_fail=0",
|
||||
},
|
||||
virtualHalSimConfigMacroLoadFixtures: simConfigMacroLoadFixtureReport,
|
||||
virtualHalCommandScriptFixtures: commandScriptFixtureReport,
|
||||
virtualHalMotionControllerMatrix: manifestCheckedMotionControllerMatrixReport,
|
||||
@@ -984,6 +1268,8 @@ assert.equal(browserDiagnosticsArtifactValidation.sourceComplianceReady, true);
|
||||
assert.equal(browserDiagnosticsArtifactValidation.simConfigSourceCoverageReady, true);
|
||||
assert.equal(browserDiagnosticsArtifactValidation.promotionCandidatesReady, true);
|
||||
assert.equal(browserDiagnosticsArtifactValidation.hasPromotionCandidates, true);
|
||||
assert.equal(browserDiagnosticsArtifactValidation.promotionCandidateSummaryReady, true);
|
||||
assert.equal(browserDiagnosticsArtifactValidation.hasPromotionCandidateSummary, true);
|
||||
assert.equal(browserDiagnosticsArtifactValidation.macroLoadFixturesReady, true);
|
||||
assert.equal(browserDiagnosticsArtifactValidation.hasMacroLoadFixtures, true);
|
||||
assert.equal(browserDiagnosticsArtifactValidation.commandScriptFixturesReady, true);
|
||||
@@ -1004,6 +1290,38 @@ assert.equal(browserDiagnosticsArtifactValidation.sourceFiles.includes("linuxcnc
|
||||
assert.equal(browserDiagnosticsArtifactValidation.sourceFiles.includes("linuxcnc/configs/sim/axis/rose_engine/rcone.ngc"), true);
|
||||
assert.equal(browserDiagnosticsArtifactValidation.sourceFiles.includes("linuxcnc/configs/sim/axis/external_offsets/eoffsets.ini"), true);
|
||||
assert.equal(browserDiagnosticsArtifactValidation.sourceFiles.includes("linuxcnc/configs/sim/axis/external_offsets/eoffsets.ngc"), true);
|
||||
assert.equal(createProjectReleaseBrowserDiagnosticsArtifactValidation({
|
||||
...browserDiagnosticsArtifact,
|
||||
virtualHalPromotionCandidateSummary: undefined,
|
||||
}).missing.includes("virtualHalPromotionCandidateSummary"), true);
|
||||
assert.equal(createProjectReleaseBrowserDiagnosticsArtifactValidation({
|
||||
...browserDiagnosticsArtifact,
|
||||
virtualHalPromotionCandidateSummary: {
|
||||
...browserDiagnosticsArtifact.virtualHalPromotionCandidateSummary,
|
||||
readyCandidateCount: 7,
|
||||
},
|
||||
}).promotionCandidateSummaryReady, false);
|
||||
assert.equal(createProjectReleaseBrowserDiagnosticsArtifactValidation({
|
||||
...browserDiagnosticsArtifact,
|
||||
virtualHalSimConfigMacroLoadFixtures: {
|
||||
...simConfigMacroLoadFixtureReport,
|
||||
auditRows: [],
|
||||
},
|
||||
}).macroLoadFixturesReady, false);
|
||||
assert.equal(createProjectReleaseBrowserDiagnosticsArtifactValidation({
|
||||
...browserDiagnosticsArtifact,
|
||||
virtualHalSimConfigMacroLoadFixtures: {
|
||||
...simConfigMacroLoadFixtureReport,
|
||||
auditBoundaryEvidenceViolations: ["gscreen-industrial-lathe-wear-toolchange-audit"],
|
||||
},
|
||||
}).missing.includes("virtualHalSimConfigMacroLoadFixtures"), true);
|
||||
assert.equal(createProjectReleaseBrowserDiagnosticsArtifactValidation({
|
||||
...browserDiagnosticsArtifact,
|
||||
virtualHalSimConfigMacroLoadFixtures: {
|
||||
...simConfigMacroLoadFixtureReport,
|
||||
auditPromotionAllowedViolations: ["qtvcp-industrial-lathe-wear-toolchange-audit"],
|
||||
},
|
||||
}).ready, false);
|
||||
const runtimeProjectReport = virtualHalRuntime.getProjectReport({ availableFunctions: VIRTUAL_HAL_WASM_BRIDGE_FUNCTIONS });
|
||||
assert.equal(runtimeProjectReport.simulationRuntime.replacesHostRuntimeForSimulation, true);
|
||||
assert.equal(runtimeProjectReport.systemCoverage.unclassifiedSnapshotPins.length, 0);
|
||||
@@ -1143,6 +1461,8 @@ assert.equal(releaseReadinessWaiting.ready, false);
|
||||
assert.deepEqual(releaseReadinessWaiting.missing, [
|
||||
"project-release-gate",
|
||||
"virtual-hal-sim-config-source-coverage",
|
||||
"virtual-hal-sim-config-promotion-candidates",
|
||||
"virtual-hal-sim-config-macro-load-fixtures",
|
||||
"virtual-hal-motion-controller-matrix",
|
||||
]);
|
||||
assert.equal(releaseReadinessWaiting.simConfigInventory.unexpectedFail, 0);
|
||||
@@ -1157,11 +1477,23 @@ assert.equal(
|
||||
const releaseReadinessReady = createProjectReleaseReadinessReport({
|
||||
observedOutputs: ["project_release_gate=ok"],
|
||||
virtualHalSimConfigSourceCoverage: simConfigSourceCoverageReport,
|
||||
virtualHalSimConfigPromotionCandidates: simConfigPromotionCandidateReport,
|
||||
virtualHalSimConfigMacroLoadFixtures: simConfigMacroLoadFixtureReport,
|
||||
virtualHalMotionControllerMatrix: manifestCheckedMotionControllerMatrixReport,
|
||||
});
|
||||
assert.equal(releaseReadinessReady.ready, true);
|
||||
assert.equal(releaseReadinessReady.releaseGate.passed, true);
|
||||
assert.equal(releaseReadinessReady.virtualHalSimConfigSourceCoverageReady, true);
|
||||
assert.equal(releaseReadinessReady.virtualHalSimConfigPromotionCandidatesReady, true);
|
||||
assert.equal(releaseReadinessReady.virtualHalPromotionFamilySummary, expectedPromotionFamilySummary);
|
||||
assert.deepEqual(
|
||||
releaseReadinessReady.virtualHalPromotionFamilyRows.map(({ id, value }) => [
|
||||
`virtual-hal-promotion-family-${id}`,
|
||||
value,
|
||||
]),
|
||||
expectedPromotionFamilyRows,
|
||||
);
|
||||
assert.equal(releaseReadinessReady.virtualHalSimConfigMacroLoadFixturesReady, true);
|
||||
assert.equal(releaseReadinessReady.virtualHalMotionControllerMatrixReady, true);
|
||||
assert.deepEqual(releaseReadinessReady.gateManifest, createProjectReleaseGateManifest());
|
||||
assert.equal(releaseReadinessReady.gateResultMatrix.rows.length, createProjectReleaseGateManifest().gateCount);
|
||||
@@ -1179,6 +1511,8 @@ assert.equal(
|
||||
const releaseReadinessWithScreenshots = createProjectReleaseReadinessReport({
|
||||
gateResults: Object.fromEntries(createProjectReleaseGateManifest().gateIds.map((id) => [id, true])),
|
||||
virtualHalSimConfigSourceCoverage: simConfigSourceCoverageReport,
|
||||
virtualHalSimConfigPromotionCandidates: simConfigPromotionCandidateReport,
|
||||
virtualHalSimConfigMacroLoadFixtures: simConfigMacroLoadFixtureReport,
|
||||
virtualHalMotionControllerMatrix: manifestCheckedMotionControllerMatrixReport,
|
||||
axisScreenshotArtifacts: ["desktop-preview", "desktop-dro", "mobile-preview", "mobile-mdi"].map((viewportName) => ({
|
||||
apiName: "real-browser-simulation-axis-screenshot-artifact",
|
||||
@@ -1214,6 +1548,8 @@ assert.equal(
|
||||
const releaseReadinessArtifact = parseProjectReleaseReadinessArtifactJson(JSON.stringify(createProjectReleaseReadinessReport({
|
||||
gateResults: Object.fromEntries(createProjectReleaseGateManifest().gateIds.map((id) => [id, true])),
|
||||
virtualHalSimConfigSourceCoverage: simConfigSourceCoverageReport,
|
||||
virtualHalSimConfigPromotionCandidates: simConfigPromotionCandidateReport,
|
||||
virtualHalSimConfigMacroLoadFixtures: simConfigMacroLoadFixtureReport,
|
||||
virtualHalMotionControllerMatrix: manifestCheckedMotionControllerMatrixReport,
|
||||
})));
|
||||
assert.equal(releaseReadinessArtifact.apiName, "project-release-readiness-report");
|
||||
@@ -1235,6 +1571,10 @@ assert.deepEqual(releaseReadinessArtifactValidation, {
|
||||
gateResultMatrixReady: true,
|
||||
gateActionPlanReady: true,
|
||||
virtualHalSimConfigSourceCoverageReady: true,
|
||||
virtualHalSimConfigPromotionCandidatesReady: true,
|
||||
virtualHalPromotionFamilySummary: expectedPromotionFamilySummary,
|
||||
virtualHalPromotionFamilyRows: releaseReadinessReady.virtualHalPromotionFamilyRows,
|
||||
virtualHalSimConfigMacroLoadFixturesReady: true,
|
||||
virtualHalMotionControllerMatrixReady: true,
|
||||
axisScreenshotArtifactSummaryReady: true,
|
||||
axisScreenshotArtifactCount: 0,
|
||||
@@ -1284,6 +1624,29 @@ assert.deepEqual(releaseReadinessArtifactValidation, {
|
||||
label: "Virtual HAL sim-config source coverage",
|
||||
value: "ready",
|
||||
},
|
||||
{
|
||||
id: "virtual-hal-sim-config-promotion-candidates",
|
||||
label: "Virtual HAL sim-config promotion candidates",
|
||||
value: "ready",
|
||||
},
|
||||
{
|
||||
id: "virtual-hal-promotion-families",
|
||||
label: "Virtual HAL promotion families",
|
||||
value: expectedPromotionFamilySummary,
|
||||
},
|
||||
...expectedPromotionFamilyRows.map(([id, value]) => ({
|
||||
id,
|
||||
label: `Promotion family ${id.replace("virtual-hal-promotion-family-", "")}`,
|
||||
value,
|
||||
sourceFiles: releaseReadinessReady.virtualHalPromotionFamilyRows.find((row) =>
|
||||
`virtual-hal-promotion-family-${row.id}` === id
|
||||
)?.sourceFiles ?? [],
|
||||
})),
|
||||
{
|
||||
id: "virtual-hal-sim-config-macro-load-fixtures",
|
||||
label: "Virtual HAL sim-config macro/load fixtures",
|
||||
value: "ready",
|
||||
},
|
||||
{
|
||||
id: "virtual-hal-motion-controller-matrix",
|
||||
label: "Virtual HAL motion controller matrix",
|
||||
@@ -1307,6 +1670,20 @@ assert.equal(
|
||||
).statusLine,
|
||||
"Ready: Artifact evidence complete",
|
||||
);
|
||||
assert.equal(
|
||||
createProjectReleaseReadinessArtifactValidationSummaryViewModel(
|
||||
releaseReadinessArtifactValidation,
|
||||
).rows.find(({ id }) => id === "virtual-hal-promotion-families")?.value,
|
||||
expectedPromotionFamilySummary,
|
||||
);
|
||||
assert.deepEqual(
|
||||
createProjectReleaseReadinessArtifactValidationSummaryViewModel(
|
||||
releaseReadinessArtifactValidation,
|
||||
).rows
|
||||
.filter(({ id }) => id.startsWith("virtual-hal-promotion-family-"))
|
||||
.map(({ id, value }) => [id, value]),
|
||||
expectedPromotionFamilyRows,
|
||||
);
|
||||
assert.equal(
|
||||
createProjectReleaseReadinessArtifactValidationActionPlan(releaseReadinessArtifactValidation).shellScript,
|
||||
"# Project release readiness artifact validation is already ready.\n",
|
||||
@@ -1350,6 +1727,34 @@ assert.equal(
|
||||
).statusLine,
|
||||
"Ready: Artifact URL workflow complete",
|
||||
);
|
||||
assert.equal(
|
||||
createProjectReleaseReadinessArtifactUrlWorkflowSummaryViewModel(
|
||||
await loadProjectReleaseReadinessArtifactUrlWorkflow({
|
||||
artifactUrl: "/project-release-readiness.json",
|
||||
fetchRef: async () => ({
|
||||
ok: true,
|
||||
status: 200,
|
||||
text: async () => JSON.stringify(releaseReadinessArtifact),
|
||||
}),
|
||||
}),
|
||||
).rows.find(({ id }) => id === "virtual-hal-promotion-families")?.value,
|
||||
expectedPromotionFamilySummary,
|
||||
);
|
||||
assert.deepEqual(
|
||||
createProjectReleaseReadinessArtifactUrlWorkflowSummaryViewModel(
|
||||
await loadProjectReleaseReadinessArtifactUrlWorkflow({
|
||||
artifactUrl: "/project-release-readiness.json",
|
||||
fetchRef: async () => ({
|
||||
ok: true,
|
||||
status: 200,
|
||||
text: async () => JSON.stringify(releaseReadinessArtifact),
|
||||
}),
|
||||
}),
|
||||
).rows
|
||||
.filter(({ id }) => id.startsWith("virtual-hal-promotion-family-"))
|
||||
.map(({ id, value }) => [id, value]),
|
||||
expectedPromotionFamilyRows,
|
||||
);
|
||||
assert.equal(
|
||||
createProjectReleaseReadinessArtifactUrlWorkflowActionPlan(
|
||||
await loadProjectReleaseReadinessArtifactUrlWorkflow({
|
||||
@@ -1386,6 +1791,8 @@ assert.deepEqual(
|
||||
"simConfigInventory.skipped",
|
||||
"simConfigInventory.unexpectedFail",
|
||||
"virtualHalSimConfigSourceCoverage",
|
||||
"virtualHalSimConfigPromotionCandidates",
|
||||
"virtualHalSimConfigMacroLoadFixtures",
|
||||
"virtualHalMotionControllerMatrix",
|
||||
"blockedRuntimeFamilies",
|
||||
"gateManifest",
|
||||
|
||||
Reference in New Issue
Block a user