Build the Eval Pyramid: A Starter Harness for LLM and Agent Testing The open-source Eval Pyramid Starter, a provider-neutral TypeScript harness for testing LLM and agent systems, enables engineers to clone a repository and run offline evaluations with deterministic graders, repeated runs, model judges, and human review. The harness, created by Bharadwaj Pendyala, includes a typed task and trial contract, generates reports under reports/latest, and supports metrics like pass@1, pass@k, and pass^k. It is designed to be run entirely offline by default, with synthetic examples and no credentials required, and includes redaction for sensitive data. Build the Eval Pyramid: A Starter Harness for LLM and Agent Testing An eval methodology becomes useful when another engineer can clone it, replace one boundary, and get trustworthy evidence without rebuilding the whole stack. That is the goal of the open-source Eval Pyramid Starter https://github.com/bharadwaj-pendyala/eval-pyramid-starter . It is a provider-neutral TypeScript harness that runs entirely offline by default. The example system is synthetic, the reports stay local, and no credential is required. You can inspect every layer before connecting a real model or tool. This is part three of the Eval Pyramid series. Part one explains why the layers exist /blog/eval-pyramid . Part two explains pass@k, pass^k, and judge calibration /blog/measuring-agent-reliability . This article connects those ideas to code. TLDR - Keep one typed task and trial contract across deterministic graders, repeated runs, model judges, and human review. - Put machine-checkable requirements first: schema, outcome, tool policy, latency, turns, and cost. - Give every trial a fresh system instance and temporary workspace. - Calculate reliability per task, then average across tasks. Report pass@1 , pass@k , and pass^k together. - Calibrate model judges against human labels and fail closed when their output is missing or invalid. - Make release gates explicit, retain failure evidence, route uncertain cases to people, and run cheap checks on every pull request while running broader evals on a schedule. Clone the runnable reference git clone https://github.com/bharadwaj-pendyala/eval-pyramid-starter.git cd eval-pyramid-starter npm ci npm run eval:deterministic npm run eval:repeat -- --trials 10 --k 3 npm run eval:judge npm run eval:review The default commands exercise three refund-support cases: an eligible refund, an out-of-window request, and a request missing its order identifier. They do not call an external model or touch a real customer system. The generated evidence lives under reports/latest : summary.json aggregate metrics and release-gate checks trials.jsonl one complete record per trial failures.md failed graders grouped by task and trial review-queue.jsonl uncertain or failed cases for human labels index.html self-contained report for local inspection Generated reports are ignored by Git. That matters because even a local eval can capture private output. The starter escapes dynamic HTML and redacts common credential fields, email addresses, bearer tokens, and OpenAI-style keys. Those controls are defense in depth. Use synthetic or properly de-identified fixtures and replace the redactor with one suited to your data. One contract holds the pyramid together Do not build four disconnected evaluation systems. Define the task once, capture the run once, and let each layer inspect the evidence it understands. The starter's system boundary is small: export interface SystemUnderTest { run task: EvalTask, context: TrialContext : Promise