All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

Unreleased

Added

  • Realistic demo fixtures: 12–16 seeded conversations spanning all JTBD states, 5 KB articles with revisions, 3 GapCandidates, 1 ArticleSuggestion ready for review (Phase 27)
  • Customer /chat widget wired to real ingress via Cairnloop.Channels.WidgetSocket + WidgetChannel; two-tab demo (Phase 28)
  • Brand-token CSS extraction: prompts/cairnloop.css :root block in example app; var(--cl-token) without hex fallback; negative-grep gate (Phase 29, D-10 closure)
  • KB editorial polish: shared nav shell across 4 KB routes, "Create new article" affordance, gap-evidence sidebar in Editor, calm copy on SuggestionReview handoff (Phase 30)
  • T-10-09 and T-10-11 closure: EditorHandoff double-layer gate (DB manual_edit_opened_at timestamp + signed token assertion) prevents preloading proposed_markdown without deliberate handoff (Phase 30)
  • Golden-path JTBD smoke test in CI: golden_path_test.exs (E2E-01) + widget_channel_test.exs (E2E-02) under mix test.integration (Phase 31)
  • README rewritten as an Igniter-first front door; four ExDoc guides (quickstart, JTBD walkthrough, host integration, troubleshooting) published to HexDocs (Phase 32)

0.1.0 - 2026-05-25

Added

  • Host-owned hybrid retrieval corpus (pgvector + PG full-text) via Cairnloop.Retrieval
  • Operator search with trust, recency, and citation cues
  • Citation-backed grounded drafting with clarification and escalation states
  • Durable gap-event storage and ranked KB gaps dashboard
  • AI-prepared KB draft/revision suggestions with stale-revision gating and citation validation
  • Review-gated KB update workflow: approve, reject, defer, publish — with append-only task event history
  • In-thread quick-fix KB maintenance launched from live support conversations
  • Host-owned governed-action contract: compile-time use Cairnloop.Tool with risk tiers and deny-by-default authorize/2
  • Durable ToolProposal + ToolActionEvent records with Stripe-style idempotency
  • Approval state machine with Oban-backed resume, expiry, and deferral paths
  • Three-layer at-most-once execution: Oban unique + terminal guard + SHA-256 per-attempt run key
  • Bounded [:cairnloop, :retrieval, …] and Cairnloop.Governance.Telemetry event namespaces
  • Read-only MCP seam (tools/list, initialize) via optional Cairnloop.Web.MCP.Router Plug

resume, expiry, and deferral paths