Complete sim config boundary coverage

This commit is contained in:
2026-06-11 06:12:06 +08:00
parent 5bd8f12872
commit 1ab5571ae1
76 changed files with 18975 additions and 146 deletions

View File

@@ -36,6 +36,12 @@ The current WASM sim-config smoke validation command is:
wasm-port/tests/wasm/node/verify_sim_configs_wasm.sh
```
The current WASM sim-config inventory validation command is:
```bash
wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh
```
The current WASM `nc_files` smoke validation command is:
```bash
@@ -92,6 +98,7 @@ running the aggregate host check:
wasm-port/tests/wasm/node/verify_ini_wasm.sh
wasm-port/tests/wasm/node/verify_interp_wasm.sh
wasm-port/tests/wasm/node/verify_sim_configs_wasm.sh
wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh
wasm-port/tests/wasm/node/verify_nc_files_wasm.sh
wasm-port/tests/wasm/node/verify_tp_wasm.sh
wasm-port/tests/opfs/node/verify_file_service.sh
@@ -122,7 +129,278 @@ Layer responsibilities are intentionally narrow:
The current `wasm-port/tests/native/verify_sim_configs.sh` run reports
`total: 159`, `pass: 151`, `expected_fail: 8`, and `unexpected_fail: 0`.
The eight expected failures are:
The eight expected failures are listed in the table below.
The tracked per-program inventory for this layer now lives in
`wasm-port/docs/sim-configs-coverage-matrix.md`. That matrix maps all 159
current `summary.tsv` records to program class, native result, current
Layer 3/4 coverage, and the first-pass blocked or follow-up note used for
future `configs/sim` coverage work.
The native harness also emits machine-readable derived artifacts without
changing the `summary.tsv` schema:
```text
wasm-port/build/native/sim-configs/class-summary.tsv
wasm-port/build/native/sim-configs/path-matrix.tsv
```
`class-summary.tsv` aggregates class/status/expected-failure counts.
`path-matrix.tsv` records each path, class, native status, expected-failure
reason, INI, tool table, runtime family, and blocked kind for CI and Node
inventory reconciliation.
The Node inventory layer writes its own machine-readable artifacts:
```text
wasm-port/build/wasm/sim-configs-inventory/summary.tsv
wasm-port/build/wasm/sim-configs-inventory/skip-summary.tsv
wasm-port/build/wasm/sim-configs-inventory/boundary-summary.tsv
wasm-port/build/wasm/sim-configs-inventory/ini-boundary-summary.tsv
wasm-port/build/wasm/sim-configs-inventory/blocked-dependency-summary.tsv
wasm-port/build/wasm/sim-configs-inventory/full-process-boundary-summary.tsv
wasm-port/build/wasm/sim-configs-inventory/user-m-process-state-targets.tsv
wasm-port/build/wasm/sim-configs-inventory/user-m-process-native-state-alignment.tsv
wasm-port/build/wasm/sim-configs-inventory/tool-db-process-protocol-gates.tsv
wasm-port/build/wasm/sim-configs-inventory/tool-db-process-native-protocol-alignment.tsv
wasm-port/build/wasm/sim-configs-inventory/python-remap-boundary-summary.tsv
wasm-port/build/wasm/sim-configs-inventory/python-remap-runtime-gates.tsv
wasm-port/build/wasm/sim-configs-inventory/python-remap-native-runtime-alignment.tsv
wasm-port/build/wasm/sim-configs-inventory/python-remap-native-runtime-readiness.tsv
wasm-port/build/wasm/sim-configs-inventory/python-remap-native-runtime-state-plan.tsv
wasm-port/build/wasm/sim-configs-inventory/python-remap-native-runtime-fixture-plan.tsv
wasm-port/build/wasm/sim-configs-inventory/python-remap-family-summary.tsv
wasm-port/build/wasm/sim-configs-inventory/boundary-phase-completion-summary.tsv
wasm-port/build/wasm/sim-configs-inventory/native-proof-alignment-summary.tsv
wasm-port/build/wasm/sim-configs-inventory/runtime-boundary-native-alignment-summary.tsv
wasm-port/build/wasm/sim-configs-inventory/blocked-runtime-promotion-lock.tsv
wasm-port/build/wasm/sim-configs-inventory/next-boundary-worklist.tsv
wasm-port/build/wasm/sim-configs-inventory/boundary-proof-gates.tsv
```
The current skip/block summary is `ASSET-ONLY=65`, `L4-PYTHON-REMAP=53`,
`L4-TOOL-DB=1`, `L4-USER-M-PROCESS=1`, `NON_MAIN_CLASS=10`, and
`UPSTREAM-DEMO=1`.
`skip-summary.tsv` is checked against the skip reasons derived from
`path-matrix.tsv`, so both the per-row inventory status and the aggregate
skip counts fail on blocked-policy drift.
For eligible rows, missing vendored machine context is an inventory failure,
not an expected skip; blocked rows must be classified by runtime dependency
before the Node inventory filter runs.
`boundary-summary.tsv` records one row per native inventory path with the
matrix blocked kind, SDK classifier recommendation, declared HAL/UI/HALUI/Python
process dependencies, `[EMCIO]DB_PROGRAM`, user-M execution codes, and the
subset of execution user-M codes that are not staged by vendored
`USER_M_PATH` files. It also separates Python UI/DB process dependencies from
Python remap runtime dependencies. For vendored INI rows, the SDK classifier
report must be available and `L4-TOOL-DB` / `L4-USER-M-PROCESS` hard blocks
must match the classifier recommendation. `recommended_blocked=UNAVAILABLE` is
only allowed when the boundary row records a missing vendored INI. Non-vendored
Python-remap families remain unavailable until their dependency inventory batch
vendors the required INI context.
`ini-boundary-summary.tsv` aggregates those path-level reports by INI, giving
vendored sim-config INIs a direct `report_available=1` coverage check and
recording hard-block recommendation alignment at INI granularity.
The inventory also guards safe representative rows such as
`axis/gladevcp/probe.ngc`, `woodpecker/on_abort.ngc`,
`axis/vismach/puma/puma_cube.ngc`, and
`axis/vismach/melfa-sim/example.ngc`: they must keep their declared process
dependencies in `boundary-summary.tsv`, remain Node/browser representatives,
match the expected HAL/UI/HALUI/Python process flags, and avoid hard-block
promotion unless a real hard runtime dependency appears.
Deterministic `M110`/`M111` representatives are also guarded: the inventory
must see the execution-chain user-M code, a vendored user-M file, and no hard
`L4-USER-M-PROCESS` recommendation. `opa_demo.ngc` includes its vendored
`circles.ngc` subroutine text in the boundary analysis so the `M111` call is
accounted for even though it is reached through `SUBROUTINE_PATH`.
`blocked-dependency-summary.tsv` records the hard blocked rows without
promoting them: 53 Python-remap rows, one tool-database row, and one external
user-M process row. It reads the source `linuxcnc/configs/sim` INI files for
dependency accounting only and records Python modules, remap/prolog/epilog
function ownership, NGC remap subpaths, HAL/UI/HALUI process declarations,
`DB_PROGRAM`, tool database protocol evidence, external user-M execution
codes, user-M process script files, user-M process side-effect evidence, and
the LinuxCNC source/config files that own the blocked behavior. The user-M
evidence is source-derived from the `M128`/`M129` Tcl scripts and records their
Tcl/HAL runtime use, kinstype guard, and `ini.[xyz]` HAL pin updates. The tool
database evidence is source-derived from `taskclass.cc`, `tooldata_db.cc`, and
`axis/db_demo/db.py`, including the `v2.1` handshake, `g`/`FINI` get-all, and
`l`/`u`/`p` notification protocol.
The final Node inventory `summary.tsv` also guards every hard-blocked row:
`L4-TOOL-DB`, `L4-USER-M-PROCESS`, and `L4-PYTHON-REMAP` paths must remain
`SKIP` with their matching blocked reason, not only carry a matrix-level
blocked label.
The detailed boundary design for the current non-Python hard blocks is tracked
in `wasm-port/docs/full-process-boundary-design.md`. That document records the
LinuxCNC owner sets and proof required before `axis/vismach/millturn/example.ngc`
or `axis/db_demo/base.ngc` can move out of `L4-USER-M-PROCESS` or
`L4-TOOL-DB`. It is not an execution artifact and does not change the current
Layer 4 blocked counts.
`full-process-boundary-summary.tsv` is the machine-readable companion for that
design record. It has one designed-but-blocked row for `millturn` and one for
`db_demo`, records the LinuxCNC runtime owner evidence from the corresponding
blocked dependency row, records the required native/Node/browser proof, and
keeps `execution_enabled=0` until the corresponding LinuxCNC-owned runtime
boundary exists. The tracked matrix and inventory guard also require those two
rows to remain non-representative in Node/browser until that proof exists.
`user-m-process-state-targets.tsv` expands the `millturn` M128/M129 process
boundary into per-pin proof targets: two user-M codes, three axes, and four
`ini.[xyz]` HAL pins per axis. Each row records the source Tcl file, remap
caller, kinstype guard, INI source section/field, expected value,
`proof_status=pending`, `execution_enabled=0`, and `promotion_allowed=0`.
`user-m-process-native-state-alignment.tsv` then aligns each generated pin
target with the native source probe stdout key/value pair, for example
`M128_X_AXIS_X.MIN_LIMIT_ok=1`. This catches drift between generated target
rows and the LinuxCNC-owned native source proof without executing Tcl/HAL or
allowing promotion.
`user-m-process-native-transition-alignment.tsv` performs the same source
alignment for the `M428/M429` transition plan. It checks the native probe
stdout for `motion.analog-out-03`, kinstype targets `0` and `1`,
`G59.1`/`G59.2`, `P7`/`P8`, and the `M428 -> M128` / `M429 -> M129` calls.
Those rows also remain `proof_status=pending`, `execution_enabled=0`, and
`promotion_allowed=0`.
`user-m-process-native-runtime-state-plan.tsv` is the runnable native probe
contract that follows those source-alignment tables. It names the required
LinuxCNC task/HAL/Tcl user-M process runtime, the required HAL/INI
environment, and the exact `ini.[xyz].*` state values that a future native
runtime probe must record after `M428` and `M429`. It remains a plan only with
`native_runtime_status=pending_native_hal_tcl_process_probe`,
`execution_enabled=0`, and `promotion_allowed=0`.
`user-m-process-native-runtime-readiness.tsv` is the host capability gate for
that future probe. It records availability of `tclsh`, `halrun`, `halcmd`, and
`linuxcnc`, captures PATH evidence for available commands, and leaves
`proof_status=pending`, `execution_enabled=0`, and `promotion_allowed=0`.
`user-m-process-native-runtime-probe-gate.tsv` combines that readiness with the
source/state proof for `M428/M128` and `M429/M129`. The native
`probe_millturn_user_m_runtime.sh` entry point is wired through
`build_native_probes.sh`; without the full LinuxCNC HAL/Tcl command set it
reports `skipped_missing_host_runtime`, and with the runtime present it remains
disabled by default. When explicitly enabled with
`ENABLE_MILLTURN_USER_M_RUNTIME_PROBE=1`, it starts the vendored `millturn.ini`,
runs the LinuxCNC-owned Tcl `M128`/`M129` scripts, verifies the expected
`ini.[xyz].*` HAL pin state, and reports `runtime_state_probe_passed` without
enabling promotion.
`tool-db-process-protocol-gates.tsv` expands the `db_demo` tool-database
boundary into pending protocol, callback, and state gates. It records the
LinuxCNC `v2.1`, `g`, `l`, `u`, and `p` protocol requirements, the demo DB
callbacks, DB mode state targets such as ignored `TOOL_TABLE`, `T10..T19`,
`tno+100` pockets, and OPFS/host persistence boundaries, while keeping
`proof_status=pending`, `execution_enabled=0`, and `promotion_allowed=0`.
`tool-db-process-native-protocol-alignment.tsv` aligns each generated DB gate
with the native source probe stdout proof keys, including the protocol
handshake, get-all, notifications, callback registration, and nonrandom state
targets. This is still dependency/proof accounting only: it does not spawn
`DB_PROGRAM`, emulate the tool database protocol in JavaScript, or fall back to
a `.tbl` file.
`tool-db-process-native-runtime-readiness.tsv` records the host prerequisites
for the guarded DB process protocol probe: `python3`, `linuxcnc`, `milltask`,
`halcmd`, the configured `db_nonran.py` executable, and LinuxCNC's Python
`linuxcnc.so` / `tooldb.py` modules. It captures availability evidence while
keeping `proof_status=pending`, `execution_enabled=0`, and
`promotion_allowed=0`. When explicitly enabled with
`ENABLE_TOOL_DB_RUNTIME_PROBE=1`, `probe_tool_db_runtime.sh` starts the
vendored `DB_PROGRAM`, drives the LinuxCNC `tooldb.py` `v2.1`/`g`/`p`/`l`/`u`
protocol, verifies nonrandom startup/update/load/unload state and persistence,
and reports `runtime_protocol_probe_passed` without enabling promotion.
`python-remap-boundary-summary.tsv` is the machine-readable companion for the
Python remap inventory batch. It has one inventory-only row for each
`L4-PYTHON-REMAP` path, records Python modules, remap/prolog/epilog functions,
NGC-only subpaths, HAL/UI/HALUI assumptions, LinuxCNC Python runtime owner
evidence from `interp_python.cc` and `python_plugin.cc`, and keeps
`execution_enabled=0` until a LinuxCNC-owned Python runtime boundary exists.
`python-remap-runtime-gates.tsv` expands those rows into Python module,
remap/prolog/epilog callable, NGC-only subpath, process-assumption, and
runtime-owner gates, all with `proof_status=pending`,
`execution_enabled=0`, and `promotion_allowed=0`.
`python-remap-native-runtime-alignment.tsv` aligns every generated Python gate
with native source proof: exact runtime owner gates use keys such as
`python_runtime_pycall_dispatch`, while dependency gates use representative
family inventory proof or the aggregate
`python_remap_native_source_inventory_proof`. It does not initialize Python,
import modules, execute callbacks, or promote browser/Node coverage.
`python-remap-native-runtime-readiness.tsv` records the native runtime
prerequisites for guarded probes by family: `python3`, `linuxcnc`,
LinuxCNC's `interp_python.cc` / `python_plugin.cc` owner source files, and the
configured Python modules. It is a readiness gate only and keeps every row
`proof_status=pending`, `execution_enabled=0`, and `promotion_allowed=0`.
`python-remap-native-runtime-state-plan.tsv` records the next native runtime
probe target set by family: LinuxCNC Python phases, configured modules,
callables, NGC-only subpaths, process assumptions, readiness counts, and
source-alignment artifacts. It remains a plan only and does not initialize
Python, import modules, execute callbacks, or permit promotion.
`python-remap-native-runtime-fixture-plan.tsv` selects the first minimal
Python runtime lifecycle fixture, `axis/remap/stop-lookahead/nc_files`, because
it exercises Python runtime phases and configured modules without Python
callable or NGC-only subpath complexity. It is still a fixture plan only:
`proof_status=pending`, `execution_enabled=0`, and `promotion_allowed=0`.
When explicitly enabled with `ENABLE_PYTHON_REMAP_RUNTIME_PROBE=1`,
`probe_python_remap_runtime.sh` follows the fixture `demo.ini` Python path and
toplevel declarations, imports the vendored modules, verifies `queuebuster`
callable lookup, generator return, and first `INTERP_EXECUTE_FINISH` yield, and
reports `runtime_lifecycle_probe_passed` without promoting Python-remap
execution.
`python-remap-family-summary.tsv` aggregates the same blocked rows by runtime
family, preserving row and INI counts plus family-level Python module,
remap/prolog/epilog, NGC-only subpath, Python runtime owner evidence,
HAL/UI/HALUI, and `execution_enabled=0` evidence. It is dependency inventory
only and must not be used to promote Python-remap execution.
`boundary-phase-completion-summary.tsv` records the current boundary-phase
completion criteria as machine-readable checks: vendored INI boundary report
coverage, hard-block dependency evidence, safe HAL/UI representative coverage,
proof that blocked families remain skipped/non-representative with execution
disabled, and proof that blocked runtime families carry LinuxCNC-owned user-M,
tool DB, and Python runtime evidence fields. It also records native source
proof alignment when the native proof summary is available, plus the aggregate
native stdout alignment summary for user-M, tool DB, and Python runtime gates.
`native-proof-alignment-summary.tsv` aligns native source proof rows with the
generated worklist and native proof gates for user-M, tool DB, and Python
runtime blockers. It is proof-consumption accounting only and keeps execution
and promotion disabled.
`runtime-boundary-native-alignment-summary.tsv` summarizes the three detailed
native alignment artifacts. It requires every alignment row to have native
stdout evidence, `alignment_ok=1`, `proof_status=pending`,
`execution_enabled=0`, and `promotion_allowed=0`.
`blocked-runtime-promotion-lock.tsv` combines the next-boundary worklist,
native/Node/browser proof gates, and runtime native alignment summary into one
promotion lock per blocked runtime target. A lock row is active only while
every proof layer is still pending, execution and promotion remain disabled,
and the matching runtime alignment artifact is complete.
`next-boundary-worklist.tsv` records the next blocked runtime-boundary design
targets in priority order. It starts with the designed-but-disabled
`millturn` external user-M process and `db_demo` tool database process
boundaries, then lists Python runtime families from the inventory. Every row
keeps `execution_enabled=0` and `promotion_allowed=0`, records the LinuxCNC
owner set and runtime owner evidence, records required native, Node, and
browser proof, and names the next boundary-design action before promotion.
`boundary-proof-gates.tsv` expands that worklist into one pending native,
Node, and browser proof gate per target. It is a promotion guard only: current
rows keep `proof_status=pending`, `execution_enabled=0`, and
`promotion_allowed=0`; user-M gates must require HAL pin state rather than
event-only proof, tool-DB gates must require protocol proof rather than a
`.tbl` fallback, and Python gates must require a LinuxCNC-owned Python runtime
boundary rather than JavaScript semantics.
The browser interpreter smoke reads the browser-layer rows from this artifact
before running safe representatives, so `millturn`, `db_demo`, and Python
runtime families cannot be accidentally treated as browser/full-process
coverage while their proof gates remain pending.
Current `configs/sim` class taxonomy:
| Class | Meaning | Current policy |
| --- | --- | --- |
| `main` | A complete standalone-executable sim-config program. | Eligible for native inventory; promote to Layer 3/4 when the required runtime boundary exists. |
| `macro_load` | A macro or load/parse asset that is not the primary machine program entry point. | Keep in native inventory, but do not treat it as a browser main-program target by default. Add class-level load/parse representatives instead of widening browser execution blindly. |
| `remap_subroutine` | A remap or subroutine asset under `remap_subs/` or similar directories. | Validate through remap parse/execute paths, not by pretending it is a standalone browser main program. |
Current `configs/sim` blocked policy:
| Blocked kind | Meaning | Current examples |
| --- | --- | --- |
| `ASSET-ONLY` | The file is a macro/remap asset or subroutine and is not a standalone browser main-program target. | `configs/sim/*/remap_subs/*.ngc` entries in the matrix. |
| `L4-TOOL-DB` | Native LinuxCNC `rs274` coverage exists, but Node/browser inventory is blocked by LinuxCNC tool-database process boundaries such as `[EMCIO]DB_PROGRAM`. | `configs/sim/axis/db_demo/*`. |
| `L4-USER-M-PROCESS` | Native LinuxCNC `rs274` coverage exists, but Node/browser inventory is blocked because the config depends on external `USER_M_PATH` process execution rather than the deterministic `M110`/`M111` boundary already modeled by the standalone runtime. | `configs/sim/axis/vismach/millturn/*`. |
| `L4-PYTHON-REMAP` | Native LinuxCNC `rs274` coverage exists, but full Node/browser inventory is blocked until an intentional Python-remap runtime boundary is exposed for Layer 4. | `configs/sim/gmoccapy/*`, `configs/sim/axis/laser/*`, `configs/sim/axis/remap/*/nc_files/*.ngc`, `configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/demos/*`, and `configs/sim/axis/vismach/VMC_toolchange/toolchange.ngc`. |
| `UPSTREAM-DEMO` | A preserved upstream demo edge that should remain an expected failure instead of being forced through standalone semantics. | `axis/vismach/5axis/table-rotary_spindle-rotary-nutating/demos/incremental_repetition_g533.ngc`. |
| Program | Layer 2 classification | Current Layer 3/4 coverage or boundary |
| --- | --- | --- |
@@ -499,14 +777,15 @@ The validation fails if:
| Harness | Purpose |
| --- | --- |
| `tests/wasm/node/verify_ini_wasm.sh` | Validates the browser-facing INI WASM module can be built from vendored LinuxCNC `inifile.cc`, loaded through the JS SDK in Node, and queried through the exported C ABI, including LinuxCNC-backed boolean conversion and machine-session file-name string lookup. |
| `tests/wasm/node/verify_interp_wasm.sh` | Validates the interpreter-core WASM module can be built from vendored LinuxCNC interpreter/remap source, loaded through the interpreter JS SDK, run the first fixture group through `Interp::execute()` and selected file fixtures plus vendored upstream `tests/interp` regression files through `Interp::open()`/`read()`/`execute()`, match the native canonical event plus required state readback fixtures, emit `run_step` execution-status records with LinuxCNC line number, encoded source statement, return code, and interpreter axis positions for file execution, cover vendored `tests/interp/flowsnake` recursive O-word file execution, `tests/interp/g6164` path-control and naive-cam tolerance execution, `tests/interp/oword-unwind` continue-on-error stack unwind behavior through planner-staged INI context, selected `tests/interp/bad` file-error paths, and `tests/interp/g33.1` rigid-tap file execution, run vendored `xyzac-trt`/`xyzbc-trt` switchkins remap demo files through the WASM C ABI/SDK path, and run parameter-file restore/save through vendored LinuxCNC `Interp::restore_parameters()` and `Interp::save_parameters()`. |
| `tests/wasm/node/verify_sim_configs_wasm.sh` | Validates representative vendored LinuxCNC `configs/sim` programs in Node WASM through `planSimConfigStaging()` plus `runSimConfigProgram()`. The generic `planIniFileContextStaging()` planner and its sim-config wrapper use INI text and `tools/source-manifest.txt` to collect the program, INI, tool table, parameter file when vendored, `SUBROUTINE_PATH` files, `USER_M_PATH` files, and remap-NGC files before forwarding to `runFileWithIni()` or `runFiveAxisRemapFile()`. This covers INI-driven `U/V/W` axis mask handling, real `USER_M_PATH` registration for executable `M110`/`M111`, all four current external-offset M111 expected-failure programs, `SUBROUTINE_PATH` staging for `opa_demo.ngc -> circles.ngc`, bridge-mill remap-subroutine staging, and vendored LinuxCNC bridge-mill NGC remap execution without spawning host processes. The same smoke includes synthetic staging-plan assertions for generic `TOOL_TABLE`, `PARAMETER_FILE`, multi-directory `SUBROUTINE_PATH`, `USER_M_PATH`, and `REMAP ... ngc=...` file collection. |
| `tests/wasm/node/verify_interp_wasm.sh` | Validates the interpreter-core WASM module can be built from vendored LinuxCNC interpreter/remap source, loaded through the interpreter JS SDK, run the first fixture group through `Interp::execute()` and selected file fixtures plus vendored upstream `tests/interp` regression files through `Interp::open()`/`read()`/`execute()`, match the native canonical event plus required state readback fixtures, emit `run_step` execution-status records with LinuxCNC line number, encoded source statement, return code, and interpreter axis positions for file execution, cover vendored `tests/interp/flowsnake` recursive O-word file execution, `tests/interp/g6164` path-control and naive-cam tolerance execution, `tests/interp/oword-unwind` continue-on-error stack unwind behavior through planner-staged INI context, selected `tests/interp/bad` file-error paths, and `tests/interp/g33.1` rigid-tap file execution, run vendored `xyzac-trt`/`xyzbc-trt` table-rotary-tilting and `xyzab-tdr` table-dual-rotary switchkins remap demo files through the WASM C ABI/SDK path, and run parameter-file restore/save through vendored LinuxCNC `Interp::restore_parameters()` and `Interp::save_parameters()`. |
| `tests/wasm/node/verify_sim_configs_wasm.sh` | Validates representative vendored LinuxCNC `configs/sim` programs in Node WASM through `planSimConfigStaging()` plus `runSimConfigProgram()`. The generic `planIniFileContextStaging()` planner and its sim-config wrapper use INI text and `tools/source-manifest.txt` to collect the program, INI, tool table, parameter file when vendored, `SUBROUTINE_PATH` files, `USER_M_PATH` files, and remap-NGC files before forwarding to `runFileWithIni()` or `runFiveAxisRemapFile()`. This covers INI-driven `U/V/W` axis mask handling, real `USER_M_PATH` registration for executable `M110`/`M111`, all four current external-offset M111 expected-failure programs, deterministic `woodpecker/on_abort.ngc` file execution, plain INI/tool-table execution through `axis/gladevcp/probe.ngc`, `SUBROUTINE_PATH` staging for `opa_demo.ngc -> circles.ngc`, bridge-mill remap-subroutine staging, vendored LinuxCNC bridge-mill and `melfa-sim` NGC remap execution, and PUMA machine-context execution without spawning host processes. The same smoke includes synthetic staging-plan assertions for generic `TOOL_TABLE`, `PARAMETER_FILE`, multi-directory `SUBROUTINE_PATH`, `USER_M_PATH`, and `REMAP ... ngc=...` file collection. |
| `tests/wasm/node/verify_sim_configs_inventory_wasm.sh` | Validates the first machine-readable Node inventory layer for `configs/sim`. It ensures native `build/native/sim-configs/summary.tsv`, generated `class-summary.tsv`, and generated `path-matrix.tsv` exist; verifies that generated `path-matrix.tsv` and tracked `docs/sim-configs-coverage-matrix.md` contain the same 159 paths as native `summary.tsv`; checks tracked matrix fields for class, native status, expected-failure reason, and blocked kind drift against generated `path-matrix.tsv`; and checks that generated `class-summary.tsv` matches class/status/expected-failure counts derived from `summary.tsv`. It then executes only entries that are currently vendored and have a defined standalone/WASM runtime path, and writes the sim-config inventory TSV artifacts. The boundary summary records one row per native inventory path with the matrix block, SDK classifier recommendation, declared HAL/UI/HALUI/Python process dependencies, `[EMCIO]DB_PROGRAM`, and execution-chain user-M codes; vendored INI rows must have an available classifier report, vendored hard blocks fail on classifier/matrix drift, safe process-declaring representatives must remain Node/browser `REP` rows with the expected process flag combinations rather than full-process promotions, and the designed full-process blocked rows must remain non-`REP` until their proof criteria are met. The generated inventory summary also requires all hard-blocked rows to remain `SKIP` with matching reasons, and `skip-summary.tsv` must match the matrix-derived skip counts. The blocked-dependency and boundary summaries record hard blocked Python-remap, tool-database, and external user-M rows from source `linuxcnc/configs/sim` INI files for dependency accounting only, including LinuxCNC source/config ownership fields, user-M script side effects, tool DB protocol evidence, Python runtime owner evidence, and completion criteria that all remain non-executing. Current gate: `executed=28`, `passed=28`, `skipped=131`, `unexpected_fail=0`; current skip/block counts are `ASSET_ONLY=65`, `L4_PYTHON_REMAP=53`, `L4_TOOL_DB=1`, `L4_USER_M_PROCESS=1`, `NON_MAIN_CLASS=10`, and `UPSTREAM_DEMO=1`. The executed set now includes the deterministic `woodpecker` plus `qtdragon` / `qtdragon_hd` / `qtvcp_screens` `on_abort.ngc` family, `axis/gladevcp/probe.ngc`, `axis/rose_engine/rcone_demo.ngc`, `axis/vismach/melfa-sim/example.ngc`, and the `axis/vismach/puma` sample programs after vendoring the required machine INI, tool-table, and remap-subroutine inputs. When an upstream INI declares a missing local tool table but the native harness resolved a valid fallback table, the Node inventory stages that native-selected table at the INI-declared path so WASM execution uses the same machine context. The skip reasons are explicit: `NON_MAIN_CLASS`, `L4-TOOL-DB`, `L4-USER-M-PROCESS`, `L4-PYTHON-REMAP`, and `UPSTREAM-DEMO`; an eligible row that lacks vendored machine context is reported as an inventory failure. This runner is an inventory source-of-truth for Node WASM and is intentionally narrower than a browser full inventory. |
| `tests/wasm/node/verify_nc_files_wasm.sh` | Validates representative vendored LinuxCNC `nc_files` examples in Node WASM by copying `3D_Chips.ngc`, `arcspiral.ngc`, `hole-circle.ngc`, `factorial.ngc`, and `m6demo.ngc` into the Emscripten filesystem and forwarding to the LinuxCNC-backed `Interp::open()`/`read()`/`execute()` path. `3D_Chips.ngc` is staged with a minimal INI-declared `tool.tbl` because the upstream program contains `T1 M6`; JavaScript only stages files and checks LinuxCNC output, including `run_step` status records, and does not implement G-code, O-word, tool-change, or M-code behavior. |
| `tests/wasm/node/verify_tp_wasm.sh` | Validates a standalone trajectory-planner WASM module can be built from vendored LinuxCNC TP/TC/Ruckig support source, loaded in Node, and run the same linear, arc, and queued-line planner probe paths covered by the native TP harness. |
| `tests/opfs/node/verify_file_service.sh` | Validates the host-owned OPFS text-file adapter, path model, session snapshot store including custom filenames and envelope/path rejection paths, machine file store, G-code text store including filename rejection paths, OPFS-to-WASM parameter/tool-table bridges, and grouped machine-session loading without moving file persistence, parameter semantics, or tool-table semantics into the WASM core. |
| `tests/browser/verify_ini_panel_browser.sh` | Validates the INI SDK, INI/interpreter WASM module loading, LinuxCNC-backed INI machine-session file-name string lookup, OPFS text-file round trip, generic session snapshot round trip plus custom filename and envelope/path rejection paths, machine file text round trip, G-code text round trip plus filename rejection paths, and the INI panel UI's machine-session load with default OPFS parameter/tool-table file mapping, G-code run, `run_step`-backed progress/line/statement/axis display, canonical-event display paths, and 5-axis remap demo action in a real browser runtime. |
| `tests/browser/verify_interp_browser.sh` | Validates the interpreter-core WASM module loads through the interpreter JS SDK in a real browser runtime and runs selected positive and negative canonical fixtures plus vendored upstream `tests/interp` regression files through vendored LinuxCNC `Interp::execute()` and `Interp::open()`/`read()`/`execute()` via the exported C ABI, including direct browser SDK and OPFS-backed parameter-file restore/save, non-random/random tool-table load/save through vendored LinuxCNC source, vendored `xyzac-trt`/`xyzbc-trt` switchkins remap demo execution, representative vendored `configs/sim` `foam`, `geometry`, `external_offsets`, and bridge-mill programs through `runSimConfigProgram()`, representative vendored `nc_files` examples through `runFile()` or `runFileWithIni()` when the upstream file requires INI/tool-table context, and a synthetic browser assertion that `planIniFileContextStaging()` can collect INI, program, tool-table, parameter, multi-directory subroutine, executable user-M, and remap-NGC files using only manifest text. |
| `tests/host/verify_host_smokes.sh` | Runs the current host-side Node, WASM interpreter-core, WASM trajectory-planner, OPFS, and browser smoke validation with shared WASM builds. |
| `tests/browser/verify_interp_browser.sh` | Validates the interpreter-core WASM module loads through the interpreter JS SDK in a real browser runtime and runs selected positive and negative canonical fixtures plus vendored upstream `tests/interp` regression files through vendored LinuxCNC `Interp::execute()` and `Interp::open()`/`read()`/`execute()` via the exported C ABI, including direct browser SDK and OPFS-backed parameter-file restore/save, non-random/random tool-table load/save through vendored LinuxCNC source, vendored `xyzac-trt`/`xyzbc-trt` table-rotary-tilting and `xyzab-tdr` table-dual-rotary switchkins remap demo execution, representative vendored `configs/sim` `foam`, `geometry`, `external_offsets`, `axis/gladevcp/probe.ngc`, deterministic `woodpecker/on_abort.ngc`, bridge-mill, `melfa-sim`, and `puma_cube.ngc` programs through `runSimConfigProgram()`, representative vendored `nc_files` examples through `runFile()` or `runFileWithIni()` when the upstream file requires INI/tool-table context, and a synthetic browser assertion that `planIniFileContextStaging()` can collect INI, program, tool-table, parameter, multi-directory subroutine, executable user-M, and remap-NGC files using only manifest text. |
| `tests/host/verify_host_smokes.sh` | Runs the current host-side Node, WASM interpreter-core, sim-config representative smoke, sim-config Node inventory, WASM trajectory-planner, OPFS, and browser smoke validation with shared WASM builds. |
## Fixture Coverage

View File

@@ -0,0 +1,513 @@
# Full-Process Runtime Boundary Design
Generated: 2026-06-10 CST
This document records the first design pass for `configs/sim` rows that are
already classified by the Node inventory, but must remain blocked until a
LinuxCNC-owned runtime boundary exists. It is a design and accounting artifact,
not an execution path.
## Scope
- `axis/vismach/millturn/example.ngc`, currently `L4-USER-M-PROCESS`.
- `axis/db_demo/base.ngc`, currently `L4-TOOL-DB`.
- Python-remap and broader full-process families remain inventoried in
`build/wasm/sim-configs-inventory/blocked-dependency-summary.tsv`; they are
not promoted here.
## Non-Goals
- Do not implement HAL, task, HALUI, Tcl, Python, tool-database, or external
process semantics in JavaScript.
- Do not make blocked rows pass by editing upstream G-code, Tcl, Python, INI,
or tool-table files.
- Do not treat native GUI code or config helper scripts as browser UI
implementation code.
- Do not mark a row unblocked until native, Node, and browser validation prove
the boundary where that layer is applicable.
## External User-M Process Boundary
### Current Block
`axis/vismach/millturn/example.ngc` is blocked because
`millturn.ini` declares:
- `[RS274NGC]USER_M_PATH = ./mcodes`;
- `REMAP = M428 ... ngc=428remap`;
- `REMAP = M429 ... ngc=429remap`;
- `[HAL]HALUI = halui`, `HALFILE`, `HALCMD`, and `POSTGUI_HALFILE`;
- `[HALUI]MDI_COMMAND = M128` and `M129`;
- `[DISPLAY]PYVCP = millturn.xml`.
The promoted execution chain reaches `remap_subs/428remap.ngc` and
`remap_subs/429remap.ngc`. Those LinuxCNC NGC remaps execute `M68`/`M66`
switchkins synchronization and then call external user-M process codes
`M128` or `M129`.
### LinuxCNC Owner Set
- `configs/sim/axis/vismach/millturn/millturn.ini` owns the machine
declarations and search paths.
- `configs/sim/axis/vismach/millturn/remap_subs/428remap.ngc` and
`429remap.ngc` own the NGC remap call sequence around `M128` and `M129`.
- `configs/sim/axis/vismach/millturn/mcodes/M128` and
`configs/sim/axis/vismach/millturn/mcodes/M129` own the config side effects.
- `src/emc/task/emctask.cc` owns `USER_M_PATH` search, executable detection,
`USER_DEFINED_FUNCTION_ADD()`, and queuing `EMC_SYSTEM_CMD`.
- `src/emc/task/emctaskmain.cc` owns `emcSystemCmd()` process spawning and
completion tracking for queued system commands.
- `src/emc/usr_intf/halui.cc` owns HALUI MDI command queue behavior.
- The HAL runtime owns `hal getp`/`hal setp` state, including the `ini.*`
soft-limit pins used by the scripts.
### Native Behavior To Preserve
`M128` is a Tcl process script that:
- requires the LinuxCNC and HAL Tcl packages;
- calls `emc_init -quick`;
- calls `parse_ini $::env(INI_FILE_NAME)`;
- checks `hal getp kinstype.is-0`;
- writes mill limits from `[AXIS_X]`, `[AXIS_Y]`, and `[AXIS_Z]` into
`ini.x.*`, `ini.y.*`, and `ini.z.*` HAL pins.
`M129` follows the same process path, but checks `kinstype.is-1` and writes the
`MIN_LIMIT_TURN` / `MAX_LIMIT_TURN` values for X, Y, and Z. Both scripts also
restore `MAX_VELOCITY` and `MAX_ACCELERATION`.
The NGC remap files own the surrounding interpreter-visible work:
- set `motion.analog-out-03` through `M68`;
- force synchronization with `M66`;
- set G5x offsets with `G10 L2 P7` or `G10 L2 P8`;
- activate `G59.1` or `G59.2`;
- verify `_hal[motion.switchkins-type]` after the switch.
### Boundary Decision
This is not the same boundary as the existing deterministic `M110`/`M111`
registration adapter. `M110` and `M111` can currently be represented as
deterministic `USER_M_COMMAND` canonical events because the promoted tests only
need the interpreter to accept and queue the user-M command. `M128` and `M129`
must also prove HAL pin state updates that affect soft limits after a
kinematics switch.
The row therefore remains `L4-USER-M-PROCESS`.
### Current Machine-Readable Artifact
`user-m-process-boundary-summary.tsv` records the current designed-but-blocked
state target set for this boundary. It maps `M128` to
`remap_subs/428remap.ngc` and `M129` to `remap_subs/429remap.ngc`, records the
`kinstype.is-0` and `kinstype.is-1` guards, and expands the source-traceable
`ini.[xyz].min_limit`, `ini.[xyz].max_limit`, `ini.[xyz].min_velocity`, and
`ini.[xyz].max_acceleration` target pins from `millturn.ini`.
`user-m-process-state-targets.tsv` is the normalized companion table for that
same evidence. It has one pending proof row per `M128`/`M129` target pin,
including the config script source file, remap caller, mill/turn state mode,
guard pin, source INI section/field, and expected value. The current table has
24 target rows plus a header and keeps `proof_status=pending`,
`execution_enabled=0`, and `promotion_allowed=0`.
`user-m-process-transition-plan.tsv` records the next non-executing contract
for this boundary. It binds `M428` to `M128` and `M429` to `M129`, records the
`motion.analog-out-03` switchkins output, target kinstype values `0` and `1`,
the active `G59.1`/`G59.2` work offsets, `P7`/`P8` offset pockets, guard pins,
and the 12 expected `ini.[xyz].*` state outputs for each user-M code. This is
still a pending transition contract only; it does not execute Tcl, start HAL,
or permit standalone/browser promotion.
`user-m-process-native-state-alignment.tsv` aligns those 24 generated target
rows with the native source probe stdout keys, such as
`M128_X_AXIS_X.MIN_LIMIT_ok` and `M129_Z_AXIS_Z.MAX_LIMIT_TURN_ok`. This table
proves the generated pin targets still match the native LinuxCNC source/state
probe output, but it also remains `proof_status=pending`,
`execution_enabled=0`, and `promotion_allowed=0`.
`user-m-process-native-transition-alignment.tsv` aligns the two generated
transition-plan rows with native source probe stdout for `M428` and `M429`.
It verifies the source-owned `motion.analog-out-03` switchkins output, target
kinstype values `0` and `1`, active `G59.1`/`G59.2` offsets, `P7`/`P8`
offset pockets, and `M428 -> M128` / `M429 -> M129` process calls. This is
still source-transition alignment only; it does not execute the Tcl user-M
processes, start HAL, or allow promotion.
`user-m-process-native-runtime-state-plan.tsv` is the next native runnable
probe contract. It records the required LinuxCNC task/HAL/Tcl user-M runtime,
the required environment (`INI_FILE_NAME`, `motion.switchkins-type`,
`kinstype.is-0`, `kinstype.is-1`, and `ini.[xyz].*` pins), the two transition
steps, and the exact expected `ini.[xyz].*` values after each user-M process.
It requires the source transition/state alignment artifacts to be complete, but
keeps `native_runtime_status=pending_native_hal_tcl_process_probe`,
`proof_status=pending`, `execution_enabled=0`, and `promotion_allowed=0`.
`user-m-process-native-runtime-readiness.tsv` records whether the host has the
runtime commands needed to attempt that native probe. It currently checks
`tclsh`, `halrun`, `halcmd`, and `linuxcnc`, records PATH evidence where a
command exists, and keeps the boundary blocked with `proof_status=pending`,
`execution_enabled=0`, and `promotion_allowed=0` even if the commands become
available.
`user-m-process-native-runtime-probe-gate.tsv` is the generated execution gate
for the future runtime probe. It combines source proof readiness with host
runtime readiness for `M428/M128` and `M429/M129`, records missing runtime
commands, and keeps `proof_status=pending`, `execution_enabled=0`, and
`promotion_allowed=0`.
`tests/native/probe_millturn_user_m_runtime.sh` is wired into
`build_native_probes.sh` as `linuxcnc_millturn_user_m_runtime_probe`. On hosts
without `halrun`, `halcmd`, or `linuxcnc`, it exits successfully but reports
`millturn_user_m_runtime_probe_status=skipped_missing_host_runtime`; on a host
with the full LinuxCNC runtime it remains disabled by default. If explicitly
enabled with `ENABLE_MILLTURN_USER_M_RUNTIME_PROBE=1`, it starts the vendored
`millturn.ini`, runs the LinuxCNC-owned Tcl `M128`/`M129` scripts, and verifies
the resulting `ini.[xyz].*` HAL state targets before reporting
`runtime_state_probe_passed`.
The artifact keeps `execution_enabled=0` and `promotion_allowed=0`. It is not
a standalone Tcl/HAL executor and does not make `millturn` a Node/browser
representative.
`linuxcnc_millturn_user_m_boundary_probe` is the current native guard for this
evidence. It reads the LinuxCNC source `millturn.ini`, `mcodes/M128`,
`mcodes/M129`, and the `428remap`/`429remap` callers, then verifies the
source-derived guard pins, `M428`/`M429` switchkins transition fields, and
`ini.[xyz].*` target values recorded in the machine-readable tables. This is a
source/state-target and source-transition proof only: it does not execute Tcl,
start HAL, spawn the external user-M process, or permit promotion.
### Candidate Boundary
A valid future boundary would have to be LinuxCNC-owned and state based:
1. Reuse LinuxCNC task user-M search and registration behavior for discovering
`M128` and `M129`.
2. Reuse a LinuxCNC-owned HAL/INI state boundary for the `ini.x.*`,
`ini.y.*`, `ini.z.*`, `kinstype.is-*`, and `motion.switchkins-type` pins.
3. Execute or faithfully host the config-owned side-effect source without
translating it into JavaScript CNC semantics. If the Tcl scripts cannot be
executed in the target layer, the boundary must be narrowed to a documented
LinuxCNC-owned state transition with source-traceable inputs and outputs.
4. Keep browser execution blocked unless the same state transition can be
proven without spawning arbitrary host processes.
### Required Proof Before Promotion
Native proof:
- The existing `linuxcnc_millturn_user_m_boundary_probe` source/state guard
must continue to prove that the pending M128/M129 state targets come from
LinuxCNC config files rather than project-owned behavior.
- A LinuxCNC or standalone-native probe runs the `M428 -> M129 -> M429 -> M128`
relevant switch path and records the `ini.[xyz].min_limit`,
`ini.[xyz].max_limit`, `ini.[xyz].min_velocity`, and
`ini.[xyz].max_acceleration` pin values before and after each user-M call.
- The same probe records the kinstype guard result and the active G5x offset.
Node WASM proof:
- The SDK stages the same INI, remap, and script assets for dependency
accounting.
- The WASM runtime proves the same state output through a LinuxCNC-owned
boundary. A `USER_M_COMMAND` event alone is not sufficient.
Browser proof:
- The browser smoke calls the already validated SDK/WASM boundary.
- The test labels the row as a millturn process-boundary representative only
after the state proof exists. It must not claim full LinuxCNC HAL/task/UI
process coverage.
## Tool Database Boundary
### Current Block
`axis/db_demo/base.ngc` is blocked because `db_nonran.ini` declares:
```text
[EMCIO]
RANDOM_TOOLCHANGER = 0
DB_PROGRAM = ./db_nonran.py
```
The INI explicitly notes that `TOOL_TABLE` is not used with `DB_PROGRAM`.
Standalone interpreter file execution would therefore bypass the tool database
startup, command/reply protocol, and persistent database state.
### LinuxCNC Owner Set
- `configs/sim/axis/db_demo/db_nonran.ini` owns the DB program declaration.
- `configs/sim/axis/db_demo/db.py` owns the demo database behavior.
- `src/emc/task/taskclass.cc` owns reading `[EMCIO]DB_PROGRAM`, enabling DB
mode, calling `tooldata_db_init()`, loading tooldata, and notifying DB state
changes during tool load/unload paths.
- `src/emc/tooldata/tooldata_db.cc` owns child process startup, pipe setup,
version handshake, `g` get-all requests, and `l`/`u`/`p` notifications.
- `src/emc/tooldata/tooldata_common.cc` owns common tooldata storage and DB
refresh behavior.
### Native Behavior To Preserve
`tooldata_db_init()` splits `DB_PROGRAM` into argv, verifies that the program is
executable, forks it, connects stdin/stdout pipes, and waits for the version
reply `v2.1`. `tooldata_db_getall()` sends `g`, resets local tooldata, reads
tool lines until `FINI`, and calls `tooldata_read_entry()` for each line.
`tooldata_db_notify()` sends:
- `l ...` for `SPINDLE_LOAD`;
- `u ...` for `SPINDLE_UNLOAD`;
- `p ...` for `TOOL_OFFSET`.
The demo `db.py` uses LinuxCNC's `tooldb` module with callbacks for:
- `user_get_tool`;
- `user_put_tool`;
- `user_load_spindle_nonran_tc` or `user_load_spindle_ran_tc`;
- `user_unload_spindle_nonran_tc` or `user_unload_spindle_ran_tc`.
It maintains a persistent flat-file database, updates tool usage minutes, and
can call `linuxcnc.command().load_tool_table` to synchronize changes back to
LinuxCNC. Those details are DB process behavior, not interpreter file
execution behavior.
### Boundary Decision
This row remains `L4-TOOL-DB`. A standalone adapter that merely loads a
fallback `.tbl` file would be wrong for this config because DB mode explicitly
replaces the tool table file path.
### Current Machine-Readable Artifact
`tool-db-process-boundary-summary.tsv` records the current designed-but-blocked
protocol and state target set for this boundary. It records `DB_PROGRAM =
./db_nonran.py`, the LinuxCNC tooldata protocol messages `v2.1`, `g`, `l`, `u`,
and `p`, the demo DB callbacks `user_get_tool`, `user_put_tool`,
`user_load_spindle_nonran_tc`, and `user_unload_spindle_nonran_tc`, and the
nonrandom database state targets such as `T10..T19`, `/tmp/db_nonran_file`,
`tno+100` startup pockets, and pocket-0 spindle load/unload behavior.
`tool-db-process-protocol-gates.tsv` is the normalized companion table for
that evidence. It splits the blocked DB boundary into pending protocol-message,
DB-program-callback, and state-target gates, including the `v2.1` startup
reply, `g` get-all through `FINI`, `l`/`u`/`p` notifications, demo callback
registration, ignored `TOOL_TABLE`, startup tools, nonrandom pocket mapping,
and persistence/sync targets. The current table keeps `proof_status=pending`,
`execution_enabled=0`, and `promotion_allowed=0`.
`tool-db-process-transaction-plan.tsv` records the next non-executing contract
for this boundary. It orders the pending DB protocol into startup handshake,
initial get-all, spindle load notify, tool offset notify, and spindle unload
notify steps. Each step binds one LinuxCNC protocol message to the expected
`db.py` callback, required native/Node/browser proof, and source-traceable
state targets. This is still a transaction contract only; it does not start
`DB_PROGRAM`, run Python, mutate `/tmp/db_nonran_file`, fall back to a tool
table, or permit standalone/browser promotion.
`tool-db-process-native-protocol-alignment.tsv` aligns those generated gates
with the native source probe stdout keys, such as `tool_db_v2_1_handshake`,
`tool_db_getall_g_until_fini`, `tool_db_notify_l_u_p_protocol`, and
`tool_db_program_nonran_state_targets`. This table proves the generated gates
still match LinuxCNC-owned task/tooldata/config evidence, but it also remains
`proof_status=pending`, `execution_enabled=0`, and `promotion_allowed=0`.
`tool-db-process-native-runtime-readiness.tsv` records whether the host has
the runtime pieces needed to attempt a DB process protocol probe. It checks
`python3`, `linuxcnc`, `milltask`, `halcmd`, the configured
`axis/db_demo/db_nonran.py` program, and the LinuxCNC Python `linuxcnc.so` and
`tooldb.py` modules. It records PATH/source evidence where available and keeps
the DB boundary blocked with `proof_status=pending`, `execution_enabled=0`,
and `promotion_allowed=0`.
`tests/native/probe_tool_db_runtime.sh` is wired into `build_native_probes.sh`
as `linuxcnc_tool_db_runtime_probe`. On hosts without the required DB runtime
commands it exits successfully with `tool_db_runtime_probe_status =
skipped_missing_host_runtime`; on a ready host it remains disabled by default.
If explicitly enabled with `ENABLE_TOOL_DB_RUNTIME_PROBE=1`, it starts the
vendored `DB_PROGRAM`, drives the LinuxCNC `tooldb.py` `v2.1`/`g`/`p`/`l`/`u`
protocol over stdin/stdout, verifies nonrandom `T10..T19` startup state, tool
update, spindle load/unload, and flat-file persistence, then reports
`runtime_protocol_probe_passed`.
The artifact keeps `execution_enabled=0` and `promotion_allowed=0`. It is not
a standalone tool database executor, does not replace `DB_PROGRAM` with a
fallback `.tbl`, and does not make `axis/db_demo/base.ngc` a Node/browser
representative.
`linuxcnc_tool_db_boundary_probe` is the current native guard for this
evidence. It reads the LinuxCNC source `db_nonran.ini`, `db.py`,
`src/emc/task/taskclass.cc`, and `src/emc/tooldata/tooldata_db.cc`, then
verifies the DB mode owner path, child-process protocol, `v2.1` startup
handshake, `g`/`FINI` get-all path, `l`/`u`/`p` notifications, demo DB
callbacks, and nonrandom state targets. This is a source/protocol-target proof
only: it does not start `DB_PROGRAM`, run the Python tooldb loop, mutate the
flat-file database, or permit promotion.
### Candidate Boundary
A valid future boundary should be a narrow tool-database host adapter:
1. Reuse `tooldata_db.cc` and `tooldata_common.cc` for DB mode behavior.
2. Isolate the process-spawn edge behind a host abstraction so native can spawn
the configured DB program, while WASM/browser use an explicitly designed
equivalent only if it preserves the LinuxCNC protocol.
3. Preserve the `v2.1`, `g`, `l`, `u`, and `p` command/reply protocol rather
than parsing or inventing tool semantics in JavaScript.
4. Treat `db.py` as a config-owned process dependency. If it is not executable
in a target layer, that layer remains blocked.
### Required Proof Before Promotion
Native proof:
- The existing `linuxcnc_tool_db_boundary_probe` source/protocol guard must
continue to prove that the pending DB gates come from LinuxCNC task/tooldata
and demo DB sources rather than project-owned behavior.
- A probe starts `db_nonran.py` through the LinuxCNC DB path and verifies the
`v2.1` handshake.
- A get-all request returns the expected nonrandom startup tools.
- A load/unload or update path changes DB state through `l`, `u`, or `p` and
is reflected by a subsequent get-all.
Node WASM proof:
- The same protocol is visible through the SDK boundary.
- Tool lookup/update behavior matches the native proof without staging a fake
`.tbl` replacement.
Browser proof:
- Browser validation calls the Node-proven SDK/WASM boundary.
- OPFS may store DB files only as host persistence. It must not implement DB
command semantics.
## Python-Remap Inventory Boundary
Python-remap rows remain inventory-only. The current
`blocked-dependency-summary.tsv` records Python modules, remap/prolog/epilog
functions, NGC-only subpaths, and HAL/UI/HALUI declarations.
`python-remap-boundary-summary.tsv` preserves the same evidence per blocked
path and records LinuxCNC Python runtime owner evidence from
`src/emc/rs274ngc/interp_python.cc` and
`src/emc/pythonplugin/python_plugin.cc`. `python-remap-family-summary.tsv`
aggregates it by runtime family so mixed Python/NGC-only subpaths remain
visible without promoting execution. No Python-remap row should be promoted
until a separate LinuxCNC-owned Python runtime boundary exists and has native
plus Node/browser proof appropriate to the target layer.
`python-remap-runtime-gates.tsv` expands each blocked path into Python module,
remap/prolog/epilog callable, NGC-only subpath, process-assumption, and
runtime-owner gates. `python-remap-native-runtime-alignment.tsv` aligns those
generated gates with the current native source probe stdout. Runtime owner
gates map to exact LinuxCNC runtime proof keys such as
`python_runtime_pycall_dispatch` and `python_plugin_callable_invoke`; dependency
inventory gates map to representative family inventory proof or the aggregate
`python_remap_native_source_inventory_proof`. Both tables remain
`proof_status=pending`, `execution_enabled=0`, and `promotion_allowed=0`.
`python-remap-runtime-contract.tsv` records the next non-executing family-level
contract. It keeps one row per blocked Python-remap family, records the
LinuxCNC-owned Python runtime phases (`initialize_python`,
`apply_ini_python_path`, `execute_toplevel`, callable lookup/invoke,
remap-phase dispatch, generator finish, execute-string/file, and reload),
aggregates Python modules/callables/NGC-only subpaths, carries HAL/UI/HALUI
process assumptions, and binds each family to native, Node, and browser proof
requirements. It is a runtime contract only: it does not initialize Python,
import modules, execute callbacks, or permit promotion.
`python-remap-native-runtime-readiness.tsv` records the current host/source
readiness for future native Python-remap runtime probes. It checks `python3`,
`linuxcnc`, the LinuxCNC interpreter/plugin owner source files, and each
configured Python module by blocked runtime family. The artifact remains a
gate only: every row stays `proof_status=pending`, `execution_enabled=0`, and
`promotion_allowed=0`.
`python-remap-native-runtime-state-plan.tsv` records the non-executing runtime
state plan for those future probes. It binds each blocked Python-remap family
to the required LinuxCNC Python phases, configured modules, callables,
NGC-only subpaths, process assumptions, readiness counts, source-alignment
artifacts, and future native proof targets. It does not initialize Python,
import modules, execute callbacks, or permit promotion.
`python-remap-native-runtime-fixture-plan.tsv` selects the first native runtime
fixture target, `axis/remap/stop-lookahead/nc_files`. That family is the
smallest current Python runtime lifecycle candidate because it needs the
LinuxCNC Python initialization/path/toplevel/runtime phases and configured
modules but avoids Python callable and NGC-only subpath complexity. The
fixture plan is still non-executing: it records the proof target only and
keeps `proof_status=pending`, `execution_enabled=0`, and
`promotion_allowed=0`.
`tests/native/probe_python_remap_runtime.sh` is wired into
`build_native_probes.sh` as `linuxcnc_python_remap_runtime_probe`. It records
the stop-lookahead fixture identity, configured Python modules, required
LinuxCNC Python runtime phases, host command readiness, and source/module
availability. On hosts without `linuxcnc`, it exits successfully but reports
`python_remap_runtime_probe_status=skipped_missing_host_runtime`; on hosts with
the runtime available it remains disabled by default. If explicitly enabled
with `ENABLE_PYTHON_REMAP_RUNTIME_PROBE=1`, it follows the `demo.ini`
`[PYTHON]` path/toplevel declarations, imports the vendored stop-lookahead
modules, verifies `queuebuster` callable lookup, confirms the callable returns
a generator, and checks that the first yield is the LinuxCNC
`INTERP_EXECUTE_FINISH` value from `interp_return.hh` before reporting
`runtime_lifecycle_probe_passed`.
`linuxcnc_python_remap_boundary_probe` is the current native guard for this
inventory. It reads the LinuxCNC Python runtime owners and representative
config families (`axis/laser`, `axis/remap/cycle`, TWP nutating, and
`gmoccapy` stdglue), then verifies the runtime dispatch/phase/callable owner
evidence plus representative Python modules, remap callables, prolog/epilog
callables, and Python path declarations. This is source inventory only: it
does not initialize Python, import modules, execute remap callbacks, or permit
promotion.
## Next Boundary Worklist
`next-boundary-worklist.tsv` is the machine-readable handoff for the next
runtime-boundary design phase. It is a planning artifact only: every row keeps
`execution_enabled=0` and `promotion_allowed=0`, records the LinuxCNC owner set,
records runtime owner evidence, records required native, Node, and browser
proof, and names the next boundary-design action before promotion.
`boundary-proof-gates.tsv` is the machine-readable proof checklist derived from
that worklist. It expands every target into native, Node, and browser proof
rows and keeps each row at `proof_status=pending`, `execution_enabled=0`, and
`promotion_allowed=0`. It must fail validation if a future edit tries to
promote a target without first replacing the pending gate with LinuxCNC-owned
proof for that layer. For the current blockers, event-only `USER_M_COMMAND`
coverage is insufficient for `millturn`, `.tbl` fallback coverage is
insufficient for `db_demo`, and JavaScript-owned behavior is insufficient for
Python runtime families.
`native-proof-alignment-summary.tsv` records whether the native source proof
summary, when present, is consumed by generated worklist and native proof-gate
rows. It currently aligns the `millturn` user-M source-state proof, `db_demo`
tool database protocol source proof, and Python runtime source-inventory proof
without enabling execution or promotion.
`runtime-boundary-native-alignment-summary.tsv` is the aggregate guard for the
detailed native alignment artifacts. It requires every user-M, tool DB, and
Python alignment row to have native stdout evidence, `alignment_ok=1`,
`proof_status=pending`, `execution_enabled=0`, and `promotion_allowed=0`.
`build/native/native-runtime-probe-summary.tsv` is the native companion for the
disabled runtime probe entry points. It summarizes the current runtime
readiness for `millturn` user-M, `db_demo` tool DB, and the Python
stop-lookahead fixture, records the missing host runtime requirements, points
back to each probe stdout log, and keeps every row at `execution_enabled=0` and
`promotion_allowed=0`.
`runtime-boundary-contract-summary.tsv` is the aggregate guard for the
non-executing runtime contracts. It ties the `millturn` user-M transition
contract, `db_demo` tool DB transaction contract, and Python-remap family
runtime contract to their native-alignment artifacts, and requires every
contract row to remain pending with execution and promotion disabled.
`blocked-runtime-promotion-lock.tsv` is the final machine-readable lock for
this phase. It combines the worklist, native/Node/browser proof gates, and
runtime alignment summary so every blocked target has `lock_active=1` until a
LinuxCNC-owned runtime boundary replaces the pending gates.
The first two priorities are the current designed-but-disabled full-process
blocks:
1. `external_user_m_process` for `axis/vismach/millturn/example.ngc`;
2. `tool_database_process` for `axis/db_demo/base.ngc`.
Python runtime family rows follow as inventory-only targets. They must remain
behind a LinuxCNC-owned Python runtime boundary and must not be used to vendor
or execute `gmoccapy`, `axis/laser`, TWP nutating, or other Python-remap
families by path alone.
## Current Validation
These commands must continue to pass after any change to this document or to
the inventory code:
```bash
wasm-port/tests/wasm/node/verify_sim_configs_wasm.sh
wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh
wasm-port/tests/browser/verify_interp_browser.sh
wasm-port/tests/host/verify_host_smokes.sh
wasm-port/tools/verify_vendor_sync.sh
wasm-port/tools/verify_no_standalone_cnc_semantics.sh
```

View File

@@ -48,13 +48,14 @@ wasm-port/tests/host/verify_host_smokes.sh
| Reject standalone CNC semantics | Done | `tools/verify_no_standalone_cnc_semantics.sh` guards project-owned `Interp::...` definitions outside documented runtime-edge stubs. |
| Maintain source reuse map | Done | Current sim-config, remap, interpreter, kinematics, TP, user-M, tool, named-parameter, and OPFS runtime boundaries are recorded in `docs/source-reuse-map.md`; keep updating it whenever LinuxCNC source, test assets, or runtime boundaries are added. |
| Maintain compatibility validation notes | Done | Current native, Node WASM, browser, OPFS, and host aggregate checks are recorded in `docs/compatibility-validation.md`; keep updating it whenever a validation command or fixture class is added. |
| Maintain sim-config coverage matrix | Done | `docs/sim-configs-coverage-matrix.md` now maps all current `verify_sim_configs.sh` records to program class, native result, current Layer 3/4 coverage, and blocked/class-coverage notes. The native harness emits `class-summary.tsv` and `path-matrix.tsv`, and the Node inventory runner checks generated/tracked path sets plus tracked class/native-status/expected-failure/blocked fields against native outputs before execution. Future changes should update the matrix only with a matching regenerated native inventory. |
| Document validation layers | Done | `docs/compatibility-validation.md` now records Layer 1 `nc_files` basic smoke, Layer 2 `configs/sim` native strict harness, Layer 3 standalone native runtime probes, and Layer 4 WASM Node/browser representative smokes with entry commands, current results, expected boundaries, and the no-LinuxCNC-semantics rule. |
| Build LinuxCNC test inventory | In progress | `linuxcnc/tests/remap` has been inventoried by dependency class; the first broader `linuxcnc/tests` pass now records full-process, HAL/realtime, linuxcncrsh, Python-binding, and external-component families in the blocked table. |
| Prefer pure interpreter tests first | In progress | Continue with tests that can run through `Interp::open()`, `read()`, and `execute()` without realtime hardware or GUI. |
| Add upstream-output comparison | In progress | Use upstream `../linuxcnc/bin/rs274` or original `test.sh` output where practical, then compare against native/WASM/browser output. |
| Promote tests through three layers | In progress | Add each selected test first to native harnesses, then WASM Node, then browser smoke where meaningful. |
| Record blocked tests | In progress | First broader family-level blocked batch is recorded below; continue expanding it as each `linuxcnc/tests` family is inspected. |
| Add aggregate smoke coverage | Done | `tests/host/verify_host_smokes.sh` now runs stable Node WASM, sim-config WASM, `nc_files` WASM, OPFS, and browser smoke checks with shared builds. Current run passed with `host_wasm_opfs_browser_smokes=ok`. |
| Add aggregate smoke coverage | Done | `tests/host/verify_host_smokes.sh` now runs stable Node WASM, sim-config representative WASM, sim-config Node inventory, `nc_files` WASM, OPFS, and browser smoke checks with shared builds. Current run passed with `host_wasm_opfs_browser_smokes=ok`. |
| Add `linuxcnc/nc_files` basic examples | Done | `tests/native/verify_nc_files.sh` now runs the basic/example subset of upstream `linuxcnc/nc_files` through LinuxCNC `bin/rs274`; current native baseline is 107 total, 101 pass, 6 expected context/entry-point edges, 0 unexpected failures. Exploratory `--all` inventory is 247 total, 219 pass, 28 expected context/entry-point edges, 0 unexpected failures. A representative vendored subset now passes Node WASM and browser execution through LinuxCNC-backed `Interp::open()`/`read()`/`execute()`, with `3D_Chips.ngc` using an INI-declared tool-table context for its upstream `T1 M6` line. |
## Current Review Boundaries
@@ -132,6 +133,10 @@ directories under `wasm-port/vendor/linuxcnc/tests/interp/` including
| `configs/sim/axis/foam/foam.ngc` | Done | Native, WASM Node, browser | Vendored under `wasm-port/vendor/linuxcnc/configs/sim/axis/foam`; validates LinuxCNC INI-driven `U/V` axis mask handling through `axis_foam.ini` and vendored file execution paths. |
| `configs/sim/axis/geometry/xyzc.ngc` | Done | Native, WASM Node, browser | Vendored under `wasm-port/vendor/linuxcnc/configs/sim/axis/geometry`; validates LinuxCNC `USER_M_PATH` registration with the real executable `M110` while process execution remains a deterministic standalone `USER_M_COMMAND` boundary. |
| `configs/sim/axis/external_offsets/*.ngc` M111 demos | Done | Native, WASM Node, browser | Vendored under `wasm-port/vendor/linuxcnc/configs/sim/axis/external_offsets`; validates `dyn_demo.ngc`, `eoffsets.ngc`, `jwp_z.ngc`, and `opa_demo.ngc` with their corresponding INI files, real executable `M111`, shared `eoffset.tbl`, and `opa_demo.ngc`'s `circles.ngc` subroutine while process execution remains a deterministic standalone boundary. |
| `configs/sim/axis/gladevcp/probe.ngc` | Done | Native, WASM Node, browser | Vendored under `wasm-port/vendor/linuxcnc/configs/sim/axis/gladevcp`; validates plain INI/tool-table main-program staging through `gladevcp_panel.ini` without treating the GTK panel process as browser runtime. |
| `configs/sim/axis/vismach/melfa-sim/example.ngc` | Done | Native, WASM Node, browser | Vendored under `wasm-port/vendor/linuxcnc/configs/sim/axis/vismach/melfa-sim`; validates a robot/Genser-style remap machine representative through real INI, tool table, and M428/M429/M430 remap subroutines while GUI/HAL process launch remains outside the standalone boundary. |
| `configs/sim/axis/vismach/puma/puma_cube.ngc` | Done | Native, WASM Node, browser | Vendored under `wasm-port/vendor/linuxcnc/configs/sim/axis/vismach/puma`; validates a PUMA machine-context representative through real INI, tool table, and remap subroutine staging while external GUI/HAL process launch remains outside the standalone boundary. |
| `configs/sim/woodpecker/on_abort.ngc` | Done | Native, WASM Node, browser | Vendored under `wasm-port/vendor/linuxcnc/configs/sim/woodpecker`; validates deterministic `on_abort` file execution through the real machine INI and tool table without expanding browser coverage to unrelated full-process UI flows. |
| More `tests/remap/*` interpreter-only cases | Planned | Native first | Select cases that do not require Python behavior beyond documented runtime-edge stubs unless the required LinuxCNC source path is ported. |
| More `tests/interp/*` interpreter-only cases | Planned | Native first | Select upstream interpreter cases that can run through vendored file execution without Python, HAL, realtime motion, or GUI. |
| `tests/rs274ngc/*` candidates | Planned | Native first | Use upstream `rs274` as the baseline where output is comparable. |
@@ -192,6 +197,15 @@ Use this checklist when adding each LinuxCNC upstream test:
| `tests/trajectory-planner/circular-arcs` | Blocked | Full LinuxCNC sim configs with task, HAL/Tcl files, GUI/display settings, and motion execution logs. | Keep using standalone TP API probes for planner code; full circular-arc machine tests require task/HAL/motion boundaries. |
| `tests/lowlevel/emcmot-error-mpsc` | Blocked | RIP-only build against LinuxCNC motion sources and low-level motion error driver. | Revisit only if low-level motion process test drivers are intentionally ported. |
| `tests/uspace/spawnv-root` | Blocked | Sudo-installed userspace HAL component and `spawnv` root behavior. | Keep upstream-only unless HAL component install/runtime support is added. |
| `configs/sim/*/remap_subs/*.ngc` browser main-program inventory | Blocked | These files are remap/subroutine assets, not standalone browser main-program targets. | Keep validating them through native remap parse/execute paths and explicit five-axis/runtime probes instead of widening browser `runSimConfigProgram()` blindly. |
| `configs/sim/axis/db_demo/base.ngc` Layer 4 inventory | Blocked | `[EMCIO]DB_PROGRAM = ./db_nonran.py` requires LinuxCNC task/tooldata DB process startup, command/reply protocol, and database state behavior, not standalone interpreter file execution. | Keep as `L4-TOOL-DB` until a LinuxCNC-owned tool database runtime boundary exists and proves lookup/update behavior across native and WASM. `blocked-dependency-summary.tsv` records `taskclass.cc`, `tooldata_db.cc`, `tooldata_common.cc`, and `configs/sim/axis/db_demo/db.py` as the owner set plus source-derived `tool_db_protocol_evidence` for the `v2.1` handshake, `g`/`FINI` get-all, and `l`/`u`/`p` notification protocol. |
| `configs/sim/axis/vismach/millturn/example.ngc` Layer 4 inventory | Blocked | The remap execution chain calls external `USER_M_PATH` process codes `M128` and `M129`, with HAL/HALUI/UI process declarations in `millturn.ini`. | Keep as `L4-USER-M-PROCESS`; do not promote until the M128/M129 LinuxCNC-owned state boundary proves the kinstype guard and `ini.[xyz].*` HAL pin updates. `blocked-dependency-summary.tsv` records the `mcodes/M128` and `mcodes/M129` Tcl scripts plus source-derived `user_m_process_effects` for Tcl/HAL runtime use, kinstype guards, and `ini.[xyz]` HAL pin side effects. |
| `configs/sim/gmoccapy/*` Layer 4 full inventory | Blocked | Python remap runtime boundary is present in native LinuxCNC `rs274`, but not yet intentionally exposed for Node/browser full inventory. | Keep native inventory coverage as source-of-truth; add one representative Node/browser class sample only after the Python remap boundary is deliberately designed. Python module and prolog/epilog ownership is inventoried in `blocked-dependency-summary.tsv`; LinuxCNC runtime ownership is recorded as `python_runtime_evidence` in the Python boundary/family summaries. |
| `configs/sim/axis/laser/*` Layer 4 full inventory | Blocked | Python remap runtime boundary is present in native LinuxCNC `rs274`, but not yet intentionally exposed for Node/browser full inventory. | Keep native inventory coverage as source-of-truth; add one representative Node/browser class sample only after the Python remap boundary is deliberately designed. Python module and remap ownership is inventoried in `blocked-dependency-summary.tsv`; LinuxCNC runtime ownership is recorded as `python_runtime_evidence` in the Python boundary/family summaries. |
| `configs/sim/axis/remap/*/nc_files/*.ngc` Layer 4 full inventory | Blocked | Native LinuxCNC `rs274` coverage exists, but these demo main programs depend on Python remaps, Python prolog/epilog callbacks, or Python-backed queue/tool-change handlers. | Keep native inventory coverage as source-of-truth; do not reduce Python remap demos to missing vendored files or browser standalone execution until the Python remap boundary is deliberately designed. Dependency ownership is inventoried in `blocked-dependency-summary.tsv`; LinuxCNC runtime ownership is recorded as `python_runtime_evidence` in the Python boundary/family summaries. |
| `configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/demos/*` Layer 4 full inventory | Blocked | Native LinuxCNC `rs274` coverage exists, but the demo family depends on Python remap entry points such as `g682`, `g69_core`, and `g53x_core` that are not yet intentionally exposed for Node/browser inventory. | Keep native inventory coverage as source-of-truth; revisit Layer 4 only after the Python remap boundary is deliberately designed rather than faked in JS. Python and NGC remap dependencies are inventoried in `blocked-dependency-summary.tsv`; LinuxCNC runtime ownership is recorded as `python_runtime_evidence` in the Python boundary/family summaries. |
| `configs/sim/axis/vismach/VMC_toolchange/toolchange.ngc` Layer 4 full inventory | Blocked | Native LinuxCNC `rs274` coverage exists, but the program is the remapped tool-change body for a Python prolog/epilog and full tool-change/HAL process flow. | Keep native inventory coverage as source-of-truth and validate tool-change mechanics through existing standalone interpreter/tooldata probes until task/HAL/tool-change runtime boundaries exist. |
| `configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/demos/incremental_repetition_g533.ngc` | Blocked | Preserved upstream demo edge: line uses bare `X/Y/Z` after `G53.6` without an explicit motion G-code in the upstream standalone baseline. | Keep as expected failure in Layer 2 and do not modify G-code or project-owned interpreter semantics to force a pass. |
## Next Work Batch

View File

@@ -16,6 +16,8 @@ Result file:
```text
wasm-port/build/native/sim-configs/summary.tsv
wasm-port/build/native/sim-configs/class-summary.tsv
wasm-port/build/native/sim-configs/path-matrix.tsv
```
Baseline:
@@ -50,19 +52,52 @@ Remaining failures are explicit LinuxCNC-native baseline edges:
## Target
The first target is not a browser UI feature. It is a repeatable native and
WASM simulation harness that can load and execute all `linuxcnc/configs/sim`
programs that are meaningful in a standalone non-hardware simulation context.
The first target is not a browser UI feature and not a requirement that every
`linuxcnc/configs/sim` `.ngc` program pass through standalone `bin/rs274`.
It is a repeatable native and WASM inventory that classifies every
`configs/sim` program, runs the entries that are meaningful in standalone
native/WASM/browser contexts, and records blocked dependencies for the entries
that require full LinuxCNC task, HAL, UI, Python-remap, or external process
runtime.
Acceptance criteria:
- The native sim-config harness reports all executable sim programs as `PASS`.
- The native sim-config harness reports `unexpected_fail: 0` and writes
`summary.tsv`, `class-summary.tsv`, and `path-matrix.tsv`.
- Macro/remap files are validated by the correct entry point: direct execution
only for real programs, load/parse or remap-call validation for subroutines.
- WASM tests cover the same representative classes after the native harness is
green.
- Any remaining unsupported files are explicitly classified as native GUI or
hardware-only and excluded by rule, not by accident.
- Node WASM inventory executes only entries with a defined standalone/WASM
runtime path and reports `unexpected_fail: 0`.
- Browser coverage remains focused on representative runtime classes rather
than blind full-directory execution.
- Any remaining unsupported files are explicitly classified by dependency, not
by accident.
## Definition Of Done For Full configs/sim Coverage
Full coverage for this project means:
- Inventory complete: every `summary.tsv` `.ngc` entry appears in
`docs/sim-configs-coverage-matrix.md` and generated `path-matrix.tsv`.
- Classification complete: every entry has `main`, `macro_load`, or
`remap_subroutine` class.
- Blocked table complete: full-process, HAL, UI, linuxcncrsh, external
userspace component, Python binding/remap, tool-database, and process user-M
dependencies are recorded explicitly.
- Native source-of-truth complete: `verify_sim_configs.sh` remains the Layer 2
source for per-path status and expected-failure reason.
- Node inventory complete: `verify_sim_configs_inventory_wasm.sh` checks the
native/generated/tracked path sets, runs eligible vendored programs, and
emits stable WASM inventory and skip/block summaries.
Any eligible row with missing vendored machine context is an inventory
failure, not an expected skip.
- Browser class coverage complete: each promoted browser class has a
representative sample and no browser test relies on directory enumeration.
- Expected failures justified: the current eight Layer 2 expected failures are
tied to runtime boundaries or the preserved upstream demo edge.
- No accidental standalone semantic ownership: tests must not pass by changing
G-code semantics, JS interpreter behavior, or project-owned
`Interp::...` implementations.
## Phase 1: Make The Harness A First-Class Test
@@ -80,7 +115,8 @@ validation entry point.
- scan only `linuxcnc/configs/sim`;
- identify `.ngc`, nearest `.ini`, nearest `.tbl`;
- run from the INI directory;
- write `summary.tsv`, stdout, stderr, and interpreter output under
- write `summary.tsv`, `class-summary.tsv`, `path-matrix.tsv`, stdout,
stderr, and interpreter output under
`wasm-port/build/native/sim-configs/`;
- classify programs as `main`, `macro_load`, `remap_subroutine`, or
`unsupported_runtime_edge`;
@@ -252,71 +288,61 @@ wasm-port/tests/native/verify_native_probes.sh
wasm-port/tests/wasm/node/verify_interp_wasm.sh
```
## Phase 4: Bring Up Python Remap Runtime Edges
## Phase 4: Classify Python Remap Runtime Edges
Status: complete for the native sim-config harness. Current checks:
Status: complete for the native sim-config harness and blocked for Layer 4
full inventory. Current native checks:
```text
gmoccapy: total 38, pass 38, fail 0
axis/laser: total 3, pass 3, fail 0
axis/remap main demos: total 6, pass 6, fail 0
VMC_toolchange: total 1, pass 1, fail 0
```
Root cause:
Boundary:
The configs use LinuxCNC Python remap modules. Earlier harness runs failed while
initializing `python/toplevel.py`; current native runs now resolve and execute
these configs under the LinuxCNC `rs274` baseline.
The configs use LinuxCNC Python remap modules. Native LinuxCNC `rs274` can
resolve and execute these configs under the current baseline, but Node/browser
Layer 4 full inventory is intentionally blocked until a Python-remap runtime
boundary is deliberately designed. Do not make these pass in browser by
translating Python remap behavior into JavaScript or by adding project-owned
CNC semantics.
Implementation steps:
Recorded dependency:
1. Preserve upstream behavior where possible:
- `configs/sim/gmoccapy/python/toplevel.py`
- `configs/sim/gmoccapy/python/remap.py`
- `configs/sim/gmoccapy/python/stdglue.py`
- `configs/sim/axis/laser/python/toplevel.py`
- `configs/sim/axis/laser/python/remap.py`
- `configs/sim/axis/remap/*/python/*.py` for Python remap, prolog, epilog,
queue, and tool-change callbacks.
- `configs/sim/axis/vismach/VMC_toolchange/remap.py` and `toplevel.py` for
Python tool-change prolog/epilog handling.
- inspect vendored LinuxCNC Python plugin interfaces;
- identify exact APIs used by:
- `configs/sim/gmoccapy/python/toplevel.py`
- `configs/sim/gmoccapy/python/remap.py`
- `configs/sim/gmoccapy/python/stdglue.py`
- `configs/sim/axis/laser/python/toplevel.py`
- `configs/sim/axis/laser/python/remap.py`
Current policy:
2. Split the implementation into two layers:
- native harness support using the host Python runtime, if available;
- WASM support using a documented adapter boundary or a Python-free
equivalent only for runtime edges, not G-code semantics.
3. Add runtime state adapters required by Python remap:
- selected tool and pocket;
- tool table access;
- interpreter status object fields used by stdglue;
- message/error reporting;
- canonical tool-change side effects needed by `M6`, `M61`, and laser
remaps.
4. Make Python module path resolution match LinuxCNC:
- INI directory is the base directory;
- `PYTHONPATH` includes config `python/` directories;
- remap modules load relative to the sim config.
5. Add narrowly-scoped tests before running all 38 gmoccapy programs. Done:
- one gmoccapy tool-change macro;
- one gmoccapy lathe macro;
- one gmoccapy 5-axis example;
- one laser raster/vector program.
- Keep native inventory as source-of-truth.
- Mark `gmoccapy/*`, `axis/laser/*`, `axis/remap/*/nc_files/*.ngc`, and
`axis/vismach/VMC_toolchange/toolchange.ngc` rows as `L4-PYTHON-REMAP` in
`docs/sim-configs-coverage-matrix.md`.
- Revisit Layer 4 only after the runtime boundary is designed from LinuxCNC
source ownership, not as a browser smoke expansion.
Completion check:
```bash
wasm-port/tests/native/verify_sim_configs.sh --only gmoccapy
wasm-port/tests/native/verify_sim_configs.sh --only axis/laser
wasm-port/tests/native/verify_sim_configs.sh --only axis/remap
wasm-port/tests/native/verify_sim_configs.sh --only VMC_toolchange
```
## Phase 5: Support TWP Remaps Including G69
## Phase 5: Classify TWP Remaps Including G69
Status: mapping complete. The harness now maps
Status: native mapping complete and Layer 4 blocked on Python-remap runtime
ownership. The harness now maps
`axis/vismach/5axis/table-rotary_spindle-rotary-nutating/demos/*` through the
explicit `xyzacb-trsrn_twp/xyzacb-trsrn.ini` machine config instead of falling
back to `axis/axis.ini`. That loads the TWP `G69` remap declarations correctly,
@@ -329,7 +355,7 @@ Current failures:
`x50y50z150` after `G53.6`; same-directory demos use explicit `G0` motion
words at this point.
Root cause:
Boundary:
The demo programs rely on table/spindle rotary TWP remaps. The original test
mapping fell back to `axis/axis.ini` for these demo files because the actual
@@ -341,26 +367,15 @@ axis/vismach/5axis/table-rotary_spindle-rotary-nutating/
xyzbca-trsrn_twp/xyzbca-trsrn.ini
```
Implementation steps:
Current policy:
1. Improve sim-config mapping. Done:
- if a `.ngc` is under a `demos/` sibling of machine-specific INI
directories, map it to the appropriate TWP INI instead of walking upward
to `axis/axis.ini`;
- encode this as explicit metadata in the harness, not a fragile heuristic.
2. Ensure `SUBROUTINE_PATH` includes `../remap_subs:../demos` as declared by
the TWP INIs.
3. Verify remap subroutines:
- `g69remap.ngc`
- `g531remap.ngc`
- `g533remap.ngc`
- `g536remap.ngc`
4. Add a native test for each failing demo.
- Keep native mapping and expected-failure classification in
`verify_sim_configs.sh`.
- Keep `incremental_repetition_g533.ngc` as `UPSTREAM-DEMO`; do not edit the
upstream G-code or add standalone semantics to force a pass.
- Keep TWP demo Layer 4 rows as `L4-PYTHON-REMAP` until Python remap entry
points such as `g682`, `g69_core`, and `g53x_core` have an intentional
runtime boundary.
Latest result:
@@ -380,13 +395,14 @@ Completion check:
wasm-port/tests/native/verify_sim_configs.sh --only table-rotary_spindle-rotary-nutating
```
## Phase 6: Promote Native Coverage To WASM
## Phase 6: Promote Eligible Native Coverage To WASM
Status: complete for representative Node and browser WASM coverage. Dedicated
Node and browser smokes now pass a representative vendored `configs/sim` subset
through the SDK `runSimConfigProgram()` host boundary, which copies files into
the Emscripten filesystem and forwards execution to existing LinuxCNC-backed C
ABI paths. They cover:
Status: complete for the current representative Node/browser class coverage
and the Node inventory layer. Dedicated Node and browser smokes now pass a
representative vendored `configs/sim` subset through the SDK
`runSimConfigProgram()` host boundary, which copies files into the Emscripten
filesystem and forwards execution to existing LinuxCNC-backed C ABI paths. They
cover:
- `axis/foam/foam.ngc` with `axis_foam.ini`, verifying INI-driven `U/V` axis
mask handling in WASM.
@@ -400,87 +416,214 @@ ABI paths. They cover:
shared `eoffset.tbl`, and `opa_demo.ngc`'s `circles.ngc` subroutine,
verifying the same user-M and `SUBROUTINE_PATH` boundaries against upstream
sim programs.
The Node inventory guard keeps these deterministic `M110`/`M111` rows
unblocked, requires a vendored user-M file, and includes the `opa_demo.ngc`
`circles.ngc` subroutine text in boundary analysis so the reached `M111`
call is accounted for instead of being mistaken for an external user-M
process gap.
- `axis/gladevcp/probe.ngc` as a plain INI/tool-table main-program sample.
- `axis/external_offsets/circles.ngc` as the macro-load class representative,
wrapped only with an added `M2` for load/parse style execution.
- `axis/vismach/5axis/table-dual-rotary/demos/xyzab-tdr-demo.ngc` and
`axis/vismach/5axis/table-rotary-tilting/demos/*` through the existing
five-axis remap execution C ABI.
- `axis/vismach/melfa-sim/example.ngc` and `axis/vismach/puma/puma_cube.ngc`
as additional remap/kinematics machine representatives.
- `woodpecker/on_abort.ngc` as the deterministic on-abort/user-action macro
class representative.
- Node inventory for the eligible vendored program set:
`executed=28`, `passed=28`, `skipped=131`, `unexpected_fail=0`.
- Node inventory skip/block summary:
`ASSET-ONLY=65`, `L4-PYTHON-REMAP=53`, `L4-TOOL-DB=1`,
`L4-USER-M-PROCESS=1`, `NON_MAIN_CLASS=10`, `UPSTREAM-DEMO=1`.
- Node blocked-dependency inventory for the hard blocked row set:
`L4-PYTHON-REMAP=53`, `L4-TOOL-DB=1`, `L4-USER-M-PROCESS=1`.
The inventory reads source `linuxcnc/configs/sim` INI files for dependency
accounting only and writes
`build/wasm/sim-configs-inventory/blocked-dependency-summary.tsv` without
vendoring or executing those blocked families. The blocked summary includes
source-derived `user_m_process_effects` for `millturn`,
`tool_db_protocol_evidence` for `db_demo`, and Python module/remap/prolog/
epilog dependency ownership for Python-remap families. Python-remap rows are
also projected into
`build/wasm/sim-configs-inventory/python-remap-boundary-summary.tsv`, which
keeps all 53 `L4-PYTHON-REMAP` rows inventory-only with
`python_runtime_evidence` and `execution_enabled=0`.
Boundary decisions for the current hard blocks:
- `axis/vismach/millturn/example.ngc` remains `L4-USER-M-PROCESS`. The
source INI declares HAL, HALUI MDI, and UI process dependencies, and the
remap chain enters `remap_subs/428remap.ngc` and `429remap.ngc`, which call
external user-M process codes `M128` and `M129`. Those process scripts live
at `configs/sim/axis/vismach/millturn/mcodes/M128` and `M129`; they use Tcl
LinuxCNC/HAL packages, `emc_init`, `parse_ini`, `hal getp`, and `hal setp`
to change INI axis limit HAL pins after the kinematics switch. The current
LinuxCNC owner is therefore task user-M process dispatch plus HALUI/MDI and
the config-owned Tcl process scripts, not the standalone interpreter. Do not
promote this row until the boundary design in
`docs/full-process-boundary-design.md` has a deterministic state proof for
these HAL pin updates across native, Node, and browser. The Node inventory
guard requires this row to stay non-`REP` in Node and browser while it remains
`L4-USER-M-PROCESS`, and the generated inventory summary must keep it as
`SKIP` with that reason.
- `axis/db_demo/base.ngc` remains `L4-TOOL-DB`. The source INI declares
`[EMCIO]DB_PROGRAM = ./db_nonran.py`, so standalone interpreter execution
would miss LinuxCNC tool-database process startup and protocol/state
behavior. The LinuxCNC owner is `src/emc/task/taskclass.cc` for DB_PROGRAM
activation, `src/emc/tooldata/tooldata_db.cc` for DB process startup and
command/reply protocol, `src/emc/tooldata/tooldata_common.cc` for DB-backed
tooldata behavior, and the config program `configs/sim/axis/db_demo/db.py`.
Do not promote until the boundary design in
`docs/full-process-boundary-design.md` has a LinuxCNC-owned tool database
boundary that proves lookup/update behavior across native and WASM. The Node
inventory guard requires this row to stay non-`REP` in Node and browser while
it remains `L4-TOOL-DB`, and the generated inventory summary must keep it as
`SKIP` with that reason.
- Python-remap/full-process families remain `L4-PYTHON-REMAP`. The blocked
dependency inventory records Python modules, remap/prolog/epilog function
ownership, NGC remap subpaths, and HAL/UI/HALUI declarations for gmoccapy,
axis/laser, axis/remap demos, TWP nutating demos, and VMC tool-change
rows. The Python-specific boundary summary records the same row set as
inventory-only and requires a LinuxCNC-owned Python runtime boundary before
any promotion. Every `L4-PYTHON-REMAP` row must also remain `SKIP` with
`L4-PYTHON-REMAP` in the generated inventory summary. This is an inventory
artifact, not a Layer 4 execution path.
Completion checks:
```bash
wasm-port/tests/wasm/node/verify_sim_configs_wasm.sh
wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh
wasm-port/tests/browser/verify_interp_browser.sh
```
Remaining work:
Current Layer 4 non-goals:
1. Extend `runtime/core/linuxcnc_wrap/linuxcnc_interp_wasm.cpp` with the same
machine-config entry point used by native tests. Done for the existing
`runFileWithIni()` file-execution path.
- Do not run all 159 programs in browser.
- Do not promote Python remap/full-process/HAL/UI-only families into
Emscripten without LinuxCNC-owned runtime support.
- Do not add JS-owned G-code, remap, tool, kinematics, parameter, or planner
semantics.
2. Extend `runtime/sdk/src/linuxcnc-interp.js` with a host-boundary method such
as:
Browser inventory decision record:
```js
runSimConfigProgram({ iniPath, programPath, files })
```
Done. The method only writes caller-provided text files into the
Emscripten filesystem, applies executable bits for user M-code files, and
forwards execution to the existing LinuxCNC-backed C ABI path. It does not
implement CNC semantics in JavaScript.
3. Copy required sim config files into the Emscripten FS:
- INI;
- tool table;
- parameter file;
- `.ngc` program;
- `SUBROUTINE_PATH` files;
- `USER_M_PATH` handler files or registered adapter handlers.
Done for the representative Node and browser subsets.
4. Add Node WASM coverage. Done:
```text
wasm-port/tests/wasm/node/verify_sim_configs_wasm.mjs
wasm-port/tests/wasm/node/verify_sim_configs_wasm.sh
```
5. Add representative browser coverage. Done in
`wasm-port/tests/browser/interp_smoke.html` through the existing browser
interpreter smoke and the same `runSimConfigProgram()` SDK boundary as Node.
- Promoted after Node inventory: plain INI/tool-table execution
(`axis/gladevcp/probe.ngc`), deterministic macro/load execution
(`axis/external_offsets/circles.ngc`), deterministic on-abort/user-action
execution (`woodpecker/on_abort.ngc`), TDR/TRT five-axis remap execution,
bridge-mill W-axis remap execution, `melfa-sim`, and PUMA.
The Node inventory guard requires process-declaring representatives such as
`axis/gladevcp/probe.ngc`, `woodpecker/on_abort.ngc`,
`axis/vismach/melfa-sim/example.ngc`, and
`axis/vismach/puma/puma_cube.ngc` to keep their dependency rows in
`boundary-summary.tsv`, match the expected HAL/UI/HALUI/Python process flag
combinations, remain Node/browser `REP` rows, and avoid hard-block promotion
unless the classifier finds a real hard runtime dependency.
- Kept as blocked: TWP `table-rotary_spindle-rotary-nutating`, `gmoccapy`,
`axis/laser`, `axis/remap/*/nc_files`, and VMC tool-change Python remap
families. These are not missing browser staging work; they depend on
Python-remap, prolog/epilog, or full runtime process boundaries that have not
been intentionally exposed in Layer 4.
- Kept out of browser full inventory: remap subroutine assets and macro-only
non-representatives. They remain covered by native inventory, native remap
parse/execute probes, Node inventory where eligible, or a class
representative in browser.
## Phase 7: Documentation And Drift Control
Status: complete for the current representative sim-config WASM/browser
coverage. The documentation and manifest now record the native, Node WASM,
browser, source reuse, and vendor-sync state for the selected sim-config
programs.
Status: complete for the current full `configs/sim` coverage definition. The
documentation and manifest now record native inventory, generated class/path
artifacts, blocked policy, Node inventory, browser class coverage, source
reuse, and vendor-sync state.
1. Update `docs/compatibility-validation.md` with the sim-config matrix. Done.
1. Update `docs/compatibility-validation.md` with the sim-config matrix,
blocked policy, and validation commands. Done.
2. Update `docs/source-reuse-map.md` for newly vendored source files. Done.
2. Add `docs/sim-configs-coverage-matrix.md` as the tracked review surface for
all 159 current native inventory rows. Done.
3. Update `tools/source-manifest.txt` and `tools/verify_vendor_sync.sh` if new
3. Update `docs/source-reuse-map.md` for newly vendored source files. Done.
4. Update `tools/source-manifest.txt` and `tools/verify_vendor_sync.sh` if new
LinuxCNC files are copied into `wasm-port/vendor/linuxcnc`. Done for the
representative `axis/foam`, `axis/geometry`, and `axis/external_offsets`
sim-config files, including the remaining external-offset M111 programs and
`circles.ngc`; no `verify_vendor_sync.sh` logic change was needed.
current representative and inventory-backed sim-config files; no
`verify_vendor_sync.sh` logic change was needed.
4. Preserve the latest result summary as a machine-readable artifact, but do
5. Preserve the latest result summary as a machine-readable artifact, but do
not commit generated logs unless they are intentionally used as fixtures.
Done: generated logs remain under build/test output directories, while the
tracked documentation records only the current summary values and validation
commands.
Done: `summary.tsv` remains the source row set, and `class-summary.tsv` plus
`path-matrix.tsv` are generated artifacts under `build/native/sim-configs/`.
Node inventory also writes `build/wasm/sim-configs-inventory/summary.tsv`
`build/wasm/sim-configs-inventory/skip-summary.tsv`, and
`build/wasm/sim-configs-inventory/boundary-summary.tsv` plus
`build/wasm/sim-configs-inventory/ini-boundary-summary.tsv` for Layer 4
execution, skip/block accounting, and runtime-boundary dependency reporting.
The same inventory now writes the full blocked-boundary handoff artifacts:
`blocked-dependency-summary.tsv`, `full-process-boundary-summary.tsv`,
`user-m-process-boundary-summary.tsv`, `user-m-process-state-targets.tsv`,
`tool-db-process-boundary-summary.tsv`,
`tool-db-process-protocol-gates.tsv`,
`python-remap-boundary-summary.tsv`, `python-remap-family-summary.tsv`,
`boundary-phase-completion-summary.tsv`,
`native-proof-alignment-summary.tsv`, `next-boundary-worklist.tsv`, and
`boundary-proof-gates.tsv`. These remain accounting/proof-gate artifacts;
they do not enable blocked execution or promotion.
The inventory guard checks `skip-summary.tsv` against skip reasons derived
from `path-matrix.tsv`, so aggregate skip counts drift when any blocked or
class policy changes without updating the tracked matrix and inventory.
The inventory guard requires every vendored INI row to have an available
SDK runtime-boundary classifier report; `UNAVAILABLE` is reserved for rows
whose boundary summary records a missing vendored INI.
Hard blocked rows are additionally recorded in
`build/wasm/sim-configs-inventory/blocked-dependency-summary.tsv` without
promotion into standalone/WASM execution. That artifact includes source
owner fields and runtime proof fields such as `user_m_process_files`,
`user_m_process_effects`, `tool_db_protocol_evidence`, and `linuxcnc_owner`,
so `millturn` and `db_demo` remain blocked for dependency-backed reasons
rather than path-only classification. The follow-up boundary design and
required proof for those two blocked rows are tracked in
`docs/full-process-boundary-design.md`. Node inventory also writes
`build/wasm/sim-configs-inventory/full-process-boundary-summary.tsv` for
the designed-but-blocked non-Python full-process rows, including their
`runtime_owner_evidence`, and
`build/wasm/sim-configs-inventory/python-remap-boundary-summary.tsv` for
the Python remap inventory-only row set. The Python boundary and family
summaries include `python_runtime_evidence`. All blocked boundary artifacts
require `execution_enabled=0`.
## Recommended Work Order
## Layer 2 Expected-Failure Policy
1. Harness first: make `verify_sim_configs.sh` reproducible.
2. Axis config next: unblock `U/V/W` failures.
3. TWP mapping: complete; remaining TWP demo failures are Python/HAL remap
runtime edges.
4. User M-code dispatch: small runtime-edge feature, unblocks five files.
5. Python remap runtime: largest block; do it after the harness and smaller
runtime edges are stable.
6. WASM promotion after native parity.
The current Layer 2 baseline remains:
```text
total: 159
pass: 151
fail: 8
timeout: 0
expected_fail: 8
unexpected_fail: 0
```
Do not reduce the eight expected failures by changing upstream G-code, JS
interpreter behavior, or project-owned standalone interpreter semantics. Reducing
this count is only valid if a new LinuxCNC-owned native/runtime entry point can
legitimately supply the missing task/user-M/axis/TWP context while preserving the
strict native baseline as a separately documented source of truth.
## Recommended Next Work
1. Keep `verify_sim_configs.sh`, `path-matrix.tsv`, and
`docs/sim-configs-coverage-matrix.md` in sync whenever the source manifest or
vendored sim-config set changes.
2. Add new Node/browser representatives only when they cover a new runtime class
with a LinuxCNC-owned execution path.
3. Treat Python remap, full-process HAL/UI, tool database, and external
userspace process families as blocked until their runtime boundary is
intentionally designed and the proof criteria in
`docs/full-process-boundary-design.md` are met where applicable.
4. Re-evaluate Layer 2 expected failures only after a new legitimate
LinuxCNC-owned entry point exists.
## Non-Goals

View File

@@ -0,0 +1,421 @@
# Sim Configs Coverage Matrix
This matrix maps every current `wasm-port/tests/native/verify_sim_configs.sh` entry
to its native classification and current Layer 3/4 coverage status. It is the
tracked review surface for `linuxcnc/configs/sim` inventory; the native harness
also emits machine-readable artifacts for automation.
Current baseline:
- Source file: `wasm-port/build/native/sim-configs/summary.tsv`
- Generated class summary: `wasm-port/build/native/sim-configs/class-summary.tsv`
- Generated path matrix: `wasm-port/build/native/sim-configs/path-matrix.tsv`
- Total records: `159`
- Native result: `pass 151`, `expected_fail 8`, `unexpected_fail 0`
- Current Layer 4 representative subset: `axis/foam`, `axis/geometry`,
`axis/external_offsets`, `axis/gladevcp`, `woodpecker/on_abort.ngc`,
bridge-mill `5axisgui.ngc`, TDR/TRT five-axis switchkins demos,
`melfa-sim`, and `puma_cube.ngc`
- `wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.mjs` checks that
this tracked matrix and generated `path-matrix.tsv` contain the same 159 paths
as native `summary.tsv` before running Node inventory.
- Node inventory artifact: `wasm-port/build/wasm/sim-configs-inventory/summary.tsv`
- Node skip/block artifact: `wasm-port/build/wasm/sim-configs-inventory/skip-summary.tsv`
- Node runtime-boundary artifact: `wasm-port/build/wasm/sim-configs-inventory/boundary-summary.tsv`
- Node INI runtime-boundary artifact:
`wasm-port/build/wasm/sim-configs-inventory/ini-boundary-summary.tsv`
- Node blocked-dependency artifact:
`wasm-port/build/wasm/sim-configs-inventory/blocked-dependency-summary.tsv`
- Node full-process boundary design artifact:
`wasm-port/build/wasm/sim-configs-inventory/full-process-boundary-summary.tsv`
- Node user-M process boundary design artifact:
`wasm-port/build/wasm/sim-configs-inventory/user-m-process-boundary-summary.tsv`
- Node user-M process transition contract artifact:
`wasm-port/build/wasm/sim-configs-inventory/user-m-process-transition-plan.tsv`
- Node tool DB process boundary design artifact:
`wasm-port/build/wasm/sim-configs-inventory/tool-db-process-boundary-summary.tsv`
- Node tool DB process transaction contract artifact:
`wasm-port/build/wasm/sim-configs-inventory/tool-db-process-transaction-plan.tsv`
- Node Python-remap boundary inventory artifact:
`wasm-port/build/wasm/sim-configs-inventory/python-remap-boundary-summary.tsv`
- Node Python-remap family inventory artifact:
`wasm-port/build/wasm/sim-configs-inventory/python-remap-family-summary.tsv`
- Node Python-remap runtime contract artifact:
`wasm-port/build/wasm/sim-configs-inventory/python-remap-runtime-contract.tsv`
- Node Python-remap native runtime readiness artifact:
`wasm-port/build/wasm/sim-configs-inventory/python-remap-native-runtime-readiness.tsv`
- Node Python-remap native runtime state-plan artifact:
`wasm-port/build/wasm/sim-configs-inventory/python-remap-native-runtime-state-plan.tsv`
- Node Python-remap native runtime fixture-plan artifact:
`wasm-port/build/wasm/sim-configs-inventory/python-remap-native-runtime-fixture-plan.tsv`
- Node runtime-boundary contract summary artifact:
`wasm-port/build/wasm/sim-configs-inventory/runtime-boundary-contract-summary.tsv`
- Node boundary-phase completion artifact:
`wasm-port/build/wasm/sim-configs-inventory/boundary-phase-completion-summary.tsv`
- Node next-boundary worklist artifact:
`wasm-port/build/wasm/sim-configs-inventory/next-boundary-worklist.tsv`
- Current Node inventory: `executed 28`, `passed 28`, `skipped 131`,
`unexpected_fail 0`
- Current Node skip/block counts: `ASSET-ONLY 65`, `L4-PYTHON-REMAP 53`,
`L4-TOOL-DB 1`, `L4-USER-M-PROCESS 1`, `NON_MAIN_CLASS 10`,
`UPSTREAM-DEMO 1`
Legend:
- `Layer 3`: `SIM-*` means dedicated native runtime probe coverage; `5AX-EXEC` means
native five-axis remap execution coverage; `-` means no dedicated runtime probe yet.
- `Layer 4 Node/Browser`: `REP` means the current representative smoke covers this
exact program; `INV` means the Node inventory runner covers the exact program;
`N/A` means the row is a subroutine asset and should not be judged as a standalone
browser main program; `-` means the row is not individually promoted at that layer
and must be interpreted with the row's blocked or class-coverage note.
- `Blocked`: current hard blocked dependency or non-target classification for future
inventory work. `ASSET-ONLY` means the row is not a browser/main-program target.
`L4-PYTHON-REMAP` means native `rs274` coverage exists but Node/browser full inventory
is blocked on an intentional Python-remap runtime boundary decision. `UPSTREAM-DEMO`
means the file is a preserved upstream expected-failure edge.
- `boundary-summary.tsv`: one row per native inventory path. It records the
matrix blocked kind, the SDK classifier's recommended hard block when an INI
is vendored, declared HAL/UI/HALUI/Python process dependencies, tool database
declarations, user-M process codes seen in the execution text, and which of
those user-M codes are not staged by vendored `USER_M_PATH` files. Python is
split into total process dependency, UI/DB process dependency, and Python
remap runtime dependency so safe UI representatives such as `gladevcp` are
not mislabeled as Python-remap coverage. Rows whose INI has not been
vendored yet use `recommended_blocked=UNAVAILABLE` and keep their tracked
matrix policy as the source of truth until the relevant boundary inventory
batch vendors the missing context.
- `ini-boundary-summary.tsv`: one row per unique INI referenced by the native
inventory. It aggregates path-level boundary reports so vendored INIs have a
direct machine-readable `report_available=1` check and hard block
recommendations can be audited at INI granularity.
- `blocked-dependency-summary.tsv`: one row per hard blocked
`L4-PYTHON-REMAP`, `L4-TOOL-DB`, and `L4-USER-M-PROCESS` path. It reads the
source `linuxcnc/configs/sim` INI files without vendoring or executing those
families, records Python modules, remap/prolog/epilog function ownership,
NGC remap subpaths, HAL/UI/HALUI process declarations, `DB_PROGRAM`, and
tool database protocol evidence, plus external user-M execution codes, their
process script files, and process side-effect evidence. The `linuxcnc_owner`
field records the LinuxCNC source/config files that own the blocked behavior,
and keeps those rows blocked until a LinuxCNC-owned runtime boundary is
designed.
- `full-process-boundary-summary.tsv`: one row for each designed-but-still-blocked
non-Python full-process boundary. It currently covers `axis/db_demo/base.ngc`
and `axis/vismach/millturn/example.ngc`, records LinuxCNC runtime owner
evidence, records required native/Node/browser proof, and requires
`execution_enabled=0`.
- `user-m-process-boundary-summary.tsv`: one row for each designed-but-still-blocked
external user-M process boundary. It currently records the `millturn`
`M128`/`M129` process files, remap call chain, kinstype guards, and
source-traceable `ini.[xyz].*` HAL pin state targets, while requiring
`execution_enabled=0` and `promotion_allowed=0`.
- `user-m-process-transition-plan.tsv`: the pending non-executing transition
contract for the `millturn` user-M boundary. It binds `M428` to `M128` and
`M429` to `M129`, records switchkins output/target, active G5x work offset,
guard pin, state mode, and expected `ini.[xyz].*` outputs, and still requires
`execution_enabled=0` and `promotion_allowed=0`.
- `user-m-process-native-transition-alignment.tsv`: the native source
alignment for the two `millturn` transition rows. It proves the generated
`M428/M429` transition contract still matches the native probe stdout for
switchkins output/target, G5x, offset pocket, and `M428 -> M128` /
`M429 -> M129` calls, while remaining pending and non-executing.
- `user-m-process-native-runtime-state-plan.tsv`: the pending native runnable
state-probe contract for `millturn`. It records the required LinuxCNC
task/HAL/Tcl user-M runtime, the HAL/INI environment, and exact
`ini.[xyz].*` values that a future runtime probe must observe after the
transitions, while keeping `execution_enabled=0` and `promotion_allowed=0`.
- `user-m-process-native-runtime-readiness.tsv`: the host capability gate for
that future native probe. It records whether `tclsh`, `halrun`, `halcmd`,
and `linuxcnc` are available on PATH and keeps the boundary pending and
non-promotable regardless of host readiness.
- `user-m-process-native-runtime-probe-gate.tsv`: the generated execution gate
for that future native probe. It records per-transition runtime readiness,
missing host commands, source-proof readiness, and the pending gate status.
The native `probe_millturn_user_m_runtime.sh` entry point reports
`skipped_missing_host_runtime` on hosts without the full LinuxCNC HAL/Tcl
runtime, `ready_disabled_by_default` when the host is ready but the guarded
runtime probe is not explicitly enabled, or `runtime_state_probe_passed` when
`ENABLE_MILLTURN_USER_M_RUNTIME_PROBE=1` proves the LinuxCNC-owned
`M128`/`M129` Tcl scripts update the expected `ini.[xyz].*` HAL pins.
command set and does not enable execution or promotion.
- `tool-db-process-boundary-summary.tsv`: one row for each designed-but-still-blocked
tool database process boundary. It currently records `db_nonran.py`,
LinuxCNC tooldata protocol messages, DB program callbacks, nonrandom tool
database state targets, and runtime owner evidence, while requiring
`execution_enabled=0` and `promotion_allowed=0`.
- `tool-db-process-transaction-plan.tsv`: the pending non-executing transaction
contract for the `db_demo` tool database boundary. It orders startup
handshake, get-all, spindle load notify, tool offset notify, and spindle
unload notify steps, binds each protocol message to the expected `db.py`
callback and state targets, and still requires `execution_enabled=0` and
`promotion_allowed=0`.
- `tool-db-process-native-runtime-readiness.tsv`: the host capability gate for
the guarded native DB process protocol probe. It records whether `python3`,
`linuxcnc`, `milltask`, `halcmd`, the configured `db_nonran.py`, and
LinuxCNC's `linuxcnc.so` / `tooldb.py` Python modules are available, while
keeping the DB boundary pending and non-promotable. The native
`probe_tool_db_runtime.sh` entry point reports `skipped_missing_host_runtime`
when the host runtime is unavailable, `ready_disabled_by_default` when it is
available but not explicitly enabled, or `runtime_protocol_probe_passed` when
`ENABLE_TOOL_DB_RUNTIME_PROBE=1` proves the LinuxCNC-owned `DB_PROGRAM`
`v2.1`/`g`/`p`/`l`/`u` protocol, nonrandom state updates, and flat-file
persistence.
- `python-remap-boundary-summary.tsv`: one row for each `L4-PYTHON-REMAP`
path. It records Python modules, remap/prolog/epilog functions, NGC-only
subpaths, HAL/UI/HALUI assumptions, the LinuxCNC Python owner set, LinuxCNC
Python runtime owner evidence, and requires `execution_enabled=0`.
- `python-remap-family-summary.tsv`: one row per blocked Python-remap runtime
family. It aggregates row and INI counts plus Python module,
remap/prolog/epilog, NGC-only subpath, Python runtime owner evidence,
HAL/UI/HALUI, and `execution_enabled=0` evidence without vendoring or
executing those families.
- `python-remap-runtime-contract.tsv`: one row per blocked Python-remap runtime
family. It records LinuxCNC-owned Python runtime phases, Python modules,
remap/prolog/epilog callables, NGC-only subpaths, HAL/UI/HALUI assumptions,
native/Node/browser proof requirements, and keeps `proof_status=pending`,
`execution_enabled=0`, and `promotion_allowed=0`.
- `python-remap-native-runtime-readiness.tsv`: the host/source capability gate
for guarded native Python-remap runtime probes. It records `python3`,
`linuxcnc`, LinuxCNC's Python interpreter/plugin owner source files, and the
configured Python modules for each blocked family, while keeping every row
pending, non-executing, and non-promotable.
- `python-remap-native-runtime-state-plan.tsv`: one row per blocked
Python-remap family. It records the runtime phases, modules, callables,
NGC-only subpaths, process assumptions, readiness counts, source-alignment
inputs, and exact future native state-probe targets while keeping every row
pending, non-executing, and non-promotable.
- `python-remap-native-runtime-fixture-plan.tsv`: the first non-executing
Python runtime fixture plan. It selects
`axis/remap/stop-lookahead/nc_files` as the minimal lifecycle fixture because
it has Python modules and runtime phases without Python callable or NGC-only
subpath complexity, and keeps execution/promotion disabled. The native
`probe_python_remap_runtime.sh` entry point reports
`skipped_missing_host_runtime` without the host runtime,
`ready_disabled_by_default` when the host is ready but the probe is not
explicitly enabled, or `runtime_lifecycle_probe_passed` when
`ENABLE_PYTHON_REMAP_RUNTIME_PROBE=1` proves the `demo.ini`
path/toplevel import, `queuebuster` callable lookup, generator return, and
first `INTERP_EXECUTE_FINISH` yield.
- `runtime-boundary-contract-summary.tsv`: one row per blocked runtime boundary
class. It unifies the user-M transition contract, tool DB transaction
contract, and Python runtime contract with their native-alignment artifact,
and requires every contract row to remain pending with execution and
promotion disabled.
- `boundary-phase-completion-summary.tsv`: one row per boundary-phase
completion criterion. It requires vendored INI boundary reports, dependency
evidence for hard blocks, safe HAL/UI representative coverage, blocked
families remaining skipped/non-representative with execution disabled, and
LinuxCNC-owned runtime proof fields for user-M, tool DB, and Python runtime
blockers. When native source proof is available, it also requires that proof
to be consumed by generated worklist/native proof-gate rows without enabling
execution or promotion.
- `native-proof-alignment-summary.tsv`: one row per native source proof class.
It aligns the native source proof summary with generated worklist/native
proof-gate consumers for user-M, tool DB, and Python runtime blockers.
- `next-boundary-worklist.tsv`: one row per next blocked runtime-boundary
design target. It keeps execution and promotion disabled, records the
LinuxCNC owner set and runtime owner evidence, records native, Node, and
browser proof requirements, and names the next boundary-design action before
any blocked family can be promoted.
## Summary
| Class | Count |
| --- | --- |
| `main` | `48` |
| `macro_load` | `46` |
| `remap_subroutine` | `65` |
## Family Summary
| Family | Count |
| --- | --- |
| `axis/db_demo` | `1` |
| `axis/external_offsets` | `6` |
| `axis/foam` | `1` |
| `axis/geometry` | `1` |
| `axis/gladevcp` | `1` |
| `axis/laser` | `3` |
| `axis/lathe-fanucy` | `1` |
| `axis/remap` | `29` |
| `axis/rose_engine` | `2` |
| `axis/vismach` | `57` |
| `gmoccapy/lathe_configs` | `8` |
| `gmoccapy/macros` | `25` |
| `gmoccapy/non_trivial_kinematics` | `5` |
| `gscreen/industrial_lathe_wear` | `1` |
| `gscreen/silverdragon` | `4` |
| `qtaxis/non-trivial` | `3` |
| `qtdragon/qtdragon_multi_joint` | `1` |
| `qtdragon/qtdragon_xyz` | `1` |
| `qtdragon/qtdragon_xyz45` | `1` |
| `qtdragon_hd/qtdragon_hd_xyz` | `1` |
| `qtdragon_hd/qtdragon_hd_z_compensation` | `1` |
| `qtvcp_screens/industrial_lathe_wear` | `1` |
| `qtvcp_screens/non-trivial` | `3` |
| `qtvcp_screens/qtdragon` | `1` |
| `woodpecker` | `1` |
## Program Matrix
| Path | Family | Class | Native | Expected Failure | Layer 3 | Layer 4 Node | Layer 4 Browser | Blocked | Notes |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| `axis/db_demo/base.ngc` | `axis/db_demo` | `main` | `PASS` | `-` | `-` | `-` | `-` | `L4-TOOL-DB` | native pass, but Node/browser inventory is blocked by the LinuxCNC tool-database process boundary declared by `[EMCIO]DB_PROGRAM` |
| `axis/external_offsets/circles.ngc` | `axis/external_offsets` | `macro_load` | `PASS` | `-` | `SIM-EOFF` | `REP` | `REP` | `-` | Layer 4 macro-only class representative now covered through wrapped execution with native staging inputs |
| `axis/external_offsets/dyn_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/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/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/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/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/laser/raster_test.ngc` | `axis/laser` | `main` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `axis/laser/vector_test.ngc` | `axis/laser` | `main` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `axis/laser/vector_test2.ngc` | `axis/laser` | `main` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `axis/lathe-fanucy/toolchange.ngc` | `axis/lathe-fanucy` | `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/remap/cycle/nc_files/examples.ngc` | `axis/remap` | `main` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native baseline pass, but Layer 4 full inventory is blocked by Python remap/prolog/epilog runtime boundaries; remap subroutine assets remain `ASSET-ONLY` |
| `axis/remap/cycle/nc_subroutines/g843.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/extend-builtins/nc_files/examples.ngc` | `axis/remap` | `main` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native baseline pass, but Layer 4 full inventory is blocked by Python prolog/epilog remap runtime boundaries; remap subroutine assets remain `ASSET-ONLY` |
| `axis/remap/extend-builtins/nc_subroutines/change.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/extend-builtins/nc_subroutines/extend_m0.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/extend-builtins/nc_subroutines/extend_m1.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/extend-builtins/nc_subroutines/extend_m60.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/extend-builtins/nc_subroutines/extend_m7.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/extend-builtins/nc_subroutines/extend_m8.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/extend-builtins/nc_subroutines/extend_m9.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/extend-builtins/nc_subroutines/prepare.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/extend-builtins/nc_subroutines/setfeed.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/extend-builtins/nc_subroutines/setspeed.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/extend-builtins/nc_subroutines/settool.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/getting-started/nc_files/examples.ngc` | `axis/remap` | `main` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native baseline pass, but Layer 4 full inventory is blocked by Python remap handlers such as `G88.1`; remap subroutine assets remain `ASSET-ONLY` |
| `axis/remap/getting-started/nc_subroutines/change_min.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/getting-started/nc_subroutines/m400.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/getting-started/nc_subroutines/m410.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/getting-started/nc_subroutines/prepare_min.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/manual-toolchange-with-tool-length-switch/nc_files/tcdemo.ngc` | `axis/remap` | `main` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native baseline pass, but Layer 4 full inventory is blocked by Python tool-change prolog/epilog runtime boundaries; remap subroutine assets remain `ASSET-ONLY` |
| `axis/remap/manual-toolchange-with-tool-length-switch/nc_subroutines/manual_change.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/manual-toolchange-with-tool-length-switch/nc_subroutines/on_abort.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/manual-toolchange-with-tool-length-switch/nc_subroutines/restore.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_files/tcdemo.ngc` | `axis/remap` | `main` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native baseline pass, but Layer 4 full inventory is blocked by Python tool-change prolog/epilog runtime boundaries; remap subroutine assets remain `ASSET-ONLY` |
| `axis/remap/rack-toolchange/nc_subroutines/on_abort.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/rack_change.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/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_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; browser class coverage is represented by other plain INI/tool-table samples |
| `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/429remap.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/430remap.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/table-dual-rotary/demos/xyzab-tdr-demo.ngc` | `axis/vismach` | `main` | `PASS` | `-` | `5AX-EXEC` | `REP` | `REP` | `-` | TDR five-axis remap class covered in Node and browser through vendored INI, tool-table, remap-subroutine, and demo staging |
| `axis/vismach/5axis/table-dual-rotary/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/table-dual-rotary/remap_subs/429remap.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/table-rotary-tilting/demos/boat-xyzac.ngc` | `axis/vismach` | `main` | `PASS` | `-` | `5AX-EXEC` | `REP` | `REP` | `-` | TRT five-axis remap class covered in Node and browser through vendored INI, tool-table, remap-subroutine, and demo staging |
| `axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzbc.ngc` | `axis/vismach` | `main` | `PASS` | `-` | `5AX-EXEC` | `REP` | `REP` | `-` | TRT five-axis remap class covered in Node and browser through vendored INI, tool-table, remap-subroutine, and demo staging |
| `axis/vismach/5axis/table-rotary-tilting/demos/impeller-7bl-xyzac.ngc` | `axis/vismach` | `main` | `PASS` | `-` | `5AX-EXEC` | `REP` | `REP` | `-` | TRT five-axis remap class covered in Node and browser through vendored INI, tool-table, remap-subroutine, and demo staging |
| `axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins.ngc` | `axis/vismach` | `main` | `PASS` | `-` | `5AX-EXEC` | `REP` | `REP` | `-` | TRT five-axis remap class covered in Node and browser through vendored INI, tool-table, remap-subroutine, and demo staging |
| `axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_1.ngc` | `axis/vismach` | `main` | `PASS` | `-` | `5AX-EXEC` | `REP` | `REP` | `-` | TRT five-axis remap class covered in Node and browser through vendored INI, tool-table, remap-subroutine, and demo staging |
| `axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_2.ngc` | `axis/vismach` | `main` | `PASS` | `-` | `5AX-EXEC` | `REP` | `REP` | `-` | TRT five-axis remap class covered in Node and browser through vendored INI, tool-table, remap-subroutine, and demo staging |
| `axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_3.ngc` | `axis/vismach` | `main` | `PASS` | `-` | `5AX-EXEC` | `REP` | `REP` | `-` | TRT five-axis remap class covered in Node and browser through vendored INI, tool-table, remap-subroutine, and demo staging |
| `axis/vismach/5axis/table-rotary-tilting/demos/xyzbc_switchkins.ngc` | `axis/vismach` | `main` | `PASS` | `-` | `5AX-EXEC` | `REP` | `REP` | `-` | TRT five-axis remap class covered in Node and browser through vendored INI, tool-table, remap-subroutine, and demo staging |
| `axis/vismach/5axis/table-rotary-tilting/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/table-rotary-tilting/remap_subs/429remap.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/table-rotary-tilting/remap_subs/430remap.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/table-rotary-tilting/remap_subs/centering.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/table-rotary-tilting/remap_subs/helix_ac.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/table-rotary-tilting/remap_subs/helix_bc.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/table-rotary-tilting/remap_subs/xyzac_switchkins_sub.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/table-rotary-tilting/remap_subs/xyzbc_switchkins_sub.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/table-rotary_spindle-rotary-nutating/demos/circular_pocket.ngc` | `axis/vismach` | `main` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass, but Layer 4 full inventory is blocked on Python remap entry points such as g682, g69_core, and g53x_core |
| `axis/vismach/5axis/table-rotary_spindle-rotary-nutating/demos/incremental_repetition.ngc` | `axis/vismach` | `main` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass, but Layer 4 full inventory is blocked on Python remap entry points such as g682, g69_core, and g53x_core |
| `axis/vismach/5axis/table-rotary_spindle-rotary-nutating/demos/incremental_repetition_back_and_forth.ngc` | `axis/vismach` | `main` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass, but Layer 4 full inventory is blocked on Python remap entry points such as g682, g69_core, and g53x_core |
| `axis/vismach/5axis/table-rotary_spindle-rotary-nutating/demos/incremental_repetition_g533.ngc` | `axis/vismach` | `main` | `FAIL` | `upstream-demo-missing-motion-gcode` | `-` | `-` | `-` | `UPSTREAM-DEMO` | preserve upstream demo failure; do not force PASS |
| `axis/vismach/5axis/table-rotary_spindle-rotary-nutating/demos/simple_example.ngc` | `axis/vismach` | `main` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass, but Layer 4 full inventory is blocked on Python remap entry points such as g682, g69_core, and g53x_core |
| `axis/vismach/5axis/table-rotary_spindle-rotary-nutating/demos/square.ngc` | `axis/vismach` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass, but Layer 4 full inventory is blocked on Python remap entry points such as g682, g69_core, and g53x_core |
| `axis/vismach/5axis/table-rotary_spindle-rotary-nutating/remap_subs/428remap.ngc` | `axis/vismach` | `remap_subroutine` | `PASS` | `-` | `-` | `N/A` | `N/A` | `ASSET-ONLY` | subroutine asset; validate by parse/remap path rather than standalone main-program execution |
| `axis/vismach/5axis/table-rotary_spindle-rotary-nutating/remap_subs/429remap.ngc` | `axis/vismach` | `remap_subroutine` | `PASS` | `-` | `-` | `N/A` | `N/A` | `ASSET-ONLY` | subroutine asset; validate by parse/remap path rather than standalone main-program execution |
| `axis/vismach/5axis/table-rotary_spindle-rotary-nutating/remap_subs/430remap.ngc` | `axis/vismach` | `remap_subroutine` | `PASS` | `-` | `-` | `N/A` | `N/A` | `ASSET-ONLY` | subroutine asset; validate by parse/remap path rather than standalone main-program execution |
| `axis/vismach/5axis/table-rotary_spindle-rotary-nutating/remap_subs/g531remap.ngc` | `axis/vismach` | `remap_subroutine` | `PASS` | `-` | `-` | `N/A` | `N/A` | `ASSET-ONLY` | subroutine asset; validate by parse/remap path rather than standalone main-program execution |
| `axis/vismach/5axis/table-rotary_spindle-rotary-nutating/remap_subs/g533remap.ngc` | `axis/vismach` | `remap_subroutine` | `PASS` | `-` | `-` | `N/A` | `N/A` | `ASSET-ONLY` | subroutine asset; validate by parse/remap path rather than standalone main-program execution |
| `axis/vismach/5axis/table-rotary_spindle-rotary-nutating/remap_subs/g536remap.ngc` | `axis/vismach` | `remap_subroutine` | `PASS` | `-` | `-` | `N/A` | `N/A` | `ASSET-ONLY` | subroutine asset; validate by parse/remap path rather than standalone main-program execution |
| `axis/vismach/5axis/table-rotary_spindle-rotary-nutating/remap_subs/g69remap.ngc` | `axis/vismach` | `remap_subroutine` | `PASS` | `-` | `-` | `N/A` | `N/A` | `ASSET-ONLY` | subroutine asset; validate by parse/remap path rather than standalone main-program execution |
| `axis/vismach/5axis/table-rotary_spindle-rotary-nutating/remap_subs/on_abort_no_twp_reset.ngc` | `axis/vismach` | `remap_subroutine` | `PASS` | `-` | `-` | `N/A` | `N/A` | `ASSET-ONLY` | subroutine asset; validate by parse/remap path rather than standalone main-program execution |
| `axis/vismach/5axis/table-rotary_spindle-rotary-nutating/remap_subs/on_abort_with_twp_reset.ngc` | `axis/vismach` | `remap_subroutine` | `PASS` | `-` | `-` | `N/A` | `N/A` | `ASSET-ONLY` | subroutine asset; validate by parse/remap path rather than standalone main-program execution |
| `axis/vismach/VMC_toolchange/toolchange.ngc` | `axis/vismach` | `main` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native baseline pass, but Layer 4 full inventory is blocked by Python tool-change prolog/epilog and full tool-change runtime boundaries |
| `axis/vismach/hexapod-sim/remap_subs/428remap.ngc` | `axis/vismach` | `remap_subroutine` | `PASS` | `-` | `-` | `N/A` | `N/A` | `ASSET-ONLY` | subroutine asset; validate by parse/remap path rather than standalone main-program execution |
| `axis/vismach/hexapod-sim/remap_subs/429remap.ngc` | `axis/vismach` | `remap_subroutine` | `PASS` | `-` | `-` | `N/A` | `N/A` | `ASSET-ONLY` | subroutine asset; validate by parse/remap path rather than standalone main-program execution |
| `axis/vismach/hexapod-sim/remap_subs/430remap.ngc` | `axis/vismach` | `remap_subroutine` | `PASS` | `-` | `-` | `N/A` | `N/A` | `ASSET-ONLY` | subroutine asset; validate by parse/remap path rather than standalone main-program execution |
| `axis/vismach/melfa-sim/example.ngc` | `axis/vismach` | `main` | `PASS` | `-` | `-` | `REP` | `REP` | `-` | robot/Genser-style remap machine class representative covered in Node and browser through vendored INI, tool-table, and remap-subroutine staging |
| `axis/vismach/melfa-sim/remap_subs/428remap.ngc` | `axis/vismach` | `remap_subroutine` | `PASS` | `-` | `-` | `N/A` | `N/A` | `ASSET-ONLY` | subroutine asset; validate by parse/remap path rather than standalone main-program execution |
| `axis/vismach/melfa-sim/remap_subs/429remap.ngc` | `axis/vismach` | `remap_subroutine` | `PASS` | `-` | `-` | `N/A` | `N/A` | `ASSET-ONLY` | subroutine asset; validate by parse/remap path rather than standalone main-program execution |
| `axis/vismach/melfa-sim/remap_subs/430remap.ngc` | `axis/vismach` | `remap_subroutine` | `PASS` | `-` | `-` | `N/A` | `N/A` | `ASSET-ONLY` | subroutine asset; validate by parse/remap path rather than standalone main-program execution |
| `axis/vismach/millturn/example.ngc` | `axis/vismach` | `main` | `PASS` | `-` | `-` | `-` | `-` | `L4-USER-M-PROCESS` | native pass, but Node/browser inventory is blocked by external `USER_M_PATH` process M-codes `M128` and `M129` rather than the deterministic `M110`/`M111` boundary already modeled by the standalone runtime |
| `axis/vismach/millturn/remap_subs/428remap.ngc` | `axis/vismach` | `remap_subroutine` | `PASS` | `-` | `-` | `N/A` | `N/A` | `ASSET-ONLY` | subroutine asset; validate by parse/remap path rather than standalone main-program execution |
| `axis/vismach/millturn/remap_subs/429remap.ngc` | `axis/vismach` | `remap_subroutine` | `PASS` | `-` | `-` | `N/A` | `N/A` | `ASSET-ONLY` | subroutine asset; validate by parse/remap path rather than standalone main-program execution |
| `axis/vismach/puma/puma_cube.ngc` | `axis/vismach` | `main` | `PASS` | `-` | `-` | `REP` | `REP` | `-` | PUMA kinematics/remap machine class representative covered in Node and browser through vendored INI, tool-table, and remap-subroutine staging |
| `axis/vismach/puma/puma_seam_weld.ngc` | `axis/vismach` | `main` | `PASS` | `-` | `-` | `INV` | `-` | `-` | Node inventory covered with the same vendored puma machine context; browser class coverage is represented by `puma_cube.ngc` |
| `axis/vismach/puma/remap_subs/428remap.ngc` | `axis/vismach` | `remap_subroutine` | `PASS` | `-` | `-` | `N/A` | `N/A` | `ASSET-ONLY` | subroutine asset; validate by parse/remap path rather than standalone main-program execution |
| `axis/vismach/puma/remap_subs/429remap.ngc` | `axis/vismach` | `remap_subroutine` | `PASS` | `-` | `-` | `N/A` | `N/A` | `ASSET-ONLY` | subroutine asset; validate by parse/remap path rather than standalone main-program execution |
| `axis/vismach/puma/remap_subs/430remap.ngc` | `axis/vismach` | `remap_subroutine` | `PASS` | `-` | `-` | `N/A` | `N/A` | `ASSET-ONLY` | subroutine asset; validate by parse/remap path rather than standalone main-program execution |
| `axis/vismach/scara/remap_subs/428remap.ngc` | `axis/vismach` | `remap_subroutine` | `PASS` | `-` | `-` | `N/A` | `N/A` | `ASSET-ONLY` | subroutine asset; validate by parse/remap path rather than standalone main-program execution |
| `axis/vismach/scara/remap_subs/429remap.ngc` | `axis/vismach` | `remap_subroutine` | `PASS` | `-` | `-` | `N/A` | `N/A` | `ASSET-ONLY` | subroutine asset; validate by parse/remap path rather than standalone main-program execution |
| `axis/vismach/scara/remap_subs/430remap.ngc` | `axis/vismach` | `remap_subroutine` | `PASS` | `-` | `-` | `N/A` | `N/A` | `ASSET-ONLY` | subroutine asset; validate by parse/remap path rather than standalone main-program execution |
| `gmoccapy/lathe_configs/boring.ngc` | `gmoccapy/lathe_configs` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `gmoccapy/lathe_configs/chamfer.ngc` | `gmoccapy/lathe_configs` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `gmoccapy/lathe_configs/drilling.ngc` | `gmoccapy/lathe_configs` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `gmoccapy/lathe_configs/facing.ngc` | `gmoccapy/lathe_configs` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `gmoccapy/lathe_configs/grooving.ngc` | `gmoccapy/lathe_configs` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `gmoccapy/lathe_configs/radius.ngc` | `gmoccapy/lathe_configs` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `gmoccapy/lathe_configs/threading.ngc` | `gmoccapy/lathe_configs` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `gmoccapy/lathe_configs/turning.ngc` | `gmoccapy/lathe_configs` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `gmoccapy/macros/change.ngc` | `gmoccapy/macros` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `gmoccapy/macros/change_g43.ngc` | `gmoccapy/macros` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `gmoccapy/macros/go_to_position.ngc` | `gmoccapy/macros` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `gmoccapy/macros/halo_world.ngc` | `gmoccapy/macros` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `gmoccapy/macros/i_am_lost.ngc` | `gmoccapy/macros` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `gmoccapy/macros/increment.ngc` | `gmoccapy/macros` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `gmoccapy/macros/jog_around.ngc` | `gmoccapy/macros` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `gmoccapy/macros/macro_0.ngc` | `gmoccapy/macros` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `gmoccapy/macros/macro_1.ngc` | `gmoccapy/macros` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `gmoccapy/macros/macro_10.ngc` | `gmoccapy/macros` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `gmoccapy/macros/macro_11.ngc` | `gmoccapy/macros` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `gmoccapy/macros/macro_12.ngc` | `gmoccapy/macros` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `gmoccapy/macros/macro_13.ngc` | `gmoccapy/macros` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `gmoccapy/macros/macro_14.ngc` | `gmoccapy/macros` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `gmoccapy/macros/macro_15.ngc` | `gmoccapy/macros` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `gmoccapy/macros/macro_2.ngc` | `gmoccapy/macros` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `gmoccapy/macros/macro_3.ngc` | `gmoccapy/macros` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `gmoccapy/macros/macro_4.ngc` | `gmoccapy/macros` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `gmoccapy/macros/macro_5.ngc` | `gmoccapy/macros` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `gmoccapy/macros/macro_6.ngc` | `gmoccapy/macros` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `gmoccapy/macros/macro_7.ngc` | `gmoccapy/macros` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `gmoccapy/macros/macro_8.ngc` | `gmoccapy/macros` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `gmoccapy/macros/macro_9.ngc` | `gmoccapy/macros` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `gmoccapy/macros/on_abort.ngc` | `gmoccapy/macros` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `gmoccapy/macros/settool_g43.ngc` | `gmoccapy/macros` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `gmoccapy/non_trivial_kinematics/table-rotary-tilting/examples/boat-xyzac.ngc` | `gmoccapy/non_trivial_kinematics` | `main` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `gmoccapy/non_trivial_kinematics/table-rotary-tilting/examples/boat-xyzbc.ngc` | `gmoccapy/non_trivial_kinematics` | `main` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `gmoccapy/non_trivial_kinematics/table-rotary-tilting/examples/impeller-7bl-xyzac.ngc` | `gmoccapy/non_trivial_kinematics` | `main` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `gmoccapy/non_trivial_kinematics/table-rotary-tilting/examples/test-xyzac.ngc` | `gmoccapy/non_trivial_kinematics` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `gmoccapy/non_trivial_kinematics/table-rotary-tilting/examples/test-xyzbc.ngc` | `gmoccapy/non_trivial_kinematics` | `macro_load` | `PASS` | `-` | `-` | `-` | `-` | `L4-PYTHON-REMAP` | native pass; Layer 4 is blocked until the Python-remap runtime boundary is deliberately designed |
| `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/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 |
| `qtaxis/non-trivial/scara/remap_subs/430remap.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 |
| `qtdragon/qtdragon_multi_joint/on_abort.ngc` | `qtdragon/qtdragon_multi_joint` | `main` | `PASS` | `-` | `-` | `INV` | `-` | `-` | vendored INI/tool-table now allow Node inventory coverage; browser representative still delegated to the shared `woodpecker/on_abort.ngc` class sample |
| `qtdragon/qtdragon_xyz/on_abort.ngc` | `qtdragon/qtdragon_xyz` | `main` | `PASS` | `-` | `-` | `INV` | `-` | `-` | vendored INI/tool-table now allow Node inventory coverage; browser representative still delegated to the shared `woodpecker/on_abort.ngc` class sample |
| `qtdragon/qtdragon_xyz45/on_abort.ngc` | `qtdragon/qtdragon_xyz45` | `main` | `PASS` | `-` | `-` | `INV` | `-` | `-` | vendored INI/tool-table now allow Node inventory coverage; browser representative still delegated to the shared `woodpecker/on_abort.ngc` class sample |
| `qtdragon_hd/qtdragon_hd_xyz/on_abort.ngc` | `qtdragon_hd/qtdragon_hd_xyz` | `main` | `PASS` | `-` | `-` | `INV` | `-` | `-` | vendored INI/tool-table now allow Node inventory coverage; browser representative still delegated to the shared `woodpecker/on_abort.ngc` class sample |
| `qtdragon_hd/qtdragon_hd_z_compensation/on_abort.ngc` | `qtdragon_hd/qtdragon_hd_z_compensation` | `main` | `PASS` | `-` | `-` | `INV` | `-` | `-` | vendored INI/tool-table now allow Node inventory coverage; browser representative still delegated to the shared `woodpecker/on_abort.ngc` class sample |
| `qtvcp_screens/industrial_lathe_wear/toolchange.ngc` | `qtvcp_screens/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 |
| `qtvcp_screens/non-trivial/scara/remap_subs/428remap.ngc` | `qtvcp_screens/non-trivial` | `remap_subroutine` | `PASS` | `-` | `-` | `N/A` | `N/A` | `ASSET-ONLY` | subroutine asset; validate by parse/remap path rather than standalone main-program execution |
| `qtvcp_screens/non-trivial/scara/remap_subs/429remap.ngc` | `qtvcp_screens/non-trivial` | `remap_subroutine` | `PASS` | `-` | `-` | `N/A` | `N/A` | `ASSET-ONLY` | subroutine asset; validate by parse/remap path rather than standalone main-program execution |
| `qtvcp_screens/non-trivial/scara/remap_subs/430remap.ngc` | `qtvcp_screens/non-trivial` | `remap_subroutine` | `PASS` | `-` | `-` | `N/A` | `N/A` | `ASSET-ONLY` | subroutine asset; validate by parse/remap path rather than standalone main-program execution |
| `qtvcp_screens/qtdragon/on_abort.ngc` | `qtvcp_screens/qtdragon` | `main` | `PASS` | `-` | `-` | `INV` | `-` | `-` | vendored INI/tool-table now allow Node inventory coverage; browser representative still delegated to the shared `woodpecker/on_abort.ngc` class sample |
| `woodpecker/on_abort.ngc` | `woodpecker` | `main` | `PASS` | `-` | `-` | `REP` | `REP` | `-` | Layer 4 deterministic on_abort class representative now covered |

View File

@@ -41,7 +41,8 @@ Current validation is intentionally mechanical:
| Switchable 5-axis bridge kinematics | `src/emc/kinematics/5axiskins.c`, `switchkins.c`, `switchkins.h`, `userkfuncs.c`, plus `src/rtapi/rtapi_ctype.h` | Copy unchanged | HAL pin allocation, HAL component lifecycle, and RTAPI module metadata are standalone runtime edges; switchable 5-axis forward/inverse behavior remains LinuxCNC source | Vendor byte sync, per-file source probes, `linuxcnc_5axis_kinematics_probe` |
| TRT table-rotary kinematics | `src/emc/kinematics/trtfuncs.c`, `xyzac-trt-kins.c`, `xyzbc-trt-kins.c` | Copy unchanged | HAL pin allocation and switchkins lifecycle stay runtime boundaries; XYZAC/XYZBC TRT forward/inverse behavior remains LinuxCNC source | Vendor byte sync, per-file source probes, `linuxcnc_xyzac_trt_kinematics_probe`, `linuxcnc_xyzbc_trt_kinematics_probe` |
| Five-axis switchkins machine configs and M428/M429/M430 remaps | `configs/sim/axis/vismach/5axis/bridgemill/*`, `table-dual-rotary/*`, and `table-rotary-tilting/*` selected INI, HAL, tool-table, XML, demo, and `remap_subs/*.ngc` files plus `src/emc/rs274ngc/interp_remap.cc` | Copy unchanged | `M428`, `M429`, and `M430` remain LinuxCNC `REMAP` entries that call LinuxCNC NGC subroutines using `M68`, `M66`, `_hal[motion.switchkins-type]`, and the INI/HAL `motion.analog-out-03 => motion.switchkins-type` link; standalone remap descriptor parsing routes through vendored `Interp::parse_remap()` and `find_ngc_file()`, and NGC remap/file execution routes through vendored LinuxCNC O-word and `open()`/`read()`/`execute()` paths while HAL synchronization stays a runtime adapter boundary | Vendor byte sync, `linuxcnc_5axis_remap_asset_probe`, `linuxcnc_remap_parse_harness`, `linuxcnc_remap_hal_sync_harness`, `linuxcnc_5axis_remap_execute_harness`, `tests/wasm/node/verify_interp_wasm.sh`, `tests/wasm/node/verify_sim_configs_wasm.sh`, `tests/browser/verify_interp_browser.sh`, `tests/browser/verify_ini_panel_browser.sh` |
| Representative sim-config machine programs | `configs/sim/axis/foam/*`, `configs/sim/axis/geometry/M110`, `xyzc.ini`, `xyzc.ngc`, `configs/sim/axis/external_offsets/M111`, `dyn_demo.ngc`, `dynamic_offsets.ini`, `eoffsets.ngc`, `eoffsets.ini`, `jwp_z.ngc`, `jwp_z.ini`, `opa_demo.ngc`, `opa.ini`, `circles.ngc`, `eoffset.tbl`, and `configs/sim/axis/sim.tbl` | Copy unchanged | The `foam`, `xyzc`, and external-offset sample programs remain LinuxCNC sim-config assets. The standalone boundary only copies INI, tool table, G-code, executable user-M files, `SUBROUTINE_PATH` files, and remap-NGC files into the native or WASM filesystem, then calls vendored LinuxCNC INI parsing and `Interp::open()`/`read()`/`execute()` through the existing machine-config adapter. The native sim-config harness now prefers `[DISPLAY]OPEN_FILE` when several INI files live beside a program, so each program is judged with its corresponding machine context. The JS SDK `planIniFileContextStaging()` is a generic manifest-based file-plan helper, `planSimConfigStaging()` is its `configs/sim` wrapper, and `runSimConfigProgram()` only writes caller-provided text files to the Emscripten filesystem, applies executable bits, and forwards to LinuxCNC-backed C ABI entry points. `M110`/`M111` process execution stays a runtime boundary represented by deterministic `USER_M_COMMAND` canonical events | Vendor byte sync, `tests/native/verify_sim_configs.sh`, `tests/wasm/node/verify_sim_configs_wasm.sh`, `tests/browser/verify_interp_browser.sh` |
| Representative sim-config machine programs | `configs/sim/axis/foam/*`, `configs/sim/axis/geometry/M110`, `xyzc.ini`, `xyzc.ngc`, `configs/sim/axis/external_offsets/M111`, `dyn_demo.ngc`, `dynamic_offsets.ini`, `eoffsets.ngc`, `eoffsets.ini`, `jwp_z.ngc`, `jwp_z.ini`, `opa_demo.ngc`, `opa.ini`, `circles.ngc`, `eoffset.tbl`, `configs/sim/axis/sim.tbl`, `configs/sim/axis/gladevcp/gladevcp_panel.ini`, `probe.ngc`, `sim.tbl`, `configs/sim/axis/vismach/melfa-sim/*`, selected `configs/sim/axis/vismach/puma/*`, and `configs/sim/woodpecker/on_abort.ngc`, `tool.tbl`, `woodpecker.ini` | Copy unchanged | The `foam`, `xyzc`, external-offset, plain `gladevcp/probe.ngc`, `melfa-sim`, PUMA, and deterministic `woodpecker/on_abort.ngc` sample programs remain LinuxCNC sim-config assets. The standalone boundary only copies INI, tool table, G-code, executable user-M files, `SUBROUTINE_PATH` files, and remap-NGC files into the native or WASM filesystem, then calls vendored LinuxCNC INI parsing and `Interp::open()`/`read()`/`execute()` or the existing five-axis remap execution C ABI through the machine-config adapter. The native sim-config harness now prefers `[DISPLAY]OPEN_FILE` when several INI files live beside a program, so each program is judged with its corresponding machine context. The JS SDK `planIniFileContextStaging()` is a generic manifest-based file-plan helper, `planSimConfigStaging()` is its `configs/sim` wrapper, and `runSimConfigProgram()` only writes caller-provided text files to the Emscripten filesystem, applies executable bits, and forwards to LinuxCNC-backed C ABI entry points. `M110`/`M111` process execution stays a runtime boundary represented by deterministic `USER_M_COMMAND` canonical events, while GUI driver, HAL process launch, and external userspace process startup remain outside standalone Node/browser execution. The TWP `table-rotary_spindle-rotary-nutating` demo family remains outside this representative row because its Layer 4 promotion still depends on a deliberate Python-remap runtime boundary, not on additional JS-owned staging logic. | Vendor byte sync, `tests/native/verify_sim_configs.sh`, `tests/wasm/node/verify_sim_configs_wasm.sh`, `tests/wasm/node/verify_sim_configs_inventory_wasm.sh`, `tests/browser/verify_interp_browser.sh`, `tests/host/verify_host_smokes.sh` |
| Sim-config inventory and blocked-boundary assets | Selected `configs/sim/axis/db_demo/*`, `axis/rose_engine/*`, `axis/vismach/millturn/*`, `configs/sim/qtdragon/*`, `configs/sim/qtdragon_hd/*`, and `configs/sim/qtvcp_screens/qtdragon/*` files | Copy unchanged | These assets are vendored for the machine-readable `configs/sim` Node inventory and blocked-boundary accounting. Eligible `on_abort` and plain INI/tool-table rows run through the same LinuxCNC-backed `runSimConfigProgram()` staging path as other sim-config samples. Rows such as `axis/db_demo/base.ngc` and `axis/vismach/millturn/example.ngc` remain explicit Layer 4 blocked entries because their native LinuxCNC configs depend on tool-database or external user-M process boundaries; Node/browser inventory records those dependencies instead of reducing them to standalone file execution. | Vendor byte sync, `tests/native/verify_sim_configs.sh`, `tests/wasm/node/verify_sim_configs_inventory_wasm.sh`, `tests/host/verify_host_smokes.sh` |
| Representative `nc_files` examples | `nc_files/3D_Chips.ngc`, `nc_files/arcspiral.ngc`, `nc_files/factorial.ngc`, `nc_files/hole-circle.ngc`, `nc_files/m6demo.ngc` | Copy unchanged | These upstream `linuxcnc/nc_files` examples are copied byte-for-byte into the WASM vendor tree after the native `nc_files` harness classifies the broader directory. Node and browser tests only stage the original `.ngc` text and, for `3D_Chips.ngc`, the minimal INI-declared tool table context required by its upstream `T1 M6` line in the Emscripten filesystem, then call the LinuxCNC-backed `Interp::open()`, `read()`, and `execute()` path through the existing SDK; no G-code, O-word, tool-change, or M-code behavior is implemented in JavaScript | Vendor byte sync, `tests/native/verify_nc_files.sh`, `tests/wasm/node/verify_nc_files_wasm.sh`, `tests/browser/verify_interp_browser.sh`, `tests/host/verify_host_smokes.sh` |
| LinuxCNC remap regression fixtures | `tests/remap/duplicate-o-word/*`, `tests/remap/fail/args.0/*`, `tests/remap/fail/args.1/*`, `tests/remap/fail/args.2/*`, `tests/remap/fail/body-ngc/*`, `tests/remap/m30-interaction/*`, `tests/remap/nested-remaps-oword/*`, `tests/remap/posargs.0/*`, `tests/remap/sequencing/*`, selected NGC-only `tests/remap/remap-io/test-ngc.ini` plus `io_*.ngc`, and `src/emc/rs274ngc/interp_remap.cc` plus `interp_o_word.cc` | Copy unchanged | The upstream duplicate O-word, NGC-only remap failure, M30/remap-level interaction, nested O-word remap, positional-argument remap, G/M remap sequencing, and remap-IO NGC subroutine regressions remain LinuxCNC REMAP/O-word/file or MDI execution tests. The standalone boundary only copies the upstream test files into native or WASM filesystems, reads LinuxCNC INI `SUBROUTINE_PATH`, `REMAP`, and `OWORD_NARGS` entries, and calls vendored `Interp::parse_remap()`, `open()`, `read()`, and `execute()` or feeds the upstream remap-IO MDI sequence into vendored `Interp::execute()`; the continue-on-error runner path only mirrors LinuxCNC `rs274 -n 0` test execution and does not implement duplicate-label, O-word, nested remap, M30, positional-argument, failure, sequencing, M62-M68, M66 input, or remap semantics | Vendor byte sync, `linuxcnc_duplicate_oword_remap_harness`, `tests/wasm/node/verify_interp_wasm.sh`, `tests/browser/verify_interp_browser.sh` |
| LinuxCNC interpreter regression fixtures | `tests/interp/do-while-break/*`, `tests/interp/oword-bug315/*`, `tests/interp/oword-bug315-p2/*`, `tests/interp/exists/*`, `tests/interp/return-value/*`, `tests/interp/subs-follow-main/*`, `tests/interp/fractional-linenumbers/*`, `tests/interp/cam-nisley/*`, `tests/interp/namedparam-bug424/*`, `tests/interp/flowsnake/*`, selected `tests/interp/good/*.ngc` center-format arc tolerance fixtures, `tests/interp/g6164/*`, `tests/interp/inside-corners/*`, `tests/interp/inverse-time-with-comp/*`, selected `tests/ccomp/*` standalone cutter-compensation fixtures, selected `tests/interp/bad/*.ngc` file-error fixtures, `tests/interp/g33.1/*`, selected `tests/interp/g71-*/*` and `tests/interp/g72-*/*` lathe canned-cycle fixtures, `tests/interp/g76/*`, `tests/interp/g10/*`, `tests/interp/g52/g52-g92-interaction/*`, selected `tests/interp/rotation/*` pure interpreter cases, `tests/interp/iniparam/*`, `tests/interp/iniparam-failassign/*`, `tests/interp/m19/*`, `tests/interp/magic_comments/param_format_printing/*`, selected `tests/interp/m98m99/*` pure interpreter cases, `tests/interp/sub-call-from-sub/*`, `tests/interp/sequence-number/*`, `tests/interp/nested-sub-error/*`, `tests/interp/nested-sub-in-file-error/*`, `tests/interp/oword-unwind/*`, `tests/interp/abort-hot-comment/*`, plus vendored interpreter/O-word sources including `interp_o_word.cc`, `interp_read.cc`, `interp_execute.cc`, `interp_find.cc`, `interp_namedparams.cc`, and `rs274ngc_pre.cc` | Copy unchanged | The upstream do/while/break, O-word bug315, `EXISTS[]`, subroutine return-value, subs-after-main, fractional line-number, storm-door latch cam toolpath with upstream tool-table context, named-parameter, recursive O-word flowsnake toolpath, selected center-format arc tolerance acceptance/rejection cases, `G61`/`G64` path-control and naive-cam tolerance behavior, cutter-compensation concave/convex/tangent geometry, inverse-time feed and cutter-compensation interaction, selected standalone cutter-compensation file execution with upstream tool tables, selected file-execution error cases including canned-cycle A-axis rejection, center-format arc radius mismatch rejection, cutter-compensation arc-exit/gouging rejection, and malformed `EXISTS[]`, rigid-tap `G33.1`, G71/G72 lathe canned-cycle iteration behavior, G76 lathe threading with upstream tool-table context, `G10 L1/L10/L11/L2/L20` tool-table/offset/G5X/G92/rotation regressions, G52/G92 shared-offset interaction, selected rotation/G53/G28 absolute-position and endpoint, INI named-parameter lookup/read-only protection, M19 spindle-orient offset/timeout handling, magic-comment parameter formatting, selected Fanuc `M98/M99` call, loop, missing-P-word, missing-subprogram, mixed Fanuc/RS274NGC sub-style, `DISABLE_FANUC_STYLE_SUB`, main-program O-word termination, and O-expression regressions, external-subroutine-call, external-subroutine line-number, nested-subroutine-definition rejection, blocked forward-seek-to-later-numbered-sub, O-word stack unwind after a subroutine error, `(ABORT,...)` hot-comment parameter-expansion regressions, and INI-declared G92 parameter-file startup persistence remain LinuxCNC interpreter file-execution or initialization tests. The standalone boundary only vendors the original upstream assets, copies `*.ngc`, `test.ini`, `test.tbl`, `subs/*.ngc`, referenced external subroutine `.ngc` files, and staged variable files into native or WASM filesystems where applicable, sets the LinuxCNC `INI_FILE_NAME` runtime edge for `_ini[...]`, applies LinuxCNC INI machine settings such as `[RS274NGC]ORIENT_OFFSET`, loads upstream tool tables through LinuxCNC `tooldata_load()`/`Interp::load_tool_table()`, reads LinuxCNC INI `SUBROUTINE_PATH`, passes `[RS274NGC]PARAMETER_FILE` through vendored `ini_load()`/`Interp::init()`/`restore_parameters()` when the staged variable file exists, captures LinuxCNC `(PRINT,...)` output through the existing stdout/Emscripten `print` boundary, and calls vendored `Interp::open()`, `read()`, and `execute()`; it does not implement O-word loop, break, unwind, subroutine, dynamic call, `M98/M99`, `EXISTS[]`, named-parameter, canned-cycle, cutter-compensation, inverse-time feed, recursive O-word or cam toolpath generation, path-control, naive-cam tolerance, arc tolerance, threading, rigid tap, `G10`, G52/G92 offset behavior, G92 persistence, tool-offset, absolute-position named-parameter, G28/G53 endpoint, INI-variable, read-only parameter, line-number, spindle-speed, spindle-orient, magic-comment formatting, subroutine lookup, ABORT hot-comment, error, or branch semantics | Vendor byte sync, `linuxcnc_interp_minimal_harness`, `tests/wasm/node/verify_interp_wasm.sh`, `tests/browser/verify_interp_browser.sh` |