eval-banana

Introduction

eval-banana is a lightweight, aspect-based evaluation framework. It discovers YAML check definitions from eval_checks/ directories anywhere in your project, runs them, and produces a scored report. Every check scores 0 or 1 with equal weight — there is no weighting system and no partial credit.

It is built for evaluating the things that are otherwise awkward to test: the output of an AI agent, the behavior of a workflow, the quality of generated content — anything you can describe as pass or fail. (The name was inspired by a song the author's kids love.)

Two check types

Every check is one of two types. Reach for the cheapest one that can express your condition.

TypeUse whenHow it works
deterministicThe condition is objective and testable with code — a file exists, JSON has a field, no TODOs in src/Runs a Python script via subprocess; exit 0 = pass, non-zero = fail
harness_judgeThe condition is qualitative — a summary is accurate, a tone is professional, docs are clearInvokes a configured AI agent that reads the files and returns {"score": 0|1}

Prefer deterministic whenever a condition can be checked with code — it is the cheapest, most reliable option and needs no credentials. Use harness_judge only for judgments that genuinely need language understanding.

What a check looks like

A deterministic check is a YAML file with an inline Python script:

schema_version: 1
id: output_file_exists
type: deterministic
description: Verify that output.json was generated.
script: |
  import json, sys
  from pathlib import Path
  ctx = json.loads(Path(sys.argv[1]).read_text())
  output = Path(ctx["project_root"]) / "output.json"
  assert output.exists(), "output.json not found"

A harness judge check describes what "good" looks like in plain language:

schema_version: 1
id: summary_is_accurate
type: harness_judge
description: The generated summary accurately reflects the source data.
instructions: |
  Read summary.txt and source_data.json. Compare the summary against the
  source data. Score 1 if accurate, 0 if it contains fabricated claims.

Why binary scoring

eval-banana's 0/1 philosophy draws on two earlier bodies of work:

A harness_judge check is essentially an Aspect Critic: you describe what "good" means, and the judge returns {"score": 0|1}.

Where to go next