按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:
2026-06-19 18:52:24 +08:00
parent 51ae5d9a9a
commit fbf9dade9c
38 changed files with 2252 additions and 335 deletions

View File

@@ -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)",
);