Skip to content

dotnet-test: fix eval timeouts + reduce plugin skill-menu pressure for activation - #850

Merged
Evangelink merged 4 commits into
mainfrom
dev/amauryleve/dotnet-test-eval-timeout-fixes
Jul 1, 2026
Merged

dotnet-test: fix eval timeouts + reduce plugin skill-menu pressure for activation#850
Evangelink merged 4 commits into
mainfrom
dev/amauryleve/dotnet-test-eval-timeout-fixes

Conversation

@Evangelink

@Evangelink Evangelink commented Jul 1, 2026

Copy link
Copy Markdown
Member

What

Two categories of dotnet-test eval issues surfaced on the evaluation dashboard: timeouts and skill-activation failures.

1. Timeout fixes (verified: YAML valid)

Raised timeout for the 10 scenarios that most frequently hit the wall-clock limit (empty output → all assertions fail):

Skill Scenario Old → New
writing-mstest-tests Write unit tests for a service class 180 → 360
writing-mstest-tests Write data-driven tests for a calculator 180 → 360
writing-mstest-tests Use string assertions for format validation 180 → 360
writing-mstest-tests Use comparison assertions for boundary testing 120 → 240
coverage-analysis Coverage plateau diagnosis 300 → 480
coverage-analysis Project-wide coverage analysis with existing Cobertura data 300 → 480
test-gap-analysis Decline request to write new tests from scratch 120 → 300
test-gap-analysis Acknowledge well-tested code with few surviving mutations 300 → 420
run-tests Filter xUnit v3 tests by trait on MTP 120 → 240
run-tests Filter xUnit v3 tests by class pattern and trait using query filter language 120 → 240

2. Skill-activation investigation + de-crowd

I analyzed the PR #850 eval session transcripts (dotnet/skills-data) to see what the model actually did in the failing plugin-arm runs. Finding: the dominant failure is self-serve — in the crowded 16-skill plugin menu the model answers directly and loads no skill (not a sibling stealing activation, not budget truncation). Example — run-tests / Run tests in a VSTest MSTest project: isolated arm invokes the skill tool; plugin arm just reads the csproj and prints dotnet test.

The standard remedies were already applied in #800/#801/#835 (natural-language trigger phrasing, sibling DO NOT USE redirects, disable-model-invocation on the 5 reference skills, additional_required_skills, prompt observability). The remaining deterministic lever is reducing menu pressure:

  • Mark find-untested-sources disable-model-invocation: true. It's an agent-orchestrated helper (invoked by name from code-testing-researcher and the pipeline), absent from the README skill tables, and has no eval — yet it was consuming skill-menu budget and adding routing noise. It stays invocable by name.
  • This drops the plugin's rendered skill-menu cost from 14,981 → 14,261 / 15,000 (16 → 15 model-invocable skills), giving the alphabetically-later user-facing test skills more headroom. skill-validator check passes (21 skills, 10 agents, 1 plugin).

Note: the de-crowd frees budget and reduces menu noise but is not guaranteed on its own to flip the self-serve cases — those are a model-confidence problem in a large plugin menu. The eval pipeline on this PR will show the delta; deeper per-scenario description/prompt tuning should be iterated against the local validator (the approach used in #800/#801).

Several dotnet-test eval scenarios repeatedly hit their wall-clock timeout
in the evaluation dashboard (skilled + plugin arms), producing empty output
and failing all assertions. Increase per-scenario timeouts for the ones that
timed out most often across recent runs:

- writing-mstest-tests: 'Write unit tests for a service class',
  'Write data-driven tests for a calculator',
  'Use string assertions for format validation' 180->360;
  'Use comparison assertions for boundary testing' 120->240
- coverage-analysis: 'Coverage plateau diagnosis',
  'Project-wide coverage analysis with existing Cobertura data' 300->480
- test-gap-analysis: 'Decline request to write new tests from scratch' 120->300;
  'Acknowledge well-tested code with few surviving mutations' 300->420
- run-tests: 'Filter xUnit v3 tests by trait on MTP',
  'Filter xUnit v3 tests by class pattern and trait using query filter language' 120->240

Per eng/skill-validator/src/docs/InvestigatingResults.md, timeouts are the
highest-priority failure mode; code-generation scenarios often need 360s.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings July 1, 2026 10:02
@github-actions

github-actions Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Skill Coverage Report

Plugin Skill Covered Coverage
dotnet-test run-tests 16/16 100%
dotnet-test test-gap-analysis 24/24 100%
dotnet-test writing-mstest-tests 45/45 100%

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adjusts evaluation configuration for the dotnet-test plugin by increasing per-scenario wall-clock timeout values in selected eval suites, targeting scenarios that frequently time out and therefore produce empty output and cascading assertion failures.

Changes:

  • Increased timeouts for 4 writing-mstest-tests scenarios (up to 360s / 240s).
  • Increased timeouts for 2 coverage-analysis scenarios (to 480s).
  • Increased timeouts for 2 test-gap-analysis scenarios and 2 run-tests scenarios (up to 420s / 300s / 240s).
Show a summary per file
File Description
tests/dotnet-test/writing-mstest-tests/eval.yaml Raises timeouts for 4 MSTest-writing scenarios to reduce chronic wall-clock timeouts.
tests/dotnet-test/test-gap-analysis/eval.yaml Raises timeouts for 2 gap-analysis scenarios to avoid empty-output runs.
tests/dotnet-test/run-tests/eval.yaml Raises timeouts for 2 xUnit v3 filtering scenarios (MTP/query filter) to improve completion rates.
tests/dotnet-test/coverage-analysis/eval.yaml Raises timeouts for 2 coverage-analysis scenarios to accommodate heavier analysis steps.

Copilot's findings

Tip

Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

  • Files reviewed: 4/4 changed files
  • Comments generated: 0

@Evangelink

Copy link
Copy Markdown
Member Author

/evaluate

@Evangelink
Evangelink enabled auto-merge (squash) July 1, 2026 10:12
github-actions Bot added a commit that referenced this pull request Jul 1, 2026
@github-actions

github-actions Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Skill Validation Results

Skill Scenario Quality Skills Loaded Overfit Verdict
run-tests Run tests in a VSTest MSTest project 4.0/5 → 5.0/5 🟢 ✅ run-tests; tools: skill, bash, glob / ⚠️ NOT ACTIVATED ✅ 0.13 [1]
run-tests Run tests with trx reporting on MTP project (SDK 9) 2.0/5 → 5.0/5 🟢 ✅ run-tests; tools: skill ✅ 0.13
run-tests Run tests with blame-hang on MTP project (SDK 10) 2.7/5 → 4.0/5 🟢 ⚠️ NOT ACTIVATED / ✅ run-tests; tools: skill ✅ 0.13 [2]
run-tests Run tests on a specific TFM with TRX in a multi-TFM MTP project (SDK 9) 5.0/5 → 5.0/5 ✅ run-tests; tools: skill ✅ 0.13 [3]
run-tests Filter MSTest tests by category on VSTest 5.0/5 → 5.0/5 ⚠️ NOT ACTIVATED / ✅ run-tests; tools: skill ✅ 0.13 [4]
run-tests Filter NUnit tests by class name on VSTest 3.0/5 → 5.0/5 🟢 ✅ run-tests; tools: skill, view, bash / ⚠️ NOT ACTIVATED ✅ 0.13 [5]
run-tests Filter xUnit v3 tests by class on MTP 1.0/5 → 5.0/5 🟢 ✅ run-tests; tools: skill, view ✅ 0.13
run-tests Filter xUnit v3 tests by trait on MTP 1.0/5 → 5.0/5 🟢 ✅ run-tests; tools: skill, view / ⚠️ NOT ACTIVATED ✅ 0.13 [6]
run-tests Filter xUnit v3 tests by class pattern and trait using query filter language 1.0/5 → 2.3/5 ⏰ 🟢 ✅ run-tests; tools: report_intent, view, skill, bash, web_fetch / ⚠️ NOT ACTIVATED ✅ 0.13 [7]
run-tests Filter TUnit tests by class using treenode-filter 2.7/5 → 4.0/5 🟢 ⚠️ NOT ACTIVATED ✅ 0.13 [8]
run-tests Combine multiple filter criteria on VSTest MSTest 4.3/5 → 5.0/5 🟢 ✅ run-tests; tools: report_intent, skill, view ✅ 0.13 [9]
run-tests MTP project on SDK 9 must use -- separator for args 1.0/5 → 3.0/5 🟢 ⚠️ NOT ACTIVATED ✅ 0.13 [10]
run-tests MTP project on SDK 10 passes args directly 4.3/5 → 4.0/5 🔴 ⚠️ NOT ACTIVATED ✅ 0.13 [11]
run-tests Detect test platform from Directory.Build.props 1.3/5 → 5.0/5 🟢 ✅ run-tests; tools: skill / ⚠️ NOT ACTIVATED ✅ 0.13 [12]
run-tests Negative test: do not use MTP syntax for a VSTest project 4.7/5 → 3.7/5 🔴 ✅ run-tests; tools: skill, view / ⚠️ NOT ACTIVATED ✅ 0.13 [13]
coverage-analysis Project-wide coverage analysis with existing Cobertura data 2.3/5 → 4.7/5 🟢 ✅ coverage-analysis; tools: skill, bash, create 🟡 0.23
coverage-analysis Run coverage from scratch without existing data 4.0/5 → 5.0/5 🟢 ✅ coverage-analysis; tools: skill, create / ✅ coverage-analysis; tools: skill, create, glob 🟡 0.23
coverage-analysis Coverage plateau diagnosis 3.3/5 → 4.3/5 🟢 ✅ coverage-analysis; tools: skill, bash, create, read_bash, stop_bash / ✅ coverage-analysis; tools: skill, bash, create, glob 🟡 0.23
writing-mstest-tests Write unit tests for a service class 4.0/5 → 4.3/5 🟢 ✅ writing-mstest-tests; tools: skill, glob / ✅ writing-mstest-tests; tools: skill, glob, bash, edit 🟡 0.36 [14]
writing-mstest-tests Write data-driven tests for a calculator 3.3/5 → 4.7/5 🟢 ✅ writing-mstest-tests; tools: skill, report_intent, view / ✅ writing-mstest-tests; tools: skill, report_intent, glob, view 🟡 0.36
writing-mstest-tests Write async tests with cancellation 3.0/5 → 5.0/5 🟢 ✅ writing-mstest-tests; tools: skill / ✅ writing-mstest-tests; tools: report_intent, skill 🟡 0.36
writing-mstest-tests Fix swapped Assert.AreEqual arguments 5.0/5 → 5.0/5 ⚠️ NOT ACTIVATED 🟡 0.36 [15]
writing-mstest-tests Modernize legacy test patterns 4.0/5 → 5.0/5 🟢 ✅ writing-mstest-tests; tools: skill / ⚠️ NOT ACTIVATED 🟡 0.36 [16]
writing-mstest-tests Replace ExpectedException with Assert.Throws 3.0/5 → 4.0/5 🟢 ✅ writing-mstest-tests; tools: skill / ✅ writing-mstest-tests; tools: report_intent, skill 🟡 0.36 [17]
writing-mstest-tests Use proper collection assertions 3.0/5 → 2.3/5 🔴 ✅ writing-mstest-tests; tools: skill / ⚠️ NOT ACTIVATED 🟡 0.36 [18]
writing-mstest-tests Use proper type assertions instead of casts 3.7/5 → 5.0/5 🟢 ✅ writing-mstest-tests; tools: skill, report_intent / ⚠️ NOT ACTIVATED 🟡 0.36 [19]
writing-mstest-tests Set up test lifecycle correctly 2.3/5 → 4.0/5 🟢 ✅ writing-mstest-tests; tools: skill, report_intent, view / ✅ writing-mstest-tests; tools: report_intent, skill 🟡 0.36
writing-mstest-tests Use DynamicData with ValueTuples over object arrays 3.0/5 → 3.7/5 🟢 ✅ writing-mstest-tests; tools: skill / ✅ writing-mstest-tests; tools: report_intent, skill 🟡 0.36 [20]
writing-mstest-tests Use string assertions for format validation 3.3/5 → 4.0/5 🟢 ✅ writing-mstest-tests; tools: skill, view, glob, bash, edit / ✅ writing-mstest-tests; tools: skill, bash, edit, view 🟡 0.36 [21]
writing-mstest-tests Use comparison assertions for boundary testing 2.7/5 → 4.0/5 🟢 ✅ writing-mstest-tests; tools: skill / ✅ writing-mstest-tests; tools: report_intent, skill 🟡 0.36
writing-mstest-tests Write tests with collection, null, and reference assertions 3.7/5 → 4.0/5 🟢 ✅ writing-mstest-tests; tools: skill, glob / ✅ writing-mstest-tests; tools: glob, skill 🟡 0.36
writing-mstest-tests Configure conditional execution, retry, and cleanup 2.7/5 → 4.3/5 🟢 ✅ writing-mstest-tests; tools: report_intent, skill 🟡 0.36
writing-mstest-tests Configure test parallelization and MSTest.Sdk project 3.0/5 → 5.0/5 🟢 ✅ writing-mstest-tests; tools: skill 🟡 0.36
test-gap-analysis Find boundary mutation gaps in tiered discount and shipping logic 4.7/5 → 5.0/5 🟢 ✅ test-gap-analysis; tools: skill ✅ 0.14 [22]
test-gap-analysis Find logic and null-check mutation gaps in access control code 4.7/5 → 5.0/5 🟢 ✅ test-gap-analysis; tools: skill ✅ 0.14 [23]
test-gap-analysis Acknowledge well-tested code with few surviving mutations 4.3/5 → 3.7/5 🔴 ✅ test-gap-analysis; tools: skill ✅ 0.14 [24]
test-gap-analysis Decline request to write new tests from scratch 3.7/5 → 3.7/5 ℹ️ not activated (expected) ✅ 0.14 [25]
test-gap-analysis Produce a risk-prioritized report that excludes trivial and generated code 3.7/5 → 4.3/5 🟢 ✅ test-gap-analysis; tools: skill ✅ 0.14 [26]
test-gap-analysis Flag the Rust ? operator propagation as an unobserved mutation point 4.3/5 → 4.7/5 🟢 ✅ test-gap-analysis; tools: skill ✅ 0.14 [27]

[1] ⚠️ High run-to-run variance (CV=128%) — consider re-running with --runs 5. (Plugin) Quality unchanged but weighted score is -2.2% due to: tokens (25253 → 34837)
[2] ⚠️ High run-to-run variance (CV=178%) — consider re-running with --runs 5. (Isolated) Quality improved but weighted score is -1.9% due to: tool calls (2 → 3)
[3] (Plugin) Quality unchanged but weighted score is -8.3% due to: tokens (25433 → 63086), tool calls (2 → 4), time (15.6s → 20.4s)
[4] ⚠️ High run-to-run variance (CV=109%) — consider re-running with --runs 5
[5] ⚠️ High run-to-run variance (CV=333%) — consider re-running with --runs 5. (Plugin) Quality improved but weighted score is -13.2% due to: judgment, tool calls (1 → 2), tokens (24943 → 35013), time (7.8s → 10.0s)
[6] ⚠️ High run-to-run variance (CV=210%) — consider re-running with --runs 5. (Plugin) Quality unchanged but weighted score is -0.9% due to: tokens (34083 → 39799)
[7] ⚠️ High run-to-run variance (CV=400%) — consider re-running with --runs 5. (Plugin) Quality unchanged but weighted score is -0.6% due to: tokens (12579 → 17397)
[8] ⚠️ High run-to-run variance (CV=47194%) — consider re-running with --runs 5
[9] ⚠️ High run-to-run variance (CV=392%) — consider re-running with --runs 5
[10] ⚠️ High run-to-run variance (CV=69%) — consider re-running with --runs 5
[11] ⚠️ High run-to-run variance (CV=50%) — consider re-running with --runs 5
[12] ⚠️ High run-to-run variance (CV=542%) — consider re-running with --runs 5. (Plugin) Quality unchanged but weighted score is -2.7% due to: tokens (44949 → 67773)
[13] ⚠️ High run-to-run variance (CV=159%) — consider re-running with --runs 5
[14] ⚠️ High run-to-run variance (CV=209%) — consider re-running with --runs 5. (Isolated) Quality improved but weighted score is -7.8% due to: judgment
[15] (Plugin) Quality unchanged but weighted score is -2.8% due to: tokens (12757 → 17580), time (14.2s → 19.2s)
[16] ⚠️ High run-to-run variance (CV=202%) — consider re-running with --runs 5
[17] ⚠️ High run-to-run variance (CV=73%) — consider re-running with --runs 5
[18] ⚠️ High run-to-run variance (CV=62%) — consider re-running with --runs 5
[19] ⚠️ High run-to-run variance (CV=140%) — consider re-running with --runs 5
[20] ⚠️ High run-to-run variance (CV=537%) — consider re-running with --runs 5
[21] ⚠️ High run-to-run variance (CV=67%) — consider re-running with --runs 5
[22] ⚠️ High run-to-run variance (CV=2877%) — consider re-running with --runs 5
[23] ⚠️ High run-to-run variance (CV=1186%) — consider re-running with --runs 5
[24] ⚠️ High run-to-run variance (CV=382%) — consider re-running with --runs 5
[25] ⚠️ High run-to-run variance (CV=2272%) — consider re-running with --runs 5
[26] ⚠️ High run-to-run variance (CV=71%) — consider re-running with --runs 5
[27] ⚠️ High run-to-run variance (CV=111%) — consider re-running with --runs 5

timeout — run(s) hit the (240s) scenario timeout limit; scoring may be impacted by aborting model execution before it could produce its full output (increase via timeout in eval.yaml)

Model: claude-opus-4.6 | Judge: claude-opus-4.6

🔍 Full Results - additional metrics and failure investigation steps

To investigate failures, paste this to your AI coding agent:

For PR 850 in dotnet/skills, download eval artifacts with gh run download 28509736275 --repo dotnet/skills --pattern "skill-validator-results-*" --dir ./eval-results, then fetch https://raw.githubusercontent.com/dotnet/skills/7699a5feb0c7de0b4bcbe9108a8450c61c6bbe2e/eng/skill-validator/src/docs/InvestigatingResults.md and follow it to analyze the results.json files. Diagnose each failure, suggest fixes to the eval.yaml and skill content, and tell me what to fix first.

▶ Sessions Visualisation -- interactive replay of all evaluation sessions
📊 Session Analytics (preview) -- aggregated metrics across evaluation sessions

Skill-activation investigation of the dotnet-test plugin arm (using the
PR #850 eval session transcripts) showed the dominant failure mode is
'self-serve': in the crowded 16-skill plugin menu the model answers
directly and loads no skill, rather than a sibling stealing activation or
a budget cutoff. #800/#801/#835 already applied the standard remedies
(trigger-phrasing, sibling deflection, DMI on the reference skills,
additional_required_skills), so the remaining lever is reducing menu
pressure.

find-untested-sources is an agent-orchestrated helper: it is invoked by
name from code-testing-researcher and the code-testing pipeline, is not
listed in the plugin README's skill tables, and has no eval — yet it was
still consuming the model-facing skill-menu budget and adding routing
noise. Mark it disable-model-invocation: true (it stays invocable by
name). This drops the plugin's rendered skill-menu cost from 14,981 to
14,261 of the 15,000-char budget (16 -> 15 model-invocable skills),
giving the alphabetically-later user-facing test skills more headroom.

skill-validator check passes (all 21 skills, 10 agents, 1 plugin).

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@Evangelink Evangelink changed the title dotnet-test: raise timeouts for chronic-timeout eval scenarios dotnet-test: fix eval timeouts + reduce plugin skill-menu pressure for activation Jul 1, 2026
@Evangelink

Copy link
Copy Markdown
Member Author

/evaluate

@github-actions

github-actions Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Skill Validation Results

Skill Scenario Quality Skills Loaded Overfit Verdict
run-tests Run tests in a VSTest MSTest project 4.0/5 → 5.0/5 🟢 ✅ run-tests; tools: skill, bash / ⚠️ NOT ACTIVATED ✅ 0.14 [1]
run-tests Run tests with trx reporting on MTP project (SDK 9) 2.0/5 → 5.0/5 🟢 ✅ run-tests; tools: skill ✅ 0.14
run-tests Run tests with blame-hang on MTP project (SDK 10) 2.7/5 → 3.7/5 🟢 ⚠️ NOT ACTIVATED / ✅ run-tests; tools: skill ✅ 0.14 [2]
run-tests Run tests on a specific TFM with TRX in a multi-TFM MTP project (SDK 9) 5.0/5 → 5.0/5 ✅ run-tests; tools: skill ✅ 0.14 [3]
run-tests Filter MSTest tests by category on VSTest 5.0/5 → 5.0/5 ⚠️ NOT ACTIVATED / ✅ run-tests; tools: skill ✅ 0.14 [4]
run-tests Filter NUnit tests by class name on VSTest 3.0/5 → 5.0/5 🟢 ✅ run-tests; tools: skill, view, bash / ✅ run-tests; tools: skill, view ✅ 0.14
run-tests Filter xUnit v3 tests by class on MTP 1.0/5 → 5.0/5 🟢 ✅ run-tests; tools: skill, view ✅ 0.14 [5]
run-tests Filter xUnit v3 tests by trait on MTP 1.0/5 → 5.0/5 🟢 ✅ run-tests; tools: skill, view / ⚠️ NOT ACTIVATED ✅ 0.14 [6]
run-tests Filter xUnit v3 tests by class pattern and trait using query filter language 1.0/5 → 1.3/5 🟢 ⚠️ NOT ACTIVATED ✅ 0.14 [7]
run-tests Filter TUnit tests by class using treenode-filter 3.0/5 → 4.0/5 🟢 ⚠️ NOT ACTIVATED ✅ 0.14 [8]
run-tests Combine multiple filter criteria on VSTest MSTest 4.0/5 → 4.7/5 🟢 ✅ run-tests; tools: skill, bash, report_intent, view / ✅ run-tests; tools: skill, report_intent, view, bash ✅ 0.14 [9]
run-tests MTP project on SDK 9 must use -- separator for args 1.0/5 → 2.7/5 🟢 ⚠️ NOT ACTIVATED ✅ 0.14
run-tests MTP project on SDK 10 passes args directly 1.3/5 → 4.7/5 🟢 ✅ run-tests; tools: skill / ⚠️ NOT ACTIVATED ✅ 0.14
run-tests Detect test platform from Directory.Build.props 1.3/5 → 5.0/5 🟢 ✅ run-tests; tools: skill / ⚠️ NOT ACTIVATED ✅ 0.14 [10]
run-tests Negative test: do not use MTP syntax for a VSTest project 4.3/5 → 5.0/5 🟢 ✅ run-tests; tools: skill, view / ⚠️ NOT ACTIVATED ✅ 0.14 [11]
coverage-analysis Project-wide coverage analysis with existing Cobertura data 2.0/5 → 5.0/5 🟢 ✅ coverage-analysis; tools: skill, bash, create ✅ 0.10
coverage-analysis Run coverage from scratch without existing data 4.0/5 → 5.0/5 🟢 ✅ coverage-analysis; tools: skill, glob, create ✅ 0.10
coverage-analysis Coverage plateau diagnosis 3.0/5 → 4.3/5 🟢 ✅ coverage-analysis; tools: skill, bash, create, view ✅ 0.10
writing-mstest-tests Write unit tests for a service class 4.0/5 → 4.0/5 ✅ writing-mstest-tests; tools: skill, glob 🟡 0.34 [12]
writing-mstest-tests Write data-driven tests for a calculator 3.3/5 → 5.0/5 🟢 ✅ writing-mstest-tests; tools: skill, report_intent / ✅ writing-mstest-tests; tools: skill, glob, report_intent, bash, view 🟡 0.34
writing-mstest-tests Write async tests with cancellation 3.0/5 → 5.0/5 🟢 ✅ writing-mstest-tests; tools: skill / ✅ writing-mstest-tests; tools: report_intent, skill 🟡 0.34
writing-mstest-tests Fix swapped Assert.AreEqual arguments 5.0/5 → 5.0/5 ⚠️ NOT ACTIVATED 🟡 0.34 [13]
writing-mstest-tests Modernize legacy test patterns 4.7/5 → 5.0/5 🟢 ✅ writing-mstest-tests; tools: skill / ⚠️ NOT ACTIVATED 🟡 0.34 [14]
writing-mstest-tests Replace ExpectedException with Assert.Throws 3.0/5 → 4.7/5 🟢 ✅ writing-mstest-tests; tools: skill / ✅ writing-mstest-tests; tools: skill, report_intent 🟡 0.34
writing-mstest-tests Use proper collection assertions 3.0/5 → 2.3/5 🔴 ✅ writing-mstest-tests; tools: skill / ✅ writing-mstest-tests; tools: report_intent, skill 🟡 0.34 [15]
writing-mstest-tests Use proper type assertions instead of casts 4.0/5 → 4.7/5 🟢 ✅ writing-mstest-tests; tools: skill 🟡 0.34 [16]
writing-mstest-tests Set up test lifecycle correctly 2.3/5 → 4.0/5 🟢 ✅ writing-mstest-tests; tools: skill, report_intent, view 🟡 0.34
writing-mstest-tests Use DynamicData with ValueTuples over object arrays 3.0/5 → 4.3/5 🟢 ✅ writing-mstest-tests; tools: skill / ✅ writing-mstest-tests; tools: skill, report_intent 🟡 0.34 [17]
writing-mstest-tests Use string assertions for format validation 3.3/5 → 4.3/5 🟢 ✅ writing-mstest-tests; tools: skill, bash, edit, view / ✅ writing-mstest-tests; tools: skill, view, glob, bash, edit 🟡 0.34
writing-mstest-tests Use comparison assertions for boundary testing 2.3/5 → 4.0/5 🟢 ✅ writing-mstest-tests; tools: skill / ✅ writing-mstest-tests; tools: report_intent, skill 🟡 0.34
writing-mstest-tests Write tests with collection, null, and reference assertions 3.3/5 → 3.7/5 🟢 ✅ writing-mstest-tests; tools: skill, glob 🟡 0.34
writing-mstest-tests Configure conditional execution, retry, and cleanup 2.3/5 → 4.3/5 🟢 ✅ writing-mstest-tests; tools: report_intent, skill 🟡 0.34
writing-mstest-tests Configure test parallelization and MSTest.Sdk project 3.0/5 → 5.0/5 🟢 ✅ writing-mstest-tests; tools: skill 🟡 0.34
test-gap-analysis Find boundary mutation gaps in tiered discount and shipping logic 5.0/5 → 5.0/5 ✅ test-gap-analysis; tools: skill ✅ 0.14 [18]
test-gap-analysis Find logic and null-check mutation gaps in access control code 4.7/5 → 5.0/5 🟢 ✅ test-gap-analysis; tools: skill, bash / ✅ test-gap-analysis; tools: skill ✅ 0.14 [19]
test-gap-analysis Acknowledge well-tested code with few surviving mutations 4.0/5 → 3.0/5 🔴 ✅ test-gap-analysis; tools: skill ✅ 0.14 [20]
test-gap-analysis Decline request to write new tests from scratch 4.0/5 → 4.0/5 ℹ️ not activated (expected) ✅ 0.14
test-gap-analysis Produce a risk-prioritized report that excludes trivial and generated code 3.7/5 → 4.3/5 🟢 ✅ test-gap-analysis; tools: skill ✅ 0.14
test-gap-analysis Flag the Rust ? operator propagation as an unobserved mutation point 5.0/5 → 5.0/5 ✅ test-gap-analysis; tools: skill ✅ 0.14 [21]

[1] (Plugin) Quality unchanged but weighted score is -2.1% due to: tokens (25247 → 34588)
[2] ⚠️ High run-to-run variance (CV=222%) — consider re-running with --runs 5. (Plugin) Quality improved but weighted score is -17.7% due to: judgment, tokens (25295 → 61599), time (14.4s → 22.8s), tool calls (2 → 3)
[3] ⚠️ High run-to-run variance (CV=57%) — consider re-running with --runs 5. (Plugin) Quality unchanged but weighted score is -5.5% due to: tokens (25433 → 45777), tool calls (2 → 3)
[4] (Plugin) Quality unchanged but weighted score is -8.5% due to: tokens (25428 → 62810), tool calls (2 → 4), time (14.5s → 20.4s)
[5] ⚠️ High run-to-run variance (CV=93%) — consider re-running with --runs 5
[6] ⚠️ High run-to-run variance (CV=250%) — consider re-running with --runs 5. (Plugin) Quality unchanged but weighted score is -0.8% due to: tokens (33927 → 39272)
[7] ⚠️ High run-to-run variance (CV=95%) — consider re-running with --runs 5. (Plugin) Quality unchanged but weighted score is -1.3% due to: tokens (12593 → 17265)
[8] ⚠️ High run-to-run variance (CV=291%) — consider re-running with --runs 5
[9] ⚠️ High run-to-run variance (CV=180%) — consider re-running with --runs 5
[10] ⚠️ High run-to-run variance (CV=219%) — consider re-running with --runs 5. (Plugin) Quality unchanged but weighted score is -0.6% due to: tokens (54667 → 66868)
[11] ⚠️ High run-to-run variance (CV=120%) — consider re-running with --runs 5
[12] (Isolated) Quality unchanged but weighted score is -9.2% due to: judgment, quality
[13] (Plugin) Quality unchanged but weighted score is -2.0% due to: tokens (12710 → 17455)
[14] ⚠️ High run-to-run variance (CV=222%) — consider re-running with --runs 5. (Isolated) Quality improved but weighted score is -3.3% due to: tokens (161375 → 285402), tool calls (12 → 16), time (79.3s → 98.6s)
[15] ⚠️ High run-to-run variance (CV=67%) — consider re-running with --runs 5
[16] ⚠️ High run-to-run variance (CV=7372%) — consider re-running with --runs 5
[17] ⚠️ High run-to-run variance (CV=222%) — consider re-running with --runs 5. (Isolated) Quality improved but weighted score is -9.1% due to: tokens (12775 → 31016), tool calls (0 → 1), time (7.3s → 12.1s)
[18] ⚠️ High run-to-run variance (CV=1019%) — consider re-running with --runs 5. (Isolated) Quality unchanged but weighted score is -8.2% due to: judgment, quality
[19] ⚠️ High run-to-run variance (CV=224%) — consider re-running with --runs 5
[20] ⚠️ High run-to-run variance (CV=89%) — consider re-running with --runs 5
[21] ⚠️ High run-to-run variance (CV=68%) — consider re-running with --runs 5

Model: claude-opus-4.6 | Judge: claude-opus-4.6

🔍 Full Results - additional metrics and failure investigation steps

To investigate failures, paste this to your AI coding agent:

For PR 850 in dotnet/skills, download eval artifacts with gh run download 28513121637 --repo dotnet/skills --pattern "skill-validator-results-*" --dir ./eval-results, then fetch https://raw.githubusercontent.com/dotnet/skills/9d9a677c0e074115f1c8399105af43292b1b2872/eng/skill-validator/src/docs/InvestigatingResults.md and follow it to analyze the results.json files. Diagnose each failure, suggest fixes to the eval.yaml and skill content, and tell me what to fix first.

github-actions Bot added a commit that referenced this pull request Jul 1, 2026
@github-actions github-actions Bot added the waiting-on-review PR state label label Jul 1, 2026
@github-actions

github-actions Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

✅ Evaluation passed for 9d9a677. cc @dotnet/dotnet-testing — please review.

…ion assertions

The 'Use proper collection assertions' scenario regressed hard in both eval
arms (isolated -0.31, plugin -0.38) even though the skill activated and
produced correct output. Root cause is a judge knowledge gap, not a skill
bug: the pairwise judge (claude-opus-4.6) marked the skill's Assert.IsNotEmpty,
Assert.HasCount, and Assert.ContainsSingle as 'fabricated / non-existent MSTest
methods' and favored the baseline's Assert.AreEqual(3, x.Count) plus the
genuinely-fake CollectionAssert.That.IsNotEmpty.

Those three ARE real MSTest 3.8+ assertion APIs (Microsoft.Testing modern
assertions; verified against Microsoft Learn and the MSTest 3.8 release notes),
and are exactly what the writing-mstest-tests skill teaches — so the skill's
output was more correct than the baseline it lost to.

Clarify the scenario rubric to name these real MSTest 3.8+ methods as valid
answers and add an explicit grading note that Assert.IsNotEmpty/IsEmpty/HasCount/
ContainsSingle/Contains/DoesNotContain must not be penalized as non-existent.
This is the doc-recommended remedy for 'rubric penalizes valid alternatives'
(eng/skill-validator/src/docs/InvestigatingResults.md, pattern #6); the skill
content is unchanged.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings July 1, 2026 11:36

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 5/5 changed files
  • Comments generated: 0 new

@github-actions github-actions Bot added pr-state/ready-for-eval PR is mergeable and awaiting evaluation and removed waiting-on-review PR state label labels Jul 1, 2026
@Evangelink

Copy link
Copy Markdown
Member Author

/evaluate

github-actions Bot added a commit that referenced this pull request Jul 1, 2026
@github-actions

github-actions Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Skill Validation Results

Skill Scenario Quality Skills Loaded Overfit Verdict
run-tests Run tests in a VSTest MSTest project 3.7/5 → 5.0/5 🟢 ✅ run-tests; tools: skill, bash / ⚠️ NOT ACTIVATED ✅ 0.16 [1]
run-tests Run tests with trx reporting on MTP project (SDK 9) 2.0/5 → 5.0/5 🟢 ✅ run-tests; tools: skill, report_intent, view ✅ 0.16
run-tests Run tests with blame-hang on MTP project (SDK 10) 2.7/5 → 4.0/5 🟢 ⚠️ NOT ACTIVATED / ✅ run-tests; tools: skill ✅ 0.16 [2]
run-tests Run tests on a specific TFM with TRX in a multi-TFM MTP project (SDK 9) 5.0/5 → 5.0/5 ⚠️ NOT ACTIVATED / ✅ run-tests; tools: skill ✅ 0.16 [3]
run-tests Filter MSTest tests by category on VSTest 5.0/5 → 5.0/5 ⚠️ NOT ACTIVATED / ✅ run-tests; tools: skill, bash ✅ 0.16 [4]
run-tests Filter NUnit tests by class name on VSTest 3.0/5 → 5.0/5 🟢 ✅ run-tests; tools: skill, view, bash / ⚠️ NOT ACTIVATED ✅ 0.16 [5]
run-tests Filter xUnit v3 tests by class on MTP 1.0/5 → 3.7/5 🟢 ✅ run-tests; tools: skill, view / ✅ run-tests; tools: view, skill ✅ 0.16 [6]
run-tests Filter xUnit v3 tests by trait on MTP 1.0/5 → 5.0/5 🟢 ✅ run-tests; tools: skill, view / ⚠️ NOT ACTIVATED ✅ 0.16 [7]
run-tests Filter xUnit v3 tests by class pattern and trait using query filter language 1.0/5 → 1.0/5 ⚠️ NOT ACTIVATED ✅ 0.16 [8]
run-tests Filter TUnit tests by class using treenode-filter 3.0/5 → 3.0/5 ⚠️ NOT ACTIVATED ✅ 0.16 [9]
run-tests Combine multiple filter criteria on VSTest MSTest 4.7/5 → 4.7/5 ✅ run-tests; tools: skill, bash / ✅ run-tests; tools: skill ✅ 0.16 [10]
run-tests MTP project on SDK 9 must use -- separator for args 1.0/5 → 3.7/5 🟢 ⚠️ NOT ACTIVATED ✅ 0.16 [11]
run-tests MTP project on SDK 10 passes args directly 2.0/5 → 4.3/5 🟢 ✅ run-tests; tools: skill / ⚠️ NOT ACTIVATED ✅ 0.16 [12]
run-tests Detect test platform from Directory.Build.props 1.0/5 → 5.0/5 🟢 ✅ run-tests; tools: skill / ⚠️ NOT ACTIVATED ✅ 0.16 [13]
run-tests Negative test: do not use MTP syntax for a VSTest project 4.0/5 → 5.0/5 🟢 ✅ run-tests; tools: skill, view / ⚠️ NOT ACTIVATED ✅ 0.16 [14]
coverage-analysis Project-wide coverage analysis with existing Cobertura data 2.7/5 → 4.7/5 🟢 ✅ coverage-analysis; tools: skill, view, create, bash ✅ 0.10
coverage-analysis Run coverage from scratch without existing data 4.0/5 → 5.0/5 🟢 ✅ coverage-analysis; tools: skill, create / ✅ coverage-analysis; tools: skill, glob, create ✅ 0.10
coverage-analysis Coverage plateau diagnosis 3.3/5 → 5.0/5 🟢 ✅ coverage-analysis; tools: skill, bash, create, view ✅ 0.10 [15]
writing-mstest-tests Write unit tests for a service class 5.0/5 → 4.3/5 🔴 ✅ writing-mstest-tests; tools: skill, glob 🟡 0.32
writing-mstest-tests Write data-driven tests for a calculator 3.7/5 → 5.0/5 🟢 ✅ writing-mstest-tests; tools: skill, report_intent, view, glob / ✅ writing-mstest-tests; tools: skill, report_intent, glob, view 🟡 0.32 [16]
writing-mstest-tests Write async tests with cancellation 3.3/5 → 5.0/5 🟢 ✅ writing-mstest-tests; tools: skill / ✅ writing-mstest-tests; tools: skill, report_intent 🟡 0.32 [17]
writing-mstest-tests Fix swapped Assert.AreEqual arguments 5.0/5 → 5.0/5 ⚠️ NOT ACTIVATED 🟡 0.32 [18]
writing-mstest-tests Modernize legacy test patterns 4.3/5 → 4.7/5 🟢 ✅ writing-mstest-tests; tools: skill / ⚠️ NOT ACTIVATED 🟡 0.32 [19]
writing-mstest-tests Replace ExpectedException with Assert.Throws 3.0/5 → 3.0/5 ✅ writing-mstest-tests; tools: skill / ✅ writing-mstest-tests; tools: skill, report_intent 🟡 0.32 [20]
writing-mstest-tests Use proper collection assertions 3.0/5 → 4.3/5 🟢 ✅ writing-mstest-tests; tools: skill / ✅ writing-mstest-tests; tools: report_intent, skill 🟡 0.32
writing-mstest-tests Use proper type assertions instead of casts 4.0/5 → 4.7/5 🟢 ✅ writing-mstest-tests; tools: skill 🟡 0.32
writing-mstest-tests Set up test lifecycle correctly 2.0/5 → 4.0/5 🟢 ✅ writing-mstest-tests; tools: report_intent, skill, view 🟡 0.32
writing-mstest-tests Use DynamicData with ValueTuples over object arrays 3.0/5 → 4.3/5 🟢 ✅ writing-mstest-tests; tools: skill / ✅ writing-mstest-tests; tools: skill, report_intent 🟡 0.32 [21]
writing-mstest-tests Use string assertions for format validation 3.7/5 → 5.0/5 🟢 ✅ writing-mstest-tests; tools: skill, view, bash, edit / ✅ writing-mstest-tests; tools: skill, view, glob, bash, edit 🟡 0.32 [22]
writing-mstest-tests Use comparison assertions for boundary testing 2.7/5 → 4.7/5 🟢 ✅ writing-mstest-tests; tools: skill / ✅ writing-mstest-tests; tools: report_intent, skill 🟡 0.32
writing-mstest-tests Write tests with collection, null, and reference assertions 3.7/5 → 3.7/5 ✅ writing-mstest-tests; tools: skill / ✅ writing-mstest-tests; tools: skill, glob 🟡 0.32 [23]
writing-mstest-tests Configure conditional execution, retry, and cleanup 2.7/5 → 4.3/5 🟢 ✅ writing-mstest-tests; tools: report_intent, skill 🟡 0.32
writing-mstest-tests Configure test parallelization and MSTest.Sdk project 3.0/5 → 5.0/5 🟢 ✅ writing-mstest-tests; tools: skill 🟡 0.32
test-gap-analysis Find boundary mutation gaps in tiered discount and shipping logic 5.0/5 → 5.0/5 ✅ test-gap-analysis; tools: skill ✅ 0.12
test-gap-analysis Find logic and null-check mutation gaps in access control code 4.0/5 → 5.0/5 🟢 ✅ test-gap-analysis; tools: skill, bash / ✅ test-gap-analysis; tools: skill ✅ 0.12
test-gap-analysis Acknowledge well-tested code with few surviving mutations 4.0/5 → 4.0/5 ✅ test-gap-analysis; tools: skill ✅ 0.12 [24]
test-gap-analysis Decline request to write new tests from scratch 3.7/5 → 4.0/5 🟢 ℹ️ not activated (expected) ✅ 0.12 [25]
test-gap-analysis Produce a risk-prioritized report that excludes trivial and generated code 3.7/5 → 4.3/5 🟢 ✅ test-gap-analysis; tools: skill ✅ 0.12
test-gap-analysis Flag the Rust ? operator propagation as an unobserved mutation point 4.3/5 → 5.0/5 🟢 ✅ test-gap-analysis; tools: skill ✅ 0.12 [26]

[1] ⚠️ High run-to-run variance (CV=332%) — consider re-running with --runs 5. (Plugin) Quality improved but weighted score is -3.0% due to: tokens (25186 → 34608), time (11.3s → 16.1s)
[2] ⚠️ High run-to-run variance (CV=218%) — consider re-running with --runs 5. (Isolated) Quality improved but weighted score is -23.6% due to: judgment, quality, tool calls (2 → 3)
[3] ⚠️ High run-to-run variance (CV=65%) — consider re-running with --runs 5. (Plugin) Quality unchanged but weighted score is -6.1% due to: tokens (25435 → 44115), tool calls (2 → 3), time (14.2s → 21.1s)
[4] ⚠️ High run-to-run variance (CV=436%) — consider re-running with --runs 5. (Isolated) Quality unchanged but weighted score is -0.2% due to: efficiency metrics
[5] ⚠️ High run-to-run variance (CV=106%) — consider re-running with --runs 5
[6] ⚠️ High run-to-run variance (CV=203%) — consider re-running with --runs 5. (Plugin) Quality improved but weighted score is -7.8% due to: tokens (24954 → 43901), tool calls (1 → 2), time (7.7s → 12.2s)
[7] ⚠️ High run-to-run variance (CV=101%) — consider re-running with --runs 5. (Plugin) Quality unchanged but weighted score is -3.3% due to: tokens (28584 → 45057)
[8] (Isolated) Quality unchanged but weighted score is -9.1% due to: tokens (12623 → 26425), tool calls (0 → 2), time (11.2s → 18.3s)
[9] ⚠️ High run-to-run variance (CV=172%) — consider re-running with --runs 5. (Isolated) Quality unchanged but weighted score is -42.9% due to: judgment, quality, tool calls (2 → 3)
[10] ⚠️ High run-to-run variance (CV=394%) — consider re-running with --runs 5. (Plugin) Quality improved but weighted score is -3.3% due to: tokens (25531 → 62991), tool calls (2 → 4), time (10.3s → 19.2s)
[11] ⚠️ High run-to-run variance (CV=72%) — consider re-running with --runs 5
[12] ⚠️ High run-to-run variance (CV=91%) — consider re-running with --runs 5
[13] ⚠️ High run-to-run variance (CV=114%) — consider re-running with --runs 5. (Plugin) Quality unchanged but weighted score is -45.3% due to: judgment, quality, tokens (50807 → 66542)
[14] ⚠️ High run-to-run variance (CV=70%) — consider re-running with --runs 5. (Plugin) Quality unchanged but weighted score is -13.8% due to: judgment, tokens (25589 → 34969)
[15] ⚠️ High run-to-run variance (CV=82%) — consider re-running with --runs 5
[16] ⚠️ High run-to-run variance (CV=153%) — consider re-running with --runs 5
[17] ⚠️ High run-to-run variance (CV=51%) — consider re-running with --runs 5
[18] (Plugin) Quality unchanged but weighted score is -1.9% due to: tokens (12736 → 17446)
[19] ⚠️ High run-to-run variance (CV=494%) — consider re-running with --runs 5. (Isolated) Quality improved but weighted score is -17.5% due to: judgment, quality
[20] ⚠️ High run-to-run variance (CV=149%) — consider re-running with --runs 5. (Isolated) Quality unchanged but weighted score is -7.9% due to: quality, tokens (20998 → 30866)
[21] ⚠️ High run-to-run variance (CV=3548%) — consider re-running with --runs 5
[22] ⚠️ High run-to-run variance (CV=60%) — consider re-running with --runs 5
[23] ⚠️ High run-to-run variance (CV=166%) — consider re-running with --runs 5
[24] ⚠️ High run-to-run variance (CV=251%) — consider re-running with --runs 5. (Isolated) Quality unchanged but weighted score is -15.7% due to: judgment, quality
[25] ⚠️ High run-to-run variance (CV=335%) — consider re-running with --runs 5
[26] ⚠️ High run-to-run variance (CV=52%) — consider re-running with --runs 5

Model: claude-opus-4.6 | Judge: claude-opus-4.6

🔍 Full Results - additional metrics and failure investigation steps

To investigate failures, paste this to your AI coding agent:

For PR 850 in dotnet/skills, download eval artifacts with gh run download 28520810608 --repo dotnet/skills --pattern "skill-validator-results-*" --dir ./eval-results, then fetch https://raw.githubusercontent.com/dotnet/skills/48eef50a7767a20dc20ef9936b5bbe187dc4912b/eng/skill-validator/src/docs/InvestigatingResults.md and follow it to analyze the results.json files. Diagnose each failure, suggest fixes to the eval.yaml and skill content, and tell me what to fix first.

@github-actions github-actions Bot added waiting-on-review PR state label and removed pr-state/ready-for-eval PR is mergeable and awaiting evaluation labels Jul 1, 2026
…alue

Three scenarios scored baseline 5.0/5 in the PR #850 eval run (results.json
judgeResult.overallScore) — the model already aced them without the skill, so
the skilled arm had no headroom and their NOT-ACTIVATED marks dragged the
verdicts without reflecting real skill value. Per InvestigatingResults.md
pattern #8 (baseline already good), make each harder around something the
skill actually teaches, so the baseline struggles and the skill differentiates:

- writing-mstest-tests / 'Fix swapped Assert.AreEqual arguments': the old prompt
  named the fix ('fix swapped Assert.AreEqual arguments') — an answer key — and
  had only two trivially-swapped assertions. Rephrase to describe the *symptom*
  (backwards Expected/Actual in failure messages) without naming the cause, and
  add a third already-correct assertion the model must leave untouched. Now tests
  unaided diagnosis + discrimination (an output_not_matches guard fails the run
  if it swaps the correct one). Skill teaches this (MSTEST0017).

- run-tests / 'Filter MSTest tests by category on VSTest': old prompt wanted a
  bare 'TestCategory=Integration'. Require excluding the PaymentServiceTests
  class too, forcing an '&' AND-combinator with a negation operator ('!~'/'!=')
  — distinct from the existing AND-only 'Combine multiple filter criteria'
  scenario. filter-syntax teaches these operators.

- run-tests / 'Run tests on a specific TFM with TRX in a multi-TFM MTP project
  (SDK 9)': also require a custom TRX filename, so the answer must place TWO MTP
  extension flags (--report-trx --report-trx-filename net9-results.trx) after the
  single '--' separator while keeping the built-in --framework before it — the
  exact before/after-'--' rule run-tests teaches for SDK 8/9.

All new assertion regexes compile as .NET regex and were checked to match a
correct answer (and, for the not-matches guard, to reject a wrongly-swapped one).

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@Evangelink

Copy link
Copy Markdown
Member Author

/evaluate

@Evangelink

Copy link
Copy Markdown
Member Author

/evaluate

@Evangelink
Evangelink merged commit ce75c35 into main Jul 1, 2026
37 checks passed
@Evangelink
Evangelink deleted the dev/amauryleve/dotnet-test-eval-timeout-fixes branch July 1, 2026 15:09
@github-actions

github-actions Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Skill Validation Results

Skill Scenario Quality Skills Loaded Overfit Verdict
run-tests Run tests in a VSTest MSTest project 4.0/5 → 5.0/5 🟢 ✅ run-tests; tools: skill, bash / ⚠️ NOT ACTIVATED ✅ 0.13 [1]
run-tests Run tests with trx reporting on MTP project (SDK 9) 2.0/5 → 5.0/5 🟢 ✅ run-tests; tools: skill, report_intent, view ✅ 0.13
run-tests Run tests with blame-hang on MTP project (SDK 10) 2.3/5 → 4.0/5 🟢 ⚠️ NOT ACTIVATED / ✅ run-tests; tools: skill ✅ 0.13
run-tests Run tests on a specific TFM with TRX in a multi-TFM MTP project (SDK 9) 5.0/5 → 5.0/5 ⚠️ NOT ACTIVATED / ✅ run-tests; tools: skill ✅ 0.13 [2]
run-tests Filter MSTest tests by category on VSTest 4.3/5 → 5.0/5 🟢 ⚠️ NOT ACTIVATED / ✅ run-tests; tools: skill ✅ 0.13 [3]
run-tests Filter NUnit tests by class name on VSTest 3.0/5 → 5.0/5 🟢 ✅ run-tests; tools: skill, view, bash / ⚠️ NOT ACTIVATED ✅ 0.13 [4]
run-tests Filter xUnit v3 tests by class on MTP 1.0/5 → 5.0/5 🟢 ✅ run-tests; tools: skill, view ✅ 0.13 [5]
run-tests Filter xUnit v3 tests by trait on MTP 1.0/5 → 5.0/5 🟢 ✅ run-tests; tools: skill, view / ⚠️ NOT ACTIVATED ✅ 0.13 [6]
run-tests Filter xUnit v3 tests by class pattern and trait using query filter language 1.0/5 → 1.7/5 ⏰ 🟢 ✅ run-tests; tools: report_intent, view, skill, bash, web_fetch / ⚠️ NOT ACTIVATED ✅ 0.13 [7]
run-tests Filter TUnit tests by class using treenode-filter 2.3/5 → 3.0/5 🟢 ⚠️ NOT ACTIVATED ✅ 0.13 [8]
run-tests Combine multiple filter criteria on VSTest MSTest 3.0/5 → 5.0/5 🟢 ✅ run-tests; tools: skill, report_intent, view / ✅ run-tests; tools: report_intent, skill, view ✅ 0.13
run-tests MTP project on SDK 9 must use -- separator for args 1.0/5 → 3.0/5 🟢 ⚠️ NOT ACTIVATED ✅ 0.13 [9]
run-tests MTP project on SDK 10 passes args directly 1.0/5 → 4.7/5 🟢 ✅ run-tests; tools: skill / ⚠️ NOT ACTIVATED ✅ 0.13
run-tests Detect test platform from Directory.Build.props 1.0/5 → 5.0/5 🟢 ✅ run-tests; tools: skill / ⚠️ NOT ACTIVATED ✅ 0.13 [10]
run-tests Negative test: do not use MTP syntax for a VSTest project 4.0/5 → 5.0/5 🟢 ✅ run-tests; tools: skill, view / ⚠️ NOT ACTIVATED ✅ 0.13 [11]
coverage-analysis Project-wide coverage analysis with existing Cobertura data 2.3/5 → 4.3/5 🟢 ✅ coverage-analysis; tools: skill, bash, create ✅ 0.10
coverage-analysis Run coverage from scratch without existing data 3.3/5 → 5.0/5 🟢 ✅ coverage-analysis; tools: skill, glob, create, bash / ✅ coverage-analysis; tools: skill, bash, create, glob ✅ 0.10
coverage-analysis Coverage plateau diagnosis 3.0/5 → 4.7/5 🟢 ✅ coverage-analysis; tools: skill, bash, create, view ✅ 0.10
writing-mstest-tests Write unit tests for a service class 4.3/5 → 4.3/5 ✅ writing-mstest-tests; tools: skill, glob, bash, edit / ✅ writing-mstest-tests; tools: skill, glob 🟡 0.34 [12]
writing-mstest-tests Write data-driven tests for a calculator 3.3/5 → 5.0/5 🟢 ✅ writing-mstest-tests; tools: skill, report_intent, view / ✅ writing-mstest-tests; tools: skill, glob, report_intent, view 🟡 0.34
writing-mstest-tests Write async tests with cancellation 3.0/5 → 5.0/5 🟢 ✅ writing-mstest-tests; tools: skill / ✅ writing-mstest-tests; tools: report_intent, skill 🟡 0.34
writing-mstest-tests Fix swapped Assert.AreEqual arguments 4.7/5 → 5.0/5 🟢 ⚠️ NOT ACTIVATED 🟡 0.34 [13]
writing-mstest-tests Modernize legacy test patterns 4.3/5 → 5.0/5 🟢 ✅ writing-mstest-tests; tools: skill / ⚠️ NOT ACTIVATED 🟡 0.34 [14]
writing-mstest-tests Replace ExpectedException with Assert.Throws 3.0/5 → 4.3/5 🟢 ✅ writing-mstest-tests; tools: skill / ✅ writing-mstest-tests; tools: skill, report_intent 🟡 0.34 [15]
writing-mstest-tests Use proper collection assertions 3.0/5 → 4.7/5 🟢 ✅ writing-mstest-tests; tools: skill / ✅ writing-mstest-tests; tools: report_intent, skill 🟡 0.34
writing-mstest-tests Use proper type assertions instead of casts 4.0/5 → 5.0/5 🟢 ✅ writing-mstest-tests; tools: skill 🟡 0.34 [16]
writing-mstest-tests Set up test lifecycle correctly 2.0/5 → 4.3/5 🟢 ✅ writing-mstest-tests; tools: skill, report_intent, view 🟡 0.34
writing-mstest-tests Use DynamicData with ValueTuples over object arrays 3.0/5 → 4.3/5 🟢 ✅ writing-mstest-tests; tools: skill / ✅ writing-mstest-tests; tools: report_intent, skill 🟡 0.34 [17]
writing-mstest-tests Use string assertions for format validation 3.7/5 → 4.3/5 🟢 ✅ writing-mstest-tests; tools: skill, glob, view, bash, edit / ✅ writing-mstest-tests; tools: skill, bash, edit, view, glob 🟡 0.34
writing-mstest-tests Use comparison assertions for boundary testing 3.0/5 → 4.0/5 🟢 ✅ writing-mstest-tests; tools: skill / ✅ writing-mstest-tests; tools: report_intent, skill 🟡 0.34
writing-mstest-tests Write tests with collection, null, and reference assertions 3.7/5 → 4.0/5 🟢 ✅ writing-mstest-tests; tools: skill 🟡 0.34 [18]
writing-mstest-tests Configure conditional execution, retry, and cleanup 2.7/5 → 4.7/5 🟢 ✅ writing-mstest-tests; tools: report_intent, skill 🟡 0.34
writing-mstest-tests Configure test parallelization and MSTest.Sdk project 3.0/5 → 5.0/5 🟢 ✅ writing-mstest-tests; tools: skill 🟡 0.34
test-gap-analysis Find boundary mutation gaps in tiered discount and shipping logic 5.0/5 → 5.0/5 ✅ test-gap-analysis; tools: skill ✅ 0.14 [19]
test-gap-analysis Find logic and null-check mutation gaps in access control code 4.3/5 → 5.0/5 🟢 ✅ test-gap-analysis; tools: skill ✅ 0.14 [20]
test-gap-analysis Acknowledge well-tested code with few surviving mutations 4.3/5 → 4.0/5 🔴 ✅ test-gap-analysis; tools: skill / ✅ test-gap-analysis; tools: glob, skill ✅ 0.14 [21]
test-gap-analysis Decline request to write new tests from scratch 3.7/5 → 4.0/5 🟢 ℹ️ not activated (expected) ✅ 0.14 [22]
test-gap-analysis Produce a risk-prioritized report that excludes trivial and generated code 3.7/5 → 4.7/5 🟢 ✅ test-gap-analysis; tools: skill ✅ 0.14 [23]
test-gap-analysis Flag the Rust ? operator propagation as an unobserved mutation point 4.3/5 → 5.0/5 🟢 ✅ test-gap-analysis; tools: skill, glob / ✅ test-gap-analysis; tools: skill ✅ 0.14 [24]

[1] (Plugin) Quality unchanged but weighted score is -2.8% due to: tokens (25244 → 34580), time (11.0s → 15.2s)
[2] (Plugin) Quality unchanged but weighted score is -8.5% due to: tokens (25476 → 55079), time (13.9s → 21.4s), tool calls (2 → 3), quality
[3] ⚠️ High run-to-run variance (CV=62%) — consider re-running with --runs 5. (Isolated) Quality improved but weighted score is -3.4% due to: tool calls (2 → 3), tokens (25430 → 30994), time (13.2s → 18.5s)
[4] ⚠️ High run-to-run variance (CV=55%) — consider re-running with --runs 5. (Plugin) Quality improved but weighted score is -5.5% due to: tool calls (1 → 2), tokens (24946 → 34706), time (8.2s → 11.7s)
[5] ⚠️ High run-to-run variance (CV=193%) — consider re-running with --runs 5. (Plugin) Quality improved but weighted score is -7.5% due to: tokens (24956 → 43765), tool calls (1 → 2), time (8.7s → 12.9s)
[6] ⚠️ High run-to-run variance (CV=196%) — consider re-running with --runs 5. (Plugin) Quality unchanged but weighted score is -0.2% due to: tokens (37775 → 45019)
[7] ⚠️ High run-to-run variance (CV=71%) — consider re-running with --runs 5. (Plugin) Quality unchanged but weighted score is -1.6% due to: tokens (12638 → 17263)
[8] ⚠️ High run-to-run variance (CV=82%) — consider re-running with --runs 5
[9] ⚠️ High run-to-run variance (CV=98%) — consider re-running with --runs 5
[10] ⚠️ High run-to-run variance (CV=192%) — consider re-running with --runs 5
[11] ⚠️ High run-to-run variance (CV=368%) — consider re-running with --runs 5. (Plugin) Quality unchanged but weighted score is -1.8% due to: tokens (25562 → 34958)
[12] ⚠️ High run-to-run variance (CV=210%) — consider re-running with --runs 5
[13] ⚠️ High run-to-run variance (CV=67%) — consider re-running with --runs 5
[14] ⚠️ High run-to-run variance (CV=310%) — consider re-running with --runs 5
[15] ⚠️ High run-to-run variance (CV=76%) — consider re-running with --runs 5
[16] ⚠️ High run-to-run variance (CV=525%) — consider re-running with --runs 5. (Plugin) Quality improved but weighted score is -15.7% due to: judgment, quality
[17] ⚠️ High run-to-run variance (CV=170%) — consider re-running with --runs 5
[18] ⚠️ High run-to-run variance (CV=77%) — consider re-running with --runs 5
[19] (Plugin) Quality unchanged but weighted score is -8.5% due to: tokens (41206 → 87823), time (25.2s → 56.9s), tool calls (5 → 7)
[20] ⚠️ High run-to-run variance (CV=135%) — consider re-running with --runs 5
[21] ⚠️ High run-to-run variance (CV=206%) — consider re-running with --runs 5
[22] ⚠️ High run-to-run variance (CV=190%) — consider re-running with --runs 5. (Isolated) Quality improved but weighted score is -23.1% due to: judgment, quality, tokens (108787 → 147816), time (63.1s → 80.4s), tool calls (8 → 10)
[23] ⚠️ High run-to-run variance (CV=113%) — consider re-running with --runs 5
[24] ⚠️ High run-to-run variance (CV=106%) — consider re-running with --runs 5

timeout — run(s) hit the (240s) scenario timeout limit; scoring may be impacted by aborting model execution before it could produce its full output (increase via timeout in eval.yaml)

Model: claude-opus-4.6 | Judge: claude-opus-4.6

🔍 Full Results - additional metrics and failure investigation steps

To investigate failures, paste this to your AI coding agent:

For PR 850 in dotnet/skills, download eval artifacts with gh run download 28526989095 --repo dotnet/skills --pattern "skill-validator-results-*" --dir ./eval-results, then fetch https://raw.githubusercontent.com/dotnet/skills/acad566a28efb52f4b29b71d9a6cb50481c80b26/eng/skill-validator/src/docs/InvestigatingResults.md and follow it to analyze the results.json files. Diagnose each failure, suggest fixes to the eval.yaml and skill content, and tell me what to fix first.

github-actions Bot added a commit that referenced this pull request Jul 1, 2026
@Evangelink
Evangelink restored the dev/amauryleve/dotnet-test-eval-timeout-fixes branch July 2, 2026 17:52
@Evangelink

Copy link
Copy Markdown
Member Author

/evaluate

github-actions Bot added a commit that referenced this pull request Jul 2, 2026
@github-actions

github-actions Bot commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Skill Validation Results

Skill Scenario Quality Skills Loaded Overfit Verdict
run-tests Run tests in a VSTest MSTest project 4.0/5 → 5.0/5 🟢 ✅ run-tests; tools: skill, bash / ⚠️ NOT ACTIVATED ✅ 0.12 [1]
run-tests Run tests with trx reporting on MTP project (SDK 9) 2.0/5 → 5.0/5 🟢 ✅ run-tests; tools: skill, report_intent, view ✅ 0.12
run-tests Run tests with blame-hang on MTP project (SDK 10) 2.7/5 → 3.7/5 🟢 ⚠️ NOT ACTIVATED / ✅ run-tests; tools: skill ✅ 0.12 [2]
run-tests Run tests on a specific TFM with TRX in a multi-TFM MTP project (SDK 9) 5.0/5 → 5.0/5 ⚠️ NOT ACTIVATED / ✅ run-tests; tools: skill ✅ 0.12 [3]
run-tests Filter MSTest tests by category on VSTest 5.0/5 → 5.0/5 ⚠️ NOT ACTIVATED / ✅ run-tests; tools: skill ✅ 0.12 [4]
run-tests Filter NUnit tests by class name on VSTest 3.0/5 → 5.0/5 🟢 ✅ run-tests; tools: skill, view, bash / ⚠️ NOT ACTIVATED ✅ 0.12
run-tests Filter xUnit v3 tests by class on MTP 1.0/5 → 5.0/5 🟢 ✅ run-tests; tools: skill, view ✅ 0.12 [5]
run-tests Filter xUnit v3 tests by trait on MTP 1.0/5 → 5.0/5 🟢 ✅ run-tests; tools: skill, view / ⚠️ NOT ACTIVATED ✅ 0.12 [6]
run-tests Filter xUnit v3 tests by class pattern and trait using query filter language 1.0/5 → 2.3/5 🟢 ✅ run-tests; tools: report_intent, view, skill / ⚠️ NOT ACTIVATED ✅ 0.12 [7]
run-tests Filter TUnit tests by class using treenode-filter 3.0/5 → 4.0/5 🟢 ⚠️ NOT ACTIVATED ✅ 0.12 [8]
run-tests Combine multiple filter criteria on VSTest MSTest 3.0/5 → 5.0/5 🟢 ✅ run-tests; tools: report_intent, skill, view, bash / ✅ run-tests; tools: report_intent, skill, view ✅ 0.12 [9]
run-tests MTP project on SDK 9 must use -- separator for args 1.0/5 → 3.0/5 🟢 ⚠️ NOT ACTIVATED ✅ 0.12
run-tests MTP project on SDK 10 passes args directly 1.0/5 → 4.0/5 🟢 ⚠️ NOT ACTIVATED ✅ 0.12
run-tests Detect test platform from Directory.Build.props 1.3/5 → 5.0/5 🟢 ✅ run-tests; tools: skill / ⚠️ NOT ACTIVATED ✅ 0.12 [10]
run-tests Negative test: do not use MTP syntax for a VSTest project 4.7/5 → 5.0/5 🟢 ✅ run-tests; tools: skill, view / ⚠️ NOT ACTIVATED ✅ 0.12 [11]
coverage-analysis Project-wide coverage analysis with existing Cobertura data 2.7/5 → 4.7/5 🟢 ✅ coverage-analysis; tools: skill, bash, create, read_bash, stop_bash / ✅ coverage-analysis; tools: skill, bash, read_bash, create, stop_bash ✅ 0.19
coverage-analysis Run coverage from scratch without existing data 4.0/5 → 4.7/5 🟢 ✅ coverage-analysis; tools: skill, glob, create, read_bash, stop_bash / ✅ coverage-analysis; tools: skill, glob, create ✅ 0.19
coverage-analysis Coverage plateau diagnosis 3.0/5 → 4.3/5 🟢 ✅ coverage-analysis; tools: skill, read_bash, create, bash, stop_bash / ✅ coverage-analysis; tools: skill, create, bash, read_bash ✅ 0.19
writing-mstest-tests Write unit tests for a service class 4.0/5 → 4.0/5 ✅ writing-mstest-tests; tools: skill, glob / ✅ writing-mstest-tests; tools: skill, bash, edit 🟡 0.31 [12]
writing-mstest-tests Write data-driven tests for a calculator 3.3/5 → 5.0/5 🟢 ✅ writing-mstest-tests; tools: skill / ✅ writing-mstest-tests; tools: skill, glob 🟡 0.31 [13]
writing-mstest-tests Write async tests with cancellation 3.0/5 → 5.0/5 🟢 ✅ writing-mstest-tests; tools: skill / ✅ writing-mstest-tests; tools: report_intent, skill 🟡 0.31
writing-mstest-tests Fix swapped Assert.AreEqual arguments 4.7/5 → 5.0/5 🟢 ⚠️ NOT ACTIVATED 🟡 0.31 [14]
writing-mstest-tests Modernize legacy test patterns 4.7/5 → 5.0/5 🟢 ✅ writing-mstest-tests; tools: skill / ⚠️ NOT ACTIVATED 🟡 0.31 [15]
writing-mstest-tests Replace ExpectedException with Assert.Throws 3.0/5 → 4.3/5 🟢 ✅ writing-mstest-tests; tools: skill 🟡 0.31
writing-mstest-tests Use proper collection assertions 3.0/5 → 5.0/5 🟢 ✅ writing-mstest-tests; tools: skill / ✅ writing-mstest-tests; tools: report_intent, skill 🟡 0.31
writing-mstest-tests Use proper type assertions instead of casts 4.0/5 → 4.3/5 🟢 ✅ writing-mstest-tests; tools: skill 🟡 0.31 [16]
writing-mstest-tests Set up test lifecycle correctly 2.0/5 → 4.0/5 🟢 ✅ writing-mstest-tests; tools: skill, report_intent, view 🟡 0.31
writing-mstest-tests Use DynamicData with ValueTuples over object arrays 3.0/5 → 3.7/5 🟢 ✅ writing-mstest-tests; tools: skill / ✅ writing-mstest-tests; tools: report_intent, skill 🟡 0.31 [17]
writing-mstest-tests Use string assertions for format validation 3.7/5 → 4.3/5 🟢 ✅ writing-mstest-tests; tools: skill, bash, edit, view, glob / ✅ writing-mstest-tests; tools: skill, bash, edit, view 🟡 0.31
writing-mstest-tests Use comparison assertions for boundary testing 2.7/5 → 4.0/5 🟢 ✅ writing-mstest-tests; tools: skill / ✅ writing-mstest-tests; tools: report_intent, skill 🟡 0.31
writing-mstest-tests Write tests with collection, null, and reference assertions 4.0/5 → 4.0/5 ✅ writing-mstest-tests; tools: skill, glob 🟡 0.31
writing-mstest-tests Configure conditional execution, retry, and cleanup 3.0/5 → 4.3/5 🟢 ✅ writing-mstest-tests; tools: report_intent, skill 🟡 0.31
writing-mstest-tests Configure test parallelization and MSTest.Sdk project 3.0/5 → 5.0/5 🟢 ✅ writing-mstest-tests; tools: skill 🟡 0.31
test-gap-analysis Find boundary mutation gaps in tiered discount and shipping logic 5.0/5 → 5.0/5 ✅ test-gap-analysis; tools: skill / ✅ test-gap-analysis; tools: skill, glob ✅ 0.14 [18]
test-gap-analysis Find logic and null-check mutation gaps in access control code 4.7/5 → 5.0/5 🟢 ✅ test-gap-analysis; tools: skill ✅ 0.14 [19]
test-gap-analysis Acknowledge well-tested code with few surviving mutations 4.0/5 → 3.3/5 🔴 ✅ test-gap-analysis; tools: skill ✅ 0.14 [20]
test-gap-analysis Decline request to write new tests from scratch 3.3/5 → 4.0/5 🟢 ℹ️ not activated (expected) ✅ 0.14 [21]
test-gap-analysis Produce a risk-prioritized report that excludes trivial and generated code 3.7/5 → 4.0/5 🟢 ✅ test-gap-analysis; tools: skill ✅ 0.14 [22]
test-gap-analysis Flag the Rust ? operator propagation as an unobserved mutation point 4.3/5 → 5.0/5 🟢 ✅ test-gap-analysis; tools: skill, glob / ✅ test-gap-analysis; tools: skill ✅ 0.14 [23]

[1] ⚠️ High run-to-run variance (CV=414%) — consider re-running with --runs 5. (Plugin) Quality unchanged but weighted score is -2.5% due to: tokens (25245 → 34598), time (14.9s → 18.7s)
[2] ⚠️ High run-to-run variance (CV=122%) — consider re-running with --runs 5
[3] (Plugin) Quality unchanged but weighted score is -8.2% due to: tokens (25487 → 62734), tool calls (2 → 4), time (22.3s → 28.2s)
[4] (Plugin) Quality unchanged but weighted score is -6.6% due to: tokens (30037 → 59539), time (26.1s → 35.2s), tool calls (3 → 4)
[5] ⚠️ High run-to-run variance (CV=192%) — consider re-running with --runs 5
[6] ⚠️ High run-to-run variance (CV=169%) — consider re-running with --runs 5. (Plugin) Quality unchanged but weighted score is -1.6% due to: tokens (34363 → 45161)
[7] ⚠️ High run-to-run variance (CV=53%) — consider re-running with --runs 5. (Plugin) Quality unchanged but weighted score is -2.3% due to: tokens (12644 → 17331)
[8] ⚠️ High run-to-run variance (CV=376%) — consider re-running with --runs 5
[9] ⚠️ High run-to-run variance (CV=53%) — consider re-running with --runs 5
[10] ⚠️ High run-to-run variance (CV=684%) — consider re-running with --runs 5. (Plugin) Quality unchanged but weighted score is -48.8% due to: judgment, quality, tokens (50153 → 60977)
[11] ⚠️ High run-to-run variance (CV=118%) — consider re-running with --runs 5
[12] ⚠️ High run-to-run variance (CV=422%) — consider re-running with --runs 5. (Isolated) Quality unchanged but weighted score is -11.0% due to: judgment, quality
[13] ⚠️ High run-to-run variance (CV=118%) — consider re-running with --runs 5
[14] ⚠️ High run-to-run variance (CV=181%) — consider re-running with --runs 5
[15] ⚠️ High run-to-run variance (CV=288%) — consider re-running with --runs 5
[16] ⚠️ High run-to-run variance (CV=294%) — consider re-running with --runs 5. (Isolated) Quality improved but weighted score is -17.3% due to: judgment, quality, tokens (25225 → 30858)
[17] ⚠️ High run-to-run variance (CV=1774%) — consider re-running with --runs 5. (Isolated) Quality improved but weighted score is -8.0% due to: tokens (12826 → 30983), tool calls (0 → 1), time (10.1s → 12.3s)
[18] (Plugin) Quality unchanged but weighted score is -7.1% due to: tokens (41132 → 95297), time (23.7s → 51.6s), tool calls (5 → 8)
[19] ⚠️ High run-to-run variance (CV=563%) — consider re-running with --runs 5
[20] ⚠️ High run-to-run variance (CV=130%) — consider re-running with --runs 5
[21] ⚠️ High run-to-run variance (CV=115%) — consider re-running with --runs 5
[22] ⚠️ High run-to-run variance (CV=108%) — consider re-running with --runs 5
[23] ⚠️ High run-to-run variance (CV=96%) — consider re-running with --runs 5

Model: claude-opus-4.6 | Judge: claude-opus-4.6

🔍 Full Results - additional metrics and failure investigation steps

To investigate failures, paste this to your AI coding agent:

For PR 850 in dotnet/skills, download eval artifacts with gh run download 28610638436 --repo dotnet/skills --pattern "skill-validator-results-*" --dir ./eval-results, then fetch https://raw.githubusercontent.com/dotnet/skills/acad566a28efb52f4b29b71d9a6cb50481c80b26/eng/skill-validator/src/docs/InvestigatingResults.md and follow it to analyze the results.json files. Diagnose each failure, suggest fixes to the eval.yaml and skill content, and tell me what to fix first.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

waiting-on-review PR state label

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants