Inbox-Triage — Recurring Email Triage

Runs a full inbox triage using the knowledge base created by the 'inbox-setup' skill.

How to use it

Claude Code
  1. Run the line below. It pulls the whole folder into ~/.claude/skills/inbox-triage, including the files SKILL.md points to.
  2. Describe your job in plain words. Claude Code follows the skill from there.
Claude Code — installs the whole folder, not just SKILL.md
npx degit alirezarezvani/claude-skills/productivity/email/skills/inbox-triage#main ~/.claude/skills/inbox-triage

For one project only, change the path to .claude/skills/inbox-triage. This skill also uses email-taxonomy.md, blocklist.md, tracker.md, evaluation-framework.md, email-patterns.md — copying SKILL.md alone won't be enough. See the folder on GitHub.

Claude (web or desktop app)
  1. On this page open ⋯ → Download .md.
  2. Save it as SKILL.md in a folder, zip the folder, then Customize → Skills → + → Create skill → Upload a skill.
  3. Pick the file and Save. Claude shows the name and description and runs a security scan.
  4. Check the skill is switched on.
  5. Start a new chat and describe your job in plain words. The AI follows the skill from there.
ChatGPT or another app
  1. ChatGPT: make a Project and paste it into Instructions.
  2. Neither? Paste it at the top of a new chat — it works for that chat.
Not working?
  • Check which app you pasted it into — the steps above name the right one.
  • Some skills need the paid tier of Claude or ChatGPT.
Step-by-step guide with screenshots · Ask in the forum

Paste into Claude, ChatGPT or Cursor.

Source of Inbox-Triage — Recurring Email Triage

Show the full text313 lines
namedescriptionlicensemetadata
inbox-triageRuns a full inbox triage using the knowledge base created by the 'inbox-setup' skill. Light-intake by design (most invocations skip questions and run with KB-default preferences); asks at most 2 grill-me override questions when invocation is outside normal cadence or includes category-skip intent. Searches recent emails, classifies them via the user's taxonomy, researches new senders, generates recommendations, drafts replies (NEVER sends), delivers a report in the user's preferred format, and updates the knowledge base with learnings. Designed to run on a recurring schedule (1-3x daily) or on demand. Use when the user wants their inbox processed, in any variation (e.g., 'triage my inbox', 'inbox triage', 'check my email', 'run email triage', 'process my inbox', 'what's new in my email', 'handle my email', 'email triage'). Requires the inbox-setup skill to have been run first.MIT source_spec: "megaprompts/07-inbox-triage-megaprompt.md build_pattern: "Path B (direct conversion) paired_with: "inbox-setup (consumes the 7-file KB it produces) version: 1.0.0

Inbox-Triage — Recurring Email Triage

Paired with inbox-setup. This skill consumes the 7-file knowledge base that inbox-setup writes at ${WORKSPACE}/Email/. The file contracts MUST match exactly. See references/kb_file_contract.md — this is the mirror of the setup-side contract, viewed from the read side.

Run on a recurring schedule (1–3x daily) or on demand. Classify recent emails, research new senders, generate decision recommendations, draft replies (NEVER SEND), deliver a clean report, and update the knowledge base with what was learned this run.

Invocation Triggers

  • "triage my inbox"
  • "inbox triage"
  • "check my email"
  • "run email triage"
  • "process my inbox"
  • "what's new in my email"
  • "handle my email"
  • "email triage"

Prerequisites

Required reads at start (fail-fast if missing):

Core (required):

  • ${WORKSPACE}/Email/email-taxonomy.md — classification + report preferences
  • ${WORKSPACE}/Email/email-patterns.md — voice, persona, templates, hard rules

Optional core (read if exists):

  • ${WORKSPACE}/Email/evaluation-framework.md
  • ${WORKSPACE}/Email/rate-card.md

Evolving (read AND update every run):

  • ${WORKSPACE}/Email/blocklist.md
  • ${WORKSPACE}/Email/tracker.md

Output:

  • ${WORKSPACE}/Email/triage-log/<YYYY-MM-DD>-<run-label>.md — per-run log

If any core required file is missing → halt, direct user to run inbox-setup first. Use scripts/kb_reader.py to perform the read + validation.

DRAFTS ONLY — Never Send

This skill creates drafts. It NEVER sends.

This is the safety property that makes the skill safe to run automatically. Stated multiple times in this skill body. Non-negotiable.

The scripts/draft_safety_validator.py enforces it post-run. Any send-shaped tool call in the action log fails validation. See references/drafts_only_safety.md for the full discipline canon.

Step 0: Grill-Me Intake (Light — 0–2 Optional Override Questions)

Inbox-triage is light-intake by design — it runs on a recurring cadence with preferences pre-baked into the knowledge base from inbox-setup. The grill-me discipline here is asking ONLY the override questions that matter THIS run.

Q1 (optional, asked only when on-demand run is outside normal cadence)

Override the default 9-hour search window? Pick: yes (specify hours) / no (use default).

Why I'm asking: If you're running on-demand outside your normal 2x/day cadence, you may want a wider window (24h after a long break) or narrower (2h for a quick check).

Skip if cadence is normal.

Q2 (optional, asked only when user invokes with category-skip intent)

Skip any categories this run? E.g., "skip newsletters", "skip financial".

Why I'm asking: Sometimes you just want to scan opportunities or just want to clear active threads. Category skip narrows the run scope.

Skip if user gave no category-skip signal.

Stop condition: Max 2 questions. Default invocations skip both questions and run with KB-default preferences. The skill is optimized for fast recurring execution; intake is the exception, not the norm.

Step 1: Determine Search Window

Compute via current date math. Default lookback: 9 hours (works for 2x/day cadence with slight overlap so emails between runs aren't missed).

Use scripts/search_window_calculator.py --cadence <CADENCE> --now <ISO>:

now = current_datetime
window_start = now - 9_hours   (default for 2x-daily)
run_label = "Morning" if now.hour < 12 else "Afternoon" if now.hour < 17 else "Evening"

Cadence-to-default-window mapping (override via Q1):

Cadence (from email-taxonomy.md S1.Q5) Default window
once daily 26h
2x daily 9h
3x daily 6h
on-demand only 24h (asks Q1)

Two queries (provider-agnostic adapter pattern):

  • Primary: Inbox + sent after window_start
  • Secondary: Starred unread (catch flagged items missed in primary)

Collect for each email: sender, subject, date, snippet, thread ID, labels.

Provider adapter mapping:

Provider Tool
Gmail Gmail MCP
Outlook / Microsoft 365 Outlook MCP
IMAP (Fastmail, ProtonMail, etc.) IMAP MCP if available; halt otherwise
(no email tool available) Halt with clear message: "No email tool registered for this session."

Step 3: Classification

Apply the taxonomy from email-taxonomy.md. For lowest-priority category (newsletters / automation / spam): skip thread reads entirely — context cost not worth it. For everything else: read full thread.

Step 4: Sender Research

For senders not in tracker / blocklist / prior logs:

  1. Check blocklist.md → if matched, auto-skip
  2. Check tracker.md → if known thread, note existing context
  3. For opportunity senders (per evaluation framework): web search for company legitimacy, social presence, intermediary status

Skip research entirely for: known senders (in tracker), internal email, automated notifications, obvious low-priority.

Step 5: Recommendations

For decision-required emails, apply the framework from evaluation-framework.md. Categorize:

Category When Output
TAKE IT Meets criteria Recommend engaging; draft reply (Step 6)
WORTH CONSIDERING Has potential, needs user judgment Surface key context; draft for user to edit
PASS Doesn't meet criteria Brief "why" (1–3 sentences); draft polite decline
FLAG FOR REVIEW Unusual; needs direct user decision Surface fully; NO draft (user decides response shape)

Each: brief "why", relevant context, pricing/timeline comparison if applicable.

Skip Step 5 entirely if no evaluation-framework.md exists.

See references/triage_decision_framework.md for the framework canon.

Step 6: Drafts

For every reasonable reply candidate, create a draft using email-patterns.md voice rules.

Draft for: opportunity responses (TAKE IT / WORTH / PASS), active conversations needing reply, action items, important personal emails.

Do NOT draft for:

  • Clearly no-response emails (newsletters, automation, FYI)
  • Threads where user already replied
  • Blocked senders (unless new info changes the calculus)

Mechanics:

  • Draft only in the existing thread when possible (preserves context)
  • Set to, subject (Re: [original])
  • NEVER call any send operation. Only create drafts.

The draft body MUST honor:

  • Voice register from email-patterns.md
  • Forbidden tokens (S3.Q2 pet peeves)
  • Sign-off patterns
  • Persona context
  • Hard rules (S3.Q6 — non-negotiable)
  • Reply length per email-patterns.md

If evaluation-framework.md exists, draft tone matches recommendation:

  • TAKE IT → engaged + concrete next step
  • WORTH → curious + 1-2 clarifying questions
  • PASS → polite decline + brief reason (no hedging promises)
  • FLAG → NO draft

Step 7: Report Delivery

Honor user's preference from email-taxonomy.md "Report Preferences" section. Default: email draft to self with HTML.

Subject: Inbox Triage — [Day], [Month Date] ([Run Label])

Sections (in order):

  1. Overview — 2–3 sentences. What happened? Anything urgent?
  2. Stats — Counts: processed, drafts created, action needed, skipped.
  3. Action Needed — Overdue items, decisions, drafts to review, deadlines.
  4. Quick Reference — One line per email, alphabetical by sender. **Sender** — one-sentence summary + recommendation.
  5. Detailed Cards — Opportunities, active threads, flags. Each: sender / subject / category, recommendation + reasoning, key context. NO draft text previews (drafts are already in email client for user to read there).
  6. Footer — Generation timestamp + KB update summary.

Formatting (if HTML):

  • Inline CSS only (Gmail strips <style>)
  • Color-coded by recommendation:
    • green → TAKE IT
    • amber → WORTH CONSIDERING
    • red → PASS
    • purple → FLAG FOR REVIEW
    • blue → active conversation

Step 8: Knowledge Base Update

blocklist.md (append new):

  • New declined senders + reason + date
  • New decline patterns from observed behavior (e.g., "all emails containing 'looking for backend engineers' from gmail addresses → cold recruiter pattern")
  • Remove entries if user has overridden them (user replied to a "blocked" sender → unblock)

tracker.md (append + update):

  • New follow-ups for emails needing future action
  • Update existing follow-ups (deadline changed, status changed)
  • Mark resolved items complete
  • Flag overdue items
  • Remove resolved items older than 30 days
  • Add entry to update log

Learning patterns to observe over runs:

  • Drafts sent as-is vs. edited vs. deleted → tone calibration signal
  • PASS recommendations user overrides → framework adjustment signal
  • Engaged vs. ignored emails → taxonomy refinement signal
  • New decline patterns → blocklist additions

After 5+ runs, suggest KB improvements to user (e.g., "You always decline emails from X — add as auto-skip?").

Step 9: Internal Log

Save to ${WORKSPACE}/Email/triage-log/[YYYY-MM-DD]-[run-label].md:

  • Emails processed with classifications
  • Recommendations made
  • Drafts created (with IDs / thread refs)
  • KB updates made
  • Follow-ups added / resolved
  • Notable observations (patterns surfaced, edge cases handled)

The log is the audit trail for scripts/draft_safety_validator.py to scan for send operations post-run.

Step 10: Empty Inbox Handling

Even with zero new emails:

  1. Check tracker.md for items due today or overdue
  2. Generate minimal report: "No new actionable emails since last run"
  3. Flag any overdue items
  4. Escalate per tracker rules

Skip Steps 3–6 entirely on empty inbox.

Critical Rules (Stated Multiple Times)

  1. DRAFTS ONLY — NEVER SEND. Non-negotiable. Stated again here.
  2. Privacy. No passwords / credentials in KB. Reference threads by ID for sensitive content.
  3. Accuracy over speed. When unsure, flag for review. A wrong auto-draft is worse than no draft.
  4. Respect the KB. Documented preferences are source of truth. Don't override with judgment.
  5. Transparency. Note every KB change in the triage log.
  6. First runs need oversight. Document this expectation for the user.

Error Handling

Situation Behavior
KB files missing Halt; direct user to run inbox-setup
Email tool unavailable Halt with clear message about required tool
Web search unavailable for sender research Skip research step; note senders not researched
Draft creation fails Skip that draft; note in log; report continues
Report delivery fails Save report to file as fallback; notify user
User has 100+ new emails Stay within reasonable limits; flag volume; offer to focus on priority categories only
Sender appears in both blocklist and tracker Tracker wins (active conversation); note inconsistency in log

Portability

  • Claude Code CLI: Native — uses Gmail / Outlook MCP, file tools for KB, web search for research.
  • Claude.ai web: Works when email MCP connector is connected (Gmail MCP available). Skill must check tool availability before assuming. If no email tool: halt with clear message.

Tooling

Script Role
scripts/kb_reader.py Reads + validates the 7-file KB. Returns parsed structure. Halts with explicit error if required files missing.
scripts/search_window_calculator.py Computes window_start from cadence + current time. Returns run_label. Honors Q1 override.
scripts/draft_safety_validator.py Post-run scan of the action log for any send-shaped tool call. FAILs if detected. The deterministic enforcement of the NEVER-SEND rule.

References

Anti-Patterns To Reject

  • Sending emails (drafts only — non-negotiable)
  • Operating without knowledge base files
  • Storing passwords / credentials in KB
  • Skipping the learning loop (KB updates) at end of run
  • Overriding user's documented preferences with own judgment
  • Reading lowest-priority threads (waste of context)
  • Including draft text previews in report (drafts are already in email client)
  • Provider lock-in without adapter pattern
  • Silently failing on missing tools

Version: 1.0.0 Source spec: megaprompts/07-inbox-triage-megaprompt.md (maintainer-local draft spec — gitignored, not present in the public repository) Build pattern: Path B (direct conversion). Paired with inbox-setup.

1---
2name: inbox-triage
3description: "Runs a full inbox triage using the knowledge base created by the 'inbox-setup' skill. Light-intake by design (most invocations skip questions and run with KB-default preferences); asks at most 2 grill-me override questions when invocation is outside normal cadence or includes category-skip intent. Searches recent emails, classifies them via the user's taxonomy, researches new senders, generates recommendations, drafts replies (NEVER sends), delivers a report in the user's preferred format, and updates the knowledge base with learnings. Designed to run on a recurring schedule (1-3x daily) or on demand. Use when the user wants their inbox processed, in any variation (e.g., 'triage my inbox', 'inbox triage', 'check my email', 'run email triage', 'process my inbox', 'what's new in my email', 'handle my email', 'email triage'). Requires the inbox-setup skill to have been run first."
4license: MIT
5metadata:
6 source_spec: "megaprompts/07-inbox-triage-megaprompt.md"
7 build_pattern: "Path B (direct conversion)"
8 paired_with: "inbox-setup (consumes the 7-file KB it produces)"
9 version: 1.0.0
10---
11 
12# Inbox-Triage — Recurring Email Triage
13 
14> **Paired with `inbox-setup`.** This skill consumes the 7-file knowledge base that `inbox-setup` writes at `${WORKSPACE}/Email/`. The file contracts MUST match exactly. See [`references/kb_file_contract.md`](references/kb_file_contract.md) — this is the mirror of the setup-side contract, viewed from the read side.
15 
16Run on a recurring schedule (1–3x daily) or on demand. Classify recent emails, research new senders, generate decision recommendations, draft replies (**NEVER SEND**), deliver a clean report, and update the knowledge base with what was learned this run.
17 
18## Invocation Triggers
19 
20- "triage my inbox"
21- "inbox triage"
22- "check my email"
23- "run email triage"
24- "process my inbox"
25- "what's new in my email"
26- "handle my email"
27- "email triage"
28 
29## Prerequisites
30 
31Required reads at start (fail-fast if missing):
32 
33**Core (required):**
34- `${WORKSPACE}/Email/email-taxonomy.md` — classification + report preferences
35- `${WORKSPACE}/Email/email-patterns.md` — voice, persona, templates, hard rules
36 
37**Optional core (read if exists):**
38- `${WORKSPACE}/Email/evaluation-framework.md`
39- `${WORKSPACE}/Email/rate-card.md`
40 
41**Evolving (read AND update every run):**
42- `${WORKSPACE}/Email/blocklist.md`
43- `${WORKSPACE}/Email/tracker.md`
44 
45**Output:**
46- `${WORKSPACE}/Email/triage-log/<YYYY-MM-DD>-<run-label>.md` — per-run log
47 
48If any core required file is missing → **halt**, direct user to run `inbox-setup` first. Use `scripts/kb_reader.py` to perform the read + validation.
49 
50## DRAFTS ONLY — Never Send
51 
52> **This skill creates drafts. It NEVER sends.**
53 
54This is the safety property that makes the skill safe to run automatically. Stated multiple times in this skill body. Non-negotiable.
55 
56The `scripts/draft_safety_validator.py` enforces it post-run. Any send-shaped tool call in the action log fails validation. See [`references/drafts_only_safety.md`](references/drafts_only_safety.md) for the full discipline canon.
57 
58## Step 0: Grill-Me Intake (Light — 0–2 Optional Override Questions)
59 
60Inbox-triage is **light-intake by design** — it runs on a recurring cadence with preferences pre-baked into the knowledge base from `inbox-setup`. The grill-me discipline here is asking ONLY the override questions that matter THIS run.
61 
62### Q1 (optional, asked only when on-demand run is outside normal cadence)
63 
64> **Override the default 9-hour search window? Pick: yes (specify hours) / no (use default).**
65>
66> *Why I'm asking:* If you're running on-demand outside your normal 2x/day cadence, you may want a wider window (24h after a long break) or narrower (2h for a quick check).
67 
68Skip if cadence is normal.
69 
70### Q2 (optional, asked only when user invokes with category-skip intent)
71 
72> **Skip any categories this run? E.g., "skip newsletters", "skip financial".**
73>
74> *Why I'm asking:* Sometimes you just want to scan opportunities or just want to clear active threads. Category skip narrows the run scope.
75 
76Skip if user gave no category-skip signal.
77 
78**Stop condition:** Max 2 questions. Default invocations skip both questions and run with KB-default preferences. The skill is optimized for fast recurring execution; intake is the exception, not the norm.
79 
80## Step 1: Determine Search Window
81 
82Compute via current date math. Default lookback: **9 hours** (works for 2x/day cadence with slight overlap so emails between runs aren't missed).
83 
84Use `scripts/search_window_calculator.py --cadence <CADENCE> --now <ISO>`:
85 
86```
87now = current_datetime
88window_start = now - 9_hours (default for 2x-daily)
89run_label = "Morning" if now.hour < 12 else "Afternoon" if now.hour < 17 else "Evening"
90```
91 
92Cadence-to-default-window mapping (override via Q1):
93 
94| Cadence (from email-taxonomy.md S1.Q5) | Default window |
95|---|---|
96| once daily | 26h |
97| 2x daily | 9h |
98| 3x daily | 6h |
99| on-demand only | 24h (asks Q1) |
100 
101## Step 2: Email Search
102 
103Two queries (provider-agnostic adapter pattern):
104 
105- **Primary:** Inbox + sent after `window_start`
106- **Secondary:** Starred unread (catch flagged items missed in primary)
107 
108Collect for each email: sender, subject, date, snippet, thread ID, labels.
109 
110Provider adapter mapping:
111 
112| Provider | Tool |
113|---|---|
114| Gmail | Gmail MCP |
115| Outlook / Microsoft 365 | Outlook MCP |
116| IMAP (Fastmail, ProtonMail, etc.) | IMAP MCP if available; halt otherwise |
117| (no email tool available) | Halt with clear message: "No email tool registered for this session." |
118 
119## Step 3: Classification
120 
121Apply the taxonomy from `email-taxonomy.md`. For **lowest-priority** category (newsletters / automation / spam): skip thread reads entirely — context cost not worth it. For everything else: read full thread.
122 
123## Step 4: Sender Research
124 
125For senders not in tracker / blocklist / prior logs:
126 
1271. Check `blocklist.md` → if matched, auto-skip
1282. Check `tracker.md` → if known thread, note existing context
1293. For opportunity senders (per evaluation framework): web search for company legitimacy, social presence, intermediary status
130 
131**Skip research entirely** for: known senders (in tracker), internal email, automated notifications, obvious low-priority.
132 
133## Step 5: Recommendations
134 
135For decision-required emails, apply the framework from `evaluation-framework.md`. Categorize:
136 
137| Category | When | Output |
138|---|---|---|
139| **TAKE IT** | Meets criteria | Recommend engaging; draft reply (Step 6) |
140| **WORTH CONSIDERING** | Has potential, needs user judgment | Surface key context; draft for user to edit |
141| **PASS** | Doesn't meet criteria | Brief "why" (1–3 sentences); draft polite decline |
142| **FLAG FOR REVIEW** | Unusual; needs direct user decision | Surface fully; NO draft (user decides response shape) |
143 
144Each: brief "why", relevant context, pricing/timeline comparison if applicable.
145 
146**Skip Step 5 entirely if no `evaluation-framework.md` exists.**
147 
148See [`references/triage_decision_framework.md`](references/triage_decision_framework.md) for the framework canon.
149 
150## Step 6: Drafts
151 
152For every reasonable reply candidate, create a draft using `email-patterns.md` voice rules.
153 
154**Draft for:** opportunity responses (TAKE IT / WORTH / PASS), active conversations needing reply, action items, important personal emails.
155 
156**Do NOT draft for:**
157- Clearly no-response emails (newsletters, automation, FYI)
158- Threads where user already replied
159- Blocked senders (unless new info changes the calculus)
160 
161**Mechanics:**
162 
163- Draft only in the existing thread when possible (preserves context)
164- Set `to`, `subject` (`Re: [original]`)
165- **NEVER call any send operation. Only create drafts.**
166 
167The draft body MUST honor:
168- Voice register from `email-patterns.md`
169- Forbidden tokens (S3.Q2 pet peeves)
170- Sign-off patterns
171- Persona context
172- Hard rules (S3.Q6 — non-negotiable)
173- Reply length per `email-patterns.md`
174 
175If `evaluation-framework.md` exists, draft tone matches recommendation:
176- TAKE IT → engaged + concrete next step
177- WORTH → curious + 1-2 clarifying questions
178- PASS → polite decline + brief reason (no hedging promises)
179- FLAG → NO draft
180 
181## Step 7: Report Delivery
182 
183Honor user's preference from `email-taxonomy.md` "Report Preferences" section. Default: email draft to self with HTML.
184 
185**Subject:** `Inbox Triage — [Day], [Month Date] ([Run Label])`
186 
187**Sections (in order):**
188 
1891. **Overview** — 2–3 sentences. What happened? Anything urgent?
1902. **Stats** — Counts: processed, drafts created, action needed, skipped.
1913. **Action Needed** — Overdue items, decisions, drafts to review, deadlines.
1924. **Quick Reference** — One line per email, alphabetical by sender. `**Sender** — one-sentence summary + recommendation`.
1935. **Detailed Cards** — Opportunities, active threads, flags. Each: sender / subject / category, recommendation + reasoning, key context. **NO draft text previews** (drafts are already in email client for user to read there).
1946. **Footer** — Generation timestamp + KB update summary.
195 
196**Formatting (if HTML):**
197 
198- **Inline CSS only** (Gmail strips `<style>`)
199- Color-coded by recommendation:
200 - green → TAKE IT
201 - amber → WORTH CONSIDERING
202 - red → PASS
203 - purple → FLAG FOR REVIEW
204 - blue → active conversation
205 
206## Step 8: Knowledge Base Update
207 
208**`blocklist.md`** (append new):
209 
210- New declined senders + reason + date
211- New decline patterns from observed behavior (e.g., "all emails containing 'looking for backend engineers' from gmail addresses → cold recruiter pattern")
212- Remove entries if user has overridden them (user replied to a "blocked" sender → unblock)
213 
214**`tracker.md`** (append + update):
215 
216- New follow-ups for emails needing future action
217- Update existing follow-ups (deadline changed, status changed)
218- Mark resolved items complete
219- Flag overdue items
220- Remove resolved items older than 30 days
221- Add entry to update log
222 
223**Learning patterns to observe over runs:**
224 
225- Drafts sent as-is vs. edited vs. deleted → tone calibration signal
226- PASS recommendations user overrides → framework adjustment signal
227- Engaged vs. ignored emails → taxonomy refinement signal
228- New decline patterns → blocklist additions
229 
230After 5+ runs, suggest KB improvements to user (e.g., "You always decline emails from X — add as auto-skip?").
231 
232## Step 9: Internal Log
233 
234Save to `${WORKSPACE}/Email/triage-log/[YYYY-MM-DD]-[run-label].md`:
235 
236- Emails processed with classifications
237- Recommendations made
238- Drafts created (with IDs / thread refs)
239- KB updates made
240- Follow-ups added / resolved
241- Notable observations (patterns surfaced, edge cases handled)
242 
243The log is the audit trail for `scripts/draft_safety_validator.py` to scan for send operations post-run.
244 
245## Step 10: Empty Inbox Handling
246 
247Even with zero new emails:
248 
2491. Check `tracker.md` for items due today or overdue
2502. Generate minimal report: "No new actionable emails since last run"
2513. Flag any overdue items
2524. Escalate per tracker rules
253 
254Skip Steps 3–6 entirely on empty inbox.
255 
256## Critical Rules (Stated Multiple Times)
257 
2581. **DRAFTS ONLY — NEVER SEND.** Non-negotiable. Stated again here.
2592. **Privacy.** No passwords / credentials in KB. Reference threads by ID for sensitive content.
2603. **Accuracy over speed.** When unsure, flag for review. A wrong auto-draft is worse than no draft.
2614. **Respect the KB.** Documented preferences are source of truth. Don't override with judgment.
2625. **Transparency.** Note every KB change in the triage log.
2636. **First runs need oversight.** Document this expectation for the user.
264 
265## Error Handling
266 
267| Situation | Behavior |
268|---|---|
269| KB files missing | Halt; direct user to run `inbox-setup` |
270| Email tool unavailable | Halt with clear message about required tool |
271| Web search unavailable for sender research | Skip research step; note senders not researched |
272| Draft creation fails | Skip that draft; note in log; report continues |
273| Report delivery fails | Save report to file as fallback; notify user |
274| User has 100+ new emails | Stay within reasonable limits; flag volume; offer to focus on priority categories only |
275| Sender appears in both blocklist and tracker | Tracker wins (active conversation); note inconsistency in log |
276 
277## Portability
278 
279- **Claude Code CLI:** Native — uses Gmail / Outlook MCP, file tools for KB, web search for research.
280- **Claude.ai web:** Works when email MCP connector is connected (Gmail MCP available). Skill must check tool availability before assuming. If no email tool: halt with clear message.
281 
282## Tooling
283 
284| Script | Role |
285|---|---|
286| `scripts/kb_reader.py` | Reads + validates the 7-file KB. Returns parsed structure. Halts with explicit error if required files missing. |
287| `scripts/search_window_calculator.py` | Computes `window_start` from cadence + current time. Returns `run_label`. Honors Q1 override. |
288| `scripts/draft_safety_validator.py` | Post-run scan of the action log for any send-shaped tool call. FAILs if detected. The deterministic enforcement of the NEVER-SEND rule. |
289 
290## References
291 
292- [`references/kb_file_contract.md`](references/kb_file_contract.md) — canonical 7-file contract (read perspective; mirrors `../inbox-setup/references/kb_file_contract.md`)
293- [`references/triage_decision_framework.md`](references/triage_decision_framework.md) — TAKE IT / WORTH / PASS / FLAG taxonomy
294- [`references/drafts_only_safety.md`](references/drafts_only_safety.md) — the NEVER-SEND discipline canon
295 
296## Anti-Patterns To Reject
297 
298- **Sending emails** (drafts only — non-negotiable)
299- Operating without knowledge base files
300- Storing passwords / credentials in KB
301- Skipping the learning loop (KB updates) at end of run
302- Overriding user's documented preferences with own judgment
303- Reading lowest-priority threads (waste of context)
304- Including draft text previews in report (drafts are already in email client)
305- Provider lock-in without adapter pattern
306- Silently failing on missing tools
307 
308---
309 
310**Version:** 1.0.0
311**Source spec:** `megaprompts/07-inbox-triage-megaprompt.md` (maintainer-local draft spec — gitignored, not present in the public repository)
312**Build pattern:** Path B (direct conversion). Paired with `inbox-setup`.
313 

Discussion

Alternatives

Also in Ticket triageSee all 24 in Customer support →
Ticket deflectorReads a forwarded customer email or ticket, pulls order and refund status from a payments connector (PayPal, Square, or Stripe) or Shopify, account history from the CRM, and open tickets from a support desk (Zoho Desk), drafts a tone-matched reply in the owner's writing voice, and can issue a refund through the payments connector with explicit owner approval. With Shopify connected it also runs a proactive order-triage mode that surfaces orders needing attention — unfulfilled past the promised window, payment problems, pending refunds, stuck shipments — and drafts the next action for each before the customer has to ask. Use when the user says "draft a response," "answer this customer," "where's my order, I want a refund," "check my orders," or "anything about to blow up.Business & ops · Apache-2.0Customer Escalation Brief SkillWrite a structured escalation brief for an at-risk customer account. Use when an account has escalated, when a customer is threatening churn, when a P1 customer issue needs executive attention, or when preparing an internal save play. Produces a crisp escalation brief with account context, timeline, root cause, business impact, and a clear resolution plan.Business & ops · MITAmazon Review Intelligence Extractor — 11 Dimensions, 1B+ ReviewsDeep consumer insights from 1B+ pre-analyzed Amazon reviews. Extracts pain points, buying factors, user profiles, usage patterns, and differentiation opportunities across 11 analysis dimensions. Compares review sentiment across competitors and generates listing copy suggestions. Uses up to 11 relevant ZooData endpoints with cross-validation. Use when user asks about: review analysis, customer feedback, pain points, what customers say, review insights, sentiment analysis, consumer insights, product improvements, voice of customer, review comparison, negative reviews, customer complaints, buying factors, user profile. Requires ZOODATA_API_KEY.Sales & ecommerce · MITOnboarding CROWhen the user wants to optimize post-signup onboarding, user activation, first-run experience, or time-to-value. Also use when the user mentions "onboarding flow," "activation rate," "user activation," "first-run experience," "empty states," "onboarding checklCoding · MIT