diff --git a/text18.txt b/text18.txt index 8e61f5a..66b1648 100644 --- a/text18.txt +++ b/text18.txt @@ -700,3 +700,68 @@ browser diagnostics proof。 3. 如 UI-family 边界不清晰,先增加 negative fixture gate:证明 `L4-PYTHON-REMAP` / Python UI process 相关 macro/load 不会被 macro/load fixture report 误解锁。 + +### 五、2026-06-18 Macro Load Blocked Fixture Lock + +本批按上一节建议先评估 `gscreen/silverdragon/macros/tool_sensor.ngc`。结论是不能直接 +作为 positive macro/load fixture 推进:当前 generated boundary evidence 显示 owning +machine file `gscreen/silverdragon/silverdragon.ini` 在 vendored manifest 中不可用,且该 +family 涉及 Python UI/process 边界风险。为避免 virtual HAL 误解锁 Python UI 或 +Python remap family,本批新增 negative fixture gate。 + +新增实质能力: + +- 新增 `VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_BLOCKED_FIXTURES`; +- `createVirtualHalSimConfigMacroLoadFixtureReport()` 新增: + - `blockedRows`; + - `blockedFixturePromotionViolations`; + - summary row:`blocked-fixture-lock`; +- 首批 blocked fixture: + - `silverdragon-tool-sensor-python-ui-boundary`: + - `fixturePath` 为 + `linuxcnc/configs/sim/gscreen/silverdragon/macros/tool_sensor.ngc`; + - `owningIniPath` 为 + `linuxcnc/configs/sim/gscreen/silverdragon/silverdragon.ini`; + - `blockedKind` 为 `PYTHON-UI-PROCESS`; + - 必须 `excludedFromPositiveFixtures === true`; + - `gmoccapy-on-abort-python-remap-boundary`: + - `fixturePath` 为 + `linuxcnc/configs/sim/gmoccapy/macros/on_abort.ngc`; + - `owningIniPath` 为 `linuxcnc/configs/sim/gmoccapy/6_axis.ini`; + - `blockedKind` 为 `L4-PYTHON-REMAP`; + - 必须 `excludedFromPositiveFixtures === true`; +- release diagnostics validation 新增 required negative evidence: + - `blockedFixturePromotionViolations.length === 0`; + - SilverDragon `tool_sensor.ngc` 与 gmoccapy `on_abort.ngc` 必须存在于 + `blockedRows`; + - 两者不能出现在 positive macro/load fixture rows; +- real simulation smoke 与 SDK smoke 同步验证 blocked fixture lock; +- coverage matrix 对 `gscreen/silverdragon/macros/tool_sensor.ngc` 注释更新为 blocked + negative fixture; +- promotion analysis 文档新增 Macro/Load Blocked Fixture Lock 小节。 + +语义边界: + +- 本批没有降低 inventory skip count; +- 当前 baseline 仍是 `executed=28`、`passed=28`、`skipped=131`、 + `unexpected_fail=0`; +- 本批没有新增 G-code/interpreter/planner/kinematics/remap 语义; +- 本批没有把 SilverDragon、gmoccapy 或任何 Python UI / Python remap family 作为 + virtual HAL positive fixture 推进; +- virtual HAL 已满足 Web 方式数控系统仿真系统,并在仿真范围内替代 LinuxCNC + realtime HAL、`halcmd`、motion controller; +- virtual HAL 仍不提供 Linux kernel hard-realtime ABI、外部硬件驱动 ABI、native + HAL module ABI、Python UI process emulation 或 Python remap runtime; +- `L4-PYTHON-REMAP`、`L4-TOOL-DB`、`L4-USER-M-PROCESS`、`UPSTREAM-DEMO` 仍保持 + locked; +- G-code/interpreter/planner/canonical motion 语义仍来自 LinuxCNC-backed WASM。 + +下一步工作建议: + +1. 为 macro/load fixture report 增加 UI-family candidate audit,将 + `gscreen/industrial_lathe_wear/toolchange.ngc` 与 + `qtvcp_screens/industrial_lathe_wear/toolchange.ngc` 先作为 audit rows 评估。 +2. 只有 owning INI、machine files、tool table、UI/process declaration 都有 + LinuxCNC source evidence,且不需要 Python UI process emulation 时,才允许转为 + positive non-main fixture。 +3. 如证据仍不完整,继续扩展 blocked fixture lock,不降低 inventory baseline。 diff --git a/wasm-port/docs/sim-config-coverage-promotion-analysis.md b/wasm-port/docs/sim-config-coverage-promotion-analysis.md index 15678aa..457637f 100644 --- a/wasm-port/docs/sim-config-coverage-promotion-analysis.md +++ b/wasm-port/docs/sim-config-coverage-promotion-analysis.md @@ -254,9 +254,32 @@ Release diagnostics validation now requires keep `inventoryBaselineUnchanged === true`, every row must have `nonMainFixture === true`, and `standaloneMainViolations` must stay empty. -The next practical slice is to extend this report with one more non-main family -such as `gscreen/silverdragon/macros/tool_sensor.ngc`, after proving the owning -machine files and UI/process boundary do not cross into Python UI emulation. +## 2026-06-18 Macro/Load Blocked Fixture Lock + +The macro/load report now also carries a blocked-fixture lock. This is a +negative evidence gate: it proves selected macro/load paths are not included in +positive virtual HAL fixtures when their owner boundary is still unavailable or +outside the virtual HAL scope. + +The first blocked fixture rows are: + +- `gscreen/silverdragon/macros/tool_sensor.ngc` +- `gmoccapy/macros/on_abort.ngc` + +`tool_sensor.ngc` is intentionally not promoted because the owning +`gscreen/silverdragon/silverdragon.ini` machine file is not available in the +vendored manifest, and promoting it would require a Python UI/process boundary +proof rather than virtual HAL diagnostics alone. `gmoccapy/macros/on_abort.ngc` +remains locked behind `L4-PYTHON-REMAP` and LinuxCNC-owned Python +remap/prolog/epilog runtime proof. + +Release diagnostics validation now requires +`blockedFixturePromotionViolations` to stay empty and requires both blocked +rows to be excluded from positive macro/load fixtures. This prevents virtual +HAL from accidentally unlocking Python UI or Python remap families. + +The next practical slice is to add a machine-readable candidate audit for other +UI-family macro/load rows before promoting any new positive fixture. ## Boundary Statement diff --git a/wasm-port/docs/sim-configs-coverage-matrix.md b/wasm-port/docs/sim-configs-coverage-matrix.md index 4fa76b3..17a6205 100644 --- a/wasm-port/docs/sim-configs-coverage-matrix.md +++ b/wasm-port/docs/sim-configs-coverage-matrix.md @@ -612,7 +612,7 @@ Legend: | `gscreen/industrial_lathe_wear/toolchange.ngc` | `gscreen/industrial_lathe_wear` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `-` | inventory-only macro/load path; macro_load class coverage is represented by `axis/external_offsets/circles.ngc` unless this family is deliberately promoted later | | `gscreen/silverdragon/macros/auto_zref.ngc` | `gscreen/silverdragon` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `-` | inventory-only macro/load path; macro_load class coverage is represented by `axis/external_offsets/circles.ngc` unless this family is deliberately promoted later | | `gscreen/silverdragon/macros/laserzero.ngc` | `gscreen/silverdragon` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `-` | inventory-only macro/load path; macro_load class coverage is represented by `axis/external_offsets/circles.ngc` unless this family is deliberately promoted later | -| `gscreen/silverdragon/macros/tool_sensor.ngc` | `gscreen/silverdragon` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `-` | inventory-only macro/load path; macro_load class coverage is represented by `axis/external_offsets/circles.ngc` unless this family is deliberately promoted later | +| `gscreen/silverdragon/macros/tool_sensor.ngc` | `gscreen/silverdragon` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `-` | virtual HAL macro/load report keeps this as a blocked negative fixture until the missing SilverDragon owning INI and Python UI/process boundary are proven; not promoted by virtual HAL | | `gscreen/silverdragon/macros/touch_plate.ngc` | `gscreen/silverdragon` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `-` | inventory-only macro/load path; macro_load class coverage is represented by `axis/external_offsets/circles.ngc` unless this family is deliberately promoted later | | `qtaxis/non-trivial/scara/remap_subs/428remap.ngc` | `qtaxis/non-trivial` | `remap_subroutine` | `PASS` | `-` | `-` | `N/A` | `N/A` | `ASSET-ONLY` | subroutine asset; validate by parse/remap path rather than standalone main-program execution | | `qtaxis/non-trivial/scara/remap_subs/429remap.ngc` | `qtaxis/non-trivial` | `remap_subroutine` | `PASS` | `-` | `-` | `N/A` | `N/A` | `ASSET-ONLY` | subroutine asset; validate by parse/remap path rather than standalone main-program execution | diff --git a/wasm-port/runtime/sdk/README.md b/wasm-port/runtime/sdk/README.md index a94d89a..add97c4 100644 --- a/wasm-port/runtime/sdk/README.md +++ b/wasm-port/runtime/sdk/README.md @@ -328,12 +328,15 @@ private page state. browser diagnostics evidence, and the required virtual HAL reports for QtDragon on-abort, PUMA seam-weld, and rose-engine promotion planning. - `VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_FIXTURES` and + `VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_BLOCKED_FIXTURES` plus `createVirtualHalSimConfigMacroLoadFixtureReport()` expose non-main macro/load fixture evidence for virtual HAL diagnostics. The report keeps `nonMainFixture === true`, separates fixture paths from manifest-backed LinuxCNC source files, and prevents macro/load rows such as rose-engine `rcone.ngc` or external-offsets `queuebuster.ngc` from being promoted as - standalone browser main programs. + standalone browser main programs. Blocked fixture rows such as SilverDragon + `tool_sensor.ngc` remain excluded until their Python UI/process boundary is + proven outside virtual HAL. - `createVirtualHalSourceComplianceReport()` is the machine-readable gate for the virtual HAL source rule. It maps replacement targets, runtime capabilities, and HAL pin families back to LinuxCNC source files such as diff --git a/wasm-port/runtime/sdk/src/index.js b/wasm-port/runtime/sdk/src/index.js index 788c7bc..7a08e08 100644 --- a/wasm-port/runtime/sdk/src/index.js +++ b/wasm-port/runtime/sdk/src/index.js @@ -7,6 +7,7 @@ export { VIRTUAL_HAL_COVERAGE_STATES, VIRTUAL_HAL_MOTION_CONTROLLER_MATRIX_FIXTURES, VIRTUAL_HAL_PROJECT_PIN_GROUPS, + VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_BLOCKED_FIXTURES, VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_FIXTURES, VIRTUAL_HAL_SIM_CONFIG_PROMOTION_CANDIDATES, VIRTUAL_HAL_SIM_CONFIG_SOURCE_TARGETS, diff --git a/wasm-port/runtime/sdk/src/linuxcnc-hal.js b/wasm-port/runtime/sdk/src/linuxcnc-hal.js index d13c24e..f206211 100644 --- a/wasm-port/runtime/sdk/src/linuxcnc-hal.js +++ b/wasm-port/runtime/sdk/src/linuxcnc-hal.js @@ -363,6 +363,25 @@ export const VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_FIXTURES = Object.freeze([ }), ]); +export const VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_BLOCKED_FIXTURES = Object.freeze([ + Object.freeze({ + id: "silverdragon-tool-sensor-python-ui-boundary", + 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: "Owning SilverDragon UI machine file is not available in the vendored manifest; promotion would require Python UI process boundary proof outside virtual HAL.", + }), + Object.freeze({ + id: "gmoccapy-on-abort-python-remap-boundary", + fixturePath: "linuxcnc/configs/sim/gmoccapy/macros/on_abort.ngc", + owningIniPath: "linuxcnc/configs/sim/gmoccapy/6_axis.ini", + blockedKind: "L4-PYTHON-REMAP", + dependencyClass: "macro-load-python-remap-boundary", + reason: "gmoccapy macro/load rows remain locked behind LinuxCNC-owned Python remap/prolog/epilog runtime proof.", + }), +]); + export const VIRTUAL_HAL_COVERAGE_STATES = Object.freeze({ simulated: "simulated", bridgeOnly: "bridge-only", @@ -2852,6 +2871,7 @@ export function createVirtualHalSimConfigPromotionCandidateReport(options = {}) export function createVirtualHalSimConfigMacroLoadFixtureReport(options = {}) { const fixtures = options.fixtures ?? VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_FIXTURES; + const blockedFixtures = options.blockedFixtures ?? VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_BLOCKED_FIXTURES; const manifestProvided = typeof options.manifestText === "string" || Array.isArray(options.manifestEntries); const manifestSet = new Set([ ...sourceManifestSetFromText(options.manifestText ?? ""), @@ -2908,11 +2928,30 @@ export function createVirtualHalSimConfigMacroLoadFixtureReport(options = {}) { .filter((row) => row.nonMainFixture !== true || row.targetBrowserEvidence !== "non-main-fixture-diagnostics") .map((row) => row.id); const missingManifestFiles = [...new Set(rows.flatMap((row) => row.missingManifestFiles))]; + const positiveFixturePaths = new Set(rows.map((row) => normalizeLinuxCncSourcePath(row.fixturePath))); + const blockedRows = blockedFixtures.map((fixture) => { + const excludedFromPositiveFixtures = !positiveFixturePaths.has(normalizeLinuxCncSourcePath(fixture.fixturePath)); + return { + id: fixture.id, + source: "linuxcnc-configs-sim-source-derived-virtual-hal-macro-load-blocked-fixture", + fixturePath: fixture.fixturePath, + owningIniPath: fixture.owningIniPath, + blockedKind: fixture.blockedKind, + dependencyClass: fixture.dependencyClass, + excludedFromPositiveFixtures, + reason: fixture.reason, + complete: excludedFromPositiveFixtures, + }; + }); + const blockedFixturePromotionViolations = blockedRows + .filter((row) => row.excludedFromPositiveFixtures !== true) + .map((row) => row.id); const complete = rows.length > 0 && missingFixtures.length === 0 && blockedFixtureIds.length === 0 && standaloneMainViolations.length === 0 && - missingManifestFiles.length === 0; + missingManifestFiles.length === 0 && + blockedFixturePromotionViolations.length === 0; return { apiName: "linuxcnc-wasm-virtual-hal-sim-config-macro-load-fixture-report", reportVersion: 1, @@ -2928,11 +2967,14 @@ export function createVirtualHalSimConfigMacroLoadFixtureReport(options = {}) { missingFixtures, blockedFixtureIds, standaloneMainViolations, + blockedFixturePromotionViolations, missingManifestFiles, rows, + blockedRows, summaryRows: [ { id: "fixtures", label: "Macro/load fixtures", value: `${rows.length}` }, { id: "non-main", label: "Non-main fixture gate", value: standaloneMainViolations.length === 0 ? "passed" : `violations ${standaloneMainViolations.length}` }, + { id: "blocked-fixture-lock", label: "Blocked fixture lock", value: blockedFixturePromotionViolations.length === 0 ? "passed" : `violations ${blockedFixturePromotionViolations.length}` }, { id: "blocked-family", label: "Blocked-family exclusion", value: blockedFixtureIds.length === 0 ? "passed" : `blocked ${blockedFixtureIds.length}` }, { id: "manifest", label: "Manifest check", value: manifestProvided ? (missingManifestFiles.length === 0 ? "passed" : "failed") : "not provided" }, { id: "inventory-baseline", label: "Inventory baseline", value: "unchanged" }, diff --git a/wasm-port/runtime/sdk/src/project-release-readiness.js b/wasm-port/runtime/sdk/src/project-release-readiness.js index 501945f..0c66177 100644 --- a/wasm-port/runtime/sdk/src/project-release-readiness.js +++ b/wasm-port/runtime/sdk/src/project-release-readiness.js @@ -168,6 +168,19 @@ const REQUIRED_MACRO_LOAD_FIXTURES = [ }, ]; +const REQUIRED_BLOCKED_MACRO_LOAD_FIXTURES = [ + { + id: "silverdragon-tool-sensor-python-ui-boundary", + fixturePath: "linuxcnc/configs/sim/gscreen/silverdragon/macros/tool_sensor.ngc", + blockedKind: "PYTHON-UI-PROCESS", + }, + { + id: "gmoccapy-on-abort-python-remap-boundary", + fixturePath: "linuxcnc/configs/sim/gmoccapy/macros/on_abort.ngc", + blockedKind: "L4-PYTHON-REMAP", + }, +]; + function isVirtualHalSimConfigSourceCoverageReady(report) { const coverage = objectOrEmpty(report); return coverage.apiName === "linuxcnc-wasm-virtual-hal-sim-config-source-coverage-report" && @@ -206,6 +219,7 @@ function isVirtualHalSimConfigMacroLoadFixtureReportReady(report) { arrayOrEmpty(fixtureReport.missingFixtures).length === 0 && arrayOrEmpty(fixtureReport.blockedFixtureIds).length === 0 && arrayOrEmpty(fixtureReport.standaloneMainViolations).length === 0 && + arrayOrEmpty(fixtureReport.blockedFixturePromotionViolations).length === 0 && arrayOrEmpty(fixtureReport.missingManifestFiles).length === 0 && REQUIRED_MACRO_LOAD_FIXTURES.every((fixture) => rows.some((row) => @@ -216,6 +230,15 @@ function isVirtualHalSimConfigMacroLoadFixtureReportReady(report) { row.fixturePath === fixture.fixturePath && fixture.sourceFiles.every((file) => arrayOrEmpty(row.sourceFiles).includes(file)) ) + ) && + REQUIRED_BLOCKED_MACRO_LOAD_FIXTURES.every((fixture) => + arrayOrEmpty(fixtureReport.blockedRows).some((row) => + row.id === fixture.id && + row.fixturePath === fixture.fixturePath && + row.blockedKind === fixture.blockedKind && + row.excludedFromPositiveFixtures === true && + row.complete === true + ) ); } diff --git a/wasm-port/runtime/ui/simulation/simulation-app.js b/wasm-port/runtime/ui/simulation/simulation-app.js index 6d670da..f11a1a1 100644 --- a/wasm-port/runtime/ui/simulation/simulation-app.js +++ b/wasm-port/runtime/ui/simulation/simulation-app.js @@ -19,6 +19,7 @@ export { VIRTUAL_HAL_AXES, VIRTUAL_HAL_AXISUI_PINS, VIRTUAL_HAL_MOTION_CONTROLLER_MATRIX_FIXTURES, + VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_BLOCKED_FIXTURES, VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_FIXTURES, VIRTUAL_HAL_SIM_CONFIG_PROMOTION_CANDIDATES, VIRTUAL_HAL_SIM_CONFIG_SOURCE_TARGETS, diff --git a/wasm-port/tests/browser/real_simulation_page_smoke.html b/wasm-port/tests/browser/real_simulation_page_smoke.html index bda56b4..696eeb2 100644 --- a/wasm-port/tests/browser/real_simulation_page_smoke.html +++ b/wasm-port/tests/browser/real_simulation_page_smoke.html @@ -469,6 +469,18 @@ "linuxcnc/configs/sim/axis/external_offsets/eoffsets.ngc", ], ]; + const expectedBlockedMacroLoadFixtures = [ + [ + "silverdragon-tool-sensor-python-ui-boundary", + "linuxcnc/configs/sim/gscreen/silverdragon/macros/tool_sensor.ngc", + "PYTHON-UI-PROCESS", + ], + [ + "gmoccapy-on-abort-python-remap-boundary", + "linuxcnc/configs/sim/gmoccapy/macros/on_abort.ngc", + "L4-PYTHON-REMAP", + ], + ]; if ( diagnosticsArtifact.apiName !== "real-browser-simulation-diagnostics-artifact" || diagnosticsArtifact.statusHistory.length === 0 || @@ -493,6 +505,7 @@ ) ) || diagnosticsArtifact.virtualHalSimConfigMacroLoadFixtures?.complete !== true || + diagnosticsArtifact.virtualHalSimConfigMacroLoadFixtures?.blockedFixturePromotionViolations?.length !== 0 || !expectedMacroLoadFixtures.every(([id, fixturePath, declaredOnly, ...sourceFiles]) => diagnosticsArtifact.virtualHalSimConfigMacroLoadFixtures?.rows?.some((row) => row.id === id && @@ -504,6 +517,15 @@ sourceFiles.every((sourceFile) => row.sourceFiles.includes(sourceFile)) ) ) || + !expectedBlockedMacroLoadFixtures.every(([id, fixturePath, blockedKind]) => + diagnosticsArtifact.virtualHalSimConfigMacroLoadFixtures?.blockedRows?.some((row) => + row.id === id && + row.fixturePath === fixturePath && + row.blockedKind === blockedKind && + row.excludedFromPositiveFixtures === true && + row.complete === true + ) + ) || diagnosticsArtifact.virtualHalCommandScriptFixtures?.complete !== true || !diagnosticsArtifact.virtualHalCommandScriptFixtures?.coveredActions?.includes("loadusr") || diagnosticsArtifact.virtualHalMotionControllerMatrix?.complete !== true || @@ -955,6 +977,7 @@ macroLoadFixtureReport.complete !== true || macroLoadFixtureReport.inventoryBaselineUnchanged !== true || macroLoadFixtureReport.standaloneMainViolations.length !== 0 || + macroLoadFixtureReport.blockedFixturePromotionViolations.length !== 0 || !expectedMacroLoadFixtures.every(([id, fixturePath, declaredOnly, ...sourceFiles]) => macroLoadFixtureReport.rows.some((row) => row.id === id && @@ -965,6 +988,15 @@ sourceFiles.every((sourceFile) => row.sourceFiles.includes(sourceFile)) ) ) || + !expectedBlockedMacroLoadFixtures.every(([id, fixturePath, blockedKind]) => + macroLoadFixtureReport.blockedRows.some((row) => + row.id === id && + row.fixturePath === fixturePath && + row.blockedKind === blockedKind && + row.excludedFromPositiveFixtures === true && + row.complete === true + ) + ) || api.getVirtualRealtimeHalRuntimeReport().ready !== true || api.getVirtualHalSimulationRuntimeReport().replacesHostRuntimeForSimulation !== true ) { diff --git a/wasm-port/tests/sdk/node/verify_sdk_surface.mjs b/wasm-port/tests/sdk/node/verify_sdk_surface.mjs index 88c5d55..1112293 100644 --- a/wasm-port/tests/sdk/node/verify_sdk_surface.mjs +++ b/wasm-port/tests/sdk/node/verify_sdk_surface.mjs @@ -36,6 +36,7 @@ import { VIRTUAL_HAL_COVERAGE_STATES, VIRTUAL_HAL_MOTION_CONTROLLER_MATRIX_FIXTURES, VIRTUAL_HAL_PROJECT_PIN_GROUPS, + VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_BLOCKED_FIXTURES, VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_FIXTURES, VIRTUAL_HAL_SIM_CONFIG_PROMOTION_CANDIDATES, VIRTUAL_HAL_SIM_CONFIG_SOURCE_TARGETS, @@ -548,6 +549,8 @@ assert.match(sdkIndexText, /\bcreateVirtualHalSimConfigPromotionCandidateReport\ assert.match(sdkReadmeText, /\bcreateVirtualHalSimConfigPromotionCandidateReport\b/); 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, /\bcreateVirtualHalSimConfigMacroLoadFixtureReport\b/); assert.match(sdkReadmeText, /\bcreateVirtualHalSimConfigMacroLoadFixtureReport\b/); assert.match(sdkIndexText, /\bcreateVirtualHalSourceComplianceReport\b/); @@ -843,6 +846,7 @@ assert.equal(virtualHalRuntime.getSimConfigPromotionCandidateReport({ motionControllerMatrix: manifestCheckedMotionControllerMatrixReport, }).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); const simConfigMacroLoadFixtureReport = createVirtualHalSimConfigMacroLoadFixtureReport({ manifestText: sourceManifestText, }); @@ -857,6 +861,7 @@ assert.equal(simConfigMacroLoadFixtureReport.manifestChecked, true); 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.missingManifestFiles.length, 0); assert.equal( simConfigMacroLoadFixtureReport.rows.some((row) => @@ -882,6 +887,26 @@ assert.equal( ), 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.complete === true + ), + true, +); +assert.equal( + simConfigMacroLoadFixtureReport.blockedRows.some((row) => + row.id === "gmoccapy-on-abort-python-remap-boundary" && + row.fixturePath === "linuxcnc/configs/sim/gmoccapy/macros/on_abort.ngc" && + row.blockedKind === "L4-PYTHON-REMAP" && + row.excludedFromPositiveFixtures === true && + row.complete === true + ), + true, +); assert.equal(virtualHalRuntime.getSimConfigMacroLoadFixtureReport({ manifestText: sourceManifestText, }).complete, true);