How we killed manual triage with an ops queue
We used to treat every prod failure like a scavenger hunt — check Cloud Build, check logs, copy stack trace, write ticket, ping Slack, hope someone sees it.
The failure wasn't expensive. The queue that didn't exist was.
What changed:
1. Every failure now files itself: `POST /api/admin/ops type: bug` with title, steps, actual vs expected, priority, tags. Same shape whether it's a build break, a flaky E2E, or a widget report.
2. One queue fans out: GitHub issue + Slack thread auto-created, deduped by delivery ID so at-least-once doesn't double-file.
3. Agent picks it up: Claude/Cursor connector marks investigating → opens PR. Human stays on review, nothing merges alone.
Lessons since:
- Source → already on a bus (Pub/Sub, webhook) = no new infra
- File a real ticket, not a log line - ticket has priority / repro / owner = agent can act
- Dedupe at edge saves more time than fancy triage logic
Setup was 2 commands: `npm i -g @shipeasy/cli` → `shipeasy setup`. The win isn't the PR — it's that 2am page never happened.
How are you turning failures into tickets today? We'd love comparisons on queue shapes.
→ shipeasy.ai / docs.shipeasy.ai
Replies