{
  "schema_version": "machine-capabilities.v1",
  "machine_id": "fullum-alpha",
  "machine_family": "swing-arm",
  "machine_name": "Fullum Swing-Arm Polisher",
  "controller_version": "polisher-control/0.1.0",
  "last_verified": "2026-06-01T00:00:00Z",
  "supported_motion_families": [
    "swing-arm-rosette"
  ],
  "force_range_n": [
    5,
    200
  ],
  "table_rpm_range": [
    0.5,
    10.0
  ],
  "spindle_rpm_range": [
    10,
    120
  ],
  "cam_amplitude_range_deg": [
    1.0,
    31.3
  ],
  "cam_offset_range_deg": [
    -30.0,
    30.0
  ],
  "force_modulation": {
    "supported": true,
    "max_harmonics": 3,
    "max_amplitude_n": 24.0,
    "notes": "m=2 astigmatism and m=3 trefoil are proven channels. m=1 coma is unreliable (score 0.09)."
  },
  "supported_dither_profiles": [
    "none",
    "default"
  ],
  "segment_duration_limits": {
    "min_s": 30,
    "max_s": 7200
  },
  "pause_resume_support": true,
  "telemetry_channels": [
    {
      "name": "table_rpm",
      "unit": "RPM",
      "sample_rate_hz": 100
    },
    {
      "name": "spindle_rpm",
      "unit": "RPM",
      "sample_rate_hz": 100
    },
    {
      "name": "force_n",
      "unit": "N",
      "sample_rate_hz": 100
    },
    {
      "name": "arm_angle_deg",
      "unit": "degrees",
      "sample_rate_hz": 100
    },
    {
      "name": "table_angle_deg",
      "unit": "degrees",
      "sample_rate_hz": 100
    },
    {
      "name": "timestamp_ms",
      "unit": "ms",
      "sample_rate_hz": 100
    },
    {
      "name": "spindle_direction_setpoint",
      "unit": "enum(cw|ccw)",
      "sample_rate_hz": 10
    },
    {
      "name": "spindle_direction_actual",
      "unit": "enum(cw|ccw)",
      "sample_rate_hz": 10
    }
  ],
  "safety_limits": {
    "max_force_n": 200,
    "max_table_rpm": 10.0,
    "max_spindle_rpm": 120,
    "notes": "Force hard-limited by load cell interlock. RPM limits are VFD/servo configured."
  },
  "known_constraints": [
    "Cam amplitude is not servo-programmable \u2014 must be set mechanically before run.",
    "Force modulation bandwidth limited to ~5 Hz by actuator response.",
    "Table encoder is absolute but may have 1-2 count jitter.",
    "Serial interface to Teensy limits command update rate to ~50 Hz effective."
  ],
  "unknowns": [
    "Exact force modulation phase accuracy at m=3 harmonic \u2014 not yet validated on hardware.",
    "Thermal drift effect on force sensor over runs longer than 1 hour.",
    "Arm pivot play magnitude under varying force loads."
  ],
  "supported_spindle_directions": [
    "cw",
    "ccw"
  ]
}
