SKILL.md
Programmatic SEO
Scale multiplies whatever you feed it: good data and unique value, or thin content and a scaled-content-abuse penalty. Google enforces against mass-generated sameness. The gates below are not suggestions, they exist because sites have lost most of their traffic skipping them.
Quality gates (enforced, not advisory)
| Gate | Threshold | Action |
|---|---|---|
| Unique content per page | < 40% | WARNING: flag as thin, require rework |
| Unique content per page | < 30% | HARD STOP: scaled-abuse risk, do not publish |
| Word count per page | < 300 | Flag for review |
| Pages without content review | 100+ | WARNING: require sampled audit before publishing |
| Pages without justification | 500+ | HARD STOP: require explicit user approval plus thin-content audit |
| Rollout batch size | > 100 at once | Require progressive rollout: 50-100 pages, watch indexing 2-4 weeks, then expand |
Uniqueness = words unique to this page / total words on page, measured against all other pages in the set. Headers, footers, nav excluded. Template boilerplate included.
Workflow
- Assess the data source. CSV/JSON: row count, column uniqueness, missing values. API: structure, freshness, rate limits. Database: record count, field completeness. Each record must carry enough unique attributes to generate distinct content. Flag near-duplicate records (over 80% field overlap). Stale data makes stale pages.
- Design or review the template. Mark static vs dynamic blocks, conditional sections for missing data, and supplementary content (related items, contextual tips). Every page must pass the standalone value test: would this page be worth publishing if no sibling pages existed? No mad-libs patterns where only the city or product name changes.
- Set URL rules. Lowercase hyphenated slugs from data, logical hierarchy, uniqueness enforced at generation time, under 100 chars, no query params for primary URLs, consistent trailing slash.
- Automate internal linking. Hub pages per category, 3-5 related-item links per page from shared attributes, BreadcrumbList schema from the hierarchy, varied descriptive anchors, 3-5 internal links per 1,000 words.
- Apply the gates. Compute uniqueness across the set, sample-review 5-10% of pages by hand, plan the progressive rollout.
- Control indexation. Read references/scale-safeguards.md for the canonical strategy, sitemap rules, index bloat prevention, and the safe-vs-penalty-risk pattern lists.
- Output. Programmatic SEO score /100, per-category status table (data quality, template uniqueness, URLs, linking, thin-content risk, index management), issues by priority, and gate compliance actions.
Verification
Take 2 generated pages from the same template, strip shared header/footer/nav, and diff the remaining text. Expect at least 30-40% of each page's words to be unique to it, and expect the swap test to fail (swapping the entity name into the other page should produce visibly wrong content). If the diff is mostly identical boilerplate, the template fails the gate, rework it before generating more.
Good vs bad
Good: An integrations directory where each page has that integration's real setup steps, API scopes, screenshots, and known limitations pulled from distinct data fields. Bad: 400 "[Service] in [City]" pages, identical text with the city swapped. That is a doorway pattern, and it is the exact shape core updates have crushed, with sites losing the bulk of their local traffic.
Footguns
- Uniqueness measured against nothing. Uniqueness only means something measured across the whole generated set. Comparing one page against the template alone hides the sameness.
- `lastmod` set to generation time. Sitemap
lastmodmust reflect the data update timestamp. Regenerating identical content with fresh dates is a trust burn. - Publishing on a rented high-authority domain. Programmatic content under someone else's authoritative domain triggers site reputation abuse enforcement. Warn and stop.
- Client-side rendered page sets. If the generated pages need JS to show content, crawlers may index shells. Require SSR/SSG for the set.
Red flags: stop when you hear yourself say
- "The uniqueness is a bit under 30% but the data is good."
- "We'll publish all 2,000 now and fix thin pages later."
- "Nobody hand-reviews programmatic pages, that defeats the point."
- "It's basically unique, only the city and prices change."
- "The client approved it, so skip the gate."
Every one of these is the rationalization that precedes a penalty. The gates apply to every generation run, including the one you are doing right now, and user approval at a HARD STOP must be explicit and recorded in the output, not assumed.
Completion checklist
- [ ] Data source assessed, duplicate and stale records flagged
- [ ] Template passes standalone value and swap tests
- [ ] Uniqueness computed across the full set, gates applied
- [ ] 5-10% human sample review done or explicitly scheduled
- [ ] Progressive rollout plan in place for 100+ pages
- [ ] Canonicals, sitemap, and noindex rules set per references/scale-safeguards.md
- [ ] HARD STOP approvals, if any, recorded verbatim in the output
Any box unchecked: not done. Fix or say so.