A Skill Evaluation Post-Mortem: I Overturned an Existing Model Selection, Then Built My Own Eval Platform

A teammate's skill-model adaptation report looked polished, but on closer inspection it had real problems: one case per scenario, and AI judging its own correctness. I redesigned the evaluation for the Jira Skill's most frequent task — fetching a bug and downloading attachments — with 100 cases × 3 samples, scored by scripts that diff against ground truth. The result was counter-intuitive: the top-scoring sonnet-5-5 was not the best choice; ds-v4.1-flash won on success rate, cost and speed combined. The post ends with the Skill evaluation platform behind the re-test: eval plans, cases, runs, metrics, AI-written reports, plus version-over-version and model-vs-model comparison.

·11 min read·AI Engineering

How It Started: A Report That Looked Complete

Not long ago the team produced a "high-frequency skill model adaptation evaluation" that picked a best model for each of the Jira Skill's 8 task scenarios (D1–D8). It had tables, accuracy numbers, token and latency comparisons. It was neatly formatted and the conclusions were clear.

I was ready to use it as the basis for model selection. But the more I read it, the less comfortable I got.

The core data looked like this (40 judgments per model):

ModelAccuracyAvg TokensAvg Latency
deepseek-v4-pro40/401,53932.7 s
claude-sonnet-4-639/401,79124.7 s
deepseek-v4-flash39/402,16033.2 s
glm-5.340/402,77543.3 s
doubao-2.0-lite33/401,07629.4 s
kimi-k232/401,09230.1 s

The top four models all sit at 97.5% or above, essentially tied. When every strong model scores near-perfect, it usually isn't because they're all great. It's because the task is too easy or the grading too lenient to tell them apart.

With that suspicion, I took the methodology apart.


What Was Wrong With It

Problem 1: One sample

Each scenario had a single case, run 5 times. That tests "is this one case stable?", not "does it still work on a different case?". Five runs are not five samples; they're five draws from the same sample.

Doing well on one bug ticket says nothing about a ticket with 50 attachments and special characters in the description.

Problem 2: AI judges its own answers

"Accuracy" was defined loosely: an AI decided whether the output was right. That's fine for semantic tasks, but risky for tasks like "reproduce the bug's content verbatim". A real example comes below.

Problem 3: Tested tasks didn't match real usage

In the bugfix workflow only 3 of the Skill's tasks are used often: fetch bug info and download attachments, add a comment, change the assignee. The best model across 8 tasks isn't necessarily the best for those 3, and a cheaper model might be good enough.

Problem 4: Missing candidates

The strongest model, sonnet-5-5, wasn't tested, and neither was ds-v4.1-flash, which is both strong and cheap. A "best" picked from an incomplete candidate set isn't very convincing.

None of these is outrageous alone, but stacked together the conclusion doesn't hold. So I decided to re-test.


Redesigning the Evaluation

Scope: answer one question at a time

I started with scenario 1, "fetch bug info and download attachments", the most frequently called and most failure-prone step. One question at a time keeps the conclusion from being diluted by other tasks.

Metric: scripts judge, not AI

The metric is information retrieval accuracy, with deliberately rigid scoring:

  • A script diffs the Agent's output against ground truth character by character
  • Exact match → 5 points; any difference → 0
  • Ground truth has two parts:
    • Text such as bug title and description must match exactly
    • Attachment count, names and file sizes must match exactly

Scale: 100 cases × 3 samples

100 different bug tickets, each sampled 3 times per model. 100 cases cover diversity; 3 samples show stability on the same case.

Why not AI scoring

Consider a real failure. The cheapest model, doubao-seed-2.0-mini, makes subtle word-level mistakes when restating bug content in this task.

That raises an awkward question: if an AI judges whether the output matches ground truth, it will likely let such errors slide. If it makes mistakes when restating, why trust it not to make them when comparing?

AI scoring is good at semantic judgments (is it relevant, is it helpful) and weak at exact character-level checking. "The bug description is identical, character for character" is exactly the latter.

The rule is simple: if a script can judge it, don't ask an AI. A script not only decides right from wrong, it also pinpoints where and why it's wrong. The failure reasons in the screenshots below all come from the script, for example first diff at char 44, which says exactly where the text first diverges.


Results: The Top Score Isn't Necessarily the Best Choice

sonnet-5-5: highest score, but its errors are fatal

Across 100 cases × 3 samples, sonnet-5-5 made only 3 errors, the best of all models.

But those 3 errors fall into two patterns, both fatal for this task:

  1. Fetched the wrong Jira ticket. It got another ticket's information, and everything downstream is built on wrong input.
  2. The Agent couldn't finish the task. It stalled mid-flow with no result.

Here is the second pattern. The reply says it can't finish the requested output format. The ticket and all 50 attachments were actually fetched, but the final result block is incomplete, the script can't parse it, and the case scores 0:

sonnet-5-5 incomplete task: reply cut off, ISSUE_JSON block incomplete

The first pattern is the one to worry about: with a single case you'd almost never hit it. Rare fatal errors only show up in a large enough sample. That is exactly where the original report's method breaks down.

ds-v4.1-flash: best overall value

Per the pricing from IT, ds-v4.1-flash is cheaper than both v4-pro and v4-flash, making it the best value on paper. On this task its score is second only to sonnet-5-5.

Side by side in the run history (red box is ds-v4.1-flash; v2-5 is sonnet-5-5):

Run history: sonnet-5-5 vs ds-v4.1-flash
ModelAccuracy scoreAvg durationAvg tokens
sonnet-5-54.9344,414 ms174,485
ds-v4.1-flash4.7834,649 ms45,995

The score gap is 0.15, but ds-v4.1-flash is faster and uses about a quarter of the tokens of sonnet-5-5.

Its errors fall into two patterns:

Error patternCountSeverity
Minor word-level restating errors10Acceptable
Did not follow the output format2Minor

A typical restating error: the description is 188 characters in both, but differs from character 44 onward, meaning a few words were swapped for near-synonyms.

Word-level restating error: same description length, differs from char 44

A format error is when the model didn't output the JSON verbatim and wrote a line like "step 2's stdout is the JSON below" instead, so the script can't parse it:

Format error: ISSUE_JSON not parseable

What matters is the nature of the errors. Most of ds-v4.1-flash's errors are small word-level deviations. Here the Agent fetches bug info for later analysis and fixing; a few words off doesn't change what the bug points to, so it isn't fatal.

By contrast, sonnet-5-5 errs less often, but both of its error types invalidate the whole flow.

Selection result

For "fetch bug info and download attachments", ds-v4.1-flash wins on success rate, cost and speed combined.

This is counter-intuitive: the top score isn't the best pick. Model selection isn't about the score, it's about "cost of an error × how often it happens + cost of the call".


Lessons From This Re-test

  1. Sample size decides how far you can trust a conclusion. Many runs of one case show stability, not generalization. Fatal but rare errors (like fetching the wrong ticket) need large samples to surface.
  2. Don't use AI to judge what a script can. An AI judge lets through the subtle mistakes it makes itself. Exact diffing is both accurate and explains the cause.
  3. Classify errors by pattern and severity. "3 errors" and "12 errors" aren't directly comparable; ask whether each kind invalidates the flow.
  4. Align selection with tasks actually used. The best model across 8 tasks isn't necessarily best for the 3 you use. The eval task mix should match production usage.
  5. Be willing to overturn conclusions. With more data and a stricter method, old conclusions should give way.

But the biggest takeaway from this re-test was something else: if you hand-roll this process every time, it won't last.


From a One-off Re-test to a Platform

This re-test meant configuring 100 cases, running 3 sampling rounds, comparing several models, tallying error patterns, and writing it all up. With ad-hoc scripts, every new model or every Skill change means starting over, and large-sample evaluation can't be sustained.

So I turned the whole process into the Skill Evaluation module of my AI workbench, and the Jira re-test above ran inside it. Below I walk through the full flow using a commit-message Skill as the example.

1. Eval plan: define what "good" means first

Each Skill gets an eval plan whose core is metrics and weights. Every metric uses one of two scoring modes:

  • AI score: an AI scores 1–5 against a rubric, suited to semantic judgments like title quality or motivation
  • Rule check: regex or other assertions, suited to precisely checkable things like format compliance

This matches the lesson above: use rules wherever a rule can decide, hand only the semantic judgments to AI, and write the rubric into the plan rather than going by feel.

Eval plan: metrics, scoring mode and weight distribution

2. Test cases: write by hand, batch import, or AI-generate

The cases page supports three sources: add manually, batch import, and AI auto-generate. Each case has an input, an expected result, and the metrics that apply to it.

Test cases: each declares input, expected result and applicable metrics

The right side of each case summarizes its best and worst score across configurations, so it's easy to spot which cases discriminate well.

3. Runs: both version and model are variables

When triggering an eval you pick the Skill version and the model. The platform runs it in batch and computes each metric, the spread (σ), average duration and tokens. In run history each column is a run, colored by metric score, with the best value per metric marked.

The Head-to-head section below supports two kinds of comparison:

  • Vertical (same model, different Skill versions): the platform labels it "Same condition: only the skill version differs", so there's one variable. It answers "did this Skill change actually help?"
  • Horizontal (same version, different models): it answers "can this Skill run on a cheaper model?", which is the question this Jira re-test set out to answer
Run history: metrics × runs matrix and head-to-head comparison

4. AI-written report: conclusion, recommendation, evidence

After runs complete, you pick some runs and let AI generate a comparison report with three layers:

  • Conclusion: with effect size and confidence interval
  • Recommendation: default choice, conditional choices, and next steps to firm up the conclusion
  • Evidence: overview, stability, per-group performance, failure analysis, efficiency and tokens, limitations; each section expands to the analysis and underlying tables

Reports can be downloaded as Markdown or a data pack for archiving or further analysis.

AI report: conclusion, recommendation and expandable evidence

One detail: this sample report states its own limits in the "Limitations" section, such as response contents being omitted and too few cases, so conclusions rest on scores alone. A good eval report states its boundaries instead of just handing you a pretty number.

💬 Want to try the Skill evaluation platform, or talk it over? Leave a comment below. I'd love to hear what problems you've run into evaluating Skills, or how you'd want to use it.


Wrap-up

Looking back, the whole thing is three steps:

  1. Question it: near-perfect scores for everyone, a single case, and AI grading its own answers are all red flags in the method
  2. Redo it: narrow the scope, score with scripts, enlarge the sample, match real tasks
  3. Make it durable: turn the method into a platform so the next evaluation is just "add cases, pick models, hit run"

Evaluation shouldn't be a one-off verdict. It should be a repeatable engineering step that keeps pace as Skills and models evolve.


Check out PrimeSkills — a curated marketplace of AI agents and skills that have been validated in real-world, enterprise-grade workflows. No fluff, just what actually works.

Find more useful knowledge and interesting products on my Homepage