Conversation Digest
Turn a long, messy conversation into a short, decision-ready digest. Works on Slack/chat threads, support tickets, incident/debug logs, email chains, and meeting notes.
When to use
Activate this skill when the user:
- Pastes a long thread/conversation/log and asks to "summarize", "tóm tắt", "what's the problem", "vấn đề là gì", "what should we do", or similar.
- Points at a source instead of pasting: "digest Slack thread ", "tóm tắt ticket LINEAR-123", "summarize this Notion page", "tóm tắt meeting notes trong Drive".
- Needs to catch up on a discussion they weren't part of.
- Wants the decision, the fix, or the next steps extracted from noise.
Input sources
The content to digest can come from either:
Pasted text — the user drops the thread/log/notes straight into the prompt. Always works, no setup.
A connected source via MCP — the user gives a reference and the skill fetches the content itself. Supported when the matching MCP connector is authenticated:
- Slack — a channel name or thread link → read the thread messages.
- Notion — a page/database link or title →
notion-fetch/notion-search. - Linear — an issue key/link → fetch issue + comments.
- Atlassian/Jira — an issue key → fetch issue + comments.
- Google Drive — a doc link/name →
read_file_content.
Discover the tool with ToolSearch (e.g.
select:notion-fetchor a keyword search likeslack thread), then call it. If the required connector is not authenticated in this session, do NOT guess the content — tell the user to authenticate the connector (claude.ai connector settings, or/mcpin an interactive session) and offer the paste-text path as a fallback.Slack specifically needs the Slack plugin installed before any
slack_*tool exists:claude plugin install slack@claude-plugins-official, then/mcp→ authorizeplugin:slack:slack. Relevant tools once authorized:slack_read_thread,slack_read_channel,slack_read_user_profile,slack_search_public_and_private.
Once the raw content is in hand — pasted or fetched — the digest process below is identical.
Identifying the current user ("what do I need to do")
The digest ends with a personalized section — VI "👤 Phần của bạn" / EN "👤 Your part" — holding the action items and decisions that concern the person reading it. To know who that is:
Auto-detect from Slack (preferred). When the source is Slack, call
slack_read_user_profilewith no user_id (or the authenticated user's id) to get the current user's display name / real name. Match that name against thread participants and mentions, including common variants — a display name may carry a role suffix (e.g.Sam (Platform)), a handle may differ from the real name (sam.leevsSam Lee), and the<@U…>mention id maps to the same person.User states it. If they say "I'm " / "tôi là <tên>", use that name directly.
Can't determine it (pasted text, no Slack, name not in thread) → skip the personalized section and instead add one line, in the digest's language:
- VI: "(Không xác định được bạn là ai trong thread — nói rõ tên để mình lọc phần của bạn.)"
- EN: "(Couldn't tell which participant is you — say your name and I'll filter your part.)"
Never guess who the user is.
When matching, look for: direct @mentions of the user, @subteam/group mentions, tasks assigned to them, questions directed at them, and decisions they own. Report status per item (done / pending / waiting on someone else / expired).
Broadcast mentions are not you. @channel, @here, @everyone address the whole room. Never read them as "the user was tagged": they must not create an item in the user's part, and they must not trigger catch-up mode. Almost every company announcement is a broadcast — treating it as a personal tag is the single easiest way to wreck the output.
Group handles you cannot resolve. The Slack MCP plugin exposes no usergroup lookup — only slack_read_user_profile, slack_read_thread, slack_read_channel, slack_search_*, slack_list_channel_members. A raw <!subteam^S…> id therefore cannot be expanded to its name or members. Do not guess membership. Report the id verbatim with the honest label:
- VI: "có thể là bạn — qua group
<id>, không verify được thành viên" - EN: "possibly you — via group
<id>, membership unverifiable"
If the thread names a team in prose ("the DevOps team already rotated it") you may use that to explain why the thread is relevant to the user — but still never assert they are in the group.
Catch-up mode (when the user was tagged mid-thread)
Triggers automatically whenever the identified user is @-mentioned somewhere after the start of the thread (i.e. they were pulled in, not the original author). This is the "I'm new / just got tagged into a long thread — what do I need to understand and do?" case.
Two things that do NOT trigger it:
- A broadcast (
@channel/@here/@everyone) — see "Broadcast mentions are not you". This matters because catch-up mode hides the rest of the thread; firing it on an announcement would collapse the very content the reader needs. - An unresolvable
<!subteam^…>— without confirmed membership, produce the normal digest and label the group as possibly-you instead.
In catch-up mode, reshape the output so the user can act fast:
- Find the first message that tags the user (direct @mention, or a group/@subteam they belong to). Call this the tag point.
- Everything BEFORE the tag point = context → summarize it as "what you need to understand to handle this". Strip noise (off-topic banter, jokes, huge raw data dumps like NS records — mention they exist, don't paste them).
- At the tag point → state plainly: who tagged you, and what you're being asked to do.
- Do NOT reveal how it was resolved. Everything AFTER the tag point (later replies, the fix, confirmations) is collapsed into a single spoiler line — so the user can try to solve it themselves. Only expand it if they ask.
- VI: "(Muốn xem thread đã kết thúc / được fix ra sao? Nói mình mở phần còn lại.)"
- EN: "(Want to see how the thread ended / how it got fixed? Say so and I'll unfold the rest.)"
- Still give the [Đề xuất] investigation hint based on the symptom + context up to the tag point — never based on the hidden resolution.
If the user was NOT tagged (they're the author, or just cc'd at the very end), skip catch-up mode and produce the normal full digest.
Sync-since-last mode (user was tagged again after already participating)
The common real case: the user already replied/acted in the thread earlier, then got pulled back in later ("bị tag lại"). They don't want the whole thread again — just what's new since they last engaged.
Triggers when the identified user has their own message(s) in the thread AND there is later activity after their last message (or a new tag of them after it).
- Find the user's last own message (or last tag directed at them, whichever is later) → this is the sync point.
- Summarize only what happened after the sync point: new decisions, new asks, what others did, and whether anything is now waiting on the user again.
- Lead with a one-line anchor so they remember where they left off — VI: "kể từ lần bạn tham gia (<mốc/việc bạn làm>):" / EN: "since you last chimed in (<time/what you did>):".
- End with the personalized section — VI "👤 Phần của bạn" / EN "👤 Your part" — specifically any NEW item now on the user, or VI "Không có gì mới cho bạn." / EN "Nothing new for you." if the later activity doesn't concern them.
Keep it short — this is a delta update, not a full digest. If nothing happened after the sync point, say so in one line.
Announcement / FYI mode (content with no problem to solve)
Not every thread is a problem. Company announcements, policy notices, deadline reminders, release notes and heads-up posts have no core problem, no debate, and often no owner — forcing them into Core problem produces nonsense like "Not a problem — this is an announcement".
Triggers when the content states facts or already-made decisions, nobody is diagnosing anything, and there is no open question directed at anyone. Broadcasts (@channel/@here) are the usual shape.
Reshape to:
- What this is — one line: who announced what.
- How it applies to you — the eligibility rule, cutoff or condition that decides whether it concerns the reader. This is the part people actually miss, so never drop it.
- Deadline — if any, with expiry checked against today (see Core rule 7). Omit the section when there's no deadline.
- No timeline, no solution section — there is nothing to solve. Keep the whole digest under ~5 lines.
Strip social noise aggressively here: reaction chains, congratulation replies, jokes, emoji-only messages. In announcement threads that's the bulk of the volume and none of the signal.
Once the raw content is in hand — pasted or fetched — the digest process below is identical.
Core rules
- Two supported output languages — Vietnamese and English. Match the input.
- Mostly-Vietnamese input → write the whole digest in Vietnamese. Mostly-English → English.
- Mixed → follow the language the decisions are written in.
- Any other language → default to English; keep quoted snippets in their original language.
- An explicit request always wins ("trả lời bằng tiếng Anh", "answer in Vietnamese").
- The chosen language applies to everything you emit: section headings, status words, and every boilerplate line defined in this skill (the "who are you" fallback, the catch-up spoiler line, the "nothing new" line). Never mix both languages in one digest.
- Extract, don't invent. Only state what the text supports. If the problem or solution is unresolved, say so explicitly — never fabricate a conclusion.
- Be concise. Default to short. Sacrifice grammar for concision. The reader wants signal, not prose. The always-on core is Core problem + Solution/recommendation + Your part — those alone should answer "what is this and what do I do".
- Timeline is optional, not default. Do NOT list every message. Decide per thread:
- Short or linear thread (one clear ask → answer, no back-and-forth) → omit the timeline entirely.
- Long/complex thread (debate, changed direction, multiple parties, spanned days) → include a timeline but cap it at 3–5 of the most decision-moving beats. Never a blow-by-blow.
- When in doubt, leave it out — the user can say "xem timeline" / "show timeline" to get the full sequence.
- Attribute when it matters. For decisions and action items, name who said/owns it if the text makes it clear.
- Surface disagreement. If people disagreed or a decision is contested, note it rather than smoothing it over.
- Check every deadline against today's date. Before listing any dated item, compare its deadline to the current date. Already passed → say so explicitly (VI "ĐÃ QUÁ HẠN" / EN "EXPIRED") and set that item's status to
expiredrather than presenting it as still actionable. An item the reader can no longer complete needs a different next step — ask the owner for an exception — not a checkbox. Undated items stay undated; never invent a deadline.
Process
If the user pointed at a source instead of pasting, fetch it first (see Input sources). If the connector isn't authenticated, stop and ask for auth / paste.
Read the entire input once to understand the shape, then pick exactly one mode:
- States facts / already-decided things, nothing to diagnose, no open question → Announcement / FYI mode.
- User tagged mid-thread, no earlier message from them → catch-up mode.
- User already participated and there's later activity → sync-since-last mode.
- Otherwise → the normal digest below.
A broadcast (
@channel/@here) is a signal for announcement mode, never for catch-up.Identify the core problem — the one thing this whole thread is actually about, stripped of noise.
Trace the timeline — key events/messages in order, only the ones that moved things forward.
Extract the solution / recommendation — what was decided or the fix applied. If none, propose the most sensible next step and label it clearly as a proposal.
List action items — who does what, deadline if stated.
Identify the current user (see "Identifying the current user") and pull out the items that concern them.
Output using the format below.
Output format
Produce exactly these sections. Each line below gives the VI form and, after │ EN:, the English form — emit one language only, never both. Omit a section only if the input genuinely has nothing for it, and say why.
## 🎯 Vấn đề cốt lõi │ EN: ## 🎯 Core problem
<1–2 câu: vấn đề thật sự là gì, bóc khỏi nhiễu>
│ EN: <1–2 sentences: the real problem, stripped of noise>
## ⏱️ Timeline / diễn biến │ EN: ## ⏱️ Timeline
← CHỈ thêm mục này nếu thread dài/phức tạp; tối đa 3-5 mốc; bỏ hẳn nếu thread ngắn/thẳng
- <mốc quan trọng 1>
- <mốc quan trọng 2>
## ✅ Giải pháp / khuyến nghị │ EN: ## ✅ Solution / recommendation
<cách đã chốt để fix. Nếu chưa chốt → "CHƯA CHỐT" + đề xuất bước hợp lý nhất, gắn nhãn [Đề xuất]>
│ EN: unresolved → "NOT DECIDED" + best next step tagged [Proposal]
## 📌 Action items │ EN: ## 📌 Action items
- [ ] <việc> — <người> — <deadline nếu có>
(ghi "Không có action item rõ ràng" │ EN: "No clear action items")
## 👤 Phần của bạn (<Tên>) │ EN: ## 👤 Your part (<Name>)
- <việc CỦA BẠN> — <trạng thái: xong / đang chờ / chờ người khác / đã quá hạn>
│ EN status words: done / pending / waiting on someone else / expired
(không có phần nào → "Bạn không có việc trực tiếp trong thread này."
│ EN: "You have no direct action in this thread."
không xác định được bạn là ai → dùng dòng fallback ở mục "Identifying the current user")
Catch-up mode format (used instead of the above when the user was tagged mid-thread)
## 🎯 Vấn đề cốt lõi │ EN: ## 🎯 Core problem
<1–2 câu: vấn đề khiến bạn bị kéo vào> │ EN: <1–2 sentences: the problem you got pulled into>
## 📖 Context trước khi bạn được tag │ EN: ## 📖 Context before you were tagged
- <mốc context 1 — bỏ nhiễu, không dán data thô>
- <mốc context 2>
> Kết luận context: <1 câu chốt tình hình tính tới lúc bạn được tag>
│ EN: > Context takeaway: <1 sentence: where things stood when you were tagged>
## ⚠️ Chỗ bạn được kéo vào │ EN: ## ⚠️ Where you came in
- <ai tag bạn, khi nào, nói gì> │ EN: <who tagged you, when, what they said>
## 👉 Bạn được yêu cầu làm gì │ EN: ## 👉 What you're being asked to do
<việc cụ thể bạn cần làm>
[Đề xuất] <hướng điều tra dựa trên triệu chứng + context, KHÔNG dựa vào cách đã fix ở phần sau>
│ EN: [Proposal] <investigation angle from symptom + context, NOT from the hidden fix>
---
(Muốn xem thread đã kết thúc / được fix ra sao? Nói mình mở phần còn lại.)
│ EN: (Want to see how the thread ended / how it got fixed? Say so and I'll unfold the rest.)
Sync-since-last format (used when the user was tagged again after already participating)
## 🔁 Kể từ lần bạn tham gia (<mốc: lần cuối bạn làm gì>)
│ EN: ## 🔁 Since you last chimed in (<time/what you did>)
- <cái mới 1: ai làm/nói gì> │ EN: <what's new 1: who did/said what>
- <cái mới 2>
(nếu không có gì mới → "Chưa có gì mới kể từ lúc đó."
│ EN: "Nothing new since then.")
## 👉 Phần của bạn bây giờ │ EN: ## 👉 Your part now
<việc MỚI đang chờ bạn — hoặc "Không có việc mới cho bạn, chỉ là cập nhật thông tin.">
│ EN: <the NEW item on you — or "Nothing new for you, just an FYI update.">
Announcement / FYI format (used for content with no problem to solve)
## 📢 Nội dung thông báo │ EN: ## 📢 What this is
<1 dòng: ai thông báo gì> │ EN: <1 line: who announced what>
## 🎯 Áp dụng với bạn thế nào │ EN: ## 🎯 How it applies to you
<điều kiện / cutoff quyết định bạn có liên quan — hoặc "Chỉ là thông tin, không cần làm gì.">
│ EN: <the condition/cutoff that decides whether it concerns you — or "FYI only, nothing to do.">
## ⏰ Deadline │ EN: ## ⏰ Deadline
<mốc — trạng thái: còn hạn / ĐÃ QUÁ HẠN (so với hôm nay)>
│ EN: <date — status: open / EXPIRED (checked against today)>
(bỏ hẳn mục này nếu không có deadline) │ EN: (omit this section entirely if there is no deadline)
No timeline, no solution section, no action-item checklist unless the announcement genuinely asks for something.
Quality bar
- A reader who never saw the thread should understand the situation in under 30 seconds.
- The "Core problem" line alone should be usable as a one-line status update.
- No hallucinated decisions. Unresolved = say unresolved.
Examples
See examples.md for worked before/after samples: a Vietnamese debug log (normal digest), an English Slack debate (unresolved), and an English catch-up-mode thread.