Inspiration

Every team loses knowledge to Slack scroll. A decision made in #product in March is impossible to find by June — buried under hundreds of messages, paraphrased differently by whoever remembers it, or just gone. We wanted an agent that doesn't wait to be asked "where's that doc" — it captures decisions, commitments, and facts as they happen, and answers questions about them with proof: the exact Slack message where the fact was established, not a confident-sounding guess.

## What it does

Lore is an org-memory agent for Slack. Mention it, use a slash command, a "Remember this" message shortcut, or just talk in a channel it's watching — it extracts decisions, owners, and dates, attributes them to the person who said them, and stores them in a hybrid memory (Postgres for exact/keyword search, Qdrant for vector similarity). Ask it anything later and it answers with a sourced Block Kit card: the claim, a confidence signal, a link back to the original message, and Confirm / Correct / Forget buttons so a human always has the final say. Corrections don't overwrite — the old version stays in an audit trail.

Harder questions get more than a lookup:

  • Research questions trigger a 5-phase pipeline (plan → public search → private search → synthesize → extract) that decomposes the question and cites every claim.
  • Complex questions can route to a multi-agent team — a router that delegates to one specialist, or a council that deliberates, cross-examines, and synthesizes a verdict from several agents, each with its own model and persona, all configured from an admin console with no code.
  • High-consequence requests (delete, deploy, pay) pause on a Block Kit approval card and require a different human to approve — real segregation of duties, not a rubber-stamp button.

The same memory is exposed over MCP, so Claude Desktop or Cursor can query and write to it too — one org brain, reachable from every AI surface a team already uses. Lore is also an MCP client: each workspace can wire in its own external tools (we used Firecrawl for live web search) with a URL and a name, no bespoke connector code. ## How we built it

Python (aiohttp + Slack Bolt, Socket Mode) for the agent runtime, with a durable Redis stream for exactly-once intake so a Slack retry or a mid-stream crash never double-writes a fact. Every inbound message passes an armor scan (PII, credentials, prompt-injection regexes) before any model call, then an intent router sends it down one of four paths. Facts live in Postgres with a full lifecycle (reinforcement/decay, supersession chains, conflict detection, soft-delete with audit); Qdrant backs the vector side of retrieval. The admin console is React/TypeScript (Vite), talking to a REST + SSE API, covering memory, conflicts, agents, teams, routing, integrations, and a self-improving harness that judges every team run and proposes better configurations for a human to approve.

## Challenges we ran into

Making multi-agent citations actually verifiable was harder than it looked: each team member's analysis numbered its own evidence independently, so by the time a chair model synthesized a verdict, the bracket citations in the final answer didn't map to anything a user could click and check. We ended up threading a single, unified, deduped fact list through every synthesis step — team council/router, the research pipeline, and the tool-calling ReAct loop — so every [N] in an answer has one matching, real source link.

Socket Mode's reconnect behavior also bit us mid-build: a missed heartbeat could close the underlying websocket without the handler ever raising, so the process looked alive while it silently stopped receiving events. Fixed with a bounded-lifetime reconnect loop.

Accomplishments that we're proud of

A real, running deployment — not a mockup — with exactly-once delivery survived crash tests, a full audit trail for every fact and correction, real separation-of-duties enforcement on high-consequence requests, and a live "thinking…" indicator so a Slack question never sits in silence while the agent works.

## What we learned

Provenance is a UX problem as much as a retrieval problem. It's not enough to have the right fact — every surface (a single answer, a team verdict, a research synthesis) has to make it trivially easy to verify where a claim came from, or trust erodes fast.

## What's next for Lore

Closing the visibility gap in the admin console's Runs & Conversations view for council/router dispatches, deeper harness auto-tuning, and more first-class MCP integrations (Salesforce, Notion, Jira) registered the same way Firecrawl already is — a name and a URL, nothing bespoke.

Built With

Share this project:

Updates