Remove vocabulary gates from performance eval - #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 |
|
👋 @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 |
|
👋 @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 |
|
👋 @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 |
|
👋 @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 |
|
Hi @artl93 — friendly ping on this PR when you get a chance! Happy to help if needed. |
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: a3f05d40-8857-47f5-8fd0-203f82ac3f90
There was a problem hiding this comment.
Copilot's findings
Suppressed comments (1)
tests/dotnet-diag/analyzing-dotnet-performance/eval.yaml:173
- This rubric item references
match.Value.ToLower(), but in the fixture (fixtures/string-humanize-and-dehumanize.cs) the per-match allocation isvalue.ToLower()(wherevalueis assigned frommatch.Value). Using the exact expression from the fixture keeps the criterion code-grounded and avoids confusion during grading.
- Identifies match.Value.ToLower() inside the projection as a per-match string allocation
- Files reviewed: 1/1 changed files
- Comments generated: 0 new
📊 Skill Evaluation Results1 skill(s) evaluated — ✅ 1 improved, ❌ 0 no credible change, 🔻 0 regressed. A skill passes only on a credible net win over baseline: more wins than losses, by an exact one-sided sign test at
ℹ️ Column legend
Per-scenario details for 1 skill(s) were omitted to keep this comment under GitHub's 65,536-character limit — open the job's step summary or Full Results for the complete breakdown. 🔍 Full Results - additional metrics and failure investigation steps ▶ Sessions Visualisation -- interactive replay of all evaluation sessions |
|
✅ Evaluation passed for |
Part of #886
Purpose
Remove vocabulary overfit from scenarios 8 and 9 without weakening or broadening the concrete performance findings they measure. This PR changes only the evaluator; it does not change
analyzing-dotnet-performanceitself.The expected outcomes remain directly verifiable against the fixture code: repeated enumeration, delegate and array allocation, per-match string allocation, params-array allocation, static initialization allocation, and existing span-based positive patterns. Correct responses no longer have to use the words
LINQ,All, orWhereto receive credit.Changes
LINQ,All, andWhereoutput gatesEvidence
A matched evaluator A/B held the skill and workflow byte-identical across three repetitions and five model families:
The aggregate skilled-vs-baseline result remained effectively unchanged: +0.258 control versus +0.265 treatment. Unchanged scenarios differed by +0.027, establishing a larger stochastic-noise floor than the aggregate +0.007 movement.
The control produced one concrete vocabulary-only false negative: a successful MAI scenario 9 response passed
exit-successand all 5/5 substantive rubric criteria but failed solely because its final prose omittedWhere. This directly supports removing the hard vocabulary gate.That A/B preceded the final rubric refinement in
e4f6235e; it supports the gate removal, not a claim that the exact final wording improves scores. The final wording was deliberately moved back toward the original code-grounded findings after review.Validation
skill-validator check --plugin plugins/dotnet-diagpassesgit diff --checkpassestests/dotnet-diag/analyzing-dotnet-performance/eval.yaml