Skip to content
Development
Skill

/voice-extract

Extracts a user's writing voice from text samples via SICO comparative analysis. Use when building a voice profile for consistent generation.

From plugin
claude-night-market
350200 skills60 agents162 commands1 MCP

Claude Code

$ npx -y skills add athola/claude-night-market --skill voice-extract --agent claude-code

SKILL.md

voice-extract.SKILL.md
name: voice-extract
description: Extracts a user's writing voice from text samples via SICO comparative analysis. Use when building a voice profile for consistent generation.
globs: "**/*.{md,txt}"
alwaysApply: false
category: writing-quality
tags:
- voice
- extraction
- sico
- style-transfer
- writing
tools: []
complexity: high
estimated_tokens: 3200
progressive_loading: true
modules:
- modules/sico-extraction.md
- modules/sample-intake.md
- modules/register-creation.md
- modules/research-basis.md
dependencies:
- scribe:style-learner
- scribe:slop-detector

Voice Extraction Skill

Extract a user's writing voice through SICO comparative analysis.

When NOT To Use

  • Writing text in a profile that already exists (use

`scribe:voice-generate`)

  • Refining a profile from edits (use `scribe:voice-learn`)

Method: Comparative Feature Extraction

Rather than measuring surface metrics, this skill uses SICO Phase 1: feed the model user writing samples alongside its own default output on the same topics. The model describes what the user does differently. This produces voice descriptions that encode implicit structural patterns no metrics can capture.

The papers and reports behind these choices, and what each one changed in the extraction passes, are in `modules/research-basis.md`. Read it before changing what the passes ask for.

Key Principles (from research)

1. **Anonymize samples**: Label as "Sample 1", "Sample 2", etc. Context labels cause the extractor to anchor on content rather than reading a unified voice.

2. **Variety over volume**: 10 samples across different topics beats 20 on the same subject. The extraction needs to see what stays constant when everything else changes.

3. **Casual writing is distinctive**: Reddit comments, slack messages, quick emails. Polished pieces have rough edges edited away, and those edges are where voice lives.

4. **Pressure test for specificity**: If extraction output sounds generic ("uses varied sentence lengths"), run pass 2 and force specificity. Good output reads like followable instructions.

5. **Use Opus or larger for extraction**: Finer-grained feature descriptions, especially for registers where subtle tonal shifts matter. When this session runs Sonnet or Haiku, run Steps 2-4 as one dispatch:

   Agent(general-purpose):
     - model: opus
     - prompt: {Steps 2-4 of this skill, and $PROFILE_DIR/samples}

The subagent writes the baselines too, because Text B must be the extracting model's own default. It sees nothing from this conversation and reads the samples from disk. Sample intake and the user's confirmation stay in this session. On an Opus or Fable session, run the steps inline.

Required Progress Items

1. `voice-extract:samples-collected` - Writing samples gathered 2. `voice-extract:samples-anonymized` - Labels stripped, numbered 3. `voice-extract:baseline-generated` - Claude's default output on same topics 4. `voice-extract:extraction-pass-1` - Broad comparative features 5. `voice-extract:extraction-pass-2` - Pressure test for specificity 6. `voice-extract:profile-written` - extraction.md created

Step 1: Sample Intake

Load: `@modules/sample-intake`

Directory Mode

# Scan for samples
PROFILE_DIR="$HOME/.claude/voice-profiles/{name}"
mkdir -p "$PROFILE_DIR/samples"

# Copy samples from user-provided directory
# Rename to Sample-01.md, Sample-02.md, etc.

Interactive Mode

Present the user with:

Paste your writing sample below (minimum 200 words).
Type END on a new line when done.

Repeat until user says "done collecting" or reaches 10+ samples.

Manifest

Create `manifest.json`:

{
  "profile_name": "{name}",
  "created": "YYYY-MM-DD",
  "samples": [
    {
      "id": "sample-01",
      "original_source": "anonymized",
      "word_count": 450,
      "date_added": "YYYY-MM-DD"
    }
  ],
  "extraction_model": "opus",
  "extraction_date": null,
  "registers": ["default"]
}

Validation

  • Minimum 3 samples
  • Minimum 500 words total
  • Each sample minimum 100 words
  • Variety check: warn if all samples share obvious topic

Step 2: Baseline Generation

For each sample's topic/context, generate Claude's default output on the same subject. This creates the comparison pair.

**Prompt for baseline**:

Write a short piece about [topic extracted from sample].
Use your natural default style. Do not try to match any
particular voice or style. Just write naturally about this
subject in approximately [word_count] words.

Store baselines alongside samples for comparison.

Step 3: SICO Extraction Pass 1

Load: `@modules/sico-extraction`

The core comparative prompt:

I'm going to show you pairs of text. In each pair:
- Text A is written by a specific person
- Text B is your default output on the same topic

Your task: describe what the writer of Text A does
differently from your default style. Focus on:

- Structural patterns (paragraph shapes, section architecture)
- Rhetorical moves (how they build arguments, make transitions)
- Tonal devices (hedging patterns, commitment patterns)
- Sentence-level techniques (clause structure, rhythm)
- Vocabulary tendencies (physical vs abstract language,
  technical vs conversational)
- Distinctive habits (parentheticals, fragments, questions)

Do NOT describe surface metrics (average sentence length,
word count). Describe the voice in terms a writer could
follow. Be specific enough that someone could use your
description to imitate this voice.

[Pairs follow]

Quality Gate

If the extraction output contains any of these generic phrases, reject and re-run with higher specificity demand:

  • "uses varied sentence lengths"
  • "maintains a conversational tone"
  • "balances formal and informal"
  • "engages the reader"
  • "creates a sense of"

Step 4: Extraction Pass 2 (Pressure Test)

Review your feature description. For each characteristic
you identified,
Read more
@athola
Ships withclaude-night-market

A plugin marketplace for Claude Code. Install only the plugins you need to run git workflows, code review, spec-driven development, and autonomous agents from inside your Claude Code session.

350200 skills60 agents1 MCP
Get the whole plugin

Stars on GitHub

Momentum

stars in total
350
Star history of athola/claude-night-market on GitHub, a chart by star-history.com

Other skills on claude-night-market.

More skills from other plugins.

brainstorming
Auto-invoked

brainstorming

You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…

@obra@obraInstall Skill
ask-matt

ask-matt

Ask which skill or flow fits your situation. A router over the skills in this repo.

skills13d309k
@mattpocock@mattpocockInstall Skill
accessibility
Auto-invoked

accessibility

Design, implement, and audit accessible UI to WCAG 2.2 Level AA across Web, iOS, and Android — semantic ARIA roles and labels,…

ecc2w293k
@affaan-m@affaan-mInstall Skill
compiler-commit

compiler-commit

Use when you want to verify compiler changes and commit with the correct convention. Runs tests, lint, and format, then commits…

react4d252k
@facebook@facebookInstall Skill

Questions about voice-extract.

Which coding agents can use voice-extract?
voice-extract installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.