636 lines
27 KiB
Markdown
636 lines
27 KiB
Markdown
# LinuxCNC Sim Config Completion Plan
|
|
|
|
This plan tracks the work needed to run the LinuxCNC programs under
|
|
`linuxcnc/configs/sim` through the standalone native/WASM simulation runtime.
|
|
LinuxCNC source remains the semantic source of truth. Port code must live under
|
|
`wasm-port/`; do not edit `linuxcnc/` in place.
|
|
|
|
## Current Baseline
|
|
|
|
The latest strict harness run used `linuxcnc/configs/sim` as the program source,
|
|
selected the nearest INI/tool table for each `.ngc` unless an explicit sim
|
|
mapping is required, and ran `rs274` from the INI directory so relative
|
|
`SUBROUTINE_PATH` and `REMAP` entries resolve like a real sim config.
|
|
|
|
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:
|
|
|
|
```text
|
|
total: 159
|
|
pass: 151
|
|
fail: 8
|
|
timeout: 0
|
|
expected_fail: 8
|
|
unexpected_fail: 0
|
|
|
|
main: PASS 40, FAIL 8
|
|
macro_load: PASS 46, FAIL 0
|
|
remap_subroutine: PASS 65, FAIL 0
|
|
```
|
|
|
|
Remaining failures are explicit LinuxCNC-native baseline edges:
|
|
|
|
- `axis/external_offsets/*`: 4 failures from sim-only user M-codes `M111`.
|
|
The native harness now resolves the corresponding INI by
|
|
`[DISPLAY]OPEN_FILE`, so `eoffsets.ngc`, `jwp_z.ngc`, and `opa_demo.ngc`
|
|
are no longer judged through `dynamic_offsets.ini`.
|
|
- `axis/geometry/xyzc.ngc`: 1 failure from sim-only user M-code `M110`.
|
|
- `axis/foam/foam.ngc`: 1 failure from missing `U/V` axis support in the
|
|
LinuxCNC `bin/rs274` entry point.
|
|
- `axis/vismach/5axis/bridgemill/5axisgui.ngc`: 1 failure from missing `W`
|
|
axis support in the LinuxCNC `bin/rs274` entry point.
|
|
- `axis/vismach/5axis/table-rotary_spindle-rotary-nutating/demos/incremental_repetition_g533.ngc`:
|
|
1 failure from an upstream demo line that uses bare `X/Y/Z` words after
|
|
`G53.6` without an explicit motion G-code.
|
|
|
|
## Target
|
|
|
|
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 `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.
|
|
- 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
|
|
|
|
Status: complete. The tracked script exists and is wired into the native
|
|
validation entry point.
|
|
|
|
1. Add a tracked script:
|
|
|
|
```text
|
|
wasm-port/tests/native/verify_sim_configs.sh
|
|
```
|
|
|
|
2. Move the ad hoc test logic into the script:
|
|
|
|
- scan only `linuxcnc/configs/sim`;
|
|
- identify `.ngc`, nearest `.ini`, nearest `.tbl`;
|
|
- run from the INI directory;
|
|
- 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`;
|
|
- fail the script only on unexpected failures.
|
|
|
|
3. Add deterministic classification rules:
|
|
|
|
- files under `remap_subs/` and `nc_subroutines/` are not standalone main
|
|
programs;
|
|
- files with no `M2`, `M30`, or `%` are load/parse fixtures unless the INI
|
|
references them through `REMAP`;
|
|
- user M-code files are tested through `USER_M_PATH` resolution, not by
|
|
pretending LinuxCNC native process services exist.
|
|
|
|
4. Wire the script into existing validation:
|
|
|
|
```text
|
|
wasm-port/tests/native/verify_native_probes.sh
|
|
```
|
|
|
|
5. Completion check:
|
|
|
|
```bash
|
|
wasm-port/tests/native/verify_sim_configs.sh
|
|
```
|
|
|
|
Latest result:
|
|
|
|
```text
|
|
total: 159
|
|
pass: 151
|
|
fail: 8
|
|
timeout: 0
|
|
expected_fail: 8
|
|
unexpected_fail: 0
|
|
skipped: 0
|
|
```
|
|
|
|
## Phase 2: Load Machine Axes From INI
|
|
|
|
Status: partially complete for the port runtime. The standalone native/WASM
|
|
runtime now parses `[TRAJ] COORDINATES`, updates the standalone external axis
|
|
mask used by LinuxCNC `GET_EXTERNAL_AXIS_MASK()`, and applies the same
|
|
`Interp::_readers` filtering that upstream `rs274ngc_pre.cc` uses. Native
|
|
regression coverage verifies that `axis_foam.ini` enables `U/V` readers and
|
|
`bridgemill/5axis.ini` enables the `W` reader.
|
|
|
|
The `verify_sim_configs.sh` baseline still records the LinuxCNC `bin/rs274`
|
|
entry-point failures as expected failures. That harness is intentionally kept
|
|
as a LinuxCNC-native baseline while the port runtime coverage tracks this
|
|
phase's standalone behavior.
|
|
|
|
Current failures:
|
|
|
|
- `axis/foam/foam.ngc`: `Bad character 'u' used`
|
|
- `axis/vismach/5axis/bridgemill/5axisgui.ngc`: `Bad character 'w' used`
|
|
|
|
Root cause:
|
|
|
|
The current standalone interpreter initialization does not configure the active
|
|
axis mask from `[TRAJ] COORDINATES` / `[KINS] KINEMATICS`. Native LinuxCNC
|
|
accepts `U/V/W` only when the machine config declares those axes.
|
|
|
|
Implementation steps:
|
|
|
|
1. Add a machine-config loader in `runtime/core/linuxcnc_wrap/`, for example:
|
|
|
|
```text
|
|
linuxcnc_machine_config.hh
|
|
linuxcnc_machine_config.cpp
|
|
```
|
|
|
|
2. Reuse vendored `inifile.cc` to parse:
|
|
|
|
- `[TRAJ] COORDINATES`
|
|
- `[KINS] KINEMATICS`
|
|
- `[DISPLAY] GEOMETRY`
|
|
- `[RS274NGC] PARAMETER_FILE`
|
|
- `[RS274NGC] SUBROUTINE_PATH`
|
|
- `[RS274NGC] USER_M_PATH`
|
|
- `[EMCIO] TOOL_TABLE`
|
|
|
|
3. Extend `initialize_minimal_interp()` / the runtime equivalent to set the
|
|
interpreter setup fields from the parsed machine config instead of hardcoded
|
|
`XYZ`.
|
|
|
|
4. Add focused native fixtures:
|
|
|
|
- `axis_foam.ini` + `foam.ngc` accepts `U/V`.
|
|
- `bridgemill/5axis.ini` + `5axisgui.ngc` accepts `W`.
|
|
|
|
5. Add the same coverage to the WASM SDK once native is green.
|
|
|
|
Completion check:
|
|
|
|
```bash
|
|
wasm-port/tests/native/verify_sim_configs.sh --only axis/foam/foam.ngc
|
|
wasm-port/tests/native/verify_sim_configs.sh --only axis/vismach/5axis/bridgemill/5axisgui.ngc
|
|
```
|
|
|
|
## Phase 3: Implement Standalone User M-Code Dispatch
|
|
|
|
Status: complete for the standalone native/WASM runtime boundary. The port now
|
|
reads `[DISPLAY] PROGRAM_PREFIX` and `[RS274NGC] USER_M_PATH`, searches
|
|
executable `M100` through `M199` files using the same order as LinuxCNC task
|
|
initialization, registers them in LinuxCNC's `USER_DEFINED_FUNCTION` table, and
|
|
records `USER_M_COMMAND` canonical boundary events instead of spawning host
|
|
processes. Native probes cover `axis/geometry` `M110` and
|
|
`axis/external_offsets` `M111`; Node WASM covers minimal `M110` and `M111`
|
|
fixtures through the Emscripten filesystem.
|
|
|
|
The `verify_sim_configs.sh` baseline still records these files as expected
|
|
failures because it intentionally runs LinuxCNC `bin/rs274`, not the standalone
|
|
task/runtime adapter.
|
|
|
|
Current failures:
|
|
|
|
- `axis/external_offsets/*.ngc`: unknown `M111`
|
|
- `axis/geometry/xyzc.ngc`: unknown `M110`
|
|
|
|
Root cause:
|
|
|
|
Native LinuxCNC resolves user M-codes through `[DISPLAY] PROGRAM_PREFIX` and
|
|
`[RS274NGC] USER_M_PATH` during task initialization, registers matching
|
|
executable `M100..M199` handlers with the interpreter, and later runs external
|
|
scripts through the task process boundary. The standalone runtime must register
|
|
the same interpreter boundary without running host processes in WASM/browser.
|
|
|
|
Implementation steps:
|
|
|
|
1. Locate the upstream M-code dispatch path in LinuxCNC and vendor the minimum
|
|
source needed to preserve semantics, or add a narrow runtime-edge adapter if
|
|
the upstream path is process-bound. Done: the adapter mirrors
|
|
`src/emc/task/emctask.cc` search/registration behavior and keeps process
|
|
execution outside CNC semantics.
|
|
|
|
2. Add `USER_M_PATH` parsing to the machine-config loader. Done.
|
|
|
|
3. For native standalone tests. Done:
|
|
|
|
- resolve `M100` through `M199` against configured search paths;
|
|
- register only executable files;
|
|
- emit deterministic `USER_M_COMMAND` boundary events.
|
|
|
|
4. For WASM/browser. Done for Node WASM:
|
|
|
|
- do not spawn host processes;
|
|
- use a host-boundary user-M adapter that registers deterministic
|
|
message-emitting handlers for sim-only notification M-codes;
|
|
- document this as a runtime edge, not CNC semantics.
|
|
|
|
5. Add tests. Done:
|
|
|
|
- `M110` from `axis/geometry`;
|
|
- `M111` from `axis/external_offsets`;
|
|
- minimal WASM `M110` and `M111` fixtures.
|
|
|
|
Completion check:
|
|
|
|
```bash
|
|
wasm-port/tests/native/verify_sim_configs.sh --only axis/external_offsets
|
|
wasm-port/tests/native/verify_sim_configs.sh --only axis/geometry/xyzc.ngc
|
|
```
|
|
|
|
Standalone runtime checks:
|
|
|
|
```bash
|
|
wasm-port/tests/native/verify_native_probes.sh
|
|
wasm-port/tests/wasm/node/verify_interp_wasm.sh
|
|
```
|
|
|
|
## Phase 4: Classify Python Remap Runtime Edges
|
|
|
|
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
|
|
```
|
|
|
|
Boundary:
|
|
|
|
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.
|
|
|
|
Recorded dependency:
|
|
|
|
- `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.
|
|
|
|
Current policy:
|
|
|
|
- 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: Classify TWP Remaps Including G69
|
|
|
|
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,
|
|
and 14 of the 15 TWP demo/remap programs now pass.
|
|
|
|
Current failures:
|
|
|
|
- `axis/vismach/5axis/table-rotary_spindle-rotary-nutating/demos/incremental_repetition_g533.ngc`
|
|
fails in the LinuxCNC `rs274` baseline because line 10 uses bare
|
|
`x50y50z150` after `G53.6`; same-directory demos use explicit `G0` motion
|
|
words at this point.
|
|
|
|
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
|
|
INI is in a child directory:
|
|
|
|
```text
|
|
axis/vismach/5axis/table-rotary_spindle-rotary-nutating/
|
|
xyzacb-trsrn_twp/xyzacb-trsrn.ini
|
|
xyzbca-trsrn_twp/xyzbca-trsrn.ini
|
|
```
|
|
|
|
Current policy:
|
|
|
|
- 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:
|
|
|
|
```text
|
|
total: 15
|
|
pass: 14
|
|
fail: 1
|
|
timeout: 0
|
|
expected_fail: 1
|
|
unexpected_fail: 0
|
|
skipped: 0
|
|
```
|
|
|
|
Completion check:
|
|
|
|
```bash
|
|
wasm-port/tests/native/verify_sim_configs.sh --only table-rotary_spindle-rotary-nutating
|
|
```
|
|
|
|
## Phase 6: Promote Eligible Native Coverage To WASM
|
|
|
|
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.
|
|
- `axis/vismach/5axis/bridgemill/5axisgui.ngc` with `5axis.ini`, verifying
|
|
INI-driven `W` axis mask handling and bridge-mill NGC remap execution in
|
|
WASM.
|
|
- `axis/geometry/xyzc.ngc` with `xyzc.ini` and real executable `M110`, verifying
|
|
`USER_M_PATH` registration in WASM.
|
|
- `axis/external_offsets/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,
|
|
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
|
|
```
|
|
|
|
Current Layer 4 non-goals:
|
|
|
|
- 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.
|
|
|
|
Browser inventory decision record:
|
|
|
|
- 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 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,
|
|
blocked policy, and validation commands. Done.
|
|
|
|
2. Add `docs/sim-configs-coverage-matrix.md` as the tracked review surface for
|
|
all 159 current native inventory rows. Done.
|
|
|
|
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
|
|
current representative and inventory-backed sim-config files; no
|
|
`verify_vendor_sync.sh` logic change was needed.
|
|
|
|
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: `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`.
|
|
|
|
## Layer 2 Expected-Failure Policy
|
|
|
|
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
|
|
|
|
- Do not implement a new JavaScript or project-authored G-code interpreter.
|
|
- Do not edit `linuxcnc/configs/sim` or any upstream `linuxcnc/` file to make
|
|
tests pass.
|
|
- Do not fake path, modal, kinematic, tool, or parameter semantics in the SDK.
|
|
- Do not treat gmoccapy native GUI code as browser UI implementation. Only its
|
|
simulation/remap behavior is relevant to this runtime.
|