{"id":"53d22296-1ad2-4bbd-93f3-087c8daa0e43","entityType":"agent","slug":"clawhub-athola-nm-scribe-voice-learn","name":"voice-learn","canonicalUrl":"https://www.xpersona.co/agent/clawhub-athola-nm-scribe-voice-learn","canonicalPath":"/agent/clawhub-athola-nm-scribe-voice-learn","generatedAt":"2026-10-13T05:03:59.472Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-12T01:49:12.724Z","emptyReason":null},"description":"Improves a voice profile by learning from manual edits. Use after editing generated text to refine registers and close voice drift over time Skill: voice-learn Owner: athola Summary: Improves a voice profile by learning from manual edits. Use after editing generated text to refine registers and close voice drift over time Tags: latest:1.9.19 Version history: v1.9.19 | 2026-08-26T13:22:35.086Z | user Release v1.9.19 v1.9.17 | 2026-07-30T05:42:28.143Z | user Release v1.9.17 v1.9.16 | 2026-07-14T19:59:18.245Z | user Release v1.9.16 v1.9.14 | 2026-06-30T18:06","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 959 downloads reported by the source. Last updated 10/12/2026.","installCommand":"clawhub skill install s17emme0e2m3cpf7k2jvp3a84984b8z9:nm-scribe-voice-learn","sourceUrl":"https://clawhub.ai/athola/nm-scribe-voice-learn","homepage":"https://clawhub.ai/athola/skills/nm-scribe-voice-learn","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/athola/nm-scribe-voice-learn","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/athola/skills/nm-scribe-voice-learn","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":60,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Improves a voice profile by learning from manual edits. Use after editing generated text to refine registers and close voice drift over time Skill: voice-learn "},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-12T01:49:12.724Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-12T01:49:12.724Z","emptyReason":null},"stars":null,"forks":null,"downloads":959,"likes":null,"task":null,"library":null,"packageName":null,"latestVersion":"1.9.19","tractionLabel":"959 downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-12T01:49:12.660Z","emptyReason":null},"lastUpdatedAt":"2026-10-12T01:49:12.724Z","lastCrawledAt":"2026-10-12T01:49:12.660Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-13T01:49:12.660Z","lastVerifiedAt":null,"highlights":[{"version":"1.9.19","createdAt":"2026-08-26T13:22:35.086Z","changelog":"Release v1.9.19","fileCount":5,"zipByteSize":6935},{"version":"1.9.17","createdAt":"2026-07-30T05:42:28.143Z","changelog":"Release v1.9.17","fileCount":5,"zipByteSize":6887},{"version":"1.9.16","createdAt":"2026-07-14T19:59:18.245Z","changelog":"Release v1.9.16","fileCount":5,"zipByteSize":6871},{"version":"1.9.14","createdAt":"2026-06-30T18:06:48.670Z","changelog":"Release v1.9.14","fileCount":5,"zipByteSize":6784},{"version":"1.9.13","createdAt":"2026-06-27T16:24:30.532Z","changelog":"Release v1.9.13","fileCount":5,"zipByteSize":7057},{"version":"1.9.12","createdAt":"2026-06-19T03:20:22.006Z","changelog":"Release v1.9.12","fileCount":5,"zipByteSize":7033}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17emme0e2m3cpf7k2jvp3a84984b8z9:nm-scribe-voice-learn","setupComplexity":"low","setupSteps":["Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-athola-nm-scribe-voice-learn/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-athola-nm-scribe-voice-learn/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-athola-nm-scribe-voice-learn/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-athola-nm-scribe-voice-learn/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-athola-nm-scribe-voice-learn/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-athola-nm-scribe-voice-learn/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-13T05:03:59.472Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-athola-nm-scribe-voice-learn/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-athola-nm-scribe-voice-learn/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-athola-nm-scribe-voice-learn/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-athola-nm-scribe-voice-learn/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-12T01:49:12.724Z","emptyReason":null},"readme":"Skill: voice-learn\n\nOwner: athola\n\nSummary: Improves a voice profile by learning from manual edits. Use after editing generated text to refine registers and close voice drift over time\n\nTags: latest:1.9.19\n\nVersion history:\n\nv1.9.19 | 2026-08-26T13:22:35.086Z | user\n\nRelease v1.9.19\n\nv1.9.17 | 2026-07-30T05:42:28.143Z | user\n\nRelease v1.9.17\n\nv1.9.16 | 2026-07-14T19:59:18.245Z | user\n\nRelease v1.9.16\n\nv1.9.14 | 2026-06-30T18:06:48.670Z | user\n\nRelease v1.9.14\n\nv1.9.13 | 2026-06-27T16:24:30.532Z | user\n\nRelease v1.9.13\n\nv1.9.12 | 2026-06-19T03:20:22.006Z | user\n\nRelease v1.9.12\n\nArchive index:\n\nArchive v1.9.19: 5 files, 6935 bytes\n\nFiles: modules/pattern-analysis.md (2795b), modules/snapshot-management.md (1967b), skill-card.md (2215b), SKILL.md (5963b), _meta.json (141b)\n\nFile v1.9.19:SKILL.md\n\n---\nname: voice-learn\ndescription: |\n  Improves a voice profile by learning from manual edits. Use after editing generated text to refine registers and close voice drift over time\nversion: 1.9.8\ntriggers:\n  - voice\n  - learning\n  - improvement\n  - feedback\n  - iteration\nmetadata: {\"openclaw\": {\"homepage\": \"https://github.com/athola/claude-night-market/tree/master/plugins/scribe\", \"emoji\": \"\\u270d\\ufe0f\", \"requires\": {\"config\": [\"night-market.scribe:voice-extract\", \"night-market.scribe:voice-generate\", \"night-market.scribe:voice-review\"]}}}\nsource: claude-night-market\nsource_plugin: scribe\n---\n\n> **Night Market Skill** — ported from [claude-night-market/scribe](https://github.com/athola/claude-night-market/tree/master/plugins/scribe). For the full experience with agents, hooks, and commands, install the Claude Code plugin.\n\n\n# Voice Learning Skill\n\nLearn from user edits to improve the voice profile over time.\n\n## Method: Three-Stage Comparison\n\nEvery piece flows through three stages:\n1. **Pre-review**: Raw generation output (before review agents)\n2. **Post-review**: After user accepts/rejects advisory fixes\n3. **Post-edit**: User's manually edited final version\n\nThe learning agent compares stages 2 and 3 (post-review vs\npost-edit) to identify patterns in what the user changed.\nThese patterns inform register and rule updates.\n\n## Core Rules\n\n1. **Sharpen, don't add**: Modify existing rules to cover new\n   patterns. Rule bloat degrades output.\n2. **Tag specificity**: Register-specific patterns go to\n   registers. Universal patterns go to craft rules or agents.\n3. **Flag contradictions**: Opposite patterns across pieces\n   require user resolution.\n4. **Evidence threshold**: Patterns need 3+ instances (or 1-2\n   matching existing accumulator entries) before becoming rules.\n5. **Detection surface**: Structural changes increase AI\n   detectability. Craft-level changes are neutral. Prefer\n   craft-level updates.\n6. **Rule count check**: Suggest consolidation if any section\n   has 8+ rules.\n\n## Required TodoWrite Items\n\n1. `voice-learn:snapshots-loaded` - All three stages read\n2. `voice-learn:diff-analyzed` - Changes categorized\n3. `voice-learn:accumulator-checked` - Prior patterns reviewed\n4. `voice-learn:proposals-generated` - Updates proposed\n5. `voice-learn:user-approved` - Changes accepted by user\n\n## Step 1: Load Snapshots\n\nLoad: `@modules/snapshot-management`\n\n```bash\nPROFILE_DIR=\"$HOME/.claude/voice-profiles/{name}\"\nSNAP_DIR=\"$PROFILE_DIR/learning/snapshots\"\n\n# Find the most recent snapshot set\n# Format: {piece-name}-{timestamp}-{stage}.md\n```\n\nRead all three stages for the target piece.\n\n## Step 2: Diff Analysis\n\nLoad: `@modules/pattern-analysis`\n\nCompare post-review vs post-edit. Categorize every change:\n\n| Category | Example |\n|----------|---------|\n| Tone adjustment | Softened a claim, added hedge |\n| Voice insertion | Added parenthetical, aside, humor |\n| Structure change | Broke paragraph, reordered |\n| Precision edit | Replaced vague with specific |\n| Deletion | Removed fluff or decoration |\n| Addition | Added context, example, anchor |\n\n## Step 3: Check Accumulator\n\nRead `learning/accumulator.json`:\n\n```json\n{\n  \"patterns\": [\n    {\n      \"id\": \"pat-001\",\n      \"category\": \"tone_adjustment\",\n      \"description\": \"Softens confident claims about tool capabilities\",\n      \"instances\": [\n        {\"piece\": \"blog-post-1\", \"date\": \"2026-04-08\", \"diff\": \"...\"}\n      ],\n      \"target\": \"register\",\n      \"status\": \"accumulating\",\n      \"first_seen\": \"2026-04-08\",\n      \"last_seen\": \"2026-04-08\"\n    }\n  ],\n  \"staleness_threshold_days\": 30\n}\n```\n\nMatch new changes against existing patterns:\n- Semantic similarity (same category + similar description)\n- If match found: merge instance, check if threshold reached\n- If no match: create new accumulator entry\n\n## Step 4: Generate Proposals\n\nFor patterns that reach threshold (3+ instances or 1-2\nmatching prior accumulator entries with 2+ instances):\n\n### Apply (strong evidence)\n\n```markdown\n## Proposed Update\n\n**Pattern**: {description}\n**Target**: {register file or craft-rules.md}\n**Evidence**: {N instances across M pieces}\n\n| Piece | Date | Change Made |\n|-------|------|-------------|\n| ... | ... | ... |\n\n**Proposed edit**:\n- File: {path}\n- Section: {section name}\n- Current: \"{current text or 'new addition'}\"\n- Proposed: \"{new text}\"\n```\n\n### Hold (insufficient evidence)\n\nAdd to accumulator with current instances. Report:\n```\nHolding: \"{pattern description}\" (N instances, need 3+)\n```\n\n### Contradictions\n\nIf a new pattern contradicts an existing accumulator entry:\n```\nContradiction detected:\n- Existing: \"{accumulator pattern}\"\n- New: \"{contradicting pattern}\"\n- Resolution required: user must choose\n```\n\n## Step 5: User Approval\n\nPresent proposals to user:\n```\nLearning found N patterns ready to apply:\n\n[1] {pattern}: {proposed change}\n    Evidence: {N instances}\n    [a]pply / [s]kip / [v]iew evidence?\n\n[2] ...\n```\n\nApply approved changes to the target files.\n\n## Staleness\n\nPatterns in the accumulator expire after `staleness_threshold_days`\n(default 30). If a pattern hasn't recurred within that window,\nit was likely a one-off preference rather than a voice trait.\n\nOn each learning pass, prune stale entries:\n```bash\n# Remove patterns older than threshold with < 3 instances\n```\n\n## Snapshot Capture\n\nThe learning system captures snapshots automatically when\nvoice-review completes. Snapshot naming:\n\n```\n{piece-filename}-{YYYYMMDD-HHMMSS}-pre-review.md\n{piece-filename}-{YYYYMMDD-HHMMSS}-post-review.md\n{piece-filename}-{YYYYMMDD-HHMMSS}-post-edit.md\n```\n\nThe post-edit snapshot is captured when the user runs\n`/voice-learn` after finishing their manual edits.\n\n## Exit Criteria\n\n- Snapshots loaded and compared\n- Changes categorized\n- Accumulator checked and updated\n- Proposals generated for threshold patterns\n- User approved/rejected proposals\n- Approved changes applied to profile files\n- Stale accumulator entries pruned\n\nFile v1.9.19:_meta.json\n\n{\n  \"ownerId\": \"kn7d107jg9jv602h9ytsegydq184a42s\",\n  \"slug\": \"nm-scribe-voice-learn\",\n  \"version\": \"1.9.19\",\n  \"publishedAt\": 1787750555086\n}\n\nFile v1.9.19:modules/pattern-analysis.md\n\n---\nmodule: pattern-analysis\ncategory: voice-learning\ndependencies: [Read, Agent]\nestimated_tokens: 500\n---\n\n# Pattern Analysis Module\n\nAnalyze diffs between post-review and post-edit snapshots\nto extract recurring edit patterns.\n\n## Diff Categories\n\n| Category | Signal | Example |\n|----------|--------|---------|\n| tone_adjustment | Softened/strengthened claims | \"This proves\" -> \"This suggests\" |\n| voice_insertion | Added writer-specific moves | Added parenthetical aside |\n| structure_change | Reordered, split, merged | Broke long paragraph into two |\n| precision_edit | Vague -> specific | \"many people\" -> \"the 12 engineers\" |\n| deletion | Removed fluff | Cut \"It's worth noting that\" |\n| addition | Added context | Added a concrete example |\n| humor_or_irreverence | Added informal voice | Added \"(fuck GPTZero)\" |\n| hedge_or_commit | Changed certainty level | \"will\" -> \"should\" or vice versa |\n\n## Analysis Prompt\n\n```\nCompare these two versions of the same text:\n\nVERSION A (post-review, before manual edits):\n{post_review_text}\n\nVERSION B (post-edit, after manual edits):\n{post_edit_text}\n\nFor each change the writer made:\n1. Identify the specific edit (what changed)\n2. Categorize it (from the categories above)\n3. Describe the pattern (what principle drove this edit?)\n4. Assess specificity: is this a general writing preference\n   or specific to this voice?\n\nFocus on RECURRING patterns, not one-off fixes. If the same\ntype of edit appears 2+ times, that's a voice signal.\n\nOutput as a list of patterns with evidence.\n```\n\n## Pattern Matching Against Accumulator\n\nFor each identified pattern, check the accumulator:\n\n```python\ndef match_pattern(new_pattern, accumulator):\n    \"\"\"Match using category + semantic similarity.\"\"\"\n    for existing in accumulator[\"patterns\"]:\n        if existing[\"category\"] == new_pattern[\"category\"]:\n            # Semantic similarity check (same intent?)\n            if similar_description(existing, new_pattern):\n                return existing  # Merge with this entry\n    return None  # New pattern\n```\n\n## Evidence Requirements\n\n| Action | Threshold |\n|--------|-----------|\n| Apply to register | 3+ instances across 2+ pieces |\n| Apply with accumulator match | 1-2 new and 2 prior instances |\n| Hold in accumulator | 1-2 instances, no prior match |\n| Discard | Contradicts 3+ counter-examples |\n\n## Output Format\n\n```json\n{\n  \"patterns_found\": [\n    {\n      \"category\": \"tone_adjustment\",\n      \"description\": \"Softens confident claims about capabilities\",\n      \"instances\": [\n        {\"line\": 12, \"before\": \"...\", \"after\": \"...\"},\n        {\"line\": 34, \"before\": \"...\", \"after\": \"...\"}\n      ],\n      \"recommendation\": \"apply|hold|discard\",\n      \"target\": \"register|craft-rules|prose-reviewer\",\n      \"proposed_edit\": \"...\"\n    }\n  ]\n}\n```\n\nFile v1.9.19:modules/snapshot-management.md\n\n---\nmodule: snapshot-management\ncategory: voice-learning\ndependencies: [Bash, Write, Read]\nestimated_tokens: 400\n---\n\n# Snapshot Management Module\n\nCapture and organize text snapshots for the learning loop.\n\n## Snapshot Stages\n\n| Stage | When Captured | Purpose |\n|-------|--------------|---------|\n| pre-review | After generation, before review agents | Baseline output |\n| post-review | After user accepts/rejects advisories | Review impact |\n| post-edit | When user runs /voice-learn | Manual edit patterns |\n\n## File Naming\n\n```\n{piece-name}-{YYYYMMDD-HHMMSS}-{stage}.md\n```\n\nExample:\n```\nblog-api-design-20260410-143022-pre-review.md\nblog-api-design-20260410-143022-post-review.md\nblog-api-design-20260410-145511-post-edit.md\n```\n\n## Capture Commands\n\n### Pre-review (automatic)\n\nCalled by voice-generate after producing text:\n```bash\nSNAP_DIR=\"$HOME/.claude/voice-profiles/$PROFILE/learning/snapshots\"\nPIECE_NAME=\"$1\"\nTIMESTAMP=$(date +%Y%m%d-%H%M%S)\ncp \"$OUTPUT_FILE\" \"$SNAP_DIR/${PIECE_NAME}-${TIMESTAMP}-pre-review.md\"\n```\n\n### Post-review (automatic)\n\nCalled by voice-review after user completes advisory decisions:\n```bash\ncp \"$REVIEWED_FILE\" \"$SNAP_DIR/${PIECE_NAME}-${TIMESTAMP}-post-review.md\"\n```\n\n### Post-edit (user-triggered)\n\nUser runs `/voice-learn` after making manual edits:\n```bash\ncp \"$EDITED_FILE\" \"$SNAP_DIR/${PIECE_NAME}-${TIMESTAMP}-post-edit.md\"\n```\n\n## Snapshot Sets\n\nA complete set has all three stages with matching piece-name\nand timestamp prefix. Incomplete sets (missing post-edit) are\nignored by the learning agent until completed.\n\n## Manifest Tracking\n\nUpdate `manifest.json` learning section:\n```json\n{\n  \"learning\": {\n    \"snapshot_count\": 12,\n    \"complete_sets\": 4,\n    \"last_capture\": \"2026-04-10\",\n    \"last_learning_pass\": \"2026-04-09\"\n  }\n}\n```\n\n## Cleanup\n\nSnapshots older than 90 days with completed learning passes\ncan be archived or deleted. The accumulator retains the\npattern evidence independent of raw snapshots.\n\nFile v1.9.19:skill-card.md\n\n## Description:\n\nImproves a voice profile by learning from manual edits to refine registers and close voice drift over time.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[athola](https://clawhub.ai/user/athola)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and writers use this skill after manually editing generated text to compare review-stage and final drafts, extract recurring voice patterns, and propose updates to voice profile rules.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill can persist edited content, review snapshots, and profile changes under a local voice profile directory.\n\nMitigation: Use it only for voice-profile workflows where snapshot retention is acceptable, and avoid sensitive drafts unless local retention has been reviewed.\n\nRisk: Snapshot path handling is under-scoped for piece names used in snapshot commands.\n\nMitigation: Constrain piece names to safe filename characters before any snapshot command runs.\n\nRisk: Learned patterns can introduce incorrect or unwanted voice rules if weak signals are applied too early.\n\nMitigation: Require user approval for proposed updates and keep insufficient evidence in the accumulator until the documented threshold is met.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/athola/skills/nm-scribe-voice-learn)\n- [ClawHub publisher profile](https://clawhub.ai/user/athola)\n- [Scribe plugin homepage](https://github.com/athola/claude-night-market/tree/master/plugins/scribe)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, json, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with JSON pattern summaries and shell command examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May propose edits to local voice profile files after user approval.]\n\n## Skill Version(s):\n\n1.9.19 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.9.17: 5 files, 6887 bytes\n\nFiles: modules/pattern-analysis.md (2795b), modules/snapshot-management.md (1967b), skill-card.md (2182b), SKILL.md (5963b), _meta.json (141b)\n\nFile v1.9.17:SKILL.md\n\n---\nname: voice-learn\ndescription: |\n  Improves a voice profile by learning from manual edits. Use after editing generated text to refine registers and close voice drift over time\nversion: 1.9.8\ntriggers:\n  - voice\n  - learning\n  - improvement\n  - feedback\n  - iteration\nmetadata: {\"openclaw\": {\"homepage\": \"https://github.com/athola/claude-night-market/tree/master/plugins/scribe\", \"emoji\": \"\\u270d\\ufe0f\", \"requires\": {\"config\": [\"night-market.scribe:voice-extract\", \"night-market.scribe:voice-generate\", \"night-market.scribe:voice-review\"]}}}\nsource: claude-night-market\nsource_plugin: scribe\n---\n\n> **Night Market Skill** — ported from [claude-night-market/scribe](https://github.com/athola/claude-night-market/tree/master/plugins/scribe). For the full experience with agents, hooks, and commands, install the Claude Code plugin.\n\n\n# Voice Learning Skill\n\nLearn from user edits to improve the voice profile over time.\n\n## Method: Three-Stage Comparison\n\nEvery piece flows through three stages:\n1. **Pre-review**: Raw generation output (before review agents)\n2. **Post-review**: After user accepts/rejects advisory fixes\n3. **Post-edit**: User's manually edited final version\n\nThe learning agent compares stages 2 and 3 (post-review vs\npost-edit) to identify patterns in what the user changed.\nThese patterns inform register and rule updates.\n\n## Core Rules\n\n1. **Sharpen, don't add**: Modify existing rules to cover new\n   patterns. Rule bloat degrades output.\n2. **Tag specificity**: Register-specific patterns go to\n   registers. Universal patterns go to craft rules or agents.\n3. **Flag contradictions**: Opposite patterns across pieces\n   require user resolution.\n4. **Evidence threshold**: Patterns need 3+ instances (or 1-2\n   matching existing accumulator entries) before becoming rules.\n5. **Detection surface**: Structural changes increase AI\n   detectability. Craft-level changes are neutral. Prefer\n   craft-level updates.\n6. **Rule count check**: Suggest consolidation if any section\n   has 8+ rules.\n\n## Required TodoWrite Items\n\n1. `voice-learn:snapshots-loaded` - All three stages read\n2. `voice-learn:diff-analyzed` - Changes categorized\n3. `voice-learn:accumulator-checked` - Prior patterns reviewed\n4. `voice-learn:proposals-generated` - Updates proposed\n5. `voice-learn:user-approved` - Changes accepted by user\n\n## Step 1: Load Snapshots\n\nLoad: `@modules/snapshot-management`\n\n```bash\nPROFILE_DIR=\"$HOME/.claude/voice-profiles/{name}\"\nSNAP_DIR=\"$PROFILE_DIR/learning/snapshots\"\n\n# Find the most recent snapshot set\n# Format: {piece-name}-{timestamp}-{stage}.md\n```\n\nRead all three stages for the target piece.\n\n## Step 2: Diff Analysis\n\nLoad: `@modules/pattern-analysis`\n\nCompare post-review vs post-edit. Categorize every change:\n\n| Category | Example |\n|----------|---------|\n| Tone adjustment | Softened a claim, added hedge |\n| Voice insertion | Added parenthetical, aside, humor |\n| Structure change | Broke paragraph, reordered |\n| Precision edit | Replaced vague with specific |\n| Deletion | Removed fluff or decoration |\n| Addition | Added context, example, anchor |\n\n## Step 3: Check Accumulator\n\nRead `learning/accumulator.json`:\n\n```json\n{\n  \"patterns\": [\n    {\n      \"id\": \"pat-001\",\n      \"category\": \"tone_adjustment\",\n      \"description\": \"Softens confident claims about tool capabilities\",\n      \"instances\": [\n        {\"piece\": \"blog-post-1\", \"date\": \"2026-04-08\", \"diff\": \"...\"}\n      ],\n      \"target\": \"register\",\n      \"status\": \"accumulating\",\n      \"first_seen\": \"2026-04-08\",\n      \"last_seen\": \"2026-04-08\"\n    }\n  ],\n  \"staleness_threshold_days\": 30\n}\n```\n\nMatch new changes against existing patterns:\n- Semantic similarity (same category + similar description)\n- If match found: merge instance, check if threshold reached\n- If no match: create new accumulator entry\n\n## Step 4: Generate Proposals\n\nFor patterns that reach threshold (3+ instances or 1-2\nmatching prior accumulator entries with 2+ instances):\n\n### Apply (strong evidence)\n\n```markdown\n## Proposed Update\n\n**Pattern**: {description}\n**Target**: {register file or craft-rules.md}\n**Evidence**: {N instances across M pieces}\n\n| Piece | Date | Change Made |\n|-------|------|-------------|\n| ... | ... | ... |\n\n**Proposed edit**:\n- File: {path}\n- Section: {section name}\n- Current: \"{current text or 'new addition'}\"\n- Proposed: \"{new text}\"\n```\n\n### Hold (insufficient evidence)\n\nAdd to accumulator with current instances. Report:\n```\nHolding: \"{pattern description}\" (N instances, need 3+)\n```\n\n### Contradictions\n\nIf a new pattern contradicts an existing accumulator entry:\n```\nContradiction detected:\n- Existing: \"{accumulator pattern}\"\n- New: \"{contradicting pattern}\"\n- Resolution required: user must choose\n```\n\n## Step 5: User Approval\n\nPresent proposals to user:\n```\nLearning found N patterns ready to apply:\n\n[1] {pattern}: {proposed change}\n    Evidence: {N instances}\n    [a]pply / [s]kip / [v]iew evidence?\n\n[2] ...\n```\n\nApply approved changes to the target files.\n\n## Staleness\n\nPatterns in the accumulator expire after `staleness_threshold_days`\n(default 30). If a pattern hasn't recurred within that window,\nit was likely a one-off preference rather than a voice trait.\n\nOn each learning pass, prune stale entries:\n```bash\n# Remove patterns older than threshold with < 3 instances\n```\n\n## Snapshot Capture\n\nThe learning system captures snapshots automatically when\nvoice-review completes. Snapshot naming:\n\n```\n{piece-filename}-{YYYYMMDD-HHMMSS}-pre-review.md\n{piece-filename}-{YYYYMMDD-HHMMSS}-post-review.md\n{piece-filename}-{YYYYMMDD-HHMMSS}-post-edit.md\n```\n\nThe post-edit snapshot is captured when the user runs\n`/voice-learn` after finishing their manual edits.\n\n## Exit Criteria\n\n- Snapshots loaded and compared\n- Changes categorized\n- Accumulator checked and updated\n- Proposals generated for threshold patterns\n- User approved/rejected proposals\n- Approved changes applied to profile files\n- Stale accumulator entries pruned\n\nFile v1.9.17:_meta.json\n\n{\n  \"ownerId\": \"kn7d107jg9jv602h9ytsegydq184a42s\",\n  \"slug\": \"nm-scribe-voice-learn\",\n  \"version\": \"1.9.17\",\n  \"publishedAt\": 1785390148143\n}\n\nFile v1.9.17:modules/pattern-analysis.md\n\n---\nmodule: pattern-analysis\ncategory: voice-learning\ndependencies: [Read, Agent]\nestimated_tokens: 500\n---\n\n# Pattern Analysis Module\n\nAnalyze diffs between post-review and post-edit snapshots\nto extract recurring edit patterns.\n\n## Diff Categories\n\n| Category | Signal | Example |\n|----------|--------|---------|\n| tone_adjustment | Softened/strengthened claims | \"This proves\" -> \"This suggests\" |\n| voice_insertion | Added writer-specific moves | Added parenthetical aside |\n| structure_change | Reordered, split, merged | Broke long paragraph into two |\n| precision_edit | Vague -> specific | \"many people\" -> \"the 12 engineers\" |\n| deletion | Removed fluff | Cut \"It's worth noting that\" |\n| addition | Added context | Added a concrete example |\n| humor_or_irreverence | Added informal voice | Added \"(fuck GPTZero)\" |\n| hedge_or_commit | Changed certainty level | \"will\" -> \"should\" or vice versa |\n\n## Analysis Prompt\n\n```\nCompare these two versions of the same text:\n\nVERSION A (post-review, before manual edits):\n{post_review_text}\n\nVERSION B (post-edit, after manual edits):\n{post_edit_text}\n\nFor each change the writer made:\n1. Identify the specific edit (what changed)\n2. Categorize it (from the categories above)\n3. Describe the pattern (what principle drove this edit?)\n4. Assess specificity: is this a general writing preference\n   or specific to this voice?\n\nFocus on RECURRING patterns, not one-off fixes. If the same\ntype of edit appears 2+ times, that's a voice signal.\n\nOutput as a list of patterns with evidence.\n```\n\n## Pattern Matching Against Accumulator\n\nFor each identified pattern, check the accumulator:\n\n```python\ndef match_pattern(new_pattern, accumulator):\n    \"\"\"Match using category + semantic similarity.\"\"\"\n    for existing in accumulator[\"patterns\"]:\n        if existing[\"category\"] == new_pattern[\"category\"]:\n            # Semantic similarity check (same intent?)\n            if similar_description(existing, new_pattern):\n                return existing  # Merge with this entry\n    return None  # New pattern\n```\n\n## Evidence Requirements\n\n| Action | Threshold |\n|--------|-----------|\n| Apply to register | 3+ instances across 2+ pieces |\n| Apply with accumulator match | 1-2 new and 2 prior instances |\n| Hold in accumulator | 1-2 instances, no prior match |\n| Discard | Contradicts 3+ counter-examples |\n\n## Output Format\n\n```json\n{\n  \"patterns_found\": [\n    {\n      \"category\": \"tone_adjustment\",\n      \"description\": \"Softens confident claims about capabilities\",\n      \"instances\": [\n        {\"line\": 12, \"before\": \"...\", \"after\": \"...\"},\n        {\"line\": 34, \"before\": \"...\", \"after\": \"...\"}\n      ],\n      \"recommendation\": \"apply|hold|discard\",\n      \"target\": \"register|craft-rules|prose-reviewer\",\n      \"proposed_edit\": \"...\"\n    }\n  ]\n}\n```\n\nFile v1.9.17:modules/snapshot-management.md\n\n---\nmodule: snapshot-management\ncategory: voice-learning\ndependencies: [Bash, Write, Read]\nestimated_tokens: 400\n---\n\n# Snapshot Management Module\n\nCapture and organize text snapshots for the learning loop.\n\n## Snapshot Stages\n\n| Stage | When Captured | Purpose |\n|-------|--------------|---------|\n| pre-review | After generation, before review agents | Baseline output |\n| post-review | After user accepts/rejects advisories | Review impact |\n| post-edit | When user runs /voice-learn | Manual edit patterns |\n\n## File Naming\n\n```\n{piece-name}-{YYYYMMDD-HHMMSS}-{stage}.md\n```\n\nExample:\n```\nblog-api-design-20260410-143022-pre-review.md\nblog-api-design-20260410-143022-post-review.md\nblog-api-design-20260410-145511-post-edit.md\n```\n\n## Capture Commands\n\n### Pre-review (automatic)\n\nCalled by voice-generate after producing text:\n```bash\nSNAP_DIR=\"$HOME/.claude/voice-profiles/$PROFILE/learning/snapshots\"\nPIECE_NAME=\"$1\"\nTIMESTAMP=$(date +%Y%m%d-%H%M%S)\ncp \"$OUTPUT_FILE\" \"$SNAP_DIR/${PIECE_NAME}-${TIMESTAMP}-pre-review.md\"\n```\n\n### Post-review (automatic)\n\nCalled by voice-review after user completes advisory decisions:\n```bash\ncp \"$REVIEWED_FILE\" \"$SNAP_DIR/${PIECE_NAME}-${TIMESTAMP}-post-review.md\"\n```\n\n### Post-edit (user-triggered)\n\nUser runs `/voice-learn` after making manual edits:\n```bash\ncp \"$EDITED_FILE\" \"$SNAP_DIR/${PIECE_NAME}-${TIMESTAMP}-post-edit.md\"\n```\n\n## Snapshot Sets\n\nA complete set has all three stages with matching piece-name\nand timestamp prefix. Incomplete sets (missing post-edit) are\nignored by the learning agent until completed.\n\n## Manifest Tracking\n\nUpdate `manifest.json` learning section:\n```json\n{\n  \"learning\": {\n    \"snapshot_count\": 12,\n    \"complete_sets\": 4,\n    \"last_capture\": \"2026-04-10\",\n    \"last_learning_pass\": \"2026-04-09\"\n  }\n}\n```\n\n## Cleanup\n\nSnapshots older than 90 days with completed learning passes\ncan be archived or deleted. The accumulator retains the\npattern evidence independent of raw snapshots.\n\nFile v1.9.17:skill-card.md\n\n## Description: <br>\nImproves a voice profile by learning from manual edits. Use after editing generated text to refine registers and close voice drift over time. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[athola](https://clawhub.ai/user/athola) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and writers use this skill after manually editing generated drafts to compare post-review and post-edit versions, identify recurring voice patterns, and propose profile updates for user approval. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: Generated, reviewed, and manually edited drafts may be retained in a local voice-profile learning directory. <br>\nMitigation: Install only when local retention is acceptable, and periodically review or clean $HOME/.claude/voice-profiles/*/learning when drafts may contain sensitive material. <br>\nRisk: Learning proposals can introduce incorrect, stale, or contradictory voice rules if accepted without review. <br>\nMitigation: Use the skill's evidence thresholds, contradiction checks, and user-approval step before applying profile changes. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/athola/skills/nm-scribe-voice-learn) <br>\n- [Scribe homepage](https://github.com/athola/claude-night-market/tree/master/plugins/scribe) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance] <br>\n**Output Format:** [Markdown with JSON snippets and shell command blocks] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [May propose accumulator entries, register or craft-rule edits, contradiction notices, and cleanup guidance for local voice-profile learning files.] <br>\n\n## Skill Version(s): <br>\n1.9.17 (source: release evidence) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v1.9.16: 5 files, 6871 bytes\n\nFiles: modules/pattern-analysis.md (2795b), modules/snapshot-management.md (1967b), skill-card.md (2094b), SKILL.md (5963b), _meta.json (141b)\n\nFile v1.9.16:SKILL.md\n\n---\nname: voice-learn\ndescription: |\n  Improves a voice profile by learning from manual edits. Use after editing generated text to refine registers and close voice drift over time\nversion: 1.9.8\ntriggers:\n  - voice\n  - learning\n  - improvement\n  - feedback\n  - iteration\nmetadata: {\"openclaw\": {\"homepage\": \"https://github.com/athola/claude-night-market/tree/master/plugins/scribe\", \"emoji\": \"\\u270d\\ufe0f\", \"requires\": {\"config\": [\"night-market.scribe:voice-extract\", \"night-market.scribe:voice-generate\", \"night-market.scribe:voice-review\"]}}}\nsource: claude-night-market\nsource_plugin: scribe\n---\n\n> **Night Market Skill** — ported from [claude-night-market/scribe](https://github.com/athola/claude-night-market/tree/master/plugins/scribe). For the full experience with agents, hooks, and commands, install the Claude Code plugin.\n\n\n# Voice Learning Skill\n\nLearn from user edits to improve the voice profile over time.\n\n## Method: Three-Stage Comparison\n\nEvery piece flows through three stages:\n1. **Pre-review**: Raw generation output (before review agents)\n2. **Post-review**: After user accepts/rejects advisory fixes\n3. **Post-edit**: User's manually edited final version\n\nThe learning agent compares stages 2 and 3 (post-review vs\npost-edit) to identify patterns in what the user changed.\nThese patterns inform register and rule updates.\n\n## Core Rules\n\n1. **Sharpen, don't add**: Modify existing rules to cover new\n   patterns. Rule bloat degrades output.\n2. **Tag specificity**: Register-specific patterns go to\n   registers. Universal patterns go to craft rules or agents.\n3. **Flag contradictions**: Opposite patterns across pieces\n   require user resolution.\n4. **Evidence threshold**: Patterns need 3+ instances (or 1-2\n   matching existing accumulator entries) before becoming rules.\n5. **Detection surface**: Structural changes increase AI\n   detectability. Craft-level changes are neutral. Prefer\n   craft-level updates.\n6. **Rule count check**: Suggest consolidation if any section\n   has 8+ rules.\n\n## Required TodoWrite Items\n\n1. `voice-learn:snapshots-loaded` - All three stages read\n2. `voice-learn:diff-analyzed` - Changes categorized\n3. `voice-learn:accumulator-checked` - Prior patterns reviewed\n4. `voice-learn:proposals-generated` - Updates proposed\n5. `voice-learn:user-approved` - Changes accepted by user\n\n## Step 1: Load Snapshots\n\nLoad: `@modules/snapshot-management`\n\n```bash\nPROFILE_DIR=\"$HOME/.claude/voice-profiles/{name}\"\nSNAP_DIR=\"$PROFILE_DIR/learning/snapshots\"\n\n# Find the most recent snapshot set\n# Format: {piece-name}-{timestamp}-{stage}.md\n```\n\nRead all three stages for the target piece.\n\n## Step 2: Diff Analysis\n\nLoad: `@modules/pattern-analysis`\n\nCompare post-review vs post-edit. Categorize every change:\n\n| Category | Example |\n|----------|---------|\n| Tone adjustment | Softened a claim, added hedge |\n| Voice insertion | Added parenthetical, aside, humor |\n| Structure change | Broke paragraph, reordered |\n| Precision edit | Replaced vague with specific |\n| Deletion | Removed fluff or decoration |\n| Addition | Added context, example, anchor |\n\n## Step 3: Check Accumulator\n\nRead `learning/accumulator.json`:\n\n```json\n{\n  \"patterns\": [\n    {\n      \"id\": \"pat-001\",\n      \"category\": \"tone_adjustment\",\n      \"description\": \"Softens confident claims about tool capabilities\",\n      \"instances\": [\n        {\"piece\": \"blog-post-1\", \"date\": \"2026-04-08\", \"diff\": \"...\"}\n      ],\n      \"target\": \"register\",\n      \"status\": \"accumulating\",\n      \"first_seen\": \"2026-04-08\",\n      \"last_seen\": \"2026-04-08\"\n    }\n  ],\n  \"staleness_threshold_days\": 30\n}\n```\n\nMatch new changes against existing patterns:\n- Semantic similarity (same category + similar description)\n- If match found: merge instance, check if threshold reached\n- If no match: create new accumulator entry\n\n## Step 4: Generate Proposals\n\nFor patterns that reach threshold (3+ instances or 1-2\nmatching prior accumulator entries with 2+ instances):\n\n### Apply (strong evidence)\n\n```markdown\n## Proposed Update\n\n**Pattern**: {description}\n**Target**: {register file or craft-rules.md}\n**Evidence**: {N instances across M pieces}\n\n| Piece | Date | Change Made |\n|-------|------|-------------|\n| ... | ... | ... |\n\n**Proposed edit**:\n- File: {path}\n- Section: {section name}\n- Current: \"{current text or 'new addition'}\"\n- Proposed: \"{new text}\"\n```\n\n### Hold (insufficient evidence)\n\nAdd to accumulator with current instances. Report:\n```\nHolding: \"{pattern description}\" (N instances, need 3+)\n```\n\n### Contradictions\n\nIf a new pattern contradicts an existing accumulator entry:\n```\nContradiction detected:\n- Existing: \"{accumulator pattern}\"\n- New: \"{contradicting pattern}\"\n- Resolution required: user must choose\n```\n\n## Step 5: User Approval\n\nPresent proposals to user:\n```\nLearning found N patterns ready to apply:\n\n[1] {pattern}: {proposed change}\n    Evidence: {N instances}\n    [a]pply / [s]kip / [v]iew evidence?\n\n[2] ...\n```\n\nApply approved changes to the target files.\n\n## Staleness\n\nPatterns in the accumulator expire after `staleness_threshold_days`\n(default 30). If a pattern hasn't recurred within that window,\nit was likely a one-off preference rather than a voice trait.\n\nOn each learning pass, prune stale entries:\n```bash\n# Remove patterns older than threshold with < 3 instances\n```\n\n## Snapshot Capture\n\nThe learning system captures snapshots automatically when\nvoice-review completes. Snapshot naming:\n\n```\n{piece-filename}-{YYYYMMDD-HHMMSS}-pre-review.md\n{piece-filename}-{YYYYMMDD-HHMMSS}-post-review.md\n{piece-filename}-{YYYYMMDD-HHMMSS}-post-edit.md\n```\n\nThe post-edit snapshot is captured when the user runs\n`/voice-learn` after finishing their manual edits.\n\n## Exit Criteria\n\n- Snapshots loaded and compared\n- Changes categorized\n- Accumulator checked and updated\n- Proposals generated for threshold patterns\n- User approved/rejected proposals\n- Approved changes applied to profile files\n- Stale accumulator entries pruned\n\nFile v1.9.16:_meta.json\n\n{\n  \"ownerId\": \"kn7d107jg9jv602h9ytsegydq184a42s\",\n  \"slug\": \"nm-scribe-voice-learn\",\n  \"version\": \"1.9.16\",\n  \"publishedAt\": 1784059158245\n}\n\nFile v1.9.16:modules/pattern-analysis.md\n\n---\nmodule: pattern-analysis\ncategory: voice-learning\ndependencies: [Read, Agent]\nestimated_tokens: 500\n---\n\n# Pattern Analysis Module\n\nAnalyze diffs between post-review and post-edit snapshots\nto extract recurring edit patterns.\n\n## Diff Categories\n\n| Category | Signal | Example |\n|----------|--------|---------|\n| tone_adjustment | Softened/strengthened claims | \"This proves\" -> \"This suggests\" |\n| voice_insertion | Added writer-specific moves | Added parenthetical aside |\n| structure_change | Reordered, split, merged | Broke long paragraph into two |\n| precision_edit | Vague -> specific | \"many people\" -> \"the 12 engineers\" |\n| deletion | Removed fluff | Cut \"It's worth noting that\" |\n| addition | Added context | Added a concrete example |\n| humor_or_irreverence | Added informal voice | Added \"(fuck GPTZero)\" |\n| hedge_or_commit | Changed certainty level | \"will\" -> \"should\" or vice versa |\n\n## Analysis Prompt\n\n```\nCompare these two versions of the same text:\n\nVERSION A (post-review, before manual edits):\n{post_review_text}\n\nVERSION B (post-edit, after manual edits):\n{post_edit_text}\n\nFor each change the writer made:\n1. Identify the specific edit (what changed)\n2. Categorize it (from the categories above)\n3. Describe the pattern (what principle drove this edit?)\n4. Assess specificity: is this a general writing preference\n   or specific to this voice?\n\nFocus on RECURRING patterns, not one-off fixes. If the same\ntype of edit appears 2+ times, that's a voice signal.\n\nOutput as a list of patterns with evidence.\n```\n\n## Pattern Matching Against Accumulator\n\nFor each identified pattern, check the accumulator:\n\n```python\ndef match_pattern(new_pattern, accumulator):\n    \"\"\"Match using category + semantic similarity.\"\"\"\n    for existing in accumulator[\"patterns\"]:\n        if existing[\"category\"] == new_pattern[\"category\"]:\n            # Semantic similarity check (same intent?)\n            if similar_description(existing, new_pattern):\n                return existing  # Merge with this entry\n    return None  # New pattern\n```\n\n## Evidence Requirements\n\n| Action | Threshold |\n|--------|-----------|\n| Apply to register | 3+ instances across 2+ pieces |\n| Apply with accumulator match | 1-2 new and 2 prior instances |\n| Hold in accumulator | 1-2 instances, no prior match |\n| Discard | Contradicts 3+ counter-examples |\n\n## Output Format\n\n```json\n{\n  \"patterns_found\": [\n    {\n      \"category\": \"tone_adjustment\",\n      \"description\": \"Softens confident claims about capabilities\",\n      \"instances\": [\n        {\"line\": 12, \"before\": \"...\", \"after\": \"...\"},\n        {\"line\": 34, \"before\": \"...\", \"after\": \"...\"}\n      ],\n      \"recommendation\": \"apply|hold|discard\",\n      \"target\": \"register|craft-rules|prose-reviewer\",\n      \"proposed_edit\": \"...\"\n    }\n  ]\n}\n```\n\nFile v1.9.16:modules/snapshot-management.md\n\n---\nmodule: snapshot-management\ncategory: voice-learning\ndependencies: [Bash, Write, Read]\nestimated_tokens: 400\n---\n\n# Snapshot Management Module\n\nCapture and organize text snapshots for the learning loop.\n\n## Snapshot Stages\n\n| Stage | When Captured | Purpose |\n|-------|--------------|---------|\n| pre-review | After generation, before review agents | Baseline output |\n| post-review | After user accepts/rejects advisories | Review impact |\n| post-edit | When user runs /voice-learn | Manual edit patterns |\n\n## File Naming\n\n```\n{piece-name}-{YYYYMMDD-HHMMSS}-{stage}.md\n```\n\nExample:\n```\nblog-api-design-20260410-143022-pre-review.md\nblog-api-design-20260410-143022-post-review.md\nblog-api-design-20260410-145511-post-edit.md\n```\n\n## Capture Commands\n\n### Pre-review (automatic)\n\nCalled by voice-generate after producing text:\n```bash\nSNAP_DIR=\"$HOME/.claude/voice-profiles/$PROFILE/learning/snapshots\"\nPIECE_NAME=\"$1\"\nTIMESTAMP=$(date +%Y%m%d-%H%M%S)\ncp \"$OUTPUT_FILE\" \"$SNAP_DIR/${PIECE_NAME}-${TIMESTAMP}-pre-review.md\"\n```\n\n### Post-review (automatic)\n\nCalled by voice-review after user completes advisory decisions:\n```bash\ncp \"$REVIEWED_FILE\" \"$SNAP_DIR/${PIECE_NAME}-${TIMESTAMP}-post-review.md\"\n```\n\n### Post-edit (user-triggered)\n\nUser runs `/voice-learn` after making manual edits:\n```bash\ncp \"$EDITED_FILE\" \"$SNAP_DIR/${PIECE_NAME}-${TIMESTAMP}-post-edit.md\"\n```\n\n## Snapshot Sets\n\nA complete set has all three stages with matching piece-name\nand timestamp prefix. Incomplete sets (missing post-edit) are\nignored by the learning agent until completed.\n\n## Manifest Tracking\n\nUpdate `manifest.json` learning section:\n```json\n{\n  \"learning\": {\n    \"snapshot_count\": 12,\n    \"complete_sets\": 4,\n    \"last_capture\": \"2026-04-10\",\n    \"last_learning_pass\": \"2026-04-09\"\n  }\n}\n```\n\n## Cleanup\n\nSnapshots older than 90 days with completed learning passes\ncan be archived or deleted. The accumulator retains the\npattern evidence independent of raw snapshots.\n\nFile v1.9.16:skill-card.md\n\n## Description: <br>\nImproves a voice profile by learning from manual edits, refining registers and reducing voice drift over time. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[athola](https://clawhub.ai/user/athola) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers, writers, and agent users use this skill after manually editing generated text to compare review and edit snapshots, identify recurring voice patterns, and propose updates to voice-profile rules. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The skill stores generated and edited writing samples in the local voice-profile directory. <br>\nMitigation: Avoid running it on sensitive drafts unless local snapshot retention is acceptable, and review or clean stored snapshots periodically. <br>\nRisk: Broad trigger terms could invoke the learning flow when it is not intended. <br>\nMitigation: Invoke the skill deliberately after completing manual edits and confirm proposed profile changes before applying them. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/athola/skills/nm-scribe-voice-learn) <br>\n- [Project homepage from ClawHub metadata](https://github.com/athola/claude-night-market/tree/master/plugins/scribe) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, configuration, shell commands, guidance] <br>\n**Output Format:** [Markdown guidance with JSON examples and shell command snippets] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Produces pattern analysis, hold/apply recommendations, proposed profile-rule edits, and local accumulator updates for user review.] <br>\n\n## Skill Version(s): <br>\n1.9.16 (source: server release evidence) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v1.9.14: 5 files, 6784 bytes\n\nFiles: modules/pattern-analysis.md (2795b), modules/snapshot-management.md (1967b), skill-card.md (1895b), SKILL.md (5963b), _meta.json (141b)\n\nFile v1.9.14:SKILL.md\n\n---\nname: voice-learn\ndescription: |\n  Improves a voice profile by learning from manual edits. Use after editing generated text to refine registers and close voice drift over time\nversion: 1.9.8\ntriggers:\n  - voice\n  - learning\n  - improvement\n  - feedback\n  - iteration\nmetadata: {\"openclaw\": {\"homepage\": \"https://github.com/athola/claude-night-market/tree/master/plugins/scribe\", \"emoji\": \"\\u270d\\ufe0f\", \"requires\": {\"config\": [\"night-market.scribe:voice-extract\", \"night-market.scribe:voice-generate\", \"night-market.scribe:voice-review\"]}}}\nsource: claude-night-market\nsource_plugin: scribe\n---\n\n> **Night Market Skill** — ported from [claude-night-market/scribe](https://github.com/athola/claude-night-market/tree/master/plugins/scribe). For the full experience with agents, hooks, and commands, install the Claude Code plugin.\n\n\n# Voice Learning Skill\n\nLearn from user edits to improve the voice profile over time.\n\n## Method: Three-Stage Comparison\n\nEvery piece flows through three stages:\n1. **Pre-review**: Raw generation output (before review agents)\n2. **Post-review**: After user accepts/rejects advisory fixes\n3. **Post-edit**: User's manually edited final version\n\nThe learning agent compares stages 2 and 3 (post-review vs\npost-edit) to identify patterns in what the user changed.\nThese patterns inform register and rule updates.\n\n## Core Rules\n\n1. **Sharpen, don't add**: Modify existing rules to cover new\n   patterns. Rule bloat degrades output.\n2. **Tag specificity**: Register-specific patterns go to\n   registers. Universal patterns go to craft rules or agents.\n3. **Flag contradictions**: Opposite patterns across pieces\n   require user resolution.\n4. **Evidence threshold**: Patterns need 3+ instances (or 1-2\n   matching existing accumulator entries) before becoming rules.\n5. **Detection surface**: Structural changes increase AI\n   detectability. Craft-level changes are neutral. Prefer\n   craft-level updates.\n6. **Rule count check**: Suggest consolidation if any section\n   has 8+ rules.\n\n## Required TodoWrite Items\n\n1. `voice-learn:snapshots-loaded` - All three stages read\n2. `voice-learn:diff-analyzed` - Changes categorized\n3. `voice-learn:accumulator-checked` - Prior patterns reviewed\n4. `voice-learn:proposals-generated` - Updates proposed\n5. `voice-learn:user-approved` - Changes accepted by user\n\n## Step 1: Load Snapshots\n\nLoad: `@modules/snapshot-management`\n\n```bash\nPROFILE_DIR=\"$HOME/.claude/voice-profiles/{name}\"\nSNAP_DIR=\"$PROFILE_DIR/learning/snapshots\"\n\n# Find the most recent snapshot set\n# Format: {piece-name}-{timestamp}-{stage}.md\n```\n\nRead all three stages for the target piece.\n\n## Step 2: Diff Analysis\n\nLoad: `@modules/pattern-analysis`\n\nCompare post-review vs post-edit. Categorize every change:\n\n| Category | Example |\n|----------|---------|\n| Tone adjustment | Softened a claim, added hedge |\n| Voice insertion | Added parenthetical, aside, humor |\n| Structure change | Broke paragraph, reordered |\n| Precision edit | Replaced vague with specific |\n| Deletion | Removed fluff or decoration |\n| Addition | Added context, example, anchor |\n\n## Step 3: Check Accumulator\n\nRead `learning/accumulator.json`:\n\n```json\n{\n  \"patterns\": [\n    {\n      \"id\": \"pat-001\",\n      \"category\": \"tone_adjustment\",\n      \"description\": \"Softens confident claims about tool capabilities\",\n      \"instances\": [\n        {\"piece\": \"blog-post-1\", \"date\": \"2026-04-08\", \"diff\": \"...\"}\n      ],\n      \"target\": \"register\",\n      \"status\": \"accumulating\",\n      \"first_seen\": \"2026-04-08\",\n      \"last_seen\": \"2026-04-08\"\n    }\n  ],\n  \"staleness_threshold_days\": 30\n}\n```\n\nMatch new changes against existing patterns:\n- Semantic similarity (same category + similar description)\n- If match found: merge instance, check if threshold reached\n- If no match: create new accumulator entry\n\n## Step 4: Generate Proposals\n\nFor patterns that reach threshold (3+ instances or 1-2\nmatching prior accumulator entries with 2+ instances):\n\n### Apply (strong evidence)\n\n```markdown\n## Proposed Update\n\n**Pattern**: {description}\n**Target**: {register file or craft-rules.md}\n**Evidence**: {N instances across M pieces}\n\n| Piece | Date | Change Made |\n|-------|------|-------------|\n| ... | ... | ... |\n\n**Proposed edit**:\n- File: {path}\n- Section: {section name}\n- Current: \"{current text or 'new addition'}\"\n- Proposed: \"{new text}\"\n```\n\n### Hold (insufficient evidence)\n\nAdd to accumulator with current instances. Report:\n```\nHolding: \"{pattern description}\" (N instances, need 3+)\n```\n\n### Contradictions\n\nIf a new pattern contradicts an existing accumulator entry:\n```\nContradiction detected:\n- Existing: \"{accumulator pattern}\"\n- New: \"{contradicting pattern}\"\n- Resolution required: user must choose\n```\n\n## Step 5: User Approval\n\nPresent proposals to user:\n```\nLearning found N patterns ready to apply:\n\n[1] {pattern}: {proposed change}\n    Evidence: {N instances}\n    [a]pply / [s]kip / [v]iew evidence?\n\n[2] ...\n```\n\nApply approved changes to the target files.\n\n## Staleness\n\nPatterns in the accumulator expire after `staleness_threshold_days`\n(default 30). If a pattern hasn't recurred within that window,\nit was likely a one-off preference rather than a voice trait.\n\nOn each learning pass, prune stale entries:\n```bash\n# Remove patterns older than threshold with < 3 instances\n```\n\n## Snapshot Capture\n\nThe learning system captures snapshots automatically when\nvoice-review completes. Snapshot naming:\n\n```\n{piece-filename}-{YYYYMMDD-HHMMSS}-pre-review.md\n{piece-filename}-{YYYYMMDD-HHMMSS}-post-review.md\n{piece-filename}-{YYYYMMDD-HHMMSS}-post-edit.md\n```\n\nThe post-edit snapshot is captured when the user runs\n`/voice-learn` after finishing their manual edits.\n\n## Exit Criteria\n\n- Snapshots loaded and compared\n- Changes categorized\n- Accumulator checked and updated\n- Proposals generated for threshold patterns\n- User approved/rejected proposals\n- Approved changes applied to profile files\n- Stale accumulator entries pruned\n\nFile v1.9.14:_meta.json\n\n{\n  \"ownerId\": \"kn7d107jg9jv602h9ytsegydq184a42s\",\n  \"slug\": \"nm-scribe-voice-learn\",\n  \"version\": \"1.9.14\",\n  \"publishedAt\": 1782842808670\n}\n\nFile v1.9.14:modules/pattern-analysis.md\n\n---\nmodule: pattern-analysis\ncategory: voice-learning\ndependencies: [Read, Agent]\nestimated_tokens: 500\n---\n\n# Pattern Analysis Module\n\nAnalyze diffs between post-review and post-edit snapshots\nto extract recurring edit patterns.\n\n## Diff Categories\n\n| Category | Signal | Example |\n|----------|--------|---------|\n| tone_adjustment | Softened/strengthened claims | \"This proves\" -> \"This suggests\" |\n| voice_insertion | Added writer-specific moves | Added parenthetical aside |\n| structure_change | Reordered, split, merged | Broke long paragraph into two |\n| precision_edit | Vague -> specific | \"many people\" -> \"the 12 engineers\" |\n| deletion | Removed fluff | Cut \"It's worth noting that\" |\n| addition | Added context | Added a concrete example |\n| humor_or_irreverence | Added informal voice | Added \"(fuck GPTZero)\" |\n| hedge_or_commit | Changed certainty level | \"will\" -> \"should\" or vice versa |\n\n## Analysis Prompt\n\n```\nCompare these two versions of the same text:\n\nVERSION A (post-review, before manual edits):\n{post_review_text}\n\nVERSION B (post-edit, after manual edits):\n{post_edit_text}\n\nFor each change the writer made:\n1. Identify the specific edit (what changed)\n2. Categorize it (from the categories above)\n3. Describe the pattern (what principle drove this edit?)\n4. Assess specificity: is this a general writing preference\n   or specific to this voice?\n\nFocus on RECURRING patterns, not one-off fixes. If the same\ntype of edit appears 2+ times, that's a voice signal.\n\nOutput as a list of patterns with evidence.\n```\n\n## Pattern Matching Against Accumulator\n\nFor each identified pattern, check the accumulator:\n\n```python\ndef match_pattern(new_pattern, accumulator):\n    \"\"\"Match using category + semantic similarity.\"\"\"\n    for existing in accumulator[\"patterns\"]:\n        if existing[\"category\"] == new_pattern[\"category\"]:\n            # Semantic similarity check (same intent?)\n            if similar_description(existing, new_pattern):\n                return existing  # Merge with this entry\n    return None  # New pattern\n```\n\n## Evidence Requirements\n\n| Action | Threshold |\n|--------|-----------|\n| Apply to register | 3+ instances across 2+ pieces |\n| Apply with accumulator match | 1-2 new and 2 prior instances |\n| Hold in accumulator | 1-2 instances, no prior match |\n| Discard | Contradicts 3+ counter-examples |\n\n## Output Format\n\n```json\n{\n  \"patterns_found\": [\n    {\n      \"category\": \"tone_adjustment\",\n      \"description\": \"Softens confident claims about capabilities\",\n      \"instances\": [\n        {\"line\": 12, \"before\": \"...\", \"after\": \"...\"},\n        {\"line\": 34, \"before\": \"...\", \"after\": \"...\"}\n      ],\n      \"recommendation\": \"apply|hold|discard\",\n      \"target\": \"register|craft-rules|prose-reviewer\",\n      \"proposed_edit\": \"...\"\n    }\n  ]\n}\n```\n\nFile v1.9.14:modules/snapshot-management.md\n\n---\nmodule: snapshot-management\ncategory: voice-learning\ndependencies: [Bash, Write, Read]\nestimated_tokens: 400\n---\n\n# Snapshot Management Module\n\nCapture and organize text snapshots for the learning loop.\n\n## Snapshot Stages\n\n| Stage | When Captured | Purpose |\n|-------|--------------|---------|\n| pre-review | After generation, before review agents | Baseline output |\n| post-review | After user accepts/rejects advisories | Review impact |\n| post-edit | When user runs /voice-learn | Manual edit patterns |\n\n## File Naming\n\n```\n{piece-name}-{YYYYMMDD-HHMMSS}-{stage}.md\n```\n\nExample:\n```\nblog-api-design-20260410-143022-pre-review.md\nblog-api-design-20260410-143022-post-review.md\nblog-api-design-20260410-145511-post-edit.md\n```\n\n## Capture Commands\n\n### Pre-review (automatic)\n\nCalled by voice-generate after producing text:\n```bash\nSNAP_DIR=\"$HOME/.claude/voice-profiles/$PROFILE/learning/snapshots\"\nPIECE_NAME=\"$1\"\nTIMESTAMP=$(date +%Y%m%d-%H%M%S)\ncp \"$OUTPUT_FILE\" \"$SNAP_DIR/${PIECE_NAME}-${TIMESTAMP}-pre-review.md\"\n```\n\n### Post-review (automatic)\n\nCalled by voice-review after user completes advisory decisions:\n```bash\ncp \"$REVIEWED_FILE\" \"$SNAP_DIR/${PIECE_NAME}-${TIMESTAMP}-post-review.md\"\n```\n\n### Post-edit (user-triggered)\n\nUser runs `/voice-learn` after making manual edits:\n```bash\ncp \"$EDITED_FILE\" \"$SNAP_DIR/${PIECE_NAME}-${TIMESTAMP}-post-edit.md\"\n```\n\n## Snapshot Sets\n\nA complete set has all three stages with matching piece-name\nand timestamp prefix. Incomplete sets (missing post-edit) are\nignored by the learning agent until completed.\n\n## Manifest Tracking\n\nUpdate `manifest.json` learning section:\n```json\n{\n  \"learning\": {\n    \"snapshot_count\": 12,\n    \"complete_sets\": 4,\n    \"last_capture\": \"2026-04-10\",\n    \"last_learning_pass\": \"2026-04-09\"\n  }\n}\n```\n\n## Cleanup\n\nSnapshots older than 90 days with completed learning passes\ncan be archived or deleted. The accumulator retains the\npattern evidence independent of raw snapshots.\n\nFile v1.9.14:skill-card.md\n\n## Description: <br>\nImproves a voice profile by learning from manual edits to refine registers and reduce voice drift over time. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[athola](https://clawhub.ai/user/athola) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nWriters and developers use this skill after manually editing generated text to identify recurring edit patterns and propose updates to voice profiles, registers, and craft rules. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The skill stores generated, reviewed, and edited writing snapshots under the user's local Claude voice-profile directory, which may contain private draft content. <br>\nMitigation: Use explicit voice-learning prompts, review proposed profile changes before approving them, and periodically inspect, archive, or delete old snapshots. <br>\n\n\n## Reference(s): <br>\n- [ClawHub release page](https://clawhub.ai/athola/skills/nm-scribe-voice-learn) <br>\n- [Night Market Scribe project](https://github.com/athola/claude-night-market/tree/master/plugins/scribe) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance] <br>\n**Output Format:** [Markdown guidance with JSON examples and inline shell commands] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [May propose edits to local voice-profile files after user approval.] <br>\n\n## Skill Version(s): <br>\n1.9.14 (source: server release metadata; skill frontmatter reports 1.9.8) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v1.9.13: 5 files, 7057 bytes\n\nFiles: modules/pattern-analysis.md (2795b), modules/snapshot-management.md (1967b), skill-card.md (2603b), SKILL.md (5963b), _meta.json (141b)\n\nFile v1.9.13:SKILL.md\n\n---\nname: voice-learn\ndescription: |\n  Improves a voice profile by learning from manual edits. Use after editing generated text to refine registers and close voice drift over time\nversion: 1.9.8\ntriggers:\n  - voice\n  - learning\n  - improvement\n  - feedback\n  - iteration\nmetadata: {\"openclaw\": {\"homepage\": \"https://github.com/athola/claude-night-market/tree/master/plugins/scribe\", \"emoji\": \"\\u270d\\ufe0f\", \"requires\": {\"config\": [\"night-market.scribe:voice-extract\", \"night-market.scribe:voice-generate\", \"night-market.scribe:voice-review\"]}}}\nsource: claude-night-market\nsource_plugin: scribe\n---\n\n> **Night Market Skill** — ported from [claude-night-market/scribe](https://github.com/athola/claude-night-market/tree/master/plugins/scribe). For the full experience with agents, hooks, and commands, install the Claude Code plugin.\n\n\n# Voice Learning Skill\n\nLearn from user edits to improve the voice profile over time.\n\n## Method: Three-Stage Comparison\n\nEvery piece flows through three stages:\n1. **Pre-review**: Raw generation output (before review agents)\n2. **Post-review**: After user accepts/rejects advisory fixes\n3. **Post-edit**: User's manually edited final version\n\nThe learning agent compares stages 2 and 3 (post-review vs\npost-edit) to identify patterns in what the user changed.\nThese patterns inform register and rule updates.\n\n## Core Rules\n\n1. **Sharpen, don't add**: Modify existing rules to cover new\n   patterns. Rule bloat degrades output.\n2. **Tag specificity**: Register-specific patterns go to\n   registers. Universal patterns go to craft rules or agents.\n3. **Flag contradictions**: Opposite patterns across pieces\n   require user resolution.\n4. **Evidence threshold**: Patterns need 3+ instances (or 1-2\n   matching existing accumulator entries) before becoming rules.\n5. **Detection surface**: Structural changes increase AI\n   detectability. Craft-level changes are neutral. Prefer\n   craft-level updates.\n6. **Rule count check**: Suggest consolidation if any section\n   has 8+ rules.\n\n## Required TodoWrite Items\n\n1. `voice-learn:snapshots-loaded` - All three stages read\n2. `voice-learn:diff-analyzed` - Changes categorized\n3. `voice-learn:accumulator-checked` - Prior patterns reviewed\n4. `voice-learn:proposals-generated` - Updates proposed\n5. `voice-learn:user-approved` - Changes accepted by user\n\n## Step 1: Load Snapshots\n\nLoad: `@modules/snapshot-management`\n\n```bash\nPROFILE_DIR=\"$HOME/.claude/voice-profiles/{name}\"\nSNAP_DIR=\"$PROFILE_DIR/learning/snapshots\"\n\n# Find the most recent snapshot set\n# Format: {piece-name}-{timestamp}-{stage}.md\n```\n\nRead all three stages for the target piece.\n\n## Step 2: Diff Analysis\n\nLoad: `@modules/pattern-analysis`\n\nCompare post-review vs post-edit. Categorize every change:\n\n| Category | Example |\n|----------|---------|\n| Tone adjustment | Softened a claim, added hedge |\n| Voice insertion | Added parenthetical, aside, humor |\n| Structure change | Broke paragraph, reordered |\n| Precision edit | Replaced vague with specific |\n| Deletion | Removed fluff or decoration |\n| Addition | Added context, example, anchor |\n\n## Step 3: Check Accumulator\n\nRead `learning/accumulator.json`:\n\n```json\n{\n  \"patterns\": [\n    {\n      \"id\": \"pat-001\",\n      \"category\": \"tone_adjustment\",\n      \"description\": \"Softens confident claims about tool capabilities\",\n      \"instances\": [\n        {\"piece\": \"blog-post-1\", \"date\": \"2026-04-08\", \"diff\": \"...\"}\n      ],\n      \"target\": \"register\",\n      \"status\": \"accumulating\",\n      \"first_seen\": \"2026-04-08\",\n      \"last_seen\": \"2026-04-08\"\n    }\n  ],\n  \"staleness_threshold_days\": 30\n}\n```\n\nMatch new changes against existing patterns:\n- Semantic similarity (same category + similar description)\n- If match found: merge instance, check if threshold reached\n- If no match: create new accumulator entry\n\n## Step 4: Generate Proposals\n\nFor patterns that reach threshold (3+ instances or 1-2\nmatching prior accumulator entries with 2+ instances):\n\n### Apply (strong evidence)\n\n```markdown\n## Proposed Update\n\n**Pattern**: {description}\n**Target**: {register file or craft-rules.md}\n**Evidence**: {N instances across M pieces}\n\n| Piece | Date | Change Made |\n|-------|------|-------------|\n| ... | ... | ... |\n\n**Proposed edit**:\n- File: {path}\n- Section: {section name}\n- Current: \"{current text or 'new addition'}\"\n- Proposed: \"{new text}\"\n```\n\n### Hold (insufficient evidence)\n\nAdd to accumulator with current instances. Report:\n```\nHolding: \"{pattern description}\" (N instances, need 3+)\n```\n\n### Contradictions\n\nIf a new pattern contradicts an existing accumulator entry:\n```\nContradiction detected:\n- Existing: \"{accumulator pattern}\"\n- New: \"{contradicting pattern}\"\n- Resolution required: user must choose\n```\n\n## Step 5: User Approval\n\nPresent proposals to user:\n```\nLearning found N patterns ready to apply:\n\n[1] {pattern}: {proposed change}\n    Evidence: {N instances}\n    [a]pply / [s]kip / [v]iew evidence?\n\n[2] ...\n```\n\nApply approved changes to the target files.\n\n## Staleness\n\nPatterns in the accumulator expire after `staleness_threshold_days`\n(default 30). If a pattern hasn't recurred within that window,\nit was likely a one-off preference rather than a voice trait.\n\nOn each learning pass, prune stale entries:\n```bash\n# Remove patterns older than threshold with < 3 instances\n```\n\n## Snapshot Capture\n\nThe learning system captures snapshots automatically when\nvoice-review completes. Snapshot naming:\n\n```\n{piece-filename}-{YYYYMMDD-HHMMSS}-pre-review.md\n{piece-filename}-{YYYYMMDD-HHMMSS}-post-review.md\n{piece-filename}-{YYYYMMDD-HHMMSS}-post-edit.md\n```\n\nThe post-edit snapshot is captured when the user runs\n`/voice-learn` after finishing their manual edits.\n\n## Exit Criteria\n\n- Snapshots loaded and compared\n- Changes categorized\n- Accumulator checked and updated\n- Proposals generated for threshold patterns\n- User approved/rejected proposals\n- Approved changes applied to profile files\n- Stale accumulator entries pruned\n\nFile v1.9.13:_meta.json\n\n{\n  \"ownerId\": \"kn7d107jg9jv602h9ytsegydq184a42s\",\n  \"slug\": \"nm-scribe-voice-learn\",\n  \"version\": \"1.9.13\",\n  \"publishedAt\": 1782577470532\n}\n\nFile v1.9.13:modules/pattern-analysis.md\n\n---\nmodule: pattern-analysis\ncategory: voice-learning\ndependencies: [Read, Agent]\nestimated_tokens: 500\n---\n\n# Pattern Analysis Module\n\nAnalyze diffs between post-review and post-edit snapshots\nto extract recurring edit patterns.\n\n## Diff Categories\n\n| Category | Signal | Example |\n|----------|--------|---------|\n| tone_adjustment | Softened/strengthened claims | \"This proves\" -> \"This suggests\" |\n| voice_insertion | Added writer-specific moves | Added parenthetical aside |\n| structure_change | Reordered, split, merged | Broke long paragraph into two |\n| precision_edit | Vague -> specific | \"many people\" -> \"the 12 engineers\" |\n| deletion | Removed fluff | Cut \"It's worth noting that\" |\n| addition | Added context | Added a concrete example |\n| humor_or_irreverence | Added informal voice | Added \"(fuck GPTZero)\" |\n| hedge_or_commit | Changed certainty level | \"will\" -> \"should\" or vice versa |\n\n## Analysis Prompt\n\n```\nCompare these two versions of the same text:\n\nVERSION A (post-review, before manual edits):\n{post_review_text}\n\nVERSION B (post-edit, after manual edits):\n{post_edit_text}\n\nFor each change the writer made:\n1. Identify the specific edit (what changed)\n2. Categorize it (from the categories above)\n3. Describe the pattern (what principle drove this edit?)\n4. Assess specificity: is this a general writing preference\n   or specific to this voice?\n\nFocus on RECURRING patterns, not one-off fixes. If the same\ntype of edit appears 2+ times, that's a voice signal.\n\nOutput as a list of patterns with evidence.\n```\n\n## Pattern Matching Against Accumulator\n\nFor each identified pattern, check the accumulator:\n\n```python\ndef match_pattern(new_pattern, accumulator):\n    \"\"\"Match using category + semantic similarity.\"\"\"\n    for existing in accumulator[\"patterns\"]:\n        if existing[\"category\"] == new_pattern[\"category\"]:\n            # Semantic similarity check (same intent?)\n            if similar_description(existing, new_pattern):\n                return existing  # Merge with this entry\n    return None  # New pattern\n```\n\n## Evidence Requirements\n\n| Action | Threshold |\n|--------|-----------|\n| Apply to register | 3+ instances across 2+ pieces |\n| Apply with accumulator match | 1-2 new and 2 prior instances |\n| Hold in accumulator | 1-2 instances, no prior match |\n| Discard | Contradicts 3+ counter-examples |\n\n## Output Format\n\n```json\n{\n  \"patterns_found\": [\n    {\n      \"category\": \"tone_adjustment\",\n      \"description\": \"Softens confident claims about capabilities\",\n      \"instances\": [\n        {\"line\": 12, \"before\": \"...\", \"after\": \"...\"},\n        {\"line\": 34, \"before\": \"...\", \"after\": \"...\"}\n      ],\n      \"recommendation\": \"apply|hold|discard\",\n      \"target\": \"register|craft-rules|prose-reviewer\",\n      \"proposed_edit\": \"...\"\n    }\n  ]\n}\n```\n\nFile v1.9.13:modules/snapshot-management.md\n\n---\nmodule: snapshot-management\ncategory: voice-learning\ndependencies: [Bash, Write, Read]\nestimated_tokens: 400\n---\n\n# Snapshot Management Module\n\nCapture and organize text snapshots for the learning loop.\n\n## Snapshot Stages\n\n| Stage | When Captured | Purpose |\n|-------|--------------|---------|\n| pre-review | After generation, before review agents | Baseline output |\n| post-review | After user accepts/rejects advisories | Review impact |\n| post-edit | When user runs /voice-learn | Manual edit patterns |\n\n## File Naming\n\n```\n{piece-name}-{YYYYMMDD-HHMMSS}-{stage}.md\n```\n\nExample:\n```\nblog-api-design-20260410-143022-pre-review.md\nblog-api-design-20260410-143022-post-review.md\nblog-api-design-20260410-145511-post-edit.md\n```\n\n## Capture Commands\n\n### Pre-review (automatic)\n\nCalled by voice-generate after producing text:\n```bash\nSNAP_DIR=\"$HOME/.claude/voice-profiles/$PROFILE/learning/snapshots\"\nPIECE_NAME=\"$1\"\nTIMESTAMP=$(date +%Y%m%d-%H%M%S)\ncp \"$OUTPUT_FILE\" \"$SNAP_DIR/${PIECE_NAME}-${TIMESTAMP}-pre-review.md\"\n```\n\n### Post-review (automatic)\n\nCalled by voice-review after user completes advisory decisions:\n```bash\ncp \"$REVIEWED_FILE\" \"$SNAP_DIR/${PIECE_NAME}-${TIMESTAMP}-post-review.md\"\n```\n\n### Post-edit (user-triggered)\n\nUser runs `/voice-learn` after making manual edits:\n```bash\ncp \"$EDITED_FILE\" \"$SNAP_DIR/${PIECE_NAME}-${TIMESTAMP}-post-edit.md\"\n```\n\n## Snapshot Sets\n\nA complete set has all three stages with matching piece-name\nand timestamp prefix. Incomplete sets (missing post-edit) are\nignored by the learning agent until completed.\n\n## Manifest Tracking\n\nUpdate `manifest.json` learning section:\n```json\n{\n  \"learning\": {\n    \"snapshot_count\": 12,\n    \"complete_sets\": 4,\n    \"last_capture\": \"2026-04-10\",\n    \"last_learning_pass\": \"2026-04-09\"\n  }\n}\n```\n\n## Cleanup\n\nSnapshots older than 90 days with completed learning passes\ncan be archived or deleted. The accumulator retains the\npattern evidence independent of raw snapshots.\n\nFile v1.9.13:skill-card.md\n\n## Description: <br>\nImproves a voice profile by learning from manual edits after generated text is edited, refining registers and reducing voice drift over time. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[athola](https://clawhub.ai/user/athola) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and writers use this skill after manual edits to generated text to identify recurring voice patterns, maintain a local learning accumulator, and propose updates to voice-profile rules for user approval. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: Writing samples and edit history may be stored locally in the voice-profile learning directory. <br>\nMitigation: Use the skill only on material appropriate for local retention, manage local access to the profile directory, and delete or archive snapshots when they are no longer needed. <br>\nRisk: Broad trigger terms may cause the skill to be invoked when the user did not intend to run the learning workflow. <br>\nMitigation: Invoke the skill deliberately and review its proposed changes before allowing any profile updates. <br>\nRisk: Weak or one-off edit patterns could overfit the voice profile and reduce future output quality. <br>\nMitigation: Keep the documented evidence thresholds and user-approval step before modifying register or craft rules. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/athola/skills/nm-scribe-voice-learn) <br>\n- [Plugin homepage from ClawHub metadata](https://github.com/athola/claude-night-market/tree/master/plugins/scribe) <br>\n- [Pattern analysis module](modules/pattern-analysis.md) <br>\n- [Snapshot management module](modules/snapshot-management.md) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance] <br>\n**Output Format:** [Markdown guidance with JSON examples and shell command snippets] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Produces proposed profile-rule edits and accumulator updates for user review; may read and write local snapshot and profile files when used.] <br>\n\n## Skill Version(s): <br>\n1.9.13 (source: ClawHub release evidence; artifact frontmatter reports 1.9.8) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v1.9.12: 5 files, 7033 bytes\n\nFiles: modules/pattern-analysis.md (2795b), modules/snapshot-management.md (1967b), skill-card.md (2483b), SKILL.md (5963b), _meta.json (141b)\n\nFile v1.9.12:SKILL.md\n\n---\nname: voice-learn\ndescription: |\n  Improves a voice profile by learning from manual edits. Use after editing generated text to refine registers and close voice drift over time\nversion: 1.9.8\ntriggers:\n  - voice\n  - learning\n  - improvement\n  - feedback\n  - iteration\nmetadata: {\"openclaw\": {\"homepage\": \"https://github.com/athola/claude-night-market/tree/master/plugins/scribe\", \"emoji\": \"\\u270d\\ufe0f\", \"requires\": {\"config\": [\"night-market.scribe:voice-extract\", \"night-market.scribe:voice-generate\", \"night-market.scribe:voice-review\"]}}}\nsource: claude-night-market\nsource_plugin: scribe\n---\n\n> **Night Market Skill** — ported from [claude-night-market/scribe](https://github.com/athola/claude-night-market/tree/master/plugins/scribe). For the full experience with agents, hooks, and commands, install the Claude Code plugin.\n\n\n# Voice Learning Skill\n\nLearn from user edits to improve the voice profile over time.\n\n## Method: Three-Stage Comparison\n\nEvery piece flows through three stages:\n1. **Pre-review**: Raw generation output (before review agents)\n2. **Post-review**: After user accepts/rejects advisory fixes\n3. **Post-edit**: User's manually edited final version\n\nThe learning agent compares stages 2 and 3 (post-review vs\npost-edit) to identify patterns in what the user changed.\nThese patterns inform register and rule updates.\n\n## Core Rules\n\n1. **Sharpen, don't add**: Modify existing rules to cover new\n   patterns. Rule bloat degrades output.\n2. **Tag specificity**: Register-specific patterns go to\n   registers. Universal patterns go to craft rules or agents.\n3. **Flag contradictions**: Opposite patterns across pieces\n   require user resolution.\n4. **Evidence threshold**: Patterns need 3+ instances (or 1-2\n   matching existing accumulator entries) before becoming rules.\n5. **Detection surface**: Structural changes increase AI\n   detectability. Craft-level changes are neutral. Prefer\n   craft-level updates.\n6. **Rule count check**: Suggest consolidation if any section\n   has 8+ rules.\n\n## Required TodoWrite Items\n\n1. `voice-learn:snapshots-loaded` - All three stages read\n2. `voice-learn:diff-analyzed` - Changes categorized\n3. `voice-learn:accumulator-checked` - Prior patterns reviewed\n4. `voice-learn:proposals-generated` - Updates proposed\n5. `voice-learn:user-approved` - Changes accepted by user\n\n## Step 1: Load Snapshots\n\nLoad: `@modules/snapshot-management`\n\n```bash\nPROFILE_DIR=\"$HOME/.claude/voice-profiles/{name}\"\nSNAP_DIR=\"$PROFILE_DIR/learning/snapshots\"\n\n# Find the most recent snapshot set\n# Format: {piece-name}-{timestamp}-{stage}.md\n```\n\nRead all three stages for the target piece.\n\n## Step 2: Diff Analysis\n\nLoad: `@modules/pattern-analysis`\n\nCompare post-review vs post-edit. Categorize every change:\n\n| Category | Example |\n|----------|---------|\n| Tone adjustment | Softened a claim, added hedge |\n| Voice insertion | Added parenthetical, aside, humor |\n| Structure change | Broke paragraph, reordered |\n| Precision edit | Replaced vague with specific |\n| Deletion | Removed fluff or decoration |\n| Addition | Added context, example, anchor |\n\n## Step 3: Check Accumulator\n\nRead `learning/accumulator.json`:\n\n```json\n{\n  \"patterns\": [\n    {\n      \"id\": \"pat-001\",\n      \"category\": \"tone_adjustment\",\n      \"description\": \"Softens confident claims about tool capabilities\",\n      \"instances\": [\n        {\"piece\": \"blog-post-1\", \"date\": \"2026-04-08\", \"diff\": \"...\"}\n      ],\n      \"target\": \"register\",\n      \"status\": \"accumulating\",\n      \"first_seen\": \"2026-04-08\",\n      \"last_seen\": \"2026-04-08\"\n    }\n  ],\n  \"staleness_threshold_days\": 30\n}\n```\n\nMatch new changes against existing patterns:\n- Semantic similarity (same category + similar description)\n- If match found: merge instance, check if threshold reached\n- If no match: create new accumulator entry\n\n## Step 4: Generate Proposals\n\nFor patterns that reach threshold (3+ instances or 1-2\nmatching prior accumulator entries with 2+ instances):\n\n### Apply (strong evidence)\n\n```markdown\n## Proposed Update\n\n**Pattern**: {description}\n**Target**: {register file or craft-rules.md}\n**Evidence**: {N instances across M pieces}\n\n| Piece | Date | Change Made |\n|-------|------|-------------|\n| ... | ... | ... |\n\n**Proposed edit**:\n- File: {path}\n- Section: {section name}\n- Current: \"{current text or 'new addition'}\"\n- Proposed: \"{new text}\"\n```\n\n### Hold (insufficient evidence)\n\nAdd to accumulator with current instances. Report:\n```\nHolding: \"{pattern description}\" (N instances, need 3+)\n```\n\n### Contradictions\n\nIf a new pattern contradicts an existing accumulator entry:\n```\nContradiction detected:\n- Existing: \"{accumulator pattern}\"\n- New: \"{contradicting pattern}\"\n- Resolution required: user must choose\n```\n\n## Step 5: User Approval\n\nPresent proposals to user:\n```\nLearning found N patterns ready to apply:\n\n[1] {pattern}: {proposed change}\n    Evidence: {N instances}\n    [a]pply / [s]kip / [v]iew evidence?\n\n[2] ...\n```\n\nApply approved changes to the target files.\n\n## Staleness\n\nPatterns in the accumulator expire after `staleness_threshold_days`\n(default 30). If a pattern hasn't recurred within that window,\nit was likely a one-off preference rather than a voice trait.\n\nOn each learning pass, prune stale entries:\n```bash\n# Remove patterns older than threshold with < 3 instances\n```\n\n## Snapshot Capture\n\nThe learning system captures snapshots automatically when\nvoice-review completes. Snapshot naming:\n\n```\n{piece-filename}-{YYYYMMDD-HHMMSS}-pre-review.md\n{piece-filename}-{YYYYMMDD-HHMMSS}-post-review.md\n{piece-filename}-{YYYYMMDD-HHMMSS}-post-edit.md\n```\n\nThe post-edit snapshot is captured when the user runs\n`/voice-learn` after finishing their manual edits.\n\n## Exit Criteria\n\n- Snapshots loaded and compared\n- Changes categorized\n- Accumulator checked and updated\n- Proposals generated for threshold patterns\n- User approved/rejected proposals\n- Approved changes applied to profile files\n- Stale accumulator entries pruned\n\nFile v1.9.12:_meta.json\n\n{\n  \"ownerId\": \"kn7d107jg9jv602h9ytsegydq184a42s\",\n  \"slug\": \"nm-scribe-voice-learn\",\n  \"version\": \"1.9.12\",\n  \"publishedAt\": 1781839222006\n}\n\nFile v1.9.12:modules/pattern-analysis.md\n\n---\nmodule: pattern-analysis\ncategory: voice-learning\ndependencies: [Read, Agent]\nestimated_tokens: 500\n---\n\n# Pattern Analysis Module\n\nAnalyze diffs between post-review and post-edit snapshots\nto extract recurring edit patterns.\n\n## Diff Categories\n\n| Category | Signal | Example |\n|----------|--------|---------|\n| tone_adjustment | Softened/strengthened claims | \"This proves\" -> \"This suggests\" |\n| voice_insertion | Added writer-specific moves | Added parenthetical aside |\n| structure_change | Reordered, split, merged | Broke long paragraph into two |\n| precision_edit | Vague -> specific | \"many people\" -> \"the 12 engineers\" |\n| deletion | Removed fluff | Cut \"It's worth noting that\" |\n| addition | Added context | Added a concrete example |\n| humor_or_irreverence | Added informal voice | Added \"(fuck GPTZero)\" |\n| hedge_or_commit | Changed certainty level | \"will\" -> \"should\" or vice versa |\n\n## Analysis Prompt\n\n```\nCompare these two versions of the same text:\n\nVERSION A (post-review, before manual edits):\n{post_review_text}\n\nVERSION B (post-edit, after manual edits):\n{post_edit_text}\n\nFor each change the writer made:\n1. Identify the specific edit (what changed)\n2. Categorize it (from the categories above)\n3. Describe the pattern (what principle drove this edit?)\n4. Assess specificity: is this a general writing preference\n   or specific to this voice?\n\nFocus on RECURRING patterns, not one-off fixes. If the same\ntype of edit appears 2+ times, that's a voice signal.\n\nOutput as a list of patterns with evidence.\n```\n\n## Pattern Matching Against Accumulator\n\nFor each identified pattern, check the accumulator:\n\n```python\ndef match_pattern(new_pattern, accumulator):\n    \"\"\"Match using category + semantic similarity.\"\"\"\n    for existing in accumulator[\"patterns\"]:\n        if existing[\"category\"] == new_pattern[\"category\"]:\n            # Semantic similarity check (same intent?)\n            if similar_description(existing, new_pattern):\n                return existing  # Merge with this entry\n    return None  # New pattern\n```\n\n## Evidence Requirements\n\n| Action | Threshold |\n|--------|-----------|\n| Apply to register | 3+ instances across 2+ pieces |\n| Apply with accumulator match | 1-2 new and 2 prior instances |\n| Hold in accumulator | 1-2 instances, no prior match |\n| Discard | Contradicts 3+ counter-examples |\n\n## Output Format\n\n```json\n{\n  \"patterns_found\": [\n    {\n      \"category\": \"tone_adjustment\",\n      \"description\": \"Softens confident claims about capabilities\",\n      \"instances\": [\n        {\"line\": 12, \"before\": \"...\", \"after\": \"...\"},\n        {\"line\": 34, \"before\": \"...\", \"after\": \"...\"}\n      ],\n      \"recommendation\": \"apply|hold|discard\",\n      \"target\": \"register|craft-rules|prose-reviewer\",\n      \"proposed_edit\": \"...\"\n    }\n  ]\n}\n```\n\nFile v1.9.12:modules/snapshot-management.md\n\n---\nmodule: snapshot-management\ncategory: voice-learning\ndependencies: [Bash, Write, Read]\nestimated_tokens: 400\n---\n\n# Snapshot Management Module\n\nCapture and organize text snapshots for the learning loop.\n\n## Snapshot Stages\n\n| Stage | When Captured | Purpose |\n|-------|--------------|---------|\n| pre-review | After generation, before review agents | Baseline output |\n| post-review | After user accepts/rejects advisories | Review impact |\n| post-edit | When user runs /voice-learn | Manual edit patterns |\n\n## File Naming\n\n```\n{piece-name}-{YYYYMMDD-HHMMSS}-{stage}.md\n```\n\nExample:\n```\nblog-api-design-20260410-143022-pre-review.md\nblog-api-design-20260410-143022-post-review.md\nblog-api-design-20260410-145511-post-edit.md\n```\n\n## Capture Commands\n\n### Pre-review (automatic)\n\nCalled by voice-generate after producing text:\n```bash\nSNAP_DIR=\"$HOME/.claude/voice-profiles/$PROFILE/learning/snapshots\"\nPIECE_NAME=\"$1\"\nTIMESTAMP=$(date +%Y%m%d-%H%M%S)\ncp \"$OUTPUT_FILE\" \"$SNAP_DIR/${PIECE_NAME}-${TIMESTAMP}-pre-review.md\"\n```\n\n### Post-review (automatic)\n\nCalled by voice-review after user completes advisory decisions:\n```bash\ncp \"$REVIEWED_FILE\" \"$SNAP_DIR/${PIECE_NAME}-${TIMESTAMP}-post-review.md\"\n```\n\n### Post-edit (user-triggered)\n\nUser runs `/voice-learn` after making manual edits:\n```bash\ncp \"$EDITED_FILE\" \"$SNAP_DIR/${PIECE_NAME}-${TIMESTAMP}-post-edit.md\"\n```\n\n## Snapshot Sets\n\nA complete set has all three stages with matching piece-name\nand timestamp prefix. Incomplete sets (missing post-edit) are\nignored by the learning agent until completed.\n\n## Manifest Tracking\n\nUpdate `manifest.json` learning section:\n```json\n{\n  \"learning\": {\n    \"snapshot_count\": 12,\n    \"complete_sets\": 4,\n    \"last_capture\": \"2026-04-10\",\n    \"last_learning_pass\": \"2026-04-09\"\n  }\n}\n```\n\n## Cleanup\n\nSnapshots older than 90 days with completed learning passes\ncan be archived or deleted. The accumulator retains the\npattern evidence independent of raw snapshots.\n\nFile v1.9.12:skill-card.md\n\n## Description: <br>\nImproves a voice profile by learning from manual edits to refine registers and reduce voice drift over time. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[athola](https://clawhub.ai/user/athola) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and writers use this skill after manual editing to compare generated, reviewed, and final drafts, identify recurring voice patterns, update accumulators, and propose profile rule changes for user approval. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: Edited writing samples and snapshots may contain sensitive draft content stored in the local voice profile. <br>\nMitigation: Review the snapshot folder periodically, avoid using the skill on confidential drafts, and remove snapshots that are no longer needed. <br>\nRisk: Accidental invocation could analyze or preserve drafts the user did not intend to use for voice learning. <br>\nMitigation: Narrow trigger terms or invoke the skill explicitly when accidental activation would be a problem. <br>\nRisk: Learning proposals may overfit one-off edits or introduce incorrect voice rules. <br>\nMitigation: Require user approval before applying proposed profile changes and hold patterns until the documented evidence threshold is met. <br>\n\n\n## Reference(s): <br>\n- [ClawHub Skill Page](https://clawhub.ai/athola/nm-scribe-voice-learn) <br>\n- [Scribe Plugin Homepage](https://github.com/athola/claude-night-market/tree/master/plugins/scribe) <br>\n- [Pattern Analysis Module](modules/pattern-analysis.md) <br>\n- [Snapshot Management Module](modules/snapshot-management.md) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, json, shell commands, configuration, guidance] <br>\n**Output Format:** [Markdown guidance with JSON examples and shell command snippets] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [May read and update local voice-profile snapshots, accumulator JSON, and approved profile rule files.] <br>\n\n## Skill Version(s): <br>\n1.9.12 (source: server release evidence; artifact frontmatter says 1.9.8) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>","readmeExcerpt":"Skill: voice-learn Owner: athola Summary: Improves a voice profile by learning from manual edits. Use after editing generated text to refine registers and close voice drift over time Tags: latest:1.9.19 Version history: v1.9.19 | 2026-08-26T13:22:35.086Z | user Release v1.9.19 v1.9.17 | 2026-07-30T05:42:28.143Z | user Release v1.9.17 v1.9.16 | 2026-07-14T19:59:18.245Z | user Release v1.9.16 v1.9.14 | 2026-06-30T18:06","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"PROFILE_DIR=\"$HOME/.claude/voice-profiles/{name}\"\nSNAP_DIR=\"$PROFILE_DIR/learning/snapshots\"\n\n# Find the most recent snapshot set\n# Format: {piece-name}-{timestamp}-{stage}.md"},{"language":"json","snippet":"{\n  \"patterns\": [\n    {\n      \"id\": \"pat-001\",\n      \"category\": \"tone_adjustment\",\n      \"description\": \"Softens confident claims about tool capabilities\",\n      \"instances\": [\n        {\"piece\": \"blog-post-1\", \"date\": \"2026-04-08\", \"diff\": \"...\"}\n      ],\n      \"target\": \"register\",\n      \"status\": \"accumulating\",\n      \"first_seen\": \"2026-04-08\",\n      \"last_seen\": \"2026-04-08\"\n    }\n  ],\n  \"staleness_threshold_days\": 30\n}"},{"language":"markdown","snippet":"## Proposed Update\n\n**Pattern**: {description}\n**Target**: {register file or craft-rules.md}\n**Evidence**: {N instances across M pieces}\n\n| Piece | Date | Change Made |\n|-------|------|-------------|\n| ... | ... | ... |\n\n**Proposed edit**:\n- File: {path}\n- Section: {section name}\n- Current: \"{current text or 'new addition'}\"\n- Proposed: \"{new text}\""},{"language":"text","snippet":"Holding: \"{pattern description}\" (N instances, need 3+)"},{"language":"text","snippet":"Contradiction detected:\n- Existing: \"{accumulator pattern}\"\n- New: \"{contradicting pattern}\"\n- Resolution required: user must choose"},{"language":"text","snippet":"Learning found N patterns ready to apply:\n\n[1] {pattern}: {proposed change}\n    Evidence: {N instances}\n    [a]pply / [s]kip / [v]iew evidence?\n\n[2] ..."}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: voice-learn\ndescription: |\n  Improves a voice profile by learning from manual edits. Use after editing generated text to refine registers and close voice drift over time\nversion: 1.9.8\ntriggers:\n  - voice\n  - learning\n  - improvement\n  - feedback\n  - iteration\nmetadata: {\"openclaw\": {\"homepage\": \"https://github.com/athola/claude-night-market/tree/master/plugins/scribe\", \"emoji\": \"\\u270d\\ufe0f\", \"requires\": {\"config\": [\"night-market.scribe:voice-extract\", \"night-market.scribe:voice-generate\", \"night-market.scribe:voice-review\"]}}}\nsource: claude-night-market\nsource_plugin: scribe\n---\n\n> **Night Market Skill** — ported from [claude-night-market/scribe](https://github.com/athola/claude-night-market/tree/master/plugins/scribe). For the full experience with agents, hooks, and commands, install the Claude Code plugin.\n\n\n# Voice Learning Skill\n\nLearn from user edits to improve the voice profile over time.\n\n## Method: Three-Stage Comparison\n\nEvery piece flows through three stages:\n1. **Pre-review**: Raw generation output (before review agents)\n2. **Post-review**: After user accepts/rejects advisory fixes\n3. **Post-edit**: User's manually edited final version\n\nThe learning agent compares stages 2 and 3 (post-review vs\npost-edit) to identify patterns in what the user changed.\nThese patterns inform register and rule updates.\n\n## Core Rules\n\n1. **Sharpen, don't add**: Modify existing rules to cover new\n   patterns. Rule bloat degrades output.\n2. **Tag specificity**: Register-specific patterns go to\n   registers. Universal patterns go to craft rules or agents.\n3. **Flag contradictions**: Opposite patterns across pieces\n   require user resolution.\n4. **Evidence threshold**: Patterns need 3+ instances (or 1-2\n   matching existing accumulator entries) before becoming rules.\n5. **Detection surface**: Structural changes increase AI\n   detectability. Craft-level changes are neutral. Prefer\n   craft-level updates.\n6. **Rule count check**: Suggest consolidation if any section\n   has 8+ rules.\n\n## Required TodoWrite Items\n\n1. `voice-learn:snapshots-loaded` - All three stages read\n2. `voice-learn:diff-analyzed` - Changes categorized\n3. `voice-learn:accumulator-checked` - Prior patterns reviewed\n4. `voice-learn:proposals-generated` - Updates proposed\n5. `voice-learn:user-approved` - Changes accepted by user\n\n## Step 1: Load Snapshots\n\nLoad: `@modules/snapshot-management`\n\n```bash\nPROFILE_DIR=\"$HOME/.claude/voice-profiles/{name}\"\nSNAP_DIR=\"$PROFILE_DIR/learning/snapshots\"\n\n# Find the most recent snapshot set\n# Format: {piece-name}-{timestamp}-{stage}.md\n```\n\nRead all three stages for the target piece.\n\n## Step 2: Diff Analysis\n\nLoad: `@modules/pattern-analysis`\n\nCompare post-review vs post-edit. Categorize every change:\n\n| Category | Example |\n|----------|---------|\n| Tone adjustment | Softened a claim, added hedge |\n| Voice insertion | Added parenthetical, aside, humor |\n| Structure change | Broke paragraph, reordered |\n| Precision edit | Replaced vague with s"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7d107jg9jv602h9ytsegydq184a42s\",\n  \"slug\": \"nm-scribe-voice-learn\",\n  \"version\": \"1.9.19\",\n  \"publishedAt\": 1787750555086\n}"},{"path":"modules/pattern-analysis.md","content":"---\nmodule: pattern-analysis\ncategory: voice-learning\ndependencies: [Read, Agent]\nestimated_tokens: 500\n---\n\n# Pattern Analysis Module\n\nAnalyze diffs between post-review and post-edit snapshots\nto extract recurring edit patterns.\n\n## Diff Categories\n\n| Category | Signal | Example |\n|----------|--------|---------|\n| tone_adjustment | Softened/strengthened claims | \"This proves\" -> \"This suggests\" |\n| voice_insertion | Added writer-specific moves | Added parenthetical aside |\n| structure_change | Reordered, split, merged | Broke long paragraph into two |\n| precision_edit | Vague -> specific | \"many people\" -> \"the 12 engineers\" |\n| deletion | Removed fluff | Cut \"It's worth noting that\" |\n| addition | Added context | Added a concrete example |\n| humor_or_irreverence | Added informal voice | Added \"(fuck GPTZero)\" |\n| hedge_or_commit | Changed certainty level | \"will\" -> \"should\" or vice versa |\n\n## Analysis Prompt\n\n```\nCompare these two versions of the same text:\n\nVERSION A (post-review, before manual edits):\n{post_review_text}\n\nVERSION B (post-edit, after manual edits):\n{post_edit_text}\n\nFor each change the writer made:\n1. Identify the specific edit (what changed)\n2. Categorize it (from the categories above)\n3. Describe the pattern (what principle drove this edit?)\n4. Assess specificity: is this a general writing preference\n   or specific to this voice?\n\nFocus on RECURRING patterns, not one-off fixes. If the same\ntype of edit appears 2+ times, that's a voice signal.\n\nOutput as a list of patterns with evidence.\n```\n\n## Pattern Matching Against Accumulator\n\nFor each identified pattern, check the accumulator:\n\n```python\ndef match_pattern(new_pattern, accumulator):\n    \"\"\"Match using category + semantic similarity.\"\"\"\n    for existing in accumulator[\"patterns\"]:\n        if existing[\"category\"] == new_pattern[\"category\"]:\n            # Semantic similarity check (same intent?)\n            if similar_description(existing, new_pattern):\n                return existing  # Merge with this entry\n    return None  # New pattern\n```\n\n## Evidence Requirements\n\n| Action | Threshold |\n|--------|-----------|\n| Apply to register | 3+ instances across 2+ pieces |\n| Apply with accumulator match | 1-2 new and 2 prior instances |\n| Hold in accumulator | 1-2 instances, no prior match |\n| Discard | Contradicts 3+ counter-examples |\n\n## Output Format\n\n```json\n{\n  \"patterns_found\": [\n    {\n      \"category\": \"tone_adjustment\",\n      \"description\": \"Softens confident claims about capabilities\",\n      \"instances\": [\n        {\"line\": 12, \"before\": \"...\", \"after\": \"...\"},\n        {\"line\": 34, \"before\": \"...\", \"after\": \"...\"}\n      ],\n      \"recommendation\": \"apply|hold|discard\",\n      \"target\": \"register|craft-rules|prose-reviewer\",\n      \"proposed_edit\": \"...\"\n    }\n  ]\n}\n```"},{"path":"modules/snapshot-management.md","content":"---\nmodule: snapshot-management\ncategory: voice-learning\ndependencies: [Bash, Write, Read]\nestimated_tokens: 400\n---\n\n# Snapshot Management Module\n\nCapture and organize text snapshots for the learning loop.\n\n## Snapshot Stages\n\n| Stage | When Captured | Purpose |\n|-------|--------------|---------|\n| pre-review | After generation, before review agents | Baseline output |\n| post-review | After user accepts/rejects advisories | Review impact |\n| post-edit | When user runs /voice-learn | Manual edit patterns |\n\n## File Naming\n\n```\n{piece-name}-{YYYYMMDD-HHMMSS}-{stage}.md\n```\n\nExample:\n```\nblog-api-design-20260410-143022-pre-review.md\nblog-api-design-20260410-143022-post-review.md\nblog-api-design-20260410-145511-post-edit.md\n```\n\n## Capture Commands\n\n### Pre-review (automatic)\n\nCalled by voice-generate after producing text:\n```bash\nSNAP_DIR=\"$HOME/.claude/voice-profiles/$PROFILE/learning/snapshots\"\nPIECE_NAME=\"$1\"\nTIMESTAMP=$(date +%Y%m%d-%H%M%S)\ncp \"$OUTPUT_FILE\" \"$SNAP_DIR/${PIECE_NAME}-${TIMESTAMP}-pre-review.md\"\n```\n\n### Post-review (automatic)\n\nCalled by voice-review after user completes advisory decisions:\n```bash\ncp \"$REVIEWED_FILE\" \"$SNAP_DIR/${PIECE_NAME}-${TIMESTAMP}-post-review.md\"\n```\n\n### Post-edit (user-triggered)\n\nUser runs `/voice-learn` after making manual edits:\n```bash\ncp \"$EDITED_FILE\" \"$SNAP_DIR/${PIECE_NAME}-${TIMESTAMP}-post-edit.md\"\n```\n\n## Snapshot Sets\n\nA complete set has all three stages with matching piece-name\nand timestamp prefix. Incomplete sets (missing post-edit) are\nignored by the learning agent until completed.\n\n## Manifest Tracking\n\nUpdate `manifest.json` learning section:\n```json\n{\n  \"learning\": {\n    \"snapshot_count\": 12,\n    \"complete_sets\": 4,\n    \"last_capture\": \"2026-04-10\",\n    \"last_learning_pass\": \"2026-04-09\"\n  }\n}\n```\n\n## Cleanup\n\nSnapshots older than 90 days with completed learning passes\ncan be archived or deleted. The accumulator retains the\npattern evidence independent of raw snapshots."},{"path":"skill-card.md","content":"## Description:\n\nImproves a voice profile by learning from manual edits to refine registers and close voice drift over time.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[athola](https://clawhub.ai/user/athola)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and writers use this skill after manually editing generated text to compare review-stage and final drafts, extract recurring voice patterns, and propose updates to voice profile rules.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill can persist edited content, review snapshots, and profile changes under a local voice profile directory.\n\nMitigation: Use it only for voice-profile workflows where snapshot retention is acceptable, and avoid sensitive drafts unless local retention has been reviewed.\n\nRisk: Snapshot path handling is under-scoped for piece names used in snapshot commands.\n\nMitigation: Constrain piece names to safe filename characters before any snapshot command runs.\n\nRisk: Learned patterns can introduce incorrect or unwanted voice rules if weak signals are applied too early.\n\nMitigation: Require user approval for proposed updates and keep insufficient evidence in the accumulator until the documented threshold is met.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/athola/skills/nm-scribe-voice-learn)\n- [ClawHub publisher profile](https://clawhub.ai/user/athola)\n- [Scribe plugin homepage](https://github.com/athola/claude-night-market/tree/master/plugins/scribe)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, json, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with JSON pattern summaries and shell command examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May propose edits to local voice profile files after user approval.]\n\n## Skill Version(s):\n\n1.9.19 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Improves a voice profile by learning from manual edits. Use after editing generated text to refine registers and close voice drift over time Skill: voice-learn Owner: athola Summary: Improves a voice profile by learning from manual edits. Use after editing generated text to refine registers and close voice drift over time Tags: latest:1.9.19 Version history: v1.9.19 | 2026-08-26T13:22:35.086Z | user Release v1.9.19 v1.9.17 | 2026-07-30T05:42:28.143Z | user Release v1.9.17 v1.9.16 | 2026-07-14T19:59:18.245Z | user Release v1.9.16 v1.9.14 | 2026-06-30T18:06","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1365,"uniquenessScore":50,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-12T01:49:12.724Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-12T01:49:12.724Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-13T05:03:59.472Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}