Skip to content
An assay office for support tickets

Your team already
solved it. 240 times.

The procedure is already in your closed tickets — spread across the ones that went well, with the edges of it marked out by the ones that went badly. SkillMint reads them, strikes a skill from what it finds, and then proves that skill against tickets it has never seen. Nothing leaves the office unassayed.

Specimen · struck v1
38
New Employee Onboarding
new-employee-onboarding
Held-out tickets passed
3/8
Wrongly auto-resolved
0
Over-cautious
5

It never closed a ticket that needed a person. It failed by fetching one too often — which is the direction you want a new skill to fail in.

Read every case →

What is on the bench

read from data/tickets.json at request time
Tickets
240
resolved, with full conversations
Handled badly
60
reopened, escalated, or CSAT ≤ 2
Mean CSAT
3.81
where a survey came back
Recoverable
250h
volume × median handling time
01—07

The line

each stage reads the previous stage's artifact off disk
01

Sort the intake

Group the backlog by what people were actually asking for. Nothing is told in advance which types exist.

240 tickets → 8 repeated request types
02

Assay each group

Split every group three ways by how well a human actually handled it. Averaging all of them would encode the team's bad habits as if they were policy.

55 best-handled · 45 went wrong · 41 sealed for testing
03

Read the procedure

Recover the steps the best-handled tickets have in common, from the conversation rather than from a wiki nobody updated.

8 procedure traces recovered
04

Mine the guardrails

Work the failed tickets backwards. Each one names a condition where the safe move was to stop and fetch a person.

8 stop rules, each citing the ticket that earned it
05

Strike the skill

Cast the procedure and the guardrails into one machine-readable spec, with the tools it needs declared up front.

4 steps · 4 tools declared
06

Send it to the critic

A second model attacks the draft looking for ways it fails in the real world, and its objections are folded back in.

6 findings raised before shipping
07

Trial of the pyx

Replay the finished skill against the tickets sealed away in stage two. It has never seen them. This is the only number that counts.

3 of 8 held-out tickets passed

Where the tickets come from

Bundled corpus

in use

240 synthetic service-desk tickets across 8 recurring request types, with a deliberate spread of handling quality — clean resolutions, slow ones, reopened ones, and genuine escalations. The bad ones are the point: without them there is nothing for the assay in stage 02 to discriminate against.

new-employee-onboardinglaptop-hardware-issuesvpn-connection-issuessalesforce-accessdatadog-accessmfa-reset

Live Freshservice

Set FRESHSERVICE_DOMAIN and FRESHSERVICE_API_KEY, then run with SOURCE=freshservice. Conversations are fetched one ticket at a time and cached to disk — the list endpoint cannot return them, so the first pull is slow and every pull after it is free.

Run it yourself

click a command to copy it
no provider key
✓
Build the ticket corpus
No API key needed.
✓
Cluster and assay it
No API key needed. Stages 01 and 02 are deterministic.
✓
Run the whole line
No provider key found. Add ANTHROPIC_API_KEY, GROQ_API_KEY or OPENROUTER_API_KEY to .env.local.