Dispatch Prioritization
Overview
An unassigned queue is a prioritization problem, not a first-in-first-out list.
This skill scores each unassigned ticket on a small set of factors and turns that
score into a defensible assignment order — the same judgment a good dispatcher
applies, made explicit and repeatable.
Anti-triggers
- Triaging one incoming ticket — setting a single ticket's priority,
category, owner, and first response is
shared-skills-ticket-triage; this
skill orders and staffs a whole unassigned queue.
- Searching, creating, or updating tickets — use
autotask-tickets,
halopsa-tickets, or connectwise-psa-tickets for the PSA's own ticket
surface.
Discovering available tools first
Because this pack is cross-vendor, never assume which PSA or RMM is connected, or
what its tools are literally named. Before pulling any ticket data:
- Call
conduit__search_tools with a query like "list tickets" or "unassigned tickets" to discover which PSA connector(s) are actually live for this org, and
the exact tool names it exposes (they follow <vendor-slug>__<tool_name>, e.g.
autotask__search_tickets, halopsa__tickets_list).
- If an RMM is also useful for scoring (e.g., to weight a ticket tied to a device
that's also alerting), repeat the discovery for RMM tools
(
datto-rmm__list_devices, etc.) rather than assuming one is connected.
- Only after discovery, call the concrete tools that came back. If the discovery
call returns no PSA connector at all, stop and say so — there is no queue to
dispatch without a PSA.
Never fall back to guessing a tool name (e.g., calling connectwise__search_tickets
speculatively) — an unrecognized tool call is a worse failure mode than asking the
user which PSA they use.
Key Concepts
Priority scoring factors
Score each unassigned ticket on these factors, then combine into a single ranked
order. Exact weights are a judgment call for the org, but in the absence of a
documented local policy, use this relative ordering (highest-impact first):
- SLA proximity — how close the ticket is to breaching (see the
sla-escalation-playbooks skill for how to read this per PSA family). A ticket
at "breached" or "at risk" outranks everything else below.
- Client tier — a Premium/Platinum client's ticket is worked ahead of an
otherwise-identical Bronze ticket at the same SLA state, because tier-appropriate
response time is itself part of the SLA in most contracts.
- Ticket age — how long the ticket has sat unassigned, independent of formal
SLA. A ticket that's been sitting three days with no SLA clock (e.g., a
low-priority Syncro ticket with no formal SLA engine) still deserves to move up
the queue as age accumulates, or it becomes a
board-hygiene stale-ticket
problem instead.
- Technician load — don't stack the queue onto whoever is already buried. Pull
current open-ticket counts per technician where the PSA exposes them (e.g., via a
resource/agent search filtered by open tickets) and prefer assigning to
technicians with lower current load, subject to skill match.
- Skill/category match — if the PSA carries category, ticket type, or a
technician skill/queue mapping, prefer routing to a technician whose queue
matches the ticket's category over pure load-balancing. A generalist queue can
ignore this factor.
Combining factors into an order
A simple, explainable approach that avoids over-engineering a scoring formula:
- Bucket tickets by SLA state first (breached-resolution, breached-response, at
risk, healthy) — this is the primary sort key.
- Within a bucket, sort by client tier, then by age.
- When proposing an assignee, filter by skill/category match (if available), then
pick the lowest-load matching technician.
State the ranking logic used in the output so a dispatcher can sanity-check or
override it — this skill produces a proposal, not an automatic assignment, unless
the operator has explicitly asked for tickets to actually be assigned.
Common Workflows
Score and rank the unassigned queue
- Discover PSA tools via
conduit__search_tools (see above).
- Pull the unassigned ticket list, scoped to the board/queue in question.
- For each ticket, resolve priority/status/SLA fields via the PSA's own list tools.
- Bucket and sort per the ordering above.
- Return a ranked list with the scoring rationale visible per ticket.
Propose assignments
- Run the ranking workflow above.
- Pull technician roster and current open-ticket counts (resource/agent search,
filtered by open assigned tickets) if the PSA exposes it. If it doesn't, say so
and skip load-balancing rather than guessing at technician capacity.
- Propose one assignee per ticket, in ranked order, with a one-line rationale
("breached response SLA, matches Networking queue, lowest current load among
matching technicians").
- Do not write the assignment back to the PSA unless the operator explicitly asks
for it — default to a proposal.
Error Handling
No PSA connector discovered
Say so explicitly: "No PSA connector is available through the gateway, so there's no
unassigned queue to prioritize." Do not fabricate tickets.
PSA connected but technician/resource data unavailable
Proceed with SLA/tier/age scoring only, and note explicitly that the load-balancing
factor was skipped because technician workload data wasn't available.
Ambiguous or multiple PSAs connected
Ask which PSA/board to scope to rather than silently picking one.
Best Practices
- Treat missing data (no technician workload, no formal SLA) as a stated gap, not a
reason to skip the whole factor silently.
Related Skills
- SLA Escalation Playbooks — how to read
breach-risk state per PSA family, the primary sort key here
- Board Hygiene — queue-balance across technicians and
stale-ticket detection for tickets that never got reprioritized after assignment
1---2name: dispatch-prioritization3description: Priority scoring and assignment for an unassigned PSA ticket queue: the scoring factors (SLA proximity, client tier, ticket age, technician load, skill/category match), how to combine them into an explainable ranked order rather than a black-box formula, and the tool-discovery pattern for finding which PSA and RMM connectors are actually live before calling any vendor's tools.4---56# Dispatch Prioritization78## Overview910An unassigned queue is a prioritization problem, not a first-in-first-out list.11This skill scores each unassigned ticket on a small set of factors and turns that12score into a defensible assignment order — the same judgment a good dispatcher13applies, made explicit and repeatable.1415## Anti-triggers1617- **Triaging one incoming ticket** — setting a single ticket's priority,18 category, owner, and first response is `shared-skills-ticket-triage`; this19 skill orders and staffs a whole unassigned queue.20- **Searching, creating, or updating tickets** — use `autotask-tickets`,21 `halopsa-tickets`, or `connectwise-psa-tickets` for the PSA's own ticket22 surface.2324## Discovering available tools first2526Because this pack is cross-vendor, never assume which PSA or RMM is connected, or27what its tools are literally named. Before pulling any ticket data:28291. Call `conduit__search_tools` with a query like `"list tickets"` or `"unassigned30 tickets"` to discover which PSA connector(s) are actually live for this org, and31 the exact tool names it exposes (they follow `<vendor-slug>__<tool_name>`, e.g.32 `autotask__search_tickets`, `halopsa__tickets_list`).332. If an RMM is also useful for scoring (e.g., to weight a ticket tied to a device34 that's also alerting), repeat the discovery for RMM tools35 (`datto-rmm__list_devices`, etc.) rather than assuming one is connected.363. Only after discovery, call the concrete tools that came back. If the discovery37 call returns no PSA connector at all, stop and say so — there is no queue to38 dispatch without a PSA.3940Never fall back to guessing a tool name (e.g., calling `connectwise__search_tickets`41speculatively) — an unrecognized tool call is a worse failure mode than asking the42user which PSA they use.4344## Key Concepts4546### Priority scoring factors4748Score each unassigned ticket on these factors, then combine into a single ranked49order. Exact weights are a judgment call for the org, but in the absence of a50documented local policy, use this relative ordering (highest-impact first):51521. **SLA proximity** — how close the ticket is to breaching (see the53 `sla-escalation-playbooks` skill for how to read this per PSA family). A ticket54 at "breached" or "at risk" outranks everything else below.552. **Client tier** — a Premium/Platinum client's ticket is worked ahead of an56 otherwise-identical Bronze ticket at the same SLA state, because tier-appropriate57 response time is itself part of the SLA in most contracts.583. **Ticket age** — how long the ticket has sat unassigned, independent of formal59 SLA. A ticket that's been sitting three days with no SLA clock (e.g., a60 low-priority Syncro ticket with no formal SLA engine) still deserves to move up61 the queue as age accumulates, or it becomes a `board-hygiene` stale-ticket62 problem instead.634. **Technician load** — don't stack the queue onto whoever is already buried. Pull64 current open-ticket counts per technician where the PSA exposes them (e.g., via a65 resource/agent search filtered by open tickets) and prefer assigning to66 technicians with lower current load, subject to skill match.675. **Skill/category match** — if the PSA carries category, ticket type, or a68 technician skill/queue mapping, prefer routing to a technician whose queue69 matches the ticket's category over pure load-balancing. A generalist queue can70 ignore this factor.7172### Combining factors into an order7374A simple, explainable approach that avoids over-engineering a scoring formula:75761. Bucket tickets by SLA state first (breached-resolution, breached-response, at77 risk, healthy) — this is the primary sort key.782. Within a bucket, sort by client tier, then by age.793. When proposing an assignee, filter by skill/category match (if available), then80 pick the lowest-load matching technician.8182State the ranking logic used in the output so a dispatcher can sanity-check or83override it — this skill produces a proposal, not an automatic assignment, unless84the operator has explicitly asked for tickets to actually be assigned.8586## Common Workflows8788### Score and rank the unassigned queue89901. Discover PSA tools via `conduit__search_tools` (see above).912. Pull the unassigned ticket list, scoped to the board/queue in question.923. For each ticket, resolve priority/status/SLA fields via the PSA's own list tools.934. Bucket and sort per the ordering above.945. Return a ranked list with the scoring rationale visible per ticket.9596### Propose assignments97981. Run the ranking workflow above.992. Pull technician roster and current open-ticket counts (resource/agent search,100 filtered by open assigned tickets) if the PSA exposes it. If it doesn't, say so101 and skip load-balancing rather than guessing at technician capacity.1023. Propose one assignee per ticket, in ranked order, with a one-line rationale103 ("breached response SLA, matches Networking queue, lowest current load among104 matching technicians").1054. Do not write the assignment back to the PSA unless the operator explicitly asks106 for it — default to a proposal.107108## Error Handling109110### No PSA connector discovered111112Say so explicitly: "No PSA connector is available through the gateway, so there's no113unassigned queue to prioritize." Do not fabricate tickets.114115### PSA connected but technician/resource data unavailable116117Proceed with SLA/tier/age scoring only, and note explicitly that the load-balancing118factor was skipped because technician workload data wasn't available.119120### Ambiguous or multiple PSAs connected121122Ask which PSA/board to scope to rather than silently picking one.123124## Best Practices125126- Treat missing data (no technician workload, no formal SLA) as a stated gap, not a127 reason to skip the whole factor silently.128129## Related Skills130131- [SLA Escalation Playbooks](../sla-escalation-playbooks/SKILL.md) — how to read132 breach-risk state per PSA family, the primary sort key here133- [Board Hygiene](../board-hygiene/SKILL.md) — queue-balance across technicians and134 stale-ticket detection for tickets that never got reprioritized after assignment