Skip to content
Development
Skill

/voice-learn

Improves a voice profile by learning from manual edits. Use after editing generated text to refine registers and close voice drift over time.

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

Claude Code

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

SKILL.md

voice-learn.SKILL.md
name: voice-learn
description: Improves a voice profile by learning from manual edits. Use after editing generated text to refine registers and close voice drift over time.
globs: "**/*.{md,txt}"
alwaysApply: false
category: writing-quality
tags:
- voice
- learning
- improvement
- feedback
- iteration
tools: []
complexity: high
estimated_tokens: 2000
progressive_loading: true
modules:
- modules/snapshot-management.md
- modules/pattern-analysis.md
dependencies:
- scribe:voice-extract
- scribe:voice-generate
- scribe:voice-review

Voice Learning Skill

Learn from user edits to improve the voice profile over time.

When NOT To Use

  • Building the first profile (use `scribe:voice-extract`)
  • Reviewing text without changing the profile (use

`scribe:voice-review`)

Method: Three-Stage Comparison

Every piece flows through three stages: 1. **Pre-review**: Raw generation output (before review agents) 2. **Post-review**: After user accepts/rejects advisory fixes 3. **Post-edit**: User's manually edited final version

The learning agent compares stages 2 and 3 (post-review vs post-edit) to identify patterns in what the user changed. These patterns inform register and rule updates.

Core Rules

1. **Sharpen, don't add**: Modify existing rules to cover new patterns. Rule bloat degrades output. 2. **Tag specificity**: Register-specific patterns go to registers. Universal patterns go to craft rules or agents. 3. **Flag contradictions**: Opposite patterns across pieces require user resolution. 4. **Evidence threshold**: Patterns need 3+ instances (or 1-2 matching existing accumulator entries) before becoming rules. 5. **Detection surface**: Structural changes increase AI detectability. Craft-level changes are neutral. Prefer craft-level updates. 6. **Rule count check**: Suggest consolidation if any section has 8+ rules.

Required Progress Items

1. `voice-learn:snapshots-loaded` - All three stages read 2. `voice-learn:diff-analyzed` - Changes categorized 3. `voice-learn:accumulator-checked` - Prior patterns reviewed 4. `voice-learn:proposals-generated` - Updates proposed 5. `voice-learn:user-approved` - Changes accepted by user

Step 1: Load Snapshots

Load: `@modules/snapshot-management`

PROFILE_DIR="$HOME/.claude/voice-profiles/{name}"
SNAP_DIR="$PROFILE_DIR/learning/snapshots"

# Find the most recent snapshot set
# Format: {piece-name}-{timestamp}-{stage}.md

Read all three stages for the target piece.

Steps 2-4 need Opus or larger: telling a tone adjustment from a precision edit takes the nuance Sonnet flattens. When this session runs Sonnet or Haiku, run them as one dispatch:

Agent(general-purpose):
  - model: opus
  - prompt: {Steps 2-4 of this skill, the three snapshot paths,
    and learning/accumulator.json}

The subagent sees nothing from this conversation and reads the snapshots from disk. It returns the proposals and does not write the profile. Step 5 approval stays in this session. On an Opus or Fable session, run the steps inline.

Step 2: Diff Analysis

Load: `@modules/pattern-analysis`

Compare post-review vs post-edit. Categorize every change:

| Category | Example | |----------|---------| | Tone adjustment | Softened a claim, added hedge | | Voice insertion | Added parenthetical, aside, humor | | Structure change | Broke paragraph, reordered | | Precision edit | Replaced vague with specific | | Deletion | Removed fluff or decoration | | Addition | Added context, example, anchor |

Step 3: Check Accumulator

Read `learning/accumulator.json`:

{
  "patterns": [
    {
      "id": "pat-001",
      "category": "tone_adjustment",
      "description": "Softens confident claims about tool capabilities",
      "instances": [
        {"piece": "blog-post-1", "date": "2026-04-08", "diff": "..."}
      ],
      "target": "register",
      "status": "accumulating",
      "first_seen": "2026-04-08",
      "last_seen": "2026-04-08"
    }
  ],
  "staleness_threshold_days": 30
}

Match new changes against existing patterns:

  • Semantic similarity (same category + similar description)
  • If match found: merge instance, check if threshold reached
  • If no match: create new accumulator entry

Step 4: Generate Proposals

For patterns that reach threshold (3+ instances or 1-2 matching prior accumulator entries with 2+ instances):

Apply (strong evidence)

## Proposed Update

**Pattern**: {description}
**Target**: {register file or craft-rules.md}
**Evidence**: {N instances across M pieces}

| Piece | Date | Change Made |
|-------|------|-------------|
| ... | ... | ... |

**Proposed edit**:
- File: {path}
- Section: {section name}
- Current: "{current text or 'new addition'}"
- Proposed: "{new text}"

Hold (insufficient evidence)

Add to accumulator with current instances. Report:

Holding: "{pattern description}" (N instances, need 3+)

Contradictions

If a new pattern contradicts an existing accumulator entry:

Contradiction detected:
- Existing: "{accumulator pattern}"
- New: "{contradicting pattern}"
- Resolution required: user must choose

Step 5: User Approval

Present proposals to user:

Learning found N patterns ready to apply:

[1] {pattern}: {proposed change}
    Evidence: {N instances}
    [a]pply / [s]kip / [v]iew evidence?

[2] ...

Apply approved changes to the target files.

Staleness

Patterns in the accumulator expire after `staleness_threshold_days` (default 30). If a pattern hasn't recurred within that window, it was likely a one-off preference rather than a voice trait.

On each learning pass, prune stale entries:

# Remove patterns older than threshold with < 3 instances

Snapshot Capture

The learning system captures snapshots automatically when voice-review completes. Snapshot naming:

{piece-filename}-{YYYYMMDD-HHMMSS}-pre-review.md
{piece-filename}-{YYYYMMDD-HHMMSS}-post-review.md
{piece-filename}-{YYYYMMDD-HHMMSS}-post-ed
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.

skills2w309k
@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…

react5d252k
@facebook@facebookInstall Skill

Questions about voice-learn.

Which coding agents can use voice-learn?
voice-learn 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.