{"id":"6aa9a313-ac2d-4711-ab33-966caa0310c3","shortId":"9ABAqe","kind":"skill","title":"blog-persona","tagline":"Create and manage writing personas with NNGroup 4-dimension tone framework (Funny-Serious, Formal-Casual, Respectful-Irreverent, Enthusiastic-Matter-of-fact). Personas define readability targets, sentence length distribution, vocabulary tier, contraction frequency, and summary bo","description":"# Blog Persona - Writing Voice Management\n\nCreate, store, and enforce writing personas based on the NNGroup 4-dimension tone\nframework and CMI Brand Voice Chart. Personas ensure consistent voice across all\nblog content produced by blog-write and blog-rewrite.\n\n## Commands\n\n| Command | Purpose |\n|---------|---------|\n| `/blog persona create` | Interactive interview to build a new persona |\n| `/blog persona list` | Show all saved personas |\n| `/blog persona use <name>` | Set active persona for current session |\n| `/blog persona show <name>` | Display full persona profile |\n\n## Create Workflow\n\nRun the 6-step interactive interview. Ask each step, wait for response, then proceed.\n\n### Step 1: Brand Basics\n\nAsk the user for:\n- **Brand name** - company or personal brand\n- **Industry** - primary sector (e.g., SaaS, health, finance, education)\n- **Target audience** - who reads the blog (role, experience level, goals)\n- **One-sentence brand mission** - what the brand helps people do\n\n### Step 2: Tone Dimensions (NNGroup Framework)\n\nPresent each dimension as a 0.0 to 1.0 slider. Explain both ends with examples.\n\n| Dimension | 0.0 End | 1.0 End | Example at 0.0 | Example at 1.0 |\n|-----------|---------|---------|-----------------|-----------------|\n| funny_serious | Funny | Serious | \"Let's be real, nobody reads Terms of Service\" | \"Understanding legal agreements protects your business\" |\n| formal_casual | Formal | Casual | \"We are pleased to announce\" | \"Guess what - we shipped it!\" |\n| respectful_irreverent | Respectful | Irreverent | \"We appreciate your patience\" | \"Yeah, that old way was broken\" |\n| enthusiastic_matter_of_fact | Enthusiastic | Matter-of-fact | \"This changes everything!\" | \"Here are the results.\" |\n\nDefaults if user is unsure: `[0.6, 0.5, 0.3, 0.5]` (slightly serious, balanced formality,\nrespectful, balanced enthusiasm).\n\n### Step 3: Writing Rules\n\nAsk the user to pick a **vocabulary tier** first, then auto-suggest the matching\nreadability band (user can override).\n\n| Setting | What to Ask | Default |\n|---------|-------------|---------|\n| Vocabulary tier | Consumer, Professional, or Technical | Professional |\n| Readability band | Auto-filled from tier (see table below) | Grade 8-10 |\n| Sentence length mean | Average words per sentence | 18 |\n| Sentence length std | Variation in sentence length | 6 |\n| Contraction frequency | 0.0 (never) to 1.0 (always) | 0.6 |\n| Max passive voice | Percentage cap on passive constructions | 10% |\n\n### Step 4: Do's and Don'ts (CMI Brand Voice Chart)\n\nAsk for 3-5 items in each list. Provide starter examples based on the tone dimensions.\n\n**Example Do's:** \"Use data to back claims\", \"Address the reader as you\",\n\"Open with a question or stat\"\n\n**Example Don'ts:** \"Don't use jargon without defining it\", \"Don't start sentences\nwith There is/There are\", \"Don't use cliches like game-changer\"\n\n### Step 5: Summary Label Preference\n\nThe label used for summary/takeaway boxes in blog posts. Ask user to pick one:\n\n- Key Takeaways (default)\n- The Bottom Line\n- What You'll Learn\n- TL;DR\n- Quick Summary\n- In a Nutshell\n- Custom label\n\n### Step 6: Voice Samples (Optional)\n\nAsk if the user has 1-3 URLs of existing content that exemplifies the desired voice.\nStore URLs in the persona for future reference. If provided, read each URL and extract:\n- Average sentence length\n- Contraction frequency\n- Tone dimension estimates\n- Vocabulary level\n\nCompare extracted values with the persona settings and flag any mismatches.\n\n### Save\n\nWrite the completed persona as JSON to:\n`skills/blog/references/personas/<name>.json`\n\nUse kebab-case for the filename (e.g., `acme-saas.json`).\n\n## Persona Profile Schema\n\n```json\n{\n  \"name\": \"acme-saas\",\n  \"description\": \"Professional SaaS voice for B2B marketing content\",\n  \"brand\": \"Acme Corp\",\n  \"industry\": \"SaaS\",\n  \"audience\": \"Marketing managers at mid-market companies\",\n  \"mission\": \"Help marketing teams automate reporting\",\n  \"tone_dimensions\": {\n    \"funny_serious\": 0.7,\n    \"formal_casual\": 0.4,\n    \"respectful_irreverent\": 0.2,\n    \"enthusiastic_matter_of_fact\": 0.5\n  },\n  \"readability\": {\n    \"flesch_grade_min\": 8,\n    \"flesch_grade_max\": 10,\n    \"flesch_ease_min\": 50,\n    \"flesch_ease_max\": 60\n  },\n  \"style\": {\n    \"sentence_length_mean\": 18,\n    \"sentence_length_std\": 6,\n    \"contraction_frequency\": 0.6,\n    \"passive_voice_max_pct\": 10,\n    \"vocabulary_tier\": \"professional\",\n    \"summary_label\": \"Key Takeaways\"\n  },\n  \"voice_samples\": [],\n  \"do\": [\n    \"Use data to back every major claim\",\n    \"Address the reader directly as you\",\n    \"Lead sections with actionable insight\"\n  ],\n  \"dont\": [\n    \"Don't use buzzwords without context\",\n    \"Don't write sentences longer than 30 words\",\n    \"Don't open with We at Acme\"\n  ]\n}\n```\n\n## Readability Bands by Vocabulary Tier\n\n| Tier | Flesch Grade | Flesch Ease | Typical Use |\n|------|-------------|-------------|-------------|\n| Consumer | 6-8 | 60-80 | Health, lifestyle, personal finance |\n| Professional | 8-10 | 50-60 | B2B, marketing, management |\n| Technical | 10-12 | 30-50 | Engineering, medical, legal |\n\nWhen the user picks a tier, auto-fill the readability fields. Let them override\nif they want a non-standard combination (e.g., technical vocabulary at consumer\nreadability for explainer content).\n\n## Integration with blog-write and blog-rewrite\n\nWhen a persona is active (via `/blog persona use <name>`), the writer agent loads\nthe persona JSON and enforces these constraints during generation:\n\n1. **Pre-generation** - Load persona, inject tone dimensions and style rules into\n   the system prompt for the blog-writer agent.\n2. **During generation** - Writer follows do/dont rules, targets sentence length\n   mean/std, uses contractions at specified frequency.\n3. **Post-generation validation** - Check the output against persona constraints:\n   - Sentence length distribution within 1 std of target mean\n   - Readability score within the specified grade band\n   - Passive voice percentage under the max\n   - No violations of \"dont\" rules found via pattern matching\n\nIf validation fails, flag the specific violations and suggest edits.\n\n## List Command\n\nGlob `skills/blog/references/personas/*.json` and display a table:\n\n| Persona | Industry | Audience | Vocabulary |\n|---------|----------|----------|------------|\n| acme-saas | SaaS | Marketing managers | Professional |\n\nIf no personas exist, prompt the user to create one.\n\n## Show Command\n\nRead the specified persona JSON and display it as a formatted summary with all\ntone dimensions, style rules, and do/dont lists.\n\n## Use Command\n\nRead the persona JSON and confirm activation. Print a summary of the key constraints\nthat will be enforced. The persona stays active for the current conversation session.\nBlog-write and blog-rewrite check for the active persona before generating content.\n\n## Error Handling\n\n- **Invalid tone values**: If a user provides values outside 0.0-1.0, clamp to the nearest valid bound and warn\n- **Unreachable voice samples**: If a URL in voice_samples returns an error, skip it and note in the profile that the sample was unavailable\n- **Empty personas directory**: When running list or show with no personas saved, prompt the user to create one first\n- **Name conflicts**: If a persona name already exists during create, ask whether to overwrite or choose a different name\n- **Malformed JSON**: If a persona file is corrupted, report the error and offer to recreate it from the interview","tags":["blog","persona","claude","agricidaniel","agent-skills","ai-citations","ai-content","ai-marketing","ai-marketing-hub","blog-writing","claude-code","claude-code-skill"],"capabilities":["skill","source-agricidaniel","skill-blog-persona","topic-agent-skills","topic-ai-citations","topic-ai-content","topic-ai-marketing","topic-ai-marketing-hub","topic-blog","topic-blog-writing","topic-claude-code","topic-claude-code-skill","topic-claude-plugin","topic-claude-skill","topic-content-creation"],"categories":["claude-blog"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/AgriciDaniel/claude-blog/blog-persona","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add AgriciDaniel/claude-blog","source_repo":"https://github.com/AgriciDaniel/claude-blog","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 753 github stars · SKILL.md body (7,476 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T18:53:30.920Z","embedding":null,"createdAt":"2026-05-18T12:54:53.890Z","updatedAt":"2026-05-18T18:53:30.920Z","lastSeenAt":"2026-05-18T18:53:30.920Z","tsv":"'-1.0':991 '-10':337,715 '-12':723 '-3':492 '-5':385 '-50':725 '-60':717 '-8':706 '-80':708 '/blog':87,97,104,113,776 '0.0':190,200,206,356,990 '0.2':602 '0.3':280 '0.4':599 '0.5':279,281,607 '0.6':278,361,636 '0.7':596 '1':137,491,792,845 '1.0':192,202,209,359 '10':370,616,641,722 '18':345,629 '2':180,814 '3':290,384,830 '30':683,724 '4':11,58,372 '5':444 '50':620,716 '6':124,353,482,633,705 '60':624,707 '8':336,612,714 'acm':563,574,691,896 'acme-saa':562,895 'acme-saas.json':556 'across':71 'action':668 'activ':108,774,943,958,974 'address':406,659 'agent':781,813 'agreement':225 'alreadi':1049 'alway':360 'announc':237 'appreci':248 'ask':128,140,293,316,382,457,486,1053 'audienc':159,578,893 'auto':304,328,736 'auto-fil':327,735 'auto-suggest':303 'autom':590 'averag':341,517 'b2b':570,718 'back':404,655 'balanc':284,287 'band':309,326,693,856 'base':54,393 'basic':139 'blog':2,43,73,78,82,163,455,764,768,811,965,969 'blog-persona':1 'blog-rewrit':81,767,968 'blog-writ':77,763,810,964 'bo':42 'bottom':466 'bound':997 'box':453 'brand':64,138,144,149,171,175,379,573 'broken':256 'build':93 'busi':228 'buzzword':674 'cap':366 'case':551 'casual':20,230,232,598 'chang':267 'changer':442 'chart':66,381 'check':835,971 'choos':1058 'claim':405,658 'clamp':992 'clich':438 'cmi':63,378 'combin':751 'command':84,85,883,913,936 'compani':146,585 'compar':527 'complet':541 'confirm':942 'conflict':1044 'consist':69 'constraint':789,840,950 'construct':369 'consum':320,704,756 'content':74,496,572,760,978 'context':676 'contract':38,354,520,634,826 'convers':962 'corp':575 'corrupt':1069 'creat':4,48,89,120,910,1040,1052 'current':111,961 'custom':479 'data':402,653 'default':273,317,464 'defin':30,425 'descript':565 'desir':500 'differ':1060 'dimens':12,59,182,187,199,397,523,593,800,929 'direct':662 'directori':1026 'display':116,888,920 'distribut':35,843 'do/dont':819,933 'dont':670,866 'dr':473 'e.g':153,555,752 'eas':618,622,701 'edit':881 'educ':157 'empti':1024 'end':196,201,203 'enforc':51,787,954 'engin':726 'ensur':68 'enthusiasm':288 'enthusiast':25,257,261,603 'enthusiastic-matter-of-fact':24 'error':979,1011,1072 'estim':524 'everi':656 'everyth':268 'exampl':198,204,207,392,398,417 'exemplifi':498 'exist':495,905,1050 'experi':165 'explain':194,759 'extract':516,528 'fact':28,260,265,606 'fail':874 'field':740 'file':1067 'filenam':554 'fill':329,737 'financ':156,712 'first':301,1042 'flag':535,875 'flesch':609,613,617,621,698,700 'follow':818 'formal':19,229,231,285,597 'formal-casu':18 'format':924 'found':868 'framework':14,61,184 'frequenc':39,355,521,635,829 'full':117 'funni':16,210,212,594 'funny-seri':15 'futur':508 'game':441 'game-chang':440 'generat':791,795,816,833,977 'glob':884 'goal':167 'grade':335,610,614,699,855 'guess':238 'handl':980 'health':155,709 'help':176,587 'industri':150,576,892 'inject':798 'insight':669 'integr':761 'interact':90,126 'interview':91,127,1080 'invalid':981 'irrever':23,244,246,601 'is/there':433 'item':386 'jargon':423 'json':544,547,560,785,886,918,940,1063 'kebab':550 'kebab-cas':549 'key':462,647,949 'label':446,449,480,646 'lead':665 'learn':471 'legal':224,728 'length':34,339,347,352,519,627,631,823,842 'let':214,741 'level':166,526 'lifestyl':710 'like':439 'line':467 'list':99,389,882,934,1029 'll':470 'load':782,796 'longer':681 'major':657 'malform':1062 'manag':6,47,580,720,900 'market':571,579,584,588,719,899 'match':307,871 'matter':26,258,263,604 'matter-of-fact':262 'max':362,615,623,639,862 'mean':340,628,849 'mean/std':824 'medic':727 'mid':583 'mid-market':582 'min':611,619 'mismatch':537 'mission':172,586 'name':145,561,1043,1048,1061 'nearest':995 'never':357 'new':95 'nngroup':10,57,183 'nobodi':218 'non':749 'non-standard':748 'note':1015 'nutshel':478 'offer':1074 'old':253 'one':169,461,911,1041 'one-sent':168 'open':411,687 'option':485 'output':837 'outsid':989 'overrid':312,743 'overwrit':1056 'passiv':363,368,637,857 'patienc':250 'pattern':870 'pct':640 'peopl':177 'per':343 'percentag':365,859 'person':148,711 'persona':3,8,29,44,53,67,88,96,98,103,105,109,114,118,506,532,542,557,772,777,784,797,839,891,904,917,939,956,975,1025,1034,1047,1066 'pick':297,460,732 'pleas':235 'post':456,832 'post-gener':831 'pre':794 'pre-gener':793 'prefer':447 'present':185 'primari':151 'print':944 'proceed':135 'produc':75 'profession':321,324,566,644,713,901 'profil':119,558,1018 'prompt':807,906,1036 'protect':226 'provid':390,511,987 'purpos':86 'question':414 'quick':474 'read':161,219,512,914,937 'readabl':31,308,325,608,692,739,757,850 'reader':408,661 'real':217 'recreat':1076 'refer':509 'report':591,1070 'respect':22,243,245,286,600 'respectful-irrever':21 'respons':133 'result':272 'return':1009 'rewrit':83,769,970 'role':164 'rule':292,803,820,867,931 'run':122,1028 'saa':154,564,567,577,897,898 'sampl':484,650,1002,1008,1021 'save':102,538,1035 'schema':559 'score':851 'section':666 'sector':152 'see':332 'sentenc':33,170,338,344,346,351,430,518,626,630,680,822,841 'serious':17,211,213,283,595 'servic':222 'session':112,963 'set':107,313,533 'ship':241 'show':100,115,912,1031 'skill' 'skill-blog-persona' 'skills/blog/references/personas':546,885 'skip':1012 'slider':193 'slight':282 'source-agricidaniel' 'specif':877 'specifi':828,854,916 'standard':750 'start':429 'starter':391 'stat':416 'stay':957 'std':348,632,846 'step':125,130,136,179,289,371,443,481 'store':49,502 'style':625,802,930 'suggest':305,880 'summari':41,445,475,645,925,946 'summary/takeaway':452 'system':806 'tabl':333,890 'takeaway':463,648 'target':32,158,821,848 'team':589 'technic':323,721,753 'term':220 'tier':37,300,319,331,643,696,697,734 'tl':472 'tone':13,60,181,396,522,592,799,928,982 'topic-agent-skills' 'topic-ai-citations' 'topic-ai-content' 'topic-ai-marketing' 'topic-ai-marketing-hub' 'topic-blog' 'topic-blog-writing' 'topic-claude-code' 'topic-claude-code-skill' 'topic-claude-plugin' 'topic-claude-skill' 'topic-content-creation' 'ts':377,419 'typic':702 'unavail':1023 'understand':223 'unreach':1000 'unsur':277 'url':493,503,514,1005 'use':106,401,422,437,450,548,652,673,703,778,825,935 'user':142,275,295,310,458,489,731,908,986,1038 'valid':834,873,996 'valu':529,983,988 'variat':349 'via':775,869 'violat':864,878 'vocabulari':36,299,318,525,642,695,754,894 'voic':46,65,70,364,380,483,501,568,638,649,858,1001,1007 'wait':131 'want':746 'warn':999 'way':254 'whether':1054 'within':844,852 'without':424,675 'word':342,684 'workflow':121 'write':7,45,52,79,291,539,679,765,966 'writer':780,812,817 'yeah':251","prices":[{"id":"07240068-3a4f-4ccb-b173-716b14383631","listingId":"6aa9a313-ac2d-4711-ab33-966caa0310c3","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"AgriciDaniel","category":"claude-blog","install_from":"skills.sh"},"createdAt":"2026-05-18T12:54:53.890Z"}],"sources":[{"listingId":"6aa9a313-ac2d-4711-ab33-966caa0310c3","source":"github","sourceId":"AgriciDaniel/claude-blog/blog-persona","sourceUrl":"https://github.com/AgriciDaniel/claude-blog/tree/main/skills/blog-persona","isPrimary":false,"firstSeenAt":"2026-05-18T12:54:53.890Z","lastSeenAt":"2026-05-18T18:53:30.920Z"}],"details":{"listingId":"6aa9a313-ac2d-4711-ab33-966caa0310c3","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"AgriciDaniel","slug":"blog-persona","github":{"repo":"AgriciDaniel/claude-blog","stars":753,"topics":["agent-skills","ai","ai-citations","ai-content","ai-marketing","ai-marketing-hub","blog","blog-writing","claude-code","claude-code-skill","claude-plugin","claude-skill","content-creation","content-optimization","content-strategy","eeat","geo","multilingual","open-source","seo"],"license":"mit","html_url":"https://github.com/AgriciDaniel/claude-blog","pushed_at":"2026-05-15T04:45:18Z","description":"Claude Code blog skill suite: 30 sub-skills, 5 agents, 5-gate v1.9.0 Blog Delivery Contract, dual-optimized for Google rankings and AI citations. Active development at AI-Marketing-Hub/claude-blog (AI Marketing Hub Pro community); public releases ship here.","skill_md_sha":"8752a35f272f800fc36d3d003792821f2656bc93","skill_md_path":"skills/blog-persona/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/AgriciDaniel/claude-blog/tree/main/skills/blog-persona"},"layout":"multi","source":"github","category":"claude-blog","frontmatter":{"name":"blog-persona","license":"MIT","description":"Create and manage writing personas with NNGroup 4-dimension tone framework (Funny-Serious, Formal-Casual, Respectful-Irreverent, Enthusiastic-Matter-of-fact). Personas define readability targets, sentence length distribution, vocabulary tier, contraction frequency, and summary box label. Used by blog-write and blog-rewrite to enforce consistent voice. Use when user says \"persona\", \"voice\", \"tone\", \"writing style\", \"brand voice\", \"create persona\", \"use persona\"."},"skills_sh_url":"https://skills.sh/AgriciDaniel/claude-blog/blog-persona"},"updatedAt":"2026-05-18T18:53:30.920Z"}}