Content Quality (E-E-A-T 2026)
Content Intelligence Workflow
Before content recommendations, run scripts/analyze-keywords.ts (local-first, no API key). Use it as first-pass evidence for keyword distribution, semantic breadth, local modifier placement, heading coverage, and stuffing risk.
bun run scripts/analyze-keywords.ts <url-or-path> --keyword "<primary keyword>" --synonyms "<syn1,syn2>" --locations "<city1,city2>" --format markdown
It returns density, n-grams, a 0-100 stuffing score, heading coverage, and per-location contextual mentions — purely local HTML parsing.
E-E-A-T Pillars
- Experience: First-hand knowledge signals (case studies, photos, "I tried...")
- Expertise: Author credentials, depth, technical accuracy
- Authoritativeness: Industry recognition, citations, backlinks
- Trustworthiness: Contact info, HTTPS, transparent ownership, fact-checking
Anti-Cannibalization
- One primary keyword per URL
- Different search intents per page (info / navigational / transactional)
- Internal linking respects pillar/cluster topology
Metadata and Heading Rules
- Meta title must be 60 characters or less.
- Meta description must be 150 characters or less.
- Do not include the company or brand name in the meta title unless the client explicitly asks. If needed, present a branded title as an option or exception.
- Meta title and H1 should be semantically similar, but not necessarily identical.
- Meta title and H1 need the primary keyword or a strong variant.
- H2/H3 headings distribute synonyms, long-tail phrases, questions, and sub-intents.
- Avoid repeating the exact keyword across every heading.
Local Semantic Distribution
- The client's target localities (primary
[city] + neighbouring municipalities/[region]) must appear naturally near service terms, never as a dumped city list.
- Prefer sentence-level relevance such as
[service] + [city] + proof or context.
- On a LOCAL page, alternate
[city] with [region] and district/neighbourhood names instead of repeating the same city token.
Keyword Distribution by Zone
Place terms by page zone, not by hitting a density target. Anti-stuffing 2026 is multi-signal, not a fixed percentage (Google's leaked KeywordStuffingScore runs 0-127; risk rises past ~3% density).
| Zone |
Primary [service] |
Local modifier [city]/[region] |
Synonyms + entities |
Secondary terms |
| Title / H1 |
Yes (exact or strong variant) |
Local page only |
— |
— |
| H2 / H3 |
Sparingly (1-2) |
Local page only, varied |
Yes (distribute) |
Yes |
| First 100 words / answer capsule |
Yes (once) |
Local page: once |
Yes |
— |
| Body |
Natural flow |
Local page: spread |
Yes (bulk of coverage) |
Yes |
| Anchors / alt / meta |
Variant |
Geo-specific on local |
Yes |
— |
Reference counts for a 1000-1500 word page:
- Primary
[service]: 5-8 occurrences (~1-1.5% — the sweet spot, never above ~3%).
- Semantic family (synonyms + named entities): 12-18 occurrences — this carries topical depth, not exact repetition.
- Local modifier
[city]/[region]: 4-6 occurrences on a LOCAL page; 1-2 mentions on a GLOBAL page (zone signal, not stuffing). On the local page, rotate [city] with [region]/district rather than repeating one city.
Keyword Stuffing Detection
Do not use a fixed >3% density threshold as the stuffing rule. Flag keyword stuffing only when multiple signals align:
- Exact keyword repetition
- Repeated n-grams
- Repeated local modifiers
- Low semantic diversity
- Thin content
- Unnatural heading, anchor, or paragraph placement
scripts/analyze-keywords.ts computes these signals into a 0-100 stuffing score.
Copywriting 2026 (citation-eligible writing)
- Answer capsule per H2: open every H2 with a self-contained 40-60 word answer, not only the page's first 100 words. AI Overviews and LLMs extract per-section; each H2 must stand alone as a quotable verbatim answer.
- Hyperlinked statistics: one statistic linked to its primary source every 150-200 words. Naked or undated stats are not citation-eligible.
- Named entities, not pronouns: name key entities explicitly (product, person, place, organization) instead of "it", "they", "this tool". LLMs disambiguate by surface entity mentions, not coreference.
- Keep the anti-AI-slop tone: no "In conclusion...", "It's important to note...", no marketing filler.
AI Content Guidelines
- Disclose AI-assisted content where required
- Human review + first-hand experience injected
- Avoid generic AI-typical structures ("In conclusion...", "It's important to note...")
Entities and Semantics
For entity-based optimization (knowledge graph alignment, sameAs, entity salience, semantic depth), use the seo-entity skill. Anchor each page to a primary entity and its attributes rather than to a keyword string alone.
References
seo-entity — entity SEO, knowledge graph, semantic depth
seo-featured-snippets — answer capsule / position 0 formats
skills/seo/06-content-strategy/ (eeat-implementation, anti-cannibalization, ai-content-guidelines, keyword-research, keyword-distribution)
1---2name: seo-content3description: Use when analyzing published content quality — E-E-A-T scoring, anti-cannibalization, keyword distribution, AI disclosure.4---56<objective>7Scores existing content against the E-E-A-T pillars (Experience, Expertise, Authoritativeness, Trustworthiness), runs local keyword-density analysis (`scripts/analyze-keywords.ts`) for distribution and stuffing signals (multi-signal detection — never a fixed >3% density threshold), checks anti-cannibalization (one primary keyword and intent per URL), verifies meta title/H1/heading rules and local semantic distribution, applies 2026 citation-eligible copywriting checks (answer capsule opening every H2, one hyperlinked statistic every 150-200 words, named entities instead of pronouns), and flags AI-content-disclosure requirements. Covers quality of already-written content — for planning a brief before writing, use seo-content-brief; for entity/knowledge-graph optimization, use seo-entity.8</objective>910# Content Quality (E-E-A-T 2026)1112## Content Intelligence Workflow1314Before content recommendations, run `scripts/analyze-keywords.ts` (local-first, no API key). Use it as first-pass evidence for keyword distribution, semantic breadth, local modifier placement, heading coverage, and stuffing risk.1516```bash17bun run scripts/analyze-keywords.ts <url-or-path> --keyword "<primary keyword>" --synonyms "<syn1,syn2>" --locations "<city1,city2>" --format markdown18```1920It returns density, n-grams, a 0-100 stuffing score, heading coverage, and per-location contextual mentions — purely local HTML parsing.2122## E-E-A-T Pillars2324- **Experience**: First-hand knowledge signals (case studies, photos, "I tried...")25- **Expertise**: Author credentials, depth, technical accuracy26- **Authoritativeness**: Industry recognition, citations, backlinks27- **Trustworthiness**: Contact info, HTTPS, transparent ownership, fact-checking2829## Anti-Cannibalization3031- One primary keyword per URL32- Different search intents per page (info / navigational / transactional)33- Internal linking respects pillar/cluster topology3435## Metadata and Heading Rules3637- Meta title must be 60 characters or less.38- Meta description must be 150 characters or less.39- Do not include the company or brand name in the meta title unless the client explicitly asks. If needed, present a branded title as an option or exception.40- Meta title and H1 should be semantically similar, but not necessarily identical.41- Meta title and H1 need the primary keyword or a strong variant.42- H2/H3 headings distribute synonyms, long-tail phrases, questions, and sub-intents.43- Avoid repeating the exact keyword across every heading.4445## Local Semantic Distribution4647- The client's target localities (primary `[city]` + neighbouring municipalities/`[region]`) must appear naturally near service terms, never as a dumped city list.48- Prefer sentence-level relevance such as `[service]` + `[city]` + proof or context.49- On a LOCAL page, alternate `[city]` with `[region]` and district/neighbourhood names instead of repeating the same city token.5051## Keyword Distribution by Zone5253Place terms by page zone, not by hitting a density target. Anti-stuffing 2026 is multi-signal, not a fixed percentage (Google's leaked `KeywordStuffingScore` runs 0-127; risk rises past ~3% density).5455| Zone | Primary `[service]` | Local modifier `[city]/[region]` | Synonyms + entities | Secondary terms |56|------|---------------------|----------------------------------|---------------------|-----------------|57| Title / H1 | Yes (exact or strong variant) | Local page only | — | — |58| H2 / H3 | Sparingly (1-2) | Local page only, varied | Yes (distribute) | Yes |59| First 100 words / answer capsule | Yes (once) | Local page: once | Yes | — |60| Body | Natural flow | Local page: spread | Yes (bulk of coverage) | Yes |61| Anchors / alt / meta | Variant | Geo-specific on local | Yes | — |6263Reference counts for a 1000-1500 word page:6465- **Primary `[service]`**: 5-8 occurrences (~1-1.5% — the sweet spot, never above ~3%).66- **Semantic family (synonyms + named entities)**: 12-18 occurrences — this carries topical depth, not exact repetition.67- **Local modifier `[city]/[region]`**: 4-6 occurrences on a LOCAL page; 1-2 mentions on a GLOBAL page (zone signal, not stuffing). On the local page, rotate `[city]` with `[region]`/district rather than repeating one city.6869## Keyword Stuffing Detection7071Do not use a fixed `>3%` density threshold as the stuffing rule. Flag keyword stuffing only when multiple signals align:7273- Exact keyword repetition74- Repeated n-grams75- Repeated local modifiers76- Low semantic diversity77- Thin content78- Unnatural heading, anchor, or paragraph placement7980`scripts/analyze-keywords.ts` computes these signals into a 0-100 stuffing score.8182## Copywriting 2026 (citation-eligible writing)8384- **Answer capsule per H2**: open *every* H2 with a self-contained 40-60 word answer, not only the page's first 100 words. AI Overviews and LLMs extract per-section; each H2 must stand alone as a quotable verbatim answer.85- **Hyperlinked statistics**: one statistic linked to its primary source every 150-200 words. Naked or undated stats are not citation-eligible.86- **Named entities, not pronouns**: name key entities explicitly (product, person, place, organization) instead of "it", "they", "this tool". LLMs disambiguate by surface entity mentions, not coreference.87- Keep the anti-AI-slop tone: no "In conclusion...", "It's important to note...", no marketing filler.8889## AI Content Guidelines9091- Disclose AI-assisted content where required92- Human review + first-hand experience injected93- Avoid generic AI-typical structures ("In conclusion...", "It's important to note...")9495## Entities and Semantics9697For entity-based optimization (knowledge graph alignment, `sameAs`, entity salience, semantic depth), use the `seo-entity` skill. Anchor each page to a primary entity and its attributes rather than to a keyword string alone.9899## References100101- `seo-entity` — entity SEO, knowledge graph, semantic depth102- `seo-featured-snippets` — answer capsule / position 0 formats103- `skills/seo/06-content-strategy/` (eeat-implementation, anti-cannibalization, ai-content-guidelines, keyword-research, keyword-distribution)