按text25.txt规划,实现L4-PYTHON-REMAP接入数控系统仿真系统
结论:已接入Python remap runtime proof chain,覆盖native、WASM、browser与release gate证据链;继续保持promotion_allowed=0,不批量解锁L4-PYTHON-REMAP。
This commit is contained in:
@@ -81,7 +81,7 @@ const browserDiagnosticsArtifact = {
|
||||
preferredGcodePath: "linuxcnc/configs/sim/qtdragon/qtdragon_multi_joint/on_abort.ngc",
|
||||
blockedCandidateIds: [],
|
||||
explicitBrowserDiagnosticsCount: 8,
|
||||
inventoryBaseline: "executed=28 passed=28 skipped=131 unexpected_fail=0",
|
||||
inventoryBaseline: "executed=29 passed=29 skipped=130 unexpected_fail=0",
|
||||
},
|
||||
virtualHalSimConfigMacroLoadFixtures,
|
||||
virtualHalCommandScriptFixtures: createVirtualHalCommandScriptFixtureReport({ halState: virtualHalState }),
|
||||
@@ -203,7 +203,7 @@ assert.equal(
|
||||
);
|
||||
assert.equal(
|
||||
readySummary.rows.find(({ id }) => id === "virtual-hal-promotion-candidate-baseline")?.value,
|
||||
"executed=28 passed=28 skipped=131 unexpected_fail=0",
|
||||
"executed=29 passed=29 skipped=130 unexpected_fail=0",
|
||||
);
|
||||
assert.equal(
|
||||
readySummary.rows.find(({ id }) => id === "promotion-candidate-artifact")?.value,
|
||||
@@ -211,11 +211,11 @@ assert.equal(
|
||||
);
|
||||
assert.equal(
|
||||
readySummary.rows.find(({ id }) => id === "promotion-candidate-layers")?.value,
|
||||
"evidence-ready=8 inventory-ready=20",
|
||||
"evidence-ready=8 inventory-ready=19",
|
||||
);
|
||||
assert.equal(
|
||||
readySummary.rows.find(({ id }) => id === "promotion-candidate-total")?.value,
|
||||
"28",
|
||||
"27",
|
||||
);
|
||||
assert.equal(
|
||||
readySummary.rows.find(({ id }) => id === "evidence-ready-candidate-rows")?.value,
|
||||
@@ -239,15 +239,15 @@ assert.equal(
|
||||
);
|
||||
assert.equal(
|
||||
readySummary.rows.find(({ id }) => id === "evidence-expansion-candidates")?.value,
|
||||
"13",
|
||||
"14",
|
||||
);
|
||||
assert.equal(
|
||||
readySummary.rows.find(({ id }) => id === "promotion-candidate-artifact-rows")?.value,
|
||||
"28",
|
||||
"27",
|
||||
);
|
||||
assert.equal(
|
||||
readySummary.rows.find(({ id }) => id === "evidence-expansion-artifact-rows")?.value,
|
||||
"13",
|
||||
"14",
|
||||
);
|
||||
assert.equal(
|
||||
readySummary.rows.find(({ id }) => id === "evidence-expansion-next-evidence")?.value,
|
||||
@@ -291,11 +291,11 @@ assert.equal(
|
||||
);
|
||||
assert.equal(
|
||||
readySummary.rows.find(({ id }) => id === "hard-block-runtime-locked-rows")?.value,
|
||||
"19",
|
||||
"18",
|
||||
);
|
||||
assert.equal(
|
||||
readySummary.rows.find(({ id }) => id === "hard-block-runtime-locked-preview")?.value,
|
||||
"L4-TOOL-DB:axis/db_demo/base.ngc, L4-PYTHON-REMAP:axis/laser/raster_test.ngc, L4-PYTHON-REMAP:axis/laser/vector_test.ngc",
|
||||
"L4-PYTHON-REMAP:axis/laser/raster_test.ngc, L4-PYTHON-REMAP:axis/laser/vector_test.ngc, L4-PYTHON-REMAP:axis/laser/vector_test2.ngc",
|
||||
);
|
||||
assert.equal(
|
||||
readySummary.rows.find(({ id }) => id === "hard-block-runtime-promotion-allowed")?.value,
|
||||
@@ -303,31 +303,23 @@ assert.equal(
|
||||
);
|
||||
assert.equal(
|
||||
readySummary.rows.find(({ id }) => id === "hard-block-runtime-family-count")?.value,
|
||||
"3",
|
||||
"2",
|
||||
);
|
||||
assert.equal(
|
||||
readySummary.rows.find(({ id }) => id === "hard-block-runtime-family-summary")?.value,
|
||||
"L4-USER-M-PROCESS:1 locked=yes, L4-TOOL-DB:1 locked=yes, L4-PYTHON-REMAP:17 locked=yes",
|
||||
"L4-USER-M-PROCESS:1 locked=yes, L4-PYTHON-REMAP:17 locked=yes",
|
||||
);
|
||||
assert.equal(
|
||||
readySummary.rows.find(({ id }) => id === "hard-block-runtime-detail-row-count")?.value,
|
||||
"19",
|
||||
"18",
|
||||
);
|
||||
assert.equal(
|
||||
readySummary.rows.find(({ id }) => id === "hard-block-runtime-detail-preview-1")?.value,
|
||||
"L4-TOOL-DB:axis/db_demo/base.ngc; reason=design_tooldata_db_protocol_boundary; next=db_program_v2_1_handshake_getall_load_unload_or_put; promotion_allowed=0",
|
||||
);
|
||||
assert.equal(
|
||||
readySummary.rows.find(({ id }) => id === "hard-block-runtime-family-L4-TOOL-DB")?.value,
|
||||
"1 locked rows; promotion_allowed=0; first=axis/db_demo/base.ngc; reason=design_tooldata_db_protocol_boundary; next=db_program_v2_1_handshake_getall_load_unload_or_put",
|
||||
);
|
||||
assert.equal(
|
||||
readySummary.rows.find(({ id }) => id === "hard-block-runtime-family-L4-TOOL-DB-paths")?.value,
|
||||
"axis/db_demo/base.ngc",
|
||||
"L4-PYTHON-REMAP:axis/laser/raster_test.ngc; reason=design_linuxcnc_python_runtime_boundary; next=python_runtime_owner_and_fixture; promotion_allowed=0",
|
||||
);
|
||||
assert.equal(
|
||||
readySummary.rows.find(({ id }) => id === "hard-block-runtime-lock")?.value,
|
||||
"locked (3 families)",
|
||||
"locked (2 families)",
|
||||
);
|
||||
assert.equal(
|
||||
readySummary.rows.find(({ id }) => id === "promoted-blocked-family-count")?.value,
|
||||
@@ -351,16 +343,16 @@ assert.deepEqual(
|
||||
["artifact-validation", "ready"],
|
||||
["virtual-hal-promotion-families", expectedPromotionFamilySummary],
|
||||
["promotion-candidate-artifact", "wasm-port/build/wasm/sim-configs-inventory/promotion-candidates.tsv"],
|
||||
["promotion-candidate-layers", "evidence-ready=8 inventory-ready=20"],
|
||||
["promotion-candidate-total", "28"],
|
||||
["promotion-candidate-layers", "evidence-ready=8 inventory-ready=19"],
|
||||
["promotion-candidate-total", "27"],
|
||||
["evidence-ready-candidate-rows", "8"],
|
||||
["evidence-ready-candidate-preview", "qtdragon-multi-joint-on-abort"],
|
||||
["evidence-ready-candidate-preview-gcode", "linuxcnc/configs/sim/qtdragon/qtdragon_multi_joint/on_abort.ngc"],
|
||||
["evidence-ready-candidate-promotion-allowed", "0"],
|
||||
["evidence-ready-candidate-baseline-changing", "no"],
|
||||
["promotion-candidate-artifact-rows", "28"],
|
||||
["evidence-expansion-candidates", "13"],
|
||||
["evidence-expansion-artifact-rows", "13"],
|
||||
["promotion-candidate-artifact-rows", "27"],
|
||||
["evidence-expansion-candidates", "14"],
|
||||
["evidence-expansion-artifact-rows", "14"],
|
||||
["evidence-expansion-next-evidence", "browser-diagnostics-binding"],
|
||||
["evidence-expansion-baseline-changing", "no"],
|
||||
["evidence-expansion-preferred-candidate", "woodpecker-on-abort"],
|
||||
@@ -371,22 +363,20 @@ assert.deepEqual(
|
||||
["evidence-expansion-source-count-list", "3, 3, 3"],
|
||||
["evidence-expansion-artifact", "wasm-port/build/wasm/sim-configs-inventory/evidence-expansion-candidates.tsv"],
|
||||
["promotion-candidate-allowed", "0"],
|
||||
["hard-block-runtime-locked-rows", "19"],
|
||||
["hard-block-runtime-locked-preview", "L4-TOOL-DB:axis/db_demo/base.ngc, L4-PYTHON-REMAP:axis/laser/raster_test.ngc, L4-PYTHON-REMAP:axis/laser/vector_test.ngc"],
|
||||
["hard-block-runtime-locked-rows", "18"],
|
||||
["hard-block-runtime-locked-preview", "L4-PYTHON-REMAP:axis/laser/raster_test.ngc, L4-PYTHON-REMAP:axis/laser/vector_test.ngc, L4-PYTHON-REMAP:axis/laser/vector_test2.ngc"],
|
||||
["hard-block-runtime-promotion-allowed", "0"],
|
||||
["hard-block-runtime-family-count", "3"],
|
||||
["hard-block-runtime-family-summary", "L4-USER-M-PROCESS:1 locked=yes, L4-TOOL-DB:1 locked=yes, L4-PYTHON-REMAP:17 locked=yes"],
|
||||
["hard-block-runtime-detail-row-count", "19"],
|
||||
["hard-block-runtime-detail-preview-1", "L4-TOOL-DB:axis/db_demo/base.ngc; reason=design_tooldata_db_protocol_boundary; next=db_program_v2_1_handshake_getall_load_unload_or_put; promotion_allowed=0"],
|
||||
["hard-block-runtime-detail-preview-2", "L4-PYTHON-REMAP:axis/laser/raster_test.ngc; reason=design_linuxcnc_python_runtime_boundary; next=python_runtime_owner_and_fixture; promotion_allowed=0"],
|
||||
["hard-block-runtime-detail-preview-3", "L4-PYTHON-REMAP:axis/laser/vector_test.ngc; reason=design_linuxcnc_python_runtime_boundary; next=python_runtime_owner_and_fixture; promotion_allowed=0"],
|
||||
["hard-block-runtime-detail-preview-4", "L4-PYTHON-REMAP:axis/laser/vector_test2.ngc; reason=design_linuxcnc_python_runtime_boundary; next=python_runtime_owner_and_fixture; promotion_allowed=0"],
|
||||
["hard-block-runtime-detail-preview-5", "L4-PYTHON-REMAP:axis/remap/cycle/nc_files/examples.ngc; reason=design_linuxcnc_python_runtime_boundary; next=python_runtime_owner_and_fixture; promotion_allowed=0"],
|
||||
["hard-block-runtime-family-count", "2"],
|
||||
["hard-block-runtime-family-summary", "L4-USER-M-PROCESS:1 locked=yes, L4-PYTHON-REMAP:17 locked=yes"],
|
||||
["hard-block-runtime-detail-row-count", "18"],
|
||||
["hard-block-runtime-detail-preview-1", "L4-PYTHON-REMAP:axis/laser/raster_test.ngc; reason=design_linuxcnc_python_runtime_boundary; next=python_runtime_owner_and_fixture; promotion_allowed=0"],
|
||||
["hard-block-runtime-detail-preview-2", "L4-PYTHON-REMAP:axis/laser/vector_test.ngc; reason=design_linuxcnc_python_runtime_boundary; next=python_runtime_owner_and_fixture; promotion_allowed=0"],
|
||||
["hard-block-runtime-detail-preview-3", "L4-PYTHON-REMAP:axis/laser/vector_test2.ngc; reason=design_linuxcnc_python_runtime_boundary; next=python_runtime_owner_and_fixture; promotion_allowed=0"],
|
||||
["hard-block-runtime-detail-preview-4", "L4-PYTHON-REMAP:axis/remap/cycle/nc_files/examples.ngc; reason=design_linuxcnc_python_runtime_boundary; next=python_runtime_owner_and_fixture; promotion_allowed=0"],
|
||||
["hard-block-runtime-detail-preview-5", "L4-PYTHON-REMAP:axis/remap/extend-builtins/nc_files/examples.ngc; reason=design_linuxcnc_python_runtime_boundary; next=python_runtime_owner_and_fixture; promotion_allowed=0"],
|
||||
["hard-block-runtime-family-L4-USER-M-PROCESS", "1 locked rows; promotion_allowed=0; first=axis/vismach/millturn/example.ngc; reason=design_m128_m129_linuxcnc_state_boundary; next=kinstype_guard_and_ini_xyz_hal_pin_state"],
|
||||
["hard-block-runtime-family-L4-TOOL-DB", "1 locked rows; promotion_allowed=0; first=axis/db_demo/base.ngc; reason=design_tooldata_db_protocol_boundary; next=db_program_v2_1_handshake_getall_load_unload_or_put"],
|
||||
["hard-block-runtime-family-L4-PYTHON-REMAP", "17 locked rows; promotion_allowed=0; first=axis/laser/raster_test.ngc; reason=design_linuxcnc_python_runtime_boundary; next=python_runtime_owner_and_fixture"],
|
||||
["hard-block-runtime-family-L4-USER-M-PROCESS-paths", "axis/vismach/millturn/example.ngc"],
|
||||
["hard-block-runtime-family-L4-TOOL-DB-paths", "axis/db_demo/base.ngc"],
|
||||
["hard-block-runtime-family-L4-PYTHON-REMAP-paths", "axis/laser/raster_test.ngc, axis/laser/vector_test.ngc, axis/laser/vector_test2.ngc, axis/remap/cycle/nc_files/examples.ngc, axis/remap/extend-builtins/nc_files/examples.ngc, axis/remap/getting-started/nc_files/examples.ngc, axis/remap/manual-toolchange-with-tool-length-switch/nc_files/tcdemo.ngc, axis/remap/rack-toolchange/nc_files/tcdemo.ngc, axis/remap/stop-lookahead/nc_files/examples.ngc, axis/vismach/5axis/table-rotary_spindle-rotary-nutating/demos/circular_pocket.ngc, axis/vismach/5axis/table-rotary_spindle-rotary-nutating/demos/incremental_repetition_back_and_forth.ngc, axis/vismach/5axis/table-rotary_spindle-rotary-nutating/demos/incremental_repetition.ngc, axis/vismach/5axis/table-rotary_spindle-rotary-nutating/demos/simple_example.ngc, axis/vismach/VMC_toolchange/toolchange.ngc, gmoccapy/non_trivial_kinematics/table-rotary-tilting/examples/boat-xyzac.ngc, gmoccapy/non_trivial_kinematics/table-rotary-tilting/examples/boat-xyzbc.ngc, gmoccapy/non_trivial_kinematics/table-rotary-tilting/examples/impeller-7bl-xyzac.ngc"],
|
||||
["tool-db-process-proof", "ready"],
|
||||
["tool-db-process-proof-detail", "wasm=ready browser=ready opfs=ready promotion_allowed=0"],
|
||||
@@ -400,8 +390,8 @@ assert.deepEqual(
|
||||
["virtual-hal-promotion-family-count", "3 families"],
|
||||
["virtual-hal-promotion-source-file-count", "17 source files"],
|
||||
["virtual-hal-promotion-browser-diagnostics-count", "8 diagnostics-ready"],
|
||||
["virtual-hal-promotion-candidate-baseline", "executed=28 passed=28 skipped=131 unexpected_fail=0"],
|
||||
["hard-block-runtime-lock", "locked (3 families)"],
|
||||
["virtual-hal-promotion-candidate-baseline", "executed=29 passed=29 skipped=130 unexpected_fail=0"],
|
||||
["hard-block-runtime-lock", "locked (2 families)"],
|
||||
["promoted-blocked-family-count", "0 promoted"],
|
||||
["saved-session-diagnostics", "ready"],
|
||||
["next-command", "none"],
|
||||
|
||||
@@ -282,7 +282,7 @@ assert.deepEqual(createProjectReleaseReadinessSummaryViewModel(report), {
|
||||
{
|
||||
id: "promotion-candidate-layers",
|
||||
label: "Promotion candidate layers",
|
||||
value: "evidence-ready=8 inventory-ready=20",
|
||||
value: "evidence-ready=8 inventory-ready=19",
|
||||
},
|
||||
{
|
||||
id: "promotion-candidate-allowed",
|
||||
@@ -292,7 +292,7 @@ assert.deepEqual(createProjectReleaseReadinessSummaryViewModel(report), {
|
||||
{
|
||||
id: "evidence-expansion-candidates",
|
||||
label: "Evidence expansion candidates",
|
||||
value: "13",
|
||||
value: "14",
|
||||
},
|
||||
{
|
||||
id: "evidence-expansion-next-evidence",
|
||||
@@ -327,12 +327,12 @@ assert.deepEqual(createProjectReleaseReadinessSummaryViewModel(report), {
|
||||
{
|
||||
id: "blocked-runtime-families",
|
||||
label: "Blocked runtime families",
|
||||
value: "L4-USER-M-PROCESS, L4-TOOL-DB, L4-PYTHON-REMAP",
|
||||
value: "L4-USER-M-PROCESS, L4-PYTHON-REMAP",
|
||||
},
|
||||
{
|
||||
id: "hard-block-runtime-lock",
|
||||
label: "Hard-block runtime lock",
|
||||
value: "locked (3 families)",
|
||||
value: "locked (2 families)",
|
||||
},
|
||||
{
|
||||
id: "promoted-blocked-family-count",
|
||||
@@ -362,9 +362,9 @@ assert.equal(
|
||||
virtualHalSimConfigPromotionCandidates,
|
||||
virtualHalSimConfigMacroLoadFixtures,
|
||||
virtualHalMotionControllerMatrix,
|
||||
promotedRuntimeFamilies: ["L4-TOOL-DB"],
|
||||
promotedRuntimeFamilies: ["L4-PYTHON-REMAP"],
|
||||
})).rows.find(({ id }) => id === "blocked-runtime-families")?.value,
|
||||
"promoted: L4-TOOL-DB",
|
||||
"promoted: L4-PYTHON-REMAP",
|
||||
);
|
||||
|
||||
const artifactValidationSummary = createProjectReleaseReadinessArtifactValidationSummaryViewModel(
|
||||
@@ -413,11 +413,11 @@ assert.deepEqual(
|
||||
["virtual-hal-sim-config-source-coverage", "ready"],
|
||||
["virtual-hal-sim-config-promotion-candidates", "ready"],
|
||||
["promotion-candidate-artifact", "wasm-port/build/wasm/sim-configs-inventory/promotion-candidates.tsv"],
|
||||
["promotion-candidate-layers", "evidence-ready=8 inventory-ready=20"],
|
||||
["promotion-candidate-total", "28"],
|
||||
["promotion-candidate-artifact-rows", "28"],
|
||||
["evidence-expansion-candidates", "13"],
|
||||
["evidence-expansion-artifact-rows", "13"],
|
||||
["promotion-candidate-layers", "evidence-ready=8 inventory-ready=19"],
|
||||
["promotion-candidate-total", "27"],
|
||||
["promotion-candidate-artifact-rows", "27"],
|
||||
["evidence-expansion-candidates", "14"],
|
||||
["evidence-expansion-artifact-rows", "14"],
|
||||
["evidence-expansion-next-evidence", "browser-diagnostics-binding"],
|
||||
["evidence-expansion-baseline-changing", "no"],
|
||||
["evidence-expansion-artifact", "wasm-port/build/wasm/sim-configs-inventory/evidence-expansion-candidates.tsv"],
|
||||
@@ -516,16 +516,16 @@ assert.deepEqual(
|
||||
["artifact-validation", "ready"],
|
||||
["virtual-hal-promotion-families", expectedPromotionFamilySummary],
|
||||
["promotion-candidate-artifact", "wasm-port/build/wasm/sim-configs-inventory/promotion-candidates.tsv"],
|
||||
["promotion-candidate-layers", "evidence-ready=8 inventory-ready=20"],
|
||||
["promotion-candidate-total", "28"],
|
||||
["promotion-candidate-layers", "evidence-ready=8 inventory-ready=19"],
|
||||
["promotion-candidate-total", "27"],
|
||||
["evidence-ready-candidate-rows", "0"],
|
||||
["evidence-ready-candidate-preview", "not provided"],
|
||||
["evidence-ready-candidate-preview-gcode", "not provided"],
|
||||
["evidence-ready-candidate-promotion-allowed", "0"],
|
||||
["evidence-ready-candidate-baseline-changing", "no"],
|
||||
["promotion-candidate-artifact-rows", "28"],
|
||||
["evidence-expansion-candidates", "13"],
|
||||
["evidence-expansion-artifact-rows", "13"],
|
||||
["promotion-candidate-artifact-rows", "27"],
|
||||
["evidence-expansion-candidates", "14"],
|
||||
["evidence-expansion-artifact-rows", "14"],
|
||||
["evidence-expansion-next-evidence", "browser-diagnostics-binding"],
|
||||
["evidence-expansion-baseline-changing", "no"],
|
||||
["evidence-expansion-preferred-candidate", "not provided"],
|
||||
@@ -539,14 +539,12 @@ assert.deepEqual(
|
||||
["hard-block-runtime-locked-rows", "0"],
|
||||
["hard-block-runtime-locked-preview", "not provided"],
|
||||
["hard-block-runtime-promotion-allowed", "0"],
|
||||
["hard-block-runtime-family-count", "3"],
|
||||
["hard-block-runtime-family-summary", "L4-USER-M-PROCESS:0 locked=yes, L4-TOOL-DB:0 locked=yes, L4-PYTHON-REMAP:0 locked=yes"],
|
||||
["hard-block-runtime-family-count", "2"],
|
||||
["hard-block-runtime-family-summary", "L4-USER-M-PROCESS:0 locked=yes, L4-PYTHON-REMAP:0 locked=yes"],
|
||||
["hard-block-runtime-detail-row-count", "0"],
|
||||
["hard-block-runtime-family-L4-USER-M-PROCESS", "0 locked rows; promotion_allowed=0; first=not provided; reason=not provided; next=not provided"],
|
||||
["hard-block-runtime-family-L4-TOOL-DB", "0 locked rows; promotion_allowed=0; first=not provided; reason=not provided; next=not provided"],
|
||||
["hard-block-runtime-family-L4-PYTHON-REMAP", "0 locked rows; promotion_allowed=0; first=not provided; reason=not provided; next=not provided"],
|
||||
["hard-block-runtime-family-L4-USER-M-PROCESS-paths", "not provided"],
|
||||
["hard-block-runtime-family-L4-TOOL-DB-paths", "not provided"],
|
||||
["hard-block-runtime-family-L4-PYTHON-REMAP-paths", "not provided"],
|
||||
["tool-db-process-proof", "ready"],
|
||||
["tool-db-process-proof-detail", "wasm=ready browser=ready opfs=ready promotion_allowed=0"],
|
||||
@@ -561,7 +559,7 @@ assert.deepEqual(
|
||||
["virtual-hal-promotion-source-file-count", "not provided"],
|
||||
["virtual-hal-promotion-browser-diagnostics-count", "not provided"],
|
||||
["virtual-hal-promotion-candidate-baseline", "not provided"],
|
||||
["hard-block-runtime-lock", "locked (3 families)"],
|
||||
["hard-block-runtime-lock", "locked (2 families)"],
|
||||
["promoted-blocked-family-count", "0 promoted"],
|
||||
["saved-session-diagnostics", "not requested"],
|
||||
["next-command", "none"],
|
||||
|
||||
211
wasm-port/tests/sdk/node/verify_python_remap_runtime_port.mjs
Normal file
211
wasm-port/tests/sdk/node/verify_python_remap_runtime_port.mjs
Normal file
@@ -0,0 +1,211 @@
|
||||
import assert from "node:assert/strict";
|
||||
|
||||
import {
|
||||
createLinuxCncPythonRemapBrowserWorkerAdapter,
|
||||
} from "../../../runtime/sdk/src/python-remap-browser-worker-adapter.js";
|
||||
import {
|
||||
PYTHON_REMAP_RUNTIME_PORT_CONTRACT_VERSION,
|
||||
PYTHON_REMAP_STOP_LOOKAHEAD_FIXTURE,
|
||||
createLinuxCncPythonRemapRuntimePort,
|
||||
createPythonRemapLifecyclePlan,
|
||||
createPythonRemapRuntimeDiagnostics,
|
||||
validatePythonRemapLifecycleTranscript,
|
||||
} from "../../../runtime/sdk/src/python-remap-runtime-port.js";
|
||||
|
||||
assert.equal(PYTHON_REMAP_RUNTIME_PORT_CONTRACT_VERSION, 1);
|
||||
assert.equal(PYTHON_REMAP_STOP_LOOKAHEAD_FIXTURE.fixtureFamily, "axis/remap/stop-lookahead/nc_files");
|
||||
assert.equal(PYTHON_REMAP_STOP_LOOKAHEAD_FIXTURE.topLevelPath, "python/toplevel.py");
|
||||
assert.equal(PYTHON_REMAP_STOP_LOOKAHEAD_FIXTURE.callableName, "queuebuster");
|
||||
assert.deepEqual(
|
||||
createPythonRemapLifecyclePlan().map((step) => step.phase),
|
||||
[
|
||||
"initialize_python",
|
||||
"apply_ini_python_path",
|
||||
"execute_toplevel",
|
||||
"import_module",
|
||||
"callable_lookup",
|
||||
"callable_invoke",
|
||||
"remap_phase_dispatch",
|
||||
"generator_finish",
|
||||
"export_interpreter_state",
|
||||
"export_diagnostics",
|
||||
],
|
||||
);
|
||||
|
||||
const contractOnlyPort = createLinuxCncPythonRemapRuntimePort({
|
||||
runtimeMode: "contract-only",
|
||||
});
|
||||
const contractOnlyStart = await contractOnlyPort.start();
|
||||
assert.deepEqual(contractOnlyStart, {
|
||||
runtimeMode: "contract-only",
|
||||
runtimeExecutionReady: false,
|
||||
status: null,
|
||||
executionEnabled: false,
|
||||
promotionAllowed: false,
|
||||
bulkPromotionAllowed: false,
|
||||
});
|
||||
const contractOnlyPlan = await contractOnlyPort.runLifecyclePlan();
|
||||
assert.equal(contractOnlyPlan.status, "blocked_runtime_adapter_required");
|
||||
assert.equal(contractOnlyPlan.runtimeExecutionReady, false);
|
||||
assert.equal(contractOnlyPlan.executionEnabled, false);
|
||||
assert.equal(contractOnlyPlan.promotionAllowed, false);
|
||||
assert.equal(contractOnlyPlan.bulkPromotionAllowed, false);
|
||||
assert.equal(contractOnlyPort.exportDiagnostics().lifecycleTranscriptReady, false);
|
||||
await contractOnlyPort.close();
|
||||
|
||||
class FakeBlockedWorker {
|
||||
constructor() {
|
||||
this.listeners = new Map();
|
||||
}
|
||||
|
||||
addEventListener(type, listener) {
|
||||
this.listeners.set(type, listener);
|
||||
}
|
||||
|
||||
postMessage(message) {
|
||||
queueMicrotask(() => {
|
||||
this.listeners.get("message")?.({
|
||||
data: {
|
||||
id: message.id,
|
||||
type: message.type,
|
||||
ok: true,
|
||||
runtimeExecutionReady: false,
|
||||
status: "blocked_browser_python_wasm_runtime_missing",
|
||||
executionEnabled: false,
|
||||
promotionAllowed: false,
|
||||
bulkPromotionAllowed: false,
|
||||
},
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
terminate() {}
|
||||
}
|
||||
|
||||
class FakeReadyWorker {
|
||||
constructor() {
|
||||
this.listeners = new Map();
|
||||
this.startMessages = [];
|
||||
}
|
||||
|
||||
addEventListener(type, listener) {
|
||||
this.listeners.set(type, listener);
|
||||
}
|
||||
|
||||
postMessage(message) {
|
||||
queueMicrotask(() => {
|
||||
if (message.type === "start") {
|
||||
this.startMessages.push(message);
|
||||
this.reply(message, {
|
||||
runtimeExecutionReady: true,
|
||||
status: "browser_python_remap_wasm_runtime_ready",
|
||||
});
|
||||
return;
|
||||
}
|
||||
const values = {
|
||||
initializePython: "python-runtime-initialized",
|
||||
applyIniPythonPath: message.pythonPathPrepend,
|
||||
executeTopLevel: message.topLevelPath,
|
||||
importModule: message.modulePath,
|
||||
lookupCallable: message.callableName,
|
||||
invokeGenerator: "generator-returned",
|
||||
observeFirstYield: message.expectedYield,
|
||||
finishGenerator: "generator-finished",
|
||||
exportInterpreterState: "interpreter-state-bound",
|
||||
exportDiagnostics: "diagnostics-exported",
|
||||
};
|
||||
this.reply(message, {
|
||||
status: "ok",
|
||||
ready: true,
|
||||
value: values[message.type] ?? null,
|
||||
source: "fake-linuxcnc-python-remap-provider",
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
reply(message, payload) {
|
||||
this.listeners.get("message")?.({
|
||||
data: {
|
||||
id: message.id,
|
||||
type: message.type,
|
||||
ok: true,
|
||||
executionEnabled: false,
|
||||
promotionAllowed: false,
|
||||
bulkPromotionAllowed: false,
|
||||
...payload,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
terminate() {}
|
||||
}
|
||||
|
||||
const blockedWorkerAdapter = createLinuxCncPythonRemapBrowserWorkerAdapter({
|
||||
workerUrl: "./python-remap-worker.js",
|
||||
workerFactory: () => new FakeBlockedWorker(),
|
||||
});
|
||||
const blockedWorkerPort = createLinuxCncPythonRemapRuntimePort({
|
||||
runtimeMode: blockedWorkerAdapter.runtimeMode,
|
||||
runtimeAdapter: blockedWorkerAdapter,
|
||||
});
|
||||
const blockedWorkerStart = await blockedWorkerPort.start();
|
||||
assert.equal(blockedWorkerStart.runtimeMode, "browser-python-wasm-worker");
|
||||
assert.equal(blockedWorkerStart.runtimeExecutionReady, false);
|
||||
assert.equal(blockedWorkerStart.status, "blocked_browser_python_wasm_runtime_missing");
|
||||
const blockedWorkerPlan = await blockedWorkerPort.runLifecyclePlan();
|
||||
assert.equal(blockedWorkerPlan.status, "blocked_browser_python_wasm_runtime_missing");
|
||||
assert.equal(blockedWorkerPlan.promotionAllowed, false);
|
||||
await blockedWorkerPort.close();
|
||||
|
||||
const fakeReadyWorker = new FakeReadyWorker();
|
||||
const readyWorkerAdapter = createLinuxCncPythonRemapBrowserWorkerAdapter({
|
||||
workerUrl: "./python-remap-worker.js",
|
||||
pythonRuntimeModuleUrl: "./python-remap-runtime-provider.js",
|
||||
workerFactory: () => fakeReadyWorker,
|
||||
});
|
||||
const readyWorkerPort = createLinuxCncPythonRemapRuntimePort({
|
||||
runtimeMode: readyWorkerAdapter.runtimeMode,
|
||||
runtimeAdapter: readyWorkerAdapter,
|
||||
});
|
||||
const readyWorkerStart = await readyWorkerPort.start();
|
||||
assert.equal(readyWorkerStart.runtimeExecutionReady, true);
|
||||
assert.equal(readyWorkerStart.status, "browser_python_remap_wasm_runtime_ready");
|
||||
assert.equal(fakeReadyWorker.startMessages[0].pythonRuntimeModuleUrl, "./python-remap-runtime-provider.js");
|
||||
const initializeResult = await readyWorkerPort.initializePython();
|
||||
assert.equal(initializeResult.phase, "initialize_python");
|
||||
assert.equal(initializeResult.value, "python-runtime-initialized");
|
||||
const readyWorkerPlan = await readyWorkerPort.runLifecyclePlan();
|
||||
assert.equal(readyWorkerPlan.status, "runtime_adapter_lifecycle_plan_executed");
|
||||
assert.equal(readyWorkerPlan.runtimeExecutionReady, true);
|
||||
assert.equal(readyWorkerPlan.promotionAllowed, false);
|
||||
assert.equal(readyWorkerPlan.bulkPromotionAllowed, false);
|
||||
const transcript = readyWorkerPort.exportTranscript();
|
||||
assert.equal(transcript.filter((entry) => entry.phase === "initialize_python").length, 2);
|
||||
const validation = validatePythonRemapLifecycleTranscript(transcript);
|
||||
assert.equal(validation.ready, true);
|
||||
assert.equal(validation.lifecycleTranscriptReady, true);
|
||||
assert.equal(validation.firstYield, 2);
|
||||
assert.equal(validation.callableLookupReady, true);
|
||||
assert.equal(validation.generatorLifecycleReady, true);
|
||||
assert.equal(validation.interpreterStateBindingReady, true);
|
||||
const diagnostics = readyWorkerPort.exportDiagnostics();
|
||||
assert.equal(diagnostics.runtimeMode, "browser-python-wasm-worker");
|
||||
assert.equal(diagnostics.runtimeExecutionReady, true);
|
||||
assert.equal(diagnostics.lifecycleTranscriptReady, true);
|
||||
assert.equal(diagnostics.callableLookupReady, true);
|
||||
assert.equal(diagnostics.generatorLifecycleReady, true);
|
||||
assert.equal(diagnostics.interpreterStateBindingReady, true);
|
||||
assert.equal(diagnostics.linuxCncOwnedLifecycle, true);
|
||||
assert.equal(diagnostics.jsCncSemantics, false);
|
||||
assert.equal(diagnostics.ngcOnlySubroutinePromoted, false);
|
||||
assert.equal(diagnostics.executionEnabled, false);
|
||||
assert.equal(diagnostics.promotionAllowed, false);
|
||||
assert.equal(diagnostics.bulkPromotionAllowed, false);
|
||||
await readyWorkerPort.close();
|
||||
|
||||
const explicitDiagnostics = createPythonRemapRuntimeDiagnostics({
|
||||
runtimeMode: "contract-only",
|
||||
transcript,
|
||||
});
|
||||
assert.equal(explicitDiagnostics.transcriptHash.length, 8);
|
||||
assert.equal(explicitDiagnostics.lifecycleTranscriptReady, true);
|
||||
6
wasm-port/tests/sdk/node/verify_python_remap_runtime_port.sh
Executable file
6
wasm-port/tests/sdk/node/verify_python_remap_runtime_port.sh
Executable file
@@ -0,0 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "$0")/../../.." && pwd)"
|
||||
|
||||
node "$ROOT_DIR/tests/sdk/node/verify_python_remap_runtime_port.mjs"
|
||||
@@ -92,9 +92,14 @@ import {
|
||||
createProjectReleaseReadinessSummaryViewModel,
|
||||
createLinuxCncToolDbBrowserWorkerAdapter,
|
||||
createLinuxCncToolDbProcessPort,
|
||||
createLinuxCncPythonRemapBrowserWorkerAdapter,
|
||||
createLinuxCncPythonRemapRuntimePort,
|
||||
createPythonRemapLifecyclePlan,
|
||||
createPythonRemapRuntimeDiagnostics,
|
||||
createToolDbProcessDiagnostics,
|
||||
createToolDbTransactionPlan,
|
||||
runToolDbProcessPortPersistenceSession,
|
||||
validatePythonRemapLifecycleTranscript,
|
||||
createVirtualHalBridgeActionPlan,
|
||||
createVirtualHalBridgeReadiness,
|
||||
createVirtualHalCommandScriptFixtureReport,
|
||||
@@ -230,16 +235,16 @@ const expectedPromotionCandidateArtifactSummary = {
|
||||
evidenceExpansionArtifactPath: "wasm-port/build/wasm/sim-configs-inventory/evidence-expansion-candidates.tsv",
|
||||
layerCount: 2,
|
||||
evidenceReadyCount: 8,
|
||||
inventoryReadyCount: 20,
|
||||
evidenceExpansionCandidateCount: 13,
|
||||
totalCandidateCount: 28,
|
||||
inventoryReadyCount: 19,
|
||||
evidenceExpansionCandidateCount: 14,
|
||||
totalCandidateCount: 27,
|
||||
promotionAllowedCount: 0,
|
||||
hardBlockRuntimeLock: "locked (3 families)",
|
||||
hardBlockRuntimeLock: "locked (2 families)",
|
||||
hardBlockRuntimePromotionAllowedCount: 0,
|
||||
inventoryBaseline: "executed=28 passed=28 skipped=131 unexpected_fail=0",
|
||||
inventoryBaseline: "executed=29 passed=29 skipped=130 unexpected_fail=0",
|
||||
artifactRows: {
|
||||
promotionCandidates: 28,
|
||||
evidenceExpansion: 13,
|
||||
promotionCandidates: 27,
|
||||
evidenceExpansion: 14,
|
||||
},
|
||||
hardBlockRuntimeFamilyRows: [],
|
||||
hardBlockRuntimeFamilyDetailRows: [],
|
||||
@@ -254,16 +259,6 @@ const expectedPromotionCandidateArtifactSummary = {
|
||||
firstBlockReason: null,
|
||||
nextProof: null,
|
||||
},
|
||||
{
|
||||
family: "L4-TOOL-DB",
|
||||
candidateCount: 0,
|
||||
promotionAllowedCount: 0,
|
||||
locked: true,
|
||||
lockedPaths: [],
|
||||
firstPath: null,
|
||||
firstBlockReason: null,
|
||||
nextProof: null,
|
||||
},
|
||||
{
|
||||
family: "L4-PYTHON-REMAP",
|
||||
candidateCount: 0,
|
||||
@@ -285,7 +280,7 @@ const expectedPromotionCandidateArtifactSummary = {
|
||||
},
|
||||
{
|
||||
id: "inventory-ready",
|
||||
candidateCount: 20,
|
||||
candidateCount: 19,
|
||||
promotionAllowedCount: 0,
|
||||
virtualHalEvidenceReady: false,
|
||||
baselineChanging: false,
|
||||
@@ -293,8 +288,8 @@ const expectedPromotionCandidateArtifactSummary = {
|
||||
],
|
||||
evidenceExpansion: {
|
||||
id: "browser-diagnostics-expansion",
|
||||
candidateCount: 13,
|
||||
artifactRowCount: 13,
|
||||
candidateCount: 14,
|
||||
artifactRowCount: 14,
|
||||
promotionAllowedCount: 0,
|
||||
baselineChanging: false,
|
||||
nextEvidence: "browser-diagnostics-binding",
|
||||
@@ -525,9 +520,14 @@ const requiredExports = [
|
||||
["gcodeFilenameFromProgramPath", gcodeFilenameFromProgramPath],
|
||||
["createLinuxCncToolDbBrowserWorkerAdapter", createLinuxCncToolDbBrowserWorkerAdapter],
|
||||
["createLinuxCncToolDbProcessPort", createLinuxCncToolDbProcessPort],
|
||||
["createLinuxCncPythonRemapBrowserWorkerAdapter", createLinuxCncPythonRemapBrowserWorkerAdapter],
|
||||
["createLinuxCncPythonRemapRuntimePort", createLinuxCncPythonRemapRuntimePort],
|
||||
["createPythonRemapLifecyclePlan", createPythonRemapLifecyclePlan],
|
||||
["createPythonRemapRuntimeDiagnostics", createPythonRemapRuntimeDiagnostics],
|
||||
["createToolDbProcessDiagnostics", createToolDbProcessDiagnostics],
|
||||
["createToolDbTransactionPlan", createToolDbTransactionPlan],
|
||||
["runToolDbProcessPortPersistenceSession", runToolDbProcessPortPersistenceSession],
|
||||
["validatePythonRemapLifecycleTranscript", validatePythonRemapLifecycleTranscript],
|
||||
["validateToolDbTranscript", validateToolDbTranscript],
|
||||
["saveToolDbFile", saveToolDbFile],
|
||||
["loadToolDbFile", loadToolDbFile],
|
||||
@@ -1053,16 +1053,16 @@ 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,
|
||||
executed: 29,
|
||||
passed: 29,
|
||||
skipped: 130,
|
||||
unexpectedFail: 0,
|
||||
});
|
||||
assert.deepEqual(VIRTUAL_HAL_SIM_CONFIG_INVENTORY_ARTIFACT_HASHES, {
|
||||
"wasm-port/build/wasm/sim-configs-inventory/boundary-summary.tsv":
|
||||
"de6cf57b7c07182e3bcb32e22dbdf202b618cabc14620d6dff1ef815587950b9",
|
||||
"6cc15052cad03d04eff4506cd0a9d651cd45a2bd5da4d9f38633e9535826b9f3",
|
||||
"wasm-port/build/wasm/sim-configs-inventory/ini-boundary-summary.tsv":
|
||||
"b0afe27224e97a82fbecbbd75a7c86233c98fe957d9c1ba20f0656f8745a5eae",
|
||||
"17bff95b57c55ff4201a23c7286e733550e4df513470c66dd5f24329e7781a35",
|
||||
});
|
||||
const simConfigMacroLoadFixtureReport = createVirtualHalSimConfigMacroLoadFixtureReport({
|
||||
manifestText: sourceManifestText,
|
||||
@@ -1250,7 +1250,7 @@ assert.equal(createVirtualHalSimConfigMacroLoadFixtureReport({
|
||||
).boundaryEvidence,
|
||||
baselineSummary: {
|
||||
...VIRTUAL_HAL_SIM_CONFIG_INVENTORY_BASELINE,
|
||||
skipped: 130,
|
||||
skipped: 131,
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -1395,7 +1395,7 @@ const browserDiagnosticsArtifact = {
|
||||
preferredGcodePath: "linuxcnc/configs/sim/qtdragon/qtdragon_multi_joint/on_abort.ngc",
|
||||
blockedCandidateIds: [],
|
||||
explicitBrowserDiagnosticsCount: 8,
|
||||
inventoryBaseline: "executed=28 passed=28 skipped=131 unexpected_fail=0",
|
||||
inventoryBaseline: "executed=29 passed=29 skipped=130 unexpected_fail=0",
|
||||
},
|
||||
virtualHalSimConfigMacroLoadFixtures: simConfigMacroLoadFixtureReport,
|
||||
virtualHalCommandScriptFixtures: commandScriptFixtureReport,
|
||||
@@ -1418,7 +1418,7 @@ browserDiagnosticsArtifact.virtualHalSessionDiagnostics = {
|
||||
};
|
||||
const browserDiagnosticsArtifactValidation = createProjectReleaseBrowserDiagnosticsArtifactValidation(browserDiagnosticsArtifact);
|
||||
assert.equal(browserDiagnosticsArtifactValidation.apiName, "project-release-browser-diagnostics-artifact-validation");
|
||||
assert.equal(browserDiagnosticsArtifactValidation.ready, true);
|
||||
assert.equal(browserDiagnosticsArtifactValidation.ready, true, JSON.stringify(browserDiagnosticsArtifactValidation));
|
||||
assert.equal(browserDiagnosticsArtifactValidation.sourceComplianceReady, true);
|
||||
assert.equal(browserDiagnosticsArtifactValidation.simConfigSourceCoverageReady, true);
|
||||
assert.equal(browserDiagnosticsArtifactValidation.promotionCandidatesReady, true);
|
||||
@@ -1629,11 +1629,11 @@ assert.equal(releaseReadinessWaiting.gateActionPlan.pendingCount, createProjectR
|
||||
assert.equal(releaseReadinessWaiting.gateActionPlan.nextGateId, "diff-check");
|
||||
assert.equal(
|
||||
releaseReadinessWaiting.rows.find(({ id }) => id === "blocked-runtime-families")?.value,
|
||||
"L4-USER-M-PROCESS, L4-TOOL-DB, L4-PYTHON-REMAP",
|
||||
"L4-USER-M-PROCESS, L4-PYTHON-REMAP",
|
||||
);
|
||||
assert.equal(
|
||||
releaseReadinessWaiting.rows.find(({ id }) => id === "hard-block-runtime-lock")?.value,
|
||||
"locked (3 families)",
|
||||
"locked (2 families)",
|
||||
);
|
||||
assert.equal(
|
||||
releaseReadinessWaiting.rows.find(({ id }) => id === "promoted-blocked-family-count")?.value,
|
||||
@@ -1657,11 +1657,11 @@ assert.deepEqual(
|
||||
);
|
||||
assert.equal(
|
||||
releaseReadinessReady.rows.find(({ id }) => id === "promotion-candidate-artifact-rows")?.value,
|
||||
"28",
|
||||
"27",
|
||||
);
|
||||
assert.equal(
|
||||
releaseReadinessReady.rows.find(({ id }) => id === "evidence-expansion-artifact-rows")?.value,
|
||||
"13",
|
||||
"14",
|
||||
);
|
||||
assert.deepEqual(
|
||||
releaseReadinessReady.virtualHalPromotionFamilyRows.map(({ id, value }) => [
|
||||
@@ -1713,7 +1713,7 @@ assert.equal(
|
||||
);
|
||||
assert.equal(
|
||||
createProjectReleaseReadinessSummaryViewModel(releaseReadinessReady).rows.find(({ id }) => id === "promotion-candidate-layers")?.value,
|
||||
"evidence-ready=8 inventory-ready=20",
|
||||
"evidence-ready=8 inventory-ready=19",
|
||||
);
|
||||
const releaseReadinessWithCandidateArtifacts = createProjectReleaseReadinessReport({
|
||||
observedOutputs: ["project_release_gate=ok"],
|
||||
@@ -1724,11 +1724,11 @@ const releaseReadinessWithCandidateArtifacts = createProjectReleaseReadinessRepo
|
||||
promotionCandidateRows: promotionCandidateArtifactRows,
|
||||
evidenceExpansionRows: evidenceExpansionArtifactRows,
|
||||
});
|
||||
assert.equal(releaseReadinessWithCandidateArtifacts.promotionCandidateArtifactSummary.artifactRows.promotionCandidates, 28);
|
||||
assert.equal(releaseReadinessWithCandidateArtifacts.promotionCandidateArtifactSummary.artifactRows.evidenceExpansion, 13);
|
||||
assert.equal(releaseReadinessWithCandidateArtifacts.promotionCandidateArtifactSummary.artifactRows.promotionCandidates, 27);
|
||||
assert.equal(releaseReadinessWithCandidateArtifacts.promotionCandidateArtifactSummary.artifactRows.evidenceExpansion, 14);
|
||||
assert.equal(
|
||||
releaseReadinessWithCandidateArtifacts.promotionCandidateArtifactSummary.hardBlockRuntimeFamilyRows.length,
|
||||
19,
|
||||
18,
|
||||
);
|
||||
assert.equal(
|
||||
releaseReadinessWithCandidateArtifacts.promotionCandidateArtifactSummary.hardBlockRuntimePromotionAllowedCount,
|
||||
@@ -1736,8 +1736,8 @@ assert.equal(
|
||||
);
|
||||
assert.equal(
|
||||
releaseReadinessWithCandidateArtifacts.promotionCandidateArtifactSummary.hardBlockRuntimeFamilyRows
|
||||
.some((row) => row.skipKind === "L4-TOOL-DB" && row.promotionAllowed === false),
|
||||
true,
|
||||
.some((row) => row.skipKind === "L4-TOOL-DB"),
|
||||
false,
|
||||
);
|
||||
assert.deepEqual(
|
||||
releaseReadinessWithCandidateArtifacts.promotionCandidateArtifactSummary.hardBlockRuntimeFamilySummaryRows
|
||||
@@ -1749,7 +1749,6 @@ assert.deepEqual(
|
||||
]),
|
||||
[
|
||||
["L4-USER-M-PROCESS", 1, 0, true],
|
||||
["L4-TOOL-DB", 1, 0, true],
|
||||
["L4-PYTHON-REMAP", 17, 0, true],
|
||||
],
|
||||
);
|
||||
@@ -1764,13 +1763,6 @@ assert.deepEqual(
|
||||
promotionAllowed,
|
||||
]),
|
||||
[
|
||||
[
|
||||
"L4-TOOL-DB",
|
||||
"axis/db_demo/base.ngc",
|
||||
"design_tooldata_db_protocol_boundary",
|
||||
"db_program_v2_1_handshake_getall_load_unload_or_put",
|
||||
false,
|
||||
],
|
||||
[
|
||||
"L4-PYTHON-REMAP",
|
||||
"axis/laser/raster_test.ngc",
|
||||
@@ -1785,6 +1777,13 @@ assert.deepEqual(
|
||||
"python_runtime_owner_and_fixture",
|
||||
false,
|
||||
],
|
||||
[
|
||||
"L4-PYTHON-REMAP",
|
||||
"axis/laser/vector_test2.ngc",
|
||||
"design_linuxcnc_python_runtime_boundary",
|
||||
"python_runtime_owner_and_fixture",
|
||||
false,
|
||||
],
|
||||
],
|
||||
);
|
||||
const releaseReadinessWithScreenshots = createProjectReleaseReadinessReport({
|
||||
@@ -1863,7 +1862,6 @@ assert.deepEqual(releaseReadinessArtifactValidation, {
|
||||
axisScreenshotArtifactCount: 0,
|
||||
blockedRuntimeFamilies: [
|
||||
"L4-USER-M-PROCESS",
|
||||
"L4-TOOL-DB",
|
||||
"L4-PYTHON-REMAP",
|
||||
],
|
||||
rows: [
|
||||
@@ -1920,27 +1918,27 @@ assert.deepEqual(releaseReadinessArtifactValidation, {
|
||||
{
|
||||
id: "promotion-candidate-layers",
|
||||
label: "Promotion candidate layers",
|
||||
value: "evidence-ready=8 inventory-ready=20",
|
||||
value: "evidence-ready=8 inventory-ready=19",
|
||||
},
|
||||
{
|
||||
id: "promotion-candidate-total",
|
||||
label: "Promotion candidate total",
|
||||
value: "28",
|
||||
value: "27",
|
||||
},
|
||||
{
|
||||
id: "promotion-candidate-artifact-rows",
|
||||
label: "Promotion candidate artifact rows",
|
||||
value: "28",
|
||||
value: "27",
|
||||
},
|
||||
{
|
||||
id: "evidence-expansion-candidates",
|
||||
label: "Evidence expansion candidates",
|
||||
value: "13",
|
||||
value: "14",
|
||||
},
|
||||
{
|
||||
id: "evidence-expansion-artifact-rows",
|
||||
label: "Evidence expansion artifact rows",
|
||||
value: "13",
|
||||
value: "14",
|
||||
},
|
||||
{
|
||||
id: "evidence-expansion-next-evidence",
|
||||
@@ -1998,12 +1996,12 @@ assert.deepEqual(releaseReadinessArtifactValidation, {
|
||||
{
|
||||
id: "blocked-runtime-families",
|
||||
label: "Blocked runtime families",
|
||||
value: "L4-USER-M-PROCESS, L4-TOOL-DB, L4-PYTHON-REMAP",
|
||||
value: "L4-USER-M-PROCESS, L4-PYTHON-REMAP",
|
||||
},
|
||||
{
|
||||
id: "hard-block-runtime-lock",
|
||||
label: "Hard-block runtime lock",
|
||||
value: "locked (3 families)",
|
||||
value: "locked (2 families)",
|
||||
},
|
||||
{
|
||||
id: "promoted-blocked-family-count",
|
||||
@@ -2109,7 +2107,7 @@ assert.equal(
|
||||
}),
|
||||
}),
|
||||
).rows.find(({ id }) => id === "promotion-candidate-layers")?.value,
|
||||
"evidence-ready=8 inventory-ready=20",
|
||||
"evidence-ready=8 inventory-ready=19",
|
||||
);
|
||||
assert.equal(
|
||||
createProjectReleaseReadinessArtifactUrlWorkflowSummaryViewModel(
|
||||
@@ -2138,7 +2136,7 @@ assert.equal(
|
||||
}),
|
||||
}),
|
||||
).rows.find(({ id }) => id === "evidence-expansion-candidates")?.value,
|
||||
"13",
|
||||
"14",
|
||||
);
|
||||
assert.deepEqual(
|
||||
createProjectReleaseReadinessArtifactUrlWorkflowSummaryViewModel(
|
||||
@@ -2290,14 +2288,14 @@ assert.equal(createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomReadi
|
||||
assert.equal(
|
||||
createProjectReleaseReadinessReport({
|
||||
observedOutputs: ["project_release_gate=ok"],
|
||||
promotedRuntimeFamilies: ["L4-TOOL-DB"],
|
||||
promotedRuntimeFamilies: ["L4-PYTHON-REMAP"],
|
||||
}).missing.includes("blocked-runtime-families"),
|
||||
true,
|
||||
);
|
||||
assert.equal(
|
||||
createProjectReleaseReadinessSummaryViewModel(createProjectReleaseReadinessReport({
|
||||
observedOutputs: ["project_release_gate=ok"],
|
||||
promotedRuntimeFamilies: ["L4-TOOL-DB"],
|
||||
promotedRuntimeFamilies: ["L4-PYTHON-REMAP"],
|
||||
})).rows.find(({ id }) => id === "hard-block-runtime-lock")?.value,
|
||||
"violated (1 promoted)",
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user