Precedent: Decision Memory for Slack
Inspiration
My team once spent forty minutes debating fixed versus on-demand token rotation. We chose fixed, shipped it, and then encountered a cascade of 401 errors. Three weeks later, we migrated to on-demand.
Only afterward did we discover that another platform team had made and reversed the same decision five months earlier for exactly the same reason.
The answer existed in Slack. We just didn't know it existed, so we didn't know to search for it.
Precedent catches that missing context before it becomes another expensive lesson.
In growing organizations, important decisions live inside threads rather than durable documentation. People change teams, vocabulary changes, and the original context disappears into channels that future decision-makers may never have seen. The result is repeated investigations, reopened debates, and avoidable mistakes.
As a principal product manager working with five engineering teams, Slack is where I see organizational context form in real time. I wanted an agent that could quietly tap someone on the shoulder before they repeated a decision their organization had already made.
It also needed to earn employees' trust. Precedent stores no Slack message text, user IDs, or content embeddings. Slack conversations stay in Slack.
What it does
Precedent is decision memory for Slack.
When a message appears to reopen a previously settled question, Precedent searches the user's accessible Slack history for semantically related decisions, even when the two conversations use completely different language.
For example, someone might write:
"Let's rotate tokens every night."
A previous team may instead have written:
"Synchronized credential renewal caused a cascade of 401 errors."
Those messages share almost no vocabulary, so ordinary keyword search is unlikely to connect them. Precedent generates decision-specific search probes, retrieves relevant Slack threads, ranks them semantically, and determines whether they describe the same underlying decision.
It then privately tells the user:
- What was previously decided
- Why the team made that decision
- What happened afterward
- Whether the decision is still current or was later reversed
- Where to find the original Slack discussion
Precedent has three Slack-native entry points:
/precedentfor searching the organization's decision history/check-precedentfor checking an existing conversation against prior decisions- A passive watcher that privately intervenes when a team appears to be reopening something already settled
Every result is ephemeral and visible only to the requesting user. An incorrect match never disrupts the public conversation. If the result is useful, the user decides whether to share it.
Wrong in private. Right in public.
Precedent is intentionally quiet: approximately 95% of messages produce no visible response. A Slack agent that reacts to everything quickly becomes noise, so Precedent only appears when the potential cost of ignoring a match is high.
Its visual language follows the same principle. A current, well-supported decision needs no warning badge. A reversed decision is marked clearly because following outdated guidance carries much greater risk.
How we built it
Precedent uses a staged pipeline designed around three requirements: semantic recall, low operating cost, and zero Slack content stored at rest.
Slack Message or Command
│
▼
┌─────────────────────────┐
│ Gate: Nova Micro │──── 95% exit here
│ "Is this a decision?" │ <1 second · ~$0.00002/message
└────────────┬────────────┘
│ 5% pass
▼
┌─────────────────────────┐
│ Probe Generation │──── Claude Haiku creates 3–5
│ │ cross-vocabulary search probes
└────────────┬────────────┘
│
▼
┌─────────────────────────┐
│ Slack Real-Time Search │──── Parallel, permission-inherited
│ │ searches of live Slack context
└────────────┬────────────┘
│
▼
┌─────────────────────────┐
│ Transient Semantic Rank │──── Titan V2 embeds and ranks
│ │ candidates in request memory
└────────────┬────────────┘
│
▼
┌─────────────────────────┐
│ Decision Adjudication │──── Same decision? Still current?
│ Claude Sonnet │ Reversed? Concurrent conflict?
└────────────┬────────────┘
│
▼
┌─────────────────────────┐
│ Private Slack Card │──── Ephemeral Block Kit response
│ │ linked to the original thread
└─────────────────────────┘
STORED: labels · status · confidence · permalinks · edges
NOT STORED: message text · user IDs · content embeddings
Decision gate
Every candidate message first passes through Amazon Nova Micro, which determines whether it contains a meaningful proposal, recommendation, or decision.
Approximately 95% of messages exit here in under a second. This is the product's silence layer: ordinary conversation produces no visible response, and the more expensive pipeline runs only when it may be useful.
The average cost of rejecting a non-decision is approximately $0.00002 per message.
Cross-vocabulary probe generation
For messages that pass the gate, Claude Haiku generates three to five search probes representing the decision's underlying concepts, consequences, and alternatives.
This lets Precedent connect discussions that describe the same problem with completely different words. In an ablation test, removing decision-specific probe generation cut cross-vocabulary recall in half.
Slack Real-Time Search
Precedent sends the probes to Slack's Real-Time Search API in parallel.
Search inherits the requesting user's permissions, so Precedent cannot retrieve conversations that the user is not authorized to access. Retrieved content exists only during the active request.
Transient semantic ranking
Amazon Titan V2 embeds the retrieved candidates and triggering message in memory, then ranks the candidates by cosine similarity.
The temporary index is destroyed when the request finishes. This embed-rank-destroy architecture provides real semantic matching without maintaining a persistent copy or vector index of Slack conversations.
Decision adjudication
Claude Sonnet evaluates the strongest candidates and determines:
- Whether they represent the same underlying decision
- Whether the earlier decision remains current
- Whether it was later reversed
- Whether apparent disagreement represents two teams using different approaches concurrently
The final distinction was particularly difficult. Adding temporal reasoning improved precision on the adversarial supersession set from 37.5% to 100%.
Private Slack response
Precedent presents the result as an ephemeral Block Kit card containing the earlier decision, its status, and a link to the original Slack conversation.
Warning intensity reflects the risk of following the precedent. A current, well-supported decision needs no warning. A reversed decision is marked clearly because relying on it could recreate a failure the organization has already experienced.
The result remains private unless the user chooses to share it.
MCP integration
The project also includes an MCP server exposing query_decisions and check_supersession. External agents can query Precedent's derived decision graph through the same privacy boundary.
Privacy architecture
Stored at rest:
- Derived decision labels
- Status and confidence
- Slack permalinks
- Relationships between decisions
Never stored:
- Slack message text
- Slack user IDs
- Content embeddings
- A persistent search or vector index of workspace conversations
The privacy boundary is enforced by the architecture, not a retention policy.
Challenges we ran into
Designing silence
The hardest UX problem was deciding when nothing should happen.
The proactive watcher must remain completely silent when it finds no meaningful precedent. An explicit command, however, needs immediate feedback; otherwise, a long search feels broken.
That produced three interaction paths with different feedback requirements. Judges see the result card. Users spend most of their time experiencing deliberate silence.
Detecting superseded decisions
Precedent needed to distinguish a team changing its decision over time from two teams making different but valid choices.
Both situations appear as disagreement in the underlying text. The key discriminator was temporal structure: replacement over time versus concurrent divergence.
Adding temporal reasoning improved precision on the adversarial set from 37.5% to 100%. On the definitive live test, Precedent correctly handled all 15 supersession cases.
Evaluating under real Slack limits
Slack's Real-Time Search API permits roughly ten requests per minute per user. The 147-case blind evaluation required approximately 700 searches, turning a seemingly simple benchmark into an extended live run.
We ran the evaluation under the actual limit. It took longer, and the reported results reflect the product's real operating environment.
Accomplishments that we're proud of
Strong cross-vocabulary retrieval
On a blind offline benchmark, Precedent achieved:
- 90% recall
- 90% precision
- 36 of 40 cross-vocabulary decision pairs correctly surfaced
The test pairs were deliberately written without shared keywords so that basic keyword matching could not solve them.
Credible live performance
Against live Slack retrieval, Precedent achieved:
- 72.5% recall
- 87.9% precision
The difference between offline and live recall exposes the current retrieval ceiling imposed by Slack's keyword-based search layer. Once a relevant candidate is retrieved, the semantic ranking and adjudication layers remain strong.
Reliable supersession detection
After incorporating temporal reasoning:
- Adversarial-set precision improved from 37.5% to 100%
- The definitive live test correctly handled 15 of 15 cases
Verified privacy boundaries
A data-at-rest inspector dumps the actual DynamoDB records used by the application. It confirms that the records contain only derived labels, status, confidence, relationships, and permalinks. Slack message text, user IDs, and embeddings are absent.
Evaluation that prevented a regression
We built a complete Bedrock re-platform on a separate branch. The evaluation suite scored it below the shipping baseline, so it was not merged.
The benchmark caught a regression that looked fine in the demo.
What we learned
The privacy constraint produced a better architecture.
We initially considered a persistent vector database. The privacy requirement led to the transient embed-rank-destroy pipeline, which performs semantic matching while leaving Slack content out of storage.
We also learned that "related terms" are not enough for cross-vocabulary retrieval. Early probe-generation prompts matched every credentials discussion with every other credentials discussion. Recall improved only when probes represented the decision's underlying mechanism, consequences, and alternatives.
We learned that restraint is a core capability for a proactive agent.
The card gets the screenshot. The silence makes the product usable.
Potential impact
A growing engineering organization can make dozens of consequential decisions every week. Precedent only needs to prevent one repeated investigation, reopened debate, or failed implementation each month to save dozens of engineering hours.
Precedent works from the conversations teams already have. Nobody has to predict what a future coworker will need, rewrite threads as documentation, or maintain a second source of truth.
The same approach applies to security reviews, support escalations, policy decisions, vendor selection, and incident response.
What's next
Adaptive taxonomy
Precedent currently uses a 27-concept vocabulary. A controlled promotion loop could identify recurring new concepts and expand that taxonomy, raising recall without weakening precision.
Privacy-preserving historical warm-up
A rate-limited scan of opted-in channels could derive decision metadata without permanently storing the underlying messages. This would make the decision graph useful sooner while preserving the no-content-storage model.
Slack assistant experience
An Agents & AI Apps interface would support conversational decision queries and enable additional Slack-native search capabilities.
Guided conflict resolution
Today, Precedent can identify conflicting decisions. A future version could help affected teams compare context, identify the appropriate owners, and establish a shared decision rather than merely flagging the disagreement.
Closing
Organizations repeat decisions when the relevant history is buried in unfamiliar language, unseen channels, and conversations nobody knows to search for.
Precedent finds that history at the moment it matters and keeps the result private. The source conversations stay in Slack.
Your organization already decided this. Precedent makes sure the next person knows.
Built With
- amazon-nova-micro
- amazon-titan-embeddings
- aws-bedrock
- aws-dynamodb
- aws-kms
- aws-lambda
- aws-sqs
- claude-haiku
- claude-sonnet
- python
- slack-api
- slack-block-kit
- slack-bolt-python
- slack-real-time-search-api
Log in or sign up for Devpost to join the conversation.