Vally 0.8.0
Released on 2026-07-08.
Features
- New
vally oraclecommand — verifies an eval harness against a stimulus’sgolden_patchwithout running an agent. It materializes the starting environment, applies the patch, and runs the graders;--no-golden-patchgrades the unpatched baseline as a sanity check (which should fail). (#615) - New
vally experiment merge <shard-dir>... -o <merged-dir>— reconciles the per-shard outputs of a shardedvally experiment runinto one authoritative result (concatenated per-variantresults.jsonl, regeneratedrun-summary.jsonl, mergedplan-snapshot.json, a singlereport.md, and a promotedexperiment-manifest.json), with a specific error per validation failure mode. Completes end-to-end experiment sharding. (#626) - New Backend plugin type — separates the compute environment (where a trial runs) from the executor (the agent that runs it).
vally evalandvally experiment runaccept--backend <name-or-package>and repeatable--backend-args <key=value>; the built-inlocalbackend is the default. Backends register viaregisterBackends(registry)and implementprepare/runTrial/shutdown. (#584) - New
@microsoft/vally-executor-ccaexecutor plugin — runs the Copilot Coding Agent (CCA) V3 binary as a local executor, converting its events JSONL stream into a Vally trajectory. Single-turn in v1. (#642, #650) - New
custom-metricsgrader — asserts on arbitrary numeric/boolean/string signals a run writes to a JSON file (default<workspace>/custom_metrics.json), beyond Vally’s built-in trajectory metrics. (#487) - New
transcript-containsandtranscript-matchesgraders (plus-not-variants) — assert on any assistant message produced during a run, not just the finaloutput. (#627) - Trajectory graders accept an optional
scope(parent,subagent, or{ agent: "<name>" }) to assert on a specific agent’s behavior rather than the whole run; composes with the existingturnfield. (#647) tool-callsgrader gains aparallelpredicate — passes only when a set of matching calls all occur within a single model-response batch (one agent step). (#636)panelgrader: addedunanimousaggregation strategy (mean score with strict all-pass verdict). (#632)panelgrader: added structured per-criterion aggregation viacriteria+overall_threshold, supporting per-criterionpass_threshold,weight, and advisory criteria (required: false). (#632)- Tool-call simulation — a stimulus can declare canned responses for first-party tools (
simulation.tool_overrides) so the agent runs against a deterministic, mocked toolset, enabling side-effect-free behavioral evals. (#648) - A stimulus can declare a
supported_executorsallow-list; in a mixed run, stimuli incompatible with the active executor are skipped (not failed), with anexecutor-skip-alldiagnostic when a filter removes everything. (#489) vally experiment runnow preserves per-trial executor session logs, matchingvally eval. (#621)
Breaking
vally evalandvally experiment runflatten preserved executor session logs: theexecutor-session-logs/level is removed and each trial collapses into a single directory named by its 0-based trial number, nested as<eval>/<stimulus>/<model>/<trial>/(experiment runs prepend a<variant>/segment). Retries append__attempt-<m>(first attempt unsuffixed); sanitization collisions get a numeric-2/-3suffix. Tooling that located logs underexecutor-session-logs/…/trial-N/must be updated.vally eval/vally experiment runnow reject an eval whose sanitized directory name (case-insensitively) collides with a reserved run-output artifact name (results.jsonl,eval-results.md,eval-results.junit.xml,otel-spans,otel-spans.jsonl,diffs,run-summary.jsonl,artifacts), since flattened session-log directories are now siblings of those artifacts and would otherwise overwrite them.- Removed
RunPlan.dispose(). Callers that execute planned items are responsible for shutting down backends, executors, reporters, and session logs directly. TrialPhasecollapsed the two workspace-lifecycle phasesacquire-workspaceandprepare-workspaceinto a singlepreparingphase.- Removed the remote-executor workspace-sync API:
Executor.finalizeWorkspace(), the exportedFinalizeWorkspaceContextandWorkspaceStatustypes, andTrajectory.workspaceStatus. Executors must write to the provided localworkDir, and remote compute environments should be implemented as a Backend. panelgrader: judge failures are now strict rather than failure-isolated. Any judge that errors (crash, timeout, malformed response) forces the panel topassed: false, even when the surviving judges’ consensus would otherwise pass. Previously a failed judge was dropped and the panel could still pass on the survivors. The surviving judges still produce the reportedscore(andmetadata.failed_judgesstill lists what failed), but the verdict is forced to fail. Existing evals with panels that occasionally lose a judge to rate limits/timeouts may now see those trials fail where they previously passed. (#632)