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
- aiohttp
- asyncpg
- docker
- firecrawl
- mcp-(model-context-protocol)
- nginx
- postgresql
- python
- qdrant
- react
- redis
- slack-bolt-sdk
- socket-mode
- systemd
- typescript
- vite
Log in or sign up for Devpost to join the conversation.