CtrlK
BlogDocsLog inGet started
Tessl Logo
SkillPublic

migrate-vstest-to-mtp

Use this skill before answering, planning, or editing whenever .NET tests or CI are switching from VSTest to Microsoft.Testing.Platform (MTP), or an MTP migration behaves differently. Triggers include "switch from VSTest"; MSTest/NUnit/xUnit MTP enablement; OutputType=Exe only for test projects in Directory.Build.props; EnableMSTestRunner, EnableNUnitRunner, UseMicrosoftTestingPlatformRunner, or YTest.MTP.XUnit2; .NET 10 global.json test.runner and TestingPlatformDotnetTestSupport; translating VSTest filters, logger, coverage, blame, or dump arguments; replacing VSTest@3; and exit code 8 or zero tests. Also use for xUnit v3 MTP filters during a v2-to-v3 upgrade. Do not use for framework conversion, TFM, UWP, or WinUI.

Quality

85%

Does it follow best practices?

Run evals on this skill

Adds up to 20 points to the overall score

View guide
SecuritybySnyk

Passed

No findings from the security scan

SKILL.md
Quality
Evals
Security

Quality

Content

77%Weight 40%Scale 1-5

Reviews the quality of instructions and guidance provided to agents. Good implementation is clear, handles edge cases, and produces reliable results.

An exceptionally actionable, well-sequenced migration guide whose verification and feedback loops are exemplary. Its two real weaknesses are systematic repetition of the same caveats across sections and a monolithic structure that inlines framework-specific and filter-translation detail that should live in one-level-deep reference files.

Suggestions

Move the framework-specific runner setup (Step 3) and the xUnit v3 filter flags/translation/query-language sections (Step 5) into references/ files (e.g., references/framework-runners.md and references/xunit-v3-filters.md), leaving SKILL.md as an overview with clearly signaled links.

Dedupe the repeated caveats: state the '--' separator rule, the IsTestProject/MSBuildProjectName conditioning rule, and the xUnit v3 filter-syntax break each once in their authoritative section and drop the duplicates from First Action, the Execution Contract, and the pitfalls table (or keep only the pitfalls table as the single recap).

Consolidate the exit-code-8 guidance so the three remediation forms appear once; the Execution Contract currently re-lists what Step 8 already covers verbatim.

DimensionReasoningScore

Conciseness

The body is mostly efficient (tables, terse notes, code blocks) but repeats the same guidance multiple times: the '--' separator rule appears in First Action, the Execution Contract, Step 4, and the pitfalls table; 'IsTestProject is not available in Directory.Build.props' is explained in First Action, Step 2, and pitfalls; 'xUnit v3 does NOT support the VSTest --filter syntax' appears three times, and the exit-code-8 options are listed twice in full. This matches anchor 3 (mostly efficient but could be tightened), not 4 — the duplication is systematic, not minor instances.

3 / 5

Actionability

Fully executable throughout: exact XML snippets (Directory.Build.props conditions, runner opt-ins, global.json), a complete VSTest-to-MTP argument translation table with owning extension packages named, concrete xUnit v3 filter commands ('dotnet test -- --filter-class *IntegrationTests* --filter-trait "Category=Smoke"'), CI YAML before/after examples, and all three exit-code-8 remediation forms. Copy-paste ready and covering the common cases — matches anchor 5; nothing is pseudocode or vague.

5 / 5

Workflow Clarity

A clearly sequenced 10-step workflow with a baseline established up front (Step 1.6 'Run dotnet test to establish a baseline'), an explicit Verify step (build, run, compare counts to baseline, run the executable directly, check CI artifacts, check Test Explorer), a Validation checklist, and feedback-style guidance (validate the query with --list-tests before trusting a zero-test translation; fix empty runs vs. blindly suppressing exit code 8). Matches anchor 5's explicit validation steps, feedback loops, and checklists for a batch migration.

5 / 5

Progressive Disclosure

The body is well-sectioned but entirely monolithic at ~420 lines with no bundle files (no references/, scripts/, or assets/ exist): the framework-specific runner setups, the xUnit v3 filter flag/translation/query-language sections, and the CI pipeline YAML are all inline when they are exactly the bulk detail that belongs in one-level-deep reference files. This matches anchor 3 ('content that should be separate is inline'); it is above 2 because headers and tables make it navigable, but below 4 because none of the heavy detail is offloaded to signaled reference files.

3 / 5

Total

16

/

20

Passed

Description

86%Weight 40%Scale 1-5

Based on the skill's description, can an agent find and select it at the right time? Clear, specific descriptions lead to better discovery.

A strong, highly targeted description with excellent trigger coverage and explicit use/don't-use boundaries. Its only weakness is that the skill's concrete actions are expressed as trigger conditions rather than an explicit statement of what the skill does.

DimensionReasoningScore

Specificity

The description names the concrete domain ('switching from VSTest to Microsoft.Testing.Platform (MTP)') and specific trigger artifacts: 'translating VSTest filters, logger, coverage, blame, or dump arguments; replacing VSTest@3; and exit code 8 or zero tests', plus exact property names (EnableMSTestRunner, UseMicrosoftTestingPlatformRunner). It falls just below anchor 5 because the 'what' actions are framed as triggers ('before answering, planning, or editing') rather than enumerating the concrete actions the skill performs (migrate props, translate arguments, update pipelines), and not above 4 because it lists several specific concrete items with only minor coverage gaps.

4 / 5

Completeness

'When' is explicit and rich ('Use this skill before answering, planning, or editing whenever .NET tests or CI are switching from VSTest to... (MTP), or an MTP migration behaves differently'), with concrete trigger phrases and even a do-not-use boundary ('Do not use for framework conversion, TFM, UWP, or WinUI'). 'What' is only implied by the transition framing rather than explicitly stated as performed actions (migrate configuration, translate arguments, update CI), so it fits anchor 4 (both present, one could be more explicit) rather than anchor 5.

4 / 5

Trigger Term Quality

Comprehensive natural trigger terms with synonyms and exact identifiers a user or repo would contain: "switch from VSTest", MSTest/NUnit/xUnit enablement, 'OutputType=Exe only for test projects in Directory.Build.props', '.NET 10 global.json test.runner', 'exit code 8 or zero tests', plus the tool name VSTest@3. Clearly matches the anchor-5 example's coverage of natural terms including variations; nothing below fits since common phrasings are all present.

5 / 5

Distinctiveness Conflict Risk

Clear niche (VSTest-to-MTP migration) with highly distinct triggers (exit code 8, TestingPlatformDotnetTestSupport, VSTest@3) and an explicit exclusion clause separating it from adjacent skills ('Do not use for framework conversion, TFM, UWP, or WinUI'; 'Also use for xUnit v3 MTP filters'). Minimal conflict risk — matches the anchor-5 'clear niche with distinct triggers' pattern.

5 / 5

Total

18

/

20

Passed

Validation

100%

Checks the skill against the spec for correct structure and formatting. All validation checks must pass before discovery and implementation can be scored.

Validation — 16 / 16 Passed

Validation for skill structure

No warnings or errors.

Repository

dotnet/skills

Path

plugins/dotnet-test-migration/skills/migrate-vstest-to-mtp/SKILL.md

Reviewed

Table of Contents

Is this your skill?

If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.