L4-TOOL-DB接入数控系统仿真证据
结论:L4-TOOL-DB 已接入浏览器/WASM/OPFS 仿真证明链,并纳入 release/host gate;axis/db_demo/base.ngc 仍保持 L4-TOOL-DB locked,promotion_allowed=0,sim-config baseline 保持 28/28/131/0。
This commit is contained in:
@@ -388,6 +388,8 @@ assert.deepEqual(
|
||||
["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"],
|
||||
...expectedPromotionFamilyRows,
|
||||
["browser-diagnostics", "ready"],
|
||||
["virtual-hal-promotion-candidate-summary", "ready"],
|
||||
|
||||
@@ -34,7 +34,7 @@ const virtualHalSimConfigMacroLoadFixtures = createVirtualHalSimConfigMacroLoadF
|
||||
|
||||
assert.equal(manifest.apiName, "project-release-gate-manifest");
|
||||
assert.equal(manifest.manifestVersion, 1);
|
||||
assert.equal(manifest.gateCount, 12);
|
||||
assert.equal(manifest.gateCount, 13);
|
||||
assert.deepEqual(manifest.gateIds, [
|
||||
"diff-check",
|
||||
"vendor-sync",
|
||||
@@ -43,6 +43,7 @@ assert.deepEqual(manifest.gateIds, [
|
||||
"sim-config-inventory",
|
||||
"ini-panel-browser",
|
||||
"opfs-session-browser",
|
||||
"tool-db-process-proof",
|
||||
"release-artifact-url-browser",
|
||||
"project-batch-acceptance",
|
||||
"ui-node-smokes",
|
||||
@@ -59,6 +60,7 @@ assert.deepEqual(
|
||||
"sim_configs_wasm_node_inventory_unexpected_fail=0",
|
||||
"browser_ini_shell_integration_workflow_smoke=ok",
|
||||
"browser_opfs_session_workflow_smoke=ok",
|
||||
"tool_db_process_proof=ok",
|
||||
"browser_release_artifact_url_workflow_smoke=ok",
|
||||
"project_batch_acceptance_workflow_node_smoke=ok",
|
||||
"ui_node_smokes=ok",
|
||||
@@ -74,6 +76,10 @@ assert.equal(
|
||||
manifest.gates.find(({ id }) => id === "opfs-session-browser")?.command,
|
||||
"SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_opfs_session_workflow_browser.sh",
|
||||
);
|
||||
assert.equal(
|
||||
manifest.gates.find(({ id }) => id === "tool-db-process-proof")?.command,
|
||||
"wasm-port/tests/host/verify_tool_db_process_proof.sh",
|
||||
);
|
||||
assert.equal(
|
||||
manifest.gates.find(({ id }) => id === "project-batch-acceptance")?.command,
|
||||
"wasm-port/tests/sdk/node/verify_project_batch_acceptance_workflow.sh",
|
||||
@@ -92,15 +98,16 @@ assert.equal(partialMatrix.apiName, "project-release-gate-result-matrix");
|
||||
assert.equal(partialMatrix.matrixVersion, 1);
|
||||
assert.equal(partialMatrix.phase, "waiting");
|
||||
assert.equal(partialMatrix.ready, false);
|
||||
assert.equal(partialMatrix.gateCount, 12);
|
||||
assert.equal(partialMatrix.gateCount, 13);
|
||||
assert.equal(partialMatrix.passedCount, 3);
|
||||
assert.equal(partialMatrix.unknownCount, 9);
|
||||
assert.equal(partialMatrix.unknownCount, 10);
|
||||
assert.deepEqual(partialMatrix.missingGateIds, [
|
||||
"standalone-cnc-semantics",
|
||||
"interp-wasm",
|
||||
"sim-config-inventory",
|
||||
"ini-panel-browser",
|
||||
"opfs-session-browser",
|
||||
"tool-db-process-proof",
|
||||
"project-batch-acceptance",
|
||||
"ui-node-smokes",
|
||||
"host-smokes",
|
||||
@@ -128,9 +135,9 @@ assert.equal(partialExecutionManifest.apiName, "project-release-gate-execution-m
|
||||
assert.equal(partialExecutionManifest.manifestVersion, 1);
|
||||
assert.equal(partialExecutionManifest.phase, "waiting");
|
||||
assert.equal(partialExecutionManifest.ready, false);
|
||||
assert.equal(partialExecutionManifest.gateCount, 12);
|
||||
assert.equal(partialExecutionManifest.gateCount, 13);
|
||||
assert.equal(partialExecutionManifest.passedCount, 3);
|
||||
assert.equal(partialExecutionManifest.unknownCount, 9);
|
||||
assert.equal(partialExecutionManifest.unknownCount, 10);
|
||||
assert.deepEqual(partialExecutionManifest.missingGateIds, partialMatrix.missingGateIds);
|
||||
assert.deepEqual(
|
||||
partialExecutionManifest.rows.filter(({ passed }) => passed).map(({ id, evidence }) => [id, evidence]),
|
||||
@@ -153,25 +160,25 @@ assert.equal(partialExecutionSummary.apiName, "project-release-gate-execution-su
|
||||
assert.equal(partialExecutionSummary.viewModelVersion, 1);
|
||||
assert.equal(partialExecutionSummary.phase, "waiting");
|
||||
assert.equal(partialExecutionSummary.ready, false);
|
||||
assert.equal(partialExecutionSummary.statusLine, "Waiting: standalone-cnc-semantics, interp-wasm, sim-config-inventory, ini-panel-browser, opfs-session-browser, project-batch-acceptance, ui-node-smokes, host-smokes, project-release-gate");
|
||||
assert.equal(partialExecutionSummary.gateCount, 12);
|
||||
assert.equal(partialExecutionSummary.statusLine, "Waiting: standalone-cnc-semantics, interp-wasm, sim-config-inventory, ini-panel-browser, opfs-session-browser, tool-db-process-proof, project-batch-acceptance, ui-node-smokes, host-smokes, project-release-gate");
|
||||
assert.equal(partialExecutionSummary.gateCount, 13);
|
||||
assert.equal(partialExecutionSummary.passedCount, 3);
|
||||
assert.equal(partialExecutionSummary.unknownCount, 9);
|
||||
assert.equal(partialExecutionSummary.unknownCount, 10);
|
||||
assert.equal(partialExecutionSummary.nextGateId, "standalone-cnc-semantics");
|
||||
assert.deepEqual(partialExecutionSummary.evidenceCounts, {
|
||||
"explicit-result": 1,
|
||||
"expected-output": 2,
|
||||
missing: 9,
|
||||
missing: 10,
|
||||
});
|
||||
assert.deepEqual(
|
||||
partialExecutionSummary.rows.map(({ id, value }) => [id, value]),
|
||||
[
|
||||
["gate-results", "3/12 passed"],
|
||||
["unknown-gates", "9"],
|
||||
["gate-results", "3/13 passed"],
|
||||
["unknown-gates", "10"],
|
||||
["next-gate", "standalone-cnc-semantics"],
|
||||
["expected-output-evidence", "2"],
|
||||
["explicit-result-evidence", "1"],
|
||||
["missing", "standalone-cnc-semantics, interp-wasm, sim-config-inventory, ini-panel-browser, opfs-session-browser, project-batch-acceptance, ui-node-smokes, host-smokes, project-release-gate"],
|
||||
["missing", "standalone-cnc-semantics, interp-wasm, sim-config-inventory, ini-panel-browser, opfs-session-browser, tool-db-process-proof, project-batch-acceptance, ui-node-smokes, host-smokes, project-release-gate"],
|
||||
],
|
||||
);
|
||||
assert.equal(partialExecutionSummary.gateRows.length, manifest.gateCount);
|
||||
@@ -185,9 +192,9 @@ assert.equal(partialActionPlan.apiName, "project-release-gate-action-plan");
|
||||
assert.equal(partialActionPlan.planVersion, 1);
|
||||
assert.equal(partialActionPlan.phase, "waiting");
|
||||
assert.equal(partialActionPlan.ready, false);
|
||||
assert.equal(partialActionPlan.gateCount, 12);
|
||||
assert.equal(partialActionPlan.gateCount, 13);
|
||||
assert.equal(partialActionPlan.completedCount, 3);
|
||||
assert.equal(partialActionPlan.pendingCount, 9);
|
||||
assert.equal(partialActionPlan.pendingCount, 10);
|
||||
assert.deepEqual(partialActionPlan.completedGateIds, [
|
||||
"diff-check",
|
||||
"vendor-sync",
|
||||
@@ -199,6 +206,7 @@ assert.deepEqual(partialActionPlan.pendingGateIds, [
|
||||
"sim-config-inventory",
|
||||
"ini-panel-browser",
|
||||
"opfs-session-browser",
|
||||
"tool-db-process-proof",
|
||||
"project-batch-acceptance",
|
||||
"ui-node-smokes",
|
||||
"host-smokes",
|
||||
@@ -206,7 +214,7 @@ assert.deepEqual(partialActionPlan.pendingGateIds, [
|
||||
]);
|
||||
assert.equal(partialActionPlan.nextGateId, "standalone-cnc-semantics");
|
||||
assert.equal(partialActionPlan.nextCommand, "wasm-port/tools/verify_no_standalone_cnc_semantics.sh");
|
||||
assert.equal(partialActionPlan.commands.length, 9);
|
||||
assert.equal(partialActionPlan.commands.length, 10);
|
||||
assert.equal(partialActionPlan.commands[0].step, 1);
|
||||
assert.equal(partialActionPlan.commands[0].gateId, "standalone-cnc-semantics");
|
||||
assert.equal(partialActionPlan.rows[0].id, "standalone-cnc-semantics");
|
||||
@@ -226,7 +234,7 @@ assert.equal(report.gateExecutionManifest.ready, true);
|
||||
assert.equal(report.gateExecutionManifest.passedCount, manifest.gateCount);
|
||||
assert.equal(report.gateExecutionSummaryViewModel.apiName, "project-release-gate-execution-summary-view-model");
|
||||
assert.equal(report.gateExecutionSummaryViewModel.statusLine, "Ready: All release gate evidence present");
|
||||
assert.equal(report.gateExecutionSummaryViewModel.rows[0].value, "12/12 passed");
|
||||
assert.equal(report.gateExecutionSummaryViewModel.rows[0].value, "13/13 passed");
|
||||
assert.equal(report.gateExecutionSummaryViewModel.nextGateId, null);
|
||||
assert.equal(report.gateResultMatrix.ready, true);
|
||||
assert.equal(report.gateResultMatrix.passedCount, manifest.gateCount);
|
||||
@@ -249,7 +257,7 @@ assert.deepEqual(createProjectReleaseReadinessSummaryViewModel(report), {
|
||||
{
|
||||
id: "gate-results",
|
||||
label: "Release gates",
|
||||
value: "12/12 passed",
|
||||
value: "13/13 passed",
|
||||
},
|
||||
{
|
||||
id: "unknown-gates",
|
||||
@@ -306,6 +314,16 @@ assert.deepEqual(createProjectReleaseReadinessSummaryViewModel(report), {
|
||||
label: "Virtual HAL motion controller matrix",
|
||||
value: "ready",
|
||||
},
|
||||
{
|
||||
id: "tool-db-process-proof",
|
||||
label: "Tool DB process proof",
|
||||
value: "ready",
|
||||
},
|
||||
{
|
||||
id: "tool-db-process-proof-detail",
|
||||
label: "Tool DB process proof detail",
|
||||
value: "wasm=ready browser=ready opfs=ready promotion_allowed=0",
|
||||
},
|
||||
{
|
||||
id: "blocked-runtime-families",
|
||||
label: "Blocked runtime families",
|
||||
@@ -386,7 +404,7 @@ assert.deepEqual(
|
||||
artifactValidationSummary.rows.map(({ id, value }) => [id, value]),
|
||||
[
|
||||
["artifact", "project-release-readiness-report"],
|
||||
["gate-count", "12/12"],
|
||||
["gate-count", "13/13"],
|
||||
["gate-manifest", "ready"],
|
||||
["gate-execution-manifest", "ready"],
|
||||
["gate-execution-summary", "ready"],
|
||||
@@ -408,6 +426,8 @@ assert.deepEqual(
|
||||
...expectedPromotionFamilyRows,
|
||||
["virtual-hal-sim-config-macro-load-fixtures", "ready"],
|
||||
["virtual-hal-motion-controller-matrix", "ready"],
|
||||
["tool-db-process-proof", "ready"],
|
||||
["tool-db-process-proof-detail", "wasm=ready browser=ready opfs=ready promotion_allowed=0"],
|
||||
["missing", "none"],
|
||||
],
|
||||
);
|
||||
@@ -528,6 +548,8 @@ assert.deepEqual(
|
||||
["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"],
|
||||
...expectedPromotionFamilyRows,
|
||||
["browser-diagnostics", "not requested"],
|
||||
["virtual-hal-promotion-candidate-summary", "not requested"],
|
||||
|
||||
@@ -1672,6 +1672,32 @@ assert.deepEqual(
|
||||
);
|
||||
assert.equal(releaseReadinessReady.virtualHalSimConfigMacroLoadFixturesReady, true);
|
||||
assert.equal(releaseReadinessReady.virtualHalMotionControllerMatrixReady, true);
|
||||
const expectedToolDbProcessProofSummary = {
|
||||
apiName: "tool-db-process-proof-summary",
|
||||
summaryVersion: 1,
|
||||
phase: "ready",
|
||||
ready: true,
|
||||
boundaryClass: "L4-TOOL-DB",
|
||||
path: "axis/db_demo/base.ngc",
|
||||
dbProgramPath: "./db_nonran.py",
|
||||
runtimeMode: "browser-python-wasm-worker",
|
||||
nativeProtocolReady: false,
|
||||
nativeRuntimeRequiredForPromotion: true,
|
||||
wasmProtocolReady: true,
|
||||
browserProtocolReady: true,
|
||||
opfsPersistenceReady: true,
|
||||
tblFallbackSufficient: false,
|
||||
promotionAllowed: false,
|
||||
executionEnabled: false,
|
||||
requiredCommands: [
|
||||
"wasm-port/tests/sdk/node/verify_tool_db_process_port.sh",
|
||||
"wasm-port/tests/opfs/node/verify_tool_db_store.sh",
|
||||
"wasm-port/tests/wasm/node/verify_tool_db_process_port_wasm.sh",
|
||||
"SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_tool_db_process_browser.sh",
|
||||
],
|
||||
};
|
||||
assert.deepEqual(releaseReadinessReady.toolDbProcessProofSummary, expectedToolDbProcessProofSummary);
|
||||
assert.equal(releaseReadinessReady.toolDbProcessProofReady, true);
|
||||
assert.deepEqual(releaseReadinessReady.gateManifest, createProjectReleaseGateManifest());
|
||||
assert.equal(releaseReadinessReady.gateResultMatrix.rows.length, createProjectReleaseGateManifest().gateCount);
|
||||
assert.equal(createProjectReleaseGateActionPlan({
|
||||
@@ -1831,6 +1857,8 @@ assert.deepEqual(releaseReadinessArtifactValidation, {
|
||||
promotionCandidateArtifactSummaryReady: true,
|
||||
virtualHalSimConfigMacroLoadFixturesReady: true,
|
||||
virtualHalMotionControllerMatrixReady: true,
|
||||
toolDbProcessProofSummary: expectedToolDbProcessProofSummary,
|
||||
toolDbProcessProofReady: true,
|
||||
axisScreenshotArtifactSummaryReady: true,
|
||||
axisScreenshotArtifactCount: 0,
|
||||
blockedRuntimeFamilies: [
|
||||
@@ -1957,6 +1985,16 @@ assert.deepEqual(releaseReadinessArtifactValidation, {
|
||||
label: "Virtual HAL motion controller matrix",
|
||||
value: "ready",
|
||||
},
|
||||
{
|
||||
id: "tool-db-process-proof",
|
||||
label: "Tool DB process proof",
|
||||
value: "ready",
|
||||
},
|
||||
{
|
||||
id: "tool-db-process-proof-detail",
|
||||
label: "Tool DB process proof detail",
|
||||
value: "wasm=ready browser=ready opfs=ready promotion_allowed=0",
|
||||
},
|
||||
{
|
||||
id: "blocked-runtime-families",
|
||||
label: "Blocked runtime families",
|
||||
@@ -2157,6 +2195,7 @@ assert.deepEqual(
|
||||
"promotionCandidateArtifactSummary",
|
||||
"virtualHalSimConfigMacroLoadFixtures",
|
||||
"virtualHalMotionControllerMatrix",
|
||||
"toolDbProcessProofSummary",
|
||||
"blockedRuntimeFamilies",
|
||||
"gateManifest",
|
||||
"gateExecutionManifest",
|
||||
|
||||
@@ -83,6 +83,7 @@ class FakeBlockedWorker {
|
||||
class FakeReadyWorker {
|
||||
constructor() {
|
||||
this.listeners = new Map();
|
||||
this.startMessages = [];
|
||||
this.lines = [
|
||||
"v2.1",
|
||||
"T10 P110 D0.10 Z0.10",
|
||||
@@ -100,6 +101,7 @@ class FakeReadyWorker {
|
||||
postMessage(message) {
|
||||
queueMicrotask(() => {
|
||||
if (message.type === "start") {
|
||||
this.startMessages.push(message);
|
||||
this.reply(message, {
|
||||
runtimeExecutionReady: true,
|
||||
status: "browser_python_wasm_runtime_ready",
|
||||
@@ -159,9 +161,11 @@ assert.equal(browserWorkerBlockedPlan.runtimeExecutionReady, false);
|
||||
assert.equal(browserWorkerBlockedPlan.promotionAllowed, false);
|
||||
await browserWorkerPort.close();
|
||||
|
||||
const fakeReadyWorker = new FakeReadyWorker();
|
||||
const readyWorkerAdapter = createLinuxCncToolDbBrowserWorkerAdapter({
|
||||
workerUrl: "./tool-db-python-worker.js",
|
||||
workerFactory: () => new FakeReadyWorker(),
|
||||
pythonRuntimeModuleUrl: "./tool-db-python-runtime-provider.js",
|
||||
workerFactory: () => fakeReadyWorker,
|
||||
});
|
||||
const readyWorkerPort = createLinuxCncToolDbProcessPort({
|
||||
dbProgramPath: "./db_nonran.py",
|
||||
@@ -171,6 +175,8 @@ const readyWorkerPort = createLinuxCncToolDbProcessPort({
|
||||
const readyWorkerStart = await readyWorkerPort.start();
|
||||
assert.equal(readyWorkerStart.runtimeExecutionReady, true);
|
||||
assert.equal(readyWorkerStart.status, "browser_python_wasm_runtime_ready");
|
||||
assert.equal(readyWorkerAdapter.runtimeMode, "browser-python-wasm-worker");
|
||||
assert.equal(fakeReadyWorker.startMessages[0].pythonRuntimeModuleUrl, "./tool-db-python-runtime-provider.js");
|
||||
const readyWorkerPlan = await readyWorkerPort.runTransactionPlan();
|
||||
assert.equal(readyWorkerPlan.status, "runtime_adapter_transaction_plan_executed");
|
||||
assert.equal(readyWorkerPlan.runtimeExecutionReady, true);
|
||||
|
||||
Reference in New Issue
Block a user