Skip to content
chiltepin

Generated from: “Write the one-page handoff for the ticket-routing model so another team can decide whether to reuse it.

Ticket-routing model — handoff

Written by an agent from the skill, validated by chiltepin check, rendered by the renderer — shown as generated, 13 September 2026.

DOCUMENTHANDOFF

Ticket-routing model — handoff

What ticket-router-v4 does, where it is measured to work, and the conditions under which another team can reuse it.

SECTION 01 · Note

Assumptions

Note
The model is ticket-router-v4, owned by Support Platform, serving the English and Spanish support inbox. The receiving team routes a different inbox with its own queue set. Numbers below come from the 2026-08 evaluation run. Replace any of these if your setup differs.

The card

The model assigns one of 12 support queues to an inbound ticket from its subject and first message. It runs on CPU inside the ticket-router service and returns a queue plus a confidence score. Reuse means deploying the same weights against your inbox, not retraining; retraining is a separate project.

SECTION 02 · Model card
MODEL·4.1.2ticket-router-v4taskText classification (support ticket to queue)
architectureXLM-RoBERTa base fine-tune, 12 layers, classification head over 12 queues
params278M
ownerSupport Platform
licenseInternal
Intended use
  • Route an inbound ticket to one of 12 support queues at intake
  • Suggest a queue to a triage agent when confidence is below the auto-route threshold
Out of scope
  • Any language other than English and Spanish
  • Tickets with an attachment as the only content
  • Priority or severity scoring
  • Any customer-facing decision (refund, closure, escalation)
Training data
  • 620k tickets from the support inbox, 2024-03 to 2026-05, PII scrubbed, queue label from the final human assignment
  • 14k held-out tickets from 2026-06 as the test split, same label source
Metrics
MetricValueSplitNote
Macro F10.89test
Accuracy0.93test
Auto-route coverage71%prodshare of tickets at confidence >= 0.85
Auto-route accuracy0.97prodmeasured on the 71% auto-routed
Latency p9562 msprodCPU, batch 1, 4 vCPU
Limitations
  • Confuses Billing and Refunds on tickets under 20 words
  • Accuracy drops to 0.81 on tickets forwarded from a partner mailbox because the signature dominates the text
  • Trained on the queue set of one inbox; a new queue needs a retrain, not a config change
Ethics
  • Input text may contain PII; the service logs only the queue and the score, never the text

Where it works and where it does not

Per-queue numbers decide reuse more than the macro score. Three queues carry most of the errors, and all three exist because the human labels themselves disagree on the boundary. If your inbox has the same boundary, expect the same errors.

SECTION 03 · Comparison

Per-queue performance on the 2026-06 test split

QueueShare of ticketsF1Most common confusion
Billing18%0.84Refunds
Refunds9%0.82Billing
Login and access16%0.95Account changes
Account changes8%0.88Login and access
Shipping14%0.94Order status
Order status11%0.91Shipping
Product defect7%0.92Returns
Returns6%0.9Product defect
Partner and reseller3%0.81Billing
Legal and privacy2%0.93Account changes
Feedback4%0.87Product defect
Other2%0.76Feedback

F1 per queue; share is the fraction of test tickets with that label.

How a ticket moves through the router

The confidence threshold is the only tunable that changes behaviour without a retrain. Lowering it raises coverage and lowers auto-route accuracy; the 0.85 setting was chosen so that auto-routed errors stay under the triage team's 3% re-route budget. Tickets the model cannot score at all go to triage with no suggestion, and that path fires on about 0.4% of traffic.

SECTION 04 · Flowchart

Intake path for one ticket

FLOW
Flowchart: 7 stepsTicket arrivesLanguage is EN orES?Score 12 queuesConfidence >=0.85?Auto-route to queueTriage withsuggested queueTriage with nosuggestion1234
1yes2no3yes4no
Legendstartstepdecision (diamond)exitnexterror pathhappy path

Reuse test

Run this list against your inbox before you commit. Two or more fails mean the model is not a fit as shipped. A retrain on your labels is the smaller project only if you already hold six months of human-assigned queue labels.

SECTION 05 · Checklist

Fit test for a new inbox

Support Platform model reuse v2
Input
pending
90% or more of tickets are in English or Spanishmeasure on one week of traffic
pending
Tickets carry text in the subject or first message, not only attachmentsmeasure on one week of traffic
pending
Fewer than 10% of tickets arrive via a forwarding mailbox with a long signaturesee the partner-mailbox limitation
Labels
pending
Your queue set maps one-to-one onto the 12 queues abovea queue with no counterpart forces a retrain
pending
Your Billing and Refunds boundary matches the card's definitionelse expect F1 near 0.83 on both
Operations
pending
A triage team exists to receive the 29% of tickets below the threshold
pending
Serving budget allows 62 ms p95 on 4 vCPU per replica, or a GPU
pending
Ticket text must not be loggedthe service already complies; confirm your log pipeline does too
0 pass · 0 fail · 8 pendingpass rate 0%
View the Markdown
```meta
title: Ticket-routing model — handoff
subtitle: What ticket-router-v4 does, where it is measured to work, and the conditions under which another team can reuse it.
tag: HANDOFF
```

```callout
tone: note
title: Assumptions
body: "The model is ticket-router-v4, owned by Support Platform, serving the English and Spanish support inbox. The receiving team routes a different inbox with its own queue set. Numbers below come from the 2026-08 evaluation run. Replace any of these if your setup differs."
```

## The card

The model assigns one of 12 support queues to an inbound ticket from its subject and first message. It runs on CPU inside the `ticket-router` service and returns a queue plus a confidence score. Reuse means deploying the same weights against your inbox, not retraining; retraining is a separate project.

```modelcard
name: ticket-router-v4
version: 4.1.2
task: Text classification (support ticket to queue)
architecture: XLM-RoBERTa base fine-tune, 12 layers, classification head over 12 queues
params: 278M
owner: Support Platform
license: Internal
intendedUse:
  - Route an inbound ticket to one of 12 support queues at intake
  - Suggest a queue to a triage agent when confidence is below the auto-route threshold
outOfScope:
  - Any language other than English and Spanish
  - Tickets with an attachment as the only content
  - Priority or severity scoring
  - Any customer-facing decision (refund, closure, escalation)
trainingData:
  - 620k tickets from the support inbox, 2024-03 to 2026-05, PII scrubbed, queue label from the final human assignment
  - 14k held-out tickets from 2026-06 as the test split, same label source
metrics:
  - { name: Macro F1, value: 0.89, split: test }
  - { name: Accuracy, value: 0.93, split: test }
  - { name: Auto-route coverage, value: 71%, split: prod, note: "share of tickets at confidence >= 0.85" }
  - { name: Auto-route accuracy, value: 0.97, split: prod, note: "measured on the 71% auto-routed" }
  - { name: Latency p95, value: 62 ms, split: prod, note: "CPU, batch 1, 4 vCPU" }
limitations:
  - Confuses Billing and Refunds on tickets under 20 words
  - Accuracy drops to 0.81 on tickets forwarded from a partner mailbox because the signature dominates the text
  - Trained on the queue set of one inbox; a new queue needs a retrain, not a config change
ethics:
  - Input text may contain PII; the service logs only the queue and the score, never the text
```

## Where it works and where it does not

Per-queue numbers decide reuse more than the macro score. Three queues carry most of the errors, and all three exist because the human labels themselves disagree on the boundary. If your inbox has the same boundary, expect the same errors.

```table
title: Per-queue performance on the 2026-06 test split
columns: [Queue, Share of tickets, F1, Most common confusion]
rows:
  - [Billing, 18%, { v: 0.84, tone: warn }, Refunds]
  - [Refunds, 9%, { v: 0.82, tone: warn }, Billing]
  - [Login and access, 16%, { v: 0.95, tone: pos }, Account changes]
  - [Account changes, 8%, { v: 0.88, tone: warn }, Login and access]
  - [Shipping, 14%, { v: 0.94, tone: pos }, Order status]
  - [Order status, 11%, { v: 0.91, tone: pos }, Shipping]
  - [Product defect, 7%, { v: 0.92, tone: pos }, Returns]
  - [Returns, 6%, { v: 0.90, tone: pos }, Product defect]
  - [Partner and reseller, 3%, { v: 0.81, tone: neg }, Billing]
  - [Legal and privacy, 2%, { v: 0.93, tone: pos }, Account changes]
  - [Feedback, 4%, { v: 0.87, tone: warn }, Product defect]
  - [Other, 2%, { v: 0.76, tone: neg }, Feedback]
note: "F1 per queue; share is the fraction of test tickets with that label."
```

## How a ticket moves through the router

The confidence threshold is the only tunable that changes behaviour without a retrain. Lowering it raises coverage and lowers auto-route accuracy; the 0.85 setting was chosen so that auto-routed errors stay under the triage team's 3% re-route budget. Tickets the model cannot score at all go to triage with no suggestion, and that path fires on about 0.4% of traffic.

```flow
title: Intake path for one ticket
nodes:
  - { id: intake, col: 1, row: 1, kind: start, label: Ticket arrives }
  - { id: lang, col: 2, row: 1, kind: decision, label: "Language is EN or ES?" }
  - { id: score, col: 3, row: 1, kind: process, label: Score 12 queues }
  - { id: conf, col: 4, row: 1, kind: decision, label: "Confidence >= 0.85?" }
  - { id: auto, col: 5, row: 1, kind: end, label: Auto-route to queue }
  - { id: suggest, col: 5, row: 2, kind: end, label: "Triage with suggested queue" }
  - { id: triage, col: 2, row: 2, kind: end, label: "Triage with no suggestion" }
edges:
  - intake -> lang
  - lang -> score: "yes"
  - lang -x-> triage: "no"
  - score -> conf
  - conf -> auto: "yes"
  - conf --> suggest: "no"
```

## Reuse test

Run this list against your inbox before you commit. Two or more fails mean the model is not a fit as shipped. A retrain on your labels is the smaller project only if you already hold six months of human-assigned queue labels.

```checklist
title: Fit test for a new inbox
standard: Support Platform model reuse v2
groups:
  - label: Input
    items:
      - "[pending] 90% or more of tickets are in English or Spanish — measure on one week of traffic"
      - "[pending] Tickets carry text in the subject or first message, not only attachments — measure on one week of traffic"
      - "[pending] Fewer than 10% of tickets arrive via a forwarding mailbox with a long signature — see the partner-mailbox limitation"
  - label: Labels
    items:
      - "[pending] Your queue set maps one-to-one onto the 12 queues above — a queue with no counterpart forces a retrain"
      - "[pending] Your Billing and Refunds boundary matches the card's definition — else expect F1 near 0.83 on both"
  - label: Operations
    items:
      - "[pending] A triage team exists to receive the 29% of tickets below the threshold"
      - "[pending] Serving budget allows 62 ms p95 on 4 vCPU per replica, or a GPU"
      - "[pending] Ticket text must not be logged — the service already complies; confirm your log pipeline does too"
```