Flag reference skills that carry a direct-activation eval (#899) - #983
Merged
Merged
Conversation
`disable-model-invocation: true` drops a skill from the CLI's `<available_skills>` menu, so the experiment's skilled arm -- which loads exactly one skill -- cannot reach it either. The gate already reasoned about this, but `report_uncovered()` skipped any skill that had an eval, so it only reported the *better* case (no eval, visibly zero evidence) and stayed silent on the worse one (an eval scoring baseline against baseline and labelling the result a pass or a fail). Two evals landed in that blind spot after the reasoning was written down: tests/dotnet-test/platform-detection (#974) and tests/dotnet-test/filter-syntax (#976). Both READMEs still described them as deliberately un-evaluated. - report reference skills that carry a direct eval, naming the spec - self-test both sides of the trigger via a new silent_case helper - correct eng/eval-quality/README.md and plugins/dotnet-test/README.md Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 3d666b74-a00f-4ed0-a3ce-2d3427cf0d23
Contributor
Skill Coverage Report
|
Contributor
There was a problem hiding this comment.
Pull request overview
This PR tightens the eval-quality gate’s coverage reporting for reference skills (disable-model-invocation: true) by flagging the worse state: reference skills that nevertheless ship a direct-activation eval, which produces a baseline-vs-baseline “verdict” (judge noise) that can pollute plugin pass rates. It also updates documentation and adds self-tests to pin both the “warning fires” and “warning stays quiet” behaviors.
Changes:
- Update
report_uncovered()to warn when a reference skill has a direct eval, naming the specific offendingtests/<plugin>/<skill>/eval.yaml. - Extend eval-quality self-tests with a new
silent_case()helper and two cases that assert both sides of the warning trigger. - Refresh documentation to describe “skill eval coverage” and the specific “reference skill with direct eval” warning, and fix the dotnet-test README’s now-stale exception list.
Show a summary per file
| File | Description |
|---|---|
eng/eval-quality/check_eval_quality.py |
Splits the “skill has eval” branch to additionally warn on reference skills that carry direct-activation evals, listing offending specs. |
eng/eval-quality/selftest_eval_quality.py |
Adds silent_case() and two targeted self-tests to ensure the new warning triggers only when appropriate. |
eng/eval-quality/README.md |
Updates the warning documentation to cover both “no eval” and “degenerate direct eval” cases for reference skills. |
plugins/dotnet-test/README.md |
Updates plugin documentation to reflect that platform-detection and filter-syntax are the two current direct-eval exceptions. |
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
enabled auto-merge (squash)
August 3, 2026 08:42
YuliiaKovalova
approved these changes
Aug 3, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Reviewing #899 for closure turned up one defect that is still live on
main, in the gate rather than in a skill.disable-model-invocation: truedrops a skill from the CLI's<available_skills>menu —skill-validatorexcludes such skills from the menu budget entirely, so the model never sees the name or the description. The experiment'sskilledvariant loads exactly one skill:so for a reference skill the skilled arm is the baseline arm.
eng/eval-quality/README.mdandcheck_eval_quality.py::_is_reference_skillboth already spell this out.The gate acts on only half of it.
report_uncovered()skipped any skill that had an eval:That reports the better case — a reference skill with no eval, which is visibly zero evidence — and stays silent on the worse one: a reference skill with a direct eval, which emits a fabricated pass/fail into the plugin's pass rate. Two of those landed after the reasoning was committed:
tests/dotnet-test/platform-detection/eval.yamltests/dotnet-test/filter-syntax/eval.yamlBoth are the only instances repo-wide, so the new warning's blast radius is exactly two lines.
Changes
check_eval_quality.py— split theskill in evalsbranch so a reference skill with a direct eval is collected and reported, naming the offending spec. It is a warning, not an error: whether to retire those two evals or keep them pending a real result is a judgement call for the owners, and the gate's convention is that judgement calls report rather than block.selftest_eval_quality.py— anoutput_caseproving the warning fires, plus a newsilent_casehelper proving it stays quiet for a model-invocable skill with the same eval. A warning that fires on well-formed input is worse than no warning, so both sides of the trigger are pinned. 22 → 24 self-tests.eng/eval-quality/README.md— the "Skills with no eval" section became "Skill eval coverage" and now documents both halves. Its callout saidfilter-syntaxwas the sole exception; that stopped being true when Fix migrate-mstest-v1v2-to-v3 activation and test-skill eval quality #974 landed.plugins/dotnet-test/README.md— said three of the four reference skills "deliberately have notests/dotnet-test/<skill>/eval.yaml", namingplatform-detectionamong them. Close the remaining dotnet-test eval follow-ups (#899) #971 wrote that text but merged after Fix migrate-mstest-v1v2-to-v3 activation and test-skill eval quality #974 had already added the eval, so it shipped stale.Neither eval is deleted here. #976's stimuli are ordinary user requests graded on whether the answer carries the right syntax, which is a defensible attempt at the problem — it has simply never produced a verdict (it ran during the PAT-pool outage, and no cross-family run has covered either eval since). Surfacing it is the change that lets the owners decide on evidence.
Related issue
Found while reviewing #899. Does not close it — the remaining blocker there is a cross-family re-run on the merged tree, and the
executors/runsdispatch inputs still live only on the unmerged #920 branch.Validation
python eng/eval-quality/selftest_eval_quality.py— all 24 pass, including the two new cases.python eng/eval-quality/check_eval_quality.py—No errors; the new warning lists exactlydotnet-test/filter-syntaxanddotnet-test/platform-detection, and the pre-existing "2 reference skill(s) have no eval" warning is unchanged.python eng/eval-quality/check_eval_quality.py --base-ref origin/main(what CI runs on a PR) —No errors.disable-model-invocation: trueto confirm the fourdotnet-testskills are the only reference skills in the repo, so no other plugin gains a warning.Checklist
eng/known-domains.txtfor any new external domains referenced by skill content.On the last three: no ownership moved, no plugin metadata changed (
plugin.jsonuntouched, only the plugin README's prose), and no external domains are referenced.