Deployment slots and promotion bundles
Bundles
POST /models/{id}/bundles packages an evaluated model for serving — and
is refused when any gate is blocking. Under the default warn policy,
G1-G3 quality failures are advisory but require an exact acknowledgement with
a reason; G4-G6 integrity failures are never waivable. A strict project
policy blocks every failure. See Promotion gates.
The bundle pins, by fingerprint: the checkpoint, contract version, leakage
policy version, encoder set, tokenizer version, dataset build, and eval
report. It copies the measured gate results verbatim and, when a quality
failure was acknowledged, records the reason and actor in an additive
promotion block. It also carries the complete runtime block (model config,
window, label heads) — scorers read only the bundle, never the original
records.
A semantic.v2 model you trained also gets a representation_compatibility
block, derived from the bundle's own pinned vocabulary, vocabulary vectors,
tokenization and model config (you never supply it). If those inputs are
missing or disagree, POST /models/{id}/bundles and
POST /slots/{id}:activate refuse with failed_precondition and reason
project_representation_invalid; allow_mismatch cannot override it. A
semantic.v2 bundle created before this block existed is refused on a
realtime slot with reason project_representation_missing: create a new
bundle from the same model.
Slots
A slot is the stable, API-addressable unit your integrations point at:
{
"environment": "test",
"name": "prod",
"entity_type": "user",
"mode": "live",
"scoring": "batch_only"
}
name— per-project-unique and permanent; bundles rotate under it, URLs never change.mode—liveserves reads;shadowscores the same traffic into shadow state rows for candidate-vs-active comparison without exposure.scoring—batch_only(states written by refreshes) orrealtime: every ingested event for the slot's entity type triggers a rebuild of that entity's recent window and a fresh state write within seconds (target p95 event→state ≤ 2 s). Realtime slots — live and shadow alike — get their own serving deployment automatically; flipping a slot back tobatch_onlytears it down. Bursts queue and replay in order; a poison event is retried 5 times and then parked, and the entity's state self-heals on its next event or a batch refresh.
Activation, rollback, audit
POST /slots/{id}:activate {bundle_id} re-verifies every pinned
fingerprint against storage before the swap — a corrupted or altered
artifact aborts activation (see
Fingerprints). The
override path (allow_mismatch: true + a reason) exists for break-glass
moments and always leaves an audit record.
POST /slots/{id}:rollback returns to the previous bundle in the slot's
history — the same verification applies. Activation history (who, when,
which bundle) is part of the slot record, and every activation emits a
slot.activated webhook.
Semantic models you trained
A semantic.v2 model trained on your own project data is promoted and
activated with the same controls. Its bundle also pins a
representation_compatibility block that Tessera derives from the bundle's
own vocabulary, vocabulary vectors, tokenization and model config; you never
supply it. Activation and every scorer re-derive it and refuse a bundle whose
block differs, with no override. It identifies your trained model's learned
space within your project only: the model is never exported to or shared with
another project.
When you activate (or roll back to) such a bundle on a live realtime slot,
Tessera also replays the head of its source: the events that arrived before the
activation are scored once per entity, within the bundle's window, so every entity gets a
scored prefix without waiting for its next event. The replay runs only
while the source is active, automatically onboarded, has no manual mapping and
still uses the binding the bundle was trained with, and only while the slot
keeps that bundle and activation generation; any change cancels it before it
writes anything. If those conditions do not hold when you activate, the
activation still succeeds and only new events are scored.