hourly-digest · git:20260611.503b878 · 2026-06-11 · sha256 17feb5cdcdad961e
hourly-digest git:20260611.503b878A
Immutable. This exact content never changes and is served at /api/v1/blob/17feb5cdcdad961e.
---
name: hourly-digest
description: |
This skill should be used when the user asks to "check hourly updates",
"hourly digest", "hourly slack gmail summary", "what happened in the last hour",
"hourly monitoring", or needs a consolidated hourly summary from Slack
and Gmail. Also triggers for automated invocation via /loop 1h /hourly-digest.
Distinct from per-channel Slack digest or single-source summaries -- this is
the unified cross-source hourly rollup. For GitHub/Linear activity sync,
use /loop 1h /github-activity separately.
argument-hint: "[slack|gmail]"
---
# Hourly Digest
Consolidate Slack messages and Gmail from the past hour into a single grouped summary. Respond in the user's language.
## Argument Parsing
Parse `ARGUMENTS` for an optional subcommand:
| Input | Behavior |
|-------|----------|
| (empty) | Run all sections: Slack, Gmail |
| `slack` | Slack digest only |
| `gmail` | Gmail digest only |
## Execution
Run each requested section independently. On failure, report `[ERROR] Source: {message}` and continue to the next section.
Load all needed MCP tools upfront in a single call before starting any section:
```
ToolSearch("select:mcp__claude_ai_Slack__slack_search_public_and_private,mcp__claude_ai_Gmail__gmail_search_messages,mcp__claude_ai_Gmail__gmail_read_message")
```
### 1. Slack Digest
1. Compute today's date via Bash: `date '+%Y-%m-%d'` (Slack `after:` excludes the given date; use `on:` to include it)
2. Use `slack_search_public_and_private` with query `on:{date}` to find today's messages, then filter results to the past hour by message timestamp
3. Group results by topic — cluster messages about the same subject together, even when they span multiple channels
4. Per topic: `**Topic** (N): key points — [#channel-name](https://{workspace}.slack.com/archives/{channel_id})`
5. For notable messages with threads, link to the thread: `[thread](https://{workspace}.slack.com/archives/{channel_id}/p{timestamp_no_dot})`
6. If no messages found, state that there are none
Construct Slack links from search result metadata: channel ID for channel links, channel ID + message timestamp (remove the dot) for thread permalinks.
### 2. Gmail Digest
1. Use `gmail_search_messages` with query `newer_than:1h`
2. If search results already include sender and subject, use them directly. Only call `gmail_read_message` for items missing these details (avoid N+1 reads)
3. Group by topic — cluster related subjects and threads together
4. Per topic: `**Topic** (N): From: sender -- ["Subject"](https://mail.google.com/mail/u/0/#inbox/{messageId})`
5. If no emails found, state that there are none
Construct Gmail links from the messageId returned by search results.
## Output Format
Present all results under a header with the time range (e.g., `## Hourly Digest (14:00-15:00 KST)`).
Each source gets its own `###` subheader. Example structure:
```
## Hourly Digest (HH:MM-HH:MM KST)
### Slack
- **Auth service hotfix** (3): deployment discussion and rollout decision — [#channel-a](https://workspace.slack.com/archives/C0123), [hotfix thread](https://workspace.slack.com/archives/C0123/p1234567890)
- **Standup** (1): reminder — [#channel-b](https://workspace.slack.com/archives/C0456)
### Gmail
- **Billing renewal** (1): From: sender@example.com -- ["Subject line"](https://mail.google.com/mail/u/0/#inbox/msg123)
- **Project kickoff** (2): From: another@example.com -- ["Thread topic"](https://mail.google.com/mail/u/0/#inbox/msg456)
```
When a section has no results, use a single line indicating nothing new.
When running a single section via subcommand, omit the other section headers entirely.
## Cron Usage
```
/loop 1h /hourly-digest
```