claude/skills/penpal/SKILL.md
Draft emails in Aditya Kendre's personal voice. The voice is not monolithic — it shifts across five recipient registers (legal, recruiter, tech-company, personal, HR/service), each with distinct length, signoff, and formality. Use when the user asks to "write/draft an email", "reply to [person]", "email [person] about [topic]", "follow up with", "send a note to", or invokes "penpal". Produces a draft only — does NOT send. Calibrated on a 100-email corpus of sent mail.
npx skillsauth add kendreaditya/.config penpalInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Draft email in Aditya's voice. Output the draft; do not send.
references/exemplars.md.gog gmail send.| Register | Who | Median words | Greeting | Signoff (first contact) | Key markers |
|---|---|---|---|---|---|
| Legal | attorneys, law firms | ~110 | Hi Name, own line | Thank you,\nAditya Kendre\[email protected] | numbered attachment lists, no !, no emoji, Please find attached: |
| Recruiter | recruiters, talent, cold tech outbound | ~79 | Hi Name, own line | Best,\nAditya or Thanks,\nAditya (both valid) | Sorry for the {slow/late/delayed/long} reply! opener, specific compliment + em-dash pivot to what does the process look like? |
| Tech company / peer engineer | engineers, PMs, founders | ~75 | Hi Name, own line (or Hey Name,) | Best,\nAditya | blunt, pre-emptively answers location/visa/scheduling, Yep-level casual allowed |
| Personal | friends, family, community members | ~103 | Hi {Name}, or Hey {Name}, — both equally valid; do NOT default to Hey | Thanks!\nAditya or bare Aditya | exclamation points, narrative lead-in, emoji OK (rare), no last name |
| HR / Meta / service / form | former-employer HR, insurance, apartment, IT | ~56 | Hi Name, or bare Hi, (when recipient is a generic team/bot) | Thank you,\nAditya Kendre\n[employee ID or phone] | bureaucratic formality, bulleted asks, typos left uncorrected, no contractions |
Signoff degrades as thread depth increases. First contact = full signoff block per the table. Reply 2–3 = shorter (Best, Aditya even for legal). Mid-thread (4+ exchanges) = bare Aditya or no signoff at all. Calibration from corpus: legal mid-thread GT signs Aditya, not the full block. Recruiter quick-ack GT often has no signoff at all. Don't slap the formal block on a one-line ack.
If the user doesn't specify, infer from the recipient's email domain + any thread context provided.
The corpus uses five greeting formats. Pick based on thread state, not register:
Hi Name,\n\n[body] (separate greeting line + blank line). Default. 62% of corpus. Use for any substantive email or first reply to a formal recipient.Hi Name, [body starts same line] (inline). 20% of corpus. Use for casual follow-ups, bumps, quick scheduling replies when rapport already exists.Hi Name, [single question]? (inline, whole email is one question). Subset of B, use when the email has no content other than the question.Hare Krishna Prabhu, or similar community greeting. Only for that specific devotional context.Works for me, sounds good. My number is 717-622-1281. Format E implies no signoff too — if you skip the greeting, skip Best, Aditya. Don't add terminal periods on fragment answers (Less than 5k not Less than 5k.). More examples from corpus: but its 0.01$ per min (5w, personal), Less than 5k (3w, hr), Sounds good, thank you. (4w, recruiter), That works, thank you! (4w, recruiter), Hi, thank you for the update. (Format E with bare Hi, — used for impersonal HR/ticket recipients).—, never -- or -. Used as (1) date+description connector April 10, 2026 — Official separation date, (2) aside/expansion fabricated after the fact — likely to create a paper trail, (3) the pivot for politeness softening would be open to a chat — what does the process look like?.I'm, here's, don't). In casual register (see below), apostrophes can be dropped (Im, Ill, dont).I in polish register, lowercase i tolerated in casual.Thursday (3/26) 10am to 12pm PST not next week sometime.21% of corpus is "casual register" — the voice shifts for quick mid-thread replies and bumps. Signals of casual register:
i as pronounIm, Ill, dont, Thats, didnt'am definitely interested! (no "I")- hyphen instead of — em-dash (about half of casual GT uses -, not em-dash)thursday, mondayliknedin, disucssing, recenlty)3ish weeks, pretty flexible, pretty regularlylook interesting any JD's to send my way?)thank you so much (warm softener, distinct from clipped Thanks)Anti-polishing rule (load-bearing). When the user's prior message in this thread already used casual register, DON'T polish your draft. Specifically, do NOT:
Im/Thats/dont- with —iam definitely interested! to I'm definitely interested.3ish weeks with 3.5 weeks or 4 weeksthank you so much with ThanksWhen to use casual register: follow-up/bump on an existing thread, scheduling reply, note to someone you already have rapport with, personal/family/community.
When to use polish: first reply, cold outreach, legal, HR, anything substantive, any long email.
Do NOT paraphrase back what the recipient just said. Trust them to remember their own email.
Anti-pattern in casual / mid-thread: opening with Thanks for the breakdown — display/educational is exactly what I'm after, so that works perfectly (re-states recipient's framing). GOOD: Thanks for the detailed breakdown! The extra $25 works. — commit to the answer, skip the re-statement.
Corpus calibration: when GT replies to an email with 5 paragraphs of context, GT's reply is typically the answer to the 1 question and nothing else. Drafts that "acknowledge" the context items add 20–40% length over GT.
When a third party (mutual connection) has introduced you in a thread and the recipient has not yet responded, the bump is minimal. The recipient has all the context they need from the intro email; do NOT re-explain yourself or restate the ask.
Canonical forms:
Hi {Name}, just wanted to follow up :)Hi {Name}, circling back on this :)Hey {Name}, bumping this :)These are 6–10 words total. No substantive ask, no re-intro of who you are, no "would love to connect — happy to swing by an event or grab coffee". The intro email already said all of that. Your bump is just a social ping that the thread is still alive.
ANTI-PATTERN: Adding a re-intro + concrete ask + flexibility statement when the third-party intro already covered all of that. If the bump is over 12 words, you're over-writing it.
Reconnecting with a known contact after >6 months silence is its own pattern, distinct from cold-recruiter outbound. Do not pull cold-recruiter elements into reconnects.
Don't use:
Resume attached.What does the process look like?Sorry for the long silence! (corpus does NOT use this as a reconnect opener)happy to send a resume over if useful, Resume attached if helpful, let me know if you want my resume — these are all cold-recruiter residue. The reconnect is purely social bridge.Use this shape (~60–70 words):
Hi {Name},
Not sure if you remember but I reached out back in {year} when {context — e.g. "I was graduating from Penn State"}. Since then I've been at {current role — single sentence}. Saw the {Role title} role is open and it looks like a great fit. Would love to reconnect if you're still on the recruiting team.
Best,
Aditya
Worked example (2026 reconnect with 2023 contact):
Hi Molly,
Not sure if you remember but I reached out back in 2023 when I was graduating from Penn State. Since then I've been at Meta working on ML training pipelines and ads ranking infrastructure. Saw the Software Engineer, Machine Learning Infrastructure role is open and it looks like a great fit. Would love to reconnect if you're still on the recruiting team.
Best,
Aditya
Why this matters: the reconnect is warm — you have a prior thread. Cold-recruiter padding (Resume attached, what's the process, credentials line) reads as forgetting the relationship. GT keeps it conversational.
Don't introduce future commitments, dates, locations, or actions not present in the source thread.
ill remind you in april (when April was never mentioned by either party)I'll work through the playlist tonight (when no such plan was committed)MPK 14 as a return location (when GT said only "Mar 25th")If the source thread didn't establish a future commitment, your reply doesn't make one up.
When the question is yes/no, a quantity, or a single-value answer, return THAT VALUE ALONE. Don't add greeting framing, don't add follow-up questions on top.
Worked examples:
Less than 5k (not Hi Nikos, looking at less than 5k for now - whats the discount look like at that volume?)Friday works, thanks! or That works, thank you!Hi, thank you for the update. If I remember correctly, I returned it on Mar 25th - so around 3ish weeks ago.1 pm PT on Tue 5/19 works great for me - looking forward to chatting!The temptation is to "add value" by asking the next logical question. Don't. Answer first; let the recipient drive the next exchange.
In a mid-thread reply where you're 2+ exchanges deep with the same person, skip the greeting entirely. Format E (no greeting) is the default for in-flight conversations.
Got it, that clears it up - thank you!\n\nYes please switch both Annual visits to PA... (no Hi Lauren,)I see, this makes more sense - thank you for the clarification!No worries on the delay. To answer your questions:Hi Lauren, every reply in a 4-message thread reads as if you forgot you'd already met.Greetings belong on: first contact, first reply after >2 weeks silence, replies that significantly change topic. Otherwise, skip.
When the email requires a decision (ordering, scheduling, choosing materials, choosing a time), commit to exact values. Don't defer with happy to pick whichever you'd recommend or any [X] near [Y] works.
✗ "For the arrowhead, I'll pick one from your Etsy and send the link over"
✓ "For the arrowhead, I'd love the Black Obsidian Point from your Etsy ($15). That brings the total to $40 before shipping."
✗ "Any Quest location near Harrisburg, PA works"
✓ "Quest Diagnostics - Mechanicsburg (5519 Carlisle Pike, Mechanicsburg, PA 17050)"
✗ "between 9am and 6pm PST works, though I'd prefer afternoon"
✓ "between 9am PST and 6pm PST works for me. Though, I prefer times somewhere between 4pm PST to 6pm PST"
The user IS the decider. Act decisive — pick the specific item, name the specific location, commit to the precise time window with both ends.
Calibrated 2026-05-07 across a 7-email Nuro/Zoox campaign. Aditya's preferred cold-recruiter shape is tighter than the 79-word recruiter median — target 50–65 words. The shape:
Hi {FirstName},
[Action opener — what just happened on his end.]
[ONE credentials line combining parallel-process signal + current role.]
[Recruiter close.]
[Attachment line.]
Best,
Aditya
Worked example (cold, no prior contact):
Hi Vincent,
Just applied to a few data platform / ML infra roles at Nuro and wanted to reach out. I'm currently interviewing at Waymo as well, and working at Meta on data platform and ML infra for ads.
Would be open to a chat. What does the process look like?
Resume attached.
Best,
Aditya
Rules specific to this shape:
I'm currently interviewing at Waymo as well), second clause = current role (and working at Meta on data platform and ML infra for ads). The pairing of (in-process at competitor) + (current employer at scale) is the value claim. Don't pad with metrics in the body — those are on the resume.Would be open to a chat. What does the process look like? over the canonical em-dash version. Honor per-email; do NOT save as global voice rule unless they reinforce it across multiple emails.{Company} Application — Aditya Kendre. Hardcode the company name as a literal in scripts — never compute it from a lowercase form via sed \u& or similar (see the "Bulk sends" section for why).Resume attached. (not My resume is attached. or Please find my resume attached.). One line, no period before "Best".When responding to an OOO with a backup contact named, fold the referral into the action opener:
Hi Colleen,
Hayley's OOO note pointed me to you. Just applied to a few data platform / ML infra roles at Zoox and wanted to reach out. I'm currently interviewing at Waymo as well, and working at Meta on data platform and ML infra for ads.
Would be open to a chat. What does the process look like?
Resume attached.
Best,
Aditya
The "{Person}'s OOO note pointed me to you" sentence is the warmth marker — without it, the Colleen email reads cold. With it, it reads as a polite handoff.
"Just ___" — the signature opener (27+ uses):
Just submitted the [X]. Here's a summary to get you up to speed.Just following up on my email from [date].Just wanted to [reach out / check in / share]...Just circling back on...Just booked a meeting for [time] PST. Looking forward to [X].Apology for lateness — always ends with !, always first-paragraph position. Use only when genuinely late:
Sorry for the late reply!Sorry for the slow reply!Sorry for the delayed response!Sorry for going quiet! / Sorry for going quiet after your last message!Sorry for the long silence!Thanks-for-setup — acknowledges the recipient's work:
Thanks for setting up the [X]. Here's everything I have.Thanks for confirming.No worries on the delay. To answer your questions:Avoid: "I hope this email finds you well", "I wanted to reach out to...", "I am writing to inform you", "Please don't hesitate to..."
Polite asks (canonical forms):
Would you be available for a [consultation / call / chat] [this / next] week?Would [time] work? / Would Monday at 10:30 AM work?Could you please confirm [X]? / Could you share [X]?What does the process look like? (recruiter/opportunity reply)Any chance you could [X]? (casual)Is there anything else you need from me? (formal close)Decline / release counterparty (graceful):
If you don't have capacity for this, I completely understand. Either way, I appreciate the time.Gated yes (condition before commitment):
Once I have a sense of [X], happy to proceed.If you can share [perspective on X], I'd like to proceed with [Y].Pushback via clarification (em-dash pivot):
I also wanted to clarify [X] — on [source A] it sounded like [version A], but on [source B] it sounded like [version B].Stating a red line:
[Preserving the current offer] is my top priority — that's the outcome I most want to avoid.Avoid by default: regrettably, I'm afraid, I'd rather/prefer. These do not appear in the user's voice.
Unfortunately is rare (~1% of corpus) but DOES appear — only as a soft NO opener for scheduling/availability declines: Unfortunately, I don't think im free then - I'm free most weekday mornings.... Acceptable in that narrow context only. Honestly and actually soften pushback elsewhere.
Offer availability — bullet list with timezone, always PST:
I'm free these times:
- Thursday (3/26) 10am to 12pm PST
- Friday (3/27) 10am to 12pm PST
Let me know what works best for you!
Or compact inline: I'm available Wednesday (4/1) after 10:30am PST and Friday (4/3) after 10:30am PST if either works. Happy to work around your schedule too.
Accept: Works for me, sounds good. / Yep, [location] works for me... / Sure sounds good - what time?
Counter-propose: collapse to a single point-time — how does thursday at 1:30 pm sound? / Would Monday at 10:30 AM work?
Confirm booked: Just booked a meeting for 11:30am PST. Looking forward to chatting Monday. — the Looking forward to... line (always with !) is the warmth marker.
Ask for a meeting (initial):
Would love to find a time to chat and hear more about the vision.Would be open to a chat — what does the process look like?Happy to chat with [person] whenever works.Would you be down for a quick call sometime this week or next?Flexibility hedge (once per thread): Happy to work around your schedule too.
Timezone rules: always include. Format is PST (never Pacific, never PT). 10:30am PST (lowercase compact) in casual, 2:00 PM PST (formal caps) in legal/scheduled confirmations.
Use (present in corpus): Thanks, Thank you, Sure, Sounds good, Yep, Yes, Works, No worries, Hope you're doing well!, Looking forward to it!, really (as intensifier: really cool, really interested), actually, interesting, cool, genuinely, excited, wild.
Never use (absent from corpus; default LLM affirmations to avoid): Absolutely, Totally, Perfect, Got it, Noted, Makes sense, Okay/Ok, Yeah, no problem, np, all good.
Distinctive combos: Sure sounds good - what time? as a standalone bigram opener. really cool / sounds really cool as the go-to enthusiasm phrase. Awesome, thank you. appears once — not the default opener.
Mid-email transitions:
Quick summary: — prefacing a compressed fact dumpHere's everything I have. / Here's a summary to get you up to speed.To answer your questions: — replying to a multi-question emailA few things to note: — before a bulleted caveat listAlso, ... — secondary question/point, often its own paragraphPre-signoff closers:
Let me know what works best for you! (scheduling)Let me know if you need anything else or what the next steps are. (after docs/info drop)Resume attached. Would love to chat. (cold outreach)Happy to share [X] if you'd like to take a closer look.Is there anything else you need from me?Looking forward to it! (confirmed meeting)For emails with multiple discrete facts (incident reports, legal intake, offer summaries), use labeled sections ending in a colon followed by hyphen-bulleted lists. Observed labels: Timeline:, The Offer:, Key Context:, Evidence:, Quick summary:, What happened:, Important:, A few things to note:, Links:, Please find attached:, To answer your questions:.
Close with Let me know if you need anything else or what the next steps are. and Thanks,\nAditya.
March 11, 2026 full; April 10 short; Thursday (3/26) for scheduling parens2:00 PM PST formal; 10:30am PST casual; 10am to 12pm PST range; always timezone$40,721.28 exact; $173,000 round; $20K rough717-622-1281 formatted (formal); 7176221281 unformatted (casual reply)(T26001282), quoted material ("you are doing great," "no red flag"), clarifiers (Meta pays 100%), short dates (4/1)1., 2. for enumerated attachments/sequenced itemsSeverance Review — Former Meta Engineer, Signing Deadline April 17 / Full Stack SWE Application — Aditya KendreResume attached. / Both versions are attached. / I've attached [description]. / Please find attached: + numbered list (legal)-- (use real — in polish register; simple - is fine in casual)Best,\nAditya (needs full name + email)Best,\nAditya Kendre\[email protected] (too formal)Absolutely!, Definitely!, Totally!, Perfect!, Got it!)Unfortunately / regrettably / I'd rather — not in the voiceBest, Aditya signoff to a Format E replyLess than 5k. ← wrong; Less than 5k ← correct)Hey for all personal greetings (Hi is just as common)thank you so much, works great for me, 3ish weeks) with clipped variantsIm/Thats, em-dashing simple hyphens, capitalizing lowercase i)references/exemplars.md — 9 real exemplars (short reply, scheduling, cold outreach, incident report, legal summary). Read first to calibrate length.references/patterns.md — frequency tables: greetings, signoffs, Just ___ collocations, sentence openers, hedge words, thanks variants, section labels, subject templates.references/registers.md — detailed per-register playbooks with representative quotes from each category.cat > /tmp/draft.txt <<'EOF'
<draft body>
EOF
gog gmail send --to "[email protected]" --subject "Subject line" --body-file /tmp/draft.txt
# For replies, add --thread-id <threadId> to keep threading
Confirm recipient and subject with user before executing.
When sending to >1 recipient in a batch, never loop all sends in one shot. The sequence is:
gog gmail list "in:sent" | head -3. Eyeball the actual delivered subject + recipient. If the body or attachment is at risk (e.g. computed paths), also fetch the message and verify those.Why: any time the subject, recipient, body, or attachment is computed from a variable rather than a literal, runtime substitution can silently break. Real example (2026-05-07): sed 's/.*/\u&/' to capitalize a company name produced unuro and uzoox in the live subject because BSD sed (macOS default) doesn't support the \u escape. 6 cold recruiter emails went out with broken subjects before the bug was caught.
Anti-patterns specifically:
\u/\U/\l/\L/\E — those are GNU extensions, silently broken on BSD. Don't compute capitalization in sed on macOS. Use awk '{print toupper(substr($0,1,1)) substr($0,2)}', Python .capitalize(), or just hardcode the constant in the source data ("Nuro" not "nuro" → \u&).gog gmail send --dry-run exists — use it during template development.development
Search and read content from leetcode.com — problem catalog, daily challenge, full problem statements with hints and starter code, the Discuss forum (interview experiences, comp posts, layoff threads), and company question-list metadata. Read-only, no auth, no API key. Use when the user wants to look up a LeetCode problem by name/number/slug, see today's daily challenge, search Discuss for interview write-ups at a specific company (Google, Waymo, Meta, Amazon, etc.), browse a tag-filtered discuss feed, read a Discuss post + comments, or check what a LeetCode company list covers. Triggers — "lcsearch", "leetcode search", "search leetcode", "leetcode discuss", "leetcode problem", "daily leetcode", "interview discuss", "what's the leetcode for X", URLs containing leetcode.com/problems/, leetcode.com/discuss/, or leetcode.com/company/. Pair with the `interviewcoder` skill (structured leetcode-style writeups from 1point3acres) and `blind` (anonymous workplace chatter) for the same companies.
development
Terminal Spotify playback/search via spogo (preferred) or spotify_player.
development
Search and read posts from interviewcoder.co — a Next.js-fronted aggregator of technical-interview writeups (largely sourced from 1point3acres) tagged by company, position, stage (Phone Screen / OA / Onsite / etc.), period, job type, and structured leetcode-style questions. Use when the user wants real interview questions for a specific company, recent writeups from a hiring loop, leetcode-style problems with tags and difficulty, or to look up a specific interviewcoder.co URL. Read-only, no auth, no API key. Triggers — "interviewcoder", "interviewcoder.co", "interview questions at [company]", "what's been asked at [company] recently", "interview writeup", and URLs containing interviewcoder.co.
tools
Small Yahoo Finance CLI for ticker info + N-year stock returns. Use when the user asks about: stock price, market cap, sector/industry classification, dividend yield, P/E ratio, beta, 52-week range, N-year stock return, company description for a public company. Triggers: 'yfinance', 'yfin', 'stock price', 'market cap of', 'how much has X stock returned', 'sector for ticker', 'industry classification'. Pairs with the levels-fyi skill for cross-checking public/private status (levels gives ticker, yfin returns live data).