Capability group 02

Polyglot engines & tiers

Beyond OLTP SQL, the same claim model provisions durable document/KV, vector search, and time-series engines. Every engine carries two orthogonal facets — a maturity tier (GA · Beta · Candidate · License-Exception · Rejected) and an ADR-0068 boundary (operational vs analytics-reserved) — recorded in one admission catalogue that is the single source of truth for what is claimable and why.

Document/KV · Vector · Time-series

≤50 ms
P99 ANN, 10M×1024d (Qdrant)
≤1 ms
P99 GET (Dragonfly KV)
5 tiers
GA · Beta · Candidate · Lic-Exc · Rejected

Sub-capabilities

Many workload classes, one claim lifecycle, one admission catalogue.

Engine tiers & license inventory

GET /engines/catalog is the ADR-0069 admission ladder: every engine with its tier, owner service, workload class, license class and tenancy/backup/restore/residency model — plus guidance for non-claimable engines telling a would-be claimant where the workload belongs.

Durable document / KV claims

A DynamoDB-parity document surface on the Yugabyte YCQL path (ADR-0064): PUT/GET/DELETE documents by key with optimistic concurrency via if_version and per-item ttl_seconds. Mongo-compatible needs prefer this permissive engine over SSPL-class risk.

Typed vector claims (Qdrant)

The DB31 VectorClaim door provisions a per-tenant Qdrant collection — the only sanctioned vector engine (ADR-0056) — with dimension, metric, replication and quantization. Built for embeddings, search and RAG.

Product time-series (QuestDB)

Ingest batches of points (the ILP lane) and query with optional average downsampling. Out-of-order arrivals are re-sorted; points past retention are dropped on arrival.

Graph & wide-column: deferred, on the record

Cassandra (wide-column) and Vitess are Candidate; ScyllaDB is License-Exception (AGPL); MongoDB is Rejected (SSPL). Graph is a future ADR-0064 admission — deferred, not invented. The catalogue makes the posture explicit rather than silently missing.

Endpoints

8 real operations on the /api/v1 contract.

Method + path straight from the SS-02 OpenAPI spec. Governed routes take an SS-01 bearer token and, where marked, an X-Tenant-Id; the S3 wire gateway authenticates with AWS SigV4 instead.

GET/api/v1/enginesbearer

Supported engines (name→workload class) and per-engine approved versions with EOL dates.

GET/api/v1/engines/catalogbearer

Full ADR-0069 admission catalogue: tier, license class, boundary, tenancy/backup/restore/residency, guidance.

POST/api/v1/vector-claimsbearertenantidempotency-key

Provision a per-tenant Qdrant collection (name + dimension required).

PUT/api/v1/claims/{name}/docs/{key}bearertenant

Write a document with optimistic concurrency (if_version) and per-item ttl_seconds.

GET/api/v1/claims/{name}/docs/{key}bearertenant

Read a document by key from a document/KV claim.

DELETE/api/v1/claims/{name}/docs/{key}bearertenant

Delete a document by key with a conditional if_version guard.

POST/api/v1/claims/{name}/pointsbearertenant

Ingest a batch of time-series points (ILP lane); each needs series + ts.

POST/api/v1/claims/{name}/querybearertenant

Query a time-series claim; downsample_seconds>0 returns average buckets, else raw points.

Worked example

Provision a vector collection, then ingest & query a time-series claim.

Provision a vector collection, then ingest & query a time-series claim · bash
# Typed vector claim — only name + a positive dimension are required.
curl -X POST "$BASE/vector-claims" \
  -H "Authorization: Bearer $TOKEN" -H "X-Tenant-Id: acme" \
  -H "Idempotency-Key: $(uuidgen)" -H "Content-Type: application/json" \
  -d '{"name":"embeddings","dimension":1536,"metric":"cosine"}'
#   → 201 ready claim, engine:"qdrant", resolved vector spec

# Ingest time-series points (ILP lane) …
curl -X POST "$BASE/claims/metrics/points" \
  -H "Authorization: Bearer $TOKEN" -H "X-Tenant-Id: acme" \
  -H "Content-Type: application/json" \
  -d '{"points":[{"series":"cpu","tags":{"host":"a1"},"value":0.72,"ts":"2026-07-05T12:00:00Z"}]}'
#   → 201 {"accepted":1}

# … and read them back downsampled to 5-minute averages.
curl -X POST "$BASE/claims/metrics/query" \
  -H "Authorization: Bearer $TOKEN" -H "X-Tenant-Id: acme" \
  -H "Content-Type: application/json" \
  -d '{"series":"cpu","from":"2026-07-05T00:00:00Z","downsample_seconds":300}'
#   → 200 {"buckets":[{"ts":"…","avg":0.71,"count":12}]}

Every polyglot engine shares the claim → binding → lease lifecycle, so backup, PITR and per-tenant encryption come with it for free.

In the architecture

Where it sits on the data plane.

The admission catalogue (services/dbaas/internal/core/admission.go) is the single source of truth: a tenant claim is admitted iff the engine is public_operational (⇒ Tier GA or Beta). Analytics engines (ClickHouse, Iceberg, Trino, Pinot) are GA-mature but reserved substrate behind SS-09 Prism / SS-06 VRQGO — never tenant claims. That boundary keeps DBaaS an operational plane, not a warehouse.

ADR-0069Polyglot engine tiers & license inventoryADR-0064DBaaS claim expansion (document/KV, time-series)ADR-0068DBaaS/Prism analytics boundary