name: draft-reply description: Draft responses to inbound replies on Technijian outreach threads. Uses the same Name-on-own-line paragraph format as draft-outreach — never a wall of text. Invoke when user says "draft replies for today", "respond to {company}", or after Check-Replies.ps1 has logged new replies. Reads from tracking/replies/{date}.md, writes to templates/replies/{date}/{slug}.md. Human review before send.
Cost note: every LLM call routes through the LiteLLM gateway on the cheapest capable model (CLAUDE.md → Cost Discipline). This is an ops/mechanical skill — for a long run, prefer
/modelSonnet or Haiku; never burn Opus on rote work.
draft-reply
Draft responses to inbound replies captured by scripts/Check-Replies.ps1. This is the companion to draft-outreach — that one handles cold touches, this one handles warm responses to humans who actually replied.
"Asking-for-the-report" replies = DELIVER the report (added 2026-06-08)
The #1 reply type to get right: the CTA offers a free deliverable (AI-Driven Growth Blueprint, or a free network assessment for IT leads, or an SEO+GEO audit for SEO leads — per the lead's offer_type). A reply asking for it is the CONVERSION. The draft must deliver/attach the report and respect any stated preference ("materials first, no call" → do NOT push a meeting; the reply itself starts the dialogue). Stage the reply (with attachment) in the "Tech-Leads Drafts" Outlook folder, NOT the personal Drafts ([[ref_tech_leads_drafts_folder]]). If the report file isn't in content_library/ yet, flag it — the pipeline must hold the deliverable to auto-send. For the IT network-assessment offer, the reply starts the NDA + Network Detective fulfillment (don't put the NDA/install in the reply unless they ask). See [[project_conversion_report_delivery]].
When to invoke
- User says "draft replies for today" / "draft today's replies" / "respond to {company}"
- Right after a Check-Replies run flagged new pending replies
- User opens a specific
tracking/replies/{YYYY-MM-DD}.mdentry and asks for a draft
Do NOT invoke for entries flagged HANDLED, AUTO, or UNSUBSCRIBE.
Input
For each pending reply, you get:
from— sender email addresssubject— reply subject linereceived— timestampsentiment— one of: positive / negative / neutral / curious / unsubscribeconversationId— Graph thread idoriginalTo— address we sent our outreach tobodyPreview— short snippet of the replymatched_service(optional) — if the original lead packet is findable, join against templates/drafts/
If bodyPreview is truncated (Graph caps ~255 chars) and you need the full reply body, ask the user to paste it in — do not invent context.
How to draft per sentiment
positive: they're interested. Respond within hours. Confirm, propose a concrete time ("tomorrow 10am or Thu 2pm?"), do not re-pitch.
curious: they want to know who you are / how you found them. Respond honestly (1-2 sentences): "we run a lead-gen pipeline that flags companies hiring for roles Technijian services overlap with — I saw your {role} posting and had a thought worth sharing. Happy to explain on a 15-min call or walk you through it by email — your call."
neutral: acknowledged-but-no-clear-yes. One short follow-up that names the next step ("Want me to send a one-pager, or worth a 15-min call?") — offer, don't pressure.
negative: they're polite-but-no. Thank them, leave the door open in 90 days. "Thanks for the quick reply — I'll circle back in a quarter in case anything changes." Then add a note to tracking/known-companies.json to suppress for 90 days.
unsubscribe: do NOT draft. Flag for the user to manually remove from all future lists and respond with a one-line acknowledgement. Add to a tracking/suppress.json list (create if missing).
Output
Write to templates/replies/{YYYY-MM-DD}/{company-slug}.md (gitignored). One file per reply.
# Reply to {from} — {subject}
- **Sentiment:** {sentiment}
- **Received:** {received}
- **Matched service:** {matched_service or "unknown"}
- **ConversationId:** `{cid}`
## Original reply (snippet)
> {bodyPreview}
## Draft response
**Subject:** Re: {original subject stripped of Re:/Fwd:}
{body — see paragraph format below}
Also append a one-liner to tracking/replies/{date}.md under each entry: **Draft ready:** templates/replies/{date}/{slug}.md
Body paragraph format — STRICT (matches the outbound rule)
Every reply body renders as:
{first_name},
{paragraph 1 — 1-3 short sentences}
{paragraph 2 — 1-3 short sentences, if needed}
{CTA or closing — 1-2 sentences}
- First name (or "Team") alone on its own line, trailing comma, blank line after.
- Each paragraph separated by a blank line. No wall-of-text.
- Do NOT type a signature or "— Ravi" line — the HTML signature is appended at send time.
- No URL in the body. Booking link lives in the signature.
Word caps by sentiment (counting body only, name-line excluded):
- positive / curious: ≤ 80 words
- neutral: ≤ 70 words
- negative: ≤ 40 words
Principles
- Answer the question they asked. If they asked "who are you?", don't answer with a pitch.
- Match their energy. Short reply → short response. Questions → answers, not deflection.
- Name a concrete next step. Time, format, or tradeoff — not "happy to chat further."
- Never re-pitch to a negative. It burns the 90-day re-engagement option.
- Never promise what Technijian can't do. If the sentiment is "sure, tell me more" but you don't know the matched service's current capacity, flag it in the draft with
[CONFIRM WITH RJAIN].
What this skill does NOT do
- Does not send — replies go out manually per
outreach.mode: draft_only - Does not mark messages read in Outlook — the Check-Replies script is read-only and this skill is too
- Does not modify tracking/replies/_seen.json — that's the script's state
- Does not touch templates/drafts/ (that's outbound cold) — only templates/replies/ (inbound response)
Related
- Check-Replies.ps1 — the daily monitor that feeds this skill
- draft-outreach SKILL.md — outbound cold sibling
- services.yml — look up matched_service for context on pitch/pain