Skip to content

Phase 5 / Outstanding Items - TODO

Honest accounting of work that's been mentioned but NOT yet shipped as of 2026-05-20. Each item is grouped with effort estimate, the user problem it solves, and the trigger that should pull it forward.

The goal here is to make sure nothing falls through the cracks between sessions; this file is the single landing page for "what's left."


Pluggable adapters - Phase 5 long tail

Vector tier alternates (high effort)

Provider Status Effort Trigger
pgvector SHIPPED 2026-05-20 -- Closes the lean profile vector hole. Narrow API surface.
lancedb SHIPPED 2026-05-20 -- Embedded MIT vector store; laptop / offline.
chroma SHIPPED 2026-05-20 -- Apache-2.0; persistent + network modes.
weaviate SHIPPED 2026-05-20 -- BSD-3; v4 client.
milvus SHIPPED 2026-05-20 -- Apache-2.0; pymilvus v2 client.

Status as of 2026-05-20: all five non-Qdrant vector adapters shipped. Each follows the same duck-typed _CollectionDescription / _SearchHit / _CountResult shape so call sites don't have to special-case the provider. All five expose the narrow QdrantClient surface RNR Enhanced Cognee actually uses; the long tail of Qdrant features (rich filters, named vectors, sparse vectors, payload indexes, quantization, hybrid search) raises NotImplementedError with a clear pointer to the per-adapter sub-section in PROFILES.md.

Graph tier alternates with different query languages

Provider Query language Status Notes
arangodb AQL SHIPPED 2026-05-20 Cypher-to-AQL translator for the narrow subset our codebase uses. Multi-hop / WHERE clauses raise NotImplementedError.
nebulagraph nGQL SHIPPED 2026-05-20 Routes through NebulaGraph 3+ openCypher mode; only the literal-RETURN form gets a YIELD rewrite.
ladybug Cognee-native SHIPPED 2026-05-20 In-process adapter mirroring the networkx_inmemory shape; uses ladybug's native graph API for COUNT / DETACH DELETE / RETURN-all.

Relational tier alternates (added 2026-05-20)

Provider Status Notes
duckdb SHIPPED 2026-05-20 (PR 10) MIT-licensed embedded columnar OLAP database. asyncpg-shaped facade via asyncio.to_thread over the sync duckdb driver. Great for analytics workloads + Superset BI dashboards. See docs/PROFILES.md for caveats.
mysql / mariadb SHIPPED 2026-05-20 (PR 10) MySQL 8+ / MariaDB 10+ via the asyncmy (Apache-2.0) driver. Targets managed offerings: Aurora MySQL, Cloud SQL for MySQL, Azure DB for MySQL, PlanetScale, Vitess.
mssql / sqlserver SHIPPED 2026-05-20 (PR 11) SQL Server 2019+ / Azure SQL via aioodbc (Apache-2.0) + Microsoft ODBC Driver 18. Targets enterprise SQL Server shops + Azure SQL PaaS.
oracle SHIPPED 2026-05-20 (PR 11) Oracle 19c/21c/23ai / Autonomous Database via the official oracledb driver (UPL). Native async; thin mode by default + opt-in thick mode for Instant Client features.
db2 SHIPPED 2026-05-20 (PR 11) IBM Db2 LUW 11.5+ / Db2 on Cloud via ibm_db (Apache-2.0 binding). Sync wrapped with asyncio.to_thread. Targets IBM Z / Power Systems / IBM Cloud.
snowflake SHIPPED 2026-05-20 (PR 12) Snowflake cloud data warehouse via snowflake-connector-python (Apache-2.0). Account-locator-based connection; sync wrapped with asyncio.to_thread. Pair with qdrant/chroma for vectors.
databricks SHIPPED 2026-05-20 (PR 12) Databricks SQL Warehouse via databricks-sql-connector (Apache-2.0). Bearer-token auth; Unity Catalog ready.
CockroachDB 🟢 WORKS VIA postgres Speaks Postgres wire protocol; existing postgres adapter targets it with no code changes. Set POSTGRES_HOST=cockroach.internal POSTGRES_PORT=26257. See PROFILES.md for caveats (no pgvector, no AGE).

Misc

  • redis_compat -- wire-compatible alternative Redis fork (e.g. KeyDB / Garnet / Dragonfly). ✅ SHIPPED 2026-05-20 as a labelled alias of the valkey adapter. Operational intent in env vars: "this isn't real Redis OR Valkey, it's a third-party fork." See src/db_adapters/cache_redis_compat.py.

Operational verification (need a running stack)

Item Why deferred What's needed
Live integration tests against ArcadeDB SHIPPED 2026-05-20 The ArcadeDB adapter now ships dual transports (PR #9): ARCADEDB_TRANSPORT=bolt (default, requires the optional Bolt plugin) or ARCADEDB_TRANSPORT=http (uses ArcadeDB's stock /api/v1/command/{db} REST endpoint -- no extra plugin). CI will run the integration tests against the public arcadedata/arcadedb:26.x image with ARCADEDB_TRANSPORT=http. Tests in tests/integration/test_arcadedb_integration.py.
Live integration tests against Apache AGE SHIPPED 2026-05-20 tests/integration/test_apache_age_integration.py -- 4 tests including native _AGENode / _AGERelationship round-trips. CI swaps the Postgres image to apache/age:PG16_latest and bootstraps CREATE EXTENSION age + create_graph('cognee_test_graph') via an idempotent psql step.
Live verification of SigNoz + Superset stack SHIPPED 2026-05-20 (PR #38) tests/integration/test_signoz_smoke.py -- gated by ENHANCED_RUN_SIGNOZ_SMOKE=1; emits an OTel span via src/tracing.py, polls the SigNoz Query Service until the span surfaces in signoz_traces.signoz_index_v2, then asserts the trace ID round-trips. Boot the monitoring stack via monitoring/docker-compose-monitoring.yml before running.
Exported Superset dashboards SHIPPED 2026-05-20 All 5 dashboards (memory_growth / agent_activity / llm_cost_trends / dedup_effectiveness / perf_regression) ship as importable Superset 4.x JSON in monitoring/superset-dashboards/ with a shared _dataset_definitions.yaml. The queries hit the real schemas (shared_memory.documents, shared_memory.llm_usage, shared_memory.embeddings, signoz_traces.signoz_index_v2); the dashboards light up as soon as data flows.

Performance + benchmarks (H4)

Item Status Effort Trigger
Locust scenarios against the live stack SHIPPED 2026-05-20 -- tests/load/locustfile.py now ships 8 HttpUser classes -- the original 3 memory-CRUD profiles plus 4 Phase 5 additions (SemanticSearchUser, KnowledgeGraphUser, GDPRWorkflowUser, BackupVerifyUser) + the opt-in HealthCheckUser. See tests/load/README.md for run instructions + recommended SLAs.
Perf-regression dashboard in SigNoz SHIPPED 2026-05-20 -- Ships as monitoring/superset-dashboards/perf_regression.json -- p50/p95/p99 latency, error %, RPS, slowest-endpoints, all sourced from SigNoz's ClickHouse trace store. Use to compare Locust runs against a baseline.
Benchmarks comparing graph providers (arcadedb / neo4j / apache_age / kuzu) SHIPPED 2026-05-20 -- tests/benchmarks/run_provider_comparison.py drives Locust against 5 provider permutations (default / lean / neo4j_stack / embedded / memgraph_kuzu) and emits a comparison report. Caller boots the underlying services; runner shells out to locust --headless --csv and parses the CSV output into JSON + markdown comparison tables.

AGE adapter feature gaps

The apache_age adapter ships in a deliberately narrow state. Tracked gaps:

Gap Effort Trigger
Parameterised Cypher ($param syntax) SHIPPED 2026-05-20 Now passes through AGE's three-arg cypher(graph, $$ ... $$, agtype_map) form via psycopg2 parameter binding. Rejects payloads containing $$ to prevent dollar-quote breakout.
Async session API SHIPPED 2026-05-20 get_async_graph_driver() returns an asyncpg-backed _AsyncAGEDriver. Use async with driver.session() as s: await s.run(cypher).
Returning native graph elements as neo4j Node / Relationship objects SHIPPED 2026-05-20 _unwrap_agtype now converts ::vertex payloads to _AGENode and ::edge payloads to _AGERelationship, both shaped like neo4j.graph.Node / Relationship (.id / .labels / .type / .start_node / .end_node / dict protocol). ::path decodes to List[_AGENode \| _AGERelationship].

Multi-tenant data partitioning (PR 15 + 15b + 15c)

Item Status Notes
TenantContext + naming helpers (tenant_scoped_table/collection/key/graph) SHIPPED 2026-05-20 (PR #39) ContextVar-based; sync + async context managers; ENHANCED_REQUIRE_TENANT=1 production safety knob
Lazy per-tenant Postgres schema bootstrap (ensure_tenant_schema) SHIPPED 2026-05-20 (PR #39) Idempotent CREATE TABLE IF NOT EXISTS shared_memory.documents_t_<tenant> (LIKE shared_memory.documents INCLUDING ALL)
Wiring across MCP memory tools + 24 src/ modules (~100+ call sites) SHIPPED 2026-05-20 (PR #39) add_memory, search_memories, delete_memory, list_agents in mcp_memory_tools; full storage layer across agent_memory_integration, cross_agent_sharing, encryption_manager, etc.
Cross-tenant isolation end-to-end tests SHIPPED 2026-05-21 (PR #42) 15 tests verifying tenant A's writes hit documents_t_a only; nested context unwind; per-task ContextVar isolation; ID sanitisation; un-scoped backwards-compat
HTTP X-Tenant-ID header → TenantContext middleware SHIPPED 2026-05-21 (PR #43) FastAPI middleware in EnhancedCogneeMCPServer.__init__; every storage call from an HTTP handler sees the per-request tenant automatically. 5 propagation tests

Cross-language client SDKs (PR 16)

Language Status Notes
Python ✅ Production (since v1.0.0) Installed as enhanced-cognee-client on PyPI
Node.js / TypeScript SHIPPED 2026-05-21 (PR #41) clients/node/ -- 7 unit tests using node:test + mocked fetch
Go SHIPPED 2026-05-21 (PR #41) clients/go/ -- 9 unit tests using net/http/httptest; context.Context first arg per Go idiom
Rust SHIPPED 2026-05-21 (PR #41) clients/rust/ -- 7 integration tests using wiremock; async via tokio + reqwest (rustls-tls)

All four clients share the same HTTP contract (5 endpoints) and the same X-API-Key + X-Tenant-ID headers.


Triage policy

When considering whether to pull something from this file forward:

  1. Customer ask -> ship it. Phase 5 is explicitly demand-driven.
  2. Adjacent work -> ship it. If you're already touching the graph layer, fold in the missing graph adapter someone's asked for; if you're already wiring CI, fold in the integration tests.
  3. Speculative -> leave on this list. "Maybe we'll need pgvector someday" is not a reason to spend 3-5 days shipping it now.

Cross-reference