Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Extracts writing style patterns from exemplar text into a reusable profile. Use when creating a style guide or learning a specific author's voice.
.claude/skills/athola-style-learner/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-10 | ✗→✓ | ▲ Improved | 90% | 0% |
| case-20 | ✗→✓ | ▲ Improved | -8% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 12% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 12% | 0% |
| case-14 | ✗→✓ | ▲ Improved | 12% | 0% |
A style profile is metrics plus exemplars. Either alone is too weak to reproduce a voice.
Extract style from exemplar text and codify it as a profile that downstream skills (scribe:doc-generator, scribe:voice-generate) can apply consistently.
scribe:voice-extract)
scribe:voice-review)The skill combines two methods because each fails alone:
length distribution, vocabulary complexity, structural patterns). Reproducible but soulless.
demonstrate the target style. Vivid but hard to apply at scale.
Together they form a profile precise enough to score new text and rich enough to guide rewrites. Metrics catch what exemplars miss. Exemplars carry what metrics flatten.
style-learner:exemplar-collected - Source texts gatheredstyle-learner:features-extracted - Quantitative metrics computedstyle-learner:exemplars-selected - Representative passages identifiedstyle-learner:profile-generated - Style guide createdstyle-learner:validation-complete - Profile tested against new contentGather representative samples of the target style.
Minimum requirements:
markdown## Exemplar Sources | Source | Word Count | Type | |--------|------------|------| | README.md | 850 | Technical | | blog-post-1.md | 1200 | Narrative | | api-guide.md | 2100 | Reference |
Load: @modules/feature-extraction.md
| Metric | How to Measure | What It Indicates | |--------|----------------|-------------------| | Average word length | chars/word | Complexity level | | Unique word ratio | unique/total | Vocabulary breadth | | Jargon density | technical terms/100 words | Audience level | | Contraction rate | contractions/sentences | Formality |
| Metric | How to Measure | What It Indicates | |--------|----------------|-------------------| | Average length | words/sentence | Complexity | | Length variance | std dev of lengths | Natural variation | | Question frequency | questions/100 sentences | Engagement style | | Fragment usage | fragments/100 sentences | Stylistic punch |
| Metric | How to Measure | What It Indicates | |--------|----------------|-------------------| | Paragraph length | sentences/paragraph | Density | | List ratio | bullet lines/total lines | Format preference | | Header depth | max header level | Organization style | | Code block frequency | code blocks/1000 words | Technical density |
| Metric | Normal Range | Style Indicator | |--------|--------------|-----------------| | Em dash rate | 0-3/1000 words | Parenthetical style | | Semicolon rate | 0-2/1000 words | Formal complexity | | Exclamation rate | 0-1/1000 words | Enthusiasm level | | Ellipsis rate | 0-1/1000 words | Trailing thought style |
Load: @modules/exemplar-reference.md
Select 3-5 passages (50-150 words each) that best represent the target style.
Selection criteria:
markdown### Exemplar 1: [Label] **Source**: [filename, lines X-Y] **Demonstrates**: [what aspect of style] > [Quoted passage] **Key characteristics**: - [Observation 1] - [Observation 2]
Combine extracted features and exemplars into a usable style guide.
yaml# Style Profile: [Name] # Generated: [Date] # Exemplar sources: [List] voice: tone: [professional/casual/academic/conversational] perspective: [first-person/third-person/second-person] formality: [formal/neutral/informal] vocabulary: average_word_length: X.X jargon_level: [none/light/moderate/heavy] contractions: [avoid/occasional/frequent] preferred_terms: - "use" over "utilize" - "help" over "facilitate" avoided_terms: - delve - leverage - comprehensive sentences: average_length: XX words length_variance: [low/medium/high] fragments_allowed: [yes/no/sparingly] questions_used: [yes/no/sparingly] structure: paragraphs: [short/medium/long] (X-Y sentences) lists: [prefer prose/balanced/prefer lists] headers: [descriptive/terse/question-style] punctuation: em_dashes: [avoid/sparingly/freely] semicolons: [avoid/sparingly/freely] oxford_comma: [yes/no] exemplars: - label: "[Exemplar 1 label]" text: | [Quoted passage] - label: "[Exemplar 2 label]" text: | [Quoted passage] anti_patterns: - [Pattern to avoid 1] - [Pattern to avoid 2]
Test the profile against new content:
When generating new content, reference the profile:
markdownGenerate [content type] following the style profile: - Voice: [from profile] - Sentence length: target ~[X] words, vary between [Y-Z] - Use exemplar passage as tone reference: > [exemplar quote] - Avoid: [anti-patterns from profile]
modules/style-application.md for applying learned styles to new contentAfter generating content, run slop-detector to verify:
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-05 | fail→fail | 4,293 | 4,940 | +15% | 1 | 1 | 0% | 728 | 2,382 | +227% | 0 | 0 | — |
case-10 | fail→pass | 19,343 | 1,430 | -93% | 1 | 1 | 0% | 962 | 1,826 | +90% | 0 | 0 | — |
case-20 | fail→pass | 16,247 | 3,655 | -78% | 1 | 1 | 0% | 2,369 | 2,184 | -8% | 0 | 0 | — |
case-03 | fail→fail | 24,559 | 6,668 | -73% | 1 | 1 | 0% | 3,776 | 2,775 | -27% | 0 | 0 | — |
case-04 | fail→pass | 16,530 | 6,635 | -60% | 1 | 1 | 0% | 2,493 | 2,780 | +12% | 0 | 0 | — |
case-01 | fail→fail | 7,390 | 6,973 | -6% | 1 | 1 | 0% | 1,074 | 2,738 | +155% | 0 | 0 | — |
case-02 | fail→fail | 8,108 | 5,355 | -34% | 1 | 1 | 0% | 1,312 | 2,549 | +94% | 0 | 0 | — |
case-06 | fail→fail | 11,367 | 6,111 | -46% | 1 | 1 | 0% | 2,056 | 2,645 | +29% | 0 | 0 | — |
case-07 | fail→pass | 11,401 | 2,080 | -82% | 1 | 1 | 0% | 1,724 | 1,934 | +12% | 0 | 0 | — |
case-08 | pass→pass | 9,629 | 3,325 | -65% | 1 | 1 | 0% | 1,530 | 2,126 | +39% | 0 | 0 | — |
case-09 | pass→pass | 9,744 | 1,908 | -80% | 1 | 1 | 0% | 1,796 | 1,970 | +10% | 0 | 0 | — |
case-11 | pass→pass | 12,938 | 7,066 | -45% | 1 | 1 | 0% | 2,033 | 2,750 | +35% | 0 | 0 | — |
case-12 | pass→pass | 11,748 | 6,589 | -44% | 1 | 1 | 0% | 1,798 | 2,758 | +53% | 0 | 0 | — |
case-13 | pass→pass | 10,152 | 8,631 | -15% | 1 | 1 | 0% | 1,672 | 3,121 | +87% | 0 | 0 | — |
case-14 | fail→pass | 12,231 | 1,879 | -85% | 1 | 1 | 0% | 1,791 | 2,003 | +12% | 0 | 0 | — |
case-15 | fail→pass | 9,442 | 2,553 | -73% | 1 | 1 | 0% | 1,600 | 2,128 | +33% | 0 | 0 | — |
case-16 | fail→pass | 10,810 | 5,083 | -53% | 1 | 1 | 0% | 1,914 | 2,824 | +48% | 0 | 0 | — |
case-17 | pass→pass | 15,244 | 8,276 | -46% | 1 | 1 | 0% | 2,525 | 3,069 | +22% | 0 | 0 | — |
case-18 | fail→pass | 15,580 | 3,202 | -79% | 1 | 1 | 0% | 2,461 | 2,138 | -13% | 0 | 0 | — |
case-19 | fail→pass | 9,342 | 2,421 | -74% | 1 | 1 | 0% | 1,407 | 1,963 | +40% | 0 | 0 | — |
case-21 | pass→pass | 11,749 | 8,933 | -24% | 1 | 1 | 0% | 1,650 | 3,019 | +83% | 0 | 0 | — |
case-22 | pass→pass | 13,708 | 6,680 | -51% | 1 | 1 | 0% | 2,420 | 2,704 | +12% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 21 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +41 percentage points is the difference between those two pass rates over the 21 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.