Precedent — decision memory for Slack
PRECEDENT
How it works The answer Under the hood Open source
GitHub ↗
Decision memory for Slack

Your team already made this decision. Precedent remembers it.

An agent that notices when a decision happens in Slack, logs it with a permalink, and answers “what did we decide about X?” — with receipts. No commands, no forms, no /log-decision rituals. People just talk.

MIT · self-host in ~10 min · Socket Mode — no inbound URLs

Receipts, not vibes. Every answer links to the thread where the decision actually happened — you never take the agent's word for it.

Precedent ASSISTANT live
Which email vendor did we pick?
Searching your team's decisions…
✅ ACTIVE REC 0014 Jul 11, 2026
Postmark
for Phoenix transactional email · decided by Sofia Reyes
HISTORY
Originally SendGrid — switched after 12% of test sends landed in Outlook spam. Postmark delivered the same batch clean.
OPEN ACTION ITEM
Migrate email templates — Jonas Weber · due Wednesday
synthesized from 2 records + live search
the assistant panel · a real answer, replaying on loop
📌 REC 0014 — Switch Phoenix email to Postmark · Sofia Reyes · active 📌 REC 0011 — Token bucket rate limiting, Redis, 100 req/min · Maya Chen · active 📌 REC 0009 — Atlas infra: Pulumi (TypeScript) Terraform · active 📌 REC 0008 — Phoenix will use SendGrid · superseded by 0014 — #design onboarding redesign · deferred pending interviews · not a decision — not logged
📌 REC 0014 — Switch Phoenix email to Postmark · Sofia Reyes · active 📌 REC 0011 — Token bucket rate limiting, Redis, 100 req/min · Maya Chen · active 📌 REC 0009 — Atlas infra: Pulumi (TypeScript) Terraform · active 📌 REC 0008 — Phoenix will use SendGrid · superseded by 0014 — #design onboarding redesign · deferred pending interviews · not a decision — not logged
01 THE PROBLEM

Decisions evaporate in chat.

Three weeks later someone asks “wait, didn't we already pick a vendor for this?” — cue twenty minutes of scroll-archaeology, or worse, re-litigating a settled question.

email vendor
247 MATCHING MESSAGES
…has anyone used the email template editor for vendor onboarding…
…lunch vendor for the offsite — reply in thread…
…can you email me the figma link pls…
…re: vendor security review doc from legal…
…did we ever pick an email provider? asking again lol…
SLACK SEARCH FINDS MESSAGES.
Which email vendor did we pick?
1 ANSWER · 1 RECEIPT
Postmark
decided by Sofia Reyes · Jul 11 · originally SendGrid, switched over deliverability
PRECEDENT FINDS DECISIONS.
01 · New teammates re-ask everything. Veterans re-litigate everything.
02 · “Who decided this? When? Why?” has no system of record — it lives in whoever was in the room.
03 · Decisions ship commitments — “Jonas will migrate the templates by Wednesday.” They rot silently.

Decision-log tools exist — every one of them relies on a human remembering to write things down. Precedent notices on its own.

02 HOW IT WORKS

Four flows. Zero new habits.

Nobody runs a command. The agent listens, extracts, links, and follows up — the team just talks.

FLOW 01 · CAPTURE

It notices when a decision happens.

Precedent hears every message and says nothing. People talk in bursts — so it waits until a thread has been quiet for 90 seconds, reads the whole thing, and asks Claude one question: did a decision happen here?

Confidence ≥ 0.7 → saved with a permalink, a 📌 lands on the thread, one line confirms it. A debate, filler chatter, a “let's revisit after the interviews” → nothing. Deferrals aren't decisions.

strict JSON out: title · decision · decider · topics · action items + owners · supersedes?
#launch-phoenix 14 members
{{ m.init }}
{{ m.name }}{{ m.time }}
{{ m.text }}
📌 1
{{ capTimerLabel }}
PrecedentAPP10:07
📌 Logged as a decision: Phoenix will use SendGrid for transactional email — I'll remember this.
confidence 0.86 · permalink saved · 1 action item → Jonas
the 90-second quiet window is compressed for the demo
FLOW 02 · ASK

Ask in plain language. Get receipts.

Open the assistant panel — or @mention it anywhere. Two lookups run at once: the structured decision log, and live workspace search through Slack's Real-Time Search API, semantic first with keyword fallback.

Claude folds both into ≤120 words under one hard rule: answer only from evidence — never invent. When nothing was ever decided, it says so and points to the closest discussion instead. Try the third question.

SQLite log + assistant.search.context · semantic → keyword fallback
Precedent ASSISTANT interactive — click a question
{{ askTyped }}
Searching your team's decisions… decision log + live search
✅ ACTIVE {{ askNum }} {{ askDate }}
{{ askHead }}
{{ askSub }} · {{ askMeta }}
HISTORY
{{ askHistStruck }}{{ askHistRest }}
OPEN ACTION ITEMS
{{ askAction }}
{{ askRecord }}
synthesized from {{ askSrc }}
— NO DECISION ON RECORD
Nothing was decided about the onboarding redesign.
The closest discussion: #design debated two directions on Jun 30 and deferred pending user interviews. A deferral is not a decision — so nothing was logged, and nothing gets invented.
honest miss · no hallucinated verdict
three real questions — including the one with no answer
FLOW 03 · SUPERSESSION

Teams change their minds. The memory keeps up.

The extractor sees the existing log, so when a new decision replaces an old one they're linked automatically — nobody files anything. Ask about email and you get the current answer and the story: what it replaced, and why.

Superseded decisions are struck through, never deleted.

hard timestamp invariant: history only flows forward — re-processing can never rewrite it
decision log · topic: transactional-email
JUN 27 · REC 0008 ✅ ACTIVE SUPERSEDED
Phoenix will use SendGrid for transactional email
Phoenix will use SendGrid for transactional email
Sofia Reyes · #launch-phoenix
↳ 12% of test sends landed in Outlook spam
superseded by · linked automatically
JUL 11 · REC 0014 ✅ ACTIVE
Switch Phoenix transactional email to Postmark
Sofia Reyes · #launch-phoenix
↳ same test batch delivered clean · support replied in under an hour
NOW ASK IT
“Which email vendor?” → Postmarkoriginally SendGrid, switched over Outlook deliverability. History attached, nothing deleted.
FLOW 04 · CLOSE THE LOOP

Decisions become commitments. Memory becomes infrastructure.

Every action item is tracked. On weekday mornings, owners get a DM about what's still open — the buttons update the message in place. And the whole log is an MCP server, so Claude Desktop — or any agent — can ask your team's memory directly.

search_decisions · get_decision · list_open_action_items — over the Model Context Protocol
DM · Precedent → Jonas Weber
PrecedentAPPWed 9:02 AM
Morning, Jonas. One action item from decisions you own is still open:
Migrate email templates to Postmark
Migrate email templates to Postmark
due Wednesday · from: Switch Phoenix email to Postmark (Sofia Reyes)
Done ✓ — closed just now
💤 Snoozed — tomorrow, 9:00
message updated in place — no new noise
weekday-morning cron · the buttons work — click one
Claude Desktop · MCP client
What did my team decide about the email vendor?
tool ▸ precedent.search_decisions("email vendor")
Postmark — decided by Sofia Reyes on Jul 11. Originally SendGrid, switched after 12% of test sends hit Outlook spam. One item still open: Jonas is migrating templates.
RAILWAY · PRECEDENT-SERVER — LOGS
[bolt]socket connected · listening
{{ l.tag }}{{ l.text }}
agent-to-agent — your team's memory, callable by any MCP client
Also ships an App Home dashboard in Slack — active decisions, superseded history struck through with what replaced it, open action items with owners.
03 THE ANSWER, ANATOMIZED

Every part earns its place.

✅ ACTIVE REC 0014 2 Jul 11, 2026
1Postmark
for Phoenix transactional email · decided by Sofia Reyes
3HISTORY
Originally SendGrid — switched after 12% of test sends landed in Outlook spam. Postmark delivered the same batch clean.
4OPEN ACTION ITEM
Migrate email templates — Jonas Weber · due Wednesday
5 📌 the receipt
1
The decision
The current answer, ≤120 words, synthesized only from evidence.
2
Who and when
A named decider and a date. Not “the team”, not “recently”.
3
The history
What this replaced and why — struck through, never deleted.
4
The open commitment
Owner and due date, nudged every weekday morning until closed.
5
The receipt
One click to the real thread. The agent's word is never the last word.
04 SEE IT RUN

Three minutes, end to end.

DEMO VIDEO — YOUTUBE EMBED link TBD · paste it into the videoUrl tweak and this becomes the player
05 UNDER THE HOOD

All three qualifying technologies. Not just the required one.

Built for the Slack Agent Builder Challenge — New Slack Agent track.

01✓ USED
AI assistant surface
The panel: suggested prompts, live status while it searches, threaded answers.
02✓ USED
Real-Time Search API
Live workspace retrieval via assistant.search.context with the ephemeral per-event action_token — semantic first, keyword fallback.
03✓ USED
MCP server
Self-built. Your decision log becomes infrastructure other agents can build on.
ZONE 1 · SLACK WORKSPACE
channels — where decisions happen
assistant panel — where answers live
nudge DMs · App Home dashboard
socket mode
no inbound URLs
ZONE 2 · RAILWAY — ALWAYS-ON
one Node.js process:
bolt → detector → claude extractor
SQLite store · persistent volume
answer synthesis · cron follow-ups
Express bridge · bearer auth · /health
HTTPS
+ bearer
ZONE 3 · ANY MCP CLIENT
stdio MCP server, runs locally
calls the bridge over HTTPS
Claude Desktop — or anything MCP
@slack/bolt · socket mode claude-sonnet-4-6 · 2 prompts better-sqlite3 express @modelcontextprotocol/sdk
PRIVACY BY SHAPE
Stores structured records and permalinks — never message archives. Raw retrieval happens live through Slack's own search, so Slack's permissions always apply.
DEGRADES GRACEFULLY
If live search fails, it answers from the log — and says so. 20-case edge harness (short, long, multi-speaker, hostile, honest-miss), adversarially reviewed, 24/7 uptime monitoring.
06 OPEN SOURCE

MIT. Yours in ten minutes.

01
git clone Danishlynx/precedent
MIT licensed, end to end.
02
add tokens to .env
Slack app tokens + an Anthropic API key.
03
npm start
Socket Mode — runs anywhere Node runs. Railway for always-on.
04
/invite @precedent
Then just talk. That's the whole workflow.
github.com/Danishlynx/precedent ↗ MIT license · no message archives · your data stays in Slack
PRECEDENT
Decision memory for Slack.
receipts, not vibes.
Built by Danish Ali for the Slack Agent Builder Challenge 2026 — New Slack Agent track.
GitHub ↗ Watch the demo How it works