ReScript community usually steers towards using “simple” solutions and tries to avoid monadic composition and point free style most of the time. Having said that, your solution looks quite OK since composing promises and results is always a bit cumbersome.
I don’t see the use of composeK3 etc since you can just pipe the composition:
let okAdd7 = okAdd2->AR.composeK(okAdd3)->AR.composeK(okAdd2)
If you’re going to process the error case until the boundaries of your function, you can also very much decide to get rid of results, use exceptions instead and write things in a more direct style.
See playground example.