{"id":"e32a5951-c7be-4b9a-8f4c-96b76d81800b","entityType":"agent","slug":"clawhub-athola-nm-scribe-voice-generate","name":"voice-generate","canonicalUrl":"https://www.xpersona.co/agent/clawhub-athola-nm-scribe-voice-generate","canonicalPath":"/agent/clawhub-athola-nm-scribe-voice-generate","generatedAt":"2026-10-13T02:49:51.197Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-12T00:24:24.802Z","emptyReason":null},"description":"Generates text in a learned writing voice Skill: voice-generate Owner: athola Summary: Generates text in a learned writing voice Tags: latest:1.9.19 Version history: v1.9.19 | 2026-08-26T13:22:29.704Z | user Release v1.9.19 v1.9.17 | 2026-07-30T05:42:22.863Z | user Release v1.9.17 v1.9.16 | 2026-07-14T19:59:13.123Z | user Release v1.9.16 v1.9.14 | 2026-06-30T18:06:44.869Z | user Release v1.9.14 v1.9.13 | 2026-06-27T16:24:27.328Z | user Release v1.9.13 v1.9.1","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 968 downloads reported by the source. Last updated 10/12/2026.","installCommand":"clawhub skill install s17emme0e2m3cpf7k2jvp3a84984b8z9:nm-scribe-voice-generate","sourceUrl":"https://clawhub.ai/athola/nm-scribe-voice-generate","homepage":"https://clawhub.ai/athola/skills/nm-scribe-voice-generate","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/athola/nm-scribe-voice-generate","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/athola/skills/nm-scribe-voice-generate","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":60,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Generates text in a learned writing voice Skill: voice-generate Owner: athola Summary: Generates text in a learned writing voice Tags: latest:1.9.19 Version his"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-12T00:24:24.802Z","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-12T00:24:24.802Z","emptyReason":null},"stars":null,"forks":null,"downloads":968,"likes":null,"task":null,"library":null,"packageName":null,"latestVersion":"1.9.19","tractionLabel":"968 downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-12T00:24:24.736Z","emptyReason":null},"lastUpdatedAt":"2026-10-12T00:24:24.802Z","lastCrawledAt":"2026-10-12T00:24:24.736Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-13T00:24:24.736Z","lastVerifiedAt":null,"highlights":[{"version":"1.9.19","createdAt":"2026-08-26T13:22:29.704Z","changelog":"Release v1.9.19","fileCount":6,"zipByteSize":7575},{"version":"1.9.17","createdAt":"2026-07-30T05:42:22.863Z","changelog":"Release v1.9.17","fileCount":6,"zipByteSize":7534},{"version":"1.9.16","createdAt":"2026-07-14T19:59:13.123Z","changelog":"Release v1.9.16","fileCount":6,"zipByteSize":7558},{"version":"1.9.14","createdAt":"2026-06-30T18:06:44.869Z","changelog":"Release v1.9.14","fileCount":6,"zipByteSize":7563},{"version":"1.9.13","createdAt":"2026-06-27T16:24:27.328Z","changelog":"Release v1.9.13","fileCount":6,"zipByteSize":7532},{"version":"1.9.12","createdAt":"2026-06-19T03:20:16.377Z","changelog":"Release v1.9.12","fileCount":6,"zipByteSize":7497}]},"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-generate","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-generate/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-athola-nm-scribe-voice-generate/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-athola-nm-scribe-voice-generate/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-athola-nm-scribe-voice-generate/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-athola-nm-scribe-voice-generate/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-athola-nm-scribe-voice-generate/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-13T02:49:51.196Z"}},"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-generate/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-athola-nm-scribe-voice-generate/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-athola-nm-scribe-voice-generate/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-athola-nm-scribe-voice-generate/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-12T00:24:24.802Z","emptyReason":null},"readme":"Skill: voice-generate\n\nOwner: athola\n\nSummary: Generates text in a learned writing voice\n\nTags: latest:1.9.19\n\nVersion history:\n\nv1.9.19 | 2026-08-26T13:22:29.704Z | user\n\nRelease v1.9.19\n\nv1.9.17 | 2026-07-30T05:42:22.863Z | user\n\nRelease v1.9.17\n\nv1.9.16 | 2026-07-14T19:59:13.123Z | user\n\nRelease v1.9.16\n\nv1.9.14 | 2026-06-30T18:06:44.869Z | user\n\nRelease v1.9.14\n\nv1.9.13 | 2026-06-27T16:24:27.328Z | user\n\nRelease v1.9.13\n\nv1.9.12 | 2026-06-19T03:20:16.377Z | user\n\nRelease v1.9.12\n\nArchive index:\n\nArchive v1.9.19: 6 files, 7575 bytes\n\nFiles: modules/generation-pipeline.md (2197b), modules/register-selection.md (1672b), modules/source-framing.md (2186b), skill-card.md (2351b), SKILL.md (5452b), _meta.json (144b)\n\nFile v1.9.19:SKILL.md\n\n---\nname: voice-generate\ndescription: Generates text in a learned writing voice\nversion: 1.9.8\ntriggers:\n  - voice\n  - generation\n  - style-transfer\n  - writing\n  - registers\n  - drafting content that must match a specific author's style profile extracted by voice-extract\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:slop-detector\"]}}}\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 Generation Skill\n\nGenerate text in a user's extracted writing voice.\n\n## Core Principle: Source Material Framing\n\nThe single largest variable in output quality is how source\nmaterial is framed in the prompt. Material framed as \"raw\nnotes I'm still thinking through\" produces text that feels\nlike thinking. Material framed as summaries produces reporting.\n\nAlways frame user-provided source material as raw notes unless\nthe user explicitly requests otherwise.\n\n## Required TodoWrite Items\n\n1. `voice-generate:profile-loaded` - Voice profile read\n2. `voice-generate:register-selected` - Register chosen\n3. `voice-generate:source-framed` - Material framed as notes\n4. `voice-generate:generated` - Text produced\n5. `voice-generate:review-dispatched` - Sent to review agents\n\n## Step 1: Load Voice Profile\n\n```bash\nPROFILE_DIR=\"$HOME/.claude/voice-profiles/{name}\"\n```\n\nRead in order:\n1. `extraction.md` - Core voice features\n2. `registers/{register}.md` - Active register\n3. `craft-rules.md` - Shared craft techniques (if exists)\n4. `banned-phrases.md` - Anti-patterns to avoid (if exists)\n\nCheck for per-project override:\n```bash\nif [ -f \".voice/override.md\" ]; then\n  # Merge project overrides with profile\nfi\n```\n\n## Step 2: Register Selection\n\nLoad: `@modules/register-selection`\n\nSelect register by:\n1. Explicit user request (\"use casual register\")\n2. Context matching from register metadata\n3. Default fallback to `registers/default.md`\n\n## Step 3: Frame Source Material\n\nLoad: `@modules/source-framing`\n\n**Default framing** (always use unless user overrides):\n\n```\nBelow are my rough notes on this topic. I'm still thinking\nthrough these ideas. Use them as the raw material for the\npiece, not as a structure to follow:\n\n---\n{user_provided_source_material}\n---\n```\n\n**Alternative framings** (only if user requests):\n- \"structured outline\" - when user wants to preserve structure\n- \"key points to cover\" - when user provides bullet points\n- \"conversation to draw from\" - when source is a transcript\n\n## Step 4: Generation Prompt\n\nCompose the generation prompt:\n\n```\nYou are writing a piece in a specific voice. The voice\nfeatures below were extracted from the writer's own work.\nFollow them as concrete instructions, not suggestions.\n\n## Voice Features\n\n{extraction.md content}\n\n## Active Register: {register_name}\n\n{register content}\n\n## Craft Techniques (apply all)\n\n- Concrete-first: Lead with specific, physical details before\n  any abstraction\n- Naming: When you describe a pattern in 2+ sentences, compress\n  it into a 2-4 word label\n- Opening moves: Start mid-thought, with a specific moment, or\n  with a counterintuitive claim. Never start with throat-clearing\n- Human-moment anchoring: Ground every abstraction in a specific\n  scene or lived experience\n- Aphoristic destinations: At least one sentence per section\n  should be worth repeating out of context\n\n## Banned (never use)\n\n{banned_phrases content, or default list:}\n- Em dashes (use commas, colons, semicolons, parentheses)\n- \"delve\", \"utilize\", \"leverage\", \"facilitate\"\n- \"it's important to note\", \"in today's world\"\n- \"here's the thing\", \"let that sink in\"\n- \"furthermore\", \"moreover\", \"comprehensive\"\n- Negation-correction patterns (\"This isn't X. This is Y.\")\n\n## Source Material\n\n{framed source material from Step 3}\n\n## Task\n\nWrite the piece. Follow the voice features precisely. Apply\ncraft techniques. Do not use any banned phrases. The output\nshould read as if the writer produced it themselves.\n\nLength: {user_specified or ~same as source material}\nFormat: {user_specified or prose paragraphs}\n```\n\n## Step 5: Post-Generation\n\nAfter generation:\n1. Scan output for banned phrases (auto-fix silently)\n2. Check for em dashes (replace with appropriate punctuation)\n3. Dispatch to voice-review skill if user wants review\n4. Save pre-review snapshot if learning mode is active\n\n## Model Routing\n\n- **Generation**: Use Opus. Tonal shifts, parenthetical\n  subversion, and subtle voice qualities require the larger\n  model. Sonnet flattens these.\n- **Banned phrase scan**: Can run locally (regex/grep)\n- **Review agents**: Sonnet is sufficient (the prompts are\n  templated, so Opus tonal range is not needed)\n\n## Per-Project Voice\n\nIf `.voice/override.md` exists in the current project:\n- Read override content\n- Merge with profile (overrides take precedence)\n- Note in output: \"Applied project voice override\"\n\n## Exit Criteria\n\n- Text generated in the specified voice\n- No banned phrases present\n- Craft techniques applied (concrete-first, naming, etc.)\n- Source material framed as raw notes\n- Review dispatched (if requested)\n- Snapshot saved (if learning mode active)\n\nFile v1.9.19:_meta.json\n\n{\n  \"ownerId\": \"kn7d107jg9jv602h9ytsegydq184a42s\",\n  \"slug\": \"nm-scribe-voice-generate\",\n  \"version\": \"1.9.19\",\n  \"publishedAt\": 1787750549704\n}\n\nFile v1.9.19:modules/generation-pipeline.md\n\n---\nmodule: generation-pipeline\ncategory: voice-generation\ndependencies: [Read, Write, Agent]\nestimated_tokens: 500\n---\n\n# Generation Pipeline Module\n\nEnd-to-end generation flow from source material to reviewed text.\n\n## Pipeline Stages\n\n```\nSource Material\n    |\n    v\n[Frame as raw notes]\n    |\n    v\n[Load profile + register + craft rules]\n    |\n    v\n[Generate with Opus]\n    |\n    v\n[Auto-fix: banned phrases, em dashes]\n    |\n    v\n[Snapshot: pre-review] (if learning active)\n    |\n    v\n[Dispatch review agents] (optional)\n    |\n    v\n[Present advisories to user]\n    |\n    v\n[Apply user decisions]\n    |\n    v\n[Snapshot: post-review] (if learning active)\n    |\n    v\nFinal text (user may edit further)\n    |\n    v\n[/voice-learn captures post-edit] (user-triggered)\n```\n\n## Auto-Fix Rules (Silent)\n\nApplied immediately after generation, before review:\n\n```bash\n# Em dash replacement (context-aware)\n# Before a clause: use comma or colon\n# Parenthetical: use parentheses\n# List separator: use semicolons\n\n# Banned phrase removal\n# \"Furthermore,\" -> \"\" (start sentence without it)\n# \"It's important to note\" -> \"\" (remove entirely)\n# \"delve\" -> \"explore\" or \"examine\"\n# \"utilize\" -> \"use\"\n# \"leverage\" -> \"use\" or remove\n# \"comprehensive\" -> \"thorough\" or \"complete\"\n# \"robust\" -> \"solid\" or remove\n# \"seamless\" -> \"smooth\" or remove\n```\n\n## Model Routing\n\n| Stage | Model | Reason |\n|-------|-------|--------|\n| Generation | Opus | Tonal shifts, parenthetical subversion |\n| Auto-fix | Regex/local | No model needed |\n| Prose review | Sonnet | Structured detection prompts |\n| Craft review | Sonnet | Structured evaluation prompts |\n| Learning analysis | Opus | Nuanced pattern comparison |\n\n## Error Recovery\n\nIf generation fails quality checks (> 5 hard failures):\n1. Re-generate with stronger emphasis on banned phrases\n2. If second attempt still fails, present to user with warning\n3. Never loop more than twice (prevents infinite retry)\n\n## Streaming Considerations\n\nFor long-form content (> 1000 words):\n- Generate in sections (one per major heading)\n- Apply auto-fix per section\n- Allow user to review section-by-section or all at once\n- Snapshot captures the complete assembled text\n\nFile v1.9.19:modules/register-selection.md\n\n---\nmodule: register-selection\ncategory: voice-generation\ndependencies: [Read, Bash]\nestimated_tokens: 300\n---\n\n# Register Selection Module\n\nChoose the appropriate voice register for generation.\n\n## Selection Priority\n\n1. **Explicit request**: User says \"use casual register\"\n2. **Context match**: Register metadata matches the task\n3. **Default**: Fall back to `registers/default.md`\n\n## Context Matching\n\nEach register file has a `## Context` section describing\nwhen to use it. Match against the user's stated purpose:\n\n```\nUser: \"Write a blog post about...\"     -> default or narrative\nUser: \"Draft a technical doc for...\"   -> technical\nUser: \"Reply to this Reddit thread...\" -> casual\nUser: \"Write an email to my team...\"   -> professional\n```\n\n## Register Loading\n\n```bash\nPROFILE_DIR=\"$HOME/.claude/voice-profiles/$PROFILE_NAME\"\nREGISTER_FILE=\"$PROFILE_DIR/registers/${REGISTER_NAME}.md\"\n\nif [ ! -f \"$REGISTER_FILE\" ]; then\n  echo \"Register '$REGISTER_NAME' not found. Available:\"\n  ls \"$PROFILE_DIR/registers/\"\n  echo \"Using default register.\"\n  REGISTER_FILE=\"$PROFILE_DIR/registers/default.md\"\nfi\n```\n\n## Inheritance\n\nNon-default registers inherit from default unless they\nexplicitly override a section. When loading a non-default\nregister:\n\n1. Read `default.md` as base\n2. Read `{name}.md` for overrides and additions\n3. Merge: override sections replace, additions append\n\n## Listing Available Registers\n\nWhen user asks what registers exist:\n\n```bash\necho \"Available voice registers for $PROFILE_NAME:\"\nfor f in \"$PROFILE_DIR/registers/\"*.md; do\n  name=$(basename \"$f\" .md)\n  context=$(grep -A1 \"^## Context\" \"$f\" | tail -1)\n  echo \"  $name: $context\"\ndone\n```\n\nFile v1.9.19:modules/source-framing.md\n\n---\nmodule: source-framing\ncategory: voice-generation\ndependencies: []\nestimated_tokens: 400\n---\n\n# Source Framing Module\n\nHow source material is framed in the prompt is the single\nlargest variable in output quality. Larger than voice rules.\nLarger than model choice.\n\n## The Framing Lever\n\nWhen material is framed as \"raw notes I'm still thinking\nthrough,\" the output is dramatically better than when framed\nas \"a transcript to draw on\" or a bare topic sentence.\n\nThe framing changes how the model relates to the material:\n- Notes to think through -> text that feels like thinking\n- Summaries to report on -> text that feels like reporting\n- Transcripts to draw from -> text that feels like paraphrase\n\n## Default Framing (always use)\n\n```\nBelow are my rough notes on this topic. I'm still working\nthrough these ideas and haven't settled on a final structure.\nUse them as raw material for thinking, not as an outline\nto follow:\n\n---\n{source_material}\n---\n\nWrite a piece that engages with these ideas in the voice\ndescribed above. You don't need to cover everything in the\nnotes. Follow where the interesting threads lead.\n```\n\n## When User Provides Structured Input\n\nIf the user gives bullet points or an outline, still\nreframe as notes:\n\n```\nBelow are my working notes. These bullet points represent\nthreads I'm pulling on, not a structure to reproduce:\n\n---\n{bullet_points}\n---\n```\n\n## When User Provides a Topic Only\n\nIf just a topic sentence or phrase:\n\n```\nI want to write about: {topic}\n\nHere's what I'm thinking so far: I don't have notes yet,\nbut the angle I'm interested in is {topic}. Write an\nexploratory piece that discovers its argument as it goes.\n```\n\n## Override Framings\n\nOnly use these if the user explicitly requests a different\nrelationship to the source material:\n\n### \"Preserve my structure\"\n```\nBelow is an outline I want to follow. Keep the structure\nbut write each section in the voice described above:\n```\n\n### \"Respond to this\"\n```\nBelow is something I'm responding to. Write a response\nin the voice described above:\n```\n\n### \"Expand these points\"\n```\nBelow are key points I want to develop. Expand each one\ninto full prose in the voice described above:\n```\n\nFile v1.9.19:skill-card.md\n\n## Description:\n\nGenerates text in a learned writing voice.\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\nWriters and developers use this skill to draft prose in a learned writing voice from an extracted profile, selected register, and source material framed as raw notes.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill reads local voice-profile files and may apply a project-level .voice/override.md file.\n\nMitigation: Use it only in trusted repositories and review project voice overrides before generation.\n\nRisk: Unvalidated profile or register names can lead the agent to read or apply unintended Markdown files.\n\nMitigation: Use known profile and register names, prefer strict filename validation, and confirm fallback behavior before accepting generated output.\n\nRisk: Generated text may overfit a learned voice or silently alter phrasing during banned-phrase cleanup.\n\nMitigation: Review generated drafts before publication and keep review-agent or human review enabled for sensitive uses.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/athola/skills/nm-scribe-voice-generate)\n- [claude-night-market scribe plugin](https://github.com/athola/claude-night-market/tree/master/plugins/scribe)\n- [Generation pipeline module](artifact/modules/generation-pipeline.md)\n- [Register selection module](artifact/modules/register-selection.md)\n- [Source framing module](artifact/modules/source-framing.md)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, guidance]\n\n**Output Format:** [Markdown or prose text, with optional inline shell-command guidance for profile and register handling.]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May silently post-process generated text to remove banned phrases and replace em dashes; can optionally dispatch review agents.]\n\n## Skill Version(s):\n\n1.9.19 (source: server release metadata; artifact frontmatter reports 1.9.8)\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: 6 files, 7534 bytes\n\nFiles: modules/generation-pipeline.md (2197b), modules/register-selection.md (1672b), modules/source-framing.md (2186b), skill-card.md (2402b), SKILL.md (5452b), _meta.json (144b)\n\nFile v1.9.17:SKILL.md\n\n---\nname: voice-generate\ndescription: Generates text in a learned writing voice\nversion: 1.9.8\ntriggers:\n  - voice\n  - generation\n  - style-transfer\n  - writing\n  - registers\n  - drafting content that must match a specific author's style profile extracted by voice-extract\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:slop-detector\"]}}}\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 Generation Skill\n\nGenerate text in a user's extracted writing voice.\n\n## Core Principle: Source Material Framing\n\nThe single largest variable in output quality is how source\nmaterial is framed in the prompt. Material framed as \"raw\nnotes I'm still thinking through\" produces text that feels\nlike thinking. Material framed as summaries produces reporting.\n\nAlways frame user-provided source material as raw notes unless\nthe user explicitly requests otherwise.\n\n## Required TodoWrite Items\n\n1. `voice-generate:profile-loaded` - Voice profile read\n2. `voice-generate:register-selected` - Register chosen\n3. `voice-generate:source-framed` - Material framed as notes\n4. `voice-generate:generated` - Text produced\n5. `voice-generate:review-dispatched` - Sent to review agents\n\n## Step 1: Load Voice Profile\n\n```bash\nPROFILE_DIR=\"$HOME/.claude/voice-profiles/{name}\"\n```\n\nRead in order:\n1. `extraction.md` - Core voice features\n2. `registers/{register}.md` - Active register\n3. `craft-rules.md` - Shared craft techniques (if exists)\n4. `banned-phrases.md` - Anti-patterns to avoid (if exists)\n\nCheck for per-project override:\n```bash\nif [ -f \".voice/override.md\" ]; then\n  # Merge project overrides with profile\nfi\n```\n\n## Step 2: Register Selection\n\nLoad: `@modules/register-selection`\n\nSelect register by:\n1. Explicit user request (\"use casual register\")\n2. Context matching from register metadata\n3. Default fallback to `registers/default.md`\n\n## Step 3: Frame Source Material\n\nLoad: `@modules/source-framing`\n\n**Default framing** (always use unless user overrides):\n\n```\nBelow are my rough notes on this topic. I'm still thinking\nthrough these ideas. Use them as the raw material for the\npiece, not as a structure to follow:\n\n---\n{user_provided_source_material}\n---\n```\n\n**Alternative framings** (only if user requests):\n- \"structured outline\" - when user wants to preserve structure\n- \"key points to cover\" - when user provides bullet points\n- \"conversation to draw from\" - when source is a transcript\n\n## Step 4: Generation Prompt\n\nCompose the generation prompt:\n\n```\nYou are writing a piece in a specific voice. The voice\nfeatures below were extracted from the writer's own work.\nFollow them as concrete instructions, not suggestions.\n\n## Voice Features\n\n{extraction.md content}\n\n## Active Register: {register_name}\n\n{register content}\n\n## Craft Techniques (apply all)\n\n- Concrete-first: Lead with specific, physical details before\n  any abstraction\n- Naming: When you describe a pattern in 2+ sentences, compress\n  it into a 2-4 word label\n- Opening moves: Start mid-thought, with a specific moment, or\n  with a counterintuitive claim. Never start with throat-clearing\n- Human-moment anchoring: Ground every abstraction in a specific\n  scene or lived experience\n- Aphoristic destinations: At least one sentence per section\n  should be worth repeating out of context\n\n## Banned (never use)\n\n{banned_phrases content, or default list:}\n- Em dashes (use commas, colons, semicolons, parentheses)\n- \"delve\", \"utilize\", \"leverage\", \"facilitate\"\n- \"it's important to note\", \"in today's world\"\n- \"here's the thing\", \"let that sink in\"\n- \"furthermore\", \"moreover\", \"comprehensive\"\n- Negation-correction patterns (\"This isn't X. This is Y.\")\n\n## Source Material\n\n{framed source material from Step 3}\n\n## Task\n\nWrite the piece. Follow the voice features precisely. Apply\ncraft techniques. Do not use any banned phrases. The output\nshould read as if the writer produced it themselves.\n\nLength: {user_specified or ~same as source material}\nFormat: {user_specified or prose paragraphs}\n```\n\n## Step 5: Post-Generation\n\nAfter generation:\n1. Scan output for banned phrases (auto-fix silently)\n2. Check for em dashes (replace with appropriate punctuation)\n3. Dispatch to voice-review skill if user wants review\n4. Save pre-review snapshot if learning mode is active\n\n## Model Routing\n\n- **Generation**: Use Opus. Tonal shifts, parenthetical\n  subversion, and subtle voice qualities require the larger\n  model. Sonnet flattens these.\n- **Banned phrase scan**: Can run locally (regex/grep)\n- **Review agents**: Sonnet is sufficient (the prompts are\n  templated, so Opus tonal range is not needed)\n\n## Per-Project Voice\n\nIf `.voice/override.md` exists in the current project:\n- Read override content\n- Merge with profile (overrides take precedence)\n- Note in output: \"Applied project voice override\"\n\n## Exit Criteria\n\n- Text generated in the specified voice\n- No banned phrases present\n- Craft techniques applied (concrete-first, naming, etc.)\n- Source material framed as raw notes\n- Review dispatched (if requested)\n- Snapshot saved (if learning mode active)\n\nFile v1.9.17:_meta.json\n\n{\n  \"ownerId\": \"kn7d107jg9jv602h9ytsegydq184a42s\",\n  \"slug\": \"nm-scribe-voice-generate\",\n  \"version\": \"1.9.17\",\n  \"publishedAt\": 1785390142863\n}\n\nFile v1.9.17:modules/generation-pipeline.md\n\n---\nmodule: generation-pipeline\ncategory: voice-generation\ndependencies: [Read, Write, Agent]\nestimated_tokens: 500\n---\n\n# Generation Pipeline Module\n\nEnd-to-end generation flow from source material to reviewed text.\n\n## Pipeline Stages\n\n```\nSource Material\n    |\n    v\n[Frame as raw notes]\n    |\n    v\n[Load profile + register + craft rules]\n    |\n    v\n[Generate with Opus]\n    |\n    v\n[Auto-fix: banned phrases, em dashes]\n    |\n    v\n[Snapshot: pre-review] (if learning active)\n    |\n    v\n[Dispatch review agents] (optional)\n    |\n    v\n[Present advisories to user]\n    |\n    v\n[Apply user decisions]\n    |\n    v\n[Snapshot: post-review] (if learning active)\n    |\n    v\nFinal text (user may edit further)\n    |\n    v\n[/voice-learn captures post-edit] (user-triggered)\n```\n\n## Auto-Fix Rules (Silent)\n\nApplied immediately after generation, before review:\n\n```bash\n# Em dash replacement (context-aware)\n# Before a clause: use comma or colon\n# Parenthetical: use parentheses\n# List separator: use semicolons\n\n# Banned phrase removal\n# \"Furthermore,\" -> \"\" (start sentence without it)\n# \"It's important to note\" -> \"\" (remove entirely)\n# \"delve\" -> \"explore\" or \"examine\"\n# \"utilize\" -> \"use\"\n# \"leverage\" -> \"use\" or remove\n# \"comprehensive\" -> \"thorough\" or \"complete\"\n# \"robust\" -> \"solid\" or remove\n# \"seamless\" -> \"smooth\" or remove\n```\n\n## Model Routing\n\n| Stage | Model | Reason |\n|-------|-------|--------|\n| Generation | Opus | Tonal shifts, parenthetical subversion |\n| Auto-fix | Regex/local | No model needed |\n| Prose review | Sonnet | Structured detection prompts |\n| Craft review | Sonnet | Structured evaluation prompts |\n| Learning analysis | Opus | Nuanced pattern comparison |\n\n## Error Recovery\n\nIf generation fails quality checks (> 5 hard failures):\n1. Re-generate with stronger emphasis on banned phrases\n2. If second attempt still fails, present to user with warning\n3. Never loop more than twice (prevents infinite retry)\n\n## Streaming Considerations\n\nFor long-form content (> 1000 words):\n- Generate in sections (one per major heading)\n- Apply auto-fix per section\n- Allow user to review section-by-section or all at once\n- Snapshot captures the complete assembled text\n\nFile v1.9.17:modules/register-selection.md\n\n---\nmodule: register-selection\ncategory: voice-generation\ndependencies: [Read, Bash]\nestimated_tokens: 300\n---\n\n# Register Selection Module\n\nChoose the appropriate voice register for generation.\n\n## Selection Priority\n\n1. **Explicit request**: User says \"use casual register\"\n2. **Context match**: Register metadata matches the task\n3. **Default**: Fall back to `registers/default.md`\n\n## Context Matching\n\nEach register file has a `## Context` section describing\nwhen to use it. Match against the user's stated purpose:\n\n```\nUser: \"Write a blog post about...\"     -> default or narrative\nUser: \"Draft a technical doc for...\"   -> technical\nUser: \"Reply to this Reddit thread...\" -> casual\nUser: \"Write an email to my team...\"   -> professional\n```\n\n## Register Loading\n\n```bash\nPROFILE_DIR=\"$HOME/.claude/voice-profiles/$PROFILE_NAME\"\nREGISTER_FILE=\"$PROFILE_DIR/registers/${REGISTER_NAME}.md\"\n\nif [ ! -f \"$REGISTER_FILE\" ]; then\n  echo \"Register '$REGISTER_NAME' not found. Available:\"\n  ls \"$PROFILE_DIR/registers/\"\n  echo \"Using default register.\"\n  REGISTER_FILE=\"$PROFILE_DIR/registers/default.md\"\nfi\n```\n\n## Inheritance\n\nNon-default registers inherit from default unless they\nexplicitly override a section. When loading a non-default\nregister:\n\n1. Read `default.md` as base\n2. Read `{name}.md` for overrides and additions\n3. Merge: override sections replace, additions append\n\n## Listing Available Registers\n\nWhen user asks what registers exist:\n\n```bash\necho \"Available voice registers for $PROFILE_NAME:\"\nfor f in \"$PROFILE_DIR/registers/\"*.md; do\n  name=$(basename \"$f\" .md)\n  context=$(grep -A1 \"^## Context\" \"$f\" | tail -1)\n  echo \"  $name: $context\"\ndone\n```\n\nFile v1.9.17:modules/source-framing.md\n\n---\nmodule: source-framing\ncategory: voice-generation\ndependencies: []\nestimated_tokens: 400\n---\n\n# Source Framing Module\n\nHow source material is framed in the prompt is the single\nlargest variable in output quality. Larger than voice rules.\nLarger than model choice.\n\n## The Framing Lever\n\nWhen material is framed as \"raw notes I'm still thinking\nthrough,\" the output is dramatically better than when framed\nas \"a transcript to draw on\" or a bare topic sentence.\n\nThe framing changes how the model relates to the material:\n- Notes to think through -> text that feels like thinking\n- Summaries to report on -> text that feels like reporting\n- Transcripts to draw from -> text that feels like paraphrase\n\n## Default Framing (always use)\n\n```\nBelow are my rough notes on this topic. I'm still working\nthrough these ideas and haven't settled on a final structure.\nUse them as raw material for thinking, not as an outline\nto follow:\n\n---\n{source_material}\n---\n\nWrite a piece that engages with these ideas in the voice\ndescribed above. You don't need to cover everything in the\nnotes. Follow where the interesting threads lead.\n```\n\n## When User Provides Structured Input\n\nIf the user gives bullet points or an outline, still\nreframe as notes:\n\n```\nBelow are my working notes. These bullet points represent\nthreads I'm pulling on, not a structure to reproduce:\n\n---\n{bullet_points}\n---\n```\n\n## When User Provides a Topic Only\n\nIf just a topic sentence or phrase:\n\n```\nI want to write about: {topic}\n\nHere's what I'm thinking so far: I don't have notes yet,\nbut the angle I'm interested in is {topic}. Write an\nexploratory piece that discovers its argument as it goes.\n```\n\n## Override Framings\n\nOnly use these if the user explicitly requests a different\nrelationship to the source material:\n\n### \"Preserve my structure\"\n```\nBelow is an outline I want to follow. Keep the structure\nbut write each section in the voice described above:\n```\n\n### \"Respond to this\"\n```\nBelow is something I'm responding to. Write a response\nin the voice described above:\n```\n\n### \"Expand these points\"\n```\nBelow are key points I want to develop. Expand each one\ninto full prose in the voice described above:\n```\n\nFile v1.9.17:skill-card.md\n\n## Description: <br>\nGenerates text in a learned writing voice. <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 to draft prose in a selected learned voice profile, with register selection, source-material framing, style cleanup, and optional review dispatch. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The skill reads local voice profile files and project voice overrides, which may contain personal writing patterns or sensitive context. <br>\nMitigation: Install and run it only when the agent may access those profile files, and review generated text before sharing it. <br>\nRisk: Generated writing can be presented as a real person's authorial voice. <br>\nMitigation: Review the draft yourself, especially when it represents a real person or public authorial identity. <br>\nRisk: Automatic banned-phrase and punctuation cleanup can silently change the generated draft. <br>\nMitigation: Inspect the final text after cleanup and before use. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/athola/skills/nm-scribe-voice-generate) <br>\n- [ClawHub publisher profile](https://clawhub.ai/user/athola) <br>\n- [Configured homepage](https://github.com/athola/claude-night-market/tree/master/plugins/scribe) <br>\n- [Generation pipeline module](artifact/modules/generation-pipeline.md) <br>\n- [Register selection module](artifact/modules/register-selection.md) <br>\n- [Source framing module](artifact/modules/source-framing.md) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [Text, Markdown, Shell commands, Guidance] <br>\n**Output Format:** [Markdown prose with inline shell snippets and configuration guidance] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Uses local voice profile files and can apply automatic style cleanup before presenting drafts.] <br>\n\n## Skill Version(s): <br>\n1.9.17 (source: ClawHub 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: 6 files, 7558 bytes\n\nFiles: modules/generation-pipeline.md (2197b), modules/register-selection.md (1672b), modules/source-framing.md (2186b), skill-card.md (2437b), SKILL.md (5452b), _meta.json (144b)\n\nFile v1.9.16:SKILL.md\n\n---\nname: voice-generate\ndescription: Generates text in a learned writing voice\nversion: 1.9.8\ntriggers:\n  - voice\n  - generation\n  - style-transfer\n  - writing\n  - registers\n  - drafting content that must match a specific author's style profile extracted by voice-extract\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:slop-detector\"]}}}\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 Generation Skill\n\nGenerate text in a user's extracted writing voice.\n\n## Core Principle: Source Material Framing\n\nThe single largest variable in output quality is how source\nmaterial is framed in the prompt. Material framed as \"raw\nnotes I'm still thinking through\" produces text that feels\nlike thinking. Material framed as summaries produces reporting.\n\nAlways frame user-provided source material as raw notes unless\nthe user explicitly requests otherwise.\n\n## Required TodoWrite Items\n\n1. `voice-generate:profile-loaded` - Voice profile read\n2. `voice-generate:register-selected` - Register chosen\n3. `voice-generate:source-framed` - Material framed as notes\n4. `voice-generate:generated` - Text produced\n5. `voice-generate:review-dispatched` - Sent to review agents\n\n## Step 1: Load Voice Profile\n\n```bash\nPROFILE_DIR=\"$HOME/.claude/voice-profiles/{name}\"\n```\n\nRead in order:\n1. `extraction.md` - Core voice features\n2. `registers/{register}.md` - Active register\n3. `craft-rules.md` - Shared craft techniques (if exists)\n4. `banned-phrases.md` - Anti-patterns to avoid (if exists)\n\nCheck for per-project override:\n```bash\nif [ -f \".voice/override.md\" ]; then\n  # Merge project overrides with profile\nfi\n```\n\n## Step 2: Register Selection\n\nLoad: `@modules/register-selection`\n\nSelect register by:\n1. Explicit user request (\"use casual register\")\n2. Context matching from register metadata\n3. Default fallback to `registers/default.md`\n\n## Step 3: Frame Source Material\n\nLoad: `@modules/source-framing`\n\n**Default framing** (always use unless user overrides):\n\n```\nBelow are my rough notes on this topic. I'm still thinking\nthrough these ideas. Use them as the raw material for the\npiece, not as a structure to follow:\n\n---\n{user_provided_source_material}\n---\n```\n\n**Alternative framings** (only if user requests):\n- \"structured outline\" - when user wants to preserve structure\n- \"key points to cover\" - when user provides bullet points\n- \"conversation to draw from\" - when source is a transcript\n\n## Step 4: Generation Prompt\n\nCompose the generation prompt:\n\n```\nYou are writing a piece in a specific voice. The voice\nfeatures below were extracted from the writer's own work.\nFollow them as concrete instructions, not suggestions.\n\n## Voice Features\n\n{extraction.md content}\n\n## Active Register: {register_name}\n\n{register content}\n\n## Craft Techniques (apply all)\n\n- Concrete-first: Lead with specific, physical details before\n  any abstraction\n- Naming: When you describe a pattern in 2+ sentences, compress\n  it into a 2-4 word label\n- Opening moves: Start mid-thought, with a specific moment, or\n  with a counterintuitive claim. Never start with throat-clearing\n- Human-moment anchoring: Ground every abstraction in a specific\n  scene or lived experience\n- Aphoristic destinations: At least one sentence per section\n  should be worth repeating out of context\n\n## Banned (never use)\n\n{banned_phrases content, or default list:}\n- Em dashes (use commas, colons, semicolons, parentheses)\n- \"delve\", \"utilize\", \"leverage\", \"facilitate\"\n- \"it's important to note\", \"in today's world\"\n- \"here's the thing\", \"let that sink in\"\n- \"furthermore\", \"moreover\", \"comprehensive\"\n- Negation-correction patterns (\"This isn't X. This is Y.\")\n\n## Source Material\n\n{framed source material from Step 3}\n\n## Task\n\nWrite the piece. Follow the voice features precisely. Apply\ncraft techniques. Do not use any banned phrases. The output\nshould read as if the writer produced it themselves.\n\nLength: {user_specified or ~same as source material}\nFormat: {user_specified or prose paragraphs}\n```\n\n## Step 5: Post-Generation\n\nAfter generation:\n1. Scan output for banned phrases (auto-fix silently)\n2. Check for em dashes (replace with appropriate punctuation)\n3. Dispatch to voice-review skill if user wants review\n4. Save pre-review snapshot if learning mode is active\n\n## Model Routing\n\n- **Generation**: Use Opus. Tonal shifts, parenthetical\n  subversion, and subtle voice qualities require the larger\n  model. Sonnet flattens these.\n- **Banned phrase scan**: Can run locally (regex/grep)\n- **Review agents**: Sonnet is sufficient (the prompts are\n  templated, so Opus tonal range is not needed)\n\n## Per-Project Voice\n\nIf `.voice/override.md` exists in the current project:\n- Read override content\n- Merge with profile (overrides take precedence)\n- Note in output: \"Applied project voice override\"\n\n## Exit Criteria\n\n- Text generated in the specified voice\n- No banned phrases present\n- Craft techniques applied (concrete-first, naming, etc.)\n- Source material framed as raw notes\n- Review dispatched (if requested)\n- Snapshot saved (if learning mode active)\n\nFile v1.9.16:_meta.json\n\n{\n  \"ownerId\": \"kn7d107jg9jv602h9ytsegydq184a42s\",\n  \"slug\": \"nm-scribe-voice-generate\",\n  \"version\": \"1.9.16\",\n  \"publishedAt\": 1784059153123\n}\n\nFile v1.9.16:modules/generation-pipeline.md\n\n---\nmodule: generation-pipeline\ncategory: voice-generation\ndependencies: [Read, Write, Agent]\nestimated_tokens: 500\n---\n\n# Generation Pipeline Module\n\nEnd-to-end generation flow from source material to reviewed text.\n\n## Pipeline Stages\n\n```\nSource Material\n    |\n    v\n[Frame as raw notes]\n    |\n    v\n[Load profile + register + craft rules]\n    |\n    v\n[Generate with Opus]\n    |\n    v\n[Auto-fix: banned phrases, em dashes]\n    |\n    v\n[Snapshot: pre-review] (if learning active)\n    |\n    v\n[Dispatch review agents] (optional)\n    |\n    v\n[Present advisories to user]\n    |\n    v\n[Apply user decisions]\n    |\n    v\n[Snapshot: post-review] (if learning active)\n    |\n    v\nFinal text (user may edit further)\n    |\n    v\n[/voice-learn captures post-edit] (user-triggered)\n```\n\n## Auto-Fix Rules (Silent)\n\nApplied immediately after generation, before review:\n\n```bash\n# Em dash replacement (context-aware)\n# Before a clause: use comma or colon\n# Parenthetical: use parentheses\n# List separator: use semicolons\n\n# Banned phrase removal\n# \"Furthermore,\" -> \"\" (start sentence without it)\n# \"It's important to note\" -> \"\" (remove entirely)\n# \"delve\" -> \"explore\" or \"examine\"\n# \"utilize\" -> \"use\"\n# \"leverage\" -> \"use\" or remove\n# \"comprehensive\" -> \"thorough\" or \"complete\"\n# \"robust\" -> \"solid\" or remove\n# \"seamless\" -> \"smooth\" or remove\n```\n\n## Model Routing\n\n| Stage | Model | Reason |\n|-------|-------|--------|\n| Generation | Opus | Tonal shifts, parenthetical subversion |\n| Auto-fix | Regex/local | No model needed |\n| Prose review | Sonnet | Structured detection prompts |\n| Craft review | Sonnet | Structured evaluation prompts |\n| Learning analysis | Opus | Nuanced pattern comparison |\n\n## Error Recovery\n\nIf generation fails quality checks (> 5 hard failures):\n1. Re-generate with stronger emphasis on banned phrases\n2. If second attempt still fails, present to user with warning\n3. Never loop more than twice (prevents infinite retry)\n\n## Streaming Considerations\n\nFor long-form content (> 1000 words):\n- Generate in sections (one per major heading)\n- Apply auto-fix per section\n- Allow user to review section-by-section or all at once\n- Snapshot captures the complete assembled text\n\nFile v1.9.16:modules/register-selection.md\n\n---\nmodule: register-selection\ncategory: voice-generation\ndependencies: [Read, Bash]\nestimated_tokens: 300\n---\n\n# Register Selection Module\n\nChoose the appropriate voice register for generation.\n\n## Selection Priority\n\n1. **Explicit request**: User says \"use casual register\"\n2. **Context match**: Register metadata matches the task\n3. **Default**: Fall back to `registers/default.md`\n\n## Context Matching\n\nEach register file has a `## Context` section describing\nwhen to use it. Match against the user's stated purpose:\n\n```\nUser: \"Write a blog post about...\"     -> default or narrative\nUser: \"Draft a technical doc for...\"   -> technical\nUser: \"Reply to this Reddit thread...\" -> casual\nUser: \"Write an email to my team...\"   -> professional\n```\n\n## Register Loading\n\n```bash\nPROFILE_DIR=\"$HOME/.claude/voice-profiles/$PROFILE_NAME\"\nREGISTER_FILE=\"$PROFILE_DIR/registers/${REGISTER_NAME}.md\"\n\nif [ ! -f \"$REGISTER_FILE\" ]; then\n  echo \"Register '$REGISTER_NAME' not found. Available:\"\n  ls \"$PROFILE_DIR/registers/\"\n  echo \"Using default register.\"\n  REGISTER_FILE=\"$PROFILE_DIR/registers/default.md\"\nfi\n```\n\n## Inheritance\n\nNon-default registers inherit from default unless they\nexplicitly override a section. When loading a non-default\nregister:\n\n1. Read `default.md` as base\n2. Read `{name}.md` for overrides and additions\n3. Merge: override sections replace, additions append\n\n## Listing Available Registers\n\nWhen user asks what registers exist:\n\n```bash\necho \"Available voice registers for $PROFILE_NAME:\"\nfor f in \"$PROFILE_DIR/registers/\"*.md; do\n  name=$(basename \"$f\" .md)\n  context=$(grep -A1 \"^## Context\" \"$f\" | tail -1)\n  echo \"  $name: $context\"\ndone\n```\n\nFile v1.9.16:modules/source-framing.md\n\n---\nmodule: source-framing\ncategory: voice-generation\ndependencies: []\nestimated_tokens: 400\n---\n\n# Source Framing Module\n\nHow source material is framed in the prompt is the single\nlargest variable in output quality. Larger than voice rules.\nLarger than model choice.\n\n## The Framing Lever\n\nWhen material is framed as \"raw notes I'm still thinking\nthrough,\" the output is dramatically better than when framed\nas \"a transcript to draw on\" or a bare topic sentence.\n\nThe framing changes how the model relates to the material:\n- Notes to think through -> text that feels like thinking\n- Summaries to report on -> text that feels like reporting\n- Transcripts to draw from -> text that feels like paraphrase\n\n## Default Framing (always use)\n\n```\nBelow are my rough notes on this topic. I'm still working\nthrough these ideas and haven't settled on a final structure.\nUse them as raw material for thinking, not as an outline\nto follow:\n\n---\n{source_material}\n---\n\nWrite a piece that engages with these ideas in the voice\ndescribed above. You don't need to cover everything in the\nnotes. Follow where the interesting threads lead.\n```\n\n## When User Provides Structured Input\n\nIf the user gives bullet points or an outline, still\nreframe as notes:\n\n```\nBelow are my working notes. These bullet points represent\nthreads I'm pulling on, not a structure to reproduce:\n\n---\n{bullet_points}\n---\n```\n\n## When User Provides a Topic Only\n\nIf just a topic sentence or phrase:\n\n```\nI want to write about: {topic}\n\nHere's what I'm thinking so far: I don't have notes yet,\nbut the angle I'm interested in is {topic}. Write an\nexploratory piece that discovers its argument as it goes.\n```\n\n## Override Framings\n\nOnly use these if the user explicitly requests a different\nrelationship to the source material:\n\n### \"Preserve my structure\"\n```\nBelow is an outline I want to follow. Keep the structure\nbut write each section in the voice described above:\n```\n\n### \"Respond to this\"\n```\nBelow is something I'm responding to. Write a response\nin the voice described above:\n```\n\n### \"Expand these points\"\n```\nBelow are key points I want to develop. Expand each one\ninto full prose in the voice described above:\n```\n\nFile v1.9.16:skill-card.md\n\n## Description: <br>\nGenerates text in a learned writing voice. <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 content teams use this skill to draft prose in an authorized, extracted writing voice. The skill loads local voice profiles, selects an appropriate register, frames source material as working notes, and produces polished text for review. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The skill reads local voice profile files and optional project voice overrides, which may contain personal writing samples or sensitive context. <br>\nMitigation: Install only where the agent may access those files, and review profile and override contents before use. <br>\nRisk: Generated text may imitate a writing voice that the user is not authorized to use. <br>\nMitigation: Use only voice profiles you are authorized to imitate and review generated text before publication. <br>\nRisk: The workflow may silently rewrite banned phrases or punctuation before showing the final draft. <br>\nMitigation: Review the final output against the source material and style requirements before sharing it. <br>\n\n\n## Reference(s): <br>\n- [ClawHub Skill Page](https://clawhub.ai/athola/skills/nm-scribe-voice-generate) <br>\n- [Scribe Plugin Homepage](https://github.com/athola/claude-night-market/tree/master/plugins/scribe) <br>\n- [Generation Pipeline Module](artifact/modules/generation-pipeline.md) <br>\n- [Register Selection Module](artifact/modules/register-selection.md) <br>\n- [Source Framing Module](artifact/modules/source-framing.md) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, guidance] <br>\n**Output Format:** [Markdown or prose text with optional inline guidance] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [May silently clean banned phrases and punctuation before presenting the draft.] <br>\n\n## Skill Version(s): <br>\n1.9.16 (source: 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>\n\nArchive v1.9.14: 6 files, 7563 bytes\n\nFiles: modules/generation-pipeline.md (2197b), modules/register-selection.md (1672b), modules/source-framing.md (2186b), skill-card.md (2469b), SKILL.md (5452b), _meta.json (144b)\n\nFile v1.9.14:SKILL.md\n\n---\nname: voice-generate\ndescription: Generates text in a learned writing voice\nversion: 1.9.8\ntriggers:\n  - voice\n  - generation\n  - style-transfer\n  - writing\n  - registers\n  - drafting content that must match a specific author's style profile extracted by voice-extract\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:slop-detector\"]}}}\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 Generation Skill\n\nGenerate text in a user's extracted writing voice.\n\n## Core Principle: Source Material Framing\n\nThe single largest variable in output quality is how source\nmaterial is framed in the prompt. Material framed as \"raw\nnotes I'm still thinking through\" produces text that feels\nlike thinking. Material framed as summaries produces reporting.\n\nAlways frame user-provided source material as raw notes unless\nthe user explicitly requests otherwise.\n\n## Required TodoWrite Items\n\n1. `voice-generate:profile-loaded` - Voice profile read\n2. `voice-generate:register-selected` - Register chosen\n3. `voice-generate:source-framed` - Material framed as notes\n4. `voice-generate:generated` - Text produced\n5. `voice-generate:review-dispatched` - Sent to review agents\n\n## Step 1: Load Voice Profile\n\n```bash\nPROFILE_DIR=\"$HOME/.claude/voice-profiles/{name}\"\n```\n\nRead in order:\n1. `extraction.md` - Core voice features\n2. `registers/{register}.md` - Active register\n3. `craft-rules.md` - Shared craft techniques (if exists)\n4. `banned-phrases.md` - Anti-patterns to avoid (if exists)\n\nCheck for per-project override:\n```bash\nif [ -f \".voice/override.md\" ]; then\n  # Merge project overrides with profile\nfi\n```\n\n## Step 2: Register Selection\n\nLoad: `@modules/register-selection`\n\nSelect register by:\n1. Explicit user request (\"use casual register\")\n2. Context matching from register metadata\n3. Default fallback to `registers/default.md`\n\n## Step 3: Frame Source Material\n\nLoad: `@modules/source-framing`\n\n**Default framing** (always use unless user overrides):\n\n```\nBelow are my rough notes on this topic. I'm still thinking\nthrough these ideas. Use them as the raw material for the\npiece, not as a structure to follow:\n\n---\n{user_provided_source_material}\n---\n```\n\n**Alternative framings** (only if user requests):\n- \"structured outline\" - when user wants to preserve structure\n- \"key points to cover\" - when user provides bullet points\n- \"conversation to draw from\" - when source is a transcript\n\n## Step 4: Generation Prompt\n\nCompose the generation prompt:\n\n```\nYou are writing a piece in a specific voice. The voice\nfeatures below were extracted from the writer's own work.\nFollow them as concrete instructions, not suggestions.\n\n## Voice Features\n\n{extraction.md content}\n\n## Active Register: {register_name}\n\n{register content}\n\n## Craft Techniques (apply all)\n\n- Concrete-first: Lead with specific, physical details before\n  any abstraction\n- Naming: When you describe a pattern in 2+ sentences, compress\n  it into a 2-4 word label\n- Opening moves: Start mid-thought, with a specific moment, or\n  with a counterintuitive claim. Never start with throat-clearing\n- Human-moment anchoring: Ground every abstraction in a specific\n  scene or lived experience\n- Aphoristic destinations: At least one sentence per section\n  should be worth repeating out of context\n\n## Banned (never use)\n\n{banned_phrases content, or default list:}\n- Em dashes (use commas, colons, semicolons, parentheses)\n- \"delve\", \"utilize\", \"leverage\", \"facilitate\"\n- \"it's important to note\", \"in today's world\"\n- \"here's the thing\", \"let that sink in\"\n- \"furthermore\", \"moreover\", \"comprehensive\"\n- Negation-correction patterns (\"This isn't X. This is Y.\")\n\n## Source Material\n\n{framed source material from Step 3}\n\n## Task\n\nWrite the piece. Follow the voice features precisely. Apply\ncraft techniques. Do not use any banned phrases. The output\nshould read as if the writer produced it themselves.\n\nLength: {user_specified or ~same as source material}\nFormat: {user_specified or prose paragraphs}\n```\n\n## Step 5: Post-Generation\n\nAfter generation:\n1. Scan output for banned phrases (auto-fix silently)\n2. Check for em dashes (replace with appropriate punctuation)\n3. Dispatch to voice-review skill if user wants review\n4. Save pre-review snapshot if learning mode is active\n\n## Model Routing\n\n- **Generation**: Use Opus. Tonal shifts, parenthetical\n  subversion, and subtle voice qualities require the larger\n  model. Sonnet flattens these.\n- **Banned phrase scan**: Can run locally (regex/grep)\n- **Review agents**: Sonnet is sufficient (the prompts are\n  templated, so Opus tonal range is not needed)\n\n## Per-Project Voice\n\nIf `.voice/override.md` exists in the current project:\n- Read override content\n- Merge with profile (overrides take precedence)\n- Note in output: \"Applied project voice override\"\n\n## Exit Criteria\n\n- Text generated in the specified voice\n- No banned phrases present\n- Craft techniques applied (concrete-first, naming, etc.)\n- Source material framed as raw notes\n- Review dispatched (if requested)\n- Snapshot saved (if learning mode active)\n\nFile v1.9.14:_meta.json\n\n{\n  \"ownerId\": \"kn7d107jg9jv602h9ytsegydq184a42s\",\n  \"slug\": \"nm-scribe-voice-generate\",\n  \"version\": \"1.9.14\",\n  \"publishedAt\": 1782842804869\n}\n\nFile v1.9.14:modules/generation-pipeline.md\n\n---\nmodule: generation-pipeline\ncategory: voice-generation\ndependencies: [Read, Write, Agent]\nestimated_tokens: 500\n---\n\n# Generation Pipeline Module\n\nEnd-to-end generation flow from source material to reviewed text.\n\n## Pipeline Stages\n\n```\nSource Material\n    |\n    v\n[Frame as raw notes]\n    |\n    v\n[Load profile + register + craft rules]\n    |\n    v\n[Generate with Opus]\n    |\n    v\n[Auto-fix: banned phrases, em dashes]\n    |\n    v\n[Snapshot: pre-review] (if learning active)\n    |\n    v\n[Dispatch review agents] (optional)\n    |\n    v\n[Present advisories to user]\n    |\n    v\n[Apply user decisions]\n    |\n    v\n[Snapshot: post-review] (if learning active)\n    |\n    v\nFinal text (user may edit further)\n    |\n    v\n[/voice-learn captures post-edit] (user-triggered)\n```\n\n## Auto-Fix Rules (Silent)\n\nApplied immediately after generation, before review:\n\n```bash\n# Em dash replacement (context-aware)\n# Before a clause: use comma or colon\n# Parenthetical: use parentheses\n# List separator: use semicolons\n\n# Banned phrase removal\n# \"Furthermore,\" -> \"\" (start sentence without it)\n# \"It's important to note\" -> \"\" (remove entirely)\n# \"delve\" -> \"explore\" or \"examine\"\n# \"utilize\" -> \"use\"\n# \"leverage\" -> \"use\" or remove\n# \"comprehensive\" -> \"thorough\" or \"complete\"\n# \"robust\" -> \"solid\" or remove\n# \"seamless\" -> \"smooth\" or remove\n```\n\n## Model Routing\n\n| Stage | Model | Reason |\n|-------|-------|--------|\n| Generation | Opus | Tonal shifts, parenthetical subversion |\n| Auto-fix | Regex/local | No model needed |\n| Prose review | Sonnet | Structured detection prompts |\n| Craft review | Sonnet | Structured evaluation prompts |\n| Learning analysis | Opus | Nuanced pattern comparison |\n\n## Error Recovery\n\nIf generation fails quality checks (> 5 hard failures):\n1. Re-generate with stronger emphasis on banned phrases\n2. If second attempt still fails, present to user with warning\n3. Never loop more than twice (prevents infinite retry)\n\n## Streaming Considerations\n\nFor long-form content (> 1000 words):\n- Generate in sections (one per major heading)\n- Apply auto-fix per section\n- Allow user to review section-by-section or all at once\n- Snapshot captures the complete assembled text\n\nFile v1.9.14:modules/register-selection.md\n\n---\nmodule: register-selection\ncategory: voice-generation\ndependencies: [Read, Bash]\nestimated_tokens: 300\n---\n\n# Register Selection Module\n\nChoose the appropriate voice register for generation.\n\n## Selection Priority\n\n1. **Explicit request**: User says \"use casual register\"\n2. **Context match**: Register metadata matches the task\n3. **Default**: Fall back to `registers/default.md`\n\n## Context Matching\n\nEach register file has a `## Context` section describing\nwhen to use it. Match against the user's stated purpose:\n\n```\nUser: \"Write a blog post about...\"     -> default or narrative\nUser: \"Draft a technical doc for...\"   -> technical\nUser: \"Reply to this Reddit thread...\" -> casual\nUser: \"Write an email to my team...\"   -> professional\n```\n\n## Register Loading\n\n```bash\nPROFILE_DIR=\"$HOME/.claude/voice-profiles/$PROFILE_NAME\"\nREGISTER_FILE=\"$PROFILE_DIR/registers/${REGISTER_NAME}.md\"\n\nif [ ! -f \"$REGISTER_FILE\" ]; then\n  echo \"Register '$REGISTER_NAME' not found. Available:\"\n  ls \"$PROFILE_DIR/registers/\"\n  echo \"Using default register.\"\n  REGISTER_FILE=\"$PROFILE_DIR/registers/default.md\"\nfi\n```\n\n## Inheritance\n\nNon-default registers inherit from default unless they\nexplicitly override a section. When loading a non-default\nregister:\n\n1. Read `default.md` as base\n2. Read `{name}.md` for overrides and additions\n3. Merge: override sections replace, additions append\n\n## Listing Available Registers\n\nWhen user asks what registers exist:\n\n```bash\necho \"Available voice registers for $PROFILE_NAME:\"\nfor f in \"$PROFILE_DIR/registers/\"*.md; do\n  name=$(basename \"$f\" .md)\n  context=$(grep -A1 \"^## Context\" \"$f\" | tail -1)\n  echo \"  $name: $context\"\ndone\n```\n\nFile v1.9.14:modules/source-framing.md\n\n---\nmodule: source-framing\ncategory: voice-generation\ndependencies: []\nestimated_tokens: 400\n---\n\n# Source Framing Module\n\nHow source material is framed in the prompt is the single\nlargest variable in output quality. Larger than voice rules.\nLarger than model choice.\n\n## The Framing Lever\n\nWhen material is framed as \"raw notes I'm still thinking\nthrough,\" the output is dramatically better than when framed\nas \"a transcript to draw on\" or a bare topic sentence.\n\nThe framing changes how the model relates to the material:\n- Notes to think through -> text that feels like thinking\n- Summaries to report on -> text that feels like reporting\n- Transcripts to draw from -> text that feels like paraphrase\n\n## Default Framing (always use)\n\n```\nBelow are my rough notes on this topic. I'm still working\nthrough these ideas and haven't settled on a final structure.\nUse them as raw material for thinking, not as an outline\nto follow:\n\n---\n{source_material}\n---\n\nWrite a piece that engages with these ideas in the voice\ndescribed above. You don't need to cover everything in the\nnotes. Follow where the interesting threads lead.\n```\n\n## When User Provides Structured Input\n\nIf the user gives bullet points or an outline, still\nreframe as notes:\n\n```\nBelow are my working notes. These bullet points represent\nthreads I'm pulling on, not a structure to reproduce:\n\n---\n{bullet_points}\n---\n```\n\n## When User Provides a Topic Only\n\nIf just a topic sentence or phrase:\n\n```\nI want to write about: {topic}\n\nHere's what I'm thinking so far: I don't have notes yet,\nbut the angle I'm interested in is {topic}. Write an\nexploratory piece that discovers its argument as it goes.\n```\n\n## Override Framings\n\nOnly use these if the user explicitly requests a different\nrelationship to the source material:\n\n### \"Preserve my structure\"\n```\nBelow is an outline I want to follow. Keep the structure\nbut write each section in the voice described above:\n```\n\n### \"Respond to this\"\n```\nBelow is something I'm responding to. Write a response\nin the voice described above:\n```\n\n### \"Expand these points\"\n```\nBelow are key points I want to develop. Expand each one\ninto full prose in the voice described above:\n```\n\nFile v1.9.14:skill-card.md\n\n## Description: <br>\nGenerates text in a learned writing voice. <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 agents use this skill to draft prose in a saved writing voice by loading local voice profiles, selecting an appropriate register, framing source material as working notes, and cleaning banned phrases before review. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: Saved voice profiles and project overrides may contain sensitive writing samples or style information. <br>\nMitigation: Keep sensitive material out of local voice profile and override files, and review profile contents before using the skill. <br>\nRisk: Broad voice-generation triggers may load saved voice data when a user did not intend to use a local writing profile. <br>\nMitigation: Install or enable the skill only in contexts that need voice generation, and confirm the selected profile and register before drafting. <br>\nRisk: Automatic banned-phrase and punctuation cleanup can alter wording before the final draft is presented. <br>\nMitigation: Review generated drafts and any normalized phrasing before publication or downstream use. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/athola/skills/nm-scribe-voice-generate) <br>\n- [Scribe plugin homepage](https://github.com/athola/claude-night-market/tree/master/plugins/scribe) <br>\n- [Generation pipeline module](artifact/modules/generation-pipeline.md) <br>\n- [Register selection module](artifact/modules/register-selection.md) <br>\n- [Source framing module](artifact/modules/source-framing.md) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, shell commands, guidance] <br>\n**Output Format:** [Markdown prose with inline shell command examples and drafting guidance] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [May silently replace banned phrases and normalize punctuation before review.] <br>\n\n## Skill Version(s): <br>\n1.9.14 (source: server release metadata) <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: 6 files, 7532 bytes\n\nFiles: modules/generation-pipeline.md (2197b), modules/register-selection.md (1672b), modules/source-framing.md (2186b), skill-card.md (2304b), SKILL.md (5452b), _meta.json (144b)\n\nFile v1.9.13:SKILL.md\n\n---\nname: voice-generate\ndescription: Generates text in a learned writing voice\nversion: 1.9.8\ntriggers:\n  - voice\n  - generation\n  - style-transfer\n  - writing\n  - registers\n  - drafting content that must match a specific author's style profile extracted by voice-extract\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:slop-detector\"]}}}\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 Generation Skill\n\nGenerate text in a user's extracted writing voice.\n\n## Core Principle: Source Material Framing\n\nThe single largest variable in output quality is how source\nmaterial is framed in the prompt. Material framed as \"raw\nnotes I'm still thinking through\" produces text that feels\nlike thinking. Material framed as summaries produces reporting.\n\nAlways frame user-provided source material as raw notes unless\nthe user explicitly requests otherwise.\n\n## Required TodoWrite Items\n\n1. `voice-generate:profile-loaded` - Voice profile read\n2. `voice-generate:register-selected` - Register chosen\n3. `voice-generate:source-framed` - Material framed as notes\n4. `voice-generate:generated` - Text produced\n5. `voice-generate:review-dispatched` - Sent to review agents\n\n## Step 1: Load Voice Profile\n\n```bash\nPROFILE_DIR=\"$HOME/.claude/voice-profiles/{name}\"\n```\n\nRead in order:\n1. `extraction.md` - Core voice features\n2. `registers/{register}.md` - Active register\n3. `craft-rules.md` - Shared craft techniques (if exists)\n4. `banned-phrases.md` - Anti-patterns to avoid (if exists)\n\nCheck for per-project override:\n```bash\nif [ -f \".voice/override.md\" ]; then\n  # Merge project overrides with profile\nfi\n```\n\n## Step 2: Register Selection\n\nLoad: `@modules/register-selection`\n\nSelect register by:\n1. Explicit user request (\"use casual register\")\n2. Context matching from register metadata\n3. Default fallback to `registers/default.md`\n\n## Step 3: Frame Source Material\n\nLoad: `@modules/source-framing`\n\n**Default framing** (always use unless user overrides):\n\n```\nBelow are my rough notes on this topic. I'm still thinking\nthrough these ideas. Use them as the raw material for the\npiece, not as a structure to follow:\n\n---\n{user_provided_source_material}\n---\n```\n\n**Alternative framings** (only if user requests):\n- \"structured outline\" - when user wants to preserve structure\n- \"key points to cover\" - when user provides bullet points\n- \"conversation to draw from\" - when source is a transcript\n\n## Step 4: Generation Prompt\n\nCompose the generation prompt:\n\n```\nYou are writing a piece in a specific voice. The voice\nfeatures below were extracted from the writer's own work.\nFollow them as concrete instructions, not suggestions.\n\n## Voice Features\n\n{extraction.md content}\n\n## Active Register: {register_name}\n\n{register content}\n\n## Craft Techniques (apply all)\n\n- Concrete-first: Lead with specific, physical details before\n  any abstraction\n- Naming: When you describe a pattern in 2+ sentences, compress\n  it into a 2-4 word label\n- Opening moves: Start mid-thought, with a specific moment, or\n  with a counterintuitive claim. Never start with throat-clearing\n- Human-moment anchoring: Ground every abstraction in a specific\n  scene or lived experience\n- Aphoristic destinations: At least one sentence per section\n  should be worth repeating out of context\n\n## Banned (never use)\n\n{banned_phrases content, or default list:}\n- Em dashes (use commas, colons, semicolons, parentheses)\n- \"delve\", \"utilize\", \"leverage\", \"facilitate\"\n- \"it's important to note\", \"in today's world\"\n- \"here's the thing\", \"let that sink in\"\n- \"furthermore\", \"moreover\", \"comprehensive\"\n- Negation-correction patterns (\"This isn't X. This is Y.\")\n\n## Source Material\n\n{framed source material from Step 3}\n\n## Task\n\nWrite the piece. Follow the voice features precisely. Apply\ncraft techniques. Do not use any banned phrases. The output\nshould read as if the writer produced it themselves.\n\nLength: {user_specified or ~same as source material}\nFormat: {user_specified or prose paragraphs}\n```\n\n## Step 5: Post-Generation\n\nAfter generation:\n1. Scan output for banned phrases (auto-fix silently)\n2. Check for em dashes (replace with appropriate punctuation)\n3. Dispatch to voice-review skill if user wants review\n4. Save pre-review snapshot if learning mode is active\n\n## Model Routing\n\n- **Generation**: Use Opus. Tonal shifts, parenthetical\n  subversion, and subtle voice qualities require the larger\n  model. Sonnet flattens these.\n- **Banned phrase scan**: Can run locally (regex/grep)\n- **Review agents**: Sonnet is sufficient (the prompts are\n  templated, so Opus tonal range is not needed)\n\n## Per-Project Voice\n\nIf `.voice/override.md` exists in the current project:\n- Read override content\n- Merge with profile (overrides take precedence)\n- Note in output: \"Applied project voice override\"\n\n## Exit Criteria\n\n- Text generated in the specified voice\n- No banned phrases present\n- Craft techniques applied (concrete-first, naming, etc.)\n- Source material framed as raw notes\n- Review dispatched (if requested)\n- Snapshot saved (if learning mode active)\n\nFile v1.9.13:_meta.json\n\n{\n  \"ownerId\": \"kn7d107jg9jv602h9ytsegydq184a42s\",\n  \"slug\": \"nm-scribe-voice-generate\",\n  \"version\": \"1.9.13\",\n  \"publishedAt\": 1782577467328\n}\n\nFile v1.9.13:modules/generation-pipeline.md\n\n---\nmodule: generation-pipeline\ncategory: voice-generation\ndependencies: [Read, Write, Agent]\nestimated_tokens: 500\n---\n\n# Generation Pipeline Module\n\nEnd-to-end generation flow from source material to reviewed text.\n\n## Pipeline Stages\n\n```\nSource Material\n    |\n    v\n[Frame as raw notes]\n    |\n    v\n[Load profile + register + craft rules]\n    |\n    v\n[Generate with Opus]\n    |\n    v\n[Auto-fix: banned phrases, em dashes]\n    |\n    v\n[Snapshot: pre-review] (if learning active)\n    |\n    v\n[Dispatch review agents] (optional)\n    |\n    v\n[Present advisories to user]\n    |\n    v\n[Apply user decisions]\n    |\n    v\n[Snapshot: post-review] (if learning active)\n    |\n    v\nFinal text (user may edit further)\n    |\n    v\n[/voice-learn captures post-edit] (user-triggered)\n```\n\n## Auto-Fix Rules (Silent)\n\nApplied immediately after generation, before review:\n\n```bash\n# Em dash replacement (context-aware)\n# Before a clause: use comma or colon\n# Parenthetical: use parentheses\n# List separator: use semicolons\n\n# Banned phrase removal\n# \"Furthermore,\" -> \"\" (start sentence without it)\n# \"It's important to note\" -> \"\" (remove entirely)\n# \"delve\" -> \"explore\" or \"examine\"\n# \"utilize\" -> \"use\"\n# \"leverage\" -> \"use\" or remove\n# \"comprehensive\" -> \"thorough\" or \"complete\"\n# \"robust\" -> \"solid\" or remove\n# \"seamless\" -> \"smooth\" or remove\n```\n\n## Model Routing\n\n| Stage | Model | Reason |\n|-------|-------|--------|\n| Generation | Opus | Tonal shifts, parenthetical subversion |\n| Auto-fix | Regex/local | No model needed |\n| Prose review | Sonnet | Structured detection prompts |\n| Craft review | Sonnet | Structured evaluation prompts |\n| Learning analysis | Opus | Nuanced pattern comparison |\n\n## Error Recovery\n\nIf generation fails quality checks (> 5 hard failures):\n1. Re-generate with stronger emphasis on banned phrases\n2. If second attempt still fails, present to user with warning\n3. Never loop more than twice (prevents infinite retry)\n\n## Streaming Considerations\n\nFor long-form content (> 1000 words):\n- Generate in sections (one per major heading)\n- Apply auto-fix per section\n- Allow user to review section-by-section or all at once\n- Snapshot captures the complete assembled text\n\nFile v1.9.13:modules/register-selection.md\n\n---\nmodule: register-selection\ncategory: voice-generation\ndependencies: [Read, Bash]\nestimated_tokens: 300\n---\n\n# Register Selection Module\n\nChoose the appropriate voice register for generation.\n\n## Selection Priority\n\n1. **Explicit request**: User says \"use casual register\"\n2. **Context match**: Register metadata matches the task\n3. **Default**: Fall back to `registers/default.md`\n\n## Context Matching\n\nEach register file has a `## Context` section describing\nwhen to use it. Match against the user's stated purpose:\n\n```\nUser: \"Write a blog post about...\"     -> default or narrative\nUser: \"Draft a technical doc for...\"   -> technical\nUser: \"Reply to this Reddit thread...\" -> casual\nUser: \"Write an email to my team...\"   -> professional\n```\n\n## Register Loading\n\n```bash\nPROFILE_DIR=\"$HOME/.claude/voice-profiles/$PROFILE_NAME\"\nREGISTER_FILE=\"$PROFILE_DIR/registers/${REGISTER_NAME}.md\"\n\nif [ ! -f \"$REGISTER_FILE\" ]; then\n  echo \"Register '$REGISTER_NAME' not found. Available:\"\n  ls \"$PROFILE_DIR/registers/\"\n  echo \"Using default register.\"\n  REGISTER_FILE=\"$PROFILE_DIR/registers/default.md\"\nfi\n```\n\n## Inheritance\n\nNon-default registers inherit from default unless they\nexplicitly override a section. When loading a non-default\nregister:\n\n1. Read `default.md` as base\n2. Read `{name}.md` for overrides and additions\n3. Merge: override sections replace, additions append\n\n## Listing Available Registers\n\nWhen user asks what registers exist:\n\n```bash\necho \"Available voice registers for $PROFILE_NAME:\"\nfor f in \"$PROFILE_DIR/registers/\"*.md; do\n  name=$(basename \"$f\" .md)\n  context=$(grep -A1 \"^## Context\" \"$f\" | tail -1)\n  echo \"  $name: $context\"\ndone\n```\n\nFile v1.9.13:modules/source-framing.md\n\n---\nmodule: source-framing\ncategory: voice-generation\ndependencies: []\nestimated_tokens: 400\n---\n\n# Source Framing Module\n\nHow source material is framed in the prompt is the single\nlargest variable in output quality. Larger than voice rules.\nLarger than model choice.\n\n## The Framing Lever\n\nWhen material is framed as \"raw notes I'm still thinking\nthrough,\" the output is dramatically better than when framed\nas \"a transcript to draw on\" or a bare topic sentence.\n\nThe framing changes how the model relates to the material:\n- Notes to think through -> text that feels like thinking\n- Summaries to report on -> text that feels like reporting\n- Transcripts to draw from -> text that feels like paraphrase\n\n## Default Framing (always use)\n\n```\nBelow are my rough notes on this topic. I'm still working\nthrough these ideas and haven't settled on a final structure.\nUse them as raw material for thinking, not as an outline\nto follow:\n\n---\n{source_material}\n---\n\nWrite a piece that engages with these ideas in the voice\ndescribed above. You don't need to cover everything in the\nnotes. Follow where the interesting threads lead.\n```\n\n## When User Provides Structured Input\n\nIf the user gives bullet points or an outline, still\nreframe as notes:\n\n```\nBelow are my working notes. These bullet points represent\nthreads I'm pulling on, not a structure to reproduce:\n\n---\n{bullet_points}\n---\n```\n\n## When User Provides a Topic Only\n\nIf just a topic sentence or phrase:\n\n```\nI want to write about: {topic}\n\nHere's what I'm thinking so far: I don't have notes yet,\nbut the angle I'm interested in is {topic}. Write an\nexploratory piece that discovers its argument as it goes.\n```\n\n## Override Framings\n\nOnly use these if the user explicitly requests a different\nrelationship to the source material:\n\n### \"Preserve my structure\"\n```\nBelow is an outline I want to follow. Keep the structure\nbut write each section in the voice described above:\n```\n\n### \"Respond to this\"\n```\nBelow is something I'm responding to. Write a response\nin the voice described above:\n```\n\n### \"Expand these points\"\n```\nBelow are key points I want to develop. Expand each one\ninto full prose in the voice described above:\n```\n\nFile v1.9.13:skill-card.md\n\n## Description: <br>\nGenerates text in a learned writing voice. <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, developers, and external users can use this skill to draft prose that follows a saved voice profile, selected register, and user-provided source material. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The skill loads local voice profiles and optional project overrides, so output can be shaped by profile content the user did not intend to apply. <br>\nMitigation: Review the selected voice profile, register, and any .voice/override.md file before using generated text. <br>\nRisk: Writing-voice generation can reproduce sensitive stylistic or source-material patterns. <br>\nMitigation: Use only profiles and source material the user is authorized to use, and manually review final drafts before sharing. <br>\nRisk: Silent banned-phrase and punctuation cleanup may alter wording before the user sees the draft. <br>\nMitigation: Manually check final text against the intended meaning, style, and punctuation requirements. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/athola/skills/nm-scribe-voice-generate) <br>\n- [Claude Night Market scribe plugin](https://github.com/athola/claude-night-market/tree/master/plugins/scribe) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance] <br>\n**Output Format:** [Markdown guidance with generated prose and inline shell commands] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [May load local voice profiles and project overrides, generate prose in sections, silently clean banned phrases and punctuation, and optionally dispatch review agents.] <br>\n\n## Skill Version(s): <br>\n1.9.13 (source: server release metadata; artifact frontmatter lists 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: 6 files, 7497 bytes\n\nFiles: modules/generation-pipeline.md (2197b), modules/register-selection.md (1672b), modules/source-framing.md (2186b), skill-card.md (2213b), SKILL.md (5452b), _meta.json (144b)\n\nFile v1.9.12:SKILL.md\n\n---\nname: voice-generate\ndescription: Generates text in a learned writing voice\nversion: 1.9.8\ntriggers:\n  - voice\n  - generation\n  - style-transfer\n  - writing\n  - registers\n  - drafting content that must match a specific author's style profile extracted by voice-extract\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:slop-detector\"]}}}\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 Generation Skill\n\nGenerate text in a user's extracted writing voice.\n\n## Core Principle: Source Material Framing\n\nThe single largest variable in output quality is how source\nmaterial is framed in the prompt. Material framed as \"raw\nnotes I'm still thinking through\" produces text that feels\nlike thinking. Material framed as summaries produces reporting.\n\nAlways frame user-provided source material as raw notes unless\nthe user explicitly requests otherwise.\n\n## Required TodoWrite Items\n\n1. `voice-generate:profile-loaded` - Voice profile read\n2. `voice-generate:register-selected` - Register chosen\n3. `voice-generate:source-framed` - Material framed as notes\n4. `voice-generate:generated` - Text produced\n5. `voice-generate:review-dispatched` - Sent to review agents\n\n## Step 1: Load Voice Profile\n\n```bash\nPROFILE_DIR=\"$HOME/.claude/voice-profiles/{name}\"\n```\n\nRead in order:\n1. `extraction.md` - Core voice features\n2. `registers/{register}.md` - Active register\n3. `craft-rules.md` - Shared craft techniques (if exists)\n4. `banned-phrases.md` - Anti-patterns to avoid (if exists)\n\nCheck for per-project override:\n```bash\nif [ -f \".voice/override.md\" ]; then\n  # Merge project overrides with profile\nfi\n```\n\n## Step 2: Register Selection\n\nLoad: `@modules/register-selection`\n\nSelect register by:\n1. Explicit user request (\"use casual register\")\n2. Context matching from register metadata\n3. Default fallback to `registers/default.md`\n\n## Step 3: Frame Source Material\n\nLoad: `@modules/source-framing`\n\n**Default framing** (always use unless user overrides):\n\n```\nBelow are my rough notes on this topic. I'm still thinking\nthrough these ideas. Use them as the raw material for the\npiece, not as a structure to follow:\n\n---\n{user_provided_source_material}\n---\n```\n\n**Alternative framings** (only if user requests):\n- \"structured outline\" - when user wants to preserve structure\n- \"key points to cover\" - when user provides bullet points\n- \"conversation to draw from\" - when source is a transcript\n\n## Step 4: Generation Prompt\n\nCompose the generation prompt:\n\n```\nYou are writing a piece in a specific voice. The voice\nfeatures below were extracted from the writer's own work.\nFollow them as concrete instructions, not suggestions.\n\n## Voice Features\n\n{extraction.md content}\n\n## Active Register: {register_name}\n\n{register content}\n\n## Craft Techniques (apply all)\n\n- Concrete-first: Lead with specific, physical details before\n  any abstraction\n- Naming: When you describe a pattern in 2+ sentences, compress\n  it into a 2-4 word label\n- Opening moves: Start mid-thought, with a specific moment, or\n  with a counterintuitive claim. Never start with throat-clearing\n- Human-moment anchoring: Ground every abstraction in a specific\n  scene or lived experience\n- Aphoristic destinations: At least one sentence per section\n  should be worth repeating out of context\n\n## Banned (never use)\n\n{banned_phrases content, or default list:}\n- Em dashes (use commas, colons, semicolons, parentheses)\n- \"delve\", \"utilize\", \"leverage\", \"facilitate\"\n- \"it's important to note\", \"in today's world\"\n- \"here's the thing\", \"let that sink in\"\n- \"furthermore\", \"moreover\", \"comprehensive\"\n- Negation-correction patterns (\"This isn't X. This is Y.\")\n\n## Source Material\n\n{framed source material from Step 3}\n\n## Task\n\nWrite the piece. Follow the voice features precisely. Apply\ncraft techniques. Do not use any banned phrases. The output\nshould read as if the writer produced it themselves.\n\nLength: {user_specified or ~same as source material}\nFormat: {user_specified or prose paragraphs}\n```\n\n## Step 5: Post-Generation\n\nAfter generation:\n1. Scan output for banned phrases (auto-fix silently)\n2. Check for em dashes (replace with appropriate punctuation)\n3. Dispatch to voice-review skill if user wants review\n4. Save pre-review snapshot if learning mode is active\n\n## Model Routing\n\n- **Generation**: Use Opus. Tonal shifts, parenthetical\n  subversion, and subtle voice qualities require the larger\n  model. Sonnet flattens these.\n- **Banned phrase scan**: Can run locally (regex/grep)\n- **Review agents**: Sonnet is sufficient (the prompts are\n  templated, so Opus tonal range is not needed)\n\n## Per-Project Voice\n\nIf `.voice/override.md` exists in the current project:\n- Read override content\n- Merge with profile (overrides take precedence)\n- Note in output: \"Applied project voice override\"\n\n## Exit Criteria\n\n- Text generated in the specified voice\n- No banned phrases present\n- Craft techniques applied (concrete-first, naming, etc.)\n- Source material framed as raw notes\n- Review dispatched (if requested)\n- Snapshot saved (if learning mode active)\n\nFile v1.9.12:_meta.json\n\n{\n  \"ownerId\": \"kn7d107jg9jv602h9ytsegydq184a42s\",\n  \"slug\": \"nm-scribe-voice-generate\",\n  \"version\": \"1.9.12\",\n  \"publishedAt\": 1781839216377\n}\n\nFile v1.9.12:modules/generation-pipeline.md\n\n---\nmodule: generation-pipeline\ncategory: voice-generation\ndependencies: [Read, Write, Agent]\nestimated_tokens: 500\n---\n\n# Generation Pipeline Module\n\nEnd-to-end generation flow from source material to reviewed text.\n\n## Pipeline Stages\n\n```\nSource Material\n    |\n    v\n[Frame as raw notes]\n    |\n    v\n[Load profile + register + craft rules]\n    |\n    v\n[Generate with Opus]\n    |\n    v\n[Auto-fix: banned phrases, em dashes]\n    |\n    v\n[Snapshot: pre-review] (if learning active)\n    |\n    v\n[Dispatch review agents] (optional)\n    |\n    v\n[Present advisories to user]\n    |\n    v\n[Apply user decisions]\n    |\n    v\n[Snapshot: post-review] (if learning active)\n    |\n    v\nFinal text (user may edit further)\n    |\n    v\n[/voice-learn captures post-edit] (user-triggered)\n```\n\n## Auto-Fix Rules (Silent)\n\nApplied immediately after generation, before review:\n\n```bash\n# Em dash replacement (context-aware)\n# Before a clause: use comma or colon\n# Parenthetical: use parentheses\n# List separator: use semicolons\n\n# Banned phrase removal\n# \"Furthermore,\" -> \"\" (start sentence without it)\n# \"It's important to note\" -> \"\" (remove entirely)\n# \"delve\" -> \"explore\" or \"examine\"\n# \"utilize\" -> \"use\"\n# \"leverage\" -> \"use\" or remove\n# \"comprehensive\" -> \"thorough\" or \"complete\"\n# \"robust\" -> \"solid\" or remove\n# \"seamless\" -> \"smooth\" or remove\n```\n\n## Model Routing\n\n| Stage | Model | Reason |\n|-------|-------|--------|\n| Generation | Opus | Tonal shifts, parenthetical subversion |\n| Auto-fix | Regex/local | No model needed |\n| Prose review | Sonnet | Structured detection prompts |\n| Craft review | Sonnet | Structured evaluation prompts |\n| Learning analysis | Opus | Nuanced pattern comparison |\n\n## Error Recovery\n\nIf generation fails quality checks (> 5 hard failures):\n1. Re-generate with stronger emphasis on banned phrases\n2. If second attempt still fails, present to user with warning\n3. Never loop more than twice (prevents infinite retry)\n\n## Streaming Considerations\n\nFor long-form content (> 1000 words):\n- Generate in sections (one per major heading)\n- Apply auto-fix per section\n- Allow user to review section-by-section or all at once\n- Snapshot captures the complete assembled text\n\nFile v1.9.12:modules/register-selection.md\n\n---\nmodule: register-selection\ncategory: voice-generation\ndependencies: [Read, Bash]\nestimated_tokens: 300\n---\n\n# Register Selection Module\n\nChoose the appropriate voice register for generation.\n\n## Selection Priority\n\n1. **Explicit request**: User says \"use casual register\"\n2. **Context match**: Register metadata matches the task\n3. **Default**: Fall back to `registers/default.md`\n\n## Context Matching\n\nEach register file has a `## Context` section describing\nwhen to use it. Match against the user's stated purpose:\n\n```\nUser: \"Write a blog post about...\"     -> default or narrative\nUser: \"Draft a technical doc for...\"   -> technical\nUser: \"Reply to this Reddit thread...\" -> casual\nUser: \"Write an email to my team...\"   -> professional\n```\n\n## Register Loading\n\n```bash\nPROFILE_DIR=\"$HOME/.claude/voice-profiles/$PROFILE_NAME\"\nREGISTER_FILE=\"$PROFILE_DIR/registers/${REGISTER_NAME}.md\"\n\nif [ ! -f \"$REGISTER_FILE\" ]; then\n  echo \"Register '$REGISTER_NAME' not found. Available:\"\n  ls \"$PROFILE_DIR/registers/\"\n  echo \"Using default register.\"\n  REGISTER_FILE=\"$PROFILE_DIR/registers/default.md\"\nfi\n```\n\n## Inheritance\n\nNon-default registers inherit from default unless they\nexplicitly override a section. When loading a non-default\nregister:\n\n1. Read `default.md` as base\n2. Read `{name}.md` for overrides and additions\n3. Merge: override sections replace, additions append\n\n## Listing Available Registers\n\nWhen user asks what registers exist:\n\n```bash\necho \"Available voice registers for $PROFILE_NAME:\"\nfor f in \"$PROFILE_DIR/registers/\"*.md; do\n  name=$(basename \"$f\" .md)\n  context=$(grep -A1 \"^## Context\" \"$f\" | tail -1)\n  echo \"  $name: $context\"\ndone\n```\n\nFile v1.9.12:modules/source-framing.md\n\n---\nmodule: source-framing\ncategory: voice-generation\ndependencies: []\nestimated_tokens: 400\n---\n\n# Source Framing Module\n\nHow source material is framed in the prompt is the single\nlargest variable in output quality. Larger than voice rules.\nLarger than model choice.\n\n## The Framing Lever\n\nWhen material is framed as \"raw notes I'm still thinking\nthrough,\" the output is dramatically better than when framed\nas \"a transcript to draw on\" or a bare topic sentence.\n\nThe framing changes how the model relates to the material:\n- Notes to think through -> text that feels like thinking\n- Summaries to report on -> text that feels like reporting\n- Transcripts to draw from -> text that feels like paraphrase\n\n## Default Framing (always use)\n\n```\nBelow are my rough notes on this topic. I'm still working\nthrough these ideas and haven't settled on a final structure.\nUse them as raw material for thinking, not as an outline\nto follow:\n\n---\n{source_material}\n---\n\nWrite a piece that engages with these ideas in the voice\ndescribed above. You don't need to cover everything in the\nnotes. Follow where the interesting threads lead.\n```\n\n## When User Provides Structured Input\n\nIf the user gives bullet points or an outline, still\nreframe as notes:\n\n```\nBelow are my working notes. These bullet points represent\nthreads I'm pulling on, not a structure to reproduce:\n\n---\n{bullet_points}\n---\n```\n\n## When User Provides a Topic Only\n\nIf just a topic sentence or phrase:\n\n```\nI want to write about: {topic}\n\nHere's what I'm thinking so far: I don't have notes yet,\nbut the angle I'm interested in is {topic}. Write an\nexploratory piece that discovers its argument as it goes.\n```\n\n## Override Framings\n\nOnly use these if the user explicitly requests a different\nrelationship to the source material:\n\n### \"Preserve my structure\"\n```\nBelow is an outline I want to follow. Keep the structure\nbut write each section in the voice described above:\n```\n\n### \"Respond to this\"\n```\nBelow is something I'm responding to. Write a response\nin the voice described above:\n```\n\n### \"Expand these points\"\n```\nBelow are key points I want to develop. Expand each one\ninto full prose in the voice described above:\n```\n\nFile v1.9.12:skill-card.md\n\n## Description: <br>\nGenerates text in a learned writing voice. <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 agents use this skill to draft prose in a saved writing voice by loading local voice profiles, choosing a register, framing source material as notes, and applying cleanup rules. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The skill may read local writing-voice profiles that contain sensitive stylistic or personal material. <br>\nMitigation: Use voice profiles only with permission from the writer and review profile contents before using them in generated drafts. <br>\nRisk: Generated drafts may imitate a writer's voice too closely or misrepresent authorship. <br>\nMitigation: Review generated text before publication and disclose or approve use according to the writer's policy. <br>\nRisk: Learning mode can save pre-review or post-review snapshots. <br>\nMitigation: Enable snapshot or learning workflows only where local retention is expected and permitted. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/athola/nm-scribe-voice-generate) <br>\n- [Publisher profile](https://clawhub.ai/user/athola) <br>\n- [OpenClaw homepage link from release 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, guidance] <br>\n**Output Format:** [Prose or Markdown draft text with generation and review guidance] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [May apply banned-phrase cleanup, replace em dashes, optionally dispatch review, and save snapshots when learning mode is enabled.] <br>\n\n## Skill Version(s): <br>\n1.9.12 (source: ClawHub release metadata) <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-generate Owner: athola Summary: Generates text in a learned writing voice Tags: latest:1.9.19 Version history: v1.9.19 | 2026-08-26T13:22:29.704Z | user Release v1.9.19 v1.9.17 | 2026-07-30T05:42:22.863Z | user Release v1.9.17 v1.9.16 | 2026-07-14T19:59:13.123Z | user Release v1.9.16 v1.9.14 | 2026-06-30T18:06:44.869Z | user Release v1.9.14 v1.9.13 | 2026-06-27T16:24:27.328Z | user Release v1.9.13 v1.9.1","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"PROFILE_DIR=\"$HOME/.claude/voice-profiles/{name}\""},{"language":"bash","snippet":"if [ -f \".voice/override.md\" ]; then\n  # Merge project overrides with profile\nfi"},{"language":"text","snippet":"Below are my rough notes on this topic. I'm still thinking\nthrough these ideas. Use them as the raw material for the\npiece, not as a structure to follow:\n\n---\n{user_provided_source_material}\n---"},{"language":"text","snippet":"You are writing a piece in a specific voice. The voice\nfeatures below were extracted from the writer's own work.\nFollow them as concrete instructions, not suggestions.\n\n## Voice Features\n\n{extraction.md content}\n\n## Active Register: {register_name}\n\n{register content}\n\n## Craft Techniques (apply all)\n\n- Concrete-first: Lead with specific, physical details before\n  any abstraction\n- Naming: When you describe a pattern in 2+ sentences, compress\n  it into a 2-4 word label\n- Opening moves: Start mid-thought, with a specific moment, or\n  with a counterintuitive claim. Never start with throat-clearing\n- Human-moment anchoring: Ground every abstraction in a specific\n  scene or lived experience\n- Aphoristic destinations: At least one sentence per section\n  should be worth repeating out of context\n\n## Banned (never use)\n\n{banned_phrases content, or default list:}\n- Em dashes (use commas, colons, semicolons, parentheses)\n- \"delve\", \"utilize\", \"leverage\", \"facilitate\"\n- \"it's important to note\", \"in today's world\"\n- \"here's the thing\", \"let that sink in\"\n- \"furthermore\", \"moreover\", \"comprehensive\"\n- Negation-correction patterns (\"This isn't X. This is Y.\")\n\n## Source Material\n\n{framed source material from Step 3}\n\n## Task\n\nWrite the piece. Follow the voice features precisely. Apply\ncraft techniques. Do not use any banned phrases. The output\nshould read as if the writer produced it themselves.\n\nLength: {user_specified or ~same as source material}\nFormat: {user_specified or prose paragraphs}"},{"language":"text","snippet":"Source Material\n    |\n    v\n[Frame as raw notes]\n    |\n    v\n[Load profile + register + craft rules]\n    |\n    v\n[Generate with Opus]\n    |\n    v\n[Auto-fix: banned phrases, em dashes]\n    |\n    v\n[Snapshot: pre-review] (if learning active)\n    |\n    v\n[Dispatch review agents] (optional)\n    |\n    v\n[Present advisories to user]\n    |\n    v\n[Apply user decisions]\n    |\n    v\n[Snapshot: post-review] (if learning active)\n    |\n    v\nFinal text (user may edit further)\n    |\n    v\n[/voice-learn captures post-edit] (user-triggered)"},{"language":"bash","snippet":"# Em dash replacement (context-aware)\n# Before a clause: use comma or colon\n# Parenthetical: use parentheses\n# List separator: use semicolons\n\n# Banned phrase removal\n# \"Furthermore,\" -> \"\" (start sentence without it)\n# \"It's important to note\" -> \"\" (remove entirely)\n# \"delve\" -> \"explore\" or \"examine\"\n# \"utilize\" -> \"use\"\n# \"leverage\" -> \"use\" or remove\n# \"comprehensive\" -> \"thorough\" or \"complete\"\n# \"robust\" -> \"solid\" or remove\n# \"seamless\" -> \"smooth\" or remove"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: voice-generate\ndescription: Generates text in a learned writing voice\nversion: 1.9.8\ntriggers:\n  - voice\n  - generation\n  - style-transfer\n  - writing\n  - registers\n  - drafting content that must match a specific author's style profile extracted by voice-extract\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:slop-detector\"]}}}\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 Generation Skill\n\nGenerate text in a user's extracted writing voice.\n\n## Core Principle: Source Material Framing\n\nThe single largest variable in output quality is how source\nmaterial is framed in the prompt. Material framed as \"raw\nnotes I'm still thinking through\" produces text that feels\nlike thinking. Material framed as summaries produces reporting.\n\nAlways frame user-provided source material as raw notes unless\nthe user explicitly requests otherwise.\n\n## Required TodoWrite Items\n\n1. `voice-generate:profile-loaded` - Voice profile read\n2. `voice-generate:register-selected` - Register chosen\n3. `voice-generate:source-framed` - Material framed as notes\n4. `voice-generate:generated` - Text produced\n5. `voice-generate:review-dispatched` - Sent to review agents\n\n## Step 1: Load Voice Profile\n\n```bash\nPROFILE_DIR=\"$HOME/.claude/voice-profiles/{name}\"\n```\n\nRead in order:\n1. `extraction.md` - Core voice features\n2. `registers/{register}.md` - Active register\n3. `craft-rules.md` - Shared craft techniques (if exists)\n4. `banned-phrases.md` - Anti-patterns to avoid (if exists)\n\nCheck for per-project override:\n```bash\nif [ -f \".voice/override.md\" ]; then\n  # Merge project overrides with profile\nfi\n```\n\n## Step 2: Register Selection\n\nLoad: `@modules/register-selection`\n\nSelect register by:\n1. Explicit user request (\"use casual register\")\n2. Context matching from register metadata\n3. Default fallback to `registers/default.md`\n\n## Step 3: Frame Source Material\n\nLoad: `@modules/source-framing`\n\n**Default framing** (always use unless user overrides):\n\n```\nBelow are my rough notes on this topic. I'm still thinking\nthrough these ideas. Use them as the raw material for the\npiece, not as a structure to follow:\n\n---\n{user_provided_source_material}\n---\n```\n\n**Alternative framings** (only if user requests):\n- \"structured outline\" - when user wants to preserve structure\n- \"key points to cover\" - when user provides bullet points\n- \"conversation to draw from\" - when source is a transcript\n\n## Step 4: Generation Prompt\n\nCompose the generation prompt:\n\n```\nYou are writing a piece in a specific voice. The voice\nfeatures below were extracted from the writer's own work.\nFollow them"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7d107jg9jv602h9ytsegydq184a42s\",\n  \"slug\": \"nm-scribe-voice-generate\",\n  \"version\": \"1.9.19\",\n  \"publishedAt\": 1787750549704\n}"},{"path":"modules/generation-pipeline.md","content":"---\nmodule: generation-pipeline\ncategory: voice-generation\ndependencies: [Read, Write, Agent]\nestimated_tokens: 500\n---\n\n# Generation Pipeline Module\n\nEnd-to-end generation flow from source material to reviewed text.\n\n## Pipeline Stages\n\n```\nSource Material\n    |\n    v\n[Frame as raw notes]\n    |\n    v\n[Load profile + register + craft rules]\n    |\n    v\n[Generate with Opus]\n    |\n    v\n[Auto-fix: banned phrases, em dashes]\n    |\n    v\n[Snapshot: pre-review] (if learning active)\n    |\n    v\n[Dispatch review agents] (optional)\n    |\n    v\n[Present advisories to user]\n    |\n    v\n[Apply user decisions]\n    |\n    v\n[Snapshot: post-review] (if learning active)\n    |\n    v\nFinal text (user may edit further)\n    |\n    v\n[/voice-learn captures post-edit] (user-triggered)\n```\n\n## Auto-Fix Rules (Silent)\n\nApplied immediately after generation, before review:\n\n```bash\n# Em dash replacement (context-aware)\n# Before a clause: use comma or colon\n# Parenthetical: use parentheses\n# List separator: use semicolons\n\n# Banned phrase removal\n# \"Furthermore,\" -> \"\" (start sentence without it)\n# \"It's important to note\" -> \"\" (remove entirely)\n# \"delve\" -> \"explore\" or \"examine\"\n# \"utilize\" -> \"use\"\n# \"leverage\" -> \"use\" or remove\n# \"comprehensive\" -> \"thorough\" or \"complete\"\n# \"robust\" -> \"solid\" or remove\n# \"seamless\" -> \"smooth\" or remove\n```\n\n## Model Routing\n\n| Stage | Model | Reason |\n|-------|-------|--------|\n| Generation | Opus | Tonal shifts, parenthetical subversion |\n| Auto-fix | Regex/local | No model needed |\n| Prose review | Sonnet | Structured detection prompts |\n| Craft review | Sonnet | Structured evaluation prompts |\n| Learning analysis | Opus | Nuanced pattern comparison |\n\n## Error Recovery\n\nIf generation fails quality checks (> 5 hard failures):\n1. Re-generate with stronger emphasis on banned phrases\n2. If second attempt still fails, present to user with warning\n3. Never loop more than twice (prevents infinite retry)\n\n## Streaming Considerations\n\nFor long-form content (> 1000 words):\n- Generate in sections (one per major heading)\n- Apply auto-fix per section\n- Allow user to review section-by-section or all at once\n- Snapshot captures the complete assembled text"},{"path":"modules/register-selection.md","content":"---\nmodule: register-selection\ncategory: voice-generation\ndependencies: [Read, Bash]\nestimated_tokens: 300\n---\n\n# Register Selection Module\n\nChoose the appropriate voice register for generation.\n\n## Selection Priority\n\n1. **Explicit request**: User says \"use casual register\"\n2. **Context match**: Register metadata matches the task\n3. **Default**: Fall back to `registers/default.md`\n\n## Context Matching\n\nEach register file has a `## Context` section describing\nwhen to use it. Match against the user's stated purpose:\n\n```\nUser: \"Write a blog post about...\"     -> default or narrative\nUser: \"Draft a technical doc for...\"   -> technical\nUser: \"Reply to this Reddit thread...\" -> casual\nUser: \"Write an email to my team...\"   -> professional\n```\n\n## Register Loading\n\n```bash\nPROFILE_DIR=\"$HOME/.claude/voice-profiles/$PROFILE_NAME\"\nREGISTER_FILE=\"$PROFILE_DIR/registers/${REGISTER_NAME}.md\"\n\nif [ ! -f \"$REGISTER_FILE\" ]; then\n  echo \"Register '$REGISTER_NAME' not found. Available:\"\n  ls \"$PROFILE_DIR/registers/\"\n  echo \"Using default register.\"\n  REGISTER_FILE=\"$PROFILE_DIR/registers/default.md\"\nfi\n```\n\n## Inheritance\n\nNon-default registers inherit from default unless they\nexplicitly override a section. When loading a non-default\nregister:\n\n1. Read `default.md` as base\n2. Read `{name}.md` for overrides and additions\n3. Merge: override sections replace, additions append\n\n## Listing Available Registers\n\nWhen user asks what registers exist:\n\n```bash\necho \"Available voice registers for $PROFILE_NAME:\"\nfor f in \"$PROFILE_DIR/registers/\"*.md; do\n  name=$(basename \"$f\" .md)\n  context=$(grep -A1 \"^## Context\" \"$f\" | tail -1)\n  echo \"  $name: $context\"\ndone\n```"},{"path":"modules/source-framing.md","content":"---\nmodule: source-framing\ncategory: voice-generation\ndependencies: []\nestimated_tokens: 400\n---\n\n# Source Framing Module\n\nHow source material is framed in the prompt is the single\nlargest variable in output quality. Larger than voice rules.\nLarger than model choice.\n\n## The Framing Lever\n\nWhen material is framed as \"raw notes I'm still thinking\nthrough,\" the output is dramatically better than when framed\nas \"a transcript to draw on\" or a bare topic sentence.\n\nThe framing changes how the model relates to the material:\n- Notes to think through -> text that feels like thinking\n- Summaries to report on -> text that feels like reporting\n- Transcripts to draw from -> text that feels like paraphrase\n\n## Default Framing (always use)\n\n```\nBelow are my rough notes on this topic. I'm still working\nthrough these ideas and haven't settled on a final structure.\nUse them as raw material for thinking, not as an outline\nto follow:\n\n---\n{source_material}\n---\n\nWrite a piece that engages with these ideas in the voice\ndescribed above. You don't need to cover everything in the\nnotes. Follow where the interesting threads lead.\n```\n\n## When User Provides Structured Input\n\nIf the user gives bullet points or an outline, still\nreframe as notes:\n\n```\nBelow are my working notes. These bullet points represent\nthreads I'm pulling on, not a structure to reproduce:\n\n---\n{bullet_points}\n---\n```\n\n## When User Provides a Topic Only\n\nIf just a topic sentence or phrase:\n\n```\nI want to write about: {topic}\n\nHere's what I'm thinking so far: I don't have notes yet,\nbut the angle I'm interested in is {topic}. Write an\nexploratory piece that discovers its argument as it goes.\n```\n\n## Override Framings\n\nOnly use these if the user explicitly requests a different\nrelationship to the source material:\n\n### \"Preserve my structure\"\n```\nBelow is an outline I want to follow. Keep the structure\nbut write each section in the voice described above:\n```\n\n### \"Respond to this\"\n```\nBelow is something I'm responding to. Write a response\nin the voice described above:\n```\n\n### \"Expand these points\"\n```\nBelow are key points I want to develop. Expand each one\ninto full prose in the voice described above:\n```"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Generates text in a learned writing voice Skill: voice-generate Owner: athola Summary: Generates text in a learned writing voice Tags: latest:1.9.19 Version history: v1.9.19 | 2026-08-26T13:22:29.704Z | user Release v1.9.19 v1.9.17 | 2026-07-30T05:42:22.863Z | user Release v1.9.17 v1.9.16 | 2026-07-14T19:59:13.123Z | user Release v1.9.16 v1.9.14 | 2026-06-30T18:06:44.869Z | user Release v1.9.14 v1.9.13 | 2026-06-27T16:24:27.328Z | user Release v1.9.13 v1.9.1","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1103,"uniquenessScore":52,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-12T00:24:24.802Z","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-12T00:24:24.802Z","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-13T02:49:51.197Z","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"}]}}}