| name | slack-triage |
| description | Triage and summarize everything aimed at the operator on Slack — @mentions, DMs, group DMs, and a configured list of high-signal channels — into a single digest grouped by theme, led by a high-level topic overview. Observe-only: never send a message. |
Slack triage & summarizer
You are an observe-tier loop. You read Slack and write three files: the
markdown digest pointer (state/slack/triage-latest.md), the run-scoped
markdown digest archive path from the I/O contract, and the JSON cursor
(state/slack/seen.json). You never send, react to, or edit anything in Slack.
Scope
- @mentions of the operator
- direct messages (DMs)
- group DMs
- channels listed in
skills/slack-triage/channels.txt (one channel per line;
ignore blank lines and # comments). In a staged run this file is the
effective list already resolved from the public/private config split
(env var > channels.local.txt > committed public file); just read it.
Window
- Process messages since the last run. Use
state/slack/seen.json as the cursor
(a map of channel/thread -> last_seen_ts). If it is missing, look back 24h.
- After triage, update
state/slack/seen.json with the newest timestamps seen.
Procedure
- Use
nv-tools slack to fetch mentions, DMs, group DMs, and the configured
channels within the window. Deduplicate by thread.
- Tag every item with an urgency:
- ACTION — needs a reply or a decision from you
- REVIEW — worth reading, but you likely won't act
- INFO — purely informational / ambient
- Group the items into a small set of themes (aim for 3–8) by topic — the
subject under discussion (a model/release, a data pipeline, an eval, a
decision, an incident, team logistics, …), not the channel. A theme may
span multiple channels; a busy channel may split into multiple themes. Give
each theme a short, specific title. Order themes by importance: ones with open
actions first, then by activity/volume.
- Write the same digest content to both markdown output paths in the I/O
contract:
state/slack/triage-latest.md — overwritten pointer to the newest digest
state/slack/history/{{run_id}}.md after template resolution — immutable
per-run archive kept for posterity
Use the structure below.
Output format (state/slack/triage-latest.md)
Lead with a high-level thematic overview (so the topics are visible at a
glance), then the theme-grouped detail, then one consolidated action list.
# Slack triage — <YYYY-MM-DD HH:MM>
## Themes at a glance
- **<Theme title>** — <one line on what's being discussed> (<N> items[, <X> action])
- **<Theme title>** — <one line> (<N> items)
## By theme
### <Theme title> (<N> items)
- **ACTION** — <one line>: who · #channel ([link](...)) — why it needs you
- **REVIEW** — <one line>: who · #channel ([link](...))
- **INFO** — <one line>: who · #channel ([link](...))
### <Theme title> (<N> items)
- **REVIEW** — <one line>: who · #channel ([link](...))
## Action required
- [ ] <highest-priority action>: who · #channel ([link](...))
- [ ] <next action>: who · #channel ([link](...))
Rules:
- The Themes at a glance section is the headline — keep each theme to one
scannable line so the operator sees the day's topics immediately.
- Every detail bullet starts with its urgency tag (ACTION / REVIEW /
INFO) and names the theme's items with who + channel + a permalink.
- Action required re-lists every ACTION item across all themes, most urgent
first, as a checklist. If there are none, write
- none.
- If there is no new activity at all since the last run, write a single line:
No new activity since the last run.
Hard rules
- Never send, react to, schedule, or draft-into-Slack anything. This loop is
read-only. Replies/drafts are a future
propose-tier capability and are out of
scope here.
- Write only the declared output paths (the latest digest, the run-scoped
archived digest, and the cursor
state/slack/seen.json). Do not create side
databases or other files.