Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use this skill to run an honest session-process evaluation (Standard v1, aiat-llm-eval/1.0) — score the last completed orchestrator session against the pre-registered rubric-v1 dimensions, run /eval, evaluate this session, produce an eval report, or re-verify a stored eval run for reproducibility. Deterministic-first with an optional advisory LLM judge; never produces a global score.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 36% | 0% |
| case-05 | ✗→✓ | ▲ Improved | -13% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 37% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 111% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 279% | 0% |
CRITICAL: Run HARNESS_DIR=$(epic path) first. Never use .harness/ in the project directory.
/ship creates a PR (automatic if eval.yaml exists)/go completes a feature/eval commandmake eval or epic eval --json4 dimensions run in parallel where possible:
bashHARNESS_DIR=$(epic path)
If $HARNESS_DIR/eval/eval.yaml does not exist, run scaffold:
bashepic eval --init
Read the config:
bashcat $HARNESS_DIR/eval/eval.yaml
If eval.yaml has benchmarks: [] and no benchmark files are found in the project:
bash epic eval --scaffold Supported stacks (auto-detected from project markers):
| Stack | Detected by | Generated file | Output format | |-------|-------------|----------------|---------------| | Rust | Cargo.toml | benches/eval_harness.rs | criterion (exit code) | | Python | pyproject.toml / setup.py | benchmarks/eval_runner.py | JSON composite | | TypeScript | tsconfig.json | benchmarks/eval.ts | JSON composite | | Node.js | package.json | benchmarks/eval.mjs | JSON composite | | Go | go.mod | benchmarks/eval_test.go | JSON composite | | Java | pom.xml / build.gradle | benchmarks/EvalBenchmark.java | exit code | | Kotlin | build.gradle.kts | benchmarks/EvalBenchmark.kt | exit code | | Ruby | Gemfile | benchmarks/eval_benchmark.rb | JSON composite | | PHP | composer.json | benchmarks/eval_benchmark.php | JSON composite | | C# | *.csproj / *.sln | Benchmarks/EvalBenchmark.cs | JSON composite | | Swift | Package.swift | benchmarks/EvalBenchmark.swift | JSON composite | | Elixir | mix.exs | benchmarks/eval_benchmark.exs | JSON composite | | C++ | CMakeLists.txt | benchmarks/eval_benchmark.cpp | exit code |
# TODO / // TODO markers:--scaffold can't generate a useful stub (domain too complex, custom evaluation logic needed), generate a custom benchmark with LLM assistance:{"composite": 0.0–1.0, ...}benchmarks/eval_runner.{ext} matching the project languageyaml benchmarks:
command: python3 benchmarks/eval_runner.py full result_type: composite # parse composite field from JSON stdout Use result_type: exit_code for frameworks (criterion, JMH, BenchmarkDotNet) that manage their own output.
Execute the structured evaluation via the Rust binary:
bashepic eval --json
This runs all enabled dimensions and outputs a JSON result. Capture the output.
If the CLI reports llm_judge: SKIPPED (no LLM available in CLI mode), proceed to Step 2 for LLM-as-judge. Otherwise, skip to Step 3.
If the quality dimension has llm_judge: true and CLI marked it SKIPPED:
bash git diff --name-only $(git merge-base HEAD main)
bashcat $HARNESS_DIR/eval/baselines/latest.json
If no baseline exists, the current run BECOMES the first baseline. Save it:
bashepic eval --baseline-update
Report: "First baseline established. Future runs will compare against this."
Combine CLI output + LLM-as-judge results into a single report:
## Eval Report
- Branch: {branch}
- Commit: {commit_short}
### Correctness: [PASS/WARN/FAIL] — score: {score}
- Tests: {passed}/{total} passing ({pass_rate}%)
- Mutation score: {mutation_score}% (if enabled)
- Delta vs baseline: {+/-delta}
### Performance: [PASS/WARN/FAIL] — score: {score} (if enabled)
- Avg latency: {latency}ms (delta: {+/-delta})
- Throughput: {throughput} (delta: {+/-delta})
### Quality: [PASS/WARN/FAIL] — score: {score}
- Lint errors: {count}
- LLM judge: {score}/10 (if enabled)
### Regression: [PASS/FAIL]
| Dimension | Baseline | Current | Delta | Verdict |
|-----------|----------|---------|-------|---------|
| correctness | {prev} | {cur} | {delta} | {pass/fail} |
| quality | {prev} | {cur} | {delta} | {pass/fail} |
### Overall: [PASS/WARN/FAIL] — {overall_score}/ship to create a PR."/go, then re-run /eval."bashepic eval --baseline-update # if user approves this as new baseline
Results auto-saved to $HARNESS_DIR/eval/results/EVAL-{timestamp}.json.
| Excuse | Rebuttal | What to do instead | |--------|----------|-------------------| | "Tests pass, no need for eval" | Tests pass today but regress tomorrow without baselines | Run eval and establish a baseline | | "Performance testing is premature" | Latency regressions are invisible until users complain | Enable performance dimension, run benchmarks now | | "Mutation testing is too slow" | Slow mutation catches bugs fast tests miss | Run on changed modules only (--dimension correctness) | | "LLM-as-judge is subjective" | Subjective beats absent — fixed rubric + averaging reduces variance | Use the 4-axis rubric, average across 3+ files | | "We can add eval later" | Later never comes; regressions accumulate silently | Start with correctness+quality, add dimensions incrementally | | "CI will catch regressions" | CI only catches build/test failures, not quality drift | Eval measures what CI misses: mutation score, LLM quality |
epic eval --json output captured (all enabled dimensions scored)$HARNESS_DIR/eval/results/epic eval outputOther measured skills in the registry, with their headline benchmark lift.