Optional. Produces a pre/post evidence report that quantifies a migration — both the raw model delta and the value the skill’s enhancements added.
Read this when the user opts into benchmarking (asked once in Phase 0). If they decline, skip all benchmark steps and omit the Benchmark Results report section.
A migration changes two things at once: the model and the system around it (prompts, tool specs, params). To attribute gains correctly, measure three configurations on the same input set and same metrics:
| Arm | Config | Isolates |
|---|---|---|
| A — baseline | old model + old prompts/system | starting point |
| B — naive swap | new model + old prompts/system | raw model delta |
| C — ModelPort-enhanced | new model + skill-enhanced system | skill’s added value |
Arm B is the honest control: it shows what a search-and-replace upgrade alone would have produced. C − B is the migration work’s contribution.
The phase pipeline produces the arms for free — capture at the boundaries:
Pick the subset that matters for the workload; do not pad with irrelevant metrics. Default migration-relevant set:
| Dimension | Metric | How |
|---|---|---|
| Quality / correctness | task success rate, eval pass@k | fixed eval set; LLM-as-judge or unit checks |
| Output contract | schema-valid / parse-success rate | run outputs through the real parser/validator |
| Tool calling | right-tool rate, valid-args rate, invocation rate | compare tool calls vs expected per case |
| Latency | TTFT, end-to-end p50/p95, tokens/sec | ≥20 runs/case; report percentiles, not means |
| Cost | input/output tokens, cost per request | token counts × current per-token price |
| Safety / behavior | refusal rate, hallucination rate | adversarial + factual probe set |
| Robustness | adversarial / injection / long-context pass rate | stress subset of the eval set |
LLM-as-a-judge: use a fixed rubric and a separate judge model; score all arms with the same judge and rubric in the same run to keep scores comparable.
Optional single number for a leaderboard. Normalize each dimension to [0,1] (higher = better; invert latency/cost/refusal), then weight by business priority. Default weighting:
composite = 0.50 * quality + 0.30 * cost_efficiency + 0.20 * speed
Always print the weights next to the score. Never report a composite without the per-dimension rows behind it.
temperature on Opus 4.7+).n. Small n → mark deltas as indicative, not significant.Leaderboard table, arms as columns, dimensions as rows, best cell per row called out. Example shape (illustrative numbers):
╭──────────────────────┬────────────┬────────────┬────────────╮
│ metric │ baseline │ naive swap │ ModelPort │
│ │ (old/old) │ (new/old) │ (new/enh.) │
├──────────────────────┼────────────┼────────────┼────────────┤
│ task success │ 82% │ 84% │ 91% │
│ output contract │ 93% │ 89% │ 98% │
│ tool-call accuracy │ 90% │ 83% │ 96% │
│ p95 latency │ 3.9s │ 2.4s │ 2.6s │
│ cost / req │ $0.052 │ $0.047 │ $0.045 │
│ refusal / halluc. │ 2.8% │ 2.1% │ 1.4% │
├──────────────────────┼────────────┼────────────┼────────────┤
│ composite (50/30/20)│ 0.80 │ 0.83 │ 0.91 │
╰──────────────────────┴────────────┴────────────┴────────────╯
Follow the table with one line of attribution: model delta (B − A), skill delta (C − B), net (C − A).
validation-proof.mdmigration-patterns.mdmodels/