gmail-triage · diff
git:20260410.ac3f2ba to git:20260414.1df46d1
63 added, 43 removed. Audit A to A.
---
name: gmail-triage
description: Use when the user wants to clean up, organize, or triage their Gmail inbox interactively
metadata:
user-invocable: false
type: technique
---
# Gmail Triage
- Interactive workflow for managing Gmail. Gaia analyzes, summarizes, proposes. User decides. Gaia executes. The `gmail-policy` skill governs what operations are allowed.
+ Interactive GTD-inspired state machine for Gmail. Gaia analyzes threads, proposes transitions. User decides. Gaia executes. The `gmail-policy` skill governs allowed operations and label definitions.
- ## Workflow Labels
+ ## State Labels
- Three state labels (defined in gmail-policy):
- - `_gaia/pending` — Staging area. Unprocessed emails during triage. Empties as user works through them.
- - `_gaia/remind` — Flagged as important. Gaia checks when user asks "what's important?"
- - `_gaia/trash` — Soft delete. Accumulates. User reviews when they want. Never actually deleted.
+ Four active states (defined in `gmail-policy`):
+ - `_gaia/action` — user must act
+ - `_gaia/waiting` — user acted, awaiting reply
+ - `_gaia/someday` — interesting, no urgency
+ - `_gaia/pending` — staging (triage backlog)
+ - `_gaia/trash` — soft delete; never truly deleted
No `_gaia/*` label = processed/done.
- ## Session Types
+ ## Thread-Awareness Rule
+ Before presenting ANY labeled email, check the thread: message count, who sent last, when. This determines framing:
+ - "necesitas responder" (user is last)
+ - "esperando desde [date]" (user replied, waiting on them)
+ - "sin actividad hace 2 semanas — ¿hacer seguimiento?" (stale waiting)
+
+ ## Automatic Transitions (no confirmation needed)
+
+ - User replies to an `action` thread → move to `waiting`
+ - New message arrives in a `waiting` thread → move to `action`
+
+ ## Transitions Requiring Confirmation
+
+ - Anything → `trash` or `someday`
+ - Clearing any label (marking done)
+ - `someday` → `action`
+
+ ## Modes
+
+ **Modes 1–5 open with a state summary before their specific work:**
+ "Antes de empezar: N en action, N en waiting, N en someday." Flag `action` items stale >3 days.
+
+ ### 0. Check ("chequea mi mail" / "¿algo nuevo?")
+
+ 1. **Review `_gaia/action`** — present each item with thread framing. Did user already reply? Auto-propose → `waiting`.
+ 2. **Review `_gaia/waiting`** — did the other party respond? Auto-propose → `action`. Stale >1 week → flag.
+ 3. **Review `_gaia/someday`** — count only: "tienes 5 en someday." Detail only if asked.
+ 4. **Scan inbox for new signal** — Financial (large amounts, bills, due dates), personal/important (housing, legal, health), expected reply arrived → propose `action`. Interesting, no urgency → propose `someday`.
+ 5. **Summarize** — overall inbox state in 2-3 sentences.
+
### 1. Full Triage ("organicemos el correo")
- - Scan inbox, group by sender/category, report counts
- - Present top groups: "142 de Lider, 98 de Santa Isabel..."
- - User decides per group → trash/remind/content-label
- - Report progress: "Procesamos 500 de 2000. ¿Seguimos?"
+ Scan inbox, group by sender/category, report counts. Present top groups. User decides per group → trash/action/someday/content-label. Report progress: "Procesamos 500 de 2000. ¿Seguimos?"
+
### 2. Quick Cleanup ("limpiemos algo rápido")
- - Pick easiest batch (highest volume, most repetitive)
- - "340 promos repetidas de retail. ¿Las mando a trash?"
- - One confirmation = hundreds processed. Target: under 2 minutes.
+ Pick easiest batch (highest volume, most repetitive). "340 promos de retail. ¿Las mando a trash?" One confirmation = hundreds processed. Target: under 2 minutes.
+
### 3. Post-Vacation ("acumulé mucho")
- - Move unprocessed to `_gaia/pending`
- - Report: "847 correos: 600 promos, 120 bank, 80 LinkedIn, 47 otros"
- - Work through each category in sessions
- ### 4. What to Remember ("¿qué hay importante?")
- - Check `_gaia/remind`, present summary with context
- - Ask if any can be cleared
+ Move unprocessed to `_gaia/pending`. Report: "847 correos: 600 promos, 120 banco, 80 LinkedIn, 47 otros." Work categories in follow-up modes.
- ### 5. Promotion Analysis ("analiza las promos")
- - Group by sender, identify patterns
- - Flag genuinely interesting vs noise
- - Recommend bulk trash for repetitive senders
+ ### 4. Review ("¿qué tengo pendiente?")
+ Dedicated state review — all three active labels:
+ - `_gaia/action` — stale >3 days? move to waiting/someday/done?
+ - `_gaia/waiting` — any responses arrived? stale >1 week?
+ - `_gaia/someday` — weekly review: promote to action? trash any?
+
+ ### 5. Promo Analysis ("analiza las promos")
+
+ Group by sender, identify patterns. Flag genuinely interesting vs noise. Recommend bulk trash for repetitive senders.
+
## Presentation Format
- Always:
- 1. Group by sender/topic — never list individual emails when there are many
- 2. Show count per group + sample subject
- 3. Flag unusual items ("movimiento de $50K en Bci")
- 4. Propose action: "¿Trash todo el grupo?" or "¿Revisar uno por uno?"
- 5. Max 5-7 groups per interaction
+ Group by sender/topic. Show count + sample subject. Flag unusual items ("movimiento de $50K en Bci"). Propose action per group. Max 5-7 groups per interaction.
## Batch Rules
- - Max 500 emails per API call
- - Always confirm before moving: state count and destination
- - After each batch: "Moved X to trash, Y to remind. Z remaining."
+ - Max 500 emails per API call. Always confirm before moving: state count and destination.
+ - After each batch: "Moví X a trash, Y a action. Z restantes."
- On "todo trash": double-check — "¿Seguro? Son N correos de [sender]."
- ## Progress Tracking
-
- After each session report: messages processed, remaining in pending, cumulative in trash, cumulative in remind.
-
## Anti-Patterns
- - Listing individual emails when hundreds exist — the user drowns in noise and disengages. Group first, detail on request.
- - Moving without explicit confirmation — `removeLabelIds` changes visibility with no undo; trust depends on the user always knowing what happened.
- - Auto-processing `_gaia/trash` — that label is the user's safety net. They review it when they want, not when Gaia decides.
- - Assuming promos are trash — some are genuinely interesting (sale alerts, event invites). Always ask.
- - Too many options at once — decision fatigue kills triage momentum. Max 5-7 groups per round.
+ - Listing individual emails when hundreds exist — group first, detail on request.
+ - Moving without explicit confirmation — `removeLabelIds` changes visibility with no undo.
+ - Auto-processing `_gaia/trash` — it is the user's safety net, not Gaia's to manage.
+ - Assuming promos are trash — some are genuinely interesting. Always ask.
+ - Skipping thread check before presenting — framing without thread state misleads the user.
+ - More than 5-7 groups per round — decision fatigue kills triage momentum.
## Related Skills
- - `gmail-policy` — security rules, label definitions
+ - `gmail-policy` — security rules, label definitions, operation tiers
- `gws-setup` — CLI installation and authentication