Files
cnc_wams/wasm-port/docs/sim-configs-completion-plan.md
wangdequan 07869f5c69 完成L4-USER-M-PROCESS Web仿真接入
结论:L4-USER-M-PROCESS 已按 Web/virtual HAL 数控仿真主线完成接入,native LinuxCNC runtime 不再作为 Web 仿真阻塞;新增 text31.txt 接续剩余 77 个 SKIP 的 main-program promotion 复核。
2026-06-20 07:59:38 +08:00

27 KiB

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:

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:

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:

    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:

    wasm-port/tests/native/verify_native_probes.sh
    
  5. Completion check:

    wasm-port/tests/native/verify_sim_configs.sh
    

    Latest result:

    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:

    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:

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:

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:

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:

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:

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:

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:

total: 15
pass: 14
fail: 1
timeout: 0
expected_fail: 1
unexpected_fail: 0
skipped: 0

Completion check:

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=82, passed=82, skipped=77, unexpected_fail=0.
  • Node inventory skip/block summary: ASSET-ONLY=65, L4-USER-M-PROCESS=1, NON_MAIN_CLASS=10, UPSTREAM-DEMO=1.
  • Node blocked-dependency inventory for the hard blocked row set: 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 native runtime probe can run in an exclusive LinuxCNC process graph and report runtime_state_probe_passed. The current Web/virtual HAL simulation proof is complete for M429 -> M129 turn and M428 -> M128 mill state transitions, and the real browser simulation page smoke verifies the switchkins guard pins plus ini.[xz].* limit pins through linuxCncRealSimulationState.millturnUserMProcess. That proof is simulation evidence only: it keeps processExecutionReady=false, executionEnabled=0, and promotion_allowed=0. The latest opt-in native probe on this workstation reports blocked_existing_linuxcnc_runtime with exclusive_linuxcnc_runtime because an existing linuxcncsvr/rtapi_app runtime is already active. 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:

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:

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.

  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.