Skip to content

Add .NET refactoring and breaking-change skills#873

Open
AbhitejJohn wants to merge 10 commits into
mainfrom
add-dotnet-refactoring-skills
Open

Add .NET refactoring and breaking-change skills#873
AbhitejJohn wants to merge 10 commits into
mainfrom
add-dotnet-refactoring-skills

Conversation

@AbhitejJohn

Copy link
Copy Markdown
Collaborator

Summary

Refactoring is a common operation for .NET developers, and a dedicated skill can help agents make these changes in the way .NET teams expect: behavior-preserving, incremental, and validated with build/test gates.

This PR adds two related skills:

  • csharp-refactoring: guides safe C#/.NET refactoring work such as rename, move, extract, inline, split, consolidate/de-duplicate, and modernization while preserving behavior.
  • dotnet-breaking-changes: provides the compatibility guardrails needed when a refactor touches public API, multi-targeting, source-generated/partial code, or InternalsVisibleTo surfaces.

Why these skills

csharp-refactoring focuses on the refactoring workflow itself: establish a green baseline, choose one named operation, find true references, prefer semantics-aware edits, and re-gate after each step. Its reference file expands the operation catalog and maps common refactoring operations to the kinds of changes .NET teams regularly make.

dotnet-breaking-changes covers the .NET-specific surfaces where a change can compile and pass tests while still breaking downstream consumers. Its reference files explain how to inspect and handle:

  • public API gates (PublicAPI.*, ApiCompat, package validation)
  • multi-targeting and #if branches
  • source-generated and partial code
  • friend assemblies via InternalsVisibleTo

Together, the skills let an agent keep refactoring focused on behavior preservation while still checking the .NET compatibility surfaces that matter in real repos.

Validation

  • Added eval coverage for both skills.
  • Included fixture scenarios that exercise rename, extraction, consolidation, public API checks, multi-targeting, generated/partial code, and friend assembly hazards.
  • Ran the skill validator successfully.
  • Verified the eval fixtures build and test successfully in isolated copies.

AbhitejJohn and others added 2 commits July 7, 2026 13:56
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@github-actions

github-actions Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Skill Coverage Report

Plugin Skill Covered Coverage
dotnet setup-local-sdk 3/8 37.5%
Uncovered: dotnet/setup-local-sdk
  • [Pitfall] paths ignored (line 382)
  • [Pitfall] dotnet app.dll wrong runtime (line 386)
  • [CodePattern] [pscustomobject] (line 301)
  • [CodePattern] [ordered] (line 301)
  • [CodePattern] [guid] (line 104)

@AbhitejJohn

Copy link
Copy Markdown
Collaborator Author

/evaluate

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

github-actions Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Skill Validation Results

Skill Scenario Quality Skills Loaded Overfit Verdict
csharp-refactoring Rename a method across its declaration and every caller 3.0/5 → 1.7/5 🔴 ✅ csharp-refactoring; tools: skill, glob / ✅ csharp-refactoring; tools: skill, read_bash, glob ✅ 0.16 [1]
csharp-refactoring Extract a repeated calculation into a private helper 2.0/5 → 1.7/5 🔴 ✅ csharp-refactoring; tools: grep, skill / ⚠️ NOT ACTIVATED ✅ 0.16 [2]
csharp-refactoring Consolidate a duplicated block into a single shared helper 1.3/5 → 1.0/5 🔴 ✅ csharp-refactoring; tools: skill, glob / ⚠️ NOT ACTIVATED ✅ 0.16 [3]
csharp-refactoring Inline a pass-through wrapper and update callers 2.7/5 → 1.0/5 🔴 ✅ csharp-refactoring; tools: skill, bash / ⚠️ NOT ACTIVATED ✅ 0.16 [4]
csharp-refactoring Merge two near-identical types into one parameterized type 1.0/5 → 1.0/5 ⚠️ NOT ACTIVATED / ✅ csharp-refactoring; tools: bash, read_bash, glob, edit, skill ✅ 0.16 [5]
csharp-refactoring Decline a framework and package upgrade dressed up as a refactor 1.3/5 → 1.0/5 ⏰ 🔴 ℹ️ not activated (expected) ✅ 0.16 [6]
csharp-refactoring Decline a new-feature request dressed up as a refactor 4.7/5 → 3.0/5 ⏰ 🔴 ℹ️ not activated (expected) ✅ 0.16 [7]
csharp-refactoring Keep behavior-changing bug fixes out of a behavior-preserving refactor 3.7/5 ⏰ → 2.3/5 ⏰ 🔴 ℹ️ not activated (expected) ✅ 0.16 [8]
dotnet-breaking-changes Answer a public-API question before consolidating duplicated parsing 2.0/5 → 1.3/5 🔴 ✅ dotnet-breaking-changes; tools: skill, glob / ⚠️ NOT ACTIVATED ✅ 0.10 [9]
dotnet-breaking-changes Add behavior to a shipped public member without breaking the contract 3.3/5 → 2.3/5 🔴 ✅ dotnet-breaking-changes; tools: skill / ⚠️ NOT ACTIVATED ✅ 0.10 [10]
dotnet-breaking-changes Rename a helper referenced from every #if branch of a multi-targeted type 3.0/5 → 3.0/5 ✅ dotnet-breaking-changes; tools: skill / ⚠️ NOT ACTIVATED ✅ 0.10 [11]
dotnet-breaking-changes Rename a member of a partial type that a generated part references 3.0/5 → 2.0/5 🔴 ✅ dotnet-breaking-changes; tools: skill, glob / ⚠️ NOT ACTIVATED ✅ 0.10 [12]
dotnet-breaking-changes Add a new public method that must be correct on every target framework 2.0/5 → 1.0/5 🔴 ✅ dotnet-breaking-changes; tools: bash, glob, skill / ⚠️ NOT ACTIVATED ✅ 0.10 [13]
dotnet-breaking-changes Do not raise breaking-change concerns for a purely internal local rename 5.0/5 → 5.0/5 ℹ️ not activated (expected) ✅ 0.10 [14]

[1] ⚠️ High run-to-run variance (CV=82%) — consider re-running with --runs 5
[2] ⚠️ High run-to-run variance (CV=87%) — consider re-running with --runs 5
[3] ⚠️ High run-to-run variance (CV=109%) — consider re-running with --runs 5
[4] ⚠️ High run-to-run variance (CV=58%) — consider re-running with --runs 5
[5] ⚠️ High run-to-run variance (CV=265%) — consider re-running with --runs 5. (Isolated) Quality unchanged but weighted score is -15.5% due to: judgment, quality
[6] ⚠️ High run-to-run variance (CV=71%) — consider re-running with --runs 5
[7] ⚠️ High run-to-run variance (CV=122%) — consider re-running with --runs 5. (Isolated) Quality dropped but weighted score is +4.0% due to: tokens (180608 → 105541), tool calls (19 → 11), time (211.0s → 136.3s)
[8] ⚠️ High run-to-run variance (CV=114%) — consider re-running with --runs 5
[9] ⚠️ High run-to-run variance (CV=159%) — consider re-running with --runs 5. (Isolated) Quality dropped but weighted score is +15.2% due to: completion (✗ → ✓), tokens (90688 → 78437)
[10] ⚠️ High run-to-run variance (CV=171%) — consider re-running with --runs 5
[11] ⚠️ High run-to-run variance (CV=105%) — consider re-running with --runs 5
[12] ⚠️ High run-to-run variance (CV=103%) — consider re-running with --runs 5
[13] ⚠️ High run-to-run variance (CV=56%) — consider re-running with --runs 5
[14] ⚠️ High run-to-run variance (CV=106%) — consider re-running with --runs 5

timeout — run(s) hit the (300s) 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 873 in dotnet/skills, download eval artifacts with gh run download 28962446218 --repo dotnet/skills --pattern "skill-validator-results-*" --dir ./eval-results, then fetch https://raw.githubusercontent.com/dotnet/skills/1b3a5bd13db825237d579a4dd9d2c1dfc87d9953/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

@AbhitejJohn
AbhitejJohn marked this pull request as ready for review July 13, 2026 17:18
Copilot AI review requested due to automatic review settings July 13, 2026 17:18

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 adds two new .NET-focused skills to the plugins/dotnet plugin—one for behavior-preserving C# refactoring workflows and one for .NET-specific breaking-change/compatibility guardrails—along with eval coverage and fixtures that exercise the key hazards (public API baselines, multi-targeting #if, generated/partial code, and friend assemblies).

Changes:

  • Added csharp-refactoring skill guidance plus an operation catalog reference.
  • Added dotnet-breaking-changes skill guidance plus focused reference docs for the four “hidden surfaces”.
  • Added eval suites + identical lightweight Billing fixture solutions under tests/dotnet/ for both skills; updated CODEOWNERS and dotnet plugin README.
Show a summary per file
File Description
tests/dotnet/dotnet-breaking-changes/tests/Billing.Tests/BillingTests.cs Adds fixture tests used by the breaking-change eval scenarios.
tests/dotnet/dotnet-breaking-changes/tests/Billing.Tests/Billing.Tests.csproj Adds an xUnit test project targeting net10.0 for the breaking-change fixture solution.
tests/dotnet/dotnet-breaking-changes/src/Billing/PublicAPI.Shipped.txt Adds a public API baseline file used by eval prompts/assertions.
tests/dotnet/dotnet-breaking-changes/src/Billing/Pricing.cs Adds pricing/tax types used for refactor/breaking-change exercises.
tests/dotnet/dotnet-breaking-changes/src/Billing/PlatformInfo.cs Adds multi-targeting #if example surface for breaking-change checks.
tests/dotnet/dotnet-breaking-changes/src/Billing/OrderProcessor.cs Adds intentionally-refactorable implementation used by scenarios.
tests/dotnet/dotnet-breaking-changes/src/Billing/Coupons.g.cs.template Adds generator-input template to simulate generated/partial hazards.
tests/dotnet/dotnet-breaking-changes/src/Billing/Coupons.cs Adds hand-authored partial type paired with the generated template.
tests/dotnet/dotnet-breaking-changes/src/Billing/Billing.csproj Adds multi-targeted library project and build-time generation hook.
tests/dotnet/dotnet-breaking-changes/src/Billing/AppSettingsHelper.cs Adds duplicated parsing helpers for public-API consolidation scenarios.
tests/dotnet/dotnet-breaking-changes/Fixture.sln Adds the breaking-change fixture solution container.
tests/dotnet/dotnet-breaking-changes/eval.yaml Adds breaking-change eval scenarios and build/test gates.
tests/dotnet/csharp-refactoring/tests/Billing.Tests/BillingTests.cs Adds fixture tests used by the refactoring eval scenarios.
tests/dotnet/csharp-refactoring/tests/Billing.Tests/Billing.Tests.csproj Adds an xUnit test project targeting net10.0 for the refactoring fixture solution.
tests/dotnet/csharp-refactoring/src/Billing/PublicAPI.Shipped.txt Adds a public API baseline file used by refactoring prompts/assertions.
tests/dotnet/csharp-refactoring/src/Billing/Pricing.cs Adds pricing/tax types used for refactoring exercises.
tests/dotnet/csharp-refactoring/src/Billing/PlatformInfo.cs Adds multi-targeting #if example surface for refactoring checks.
tests/dotnet/csharp-refactoring/src/Billing/OrderProcessor.cs Adds intentionally-refactorable implementation used by scenarios.
tests/dotnet/csharp-refactoring/src/Billing/Coupons.g.cs.template Adds generator-input template to simulate generated/partial hazards.
tests/dotnet/csharp-refactoring/src/Billing/Coupons.cs Adds hand-authored partial type paired with the generated template.
tests/dotnet/csharp-refactoring/src/Billing/Billing.csproj Adds multi-targeted library project and build-time generation hook.
tests/dotnet/csharp-refactoring/src/Billing/AppSettingsHelper.cs Adds duplicated parsing helpers used in refactoring scenarios.
tests/dotnet/csharp-refactoring/Fixture.sln Adds the refactoring fixture solution container.
tests/dotnet/csharp-refactoring/eval.yaml Adds refactoring eval scenarios and build/test gates.
plugins/dotnet/skills/dotnet-breaking-changes/SKILL.md Introduces the breaking-change skill and when/when-not-to-use guidance.
plugins/dotnet/skills/dotnet-breaking-changes/references/source-generation.md Adds detailed guidance for generated/partial code hazards.
plugins/dotnet/skills/dotnet-breaking-changes/references/public-api.md Adds detailed guidance for public API gating and compatibility decisions.
plugins/dotnet/skills/dotnet-breaking-changes/references/multi-targeting.md Adds detailed guidance for multi-targeting and #if branch correctness.
plugins/dotnet/skills/dotnet-breaking-changes/references/internals-visible-to.md Adds detailed guidance for friend-assembly/internal-surface hazards.
plugins/dotnet/skills/csharp-refactoring/SKILL.md Introduces the refactoring skill and a stepwise safety contract.
plugins/dotnet/skills/csharp-refactoring/references/operation-catalog.md Adds a more detailed refactoring operation taxonomy reference.
plugins/dotnet/README.md Updates the dotnet plugin skill list to include the new skills.
eng/known-domains.txt Adds github.com/dotnet/skills to known domains.
.github/CODEOWNERS Adds ownership entries for the new skills and their tests.

Copilot's findings

Tip

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

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

@AbhitejJohn

Copy link
Copy Markdown
Collaborator Author

/evaluate

contract unchanged. On a multi-targeted project, build/test **each** TFM — a green default build can
still be broken on another target.

```bash

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.

I suggest removing lines 147-152. Models know how to build and test and should favor the repos instructions for doing it over this generic option.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Thanks Wendy — addressed in the v3 trim (df61fce). The section now leads with: "Use the repo's own build/test workflow when it documents one (\README/\CONTRIBUTING, \�uild., \�ng/, \global.json, .github/workflows); its instructions win over any generic command."* The generic \dotnet build/\dotnet test\ is kept only as an explicit \Otherwise:\ fallback for repos with no documented workflow, and trimmed to a few lines. Happy to drop the fallback entirely if you'd prefer zero generic commands.

@github-actions github-actions Bot added the waiting-on-author PR state label label Jul 13, 2026
@github-actions

Copy link
Copy Markdown
Contributor

👋 @AbhitejJohn — this PR has 1 unresolved review thread(s). When you're ready, please address the feedback and push an update; the triage bot will pick up the next state automatically. (Add the no-stale label to silence further pings.)

@github-actions

Copy link
Copy Markdown
Contributor

Skill Validation Results

Skill Scenario Quality Skills Loaded Overfit Verdict
csharp-refactoring Rename a method across its declaration and every caller 3.0/5 → 1.0/5 🔴 ✅ csharp-refactoring; tools: skill, glob / ✅ csharp-refactoring; tools: skill, read_bash, glob, stop_bash ✅ 0.17
csharp-refactoring Extract a repeated calculation into a private helper 2.0/5 → 1.7/5 🔴 ✅ csharp-refactoring; tools: grep, skill / ✅ csharp-refactoring; tools: grep, read_bash, skill ✅ 0.17 [1]
csharp-refactoring Consolidate a duplicated block into a single shared helper 2.0/5 → 1.7/5 🔴 ✅ csharp-refactoring; tools: glob, skill, bash / ⚠️ NOT ACTIVATED ✅ 0.17 [2]
csharp-refactoring Inline a pass-through wrapper and update callers 2.3/5 → 1.0/5 🔴 ✅ csharp-refactoring; tools: skill, bash / ⚠️ NOT ACTIVATED ✅ 0.17
csharp-refactoring Merge two near-identical types into one parameterized type 1.3/5 → 1.0/5 🔴 ✅ csharp-refactoring; tools: skill, edit / ⚠️ NOT ACTIVATED ✅ 0.17 [3]
csharp-refactoring Decline a framework and package upgrade dressed up as a refactor 1.0/5 → 1.0/5 ℹ️ not activated (expected) ✅ 0.17 [4]
csharp-refactoring Decline a new-feature request dressed up as a refactor 4.0/5 → 5.0/5 🟢 ℹ️ not activated (expected) ✅ 0.17 [5]
csharp-refactoring Keep behavior-changing bug fixes out of a behavior-preserving refactor 2.3/5 ⏰ → 3.3/5 ⏰ 🟢 ℹ️ not activated (expected) ✅ 0.17 [6]
dotnet-breaking-changes Answer a public-API question before consolidating duplicated parsing 2.3/5 → 2.3/5 ✅ dotnet-breaking-changes; tools: glob, skill / ⚠️ NOT ACTIVATED ✅ 0.12 [7]
dotnet-breaking-changes Add behavior to a shipped public member without breaking the contract 2.7/5 → 2.3/5 🔴 ⚠️ NOT ACTIVATED ✅ 0.12 [8]
dotnet-breaking-changes Rename a helper referenced from every #if branch of a multi-targeted type 3.3/5 → 2.7/5 🔴 ✅ dotnet-breaking-changes; tools: skill / ⚠️ NOT ACTIVATED ✅ 0.12 [9]
dotnet-breaking-changes Rename a member of a partial type that a generated part references 1.7/5 → 1.7/5 ⚠️ NOT ACTIVATED ✅ 0.12 [10]
dotnet-breaking-changes Add a new public method that must be correct on every target framework 2.0/5 → 2.0/5 ⚠️ NOT ACTIVATED ✅ 0.12 [11]
dotnet-breaking-changes Do not raise breaking-change concerns for a purely internal local rename 4.7/5 → 5.0/5 🟢 ℹ️ not activated (expected) ✅ 0.12 [12]

[1] ⚠️ High run-to-run variance (CV=214%) — consider re-running with --runs 5. (Isolated) Quality dropped but weighted score is +1.7% due to: tokens (79654 → 66925), time (82.4s → 64.0s)
[2] ⚠️ High run-to-run variance (CV=177%) — consider re-running with --runs 5
[3] ⚠️ High run-to-run variance (CV=895%) — consider re-running with --runs 5
[4] ⚠️ High run-to-run variance (CV=98%) — consider re-running with --runs 5. (Isolated) Quality unchanged but weighted score is -17.3% due to: judgment, quality
[5] ⚠️ High run-to-run variance (CV=379%) — consider re-running with --runs 5. (Isolated) Quality improved but weighted score is -0.9% due to: tokens (151034 → 171934)
[6] ⚠️ High run-to-run variance (CV=404%) — consider re-running with --runs 5. (Plugin) Quality improved but weighted score is -71.1% due to: quality, judgment, tokens (212959 → 255721)
[7] ⚠️ High run-to-run variance (CV=337%) — consider re-running with --runs 5
[8] ⚠️ High run-to-run variance (CV=1202%) — consider re-running with --runs 5
[9] ⚠️ High run-to-run variance (CV=97%) — consider re-running with --runs 5
[10] ⚠️ High run-to-run variance (CV=339%) — consider re-running with --runs 5. (Isolated) Quality unchanged but weighted score is -48.4% due to: judgment, quality
[11] ⚠️ High run-to-run variance (CV=213%) — consider re-running with --runs 5. (Isolated) Quality unchanged but weighted score is -15.4% due to: judgment, quality
[12] ⚠️ High run-to-run variance (CV=215%) — consider re-running with --runs 5

timeout — run(s) hit the (300s, 600s) 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 873 in dotnet/skills, download eval artifacts with gh run download 29270232281 --repo dotnet/skills --pattern "skill-validator-results-*" --dir ./eval-results, then fetch https://raw.githubusercontent.com/dotnet/skills/a5265d860095cbd1b989dcaa451c1716de027d77/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

@JanKrivanek JanKrivanek left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Since the skills have nontrivial size - the main concern now is overlap between the two skills + cross-loading cost. csharp-refactoring instructs the agent to also load dotnet-breaking-changes, and the two share material ("stop and escalate," public API, forwarders, partial/generated). The split is defensible (breaking-changes is meant to apply to features/fixes too, not just refactors), but loading two long skills for one refactor is a real context cost that the evals don't yet justify.

AbhitejJohn added a commit that referenced this pull request Jul 17, 2026
Trim study for PR #873: csharp-refactoring-trim is a ~30% shorter rewrite of csharp-refactoring (drops When-to-use/Inputs/Outputs boilerplate + verbose LSP launch prose, compresses the dbc-overlapping hazards section) while preserving every rubric-rewarded behavior. Adds a 'trimmed' experiment arm and bumps runs to 3 so CI generates baseline/skilled/trimmed trajectories for local cross-family re-judging. Eval-only scratch branch; not part of the PR.

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

Copilot-Session: 3c9f9823-7f2f-4f7d-9d1b-f2b9e7a20c60
@github-actions

Copy link
Copy Markdown
Contributor

👋 @AbhitejJohn — this PR has 1 unresolved review thread(s). When you're ready, please address the feedback and push an update; the triage bot will pick up the next state automatically. (Add the no-stale label to silence further pings.)

AbhitejJohn added a commit that referenced this pull request Jul 17, 2026
Robustness probe for the csharp-refactoring trim: all prior CI trajectories
were executed by claude-opus-4.6. Flip executor to gpt-5.5 (GPT family) and
CI judge to claude-opus-4.8 so the (executor, judge) pair stays cross-family.
Tests whether trimmed-vs-current non-inferiority holds under a different model
family. Eval-branch only; not on PR #873.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 3c9f9823-7f2f-4f7d-9d1b-f2b9e7a20c60
AbhitejJohn added a commit that referenced this pull request Jul 20, 2026
Closes the 'refactoring-only endpoint too narrow' risk flagged by the
cross-family rubber-duck. Adds two boundary stimuli never used in trim tuning:
  9. Separate a smuggled behavior change from a requested rename (rename +
     smuggled 10%->12% discount change) -> should separate/flag, not bundle.
 10. Recognize a behavior-changing simplification is not a refactor (remove
     free-shipping-over-\ rule under a 'cleanup' framing) -> should not
     silently change observable behavior.
Executor reverted to claude-opus-4.6 / judge gpt-5.5 (re-judge) to match the
stringent Confirm A family where boundary behavior looked weakest.
Eval-branch only; not on PR #873.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 3c9f9823-7f2f-4f7d-9d1b-f2b9e7a20c60
Replaces the shipped skill body with the validated v3 variant: judgment-first,
rigor proportional to blast radius, redundant catalog/list scaffolding removed.
~53% smaller (12,811->6,039 chars) with equal or better cross-family eval quality
and no measured regression. Description (929 chars) and all safety rules retained.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 3c9f9823-7f2f-4f7d-9d1b-f2b9e7a20c60
@github-actions

Copy link
Copy Markdown
Contributor

👋 @AbhitejJohn — this PR has 1 unresolved review thread(s). When you're ready, please address the feedback and push an update; the triage bot will pick up the next state automatically. (Add the no-stale label to silence further pings.)

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

Copilot-Session: 3c9f9823-7f2f-4f7d-9d1b-f2b9e7a20c60
Copilot AI review requested due to automatic review settings July 22, 2026 06:10
@AbhitejJohn

Copy link
Copy Markdown
Collaborator Author

@JanKrivanek — fair concern, thanks. I took the size + cross-loading cost seriously and did two things: trimmed both skills and ran a breadth eval to confirm the trims don't cost quality.

Size (SKILL.md bodies; the description frontmatter is unchanged, so activation/routing is held constant and only the in-context body shrank):

Skill Before After Δ
csharp-refactoring 12,617 ch / 193 ln 5,953 ch / 85 ln −53%
dotnet-breaking-changes 8,156 ch / 129 ln 6,425 ch / 98 ln −21%

Combined the two bodies drop ~40% (20.8k→12.4k chars), which directly cuts the "load two long skills for one refactor" cost you flagged. I removed duplicated prose — the When to use / When NOT to use / Related skills lists (already encoded in the description's USE FOR / DO NOT USE FOR) and the overlapping "stop and escalate" / hidden-surface narration that was repeated across both skills — while keeping the inspect-first procedure, the four hidden-surface sections, escalation, and all reference files.

Eval — does the trim hurt? 5 executor families (opus-4.8, gpt-5.5, sonnet-4.6, haiku-4.5, mai-flash), a 2-family judge ensemble (gpt-5.5 + claude-opus-4.8), blinded arm order, n=5, with a negative-control scenario per skill:

  • vs no-skill: both trimmed skills post a non-negative quality delta on all 5 families under both judges; reliably positive (95% bootstrap CI excludes 0) on opus-4.8 and gpt-5.5, directional-positive/flat on the rest. Negative controls stay ~0 — the skills don't over-trigger on work that isn't a compatibility hazard.
  • vs the previous larger versions: no family is reliably degraded by the trim. For dotnet-breaking-changes, gpt-5.5 and haiku-4.5 actually favor the smaller version (+0.13/+0.16 mean, CI>0); opus/mai flat; sonnet slightly negative but inconclusive. For csharp-refactoring the trim also avoids a mild mai regression the larger version showed.

Honest caveats: single self-authored fixture suite, small scenario counts (6 for dbc), and CIs are bootstrapped over trials — so treat the sub-significant deltas as suggestive rather than proof of broad generalization. I'm not claiming formal non-inferiority, only that the smaller versions hold up at least as well as the larger ones across every family I could measure.

On the split: I kept it deliberately (breaking-changes is meant to apply to features/fixes, not only refactors), but the shared material is now much thinner, so cross-loading is meaningfully cheaper. Re-triggering /evaluate on the pushed trims below.

@AbhitejJohn

Copy link
Copy Markdown
Collaborator Author

/evaluate

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: 34/34 changed files
  • Comments generated: 2

Comment thread tests/dotnet/dotnet-breaking-changes/src/Billing/Billing.csproj
Comment thread tests/dotnet/csharp-refactoring/src/Billing/Billing.csproj
@github-actions

Copy link
Copy Markdown
Contributor

❌ Evaluation failed. View workflow run

Rely on the SDK-default language version per pinned TFMs (net8.0;net10.0) so fixture compile behavior does not drift with the installed SDK. Both fixtures build clean (0 warnings/errors) without it. Addresses reviewer feedback.

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

Copilot-Session: 3c9f9823-7f2f-4f7d-9d1b-f2b9e7a20c60
Copilot AI review requested due to automatic review settings July 23, 2026 07:10
@AbhitejJohn

Copy link
Copy Markdown
Collaborator Author

/evaluate

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: 34/34 changed files
  • Comments generated: 2


## Partial types span files

A `partial class`/`record`/`struct` (and, since C# 13, `partial` properties/methods) is one type split
Comment on lines +123 to +133
# Multi-target gate: the new method must compile on BOTH net8.0 and net10.0.
- type: run_command_and_assert
command_to_run: "dotnet"
command_arguments: "build Fixture.sln -v:q"
expected_exit_code: 0
command_timeout: 300
# Existing behavior stays green after the additive change.
- type: run_command_and_assert
command_to_run: "dotnet"
command_arguments: "test Fixture.sln -v:q"
expected_exit_code: 0
@github-actions

Copy link
Copy Markdown
Contributor

❌ Evaluation failed. View workflow run

AbhitejJohn and others added 2 commits July 23, 2026 10:43
Picks up the Vally-harness eval migration (#877) and related infra so
the /evaluate workflow can discover and run this PR's evals.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 3c9f9823-7f2f-4f7d-9d1b-f2b9e7a20c60
…ally harness schema

Adapts both eval.yaml files from the legacy scenarios/assertions format to
the stimuli/graders/config schema introduced by #877 (Migrate LLM evals to
the Vally harness). Prompts and rubrics are preserved verbatim; assertions
map 1:1 to graders (file_contains->file-contains, run_command_and_assert->
run-command, output_matches->output-matches) and copy_test_files->
environment.files. Validated with `vally experiment run --dry-run`: both evals
now resolve and match the experiment filter (previously matched none).

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 3c9f9823-7f2f-4f7d-9d1b-f2b9e7a20c60
Copilot AI review requested due to automatic review settings July 23, 2026 18:01
@AbhitejJohn

Copy link
Copy Markdown
Collaborator Author

/evaluate

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

Comments suppressed due to low confidence (8)

tests/dotnet/csharp-refactoring/eval.yaml:62

  • file-contains graders use value: (not substring:). Using substring: here may cause the assertion to be ignored.
      - type: file-contains
        config:
          path: src/Billing/OrderProcessor.cs
          substring: private

tests/dotnet/csharp-refactoring/eval.yaml:92

  • file-contains graders use value: (not substring:). Using substring: here may cause the assertion to be ignored.
      - type: file-contains
        config:
          path: src/Billing/OrderProcessor.cs
          substring: private

tests/dotnet/csharp-refactoring/eval.yaml:157

  • file-not-contains graders use value: (not substring:). Using substring: here may cause the assertion to be ignored.
      - type: file-not-contains
        config:
          path: src/Billing/Pricing.cs
          substring: class GoldPricing
      - type: file-not-contains
        config:
          path: src/Billing/Pricing.cs
          substring: class SilverPricing

tests/dotnet/dotnet-breaking-changes/eval.yaml:50

  • file-contains graders use value: (not substring:). With substring: the grader may ignore the match and the scenario can pass/fail incorrectly.
      - type: file-contains
        config:
          path: src/Billing/PublicAPI.Shipped.txt
          substring: ParseIntSetting

tests/dotnet/dotnet-breaking-changes/eval.yaml:76

  • file-contains graders use value: (not substring:). With substring: the grader may ignore the match and the scenario can pass/fail incorrectly.
      - type: file-contains
        config:
          path: src/Billing/PlatformInfo.cs
          substring: FormatLabel

tests/dotnet/dotnet-breaking-changes/eval.yaml:118

  • file-contains graders use value: (not substring:). With substring: the grader may ignore the match and the scenario can pass/fail incorrectly.
      - type: file-contains
        config:
          path: src/Billing/Coupons.cs
          substring: Apply
      # Positive check that the fix went to the GENERATOR INPUT (the template),
      # which is where the generated part's reference to the renamed member lives.
      # Hand-editing the obj/ output would be overwritten on the next build.
      - type: file-contains
        config:
          path: src/Billing/Coupons.g.cs.template
          substring: Apply

tests/dotnet/dotnet-breaking-changes/eval.yaml:147

  • file-contains graders use value: (not substring:). With substring: the grader may ignore the match and the scenario can pass/fail incorrectly.
      - type: file-contains
        config:
          path: src/Billing/PlatformInfo.cs
          substring: Tag

tests/dotnet/dotnet-breaking-changes/eval.yaml:181

  • file-contains graders use value: (not substring:). With substring: the grader may ignore the match and the scenario can pass/fail incorrectly.
      - type: file-contains
        config:
          path: src/Billing/OrderProcessor.cs
          substring: runningTotal
  • Files reviewed: 34/34 changed files
  • Comments generated: 5

Comment thread tests/dotnet/csharp-refactoring/eval.yaml Outdated
Comment thread tests/dotnet/csharp-refactoring/eval.yaml Outdated
The #1 way a "rename" silently corrupts code is editing textual matches (comments, strings, unrelated
overloads) instead of real **bindings**. Find every binding reference first, then edit semantically. Use
the strongest tool available: an IDE/Roslyn workspace refactoring, then the C# LSP the
[`dotnet` plugin declares](https://github.com/dotnet/skills/blob/main/plugins/dotnet/lsp.json)
Comment thread tests/dotnet/dotnet-breaking-changes/eval.yaml Outdated
Comment on lines +1 to +8
name: dotnet-breaking-changes
description: Evaluates the dotnet/dotnet-breaking-changes skill
type: capability
config:
timeout: 15m
stimuli:
- name: Answer a public-API question before consolidating duplicated parsing
prompt: "Is `AppSettingsHelper` part of the public API anywhere? Its int/bool setting parsing looks duplicated with `ConfigReader`. If it's safe to do, consolidate the setting parsing into one place and update the callers, without changing behavior. The solution is at Fixture.sln."
@github-actions

Copy link
Copy Markdown
Contributor

❌ Evaluation failed. View workflow run

…ot 'substring'

The Vally file-contains and file-not-contains graders require the config key
'value' (per the schema and all main eval.yaml files); 'substring' is rejected
with [invalid-grader-config]. Verified with `vally lint --eval-spec`: both evals
now lint with 0 errors, matching main's passing evals (only the benign
scoring-defaults + config-deprecation warnings that main evals also emit).

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 3c9f9823-7f2f-4f7d-9d1b-f2b9e7a20c60
Copilot AI review requested due to automatic review settings July 23, 2026 18:15
@AbhitejJohn

Copy link
Copy Markdown
Collaborator Author

/evaluate

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: 34/34 changed files
  • Comments generated: 0 new

@github-actions

Copy link
Copy Markdown
Contributor

📊 Skill Evaluation Results

2 skill(s) evaluated — 0 improved, 2 no credible improvement. A skill passes only on a credible improvement over baseline (mean preference > 0 with its 95% CI above 0).

Skill Result Δ Preference [95% CI] W/T/L Quality Baseline
csharp-refactoring +0.0% [+0.0%, +0.0%] 0/8/0 3.5/5 3.2/5
dotnet-breaking-changes +0.0% [+0.0%, +0.0%] 0/6/0 4.5/5 4.1/5

🔍 Full Results - additional metrics and failure investigation steps

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

For PR 873 in dotnet/skills, download eval artifacts with gh run download 30032912669 --repo dotnet/skills --pattern "vally-results-*" --dir ./eval-results, then fetch https://raw.githubusercontent.com/dotnet/skills/70fdd8c5ff5d3dd509a8be940c37f60cb7dad8ca/eng/vally-adapter/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

@github-actions

Copy link
Copy Markdown
Contributor

👋 @AbhitejJohn — this PR has 5 unresolved review thread(s). When you're ready, please address the feedback and push an update; the triage bot will pick up the next state automatically. (Add the no-stale label to silence further pings.)

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

Labels

waiting-on-author PR state label

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants