plugins/scribe/skills/voice-learn/SKILL.md
Improves a voice profile by learning from manual edits. Use after editing generated text to refine registers and close voice drift over time.
npx skillsauth add athola/claude-night-market voice-learnInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Learn from user edits to improve the voice profile over time.
Every piece flows through three stages:
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.
voice-learn:snapshots-loaded - All three stages readvoice-learn:diff-analyzed - Changes categorizedvoice-learn:accumulator-checked - Prior patterns reviewedvoice-learn:proposals-generated - Updates proposedvoice-learn:user-approved - Changes accepted by userLoad: @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.
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 |
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:
For patterns that reach threshold (3+ instances or 1-2 matching prior accumulator entries with 2+ instances):
## 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}"
Add to accumulator with current instances. Report:
Holding: "{pattern description}" (N instances, need 3+)
If a new pattern contradicts an existing accumulator entry:
Contradiction detected:
- Existing: "{accumulator pattern}"
- New: "{contradicting pattern}"
- Resolution required: user must choose
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.
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
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.
tools
Detect friction signals; graduate patterns into rules. Use for session retrospectives.
testing
Use when you need a diff-derived test plan for an MR — reads the diff, groups changes by area, runs targeted verifications, and proves revert-tests are genuine guards, not dead assertions.
development
Curate the web-capture index. Use when the capture backlog grows, captures sit unprocessed at seedling/pending, or to surface stored research during work.
testing
Probe memory/summary clarity via dual anchor questions: task progress, info gaps. Use when verifying session state or summary before handoff or compression.