Add runtime boundary promotion gates
This commit is contained in:
528
text4.txt
528
text4.txt
@@ -149,79 +149,501 @@ Keep blocked until explicitly designed:
|
|||||||
- Python remap/prolog/epilog runtime;
|
- Python remap/prolog/epilog runtime;
|
||||||
- tool database process startup and protocol/state behavior.
|
- tool database process startup and protocol/state behavior.
|
||||||
|
|
||||||
Immediate next implementation batches
|
Follow-on implementation completed after this plan
|
||||||
|
|
||||||
Batch 1: make boundary reports durable
|
Batch 1: durable boundary reports
|
||||||
|
|
||||||
- Add a generated machine-readable boundary artifact:
|
- Complete. The Node inventory now writes:
|
||||||
|
|
||||||
```text
|
```text
|
||||||
wasm-port/build/wasm/sim-configs-inventory/boundary-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/boundary-phase-completion-summary.tsv
|
||||||
```
|
```
|
||||||
|
|
||||||
- Minimum fields:
|
- `boundary-summary.tsv` records the path, INI, tracked blocked kind,
|
||||||
|
classifier recommendation, dependency evidence, user-M execution codes,
|
||||||
|
unstaged user-M codes, vendored user-M count, DB program, HAL/UI/HALUI
|
||||||
|
process flags, and Python UI/remap process flags.
|
||||||
|
- The inventory fails if a hard blocked row and the classifier recommendation
|
||||||
|
drift, if `L4-TOOL-DB` lacks `DB_PROGRAM`, if `L4-USER-M-PROCESS` lacks
|
||||||
|
unstaged external user-M execution codes, or if `L4-PYTHON-REMAP` lacks
|
||||||
|
Python remap process evidence.
|
||||||
|
|
||||||
|
Batch 2: safe HAL/UI representatives
|
||||||
|
|
||||||
|
- Complete. The inventory keeps these safe representatives as Node/browser
|
||||||
|
`REP` rows while recording declared process dependencies:
|
||||||
|
- `axis/gladevcp/probe.ngc`
|
||||||
|
- `woodpecker/on_abort.ngc`
|
||||||
|
- `axis/vismach/puma/puma_cube.ngc`
|
||||||
|
- `axis/vismach/melfa-sim/example.ngc`
|
||||||
|
- These rows remain file/remap execution representatives only. They do not
|
||||||
|
claim full HAL/UI process coverage.
|
||||||
|
- `axis/vismach/millturn/example.ngc` remains blocked as
|
||||||
|
`L4-USER-M-PROCESS` because its remap chain calls unstaged `M128/M129`.
|
||||||
|
|
||||||
|
Batch 3: external user-M process boundary
|
||||||
|
|
||||||
|
- Complete as a design-and-gate phase, still blocked for execution.
|
||||||
|
- Generated artifacts now identify LinuxCNC ownership and state targets for
|
||||||
|
millturn `M128/M129`:
|
||||||
|
|
||||||
```text
|
```text
|
||||||
path
|
wasm-port/build/wasm/sim-configs-inventory/user-m-process-boundary-summary.tsv
|
||||||
ini
|
wasm-port/build/wasm/sim-configs-inventory/user-m-process-state-targets.tsv
|
||||||
blocked
|
wasm-port/build/wasm/sim-configs-inventory/user-m-process-transition-plan.tsv
|
||||||
recommended_blocked
|
wasm-port/build/wasm/sim-configs-inventory/user-m-process-native-runtime-state-plan.tsv
|
||||||
dependencies
|
wasm-port/build/wasm/sim-configs-inventory/user-m-process-native-runtime-readiness.tsv
|
||||||
user_m_execution_codes
|
wasm-port/build/wasm/sim-configs-inventory/user-m-process-native-runtime-probe-gate.tsv
|
||||||
user_m_vendored_count
|
|
||||||
db_program
|
|
||||||
hal_process
|
|
||||||
ui_process
|
|
||||||
halui_mdi_process
|
|
||||||
python_process
|
|
||||||
```
|
```
|
||||||
|
|
||||||
- The existing Node inventory should fail if `blocked` and
|
- The native probe entry point exists:
|
||||||
`recommended_blocked` conflict for hard blocks.
|
|
||||||
|
|
||||||
Batch 2: promote only safe HAL/UI representatives
|
```text
|
||||||
|
wasm-port/tests/native/probe_millturn_user_m_runtime.sh
|
||||||
|
```
|
||||||
|
|
||||||
- Keep `axis/gladevcp/probe.ngc`, `woodpecker/on_abort.ngc`,
|
- The probe is disabled by default and currently reports
|
||||||
`axis/vismach/puma/puma_cube.ngc`, and `axis/vismach/melfa-sim/example.ngc`
|
`skipped_missing_host_runtime` on this host because `halrun`, `halcmd`, and
|
||||||
as representative file-execution paths.
|
`linuxcnc` are unavailable. Promotion remains locked.
|
||||||
- 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
|
Batch 4: tool DB boundary
|
||||||
|
|
||||||
- Start with `axis/vismach/millturn` because it is the smallest current hard
|
- Complete as a design-and-gate phase, still blocked for execution.
|
||||||
blocked row with vendored INI and program context.
|
- Generated artifacts now describe the `DB_PROGRAM` v2.1 protocol, get/load/
|
||||||
- Required design questions:
|
put/unload transactions, persistence state, native readiness, and promotion
|
||||||
- Which LinuxCNC source owns M128/M129 behavior in the native config?
|
lock:
|
||||||
- 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
|
```text
|
||||||
|
wasm-port/build/wasm/sim-configs-inventory/tool-db-process-boundary-summary.tsv
|
||||||
|
wasm-port/build/wasm/sim-configs-inventory/tool-db-process-protocol-gates.tsv
|
||||||
|
wasm-port/build/wasm/sim-configs-inventory/tool-db-process-transaction-plan.tsv
|
||||||
|
wasm-port/build/wasm/sim-configs-inventory/tool-db-process-native-runtime-readiness.tsv
|
||||||
|
```
|
||||||
|
|
||||||
- Start with `axis/db_demo/db_nonran.ini`.
|
- The native probe entry point exists:
|
||||||
- Required design questions:
|
|
||||||
- Which LinuxCNC source owns `DB_PROGRAM` startup/protocol semantics?
|
```text
|
||||||
- Can a standalone tool database adapter call vendored LinuxCNC tooldata
|
wasm-port/tests/native/probe_tool_db_runtime.sh
|
||||||
source without reimplementing database behavior?
|
```
|
||||||
- What fixture demonstrates tool lookup/update behavior across native and
|
|
||||||
WASM?
|
- The probe is disabled by default and currently reports
|
||||||
- Keep `axis/db_demo/base.ngc` as `L4-TOOL-DB` until this exists.
|
`skipped_missing_host_runtime` because `linuxcnc`, `milltask`, and `halcmd`
|
||||||
|
are unavailable. `axis/db_demo/base.ngc` remains `L4-TOOL-DB`.
|
||||||
|
|
||||||
Batch 5: Python remap/full-process family plan
|
Batch 5: Python remap/full-process family plan
|
||||||
|
|
||||||
- Do not vendor or execute `gmoccapy`, `axis/laser`, or TWP nutating Layer 4
|
- Complete as dependency inventory plus a minimal native lifecycle fixture
|
||||||
paths until Python remap runtime ownership is designed.
|
plan, still blocked for execution.
|
||||||
- First artifact should be a dependency inventory, not execution:
|
- Generated artifacts now inventory Python remap families, LinuxCNC owner
|
||||||
- Python modules referenced by INI/remap;
|
sources, configured modules, callable/prolog/epilog expectations, runtime
|
||||||
- prolog/epilog functions;
|
phases, readiness, and the selected `stop-lookahead` fixture:
|
||||||
- HAL/task/UI assumptions;
|
|
||||||
- NGC-only subpaths, if any, that can be separated safely.
|
```text
|
||||||
|
wasm-port/build/wasm/sim-configs-inventory/python-remap-boundary-summary.tsv
|
||||||
|
wasm-port/build/wasm/sim-configs-inventory/python-remap-runtime-contract.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
|
||||||
|
```
|
||||||
|
|
||||||
|
- The native probe entry point exists:
|
||||||
|
|
||||||
|
```text
|
||||||
|
wasm-port/tests/native/probe_python_remap_runtime.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
- The probe is disabled by default and currently reports
|
||||||
|
`skipped_missing_host_runtime` because `linuxcnc` is unavailable. Python
|
||||||
|
remap families remain inventory-only and are not promoted.
|
||||||
|
|
||||||
|
Batch 6: Python remap host/source readiness gate
|
||||||
|
|
||||||
|
- Complete as a readiness-and-gate phase, still blocked for execution.
|
||||||
|
- Generated artifacts now explicitly separate ordinary `python3` availability
|
||||||
|
from LinuxCNC interpreter-owned Python remap runtime readiness:
|
||||||
|
|
||||||
|
```text
|
||||||
|
wasm-port/build/wasm/sim-configs-inventory/python-remap-native-runtime-readiness.tsv
|
||||||
|
wasm-port/build/wasm/sim-configs-inventory/python-remap-native-runtime-probe-gate.tsv
|
||||||
|
```
|
||||||
|
|
||||||
|
- `python-remap-native-runtime-probe-gate.tsv` records the selected
|
||||||
|
`axis/remap/stop-lookahead/nc_files` fixture, `python3`, `linuxcnc`,
|
||||||
|
`interp_python.cc`, `python_plugin.cc`, and representative module import
|
||||||
|
inputs:
|
||||||
|
|
||||||
|
```text
|
||||||
|
import:axis/remap/stop-lookahead/python/remap.py
|
||||||
|
import:axis/remap/stop-lookahead/python/toplevel.py
|
||||||
|
```
|
||||||
|
|
||||||
|
- The gate records `python3_sufficient=0`. On this host, `python3` is present
|
||||||
|
but `linuxcnc` is missing, so the gate remains:
|
||||||
|
|
||||||
|
```text
|
||||||
|
runtime_ready=0
|
||||||
|
source_proof_ready=1
|
||||||
|
gate_status=blocked_missing_host_runtime
|
||||||
|
execution_enabled=0
|
||||||
|
promotion_allowed=0
|
||||||
|
```
|
||||||
|
|
||||||
|
- Node inventory and browser smoke now require the Python remap runtime probe
|
||||||
|
gate artifact. The browser gate checks the same policy without executing
|
||||||
|
Python remap code or claiming browser/full-process coverage.
|
||||||
|
|
||||||
|
Batch 7: tool DB host/source readiness gate
|
||||||
|
|
||||||
|
- Complete as a readiness-and-gate phase, still blocked for execution.
|
||||||
|
- Generated artifacts now explicitly separate ordinary `python3` availability
|
||||||
|
and tool-table fallback from LinuxCNC `DB_PROGRAM` process readiness:
|
||||||
|
|
||||||
|
```text
|
||||||
|
wasm-port/build/wasm/sim-configs-inventory/tool-db-process-native-runtime-readiness.tsv
|
||||||
|
wasm-port/build/wasm/sim-configs-inventory/tool-db-process-native-runtime-probe-gate.tsv
|
||||||
|
```
|
||||||
|
|
||||||
|
- `tool-db-process-native-runtime-probe-gate.tsv` records the selected
|
||||||
|
`axis/db_demo/base.ngc` fixture, `DB_PROGRAM=./db_nonran.py`, required host
|
||||||
|
commands, DB program source, LinuxCNC Python modules, and the v2.1 protocol
|
||||||
|
transaction contract.
|
||||||
|
- The gate records:
|
||||||
|
|
||||||
|
```text
|
||||||
|
python3_sufficient=0
|
||||||
|
tool_table_fallback_sufficient=0
|
||||||
|
db_program_source_ready=1
|
||||||
|
linuxcnc_python_modules_ready=1
|
||||||
|
protocol_contract_ready=1
|
||||||
|
source_proof_ready=1
|
||||||
|
```
|
||||||
|
|
||||||
|
- On this host, `python3` is present but `linuxcnc`, `milltask`, and `halcmd`
|
||||||
|
are missing, so the gate remains:
|
||||||
|
|
||||||
|
```text
|
||||||
|
runtime_ready=0
|
||||||
|
gate_status=blocked_missing_host_runtime
|
||||||
|
execution_enabled=0
|
||||||
|
promotion_allowed=0
|
||||||
|
```
|
||||||
|
|
||||||
|
- Node inventory and browser smoke now require the tool DB runtime probe gate
|
||||||
|
artifact. The browser gate checks the same policy without executing
|
||||||
|
`DB_PROGRAM`, starting LinuxCNC processes, or falling back to `.tbl`
|
||||||
|
semantics.
|
||||||
|
|
||||||
|
Batch 8: native runtime probe/gate alignment
|
||||||
|
|
||||||
|
- Complete as a cross-artifact consistency gate, still blocked for execution.
|
||||||
|
- Generated artifact:
|
||||||
|
|
||||||
|
```text
|
||||||
|
wasm-port/build/wasm/sim-configs-inventory/runtime-probe-gate-alignment.tsv
|
||||||
|
```
|
||||||
|
|
||||||
|
- This artifact aligns the native runtime probe summary with the generated
|
||||||
|
runtime probe gates for:
|
||||||
|
- `axis/vismach/millturn/example.ngc`
|
||||||
|
- `axis/db_demo/base.ngc`
|
||||||
|
- `axis/remap/stop-lookahead/nc_files`
|
||||||
|
- The alignment requires matching `runtime_ready`, `source_proof_ready`,
|
||||||
|
missing host requirements, execution-disabled state, promotion-disabled
|
||||||
|
state, and compatible native/gate statuses.
|
||||||
|
- Node inventory and browser smoke now require this alignment before any
|
||||||
|
blocked boundary can be considered for promotion.
|
||||||
|
|
||||||
|
Batch 9: native runtime probe opt-in metadata
|
||||||
|
|
||||||
|
- Complete as a native/WASM/browser schema hardening phase, still blocked for
|
||||||
|
execution.
|
||||||
|
- `native-runtime-probe-summary.tsv` now records the proof key and opt-in
|
||||||
|
switch for each disabled native runtime probe:
|
||||||
|
|
||||||
|
```text
|
||||||
|
required_native_proof
|
||||||
|
opt_in_env
|
||||||
|
probe_note
|
||||||
|
```
|
||||||
|
|
||||||
|
- The current rows explicitly require:
|
||||||
|
- `native_runtime_state_probe_required` with
|
||||||
|
`ENABLE_MILLTURN_USER_M_RUNTIME_PROBE=1`;
|
||||||
|
- `native_db_process_protocol_probe_required` with
|
||||||
|
`ENABLE_TOOL_DB_RUNTIME_PROBE=1`;
|
||||||
|
- `linuxcnc_python_runtime_lifecycle_probe_required` with
|
||||||
|
`ENABLE_PYTHON_REMAP_RUNTIME_PROBE=1`.
|
||||||
|
- The native probe scripts now emit a `runtime_probe_note` for missing source,
|
||||||
|
missing host runtime, disabled-ready, pass, and fail states. On this host the
|
||||||
|
notes still report missing LinuxCNC host runtime and keep promotion disabled.
|
||||||
|
- `runtime-probe-gate-alignment.tsv` now compares the gate
|
||||||
|
`required_native_proof` with the native runtime summary proof key and records
|
||||||
|
`native_opt_in_env`, so a ready host cannot silently drift from the intended
|
||||||
|
opt-in probe.
|
||||||
|
- Native, Node inventory, and browser smoke all require these fields while
|
||||||
|
keeping `execution_enabled=0` and `promotion_allowed=0`.
|
||||||
|
|
||||||
|
Batch 10: native runtime opt-in execution plan
|
||||||
|
|
||||||
|
- Complete as a generated runbook/gate artifact, still blocked for execution on
|
||||||
|
this host.
|
||||||
|
- Generated artifact:
|
||||||
|
|
||||||
|
```text
|
||||||
|
wasm-port/build/wasm/sim-configs-inventory/native-runtime-probe-execution-plan.tsv
|
||||||
|
```
|
||||||
|
|
||||||
|
- The artifact records the exact opt-in command, current runtime readiness,
|
||||||
|
current native probe status, expected pass status, missing requirements, gate
|
||||||
|
alignment status, and promotion prerequisites for:
|
||||||
|
- `axis/vismach/millturn/example.ngc`;
|
||||||
|
- `axis/db_demo/base.ngc`;
|
||||||
|
- `axis/remap/stop-lookahead/nc_files`.
|
||||||
|
- Current opt-in commands are:
|
||||||
|
- `ENABLE_MILLTURN_USER_M_RUNTIME_PROBE=1 bash wasm-port/tests/native/probe_millturn_user_m_runtime.sh`;
|
||||||
|
- `ENABLE_TOOL_DB_RUNTIME_PROBE=1 bash wasm-port/tests/native/probe_tool_db_runtime.sh`;
|
||||||
|
- `ENABLE_PYTHON_REMAP_RUNTIME_PROBE=1 bash wasm-port/tests/native/probe_python_remap_runtime.sh`.
|
||||||
|
- The expected native pass statuses are:
|
||||||
|
- `runtime_state_probe_passed`;
|
||||||
|
- `runtime_protocol_probe_passed`;
|
||||||
|
- `runtime_lifecycle_probe_passed`.
|
||||||
|
- On this host all three rows remain:
|
||||||
|
|
||||||
|
```text
|
||||||
|
runtime_ready=0
|
||||||
|
gate_alignment_ok=1
|
||||||
|
execution_enabled=0
|
||||||
|
promotion_allowed=0
|
||||||
|
plan_status=blocked_missing_host_runtime
|
||||||
|
```
|
||||||
|
|
||||||
|
- Promotion remains explicitly gated on native pass status, subsequent Node
|
||||||
|
inventory gate alignment, browser smoke gate alignment, and a manual promotion
|
||||||
|
lock update. The opt-in command alone does not promote any blocked row.
|
||||||
|
- Node inventory, browser smoke, and the boundary phase completion summary now
|
||||||
|
require this execution plan.
|
||||||
|
|
||||||
|
Batch 11: native runtime pass evidence contract
|
||||||
|
|
||||||
|
- Complete as a generated stdout-evidence contract, still blocked for execution
|
||||||
|
on this host.
|
||||||
|
- Generated artifact:
|
||||||
|
|
||||||
|
```text
|
||||||
|
wasm-port/build/wasm/sim-configs-inventory/native-runtime-probe-pass-evidence-contract.tsv
|
||||||
|
```
|
||||||
|
|
||||||
|
- The artifact records the native stdout evidence keys that must be present
|
||||||
|
after each opt-in native runtime probe reports its expected pass status.
|
||||||
|
- Current required pass statuses and evidence include:
|
||||||
|
- millturn user-M:
|
||||||
|
`runtime_state_probe_passed`,
|
||||||
|
`millturn_user_m_M128_runtime_state_ok=1`,
|
||||||
|
`millturn_user_m_M129_runtime_state_ok=1`;
|
||||||
|
- tool DB:
|
||||||
|
`runtime_protocol_probe_passed`,
|
||||||
|
`tool_db_protocol_version=v2.1`,
|
||||||
|
`tool_db_runtime_protocol_probe_ok=1`,
|
||||||
|
`tool_db_persistence_state_ok=1`;
|
||||||
|
- Python remap:
|
||||||
|
`runtime_lifecycle_probe_passed`,
|
||||||
|
`python_remap_lifecycle_generator_first_yield=2`,
|
||||||
|
`python_remap_runtime_lifecycle_probe_ok=1`.
|
||||||
|
- On this host all three rows remain:
|
||||||
|
|
||||||
|
```text
|
||||||
|
evidence_required_now=0
|
||||||
|
observed_evidence_ready=0
|
||||||
|
missing_evidence_keys=-
|
||||||
|
evidence_status=pending_until_native_pass
|
||||||
|
execution_enabled=0
|
||||||
|
promotion_allowed=0
|
||||||
|
```
|
||||||
|
|
||||||
|
- If a future opt-in probe reports its expected pass status, Node inventory will
|
||||||
|
require all declared stdout evidence keys before any Node/browser promotion
|
||||||
|
work can proceed. Browser smoke checks the same contract and still treats it
|
||||||
|
as non-promoting evidence.
|
||||||
|
- The boundary phase completion summary now requires this evidence contract.
|
||||||
|
|
||||||
|
Batch 12: runtime boundary promotion readiness summary
|
||||||
|
|
||||||
|
- Complete as a generated final promotion-readiness gate, still blocked for
|
||||||
|
execution and promotion on this host.
|
||||||
|
- Generated artifact:
|
||||||
|
|
||||||
|
```text
|
||||||
|
wasm-port/build/wasm/sim-configs-inventory/runtime-boundary-promotion-readiness.tsv
|
||||||
|
```
|
||||||
|
|
||||||
|
- The artifact combines:
|
||||||
|
- native runtime execution plan status;
|
||||||
|
- native pass evidence status;
|
||||||
|
- blocked runtime promotion lock state;
|
||||||
|
- Node inventory gate completion state;
|
||||||
|
- browser smoke gate completion state;
|
||||||
|
- manual lock update requirement.
|
||||||
|
- Current rows remain:
|
||||||
|
|
||||||
|
```text
|
||||||
|
native_pass_ready=0
|
||||||
|
native_evidence_ready=0
|
||||||
|
node_inventory_gate_complete=0
|
||||||
|
browser_smoke_gate_complete=0
|
||||||
|
promotion_lock_active=1
|
||||||
|
manual_lock_update_required=1
|
||||||
|
promotion_ready=0
|
||||||
|
execution_enabled=0
|
||||||
|
promotion_allowed=0
|
||||||
|
blocking_reason=awaiting_native_runtime_probe_pass
|
||||||
|
```
|
||||||
|
|
||||||
|
- This gives each blocked runtime family one machine-readable final decision:
|
||||||
|
even if a native probe later passes, promotion still requires native evidence,
|
||||||
|
Node/browser promotion gates, and an explicit manual promotion lock update.
|
||||||
|
- Node inventory, browser smoke, and the boundary phase completion summary now
|
||||||
|
require this readiness summary.
|
||||||
|
|
||||||
|
Batch 13: runtime boundary promotion blockers
|
||||||
|
|
||||||
|
- Complete as a generated blocker-summary gate, still blocked for execution and
|
||||||
|
promotion on this host.
|
||||||
|
- Generated artifact:
|
||||||
|
|
||||||
|
```text
|
||||||
|
wasm-port/build/wasm/sim-configs-inventory/runtime-boundary-promotion-blockers.tsv
|
||||||
|
```
|
||||||
|
|
||||||
|
- The artifact expands each `promotion_ready=0` decision into concrete blocker
|
||||||
|
keys and the next unblock action. Current blocker keys include:
|
||||||
|
- `host_runtime_requirements_missing`;
|
||||||
|
- `native_runtime_probe_not_passed`;
|
||||||
|
- `native_pass_evidence_not_ready`;
|
||||||
|
- `node_inventory_gate_not_complete`;
|
||||||
|
- `browser_smoke_gate_not_complete`;
|
||||||
|
- `promotion_lock_active`;
|
||||||
|
- `manual_lock_update_required`.
|
||||||
|
- Current missing runtime requirements are:
|
||||||
|
- millturn user-M: `halrun,halcmd,linuxcnc`;
|
||||||
|
- tool DB: `linuxcnc,milltask,halcmd`;
|
||||||
|
- Python remap: `linuxcnc`.
|
||||||
|
- The current next unblock action is to provide the missing host runtime
|
||||||
|
requirements for each family. The artifact remains summary-only:
|
||||||
|
|
||||||
|
```text
|
||||||
|
promotion_ready=0
|
||||||
|
execution_enabled=0
|
||||||
|
promotion_allowed=0
|
||||||
|
```
|
||||||
|
|
||||||
|
- Node inventory, browser smoke, and the boundary phase completion summary now
|
||||||
|
require this blocker summary.
|
||||||
|
|
||||||
|
Batch 14: post-native-pass promotion gates
|
||||||
|
|
||||||
|
- Complete as a generated post-native-pass gate, still blocked for execution
|
||||||
|
and promotion on this host.
|
||||||
|
- Generated artifact:
|
||||||
|
|
||||||
|
```text
|
||||||
|
wasm-port/build/wasm/sim-configs-inventory/runtime-boundary-post-native-pass-gates.tsv
|
||||||
|
```
|
||||||
|
|
||||||
|
- The artifact records, for each blocked runtime family, the native pass
|
||||||
|
status, native evidence readiness, required Node proof, required browser
|
||||||
|
proof, Node gate status, browser gate status, manual lock requirement, and
|
||||||
|
active promotion lock state.
|
||||||
|
- Current rows remain:
|
||||||
|
|
||||||
|
```text
|
||||||
|
native_pass_ready=0
|
||||||
|
native_evidence_ready=0
|
||||||
|
node_gate_status=blocked_until_native_pass_evidence
|
||||||
|
browser_gate_status=blocked_until_node_gate_complete
|
||||||
|
manual_lock_update_required=1
|
||||||
|
promotion_lock_active=1
|
||||||
|
execution_enabled=0
|
||||||
|
promotion_allowed=0
|
||||||
|
gate_status=blocked_before_native_pass
|
||||||
|
```
|
||||||
|
|
||||||
|
- This closes the next machine-readable step after a future native probe pass:
|
||||||
|
native evidence must exist first, then Node inventory proof, then browser
|
||||||
|
smoke proof, then a manual promotion-lock update. Native pass alone still
|
||||||
|
cannot promote `L4-USER-M-PROCESS`, `L4-TOOL-DB`, or
|
||||||
|
`L4-PYTHON-REMAP`.
|
||||||
|
- Node inventory, browser smoke, and the boundary phase completion summary now
|
||||||
|
require this post-native-pass gate.
|
||||||
|
|
||||||
|
Batch 15: blocked runtime host preflight
|
||||||
|
|
||||||
|
- Complete as a generated host-preflight summary, still blocked for execution
|
||||||
|
and promotion on this host.
|
||||||
|
- Generated artifact:
|
||||||
|
|
||||||
|
```text
|
||||||
|
wasm-port/build/wasm/sim-configs-inventory/runtime-boundary-host-preflight.tsv
|
||||||
|
```
|
||||||
|
|
||||||
|
- The artifact aggregates the three runtime probe gates into one host-facing
|
||||||
|
preflight table with:
|
||||||
|
- boundary class/kind/target;
|
||||||
|
- required LinuxCNC runtime family;
|
||||||
|
- full runtime requirement availability vector;
|
||||||
|
- missing host requirements;
|
||||||
|
- source proof readiness;
|
||||||
|
- required native proof key;
|
||||||
|
- opt-in environment variable;
|
||||||
|
- exact opt-in command;
|
||||||
|
- current native probe status;
|
||||||
|
- preflight status.
|
||||||
|
- Current rows remain:
|
||||||
|
|
||||||
|
```text
|
||||||
|
source_proof_ready=1
|
||||||
|
runtime_ready=0
|
||||||
|
current_probe_status=skipped_missing_host_runtime
|
||||||
|
preflight_status=blocked_missing_host_runtime
|
||||||
|
execution_enabled=0
|
||||||
|
promotion_allowed=0
|
||||||
|
```
|
||||||
|
|
||||||
|
- Current missing runtime requirements are summarized in one artifact:
|
||||||
|
- millturn user-M: `halrun,halcmd,linuxcnc`;
|
||||||
|
- tool DB: `linuxcnc,milltask,halcmd`;
|
||||||
|
- Python remap: `linuxcnc`.
|
||||||
|
- This preflight does not run probes and does not relax promotion locks. It
|
||||||
|
only records when a future host is ready to run the already declared opt-in
|
||||||
|
native probe commands.
|
||||||
|
- Node inventory, browser smoke, and the boundary phase completion summary now
|
||||||
|
require this host-preflight artifact.
|
||||||
|
|
||||||
|
Current next implementation recommendations
|
||||||
|
|
||||||
|
Generated recommendation source:
|
||||||
|
|
||||||
|
```text
|
||||||
|
wasm-port/build/wasm/sim-configs-inventory/next-boundary-recommendations.tsv
|
||||||
|
```
|
||||||
|
|
||||||
|
1. Implement and run the LinuxCNC-owned millturn `M128/M129` HAL/Tcl state
|
||||||
|
runtime probe after a host runtime with `tclsh`, `halrun`, `halcmd`, and
|
||||||
|
`linuxcnc` is available. Keep the row blocked until the native state probe
|
||||||
|
passes and Node/browser coverage can prove a narrow standalone boundary
|
||||||
|
without full-process claims.
|
||||||
|
2. Implement and run the tool DB protocol probe after
|
||||||
|
`tool-db-process-native-runtime-probe-gate.tsv` reports `runtime_ready=1`
|
||||||
|
with `python3`, `linuxcnc`, `milltask`, and `halcmd` available. The proof
|
||||||
|
must cover v2.1 handshake, `g`, `p`, `l`, `u`, state changes, and
|
||||||
|
persistence before `axis/db_demo/base.ngc` can move out of `L4-TOOL-DB`.
|
||||||
|
3. Implement the minimal Python remap lifecycle proof for
|
||||||
|
`axis/remap/stop-lookahead` after the new native runtime probe gate reports
|
||||||
|
`runtime_ready=1` with both `python3` and `linuxcnc` available. Keep all
|
||||||
|
Python-remap families blocked until the LinuxCNC Python runtime lifecycle is
|
||||||
|
proven without JavaScript CNC semantics.
|
||||||
|
|
||||||
Validation gates
|
Validation gates
|
||||||
|
|
||||||
|
|||||||
@@ -90,14 +90,23 @@
|
|||||||
"native_source_proof_alignment",
|
"native_source_proof_alignment",
|
||||||
"runtime_native_alignment_artifacts",
|
"runtime_native_alignment_artifacts",
|
||||||
"native_runtime_probe_summary",
|
"native_runtime_probe_summary",
|
||||||
|
"runtime_probe_gate_alignment",
|
||||||
|
"native_runtime_probe_execution_plan",
|
||||||
|
"native_runtime_probe_pass_evidence_contract",
|
||||||
|
"runtime_boundary_promotion_readiness",
|
||||||
|
"runtime_boundary_promotion_blockers",
|
||||||
|
"runtime_boundary_post_native_pass_gates",
|
||||||
|
"runtime_boundary_host_preflight",
|
||||||
"user_m_transition_contract",
|
"user_m_transition_contract",
|
||||||
"user_m_native_runtime_state_plan",
|
"user_m_native_runtime_state_plan",
|
||||||
"user_m_native_runtime_readiness",
|
"user_m_native_runtime_readiness",
|
||||||
"user_m_native_runtime_probe_gate",
|
"user_m_native_runtime_probe_gate",
|
||||||
"tool_db_transaction_contract",
|
"tool_db_transaction_contract",
|
||||||
"tool_db_native_runtime_readiness",
|
"tool_db_native_runtime_readiness",
|
||||||
|
"tool_db_native_runtime_probe_gate",
|
||||||
"python_runtime_contract",
|
"python_runtime_contract",
|
||||||
"python_native_runtime_readiness",
|
"python_native_runtime_readiness",
|
||||||
|
"python_native_runtime_probe_gate",
|
||||||
"python_native_runtime_state_plan",
|
"python_native_runtime_state_plan",
|
||||||
"python_native_runtime_fixture_plan",
|
"python_native_runtime_fixture_plan",
|
||||||
"runtime_contract_summary",
|
"runtime_contract_summary",
|
||||||
@@ -769,6 +778,97 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function verifyBrowserToolDbNativeRuntimeProbeGate() {
|
||||||
|
const rows = parseTsv(
|
||||||
|
await fetchText("../../build/wasm/sim-configs-inventory/tool-db-process-native-runtime-probe-gate.tsv"),
|
||||||
|
);
|
||||||
|
if (rows.length !== 1) {
|
||||||
|
throw new Error(`browser_tool_db_native_runtime_probe_gate: row count drift ${rows.length}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const row = rows[0];
|
||||||
|
if (
|
||||||
|
row.path !== "axis/db_demo/base.ngc" ||
|
||||||
|
row.ini !== "axis/db_demo/db_nonran.ini" ||
|
||||||
|
row.blocked !== "L4-TOOL-DB" ||
|
||||||
|
row.db_program !== "./db_nonran.py" ||
|
||||||
|
row.required_runtime !== "linuxcnc_tooldata_db_process"
|
||||||
|
) {
|
||||||
|
throw new Error("tool DB runtime probe gate identity drift");
|
||||||
|
}
|
||||||
|
if (row.python3_sufficient !== "0" || row.tool_table_fallback_sufficient !== "0") {
|
||||||
|
throw new Error("tool DB runtime probe gate must reject python3-only and tbl fallback proof");
|
||||||
|
}
|
||||||
|
for (const field of [
|
||||||
|
"python3_available",
|
||||||
|
"db_program_source_ready",
|
||||||
|
"linuxcnc_python_modules_ready",
|
||||||
|
"protocol_contract_ready",
|
||||||
|
"runtime_ready",
|
||||||
|
"source_proof_ready",
|
||||||
|
]) {
|
||||||
|
if (!["0", "1"].includes(row[field])) {
|
||||||
|
throw new Error(`tool DB runtime probe gate invalid ${field} ${row[field]}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
row.db_program_source_ready !== "1" ||
|
||||||
|
row.linuxcnc_python_modules_ready !== "1" ||
|
||||||
|
row.protocol_contract_ready !== "1" ||
|
||||||
|
row.source_proof_ready !== "1"
|
||||||
|
) {
|
||||||
|
throw new Error("tool DB runtime probe gate source readiness drift");
|
||||||
|
}
|
||||||
|
for (const requirement of [
|
||||||
|
"python3",
|
||||||
|
"linuxcnc",
|
||||||
|
"milltask",
|
||||||
|
"halcmd",
|
||||||
|
"axis/db_demo/db_nonran.py",
|
||||||
|
"linuxcnc.so",
|
||||||
|
"tooldb.py",
|
||||||
|
]) {
|
||||||
|
if (!row.runtime_requirements.includes(`${requirement}:`)) {
|
||||||
|
throw new Error(`tool DB runtime probe gate missing ${requirement}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (const phase of [
|
||||||
|
"startup_handshake",
|
||||||
|
"initial_get_all",
|
||||||
|
"spindle_load_notify",
|
||||||
|
"tool_offset_notify",
|
||||||
|
"spindle_unload_notify",
|
||||||
|
]) {
|
||||||
|
if (!row.protocol_transactions.includes(`${phase}:`)) {
|
||||||
|
throw new Error(`tool DB runtime probe gate missing transaction ${phase}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
row.required_native_proof !== "native_db_process_protocol_probe_required" ||
|
||||||
|
row.proof_status !== "pending" ||
|
||||||
|
row.execution_enabled !== "0" ||
|
||||||
|
row.promotion_allowed !== "0"
|
||||||
|
) {
|
||||||
|
throw new Error("tool DB runtime probe gate must remain pending and disabled");
|
||||||
|
}
|
||||||
|
if (!row.notes.includes("fallback_not_sufficient")) {
|
||||||
|
throw new Error("tool DB runtime probe gate must record fallback insufficiency");
|
||||||
|
}
|
||||||
|
if (row.runtime_ready === "1") {
|
||||||
|
if (
|
||||||
|
row.missing_requirements !== "-" ||
|
||||||
|
row.gate_status !== "ready_to_implement_protocol_probe"
|
||||||
|
) {
|
||||||
|
throw new Error("ready tool DB runtime probe gate drift");
|
||||||
|
}
|
||||||
|
} else if (
|
||||||
|
row.missing_requirements === "-" ||
|
||||||
|
row.gate_status !== "blocked_missing_host_runtime"
|
||||||
|
) {
|
||||||
|
throw new Error("missing-runtime tool DB probe gate drift");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async function verifyBrowserPythonRuntimeContract() {
|
async function verifyBrowserPythonRuntimeContract() {
|
||||||
const rows = parseTsv(
|
const rows = parseTsv(
|
||||||
await fetchText("../../build/wasm/sim-configs-inventory/python-remap-runtime-contract.tsv"),
|
await fetchText("../../build/wasm/sim-configs-inventory/python-remap-runtime-contract.tsv"),
|
||||||
@@ -920,6 +1020,91 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function verifyBrowserPythonNativeRuntimeProbeGate() {
|
||||||
|
const rows = parseTsv(
|
||||||
|
await fetchText("../../build/wasm/sim-configs-inventory/python-remap-native-runtime-probe-gate.tsv"),
|
||||||
|
);
|
||||||
|
if (rows.length !== 1) {
|
||||||
|
throw new Error(`browser_python_native_runtime_probe_gate: row count drift ${rows.length}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const row = rows[0];
|
||||||
|
if (
|
||||||
|
row.family !== "axis/remap/stop-lookahead/nc_files" ||
|
||||||
|
row.blocked !== "L4-PYTHON-REMAP" ||
|
||||||
|
row.fixture_id !== "stop_lookahead_python_runtime_lifecycle" ||
|
||||||
|
row.required_runtime !== "linuxcnc_python_remap_runtime"
|
||||||
|
) {
|
||||||
|
throw new Error(`${row.family}: Python runtime probe gate identity drift`);
|
||||||
|
}
|
||||||
|
if (row.python3_sufficient !== "0") {
|
||||||
|
throw new Error(`${row.family}: python3 alone must not satisfy Python remap readiness`);
|
||||||
|
}
|
||||||
|
for (const field of [
|
||||||
|
"python3_available",
|
||||||
|
"linuxcnc_available",
|
||||||
|
"runtime_owner_sources_ready",
|
||||||
|
"representative_modules_ready",
|
||||||
|
"runtime_ready",
|
||||||
|
"source_proof_ready",
|
||||||
|
]) {
|
||||||
|
if (!["0", "1"].includes(row[field])) {
|
||||||
|
throw new Error(`${row.family}: invalid ${field} ${row[field]}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
row.runtime_owner_sources_ready !== "1" ||
|
||||||
|
row.representative_modules_ready !== "1" ||
|
||||||
|
row.source_proof_ready !== "1"
|
||||||
|
) {
|
||||||
|
throw new Error(`${row.family}: Python runtime probe gate source readiness drift`);
|
||||||
|
}
|
||||||
|
for (const requirement of [
|
||||||
|
"python3",
|
||||||
|
"linuxcnc",
|
||||||
|
"src/emc/rs274ngc/interp_python.cc",
|
||||||
|
"src/emc/pythonplugin/python_plugin.cc",
|
||||||
|
"axis/remap/stop-lookahead/python/remap.py",
|
||||||
|
"axis/remap/stop-lookahead/python/toplevel.py",
|
||||||
|
]) {
|
||||||
|
if (!row.runtime_requirements.includes(`${requirement}:`)) {
|
||||||
|
throw new Error(`${row.family}: Python runtime probe gate missing ${requirement}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (const modulePath of [
|
||||||
|
"axis/remap/stop-lookahead/python/remap.py",
|
||||||
|
"axis/remap/stop-lookahead/python/toplevel.py",
|
||||||
|
]) {
|
||||||
|
if (!row.representative_module_imports.includes(`import:${modulePath}`)) {
|
||||||
|
throw new Error(`${row.family}: Python runtime probe gate missing representative import ${modulePath}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
row.required_native_proof !== "linuxcnc_python_runtime_lifecycle_probe_required" ||
|
||||||
|
row.proof_status !== "pending" ||
|
||||||
|
row.execution_enabled !== "0" ||
|
||||||
|
row.promotion_allowed !== "0"
|
||||||
|
) {
|
||||||
|
throw new Error(`${row.family}: Python runtime probe gate must remain pending and disabled`);
|
||||||
|
}
|
||||||
|
if (!row.notes.includes("python3_alone_not_sufficient")) {
|
||||||
|
throw new Error(`${row.family}: Python runtime probe gate must record python3-only guard`);
|
||||||
|
}
|
||||||
|
if (row.runtime_ready === "1") {
|
||||||
|
if (
|
||||||
|
row.missing_requirements !== "-" ||
|
||||||
|
row.gate_status !== "ready_to_implement_lifecycle_probe"
|
||||||
|
) {
|
||||||
|
throw new Error(`${row.family}: ready Python runtime probe gate drift`);
|
||||||
|
}
|
||||||
|
} else if (
|
||||||
|
row.missing_requirements === "-" ||
|
||||||
|
row.gate_status !== "blocked_missing_host_runtime"
|
||||||
|
) {
|
||||||
|
throw new Error(`${row.family}: missing-runtime Python probe gate drift`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async function verifyBrowserPythonNativeRuntimeStatePlan() {
|
async function verifyBrowserPythonNativeRuntimeStatePlan() {
|
||||||
const rows = parseTsv(
|
const rows = parseTsv(
|
||||||
await fetchText("../../build/wasm/sim-configs-inventory/python-remap-native-runtime-state-plan.tsv"),
|
await fetchText("../../build/wasm/sim-configs-inventory/python-remap-native-runtime-state-plan.tsv"),
|
||||||
@@ -1232,6 +1417,8 @@
|
|||||||
boundaryKind: "external_user_m_process",
|
boundaryKind: "external_user_m_process",
|
||||||
target: "axis/vismach/millturn/example.ngc",
|
target: "axis/vismach/millturn/example.ngc",
|
||||||
runtimeProbe: "linuxcnc_millturn_user_m_runtime_probe",
|
runtimeProbe: "linuxcnc_millturn_user_m_runtime_probe",
|
||||||
|
requiredNativeProof: "native_runtime_state_probe_required",
|
||||||
|
optInEnv: "ENABLE_MILLTURN_USER_M_RUNTIME_PROBE=1",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
@@ -1240,6 +1427,8 @@
|
|||||||
boundaryKind: "tool_database_process",
|
boundaryKind: "tool_database_process",
|
||||||
target: "axis/db_demo/base.ngc",
|
target: "axis/db_demo/base.ngc",
|
||||||
runtimeProbe: "linuxcnc_tool_db_runtime_probe",
|
runtimeProbe: "linuxcnc_tool_db_runtime_probe",
|
||||||
|
requiredNativeProof: "native_db_process_protocol_probe_required",
|
||||||
|
optInEnv: "ENABLE_TOOL_DB_RUNTIME_PROBE=1",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
@@ -1248,6 +1437,8 @@
|
|||||||
boundaryKind: "python_runtime",
|
boundaryKind: "python_runtime",
|
||||||
target: "axis/remap/stop-lookahead/nc_files",
|
target: "axis/remap/stop-lookahead/nc_files",
|
||||||
runtimeProbe: "linuxcnc_python_remap_runtime_probe",
|
runtimeProbe: "linuxcnc_python_remap_runtime_probe",
|
||||||
|
requiredNativeProof: "linuxcnc_python_runtime_lifecycle_probe_required",
|
||||||
|
optInEnv: "ENABLE_PYTHON_REMAP_RUNTIME_PROBE=1",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
]);
|
]);
|
||||||
@@ -1264,7 +1455,9 @@
|
|||||||
if (
|
if (
|
||||||
row.boundary_kind !== expectedRow.boundaryKind ||
|
row.boundary_kind !== expectedRow.boundaryKind ||
|
||||||
row.target !== expectedRow.target ||
|
row.target !== expectedRow.target ||
|
||||||
row.runtime_probe !== expectedRow.runtimeProbe
|
row.runtime_probe !== expectedRow.runtimeProbe ||
|
||||||
|
row.required_native_proof !== expectedRow.requiredNativeProof ||
|
||||||
|
row.opt_in_env !== expectedRow.optInEnv
|
||||||
) {
|
) {
|
||||||
throw new Error(`${row.boundary_class}: native runtime probe metadata drift`);
|
throw new Error(`${row.boundary_class}: native runtime probe metadata drift`);
|
||||||
}
|
}
|
||||||
@@ -1289,6 +1482,25 @@
|
|||||||
if (row.runtime_ready === "0" && row.probe_status !== "skipped_missing_host_runtime") {
|
if (row.runtime_ready === "0" && row.probe_status !== "skipped_missing_host_runtime") {
|
||||||
throw new Error(`${row.boundary_class}: non-ready runtime must remain skipped`);
|
throw new Error(`${row.boundary_class}: non-ready runtime must remain skipped`);
|
||||||
}
|
}
|
||||||
|
if (row.runtime_ready === "0" && !row.probe_note.includes("missing_host_runtime")) {
|
||||||
|
throw new Error(`${row.boundary_class}: missing-runtime probe note drift`);
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
row.probe_status === "ready_disabled_by_default" &&
|
||||||
|
!row.probe_note.includes(`set_${row.opt_in_env.split("=")[0]}`)
|
||||||
|
) {
|
||||||
|
throw new Error(`${row.boundary_class}: ready-disabled probe note drift`);
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
row.probe_status.startsWith("runtime_") &&
|
||||||
|
row.probe_status.endsWith("_passed") &&
|
||||||
|
!row.probe_note.includes("without_promotion")
|
||||||
|
) {
|
||||||
|
throw new Error(`${row.boundary_class}: passed probe note drift`);
|
||||||
|
}
|
||||||
|
if (row.probe_note === "-") {
|
||||||
|
throw new Error(`${row.boundary_class}: native runtime probe lacks note`);
|
||||||
|
}
|
||||||
if (row.execution_enabled !== "0" || row.promotion_allowed !== "0") {
|
if (row.execution_enabled !== "0" || row.promotion_allowed !== "0") {
|
||||||
throw new Error(`${row.boundary_class}: native runtime probe must not enable execution or promotion`);
|
throw new Error(`${row.boundary_class}: native runtime probe must not enable execution or promotion`);
|
||||||
}
|
}
|
||||||
@@ -1298,6 +1510,288 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function verifyBrowserRuntimeProbeGateAlignment() {
|
||||||
|
const rows = parseTsv(
|
||||||
|
await fetchText("../../build/wasm/sim-configs-inventory/runtime-probe-gate-alignment.tsv"),
|
||||||
|
);
|
||||||
|
const expected = new Map([
|
||||||
|
[
|
||||||
|
"L4-USER-M-PROCESS",
|
||||||
|
{
|
||||||
|
boundaryKind: "external_user_m_process",
|
||||||
|
target: "axis/vismach/millturn/example.ngc",
|
||||||
|
gateArtifact: "user-m-process-native-runtime-probe-gate.tsv",
|
||||||
|
requiredNativeProof: "native_runtime_state_probe_required",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"L4-TOOL-DB",
|
||||||
|
{
|
||||||
|
boundaryKind: "tool_database_process",
|
||||||
|
target: "axis/db_demo/base.ngc",
|
||||||
|
gateArtifact: "tool-db-process-native-runtime-probe-gate.tsv",
|
||||||
|
requiredNativeProof: "native_db_process_protocol_probe_required",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"L4-PYTHON-REMAP",
|
||||||
|
{
|
||||||
|
boundaryKind: "python_runtime",
|
||||||
|
target: "axis/remap/stop-lookahead/nc_files",
|
||||||
|
gateArtifact: "python-remap-native-runtime-probe-gate.tsv",
|
||||||
|
requiredNativeProof: "linuxcnc_python_runtime_lifecycle_probe_required",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (rows.length !== expected.size) {
|
||||||
|
throw new Error(`browser_runtime_probe_gate_alignment: row count drift ${rows.length}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const row of rows) {
|
||||||
|
const expectedRow = expected.get(row.boundary_class);
|
||||||
|
if (!expectedRow) {
|
||||||
|
throw new Error(`browser_runtime_probe_gate_alignment: unexpected ${row.boundary_class}`);
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
row.boundary_kind !== expectedRow.boundaryKind ||
|
||||||
|
row.target !== expectedRow.target ||
|
||||||
|
row.gate_artifact !== expectedRow.gateArtifact ||
|
||||||
|
row.gate_required_native_proof !== expectedRow.requiredNativeProof ||
|
||||||
|
row.native_required_native_proof !== expectedRow.requiredNativeProof
|
||||||
|
) {
|
||||||
|
throw new Error(`${row.boundary_class}: runtime probe gate alignment metadata drift`);
|
||||||
|
}
|
||||||
|
if (!/^ENABLE_[A-Z0-9_]+=1$/.test(row.native_opt_in_env)) {
|
||||||
|
throw new Error(`${row.boundary_class}: runtime probe gate alignment opt-in drift`);
|
||||||
|
}
|
||||||
|
if (row.gate_runtime_ready !== row.native_runtime_ready) {
|
||||||
|
throw new Error(`${row.boundary_class}: gate/native runtime readiness drift`);
|
||||||
|
}
|
||||||
|
if (row.gate_source_proof_ready !== "1" || row.native_source_proof_ready !== "1") {
|
||||||
|
throw new Error(`${row.boundary_class}: runtime probe gate source proof drift`);
|
||||||
|
}
|
||||||
|
for (const field of [
|
||||||
|
"missing_requirements_match",
|
||||||
|
"required_native_proof_match",
|
||||||
|
"execution_disabled_match",
|
||||||
|
"promotion_disabled_match",
|
||||||
|
"status_compatible",
|
||||||
|
"alignment_ok",
|
||||||
|
]) {
|
||||||
|
if (row[field] !== "1") {
|
||||||
|
throw new Error(`${row.boundary_class}: runtime probe gate ${field} failed`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!row.notes.includes("before_promotion")) {
|
||||||
|
throw new Error(`${row.boundary_class}: runtime probe gate alignment notes drift`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function verifyBrowserNativeRuntimeProbeExecutionPlan() {
|
||||||
|
const rows = parseTsv(
|
||||||
|
await fetchText("../../build/wasm/sim-configs-inventory/native-runtime-probe-execution-plan.tsv"),
|
||||||
|
);
|
||||||
|
const expected = new Map([
|
||||||
|
[
|
||||||
|
"L4-USER-M-PROCESS",
|
||||||
|
{
|
||||||
|
boundaryKind: "external_user_m_process",
|
||||||
|
target: "axis/vismach/millturn/example.ngc",
|
||||||
|
runtimeProbe: "linuxcnc_millturn_user_m_runtime_probe",
|
||||||
|
requiredNativeProof: "native_runtime_state_probe_required",
|
||||||
|
optInEnv: "ENABLE_MILLTURN_USER_M_RUNTIME_PROBE=1",
|
||||||
|
script: "wasm-port/tests/native/probe_millturn_user_m_runtime.sh",
|
||||||
|
expectedPassStatus: "runtime_state_probe_passed",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"L4-TOOL-DB",
|
||||||
|
{
|
||||||
|
boundaryKind: "tool_database_process",
|
||||||
|
target: "axis/db_demo/base.ngc",
|
||||||
|
runtimeProbe: "linuxcnc_tool_db_runtime_probe",
|
||||||
|
requiredNativeProof: "native_db_process_protocol_probe_required",
|
||||||
|
optInEnv: "ENABLE_TOOL_DB_RUNTIME_PROBE=1",
|
||||||
|
script: "wasm-port/tests/native/probe_tool_db_runtime.sh",
|
||||||
|
expectedPassStatus: "runtime_protocol_probe_passed",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"L4-PYTHON-REMAP",
|
||||||
|
{
|
||||||
|
boundaryKind: "python_runtime",
|
||||||
|
target: "axis/remap/stop-lookahead/nc_files",
|
||||||
|
runtimeProbe: "linuxcnc_python_remap_runtime_probe",
|
||||||
|
requiredNativeProof: "linuxcnc_python_runtime_lifecycle_probe_required",
|
||||||
|
optInEnv: "ENABLE_PYTHON_REMAP_RUNTIME_PROBE=1",
|
||||||
|
script: "wasm-port/tests/native/probe_python_remap_runtime.sh",
|
||||||
|
expectedPassStatus: "runtime_lifecycle_probe_passed",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (rows.length !== expected.size) {
|
||||||
|
throw new Error(`browser_native_runtime_probe_execution_plan: row count drift ${rows.length}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const row of rows) {
|
||||||
|
const expectedRow = expected.get(row.boundary_class);
|
||||||
|
if (!expectedRow) {
|
||||||
|
throw new Error(`browser_native_runtime_probe_execution_plan: unexpected ${row.boundary_class}`);
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
row.boundary_kind !== expectedRow.boundaryKind ||
|
||||||
|
row.target !== expectedRow.target ||
|
||||||
|
row.runtime_probe !== expectedRow.runtimeProbe ||
|
||||||
|
row.required_native_proof !== expectedRow.requiredNativeProof ||
|
||||||
|
row.opt_in_env !== expectedRow.optInEnv ||
|
||||||
|
row.expected_pass_status !== expectedRow.expectedPassStatus
|
||||||
|
) {
|
||||||
|
throw new Error(`${row.boundary_class}: native runtime execution plan metadata drift`);
|
||||||
|
}
|
||||||
|
if (row.execution_command !== `${expectedRow.optInEnv} bash ${expectedRow.script}`) {
|
||||||
|
throw new Error(`${row.boundary_class}: native runtime execution command drift`);
|
||||||
|
}
|
||||||
|
if (row.source_proof_ready !== "1" || row.gate_alignment_ok !== "1") {
|
||||||
|
throw new Error(`${row.boundary_class}: native runtime execution plan is not source/alignment ready`);
|
||||||
|
}
|
||||||
|
if (row.execution_enabled !== "0" || row.promotion_allowed !== "0") {
|
||||||
|
throw new Error(`${row.boundary_class}: native runtime execution plan must not enable execution or promotion`);
|
||||||
|
}
|
||||||
|
for (const requirement of [
|
||||||
|
`native:${expectedRow.expectedPassStatus}`,
|
||||||
|
"node:inventory_gate_alignment_after_native_pass",
|
||||||
|
"browser:smoke_gate_alignment_after_node_pass",
|
||||||
|
"manual:promotion_lock_update_required",
|
||||||
|
]) {
|
||||||
|
if (!row.promotion_requires.includes(requirement)) {
|
||||||
|
throw new Error(`${row.boundary_class}: native runtime execution plan missing ${requirement}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (row.current_probe_status === row.expected_pass_status) {
|
||||||
|
if (row.plan_status !== "native_probe_passed_waiting_for_node_browser_promotion_proof") {
|
||||||
|
throw new Error(`${row.boundary_class}: passed execution plan status drift`);
|
||||||
|
}
|
||||||
|
} else if (row.runtime_ready === "1") {
|
||||||
|
if (row.plan_status !== "ready_to_run_opt_in_probe" || row.missing_requirements !== "-") {
|
||||||
|
throw new Error(`${row.boundary_class}: ready execution plan status drift`);
|
||||||
|
}
|
||||||
|
} else if (
|
||||||
|
row.plan_status !== "blocked_missing_host_runtime" ||
|
||||||
|
row.missing_requirements === "-"
|
||||||
|
) {
|
||||||
|
throw new Error(`${row.boundary_class}: blocked execution plan status drift`);
|
||||||
|
}
|
||||||
|
if (!row.notes.includes("no_automatic_promotion")) {
|
||||||
|
throw new Error(`${row.boundary_class}: native runtime execution plan notes drift`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function verifyBrowserNativeRuntimeProbePassEvidenceContract() {
|
||||||
|
const rows = parseTsv(
|
||||||
|
await fetchText("../../build/wasm/sim-configs-inventory/native-runtime-probe-pass-evidence-contract.tsv"),
|
||||||
|
);
|
||||||
|
const expected = new Map([
|
||||||
|
[
|
||||||
|
"L4-USER-M-PROCESS",
|
||||||
|
{
|
||||||
|
boundaryKind: "external_user_m_process",
|
||||||
|
target: "axis/vismach/millturn/example.ngc",
|
||||||
|
runtimeProbe: "linuxcnc_millturn_user_m_runtime_probe",
|
||||||
|
expectedPassStatus: "runtime_state_probe_passed",
|
||||||
|
evidence: [
|
||||||
|
"millturn_user_m_runtime_probe_status=runtime_state_probe_passed",
|
||||||
|
"millturn_user_m_M128_runtime_state_ok=1",
|
||||||
|
"millturn_user_m_M129_runtime_state_ok=1",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"L4-TOOL-DB",
|
||||||
|
{
|
||||||
|
boundaryKind: "tool_database_process",
|
||||||
|
target: "axis/db_demo/base.ngc",
|
||||||
|
runtimeProbe: "linuxcnc_tool_db_runtime_probe",
|
||||||
|
expectedPassStatus: "runtime_protocol_probe_passed",
|
||||||
|
evidence: [
|
||||||
|
"tool_db_runtime_probe_status=runtime_protocol_probe_passed",
|
||||||
|
"tool_db_protocol_version=v2.1",
|
||||||
|
"tool_db_runtime_protocol_probe_ok=1",
|
||||||
|
"tool_db_persistence_state_ok=1",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"L4-PYTHON-REMAP",
|
||||||
|
{
|
||||||
|
boundaryKind: "python_runtime",
|
||||||
|
target: "axis/remap/stop-lookahead/nc_files",
|
||||||
|
runtimeProbe: "linuxcnc_python_remap_runtime_probe",
|
||||||
|
expectedPassStatus: "runtime_lifecycle_probe_passed",
|
||||||
|
evidence: [
|
||||||
|
"python_remap_runtime_probe_status=runtime_lifecycle_probe_passed",
|
||||||
|
"python_remap_lifecycle_generator_first_yield=2",
|
||||||
|
"python_remap_runtime_lifecycle_probe_ok=1",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (rows.length !== expected.size) {
|
||||||
|
throw new Error(`browser_native_runtime_probe_pass_evidence_contract: row count drift ${rows.length}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const row of rows) {
|
||||||
|
const expectedRow = expected.get(row.boundary_class);
|
||||||
|
if (!expectedRow) {
|
||||||
|
throw new Error(`browser_native_runtime_probe_pass_evidence_contract: unexpected ${row.boundary_class}`);
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
row.boundary_kind !== expectedRow.boundaryKind ||
|
||||||
|
row.target !== expectedRow.target ||
|
||||||
|
row.runtime_probe !== expectedRow.runtimeProbe ||
|
||||||
|
row.expected_pass_status !== expectedRow.expectedPassStatus ||
|
||||||
|
row.stdout_log === "-"
|
||||||
|
) {
|
||||||
|
throw new Error(`${row.boundary_class}: native pass evidence metadata drift`);
|
||||||
|
}
|
||||||
|
for (const evidence of expectedRow.evidence) {
|
||||||
|
if (!row.expected_evidence_keys.includes(evidence)) {
|
||||||
|
throw new Error(`${row.boundary_class}: native pass evidence missing ${evidence}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (row.execution_enabled !== "0" || row.promotion_allowed !== "0") {
|
||||||
|
throw new Error(`${row.boundary_class}: native pass evidence contract must not enable execution or promotion`);
|
||||||
|
}
|
||||||
|
if (row.current_probe_status === row.expected_pass_status) {
|
||||||
|
if (
|
||||||
|
row.evidence_required_now !== "1" ||
|
||||||
|
row.observed_evidence_ready !== "1" ||
|
||||||
|
row.missing_evidence_keys !== "-" ||
|
||||||
|
row.evidence_status !== "native_pass_evidence_observed"
|
||||||
|
) {
|
||||||
|
throw new Error(`${row.boundary_class}: native pass evidence must be observed after pass`);
|
||||||
|
}
|
||||||
|
} else if (
|
||||||
|
row.evidence_required_now !== "0" ||
|
||||||
|
row.observed_evidence_ready !== "0" ||
|
||||||
|
row.missing_evidence_keys !== "-" ||
|
||||||
|
row.evidence_status !== "pending_until_native_pass"
|
||||||
|
) {
|
||||||
|
throw new Error(`${row.boundary_class}: native pass evidence must remain pending before pass`);
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
!row.notes.includes("no_automatic_promotion") &&
|
||||||
|
!row.notes.includes("before_node_browser_promotion")
|
||||||
|
) {
|
||||||
|
throw new Error(`${row.boundary_class}: native pass evidence notes drift`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async function verifyBrowserRuntimeBoundaryContractSummary() {
|
async function verifyBrowserRuntimeBoundaryContractSummary() {
|
||||||
const rows = parseTsv(
|
const rows = parseTsv(
|
||||||
await fetchText("../../build/wasm/sim-configs-inventory/runtime-boundary-contract-summary.tsv"),
|
await fetchText("../../build/wasm/sim-configs-inventory/runtime-boundary-contract-summary.tsv"),
|
||||||
@@ -1442,6 +1936,346 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function verifyBrowserRuntimeBoundaryPromotionReadiness() {
|
||||||
|
const rows = parseTsv(
|
||||||
|
await fetchText("../../build/wasm/sim-configs-inventory/runtime-boundary-promotion-readiness.tsv"),
|
||||||
|
);
|
||||||
|
const expected = new Map([
|
||||||
|
[
|
||||||
|
"L4-USER-M-PROCESS",
|
||||||
|
{
|
||||||
|
boundaryKind: "external_user_m_process",
|
||||||
|
target: "axis/vismach/millturn/example.ngc",
|
||||||
|
blocked: "L4-USER-M-PROCESS",
|
||||||
|
expectedPassStatus: "runtime_state_probe_passed",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"L4-TOOL-DB",
|
||||||
|
{
|
||||||
|
boundaryKind: "tool_database_process",
|
||||||
|
target: "axis/db_demo/base.ngc",
|
||||||
|
blocked: "L4-TOOL-DB",
|
||||||
|
expectedPassStatus: "runtime_protocol_probe_passed",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"L4-PYTHON-REMAP",
|
||||||
|
{
|
||||||
|
boundaryKind: "python_runtime",
|
||||||
|
target: "axis/remap/stop-lookahead/nc_files",
|
||||||
|
blocked: "L4-PYTHON-REMAP",
|
||||||
|
expectedPassStatus: "runtime_lifecycle_probe_passed",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (rows.length !== expected.size) {
|
||||||
|
throw new Error(`browser_runtime_boundary_promotion_readiness: row count drift ${rows.length}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const row of rows) {
|
||||||
|
const expectedRow = expected.get(row.boundary_class);
|
||||||
|
if (!expectedRow) {
|
||||||
|
throw new Error(`browser_runtime_boundary_promotion_readiness: unexpected ${row.boundary_class}`);
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
row.boundary_kind !== expectedRow.boundaryKind ||
|
||||||
|
row.target !== expectedRow.target ||
|
||||||
|
row.blocked !== expectedRow.blocked ||
|
||||||
|
row.expected_pass_status !== expectedRow.expectedPassStatus ||
|
||||||
|
row.native_evidence_status === "-"
|
||||||
|
) {
|
||||||
|
throw new Error(`${row.boundary_class}: promotion readiness metadata drift`);
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
row.node_inventory_gate_complete !== "0" ||
|
||||||
|
row.browser_smoke_gate_complete !== "0" ||
|
||||||
|
row.promotion_lock_active !== "1" ||
|
||||||
|
row.manual_lock_update_required !== "1" ||
|
||||||
|
row.promotion_ready !== "0" ||
|
||||||
|
row.execution_enabled !== "0" ||
|
||||||
|
row.promotion_allowed !== "0"
|
||||||
|
) {
|
||||||
|
throw new Error(`${row.boundary_class}: promotion readiness must remain locked`);
|
||||||
|
}
|
||||||
|
if (row.current_probe_status === row.expected_pass_status) {
|
||||||
|
if (row.native_pass_ready !== "1" || row.blocking_reason === "awaiting_native_runtime_probe_pass") {
|
||||||
|
throw new Error(`${row.boundary_class}: passed promotion readiness state drift`);
|
||||||
|
}
|
||||||
|
} else if (
|
||||||
|
row.native_pass_ready !== "0" ||
|
||||||
|
row.blocking_reason !== "awaiting_native_runtime_probe_pass"
|
||||||
|
) {
|
||||||
|
throw new Error(`${row.boundary_class}: pending promotion readiness state drift`);
|
||||||
|
}
|
||||||
|
if (!row.notes.includes("no_automatic_promotion")) {
|
||||||
|
throw new Error(`${row.boundary_class}: promotion readiness notes drift`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function verifyBrowserRuntimeBoundaryPromotionBlockers() {
|
||||||
|
const rows = parseTsv(
|
||||||
|
await fetchText("../../build/wasm/sim-configs-inventory/runtime-boundary-promotion-blockers.tsv"),
|
||||||
|
);
|
||||||
|
const expected = new Map([
|
||||||
|
[
|
||||||
|
"L4-USER-M-PROCESS",
|
||||||
|
{
|
||||||
|
boundaryKind: "external_user_m_process",
|
||||||
|
target: "axis/vismach/millturn/example.ngc",
|
||||||
|
blocked: "L4-USER-M-PROCESS",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"L4-TOOL-DB",
|
||||||
|
{
|
||||||
|
boundaryKind: "tool_database_process",
|
||||||
|
target: "axis/db_demo/base.ngc",
|
||||||
|
blocked: "L4-TOOL-DB",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"L4-PYTHON-REMAP",
|
||||||
|
{
|
||||||
|
boundaryKind: "python_runtime",
|
||||||
|
target: "axis/remap/stop-lookahead/nc_files",
|
||||||
|
blocked: "L4-PYTHON-REMAP",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (rows.length !== expected.size) {
|
||||||
|
throw new Error(`browser_runtime_boundary_promotion_blockers: row count drift ${rows.length}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const row of rows) {
|
||||||
|
const expectedRow = expected.get(row.boundary_class);
|
||||||
|
if (!expectedRow) {
|
||||||
|
throw new Error(`browser_runtime_boundary_promotion_blockers: unexpected ${row.boundary_class}`);
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
row.boundary_kind !== expectedRow.boundaryKind ||
|
||||||
|
row.target !== expectedRow.target ||
|
||||||
|
row.blocked !== expectedRow.blocked
|
||||||
|
) {
|
||||||
|
throw new Error(`${row.boundary_class}: promotion blocker metadata drift`);
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
row.promotion_ready !== "0" ||
|
||||||
|
row.execution_enabled !== "0" ||
|
||||||
|
row.promotion_allowed !== "0" ||
|
||||||
|
row.blocker_keys === "-" ||
|
||||||
|
row.next_unblock_action === "-"
|
||||||
|
) {
|
||||||
|
throw new Error(`${row.boundary_class}: promotion blocker summary must remain blocked and actionable`);
|
||||||
|
}
|
||||||
|
if (!/^[1-9][0-9]*$/.test(row.blocker_count)) {
|
||||||
|
throw new Error(`${row.boundary_class}: invalid promotion blocker count`);
|
||||||
|
}
|
||||||
|
for (const blocker of [
|
||||||
|
"node_inventory_gate_not_complete",
|
||||||
|
"browser_smoke_gate_not_complete",
|
||||||
|
"promotion_lock_active",
|
||||||
|
"manual_lock_update_required",
|
||||||
|
]) {
|
||||||
|
if (!row.blocker_keys.includes(blocker)) {
|
||||||
|
throw new Error(`${row.boundary_class}: promotion blocker missing ${blocker}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
row.missing_runtime_requirements !== "-" &&
|
||||||
|
!row.blocker_keys.includes("host_runtime_requirements_missing")
|
||||||
|
) {
|
||||||
|
throw new Error(`${row.boundary_class}: host runtime blocker missing`);
|
||||||
|
}
|
||||||
|
if (!row.notes.includes("no_automatic_promotion")) {
|
||||||
|
throw new Error(`${row.boundary_class}: promotion blocker notes drift`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function verifyBrowserRuntimeBoundaryPostNativePassGates() {
|
||||||
|
const rows = parseTsv(
|
||||||
|
await fetchText("../../build/wasm/sim-configs-inventory/runtime-boundary-post-native-pass-gates.tsv"),
|
||||||
|
);
|
||||||
|
const expected = new Map([
|
||||||
|
[
|
||||||
|
"L4-USER-M-PROCESS",
|
||||||
|
{
|
||||||
|
boundaryKind: "external_user_m_process",
|
||||||
|
target: "axis/vismach/millturn/example.ngc",
|
||||||
|
blocked: "L4-USER-M-PROCESS",
|
||||||
|
nodeProof: "not_user_m_event_only",
|
||||||
|
browserProof: "no_full_process_claim",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"L4-TOOL-DB",
|
||||||
|
{
|
||||||
|
boundaryKind: "tool_database_process",
|
||||||
|
target: "axis/db_demo/base.ngc",
|
||||||
|
blocked: "L4-TOOL-DB",
|
||||||
|
nodeProof: "not_tbl_fallback",
|
||||||
|
browserProof: "opfs_persistence_only",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"L4-PYTHON-REMAP",
|
||||||
|
{
|
||||||
|
boundaryKind: "python_runtime",
|
||||||
|
target: "axis/remap/stop-lookahead/nc_files",
|
||||||
|
blocked: "L4-PYTHON-REMAP",
|
||||||
|
nodeProof: "not_js_semantics",
|
||||||
|
browserProof: "no_full_process_claim",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (rows.length !== expected.size) {
|
||||||
|
throw new Error(`browser_runtime_boundary_post_native_pass_gates: row count drift ${rows.length}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const row of rows) {
|
||||||
|
const expectedRow = expected.get(row.boundary_class);
|
||||||
|
if (!expectedRow) {
|
||||||
|
throw new Error(`browser_runtime_boundary_post_native_pass_gates: unexpected ${row.boundary_class}`);
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
row.boundary_kind !== expectedRow.boundaryKind ||
|
||||||
|
row.target !== expectedRow.target ||
|
||||||
|
row.blocked !== expectedRow.blocked
|
||||||
|
) {
|
||||||
|
throw new Error(`${row.boundary_class}: post-native-pass gate metadata drift`);
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
!row.required_node_proof.includes(expectedRow.nodeProof) ||
|
||||||
|
!row.required_browser_proof.includes(expectedRow.browserProof)
|
||||||
|
) {
|
||||||
|
throw new Error(`${row.boundary_class}: post-native-pass proof requirement drift`);
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
row.manual_lock_update_required !== "1" ||
|
||||||
|
row.promotion_lock_active !== "1" ||
|
||||||
|
row.execution_enabled !== "0" ||
|
||||||
|
row.promotion_allowed !== "0"
|
||||||
|
) {
|
||||||
|
throw new Error(`${row.boundary_class}: post-native-pass gate must remain locked`);
|
||||||
|
}
|
||||||
|
if (row.native_evidence_ready === "1") {
|
||||||
|
if (
|
||||||
|
row.native_pass_ready !== "1" ||
|
||||||
|
row.node_gate_status !== "pending_node_inventory_promotion_gate" ||
|
||||||
|
row.browser_gate_status !== "blocked_until_node_gate_complete" ||
|
||||||
|
row.gate_status !== "waiting_for_node_browser_manual_promotion"
|
||||||
|
) {
|
||||||
|
throw new Error(`${row.boundary_class}: post-native-pass ready state drift`);
|
||||||
|
}
|
||||||
|
} else if (
|
||||||
|
row.node_gate_status !== "blocked_until_native_pass_evidence" ||
|
||||||
|
row.browser_gate_status !== "blocked_until_node_gate_complete" ||
|
||||||
|
row.gate_status !== "blocked_before_native_pass"
|
||||||
|
) {
|
||||||
|
throw new Error(`${row.boundary_class}: post-native-pass blocked state drift`);
|
||||||
|
}
|
||||||
|
if (!row.notes.includes("no_automatic_promotion")) {
|
||||||
|
throw new Error(`${row.boundary_class}: post-native-pass notes drift`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function verifyBrowserRuntimeBoundaryHostPreflight() {
|
||||||
|
const rows = parseTsv(
|
||||||
|
await fetchText("../../build/wasm/sim-configs-inventory/runtime-boundary-host-preflight.tsv"),
|
||||||
|
);
|
||||||
|
const expected = new Map([
|
||||||
|
[
|
||||||
|
"L4-USER-M-PROCESS",
|
||||||
|
{
|
||||||
|
boundaryKind: "external_user_m_process",
|
||||||
|
target: "axis/vismach/millturn/example.ngc",
|
||||||
|
blocked: "L4-USER-M-PROCESS",
|
||||||
|
requiredRuntime: "linuxcnc_task_hal_tcl_user_m_process",
|
||||||
|
optInEnv: "ENABLE_MILLTURN_USER_M_RUNTIME_PROBE=1",
|
||||||
|
script: "probe_millturn_user_m_runtime.sh",
|
||||||
|
missingToken: "linuxcnc",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"L4-TOOL-DB",
|
||||||
|
{
|
||||||
|
boundaryKind: "tool_database_process",
|
||||||
|
target: "axis/db_demo/base.ngc",
|
||||||
|
blocked: "L4-TOOL-DB",
|
||||||
|
requiredRuntime: "linuxcnc_tooldata_db_process",
|
||||||
|
optInEnv: "ENABLE_TOOL_DB_RUNTIME_PROBE=1",
|
||||||
|
script: "probe_tool_db_runtime.sh",
|
||||||
|
missingToken: "milltask",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"L4-PYTHON-REMAP",
|
||||||
|
{
|
||||||
|
boundaryKind: "python_runtime",
|
||||||
|
target: "axis/remap/stop-lookahead/nc_files",
|
||||||
|
blocked: "L4-PYTHON-REMAP",
|
||||||
|
requiredRuntime: "linuxcnc_python_remap_runtime",
|
||||||
|
optInEnv: "ENABLE_PYTHON_REMAP_RUNTIME_PROBE=1",
|
||||||
|
script: "probe_python_remap_runtime.sh",
|
||||||
|
missingToken: "linuxcnc",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (rows.length !== expected.size) {
|
||||||
|
throw new Error(`browser_runtime_boundary_host_preflight: row count drift ${rows.length}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const row of rows) {
|
||||||
|
const expectedRow = expected.get(row.boundary_class);
|
||||||
|
if (!expectedRow) {
|
||||||
|
throw new Error(`browser_runtime_boundary_host_preflight: unexpected ${row.boundary_class}`);
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
row.boundary_kind !== expectedRow.boundaryKind ||
|
||||||
|
row.target !== expectedRow.target ||
|
||||||
|
row.blocked !== expectedRow.blocked ||
|
||||||
|
row.required_runtime !== expectedRow.requiredRuntime ||
|
||||||
|
row.opt_in_env !== expectedRow.optInEnv
|
||||||
|
) {
|
||||||
|
throw new Error(`${row.boundary_class}: host preflight metadata drift`);
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
row.source_proof_ready !== "1" ||
|
||||||
|
row.required_native_proof === "-" ||
|
||||||
|
row.runtime_requirements === "-" ||
|
||||||
|
!row.runtime_requirements.includes(`${expectedRow.missingToken}:`)
|
||||||
|
) {
|
||||||
|
throw new Error(`${row.boundary_class}: host preflight readiness evidence drift`);
|
||||||
|
}
|
||||||
|
if (row.execution_command !== `${row.opt_in_env} bash wasm-port/tests/native/${expectedRow.script}`) {
|
||||||
|
throw new Error(`${row.boundary_class}: host preflight execution command drift`);
|
||||||
|
}
|
||||||
|
if (row.execution_enabled !== "0" || row.promotion_allowed !== "0") {
|
||||||
|
throw new Error(`${row.boundary_class}: host preflight must not enable execution or promotion`);
|
||||||
|
}
|
||||||
|
if (row.runtime_ready === "1") {
|
||||||
|
if (row.missing_requirements !== "-" || row.preflight_status !== "ready_to_run_opt_in_native_probe") {
|
||||||
|
throw new Error(`${row.boundary_class}: ready host preflight drift`);
|
||||||
|
}
|
||||||
|
} else if (
|
||||||
|
!row.missing_requirements.includes(expectedRow.missingToken) ||
|
||||||
|
row.preflight_status !== "blocked_missing_host_runtime"
|
||||||
|
) {
|
||||||
|
throw new Error(`${row.boundary_class}: blocked host preflight drift`);
|
||||||
|
}
|
||||||
|
if (!row.notes.includes("no_automatic_promotion")) {
|
||||||
|
throw new Error(`${row.boundary_class}: host preflight notes drift`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async function verifyBrowserNextBoundaryRecommendations() {
|
async function verifyBrowserNextBoundaryRecommendations() {
|
||||||
const rows = parseTsv(
|
const rows = parseTsv(
|
||||||
await fetchText("../../build/wasm/sim-configs-inventory/next-boundary-recommendations.tsv"),
|
await fetchText("../../build/wasm/sim-configs-inventory/next-boundary-recommendations.tsv"),
|
||||||
@@ -2086,17 +2920,26 @@
|
|||||||
await verifyBrowserUserMNativeRuntimeProbeGate();
|
await verifyBrowserUserMNativeRuntimeProbeGate();
|
||||||
await verifyBrowserToolDbTransactionPlan();
|
await verifyBrowserToolDbTransactionPlan();
|
||||||
await verifyBrowserToolDbNativeRuntimeReadiness();
|
await verifyBrowserToolDbNativeRuntimeReadiness();
|
||||||
|
await verifyBrowserToolDbNativeRuntimeProbeGate();
|
||||||
await verifyBrowserPythonRuntimeContract();
|
await verifyBrowserPythonRuntimeContract();
|
||||||
await verifyBrowserPythonNativeRuntimeReadiness();
|
await verifyBrowserPythonNativeRuntimeReadiness();
|
||||||
|
await verifyBrowserPythonNativeRuntimeProbeGate();
|
||||||
await verifyBrowserPythonNativeRuntimeStatePlan();
|
await verifyBrowserPythonNativeRuntimeStatePlan();
|
||||||
await verifyBrowserPythonNativeRuntimeFixturePlan();
|
await verifyBrowserPythonNativeRuntimeFixturePlan();
|
||||||
await verifyBrowserNativeProofAlignment();
|
await verifyBrowserNativeProofAlignment();
|
||||||
const runtimeNativeAlignmentSummaryRows =
|
const runtimeNativeAlignmentSummaryRows =
|
||||||
await verifyBrowserRuntimeNativeAlignmentSummary();
|
await verifyBrowserRuntimeNativeAlignmentSummary();
|
||||||
await verifyBrowserNativeRuntimeProbeSummary();
|
await verifyBrowserNativeRuntimeProbeSummary();
|
||||||
|
await verifyBrowserRuntimeProbeGateAlignment();
|
||||||
|
await verifyBrowserNativeRuntimeProbeExecutionPlan();
|
||||||
|
await verifyBrowserNativeRuntimeProbePassEvidenceContract();
|
||||||
await verifyBrowserRuntimeBoundaryContractSummary();
|
await verifyBrowserRuntimeBoundaryContractSummary();
|
||||||
await verifyBrowserRuntimeNativeAlignmentDetails(runtimeNativeAlignmentSummaryRows);
|
await verifyBrowserRuntimeNativeAlignmentDetails(runtimeNativeAlignmentSummaryRows);
|
||||||
await verifyBrowserBlockedRuntimePromotionLock();
|
await verifyBrowserBlockedRuntimePromotionLock();
|
||||||
|
await verifyBrowserRuntimeBoundaryPromotionReadiness();
|
||||||
|
await verifyBrowserRuntimeBoundaryPromotionBlockers();
|
||||||
|
await verifyBrowserRuntimeBoundaryPostNativePassGates();
|
||||||
|
await verifyBrowserRuntimeBoundaryHostPreflight();
|
||||||
await verifyBrowserNextBoundaryRecommendations();
|
await verifyBrowserNextBoundaryRecommendations();
|
||||||
|
|
||||||
const interp = await createLinuxCncInterpSdk({
|
const interp = await createLinuxCncInterpSdk({
|
||||||
|
|||||||
@@ -9,6 +9,9 @@ INI_BOUNDARY_SUMMARY="$ROOT_DIR/build/wasm/sim-configs-inventory/ini-boundary-su
|
|||||||
NATIVE_PROOF_ALIGNMENT_SUMMARY="$ROOT_DIR/build/wasm/sim-configs-inventory/native-proof-alignment-summary.tsv"
|
NATIVE_PROOF_ALIGNMENT_SUMMARY="$ROOT_DIR/build/wasm/sim-configs-inventory/native-proof-alignment-summary.tsv"
|
||||||
NATIVE_RUNTIME_PROBE_SUMMARY="$ROOT_DIR/build/wasm/sim-configs-inventory/native-runtime-probe-summary.tsv"
|
NATIVE_RUNTIME_PROBE_SUMMARY="$ROOT_DIR/build/wasm/sim-configs-inventory/native-runtime-probe-summary.tsv"
|
||||||
RUNTIME_BOUNDARY_NATIVE_ALIGNMENT_SUMMARY="$ROOT_DIR/build/wasm/sim-configs-inventory/runtime-boundary-native-alignment-summary.tsv"
|
RUNTIME_BOUNDARY_NATIVE_ALIGNMENT_SUMMARY="$ROOT_DIR/build/wasm/sim-configs-inventory/runtime-boundary-native-alignment-summary.tsv"
|
||||||
|
RUNTIME_PROBE_GATE_ALIGNMENT="$ROOT_DIR/build/wasm/sim-configs-inventory/runtime-probe-gate-alignment.tsv"
|
||||||
|
NATIVE_RUNTIME_PROBE_EXECUTION_PLAN="$ROOT_DIR/build/wasm/sim-configs-inventory/native-runtime-probe-execution-plan.tsv"
|
||||||
|
NATIVE_RUNTIME_PROBE_PASS_EVIDENCE_CONTRACT="$ROOT_DIR/build/wasm/sim-configs-inventory/native-runtime-probe-pass-evidence-contract.tsv"
|
||||||
RUNTIME_BOUNDARY_CONTRACT_SUMMARY="$ROOT_DIR/build/wasm/sim-configs-inventory/runtime-boundary-contract-summary.tsv"
|
RUNTIME_BOUNDARY_CONTRACT_SUMMARY="$ROOT_DIR/build/wasm/sim-configs-inventory/runtime-boundary-contract-summary.tsv"
|
||||||
USER_M_PROCESS_NATIVE_STATE_ALIGNMENT="$ROOT_DIR/build/wasm/sim-configs-inventory/user-m-process-native-state-alignment.tsv"
|
USER_M_PROCESS_NATIVE_STATE_ALIGNMENT="$ROOT_DIR/build/wasm/sim-configs-inventory/user-m-process-native-state-alignment.tsv"
|
||||||
USER_M_PROCESS_NATIVE_TRANSITION_ALIGNMENT="$ROOT_DIR/build/wasm/sim-configs-inventory/user-m-process-native-transition-alignment.tsv"
|
USER_M_PROCESS_NATIVE_TRANSITION_ALIGNMENT="$ROOT_DIR/build/wasm/sim-configs-inventory/user-m-process-native-transition-alignment.tsv"
|
||||||
@@ -18,13 +21,19 @@ USER_M_PROCESS_NATIVE_RUNTIME_PROBE_GATE="$ROOT_DIR/build/wasm/sim-configs-inven
|
|||||||
USER_M_PROCESS_TRANSITION_PLAN="$ROOT_DIR/build/wasm/sim-configs-inventory/user-m-process-transition-plan.tsv"
|
USER_M_PROCESS_TRANSITION_PLAN="$ROOT_DIR/build/wasm/sim-configs-inventory/user-m-process-transition-plan.tsv"
|
||||||
TOOL_DB_PROCESS_NATIVE_PROTOCOL_ALIGNMENT="$ROOT_DIR/build/wasm/sim-configs-inventory/tool-db-process-native-protocol-alignment.tsv"
|
TOOL_DB_PROCESS_NATIVE_PROTOCOL_ALIGNMENT="$ROOT_DIR/build/wasm/sim-configs-inventory/tool-db-process-native-protocol-alignment.tsv"
|
||||||
TOOL_DB_PROCESS_NATIVE_RUNTIME_READINESS="$ROOT_DIR/build/wasm/sim-configs-inventory/tool-db-process-native-runtime-readiness.tsv"
|
TOOL_DB_PROCESS_NATIVE_RUNTIME_READINESS="$ROOT_DIR/build/wasm/sim-configs-inventory/tool-db-process-native-runtime-readiness.tsv"
|
||||||
|
TOOL_DB_PROCESS_NATIVE_RUNTIME_PROBE_GATE="$ROOT_DIR/build/wasm/sim-configs-inventory/tool-db-process-native-runtime-probe-gate.tsv"
|
||||||
TOOL_DB_PROCESS_TRANSACTION_PLAN="$ROOT_DIR/build/wasm/sim-configs-inventory/tool-db-process-transaction-plan.tsv"
|
TOOL_DB_PROCESS_TRANSACTION_PLAN="$ROOT_DIR/build/wasm/sim-configs-inventory/tool-db-process-transaction-plan.tsv"
|
||||||
PYTHON_REMAP_NATIVE_RUNTIME_ALIGNMENT="$ROOT_DIR/build/wasm/sim-configs-inventory/python-remap-native-runtime-alignment.tsv"
|
PYTHON_REMAP_NATIVE_RUNTIME_ALIGNMENT="$ROOT_DIR/build/wasm/sim-configs-inventory/python-remap-native-runtime-alignment.tsv"
|
||||||
PYTHON_REMAP_NATIVE_RUNTIME_READINESS="$ROOT_DIR/build/wasm/sim-configs-inventory/python-remap-native-runtime-readiness.tsv"
|
PYTHON_REMAP_NATIVE_RUNTIME_READINESS="$ROOT_DIR/build/wasm/sim-configs-inventory/python-remap-native-runtime-readiness.tsv"
|
||||||
|
PYTHON_REMAP_NATIVE_RUNTIME_PROBE_GATE="$ROOT_DIR/build/wasm/sim-configs-inventory/python-remap-native-runtime-probe-gate.tsv"
|
||||||
PYTHON_REMAP_NATIVE_RUNTIME_STATE_PLAN="$ROOT_DIR/build/wasm/sim-configs-inventory/python-remap-native-runtime-state-plan.tsv"
|
PYTHON_REMAP_NATIVE_RUNTIME_STATE_PLAN="$ROOT_DIR/build/wasm/sim-configs-inventory/python-remap-native-runtime-state-plan.tsv"
|
||||||
PYTHON_REMAP_NATIVE_RUNTIME_FIXTURE_PLAN="$ROOT_DIR/build/wasm/sim-configs-inventory/python-remap-native-runtime-fixture-plan.tsv"
|
PYTHON_REMAP_NATIVE_RUNTIME_FIXTURE_PLAN="$ROOT_DIR/build/wasm/sim-configs-inventory/python-remap-native-runtime-fixture-plan.tsv"
|
||||||
PYTHON_REMAP_RUNTIME_CONTRACT="$ROOT_DIR/build/wasm/sim-configs-inventory/python-remap-runtime-contract.tsv"
|
PYTHON_REMAP_RUNTIME_CONTRACT="$ROOT_DIR/build/wasm/sim-configs-inventory/python-remap-runtime-contract.tsv"
|
||||||
BLOCKED_RUNTIME_PROMOTION_LOCK="$ROOT_DIR/build/wasm/sim-configs-inventory/blocked-runtime-promotion-lock.tsv"
|
BLOCKED_RUNTIME_PROMOTION_LOCK="$ROOT_DIR/build/wasm/sim-configs-inventory/blocked-runtime-promotion-lock.tsv"
|
||||||
|
RUNTIME_BOUNDARY_PROMOTION_READINESS="$ROOT_DIR/build/wasm/sim-configs-inventory/runtime-boundary-promotion-readiness.tsv"
|
||||||
|
RUNTIME_BOUNDARY_PROMOTION_BLOCKERS="$ROOT_DIR/build/wasm/sim-configs-inventory/runtime-boundary-promotion-blockers.tsv"
|
||||||
|
RUNTIME_BOUNDARY_POST_NATIVE_PASS_GATES="$ROOT_DIR/build/wasm/sim-configs-inventory/runtime-boundary-post-native-pass-gates.tsv"
|
||||||
|
RUNTIME_BOUNDARY_HOST_PREFLIGHT="$ROOT_DIR/build/wasm/sim-configs-inventory/runtime-boundary-host-preflight.tsv"
|
||||||
BOUNDARY_PHASE_COMPLETION_SUMMARY="$ROOT_DIR/build/wasm/sim-configs-inventory/boundary-phase-completion-summary.tsv"
|
BOUNDARY_PHASE_COMPLETION_SUMMARY="$ROOT_DIR/build/wasm/sim-configs-inventory/boundary-phase-completion-summary.tsv"
|
||||||
NEXT_BOUNDARY_RECOMMENDATIONS="$ROOT_DIR/build/wasm/sim-configs-inventory/next-boundary-recommendations.tsv"
|
NEXT_BOUNDARY_RECOMMENDATIONS="$ROOT_DIR/build/wasm/sim-configs-inventory/next-boundary-recommendations.tsv"
|
||||||
INVENTORY_SCRIPT="$ROOT_DIR/tests/wasm/node/verify_sim_configs_inventory_wasm.mjs"
|
INVENTORY_SCRIPT="$ROOT_DIR/tests/wasm/node/verify_sim_configs_inventory_wasm.mjs"
|
||||||
@@ -49,6 +58,9 @@ for artifact in \
|
|||||||
"$INI_BOUNDARY_SUMMARY" \
|
"$INI_BOUNDARY_SUMMARY" \
|
||||||
"$NATIVE_PROOF_ALIGNMENT_SUMMARY" \
|
"$NATIVE_PROOF_ALIGNMENT_SUMMARY" \
|
||||||
"$RUNTIME_BOUNDARY_NATIVE_ALIGNMENT_SUMMARY" \
|
"$RUNTIME_BOUNDARY_NATIVE_ALIGNMENT_SUMMARY" \
|
||||||
|
"$RUNTIME_PROBE_GATE_ALIGNMENT" \
|
||||||
|
"$NATIVE_RUNTIME_PROBE_EXECUTION_PLAN" \
|
||||||
|
"$NATIVE_RUNTIME_PROBE_PASS_EVIDENCE_CONTRACT" \
|
||||||
"$RUNTIME_BOUNDARY_CONTRACT_SUMMARY" \
|
"$RUNTIME_BOUNDARY_CONTRACT_SUMMARY" \
|
||||||
"$USER_M_PROCESS_NATIVE_STATE_ALIGNMENT" \
|
"$USER_M_PROCESS_NATIVE_STATE_ALIGNMENT" \
|
||||||
"$USER_M_PROCESS_NATIVE_TRANSITION_ALIGNMENT" \
|
"$USER_M_PROCESS_NATIVE_TRANSITION_ALIGNMENT" \
|
||||||
@@ -58,14 +70,20 @@ for artifact in \
|
|||||||
"$USER_M_PROCESS_TRANSITION_PLAN" \
|
"$USER_M_PROCESS_TRANSITION_PLAN" \
|
||||||
"$TOOL_DB_PROCESS_NATIVE_PROTOCOL_ALIGNMENT" \
|
"$TOOL_DB_PROCESS_NATIVE_PROTOCOL_ALIGNMENT" \
|
||||||
"$TOOL_DB_PROCESS_NATIVE_RUNTIME_READINESS" \
|
"$TOOL_DB_PROCESS_NATIVE_RUNTIME_READINESS" \
|
||||||
|
"$TOOL_DB_PROCESS_NATIVE_RUNTIME_PROBE_GATE" \
|
||||||
"$TOOL_DB_PROCESS_TRANSACTION_PLAN" \
|
"$TOOL_DB_PROCESS_TRANSACTION_PLAN" \
|
||||||
"$PYTHON_REMAP_NATIVE_RUNTIME_ALIGNMENT" \
|
"$PYTHON_REMAP_NATIVE_RUNTIME_ALIGNMENT" \
|
||||||
"$PYTHON_REMAP_NATIVE_RUNTIME_READINESS" \
|
"$PYTHON_REMAP_NATIVE_RUNTIME_READINESS" \
|
||||||
|
"$PYTHON_REMAP_NATIVE_RUNTIME_PROBE_GATE" \
|
||||||
"$PYTHON_REMAP_NATIVE_RUNTIME_STATE_PLAN" \
|
"$PYTHON_REMAP_NATIVE_RUNTIME_STATE_PLAN" \
|
||||||
"$PYTHON_REMAP_NATIVE_RUNTIME_FIXTURE_PLAN" \
|
"$PYTHON_REMAP_NATIVE_RUNTIME_FIXTURE_PLAN" \
|
||||||
"$PYTHON_REMAP_RUNTIME_CONTRACT" \
|
"$PYTHON_REMAP_RUNTIME_CONTRACT" \
|
||||||
"$NATIVE_RUNTIME_PROBE_SUMMARY" \
|
"$NATIVE_RUNTIME_PROBE_SUMMARY" \
|
||||||
"$BLOCKED_RUNTIME_PROMOTION_LOCK" \
|
"$BLOCKED_RUNTIME_PROMOTION_LOCK" \
|
||||||
|
"$RUNTIME_BOUNDARY_PROMOTION_READINESS" \
|
||||||
|
"$RUNTIME_BOUNDARY_PROMOTION_BLOCKERS" \
|
||||||
|
"$RUNTIME_BOUNDARY_POST_NATIVE_PASS_GATES" \
|
||||||
|
"$RUNTIME_BOUNDARY_HOST_PREFLIGHT" \
|
||||||
"$BOUNDARY_PHASE_COMPLETION_SUMMARY" \
|
"$BOUNDARY_PHASE_COMPLETION_SUMMARY" \
|
||||||
"$NEXT_BOUNDARY_RECOMMENDATIONS"; do
|
"$NEXT_BOUNDARY_RECOMMENDATIONS"; do
|
||||||
if [[ ! -f "$artifact" || "$INVENTORY_SCRIPT" -nt "$artifact" ]]; then
|
if [[ ! -f "$artifact" || "$INVENTORY_SCRIPT" -nt "$artifact" ]]; then
|
||||||
@@ -78,6 +96,27 @@ fi
|
|||||||
if [[ -f "$NATIVE_RUNTIME_PROBE_SOURCE_SUMMARY" && "$NATIVE_RUNTIME_PROBE_SOURCE_SUMMARY" -nt "$NATIVE_RUNTIME_PROBE_SUMMARY" ]]; then
|
if [[ -f "$NATIVE_RUNTIME_PROBE_SOURCE_SUMMARY" && "$NATIVE_RUNTIME_PROBE_SOURCE_SUMMARY" -nt "$NATIVE_RUNTIME_PROBE_SUMMARY" ]]; then
|
||||||
INVENTORY_REQUIRED=1
|
INVENTORY_REQUIRED=1
|
||||||
fi
|
fi
|
||||||
|
if [[ -f "$NATIVE_RUNTIME_PROBE_SOURCE_SUMMARY" && "$NATIVE_RUNTIME_PROBE_SOURCE_SUMMARY" -nt "$RUNTIME_PROBE_GATE_ALIGNMENT" ]]; then
|
||||||
|
INVENTORY_REQUIRED=1
|
||||||
|
fi
|
||||||
|
if [[ -f "$NATIVE_RUNTIME_PROBE_SOURCE_SUMMARY" && "$NATIVE_RUNTIME_PROBE_SOURCE_SUMMARY" -nt "$NATIVE_RUNTIME_PROBE_EXECUTION_PLAN" ]]; then
|
||||||
|
INVENTORY_REQUIRED=1
|
||||||
|
fi
|
||||||
|
if [[ -f "$NATIVE_RUNTIME_PROBE_SOURCE_SUMMARY" && "$NATIVE_RUNTIME_PROBE_SOURCE_SUMMARY" -nt "$NATIVE_RUNTIME_PROBE_PASS_EVIDENCE_CONTRACT" ]]; then
|
||||||
|
INVENTORY_REQUIRED=1
|
||||||
|
fi
|
||||||
|
if [[ -f "$NATIVE_RUNTIME_PROBE_SOURCE_SUMMARY" && "$NATIVE_RUNTIME_PROBE_SOURCE_SUMMARY" -nt "$RUNTIME_BOUNDARY_PROMOTION_READINESS" ]]; then
|
||||||
|
INVENTORY_REQUIRED=1
|
||||||
|
fi
|
||||||
|
if [[ -f "$NATIVE_RUNTIME_PROBE_SOURCE_SUMMARY" && "$NATIVE_RUNTIME_PROBE_SOURCE_SUMMARY" -nt "$RUNTIME_BOUNDARY_PROMOTION_BLOCKERS" ]]; then
|
||||||
|
INVENTORY_REQUIRED=1
|
||||||
|
fi
|
||||||
|
if [[ -f "$NATIVE_RUNTIME_PROBE_SOURCE_SUMMARY" && "$NATIVE_RUNTIME_PROBE_SOURCE_SUMMARY" -nt "$RUNTIME_BOUNDARY_POST_NATIVE_PASS_GATES" ]]; then
|
||||||
|
INVENTORY_REQUIRED=1
|
||||||
|
fi
|
||||||
|
if [[ -f "$NATIVE_RUNTIME_PROBE_SOURCE_SUMMARY" && "$NATIVE_RUNTIME_PROBE_SOURCE_SUMMARY" -nt "$RUNTIME_BOUNDARY_HOST_PREFLIGHT" ]]; then
|
||||||
|
INVENTORY_REQUIRED=1
|
||||||
|
fi
|
||||||
if [[ "$INVENTORY_REQUIRED" == "1" ]]; then
|
if [[ "$INVENTORY_REQUIRED" == "1" ]]; then
|
||||||
SKIP_INTERP_BUILD=1 "$ROOT_DIR/tests/wasm/node/verify_sim_configs_inventory_wasm.sh"
|
SKIP_INTERP_BUILD=1 "$ROOT_DIR/tests/wasm/node/verify_sim_configs_inventory_wasm.sh"
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -77,11 +77,13 @@ print_kv millturn_user_m_promotion_allowed 0
|
|||||||
|
|
||||||
if [[ "$source_ready" != "1" ]]; then
|
if [[ "$source_ready" != "1" ]]; then
|
||||||
print_kv millturn_user_m_runtime_probe_status "blocked_missing_source"
|
print_kv millturn_user_m_runtime_probe_status "blocked_missing_source"
|
||||||
|
print_kv millturn_user_m_runtime_probe_note "missing_source_requirements_keep_user_m_process_blocked"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "$runtime_ready" != "1" ]]; then
|
if [[ "$runtime_ready" != "1" ]]; then
|
||||||
print_kv millturn_user_m_runtime_probe_status "skipped_missing_host_runtime"
|
print_kv millturn_user_m_runtime_probe_status "skipped_missing_host_runtime"
|
||||||
|
print_kv millturn_user_m_runtime_probe_note "missing_host_runtime_requirements_keep_user_m_process_blocked"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
@@ -75,11 +75,13 @@ print_kv python_remap_promotion_allowed 0
|
|||||||
|
|
||||||
if [[ "$source_ready" != "1" ]]; then
|
if [[ "$source_ready" != "1" ]]; then
|
||||||
print_kv python_remap_runtime_probe_status "blocked_missing_source"
|
print_kv python_remap_runtime_probe_status "blocked_missing_source"
|
||||||
|
print_kv python_remap_runtime_probe_note "missing_source_requirements_keep_python_remap_blocked"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "$runtime_ready" != "1" ]]; then
|
if [[ "$runtime_ready" != "1" ]]; then
|
||||||
print_kv python_remap_runtime_probe_status "skipped_missing_host_runtime"
|
print_kv python_remap_runtime_probe_status "skipped_missing_host_runtime"
|
||||||
|
print_kv python_remap_runtime_probe_note "missing_host_runtime_requirements_keep_python_remap_blocked"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
@@ -74,11 +74,13 @@ print_kv tool_db_promotion_allowed 0
|
|||||||
|
|
||||||
if [[ "$source_ready" != "1" ]]; then
|
if [[ "$source_ready" != "1" ]]; then
|
||||||
print_kv tool_db_runtime_probe_status "blocked_missing_source"
|
print_kv tool_db_runtime_probe_status "blocked_missing_source"
|
||||||
|
print_kv tool_db_runtime_probe_note "missing_source_requirements_keep_tool_db_process_blocked"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "$runtime_ready" != "1" ]]; then
|
if [[ "$runtime_ready" != "1" ]]; then
|
||||||
print_kv tool_db_runtime_probe_status "skipped_missing_host_runtime"
|
print_kv tool_db_runtime_probe_status "skipped_missing_host_runtime"
|
||||||
|
print_kv tool_db_runtime_probe_note "missing_host_runtime_requirements_keep_tool_db_process_blocked"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
@@ -200,6 +200,8 @@ check_native_runtime_probe_summary_row() {
|
|||||||
local boundary_kind="$2"
|
local boundary_kind="$2"
|
||||||
local target="$3"
|
local target="$3"
|
||||||
local runtime_probe="$4"
|
local runtime_probe="$4"
|
||||||
|
local expected_required_native_proof="$5"
|
||||||
|
local expected_opt_in_env="$6"
|
||||||
local summary_file="$BUILD_DIR/native-runtime-probe-summary.tsv"
|
local summary_file="$BUILD_DIR/native-runtime-probe-summary.tsv"
|
||||||
|
|
||||||
local row
|
local row
|
||||||
@@ -224,17 +226,28 @@ check_native_runtime_probe_summary_row() {
|
|||||||
|
|
||||||
local runtime_ready
|
local runtime_ready
|
||||||
local source_proof_ready
|
local source_proof_ready
|
||||||
|
local required_native_proof
|
||||||
|
local opt_in_env
|
||||||
local probe_status
|
local probe_status
|
||||||
local execution_enabled
|
local execution_enabled
|
||||||
local promotion_allowed
|
local promotion_allowed
|
||||||
local missing_requirements
|
local missing_requirements
|
||||||
|
local probe_note
|
||||||
local stdout_log
|
local stdout_log
|
||||||
IFS=$'\t' read -r _ _ _ _ runtime_ready source_proof_ready probe_status execution_enabled promotion_allowed missing_requirements stdout_log <<< "$row"
|
IFS=$'\t' read -r _ _ _ _ required_native_proof opt_in_env runtime_ready source_proof_ready probe_status execution_enabled promotion_allowed missing_requirements probe_note stdout_log <<< "$row"
|
||||||
|
|
||||||
if [[ "$source_proof_ready" != "1" ]]; then
|
if [[ "$source_proof_ready" != "1" ]]; then
|
||||||
echo "$target runtime probe lacks source proof readiness: $source_proof_ready" >&2
|
echo "$target runtime probe lacks source proof readiness: $source_proof_ready" >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
if [[ "$required_native_proof" != "$expected_required_native_proof" ]]; then
|
||||||
|
echo "$target runtime probe required native proof drift: $required_native_proof" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if [[ "$opt_in_env" != "$expected_opt_in_env" ]]; then
|
||||||
|
echo "$target runtime probe opt-in env drift: $opt_in_env" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
if [[ "$execution_enabled" != "0" || "$promotion_allowed" != "0" ]]; then
|
if [[ "$execution_enabled" != "0" || "$promotion_allowed" != "0" ]]; then
|
||||||
echo "$target runtime probe unexpectedly enables execution or promotion" >&2
|
echo "$target runtime probe unexpectedly enables execution or promotion" >&2
|
||||||
exit 1
|
exit 1
|
||||||
@@ -247,10 +260,26 @@ check_native_runtime_probe_summary_row() {
|
|||||||
echo "$target runtime probe is not ready but did not skip: $probe_status" >&2
|
echo "$target runtime probe is not ready but did not skip: $probe_status" >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
if [[ "$runtime_ready" == "0" && "$probe_note" != *"missing_host_runtime"* ]]; then
|
||||||
|
echo "$target runtime probe missing-runtime note drift: $probe_note" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
if [[ "$runtime_ready" == "1" && "$missing_requirements" != "-" ]]; then
|
if [[ "$runtime_ready" == "1" && "$missing_requirements" != "-" ]]; then
|
||||||
echo "$target runtime probe is ready but lists missing requirements: $missing_requirements" >&2
|
echo "$target runtime probe is ready but lists missing requirements: $missing_requirements" >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
if [[ "$probe_status" == "ready_disabled_by_default" && "$probe_note" != *"set_${opt_in_env%%=*}"* ]]; then
|
||||||
|
echo "$target runtime probe ready-disabled note drift: $probe_note" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if [[ "$probe_status" == runtime_*_passed && "$probe_note" != *"without_promotion"* ]]; then
|
||||||
|
echo "$target runtime probe passed note drift: $probe_note" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if [[ "$probe_note" == "-" || -z "$probe_note" ]]; then
|
||||||
|
echo "$target runtime probe lacks note" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
if [[ ! -f "$BUILD_DIR/$stdout_log" ]]; then
|
if [[ ! -f "$BUILD_DIR/$stdout_log" ]]; then
|
||||||
echo "$target runtime summary references missing stdout log: $stdout_log" >&2
|
echo "$target runtime summary references missing stdout log: $stdout_log" >&2
|
||||||
exit 1
|
exit 1
|
||||||
@@ -266,7 +295,7 @@ check_native_runtime_probe_summary() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
local expected_header
|
local expected_header
|
||||||
expected_header=$'boundary_class\tboundary_kind\ttarget\truntime_probe\truntime_ready\tsource_proof_ready\tprobe_status\texecution_enabled\tpromotion_allowed\tmissing_requirements\tstdout_log'
|
expected_header=$'boundary_class\tboundary_kind\ttarget\truntime_probe\trequired_native_proof\topt_in_env\truntime_ready\tsource_proof_ready\tprobe_status\texecution_enabled\tpromotion_allowed\tmissing_requirements\tprobe_note\tstdout_log'
|
||||||
if [[ "$(sed -n '1p' "$summary_file")" != "$expected_header" ]]; then
|
if [[ "$(sed -n '1p' "$summary_file")" != "$expected_header" ]]; then
|
||||||
echo "native runtime probe summary header drift: $summary_file" >&2
|
echo "native runtime probe summary header drift: $summary_file" >&2
|
||||||
exit 1
|
exit 1
|
||||||
@@ -283,17 +312,23 @@ check_native_runtime_probe_summary() {
|
|||||||
L4-USER-M-PROCESS \
|
L4-USER-M-PROCESS \
|
||||||
external_user_m_process \
|
external_user_m_process \
|
||||||
axis/vismach/millturn/example.ngc \
|
axis/vismach/millturn/example.ngc \
|
||||||
linuxcnc_millturn_user_m_runtime_probe
|
linuxcnc_millturn_user_m_runtime_probe \
|
||||||
|
native_runtime_state_probe_required \
|
||||||
|
ENABLE_MILLTURN_USER_M_RUNTIME_PROBE=1
|
||||||
check_native_runtime_probe_summary_row \
|
check_native_runtime_probe_summary_row \
|
||||||
L4-TOOL-DB \
|
L4-TOOL-DB \
|
||||||
tool_database_process \
|
tool_database_process \
|
||||||
axis/db_demo/base.ngc \
|
axis/db_demo/base.ngc \
|
||||||
linuxcnc_tool_db_runtime_probe
|
linuxcnc_tool_db_runtime_probe \
|
||||||
|
native_db_process_protocol_probe_required \
|
||||||
|
ENABLE_TOOL_DB_RUNTIME_PROBE=1
|
||||||
check_native_runtime_probe_summary_row \
|
check_native_runtime_probe_summary_row \
|
||||||
L4-PYTHON-REMAP \
|
L4-PYTHON-REMAP \
|
||||||
python_runtime \
|
python_runtime \
|
||||||
axis/remap/stop-lookahead/nc_files \
|
axis/remap/stop-lookahead/nc_files \
|
||||||
linuxcnc_python_remap_runtime_probe
|
linuxcnc_python_remap_runtime_probe \
|
||||||
|
linuxcnc_python_runtime_lifecycle_probe_required \
|
||||||
|
ENABLE_PYTHON_REMAP_RUNTIME_PROBE=1
|
||||||
}
|
}
|
||||||
|
|
||||||
check_source_probe_coverage
|
check_source_probe_coverage
|
||||||
@@ -609,6 +644,7 @@ grep -Fq "millturn_user_m_runtime_requirements=" "$MILLTURN_USER_M_RUNTIME_STDOU
|
|||||||
grep -Fq "millturn_user_m_source_proof_ready=1" "$MILLTURN_USER_M_RUNTIME_STDOUT"
|
grep -Fq "millturn_user_m_source_proof_ready=1" "$MILLTURN_USER_M_RUNTIME_STDOUT"
|
||||||
grep -Fq "millturn_user_m_execution_enabled=0" "$MILLTURN_USER_M_RUNTIME_STDOUT"
|
grep -Fq "millturn_user_m_execution_enabled=0" "$MILLTURN_USER_M_RUNTIME_STDOUT"
|
||||||
grep -Fq "millturn_user_m_promotion_allowed=0" "$MILLTURN_USER_M_RUNTIME_STDOUT"
|
grep -Fq "millturn_user_m_promotion_allowed=0" "$MILLTURN_USER_M_RUNTIME_STDOUT"
|
||||||
|
grep -Fq "millturn_user_m_runtime_probe_note=" "$MILLTURN_USER_M_RUNTIME_STDOUT"
|
||||||
if grep -Fq "millturn_user_m_runtime_ready=1" "$MILLTURN_USER_M_RUNTIME_STDOUT"; then
|
if grep -Fq "millturn_user_m_runtime_ready=1" "$MILLTURN_USER_M_RUNTIME_STDOUT"; then
|
||||||
grep -Eq "millturn_user_m_runtime_probe_status=(ready_disabled_by_default|runtime_state_probe_passed)" \
|
grep -Eq "millturn_user_m_runtime_probe_status=(ready_disabled_by_default|runtime_state_probe_passed)" \
|
||||||
"$MILLTURN_USER_M_RUNTIME_STDOUT"
|
"$MILLTURN_USER_M_RUNTIME_STDOUT"
|
||||||
@@ -648,6 +684,7 @@ grep -Fq "tool_db_runtime_requirements=" "$TOOL_DB_RUNTIME_STDOUT"
|
|||||||
grep -Fq "tool_db_source_proof_ready=1" "$TOOL_DB_RUNTIME_STDOUT"
|
grep -Fq "tool_db_source_proof_ready=1" "$TOOL_DB_RUNTIME_STDOUT"
|
||||||
grep -Fq "tool_db_execution_enabled=0" "$TOOL_DB_RUNTIME_STDOUT"
|
grep -Fq "tool_db_execution_enabled=0" "$TOOL_DB_RUNTIME_STDOUT"
|
||||||
grep -Fq "tool_db_promotion_allowed=0" "$TOOL_DB_RUNTIME_STDOUT"
|
grep -Fq "tool_db_promotion_allowed=0" "$TOOL_DB_RUNTIME_STDOUT"
|
||||||
|
grep -Fq "tool_db_runtime_probe_note=" "$TOOL_DB_RUNTIME_STDOUT"
|
||||||
if grep -Fq "tool_db_runtime_ready=1" "$TOOL_DB_RUNTIME_STDOUT"; then
|
if grep -Fq "tool_db_runtime_ready=1" "$TOOL_DB_RUNTIME_STDOUT"; then
|
||||||
grep -Eq "tool_db_runtime_probe_status=(ready_disabled_by_default|runtime_protocol_probe_passed)" \
|
grep -Eq "tool_db_runtime_probe_status=(ready_disabled_by_default|runtime_protocol_probe_passed)" \
|
||||||
"$TOOL_DB_RUNTIME_STDOUT"
|
"$TOOL_DB_RUNTIME_STDOUT"
|
||||||
@@ -697,6 +734,7 @@ grep -Fq "python_remap_runtime_modules=axis/remap/stop-lookahead/python/remap.py
|
|||||||
grep -Fq "python_remap_source_proof_ready=1" "$PYTHON_REMAP_RUNTIME_STDOUT"
|
grep -Fq "python_remap_source_proof_ready=1" "$PYTHON_REMAP_RUNTIME_STDOUT"
|
||||||
grep -Fq "python_remap_execution_enabled=0" "$PYTHON_REMAP_RUNTIME_STDOUT"
|
grep -Fq "python_remap_execution_enabled=0" "$PYTHON_REMAP_RUNTIME_STDOUT"
|
||||||
grep -Fq "python_remap_promotion_allowed=0" "$PYTHON_REMAP_RUNTIME_STDOUT"
|
grep -Fq "python_remap_promotion_allowed=0" "$PYTHON_REMAP_RUNTIME_STDOUT"
|
||||||
|
grep -Fq "python_remap_runtime_probe_note=" "$PYTHON_REMAP_RUNTIME_STDOUT"
|
||||||
if grep -Fq "python_remap_runtime_ready=1" "$PYTHON_REMAP_RUNTIME_STDOUT"; then
|
if grep -Fq "python_remap_runtime_ready=1" "$PYTHON_REMAP_RUNTIME_STDOUT"; then
|
||||||
grep -Eq "python_remap_runtime_probe_status=(ready_disabled_by_default|runtime_lifecycle_probe_passed)" \
|
grep -Eq "python_remap_runtime_probe_status=(ready_disabled_by_default|runtime_lifecycle_probe_passed)" \
|
||||||
"$PYTHON_REMAP_RUNTIME_STDOUT"
|
"$PYTHON_REMAP_RUNTIME_STDOUT"
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -424,8 +424,10 @@ append_native_runtime_probe_summary_row() {
|
|||||||
local boundary_kind="$3"
|
local boundary_kind="$3"
|
||||||
local target="$4"
|
local target="$4"
|
||||||
local runtime_probe="$5"
|
local runtime_probe="$5"
|
||||||
local prefix="$6"
|
local required_native_proof="$6"
|
||||||
local stdout_log="$7"
|
local opt_in_env="$7"
|
||||||
|
local prefix="$8"
|
||||||
|
local stdout_log="$9"
|
||||||
|
|
||||||
local runtime_ready
|
local runtime_ready
|
||||||
local source_proof_ready
|
local source_proof_ready
|
||||||
@@ -433,41 +435,49 @@ append_native_runtime_probe_summary_row() {
|
|||||||
local execution_enabled
|
local execution_enabled
|
||||||
local promotion_allowed
|
local promotion_allowed
|
||||||
local missing_requirements
|
local missing_requirements
|
||||||
|
local probe_note
|
||||||
runtime_ready="$(stdout_value "$stdout_log" "${prefix}_runtime_ready")"
|
runtime_ready="$(stdout_value "$stdout_log" "${prefix}_runtime_ready")"
|
||||||
source_proof_ready="$(stdout_value "$stdout_log" "${prefix}_source_proof_ready")"
|
source_proof_ready="$(stdout_value "$stdout_log" "${prefix}_source_proof_ready")"
|
||||||
probe_status="$(stdout_value "$stdout_log" "${prefix}_runtime_probe_status")"
|
probe_status="$(stdout_value "$stdout_log" "${prefix}_runtime_probe_status")"
|
||||||
execution_enabled="$(stdout_value "$stdout_log" "${prefix}_execution_enabled")"
|
execution_enabled="$(stdout_value "$stdout_log" "${prefix}_execution_enabled")"
|
||||||
promotion_allowed="$(stdout_value "$stdout_log" "${prefix}_promotion_allowed")"
|
promotion_allowed="$(stdout_value "$stdout_log" "${prefix}_promotion_allowed")"
|
||||||
missing_requirements="$(stdout_value "$stdout_log" "${prefix}_missing_requirements")"
|
missing_requirements="$(stdout_value "$stdout_log" "${prefix}_missing_requirements")"
|
||||||
|
probe_note="$(stdout_value "$stdout_log" "${prefix}_runtime_probe_note")"
|
||||||
|
|
||||||
printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n' \
|
printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n' \
|
||||||
"$boundary_class" \
|
"$boundary_class" \
|
||||||
"$boundary_kind" \
|
"$boundary_kind" \
|
||||||
"$target" \
|
"$target" \
|
||||||
"$runtime_probe" \
|
"$runtime_probe" \
|
||||||
|
"$required_native_proof" \
|
||||||
|
"$opt_in_env" \
|
||||||
"$runtime_ready" \
|
"$runtime_ready" \
|
||||||
"$source_proof_ready" \
|
"$source_proof_ready" \
|
||||||
"$probe_status" \
|
"$probe_status" \
|
||||||
"$execution_enabled" \
|
"$execution_enabled" \
|
||||||
"$promotion_allowed" \
|
"$promotion_allowed" \
|
||||||
"${missing_requirements:-"-"}" \
|
"${missing_requirements:-"-"}" \
|
||||||
|
"${probe_note:-"-"}" \
|
||||||
"${stdout_log#"$BUILD_DIR"/}" >> "$tmp"
|
"${stdout_log#"$BUILD_DIR"/}" >> "$tmp"
|
||||||
}
|
}
|
||||||
|
|
||||||
write_native_runtime_probe_summary() {
|
write_native_runtime_probe_summary() {
|
||||||
local tmp
|
local tmp
|
||||||
tmp="$(mktemp)"
|
tmp="$(mktemp)"
|
||||||
printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n' \
|
printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n' \
|
||||||
boundary_class \
|
boundary_class \
|
||||||
boundary_kind \
|
boundary_kind \
|
||||||
target \
|
target \
|
||||||
runtime_probe \
|
runtime_probe \
|
||||||
|
required_native_proof \
|
||||||
|
opt_in_env \
|
||||||
runtime_ready \
|
runtime_ready \
|
||||||
source_proof_ready \
|
source_proof_ready \
|
||||||
probe_status \
|
probe_status \
|
||||||
execution_enabled \
|
execution_enabled \
|
||||||
promotion_allowed \
|
promotion_allowed \
|
||||||
missing_requirements \
|
missing_requirements \
|
||||||
|
probe_note \
|
||||||
stdout_log > "$tmp"
|
stdout_log > "$tmp"
|
||||||
|
|
||||||
append_native_runtime_probe_summary_row \
|
append_native_runtime_probe_summary_row \
|
||||||
@@ -476,6 +486,8 @@ write_native_runtime_probe_summary() {
|
|||||||
external_user_m_process \
|
external_user_m_process \
|
||||||
axis/vismach/millturn/example.ngc \
|
axis/vismach/millturn/example.ngc \
|
||||||
linuxcnc_millturn_user_m_runtime_probe \
|
linuxcnc_millturn_user_m_runtime_probe \
|
||||||
|
native_runtime_state_probe_required \
|
||||||
|
ENABLE_MILLTURN_USER_M_RUNTIME_PROBE=1 \
|
||||||
millturn_user_m \
|
millturn_user_m \
|
||||||
"$BUILD_DIR/linuxcnc_millturn_user_m_runtime_probe.run.stdout.log"
|
"$BUILD_DIR/linuxcnc_millturn_user_m_runtime_probe.run.stdout.log"
|
||||||
|
|
||||||
@@ -485,6 +497,8 @@ write_native_runtime_probe_summary() {
|
|||||||
tool_database_process \
|
tool_database_process \
|
||||||
axis/db_demo/base.ngc \
|
axis/db_demo/base.ngc \
|
||||||
linuxcnc_tool_db_runtime_probe \
|
linuxcnc_tool_db_runtime_probe \
|
||||||
|
native_db_process_protocol_probe_required \
|
||||||
|
ENABLE_TOOL_DB_RUNTIME_PROBE=1 \
|
||||||
tool_db \
|
tool_db \
|
||||||
"$BUILD_DIR/linuxcnc_tool_db_runtime_probe.run.stdout.log"
|
"$BUILD_DIR/linuxcnc_tool_db_runtime_probe.run.stdout.log"
|
||||||
|
|
||||||
@@ -494,6 +508,8 @@ write_native_runtime_probe_summary() {
|
|||||||
python_runtime \
|
python_runtime \
|
||||||
axis/remap/stop-lookahead/nc_files \
|
axis/remap/stop-lookahead/nc_files \
|
||||||
linuxcnc_python_remap_runtime_probe \
|
linuxcnc_python_remap_runtime_probe \
|
||||||
|
linuxcnc_python_runtime_lifecycle_probe_required \
|
||||||
|
ENABLE_PYTHON_REMAP_RUNTIME_PROBE=1 \
|
||||||
python_remap \
|
python_remap \
|
||||||
"$BUILD_DIR/linuxcnc_python_remap_runtime_probe.run.stdout.log"
|
"$BUILD_DIR/linuxcnc_python_remap_runtime_probe.run.stdout.log"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user