Ticket Triage Agent · git:20261012.86a11c5 · 2026-10-12 · sha256 0df1ac68265f9802

Ticket Triage Agent git:20261012.86a11c5A

Immutable. This exact content never changes and is served at /api/v1/blob/0df1ac68265f9802.

---
name: "Ticket Triage Agent"
description: >
  Build (or run once) a ticket-triage agent that classifies new PSA
  tickets by priority, advances them to In Progress, and posts a summary
  to the connected chat tool. Works with any curated PSA — Autotask,
  HaloPSA, or ConnectWise PSA.
when_to_use: >-
  Use when a customer wants new support tickets automatically triaged and
  prioritized. Use when: ticket triage, ticket dispatch, priority
  classification, PSA automation.
---

## What this does

Finds new/untriaged PSA tickets, classifies each by priority from its
content, updates the record, moves it to In Progress, and posts a
one-line summary to chat. Can run as a one-off right now, or be installed
as an hourly Claude-managed scheduled routine.

## Source

Generalizes the `ticket-dispatcher` agent (`autotask` plugin, Archetype
B — "the canonical archetype-B fit") plus the equivalent
`service-desk-ops` agents the catalog lists for `halopsa` and
`connectwise-psa` — the same three PSAs `psa-tool-map` curates tool
names for.

## Prerequisites

| Requirement | Notes |
|-------------|-------|
| **A connected PSA** | Autotask, HaloPSA, or ConnectWise PSA (curated — see `psa-tool-map` for tool names; another connected PSA works via guided discovery). Must be able to read and update tickets — priority and status. |
| **A connected chat-delivery target** | Slack (shipped) — see `chat-delivery-adapters`. Teams is not yet available. |
| **Scheduled routines access** (only if installing as a routine) | Via the `/schedule` capability; managed at claude.ai/code/routines. |

## Detecting the customer's stack

1. Check which curated PSA is connected. More than one → ask which to
   use. None → tell the human a PSA connection is needed, don't guess.
2. Fetch `skill://advanced-workflows/psa-tool-map/SKILL.md` for that
   vendor's exact tool names, status/priority discovery approach, and
   gotchas.
3. Fetch `skill://advanced-workflows/chat-delivery-adapters/SKILL.md` for
   the connected delivery target's write tool and limits.

## Run it now

1. Using the PSA's "list new/untriaged tickets" tool, find tickets in the
   New (or equivalent untriaged) status.
2. For each, get its detail (title, description, requester).
3. Classify PRIORITY using the rubric below.
4. Call the PSA's "update ticket" tool once per ticket: set priority AND
   advance status to In Progress in the same call — the status change is
   the idempotency guard, so a second run won't reprocess it.
5. Post a one-line summary per ticket to the connected chat-delivery
   target.
6. If an update call fails, leave the ticket in its original status and
   post a "needs a human" message instead — never skip silently.

Priority rubric:
- **Critical**: server/site down, multiple users affected, or a security
  incident.
- **High**: a single user fully blocked from working.
- **Medium**: service degraded but the user can still work.
- **Low**: requests, questions, cosmetic issues.
- When torn between two, pick the lower-severity one.

## Set up as a recurring routine

1. Confirm the PSA connector works (a lightweight test/ping call from the
   tool-map skill, if one exists for the connected vendor).
2. Discover the tenant's status and priority IDs **once**, by name — per
   the tool-map skill's guidance for the connected PSA. Do not bake
   `list_*` discovery calls into the routine itself.
3. Confirm the chat-delivery connector and destination channel.
4. Create a Claude-managed scheduled routine named "Ticket Triage Agent":
   - Schedule: hourly (`0 * * * *`) — Claude-managed routines reject any
     cadence faster than hourly.
   - Attach the PSA connector with `permitted_tools` populated with
     exactly the tools this workflow needs (list, get-detail, update) —
     an attached connector with an empty `permitted_tools` list runs with
     no tools and silently does nothing.
   - Attach the chat-delivery connector with its `permitted_tools`.
   - Routine prompt: the "Run it now" steps above, with the discovered
     status/priority IDs baked in by name (never re-discovered per run).
5. Create one test ticket, trigger a manual run, and verify: the ticket
   moved to In Progress + reprioritized, one chat message posted, and a
   second run does not reprocess it.

## Known gotchas

- **One-hour minimum cadence.** Claude-managed routines reject any cron
  faster than hourly.
- **`permitted_tools` must be populated per connector**, or the routine
  runs with no tools and no error.
- **Routine tool calls prompt for permission** the first time each new
  tool is touched — pre-allow them or expect an approval prompt on first
  run.
- **Don't call list/discovery tools every run** — enumerate once at build
  time; per-run discovery calls are slow enough to hit the tool timeout.

## How it works

### Idempotency is structural
The agent only picks up tickets in the untriaged status, and triaging a
ticket moves it out of that status — the transition itself is the
"already handled" marker. No database or timestamp window is needed.

### Failures escalate to a human
An unclassifiable ticket or a failed update call leaves the ticket
untouched and posts a "needs a human" message — never silently skipped,
never mis-prioritized without a person being told.

## Extending it

This classifies priority only, deliberately — enumerating queue/category
lists per run is what triggers slow discovery calls. To add queue or
category routing, bake those lists into the routine prompt the same way
status/priority IDs are baked in.