Read-only dry-run designed June 2026 against jloss@steammn.com. Built to be templated
for the CEO's 34K backlog and the wider team. Nothing here has been executed — both
accounts are still read-only.
Prerequisites before ANY action runs
- Spark Pro on the operator's account (you).
- Settings → AI Agents → Spark CLI Access → set account to
triage. - Enable Smart Categories + GateKeeper on each mailbox (in this dry-run most mail came back uncategorized — category-first triage needs these on to work well).
Safety tiers (we roll out in this order, never skip ahead)
- Tier 0 — Dry-run (read-only): list what would be touched. No writes. ✅ done now.
- Tier 1 — Reversible:
archive,attachLabel,markAsSeen,snooze. All undoable. - Tier 2 — Sender rules:
contact-actionreclassify /markContactAsPrimary/blockContact. Affects future mail. - Tier 3 — Destructive:
moveToTrash,unsubscribe,markAsSpam. Only with explicit per-batch sign-off.
The recipe (intent → exact command)
Step 1 — Protect the important people first (so they're never bulk-touched)
# Mark the CEO + key contacts as Primary (auto-prioritized going forward)
spark contact-action markContactAsPrimary teri.wheeler@<domain>
spark contact-action markContactAsPrimary <other VIPs>
Step 2 — Surface what truly needs a human (category-first)
spark emails Inbox --filter "category:priority is:unread" # do first
spark emails Inbox --filter "category:personal is:unread" # real people
spark emails Inbox --filter "category:invitation is:unread" # calendar invites
Step 3 — Bulk-clear the noise (Tier 1, reversible)
# Old notifications/receipts → archive
spark emails Inbox --filter "category:notification older_than:30d" --page-size 2000
spark action archive <ids...>
# Newsletters/marketing older than a week → archive (or label then archive)
spark emails Inbox --filter "category:newsletter older_than:7d" --page-size 2000
spark action archive <ids...>
Step 4 — Tune senders so the noise stops coming back (Tier 2)
# Repeat-offender marketing senders → reclassify or block
spark contact-action changeCategoryNewsletters campaign@<domain>
spark contact-action blockDomain <pure-spam-domain>
spark contact-action groupEmailsFromContact orders@<vendor> # group receipts
Step 5 — New-sender queue (GateKeeper)
spark emails Inbox --new-senders # review unknown senders
spark contact-action acceptContact <good> # or blockContact <bad>
The 34K backlog plan (CEO) — batch processing
The recipe-vacation-catchup pattern, adapted:
1. Snapshot counts by category + older_than:90d (read-only).
2. Bulk-archive ruthless tier: everything older_than:90d in
category:notification and category:newsletter → archive (reversible).
3. Keep a safety net: archive ≠ delete; all of it stays searchable.
4. Surface the keepers: anything category:priority, category:personal, or
from a Primary contact, in the last 90d → leave in inbox for human review.
5. Iterate in batches of ~500, show the plan each batch, confirm, execute.
6. Expected outcome: 34K → a few hundred genuinely-needs-attention, in a few passes.
Operator guardrails (for whoever runs this on the team)
- Always run the
emailslist first, eyeball it, then theaction. - Stay in Tier 1 until the rules are proven on a sample.
- Never point Tier 3 at the CEO's inbox unattended.
- Per-account access: keep sensitive shared inboxes at
read-only.
Live learnings (validated on jloss@steammn.com, June 2 2026)
- Labels must already exist —
action attachLabelapplies a label but cannot create one. Pre-create needed labels in Gmail/Spark first. (On Gmail, "New Folder" in Spark = a Gmail label.) contact-actiononly works on existing contacts — reclassifying a sender that has no contact record fails. For contactless senders, act on the message (action changeCategoryNewsletters <id>) or add the contact first.- Gmail = labels (non-destructive tags); Outlook/365 = folders (one location). The CEO's Outlook inbox will move on filing — prefer archive + categories + pins there over folder-moves, to avoid burying mail.
- Existing reusable labels on jloss@steammn.com: Marketing, Unsubscribed, Waiting, Respond, News, STEAM Portal (new). No need to recreate these.
- Surfacing pattern that works:
action pin+markThreadAsPriorityon[STEAM error]subjects floats failures to the top without moving them.
Status / next action
- ⏳ Waiting on: your Pro upgrade + flipping
jloss@steammn.comtotriage. - Then: I run Step 1–3 as a live, reversible demo on your inbox, you watch, and we lock the recipe before it ever touches the CEO's 34K.