接入虚拟HAL宏加载非主程序证据

This commit is contained in:
2026-06-18 05:15:02 +08:00
parent e263387cea
commit 506a6357c1
16 changed files with 519 additions and 14 deletions

View File

@@ -625,3 +625,78 @@ browser diagnostics proof。
main program 执行。 main program 执行。
3. 将 macro/load fixture evidence 接入 release diagnostics validation但不改变当前 3. 将 macro/load fixture evidence 接入 release diagnostics validation但不改变当前
inventory baseline。 inventory baseline。
### 四、2026-06-18 Macro Load Non-Main Fixture Evidence
本批接续 Non-Qt promotion evidence完成 macro/load non-main fixture report 首批闭环。
新增实质能力:
- 新增 `VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_FIXTURES`
- 新增 `createVirtualHalSimConfigMacroLoadFixtureReport()`
- 输出 `linuxcnc-wasm-virtual-hal-sim-config-macro-load-fixture-report`
- 显式输出 `inventoryBaselineUnchanged === true`
- 每个 row 必须 `nonMainFixture === true`
- 每个 row 的 `targetBrowserEvidence` 必须为
`non-main-fixture-diagnostics`
- `standaloneMainViolations` 必须为空;
- source manifest 只校验 LinuxCNC source evidence不把 declared-only fixture path
误当成 manifest 文件;
- 首批 fixture
- `rose-engine-rcone-macro-load`
- `fixturePath` 为
`linuxcnc/configs/sim/axis/rose_engine/rcone.ngc`
- source evidence 包含 `rose_engine.ini`、`rcone.ngc`、`rcone_demo.ngc`
- 与 `rcone_demo.ngc` 配对作为 rose engine non-main macro/load evidence
- `external-offsets-queuebuster-macro-load`
- `fixturePath` 为
`linuxcnc/configs/sim/axis/external_offsets/queuebuster.ngc`
- source evidence 包含 `eoffsets.ini` 与 `eoffsets.ngc`
- `declaredOnly === true`,通过 `eoffsets.ini` 的 `NGCGUI_SUBFILE` 声明保留
fixture path不声明它是 standalone browser main program
- `createLinuxCncVirtualHalRuntime()` 新增:
- `getSimConfigMacroLoadFixtureReport()`
- SDK index、SDK README、browser simulation re-export 同步导出新常量和新 report API
- real simulation diagnostics artifact 新增:
- `virtualHalSimConfigMacroLoadFixtures`
- browser API `getVirtualHalSimConfigMacroLoadFixtureReport()`
- OPFS/session virtual HAL payload 新增:
- `simConfigPromotionCandidates`
- `simConfigMacroLoadFixtures`
- saved-session diagnostics nested artifact 同步携带两类 evidence
- release diagnostics validation 新增 required evidence
- `hasMacroLoadFixtures`
- `macroLoadFixturesReady`
- validation row`sim-config-macro-load-fixtures`
- 缺少 `virtualHalSimConfigMacroLoadFixtures` 时 release diagnostics validation 不再 ready
- coverage matrix 对 `axis/rose_engine/rcone.ngc` 与
`axis/external_offsets/queuebuster.ngc` 注释更新为 non-main fixture diagnostics evidence
- promotion analysis 文档新增 Macro/Load Non-Main Fixture Evidence 小节。
语义边界:
- 本批没有降低 inventory skip count
- 当前 baseline 仍是 `executed=28`、`passed=28`、`skipped=131`、
`unexpected_fail=0`
- 本批没有新增 G-code/interpreter/planner/kinematics/remap 语义;
- macro/load fixture evidence 只证明 LinuxCNC-owned source/config declaration 与
virtual HAL diagnostics readiness
- `queuebuster.ngc` 只作为 `eoffsets.ini` 的 `NGCGUI_SUBFILE` declared-only fixture path
记录,不作为 manifest-backed standalone file也不作为 browser main program 执行;
- virtual HAL 已满足 Web 方式数控系统仿真系统,并在仿真范围内替代 LinuxCNC
realtime HAL、`halcmd`、motion controller
- virtual HAL 仍不提供 Linux kernel hard-realtime ABI、外部硬件驱动 ABI 或 native
HAL module ABI
- `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 non-main 案例,优先评估
`gscreen/silverdragon/macros/tool_sensor.ngc`。
2. 推进前必须确认 owning machine files、UI process declaration 和 source evidence
不能把 Python UI process emulation 纳入 virtual HAL 范围。
3. 如 UI-family 边界不清晰,先增加 negative fixture gate证明
`L4-PYTHON-REMAP` / Python UI process 相关 macro/load 不会被 macro/load fixture
report 误解锁。

View File

@@ -229,10 +229,34 @@ inventory `PASS` with matrix `INV`; the added value is explicit browser
diagnostics evidence and release-gate enforcement that the virtual HAL reports diagnostics evidence and release-gate enforcement that the virtual HAL reports
are complete for non-Qt sim-config families. are complete for non-Qt sim-config families.
The next practical promotion slice is to design non-main macro/load fixture ## 2026-06-18 Macro/Load Non-Main Fixture Evidence
evidence, starting with `axis/rose_engine/rcone.ngc` paired to
`rcone_demo.ngc`, without executing macro/load rows as standalone browser main The virtual HAL diagnostics evidence now includes an explicit macro/load
programs. fixture report:
- `VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_FIXTURES`
- `createVirtualHalSimConfigMacroLoadFixtureReport()`
The first required non-main fixtures are:
- `axis/rose_engine/rcone.ngc`
- `axis/external_offsets/queuebuster.ngc`
The rose-engine fixture is paired with `rcone_demo.ngc` and keeps `rcone.ngc`
as a non-main macro/load asset. The external-offsets fixture records
`queuebuster.ngc` as a declared `NGCGUI_SUBFILE` through `eoffsets.ini`; the
fixture path is preserved for diagnostics, while the manifest-backed source
evidence is the owning INI and paired LinuxCNC program source. This avoids
pretending that `queuebuster.ngc` is a standalone browser main program.
Release diagnostics validation now requires
`virtualHalSimConfigMacroLoadFixtures` to be present and ready. The report must
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.
## Boundary Statement ## Boundary Statement

View File

@@ -475,7 +475,7 @@ Legend:
| `axis/external_offsets/eoffsets.ngc` | `axis/external_offsets` | `main` | `FAIL` | `user-m-code-M111` | `SIM-EOFF` | `REP` | `REP` | `-` | Layer 2 expected-fail; M111 runtime edge covered | | `axis/external_offsets/eoffsets.ngc` | `axis/external_offsets` | `main` | `FAIL` | `user-m-code-M111` | `SIM-EOFF` | `REP` | `REP` | `-` | Layer 2 expected-fail; M111 runtime edge covered |
| `axis/external_offsets/jwp_z.ngc` | `axis/external_offsets` | `main` | `FAIL` | `user-m-code-M111` | `SIM-EOFF` | `REP` | `REP` | `-` | Layer 2 expected-fail; M111 runtime edge covered | | `axis/external_offsets/jwp_z.ngc` | `axis/external_offsets` | `main` | `FAIL` | `user-m-code-M111` | `SIM-EOFF` | `REP` | `REP` | `-` | Layer 2 expected-fail; M111 runtime edge covered |
| `axis/external_offsets/opa_demo.ngc` | `axis/external_offsets` | `main` | `FAIL` | `user-m-code-M111` | `SIM-EOFF` | `REP` | `REP` | `-` | Layer 2 expected-fail; M111 runtime edge covered | | `axis/external_offsets/opa_demo.ngc` | `axis/external_offsets` | `main` | `FAIL` | `user-m-code-M111` | `SIM-EOFF` | `REP` | `REP` | `-` | Layer 2 expected-fail; M111 runtime edge covered |
| `axis/external_offsets/queuebuster.ngc` | `axis/external_offsets` | `macro_load` | `PASS` | `-` | `SIM-EOFF` | `-` | `-` | `-` | inventory-only macro/load path; macro_load class coverage is represented by `axis/external_offsets/circles.ngc` | | `axis/external_offsets/queuebuster.ngc` | `axis/external_offsets` | `macro_load` | `PASS` | `-` | `SIM-EOFF` | `-` | `-` | `-` | non-main macro/load fixture diagnostics evidence is now required by virtual HAL release validation through the owning `eoffsets.ini` NGCGUI declaration; not promoted as a standalone browser main program |
| `axis/foam/foam.ngc` | `axis/foam` | `main` | `FAIL` | `ini-axis-mask-UV` | `SIM-FOAM` | `REP` | `REP` | `-` | Layer 2 expected-fail; Layer 3/4 runtime edge covered | | `axis/foam/foam.ngc` | `axis/foam` | `main` | `FAIL` | `ini-axis-mask-UV` | `SIM-FOAM` | `REP` | `REP` | `-` | Layer 2 expected-fail; Layer 3/4 runtime edge covered |
| `axis/geometry/xyzc.ngc` | `axis/geometry` | `main` | `FAIL` | `user-m-code-M110` | `SIM-XYZC` | `REP` | `REP` | `-` | Layer 2 expected-fail; M110 runtime edge covered | | `axis/geometry/xyzc.ngc` | `axis/geometry` | `main` | `FAIL` | `user-m-code-M110` | `SIM-XYZC` | `REP` | `REP` | `-` | Layer 2 expected-fail; M110 runtime edge covered |
| `axis/gladevcp/probe.ngc` | `axis/gladevcp` | `main` | `PASS` | `-` | `-` | `REP` | `REP` | `-` | plain INI/tool-table main-program class representative covered in Node and browser through vendored staging inputs | | `axis/gladevcp/probe.ngc` | `axis/gladevcp` | `main` | `PASS` | `-` | `-` | `REP` | `REP` | `-` | plain INI/tool-table main-program class representative covered in Node and browser through vendored staging inputs |
@@ -512,7 +512,7 @@ Legend:
| `axis/remap/rack-toolchange/nc_subroutines/tool_getput_move.ngc` | `axis/remap` | `remap_subroutine` | `PASS` | `-` | `-` | `N/A` | `N/A` | `ASSET-ONLY` | subroutine asset; validate by parse/remap path rather than standalone main-program execution | | `axis/remap/rack-toolchange/nc_subroutines/tool_getput_move.ngc` | `axis/remap` | `remap_subroutine` | `PASS` | `-` | `-` | `N/A` | `N/A` | `ASSET-ONLY` | subroutine asset; validate by parse/remap path rather than standalone main-program execution |
| `axis/remap/rack-toolchange/nc_subroutines/tool_holder_clear_move.ngc` | `axis/remap` | `remap_subroutine` | `PASS` | `-` | `-` | `N/A` | `N/A` | `ASSET-ONLY` | subroutine asset; validate by parse/remap path rather than standalone main-program execution | | `axis/remap/rack-toolchange/nc_subroutines/tool_holder_clear_move.ngc` | `axis/remap` | `remap_subroutine` | `PASS` | `-` | `-` | `N/A` | `N/A` | `ASSET-ONLY` | subroutine asset; validate by parse/remap path rather than standalone main-program execution |
| `axis/remap/stop-lookahead/nc_files/examples.ngc` | `axis/remap` | `main` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native baseline pass, but Layer 4 full inventory is blocked by Python `queuebuster` remap runtime boundaries; remap subroutine assets remain `ASSET-ONLY` | | `axis/remap/stop-lookahead/nc_files/examples.ngc` | `axis/remap` | `main` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native baseline pass, but Layer 4 full inventory is blocked by Python `queuebuster` remap runtime boundaries; remap subroutine assets remain `ASSET-ONLY` |
| `axis/rose_engine/rcone.ngc` | `axis/rose_engine` | `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 | | `axis/rose_engine/rcone.ngc` | `axis/rose_engine` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `-` | non-main macro/load fixture diagnostics evidence is now required by virtual HAL release validation and paired with `rcone_demo.ngc`; not promoted as a standalone browser main program |
| `axis/rose_engine/rcone_demo.ngc` | `axis/rose_engine` | `main` | `PASS` | `-` | `-` | `INV` | `-` | `-` | Node inventory coverage uses the native harness-selected `axis/sim.tbl` fallback staged at the INI-declared tool-table path; virtual HAL promotion candidate gate now exports explicit browser diagnostics evidence while inventory baseline remains unchanged | | `axis/rose_engine/rcone_demo.ngc` | `axis/rose_engine` | `main` | `PASS` | `-` | `-` | `INV` | `-` | `-` | Node inventory coverage uses the native harness-selected `axis/sim.tbl` fallback staged at the INI-declared tool-table path; virtual HAL promotion candidate gate now exports explicit browser diagnostics evidence while inventory baseline remains unchanged |
| `axis/vismach/5axis/bridgemill/5axisgui.ngc` | `axis/vismach` | `main` | `FAIL` | `ini-axis-mask-W` | `SIM-BRIDGE,5AX-EXEC` | `REP` | `REP` | `-` | Layer 2 expected-fail; W-axis and remap runtime edge covered | | `axis/vismach/5axis/bridgemill/5axisgui.ngc` | `axis/vismach` | `main` | `FAIL` | `ini-axis-mask-W` | `SIM-BRIDGE,5AX-EXEC` | `REP` | `REP` | `-` | Layer 2 expected-fail; W-axis and remap runtime edge covered |
| `axis/vismach/5axis/bridgemill/remap_subs/428remap.ngc` | `axis/vismach` | `remap_subroutine` | `PASS` | `-` | `5AX-EXEC` | `N/A` | `N/A` | `ASSET-ONLY` | subroutine asset; validate by parse/remap path rather than standalone main-program execution | | `axis/vismach/5axis/bridgemill/remap_subs/428remap.ngc` | `axis/vismach` | `remap_subroutine` | `PASS` | `-` | `5AX-EXEC` | `N/A` | `N/A` | `ASSET-ONLY` | subroutine asset; validate by parse/remap path rather than standalone main-program execution |

View File

@@ -8,9 +8,14 @@ import {
toolTablePath, toolTablePath,
} from "./path-model.js"; } from "./path-model.js";
import { import {
VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_FIXTURES,
VIRTUAL_HAL_SIM_CONFIG_PROMOTION_CANDIDATES,
VIRTUAL_HAL_SIM_CONFIG_SOURCE_TARGETS,
cloneVirtualHalState, cloneVirtualHalState,
createVirtualHalCommandScriptFixtureReport, createVirtualHalCommandScriptFixtureReport,
createVirtualHalMotionControllerMatrixReport, createVirtualHalMotionControllerMatrixReport,
createVirtualHalSimConfigMacroLoadFixtureReport,
createVirtualHalSimConfigPromotionCandidateReport,
createVirtualHalSimConfigSourceCoverageReport, createVirtualHalSimConfigSourceCoverageReport,
createVirtualHalSimulationReplacementReport, createVirtualHalSimulationReplacementReport,
createVirtualHalSourceComplianceReport, createVirtualHalSourceComplianceReport,
@@ -66,6 +71,8 @@ function validateVirtualHalSessionPayload(virtualHal) {
assertPlainObject(virtualHal.diagnostics, "virtual HAL session diagnostics"); assertPlainObject(virtualHal.diagnostics, "virtual HAL session diagnostics");
assertPlainObject(virtualHal.sourceCompliance, "virtual HAL session source compliance"); assertPlainObject(virtualHal.sourceCompliance, "virtual HAL session source compliance");
assertPlainObject(virtualHal.simConfigSourceCoverage, "virtual HAL session sim-config source coverage"); assertPlainObject(virtualHal.simConfigSourceCoverage, "virtual HAL session sim-config source coverage");
assertPlainObject(virtualHal.simConfigPromotionCandidates, "virtual HAL session sim-config promotion candidates");
assertPlainObject(virtualHal.simConfigMacroLoadFixtures, "virtual HAL session sim-config macro/load fixtures");
assertPlainObject(virtualHal.commandScriptFixtures, "virtual HAL session command script fixtures"); assertPlainObject(virtualHal.commandScriptFixtures, "virtual HAL session command script fixtures");
assertPlainObject(virtualHal.motionControllerMatrix, "virtual HAL session motion controller matrix"); assertPlainObject(virtualHal.motionControllerMatrix, "virtual HAL session motion controller matrix");
if (virtualHal.state.source !== "browser-virtual-hal") { if (virtualHal.state.source !== "browser-virtual-hal") {
@@ -77,6 +84,12 @@ function validateVirtualHalSessionPayload(virtualHal) {
if (virtualHal.simConfigSourceCoverage.complete !== true) { if (virtualHal.simConfigSourceCoverage.complete !== true) {
throw new Error("virtual HAL sim-config source coverage is incomplete."); throw new Error("virtual HAL sim-config source coverage is incomplete.");
} }
if (virtualHal.simConfigPromotionCandidates.complete !== true) {
throw new Error("virtual HAL sim-config promotion candidates are incomplete.");
}
if (virtualHal.simConfigMacroLoadFixtures.complete !== true) {
throw new Error("virtual HAL sim-config macro/load fixtures are incomplete.");
}
if (virtualHal.commandScriptFixtures.complete !== true) { if (virtualHal.commandScriptFixtures.complete !== true) {
throw new Error("virtual HAL command script fixtures are incomplete."); throw new Error("virtual HAL command script fixtures are incomplete.");
} }
@@ -88,11 +101,44 @@ function validateVirtualHalSessionPayload(virtualHal) {
export function createVirtualHalSessionPayload(halState = createVirtualHalState(), options = {}) { export function createVirtualHalSessionPayload(halState = createVirtualHalState(), options = {}) {
const state = cloneVirtualHalState(halState); const state = cloneVirtualHalState(halState);
const diagnostics = options.diagnostics ?? createVirtualHalSimulationReplacementReport(state); const reportOptions = {
const sourceCompliance = options.sourceCompliance ?? createVirtualHalSourceComplianceReport({ halState: state }); ...options,
const simConfigSourceCoverage = options.simConfigSourceCoverage ?? createVirtualHalSimConfigSourceCoverageReport(options); ...(
const commandScriptFixtures = options.commandScriptFixtures ?? createVirtualHalCommandScriptFixtureReport({ ...options, halState: state }); options.manifestText === undefined && options.manifestEntries === undefined
const motionControllerMatrix = options.motionControllerMatrix ?? createVirtualHalMotionControllerMatrixReport(options); ? {
manifestEntries: [
...VIRTUAL_HAL_SIM_CONFIG_SOURCE_TARGETS.flatMap((target) => target.sourceFiles ?? []),
...VIRTUAL_HAL_SIM_CONFIG_PROMOTION_CANDIDATES.flatMap((candidate) => candidate.sourceFiles ?? []),
...VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_FIXTURES.flatMap((fixture) => fixture.sourceFiles ?? []),
],
}
: {}
),
};
const simConfigSourceCoverage = options.simConfigSourceCoverage ?? createVirtualHalSimConfigSourceCoverageReport(reportOptions);
const simConfigMacroLoadFixtures = options.simConfigMacroLoadFixtures ?? createVirtualHalSimConfigMacroLoadFixtureReport(reportOptions);
const commandScriptFixtures = options.commandScriptFixtures ?? createVirtualHalCommandScriptFixtureReport({ ...reportOptions, halState: state });
const motionControllerMatrix = options.motionControllerMatrix ?? createVirtualHalMotionControllerMatrixReport(reportOptions);
const simConfigPromotionCandidates = options.simConfigPromotionCandidates ?? createVirtualHalSimConfigPromotionCandidateReport({
...reportOptions,
simConfigSourceCoverage,
commandScriptFixtures,
motionControllerMatrix,
});
const sourceCompliance = options.sourceCompliance ?? createVirtualHalSourceComplianceReport({
...reportOptions,
halState: state,
simConfigSourceCoverage,
commandScriptFixtures,
motionControllerMatrix,
});
const diagnostics = options.diagnostics ?? createVirtualHalSimulationReplacementReport(state, {
...reportOptions,
sourceCompliance,
simConfigSourceCoverage,
commandScriptFixtures,
motionControllerMatrix,
});
return validateVirtualHalSessionPayload({ return validateVirtualHalSessionPayload({
apiName: "linuxcnc-wasm-virtual-hal-session-payload", apiName: "linuxcnc-wasm-virtual-hal-session-payload",
payloadVersion: 1, payloadVersion: 1,
@@ -101,6 +147,8 @@ export function createVirtualHalSessionPayload(halState = createVirtualHalState(
diagnostics, diagnostics,
sourceCompliance, sourceCompliance,
simConfigSourceCoverage, simConfigSourceCoverage,
simConfigPromotionCandidates,
simConfigMacroLoadFixtures,
commandScriptFixtures, commandScriptFixtures,
motionControllerMatrix, motionControllerMatrix,
}); });

View File

@@ -299,8 +299,8 @@ private page state.
`executeHalcmd()`, `stepMotion()`, `stepMotionController()`, `executeHalcmd()`, `stepMotion()`, `stepMotionController()`,
`getSimulationRuntimeReport()`, `getSimulationReplacementReport()`, `getSimulationRuntimeReport()`, `getSimulationReplacementReport()`,
`getSourceComplianceReport()`, `getSimConfigPromotionCandidateReport()`, `getSourceComplianceReport()`, `getSimConfigPromotionCandidateReport()`,
`getIntegrityReport()`, `getPinInventory()`, `getProjectReport()`, and `getSimConfigMacroLoadFixtureReport()`, `getIntegrityReport()`,
`applyToInterpSdk()`. `getPinInventory()`, `getProjectReport()`, and `applyToInterpSdk()`.
- `VIRTUAL_HAL_SIMULATION_RUNTIME_CAPABILITIES`, - `VIRTUAL_HAL_SIMULATION_RUNTIME_CAPABILITIES`,
`VIRTUAL_HAL_SIMULATION_REPLACEMENT_TARGETS`, `VIRTUAL_HAL_SIMULATION_REPLACEMENT_TARGETS`,
`VIRTUAL_HAL_SOURCE_DERIVED_CAPABILITIES`, `VIRTUAL_HAL_SOURCE_DERIVED_CAPABILITIES`,
@@ -327,6 +327,13 @@ private page state.
files, current Node `PASS` evidence, blocked-family exclusions, target files, current Node `PASS` evidence, blocked-family exclusions, target
browser diagnostics evidence, and the required virtual HAL reports for browser diagnostics evidence, and the required virtual HAL reports for
QtDragon on-abort, PUMA seam-weld, and rose-engine promotion planning. QtDragon on-abort, PUMA seam-weld, and rose-engine promotion planning.
- `VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_FIXTURES` and
`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.
- `createVirtualHalSourceComplianceReport()` is the machine-readable gate for - `createVirtualHalSourceComplianceReport()` is the machine-readable gate for
the virtual HAL source rule. It maps replacement targets, runtime the virtual HAL source rule. It maps replacement targets, runtime
capabilities, and HAL pin families back to LinuxCNC source files such as capabilities, and HAL pin families back to LinuxCNC source files such as

View File

@@ -7,6 +7,7 @@ export {
VIRTUAL_HAL_COVERAGE_STATES, VIRTUAL_HAL_COVERAGE_STATES,
VIRTUAL_HAL_MOTION_CONTROLLER_MATRIX_FIXTURES, VIRTUAL_HAL_MOTION_CONTROLLER_MATRIX_FIXTURES,
VIRTUAL_HAL_PROJECT_PIN_GROUPS, VIRTUAL_HAL_PROJECT_PIN_GROUPS,
VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_FIXTURES,
VIRTUAL_HAL_SIM_CONFIG_PROMOTION_CANDIDATES, VIRTUAL_HAL_SIM_CONFIG_PROMOTION_CANDIDATES,
VIRTUAL_HAL_SIM_CONFIG_SOURCE_TARGETS, VIRTUAL_HAL_SIM_CONFIG_SOURCE_TARGETS,
VIRTUAL_HAL_SOURCE_DERIVED_CAPABILITIES, VIRTUAL_HAL_SOURCE_DERIVED_CAPABILITIES,
@@ -31,6 +32,7 @@ export {
createVirtualHalPinInventory, createVirtualHalPinInventory,
createVirtualHalPinRegistry, createVirtualHalPinRegistry,
createVirtualHalProjectReport, createVirtualHalProjectReport,
createVirtualHalSimConfigMacroLoadFixtureReport,
createVirtualHalSimConfigPromotionCandidateReport, createVirtualHalSimConfigPromotionCandidateReport,
createVirtualHalSimConfigSourceCoverageReport, createVirtualHalSimConfigSourceCoverageReport,
createVirtualHalSimulationReplacementReport, createVirtualHalSimulationReplacementReport,

View File

@@ -321,6 +321,48 @@ export const VIRTUAL_HAL_SIM_CONFIG_PROMOTION_CANDIDATES = Object.freeze([
}), }),
]); ]);
export const VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_FIXTURES = Object.freeze([
Object.freeze({
id: "rose-engine-rcone-macro-load",
label: "Rose engine rcone macro/load",
fixturePath: "linuxcnc/configs/sim/axis/rose_engine/rcone.ngc",
sourceFiles: Object.freeze([
"linuxcnc/configs/sim/axis/rose_engine/rose_engine.ini",
"linuxcnc/configs/sim/axis/rose_engine/rcone.ngc",
"linuxcnc/configs/sim/axis/rose_engine/rcone_demo.ngc",
]),
owningIniPath: "linuxcnc/configs/sim/axis/rose_engine/rose_engine.ini",
pairedMainProgram: "linuxcnc/configs/sim/axis/rose_engine/rcone_demo.ngc",
declarationSource: "NGCGUI_SUBFILE",
currentNodeInventoryStatus: "PASS",
dependencyClass: "macro-load-non-main",
targetBrowserEvidence: "non-main-fixture-diagnostics",
blockedKind: "-",
nonMainFixture: true,
declaredOnly: false,
evidence: "LinuxCNC rose_engine.ini declares rcone.ngc through NGCGUI_SUBFILE; the fixture is validated as a non-main macro/load asset paired with rcone_demo.ngc.",
}),
Object.freeze({
id: "external-offsets-queuebuster-macro-load",
label: "External offsets queuebuster macro/load declaration",
fixturePath: "linuxcnc/configs/sim/axis/external_offsets/queuebuster.ngc",
sourceFiles: Object.freeze([
"linuxcnc/configs/sim/axis/external_offsets/eoffsets.ini",
"linuxcnc/configs/sim/axis/external_offsets/eoffsets.ngc",
]),
owningIniPath: "linuxcnc/configs/sim/axis/external_offsets/eoffsets.ini",
pairedMainProgram: "linuxcnc/configs/sim/axis/external_offsets/eoffsets.ngc",
declarationSource: "NGCGUI_SUBFILE",
currentNodeInventoryStatus: "NON_MAIN_CLASS",
dependencyClass: "macro-load-non-main-declared-only",
targetBrowserEvidence: "non-main-fixture-diagnostics",
blockedKind: "-",
nonMainFixture: true,
declaredOnly: true,
evidence: "LinuxCNC eoffsets.ini declares queuebuster.ngc through NGCGUI_SUBFILE; the fixture records the owning INI declaration without executing it as a standalone browser main program.",
}),
]);
export const VIRTUAL_HAL_COVERAGE_STATES = Object.freeze({ export const VIRTUAL_HAL_COVERAGE_STATES = Object.freeze({
simulated: "simulated", simulated: "simulated",
bridgeOnly: "bridge-only", bridgeOnly: "bridge-only",
@@ -2808,6 +2850,96 @@ export function createVirtualHalSimConfigPromotionCandidateReport(options = {})
}; };
} }
export function createVirtualHalSimConfigMacroLoadFixtureReport(options = {}) {
const fixtures = options.fixtures ?? VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_FIXTURES;
const manifestProvided = typeof options.manifestText === "string" || Array.isArray(options.manifestEntries);
const manifestSet = new Set([
...sourceManifestSetFromText(options.manifestText ?? ""),
...(options.manifestEntries ?? []).map(normalizeLinuxCncSourcePath),
]);
const blockedKinds = new Set(options.blockedKinds ?? [
"L4-PYTHON-REMAP",
"L4-TOOL-DB",
"L4-USER-M-PROCESS",
"UPSTREAM-DEMO",
]);
const allowedStatuses = new Set(options.allowedStatuses ?? ["PASS", "NON_MAIN_CLASS"]);
const rows = fixtures.map((fixture) => {
const sourceFiles = [...(fixture.sourceFiles ?? [])];
const normalizedSourceFiles = sourceFiles.map(normalizeLinuxCncSourcePath);
const missingManifestFiles = manifestProvided
? sourceFiles.filter((file, index) => !manifestSet.has(normalizedSourceFiles[index]))
: [];
const blockedKindExcluded = !blockedKinds.has(fixture.blockedKind);
const statusReady = allowedStatuses.has(fixture.currentNodeInventoryStatus);
const nonMainFixtureReady = fixture.nonMainFixture === true &&
fixture.targetBrowserEvidence === "non-main-fixture-diagnostics";
const complete = sourceFiles.length > 0 &&
missingManifestFiles.length === 0 &&
blockedKindExcluded &&
statusReady &&
nonMainFixtureReady;
return {
id: fixture.id,
label: fixture.label,
source: "linuxcnc-configs-sim-source-derived-virtual-hal-macro-load-fixture",
fixturePath: fixture.fixturePath,
sourceFiles,
owningIniPath: fixture.owningIniPath,
pairedMainProgram: fixture.pairedMainProgram,
declarationSource: fixture.declarationSource,
currentNodeInventoryStatus: fixture.currentNodeInventoryStatus,
dependencyClass: fixture.dependencyClass,
targetBrowserEvidence: fixture.targetBrowserEvidence,
blockedKind: fixture.blockedKind,
blockedKindExcluded,
nonMainFixture: fixture.nonMainFixture === true,
declaredOnly: fixture.declaredOnly === true,
statusReady,
manifestChecked: manifestProvided,
missingManifestFiles,
evidence: fixture.evidence,
complete,
};
});
const missingFixtures = rows.filter((row) => !row.complete).map((row) => row.id);
const blockedFixtureIds = rows.filter((row) => !row.blockedKindExcluded).map((row) => row.id);
const standaloneMainViolations = rows
.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 complete = rows.length > 0 &&
missingFixtures.length === 0 &&
blockedFixtureIds.length === 0 &&
standaloneMainViolations.length === 0 &&
missingManifestFiles.length === 0;
return {
apiName: "linuxcnc-wasm-virtual-hal-sim-config-macro-load-fixture-report",
reportVersion: 1,
source: "linuxcnc-configs-sim-source-derived-virtual-hal",
phase: complete ? "ready" : "blocked",
complete,
webSimulationSatisfied: complete,
inventoryBaselineUnchanged: true,
manifestChecked: manifestProvided,
fixtureCount: rows.length,
sourceFiles: [...new Set(rows.flatMap((row) => row.sourceFiles))],
fixturePaths: rows.map((row) => row.fixturePath),
missingFixtures,
blockedFixtureIds,
standaloneMainViolations,
missingManifestFiles,
rows,
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-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" },
],
};
}
export function createVirtualHalSourceComplianceReport(options = {}) { export function createVirtualHalSourceComplianceReport(options = {}) {
const halState = options.halState ?? createVirtualHalState(); const halState = options.halState ?? createVirtualHalState();
const snapshot = options.snapshot ?? createVirtualHalWasmBridgeSnapshot(halState); const snapshot = options.snapshot ?? createVirtualHalWasmBridgeSnapshot(halState);
@@ -3024,6 +3156,9 @@ export function createLinuxCncVirtualHalRuntime(initialState = createVirtualHalS
getSimConfigPromotionCandidateReport(options = {}) { getSimConfigPromotionCandidateReport(options = {}) {
return createVirtualHalSimConfigPromotionCandidateReport(options); return createVirtualHalSimConfigPromotionCandidateReport(options);
}, },
getSimConfigMacroLoadFixtureReport(options = {}) {
return createVirtualHalSimConfigMacroLoadFixtureReport(options);
},
getCommandScriptFixtureReport(options = {}) { getCommandScriptFixtureReport(options = {}) {
return createVirtualHalCommandScriptFixtureReport({ ...options, halState: state }); return createVirtualHalCommandScriptFixtureReport({ ...options, halState: state });
}, },

View File

@@ -148,6 +148,26 @@ const REQUIRED_PROMOTION_CANDIDATES = [
}, },
]; ];
const REQUIRED_MACRO_LOAD_FIXTURES = [
{
id: "rose-engine-rcone-macro-load",
fixturePath: "linuxcnc/configs/sim/axis/rose_engine/rcone.ngc",
sourceFiles: [
"linuxcnc/configs/sim/axis/rose_engine/rose_engine.ini",
"linuxcnc/configs/sim/axis/rose_engine/rcone.ngc",
"linuxcnc/configs/sim/axis/rose_engine/rcone_demo.ngc",
],
},
{
id: "external-offsets-queuebuster-macro-load",
fixturePath: "linuxcnc/configs/sim/axis/external_offsets/queuebuster.ngc",
sourceFiles: [
"linuxcnc/configs/sim/axis/external_offsets/eoffsets.ini",
"linuxcnc/configs/sim/axis/external_offsets/eoffsets.ngc",
],
},
];
function isVirtualHalSimConfigSourceCoverageReady(report) { function isVirtualHalSimConfigSourceCoverageReady(report) {
const coverage = objectOrEmpty(report); const coverage = objectOrEmpty(report);
return coverage.apiName === "linuxcnc-wasm-virtual-hal-sim-config-source-coverage-report" && return coverage.apiName === "linuxcnc-wasm-virtual-hal-sim-config-source-coverage-report" &&
@@ -176,6 +196,29 @@ function hasRequiredPromotionCandidates(rows) {
); );
} }
function isVirtualHalSimConfigMacroLoadFixtureReportReady(report) {
const fixtureReport = objectOrEmpty(report);
const rows = arrayOrEmpty(fixtureReport.rows);
return fixtureReport.apiName === "linuxcnc-wasm-virtual-hal-sim-config-macro-load-fixture-report" &&
fixtureReport.complete === true &&
fixtureReport.webSimulationSatisfied === true &&
fixtureReport.inventoryBaselineUnchanged === true &&
arrayOrEmpty(fixtureReport.missingFixtures).length === 0 &&
arrayOrEmpty(fixtureReport.blockedFixtureIds).length === 0 &&
arrayOrEmpty(fixtureReport.standaloneMainViolations).length === 0 &&
arrayOrEmpty(fixtureReport.missingManifestFiles).length === 0 &&
REQUIRED_MACRO_LOAD_FIXTURES.every((fixture) =>
rows.some((row) =>
row.id === fixture.id &&
row.complete === true &&
row.nonMainFixture === true &&
row.targetBrowserEvidence === "non-main-fixture-diagnostics" &&
row.fixturePath === fixture.fixturePath &&
fixture.sourceFiles.every((file) => arrayOrEmpty(row.sourceFiles).includes(file))
)
);
}
function isVirtualHalMotionControllerMatrixReady(report) { function isVirtualHalMotionControllerMatrixReady(report) {
const matrix = objectOrEmpty(report); const matrix = objectOrEmpty(report);
return matrix.apiName === "linuxcnc-wasm-virtual-hal-motion-controller-matrix-report" && return matrix.apiName === "linuxcnc-wasm-virtual-hal-motion-controller-matrix-report" &&
@@ -218,6 +261,7 @@ export function createProjectReleaseBrowserDiagnosticsArtifactValidation(artifac
const commandScriptFixtures = objectOrEmpty(artifactObject.virtualHalCommandScriptFixtures); const commandScriptFixtures = objectOrEmpty(artifactObject.virtualHalCommandScriptFixtures);
const motionControllerMatrix = objectOrEmpty(artifactObject.virtualHalMotionControllerMatrix); const motionControllerMatrix = objectOrEmpty(artifactObject.virtualHalMotionControllerMatrix);
const promotionCandidates = objectOrEmpty(artifactObject.virtualHalSimConfigPromotionCandidates); const promotionCandidates = objectOrEmpty(artifactObject.virtualHalSimConfigPromotionCandidates);
const macroLoadFixtures = objectOrEmpty(artifactObject.virtualHalSimConfigMacroLoadFixtures);
const sessionDiagnostics = objectOrEmpty(artifactObject.virtualHalSessionDiagnostics); const sessionDiagnostics = objectOrEmpty(artifactObject.virtualHalSessionDiagnostics);
const replacement = objectOrEmpty(artifactObject.virtualHalSimulationReplacement); const replacement = objectOrEmpty(artifactObject.virtualHalSimulationReplacement);
const virtualHal = objectOrEmpty(artifactObject.virtualHal); const virtualHal = objectOrEmpty(artifactObject.virtualHal);
@@ -234,6 +278,9 @@ export function createProjectReleaseBrowserDiagnosticsArtifactValidation(artifac
const hasPromotionCandidates = artifactObject.virtualHalSimConfigPromotionCandidates !== undefined; const hasPromotionCandidates = artifactObject.virtualHalSimConfigPromotionCandidates !== undefined;
const promotionCandidatesReady = !hasPromotionCandidates || const promotionCandidatesReady = !hasPromotionCandidates ||
isVirtualHalSimConfigPromotionCandidateReportReady(promotionCandidates); isVirtualHalSimConfigPromotionCandidateReportReady(promotionCandidates);
const hasMacroLoadFixtures = artifactObject.virtualHalSimConfigMacroLoadFixtures !== undefined;
const macroLoadFixturesReady = hasMacroLoadFixtures &&
isVirtualHalSimConfigMacroLoadFixtureReportReady(macroLoadFixtures);
const replacementReady = replacement.ready === true && const replacementReady = replacement.ready === true &&
replacement.replacesHostRuntimeForSimulation === true && replacement.replacesHostRuntimeForSimulation === true &&
objectOrEmpty(replacement.sourceCompliance).webSimulationSatisfied === true && objectOrEmpty(replacement.sourceCompliance).webSimulationSatisfied === true &&
@@ -256,6 +303,7 @@ export function createProjectReleaseBrowserDiagnosticsArtifactValidation(artifac
...(sourceComplianceReady ? [] : ["virtualHalSourceCompliance"]), ...(sourceComplianceReady ? [] : ["virtualHalSourceCompliance"]),
...(simConfigSourceCoverageReady ? [] : ["virtualHalSimConfigSourceCoverage"]), ...(simConfigSourceCoverageReady ? [] : ["virtualHalSimConfigSourceCoverage"]),
...(promotionCandidatesReady ? [] : ["virtualHalSimConfigPromotionCandidates"]), ...(promotionCandidatesReady ? [] : ["virtualHalSimConfigPromotionCandidates"]),
...(macroLoadFixturesReady ? [] : ["virtualHalSimConfigMacroLoadFixtures"]),
...(commandScriptFixturesReady ? [] : ["virtualHalCommandScriptFixtures"]), ...(commandScriptFixturesReady ? [] : ["virtualHalCommandScriptFixtures"]),
...(motionControllerMatrixReady ? [] : ["virtualHalMotionControllerMatrix"]), ...(motionControllerMatrixReady ? [] : ["virtualHalMotionControllerMatrix"]),
...(sessionDiagnosticsReady ? [] : ["virtualHalSessionDiagnostics"]), ...(sessionDiagnosticsReady ? [] : ["virtualHalSessionDiagnostics"]),
@@ -273,6 +321,8 @@ export function createProjectReleaseBrowserDiagnosticsArtifactValidation(artifac
simConfigSourceCoverageReady, simConfigSourceCoverageReady,
promotionCandidatesReady, promotionCandidatesReady,
hasPromotionCandidates, hasPromotionCandidates,
macroLoadFixturesReady,
hasMacroLoadFixtures,
commandScriptFixturesReady, commandScriptFixturesReady,
motionControllerMatrixReady, motionControllerMatrixReady,
sessionDiagnosticsReady, sessionDiagnosticsReady,
@@ -281,6 +331,7 @@ export function createProjectReleaseBrowserDiagnosticsArtifactValidation(artifac
...arrayOrEmpty(sourceCompliance.sourceFiles), ...arrayOrEmpty(sourceCompliance.sourceFiles),
...arrayOrEmpty(simConfigSourceCoverage.sourceFiles), ...arrayOrEmpty(simConfigSourceCoverage.sourceFiles),
...arrayOrEmpty(promotionCandidates.sourceFiles), ...arrayOrEmpty(promotionCandidates.sourceFiles),
...arrayOrEmpty(macroLoadFixtures.sourceFiles),
...arrayOrEmpty(commandScriptFixtures.sourceFiles), ...arrayOrEmpty(commandScriptFixtures.sourceFiles),
...arrayOrEmpty(motionControllerMatrix.sourceFiles), ...arrayOrEmpty(motionControllerMatrix.sourceFiles),
...arrayOrEmpty(motionControllerMatrix.simConfigSourceFiles), ...arrayOrEmpty(motionControllerMatrix.simConfigSourceFiles),
@@ -311,6 +362,11 @@ export function createProjectReleaseBrowserDiagnosticsArtifactValidation(artifac
label: "Virtual HAL sim-config promotion candidates", label: "Virtual HAL sim-config promotion candidates",
value: hasPromotionCandidates ? (promotionCandidatesReady ? "ready" : "missing") : "not provided", value: hasPromotionCandidates ? (promotionCandidatesReady ? "ready" : "missing") : "not provided",
}, },
{
id: "sim-config-macro-load-fixtures",
label: "Virtual HAL sim-config macro/load fixtures",
value: hasMacroLoadFixtures ? (macroLoadFixturesReady ? "ready" : "missing") : "not provided",
},
{ {
id: "command-script-fixtures", id: "command-script-fixtures",
label: "Virtual HAL command script fixtures", label: "Virtual HAL command script fixtures",

View File

@@ -1805,6 +1805,7 @@ M2
import { import {
DEFAULT_SIMULATION_PROGRAM_ID, DEFAULT_SIMULATION_PROGRAM_ID,
VIRTUAL_HAL_AXES as SHARED_VIRTUAL_HAL_AXES, VIRTUAL_HAL_AXES as SHARED_VIRTUAL_HAL_AXES,
VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_FIXTURES as SHARED_VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_FIXTURES,
VIRTUAL_HAL_SIM_CONFIG_PROMOTION_CANDIDATES as SHARED_VIRTUAL_HAL_SIM_CONFIG_PROMOTION_CANDIDATES, VIRTUAL_HAL_SIM_CONFIG_PROMOTION_CANDIDATES as SHARED_VIRTUAL_HAL_SIM_CONFIG_PROMOTION_CANDIDATES,
VIRTUAL_HAL_SIM_CONFIG_SOURCE_TARGETS as SHARED_VIRTUAL_HAL_SIM_CONFIG_SOURCE_TARGETS, VIRTUAL_HAL_SIM_CONFIG_SOURCE_TARGETS as SHARED_VIRTUAL_HAL_SIM_CONFIG_SOURCE_TARGETS,
applyVirtualHalAction as applySharedVirtualHalAction, applyVirtualHalAction as applySharedVirtualHalAction,
@@ -1817,6 +1818,7 @@ M2
createVirtualHalMachineStatusState as createSharedVirtualHalMachineStatusState, createVirtualHalMachineStatusState as createSharedVirtualHalMachineStatusState,
createVirtualHalMotionControllerMatrixReport as createSharedVirtualHalMotionControllerMatrixReport, createVirtualHalMotionControllerMatrixReport as createSharedVirtualHalMotionControllerMatrixReport,
createVirtualHalPinRegistry as createSharedVirtualHalPinRegistry, createVirtualHalPinRegistry as createSharedVirtualHalPinRegistry,
createVirtualHalSimConfigMacroLoadFixtureReport as createSharedVirtualHalSimConfigMacroLoadFixtureReport,
createVirtualHalSimConfigPromotionCandidateReport as createSharedVirtualHalSimConfigPromotionCandidateReport, createVirtualHalSimConfigPromotionCandidateReport as createSharedVirtualHalSimConfigPromotionCandidateReport,
createVirtualHalSimConfigSourceCoverageReport as createSharedVirtualHalSimConfigSourceCoverageReport, createVirtualHalSimConfigSourceCoverageReport as createSharedVirtualHalSimConfigSourceCoverageReport,
createVirtualHalSimulationReplacementReport as createSharedVirtualHalSimulationReplacementReport, createVirtualHalSimulationReplacementReport as createSharedVirtualHalSimulationReplacementReport,
@@ -1986,6 +1988,7 @@ M2
}; };
const statusHistory = []; const statusHistory = [];
const VIRTUAL_HAL_AXES = SHARED_VIRTUAL_HAL_AXES; const VIRTUAL_HAL_AXES = SHARED_VIRTUAL_HAL_AXES;
const VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_FIXTURES = SHARED_VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_FIXTURES;
const VIRTUAL_HAL_SIM_CONFIG_PROMOTION_CANDIDATES = SHARED_VIRTUAL_HAL_SIM_CONFIG_PROMOTION_CANDIDATES; const VIRTUAL_HAL_SIM_CONFIG_PROMOTION_CANDIDATES = SHARED_VIRTUAL_HAL_SIM_CONFIG_PROMOTION_CANDIDATES;
const VIRTUAL_HAL_MOTION_MATRIX_MANIFEST_ENTRIES = SHARED_VIRTUAL_HAL_SIM_CONFIG_SOURCE_TARGETS.flatMap((target) => target.sourceFiles ?? []); const VIRTUAL_HAL_MOTION_MATRIX_MANIFEST_ENTRIES = SHARED_VIRTUAL_HAL_SIM_CONFIG_SOURCE_TARGETS.flatMap((target) => target.sourceFiles ?? []);
let virtualHalState = createVirtualHalState(); let virtualHalState = createVirtualHalState();
@@ -2531,6 +2534,15 @@ M2
}); });
} }
function createVirtualHalSimConfigMacroLoadFixtureReport() {
return createSharedVirtualHalSimConfigMacroLoadFixtureReport({
manifestEntries: [
...VIRTUAL_HAL_MOTION_MATRIX_MANIFEST_ENTRIES,
...VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_FIXTURES.flatMap((fixture) => fixture.sourceFiles ?? []),
],
});
}
function createVirtualHalCommandScriptFixtureReport() { function createVirtualHalCommandScriptFixtureReport() {
return createSharedVirtualHalCommandScriptFixtureReport({ halState: virtualHalState }); return createSharedVirtualHalCommandScriptFixtureReport({ halState: virtualHalState });
} }
@@ -2630,6 +2642,7 @@ M2
virtualHalSourceCompliance: createVirtualHalSourceComplianceReport(), virtualHalSourceCompliance: createVirtualHalSourceComplianceReport(),
virtualHalSimConfigSourceCoverage: createVirtualHalSimConfigSourceCoverageReport(), virtualHalSimConfigSourceCoverage: createVirtualHalSimConfigSourceCoverageReport(),
virtualHalSimConfigPromotionCandidates: createVirtualHalSimConfigPromotionCandidateReport(), virtualHalSimConfigPromotionCandidates: createVirtualHalSimConfigPromotionCandidateReport(),
virtualHalSimConfigMacroLoadFixtures: createVirtualHalSimConfigMacroLoadFixtureReport(),
virtualHalCommandScriptFixtures: createVirtualHalCommandScriptFixtureReport(), virtualHalCommandScriptFixtures: createVirtualHalCommandScriptFixtureReport(),
virtualHalMotionControllerMatrix: createVirtualHalMotionControllerMatrixReport(), virtualHalMotionControllerMatrix: createVirtualHalMotionControllerMatrixReport(),
virtualHalSessionDiagnostics: createVirtualHalSessionDiagnosticsArtifact(), virtualHalSessionDiagnostics: createVirtualHalSessionDiagnosticsArtifact(),
@@ -2665,6 +2678,8 @@ M2
virtualHalSimulationReplacement: virtualHal.diagnostics, virtualHalSimulationReplacement: virtualHal.diagnostics,
virtualHalSourceCompliance: virtualHal.sourceCompliance, virtualHalSourceCompliance: virtualHal.sourceCompliance,
virtualHalSimConfigSourceCoverage: virtualHal.simConfigSourceCoverage, virtualHalSimConfigSourceCoverage: virtualHal.simConfigSourceCoverage,
virtualHalSimConfigPromotionCandidates: virtualHal.simConfigPromotionCandidates,
virtualHalSimConfigMacroLoadFixtures: virtualHal.simConfigMacroLoadFixtures,
virtualHalCommandScriptFixtures: virtualHal.commandScriptFixtures, virtualHalCommandScriptFixtures: virtualHal.commandScriptFixtures,
virtualHalMotionControllerMatrix: virtualHal.motionControllerMatrix, virtualHalMotionControllerMatrix: virtualHal.motionControllerMatrix,
}; };
@@ -3596,7 +3611,11 @@ M2
async function saveVirtualHalSessionSnapshot(options = {}) { async function saveVirtualHalSessionSnapshot(options = {}) {
const session = virtualHalSessionOptions(options); const session = virtualHalSessionOptions(options);
const virtualHal = createVirtualHalSessionPayload(virtualHalState, { const virtualHal = createVirtualHalSessionPayload(virtualHalState, {
manifestEntries: VIRTUAL_HAL_MOTION_MATRIX_MANIFEST_ENTRIES, manifestEntries: [
...VIRTUAL_HAL_MOTION_MATRIX_MANIFEST_ENTRIES,
...VIRTUAL_HAL_SIM_CONFIG_PROMOTION_CANDIDATES.flatMap((candidate) => candidate.sourceFiles ?? []),
...VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_FIXTURES.flatMap((fixture) => fixture.sourceFiles ?? []),
],
}); });
const payload = createMachineSessionSnapshotPayload(session.machineId, { const payload = createMachineSessionSnapshotPayload(session.machineId, {
...(session.gcodeFilename ? { gcodeFilename: session.gcodeFilename } : {}), ...(session.gcodeFilename ? { gcodeFilename: session.gcodeFilename } : {}),
@@ -4062,6 +4081,7 @@ M2
getVirtualHalSourceComplianceReport: () => createVirtualHalSourceComplianceReport(), getVirtualHalSourceComplianceReport: () => createVirtualHalSourceComplianceReport(),
getVirtualHalSimConfigSourceCoverageReport: () => createVirtualHalSimConfigSourceCoverageReport(), getVirtualHalSimConfigSourceCoverageReport: () => createVirtualHalSimConfigSourceCoverageReport(),
getVirtualHalSimConfigPromotionCandidateReport: () => createVirtualHalSimConfigPromotionCandidateReport(), getVirtualHalSimConfigPromotionCandidateReport: () => createVirtualHalSimConfigPromotionCandidateReport(),
getVirtualHalSimConfigMacroLoadFixtureReport: () => createVirtualHalSimConfigMacroLoadFixtureReport(),
getVirtualHalCommandScriptFixtureReport: () => createVirtualHalCommandScriptFixtureReport(), getVirtualHalCommandScriptFixtureReport: () => createVirtualHalCommandScriptFixtureReport(),
getVirtualHalMotionControllerMatrixReport: () => createVirtualHalMotionControllerMatrixReport(), getVirtualHalMotionControllerMatrixReport: () => createVirtualHalMotionControllerMatrixReport(),
getVirtualRealtimeHalRuntimeReport: () => createVirtualHalSimulationReplacementReport(), getVirtualRealtimeHalRuntimeReport: () => createVirtualHalSimulationReplacementReport(),

View File

@@ -19,6 +19,7 @@ export {
VIRTUAL_HAL_AXES, VIRTUAL_HAL_AXES,
VIRTUAL_HAL_AXISUI_PINS, VIRTUAL_HAL_AXISUI_PINS,
VIRTUAL_HAL_MOTION_CONTROLLER_MATRIX_FIXTURES, VIRTUAL_HAL_MOTION_CONTROLLER_MATRIX_FIXTURES,
VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_FIXTURES,
VIRTUAL_HAL_SIM_CONFIG_PROMOTION_CANDIDATES, VIRTUAL_HAL_SIM_CONFIG_PROMOTION_CANDIDATES,
VIRTUAL_HAL_SIM_CONFIG_SOURCE_TARGETS, VIRTUAL_HAL_SIM_CONFIG_SOURCE_TARGETS,
VIRTUAL_HAL_SIMULATION_REPLACEMENT_TARGETS, VIRTUAL_HAL_SIMULATION_REPLACEMENT_TARGETS,
@@ -34,6 +35,7 @@ export {
createVirtualHalLimitsHomeState, createVirtualHalLimitsHomeState,
createVirtualHalMachineStatusState, createVirtualHalMachineStatusState,
createVirtualHalPinRegistry, createVirtualHalPinRegistry,
createVirtualHalSimConfigMacroLoadFixtureReport,
createVirtualHalSimConfigPromotionCandidateReport, createVirtualHalSimConfigPromotionCandidateReport,
createVirtualHalSimConfigSourceCoverageReport, createVirtualHalSimConfigSourceCoverageReport,
createVirtualHalSimulationReplacementReport, createVirtualHalSimulationReplacementReport,

View File

@@ -11,6 +11,7 @@
VIRTUAL_HAL_SIM_CONFIG_SOURCE_TARGETS, VIRTUAL_HAL_SIM_CONFIG_SOURCE_TARGETS,
createVirtualHalCommandScriptFixtureReport, createVirtualHalCommandScriptFixtureReport,
createVirtualHalMotionControllerMatrixReport, createVirtualHalMotionControllerMatrixReport,
createVirtualHalSimConfigMacroLoadFixtureReport,
createVirtualHalSimConfigPromotionCandidateReport, createVirtualHalSimConfigPromotionCandidateReport,
createVirtualHalSimConfigSourceCoverageReport, createVirtualHalSimConfigSourceCoverageReport,
createVirtualHalSimulationReplacementReport, createVirtualHalSimulationReplacementReport,
@@ -380,6 +381,16 @@
manifestEntries: VIRTUAL_HAL_MOTION_MATRIX_MANIFEST_ENTRIES, manifestEntries: VIRTUAL_HAL_MOTION_MATRIX_MANIFEST_ENTRIES,
}), }),
}), }),
virtualHalSimConfigMacroLoadFixtures: createVirtualHalSimConfigMacroLoadFixtureReport({
manifestEntries: [
...VIRTUAL_HAL_MOTION_MATRIX_MANIFEST_ENTRIES,
"linuxcnc/configs/sim/axis/rose_engine/rose_engine.ini",
"linuxcnc/configs/sim/axis/rose_engine/rcone.ngc",
"linuxcnc/configs/sim/axis/rose_engine/rcone_demo.ngc",
"linuxcnc/configs/sim/axis/external_offsets/eoffsets.ini",
"linuxcnc/configs/sim/axis/external_offsets/eoffsets.ngc",
],
}),
virtualHalCommandScriptFixtures: createVirtualHalCommandScriptFixtureReport({ halState: diagnosticsVirtualHalState }), virtualHalCommandScriptFixtures: createVirtualHalCommandScriptFixtureReport({ halState: diagnosticsVirtualHalState }),
virtualHalMotionControllerMatrix: createVirtualHalMotionControllerMatrixReport({ virtualHalMotionControllerMatrix: createVirtualHalMotionControllerMatrixReport({
manifestEntries: VIRTUAL_HAL_MOTION_MATRIX_MANIFEST_ENTRIES, manifestEntries: VIRTUAL_HAL_MOTION_MATRIX_MANIFEST_ENTRIES,

View File

@@ -244,6 +244,7 @@
!api?.getVirtualHalSourceComplianceReport || !api?.getVirtualHalSourceComplianceReport ||
!api?.getVirtualHalSimConfigSourceCoverageReport || !api?.getVirtualHalSimConfigSourceCoverageReport ||
!api?.getVirtualHalSimConfigPromotionCandidateReport || !api?.getVirtualHalSimConfigPromotionCandidateReport ||
!api?.getVirtualHalSimConfigMacroLoadFixtureReport ||
!api?.getVirtualHalCommandScriptFixtureReport || !api?.getVirtualHalCommandScriptFixtureReport ||
!api?.getVirtualHalMotionControllerMatrixReport || !api?.getVirtualHalMotionControllerMatrixReport ||
!api?.getVirtualRealtimeHalRuntimeReport !api?.getVirtualRealtimeHalRuntimeReport
@@ -451,6 +452,23 @@
"linuxcnc/configs/sim/axis/rose_engine/rcone_demo.ngc", "linuxcnc/configs/sim/axis/rose_engine/rcone_demo.ngc",
], ],
]; ];
const expectedMacroLoadFixtures = [
[
"rose-engine-rcone-macro-load",
"linuxcnc/configs/sim/axis/rose_engine/rcone.ngc",
false,
"linuxcnc/configs/sim/axis/rose_engine/rose_engine.ini",
"linuxcnc/configs/sim/axis/rose_engine/rcone.ngc",
"linuxcnc/configs/sim/axis/rose_engine/rcone_demo.ngc",
],
[
"external-offsets-queuebuster-macro-load",
"linuxcnc/configs/sim/axis/external_offsets/queuebuster.ngc",
true,
"linuxcnc/configs/sim/axis/external_offsets/eoffsets.ini",
"linuxcnc/configs/sim/axis/external_offsets/eoffsets.ngc",
],
];
if ( if (
diagnosticsArtifact.apiName !== "real-browser-simulation-diagnostics-artifact" || diagnosticsArtifact.apiName !== "real-browser-simulation-diagnostics-artifact" ||
diagnosticsArtifact.statusHistory.length === 0 || diagnosticsArtifact.statusHistory.length === 0 ||
@@ -474,6 +492,18 @@
sourceFiles.every((sourceFile) => row.sourceFiles.includes(sourceFile)) sourceFiles.every((sourceFile) => row.sourceFiles.includes(sourceFile))
) )
) || ) ||
diagnosticsArtifact.virtualHalSimConfigMacroLoadFixtures?.complete !== true ||
!expectedMacroLoadFixtures.every(([id, fixturePath, declaredOnly, ...sourceFiles]) =>
diagnosticsArtifact.virtualHalSimConfigMacroLoadFixtures?.rows?.some((row) =>
row.id === id &&
row.complete === true &&
row.nonMainFixture === true &&
row.targetBrowserEvidence === "non-main-fixture-diagnostics" &&
row.fixturePath === fixturePath &&
row.declaredOnly === declaredOnly &&
sourceFiles.every((sourceFile) => row.sourceFiles.includes(sourceFile))
)
) ||
diagnosticsArtifact.virtualHalCommandScriptFixtures?.complete !== true || diagnosticsArtifact.virtualHalCommandScriptFixtures?.complete !== true ||
!diagnosticsArtifact.virtualHalCommandScriptFixtures?.coveredActions?.includes("loadusr") || !diagnosticsArtifact.virtualHalCommandScriptFixtures?.coveredActions?.includes("loadusr") ||
diagnosticsArtifact.virtualHalMotionControllerMatrix?.complete !== true || diagnosticsArtifact.virtualHalMotionControllerMatrix?.complete !== true ||
@@ -894,6 +924,7 @@
} }
const virtualHalReplacement = api.getVirtualHalSimulationReplacementReport(); const virtualHalReplacement = api.getVirtualHalSimulationReplacementReport();
const promotionCandidateReport = api.getVirtualHalSimConfigPromotionCandidateReport(); const promotionCandidateReport = api.getVirtualHalSimConfigPromotionCandidateReport();
const macroLoadFixtureReport = api.getVirtualHalSimConfigMacroLoadFixtureReport();
if ( if (
virtualHalReplacement.apiName !== "linuxcnc-wasm-virtual-hal-simulation-replacement-report" || virtualHalReplacement.apiName !== "linuxcnc-wasm-virtual-hal-simulation-replacement-report" ||
virtualHalReplacement.ready !== true || virtualHalReplacement.ready !== true ||
@@ -921,6 +952,19 @@
sourceFiles.every((sourceFile) => row.sourceFiles.includes(sourceFile)) sourceFiles.every((sourceFile) => row.sourceFiles.includes(sourceFile))
) )
) || ) ||
macroLoadFixtureReport.complete !== true ||
macroLoadFixtureReport.inventoryBaselineUnchanged !== true ||
macroLoadFixtureReport.standaloneMainViolations.length !== 0 ||
!expectedMacroLoadFixtures.every(([id, fixturePath, declaredOnly, ...sourceFiles]) =>
macroLoadFixtureReport.rows.some((row) =>
row.id === id &&
row.complete === true &&
row.nonMainFixture === true &&
row.fixturePath === fixturePath &&
row.declaredOnly === declaredOnly &&
sourceFiles.every((sourceFile) => row.sourceFiles.includes(sourceFile))
)
) ||
api.getVirtualRealtimeHalRuntimeReport().ready !== true || api.getVirtualRealtimeHalRuntimeReport().ready !== true ||
api.getVirtualHalSimulationRuntimeReport().replacesHostRuntimeForSimulation !== true api.getVirtualHalSimulationRuntimeReport().replacesHostRuntimeForSimulation !== true
) { ) {

View File

@@ -265,6 +265,8 @@ assert.equal(virtualHalSessionPayload.state.hal.signals["x-pos"].value, 2.25);
assert.equal(virtualHalSessionPayload.state.hal.nets["x-pos"].includes("axis.x.pos-cmd"), true); assert.equal(virtualHalSessionPayload.state.hal.nets["x-pos"].includes("axis.x.pos-cmd"), true);
assert.equal(virtualHalSessionPayload.sourceCompliance.complete, true); assert.equal(virtualHalSessionPayload.sourceCompliance.complete, true);
assert.equal(virtualHalSessionPayload.simConfigSourceCoverage.complete, true); assert.equal(virtualHalSessionPayload.simConfigSourceCoverage.complete, true);
assert.equal(virtualHalSessionPayload.simConfigPromotionCandidates.complete, true);
assert.equal(virtualHalSessionPayload.simConfigMacroLoadFixtures.complete, true);
assert.equal(virtualHalSessionPayload.commandScriptFixtures.complete, true); assert.equal(virtualHalSessionPayload.commandScriptFixtures.complete, true);
assert.equal(virtualHalSessionPayload.motionControllerMatrix.complete, true); assert.equal(virtualHalSessionPayload.motionControllerMatrix.complete, true);
const virtualHalSnapshotPayload = createMachineSessionSnapshotPayload("virtual-hal-machine", { const virtualHalSnapshotPayload = createMachineSessionSnapshotPayload("virtual-hal-machine", {
@@ -272,6 +274,7 @@ const virtualHalSnapshotPayload = createMachineSessionSnapshotPayload("virtual-h
virtualHal: virtualHalSessionPayload, virtualHal: virtualHalSessionPayload,
}); });
assert.equal(virtualHalSnapshotPayload.virtualHal.state.hal.signals["x-pos"].value, 2.25); assert.equal(virtualHalSnapshotPayload.virtualHal.state.hal.signals["x-pos"].value, 2.25);
assert.equal(virtualHalSnapshotPayload.virtualHal.simConfigMacroLoadFixtures.inventoryBaselineUnchanged, true);
assert.equal(virtualHalSnapshotPayload.virtualHal.commandScriptFixtures.coveredActions.includes("loadusr"), true); assert.equal(virtualHalSnapshotPayload.virtualHal.commandScriptFixtures.coveredActions.includes("loadusr"), true);
assert.equal(virtualHalSnapshotPayload.virtualHal.motionControllerMatrix.sourceFiles.includes("linuxcnc/src/emc/motion/axis.c"), true); assert.equal(virtualHalSnapshotPayload.virtualHal.motionControllerMatrix.sourceFiles.includes("linuxcnc/src/emc/motion/axis.c"), true);
assert.deepEqual( assert.deepEqual(

View File

@@ -11,6 +11,7 @@ import {
createProjectReleaseReadinessReport, createProjectReleaseReadinessReport,
createVirtualHalSimConfigSourceCoverageReport, createVirtualHalSimConfigSourceCoverageReport,
createVirtualHalSimConfigPromotionCandidateReport, createVirtualHalSimConfigPromotionCandidateReport,
createVirtualHalSimConfigMacroLoadFixtureReport,
createVirtualHalCommandScriptFixtureReport, createVirtualHalCommandScriptFixtureReport,
createVirtualHalMotionControllerMatrixReport, createVirtualHalMotionControllerMatrixReport,
createVirtualHalSimulationReplacementReport, createVirtualHalSimulationReplacementReport,
@@ -30,6 +31,9 @@ const virtualHalSimConfigPromotionCandidates = createVirtualHalSimConfigPromotio
simConfigSourceCoverage: virtualHalSimConfigSourceCoverage, simConfigSourceCoverage: virtualHalSimConfigSourceCoverage,
motionControllerMatrix: virtualHalMotionControllerMatrix, motionControllerMatrix: virtualHalMotionControllerMatrix,
}); });
const virtualHalSimConfigMacroLoadFixtures = createVirtualHalSimConfigMacroLoadFixtureReport({
manifestText: sourceManifestText,
});
const virtualHalState = createVirtualHalState(); const virtualHalState = createVirtualHalState();
const browserDiagnosticsArtifact = { const browserDiagnosticsArtifact = {
apiName: "real-browser-simulation-diagnostics-artifact", apiName: "real-browser-simulation-diagnostics-artifact",
@@ -39,6 +43,7 @@ const browserDiagnosticsArtifact = {
virtualHalSourceCompliance: createVirtualHalSourceComplianceReport({ halState: virtualHalState }), virtualHalSourceCompliance: createVirtualHalSourceComplianceReport({ halState: virtualHalState }),
virtualHalSimConfigSourceCoverage, virtualHalSimConfigSourceCoverage,
virtualHalSimConfigPromotionCandidates, virtualHalSimConfigPromotionCandidates,
virtualHalSimConfigMacroLoadFixtures,
virtualHalCommandScriptFixtures: createVirtualHalCommandScriptFixtureReport({ halState: virtualHalState }), virtualHalCommandScriptFixtures: createVirtualHalCommandScriptFixtureReport({ halState: virtualHalState }),
virtualHalMotionControllerMatrix, virtualHalMotionControllerMatrix,
}; };
@@ -100,6 +105,8 @@ assert.equal(readyWorkflow.validation.ready, true);
assert.equal(readyWorkflow.diagnosticsValidation.ready, true); assert.equal(readyWorkflow.diagnosticsValidation.ready, true);
assert.equal(readyWorkflow.diagnosticsValidation.hasPromotionCandidates, true); assert.equal(readyWorkflow.diagnosticsValidation.hasPromotionCandidates, true);
assert.equal(readyWorkflow.diagnosticsValidation.promotionCandidatesReady, true); assert.equal(readyWorkflow.diagnosticsValidation.promotionCandidatesReady, true);
assert.equal(readyWorkflow.diagnosticsValidation.hasMacroLoadFixtures, true);
assert.equal(readyWorkflow.diagnosticsValidation.macroLoadFixturesReady, true);
assert.equal(readyWorkflow.diagnosticsValidation.hasSessionDiagnostics, true); assert.equal(readyWorkflow.diagnosticsValidation.hasSessionDiagnostics, true);
assert.equal(readyWorkflow.diagnosticsValidation.sessionDiagnosticsReady, true); assert.equal(readyWorkflow.diagnosticsValidation.sessionDiagnosticsReady, true);
assert.equal(readyWorkflow.diagnosticsFetched, true); assert.equal(readyWorkflow.diagnosticsFetched, true);

View File

@@ -36,6 +36,7 @@ import {
VIRTUAL_HAL_COVERAGE_STATES, VIRTUAL_HAL_COVERAGE_STATES,
VIRTUAL_HAL_MOTION_CONTROLLER_MATRIX_FIXTURES, VIRTUAL_HAL_MOTION_CONTROLLER_MATRIX_FIXTURES,
VIRTUAL_HAL_PROJECT_PIN_GROUPS, VIRTUAL_HAL_PROJECT_PIN_GROUPS,
VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_FIXTURES,
VIRTUAL_HAL_SIM_CONFIG_PROMOTION_CANDIDATES, VIRTUAL_HAL_SIM_CONFIG_PROMOTION_CANDIDATES,
VIRTUAL_HAL_SIM_CONFIG_SOURCE_TARGETS, VIRTUAL_HAL_SIM_CONFIG_SOURCE_TARGETS,
VIRTUAL_HAL_SOURCE_DERIVED_CAPABILITIES, VIRTUAL_HAL_SOURCE_DERIVED_CAPABILITIES,
@@ -90,6 +91,7 @@ import {
createVirtualHalPinInventory, createVirtualHalPinInventory,
createVirtualHalPinRegistry, createVirtualHalPinRegistry,
createVirtualHalProjectReport, createVirtualHalProjectReport,
createVirtualHalSimConfigMacroLoadFixtureReport,
createVirtualHalSimConfigPromotionCandidateReport, createVirtualHalSimConfigPromotionCandidateReport,
createVirtualHalSimConfigSourceCoverageReport, createVirtualHalSimConfigSourceCoverageReport,
createVirtualHalSimulationReplacementReport, createVirtualHalSimulationReplacementReport,
@@ -241,6 +243,7 @@ const requiredExports = [
["createVirtualHalPinInventory", createVirtualHalPinInventory], ["createVirtualHalPinInventory", createVirtualHalPinInventory],
["createVirtualHalPinRegistry", createVirtualHalPinRegistry], ["createVirtualHalPinRegistry", createVirtualHalPinRegistry],
["createVirtualHalProjectReport", createVirtualHalProjectReport], ["createVirtualHalProjectReport", createVirtualHalProjectReport],
["createVirtualHalSimConfigMacroLoadFixtureReport", createVirtualHalSimConfigMacroLoadFixtureReport],
["createVirtualHalSimConfigPromotionCandidateReport", createVirtualHalSimConfigPromotionCandidateReport], ["createVirtualHalSimConfigPromotionCandidateReport", createVirtualHalSimConfigPromotionCandidateReport],
["createVirtualHalSimConfigSourceCoverageReport", createVirtualHalSimConfigSourceCoverageReport], ["createVirtualHalSimConfigSourceCoverageReport", createVirtualHalSimConfigSourceCoverageReport],
["createVirtualHalSimulationReplacementReport", createVirtualHalSimulationReplacementReport], ["createVirtualHalSimulationReplacementReport", createVirtualHalSimulationReplacementReport],
@@ -543,6 +546,10 @@ assert.match(sdkIndexText, /\bVIRTUAL_HAL_SIM_CONFIG_PROMOTION_CANDIDATES\b/);
assert.match(sdkReadmeText, /\bVIRTUAL_HAL_SIM_CONFIG_PROMOTION_CANDIDATES\b/); assert.match(sdkReadmeText, /\bVIRTUAL_HAL_SIM_CONFIG_PROMOTION_CANDIDATES\b/);
assert.match(sdkIndexText, /\bcreateVirtualHalSimConfigPromotionCandidateReport\b/); assert.match(sdkIndexText, /\bcreateVirtualHalSimConfigPromotionCandidateReport\b/);
assert.match(sdkReadmeText, /\bcreateVirtualHalSimConfigPromotionCandidateReport\b/); 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, /\bcreateVirtualHalSimConfigMacroLoadFixtureReport\b/);
assert.match(sdkReadmeText, /\bcreateVirtualHalSimConfigMacroLoadFixtureReport\b/);
assert.match(sdkIndexText, /\bcreateVirtualHalSourceComplianceReport\b/); assert.match(sdkIndexText, /\bcreateVirtualHalSourceComplianceReport\b/);
assert.match(sdkReadmeText, /\bcreateVirtualHalSourceComplianceReport\b/); assert.match(sdkReadmeText, /\bcreateVirtualHalSourceComplianceReport\b/);
assert.match(sdkIndexText, /\bcreateVirtualHalSystemCoverageReport\b/); assert.match(sdkIndexText, /\bcreateVirtualHalSystemCoverageReport\b/);
@@ -835,6 +842,49 @@ assert.equal(virtualHalRuntime.getSimConfigPromotionCandidateReport({
simConfigSourceCoverage: simConfigSourceCoverageReport, simConfigSourceCoverage: simConfigSourceCoverageReport,
motionControllerMatrix: manifestCheckedMotionControllerMatrixReport, motionControllerMatrix: manifestCheckedMotionControllerMatrixReport,
}).complete, true); }).complete, true);
assert.equal(VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_FIXTURES.length >= 2, true);
const simConfigMacroLoadFixtureReport = createVirtualHalSimConfigMacroLoadFixtureReport({
manifestText: sourceManifestText,
});
assert.equal(
simConfigMacroLoadFixtureReport.apiName,
"linuxcnc-wasm-virtual-hal-sim-config-macro-load-fixture-report",
);
assert.equal(simConfigMacroLoadFixtureReport.complete, true);
assert.equal(simConfigMacroLoadFixtureReport.webSimulationSatisfied, true);
assert.equal(simConfigMacroLoadFixtureReport.inventoryBaselineUnchanged, true);
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.missingManifestFiles.length, 0);
assert.equal(
simConfigMacroLoadFixtureReport.rows.some((row) =>
row.id === "rose-engine-rcone-macro-load" &&
row.complete === true &&
row.nonMainFixture === true &&
row.targetBrowserEvidence === "non-main-fixture-diagnostics" &&
row.fixturePath === "linuxcnc/configs/sim/axis/rose_engine/rcone.ngc" &&
row.sourceFiles.includes("linuxcnc/configs/sim/axis/rose_engine/rcone.ngc") &&
row.sourceFiles.includes("linuxcnc/configs/sim/axis/rose_engine/rcone_demo.ngc")
),
true,
);
assert.equal(
simConfigMacroLoadFixtureReport.rows.some((row) =>
row.id === "external-offsets-queuebuster-macro-load" &&
row.complete === true &&
row.nonMainFixture === true &&
row.declaredOnly === true &&
row.fixturePath === "linuxcnc/configs/sim/axis/external_offsets/queuebuster.ngc" &&
row.sourceFiles.includes("linuxcnc/configs/sim/axis/external_offsets/eoffsets.ini") &&
row.sourceFiles.includes("linuxcnc/configs/sim/axis/external_offsets/eoffsets.ngc")
),
true,
);
assert.equal(virtualHalRuntime.getSimConfigMacroLoadFixtureReport({
manifestText: sourceManifestText,
}).complete, true);
const sourceComplianceReport = createVirtualHalSourceComplianceReport({ halState: virtualHalRuntime.getState() }); const sourceComplianceReport = createVirtualHalSourceComplianceReport({ halState: virtualHalRuntime.getState() });
assert.equal(sourceComplianceReport.apiName, "linuxcnc-wasm-virtual-hal-source-compliance-report"); assert.equal(sourceComplianceReport.apiName, "linuxcnc-wasm-virtual-hal-source-compliance-report");
assert.equal(sourceComplianceReport.complete, true); assert.equal(sourceComplianceReport.complete, true);
@@ -860,6 +910,8 @@ assert.equal(virtualHalSessionPayload.apiName, "linuxcnc-wasm-virtual-hal-sessio
assert.equal(virtualHalSessionPayload.state.hal.signals["x-pos"].value, 1.25); assert.equal(virtualHalSessionPayload.state.hal.signals["x-pos"].value, 1.25);
assert.equal(virtualHalSessionPayload.sourceCompliance.complete, true); assert.equal(virtualHalSessionPayload.sourceCompliance.complete, true);
assert.equal(virtualHalSessionPayload.simConfigSourceCoverage.complete, true); assert.equal(virtualHalSessionPayload.simConfigSourceCoverage.complete, true);
assert.equal(virtualHalSessionPayload.simConfigPromotionCandidates.complete, true);
assert.equal(virtualHalSessionPayload.simConfigMacroLoadFixtures.complete, true);
assert.equal(virtualHalSessionPayload.commandScriptFixtures.complete, true); assert.equal(virtualHalSessionPayload.commandScriptFixtures.complete, true);
assert.equal(virtualHalSessionPayload.motionControllerMatrix.complete, true); assert.equal(virtualHalSessionPayload.motionControllerMatrix.complete, true);
const virtualHalSessionSnapshot = createSessionSnapshot( const virtualHalSessionSnapshot = createSessionSnapshot(
@@ -881,6 +933,7 @@ const browserDiagnosticsArtifact = {
virtualHalSourceCompliance: sourceComplianceReport, virtualHalSourceCompliance: sourceComplianceReport,
virtualHalSimConfigSourceCoverage: simConfigSourceCoverageReport, virtualHalSimConfigSourceCoverage: simConfigSourceCoverageReport,
virtualHalSimConfigPromotionCandidates: simConfigPromotionCandidateReport, virtualHalSimConfigPromotionCandidates: simConfigPromotionCandidateReport,
virtualHalSimConfigMacroLoadFixtures: simConfigMacroLoadFixtureReport,
virtualHalCommandScriptFixtures: commandScriptFixtureReport, virtualHalCommandScriptFixtures: commandScriptFixtureReport,
virtualHalMotionControllerMatrix: manifestCheckedMotionControllerMatrixReport, virtualHalMotionControllerMatrix: manifestCheckedMotionControllerMatrixReport,
}; };
@@ -906,6 +959,8 @@ assert.equal(browserDiagnosticsArtifactValidation.sourceComplianceReady, true);
assert.equal(browserDiagnosticsArtifactValidation.simConfigSourceCoverageReady, true); assert.equal(browserDiagnosticsArtifactValidation.simConfigSourceCoverageReady, true);
assert.equal(browserDiagnosticsArtifactValidation.promotionCandidatesReady, true); assert.equal(browserDiagnosticsArtifactValidation.promotionCandidatesReady, true);
assert.equal(browserDiagnosticsArtifactValidation.hasPromotionCandidates, true); assert.equal(browserDiagnosticsArtifactValidation.hasPromotionCandidates, true);
assert.equal(browserDiagnosticsArtifactValidation.macroLoadFixturesReady, true);
assert.equal(browserDiagnosticsArtifactValidation.hasMacroLoadFixtures, true);
assert.equal(browserDiagnosticsArtifactValidation.commandScriptFixturesReady, true); assert.equal(browserDiagnosticsArtifactValidation.commandScriptFixturesReady, true);
assert.equal(browserDiagnosticsArtifactValidation.motionControllerMatrixReady, true); assert.equal(browserDiagnosticsArtifactValidation.motionControllerMatrixReady, true);
assert.equal(browserDiagnosticsArtifactValidation.hasSessionDiagnostics, true); assert.equal(browserDiagnosticsArtifactValidation.hasSessionDiagnostics, true);
@@ -921,6 +976,9 @@ assert.equal(browserDiagnosticsArtifactValidation.sourceFiles.includes("linuxcnc
assert.equal(browserDiagnosticsArtifactValidation.sourceFiles.includes("linuxcnc/configs/sim/axis/vismach/puma/puma_seam_weld.ngc"), true); assert.equal(browserDiagnosticsArtifactValidation.sourceFiles.includes("linuxcnc/configs/sim/axis/vismach/puma/puma_seam_weld.ngc"), true);
assert.equal(browserDiagnosticsArtifactValidation.sourceFiles.includes("linuxcnc/configs/sim/axis/rose_engine/rose_engine.ini"), true); assert.equal(browserDiagnosticsArtifactValidation.sourceFiles.includes("linuxcnc/configs/sim/axis/rose_engine/rose_engine.ini"), true);
assert.equal(browserDiagnosticsArtifactValidation.sourceFiles.includes("linuxcnc/configs/sim/axis/rose_engine/rcone_demo.ngc"), true); assert.equal(browserDiagnosticsArtifactValidation.sourceFiles.includes("linuxcnc/configs/sim/axis/rose_engine/rcone_demo.ngc"), true);
assert.equal(browserDiagnosticsArtifactValidation.sourceFiles.includes("linuxcnc/configs/sim/axis/rose_engine/rcone.ngc"), true);
assert.equal(browserDiagnosticsArtifactValidation.sourceFiles.includes("linuxcnc/configs/sim/axis/external_offsets/eoffsets.ini"), true);
assert.equal(browserDiagnosticsArtifactValidation.sourceFiles.includes("linuxcnc/configs/sim/axis/external_offsets/eoffsets.ngc"), true);
const runtimeProjectReport = virtualHalRuntime.getProjectReport({ availableFunctions: VIRTUAL_HAL_WASM_BRIDGE_FUNCTIONS }); const runtimeProjectReport = virtualHalRuntime.getProjectReport({ availableFunctions: VIRTUAL_HAL_WASM_BRIDGE_FUNCTIONS });
assert.equal(runtimeProjectReport.simulationRuntime.replacesHostRuntimeForSimulation, true); assert.equal(runtimeProjectReport.simulationRuntime.replacesHostRuntimeForSimulation, true);
assert.equal(runtimeProjectReport.systemCoverage.unclassifiedSnapshotPins.length, 0); assert.equal(runtimeProjectReport.systemCoverage.unclassifiedSnapshotPins.length, 0);

View File

@@ -9,6 +9,7 @@ import {
VIRTUAL_HAL_SIM_CONFIG_SOURCE_TARGETS, VIRTUAL_HAL_SIM_CONFIG_SOURCE_TARGETS,
createVirtualHalCommandScriptFixtureReport, createVirtualHalCommandScriptFixtureReport,
createVirtualHalMotionControllerMatrixReport, createVirtualHalMotionControllerMatrixReport,
createVirtualHalSimConfigMacroLoadFixtureReport,
createVirtualHalSimConfigPromotionCandidateReport, createVirtualHalSimConfigPromotionCandidateReport,
createVirtualHalSimConfigSourceCoverageReport, createVirtualHalSimConfigSourceCoverageReport,
createVirtualHalSimulationReplacementReport, createVirtualHalSimulationReplacementReport,
@@ -1391,6 +1392,16 @@ const browserDiagnosticsArtifact = {
], ],
motionControllerMatrix: releaseReadinessMotionControllerMatrix, motionControllerMatrix: releaseReadinessMotionControllerMatrix,
}), }),
virtualHalSimConfigMacroLoadFixtures: createVirtualHalSimConfigMacroLoadFixtureReport({
manifestEntries: [
...VIRTUAL_HAL_MOTION_MATRIX_MANIFEST_ENTRIES,
"linuxcnc/configs/sim/axis/rose_engine/rose_engine.ini",
"linuxcnc/configs/sim/axis/rose_engine/rcone.ngc",
"linuxcnc/configs/sim/axis/rose_engine/rcone_demo.ngc",
"linuxcnc/configs/sim/axis/external_offsets/eoffsets.ini",
"linuxcnc/configs/sim/axis/external_offsets/eoffsets.ngc",
],
}),
virtualHalCommandScriptFixtures: createVirtualHalCommandScriptFixtureReport({ halState: browserDiagnosticsVirtualHalState }), virtualHalCommandScriptFixtures: createVirtualHalCommandScriptFixtureReport({ halState: browserDiagnosticsVirtualHalState }),
virtualHalMotionControllerMatrix: releaseReadinessMotionControllerMatrix, virtualHalMotionControllerMatrix: releaseReadinessMotionControllerMatrix,
}; };
@@ -1790,6 +1801,8 @@ assert.equal(releaseArtifactUrlWorkflow.validation.ready, true);
assert.equal(releaseArtifactUrlWorkflow.diagnosticsValidation.ready, true); assert.equal(releaseArtifactUrlWorkflow.diagnosticsValidation.ready, true);
assert.equal(releaseArtifactUrlWorkflow.diagnosticsValidation.hasPromotionCandidates, true); assert.equal(releaseArtifactUrlWorkflow.diagnosticsValidation.hasPromotionCandidates, true);
assert.equal(releaseArtifactUrlWorkflow.diagnosticsValidation.promotionCandidatesReady, true); assert.equal(releaseArtifactUrlWorkflow.diagnosticsValidation.promotionCandidatesReady, true);
assert.equal(releaseArtifactUrlWorkflow.diagnosticsValidation.hasMacroLoadFixtures, true);
assert.equal(releaseArtifactUrlWorkflow.diagnosticsValidation.macroLoadFixturesReady, true);
assert.equal(releaseArtifactUrlWorkflow.diagnosticsValidation.hasSessionDiagnostics, true); assert.equal(releaseArtifactUrlWorkflow.diagnosticsValidation.hasSessionDiagnostics, true);
assert.equal(releaseArtifactUrlWorkflow.diagnosticsValidation.sessionDiagnosticsReady, true); assert.equal(releaseArtifactUrlWorkflow.diagnosticsValidation.sessionDiagnosticsReady, true);
assert.equal( assert.equal(