Night Market Skill — ported from claude-night-market/scribe. For the full experience with agents, hooks, and commands, install the Claude Code plugin.
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
bash
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:
CategoryExampleTone adjustmentSoftened a claim, added hedgeVoice insertionAdded parenthetical, aside, humorStructure changeBroke paragraph, reorderedPrecision editReplaced vague with specificDeletionRemoved fluff or decorationAdditionAdded context, example, anchor
Read learning/accumulator.json:
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):
markdown
## 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:
text
Holding: "{pattern description}" (N instances, need 3+)
If a new pattern contradicts an existing accumulator entry:
text
Contradiction detected:
- Existing: "{accumulator pattern}"
- New: "{contradicting pattern}"
- Resolution required: user must choose
Present proposals to user:
text
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:
bash
# Remove patterns older than threshold with < 3 instances
The learning system captures snapshots automatically when voice-review completes. Snapshot naming:
text
{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.