Trust Model
Ports & Adapters
Where integrations plug in.
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.
- typed port (boundary)
- adapter (swappable)
The six ports
| Port | Purpose | MVP adapter |
|---|---|---|
DatasetStore | Read examples, references, dataset status, version. | Local JSONL |
TraceSource | Yield recorded host behavior. | Local JSONL |
TaskRunner | Replay host outputs when needed. | Subprocess (JSON in/out) |
JudgeModel | Collect judge evidence when a metric declares it. | Fake required-tier judge |
ResultStore | Persist RunRecords, Scorecards, reports, baselines. | Filesystem JSON/JSONL |
ScoreSink | Present 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.