$npx -y skills add Affitor/affiliate-skills --skill content-decay-detectorMonitor existing content for ranking drops and trigger refresh workflows. Triggers on: "check for content decay", "which content needs updating", "content refresh", "ranking drops", "traffic decline", "stale content", "content audit", "what to refresh", "outdated content", "conte
| 1 | # Content Decay Detector |
| 2 | |
| 3 | Monitor existing content for ranking drops and generate a prioritized refresh queue. Refreshing decaying content is the highest-ROI SEO activity — it's faster and cheaper than creating new content, and recovering a lost position is easier than earning a new one. |
| 4 | |
| 5 | ## Stage |
| 6 | |
| 7 | S3: Blog & SEO — Blog maintenance and optimization. This skill keeps your existing content competitive and prevents rankings from silently eroding. |
| 8 | |
| 9 | ## When to Use |
| 10 | |
| 11 | - User has existing blog content and wants to check for decay |
| 12 | - User notices traffic declining on specific pages |
| 13 | - User asks "what content needs updating?" |
| 14 | - User says "content decay", "ranking drops", "stale content", "refresh", "content audit" |
| 15 | - Monthly maintenance check — should run every 30 days on active blogs |
| 16 | - After `seo-audit` reveals declining pages |
| 17 | |
| 18 | ## Input Schema |
| 19 | |
| 20 | ```yaml |
| 21 | site_url: string # REQUIRED — the site to audit |
| 22 | # e.g., "myblog.com", "example.com/blog" |
| 23 | |
| 24 | content_list: object[] # OPTIONAL — specific pages to check |
| 25 | - url: string # Page URL |
| 26 | title: string # Page title |
| 27 | publish_date: string # Original publish date |
| 28 | last_updated: string # Last update date |
| 29 | target_keyword: string # Primary keyword |
| 30 | |
| 31 | check_competitors: boolean # OPTIONAL — whether to check if competitors published fresher content |
| 32 | # Default: true |
| 33 | |
| 34 | timeframe: string # OPTIONAL — "30d" | "90d" | "6m" | "1y" |
| 35 | # Default: "90d" |
| 36 | ``` |
| 37 | |
| 38 | **Chaining from S6 seo-audit**: Use `declining_pages` as the `content_list`. |
| 39 | |
| 40 | ## Workflow |
| 41 | |
| 42 | ### Step 1: Gather Content Data |
| 43 | |
| 44 | If `content_list` not provided: |
| 45 | 1. `web_search`: `site:[site_url]` — discover indexed pages |
| 46 | 2. Identify the top 15-20 most important pages (by topic relevance) |
| 47 | 3. For each page, note: title, URL, apparent publish/update date |
| 48 | |
| 49 | ### Step 2: Check for Decay Signals |
| 50 | |
| 51 | Read `shared/references/seo-strategy.md` for decay signals and refresh methodology. |
| 52 | |
| 53 | For each page: |
| 54 | 1. `web_search` for the page's target keyword — check current ranking position |
| 55 | 2. Look for decay signals: |
| 56 | - **Outdated information**: Product features, pricing, dates mentioned |
| 57 | - **Competitor freshness**: Newer, better content published by competitors |
| 58 | - **Missing elements**: No images, no data, thin content compared to current SERP |
| 59 | - **Broken patterns**: "2023" in a title when it's 2025+, discontinued products mentioned |
| 60 | |
| 61 | ### Step 3: Score Decay Priority |
| 62 | |
| 63 | For each decaying page, assign priority: |
| 64 | |
| 65 | | Factor | Score | Criteria | |
| 66 | |---|---|---| |
| 67 | | Revenue impact | 1-5 | Contains affiliate links + had traffic = high revenue impact | |
| 68 | | Decay severity | 1-5 | Major outdated info = 5, minor = 1 | |
| 69 | | Fix effort | 1-5 (inverted) | Easy fix = 5, full rewrite = 1 | |
| 70 | | Competitor threat | 1-5 | Competitor published better version = 5 | |
| 71 | |
| 72 | **Priority = Revenue × Decay × Fix_Ease × Competitor_Threat** (normalized) |
| 73 | |
| 74 | ### Step 4: Generate Refresh Instructions |
| 75 | |
| 76 | For each page in priority order, specify: |
| 77 | 1. **What's decayed** — specific outdated elements |
| 78 | 2. **What to update** — concrete changes to make |
| 79 | 3. **What to add** — new sections, data, or elements competitors have |
| 80 | 4. **Internal linking** — new pages to link to/from since original publish |
| 81 | 5. **Estimated effort** — time to refresh |
| 82 | |
| 83 | ### Step 5: Self-Validation |
| 84 | |
| 85 | - [ ] Decay signals are evidence-based (not guesses) |
| 86 | - [ ] Priority ordering makes business sense (revenue-impacting first) |
| 87 | - [ ] Refresh instructions are specific and actionable |
| 88 | - [ ] Effort estimates are realistic |
| 89 | - [ ] Not recommending refreshes for content that's performing fine |
| 90 | |
| 91 | ## Output Schema |
| 92 | |
| 93 | ```yaml |
| 94 | output_schema_version: "1.0.0" |
| 95 | content_decay: |
| 96 | site: string |
| 97 | pages_analyzed: number |
| 98 | pages_decaying: number |
| 99 | total_refresh_effort: string # Estimated total hours |
| 100 | |
| 101 | decaying_pages: |
| 102 | - url: string |
| 103 | title: string |
| 104 | priority: string # "P0-critical" | "P1-high" | "P2-medium" | "P3-low" |
| 105 | decay_signals: string[] |
| 106 | refresh_actions: string[] |
| 107 | estimated_effort: string |
| 108 | revenue_impact: string # "high" | "medium" | "low" |
| 109 | |
| 110 | healthy_pages: string[] # Pages that don't need refres |