Files
Abhitej John 78054c1161 Migrate LLM evals to the Vally harness (#877)
* Make Vally the sole LLM eval engine, retiring skill-validator evaluate

Collapses the parallel skill-validator + Vally eval pipeline into a single
Vally-only path while preserving every capability skill-validator provided:
PR gate, PR comment, dotnet/skills-data historical push, and the dashboard.
The skill-validator `check` linter is retained (skill-check.yml) pending
microsoft/vally #463.

- evaluation.yml: delete build-validator and the skill-validator `evaluate`
  job; single `evaluate:` job now uses vally-evaluation.yml. Forward the
  COPILOT_PAT_0..9 pool onto it (from #911) so the reusable workflow's token
  gate is satisfied. Rewire comment-on-pr / report-status / publish-* /
  deploy-dashboard onto `evaluate` and vally-results-* artifacts.
- vally-evaluation.yml: pin @microsoft/vally-cli@0.9.0; keep the #911 prepare
  guard; write the generated per-plugin experiment to $GITHUB_WORKSPACE so
  relative eval globs resolve.
- adapt.mjs: reconcile #887's runCompareWithRetry + conclusive/unmatched
  hardening with the consolidation helpers (nonActivation, compareByStim,
  roleToDashboard, etc.). Add consolidate.mjs and gen-experiment.mjs.
- build-replay-sessions.ps1: read Vally executor-session-logs/events.jsonl
  instead of skill-validator session output.
- Rename all tests/*/*/eval.vally.yaml to eval.yaml (Vally format is now the
  only eval format); author Vally evals for the four skills that lacked one.
- CONTRIBUTING.md + InvestigatingResults: point contributors at the Vally
  harness; drop non-public links.

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

* Fix setup-local-sdk eval for Vally schema

The hand-authored setup-local-sdk eval used skill-validator grader/environment
schema that Vally rejects at validation (no stimuli executed):
- file-contains/file-not-contains graders require 'value:' not 'substring:'
  (output-contains correctly keeps 'substring:').
- environment.files entries require 'src:'/'dest:' (copy a fixture) rather than
  inline 'path:'/'content:'. Moved the global.json body into fixtures/global.json.

Verified with 'vally lint --eval-spec' (0 errors) across all 97 eval.yaml.

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

* Fix markdownlint violations in migration docs

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

* Address PR review feedback on eval migration

- Consolidate run-vally-evals.sh into a single neutral entrypoint
  eng/run-skill-evals.sh (deletes the thin wrapper; adapt.mjs stays in
  eng/vally-adapter/ since CI invokes it directly)
- Rename reusable workflow vally-evaluation.yml -> evaluation-run.yml and
  update all references/self-trigger regexes
- Rename local output dir vally-results -> eval-results
- Bake prerequisite preflight (Node 20+, GITHUB_TOKEN/gh) into the runner
- Simplify CONTRIBUTING "Running tests locally" prerequisites
- Scrub harness name from consumer-facing surfaces

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

* Reinstate overfitting detection under the Vally harness

Overfitting detection previously ran inside skill-validator's `evaluate`
command, which the Vally migration replaced, so it silently stopped running.
Reinstate it as a standalone step wired into the Vally pipeline:

- Add `skill-validator overfitting` command that discovers skills, parses
  each eval.yaml, runs the existing OverfittingJudge, and emits
  [{plugin, skill, overfittingResult}] JSON (per-skill failures non-fatal,
  bounded parallelism).
- Add a Vally-format parser bridge (ParseEvalConfigFlexible) so the judge
  handles the current stimuli/graders eval.yaml format; the legacy
  scenarios-only parser rejected all 98 evals, so the judge never ran.
- adapt.mjs: merge overfitting results onto each verdict via
  --overfitting <file> (keyed by plugin/skill); output is byte-identical
  when the flag is absent.
- evaluation-run.yml: build skill-validator (shared cache with check),
  run the judge per leg reading GITHUB_TOKEN, and pass --overfitting to
  adapt.mjs so the dashboard/skills-data consume it unchanged.

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

* Reconcile #919 Vally eval configs into the sole eval.yaml convention

PR #919 landed on main adding fresh Vally specs for three coverage-gap
skills (setup-local-sdk, convert-blazor-server-to-webapp, dotnet-webapi)
under the interim eval.vally.yaml filename. This branch collapses to a
single Vally spec named eval.yaml, so the merge left each skill with both
my migrated eval.yaml and #919's newer eval.vally.yaml (a git-clean but
semantic duplicate the pipeline would not discover).

Adopt #919's reviewed Vally content as the canonical eval.yaml for all
three skills and drop the redundant eval.vally.yaml files, preserving the
'sole eval.yaml, zero eval.vally.yaml' invariant. Content is byte-identical
to #919's blobs (b14121c6 / 47d43823 / 18a9362f), which already passed
vally-evaluate on main.

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-07-21 15:22:31 -07:00

87 lines
4.1 KiB
YAML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
name: exp-simd-vectorization
description: Evaluates the dotnet-experimental/exp-simd-vectorization skill
type: capability
config:
timeout: 3m
stimuli:
- name: Optimize manual min/max with TensorPrimitives
prompt: This .NET 10 project has a method that finds the minimum and maximum values in a float array. It's used in a
real-time sensor monitoring system to compute value ranges over sliding windows of 10K–100K readings. Please
optimize FindMinMax for maximum throughput.
environment:
files:
- src: fixtures/simd-tensor-primitives-minmax.cs
dest: RangeCalculator.cs
graders:
- type: exit-success
- type: prompt
rubric:
- Identifies that finding min and max of a float span is already covered by TensorPrimitives.Min and
TensorPrimitives.Max
- Replaces the scalar loop with TensorPrimitives.Min/Max or equivalent framework API — not manual SIMD
- Does not introduce Vector128/Vector256/Vector512 intrinsics for operations already optimized by TensorPrimitives
- name: Optimize manual product with TensorPrimitives
prompt: This .NET 10 project computes the product of all elements in a float array for probability calculations. Arrays
are 100-1000 elements. Please optimize Product for maximum throughput.
environment:
files:
- src: fixtures/simd-tensor-primitives-product.cs
dest: MathOps.cs
graders:
- type: exit-success
- type: prompt
rubric:
- Identifies that aggregate product is already covered by TensorPrimitives.Product
- Replaces the scalar loop with TensorPrimitives.Product — not manual SIMD
- Does not introduce Vector128/Vector256/Vector512 intrinsics for an operation already optimized by
TensorPrimitives
- name: No optimization opportunity — dictionary-based lookup service
prompt: This .NET 10 project is a product catalog lookup service that maps product codes to categories using
dictionaries. The development team suspects it could benefit from SIMD optimization. Please analyze and optimize
for maximum throughput.
environment:
files:
- src: fixtures/simd-no-opportunity-catalog.cs
dest: ProductCatalog.cs
graders:
- type: exit-success
- type: prompt
rubric:
- Correctly identifies that this code has no meaningful SIMD optimization opportunity
- Explains why SIMD is not applicable (dictionary lookups, hash-based operations, small string keys, branching
logic)
- Does not introduce unnecessary SIMD code that adds complexity without benefit
- name: Optimize int array conditional increment with SIMD
prompt: This .NET 10 project conditionally increments each element of an int array based on a threshold for counter
updates. Arrays are 100K+ elements. Please optimize ConditionalIncrement.IncrementAbove for maximum throughput.
environment:
files:
- src: fixtures/simd-conditional-increment.cs
dest: ConditionalIncrement.cs
graders:
- type: output-contains
config:
substring: Vector
- type: exit-success
- type: prompt
rubric:
- Introduces Vector128/Vector256/Vector512 with GreaterThan comparison mask and ConditionalSelect or masked Add
for conditional increment
- Preserves scalar fallback for trailing elements or non-accelerated hardware
- name: Optimize byte buffer bit reversal with SIMD
prompt: This .NET 10 project reverses the bit order of each byte in a buffer for serial protocol decoding. Buffers are
64KB+. Please optimize BitReverser.ReverseInPlace for maximum throughput.
environment:
files:
- src: fixtures/simd-bit-reverser.cs
dest: BitReverser.cs
graders:
- type: output-contains
config:
substring: Vector
- type: exit-success
- type: prompt
rubric:
- Introduces Vector128/Vector256/Vector512 with nibble-based Shuffle lookup tables for parallel bit reversal
- Preserves scalar fallback for trailing elements or non-accelerated hardware