Skip to content

[skills-eval] dotnet-test: 14 skills, 37% pass β€” 1 P0, 1 P1, 6 to strengthen, 6 keepΒ #899

Description

@AbhitejJohn

πŸ”„ EDITED 2026-07-19 β€” correction per #909

This finding has been revised. The errored trials that drove the FIX-RELIABILITY (P0) flag(s) below were shown in #909 to be judge-side infrastructure failures β€” a disabled/throttled PAT (CAPIError 400 organization disabled) and Vally's session.idle judge timeout β€” not fixture nondeterminism. Verdict scores already exclude errored trials, so re-running the classifier with those judge errors dropped reclassifies the affected skill(s):

Skill Was Now
writing-mstest-tests FIX-RELIABILITY (P0) KEEP-POLISH (keep)
detect-static-dependencies FIX-RELIABILITY (P0) KEEP-POLISH (keep)

Struck-through text below is the superseded finding β€” in particular the "pin fixture SDK/tool versions" remediation does not apply. The title's P0 count has been updated. No eval re-run is required to correct the scores; recovering the lost judgments (optional) means re-judging those trials, not re-running the skill.

Context β€” cross-family skill evaluation: dotnet-test

This issue is self-contained: it captures everything a skill author needs to act on the dotnet-test plugin without opening the full report.

What this measures. Every runnable skill in dotnet/skills was run through Vally (0.7) on a cross-family matrix: 5 executor model families β€” opus-4.8, gpt-5.5, sonnet-4.6, haiku-4.5, mai-flash β€” each judged by a different family (judge β‰  executor; default judge = latest Opus, or GPT when Opus is the executor). For every skill, a skilled run is compared against a baseline (no-skill) run and scored per executor. This removes single-model and self-judging bias, so a skill that only helps one model family β€” or only its own family's judge β€” is visible.

  • Data source: cross-family CI grid (run 29228914412 + backfills) β€” 5 executors Γ— 85 runnable skills, 419 scored cells over 84 skills.
  • Row grain: one row per skill, aggregated across its (up to 5) executor cells. avgN is the mean trial count behind the cells (trials 1–17; higher = more statistically trustworthy). thin-N flags directional-only rows.

dotnet-test at a glance (portfolio scorecard)

Plugin Skills Cells Pass Impact Tie-trials Err avg Ξ”Tok avg Ξ”Turns avg Ξ”Tools Headline
dotnet-test 14 70 37% 0.336 63 3 +50,897 +0.40 +1.20 🟠 Most inert of the large plugins (63 tie-trials / 70 cells)

Insights. 14 skill(s); mean impact 0.34; 7/14 help β‰₯1 frontier model. Exemplars (win incl. frontier): mtp-hot-reload, test-tagging, generate-testability-wrappers. Weakest: migrate-static-to-wrapper (-0.04).

Address first: writing-mstest-tests β€” reliability; detect-static-dependencies β€” reliability; migrate-static-to-wrapper β€” regression; code-testing-agent β€” cost.

Address first: migrate-static-to-wrapper β€” regression; code-testing-agent β€” cost. (writing-mstest-tests and detect-static-dependencies were reclassified out of P0 β€” see EDIT above.)

How to read the table

Each skill is scored skilled vs. baseline on these axes:

Signal Column What it means Good
Breadth Families βœ“ (n/5) How many of the 5 model families the skill helps (per-family pass count, max 5/5) 4–5 / 5
Where Passed on Which families passed. Frontier = latest Opus + latest GPT are bold; Sonnet 4.6 / Haiku 4.5 / MAI Flash are mid/low-weight frontier βœ“
Magnitude Impact (βˆ’1…+1) How strongly the judge prefers skilled over baseline β‰₯ 0.4
Decisiveness Tiesβ–΅ Trials where the judge saw no difference β†’ skill is inert low
Safety Lossβ–΅ Trials where skilled was WORSE than baseline β†’ skill misfires ~0
Reliability Err Trials that errored/crashed in setup or judging 0
Efficiency Ξ”Tok / Ξ”Turns / Ξ”Tools Extra tokens / agent turns / tool calls vs baseline ≀ 0
Confidence avgN Mean trials behind the verdict; low N = directional only β‰₯ 3
Invocation Call% Share of skilled trials where the model actually invoked the skill ~100%

Families βœ“ is cell-level (max 5/5); Tiesβ–΅/Lossβ–΅ are trial-level tallies summed across all families (including the ones where the skill failed). A high Families βœ“ next to non-zero Lossβ–΅ is not a contradiction β€” see Passed on and the Action text for where losses landed.

Action buckets (each skill has one primary action; [flags] note secondary concerns):

Bucket Priority Meaning
FIX-RELIABILITY πŸ”΄ P0 Errored trials / no verdict β€” stabilize the harness before trusting the score
FIX-DISCOVERY πŸ”΄ P0 Model doesn't invoke it (Call% < 50%) β€” a triggering/description problem
FIX-REGRESSION πŸ”΄ P0 Skilled is worse than baseline on many trials β€” the skill misfires
ADD-DECISIVENESS 🟠 P1 Called ~100% but ties dominate, ~0 impact β€” inert; needs sharper behavioral steps
TRIM-COST 🟠 P1 Passes but with heavy token/turn overhead β€” trim verbosity
EXEMPLAR 🟒 keep Broad, strong, reliable win β€” use as a template
EFFICIENT-WIN 🟒 protect Wins and cuts turns/tools β€” the ideal shape
KEEP-POLISH 🟒 Solid majority win; minor polish + more trials
STRENGTHEN 🟑 P2 Marginal/mixed lift β€” sharpen triggers & success criteria

Per-skill actions

Skill Families βœ“ Passed on (frontier bold) Impact Tiesβ–΅ Lossβ–΅ Err avgN Call% Ξ”Tok Ξ”Turns Ξ”Tools Action
mtp-hot-reload 3/5 Opus, GPT, Sonnet 0.69 0 4 0 6 94% -7,703 +0.03 -0.57 EFFICIENT-WIN Β· βœ… Better and cheaper. Wins on Opus, GPT, Sonnet while saving 0.57 tools, 7,703 tok. What's good: it adds value without bloat β€” the ideal shape. Protect the brevity; don't let it grow. ([efficient])
coverage-analysis 0/5 β€” 0.64 0 0 0 3 100% +114,632 +1.93 +2.73 STRENGTHEN Β· 🟑 Marginal/mixed (passes 0/5). Diagnosis: misses both frontier models β€” likely assumes context they solve unaided. Try: (1) sharpen the trigger so it fires only where it wins; (2) add 1–2 opinionated, concrete steps that change behaviour; (3) add trials to separate signal from noise. If frontier models never benefit, scope it explicitly to weaker models or reconsider its value. ([both-frontier-miss], [costly])
test-tagging 5/5 Opus, GPT, Sonnet, Haiku, MAI 0.57 9 2 0 8 88% +17,862 -1.02 +1.3 EXEMPLAR Β· βœ… Template-worthy. What's good: broad (passes 5/5, incl. frontier Opus, GPT); cheaper (1.02 turns). Keep as-is; lift its structure (crisp triggers + imperative steps) into weaker siblings. ([efficient])
crap-score 2/5 Opus, MAI 0.41 0 2 0 3 100% +35,905 +1.27 +2.27 STRENGTHEN Β· 🟑 Marginal/mixed (passes 2/5 β€” Opus, MAI). Diagnosis: model-dependent β€” helps some families, not others. Try: (1) sharpen the trigger so it fires only where it wins; (2) add 1–2 opinionated, concrete steps that change behaviour; (3) add trials to separate signal from noise. ([frontier-miss])
writing-mstest-tests 4/5 GPT, Sonnet, Haiku, MAI 0.38 6 7 2 14.6 89% +32,537 +0.51 +0.46 FIX-RELIABILITY Β· πŸ”΄ 2 errored trial(s) β€” verdict can't be trusted until setup is deterministic. This is an infra/harness fix, not a content one: (1) capture the failing trial's stderr; (2) pin tool/SDK versions in the fixture; (3) add a setup smoke-check before scoring. ([reliability], [frontier-miss])

πŸ”„ EDIT (see #909): KEEP-POLISH Β· 🟒 Solid majority win (4/5 β€” GPT, Sonnet, Haiku, MAI); losses/ties sit in the one non-passing cell (Opus). The 2 errored trials were judge-side session.idle timeouts (haiku, sonnet46), not fixture flakiness. Raise trials on Opus; minor wording polish only. ([frontier-miss])
generate-testability-wrappers 2/5 GPT, Sonnet 0.37 1 4 0 4 90% -10,342 -2.15 -2.1 EFFICIENT-WIN Β· βœ… Better and cheaper. Wins on GPT, Sonnet while saving 2.15 turns, 2.1 tools, 10,342 tok. What's good: it adds value without bloat β€” the ideal shape. Protect the brevity; don't let it grow. ⚠️ Frontier miss on Opus β€” worth a look. ([frontier-miss], [frontier-regressed], [efficient])
run-tests 3/5 Opus, GPT, Sonnet 0.36 15 9 0 13.8 76% +131,515 +3.5 +5.26 KEEP-POLISH Β· 🟒 Solid majority win on Opus, GPT, Sonnet. Losses/ties are concentrated in the non-passing cells (Haiku, MAI), not the 3 passing ones β€” the passes are clean. To firm up: (1) raise trials on Haiku, MAI; (2) add trials on the failing families to confirm; (3) minor wording polish only. ([costly])
test-smell-detection 1/5 Sonnet 0.29 7 0 0 4 75% +25,487 -0.15 +0.7 STRENGTHEN Β· 🟑 Marginal/mixed (passes 1/5 β€” Sonnet). Diagnosis: mostly ties β€” too generic/non-prescriptive. Try: (1) sharpen the trigger so it fires only where it wins; (2) add 1–2 opinionated, concrete steps that change behaviour; (3) add trials to separate signal from noise. If frontier models never benefit, scope it explicitly to weaker models or reconsider its value. ([both-frontier-miss])
detect-static-dependencies 3/5 GPT, Sonnet, MAI 0.27 7 2 1 5.8 90% +20,012 +0.91 +1.03 FIX-RELIABILITY Β· πŸ”΄ 1 errored trial(s) β€” verdict can't be trusted until setup is deterministic. This is an infra/harness fix, not a content one: (1) capture the failing trial's stderr; (2) pin tool/SDK versions in the fixture; (3) add a setup smoke-check before scoring. ([reliability], [frontier-miss])

πŸ”„ EDIT (see #909): KEEP-POLISH Β· 🟒 Solid majority win (3/5 β€” GPT, Sonnet, MAI). The 1 errored trial was a judge-side disabled-PAT failure (haiku); this is a static-analysis skill that never builds, so a fixture SDK issue was never plausible. Investigate the Opus miss; minor polish. ([frontier-miss])
assertion-quality 1/5 Sonnet 0.25 3 6 0 4.8 80% +39,846 +1.58 +2.14 STRENGTHEN Β· 🟑 Marginal/mixed (passes 1/5 β€” Sonnet). Diagnosis: misses both frontier models β€” likely assumes context they solve unaided. Try: (1) sharpen the trigger so it fires only where it wins; (2) add 1–2 opinionated, concrete steps that change behaviour; (3) add trials to separate signal from noise. If frontier models never benefit, scope it explicitly to weaker models or reconsider its value. ([both-frontier-miss])
test-gap-analysis 1/5 Sonnet 0.23 2 4 0 4 75% -126,010 -6.3 -6.75 STRENGTHEN Β· 🟑 Marginal/mixed (passes 1/5 β€” Sonnet). Diagnosis: misses both frontier models β€” likely assumes context they solve unaided. Try: (1) sharpen the trigger so it fires only where it wins; (2) add 1–2 opinionated, concrete steps that change behaviour; (3) add trials to separate signal from noise. If frontier models never benefit, scope it explicitly to weaker models or reconsider its value. ([both-frontier-miss])
code-testing-agent 0/5 β€” 0.16 5 4 0 3.8 100% +349,643 +2.83 +5.37 TRIM-COST Β· 🟠 Passes but heavy (+349,643 tok). Value is real; cost isn't justified. Trim: (1) cut redundant/whole-file reads β€” point to specific sections; (2) replace "explore everything" with a targeted checklist; (3) move deep reference material behind links instead of inlining it. ([both-frontier-miss], [costly])
test-anti-patterns 1/5 Sonnet 0.13 6 7 0 6 100% +39,956 +1.13 +2.1 STRENGTHEN Β· 🟑 Marginal/mixed (passes 1/5 β€” Sonnet). Diagnosis: misses both frontier models β€” likely assumes context they solve unaided. Try: (1) sharpen the trigger so it fires only where it wins; (2) add 1–2 opinionated, concrete steps that change behaviour; (3) add trials to separate signal from noise. If frontier models never benefit, scope it explicitly to weaker models or reconsider its value. ([both-frontier-miss], [frontier-regressed])
migrate-static-to-wrapper 0/5 β€” -0.04 2 8 0 3 100% +49,216 +1.47 +2.8 FIX-REGRESSION Β· πŸ”΄ Retire candidate. Fails on both frontier models (Opus, GPT) and regresses (Opus, GPT, Sonnet, MAI) with non-positive impact (-0.04) across ~15 trials. A skill that makes the strongest models worse is net-negative. Strong case to remove unless a narrow, guarded rewrite (explicit stop-conditions) can be shown to stop the regressions. ([both-frontier-miss], [frontier-regressed])

⚠️ Coverage gap β€” 6 skills excluded from the cross-family run

The matrix scores a skill only if it has a tests/dotnet-test/<skill>/eval.vally.yaml. The following dotnet-test skills ship a SKILL.md but were never measured β€” so they carry zero evidence of impact (not counted in the pass rate or scorecard above):

  • Has a base eval.yaml but no eval.vally.yaml β€” add a cross-family Vally config to fold them into the matrix: filter-syntax, grade-tests
  • No eval harness at all β€” needs both eval.yaml + eval.vally.yaml: code-testing-extensions, find-untested-sources, platform-detection, test-analysis-extensions

Until these have an eval.vally.yaml, we cannot tell whether they help, hurt, or are inert. Recommended: add the cross-family eval configs and re-run so they appear in the next scorecard.


Generated from the cross-family Call-to-Action report (CALL-TO-ACTION.md Β§4–§5; companion IMPACT-ANALYSIS.md). Regenerate the underlying tables with node deep-metrics.mjs "$env:TEMP\cf-ci" agg-ci β†’ node gen-cta-tables.mjs agg-ci. Numbers are directional where avgN is low; treat single-trial cells as hypotheses to confirm with more runs.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions