From escc
Mailbox-operator sub-workflow — resolve send-from account, read thread before composing, draft with provenance, verify Sent. Trigger: 'which account do I send from', 'did that email go out'. Auto-triggers.
How this skill is triggered — by the user, by Claude, or both
Slash command
/escc:email-outbound-opsThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
_Adapted from ECC's `email-ops` (MIT, (c) Affaan Mustafa). See LICENSE._
Adapted from ECC's email-ops (MIT, (c) Affaan Mustafa). See LICENSE.
The mailbox-operator workflow for sales email. This skill is the execution layer
beneath drafting skills: it resolves the correct sending account, reads the
thread before composing, produces a labeled draft, and verifies what actually
landed in Sent. It does not own message strategy or personalization — those
belong to cold-outreach, reply-handling, and follow-up-ops.
Gmail is draft-only by construction. This skill never instructs a live send.
The pre:outbound-send-gate hook (fail-closed) controls all live delivery — and,
since v1.1.0, the draft itself is gated: creating a draft requires a
per-recipient approval token, written only after the four outbound gates pass (see
Step 4b). The skill produces a draft; the gate, with a recorded approval, allows it.
Governing rules:
rules/common/outbound-compliance.md(sender identity, suppression, unsubscribe),rules/common/messaging-style.md(length, CTA, format),rules/common/security.md(identity separation — do not share sender credentials or swap accounts casually).
Activate this skill when:
cold-outreach, reply-handling, or
follow-up-ops and needs to be placed into the correct Gmail draft folder.inbox-triage for that.Do not activate for:
cold-outreach).reply-handling).opt-out-handling).Choosing the wrong sending account is a deliverability and identity risk.
rules/common/security.md requires identity separation — do not swap accounts
casually, and do not share credentials across personas.
Selection logic (apply in order):
@company.example) for all prospect-facing
outbound. Personal or alias domains are not permitted for commercial outreach.Never use a shared "sales@" alias for a personal reply thread, and never send from an account that does not own the prior thread.
Before any drafting or sending action, establish:
If any of these cannot be resolved, surface the ambiguity and wait for rep input. Do not proceed on assumptions about recipient or account.
Iron rule: read before you write. A reply that re-pitches a point already made, or misses an open question, damages the rep's credibility.
If replying to an existing thread:
If creating a new outbound (not a reply):
account-memory / crm-operator (read).crm-operator suppression check, read).
If suppressed: stop, log the block, do not draft.Before writing a single word of copy, load the [VOICE PROFILE] owned by
brand-voice. All outbound copy must match the voice profile. Do not invent
a style or tone. If the calling skill has already applied the voice profile to
the draft it passes in, validate that the draft is consistent before placing it.
When composing to an account with prior correspondence, also build or refresh
its per-account voice overlay from the buyer side of the thread
(escc voice account "<account>" --input '{"texts":[...]}', buyer messages
only) and layer it (escc voice show "<account>") on the rep base profile — see
brand-voice §Per-Account Voice Overlay. STYLE only: it mirrors the account's
register and recurring words, never their claims or numbers; every fact still
comes from approved product-knowledge.
Cite rules/common/messaging-style.md for structural rules: length limits,
one-CTA requirement, banned soft closes, subject-line constraints.
Produce the draft with explicit labeling:
MAIL SURFACE
Account: [[email protected]]
Recipient: [[email protected]]
Thread: [new / reply to: <subject>]
Action: draft
DRAFT
From: [[email protected]]
To: [[email protected]]
Subject: [subject line]
Body:
[message body — voice profile applied]
[Compliance block — required on all commercial messages:]
[Rep Name] | [Title] | [Company]
[Physical/postal business address]
Unsubscribe: [link]
STATUS
drafted — not sent
Send gate controls delivery. No live send from this skill.
NEXT STEP
[Proposed: hand to outbound-send-gate for review / log activity via crm-operator]
The compliance block — sender identity + physical address + unsubscribe link —
is required on every commercial message per rules/common/outbound-compliance.md.
Do not omit it. Do not embed it in a PS that is easy to miss.
A draft is the artifact a human then sends, so it is gated: the
pre:outbound-send-gate hook blocks create_draft (and any send) until a
per-recipient approval token exists. Since ADR-0020 the token is written
only after BOTH the four outbound gates pass AND the adversarial reviewer approves
— the reviewer is part of the path, not an optional extra:
Gather the contact's records — recent notes/calls, lead_status, open deals,
lifecycle, prior engagement (crm-operator / account-memory, read-only).
Run the adversarial outbound-reviewer on the draft (read-only; the >80%-
confidence gate over personalization evidence, compliance, fabrication, voice,
one CTA). Capture its verdict (clean / approved) and confidence — a clean
review is a valid review.
Approve, passing the reviewer's verdict so the token records it:
node "$CLAUDE_PLUGIN_ROOT/scripts/escc.js" outbound approve --input draft.json \
--review-verdict approved --review-confidence 0.9 --reviewer outbound-reviewer
draft.json = { "draft": {to,subject,body}, "records": {...} } (the review can
instead live in the JSON as "review": {"verdict":"approved","confidence":0.9}).
On a clean pass the token is recorded and the draft clears the send-gate.
On a BLOCK the gates or the reviewer say why (timing/do-not-contact,
claim-vs-record, WIIFM, contactability, or a review finding). Fix the draft and
re-review — or, for an explicit, logged exception, add --override "<reason>".
Default is block; never silently send around a gate or skip the reviewer. See
rules/common/outbound-gates.md.
When the rep asks "did that go out?" or "show me what is in Sent":
After a draft is placed (or a send is verified):
crm-operator: sender, recipient,
subject, status (drafted / sent / blocked), timestamp.crm-operator.MAIL SURFACE
account | thread/recipient | action
DRAFT
subject | body | compliance block
STATUS
drafted / sent / blocked / not found / awaiting verification
[Sent-folder proof if status = sent]
NEXT STEP
send / follow up / log via crm-operator / archive
New outbound draft — SDR to AE handoff follow-through:
Task: SDR needs to send a follow-up to booked meeting confirmation.
Account: [email protected] (SDR's own mailbox — new outbound, not a reply).
Recipient: [email protected] — not suppressed (crm-operator check: clean).
Thread read: no prior thread from this account with [email protected].
Voice profile: loaded from brand-voice.
DRAFT
From: [email protected]
To: [email protected]
Subject: Thursday's call — agenda and dial-in
Hi Marcus,
Looking forward to Thursday at 10am. Here's the Zoom link and a
quick agenda for the 30 minutes: [link] [agenda items].
Let me know if anything changes.
[SDR Name] | SDR | [Company]
[Address]
Unsubscribe: [link]
STATUS: drafted — not sent.
NEXT STEP: hand to outbound-send-gate for rep review and delivery.
crm-operator: propose activity log "Meeting confirmation sent to Marcus, BigCo".
Send verification request:
Rep asks: "Did the Globex proposal email go out yesterday?"
Sent-folder query: search [email protected], [email protected],
subject contains "proposal", date=2026-06-15.
Tool result: message found in Sent, timestamp 2026-06-15 14:32 AEDT.
STATUS: sent — confirmed in Sent folder by tool result (2026-06-15 14:32 AEDT).
Send verification — not found:
Rep asks: "Did the breakup email to [email protected] send?"
Sent-folder query: no message found matching that recipient in Sent.
Drafts query: message found in Drafts.
STATUS: drafted — message is in Drafts, not yet sent.
Note: the outbound-send-gate did not record approval — draft is pending review.
NEXT STEP: rep to review draft and approve via send gate, or discard.
Sender account ambiguity — stop and surface:
Task: reply to [email protected] — thread started by previous SDR (former employee).
Problem: the thread account ([email protected]) no longer exists.
Stop: cannot reply from a decommissioned account. Surfacing to rep:
"The prior thread used [email protected] which is inactive. Options:
(a) Start a fresh thread from your account, referencing the prior conversation.
(b) Ask your manager whether the contact should be re-assigned.
Do not proceed until account is resolved."
outbound-compliance.md and should not be handed to
the send gate.crm-operator. This skill proposes log entries; it does not execute them.rules/common/security.md identity separation requirements.inbox-triage — upstream: classifies inbound messages before this skill
handles outbound replies.reply-handling — upstream: determines disposition and calls this skill for
execution once reply strategy is decided.cold-outreach — upstream: owns personalization and quality gate; hands
finished draft body here for mailbox placement.follow-up-ops — upstream: owns follow-up strategy; hands draft here for
placement.opt-out-handling — parallel: handles suppression requests; this skill
never drafts replies to opt-outs.brand-voice — owns the [VOICE PROFILE] applied to all copy.crm-operator — sole write-capable agent; receives all proposed activity
log and task entries.outbound-reviewer — receives drafts for confidence review before send gate.rules/common/outbound-compliance.md — sender identity, suppression,
unsubscribe requirements.rules/common/messaging-style.md — length, CTA, format rules.rules/common/security.md — identity separation, sender account hygiene.npx claudepluginhub aura-farming/escc --plugin esccGuides completion of development work by verifying tests, detecting environment, and presenting structured options for merge, PR, or cleanup.
Enforces test-driven development: write failing test first, then minimal code to pass. Use when implementing features or bugfixes.
Guides creation and editing of skills using test-driven development with pressure scenarios and subagents to verify agent compliance.