Write AS the user, not as an assistant writing about them. The voice comes from a distilled profile document, never from improvisation.
Files
- Profile:
${CS_SESSIONS_ROOT:-$HOME/.claude-sessions}/.voice/profile.md - Corpus:
${CS_SESSIONS_ROOT:-$HOME/.claude-sessions}/.voice/corpus.md - Builder:
~/.claude/skills/write-as-me/scripts/build-corpus.sh
Flow
- Read the profile. If it exists, go to step 4.
- No profile: run the builder script. If it exits with "nothing to learn from", tell the user exactly that — there are no transcripts to distill on this machine — and stop.
- Distill the corpus into a profile (next section), then continue.
- Infer the register from the request: Chat & comms (Slack, email, DM), Dev artifacts (PR description, review comment, issue reply, commit message), or Long-form (README, announcement, post). If genuinely ambiguous, ask one question.
- Load the profile, draft in the user's voice, deliver the draft for the user to edit and ship. Iterate on feedback. You never send anything — no Slack, no email, no gh commands; the draft is text in the conversation.
- If the profile's Provenance date is older than 30 days, offer a rebuild (re-run the builder, re-distill) AFTER delivering the draft — staleness never blocks a draft.
Distilling the profile
Read the corpus (with offset/limit chunks when it exceeds ~200 KB) and write the profile with exactly these sections:
# Voice profile## Fingerprint— portable traits that survive any register: directness, sentence rhythm and length, vocabulary, how disagreement is voiced, how questions are asked, greeting/sign-off habits (or their absence).## Registers— three subsections:### Chat & comms,### Dev artifacts,### Long-form. Each records a casualness dial (lowercase starts, punctuation weight, contraction use) and typical length. The corpus is coding-chat; extrapolate registers from the fingerprint plus the corpus evidence, and say in the profile which registers are corpus-backed and which are extrapolated.## Phrase bank— verbatim phrases the user actually types (draw from the corpus body and the short-ack frequency appendix).## Languages— languages observed and where they are used.## Anti-patterns— what the user never writes (e.g. corporate pleasantries, exclamation-heavy enthusiasm) — derived from the corpus, not invented.## Provenance— Built date, messages used, files scanned (copy from the corpus stats header).
The profile is a document the user can open and correct by hand; their edits are authoritative on the next draft.
Rules
- The profile is the single source of style truth. Do not apply traits the profile does not record.
- Never fabricate quotes, facts, decisions, or commitments on the user's behalf. A draft may carry placeholders like [date] for facts you lack.
- Typos in the corpus are a described trait; drafts are spelled correctly.
- Never reproduce
[redacted line]markers or anything credential-shaped from the corpus into the profile or a draft. The corpus redactor is a deny-list and cannot catch every shape, so a token that reaches the corpus must stop at you: the profile persists and is reloaded on every draft. - Every draft gets an anti-slop pass before delivery: no em dashes, no throat-clearing openers, no "not X, it's Y" contrasts, no quotable closers that restate the message, no filler adverbs, no three same-length sentences in a row. The profile's Anti-patterns section carries what this user specifically rejects; apply both layers.
- Deliver drafts for the user to edit and send; never send or post anything yourself.