Skip to main content

Pipeline architecture

A Control Plane pipeline has four stages that run on every push:
Build: Install dependencies, validate langship.yaml, resolve dataset versions. Eval: Run every evaluator defined in your config against the target dataset. Each evaluator produces a pass/fail verdict and a numeric score. Compare: Diff scores against the previous passing run on the target branch. Surface regressions in the CI summary. Deploy: If all evals pass (or no blocking evals failed), promote the agent version to the target environment.

Core data model

Runs

Every time your agent executes (locally or in CI), Control Plane records a Run. A Run has:
  • A unique ID
  • Start/end time and total duration
  • The project and environment it belongs to
  • A status: success, failure, error
  • The full trace and any eval results attached

Traces and spans

A trace is a tree of spans. Spans map directly to agent steps: Traces are OpenTelemetry-compatible; you can export them to any OTel-compatible backend (Jaeger, Grafana Tempo, etc.) in addition to Control Plane.

Datasets

A Dataset is a versioned collection of test cases. Each test case has:
  • input: the query or message to send to your agent
  • expected (optional): the expected output for exact-match evals
  • metadata (optional): tags, difficulty labels, source references
Datasets are stored in Control Plane Server and referenced by SHA-pinned version in langship.yaml. Your evals always run against the exact same dataset version, making results reproducible across branches and time.

Evaluators

Evaluators can be configured as blocking: true (fail the pipeline on threshold miss) or blocking: false (report only).

Execution flow

Local run

CI run (GitHub Actions)

Configuration reference

langship.yaml structure:

Observability pipeline

Control Plane uses an OpenTelemetry Collector under the hood:
Forwarding to external backends is configured in collector-config.yaml (included in the Docker Compose setup).