The basic problem was that AST was not saving the inverse coefficients for MatrixMap and there were subtle numerical differences when they were computed when un-persisting. David Berry fixed that in starlink_ast.
I didn't see this earlier because I had mis-written assertWcsAlmostEqual... to require positive maximum error instead of allowing 0. I fixed that and changed two tests in afw and test_coaddBoundedField in meas_algorithms to use an error of 0.
In addition I added accessors to CoaddBoundedField in order to make debugging problems such as this simpler. I also modified operator== for CoaddBoundedField and CoaddBoundedFieldElement to test value equality, not pointer equality (provided neither pointer is null) and wrapped CoaddBoundedField::operator== with pybind11.
Please make sure you are comfortable with my changes to CoaddBoundedField in meas_algorithms. I hope you will find the changes in afw innocuous. There is no need to review the starlink_ast changes, though I made a pull request in case you want to look at them.