# Changelog — klieo-memory-qdrant

All notable changes to this crate are documented here.
Format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
This crate adheres to [Semantic Versioning](https://semver.org/).

## [2.0.0] — 2026-06-08

### Breaking changes

- `MemoryQdrant` is now `#[non_exhaustive]`. Adopters constructing
  the struct via literal syntax must switch to `MemoryQdrant::connect`
  (capability default) or `MemoryQdrant::new` (custom embedder).
  Reading fields and pattern-matching with `..` continue to work.

  Migration:

  ```rust
  // Before (1.x):
  let mem = MemoryQdrant { long_term, qdrant_long_term };

  // After (2.x):
  let mem = MemoryQdrant::connect("http://localhost:6333").await?;
  ```

  Rationale matches `klieo-memory-sqlite` 2.0 — wired-bundle structs
  expect additive fields (filterable graph, scoped recall) without
  forcing future majors.

## [1.2.0] — 2026-06-05

### Added

- `MemoryQdrant::connect(url)` capability default per ADR-036 — wraps
  `QdrantConfig::new(url)` + `Arc::new(DummyEmbedder)` so adopters can
  stand up a Qdrant-backed memory in one call. README + `lib.rs`
  rustdoc now lead with `connect`; the full
  `MemoryQdrant::new(QdrantConfig, Arc<dyn Embedder>)` constructor is
  retained as the "Advanced wiring — custom embedder" path.

### Notes

- Coordinated with `klieo-memory-sqlite` 1.1.0 (`MemorySqlite::open`)
  and `klieo-memory-graph-rag` 0.2.0 (`GraphAwareLongTerm::builder`)
  as the ADR-036 PR 1 capability-default cluster.

## [1.1.0] — 2026-06-04

### Added

- `FilterableLongTermMemory` impl on `QdrantLongTerm` — vector recall
  restricted to a candidate `FactId` set supplied by the M2
  `GraphAwareLongTerm` composer (which sources candidates from
  `KnowledgeGraph::neighbors`).
- `embedder_id` field on `QdrantConfig` (default `"default"`) +
  `with_embedder_id` builder + `embedder_id()` accessor — surfaced via
  `FilterableLongTermMemory::embedder_id()`.
- `QdrantLongTerm::recall_filtered_checked` wrapper hard-fails on
  caller/store embedder-id mismatch with a typed `MemoryError::Embedding`.
  Silent semantic drift on embedder version is far worse than a typed
  error at the seam.
- `MemoryQdrant::qdrant_long_term` field exposes the concrete handle so
  callers can reach `recall_filtered_checked` (which is inherent on
  `QdrantLongTerm`, not part of the `LongTermMemory` trait surface).
- Payload-decode helper `decode_point_to_fact` shared by `recall` and
  `recall_filtered` — payload-schema changes now land in one place.

### Breaking

- `QdrantConfig` is now `#[non_exhaustive]`. No public callers in tree —
  construction goes through `QdrantConfig::new` + builders, which keep
  working unchanged.
- `MemoryQdrant` gains a new public field `qdrant_long_term`. Struct
  literal construction was never supported (`MemoryQdrant::new` is the
  only constructor); the addition is source-compatible for callers that
  use the factory.

### Notes

- Coordinated with `klieo-memory-neo4j` 1.1.0 and the new
  `klieo-memory-graph` 0.1.0 + `klieo-memory-graph-neo4j` 0.1.0 crates
  as part of the GraphRAG cluster (ADR-035).

## [1.0.0] — 2026-05-29

### Added

- Initial 1.0 release alongside the rest of the klieo workspace.
  Provides Qdrant-backed `LongTermMemory` implementation against a
  Qdrant HTTP endpoint.
