← All Docs

Changelog

Release notes for Lore CLI and public documentation.

Versioned replace on the CLI — June 10, 2026

lore ingest gains --replaces <id> --reason "<why>" — the by-id correction primitive, previously reachable only over MCP. Closes a write-surface CLI/MCP parity gap (sibling to the May 16 read-surface sweep): an agent correcting a source while its MCP connection was down had to drive lore mcp over raw stdio JSON-RPC because no CLI command could.

  • lore ingest --replaces <id> --reason "…" supersedes a source with new content, creating a v2 in its version chain while v1 stays immutable — auditable, with citations resolving through the chain root. <id> is a full source id or an unambiguous 8+ char prefix. Content comes from the positional arg, --file, or stdin.
  • Routing inherits from the parent. Tags and project/workstream are inherited, not re-specified — passing --tags / --project / --workstream with --replaces is a clear error rather than a silent no-op. --title / --type / --url / --name remain optional overrides.
  • Same code path as MCP. The CLI routes through the exact handler the MCP ingest tool uses for replaces + reason, so behavior is identical: identical content short-circuits as a no-op; a stale parent prints the current chain head and a ready-to-run retry. In-place action: update stays MCP-only — versioned replace is the correction primitive on the CLI.

Read-surface drift sweep — May 16, 2026

Cut 2 from the post-smoke-test fix plan. Four CLI/MCP parity gaps closed; each was a place where the same data surfaced differently — or not at all — depending on which API consumed it.

  • CLI auto-router shows Workstream:lore docs create (no --project) was dropping the auto-router's workstream proposal from its banner even though the LLM's reasoning mentioned it. The CLI now prints a Workstream: <slug> (<confidence>) row when the proposal includes one, matching what MCP ingest has always returned in routing_decision.workstream.
  • MCP ingest response: top-level visibility + workstreamvisibility was only emitted in the response when it resolved to 'personal'; agents auditing whether a write went team-public had no positive signal. Now always present ('workspace' or 'personal'). When a workstream resolved (explicit --workstream arg or high-confidence auto-route), the response also carries the resolved workstream slug at top level — no need to scrape routing_decision.
  • MCP get_source returns routing_metadata + workstream slug — the DB had both; the response shape omitted them. Agents calling get_source couldn't see what the auto-router decided at ingest, or what scope the source actually sits in. Both fields are now part of the response when present.
  • MCP get_entity accepts name — pre-cut, only entity_id (UUID) worked; passing name surfaced as "Entity not found: undefined" (a missing-row error masking a schema mismatch). The schema now accepts entity_id OR name (workspace-scoped, case-insensitive); entity_id wins when both are passed; non-UUID entity_id returns a clear validation error pointing at name; clean miss when the name resolves to nothing.
  • Audience classifier strengthened, review queue widened — the smoke-test caught "half personal frustration, half product strategy" content routing to audience='shared' with high confidence. The classifier prompt now treats ambiguous as a first-class verdict for mixed-intent content (explicit "half X, half Y" markers, sources that braid private observation with team-substrate analysis), not as a verdict-failure last resort. As a safety net, the personal-review queue gains a third class — low-confidence-shared — surfacing workspace-visibility sources stamped audience='shared' with project-confidence 'low'. New CLI verb: c = confirm shared (accept verdict, stay workspace-visible). Flipping to personal is intentionally not a queue verb (un-publishing a workspace source the team may have already read is too consequential for a one-keystroke action); use lore docs reclassify if a flip is genuinely warranted.

Agent-triggered brief cascade — May 15, 2026

Cut 1A from the post-smoke-test fix plan: restricted agents (home workstream + grants) couldn't trigger project-brief auto-updates as a side-effect of their authorized source writes. The workstream brief moved v_n→v_n+1 cleanly; the project brief regen was RLS-refused and silently swallowed. Only a future "stale" chip surfaced the drift.

  • SECURITY DEFINER cascade RPCs — migration 20261101_cascade_brief_regen.sql adds _lore_cascade_project_brief_regen (project-scope INSERT) and _lore_mark_brief_upstream_stale (cascade stale-mark UPDATE). Both re-validate the caller's source-write authority on the workstream that triggered the cascade, then bypass RLS for the higher-scope write. A new agent with no workstream authority anywhere in the project still cannot trigger a cascade — the authority chain is enforced inside the RPC body.
  • Manual lore brief generate stays RLS-gated — explicit user intent still flows through the direct INSERT, so step-8 authority isolation holds for callers who explicitly opt into a project-scope write.
  • lore doctor check cascade_stale_rls_refused — surfaces project briefs whose source count has fallen behind their project by ≥3, catching pre-fix residue and any future regression in the cascade path.

VISION.md principle 4 ("higher-scope briefs synthesize lower briefs, not raw sources") no longer silently degrades when agents are the primary ingest source.

Ambient source management — May 15, 2026

Closes the context-capture maturity track. The ambient corpus (terminal/observed-session scroll — corpus_class='ambient') now has a full management surface alongside the read-only show/hide toggle.

  • lore ambient stats — workspace-scoped volume report. Grouped counts by app_bundle_id, by capture_method, by month; total + total size + date range; pre-2026-05-15 unattributed slice surfaced separately so you know what the bucket totals exclude. --json for machines.
  • lore docs reclassify <id> --to signal|ambient — flip one source's capability profile between browsable (feeds briefs) and chunks-only (hidden from default browse). Human-only — agents are refused at the §4 write gate. Each reclassification writes an org_ops_log row (op_kind='source-reclassified') so the audit trail explains why a source quietly stopped surfacing.
  • lore docs gc-ambient --older-than <duration> — retention sweep. Mirrors lore docs gc's dry-run preview pattern. --app <bundle_id> / --capture-method <kind> for targeted cleanup. The safety check refuses any source whose chunks are cited in a current workspace brief, regardless of age. Soft-delete only — on-disk content stays put; lore docs restore recovers.
  • MCP list_sources gains a corpus_class filter so agents can audit ambient hygiene without shelling out. Reclassify and gc-ambient stay CLI-only — binding write paths under the human gate.
  • TUI — source-detail preview renders an [ambient] chip when the source has corpus_class='ambient' (dim gray, mirrors the private badge pattern). Landing view gains an optional 4th header line — Ambient: N sources · X MB · Ctrl-A toggle · \lore ambient stats`` — rendered only when the ambient corpus is non-empty, so the headline volume is visible at workspace-glance.

Migration 20261027_source_reclassified_op_kind.sql widens the org_ops_log.op_kind CHECK with 'source-reclassified' — additive + idempotent.

Capture-origin persistence — May 15, 2026

Producer-stamped capture origin is now a first-class queryable axis on every source row. The lore-context-capture daemon already emitted capture_method / app_bundle_id / app_name in frontmatter; Lore parsed them as auto-router classification hints and then discarded them. They now persist on sources as an attribute-plane axis — distinct from scope (where a source lives) and tags (cross-cutting topics).

  • Filter by source applore docs list --app com.tinyspeck.slackmacgap shows every Slack-captured source. lore docs list --capture-method browser_gmail filters by the producer rule. The same filters compose into MCP list_sources and search for agents (app_bundle_id / capture_method args).
  • TUI chip — source-detail preview renders a "captured via Google Chrome" (or whatever app_name was stamped) gray chip alongside the actor, entity, and procedure chips.
  • MCP get_source returns the triocapture_method, app_bundle_id, app_name are now part of the response shape.
  • ingest accepts the trio — sync stamps them automatically from frontmatter; agents ingesting via MCP can stamp them when they know the value (most agent ingests will leave them null — they aren't observation-time captures).

Unblocks ambient-source management (filter within ambient by capture origin), context-routing follow-ups (use bundle id as a routing prior), and personal-layer enrichment ("where do my captures come from").

Procedural memory + observational deposit — May 15, 2026

Lore now has a first-class procedural memory primitive — procedures — for the "how this team acts" layer (release cadences, onboarding playbooks, review checklists). Distinct from briefs, which describe what's true; procedures prescribe action.

  • Scope-attached — workspace / project / workstream. Inherited downward in get_brief_stack's composed prompt, so agents read procedures as constraints alongside the descriptive brief content at every scope.
  • Ratchet lifecycleproposedconfirmedsuperseded / archived. Authorship is mixed: humans author directly via lore procedures create; agents (and humans) propose via lore procedures propose / MCP propose_procedure. The §4 write gate makes confirm_procedure / supersede_procedure / archive_procedure human-only by design — agents propose, humans ratchet.
  • lore procedures CLIlist, show, history, create, propose, confirm, supersede, dismiss, archive with --scope workspace|project:<slug>|workstream:<project>/<workstream>.
  • MCP — six tools (list_procedures, get_procedure, propose_procedure, confirm_procedure, supersede_procedure, dismiss_procedure). get_brief_stack folds confirmed procedures into the composed prompt at each scope.
  • TUI — Shift-O opens the procedures browser, grouped by scope, with a lowercase-r filter that surfaces only proposed rows for human review. Procedure chips render on source detail when a procedure cites a source.

Alongside the primitive, the three-deposit-kind convention is now named explicitly across .claude/rules/lore.md and every plugin manifest: narration via log, artifact via ingest, how-to-proposal via propose_procedure. The whoami tool surfaces last_deposit_at — a per-actor timestamp of the most recent deposit across all three kinds — as a soft "have I deposited yet this session?" signal.

Entity registry — May 14, 2026

Lore now resolves the people, companies, products, and deals named in your content. A new thin registry (the bridge layer between sources and the structured world) gets stamped automatically at ingest with a conservative under-merge bias.

  • Auto-resolution at ingest — every new source has its entity mentions extracted (claude-haiku-4-5, ~$0.0014/source) and matched against the workspace registry. High-confidence matches attach existing entities; ambiguous matches surface candidates instead of guessing; unknown names create new entries.
  • Filter by entitylore search ... --entities <a,b>, lore docs list --entities ..., and MCP search / list_sources accept entity IDs or names.
  • lore entities CLIlist, show <id|name>, merge <a,b> --into <target>, rename, archive, and backfill --project <slug> for stamping pre-registry sources (per-project, budget-capped).
  • MCP list_entities / get_entity — browse the registry; get_entity returns the entity plus the sources that mention it ("everything about X").
  • TUI — Shift-E opens the entity picker; chips render on source detail.

Entities have no brief on purpose — they're a bridge to specialist tools (CRM, address book) that already own that synthesis, not a CRM replica.

Actor layer — May 14, 2026

Lore now distinguishes who performed a write. Every source and brief is attributed to an actor — a human or a named agent.

  • Humans get their actor automatically on first workspace access — no setup.
  • Agents are first-class identities, each with its own credential and data isolation. Provision with lore agent install <name>, run a process under LORE_AGENT_TOKEN, and every write attributes to that agent.
  • lore whoami and the whoami MCP tool report the acting identity.
  • Read it back: lore docs list --actor <name> / --kind agent, lore audit --actor <name>, the actor field on MCP get_source / list_sources, and an actor chip in the lore browse TUI.

See the agent guide for the full model.

0.19.0 - May 7, 2026

CLI vocabulary cleanup + a few small completeness items. The legacy lore corrections * namespace is gone — replaced by lore status, lore diff, and lore changes apply/discard/merge modeled on git's lifecycle. Hard cut-over, no aliases.

Working tree, modeled on git

The mental model: .lore/sources/ is your working tree, .lore/base/ is the last fetch from canonical, Lore Cloud is origin/main.

OldNewgit analogue
lore corrections listlore statusgit status
lore corrections diff <id>lore diff <id>git diff
lore corrections approvelore changes applygit push
lore corrections rejectlore changes discardgit restore
lore corrections reconcilelore changes mergegit merge

lore status is the new "where am I, what's next" command. One unified view: workspace, attached repos, pending changes (with conflict markers), daemon state, pending push queue, and a "Suggested next" footer that adapts to state.

$ lore status

Workspace
  Personal · 2 attached repos

Attached repos
  /Users/me/repo-A  → ridekick, gnar       [3 pending]
  /Users/me/repo-B  → marketing            [clean]

Pending changes (run `lore diff <id>` to inspect)
  modified   foo-a1b2  "User interview with Sarah"
  conflict   bar-d4e5  "Project plan v2"  (run `lore changes merge`)

Daemon
  Running, PID 31845, 2m uptime, v0.19.0
  Last sync 30s ago · 0 errors
  Pending pushes: 4 (oldest 1m ago)

Suggested next
  lore diff <id>             review a change
  lore changes apply --all   publish all clean modifications
  lore changes merge <id>    resolve a conflict

lore status --terse returns a one-line summary suitable for shell prompts and scripts.

Embedding model versioning

The skip-embed path on byte-trivial edits (v0.18) reused stored vectors to save API calls. Safe today because everyone runs text-embedding-3-small at 1536 dims, but a model rotation would have silently degraded search.

  • New embedding_model_version column on every embedded row, format <model>@<dim>.
  • Reuse path now version-checks: mismatched rows fall through to fresh generation. Zero-cost lazy migration on rotation.
  • Pre-existing rows get the current default at migration time, so behavior is unchanged today.

Other completeness items

  • Pending-pushes queue cap (default 10000, env-tunable). When the queue overflows — daemon offline for an extended stretch — enqueuePush falls back to inline gitCommitAndPush so the change still lands. Slow path, no data loss. Once-per-process warning surfaces the queue health.
  • storeSources race protection. v0.18.1's content_hash conditional UPDATE protected addSource per-row; the bulk path now does the same per-record. Two machines hitting the same row via the bulk path can no longer last-writer-win.

Migration

One-time silent migration on first interaction with the changes flow: <dataDir>/context-corrections/<dataDir>/context-changes/. Pre-v0.19 history.json + merge backups survive intact.

0.18.1 - May 7, 2026

Cross-machine race protection for the agents-on-many-machines world.

  • Two writers (different machines, different agents, or human + agent) hitting the same source at the same time used to silently last-writer-win. Now exactly one wins; the other gets a typed conflict response and can retry cleanly.
  • MCP ingest action 'update' returns a structured conflict block on race-loss: { type: 'concurrent_write', source_id, expected_content_hash, current_content_hash, message }. Agents pattern-match on conflict.type and re-fetch + retry.
  • CLI surfaces the conflict as "another machine modified this — pull, reconcile, retry."
  • lore corrections approve --all partial-progress preserved on per-item conflicts: successful items still apply; conflicts go into a failed list.

0.18.0 - May 7, 2026

Briefs no longer silently reference deleted sources, and ingest is fast at scale.

Briefs catch deletion leakage

  • Soft-deleting a source now flags any brief that referenced or word-matched it. lore brief <project> shows a warning banner with up to 5 phrases (and their location in the brief) so you can see exactly where the leakage shows up before you trust the synthesis.
  • Running lore brief generate <project> after a delete uses a new deletion-aware incremental path. Surgical scrub at $0.05–$0.20 instead of the $5+ full regen the previous fallback required.
  • MCP get_brief adds a top-level source_stale: { since, count, source_ids, suspect_phrases } field so agents incorporate the warning into their reasoning.

Ingest at scale

  • lore docs create returns in ~2s instead of ~10s. Git push is now amortized: hot writes enqueue into a pending log; the daemon flushes accumulated changes into a single commit/push every 30s.
  • lore corrections approve --all over many items completes in seconds instead of minutes — single lock acquisition, single manifest write, single git push.
  • Byte-trivial edits skip both the LLM re-summarization AND the OpenAI embedding call when the new content fingerprint matches the old. Frontmatter-only sync drift costs nothing.
  • New lore sync status line: Pending pushes: N (oldest 2m ago) so you can see the daemon's queue at a glance.
  • Inline-push escape hatch for CI / scripts: lore docs create --sync-push or LORE_SYNC_PUSH=1.

Reliability

  • 60-second hard timeout on context refresh so the daemon can no longer deadlock on a stuck Supabase fetch retry. (Configurable via LORE_CONTEXT_REFRESH_TIMEOUT_MS.)
  • Per-repo runtime state (context-base/, context-manifests/, context-corrections/) is no longer tracked in the data-dir git history.

0.17.1 - May 7, 2026

Hotfix for a daemon deadlock observed during v0.17 dogfooding.

  • The daemon's context-refresh could get stuck inside a Supabase fetch failed retry loop, holding the write lock for >2 minutes and blocking everything that needed it.
  • New 60-second hard timeout (env: LORE_CONTEXT_REFRESH_TIMEOUT_MS) releases the lock cleanly when the network is unreachable. Next refresh cycle resumes when connectivity returns.

0.17.0 - May 7, 2026

LLM cost is now visible, bounded, and tuned for incremental work.

See your spend

  • New lore cost [--since|--feature|--workspace|--by] shows token usage and dollar cost over any time window, broken down by feature (auto-router, brief generation, sync metadata, etc.).
  • Every Anthropic call records to a llm_usage table — RLS-protected, scoped to your workspace.
  • Optional hard daily cap: set LORE_MAX_DAILY_TOKEN_SPEND_CENTS to refuse new LLM calls past the limit. 80% warning fires once per process.

Edits no longer cost what they used to

  • Byte-trivial edits (frontmatter changes, typo fixes, small whitespace adjustments) skip the LLM re-summarization. The existing summary is reused, and the brief regeneration is deferred unless the edit removes content the brief explicitly asserts.
  • This is the asymmetric-staleness rule made concrete: a brief that asserts a value the source has corrected is wrong and needs a refresh; a brief that lacks a new fact is merely behind and eventual consistency catches it.
  • Brief auto-update debounce extended from 5s to 60s. Bursts of edits coalesce into a single regen.

Full regenerations are now explicit

  • lore brief generate <project> --full is the only path that triggers a full rebuild. The CLI estimates the cost (input/output tokens, calls, USD) before running and requires typing regen to confirm. Pass --yes to bypass interactively; non-interactive without --yes refuses outright.
  • The previous "drift defense" auto-trigger that would force-full a brief after 30 incremental updates is removed. Briefs are living memory — they're supposed to drift with the corpus the way human memory adapts with new experience. Forcing periodic full regens fights that model.

0.13.0 - April 30, 2026

This release simplifies the repo-local context vocabulary around add and remove.

  • lore context add <project> is now the command for creating and registering a repo-local .lore/ working copy.
  • lore context remove removes that generated working copy and unregisters daemon refresh.
  • Empty projects are allowed: context add creates the scaffold now, and daemon refresh populates it after sources for that project exist.
  • A repo-local .lore/ working copy currently tracks one Lore project. Adding another project replaces clean context, while active proposals require review or explicit --force.
  • Docs now describe future multi-context workspaces for product, marketing, business, compliance, or other permissioned Lore contexts without changing the v1 workflow.

0.12.0 - April 30, 2026

This release makes Lore easier to use from code repos and safer to keep running in the background.

Project Context Working Copies

  • Repo-local .lore/ working copies can register the current repo for daemon-managed context refresh.
  • Working copies include all non-deleted project sources by default. Use --limit <n> only for deliberately smaller task packs.
  • .lore/ working copies use copied snapshots, not symlinks.
  • Clean snapshots auto-refresh after daemon sync cycles.
  • Local edits in .lore/sources/ remain proposed corrections and are never approved automatically.
  • lore context list shows repos with Lore context and their last refresh result.
  • lore context remove removes only the generated .lore/ folder.

Correction Review

  • Correction diffs and status output are colorized and more Git-like.
  • Short correction IDs are accepted where unambiguous.
  • Browse defaults to recently edited documents, making approved corrections easier to find.
  • Approval, rejection, reconciliation, and direct Browse edits now use stricter revision checks and rollback paths.

Sync And Repair

  • Lore Cloud/Supabase is the primary sync layer. Git in LORE_DATA_DIR is optional local history.
  • lore sync repair rebuilds generated data-repo caches, imports deletion identities into Supabase, and untracks cache files that should not participate in Git merges.
  • The daemon detects broken data-repo Git state quickly, reports lore sync repair, and still refreshes project .lore/ working copies where safe.
  • Deleted source identities now live in Supabase; local deleted-hashes.json is a rebuildable cache/fallback.

Developer And Agent Docs

  • Added generated Supabase database types in the CLI repo and a db:types script for future migrations.
  • Updated bundled agent skills so Claude Code, Gemini, Codex, OpenClaw, and generic MCP agents understand repo-local .lore/ working copies.
  • Updated the website docs, CLI docs, project context docs, FAQ, and llms.txt output for the new operating model.