Skip to content
achacon.dev
All work

2026

Support-ticket triage service

Routes tagged tickets into a triage queue and decides whether each one came from a colleague or a customer.

Role
Sole engineer: service, classifier, and backfill
Stack
JavaScriptNode.jsExpressJira REST APIWebhookslaunchd

The problem

Support tickets landed in whatever project the reporter happened to be in, and telling an internal request from a customer one meant opening each ticket and recognising the name. The built-in automation handled the routing and could not do the classification.

What I built

  • Two entry points, one pipeline: a webhook receiver for new and edited tickets, and a command-line backfill for the thousands already sitting there. Both call the same function, so they cannot drift apart.
  • The internal-versus-customer call needs account type and group membership, which the platform's own automation does not expose. That is why this runs as a service rather than a no-code rule.
  • Dry run is the default, and nothing gets written until you apply it. An explain flag prints the rule-by-rule trace for every ticket, so a wrong decision is something you read rather than guess at.
  • The summary counts query results and prefix matches separately, because the query language cannot match a bracketed prefix and those two numbers never agree. Reporting one as the other would hide how much work the client-side filter was doing.
  • Processed tickets carry a marker label so a re-run skips them, with a force flag for when reprocessing is the point.
  • Concurrency-limited workers, a query override, and a smoke test that runs before any of it points at real tickets.