Add eval-review skill/eval quality checker (eng/vally-graders)#913
Draft
AbhitejJohn wants to merge 1 commit into
Draft
Add eval-review skill/eval quality checker (eng/vally-graders)#913AbhitejJohn wants to merge 1 commit into
AbhitejJohn wants to merge 1 commit into
Conversation
Adds a standalone, repo-local checker that reviews skill+eval quality before merge: four free static graders (eval-deleading, assertion-hardening, meta-commentary, negative-scenario) plus one opt-in real-model LLM grader (eval-review) for the judgment dimensions. Enforcement runs via the review.mjs runner, gated on PRs as free static-only steps in the existing skill-check.yml check job (changed units only). The graders are also exported as Vally-compatible Grader objects via registerGraders for future use; Vally does not currently enforce custom graders (documented, not a regression). Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 365dd5fb-86a9-4628-9b14-7e6ec7053072
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.
What this is
A standalone, repo-local
eval-reviewskill/eval quality checker undereng/vally-graders/. It reviews the quality of skills and their evals before merge and reports findings as[SEVERITY] dimension (rule) — file:line / PROOF / WHY / FIX.Graders:
eval-deleadingassertion-hardeningrun_command_and_assert/file_contains/exit_success) — a wrong edit can still passmeta-commentarynegative-scenarioDO NOT USE FORexclusion with no eval scenario assertingexpect_activation: falseeval-reviewEnforcement path: the four static graders run via the
review.mjsrunner, gated on PRs as free, static-only steps in the existingcheckjob ofskill-check.yml(no new workflow), scoped to changed units only. A run-all path is available viareview.mjs --all(CI toggleEVAL_REVIEW_ALL=1).Vally compatibility (documented, not a regression): the graders are also exported as Vally-compatible
Graderobjects viaregisterGraders(registry), sovally eval/grade --grader-plugin ./eng/vally-graderscan load them. But Vally does not currently enforce these graders in this repo's flow:vally lint --grader-plugindoes not execute custom static graders against skills (its lint registry only holds built-ins; the plugin registry is used only to validate gradertypes in an eval spec), andvally experiment run— this repo's actual eval path — has no--grader-pluginoption. This is why enforcement is standalone viareview.mjs. Seeeng/vally-graders/README.md.The paid LLM grader is excluded from the free PR gate — it runs only behind an explicit
review.mjs --llmopt-in.Proven vs. inferred (honest scope)
npm test→ 20/20 pass (includes 5 LLM tests; also proves the checker works with the optional@github/copilot-sdk/zoddeps omitted, via a hand-rolled schema fallback).file:lineproof.@github/copilotruntime binary the SDK spawns, so a live judge reply could not be produced here. Critically, the grader correctly returned an inconclusive NOTE rather than a fabricated finding — which is the designed, safe behavior. CI never runs the LLM path.Demo results
node eng/vally-graders/review.mjs --llm --unit migrate-mstest-v3-to-v4— real code path. Representative static findings (quoted proof):And the LLM grader degraded gracefully (no false finding):
Aggregate (full
review.mjs --all, 97 units)0 BLOCKER · 73 MAJOR · 153 MINOR · 0 INFO → verdict: Fix-then-ship.
Per-dimension MAJOR breakdown:
assertion-hardening: 27 MAJOR (all indotnet-test-migration), 130 MINORnegative-scenario: 46 MAJOR, 22 MINOReval-deleading: 1 MINORmeta-commentary: 0These findings are pre-existing, not introduced by this PR
The 73 MAJOR are pre-existing eval-quality issues surfaced by the new checker, not defects this PR adds. The gate is deliberately set up so it won't retroactively fail existing skills:
assertion-hardeningandmeta-commentaryare enforced (blocking); the noisiereval-deleadingandnegative-scenariorun report-only (warnings) during rollout. So of the 73 MAJOR, only the 27assertion-hardeningMAJOR (all indotnet-test-migration) are blocking — and only if a PR actually touches those units, which is the intended behavior (fix-forward). The remaining 46negative-scenarioMAJOR surface as non-blocking warnings.Enforcement can be tightened later by dropping the
--report-onlyflags as each dimension's backlog is burned down.Notes
.mjs), matchingeng/conventions;js-yamlis the only required runtime dep.@github/copilot-sdk+zodare optional deps used only by--llm.is_infrachange-globs inevaluation.yml(those trigger full model evals; the graders aren't in Vally's eval path, so it would burn eval budget for zero signal). Grader changes are covered bynpm testin thecheckjob.skill-check.ymlvalidated with actionlint v1.7.7 (exit 0).