GuidesRun Targets

Run Targets

A Run Target is a named, reusable population for your scorers to run on — a golden dataset, a live sample of production traffic, or a filtered sweep of history. It separates what a judge measures (the rubric) from what it measures it on (the traffic), so one scorer definition can grade several populations at once and every scorer can share the same populations.

At a glance

WhereThe Run Targets tab on the Judges page (the library, and each target’s Used by scorers); also the Run Targets tab on any scorer’s detail page (that scorer’s attachments)
Key API routesGET/POST /run-targets, GET/PATCH/DELETE /run-targets/{id}; attach via POST /judges/{id}/deployments; results via GET /judges/{id}/targets
Three kindsDataset (static, versioned), Live sample (continuous, on-ingest), Filtered batch (historical / scheduled sweep)
ScopeAgent-scoped — a Run Target and every scorer bound to it live in one agent
Reused byAny number of scorers; the library shows each target’s Used by scorers

Why Run Targets exist

A scorer answers one question — is this answer faithful? is this reply coherent? — but you rarely want that question answered on just one slice of traffic. Take Primary Score, the built-in composite of Faithfulness, Answer Relevancy, and Coherence. You want it on:

  • your Golden Q&A dataset, so a regression can’t sneak past the benchmark you trust;
  • a live sample of what support-bot is actually saying customers today;
  • last night’s failures, swept nightly, to watch a known problem area.

That’s one rubric over three populations. Before Run Targets, “what to score” was baked into each scorer’s deployment, so answering that meant three near-duplicate scorers to keep in sync. A Run Target lifts the population out into its own object: define Primary Score once, then attach it to all three targets. Results come back split per target, so you can see at a glance that the same scorer reads 0.95 on the golden set, 0.82 on live traffic, and 0.61 on the error sweep — three honest numbers instead of one blurred average.

The three kinds

Every Run Target is one of three kinds. The kind decides how its population is resolved and which trigger fits it.

KindPopulationTypical useFits trigger
DatasetA dataset — either a pinned version (frozen) or follow latest (the live members)The regression benchmark: your Golden Q&A setManual or Scheduled
Live sampleA percentage of new traces as they arrive, matching an optional filterContinuous quality signal on production trafficOn new trace (continuous)
Filtered batchEvery trace matching a filter over history — run once or on a scheduleA nightly error sweep, or a one-off backfillManual or Scheduled

Dataset targets pin a version by default. A pinned version is immutable, so every run measures exactly the same items and a benchmark can’t quietly drift under you (see golden versions). Turn on Follow latest only when you want the target to track the dataset’s current members as it keeps syncing.

Create a Run Target

Open the library and choose a kind

Go to Judges and open the Run Targets tab, then click New Run Target and pick Dataset, Live sample, or Filtered batch. The kind you pick decides which of the fields below you fill in.

Run Targets moved. They used to have their own entry in the sidebar; the library now lives as a tab on the Judges page, next to Judges, Alignment, and Comparison.

Fill in the shared fields

FieldWhat it does
NameThe label you’ll see everywhere it’s used — e.g. Golden Q&A, Live production, Nightly support-bot errors.
GrainWhether the target is a set of traces (one span tree each) or sessions (conversation rollups). This must match the scorers you attach — see grain must match.
Filter(Live sample and Filtered batch) Which traffic qualifies, using the same vocabulary as the Traces page — for example only support-bot, or only failed sessions.
SamplingAll matches, a fixed Count, or a Percentage. A live estimate shows how many traces are eligible and how many the target will run on.

Point a dataset target at its items

For a Dataset target, choose the dataset and how it resolves:

  • Pin a version (default) — select a frozen version (typically the golden one). The items never change until you re-point the target.
  • Follow latest — the target resolves the dataset’s current members every run, so it grows as the dataset syncs.

A dataset from another agent can’t be selected — Run Targets are agent-scoped.

Save

The new target appears on the Run Targets tab with its kind, grain, a one-line population summary, and an eligible-traffic estimate. It scores nothing on its own — a Run Target is just a population until a scorer is attached to it.

A Run Target carries a suggested trigger, not a binding one. Each kind offers a sensible default (a Live sample suggests On new trace, a Filtered batch suggests Scheduled), but the trigger that actually runs is set on the attachment, so two scorers can run the same target on different schedules. See per-attachment settings.

Attach a scorer

You attach a Run Target from a scorer, not the other way round: open a judge, go to its Run Targets tab, and click Attach Run Target. Each attachment is one binding of this scorer to one Run Target with its own run-time settings.

Reuse an existing target or define a new one

The drawer lets you Reuse existing target (pick one from the library — this is how a target ends up shared across scorers) or Define new (create one inline, same fields as above).

Set the per-attachment settings

Three settings live on the attachment, not on the Run Target, so each scorer can run the same population its own way:

  • Trigger — Manual (run on demand), On new trace (score a sample continuously as traffic arrives), or Scheduled.
  • Pass cutoff — the score at or above which a target counts as passing for this scorer on this population (blank → the scorer’s default; see run outcomes).
  • Model connection — which LLM connection(s) score this population. Leave empty to use the agent’s default; pick a pool to spread load (see LLM connections).

Save the binding

The attachment now shows as a row on the scorer’s Run Targets tab, and the scorer shows up under Used by on that target in the library.

Attach one scorer to several targets

Repeat Attach Run Target for each population. Attaching Primary Score to Golden Q&A, Live production, and Nightly support-bot errors gives it three bindings — one rubric, three populations — each with its own trigger, cutoff, and connection. The scorer’s Run Targets tab lists all three, each with its latest metric and a sparkline.

Grain must match

⚠️

Grain must match. A trace-grain scorer can only attach to a trace-grain Run Target, and a session-grain scorer only to a session-grain target; a mismatch is rejected at attach time with a grain_mismatch error. Check the scorer’s Target type (trace or session) and the target’s Grain agree before attaching. Grain is fixed on a Run Target once it has bindings.

Read results split per target

Because a scorer can run on several populations, its results are reported per Run Target rather than pooled. On the scorer’s Run Targets tab, each attached target carries its own scored count, average, pass rate, and trend — so the same rubric reads independently on each:

Run TargetKindScoredAvgPass rate
Golden Q&ADataset (v7, pinned)1200.9598%
Live productionLive sample (10%)1,4120.8286%
Nightly support-bot errorsFiltered batch2400.6154%

That spread is the point: a benchmark near the top, live traffic a step below, and the error sweep lowest of all. A single blended number would hide exactly the signal you’re watching for — a golden set holding steady while live quality slips, or an error sweep that stops improving after a fix.

A target with no runs yet reads as blank (an em dash), never a misleading 0 — an unscored population and a zero-scoring one are different things.

Which target a run evaluated

Because one scorer can be attached to several Run Targets, its run history and the Judges list both label each row with the Run Target it evaluated, so two runs of the same scorer against different populations never read as duplicates:

  • On the scorer’s run history (click a scorer to open its runs), the Target column names the Run Target each eval run scored — e.g. a Live production run and a Nightly support-bot errors run sit side by side, each tagged with its own target.
  • On the Judges list, each enabled scorer row shows the Run Target its deployment is bound to, so the same scorer attached to two targets appears as two clearly labelled rows.

A run that wasn’t tied to a named Run Target — an ad-hoc Run now over an inline filter — shows a neutral em dash in the Target column rather than an invented label.

Reuse: editing a target updates every bound scorer

A Run Target is shared state. Editing it changes the population for every scorer bound to it — that reuse is the feature. Widen the Nightly support-bot errors filter to cover a second agent, or bump Live production from 10% to 25%, and every attached scorer picks up the change on its next run. There’s no per-scorer copy to update, and no drift between scorers that are meant to watch the same slice.

⚠️

A Run Target in use can’t be deleted out from under its scorers. Deleting one that still has attachments is refused and lists the scorers using it; detach it from each scorer first (remove the binding on the scorer’s Run Targets tab), then delete. This keeps a shared population from vanishing mid-run.

How it works

  • Resolution at run time. When a scorer runs a binding, Neens resolves the Run Target’s population then — a Dataset target reads its pinned version (or the live members, if Follow latest), a Live sample samples the just-arrived traces, and a Filtered batch runs the filter over history — applies the target’s sampling, and scores exactly that set. Editing the target changes what the next run resolves.
  • Settings split by owner. The population (filter, sampling, dataset, version) lives on the Run Target and is shared; the run-time settings (trigger, pass cutoff, model connection) live on each attachment and are private to that scorer. The two never fight — a run reads the population from the target and the run-time settings from its own binding.
  • Nothing is retroactive. A Live sample only scores traffic arriving after it’s attached and running, exactly like continuous evaluation; use a Filtered batch (or Run now) to score history.
  • Every LLM-scored population needs a connection. Like every judge, a Run Target run uses the agent’s configured LLM connection (Settings → Connections). With none configured the run finishes Skipped rather than borrowing another agent’s credentials — see continuous evaluation.
API reference
RoutePurpose
GET /run-targetsList the agent’s Run Targets, each with its kind, grain, population summary, eligible estimate, and the scorers using it.
POST /run-targetsCreate one ({name, kind, grain, filter?, sampling?, datasetId?, datasetVersionId?, followLatest?}). For kind: "dataset", supply a dataset and either a pinned datasetVersionId or followLatest.
GET /run-targets/{id}Detail, including which scorers use it and its eligible-traffic estimate.
PATCH /run-targets/{id}Edit it — the change applies to every bound scorer.
DELETE /run-targets/{id}Delete it; refused with the list of scorers still using it (detach first).
POST /judges/{id}/deploymentsAttach a scorer: include the Run Target to bind, plus the per-attachment trigger, pass cutoff, and connection pool. Grain must match (422 otherwise).
GET /judges/{id}/targetsPer-target results for a scorer — scored count, average, pass rate, and trend for each attached Run Target.

Run Targets are addressed by id and scoped to the agent of the caller; a target or dataset in another agent is a 404.

Troubleshooting

SymptomLikely causeFix
Can’t attach a scorer — grain_mismatchThe scorer’s target type (trace/session) and the Run Target’s grain differAttach a target whose Grain matches the scorer’s Target type, or create one at the right grain.
A Run Target won’t deleteScorers are still bound to itDetach it from each scorer on their Run Targets tab, then delete — the error lists the scorers using it.
A live-sample target scored nothing for old trafficLive samples are forward-onlyAttach a Filtered batch over history (or use Run now) to score existing traffic once.
Editing a target changed another scorer’s numbersThe target is shared — that’s by designReuse is intentional; if two scorers need different populations, give each its own Run Target.
A dataset target’s items never changeIt’s pinned to a frozen versionTurn on Follow latest to track the dataset’s current members, or re-point it to a newer version.
Runs finish Skipped with no_llm_connectionNo LLM connection is visible to the agentAdd one in Settings → Connections; see continuous evaluation.
  • Judges — define, version, and enable the scorers you attach to Run Targets.
  • Datasets — the versioned collections a Dataset target points at.
  • Continuous evaluation — how a Live sample scores new traffic.
  • Scores — the catalogue every Run Target’s verdicts land in.
  • Pre-prod evaluations — replay a golden dataset version against a candidate release before you ship.