Input must be a 2-D complex channels-by-samples array or a ValueError is raised; most transforms implement only the single-channel path and raise NotImplementedError for more channels.
Decision: Accept either a raw array or a Recording and return the same type, preserving metadata when the input is a Recording.
Scope: Governs the call contract of every augmentation and impairment function.
Design issues addressed: ML pipelines mix bare IQ arrays and Recording objects, and a transform must not strip a Recording's metadata as it passes through.
Consequences: Callers can compose transforms without branching on input type or re-attaching metadata.