Files
linuxcncWebWASM/scripts/generate_authoritative_kinematics_s7_04.py

40 lines
3.1 KiB
Python

#!/usr/bin/env python3
"""Generate deterministic S7-04 authoritative rotary Delta evidence."""
from __future__ import annotations
import argparse
import hashlib
import json
from pathlib import Path
from typing import Any
import generate_authoritative_kinematics_s7_03 as base
RUNNER = ("node", "web/worker/test_authoritative_kinematics_s7_04.mjs")
def canonical(value: Any) -> str: return base.canonical(value)
def generate(root: Path, output: Path) -> dict[str, Any]:
report = base.generate(root, output, {"runner": RUNNER, "supported_type": "rotarydelta"})
report["schema"] = "authoritative-kinematics-s7-04.v1"
report["task_id"] = "S7-04"
report["scope"] = {"selected_family": "parallel_rotary_delta", "kinematics": "rotarydelta", "source_module": "rotarydeltakins", "pose": [0, 0, -3.793360169], "joint_count": 3, "geometry": {"platform_radius": 10, "thigh_length": 10, "shin_length": 14, "foot_radius": 6}, "unsupported_error": "authoritative_kinematics_unsupported", "singular_error": "authoritative_kinematics_singular"}
report["inputs"] = [item for item in report["inputs"] if item["path"] != "linuxcnc/configs/sim/axis/ldelta.ini" and not item["path"].endswith("test_authoritative_kinematics_s7_03.mjs")]
report["inputs"].extend([base.artifact(root, "linuxcnc/configs/sim/axis/rdelta.ini"), base.artifact(root, "linuxcnc/src/emc/kinematics/rotarydeltakins.c"), base.artifact(root, "linuxcnc/src/emc/kinematics/rotarydeltakins-common.h"), base.artifact(root, "web/worker/test_authoritative_kinematics_s7_04.mjs")])
report["selection"] = {"basis": ["delta-kinematics report has real rotarydelta configuration candidate and passed native/WASM samples", "rotarydelta preserves the existing authoritative XYZ plus three-joint shape", "no ABI/protocol/schema expansion is required"], "not_promoted": ["TRT", "serial_robot", "linear_delta", "Hexapod", "Pentapod", "switch", "user", "official_oracle"]}
report["boundaries"] = ["official kinematics oracle remains SOURCE_BLOCKED", "z=0 rotary singularity fails closed as authoritative_kinematics_singular", "missing rdelta HAL resources remain configuration gaps", "TRT/robot/Hexapod/Pentapod/switch/user remain queued"]
report["report_sha256"] = hashlib.sha256(canonical({key: value for key, value in report.items() if key != "report_sha256"}).encode()).hexdigest()
output.parent.mkdir(parents=True, exist_ok=True); output.write_text(json.dumps(report, ensure_ascii=False, sort_keys=True, indent=2) + "\n", encoding="utf-8")
return report
def main() -> int:
parser = argparse.ArgumentParser(description=__doc__); parser.add_argument("--repo-root", type=Path, default=Path(__file__).resolve().parents[1]); parser.add_argument("--report", type=Path, default=Path("coverage/authoritative-kinematics-s7-04.report.json")); args = parser.parse_args(); root = args.repo_root.resolve(); output = args.report if args.report.is_absolute() else root / args.report; report = generate(root, output); print(f"authoritative_kinematics_s7_04={report['status']} family={report['scope']['selected_family']}"); return 0 if report["status"] == "verified" else 1
if __name__ == "__main__": raise SystemExit(main())