Topic: Slack decision threads

Slack Decision Threads — Capturing Architecture Decisions from Slack Channels (2026)

The #architecture channel is where many engineering teams make their most consequential decisions — and where those decisions disappear fastest. Slack threads are where engineers say "we're going with Postgres" and "I think we should use Kafka here" with real reasoning, then the message history gets truncated on the free plan, the channel gets archived, or the workspace migrates and the context is gone. This guide covers Slack's export tiers, how to find decisions in the JSON export, why Slack threads alone are not ADR-equivalent records, and the hybrid workflow that combines Slack's collaborative surface with AI chat's structured reasoning to produce durable decision records.

TL;DR

Slack threads capture the announcement and discussion of decisions but typically miss the structured reasoning (explicit alternatives, specific rejection reasons) that makes an ADR useful. Free-plan Slack loses message history after 90 days; paid plans keep it per retention policy. Export the workspace via Settings → Workspace Settings → Import/Export and search the JSON for decision-language patterns. For architecture decisions that matter, use the hybrid pattern: deliberate in ChatGPT or Claude (produces structured reasoning that's always exportable), announce in Slack, then write the ADR — the WhyChose extractor recovers the AI deliberation session as the ADR source material even months later.

Why Slack is a common decision surface

Slack has become the de facto location for engineering decision discussions at most companies for a simple reason: it's where everyone already is. The low friction of typing a message in #architecture means that more pre-decision discussion happens in Slack than in any purpose-built tool — easier than opening a Confluence page, easier than creating a GitHub RFC, easier than scheduling a meeting. The result is that Slack channels contain a large proportion of the actual reasoning behind architecture decisions, expressed informally in conversation threads.

Several Slack patterns emerge consistently in engineering teams:

The problem with all three patterns is the same: the decision lives in a conversational format that Slack's interface makes easy to read but hard to reference, search by intent, or export durably. The conversation that contains the decision is indistinguishable from the conversation about lunch plans — both are strings in a JSON file, and neither has a "this is a decision record" flag.

Slack export tiers: free, Pro, and Enterprise Grid

What you can export from Slack depends on your plan:

Free plan

The free plan retains the last 90 days of messages in public channels only. Private channels and direct messages are not accessible after 90 days even on the same plan. Export path: Settings & administration → Workspace settings → Import/Export → Export. Select a date range (limited to your message history window). Export produces a ZIP file. If you're on the free plan and looking for a Slack decision thread from more than 90 days ago, the message content is gone — the only recovery options are messages that were quoted in email notifications (if you have those), or messages that were manually copied to a document at the time.

The 90-day window is the most important reason not to rely on Slack as the primary decision record. An architecture decision made today will have its Slack context deleted before the next major product review cycle.

Pro and Business+ plans

Paid plans retain the full message history for public channels, private channels (where you're a member), and direct messages, subject to the workspace retention policy. Export access is available to workspace owners and admins via the same path (Settings → Import/Export). The export includes all channels and DMs you have access to, within the date range you specify. Large workspaces export slowly and produce multi-gigabyte ZIP files for full history exports — filter to specific date ranges or channels if you're looking for a specific decision period.

Note: Slack Connect channels (shared between two workspaces) are not included in the standard export for either workspace. Messages in Slack Connect channels are owned by the originating workspace but are not exportable by either party without contacting Slack support — a significant gap if important decisions happened in a vendor or partner Slack Connect channel.

Enterprise Grid

Enterprise Grid workspaces have admin-controlled message retention policies (commonly 1–7 years) and access to the Compliance Export API for programmatic export. The Compliance API returns messages in JSON format with the same schema as the standard export but supports pagination, channel filtering, and incremental export by timestamp. Access requires the compliance:read OAuth scope granted by the org admin. Enterprise Grid also enables eDiscovery integrations (Relativity, Exterro, ZL Technologies) that can search and hold specific messages for legal hold purposes — relevant if an architecture decision is part of a regulatory or legal investigation.

Enterprise Grid retention policies can be set per-channel-type (public channel, private channel, DM) and override the default 90-day retention that applies to lower plans. If your organization uses Enterprise Grid, check the actual retention policy with your Slack admin before relying on message history being available — an aggressive data minimization policy may delete messages faster than you expect.

Slack export plan comparison

Feature Free Pro / Business+ Enterprise Grid
Public channels 90 days Full history Per retention policy
Private channels Not exportable Full history (if member) Admin-controlled
Direct messages Not exportable Full history Admin-controlled
Slack Connect channels Not exportable Not exportable Contact Slack support
Export method UI export (ZIP) UI export (ZIP) UI + Compliance API
GDPR data request DMs only via Slack support DMs only via Slack support Admin-controlled DSAR process

The Slack export JSON format

The standard Slack export ZIP contains:

A typical message object:

{
  "type": "message",
  "user": "U02ABCD1234",
  "text": "After looking at the options, we're going with Postgres for the new service. Main reason: we already have expertise, JSONB covers the flexible-fields requirement, and keeping a single database vendor reduces our operational surface. Mongo would need a second runbook, separate backup strategy, and the team's SQL familiarity means query patterns are already natural.",
  "ts": "1711234567.001200",
  "thread_ts": "1711234500.000800",
  "reply_count": 8,
  "replies": [...]
}

Key fields for decision extraction:

Finding architecture decisions in a Slack export

A Slack export for a 3-year-old workspace can contain millions of messages. Finding the architecture decision threads requires a systematic search approach.

Decision-language keyword search

Use grep (or Python's json module) to search for messages containing decision-announcement language. High-signal patterns:

# Find messages with decision-announcement language across all channels
grep -r -i \
  -e "we decided\|we're going with\|we will use\|going with\|chosen because\|decided to use\|will use.*instead" \
  --include="*.json" \
  ./export-directory/ | \
  grep -v "channels.json\|users.json" | \
  head -100

Additional patterns worth searching:

Filter the results by channel name (architecture, eng-decisions, backend, infra, platform) to reduce noise from unrelated channels. Then look for messages with high reply_count values in the filtered results — threads with 8+ replies on a decision-announcement message typically contain the full deliberation context.

Reconstructing a decision thread from the export

Once you identify a root decision message by its ts value, collect all messages with thread_ts equal to that value across all date files in the channel directory. Messages within a thread can span multiple date files if the discussion ran over multiple days.

#!/usr/bin/env python3
import json, os, glob, sys

thread_ts = sys.argv[1]  # e.g. "1711234500.000800"
channel_dir = sys.argv[2]  # e.g. "./export/architecture/"

thread_messages = []
for fname in sorted(glob.glob(os.path.join(channel_dir, "*.json"))):
    with open(fname) as f:
        messages = json.load(f)
    for m in messages:
        if m.get("thread_ts") == thread_ts or m.get("ts") == thread_ts:
            thread_messages.append(m)

# Resolve user IDs with users.json (left as exercise)
for m in sorted(thread_messages, key=lambda x: x["ts"]):
    print(f"[{m['ts']}] {m['user']}: {m['text'][:200]}")

The reconstructed thread gives you the raw conversation material for the ADR. Use it as Tier 3 source material for a retrospective ADR — honest about the reconstruction quality, but preserving what the Slack thread actually recorded about the decision reasoning.

Why Slack threads are not ADR-equivalent records

A rich Slack decision thread is valuable source material for an ADR, but it is not a substitute for one. The structural gaps:

No single-sentence decision statement

An ADR's Decision section is a single active-voice sentence: "We will use Postgres as the primary data store." Slack threads rarely contain this — the decision often emerges across multiple messages, with qualifications, follow-ups, and clarifications distributed through the thread. Extracting the definitive decision statement from a 25-message thread requires editorial synthesis that Slack's search interface doesn't support.

No enforced Alternatives Considered section

Slack threads contain mentions of alternatives ("what about MongoDB?") but rarely provide the structured rejection record an ADR requires. The specific objection to MongoDB — "we'd lose the relational joins the reporting queries need, and the team's SQL familiarity means the operational ramp-up cost isn't worth the schema flexibility at our current scale" — gets distributed across 3–5 messages, often with follow-up questions and side threads that make it hard to extract cleanly. An ADR enforces the Alternatives Considered structure; a Slack thread does not.

Durability problems

A Slack thread's durability depends on the workspace plan and retention policy. On the free plan, the thread is gone after 90 days. On paid plans, the workspace admin can set retention policies that delete messages on any schedule. Even if messages survive, the workspace itself may be deprecated or migrated in a way that loses historical message threads — common when companies switch Slack pricing tiers, merge teams, or move to Enterprise Grid. An ADR committed to a git repository has the same durability as the codebase itself; a Slack thread has the durability of the workspace configuration.

Discoverability requires knowing to look

Finding an ADR for "why did we use Postgres?" is a single grep in the doc/decisions/ directory. Finding the equivalent Slack thread requires knowing which channel the discussion happened in, approximately when, and what keywords to search for — and still returns a conversational thread rather than a structured decision record. Engineers who didn't participate in the original Slack thread have no reliable way to discover it exists or to navigate to it from the code that implements the decision.

The hybrid pattern: AI deliberation → Slack announcement → ADR

The most effective workflow for capturing Slack-adjacent architecture decisions combines AI chat deliberation with Slack's collaborative announcement surface:

  1. Deliberate in Claude.ai or ChatGPT. Before announcing the decision in Slack, work through it in an AI chat session. Ask the AI to help you compare the alternatives, surface constraints you might have missed, and stress-test your reasoning. This session produces the structured comparison the ADR Alternatives Considered section needs — in your own words, reflecting the actual constraints — and it's permanently stored in your chat history (always exportable).
  2. Announce in Slack. Post the decision summary in #architecture or the relevant channel: "we're going with Postgres — here's the short version of why, and I'm writing up the full ADR." The Slack thread captures the team's reactions, pushback, and questions — which often add constraints and alternatives the AI session didn't surface. Treat the Slack thread as additional context for the ADR, not as the primary record.
  3. Write the ADR. Open the ADR template (see the Markdown ADR template), use the AI chat session as the primary source for Context and Alternatives Considered, and add any additional context from the Slack thread responses. Link the Slack thread in the ADR metadata if it adds decision context the AI session doesn't contain.
  4. Extract the AI session with WhyChose (optional, for retrospective cases). If weeks or months have passed since you did this deliberation and you're now writing the ADR retrospectively, the WhyChose extractor will surface the AI chat session from your conversation export. The extractor identifies sessions with explicit comparison language and constraint discussion — the same session where you worked through the Postgres vs MongoDB comparison will score high, regardless of when it happened.

This hybrid pattern produces a better ADR than either Slack alone or AI chat alone. The AI session provides the structured reasoning; the Slack announcement adds the team's validation, objections, and the follow-up context from people who weren't in the original deliberation. The ADR synthesizes both into the durable record.

Referencing Slack threads in ADRs

When a Slack thread contains substantive decision context (not just "sounds good"), link to it in the ADR using the message's direct link (right-click any Slack message → Copy link). Use it in the ADR's Links or Source section:

## Links
- Slack announcement and team discussion: https://yourworkspace.slack.com/archives/C02ABCD1234/p1711234567001200
- AI deliberation session (WhyChose ref: d4a9c2): extracted from 2024-03-23 Claude.ai session
  "postgres vs mongodb for user data service"

Important: Slack message links become inaccessible if the workspace message history is deleted (free plan after 90 days), the channel is archived without the free-plan message history, or the workspace is deprovisioned. Treat Slack links in ADRs as ephemeral references — they add context when available but should not be the primary record of the reasoning. The ADR text itself must be self-contained.

Slack as an informal RFC surface

Some teams use Slack threads as a lightweight RFC layer before writing a formal ADR — the Slack thread serves the same consultation function as a GitHub RFC or Confluence page, at much lower friction. The relationship between Slack RFCs and the ADR vs RFC distinction is the same as for any RFC form: the Slack thread is the pre-decision consultation record; the ADR is the post-decision record. They serve different purposes and should both exist.

The challenge with Slack-as-RFC is the same as with Slack-as-decision-record: durability. A GitHub RFC PR is archived even if it's closed without merging; the rejected RFC's comment thread, which contains the engineering objections that killed the proposal, lives in the git repository forever. A Slack RFC thread that gets 30 replies and is then tabled exists only as long as the workspace retention policy allows.

If your team uses Slack threads as RFCs, convert the decision-relevant threads to ADRs or GitHub RFC PRs before the retention window closes. The conversion process is straightforward: identify the decision message in the thread (or write one if the thread ended without a clear decision), extract the Alternatives Considered from the replies (the messages that suggested different approaches and why they were or weren't adopted), and draft the ADR from the thread content. A 45-minute conversion session for a substantive Slack thread produces an ADR that will survive for years; waiting until after the retention window produces nothing.

What AI chat deliberation does that Slack can't

Slack captures announcements and reactions to decisions; AI chat captures the deliberation — the actual thinking process that precedes the decision. This distinction matters because the deliberation is what the ADR needs:

This is why the hybrid pattern works: Slack's low friction makes it ideal for the announcement and team response phase; AI chat's structured output and permanent durability make it ideal for the deliberation phase. Using each tool for what it does best produces better decision records than trying to use either one for both functions.

Further Reading

The decisions you're trying to find in Slack are in your AI chat history

The Slack thread that captured the announcement is one data point. The Claude.ai or ChatGPT session where you worked through the comparison — the one with the explicit alternatives, the constraint discussion, the reasoning that the ADR actually needs — is in your conversation export right now. The WhyChose extractor surfaces it automatically, ranked by decision density, regardless of when the session happened.

Run the open-source extractor   Get hosted access