{"id":"f09dd059-06bd-43ea-b790-fcf5a71a2fdd","shortId":"QzbuUd","kind":"skill","title":"blog-audit","tagline":"Full-site blog health assessment scanning all blog files for quality scores, orphan pages, topic cannibalization, stale content, and AI citation readiness. Spawns parallel subagents for comprehensive analysis. Produces per-post scores and a prioritized action queue. Use when user","description":"# Blog Audit -- Full-Site Health Assessment\n\nPerforms a comprehensive blog health assessment across all posts in the project.\nScans for quality scores, orphan pages, topic cannibalization, stale content,\nand AI citation readiness. Uses parallel subagents for efficient analysis and\nproduces a prioritized action queue.\n\n## Audit Process\n\n### Step 1: Discover Blog Files\n\nScan the project for all blog content files:\n\n- Glob for `*.md`, `*.mdx`, `*.html` in common blog directories\n- Common paths to check:\n  - `content/`\n  - `posts/`\n  - `blog/`\n  - `src/content/`\n  - `_posts/`\n  - `pages/blog/`\n  - `articles/`\n  - `src/pages/blog/`\n- Filter out non-blog files: README, CHANGELOG, LICENSE, config files,\n  SKILL.md, package.json, node_modules\n- Report: \"Found N blog files in [directories]\"\n\nIf no blog files are found in standard locations, search the entire project\nroot for markdown files with blog-like frontmatter (title, date, description).\n\n### Step 2: Parallel Analysis\n\nSpawn subagents via the Task tool for parallel processing across all\ndiscovered blog files:\n\n#### Content Quality Agent\n- Score each post on the 30-point content quality scale\n- Check paragraph length (target 40-80 words, hard limit 150)\n- Check sentence length (target 15-20 words)\n- Evaluate heading structure and question-format headings\n- Assess readability (Flesch Reading Ease 60-70 target)\n\n#### SEO Optimization Agent\n- Check on-page SEO elements per post:\n  - Title tag length (50-60 chars)\n  - Meta description (150-160 chars, includes statistic)\n  - H1 presence and uniqueness\n  - Image alt text coverage\n  - Internal and external link counts\n  - URL slug quality\n\n#### Schema Validation Agent\n- Detect structured data across all posts\n- Validate BlogPosting schema completeness\n- Check FAQ schema presence and format\n- Verify dateModified matches lastUpdated frontmatter\n- Flag missing or malformed schema\n\n#### Link Health Agent\n- Map internal links across all posts\n- Build a directed link graph\n- Detect orphan pages (zero inbound internal links)\n- Detect dead-end pages (zero outbound internal links)\n- Check for broken internal link targets\n- Recommend bidirectional link opportunities\n\n#### Freshness Check Agent\n- Read lastUpdated or dateModified from each post's frontmatter\n- Calculate days since last update\n- Flag posts not updated in 90+ days\n- Categorize by refresh priority\n\n#### AI Readiness Agent\n- Score each post for AI citation readiness\n- Check passage-level citability (120-180 word sections)\n- Evaluate Q&A formatting and entity clarity\n- Check for TL;DR boxes and citation capsules\n- Assess AI crawler accessibility\n\n### Step 3: Topic Cannibalization Detection\n\nAnalyze across all posts for keyword competition:\n\n1. Extract primary keyword/topic from each post:\n   - Title text\n   - H1 heading\n   - Meta description\n   - First paragraph\n2. Normalize keywords (lowercase, remove stop words)\n3. Detect multiple posts targeting the same primary keyword\n4. Flag competing posts with one of these recommendations:\n   - **Merge**: Combine two weak posts into one strong post\n   - **Redirect**: 301 redirect the weaker post to the stronger one\n   - **Differentiate**: Adjust focus so posts target distinct intents\n\n### Step 4: Orphan Page Detection\n\nBuild and analyze the internal link graph:\n\n1. For each blog post, extract all internal links (relative and absolute)\n2. Build an adjacency map: `{ page -> [pages it links to] }`\n3. Build a reverse map: `{ page -> [pages linking to it] }`\n4. Identify orphan pages: posts with zero inbound internal links\n5. Identify dead-end pages: posts with zero outbound internal links\n6. For each orphan, recommend 2-3 existing posts that should link to it\n   based on topic relevance\n\n### Step 5: Stale Content Detection\n\nAudit content freshness across all posts:\n\n1. Read frontmatter fields: `lastUpdated`, `dateModified`, `date`, `updated`\n2. Calculate days since last update for each post\n3. Categorize by refresh priority:\n   - **High** (>180 days): Likely outdated, statistics may be stale\n   - **Medium** (90-180 days): Review for accuracy, update statistics\n   - **Low** (<90 days): Recently updated, no immediate action\n4. Estimate refresh effort per post:\n   - Light refresh: Update statistics, check links (1-2 hours)\n   - Moderate refresh: Rewrite sections, add new data (3-4 hours)\n   - Heavy refresh: Full rewrite recommended (5+ hours)\n\n### Step 6: Generate Site-Wide Report\n\nAggregate all results into a comprehensive report:\n\n#### Summary Dashboard\n```\n## Blog Audit Report\n\n**Audit Date:** [date]\n**Total Posts:** N\n**Average Score:** XX/100\n\n### Health Overview\n| Metric | Count |\n|--------|-------|\n| Posts Scoring 90+ (Excellent) | N |\n| Posts Scoring 70-89 (Good) | N |\n| Posts Scoring 50-69 (Needs Work) | N |\n| Posts Scoring <50 (Poor) | N |\n| Orphan Pages | N |\n| Dead-End Pages | N |\n| Cannibalization Issues | N |\n| Stale Content (90+ days) | N |\n```\n\n#### Per-Post Table\n```\n### Per-Post Scores\n| Post | Score | Content | SEO | E-E-A-T | Technical | AI Citation | Issues |\n|------|-------|---------|-----|---------|-----------|-------------|--------|\n| [filename] | XX/100 | X/25 | X/20 | X/20 | X/15 | X/20 | [count] |\n```\n\n#### Prioritized Action Queue\n```\n### Prioritized Action Queue (Lowest Score First)\n| Priority | Post | Score | Top Issue | Recommended Action |\n|----------|------|-------|-----------|--------------------|\n| 1 | [file] | XX | [issue] | [action] |\n| 2 | [file] | XX | [issue] | [action] |\n```\n\n#### Cannibalization Report\n```\n### Topic Cannibalization\n| Keyword | Competing Posts | Recommendation |\n|---------|----------------|----------------|\n| [keyword] | post-a.md, post-b.md | Merge / Redirect / Differentiate |\n```\n\n#### Orphan Pages\n```\n### Orphan Pages (No Inbound Links)\n| Page | Inbound Links | Recommended Link Sources |\n|------|---------------|--------------------------|\n| [file] | 0 | post-a.md, post-b.md, post-c.md |\n```\n\n#### Stale Content\n```\n### Stale Content\n| Post | Last Updated | Days Stale | Priority | Refresh Effort |\n|------|-------------|------------|----------|----------------|\n| [file] | [date] | [N] | High/Med/Low | Light/Moderate/Heavy |\n```\n\n### Step 7: Save Report\n\nSave the complete report to `blog-audit-report.md` in the project root.\n\nAfter saving, inform the user:\n- Report location: `[project-root]/blog-audit-report.md`\n- Summary of findings (total posts, average score, critical issues count)\n- Suggest running `/blog analyze <file>` on the lowest-scoring post first\n- Suggest running `/blog geo <file>` for AI citation optimization on key posts\n\n## Cross-reference\n\nFor evidence-led audit prompts beyond this site-wide health pass, see `/blog flow optimize` (visibility, CTR, schema, extraction audits) and `/blog flow win` (dual-surface scorecard, conversion audit).","tags":["blog","audit","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-audit","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-audit","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 (6,810 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:29.244Z","embedding":null,"createdAt":"2026-05-18T12:54:51.460Z","updatedAt":"2026-05-18T18:53:29.244Z","lastSeenAt":"2026-05-18T18:53:29.244Z","tsv":"'-160':258 '-180':391,620 '-2':648 '-20':220 '-3':564 '-4':658 '-60':253 '-69':713 '-70':236 '-80':210 '-89':707 '/blog':879,890,916,925 '/blog-audit-report.md':866 '0':821 '1':94,425,504,587,647,783 '120':390 '15':219 '150':214,257 '180':610 '2':175,440,516,563,595,788 '3':414,447,526,604,657 '30':200 '301':475 '4':456,493,536,635 '40':209 '5':546,577,665 '50':252,712,719 '6':558,668 '60':235 '7':843 '70':706 '90':369,619,628,701,735 'absolut':515 'access':412 'accuraci':624 'across':59,187,284,313,419,584 'action':41,89,634,768,771,782,787,792 'add':654 'adjac':519 'adjust':485 'agent':194,240,280,309,349,377 'aggreg':674 'ai':24,76,375,382,410,756,893 'alt':267 'analysi':32,84,177 'analyz':418,499,880 'articl':125 'assess':9,52,58,230,409 'audit':3,47,91,581,684,686,906,923,933 'averag':692,872 'base':572 'beyond':908 'bidirect':344 'blog':2,7,12,46,56,96,103,113,121,131,145,151,168,190,507,683 'blog-audit':1 'blog-audit-report.md':851 'blog-lik':167 'blogpost':288 'box':405 'broken':339 'build':316,497,517,527 'calcul':359,596 'cannib':20,72,416,730,793,796 'capsul':408 'categor':371,605 'changelog':134 'char':254,259 'check':118,205,215,241,291,337,348,385,401,645 'citabl':389 'citat':25,77,383,407,757,894 'clariti':400 'combin':466 'common':112,115 'compet':458,798 'competit':424 'complet':290,848 'comprehens':31,55,679 'config':136 'content':22,74,104,119,192,202,579,582,734,748,826,828 'convers':932 'count':274,698,766,876 'coverag':269 'crawler':411 'critic':874 'cross':900 'cross-refer':899 'ctr':920 'dashboard':682 'data':283,656 'date':172,593,687,688,838 'datemodifi':298,353,592 'day':360,370,597,611,621,629,736,832 'dead':330,549,726 'dead-end':329,548,725 'descript':173,256,437 'detect':281,321,328,417,448,496,580 'differenti':484,806 'direct':318 'directori':114,148 'discov':95,189 'distinct':490 'dr':404 'dual':929 'dual-surfac':928 'e':751,752 'e-e-a-t':750 'eas':234 'effici':83 'effort':638,836 'element':246 'end':331,550,727 'entir':160 'entiti':399 'estim':636 'evalu':222,394 'evid':904 'evidence-l':903 'excel':702 'exist':565 'extern':272 'extract':426,509,922 'faq':292 'field':590 'file':13,97,105,132,137,146,152,165,191,784,789,820,837 'filenam':759 'filter':127 'find':869 'first':438,775,887 'flag':302,364,457 'flesch':232 'flow':917,926 'focus':486 'format':228,296,397 'found':143,154 'fresh':347,583 'frontmatt':170,301,358,589 'full':5,49,662 'full-sit':4,48 'generat':669 'geo':891 'glob':106 'good':708 'graph':320,503 'h1':262,434 'hard':212 'head':223,229,435 'health':8,51,57,308,695,913 'heavi':660 'high':609 'high/med/low':840 'hour':649,659,666 'html':110 'identifi':537,547 'imag':266 'immedi':633 'inbound':325,543,812,815 'includ':260 'inform':858 'intent':491 'intern':270,311,326,335,340,501,511,544,556 'issu':731,758,780,786,791,875 'key':897 'keyword':423,442,455,797,801 'keyword/topic':428 'last':362,599,830 'lastupd':300,351,591 'led':905 'length':207,217,251 'level':388 'licens':135 'light':641 'light/moderate/heavy':841 'like':169,612 'limit':213 'link':273,307,312,319,327,336,341,345,502,512,524,533,545,557,569,646,813,816,818 'locat':157,862 'low':627 'lowercas':443 'lowest':773,884 'lowest-scor':883 'malform':305 'map':310,520,530 'markdown':164 'match':299 'may':615 'md':108 'mdx':109 'medium':618 'merg':465,804 'meta':255,436 'metric':697 'miss':303 'moder':650 'modul':141 'multipl':449 'n':144,691,703,709,716,721,724,729,732,737,839 'need':714 'new':655 'node':140 'non':130 'non-blog':129 'normal':441 'on-pag':242 'one':461,471,483 'opportun':346 'optim':239,895,918 'orphan':17,69,322,494,538,561,722,807,809 'outbound':334,555 'outdat':613 'overview':696 'package.json':139 'page':18,70,244,323,332,495,521,522,531,532,539,551,723,728,808,810,814 'pages/blog':124 'paragraph':206,439 'parallel':28,80,176,185 'pass':914 'passag':387 'passage-level':386 'path':116 'per':35,247,639,739,743 'per-post':34,738,742 'perform':53 'point':201 'poor':720 'post':36,61,120,123,197,248,286,315,356,365,380,421,431,450,459,469,473,479,488,508,540,552,566,586,603,640,690,699,704,710,717,740,744,746,777,799,829,871,886,898 'post-a.md':802,822 'post-b.md':803,823 'post-c.md':824 'presenc':263,294 'primari':427,454 'priorit':40,88,767,770 'prioriti':374,608,776,834 'process':92,186 'produc':33,86 'project':64,100,161,854,864 'project-root':863 'prompt':907 'q':395 'qualiti':15,67,193,203,277 'question':227 'question-format':226 'queue':42,90,769,772 'read':233,350,588 'readabl':231 'readi':26,78,376,384 'readm':133 'recent':630 'recommend':343,464,562,664,781,800,817 'redirect':474,476,805 'refer':901 'refresh':373,607,637,642,651,661,835 'relat':513 'relev':575 'remov':444 'report':142,673,680,685,794,845,849,861 'result':676 'revers':529 'review':622 'rewrit':652,663 'root':162,855,865 'run':878,889 'save':844,846,857 'scale':204 'scan':10,65,98 'schema':278,289,293,306,921 'score':16,37,68,195,378,693,700,705,711,718,745,747,774,778,873,885 'scorecard':931 'search':158 'section':393,653 'see':915 'sentenc':216 'seo':238,245,749 'sinc':361,598 'site':6,50,671,911 'site-wid':670,910 'skill' 'skill-blog-audit' 'skill.md':138 'slug':276 'sourc':819 'source-agricidaniel' 'spawn':27,178 'src/content':122 'src/pages/blog':126 'stale':21,73,578,617,733,825,827,833 'standard':156 'statist':261,614,626,644 'step':93,174,413,492,576,667,842 'stop':445 'strong':472 'stronger':482 'structur':224,282 'subag':29,81,179 'suggest':877,888 'summari':681,867 'surfac':930 'tabl':741 'tag':250 'target':208,218,237,342,451,489 'task':182 'technic':755 'text':268,433 'titl':171,249,432 'tl':403 'tool':183 'top':779 'topic':19,71,415,574,795 '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' 'total':689,870 'two':467 'uniqu':265 'updat':363,367,594,600,625,631,643,831 'url':275 'use':43,79 'user':45,860 'valid':279,287 'verifi':297 'via':180 'visibl':919 'weak':468 'weaker':478 'wide':672,912 'win':927 'word':211,221,392,446 'work':715 'x/15':764 'x/20':762,763,765 'x/25':761 'xx':785,790 'xx/100':694,760 'zero':324,333,542,554","prices":[{"id":"f3f3ddae-ed32-4201-bb2b-db3e778b2b88","listingId":"f09dd059-06bd-43ea-b790-fcf5a71a2fdd","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:51.460Z"}],"sources":[{"listingId":"f09dd059-06bd-43ea-b790-fcf5a71a2fdd","source":"github","sourceId":"AgriciDaniel/claude-blog/blog-audit","sourceUrl":"https://github.com/AgriciDaniel/claude-blog/tree/main/skills/blog-audit","isPrimary":false,"firstSeenAt":"2026-05-18T12:54:51.460Z","lastSeenAt":"2026-05-18T18:53:29.244Z"}],"details":{"listingId":"f09dd059-06bd-43ea-b790-fcf5a71a2fdd","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"AgriciDaniel","slug":"blog-audit","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":"72483519b390a430c0a1a6faf4a6a37d2e202836","skill_md_path":"skills/blog-audit/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/AgriciDaniel/claude-blog/tree/main/skills/blog-audit"},"layout":"multi","source":"github","category":"claude-blog","frontmatter":{"name":"blog-audit","license":"MIT","description":"Full-site blog health assessment scanning all blog files for quality scores, orphan pages, topic cannibalization, stale content, and AI citation readiness. Spawns parallel subagents for comprehensive analysis. Produces per-post scores and a prioritized action queue. Use when user says \"audit blog\", \"blog audit\", \"site audit\", \"blog health\", \"audit all posts\", \"check all blogs\"."},"skills_sh_url":"https://skills.sh/AgriciDaniel/claude-blog/blog-audit"},"updatedAt":"2026-05-18T18:53:29.244Z"}}