#!/usr/bin/env python3 """Audit the configuration input migration, without classifying every literal as an error.""" import hashlib import json from pathlib import Path ROOT = Path(__file__).resolve().parents[1] def main(): sources = { "machine_catalog": "web/workspace/machine-catalog.json", "resource_catalog": "web/workspace/simulation-resources.json", "web_settings": "web/workspace/web-settings.json", "ini_reader": "web/workspace/trt-configuration.mjs", "worker": "web/worker/sim-session.mjs", "tp_adapter": "web/worker/wasm-linuxcnc-tp.mjs", "tp_core": "wasm-core/src/sim_linuxcnc_tp.c", "kinematics_adapter": "web/worker/wasm-xyzac-kinematics.mjs", "case_loader": "web/workspace/sim-case-loader.mjs", "model": "web/react/src/xyzac-machine-model.ts", "machine_view": "web/react/src/XyzacMachineView.tsx", } content = {key: (ROOT / path).read_text() for key, path in sources.items()} checks = { "machine_catalog_parses": bool(json.loads(content["machine_catalog"])["machines"]), "resource_catalog_parses": bool(json.loads(content["resource_catalog"])["runtime_fixtures"]), "settings_parse": bool(json.loads(content["web_settings"])["viewer"]), "worker_reparses_ini": "...readTrtConfiguration(configuration)" in content["worker"], "axis_limits_from_ini": 'limits(`AXIS_${axis.toUpperCase()}`)' in content["ini_reader"], "joint_limits_from_ini": 'limits(`JOINT_${joint}`)' in content["ini_reader"], "no_kinematics_example_limits": "DEFAULT_LIMITS" not in content["kinematics_adapter"], "no_loader_fixed_timing": "servo_cycle_time: 0.001" not in content["case_loader"], "no_loader_axis3_override": "[-240, 100]" not in content["case_loader"], "native_axis_dynamics_input": "sim_linuxcnc_tp_set_axis_dynamics" in content["tp_core"] and "sim_linuxcnc_tp_set_axis_dynamics" in content["tp_adapter"], "no_native_xyzac_speed_override": "fmin(20.0, velocity_limit)" not in content["tp_core"] and "fmin(30.0, velocity_limit)" not in content["tp_core"], "native_acceleration_upper_bound": "*acceleration = fmin" in content["tp_core"] and "*acceleration = fmax" not in content["tp_core"], "model_uses_visual_configuration": "WEB_SETTINGS.viewer.models" in content["model"] and "WEB_SETTINGS.viewer.materials" in content["model"], "machine_path_color_configured": "VIEWER.colors.path" in content["machine_view"], } report = { "report_id": "configuration-input-audit-v1", "status": "verified" if all(checks.values()) else "failed", "scope": "configurable inputs; not a zero-literals claim", "checks": checks, "sources": [{"path": path, "sha256": hashlib.sha256((ROOT / path).read_bytes()).hexdigest()} for path in sources.values()], "wasm_sha256": hashlib.sha256((ROOT / "build-wasm/linuxcnc-sim-core.wasm").read_bytes()).hexdigest(), "retained": ["mathematical constants and tolerances", "ABI layouts, enums, and capacities", "source model mesh topology", "CSS/icon assets", "test fixtures and historical evidence", "upstream LinuxCNC and dependency locks"], } output = ROOT / "coverage/configuration/input-audit.report.json" output.parent.mkdir(parents=True, exist_ok=True) output.write_text(json.dumps(report, indent=2) + "\n") print(json.dumps({"report_id": report["report_id"], "status": report["status"], "checks": len(checks)})) if report["status"] != "verified": raise SystemExit(1) if __name__ == "__main__": main()