Trust Model

Ports & Adapters

Where integrations plug in.

Every effect enters EvalGlass through one of six typed ports. An adapter implements a port and returns evidence or data — never a score, authority, or verdict. Integrating a backend means “implement port X,” never “edit the core.”

Because the Evaluation Core performs no effects, something must read files, run subprocesses, and call judges. Ports are those seams: narrow, typed, and deletable. The core never imports them, so the boundary that keeps meaning effect-free is also the boundary that makes backends swappable.

The six ports

PortPurposeMVP adapter
DatasetStoreRead examples, references, dataset status, version.Local JSONL
TraceSourceYield recorded host behavior.Local JSONL
TaskRunnerReplay host outputs when needed.Subprocess (JSON in/out)
JudgeModelCollect judge evidence when a metric declares it.Fake required-tier judge
ResultStorePersist RunRecords, Scorecards, reports, baselines.Filesystem JSON/JSONL
ScoreSinkPresent immutable results.Markdown, JSON, CI annotations

What an adapter may and may not do

An adapter carries evidence and data across the boundary — and nothing else. Results returned through a port always carry diagnostics, never scores; a failed task or judge becomes typed infrastructure evidence, never a low quality value. A ScoreSink presents results but cannot mutate them, so it can never change a verdict or an exit code.

Convert at the edge An adapter translates an external shape into EvalGlass contracts immediately, so vendor objects never travel inward. Keep the SDK import inside the adapter, off the required path, and the core stays exactly as effect-free as it was. Live providers and real backends arrive as optional Extension Lanes on these same ports.

Next steps