There are a couple of issues that I've had to fix on this (working from the ip_isr side to make reading more robust). First, I was doing a full filter on NaN values to remove the ending padding. This was fine on the assumption that none of the data values were NaN. That wasn't true, so it was coming up with the length error (or length mod 2 error). I'm now correctly stripping only the NaN values at the end of the input coeffs, and passing the correctly unpadded array to the serial traps.
The serial trap _init_ also now strips remaining NaN values after the data has been split into the centers, values arrays that are then passed to the spline code. The combination of these two steps means that your existing CTI datasets can be read correctly, and future datasets should only ever have the end-padding NaN values.
My tiny test script indicates this does successfully create the calibration on read:
from lsst.ip.isr import IsrCalib
filename = "/sdf/group/rubin/repo/main/u/cslage/sdf/BOT/cti_20220916/20220916T162216Z/cpCtiCalib/cpCtiCalib_LSSTCam_R20_S02_u_cslage_sdf_BOT_cti_20220916_20220916T162216Z.fits"
calib = IsrCalib.readFits(filename)