60 lines
3.6 KiB
Python
60 lines
3.6 KiB
Python
#!/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()
|