Make performance eval criteria outcome-focused - #905
Conversation
There was a problem hiding this comment.
Pull request overview
This PR updates the dotnet-diag performance skill evaluation to reduce overfitting in scenarios 8 and 9 by making rubrics more outcome-focused, and adjusts the skill guidance to reduce unnecessary reference loading and tool-call overhead during focused reviews.
Changes:
- Rewrote scenarios 8 and 9 prompts/rubrics in both canonical and Vally evals toward independently evaluable, outcome-focused criteria.
- Updated
analyzing-dotnet-performanceskill workflow guidance to emphasize “read source first”, load references only when needed, and batch confirmation searches.
Show a summary per file
| File | Description |
|---|---|
| tests/dotnet-diag/analyzing-dotnet-performance/eval.yaml | Updates scenario 8/9 prompts and rubrics to be less technique/vocabulary-specific. |
| tests/dotnet-diag/analyzing-dotnet-performance/eval.vally.yaml | Mirrors the scenario 8/9 prompt/rubric updates for Vally parity. |
| plugins/dotnet-diag/skills/analyzing-dotnet-performance/SKILL.md | Adjusts workflow guidance to reduce reference loading and tool-call overhead. |
Copilot's findings
Tip
Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
- Files reviewed: 3/3 changed files
- Comments generated: 6
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: a3f05d40-8857-47f5-8fd0-203f82ac3f90
fbd56c8 to
0b7ae60
Compare
Skill Validation Results
[1]
Model: claude-opus-4.6 | Judge: claude-opus-4.6 🔍 Full Results - additional metrics and failure investigation steps
▶ Sessions Visualisation -- interactive replay of all evaluation sessions |
|
✅ Evaluation passed for |
|
|
||
| - name: "Catches LINQ on hot-path string processing and All(char.IsUpper)" | ||
| prompt: "These string humanization extensions are called on every user-facing string in a CMS rendering pages with hundreds of dynamic strings. Analyze for performance issues." | ||
| prompt: "These string humanization extensions are called on every user-facing string in a CMS rendering pages with hundreds of dynamic strings. Analyze for performance issues and provide recommendations without modifying the fixture." |
There was a problem hiding this comment.
Could we add a rubric criterion that verifies the response only provides recommendations and does not modify the fixture? The prompt now makes non-modification an explicit requirement, but exit_success and the current rubric do not detect violations, so a run can edit the fixture and still pass. This would also match the enforcement used by comparable analysis-only evals.
|
👋 @artl93 — 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 |
…mance-skill-quality # Conflicts: # tests/dotnet-diag/analyzing-dotnet-performance/eval.vally.yaml # tests/dotnet-diag/analyzing-dotnet-performance/eval.yaml
Skill Coverage Report
Uncovered:
|
There was a problem hiding this comment.
Copilot's findings
Comments suppressed due to low confidence (2)
tests/dotnet-diag/analyzing-dotnet-performance/eval.yaml:160
- Scenario name still includes technique/vocabulary-specific terms (LINQ/All) even though the grader gates were removed and the rubric is now outcome-focused. Renaming the scenario helps keep the evaluator aligned with the PR’s intent and avoids reintroducing vocabulary bias in reporting/diagnostics.
- name: Catches LINQ on hot-path string processing and All(char.IsUpper)
tests/dotnet-diag/analyzing-dotnet-performance/eval.yaml:178
- Scenario name still calls out LINQ specifically, but the updated evaluation criteria no longer depend on LINQ terminology. Consider renaming to describe the measured outcomes (avoidable intermediate enumeration/materialization) so the scenario label matches the new rubric.
- name: Detects LINQ pipeline in TimeSpan formatting and collection processing
- Files reviewed: 1/1 changed files
- Comments generated: 0 new
|
/evaluate |
📊 Skill Evaluation Results1 skill(s) evaluated — 1 improved, 0 no credible improvement. A skill passes only on a credible improvement over baseline (mean preference > 0 with its 95% CI above 0).
🔍 Full Results - additional metrics and failure investigation steps ▶ Sessions Visualisation -- interactive replay of all evaluation sessions |
|
👋 @artl93 — 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 |
Part of #886
Purpose and result
This PR is only an evaluator de-overfitting change. Its intended effect is to preserve the existing skill outcome while removing vocabulary-dependent grading, so a separate future performance-skill update can be measured against a frozen, comparable evaluator. It does not attempt to improve the skill or its score.
A fresh matched A/B evaluated only
dotnet-diag/analyzing-dotnet-performance, with three repetitions across Opus, GPT, Sonnet 4.6, Haiku, and MAI:maineval, head4cf1d895a594309980c08c82a1f0a961892472ea773d6b5342b080e46d92e9db3c109814e1afadc6e979a63e0096469cd7ca1f3b3253f9f265f65e9899dc46354b4611768d9a22eval.yamlandeval.vally.yamldifferedOutcome parity
Both runs emitted all 330 expected raw records. All ten family jobs succeeded and there were zero pairwise-judge errors. Aggregate family conclusions varied where raw trajectories hit the three-minute limit; those timeout, activation, and tool-call differences also appeared in unchanged scenarios and are treated as run noise, not evaluator or skill impact.
Overfitting removed
In the 56 completed current-eval outputs for scenarios 8–9, literal
LINQ,All, andWherechecks passed 84/85 times. The sole miss was a demonstrated false negative: MAI's skilled scenario 9 trial 2 passedexit_successand all 5/5 substantive rubric criteria, but failed overall only because its final prose omittedWhere.The revised eval:
exit_successfor all 60 scenario 8/9 outputsWherefalse negative and the same structural risk fromLINQ/AllConclusion: the revised evaluator preserves the existing aggregate skill outcome while removing observed and structural vocabulary overfit. That is the sole purpose of this PR and prepares a stable measuring instrument for the separate skill update.
Changes
LINQ,All, andWhereoutput gates withexit_successeval.yamland Vallyeval.vally.yamlsemantics alignedValidation
skill-validator checkpasses fordotnet-diaggit diff --checkpasseseval.yamlandeval.vally.yamlThe PR remains draft.