""" Active Straight-Leg Raise rubric scorer — pure function, no model calls. FMS ASLR Criteria (bilateral): - Score 3: raised leg malleolus past contralateral knee (>70°), down leg flat. - Score 2: malleolus between mid-thigh and knee (45-70°). - Score 1: malleolus below mid-thigh (<45°). - Score 0: PAIN — never auto-scored. """ from __future__ import annotations from formscout.types import BiomechFeatures, ScoreResult def score_active_slr(features: BiomechFeatures) -> ScoreResult: """Pure rubric scorer for active straight-leg raise.""" angles = features.angles alignments = features.alignments has_angle = "raised_leg_angle_deg" in angles if not has_angle: return ScoreResult( score=1, rationale="Insufficient data: leg raise angle not measurable", confidence=0.3, notes="missing key measurements", ) angle = angles["raised_leg_angle_deg"] past_knee = alignments.get("past_contralateral_knee", False) past_mid = alignments.get("past_mid_thigh", False) down_flat = alignments.get("down_leg_flat", True) rationale_parts = [] if past_knee and down_flat: score = 3 rationale_parts.append(f"Raised leg at {angle:.0f}° (past contralateral knee)") elif past_mid: score = 2 rationale_parts.append(f"Raised leg at {angle:.0f}° (between mid-thigh and knee)") if not down_flat: rationale_parts.append("down leg lifted off surface") else: score = 1 rationale_parts.append(f"Raised leg only {angle:.0f}° (below mid-thigh)") confidence = features.confidence * 0.9 return ScoreResult( score=score, rationale="; ".join(rationale_parts), confidence=confidence, notes="", )