DEV Community

Cover image for New in SEOCode: GEO Rule Suite
SEOCode
SEOCode

Posted on

New in SEOCode: GEO Rule Suite

---
title: "GEO Rule Suite: Eight New Rules That Catch AI Discoverability Gaps at the PR Boundary"
date: "2026-09-13"
slug: "geo-rule-suite-launch"
description: "SEOCode now checks for the signals AI search engines use to decide whether to cite your pages. Eight new rules cover crawler access, entity graphs, SSR metadata hydration, FAQ schema, and content structure  all enforced before code ships."
tags: ["geo", "ai-search", "schema", "robots-txt", "seo", "feature-launch"]
---
Enter fullscreen mode Exit fullscreen mode

A page can rank first on Google and never appear in a ChatGPT or Perplexity answer. Today we shipped eight rules that catch the reasons why, before the code that causes them ever merges.


What the GEO Rule Suite checks

The eight rules live in a new geo category. They run alongside your existing SEO rules. Nothing existing changes.

Here is what each rule catches and why it matters.


geo-robots-ai-agents — Critical

What it catches: A Disallow: / directive aimed at GPTBot, ClaudeBot, PerplexityBot, or other AI crawlers in robots.txt.

Why it matters: If GPTBot cannot crawl your site, ChatGPT cannot cite it. This is the most common reason a well-ranked page is invisible to AI engines. The block is often added intentionally for one bot and then copy-pasted to cover others by accident. The rule fires on any repo with a public/robots.txt and flags the exact line number.

Severity: Critical


schema-nested-graph — Critical

What it catches: A JSON-LD @graph block where the root entity (typically Organization or WebSite) is missing an @id property.

Why it matters: AI engines resolve entities against knowledge graphs. Without an @id anchor, the entity cannot be linked to external knowledge bases. A schema block with no @id is structurally valid JSON-LD but functionally anonymous to a knowledge graph resolver. The rule fires on any page with JSON-LD.

Severity: Critical


geo-ssr-hydration — Critical

What it catches: <title>, <meta name="description">, or Open Graph tags set inside a useEffect hook in JSX or TSX files.

Why it matters: AI crawlers do not execute JavaScript. Metadata written in useEffect is invisible to them. The page ships with a title and description that only appear after client-side hydration. The rule fires on JSX and TSX files and names the specific hook and tag.

Severity: Critical

Framework note: Validated against Next.js App Router, Remix, and Astro patterns. The rule distinguishes useEffect-based metadata from server-rendered metadata set via framework conventions like export const metadata in Next.js App Router, which are safe.


schema-entity-sameas — Warning

What it catches: An Organization or Person entity in JSON-LD that has no sameAs property pointing to an authoritative external source (Wikipedia, Wikidata, LinkedIn, Crunchbase, or similar).

Why it matters: sameAs is how AI engines connect your entity to their existing knowledge about it. Without it, the engine has to guess whether your "Acme Corp" is the same Acme Corp it already knows about. A missing sameAs weakens entity confidence and reduces the likelihood of citation.

Severity: Warning


schema-faqpage-completeness — Warning

What it catches: A FAQPage schema block where one or more Question entities are missing an acceptedAnswer, or where the acceptedAnswer text is under 40 characters.

Why it matters: AI engines pull FAQ content directly into answers. An incomplete FAQPage block either fails to parse or produces a low-confidence answer. A 12-character accepted answer like "See our docs" is not useful to a language model trying to answer a user question.

Severity: Warning


geo-unanchored-stats — Warning

What it catches: Numeric claims in body content that have no citation. The rule looks for patterns like "73% of users" or "increased by 4x" with no adjacent link or footnote.

Why it matters: AI engines weight cited statistics more heavily than bare claims. An unanchored statistic is a claim the engine cannot verify. Pages with sourced data are more likely to be cited as authoritative. The rule flags the specific sentence.

Severity: Warning


geo-bluf-structure — Info

What it catches: Pages where the first 120 words do not contain a direct answer to the implied question of the page title.

Why it matters: AI engines extract passage-level answers. If the answer to the page's core question is buried in paragraph four, the engine may not surface it. BLUF (Bottom Line Up Front) structure puts the answer where the engine is most likely to find it.

Severity: Info


geo-passage-containment — Info

What it catches: Key claims or answers that span multiple HTML block elements rather than sitting inside a single <p> or <section>.

Why it matters: Passage indexing and AI answer extraction work at the block level. A claim split across three paragraphs is harder for an engine to extract as a coherent unit than the same claim written inside one paragraph. The rule flags the split and shows the affected elements.

Severity: Info


Why now

AI search engines are now a meaningful source of referral traffic for many sites. ChatGPT, Perplexity, Google AI Overviews, and Claude all cite sources. The signals they use to decide what to cite are different from traditional ranking signals, and most of them are set in code. A blocked crawler, a missing @id, or a useEffect-wrapped title tag are all code problems. They belong at the PR boundary.


Who gets these rules

All SEOCode users on Developer and Studio tiers get the GEO Rule Suite automatically. No configuration is required.

The geo-robots-ai-agents rule fires on any repo with a public/robots.txt. Schema rules fire on pages with JSON-LD. The geo-ssr-hydration rule fires on JSX and TSX files. If none of those conditions apply to a given PR, the rules stay quiet.


What to do

Open a pull request that touches robots.txt, any file with JSON-LD, or any JSX or TSX file with metadata. SEOCode will run the GEO rules automatically and report findings inline.

If you want to see the full rule set before your next PR, the rule reference is at seocodeapp.com/docs/rules/geo.


Sources

  1. OpenAI. "GPTBot." https://platform.openai.com/docs/gptbot
  2. Perplexity AI. "PerplexityBot." https://docs.perplexity.ai/docs/perplexitybot
  3. Anthropic. "ClaudeBot and web crawling." https://support.anthropic.com/en/articles/8896518-does-anthropic-crawl-the-web-and-how-can-site-owners-block-the-crawler
  4. Google. "AI Overviews and web content." https://developers.google.com/search/docs/appearance/ai-overviews
  5. Schema.org. "@id and entity identity in JSON-LD." https://schema.org/docs/jsonldcontext.html
  6. Schema.org. "sameAs property." https://schema.org/sameAs
  7. Schema.org. "FAQPage." https://schema.org/FAQPage
  8. Google. "FAQ structured data." https://developers.google.com/search/docs/appearance/structured-data/faqpage
  9. Google. "Passage indexing." https://blog.google/products/search/search-on/
  10. Next.js. "Metadata API." https://nextjs.org/docs/app/building-your-application/optimizing/metadata
  11. Wikidata. "Linked data and entity resolution." https://www.wikidata.org/wiki/Wikidata:Introduction


Catch SEO and AI discoverability issues before they ship

SEOCode reviews every pull request automatically. No manual audits. No surprises after deploy.

Install SEOCode on GitHub Marketplace

Top comments (0)