I've stopped pretending I don't use coding agents, and I've stopped pretending they can be left alone. Both positions were comfortable and both were wrong.
The setup that works for me is dull. The agent only ever runs against a clean working tree, so the diff it produces is entirely its own and I can read it in one sitting. I keep the scope small: rename this across the package, write the table-driven tests for that function, port this handler to the new signature. The mechanical jobs, in other words, the ones I'd do correctly but slowly and slightly resentfully. It's genuinely good at those, and saying so plainly feels more honest than the usual hand-wringing.
Where it falls down is exactly where you'd expect. Give it a vague goal and it will produce confident, plausible, subtly wrong code, and the more fluent the output the longer it takes you to notice. So I treat every change as a pull request from a junior who is fast, tireless, and occasionally lying. I read the whole diff. I run the tests myself rather than trusting its summary that they pass. If I find myself rubber-stamping, that's the signal the task was too big and I broke it down.
Supervised is the whole point. The day I let one of these commit straight to a branch I care about is the day it teaches me a lesson I already know better than to need.