The pipeline is ACEScg + F32 end to end by design; a plugin that does not support F32 must not fail the render — its inputs convert down to the negotiated depth and its output converts back to F32 (the previous "Phase 2 F32 only" error path purple-framed those plugins). - render_driver maps getClipPreferences' output bit depth to Byte/Short/Half/Float, sets it on the input/output clips, allocates the output image at the negotiated depth and converts the result back to F32 for frame assembly (both the CPU path and the GL-failure CPU fallback) - the GL path keeps F32 clip params: GL textures are created in the pipeline format and kOfxOpenGLPropPixelDepth is negotiated separately, so clip props must match what the plugin actually sees - fetch_image converts the decoded input down to the clip's negotiated depth (default F32) - new Image::convert_depth ([0,1]-normalized conversion between all depth pairs) plus round-trip and f16 edge tests; f16 helpers moved into image.rs and shared with clip.rs