---
title: "AI search rules (geo/*)"
description: "All 41 ai search rules void reports, each with severity, why it matters and how to fix it."
canonical: https://void-design.vercel.app/rules/geo
lastModified: 2026-09-16
---

# AI search rules

Generative-engine optimisation: whether AI crawlers that don't run JavaScript see the same content, valid and visible JSON-LD, an explicit AI robots policy, llms.txt, Markdown mirrors and answer-first writing. Run `void geo` or `void audit`.

| Rule | Severity | Problem |
| --- | --- | --- |
| [`geo/js-dependency`](https://void-design.vercel.app/rules/geo/js-dependency.md) | error | Main content only appears after JavaScript runs |
| [`geo/hidden-streamed-content`](https://void-design.vercel.app/rules/geo/hidden-streamed-content.md) | warn | Crawlers receive main content only inside hidden streaming containers |
| [`geo/ai-bot-blocked`](https://void-design.vercel.app/rules/geo/ai-bot-blocked.md) | error | AI crawler user agents get 401/403/429/503 or a challenge page |
| [`geo/ai-content-differs`](https://void-design.vercel.app/rules/geo/ai-content-differs.md) | warn | AI crawlers get materially different HTML than browsers |
| [`geo/jsonld-parse-error`](https://void-design.vercel.app/rules/geo/jsonld-parse-error.md) | error | JSON-LD block is not valid JSON |
| [`geo/jsonld-unsafe`](https://void-design.vercel.app/rules/geo/jsonld-unsafe.md) | error | JSON-LD contains a literal </script or <!-- |
| [`geo/jsonld-missing`](https://void-design.vercel.app/rules/geo/jsonld-missing.md) | info | Page has no JSON-LD |
| [`geo/jsonld-not-in-raw`](https://void-design.vercel.app/rules/geo/jsonld-not-in-raw.md) | error | JSON-LD is injected by JavaScript |
| [`geo/home-entity-missing`](https://void-design.vercel.app/rules/geo/home-entity-missing.md) | warn | Home page lacks Organization + a single WebSite node |
| [`geo/jsonld-schema`](https://void-design.vercel.app/rules/geo/jsonld-schema.md) | error | JSON-LD @context isn't schema.org or @type isn't a schema.org type |
| [`geo/jsonld-required`](https://void-design.vercel.app/rules/geo/jsonld-required.md) | error | Structured data type is missing Google-required properties |
| [`geo/jsonld-recommended`](https://void-design.vercel.app/rules/geo/jsonld-recommended.md) | info | Structured data missing recommended properties |
| [`geo/jsonld-dates`](https://void-design.vercel.app/rules/geo/jsonld-dates.md) | warn | Structured data dates are invalid, lack a timezone, or modified < published |
| [`geo/breadcrumb-invalid`](https://void-design.vercel.app/rules/geo/breadcrumb-invalid.md) | warn | BreadcrumbList positions, names or item URLs are invalid |
| [`geo/faq-deprecated`](https://void-design.vercel.app/rules/geo/faq-deprecated.md) | info | FAQPage/HowTo/SearchAction markup no longer produces rich results |
| [`geo/jsonld-id-unresolved`](https://void-design.vercel.app/rules/geo/jsonld-id-unresolved.md) | warn | JSON-LD @id references don't resolve |
| [`geo/jsonld-not-visible`](https://void-design.vercel.app/rules/geo/jsonld-not-visible.md) | warn | Structured data values don't appear on the page |
| [`geo/entity-name-mismatch`](https://void-design.vercel.app/rules/geo/entity-name-mismatch.md) | info | Brand name differs across og:site_name, JSON-LD and title |
| [`geo/article-date-missing`](https://void-design.vercel.app/rules/geo/article-date-missing.md) | warn | Article has no machine-readable or visible date |
| [`geo/article-author-missing`](https://void-design.vercel.app/rules/geo/article-author-missing.md) | warn | Article author missing or malformed |
| [`geo/landmarks`](https://void-design.vercel.app/rules/geo/landmarks.md) | warn | Missing <main>, <nav> or <article> landmarks |
| [`geo/thin-content`](https://void-design.vercel.app/rules/geo/thin-content.md) | info | Article main content under 150 words |
| [`geo/answer-first`](https://void-design.vercel.app/rules/geo/answer-first.md) | info | Opening paragraph doesn't state the answer concisely |
| [`geo/no-citations`](https://void-design.vercel.app/rules/geo/no-citations.md) | info | Long content with no outbound links to sources |
| [`geo/no-statistics`](https://void-design.vercel.app/rules/geo/no-statistics.md) | info | Long content with no quantified facts |
| [`geo/unstructured-content`](https://void-design.vercel.app/rules/geo/unstructured-content.md) | info | Long content with no lists, tables or subheadings |
| [`geo/wall-of-text`](https://void-design.vercel.app/rules/geo/wall-of-text.md) | info | Paragraphs longer than 150 words |
| [`geo/vague-headings`](https://void-design.vercel.app/rules/geo/vague-headings.md) | info | Generic section headings ("Overview", "More", "Details") |
| [`geo/markdown-alternate`](https://void-design.vercel.app/rules/geo/markdown-alternate.md) | info | No working Markdown alternate for this content page |
| [`geo/markdown-mirror-indexable`](https://void-design.vercel.app/rules/geo/markdown-mirror-indexable.md) | warn | Markdown mirror can compete with the HTML page, or diverges from it |
| [`geo/markdown-negotiation-vary`](https://void-design.vercel.app/rules/geo/markdown-negotiation-vary.md) | warn | Accept: text/markdown negotiation without Vary: Accept |
| [`geo/markdown-negotiation`](https://void-design.vercel.app/rules/geo/markdown-negotiation.md) | info | No Markdown response for Accept: text/markdown |
| [`geo/llms-txt-missing`](https://void-design.vercel.app/rules/geo/llms-txt-missing.md) | info | No /llms.txt |
| [`geo/llms-txt-error`](https://void-design.vercel.app/rules/geo/llms-txt-error.md) | error | /llms.txt returns a server error |
| [`geo/llms-txt-invalid`](https://void-design.vercel.app/rules/geo/llms-txt-invalid.md) | warn | /llms.txt doesn't follow the llms.txt format |
| [`geo/llms-txt-broken-links`](https://void-design.vercel.app/rules/geo/llms-txt-broken-links.md) | warn | /llms.txt links to URLs that fail |
| [`geo/llms-txt-not-linked`](https://void-design.vercel.app/rules/geo/llms-txt-not-linked.md) | info | llms.txt exists but isn't linked from the home page |
| [`geo/robots-ai-policy`](https://void-design.vercel.app/rules/geo/robots-ai-policy.md) | info | AI crawler policy (allow/deny matrix from robots.txt) |
| [`geo/search-bots-blocked`](https://void-design.vercel.app/rules/geo/search-bots-blocked.md) | error | robots.txt blocks AI search or user-triggered fetchers |
| [`geo/training-bots-blocked`](https://void-design.vercel.app/rules/geo/training-bots-blocked.md) | info | robots.txt blocks AI training crawlers |
| [`geo/content-signal`](https://void-design.vercel.app/rules/geo/content-signal.md) | info | No Content-Signal usage preferences |
