# Changelog — klieo-graph-projector

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

Stable at `1.x` per ADR-039 — see the trait freeze contract there
for the frozen surfaces. Future minor bumps follow the
workspace-shared-version contract documented in `docs/SEMVER.md`.

## [Unreleased]

No changes yet beyond 1.0.0.

## [1.0.0] — 2026-06-05

### Stability promotion

- Promoted from `0.3.0` to `1.0.0` per
  [ADR-039](../../docs/adr/adr-039-graphrag-1-0-promotion.md).
  No source-code or behaviour change.
- Trait freeze: `EpisodeProjector` / builder,
  `spawn` async-task lifecycle (cancellation, drop-on-closed,
  lag recording), `project_run` batched-flush contract,
  `ProjectionError` variants + source chain, `HintsOnlyExtractor`.
- Downstream `Cargo.toml`: pin `klieo-graph-projector = "1"`.
- Bumped `klieo-memory-graph` dep `0.7` → `1`.

## [0.3.0] — 2026-06-05

### Performance

- `EpisodeProjector::project_run` now flushes the entire replayed
  run in a single `KnowledgeGraph::index_many` call (new in
  `klieo-memory-graph` 0.6.0) instead of issuing one
  `graph.index()` per episode in a serial loop. Backends with
  native bulk-insert (e.g. `Neo4jKnowledgeGraph` 0.5.0 UNWIND)
  collapse N facts into O(1) round-trips per batch.

  Live `spawn` path is unchanged: per-episode `index` on each
  broadcast event, since batching across unknown future episodes
  isn't possible.

  Resolves the M3 perf-reviewer HIGH N+1 finding
  (`klieo-graph-projector/src/projector.rs:project_run`, flagged
  2026-06-03, deferred per backfill-scope policy).

### Changed (internal)

- Extracted `build_index_entry` helper shared by both `project_run`
  (batch flush) and `project_episode` (live broadcast). Single
  source of truth for the per-episode extraction + `FactId`
  minting contract.

- Bumped `klieo-memory-graph` dep `0.5` → `0.6`.

## [0.2.0] — Prior milestones

Pre-CHANGELOG history; see git log for M1–M2.
