- Shipped
- September 16, 2026 at 4:57 PM UTC
- Author
- Kamo
- Commit
- 2a72597
CampaignService refuses with a ResponseStatusException carrying a sentence written for the member ("Pause the campaign before deleting it.", "Only paused campaigns can be resumed.", "A scheduled, sending or paused campaign can't be archived. Cancel it first."), and the campaign controllers rethrow it. Spring Boot's default error body carries only the status phrase, because server.error.include-message is never here (on purpose: it would also put every unexpected exception's message on the wire). So the campaigns screen could only ever toast "Bad Request". Confirmed on a live pod: an error body is {timestamp, status, error: "Not Found", path} with no message at all. CampaignErrorAdvice, scoped to CampaignController and CampaignOutboxController, answers with the house error shape instead: error is the sentence (or the status phrase when there is none), plus status. The campaigns, audience and outbox clients in kamo-internal already show `error`, so nothing changes on that side. CampaignErrorAdviceTest runs the real CampaignController on an embedded server through Boot's own error handling: without the advice the body says "Bad Request" and never the reason; with it, the reason. 1560 tests: only TransactionalSendRatchetTest fails, as it already does on main.