Claude-night-market voice-learn

Learn from user's manual edits to improve voice profile over

install
source · Clone the upstream repo
git clone https://github.com/athola/claude-night-market
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/athola/claude-night-market "$T" && mkdir -p ~/.claude/skills && cp -r "$T/plugins/scribe/skills/voice-learn" ~/.claude/skills/athola-claude-night-market-voice-learn && rm -rf "$T"
manifest: plugins/scribe/skills/voice-learn/SKILL.md
source content

Voice Learning Skill

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

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 TodoWrite 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.

Step 2: Diff Analysis

Load:

@modules/pattern-analysis

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

CategoryExample
Tone adjustmentSoftened a claim, added hedge
Voice insertionAdded parenthetical, aside, humor
Structure changeBroke paragraph, reordered
Precision editReplaced vague with specific
DeletionRemoved fluff or decoration
AdditionAdded 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-edit.md

The post-edit snapshot is captured when the user runs

/voice-learn
after finishing their manual edits.

Exit Criteria

  • Snapshots loaded and compared
  • Changes categorized
  • Accumulator checked and updated
  • Proposals generated for threshold patterns
  • User approved/rejected proposals
  • Approved changes applied to profile files
  • Stale accumulator entries pruned