GET /runs/:id/gate turns its ratings into a binary passed / failed verdict
your pipeline can exit on. Your agent runs in your infrastructure; the engine scores results
and computes the gate.
There is no separate CI run type or
/ci-runs endpoint family on the self-host engine - a
CI run is a normal evaluation run, so it appears in Evaluate → Runs with full results,
analysis, and history like any other. (The hosted platform additionally offers a lightweight
CI Ingest API, which the SDK’s run_eval() wraps - see SDK CI/CD.) The
Python SDK wraps the whole self-host flow too, including report.gate(...)
and the pytest helper agentx.testing.assert_evaluation.How it works
Gate checks
The gate runs one or both of these checks (at least one is required) and passes only when every requested check passes:- Absolute floor (
failUnder=<0-10>): the run’s average rating must be at or above the floor. A run with no rated results fails this check. - No regression (
noRegression=true): the average must not have dropped more thantolerance(default0.5) below the baseline run’s average. The baseline is the dataset’s most recent earlier completed rated run with the same grading identity - same grading config (evaluationSettingsId), same scorer group, and same split - so switching how a run is graded starts a fresh baseline rather than comparing incomparable scores. Judge scores are noisy, so an exact comparison would flake builds on variance; tunetoleranceto your dataset. With no matching prior run, the check passes explicitly (“nothing to regress against”). Single-trace evaluations are never used as the baseline.
Gate history and alerting
record=true appends the verdict to the project’s gate history - what the dashboard’s CI page
lists - along with an optional caller label (e.g. "github-actions"). A recorded failed
gate also fires the webhook channels configured on the project’s monitoring profiles, so a
gate blocking a merge can reach Slack. Preview calls omit record and stay compute-only.
Smoke splits
Tag a subset of dataset cases with a named split (main_question.splits: ["smoke"]) and create
the run with "split": "smoke" to gate PRs on a fast subset while nightly jobs run the full
dataset. Case indexes are preserved, so per-case comparisons line up across split and full
runs.
Endpoints
All endpoints share the engine’s global error envelope for authentication (
401) and rate
limiting (429) - see Errors.

