结论:L4-USER-M-PROCESS 已按 Web/virtual HAL 数控仿真主线完成接入,native LinuxCNC runtime 不再作为 Web 仿真阻塞;新增 text31.txt 接续剩余 77 个 SKIP 的 main-program promotion 复核。
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-codesM111. The native harness now resolves the corresponding INI by[DISPLAY]OPEN_FILE, soeoffsets.ngc,jwp_z.ngc, andopa_demo.ngcare no longer judged throughdynamic_offsets.ini.axis/geometry/xyzc.ngc: 1 failure from sim-only user M-codeM110.axis/foam/foam.ngc: 1 failure from missingU/Vaxis support in the LinuxCNCbin/rs274entry point.axis/vismach/5axis/bridgemill/5axisgui.ngc: 1 failure from missingWaxis support in the LinuxCNCbin/rs274entry point.axis/vismach/5axis/table-rotary_spindle-rotary-nutating/demos/incremental_repetition_g533.ngc: 1 failure from an upstream demo line that uses bareX/Y/Zwords afterG53.6without 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: 0and writessummary.tsv,class-summary.tsv, andpath-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.ngcentry appears indocs/sim-configs-coverage-matrix.mdand generatedpath-matrix.tsv. - Classification complete: every entry has
main,macro_load, orremap_subroutineclass. - 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.shremains the Layer 2 source for per-path status and expected-failure reason. - Node inventory complete:
verify_sim_configs_inventory_wasm.shchecks 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.
-
Add a tracked script:
wasm-port/tests/native/verify_sim_configs.sh -
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 underwasm-port/build/native/sim-configs/; - classify programs as
main,macro_load,remap_subroutine, orunsupported_runtime_edge; - fail the script only on unexpected failures.
- scan only
-
Add deterministic classification rules:
- files under
remap_subs/andnc_subroutines/are not standalone main programs; - files with no
M2,M30, or%are load/parse fixtures unless the INI references them throughREMAP; - user M-code files are tested through
USER_M_PATHresolution, not by pretending LinuxCNC native process services exist.
- files under
-
Wire the script into existing validation:
wasm-port/tests/native/verify_native_probes.sh -
Completion check:
wasm-port/tests/native/verify_sim_configs.shLatest 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' usedaxis/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:
-
Add a machine-config loader in
runtime/core/linuxcnc_wrap/, for example:linuxcnc_machine_config.hh linuxcnc_machine_config.cpp -
Reuse vendored
inifile.ccto parse:[TRAJ] COORDINATES[KINS] KINEMATICS[DISPLAY] GEOMETRY[RS274NGC] PARAMETER_FILE[RS274NGC] SUBROUTINE_PATH[RS274NGC] USER_M_PATH[EMCIO] TOOL_TABLE
-
Extend
initialize_minimal_interp()/ the runtime equivalent to set the interpreter setup fields from the parsed machine config instead of hardcodedXYZ. -
Add focused native fixtures:
axis_foam.ini+foam.ngcacceptsU/V.bridgemill/5axis.ini+5axisgui.ngcacceptsW.
-
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: unknownM111axis/geometry/xyzc.ngc: unknownM110
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:
-
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.ccsearch/registration behavior and keeps process execution outside CNC semantics. -
Add
USER_M_PATHparsing to the machine-config loader. Done. -
For native standalone tests. Done:
- resolve
M100throughM199against configured search paths; - register only executable files;
- emit deterministic
USER_M_COMMANDboundary events.
- resolve
-
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.
-
Add tests. Done:
M110fromaxis/geometry;M111fromaxis/external_offsets;- minimal WASM
M110andM111fixtures.
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.pyconfigs/sim/gmoccapy/python/remap.pyconfigs/sim/gmoccapy/python/stdglue.pyconfigs/sim/axis/laser/python/toplevel.pyconfigs/sim/axis/laser/python/remap.pyconfigs/sim/axis/remap/*/python/*.pyfor Python remap, prolog, epilog, queue, and tool-change callbacks.configs/sim/axis/vismach/VMC_toolchange/remap.pyandtoplevel.pyfor Python tool-change prolog/epilog handling.
Current policy:
- Keep native inventory as source-of-truth.
- Mark
gmoccapy/*,axis/laser/*,axis/remap/*/nc_files/*.ngc, andaxis/vismach/VMC_toolchange/toolchange.ngcrows asL4-PYTHON-REMAPindocs/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.ngcfails in the LinuxCNCrs274baseline because line 10 uses barex50y50z150afterG53.6; same-directory demos use explicitG0motion 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.ngcasUPSTREAM-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-REMAPuntil Python remap entry points such asg682,g69_core, andg53x_corehave 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.ngcwithaxis_foam.ini, verifying INI-drivenU/Vaxis mask handling in WASM.axis/vismach/5axis/bridgemill/5axisgui.ngcwith5axis.ini, verifying INI-drivenWaxis mask handling and bridge-mill NGC remap execution in WASM.axis/geometry/xyzc.ngcwithxyzc.iniand real executableM110, verifyingUSER_M_PATHregistration in WASM.axis/external_offsets/dyn_demo.ngc,eoffsets.ngc,jwp_z.ngc, andopa_demo.ngcwith their corresponding INI files, real executableM111, sharedeoffset.tbl, andopa_demo.ngc'scircles.ngcsubroutine, verifying the same user-M andSUBROUTINE_PATHboundaries against upstream sim programs. The Node inventory guard keeps these deterministicM110/M111rows unblocked, requires a vendored user-M file, and includes theopa_demo.ngccircles.ngcsubroutine text in boundary analysis so the reachedM111call is accounted for instead of being mistaken for an external user-M process gap.axis/gladevcp/probe.ngcas a plain INI/tool-table main-program sample.axis/external_offsets/circles.ngcas the macro-load class representative, wrapped only with an addedM2for load/parse style execution.axis/vismach/5axis/table-dual-rotary/demos/xyzab-tdr-demo.ngcandaxis/vismach/5axis/table-rotary-tilting/demos/*through the existing five-axis remap execution C ABI.axis/vismach/melfa-sim/example.ngcandaxis/vismach/puma/puma_cube.ngcas additional remap/kinematics machine representatives.woodpecker/on_abort.ngcas 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 sourcelinuxcnc/configs/simINI files for dependency accounting only and writesbuild/wasm/sim-configs-inventory/blocked-dependency-summary.tsvwithout vendoring or executing those blocked families. The blocked summary includes source-deriveduser_m_process_effectsformillturn,tool_db_protocol_evidencefordb_demo, and Python module/remap/prolog/ epilog dependency ownership for Python-remap families. Python-remap rows are also projected intobuild/wasm/sim-configs-inventory/python-remap-boundary-summary.tsv, which keeps all 53L4-PYTHON-REMAProws inventory-only withpython_runtime_evidenceandexecution_enabled=0.
Boundary decisions for the current hard blocks:
axis/vismach/millturn/example.ngcremainsL4-USER-M-PROCESS. The source INI declares HAL, HALUI MDI, and UI process dependencies, and the remap chain entersremap_subs/428remap.ngcand429remap.ngc, which call external user-M process codesM128andM129. Those process scripts live atconfigs/sim/axis/vismach/millturn/mcodes/M128andM129; they use Tcl LinuxCNC/HAL packages,emc_init,parse_ini,hal getp, andhal setpto 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 reportruntime_state_probe_passed. The current Web/virtual HAL simulation proof is complete forM429 -> M129turn andM428 -> M128mill state transitions, and the real browser simulation page smoke verifies the switchkins guard pins plusini.[xz].*limit pins throughlinuxCncRealSimulationState.millturnUserMProcess. That proof is simulation evidence only: it keepsprocessExecutionReady=false,executionEnabled=0, andpromotion_allowed=0. The latest opt-in native probe on this workstation reportsblocked_existing_linuxcnc_runtimewithexclusive_linuxcnc_runtimebecause an existinglinuxcncsvr/rtapi_appruntime is already active. The Node inventory guard requires this row to stay non-REPin Node and browser while it remainsL4-USER-M-PROCESS, and the generated inventory summary must keep it asSKIPwith that reason.axis/db_demo/base.ngcremainsL4-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 issrc/emc/task/taskclass.ccfor DB_PROGRAM activation,src/emc/tooldata/tooldata_db.ccfor DB process startup and command/reply protocol,src/emc/tooldata/tooldata_common.ccfor DB-backed tooldata behavior, and the config programconfigs/sim/axis/db_demo/db.py. Do not promote until the boundary design indocs/full-process-boundary-design.mdhas 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-REPin Node and browser while it remainsL4-TOOL-DB, and the generated inventory summary must keep it asSKIPwith 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. EveryL4-PYTHON-REMAProw must also remainSKIPwithL4-PYTHON-REMAPin 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 asaxis/gladevcp/probe.ngc,woodpecker/on_abort.ngc,axis/vismach/melfa-sim/example.ngc, andaxis/vismach/puma/puma_cube.ngcto keep their dependency rows inboundary-summary.tsv, match the expected HAL/UI/HALUI/Python process flag combinations, remain Node/browserREProws, 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.
-
Update
docs/compatibility-validation.mdwith the sim-config matrix, blocked policy, and validation commands. Done. -
Add
docs/sim-configs-coverage-matrix.mdas the tracked review surface for all 159 current native inventory rows. Done. -
Update
docs/source-reuse-map.mdfor newly vendored source files. Done. -
Update
tools/source-manifest.txtandtools/verify_vendor_sync.shif new LinuxCNC files are copied intowasm-port/vendor/linuxcnc. Done for the current representative and inventory-backed sim-config files; noverify_vendor_sync.shlogic change was needed. -
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.tsvremains the source row set, andclass-summary.tsvpluspath-matrix.tsvare generated artifacts underbuild/native/sim-configs/. Node inventory also writesbuild/wasm/sim-configs-inventory/summary.tsvbuild/wasm/sim-configs-inventory/skip-summary.tsv, andbuild/wasm/sim-configs-inventory/boundary-summary.tsvplusbuild/wasm/sim-configs-inventory/ini-boundary-summary.tsvfor 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, andboundary-proof-gates.tsv. These remain accounting/proof-gate artifacts; they do not enable blocked execution or promotion. The inventory guard checksskip-summary.tsvagainst skip reasons derived frompath-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;UNAVAILABLEis reserved for rows whose boundary summary records a missing vendored INI. Hard blocked rows are additionally recorded inbuild/wasm/sim-configs-inventory/blocked-dependency-summary.tsvwithout promotion into standalone/WASM execution. That artifact includes source owner fields and runtime proof fields such asuser_m_process_files,user_m_process_effects,tool_db_protocol_evidence, andlinuxcnc_owner, somillturnanddb_demoremain 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 indocs/full-process-boundary-design.md. Node inventory also writesbuild/wasm/sim-configs-inventory/full-process-boundary-summary.tsvfor the designed-but-blocked non-Python full-process rows, including theirruntime_owner_evidence, andbuild/wasm/sim-configs-inventory/python-remap-boundary-summary.tsvfor the Python remap inventory-only row set. The Python boundary and family summaries includepython_runtime_evidence. All blocked boundary artifacts requireexecution_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.
Recommended Next Work
- Keep
verify_sim_configs.sh,path-matrix.tsv, anddocs/sim-configs-coverage-matrix.mdin sync whenever the source manifest or vendored sim-config set changes. - Add new Node/browser representatives only when they cover a new runtime class with a LinuxCNC-owned execution path.
- 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.mdare met where applicable. - 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/simor any upstreamlinuxcnc/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.