Limits & Caveats
This is the code-verified status of every major feature — what works, what is partial, and what is explicitly deferred.
The governed core is real: bi-temporal store, planner with ACL and org isolation, provenance / audit hash chain, SmartIngest identity detection, and all protocol-compatibility doors are implemented and smoke-tested.
SQL query surface
| Feature | Status | Notes |
|---|---|---|
SELECT + WHERE / ORDER BY / LIMIT / JOIN / GROUP BY | Working | JOIN = INNER hash join (O(n+m)); GROUP BY + COUNT(*) in executor |
PURPOSE '…' prefix | Working, optional | Recorded for audit when declared |
AS OF <ts> / AS OF SYSTEM TIME <ts> | Working | UTC ISO-8601 or i64 ns UTC; non-UTC offsets rejected |
LIMIT n AFTER 'cursor' | Working | cursor = decimal system_from ns; cannot combine with ORDER BY |
ORDER BY | Working | Multi-column with ASC/DESC tiebreakers (ast.rs:1316, executor.rs:2665) |
WITH PROVENANCE | Working | Must be a trailing modifier (after LIMIT) |
WHERE expressions | Working | col op literal, arithmetic, now(), now() - INTERVAL 'N …' |
MATCH(col, 'q'[, PHRASE|FUZZY|STEMMED]) | Working | Default from BM25 posting list; PHRASE from positional index; FUZZY/STEMMED fall back to substring scan |
TUMBLE / HOP / SESSION windows | Working | HOP = overlapping bucket fan-out; SESSION = per-key activity-gap grouping |
EXPLAIN PATH | Working | Returns {strategy, graph_node_count, pll_warm} JSON |
EXPLAIN REPLAY('<id>', SEQ => n) | Working | Re-derives a logged exhibit link's seal byte-identically |
EXPLAIN POLICY | Partial | Prefix parsed but flag not consulted on execute path; use the explain_policy MCP tool |
CTE incl. WITH RECURSIVE | Working | parse_ctes_opt (parser.rs:1119); recursive iteration cap WITH_RECURSIVE_MAX_ITER (executor.rs:5980) |
UNION / UNION ALL / INTERSECT / EXCEPT | Working | execute_set_ops (executor.rs:2985); SetOpKind enum (ast.rs:1675) |
Operators and TVFs
Working and SQL-reachable: LOOKUP_IDENTITY, RESOLVE_IDENTITIES, IDENTITY_CLUSTER, SAME_IDENTITY, PATHS_BETWEEN, NETWORK_EXPAND, PREGEL_BFS, DEGREE(), HYBRID_SEARCH, fts_search, SIMILAR TO, FACE_SEARCH, all 10 graph TVFs (GRAPH_DIJKSTRA, GRAPH_SCC, GRAPH_CYCLES, GRAPH_SSSP, GRAPH_SPANNING_TREE, GRAPH_APSP, GRAPH_DIAMETER, GRAPH_SIMILARITY, GRAPH_NODE_METRIC, GRAPH_LINK_PREDICT), all 13 ScorerOp analytics operators, BENEFICIAL_OWNERSHIP_CHAIN, SANCTIONS_SCREEN, CRYPTO_TRACE, WIRE_RECONSTRUCTION, HAWALA_TRACE, GRAPH_COMMUNITY, GEOFENCE, ANPR_TRACE, DISPATCH_PRIORITY, CRIME_PATTERN_CLUSTER, WATCH PURPOSE.
The DataFusion TVF form SELECT * FROM <tvf>(...) works for all registered TVFs. Each TVF call is translated to its governed keyword form and runs under the same purpose + ACL + org-isolation path.
DDL
| Statement | Status | Notes |
|---|---|---|
CREATE EXTENSION vector / DROP EXTENSION vector | Working (pgwire) | No-op OK tag |
CREATE TABLE (pgvector) | Working (pgwire) | Registers the type; column list is ignored |
INSERT / UPDATE / DELETE | Working (pgwire) | The only native SQL DML path |
CREATE MATERIALIZED VIEW … REFRESH (INCREMENTAL|FULL) EVERY <s> | Working | Initial full refresh + background loop |
ALTER TABLE … ADD/DROP COLUMN | Parses, then 501s | Use the ontology API |
CREATE INDEX / CREATE TYPE / CREATE SCHEMA | Not implemented | — |
Agent memory surface
All 10 cognitive verbs are wired through to the runtime — 10 MCP tools and 10 HTTP /memory/* routes:
| Claim | Reality |
|---|---|
| 10 cognitive verbs | 10 implemented: original 7 + associate / resolve / summarise |
recall = hybrid retrieval | BM25 + vector fused via RRF, re-scored by confidence × recency × forgetting curve |
recognize returns a memory | Returns a MemoryItem projection |
consolidate supersedes | Closes the superseded row's valid_to and inserts the new belief |
forget deletes | RetentionMark enforced by ForgetScheduler on a background cadence (not a hard delete) |
| 5 memory canonical types | All producers wired: MemoryItem, AgentSession, ToolCall, DecisionRecord, Episode |
Canonical types and SmartIngest
- 76 canonical kinds ship. The often-cited ~170 is the target catalogue, not the shipped count. The enum is
#[non_exhaustive]with reserved headroom. - A few kinds (GSTIN, BTC address, FARA) have validators but no SmartIngest detection gate — they round-trip but are not auto-detected from free text.
- OT/ICS kinds (Modbus, OPC UA, DNP3, S7, IEC 61850) are auto-detected via the opt-in
icsdetector pack; ambiguous forms require a label (MODBUS:17). relata detect "<text>"runs all detector packs regardless ofRELATA_DETECT_PACKS(which governs HTTP/ingestonly).- Default packs:
network,contact,crypto. Opt-in:financial,payment,social,transport,device,ics. Orall/none.
Protocol compatibility doors
| Door | Writes? | Known limits |
|---|---|---|
| ClickHouse HTTP + native TCP | Read-only | Cannot create Relata types |
| Neo4j HTTP + Bolt | Yes (CREATE/MERGE) | Governed write door: run_protocol_cypher_write routes through governed_upsert for nodes and validate_link_write for edges |
| Postgres / pgvector | Yes | ANN index is cosine-only; <->/<#> correct via over-fetch + re-rank |
| MongoDB | Yes | No transactions, change streams, $push/$pull/$unset; nested equality via flattened columns only |
| Redis | Yes | No MULTI/EXEC, BLPOP, scripting, cluster; Pub/Sub is in-memory (zero persistence) |
| S3 | Yes | Buckets must be empty to delete; ETag = SHA-256; large objects streamed from object store |
All doors bind to 127.0.0.1 and share RELATA_BEARER_TOKEN. pgwire refuses to start without a token; others default to open dev mode when unset.
Capacity and scaling
The execution path no longer materialises results in memory. Streaming scan, spilling hash-join + aggregate, streaming results, and spill-to-disk that frees RAM have all shipped.
| Structure | Paged backend | Default profile |
|---|---|---|
| Authoritative rows | Spill-to-disk | server/cluster |
| Secondary / range indexes | DiskIndexSource | server/cluster |
| Full-text postings | DiskIndexSource | server/cluster |
| Vector index (HNSW) | PagedAnnIndex + IVF cold tier | server/cluster |
| Graph adjacency (CSR) | PagedCsrGraph | server/cluster |
| Identity index | Live-paged | server/cluster |
Measured performance characteristics
| Operation | Measured overhead |
|---|---|
| Conditional ACL | ~1.32× raw-scan p50. Budget gate: <2.5× |
| Bitmap row filtering | ~1.0× (branch-predicted bitset) |
| Cell masking | ~2.6× raw-scan p50 — avoid on hot scan paths in latency-sensitive deployments |
| Cold-restart RTO at 10M rows | WAL+Parquet flush ~15s; cold-load from Parquet ~55s. Single-node RTO ≈ 1 minute |
Aggregation note
GROUP BY without a filter predicate uses the columnar path. Filtered aggregates fall back to per-row field access and scale super-linearly at 10M rows.
Async embedding resilience
| Knob | Default | Effect |
|---|---|---|
RELATA_EMBED_QUEUE_MAX | 100000 | At cap, tasks are dropped (metric relata_embed_queue_dropped_total) |
RELATA_EMBED_TIMEOUT_MS | 30000 | Prevents a GPU hang from stalling the drain worker |
RELATA_EMBED_CIRCUIT_COOLDOWN_MS | 60000 | After 5 consecutive errors, circuit opens; /health/ready returns 503 with reason: embedder_unhealthy. Writes always succeed. |
Explicitly deferred
These capabilities are advertised as design targets but are not shipping:
| Capability | Current state |
|---|---|
| Hardware attestation (SEV-SNP / TDX) | Software stub — synthetic report for dev/CI; no /dev/sev-guest / TDX-driver-backed report |
| Real Cedar SDK integration | The cedar-policy crate (v4) is a workspace dependency, wired as a secondary policy filter via AclEngine::set_cedar_policy / apply_cedar_policy. A native ABAC engine (deny-wins, attribute conditions) owns the primary evaluation path; Cedar is consulted as a deny-wins overlay only when a policy text is configured |
Cypher MATCH patterns + WITH WARRANT | Parser only handles WITH PROVENANCE; these are target syntax only |
| SQL:2011 period predicates | FOR SYSTEM_TIME FROM/TO/BETWEEN, OVERLAPS, CONTAINS, PRECEDES, auto period-splitting are not parsed; use explicit valid_from/system_from predicates (AS OF covers point-in-time) |
| Biometric ACL | Deferred pending legal review |
| Sub-tenant namespaces | NamespacePath on Row — accepted but deferred |
Release-readiness rule
A capability is release-ready only when it has: (1) committed implementation, (2) public-safe documentation if user-facing, (3) tests or validation output, (4) known limits documented here. Items listed above as "parses, then errors" or "not wired" are not release-ready.