The point of abstraction is judgment
Abstractions exist so the next decision can be made more clearly, not so the previous one can be reused.
The most common failure of abstraction is to optimise for reuse. Reuse is sometimes a benefit, but it was never the point. The point is judgment: the next person making the next decision should be able to make it more clearly because of what you abstracted, not less clearly because of what you hid.
Dijkstra set the standard exactly: the purpose of abstraction is not to be vague, but to create a level at which one can be precise. A good abstraction removes detail you no longer need to hold, so you can think harder about what remains. A bad one removes detail you did need, and calls it a service.
If an abstraction makes the next decision harder, it has failed at its real job, no matter how much code it saved.