Opens in a new tabSkip to content
Agent LighthouseAgent Lighthouse

    Searches the text of every published page. The evidence sources themselves are not in this index — search all of them on the trusted sources page.

    GitHub ↗
    Browse checks and page contents
    machine-discovery/in-content-links

    In-content internal links

    What it checks

    Distinct internal destinations linked from the page’s own content — anchors inside <main>/<article> (or the body when neither exists), minus anything under nav, header, footer, aside or the equivalent ARIA roles.

    A destination is counted once per page, keyed on host-without-www plus lower-cased path with no trailing slash, query or fragment. Same-page fragments, self-links, the site root and /…/page/N pagination do not count, and non-HTTP schemes (mailto:, tel:, javascript:) are ignored.

    Only the links are counted. nofollow is not read, neither as a page-level meta robots directive nor as a per-link rel value.

    State Result
    every page has ≥ 2 distinct in-content destinations pass
    some pages below the bar warn, priority low
    no page has a single in-content internal link fail, priority medium
    no pages scanned na

    Why it matters

    A page may be reachable only through JavaScript navigation, a button, or no internal link at all. Crawlers that parse HTML without executing scripts do not discover it, so it never becomes eligible for AI citation. Converting navigation to <a href> elements makes it discoverable. Falsifiable: if orphaned or JS-only-linked pages are indexed and cited at the same rate as linked pages, the claim fails.

    Evidence

    Internal linking depth and absence of orphan pages

    Google states the hard constraint verbatim: ‘Google can only crawl your link if it’s an <a> HTML element with an href attribute’. It adds that ‘Google uses links as a signal when determining the relevancy of pages and to find new pages to crawl’. It lists the forms it does not recommend: <a routerLink>, <span href>, <a onclick>. The empirical layer makes this sharper for LLM crawlers specifically. Across roughly a billion requests, Vercel and MERJ found that no major AI crawler executes JavaScript.

    GPTBot fetches JS files in 11.50% of requests and Claude in 23.84%, but neither executes them. Only Gemini and AppleBot render. A site whose navigation is client-side rendered is therefore a link-less void to GPTBot and ClaudeBot even though Googlebot copes. Google’s own generative-AI guide closes the loop: ‘The way Google Search finds and processes your pages remains the core of how our AI systems access your data.’

    Limits

    AI crawlers do not rely exclusively on the live link graph. Oncrawl’s production log analysis documents ChatGPT crawling from model memory rather than links. 988 ChatGPT-User requests returned 404 on Boulanger.com within a few hours, because the model invented product-listing paths. OAI-SearchBot crawled non-existent pagination URLs, with no corresponding site change. That means an unlinked page can still be hit if the model has memorized or hallucinated its URL, and conversely a well-linked page can be skipped. No AI vendor publishes its link-following policy. The specific quantitative claim that AI crawlers access orphaned legacy URLs at a rate ‘40% higher’ than search bots comes from SEO gray literature with no reproducible methodology and should not be cited.

    How it scores

    Google states the constraint verbatim — “Generally, Google can only crawl your link if it’s an <a> HTML element with an href attribute” (verified 2026-10-17) — and lists the forms it does not recommend: <a routerLink>, <span href>, <a onclick>. A vendor stating a hard requirement, with the failing forms listed, is the grade-A bar. The audit does not extend that to a claim that unlinked pages are unreachable: Oncrawl’s production logs show ChatGPT fetching from model memory rather than the link graph, including 988 requests returning 404 for paths the model invented. Links are the documented discovery route, not the only one.

    Sources