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.
- 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 timeThe line
each stage reads the previous stage's artifact off diskSort the intake
Group the backlog by what people were actually asking for. Nothing is told in advance which types exist.
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.
Read the procedure
Recover the steps the best-handled tickets have in common, from the conversation rather than from a wiki nobody updated.
Mine the guardrails
Work the failed tickets backwards. Each one names a condition where the safe move was to stop and fetch a person.
Strike the skill
Cast the procedure and the guardrails into one machine-readable spec, with the tools it needs declared up front.
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.
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.
Where the tickets come from
Bundled corpus
in use240 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.
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.