staging to production through automated eval checks, with drift-based
rollback when the post-promotion metrics you post regress. Rollback is not
autonomous — see Auto-rollback for exactly what fires it.
Pricing: Read-only (view active version + history) on Builder $29**.
Full promotion workflow — create, gate, promote, drift-based rollback — on **Team $229+.
Core concepts
Workflow overview
Create and version prompts
Versions are authored through the API (or the Prompts page in the dashboard). A new version is created and lands instaging:
201 response carries the prompt_version_id and the content sha256_hex —
the id you pass to promote and rollback.
The tlane CLI covers the read and promotion side of the workflow:
Eval gates
Eval gating is live. Run a suite with
POST /v1/prompts/{name}/evals, then pass
the returned eval_run_id to promote: a run recorded passed opens the gate, and
anything else — failed, errored, still running, or an id the gate cannot
resolve — refuses the promotion with 409 and leaves the production pointer where it
was. The gate fails closed, so an unreadable run blocks rather than waves through.Still on the roadmap: the tracelane.yaml gate config and the streaming eval panel.
Assertions are code rules plus an optional LLM judge — see
Evals and prompt promotion. And a promotion is never gated
automatically — you choose to supply a run id, or to record an attributed override
instead.409. Start a run with
POST /v1/prompts/{name}/evals. Declarative per-prompt thresholds in
tracelane.yaml are still roadmap:
Promote via dashboard
- Open Prompts → [prompt name].
- The panel shows the active version for each environment.
- Click Promote staging → production.
- The version is atomically swapped in production and a tamper-evident
promotion record is written. (The panel does not run or stream an eval
yet, so a promotion made from this button is a recorded manual-override. The
gate itself is live over the API — supply an
eval_run_idtopromoteand a non-passing run refuses with409. The panel does not stream an eval.)
Promote via API
Promote against the gateway, not the dashboard origin. The dashboard route authenticates with a WorkOS session cookie and ignores anAuthorization
header; the gateway takes a Bearer credential.
to_version_id is required and is a UUID — get it from the 201 body of
POST /v1/prompts/{name}/versions, or from GET /v1/prompts/{name}.
This example uses
override_reason, which records an explicit, attributed
bypass in the tamper-evident chain. To promote through the eval gate instead,
run POST /v1/prompts/{name}/evals and pass the returned eval_run_id in place
of override_reason. The key needs the admin scope; keys minted before
scoping (scope unset) are unaffected.eval_run_id instead of an override_reason, the gate
resolves the run: a run recorded passed promotes, and any other outcome —
failed, errored, still running, or an id the gate cannot resolve — blocks
with 409 Conflict and the routing pointer does not move. A gate that cannot
resolve its run fails closed. A blocked promotion looks like this:
eval_run_id and override_reason returns 409 with
"decision": "blocked_by_policy".
Auto-rollback
How it works today: rollback decisions are computed from metric observations
you report to the observe endpoint. When you post an observation, Tracelane
compares it to the pre-promotion baseline and, if it drifts more than
sigma_threshold standard deviations within the observation window, returns a
rollback decision (and reverts, under rollback_mode: auto). Autonomous
background monitoring — Tracelane firing a rollback with no observation pushed
to it — is not built; today the drift math runs on the observations
you feed it, not on a standalone monitor loop.sigma_threshold standard deviations from
the pre-promotion baseline within the observation window, the rollback fires per
rollback_mode.
The history entry on the prompt detail page shows the trigger metric, observed
value, sigma drift, and the version pair:
Canary splits (Team+)
A split assigns a percentage of prompt resolutions to a candidate version. Fetching once at process boot and reusing that prompt counts as one resolution. The configured percentage is a deterministic bucket threshold, not a measured outcome; repeated identities and small populations can produce different proportions. Start or update a split from the prompt detail page, or send:GET /v1/prompts/{name}/canary reads the split; DELETE stops it.
Resolution uses the first bounded identity available: x-tracelane-user-id
(alias x-user-id), then x-conversation-id (alias x-session-id), then
x-agent-id. Missing usable identity during an active split returns
400 canary_identity_required. The same identity stays in the same arm until
the configuration changes. The response includes arm, canary_id, and
resolution_trace_id; its prompt.resolve span records the same arm and version.
There are no automatic graduation thresholds or inferred per-arm model outcomes.
Splits persist across restarts. A production move or deletion durably stops the
split first. If the following move fails, the error says the split was stopped;
reload before retrying. If startup cannot load valid lifecycle state, production
resolution returns 503 canary_state_unavailable and response caching stays
suspended. Operators must apply the canary schema before enabling this release.
The dashboard reads /v1/prompts/{name}/configuration to inspect environment
pointers without drawing an assignment.
Read the active version from your agent
Audit trail
Every promotion, block, and rollback is written to the tamper-evident audit ledger with the version SHA-256, eval run ID, and actor. Usetlane verify
to confirm the log has not been altered.