HAL/UI/full-process standalone/browser boundary design and next plan Generated: 2026-06-10 CST This plan follows `text3.txt`. The `configs/sim` inventory/matrix work is now complete for the current definition. This file defines the next boundary before any previously blocked HAL/UI/full-process family is promoted into standalone, Node, or browser execution. Goal - Preserve LinuxCNC as the CNC semantic source of truth. - Make HAL/UI/full-process dependencies machine-readable before attempting execution. - Promote only the subpaths that can run through vendored LinuxCNC source plus explicit standalone runtime adapters. - Keep task, HAL process launch, UI driver process launch, linuxcncrsh, Python remap, and tool-database process behavior blocked until each has a deliberate LinuxCNC-owned runtime boundary. Non-goals - Do not implement HAL, task, linuxcncrsh, GUI, Python remap, or tool-database semantics in JavaScript. - Do not make blocked `configs/sim` programs pass by editing upstream G-code, changing SDK behavior, or adding project-owned interpreter semantics. - Do not treat native LinuxCNC GUI code as implementation code for the browser UI. Current implementation added by this batch 1. SDK runtime-boundary classifier Added: ```text wasm-port/runtime/sdk/src/sim-config-staging.js analyzeIniRuntimeBoundaries() ``` Exported through: ```text wasm-port/runtime/sdk/src/index.js ``` The classifier reads INI text, manifest text, source-root metadata, and optional execution text. It reports: - declared `HAL` process inputs: `HALFILE`, `HALCMD`, `POSTGUI_HALFILE`, `HALUI`; - declared UI process inputs: `DISPLAY`, `PYVCP`, `GLADEVCP`, `EMBED_TAB_COMMAND`; - `HALUI` MDI command dependencies; - `[EMCIO]DB_PROGRAM` tool-database process dependencies; - Python references in UI, DB, `[PYTHON]`, or Python remap declarations; - `[RS274NGC]USER_M_PATH` plus whether the current execution text calls unstaged external `M100..M199` process codes. It returns a policy recommendation for hard Layer 4 blocks: - `L4-TOOL-DB` when `[EMCIO]DB_PROGRAM` is present; - `L4-USER-M-PROCESS` when the current execution chain calls unstaged external user-M process codes; - `L4-PYTHON-REMAP` for Python remap runtime declarations; - `-` when the dependency is only a declared process dependency already represented by a narrower standalone adapter or class representative. This is policy/accounting only. It does not execute or emulate HAL, task, UI, Python, user-M, or tool-database behavior. 2. Node coverage for the classifier Updated: ```text wasm-port/tests/wasm/node/verify_sim_configs_wasm.mjs ``` Covered cases: - synthetic INI with vendored `M123` user-M file remains unblocked; - `axis/db_demo/db_nonran.ini` reports `L4-TOOL-DB`; - `axis/vismach/millturn/millturn.ini` plus its remap execution chain reports `L4-USER-M-PROCESS` because `M428/M429` call unstaged `M128/M129`; - `axis/vismach/puma/puma_cube.ini` declares HAL/UI/HALUI process dependencies but remains unblocked for the current representative program because the promoted execution path does not call unstaged external user-M process codes; - `axis/gladevcp/gladevcp_panel.ini` declares UI/Python UI process dependencies but remains unblocked for the current `probe.ngc` representative. 3. Inventory policy guard Updated: ```text wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.mjs ``` The Node inventory now checks vendored INI rows against `analyzeIniRuntimeBoundaries()` before execution/skipping: - `L4-TOOL-DB` rows must declare `DB_PROGRAM`; - `L4-USER-M-PROCESS` rows must be backed by an execution chain that calls unstaged external user-M process codes; - generated/tracked blocked policy drift fails the inventory. Boundary model Layer A: declaration classification - Input: INI text, manifest text, optional execution text. - Output: dependency list and recommended blocked kind. - Owner: SDK host-boundary code. - Validation: Node unit/smoke assertions and Node inventory policy checks. Layer B: standalone adapter execution - Allowed only when a narrow runtime edge already exists and CNC behavior still comes from vendored LinuxCNC source. - Current examples: - HAL named-parameter lookup and switchkins M68/M66 synchronization through the standalone HAL adapter; - deterministic `USER_M_COMMAND` canonical events for already vendored M110/M111-style user-M registration; - five-axis remap execution through vendored LinuxCNC remap/O-word paths; - OPFS/file/parameter/tool-table persistence as host storage boundaries. Layer C: browser/UI representation - Browser UI may present standalone simulation state and user controls. - Browser UI must not execute native LinuxCNC GUI code. - Browser UI must call SDK/WASM boundaries that are already validated in Node or native probes. - Full LinuxCNC GUI actions remain blocked unless expressed as a deliberate standalone command boundary with LinuxCNC-owned behavior underneath. Layer D: full-process blocked boundary Keep blocked until explicitly designed: - LinuxCNC task process lifecycle; - HAL process/module loading and realtime scheduling; - HALUI/linuxcncrsh command queues; - external userspace components; - native GUI driver processes; - Python remap/prolog/epilog runtime; - tool database process startup and protocol/state behavior. Immediate next implementation batches Batch 1: make boundary reports durable - Add a generated machine-readable boundary artifact: ```text wasm-port/build/wasm/sim-configs-inventory/boundary-summary.tsv ``` - Minimum fields: ```text path ini blocked recommended_blocked dependencies user_m_execution_codes user_m_vendored_count db_program hal_process ui_process halui_mdi_process python_process ``` - The existing Node inventory should fail if `blocked` and `recommended_blocked` conflict for hard blocks. Batch 2: promote only safe HAL/UI representatives - Keep `axis/gladevcp/probe.ngc`, `woodpecker/on_abort.ngc`, `axis/vismach/puma/puma_cube.ngc`, and `axis/vismach/melfa-sim/example.ngc` as representative file-execution paths. - Add browser assertions that these programs remain file/remap execution representatives and do not claim full UI/HAL process coverage. - Do not promote `axis/vismach/millturn/example.ngc` until the user-M process boundary is designed, because the remap chain calls M128/M129. Batch 3: design external user-M process boundary - Start with `axis/vismach/millturn` because it is the smallest current hard blocked row with vendored INI and program context. - Required design questions: - Which LinuxCNC source owns M128/M129 behavior in the native config? - Is the behavior expressible as a LinuxCNC-owned deterministic adapter boundary, or does it require spawning external process scripts? - What canonical/state output proves behavior without adding JS CNC semantics? - Do not mark `millturn` unblocked until native, Node, and browser checks can prove the boundary. Batch 4: design tool DB boundary - Start with `axis/db_demo/db_nonran.ini`. - Required design questions: - Which LinuxCNC source owns `DB_PROGRAM` startup/protocol semantics? - Can a standalone tool database adapter call vendored LinuxCNC tooldata source without reimplementing database behavior? - What fixture demonstrates tool lookup/update behavior across native and WASM? - Keep `axis/db_demo/base.ngc` as `L4-TOOL-DB` until this exists. Batch 5: Python remap/full-process family plan - Do not vendor or execute `gmoccapy`, `axis/laser`, or TWP nutating Layer 4 paths until Python remap runtime ownership is designed. - First artifact should be a dependency inventory, not execution: - Python modules referenced by INI/remap; - prolog/epilog functions; - HAL/task/UI assumptions; - NGC-only subpaths, if any, that can be separated safely. Validation gates Run after each batch: ```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 ``` Completion criteria for this boundary phase - Every vendored sim-config INI used by Node inventory has a machine-readable runtime-boundary report. - Hard blocked rows have a dependency-backed reason rather than path-only classification. - Safe representatives can declare HAL/UI process dependencies without being mislabeled as full-process coverage. - No blocked family is promoted until a LinuxCNC-owned runtime boundary exists and is validated native, Node, and browser where appropriate.