Create a new eval case
Goal: create the required directory structure and a case file ineval/ from an existing recording.
Commands:
eval/cases/task-02.yaml points to task-02.mov in the sibling recordings/ directory and labels the expected value before and after the six-second mark.
Note: If you prefer colocated fixtures, put the recording in eval/cases/ and set video: to the filename, such as task-02.mov.
Seed draft expectations
Hand-labeling is the clearest way to start. When a case has many samples, you can instead omitexpect and ask an adapter to propose the missing values:
seed uses the same adapter as run by default, fills only omitted expectations, and preserves existing labels. Use --adapter or --adapter-command to label with a different adapter, and use --case or --target to narrow the work. Treat generated values as proposals and review them before relying on the eval.
Review and correct expectations in the browser
Goal: make recorded-video expectations faster to verify and correct. Without the review UI, verifying expectations means juggling a media player and YAML editor while matching timestamps by hand. The review UI puts the video, expanded sample schedule, and editing controls in one place, making corrections faster and less error-prone. Command:Run one case while debugging
Goal: run a focused eval and print every sample result. Command:--keep-going records adapter evaluation errors and comparison errors as sample results instead of aborting on the first sample error. Every completed adapter result is also checkpointed, so when there is reusable progress the printed glasskit eval run --resume ... command can retry adapter errors without rerunning completed samples. --save-failures writes JPEG frames and per-result JSON for failed or errored samples. Treat eval/runs/ as disposable output and add it to your app repo’s .gitignore if you keep generated eval reports out of source control.
Measure nondeterministic stability
Goal: run the same selected eval three times and identify samples whose outcomes vary. With--repeat N, GlassKit Eval executes the same selected sample schedule N times. Each complete repetition is called a trial, and each evaluation of a sample within a trial is an attempt.
Command:
--concurrency 2 still permits at most two individual evaluations in flight because trials themselves are never run concurrently.
Every trial uses the same filters and selected schedule. Quality gates such as --min-pass-rate apply independently to each trial, and the run fails if any trial fails one; results are never pooled before applying a quality gate. --max-flaky-samples 0 checks only whether sample statuses vary across trials, so combine it with a correctness gate such as --min-pass-rate 0.9 when both stability and quality should affect the exit code. Repeating an eval multiplies its adapter work and provider cost by the repeat count.
Enforce CI quality gates
Goal: make the command fail when quality drops below your threshold. Command:0 when every configured quality gate passes, 1 when the eval completed but one or more gates failed, and 2 for setup or runtime errors that abort the run.
Note: Threshold defaults are intentionally unset. Without --min-pass-rate, --min-target-pass-rate, --max-failures, or YAML thresholds, failed comparisons are visible in the report but do not fail the command. Always configure a gate for CI.
Use an adapter config file
Goal: pass runtime settings to your adapter without putting them in case files. Save portable adapter settings ineval/adapter.yaml; GlassKit discovers this file automatically:
eval/adapter.yaml:
--adapter-config PATH to load a different YAML or JSON object instead. GlassKit does not expand environment variables inside adapter config files. Read secrets from environment variables in your adapter.