Spent some hours today debugging this. ratsimp can trigger this error and lead to the wrong result a bit sooner. trace(ratsubst,trigsimp); will show us that without abs_integrate we don't have a call to ratsubst caused by ratsimp, but with that package loaded we call ratsimp and obtain the sinh(x) result from that. It seems to me as if the varlist plays a major part in all of this. When comparing a verbatim ratsubst call to the one triggered by ratsimp, I find that (newvar c) in the correctly working example puts the full input expression in that list, while the broken version puts only cosh(x) there. That's the earliest difference I could find, at least for today.