Version: 0.21.0 Last Updated: 2026-04-30
This document tracks all planned features across the platform with current status and target milestone.
| Symbol | Meaning |
|---|---|
| 🔴 | Not started |
| 🟡 | In progress |
| 🟢 | Complete |
| Milestone | Scope | Status |
|---|---|---|
| M1 | Scaffold & infrastructure | 🟢 Complete |
| M2 | GitHub ingestion | 🟢 Complete |
| M3 | Fast path processor | 🟢 Complete |
| M4 | Retrieval engine + providers | 🟢 Complete |
| M5 | React Control Center (frontend) | 🟢 Complete |
| M6 | Auth, rate limiting, workspace API, lifecycle, audit | 🟢 Complete |
| M7 | Slow path worker, embeddings, Qdrant writes, scheduler | 🟢 Complete |
| M8 | Promotion pipeline | 🟢 Complete |
| M9 | Slack ingestion | 🟢 Complete |
| M10 | Linear + Jira ingestion | 🟢 Complete |
| M11 | MCP server | 🟢 Complete |
| M12 | Lifecycle configuration | 🟢 Complete |
| M13 | Workspace stats endpoint + Dashboard KPIs | 🟢 Complete |
| M14 | Retrieval Trace view (live data) | 🟢 Complete |
| M15 | Webhook Tester — multi-source (Slack, Linear, Jira) | 🟢 Complete |
| M16 | DLQ management UI (retry + discard from the Integration view) | 🟢 Complete |
| M17 | Settings view — write mode (config sliders + provider selection) | 🟢 Complete |
| M18 | Workspace stats time-series endpoint + trend charts | 🟢 Complete |
| M19 | Scope-filtered retrieval (agent_id, user_id, repo on search + retrieve) | 🟢 Complete |
| M20 | Tag management API + UI (enumerate, count, bulk-retag) | 🟢 Complete |
| M21 | Import / restore (JSONL round-trip with export) | 🟢 Complete |
| M22 | Metrics dashboard (OTel summary endpoint + UI panel) | 🟢 Complete |
| M23 | Property-based tests for token packing (proptest) | 🟢 Complete |
| M24 | Playwright E2E test suite | 🟢 Complete |
| M25 | HTTP Tools (agent-callable tool registry) | 🟢 Complete |
| M26 | Contradiction detection | 🟢 Complete |
| M27 | Provenance graph + lineage API | 🟢 Complete |
| M28 | Point-in-time memory queries | 🟢 Complete |
| M29 | Multi-agent scope inheritance + publish | 🟢 Complete |
| M30 | Retrieval feedback loop | 🟢 Complete |
| M31 | Compliance mode (retention + right-to-erasure) | 🔴 Not started |
| M32 | Agent-authored observation ingest | 🟢 Complete |
| M33 | LOCOMO benchmark integration | 🔴 Not started |
| M34 | UX Gap Completeness Pass | 🟢 Complete |
| M35 | In-App Walkthrough Guide + Connection Wizard | 🟢 Complete |
| Feature | Status | Milestone | Notes |
|---|---|---|---|
| Cargo workspace root | 🟢 | M1 | 5 crates wired |
| docker-compose (dev) | 🟢 | M1 | Postgres, Redis, Qdrant |
| docker-compose.test.yml | 🟢 | M1 | Isolated test infra |
| sqlx migrations scaffold | 🟢 | M1 | 0001–0021 tracked |
| rust-toolchain.toml (MSRV 1.88) | 🟢 | M1 | |
| GitHub Actions CI (fmt + clippy + test + integration) | 🟢 | M1/M6 | Integration job added in M6 |
| common crate (models, traits, error, config, telemetry) | 🟢 | M1 |
| Feature | Status | Milestone | Notes |
|---|---|---|---|
| GitHub webhook receiver | 🟢 | M2 | HMAC-SHA256 validation |
| GitHub event normalization (PR, push, review, issue) | 🟢 | M2 | Maps to RawEvent |
| HMAC signature validation (shared WebhookValidator trait) | 🟢 | M2 | GitHub + Slack via same interface |
| RawEvent Postgres write (transactional) | 🟢 | M2 | |
| Redis job enqueue on ingest | 🟢 | M2 | |
| Idempotency key (SHA256 dedup) | 🟢 | M2 | |
| Integration health tracking (last_event_at, error_count) | 🟢 | M6 | integrations table |
| Dead letter queue for failed jobs | 🟢 | M6 | Redis list dlq:{workspace_id} |
| DLQ manual retry API | 🟢 | M6 | POST /workspaces/:id/dlq/:job_id/retry |
| Auto-retry with exponential backoff (max 3) | 🟢 | M6 | |
| Slack webhook receiver | 🟢 | M9 | Slack Events API receiver at POST /v1/ingest/slack/{workspace_id} |
| Slack message ingestion | 🟢 | M9 | message, message.edited, app_mention |
| Slack reaction ingestion | 🟢 | M9 | reaction_added with channel + message timestamp lineage |
| Linear webhook receiver | 🟢 | M10 | X-Linear-Signature HMAC-SHA256 |
| Linear event normalization | 🟢 | M10 | Issue, Comment, Project, Cycle → RawEvent |
| Jira webhook receiver | 🟢 | M10 | X-Hub-Signature HMAC-SHA256 |
| Jira event normalization | 🟢 | M10 | issue_created/updated/deleted, comment → RawEvent |
| Feature | Status | Milestone | Notes |
|---|---|---|---|
| Fast path worker (no LLM) | 🟢 | M3 | Entity extraction, tagging, importance scoring |
| Entity extraction (regex + rules) | 🟢 | M3 | Person, Repo, Branch, File, Team |
| Importance scoring (rule table) | 🟢 | M3 | Workspace-configurable thresholds |
| Episodic MemoryUnit creation | 🟢 | M3 | |
| Slow path async worker | 🟢 | M7 | XREADGROUP consumer loop; LLM + embed pipeline |
| LLM summarization (OllamaProvider default) | 🟢 | M7 | Via LlmProvider trait |
| Embedding generation (fastembed-rs default) | 🟢 | M7 | Via EmbeddingProvider trait |
| Qdrant vector write | 🟢 | M7 | memoryops_memories collection |
| Decay scheduler (daily 02:00 UTC) | 🟢 | M7 | Spawned from api/main.rs |
| Pruning (soft delete at decay < 0.1) | 🟢 | M7 | Skips pinned + importance_overridden |
| Hard delete after 30-day window | 🟢 | M7 | Also removes Qdrant point |
| Promotion pipeline (episodic → semantic) | 🟢 | M8 | Cluster → threshold → summarize → promote |
| Configurable promotion threshold | 🟢 | M8 | Per workspace |
| Memory deduplication | 🟢 | M8 | Cosine similarity threshold |
| Per-workspace decay half-life | 🟢 | M12 | decay_half_life_days in WorkspaceConfig |
| Configurable pruning threshold | 🟢 | M12 | soft-delete threshold per workspace |
| Contradiction detection on slow-path embedding | 🟢 | M26 | Qdrant candidate scan with quarantine or auto-resolve mode |
| Feature | Status | Milestone | Notes |
|---|---|---|---|
| EmbeddingProvider trait | 🟢 | M4 | In common crate |
| FastEmbedProvider (local, default) | 🟢 | M4 | fastembed-rs |
| OpenAIEmbedProvider | 🟢 | M4 | text-embedding-3-small |
| LlmProvider trait | 🟢 | M4 | In common crate |
| OllamaProvider (local, default) | 🟢 | M4 | Configurable model |
| OpenAIProvider | 🟢 | M4 | Chat Completions API |
| AnthropicProvider | 🟢 | M4 | Messages API |
| Provider selection via TOML config | 🟢 | M4 | No code changes to swap |
| Feature | Status | Milestone | Notes |
|---|---|---|---|
| Hybrid search (RRF: Qdrant + Postgres FTS) | 🟢 | M4 | Degrades gracefully to keyword-only without embeddings |
| Keyword search (PostgreSQL tsvector + GIN) | 🟢 | M4 | plainto_tsquery, FTS indexes |
| RRF fusion scoring | 🟢 | M4 | k=60, normalized 0–1 |
| Decay scoring formula | 🟢 | M4 | importance × 0.5^(elapsed/half-life) |
| Decay batch update pass | 🟢 | M4 | apply_decay_scores_with_half_life; skips pinned/overridden |
| Access tracking (Redis HINCR + last_accessed_at) | 🟢 | M4 | 90-day TTL |
| Promotion eligibility check (access + importance) | 🟢 | M4 | Async, non-blocking |
| GET /v1/memory (list, filter, sort, paginate) | 🟢 | M4 | |
| GET /v1/memory/:id | 🟢 | M4 | |
| PATCH /v1/memory/:id (pin, tag, importance override) | 🟢 | M4 | |
| POST /v1/memory/search | 🟢 | M4 | |
| Token packing (greedy, under budget) | 🟢 | M6 | |
| Deduplication in packing (cosine > 0.92) | 🟢 | M6 | |
| POST /v1/retrieve (full retrieval surface) | 🟢 | M6 | With token packing + trace |
| Retrieval trace generation | 🟢 | M6 | Per-component scores, exclusion reasons |
| Trace persistence (30 days) | 🟢 | M6 | retrieval_traces table |
| GET /v1/retrieve/trace/:query_id | 🟢 | M6 | |
| Vector search leg (live when embedding_id populated) | 🟢 | M7 | Wired through slow path embeddings |
| Configurable scoring weights per workspace | 🟢 | M6 | WorkspaceConfig |
| Point-in-time memory list/search | 🟢 | M28 | GET /v1/memory?as_of=... and historical hydration via memory_versions |
| Point-in-time retrieval | 🟢 | M28 | POST /v1/retrieve as_of with historical decay math and trace persistence |
| Workspace-pool retrieval inheritance | 🟢 | M29 | include_workspace_pool and sub_agent_pools allow agent-scoped searches to include published semantic memory |
| Retrieval feedback relevance scoring | 🟢 | M30 | Last-100 rolling feedback average updates relevance_score and nudges hybrid scoring by 10% |
| Retrieval trace feedback fields | 🟢 | M30 | feedback_applied plus per-candidate relevance_score in trace JSON |
| Feature | Status | Milestone | Notes |
|---|---|---|---|
| GET /v1/memory | 🟢 | M4 | Paginated, filterable, sortable |
| GET /v1/memory/:id | 🟢 | M4 | |
| PATCH /v1/memory/:id | 🟢 | M4 | Pin, tag, edit, importance override |
| POST /v1/memory/search | 🟢 | M4 | Hybrid / vector / keyword |
| DELETE /v1/memory/:id | 🟢 | M6 | Soft delete; Qdrant point removed |
| POST /v1/memory/:id/promote | 🟢 | M6 | Force episodic → semantic |
| POST /v1/memory/:id/restore | 🟢 | M6 | Re-enqueues for re-embedding in M7 |
| POST /v1/memory/bulk | 🟢 | M6 | Bulk pin / unpin / delete (max 100) |
| GET /v1/memory/:id/history | 🟢 | M6 | Version history |
| POST /v1/memory/merge | 🟢 | M6 | Appends source → target, soft-deletes source |
| POST /v1/retrieve | 🟢 | M6 | |
| GET /v1/retrieve/trace/:query_id | 🟢 | M6 | |
| POST /v1/workspaces | 🟢 | M6 | Bootstrap, requires x-admin-token |
| GET /v1/workspaces/:id | 🟢 | M6 | |
| PATCH /v1/workspaces/:id/config | 🟢 | M6 | Scoring weights, thresholds, provider config |
| POST /v1/workspaces/:id/integrations | 🟢 | M6 | |
| GET /v1/workspaces/:id/integrations | 🟢 | M6 | With health status |
| DELETE /v1/workspaces/:id/integrations/:source | 🟢 | M6 | |
| POST /v1/workspaces/:id/keys | 🟢 | M6 | API key creation |
| GET /v1/workspaces/:id/keys | 🟢 | M6 | |
| DELETE /v1/workspaces/:id/keys/:key_id | 🟢 | M6 | Revoke |
| GET /v1/workspaces/:id/audit | 🟢 | M6 | Paginated audit log |
| GET /v1/workspaces/:id/dlq | 🟢 | M6 | |
| POST /v1/workspaces/:id/dlq/:job_id/retry | 🟢 | M6 | |
| DELETE /v1/workspaces/:id/dlq/:job_id | 🟢 | M6 | |
| GET /v1/workspaces/:id/export | 🟢 | M7 | JSONL streaming, cursor-paginated |
| POST /v1/workspaces/:id/promote | 🟢 | M8 | Manual promotion pass with workspace lock |
| GET /v1/workspaces/:id/stats | 🟢 | M13 | Aggregate memory stats per workspace |
| GET /v1/workspaces/:id/stats/history | 🟢 | M18 | Daily aggregate: created, promoted, soft-deleted per day |
| GET /v1/workspaces/:id/tags | 🟢 | M20 | Tag name + count enumeration |
| POST /v1/workspaces/:id/import | 🟢 | M21 | JSONL import; idempotent on id |
| POST/GET/PATCH/DELETE /v1/workspaces/:id/tools[/:name] | 🟢 | M25 | Workspace HTTP tools registry; secret read is isolated at /secret |
| GET /v1/workspaces/:id/contradictions, POST /v1/workspaces/:id/contradictions/:flag_id/resolve, GET /v1/workspaces/:id/contradictions/count | 🟢 | M26 | Review and resolve contradiction flags |
| POST /v1/workspaces/:id/contradictions/bulk-dismiss | 🟢 | M34 | Dismiss up to 50 open contradiction flags in one call |
| POST /v1/workspaces/:id/reindex | 🟢 | M34 | Trigger cursor-paginated re-embedding for missing/stale embedding_ids; force=true clears all first |
| POST /v1/workspaces/:id/tools/:name/test | 🟢 | M34 | Server-side tool test proxy (injects auth, returns status+latency+body) |
| GET /health/system | 🟢 | M34 | Structured health check for Postgres, Redis, Qdrant, Ollama, FastEmbed |
| GET /v1/memory/:id/provenance | 🟢 | M27 | Source events, source episodes, merge audit records, and access summary as DAG |
| GET /v1/memory?as_of=... | 🟢 | M28 | Reconstructs active memories as of an ISO8601 timestamp |
| POST /v1/retrieve with as_of | 🟢 | M28 | Historical retrieval packs memory state and scores at timestamp |
| POST /v1/memory/:id/publish | 🟢 | M29 | Publishes semantic memory to workspace pool and writes audit action |
| POST /v1/memory/search include_workspace_pool | 🟢 | M29 | Agent searches can include workspace-published memories |
| PATCH /v1/workspaces/:id/config sub_agent_pools | 🟢 | M29 | Configures automatic workspace-pool inheritance for sub-agents |
| POST /v1/memory/:id/feedback | 🟢 | M30 | Stores explicit retrieval feedback and returns updated MemoryUnit relevance_score |
| GET /v1/memory/:id/feedback | 🟢 | M30 | Paginated feedback history with avg_rating and current relevance_score |
| Feature | Status | Milestone | Notes |
|---|---|---|---|
| MCP server crate scaffold | 🟢 | M11 | new crate: crates/mcp/ |
| memory_retrieve tool | 🟢 | M11 | in-process retrieval with token packing |
| memory_search tool | 🟢 | M11 | in-process memory search |
| memory_store tool | 🟢 | M11 | stores an episodic MemoryUnit and enqueues slow-path processing |
| stdio + HTTP SSE transports | 🟢 | M11 | MCP 2025-06-18 spec |
| MCP endpoint in docker-compose | 🟢 | M11 | profile-gated service on port 3003 |
| memory_retrieve returns enabled workspace tools | 🟢 | M25 | Tools array includes endpoint and JSON schemas without secrets |
| memory_retrieve include_workspace_pool | 🟢 | M29 | Tool schema supports workspace-pool inheritance for agent context |
| memory_retrieve feedback batch | 🟢 | M30 | Optional feedback payload records ratings after retrieval response assembly |
| Feature | Status | Milestone | Notes |
|---|---|---|---|
| API key auth (X-API-Key header) | 🟢 | M6 | Middleware on all routes except /ingest/* + /health/* |
| Argon2id key hashing | 🟢 | M6 | Plaintext returned once on creation |
| Key format: mops__<32 bytes base58> | 🟢 | M6 | |
| Async last_used_at update (fire-and-forget) | 🟢 | M6 | |
| Key revocation | 🟢 | M6 | |
| Rate limiting (per workspace, per endpoint group) | 🟢 | M6 | Redis sliding window, 60s |
| 429 response with Retry-After header | 🟢 | M6 | |
| Rate limit groups: ingest 300 RPM, memory 120 RPM, api 120 RPM | 🟢 | M6 |
| Feature | Status | Milestone | Notes |
|---|---|---|---|
| Audit log (all state-changing operations) | 🟢 | M6 | AuditEntry with before/after diff |
| Audit writes fire-and-forget (never block request path) | 🟢 | M6 | tokio::spawn |
| tracing + OpenTelemetry instrumentation | 🟢 | M6 | All services |
| Integration health dashboard data | 🟢 | M6 | |
| In-process metrics registry (counters + histograms) | 🟢 | M22 | crates/common::telemetry |
| Metrics summary endpoint | 🟢 | M22 | GET /v1/workspaces/:id/metrics |
| Ingest events / slow-path / retrieval counters | 🟢 | M22 | Recorded at handler + worker call sites |
| Embedding + LLM latency histograms (p50/p99) | 🟢 | M22 | Recorded around provider calls |
| Token-pack budget-used histogram (mean) | 🟢 | M22 | Recorded after pack_memories |
| Feature | Status | Milestone | Notes |
|---|---|---|---|
| Project scaffold (Vite + React 19 + TS + Tailwind v4) | 🟢 | M5 | |
| Zustand store (workspaceId + apiKey, in-memory only) | 🟢 | M5 | No localStorage/sessionStorage |
| TanStack Query API client wired to live endpoints | 🟢 | M5 | Workspace-scoped query keys |
| Vite proxy for /v1 and /health | 🟢 | M5 | |
| Memory Explorer (search, filter, sort, paginate) | 🟢 | M5 | GET /v1/memory + POST /v1/memory/search |
| Memory Detail view (entities, scope, score, tags) | 🟢 | M5 | GET /v1/memory/:id |
| Pin / Tag / Importance override actions | 🟢 | M5 | PATCH /v1/memory/:id (optimistic cache update) |
| Webhook tester (fire real GitHub payloads) | 🟢 | M5 | POST /v1/ingest/github/{workspace_id} |
| Settings view (workspace config, read-only) | 🟢 | M5 | |
| Retrieval Trace view (live query + trace drill-down) | 🟢 | M14 | Replaces M5 stub |
| Lifecycle / Promotion Timeline (stubbed) | 🟢 | M5 | Wired in M8 |
| Integration Status view (stubbed) | 🟢 | M5 | |
| Audit Log view (stubbed) | 🟢 | M5 | |
| First-run workspace + key creation flow | 🟢 | M7 | POST /v1/workspaces + POST /v1/workspaces/:id/keys |
| X-API-Key header on all API requests | 🟢 | M7 | From Zustand store |
| Audit Log view (live data) | 🟢 | M7 | GET /v1/workspaces/:id/audit |
| Integration Status view (live data + DLQ panel) | 🟢 | M7 | |
| Export trigger (download JSONL) | 🟢 | M7 | GET /v1/workspaces/:id/export |
| Bulk pin / bulk delete | 🟢 | M6 | POST /v1/memory/bulk |
| Memory merge UI | 🟢 | M6 | POST /v1/memory/merge |
| Promotion controls | 🟢 | M8 | Threshold sliders + manual trigger |
| Semantic memory display | 🟢 | M8 | Badge, source count, promoted timestamp |
| Dashboard KPI strip (6 cards via /stats) | 🟢 | M13 | Replaces 3 useMemoryList calls |
| Dashboard secondary stats row | 🟢 | M13 | Memory health + 30-day activity cards |
| Retrieval Trace view (live data) | 🔴 | M14 | GET /v1/retrieve/trace/:query_id; per-component score breakdown |
| Webhook Tester — Slack fixtures | 🟢 | M15 | POST /v1/ingest/slack/{workspace_id}; source tab switcher |
| Webhook Tester — Linear fixtures | 🟢 | M15 | POST /v1/ingest/linear/{workspace_id} |
| Webhook Tester — Jira fixtures | 🟢 | M15 | POST /v1/ingest/jira/{workspace_id} |
| DLQ retry action (from Integration view) | 🟢 | M16 | POST /v1/workspaces/:id/dlq/:job_id/retry |
| DLQ discard action (from Integration view) | 🟢 | M16 | DELETE /v1/workspaces/:id/dlq/:job_id |
| DLQ error detail expand (raw payload + error message) | 🟢 | M16 | Inline expandable row in DLQ panel |
| Settings view — config write (decay, pruning, promotion sliders) | 🟢 | M17 | PATCH /v1/workspaces/:id/config |
| Settings view — provider selector (LLM + embedding) | 🟢 | M17 | Dropdown saved via PATCH /v1/workspaces/:id/config |
| Dashboard trend charts (30-day memory activity) | 🟢 | M18 | GET /v1/workspaces/:id/stats/history |
| Tag browser (enumerate + filter by tag) | 🟢 | M20 | GET /v1/workspaces/:id/tags |
| Dashboard Metrics panel (3×3 telemetry grid, auto-refresh 30s) | 🟢 | M22 | useMetrics hook → /v1/workspaces/:id/metrics |
| Tools registry view | 🟢 | M25 | CRUD table, drawer form, schema validation, enabled toggle |
| Contradiction review view | 🟢 | M26 | Status tabs, side-by-side memory previews, resolve notes |
| Dashboard contradiction badge | 🟢 | M26 | Open-count badge links to review queue |
| MemoryDetail lineage panel | 🟢 | M27 | Tree view for provenance graph |
| Memory Explorer point-in-time filter | 🟢 | M28 | As Of datetime filter feeds GET /v1/memory and POST /v1/memory/search |
| Memory visibility badges | 🟢 | M29 | Detail and list rows show Private vs Workspace Pool visibility |
| Publish semantic memory action | 🟢 | M29 | Memory Detail publishes private semantic memories with optimistic cache update |
| Settings sub-agent pools field | 🟢 | M29 | Workspace config writes comma-separated inherited agent pools |
| Memory Detail feedback panel | 🟢 | M30 | Rating buttons, optional comment, query_id, recent feedback, and relevance meter |
| Retrieval Trace relevance display | 🟢 | M30 | Feedback-applied badge and per-candidate relevance_score column |
| Memory Explorer relevance sorting | 🟢 | M30 | Relevance up/down sort options backed by relevance_score |
| Contradiction winner selection (Keep A / Keep B) | 🟢 | M34 | Soft-deletes the losing memory and records kept/discarded IDs on the flag |
| Bulk contradiction dismiss (up to 50) | 🟢 | M34 | Checkbox selection + "Dismiss Selected" bar in ContradictionsView |
| Memory-type filter with URL persistence | 🟢 | M34 | All / Episodic / Semantic chips in MemoryExplorer persist via ?type= query param |
| Auto-resolve contradiction config toggle | 🟢 | M34 | Toggle between quarantine and auto_resolve modes in SettingsView |
| Workspace re-index trigger | 🟢 | M34 | Confirmation flow + enqueued count display in SettingsView |
| Tools test button + inline test panel | 🟢 | M34 | Per-row FlaskConical button expands Method/URL/body editor + Run/response panel |
| System health panel | 🟢 | M34 | Live status strip in SettingsView with per-check latency badges |
| CodeBlock component | 🟢 | M35 | Dark pre/code block with copy button and live {{WORKSPACE_ID}}/{{API_KEY}}/{{API_URL}} substitution |
| GuideView (/guide) | 🟢 | M35 | Two-panel layout, 14 content sections, sticky TOC sidebar, connection status strip |
| Guide nav item (BookOpen) | 🟢 | M35 | Sidebar nav link above Settings |
| Webhook Tester — Observation source | 🟢 | M32 | POST /v1/ingest/observation; two fixtures (observation_agent, observation_deploy) |
| Integrations view — Observations tab | 🟢 | M32 | Live feed of recent agent observations filtered by scope source |
| GuideView — Agent Observations section | 🟢 | M32 | Curl example, MCP fields, idempotency callout, when-to-use guidance |
| Feature | Status | Milestone | Notes |
|---|---|---|---|
| Decay scoring (daily scheduler 02:00 UTC) | 🟢 | M7 | Runs for all workspaces |
| Soft delete / archive at decay threshold (< 0.10) | 🟢 | M7 | Skips pinned + importance_overridden |
| 30-day recovery window | 🟢 | M6 | POST /v1/memory/:id/restore |
| Hard delete after recovery window | 🟢 | M7 | Also removes Qdrant point |
| Pin = decay freeze | 🟢 | M4 | Pinned skipped in decay pass |
| Manual importance override | 🟢 | M4 | Stored, used in scoring, skips decay |
| Memory version history | 🟢 | M6 | Incremented on edit and merge |
| Soft delete → Qdrant point removed immediately | 🟢 | M7 | embedder.delete_point() on DELETE |
| Restore → re-enqueue for re-embedding | 🟢 | M7 | processor_jobs stream |
| Feature | Status | Milestone | Notes |
|---|---|---|---|
| JSONL export (streaming, cursor-paginated) | 🟢 | M7 | 500 rows/chunk, no raw payloads or vectors |
| Import (restore) | 🟢 | M21 | JSONL import endpoint available in v0.x |
| JSONL import (restore from export) | 🟢 | M21 | POST /v1/workspaces/:id/import; idempotent on id |
| Feature | Status | Milestone | Notes |
|---|---|---|---|
| agent_id filter on POST /v1/memory/search | 🟢 | M19 | Narrow results to a single agent |
| user_id filter on POST /v1/memory/search | 🟢 | M19 | |
| repo filter on POST /v1/memory/search | 🟢 | M19 | |
| agent_id filter on POST /v1/retrieve | 🟢 | M19 | |
| user_id filter on POST /v1/retrieve | 🟢 | M19 | |
| repo filter on POST /v1/retrieve | 🟢 | M19 |
| Feature | Status | Milestone | Notes |
|---|---|---|---|
| proptest token packing invariants | 🟢 | M23 | packed ≤ budget; dedup threshold respected; all excluded in trace |
| Playwright E2E — ingest → process → search flow | 🟢 | M24 | |
| Playwright E2E — promotion via repeated access | 🟢 | M24 | |
| Playwright E2E — DLQ retry flow | 🟢 | M24 |
| Feature | Status | Milestone | Notes |
|---|---|---|---|
| HTTP Tools (agent-callable tool registry) | 🟢 | M25 | Workspace registry + MCP retrieve integration |
| Feature | Status | Milestone | Notes |
|---|---|---|---|
| Contradiction detection — semantic conflict check on new ingest | 🟢 | M26 | Flags conflicts in audit log; configurable: auto-resolve (newer wins) or quarantine |
| Contradiction quarantine review API + UI | 🟢 | M26 | GET /v1/workspaces/:id/contradictions; resolve/dismiss actions |
| Provenance graph — GET /v1/memory/:id/provenance | 🟢 | M27 | Returns DAG: source events → episodic → semantic → merges → accesses |
| Provenance tree in MemoryDetail UI | 🟢 | M27 | Visual lineage panel in frontend MemoryDetail view |
| Point-in-time retrieval — as_of param on GET /v1/memory | 🟢 | M28 | Reconstructs memory state at timestamp; uses memory_versions + decay math |
| as_of support on POST /v1/retrieve | 🟢 | M28 | Historical context retrieval for incident post-mortems |
| Multi-agent scope visibility field (private | workspace) | 🟢 | M29 | scope_visibility on MemoryUnit |
| POST /v1/memory/:id/publish (agent → workspace pool) | 🟢 | M29 | Published semantic memories shared across agents |
| Sub-agent pool subscription via workspace config | 🟢 | M29 | Team agents inherit from configured sub-agent pools |
| Retrieval feedback table + relevance_score | 🟢 | M30 | Stores explicit ratings and updates MemoryUnit relevance_score |
| POST/GET /v1/memory/:id/feedback | 🟢 | M30 | Submit and inspect feedback history per memory |
| Feedback-biased retrieval + UI | 🟢 | M30 | Hybrid scorer nudge, trace relevance column, detail feedback panel, and relevance sorting |
| UX Gap Completeness Pass | 🟢 | M34 | Keep A/B resolution, bulk dismiss, memory-type URL filter, auto-resolve toggle, reindex, skill test panel, health panel |
| In-App Walkthrough Guide + Connection Wizard | 🟢 | M35 | /guide with 14 sections, CodeBlock with live substitution, health strip, sticky TOC |
| Per-workspace retention policy (max age + auto hard-purge) | 🔴 | M31 | Configured via WorkspaceConfig |
| DELETE /v1/workspaces/:id/forget/user/:user_id | 🔴 | M31 | Hard-purges all memories with matching scope.user_id |
| Compliance deletion audit trail | 🔴 | M31 | Separate compliance_audit_log table; GDPR/CCPA ready |
| POST /v1/ingest/observation (agent-authored memories) | 🟢 | M32 | Authenticated by workspace API key; same slow-path pipeline |
| MCP memory_store routes through /v1/ingest/observation | 🟢 | M32 | Closes agent read/write loop |
| cargo bench LOCOMO evaluation suite | 🔴 | M33 | Retrieval quality benchmarks against LOCOMO dataset |
| Per-workspace LOCOMO score on dashboard | 🔴 | M33 | Compare across workspace configs |
| Migration | Description | Status |
|---|---|---|
| 0001_init.sql | Core schema, workspaces base | 🟢 |
| 0002_memory_units.sql | memory_units + tsvector | 🟢 |
| 0003_raw_events.sql | raw_events + idempotency | 🟢 |
| 0004_retrieval.sql | retrieval_traces, access log | 🟢 |
| 0005_workspaces.sql | workspaces + workspace_config JSONB | 🟢 |
| 0006_api_keys.sql | api_keys table | 🟢 |
| 0007_audit_log.sql | audit_log table | 🟢 |
| 0008_integrations.sql | integrations + webhook_secret_hash | 🟢 |
| 0009_retrieval_traces.sql | retrieval_traces + 30-day TTL | 🟢 |
| 0010_soft_delete.sql | deleted_at + soft-delete indexes | 🟢 |
| 0011_scheduler.sql | hard_deleted_at + pruning indexes | 🟢 M7 |
| 0012_promotion.sql | semantic promotion metadata + thresholds | 🟢 M8 |
| 0013_slack.sql | Slack signing secret + channel/thread metadata + channel index | 🟢 M9 |
| 0014_linear_jira.sql | Linear/Jira signing secret support + active integration indexes | 🟢 M10 |
| 0015_scope_indexes.sql | Scope-filter generated columns + composite active-memory index | 🟢 M19 |
| 0016_skills.sql | HTTP tools registry with encrypted auth secrets | 🟢 M25 |
| 0017_contradictions.sql | Contradiction flags and resolution status | 🟢 M26 |
| 0018_provenance_indexes.sql | Source-event, source-episode, and memory audit lineage indexes | 🟢 M27 |
| 0019_point_in_time.sql | Historical as-of query indexes for memory_units and memory_versions | 🟢 M28 |
| 0020_scope_visibility.sql | scope_visibility column, publish audit action, and workspace-pool visibility index | 🟢 M29 |
| 0021_retrieval_feedback.sql | retrieval_feedback table and memory_units.relevance_score index | 🟢 M30 |
| 0022_contradiction_keep.sql | keep_a/keep_b ENUM values; kept/discarded columns; contradiction_resolved/workspace_reindexed audit actions | 🟢 M34 |
| 0024_observation_ingest.sql | observation source + agent_observation event_type + observation_ingested audit action; two observation indexes | 🟢 M32 |