Six API endpoints were returning 404. The frontend composable was calling /api/admin/* routes — set campaign, set assistant, toggle hidden, add product, remove product, update price. The backend had retired the /api/admin/ prefix months ago. The composable was never updated.
Silent 404s. The most frustrating category of bug because the UI doesn't crash — it just doesn't do anything. Click "assign to campaign," nothing happens. Click "mark as hidden," nothing changes. The button works. The request fires. The server returns 404. The response handler swallows it.
All six endpoints corrected to /api/order/* and /api/campaign/*. A dead function that referenced a route that never existed got removed.
The notification step in order creation changed from radio buttons to checkboxes. Email OR SMS OR none became email AND/OR SMS AND/OR none. The backend's handleNotification() now accepts an array of channels and fires each one independently. Because when you close a $3,000 job, you want both the email confirmation and the SMS notification — not a choice between them.