| name | voice-generate |
| description | Generates text in a learned writing voice. Use when drafting content that must match a specific author's style profile extracted by voice-extract. |
| globs | **/*.{md,txt} |
| alwaysApply | false |
| category | writing-quality |
| tags | ["voice","generation","style-transfer","writing","registers"] |
| tools | [] |
| complexity | high |
| model_hint | opus |
| estimated_tokens | 2400 |
| progressive_loading | true |
| modules | ["modules/source-framing.md","modules/register-selection.md","modules/generation-pipeline.md"] |
| dependencies | ["scribe:voice-extract","scribe:slop-detector"] |
Voice Generation Skill
Generate text in a user's extracted writing voice.
When NOT To Use
- No profile exists yet (use
scribe:voice-extract)
- Checking the output for drift (use
scribe:voice-review)
Core Principle: Source Material Framing
The single largest variable in output quality is how source
material is framed in the prompt. Material framed as "raw
notes I'm still thinking through" produces text that feels
like thinking. Material framed as summaries produces reporting.
Always frame user-provided source material as raw notes unless
the user explicitly requests otherwise.
Required TodoWrite Items
voice-generate:profile-loaded - Voice profile read
voice-generate:register-selected - Register chosen
voice-generate:source-framed - Material framed as notes
voice-generate:generated - Text produced
voice-generate:review-dispatched - Sent to review agents
Step 1: Load Voice Profile
PROFILE_DIR="$HOME/.claude/voice-profiles/{name}"
Read in order:
extraction.md - Core voice features
registers/{register}.md - Active register
craft-rules.md - Shared craft techniques (if exists)
banned-phrases.md - Anti-patterns to avoid (if exists)
Check for per-project override:
if [ -f ".voice/override.md" ]; then
fi
Step 2: Register Selection
Load: @modules/register-selection
Select register by:
- Explicit user request ("use casual register")
- Context matching from register metadata
- Default fallback to
registers/default.md
Step 3: Frame Source Material
Load: @modules/source-framing
Default framing (always use unless user overrides):