mail-sentinel
Skill14 starsChanged 7 months agoMITView on GitHub
The inbox guardian. Triages every incoming thread, labels what matters, drafts what you'd write, and escalates only when your eyes are actually required. mail-sentinel owns your inbox. It runs on a 15-minute cadence and, on every tick, processes any thread that has arrived or been updated since the last run. For each thread, it decides — using the authority tiers declared in OPERATIONS_CONTEXT.md — whether to act, draft, escalate, or stay silent. When the inbox is empty or fully handled,…
In this repository7 other files it gives its agents.
- audience-echoSkill
- command-maestroSkill
- content-forgeSkill
- dawn-architectSkill
- knowledge-vaultSkill
- mission-ledgerSkill
- network-pulseSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
14 rules. About 0 are common, 4 are distinctive, and 10 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈4
Distinctive · estimate
This author's own choices. Worth a look.
10
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 22
When the inbox is empty or fully handled, it returns HEARTBEAT_OK and writes nothing.
- Distinctive: line 57
If yes → classify the response type:
- Very specific: line 64
If found and not already in workspace/tasks/current.md, append a new task with source link.
- Very specific: line 68
If a slot is already blocked → draft_for_review a polite alternative.
- Very specific: line 69
If all proposed slots are free → draft_for_review a confirmation with the earliest option.
- Very specific: line 70
If the sender is unknown → escalate before agreeing to any calendar time.
- Very specific: line 76
When creating drafts, read ~/.hermes/SOUL.md (if present) to match the owner's voice.
- Distinctive: line 88
Every draft that the owner approves unchanged = +1 confidence for that sender/topic pair.
- Very specific: line 89
Every draft that the owner edits materially = keep in draft_for_review.
- Very specific: line 90
Every escalation that was resolved with a one-word "yes" = candidate for promotion to act.
- Very specific: line 92
After 10 clean approvals on a sender/topic pair, propose to the owner (in the EOD review) that the pair be promoted to act.
- Very specific: line 98
If a full sweep yields no new threads, or all threads land in pure act tier with no ambiguity, the skill writes a single log line and exits:
- Distinctive: line 104
No message reaches the owner.
- Distinctive: line 111
Never: commit to a meeting without calendar confirmation.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
🛡️ Mail Sentinel
The inbox guardian. Triages every incoming thread, labels what matters, drafts what you'd write, and escalates only when your eyes are actually required.
🎯 Mandate
mail-sentinel owns your inbox. It runs on a 15-minute cadence and, on every tick, processes any thread that has arrived or been updated since the last run. For each thread, it decides — using the authority tiers declared in OPERATIONS_CONTEXT.md — whether to act, draft, escalate, or stay silent.
When the inbox is empty or fully handled, it returns HEARTBEAT_OK and writes nothing.
📥 Inputs
- Live inbox state via Gmail/IMAP MCP
- Owner config from
OPERATIONS_CONTEXT.md(authority tiers, VIP list, working hours, voice profile) - Task context from
workspace/tasks/current.md(to avoid creating duplicate tasks)
📤 Outputs
- 🟢 Act tier: direct inbox actions (archive, label, acknowledge receipt, confirm known meetings)
- 🟡 Draft tier: drafts created in Gmail with a
@reviewlabel, notification pushed to escalation channel only if batch ≥ 3 - 🔴 Escalate tier: immediate message to escalation channel with subject, sender, and suggested next step
- 📝 Task creation: appends new items to
workspace/tasks/current.mdwhen a thread implies a commitment
🧭 Decision Procedure
For every thread in scope, walk this checklist in order. Stop at the first match.
Step 1 — Is this thread already resolved?
- Contains "thanks!", "sounds good", or a confirmation emoji with no new ask → archive, done.
- Part of an automated receipt/confirmation sequence → archive + label
receipts, done.
Step 2 — Is this a known low-value sender?
- Newsletter / marketing / automated notification → archive + label according to domain rules.
- Expected bulk sender on the silence list → mark read, done.
Step 3 — Is the sender VIP?
- On the
vip_contactslist inOPERATIONS_CONTEXT.md→ escalate immediately with full thread context, regardless of topic.
Step 4 — Does the thread require a response?
- If yes → classify the response type:
- Confirmation of something already agreed →
acttier: send a one-line confirm, archive. - New commitment, financial topic, legal topic, or stranger →
draft_for_reviewtier: create draft, tag@review. - Ambiguous, high-stakes, or emotional →
escalatetier: ping channel with a clear question.
- Confirmation of something already agreed →
Step 5 — Is there a task implied?
- Scan for action verbs addressed to the owner ("can you send…", "please review…", "follow up with…").
- If found and not already in
workspace/tasks/current.md, append a new task with source link.
Step 6 — Is a meeting proposed?
- Extract proposed times, cross-check
google-calendarMCP, and:- If a slot is already blocked →
draft_for_reviewa polite alternative. - If all proposed slots are free →
draft_for_reviewa confirmation with the earliest option. - If the sender is unknown →
escalatebefore agreeing to any calendar time.
- If a slot is already blocked →
🗣️ Drafting Voice
When creating drafts, read ~/.hermes/SOUL.md (if present) to match the owner's voice. Defaults:
- Warm but concise — no corporate fluff
- Leading with the answer, followed by context
- Sign-offs match the thread's register (formal → "Best regards", casual → first name only)
- Length cap: three short paragraphs unless the topic demands more
🔁 Authority Elasticity
The agent tracks its own judgment over time in workspace/tasks/sentinel-log.md:
- Every draft that the owner approves unchanged = +1 confidence for that sender/topic pair.
- Every draft that the owner edits materially = keep in
draft_for_review. - Every escalation that was resolved with a one-word "yes" = candidate for promotion to
act.
After 10 clean approvals on a sender/topic pair, propose to the owner (in the EOD review) that the pair be promoted to act.
🤐 Silence Contract
If a full sweep yields no new threads, or all threads land in pure act tier with no ambiguity, the skill writes a single log line and exits:
[mail-sentinel] 2026-04-18T09:15:00Z HEARTBEAT_OK processed=12 acted=3 drafted=0 escalated=0No message reaches the owner. The inbox is handled.
⚠️ Hard Never-Dos
- Never send a message on the owner's behalf outside the
acttier. - Never commit to a meeting without calendar confirmation.
- Never share attachments outside the domain without explicit escalation.
- Never reply to obvious phishing — escalate with the full header instead.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

