# Daily Inbox Triage

> Sweep inbox (email + Slack + Telegram DMs) and produce a prioritized action list with suggested replies

- Skill: `onlyterp/daily-inbox-triage` (Agent Skill)
- Install (CLI): `npx skillmds@latest add onlyterp/daily-inbox-triage`
- Raw SKILL.md: https://api.skillmd.com/api/skills/onlyterp/daily-inbox-triage/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Integrations & APIs
- Author: OnlyTerp (https://skillmd.com/u/onlyterp)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/onlyterp/daily-inbox-triage

---


# daily-inbox-triage — Morning Sweep

Produce a **one-screen triage report**: what's urgent, what's a decision, what's noise, with a draft reply per actionable item.

## Procedure

1. **Collect** unread items from each configured channel within `window:`. Cap at 200 items; if over, prioritize starred / mentions / VIP-list senders.

2. **Classify** every item into one of:
   - `urgent` — time-sensitive, needs action today
   - `decision` — needs a yes/no/pick from me
   - `info` — FYI; noting what they said is enough
   - `noise` — newsletters, generic updates, obvious marketing
   - `spam` — confident spam (see [spam-trap](../../security/spam-trap/SKILL.md))

3. **Summarize** per item: one line of "who / what / ask". Keep under 80 chars.

4. **Draft replies** for every `urgent` and `decision` item. Keep replies under 4 sentences. Never include URLs the sender supplied without sanitizing.

5. **Output** as a single markdown message:

   ```
   ## Inbox Triage — {date}, last {window}

   ### Urgent ({n})
   - [email] Alice @ Acme — blocker on staging auth → draft: "{reply}" [/approve 1]
   - [slack] #incidents — payment API 500s → draft: "{reply}" [/approve 2]

   ### Decisions ({n})
   - [telegram] @pm — approve Q3 roadmap doc? → draft: "{reply}" [/approve 3]

   ### FYI ({n})
   - {brief one-liners}

   ### Noise ({n})
   - {unsubscribable patterns suggested}
   ```

6. **Surface**:
   - Any item matching a **VIP sender pattern** (from config) gets escalated regardless of classifier.
   - Any item mentioning **"urgent", "asap", "incident", "outage", "production"** escalates to `urgent` even if classifier disagreed.

7. **Never**:
   - Send replies automatically. Approval is required for every outbound.
   - Follow links from untrusted senders.
   - Summarize attachments without explicit user consent (privacy + prompt-injection risk).

## Example config snippet

There is no `skills.overrides:` block in config.yaml — per-skill settings
(like the VIP-sender list) are declared in the skill's OWN frontmatter via
`metadata.hermes.config` (see user-guide/features/skills.md), or just
hardcoded in the skill file:

```yaml
# in SKILL.md frontmatter — not config.yaml
metadata:
  hermes:
    config:
      - key: daily_inbox_triage.vip_senders
        description: "Sender prefixes/domains that always escalate"
        default: '"ceo@", "board@", "@lawyer.example.com"'
      - key: daily_inbox_triage.escalate_keywords
        description: "Words that force the urgent class"
        default: '["urgent", "asap", "incident", "outage", "production"]'
```

Scheduling the morning run is a cron job (jobs.json, managed via `hermes
cron create` — not a YAML list):

```bash
hermes cron create "0 8 * * 1-5" \
  "Run the inbox-triage skill (window 24h)" \
  --skill daily-inbox-triage --name morning-inbox --deliver telegram
```

## Tips

- Keep this skill **reading-only by default** — it reports, you approve, you reply.
- Pair with [telegram-triage](../telegram-triage/SKILL.md) for same-shape logic on Telegram-only flows.
- Route to cheap models (Gemini Flash-class). You'll run this daily; every penny counts.

